ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhkY2EwOAotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsMzA5IEBACisKKyMgdXNlZCB0byBjcmVhdGUgdmJjYywgdmMgYW5kIHVjcHAKK0NDID0gZ2NjIC1zdGQ9Yzl4IC1nIC1ESEFWRV9BT1M0ICMtZnNhbml0aXplPWFkZHJlc3MgIy1ESEFWRV9FQ1BQIC1ESEFWRV9NSVNSQSAKK0xERkxBR1MgPSAtbG0KKworIyBuYXRpdmUgdmVyc2lvbjsgdXNlZCB0byBjcmVhdGUgZHRnZW4KK05DQyA9ICQoQ0MpCitOTERGTEFHUyA9ICQoTERGTEFHUykKKworYWxsOiBiaW4vdmMgYmluL3Zwcm9mIGJpbi92YmNjJChUQVJHRVQpICNiaW4vdmNwcAorCit2YmNjczogYmluL3ZiY2NzJChUQVJHRVQpCisKK2Jpbi92YzogZnJvbnRlbmQvdmMuYworCSQoQ0MpIGZyb250ZW5kL3ZjLmMgLW8gYmluL3ZjICQoTERGTEFHUykKKworYmluL3Zwcm9mOiB2cHJvZi92cHJvZi5jCisJJChDQykgdnByb2YvdnByb2YuYyAtbyBiaW4vdnByb2YgJChMREZMQUdTKQorCitkb2MvdmJjYy5wZGY6CisJdGV4aTJkdmkgLS1wZGYgZG9jL3ZiY2MudGV4aQorCXJtIC1mIHZiY2MuY3AgdmJjYy5mbiB2YmNjLnZyIHZiY2MudHAgdmJjYy5reSB2YmNjLnBnIHZiY2MudG9jIFwKKwkgICAgICB2YmNjLmF1eCB2YmNjLmxvZworCitkb2MvdmJjYy5odG1sOgorCShjZCBkb2M7dGV4aTJodG1sIC1zcGxpdD1jaGFwdGVyIC1ub3NlY19uYXYgLWZyYW1lcyB2YmNjLnRleGkpCisJc2VkIC1lIHMvdmJjY18xMy92YmNjXzEvIDxkb2MvdmJjY19mcmFtZS5odG1sID5kb2MvdmJjYy5odG1sCisKK3ZjcHBvYmpzID0gdmNwcC9jcHAubyB2Y3BwL2V2YWwubyB2Y3BwL2dldG9wdC5vIHZjcHAvaGlkZXNldC5vIHZjcHAvaW5jbHVkZS5vIFwKKwkgICB2Y3BwL2xleC5vIHZjcHAvbWFjcm8ubyB2Y3BwL25saXN0Lm8gdmNwcC90b2tlbnMubyB2Y3BwL3VuaXgubworCitfdmJjYy50YXIuZ3o6CisJLShjZCAuLjt0YXIgemN2ZiB2YmNjLnRhci5neiAtLWV4Y2x1ZGU9Ki9kdC5jIC0tZXhjbHVkZT0qL2R0LmggdmJjYy9NYWtlZmlsZSB2YmNjL2Jpbi8uZHVtbXkgdmJjYy8qLltjaF0gdmJjYy9kYXRhdHlwZXMvKi5bY2hdIHZiY2MvZG9jLyoudGV4aSB2YmNjL2Zyb250ZW5kL3ZjLmMgdmJjYy9tYWNoaW5lcy8qLyouW2NoXSB2YmNjL21hY2hpbmVzLyovbWFjaGluZS5kdCB2YmNjL21hY2hpbmVzLyovc2NoZWR1bGUuW2NoXSB2YmNjL21hY2hpbmVzLyovY29tcHJlc3MuW2NoXSB2YmNjL3VjcHAvKi5bY2hdIHZiY2MvdWNwcC9SRUFETUUgdmJjYy92cHJvZi92cHJvZi5jIHZiY2MvdnNjL3ZzYy5bY2hdIHZiY2MvdmNwci92Y3ByLltjaF0pCisKK2Jpbi9vc2Vrcm06IG9zZWtybS5jCisJJChDQykgb3Nla3JtLmMgLW8gYmluL29zZWtybQorCitkaXN0OiBiaW4vb3Nla3JtCisJbXYgc3VwcC5oIHQxCisJbXYgc3VwcC5jIHQyCisJbXYgbWFpbi5jIHQzCisJbXYgbWFjaGluZXMvcHBjL21hY2hpbmUuYyB0NAorCW12IGRlY2xhcmF0aW9uLmMgdDUKKwltdiBmbG93LmMgdDYKKwltdiBpYy5jIHQ3CisJbXYgcGFyc2VfZXhwci5jIHQ4CisJbXYgc3RhdGVtZW50cy5jIHQ5CisJbXYgcmQuYyB0MTAKKwltdiB0eXBlX2V4cHIuYyB0MTEKKwliaW4vb3Nla3JtIDx0MSA+c3VwcC5oCisJYmluL29zZWtybSA8dDIgPnN1cHAuYworCWJpbi9vc2Vrcm0gPHQzID5tYWluLmMKKwliaW4vb3Nla3JtIDx0NCA+bWFjaGluZXMvcHBjL21hY2hpbmUuYworCWJpbi9vc2Vrcm0gPHQ1ID5kZWNsYXJhdGlvbi5jCisJYmluL29zZWtybSA8dDYgPmZsb3cuYworCWJpbi9vc2Vrcm0gPHQ3ID5pYy5jCisJYmluL29zZWtybSA8dDggPnBhcnNlX2V4cHIuYworCWJpbi9vc2Vrcm0gPHQ5ID5zdGF0ZW1lbnRzLmMKKwliaW4vb3Nla3JtIDx0MTAgPnJkLmMKKwliaW4vb3Nla3JtIDx0MTEgPnR5cGVfZXhwci5jCisJbWFrZSBfdmJjYy50YXIuZ3oKKwltdiB0MSBzdXBwLmgKKwltdiB0MiBzdXBwLmMKKwltdiB0MyBtYWluLmMKKwltdiB0NCBtYWNoaW5lcy9wcGMvbWFjaGluZS5jCisJbXYgdDUgZGVjbGFyYXRpb24uYworCW12IHQ2IGZsb3cuYworCW12IHQ3IGljLmMKKwltdiB0OCBwYXJzZV9leHByLmMKKwltdiB0OSBzdGF0ZW1lbnRzLmMKKwltdiB0MTAgcmQuYworCW12IHQxMSB0eXBlX2V4cHIuYwkKKworYmluL3ZjcHA6ICQodmNwcG9ianMpCisJJChDQykgJChMREZMQUdTKSAkKHZjcHBvYmpzKSAtbyBiaW4vdmNwcAorCit2Y3BwL2NwcC5vOiB2Y3BwL2NwcC5jIHZjcHAvY3BwLmgKKwkkKENDKSAtYyAtSXZjcHAgdmNwcC9jcHAuYyAtbyB2Y3BwL2NwcC5vCisKK3ZjcHAvZXZhbC5vOiB2Y3BwL2V2YWwuYyB2Y3BwL2NwcC5oCisJJChDQykgLWMgLUl2Y3BwIHZjcHAvZXZhbC5jIC1vIHZjcHAvZXZhbC5vCisKK3ZjcHAvZ2V0b3B0Lm86IHZjcHAvZ2V0b3B0LmMKKwkkKENDKSAtYyAtSXZjcHAgdmNwcC9nZXRvcHQuYyAtbyB2Y3BwL2dldG9wdC5vCisKK3ZjcHAvaGlkZXNldC5vOiB2Y3BwL2hpZGVzZXQuYyB2Y3BwL2NwcC5oCisJJChDQykgLWMgLUl2Y3BwIHZjcHAvaGlkZXNldC5jIC1vIHZjcHAvaGlkZXNldC5vCisKK3ZjcHAvaW5jbHVkZS5vOiB2Y3BwL2luY2x1ZGUuYyB2Y3BwL2NwcC5oCisJJChDQykgLWMgLUl2Y3BwIHZjcHAvaW5jbHVkZS5jIC1vIHZjcHAvaW5jbHVkZS5vCisKK3ZjcHAvbGV4Lm86IHZjcHAvbGV4LmMgdmNwcC9jcHAuaAorCSQoQ0MpIC1jIC1JdmNwcCB2Y3BwL2xleC5jIC1vIHZjcHAvbGV4Lm8KKwordmNwcC9tYWNyby5vOiB2Y3BwL21hY3JvLmMgdmNwcC9jcHAuaAorCSQoQ0MpIC1jIC1JdmNwcCB2Y3BwL21hY3JvLmMgLW8gdmNwcC9tYWNyby5vCisKK3ZjcHAvbmxpc3QubzogdmNwcC9ubGlzdC5jIHZjcHAvY3BwLmgKKwkkKENDKSAtYyAtSXZjcHAgdmNwcC9ubGlzdC5jIC1vIHZjcHAvbmxpc3QubworCit2Y3BwL3Rva2Vucy5vOiB2Y3BwL3Rva2Vucy5jIHZjcHAvY3BwLmgKKwkkKENDKSAtYyAtSXZjcHAgdmNwcC90b2tlbnMuYyAtbyB2Y3BwL3Rva2Vucy5vCisKK3ZjcHAvdW5peC5vOiB2Y3BwL3VuaXguYyB2Y3BwL2NwcC5oCisJJChDQykgLWMgLUl2Y3BwIHZjcHAvdW5peC5jIC1vIHZjcHAvdW5peC5vCisKK1RSR0RJUiA9IG1hY2hpbmVzLyQoVEFSR0VUKQorCitib2JqZWN0cyA9ICQoVFJHRElSKS9tYWluLm8gJChUUkdESVIpL3ZhcnMubyAkKFRSR0RJUikvZGVjbGFyYXRpb24ubyBcCisJICAgJChUUkdESVIpL3BhcnNlX2V4cHIubyAkKFRSR0RJUikvdHlwZV9leHByLm8gJChUUkdESVIpL2ljLm8gXAorCSAgICQoVFJHRElSKS9tYWNoaW5lLm8gJChUUkdESVIpL3N0YXRlbWVudHMubyBcCisJICAgJChUUkdESVIpL3N1cHAubyAkKFRSR0RJUikvZHQubyBcCisgICAgICAgICAgICQoVFJHRElSKS9hc3NlcnQubyAkKFRSR0RJUikvY3BwLm8gJChUUkdESVIpL2hhc2gubyBcCisgICAgICAgICAgICQoVFJHRElSKS9sZXhlci5vICQoVFJHRElSKS9tYWNyby5vICQoVFJHRElSKS9tZW0ubyBcCisgICAgICAgICAgICQoVFJHRElSKS9ldmFsLm8KKyMgICAgICAgICAgICQoVFJHRElSKS9BZGpMaXN0Lm8gJChUUkdESVIpL0RVQ2hhaW4ubyBcCisjICAgICAgICAgICAkKFRSR0RJUikvSUNvZGVJbnNlcnRpb24ubyAkKFRSR0RJUikvTm9kZUxpc3QubyBcCisjICAgICAgICAgICAkKFRSR0RJUikvUkFsbG9jTWFpbi5vICQoVFJHRElSKS9XZWIubworCitmb2JqZWN0cyA9ICQoVFJHRElSKS9vcHQubyAkKFRSR0RJUikvYXYubyAkKFRSR0RJUikvcmQubyAkKFRSR0RJUikvcmVncy5vIFwKKwkgICAkKFRSR0RJUikvZmxvdy5vICQoVFJHRElSKS9jc2UubyAkKFRSR0RJUikvY3AubyAkKFRSR0RJUikvbG9vcC5vIFwKKwkgICAkKFRSR0RJUikvYWxpYXMubyAkKFRSR0RJUikvcmFuZ2UubyAkKGJvYmplY3RzKQorCitzb2JqZWN0cyA9ICQoVFJHRElSKS9vcHRzLm8gJChUUkdESVIpL3JlZ3NzLm8gJChib2JqZWN0cykKKwordGFzbQkgPSAkKFRSR0RJUikvc3VwcC5vICQoVFJHRElSKS90YXNtLm8gJChUUkdESVIpL2R0Lm8gXAorCSAgICQoVFJHRElSKS9vcHQubyAkKFRSR0RJUikvYXYubyAkKFRSR0RJUikvcmQubyAkKFRSR0RJUikvcmVncy5vIFwKKwkgICAkKFRSR0RJUikvZmxvdy5vICQoVFJHRElSKS9jc2UubyAkKFRSR0RJUikvY3AubyAkKFRSR0RJUikvbG9vcC5vIFwKKwkgICAkKFRSR0RJUikvYWxpYXMubyAkKFRSR0RJUikvbWFjaGluZS5vCisKK21iYXNpYwkgPSAkKFRSR0RJUikvc3VwcC5vICQoVFJHRElSKS9tYmFzaWMubyAkKFRSR0RJUikvZHQubyBcCisJICAgJChUUkdESVIpL29wdC5vICQoVFJHRElSKS9hdi5vICQoVFJHRElSKS9yZC5vICQoVFJHRElSKS9yZWdzLm8gXAorCSAgICQoVFJHRElSKS9mbG93Lm8gJChUUkdESVIpL2NzZS5vICQoVFJHRElSKS9jcC5vICQoVFJHRElSKS9sb29wLm8gXAorCSAgICQoVFJHRElSKS9hbGlhcy5vICQoVFJHRElSKS9tYWNoaW5lLm8KKworbWluaWNvbXAJID0gJChUUkdESVIpL3N1cHAubyAkKFRSR0RJUikvbWluaWNvbXBnLnRhYi5vICQoVFJHRElSKS9taW5pY29tcC5vICQoVFJHRElSKS9kdC5vIFwKKwkgICAkKFRSR0RJUikvb3B0Lm8gJChUUkdESVIpL2F2Lm8gJChUUkdESVIpL3JkLm8gJChUUkdESVIpL3JlZ3MubyBcCisJICAgJChUUkdESVIpL2Zsb3cubyAkKFRSR0RJUikvY3NlLm8gJChUUkdESVIpL2NwLm8gJChUUkdESVIpL2xvb3AubyBcCisJICAgJChUUkdESVIpL2FsaWFzLm8gJChUUkdESVIpL21hY2hpbmUubworCit2c2NvYmplY3RzID0gJChUUkdESVIpL3ZzYy5vICQoVFJHRElSKS9zY2hlZHVsZS5vCisKK3ZjcHJvYmplY3RzID0gJChUUkdESVIpL3ZjcHIubyAkKFRSR0RJUikvY29tcHJlc3MubworCitiaW4vdmJjYyQoVEFSR0VUKTogJChmb2JqZWN0cykKKwkkKENDKSAkKExERkxBR1MpICQoZm9iamVjdHMpIC1vIGJpbi92YmNjJChUQVJHRVQpCisKK2Jpbi92YmNjcyQoVEFSR0VUKTogJChzb2JqZWN0cykKKwkkKENDKSAkKExERkxBR1MpICQoc29iamVjdHMpIC1vIGJpbi92YmNjcyQoVEFSR0VUKQorCitiaW4vdnNjJChUQVJHRVQpOiAkKHZzY29iamVjdHMpCisJJChDQykgJChMREZMQUdTKSAkKHZzY29iamVjdHMpIC1vIGJpbi92c2MkKFRBUkdFVCkKKworYmluL3ZjcHIkKFRBUkdFVCk6ICQodmNwcm9iamVjdHMpCisJJChDQykgJChMREZMQUdTKSAkKHZjcHJvYmplY3RzKSAtbyBiaW4vdmNwciQoVEFSR0VUKQorCitiaW4vdGFzbSQoVEFSR0VUKTogJCh0YXNtKQorCSQoQ0MpICQoTERGTEFHUykgJCh0YXNtKSAtbyBiaW4vdGFzbSQoVEFSR0VUKQorCitiaW4vbWJhc2ljJChUQVJHRVQpOiAkKG1iYXNpYykKKwkkKENDKSAkKExERkxBR1MpICQobWJhc2ljKSAtbyBiaW4vbWJhc2ljJChUQVJHRVQpCisKK2Jpbi9taW5pY29tcCQoVEFSR0VUKTogJChtaW5pY29tcCkKKwkkKENDKSAkKExERkxBR1MpICQobWluaWNvbXApIC1vIGJpbi9taW5pY29tcCQoVEFSR0VUKQorCitiaW4vZHRnZW46IGRhdGF0eXBlcy9kdGdlbi5jIGRhdGF0eXBlcy9kYXRhdHlwZXMuaCBkYXRhdHlwZXMvZHRjb252LmgKKwkkKE5DQykgZGF0YXR5cGVzL2R0Z2VuLmMgLW8gYmluL2R0Z2VuIC1JZGF0YXR5cGVzICQoTkxERkxBR1MpCisKKyQoVFJHRElSKS9kdC5oOiBiaW4vZHRnZW4gJChUUkdESVIpL21hY2hpbmUuZHQKKwliaW4vZHRnZW4gJChUUkdESVIpL21hY2hpbmUuZHQgJChUUkdESVIpL2R0LmggJChUUkdESVIpL2R0LmMKKworJChUUkdESVIpL2R0LmM6IGJpbi9kdGdlbiAkKFRSR0RJUikvbWFjaGluZS5kdAorCWJpbi9kdGdlbiAkKFRSR0RJUikvbWFjaGluZS5kdCAkKFRSR0RJUikvZHQuaCAkKFRSR0RJUikvZHQuYworCiskKFRSR0RJUikvZHQubzogJChUUkdESVIpL2R0LmggJChUUkdESVIpL2R0LmMKKwkkKENDKSAtYyAkKFRSR0RJUikvZHQuYyAtbyAkKFRSR0RJUikvZHQubyAtSSQoVFJHRElSKSAtSWRhdGF0eXBlcworCiskKFRSR0RJUikvdGFzbS5vOiB0YXNtLmMgc3VwcC5oICQoVFJHRElSKS9tYWNoaW5lLmggJChUUkdESVIpL2R0LmgKKwkkKENDKSAtYyB0YXNtLmMgLW8gJChUUkdESVIpL3Rhc20ubyAtSSQoVFJHRElSKQorCiskKFRSR0RJUikvbWJhc2ljLm86IG1iYXNpYy5jIHN1cHAuaCAkKFRSR0RJUikvbWFjaGluZS5oICQoVFJHRElSKS9kdC5oCisJJChDQykgLWMgbWJhc2ljLmMgLW8gJChUUkdESVIpL21iYXNpYy5vIC1JJChUUkdESVIpCisKKyQoVFJHRElSKS9taW5pY29tcC5vOiBtaW5pY29tcC5jIG1pbmljb21wLmggc3VwcC5oICQoVFJHRElSKS9tYWNoaW5lLmggJChUUkdESVIpL2R0LmgKKwkkKENDKSAtYyBtaW5pY29tcC5jIC1vICQoVFJHRElSKS9taW5pY29tcC5vIC1JJChUUkdESVIpCisKKyQoVFJHRElSKS9taW5pY29tcGcudGFiLm86IG1pbmljb21wZy55IG1pbmljb21wbGV4ZXIuYyBtaW5pY29tcC5oIHN1cHAuaAorCWJpc29uIG1pbmljb21wZy55CisJJChDQykgLWMgbWluaWNvbXBnLnRhYi5jIC1vICQoVFJHRElSKS9taW5pY29tcGcudGFiLm8gLUkkKFRSR0RJUikKKworJChUUkdESVIpL3N1cHAubzogc3VwcC5jIHN1cHAuaCAkKFRSR0RJUikvbWFjaGluZS5oICQoVFJHRElSKS9kdC5oCisJJChDQykgLWMgc3VwcC5jIC1vICQoVFJHRElSKS9zdXBwLm8gLUkkKFRSR0RJUikKKworJChUUkdESVIpL21haW4ubzogbWFpbi5jIHZiYy5oIHN1cHAuaCB2YmNjX2NwcC5oIHVjcHAvY3BwLmggJChUUkdESVIpL21hY2hpbmUuaCAkKFRSR0RJUikvZHQuaAorCSQoQ0MpIC1jIG1haW4uYyAtbyAkKFRSR0RJUikvbWFpbi5vIC1JJChUUkdESVIpCisKKyQoVFJHRElSKS92YXJzLm86IHZhcnMuYyB2YmMuaCBzdXBwLmggJChUUkdESVIpL21hY2hpbmUuaCBlcnJvcnMuaCAkKFRSR0RJUikvZHQuaAorCSQoQ0MpIC1jIHZhcnMuYyAtbyAkKFRSR0RJUikvdmFycy5vIC1JJChUUkdESVIpCisKKyQoVFJHRElSKS9kZWNsYXJhdGlvbi5vOiBkZWNsYXJhdGlvbi5jIHZiYy5oIHN1cHAuaCB2YmNjX2NwcC5oIHVjcHAvY3BwLmggJChUUkdESVIpL21hY2hpbmUuaCAkKFRSR0RJUikvZHQuaAorCSQoQ0MpIC1jIGRlY2xhcmF0aW9uLmMgLW8gJChUUkdESVIpL2RlY2xhcmF0aW9uLm8gLUkkKFRSR0RJUikKKworJChUUkdESVIpL3BhcnNlX2V4cHIubzogcGFyc2VfZXhwci5jIHZiYy5oIHN1cHAuaCB2YmNjX2NwcC5oIHVjcHAvY3BwLmggJChUUkdESVIpL21hY2hpbmUuaCAkKFRSR0RJUikvZHQuaAorCSQoQ0MpIC1jIHBhcnNlX2V4cHIuYyAtbyAkKFRSR0RJUikvcGFyc2VfZXhwci5vIC1JJChUUkdESVIpCisKKyQoVFJHRElSKS90eXBlX2V4cHIubzogdHlwZV9leHByLmMgdmJjLmggc3VwcC5oICQoVFJHRElSKS9tYWNoaW5lLmggJChUUkdESVIpL2R0LmgKKwkkKENDKSAtYyB0eXBlX2V4cHIuYyAtbyAkKFRSR0RJUikvdHlwZV9leHByLm8gLUkkKFRSR0RJUikKKworJChUUkdESVIpL2ljLm86IGljLmMgdmJjLmggc3VwcC5oICQoVFJHRElSKS9tYWNoaW5lLmggJChUUkdESVIpL2R0LmgKKwkkKENDKSAtYyBpYy5jIC1vICQoVFJHRElSKS9pYy5vIC1JJChUUkdESVIpCisKKyQoVFJHRElSKS9zdGF0ZW1lbnRzLm86IHN0YXRlbWVudHMuYyB2YmMuaCBzdXBwLmggdmJjY19jcHAuaCB1Y3BwL2NwcC5oICQoVFJHRElSKS9tYWNoaW5lLmggJChUUkdESVIpL2R0LmgKKwkkKENDKSAtYyBzdGF0ZW1lbnRzLmMgLW8gJChUUkdESVIpL3N0YXRlbWVudHMubyAtSSQoVFJHRElSKQorCiskKFRSR0RJUikvb3B0Lm86IG9wdC5jIG9wdC5oIHN1cHAuaCAkKFRSR0RJUikvbWFjaGluZS5oICQoVFJHRElSKS9kdC5oCisJJChDQykgLWMgb3B0LmMgLW8gJChUUkdESVIpL29wdC5vIC1JJChUUkdESVIpCisKKyQoVFJHRElSKS9hdi5vOiBhdi5jIG9wdC5oIHN1cHAuaCAkKFRSR0RJUikvbWFjaGluZS5oICQoVFJHRElSKS9kdC5oCisJJChDQykgLWMgYXYuYyAtbyAkKFRSR0RJUikvYXYubyAtSSQoVFJHRElSKQorCiskKFRSR0RJUikvcmQubzogcmQuYyBvcHQuaCBzdXBwLmggJChUUkdESVIpL21hY2hpbmUuaCAkKFRSR0RJUikvZHQuaAorCSQoQ0MpIC1jIHJkLmMgLW8gJChUUkdESVIpL3JkLm8gLUkkKFRSR0RJUikKKworJChUUkdESVIpL3JlZ3MubzogcmVncy5jIG9wdC5oIHN1cHAuaCAkKFRSR0RJUikvbWFjaGluZS5oICQoVFJHRElSKS9kdC5oCisJJChDQykgLWMgcmVncy5jIC1vICQoVFJHRElSKS9yZWdzLm8gLUkkKFRSR0RJUikKKworJChUUkdESVIpL2Zsb3cubzogZmxvdy5jIG9wdC5oIHN1cHAuaCAkKFRSR0RJUikvbWFjaGluZS5oICQoVFJHRElSKS9kdC5oCisJJChDQykgLWMgZmxvdy5jIC1vICQoVFJHRElSKS9mbG93Lm8gLUkkKFRSR0RJUikKKworJChUUkdESVIpL2NzZS5vOiBjc2UuYyBvcHQuaCBzdXBwLmggJChUUkdESVIpL21hY2hpbmUuaCAkKFRSR0RJUikvZHQuaAorCSQoQ0MpIC1jIGNzZS5jIC1vICQoVFJHRElSKS9jc2UubyAtSSQoVFJHRElSKQorCiskKFRSR0RJUikvY3AubzogY3AuYyBvcHQuaCBzdXBwLmggJChUUkdESVIpL21hY2hpbmUuaCAkKFRSR0RJUikvZHQuaAorCSQoQ0MpIC1jIGNwLmMgLW8gJChUUkdESVIpL2NwLm8gLUkkKFRSR0RJUikKKworJChUUkdESVIpL2xvb3AubzogbG9vcC5jIG9wdC5oIHN1cHAuaCAkKFRSR0RJUikvbWFjaGluZS5oICQoVFJHRElSKS9kdC5oCisJJChDQykgLWMgbG9vcC5jIC1vICQoVFJHRElSKS9sb29wLm8gLUkkKFRSR0RJUikKKworJChUUkdESVIpL2FsaWFzLm86IGFsaWFzLmMgb3B0Lmggc3VwcC5oICQoVFJHRElSKS9tYWNoaW5lLmggJChUUkdESVIpL2R0LmgKKwkkKENDKSAtYyBhbGlhcy5jIC1vICQoVFJHRElSKS9hbGlhcy5vIC1JJChUUkdESVIpCisKKyQoVFJHRElSKS9yYW5nZS5vOiByYW5nZS5jIG9wdC5oIHN1cHAuaCAkKFRSR0RJUikvbWFjaGluZS5oICQoVFJHRElSKS9kdC5oCisJJChDQykgLWMgcmFuZ2UuYyAtbyAkKFRSR0RJUikvcmFuZ2UubyAtSSQoVFJHRElSKQorCiskKFRSR0RJUikvcHJlcHJvYy5vOiBwcmVwcm9jLmMgdmJwcC5oIHN1cHAuaCB2YmMuaCAkKFRSR0RJUikvZHQuaAorCSQoQ0MpIC1jIHByZXByb2MuYyAtbyAkKFRSR0RJUikvcHJlcHJvYy5vIC1JJChUUkdESVIpCisKKyQoVFJHRElSKS9hc3NlcnQubzogdWNwcC9hc3NlcnQuYyB1Y3BwL2NwcC5oIHVjcHAvbWVtLmggdWNwcC9oYXNoLmggdWNwcC90dW5lLmggJChUUkdESVIpL2R0LmgKKwkkKENDKSAtRE5PX1VDUFBfRVJST1JfRlVOQ1RJT05TIC1jIHVjcHAvYXNzZXJ0LmMgLW8gJChUUkdESVIpL2Fzc2VydC5vIC1JJChUUkdESVIpCisKKyQoVFJHRElSKS9jcHAubzogdWNwcC9jcHAuYyB1Y3BwL2NwcC5oIHVjcHAvbWVtLmggdWNwcC9oYXNoLmggdWNwcC90dW5lLmggJChUUkdESVIpL2R0LmgKKwkkKENDKSAtRE5PX1VDUFBfRVJST1JfRlVOQ1RJT05TIC1jIHVjcHAvY3BwLmMgLW8gJChUUkdESVIpL2NwcC5vIC1JJChUUkdESVIpCisKKyQoVFJHRElSKS9oYXNoLm86IHVjcHAvaGFzaC5jIHVjcHAvY3BwLmggdWNwcC9tZW0uaCB1Y3BwL2hhc2guaCB1Y3BwL3R1bmUuaCAkKFRSR0RJUikvZHQuaAorCSQoQ0MpIC1ETk9fVUNQUF9FUlJPUl9GVU5DVElPTlMgLWMgdWNwcC9oYXNoLmMgLW8gJChUUkdESVIpL2hhc2gubyAtSSQoVFJHRElSKQorCiskKFRSR0RJUikvbGV4ZXIubzogdWNwcC9sZXhlci5jIHVjcHAvY3BwLmggdWNwcC9tZW0uaCB1Y3BwL2hhc2guaCB1Y3BwL3R1bmUuaCAkKFRSR0RJUikvZHQuaAorCSQoQ0MpIC1ETk9fVUNQUF9FUlJPUl9GVU5DVElPTlMgLWMgdWNwcC9sZXhlci5jIC1vICQoVFJHRElSKS9sZXhlci5vIC1JJChUUkdESVIpCisKKyQoVFJHRElSKS9tYWNyby5vOiB1Y3BwL21hY3JvLmMgdWNwcC9jcHAuaCB1Y3BwL21lbS5oIHVjcHAvaGFzaC5oIHVjcHAvdHVuZS5oICQoVFJHRElSKS9kdC5oCisJJChDQykgLUROT19VQ1BQX0VSUk9SX0ZVTkNUSU9OUyAtYyB1Y3BwL21hY3JvLmMgLW8gJChUUkdESVIpL21hY3JvLm8gLUkkKFRSR0RJUikKKworJChUUkdESVIpL21lbS5vOiB1Y3BwL21lbS5jIHVjcHAvY3BwLmggdWNwcC9tZW0uaCB1Y3BwL2hhc2guaCB1Y3BwL3R1bmUuaCAkKFRSR0RJUikvZHQuaAorCSQoQ0MpIC1ETk9fVUNQUF9FUlJPUl9GVU5DVElPTlMgLWMgdWNwcC9tZW0uYyAtbyAkKFRSR0RJUikvbWVtLm8gLUkkKFRSR0RJUikKKworJChUUkdESVIpL2V2YWwubzogdWNwcC9ldmFsLmMgdWNwcC9jcHAuaCB1Y3BwL21lbS5oIHVjcHAvdHVuZS5oICQoVFJHRElSKS9kdC5oCisJJChDQykgLUROT19VQ1BQX0VSUk9SX0ZVTkNUSU9OUyAtYyB1Y3BwL2V2YWwuYyAtbyAkKFRSR0RJUikvZXZhbC5vIC1JJChUUkdESVIpCisKKyQoVFJHRElSKS9tYWNoaW5lLm86ICQoVFJHRElSKS9tYWNoaW5lLmMgc3VwcC5oICQoVFJHRElSKS9tYWNoaW5lLmggJChUUkdESVIpL2R0LmggZHdhcmYyLmMKKwkkKENDKSAtYyAkKFRSR0RJUikvbWFjaGluZS5jIC1vICQoVFJHRElSKS9tYWNoaW5lLm8gLUkkKFRSR0RJUikgLUkuCisKKyQoVFJHRElSKS9vcHRzLm86IG9wdC5jIG9wdC5oIHN1cHAuaCAkKFRSR0RJUikvbWFjaGluZS5oICQoVFJHRElSKS9kdC5oCisJJChDQykgLWMgLUROT19PUFRJTUlaRVIgb3B0LmMgLW8gJChUUkdESVIpL29wdHMubyAtSSQoVFJHRElSKQorCiskKFRSR0RJUikvcmVnc3MubzogcmVncy5jIG9wdC5oIHN1cHAuaCAkKFRSR0RJUikvbWFjaGluZS5oICQoVFJHRElSKS9kdC5oCisJJChDQykgLWMgLUROT19PUFRJTUlaRVIgcmVncy5jIC1vICQoVFJHRElSKS9yZWdzcy5vIC1JJChUUkdESVIpCisKKyQoVFJHRElSKS92c2MubzogdnNjL3ZzYy5oIHZzYy92c2MuYyAkKFRSR0RJUikvc2NoZWR1bGUuaAorCSQoQ0MpIC1jIHZzYy92c2MuYyAtbyAkKFRSR0RJUikvdnNjLm8gLUkkKFRSR0RJUikKKworJChUUkdESVIpL3NjaGVkdWxlLm86IHZzYy92c2MuaCAkKFRSR0RJUikvc2NoZWR1bGUuaCAkKFRSR0RJUikvc2NoZWR1bGUuYworCSQoQ0MpIC1jICQoVFJHRElSKS9zY2hlZHVsZS5jIC1vICQoVFJHRElSKS9zY2hlZHVsZS5vIC1JJChUUkdESVIpIC1JdnNjCisKKyQoVFJHRElSKS92Y3ByLm86IHZjcHIvdmNwci5oIHZjcHIvdmNwci5jCisJJChDQykgLWMgdmNwci92Y3ByLmMgLW8gJChUUkdESVIpL3ZjcHIubyAtSSQoVFJHRElSKQorCiskKFRSR0RJUikvY29tcHJlc3MubzogdmNwci92Y3ByLmggJChUUkdESVIpL2NvbXByZXNzLmMKKwkkKENDKSAtYyAkKFRSR0RJUikvY29tcHJlc3MuYyAtbyAkKFRSR0RJUikvY29tcHJlc3MubyAtSSQoVFJHRElSKSAtSXZjcHIKKworCisKKyMgR3JhcGggY29sb3JpbmcgcmVnaXN0ZXIgYWxsb2NhdG9yIGJ5IEFsZXgKKyQoVFJHRElSKS9BZGpMaXN0Lm86IEdDUmVnQWxsb2MvQWRqTGlzdC5jIG9wdC5oIHN1cHAuaCAkKFRSR0RJUikvbWFjaGluZS5oICQoVFJHRElSKS9kdC5oCisJJChDQykgLWMgR0NSZWdBbGxvYy9BZGpMaXN0LmMgLW8gJChUUkdESVIpL0Fkakxpc3QubyAtSUdDUmVnQWxsb2MgLUkkKFRSR0RJUikKKworJChUUkdESVIpL0RVQ2hhaW4ubzogR0NSZWdBbGxvYy9EVUNoYWluLmMgb3B0Lmggc3VwcC5oICQoVFJHRElSKS9tYWNoaW5lLmggJChUUkdESVIpL2R0LmgKKwkkKENDKSAtYyBHQ1JlZ0FsbG9jL0RVQ2hhaW4uYyAtbyAkKFRSR0RJUikvRFVDaGFpbi5vIC1JR0NSZWdBbGxvYyAtSSQoVFJHRElSKQorCiskKFRSR0RJUikvSUNvZGVJbnNlcnRpb24ubzogR0NSZWdBbGxvYy9JQ29kZUluc2VydGlvbi5jIG9wdC5oIHN1cHAuaCAkKFRSR0RJUikvbWFjaGluZS5oICQoVFJHRElSKS9kdC5oCisJJChDQykgLWMgR0NSZWdBbGxvYy9JQ29kZUluc2VydGlvbi5jIC1vICQoVFJHRElSKS9JQ29kZUluc2VydGlvbi5vIC1JR0NSZWdBbGxvYyAtSSQoVFJHRElSKQorCiskKFRSR0RJUikvTm9kZUxpc3QubzogR0NSZWdBbGxvYy9Ob2RlTGlzdC5jIG9wdC5oIHN1cHAuaCAkKFRSR0RJUikvbWFjaGluZS5oICQoVFJHRElSKS9kdC5oCisJJChDQykgLWMgR0NSZWdBbGxvYy9Ob2RlTGlzdC5jIC1vICQoVFJHRElSKS9Ob2RlTGlzdC5vIC1JR0NSZWdBbGxvYyAtSSQoVFJHRElSKQorCiskKFRSR0RJUikvUkFsbG9jTWFpbi5vOiBHQ1JlZ0FsbG9jL1JBbGxvY01haW4uYyBvcHQuaCBzdXBwLmggJChUUkdESVIpL21hY2hpbmUuaCAkKFRSR0RJUikvZHQuaAorCSQoQ0MpIC1jIEdDUmVnQWxsb2MvUkFsbG9jTWFpbi5jIC1vICQoVFJHRElSKS9SQWxsb2NNYWluLm8gLUlHQ1JlZ0FsbG9jIC1JJChUUkdESVIpCisKKyQoVFJHRElSKS9XZWIubzogR0NSZWdBbGxvYy9XZWIuYyBvcHQuaCBzdXBwLmggJChUUkdESVIpL21hY2hpbmUuaCAkKFRSR0RJUikvZHQuaAorCSQoQ0MpIC1jIEdDUmVnQWxsb2MvV2ViLmMgLW8gJChUUkdESVIpL1dlYi5vIC1JR0NSZWdBbGxvYyAtSSQoVFJHRElSKQpkaWZmIC0tZ2l0IGEvYWxpYXMuYyBiL2FsaWFzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhOTQyZQotLS0gL2Rldi9udWxsCisrKyBiL2FsaWFzLmMKQEAgLTAsMCArMSw4MjIgQEAKKy8qICAkVkVSOiB2YmNjIChhbGlhcy5jKSAkUmV2aXNpb246IDEuNiAkICAqLworLyogIExpc3RlbiBiZW51dHp0ZXIvdmVyYWVuZGVydGVyIFZhcmlhYmxlbiB1bmQgQmVoYW5kbHVuZyB2b24gRGVja25hbWVuLiAgICovCisKKyNpbmNsdWRlICJvcHQuaCIKKworc3RhdGljIGNoYXIgRklMRV9bXT1fX0ZJTEVfXzsKKworc3RhdGljIGJ2dHlwZSAqKmdwdDsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcHRzaXplOworCisjZGVmaW5lIGlzX3Jlc3RyaWN0KGkpICgoaSk8PXZjb3VudC1yY291bnQmJih2aWxpc3RbaV0tPnZ0eXAtPmZsYWdzJlJFU1RSSUNUKSkKKworLyogc2V0cyBwb2ludHMtdG8taW5mbyBmb3IgdmFyIGkgdG8gdW5kZWZpbmVkICovCit2b2lkIHVuZGVmX3B0KGJ2dHlwZSAqKnB0LGludCBpKQoreworICBpZihpPDB8fGk+PXZjb3VudCkgaWVycm9yKDApOworICBpZihwdFtpXSkgcHRzaXplLT12c2l6ZTsKKyAgZnJlZShwdFtpXSk7CisgIHB0W2ldPTA7CisgIGlmKGk8cmNvdW50KXsKKyAgICBpKz12Y291bnQtcmNvdW50OworICAgIGlmKHB0W2ldKSBwdHNpemUtPXZzaXplOworICAgIGZyZWUocHRbaV0pOworICAgIHB0W2ldPTA7CisgIH0KK30KKworLyogd2Fsa3MgdGhyb3VnaCBhIGNsaXN0IGFuZCBzZXRzIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiBidgorICAgZm9yIGV2ZXJ5IHZhcmlhYmxlIHdob3NlIGFkZHJlc3MgaXMgY29udGFpbmVkIGluIHRoZSBjbGlzdCAqLwordm9pZCBhZGRfY2xpc3RfcmVmcyhidnR5cGUgKmJ2LHR5cGUgKnQsY29uc3RfbGlzdCAqY2wpCit7CisgIC8qRklYTUU6IGJlaSBBdWZydWZlbiBhdWNoIGF1ZiBsb2NhbGUsIG5pY2h0IFVTRURBU0RFU1R8VVNFREFTQUREUiAqLworICBpbnQgaTt6bWF4IHN6OworICBpZihJU0FSUkFZKHQtPmZsYWdzKSl7CisgICAgZm9yKHN6PWwyem0oMEwpOyF6bWxlcSh0LT5zaXplLHN6KSYmY2w7c3o9em1hZGQoc3osbDJ6bSgxTCkpLGNsPWNsLT5uZXh0KXsKKyAgICAgIGlmKCFjbC0+b3RoZXIpe2llcnJvcigwKTtyZXR1cm47fQorICAgICAgYWRkX2NsaXN0X3JlZnMoYnYsdC0+bmV4dCxjbC0+b3RoZXIpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYoSVNVTklPTih0LT5mbGFncykpeworICAgIGFkZF9jbGlzdF9yZWZzKGJ2LCgqdC0+ZXhhY3QtPnNsKVswXS5zdHlwLGNsKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYoSVNTVFJVQ1QodC0+ZmxhZ3MpKXsKKyAgICB0eXBlICpzdDsKKyAgICBmb3IoaT0wO2k8dC0+ZXhhY3QtPmNvdW50JiZjbDtpKyspeworICAgICAgaWYoIWNsLT5vdGhlcil7aWVycm9yKDApO3JldHVybjt9CisgICAgICBzdD0oKnQtPmV4YWN0LT5zbClbaV0uc3R5cDsKKyAgICAgIGlmKCEoKnQtPmV4YWN0LT5zbClbaV0uaWRlbnRpZmllcikgaWVycm9yKDApOworICAgICAgaWYoKCp0LT5leGFjdC0+c2wpW2ldLmlkZW50aWZpZXJbMF0peworICAgICAgICBhZGRfY2xpc3RfcmVmcyhidixzdCxjbC0+b3RoZXIpOworICAgICAgICBjbD1jbC0+bmV4dDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGlmKGNsLT50cmVlJiYoY2wtPnRyZWUtPm8uZmxhZ3MmVkFSQURSKSl7CisgICAgLyogY2FyZWZ1bDogdmFyaWFibGUgbWlnaHQgbm90IGhhdmUgYSB2YWxpZCBpbmRleCBpZiBpdCBpcyBub3QKKyAgICAgICB1c2VkIHdpdGhpbiB0aGUgZnVuY3Rpb24gb3B0aW1pemVkICovCisgICAgaT1jbC0+dHJlZS0+by52LT5pbmRleDsKKyAgICBpZihpPj0wJiZpPHZjb3VudC1yY291bnQmJnZpbGlzdFtpXT09Y2wtPnRyZWUtPm8udil7CisgICAgICAvKnByaW50ZigiYWRkICVzXG4iLHZpbGlzdFtpXS0+aWRlbnRpZmllcik7Ki8KKyAgICAgIEJTRVQoYnYsaSk7CisgICAgfQorICB9Cit9CisKKy8qIGNvcGllcyBwb2ludHMtdG8taW5mbyBmb3Igb25lIHZhciB0byBhbm90aGVyICovCit2b2lkIGNvcHlfcHQoYnZ0eXBlICoqcHQsaW50IHRvLGludCBmcm9tKQoreworICBpZih0bzwwfHx0bz49dmNvdW50KSBpZXJyb3IoMCk7CisgIGlmKGZyb208MHx8ZnJvbT49dmNvdW50KSBpZXJyb3IoMCk7CisgIGlmKCFwdFtmcm9tXSl7CisgICAgaWYoZnJvbT49dmNvdW50LXJjb3VudCYmcHRbZnJvbS0odmNvdW50LXJjb3VudCldKXsKKyAgICAgIC8qIGlmIGRyZWYgY2hlY2ssIHdoZXRoZXIgZnJvbSBvbmx5IHBvaW50cyB0byBpbml0aWFsaXplZCBjb25zdCAqLworICAgICAgaW50IGk7YnZ0eXBlICpuZXc7CisgICAgICBmb3IoaT0wO2k8dmNvdW50O2krKyl7CisJaWYoQlRTVChwdFtmcm9tLSh2Y291bnQtcmNvdW50KV0saSkpeworCSAgVmFyICp2PXZpbGlzdFtpXTsKKwkgIGlmKCFpc19jb25zdCh2LT52dHlwKXx8IXYtPmNsaXN0fHwodi0+c3RvcmFnZV9jbGFzcyE9U1RBVElDJiZ2LT5zdG9yYWdlX2NsYXNzIT1FWFRFUk4pKQorCSAgICBicmVhazsKKwl9CisgICAgICB9CisgICAgICBpZihpPT12Y291bnQpeworCS8qIHllcywgdGFrZSB0aGUgcG9pbnRzLXRvLWluZm8gZnJvbSBjbGlzdCAqLworCWlmKCFwdFt0b118fHRvK3Zjb3VudC1yY291bnQ9PWZyb20peworCSAgbmV3PW15bWFsbG9jKHZzaXplKTsKKwkgIHB0c2l6ZSs9dnNpemU7CisJfWVsc2UKKwkgIG5ldz1wdFt0b107CisJbWVtc2V0KG5ldywwLHZzaXplKTsKKwlmb3IoaT0wO2k8dmNvdW50O2krKyl7CisJICBpZihCVFNUKHB0W2Zyb20tKHZjb3VudC1yY291bnQpXSxpKSkKKwkgICAgYWRkX2NsaXN0X3JlZnMobmV3LHZpbGlzdFtpXS0+dnR5cCx2aWxpc3RbaV0tPmNsaXN0KTsKKwl9CisJaWYodG8rdmNvdW50LXJjb3VudD09ZnJvbSl7CisJICBwdHNpemUtPXZzaXplOworCSAgZnJlZShwdFt0b10pOworCX0KKwlwdFt0b109bmV3OworCXJldHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgdW5kZWZfcHQocHQsdG8pOworICB9ZWxzZXsKKyAgICBpZighcHRbdG9dKXsKKyAgICAgIHB0W3RvXT1teW1hbGxvYyh2c2l6ZSk7CisgICAgICBwdHNpemUrPXZzaXplOworICAgIH0KKyAgICBtZW1jcHkocHRbdG9dLHB0W2Zyb21dLHZzaXplKTsKKyAgfQorfQorCisvKiBzZXQgdmFyIGkgcG9pbnRzIG9ubHkgdG8gaiBpbiBwb2ludHMtdG8taW5mbyAqLwordm9pZCBzZXRfcHQoYnZ0eXBlICoqcHQsaW50IGksaW50IGopCit7CisgIGlmKGk8MHx8aT49dmNvdW50KSBpZXJyb3IoMCk7CisgIGlmKGo8MHx8aj49dmNvdW50KSBpZXJyb3IoMCk7CisgIGlmKCFwdFtpXSl7CisgICAgcHRbaV09bXltYWxsb2ModnNpemUpOworICAgIHB0c2l6ZSs9dnNpemU7CisgIH0KKyAgbWVtc2V0KHB0W2ldLDAsdnNpemUpOworICBCU0VUKHB0W2ldLGopOworfQorCit2b2lkIHByaW50X3NpbmdsZV9wdChidnR5cGUgKnB0KQoreworICBpbnQgajsKKyAgaWYocHQpeworICAgIGZvcihqPTA7ajx2Y291bnQ7aisrKXsKKyAgICAgIGlmKEJUU1QocHQsaikpCisJcHJpbnRmKCIgICVzPCVzPiglcClcbiIsKGo+PXZjb3VudC1yY291bnQpPyIqIjoiIix2aWxpc3Rbal0tPmlkZW50aWZpZXIsKHZvaWQqKXZpbGlzdFtqXSk7CisgICAgfQorICB9ZWxzZXsKKyAgICBwcmludGYoIiAgKHVuZGVmaW5lZClcbiIpOworICB9Cit9CisKK3ZvaWQgcHJpbnRfcHQoYnZ0eXBlICoqcHQpCit7CisgIGludCBpLGo7CisgIGlmKCFwdCkgcmV0dXJuOworICBwcmludGYoInBvaW50cy10bzpcbiIpOworICBmb3IoaT0wO2k8dmNvdW50O2krKyl7CisgICAgcHJpbnRmKCIlczwlcz4oJXApOlxuIiwoaT49dmNvdW50LXJjb3VudCk/IioiOiIiLHZpbGlzdFtpXS0+aWRlbnRpZmllciwodm9pZCopdmlsaXN0W2ldKTsKKyAgICBwcmludF9zaW5nbGVfcHQocHRbaV0pOworICB9Cit9CisKKy8qIGNyZWF0ZXMgbmV3IHBvaW50cy10by1pbmZvOyBldmVyeSB2YXIgc2V0IHRvIHVuZGVmaW5lZCAqLworYnZ0eXBlICoqbmV3X3B0KHZvaWQpCit7CisgIGJ2dHlwZSAqKnB0OworICBpbnQgaTsKKyAgcHQ9bXltYWxsb2ModmNvdW50KnNpemVvZigqcHQpKTsKKyAgcHRzaXplKz12Y291bnQqc2l6ZW9mKCpwdCk7CisgIGZvcihpPTA7aTx2Y291bnQ7aSsrKXsKKyAgICBpZihpPHJjb3VudCYmKHZpbGlzdFtpXS0+dnR5cC0+ZmxhZ3MmUkVTVFJJQ1QpKXsKKyAgICAgIHB0W2ldPW15bWFsbG9jKHZzaXplKTsKKyAgICAgIHB0c2l6ZSs9dnNpemU7CisgICAgICBtZW1zZXQocHRbaV0sMCx2c2l6ZSk7CisgICAgICBCU0VUKHB0W2ldLGkrdmNvdW50LXJjb3VudCk7CisgICAgfWVsc2UKKyAgICAgIHB0W2ldPTA7CisgIH0KKyAgcmV0dXJuIHB0OworfQorCit2b2lkIGZyZWVfcHQoYnZ0eXBlICoqcHQpCit7CisgIGludCBpOworICBpZihwdCl7CisgICAgZm9yKGk9MDtpPHZjb3VudDtpKyspeworICAgICAgaWYocHRbaV0pIHB0c2l6ZS09dnNpemU7CisgICAgICBmcmVlKHB0W2ldKTsKKyAgICB9CisgICAgcHRzaXplLT12Y291bnQqc2l6ZW9mKCpwdCk7CisgICAgZnJlZShwdCk7CisgIH0KK30KKworLyogc2V0IHBvaW50cy10by1pbmZvIG9mICp2IHRvIHVuaW9uIG9mIHBvaW50cy10byBvZiBhbGwgdmFycyBpbiB0aGUKKyAgIHBvaW50cy10by1pbmZvIG9mIHYgKi8KK3ZvaWQgZHJlZl9wdChidnR5cGUgKipwdCxpbnQgaSkKK3sKKyAgaW50IGosZDsKKyAgaWYoaTwwfHxpPj1yY291bnQpIGllcnJvcigwKTsKKyAgZD1pK3Zjb3VudC1yY291bnQ7CisgIGlmKCFwdFtpXSl7CisgICAgdW5kZWZfcHQocHQsZCk7CisgICAgcmV0dXJuOworICB9CisgIGlmKCFwdFtkXSl7CisgICAgcHRbZF09bXltYWxsb2ModnNpemUpOworICAgIHB0c2l6ZSs9dnNpemU7CisgIH0KKyAgbWVtc2V0KHB0W2RdLDAsdnNpemUpOworICBmb3Ioaj0wO2o8dmNvdW50O2orKyl7CisgICAgaWYoQlRTVChwdFtpXSxqKSl7CisgICAgICBWYXIgKnY9dmlsaXN0W2pdOworICAgICAgaWYodi0+Y2xpc3QmJmlzX2NvbnN0KHYtPnZ0eXApJiYodi0+c3RvcmFnZV9jbGFzcz09U1RBVElDfHx2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pKXsKKwlhZGRfY2xpc3RfcmVmcyhwdFtkXSx2LT52dHlwLHYtPmNsaXN0KTsKKyAgICAgIH1lbHNlIGlmKCFwdFtqXSl7CisJdW5kZWZfcHQocHQsZCk7CisJcmV0dXJuOworICAgICAgfWVsc2UKKwlidnVuaXRlKHB0W2RdLHB0W2pdLHZzaXplKTsKKyAgICB9CisgIH0KK30KKwordm9pZCB0cmFuc19wdChidnR5cGUgKipwdCxJQyAqcCkKK3sKKyAgaW50IGksaixuZXdzZXQ9LTEsc3YsY3A7CisgIGlmKChwLT5jb2RlPT1BRERJMlB8fHAtPmNvZGU9PVNVQklGUCkmJiFjb21wYXJlX29ianMoJnAtPnExLCZwLT56LHp0eXAocCkpKQorICAgIHJldHVybjsKKyAgaWYoKHAtPnouZmxhZ3MmVkFSKSYmSVNTQ0FMQVIocC0+ei52LT52dHlwLT5mbGFncykpeworICAgIGk9cC0+ei52LT5pbmRleDsKKyAgICBpZihpPDB8fGk+PXZjb3VudCkgaWVycm9yKDApOworICAgIGlmKHAtPnouZmxhZ3MmRFJFRk9CSil7CisgICAgICBpZihpPj1yY291bnQpIGllcnJvcigwKTsKKyAgICAgIGkrPXZjb3VudC1yY291bnQ7CisgICAgfQorICAgIGlmKCFpc19yZXN0cmljdChpKSl7CisgICAgICBpZihwLT5jb2RlPT1BU1NJR04peworCW5ld3NldD1pO3N2PS0xO2NwPS0xOworCWlmKHAtPnExLmZsYWdzJlZBUkFEUil7CisJICBzdj1wLT5xMS52LT5pbmRleDsKKwkgIHNldF9wdChwdCxpLHAtPnExLnYtPmluZGV4KTsKKwl9ZWxzZSBpZihwLT5xMS5mbGFncyZWQVIpeworCSAgaj1wLT5xMS52LT5pbmRleDsKKwkgIGlmKGo8MHx8aj49dmNvdW50KSBpZXJyb3IoMCk7CisJICBpZihwLT5xMS5mbGFncyZEUkVGT0JKKXsKKwkgICAgaWYoaj49cmNvdW50KSBpZXJyb3IoMCk7CisJICAgIGorPXZjb3VudC1yY291bnQ7CisJICB9CisJICBjcD1qOworCSAgY29weV9wdChwdCxpLGopOworCX1lbHNleworCSAgaWYoIXB0W2ldKXsKKwkgICAgcHRbaV09bXltYWxsb2ModnNpemUpOworCSAgICBwdHNpemUrPXZzaXplOworCSAgfQorCSAgbWVtc2V0KHB0W2ldLDAsdnNpemUpOworCX0KKyAgICAgIH0gIAorICAgICAgaWYocC0+Y29kZT09QUREUkVTUyl7CisJbmV3c2V0PWk7c3Y9cC0+cTEudi0+aW5kZXg7Y3A9LTE7CisJc2V0X3B0KHB0LGkscC0+cTEudi0+aW5kZXgpOworICAgICAgfQorICAgICAgaWYoKHAtPmNvZGU9PUFEREkyUHx8cC0+Y29kZT09U1VCSUZQKSYmKHAtPnExLmZsYWdzJlZBUikpeworCW5ld3NldD1pO3N2PS0xO2NwPS0xOworCWlmKHAtPnExLmZsYWdzJlZBUkFEUil7CisJICBzdj1wLT5xMS52LT5pbmRleDsKKwkgIHNldF9wdChwdCxpLHAtPnExLnYtPmluZGV4KTsKKwl9ZWxzZXsKKwkgIGo9cC0+cTEudi0+aW5kZXg7CisJICBpZihqPDB8fGo+PXZjb3VudCkgaWVycm9yKDApOworCSAgaWYocC0+cTEuZmxhZ3MmRFJFRk9CSil7CisJICAgIGlmKGo+PXJjb3VudCkgaWVycm9yKDApOworCSAgICBqKz12Y291bnQtcmNvdW50OworCSAgfQorCSAgY3A9ajsKKwkgIGNvcHlfcHQocHQsaSxqKTsKKwl9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKG5ld3NldD49MCYmbmV3c2V0PHJjb3VudCl7CisgICAgaWYobmV3c2V0PDApIGllcnJvcigwKTsKKyAgICBkcmVmX3B0KHB0LG5ld3NldCk7CisgIH0KKyAgZm9yKGk9MDtpPHAtPmNoYW5nZV9jbnQ7aSsrKXsKKyAgICBqPXAtPmNoYW5nZV9saXN0W2ldLnYtPmluZGV4OworICAgIGlmKGo8MHx8aj49dmNvdW50KSBpZXJyb3IoMCk7CisgICAgaWYocC0+Y2hhbmdlX2xpc3RbaV0uZmxhZ3MmRFJFRk9CSil7CisgICAgICBpZihqPj1yY291bnQpIGllcnJvcigwKTsKKyAgICAgIGorPXZjb3VudC1yY291bnQ7CisgICAgfQorICAgIGlmKGohPW5ld3NldCYmIWlzX3Jlc3RyaWN0KGopKXsKKyAgICAgIGlmKG5ld3NldD49MCYmcHRbal0peworCWlmKHN2Pj0wKXsKKwkgIGlmKHN2Pj12Y291bnQpIGllcnJvcigwKTsKKwkgIEJTRVQocHRbal0sc3YpOworCX0KKwlpZihjcD49MCYmcHRbY3BdKXsKKwkgIGlmKGNwPDB8fGNwPj12Y291bnQpIGllcnJvcigwKTsKKwkgIGJ2dW5pdGUocHRbal0scHRbY3BdLHZzaXplKTsKKwl9CisgICAgICB9ZWxzZQorCXVuZGVmX3B0KHB0LGopOworICAgIH0KKyAgfQorfQorCitidnR5cGUgKipjbG9uZV9wdChidnR5cGUgKipwdCkKK3sKKyAgaW50IGk7CisgIGJ2dHlwZSAqKm5ldzsKKyAgaWYoIXB0KQorICAgIHJldHVybiBuZXdfcHQoKTsKKyAgbmV3PW15bWFsbG9jKHZjb3VudCpzaXplb2YoKm5ldykpOworICBwdHNpemUrPXZjb3VudCpzaXplb2YoKm5ldyk7CisgIGZvcihpPTA7aTx2Y291bnQ7aSsrKXsKKyAgICBpZihwdFtpXSl7CisgICAgICBuZXdbaV09bXltYWxsb2ModnNpemUpOworICAgICAgcHRzaXplKz12c2l6ZTsKKyAgICAgIG1lbWNweShuZXdbaV0scHRbaV0sdnNpemUpOworICAgIH1lbHNlCisgICAgICBuZXdbaV09MDsKKyAgfQorICByZXR1cm4gbmV3OworfQorCisvKiB0ZXN0cyBpZiB0d28gcG9pbnRzLXRvLWluZm9zIGFyZSBpZGVudGljYWwgKi8KK2ludCBlcXVhbF9wdChidnR5cGUgKipwdDEsYnZ0eXBlICoqcHQyKQoreworICBpbnQgaTsKKyAgaWYoIXB0MSYmIXB0MikgCisgICAgcmV0dXJuIDE7CisgIGlmKCFwdDF8fCFwdDIpCisgICAgcmV0dXJuIDA7CisgIGZvcihpPTA7aTx2Y291bnQ7aSsrKXsKKyAgICBpZighcHQxW2ldJiYhcHQyW2ldKQorICAgICAgY29udGludWU7CisgICAgaWYoIXB0MVtpXXx8IXB0MltpXSkKKyAgICAgIHJldHVybiAwOworICAgIGlmKG1lbWNtcChwdDFbaV0scHQyW2ldLHZzaXplKSkKKyAgICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorI2lmIDAKK3ZvaWQgY2FsY19wdChmbG93Z3JhcGggKmZnKQoreworICBmbG93Z3JhcGggKmc7CisgIGZsb3dsaXN0ICppbjsKKyAgSUMgKnA7CisgIGJ2dHlwZSAqKnB0LCoqcHB0OworICBpbnQgaSxhbGxfcHJlZHMsY2hhbmdlZDsKKworICBjaGFuZ2VkPTE7CisgIHdoaWxlKGNoYW5nZWQpeworICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiY2FsY19wdCBwYXNzXG4iKTsKKyAgICBjaGFuZ2VkPTA7CisgICAgZm9yKGc9Zmc7ZztnPWctPm5vcm1hbG91dCl7CisgICAgICAvKiBkbyBhbGwgcHJlZGVjZXNzb3JzIGFscmVhZHkgaGF2ZSBwb2ludHMtdG8taW5mbz8gKi8KKyAgICAgIGFsbF9wcmVkcz0xOworICAgICAgZm9yKGluPWctPmluO2luO2luPWluLT5uZXh0KXsKKwlpZighaW4tPmdyYXBoLT5wdCl7CisJICBhbGxfcHJlZHM9MDsKKwkgIGJyZWFrOworCX0KKyAgICAgIH0KKyAgICAgIGlmKGFsbF9wcmVkcyYmZy0+aW4peworCS8qIGNhbGMgdW5pb24gb2YgYWxsIHByZWRlY2Vzc29ycyAqLworCXB0PWNsb25lX3B0KGctPmluLT5ncmFwaC0+cHQpOworCWZvcihpbj1nLT5pbi0+bmV4dDtpbjtpbj1pbi0+bmV4dCl7CisJICBwcHQ9aW4tPmdyYXBoLT5wdDsKKwkgIGZvcihpPTA7aTx2Y291bnQ7aSsrKXsKKwkgICAgaWYocHRbaV0peworCSAgICAgIGlmKCFwcHRbaV0pCisJCXVuZGVmX3B0KHB0LGkpOworCSAgICAgIGVsc2UKKwkJYnZ1bml0ZShwdFtpXSxwcHRbaV0sdnNpemUpOworCSAgICB9CisJICB9CisJfQorICAgICAgfWVsc2UKKwlwdD1uZXdfcHQoKTsKKyAgICAgIGZvcihwPWctPnN0YXJ0O3A7cD1wLT5uZXh0KXsKKwl0cmFuc19wdChwdCxwKTsKKwlpZihwPT1nLT5lbmQpCisJICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmKHB0PT1nLT5wdCkgaWVycm9yKDApOworICAgICAgaWYoIWNoYW5nZWQpeworCWlmKCFlcXVhbF9wdChwdCxnLT5wdCkpeworCSAgY2hhbmdlZD0xOworCSAgZnJlZV9wdChnLT5wdCk7CisJICBnLT5wdD1wdDsKKwl9ZWxzZXsKKwkgIGZyZWVfcHQocHQpOworCX0KKyAgICAgIH1lbHNleworCWZyZWVfcHQoZy0+cHQpOworCWctPnB0PXB0OworICAgICAgfQorICAgIH0KKyAgfQorfQorI2VuZGlmCitpbnQgcF90eXAoVmFyICp2KQorLyogIExpZWZlcnQgZGVuIFR5cCwgYXVmIGRlbiBWYXJpYWJsZSB6ZWlnZW4ga2Fubi4gRmFsbHMgbmljaHQgZWluZGV1dGlnICAgICovCisvKiAgd2lyZCBDSEFSIHp1cnVlY2tnZWdlYmVuLCBkYSBlaW4gY2hhciAqIGF1ZiBhbGxlcyB6ZWlnZW4ga2Fubi4gICAgICAgICAgKi8KK3sKKyAgICB0eXBlICp0PXYtPnZ0eXA7aW50IGY7CisgICAgLyogIEtlaW4gWmVpZ2VyPyBEYW5uIG1vZWdsaWNoZXJ3ZWlzZSBTdHJ1a3R1ciwgZGllIHZlcnNjaGllZGVuZSBaZWlnZXIgKi8KKyAgICAvKiAgZW50aGFsdGVuIGtvZW5udGUuIEtvZW5udGUgbWFuIGV2dGwuIG5vY2ggZ2VuYXVlciBwcnVlZmVuLiAgICAgICAgICAqLworICAgIGlmKCFJU1BPSU5URVIodC0+ZmxhZ3MpfHwhdC0+bmV4dHx8KHYtPmZsYWdzJkROT1RUWVBFU0FGRSkpIHJldHVybiBDSEFSOworICAgIGY9dC0+bmV4dC0+ZmxhZ3MmTlE7CisgICAgaWYoZj09Vk9JRCkgZj1DSEFSOworICAgIHJldHVybiBmOworfQorCisvKiBwcm9wYWdhdGVzIGluZm9ybWF0aW9uIGlmIGEgdmFyaWFibGUgd2hvc2UgYWRkcmVzcyBtYXkgaGF2ZSBiZWVuIHRha2VuCisgICBpcyBtb2RpZmllZCAqLworc3RhdGljIHZvaWQgcHJvcGFnYXRlX3BvaW50ZXJzKGJ2dHlwZSAqc2V0LFZhciAqdixpbnQgdCxpbnQgaSkKK3sKKyAgaW50IGosdDI7CisgIGlmKHYtPm5lc3Rpbmc9PTB8fHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTnx8KHYtPmZsYWdzJlVTRURBU0FEUikpeworICAgIGlmKG5vYWxpYXNvcHQpeworICAgICAgYnZ1bml0ZShzZXQsYXZfZHJlZnMsdnNpemUpOworICAgIH1lbHNleworICAgICAgZm9yKGo9MDtqPHJjb3VudDtqKyspeworCXQyPXBfdHlwKHZpbGlzdFtqXSk7CisJaWYodD09dDJ8fHQyPT1DSEFSfHwhSVNTQ0FMQVIodCl8fCFJU1NDQUxBUih0MikpeworCSAgaWYoIWdwdHx8IWdwdFtqXXx8KGk+PTAmJkJUU1QoZ3B0W2pdLGkpKSkKKwkgICAgQlNFVChzZXQsait2Y291bnQtcmNvdW50KTsKKwl9CSAgICAKKyAgICAgIH0KKyAgICB9CisgIH0KK30KK3ZvaWQgYWxpYXNfcHJvcGFnYXRlKGJ2dHlwZSAqc2V0LGludCBpLGludCB0LGludCB3cikKK3sKKyAgaW50IGosdDI7CisgIFZhciAqdjsKKyAgaWYoaTwwfHxpPj12Y291bnQpIGllcnJvcigwKTsKKyAgdCY9TlE7CisgIEJTRVQoc2V0LGkpOworICBpZih3ciYmaTxyY291bnQpIEJTRVQoc2V0LGkrdmNvdW50LXJjb3VudCk7CisgIGlmKGk+PXZjb3VudC1yY291bnQpeworICAgIC8qIERSRUZPQkogKi8KKyAgICBpZihub2FsaWFzb3B0fHx0PT1DSEFSfHwhSVNTQ0FMQVIodCkpeworICAgICAgYnZ1bml0ZShzZXQsYXZfZHJlZnMsdnNpemUpOworICAgICAgYnZ1bml0ZShzZXQsYXZfYWRkcmVzcyx2c2l6ZSk7CisgICAgICBidnVuaXRlKHNldCxhdl9nbG9iYWxzLHZzaXplKTsKKyAgICB9ZWxzZXsKKyAgICAgIGZvcihqPTA7ajx2Y291bnQtcmNvdW50O2orKyl7CisJdj12aWxpc3Rbal07CisJaWYoIWdwdHx8IWdwdFtpLSh2Y291bnQtcmNvdW50KV18fEJUU1QoZ3B0W2ktKHZjb3VudC1yY291bnQpXSxqKSl7CisJICB2PXZpbGlzdFtqXTsKKwkgIGlmKCF2KSBpZXJyb3IoMCk7CisJICBpZih2LT5uZXN0aW5nPT0wfHx2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk58fCh2LT5mbGFncyZVU0VEQVNBRFIpKXsKKwkgICAgdHlwZSAqdHA9di0+dnR5cDsKKwkgICAgaWYoIXYtPnZ0eXApIGllcnJvcigwKTsKKwkgICAgZG97CisJICAgICAgdDI9dHAtPmZsYWdzJk5ROworCSAgICAgIHRwPXRwLT5uZXh0OworCSAgICB9d2hpbGUoSVNBUlJBWSh0MikpOworCSAgICBpZih0PT10Mnx8IUlTU0NBTEFSKHQyKSl7CisJICAgICAgQlNFVChzZXQsaik7CisJICAgICAgaWYod3ImJmo8cmNvdW50KSB7QlNFVChzZXQsait2Y291bnQtcmNvdW50KTtjb250aW51ZTt9CisJICAgIH0KKwkgIH0KKwl9CisJaWYoajxyY291bnQpeworCSAgaWYoaTwodmNvdW50LXJjb3VudCkpIGllcnJvcigwKTsKKwkgIGlmKCFncHR8fAorCSAgICAgKCFncHRbaS0odmNvdW50LXJjb3VudCldJiYhaXNfcmVzdHJpY3QoaikpfHwKKwkgICAgICghZ3B0W2pdJiYhaXNfcmVzdHJpY3QoaS0odmNvdW50LXJjb3VudCkpKXx8CisJICAgICAoZ3B0W2pdJiZncHRbaS0odmNvdW50LXJjb3VudCldJiZidmRvaW50ZXJzZWN0KGdwdFtpLSh2Y291bnQtcmNvdW50KV0sZ3B0W2pdLHZzaXplKSkpeworCSAgICB0Mj1wX3R5cCh2KTsKKwkgICAgaWYodD09dDJ8fHQyPT1DSEFSfHwhSVNTQ0FMQVIodDIpKQorCSAgICAgIEJTRVQoc2V0LGordmNvdW50LXJjb3VudCk7CisJICB9CisJfQorICAgICAgfQorICAgIH0KKyAgfWVsc2V7CisgICAgdj12aWxpc3RbaV07CisgICAgcHJvcGFnYXRlX3BvaW50ZXJzKHNldCx2LHQsaSk7CisgIH0KK30KKwordm9pZCBpY19jaGFuZ2VzKElDICpwLGJ2dHlwZSAqcmVzdWx0KQorLyogIEluaXRpYWxpc2llcnQgZGVuIEJpdHZla3RvciByZXN1bHQgbWl0IGFsbGVuIFZhcmlhYmxlbiwgZGllIGR1cmNoIGRhcyAgICovCisvKiAgSUMgcCBnZWFlbmRlcnQgd2VyZGVuIGtvZW5udGVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgICBpbnQgaSxqLHQsdDI7VmFyICp2OworICAgIG1lbXNldChyZXN1bHQsMCx2c2l6ZSk7CisgICAgdD0oenR5cChwKSZOUSk7CisgICAgaWYocC0+ei5mbGFncyZWQVIpeworICAgICAgICB2PXAtPnoudjsKKyAgICAgICAgaT12LT5pbmRleDsKKyAgICAgICAgLyogIEhpbGZzdmFyaWFibGUsIGRpZSB3YWVocmVuZCBkaWVzZW0gY3NlLUR1cmNobGF1ZiBlaW5nZWZ1ZWhydCAgICAqLworICAgICAgICAvKiAgd3VyZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGlmKGk8MCkgcmV0dXJuOworCWlmKGk+PXZjb3VudCkgaWVycm9yKDApOworICAgICAgICBpZihwLT56LmZsYWdzJkRSRUZPQkopeworCSAgaWYoaT49cmNvdW50KSBpZXJyb3IoMCk7CisJICBhbGlhc19wcm9wYWdhdGUocmVzdWx0LGkrdmNvdW50LXJjb3VudCx0LDEpOworCX1lbHNleworCSAgYWxpYXNfcHJvcGFnYXRlKHJlc3VsdCxpLHQsMSk7CisJICBpZihpPHJjb3VudCkgQlNFVChyZXN1bHQsaSt2Y291bnQtcmNvdW50KTsKKwl9CisgICAgfQorICAgIGlmKHAtPmNvZGU9PUNBTEwpeworICAgICAgZnVuY3Rpb25faW5mbyAqZmk7CisgICAgICBpZigocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmKGZpPXAtPnExLnYtPmZpKSYmKGZpLT5mbGFncyZBTExfTU9EUykmJiEoZGlzYWJsZSY2NTUzNikpeworCS8qICB3ZSBjYW4gZ2V0IHRoZSBzZXQgZnJvbSB0aGUgZnVuY3Rpb25faW5mbyAqLworCWZvcihpPTA7aTxmaS0+Y2hhbmdlX2NudDtpKyspeworCSAgaWYodj1maS0+Y2hhbmdlX2xpc3RbaV0udil7CisJICAgIGlmKHYtPmlucj09aW5yJiZ2LT5pbmRleD49MCl7CisJICAgICAgaWYodi0+aW5kZXg+PXZjb3VudCkgaWVycm9yKDApOworCSAgICAgIGFsaWFzX3Byb3BhZ2F0ZShyZXN1bHQsdi0+aW5kZXgsdi0+dnR5cC0+ZmxhZ3MmTlEsMSk7CisJICAgIH1lbHNlCisJICAgICAgcHJvcGFnYXRlX3BvaW50ZXJzKHJlc3VsdCx2LHYtPnZ0eXAtPmZsYWdzJk5RLC0xKTsKKwkgIH1lbHNleworCSAgICBmb3Ioaj0wO2o8dmNvdW50LXJjb3VudDtqKyspeworCSAgICAgIHY9dmlsaXN0W2pdOworCSAgICAgIGlmKHYtPm5lc3Rpbmc9PTB8fHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTnx8KHYtPmZsYWdzJlVTRURBU0FEUikpeworCQl0PXYtPnZ0eXAtPmZsYWdzJk5ROworCQlpZih0PT0oZmktPmNoYW5nZV9saXN0W2ldLmZsYWdzJk5RKXx8IUlTU0NBTEFSKHQpKXsKKwkJICBCU0VUKHJlc3VsdCxqKTsKKwkJICBpZihqPHJjb3VudCkgQlNFVChyZXN1bHQsait2Y291bnQtcmNvdW50KTsKKwkJfQorCSAgICAgIH0KKwkgICAgICBpZihqPHJjb3VudCl7CisJCXQ9cF90eXAodmlsaXN0W2pdKTsKKwkJaWYodD09Q0hBUnx8IUlTU0NBTEFSKHQpfHx0PT1maS0+Y2hhbmdlX2xpc3RbaV0uZmxhZ3MpCisJCSAgQlNFVChyZXN1bHQsait2Y291bnQtcmNvdW50KTsKKwkgICAgICB9CisJICAgIH0KKwkgIH0KKwl9CisgICAgICB9ZWxzZXsKKwlidnVuaXRlKHJlc3VsdCxhdl9kcmVmcyx2c2l6ZSk7CisJYnZ1bml0ZShyZXN1bHQsYXZfYWRkcmVzcyx2c2l6ZSk7CisJYnZ1bml0ZShyZXN1bHQsYXZfZ2xvYmFscyx2c2l6ZSk7CisJYnZ1bml0ZShyZXN1bHQsYXZfc3RhdGljcyx2c2l6ZSk7CisgICAgICB9CisgICAgfQorICAgIGlmKChwLT56LmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PShLT05TVHxEUkVGT0JKKSl7CisgICAgICBidnVuaXRlKHJlc3VsdCxhdl9kcmVmcyx2c2l6ZSk7CisgICAgfQorfQordm9pZCBpY191c2VzKElDICpwLGJ2dHlwZSAqcmVzdWx0KQorLyogIEluaXRpYWxpc2llcnQgZGVuIEJpdHZla3RvciByZXN1bHQgbWl0IGFsbGVuIFZhcmlhYmxlbiwgZGllIGR1cmNoIGRhcyAgICovCisvKiAgSUMgcCBiZW51dHp0IHdlcmRlbiBrb2VubnRlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgICBpbnQgaSxqLHQsdDIsYztWYXIgKnY7dHlwZSAqdHA7CisgICAgbWVtc2V0KHJlc3VsdCwwLHZzaXplKTsKKyAgICBjPXAtPmNvZGU7CisgICAgaWYoYyE9QUREUkVTUyl7CisgICAgICAgIGlmKChwLT5xMS5mbGFncyYoVkFSfFZBUkFEUikpPT1WQVImJmMhPUFERFJFU1MmJihjIT1DQUxMfHwocC0+cTEuZmxhZ3MmRFJFRk9CSikpKXsKKyAgICAgICAgICAgIHY9cC0+cTEudjsKKyAgICAgICAgICAgIGk9di0+aW5kZXg7CisJICAgIGlmKGk8MHx8aT49dmNvdW50KSBpZXJyb3IoMCk7CisJICAgIHQ9cTF0eXAocCk7CisJICAgIGlmKHAtPnExLmZsYWdzJkRSRUZPQkopeworCSAgICAgIGlmKGk+PXJjb3VudCkgaWVycm9yKDApOworCSAgICAgIGFsaWFzX3Byb3BhZ2F0ZShyZXN1bHQsaSt2Y291bnQtcmNvdW50LHQsMCk7CisJICAgIH0KKwkgICAgYWxpYXNfcHJvcGFnYXRlKHJlc3VsdCxpLHQsMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYoKHAtPnEyLmZsYWdzJihWQVJ8VkFSQURSKSk9PVZBUil7CisgICAgICAgICAgICB2PXAtPnEyLnY7CisgICAgICAgICAgICBpPXYtPmluZGV4OworCSAgICBpZihpPDB8fGk+PXZjb3VudCkgaWVycm9yKDApOworCSAgICB0PXEydHlwKHApOworCSAgICBpZihwLT5xMi5mbGFncyZEUkVGT0JKKXsKKwkgICAgICBpZihpPj1yY291bnQpIGllcnJvcigwKTsKKwkgICAgICBhbGlhc19wcm9wYWdhdGUocmVzdWx0LGkrdmNvdW50LXJjb3VudCx0LDApOworCSAgICB9CisJICAgIGFsaWFzX3Byb3BhZ2F0ZShyZXN1bHQsaSx0LDApOworICAgICAgICB9CisgICAgfQorICAgIGlmKChwLT56LmZsYWdzJihWQVJ8VkFSQURSfERSRUZPQkopKT09KFZBUnxEUkVGT0JKKSl7CisgICAgICAgIHY9cC0+ei52OworICAgICAgICBpPXYtPmluZGV4OworICAgICAgICBpZihpPj12Y291bnQpIHtwcmljMihzdGRvdXQscCk7aWVycm9yKDApO30KKwl0PSh6dHlwKHApJk5RKTsKKwlhbGlhc19wcm9wYWdhdGUocmVzdWx0LGksdCwwKTsKKyAgICB9CisgICAgaWYocC0+Y29kZT09Q0FMTCl7CisgICAgICBmdW5jdGlvbl9pbmZvICpmaTsKKyAgICAgIGlmKChwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiYoZmk9cC0+cTEudi0+ZmkpJiYoZmktPmZsYWdzJkFMTF9VU0VTKSYmIShkaXNhYmxlJjY1NTM2KSl7CisJLyogIHdlIGNhbiBnZXQgdGhlIHNldCBmcm9tIHRoZSBmdW5jdGlvbl9pbmZvICovCisJZm9yKGk9MDtpPGZpLT51c2VfY250O2krKyl7CisJICBpZih2PWZpLT51c2VfbGlzdFtpXS52KXsKKwkgICAgaWYodi0+aW5yPT1pbnImJnYtPmluZGV4Pj0wKQorCSAgICAgIGFsaWFzX3Byb3BhZ2F0ZShyZXN1bHQsdi0+aW5kZXgsdi0+dnR5cC0+ZmxhZ3MmTlEsMCk7CisJICAgIGVsc2UKKwkgICAgICBwcm9wYWdhdGVfcG9pbnRlcnMocmVzdWx0LHYsdi0+dnR5cC0+ZmxhZ3MmTlEsLTEpOworCSAgfWVsc2V7CisJICAgIGZvcihqPTA7ajx2Y291bnQtcmNvdW50O2orKyl7CisJICAgICAgdj12aWxpc3Rbal07CisJICAgICAgaWYodi0+bmVzdGluZz09MHx8di0+c3RvcmFnZV9jbGFzcz09RVhURVJOfHwodi0+ZmxhZ3MmVVNFREFTQURSKSl7CisJCXQ9di0+dnR5cC0+ZmxhZ3MmTlE7CisJCWlmKHQ9PShmaS0+dXNlX2xpc3RbaV0uZmxhZ3MmTlEpfHwhSVNTQ0FMQVIodCkpCisJCSAgQlNFVChyZXN1bHQsaik7CisJICAgICAgfQorCSAgICAgIGlmKGo8cmNvdW50KXsKKwkJdD1wX3R5cCh2aWxpc3Rbal0pOworCQlpZih0PT1DSEFSfHwhSVNTQ0FMQVIodCl8fHQ9PWZpLT51c2VfbGlzdFtpXS5mbGFncykKKwkJICBCU0VUKHJlc3VsdCxqK3Zjb3VudC1yY291bnQpOworCSAgICAgIH0KKwkgICAgfQorCSAgfQorCX0KKyAgICAgIH1lbHNleworCWJ2dW5pdGUocmVzdWx0LGF2X2RyZWZzLHZzaXplKTsKKwlidnVuaXRlKHJlc3VsdCxhdl9hZGRyZXNzLHZzaXplKTsKKwlidnVuaXRlKHJlc3VsdCxhdl9nbG9iYWxzLHZzaXplKTsKKwlidnVuaXRlKHJlc3VsdCxhdl9zdGF0aWNzLHZzaXplKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoKHAtPnExLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PShLT05TVHxEUkVGT0JKKSl7CisgICAgICBidnVuaXRlKHJlc3VsdCxhdl9kcmVmcyx2c2l6ZSk7CisgICAgfQorICAgIGlmKChwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT0oS09OU1R8RFJFRk9CSikpeworICAgICAgYnZ1bml0ZShyZXN1bHQsYXZfZHJlZnMsdnNpemUpOworICAgIH0KK30KK3ZvaWQgZnJlZV9hbGlhcyhmbG93Z3JhcGggKmZnKQorLyogIEdpYnQgYWxsZSB1c2UvY2hhbmdlLUxpc3RlbiBkZXIgSUNzIGltIEZsdXNzZ3JhcGhlbiBmcmVpLiAgICAgICAgICAgICAgICovCit7CisgICAgSUMgKnA7Zmxvd2dyYXBoICpnOworICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiZnJlZWluZyBhbGlhcyBpbmZvXG4iKTsKKyAgICBmb3IoZz1mZztnO2c9Zy0+bm9ybWFsb3V0KXsKKyAgICAgICAgZm9yKHA9Zy0+c3RhcnQ7cDtwPXAtPm5leHQpeworICAgICAgICAgICAgaWYocC0+Y29kZT09TEFCRUwmJihwLT51c2VfY250PjB8fHAtPmNoYW5nZV9jbnQ+MCkpIGllcnJvcigwKTsKKyAgICAgICAgICAgIGlmKHAtPnVzZV9jbnQ+MCkge2ZyZWUocC0+dXNlX2xpc3QpO3AtPnVzZV9jbnQ9MDt9CisgICAgICAgICAgICBpZihwLT5jaGFuZ2VfY250PjApIHtmcmVlKHAtPmNoYW5nZV9saXN0KTtwLT5jaGFuZ2VfY250PTA7fQorICAgICAgICAgICAgaWYocD09Zy0+ZW5kKSBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBoYXZlX2FsaWFzPTA7Cit9Cit2b2lkIGNyZWF0ZV9hbGlhcyhmbG93Z3JhcGggKmZnKQorLyogIEluaXRpYWxpc2llcnQgamVkZXMgSUMgbWl0IGVpbmVyIExpc3RlIGFsbGVyIFZhcmlhYmxlbiwgZGllIGRhZHVyY2ggICAgICovCisvKiAgYmVudXR6dCB1bmQgdmVyYWVuZGVydCB3ZXJkZW4ga29lbm50ZW4uIFouWi4gd2lyZCBiaXMgYXVmIFR5cC1iYXNpZXJ0ZSAgKi8KKy8qICBPcHRpbWllcnVuZ2VuIGRlciB3b3JzdC1jYXNlIGFuZ2Vub21tZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBidnR5cGUgKnZhcnM9bXltYWxsb2ModnNpemUpOworICBJQyAqcDtmbG93Z3JhcGggKmc7CisgIGZsb3dsaXN0ICppbjsKKyAgYnZ0eXBlICoqcHB0OworICBpbnQgaSxjbnQsYWxsX3ByZWRzLGNoYW5nZWQ7CisgIHVuc2lnbmVkIGxvbmcgaGVhcHNpemU7CisgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiY3JlYXRpbmcgYWxpYXMgaW5mb1xuIik7CisKKyAgcHRzaXplPTA7CisgIAorICBjaGFuZ2VkPTE7CisgIHdoaWxlKGNoYW5nZWQpeworICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiY3JlYXRlX2FsaWFzIHBhc3NcbiIpOworICAgIGNoYW5nZWQ9MDsKKyAgICBpZihoYXZlX2FsaWFzKQorICAgICAgZnJlZV9hbGlhcyhmZyk7CisgICAgaGVhcHNpemU9MDsKKyAgICBmb3IoZz1mZztnO2c9Zy0+bm9ybWFsb3V0KXsKKyAgICAgIGlmKChvcHRmbGFncyYxMDI0KSYmIW5vYWxpYXNvcHQpeworCS8qIGRvIGFsbCBwcmVkZWNlc3NvcnMgYWxyZWFkeSBoYXZlIHBvaW50cy10by1pbmZvPyAqLworCWFsbF9wcmVkcz0xOworCWZvcihpbj1nLT5pbjtpbjtpbj1pbi0+bmV4dCl7CisJICBpZighaW4tPmdyYXBoLT5wdCl7CisJICAgIGFsbF9wcmVkcz0wOworCSAgICBicmVhazsKKwkgIH0KKwl9CisJaWYoLyphbGxfcHJlZHMmJiovZy0+aW4peworCSAgLyogY2FsYyB1bmlvbiBvZiBhbGwgcHJlZGVjZXNzb3JzICovCisJICBncHQ9Y2xvbmVfcHQoZy0+aW4tPmdyYXBoLT5wdCk7CisJICBmb3IoaW49Zy0+aW4tPm5leHQ7aW47aW49aW4tPm5leHQpeworCSAgICBwcHQ9aW4tPmdyYXBoLT5wdDsKKwkgICAgaWYoIXBwdCkKKwkgICAgICBjb250aW51ZTsKKwkgICAgZm9yKGk9MDtpPHZjb3VudDtpKyspeworCSAgICAgIGlmKGdwdFtpXSl7CisJCWlmKCFwcHRbaV0pCisJCSAgdW5kZWZfcHQoZ3B0LGkpOworCQllbHNlCisJCSAgYnZ1bml0ZShncHRbaV0scHB0W2ldLHZzaXplKTsKKwkgICAgICB9CisJICAgIH0KKwkgIH0KKwl9ZWxzZQorCSAgZ3B0PW5ld19wdCgpOyAgICAgICAgICAgICAgICAgCisgICAgICB9ZWxzZXsKKwlncHQ9MDsKKyAgICAgIH0KKyAgICAgIGZvcihwPWctPnN0YXJ0O3A7cD1wLT5uZXh0KXsKKwlpbnQgZGE7IC8qIGFsd2F5cyBjb25zaWRlciBhIGRpcmVjdCB3cml0ZSwgZXZlbiBpZiB2YXJpYWJsZSBpcyBjb25zdC1xdWFsaWZpZWQgKi8KKwlpY191c2VzKHAsdmFycyk7CisJZm9yKGk9MCxjbnQ9MDtpPHZjb3VudDtpKyspCisJICBpZihCVFNUKHZhcnMsaSkpIGNudCsrOworCXAtPnVzZV9jbnQ9Y250OworCWlmKGNudD09MCl7CisJICBwLT51c2VfbGlzdD0wOworCX1lbHNleworCSAgcC0+dXNlX2xpc3Q9bXltYWxsb2MoY250KlZMUyk7CisJICBoZWFwc2l6ZSs9Y250KlZMUzsKKwkgIGZvcihjbnQ9MCxpPTA7aTx2Y291bnQ7aSsrKXsKKwkgICAgaWYoQlRTVCh2YXJzLGkpKXsKKwkgICAgICBwLT51c2VfbGlzdFtjbnRdLnY9dmlsaXN0W2ldOworCSAgICAgIGlmKGk+PXZjb3VudC1yY291bnQpIHAtPnVzZV9saXN0W2NudF0uZmxhZ3M9RFJFRk9CSjsKKwkgICAgICBlbHNlICAgICAgICAgcC0+dXNlX2xpc3RbY250XS5mbGFncz0wOworCSAgICAgIGNudCsrOworCSAgICB9CisJICB9CisJfQorCWljX2NoYW5nZXMocCx2YXJzKTsKKwlpZigocC0+ei5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSKQorCSAgZGE9cC0+ei52LT5pbmRleDsKKwllbHNlCisJICBkYT0wOworCWZvcihpPTAsY250PTA7aTx2Y291bnQ7aSsrKQorCSAgaWYoQlRTVCh2YXJzLGkpJiYoaT49dmNvdW50LXJjb3VudHx8aT09ZGF8fCFpc19jb25zdCh2aWxpc3RbaV0tPnZ0eXApKSkgY250Kys7CisJcC0+Y2hhbmdlX2NudD1jbnQ7CisJaWYoY250PT0wKXsKKwkgIHAtPmNoYW5nZV9saXN0PTA7CisJfWVsc2V7CisJICBwLT5jaGFuZ2VfbGlzdD1teW1hbGxvYyhjbnQqVkxTKTsKKwkgIGhlYXBzaXplKz1jbnQqVkxTOworCSAgZm9yKGNudD0wLGk9MDtpPHZjb3VudDtpKyspeworCSAgICBpZihCVFNUKHZhcnMsaSkmJihpPj12Y291bnQtcmNvdW50fHxpPT1kYXx8IWlzX2NvbnN0KHZpbGlzdFtpXS0+dnR5cCkpKXsKKwkgICAgICBwLT5jaGFuZ2VfbGlzdFtjbnRdLnY9dmlsaXN0W2ldOworCSAgICAgIGlmKGk+PXZjb3VudC1yY291bnQpIHAtPmNoYW5nZV9saXN0W2NudF0uZmxhZ3M9RFJFRk9CSjsKKwkgICAgICBlbHNlICAgICAgICAgcC0+Y2hhbmdlX2xpc3RbY250XS5mbGFncz0wOworCSAgICAgIGNudCsrOworCSAgICB9CisJICB9CisJfQorCisJaWYocC0+Y29kZT09Q0FMTCl7CisJICBpZigocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PShWQVJ8RFJFRk9CSikpeworCSAgICBpbnQgaT1wLT5xMS52LT5pbmRleDsKKwkgICAgaWYoaTwwfHxpPj12Y291bnQpIGllcnJvcigwKTsKKwkgICAgaWYoZ3B0JiZncHRbaV0peworCSAgICAgIGludCBqLGNudDsKKwkgICAgICBmb3IoY250PTAsaj0wO2o8dmNvdW50LXJjb3VudDtqKyspeworCQlpZihCVFNUKGdwdFtpXSxqKSYmSVNGVU5DKHZpbGlzdFtqXS0+dnR5cC0+ZmxhZ3MpKQorCQkgIGNudCsrOworCSAgICAgIH0KKwkgICAgICBpZihjbnQpeworCQlpZihwLT5jYWxsX2NudCkgZnJlZShwLT5jYWxsX2xpc3QpOworCQlwLT5jYWxsX2NudD1jbnQ7CisJCXAtPmNhbGxfbGlzdD1teW1hbGxvYyhzaXplb2YoKnAtPmNhbGxfbGlzdCkqY250KTsKKwkJZm9yKGNudD0wLGo9MDtqPHZjb3VudC1yY291bnQ7aisrKXsKKwkJICBpZihCVFNUKGdwdFtpXSxqKSYmSVNGVU5DKHZpbGlzdFtqXS0+dnR5cC0+ZmxhZ3MpKXsKKwkJICAgIHAtPmNhbGxfbGlzdFtjbnRdLnY9dmlsaXN0W2pdOworCQkgICAgcC0+Y2FsbF9saXN0W2NudF0uZmxhZ3M9MDsKKwkJICAgIGNudCsrOworCQkgIH0KKwkJfQorCQlpZihjbnQ9PTEmJmFsbF9wcmVkcyl7CisJCSAgaWYoREVCVUcmMTAyNCkge3ByaW50ZigicmVwbGFjaW5nIGluZGlyZWN0IGNhbGwgYnkgc2luZ2xlIHRhcmdldDpcbiIpO3ByaWMyKHN0ZG91dCxwKTt9CisJCSAgcC0+cTEuZmxhZ3M9VkFSOworCQkgIHAtPnExLnZhbC52bWF4PWwyem0oMEwpOworCQkgIHAtPnExLnY9cC0+Y2FsbF9saXN0WzBdLnY7CisJCX0KKwkgICAgICB9CisJICAgIH0KKwkgIH0JICAKKwl9CisKKwlpZigob3B0ZmxhZ3MmMTAyNCkmJiFub2FsaWFzb3B0KQorCSAgdHJhbnNfcHQoZ3B0LHApOworCWlmKHA9PWctPmVuZCkgYnJlYWs7CisgICAgICB9CisgICAgICBpZigob3B0ZmxhZ3MmMTAyNCkmJiFub2FsaWFzb3B0KXsKKwlpZighY2hhbmdlZCl7CisJICBpZighZXF1YWxfcHQoZ3B0LGctPnB0KSl7CisJICAgIGNoYW5nZWQ9MTsKKwkgICAgZnJlZV9wdChnLT5wdCk7CisJICAgIGctPnB0PWdwdDsKKwkgIH1lbHNleworCSAgICBmcmVlX3B0KGdwdCk7CisJICB9CisJfWVsc2V7CisJICBmcmVlX3B0KGctPnB0KTsKKwkgIGctPnB0PWdwdDsKKwl9ICAgICAgICAgIAorICAgICAgfSAgICAgICAgICAgCisgICAgfQorICAgIGlmKERFQlVHJjE2Mzg0KSBwcmludGYoImNyZWF0ZV9hbGlhcyBoZWFwc2l6ZT0lbHVcbiIsaGVhcHNpemUpOworICAgIGhhdmVfYWxpYXM9MTsKKyAgfQorICBpZihERUJVRyYxNjM4NCkgcHJpbnRmKCJwb2ludHMtdG8gaGVhcHNpemU9JWx1XG4iLHB0c2l6ZSk7CisgIGlmKChvcHRmbGFncyYxMDI0KSYmIW5vYWxpYXNvcHQpeworICAgIGZvcihnPWZnO2c7Zz1nLT5ub3JtYWxvdXQpeworICAgICAgZnJlZV9wdChnLT5wdCk7CisgICAgICBnLT5wdD0wOworICAgIH0KKyAgfQorICBmcmVlKHZhcnMpOworfQorI2lmIDEKK3ZvaWQgdXBkYXRlX2FsaWFzKFZhciAqb2xkLFZhciAqbmV3KQorLyogIEFlbmRlcnQgYWxsZSB1c2UvY2hhbmdlcyB2b24gKG9sZCkgYXVmIChuZXcpLiBXaXJkIGF1ZmdlcnVmZW4sIHdlbm4gICAgICovCisvKiAgY29weS1wcm9wYWdhdGlvbiBlaW5lIFZhcmlhYmxlIG5ldSB6dSBlaW5lbSBEUkVGT0JKIG1hY2h0LiAgICAgICAgICAgICAgKi8KK3sKKyAgICBJQyAqcDtpbnQgaTsKKyAgICBpZihERUJVRyYxMDI0KSBwcmludGYoInVwZGF0ZS1hbGlhc1xuIik7CisgICAgZm9yKHA9Zmlyc3RfaWM7cDtwPXAtPm5leHQpeworICAgICAgICBmb3IoaT0wO2k8cC0+dXNlX2NudDtpKyspeworICAgICAgICAgICAgaWYocC0+dXNlX2xpc3RbaV0udj09b2xkJiYocC0+dXNlX2xpc3RbaV0uZmxhZ3MmRFJFRk9CSikpeworICAgICAgICAgICAgICAgIHAtPnVzZV9jbnQrKzsKKyAgICAgICAgICAgICAgICBwLT51c2VfbGlzdD1teXJlYWxsb2MocC0+dXNlX2xpc3QscC0+dXNlX2NudCpWTFMpOworICAgICAgICAgICAgICAgIHAtPnVzZV9saXN0W3AtPnVzZV9jbnQtMV0udj1uZXc7CisgICAgICAgICAgICAgICAgcC0+dXNlX2xpc3RbcC0+dXNlX2NudC0xXS5mbGFncz1EUkVGT0JKOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvcihpPTA7aTxwLT5jaGFuZ2VfY250O2krKyl7CisJICBpZihwLT5jaGFuZ2VfbGlzdFtpXS52PT1uZXd8fChwLT5jaGFuZ2VfbGlzdFtpXS52PT1vbGQmJihwLT5jaGFuZ2VfbGlzdFtpXS5mbGFncyZEUkVGT0JKKSkpeworICAgICAgICAgICAgICAgIHAtPmNoYW5nZV9jbnQrKzsKKyAgICAgICAgICAgICAgICBwLT5jaGFuZ2VfbGlzdD1teXJlYWxsb2MocC0+Y2hhbmdlX2xpc3QscC0+Y2hhbmdlX2NudCpWTFMpOworICAgICAgICAgICAgICAgIHAtPmNoYW5nZV9saXN0W3AtPmNoYW5nZV9jbnQtMV0udj1uZXc7CisgICAgICAgICAgICAgICAgcC0+Y2hhbmdlX2xpc3RbcC0+Y2hhbmdlX2NudC0xXS5mbGFncz1EUkVGT0JKOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hdi5jIGIvYXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjdmZWRkCi0tLSAvZGV2L251bGwKKysrIGIvYXYuYwpAQCAtMCwwICsxLDU1NyBAQAorLyogICRWRVI6IHZiY2MgKGF2LmMpICRSZXZpc2lvbjogMS45ICQgICAgKi8KKy8qICBha3RpdmUgVmFyaWFibGVuIHVuZCBFbGltaW5hdGlvbiB1bm5vZXRpZ2VyIEFud2Vpc3VuZ2VuICovCisKKyNpbmNsdWRlICJvcHQuaCIKKworc3RhdGljIGNoYXIgRklMRV9bXT1fX0ZJTEVfXzsKKworLyogIGZ1ZXIgYWt0aXZlIFZhcmlhYmxlbiAgICovCitWYXIgKip2aWxpc3Q7Cit1bnNpZ25lZCBpbnQgdmNvdW50OyAgICAvKiAgMC4udmNvdW50LXJjb3VudC0xOiB2YXJzLCB2Y291bnQtcmNvdW50Li52Y291bnQ6IERSRUZPQkpzICovCit1bnNpZ25lZCBpbnQgcmNvdW50Oworc2l6ZV90IHZzaXplOworYnZ0eXBlICphdl9nbG9iYWxzLCphdl9hZGRyZXNzLCphdl9zdGF0aWNzLCphdl9kcmVmczsKK2ludCByZXBvcnRfZGVhZF9zdGF0ZW1lbnRzOworCit2b2lkIHByaW50X2F2KGJ2dHlwZSAqYml0dmVjdG9yKQorLyogIGRydWNrdCBWYXJpYWJsZW4gaW4gZWluZW0gQml0dmVrdG9yICovCit7CisgICAgaW50IGk7CisgICAgaWYoIWJpdHZlY3Rvcikge3ByaW50ZigiYWN0aXZlIHZhcmlhYmxlcyBub3QgYXZhaWxhYmxlXG4iKTtyZXR1cm47fQorICAgIGZvcihpPTA7aTx2Y291bnQtcmNvdW50O2krKykKKyAgICAgICAgaWYoQlRTVChiaXR2ZWN0b3IsaSkpIHByaW50ZigiJTNkOiAlcywlbGRcbiIsaSx2aWxpc3RbaV0tPmlkZW50aWZpZXIsem0ybCh2aWxpc3RbaV0tPm9mZnNldCkpOworICAgIGZvcihpPXZjb3VudC1yY291bnQ7aTx2Y291bnQ7aSsrKQorICAgICAgICBpZihCVFNUKGJpdHZlY3RvcixpKSkgcHJpbnRmKCIlM2Q6ICglcyksJWxkXG4iLGksdmlsaXN0W2ldLT5pZGVudGlmaWVyLHptMmwodmlsaXN0W2ldLT5vZmZzZXQpKTsKK30KKworc3RhdGljIGludCBjbGNudDsKKworLyogd2Fsa3MgdGhyb3VnaCBhIGNsaXN0IGFuZCBudW1iZXJzIHZhcmlhYmxlcyB3aG9zZSBhZGRyZXNzZXMgYXJlCisgICBjb250YWluZWQ7IGlmIHBhc3M9PS0xLCBpbmRleCBpcyBzZXQgdG8gLTEsIGlmIHBhc3M9PTAsIGluZGV4IGlzIHNldCwKKyAgIG90aGVyd2lzZSB2aWxpc3QKKyAgIGNsY250IGlzIHVzZWQgYXMgaW5kZXgtY291bnRlciBpbiBwYXNzIDAgKi8KK3ZvaWQgbnVtX2NsaXN0X3JlZnMoaW50IHBhc3MsdHlwZSAqdCxjb25zdF9saXN0ICpjbCkKK3sKKyAgLypGSVhNRTogYmVpIEF1ZnJ1ZmVuIGF1Y2ggYXVmIGxvY2FsZSwgbmljaHQgVVNFREFTREVTVHxVU0VEQVNBRERSICovCisgIGludCBpO3ptYXggc3o7CisgIGlmKElTQVJSQVkodC0+ZmxhZ3MpKXsKKyAgICBmb3Ioc3o9bDJ6bSgwTCk7IXptbGVxKHQtPnNpemUsc3opJiZjbDtzej16bWFkZChzeixsMnptKDFMKSksY2w9Y2wtPm5leHQpeworICAgICAgaWYoIWNsLT5vdGhlcikgCisJcmV0dXJuOworICAgICAgbnVtX2NsaXN0X3JlZnMocGFzcyx0LT5uZXh0LGNsLT5vdGhlcik7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBpZihJU1VOSU9OKHQtPmZsYWdzKSl7CisgICAgbnVtX2NsaXN0X3JlZnMocGFzcywoKnQtPmV4YWN0LT5zbClbMF0uc3R5cCxjbCk7CisgICAgcmV0dXJuOworICB9CisgIGlmKElTU1RSVUNUKHQtPmZsYWdzKSYmIWNsLT50cmVlKXsKKyAgICB0eXBlICpzdDsKKyAgICBmb3IoaT0wO2k8dC0+ZXhhY3QtPmNvdW50JiZjbDtpKyspeworICAgICAgc3Q9KCp0LT5leGFjdC0+c2wpW2ldLnN0eXA7CisgICAgICBpZighKCp0LT5leGFjdC0+c2wpW2ldLmlkZW50aWZpZXIpIGllcnJvcigwKTsKKyAgICAgIGlmKCgqdC0+ZXhhY3QtPnNsKVtpXS5pZGVudGlmaWVyWzBdKXsKKyAgICAgICAgaWYoY2wtPm90aGVyKQorCSAgbnVtX2NsaXN0X3JlZnMocGFzcyxzdCxjbC0+b3RoZXIpOworICAgICAgICBjbD1jbC0+bmV4dDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGlmKGNsLT50cmVlJiYoY2wtPnRyZWUtPm8uZmxhZ3MmVkFSQURSKSl7CisgICAgVmFyICp2PWNsLT50cmVlLT5vLnY7CisgICAgaWYocGFzcz09LTEpeworICAgICAgdi0+aW5kZXg9LTE7CisgICAgfWVsc2UgaWYocGFzcz09MCl7CisgICAgICBpZih2LT5pbmRleDwwKSB7di0+aW5kZXg9Y2xjbnQrKzt2LT5pbnI9aW5yO30KKyAgICB9ZWxzZXsKKyAgICAgIGlmKHYtPmluZGV4PDB8fHYtPmluZGV4Pj12Y291bnQtcmNvdW50KQorCWllcnJvcigwKTsKKyAgICAgIHZpbGlzdFt2LT5pbmRleF09djsKKyAgICB9CisgIH0KK30KKworaW50IGlucjsKKwordm9pZCBudW1fdmFycyh2b2lkKQorLyogIE51bWVyaWVydCBWYXJpYWJsZW4gdW5kIGVyemV1Z3QgSW5kZXhsaXN0ZSAgKi8KK3sKKyAgICB1bnNpZ25lZCBpbnQgaSxqLGRvbmU7SUMgKnA7VmFyICp2LCphWzRdLCp2cDsKKyAgICB1bnNpZ25lZCBsb25nIGhlYXBzaXplPTA7CisgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJudW1lcmF0aW5nIHZhcmlhYmxlcyBsb29wMVxuIik7CisgICAgaW5yKys7CisgICAgLyogIGFsbGUgSW5kaXplcyBhdWYgLTEgKi8KKyAgICBhWzBdPXZsMDsKKyAgICBhWzFdPXZsMTsKKyAgICBhWzJdPXZsMjsKKyAgICBhWzNdPXZsMzsKKyNpZiAxCisgICAgZm9yKGo9MDtqPDQ7aisrKXsKKyAgICAgICAgdj1hW2pdOworICAgICAgICB3aGlsZSh2KXsKKyAgICAgICAgICAgIHYtPmluZGV4PS0xOworICAgICAgICAgICAgLyogIFZhcmlhYmxlbiB2b24gaW5saW5lLUZ1bmt0aW9uZW4gKi8KKyAgICAgICAgICAgIGlmKGo9PTAmJnYtPmZpJiZ2LT5maS0+Zmlyc3RfaWMpeworICAgICAgICAgICAgICAgIGZvcih2cD12LT5maS0+dmFyczt2cDt2cD12cC0+bmV4dCkgdnAtPmluZGV4PS0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdj12LT5uZXh0OworICAgICAgICB9CisgICAgfQorICAgIC8qIHZhcmlhYmxlcyB0aGF0IG1heSBiZSByZWZlcmVuY2VkIGluIGludGVyLXByb2MuIGRmbG93LWluZm8gKi8KKyAgICBmb3IocD1maXJzdF9pYztwO3A9cC0+bmV4dCl7CisgICAgICBpZihwLT5jb2RlPT1DQUxMJiYocC0+cTEuZmxhZ3MmVkFSKSYmcC0+cTEudi0+ZmkpeworCWZ1bmN0aW9uX2luZm8gKmZpPXAtPnExLnYtPmZpOworCWlmKGZpLT5mbGFncyZBTExfVVNFUyl7CisJICBmb3IoaT0wO2k8ZmktPnVzZV9jbnQ7aSsrKXsKKwkgICAgaWYodj1maS0+dXNlX2xpc3RbaV0udikgZmktPnVzZV9saXN0W2ldLnYtPmluZGV4PS0xOworCSAgfQorCX0KKwlpZihmaS0+ZmxhZ3MmQUxMX01PRFMpeworCSAgZm9yKGk9MDtpPGZpLT5jaGFuZ2VfY250O2krKyl7CisJICAgIGlmKHY9ZmktPmNoYW5nZV9saXN0W2ldLnYpIGZpLT5jaGFuZ2VfbGlzdFtpXS52LT5pbmRleD0tMTsKKwkgIH0KKwl9CisgICAgICB9CisgICAgICAvKiBjb25zdC1saXN0cyAqLworICAgICAgaWYoKHAtPnExLmZsYWdzJlZBUikpCisJaWYocC0+cTEudi0+Y2xpc3QmJmlzX2NvbnN0KHAtPnExLnYtPnZ0eXApKSBudW1fY2xpc3RfcmVmcygtMSxwLT5xMS52LT52dHlwLHAtPnExLnYtPmNsaXN0KTsKKyAgICAgIGlmKChwLT5xMi5mbGFncyZWQVIpKQorCWlmKHAtPnEyLnYtPmNsaXN0JiZpc19jb25zdChwLT5xMi52LT52dHlwKSkgbnVtX2NsaXN0X3JlZnMoLTEscC0+cTIudi0+dnR5cCxwLT5xMi52LT5jbGlzdCk7CisgICAgICBpZigocC0+ei5mbGFncyZWQVIpKQorCWlmKHAtPnoudi0+Y2xpc3QmJmlzX2NvbnN0KHAtPnoudi0+dnR5cCkpIG51bV9jbGlzdF9yZWZzKC0xLHAtPnoudi0+dnR5cCxwLT56LnYtPmNsaXN0KTsKKyAgICB9CisjZW5kaWYKKyAgICAvKiBEbyB3ZSBuZWVkIHRoaXM/ICovCisgICAgZm9yKHA9Zmlyc3RfaWM7cDtwPXAtPm5leHQpeworICAgICAgaWYocC0+cTEuZmxhZ3MmVkFSKSB7cC0+cTEudi0+aW5kZXg9LTE7cC0+cTEudi0+ZmxhZ3MmPX5VU0VEQVNBRFI7fQorICAgICAgaWYocC0+cTIuZmxhZ3MmVkFSKSB7cC0+cTIudi0+aW5kZXg9LTE7cC0+cTIudi0+ZmxhZ3MmPX5VU0VEQVNBRFI7fQorICAgICAgaWYocC0+ei5mbGFncyZWQVIpIHtwLT56LnYtPmluZGV4PS0xO3AtPnoudi0+ZmxhZ3MmPX5VU0VEQVNBRFI7fQorICAgIH0KKyAgICAvKiAgZXJzdCBhbGxlIFZhcmlhYmxlbiwgZGllIGFscyBEUkVGT0JKIGJlbnV0enQgd2VyZGVuICovCisgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJudW1lcmF0aW5nIHZhcmlhYmxlcyBsb29wMlxuIik7CisgICAgaT0wOworICAgIGRveworICAgICAgZG9uZT0xOworICAgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJwYXNzXG4iKTsKKyAgICAgIGZvcihwPWZpcnN0X2ljO3A7cD1wLT5uZXh0KXsKKyAgICAgICAgaWYocC0+Y29kZTxMQUJFTHx8cC0+Y29kZT5CUkEpeworCSAgaW50IGM9cC0+Y29kZTsKKwkgIC8qIG1hcmsgdmFyaWFibGVzIGFkIFVTRURBU0FEUiAqLworCSAgaWYoYz09QUREUkVTUykgcC0+cTEudi0+ZmxhZ3N8PVVTRURBU0FEUjsKKwkgIGlmKHAtPnExLmZsYWdzJlZBUkFEUikgcC0+cTEudi0+ZmxhZ3N8PVVTRURBU0FEUjsKKwkgIGlmKHAtPnEyLmZsYWdzJlZBUkFEUikgcC0+cTIudi0+ZmxhZ3N8PVVTRURBU0FEUjsKKwkgIGlmKHAtPnouZmxhZ3MmVkFSQURSKSBwLT56LnYtPmZsYWdzfD1VU0VEQVNBRFI7CisJICBqPShxMXR5cChwKSZOUSk7CisJICBpZigocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PShWQVJ8RFJFRk9CSikpeworCSAgICB2PXAtPnExLnY7CisJICAgIGlmKCF2LT52dHlwLT5uZXh0fHwodi0+dnR5cC0+bmV4dC0+ZmxhZ3MmTlEpIT1qKSB2LT5mbGFnc3w9RE5PVFRZUEVTQUZFOworCSAgICBpZih2LT5pbmRleDwwKSB7di0+aW5kZXg9aSsrO3YtPmlucj1pbnI7ZG9uZT0wO30KKwkgIH0KKwkgIGo9KHEydHlwKHApJk5RKTsKKwkgIGlmKChwLT5xMi5mbGFncyYoVkFSfERSRUZPQkopKT09KFZBUnxEUkVGT0JKKSl7CisJICAgIHY9cC0+cTIudjsKKwkgICAgaWYoIXYtPnZ0eXAtPm5leHR8fCh2LT52dHlwLT5uZXh0LT5mbGFncyZOUSkhPWopIHYtPmZsYWdzfD1ETk9UVFlQRVNBRkU7CisJICAgIGlmKHYtPmluZGV4PDApIHt2LT5pbmRleD1pKys7di0+aW5yPWlucjtkb25lPTA7fQorCSAgfQorCSAgaj0oenR5cChwKSZOUSk7CisJICBpZigocC0+ei5mbGFncyYoVkFSfERSRUZPQkopKT09KFZBUnxEUkVGT0JKKSl7CisJICAgIHY9cC0+ei52OworCSAgICBpZighdi0+dnR5cC0+bmV4dHx8KHYtPnZ0eXAtPm5leHQtPmZsYWdzJk5RKSE9aikgdi0+ZmxhZ3N8PUROT1RUWVBFU0FGRTsKKwkgICAgaWYodi0+aW5kZXg8MCkge3YtPmluZGV4PWkrKzt2LT5pbnI9aW5yO2RvbmU9MDt9CisJICB9CisJICAvKiBtYXJrIGNvcGllcyBmcm9tIERSRUZzIGFsc28gYXMgRFJFRnMgKG5lY2Vzc2FyeT8pIChjaGVjayB6IGZvciAhRFJFRk9CSj8pICovCisJICBpZigoYz09QVNTSUdOfHxjPT1BRERJMlB8fGM9PVNVQklGUCkmJihwLT5xMS5mbGFncyZWQVIpJiZwLT5xMS52LT5pbmRleD49MCYmKHAtPnouZmxhZ3MmVkFSKSYmcC0+ei52LT5pbmRleDwwKXsKKwkgICAgaWYoIShwLT56LmZsYWdzJlZBUikpIGllcnJvcigwKTsKKwkgICAgcC0+ei52LT5pbmRleD1pKys7cC0+ei52LT5pbnI9aW5yO2RvbmU9MDsKKwkgIH0KKwkgIC8qIG1hcmsgY29waWVzIHRvIERSRUZzIGFzIERSRUZzIChiZWNhdXNlIG9mIGNvcHktcHJvcGFnYXRpb24gKi8KKwkgIC8qIGFuZCBwb3N0LW9wIHJlb3JkZXJpbmcgKi8KKwkgIGlmKChjPT1BU1NJR058fGM9PUFEREkyUHx8Yz09U1VCSUZQKSYmKHAtPnouZmxhZ3MmVkFSKSYmcC0+ei52LT5pbmRleD49MCYmKHAtPnExLmZsYWdzJlZBUikmJnAtPnExLnYtPmluZGV4PDApeworCSAgICBwLT5xMS52LT5pbmRleD1pKys7cC0+cTEudi0+aW5yPWlucjtkb25lPTA7CisJICB9CSAgCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9d2hpbGUoIWRvbmUpOworICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigibnVtZXJhdGluZyB2YXJpYWJsZXMgbG9vcDNcbiIpOworICAgIHJjb3VudD1pOyAgICAvKiAgQW56YWhsIGRlciBEUkVGT0JKLVZhcmlhYmxlbiAgICAqLworICAgIC8qICBqZXR6dCBkZW4gUmVzdCAgKi8KKyAgICBmb3IocD1maXJzdF9pYztwO3A9cC0+bmV4dCl7CisgICAgICAgIGludCBjPXAtPmNvZGU7CisgICAgICAgIGlmKDEvKnAtPmNvZGU8TEFCRUx8fHAtPmNvZGU+QlJBKi8peworICAgICAgICAgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVIpeworCSAgICAgIGo9KHExdHlwKHApJk5RKTsKKwkgICAgICB2PXAtPnExLnY7CisJICAgICAgaWYoKHYtPnZ0eXAtPmZsYWdzJk5RKSE9aikgdi0+ZmxhZ3N8PU5PVFRZUEVTQUZFOworCSAgICAgIGlmKHYtPmluZGV4PDApIHt2LT5pbmRleD1pKys7di0+aW5yPWlucjt9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZigocC0+cTIuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUil7CisJICAgICAgaj0ocTJ0eXAocCkmTlEpOworCSAgICAgIHY9cC0+cTIudjsKKwkgICAgICBpZigodi0+dnR5cC0+ZmxhZ3MmTlEpIT1qKSB2LT5mbGFnc3w9Tk9UVFlQRVNBRkU7CisJICAgICAgaWYodi0+aW5kZXg8MCkge3YtPmluZGV4PWkrKzt2LT5pbnI9aW5yO30KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKChwLT56LmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVIpeworCSAgICAgIGo9KHp0eXAocCkmTlEpOworCSAgICAgIHY9cC0+ei52OworCSAgICAgIGlmKCh2LT52dHlwLT5mbGFncyZOUSkhPWopIHYtPmZsYWdzfD1OT1RUWVBFU0FGRTsKKwkgICAgICBpZih2LT5pbmRleDwwKSB7di0+aW5kZXg9aSsrO3YtPmlucj1pbnI7fQorICAgICAgICAgICAgfQorICAgICAgICB9CisJLyogY29uc3QtbGlzdHMgKi8KKwlpZigocC0+cTEuZmxhZ3MmVkFSKSkKKwkgIGlmKHAtPnExLnYtPmNsaXN0JiZpc19jb25zdChwLT5xMS52LT52dHlwKSkge2NsY250PWk7bnVtX2NsaXN0X3JlZnMoMCxwLT5xMS52LT52dHlwLHAtPnExLnYtPmNsaXN0KTtpPWNsY250O30KKwlpZigocC0+cTIuZmxhZ3MmVkFSKSkKKwkgIGlmKHAtPnEyLnYtPmNsaXN0JiZpc19jb25zdChwLT5xMi52LT52dHlwKSkge2NsY250PWk7bnVtX2NsaXN0X3JlZnMoMCxwLT5xMi52LT52dHlwLHAtPnEyLnYtPmNsaXN0KTtpPWNsY250O30KKwlpZigocC0+ei5mbGFncyZWQVIpKQorCSAgaWYocC0+ei52LT5jbGlzdCYmaXNfY29uc3QocC0+ei52LT52dHlwKSkge2NsY250PWk7bnVtX2NsaXN0X3JlZnMoMCxwLT56LnYtPnZ0eXAscC0+ei52LT5jbGlzdCk7aT1jbGNudDt9CisgICAgfQorICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigibnVtZXJhdGluZyB2YXJpYWJsZXMgbG9vcDRcbiIpOworICAgIHZjb3VudD1pK3Jjb3VudDsgLyogIGFsbGUgYmVudXR6dGVuIFZhcmlhYmxlbitBbnphaGwgZGVyIERSRUZPQkpzICAgICovCisgICAgdmlsaXN0PW15bWFsbG9jKHZjb3VudCpzaXplb2YoVmFyICopKTsKKyAgICBoZWFwc2l6ZSs9dmNvdW50KnNpemVvZihWYXIgKik7CisjaWYgMAorICAgIGZvcihqPTA7ajw0O2orKyl7CisgICAgICAgIGludCBpOworICAgICAgICB2PWFbal07CisgICAgICAgIHdoaWxlKHYpeworICAgICAgICAgICAgaT12LT5pbmRleDsKKy8qICAgICAgICAgICAgcHJpbnRmKCIlcyBoYXMgaW5kZXggJWRcbiIsdi0+aWRlbnRpZmllcixpKTsqLworICAgICAgICAgICAgaWYoaT49MCl7CisgICAgICAgICAgICAgICAgaWYoaT49dmNvdW50LXJjb3VudCkgaWVycm9yKDApOworICAgICAgICAgICAgICAgIHZpbGlzdFtpXT12OworICAgICAgICAgICAgICAgIGlmKGk8cmNvdW50KSB2aWxpc3RbaSt2Y291bnQtcmNvdW50XT12OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogIFZhcmlhYmxlbiB2b24gaW5saW5lLUZ1bmt0aW9uZW4gKi8KKyAgICAgICAgICAgIGlmKGo9PTAmJnYtPmZpJiZ2LT5maS0+Zmlyc3RfaWMpeworICAgICAgICAgICAgICAgIGZvcih2cD12LT5maS0+dmFyczt2cDt2cD12cC0+bmV4dCl7CisgICAgICAgICAgICAgICAgICAgIGk9dnAtPmluZGV4OworICAgICAgICAgICAgICAgICAgICBpZihpPj0wKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGk+PXZjb3VudC1yY291bnQpIGllcnJvcigwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpbGlzdFtpXT12cDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGk8cmNvdW50KSB2aWxpc3RbaSt2Y291bnQtcmNvdW50XT12cDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHY9di0+bmV4dDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZm9yKHA9Zmlyc3RfaWM7cDtwPXAtPm5leHQpeworICAgICAgVmFyICp2OworICAgICAgaWYocC0+cTEuZmxhZ3MmVkFSKXsKKwlpPXAtPnExLnYtPmluZGV4OworCXZpbGlzdFtpXT12PXAtPnExLnY7CisJaWYodi0+Y2xpc3QmJmlzX2NvbnN0KHYtPnZ0eXApKSBudW1fY2xpc3RfcmVmcygxLHYtPnZ0eXAsdi0+Y2xpc3QpOworICAgICAgfQorICAgICAgaWYocC0+cTIuZmxhZ3MmVkFSKXsKKwlpPXAtPnEyLnYtPmluZGV4OworCXZpbGlzdFtpXT12PXAtPnEyLnY7CisJaWYodi0+Y2xpc3QmJmlzX2NvbnN0KHYtPnZ0eXApKSBudW1fY2xpc3RfcmVmcygxLHYtPnZ0eXAsdi0+Y2xpc3QpOworCisgICAgICB9CisgICAgICBpZihwLT56LmZsYWdzJlZBUil7CisJaT1wLT56LnYtPmluZGV4OworCXZpbGlzdFtpXT12PXAtPnoudjsKKwlpZih2LT5jbGlzdCYmaXNfY29uc3Qodi0+dnR5cCkpIG51bV9jbGlzdF9yZWZzKDEsdi0+dnR5cCx2LT5jbGlzdCk7CisgICAgICB9CisgICAgfQorICAgIGZvcihpPTA7aTxyY291bnQ7aSsrKQorICAgICAgdmlsaXN0W2krdmNvdW50LXJjb3VudF09dmlsaXN0W2ldOworCisgICAgLyp2c2l6ZT0odmNvdW50K0NIQVJfQklULTEpL0NIQVJfQklUOyovCisgICAgdnNpemU9QlZTSVpFKHZjb3VudCk7CisgICAgaWYoREVCVUcmKDE2Mzg0fDEwMjQpKSBwcmludGYoIiVsdSB2YXJpYWJsZXMgKCVsdSBEUkVGT0JKcyksIHZzaXplPSVsdVxuIiwodW5zaWduZWQgbG9uZyl2Y291bnQsKHVuc2lnbmVkIGxvbmcpcmNvdW50LCh1bnNpZ25lZCBsb25nKXZzaXplKTsKKworICAgIGF2X2RyZWZzPW15bWFsbG9jKHZzaXplKTsKKyAgICBtZW1zZXQoYXZfZHJlZnMsMCx2c2l6ZSk7CisgICAgLyogIGFsbGUgRFJFRk9CSnMgICAqLworICAgIGZvcihpPXZjb3VudC1yY291bnQ7aTx2Y291bnQ7aSsrKSBCU0VUKGF2X2RyZWZzLGkpOworCisgICAgLyogIGF2X2dsb2JhbHMgZW50aGFlbHQgYWxsZSBnbG9iYWxlbiBWYXJpYWJsZW4gdW5kIGF2X2FkZHJlc3MgICAgICAqLworICAgIC8qICB6dXNhZXR6bGljaCBub2NoIGFsbGUgVmFyaWFibGVuLCBkZXJlbiBBZHJlc3NlbiBnZW5vbW1lbiB3dXJkZW4gKi8KKyAgICBhdl9nbG9iYWxzPW15bWFsbG9jKHZzaXplKTsKKyAgICBtZW1zZXQoYXZfZ2xvYmFscywwLHZzaXplKTsKKyAgICBhdl9zdGF0aWNzPW15bWFsbG9jKHZzaXplKTsKKyAgICBtZW1zZXQoYXZfc3RhdGljcywwLHZzaXplKTsKKyAgICBhdl9hZGRyZXNzPW15bWFsbG9jKHZzaXplKTsKKyAgICBtZW1jcHkoYXZfYWRkcmVzcyxhdl9nbG9iYWxzLHZzaXplKTsKKyAgICBoZWFwc2l6ZSs9NCp2c2l6ZTsKKyAgICBmb3IoaT0wO2k8dmNvdW50LXJjb3VudDtpKyspeworICAgICAgICBpZih2aWxpc3RbaV0tPm5lc3Rpbmc9PTB8fHZpbGlzdFtpXS0+c3RvcmFnZV9jbGFzcz09RVhURVJOKSBCU0VUKGF2X2dsb2JhbHMsaSk7CisgICAgICAgIGlmKHZpbGlzdFtpXS0+ZmxhZ3MmVVNFREFTQURSKSBCU0VUKGF2X2FkZHJlc3MsaSk7CisgICAgICAgIGlmKHZpbGlzdFtpXS0+c3RvcmFnZV9jbGFzcz09U1RBVElDKSBCU0VUKGF2X3N0YXRpY3MsaSk7CisgICAgICAgIGlmKGk8cmNvdW50KXsKKy8qICAgICAgICAgICAgaWYoIUlTUE9JTlRFUih2aWxpc3RbaV0tPnZ0eXAtPmZsYWdzKSl7IHByaW50ZigiJXMoJWxkKVxuIix2aWxpc3RbaV0tPmlkZW50aWZpZXIsem0ybCh2aWxpc3RbaV0tPm9mZnNldCkpO2llcnJvcigwKTt9Ki8KKyAgICAgICAgICAgIEJTRVQoYXZfYWRkcmVzcyxpK3Zjb3VudC1yY291bnQpOworICAgICAgICAgICAgQlNFVChhdl9nbG9iYWxzLGkrdmNvdW50LXJjb3VudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoREVCVUcmMTYzODQpIHByaW50ZigibnVtX3ZhcnMgaGVhcHNpemU9JWx1XG4iLGhlYXBzaXplKTsKK30KK3ZvaWQgcHJpbnRfdmkodm9pZCkKKy8qICBEcnVja3QgdmlsaXN0IHVuZCB0ZXN0ZXQgS29uc2lzdGVueiAqLworeworICAgIGludCBpOworICAgIHByaW50ZigiXG5wcmludF92aSgpXG4iKTsKKyAgICBmb3IoaT0wO2k8dmNvdW50O2krKyl7CisgICAgICAgIGlmKCF2aWxpc3RbaV18fChpPHJjb3VudCYmdmlsaXN0W2ldLT5pbmRleCE9aSkpIGllcnJvcigwKTsKKyAgICAgICAgcHJpbnRmKCIlM2Q6ICVzXG4iLGksdmlsaXN0W2ldLT5pZGVudGlmaWVyKTsKKyAgICB9Cit9Cit2b2lkIGF2X2NoYW5nZShJQyAqcCxidnR5cGUgKnVzZSxidnR5cGUgKmRlZikKKy8qICBCZXJlY2huZXQgZGllIEFlbmRlcnVuZ2VuLCBkaWUgc2ljaCBkdXJjaCBJQyBwIGFuIHVzZSB1bmQgZGVmIGVyZ2ViZW4uICAqLworeworICAgIGludCBpLGosbj0tMTsKKyAgICBpbnQgZzEsZzI7CisKKyAgICAvKiAgV2VubiBlaW5lIFF1ZWxsZT09WmllbCwgZGFubiB3aXJkIGRhZHVyY2gga2VpbiBuZXVlciB1c2UgZXJ6ZXVndCwgICAqLworICAgIC8qICB1bSB6LkIuIHVuYmVudXR6dGUgSW5kdWt0aW9uc3ZhcmlhYmxlbiBpbiBTY2hsZWlmZW4genUgZWxpbWluaWVyZW4uICovCisgICAgZzE9Y29tcGFyZV9vYmpzKCZwLT5xMSwmcC0+eixwLT50eXBmKTsKKyAgICBnMj1jb21wYXJlX29ianMoJnAtPnEyLCZwLT56LHAtPnR5cGYpOworICAgIGlmKCFnMSYmKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVIpIG49cC0+cTEudi0+aW5kZXg7CisgICAgaWYoIWcyJiYocC0+cTIuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUikgbj1wLT5xMi52LT5pbmRleDsKKworICAgIGZvcihqPTA7ajxwLT51c2VfY250O2orKyl7CisgICAgICAgIGk9cC0+dXNlX2xpc3Rbal0udi0+aW5kZXg7CisgICAgICAgIGlmKHAtPnVzZV9saXN0W2pdLmZsYWdzJkRSRUZPQkopIGkrPXZjb3VudC1yY291bnQ7CisgICAgICAgIGlmKGk+PXZjb3VudCkgY29udGludWU7CisgICAgICAgIGlmKGkhPW4mJiFCVFNUKGRlZixpKSkgQlNFVCh1c2UsaSk7CisgICAgfQorCisgICAgLyogIEVpbiBXZXJ0IHdpcmQgbmljaHQgemVyc3RvZXJ0LCB3ZW5uIGVzIGtlaW4gZWxlbWVudGFyZXIgVHlwIGlzdCB1bmQgKi8KKyAgICAvKiAgZGllIEdyb2Vzc2Uga2xlaW5lciBhbHMgZGllIFZhcmlhYmxlIChzdGVodCBpbiBhbGxlIHNvbGNoZW4gSUNzIGluICAqLworICAgIC8qICBxMi52YWwubWF4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYoKHAtPnouZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmKElTU0NBTEFSKHAtPnoudi0+dnR5cC0+ZmxhZ3MpfHxwLT56LnYtPnZ0eXAtPmZsYWdzPT0wfHx6bWVxdG8ocC0+cTIudmFsLnZtYXgsc3pvZihwLT56LnYtPnZ0eXApKSkpeworICAgICAgICBpPXAtPnoudi0+aW5kZXg7CisgICAgICAgIGlmKGk+PXZjb3VudCkgaWVycm9yKDApOworICAgICAgICBpZihnMSYmZzImJiFCVFNUKHVzZSxpKSkgQlNFVChkZWYsaSk7CisgICAgICAgIC8qICBXZW5uIHAgZ2VhZW5kZXJ0IHdpcmQsIHdpcmQgYXVjaCAqcCBnZWFlbmRlcnQgICAqLworICAgICAgICBpZihpPHJjb3VudCYmIUJUU1QoZGVmLGkrdmNvdW50LXJjb3VudCkpIEJTRVQodXNlLGkrdmNvdW50LXJjb3VudCk7CisgICAgfQorICAgIGlmKChwLT56LmZsYWdzJihWQVJ8RFJFRk9CSikpPT0oVkFSfERSRUZPQkopJiZnMSYmZzImJiEocC0+ei52LT5mbGFncyZETk9UVFlQRVNBRkUpKXsKKyAgICAgICAgaT1wLT56LnYtPmluZGV4K3Zjb3VudC1yY291bnQ7CisgICAgICAgIGlmKGk+PXZjb3VudCkgaWVycm9yKDApOworICAgICAgICBpZighQlRTVCh1c2UsaSkpIEJTRVQoZGVmLGkpOworICAgIH0KK30KK3ZvaWQgYWN0aXZlX3ZhcnMoZmxvd2dyYXBoICpmZykKKy8qICBhbmFseXNpZXJ0IGFrdGl2ZSBWYXJpYWJsZW4gaW0gRmx1c3NncmFwaGVuLCBub21haW49PTAsIHdlbm4genUgICAgICovCisvKiAgb3B0aW1pZXJlbmRlIEZ1bmt0aW9uIG1haW4oKSBpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICAgIElDICpwOworICAgIGludCBjaGFuZ2VkLHBhc3M7Zmxvd2dyYXBoICpnOworICAgIHVuc2lnbmVkIGxvbmcgaGVhcHNpemU9MDsKKworICAgIGlmKERFQlVHJjEwMjQpe3ByaW50ZigiYW5hbHlzaW5nIGFjdGl2ZSB2YXJpYWJsZXNcbiIpOy8qc2NhbmYoIiVkIiwmaSk7Ki99CisgICAgdG1wPW15bWFsbG9jKHZzaXplKTsKKyAgICBoZWFwc2l6ZSs9dnNpemU7CisgICAgLyogIGF2X2dlbiB1bmQgYXZfa2lsbCBmdWVyIGplZGVuIEJhc2ljIEJsb2NrIGJlcmVjaG5lbiAqLworICAgIGlmKERFQlVHJjEwMjQpe3ByaW50ZigiYWN0aXZlX3ZhcnMoKTogbG9vcDFcbiIpOy8qc2NhbmYoIiVkIiwmaSk7Ki99CisgICAgZz1mZzsKKyAgICB3aGlsZShnKXsKKyAgICAgICAgZy0+YXZfZ2VuPW15bWFsbG9jKHZzaXplKTsKKyAgICAgICAgbWVtc2V0KGctPmF2X2dlbiwwLHZzaXplKTsKKyAgICAgICAgZy0+YXZfa2lsbD1teW1hbGxvYyh2c2l6ZSk7CisgICAgICAgIG1lbXNldChnLT5hdl9raWxsLDAsdnNpemUpOworICAgICAgICBnLT5hdl9pbj1teW1hbGxvYyh2c2l6ZSk7CisgICAgICAgIG1lbXNldChnLT5hdl9pbiwwLHZzaXplKTsKKyAgICAgICAgZy0+YXZfb3V0PW15bWFsbG9jKHZzaXplKTsKKyAgICAgICAgbWVtc2V0KGctPmF2X291dCwwLHZzaXplKTsKKwloZWFwc2l6ZSs9NCp2c2l6ZTsKKyAgICAgICAgZm9yKHA9Zy0+c3RhcnQ7cDtwPXAtPm5leHQpeworICAgICAgICAgICAgYXZfY2hhbmdlKHAsZy0+YXZfZ2VuLGctPmF2X2tpbGwpOworICAgICAgICAgICAgaWYocD09Zy0+ZW5kKSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBnPWctPm5vcm1hbG91dDsKKyAgICB9CisKKyAgICAvKiAgYXZfaW4gdW5kIGF2X291dCBmdWVyIGFsbGUgQmxvZWNrZSBiZXJlY2huZW4gICAgKi8KKyAgICBpZihERUJVRyYxMDI0KXtwcmludGYoImFjdGl2ZV92YXJzKCk6IGxvb3AyXG5wYXNzOiAiKTsvKnNjYW5mKCIlZCIsJmkpOyovfQorICAgIHBhc3M9MDsKKyAgICBkb3sKKyAgICAgICAgaWYoREVCVUcmMTAyNCkge3ByaW50ZigiICVkIiwrK3Bhc3MpO2ZmbHVzaChzdGRvdXQpO30KKyAgICAgICAgY2hhbmdlZD0wOworICAgICAgICBnPWZnOworICAgICAgICB3aGlsZShnKXsKKyAgICAgICAgICAgIC8qIG91dChCKT1VIGluKEMpIHVlYmVyIGFsbGUgTmFjaGZvbGdlciBDIHZvbiBCICovCisgICAgICAgICAgICBtZW1zZXQoZy0+YXZfb3V0LDAsdnNpemUpOyAgLyogIG5vZXRpZz8gKi8KKyAgICAgICAgICAgIGlmKGctPmJyYW5jaG91dCkgYnZ1bml0ZShnLT5hdl9vdXQsZy0+YnJhbmNob3V0LT5hdl9pbix2c2l6ZSk7CisgICAgICAgICAgICBpZigoIWctPmVuZHx8Zy0+ZW5kLT5jb2RlIT1CUkEpJiZnLT5ub3JtYWxvdXQpIGJ2dW5pdGUoZy0+YXZfb3V0LGctPm5vcm1hbG91dC0+YXZfaW4sdnNpemUpOworICAgICAgICAgICAgLyogIEFtIEVuZGUgbXVlc3NlbiBhbGxlIGdsb2JhbGVuIFZhcmlhYmxlbiBiZWthbm50IHNlaW4gICAgKi8KKyAgICAgICAgICAgIGlmKCFnLT5ub3JtYWxvdXQpeworICAgICAgICAgICAgICAgIGJ2dW5pdGUoZy0+YXZfb3V0LGF2X2dsb2JhbHMsdnNpemUpOworICAgICAgICAgICAgICAgIC8qaWYoIW5vY2FsbCkqLyBidnVuaXRlKGctPmF2X291dCxhdl9zdGF0aWNzLHZzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGluKEIpPXVzZShCKVUob3V0KEIpLWRlZihCKSkgKi8KKyAgICAgICAgICAgIG1lbWNweSh0bXAsZy0+YXZfb3V0LHZzaXplKTsKKyAgICAgICAgICAgIGJ2ZGlmZih0bXAsZy0+YXZfa2lsbCx2c2l6ZSk7CisgICAgICAgICAgICBidnVuaXRlKHRtcCxnLT5hdl9nZW4sdnNpemUpOworCisgICAgICAgICAgICBpZighYnZjbXAodG1wLGctPmF2X2luLHZzaXplKSl7Y2hhbmdlZD0xO21lbWNweShnLT5hdl9pbix0bXAsdnNpemUpO30KKyAgICAgICAgICAgIGc9Zy0+bm9ybWFsb3V0OworICAgICAgICB9CisgICAgfXdoaWxlKGNoYW5nZWQpOworICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiXG4iKTsKKyAgICBmcmVlKHRtcCk7CisgICAgaWYoREVCVUcmMTYzODQpIHByaW50ZigiYXYgaGVhcHNpemU9JWx1XG4iLGhlYXBzaXplKTsKK30KK3ZvaWQgYXZfdXBkYXRlKElDICpwLGJ2dHlwZSAqaXN1c2VkKQoreworICBpbnQgaSxqOworICBpZigocC0+ei5mbGFncyYoVktPTlNUfFZBUikpPT1WQVIpeworICAgIGk9cC0+ei52LT5pbmRleDsKKyAgICBpZihwLT56LmZsYWdzJkRSRUZPQkopIGkrPXZjb3VudC1yY291bnQ7ICAgIAorICAgIGlmKGk8MHx8aT49dmNvdW50KXsKKyAgICAgIHByaW50ZigiaT0lZFxuIixpKTtwcmljMihzdGRvdXQscCk7IGllcnJvcigwKTsKKyAgICB9CisgICAgaWYocC0+ei5mbGFncyZEUkVGT0JKKXsKKyAgICAgIGlmKCEocC0+ei52LT5mbGFncyZETk9UVFlQRVNBRkUpKQorCUJDTFIoaXN1c2VkLGkpOworICAgIH1lbHNleworICAgICAgaWYoSVNTQ0FMQVIocC0+ei52LT52dHlwLT5mbGFncyl8fChwLT5jb2RlPT1BU1NJR04mJnptZXF0byhwLT5xMi52YWwudm1heCxzem9mKHAtPnoudi0+dnR5cCkpKSkKKwlCQ0xSKGlzdXNlZCxpKTsKKyAgICB9CisgICAgLyogIGJlaSBadXdlaXN1bmcgYW4gcCB3aXJkICpwIGFrdGl2ICAgICovCisgICAgaWYoaTxyY291bnQpIEJTRVQoaXN1c2VkLGkrdmNvdW50LXJjb3VudCk7CisgIH0KKyAgZm9yKGo9MDtqPHAtPnVzZV9jbnQ7aisrKXsKKyAgICBpPXAtPnVzZV9saXN0W2pdLnYtPmluZGV4OworICAgIGlmKHAtPnVzZV9saXN0W2pdLmZsYWdzJkRSRUZPQkopIGkrPXZjb3VudC1yY291bnQ7CisgICAgaWYoaTwwfHxpPj12Y291bnQpIGNvbnRpbnVlOworICAgIEJTRVQoaXN1c2VkLGkpOworICB9ICAKK30KKy8qIHRlc3RzLCBpZiBJQyBwIHVzZXMgb3IgbW9kaWZpZXMgdmFyIHYgKi8KK3N0YXRpYyBpbnQgdmFyX2NvbmZsaWN0cyhWYXIgKnYsSUMgKnApCit7CisgIGludCBpOworICBmb3IoaT0wO2k8cC0+dXNlX2NudDtpKyspCisgICAgaWYocC0+dXNlX2xpc3RbaV0udj09diYmIShwLT51c2VfbGlzdFtpXS5mbGFncyZEUkVGT0JKKSkgCisgICAgICByZXR1cm4gMTsKKyAgZm9yKGk9MDtpPHAtPmNoYW5nZV9jbnQ7aSsrKQorICAgIGlmKHAtPmNoYW5nZV9saXN0W2ldLnY9PXYmJiEocC0+Y2hhbmdlX2xpc3RbaV0uZmxhZ3MmRFJFRk9CSikpIAorICAgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQoraW50IGRlYWRfYXNzaWdubWVudHMoZmxvd2dyYXBoICpmZykKKy8qICBGaW5kZXQgWnV3ZWlzdW5nZW4sIGRpZSB1bm5vZXRpZyBzaW5kLCBkYSBkaWUgVmFyaWFibGUgbmllIG1laHIgICAgICovCisvKiAgYmVudXR6dCB3ZXJkZW4ga2Fubi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICAgIGludCBjaGFuZ2VkPTA7SUMgKnA7YnZ0eXBlICppc3VzZWQ7CisgICAgaW50IGksajsKKyAgICBpZihERUJVRyYxMDI0KSBwcmludGYoInNlYXJjaGluZyBmb3IgZGVhZCBhc3NpZ25tZW50c1xuIik7CisgICAgaXN1c2VkPW15bWFsbG9jKHZzaXplKTsKKyAgICB3aGlsZShmZyl7CisgICAgICBtZW1jcHkoaXN1c2VkLGZnLT5hdl9vdXQsdnNpemUpOworICAgICAgcD1mZy0+ZW5kOworICAgICAgd2hpbGUocCl7CisJaWYocC0+ei5mbGFncyZWQVIpeworCSAgaT1wLT56LnYtPmluZGV4OworCSAgaWYocC0+ei5mbGFncyZEUkVGT0JKKSBpKz12Y291bnQtcmNvdW50OworCSAgaWYoIUJUU1QoaXN1c2VkLGkpJiYhaXNfdm9sYXRpbGVfaWMocCkmJiEoZGlzYWJsZSYxKSl7CisJICAgIGlmKERFQlVHJjEwMjQpe3ByaW50ZigiZGVhZCBhc3NpZ25tZW50IGRlbGV0ZWQ6XG4iKTtwcmljMihzdGRvdXQscCk7fQorCSAgICBpZigqcC0+ei52LT5pZGVudGlmaWVyJiZwLT5jb2RlIT1BU1NJR04peyBlcnJfaWM9cDtlcnJvcigxNzAsaT49dmNvdW50LXJjb3VudD8iKiI6IiIscC0+ei52LT5pZGVudGlmaWVyKTtlcnJfaWM9MDt9CisJICAgIC8qaWYocC0+Y29kZSE9R0VUUkVUVVJOKSovIGNoYW5nZWQ9MTsKKwkgICAgaWYocD09ZmctPnN0YXJ0KXtyZW1vdmVfSUNfZmcoZmcscCk7YnJlYWs7fQorCSAgICBwPXAtPnByZXY7cmVtb3ZlX0lDX2ZnKGZnLHAtPm5leHQpOworCSAgICBjb250aW51ZTsKKwkgIH0KKwl9CisJaWYocC0+Y29kZSE9U0VUUkVUVVJOJiZwLT5jb2RlIT1URVNUJiZwLT5jb2RlIT1DT01QQVJFJiYocC0+cTEuZmxhZ3MmVkFSKSYmIUJUU1QoaXN1c2VkLHAtPnExLnYtPmluZGV4KSYmKCEocC0+ei5mbGFncyZWQVIpfHwhcC0+ei52LT5yZWd8fHAtPnoudi0+aWRlbnRpZmllcikpeworICAgICAgICAgIElDICptLCphO2ludCBmPXAtPnExLmZsYWdzLGR0PXAtPnExLmR0eXA7CisJICBwLT5xMS5mbGFncyY9fkRSRUZPQko7CisJICBhPXAtPnByZXY7aWYoYSkgbT1hLT5wcmV2OyBlbHNlIG09MDsKKwkgIGlmKG0mJmEmJm0tPmNvZGU9PUFTU0lHTiYmKGEtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJiFjb21wYXJlX29ianMoJnAtPnExLCZtLT56LDApJiYhY29tcGFyZV9vYmpzKCZhLT5xMSwmYS0+eiwwKSYmIWNvbXBhcmVfb2JqcygmbS0+cTEsJmEtPnosMCkmJihhLT5xMi5mbGFncyZLT05TVCkmJiF2YXJfY29uZmxpY3RzKGEtPnExLnYscCkpeworCSAgICBpZihERUJVRyYxMDI0KXsKKwkgICAgICBwcmludGYoInJlb3JkZXIgcG9zdC1vcChxMSk6XG4iKTsKKwkgICAgICBwcmljMihzdGRvdXQsbSk7cHJpYzIoc3Rkb3V0LGEpO3ByaWMoc3Rkb3V0LHApOworCSAgICB9CisJICAgIHAtPnExPWEtPnExOworCSAgICBtLT5uZXh0PXA7cC0+cHJldj1tOworCSAgICBpZihwLT5uZXh0KSBwLT5uZXh0LT5wcmV2PWE7CisJICAgIGEtPm5leHQ9cC0+bmV4dDsKKwkgICAgYS0+cHJldj1wO3AtPm5leHQ9YTsKKwkgICAgaWYoZmctPmVuZD09cCkgZmctPmVuZD1hOworCSAgICBpZihwPT1sYXN0X2ljKSBsYXN0X2ljPWE7CisJICAgIHJlbW92ZV9JQ19mZyhmZyxtKTsKKwkgICAgYXZfdXBkYXRlKGEsaXN1c2VkKTsKKwkgICAgcC0+dXNlX2xpc3Q9bXlyZWFsbG9jKHAtPnVzZV9saXN0LChwLT51c2VfY250K2EtPnVzZV9jbnQpKlZMUyk7CisJICAgIG1lbWNweSgmcC0+dXNlX2xpc3RbcC0+dXNlX2NudF0sYS0+dXNlX2xpc3QsYS0+dXNlX2NudCpWTFMpOworCSAgICBwLT51c2VfY250Kz1hLT51c2VfY250OworCSAgICBjaGFuZ2VkPTE7CisJICAgIGlmKChmJkRSRUZPQkopJiZwLT5xMS52LT5pbmRleD49cmNvdW50KQorCSAgICAgIGllcnJvcigwKTsKKwkgIH0KKwkgIHAtPnExLmZsYWdzPWY7CisJICBwLT5xMS5kdHlwPWR0OworCX0KKwlpZihwLT5jb2RlIT1URVNUJiZwLT5jb2RlIT1DT01QQVJFJiYocC0+cTIuZmxhZ3MmVkFSKSYmIUJUU1QoaXN1c2VkLHAtPnEyLnYtPmluZGV4KSYmKCEocC0+ei5mbGFncyZWQVIpfHwhcC0+ei52LT5yZWd8fHAtPnoudi0+aWRlbnRpZmllcikpeworICAgICAgICAgIElDICptLCphO2ludCBmPXAtPnEyLmZsYWdzLGR0PXAtPnEyLmR0eXA7CisJICBwLT5xMi5mbGFncyY9fkRSRUZPQko7CisJICBhPXAtPnByZXY7aWYoYSkgbT1hLT5wcmV2OyBlbHNlIG09MDsKKwkgIGlmKG0mJmEmJm0tPmNvZGU9PUFTU0lHTiYmKGEtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJiFjb21wYXJlX29ianMoJnAtPnEyLCZtLT56LDApJiYhY29tcGFyZV9vYmpzKCZhLT5xMSwmYS0+eiwwKSYmIWNvbXBhcmVfb2JqcygmbS0+cTEsJmEtPnosMCkmJihhLT5xMi5mbGFncyZLT05TVCkmJiF2YXJfY29uZmxpY3RzKGEtPnExLnYscCkpeworCSAgICBpZihERUJVRyYxMDI0KXsKKwkgICAgICBwcmludGYoInJlb3JkZXIgcG9zdC1vcChxMik6XG4iKTsKKwkgICAgICBwcmljMihzdGRvdXQsbSk7cHJpYzIoc3Rkb3V0LGEpO3ByaWMoc3Rkb3V0LHApOworCSAgICB9CisJICAgIHAtPnEyPWEtPnExOworCSAgICBtLT5uZXh0PXA7cC0+cHJldj1tOworCSAgICBpZihwLT5uZXh0KSBwLT5uZXh0LT5wcmV2PWE7CisJICAgIGEtPm5leHQ9cC0+bmV4dDsKKwkgICAgYS0+cHJldj1wO3AtPm5leHQ9YTsKKwkgICAgaWYoZmctPmVuZD09cCkgZmctPmVuZD1hOworCSAgICBpZihwPT1sYXN0X2ljKSBsYXN0X2ljPWE7CisJICAgIHJlbW92ZV9JQ19mZyhmZyxtKTsKKwkgICAgYXZfdXBkYXRlKGEsaXN1c2VkKTsKKwkgICAgcC0+dXNlX2xpc3Q9bXlyZWFsbG9jKHAtPnVzZV9saXN0LChwLT51c2VfY250K2EtPnVzZV9jbnQpKlZMUyk7CisJICAgIG1lbWNweSgmcC0+dXNlX2xpc3RbcC0+dXNlX2NudF0sYS0+dXNlX2xpc3QsYS0+dXNlX2NudCpWTFMpOworCSAgICBwLT51c2VfY250Kz1hLT51c2VfY250OworCSAgICBjaGFuZ2VkPTE7CisJICAgIGlmKChmJkRSRUZPQkopJiZwLT5xMi52LT5pbmRleD49cmNvdW50KQorCSAgICAgIGllcnJvcigwKTsKKwkgIH0KKwkgIHAtPnEyLmZsYWdzPWY7CisJICBwLT5xMi5kdHlwPWR0OworCX0KKwlpZihwLT5jb2RlIT1URVNUJiZwLT5jb2RlIT1DT01QQVJFJiYocC0+ei5mbGFncyYoVkFSfERSRUZPQkopKT09KFZBUnxEUkVGT0JKKSYmIUJUU1QoaXN1c2VkLHAtPnoudi0+aW5kZXgpKXsKKyAgICAgICAgICBJQyAqbSwqYTtpbnQgZj1wLT56LmZsYWdzLGR0PXAtPnouZHR5cDsKKwkgIHAtPnouZmxhZ3MmPX5EUkVGT0JKOworCSAgYT1wLT5wcmV2O2lmKGEpIG09YS0+cHJldjsgZWxzZSBtPTA7CisJICBpZihtJiZhJiZtLT5jb2RlPT1BU1NJR04mJihhLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiYhY29tcGFyZV9vYmpzKCZwLT56LCZtLT56LDApJiYhY29tcGFyZV9vYmpzKCZhLT5xMSwmYS0+eiwwKSYmIWNvbXBhcmVfb2JqcygmbS0+cTEsJmEtPnosMCkmJihhLT5xMi5mbGFncyZLT05TVCkmJiF2YXJfY29uZmxpY3RzKGEtPnExLnYscCkpeworCSAgICBpZihERUJVRyYxMDI0KXsKKwkgICAgICBwcmludGYoInJlb3JkZXIgcG9zdC1vcCh6KTpcbiIpOworCSAgICAgIHByaWMyKHN0ZG91dCxtKTtwcmljMihzdGRvdXQsYSk7cHJpYzIoc3Rkb3V0LHApOworCSAgICAgIHByaW50ZigiLS0iKTsKKwkgICAgfQorCSAgICBwLT56PWEtPnExOworCSAgICBtLT5uZXh0PXA7cC0+cHJldj1tOworCSAgICBpZihwLT5uZXh0KSBwLT5uZXh0LT5wcmV2PWE7CisJICAgIGEtPm5leHQ9cC0+bmV4dDsKKwkgICAgYS0+cHJldj1wO3AtPm5leHQ9YTsKKwkgICAgaWYoZmctPmVuZD09cCkgZmctPmVuZD1hOworCSAgICBpZihwPT1sYXN0X2ljKSBsYXN0X2ljPWE7CisJICAgIHJlbW92ZV9JQ19mZyhmZyxtKTsKKwkgICAgYXZfdXBkYXRlKGEsaXN1c2VkKTsKKwkgICAgcC0+dXNlX2xpc3Q9bXlyZWFsbG9jKHAtPnVzZV9saXN0LChwLT51c2VfY250K2EtPnVzZV9jbnQpKlZMUyk7CisJICAgIG1lbWNweSgmcC0+dXNlX2xpc3RbcC0+dXNlX2NudF0sYS0+dXNlX2xpc3QsYS0+dXNlX2NudCpWTFMpOworCSAgICBwLT51c2VfY250Kz1hLT51c2VfY250OworCSAgICBjaGFuZ2VkPTE7CisJICAgIGlmKChmJkRSRUZPQkopJiZwLT56LnYtPmluZGV4Pj1yY291bnQpCisJICAgICAgaWVycm9yKDApOworCSAgfQorCSAgcC0+ei5mbGFncz1mOworCSAgcC0+ei5kdHlwPWR0OworCX0KKwlhdl91cGRhdGUocCxpc3VzZWQpOworCWlmKHA9PWZnLT5zdGFydCkgYnJlYWs7CisJcD1wLT5wcmV2OworICAgICAgfQorICAgICAgZmc9ZmctPm5vcm1hbG91dDsKKyAgICB9CisgICAgZnJlZShpc3VzZWQpOworICAgIHJldHVybihjaGFuZ2VkKTsKK30KKwpkaWZmIC0tZ2l0IGEvYmluLy5kdW1teSBiL2Jpbi8uZHVtbXkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi8uZHVtbXkKZGlmZiAtLWdpdCBhL2J1Zy5jIGIvYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTc1ZmYzZAotLS0gL2Rldi9udWxsCisrKyBiL2J1Zy5jCkBAIC0wLDAgKzEsMTMwIEBACisvKiAgJFZFUjogdmJjYyAobG9vcC5jKSBWMC44ICAgICAqLworLyogIHNjaGxlaWZlbm9yaWVudGllcnRlIE9wdGltaWVydW5nZW4gICovCisKKyNpbmNsdWRlICJvcHQuaCIKKworc3RhdGljIGNoYXIgRklMRV9bXT1fX0ZJTEVfXzsKKworI2RlZmluZSBNT1ZFX0lDIDEKKyNkZWZpbmUgTU9WRV9DT01QIDIKKworLyogIExpc3RlLCBpbiBkaWUgSUNzIGVpbmdldHJhZ2VuIHdlcmRlbiwgZGllIGF1cyBTY2hsZWlmZW4gKi8KKy8qICBnZXpvZ2VuIHdlcmRlbiBzb2xsZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdHJ1Y3QgbW92bGlzdHsKKyAgc3RydWN0IG1vdmxpc3QgKm5leHQ7CisgIHN0cnVjdCBJQyAqSUM7CisgIHN0cnVjdCBmbG93Z3JhcGggKnRhcmdldF9mZzsKKyAgaW50IGZsYWdzOworfTsKKworc3RydWN0IG1vdmxpc3QgKmZpcnN0X21vdiwqbGFzdF9tb3Y7CisKK2ludCByZXBvcnRfd2VpcmRfY29kZSxyZXBvcnRfc3VzcGljaW91c19sb29wczsKKworLyogIEJpdHZla3RvcmVuIGZ1ZXIgc2NobGVpZmVuaW52YXJpYW50ZSBJQ3MgICAgKi8KK2J2dHlwZSAqaW52YXJpYW50LCppbmxvb3AsKm1vdmVkLCptb3ZlZF9jb21wbGV0ZWx5OworYnZ0eXBlICpmZ190bXA7CitidnR5cGUgKm5vdF9tb3ZhYmxlOworc2l6ZV90IGJzaXplOworCisKKy8qICBMaXN0ZSwgaW4gZGllIElDcyBmdWVyIHN0cmVuZ3RoLXJlZHVjdGlvbiBlaW5nZXRyYWdlbiAgICovCisvKiAgd2VyZGVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RydWN0IHNybGlzdHsKKyAgc3RydWN0IHNybGlzdCAqbmV4dDsKKyAgc3RydWN0IElDICppbmRfdmFyOworICBzdHJ1Y3QgSUMgKklDOworICBzdHJ1Y3QgZmxvd2dyYXBoICp0YXJnZXRfZmc7CisgIC8qICBIaWxmc3ZhcmlhYmxlLCBmYWxscyBlaW5lIGFlcXVpdmFsZW50ZSBPcGVyYXRpb24gc2Nob24gcmVkdXppZXJ0ICAgICovCisgIC8qICB3dXJkZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0cnVjdCBWYXIgKmh2OworfTsKKworc3RydWN0IHNybGlzdCAqZmlyc3Rfc3IsKmxhc3Rfc3I7CisKKy8qICBMaXN0ZSwgaW4gZGllIERhdGVuIGZ1ZXIgbG9vcC11bnJvbGxpbmcgZWluZ2V0cmFnZW4gd2VyZGVuLiAqLworc3RydWN0IHVybGlzdHsKKyAgaW50IGZsYWdzOworICBsb25nIHRvdGFsLHVucm9sbDsKKyAgc3RydWN0IElDICpjbXAsKmJyYW5jaCwqaW5kOworICBzdHJ1Y3QgZmxvd2dyYXBoICpzdGFydCwqaGVhZDsKKyAgc3RydWN0IHVybGlzdCAqbmV4dDsKK30gKmZpcnN0X3VyOworCisjZGVmaW5lIFVOUk9MTF9DT01QTEVURUxZIDEKKyNkZWZpbmUgVU5ST0xMX01PRFVMTyAyCisjZGVmaW5lIFVOUk9MTF9JTlZBUklBTlQgNAorI2RlZmluZSBVTlJPTExfUkVWRVJTRSA4CisjZGVmaW5lIElORF9PTkxZX0NPVU5UUyAxNgorI2RlZmluZSBNVUxUSVBMRV9FWElUUyAzMgorCisvKiAgSGllciB3ZXJkZW4gSW5kdWt0aW9uc3ZhcmlhYmxlbiB2ZXJtZXJrdCAgICAqLworc3RydWN0IElDICoqaW5kX3ZhcnM7CisKK3N0YXRpYyBzdHJ1Y3QgZmxvd2dyYXBoICpmaXJzdF9mZzsKKworCit2b2lkIGNhbGNfbW92YWJsZShzdHJ1Y3QgZmxvd2dyYXBoICpzdGFydCxzdHJ1Y3QgZmxvd2dyYXBoICplbmQpCisvKiAgQmVyZWNobmV0LCB3ZWxjaGUgRGVmaW5pdGlvbmVuIG5pY2h0IGF1cyBkZXIgU2NobGVpZmUgc3RhcnQtZW5kICAgICAqLworLyogIHZlcnNjaG9iZW4gd2VyZGVuIGR1ZXJmZW4uIEVpbmUgRGVmLiBwIHZvbiB6IGRhcmYgbnVyIHZlcnNjaG9iZW4gICAgKi8KKy8qICB3ZXJkZW4sIHdlbm4ga2VpbmUgYW5kZXJlIERlZi4gdm9uIHAgZXhpc3RpZXJ0IHVuZCBhbGxlICAgICAgICAgICAgICovCisvKiAgVmVyd2VuZHVuZ2VuIHZvbiB6IG51ciB2b24gcCBlcnJlaWNodCB3ZXJkZW4uICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEJlbnV0enQgcmRfZGVmcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgc3RydWN0IGZsb3dncmFwaCAqZztzdHJ1Y3QgSUMgKnA7CisgIGludCBpLGosayxkOworICBidnR5cGUgKmNoYW5nZWRfdmFyczsKKyAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJjYWxjdWxhdGluZyBub3RfbW92YWJsZSBmb3IgYmxvY2tzICVkIHRvICVkXG4iLHN0YXJ0LT5pbmRleCxlbmQtPmluZGV4KTsKKyAgaWYoMC8qIShvcHRmbGFncyYxMDI0KSovKXsKKyAgICBtZW1zZXQobm90X21vdmFibGUsVUNIQVJfTUFYLGRzaXplKTsKKyAgICByZXR1cm47CisgIH0KKyAgbWVtc2V0KG5vdF9tb3ZhYmxlLDAsZHNpemUpOworICBjaGFuZ2VkX3ZhcnM9bXltYWxsb2ModnNpemUpOworICBtZW1zZXQoY2hhbmdlZF92YXJzLDAsdnNpemUpOworICBmb3IoaT0wO2k8dmNvdW50LXJjb3VudDtpKyspeworICAgIGlmKHZpbGlzdFtpXS0+dnR5cC0+ZmxhZ3MmVk9MQVRJTEUpIEJTRVQoY2hhbmdlZF92YXJzLGkpOworICAgIGlmKGk8cmNvdW50KXsKKyAgICAgIGlmKCF2aWxpc3RbaV0tPnZ0eXAtPm5leHR8fCh2aWxpc3RbaV0tPnZ0eXAtPm5leHQtPmZsYWdzJlZPTEFUSUxFKSkgQlNFVChjaGFuZ2VkX3ZhcnMsaSt2Y291bnQtcmNvdW50KTsKKyAgICB9CisgIH0KKyAgZm9yKGc9c3RhcnQ7ZztnPWctPm5vcm1hbG91dCl7CisgICAgaWYoIWctPnJkX2luKSBpZXJyb3IoMCk7CisgICAgbWVtY3B5KHJkX2RlZnMsZy0+cmRfaW4sZHNpemUpOworICAgIGZvcihwPWctPnN0YXJ0O3A7cD1wLT5uZXh0KXsKKyAgICAgIGZvcihqPTA7ajxwLT5jaGFuZ2VfY250O2orKyl7CisJaT1wLT5jaGFuZ2VfbGlzdFtqXS52LT5pbmRleDsKKwlpZihwLT5jaGFuZ2VfbGlzdFtqXS5mbGFncyZEUkVGT0JKKSBpKz12Y291bnQtcmNvdW50OworCWlmKGk+PXZjb3VudCkgY29udGludWU7CisJaWYoQlRTVChjaGFuZ2VkX3ZhcnMsaSl8fChxMXR5cChwKSZWT0xBVElMRSl8fChxMnR5cChwKSZWT0xBVElMRSl8fCh6dHlwKHApJlZPTEFUSUxFKSl7CisJICBidnVuaXRlKG5vdF9tb3ZhYmxlLHZhcl9kZWZzW2ldLGRzaXplKTsKKwl9ZWxzZXsKKwkgIEJTRVQoY2hhbmdlZF92YXJzLGkpOworCX0KKyAgICAgIH0KKyAgICAgIGZvcihrPTA7azxwLT51c2VfY250O2srKyl7CisJaT1wLT51c2VfbGlzdFtrXS52LT5pbmRleDsKKwlpZihwLT51c2VfbGlzdFtrXS5mbGFncyZEUkVGT0JKKSBpKz12Y291bnQtcmNvdW50OworCWlmKGk+PXZjb3VudCkgY29udGludWU7CisJZm9yKGQ9LTEsaj0xO2o8PWRjb3VudDtqKyspeworCSAgaWYoQlRTVChyZF9kZWZzLGopJiZCVFNUKHZhcl9kZWZzW2ldLGopKXsKKwkgICAgaWYoZD49MCl7ICAvKiAgbWVociBhbHMgZWluZSBEZWYuICAqLworCSAgICAgIGJ2dW5pdGUobm90X21vdmFibGUsdmFyX2RlZnNbaV0sZHNpemUpOworCSAgICAgIGQ9LTE7YnJlYWs7CisJICAgIH1lbHNlIGQ9ajsKKwkgIH0KKwkgIGlmKEJUU1QocmRfZGVmcyxVTkRFRihqKSkmJkJUU1QodmFyX2RlZnNbaV0sVU5ERUYoaikpKXsKKwkgICAgYnZ1bml0ZShub3RfbW92YWJsZSx2YXJfZGVmc1tpXSxkc2l6ZSk7CisJICAgIGQ9LTE7YnJlYWs7CisJICB9CisJfQorICAgICAgfQorICAgICAgLyogIERhcyBoaWVyLCB1bSByZF9kZWZzIHp1IGFrdHVhbGlzaWVyZW4uICAqLworICAgICAgcmRfY2hhbmdlKHApOworICAgICAgaWYocD09Zy0+ZW5kKSBicmVhazsKKyAgICB9CisgICAgaWYoZz09ZW5kKSBicmVhazsKKyAgfQorICBmcmVlKGNoYW5nZWRfdmFycyk7Cit9CisKZGlmZiAtLWdpdCBhL2NwLmMgYi9jcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMjFlZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jcC5jCkBAIC0wLDAgKzEsMzU3IEBACisvKiAgJFZFUjogdmJjYyAoY3AuYykgJFJldmlzaW9uOiAxLjUgJCAgICAgKi8KKy8qICB2ZXJmdWVnYmFyZSBLb3BpZW4gdW5kIGNvcHkgcHJvcGFnYXRpb24gKi8KKworI2luY2x1ZGUgIm9wdC5oIgorCitzdGF0aWMgY2hhciBGSUxFX1tdPV9fRklMRV9fOworCisvKiAgZnVlciB2ZXJmdWVnYmFyZSBLb3BpZW4gKi8KK3Vuc2lnbmVkIGludCBjY291bnQ7CitzaXplX3QgY3NpemU7CitJQyAqKmNsaXN0OworCisvKiAgYWxsZSBBc3NpZ25tZW50cywgZ2xvYmFsZXIgb2RlciBBZHIuIGZ1ZXIgcHJvcGFnYXRpb24gZXRjLiAgICAgICAgICovCitidnR5cGUgKmNwX2dsb2JhbHMsKmNwX2FkZHJlc3MsKmNwX3N0YXRpY3MsKmNwX2RyZWZzLCpjcF9hY3QsKmNwX2Rlc3Q7CisvKiAgYWxsZSBLb3BpZXJhbndlaXN1bmdlbiwgZGllIGVpbmUgYmVzdC4gVmFyaWFibGUgYWxzIFF1ZWxsZSBoYWJlbiAgICAqLworYnZ0eXBlICoqY29waWVzOworCitzdGF0aWMgYnZ0eXBlICpjcF9tYXRyaXg7CisKK3ZvaWQgYXZhaWxhYmxlX2NvcGllcyhmbG93Z3JhcGggKmZnKQorLyogIGJlcmVjaG5ldCBkaWUgdmVyZnVlZ2JhcmVuIEtvcGllbiBmdWVyIGplZGVuIEJsb2NrICAgICAgKi8KK3sKKyAgICBmbG93Z3JhcGggKmc7SUMgKnA7YnZ0eXBlICp0bXA7CisgICAgaW50IGNoYW5nZWQscGFzcyxpLGo7CisgICAgdW5zaWduZWQgaGVhcHNpemU9MDsKKyAgICAvKiAgY3BfZ2VuIHVuZCBjcF9raWxsIGZ1ZXIgamVkZW4gQmxvY2sgYmVyZWNobmVuICAgKi8KKyAgICBpZihERUJVRyYxMDI0KSBwcmludGYoImFuYWx5c2luZyBhdmFpbGFibGUgY29waWVzXG4iKTsKKyAgICB0bXA9bXltYWxsb2MoY3NpemUpOworICAgIGhlYXBzaXplKz1jc2l6ZTsKKyAgICBmb3IoZz1mZztnO2c9Zy0+bm9ybWFsb3V0KXsKKyAgICAgICAgZy0+Y3BfaW49bXltYWxsb2MoY3NpemUpOworICAgICAgICBtZW1zZXQoZy0+Y3BfaW4sMCxjc2l6ZSk7CisgICAgICAgIGctPmNwX291dD1teW1hbGxvYyhjc2l6ZSk7CisgICAgICAgIG1lbXNldChnLT5jcF9vdXQsMCxjc2l6ZSk7CisgICAgICAgIGctPmNwX2dlbj1teW1hbGxvYyhjc2l6ZSk7CisgICAgICAgIG1lbXNldChnLT5jcF9nZW4sMCxjc2l6ZSk7CisgICAgICAgIGctPmNwX2tpbGw9bXltYWxsb2MoY3NpemUpOworICAgICAgICBtZW1zZXQoZy0+Y3Bfa2lsbCwwLGNzaXplKTsKKwloZWFwc2l6ZSs9NCpjc2l6ZTsKKyAgICAgICAgZm9yKHA9Zy0+ZW5kO3A7cD1wLT5wcmV2KXsKKyAgICAgICAgICAgIG1lbXNldCh0bXAsMCxjc2l6ZSk7CisgICAgICAgICAgICBmb3Ioaj0wO2o8cC0+Y2hhbmdlX2NudDtqKyspeworICAgICAgICAgICAgICAgIGk9cC0+Y2hhbmdlX2xpc3Rbal0udi0+aW5kZXg7CisgICAgICAgICAgICAgICAgaWYocC0+Y2hhbmdlX2xpc3Rbal0uZmxhZ3MmRFJFRk9CSikgaSs9dmNvdW50LXJjb3VudDsKKyAgICAgICAgICAgICAgICBpZihpPj12Y291bnQpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGJ2dW5pdGUodG1wLGNvcGllc1tpXSxjc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpPXAtPmNvcHlpbmRleDsKKyAgICAgICAgICAgIGlmKGk+PTAmJiFCVFNUKGctPmNwX2tpbGwsaSkpIEJTRVQoZy0+Y3BfZ2VuLGkpOworICAgICAgICAgICAgYnZkaWZmKHRtcCxnLT5jcF9nZW4sY3NpemUpOworICAgICAgICAgICAgYnZ1bml0ZShnLT5jcF9raWxsLHRtcCxjc2l6ZSk7CisKKyAgICAgICAgICAgIGlmKHA9PWctPnN0YXJ0KSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZihnPT1mZyl7CisgICAgICAgICAgICBtZW1zZXQoZy0+Y3BfaW4sMCxjc2l6ZSk7CisgICAgICAgICAgICBtZW1jcHkoZy0+Y3Bfb3V0LGctPmNwX2dlbixjc2l6ZSk7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgbWVtc2V0KGctPmNwX291dCxVQ0hBUl9NQVgsY3NpemUpOworICAgICAgICAgICAgYnZkaWZmKGctPmNwX291dCxnLT5jcF9raWxsLGNzaXplKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiAgY3BfaW4gdW5kIGNwX291dCBmdWVyIGplZGVuIEJsb2NrIGJlcmVjaG5lbiAqLworICAgIC8qICBvdXQoYik9VS1nZW4oQikgdm9yaW5pdGlhbGlzaWVydCB1bmQgICAgICAgICovCisgICAgLyogIGluKEIwKT0wLCBvdXQoQjApPWdlbihCMCkgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZihERUJVRyYxMDI0KSB7cHJpbnRmKCJwYXNzOiIpO3Bhc3M9MDt9CisgICAgZG97CisgICAgICAgIGlmKERFQlVHJjEwMjQpIHtwcmludGYoIiAlZCIsKytwYXNzKTtmZmx1c2goc3Rkb3V0KTt9CisgICAgICAgIGNoYW5nZWQ9MDsKKyAgICAgICAgZz1mZy0+bm9ybWFsb3V0OyAgICAvKiAgaW4gQjAgYWVuZGVydCBzaWNoIG5pY2h0cyAgICovCisgICAgICAgIHdoaWxlKGcpeworICAgICAgICAgICAgZmxvd2xpc3QgKmxwOworICAgICAgICAgICAgLyogIGluKEIpPVNjaG5pdHQgb3V0KFApIG1pdCBQIFZvcmdhZW5nZXIgdm9uIEIgKi8KKyAgICAgICAgICAgIGxwPWctPmluOworICAgICAgICAgICAgaT0wOyAgICAvKiAgRmxhZyBmdWVyIGVyc3RlbiBWb3JnYWVuZ2VyICovCisgICAgICAgICAgICB3aGlsZShscCl7CisgICAgICAgICAgICAgICAgaWYoIWxwLT5ncmFwaCkgaWVycm9yKDApOworICAgICAgICAgICAgICAgIGlmKGxwLT5ncmFwaC0+YnJhbmNob3V0PT1nfHwhbHAtPmdyYXBoLT5lbmR8fGxwLT5ncmFwaC0+ZW5kLT5jb2RlIT1CUkEpeworICAgICAgICAgICAgICAgICAgICBpZihpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ2aW50ZXJzZWN0KGctPmNwX2luLGxwLT5ncmFwaC0+Y3Bfb3V0LGNzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZy0+Y3BfaW4sbHAtPmdyYXBoLT5jcF9vdXQsY3NpemUpO2k9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBscD1scC0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qICBvdXQoYik9Z2VuKEIpIFUgKGluKEIpLWtpbGwoQikgICovCisgICAgICAgICAgICBtZW1jcHkodG1wLGctPmNwX2luLGNzaXplKTsKKyAgICAgICAgICAgIGJ2ZGlmZih0bXAsZy0+Y3Bfa2lsbCxjc2l6ZSk7CisgICAgICAgICAgICBidnVuaXRlKHRtcCxnLT5jcF9nZW4sY3NpemUpOworICAgICAgICAgICAgaWYoIWJ2Y21wKHRtcCxnLT5jcF9vdXQsY3NpemUpKXtjaGFuZ2VkPTE7bWVtY3B5KGctPmNwX291dCx0bXAsY3NpemUpO30KKyAgICAgICAgICAgIGc9Zy0+bm9ybWFsb3V0OworICAgICAgICB9CisgICAgfXdoaWxlKGNoYW5nZWQpOworICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiXG4iKTsKKyAgICBpZihERUJVRyYxNjM4NCkgcHJpbnRmKCJhdmFpbGFibGUgY29waWVzIGhlYXBzaXplPSVsdVxuIiwodW5zaWduZWQgbG9uZyloZWFwc2l6ZSk7CisgICAgZnJlZSh0bXApOworfQorCitpbnQgY29tcGFyZV9jcChjb25zdCB2b2lkICphMSxjb25zdCB2b2lkICphMikKKy8qICBTdHViIGZ1ZXIgY29tcGFyZV9vYmpzLCBkYW1pdCBhbHMgVmVyZ2xlaWNoc2Z1bmt0aW9uIGZ1ZXIgcXNvcnQgZ2VodCAqLworeworICAgIElDICpwMSwqcDI7aW50IGkxLGkyOworICAgIHAxPSooKElDICoqKWExKTtwMj0qKChJQyAqKilhMik7CisgICAgaWYoIXAxfHwhcDIpIGllcnJvcigwKTsKKyAgICBpMT1wMS0+dHlwZjsgaTI9cDItPnR5cGY7CisgICAgaWYoaTE8aTIpIHJldHVybiAtMTsKKyAgICBpZihpMT5pMikgcmV0dXJuIDE7CisgICAgaTE9Y29tcGFyZV9vYmpzKCZwMS0+cTEsJnAyLT5xMSxwMS0+dHlwZik7CisgICAgaWYoaTEpIHJldHVybiBpMTsKKyAgICBpMT1jb21wYXJlX29ianMoJnAxLT56LCZwMi0+eixwMS0+dHlwZik7CisgICAgcmV0dXJuIGkxOworfQorCit2b2lkIG51bV9jb3BpZXModm9pZCkKKy8qICBudW1lcmllcnQgYWxsZSBlaW5mYWNoZW4gS29waWVyYW53ZWlzdW5nZW4gICovCit7CisgICAgSUMgKnA7VmFyICp2O2ludCBpLG4sYzsKKyAgICBidnR5cGUgKmJwOworICAgIHVuc2lnbmVkIGxvbmcgaGVhcHNpemU9MDsKKyAgICBpZihERUJVRyYxMDI0KSBwcmludGYoIm51bWVyYXRpbmcgY29waWVzIGxvb3AxXG4iKTsKKyAgICBjY291bnQ9MDsKKyAgICBmb3IocD1maXJzdF9pYztwO3A9cC0+bmV4dCl7CisgICAgICAgIGlmKHAtPmNvZGU9PUFTU0lHTiYmKHAtPnExLmZsYWdzJihWQVIvKnxWQVJBRFIqLykpPT1WQVImJihwLT56LmZsYWdzJlZBUikpIHAtPmNvcHlpbmRleD1jY291bnQrKzsKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICBwLT5jb3B5aW5kZXg9LTE7CisgICAgfQorICAgIC8qY3NpemU9KGNjb3VudCtDSEFSX0JJVC0xKS9DSEFSX0JJVDsqLworICAgIGNzaXplPUJWU0laRShjY291bnQpOworICAgIGlmKERFQlVHJigxNjM4NHwxMDI0KSkgcHJpbnRmKCJjY291bnQ9JWx1LCBjc2l6ZT0lbHVcbiIsKHVuc2lnbmVkIGxvbmcpY2NvdW50LCh1bnNpZ25lZCBsb25nKWNzaXplKTsKKyAgICBjbGlzdD1teW1hbGxvYyhjY291bnQqc2l6ZW9mKElDICopKTsKKyAgICBoZWFwc2l6ZSs9Y2NvdW50KnNpemVvZihJQyAqKTsKKyAgICBjcF9nbG9iYWxzPW15bWFsbG9jKGNzaXplKTsKKyAgICBtZW1zZXQoY3BfZ2xvYmFscywwLGNzaXplKTsKKyAgICBjcF9zdGF0aWNzPW15bWFsbG9jKGNzaXplKTsKKyAgICBtZW1zZXQoY3Bfc3RhdGljcywwLGNzaXplKTsKKyAgICBjcF9hZGRyZXNzPW15bWFsbG9jKGNzaXplKTsKKyAgICBtZW1zZXQoY3BfYWRkcmVzcywwLGNzaXplKTsKKyAgICBjcF9kcmVmcz1teW1hbGxvYyhjc2l6ZSk7CisgICAgbWVtc2V0KGNwX2RyZWZzLDAsY3NpemUpOworICAgIGhlYXBzaXplKz00KmNzaXplOworICAgIGNvcGllcz1teW1hbGxvYyh2Y291bnQqc2l6ZW9mKGJ2dHlwZSAqKSk7CisgICAgaGVhcHNpemUrPXZjb3VudCpzaXplb2YoYnZ0eXBlICopOworICAgIGlmKERFQlVHJjEwMjQpeyBwcmludGYoIm51bV9jb3BpZXMgbG9vcDJcbiIpO30KKyAgICBmb3IocD1maXJzdF9pYztwO3A9cC0+bmV4dCl7CisgICAgICAgIGlmKHAtPmNvcHlpbmRleD49MCl7CisgICAgICAgICAgICBjbGlzdFtwLT5jb3B5aW5kZXhdPXA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoREVCVUcmMTAyNCl7IHByaW50Zigic29ydGluZyBjb3BpZXNcbiIpO30KKyAgICBpZihjY291bnQ+MSkgdnFzb3J0KGNsaXN0LGNjb3VudCxzaXplb2YoSUMgKiksY29tcGFyZV9jcCk7CisgICAgaWYoREVCVUcmMTAyNCl7IHByaW50ZigicmVudW1iZXJpbmcgY29waWVzXG5udW1fY29waWVzIGxvb3AzXG4iKTt9CisgICAgaWYoY2NvdW50PjApeyAgIC8qICBBdWZwYXNzZW4sIGRhIGNjb3VudCB1bnNpZ25lZCEgICovCisgICAgICAgIGZvcihjPTA7YzxjY291bnQtMTtjKyspeworICAgICAgICAgICAgaWYoIWNvbXBhcmVfY3AoJmNsaXN0W2NdLCZjbGlzdFtjKzFdKSkKKyAgICAgICAgICAgICAgICBjbGlzdFtjKzFdLT5jb3B5aW5kZXg9Y2xpc3RbY10tPmNvcHlpbmRleDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZihERUJVRyYxMDI0KSBwcmludGYoInJlLXNvcnRpbmcgY29waWVzXG4iKTsKKyAgICAvKiAgd2llZGVyIGluIGRpZSByaWNodGlnZSBSZWloZW5mb2xnZSBicmluZ2VuICAqLworICAgIGZvcihwPWZpcnN0X2ljO3A7cD1wLT5uZXh0KQorICAgICAgICBpZihwLT5jb3B5aW5kZXg+PTApIGNsaXN0W3AtPmNvcHlpbmRleF09cDsKKworICAgIGNwX21hdHJpeD1icD1teW1hbGxvYyh2Y291bnQqY3NpemUpOworICAgIGhlYXBzaXplKz12Y291bnQqY3NpemU7CisgICAgbWVtc2V0KGNwX21hdHJpeCwwLHZjb3VudCpjc2l6ZSk7CisKKyAgICBmb3IoaT0wO2k8dmNvdW50O2krKyl7CisgICAgICBjb3BpZXNbaV09YnA7CisgICAgICBicCs9Y3NpemUvc2l6ZW9mKGJ2dHlwZSk7CisgICAgfQorCisgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJudW1lcmF0aW5nIGNvcGllcyBsb29wNFxuIik7CisgICAgZm9yKHA9Zmlyc3RfaWM7cDtwPXAtPm5leHQpeworICAgICAgICBpPXAtPmNvcHlpbmRleDsKKyAgICAgICAgaWYoaT49MCl7CisvKiAgICAgICAgICAgIGNsaXN0W2ldPXA7Ki8KKyAgICAgICAgICAgIHY9cC0+ei52OworICAgICAgICAgICAgbj12LT5pbmRleDsKKyAgICAgICAgICAgIGlmKHAtPnouZmxhZ3MmRFJFRk9CSikgbis9dmNvdW50LXJjb3VudDsKKyAgICAgICAgICAgIGlmKG48MHx8bj49dmNvdW50KQorCSAgICAgIGllcnJvcigwKTsKKyAgICAgICAgICAgIEJTRVQoY29waWVzW25dLGkpOworICAgICAgICAgICAgaWYodi0+bmVzdGluZz09MHx8di0+c3RvcmFnZV9jbGFzcz09RVhURVJOKSBCU0VUKGNwX2dsb2JhbHMsaSk7CisgICAgICAgICAgICBpZihwLT56LmZsYWdzJkRSRUZPQkopIEJTRVQoY3BfZHJlZnMsaSk7CisgICAgICAgICAgICBpZih2LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpIEJTRVQoY3Bfc3RhdGljcyxpKTsKKyAgICAgICAgICAgIGlmKHYtPmZsYWdzJlVTRURBU0FEUikgQlNFVChjcF9hZGRyZXNzLGkpOworICAgICAgICAgICAgdj1wLT5xMS52OworICAgICAgICAgICAgbj12LT5pbmRleDsKKyAgICAgICAgICAgIGlmKHAtPnExLmZsYWdzJkRSRUZPQkopIG4rPXZjb3VudC1yY291bnQ7CisgICAgICAgICAgICBpZihuPDB8fG4+PXZjb3VudCl7cHJpYzIoc3Rkb3V0LHApO3ByaW50Zigibj0lZFxuIixuKTsgaWVycm9yKDApO30KKyAgICAgICAgICAgIEJTRVQoY29waWVzW25dLGkpOworICAgICAgICAgICAgaWYodi0+bmVzdGluZz09MHx8di0+c3RvcmFnZV9jbGFzcz09RVhURVJOKSBCU0VUKGNwX2dsb2JhbHMsaSk7CisgICAgICAgICAgICBpZihwLT5xMS5mbGFncyZEUkVGT0JKKSBCU0VUKGNwX2RyZWZzLGkpOworICAgICAgICAgICAgaWYodi0+c3RvcmFnZV9jbGFzcz09U1RBVElDKSBCU0VUKGNwX3N0YXRpY3MsaSk7CisgICAgICAgICAgICBpZih2LT5mbGFncyZVU0VEQVNBRFIpIEJTRVQoY3BfYWRkcmVzcyxpKTsKKworICAgICAgICB9CisgICAgfQorICAgIGlmKERFQlVHJjIwNDgpeworICAgICAgICBwcmludGYoImNvcHkgaW5zdHJ1Y3Rpb25zOlxuIik7CisgICAgICAgIGZvcihpPTA7aTxjY291bnQ7aSsrKXsKKyAgICAgICAgICAgIHByaW50ZigiJTNkOiAiLGkpO3ByaWMyKHN0ZG91dCxjbGlzdFtpXSk7CisgICAgICAgICAgICAvKmlmKGNsaXN0W2ldLT5jb3B5aW5kZXghPWkpIGllcnJvcigwKTsqLworICAgICAgICB9CisgICAgfQorICAgIGlmKERFQlVHJjE2Mzg0KSBwcmludGYoIm51bV9jcCBoZWFwc2l6ZT0lbHVcbiIsaGVhcHNpemUpOworfQordm9pZCBwcmludF9jcChidnR5cGUgKmNwKQoreworICAgIGludCBpOworICAgIGlmKCFjcCkge3ByaW50ZigiYXZhaWxhYmxlIGNvcGllcyBub3QgYXZhaWxhYmxlXG4iKTtyZXR1cm47fQorICAgIGZvcihpPTA7aTxjY291bnQ7aSsrKQorICAgICAgICBpZihCVFNUKGNwLGkpKXtwcmludGYoIiUzZDogIixpKTtwcmljMihzdGRvdXQsY2xpc3RbaV0pO30KK30KK2ludCBjcHJvcChvYmogKm8saW50IHRhcmdldCx6bWF4IHNpemUpCisvKiAgZXJzZXR6dCBnZWdlYmVuZW5mYWxscyAgS29waWVuLCBub2NoIGFlbmRlcm4sIHNvIGRhc3MgUG9pbnRlciBpbiBEUkVGT0JKUyBlcnNldHp0IHdlcmRlbiB3aWUgYmVpIHRhcmdldCAqLworeworICBJQyAqcCwqZj0wO2ludCBpO1ZhciAqb2xkOworICBvbGQ9by0+djsKKyAgaT1vbGQtPmluZGV4OworICBpZighdGFyZ2V0JiYoby0+ZmxhZ3MmRFJFRk9CSikpIGkrPXZjb3VudC1yY291bnQ7CisgIGlmKGk8MHx8aT49dmNvdW50KSBpZXJyb3IoMCk7CisgIG1lbWNweSh0bXAsY3BfYWN0LGNzaXplKTsKKyAgYnZpbnRlcnNlY3QodG1wLGNvcGllc1tpXSxjc2l6ZSk7CisgIC8qICB3YWVocmVuZCBkaWVzZW0gRHVyY2hsYXVmIGdlYWVuZGVydGUgS29waWVyYW53ZWlzdW5nZW4gbGllYmVyIG5pY2h0ICovCisgIC8qICBiZWFjaHRlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGJ2ZGlmZih0bXAsY3BfZGVzdCxjc2l6ZSk7CisgIGZvcihpPTA7aTxjY291bnQ7aSsrKXsKKyAgICBpZihCVFNUKHRtcCxpKSl7CisgICAgICBwPWNsaXN0W2ldOworICAgICAgaWYocC0+ei52PT1vLT52CisJICYmKHptZXF0byhzaXplLGwyem0oMEwpKXx8em1lcXRvKHNpemUscC0+cTIudmFsLnZtYXgpKQorCSAmJnAtPnExLnYhPW8tPnYmJnptZXF0byhwLT56LnZhbC52bWF4LG8tPnZhbC52bWF4KQorCSAmJihJU1NDQUxBUihvLT52LT52dHlwLT5mbGFncyl8fChwLT50eXBmJk5RKT09KG8tPnYtPnZ0eXAtPmZsYWdzJk5RKSkKKwkgJiYhbXVzdF9jb252ZXJ0KHAtPnR5cGYsby0+di0+dnR5cC0+ZmxhZ3MsMCkKKwkgJiYhaXNfdm9sYXRpbGVfaWMocCkKKwkgKXsKKwlpZigoKG8tPmZsYWdzJkRSRUZPQkopJiYhKHAtPnExLmZsYWdzJkRSRUZPQkopKXx8IShwLT5xMS5mbGFncyZEUkVGT0JKKSYmKCFzdGF0aWNfY3NlfHwhKChwLT5xMS5mbGFncyYoVkFSfFZBUkFEUikpPT1WQVIpfHwocC0+cTEudi0+c3RvcmFnZV9jbGFzcyE9RVhURVJOJiZwLT5xMS52LT5zdG9yYWdlX2NsYXNzIT1TVEFUSUMpKSl7CisJICBpbnQgbWR0eXA7CisJICBpZihERUJVRyYxMDI0KXsgcHJpbnRmKCJjYW4gcmVwbGFjZSA8JXM+IGJ5IGNvcHk6XG4iLG8tPnYtPmlkZW50aWZpZXIpO3ByaWMyKHN0ZG91dCxjbGlzdFtpXSk7fQorCSAgcC0+cTEuZmxhZ3MmPX5TQ1JBVENIOworCSAgbWR0eXA9by0+ZHR5cDsKKyAgICAgICAgICAvKiBNYXliZSBpdCB3b3VsZCBiZSBtb3JlIHByZWNpc2UgdG8gcmVjYWxjdWxhdGUgYWxsIChEKU5PVFRZUEVTQUZFCisgICAgICAgICAgICAgaW5mbyBhZnRlcndhcmRzICovCisgICAgICAgICAgaWYoby0+di0+ZmxhZ3MmTk9UVFlQRVNBRkUpeworICAgICAgICAgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8VkFSQURSKSk9PVZBUikKKyAgICAgICAgICAgICAgcC0+cTEudi0+ZmxhZ3N8PU5PVFRZUEVTQUZFOworICAgICAgICAgIH0KKyAgICAgICAgICBpZihvLT52LT5mbGFncyZETk9UVFlQRVNBRkUpeworICAgICAgICAgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8VkFSQURSKSk9PVZBUikKKyAgICAgICAgICAgICAgcC0+cTEudi0+ZmxhZ3N8PUROT1RUWVBFU0FGRTsKKyAgICAgICAgICB9CisJICAqbz1wLT5xMTsKKwkgIGlmKHRhcmdldCl7CisJICAgIG8tPmZsYWdzfD1EUkVGT0JKOworCSAgICBvLT5kdHlwPW1kdHlwOworCSAgICBpZigoby0+ZmxhZ3MmKFZBUkFEUnxEUkVGT0JKKSk9PShWQVJBRFJ8RFJFRk9CSikpCisJICAgICAgby0+ZmxhZ3MmPX4oVkFSQURSfERSRUZPQkopOworCSAgICB1cGRhdGVfYWxpYXMob2xkLG8tPnYpOworCSAgICAvKiAgV2VubiBlaW5lIFZhcmlhYmxlLCBkYWR1cmNoIHp1IGVpbmVyIERSRUYtVmFyaWFibGUgICovCisJICAgIC8qICB3aXJkLCBtdXNzIG51bV92YXJzIHNwYWV0ZXIgZXJuZXV0IGdlbWFjaHQgd2VyZGVuICAgKi8KKwkgICAgaWYoby0+di0+aW5kZXg+PXJjb3VudCl7CisJICAgICAgaWVycm9yKDApOworI2lmIDAKKwkgICAgICB1cGRhdGVfYWxpYXMob2xkLG8tPnYpOworCSAgICAgIHJldHVybiAyOworI2VuZGlmCisJICAgIH0KKwkgIH0KKwkgIHJldHVybiAxOworCX0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CitpbnQgY29weV9wcm9wYWdhdGlvbihmbG93Z3JhcGggKmZnLGludCBnbG9iYWwpCisvKiAgZ2lidCBLb3BpZW4gd2VpdGVyICAqLworeworICAgIGZsb3dncmFwaCAqZzsgb2JqIG9sZDtpbnQgb3I7CisgICAgSUMgKnA7VmFyICp2O2ludCBpLGNoYW5nZWQscixqOworICAgIGlmKERFQlVHJjEwMjQpIHByaW50Zigic2VhcmNoaW5nIGNvcGllc1xuIik7CisgICAgY3BfYWN0PW15bWFsbG9jKGNzaXplKTsKKyAgICBjcF9kZXN0PW15bWFsbG9jKGNzaXplKTsKKyAgICBtZW1zZXQoY3BfZGVzdCwwLGNzaXplKTsKKyAgICB0bXA9bXltYWxsb2MoY3NpemUpOworICAgIGc9Zmc7Y2hhbmdlZD0wOworICAgIHdoaWxlKGcpeworICAgICAgICBpZighZ2xvYmFsKSBtZW1zZXQoY3BfYWN0LDAsY3NpemUpOyBlbHNlIG1lbWNweShjcF9hY3QsZy0+Y3BfaW4sY3NpemUpOworICAgICAgICBwPWctPnN0YXJ0OworICAgICAgICB3aGlsZShwKXsKKyAgICAgICAgICAgIHptYXggc2l6ZTsKKyAgICAgICAgICAgIGlmKHAtPmNvZGU9PUFTU0lHTnx8cC0+Y29kZT09UFVTSCkgc2l6ZT1wLT5xMi52YWwudm1heDsKKyAgICAgICAgICAgICAgICBlbHNlIHNpemU9bDJ6bSgwTCk7CisvKiAgICAgICAgICAgIHByaW50X2NwKGNwX2FjdCk7IHByaWMyKHN0ZG91dCxwKTsqLworICAgICAgICAgICAgcj0wOworICAgICAgICAgICAgaWYocC0+Y29kZSE9QUREUkVTUyYmcC0+Y29kZSE9Tk9QKXsKKyAgICAgICAgICAgICAgICBpZigocC0+cTEuZmxhZ3MmKFZBUnxWQVJBRFIpKT09VkFSKXsKKyAgICAgICAgICAgICAgICAgICAgcnw9Y3Byb3AoJnAtPnExLDAsc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmKHAtPnExLmZsYWdzJkRSRUZPQkopIHJ8PWNwcm9wKCZwLT5xMSwxLDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZigocC0+cTIuZmxhZ3MmKFZBUnxWQVJBRFIpKT09VkFSKXsKKyAgICAgICAgICAgICAgICAvKiAgcGFzc3QgYXVmLCBkYXNzIFVTRVEyQVNaIG5pY2h0IHZlcmxldHp0IHdpcmQsIGlzdCBkYWJlaSAqLworICAgICAgICAgICAgICAgIC8qICBhYmVyIG5pY2h0IHNlaHIgZWZmaXppZW50IChldnRsLiBrb2VubnRlIGtvbW11dGllcnQgICAgICovCisgICAgICAgICAgICAgICAgLyogIHdlcmRlbiwgby5hZS4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYoIVVTRVEyQVNaKXsgb2xkPXAtPnEyO29yPXI7fQorICAgICAgICAgICAgICAgICAgICByfD1jcHJvcCgmcC0+cTIsMCxzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYocC0+cTIuZmxhZ3MmRFJFRk9CSikgcnw9Y3Byb3AoJnAtPnEyLDEsMCk7CisgICAgICAgICAgICAgICAgICAgIGlmKCFVU0VRMkFTWiYmIWNvbXBhcmVfb2JqcygmcC0+cTIsJnAtPnoscC0+dHlwZikpeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJjb3B5IHByb3BhZ2F0aW9uIHRha2VuIGJhY2ssIGJlY2F1c2Ugb2YgVVNFUTJBU1pcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcC0+cTI9b2xkOworICAgICAgICAgICAgICAgICAgICAgICAgcj1vcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZigocC0+ei5mbGFncyYoVkFSfFZBUkFEUnxEUkVGT0JKKSk9PShWQVJ8RFJFRk9CSikpeworICAgICAgICAgICAgICAgIC8qICBwYXNzdCBhdWYsIGRhc3MgVVNFUTJBU1ogbmljaHQgdmVybGV0enQgd2lyZCwgaXN0IGRhYmVpICovCisgICAgICAgICAgICAgICAgLyogIGFiZXIgbmljaHQgc2VociBlZmZpemllbnQgKGV2dGwuIGtvZW5udGUga29tbXV0aWVydCAgICAgKi8KKyAgICAgICAgICAgICAgICAvKiAgd2VyZGVuLCBvLmFlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZighVVNFUTJBU1opeyBvbGQ9cC0+ejtvcj1yO30KKyAgICAgICAgICAgICAgICAgICAgcnw9Y3Byb3AoJnAtPnosMSwwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIVVTRVEyQVNaJiYhY29tcGFyZV9vYmpzKCZwLT5xMiwmcC0+eixwLT50eXBmKSl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihERUJVRyYxMDI0KSBwcmludGYoImNvcHkgcHJvcGFnYXRpb24gdGFrZW4gYmFjaywgYmVjYXVzZSBvZiBVU0VRMkFTWlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwLT56PW9sZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHI9b3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihyJiZwLT5jb3B5aW5kZXg+PTApIEJTRVQoY3BfZGVzdCxwLT5jb3B5aW5kZXgpOworICAgICAgICAgICAgY2hhbmdlZHw9cjsKKworICAgICAgICAgICAgZm9yKGo9MDtqPHAtPmNoYW5nZV9jbnQ7aisrKXsKKyAgICAgICAgICAgICAgICBpPXAtPmNoYW5nZV9saXN0W2pdLnYtPmluZGV4OworICAgICAgICAgICAgICAgIGlmKHAtPmNoYW5nZV9saXN0W2pdLmZsYWdzJkRSRUZPQkopIGkrPXZjb3VudC1yY291bnQ7CisgICAgICAgICAgICAgICAgaWYoaT49dmNvdW50KSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBidmRpZmYoY3BfYWN0LGNvcGllc1tpXSxjc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihwLT5jb3B5aW5kZXg+PTApIEJTRVQoY3BfYWN0LHAtPmNvcHlpbmRleCk7CisKKyAgICAgICAgICAgIGlmKHA9PWctPmVuZCkgYnJlYWs7CisgICAgICAgICAgICBwPXAtPm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgZz1nLT5ub3JtYWxvdXQ7CisgICAgfQorICAgIGZyZWUoY3BfYWN0KTsKKyAgICBmcmVlKGNwX2Rlc3QpOworICAgIGZyZWUodG1wKTsKKyAgICBmcmVlKGNsaXN0KTsKKyAgICBmcmVlKGNwX2dsb2JhbHMpOworICAgIGZyZWUoY3Bfc3RhdGljcyk7CisgICAgZnJlZShjcF9hZGRyZXNzKTsKKyAgICBmcmVlKGNwX2RyZWZzKTsKKyAgICBmcmVlKGNwX21hdHJpeCk7CisgICAgZnJlZShjb3BpZXMpOworICAgIGdjaGFuZ2VkfD1jaGFuZ2VkOworICAgIHJldHVybiBjaGFuZ2VkOworfQorCmRpZmYgLS1naXQgYS9jc2UuYyBiL2NzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxODBkM2QKLS0tIC9kZXYvbnVsbAorKysgYi9jc2UuYwpAQCAtMCwwICsxLDQxMSBAQAorLyogICRWRVI6IHZiY2MgKGNzZS5jKSAkUmV2aXNpb246IDEuMTEgJCAgICAqLworLyogIHZlcmZ1ZWdiYXJlIEF1c2RydWVja2UgdW5kIGNvbW1vbiBzdWJleHByZXNzaW9uIGVsaW1pbmF0aW9uICovCisKKyNpbmNsdWRlICJvcHQuaCIKKworc3RhdGljIGNoYXIgRklMRV9bXT1fX0ZJTEVfXzsKKworLyogIGZ1ZXIgdmVyZnVlZ2JhcmUgQXVzZHJ1ZWNrZSAqLworSUMgKiplbGlzdDsKK3Vuc2lnbmVkIGludCBlY291bnQ7CitzaXplX3QgZXNpemU7CitidnR5cGUgKmFlX2dsb2JhbHMsKmFlX3N0YXRpY3MsKmFlX2FkZHJlc3MsKmFlX2RyZWZzOworYnZ0eXBlICoqYWVfa2lsbHM7CisKK3N0YXRpYyBidnR5cGUgKmNzZV9tYXRyaXg7CisKK3ZvaWQgYXZhaWxhYmxlX2V4cHJlc3Npb25zKGZsb3dncmFwaCAqZmcpCisvKiAgYmVyZWNobmV0IGRpZSB2ZXJmdWVnYmFyZW4gQXVzZHJ1ZWNrZSBmdWVyIGplZGVuIEJsb2NrICAgICAgKi8KK3sKKyAgICBmbG93Z3JhcGggKmc7SUMgKnA7YnZ0eXBlICp0bXA7CisgICAgaW50IGNoYW5nZWQscGFzcyxpLGo7CisgICAgdW5zaWduZWQgbG9uZyBoZWFwc2l6ZT0wOworICAgIC8qICBhZV9nZW4gdW5kIGFlX2tpbGwgZnVlciBqZWRlbiBCbG9jayBiZXJlY2huZW4gICAqLworICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiYW5hbHlzaW5nIGF2YWlsYWJsZSBleHByZXNzaW9uc1xuIik7CisgICAgdG1wPW15bWFsbG9jKGVzaXplKTsKKyAgICBoZWFwc2l6ZSs9ZXNpemU7CisgICAgZz1mZzsKKyAgICB3aGlsZShnKXsKKyAgICAgICAgZy0+YWVfaW49bXltYWxsb2MoZXNpemUpOworICAgICAgICBtZW1zZXQoZy0+YWVfaW4sMCxlc2l6ZSk7CisgICAgICAgIGctPmFlX291dD1teW1hbGxvYyhlc2l6ZSk7CisgICAgICAgIG1lbXNldChnLT5hZV9vdXQsMCxlc2l6ZSk7CisgICAgICAgIGctPmFlX2dlbj1teW1hbGxvYyhlc2l6ZSk7CisgICAgICAgIG1lbXNldChnLT5hZV9nZW4sMCxlc2l6ZSk7CisgICAgICAgIGctPmFlX2tpbGw9bXltYWxsb2MoZXNpemUpOworICAgICAgICBtZW1zZXQoZy0+YWVfa2lsbCwwLGVzaXplKTsKKwloZWFwc2l6ZSs9NCplc2l6ZTsKKyAgICAgICAgcD1nLT5lbmQ7CisgICAgICAgIHdoaWxlKHApeworICAgICAgICAgICAgbWVtc2V0KHRtcCwwLGVzaXplKTsKKyAgICAgICAgICAgIGZvcihqPTA7ajxwLT5jaGFuZ2VfY250O2orKyl7CisgICAgICAgICAgICAgICAgaT1wLT5jaGFuZ2VfbGlzdFtqXS52LT5pbmRleDsKKyAgICAgICAgICAgICAgICBpZihwLT5jaGFuZ2VfbGlzdFtqXS5mbGFncyZEUkVGT0JKKSBpKz12Y291bnQtcmNvdW50OworICAgICAgICAgICAgICAgIGlmKGk+PXZjb3VudCkgY29udGludWU7CisgICAgICAgICAgICAgICAgYnZ1bml0ZSh0bXAsYWVfa2lsbHNbaV0sZXNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnZkaWZmKHRtcCxnLT5hZV9nZW4sZXNpemUpOworICAgICAgICAgICAgYnZ1bml0ZShnLT5hZV9raWxsLHRtcCxlc2l6ZSk7CisgICAgICAgICAgICBpPXAtPmV4cGluZGV4OworICAgICAgICAgICAgaWYoaT49MCYmIUJUU1QoZy0+YWVfa2lsbCxpKSkgQlNFVChnLT5hZV9nZW4saSk7CisKKyAgICAgICAgICAgIGlmKHA9PWctPnN0YXJ0KSBicmVhazsKKyAgICAgICAgICAgIHA9cC0+cHJldjsKKyAgICAgICAgfQorICAgICAgICBpZihnPT1mZyl7CisgICAgICAgICAgICBtZW1zZXQoZy0+YWVfaW4sMCxlc2l6ZSk7CisgICAgICAgICAgICBtZW1jcHkoZy0+YWVfb3V0LGctPmFlX2dlbixlc2l6ZSk7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgbWVtc2V0KGctPmFlX291dCxVQ0hBUl9NQVgsZXNpemUpOworICAgICAgICAgICAgYnZkaWZmKGctPmFlX291dCxnLT5hZV9raWxsLGVzaXplKTsKKyAgICAgICAgfQorICAgICAgICBnPWctPm5vcm1hbG91dDsKKyAgICB9CisKKyAgICAvKiAgYWVfaW4gdW5kIGFlX291dCBmdWVyIGplZGVuIEJsb2NrIGJlcmVjaG5lbiAqLworICAgIC8qICBvdXQoYik9VS1nZW4oQikgdm9yaW5pdGlhbGlzaWVydCB1bmQgICAgICAgICovCisgICAgLyogIGluKEIwKT0wLCBvdXQoQjApPWdlbihCMCkgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZihERUJVRyYxMDI0KSB7cHJpbnRmKCJwYXNzOiIpO3Bhc3M9MDt9CisgICAgZG97CisgICAgICAgIGlmKERFQlVHJjEwMjQpIHtwcmludGYoIiAlZCIsKytwYXNzKTtmZmx1c2goc3Rkb3V0KTt9CisgICAgICAgIGNoYW5nZWQ9MDsKKyAgICAgICAgZz1mZy0+bm9ybWFsb3V0OyAgICAvKiAgaW4gQjAgYWVuZGVydCBzaWNoIG5pY2h0cyAgICovCisgICAgICAgIHdoaWxlKGcpeworICAgICAgICAgICAgZmxvd2xpc3QgKmxwOworICAgICAgICAgICAgLyogIGluKEIpPVNjaG5pdHQgb3V0KFApIG1pdCBQIFZvcmdhZW5nZXIgdm9uIEIgKi8KKyAgICAgICAgICAgIGxwPWctPmluOworICAgICAgICAgICAgaT0wOyAgICAvKiAgRmxhZyBmdWVyIGVyc3RlbiBWb3JnYWVuZ2VyICovCisgICAgICAgICAgICB3aGlsZShscCl7CisgICAgICAgICAgICAgICAgaWYoIWxwLT5ncmFwaCkgaWVycm9yKDApOworICAgICAgICAgICAgICAgIGlmKGxwLT5ncmFwaC0+YnJhbmNob3V0PT1nfHwhbHAtPmdyYXBoLT5lbmR8fGxwLT5ncmFwaC0+ZW5kLT5jb2RlIT1CUkEpeworICAgICAgICAgICAgICAgICAgICBpZihpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ2aW50ZXJzZWN0KGctPmFlX2luLGxwLT5ncmFwaC0+YWVfb3V0LGVzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZy0+YWVfaW4sbHAtPmdyYXBoLT5hZV9vdXQsZXNpemUpO2k9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBscD1scC0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qICBvdXQoYik9Z2VuKEIpIFUgKGluKEIpLWtpbGwoQikgICovCisgICAgICAgICAgICBtZW1jcHkodG1wLGctPmFlX2luLGVzaXplKTsKKyAgICAgICAgICAgIGJ2ZGlmZih0bXAsZy0+YWVfa2lsbCxlc2l6ZSk7CisgICAgICAgICAgICBidnVuaXRlKHRtcCxnLT5hZV9nZW4sZXNpemUpOworICAgICAgICAgICAgaWYoIWJ2Y21wKHRtcCxnLT5hZV9vdXQsZXNpemUpKXtjaGFuZ2VkPTE7bWVtY3B5KGctPmFlX291dCx0bXAsZXNpemUpO30KKyAgICAgICAgICAgIGc9Zy0+bm9ybWFsb3V0OworICAgICAgICB9CisgICAgfXdoaWxlKGNoYW5nZWQpOworICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiXG4iKTsKKyAgICBpZihERUJVRyYxNjM4NCkgcHJpbnRmKCJhdmFpbGFibGUgZXhwcmVzc2lvbnMgaGVhcHNpemU9JWx1XG4iLGhlYXBzaXplKTsKKyAgICBmcmVlKHRtcCk7Cit9CisKK2ludCBjb21wYXJlX29ianMob2JqICpvMSxvYmogKm8yLGludCB0KQorLyogIFZlcmdsZWljaHQgZGllIGJlaWRlbiBPYmpla3RlOyBsaWVmZXJ0IDAsIHdlbm4gc2llIGdsZWljaCBzaW5kLCBzb25zdCAgICovCisvKiAgMSBvZGVyIC0xLCB1bSBlaW5lIE9yZG51bmcgZGFyYXVmIHp1IGRlZmluaWVyZW4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgICBpbnQgaTEsaTI7CisgICAgaTE9bzEtPmZsYWdzJn5TQ1JBVENIO2kyPW8yLT5mbGFncyZ+U0NSQVRDSDsKKyAgICBpZihpMTxpMikgcmV0dXJuIC0xOworICAgIGlmKGkxPmkyKSByZXR1cm4gMTsKKyAgICBpZihpMSZEUkVGT0JKKXsKKyAgICAgIGlmKG8xLT5kdHlwPG8yLT5kdHlwKSByZXR1cm4gLTE7CisgICAgICBpZihvMS0+ZHR5cD5vMi0+ZHR5cCkgcmV0dXJuIDE7CisgICAgfQorICAgIGlmKGkxJktPTlNUKSByZXR1cm4oY29tcGFyZV9jb25zdCgmbzEtPnZhbCwmbzItPnZhbCx0KSk7CisgICAgaWYoaTEmVkFSKXsKKyAgICAgICAgaTE9bzEtPnYtPmluZGV4OyBpMj1vMi0+di0+aW5kZXg7CisgICAgICAgIGlmKGkxPGkyKSByZXR1cm4gLTE7CisgICAgICAgIGlmKGkxPmkyKSByZXR1cm4gMTsKKwlpZighem1lcXRvKG8xLT52YWwudm1heCxvMi0+dmFsLnZtYXgpKXsKKwkgIGlmKHptbGVxKG8xLT52YWwudm1heCxvMi0+dmFsLnZtYXgpKQorCSAgICByZXR1cm4gLTE7CisJICBlbHNlCisJICAgIHJldHVybiAxOworCX0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBjb21wYXJlX2V4cChjb25zdCB2b2lkICphMSxjb25zdCB2b2lkICphMikKKy8qICBTdHViIGZ1ZXIgY29tcGFyZV9vYmpzLCBkYW1pdCBhbHMgVmVyZ2xlaWNoc2Z1bmt0aW9uIGZ1ZXIgcXNvcnQgZ2VodCAqLworeworICAgIElDICpwMSwqcDI7aW50IGkxLGkyOworICAgIHAxPSooKElDICoqKWExKTtwMj0qKChJQyAqKilhMik7CisgICAgaWYoIXAxfHwhcDIpIGllcnJvcigwKTsKKyAgICBpMT1wMS0+Y29kZTsgaTI9cDItPmNvZGU7CisgICAgaWYoaTE8aTIpIHJldHVybiAtMTsKKyAgICBpZihpMT5pMikgcmV0dXJuIDE7CisgICAgaTE9cDEtPnR5cGYmKE5VfFZPTEFUSUxFfFNJR05FRF9DSEFSQUNURVIpOyBpMj1wMi0+dHlwZiYoTlV8Vk9MQVRJTEV8U0lHTkVEX0NIQVJBQ1RFUik7CisgICAgaWYoaTE8aTIpIHJldHVybiAtMTsKKyAgICBpZihpMT5pMikgcmV0dXJuIDE7CisgICAgaTE9Y29tcGFyZV9vYmpzKCZwMS0+cTEsJnAyLT5xMSxxMXR5cChwMSkpOworICAgIGlmKGkxKSByZXR1cm4gaTE7CisgICAgaTE9Y29tcGFyZV9vYmpzKCZwMS0+cTIsJnAyLT5xMixxMnR5cChwMSkpOworICAgIHJldHVybiBpMTsKK30KKwordm9pZCBwcmludF9hZShidnR5cGUgKmV4cCkKK3sKKyAgICBpbnQgaTsKKyAgICBpZighZXhwKXsgcHJpbnRmKCJhdmFpbGFibGUgZXhwcmVzc2lvbnMgbm90IGF2YWlsYWJsZVxuIik7IHJldHVybjt9CisgICAgZm9yKGk9MDtpPGVjb3VudDtpKyspCisgICAgICAgIGlmKEJUU1QoZXhwLGkpKQorICAgICAgICAgICAge3ByaW50ZigiJTNkLCUzZDogIixlbGlzdFtpXS0+ZXhwaW5kZXgsaSk7cHJpYzIoc3Rkb3V0LGVsaXN0W2ldKTt9Cit9Cit2b2lkIG51bV9leHAodm9pZCkKKy8qICBudW1lcmllcnQgZGllIEF1c2RydWVja2Ugc28sIGRhc3MgZ2xlaWNoZSBBdXNkcnVlY2tlIGRpZSBnbGVpY2hlICAgICovCisvKiAgbnVtbWVyIGVyaGFsdGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICAgIElDICpwO2ludCBjLGk7CisgICAgYnZ0eXBlICpicDsKKyAgICB1bnNpZ25lZCBsb25nIGhlYXBzaXplPTA7CisgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJudW1lcmF0aW5nIGV4cHJlc3Npb25zXG4iKTsKKyAgICBlY291bnQ9MDsKKyAgICBpZihERUJVRyYxMDI0KXsgcHJpbnRmKCJudW1fZXhwIGxvb3AxXG4iKTt9CisgICAgZm9yKHA9Zmlyc3RfaWM7cDtwPXAtPm5leHQpeworICAgICAgICBjPXAtPmNvZGU7CisgICAgICAgIGlmKHAtPnouZmxhZ3MmJnAtPnExLmZsYWdzJiYoYyE9QVNTSUdOfHwocC0+cTEuZmxhZ3MmRFJFRk9CSil8fChzdGF0aWNfY3NlJiYocC0+cTEuZmxhZ3MmKFZBUnxWQVJBRFIpKT09VkFSJiZJU1NDQUxBUihwLT5xMS52LT52dHlwLT5mbGFncykmJihwLT5xMS52LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk58fHAtPnExLnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQykpKSYmYyE9TU9WRVRPUkVHJiZjIT1NT1ZFRlJPTVJFRyl7CisgICAgICAgICAgICBwLT5leHBpbmRleD1lY291bnQrKzsKKyAgICAgICAgICAgIGlmKGM9PUFERHx8Yz09TVVMVHx8KGM+PU9SJiZjPD1BTkQpKXsKKyAgICAgICAgICAgICAgICBpZihwLT5xMi5mbGFncyYmY29tcGFyZV9vYmpzKCZwLT5xMSwmcC0+cTIscC0+dHlwZik8MCYmKFVTRVEyQVNafHxjb21wYXJlX29ianMoJnAtPnExLCZwLT56LHAtPnR5cGYpKSl7CisgICAgICAgICAgICAgICAgICAgIG9iaiBvOworICAgICAgICAgICAgICAgICAgICBvPXAtPnExO3AtPnExPXAtPnEyO3AtPnEyPW87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZSBwLT5leHBpbmRleD0tMTsKKyAgICB9CisgICAgZWxpc3Q9bXltYWxsb2MoZWNvdW50KnNpemVvZihJQyAqKSk7CisgICAgaGVhcHNpemUrPWVjb3VudCpzaXplb2YoSUMgKik7CisgICAgaWYoREVCVUcmMTAyNCl7IHByaW50ZigibnVtX2V4cCBsb29wMlxuIik7fQorICAgIGZvcihwPWZpcnN0X2ljO3A7cD1wLT5uZXh0KXsKKyAgICAgICAgaWYocC0+ZXhwaW5kZXg+PTApeworICAgICAgICAgICAgZWxpc3RbcC0+ZXhwaW5kZXhdPXA7CisgICAgICAgIH0KKyAgICB9CisgICAgLyplc2l6ZT0oZWNvdW50K0NIQVJfQklULTEpL0NIQVJfQklUOyovCisgICAgZXNpemU9QlZTSVpFKGVjb3VudCk7CisgICAgaWYoREVCVUcmKDE2Mzg0fDEwMjQpKXsgcHJpbnRmKCIlbHUgZXhwcmVzc2lvbnMsIGVzaXplPSVsdVxuc29ydGluZyBleHByZXNzaW9uc1xuIiwodW5zaWduZWQgbG9uZyllY291bnQsKHVuc2lnbmVkIGxvbmcpZXNpemUpO30KKyAgICBpZihlY291bnQ+MSkgdnFzb3J0KGVsaXN0LGVjb3VudCxzaXplb2YoSUMgKiksY29tcGFyZV9leHApOworICAgIGlmKERFQlVHJjEwMjQpeyBwcmludGYoInJlbnVtYmVyaW5nIGV4cHJlc3Npb25zXG5udW1fZXhwIGxvb3AzXG4iKTt9CisgICAgaWYoZWNvdW50PjApeyAgIC8qICBBdWZwYXNzZW4sIGRhIGVjb3VudCB1bnNpZ25lZCEgICovCisgICAgICAgIGZvcihjPTA7YzxlY291bnQtMTtjKyspeworICAgICAgICAgICAgaWYoIWNvbXBhcmVfZXhwKCZlbGlzdFtjXSwmZWxpc3RbYysxXSkpCisgICAgICAgICAgICAgICAgZWxpc3RbYysxXS0+ZXhwaW5kZXg9ZWxpc3RbY10tPmV4cGluZGV4OworICAgICAgICB9CisgICAgfQorICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigicmUtc29ydGluZyBleHByZXNzaW9uc1xuIik7CisgICAgLyogIHdpZWRlciBpbiBkaWUgcmljaHRpZ2UgUmVpaGVuZm9sZ2UgYnJpbmdlbiAgKi8KKyAgICBmb3IocD1maXJzdF9pYztwO3A9cC0+bmV4dCkKKyAgICAgICAgaWYocC0+ZXhwaW5kZXg+PTApIGVsaXN0W3AtPmV4cGluZGV4XT1wOworICAgIGFlX2dsb2JhbHM9bXltYWxsb2MoZXNpemUpOworICAgIG1lbXNldChhZV9nbG9iYWxzLDAsZXNpemUpOworICAgIGFlX3N0YXRpY3M9bXltYWxsb2MoZXNpemUpOworICAgIG1lbXNldChhZV9zdGF0aWNzLDAsZXNpemUpOworICAgIGFlX2FkZHJlc3M9bXltYWxsb2MoZXNpemUpOworICAgIG1lbXNldChhZV9hZGRyZXNzLDAsZXNpemUpOworICAgIGFlX2RyZWZzPW15bWFsbG9jKGVzaXplKTsKKyAgICBtZW1zZXQoYWVfZHJlZnMsMCxlc2l6ZSk7CisgICAgaGVhcHNpemUrPWVzaXplOworICAgIGlmKERFQlVHJjEwMjQpeyBwcmludGYoIm51bV9leHAgbG9vcDRcbiIpO30KKyAgICBhZV9raWxscz1teW1hbGxvYyh2Y291bnQqc2l6ZW9mKGJ2dHlwZSAqKSk7CisgICAgaGVhcHNpemUrPXZjb3VudCpzaXplb2YoYnZ0eXBlICopOworICAgIGNzZV9tYXRyaXg9YnA9bXltYWxsb2ModmNvdW50KmVzaXplKTsKKyAgICBoZWFwc2l6ZSs9dmNvdW50KmVzaXplOworICAgIG1lbXNldChicCwwLHZjb3VudCplc2l6ZSk7CisgICAgZm9yKGM9MDtjPHZjb3VudDtjKyspeworICAgICAgICBhZV9raWxsc1tjXT1icDsKKwlicCs9ZXNpemUvc2l6ZW9mKGJ2dHlwZSk7CisgICAgfQorICAgIGlmKERFQlVHJjEwMjQpeyBwcmludGYoIm51bV9leHAgbG9vcDVcbiIpO30KKyAgICBmb3IoYz0wO2M8ZWNvdW50O2MrKyl7CisgICAgICAgIFZhciAqdjsKKy8qICAgICAgICBpZihjPGVjb3VudC0xJiZlbGlzdFtjXT09ZWxpc3RbYysxXSkgY29udGludWU7Ki8gIC8qICBnbGVpY2hlIHVlYmVyc3ByaW5nZW4gICAqLworICAgICAgICBwPWVsaXN0W2NdOworICAgICAgICBpZihwLT5jb2RlPT1BRERSRVNTKSBjb250aW51ZTsKKyAgICAgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8VkFSQURSKSk9PVZBUil7CisgICAgICAgICAgICB2PXAtPnExLnY7CisgICAgICAgICAgICBpPXYtPmluZGV4OworICAgICAgICAgICAgQlNFVChhZV9raWxsc1tpXSxjKTsKKyAgICAgICAgICAgIGlmKHAtPnExLmZsYWdzJkRSRUZPQkopeyBCU0VUKGFlX2tpbGxzW2krdmNvdW50LXJjb3VudF0sYyk7QlNFVChhZV9kcmVmcyxjKTt9CisgICAgICAgICAgICBpZih2LT5uZXN0aW5nPT0wfHx2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pIEJTRVQoYWVfZ2xvYmFscyxjKTsKKyAgICAgICAgICAgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQykgQlNFVChhZV9zdGF0aWNzLGMpOworICAgICAgICAgICAgaWYodi0+ZmxhZ3MmVVNFREFTQURSKSBCU0VUKGFlX2FkZHJlc3MsYyk7CisgICAgICAgIH0KKyAgICAgICAgaWYoKHAtPnEyLmZsYWdzJihWQVJ8VkFSQURSKSk9PVZBUil7CisgICAgICAgICAgICB2PXAtPnEyLnY7CisgICAgICAgICAgICBpPXYtPmluZGV4OworICAgICAgICAgICAgQlNFVChhZV9raWxsc1tpXSxjKTsKKyAgICAgICAgICAgIGlmKHAtPnEyLmZsYWdzJkRSRUZPQkopeyBCU0VUKGFlX2tpbGxzW2krdmNvdW50LXJjb3VudF0sYyk7QlNFVChhZV9kcmVmcyxjKTt9CisgICAgICAgICAgICBpZih2LT5uZXN0aW5nPT0wfHx2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pIEJTRVQoYWVfZ2xvYmFscyxjKTsKKyAgICAgICAgICAgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQykgQlNFVChhZV9zdGF0aWNzLGMpOworICAgICAgICAgICAgaWYodi0+ZmxhZ3MmVVNFREFTQURSKSBCU0VUKGFlX2FkZHJlc3MsYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoREVCVUcmMTYzODQpIHByaW50ZigibnVtX2V4cCBoZWFwc2l6ZT0lbHVcbiIsaGVhcHNpemUpOworfQordm9pZCBjc2VfcmVwbGFjZShmbG93Z3JhcGggKmcsSUMgKnAsSUMgKm8sVmFyICp2KQorLyogIGVyc2V0enQgZGllIGNzZSBiZWkgbyB6dSBwIG1pdCBWYXJpYWJsZSB2ICAgKi8KK3sKKyAgICBJQyAqbjsKKyAgICAvKiAgS29waWVyYW53ZWlzdW5nIGVyemV1Z2VuICAgICovCisgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJjc2VfcmVwbGFjZVxuIik7CisgICAgbj1uZXdfSUMoKTsKKyAgICBuLT5saW5lPW8tPmxpbmU7CisgICAgbi0+ZmlsZT1vLT5maWxlOworICAgIG4tPmNvZGU9QVNTSUdOOworICAgIG4tPnR5cGY9cC0+dHlwZjsKKyAgICBuLT5leHBpbmRleD1uLT5kZWZpbmRleD0tMTsgICAgCisgICAgbi0+cTIuZmxhZ3M9MDsKKyAgICBuLT5xMi52YWwudm1heD1zem9mKHYtPnZ0eXApOworICAgIG4tPnExLmZsYWdzPVZBUjsKKyAgICBuLT5xMS52PXY7CisgICAgbi0+cTEudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgbi0+ej1vLT56OworCisgICAgLyogIERpZSBLb3BpZXJhbndlaXN1bmcgYmVudXR6dCBob2VjaHN0ZW5zLCB3YXMgZGllIHVyc3BydWVuZ2xpY2hlICAqLworICAgIC8qICBPcGVyYXRpb24gYmVudXR6dCBoYXQrZGllIEhpbGZzdmFyaWFibGUgdW5kIGFlbmRlcnQgbnVyLCB3YXMgICAgKi8KKyAgICAvKiAgZGllIHVyc3BydWVuZ2xpY2hlIHZvcmhlciBnZWFlbmRlcnQgaGF0LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYoaGF2ZV9hbGlhcyl7CisgICAgICAgIG4tPnVzZV9jbnQ9by0+dXNlX2NudCsxOworICAgICAgICBuLT51c2VfbGlzdD1teW1hbGxvYyhuLT51c2VfY250KlZMUyk7CisgICAgICAgIG4tPnVzZV9saXN0WzBdLnY9djsKKyAgICAgICAgbi0+dXNlX2xpc3RbMF0uZmxhZ3M9MDsKKyAgICAgICAgbWVtY3B5KCZuLT51c2VfbGlzdFsxXSxvLT51c2VfbGlzdCxvLT51c2VfY250KlZMUyk7CisgICAgICAgIG4tPmNoYW5nZV9jbnQ9by0+Y2hhbmdlX2NudDsKKyAgICAgICAgbi0+Y2hhbmdlX2xpc3Q9by0+Y2hhbmdlX2xpc3Q7CisgICAgfQorICAgIC8qICBldnRsLiBGTHVzc2dyYXBoIGtvcnJpZ2llcmVuICAgICovCisgICAgaWYoZy0+ZW5kPT1vKSBnLT5lbmQ9bjsKKyAgICAvKiAgZWluZnVlZ2VuICAgKi8KKyAgICBpbnNlcnRfSUMobyxuKTsKKyAgICAvKiAgT3BlcmF0aW9uIGF1ZiBIaWxmc3ZhcmlhYmxlIHVtbGVua2VuICAgICovCisgICAgby0+ej1uLT5xMTsKKyAgICAvKiAgT3BlcmF0aW9uIGFlbmRlcnQgbnVuIG51ciBIaWxmc3ZhcmlhYmxlLiAgICovCisgICAgaWYoaGF2ZV9hbGlhcyl7CisgICAgICAgIC8qICBMaXN0ZSBuaWNodCBmcmVpZ2ViZW4sIGRhIHNpZSB1bWdlYm9nZW4gd2lyZC4gICAqLworICAgICAgICBvLT5jaGFuZ2VfY250PTE7CisgICAgICAgIG8tPmNoYW5nZV9saXN0PW15bWFsbG9jKFZMUyk7CisgICAgICAgIG8tPmNoYW5nZV9saXN0WzBdLnY9djsKKyAgICAgICAgby0+Y2hhbmdlX2xpc3RbMF0uZmxhZ3M9MDsKKyAgICB9CSAKK30KK3ZvaWQgY3NlX3NlYXJjaChmbG93Z3JhcGggKmcsSUMgKnAsSUMgKm8sVmFyICp2LGludCBnbG9iYWwsYnZ0eXBlICpibWspCisvKiAgc3VjaHQgZGllIFF1ZWxsZShuKSBmdWVyIGNvbW1vbiBzdWJleHByZXNzaW9uIHVuZCBlcnNldHp0IHNpZSAgICovCisvKiAgYm1rIGlzdCBCdWZmZXIsIHVtIHp1IG1lcmtlbiwgd2VsY2hlIEJsb2Vja2Ugc2Nob24gYmVzdWNodCBzaW5kICovCit7CisgICAgZmxvd2xpc3QgKmxwOworICAgIC8qICBMZXR6dGUgQmVyZWNobnVuZyBkZXMgQXVzZHJ1Y2tzIHN1Y2hlbiwgYmVnaW5uZW5kIGJlaSBvICovCisgICAgLyogIGJlaSBnbG9iYWwga2FubiBvIGF1Y2ggMCBzZWluISAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiY3NlX3NlYXJjaFxuIik7Ki8KKyAgICBpZihnbG9iYWwpeworICAgICAgICBpZihCVFNUKGJtayxnLT5pbmRleCkpIHJldHVybjsKKyAgICB9CisgICAgd2hpbGUobyYmby0+ZXhwaW5kZXghPXAtPmV4cGluZGV4KXsKKyAgICAgICAgaWYobz09Zy0+c3RhcnQpIGJyZWFrOworICAgICAgICBvPW8tPnByZXY7CisgICAgfQorICAgIGlmKCFvJiYhZ2xvYmFsKSBpZXJyb3IoMCk7CisgICAgaWYobyYmby0+ZXhwaW5kZXg9PXAtPmV4cGluZGV4KXsKKyAgICAgICAgaWYoIShvLT56LmZsYWdzJlZBUil8fG8tPnoudiE9dikKKyAgICAgICAgICAgIGNzZV9yZXBsYWNlKGcscCxvLHYpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKCFnbG9iYWwpIGllcnJvcigwKTsKKyAgICAvKiAgQmxvY2sgYWxzIGJlc3VjaHQgbWFya2llcmVuLCB3ZW5uIGVyIGR1cmNoc3VjaHQgd3VyZGUuIERlciAgKi8KKyAgICAvKiAgZXJzdGUgQmxvY2sgYmVpIGdsb2JhbGVyIFN1Y2hlIG11c3MgYmVhY2h0ZXQgd2VyZGVuIHVuZCAgICAgKi8KKyAgICAvKiAgRW5kbG9zc2NobGVpZmVuIHZlcm1pZWRlbiB3ZXJkZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZihvfHwhZy0+ZW5kKSBCU0VUKGJtayxnLT5pbmRleCk7CisgICAgbHA9Zy0+aW47CisgICAgd2hpbGUobHApeworICAgICAgICBpZighbHAtPmdyYXBoKSBpZXJyb3IoMCk7CisgICAgICAgIGlmKGxwLT5ncmFwaC0+YnJhbmNob3V0PT1nfHwhbHAtPmdyYXBoLT5lbmR8fGxwLT5ncmFwaC0+ZW5kLT5jb2RlIT1CUkEpeworICAgICAgICAgICAgY3NlX3NlYXJjaChscC0+Z3JhcGgscCxscC0+Z3JhcGgtPmVuZCx2LGdsb2JhbCxibWspOworICAgICAgICB9CisgICAgICAgIGxwPWxwLT5uZXh0OworICAgIH0KK30KKworaW50IGNzZShmbG93Z3JhcGggKmZnLGludCBnbG9iYWwpCisvKiAgY29tbW9uLXN1YmV4cHJlc3Npb24tZWxpbWluYXRpb247IHdlbm4gZ2xvYmFsPT0wIHdlcmRlbiBudXIgZWluemVsbmUgICAgKi8KKy8qICBCbG9lY2tlIGJldHJhY2h0ZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICAgIGZsb3dncmFwaCAqZztJQyAqcCwqbztpbnQgY2hhbmdlZCxpLGo7CisgICAgYnZ0eXBlICphZSwqZG9uZTtWYXIgKnY7dHlwZSAqbmV3OworICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiY29tbW9uLXN1YmV4cHJlc3Npb24tZWxpbWluYXRpb25cbiIpOworICAgIGNoYW5nZWQ9MDsKKyAgICBhZT1teW1hbGxvYyhlc2l6ZSk7CisgICAgaWYoZ2xvYmFsKXsKKyAgICAgIGRvbmU9bXltYWxsb2MoZXNpemUpOworICAgICAgbWVtc2V0KGRvbmUsMCxlc2l6ZSk7CisgICAgfWVsc2UKKyAgICAgIGRvbmU9MDsKKyAgICBmb3IoZz1mZztnO2c9Zy0+bm9ybWFsb3V0KXsKKyAgICAgICAgaWYoIWdsb2JhbCkgbWVtc2V0KGFlLDAsZXNpemUpOyBlbHNlIG1lbWNweShhZSxnLT5hZV9pbixlc2l6ZSk7CisgICAgICAgIHA9Zy0+c3RhcnQ7CisgICAgICAgIHdoaWxlKHApeworICAgICAgICAgICAgaT1wLT5leHBpbmRleDsKKwkgICAgLyogVE9ETzogY29ycmVjdGx5IGhhbmRsZSBLT05TVHxEUkVGT0JKIGluIGNoYW5nZV9saXN0IGFuZCBlbmFibGUgS09OU1R8RFJFRk9CSiAqLworICAgICAgICAgICAgaWYoaT49MCYmIWlzX3ZvbGF0aWxlX2ljKHApJiYocC0+cTEuZmxhZ3MmKEtPTlNUfERSRUZPQkopKSE9KEtPTlNUfERSRUZPQkopJiYocC0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKSE9KEtPTlNUfERSRUZPQkopKXsKKwkgICAgICBpZighZ2xvYmFsfHwhQlRTVChkb25lLGkpKXsKKwkgICAgICAgIGludCB0PXp0eXAocCk7CisgICAgICAgICAgICAgICAgaWYoaT49ZWNvdW50KSBpZXJyb3IoMCk7CisJCWlmKHAtPmNvZGU9PUFTU0lHTiYmIXptZXF0byhwLT5xMi52YWwudm1heCxzaXpldGFiW3QmTlFdKSkgdD1BUlJBWTsgLyogbm8gbWVtY3B5IElDcyAqLworICAgICAgICAgICAgICAgIGlmKEJUU1QoYWUsaSkmJklTU0NBTEFSKHQpJiYhKGVsaXN0W2ldLT5mbGFncyZFRkZfSUMpKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoREVCVUcmMTAyNCl7IHByaW50ZigiY2FuIGVsaW1pbmF0ZSBjb21tb24gc3ViZXhwcmVzc2lvbjpcbiIpO3ByaWMyKHN0ZG91dCxwKTt9CisgICAgICAgICAgICAgICAgICAgIC8qICBIaWxmc3ZhcmlhYmxlIGVyemV1Z2VuICAqLworICAgICAgICAgICAgICAgICAgICBuZXc9bmV3X3R5cCgpOworCQkgICAgbmV3LT5mbGFncz10OworICAgICAgICAgICAgICAgICAgICBpZihwLT5jb2RlPT1DT01QQVJFfHxwLT5jb2RlPT1URVNUKSBuZXctPmZsYWdzPTA7CisgICAgICAgICAgICAgICAgICAgIGlmKElTUE9JTlRFUihuZXctPmZsYWdzKSl7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXctPm5leHQ9bmV3X3R5cCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3LT5uZXh0LT5mbGFncz1WT0lEOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHY9YWRkX3RtcF92YXIobmV3KTsKKyAgICAgICAgICAgICAgICAgICAgdi0+aW5kZXg9LTE7CisgICAgICAgICAgICAgICAgICAgIC8qICBPcGVyYXRpb24gZHVyY2ggYXNzaWduIEhpbGZzdmFyaWFibGUgZXJzZXR6ZW4gICAqLworICAgICAgICAgICAgICAgICAgICBwLT5jb2RlPUFTU0lHTjsKKyAgICAgICAgICAgICAgICAgICAgcC0+dHlwZj1uZXctPmZsYWdzOworICAgICAgICAgICAgICAgICAgICBwLT5xMS5mbGFncz1WQVI7CisgICAgICAgICAgICAgICAgICAgIHAtPnExLnY9djsKKyAgICAgICAgICAgICAgICAgICAgcC0+cTEudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICAgICAgICAgICAgICAgIHAtPnEyLmZsYWdzPTA7CisgICAgICAgICAgICAgICAgICAgIHAtPnEyLnZhbC52bWF4PXN6b2YobmV3KTsKKyAgICAgICAgICAgICAgICAgICAgaWYoZ2xvYmFsKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ2dHlwZSAqYm1rO3NpemVfdCBic2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qYnNpemU9KGJhc2ljX2Jsb2NrcytDSEFSX0JJVCkvQ0hBUl9CSVQ7Ki8KKwkJCWJzaXplPUJWU0laRShiYXNpY19ibG9ja3MrMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBibWs9bXltYWxsb2MoYnNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGJtaywwLGJzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNzZV9zZWFyY2goZyxwLDAsdixnbG9iYWwsYm1rKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoYm1rKTsKKwkJCUJTRVQoZG9uZSxpKTsKKyAgICAgICAgICAgICAgICAgICAgfWVsc2UKKwkJICAgICAgY3NlX3NlYXJjaChnLHAscC0+cHJldix2LGdsb2JhbCwwKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlZD0xOworICAgICAgICAgICAgICAgICAgICBnY2hhbmdlZHw9MTsKKyAgICAgICAgICAgICAgICB9ZWxzZSBCU0VUKGFlLGkpOworCSAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcihqPTA7ajxwLT5jaGFuZ2VfY250O2orKyl7CisgICAgICAgICAgICAgICAgaT1wLT5jaGFuZ2VfbGlzdFtqXS52LT5pbmRleDsKKyAgICAgICAgICAgICAgICBpZihwLT5jaGFuZ2VfbGlzdFtqXS5mbGFncyZEUkVGT0JKKSBpKz12Y291bnQtcmNvdW50OworICAgICAgICAgICAgICAgIGlmKGk+PXZjb3VudCkgY29udGludWU7CisgICAgICAgICAgICAgICAgYnZkaWZmKGFlLGFlX2tpbGxzW2ldLGVzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHA9PWctPmVuZCkgYnJlYWs7CisgICAgICAgICAgICBwPXAtPm5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcmVlKGRvbmUpOworICAgIGZyZWUoYWUpOworICAgIGZyZWUoY3NlX21hdHJpeCk7CisgICAgZnJlZShhZV9raWxscyk7CisgICAgZnJlZShhZV9nbG9iYWxzKTsKKyAgICBmcmVlKGFlX3N0YXRpY3MpOworICAgIGZyZWUoYWVfYWRkcmVzcyk7CisgICAgZnJlZShhZV9kcmVmcyk7CisgICAgZnJlZShlbGlzdCk7CisKKyAgICByZXR1cm4gY2hhbmdlZDsKK30KZGlmZiAtLWdpdCBhL2RhdGF0eXBlcy9kYXRhdHlwZXMuaCBiL2RhdGF0eXBlcy9kYXRhdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NWNmNWEzCi0tLSAvZGV2L251bGwKKysrIGIvZGF0YXR5cGVzL2RhdGF0eXBlcy5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIGVsZW1lbnRhcnkgZGF0YSB0eXBlcyBjdXJyZW50bHkga25vd24gdG8gdmJjYyAqLworCisvKiB1bnNpZ25lZCA4Yml0IGJ5dGUgKi8KKyJTOEJVIiwgInN0YW5kYXJkIHVuc2lnbmVkIDhiaXQgYnl0ZSIsCisKKy8qIHNpZ25lZCA4Yml0IGJ5dGUgKi8KKyJTOEJTIiwgInN0YW5kYXJkIDItY29tcGxlbWVudCA4Yml0IGJ5dGUiLCAKKworLyogdHlwaWNhbCB1bnNpZ25lZCBpbnRlZ2VycywgYmlnLWVuZGlhbiAqLworIlMxNkJVQkUiLCAic3RhbmRhcmQgOGJpdC1ieXRlLWJhc2VkIHVuc2lnbmVkIDE2Yml0IHdvcmQsIGJpZy1lbmRpYW4iLAorIlMzMkJVQkUiLCAic3RhbmRhcmQgOGJpdC1ieXRlLWJhc2VkIHVuc2lnbmVkIDMyYml0IHdvcmQsIGJpZy1lbmRpYW4iLAorIlM2NEJVQkUiLCAic3RhbmRhcmQgOGJpdC1ieXRlLWJhc2VkIHVuc2lnbmVkIDY0Yml0IGJ5dGUsIGJpZy1lbmRpYW4iLAorCisvKiB0eXBpY2FsIHVuc2lnbmVkIGludGVnZXJzLCBsaXR0bGUtZW5kaWFuICovCisiUzE2QlVMRSIsICJzdGFuZGFyZCA4Yml0LWJ5dGUtYmFzZWQgdW5zaWduZWQgMTZiaXQgd29yZCwgbGl0dGxlLWVuZGlhbiIsCisiUzMyQlVMRSIsICJzdGFuZGFyZCA4Yml0LWJ5dGUtYmFzZWQgdW5zaWduZWQgMzJiaXQgd29yZCwgbGl0dGxlLWVuZGlhbiIsCisiUzY0QlVMRSIsICJzdGFuZGFyZCA4Yml0LWJ5dGUtYmFzZWQgdW5zaWduZWQgNjRiaXQgYnl0ZSwgbGl0dGxlLWVuZGlhbiIsCisKKy8qIHR5cGljYWwgc2lnbmVkIGludGVnZXJzLCBiaWctZW5kaWFuICovCisiUzE2QlNCRSIsICJzdGFuZGFyZCA4Yml0LWJ5dGUtYmFzZWQgMi1jb21wbGVtZW50IDE2Yml0IHdvcmQsIGJpZy1lbmRpYW4iLAorIlMzMkJTQkUiLCAic3RhbmRhcmQgOGJpdC1ieXRlLWJhc2VkIDItY29tcGxlbWVudCAzMmJpdCB3b3JkLCBiaWctZW5kaWFuIiwKKyJTNjRCU0JFIiwgInN0YW5kYXJkIDhiaXQtYnl0ZS1iYXNlZCAyLWNvbXBsZW1lbnQgNjRiaXQgd29yZCwgYmlnLWVuZGlhbiIsCisKKy8qIHR5cGljYWwgc2lnbmVkIGludGVnZXJzLCBsaXR0bGUtZW5kaWFuICovCisiUzE2QlNMRSIsICJzdGFuZGFyZCA4Yml0LWJ5dGUtYmFzZWQgMi1jb21wbGVtZW50IDE2Yml0IHdvcmQsIGxpdHRsZS1lbmRpYW4iLAorIlMzMkJTTEUiLCAic3RhbmRhcmQgOGJpdC1ieXRlLWJhc2VkIDItY29tcGxlbWVudCAzMmJpdCB3b3JkLCBsaXR0bGUtZW5kaWFuIiwKKyJTNjRCU0xFIiwgInN0YW5kYXJkIDhiaXQtYnl0ZS1iYXNlZCAyLWNvbXBsZW1lbnQgNjRiaXQgd29yZCwgbGl0dGxlLWVuZGlhbiIsCisKKy8qIHR5cGljYWwgSUVFRS1mbG9hdHMsIGJpZy1lbmRpYW4gKi8KKyJTMzJCSUVFRUJFIiwgInN0YW5kYXJkIDhiaXQtYnl0ZS1iYXNlZCAzMmJpdCBJRUVFIGZsb2F0aW5nLXBvaW50LCBiaWctZW5kaWFuIiwKKyJTNjRCSUVFRUJFIiwgInN0YW5kYXJkIDhiaXQtYnl0ZS1iYXNlZCA2NGJpdCBJRUVFIGZsb2F0aW5nLXBvaW50LCBiaWctZW5kaWFuIiwKKworLyogdHlwaWNhbCBJRUVFLWZsb2F0cywgbGl0dGxlLWVuZGlhbiAqLworIlMzMkJJRUVFTEUiLCAic3RhbmRhcmQgOGJpdC1ieXRlLWJhc2VkIDMyYml0IElFRUUgZmxvYXRpbmctcG9pbnQsIGxpdHRsZS1lbmRpYW4iLAorIlM2NEJJRUVFTEUiLCAic3RhbmRhcmQgOGJpdC1ieXRlLWJhc2VkIDY0Yml0IElFRUUgZmxvYXRpbmctcG9pbnQsIGxpdHRsZS1lbmRpYW4iLAorCmRpZmYgLS1naXQgYS9kYXRhdHlwZXMvZHRjb252LmggYi9kYXRhdHlwZXMvZHRjb252LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2ZlNmNkOAotLS0gL2Rldi9udWxsCisrKyBiL2RhdGF0eXBlcy9kdGNvbnYuaApAQCAtMCwwICsxLDIwIEBACisiUzE2QlNCRSIsIlMxNkJTTEUiLCJkdHN3YXAxNmYuYyIsImR0c3dhcDE2dC5jIiwyLAorIlMxNkJVQkUiLCJTMTZCVUxFIiwiZHRzd2FwMTZmLmMiLCJkdHN3YXAxNnQuYyIsMiwKKyJTMzJCU0JFIiwiUzMyQlNMRSIsImR0c3dhcDMyZi5jIiwiZHRzd2FwMzJ0LmMiLDQsCisiUzMyQlVCRSIsIlMzMkJVTEUiLCJkdHN3YXAzMmYuYyIsImR0c3dhcDMydC5jIiw0LAorIlM2NEJTQkUiLCJTNjRCU0xFIiwiZHRzd2FwNjRmLmMiLCJkdHN3YXA2NHQuYyIsOCwKKyJTNjRCVUJFIiwiUzY0QlVMRSIsImR0c3dhcDY0Zi5jIiwiZHRzd2FwNjR0LmMiLDgsCisiUzMyQklFRUVCRSIsIlMzMkJJRUVFTEUiLCJkdHN3YXAzMmYuYyIsImR0c3dhcDMydC5jIiw0LAorIlM2NEJJRUVFQkUiLCJTNjRCSUVFRUxFIiwiZHRzd2FwNjRmLmMiLCJkdHN3YXA2NHQuYyIsOCwKKyJTMTZCU0xFIiwiUzE2QlNCRSIsImR0c3dhcDE2Zi5jIiwiZHRzd2FwMTZ0LmMiLDIsCisiUzE2QlVMRSIsIlMxNkJVQkUiLCJkdHN3YXAxNmYuYyIsImR0c3dhcDE2dC5jIiwyLAorIlMzMkJTTEUiLCJTMzJCU0JFIiwiZHRzd2FwMzJmLmMiLCJkdHN3YXAzMnQuYyIsNCwKKyJTMzJCVUxFIiwiUzMyQlVCRSIsImR0c3dhcDMyZi5jIiwiZHRzd2FwMzJ0LmMiLDQsCisiUzY0QlNMRSIsIlM2NEJTQkUiLCJkdHN3YXA2NGYuYyIsImR0c3dhcDY0dC5jIiw4LAorIlM2NEJVTEUiLCJTNjRCVUJFIiwiZHRzd2FwNjRmLmMiLCJkdHN3YXA2NHQuYyIsOCwKKyJTMzJCSUVFRUxFIiwiUzMyQklFRUVCRSIsImR0c3dhcDMyZi5jIiwiZHRzd2FwMzJ0LmMiLDQsCisiUzY0QklFRUVMRSIsIlM2NEJJRUVFQkUiLCJkdHN3YXA2NGYuYyIsImR0c3dhcDY0dC5jIiw4LAorCisjaW5jbHVkZSAiZHR3aWR0aHMuaCIKKworCmRpZmYgLS1naXQgYS9kYXRhdHlwZXMvZHRmLmMgYi9kYXRhdHlwZXMvZHRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUzNmY0NgotLS0gL2Rldi9udWxsCisrKyBiL2RhdGF0eXBlcy9kdGYuYwpAQCAtMCwwICsxLDExIEBACitmcm9tKQoreworICBEVFRUWVBFIHRvPTA7CisgIGludCBpLGo9MDsKKyAgZm9yKGk9c2l6ZW9mKGZyb20uYSktMTtpPj0wO2ktLSkKKyAgICB0bz0odG88PDgpfChmcm9tLmFbaV0mMjU1KTsKKworICB0bzw8PShzaXplb2YodG8pKjgpLUJJVFNJWkU7CisgIHRvPj49KHNpemVvZih0bykqOCktQklUU0laRTsKKyAgcmV0dXJuIHRvOworfQpkaWZmIC0tZ2l0IGEvZGF0YXR5cGVzL2R0Z2VuLmMgYi9kYXRhdHlwZXMvZHRnZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MTNkMjBjCi0tLSAvZGV2L251bGwKKysrIGIvZGF0YXR5cGVzL2R0Z2VuLmMKQEAgLTAsMCArMSwzOTcgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpZm5kZWYgX19TVERDX1ZFUlNJT05fXworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIF9fU1REQ19WRVJTSU9OX18gMTk5OTAxTAorI2VuZGlmCisjZW5kaWYKKworc3RydWN0IGR0bGlzdCB7Y2hhciAqc3BlYywqZGVzY3I7fSBkdHNbXT17CisjaW5jbHVkZSAiZGF0YXR5cGVzLmgiCit9OworCitzdHJ1Y3QgZHRjb252bGlzdCB7Y2hhciAqZnJvbSwqdG8sKmZpbGVmLCpmaWxldDtpbnQgc2l6ZTt9IGNudnNbXT17CisjaW5jbHVkZSAiZHRjb252LmgiCit9OworCitpbnQgZHRjbnQ9c2l6ZW9mKGR0cykvc2l6ZW9mKGR0c1swXSk7CitpbnQgY252Y250PXNpemVvZihjbnZzKS9zaXplb2YoY252c1swXSk7CisKK3NpZ25lZCBjaGFyICpoYXZlOworCisjZGVmaW5lIENIQVIgMQorI2RlZmluZSBVQ0hBUiAyCisjZGVmaW5lIFNIT1JUIDMgCisjZGVmaW5lIFVTSE9SVCA0CisjZGVmaW5lIElOVCA1CisjZGVmaW5lIFVJTlQgNgorI2RlZmluZSBMT05HIDcKKyNkZWZpbmUgVUxPTkcgOAorI2RlZmluZSBMTE9ORyA5CisjZGVmaW5lIFVMTE9ORyAxMAorI2RlZmluZSBGTE9BVCAxMQorI2RlZmluZSBET1VCTEUgMTIKKyNkZWZpbmUgTERPVUJMRSAxMworI2RlZmluZSBQT0lOVEVSIDE0CisKKyNkZWZpbmUgVFlQRUNOVCBQT0lOVEVSCisKK2NoYXIgKnR5cGVuW1RZUEVDTlQrMV09eyJlcnJvciIsImNoYXIiLCJ1Y2hhciIsInNob3J0IiwidXNob3J0IiwiaW50IiwidWludCIsCisJCSAgICAgICAgImxvbmciLCJ1bG9uZyIsImxsb25nIiwidWxsb25nIiwiZmxvYXQiLCJkb3VibGUiLCJsZG91YmxlIiwKKwkJCSJwb2ludGVyIn07CitjaGFyICpmdHlwZW5bVFlQRUNOVCsxXT17ImVycm9yIiwiY2hhciIsInVuc2lnbmVkIGNoYXIiLCJzaG9ydCIsInVuc2lnbmVkIHNob3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQiLCJ1bnNpZ25lZCBpbnQiLCJsb25nIiwidW5zaWduZWQgbG9uZyIsCisJCQkgICAgICAgICAibG9uZyBsb25nIiwidW5zaWduZWQgbG9uZyBsb25nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbG9hdCIsImRvdWJsZSIsImxvbmcgZG91YmxlIiwKKwkJCSAgICAgICAgICJjaGFyICoifTsKKworaW50IGR0W1RZUEVDTlQrMV0sY252W1RZUEVDTlQrMV07CitjaGFyICpudFtUWVBFQ05UKzFdOworRklMRSAqZmluLCpjb3V0LCpob3V0OworaW50IGNyb3NzY29tcGlsZXI7CisKK3ZvaWQgKm15bWFsbG9jKHNpemVfdCBzaXplKQoreworICB2b2lkICpwPW1hbGxvYyhzaXplKTsKKyAgaWYoIXApeworICAgIHByaW50ZigiT3V0IG9mIG1lbW9yeSFcbiIpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorICByZXR1cm4gcDsKK30KKworI2RlZmluZSBURVNUVFlQRSh0eXBlLFZBTEEsVkFMQikgXAorICAgIGlmKHNpemVvZih0eXBlKSpDSEFSX0JJVD09Yml0cyl7XAorICAgICAgdHlwZSB0c3Q9VkFMQTtcCisgICAgICBpZihpc2xpdHRsZSYmKigodW5zaWduZWQgY2hhciAqKSZ0c3QpPT1WQUxCKVwKKyAgICAgICAgcmV0dXJuIHluPyJ5IjojdHlwZTtcCisgICAgICBpZihpc2JpZyYmKigoKHVuc2lnbmVkIGNoYXIgKikoJnRzdCsxKSktMSk9PVZBTEIpXAorCXJldHVybiB5bj8ieSI6I3R5cGU7XAorICAgIH1cCisKKworY2hhciAqeW5kZWZhdWx0KGNoYXIgKnNwZWMsaW50IHluKQoreworICBpbnQgaXNpZWVlPTAsaXN1bnNpZ25lZD0wLGlzc2lnbmVkLGlzbGl0dGxlPTAsaXNiaWc9MCxiaXRzPTA7CisgIGNoYXIgKm5vbmU7CisgIGlmKHluKSBub25lPSJuIjsgZWxzZSBub25lPSIiOworICBpZigqc3BlYysrIT0nUycpIHJldHVybiBub25lOworICB3aGlsZShpc2RpZ2l0KCoodW5zaWduZWQgY2hhciAqKXNwZWMpKQorICAgIGJpdHM9Yml0cyoxMCsqc3BlYysrLScwJzsKKyAgaWYoKnNwZWMrKyE9J0InKSByZXR1cm4gbm9uZTsKKyAgaWYoIXN0cm5jbXAoc3BlYywiSUVFRSIsNCkpCisgICAge2lzaWVlZT0xO3NwZWMrPTQ7fQorICBlbHNlIGlmKCpzcGVjPT0nVScpCisgICAge2lzdW5zaWduZWQ9MTtzcGVjKys7fQorICBlbHNlIGlmKCpzcGVjPT0nUycpCisgICAge2lzc2lnbmVkPTE7c3BlYysrO30KKyAgZWxzZQorICAgIHJldHVybiBub25lOworICBpZihzcGVjWzBdPT0nQicmJnNwZWNbMV09PSdFJykKKyAgICB7aXNiaWc9MTtzcGVjKys7fQorICBlbHNlIGlmKHNwZWNbMF09PSdMJyYmc3BlY1sxXT09J0UnKQorICAgIHtpc2xpdHRsZT0xO3NwZWMrKzt9CisgIGVsc2UKKyAgICBpc2xpdHRsZT1pc2JpZz0xOworICBpZihpc2llZWUpeworICAgIFRFU1RUWVBFKGZsb2F0LDEuMCwwKTsKKyAgICBURVNUVFlQRShkb3VibGUsMS4wLDApOworICAgIFRFU1RUWVBFKGxvbmcgZG91YmxlLDEuMCwwKTsKKyAgICByZXR1cm4gbm9uZTsKKyAgfQorICBpZihpc3Vuc2lnbmVkKXsKKyAgICBURVNUVFlQRSh1bnNpZ25lZCBjaGFyLDEyMywxMjMpOworICAgIFRFU1RUWVBFKHVuc2lnbmVkIHNob3J0LDEyMywxMjMpOworICAgIFRFU1RUWVBFKHVuc2lnbmVkIGludCwxMjMsMTIzKTsKKyAgICBURVNUVFlQRSh1bnNpZ25lZCBsb25nLDEyMywxMjMpOworI2lmIF9fU1REQ19WRVJTSU9OX189PTE5OTkwMUwKKyAgICBURVNUVFlQRSh1bnNpZ25lZCBsb25nIGxvbmcsMTIzLDEyMyk7CisjZW5kaWYKKyAgICByZXR1cm4gbm9uZTsKKyAgfQorICBpZihpc3NpZ25lZCl7CisgICAgVEVTVFRZUEUoc2lnbmVkIGNoYXIsMTIzLDEyMyk7CisgICAgVEVTVFRZUEUoc2lnbmVkIHNob3J0LDEyMywxMjMpOworICAgIFRFU1RUWVBFKHNpZ25lZCBpbnQsMTIzLDEyMyk7CisgICAgVEVTVFRZUEUoc2lnbmVkIGxvbmcsMTIzLDEyMyk7CisjaWYgX19TVERDX1ZFUlNJT05fXz09MTk5OTAxTAorICAgIFRFU1RUWVBFKHNpZ25lZCBsb25nIGxvbmcsMTIzLDEyMyk7CisjZW5kaWYKKyAgICByZXR1cm4gbm9uZTsKKyAgfQorICByZXR1cm4gbm9uZTsKK30KKworICAgIAoraW50IGFza3luKGNoYXIgKmRlZikKK3sKKyAgY2hhciBpbls4XTsKKyAgZG97CisgICAgcHJpbnRmKCJUeXBlIHkgb3IgbiBbJXNdOiAiLGRlZik7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgZmdldHMoaW4sc2l6ZW9mKGluKSxzdGRpbik7CisgICAgaWYoKmluPT0nXG4nKSBzdHJjcHkoaW4sZGVmKTsKKyAgfXdoaWxlKCppbiE9J3knJiYqaW4hPSduJyk7CisgIHJldHVybiAqaW49PSd5JzsKK30KKworY2hhciAqYXNrdHlwZShjaGFyICpkZWYpCit7CisgIGNoYXIgKmluPW15bWFsbG9jKDEyOCk7CisgIHByaW50ZigiRW50ZXIgdGhhdCB0eXBlWyVzXTogIixkZWYpOworICBmZmx1c2goc3Rkb3V0KTsKKyAgZmdldHMoaW4sMTI3LHN0ZGluKTsKKyAgaWYoaW5bc3RybGVuKGluKS0xXT09J1xuJykgaW5bc3RybGVuKGluKS0xXT0wOworICBpZighKmluKSBzdHJjcHkoaW4sZGVmKTsKKyAgcmV0dXJuIGluOworfQorCitpbnQgdHN0KGludCB0eXBlLGNoYXIgKnNwZWMpCit7CisgIGludCBpLGo7CisgIGZvcihpPTA7aTxkdGNudDtpKyspeworICAgIGlmKHN0cnN0cihzcGVjLGR0c1tpXS5zcGVjKSl7IAorICAgICAgaWYoaGF2ZVtpXT09LTIpIGNvbnRpbnVlOworICAgICAgaWYoaGF2ZVtpXT49MCl7CisvKiAJcHJpbnRmKCJhdXRvOiAlcyA9PSAlc1xuIixkdHNbaV0uc3BlYyxudFtoYXZlW2ldXSk7ICovCisJZHRbdHlwZV09aTsKKwludFt0eXBlXT1udFtoYXZlW2ldXTsKKwljbnZbdHlwZV09LTE7CisJcmV0dXJuIDE7CisgICAgICB9ZWxzZXsKKwlwcmludGYoIkRvZXMgeW91ciBzeXN0ZW0vY29tcGlsZXIgc3VwcG9ydCBhIHR5cGUgaW1wbGVtZW50ZWQgYXNcbiVzP1xuIixkdHNbaV0uZGVzY3IpOworCWlmKGFza3luKHluZGVmYXVsdChkdHNbaV0uc3BlYywxKSkpeworCSAgZHRbdHlwZV09aTsKKwkgIG50W3R5cGVdPWFza3R5cGUoeW5kZWZhdWx0KGR0c1tpXS5zcGVjLDApKTsKKwkgIGhhdmVbaV09dHlwZTsKKwkgIGNudlt0eXBlXT0tMTsKKwkgIHJldHVybiAxOworCX1lbHNleworCSAgaGF2ZVtpXT0tMjsKKwl9CisgICAgICB9CisgICAgfQorICB9CisgIGZvcihqPTA7ajxjbnZjbnQ7aisrKXsKKyAgICBjaGFyICpzPTA7CisgICAgaWYoc3Ryc3RyKHNwZWMsY252c1tqXS5mcm9tKSkgcz1jbnZzW2pdLnRvOworLyogICAgIGlmKHN0cnN0cihzcGVjLGNudnNbal0udG8pKSBzPWNudnNbal0uZnJvbTsgKi8KKyAgICBpZihzKXsKKyAgICAgIGZvcihpPTA7aTxkdGNudDtpKyspeworCWlmKCFzdHJjbXAocyxkdHNbaV0uc3BlYykpeworCSAgaWYoaGF2ZVtpXT09LTIpIGNvbnRpbnVlOworCSAgaWYoaGF2ZVtpXT49MCl7CisJICAgIGR0W3R5cGVdPWk7CisJICAgIG50W3R5cGVdPW50W2hhdmVbaV1dOworCSAgICBjbnZbdHlwZV09ajsKKwkgICAgcmV0dXJuIDI7CisJICB9ZWxzZXsKKwkgICAgcHJpbnRmKCJEb2VzIHlvdXIgc3lzdGVtL2NvbXBpbGVyIHN1cHBvcnQgYSB0eXBlIGltcGxlbWVudGVkIGFzXG4lcz9cbiIsZHRzW2ldLmRlc2NyKTsKKwkgICAgaWYoYXNreW4oeW5kZWZhdWx0KGR0c1tpXS5zcGVjLDEpKSl7CisJICAgICAgZHRbdHlwZV09aTsKKwkgICAgICBudFt0eXBlXT1hc2t0eXBlKHluZGVmYXVsdChkdHNbaV0uc3BlYywwKSk7CisJICAgICAgaGF2ZVtpXT10eXBlOworCSAgICAgIGNudlt0eXBlXT1qOworCSAgICAgIHJldHVybiAyOworCSAgICB9ZWxzZXsKKwkgICAgICBoYXZlW2ldPS0yOworCSAgICB9CisJICB9CisJfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKyAgICAKK2NoYXIgKmNhc3Rmcm9tKGludCB0eXBlKQoreworICBpZihjbnZbdHlwZV0+PTApeworICAgIGNoYXIgKnM9bXltYWxsb2MoMTYpOworICAgIHNwcmludGYocywiZHRjbnYlZGYiLHR5cGUpOworICAgIHJldHVybiBzOworICB9ZWxzZXsKKyAgICByZXR1cm4gIiI7CisgIH0KK30KK2NoYXIgKmNhc3R0byhpbnQgdHlwZSkKK3sKKyAgaWYoY252W3R5cGVdPj0wKXsKKyAgICBjaGFyICpzPW15bWFsbG9jKDE2KTsKKyAgICBzcHJpbnRmKHMsImR0Y252JWR0Iix0eXBlKTsKKyAgICByZXR1cm4gczsKKyAgfWVsc2V7CisgICAgcmV0dXJuICIiOworICB9Cit9IAordm9pZCBnZW5fY2FzdChjaGFyICpuYW1lLGludCBmcm9tLGludCB0bykKK3sKKyAgZnByaW50Zihob3V0LCIjZGVmaW5lICVzKHgpICVzKCglcyklcyh4KSlcbiIsbmFtZSxjYXN0dG8odG8pLG50W3RvXSxjYXN0ZnJvbShmcm9tKSk7Cit9Cit2b2lkIGdlbl8yb3AoY2hhciAqbmFtZSxjaGFyICpvcCxpbnQgdHlwZSkKK3sKKyAgZnByaW50Zihob3V0LCIjZGVmaW5lICVzKGEsYikgJXMoJXMoYSklcyVzKGIpKVxuIixuYW1lLGNhc3R0byh0eXBlKSxjYXN0ZnJvbSh0eXBlKSxvcCxjYXN0ZnJvbSh0eXBlKSk7Cit9IAordm9pZCBnZW5fMW9wKGNoYXIgKm5hbWUsY2hhciAqb3AsaW50IHR5cGUpCit7CisgIGZwcmludGYoaG91dCwiI2RlZmluZSAlcyhhKSAlcyglcyVzKGEpKVxuIixuYW1lLGNhc3R0byh0eXBlKSxvcCxjYXN0ZnJvbSh0eXBlKSk7Cit9IAordm9pZCBnZW5fY21wKGNoYXIgKm5hbWUsY2hhciAqb3AsaW50IHR5cGUpCit7CisgIGZwcmludGYoaG91dCwiI2RlZmluZSAlcyhhLGIpICglcyhhKSVzJXMoYikpXG4iLG5hbWUsY2FzdGZyb20odHlwZSksb3AsY2FzdGZyb20odHlwZSkpOworfSAKK2ludCBtYWluKGludCBhcmdjLGNoYXIgKiphcmd2KQoreworICBjaGFyIHR5cGVbMTI4XSxzcGVjWzEyOF07CisgIGludCBpLHI7CisgIGlmKGFyZ2MhPTQpeyBwcmludGYoIlVzYWdlOiBkdGdlbiA8Y29uZmlnLWZpbGU+IDxvdXRwdXQtZmlsZS5oPiA8b3V0cHV0LWZpbGUuYz5cbiIpO2V4aXQoRVhJVF9GQUlMVVJFKTt9CisvKiAgIHByaW50ZigiJWQgZGF0YXR5cGVzLCAlZCBjb252ZXJzaW9uc1xuIixkdGNudCxjbnZjbnQpOyAqLworICBoYXZlPW15bWFsbG9jKGR0Y250KnNpemVvZigqaGF2ZSkpOworICBtZW1zZXQoaGF2ZSwtMSxzaXplb2YoKmhhdmUpKmR0Y250KTsKKyAgZmluPWZvcGVuKGFyZ3ZbMV0sInIiKTsKKyAgaWYoIWZpbil7IHByaW50ZigiQ291bGQgbm90IG9wZW4gPCVzPiBmb3IgaW5wdXQhXG4iLGFyZ3ZbMV0pO2V4aXQoRVhJVF9GQUlMVVJFKTt9CisgIGhvdXQ9Zm9wZW4oYXJndlsyXSwidyIpOworICBpZighaG91dCl7IHByaW50ZigiQ291bGQgbm90IG9wZW4gPCVzPiBmb3Igb3V0cHV0IVxuIixhcmd2WzJdKTtleGl0KEVYSVRfRkFJTFVSRSk7fQorICBjb3V0PWZvcGVuKGFyZ3ZbM10sInciKTsKKyAgaWYoIWhvdXQpeyBwcmludGYoIkNvdWxkIG5vdCBvcGVuIDwlcz4gZm9yIG91dHB1dCFcbiIsYXJndlszXSk7ZXhpdChFWElUX0ZBSUxVUkUpO30KKyAgcHJpbnRmKCJBcmUgeW91IGJ1aWxkaW5nIGEgY3Jvc3MtY29tcGlsZXI/XG4iKTsKKyAgY3Jvc3Njb21waWxlcj1hc2t5bigieSIpOworICBmb3IoaT0xO2k8PVRZUEVDTlQ7aSsrKXsKKyAgICBmZ2V0cyhzcGVjLDEyNyxmaW4pOworLyogICAgIHByaW50ZigiU3BlY3MgZm9yIHolczpcbiVzXG4iLHR5cGVuW2ldLHNwZWMpOyAqLworICAgIGlmKCFjcm9zc2NvbXBpbGVyKXsKKyAgICAgIGR0W2ldPWk7CisgICAgICBudFtpXT1mdHlwZW5baV07CisgICAgICBoYXZlW2ldPWk7CisgICAgICBjbnZbaV09LTE7CisgICAgfWVsc2V7CisgICAgICBpZighdHN0KGksc3BlYykpeworCXByaW50ZigiUHJvYmxlbSEgWW91ciBzeXN0ZW0gZG9lcyBub3Qgc2VlbSB0byBwcm92aWRlIGFsbCBvZiB0aGUgZGF0YSB0eXBlc1xuIgorCSAgICAgICAidGhpcyB2ZXJzaW9uIG9mIHZiY2MgbmVlZHMuXG5Xcml0ZSB0byB2YkBjb21waWxlcnMuZGUhXG4iKTsKKwlleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICB9CisgICAgfQorICB9CisgIGZwcmludGYoaG91dCwiXG5cbi8qIE1hY2hpbmUgZ2VuZXJhdGVkIGZpbGUuIERPTidUIFRPVUNIIE1FISAqL1xuXG5cbiIpOworICBmcHJpbnRmKGNvdXQsIlxuXG4vKiBNYWNoaW5lIGdlbmVyYXRlZCBmaWxlLiBET04nVCBUT1VDSCBNRSEgKi9cblxuXG4iKTsKKyAgZnByaW50Zihob3V0LCIjaWZuZGVmIERUX0hcbiIpOworICBmcHJpbnRmKGhvdXQsIiNkZWZpbmUgRFRfSCAxXG4iKTsKKyAgZnByaW50Zihjb3V0LCIjaW5jbHVkZSBcImR0LmhcIlxuXG4iKTsKKyAgZm9yKGk9MTtpPD1UWVBFQ05UO2krKyl7CisgICAgaWYoY252W2ldPj0wKXsKKyAgICAgIGludCBiaXRzOworICAgICAgc3NjYW5mKGNudnNbY252W2ldXS5mcm9tLCJTJWRCIiwmYml0cyk7CisgICAgICBmcHJpbnRmKGhvdXQsInR5cGVkZWYgc3RydWN0IHtjaGFyIGFbJWRdO30gZHQlZGY7XG4iLGNudnNbY252W2ldXS5zaXplLGkpOworICAgICAgZnByaW50Zihob3V0LCJ0eXBlZGVmIGR0JWRmIHolcztcbiIsaSx0eXBlbltpXSk7CisgICAgICBmcHJpbnRmKGhvdXQsInR5cGVkZWYgJXMgZHQlZHQ7XG4iLG50W2ldLGkpOworICAgICAgZnByaW50Zihob3V0LCJkdCVkdCBkdGNudiVkZihkdCVkZik7XG4iLGksaSxpKTsKKyAgICAgIGZwcmludGYoaG91dCwiZHQlZGYgZHRjbnYlZHQoZHQlZHQpO1xuIixpLGksaSk7CisgICAgICBmcHJpbnRmKGNvdXQsIiN1bmRlZiBCSVRTSVpFXG4jZGVmaW5lIEJJVFNJWkUgJWRcbiIsYml0cyk7CisgICAgICBmcHJpbnRmKGNvdXQsIiN1bmRlZiBEVFRUWVBFXG4jZGVmaW5lIERUVFRZUEUgZHQlZHRcbiIsaSk7CisgICAgICBmcHJpbnRmKGNvdXQsIiN1bmRlZiBEVEZUWVBFXG4jZGVmaW5lIERURlRZUEUgZHQlZGZcbiIsaSk7CisgICAgICBmcHJpbnRmKGNvdXQsImR0JWR0IGR0Y252JWRmKGR0JWRmXG4iLGksaSxpKTsKKyAgICAgIGZwcmludGYoY291dCwiI2luY2x1ZGUgXCIlc1wiXG4iLGNudnNbY252W2ldXS5maWxlZik7CisgICAgICBmcHJpbnRmKGNvdXQsImR0JWRmIGR0Y252JWR0KGR0JWR0XG4iLGksaSxpKTsKKyAgICAgIGZwcmludGYoY291dCwiI2luY2x1ZGUgXCIlc1wiXG4iLGNudnNbY252W2ldXS5maWxldCk7CisgICAgfWVsc2V7CisgICAgICBmcHJpbnRmKGhvdXQsInR5cGVkZWYgJXMgeiVzO1xuIixudFtpXSx0eXBlbltpXSk7CisgICAgfQorICB9CisKKyAgZ2VuX2Nhc3QoInpjMnptIixDSEFSLExMT05HKTsKKyAgZ2VuX2Nhc3QoInpzMnptIixTSE9SVCxMTE9ORyk7CisgIGdlbl9jYXN0KCJ6aTJ6bSIsSU5ULExMT05HKTsKKyAgZ2VuX2Nhc3QoInpsMnptIixMT05HLExMT05HKTsKKyAgZ2VuX2Nhc3QoInpsbDJ6bSIsTExPTkcsTExPTkcpOworICBnZW5fY2FzdCgiem0yemMiLExMT05HLENIQVIpOworICBnZW5fY2FzdCgiem0yenMiLExMT05HLFNIT1JUKTsKKyAgZ2VuX2Nhc3QoInptMnppIixMTE9ORyxJTlQpOworICBnZW5fY2FzdCgiem0yemwiLExMT05HLExPTkcpOworICBnZW5fY2FzdCgiem0yemxsIixMTE9ORyxMTE9ORyk7CisKKyAgZ2VuX2Nhc3QoInp1YzJ6dW0iLFVDSEFSLFVMTE9ORyk7CisgIGdlbl9jYXN0KCJ6dXMyenVtIixVU0hPUlQsVUxMT05HKTsKKyAgZ2VuX2Nhc3QoInp1aTJ6dW0iLFVJTlQsVUxMT05HKTsKKyAgZ2VuX2Nhc3QoInp1bDJ6dW0iLFVMT05HLFVMTE9ORyk7CisgIGdlbl9jYXN0KCJ6dWxsMnp1bSIsVUxMT05HLFVMTE9ORyk7CisgIGdlbl9jYXN0KCJ6dW0yenVjIixVTExPTkcsVUNIQVIpOworICBnZW5fY2FzdCgienVtMnp1cyIsVUxMT05HLFVTSE9SVCk7CisgIGdlbl9jYXN0KCJ6dW0yenVpIixVTExPTkcsVUlOVCk7CisgIGdlbl9jYXN0KCJ6dW0yenVsIixVTExPTkcsVUxPTkcpOworICBnZW5fY2FzdCgienVtMnp1bGwiLFVMTE9ORyxVTExPTkcpOworCisgIGdlbl9jYXN0KCJ6dW0yem0iLFVMTE9ORyxMTE9ORyk7CisgIGdlbl9jYXN0KCJ6bTJ6dW0iLExMT05HLFVMTE9ORyk7CisgIGdlbl9jYXN0KCJ6ZjJ6bGQiLEZMT0FULExET1VCTEUpOworICBnZW5fY2FzdCgiemQyemxkIixET1VCTEUsTERPVUJMRSk7CisgIGdlbl9jYXN0KCJ6bGQyemYiLExET1VCTEUsRkxPQVQpOworICBnZW5fY2FzdCgiemxkMnpkIixMRE9VQkxFLERPVUJMRSk7CisgIGdlbl9jYXN0KCJ6bGQyem0iLExET1VCTEUsTExPTkcpOworICBnZW5fY2FzdCgiem0yemxkIixMTE9ORyxMRE9VQkxFKTsKKyAgZ2VuX2Nhc3QoInpsZDJ6dW0iLExET1VCTEUsVUxMT05HKTsKKyAgZ2VuX2Nhc3QoInp1bTJ6bGQiLFVMTE9ORyxMRE9VQkxFKTsKKyAgZ2VuX2Nhc3QoInpwMnp1bSIsUE9JTlRFUixVTExPTkcpOworICBnZW5fY2FzdCgienVtMnpwIixVTExPTkcsUE9JTlRFUik7CisgCisgIGZwcmludGYoaG91dCwiI2RlZmluZSBsMnptKHgpICVzKCglcykoeCkpXG4iLGNhc3R0byhMTE9ORyksbnRbTExPTkddKTsKKyAgZnByaW50Zihob3V0LCIjZGVmaW5lIHVsMnp1bSh4KSAlcygoJXMpKHgpKVxuIixjYXN0dG8oVUxMT05HKSxudFtVTExPTkddKTsKKyAgZnByaW50Zihob3V0LCIjZGVmaW5lIGQyemxkKHgpICVzKCglcykoeCkpXG4iLGNhc3R0byhMRE9VQkxFKSxudFtMRE9VQkxFXSk7CisgIGZwcmludGYoaG91dCwiI2RlZmluZSB6bTJsKHgpICgobG9uZyklcyh4KSlcbiIsY2FzdGZyb20oTExPTkcpKTsKKyAgZnByaW50Zihob3V0LCIjZGVmaW5lIHp1bTJ1bCh4KSAoKHVuc2lnbmVkIGxvbmcpJXMoeCkpXG4iLGNhc3Rmcm9tKFVMTE9ORykpOworICBmcHJpbnRmKGhvdXQsIiNkZWZpbmUgemxkMmQoeCkgKChkb3VibGUpJXMoeCkpXG4iLGNhc3Rmcm9tKExET1VCTEUpKTsKKworICBnZW5fMm9wKCJ6bWFkZCIsIisiLExMT05HKTsKKyAgZ2VuXzJvcCgienVtYWRkIiwiKyIsVUxMT05HKTsKKyAgZ2VuXzJvcCgiemxkYWRkIiwiKyIsTERPVUJMRSk7CisgIGdlbl8yb3AoInptc3ViIiwiLSIsTExPTkcpOworICBnZW5fMm9wKCJ6dW1zdWIiLCItIixVTExPTkcpOworICBnZW5fMm9wKCJ6bGRzdWIiLCItIixMRE9VQkxFKTsKKyAgZ2VuXzJvcCgiem1tdWx0IiwiKiIsTExPTkcpOworICBnZW5fMm9wKCJ6dW1tdWx0IiwiKiIsVUxMT05HKTsKKyAgZ2VuXzJvcCgiemxkbXVsdCIsIioiLExET1VCTEUpOworICBnZW5fMm9wKCJ6bWRpdiIsIi8iLExMT05HKTsKKyAgZ2VuXzJvcCgienVtZGl2IiwiLyIsVUxMT05HKTsKKyAgZ2VuXzJvcCgiemxkZGl2IiwiLyIsTERPVUJMRSk7CisgIGdlbl8yb3AoInptbW9kIiwiJSIsTExPTkcpOworICBnZW5fMm9wKCJ6dW1tb2QiLCIlIixVTExPTkcpOworICBnZW5fMm9wKCJ6bWxzaGlmdCIsIjw8IixMTE9ORyk7CisgIGdlbl8yb3AoInp1bWxzaGlmdCIsIjw8IixVTExPTkcpOworICBnZW5fMm9wKCJ6bXJzaGlmdCIsIj4+IixMTE9ORyk7CisgIGdlbl8yb3AoInp1bXJzaGlmdCIsIj4+IixVTExPTkcpOworICBnZW5fMm9wKCJ6bWFuZCIsIiYiLExMT05HKTsKKyAgZ2VuXzJvcCgienVtYW5kIiwiJiIsVUxMT05HKTsKKyAgZ2VuXzJvcCgiem1vciIsInwiLExMT05HKTsKKyAgZ2VuXzJvcCgienVtb3IiLCJ8IixVTExPTkcpOworICBnZW5fMm9wKCJ6bXhvciIsIl4iLExMT05HKTsKKyAgZ2VuXzJvcCgienVteG9yIiwiXiIsVUxMT05HKTsKKyAgZ2VuXzJvcCgiem1tb2QiLCIlIixMTE9ORyk7CisgIGdlbl8yb3AoInp1bW1vZCIsIiUiLFVMTE9ORyk7CisKKyAgZ2VuXzFvcCgiem1rb21wbCIsIn4iLExMT05HKTsKKyAgZ2VuXzFvcCgienVta29tcGwiLCJ+IixVTExPTkcpOworCisgIGdlbl9jbXAoInptbGVxIiwiPD0iLExMT05HKTsKKyAgZ2VuX2NtcCgienVtbGVxIiwiPD0iLFVMTE9ORyk7CisgIGdlbl9jbXAoInpsZGxlcSIsIjw9IixMRE9VQkxFKTsKKyAgZ2VuX2NtcCgiem1lcXRvIiwiPT0iLExMT05HKTsKKyAgZ2VuX2NtcCgienVtZXF0byIsIj09IixVTExPTkcpOworICBnZW5fY21wKCJ6bGRlcXRvIiwiPT0iLExET1VCTEUpOworCisgIGZwcmludGYoaG91dCwiI2VuZGlmXG4iKTsKKworICBmY2xvc2UoZmluKTsKKyAgZmNsb3NlKGhvdXQpOworICBmY2xvc2UoY291dCk7CisgIGZyZWUoaGF2ZSk7ICAKKyAgcmV0dXJuIDA7Cit9CisKKworCisKKworCmRpZmYgLS1naXQgYS9kYXRhdHlwZXMvZHRzd2FwMzJmLmMgYi9kYXRhdHlwZXMvZHRzd2FwMzJmLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDRlMDY0MAotLS0gL2Rldi9udWxsCisrKyBiL2RhdGF0eXBlcy9kdHN3YXAzMmYuYwpAQCAtMCwwICsxLDEzIEBACitmcm9tKQoreworICBEVFRUWVBFIHRvOworICB1bnNpZ25lZCBjaGFyICpmcD0oKHVuc2lnbmVkIGNoYXIgKikmZnJvbSkrMywqdHA9KHVuc2lnbmVkIGNoYXIgKikmdG87CisgICp0cCsrPSpmcC0tOworICAqdHArKz0qZnAtLTsKKyAgKnRwKys9KmZwLS07CisgICp0cCsrPSpmcC0tOworICByZXR1cm4gdG87Cit9CisKKyAgCQorCmRpZmYgLS1naXQgYS9kYXRhdHlwZXMvZHRzd2FwMzJ0LmMgYi9kYXRhdHlwZXMvZHRzd2FwMzJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzhmMjYzNwotLS0gL2Rldi9udWxsCisrKyBiL2RhdGF0eXBlcy9kdHN3YXAzMnQuYwpAQCAtMCwwICsxLDEzIEBACitmcm9tKQoreworICBEVEZUWVBFIHRvOworICB1bnNpZ25lZCBjaGFyICpmcD0oKHVuc2lnbmVkIGNoYXIgKikmZnJvbSkrMywqdHA9KHVuc2lnbmVkIGNoYXIgKikmdG87CisgICp0cCsrPSpmcC0tOworICAqdHArKz0qZnAtLTsKKyAgKnRwKys9KmZwLS07CisgICp0cCsrPSpmcC0tOworICByZXR1cm4gdG87Cit9CisKKyAgCQorCmRpZmYgLS1naXQgYS9kYXRhdHlwZXMvZHRzd2FwNjRmLmMgYi9kYXRhdHlwZXMvZHRzd2FwNjRmLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzhjYzc0YwotLS0gL2Rldi9udWxsCisrKyBiL2RhdGF0eXBlcy9kdHN3YXA2NGYuYwpAQCAtMCwwICsxLDE3IEBACitmcm9tKQoreworICBEVFRUWVBFIHRvOworICB1bnNpZ25lZCBjaGFyICpmcD0oKHVuc2lnbmVkIGNoYXIgKikmZnJvbSkrNywqdHA9KHVuc2lnbmVkIGNoYXIgKikmdG87CisgICp0cCsrPSpmcC0tOworICAqdHArKz0qZnAtLTsKKyAgKnRwKys9KmZwLS07CisgICp0cCsrPSpmcC0tOworICAqdHArKz0qZnAtLTsKKyAgKnRwKys9KmZwLS07CisgICp0cCsrPSpmcC0tOworICAqdHArKz0qZnAtLTsKKyAgcmV0dXJuIHRvOworfQorCisgIAkKKwpkaWZmIC0tZ2l0IGEvZGF0YXR5cGVzL2R0c3dhcDY0dC5jIGIvZGF0YXR5cGVzL2R0c3dhcDY0dC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZkMWQwYTMKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRhdHlwZXMvZHRzd2FwNjR0LmMKQEAgLTAsMCArMSwxNyBAQAorZnJvbSkKK3sKKyAgRFRGVFlQRSB0bzsKKyAgdW5zaWduZWQgY2hhciAqZnA9KCh1bnNpZ25lZCBjaGFyICopJmZyb20pKzcsKnRwPSh1bnNpZ25lZCBjaGFyICopJnRvOworICAqdHArKz0qZnAtLTsKKyAgKnRwKys9KmZwLS07CisgICp0cCsrPSpmcC0tOworICAqdHArKz0qZnAtLTsKKyAgKnRwKys9KmZwLS07CisgICp0cCsrPSpmcC0tOworICAqdHArKz0qZnAtLTsKKyAgKnRwKys9KmZwLS07CisgIHJldHVybiB0bzsKK30KKworICAJCisKZGlmZiAtLWdpdCBhL2RhdGF0eXBlcy9kdHQuYyBiL2RhdGF0eXBlcy9kdHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2IyZGU1Ci0tLSAvZGV2L251bGwKKysrIGIvZGF0YXR5cGVzL2R0dC5jCkBAIC0wLDAgKzEsMTEgQEAKK2Zyb20pCit7CisgRFRGVFlQRSB0bzsKKyBpbnQgaTsKKyBmcm9tJj0oKChEVFRUWVBFKTEpPDxCSVRTSVpFKS0xOworIGZvcihpPTA7aTxzaXplb2YodG8uYSk7aSsrKXsKKyAgIHRvLmFbaV09ZnJvbSYyNTU7CisgICBmcm9tPj49ODsKKyB9CisgcmV0dXJuIHRvOworfQpkaWZmIC0tZ2l0IGEvZGF0YXR5cGVzL2R0d2lkdGhzLmggYi9kYXRhdHlwZXMvZHR3aWR0aHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODRjNzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZGF0YXR5cGVzL2R0d2lkdGhzLmgKQEAgLTAsMCArMSwyNDAgQEAKKyJTMUJVIiwiUzhCVUxFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTMUJVIiwiUzhCVUJFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTMUJTIiwiUzhCU0xFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTMUJTIiwiUzhCU0JFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTMkJVIiwiUzhCVUxFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTMkJVIiwiUzhCVUJFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTMkJTIiwiUzhCU0xFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTMkJTIiwiUzhCU0JFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTM0JVIiwiUzhCVUxFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTM0JVIiwiUzhCVUJFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTM0JTIiwiUzhCU0xFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTM0JTIiwiUzhCU0JFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTNEJVIiwiUzhCVUxFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTNEJVIiwiUzhCVUJFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTNEJTIiwiUzhCU0xFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTNEJTIiwiUzhCU0JFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTNUJVIiwiUzhCVUxFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTNUJVIiwiUzhCVUJFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTNUJTIiwiUzhCU0xFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTNUJTIiwiUzhCU0JFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTNkJVIiwiUzhCVUxFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTNkJVIiwiUzhCVUJFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTNkJTIiwiUzhCU0xFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTNkJTIiwiUzhCU0JFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTN0JVIiwiUzhCVUxFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTN0JVIiwiUzhCVUJFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTN0JTIiwiUzhCU0xFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTN0JTIiwiUzhCU0JFIiwiZHRmLmMiLCJkdHQuYyIsMSwKKyJTOUJVIiwiUzE2QlVMRSIsImR0Zi5jIiwiZHR0LmMiLDIsCisiUzlCVSIsIlMxNkJVQkUiLCJkdGYuYyIsImR0dC5jIiwyLAorIlM5QlMiLCJTMTZCU0xFIiwiZHRmLmMiLCJkdHQuYyIsMiwKKyJTOUJTIiwiUzE2QlNCRSIsImR0Zi5jIiwiZHR0LmMiLDIsCisiUzEwQlUiLCJTMTZCVUxFIiwiZHRmLmMiLCJkdHQuYyIsMiwKKyJTMTBCVSIsIlMxNkJVQkUiLCJkdGYuYyIsImR0dC5jIiwyLAorIlMxMEJTIiwiUzE2QlNMRSIsImR0Zi5jIiwiZHR0LmMiLDIsCisiUzEwQlMiLCJTMTZCU0JFIiwiZHRmLmMiLCJkdHQuYyIsMiwKKyJTMTFCVSIsIlMxNkJVTEUiLCJkdGYuYyIsImR0dC5jIiwyLAorIlMxMUJVIiwiUzE2QlVCRSIsImR0Zi5jIiwiZHR0LmMiLDIsCisiUzExQlMiLCJTMTZCU0xFIiwiZHRmLmMiLCJkdHQuYyIsMiwKKyJTMTFCUyIsIlMxNkJTQkUiLCJkdGYuYyIsImR0dC5jIiwyLAorIlMxMkJVIiwiUzE2QlVMRSIsImR0Zi5jIiwiZHR0LmMiLDIsCisiUzEyQlUiLCJTMTZCVUJFIiwiZHRmLmMiLCJkdHQuYyIsMiwKKyJTMTJCUyIsIlMxNkJTTEUiLCJkdGYuYyIsImR0dC5jIiwyLAorIlMxMkJTIiwiUzE2QlNCRSIsImR0Zi5jIiwiZHR0LmMiLDIsCisiUzEzQlUiLCJTMTZCVUxFIiwiZHRmLmMiLCJkdHQuYyIsMiwKKyJTMTNCVSIsIlMxNkJVQkUiLCJkdGYuYyIsImR0dC5jIiwyLAorIlMxM0JTIiwiUzE2QlNMRSIsImR0Zi5jIiwiZHR0LmMiLDIsCisiUzEzQlMiLCJTMTZCU0JFIiwiZHRmLmMiLCJkdHQuYyIsMiwKKyJTMTRCVSIsIlMxNkJVTEUiLCJkdGYuYyIsImR0dC5jIiwyLAorIlMxNEJVIiwiUzE2QlVCRSIsImR0Zi5jIiwiZHR0LmMiLDIsCisiUzE0QlMiLCJTMTZCU0xFIiwiZHRmLmMiLCJkdHQuYyIsMiwKKyJTMTRCUyIsIlMxNkJTQkUiLCJkdGYuYyIsImR0dC5jIiwyLAorIlMxNUJVIiwiUzE2QlVMRSIsImR0Zi5jIiwiZHR0LmMiLDIsCisiUzE1QlUiLCJTMTZCVUJFIiwiZHRmLmMiLCJkdHQuYyIsMiwKKyJTMTVCUyIsIlMxNkJTTEUiLCJkdGYuYyIsImR0dC5jIiwyLAorIlMxNUJTIiwiUzE2QlNCRSIsImR0Zi5jIiwiZHR0LmMiLDIsCisiUzE3QlUiLCJTMzJCVUxFIiwiZHRmLmMiLCJkdHQuYyIsMywKKyJTMTdCVSIsIlMzMkJVQkUiLCJkdGYuYyIsImR0dC5jIiwzLAorIlMxN0JTIiwiUzMyQlNMRSIsImR0Zi5jIiwiZHR0LmMiLDMsCisiUzE3QlMiLCJTMzJCU0JFIiwiZHRmLmMiLCJkdHQuYyIsMywKKyJTMThCVSIsIlMzMkJVTEUiLCJkdGYuYyIsImR0dC5jIiwzLAorIlMxOEJVIiwiUzMyQlVCRSIsImR0Zi5jIiwiZHR0LmMiLDMsCisiUzE4QlMiLCJTMzJCU0xFIiwiZHRmLmMiLCJkdHQuYyIsMywKKyJTMThCUyIsIlMzMkJTQkUiLCJkdGYuYyIsImR0dC5jIiwzLAorIlMxOUJVIiwiUzMyQlVMRSIsImR0Zi5jIiwiZHR0LmMiLDMsCisiUzE5QlUiLCJTMzJCVUJFIiwiZHRmLmMiLCJkdHQuYyIsMywKKyJTMTlCUyIsIlMzMkJTTEUiLCJkdGYuYyIsImR0dC5jIiwzLAorIlMxOUJTIiwiUzMyQlNCRSIsImR0Zi5jIiwiZHR0LmMiLDMsCisiUzIwQlUiLCJTMzJCVUxFIiwiZHRmLmMiLCJkdHQuYyIsMywKKyJTMjBCVSIsIlMzMkJVQkUiLCJkdGYuYyIsImR0dC5jIiwzLAorIlMyMEJTIiwiUzMyQlNMRSIsImR0Zi5jIiwiZHR0LmMiLDMsCisiUzIwQlMiLCJTMzJCU0JFIiwiZHRmLmMiLCJkdHQuYyIsMywKKyJTMjFCVSIsIlMzMkJVTEUiLCJkdGYuYyIsImR0dC5jIiwzLAorIlMyMUJVIiwiUzMyQlVCRSIsImR0Zi5jIiwiZHR0LmMiLDMsCisiUzIxQlMiLCJTMzJCU0xFIiwiZHRmLmMiLCJkdHQuYyIsMywKKyJTMjFCUyIsIlMzMkJTQkUiLCJkdGYuYyIsImR0dC5jIiwzLAorIlMyMkJVIiwiUzMyQlVMRSIsImR0Zi5jIiwiZHR0LmMiLDMsCisiUzIyQlUiLCJTMzJCVUJFIiwiZHRmLmMiLCJkdHQuYyIsMywKKyJTMjJCUyIsIlMzMkJTTEUiLCJkdGYuYyIsImR0dC5jIiwzLAorIlMyMkJTIiwiUzMyQlNCRSIsImR0Zi5jIiwiZHR0LmMiLDMsCisiUzIzQlUiLCJTMzJCVUxFIiwiZHRmLmMiLCJkdHQuYyIsMywKKyJTMjNCVSIsIlMzMkJVQkUiLCJkdGYuYyIsImR0dC5jIiwzLAorIlMyM0JTIiwiUzMyQlNMRSIsImR0Zi5jIiwiZHR0LmMiLDMsCisiUzIzQlMiLCJTMzJCU0JFIiwiZHRmLmMiLCJkdHQuYyIsMywKKyJTMjRCVSIsIlMzMkJVTEUiLCJkdGYuYyIsImR0dC5jIiwzLAorIlMyNEJVIiwiUzMyQlVCRSIsImR0Zi5jIiwiZHR0LmMiLDMsCisiUzI0QlMiLCJTMzJCU0xFIiwiZHRmLmMiLCJkdHQuYyIsMywKKyJTMjRCUyIsIlMzMkJTQkUiLCJkdGYuYyIsImR0dC5jIiwzLAorIlMyNUJVIiwiUzMyQlVMRSIsImR0Zi5jIiwiZHR0LmMiLDQsCisiUzI1QlUiLCJTMzJCVUJFIiwiZHRmLmMiLCJkdHQuYyIsNCwKKyJTMjVCUyIsIlMzMkJTTEUiLCJkdGYuYyIsImR0dC5jIiw0LAorIlMyNUJTIiwiUzMyQlNCRSIsImR0Zi5jIiwiZHR0LmMiLDQsCisiUzI2QlUiLCJTMzJCVUxFIiwiZHRmLmMiLCJkdHQuYyIsNCwKKyJTMjZCVSIsIlMzMkJVQkUiLCJkdGYuYyIsImR0dC5jIiw0LAorIlMyNkJTIiwiUzMyQlNMRSIsImR0Zi5jIiwiZHR0LmMiLDQsCisiUzI2QlMiLCJTMzJCU0JFIiwiZHRmLmMiLCJkdHQuYyIsNCwKKyJTMjdCVSIsIlMzMkJVTEUiLCJkdGYuYyIsImR0dC5jIiw0LAorIlMyN0JVIiwiUzMyQlVCRSIsImR0Zi5jIiwiZHR0LmMiLDQsCisiUzI3QlMiLCJTMzJCU0xFIiwiZHRmLmMiLCJkdHQuYyIsNCwKKyJTMjdCUyIsIlMzMkJTQkUiLCJkdGYuYyIsImR0dC5jIiw0LAorIlMyOEJVIiwiUzMyQlVMRSIsImR0Zi5jIiwiZHR0LmMiLDQsCisiUzI4QlUiLCJTMzJCVUJFIiwiZHRmLmMiLCJkdHQuYyIsNCwKKyJTMjhCUyIsIlMzMkJTTEUiLCJkdGYuYyIsImR0dC5jIiw0LAorIlMyOEJTIiwiUzMyQlNCRSIsImR0Zi5jIiwiZHR0LmMiLDQsCisiUzI5QlUiLCJTMzJCVUxFIiwiZHRmLmMiLCJkdHQuYyIsNCwKKyJTMjlCVSIsIlMzMkJVQkUiLCJkdGYuYyIsImR0dC5jIiw0LAorIlMyOUJTIiwiUzMyQlNMRSIsImR0Zi5jIiwiZHR0LmMiLDQsCisiUzI5QlMiLCJTMzJCU0JFIiwiZHRmLmMiLCJkdHQuYyIsNCwKKyJTMzBCVSIsIlMzMkJVTEUiLCJkdGYuYyIsImR0dC5jIiw0LAorIlMzMEJVIiwiUzMyQlVCRSIsImR0Zi5jIiwiZHR0LmMiLDQsCisiUzMwQlMiLCJTMzJCU0xFIiwiZHRmLmMiLCJkdHQuYyIsNCwKKyJTMzBCUyIsIlMzMkJTQkUiLCJkdGYuYyIsImR0dC5jIiw0LAorIlMzMUJVIiwiUzMyQlVMRSIsImR0Zi5jIiwiZHR0LmMiLDQsCisiUzMxQlUiLCJTMzJCVUJFIiwiZHRmLmMiLCJkdHQuYyIsNCwKKyJTMzFCUyIsIlMzMkJTTEUiLCJkdGYuYyIsImR0dC5jIiw0LAorIlMzMUJTIiwiUzMyQlNCRSIsImR0Zi5jIiwiZHR0LmMiLDQsCisiUzMzQlUiLCJTNjRCVUxFIiwiZHRmLmMiLCJkdHQuYyIsNSwKKyJTMzNCVSIsIlM2NEJVQkUiLCJkdGYuYyIsImR0dC5jIiw1LAorIlMzM0JTIiwiUzY0QlNMRSIsImR0Zi5jIiwiZHR0LmMiLDUsCisiUzMzQlMiLCJTNjRCU0JFIiwiZHRmLmMiLCJkdHQuYyIsNSwKKyJTMzRCVSIsIlM2NEJVTEUiLCJkdGYuYyIsImR0dC5jIiw1LAorIlMzNEJVIiwiUzY0QlVCRSIsImR0Zi5jIiwiZHR0LmMiLDUsCisiUzM0QlMiLCJTNjRCU0xFIiwiZHRmLmMiLCJkdHQuYyIsNSwKKyJTMzRCUyIsIlM2NEJTQkUiLCJkdGYuYyIsImR0dC5jIiw1LAorIlMzNUJVIiwiUzY0QlVMRSIsImR0Zi5jIiwiZHR0LmMiLDUsCisiUzM1QlUiLCJTNjRCVUJFIiwiZHRmLmMiLCJkdHQuYyIsNSwKKyJTMzVCUyIsIlM2NEJTTEUiLCJkdGYuYyIsImR0dC5jIiw1LAorIlMzNUJTIiwiUzY0QlNCRSIsImR0Zi5jIiwiZHR0LmMiLDUsCisiUzM2QlUiLCJTNjRCVUxFIiwiZHRmLmMiLCJkdHQuYyIsNSwKKyJTMzZCVSIsIlM2NEJVQkUiLCJkdGYuYyIsImR0dC5jIiw1LAorIlMzNkJTIiwiUzY0QlNMRSIsImR0Zi5jIiwiZHR0LmMiLDUsCisiUzM2QlMiLCJTNjRCU0JFIiwiZHRmLmMiLCJkdHQuYyIsNSwKKyJTMzdCVSIsIlM2NEJVTEUiLCJkdGYuYyIsImR0dC5jIiw1LAorIlMzN0JVIiwiUzY0QlVCRSIsImR0Zi5jIiwiZHR0LmMiLDUsCisiUzM3QlMiLCJTNjRCU0xFIiwiZHRmLmMiLCJkdHQuYyIsNSwKKyJTMzdCUyIsIlM2NEJTQkUiLCJkdGYuYyIsImR0dC5jIiw1LAorIlMzOEJVIiwiUzY0QlVMRSIsImR0Zi5jIiwiZHR0LmMiLDUsCisiUzM4QlUiLCJTNjRCVUJFIiwiZHRmLmMiLCJkdHQuYyIsNSwKKyJTMzhCUyIsIlM2NEJTTEUiLCJkdGYuYyIsImR0dC5jIiw1LAorIlMzOEJTIiwiUzY0QlNCRSIsImR0Zi5jIiwiZHR0LmMiLDUsCisiUzM5QlUiLCJTNjRCVUxFIiwiZHRmLmMiLCJkdHQuYyIsNSwKKyJTMzlCVSIsIlM2NEJVQkUiLCJkdGYuYyIsImR0dC5jIiw1LAorIlMzOUJTIiwiUzY0QlNMRSIsImR0Zi5jIiwiZHR0LmMiLDUsCisiUzM5QlMiLCJTNjRCU0JFIiwiZHRmLmMiLCJkdHQuYyIsNSwKKyJTNDBCVSIsIlM2NEJVTEUiLCJkdGYuYyIsImR0dC5jIiw1LAorIlM0MEJVIiwiUzY0QlVCRSIsImR0Zi5jIiwiZHR0LmMiLDUsCisiUzQwQlMiLCJTNjRCU0xFIiwiZHRmLmMiLCJkdHQuYyIsNSwKKyJTNDBCUyIsIlM2NEJTQkUiLCJkdGYuYyIsImR0dC5jIiw1LAorIlM0MUJVIiwiUzY0QlVMRSIsImR0Zi5jIiwiZHR0LmMiLDYsCisiUzQxQlUiLCJTNjRCVUJFIiwiZHRmLmMiLCJkdHQuYyIsNiwKKyJTNDFCUyIsIlM2NEJTTEUiLCJkdGYuYyIsImR0dC5jIiw2LAorIlM0MUJTIiwiUzY0QlNCRSIsImR0Zi5jIiwiZHR0LmMiLDYsCisiUzQyQlUiLCJTNjRCVUxFIiwiZHRmLmMiLCJkdHQuYyIsNiwKKyJTNDJCVSIsIlM2NEJVQkUiLCJkdGYuYyIsImR0dC5jIiw2LAorIlM0MkJTIiwiUzY0QlNMRSIsImR0Zi5jIiwiZHR0LmMiLDYsCisiUzQyQlMiLCJTNjRCU0JFIiwiZHRmLmMiLCJkdHQuYyIsNiwKKyJTNDNCVSIsIlM2NEJVTEUiLCJkdGYuYyIsImR0dC5jIiw2LAorIlM0M0JVIiwiUzY0QlVCRSIsImR0Zi5jIiwiZHR0LmMiLDYsCisiUzQzQlMiLCJTNjRCU0xFIiwiZHRmLmMiLCJkdHQuYyIsNiwKKyJTNDNCUyIsIlM2NEJTQkUiLCJkdGYuYyIsImR0dC5jIiw2LAorIlM0NEJVIiwiUzY0QlVMRSIsImR0Zi5jIiwiZHR0LmMiLDYsCisiUzQ0QlUiLCJTNjRCVUJFIiwiZHRmLmMiLCJkdHQuYyIsNiwKKyJTNDRCUyIsIlM2NEJTTEUiLCJkdGYuYyIsImR0dC5jIiw2LAorIlM0NEJTIiwiUzY0QlNCRSIsImR0Zi5jIiwiZHR0LmMiLDYsCisiUzQ1QlUiLCJTNjRCVUxFIiwiZHRmLmMiLCJkdHQuYyIsNiwKKyJTNDVCVSIsIlM2NEJVQkUiLCJkdGYuYyIsImR0dC5jIiw2LAorIlM0NUJTIiwiUzY0QlNMRSIsImR0Zi5jIiwiZHR0LmMiLDYsCisiUzQ1QlMiLCJTNjRCU0JFIiwiZHRmLmMiLCJkdHQuYyIsNiwKKyJTNDZCVSIsIlM2NEJVTEUiLCJkdGYuYyIsImR0dC5jIiw2LAorIlM0NkJVIiwiUzY0QlVCRSIsImR0Zi5jIiwiZHR0LmMiLDYsCisiUzQ2QlMiLCJTNjRCU0xFIiwiZHRmLmMiLCJkdHQuYyIsNiwKKyJTNDZCUyIsIlM2NEJTQkUiLCJkdGYuYyIsImR0dC5jIiw2LAorIlM0N0JVIiwiUzY0QlVMRSIsImR0Zi5jIiwiZHR0LmMiLDYsCisiUzQ3QlUiLCJTNjRCVUJFIiwiZHRmLmMiLCJkdHQuYyIsNiwKKyJTNDdCUyIsIlM2NEJTTEUiLCJkdGYuYyIsImR0dC5jIiw2LAorIlM0N0JTIiwiUzY0QlNCRSIsImR0Zi5jIiwiZHR0LmMiLDYsCisiUzQ4QlUiLCJTNjRCVUxFIiwiZHRmLmMiLCJkdHQuYyIsNiwKKyJTNDhCVSIsIlM2NEJVQkUiLCJkdGYuYyIsImR0dC5jIiw2LAorIlM0OEJTIiwiUzY0QlNMRSIsImR0Zi5jIiwiZHR0LmMiLDYsCisiUzQ4QlMiLCJTNjRCU0JFIiwiZHRmLmMiLCJkdHQuYyIsNiwKKyJTNDlCVSIsIlM2NEJVTEUiLCJkdGYuYyIsImR0dC5jIiw3LAorIlM0OUJVIiwiUzY0QlVCRSIsImR0Zi5jIiwiZHR0LmMiLDcsCisiUzQ5QlMiLCJTNjRCU0xFIiwiZHRmLmMiLCJkdHQuYyIsNywKKyJTNDlCUyIsIlM2NEJTQkUiLCJkdGYuYyIsImR0dC5jIiw3LAorIlM1MEJVIiwiUzY0QlVMRSIsImR0Zi5jIiwiZHR0LmMiLDcsCisiUzUwQlUiLCJTNjRCVUJFIiwiZHRmLmMiLCJkdHQuYyIsNywKKyJTNTBCUyIsIlM2NEJTTEUiLCJkdGYuYyIsImR0dC5jIiw3LAorIlM1MEJTIiwiUzY0QlNCRSIsImR0Zi5jIiwiZHR0LmMiLDcsCisiUzUxQlUiLCJTNjRCVUxFIiwiZHRmLmMiLCJkdHQuYyIsNywKKyJTNTFCVSIsIlM2NEJVQkUiLCJkdGYuYyIsImR0dC5jIiw3LAorIlM1MUJTIiwiUzY0QlNMRSIsImR0Zi5jIiwiZHR0LmMiLDcsCisiUzUxQlMiLCJTNjRCU0JFIiwiZHRmLmMiLCJkdHQuYyIsNywKKyJTNTJCVSIsIlM2NEJVTEUiLCJkdGYuYyIsImR0dC5jIiw3LAorIlM1MkJVIiwiUzY0QlVCRSIsImR0Zi5jIiwiZHR0LmMiLDcsCisiUzUyQlMiLCJTNjRCU0xFIiwiZHRmLmMiLCJkdHQuYyIsNywKKyJTNTJCUyIsIlM2NEJTQkUiLCJkdGYuYyIsImR0dC5jIiw3LAorIlM1M0JVIiwiUzY0QlVMRSIsImR0Zi5jIiwiZHR0LmMiLDcsCisiUzUzQlUiLCJTNjRCVUJFIiwiZHRmLmMiLCJkdHQuYyIsNywKKyJTNTNCUyIsIlM2NEJTTEUiLCJkdGYuYyIsImR0dC5jIiw3LAorIlM1M0JTIiwiUzY0QlNCRSIsImR0Zi5jIiwiZHR0LmMiLDcsCisiUzU0QlUiLCJTNjRCVUxFIiwiZHRmLmMiLCJkdHQuYyIsNywKKyJTNTRCVSIsIlM2NEJVQkUiLCJkdGYuYyIsImR0dC5jIiw3LAorIlM1NEJTIiwiUzY0QlNMRSIsImR0Zi5jIiwiZHR0LmMiLDcsCisiUzU0QlMiLCJTNjRCU0JFIiwiZHRmLmMiLCJkdHQuYyIsNywKKyJTNTVCVSIsIlM2NEJVTEUiLCJkdGYuYyIsImR0dC5jIiw3LAorIlM1NUJVIiwiUzY0QlVCRSIsImR0Zi5jIiwiZHR0LmMiLDcsCisiUzU1QlMiLCJTNjRCU0xFIiwiZHRmLmMiLCJkdHQuYyIsNywKKyJTNTVCUyIsIlM2NEJTQkUiLCJkdGYuYyIsImR0dC5jIiw3LAorIlM1NkJVIiwiUzY0QlVMRSIsImR0Zi5jIiwiZHR0LmMiLDcsCisiUzU2QlUiLCJTNjRCVUJFIiwiZHRmLmMiLCJkdHQuYyIsNywKKyJTNTZCUyIsIlM2NEJTTEUiLCJkdGYuYyIsImR0dC5jIiw3LAorIlM1NkJTIiwiUzY0QlNCRSIsImR0Zi5jIiwiZHR0LmMiLDcsCisiUzU3QlUiLCJTNjRCVUxFIiwiZHRmLmMiLCJkdHQuYyIsOCwKKyJTNTdCVSIsIlM2NEJVQkUiLCJkdGYuYyIsImR0dC5jIiw4LAorIlM1N0JTIiwiUzY0QlNMRSIsImR0Zi5jIiwiZHR0LmMiLDgsCisiUzU3QlMiLCJTNjRCU0JFIiwiZHRmLmMiLCJkdHQuYyIsOCwKKyJTNThCVSIsIlM2NEJVTEUiLCJkdGYuYyIsImR0dC5jIiw4LAorIlM1OEJVIiwiUzY0QlVCRSIsImR0Zi5jIiwiZHR0LmMiLDgsCisiUzU4QlMiLCJTNjRCU0xFIiwiZHRmLmMiLCJkdHQuYyIsOCwKKyJTNThCUyIsIlM2NEJTQkUiLCJkdGYuYyIsImR0dC5jIiw4LAorIlM1OUJVIiwiUzY0QlVMRSIsImR0Zi5jIiwiZHR0LmMiLDgsCisiUzU5QlUiLCJTNjRCVUJFIiwiZHRmLmMiLCJkdHQuYyIsOCwKKyJTNTlCUyIsIlM2NEJTTEUiLCJkdGYuYyIsImR0dC5jIiw4LAorIlM1OUJTIiwiUzY0QlNCRSIsImR0Zi5jIiwiZHR0LmMiLDgsCisiUzYwQlUiLCJTNjRCVUxFIiwiZHRmLmMiLCJkdHQuYyIsOCwKKyJTNjBCVSIsIlM2NEJVQkUiLCJkdGYuYyIsImR0dC5jIiw4LAorIlM2MEJTIiwiUzY0QlNMRSIsImR0Zi5jIiwiZHR0LmMiLDgsCisiUzYwQlMiLCJTNjRCU0JFIiwiZHRmLmMiLCJkdHQuYyIsOCwKKyJTNjFCVSIsIlM2NEJVTEUiLCJkdGYuYyIsImR0dC5jIiw4LAorIlM2MUJVIiwiUzY0QlVCRSIsImR0Zi5jIiwiZHR0LmMiLDgsCisiUzYxQlMiLCJTNjRCU0xFIiwiZHRmLmMiLCJkdHQuYyIsOCwKKyJTNjFCUyIsIlM2NEJTQkUiLCJkdGYuYyIsImR0dC5jIiw4LAorIlM2MkJVIiwiUzY0QlVMRSIsImR0Zi5jIiwiZHR0LmMiLDgsCisiUzYyQlUiLCJTNjRCVUJFIiwiZHRmLmMiLCJkdHQuYyIsOCwKKyJTNjJCUyIsIlM2NEJTTEUiLCJkdGYuYyIsImR0dC5jIiw4LAorIlM2MkJTIiwiUzY0QlNCRSIsImR0Zi5jIiwiZHR0LmMiLDgsCisiUzYzQlUiLCJTNjRCVUxFIiwiZHRmLmMiLCJkdHQuYyIsOCwKKyJTNjNCVSIsIlM2NEJVQkUiLCJkdGYuYyIsImR0dC5jIiw4LAorIlM2M0JTIiwiUzY0QlNMRSIsImR0Zi5jIiwiZHR0LmMiLDgsCisiUzYzQlMiLCJTNjRCU0JFIiwiZHRmLmMiLCJkdHQuYyIsOCwKZGlmZiAtLWdpdCBhL2RlY2xhcmF0aW9uLmMgYi9kZWNsYXJhdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MmJlZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kZWNsYXJhdGlvbi5jCkBAIC0wLDAgKzEsNDc4MSBAQAorLyogICRWRVI6IHZiY2MgKGRlY2xhcmF0aW9uLmMpICRSZXZpc2lvbjogMS45MCAkICAgICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAidmJjY19jcHAuaCIKKyNpbmNsdWRlICJ2YmMuaCIKKworc3RhdGljIGNoYXIgRklMRV9bXT1fX0ZJTEVfXzsKKworI2RlZmluZSBQTEFJTl9TVE9SQUdFX0NMQVNTIDcKKyNkZWZpbmUgUEFSQU1FVEVSIDgKKyNkZWZpbmUgT0xEU1RZTEUgMTYKKwordm9pZCBkeW5hbWljX2luaXQoVmFyICp2LHR5cGUgKnQsY29uc3RfbGlzdCAqY2wsem1heCBvZixpbnQgbm9jb25zdCk7CitpbnQgdGVzdF9hc3NpZ25tZW50KHR5cGUgKixucCk7CitpbnQgcmV0dXJuX3NjLHJldHVybl9yZWcsaGFzX3JldHVybixyZXR1cm5faW5saW5lOworY2hhciAqcmV0dXJuX3ZhdHRyOworc3RhdGljIGludCBkaWRfcmV0dXJuX2xhYmVsOworI2lmZGVmIEhBVkVfVEFSR0VUX0FUVFJJQlVURVMKK3Vuc2lnbmVkIGxvbmcgcmV0dXJuX3RhdHRyOworI2VuZGlmCit6dW1heCByZXR1cm5fbWFzazsKK3ptYXggaW5pdF9keW5fc3osaW5pdF9jb25zdF9zejsKK2ludCBpbml0X2R5bl9jbnQsaW5pdF9jb25zdF9jbnQ7CisKK3ZvaWQgaW5pdF9zbChzdHJ1Y3RfbGlzdCAqc2wpOworCisjaWZkZWYgSEFWRV9FQ1BQCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKworZXh0ZXJuIG5wIGdlbl9saWJjYWxsKGNoYXIgKixucCx0eXBlICosbnAsdHlwZSAqKTsKK2V4dGVybiBpbnQgZmxvYXRfdXNlZDsKK2V4dGVybiB2b2lkIG9wdGltaXplKGxvbmcsVmFyICopOworCitleHRlcm4gdHlwZSB1Y3Q7CisKK3ZvaWQgbmVlZHMoY2hhciAqcykKK3sKKyAgVmFyICp2OworICBpZighKHY9ZmluZF9leHRfdmFyKHMpKXx8IXN0cmNtcCh2LT5pZGVudGlmaWVyLHMpKXsKKyAgICBWYXIgKm5lZWRzPWFkZF92YXIocyxjbG9uZV90eXAoJnVjdCksRVhURVJOLDApOworICAgIG5lZWRzLT5mbGFnc3w9KFVTRURBU1NPVVJDRXxSRUZFUkVOQ0VEfE5FRURTKTsKKyAgfQkJCit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX21haW5fcmV0KHZvaWQpCit7CisgIGlmKGM5OSYmIXN0cmNtcChjdXJfZnVuYywibWFpbiIpJiZyZXR1cm5fdHlwJiZJU1NDQUxBUihyZXR1cm5fdHlwLT5mbGFncykpeworICAgIC8qIGluIGM5OSwgbWFpbiByZXR1cm5zIDAgaWYgaXQgZmFsbHMgZnJvbSBiYWNrICovCisgICAgSUMgKm5ldz1uZXdfSUMoKTsKKyAgICBuZXctPmNvZGU9U0VUUkVUVVJOOworICAgIG5ldy0+cTEudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgZXZhbF9jb25zdCgmbmV3LT5xMS52YWwsTUFYSU5UKTsKKyAgICBpbnNlcnRfY29uc3QoJm5ldy0+cTEudmFsLHJldHVybl90eXAtPmZsYWdzJk5VKTsKKyAgICBuZXctPnExLmZsYWdzPUtPTlNUOworICAgIG5ldy0+dHlwZj1yZXR1cm5fdHlwLT5mbGFnczsKKyAgICBuZXctPnEyLnZhbC52bWF4PXN6b2YocmV0dXJuX3R5cCk7CisgICAgbmV3LT5xMi5mbGFncz1uZXctPnouZmxhZ3M9MDsKKyAgICBuZXctPnoucmVnPWZyZXR1cm4ocmV0dXJuX3R5cCk7CisgICAgYWRkX0lDKG5ldyk7CisgIH0KK30KKworc3RhdGljIGNoYXIgKmdldF9zdHJpbmcodm9pZCkKKy8qIExpZXN0IFN0cmluZ2tvbnN0YW50ZSB1bmQgbGllZmVydCBXZXJ0IGFscyBTdHJpbmcgKG1hbGxvY2VkKSAqLworeworICBucCB0cmVlO2ludCBsO2NoYXIgKnA7CisgIGNvbnN0X2xpc3QgKmNsOworICBraWxsc3AoKTsKKyAgaWYoY3Rvay0+dHlwZSE9VF9TVFJJTkcpIHtlcnJvcig3NCk7cmV0dXJuIDA7fQorICB0cmVlPXN0cmluZ19leHByZXNzaW9uKCk7CisgIGlmKCF0cmVlfHx0cmVlLT5mbGFncyE9U1RSSU5HKXsKKyAgICBlcnJvcigyMjkpOworICAgIHJldHVybiAwOworICB9CisgIGNsPXRyZWUtPmNsO2w9MDsKKyAgd2hpbGUoY2wpeworICAgIGwrKzsKKyAgICBjbD1jbC0+bmV4dDsKKyAgfQorICBwPW15bWFsbG9jKGwpOworICBjbD10cmVlLT5jbDtsPTA7CisgIHdoaWxlKGNsKXsKKyAgICBwW2xdPUNIQVJCQUNLKHptMmwoemMyem0oY2wtPm90aGVyLT52YWwudmNoYXIpKSk7CisgICAgbCsrOworICAgIGNsPWNsLT5uZXh0OworICB9CisgIGlmKHRyZWUpIGZyZWVfZXhwcmVzc2lvbih0cmVlKTsKKyAga2lsbHNwKCk7CisgIHJldHVybiBwOworfQorCisvKiBjaGVja3Mgd2hldGhlciBzdHJpbmcgaXMgYSB2YWxpZCB2ZWN0b3IgdHlwZSAqLworLyogcmV0dXJucyB0aGUgZGltZW5zaW9uICovCitzdGF0aWMgaW50IGNoZWNrX3ZlY3QoY2hhciAqcyxjaGFyICpiYXNlKQoreworICBpbnQgaT1zdHJsZW4oYmFzZSksZGltOworICBpZihzdHJuY21wKHMsYmFzZSxpKSkgcmV0dXJuIDA7CisgIGRpbT1zW2ldOworICBpZihkaW09PScyJ3x8ZGltPT0nMyd8fGRpbT09JzQnfHxkaW09PSc4Jyl7CisgICAgaWYoc1tpKzFdPT0wKQorICAgICAgcmV0dXJuIGRpbS0nMCc7CisgICAgZWxzZQorICAgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYoc1tpXT09JzEnJiZzW2krMV09PSc2JyYmc1tpKzJdPT0wKQorICAgIHJldHVybiAxNjsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBzZXR0eXAoaW50IHR5cG5ldywgaW50IHR5cG9sZCkKKy8qIFVudGVycm91dGluZSBmdWVyIGRlY2xhcmF0aW9uX3NwZWNpZmllcnMoKS4gICAgICAgICAgICAgICovCit7CisgIGlmKERFQlVHJjIpIHByaW50Zigic2V0dHlwOiBuZXc9JWQgb2xkPSVkXG4iLHR5cG5ldyx0eXBvbGQpOworICBpZih0eXBvbGQ9PUxPTkcmJnR5cG5ldz09RkxPQVQpeyBlcnJvcigyMDMpOyByZXR1cm4gRE9VQkxFO30KKyAgaWYodHlwb2xkPT1MT05HJiZ0eXBuZXc9PURPVUJMRSkgcmV0dXJuIExET1VCTEU7CisgIGlmKGM5OSYmdHlwb2xkPT1MT05HJiZ0eXBuZXc9PUxPTkcpIHJldHVybiBMTE9ORzsKKyAgaWYodHlwb2xkPT1JTlQmJih0eXBuZXc9PVNIT1JUfHx0eXBuZXc9PUxPTkcpKSByZXR1cm4gdHlwbmV3OworICBpZih0eXBvbGQhPTAmJnR5cG5ldyE9SU5UKXtlcnJvcig0Nyk7cmV0dXJuKHR5cG5ldyk7fQorICBpZih0eXBvbGQ9PTAmJnR5cG5ldz09SU5UKSByZXR1cm4oSU5UKTsKKyAgaWYodHlwb2xkPT0wKSByZXR1cm4odHlwbmV3KTsKKyAgaWYodHlwb2xkPT1TSE9SVHx8dHlwb2xkPT1MT05HfHx0eXBvbGQ9PUxMT05HKSByZXR1cm4odHlwb2xkKTsKKyAgZXJyb3IoNDgpOworICByZXR1cm4odHlwbmV3KTsKK30KKworI2RlZmluZSBkc2MgaWYoc3RvcmFnZV9jbGFzcykgZXJyb3IoNDkpOyBpZih0eXB8fHR5cGVfcXVhbGlmaWVycykgZXJyb3IoNTApCisjZGVmaW5lIFhTSUdORUQgMTYzODQKKworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorCit0eXBlICpkZWNsYXJhdGlvbl9zcGVjaWZpZXJzKHZvaWQpCisvKiBFcnpldWd0IG5ldWVuIFR5cCB1bmQgZ2lidCBaZWlnZXIgZGFyYXVmIHp1cnVlY2ssICAgICAgKi8KKy8qIHBhcnN0IHouQi4gdW5zaWduZWQgaW50LCBibGEgZXRjLiAgICAgICAgICAgICAgICovCit7CisgIGludCB0eXA9MCx0eXBlX3F1YWxpZmllcnM9MCxub3Rkb25lLHN0b3JhZ2VfY2xhc3MsaGFyZF9yZWcsaGF2ZV9pbmxpbmU7CisjaWZkZWYgSEFWRV9FQ1BQCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgY2hhciAqaW1lcmssc2lkZW50W01BWEldLHNidWZmW01BWEldLCphdHRyPTAsKnZhdHRyPTA7CisgIHp1bWF4IG1hc2s9dWwyenVtKDBVTCk7CisgIHR5cGUgKm5ldz1uZXdfdHlwKCksKnQsKnRzOworICBzdHJ1Y3RfZGVjbGFyYXRpb24gKnNzZDsKKyAgc3RydWN0X2xpc3QgKCpzbClbXTsKKyAgc2l6ZV90IHNsc3o7CisgIFZhciAqdjsKKyAgaW50IGRpbTsKKyNpZmRlZiBIQVZFX1RBUkdFVF9BVFRSSUJVVEVTCisgIHVuc2lnbmVkIGxvbmcgdGF0dHI9MDsKKyNlbmRpZgorICBzdG9yYWdlX2NsYXNzPWhhcmRfcmVnPWhhdmVfaW5saW5lPTA7CisgIGRveworICAgIGtpbGxzcCgpO25vdGRvbmU9MDsKKyAgICBpZihjdG9rLT50eXBlPT1OQU1FKXsKKyAgICAgIGlmKCFzdHJjbXAoInN0cnVjdCIsY3Rvay0+bmFtZSl8fCFzdHJjbXAoInVuaW9uIixjdG9rLT5uYW1lKXx8KGVjcHAmJiFzdHJjbXAoImNsYXNzIixjdG9rLT5uYW1lKSkpeworICAgICAgICBpZighc3RyY21wKCJzdHJ1Y3QiLGN0b2stPm5hbWUpKSBub3Rkb25lPVNUUlVDVDsKKyAgICAgICAgaWYoIXN0cmNtcCgidW5pb24iLGN0b2stPm5hbWUpKSB7CisgICAgICAgICAgbm90ZG9uZT1VTklPTjsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICAgICAgfQorI2lmZGVmIEhBVkVfRUNQUAorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgICAgIG5leHRfdG9rZW4oKTsKKyAgICAgICAga2lsbHNwKCk7CisgICAgICAgIGlmKGN0b2stPnR5cGUhPUxCUkEpeworICAgICAgICAgIGNwYmV6KHNpZGVudCwxKTsKKyAgICAgICAgICBuZXh0X3Rva2VuKCk7CisgICAgICAgICAga2lsbHNwKCk7CisgICAgICAgICAgc3NkPWZpbmRfc3RydWN0KHNpZGVudCwwKTsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICAgICAgICBpZihzc2QmJmN0b2stPnR5cGU9PUxCUkEmJmZpbmRfc3RydWN0KHNpZGVudCxuZXN0aW5nKSYmc3NkLT5jb3VudD4wKSBlcnJvcigxMyxzaWRlbnQpOworICAgICAgICAgIGlmKCFzc2R8fCgoY3Rvay0+dHlwZT09TEJSQXx8Y3Rvay0+dHlwZT09U0VNSUMpJiYhZmluZF9zdHJ1Y3Qoc2lkZW50LG5lc3RpbmcpKSl7CisgICAgICAgICAgICB0eXA9c2V0dHlwKG5vdGRvbmUsdHlwKTsKKyAgICAgICAgICAgIHNzZD1teW1hbGxvYyhzaXplb2YoKnNzZCkpOworICAgICAgICAgICAgc3NkLT5jb3VudD0wOworICAgICAgICAgICAgbmV3LT5leGFjdD1zc2Q9YWRkX3NkKHNzZCxub3Rkb25lKTsKKyAgICAgICAgICAgIGlmKCFlY3BwKWFkZF9zdHJ1Y3RfaWRlbnRpZmllcihzaWRlbnQsc3NkKTsKKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgbmV3LT5leGFjdD1zc2Q7CisgICAgICAgICAgICB0eXA9c2V0dHlwKG5ldy0+ZmxhZ3M9bm90ZG9uZSx0eXApOworICAgICAgICAgIH0KKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgKnNpZGVudD0wOworICAgICAgICAgIHR5cD1zZXR0eXAobm90ZG9uZSx0eXApOworICAgICAgICAgIHNzZD1teW1hbGxvYyhzaXplb2YoKnNzZCkpOworICAgICAgICAgIHNzZC0+Y291bnQ9MDsKKyAgICAgICAgICBuZXctPmV4YWN0PXNzZD1hZGRfc2Qoc3NkLG5vdGRvbmUpOworICAgICAgICB9CisgICAgICAgIGlmKHNzZC0+dHlwIT1ub3Rkb25lKSBlcnJvcigyMzAsc2lkZW50KTsKKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZiAgICAgICAgCisgICAgICAgIGlmKGN0b2stPnR5cGU9PUxCUkEpeworICAgICAgICAgIGludCBiZm9mZnNldCxiZnNpemUsZmxleF9hcnJheT0wLGNiZm89MDsKKwkgIGludCBzY291bnQ7CisgICAgICAgICAgem1heCBvZmY9bDJ6bSgwTCk7CisgICAgICAgICAgbmV4dF90b2tlbigpOworICAgICAgICAgIGtpbGxzcCgpOworICAgICAgICAgIHNsc3o9U0xTSVpFOworICAgICAgICAgIGltZXJrPWlkZW50OworICAgICAgICAgICAgc2w9bXltYWxsb2Moc2xzeipzaXplb2Yoc3RydWN0X2xpc3QpKTsKKyAgICAgICAgICAgIHNzZC0+Y291bnQ9MDsKKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorCSAgc2NvdW50PXNzZC0+Y291bnQ7CisgICAgICAgICAgdHM9ZGVjbGFyYXRpb25fc3BlY2lmaWVycygpOworICAgICAgICAgIHdoaWxlKGN0b2stPnR5cGUhPVJCUkEmJnRzKXsKKyAgICAgICAgICAgIGlmKGZsZXhfYXJyYXkpIGVycm9yKDIzMSk7CisgICAgICAgICAgICBpZGVudD1zYnVmZjsKKyAgICAgICAgICAgIHQ9ZGVjbGFyYXRvcihjbG9uZV90eXAodHMpKTsKKyAgICAgICAgICAgIGtpbGxzcCgpOworICAgICAgICAgICAgYmZzaXplPWJmb2Zmc2V0PS0xOworICAgICAgICAgICAgaWYoY3Rvay0+dHlwZT09VF9DT0xPTil7CisgICAgICAgICAgICAgIG5wIHRyZWU7CisgICAgICAgICAgICAgIGlmKCh0cy0+ZmxhZ3MmTlEpIT1JTlQpIHsKKyAgICAgICAgICAgICAgICBlcnJvcig1MSk7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbmV4dF90b2tlbigpO2tpbGxzcCgpO3RyZWU9YXNzaWdubWVudF9leHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgICAgaWYodHlwZV9leHByZXNzaW9uKHRyZWUsMCkpeworICAgICAgICAgICAgICAgIGludCB0c2l6ZTsKKyAgICAgICAgICAgICAgICBpZih0cmVlLT5mbGFncyE9Q0VYUFIpIGVycm9yKDUyKTsKKyAgICAgICAgICAgICAgICBpZighSVNJTlQodHJlZS0+bnR5cC0+ZmxhZ3MpKSBlcnJvcig1Mik7CisgICAgICAgICAgICAgICAgZXZhbF9jb25zdCgmdHJlZS0+dmFsLHRyZWUtPm50eXAtPmZsYWdzKTsKKyAgICAgICAgICAgICAgICBiZnNpemU9KGludCl6bTJsKHZtYXgpOworICAgICAgICAgICAgICAgIHRzaXplPShpbnQpem0ybCh6bW11bHQoc2l6ZXRhYlt0LT5mbGFncyZOUV0sY2hhcl9iaXQpKTsKKyAgICAgICAgICAgICAgICBpZihiZnNpemU8MHx8YmZzaXplPnRzaXplfHwoYmZzaXplPT0wJiYqaWRlbnQpKXsKKyAgICAgICAgICAgICAgICAgIGVycm9yKDMzMik7YmZzaXplPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKGJmc2l6ZStjYmZvPnRzaXplKXsKKyAgICAgICAgICAgICAgICAgIGJmb2Zmc2V0PWNiZm89MDsKKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgIGJmb2Zmc2V0PWNiZm87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKGJmc2l6ZSE9MCkKKyAgICAgICAgICAgICAgICAgIGNiZm8rPWJmc2l6ZTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBjYmZvPTA7CisgICAgICAgICAgICAgIH0KKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICAgICAgICAgICAgaWYodHJlZSkgZnJlZV9leHByZXNzaW9uKHRyZWUpOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgIGlmKCFlY3BwJiYqaWRlbnQ9PTApIGVycm9yKDUzKTsKKyAgICAgICAgICAgICAgY2Jmbz0wOworICAgICAgICAgICAgfQorI2lmZGVmIEhBVkVfRUNQUAorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgICAgICAgICBpZih0eXBlX3VuY29tcGxldGUodCkpeworICAgICAgICAgICAgICBpZighYzk5fHxub3Rkb25lIT1TVFJVQ1R8fGZsZXhfYXJyYXl8fCh0LT5mbGFncyZOUSkhPUFSUkFZfHx0eXBlX3VuY29tcGxldGUodC0+bmV4dCkpeworICAgICAgICAgICAgICAgIGVycm9yKDE0LHNidWZmKTsKKyAgICAgICAgICAgICAgICBmcmVldHlwKHQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBmbGV4X2FycmF5PTE7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwkgICAgaWYoSVNBUlJBWSh0LT5mbGFncykmJnQtPmRzaXplKXsKKwkgICAgICBlcnJvcigzNTIsc2J1ZmYpOworCSAgICB9CisgICAgICAgICAgICBpZihJU0ZVTkModC0+ZmxhZ3MpKXsKKyAgICAgICAgICAgICAgaWYoIWVjcHApeworICAgICAgICAgICAgICAgIGVycm9yKDE1LHNidWZmKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoKmlkZW50IT0wKXsKKyAgICAgICAgICAgICAgaW50IGk9c2NvdW50OworICAgICAgICAgICAgICB3aGlsZSgtLWk+PTApCisgICAgICAgICAgICAgICAgaWYoIXN0cmNtcCgoKnNsKVtpXS5pZGVudGlmaWVyLGlkZW50KSkKKyAgICAgICAgICAgICAgICAgIGVycm9yKDE2LGlkZW50KTsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorCSAgICAoKnNsKVtzY291bnRdLmJmb2Zmc2V0PWJmb2Zmc2V0OworICAgICAgICAgICAgKCpzbClbc2NvdW50XS5iZnNpemU9YmZzaXplOworICAgICAgICAgICAgKCpzbClbc2NvdW50XS5zdHlwPXQ7CisgICAgICAgICAgICBpZighZWNwcCkgKCpzbClbc2NvdW50XS5pZGVudGlmaWVyPWFkZF9pZGVudGlmaWVyKGlkZW50LHN0cmxlbihpZGVudCkpOworI2lmZGVmIEhBVkVfRUNQUAorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgICAgICAgICBpZihwYWNrX2FsaWduPjAmJnBhY2tfYWxpZ248ZmFsaWduKHQpKQorICAgICAgICAgICAgICAoKnNsKVtzY291bnRdLmFsaWduPXBhY2tfYWxpZ247CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICgqc2wpW3Njb3VudF0uYWxpZ249ZmFsaWduKHQpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICB6bWF4IG0sYWw9KCpzbClbc2NvdW50XS5hbGlnbjsKKyAgICAgICAgICAgICAgem1heCBzej1zem9mKHQpOworICAgICAgICAgICAgICBtPW9mZjsKKyAgICAgICAgICAgICAgaWYoKHptZXF0byhhbCxsMnptKDBMKSl8fHptZXF0byhzeixsMnptKDBMKSkpJiYhZmxleF9hcnJheSl7CisgICAgICAgICAgICAgICAgaWYgKCFlY3BwKXsKKyAgICAgICAgICAgICAgICAgIGVycm9yKDMxNixpZGVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBvZmY9em1tdWx0KHptZGl2KHptYWRkKG9mZix6bXN1YihhbCxsMnptKDFMKSkpLGFsKSxhbCk7CisgICAgICAgICAgICAgICAgaWYoIXptZXF0byhtLG9mZikpIGVycm9yKDMwNixpZGVudCk7CisgICAgICAgICAgICAgICAgaWYoIWZsZXhfYXJyYXkpeworICAgICAgICAgICAgICAgICAgbT16bW11bHQoem1kaXYoem1hZGQob2ZmLHptc3ViKHN6LGwyem0oMUwpKSksc3opLHN6KTsKKyAgICAgICAgICAgICAgICAgIGlmKCF6bWVxdG8obSxvZmYpKSBlcnJvcigzMDcsaWRlbnQpOworICAgICAgICAgICAgICAgICAgb2ZmPXptYWRkKG9mZixzeik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY291bnQrKzsKKyAgICAgICAgICAgIGlmKHNjb3VudD49c2xzei0xKXsKKyAgICAgICAgICAgICAgc2xzeis9U0xTSVpFOworICAgICAgICAgICAgICBzbD1teXJlYWxsb2Moc2wsc2xzeipzaXplb2Yoc3RydWN0X2xpc3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtpbGxzcCgpOworICAgICAgICAgICAgaWYoY3Rvay0+dHlwZT09Q09NTUEpIHtuZXh0X3Rva2VuKCk7a2lsbHNwKCk7Y29udGludWU7fQorICAgICAgICAgICAgaWYoY3Rvay0+dHlwZSE9U0VNSUMpIGVycm9yKDU0KTsgZWxzZSBuZXh0X3Rva2VuKCk7CisgICAgICAgICAgICBraWxsc3AoKTsKKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgICAgICAgICAgaWYoY3Rvay0+dHlwZSE9UkJSQSl7CisgICAgICAgICAgICAgIGlmKHRzKSBmcmVldHlwKHRzKTsKKyAgICAgICAgICAgICAgdHM9ZGVjbGFyYXRpb25fc3BlY2lmaWVycygpO2tpbGxzcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZih0cykgZnJlZXR5cCh0cyk7CisJICBzc2QtPmNvdW50PXNjb3VudDsKKyAgICAgICAgICBpZihzc2QtPmNvdW50PT0wKSBlcnJvcig1NSk7CisjaWZkZWYgSEFWRV9FQ1BQCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICAgICAgICBpZGVudD1pbWVyazsKKwkJCQkJYWRkX3NsKHNzZCxzbCk7CisJCQkJCWZyZWUoc2wpOworICAgICAgICAgIGlmKGN0b2stPnR5cGUhPVJCUkEpIGVycm9yKDU2KTsgZWxzZSBuZXh0X3Rva2VuKCk7CisgICAgICAgICAgbmV3LT5mbGFncz1ub3Rkb25lfHR5cGVfcXVhbGlmaWVyczsKKyAgICAgICAgfQorI2lmZGVmIEhBVkVfRUNQUAorLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgICAgIG5vdGRvbmU9MTsKKyAgICAgIH1lbHNlIGlmKCFzdHJjbXAoImVudW0iLGN0b2stPm5hbWUpKXsKKyAgICAgICAgLyogIGVudW1lcmF0aW9uczsgZGllIE5hbWVuIHdlcmRlbiBsZWlkZXIgbm9jaCBpZ25vcmllcnQgICAgKi8KKyAgICAgICAgbmV4dF90b2tlbigpO2tpbGxzcCgpO25vdGRvbmU9MTsKKyAgICAgICAgaWYoY3Rvay0+dHlwZSE9TEJSQSl7Y3BiZXooYnVmZiwxKTtuZXh0X3Rva2VuKCk7a2lsbHNwKCk7fQorICAgICAgICBpZihjdG9rLT50eXBlPT1MQlJBKXsKKyAgICAgICAgICAvKiBtb2RlOiAwPXN0YXJ0IDE9Zmlyc3Qgd2FzIG5vdCBpbml0IDI9Zmlyc3Qgd2FzIGluaXQgMz1tb3JlIGluaXQgKi8KKyAgICAgICAgICB6bWF4IHZhbDsgVmFyICp2OyB0eXBlICp0O2ludCBtb2RlPTA7CisgICAgICAgICAgdmFsPWwyem0oMEwpOworICAgICAgICAgIG5leHRfdG9rZW4oKTtraWxsc3AoKTsKKyAgICAgICAgICB3aGlsZShjdG9rLT50eXBlIT1SQlJBKXsKKyAgICAgICAgICAgIGNwYmV6KHNpZGVudCwxKTtuZXh0X3Rva2VuKCk7a2lsbHNwKCk7CisgICAgICAgICAgICBpZigqc2lkZW50PT0wKSB7ZXJyb3IoNTYpO2JyZWFrO30KKyAgICAgICAgICAgIHQ9bmV3X3R5cCgpOworICAgICAgICAgICAgdC0+ZmxhZ3M9Q09OU1R8SU5UOworICAgICAgICAgICAgaWYoZmluZF92YXIoc2lkZW50LG5lc3RpbmcpKSBlcnJvcigxNyxzaWRlbnQpOworICAgICAgICAgICAgdj1hZGRfdmFyKHNpZGVudCx0LEFVVE8sMCk7IC8qICBBVVRPIGhpZXIga2x1Zz8gKi8KKyAgICAgICAgICAgIGlmKGN0b2stPnR5cGU9PUFTR04peworICAgICAgICAgICAgICBpZihtb2RlPT0yKSBtb2RlPTM7CisgICAgICAgICAgICAgIGlmKG1vZGU9PTApIG1vZGU9MjsKKyNpZmRlZiBIQVZFX01JU1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNSVNSQSBSdWxlIDkuMyBjaGVja2luZyAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgICAgICAgICAgIG5leHRfdG9rZW4oKTtraWxsc3AoKTsKKyAgICAgICAgICAgICAgdi0+Y2xpc3Q9aW5pdGlhbGl6YXRpb24odi0+dnR5cCwwLDAsMCwwLDApOworICAgICAgICAgICAgICB2YWw9emkyem0odi0+Y2xpc3QtPnZhbC52aW50KTtraWxsc3AoKTsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICBpZihtb2RlPT0wKSBtb2RlPTE7CisjaWZkZWYgSEFWRV9NSVNSQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTUlTUkEgUnVsZSA5LjMgY2hlY2tpbmcgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgICAgICAgICAgICB2LT5jbGlzdD1teW1hbGxvYyhDTFMpOworICAgICAgICAgICAgICB2LT5jbGlzdC0+dmFsLnZpbnQ9em0yemkodmFsKTsKKyAgICAgICAgICAgICAgdi0+Y2xpc3QtPm5leHQ9di0+Y2xpc3QtPm90aGVyPTA7CisgICAgICAgICAgICAgIHYtPmNsaXN0LT50cmVlPTA7CisJICAgICAgdi0+Y2xpc3QtPmlkeD1sMnptKDBMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZtYXg9bDJ6bSgxTCk7dmFsPXptYWRkKHZhbCx2bWF4KTsKKyAgICAgICAgICAgIHYtPnZ0eXAtPmZsYWdzPUNPTlNUfEVOVU07CisgICAgICAgICAgICBpZihjdG9rLT50eXBlIT1SQlJBJiZjdG9rLT50eXBlIT1DT01NQSkge2Vycm9yKDU2KTticmVhazt9CisgICAgICAgICAgICBpZihjdG9rLT50eXBlPT1DT01NQSkgbmV4dF90b2tlbigpOworICAgICAgICAgICAga2lsbHNwKCk7CisgICAgICAgICAgICBpZihjdG9rLT50eXBlPT1SQlJBKSB7bmV4dF90b2tlbigpOyBicmVhazt9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGtpbGxzcCgpOworICAgICAgICB0eXA9c2V0dHlwKElOVCx0eXApOworICAgICAgfWVsc2UgaWYoIXN0cmNtcCgiX19yZWFkc21lbSIsY3Rvay0+bmFtZSl8fCFzdHJjbXAoIl9fd3JpdGVzbWVtIixjdG9rLT5uYW1lKSl7CisgICAgICAgIGVudW0ge1JFQURTLFdSSVRFU30gb3A7CisgICAgICAgIGNoYXIgKmltZXJrLHRidWZbTUFYSV07CisgICAgICAgIHR5cGUgKnRtcDsKKyAgICAgICAgaWYoIXN0cmNtcCgiX19yZWFkc21lbSIsY3Rvay0+bmFtZSkpCisgICAgICAgICAgb3A9UkVBRFM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBvcD1XUklURVM7CisgICAgICAgIG5leHRfdG9rZW4oKTtraWxsc3AoKTsKKyAgICAgICAgaWYoY3Rvay0+dHlwZT09TFBBUikgbmV4dF90b2tlbigpOyBlbHNlIGVycm9yKDE1MSk7CisgICAgICAgIGltZXJrPWlkZW50O2lkZW50PXRidWY7CisgICAgICAgIHRtcD1kZWNsYXJhdG9yKGRlY2xhcmF0aW9uX3NwZWNpZmllcnMoKSk7CisgICAgICAgIGlkZW50PWltZXJrOworICAgICAgICBpZih0bXApeworICAgICAgICAgIGlmKHZhdHRyKQorICAgICAgICAgICAgdmF0dHI9bXlyZWFsbG9jKHZhdHRyLHN0cmxlbih2YXR0cikrMjUpOworICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICB2YXR0cj1teW1hbGxvYygyNSk7CisgICAgICAgICAgICB2YXR0clswXT0wOworICAgICAgICAgIH0KKyAgICAgICAgICBzcHJpbnRmKHZhdHRyK3N0cmxlbih2YXR0ciksIjslcyglZCkiLG9wPT1SRUFEUz8icmVhZG1lbSI6IndyaXRlbWVtIix0bXAtPmZsYWdzKTsKKyAgICAgICAgfQorICAgICAgICBraWxsc3AoKTsKKyAgICAgICAgaWYoY3Rvay0+dHlwZT09UlBBUikgbmV4dF90b2tlbigpOyBlbHNlIGVycm9yKDU5KTsKKyAgICAgICAga2lsbHNwKCk7CisgICAgICAgIG5vdGRvbmU9MTsKKyAgICAgIH1lbHNlIGlmKCFzdHJjbXAoInZvaWQiLGN0b2stPm5hbWUpKXsKKyAgICAgICAgbmV4dF90b2tlbigpOworICAgICAgICB0eXA9c2V0dHlwKFZPSUQsdHlwKTtub3Rkb25lPTE7CisgICAgICB9ZWxzZSBpZighc3RyY21wKCJjaGFyIixjdG9rLT5uYW1lKSl7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgICAgIG5leHRfdG9rZW4oKTsKKyAgICAgICAgdHlwPXNldHR5cChDSEFSLHR5cCk7CisJbm90ZG9uZT0xOworCWlmKGRlZmF1bHRfdW5zaWduZWQmJiEodHlwZV9xdWFsaWZpZXJzJlhTSUdORUQpKQorCSAgdHlwZV9xdWFsaWZpZXJzfD1VTlNJR05FRDsKKyAgICAgIH1lbHNlIGlmKCFzdHJjbXAoInNob3J0IixjdG9rLT5uYW1lKSl7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgICAgIG5leHRfdG9rZW4oKTsKKyAgICAgICAgdHlwPXNldHR5cChTSE9SVCx0eXApO25vdGRvbmU9MTsKKyAgICAgIH1lbHNlIGlmKCFzdHJjbXAoImludCIsY3Rvay0+bmFtZSkpeworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgICAgICBuZXh0X3Rva2VuKCk7CisgICAgICAgIHR5cD1zZXR0eXAoSU5ULHR5cCk7bm90ZG9uZT0xOworICAgICAgfWVsc2UgaWYoIXN0cmNtcCgibG9uZyIsY3Rvay0+bmFtZSkpeworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgICAgICBuZXh0X3Rva2VuKCk7CisgICAgICAgIHR5cD1zZXR0eXAoTE9ORyx0eXApO25vdGRvbmU9MTsKKyAgICAgIH1lbHNlIGlmKCFzdHJjbXAoImZsb2F0IixjdG9rLT5uYW1lKSl7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgICAgIG5leHRfdG9rZW4oKTsKKyAgICAgICAgdHlwPXNldHR5cChGTE9BVCx0eXApO25vdGRvbmU9MTsKKyAgICAgIH1lbHNlIGlmKCFzdHJjbXAoImRvdWJsZSIsY3Rvay0+bmFtZSkpeworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgICAgICBuZXh0X3Rva2VuKCk7CisgICAgICAgIHR5cD1zZXR0eXAoRE9VQkxFLHR5cCk7bm90ZG9uZT0xOworICAgICAgfWVsc2UgaWYoIXN0cmNtcCgiY29uc3QiLGN0b2stPm5hbWUpKXsKKyAgICAgICAgbmV4dF90b2tlbigpOworICAgICAgICBpZih0eXBlX3F1YWxpZmllcnMmQ09OU1QpIGVycm9yKDU4KTsKKyAgICAgICAgdHlwZV9xdWFsaWZpZXJzfD1DT05TVDtub3Rkb25lPTE7CisgICAgICB9ZWxzZSBpZighc3RyY21wKCJ2b2xhdGlsZSIsY3Rvay0+bmFtZSkpeworICAgICAgICBuZXh0X3Rva2VuKCk7CisgICAgICAgIGlmKHR5cGVfcXVhbGlmaWVycyZWT0xBVElMRSkgZXJyb3IoNTgpOworICAgICAgICB0eXBlX3F1YWxpZmllcnN8PVZPTEFUSUxFO25vdGRvbmU9MTsKKyAgICAgIH1lbHNlIGlmKG9wZW5jbCYmKGRpbT1jaGVja192ZWN0KGN0b2stPm5hbWUsImJvb2wiKSkpeworCW5leHRfdG9rZW4oKTsKKwl0eXA9c2V0dHlwKFZFQ0JPT0wrZGltLTEsdHlwKTsKKwlub3Rkb25lPTE7CisgICAgICB9ZWxzZSBpZihvcGVuY2wmJihkaW09Y2hlY2tfdmVjdChjdG9rLT5uYW1lLCJjaGFyIikpKXsKKwluZXh0X3Rva2VuKCk7CisJdHlwPXNldHR5cChWRUNDSEFSK2RpbS0xLHR5cCk7CisJbm90ZG9uZT0xOworICAgICAgfWVsc2UgaWYob3BlbmNsJiYoZGltPWNoZWNrX3ZlY3QoY3Rvay0+bmFtZSwidWNoYXIiKSkpeworCW5leHRfdG9rZW4oKTsKKwl0eXA9c2V0dHlwKChWRUNDSEFSK2RpbS0xKXxVTlNJR05FRCx0eXApOworCW5vdGRvbmU9MTsKKyAgICAgIH1lbHNlIGlmKG9wZW5jbCYmKGRpbT1jaGVja192ZWN0KGN0b2stPm5hbWUsInNob3J0IikpKXsKKwluZXh0X3Rva2VuKCk7CisJdHlwPXNldHR5cChWRUNTSE9SVCtkaW0tMSx0eXApOworCW5vdGRvbmU9MTsKKyAgICAgIH1lbHNlIGlmKG9wZW5jbCYmKGRpbT1jaGVja192ZWN0KGN0b2stPm5hbWUsInVzaG9ydCIpKSl7CisJbmV4dF90b2tlbigpOworCXR5cD1zZXR0eXAoKFZFQ1NIT1JUK2RpbS0xKXxVTlNJR05FRCx0eXApOworCW5vdGRvbmU9MTsKKyAgICAgIH1lbHNlIGlmKG9wZW5jbCYmKGRpbT1jaGVja192ZWN0KGN0b2stPm5hbWUsImludCIpKSl7CisJbmV4dF90b2tlbigpOworCXR5cD1zZXR0eXAoVkVDSU5UK2RpbS0xLHR5cCk7CisJbm90ZG9uZT0xOworICAgICAgfWVsc2UgaWYob3BlbmNsJiYoZGltPWNoZWNrX3ZlY3QoY3Rvay0+bmFtZSwidWludCIpKSl7CisJbmV4dF90b2tlbigpOworCXR5cD1zZXR0eXAoKFZFQ0lOVCtkaW0tMSl8VU5TSUdORUQsdHlwKTsKKwlub3Rkb25lPTE7CisgICAgICB9ZWxzZSBpZihvcGVuY2wmJihkaW09Y2hlY2tfdmVjdChjdG9rLT5uYW1lLCJsb25nIikpKXsKKwluZXh0X3Rva2VuKCk7CisJdHlwPXNldHR5cChWRUNMT05HK2RpbS0xLHR5cCk7CisJbm90ZG9uZT0xOworICAgICAgfWVsc2UgaWYob3BlbmNsJiYoZGltPWNoZWNrX3ZlY3QoY3Rvay0+bmFtZSwidWxvbmciKSkpeworCW5leHRfdG9rZW4oKTsKKwl0eXA9c2V0dHlwKChWRUNMT05HK2RpbS0xKXxVTlNJR05FRCx0eXApOworCW5vdGRvbmU9MTsKKyAgICAgIH1lbHNlIGlmKG9wZW5jbCYmKGRpbT1jaGVja192ZWN0KGN0b2stPm5hbWUsImZsb2F0IikpKXsKKwluZXh0X3Rva2VuKCk7CisJdHlwPXNldHR5cChWRUNGTE9BVCtkaW0tMSx0eXApOworCW5vdGRvbmU9MTsKKyNpZiAwCisgICAgICB9ZWxzZSBpZihjOTkmJiFzdHJjbXAoInJlc3RyaWN0IixjdG9rLT5uYW1lKSl7CisgICAgICAgIG5leHRfdG9rZW4oKTsKKyAgICAgICAgaWYodHlwZV9xdWFsaWZpZXJzJlJFU1RSSUNUKSBlcnJvcig1OCk7CisgICAgICAgIHR5cGVfcXVhbGlmaWVyc3w9UkVTVFJJQ1Q7bm90ZG9uZT0xOworI2VuZGlmCisgICAgICB9ZWxzZSBpZighc3RyY21wKCJ1bnNpZ25lZCIsY3Rvay0+bmFtZSkpeworICAgICAgICBuZXh0X3Rva2VuKCk7CisgICAgICAgIGlmKHR5cGVfcXVhbGlmaWVycyYoWFNJR05FRHxVTlNJR05FRCkpIGVycm9yKDU4KTsKKyAgICAgICAgbm90ZG9uZT0xO3R5cGVfcXVhbGlmaWVyc3w9VU5TSUdORUQ7CisgICAgICB9ZWxzZSBpZighc3RyY21wKCJzaWduZWQiLGN0b2stPm5hbWUpKXsKKyAgICAgICAgbmV4dF90b2tlbigpOworICAgICAgICBpZih0eXBlX3F1YWxpZmllcnMmKFhTSUdORUR8VU5TSUdORUQpKSBlcnJvcig1OCk7CisgICAgICAgIG5vdGRvbmU9MTt0eXBlX3F1YWxpZmllcnN8PVhTSUdORUQ7CisgICAgICB9ZWxzZSBpZighc3RyY21wKCJhdXRvIixjdG9rLT5uYW1lKSl7CisgICAgICAgIG5leHRfdG9rZW4oKTsKKyAgICAgICAgZHNjO3N0b3JhZ2VfY2xhc3M9QVVUTztub3Rkb25lPTE7CisgICAgICB9ZWxzZSBpZighc3RyY21wKCJyZWdpc3RlciIsY3Rvay0+bmFtZSkpeworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgICAgICBuZXh0X3Rva2VuKCk7CisgICAgICAgIGRzYztzdG9yYWdlX2NsYXNzPVJFR0lTVEVSO25vdGRvbmU9MTsKKyAgICAgIH1lbHNlIGlmKCFzdHJjbXAoInN0YXRpYyIsY3Rvay0+bmFtZSkpeworICAgICAgICBuZXh0X3Rva2VuKCk7CisgICAgICAgIGRzYztzdG9yYWdlX2NsYXNzPVNUQVRJQztub3Rkb25lPTE7CisjaWZkZWYgSEFWRV9FQ1BQCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICAgIH1lbHNlIGlmKCFzdHJjbXAoImV4dGVybiIsY3Rvay0+bmFtZSkpeworICAgICAgICBuZXh0X3Rva2VuKCk7CisgICAgICAgIGRzYztzdG9yYWdlX2NsYXNzPUVYVEVSTjtub3Rkb25lPTE7CisgICAgICB9ZWxzZSBpZighc3RyY21wKCJ0eXBlZGVmIixjdG9rLT5uYW1lKSl7CisgICAgICAgIG5leHRfdG9rZW4oKTsKKyAgICAgICAgZHNjO3N0b3JhZ2VfY2xhc3M9VFlQRURFRjtub3Rkb25lPTE7CisgICAgICB9ZWxzZSBpZihjOTkmJiFzdHJjbXAoImlubGluZSIsY3Rvay0+bmFtZSkpeworICAgICAgICBuZXh0X3Rva2VuKCk7CisgICAgICAgIGhhdmVfaW5saW5lPTE7bm90ZG9uZT0xOworI2lmZGVmIEhBVkVfRUNQUAorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisJCQl9ZWxzZSBpZigvKiEoY19mbGFnc1s3XSZVU0VERkxBRykmJiovIXN0cmNtcCgiX19yZWciLGN0b2stPm5hbWUpKXsKKyAgICAgICAgY2hhciAqZDsKKyAgICAgICAgbmV4dF90b2tlbigpO2tpbGxzcCgpOyAKKyAgICAgICAgaWYoY3Rvay0+dHlwZT09TFBBUikgbmV4dF90b2tlbigpOyBlbHNlIGVycm9yKDE1MSk7CisgICAgICAgIGtpbGxzcCgpOworICAgICAgICBpZihkPWdldF9zdHJpbmcoKSl7CisgICAgICAgICAgZm9yKGhhcmRfcmVnPTE7aGFyZF9yZWc8PU1BWFI7aGFyZF9yZWcrKyl7CisgICAgICAgICAgICBpZighc3RyY21wKGQscmVnbmFtZXNbaGFyZF9yZWddKSkgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKGhhcmRfcmVnPk1BWFIpeyBoYXJkX3JlZz0wO2Vycm9yKDIyMCxkKTt9CisgICAgICAgICAgbm90ZG9uZT0xOworICAgICAgICAgIGZyZWUoZCk7CisgICAgICAgIH0KKyAgICAgICAga2lsbHNwKCk7CisgICAgICAgIGlmKGN0b2stPnR5cGU9PVJQQVIpIG5leHRfdG9rZW4oKTsgZWxzZSBlcnJvcig1OSk7CisgICAgICAgIGtpbGxzcCgpOworICAgICAgfWVsc2UgaWYoIXN0cmNtcCgiX19tYXNrIixjdG9rLT5uYW1lKSl7CisJbnAgdHJlZTsKKwluZXh0X3Rva2VuKCk7a2lsbHNwKCk7CisgICAgICAgIGlmKGN0b2stPnR5cGU9PUxQQVIpIG5leHRfdG9rZW4oKTsgZWxzZSBlcnJvcigxNTEpOworCXRyZWU9ZXhwcmVzc2lvbigpOworCWlmKHRyZWUmJnR5cGVfZXhwcmVzc2lvbih0cmVlLDApKXsKKwkgIGlmKHRyZWUtPmZsYWdzPT1DRVhQUiYmSVNJTlQodHJlZS0+bnR5cC0+ZmxhZ3MpKXsKKwkgICAgZXZhbF9jb25zdCgmdHJlZS0+dmFsLHRyZWUtPm50eXAtPmZsYWdzKTsKKwkgICAgbWFzaz12dW1heDsKKwkgIH1lbHNlCisJICAgIGVycm9yKDE4KTsKKwkgIGZyZWVfZXhwcmVzc2lvbih0cmVlKTsKKwl9ZWxzZQorCSAgZXJyb3IoMTgpOworICAgICAgICBraWxsc3AoKTsKKyAgICAgICAgaWYoY3Rvay0+dHlwZT09UlBBUikgbmV4dF90b2tlbigpOyBlbHNlIGVycm9yKDU5KTsKKyAgICAgICAga2lsbHNwKCk7CisJbm90ZG9uZT0xOworICAgICAgfWVsc2UgaWYoLyohKGNfZmxhZ3NbN10mVVNFREZMQUcpJiYqLyFzdHJjbXAoIl9fYXR0ciIsY3Rvay0+bmFtZSkpeworICAgICAgICBjaGFyICpkOworICAgICAgICBuZXh0X3Rva2VuKCk7a2lsbHNwKCk7IAorICAgICAgICBpZihjdG9rLT50eXBlPT1MUEFSKSBuZXh0X3Rva2VuKCk7IGVsc2UgZXJyb3IoMTUxKTsKKyAgICAgICAga2lsbHNwKCk7CisgICAgICAgIGlmKGQ9Z2V0X3N0cmluZygpKXsKKyAgICAgICAgICBpZighYXR0cil7CisgICAgICAgICAgICBhdHRyPWQ7CisgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBhdHRyPW15cmVhbGxvYyhhdHRyLHN0cmxlbihhdHRyKStzdHJsZW4oZCkrMik7CisgICAgICAgICAgICBzdHJjYXQoYXR0ciwiOyIpOworICAgICAgICAgICAgc3RyY2F0KGF0dHIsZCk7CisgICAgICAgICAgICBmcmVlKGQpOworICAgICAgICAgIH0KKyAgICAgICAgICBub3Rkb25lPTE7CisgICAgICAgIH0KKyAgICAgICAga2lsbHNwKCk7CisgICAgICAgIGlmKGN0b2stPnR5cGU9PVJQQVIpIG5leHRfdG9rZW4oKTsgZWxzZSBlcnJvcig1OSk7CisgICAgICAgIGtpbGxzcCgpOworICAgICAgfWVsc2UgaWYoLyohKGNfZmxhZ3NbN10mVVNFREZMQUcpJiYqLyFzdHJjbXAoIl9fdmF0dHIiLGN0b2stPm5hbWUpKXsKKyAgICAgICAgY2hhciAqZDsKKyAgICAgICAgbmV4dF90b2tlbigpO2tpbGxzcCgpOworICAgICAgICBpZihjdG9rLT50eXBlPT1MUEFSKSBuZXh0X3Rva2VuKCk7IGVsc2UgZXJyb3IoMTUxKTsKKyAgICAgICAga2lsbHNwKCk7CisgICAgICAgIGlmKGQ9Z2V0X3N0cmluZygpKXsKKyAgICAgICAgICBpZighdmF0dHIpeworICAgICAgICAgICAgdmF0dHI9ZDsKKyAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHZhdHRyPW15cmVhbGxvYyh2YXR0cixzdHJsZW4odmF0dHIpK3N0cmxlbihkKSsyKTsKKyAgICAgICAgICAgIHN0cmNhdCh2YXR0ciwiOyIpOworICAgICAgICAgICAgc3RyY2F0KHZhdHRyLGQpOworICAgICAgICAgICAgZnJlZShkKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbm90ZG9uZT0xOworICAgICAgICB9CisgICAgICAgIGtpbGxzcCgpOworICAgICAgICBpZihjdG9rLT50eXBlPT1SUEFSKSBuZXh0X3Rva2VuKCk7IGVsc2UgZXJyb3IoNTkpOworICAgICAgICBraWxsc3AoKTsKKyAgICAgIH1lbHNleworI2lmZGVmIEhBVkVfVEFSR0VUX0FUVFJJQlVURVMKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvcihpPTA7Z19hdHRyX25hbWVbaV07aSsrKXsKKyAgICAgICAgICBpZighc3RyY21wKGdfYXR0cl9uYW1lW2ldLGN0b2stPm5hbWUpKXsKKyAgICAgICAgICAgIGlmKHRhdHRyJigxTDw8aSkpIGVycm9yKDIyNyxjdG9rLT5uYW1lKTsKKyAgICAgICAgICAgIHRhdHRyfD0oMUw8PGkpOworICAgICAgICAgICAgbmV4dF90b2tlbigpOworICAgICAgICAgICAgbm90ZG9uZT0xO2JyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmKCFub3Rkb25lJiZ0eXA9PTAmJiEodHlwZV9xdWFsaWZpZXJzJihYU0lHTkVEfFVOU0lHTkVEKSkpeworICAgICAgICAgIHY9ZmluZF92YXIoY3Rvay0+bmFtZSwwKTsKKyAgICAgICAgICBpZih2JiZ2LT5zdG9yYWdlX2NsYXNzPT1UWVBFREVGKXsKKyAgICAgICAgICAgIGZyZWUobmV3KTsKKyAgICAgICAgICAgIG5ldz1jbG9uZV90eXAodi0+dnR5cCk7CisgICAgICAgICAgICB0eXA9c2V0dHlwKG5ldy0+ZmxhZ3MsdHlwKTsKKyAgICAgICAgICAgIG5vdGRvbmU9MTsKKyAgICAgICAgICAgIG5leHRfdG9rZW4oKTsKKyAgICAgICAgICB9CisjaWZkZWYgSEFWRV9FQ1BQCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgIGlmKERFQlVHJjIpIHByaW50ZigidHlwOiVkXG4iLHR5cCk7CisgIH13aGlsZShub3Rkb25lKTsKKyAga2lsbHNwKCk7CisgIHJldHVybl9zYz1zdG9yYWdlX2NsYXNzOworICByZXR1cm5fcmVnPWhhcmRfcmVnOworICByZXR1cm5fdmF0dHI9dmF0dHI7CisgIHJldHVybl9tYXNrPW1hc2s7CisgIHJldHVybl9pbmxpbmU9aGF2ZV9pbmxpbmU7CisjaWZkZWYgSEFWRV9FQ1BQCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyNpZmRlZiBIQVZFX1RBUkdFVF9BVFRSSUJVVEVTCisgIHJldHVybl90YXR0cj10YXR0cjsKKyNlbmRpZgorICBpZih0eXA9PTApeworICAgIGlmKHN0b3JhZ2VfY2xhc3M9PTAmJnR5cGVfcXVhbGlmaWVycz09MCYmIWhhcmRfcmVnKXsKKyAgICAgIGZyZWUobmV3KTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICB0eXA9SU5UOworICB9CisgIGlmKHR5cGVfcXVhbGlmaWVycyYoWFNJR05FRHxVTlNJR05FRCkpCisgICAgaWYoIUlTSU5UKHR5cCkpCisgICAgICBlcnJvcig1OCk7CisgIG5ldy0+ZmxhZ3M9dHlwfHR5cGVfcXVhbGlmaWVyczsKKyAgbmV3LT5hdHRyPWF0dHI7CisgIHJldHVybiBuZXc7Cit9CisKK3R5cGUgKmRlY2xhcmF0b3IodHlwZSAqYSkKKy8qIEVyemV1Z3QgZWluZW4gbmV1ZW4gVHlwLCBhdWYgQmFzaXMgZGVzIFR5cHMgYS4gICAgICAgICAgICovCisvKiBhIHdpcmQgaGllcm1pdCB2ZXJrZXR0ZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICB0eXBlICp0OworICBraWxsc3AoKTsqaWRlbnQ9MDsKKyAgdD1kaXJlY3RfZGVjbGFyYXRvcihwb2ludGVyKGEpKTsKKyAgaWYoIWEpCisgICAge2lmKHQpIGZyZWV0eXAodCk7cmV0dXJuIDA7fQorI2lmZGVmIEhBVkVfRUNQUAorLyogcmVtb3ZlZCAqLworI2VuZGlmCisjaWZkZWYgSEFWRV9FWFRfVFlQRVMKKyAgY29udl90eXAodCk7CisjZW5kaWYgIAorICByZXR1cm4gdDsKK30KK3R5cGUgKnBvaW50ZXIodHlwZSAqYSkKKy8qIFVudGVycm91dGluZSBmdWVyIGRlY2xhcmF0b3IoKSwgYmVoYW5kZWx0IFplaWdlciBhdWYgVHlwLiAgICovCit7CisgIHR5cGUgKnQ7Y2hhciAqYXR0cjtpbnQgbm90ZG9uZTsKKyAgaWYoIWEpIHJldHVybigwKTsKKyAga2lsbHNwKCk7CisgIHdoaWxlKGN0b2stPnR5cGU9PVNUQVIpeworICAgIG5leHRfdG9rZW4oKTsKKyAgICB0PW5ld190eXAoKTsKKyAgICB0LT5mbGFncz1QT0lOVEVSX1RZUEUoYSk7CisgICAgdC0+bmV4dD1hOworICAgIGF0dHI9MDsKKyAgICBhPXQ7CisgICAgZG97CisgICAgICBraWxsc3AoKTsKKyAgICAgIG5vdGRvbmU9MDsKKyAgICAgIGlmKGN0b2stPnR5cGU9PU5BTUUmJiFzdHJjbXAoImNvbnN0IixjdG9rLT5uYW1lKSl7CisJYS0+ZmxhZ3N8PUNPTlNUOworCW5vdGRvbmU9MTsKKwluZXh0X3Rva2VuKCk7CisgICAgICB9ZWxzZSBpZihjdG9rLT50eXBlPT1OQU1FJiYhc3RyY21wKCJ2b2xhdGlsZSIsY3Rvay0+bmFtZSkpeworCWEtPmZsYWdzfD1WT0xBVElMRTsKKwlub3Rkb25lPTE7CisJbmV4dF90b2tlbigpOworICAgICAgfWVsc2UgaWYoYzk5JiZjdG9rLT50eXBlPT1OQU1FJiYhc3RyY21wKCJyZXN0cmljdCIsY3Rvay0+bmFtZSkpeworCWEtPmZsYWdzfD1SRVNUUklDVDsKKwlub3Rkb25lPTE7CisJbmV4dF90b2tlbigpOworICAgICAgfWVsc2UgaWYoY3Rvay0+dHlwZT09TkFNRSYmIXN0cmNtcCgiX19hdHRyIixjdG9rLT5uYW1lKSl7CisJY2hhciAqZDsKKwluZXh0X3Rva2VuKCk7CisJa2lsbHNwKCk7CisJaWYoY3Rvay0+dHlwZT09TFBBUikgbmV4dF90b2tlbigpOyBlbHNlIGVycm9yKDE1MSk7CisJa2lsbHNwKCk7CisJaWYoZD1nZXRfc3RyaW5nKCkpeworCSAgaWYoIWF0dHIpeworCSAgICBhdHRyPWQ7CisJICB9ZWxzZXsKKwkgICAgYXR0cj1teXJlYWxsb2MoYXR0cixzdHJsZW4oYXR0cikrc3RybGVuKGQpKzIpOworCSAgICBzdHJjYXQoYXR0ciwiOyIpOworCSAgICBzdHJjYXQoYXR0cixkKTsKKwkgICAgZnJlZShkKTsKKwkgIH0KKwkgIG5vdGRvbmU9MTsKKwl9CisJa2lsbHNwKCk7CisJaWYoY3Rvay0+dHlwZT09UlBBUikgbmV4dF90b2tlbigpOyBlbHNlIGVycm9yKDU5KTsKKwlraWxsc3AoKTsKKyAgICAgIH0KKyAgICB9d2hpbGUobm90ZG9uZSk7CisgICAgYS0+YXR0cj1hdHRyOworICB9CisgIHJldHVybiBhOworfQordHlwZSAqZGlyZWN0X2RlY2xhcmF0b3IodHlwZSAqYSkKKy8qICBVbnRlcnJvdXRpbmUgenUgZGVjbGFyYXRvcigpICAgICAgICAgICAgICAgICAgICAqLworLyogIGJlaGFuZGVsdCBbXSwoZnVua3QpLChkZWtsKS4gICAgICAgICAgICAgICAgICAgICAqLworeworICB0eXBlICpyZWs9MCwqbWVyaywqcCwqdD0wLCpmaXJzdCwqbGFzdD0wOworICBzdHJ1Y3RfZGVjbGFyYXRpb24gKmZzZDsKKyAgc3RydWN0X2xpc3QgKCpzbClbXTsKKyAgc2l6ZV90IHNsc3o7Y2hhciAqaW1lcms7CisgIGNoYXIgZmJ1ZmZbTUFYSV07CisgIGtpbGxzcCgpOworICBpZihjdG9rLT50eXBlIT1OQU1FJiZjdG9rLT50eXBlIT1MUEFSJiZjdG9rLT50eXBlIT1MQlJLKQorICAgIHJldHVybiBhOworICBpZihjdG9rLT50eXBlPT1OQU1FKXsKKyAgICBjcGJleihpZGVudCwxKTsKKyAgICBuZXh0X3Rva2VuKCk7CisgICAgaWYoIWEpIHJldHVybigwKTsKKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICB9CisgIGVsc2UgaWYoY3Rvay0+dHlwZT09TFBBUiYmYSl7CisgICAgLyogUmVrdXJzaW9uICovCisgICAgdG9rZW4gbXRvazsKKyAgICBjb3B5X3Rva2VuKCZtdG9rLGN0b2spOworICAgIG5leHRfdG9rZW4oKTsga2lsbHNwKCk7CisgICAgaWYoY3Rvay0+dHlwZSE9UlBBUiYmKmlkZW50PT0wJiYhZGVjbGFyYXRpb24oMCkpeworICAgICAgbWVyaz1hOworICAgICAgcmVrPWRlY2xhcmF0b3IoYSk7CisgICAgICBpZihjdG9rLT50eXBlIT1SUEFSKSBlcnJvcig1OSk7IGVsc2UgbmV4dF90b2tlbigpOworICAgIH1lbHNlCisKKyAgICAgIHB1c2hfdG9rZW4oJm10b2spOworICAgIGZyZWUobXRvay5uYW1lKTsKKyAgfQorICBpZighYSlyZXR1cm4oMCk7CisgIGtpbGxzcCgpOworICB3aGlsZShjdG9rLT50eXBlPT1MQlJLfHxjdG9rLT50eXBlPT1MUEFSKXsKKyAgICBpZihjdG9rLT50eXBlPT1MQlJLKXsKKyAgICAgIG5leHRfdG9rZW4oKTsKKyAgICAgIGtpbGxzcCgpOworICAgICAgcD1uZXdfdHlwKCk7CisgICAgICBwLT5mbGFncz1BUlJBWTsKKyAgICAgIHAtPm5leHQ9MDsKKyAgICAgIGlmKGN0b2stPnR5cGU9PVJCUkspeworICAgICAgICBwLT5zaXplPWwyem0oMEwpOworICAgICAgfWVsc2V7CisgICAgICAgIG5wIHRyZWU7CisgICAgICAgIHRyZWU9ZXhwcmVzc2lvbigpOworICAgICAgICBpZighdHlwZV9leHByZXNzaW9uKHRyZWUsMCkpeworICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICBlcnJvcigiaW5jb3JyZWN0IGNvbnN0YW50IGV4cHJlc3Npb24iKTsqLworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICBpZih0cmVlLT5zaWRlZngmJiFjOTkpIGVycm9yKDYwKTsKKyAgICAgICAgICBpZih0cmVlLT5mbGFncyE9Q0VYUFJ8fCFJU0lOVCh0cmVlLT5udHlwLT5mbGFncykpeworCSAgICBpZighYzk5fHwhQUxMT0NWTEFfSU5MSU5FQVNNKQorCSAgICAgIGVycm9yKDE5KTsKKwkgICAgZWxzZXsKKwkgICAgICB0eXBlICpzdDtJQyAqbmV3OworCSAgICAgIHN0PW5ld190eXAoKTsKKwkgICAgICBzdC0+ZmxhZ3M9SEFWRV9JTlRfU0laRVQ/KFVOU0lHTkVEfElOVCk6KFVOU0lHTkVEfExPTkcpOworCSAgICAgIHAtPmRzaXplPWFkZF90bXBfdmFyKHN0KTsKKwkgICAgICBnZW5fSUModHJlZSwwLDApOworCSAgICAgIGNvbnZlcnQodHJlZSxzdC0+ZmxhZ3MpOworCSAgICAgIG5ldz1uZXdfSUMoKTsKKwkgICAgICBuZXctPmNvZGU9QVNTSUdOOworCSAgICAgIG5ldy0+dHlwZj1zdC0+ZmxhZ3M7CisJICAgICAgbmV3LT5xMT10cmVlLT5vOworCSAgICAgIG5ldy0+ei5mbGFncz1WQVI7CisJICAgICAgbmV3LT56LnY9cC0+ZHNpemU7CisJICAgICAgbmV3LT56LnZhbC52bWF4PWwyem0oMEwpOworCSAgICAgIG5ldy0+cTIudmFsLnZtYXg9c3pvZihzdCk7CisJICAgICAgYWRkX0lDKG5ldyk7CisJICAgIH0KKyAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGV2YWxfY29uc3RuKHRyZWUpOworICAgICAgICAgICAgcC0+c2l6ZT12bWF4OworICAgICAgICAgICAgaWYoem1sZXEocC0+c2l6ZSxsMnptKDBMKSkpIHtlcnJvcig2MSk7cC0+c2l6ZT1sMnptKDFMKTt9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZyZWVfZXhwcmVzc2lvbih0cmVlKTsKKyAgICAgIH0KKyAgICAgIGlmKGN0b2stPnR5cGUhPVJCUkspIGVycm9yKDYyKTsgZWxzZSBuZXh0X3Rva2VuKCk7CisgICAgICBpZihsYXN0KXsKKyAgICAgICAgbGFzdC0+bmV4dD1wOworICAgICAgICBsYXN0PXA7CisgICAgICB9ZWxzZXsKKyAgICAgICAgZmlyc3Q9bGFzdD1wOworICAgICAgfQorICAgIH0KKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgIGlmKGN0b2stPnR5cGU9PUxQQVIpeworICAgICAgaW50IGtvbW1hLGZpcnN0cGFybSxvbGRzdHlsZT0wOworI2lmIDAgLyojaWZkZWYgSEFWRV9SRUdQQVJNUyovCisgICAgICB0cmVnX2hhbmRsZSByZWdfaGFuZGxlPWVtcHR5X3JlZ19oYW5kbGU7CisgICAgICB0eXBlIHJwb2ludGVyPXswfTsKKyAgICAgIGlmKCFmZnJldHVybihhKSYmKGEtPmZsYWdzJk5RKSE9Vk9JRCl7CisJcnBvaW50ZXIuZmxhZ3M9UE9JTlRFUl9UWVBFKGEpOworICAgICAgICBycG9pbnRlci5uZXh0PWE7CisgICAgICAgIHJlZ19wYXJtKCZyZWdfaGFuZGxlLCZycG9pbnRlciwwLGEpOyAvKlRPRE86IGEgbWlnaHQgYmUgaW5jb21wbGV0ZSAqLworICAgICAgfQorI2VuZGlmCisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgICBuZXh0X3Rva2VuKCk7CisgICAgICBraWxsc3AoKTsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICAgIGZzZD1teW1hbGxvYyhzaXplb2YoKmZzZCkpOworICAgICAgc2xzej1TTFNJWkU7CisgICAgICBzbD1teW1hbGxvYyhzaXplb2Yoc3RydWN0X2xpc3QpKnNsc3opOworICAgICAgZnNkLT5jb3VudD0wOworICAgICAgaW1lcms9aWRlbnQ7a29tbWE9MDsKKyAgICAgIGVudGVyX2Jsb2NrKCk7CisgICAgICBmaXJzdHBhcm09MTsKKyAgICAgIHdoaWxlKGN0b2stPnR5cGUhPVJQQVImJmN0b2stPnR5cGUhPU1ET1RTKXsKKyAgICAgICAgaW50IGhhcmRfcmVnOworI2lmZGVmIEhBVkVfRUNQUAorLyogcmVtb3ZlZCAqLworI2VuZGlmCisJaWYoIWZpcnN0cGFybSYmIWtvbW1hKSBlcnJvcig1Nyk7CisJa29tbWE9Zmlyc3RwYXJtPTA7CisgICAgICAgIGlkZW50PWZidWZmOypmYnVmZj0wOworICAgICAgICB0PWRlY2xhcmF0aW9uX3NwZWNpZmllcnMoKTsKKyAgICAgICAgaGFyZF9yZWc9cmV0dXJuX3JlZzsKKyAgICAgICAgdD1kZWNsYXJhdG9yKHQpOworICAgICAgICBpZighdCl7CisgICAgICAgICAgb2xkc3R5bGU9MTsKKyAgICAgICAgICBpZigqaWRlbnQ9PTApIHtlcnJvcigyMCk7ZnJlZXR5cCh0KTtjb250aW51ZTt9CisgICAgICAgIH0KKyAgICAgICAgaWYoZnNkLT5jb3VudCl7CisgICAgICAgICAgaWYoKHQmJiEoKnNsKVtmc2QtPmNvdW50LTFdLnN0eXApfHwKKyAgICAgICAgICAgICAoIXQmJigqc2wpW2ZzZC0+Y291bnQtMV0uc3R5cCkpCisgICAgICAgICAgICBlcnJvcig2Myk7CisgICAgICAgIH0KKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgICAgICBpZighcmV0dXJuX3NjKSByZXR1cm5fc2M9QVVUTzsKKyAgICAgICAgaWYocmV0dXJuX3NjIT1BVVRPJiZyZXR1cm5fc2MhPVJFR0lTVEVSKQorICAgICAgICAgIHtlcnJvcigyMSk7cmV0dXJuX3NjPUFVVE87fQorICAgICAgICAoKnNsKVtmc2QtPmNvdW50XS5zdHlwPXQ7CisgICAgICAgICgqc2wpW2ZzZC0+Y291bnRdLnN0b3JhZ2VfY2xhc3M9cmV0dXJuX3NjOworCXsKKwkgIGludCBtPW5lc3Rpbmc7CisJICBuZXN0aW5nPTA7CisJICAoKnNsKVtmc2QtPmNvdW50XS5pZGVudGlmaWVyPWFkZF9pZGVudGlmaWVyKGlkZW50LHN0cmxlbihpZGVudCkpOworCSAgbmVzdGluZz1tOworCX0KKyAgICAgICAgaWYodCl7CisgICAgICAgICAgaWYoKCgqc2wpW2ZzZC0+Y291bnRdLnN0eXAtPmZsYWdzJk5RKT09Vk9JRCYmZnNkLT5jb3VudCE9MCkKKyAgICAgICAgICAgIGVycm9yKDIyKTsKKyAgICAgICAgICAvKiAgQXJyYXlzIGluIFplaWdlciB1bXdhbmRlbG4gICovCisgICAgICAgICAgaWYoSVNBUlJBWSgoKnNsKVtmc2QtPmNvdW50XS5zdHlwLT5mbGFncykpCisgICAgICAgICAgICAoKnNsKVtmc2QtPmNvdW50XS5zdHlwLT5mbGFncz1QT0lOVEVSX1RZUEUoKCpzbClbZnNkLT5jb3VudF0uc3R5cC0+bmV4dCk7CisJICAvKiAgRnVua3Rpb25lbiBpbiBaZWlnZXIgYXVmIEZ1bmt0aW9uZW4gdW13YW5kZWxuICAgKi8KKwkgIGlmKElTRlVOQygoKnNsKVtmc2QtPmNvdW50XS5zdHlwLT5mbGFncykpeworCSAgICB0eXBlICpuZXc7CisJICAgIG5ldz1uZXdfdHlwKCk7CisJICAgIG5ldy0+bmV4dD0oKnNsKVtmc2QtPmNvdW50XS5zdHlwOworCSAgICBuZXctPmZsYWdzPVBPSU5URVJfVFlQRShuZXctPm5leHQpOworCSAgICAoKnNsKVtmc2QtPmNvdW50XS5zdHlwPW5ldzsKKwkgIH0KKwl9CisgICAgICAgIGlmKGhhcmRfcmVnJiZyZWdvayhoYXJkX3JlZyx0LT5mbGFncywtMSk8PTApIGVycm9yKDIxNyxyZWduYW1lc1toYXJkX3JlZ10pOworI2lmIDAgLyojaWZkZWYgSEFWRV9SRUdQQVJNUyovCisgICAgICAgIGlmKHQpICgqc2wpW2ZzZC0+Y291bnRdLnJlZz1yZWdfcGFybSgmcmVnX2hhbmRsZSx0LDAsYSk7IC8qVE9ETzogYSBtaWdodCBiZSBpbmNvbXBsZXRlICovCisgICAgICAgIGlmKGhhcmRfcmVnKSAoKnNsKVtmc2QtPmNvdW50XS5yZWc9aGFyZF9yZWc7CisjZWxzZQorICAgICAgICAoKnNsKVtmc2QtPmNvdW50XS5yZWc9aGFyZF9yZWc7CisjZW5kaWYKKyAgICAgICAgZnNkLT5jb3VudCsrOworICAgICAgICBpZihmc2QtPmNvdW50Pj1zbHN6LTIpeyAgICAgLyogIGVpbnMgUmVzZXJ2ZSBmdWVyIFZPSUQgICovCisgICAgICAgICAgc2xzeis9U0xTSVpFOworICAgICAgICAgIHNsPW15cmVhbGxvYyhzbCxzbHN6KnNpemVvZihzdHJ1Y3RfbGlzdCkpOworICAgICAgICB9CisgICAgICAgIGtpbGxzcCgpOyAvKiBIaWVyIFN5bnRheHBydWVmdW5nIHN0cmVuZ2VyIG1hY2hlbiAqLworICAgICAgICBpZihjdG9rLT50eXBlPT1DT01NQSkge25leHRfdG9rZW4oKTtrb21tYT0xOyBraWxsc3AoKTt9CisgICAgICB9CisgICAgICBpZGVudD1pbWVyazsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICAgIGlmKGN0b2stPnR5cGUhPU1ET1RTfHwha29tbWEpeworICAgICAgICBpbnQgZWNwcF9hZGR2b2lkPTA7CisjaWZkZWYgSEFWRV9FQ1BQCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICAgICAgaWYoZWNwcF9hZGR2b2lkfHwoIWVjcHAmJmZzZC0+Y291bnQ+MCYmKCEoKnNsKVtmc2QtPmNvdW50LTFdLnN0eXB8fCgoKnNsKVtmc2QtPmNvdW50LTFdLnN0eXAtPmZsYWdzJk5RKSE9Vk9JRCkpKXsKKyAgICAgICAgICAoKnNsKVtmc2QtPmNvdW50XS5zdHlwPW5ld190eXAoKTsKKyAgICAgICAgICAoKnNsKVtmc2QtPmNvdW50XS5zdHlwLT5mbGFncz1WT0lEOworICAgICAgICAgICgqc2wpW2ZzZC0+Y291bnRdLnN0eXAtPm5leHQ9MDsKKyAgICAgICAgICAoKnNsKVtmc2QtPmNvdW50XS5yZWc9MDsKKyAgICAgICAgICAoKnNsKVtmc2QtPmNvdW50XS5pZGVudGlmaWVyPWVtcHR5OworI2lmZGVmIEhBVkVfRUNQUAorLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgICAgICAgZnNkLT5jb3VudCsrOworICAgICAgICB9CisgICAgICAgIGlmKGVjcHAmJmN0b2stPnR5cGU9PU1ET1RTKXtuZXh0X3Rva2VuKCk7a2lsbHNwKCk7fQorICAgICAgfWVsc2UgaWYoa29tbWEpeworICAgICAgICBuZXh0X3Rva2VuKCk7a29tbWE9MDsKKyAgICAgICAgaWYob2xkc3R5bGUpIGVycm9yKDIyMSk7CisgICAgICB9CisgICAgICBwPW5ld190eXAoKTsKKyAgICAgIHAtPmZsYWdzPUZVTktUOworICAgICAgeworICAgICAgICBpbnQgbT1uZXN0aW5nOworICAgICAgICBuZXN0aW5nPTA7CisgICAgICAgIHAtPmV4YWN0PWFkZF9zZChmc2QsRlVOS1QpOworICAgICAgICBhZGRfc2woZnNkLHNsKTsKKyAgICAgICAgZnJlZShzbCk7CisgICAgICAgIG5lc3Rpbmc9bTsKKyAgICAgIH0KKyNpZmRlZiBIQVZFX1JFR1BBUk1TCisgICAgICB7CisJdHJlZ19oYW5kbGUgcmVnX2hhbmRsZT1lbXB0eV9yZWdfaGFuZGxlOworCWludCBpLHI7CisKKwlwLT5uZXh0PWE7CisKKwlpZighZmZyZXR1cm4oYSkmJihhLT5mbGFncyZOUSkhPVZPSUQpeworCSAgdHlwZSBycG9pbnRlcj17MH07CisKKwkgIHJwb2ludGVyLmZsYWdzPVBPSU5URVJfVFlQRShhKTsKKwkgIHJwb2ludGVyLm5leHQ9YTsKKwkgIHJlZ19wYXJtKCZyZWdfaGFuZGxlLCZycG9pbnRlciwwLHApOworCX0KKworCWZvcihpPTA7aTxwLT5leGFjdC0+Y291bnQ7aSsrKXsKKwkgIGlmKCgqcC0+ZXhhY3QtPnNsKVtpXS5zdHlwKQorCSAgICByPXJlZ19wYXJtKCZyZWdfaGFuZGxlLCgqcC0+ZXhhY3QtPnNsKVtpXS5zdHlwLDAscCk7CisJICBlbHNlCisJICAgIHI9MDsKKwkgIGlmKCgqcC0+ZXhhY3QtPnNsKVtpXS5yZWc9PTApICgqcC0+ZXhhY3QtPnNsKVtpXS5yZWc9cjsKKwl9CisgICAgICB9CisjZW5kaWYKKyAgICAgIGtpbGxzcCgpOworICAgICAgaWYoa29tbWEpIGVycm9yKDU5KTsKKyAgICAgIGlmKGN0b2stPnR5cGUhPVJQQVIpIGVycm9yKDU5KTsgZWxzZSBuZXh0X3Rva2VuKCk7CisgICAgICBraWxsc3AoKTsKKyAgICAgIGlmKGN0b2stPnR5cGU9PUNPTU1BfHxjdG9rLT50eXBlPT1TRU1JQ3x8Y3Rvay0+dHlwZT09UlBBUnx8Y3Rvay0+dHlwZT09QVNHTikKKwlsZWF2ZV9ibG9jaygpOworICAgICAgaWYobGFzdCl7CisgICAgICAgIGxhc3QtPm5leHQ9cDsKKyAgICAgICAgbGFzdD1wOworICAgICAgfWVsc2V7CisgICAgICAgIGZpcnN0PWxhc3Q9cDsKKyAgICAgIH0KKyAgICB9CisgICAga2lsbHNwKCk7CisgIH0KKyAgaWYobGFzdCl7bGFzdC0+bmV4dD1hO2xhc3Q9YTthPWZpcnN0O30KKyAgaWYocmVrIT0wJiZyZWshPW1lcmspeworICAgIC8qIFp3ZWl0ZSBMaXN0ZSBhbmhhZW5nZW4gKi8KKyAgICBwPXJlazsKKyAgICB3aGlsZShwLT5uZXh0IT1tZXJrKSBwPXAtPm5leHQ7CisgICAgaWYocCkgcC0+bmV4dD1hOyBlbHNlIGllcnJvcigwKTsKKyAgICByZXR1cm4gcmVrOworICB9CisgIHJldHVybiBhOworfQoraW50IGRlY2xhcmF0aW9uKGludCBvZmZzZXQpCisvKiAgVGVzdGV0LCBvYiBlaW5lIFR5cGFuZ2FiZSBrb21tdC4gV2VubiBvZmZzZXQhPTAgaXN0LCAgICAqLworLyogIG11c3MgcyBhdWYgJygnIHplaWdlbiB1bmQgZXMgd2lyZCBnZXRlc3RldCwgb2IgbmFjaCBkZXIgKi8KKy8qICBLbGFtbWVyIGVpbmUgVHlwYW5nYWJlIGtvbW10LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4gamVkZW0gRmFsbCB6ZWlndCBzIGRhbmFjaCB3aWVkZXIgYXVmIGRpZXNlbGJlIFN0ZWxsZSAqLworLyogIGltIFNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgVmFyICp2O3Rva2VuIG10b2s7CisgIGludCBmbD0wOworICBpZihvZmZzZXQpeworICAgIGNvcHlfdG9rZW4oJm10b2ssY3Rvayk7CisgICAgbmV4dF90b2tlbigpOworICAgIGtpbGxzcCgpOworICB9CisgIGlmKGN0b2stPnR5cGU9PU5BTUUpeworICAgIGlmKCFzdHJjbXAoImF1dG8iLGN0b2stPm5hbWUpKSBmbD0xOworICAgIGVsc2UgaWYoIXN0cmNtcCgiY2hhciIsY3Rvay0+bmFtZSkpIGZsPTE7CisgICAgZWxzZSBpZighc3RyY21wKCJjb25zdCIsY3Rvay0+bmFtZSkpIGZsPTE7CisgICAgZWxzZSBpZighc3RyY21wKCJkb3VibGUiLGN0b2stPm5hbWUpKSBmbD0xOworICAgIGVsc2UgaWYoIXN0cmNtcCgiZW51bSIsY3Rvay0+bmFtZSkpIGZsPTE7CisgICAgZWxzZSBpZighc3RyY21wKCJleHRlcm4iLGN0b2stPm5hbWUpKSBmbD0xOworICAgIGVsc2UgaWYoIXN0cmNtcCgiZmxvYXQiLGN0b2stPm5hbWUpKSBmbD0xOworICAgIGVsc2UgaWYoIXN0cmNtcCgiaW50IixjdG9rLT5uYW1lKSkgZmw9MTsKKyAgICBlbHNlIGlmKCFzdHJjbXAoImxvbmciLGN0b2stPm5hbWUpKSBmbD0xOworICAgIGVsc2UgaWYoIXN0cmNtcCgicmVnaXN0ZXIiLGN0b2stPm5hbWUpKSBmbD0xOworICAgIGVsc2UgaWYoYzk5JiYhc3RyY21wKCJyZXN0cmljdCIsY3Rvay0+bmFtZSkpIGZsPTE7CisgICAgZWxzZSBpZighc3RyY21wKCJzaG9ydCIsY3Rvay0+bmFtZSkpIGZsPTE7CisgICAgZWxzZSBpZighc3RyY21wKCJzaWduZWQiLGN0b2stPm5hbWUpKSBmbD0xOworICAgIGVsc2UgaWYoIXN0cmNtcCgic3RhdGljIixjdG9rLT5uYW1lKSkgZmw9MTsKKyAgICBlbHNlIGlmKCFzdHJjbXAoInN0cnVjdCIsY3Rvay0+bmFtZSkpIGZsPTE7CisgICAgZWxzZSBpZighc3RyY21wKCJ0eXBlZGVmIixjdG9rLT5uYW1lKSkgZmw9MTsKKyAgICBlbHNlIGlmKCFzdHJjbXAoInVuaW9uIixjdG9rLT5uYW1lKSkgZmw9MTsKKyAgICBlbHNlIGlmKCFzdHJjbXAoInVuc2lnbmVkIixjdG9rLT5uYW1lKSkgZmw9MTsKKyAgICBlbHNlIGlmKCFzdHJjbXAoInZvaWQiLGN0b2stPm5hbWUpKSBmbD0xOworICAgIGVsc2UgaWYoIXN0cmNtcCgidm9sYXRpbGUiLGN0b2stPm5hbWUpKSBmbD0xOworICAgIGVsc2UgaWYoLyohKGNfZmxhZ3NbN10mVVNFREZMQUcpJiYqLyFzdHJjbXAoIl9fcmVnIixjdG9rLT5uYW1lKSkgZmw9MTsKKyAgICBlbHNlIGlmKC8qIShjX2ZsYWdzWzddJlVTRURGTEFHKSYmKi8hc3RyY21wKCJfX2F0dHIiLGN0b2stPm5hbWUpKSBmbD0xOworICAgIGVsc2UgaWYoLyohKGNfZmxhZ3NbN10mVVNFREZMQUcpJiYqLyFzdHJjbXAoIl9fdmF0dHIiLGN0b2stPm5hbWUpKSBmbD0xOworICAgIGVsc2UgaWYoLyohKGNfZmxhZ3NbN10mVVNFREZMQUcpJiYqLyFzdHJjbXAoIl9fbWFzayIsY3Rvay0+bmFtZSkpIGZsPTE7CisgICAgZWxzZSBpZigvKiEoY19mbGFnc1s3XSZVU0VERkxBRykmJiovIXN0cmNtcCgiX19yZWFkc21lbSIsY3Rvay0+bmFtZSkpIGZsPTE7CisgICAgZWxzZSBpZigvKiEoY19mbGFnc1s3XSZVU0VERkxBRykmJiovIXN0cmNtcCgiX193cml0ZXNtZW0iLGN0b2stPm5hbWUpKSBmbD0xOworICAgIGVsc2V7CisgICAgICB2PWZpbmRfdmFyKGN0b2stPm5hbWUsMCk7CisgICAgICBpZih2JiZ2LT5zdG9yYWdlX2NsYXNzPT1UWVBFREVGKSBmbD0xOworICAgIH0KKyAgfQorI2lmZGVmIEhBVkVfRUNQUAorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgIGlmKG9mZnNldCl7CisgICAgcHVzaF90b2tlbigmbXRvayk7CisgICAgZnJlZShtdG9rLm5hbWUpOworICB9CisgIHJldHVybiBmbDsKK30KK3ZvaWQgaW5pdF9zbChzdHJ1Y3RfbGlzdCAqc2wpeworICBpZighc2wpe2llcnJvcigwKTtyZXR1cm47fQorICBzbC0+aWRlbnRpZmllcj0wOworICBzbC0+c3R5cD0wOworICBzbC0+YWxpZ249MDsKKyAgc2wtPmJmb2Zmc2V0PS0xOworICBzbC0+YmZzaXplPS0xOworICBzbC0+cmVnPTA7CisgIHNsLT5zdG9yYWdlX2NsYXNzPTA7CisjaWZkZWYgSEFWRV9FQ1BQCisvKiByZW1vdmVkICovCisjZW5kaWYKK30KK3ZvaWQgYWRkX3NsKHN0cnVjdF9kZWNsYXJhdGlvbiAqc2Qsc3RydWN0X2xpc3QgKCpzbClbXSkKKy8qICBGdWVndCBlaW4gc3RydWN0X2xpc3QtQXJyYXkgaW4gZWluZSBzdHJ1Y3RfZGVjbGFyYXRpb24gZWluLiAgICAgKi8KKy8qICBEYXMgQXJyYXkgbXVzcyBtaW5kLiBzZC0+Y291bnQgRWxlbWVudHMgaGFiZW4gdW5kIHdpcmQga29waWVydC4gKi8KK3sKKyAgc2l6ZV90IHN6PXNpemVvZihzdHJ1Y3RfbGlzdCkqc2QtPmNvdW50OworICBzZC0+c2w9bXltYWxsb2Moc3opOworICBtZW1jcHkoc2QtPnNsLHNsLHN6KTsKK30KK3N0cnVjdF9kZWNsYXJhdGlvbiAqYWRkX3NkKHN0cnVjdF9kZWNsYXJhdGlvbiAqbmV3LGludCB0eXApCisvKiAgRnVlZ3QgZWluZSBEZWNsYXJhdGlvbiBpbiBMaXN0ZSBlaW4uICAgICAqLworeworICBuZXctPm5leHQ9MDsKKyAgbmV3LT5sYWJlbD0wOworICBuZXctPnR5cD10eXA7CisgIG5ldy0+aWRlbnRpZmllcj0wOworICBuZXctPnR1bml0PWxhc3RfdHVuaXQ7CisjaWZkZWYgSEFWRV9FQ1BQCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgaWYoZmlyc3Rfc2RbbmVzdGluZ109PTApeworICAgIGZpcnN0X3NkW25lc3RpbmddPWxhc3Rfc2RbbmVzdGluZ109bmV3OworICB9ZWxzZXsKKyAgICBsYXN0X3NkW25lc3RpbmddLT5uZXh0PW5ldzsKKyAgICBsYXN0X3NkW25lc3RpbmddPW5ldzsKKyAgfQorICByZXR1cm4gbmV3OworfQordm9pZCBmcmVlX3NkKHN0cnVjdF9kZWNsYXJhdGlvbiAqcCkKKy8qICBHaWJ0IGVpbmUgc3RydWN0X2RlY2xhcmF0aW9uLUxpc3QgaW5rbC4gc3RydWN0X2xpc3RzIHVuZCAgICAqLworLyogIGFsbGVuIFR5cGVuIGplZGVyIHN0cnVjdF9saXN0IGZyZWksIG5pY2h0IGFiZXIgaWRlbnRpZmllci4gICovCit7CisgIGludCBpO3N0cnVjdF9kZWNsYXJhdGlvbiAqbWVyazsKKyAgd2hpbGUocCl7CisgICAgbWVyaz1wLT5uZXh0OworICAgIGlmKHAtPnNsKXsKKyAgICAgIGZvcihpPTA7aTxwLT5jb3VudDtpKyspeworCWlmKCgqcC0+c2wpW2ldLnN0eXApIGZyZWV0eXAoKCpwLT5zbClbaV0uc3R5cCk7CisgICAgICB9CisgICAgICBpZihwLT5jb3VudD4wKSBmcmVlKHAtPnNsKTsKKyAgICB9CisjaWZkZWYgSEFWRV9FQ1BQCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICBmcmVlKHApOworICAgIHA9bWVyazsKKyAgfQorfQorY2hhciAqYWRkX2lkZW50aWZpZXIoY2hhciAqaWRlbnRpZmllcixpbnQgbGVuZ3RoKQorLyogIEtvcGllcnQgaWRlbnRpZmllciBhbiBzaWNoZXJlbiBPcnQsIGRlciBzcGFldGVyIHplbnRyYWwgICAgICovCisvKiAgZnJlaWdlZ2ViZW4gd2VyZGVuIGthbm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTb2xsdGUgbm9jaCBlaW5iYXVlbiwgZGFzcyB1ZWJlcnBydWVmdCB3aXJkLCBvYiBzY2hvbiAgICAgICAqLworLyogIHZvcmhhbmRlbiB1bmQgZGFubiBuaWNodCB6d2VpbWFsIHNwZWljaGVybi4gICAgICAgICAgICAgICAgICovCit7CisgIGlkZW50aWZpZXJfbGlzdCAqbmV3OworICBpZigoKmlkZW50aWZpZXI9PTAmJmxlbmd0aD09MCl8fGlkZW50aWZpZXI9PWVtcHR5KSByZXR1cm4oZW1wdHkpOworICBuZXc9bXltYWxsb2Moc2l6ZW9mKGlkZW50aWZpZXJfbGlzdCkpOworICBuZXctPmlkZW50aWZpZXI9bXltYWxsb2MobGVuZ3RoKzEpOworICBtZW1jcHkobmV3LT5pZGVudGlmaWVyLGlkZW50aWZpZXIsbGVuZ3RoKzEpOworICBuZXctPm5leHQ9MDtuZXctPmxlbmd0aD1sZW5ndGg7CisgIGlmKGxhc3RfaWxpc3RbbmVzdGluZ10peworICAgIGxhc3RfaWxpc3RbbmVzdGluZ10tPm5leHQ9bmV3OworICAgIGxhc3RfaWxpc3RbbmVzdGluZ109bmV3OworICB9ZWxzZXsKKyAgICBsYXN0X2lsaXN0W25lc3RpbmddPWZpcnN0X2lsaXN0W25lc3RpbmddPW5ldzsKKyAgfQorICByZXR1cm4obmV3LT5pZGVudGlmaWVyKTsKK30KK3ZvaWQgZnJlZV9pbGlzdChpZGVudGlmaWVyX2xpc3QgKnApCisvKiAgR2lidCBlaW5lIHZlcmtldHRldGUgaWRlbnRpZmllcl9saXN0ZSB1bmQgc2FlbXRsaWNoZSBkYXJpbiAgKi8KKy8qICBnZXNwZWljaGVydGVuIElkZW50aWZpZXIgZnJlaS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpZGVudGlmaWVyX2xpc3QgKm1lcms7CisgIHdoaWxlKHApeworICAgIG1lcms9cC0+bmV4dDsKKyAgICBpZihwLT5pZGVudGlmaWVyKSBmcmVlKHAtPmlkZW50aWZpZXIpOworICAgIGZyZWUocCk7CisgICAgcD1tZXJrOworICB9Cit9CitpbnQgdHlwZV91bmNvbXBsZXRlKHR5cGUgKnApCisvKiAgVGVzdGV0LCBvYiBUeXAgdW52b2xsc3RhZW5kaWcgaXN0LiBNb21lbnRhbiBnZWx0ZW4gbnVyICAgICAgKi8KKy8qICB1bnZvbGxzdGFlbmRpZ2UgU3RydWt0dXJlbiB1bmQgQXJyYXlzIHZvbiBzb2xjaGVuIGFscyAgICAgICAqLworLyogIHVudm9sbHN0YWVuZGlnLCBhYmVyIGtlaW5lIFplaWdlciBvZGVyIEZ1bmt0aW9uZW4gZGFyYXVmLiAgICovCit7CisgIHN0cnVjdF9kZWNsYXJhdGlvbiAqc2Q7CisgIGlmKCFwKXtpZXJyb3IoMCk7cmV0dXJuKDApO30KKyAgaWYoSVNTVFJVQ1QocC0+ZmxhZ3MpfHxJU1VOSU9OKHAtPmZsYWdzKSkKKyAgICBpZihwLT5leGFjdC0+Y291bnQ8PTApIHJldHVybiAxOworICBpZihJU0FSUkFZKHAtPmZsYWdzKSl7CisgICAgaWYoIXAtPmRzaXplJiZ6bWxlcShwLT5zaXplLGwyem0oMEwpKSkgcmV0dXJuIDE7CitpZighcC0+bmV4dCkgaWVycm9yKDApOworICAgIGlmKHR5cGVfdW5jb21wbGV0ZShwLT5uZXh0KSkgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9Cit2b2lkIGFkZF9zdHJ1Y3RfaWRlbnRpZmllcihjaGFyICppZGVudGlmaWVyLHN0cnVjdF9kZWNsYXJhdGlvbiAqc2QpCisvKiAgRXJ6ZXVndCBuZXVlbiBzdHJ1Y3RfaWRlbnRpZmllciwgZnVlZ3QgaWhuIGluIExpc3RlIGFuIHVuZCAgKi8KKy8qICB2ZXJ2b2xsc3RhZW5kaWd0IHVudm9sbHN0YWVuZGlnZSBUeXBlbiBkaWVzZXIgU3RydWt0dXIuICAgICAqLworeworICBzdHJ1Y3RfaWRlbnRpZmllciAqbmV3OworLyogICAgdHlwZSAqdDsqLworICBpZihERUJVRyYxKSBwcmludGYoImFkZF9zaSAlcyAobmVzdGluZz0lZCktPiVwXG4iLGlkZW50aWZpZXIsbmVzdGluZywodm9pZCAqKXNkKTsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgbmV3PW15bWFsbG9jKHNpemVvZihzdHJ1Y3RfaWRlbnRpZmllcikpOworICBuZXctPmlkZW50aWZpZXI9YWRkX2lkZW50aWZpZXIoaWRlbnRpZmllcixzdHJsZW4oaWRlbnRpZmllcikpOworICBuZXctPnNkPXNkOworICBuZXctPm5leHQ9MDsgCisgIGlmKGZpcnN0X3NpW25lc3RpbmddPT0wKXsKKyAgICBmaXJzdF9zaVtuZXN0aW5nXT1uZXc7bGFzdF9zaVtuZXN0aW5nXT1uZXc7CisgIH1lbHNleworICAgIGxhc3Rfc2lbbmVzdGluZ10tPm5leHQ9bmV3O2xhc3Rfc2lbbmVzdGluZ109bmV3OworICB9CisgIHNkLT5pZGVudGlmaWVyPW5ldy0+aWRlbnRpZmllcjsKK30KK3ZvaWQgZnJlZV9zaShzdHJ1Y3RfaWRlbnRpZmllciAqcCkKKy8qICBHaWJ0IGVpbmUgc3RydWN0X2lkZW50aWZpZXItTGlzdGUgZnJlaSwgYWJlciBuaWNodCBkaWUgICAgICAqLworLyogIGlkZW50aWZpZXJzIHVuZCBzdHJ1Y3RfZGVjbGFyYXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIHN0cnVjdF9pZGVudGlmaWVyICptZXJrOworICB3aGlsZShwKXsKKyAgICBtZXJrPXAtPm5leHQ7CisgICAgcC0+c2QtPmlkZW50aWZpZXI9Ijxwcm90b3R5cGUtb25seT4iOworICAgIGZyZWUocCk7CisgICAgcD1tZXJrOworICB9Cit9CitzdHJ1Y3RfZGVjbGFyYXRpb24gKmZpbmRfc3RydWN0KGNoYXIgKmlkZW50aWZpZXIsaW50IGVuZG5lc3RpbmcpCisKKy8qICBTdWNodCBhbmdlZ2ViZW5lIFN0cnVrdHVyZGVmaW5pdGlvbiB1bmQgbGllZmVydCAgICAgICAgICAgICAqLworLyogIGVudHNwcmVjaGVuZGUgc3RydWN0X2RlY2xhcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIHN0cnVjdF9pZGVudGlmaWVyICpzaTsgaW50IGksbDsKKyAgaWYobWlzcmFjaGVjaykgbD1zdHJsZW4oaWRlbnRpZmllcik7CisgIGZvcihpPW5lc3Rpbmc7aT49ZW5kbmVzdGluZztpLS0peworICAgIHNpPWZpcnN0X3NpW2ldOworICAgIHdoaWxlKHNpKXsKKyAgICAgIGlmKCFzdHJjbXAoc2ktPmlkZW50aWZpZXIsaWRlbnRpZmllcikpeworICAgICAgICBpZihERUJVRyYxKSBwcmludGYoImZvdW5kIHRhZyA8JXM+IGF0IG5lc3RpbmcgJWQtPiVwXG4iLGlkZW50aWZpZXIsaSwodm9pZCAqKXNpLT5zZCk7CisgICAgICAgIHJldHVybihzaS0+c2QpOworICAgICAgfQorI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorCXNpPXNpLT5uZXh0OworCX0KKyAgfQorICBpZihERUJVRyYxKSBwcmludGYoImRpZG4ndCBmaW5kIHRhZyA8JXM+XG4iLGlkZW50aWZpZXIpOworICByZXR1cm4oMCk7Cit9CisKKy8qIGdlbmVyYXRlIGNvZGUgdG8gY3JlYXRlIGEgdmFyaWFibGUtbGVuZ2h0LWFycmF5ICovCitzdGF0aWMgdm9pZCBjcmVhdGVfYWxsb2N2bChWYXIgKnYpCit7CisgIG5wIHRyZWUsZHM7CisgIElDICpuZXc7VmFyICpmdjsKKworICAvKiBjaGVjayBpZiB3ZSBnb3QgYSBmcmFtZS1wb2ludGVyICovCisgIGlmKEZQVkxBX1JFRyYmIXJlZ3NhW0ZQVkxBX1JFR10peworICAgIGlmKHJlZ3VzZWRbRlBWTEFfUkVHXSkKKyAgICAgIGllcnJvcigwKTsKKyAgICBlbHNlCisgICAgICByZWdzYVtGUFZMQV9SRUddPXJlZ3NjcmF0Y2hbRlBWTEFfUkVHXT1yZWd1c2VkW0ZQVkxBX1JFR109MTsKKyAgfQorCisgIC8qIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHZsYSBpbiB0aGlzIGJsb2NrLCBzYXZlIG9sZCBzcCAqLworICBpZighYmxvY2tfdmxhW25lc3RpbmddKXsKKyAgICAvKiBkZWNsYXJlIGZ1bmN0aW9uIC0gbWF5IGJlIGRvbmUgYnkgdGhlIGJhY2tlbmQsIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmKCEoZnY9ZmluZF9leHRfdmFyKCJfX29sZHZsYXNwIikpKXsKKyAgICAgIHR5cGUgKnQ7CisgICAgICBzdGF0aWMgdHlwZSB2b2lkdD17Vk9JRH07CisgICAgICBzdHJ1Y3RfZGVjbGFyYXRpb24gKnNkPW15bWFsbG9jKHNpemVvZigqc2QpKTsKKyAgICAgIHQ9bmV3X3R5cCgpOworICAgICAgdC0+ZmxhZ3M9RlVOS1Q7CisKKyAgICAgIHQtPm5leHQ9bmV3X3R5cCgpOworICAgICAgdC0+bmV4dC0+ZmxhZ3M9UE9JTlRFUl9UWVBFKCZ2b2lkdCk7CisgICAgICB0LT5uZXh0LT5uZXh0PWNsb25lX3R5cCgmdm9pZHQpOworICAgICAgc2QtPmNvdW50PTA7CisgICAgICB0LT5leGFjdD1hZGRfc2Qoc2QsRlVOS1QpOworICAgICAgZnY9YWRkX3ZhcigiX19vbGR2bGFzcCIsdCxFWFRFUk4sMCk7CisgICAgICBmdi0+Zmk9bmV3X2ZpKCk7CisgICAgICBmdi0+ZmktPmZsYWdzfD0oQUxMX1VTRVN8QUxMX01PRFMpOworICAgICAgZnYtPmZpLT5pbmxpbmVfYXNtPW15c3RyZHVwKE9MRFNQVkxBX0lOTElORUFTTSk7CisgICAgfSAKKyAgICBibG9ja192bGFbbmVzdGluZ109YWRkX3RtcF92YXIoY2xvbmVfdHlwKGZ2LT52dHlwLT5uZXh0KSk7CisgICAgdHJlZT1nZW5fbGliY2FsbCgiX19vbGR2bGFzcCIsMCwwLDAsMCk7CisgICAgbmV3PW5ld19JQygpOworICAgIG5ldy0+Y29kZT1BU1NJR047CisgICAgbmV3LT56LmZsYWdzPVZBUjsKKyAgICBuZXctPnoudj1ibG9ja192bGFbbmVzdGluZ107CisgICAgbmV3LT56LnZhbC52bWF4PWwyem0oMEwpOworICAgIG5ldy0+cTE9dHJlZS0+bzsKKyAgICBuZXctPnEyLmZsYWdzPTA7CisgICAgbmV3LT50eXBmPWJsb2NrX3ZsYVtuZXN0aW5nXS0+dnR5cC0+ZmxhZ3M7CisgICAgbmV3LT5xMi52YWwudm1heD1zaXpldGFiW25ldy0+dHlwZl07CisgICAgYWRkX0lDKG5ldyk7CisgICAgZnJlZV9leHByZXNzaW9uKHRyZWUpOworICB9CisKKyAgLyogbWFrZSByb29tIG9uIHRoZSBzdGFjayAqLworICBkcz1uZXdfbm9kZSgpOworICBkcy0+ZmxhZ3M9SURFTlRJRklFUjsKKyAgZHMtPmlkZW50aWZpZXI9ZW1wdHk7CisgIGRzLT5kc2l6ZT12bGVuZ3RoX3N6b2Yodi0+dnR5cCk7CisgIGRzLT52YWwudm1heD1sMnptKDBMKTsKKyAgZHMtPm50eXA9Y2xvbmVfdHlwKGRzLT5kc2l6ZS0+dnR5cCk7CisgIGRzLT5vLmZsYWdzPVZBUjsKKyAgZHMtPm8udj1kcy0+ZHNpemU7CisgIGRzLT5vLnZhbC52bWF4PWwyem0oMEwpOworICBkcy0+bGVmdD1kcy0+cmlnaHQ9MDsKKworICBpZighZmluZF9leHRfdmFyKCJfX2FsbG9jdmxhIikpeworICAgIC8qIGRlY2xhcmUgZnVuY3Rpb24gKi8KKyAgICBzdHJ1Y3RfZGVjbGFyYXRpb24gKnNkPW15bWFsbG9jKHNpemVvZigqc2QpKTsKKyAgICB0eXBlICp0PW5ld190eXAoKTsKKyAgICBzZC0+Y291bnQ9MTsKKyAgICBzZC0+c2w9bXltYWxsb2Moc2l6ZW9mKHN0cnVjdF9saXN0KSk7CisgICAgKCpzZC0+c2wpWzBdLnN0b3JhZ2VfY2xhc3M9QVVUTzsKKyAgICAoKnNkLT5zbClbMF0uc3R5cD1jbG9uZV90eXAoZHMtPmRzaXplLT52dHlwKTsKKyAgICAoKnNkLT5zbClbMF0ucmVnPUFMTE9DVkxBX1JFRzsKKyAgICB0LT5mbGFncz1GVU5LVDsKKyAgICB0LT5leGFjdD1hZGRfc2Qoc2QsRlVOS1QpOworICAgIHQtPm5leHQ9bmV3X3R5cCgpOworICAgIHQtPm5leHQtPmZsYWdzPVBPSU5URVJfVFlQRSh2LT52dHlwKTsKKyAgICB0LT5uZXh0LT5uZXh0PW5ld190eXAoKTsKKyAgICB0LT5uZXh0LT5uZXh0LT5mbGFncz12LT52dHlwLT5mbGFnczsKKyAgICBmdj1hZGRfdmFyKCJfX2FsbG9jdmxhIix0LEVYVEVSTiwwKTsKKyAgICBmdi0+Zmk9bmV3X2ZpKCk7CisgICAgZnYtPmZpLT5mbGFnc3w9KEFMTF9VU0VTfEFMTF9NT0RTKTsKKyAgICBmdi0+ZmktPmlubGluZV9hc209bXlzdHJkdXAoQUxMT0NWTEFfSU5MSU5FQVNNKTsKKyAgfQorCisgIGlmKCF0eXBlX2V4cHJlc3Npb24oZHMsMCkpIGllcnJvcigwKTsKKyAgdHJlZT1nZW5fbGliY2FsbCgiX19hbGxvY3ZsYSIsZHMsMCwwLDApOworICBuZXc9bmV3X0lDKCk7CisgIG5ldy0+Y29kZT1BU1NJR047CisgIG5ldy0+ei5mbGFncz1WQVI7CisgIG5ldy0+ei52PXY7CisgIG5ldy0+ei52YWwudm1heD1sMnptKDBMKTsKKyAgbmV3LT5xMT10cmVlLT5vOworICBuZXctPnEyLmZsYWdzPTA7CisgIG5ldy0+dHlwZj1QT0lOVEVSX1RZUEUodi0+dnR5cCk7CisgIG5ldy0+cTIudmFsLnZtYXg9c2l6ZXRhYltuZXctPnR5cGZdOworICBhZGRfSUMobmV3KTsKKyAgZnJlZV9leHByZXNzaW9uKHRyZWUpOworICB2bGFzPTE7Cit9CisKKy8qIHJlc2V0IHNwIHRvIHJlbW92ZSB2YXJpYWJsZS1sZW5ndGgtYXJyYXlzICovCit2b2lkIGZyZWV2bCh2b2lkKQoreworICBucCB0cmVlLGRzOworICBWYXIgKmZ2OworICBkb250ZGVsZXRlPTE7IC8qIG5ldmVyIHJlbW92ZSB0aGVtLCBvdGhlcndpc2UsIGZpeF92bGFfanVtcCBnZXQgY29uZnVzZWQgKi8KKyAgaWYoIWZpbmRfZXh0X3ZhcigiX19yZXNldHZsYXNwIikpeworICAgIHN0cnVjdF9kZWNsYXJhdGlvbiAqc2Q9bXltYWxsb2Moc2l6ZW9mKCpzZCkpOworICAgIHR5cGUgKnQ9bmV3X3R5cCgpOworICAgIHNkLT5jb3VudD0xOworICAgIHNkLT5zbD1teW1hbGxvYyhzaXplb2Yoc3RydWN0X2xpc3QpKTsKKyAgICAoKnNkLT5zbClbMF0uc3RvcmFnZV9jbGFzcz1BVVRPOworICAgICgqc2QtPnNsKVswXS5zdHlwPWNsb25lX3R5cChibG9ja192bGFbbmVzdGluZ10tPnZ0eXApOworICAgICgqc2QtPnNsKVswXS5yZWc9RlJFRVZMQV9SRUc7CisgICAgdC0+ZmxhZ3M9RlVOS1Q7CisgICAgdC0+ZXhhY3Q9YWRkX3NkKHNkLEZVTktUKTsKKyAgICB0LT5uZXh0PW5ld190eXAoKTsKKyAgICB0LT5uZXh0LT5mbGFncz1WT0lEOworICAgIGZ2PWFkZF92YXIoIl9fcmVzZXR2bGFzcCIsdCxFWFRFUk4sMCk7CisgICAgZnYtPmZpPW5ld19maSgpOworICAgIGZ2LT5maS0+ZmxhZ3N8PShBTExfVVNFU3xBTExfTU9EUyk7CisgICAgZnYtPmZpLT5pbmxpbmVfYXNtPW15c3RyZHVwKEZSRUVWTEFfSU5MSU5FQVNNKTsKKyAgfQorICBpZihuZXN0aW5nPT0xKXsKKyAgICBjbGVhcl9tYWluX3JldCgpOworICAgIGdlbl9sYWJlbChyZXR1cm5fbGFiZWwpOworICAgIGRpZF9yZXR1cm5fbGFiZWw9MTsKKyAgfQorICBkcz1uZXdfbm9kZSgpOworICBkcy0+ZmxhZ3M9SURFTlRJRklFUjsKKyAgZHMtPmlkZW50aWZpZXI9ZW1wdHk7CisgIGRzLT5kc2l6ZT1ibG9ja192bGFbbmVzdGluZ107CisgIGRzLT52YWwudm1heD1sMnptKDBMKTsKKyAgZHMtPm50eXA9Y2xvbmVfdHlwKGRzLT5kc2l6ZS0+dnR5cCk7CisgIGRzLT5sZWZ0PWRzLT5yaWdodD0wOworICBkcy0+by5mbGFncz1WQVI7CisgIGRzLT5vLnY9ZHMtPmRzaXplOworICBkcy0+by52YWwudm1heD1sMnptKDBMKTsKKyAgaWYoIXR5cGVfZXhwcmVzc2lvbihkcywwKSkgaWVycm9yKDApOworICB0cmVlPWdlbl9saWJjYWxsKCJfX3Jlc2V0dmxhc3AiLGRzLDAsMCwwKTsKKyAgZnJlZV9leHByZXNzaW9uKHRyZWUpOworICBkb250ZGVsZXRlPTA7Cit9ICAKKwordm9pZCBjbGVhcnZsKHZvaWQpCit7CisgIGxsaXN0ICpwLCpuOworICB2bGFhZGp1c3RfbGlzdCAqdmwsKnZuOworICAvKiBsb29rIGZvciBzdGFjay1hZGp1c3RzIHRoYXQgaGF2ZSB0byBiZSByZW1vdmVkICovCisgIHZsPXZsYWFkanVzdHNbbmVzdGluZ107CisgIHdoaWxlKHZsKXsKKyAgICBpbnQgbG47CisgICAgSUMgKmljPXZsLT5icmFuY2g7CisgICAgaWYoaWMpeworICAgICAgbG49aWMtPnR5cGY7CisgICAgICBpZihpYy0+Y29kZSE9QlJBKSBpZXJyb3IoMCk7CisgICAgICBwPXZsYWRlZmxhYmVsc1tuZXN0aW5nXTsKKyAgICAgIHdoaWxlKHApeworCWlmKHAtPmxhYmVsPT1sbikgYnJlYWs7CisJcD1wLT5uZXh0OworICAgICAgfQorICAgICAgaWYoIXApeworCWljPWljLT5wcmV2OworCXdoaWxlKGljIT12bC0+Zmlyc3QtPnByZXYpeworCSAgaWYoIWljKSBpZXJyb3IoMCk7CisJICBpYy0+Y29kZT1OT1A7CisJICBpYy0+cTEuZmxhZ3M9aWMtPnEyLmZsYWdzPWljLT56LmZsYWdzPTA7CisJICBpYz1pYy0+cHJldjsKKwl9CisgICAgICB9CisgICAgfQorICAgIHZuPXZsLT5uZXh0OworICAgIGZyZWUodmwpOworICAgIHZsPXZuOworICB9CisgIGZyZWV2bCgpOworICBibG9ja192bGFbbmVzdGluZ109MDsKKyAgcD12bGFkZWZsYWJlbHNbbmVzdGluZ107CisgIHdoaWxlKHApeworICAgIG49cC0+bmV4dDsKKyAgICBmcmVlKHApOworICAgIHA9bjsKKyAgfQorICBwPXZsYWptcGxhYmVsc1tuZXN0aW5nXTsKKyAgd2hpbGUocCl7CisgICAgbj1wLT5uZXh0OworICAgIGZyZWUocCk7CisgICAgcD1uOworICB9CisgIHZsYWRlZmxhYmVsc1tuZXN0aW5nXT12bGFqbXBsYWJlbHNbbmVzdGluZ109MDsKKyAgdmxhYWRqdXN0c1tuZXN0aW5nXT0wOworfQorCisvKiBIYW5kbGUgYSBzdGFjayBvZiBzdG9yZWQgc3AgdmFyaWFibGVzIHdoZW4gdHJhdmVyc2luZyBhbiBJQyBsaXN0OyAqLwordm9pZCB2bGFfbmVzdGluZyhJQyAqcCxWYXIgKip2bixpbnQgKm5lc3QpCit7CisgIGlmKHAtPmNvZGU9PUNBTEwmJihwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiYhc3RyY21wKHAtPnExLnYtPmlkZW50aWZpZXIsIl9fb2xkdmxhc3AiKSl7CisgICAgSUMgKnAyPXAtPm5leHQ7CisgICAgd2hpbGUocDImJihwMi0+Y29kZT09QUxMT0NSRUd8fHAyLT5jb2RlPT1GUkVFUkVHKSkgcDI9cDItPm5leHQ7CisgICAgaWYoIXAyfHxwMi0+Y29kZSE9R0VUUkVUVVJOfHwocDItPnouZmxhZ3MmKFZBUnxEUkVGT0JKKSkhPVZBUikgaWVycm9yKDApOworICAgIC8qcHJpbnRmKCJmb3VuZCBzYXZlIHNwIHRvICVwXG4iLHAyLT56LnYpOyovCisgICAgdm5bKm5lc3RdPXAyLT56LnY7CisgICAgKCpuZXN0KSsrOworICAgIHZuWypuZXN0XT0wOworICAgIGlmKCpuZXN0Pj1NQVhOKSBpZXJyb3IoMCk7CisgICAgcmV0dXJuOworICB9CisgIGlmKHAtPmNvZGU9PUNBTEwmJihwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiYhc3RyY21wKHAtPnExLnYtPmlkZW50aWZpZXIsIl9fcmVzZXR2bGFzcCIpKXsgCisgICAgLypwcmludGYoImZvdW5kIHJlc2V0XG4iKTsqLworICAgIGlmKCpuZXN0PD0wKSBpZXJyb3IoMCk7CisgICAgKCpuZXN0KS0tOworICAgIHJldHVybjsKKyAgfQorfQorCitzdGF0aWMgaW50IHJldHVybl92bGFfbmVzdDsKK3N0YXRpYyBWYXIgKnJldHVybl9sYXN0X3ZsYXNwOworCisvKiBGaW5kIHRoZSBzdGFjayBwb2ludGVyIHRoYXQgaXMgbmVlZGVkIHdoZW4ganVtcGluZyB0byBsYWJlbCBsYWIgKi8KK1ZhciAqdmxhX2ZpbmRfc3AoaW50IGxhYikKK3sKKyAgSUMgKnA7aW50IG5lc3Q9MDsKKyAgc3RhdGljIFZhciAqdm5bTUFYTl07CisgIGZvcihwPWZpcnN0X2ljO3A7cD1wLT5uZXh0KXsKKyAgICBpZihwLT5jb2RlPT1MQUJFTCYmcC0+dHlwZj09bGFiKXsKKyAgICAgIHJldHVybl92bGFfbmVzdD1uZXN0OworICAgICAgcmV0dXJuX2xhc3Rfdmxhc3A9dm5bbmVzdF07CisgICAgICBpZihuZXN0PD0wKQorCXJldHVybiAwOworICAgICAgZWxzZQorCXJldHVybiB2bltuZXN0LTFdOworICAgIH0KKyAgICB2bGFfbmVzdGluZyhwLHZuLCZuZXN0KTsKKyAgfQorICBpZXJyb3IoMCk7Cit9CisKK3ZvaWQgdmxhX2p1bXBfZml4KHZvaWQpCit7CisgIElDICpwO2ludCBuZXN0PTA7CisgIHN0YXRpYyBWYXIgKnZuW01BWE5dLCpzYXZlZHNwOworICBpZihERUJVRyYxKSBwcmludGYoInNlYXJjaGluZyBmb3IgdmxhLWp1bXAtZml4ZXNcbiIpOworICBmb3IocD1maXJzdF9pYztwO3A9cC0+bmV4dCl7CisgICAgLypwcmljMihzdGRvdXQscCk7Ki8KKyAgICBpZihwLT5jb2RlPj1CRVEmJnAtPmNvZGU8PUJSQSl7CisgICAgICAvKnByaW50ZigianVtcCBmb3VuZFxuIik7Ki8KKyAgICAgIHAtPnNhdmVkc3A9MDsKKyAgICAgIGlmKDEvKm5lc3Q+MCovKXsKKwkvKnByaW50ZigiaXMgaW4gdmxhIGNvbnRleHQhXG4iKTsqLworCXNhdmVkc3A9dmxhX2ZpbmRfc3AocC0+dHlwZik7CisJaWYocmV0dXJuX3ZsYV9uZXN0Pm5lc3R8fChuZXN0PjAmJnJldHVybl92bGFfbmVzdD09bmVzdCYmc2F2ZWRzcCE9dm5bbmVzdC0xXSkpeworCSAgZXJyX2ljPXA7CisJICBlcnJvcigzNTEpOworCX1lbHNlIGlmKG5lc3Q9PTB8fHNhdmVkc3A9PXZuW25lc3QtMV0peworCSAgLypwcmludGYoImp1bXAgd2l0aGluIHRoZSBzYW1lIGNvbnRleHRcbiIpOyovCisJfWVsc2V7CisJICBpZih2bltuZXN0XSl7CisJICAgIGlmKERFQlVHJjEpIHByaW50ZigiaGF2ZSB0byBzZXQgc3AgdG8gJXBcbiIscmV0dXJuX2xhc3Rfdmxhc3ApOworCSAgICBwLT5zYXZlZHNwPXJldHVybl9sYXN0X3ZsYXNwOworCSAgfWVsc2V7CisJICAgIGludCBuZGlmZj1uZXN0LXJldHVybl92bGFfbmVzdC0xOworCSAgICBJQyAqcDI7CisJICAgIC8qcHJpbnRmKCJoYXZlIHRvIHNlYXJjaCBvbGRzcCBuZGlmZj0lZFxuIixuZGlmZik7Ki8KKwkgICAgZm9yKHAyPXAtPnByZXY7cDI7cDI9cDItPnByZXYpeworCSAgICAgIGlmKHAyLT5jb2RlPT1DQUxMJiYocDItPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJiFzdHJjbXAocDItPnExLnYtPmlkZW50aWZpZXIsIl9fb2xkdmxhc3AiKSl7CisJCWlmKG5kaWZmPT0wKXsKKwkJICAvKnByaW50ZigiZm91bmQgc2F2ZXNwXG4iKTsqLworCQkgIHAyPXAyLT5uZXh0OworCQkgIHdoaWxlKHAyJiYocDItPmNvZGU9PUFMTE9DUkVHfHxwMi0+Y29kZT09RlJFRVJFRykpIHAyPXAyLT5uZXh0OworCQkgIGlmKCFwMnx8cDItPmNvZGUhPUdFVFJFVFVSTikgaWVycm9yKDApOworCQkgIGlmKChwMi0+ei5mbGFncyYoVkFSfERSRUZPQkopKSE9VkFSKSBpZXJyb3IoMCk7CisJCSAgLypwcmludGYoImZvdW5kIG9sZHNwICVwXG4iLHAyLT56LnYpOyovCisJCSAgcC0+c2F2ZWRzcD1wMi0+ei52OworCQkgIGJyZWFrOworCQl9CisJCW5kaWZmLS07CisJICAgICAgfQorCSAgICAgIGlmKHAyLT5jb2RlPT1DQUxMJiYocDItPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJiFzdHJjbXAocDItPnExLnYtPmlkZW50aWZpZXIsIl9fcmVzZXR2bGFzcCIpKXsKKwkJbmRpZmYrKzsKKwkgICAgICB9CisJICAgIH0KKwkgICAgaWYoIXAyKSBpZXJyb3IoMCk7CisJICB9CisJfQorICAgICAgfWVsc2V7CisJLypwcmludGYoIm5vdCBpbiB2bGEgY29udGV4dFxuIik7Ki8KKyAgICAgIH0KKyAgICB9CisgICAgdmxhX25lc3RpbmcocCx2biwmbmVzdCk7CisgIH0KKyAgZm9yKHA9Zmlyc3RfaWM7cDtwPXAtPm5leHQpeworICAgIGlmKHAtPmNvZGU+PUJFUSYmcC0+Y29kZTw9QlJBKXsgIAorICAgICAgaWYocC0+c2F2ZWRzcCl7CisJSUMgKm1lcmtmaWMsKm1lcmtsaWMsKm5ld2NvZGUsKm0sKm5ldywqc2V0cj0wOworCW5wIGRzLHRyZWU7CisJaWYoREVCVUcmMSkgcHJpbnRmKCJnZW5lcmF0aW5nIHNwLWFkanVzdFxuIik7CisgICAgICAgIG1lcmtmaWM9Zmlyc3RfaWM7bWVya2xpYz1sYXN0X2ljOworCWZpcnN0X2ljPTA7bGFzdF9pYz0wOworCWRzPW5ld19ub2RlKCk7CisJZHMtPmZsYWdzPUlERU5USUZJRVI7CisJZHMtPmlkZW50aWZpZXI9ZW1wdHk7CisJZHMtPmRzaXplPXAtPnNhdmVkc3A7CisJZHMtPnZhbC52bWF4PWwyem0oMEwpOworCWRzLT5udHlwPWNsb25lX3R5cChkcy0+ZHNpemUtPnZ0eXApOworCWRzLT5sZWZ0PWRzLT5yaWdodD0wOworCWRzLT5vLmZsYWdzPVZBUjsKKwlkcy0+by52PWRzLT5kc2l6ZTsKKwlkcy0+by52YWwudm1heD1sMnptKDBMKTsKKwlpZighdHlwZV9leHByZXNzaW9uKGRzLDApKSBpZXJyb3IoMCk7CisJdHJlZT1nZW5fbGliY2FsbCgiX19yZXNldHZsYXNwIixkcywwLDAsMCk7CisJZnJlZV9leHByZXNzaW9uKHRyZWUpOworCW5ld2NvZGU9Zmlyc3RfaWM7CisJZmlyc3RfaWM9bWVya2ZpYztsYXN0X2ljPW1lcmtsaWM7CisJaWYocC0+Y29kZT09QlJBKXsKKwkgIC8qIGNoZWNrIGlmIHRoZSBicmFuY2ggd2FzIHByZWNlZGVkIGJ5IGEgU0VUUkVUVVJOICovCisJICBJQyAqcDI9cC0+cHJldjsKKwkgIHdoaWxlKHAyJiYocDItPmNvZGU9PUZSRUVSRUd8fHAyLT5jb2RlPT1BTExPQ1JFRykpCisJICAgIHAyPXAyLT5wcmV2OworCSAgaWYocDItPmNvZGU9PVNFVFJFVFVSTiYmcDItPnoucmVnKQorCSAgICBzZXRyPXAyOworCX1lbHNleworCSAgbmV3PW5ld19JQygpOworCSAgbmV3LT50eXBmPSsrbGFiZWw7CisJICBpZihwLT5jb2RlPT1CRVEpIG5ldy0+Y29kZT1CUkE7CisJICBlbHNlIGlmKHAtPmNvZGU9PUJORSkgbmV3LT5jb2RlPUJFUTsKKwkgIGVsc2UgaWYocC0+Y29kZT09QkxUKSBuZXctPmNvZGU9QkdFOworCSAgZWxzZSBpZihwLT5jb2RlPT1CR1QpIG5ldy0+Y29kZT1CTEU7CisJICBlbHNlIGlmKHAtPmNvZGU9PUJMRSkgbmV3LT5jb2RlPUJHVDsKKwkgIGVsc2UgaWYocC0+Y29kZT09QkdFKSBuZXctPmNvZGU9QkxUOworCSAgaW5zZXJ0X0lDKHAtPnByZXYsbmV3KTsKKwl9CisJd2hpbGUobmV3Y29kZSl7CisJICBtPW5ld2NvZGUtPm5leHQ7CisJICBpbnNlcnRfSUMocC0+cHJldixuZXdjb2RlKTsKKwkgIG5ld2NvZGU9bTsKKwl9CisJaWYocC0+Y29kZSE9QlJBKXsKKwkgIHAtPmNvZGU9QlJBOworCSAgbmV3PW5ld19JQygpOworCSAgbmV3LT5jb2RlPUxBQkVMOworCSAgbmV3LT50eXBmPWxhYmVsOworCSAgaW5zZXJ0X0lDKHAsbmV3KTsKKwl9CisJaWYoc2V0cil7CisJICAvKiBzYXZlIHRoZSByZXR1cm4gdmFsdWUgdG8gc2F2ZSBpdCBmcm9tIGJlaW5nIG92ZXJ3cml0dGVuICovCisJICAvKiBjb3VsZCBiZSBvcHRpbWl6ZWQgZnVydGhlciAqLworCSAgVmFyICp2OworCSAgaWYoSVNTQ0FMQVIoc2V0ci0+dHlwZikpeworCSAgICBzdGF0aWMgdHlwZSB0PXswfTsKKwkgICAgdC5mbGFncz1zZXRyLT50eXBmOworCSAgICB2PWFkZF90bXBfdmFyKGNsb25lX3R5cCgmdCkpOworCSAgfWVsc2UgaWVycm9yKDApOworCSAgbmV3PW5ld19JQygpOworCSAgKm5ldz0qc2V0cjsKKwkgIG5ldy0+cTEuZmxhZ3M9VkFSOworCSAgbmV3LT5xMS52PXY7CisJICBuZXctPnExLnZhbC52bWF4PWwyem0oMEwpOworCSAgc2V0ci0+ej1uZXctPnExOworCSAgc2V0ci0+Y29kZT1BU1NJR047CisJICBpbnNlcnRfSUMocC0+cHJldixuZXcpOworCX0KKyAgICAgIH0KKyAgICB9CisgIH0KK30gIAorICAKKworVmFyICphZGRfdG1wX3Zhcih0eXBlICp0KQoreworICB0LT5mbGFncyY9TlU7CisgIHJldHVybiBhZGRfdmFyKGVtcHR5LHQsQVVUTywwKTsKK30KK1ZhciAqYWRkX3ZhcihjaGFyICppZGVudGlmaWVyLCB0eXBlICp0LCBpbnQgc3RvcmFnZV9jbGFzcyxjb25zdF9saXN0ICpjbGlzdCkKKy8qICBGdWVndCBlaW5lIFZhcmlhYmxlIG1pdCBUeXAgaW4gZGllIHZhcl9saXN0IGVpbi4gICAgICAgICAgICAqLworLyogIEluIGRlciBzdG9yYWdlX2NsYXNzIHdlcmRlbiBkaWUgRmxhZ3MgUEFSQU1FVEVSIHVuZCBldnRsLiAgICovCisvKiAgT0xEU1RZTEUgdW5kIFJFR1BBUk0gZXJrYW5udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgVmFyICpuZXc7aW50IGY7CisgIHN0cnVjdF9kZWNsYXJhdGlvbiAqc2Q7CisgIHN0YXRpYyB6bWF4IHBhcm9mZnNldDsKKyAgem1heCBhbDsKKyAgLyppZigqaWRlbnRpZmllcj09MCkgcmV0dXJuOyovIC8qIHNvbGx0ZSB3b2FuZGVycyBiZW1hZWtlbHQgd2VyZGVuICovCisgIGlmKERFQlVHJjIpIHByaW50ZigiYWRkX3ZhcigpOiAlc1xuIixpZGVudGlmaWVyKTsKKyNpZmRlZiBIQVZFX1RBUkdFVF9WQVJIT09LX1BSRQorICBhZGRfdmFyX2hvb2tfcHJlKGlkZW50aWZpZXIsdCxzdG9yYWdlX2NsYXNzLGNsaXN0KTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICBpZihJU0ZVTkModC0+ZmxhZ3MmTlEpJiYoSVNBUlJBWSh0LT5uZXh0LT5mbGFncyl8fElTRlVOQyh0LT5uZXh0LT5mbGFncykpKQorICAgIGVycm9yKDI1KTsKKyAgbmV3PW15bWFsbG9jKHNpemVvZihWYXIpKTsKKyAgaWYoISppZGVudGlmaWVyJiZpZGVudGlmaWVyIT1lbXB0eSkgaWVycm9yKDApOworICBuZXctPmNsaXN0PWNsaXN0OworICBuZXctPnZ0eXA9dDsKKyAgbmV3LT5zdG9yYWdlX2NsYXNzPXN0b3JhZ2VfY2xhc3MmUExBSU5fU1RPUkFHRV9DTEFTUzsKKyAgbmV3LT5yZWc9MDsKKyAgbmV3LT52YXR0cj0wOworICBuZXctPm5leHQ9MDsKKyAgbmV3LT5mbGFncz0wOworICBuZXctPmlucj0wOworICBuZXctPmZpPTA7CisgIG5ldy0+bmVzdGluZz1uZXN0aW5nOworICBuZXctPmZpbGVuYW1lPWZpbGVuYW1lOworICBuZXctPmxpbmU9bGluZTsKKyAgbmV3LT5kZmlsZW5hbWU9MDsKKyAgbmV3LT5kbGluZT0wOworICBuZXctPmRlc2NyaXB0aW9uPTA7CisgIG5ldy0+dHVuaXQ9bGFzdF90dW5pdDsKKyAgbmV3LT5pbmxpbmVfY29weT0wOworICBuZXctPmluZGV4PS0xOworI2lmZGVmIEhBVkVfVEFSR0VUX0FUVFJJQlVURVMKKyAgbmV3LT50YXR0cj0wOworI2VuZGlmCisgIC8qICAgIGlmKChzdG9yYWdlX2NsYXNzJlBMQUlOX1NUT1JBR0VfQ0xBU1MpPT1TVEFUSUN8fChzdG9yYWdlX2NsYXNzJlBMQUlOX1NUT1JBR0VfQ0xBU1MpPT1FWFRFUk4pIG5ldy0+ZmxhZ3M9VVNFREFTU09VUkNFfFVTRURBU0RFU1Q7Ki8KKyAgaWYoREVCVUcmMikgcHJpbnRmKCJzdG9yYWdlX2NsYXNzPSVkXG4iLHN0b3JhZ2VfY2xhc3MpOworICBpZihzdG9yYWdlX2NsYXNzJlBBUkFNRVRFUikgbmV3LT5mbGFnc3w9VVNFREFTREVTVDsKKyAgaWYoc3RvcmFnZV9jbGFzcyZSRUdQQVJNKXsKKyAgICBuZXctPmZsYWdzfD1SRUdQQVJNOworICAgIGlmKCEoc3RvcmFnZV9jbGFzcyZEQkxQVVNIKSl7CisgICAgICBpZigoc3RvcmFnZV9jbGFzcyZPTERTVFlMRSkmJih0LT5mbGFncyZOUSk9PUZMT0FUKQorCW5ldy0+ZmxhZ3N8PUNPTlZQQVJBTUVURVI7CisgICAgICBzdG9yYWdlX2NsYXNzJj1+UEFSQU1FVEVSOworICAgIH0KKyAgfQorICBpZihERUJVRyYyKSBwcmludGYoInN0b3JhZ2VfY2xhc3M9JWRcbiIsc3RvcmFnZV9jbGFzcyk7CisgIGlmKERFQlVHJjIpIHByaW50ZigibWF4X29mZnNldD0lbGRcbiIsem0ybChtYXhfb2Zmc2V0KSk7CisgIGlmKGlzX3ZsZW5ndGgodCkmJnN0b3JhZ2VfY2xhc3MhPUFVVE8mJnN0b3JhZ2VfY2xhc3MhPVJFR0lTVEVSKQorICAgIGVycm9yKDMxNSk7CisgIGlmKChzdG9yYWdlX2NsYXNzJlBMQUlOX1NUT1JBR0VfQ0xBU1MpPT1SRUdJU1RFUikgbmV3LT5wcmlvcml0eT1yZWdpc3RlcnByaTsgZWxzZSBuZXctPnByaW9yaXR5PTA7CisgIGlmKC8qbmVzdGluZz09MCYmKi9uZXctPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisgICAgaW50IG09bmVzdGluZzsKKyAgICBuZXN0aW5nPTA7CisgICAgbmV3LT5pZGVudGlmaWVyPWFkZF9pZGVudGlmaWVyKGlkZW50aWZpZXIsc3RybGVuKGlkZW50aWZpZXIpKTsKKyAgICBuZXN0aW5nPW07CisgICAgaWYobGFzdF9leHQpeworICAgICAgbGFzdF9leHQtPm5leHQ9bmV3OworICAgICAgbGFzdF9leHQ9bmV3OworICAgIH1lbHNleworICAgICAgZmlyc3RfZXh0PWxhc3RfZXh0PW5ldzsKKyAgICAgIHZsMD1maXJzdF9leHQ7CisgICAgfQorICAgIGlmKGhhc2hfZXh0KSBhZGRfaGFzaGVudHJ5KGhhc2hfZXh0LG5ldy0+aWRlbnRpZmllcixuZXcpOworICB9ZWxzZXsKKyAgICBuZXctPmlkZW50aWZpZXI9YWRkX2lkZW50aWZpZXIoaWRlbnRpZmllcixzdHJsZW4oaWRlbnRpZmllcikpOworICAgIGlmKGxhc3RfdmFyW25lc3RpbmddKXsKKyAgICAgIG5ldy0+b2Zmc2V0PXptYWRkKGxhc3RfdmFyW25lc3RpbmddLT5vZmZzZXQsc3pvZihsYXN0X3ZhcltuZXN0aW5nXS0+dnR5cCkpOworICAgICAgbGFzdF92YXJbbmVzdGluZ10tPm5leHQ9bmV3OworICAgICAgbGFzdF92YXJbbmVzdGluZ109bmV3OworICAgIH1lbHNleworICAgICAgbmV3LT5vZmZzZXQ9bDJ6bSgwTCk7CisgICAgICBwYXJvZmZzZXQ9bDJ6bSgwTCk7OworICAgICAgZmlyc3RfdmFyW25lc3RpbmddPWxhc3RfdmFyW25lc3RpbmddPW5ldzsKKyAgICAgIGlmKG5lc3Rpbmc9PTApIHZsMT1uZXc7CisgICAgICBpZihuZXN0aW5nPT0xKSB2bDI9bmV3OworICAgIH0KKyAgfQorICBmPXQtPmZsYWdzJk5ROworICBpZigoc3RvcmFnZV9jbGFzcyZQTEFJTl9TVE9SQUdFX0NMQVNTKT09QVVUT3x8KHN0b3JhZ2VfY2xhc3MmUExBSU5fU1RPUkFHRV9DTEFTUyk9PVJFR0lTVEVSKXsKKyAgICBpZihERUJVRyYyKSBwcmludGYoImF1dG9cbiIpOworICAgIGFsPWZhbGlnbih0KTsKKyAgICBpZigoY19mbGFnc192YWxbMF0ubCYyKSYmbmVzdGluZz09MSYmIShzdG9yYWdlX2NsYXNzJlBBUkFNRVRFUikpeworICAgICAgbmV3LT5vZmZzZXQ9bWF4X29mZnNldDsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKHN0b3JhZ2VfY2xhc3MmUEFSQU1FVEVSKXsKKyAgICAgICAgbmV3LT5vZmZzZXQ9cGFyb2Zmc2V0OworCWlmKGFsaWduX2FyZ3VtZW50cykKKwkgIG5ldy0+b2Zmc2V0PXptbXVsdCh6bWRpdih6bWFkZChuZXctPm9mZnNldCx6bXN1YihhbCxsMnptKDFMKSkpLGFsKSxhbCk7CisgICAgICB9ZWxzZXsKKyAgICAgICAgbmV3LT5vZmZzZXQ9bG9jYWxfb2Zmc2V0W25lc3RpbmddOworCW5ldy0+b2Zmc2V0PXptbXVsdCh6bWRpdih6bWFkZChuZXctPm9mZnNldCx6bXN1YihhbCxsMnptKDFMKSkpLGFsKSxhbCk7CisgICAgICB9CisgICAgfQorICAgIGlmKHN0b3JhZ2VfY2xhc3MmUEFSQU1FVEVSKXsKKyAgICAgIG5ldy0+b2Zmc2V0PXptbXVsdCh6bWRpdih6bWFkZChuZXctPm9mZnNldCx6bXN1YihzdGFja2FsaWduLGwyem0oMUwpKSksc3RhY2thbGlnbiksc3RhY2thbGlnbik7CisgICAgICBpZihJU0lOVChmKSYmZjxJTlQmJiFzaG9ydF9wdXNoKXsKKyAgICAgICAgLyogIEludGVnZXItRXJ3ZWl0ZXJ1bmdlbiBmdWVyIGFsbGUgRnVua3Rpb25zcGFyYW1ldGVyICAqLworICAgICAgICBwYXJvZmZzZXQ9em1hZGQobmV3LT5vZmZzZXQsc2l6ZXRhYltJTlRdKTsKKyAgICAgIH1lbHNleworICAgICAgICBpZihmPT1GTE9BVCYmKHN0b3JhZ2VfY2xhc3MmT0xEU1RZTEUpKXsKKyAgICAgICAgICAvKiAgQmVpIGFsdGVuIEZ1bmt0aW9uZW4gd2VyZGVuIEZMT0FUIGFscyBET1VCTEUgdWViZXJnZWJlbiAqLworICAgICAgICAgIG5ldy0+b2Zmc2V0PXptbXVsdCh6bWRpdih6bWFkZChuZXctPm9mZnNldCx6bXN1YihhbGlnbltET1VCTEVdLGwyem0oMUwpKSksYWxpZ25bRE9VQkxFXSksYWxpZ25bRE9VQkxFXSk7CisgICAgICAgICAgcGFyb2Zmc2V0PXptYWRkKG5ldy0+b2Zmc2V0LHNpemV0YWJbRE9VQkxFXSk7CisgICAgICAgIH1lbHNleworICAgICAgICAgIHBhcm9mZnNldD16bWFkZChuZXctPm9mZnNldCxzem9mKG5ldy0+dnR5cCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfWVsc2V7CisgICAgICBsb2NhbF9vZmZzZXRbbmVzdGluZ109em1hZGQobmV3LT5vZmZzZXQsc3pvZihuZXctPnZ0eXApKTsKKyAgICB9CisgICAgaWYoIShzdG9yYWdlX2NsYXNzJlBBUkFNRVRFUikpCisgICAgICBpZih6bWxlcShtYXhfb2Zmc2V0LGxvY2FsX29mZnNldFtuZXN0aW5nXSkpIG1heF9vZmZzZXQ9bG9jYWxfb2Zmc2V0W25lc3RpbmddOworICAgIGlmKERFQlVHJjIpIHByaW50ZigibWF4X29mZnNldD0lbGRcbiIsem0ybChtYXhfb2Zmc2V0KSk7CisgIH0KKyAgaWYoKHN0b3JhZ2VfY2xhc3MmUExBSU5fU1RPUkFHRV9DTEFTUyk9PVNUQVRJQykgbmV3LT5vZmZzZXQ9bDJ6bSgobG9uZykrK2xhYmVsKTsKKyAgaWYoc3RvcmFnZV9jbGFzcyZQQVJBTUVURVIpeworCisgICAgaWYoREVCVUcmMikgcHJpbnRmKCJwYXJhbWV0ZXJcbiIpOworCisgICAgaWYoSVNJTlQoZikmJmY8SU5UJiYhem1sZXEoc2l6ZXRhYltJTlRdLHNpemV0YWJbZl0pKXsKKyAgICAgIGlmKEJJR0VORElBTil7CisgICAgICAgIG5ldy0+b2Zmc2V0PXptYWRkKG5ldy0+b2Zmc2V0LHptc3ViKHNpemV0YWJbSU5UXSxzaXpldGFiW2ZdKSk7CisgICAgICB9ZWxzZXsKKyAgICAgICAgaWYoIUxJVFRMRUVORElBTikKKyAgICAgICAgICBpZXJyb3IoMCk7CisgICAgICB9CisgICAgfQorICAgIGlmKChzdG9yYWdlX2NsYXNzJk9MRFNUWUxFKSYmZj09RkxPQVQpeworICAgICAgLyogIEJlaSBhbHRlbiBGdW5rdGlvbmVuIHdlcmRlbiBET1VCTEUgbmFjaCBGTE9BVCBrb252ZXJ0aWVydCAgICovCisgICAgICBpZighKHN0b3JhZ2VfY2xhc3MmUkVHUEFSTSkpeworI2lmIEhBVkVfTElCQ0FMTFMKKwlzdGF0aWMgdHlwZSBkdD17RE9VQkxFfSxmdD17RkxPQVR9OworCXN0YXRpYyBub2RlIG4sbm47CisJSUMgKmNvbnY9bmV3X0lDKCk7CisJbi5mbGFncz1SRUlOVEVSUFJFVDsKKwluLmxlZnQ9Jm5uOworCW4ubnR5cD0mZHQ7CisJbm4uZmxhZ3M9SURFTlRJRklFUjsKKwlubi5pZGVudGlmaWVyPWlkZW50aWZpZXI7CisJbm4ubnR5cD0mZnQ7CisJbm4uby5mbGFncz1WQVJ8RE9OVFJFR0lTVEVSSVpFOworCW5uLm8udj1uZXc7CisJbm4uby52YWwudm1heD1sMnptKDBMKTsKKwluLm89bm4ubzsKKwljb252ZXJ0KCZuLEZMT0FUKTsKKwkKKworCWNvbnYtPmNvZGU9QVNTSUdOOworCWNvbnYtPnR5cGY9RkxPQVQ7CisJY29udi0+cTE9bi5vOworCWNvbnYtPnoudj1uZXc7CisJY29udi0+ei5mbGFncz1WQVI7CisJY29udi0+ei52YWwudm1heD1sMnptKDBMKTsKKwljb252LT5xMi52YWwudm1heD1zaXpldGFiW0ZMT0FUXTsKKwljb252LT56LnY9bmV3OworCWFkZF9JQyhjb252KTsJCisjZWxzZQorCUlDICpjb252PW5ld19JQygpOworCWNvbnYtPmNvZGU9Q09OVkVSVDsKKwljb252LT50eXBmPUZMT0FUOworCWNvbnYtPnR5cGYyPURPVUJMRTsKKwljb252LT5xMS5mbGFncz1WQVJ8RE9OVFJFR0lTVEVSSVpFOworCWNvbnYtPnouZmxhZ3M9VkFSOworCWNvbnYtPnEyLmZsYWdzPTA7CisJY29udi0+cTEudj1jb252LT56LnY9bmV3OworCWNvbnYtPnExLnZhbC52bWF4PWNvbnYtPnoudmFsLnZtYXg9bDJ6bSgwKTsKKwlhZGRfSUMoY29udik7CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIG5ldy0+ZmxhZ3N8PUNPTlZQQVJBTUVURVI7CisgICAgfQorICAgIG5ldy0+b2Zmc2V0PXptc3ViKGwyem0oMEwpLHptYWRkKG1heGFsaWduLG5ldy0+b2Zmc2V0KSk7CisgIH0KKyAgaWYoKHN0b3JhZ2VfY2xhc3MmUExBSU5fU1RPUkFHRV9DTEFTUyk9PUVYVEVSTil7CisgICAgaWYoIXN0cmNtcCgiZnByaW50ZiIsaWRlbnRpZmllcikpIG5ldy0+ZmxhZ3N8PVBSSU5URkxJS0U7CisgICAgaWYoIXN0cmNtcCgicHJpbnRmIixpZGVudGlmaWVyKSkgIG5ldy0+ZmxhZ3N8PVBSSU5URkxJS0U7CisgICAgaWYoIXN0cmNtcCgic3ByaW50ZiIsaWRlbnRpZmllcikpIG5ldy0+ZmxhZ3N8PVBSSU5URkxJS0U7CisgICAgaWYoIXN0cmNtcCgiZnNjYW5mIixpZGVudGlmaWVyKSkgIG5ldy0+ZmxhZ3N8PVNDQU5GTElLRTsKKyAgICBpZighc3RyY21wKCJzY2FuZiIsaWRlbnRpZmllcikpICAgbmV3LT5mbGFnc3w9U0NBTkZMSUtFOworICAgIGlmKCFzdHJjbXAoInNzY2FuZiIsaWRlbnRpZmllcikpICBuZXctPmZsYWdzfD1TQ0FORkxJS0U7CisgIH0KKyAgaWYoaXNfdmxlbmd0aChuZXctPnZ0eXApKQorICAgIGNyZWF0ZV9hbGxvY3ZsKG5ldyk7CisjaWZkZWYgSEFWRV9UQVJHRVRfVkFSSE9PS19QT1NUCisgIGFkZF92YXJfaG9va19wb3N0KG5ldyk7CisjZW5kaWYKKyAgcmV0dXJuKG5ldyk7Cit9Cit2b2lkIGZyZWVfdmFyKFZhciAqcCkKKy8qICBHaWJ0IFZhcmlhYmxlbmxpc3RlIGlua2wuIFR5cCwgYWJlciBvaG5lIElkZW50aWZpZXIgZnJlaS4gICAqLworeworICBWYXIgKm1lcms7CisgIHdoaWxlKHApeworICAgIGlmKCEqcC0+aWRlbnRpZmllciYmcC0+aWRlbnRpZmllciE9ZW1wdHkpIGllcnJvcigwKTsKKyAgICBmcmVlKHAtPmRlc2NyaXB0aW9uKTsKKyAgICBmcmVlKHAtPnZhdHRyKTsKKyAgICBtZXJrPXAtPm5leHQ7CisgICAgaWYoIShwLT5mbGFncyZVU0VEQVNBRFIpJiYocC0+c3RvcmFnZV9jbGFzcz09QVVUT3x8cC0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpKXsKKyAgICAgIGlmKCpwLT5pZGVudGlmaWVyJiYhKHAtPmZsYWdzJlVTRURBU0RFU1QpJiZJU1NDQUxBUihwLT52dHlwLT5mbGFncykpIGVycm9yKDY0LHAtPmlkZW50aWZpZXIpOworICAgICAgaWYoKnAtPmlkZW50aWZpZXImJiEocC0+ZmxhZ3MmVVNFREFTU09VUkNFKSYmSVNTQ0FMQVIocC0+dnR5cC0+ZmxhZ3MpKSBlcnJvcig2NSxwLT5pZGVudGlmaWVyKTsKKyAgICB9CisgICAgaWYoREVCVUcmMikgcHJpbnRmKCJmcmVlX3ZhciAlcywgcHJpPSVkXG4iLHAtPmlkZW50aWZpZXIscC0+cHJpb3JpdHkpOworICAgIGlmKHAtPnZ0eXApIGZyZWV0eXAocC0+dnR5cCk7CisgICAgaWYocC0+Y2xpc3QpIGZyZWVfY2xpc3QocC0+Y2xpc3QpOworICAgIGlmKHAtPmZpKXsKKyAgICAgIGlmKERFQlVHJjIpIHByaW50ZigiZnJlZV9maSBvZiBmdW5jdGlvbiAlc1xuIixwLT5pZGVudGlmaWVyKTsKKyAgICAgIGZyZWVfZmkocC0+ZmkpOworICAgICAgaWYoREVCVUcmMikgcHJpbnRmKCJlbmQgZnJlZV9maSBvZiBmdW5jdGlvbiAlc1xuIixwLT5pZGVudGlmaWVyKTsKKyAgICB9CisgICAgZnJlZShwKTsKKyAgICBwPW1lcms7CisgIH0KK30KK1ZhciAqZmluZF9leHRfdmFyKGNoYXIgKmlkZW50aWZpZXIpCit7CisgIFZhciAqdjtpbnQgbDsKKyAgaWYobWlzcmFjaGVjaykgbD1zdHJsZW4oaWRlbnRpZmllcik7CisgIGlmKGhhc2hfZXh0KSByZXR1cm4gZmluZF9uYW1lKGhhc2hfZXh0LGlkZW50aWZpZXIpOworICBmb3Iodj1maXJzdF9leHQ7djt2PXYtPm5leHQpeworICAgIGlmKCFzdHJjbXAodi0+aWRlbnRpZmllcixpZGVudGlmaWVyKSkgcmV0dXJuIHY7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisKKyAgfQorICByZXR1cm4gMDsKK30KK1ZhciAqZmluZF92YXIoY2hhciAqaWRlbnRpZmllcixpbnQgZW5kbmVzdGluZykKKy8qICBTdWNodCBWYXJpYWJsZSBtaXQgQmV6ZWljaG5lciB1bmQgbGllZmVydCBaZWlnZXIgenVydWVjayAgICAqLworLyogIGVzIHdlcmRlbiBudXIgVmFyaWFibGVuIGRlciBCbG9lY2tlIGVuZG5lc3RpbmctbmVzdGluZyAgICAgICovCisvKiAgZHVyY2hzdWNodC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGksbDtWYXIgKnY7CisgIGlmKGlkZW50aWZpZXI9PTB8fCppZGVudGlmaWVyPT0wKSByZXR1cm4gMDsKKyAgaWYobWlzcmFjaGVjaykgbD1zdHJsZW4oaWRlbnRpZmllcik7CisgIGZvcihpPW5lc3Rpbmc7aT49ZW5kbmVzdGluZztpLS0peworICAgIGZvcih2PWZpcnN0X3ZhcltpXTt2O3Y9di0+bmV4dCl7CisgICAgICBpZighc3RyY21wKHYtPmlkZW50aWZpZXIsaWRlbnRpZmllcikpCisJcmV0dXJuIHY7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgfQorICB9CisgIGlmKGVuZG5lc3Rpbmc9PTApeworICAgIHY9ZmluZF9leHRfdmFyKGlkZW50aWZpZXIpOworICAgIGlmKHYmJiEodi0+ZmxhZ3MmTk9USU5UVSkpCisgICAgICByZXR1cm4gdjsKKyAgICBlbHNlCisgICAgICByZXR1cm4gMDsKKyAgfWVsc2UKKyAgICByZXR1cm4gMDsKK30KKworCisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisKKworCitpbnQgY2hlY2tfemVyb19pbml0aWFsaXNhdGlvbihjb25zdF9saXN0KiBjbCwgaW50IHR5cCkgCit7CisgIAorICBpZiAoY2wtPm5leHQpIHJldHVybiAwOworICBpZiAoY2wtPnRyZWUpIHJldHVybiAwOworICBpZiAoY2wtPm90aGVyKSAgeworICAgIHJldHVybiBjaGVja196ZXJvX2luaXRpYWxpc2F0aW9uKGNsLT5vdGhlcix0eXApOworICB9IGVsc2UgeworICAgIGV2YWxfY29uc3QoJmNsLT52YWwsdHlwKTsKKyAgICBpZiAoICh6bWVxdG8odm1heCxsMnptKDBMKSkpICYmICh6dW1lcXRvKHZ1bWF4LHVsMnp1bSgwVUwpKSkgJiYgKHpsZGVxdG8odmxkb3VibGUsZDJ6bGQoMC4wKSkpICkgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisvKiBkZWNpZGUgd2hldGhlciBhIGluaXRpYWxpemF0aW9uIHNoYWxsIGJlIHBlcmZvcm1lZCBvbmx5IGJlIGdlbmVyYXRlZCBjb2RlCisgICBvciBpZiBhIHRhYmxlIGNvcHkgc2hvdWxkIGJlIHVzZWQgZmlyc3QgKi8KK2ludCB1c2Vfb25seV9keW5faW5pdCh6bWF4IHN6LHptYXggZHluX3N6LHptYXggY29uc3Rfc3osaW50IGR5bl9jbnQsaW50IGNvbnN0X2NudCkKK3sKKyAgaWYoem1sZXEoc3osbDJ6bShjbGlzdF9jb3B5X3N0YWNrKSkpCisgICAgcmV0dXJuIDE7CisgIGlmKHptZXF0byhkeW5fc3osbDJ6bSgwTCkpKQorICAgIHJldHVybiAwOworICBpZighem1sZXEoem1kaXYoc3osZHluX3N6KSxsMnptKDJMKSkpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCBpbml0X2xvY2FsX2NvbXBvdW5kKFZhciAqdikKK3sKKyAgaWYodi0+c3RvcmFnZV9jbGFzcz09QVVUT3x8di0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpeworICAgIElDICpuZXc7CisgICAgLyogIEluaXRpYWxpc2llcnVuZyB2b24gYXV0by1WYXJpYWJsZW4gICovCisgICAgbmV3PW5ld19JQygpOworICAgIG5ldy0+Y29kZT1BU1NJR047CisgICAgbmV3LT50eXBmPXYtPnZ0eXAtPmZsYWdzOworICAgIG5ldy0+cTIuZmxhZ3M9MDsKKyAgICBuZXctPnEyLnZhbC52bWF4PXN6b2Yodi0+dnR5cCk7CisgICAgbmV3LT56LmZsYWdzPVZBUjsKKyAgICBuZXctPnoudj12OworICAgIG5ldy0+ei52YWwudm1heD1sMnptKDBMKTsKKyAgICBpZih2LT5jbGlzdC0+dHJlZSl7CisgICAgICAvKiAgZWluemVsbmVyIEF1c2RydWNrICAqLworICAgICAgZ2VuX0lDKHYtPmNsaXN0LT50cmVlLDAsMCk7CisgICAgICBjb252ZXJ0KHYtPmNsaXN0LT50cmVlLHYtPnZ0eXAtPmZsYWdzJk5VKTsKKyAgICAgIG5ldy0+cTE9di0+Y2xpc3QtPnRyZWUtPm87CisgICAgICBhZGRfSUMobmV3KTsKKyAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgdi0+Y2xpc3Q9MDsqLworICAgIH1lbHNleworICAgICAgLyogIEFycmF5IGV0Yy4gICovCisgICAgICBWYXIgKm52OworICAgICAgaWYoIUlTU0NBTEFSKHYtPnZ0eXAtPmZsYWdzKSYmIXVzZV9vbmx5X2R5bl9pbml0KHN6b2Yodi0+dnR5cCksaW5pdF9keW5fc3osaW5pdF9jb25zdF9zeixpbml0X2R5bl9jbnQsaW5pdF9jb25zdF9jbnQpKXsKKwludj1hZGRfdmFyKGVtcHR5LGNsb25lX3R5cCh2LT52dHlwKSxTVEFUSUMsdi0+Y2xpc3QpOworCW52LT5mbGFnc3w9REVGSU5FRDsKKwludi0+ZGZpbGVuYW1lPWZpbGVuYW1lOworCW52LT5kbGluZT1saW5lOworCW52LT52dHlwLT5mbGFnc3w9Q09OU1Q7CisJLyogICAgICAgICAgICAgICAgICAgICAgICB2LT5jbGlzdD0wOyovCisJbmV3LT5xMS5mbGFncz1WQVI7CisJbmV3LT5xMS52PW52OworCW5ldy0+cTEudmFsLnZtYXg9bDJ6bSgwTCk7CisKKwlhZGRfSUMobmV3KTsKKwkKKwlkeW5hbWljX2luaXQodix2LT52dHlwLHYtPmNsaXN0LDAsMSk7CisgICAgICB9ZWxzZXsKKwlkeW5hbWljX2luaXQodix2LT52dHlwLHYtPmNsaXN0LDAsMCk7CisgICAgICB9CisgICAgfSAgIAorICB9Cit9CisKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKwordm9pZCB2YXJfZGVjbGFyYXRpb24odm9pZCkKKy8qICBCZWFyYmVpdGV0IGVpbmUgVmFyaWFibGVuZGVrbGFyYXRpb24gdW5kIGVyemV1Z3QgYWxsZSAgICAgICAqLworLyogIG5vZXRpZ2VuIFN0cnVrdHVyZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIHR5cGUgKnRzLCp0LCpvbGQ9MCwqb209MDtjaGFyICppbWVyayx2aWRlbnRbTUFYSV07CisgIGludCBtZGVmPTAsbWFrZWludD0wLG5vdGRvbmUsc3RvcmFnZV9jbGFzcyxtc2MsZXh0ZXJuX2ZsYWcsaXNmdW5jLAorICAgIGhhZF9kZWNsLGhhcmRfcmVnLG1ocixkaWZmdW5pdD0wLGlubGluZV9mbGFnOworICBWYXIgKnY7CisgIGNoYXIgKnZhdHRyOworICB6dW1heCBtYXNrOworICBpbnQgYmFzZV90eXBlOworI2lmZGVmIEhBVkVfVEFSR0VUX0FUVFJJQlVURVMKKyAgdW5zaWduZWQgbG9uZyB0YXR0cjsKKyNlbmRpZgorI2lmZGVmIEhBVkVfRUNQUAorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgIHRzPWRlY2xhcmF0aW9uX3NwZWNpZmllcnMoKTtub3Rkb25lPTE7CisKKyAgc3RvcmFnZV9jbGFzcz1yZXR1cm5fc2M7aGFyZF9yZWc9cmV0dXJuX3JlZzt2YXR0cj1yZXR1cm5fdmF0dHI7bWFzaz1yZXR1cm5fbWFzazsKKyAgaW5saW5lX2ZsYWc9cmV0dXJuX2lubGluZTsKKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICBpZihmb3JfZGVjbCYmc3RvcmFnZV9jbGFzcyE9MCYmc3RvcmFnZV9jbGFzcyE9QVVUTyYmc3RvcmFnZV9jbGFzcyE9UkVHSVNURVIpeworICAgIGVycm9yKDI5OSk7CisgICAgc3RvcmFnZV9jbGFzcz1BVVRPOworICB9CisKKyNpZmRlZiBIQVZFX1RBUkdFVF9BVFRSSUJVVEVTCisgIHRhdHRyPXJldHVybl90YXR0cjsKKyNlbmRpZgorICBpZihzdG9yYWdlX2NsYXNzPT1FWFRFUk4pIGV4dGVybl9mbGFnPTE7IGVsc2UgZXh0ZXJuX2ZsYWc9MDsKKyAga2lsbHNwKCk7CisgIGlmKGN0b2stPnR5cGU9PVNFTUlDKXsKKyAgICBpZighdHMpIGVycm9yKDApOworICAgIGlmKHN0b3JhZ2VfY2xhc3N8fCghSVNTVFJVQ1QodHMtPmZsYWdzKSYmIUlTVU5JT04odHMtPmZsYWdzKSYmKHRzLT5mbGFncyZOUSkhPUlOVCkpCisgICAgICBlcnJvcigzNik7CisgICAgZnJlZXR5cCh0cyk7CisgICAgbmV4dF90b2tlbigpO2tpbGxzcCgpOworICAgIHJldHVybjsKKyAgfQorICBpZihuZXN0aW5nPT0wJiYoc3RvcmFnZV9jbGFzcz09QVVUT3x8c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpKQorICAgIHtlcnJvcig2Nik7c3RvcmFnZV9jbGFzcz1FWFRFUk47fQorICBpZighdHMpeworICAgIGlmKG5lc3Rpbmc8PTEpeworICAgICAgdHM9bmV3X3R5cCgpOworICAgICAgdHMtPmZsYWdzPUlOVDt0cy0+bmV4dD0wOworICAgICAgbWFrZWludD0xOworICAgICAgaWYoIXN0b3JhZ2VfY2xhc3MpIHN0b3JhZ2VfY2xhc3M9RVhURVJOOworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgICAgZXJyb3IoNjcpOworICAgIH1lbHNleworICAgICAgZXJyb3IoMzY1KTsKKyAgICB9CisgIH0KKyAgaWYoc3RvcmFnZV9jbGFzcz09MCl7CisgICAgaWYobmVzdGluZz09MCkgCisgICAgICBzdG9yYWdlX2NsYXNzPUVYVEVSTjsKKyAgICBlbHNlCisgICAgICBzdG9yYWdlX2NsYXNzPUFVVE87CisgIH0KKyAgbXNjPXN0b3JhZ2VfY2xhc3M7bWhyPWhhcmRfcmVnOworICB3aGlsZShub3Rkb25lKXsKKyAgICBpbnQgb2xkbmVzdGluZz1uZXN0aW5nOworICAgIGltZXJrPWlkZW50O2lkZW50PXZpZGVudDsqdmlkZW50PTA7ICAvKiBtZXJrZW4gdm9uIGlkZW50IGhpZXIgdmVybXV0bGljaCAqLworICAgIHN0b3JhZ2VfY2xhc3M9bXNjO2hhcmRfcmVnPW1ocjsKKyAgICBpZihvbGQpIHtmcmVldHlwKG9sZCk7b2xkPTA7fQorICAgIHQ9ZGVjbGFyYXRvcihjbG9uZV90eXAodHMpKTsKKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorI2lmZGVmIEhBVkVfRVhUX1RZUEVTCisgICAgY29udl90eXAodCk7CisjZW5kaWYKKyAgICBpZighSVNGVU5DKHQtPmZsYWdzKSl7CisgICAgICAgIGlzZnVuYz0wOworICAgICAgICBpZihpbmxpbmVfZmxhZykgZXJyb3IoMzAxKTsKKyAgICB9ZWxzZXsKKyAgICAgICAgaXNmdW5jPTE7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgICAgIGlmKHN0b3JhZ2VfY2xhc3MhPVNUQVRJQyYmc3RvcmFnZV9jbGFzcyE9VFlQRURFRikgc3RvcmFnZV9jbGFzcz1FWFRFUk47CisgICAgfQorICAgIGlkZW50PWltZXJrOyAgICAgICAgICAgICAgICAgICAgLyogbmljaHQgdW5iZWRpbmd0IG5vZXRpZyA/ICAgICAgICAgKi8KKyAgICBpZighKnZpZGVudCl7CisgICAgICBmcmVlKHRzKTtmcmVlKHQpOworICAgICAgZXJyb3IoMzYpO3JldHVybjsKKyAgICB9CisgICAgdj1maW5kX3Zhcih2aWRlbnQsb2xkbmVzdGluZyk7CisgICAgaWYoIXYmJi8qb2xkbmVzdGluZz09MCYmKi9zdG9yYWdlX2NsYXNzPT1FWFRFUk4mJmNyb3NzX21vZHVsZSYmKHY9ZmluZF9leHRfdmFyKHZpZGVudCkpKXsKKyAgICAgIHYtPmZsYWdzJj1+Tk9USU5UVTsKKyAgICAgIGRpZmZ1bml0PTE7CisgICAgICAvKkZJWE1FOiBjaGVjayBhdWYgZG9wcGVsdGUgRGVmLiAqLworICAgIH0KKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICBpZih2KXsKKyAgICAgIGhhZF9kZWNsPTE7CisgICAgICBpZihzdG9yYWdlX2NsYXNzPT1UWVBFREVGKXsKKyAgICAgICAgZXJyb3IoMjI2LHYtPmlkZW50aWZpZXIpOworICAgICAgfWVsc2V7CisgICAgICAgIGlmKG5lc3Rpbmc+MCYmKHYtPmZsYWdzJkRFRklORUQpJiYhZXh0ZXJuX2ZsYWcmJiFpc2Z1bmMpeworICAgICAgICAgIGVycm9yKDI3LHZpZGVudCk7CisgICAgICAgIH1lbHNleworICAgICAgICAgIGlmKHQmJnYtPnZ0eXAmJiFjb21wYXRpYmxlX3R5cGVzKHYtPnZ0eXAsdCxOVXxDT05TVHxWT0xBVElMRSkpeworCSAgICBpZihJU0ZVTkModC0+ZmxhZ3MpJiYhSVNGVU5DKHYtPnZ0eXAtPmZsYWdzKSkKKwkgICAgICBlcnJvcigzNjEsdmlkZW50KTsKKwkgICAgZWxzZQorCSAgICAgIGVycm9yKDY4LHZpZGVudCk7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgICAgICAgfQorICAgICAgICAgIGlmKChzdG9yYWdlX2NsYXNzIT12LT5zdG9yYWdlX2NsYXNzJiYhZXh0ZXJuX2ZsYWcpfHxoYXJkX3JlZyE9di0+cmVnKQorICAgICAgICAgICAgZXJyb3IoMjgsdi0+aWRlbnRpZmllcik7CisgICAgICAgICAgaWYoIWlzZnVuYyYmIWV4dGVybl9mbGFnKSB2LT5mbGFnc3w9VEVOVEFUSVZFOworICAgICAgICB9CisjaWZkZWYgSEFWRV9UQVJHRVRfQVRUUklCVVRFUworICAgICAgICB7CisgICAgICAgICAgaW50IGk7CisgICAgICAgICAgZm9yKGk9MDtnX2F0dHJfbmFtZVtpXTtpKyspeworICAgICAgICAgICAgaWYoKHYtPnRhdHRyJigxTDw8aSkpIT0odGF0dHImKDFMPDxpKSkpIGVycm9yKDIyOCx2aWRlbnQsZ19hdHRyX25hbWVbaV0pOworICAgICAgICAgIH0KKyAgICAgICAgICB2LT50YXR0cj10YXR0cjsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmKHZhdHRyKXsKKwkgIGlmKCF2LT52YXR0cnx8IXN0cnN0cih2LT52YXR0cix2YXR0cikpeworCSAgICBlcnJvcigzNzAsdi0+aWRlbnRpZmllcix2YXR0cix2LT52YXR0cj92LT52YXR0cjplbXB0eSk7CisJICAgIGFkZF9hdHRyKCZ2LT52YXR0cix2YXR0cik7CisJICB9CisgICAgICAgICAgaWYoSVNGVU5DKHYtPnZ0eXAtPmZsYWdzKSkgZmlfZnJvbV9hdHRyKHYpOworICAgICAgICB9CisgICAgICAgIGlmKCFpc2Z1bmMpeworICAgICAgICAgIGlmKCFJU0FSUkFZKHQtPmZsYWdzKXx8IXptZXF0byh0LT5zaXplLGwyem0oMEwpKSl7CisgICAgICAgICAgICBmcmVlKHYtPnZ0eXApOworICAgICAgICAgICAgdi0+dnR5cD10OworICAgICAgICAgIH0KKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgb209di0+dnR5cDsKKyAgICAgICAgICBpZih0LT5leGFjdC0+Y291bnQ+MCl7CisgICAgICAgICAgICBvbGQ9di0+dnR5cDt2LT52dHlwPXQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisjaWZkZWYgSEFWRV9UQVJHRVRfVkFSSE9PS19QT1NUCisgICAgICBhZGRfYXR0cl9oYWRkZWNsPXY7CisgICAgICBhZGRfdmFyX2hvb2tfcG9zdCh2KTsKKyAgICAgIGFkZF9hdHRyX2hhZGRlY2w9MDsKKyNlbmRpZgorICAgICAgCisgICAgfWVsc2V7CisgICAgICBoYWRfZGVjbD0wOworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgICAgaWYoaXNmdW5jJiZjdG9rLT50eXBlIT1DT01NQSYmY3Rvay0+dHlwZSE9U0VNSUMmJmN0b2stPnR5cGUhPVJQQVImJmN0b2stPnR5cGUhPUFTR04mJm5lc3Rpbmc+MCkgbmVzdGluZy0tOworICAgICAgaWYoIXp1bWVxdG8obWFzayx1bDJ6dW0oMFVMKSkpeworCXNwcmludGYodmlkZW50K3N0cmxlbih2aWRlbnQpLCIuJWx1Iix6dW0ydWwobWFzaykpOworICAgICAgfQorICAgICAgdj1hZGRfdmFyKHZpZGVudCx0LHN0b3JhZ2VfY2xhc3MsMCk7CisjaWZkZWYgSEFWRV9FQ1BQCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICAgIHYtPnJlZz1oYXJkX3JlZzsKKyAgICAgIGlmKHZhdHRyKQorCWFkZF9hdHRyKCZ2LT52YXR0cix2YXR0cik7CisgICAgICBpZihJU0ZVTkModi0+dnR5cC0+ZmxhZ3MpKQorICAgICAgICBmaV9mcm9tX2F0dHIodik7CisjaWZkZWYgSEFWRV9UQVJHRVRfQVRUUklCVVRFUworICAgICAgdi0+dGF0dHI9dGF0dHI7CisjZW5kaWYKKyAgICAgIGlmKGlzZnVuYyYmY3Rvay0+dHlwZSE9Q09NTUEmJmN0b2stPnR5cGUhPVNFTUlDJiZjdG9rLT50eXBlIT1SUEFSJiZjdG9rLT50eXBlIT1BU0dOJiZuZXN0aW5nPj0wKSBuZXN0aW5nKys7CisgICAgICBpZighdikgaWVycm9yKDApOworICAgICAgZWxzZXsKKyAgICAgICAgaWYoIWlzZnVuYyYmIWV4dGVybl9mbGFnKXsKKyAgICAgICAgICB2LT5mbGFnc3w9VEVOVEFUSVZFOworICAgICAgICAgIGlmKG5lc3Rpbmc+MCl7CisgICAgICAgICAgICB2LT5mbGFnc3w9REVGSU5FRDsKKyAgICAgICAgICAgIHYtPmRmaWxlbmFtZT1maWxlbmFtZTsKKyAgICAgICAgICAgIHYtPmRsaW5lPWxpbmU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBvbT0wOworICAgIH0KKyAgICBpZihpc2Z1bmMmJmlubGluZV9mbGFnKXsKKyAgICAgIHYtPmZsYWdzfD1JTkxJTkVGVU5DOworICAgICAgaWYoZXh0ZXJuX2ZsYWcpIHYtPmZsYWdzfD1JTkxJTkVFWFQ7CisgICAgfQorI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgIGlmKGRpc2FsbG93X3N0YXRpY3MmJnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQyYmKnYtPmlkZW50aWZpZXImJiFpc19jb25zdCh2LT52dHlwKSkKKyAgICAgIGVycm9yKDMwMix2LT5pZGVudGlmaWVyKTsKKyAgICBraWxsc3AoKTsKKyAgICAvKiAgSW5saW5lLUFzc2VtYmxlci1Db2RlIGluIEZ1bmt0aW9uc2Rla2xhcmF0aW9uZW4gKi8KKyAgICBpZihjdG9rLT50eXBlPT1BU0dOJiZJU0ZVTkModi0+dnR5cC0+ZmxhZ3MpJiYoaGVhZGVyX2NudD4wfHwhKGNfZmxhZ3NbN10mVVNFREZMQUcpKSl7CisgICAgICBucCB0cmVlOworICAgICAgbmV4dF90b2tlbigpO2tpbGxzcCgpOworICAgICAgaWYodi0+Zmkpe2ZyZWUodi0+ZmktPmlubGluZV9hc20pO3YtPmZpLT5pbmxpbmVfYXNtPTA7fQorICAgICAgaWYoIXYtPmZpKSB2LT5maT1uZXdfZmkoKTsKKyAgICAgIHYtPmZpLT5pbmxpbmVfYXNtPWdldF9zdHJpbmcoKTsKKyAgICAgIC8qU1RSQkFDSyh2LT5maS0+aW5saW5lX2FzbSk7Ki8KKyAgICAgIG1kZWY9MTsKKyAgICB9ZWxzZXsKKyAgICAgIC8qaWYodi0+Zmkpe2ZyZWUodi0+ZmktPmlubGluZV9hc20pO3YtPmZpLT5pbmxpbmVfYXNtPTA7fSovCisgICAgfQorICAgIC8qICBJbml0aWFsaXNpZXJ1bmcgdm9uIFZhcmlhYmxlbiBiZWkgRGVrbGFyYXRpb24gICAqLworICAgIGlmKGN0b2stPnR5cGU9PUFTR04peworCisgICAgICBuZXh0X3Rva2VuKCk7a2lsbHNwKCk7CisgICAgICBpZighaGFkX2RlY2wmJnYtPm5lc3Rpbmc9PTAmJnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTiYmc3RyY21wKCJtYWluIix2LT5pZGVudGlmaWVyKSkKKyAgICAgICAgZXJyb3IoMTY4LHYtPmlkZW50aWZpZXIpOworICAgICAgaWYodi0+ZmxhZ3MmREVGSU5FRCl7CisgICAgICAgIGlmKG5lc3Rpbmc9PTApIGVycm9yKDMwLHYtPmlkZW50aWZpZXIpOworICAgICAgfWVsc2V7CisgICAgICAgIHYtPmZsYWdzfD1ERUZJTkVEOworICAgICAgICB2LT5kZmlsZW5hbWU9ZmlsZW5hbWU7CisgICAgICAgIHYtPmRsaW5lPWxpbmU7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgICB9CisgICAgICBpZih2LT5zdG9yYWdlX2NsYXNzPT1UWVBFREVGKSBlcnJvcigxMTQsdi0+aWRlbnRpZmllcik7CisgICAgICBpZihleHRlcm5fZmxhZyl7CisgICAgICAgIGlmKG5lc3Rpbmc9PTApCisgICAgICAgICAgZXJyb3IoMTE4LHYtPmlkZW50aWZpZXIpOworICAgICAgICBlbHNlCisgICAgICAgICAgZXJyb3IoMjA3LHYtPmlkZW50aWZpZXIpOworICAgICAgICBpZih2LT5zdG9yYWdlX2NsYXNzIT1FWFRFUk4peyBlcnJvcig3Nyk7di0+c3RvcmFnZV9jbGFzcz1FWFRFUk47fQorICAgICAgfQorI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgICAgaW5pdF9keW5fc3o9bDJ6bSgwTCk7CisgICAgICBpbml0X2R5bl9jbnQ9MDsKKyAgICAgIGluaXRfY29uc3Rfc3o9bDJ6bSgwTCk7CisgICAgICBpbml0X2NvbnN0X2NudD0wOworICAgICAgdi0+Y2xpc3Q9aW5pdGlhbGl6YXRpb24odi0+dnR5cCx2LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHx2LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUiwwLDAsMCwwKTsKKyAgICAgICAgICAgICAgICAvKiBNSVNSQSBSdWxlIDkuMiB2aW9sYXRpb24gY2hlY2tpbmcgYW5kIGVycm9yIHJlcG9ydGluZyAqLworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgICAgaWYodi0+Y2xpc3QpeworICAgICAgICBpZihJU0FSUkFZKHYtPnZ0eXAtPmZsYWdzKSYmem1lcXRvKHYtPnZ0eXAtPnNpemUsbDJ6bSgwTCkpKXsKKyAgICAgICAgICBjb25zdF9saXN0ICpwPXYtPmNsaXN0OworICAgICAgICAgIHdoaWxlKHApe3YtPnZ0eXAtPnNpemU9em1hZGQocC0+aWR4LGwyem0oMUwpKTtwPXAtPm5leHQ7fQorICAgICAgICAgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKXsKKyAgICAgICAgICAgIGxvY2FsX29mZnNldFtuZXN0aW5nXT16bWFkZChsb2NhbF9vZmZzZXRbbmVzdGluZ10sc3pvZih2LT52dHlwKSk7CisgICAgICAgICAgICBpZih6bWxlcShtYXhfb2Zmc2V0LGxvY2FsX29mZnNldFtuZXN0aW5nXSkpIG1heF9vZmZzZXQ9bG9jYWxfb2Zmc2V0W25lc3RpbmddOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZih2LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHx2LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CisKKwkgIGluaXRfbG9jYWxfY29tcG91bmQodik7CisKKyAgICAgICAgfWVsc2UgaWYoY19mbGFnc1sxOV0mVVNFREZMQUcpeworICAgICAgICAgIC8qICBPaG5lIE9wdGltaWVydW5nIGdsZWljaCBlcnpldWdlbjsgZGFzIGlzdCBub2NoICAqLworICAgICAgICAgIC8qICBldHdhcyB2b24gZGVyIGdlbmF1ZW4gSW1wbGVtZW50aWVydW5nIGRlciBMaXN0ZSAqLworICAgICAgICAgIC8qICBkZXIgVmFyaWFibGVuIGFiaGFlbmdpZy4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgIFZhciAqbWVyaz12LT5uZXh0OworICAgICAgICAgIHYtPm5leHQ9MDsKKyAgICAgICAgICBnZW5fdmFycyh2KTsKKyAgICAgICAgICB2LT5uZXh0PW1lcms7CisgICAgICAgICAgdi0+Y2xpc3Q9MDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH1lbHNleworICAgICAgaWYoKHYtPmZsYWdzJkRFRklORUQpJiZ0eXBlX3VuY29tcGxldGUodi0+dnR5cCkpIGVycm9yKDIwMix2LT5pZGVudGlmaWVyKTsKKyAgICAgIGlmKCh2LT52dHlwLT5mbGFncyZDT05TVCkmJih2LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHx2LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikpCisgICAgICAgIGVycm9yKDExOSx2LT5pZGVudGlmaWVyKTsKKyAgICB9CisgICAgaWYoY3Rvay0+dHlwZT09Q09NTUEpIHtuZXh0X3Rva2VuKCk7a2lsbHNwKCk7bWRlZj0xO30gZWxzZSBub3Rkb25lPTA7CisgIH0KKyAgZnJlZXR5cCh0cyk7CisKKyAgaWYoSVNGVU5DKHQtPmZsYWdzKSYmdi0+cmVnKQorICAgIHQtPm5leHQtPnJlZz12LT5yZWc7CisKKyAgaWYoIW1kZWYmJnQmJih0LT5mbGFncyZOUSk9PUZVTktUJiZjdG9rLT50eXBlIT1TRU1JQyl7CisgICAgLyogIEZ1bmt0aW9uc2RlZmluaXRpb24qLworICAgIGludCBpLG9sZHN0eWxlPTA7CisKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyNpZmRlZiBIQVZFX1JFR1BBUk1TCisgICAgdHJlZ19oYW5kbGUgcmVnX2hhbmRsZTsKKyNlbmRpZgorICAgIGlmKERFQlVHJjEpIHByaW50ZigiRnVua3Rpb25zZGVmaW5pdGlvbiEgJXMgJXBcbiIsdi0+aWRlbnRpZmllciwodm9pZCAqKXYpOworICAgIHsKKyAgICAgIGludCBpOworICAgICAgZm9yKGk9MTtpPD1NQVhSO2krKykge3JlZ3NbaV09cmVndXNlZFtpXT1yZWdzYVtpXTtyZWdzYnVmW2ldPTA7fQorICAgIH0KKyAgICBjdXJfZnVuYz12LT5pZGVudGlmaWVyOworICAgIGN1cl9mdW5jdj12OworICAgIGlmKG9ubHlfaW5saW5lPT0yKSBvbmx5X2lubGluZT0wOworICAgIGlmKG5lc3Rpbmc8MSkgZW50ZXJfYmxvY2soKTsKKyAgICBpZihuZXN0aW5nPjEpIGVycm9yKDMyKTsKKyAgICBpZih2LT5mbGFncyZERUZJTkVEKXsKKyAgICAgIGlmKCFpbmxpbmVfZmxhZ3x8IWNyb3NzX21vZHVsZSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKDMzLHYtPmlkZW50aWZpZXIpOworICAgICAgfWVsc2V7CisgICAgICAgIGlmKHYtPmZpLT5maXJzdF9pYyl7CisgICAgICAgICAgZnJlZV9JQyh2LT5maS0+Zmlyc3RfaWMpOworICAgICAgICAgIHYtPmZpLT5maXJzdF9pYz0wOworICAgICAgICB9CisgICAgICB9CisgICAgfWVsc2V7CisgICAgICB2LT5mbGFnc3w9REVGSU5FRDsKKyAgICAgIHYtPmRmaWxlbmFtZT1maWxlbmFtZTsKKyAgICAgIHYtPmRsaW5lPWxpbmU7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgfQorICAgIGlmKHN0b3JhZ2VfY2xhc3MhPUVYVEVSTiYmc3RvcmFnZV9jbGFzcyE9U1RBVElDKSBlcnJvcigzNCk7CisgICAgaWYoZXh0ZXJuX2ZsYWcmJiFpbmxpbmVfZmxhZykgZXJyb3IoMTIwKTsKKyAgICBpZihzdG9yYWdlX2NsYXNzPT1FWFRFUk4mJiFzdHJjbXAodi0+aWRlbnRpZmllciwibWFpbiIpJiYoIXQtPm5leHR8fHQtPm5leHQtPmZsYWdzIT1JTlQpKSBlcnJvcigxMjEpOworICAgIGlmKCFoYWRfZGVjbCYmdi0+bmVzdGluZz09MCYmdi0+c3RvcmFnZV9jbGFzcz09RVhURVJOJiZzdHJjbXAoIm1haW4iLHYtPmlkZW50aWZpZXIpKQorICAgICAgZXJyb3IoMTY4LHYtPmlkZW50aWZpZXIpOworICAgIHdoaWxlKCFlY3BwJiZjdG9rLT50eXBlIT1MQlJBKXsKKyAgICAgIC8qICBhbHRlciBTdGlsICAqLworICAgICAgdHlwZSAqbnQ9ZGVjbGFyYXRpb25fc3BlY2lmaWVycygpO25vdGRvbmU9MTtvbGRzdHlsZT1PTERTVFlMRTsKKyAgICAgIGlmKCF0cykge2Vycm9yKDM1KTt9CisgICAgICB3aGlsZShub3Rkb25lKXsKKyAgICAgICAgaW50IGZvdW5kPTA7CisgICAgICAgIGltZXJrPWlkZW50O2lkZW50PXZpZGVudDsqdmlkZW50PTA7CisgICAgICAgIHRzPWRlY2xhcmF0b3IoY2xvbmVfdHlwKG50KSk7CisgICAgICAgIGlkZW50PWltZXJrOworICAgICAgICBpZighdHMpIHtlcnJvcigzNik7fQorICAgICAgICBlbHNleworICAgICAgICAgIGZvcihpPTA7aTx0LT5leGFjdC0+Y291bnQ7aSsrKXsKKyAgICAgICAgICAgIGlmKCFzdHJjbXAoKCp0LT5leGFjdC0+c2wpW2ldLmlkZW50aWZpZXIsdmlkZW50KSl7CisgICAgICAgICAgICAgIGZvdW5kPTE7CisgICAgICAgICAgICAgIGlmKCgqdC0+ZXhhY3QtPnNsKVtpXS5zdHlwKXsKKyAgICAgICAgICAgICAgICBlcnJvcig2OSx2aWRlbnQpOworICAgICAgICAgICAgICAgIGZyZWV0eXAoKCp0LT5leGFjdC0+c2wpW2ldLnN0eXApOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIC8qICB0eXBbXSBpbiAqdHlwICAgKi8KKyAgICAgICAgICAgICAgaWYoSVNBUlJBWSh0cy0+ZmxhZ3MpKSB0cy0+ZmxhZ3M9UE9JTlRFUl9UWVBFKHRzKTsKKyAgICAgICAgICAgICAgLyogIHR5cCgpIGluICp0eXAoKSAqLworICAgICAgICAgICAgICBpZihJU0ZVTkModHMtPmZsYWdzKSl7CisgICAgICAgICAgICAgICAgdHlwZSAqbmV3PW5ld190eXAoKTsKKyAgICAgICAgICAgICAgICBuZXctPmZsYWdzPVBPSU5URVJfVFlQRSh0cyk7CisgICAgICAgICAgICAgICAgbmV3LT5uZXh0PXRzOworICAgICAgICAgICAgICAgIHRzPW5ldzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZighcmV0dXJuX3NjKSByZXR1cm5fc2M9QVVUTzsKKyAgICAgICAgICAgICAgaWYocmV0dXJuX3NjIT1BVVRPJiZyZXR1cm5fc2MhPVJFR0lTVEVSKQorICAgICAgICAgICAgICAgIHtlcnJvcigxMjIpO3JldHVybl9zYz1BVVRPO30KKyAgICAgICAgICAgICAgKCp0LT5leGFjdC0+c2wpW2ldLnN0b3JhZ2VfY2xhc3M9cmV0dXJuX3NjOworICAgICAgICAgICAgICAoKnQtPmV4YWN0LT5zbClbaV0ucmVnPXJldHVybl9yZWc7CisgICAgICAgICAgICAgIGlmKHJldHVybl9yZWcpIGVycm9yKDIxOSk7CisgICAgICAgICAgICAgICgqdC0+ZXhhY3QtPnNsKVtpXS5zdHlwPXRzOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZighZm91bmQpIHtlcnJvcigzNyx2aWRlbnQpO30KKyAgICAgICAga2lsbHNwKCk7CisgICAgICAgIGlmKGN0b2stPnR5cGU9PUNPTU1BKSB7bmV4dF90b2tlbigpO2tpbGxzcCgpO30gZWxzZSBub3Rkb25lPTA7CisgICAgICB9CisgICAgICBpZihudCkgZnJlZXR5cChudCk7CisgICAgICBpZihjdG9rLT50eXBlPT1TRU1JQyl7CisgICAgICAgIG5leHRfdG9rZW4oKTtraWxsc3AoKTsKKyAgICAgIH1lbHNleworICAgICAgICBlcnJvcig1NCk7CisgICAgICAgIHdoaWxlKGN0b2stPnR5cGUhPUxCUkEmJmN0b2stPnR5cGUhPVNFTUlDKXtuZXh0X3Rva2VuKCk7a2lsbHNwKCk7fQorICAgICAgfQorICAgIH0KKyAgICBpZighZWNwcCYmdC0+ZXhhY3QtPmNvdW50PT0wKXsKKyAgICAgIHN0cnVjdF9saXN0IHNsWzFdOworICAgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJwcm90b3R5cGUgY29udmVydGVkIHRvICh2b2lkKVxuIik7CisgICAgICB0LT5leGFjdC0+Y291bnQ9MTsKKyAgICAgIHNsWzBdLmlkZW50aWZpZXI9ZW1wdHk7CisgICAgICBzbFswXS5zdG9yYWdlX2NsYXNzPUFVVE87CisgICAgICBzbFswXS5zdHlwPW5ld190eXAoKTsKKyAgICAgIHNsWzBdLnN0eXAtPmZsYWdzPVZPSUQ7CisgICAgICBzbFswXS5zdHlwLT5uZXh0PTA7CisgICAgICBzbFswXS5yZWc9MDsKKyAgICAgIG5lc3RpbmctLTsKKyAgICAgIGFkZF9zbCh0LT5leGFjdCwmc2wpOworICAgICAgbmVzdGluZysrOworICAgIH0KKyAgICBpZihvbSYmb20tPmV4YWN0JiYhY29tcGFyZV9zZChvbS0+ZXhhY3QsdC0+ZXhhY3QpKSB7CisgICAgICBlcnJvcigxMjMpOworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgIH0KKyAgICBub2NvZGU9MDtjdXJyZW50cHJpPTE7CisgICAgLyogICAgICAgIGVudGVyX2Jsb2NrKCk7Ki8KKyAgICBsb2NhbF9vZmZzZXRbMV09bDJ6bSgwTCk7CisgICAgcmV0dXJuX3Zhcj0wOworICAgIGlmKCF2LT52dHlwKSBpZXJyb3IoMCk7CisjaWZkZWYgSEFWRV9SRUdQQVJNUworICAgIHJlZ19oYW5kbGU9ZW1wdHlfcmVnX2hhbmRsZTsKKyNlbmRpZgorICAgIGlmKHYtPnZ0eXAtPm5leHQtPmZsYWdzPT1WT0lEKXsKKyAgICAgIHJldHVybl90eXA9MDsKKyAgICB9ZWxzZXsKKyAgICAgIHJldHVybl90eXA9di0+dnR5cC0+bmV4dDsKKyAgICAgIGlmKCFmZnJldHVybihyZXR1cm5fdHlwKSYmKHJldHVybl90eXAtPmZsYWdzJk5RKSE9Vk9JRCl7CisgICAgICAgIC8qICBQYXJhbWV0ZXIgZnVlciBkaWUgUnVlY2tnYWJlIHZvbiBXZXJ0ZW4sIGRpZSBuaWNodCBpbiBlaW5lbSAqLworICAgICAgICAvKiAgUmVnaXN0ZXIgc2luZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgdHlwZSAqcnQ9bmV3X3R5cCgpO2ludCByZWc7CisgICAgICAgIHJ0LT5mbGFncz1QT0lOVEVSX1RZUEUocmV0dXJuX3R5cCk7cnQtPm5leHQ9cmV0dXJuX3R5cDsKKyNpZmRlZiBIQVZFX1JFR1BBUk1TCisgICAgICAgIHJlZz1yZWdfcGFybSgmcmVnX2hhbmRsZSxydCwwLHYtPnZ0eXApOworICAgICAgICBpZighcmVnKXsKKwkgIHJldHVybl92YXI9YWRkX3ZhcihlbXB0eSxjbG9uZV90eXAocnQpLEFVVE98UEFSQU1FVEVSfG9sZHN0eWxlLDApOworCX1lbHNleworCSAgcmV0dXJuX3Zhcj1hZGRfdmFyKGVtcHR5LGNsb25lX3R5cChydCkscmVnPDA/KEFVVE98UEFSQU1FVEVSfFJFR1BBUk18REJMUFVTSHxvbGRzdHlsZSk6KEFVVE98UEFSQU1FVEVSfFJFR1BBUk18b2xkc3R5bGUpLDApOworCSAgcmV0dXJuX3Zhci0+cmVnPXJlZzsKKwl9CisjZWxzZQorICAgICAgICByZXR1cm5fdmFyPWFkZF92YXIoZW1wdHksY2xvbmVfdHlwKHJ0KSxBVVRPfFBBUkFNRVRFUnxvbGRzdHlsZSwwKTsKKyNlbmRpZgorICAgICAgICByZXR1cm5fdmFyLT5mbGFnc3w9REVGSU5FRDsKKyAgICAgICAgcmV0dXJuX3Zhci0+ZGZpbGVuYW1lPWZpbGVuYW1lOworICAgICAgICByZXR1cm5fdmFyLT5kbGluZT1saW5lOworICAgICAgICBmcmVlKHJ0KTsKKyAgICAgIH0KKyAgICB9CisgICAgZmlyc3RfaWM9bGFzdF9pYz0wO2ljX2NvdW50PTA7bWF4X29mZnNldD1sMnptKDBMKTsKKyAgICBpZighem1sZXEobG9jYWxfb2Zmc2V0WzFdLFowKSkgbWF4X29mZnNldD1sb2NhbF9vZmZzZXRbMV07CisgICAgZm9yKGk9MDtpPHQtPmV4YWN0LT5jb3VudDtpKyspeworICAgICAgLyogVE9ETzogbWlzc2luZyBwb2ludGVyIGZvciBzdHJ1Y3QgcmV0dXJuICovCisjaWZkZWYgSEFWRV9SRUdQQVJNUworICAgICAgaW50IGRpZHJwPTA7CisgICAgICBpZigoKnQtPmV4YWN0LT5zbClbaV0uc3R5cCl7CisgICAgICAgIGludCB0cjsKKyAgICAgICAgdHI9cmVnX3Bhcm0oJnJlZ19oYW5kbGUsKCp0LT5leGFjdC0+c2wpW2ldLnN0eXAsMCx0KTsKKyAgICAgICAgZGlkcnA9MTsKKyAgICAgICAgaWYoISgqdC0+ZXhhY3QtPnNsKVtpXS5yZWcpICgqdC0+ZXhhY3QtPnNsKVtpXS5yZWc9dHI7CisgICAgICB9CisjZW5kaWYKKyAgICAgIGlmKCEoKnQtPmV4YWN0LT5zbClbaV0uc3R5cCYmKigqdC0+ZXhhY3QtPnNsKVtpXS5pZGVudGlmaWVyKXsKKyAgICAgICAgdHlwZSAqbnQ7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgICAgIG50PW5ld190eXAoKTsKKyAgICAgICAgbnQtPmZsYWdzPUlOVDsKKyAgICAgICAgKCp0LT5leGFjdC0+c2wpW2ldLnN0eXA9bnQ7CisgICAgICAgICgqdC0+ZXhhY3QtPnNsKVtpXS5zdG9yYWdlX2NsYXNzPUFVVE87CisgICAgICAgICgqdC0+ZXhhY3QtPnNsKVtpXS5yZWc9MDsKKyAgICAgICAgZXJyb3IoMTI0KTsKKyAgICAgIH0KKyAgICAgIGlmKCooKnQtPmV4YWN0LT5zbClbaV0uaWRlbnRpZmllcil7CisgICAgICAgIFZhciAqdG1wO2ludCBzYyx0cjsKKyAgICAgICAgc2M9KCgqdC0+ZXhhY3QtPnNsKVtpXS5zdG9yYWdlX2NsYXNzfFBBUkFNRVRFUnxvbGRzdHlsZSk7CisjaWZkZWYgSEFWRV9SRUdQQVJNUworICAgICAgICBpZighZGlkcnApeworICAgICAgICAgIGlmKCF0LT5leGFjdC0+c2wpIGllcnJvcigwKTsKKyAgICAgICAgICBpZighKCp0LT5leGFjdC0+c2wpW2ldLnN0eXApIGllcnJvcigwKTsKKyAgICAgICAgICB0cj1yZWdfcGFybSgmcmVnX2hhbmRsZSwoKnQtPmV4YWN0LT5zbClbaV0uc3R5cCwwLHQpOworICAgICAgICAgIGlmKCEoKnQtPmV4YWN0LT5zbClbaV0ucmVnKSAoKnQtPmV4YWN0LT5zbClbaV0ucmVnPXRyOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYoKCp0LT5leGFjdC0+c2wpW2ldLnJlZz4wKSBzY3w9UkVHUEFSTTsKKyAgICAgICAgaWYoKCp0LT5leGFjdC0+c2wpW2ldLnJlZzwwKSBzY3w9KFJFR1BBUk18REJMUFVTSCk7CisgICAgICAgIHRtcD1hZGRfdmFyKCgqdC0+ZXhhY3QtPnNsKVtpXS5pZGVudGlmaWVyLGNsb25lX3R5cCgoKnQtPmV4YWN0LT5zbClbaV0uc3R5cCksc2MsMCk7CisgICAgICAgIHRtcC0+cmVnPSgqdC0+ZXhhY3QtPnNsKVtpXS5yZWc7CisgICAgICAgIHRtcC0+ZmxhZ3N8PURFRklORUQ7CisgICAgICAgIHRtcC0+ZGZpbGVuYW1lPWZpbGVuYW1lOworICAgICAgICB0bXAtPmRsaW5lPWxpbmU7CisgICAgICAgIGlmKG9sZHN0eWxlKXsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICAgICAgICBmcmVldHlwKCgqdC0+ZXhhY3QtPnNsKVtpXS5zdHlwKTsKKyAgICAgICAgICAoKnQtPmV4YWN0LT5zbClbaV0uc3R5cD0wOyAvKiAgUHJvdG90eXBlIGVudGZlcm5lbiAqLworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmKG9sZHN0eWxlKSB0LT5leGFjdC0+Y291bnQ9MDsgLyogIFByb3RvdHlwZSBlbnRmZXJuZW4gKi8KKyAgICAvKiAgICAgICAgbG9jYWxfb2Zmc2V0WzFdPWwyem0oMEwpOyovCisgICAgcmV0dXJuX2xhYmVsPSsrbGFiZWw7CisgICAgZnVuY3Rpb25fY2FsbHM9MDtmbG9hdF91c2VkPTA7aGFzX3JldHVybj0wO2dvdG9fdXNlZD0wO3ZsYXM9MDsKKyAgICBkaWRfcmV0dXJuX2xhYmVsPTA7CisgICAgZm9yKGk9MTtpPD1NQVhSO2krKykgc2ltcGxlX3NjcmF0Y2hbaV09MDsKKyAgICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4mJih2LT5mbGFncyZJTkxJTkVGVU5DKSkKKyAgICAgIGRpc2FsbG93X3N0YXRpY3M9MTsKKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorCisgICAgaWYoYzk5KXsKKyAgICAgIC8qIGM5OSBwcmVkZWZpbmVkIF9fZnVuY19fICovCisgICAgICB0eXBlICpmdD1uZXdfdHlwKCk7CisgICAgICBWYXIgKmZuYzsKKworICAgICAgLyogY3JlYXRlIHR5cGUgKi8KKyAgICAgIGZ0LT5mbGFncz1BUlJBWTsKKyAgICAgIGZ0LT5zaXplPWwyem0oKGxvbmcpc3RybGVuKGN1cl9mdW5jKSsxKTsKKyAgICAgIGZ0LT5uZXh0PW5ld190eXAoKTsKKyAgICAgIGZ0LT5uZXh0LT5mbGFncz1DT05TVHxDSEFSOworCisgICAgICAvKiB1c2Ugc3RyaW5nX2V4cHJlc3Npb24oKSB0byBjcmVhdGUgY29uc3RfbGlzdCAqLworICAgICAgZm5jPWFkZF92YXIoIl9fZnVuY19fIixmdCxTVEFUSUMsY2xfZnJvbV9zdHJpbmcoY3VyX2Z1bmMsY3VyX2Z1bmMrc3RybGVuKGN1cl9mdW5jKSkpOworICAgICAgZm5jLT5mbGFnc3w9REVGSU5FRDsKKyAgICB9CisKKyAgICAvKiBHZW5lcmF0ZSBpbnRlcm1lZGlhdGUgY29kZSBmb3IgZnVuY3Rpb24gKi8KKyAgICBjb21wb3VuZF9zdGF0ZW1lbnQoKTsKKworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorI2lmZGVmIEhBVkVfRUNQUAorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgY3VyX2Z1bmN2PTA7CisgICAgZGlzYWxsb3dfc3RhdGljcz0wOworICAgIGlmKGJsb2NrX3ZsYVtuZXN0aW5nXSkgY2xlYXJ2bCgpOworICAgIGlmKCh2LT52dHlwLT5uZXh0LT5mbGFncyZOUSkhPVZPSUQmJiFoYXNfcmV0dXJuKXsKKyAgICAgIGlmKHN0cmNtcCh2LT5pZGVudGlmaWVyLCJtYWluIikpIGVycm9yKDE3Myx2LT5pZGVudGlmaWVyKTsKKyAgICAgIGVsc2UgZXJyb3IoMTc0LHYtPmlkZW50aWZpZXIpOworICAgIH0KKyNpZiAwCisgICAge2ludCBpOworICAgIGZvcihpPTE7aTw9TUFYUjtpKyspIGlmKHJlZ3NbaV0hPXJlZ3NhW2ldKSB7cHJpbnRmKCJSZWdpc3RlciAlczpcbiIscmVnbmFtZXNbaV0pO2llcnJvcigwKTt9CisgICAgfQorI2VuZGlmCisgICAgaWYoIWRpZF9yZXR1cm5fbGFiZWwpeworICAgICAgY2xlYXJfbWFpbl9yZXQoKTsKKyAgICAgIGdlbl9sYWJlbChyZXR1cm5fbGFiZWwpOworICAgIH0KKyAgICAvKiBiYWNrcGF0Y2ggY29kZSBmb3IganVtcHMgb3V0IG9mIHZsYS1zY29wZSBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZih2bGFzKQorICAgICAgdmxhX2p1bXBfZml4KCk7CisgICAgaWYoY3Jvc3NfbW9kdWxlKXsKKyAgICAgIGlmKCF2LT5maSkgdi0+Zmk9bmV3X2ZpKCk7CisgICAgICB2LT5maS0+c3RhdGljcz1maXJzdF92YXJbMF07CisgICAgfWVsc2UgaWYoZmlyc3RfaWMmJmVycm9ycz09MCl7CisgICAgICBpZigoY19mbGFnc1syXSZVU0VERkxBRykmJmljMSl7ZnByaW50ZihpYzEsImZ1bmN0aW9uICVzXG4iLHYtPmlkZW50aWZpZXIpOyBwcmljKGljMSxmaXJzdF9pYyk7fQorICAgICAgdmwxPWZpcnN0X3ZhclswXTsKKyAgICAgIHZsMj1maXJzdF92YXJbMV07CisgICAgICB2bDM9bWVya192YXJmOworICAgICAgb3B0aW1pemUob3B0ZmxhZ3Msdik7CisgICAgICBpZigoY19mbGFnc1szXSZVU0VERkxBRykmJmljMil7ZnByaW50ZihpYzIsImZ1bmN0aW9uICVzXG4iLHYtPmlkZW50aWZpZXIpOyBwcmljKGljMixmaXJzdF9pYyk7fQorICAgICAgaWYob3V0JiYhb25seV9pbmxpbmUmJiEoY19mbGFnc1s1XSZVU0VERkxBRykpeworICAgICAgICBtZW1zZXQocmVnc19tb2RpZmllZCwwLFJTSVpFKTsKKyAgICAgICAgZ2VuX2NvZGUob3V0LGZpcnN0X2ljLHYsbWF4X29mZnNldCk7CisgICAgICAgIHN0YXRpY19zdGFja19jaGVjayh2KTsKKyAgICAgICAgdi0+ZmxhZ3N8PUdFTkVSQVRFRDsKKyNpZmRlZiBIQVZFX1JFR1NfTU9ESUZJRUQKKyAgICAgICAgaWYoIXYtPmZpKSB2LT5maT1uZXdfZmkoKTsKKyAgICAgICAgaWYodi0+ZmktPmZsYWdzJkFMTF9SRUdTKQorICAgICAgICB7CisgICAgICAgICAgaW50IGk7CisgICAgICAgICAgZm9yKGk9MTtpPD1NQVhSO2krKyl7CisgICAgICAgICAgICBpZihyZWdfcGFpcihpLCZycCkpeworICAgICAgICAgICAgICBpZihCVFNUKHJlZ3NfbW9kaWZpZWQsaSkpeworICAgICAgICAgICAgICAgIEJTRVQocmVnc19tb2RpZmllZCxycC5yMSk7CisgICAgICAgICAgICAgICAgQlNFVChyZWdzX21vZGlmaWVkLHJwLnIyKTsKKyAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgaWYoQlRTVChyZWdzX21vZGlmaWVkLHJwLnIxKXx8QlRTVChyZWdzX21vZGlmaWVkLHJwLnIyKSkKKyAgICAgICAgICAgICAgICAgIEJTRVQocmVnc19tb2RpZmllZCxpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBtZW1jcHkodi0+ZmktPnJlZ3NfbW9kaWZpZWQscmVnc19tb2RpZmllZCxSU0laRSk7CisgICAgICAgICAgdi0+ZmktPmZsYWdzfD1BTExfUkVHUzsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICB9CisgICAgICAvKmlmKERFQlVHJjgxOTIpe2ZwcmludGYoaWMyLCJmdW5jdGlvbiAlcywgYWZ0ZXIgZ2VuX2NvZGVcbiIsdi0+aWRlbnRpZmllcik7IHByaWMoaWMyLGZpcnN0X2ljKTt9Ki8KKyAgICAgIGZyZWVfSUMoZmlyc3RfaWMpOworICAgICAgZmlyc3RfaWM9bGFzdF9pYz0wOworICAgIH0KKyAgICBpZihjcm9zc19tb2R1bGUpeworICAgICAgaWYoIXYtPmZpKSB2LT5maT1uZXdfZmkoKTsKKyAgICAgIHYtPmZpLT5maXJzdF9pYz1maXJzdF9pYzsKKyAgICAgIHYtPmZpLT5sYXN0X2ljPWxhc3RfaWM7CisgICAgICBmaXJzdF9pYz1sYXN0X2ljPTA7CisgICAgfQorICAgIGlmKHYtPmZpJiZ2LT5maS0+Zmlyc3RfaWMpeworICAgICAgVmFyICp2cDsKKyAgICAgIGlmKERFQlVHJjEpIHByaW50ZigibGVhdmUgYmxvY2sgJWQgKGlubGluZS12ZXJzaW9uKVxuIixuZXN0aW5nKTsKKyAgICAgIGlmKGJsb2NrX3ZsYVtuZXN0aW5nXSkgY2xlYXJ2bCgpOworICAgICAgaWYobmVzdGluZyE9MSkgaWVycm9yKDApOworICAgICAgaWYobWVya192YXJsKSBtZXJrX3ZhcmwtPm5leHQ9Zmlyc3RfdmFyW25lc3RpbmddOyBlbHNlIG1lcmtfdmFyZj1maXJzdF92YXJbbmVzdGluZ107CisgICAgICBpZihsYXN0X3ZhcltuZXN0aW5nXSkgbWVya192YXJsPWxhc3RfdmFyW25lc3RpbmddOworICAgICAgaWYobWVya19zaWwpIG1lcmtfc2lsLT5uZXh0PWZpcnN0X3NpW25lc3RpbmddOyBlbHNlIG1lcmtfc2lmPWZpcnN0X3NpW25lc3RpbmddOworICAgICAgaWYobGFzdF9zaVtuZXN0aW5nXSkgbWVya19zaWw9bGFzdF9zaVtuZXN0aW5nXTsKKyAgICAgIGlmKG1lcmtfc2RsKSBtZXJrX3NkbC0+bmV4dD1maXJzdF9zZFtuZXN0aW5nXTsgZWxzZSBtZXJrX3NkZj1maXJzdF9zZFtuZXN0aW5nXTsKKyAgICAgIGlmKGxhc3Rfc2RbbmVzdGluZ10pIG1lcmtfc2RsPWxhc3Rfc2RbbmVzdGluZ107CisgICAgICBpZihtZXJrX2lsaXN0bCkgbWVya19pbGlzdGwtPm5leHQ9Zmlyc3RfaWxpc3RbbmVzdGluZ107IGVsc2UgbWVya19pbGlzdGY9Zmlyc3RfaWxpc3RbbmVzdGluZ107CisgICAgICBpZihsYXN0X2lsaXN0W25lc3RpbmddKSBtZXJrX2lsaXN0bD1sYXN0X2lsaXN0W25lc3RpbmddOworICAgICAgCisgICAgICBpZihtZXJrX3ZhcmYmJiFvbmx5X2lubGluZSYmIWNyb3NzX21vZHVsZSkgZ2VuX3ZhcnMobWVya192YXJmKTsKKyAgICAgIGlmKGZpcnN0X2xsaXN0KSBmcmVlX2xsaXN0KGZpcnN0X2xsaXN0KTsKKyAgICAgIGZpcnN0X2xsaXN0PTA7CisgICAgICBpZihmaXJzdF9jbGlzdCkgZnJlZV9jbGlzdChmaXJzdF9jbGlzdCk7CisgICAgICBmaXJzdF9jbGlzdD0wOworICAgICAgaWYobWVya19zaWYpIGZyZWVfc2kobWVya19zaWYpOworICAgICAgLyogIHN0cnVjdC1kZWNsYXJhdGlvbnMgZXJzdCBnYW56IGFtIFNjaGx1c3MgbG9lc2NoZW4uIFVtIHp1IHZlcm1laWRlbiwgICAgICovCisgICAgICAvKiAgZGFzcyBzdHJ1Y3QtZGVjbGFyYXRpb25zIGluIFByb3RvdHlwZW4gZnJlaSB3ZXJkZW4gdW5kIGRhbm4gZWluZSAgICAgICAgKi8KKyAgICAgIC8qICBzcGFldGVyZSBzdHJ1Y3QsIGRpZXNlbGJlIEFkcmVzc2UgYmVrb21tdCB1bmQgZGFkdXJjaCBnbGVpY2ggd2lyZC4gICAgICAqLworICAgICAgLyogIE5pY2h0IHNlaHIgc2Nob2VuIC0gd2VubiBtb2VnbGljaCBub2NoIG1hbCBhZW5kZXJuLiAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgICAgICAgICAgIGlmKG1lcmtfc2RmKSBmcmVlX3NkKG1lcmtfc2RmKTsqLworICAgICAgLyogIGhpZXIgbm9jaCB3YXMgdWViZXJsZWdlbiAgICAqLworICAgICAgLyogICAgICAgICAgICBpZihtZXJrX2lsaXN0ZikgZnJlZV9pbGlzdChtZXJrX2lsaXN0Zik7Ki8KKyAgICAgIG5lc3RpbmctLTsKKyAgICAgIHYtPmZpLT52YXJzPW1lcmtfdmFyZjsKKyAgICAgIC8qICAgICAgICAgICAgdi0+ZmktPnZhcnM9Zmlyc3RfdmFyWzFdOyovCisgICAgICAvKiAga2VpbmUgZWNodGVuIFBhcmFtZXRlcj0+a2VpbmUgbmVnYXRpdmVuIE9mZnNldHMgKi8KKyAgICAgIC8qICAgICAgICAgICAgdnA9Zmlyc3RfdmFyWzFdOyovCisgICAgICBpZighY3Jvc3NfbW9kdWxlKXsKKyAgICAgICAgdnA9bWVya192YXJmOworICAgICAgICB3aGlsZSh2cCl7CisgICAgICAgICAgaWYodnAtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHZwLT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CisgICAgICAgICAgICAvKmlmKERFQlVHJjEwMjQpIHByaW50ZigiaGFuZGxpbmcgdmFyaWFibGUgJXMoJWxkKS8lcFxuIix2cC0+aWRlbnRpZmllcix6bTJsKHZwLT5vZmZzZXQpLCh2b2lkKil2cCk7Ki8KKyAgICAgICAgICAgIGlmKCF6bWxlcShsMnptKDBMKSx2cC0+b2Zmc2V0KSl7CisgICAgICAgICAgICAgIHZwLT5vZmZzZXQ9bDJ6bSgwTCk7CisgICAgICAgICAgICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiY29udmVydGVkIHBhcmFtZXRlciA8JXM+KCVsZCkgZm9yIGlubGluaW5nXG4iLHZwLT5pZGVudGlmaWVyLChsb25nKXptMmwodnAtPm9mZnNldCkpOworICAgICAgICAgICAgfWVsc2UgdnAtPm9mZnNldD1sMnptKDRMKTsgIC8qICBEdW1teSwgZGEgcmVjYWxjX29mZnNldHM/ICAgKi8KKyAgICAgICAgICB9CisgICAgICAgICAgdnA9dnAtPm5leHQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgIGxlYXZlX2Jsb2NrKCk7CisgICAgfQorICAgIGlmKG9ubHlfaW5saW5lPT0yKSBvbmx5X2lubGluZT0wOworICAgIGN1cl9mdW5jPSJvb3BzLCBJIGZvcmdvdCBpdCI7CisgIH1lbHNleworICAgIGlmKG1ha2VpbnQpIGVycm9yKDEyNSk7CisgICAgaWYoY3Rvay0+dHlwZT09U0VNSUMpIG5leHRfdG9rZW4oKTsgZWxzZSBlcnJvcig1NCk7CisgICAgaWYoSVNGVU5DKHQtPmZsYWdzKSYmdC0+ZXhhY3QpeworICAgICAgc3RydWN0X2RlY2xhcmF0aW9uICpzZD10LT5leGFjdDtpbnQgaSxmOworICAgICAgZm9yKGY9MCxpPTA7aTxzZC0+Y291bnQ7aSsrKQorICAgICAgICBpZighKCpzZC0+c2wpW2ldLnN0eXApe2Vycm9yKDEyNik7Zj0xO30KKyAgICAgIGlmKGYpeworICAgICAgICBmb3IoaT0wO2k8c2QtPmNvdW50O2krKykgaWYoKCpzZC0+c2wpW2ldLnN0eXApIGZyZWV0eXAoKCpzZC0+c2wpW2ldLnN0eXApOworICAgICAgICBzZC0+Y291bnQ9MDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYob2xkKSBmcmVldHlwKG9sZCk7Cit9CitpbnQgY29tcGF0aWJsZV90eXBlcyh0eXBlICphLHR5cGUgKmIsaW50IHF1YWwpCisvKiAgVmVyZ2xlaWNodCwgb2IgVHlwIGJlaWRlciBUeXBlbiBnbGVpY2ggaXN0LCBjb25zdC92b2xhdGlsZSAgICAgICovCisvKiAgd2VyZGVuIGxhdXQgQU5TSSBuaWNodCBiZXJ1ZWNrc2ljaHRpZ3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIHN0cnVjdF9kZWNsYXJhdGlvbiAqc2Q7CisgIGludCBhZj1hLT5mbGFncyZxdWFsLGJmPWItPmZsYWdzJnF1YWw7CisgIGlmKGFmIT1iZikgcmV0dXJuKDApOworICBhZiY9TlE7YmYmPU5ROworICBpZihJU0ZVTkMoYWYpKXsKKyAgICBpZihhLT5leGFjdC0+Y291bnQmJiFjb21wYXJlX3NkKGEtPmV4YWN0LGItPmV4YWN0KSkgcmV0dXJuKDApOworICB9CisgIGlmKElTU1RSVUNUKGFmKXx8SVNVTklPTihhZikpeworICAgIGlmKGNyb3NzX21vZHVsZSYmYS0+ZXhhY3QtPnR1bml0IT1iLT5leGFjdC0+dHVuaXQpIHJldHVybiAxOworICAgIGlmKGEtPmV4YWN0IT1iLT5leGFjdCkgcmV0dXJuKDApOworICB9CisgIGlmKElTQVJSQVkoYWYpKXsKKyAgICBpZighem1lcXRvKGEtPnNpemUsbDJ6bSgwTCkpJiYhem1lcXRvKGItPnNpemUsbDJ6bSgwTCkpJiYhem1lcXRvKGEtPnNpemUsYi0+c2l6ZSkpIHJldHVybigwKTsKKyAgfQorICBpZihhLT5uZXh0PT0wJiZiLT5uZXh0IT0wKSByZXR1cm4oMCk7CisgIGlmKGEtPm5leHQhPTAmJmItPm5leHQ9PTApIHJldHVybigwKTsKKyAgaWYoYS0+bmV4dD09MCYmYi0+bmV4dD09MCkgcmV0dXJuKDEpOworICBpZihxdWFsIT1OUSkgcXVhbD0oTlV8Q09OU1R8Vk9MQVRJTEUpOworICByZXR1cm4oY29tcGF0aWJsZV90eXBlcyhhLT5uZXh0LGItPm5leHQscXVhbCkpOworfQoraW50IGNvbXBhcmVfc2Qoc3RydWN0X2RlY2xhcmF0aW9uICphLHN0cnVjdF9kZWNsYXJhdGlvbiAqYikKKy8qICBWZXJnbGVpY2h0LCBvYiB6d2VpIHN0cnVjdF9kZWNsYXJhdGlvbnMgaWRlbnRpc2NoIHNpbmQgICAgICAgICAgKi8KKy8qICBXaXJkIG51ciBudXIgZnVlciBQcm90b3R5cGVuIGJlbnV0enQsIGxlZXJlIExpc3RlIGltbWVyIGdsZWljaC4gKi8KK3sKKyAgaW50IGk7CisgIGlmKCFhLT5jb3VudHx8IWItPmNvdW50KSByZXR1cm4oMSk7CisgIGlmKGEtPmNvdW50IT1iLT5jb3VudCkgcmV0dXJuKDApOworICBmb3IoaT0wO2k8YS0+Y291bnQ7aSsrKXsKKyAgICBpZigoKmEtPnNsKVtpXS5zdHlwJiYoKmItPnNsKVtpXS5zdHlwJiYhY29tcGF0aWJsZV90eXBlcygoKmEtPnNsKVtpXS5zdHlwLCgqYi0+c2wpW2ldLnN0eXAsTlUpKSByZXR1cm4oMCk7CisgICAgaWYoKCphLT5zbClbaV0ucmVnIT0oKmItPnNsKVtpXS5yZWcpIHtlcnJvcigzNjgpO3JldHVybiAwO30KKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgfQorICByZXR1cm4oMSk7Cit9Cit2b2lkIGZyZWVfY2xpc3QoY29uc3RfbGlzdCAqcCkKKy8qICBHaWJ0IGNsaXN0IGZyZWkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGNvbnN0X2xpc3QgKm1lcms7CisgIHJldHVybjsKKyAgd2hpbGUocCl7CisgICAgbWVyaz1wLT5uZXh0OworICAgIGlmKHAtPm90aGVyKSBmcmVlX2NsaXN0KHAtPm90aGVyKTsKKyAgICBpZihwLT50cmVlKSBmcmVlX2V4cHJlc3Npb24ocC0+dHJlZSk7CisgICAgZnJlZShwKTsKKyAgICBwPW1lcms7CisgIH0KK30KK3ZvaWQgZ2VuX2NsaXN0KEZJTEUgKix0eXBlICosY29uc3RfbGlzdCAqKTsKKwordm9pZCBnZW5fdmFycyhWYXIgKnYpCisvKiAgR2VuZXJpZXJ0IFZhcmlhYmxlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgbW9kZSxhbCxmaXJzdF9wYXNzPTE7VmFyICpwOworICBpZihlcnJvcnMhPTB8fChjX2ZsYWdzWzVdJlVTRURGTEFHKSkgcmV0dXJuOworICBpZihvcHRzaXplKQorICAgIGFsPXptMmwobWF4YWxpZ24pOworICBlbHNlCisgICAgYWw9MDsKKyAgZm9yKDthbD49MDthbC0tKXsKKyAgICBmb3IobW9kZT0wO21vZGU8Mzttb2RlKyspeworICAgICAgaW50IGksZmxhZzsKKyAgICAgIGZvcihwPXY7cDtwPXAtPm5leHQpeworCWlmKHAtPmZsYWdzJk5FRURTKSBjb250aW51ZTsKKyAgICAgICAgaWYob3B0c2l6ZSYmem0ybChmYWxpZ24ocC0+dnR5cCkpIT1hbCkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYoY3Jvc3NfbW9kdWxlJiYhKHAtPmZsYWdzJlJFRkVSRU5DRUQpKSBjb250aW51ZTsKKyAgICAgICAgaWYoREVCVUcmMikgcHJpbnRmKCJnZW5fdmFyKCk6ICVzXG4iLHAtPmlkZW50aWZpZXIpOworICAgICAgICBpZihwLT5zdG9yYWdlX2NsYXNzPT1TVEFUSUN8fHAtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisgICAgICAgICAgaWYoIShwLT5mbGFncyZHRU5FUkFURUQpKXsKKyAgICAgICAgICAgIGlmKHAtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTiYmIShwLT5mbGFncyYoVVNFREFTU09VUkNFfFVTRURBU0RFU1QpKSYmIShwLT5mbGFncyYoVEVOVEFUSVZFfERFRklORUQpKSkgY29udGludWU7CisJICAgIGlmKHAtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQyYmcC0+bmVzdGluZz4wJiYhKHAtPmZsYWdzJihVU0VEQVNTT1VSQ0V8VVNFREFTREVTVCkpKSBjb250aW51ZTsKKyAgICAgICAgICAgIC8qICBlcnN0IGtvbnN0YW50ZSBpbml0aWFsaXNpZXJ0ZSBEYXRlbiAqLworICAgICAgICAgICAgaWYobW9kZT09MCl7CisgICAgICAgICAgICAgIGlmKCFwLT5jbGlzdCkgY29udGludWU7CisgICAgICAgICAgICAgIGlmKCEocC0+dnR5cC0+ZmxhZ3MmKENPTlNUfFNUUklOR0NPTlNUKSkpeworICAgICAgICAgICAgICAgIHR5cGUgKnQ9cC0+dnR5cDtpbnQgZj0wOworICAgICAgICAgICAgICAgIGRveworICAgICAgICAgICAgICAgICAgaWYodC0+ZmxhZ3MmKENPTlNUfFNUUklOR0NPTlNUKSkgYnJlYWs7CisgICAgICAgICAgICAgICAgICBpZighSVNBUlJBWSh0LT5mbGFncykpe2Y9MTticmVhazt9CisgICAgICAgICAgICAgICAgICB0PXQtPm5leHQ7CisgICAgICAgICAgICAgICAgfXdoaWxlKDEpOworICAgICAgICAgICAgICAgIGlmKGYpIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiAgZGFubiBpbml0aW9saXNpZXJ0ZSAqLworICAgICAgICAgICAgaWYobW9kZT09MSYmIXAtPmNsaXN0KSBjb250aW51ZTsKKyAgICAgICAgICAgIC8qICB1bmQgZGFubiBkZXIgUmVzdCAgICovCisgICAgICAgICAKKwkgICAgaWYobW9kZT09MiYmcC0+Y2xpc3QpIGNvbnRpbnVlOworICAgCisgICAgICAgICAgICBpZighKHAtPmZsYWdzJihURU5UQVRJVkV8REVGSU5FRCkpKXsKKyAgICAgICAgICAgICAgaWYoISgocC0+dnR5cC0+ZmxhZ3MmTlEpPT1GVU5LVCl8fCFwLT5maXx8IXAtPmZpLT5pbmxpbmVfYXNtKXsKKwkJaWYobWFza19vcHQpeworCQkgIGlmKChwLT5mbGFncyZQUklOVEZMSUtFKSYmIXN0cnN0cihwLT5pZGVudGlmaWVyLCIuIikpIG5lZWRzKCJ2ZnByaW50ZiIpOworCQkgIGlmKChwLT5mbGFncyZTQ0FORkxJS0UpJiYhc3Ryc3RyKHAtPmlkZW50aWZpZXIsIi4iKSkgbmVlZHMoInZmc2NhbmYiKTsKKwkJfQorICAgICAgICAgICAgICAgIGdlbl92YXJfaGVhZChvdXQscCk7CisJICAgICAgfQorICAgICAgICAgICAgICBpZihwLT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMmJighcC0+Zml8fCFwLT5maS0+aW5saW5lX2FzbSkpIGVycm9yKDEyNyxwLT5pZGVudGlmaWVyKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgLypnZW5fYWxpZ24ob3V0LGZhbGlnbihwLT52dHlwKSk7Ki8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCEoKHAtPnZ0eXAtPmZsYWdzJk5RKT09RlVOS1QpfHwhcC0+Zml8fCFwLT5maS0+aW5saW5lX2FzbSl7CisJICAgICAgaWYobWFza19vcHQpeworCQlpZigocC0+ZmxhZ3MmUFJJTlRGTElLRSkmJiFzdHJzdHIocC0+aWRlbnRpZmllciwiLiIpKSBuZWVkcygidmZwcmludGYiKTsKKwkJaWYoKHAtPmZsYWdzJlNDQU5GTElLRSkmJiFzdHJzdHIocC0+aWRlbnRpZmllciwiLiIpKSBuZWVkcygidmZzY2FuZiIpOworCSAgICAgIH0KKyAgICAgICAgICAgICAgZ2VuX3Zhcl9oZWFkKG91dCxwKTsKKwkgICAgfQorICAgICAgICAgICAgaWYoIXAtPmNsaXN0KXsKKyAgICAgICAgICAgICAgaWYodHlwZV91bmNvbXBsZXRlKHAtPnZ0eXApKSBlcnJvcigyMDIscC0+aWRlbnRpZmllcik7CisgICAgICAgICAgICAgIGdlbl9kcyhvdXQsc3pvZihwLT52dHlwKSxwLT52dHlwKTsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICBnZW5fY2xpc3Qob3V0LHAtPnZ0eXAscC0+Y2xpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcC0+ZmxhZ3N8PUdFTkVSQVRFRDsKKyAgICAgICAgICB9ZWxzZSBpZihwLT5mbGFncyZJTkxJTkVFWFQpeworICAgICAgICAgICAgLyogYSBmdW5jdGlvbiB3YXMgZGVjbGFyZWQgZXh0ZXJuIGlubGluZSBhbmQgZGVmaW5lZDsKKyAgICAgICAgICAgICAgIHdlIGhhdmUgdG8gY3JlYXRlIGV4dGVybmFsIGxpbmthZ2UgKi8KKyAgICAgICAgICAgIGludCBtPXAtPmZsYWdzOworICAgICAgICAgICAgLyogcHJldGVuZCwgaXQgd2FzIG9ubHkgZGVjbGFyZWQsIGJ1dCBub3QgZGVmaW5lZCBhbmQgcmVtb3ZlCisgICAgICAgICAgICAgICBJTkxJTkVFWFQgKi8KKyAgICAgICAgICAgIHAtPmZsYWdzJj1+KERFRklORUR8SU5MSU5FRVhUKTsKKyAgICAgICAgICAgIGdlbl92YXJfaGVhZChvdXQscCk7CisgICAgICAgICAgICBwLT5mbGFnc3w9REVGSU5FRDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZpcnN0X3Bhc3M9MDsKKyAgICB9CisgIH0KKyAgaWYobWFza19vcHQpeworICAgIGZvcihwPXY7cDtwPXAtPm5leHQpCisgICAgICBpZihwLT5mbGFncyZORUVEUykgZ2VuX3Zhcl9oZWFkKG91dCxwKTsKKyAgfQorfQorCisvKiBjcmVhdGVzIGNvZGUgdGhhdCBkeW5hbWljYWxseSBpbml0aWFsaXplcyBhIHZhcmlhYmxlICovCit2b2lkIGR5bmFtaWNfaW5pdChWYXIgKnYsdHlwZSAqdCxjb25zdF9saXN0ICpjbCx6bWF4IG9mLGludCBub2NvbnN0KQoreworICBpbnQgZj10LT5mbGFnczsKKyAgaWYoSVNBUlJBWShmKSl7CisgICAgem1heCBpOworICAgIGZvcihpPWwyem0oMEwpOyF6bWxlcSh0LT5zaXplLGkpO2k9em1hZGQoaSxsMnptKDFMKSkpeworICAgICAgaWYoY2wmJnptZXF0byhjbC0+aWR4LGkpKXsKKwlkeW5hbWljX2luaXQodix0LT5uZXh0LGNsLT5vdGhlcixvZixub2NvbnN0KTsKKwljbD1jbC0+bmV4dDsKKyAgICAgIH1lbHNleworCWR5bmFtaWNfaW5pdCh2LHQtPm5leHQsMCxvZixub2NvbnN0KTsKKyAgICAgIH0KKyAgICAgIG9mPXptYWRkKG9mLHN6b2YodC0+bmV4dCkpOworICAgIH0KKyAgfWVsc2UgaWYoSVNVTklPTihmKSYmKCFjbHx8IWNsLT50cmVlKSl7CisgICAgZHluYW1pY19pbml0KHYsKCp0LT5leGFjdC0+c2wpW2NsP3ptMmwoY2wtPmlkeCk6MF0uc3R5cCxjbD9jbC0+b3RoZXI6MCxvZixub2NvbnN0KTsKKyAgfWVsc2UgaWYoSVNTVFJVQ1QoZikmJighY2x8fCFjbC0+dHJlZSkpeworICAgIHptYXggYWw7aW50IGZsO3R5cGUgKnN0OworICAgIGludCBiZm8saTsKKyAgICBmb3IoaT0wO2k8dC0+ZXhhY3QtPmNvdW50JiZjbDtpKyspeworICAgICAgaWYoIWNsLT5vdGhlcil7CisJaWYoZXJyb3JzPT0wKQorCSAgaWVycm9yKDApOworCXJldHVybjsKKyAgICAgIH0KKyAgICAgIHN0PSgqdC0+ZXhhY3QtPnNsKVtpXS5zdHlwOworICAgICAgYWw9KCp0LT5leGFjdC0+c2wpW2ldLmFsaWduOworICAgICAgaWYoISgqdC0+ZXhhY3QtPnNsKVtpXS5pZGVudGlmaWVyKSBpZXJyb3IoMCk7CisgICAgICBiZm89KCp0LT5leGFjdC0+c2wpW2ldLmJmb2Zmc2V0OworICAgICAgaWYoIXptZXF0byh6bW1vZChvZixhbCksbDJ6bSgwTCkpKXsKKyAgICAgICAgb2Y9em1hZGQob2Ysem1zdWIoYWwsem1tb2Qob2YsYWwpKSk7CisgICAgICB9CisgICAgICBpZihiZm8+PTApeworCWludCBiZnM9KCp0LT5leGFjdC0+c2wpW2ldLmJmc2l6ZTsKKwlzdGF0aWMgb2JqIGRlc3QgPSB7MH07CisJICAKKwlkZXN0LmZsYWdzPVZBUjsKKwlkZXN0LnY9djsKKwlkZXN0LnZhbC52bWF4PW9mOworCisJaWYoYmZvPT0wKXsKKwkgIC8qIGZpcnN0IGNsZWFyIGVudGlyZSBiaXRmaWVsZCAqLworCSAgSUMgKm5ldz1uZXdfSUMoKTsKKwkgIG5ldy0+Y29kZT1BU1NJR047CisJICBuZXctPno9ZGVzdDsKKwkgIG5ldy0+dHlwZj1zdC0+ZmxhZ3M7CisJICBuZXctPnEyLnZhbC52bWF4PXNpemV0YWJbc3QtPmZsYWdzJk5RXTsKKwkgIG5ldy0+cTEuZmxhZ3M9S09OU1Q7CisJICBuZXctPnExLnZhbC52bWF4PWwyem0oMEwpOworCSAgZXZhbF9jb25zdCgmbmV3LT5xMS52YWwsTUFYSU5UKTsKKwkgIGluc2VydF9jb25zdCgmbmV3LT5xMS52YWwsc3QtPmZsYWdzJk5VKTsKKwkgIGFkZF9JQyhuZXcpOworCX0KKworCS8qIGJpdGZpZWxkICovCisJaWYoIXptZXF0byhjbC0+aWR4LGwyem0oaSkpfHwhY2wtPm90aGVyKXsKKwkgIC8qIG5vdGhpbmcgdG8gZG8sIGluaXRpYWxpemVkIGJlZm9yZSAqLworCX1lbHNlIGlmKGNsLT5vdGhlci0+dHJlZSl7CisJICBvYmogZHVtbXk7CisJICBnZW5fSUMoY2wtPm90aGVyLT50cmVlLDAsMCk7CisJICBjb252ZXJ0KGNsLT5vdGhlci0+dHJlZSxzdC0+ZmxhZ3MpOworCSAgaW5zZXJ0X2JpdGZpZWxkKCZkZXN0LCZjbC0+b3RoZXItPnRyZWUtPm8sJmNsLT5vdGhlci0+dHJlZS0+byxiZnMsYmZvLHN0LT5mbGFncywxKTsKKwkgIGNsPWNsLT5uZXh0OworCX1lbHNleworCSAgc3RhdGljIG9iaiB2YWwgPSB7MH07CisJICB2YWwuZmxhZ3M9S09OU1Q7CisJICB2YWwudmFsPWNsLT5vdGhlci0+dmFsOworCSAgaW5zZXJ0X2JpdGZpZWxkKCZkZXN0LCZ2YWwsJnZhbCxiZnMsYmZvLHN0LT5mbGFncywxKTsKKwkgIGNsPWNsLT5uZXh0OworCX0KKwlpZihpKzE+PXQtPmV4YWN0LT5jb3VudHx8KCp0LT5leGFjdC0+c2wpW2krMV0uYmZvZmZzZXQ8PTB8fCFjbCl7CisJICBvZj16bWFkZChvZixzem9mKHN0KSk7CisJfQorICAgICAgfWVsc2V7CisJaWYoem1lcXRvKGwyem0oKGxvbmcpaSksY2wtPmlkeCkpeworCSAgZHluYW1pY19pbml0KHYsc3QsY2wtPm90aGVyLG9mLG5vY29uc3QpOworCSAgY2w9Y2wtPm5leHQ7CisJfWVsc2UKKwkgIGR5bmFtaWNfaW5pdCh2LHN0LDAsb2Ysbm9jb25zdCk7CisgICAgICAgIG9mPXptYWRkKG9mLHN6b2Yoc3QpKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yKDtpPHQtPmV4YWN0LT5jb3VudDtpKyspeworICAgICAgc3Q9KCp0LT5leGFjdC0+c2wpW2ldLnN0eXA7CisgICAgICBhbD0oKnQtPmV4YWN0LT5zbClbaV0uYWxpZ247CisgICAgICBiZm89KCp0LT5leGFjdC0+c2wpW2ldLmJmb2Zmc2V0OworICAgICAgaWYoYmZvPjApIGNvbnRpbnVlOworICAgICAgaWYoIXptZXF0byh6bW1vZChvZixhbCksbDJ6bSgwTCkpKXsKKyAgICAgICAgb2Y9em1hZGQob2Ysem1zdWIoYWwsem1tb2Qob2YsYWwpKSk7CisgICAgICB9CisgICAgICBkeW5hbWljX2luaXQodixzdCwwLG9mLG5vY29uc3QpOworICAgICAgb2Y9em1hZGQob2Ysc3pvZihzdCkpOworICAgIH0KKyAgfWVsc2V7CisgICAgSUMgKm5ldzsKKyAgICBpZihub2NvbnN0JiYoIWNsfHwhY2wtPnRyZWUpKQorICAgICAgcmV0dXJuOworICAgIG5ldz1uZXdfSUMoKTsKKyAgICBuZXctPmNvZGU9QVNTSUdOOworICAgIG5ldy0+ei5mbGFncz1WQVI7CisgICAgbmV3LT56LnY9djsKKyAgICBuZXctPnoudmFsLnZtYXg9b2Y7CisgICAgbmV3LT50eXBmPXQtPmZsYWdzOworICAgIG5ldy0+cTIudmFsLnZtYXg9c3pvZih0KTsKKyAgICBpZighY2wpeworICAgICAgbmV3LT5xMS5mbGFncz1LT05TVDsKKyAgICAgIGd2YWwudm1heD1sMnptKDBMKTsKKyAgICAgIGV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKKyAgICAgIGluc2VydF9jb25zdCgmbmV3LT5xMS52YWwsdC0+ZmxhZ3MmTlUpOworICAgIH1lbHNlIGlmKGNsLT50cmVlKXsKKyAgICAgIGdlbl9JQyhjbC0+dHJlZSwwLDApOworICAgICAgaWYoSVNTQ0FMQVIodC0+ZmxhZ3MpKQorCWNvbnZlcnQoY2wtPnRyZWUsdC0+ZmxhZ3MpOworICAgICAgbmV3LT5xMT1jbC0+dHJlZS0+bzsKKyAgICB9ZWxzZXsKKyAgICAgIG5ldy0+cTEuZmxhZ3M9S09OU1Q7CisgICAgICBuZXctPnExLnZhbD1jbC0+dmFsOworICAgIH0KKyAgICBhZGRfSUMobmV3KTsKKyAgfQorfQorCisKK3ZvaWQgZ2VuX2NsaXN0KEZJTEUgKmYsdHlwZSAqdCxjb25zdF9saXN0ICpjbCkKKy8qICBHZW5lcmllcnQgZGMgZnVlciBjb25zdF9saXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBpLGJmbyxiZnM7em1heCBzejt6dW1heCBiZnZhbD11bDJ6dW0oMFVMKTsKKworI2lmIDAKKyAgZm9yKGk9MDtpPChpbnQpc3pvZih0KTtpKyspeworICAgIHp1Y2hhciBjO2ludCBzOworICAgIHM9Z2V0X2NsaXN0X2J5dGUodCxjbCxpLCZjKTsKKyAgICBwcmludGYoIiUwM2Q6IDB4JTAyeCAoJWQpXG4iLGksKGludCljLHMpOworICB9CisjZW5kaWYKKworCisgIGlmKElTQVJSQVkodC0+ZmxhZ3MpKXsKKyAgICBmb3Ioc3o9bDJ6bSgwTCk7IXptbGVxKHQtPnNpemUsc3opJiZjbDtjbD1jbC0+bmV4dCl7CisgICAgICBpZighY2wtPm90aGVyKXtpZXJyb3IoMCk7cmV0dXJuO30KKyAgICAgIGlmKCF6bWVxdG8oc3osY2wtPmlkeCkpCisJZ2VuX2RzKGYsem1tdWx0KHptc3ViKGNsLT5pZHgsc3opLHN6b2YodC0+bmV4dCkpLHQtPm5leHQpOworCisgICAgICBnZW5fY2xpc3QoZix0LT5uZXh0LGNsLT5vdGhlcik7CisgICAgICBzej16bWFkZChjbC0+aWR4LGwyem0oMUwpKTsKKyAgICB9CisgICAgaWYoIXptbGVxKHQtPnNpemUsc3opKSBnZW5fZHMoZix6bW11bHQoem1zdWIodC0+c2l6ZSxzeiksc3pvZih0LT5uZXh0KSksdC0+bmV4dCk7CisgICAgcmV0dXJuOworICB9CisgIGlmKElTVU5JT04odC0+ZmxhZ3MpKXsKKyAgICBpbnQgaT16bTJsKGNsLT5pZHgpOworICAgIGlmKGNsJiZjbC0+dHJlZSl7CisgICAgICAvKiB1bmlvbiBpbml0aWFsaXplZCBieSBhbm90aGVyIHVuaW9uICovCisgICAgICBnZW5fZHMoZixzem9mKHQpLHQpOworICAgIH1lbHNleworICAgICAgZ2VuX2NsaXN0KGYsKCp0LT5leGFjdC0+c2wpW2ldLnN0eXAsY2wtPm90aGVyKTsKKyAgICAgIHN6PXptc3ViKHN6b2YodCksc3pvZigoKnQtPmV4YWN0LT5zbClbaV0uc3R5cCkpOworICAgICAgaWYoIXptZXF0byhzeixsMnptKDBMKSkpIGdlbl9kcyhmLHN6LDApOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYoSVNTVFJVQ1QodC0+ZmxhZ3MpKXsKKyAgICB6bWF4IGFsO2ludCBmbDt0eXBlICpzdDsKKyAgICBzej1sMnptKDBMKTsKKyAgICBpZihjbCYmY2wtPnRyZWUpeworICAgICAgLyogaW5pdGlhbGl6ZWQgYnkgYW5vdGhlciAqLworICAgICAgZ2VuX2RzKGYsc3pvZih0KSx0KTsKKyAgICAgIHN6PXptYWRkKHN6LHN6b2YodCkpOworICAgIH1lbHNleworICAgICAgZm9yKGk9MDtpPHQtPmV4YWN0LT5jb3VudCYmY2w7aSsrKXsKKwlpZighY2wtPm90aGVyKXtpZXJyb3IoMCk7cmV0dXJuO30KKwlzdD0oKnQtPmV4YWN0LT5zbClbaV0uc3R5cDsKKwlhbD0oKnQtPmV4YWN0LT5zbClbaV0uYWxpZ247CisJaWYoISgqdC0+ZXhhY3QtPnNsKVtpXS5pZGVudGlmaWVyKSBpZXJyb3IoMCk7CisJYmZvPSgqdC0+ZXhhY3QtPnNsKVtpXS5iZm9mZnNldDsKKwlpZighem1lcXRvKHptbW9kKHN6LGFsKSxsMnptKDBMKSkpeworCSAgZ2VuX2RzKGYsem1zdWIoYWwsem1tb2Qoc3osYWwpKSwwKTsKKwkgIHN6PXptYWRkKHN6LHptc3ViKGFsLHptbW9kKHN6LGFsKSkpOworCX0KKwlpZihiZm8+PTApeworCSAgLyogYml0ZmllbGQgKi8KKwkgIGlmKCgqdC0+ZXhhY3QtPnNsKVtpXS5pZGVudGlmaWVyWzBdKXsKKwkgICAgYmZzPSgqdC0+ZXhhY3QtPnNsKVtpXS5iZnNpemU7CisJICAgIGlmKHptZXF0byhsMnptKChsb25nKWkpLGNsLT5pZHgpKXsKKwkgICAgICBldmFsX2NvbnN0KCZjbC0+b3RoZXItPnZhbCxzdC0+ZmxhZ3MpOworCSAgICAgIGNsPWNsLT5uZXh0OworCSAgICB9ZWxzZXsKKwkgICAgICB2dW1heD11bDJ6dW0oMFVMKTsKKwkgICAgfQorCSAgICB2dW1heD16dW1hbmQodnVtYXgsenVtc3ViKHp1bWxzaGlmdCh1bDJ6dW0oMVVMKSx1bDJ6dW0oKHVuc2lnbmVkIGxvbmcpYmZzKSksdWwyenVtKDFVTCkpKTsKKwkgICAgYmZ2YWw9enVtb3IoYmZ2YWwsenVtbHNoaWZ0KHZ1bWF4LHVsMnp1bSgodW5zaWduZWQgbG9uZyliZmxheW91dChiZm8sYmZzLHN0LT5mbGFncykpKSk7CisJICB9ICAgICAgICAgIAorCSAgaWYoaSsxPj10LT5leGFjdC0+Y291bnR8fCgqdC0+ZXhhY3QtPnNsKVtpKzFdLmJmb2Zmc2V0PD0wfHwhY2wpeworCSAgICAvKiBsYXN0IGJpdGZpZWxkIGluIGludGVnZXIgKi8KKwkgICAgY29uc3RfbGlzdCBiZmNsOworCSAgICBndmFsLnZ1bWF4PWJmdmFsOworCSAgICBldmFsX2NvbnN0KCZndmFsLFVOU0lHTkVEfE1BWElOVCk7CisJICAgIGluc2VydF9jb25zdCgmYmZjbC52YWwsc3QtPmZsYWdzJk5VKTsKKwkgICAgYmZjbC50cmVlPTA7CisJICAgIGdlbl9kYyhmLHN0LT5mbGFncyZOVSwmYmZjbCk7CisJICAgIGJmdmFsPXVsMnp1bSgwTCk7CisJICAgIHN6PXptYWRkKHN6LHN6b2Yoc3QpKTsKKwkgIH0KKwl9ZWxzZXsKKwkgIGlmKHptZXF0byhsMnptKChsb25nKWkpLGNsLT5pZHgpKXsKKwkgICAgZ2VuX2NsaXN0KGYsc3QsY2wtPm90aGVyKTsKKwkgICAgY2w9Y2wtPm5leHQ7CisJICB9ZWxzZQorCSAgICBnZW5fZHMoZixzem9mKHN0KSxzdCk7CisJICBzej16bWFkZChzeixzem9mKHN0KSk7CisJfQorICAgICAgfQorICAgICAgZm9yKDtpPHQtPmV4YWN0LT5jb3VudDtpKyspeworCXN0PSgqdC0+ZXhhY3QtPnNsKVtpXS5zdHlwOworCWFsPSgqdC0+ZXhhY3QtPnNsKVtpXS5hbGlnbjsKKwliZm89KCp0LT5leGFjdC0+c2wpW2ldLmJmb2Zmc2V0OworCWlmKGJmbz4wKSBjb250aW51ZTsKKwlpZighem1lcXRvKHptbW9kKHN6LGFsKSxsMnptKDBMKSkpeworCSAgZ2VuX2RzKGYsem1zdWIoYWwsem1tb2Qoc3osYWwpKSwwKTsKKwkgIHN6PXptYWRkKHN6LHptc3ViKGFsLHptbW9kKHN6LGFsKSkpOworCX0KKwlnZW5fZHMoZixzem9mKCgqdC0+ZXhhY3QtPnNsKVtpXS5zdHlwKSwoKnQtPmV4YWN0LT5zbClbaV0uc3R5cCk7CisJc3o9em1hZGQoc3osc3pvZihzdCkpOworICAgICAgfQorICAgIH0KKyAgICBhbD1mYWxpZ24odCk7CisgICAgaWYoIXptZXF0byh6bW1vZChzeixhbCksbDJ6bSgwTCkpKQorICAgICAgZ2VuX2RzKGYsem1zdWIoYWwsem1tb2Qoc3osYWwpKSwwKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZihjbC0+dHJlZSkgY2wtPnRyZWUtPm8uYW09MDsKKworICBpZih6bWVxdG8oY2wtPmlkeCxsMnptKC0xTCkpKQorICAgIGdlbl9kcyhmLHN6b2YodCksdCk7CisgIGVsc2UKKyAgICBnZW5fZGMoZix0LT5mbGFncyZOVSxjbCk7Cit9CisKKy8qIGZpbmRzIHRoZSBjb3JyZWN0IHBsYWNlIGluIGEgY29uc3QgbGlzdCB0byBpbnNlcnQgbmV3IGluaXRpYWxpemVyICovCitjb25zdF9saXN0ICppbnNlcnRfY2woY29uc3RfbGlzdCAqb2xkLHptYXggaWR4KQoreworICBjb25zdF9saXN0ICpwLCpjbD0wOworICBpZihvbGQmJnptbGVxKG9sZC0+aWR4LGlkeCkpeworICAgIHA9b2xkOworICAgIGRveworICAgICAgaWYoem1lcXRvKHAtPmlkeCxpZHgpKXsKKwkvKiBmb3VuZCBleGlzdGluZyBlbnRyeSAqLworCWNsPXA7CisJYnJlYWs7CisgICAgICB9CisgICAgICBpZighcC0+bmV4dHx8IXptbGVxKHAtPm5leHQtPmlkeCxpZHgpKQorCWJyZWFrOworICAgICAgcD1wLT5uZXh0OworICAgIH13aGlsZShwKTsKKyAgfWVsc2UKKyAgICBwPTA7CisgIC8qIHdlIG5lZWQgYSBuZXcgZW50cnkgKi8KKyAgaWYoIWNsKXsKKyAgICBjbD1teW1hbGxvYyhDTFMpOworICAgIGNsLT50cmVlPTA7CisgICAgY2wtPm90aGVyPTA7CisgICAgY2wtPmlkeD1pZHg7CisgICAgaWYocCl7CisgICAgICBjbC0+bmV4dD1wLT5uZXh0OworICAgICAgcC0+bmV4dD1jbDsKKyAgICB9ZWxzZQorICAgICAgY2wtPm5leHQ9b2xkOworICB9CisgIHJldHVybiBjbDsKK30KKworY29uc3RfbGlzdCAqZGVzaWduYXRvcih0eXBlICp0LGNvbnN0X2xpc3QgKmNsKQoreworICBpbnQgZj10LT5mbGFncyZOUTsKKyAgbnAgdHJlZTsKKyAgaWYoIWM5OSkgcmV0dXJuIDA7CisgIGlmKElTQVJSQVkoZikmJmN0b2stPnR5cGU9PUxCUkspeworICAgIG5leHRfdG9rZW4oKTsKKyAgICBraWxsc3AoKTsKKyAgICB0cmVlPWV4cHJlc3Npb24oKTsKKyAgICBpZihjdG9rLT50eXBlIT1SQlJLKQorICAgICAgZXJyb3IoNjIpOworICAgIGVsc2UKKyAgICAgIHtuZXh0X3Rva2VuKCk7a2lsbHNwKCk7fQorICAgIGlmKCF0eXBlX2V4cHJlc3Npb24odHJlZSwwKSl7CisgICAgICAvKiAgICAgICAgICAgICAgICAgICAgZXJyb3IoImluY29ycmVjdCBjb25zdGFudCBleHByZXNzaW9uIik7Ki8KKyAgICB9ZWxzZXsKKyAgICAgIGlmKHRyZWUtPnNpZGVmeCkgZXJyb3IoNjApOworICAgICAgaWYodHJlZS0+ZmxhZ3MhPUNFWFBSfHwhSVNJTlQodHJlZS0+bnR5cC0+ZmxhZ3MpKXsKKwllcnJvcigxOSk7CisgICAgICB9ZWxzZXsKKwkvKiBjaGVjayBpbmRleCBmb3IgdmFsaWQgcmFuZ2UgKi8KKwlldmFsX2NvbnN0bih0cmVlKTsKKwlpZighem1sZXEobDJ6bSgwTCksdm1heCkpIHtlcnJvcigzNTQpO3ZtYXg9bDJ6bSgwTCk7fQorCWlmKCF6bWVxdG8odC0+c2l6ZSxsMnptKDBMKSkmJnptbGVxKHQtPnNpemUsdm1heCkpIHtlcnJvcigzNTQpO3ZtYXg9bDJ6bSgwTCk7fQorCisJY2w9aW5zZXJ0X2NsKGNsLHZtYXgpOworCisJcmV0dXJuIGNsOworICAgICAgfQorICAgIH0KKyAgfWVsc2UgaWYoKElTU1RSVUNUKGYpfHxJU1VOSU9OKGYpKSYmY3Rvay0+dHlwZT09RE9UKXsKKyAgICBuZXh0X3Rva2VuKCk7CisgICAga2lsbHNwKCk7CisgICAgaWYoY3Rvay0+dHlwZSE9TkFNRSl7CisgICAgICBlcnJvcig1Myk7CisgICAgfWVsc2V7CisgICAgICBpbnQgaSxuPS0xOworICAgICAgZm9yKGk9MDtpPHQtPmV4YWN0LT5jb3VudDtpKyspCisJaWYoIXN0cmNtcCgoKnQtPmV4YWN0LT5zbClbaV0uaWRlbnRpZmllcixjdG9rLT5uYW1lKSkgbj1pOworICAgICAgaWYobjwwKXsKKwllcnJvcigyMyxjdG9rLT5uYW1lKTsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIG5leHRfdG9rZW4oKTsKKyAgICAgIGtpbGxzcCgpOworCisgICAgICBpZighSVNVTklPTihmKXx8IWNsKQorCWNsPWluc2VydF9jbChjbCxsMnptKChsb25nKW4pKTsKKworICAgICAgcmV0dXJuIGNsOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworLyogZGVjbGFyZSBhIGJ1aWx0aW4gZnVuY3Rpb24gd2l0aCB1cCB0byB0d28gc2NhbGFyIGFyZ3VtZW50cyAqLworVmFyICpkZWNsYXJlX2J1aWx0aW4oY2hhciAqbmFtZSxpbnQgenR5cCxpbnQgcTF0eXAsaW50IHExcmVnLGludCBxMnR5cCxpbnQgcTJyZWcsaW50IG5vc2lkZWZ4LGNoYXIgKmFzbSkKK3sKKyAgc3RydWN0X2RlY2xhcmF0aW9uICpzZDsKKyAgdHlwZSAqdDsKKyAgVmFyICp2OworICBpbnQgYXJnczsKKyAgaWYoISh2PWZpbmRfZXh0X3ZhcihuYW1lKSkpeworICAgIHNkPW15bWFsbG9jKHNpemVvZigqc2QpKTsKKyAgICBpZihxMXR5cD09MCkgYXJncz0xOworICAgIGVsc2UgaWYocTJ0eXAhPTApIGFyZ3M9MzsKKyAgICBlbHNlIGFyZ3M9MjsKKyAgICBzZC0+c2w9bXltYWxsb2MoYXJncypzaXplb2Yoc3RydWN0X2xpc3QpKTsKKyAgICBtZW1zZXQoc2QtPnNsLDAsYXJncypzaXplb2Yoc3RydWN0X2xpc3QpKTsKKyAgICBzZC0+Y291bnQ9YXJnczsKKyAgICBpZihxMXR5cCl7CisgICAgICAoKnNkLT5zbClbMF0uc3R5cD1uZXdfdHlwKCk7CisgICAgICAoKnNkLT5zbClbMF0uc3R5cC0+ZmxhZ3M9cTF0eXA7CisgICAgICAoKnNkLT5zbClbMF0ucmVnPXExcmVnOworICAgIH0KKyAgICBpZihxMnR5cCl7CisgICAgICAoKnNkLT5zbClbMV0uc3R5cD1uZXdfdHlwKCk7CisgICAgICAoKnNkLT5zbClbMV0uc3R5cC0+ZmxhZ3M9cTJ0eXA7CisgICAgICAoKnNkLT5zbClbMV0ucmVnPXEycmVnOworICAgIH0KKyAgICAoKnNkLT5zbClbYXJncy0xXS5zdHlwPW5ld190eXAoKTsKKyAgICAoKnNkLT5zbClbYXJncy0xXS5zdHlwLT5mbGFncz1WT0lEOworICAgICgqc2QtPnNsKVthcmdzLTFdLnJlZz0wOworICAgIHQ9bmV3X3R5cCgpOworICAgIHQtPmZsYWdzPUZVTktUOworICAgIHQtPmV4YWN0PWFkZF9zZChzZCxGVU5LVCk7CisgICAgdC0+bmV4dD1uZXdfdHlwKCk7CisgICAgdC0+bmV4dC0+ZmxhZ3M9enR5cDsKKyAgICB2PWFkZF92YXIobmFtZSx0LEVYVEVSTiwwKTsKKyAgICB2LT5mbGFnc3w9QlVJTFRJTjsKKyAgICBpZihhc218fG5vc2lkZWZ4KXsKKyAgICAgIHYtPmZpPW5ld19maSgpOworICAgICAgaWYoYXNtKSB2LT5maS0+aW5saW5lX2FzbT1hc207CisgICAgICBpZihub3NpZGVmeCl7CisJdi0+ZmktPmNhbGxfY250PXYtPmZpLT51c2VfY250PXYtPmZpLT5jaGFuZ2VfY250PTA7CisJdi0+ZmktPmZsYWdzPUFMTF9DQUxMU3xBTExfVVNFU3xBTExfTU9EU3xBTFdBWVNfUkVUVVJOU3xOT1NJREVGWDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHY7Cit9CisKKworY29uc3RfbGlzdCAqaW5pdGlhbGl6YXRpb24odHlwZSAqdCxpbnQgbm9jb25zdCxpbnQgbGV2ZWwsaW50IGRlc2ksc3RydWN0X2RlY2xhcmF0aW9uICpmc3RydWN0LGNvbnN0X2xpc3QgKmZpcnN0KQorLyogIFRyYWVndCBlaW5lIEluaXRpYWxpc2llcnVuZyBpbiBlaW5lIGNvbnN0X2xpc3QgZWluLiAgICAgICAgICovCit7CisgIGNvbnN0X2xpc3QgKmNsLCoqcHJldjsKKyAgbnAgdHJlZSx0cmVlMjsKKyAgaW50IGJyYWNrZXQsZGVzaV9mb2xsb3dzPTA7CisgIHptYXggaTsKKyAgdG9rZW4gbXRvazsKKyAgCisgIGludCBmPXQtPmZsYWdzJk5ROworICBpZihJU0ZVTkMoZikpe2Vycm9yKDQyKTtyZXR1cm4oMCk7fQorICBpZihjdG9rLT50eXBlPT1MQlJBKXtuZXh0X3Rva2VuKCk7a2lsbHNwKCk7YnJhY2tldD0xO30gZWxzZSBicmFja2V0PTA7CisgIGlmKElTQVJSQVkoZikpeworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgIGlmKHQtPmRzaXplKXsKKyAgICAgIGVycm9yKDM1OCk7CisgICAgfWVsc2UgaWYoem1lcXRvKHQtPnNpemUsbDJ6bSgwTCkpJiZsZXZlbCE9MCl7CisgICAgICBlcnJvcigzNTkpOworICAgIH1lbHNlIGlmKGN0b2stPnR5cGU9PVRfU1RSSU5HJiZ0LT5uZXh0JiYodC0+bmV4dC0+ZmxhZ3MmTlEpPT1DSEFSKXsKKyAgICAgIGtpbGxzcCgpOworICAgICAgdHJlZT1zdHJpbmdfZXhwcmVzc2lvbigpOworICAgICAgZmlyc3Q9dHJlZS0+Y2w7CisgICAgICBmcmVlX2V4cHJlc3Npb24odHJlZSk7CisgICAgfWVsc2V7CisgICAgICBjb25zdF9saXN0ICpsYXN0PWZpcnN0OworICAgICAgaWYobGV2ZWw9PTAmJiFicmFja2V0KSBlcnJvcigxNTcpOworICAgICAgZm9yKGk9bDJ6bSgwTCk7ZGVzaV9mb2xsb3dzfHwoKHptZXF0byh0LT5zaXplLGwyem0oMEwpKXx8IXptbGVxKHQtPnNpemUsaSl8fGN0b2stPnR5cGU9PUxCUkspJiZjdG9rLT50eXBlIT1SQlJBKTtpPXptYWRkKGksbDJ6bSgxTCkpKXsKKyAgICAgICAgaWYoIXptbGVxKGksMCkpeworICAgICAgICAgIGlmKGN0b2stPnR5cGU9PUNPTU1BKXtuZXh0X3Rva2VuKCk7a2lsbHNwKCk7fSBlbHNlIGJyZWFrOworICAgICAgICAgIGlmKGN0b2stPnR5cGU9PVJCUkEpIGJyZWFrOworICAgICAgICB9CisJLyogY2hlY2sgZm9yIGZpcnN0IGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgKi8KKwljbD1kZXNpZ25hdG9yKHQsZmlyc3QpOworCWlmKCFjbCl7CisJICAvKiBubyBkZXNpZ25hdG9yICovCisJICBjbD1pbnNlcnRfY2wobGFzdCxpKTsKKwkgIGNsLT5vdGhlcj1pbml0aWFsaXphdGlvbih0LT5uZXh0LGM5OT9ub2NvbnN0OjAsbGV2ZWwrMSwwLGZzdHJ1Y3QsY2wtPm90aGVyKTsKKwkgIGlmKGNsLT5vdGhlciYmem1lcXRvKGNsLT5vdGhlci0+aWR4LGwyem0oLTJMKSkpeworCSAgICBmaXJzdD1jbC0+b3RoZXI7CisJICAgIGZpcnN0LT5vdGhlcj0wOworCSAgICBicmVhazsKKwkgIH0KKwl9ZWxzZXsKKwkgIC8qIGRlc2lnbmF0b3I6IHN0b3JlIGN1cnJlbnQgb2JqZWN0IGFuZCBoYW5kbGUgcmVtYWluaW5nIGRlc2lnbmF0b3JzICovCisJICBpPWNsLT5pZHg7CisJICBpZihjdG9rLT50eXBlIT1BU0dOKXsKKwkgICAgaWYoY3Rvay0+dHlwZSE9TEJSSyYmY3Rvay0+dHlwZSE9RE9UKQorCSAgICAgIGVycm9yKDM1NSk7CisJICB9ZWxzZXsKKwkgICAgY2wtPm90aGVyPTA7CisJICAgIG5leHRfdG9rZW4oKTtraWxsc3AoKTsKKwkgIH0KKwkgIGNsLT5vdGhlcj1pbml0aWFsaXphdGlvbih0LT5uZXh0LGM5OT9ub2NvbnN0OjAsbGV2ZWwrMSwxLGZzdHJ1Y3QsY2wtPm90aGVyKTsKKwl9CisJaWYoY2wtPm5leHQ9PWZpcnN0KSBmaXJzdD1jbDsKKwlsYXN0PWNsOworICAgICAgICBraWxsc3AoKTsKKwlpZihkZXNpJiYhYnJhY2tldCkKKwkgIGJyZWFrOworCWRlc2lfZm9sbG93cz0wOworCWlmKGN0b2stPnR5cGU9PUNPTU1BKXsKKwkgIGNvcHlfdG9rZW4oJm10b2ssY3Rvayk7CisJICBuZXh0X3Rva2VuKCk7a2lsbHNwKCk7CisJICBpZihjdG9rLT50eXBlPT1MQlJLKQorCSAgICBkZXNpX2ZvbGxvd3M9MTsKKwkgIHB1c2hfdG9rZW4oJm10b2spOworCX0KKyAgICAgIH0KKworICAgICAgaWYoYnJhY2tldCYmem1lcXRvKGksbDJ6bSgwTCkpKSBlcnJvcigzNjApOworCisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgfQorICB9ZWxzZSBpZihJU1NUUlVDVChmKSYmKGJyYWNrZXR8fCFub2NvbnN0fHxjOTkpKXsKKyAgICBpZih0LT5leGFjdC0+Y291bnQ8PTApCisgICAgICB7ZXJyb3IoNDMpO3JldHVybigwKTt9CisjaWZkZWYgSEFWRV9FQ1BQCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICBwcmV2PTA7CisgICAgaWYobGV2ZWw9PTAmJiFicmFja2V0JiYhYzk5KSBlcnJvcigxNTcpOworICAgIGZvcihpPWwyem0oMEwpO2Rlc2lfZm9sbG93c3x8KCF6bWxlcSh0LT5leGFjdC0+Y291bnQsaSkmJmN0b2stPnR5cGUhPVJCUkEpO2k9em1hZGQoaSxsMnptKDFMKSkpeworICAgICAgaWYoIWRlc2lfZm9sbG93cyYmKCp0LT5leGFjdC0+c2wpW3ptMmwoaSldLmlkZW50aWZpZXJbMF09PTApIGNvbnRpbnVlOyAvKiB1bm5hbWVkIGJpdGZpZWxkICovCisgICAgICBpZighem1sZXEoaSwwKSl7CisgICAgICAgIGlmKGN0b2stPnR5cGU9PUNPTU1BKXtuZXh0X3Rva2VuKCk7a2lsbHNwKCk7fSBlbHNlIGJyZWFrOworICAgICAgICBpZihjdG9rLT50eXBlPT1SQlJBKSBicmVhazsKKyAgICAgIH0KKyAgICAgIGNsPWRlc2lnbmF0b3IodCxmaXJzdCk7CisKKyAgICAgIGlmKCFjbCl7CisJY2w9aW5zZXJ0X2NsKGZpcnN0LGwyem0oKGxvbmcpaSkpOworCWNsLT5vdGhlcj1pbml0aWFsaXphdGlvbigoKnQtPmV4YWN0LT5zbClbem0ybChpKV0uc3R5cCxjOTk/bm9jb25zdDowLGxldmVsKzEsMCwhZnN0cnVjdCYmIWJyYWNrZXQmJnptZXF0byhpLGwyem0oMEwpKT90LT5leGFjdDpmc3RydWN0LGNsLT5vdGhlcik7CisJaWYoY2wtPm90aGVyJiZ6bWVxdG8oY2wtPm90aGVyLT5pZHgsbDJ6bSgtMkwpKSl7CisJICBpZihmc3RydWN0KXsKKwkgICAgZmlyc3Q9Y2wtPm90aGVyOworCSAgICBmaXJzdC0+b3RoZXI9MDsKKwkgIH1lbHNleworCSAgICAqY2w9KmNsLT5vdGhlcjsKKwkgICAgY2wtPmlkeD1sMnptKC0xTCk7CisJICAgIGNsLT5vdGhlcj0wOworCSAgICBmaXJzdD1jbDsKKwkgIH0KKwkgIGJyZWFrOworCX0KKyAgICAgIH1lbHNleworCWk9em0ybChjbC0+aWR4KTsKKwlpZihjdG9rLT50eXBlIT1BU0dOKXsKKwkgIGlmKGN0b2stPnR5cGUhPUxCUksmJmN0b2stPnR5cGUhPURPVCkKKwkgICAgZXJyb3IoMzU1KTsKKwl9ZWxzZXsKKwkgIG5leHRfdG9rZW4oKTtraWxsc3AoKTsKKwkgIGNsLT5vdGhlcj0wOworCX0KKwljbC0+b3RoZXI9aW5pdGlhbGl6YXRpb24oKCp0LT5leGFjdC0+c2wpW3ptMmwoaSldLnN0eXAsYzk5P25vY29uc3Q6MCxsZXZlbCsxLDEsZnN0cnVjdCxjbC0+b3RoZXIpOworICAgICAgfQorICAgICAgaWYoY2wtPm5leHQ9PWZpcnN0KSBmaXJzdD1jbDsKKyAgICAgIGlmKGRlc2kmJiFicmFja2V0KQorCWJyZWFrOworICAgICAgZGVzaV9mb2xsb3dzPTA7CisgICAgICBpZihjdG9rLT50eXBlPT1DT01NQSl7CisJY29weV90b2tlbigmbXRvayxjdG9rKTsKKwluZXh0X3Rva2VuKCk7a2lsbHNwKCk7CisJaWYoY3Rvay0+dHlwZT09RE9UKQorCSAgZGVzaV9mb2xsb3dzPTE7CisJcHVzaF90b2tlbigmbXRvayk7CisgICAgICB9CisgICAgfQorCisgICAgaWYoYnJhY2tldCYmem1lcXRvKGksbDJ6bSgwTCkpKSBlcnJvcigzNjApOworCisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisKKyAgfWVsc2UgaWYoSVNVTklPTihmKSYmKGM5OXx8YnJhY2tldHx8IW5vY29uc3QpKXsKKyAgICBpZih0LT5leGFjdC0+Y291bnQ8PTApCisgICAgICB7ZXJyb3IoNDQpO3JldHVybigwKTt9CisKKyAgICBpZihsZXZlbD09MCYmIWJyYWNrZXQmJiFjOTkpIGVycm9yKDE1Nyk7CisgICAgZGVzaV9mb2xsb3dzPTE7CisgICAgd2hpbGUoZGVzaV9mb2xsb3dzKXsKKyAgICAgIGNsPWRlc2lnbmF0b3IodCxmaXJzdCk7CisKKyAgICAgIGlmKCFjbCl7CisJY2w9aW5zZXJ0X2NsKGZpcnN0LGwyem0oKGxvbmcpMCkpOworCWNsLT5vdGhlcj1pbml0aWFsaXphdGlvbigoKnQtPmV4YWN0LT5zbClbMF0uc3R5cCxjOTk/bm9jb25zdDowLGxldmVsKzEsMCwhZnN0cnVjdCYmIWJyYWNrZXQ/dC0+ZXhhY3Q6ZnN0cnVjdCxjbC0+b3RoZXIpOworCWlmKGNsLT5vdGhlciYmem1lcXRvKGNsLT5vdGhlci0+aWR4LGwyem0oLTJMKSkpeworCSAgaWYoZnN0cnVjdCl7CisJICAgIGZpcnN0PWNsLT5vdGhlcjsKKwkgICAgZmlyc3QtPm90aGVyPTA7CisJICB9ZWxzZXsKKwkgICAgKmNsPSpjbC0+b3RoZXI7CisJICAgIGNsLT5vdGhlcj0wOworCSAgICBjbC0+aWR4PWwyem0oLTFMKTsKKwkgICAgZmlyc3Q9Y2w7CisJICB9CisJICBicmVhazsKKwl9CisgICAgICB9ZWxzZXsKKwlpPXptMmwoY2wtPmlkeCk7CisJaWYoY3Rvay0+dHlwZSE9QVNHTil7CisJICBpZihjdG9rLT50eXBlIT1MQlJLJiZjdG9rLT50eXBlIT1ET1QpCisJICAgIGVycm9yKDM1NSk7CisJfWVsc2V7CisJICBuZXh0X3Rva2VuKCk7a2lsbHNwKCk7CisJICBjbC0+b3RoZXI9MDsKKwl9CisJY2wtPm90aGVyPWluaXRpYWxpemF0aW9uKCgqdC0+ZXhhY3QtPnNsKVt6bTJsKGkpXS5zdHlwLGM5OT9ub2NvbnN0OjAsbGV2ZWwrMSwxLGZzdHJ1Y3QsY2wtPm90aGVyKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0PWNsOworICAgICAgaWYoZGVzaSYmIWJyYWNrZXQpCisJYnJlYWs7CisgICAgICBkZXNpX2ZvbGxvd3M9MDsKKyAgICAgIGlmKGN0b2stPnR5cGU9PUNPTU1BKXsKKwljb3B5X3Rva2VuKCZtdG9rLGN0b2spOworCW5leHRfdG9rZW4oKTtraWxsc3AoKTsKKwlpZihjdG9rLT50eXBlPT1ET1QpCisJICBkZXNpX2ZvbGxvd3M9MTsKKwllbHNlCisJICBwdXNoX3Rva2VuKCZtdG9rKTsKKyAgICAgIH0KKyAgICB9CisgIH1lbHNleworICAgIGludCBvbGRjb25zdD1jb25zdF9leHByOworICAgIHRyZWUyPXRyZWU9YXNzaWdubWVudF9leHByZXNzaW9uKCk7CisKKyAgICBpZighdHJlZSl7ZXJyb3IoNDUpO3JldHVybigwKTt9CisgICAgaWYoIW5vY29uc3QpIGNvbnN0X2V4cHI9MTsKKyAgICBpZighdHlwZV9leHByZXNzaW9uKHRyZWUsdCkpe2ZyZWVfZXhwcmVzc2lvbih0cmVlKTsgY29uc3RfZXhwcj1vbGRjb25zdDtyZXR1cm4gMDt9CisgICAgY29uc3RfZXhwcj1vbGRjb25zdDsKKworICAgIHRyZWU9bWFrZXBvaW50ZXIodHJlZSk7CisKKyAgICAvKiBjaGVjayBmb3IgY29tcGxldGUgYXNzaWdubWVudCBpbiBkeW5hbWljIGluaXRpYWxpemF0aW9uICovCisgICAgaWYobm9jb25zdCYmKElTU1RSVUNUKHRyZWUtPm50eXAtPmZsYWdzKXx8SVNVTklPTih0cmVlLT5udHlwLT5mbGFncykpJiZmc3RydWN0PT10cmVlLT5udHlwLT5leGFjdCl7CisgICAgICBmaXJzdD1teW1hbGxvYyhDTFMpOworICAgICAgZmlyc3QtPnRyZWU9dHJlZTsKKyAgICAgIGZpcnN0LT5uZXh0PWZpcnN0LT5vdGhlcj0wOworICAgICAgZmlyc3QtPmlkeD1sMnptKC0yTCk7CisgICAgICByZXR1cm4gZmlyc3Q7CisgICAgfQorCisgICAgaWYoIXRlc3RfYXNzaWdubWVudCh0LHRyZWUpKXtmcmVlX2V4cHJlc3Npb24odHJlZSk7IHJldHVybiAwO30KKyAgICBpZighbm9jb25zdCl7CisgICAgICAvKiAgbnVyIEtvbnN0YW50ZW4gZXJsYXVidCAoYmVpIEFycmF5cy9TdHJ1a3R1cmVuIGV0Yy4gb2RlciBzdGF0aWMpICovCisgICAgICBpZih0cmVlLT5mbGFncyE9Q0VYUFIpeworICAgICAgICAvKndoaWxlKHRyZWUtPmZsYWdzPT1DQVNUKSB0cmVlPXRyZWUtPmxlZnQ7Ki8KKyAgICAgICAgaWYoIXRyZWUtPnNpZGVmeC8qdHJlZS0+ZmxhZ3M9PUFERFJFU1N8fHRyZWUtPmZsYWdzPT1BRERSRVNTU3x8dHJlZS0+ZmxhZ3M9PUFERFJFU1NBKi8peworICAgICAgICAgIGNvbnN0X2V4cHI9MTsKKyAgICAgICAgICBnZW5fSUModHJlZSwwLDApOworICAgICAgICAgIGNvbnN0X2V4cHI9b2xkY29uc3Q7CisgICAgICAgICAgaWYoISh0cmVlLT5vLmZsYWdzJlZBUkFEUikpeworICAgICAgICAgICAgLyogIGhpZXIgZmVobGVuIG5vY2ggdmllbGUgUHJ1ZWZ1bmdlbiAgICovCisgICAgICAgICAgICBmcmVlX2V4cHJlc3Npb24odHJlZSk7ZXJyb3IoNDYpOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgIH0KKyAgICAgICAgICB0cmVlLT5vLnYtPmZsYWdzfD1VU0VEQVNBRFI7CisgICAgICAgICAgZmlyc3Q9bXltYWxsb2MoQ0xTKTsKKyAgICAgICAgICBmaXJzdC0+bmV4dD1maXJzdC0+b3RoZXI9MDsKKyAgICAgICAgICBmaXJzdC0+dHJlZT10cmVlOworCSAgZmlyc3QtPmlkeD1sMnptKDBMKTsKKyAgICAgICAgICBraWxsc3AoKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgZnJlZV9leHByZXNzaW9uKHRyZWUpO2Vycm9yKDQ2KTsKKyAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyAgICAgIH1lbHNleworICAgICAgICBmaXJzdD1teW1hbGxvYyhDTFMpOworCWZpcnN0LT5pZHg9bDJ6bSgwTCk7CisgICAgICAgIGZpcnN0LT5uZXh0PWZpcnN0LT5vdGhlcj0wOworICAgICAgICBmaXJzdC0+dHJlZT0wOworICAgICAgICBldmFsX2NvbnN0bih0cmVlKTsKKyAgICAgICAgdHJlZS0+bnR5cC0+ZmxhZ3M9dC0+ZmxhZ3M7CisgICAgICAgIGluc2VydF9jb25zdG4odHJlZSk7CisgICAgICAgIGZpcnN0LT52YWw9dHJlZS0+dmFsOworICAgICAgICBmcmVlX2V4cHJlc3Npb24odHJlZTIpOworICAgICAgICBraWxsc3AoKTsKKyAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgIC8qICBhdWNoIGFuZGVyZXMgZXJsYXVidCAgICAqLworICAgICAgZmlyc3Q9bXltYWxsb2MoQ0xTKTsKKyAgICAgIGZpcnN0LT5uZXh0PWZpcnN0LT5vdGhlcj0wOworICAgICAgZmlyc3QtPnRyZWU9dHJlZTsKKyAgICAgIGtpbGxzcCgpOworICAgICAgaWYoIXRyZWUtPnNpZGVmeCl7CisJaWYodHJlZS0+ZmxhZ3M9PUNFWFBSKXsKKwkgIGV2YWxfY29uc3RuKHRyZWUpOworCSAgdHJlZS0+bnR5cC0+ZmxhZ3M9dC0+ZmxhZ3M7CisJICBpbnNlcnRfY29uc3RuKHRyZWUpOworCSAgZmlyc3QtPnZhbD10cmVlLT52YWw7CisJICBmaXJzdC0+dHJlZT0wOworCSAgZmlyc3QtPmlkeD1sMnptKDBMKTsKKwkgIGluaXRfY29uc3Rfc3o9em1hZGQoaW5pdF9jb25zdF9zeixzem9mKHRyZWUtPm50eXApKTsKKwkgIGluaXRfY29uc3RfY250Kys7CisJICBmcmVlX2V4cHJlc3Npb24odHJlZTIpOworCX1lbHNleworCSAgZmlyc3QtPmlkeD1sMnptKC0xTCk7CisJICBpbml0X2R5bl9zej16bWFkZChpbml0X2R5bl9zeixzem9mKHRyZWUtPm50eXApKTsKKwkgIGluaXRfZHluX2NudCsrOworCX0KKyAgICAgIH1lbHNleworCWZpcnN0LT5pZHg9bDJ6bSgtMUwpOworCWluaXRfZHluX3N6PXptYWRkKGluaXRfZHluX3N6LHN6b2YodHJlZS0+bnR5cCkpOworCWluaXRfZHluX2NudCsrOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihicmFja2V0KXsKKyAgICBpZihjdG9rLT50eXBlPT1DT01NQSl7bmV4dF90b2tlbigpO2tpbGxzcCgpO30KKyAgICBpZihjdG9rLT50eXBlPT1SQlJBKXtuZXh0X3Rva2VuKCk7a2lsbHNwKCk7fSBlbHNlIGVycm9yKDEyOCk7CisgIH0KKyAgcmV0dXJuKGZpcnN0KTsKK30KKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZG9jL2Vycm9ycy50ZXhpIGIvZG9jL2Vycm9ycy50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OGIzOWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXJyb3JzLnRleGkKQEAgLTAsMCArMSwxMzk5IEBACisgIEBpdGVtICJkZWNsYXJhdGlvbiBleHBlY3RlZCIgKEZhdGFsLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgU29tZXRoaW5nIGlzIHByZXR0eSB3cm9uZyB3aXRoIHRoZSBzb3VyY2UuCisKKworICBAaXRlbSAib25seSBvbmUgaW5wdXQgZmlsZSBhbGxvd2VkIiAoRmF0YWwpCisKKyAgICAgICAgdmJjYyBhY2NlcHRzIG9ubHkgYSBzaW5nbGUgZmlsZW5hbWUgdG8gY29tcGlsZS4gWW91IGNhbiB1c2UgYQorICAgICAgICBmcm9udGVuZCB0byBjb21waWxlIG11bHRpcGxlIGZpbGVzIG9yIHBlcmhhcHMgeW91IG1pc3R5cGVkIGFuCisgICAgICAgIG9wdGlvbi4KKworCisgIEBpdGVtICJGbGFnIDwlcz4gc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlIiAoKQorCisgICAgICAgIFlvdSBzcGVjaWZpZWQgYSBjb21tYW5kIGxpbmUgb3B0aW9uIHRoYXQgc2hvdWxkIGJlIHNwZWNpZmllZCBvbmx5CisgICAgICAgIG9uY2UgbW9yZSB0aGFuIG9uY2UuIE1heWJlIHlvdSBoYXZlIHRoaXMgb3B0aW9uIGluIHlvdXIgY29uZmlnLWZpbGUKKyAgICAgICAgYW5kIHVzZWQgaXQgaW4gdGhlIGNvbW1hbmQgbGluZSwgdG9vPworICAgICAgICBUaGUgZmlyc3Qgb2NjdXJyZW5jZSB3aWxsIG92ZXJyaWRlIHRoZSBsYXR0ZXIgb25lcy4KKworCisgIEBpdGVtICJGbGFnIDwlcz4gbmVlZHMgc3RyaW5nIiAoRmF0YWwpCisKKyAgICAgICAgVGhpcyBvcHRpb24gaGFzdCB0byBiZSBzcGVjaWZpZWQgd2l0aCBhIHN0cmluZyBwYXJhbWV0ZXIsIGUuZy4KKyAgICAgICAgLWZsYWc9Zm9vYmFyCisKKworICBAaXRlbSAiRmxhZyA8JXM+IG5lZWRzIHZhbHVlIiAoRmF0YWwpCisKKyAgICAgICAgVGhpcyBvcHRpb24gaGFzdCB0byBiZSBzcGVjaWZpZWQgd2l0aCBhbiBpbnRlZ2VyIHBhcmFtZXRlciwgZS5nLgorICAgICAgICAtZmxhZz0xMjM0CisKKworICBAaXRlbSAiVW5rbm93biBGbGFnIDwlcz4iIChGYXRhbCkKKworICAgICAgICBUaGlzIG9wdGlvbiBpcyBub3QgcmVjb2duaXplZCBieSB2YmNjLiBQZXJoYXBzIHlvdSBtaXN0eXBlZCBpdCwgdXNlZAorICAgICAgICB0aGUgd3JvbmcgY2FzZSBvciBzcGVjaWZpZWQgYW4gb3B0aW9uIG9mIHRoZSBmcm9udGVuZCB0byB2YmNjPworCisKKyAgQGl0ZW0gIk5vIGlucHV0IGZpbGUiIChGYXRhbCkKKworICAgICAgICBZb3UgZGlkIG5vdCBzcGVjaWZ5IGFuIGlucHV0IGZpbGUuIFlvdXIgc291cmNlIGZpbGUgc2hvdWxkIG5vdCBzdGFydAorICAgICAgICB3aXRoIGEgJy0nIGFuZCBpZiB5b3UgdXNlIGEgZnJvbnRlbmQgbWFrZSBzdXJlIGl0IGhhcyB0aGUgcHJvcGVyCisgICAgICAgIHN1ZmZpeC4KKworCisgIEBpdGVtICJDb3VsZCBub3Qgb3BlbiA8JXM+IGZvciBpbnB1dCIgKEZhdGFsKQorCisgICAgICAgIEEgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkLgorCisKKyAgQGl0ZW0gIm5lZWQgYSBzdHJ1Y3Qgb3IgdW5pb24gdG8gZ2V0IGEgbWVtYmVyIiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgIFRoZSBzb3VyY2UgY29udGFpbnMgc29tZXRoaW5nIGxpa2UgYS5iIHdoZXJlIGEgaXMgbm90IGEgc3RydWN0dXJlCisgICAgICAgIG9yIHVuaW9uLgorCisKKyAgQGl0ZW0gInRvbyBtYW55ICglZCkgbmVzdGVkIGJsb2NrcyIgKEZhdGFsLCBFcnJvcikKKworICAgICAgICB2YmNjIG9ubHkgYWxsb3dzIGEgbWF4aW11bSBudW1iZXIgb2YgbmVzdGVkIGJsb2NrcworICAgICAgICAoY29tcHVuZC1zdGF0ZW1lbnRzKS4gWW91IGNhbiBpbmNyZWFzZSB0aGlzIG51bWJlciBieSBjaGFuZ2luZworICAgICAgICB0aGUgbGluZSAjZGVmaW5lIE1BWE4gPHNvbWV0aGluZz4gaW4gdmJjLmggYW5kIHJlY29tcGlsaW5nIHZiY2MuCisKKworIEBpdGVtICJsZWZ0IGJsb2NrIDAiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgVGhpcyBlcnJvciBzaG91bGQgbm90IG9jY3VyLgorCisKKyBAaXRlbSAiaW5jb21wbGV0ZSBzdHJ1Y3QgPCVzPiIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBZb3UgdHJpZWQgdG8gZ2V0IGEgbWVtYmVyIG9mIGFuIGluY29tcGxldGUgc3RydWN0dXJlL3VuaW9uLgorICAgICAgICBZb3UgZGVmaW5lZCBzdHJ1Y3QgeCB5OyBzb21ld2hlcmUgd2l0aG91dCBkZWZpbmluZyBzdHJ1Y3QgeEB7Li4uQH0uCisKKworIEBpdGVtICJvdXQgb2YgbWVtb3J5IiAoRmF0YWwsIEVycm9yKQorCisgICAgICAgIEd1ZXNzIHdoYXQuCisKKworIEBpdGVtICJyZWRlY2xhcmF0aW9uIG9mIHN0cnVjdCA8JXM+IiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgIFlvdSBtYXkgbm90IHJlZGVjbGFyZSBhIHN0cnVjdC91bmlvbiBpbiB0aGUgc2FtZSBibG9jay4KKworCisgQGl0ZW0gImluY29tcGxldGUgdHlwZSAoJXMpIGluIHN0cnVjdCIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBFdmVyeSBtZW1iZXIgaW4gYSBzdHJ1Y3QvdW5pb24gZGVjbGFyYXRpb24gbXVzdCBiZSBjb21wbGV0ZS4KKyAgICAgICAgUGVyaGFwcyB5b3Ugb25seSB3YW50ZWQgYSBwb2ludGVyIHRvIHRoYXQgdHlwZSBhbmQgZm9yZ290IHRoZSAnKic/CisKKworIEBpdGVtICJmdW5jdGlvbiAoJXMpIGluIHN0cnVjdC91bmlvbiIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBGdW5jdGlvbnMgY2Fubm90IGJlIG1lbWJlcnMgb2Ygc3RydWN0cy91bmlvbnMuCisKKworIEBpdGVtICJyZWRlY2xhcmF0aW9uIG9mIHN0cnVjdC91bmlvbiBtZW1iZXIgPCVzPiIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBUd28gbWVtYmVycyBvZiBhIHN0cnVjdC91bmlvbiBoYXZlIHRoZSBzYW1lIG5hbWUuCisKKworIEBpdGVtICJyZWRlY2xhcmF0aW9uIG9mIDwlcz4iIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgWW91IHVzZWQgYSBuYW1lIGFscmVhZHkgaW4gdXNlIGluIGFuIGVudW1lcmF0aW9uLgorCisKKyBAaXRlbSAiaW52YWxpZCBjb25zdGFudCBleHByZXNzaW9uIiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgID8/PyBOb3doZXJlIHRvIGZpbmQuLi4KKworCisgQGl0ZW0gImFycmF5IGRpbWVuc2lvbiBtdXN0IGJlIGNvbnN0YW50IGludGVnZXIiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgVGhlIGRpbWVuc2lvbnMgb2YgYW4gYXJyYXkgbXVzdCBiZSBjb25zdGFudHMgKHJlYWwgY29uc3RhbnRzLAorICAgICAgICBjb25zdCBpbnQgeD0xMDA7IGludCB5W3hdOyBpcyBub3QgYWxsb3dlZCkgYW5kIGludGVnZXJzCisgICAgICAgIChpbnQgeVsxMDAuMF07IGlzIG5vdCBhbGxvd2VkIGVpdGhlcikuCisKKworIEBpdGVtICJubyBkZWNsYXJhdG9yIGFuZCBubyBpZGVudGlmaWVyIGluIHByb3RvdHlwZSIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworCisKKyBAaXRlbSAiaW52YWxpZCBzdG9yYWdlLWNsYXNzIGluIHByb3RvdHlwZSIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBGdW5jdGlvbiBwYXJhbWV0ZXJzIG1heSBvbmx5IGJlIGF1dG8gb3IgcmVnaXN0ZXIuCisKKworIEBpdGVtICJ2b2lkIG5vdCB0aGUgb25seSBmdW5jdGlvbiBhcmd1bWVudCIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBZb3UgdHJpZWQgdG8gZGVjbGFyZSBhIGZ1bmN0aW9uIHRoYXQgaGFzIGFuIGFyZ3VtZW50IG9mIHR5cGUgdm9pZAorICAgICAgICBhcyB3ZWxsIGFzIG90aGVyIGFyZ3VtZW50cy4KKworCisgQGl0ZW0gIjwlcz4gbm8gbWVtYmVyIG9mIHN0cnVjdC91bmlvbiIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBUaGUgc3RydWN0L3VuaW9uIGRvZXMgbm90IGNvbnRhaW4gYSBtZW1iZXIgY2FsbGVkIGxpa2UgdGhhdC4KKworCisgQGl0ZW0gImluY3JlbWVudC9kZWNyZW1lbnQgaXMgb25seSBhbGxvd2VkIGZvciBhaXRobWV0aWMgYW5kIHBvaW50ZXIgdHlwZXMiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKworCisgQGl0ZW0gImZ1bmN0aW9ucyBtYXkgbm90IHJldHVybiBhcnJheXMgb3IgZnVuY3Rpb25zIiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisKKworIEBpdGVtICJvbmx5IHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkIiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgIFlvdSB0cmllZCB0byBjYWxsIHNvbWV0aGluZyB0aGF0IGRpZCBub3QgZGVjYXkgaW50byBhIHBvaW50ZXIgdG8KKyAgICAgICAgYSBmdW5jdGlvbi4KKworCisgQGl0ZW0gInJlZGVmaW5pdGlvbiBvZiB2YXIgPCVzPiIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworCisKKyBAaXRlbSAicmVkZWNsYXJhdGlvbiBvZiB2YXIgPCVzPiB3aXRoIG5ldyBzdG9yYWdlLWNsYXNzIiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisKKworIEBpdGVtICJmaXJzdCBvcGVyYW5kIG9mIGNvbmRpdGlvbmFsLWV4cHJlc3Npb24gbXVzdCBiZSBhcml0aG1ldGljIG9yIHBvaW50ZXIgdHlwZSIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworCisKKyBAaXRlbSAibXVsdGlwbGUgZGVmaW5pdGlvbnMgb2YgdmFyIDwlcz4iIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgVGhlcmUgaGF2ZSBiZWVuIG11bHRpcGxlIGRlZmluaXRpb25zIG9mIGEgZ2xvYmFsIHZhcmlhYmxlIHdpdGgKKyAgICAgICAgaW5pdGlhbGl6YXRpb24uCisKKworIEBpdGVtICJvcGVyYW5kcyBvZiA6IGRvIG5vdCBtYXRjaCIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBJbiBhbiBleHByZXNzaW9uIG9mIHRoZSBmb3JtIGEgPyBiIDogYworICAgICAgICAtIGEgYW5kIGIgbXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgb3IKKyAgICAgICAgLSBhIGFuZCBiIGJvdGggbXVzdCBoYXZlIGFyaXRobWV0aWMgdHlwZXMgb3IKKyAgICAgICAgLSBvbmUgb2YgdGhlbSBtdXN0IGJlIGEgcG9pbnRlciBhbmQgdGhlIG90aGVyIG11c3QgYmUgdm9pZCAqIG9yIDAKKworCisgQGl0ZW0gImZ1bmN0aW9uIGRlZmluaXRpb24gaW4gaW5uZXIgYmxvY2siIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgQyBkb2VzIG5vdCBhbGxvdyBuZXN0ZWQgZnVuY3Rpb25zLgorCisKKyBAaXRlbSAicmVkZWZpbml0aW9uIG9mIGZ1bmN0aW9uIDwlcz4iIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgRGVmaW5pbmcgdHdvIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gb25lIHRyYW5zbGF0aW9uLXVuaXQKKyAgICAgICAgaXMgbm8gZ29vZCBpZGVhLgorCisKKyBAaXRlbSAiaW52YWxpZCBzdG9yYWdlLWNsYXNzIGZvciBmdW5jdGlvbiIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBGdW5jdGlvbnMgbXVzdCBub3QgaGF2ZSBzdG9yYWdlLWNsYXNzZXMgcmVnaXN0ZXIgb3IgYXV0by4KKworCisgQGl0ZW0gImRlY2xhcmF0aW9uLXNwZWNpZmllcnMgZXhwZWN0ZWQiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKworCisgQGl0ZW0gImRlY2xhcmF0b3IgZXhwZWN0ZWQiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKworCisgQGl0ZW0gIjwlcz4gaXMgbm8gcGFyYW1ldGVyIiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgIEluIGFuIG9sZC1zdHlsZSBmdW5jdGlvbiBkZWZpbml0aW9uIHlvdSB0cmllZCB0byBkZWNsYXJlIGEgbmFtZSBhcworICAgICAgICBwYXJhbWV0ZXIgd2hpY2ggd2FzIG5vdCBpbiB0aGUgaWRlbnRpZmllci1saXN0LgorCisKKyBAaXRlbSAiYXNzaWdubWVudCBvZiBkaWZmZXJlbnQgc3RydWN0cy91bmlvbnMiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKworCisgQGl0ZW0gImludmFsaWQgdHlwZXMgZm9yIGFzc2lnbm1lbnQiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgSW4gYW4gYXNzaWdubWVudC1jb250ZXh0ICh0aGlzIGluY2x1ZGVzIHBhc3NpbmcgYXJndW1lbnRzIHRvCisgICAgICAgIHByb3RvdHlwZWQgZnVuY3Rpb25zKSB0aGUgc291cmNlIGFuZCB0YXJnZXQgbXVzdCBiZSBvbmUgb2YgdGhlCisgICAgICAgIGZvbGxvd2luZyB0eXBlczoKKworICAgICAgICAtIGJvdGggYXJlIGFyaXRobWV0aWMgdHlwZXMKKyAgICAgICAgLSBib3RoIGFyZSB0aGUgc2FtZSBzdHJ1Y3QvdW5pb24KKyAgICAgICAgLSBvbmUgb2YgdGhlbSBpcyBhIHBvaW50ZXIgdG8gdm9pZCBhbmQgdGhlIG90aGVyIG9uZSBpcyBhbnkgcG9pbnRlcgorICAgICAgICAtIHRoZSB0YXJnZXQgaXMgYW55IHBvaW50ZXIgYW5kIHRoZSBzb3VyY2UgaXMgYW4gaW50ZWdyYWwKKyAgICAgICAgICBjb25zdGFudC1leHByZXNzaW9uIHdpdGggdGhlIHZhbHVlIDAKKyAgICAgICAgLSBib3RoIGFyZSBwb2ludGVyIHRvIHRoZSBzYW1lIHR5cGUgKGhlcmUgdGhlIHRhcmdldCBtYXkgaGF2ZQorICAgICAgICAgIGFkZGl0aW9uYWwgY29uc3Qvdm9sYXRpbGUgcXVhbGlmaWVycyAtIG5vdCByZWN1cnNpdmVseSwgaG93ZXZlcikKKworICAgICAgICBBbnkgb3RoZXIgY29tYmluYXRpb25zIHNob3VsZCBiZSBpbGxlZ2FsLgorCisKKyBAaXRlbSAib25seSAwIGNhbiBiZSBjb21wYXJlZCBhZ2FpbnN0IHBvaW50ZXIiIChXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBZb3UgbWF5IG5vdCBjb21wYXJlIGEgcG9pbnRlciBhZ2FpbnN0IGFueSBvdGhlciBjb25zdGFudCBidXQgYQorICAgICAgICAwIChudWxsIHBvaW50ZXIpLgorCisKKyBAaXRlbSAicG9pbnRlcnMgZG8gbm90IHBvaW50IHRvIHRoZSBzYW1lIHR5cGUiIChXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBZb3UgdHJpZWQgdG8gY29tcGFyZSBvciBhc3NpZ24gcG9pbnRlcnMgdGhhdCBwb2ludCB0byBkaWZmZXJlbnQKKyAgICAgICAgdHlwZXMuIEUuZy4gdGhlIHR5cGVzIHRoZXkgcG9pbnQgdG8gbWF5IGhhdmUgZGlmZmVyZW50IGF0dHJpYnV0ZXMuCisKKworIEBpdGVtICJmdW5jdGlvbiBpbml0aWFsaXplZCIgKEVycm9yLCBGYXRhbCwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgVGhlcmUgd2FzIGEgJz0nIGFmdGVyIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24uCisKKworIEBpdGVtICJpbml0aWFsaXphdGlvbiBvZiBpbmNvbXBsZXRlIHN0cnVjdCIgKEVycm9yLCBGYXRhbCwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgQSBzdHJ1Y3R1cmUgaXMgaW5jb21wbGV0ZSBpZiB0aGUgb25seSBpdHMgbmFtZSwgYnV0IG5vdCB0aGUKKyAgICAgICAgY29udGVudCBpcyBrbm93bi4gWW91IGNhbm5vdCBkbyBtdWNoIHdpdGggc3VjaCBzdHJ1Y3R1cmVzLgorCisKKyBAaXRlbSAiaW5pdGlhbGl6YXRpb24gb2YgaW5jb21wbGV0ZSB1bmlvbiIgKEVycm9yLCBGYXRhbCwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgQSB1bmlvbiBpcyBpbmNvbXBsZXRlIGlmIHRoZSBvbmx5IGl0cyBuYW1lLCBidXQgbm90IHRoZQorICAgICAgICBjb250ZW50IGlzIGtub3duLiBZb3UgY2Fubm90IGRvIG11Y2ggd2l0aCBzdWNoIHVuaW9ucy4KKworCisgQGl0ZW0gImVtcHR5IGluaXRpYWxpemF0aW9uIiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgIFRoZXJlIHdhcyBubyB2YWxpZCBleHByZXNzaW9uIGFmdGVyIHRoZSAnPScgaW4gYSB2YXJpYWJsZSBkZWZpbml0aW9uLgorCisKKyBAaXRlbSAiaW5pdGlhbGl6ZXIgbm90IGEgY29uc3RhbnQiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgU3RhdGljIHZhcmlhYmxlcyBhbmQgY29tcG91bmQgdHlwZXMgbWF5IG9ubHkgYmUgaW5pdGlhbGl6ZWQgd2l0aAorICAgICAgICBjb25zdGFudHMuCisgICAgICAgIFZhcmlhYmxlcyB3aXRoIGNvbnN0IHF1YWxpZmllciBhcmUgbm8gdmFsaWQgY29uc3RhbnQtZXhwcmVzc2lvbnMKKyAgICAgICAgaGVyZS4KKworICAgICAgICBBZGRyZXNzZXMgb2Ygc3RhdGljIHZhcmlhYmxlcyBhcmUgb2ssIGJ1dCBjYXN0aW5nIHRoZW0gbWF5IHR1cm4KKyAgICAgICAgdGhlbSBpbnRvIG5vbi1jb25zdGFudC1leHByZXNzaW9ucy4KKworCisgQGl0ZW0gImRvdWJsZSB0eXBlLXNwZWNpZmllciIgKFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCisKKworIEBpdGVtICJpbGxlZ2FsIHR5cGUtc3BlY2lmaWVyIiAoV2FybmluZywgQU5TSS12aW9sYXRpb24pCisKKworCisgQGl0ZW0gIm11bHRpcGxlIHN0b3JhZ2UtY2xhc3NlcyIgKFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCisKKworIEBpdGVtICJzdG9yYWdlLWNsYXNzIHNwZWNpZmllciBzaG91bGQgYmUgZmlyc3QiIChXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworCisKKyBAaXRlbSAiYml0ZmllbGRzIG11c3QgYmUgaW50cyIgKFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCisKKworIEBpdGVtICJiaXRmaWVsZCB3aWR0aCBtdXN0IGJlIGNvbnN0YW50IGludGVnZXIiIChXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworCisKKyBAaXRlbSAic3RydWN0L3VuaW9uIG1lbWJlciBuZWVkcyBpZGVudGlmaWVyIiAoV2FybmluZywgQU5TSS12aW9sYXRpb24pCisKKworCisgQGl0ZW0gIjsgZXhwZWN0ZWQiIChXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBQcm9iYWJseSB5b3UgZm9yZ290IGEgJzsnIG9yIHRoZXJlIGlzIGEgc3ludGFjdGljIGVycm9yIGluIGFuCisgICAgICAgIGV4cHJlc3Npb24uCisKKworIEBpdGVtICJzdHJ1Y3QvdW5pb24gaGFzIG5vIG1lbWJlcnMiIChXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBZb3UgZGVmaW5lZCBhbiBlbXB0eSBzdHJ1Y3Qgb3IgdW5pb24uCisKKworIEBpdGVtICJAfSBleHBlY3RlZCIgKFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCisKKworIEBpdGVtICIsIGV4cGVjdGVkIiAoV2FybmluZywgQU5TSS12aW9sYXRpb24pCisKKworCisgQGl0ZW0gImludmFsaWQgdW5zaWduZWQiIChXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworCisKKyBAaXRlbSAiKSBleHBlY3RlZCIgKFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCisKKworIEBpdGVtICJhcnJheSBkaW1lbnNpb24gaGFzIHNpZGVmeCAod2lsbCBiZSBpZ25vcmVkKSIgKFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCisKKworIEBpdGVtICJhcnJheSBvZiBzaXplIDAgKHNldCB0byAxKSIgKFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgIEFOU0kgQyBkb2VzIG5vdCBhbGxvdyBhcnJheXMgb3IgYW55IG9iamVjdHMgdG8gaGF2ZSBhIHNpemUgb2YgMC4KKworCisgQGl0ZW0gIl0gZXhwZWN0ZWQiIChXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworCisKKyBAaXRlbSAibWl4ZWQgaWRlbnRpZmllci0gYW5kIHBhcmFtZXRlci10eXBlLWxpc3QiIChXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworCisKKyBAaXRlbSAidmFyIDwlcz4gd2FzIG5ldmVyIGFzc2lnbmVkIGEgdmFsdWUiIChXYXJuaW5nKQorCisKKworIEBpdGVtICJ2YXIgPCVzPiB3YXMgbmV2ZXIgdXNlZCIgKFdhcm5pbmcpCisKKworCisgQGl0ZW0gImludmFsaWQgc3RvcmFnZS1jbGFzcyIgKFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCisKKworIEBpdGVtICJ0eXBlIGRlZmF1bHRzIHRvIGludCIgKFdhcm5pbmcpCisKKworCisgQGl0ZW0gInJlZGVjbGFyYXRpb24gb2YgdmFyIDwlcz4gd2l0aCBuZXcgdHlwZSIgKFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCisKKworIEBpdGVtICJyZWRlY2xhcmF0aW9uIG9mIHBhcmFtZXRlciA8JXM+IiAoV2FybmluZywgQU5TSS12aW9sYXRpb24pCisKKworCisgQGl0ZW0gIjogZXhwZWN0ZWQiIChXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworCisKKyBAaXRlbSAiaWxsZWdhbCBlc2NhcGUtc2VxdWVuY2UgaW4gc3RyaW5nIiAoV2FybmluZywgQU5TSS12aW9sYXRpb24pCisKKworCisgQGl0ZW0gImNoYXJhY3RlciBjb25zdGFudCBjb250YWlucyBtdWx0aXBsZSBjaGFycyIgKFdhcm5pbmcpCisKKworCisgQGl0ZW0gImNvdWxkIG5vdCBldmFsdWF0ZSBzaXplb2YtZXhwcmVzc2lvbiIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworCisKKyBAaXRlbSAiIiBleHBlY3RlZCAodW50ZXJtaW5hdGVkIHN0cmluZykiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKworCisgQGl0ZW0gInNvbWV0aGluZyB3cm9uZyB3aXRoIG51bWVyaWMgY29uc3RhbnQiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKworCisgQGl0ZW0gImlkZW50aWZpZXIgZXhwZWN0ZWQiIChGYXRhbCwgRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisKKworIEBpdGVtICJkZWZpbml0aW9uIGRvZXMgbm90IG1hdGNoIHByZXZpb3VzIGRlY2xhcmF0aW9uIiAoV2FybmluZywgQU5TSS12aW9sYXRpb24pCisKKworCisgQGl0ZW0gImludGVnZXIgYWRkZWQgdG8gaWxsZWdhbCBwb2ludGVyIiAoV2FybmluZywgQU5TSS12aW9sYXRpb24pCisKKworCisgQGl0ZW0gIm9mZnNldCBlcXVhbHMgc2l6ZSBvZiBvYmplY3QiIChXYXJuaW5nKQorCisKKworIEBpdGVtICJvZmZzZXQgb3V0IG9mIG9iamVjdCIgKFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCisKKworIEBpdGVtICJvbmx5IDAgc2hvdWxkIGJlIGNhc3QgdG8gcG9pbnRlciIgKFdhcm5pbmcpCisKKworCisgQGl0ZW0gInVua25vd24gaWRlbnRpZmllciA8JXM+IiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisKKworIEBpdGVtICJ0b28gZmV3IGZ1bmN0aW9uIGFyZ3VtZW50cyIgKFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCisKKworIEBpdGVtICJkaXZpc2lvbiBieSB6ZXJvIChyZXN1bHQgc2V0IHRvIDApIiAoV2FybmluZywgQU5TSS12aW9sYXRpb24pCisKKworCisgQGl0ZW0gImFzc2lnbm1lbnQgb2YgZGlmZmVyZW50IHBvaW50ZXJzIiAoV2FybmluZywgQU5TSS12aW9sYXRpb24pCisKKworCisgQGl0ZW0gImx2YWx1ZSByZXF1aXJlZCBmb3IgYXNzaWdubWVudCIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworCisKKyBAaXRlbSAiYXNzaWdubWVudCB0byBjb25zdGFudCB0eXBlIiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisKKworIEBpdGVtICJhc3NpZ25tZW50IHRvIGluY29tcGxldGUgdHlwZSIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworCisKKyBAaXRlbSAib3BlcmFuZHMgZm9yIHx8IGFuZCAmJiBoYXZlIHRvIGJlIGFyaXRobWV0aWMgb3IgcG9pbnRlciIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworCisKKyBAaXRlbSAiYml0d2lzZSBvcGVyYXRpb25zIG5lZWQgaW50ZWdlciBvcGVyYW5kcyIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworCisKKyBAaXRlbSAiYXNzaWdubWVudCBkaXNjYXJkcyBjb25zdCIgKFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgIFlvdSBhc3NpZ25lZCBzb21ldGhpbmcgbGlrZSAoY29uc3QgdHlwZSAqKSB0byAodHlwZSAqKS4KKworCisgQGl0ZW0gInJlbGF0aW9uYWwgZXhwcmVzc2lvbiBuZWVkcyBhcml0aG1ldGljIG9yIHBvaW50ZXIgdHlwZSIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworCisKKyBAaXRlbSAiYm90aCBvcGVyYW5kcyBvZiBjb21wYXJpc29uIG11c3QgYmUgcG9pbnRlcnMiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgWW91IHdyb3RlIGFuIGV4cHJlc3Npb24gbGlrZSBhID09IGIgd2hlcmUgb25lIG9wZXJhbmQgd2FzIGEgcG9pbnRlcgorICAgICAgICB3aGlsZSB0aGUgb3RoZXIgd2FzIG5vdC4gUGVyaGFwcyBhIGZ1bmN0aW9uIGlzIG5vdCBkZWNsYXJlZCBjb3JyZWN0bHkKKyAgICAgICAgb3IgeW91IHVzZWQgTlVMTCBpbnN0ZWFkIG9mIDA/CisKKworIEBpdGVtICJvcGVyYW5kIG5lZWRzIGFyaXRobWV0aWMgdHlwZSIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworCisKKyBAaXRlbSAicG9pbnRlciBhcml0aG1ldGljIHdpdGggdm9pZCAqIGlzIG5vdCBwb3NzaWJsZSIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBBZGRpbmcvc3VidHJhY3RpbmcgZnJvbSBhIHBvaW50ZXIgdG8gdm9pZCBpcyBub3QgcG9zc2libGUuCisKKworIEBpdGVtICJwb2ludGVycyBjYW4gb25seSBiZSBzdWJ0cmFjdGVkIiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgIFlvdSBjYW5ub3QgYWRkLCBtdWx0aXBseSBldGMuIHR3byBwb2ludGVycy4KKworCisgQGl0ZW0gImludmFsaWQgdHlwZXMgZm9yIG9wZXJhdGlvbiA8JXM+IiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisKKworIEBpdGVtICJpbnZhbGlkIG9wZXJhbmQgdHlwZSIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworCisKKyBAaXRlbSAiaW50ZWdlci1wb2ludGVyIGlzIG5vdCBhbGxvd2VkIiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgIFlvdSBtYXkgbm90IHN1YnRyYWN0IGEgcG9pbnRlciBmcm9tIGFuIGludGVnZXIuCisgICAgICAgIEFkZGluZyBhbiBpbnRlZ2VyIG9yIHN1YnRyYWN0aW5nIGl0IGZyb20gYSBwb2ludGVyIGlzIG9rLgorCisKK0BpdGVtICJhc3NpZ25tZW50IGRpc2NhcmRzIHZvbGF0aWxlIiAoV2FybmluZywgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgWW91IGFzc2lnbmVkIHNvbWV0aGluZyBsaWtlICh2b2xhdGlsZSB0eXBlICopIHRvICh0eXBlICopLgorCisKK0BpdGVtICI8PCwgPj4gYW5kICUgbmVlZCBpbnRlZ2VyIG9wZXJhbmRzIiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisKKworQGl0ZW0gImNhc3RpbmcgZnJvbSB2b2lkIGlzIG5vdCBhbGxvd2VkIiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgIENhc3Rpbmcgc29tZXRoaW5nIG9mIHR5cGUgdm9pZCB0byBhbnl0aGluZyBtYWtlcyBubyBzZW5zZS4KKworCitAaXRlbSAiaW50ZWdlciB0b28gbGFyZ2UgdG8gZml0IGludG8gcG9pbnRlciIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBZb3UgdHJpZWQgdG8gYXNzaWduIGFuIGludGVnZXIgdG8gYSBwb2ludGVyIHRoYXQgaXMgdG9vIHNtYWxsIHRvCisgICAgICAgIGhvbGQgdGhlIGludGVnZXIuCisgICAgICAgIE5vdGUgdGhhdCBhc3NpZ25tZW50IG9mIHBvaW50ZXJzPC0+aW50ZWdlcnMgaXMgbmV2ZXIgcG9ydGFibGUuCisKKworQGl0ZW0gIm9ubHkgaW50ZWdlcnMgY2FuIGJlIGNhc3QgdG8gcG9pbnRlcnMiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKworCitAaXRlbSAiaW52YWxpZCBjYXN0IiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisKKworQGl0ZW0gInBvaW50ZXIgdG9vIGxhcmdlIHRvIGZpdCBpbnRvIGludGVnZXIiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgWW91IHRyaWVkIHRvIGFzc2lnbiBhIHBvaW50ZXIgdG8gYW4gaW50ZWdlciB0aGF0IGlzIHRvbyBzbWFsbCB0bworICAgICAgICBob2xkIHRoZSBwb2ludGVyLgorICAgICAgICBOb3RlIHRoYXQgYXNzaWdubWVudCBvZiBwb2ludGVyczwtPmludGVnZXJzIGlzIG5ldmVyIHBvcnRhYmxlLgorCisKK0BpdGVtICJ1bmFyeSBvcGVyYXRvciBuZWVkcyBhcml0aG1ldGljIHR5cGUiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKworCitAaXRlbSAibmVnYXRpb24gdHlwZSBtdXN0IGJlIGFyaXRobWV0aWMgb3IgcG9pbnRlciIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworCisKK0BpdGVtICJjb21wbGVtZW50IG9wZXJhdG9yIG5lZWRzIGludGVnZXIgdHlwZSIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworCisKK0BpdGVtICJwb2ludGVyIGFzc2lnbm1lbnQgd2l0aCBkaWZmZXJlbnQgcXVhbGlmaWVycyIgKFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgIFlvdSB0cmllZCB0byBhc3NpZ24gYSBwb2ludGVyIHRvIGEgcG9pbnRlciB0aGF0IHBvaW50cyB0byBhIHR5cGUKKyAgICAgICAgd2l0aCBkaWZmZXJlbnQgcXVhbGlmaWVycyAoZS5nLiBzaWduZWQ8LT51bnNpZ25lZCkuCisKKworQGl0ZW0gImRlcmVmZXJlbmNlZCBvYmplY3QgaXMgbm8gcG9pbnRlciIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworCisKK0BpdGVtICJkZXJlZmVyZW5jZWQgb2JqZWN0IGlzIGluY29tcGxldGUiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgWW91IHRyaWVkIHRvIGRlcmVmZXJlbmNlIGEgcG9pbnRlciB0byBhbiBpbmNvbXBsZXRlIG9iamVjdC4KKyAgICAgICAgRWl0aGVyIHlvdSBoYWQgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHVua25vd24gc2l6ZSBvciBhIHBvaW50ZXIKKyAgICAgICAgdG8gYSBzdHJ1Y3Qgb3IgdW5pb24gdGhhdCB3YXMgbm90ICh5ZXQpIGRlZmluZWQuCisKKworQGl0ZW0gIm9ubHkgMCBzaG91bGQgYmUgYXNzaWduZWQgdG8gcG9pbnRlciIgKFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgIFlvdSBtYXkgbm90IGFzc2lnbiBjb25zdGFudHMgb3RoZXIgdGhhbiBhIG51bGwgcG9pbnRlciB0byBhbnkKKyAgICAgICAgcG9pbnRlci4KKworCitAaXRlbSAidHlwZWRlZiA8JXM+IGlzIGluaXRpYWxpemVkIiAoV2FybmluZywgQU5TSS12aW9sYXRpb24pCisKKworCitAaXRlbSAibHZhbHVlIHJlcXVpcmVkIHRvIHRha2UgYWRkcmVzcyIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBZb3UgY2FuIG9ubHkgZ2V0IHRoZSBhZGRyZXNzIG9mIGFuIG9iamVjdCwgYnV0IG5vdCBvZiBleHByZXNzaW9ucworICAgICAgICBldGMuCisKKworQGl0ZW0gInVua25vd24gdmFyIDwlcz4iIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKworCitAaXRlbSAiYWRkcmVzcyBvZiByZWdpc3RlciB2YXJpYWJsZXMgbm90IGF2YWlsYWJsZSIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBJZiBhIHZhcmlhYmxlIGlzIGRlY2xhcmVkIGFzICdyZWdpc3RlcicgaXRzIGFkZHJlc3MgbWF5IG5vdCBiZQorICAgICAgICB0YWtlbiAobm8gbWF0dGVyIGlmIHRoZSB2YXJpYWJsZSBhY3R1YWxseSBnZXRzIGFzc2lnbmVkIHRvIGEKKyAgICAgICAgcmVnaXN0ZXIpLgorCisKK0BpdGVtICJ2YXIgPCVzPiBpbml0aWFsaXplZCBhZnRlciAnZXh0ZXJuJyIgKFdhcm5pbmcpCisKKworCitAaXRlbSAiY29uc3QgdmFyIDwlcz4gbm90IGluaXRpYWxpemVkIiAoV2FybmluZykKKworICAgICAgICBBIGNvbnN0YW50IHZhcmlhYmxlIHdhcyBub3QgaW5pdGlhbGl6ZWQgaW4gaXRzIGRlZmluaXRpb24uCisgICAgICAgIEFzIHRoZXJlIGlzIG5vIG90aGVyIGxlZ2FsIHdheSB0byBhc3NpZ24gYSB2YWx1ZSB0byBhIGNvbnN0YW50CisgICAgICAgIHZhcmlhYmxlIHRoaXMgaXMgcHJvYmFibGUgYW4gZXJyb3IuCisKKworQGl0ZW0gImZ1bmN0aW9uIGRlZmluaXRpb24gYWZ0ZXIgJ2V4dGVybiciIChXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworCisKK0BpdGVtICJyZXR1cm4gdHlwZSBvZiBtYWluIGlzIG5vdCBpbnQiIChXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBtYWluKCkgc2hvdWxkIGJlIGRlZmluZWQgYXMKKworICAgICAgICAgICAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCisgICAgICAgIEVzcGVjaWFsbHkgdGhlIHJldHVybiB0eXBlIG9mIG1haW4gbXVzdCBiZSAnaW50JyAtICd2b2lkJyBpcworICAgICAgICBub3QgYWxsb3dlZCBieSBBTlNJIEMuCisKKworQGl0ZW0gImludmFsaWQgc3RvcmFnZS1jbGFzcyBmb3IgZnVuY3Rpb24gcGFyYW1ldGVyIiAoV2FybmluZywgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgRnVuY3Rpb24gcGFyYW1ldGVycyBtYXkgb25seSBoYXZlICdhdXRvJyBvciAncmVnaXN0ZXInIGFzCisgICAgICAgIHN0b3JhZ2UtY2xhc3MuICdzdGF0aWMnIG9yICdleHRlcm4nIGFyZSBub3QgYWxsb3dlZC4KKworCitAaXRlbSAiZm9ybWFsIHBhcmFtZXRlcnMgY29uZmxpY3Qgd2l0aCBwYXJhbWV0ZXItdHlwZS1saXN0IiAoV2FybmluZywgQU5TSS12aW9sYXRpb24pCisKKworCitAaXRlbSAicGFyYW1ldGVyIHR5cGUgZGVmYXVsdHMgdG8gaW50IiAoV2FybmluZykKKworICAgICAgICBBIGZ1bmN0aW9uIGRlZmluaXRpb24gY29udGFpbnMgbm8gZXhwbGljaXQgdHlwZSBzcGVjaWZpZXIuCisgICAgICAgICdpbnQnIHdpbGwgYmUgYXNzdW1lZC4KKworCitAaXRlbSAibm8gZGVjbGFyYXRpb24tc3BlY2lmaWVyLCB1c2VkIGludCIgKFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgIEEgdmFyaWFibGUgd2FzIGRlY2xhcmVkL2RlZmluZWQgd2l0aG91dCBhIHR5cGUgc3BlY2lmaWVkLgorICAgICAgICBUaGlzIGlzIG5vdCBhbGxvd2VkIGluIEFOU0kgQyAoYXBhcnQgZnJvbSBmdW5jdGlvbnMpLgorCisKK0BpdGVtICJubyBkZWNsYXJhdG9yIGluIHByb3RvdHlwZSIgKFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCisKKworQGl0ZW0gInN0YXRpYyB2YXIgPCVzPiBuZXZlciBkZWZpbmVkIiAoV2FybmluZykKKworCisKK0BpdGVtICJAfSBleHBlY3RlZCIgKFdhcm5pbmcpCisKKworCitAaXRlbSAibGVmdCBvcGVyYW5kIG9mIGNvbW1hIG9wZXJhdG9yIGhhcyBubyBzaWRlLWVmZmVjdHMiIChXYXJuaW5nKQorCisgICAgICAgIEluIGFuIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gYSxiIGEgaGFzIG5vIHNpZGUtZWZmZWN0cyBhbmQgaXMKKyAgICAgICAgdGhlcmVmb3JlIHN1cGVyZmx1b3VzLgorCisKK0BpdGVtICJsYWJlbCBlbXB0eSIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBUaGVyZSB3YXMgYSAnOicgd2l0aG91dCBhbiBpZGVudGlmaWVyIGJlZm9yZSBpdC4KKworCitAaXRlbSAicmVkZWZpbml0aW9uIG9mIGxhYmVsIDwlcz4iIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgVGhlIGxhYmVsIHdhcyBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBzYW1lIGZ1bmN0aW9uLgorICAgICAgICBDb25zaWRlciB0aGF0IGxhYmVscyBjYW4gbm90IGJlIGhpZGRlbiBpbiBpbm5lciBibG9ja3MuCisKKworQGl0ZW0gImNhc2Ugd2l0aG91dCBzd2l0Y2giIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgQSBjYXNlIGxhYmVsIHdhcyBmb3VuZCBvdXRzaWRlIG9mIGFueSBzd2l0Y2gtc3RhdGVtZW50cy4KKworCitAaXRlbSAiY2FzZS1leHByZXNzaW9uIG11c3QgYmUgY29uc3RhbnQiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgVGhlIGV4cHJlc3Npb24gYWZ0ZXIgJ2Nhc2UnIG11c3QgYmUgY29uc3RhbnQuCisKKworQGl0ZW0gImNhc2UtZXhwcmVzc2lvbiBtdXN0IGJlIGludGVnZXIiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgVGhlIGV4cHJlc3Npb24gYWZ0ZXIgJ2Nhc2UnIG11c3QgYmUgaW50ZWdlci4KKworCitAaXRlbSAiZW1wdHkgaWYtZXhwcmVzc2lvbiIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBUaGVyZSB3YXMgbm8gdmFsaWQgZXhwcmVzc2lvbiBhZnRlciAnaWYnLgorCisKK0BpdGVtICJpZi1leHByZXNzaW9uIG11c3QgYmUgYXJpdGhtZXRpYyBvciBwb2ludGVyIiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgIFRoZSBleHByZXNzaW9uIGFmdGVyICdpZicgbXVzdCBiZSBhcml0aG1ldGljIChpLmUuIGFuIGludGVnZXIKKyAgICAgICAgb3IgZmxvYXRpbmcgcG9pbnQgdHlwZSkgb3IgYSBwb2ludGVyLgorCisKK0BpdGVtICJlbXB0eSBzd2l0Y2gtZXhwcmVzc2lvbiIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBUaGVyZSB3YXMgbm8gdmFsaWQgZXhwcmVzc2lvbiBhZnRlciAnc3dpdGNoJy4KKworCitAaXRlbSAic3dpdGNoLWV4cHJlc3Npb24gbXVzdCBiZSBpbnRlZ2VyIiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgIFRoZSBleHByZXNzaW9uIGFmdGVyICdzd2l0Y2gnIG11c3QgYmUgYW4gaW50ZWdlci4KKworCitAaXRlbSAibXVsdGlwbGUgZGVmYXVsdCBsYWJlbHMiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgVGhlcmUgd2FzIG1vcmUgdGhhbiBvbmUgZGVmYXVsdCBsYWJlbCBpbiBhIHN3aXRjaC1zdGF0ZW1lbnQuCisKKworQGl0ZW0gIndoaWxlLWV4cHJlc3Npb24gbXVzdCBiZSBhcml0aG1ldGljIG9yIHBvaW50ZXIiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgVGhlIGV4cHJlc3Npb24gYWZ0ZXIgdGhlICd3aGlsZScgbXVzdCBiZSBhcml0aG1ldGljIChpLmUuIGFuIGludGVnZXIKKyAgICAgICAgb3IgZmxvYXRpbmcgcG9pbnQgdHlwZSkgb3IgYSBwb2ludGVyLgorCisKK0BpdGVtICJlbXB0eSB3aGlsZS1leHByZXNzaW9uIiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgIFRoZXJlIHdhcyBubyB2YWxpZCBleHByZXNzaW9uIGFmdGVyICd3aGlsZScuCisKKworQGl0ZW0gImZvci1leHByZXNzaW9uIG11c3QgYmUgYXJpdGhtZXRpYyBvciBwb2ludGVyIiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgIFRoZSBleHByZXNzaW9uIGluc2lkZSB0aGUgJ2ZvcicgbXVzdCBiZSBhcml0aG1ldGljIChpLmUuIGFuIGludGVnZXIKKyAgICAgICAgb3IgZmxvYXRpbmcgcG9pbnQgdHlwZSkgb3IgYSBwb2ludGVyLgorCisKK0BpdGVtICJkby13aGlsZS0tZXhwcmVzc2lvbiBtdXN0IGJlIGFyaXRobWV0aWMgb3IgcG9pbnRlciIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBUaGUgZXhwcmVzc2lvbiBhZnRlciB0aGUgJ3doaWxlJyBtdXN0IGJlIGFyaXRobWV0aWMgKGkuZS4gYW4gaW50ZWdlcgorICAgICAgICBvciBmbG9hdGluZyBwb2ludCB0eXBlKSBvciBhIHBvaW50ZXIuCisKKworQGl0ZW0gImdvdG8gd2l0aG91dCBsYWJlbCIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICAnZ290bycgbXVzdCBiZSBmb2xsb3dlZCBieSBhIGxhYmVsLgorCisKK0BpdGVtICJjb250aW51ZSBub3Qgd2l0aGluIGxvb3AiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgJ2NvbnRpbnVlJyBpcyBvbmx5IGFsbG93ZWQgaW5zaWRlIG9mIGxvb3BzLgorICAgICAgICBQZXJoYXBzIHRoZXJlIGFyZSB1bmJhbGFuY2VkICdAeycgJ0B9Jy4KKworCitAaXRlbSAiYnJlYWsgbm90IGluIG1hdGNoaW5nIGNvbnN0cnVjdCIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICAnYnJlYWsnIGlzIG9ubHkgYWxsb3dlZCBpbnNpZGUgb2YgbG9vcHMgb3Igc3dpdGNoLXN0YXRlbWVudHMuCisgICAgICAgIFBlcmhhcHMgdGhlcmUgYXJlIHVuYmFsYW5jZWQgJ0B7JyAnQH0nLgorCisKK0BpdGVtICJsYWJlbCA8JXM+IHdhcyBuZXZlciBkZWZpbmVkIiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgIFRoZXJlIGlzIGEgZ290byB0byBhIGxhYmVsIHRoYXQgd2FzIG5ldmVyIGRlZmluZWQuCisKKworQGl0ZW0gImxhYmVsIDwlcz4gd2FzIG5ldmVyIHVzZWQiIChXYXJuaW5nKQorCisgICAgICAgIFlvdSBkZWZpbmVkIGEgbGFiZWwsIGJ1dCB0aGVyZSBpcyBubyBnb3RvIHRoYXQganVtcHMgdG8gaXQuCisKKworQGl0ZW0gInJlZ2lzdGVyICVzIG5vdCBvayIgKFdhcm5pbmcpCisKKyAgICAgICAgVGhlcmUgd2FzIGFuIGludGVybmFsIGVycm9yIChpLmUuIGEgYnVnIGluIHRoZSBjb21waWxlcikhCisgICAgICAgIFBsZWFzZSByZXBvcnQgdGhlIGVycm9yIHRvIHZiQEBjb21waWxlcnMuZGUuIFRoYW5rcyEKKworCitAaXRlbSAiZGVmYXVsdCBub3QgaW4gc3dpdGNoIiAoV2FybmluZywgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgQSBkZWZhdWx0IGxhYmVsIHRoYXQgaXMgbm90IGluIGFueSBzd2l0Y2gtc3RhdGVtZW50IHdhcyBmb3VuZC4KKyAgICAgICAgUGVyaGFwcyB0aGVyZSBhcmUgdW5iYWxhbmNlZCAnQHsnICdAfScuCisKKworQGl0ZW0gIiggZXhwZWN0ZWQiIChXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworCisKK0BpdGVtICJsb29wIGVsaW1pbmF0ZWQiIChXYXJuaW5nKQorCisgICAgICAgIFRoZXJlIHdhcyBhIGxvb3AgdGhhdCB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkIChlLmcuIHdoaWxlKDApLi4uKQorICAgICAgICBhbmQgdGhlcmVmb3JlIHRoZSBlbnRpcmUgbG9vcCB3YXMgZWxpbWluYXRlZC4KKyAgICAgICAgSSBkbyBub3Qga25vdyBhbnkgcmVhc29uIGZvciBzdWNoIGxvb3BzLCBzbyB0aGVyZSBpcyBwcm9iYWJseSBhbgorICAgICAgICBlcnJvci4KKworCitAaXRlbSAic3RhdGVtZW50IGhhcyBubyBlZmZlY3QiIChXYXJuaW5nKQorCisgICAgICAgIFRoZXJlIGlzIGEgc3RhdGVtZW50IHRoYXQgZG9lcyBub3QgY2F1c2UgYW55IHNpZGUtZWZmZWN0cyAoZS5nLgorICAgICAgICBhc3NpZ25tZW50cywgZnVuY3Rpb24gY2FsbHMgZXRjLikgYW5kIGlzIHRoZXJlZm9yZSBzdXBlcmZsdW91cy4KKyAgICAgICAgRS5nLiB5b3UgbWlnaHQgaGF2ZSB0eXBlZCBhPT1iOyBpbnN0ZWFkIG9mIGE9YjsKKworCitAaXRlbSAiJ3doaWxlJyBleHBlY3RlZCIgKFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgIFRoZSAnd2hpbGUnIGluIGEgZG8td2hpbGUgbG9vcCBpcyBtaXNzaW5nLgorCisKK0BpdGVtICJmdW5jdGlvbiBzaG91bGQgbm90IHJldHVybiBhIHZhbHVlIiAoV2FybmluZykKKworICAgICAgICBZb3Ugc3BlY2lmaWVkIGFuIGFyZ3VtZW50IHRvIHJldHVybiBhbHRob3VnaCB0aGUgZnVuY3Rpb24gaXMKKyAgICAgICAgdm9pZC4gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXMgbm9uLXZvaWQuCisKKworQGl0ZW0gImZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSB2YWx1ZSIgKFdhcm5pbmcpCisKKyAgICAgICAgWW91IGRpZCBub3Qgc3BlY2lmeSBhbiBhcmd1bWVudCB0byByZXR1cm4gYWx0aG91Z2ggdGhlIGZ1bmN0aW9uCisgICAgICAgIGlzIG5vdCB2b2lkLiBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcyB2b2lkIG9yIHNwZWNpZnkgYSByZXR1cm4KKyAgICAgICAgdmFsdWUuCisKKworQGl0ZW0gIkB7IGV4cGVjdGVkIiAoV2FybmluZywgQU5TSS12aW9sYXRpb24pCisKKworCitAaXRlbSAiaW50ZXJuYWwgZXJyb3IgJWQgaW4gbGluZSAlZCBvZiBmaWxlICVzICEhIiAoRmF0YWwsIEVycm9yKQorCisgICAgICAgIFRoZXJlIHdhcyBhbiBpbnRlcm5hbCBlcnJvciAoaS5lLiBhIGJ1ZyBpbiB0aGUgY29tcGlsZXIpIQorICAgICAgICBQbGVhc2UgcmVwb3J0IHRoZSBlcnJvciB0byB2YkBAY29tcGlsZXJzLmRlLiBUaGFua3MhCisKKworQGl0ZW0gInRoZXJlIGlzIG5vIG1lc3NhZ2UgbnVtYmVyICVkIiAoRmF0YWwpCisKKyAgICAgICAgWW91IHRyaWVkIHRvIGFjdGl2YXRlIG9yIHN1cHByZXNzIGEgbWVzc2FnZSB0aGF0IGRvZXMgbm90IGV4aXN0LgorCisKK0BpdGVtICJtZXNzYWdlIG51bWJlciAlZCBjYW5ub3QgYmUgc3VwcHJlc3NlZCIgKEZhdGFsKQorCisgICAgICAgIFlvdSBjYW5ub3Qgc3VwcHJlc3MgYSBtZXNzYWdlIHRoYXQgZGlzcGxheXMgYSByZWFsIGVycm9yLAorICAgICAgICBBTlNJLXZpb2xhdGlvbiBvciBhbm90aGVyIHJlYWwgcHJvYmxlbS4KKyAgICAgICAgT25seSAnaGFybWxlc3MnIHdhcm5pbmdzIGNhbiBiZSBzdXBwcmVzc2VkLgorCisKK0BpdGVtICJpbXBsaWNpdCBkZWNsYXJhdGlvbiBvZiBmdW5jdGlvbiA8JXM+IiAoV2FybmluZykKKworICAgICAgICBBIGZ1bmN0aW9uIHdhcyBjYWxsZWQgYmVmb3JlIGl0IHdhcyBkZWNsYXJlZCBhbmQgdGhlcmVmb3JlCisgICAgICAgIGltcGxpY2l0bHkgZGVjbGFyZWQgYXMKKworICAgICAgICAgICAgaW50IGZ1bmN0aW9uKCk7CisKKyAgICAgICAgVGhpcyBzaG91bGQgYmUgYXZvaWRlZCBpbiBuZXcgcHJvZ3JhbXMuCisKKworQGl0ZW0gImZ1bmN0aW9uIGNhbGwgd2l0aG91dCBwcm90b3R5cGUgaW4gc2NvcGUiIChXYXJuaW5nKQorCisgICAgICAgIFdoZW4gd3JpdGluZyBuZXcgcHJvZ3JhbXMgaXQgaXMgcHJvYmFibHkgc2Vuc2libGUgdG8gdXNlIHByb3RvdHlwZXMKKyAgICAgICAgZm9yIGV2ZXJ5IGZ1bmN0aW9uLiBJZiBhIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRob3V0IGEgcHJvdG90eXBlIGluCisgICAgICAgIHNjb3BlIHRoaXMgbWF5IGNhdXNlIGluY29ycmVjdCB0eXBlIGNvbnZlcnNpb25zIGFuZCBpcyB1c3VhbGx5IGFuCisgICAgICAgIGVycm9yLgorCisKK0BpdGVtICIjcHJhZ21hIHVzZWQiIChXYXJuaW5nKQorCisgICAgICAgIFVzYWdlIG9mICNwcmFnbWEgc2hvdWxkIGJlIGF2b2lkZWQgaW4gcG9ydGFibGUgcHJvZ3JhbXMuCisKKworQGl0ZW0gImFzc2lnbm1lbnQgaW4gY29tcGFyaXNvbiBjb250ZXh0IiAoV2FybmluZykKKworICAgICAgICBUaGUgZXhwcmVzc2lvbiBpbiBhbiBpZi0sIGZvci0sIHdoaWxlLSBvciBkby13aGlsZS1zdGF0ZW1lbnQKKyAgICAgICAgaXMgYW4gYXNzaWdubWVudCwgZS5nLgorCisgICAgICAgICAgICBpZihpPTApLi4uCisKKyAgICAgICAgVGhpcyBjb3VsZCBhbiBlcnJvciwgaWYgeW91IHdhbnRlZCBpZihpPT0wKS4KKyAgICAgICAgSWYgeW91IHR1cm5lZCBvbiB0aGlzIHdhcm5pbmcgYW5kIHdhbnQgaXQgdG8gc2h1dCB1cCBmb3IgYQorICAgICAgICBjZXJ0YWluIGV4cHJlc3Npb24geW91IGNhbiBjYXN0IGl0IHRvIGl0cyB0eXBlLCBlLmcuCisKKyAgICAgICAgICAgIGlmKChpbnQpKGk9MCkpLi4uCisKKyAgICAgICAgTm90ZSB0aGF0IG9ubHkgYXNzaWdubWVudHMgd2l0aCAnPScgd2lsbCBiZSB3YXJuZWQsIG5vdCAnKz0nIGV0Yy4KKworCitAaXRlbSAiY29tcGFyaXNvbiByZWR1bmRhbnQgYmVjYXVzZSBvcGVyYW5kIGlzIHVuc2lnbmVkIiAoV2FybmluZykKKworICAgICAgICBBIGNvbXBhcmlzb24gd2l0aCBhbiB1bnNpZ25lZCB2YXJpYWJsZSBpcyByZWR1bmRhbnQsIGJlY2F1c2UKKyAgICAgICAgdGhlIHJlc3VsdCB3aWxsIGFsd2F5cyBiZSBjb25zdGFudCwgZS5nLgorCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAgICAgICAgIGlmKGk8MCkuLi4KKworICAgICAgICBUaGlzIHVzdWFsbHkgaXMgYSBwcm9ncmFtbWluZyBlcnJvciBhbmQgY2FuIGJlIGF2b2lkZWQgaW4gYWxsIGNhc2VzLgorCisKK0BpdGVtICJjYXN0IHRvIG5hcnJvdyB0eXBlIG1heSBjYXVzZSBsb3NzIG9mIHByZWNpc2lvbiIgKFdhcm5pbmcpCisKKyAgICAgICAgQSB2YXJpYWJsZSBpcyBjYXN0IHRvIGEgdHlwZSBzbWFsbGVyIHRoYW4gaXRzIG9yaWdpbmFsIHR5cGUsIHNvCisgICAgICAgIHRoYXQgc29tZSBpbmZvcm1hdGlvbiBtYXkgZ2V0IGxvc3QuCisgICAgICAgIEhvd2V2ZXIgdGhpcyB3YXJuaW5nIHdpbGwgYmUgZGlzcGxheWVkIGluIGxvdHMgb2YgY2FzZXMgd2hlcmUKKyAgICAgICAgbm8gcHJvYmxlbSBjYW4gYXJpc2UsIGUuZy4gKHNob3J0KShhPT1iKS4KKworCitAaXRlbSAicG9pbnRlciBjYXN0IG1heSBjYXVzZSBhbGlnbm1lbnQgcHJvYmxlbXMiIChXYXJuaW5nKQorCisgICAgICAgIEEgcG9pbnRlciBpcyBjYXN0IHRvIGEgcG9pbnRlciB0byBhIHR5cGUgd2l0aCBzdHJpY3RlciBhbGlnbm1lbnQKKyAgICAgICAgcmVxdWlyZW1lbnRzLCBpLmUuIHRoZSBuZXcgcG9pbnRlciBtaWdodCBiZSBpbnZhbGlkIGlmIHlvdSBkbyBub3QKKyAgICAgICAga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCisgICAgICAgIFRob3NlIGNhc3RzIHNob3VsZCBiZSBhdm9pZGFibGUgaW4gYWxsICd1c3VhbCcgY2FzZXMuCisKKworQGl0ZW0gIm5vIGRlY2xhcmF0aW9uIG9mIGdsb2JhbCB2YXJpYWJsZSA8JXM+IGJlZm9yZSBkZWZpbml0aW9uIiAoV2FybmluZykKKworICAgICAgICBJdCBpcyB1c3VhbGx5IGdvb2QgdG8gZGVjbGFyZSBhbGwgZ2xvYmFsIHZhcmlhYmxlcyAoaW5jbHVkaW5nCisgICAgICAgIGZ1bmN0aW9ucykgaW4gaGVhZGVyIGZpbGVzLgorCisKK0BpdGVtICInZXh0ZXJuJyBpbnNpZGUgZnVuY3Rpb24iIChXYXJuaW5nKQorCisgICAgICAgIERlY2xhcmF0aW9uIG9mIGV4dGVybmFsIHZhcmlhYmxlcyBpbiBpbm5lciBibG9ja3MgaXMgdXN1YWxseQorICAgICAgICBub3QgYSBnb29kIGlkZWEuCisKKworQGl0ZW0gImRlYWQgYXNzaWdubWVudCB0byA8JXM+IGVsaW1pbmF0ZWQiIChXYXJuaW5nKQorCisgICAgICAgIEEgdmFyaWFibGUgaXMgYXNzaWduZWQgYSB2YWx1ZSB0aGF0IGlzIG5ldmVyIHVzZWQgb3IgZ2V0cworICAgICAgICBvdmVyd3JpdHRlbiBiZWZvcmUgaXQgaXMgdXNlZC4gSWYgdGhpcyBvY2N1cnMgaW4gcmVhbCBjb2RlIHRoZW4KKyAgICAgICAgdGhlcmUgaXMgZWl0aGVyIGFuIGVycm9yIG9yIGFuIHVubmVjZXNzYXJ5IGFzc2lnbm1lbnQuCisKKyAgICAgICAgVGhpcyBpcyBkZXRlY3RlZCBvbmx5IGluIG9wdGltaXppbmcgY29tcGlsYXRpb24uCisKKworQGl0ZW0gInZhciA8JXM+IGlzIHVzZWQgYmVmb3JlIGRlZmluZWQiIChXYXJuaW5nKQorCisgICAgICAgIFRoZSB2YXJpYWJsZSBpcyB1c2VkIGJlZm9yZSBpdCB3YXMgYXNzaWduZWQgYSB2YWx1ZSBhbmQgdGhlcmVmb3JlCisgICAgICAgIGlzIHVuZGVmaW5lZC4gSXQgY2Fubm90IGJlIGRldGVjdGVkIGlmIHRoZSBjb2RlIHdoZXJlIGl0IGlzIHVzZWQKKyAgICAgICAgY2FuIGJlIHJlYWNoZWQsIGJ1dCBpZiBpdCBpcyByZWFjaGVkIGl0IHdpbGwgY2F1c2UgdW5kZWZpbmVkCisgICAgICAgIGJlaGF2aW91ci4gU28gaXQgaXMgbW9zdCBwcm9iYWJseSBhbiBlcnJvciBlaXRoZXIgd2F5IChzZWUgMTcwKS4KKworICAgICAgICBIb3dldmVyIG5vdCBhbGwgdW5pbml0aWFsaXplZCB1c2FnZXMgY2FuIGJlIGZvdW5kLgorCisgICAgICAgIEFsc28gbm90ZSB0aGF0IHRoZSBjb21waWxlciBtYXkgY2hvb3NlIGNvbnZlbmllbnQgdmFsdWVzIGZvcgorICAgICAgICB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy4gRXhhbXBsZToKKworICAgICAgICAgICAgaW50IGYoaW50IGEpCisgICAgICAgICAgICBAeworICAgICAgICAgICAgICAgIGludCB4OworICAgICAgICAgICAgICAgIGlmKGEpIHg9MDsKKyAgICAgICAgICAgICAgICByZXR1cm4oeCk7CisgICAgICAgICAgICBAfQorCisgICAgICAgIEhlcmUgdGhlIG9wdGltaXplciBtYXkgY2hvb3NlIHRoYXQgeD09MCBpZiBpdCBpcyB1bmluaXRpYWxpemVkIGFuZAorICAgICAgICB0aGVuIG9ubHkgZ2VuZXJhdGUgYSByZXR1cm4oMCk7CisgICAgICAgIEl0IGNhbiBhbHNvIGhhcHBlbiB0aGF0IHlvdSBnZXQgZGlmZmVyZW50IHZhbHVlcyBpZiB5b3UgcmVhZCBhbgorICAgICAgICB1bmluaXRpYWxpemVkIHZhcmlhYmxlIHR3aWNlIGFsdGhvdWdoIGl0IHdhcyBub3QgYXNzaWduZWQgYSB2YWx1ZQorICAgICAgICBpbiBiZXR3ZWVuLgorCisgICAgICAgIFRoaXMgaXMgb25seSBkZXRlY3RlZCBpbiBvcHRpbWl6aW5nIGNvbXBpbGF0aW9uLgorCisKK0BpdGVtICJ3b3VsZCBuZWVkIG1vcmUgdGhhbiAlbGQgb3B0aW1pemVyIHBhc3NlcyBmb3IgYmVzdCByZXN1bHRzIiAoV2FybmluZykKKworICAgICAgICBUaGUgb3B0aW1pemVyIHdvdWxkIHByb2JhYmx5IGJlIGFibGUgdG8gZG8gc29tZSBmdXJ0aGVyCisgICAgICAgIG9wdGltaXphdGlvbnMgaWYgeW91IGluY3JlYXNlZCB0aGUgbnVtYmVyIG9mIGFsbG93ZWQgcGFzc2VzCisgICAgICAgIHdpdGggdGhlIC1vcHRwYXNzZXM9biBvcHRpb24uCisKKworQGl0ZW0gImZ1bmN0aW9uIDwlcz4gaGFzIG5vIHJldHVybiBzdGF0ZW1lbnQiIChXYXJuaW5nKQorCisgICAgICAgIEEgbm9uLXZvaWQgZnVuY3Rpb24gaGFzIG5vIHJldHVybiBzdGF0ZW1lbnQuIEVpdGhlciB0aGlzIGZ1bmN0aW9uCisgICAgICAgIG5ldmVyIHJldHVybnMgKHRoZW4gYmV0dGVyIGRlY2xhcmUgaXQgYXMgdm9pZCkgb3IgaXQgcmVhY2hlcworICAgICAgICBlbmQgb2YgY29udHJvbCB3aGljaCB3b3VsZCBiZSBhbiBlcnJvci4KKworICAgICAgICBBcyBtYWluKCkgY2Fubm90IGJlIGRlY2xhcmVkIGFzIHZvaWQgeW91IHdpbGwgbm90IGJlIHdhcm5lZCBpZgorICAgICAgICBtYWluIGhhcyBubyByZXR1cm4gc3RhdGVtZW50LiBJZiB5b3Ugd2FudCBhIHdhcm5pbmcgZm9yIG1haW4sIHRvbywKKyAgICAgICAgeW91IGNhbiB0dXJuIG9uIHdhcm5pbmcgMTc0LgorCisKK0BpdGVtICJmdW5jdGlvbiA8bWFpbj4gaGFzIG5vIHJldHVybiBzdGF0ZW1lbnQiIChXYXJuaW5nKQorCisgICAgICAgIFRoZSBzYW1lIGxpa2UgMTczIGZvciBtYWluLCBzbyB5b3UgY2FuIHR1cm4gaXQgb24vb2ZmIHNlcGFyYXRlbHkuCisKKworQGl0ZW0gInRoaXMgY29kZSBpcyB3ZWlyZCIgKFdhcm5pbmcpCisKKyAgICAgICAgVGhlIGNvZGUgaGFzIGEgdmVyeSBzdHJhbmdlIGNvbnRyb2wgZmxvdy4gVGhlcmUgaXMgcHJvYmFibHkgYQorICAgICAgICBqdW1wIGluc2lkZSBhIGxvb3Agb3Igc29tZXRoaW5nIHNpbWlsYXIgYW5kIHRoZSBvcHRpbWl6ZXIgd2lsbAorICAgICAgICBub3QgbWFrZSBhbnkgbG9vcCBvcHRpbWl6YXRpb24gYW5kIHBlcmhhcHMgd29yc2UgcmVnaXN0ZXIKKyAgICAgICAgYWxsb2NhdGlvbiBvbiB0aGlzIGNvbnN0cnVjdC4KKyAgICAgICAgVGhlcmUgbXVzdCBiZSBnb3RvIHN0YXRlbWVudHMgaW4gdGhlIHNvdXJjZS4KKworICAgICAgICBUaGlzIHdhcm5pbmcgaXMgb25seSBkZXRlY3RlZCBpbiBvcHRpbWl6aW5nIGNvbXBpbGF0aW9uLgorCisKK0BpdGVtICJzaXplIG9mIGluY29tcGxldGUgdHlwZSBub3QgYXZhaWxhYmxlIiAoV2FybmluZywgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgQW4gaW5jb21wbGV0ZSB0eXBlIG11c3Qgbm90IGJlIHRoZSBhcmd1bWVudCBmb3Igc2l6ZW9mLgorCisKK0BpdGVtICJsaW5lIHRvbyBsb25nIiAoRkFUQUwsIEVycm9yLCBBTlNJLXZpb2xhdGlvbiwgUHJlcHJvY2Vzc29yKQorCisKKworQGl0ZW0gImlkZW50aWZpZXIgbXVzdCBiZWdpbiB3aXRoIGEgbGV0dGVyIG9yIHVuZGVyc2NvcmUiIChGQVRBTCwgRXJyb3IsIEFOU0ktdmlvbGF0aW9uLCBQcmVwcm9jZXNzb3IpCisKKworCitAaXRlbSAiY2Fubm90IHJlZGVmaW5lIG1hY3JvIiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uLCBQcmVwcm9jZXNzb3IpCisKKworCitAaXRlbSAibWlzc2luZyApIGFmdGVyIGFyZ3VtZW50bGlzdCIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbiwgUHJlcHJvY2Vzc29yKQorCisKKworQGl0ZW0gImlkZW50aWZpZXIgZXhwZWN0ZWQiIChFcnJvciwgQU5TSS12aW9sYXRpb24sIFByZXByb2Nlc3NvcikKKworCisKK0BpdGVtICJpbGxlZ2FsIGNoYXJhY3RlciBpbiBpZGVudGlmaWVyIiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uLCBQcmVwcm9jZXNzb3IpCisKKworCitAaXRlbSAibWlzc2luZyBvcGVyYW5kIGJlZm9yZS9hZnRlciAjIyIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbiwgUHJlcHJvY2Vzc29yKQorCisKKworQGl0ZW0gIm5vIG1hY3JvLWFyZ3VtZW50IGFmdGVyICMtb3BlcmF0b3IiIChFcnJvciwgQU5TSS12aW9sYXRpb24sIFByZXByb2Nlc3NvcikKKworCisKK0BpdGVtICJtYWNybyByZWRlZmluaXRpb24gbm90IGFsbG93ZWQiIChFcnJvciwgQU5TSS12aW9sYXRpb24sIFByZXByb2Nlc3NvcikKKworCisKK0BpdGVtICJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlICh1bnRlcm1pbmF0ZWQgY29tbWVudCkiIChGQVRBTCwgRXJyb3IsIFByZXByb2Nlc3NvcikKKworCisKK0BpdGVtICJ0b28gbWFueSBuZXN0ZWQgaW5jbHVkZXMiIChGQVRBTCwgRXJyb3IsIFByZXByb2Nlc3NvcikKKworCisKK0BpdGVtICIjZWxzZSB3aXRob3V0ICNpZi8jaWZkZWYvI2lmbmRlZiIgKEZBVEFMLCBFcnJvciwgQU5TSS12aW9sYXRpb24sIFByZXByb2Nlc3NvcikKKworCisKK0BpdGVtICIjZWxzZSBhZnRlciAjZWxzZSIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbiwgUHJlcHJvY2Vzc29yKQorCisKKworQGl0ZW0gIiNlbmRpZiB3aXRob3V0ICNpZiIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbiwgUHJlcHJvY2Vzc29yKQorCisKKworQGl0ZW0gImNhbm5vdCBpbmNsdWRlIGZpbGUiIChGQVRBTCwgRXJyb3IsIFByZXByb2Nlc3NvcikKKworCisKK0BpdGVtICJleHBlY3RlZCBcIiBvciA8IGluICNpbmNsdWRlLWRpcmVjdGl2ZSIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbiwgUHJlcHJvY2Vzc29yKQorCisKKworQGl0ZW0gInVua25vd24gIy1kaXJlY3RpdmUiIChXYXJuaW5nLCBQcmVwcm9jZXNzb3IpCisKKworCitAaXRlbSAid3JvbmcgbnVtYmVyIG9mIG1hY3JvIGFyZ3VtZW50cyIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbiwgUHJlcHJvY2Vzc29yKQorCisKKworQGl0ZW0gIm1hY3JvIGFyZ3VtZW50IGV4cGVjdGVkIiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uLCBQcmVwcm9jZXNzb3IpCisKKworCitAaXRlbSAib3V0IG9mIG1lbW9yeSIgKEZBVEFMLCBFcnJvciwgUHJlcHJvY2Vzc29yKQorCisKKworQGl0ZW0gIm1hY3JvIHJlZGVmaW5pdGlvbiIgKFdhcm5pbmcsIFByZXByb2Nlc3NvcikKKworCisKK0BpdGVtICIvKiBpbiBjb21tZW50IiAoV2FybmluZywgUHJlcHJvY2Vzc29yKQorCisKKworQGl0ZW0gImNhbm5vdCB1bmRlZmluZSBtYWNybyIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbiwgUHJlcHJvY2Vzc29yKQorCisKKworQGl0ZW0gImNoYXJhY3RlcnMgYWZ0ZXIgIy1kaXJlY3RpdmUgaWdub3JlZCIgKFdhcm5pbmcsIFByZXByb2Nlc3NvcikKKworCisKK0BpdGVtICJkdXBsaWNhdGUgY2FzZSBsYWJlbHMiIChXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBFYWNoIGNhc2UtbGFiZWwgaW4gYSBzd2l0Y2gtc3RhdGVtZW50IG11c3QgaGF2ZSBhIGRpc3RpbmN0IGNvbnN0YW50CisgICAgICAgIHZhbHVlIGF0dGFjaGVkIChhZnRlciBjb252ZXJ0aW5nIGl0IHRvIHRoZSB0eXBlIG9mIHRoZQorICAgICAgICBzd2l0Y2gtZXhwcmVzc2lvbikuCisKKworQGl0ZW0gInZhciA8JXM+IGlzIGluY29tcGxldGUiIChXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBBbiBpbmNvbXBsZXRlIHZhciB3YXMgZGVmaW5lZC4gcHJvYmFibHkgeW91IHdyb3RlIHNvbWV0aGluZyBsaWtlOgorCisgICAgICAgICAgICBpbnQgYVtdOworCisKK0BpdGVtICJsb25nIGZsb2F0IGlzIG5vIGxvbmdlciB2YWxpZCIgKFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgICdsb25nIGZsb2F0JyB3YXMgYSBzeW5vbnltIGZvciBkb3VibGUgaW4gSyZSIEMsIGJ1dCB0aGlzIGlzIG5vIGxvbmdlcgorICAgICAgICBhbGxvd2VkIGluIEFOU0kgQy4KKworCitAaXRlbSAibG9uZyBkb3VibGUgaXMgbm90IHJlYWxseSBzdXBwb3J0ZWQgYnkgdmJjYyIgKFdhcm5pbmcpCisKKyAgICAgICAgdmJjYyBkb2VzIG5vdCBrbm93IGFib3V0IGxvbmcgZG91YmxlIHlldCBhbmQgdGhlcmVmb3JlIHdpbGwgdXNlIGl0CisgICAgICAgIHNpbXBseSBhcyBhIHN5bm9ueW0gZm9yIGRvdWJsZS4gVGhpcyBzaG91bGQgbm90IGJyZWFrIGFueSBsZWdhbCBjb2RlLAorICAgICAgICBidXQgeW91IHdpbGwgbm90IGdldCBlcnJvciBtZXNzYWdlcyBpZiB5b3UgZS5nLiBhc3NpZ24gYSBwb2ludGVyIHRvCisgICAgICAgIGRvdWJsZSB0byBhIHBvaW50ZXIgdG8gbG9uZyBkb3VibGUuCisKKworQGl0ZW0gImVtcHR5IHN0cnVjdC1kZWNsYXJhdGlvbnMgYXJlIG5vdCB5ZXQgaGFuZGxlZCBjb3JyZWN0IiAoV2FybmluZykKKworICAgICAgICBvYnNvbGV0ZQorCisKK0BpdGVtICJpZGVudGlmaWVyIHRvbyBsb25nIChvbmx5ICVkIGNoYXJhY3RlcnMgYXJlIHNpZ25pZmljYW50KSIgKFdhcm5pbmcpCisKKworCitAaXRlbSAiaWxsZWdhbCBpbml0aWFsaXphdGlvbiBvZiB2YXIgPCVzPiIgKFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgIFBlcmhhcHMgeW91IHRyaWVkIHRvIGluaXRpYWxpemUgYSB2YXJpYWJsZSB3aXRoIGV4dGVybmFsIGxpbmthZ2UKKyAgICAgICAgaW4gYW4gaW5uZXIgYmxvY2suCisKKworQGl0ZW0gInN1c3BpY2lvdXMgbG9vcCIgKFdhcm5pbmcpCisKKyAgICAgICAgdmJjYyB0aGlua3MgYSBsb29wLWNvbmRpdGlvbiBsb29rcyBzdXNwaWNpb3VzLiBBIHBvc3NpYmxlIGV4YW1wbGUKKyAgICAgICAgY291bGQgYmUgZm9yKGk9MDtpIT03O2krPTIpCisKKworQGl0ZW0gImFuc2kvaXNvLW1vZGUgdHVybmVkIG9uIiAoV2FybmluZykKKworICAgICAgICBZb3UgdHVybmVkIG9uIHRoZSBBTlNJL0lTTy1jb25mb3JtaW5nIG1vZGUuIFRoaXMgd2FybmluZyBpcyBhbHdheXMKKyAgICAgICAgZGlzcGxheWVkIHVubGVzcyBpdCBpcyBzdXBwcmVzc2VkLiBTbyB2YmNjIGNhbm5vdCBiZSBibGFtZWQgdG8gbWlzcworICAgICAgICBhIGRpYWdub3N0aWMgZm9yIGFueSBjb25zdHJhaW50IHZpb2xhdGlvbi4gOi0pCisKKworQGl0ZW0gImRpdmlzaW9uIGJ5IHplcm8gKHJlc3VsdCBzZXQgdG8gMCkiIChXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworICAgICAgICBTaW1pbGFyIHRvIHdhcm5pbmcgODQuCisKKworQGl0ZW0gImNvbnN0YW50IG91dCBvZiByYW5nZSIgKFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCisgICAgICAgIEFuIGludGVncmFsIGNvbnN0YW50IGlzIHRvbyBsYXJnZSB0byBmaXQgaW50byBhbiB1bnNpZ25lZCBsb25nLgorCisKK0BpdGVtICJjb25zdGFudCBpcyB1bnNpZ25lZCBkdWUgdG8gc2l6ZSIgKFdhcm5pbmcpCisKKyAgICAgICAgSWYgYW4gaW50ZWdyYWwgY29uc3RhbnQgaXMgc28gbGFyZ2UgdGhhdCBpdCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQKKyAgICAgICAgYXMgbG9uZyBpdHMgdHlwZSBpcyBwcm9tb3RlZCB0byB1bnNpZ25lZCBsb25nLgorCisKK0BpdGVtICJ2YXJhcmdzIGZ1bmN0aW9uIGNhbGxlZCB3aXRob3V0IHByb3RvdHlwZSBpbiBzY29wZSIgKFdhcm5pbmcpCisKKyAgICAgICAgQSBmdW5jdGlvbiB3aGljaCB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMgbXVzdCBub3QgYmUKKyAgICAgICAgY2FsbGVkIHdpdGhvdXQgYSBwcm90b3R5cGUgaW4gc2NvcGUuIEUuZy4gY2FsbGluZyBwcmludGYoKSB3aXRob3V0CisgICAgICAgICNpbmNsdWRlIDxzdGRpby5oPiBtYXkgY2F1c2UgdGhpcyB3YXJuaW5nLgorCisKK0BpdGVtICJzdXNwaWNpb3VzIGZvcm1hdCBzdHJpbmciIChXYXJuaW5nKQorCisgICAgICAgIFRoZSBmb3JtYXQtc3RyaW5nIG9mIGEgcHJpbnRmLS9zY2FuZmxpa2UgZnVuY3Rpb24gc2VlbXMgdG8gYmUgY29ycnVwdAorICAgICAgICBvciBub3QgbWF0Y2hpbmcgdGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50cy4KKworCitAaXRlbSAiZm9ybWF0IHN0cmluZyBjb250YWlucyBcJ1xcMFwnIiAoV2FybmluZykKKworICAgICAgICBUaGUgZm9ybWF0IHN0cmluZyBmb3IgYSBwcmludGYtL3NjYW5mbGlrZSBmdW5jdGlvbiBjb250YWlucyBhbgorICAgICAgICBlbWJlZGRlZCAnXDAnIGNoYXJhY3Rlci4KKworCitAaXRlbSAiaWxsZWdhbCB1c2Ugb2Yga2V5d29yZCA8JXM+IiAoV2FybmluZywgQU5TSS12aW9sYXRpb24pCisKKyAgICAgICAgVGhlIHJlc2VydmVkIGtleXdvcmRzIG9mIEMgbWF5IG5vdCBiZSB1c2VkIGFzIGlkZW50aWZpZXIuCisKKworQGl0ZW0gInJlZ2lzdGVyIDwlcz4gdXNlZCB3aXRoIHdyb25nIHR5cGUiIChFcnJvcikKKworCitAaXRlbSAicmVnaXN0ZXIgPCVzPiBpcyBub3QgZnJlZSIgKEVycm9yKQorCisKK0BpdGVtICInX19yZWcnIHVzZWQgaW4gb2xkLXN0eWxlIGZ1bmN0aW9uIGRlZmluaXRpb24iIChXYXJuaW5nKQorCisKK0BpdGVtICJ1bmtub3duIHJlZ2lzdGVyIFwiJXNcIiIgKFdhcm5pbmcpCisKKworQGl0ZW0gIicuLi4nIG9ubHkgYWxsb3dlZCB3aXRoIHByb3RvdHlwZXMiIChXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworCitAaXRlbSAiSGV5LCBkbyB5b3UgcmVhbGx5IGtub3cgdGhlIHByaW9yaXR5IG9mICcmJicgdnMuICd8fCc/IiAoV2FybmluZykKKworCitAaXRlbSAiYmUgY2FyZWZ1bCB3aXRoIHByaW9yaXRpZXMgb2YgPDwvPj4gdnMuICsvLSIgKFdhcm5pbmcpCisKKworQGl0ZW0gImFkZHJlc3Mgb2YgYXV0byB2YXJpYWJsZSByZXR1cm5lZCIgKFdhcm5pbmcpCisKKworQGl0ZW0gInZvaWQgZnVuY3Rpb24gcmV0dXJucyBhIHZvaWQgZXhwcmVzc2lvbiIgKFdhcm5pbmcpCisKKworQGl0ZW0gInJlZGVjbGFyYXRpb24gb2YgdHlwZWRlZiA8JXM+IiAoV2FybmluZywgQU5TSS12aW9sYXRpb24pCisKKworQGl0ZW0gIm11bHRpcGxlIHNwZWNpZmljYXRpb24gb2YgYXR0cmlidXRlIFwiJXNcIiIgKFdhcm5pbmcpCisKKworQGl0ZW0gInJlZGVjbGFyYXRpb24gb2YgdmFyIFwiJXNcIiB3aXRoIGRpZmZlcmluZyBzZXR0aW5nIG9mIGF0dHJpYnV0ZSBcIiVzXCIiIChXYXJuaW5nKQorCitAaXRlbSAic3RyaW5nLWNvbnN0YW50IGV4cGVjdGVkIiAoRXJyb3IpCisKK0BpdGVtICJ0YWcgXCIlc1wiIHVzZWQgZm9yIHdyb25nIHR5cGUiIChXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gIm1lbWJlciBhZnRlciBmbGV4aWJsZSBhcnJheSBtZW1iZXIiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJpbGxlZ2FsIG51bWJlciIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gInZvaWQgY2hhcmFjdGVyIGNvbnN0YW50IiAoUHJlcHJvY2Vzc29yLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJzcHVyaW91cyB0YWlsIGluIG9jdGFsIGNoYXJhY3RlciBjb25zdGFudCIgKFByZXByb2Nlc3NvciwgRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCitAaXRlbSAic3B1cmlvdXMgdGFpbCBpbiBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIgY29uc3RhbnQiIChQcmVwcm9jZXNzb3IsIEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gImlsbGVnYWwgZXNjYXBlIHNlcXVlbmNlIGluIGNoYXJhY3RlciBjb25zdGFudCIgKFByZXByb2Nlc3NvciwgRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCitAaXRlbSAiaW52YWxpZCBjb25zdGFudCBpbnRlZ2VyIHZhbHVlIiAoUHJlcHJvY2Vzc29yLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJhIHJpZ2h0IHBhcmVudGhlc2lzIHdhcyBleHBlY3RlZCIgKFByZXByb2Nlc3NvciwgRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCitAaXRlbSAiYSBjb2xvbiB3YXMgZXhwZWN0ZWQiIChQcmVwcm9jZXNzb3IsIEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gInRydW5jYXRlZCBjb25zdGFudCBpbnRlZ3JhbCBleHByZXNzaW9uIiAoUHJlcHJvY2Vzc29yLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJyb2d1ZSBvcGVyYXRvciAnJXMnIGluIGNvbnN0YW50IGludGVncmFsIGV4cHJlc3Npb24iIChQcmVwcm9jZXNzb3IsIEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gImludmFsaWQgdG9rZW4gaW4gY29uc3RhbnQgaW50ZWdyYWwgZXhwcmVzc2lvbiIgKFByZXByb2Nlc3NvciwgRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCitAaXRlbSAidHJhaWxpbmcgZ2FyYmFnZSBpbiBjb25zdGFudCBpbnRlZ3JhbCBleHByZXNzaW9uIiAoUHJlcHJvY2Vzc29yLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJ2b2lkIGNvbmRpdGlvbiBmb3IgYSAjaWYvI2VsaWYiIChQcmVwcm9jZXNzb3IsIEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gInZvaWQgY29uZGl0aW9uIChhZnRlciBleHBhbnNpb24pIGZvciBhICNpZi8jZWxpZiIgKFByZXByb2Nlc3NvciwgRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCitAaXRlbSAiaW52YWxpZCAnI2luY2x1ZGUnIiAoUHJlcHJvY2Vzc29yLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJtYWNybyBleHBhbnNpb24gZGlkIG5vdCBwcm9kdWNlIGEgdmFsaWQgZmlsZW5hbWUgZm9yICNpbmNsdWRlIiAoUHJlcHJvY2Vzc29yLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJmaWxlICclcycgbm90IGZvdW5kIiAoUHJlcHJvY2Vzc29yLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJub3QgYSB2YWxpZCBudW1iZXIgZm9yICNsaW5lIiAoUHJlcHJvY2Vzc29yLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJub3QgYSB2YWxpZCBmaWxlbmFtZSBmb3IgI2xpbmUiIChQcmVwcm9jZXNzb3IsIEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gInJvZ3VlICcjJyIgKFByZXByb2Nlc3NvciwgRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCitAaXRlbSAicm9ndWUgI2Vsc2UiIChQcmVwcm9jZXNzb3IsIEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gInJvZ3VlICNlbGlmIiAoUHJlcHJvY2Vzc29yLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJ1bm1hdGNoZWQgI2VuZGlmIiAoUHJlcHJvY2Vzc29yLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJ1bmtub3duIGNwcCBkaXJlY3RpdmUgJyMlcyciIChQcmVwcm9jZXNzb3IsIEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gInVudGVybWluYXRlZCAjaWYgY29uc3RydWN0aW9uIiAoUHJlcHJvY2Vzc29yLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJjb3VsZCBub3QgZmx1c2ggb3V0cHV0IChkaXNrIGZ1bGwgPykiIChQcmVwcm9jZXNzb3IsIEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gInRydW5jYXRlZCB0b2tlbiIgKFByZXByb2Nlc3NvciwgRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCitAaXRlbSAiaWxsZWdhbCBjaGFyYWN0ZXIgJyVjJyIgKFByZXByb2Nlc3NvciwgRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCitAaXRlbSAidW5maW5pc2hlZCBzdHJpbmcgYXQgZW5kIG9mIGxpbmUiIChQcmVwcm9jZXNzb3IsIEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gIm1pc3NpbmcgbWFjcm8gbmFtZSIgKFByZXByb2Nlc3NvciwgRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCitAaXRlbSAidHJ5aW5nIHRvIHJlZGVmaW5lIHRoZSBzcGVjaWFsIG1hY3JvICVzIiAoUHJlcHJvY2Vzc29yLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJ0cnVuY2F0ZWQgbWFjcm8gZGVmaW5pdGlvbiIgKFByZXByb2Nlc3NvciwgRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCitAaXRlbSAiJy4uLicgbXVzdCBlbmQgdGhlIG1hY3JvIGFyZ3VtZW50IGxpc3QiIChQcmVwcm9jZXNzb3IsIEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gInZvaWQgbWFjcm8gYXJndW1lbnQiIChQcmVwcm9jZXNzb3IsIEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gIm1pc3NpbmcgY29tbWEgaW4gbWFjcm8gYXJndW1lbnQgbGlzdCIgKFByZXByb2Nlc3NvciwgRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCitAaXRlbSAiaW52YWxpZCBtYWNybyBhcmd1bWVudCIgKFByZXByb2Nlc3NvciwgRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCitAaXRlbSAiZHVwbGljYXRlIG1hY3JvIGFyZ3VtZW50IiAoUHJlcHJvY2Vzc29yLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICInX19WQV9BUkdTX18nIGlzIGZvcmJpZGRlbiBpbiBtYWNyb3Mgd2l0aCBhIGZpeGVkIG51bWJlciBvZiBhcmd1bWVudHMiIChQcmVwcm9jZXNzb3IsIEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gIm9wZXJhdG9yICcjIycgbWF5IG5laXRoZXIgYmVnaW4gbm9yIGVuZCBhIG1hY3JvIiAoUHJlcHJvY2Vzc29yLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJvcGVyYXRvciAnIycgbm90IGZvbGxvd2VkIGJ5IGEgbWFjcm8gYXJndW1lbnQiIChQcmVwcm9jZXNzb3IsIEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gIm1hY3JvICclcycgcmVkZWZpbmVkIHVuaWRlbnRpY2FsbHkiIChQcmVwcm9jZXNzb3IsIEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gIm5vdCBlbm91Z2ggYXJndW1lbnRzIHRvIG1hY3JvIiAoUHJlcHJvY2Vzc29yLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJ1bmZpbmlzaGVkIG1hY3JvIGNhbGwiIChQcmVwcm9jZXNzb3IsIEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gInRvbyBtYW55IGFyZ3VtZW50IHRvIG1hY3JvIiAoUHJlcHJvY2Vzc29yLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJvcGVyYXRvciAnIyMnIHByb2R1Y2VkIHRoZSBpbnZhbGlkIHRva2VuICclcyVzJyIgKFByZXByb2Nlc3NvciwgRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCitAaXRlbSAicXVhZCBzaGFycCIgKFByZXByb2Nlc3NvciwgRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCitAaXRlbSAidm9pZCBtYWNybyBuYW1lIiAoUHJlcHJvY2Vzc29yLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJtYWNybyAlcyBhbHJlYWR5IGRlZmluZWQiIChQcmVwcm9jZXNzb3IsIEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gInRyeWluZyB0byB1bmRlZiBzcGVjaWFsIG1hY3JvICVzIiAoUHJlcHJvY2Vzc29yLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJpbGxlZ2FsIG1hY3JvIG5hbWUgZm9yICNpZmRlZiIgKFByZXByb2Nlc3NvciwgRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCitAaXRlbSAidW5maW5pc2hlZCAjaWZkZWYiIChQcmVwcm9jZXNzb3IsIEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gImlsbGVnYWwgbWFjcm8gbmFtZSBmb3IgI3VuZGVmIiAoUHJlcHJvY2Vzc29yLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJ1bmZpbmlzaGVkICN1bmRlZiIgKFByZXByb2Nlc3NvciwgRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCitAaXRlbSAiaWxsZWdhbCBtYWNybyBuYW1lIGZvciAjaWZuZGVmIiAoUHJlcHJvY2Vzc29yLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJ1bmZpbmlzaGVkICNpZm5kZWYiIChQcmVwcm9jZXNzb3IsIEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gInJlY29uc3RydWN0aW9uIG9mIDxmb28+IGluICNpbmNsdWRlIiAoUHJlcHJvY2Vzc29yLCBXYXJuaW5nKQorCitAaXRlbSAiY29tbWVudCBpbiB0aGUgbWlkZGxlIG9mIGEgY3BwIGRpcmVjdGl2ZSIgKFByZXByb2Nlc3NvciwgV2FybmluZykKKworQGl0ZW0gIm51bGwgY3BwIGRpcmVjdGl2ZSIgKFByZXByb2Nlc3NvciwgV2FybmluZykKKworQGl0ZW0gInJvZ3VlICcjJyBpbiBjb2RlIGNvbXBpbGVkIG91dCIgKFByZXByb2Nlc3NvciwgV2FybmluZykKKworQGl0ZW0gInJvZ3VlICcjJyBkdW1wZWQiIChQcmVwcm9jZXNzb3IsIFdhcm5pbmcpCisKK0BpdGVtICIjZXJyb3IlcyIgKFByZXByb2Nlc3NvciwgQU5TSS12aW9sYXRpb24sIEVycm9yKQorCitAaXRlbSAidHJpZ3JhcGggPyIiPyVjIGVuY291bnRlcmVkIiAoUHJlcHJvY2Vzc29yLCBXYXJuaW5nKQorCitAaXRlbSAidW50ZXJtaW5hdGVkICNpZiBjb25zdHJ1Y3Rpb24gKGRlcHRoICVsZCkiIChQcmVwcm9jZXNzb3IsIEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gIm1hbGZvcm1lZCBpZGVudGlmaWVyIHdpdGggVUNOOiAnJXMnIiAoUHJlcHJvY2Vzc29yLCBXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gInRydW5jYXRlZCBVVEYtOCBjaGFyYWN0ZXIiIChQcmVwcm9jZXNzb3IsIFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCitAaXRlbSAiaWRlbnRpZmllciBub3QgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSBpbiAjZGVmaW5lIiAoUHJlcHJvY2Vzc29yLCBXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gImFzc2lnbm1lbnQgZGlzY2FyZHMgcmVzdHJpY3QiIChXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gInN0b3JhZ2UtY2xhc3MgaW4gZGVjbGFyYXRpb24gd2l0aGluIGZvcigpIGNvbnZlcnRlZCB0byBhdXRvIiAoV2FybmluZywgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJjb3JydXB0ZWQgc3BlY2lhbCBvYmplY3QiIChBTlNJLXZpb2xhdGlvbiwgRmF0YWwpCisKK0BpdGVtICI8aW5saW5lPiBvbmx5IGFsbG93ZWQgaW4gZnVuY3Rpb24gZGVjbGFyYXRpb25zIiAoRXJyb3IsIEFOU0ktdmlvbGF0aW9uKQorCitAaXRlbSAicmVmZXJlbmNlIHRvIHN0YXRpYyB2YXJpYWJsZSA8JXM+IGluIGlubGluZSBmdW5jdGlvbiB3aXRoIGV4dGVybmFsIGxpbmthZ2UiIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJ1bmRlcmZsb3cgb2YgcHJhZ21hIHBvcHdhcm4iIChFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJpbnZhbGlkIGFyZ3VtZW50IHRvIF9QcmFnbWEiIChQcmVwcm9jZXNzb3IsIEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gIm1pc3NpbmcgY29tbWEgYmVmb3JlICcuLi4nIiAoUHJlcHJvY2Vzc29yLCBFcnJvciwgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJwYWRkaW5nIGJ5dGVzIGJlaGluZCBtZW1iZXIgPCVzPiIgKFdhcm5pbmcpCisKK0BpdGVtICJtZW1iZXIgPCVzPiBkb2VzIG5vdCBoYXZlIG5hdHVyYWwgYWxpZ25tZW50IiAoV2FybmluZykKKworQGl0ZW0gImZ1bmN0aW9uIDwlcz4gZXhjZWVkcyAlcyBsaW1pdCIgKFdhcm5pbmcpCisKK0BpdGVtICIlcyBjb3VsZCBub3QgYmUgY2FsY3VsYXRlZCBmb3IgZnVuY3Rpb24gPCVzPiIgKFdhcm5pbmcpCisKK0BpdGVtICJvZmZzZXRvZiBhcHBsaWVkIHRvIG5vbi1zdHJ1Y3QiIChFcnJvciwgQU5TSS12aW9sYXRpb24pIAorCitAaXRlbSAidHJhaWxpbmcgZ2FyYmFnZSBpbiAjaWZkZWYiIChQcmVwcm9jZXNzb3IsIFdhcm5pbmcsIEFOU0ktdmlvbGF0aW9uKQorCitAaXRlbSAidG9vIG1hbnkgYXJndW1lbnRzIHRvIG1hY3JvIiAoUHJlcHJvY2Vzc29yLCBXYXJuaW5nLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gInRydW5jYXRlZCBjb21tZW50IiAoUHJlcHJvY2Vzc29yLCBXYXJuaW5nfEFOU0ktdmlvbGF0aW9uKQorCitAaXRlbSAidHJhaWxpbmcgZ2FyYmFnZSBpbiBwcmVwcm9jZXNzaW5nIGRpcmVjdGl2ZSIgKFByZXByb2Nlc3NvciwgV2FybmluZywgQU5TSS12aW9sYXRpb24pCisKK0BpdGVtICJ2YXJpYWJsZS1sZW5ndGggYXJyYXkgbXVzdCBoYXZlIGF1dG8gc3RvcmFnZS1jbGFzcyIgKEVycm9yLCBBTlNJLXZpb2xhdGlvbikKKworQGl0ZW0gIm1lbWJlciA8JXM+IGhhcyB0eXBlIHdpdGggemVybyBhbGlnbm1lbnQvc2l6ZSAocHJvYmFibHkgdm9pZCkiIChFcnJvciwgQU5TSS12aW9sYXRpb24sIEZhdGFsKQorCitAaXRlbSAic3RhY2sgaW5mb3JtYXRpb24gZm9yIHRhcmdldCA8JXM+IHVuYXZhaWxhYmxlIiAoV2FybmluZykKKworQGl0ZW0gInVzZWQgcmVnaXN0ZXJzIGluZm9ybWF0aW9uIHVuYXZhaWxhYmxlIGZvciB0YXJnZXQgPCVzPiIgKFdhcm5pbmcpCisKK0BpdGVtICJjb21wdXRlZCAlc3N0YWNrIHVzYWdlICVkIGJ1dCBzZXQgdG8gJWQiIChXYXJuaW5nKQorCitAaXRlbSAidW5hYmxlIHRvIGNvbXB1dGUgY2FsbCB0YXJnZXRzIiAoV2FybmluZykKKworQGl0ZW0gImNvbXB1dGVkIHJlZ2lzdGVyIHVzYWdlIGRpZmZlcnMgZnJvbSBzcGVjaWZpZWQgb25lIiAoV2FybmluZykKKworQGl0ZW0gInRyYWlsaW5nIGdhcmJhZ2UgaW4gI2luY2x1ZGUiIChQcmVwcm9jZXNzb3IsIFdhcm5pbmcgLEFOU0ktdmlvbGF0aW9uKQorCitAaXRlbSAidGFyZ2V0LXdhcm5pbmc6ICVzIiAoV2FybmluZykKKworQGl0ZW0gInRhcmdldC1lcnJvcjogJXMiIChFcnJvcikKZGlmZiAtLWdpdCBhL2RvYy9pbnRlcmZhY2UudGV4aSBiL2RvYy9pbnRlcmZhY2UudGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjQ4ODMzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2ludGVyZmFjZS50ZXhpCkBAIC0wLDAgKzEsMjgzMCBAQAorCitAc2VjdGlvbiBJbnRyb2R1Y3Rpb24KKworVGhpcyBjaGFwdGVyIGlzIHVuZGVyIGNvbnN0cnVjdGlvbiEKKworICAgIAorCitUaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIHNvbWUgb2YgdGhlIGludGVybmFscyBvZiBAY29tbWFuZHt2YmNjfQorIGFuZCB0cmllcyB0byBleHBsYWluCit3aGF0IGhhcyB0byBiZSBkb25lIHRvIHdyaXRlIGEgY29kZSBnZW5lcmF0b3IgZm9yIEBjb21tYW5ke3ZiY2N9LgorSG93ZXZlciBpZiBzb21lb25lIHdhbnRzIHRvIHdyaXRlIG9uZSwgSSBzdWdnZXN0IHRvIGNvbnRhY3QgbWUgZmlyc3QsCitzbyB0aGF0IGl0IGNhbiBiZSBpbnRlZ3JhdGVkIGludG8gdGhlIHNvdXJjZSB0cmVlLgorCitZb3UgaGF2ZSB0byBjcmVhdGUgYSBuZXcgZGlyZWN0b3J5IGZvciB0aGUgbmV3IHRhcmdldCBuYW1lZAorQGZpbGV7bWFjaGluZXMvPHRhcmdldC1uYW1lPn0gYW5kIHdyaXRlIHRoZSBmaWxlcyBAZmlsZXttYWNoaW5lLmN9LCAKK0BmaWxle21hY2hpbmUuaH0KK2FuZCBAZmlsZXttYWNoaW5lLmR0fS4gVGhlIGNvbXBpbGVyIGZvciB0aGlzIHRhcmdldCB3aWxsIGJlIGNhbGxlZAorQGNvbW1hbmR7dmJjYzx0YXJnZXQtbmFtZT59IGFuZCBjYW4gYmUgYnVpbHQgZG9pbmcgYQorQGNvbW1hbmR7bWFrZSBUQVJHRVQ9PHRhcmdldC1uYW1lPiBiaW4vdmJjYzx0YXJnZXQtbmFtZT59LgorCitGcm9tIG5vdyBvbiBpbnRlZ2VyIG1lYW5zIGFueSBvZiBAY29kZXtjaGFyLCBzaG9ydCwgaW50LCBsb25nLCBsb25nIGxvbmd9IG9yIHRoZWlyCit1bnNpZ25lZCBjb3V0ZXJwYXJ0cy4gQXJpdGhtZXRpYyBtZWFucyBpbnRlZ2VyIG9yIEBjb2Rle2Zsb2F0fSBvciAKK0Bjb2Rle2RvdWJsZX0gb3IgQGNvZGV7bG9uZyBkb3VibGV9LgorRWxlbWVudGFyeSB0eXBlIG1lYW5zIGFyaXRobWV0aWMgb3IgcG9pbnRlci4KKworTm90ZSB0aGF0IHRoaXMgZG9jdW1lbnRhdGlvbiBtYXkgbWVudGlvbiBleHBsaWNpdCB2YWx1ZXMgd2hlbiBpbnRyb2R1Y2luZworc3ltYm9saWMgY29uc3RhbnRzLiBUaGlzIGlzIGR1ZSB0byBjb3B5aW5nIGFuZCBwYXN0aW5nIGZyb20gdGhlIHNvdXJjZQorY29kZS4gVGhlc2UgdmFsdWVzIG1heSBub3QgYmUgdXAgdG8gZGF0ZSBhbmQgaW4gc29tZSBjYXNlcyBjYW4gYmUgb3ZlcnJpZGRlbi4KK1RoZXJlZm9yZSBkbyBuZXZlciB1c2UgdGhlIGFic29sdXRlIHZhbHVlcyBidXQgcmF0aGVyIHRoZSBzeW1ib2xpYworcmVwcmVzZW50YXRpb25zLgorCisKK0BzZWN0aW9uIEJ1aWxkaW5nIHZiY2MKKworVGhpcyBzZWN0aW9uIGRlYWxzIHdpdGggdGhlIHN0ZXBzIG5lY2Vzc2FyeSB0byBidWlsZCB0aGUgdHlwaWNhbAorQGNvbW1hbmR7dmJjY30gZXhlY3V0YWJsZXMgZnJvbSB0aGUgc291cmNlcy4KKworQHN1YnNlY3Rpb24gRGlyZWN0b3J5IFN0cnVjdHVyZQorCisgICAgVGhlIHZiY2MtZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgaW1wb3J0YW50IGZpbGVzIGFuZAorICAgIGRpcmVjdG9yaWVzOgorQHRhYmxlIEBmaWxlCitAaXRlbSAgICB2YmNjLworVGhlIG1haW4gZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGNvbXBpbGVyIHNvdXJjZXMuCisKK0BpdGVtICAgIHZiY2MvTWFrZWZpbGUKK1RoZSBNYWtlZmlsZSB1c2VkIHRvIGJ1aWxkIEBjb21tYW5ke3ZiY2N9LgorCitAaXRlbSAgICB2YmNjL2Zyb250ZW5kLworRGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNvdXJjZSB0byBAY29tbWFuZHt2Y30sIHRoZSBjb21waWxlciBkcml2ZXIuCisKK0BpdGVtICAgIHZiY2MvbWFjaGluZXMvPHRhcmdldD4vCitEaXJlY3RvcnkgZm9yIHRoZSBAY29kZXs8dGFyZ2V0Pn0gYmFja2VuZC4KKworQGl0ZW0gICAgdmJjYy9tYWNoaW5lcy91Y3BwLworRGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGJ1aWx0aW4gcHJlcHJvY2Vzc29yLgorCitAaXRlbSAgICB2YmNjL3ZzYy8KK0RpcmVjdG9yeSBjb250YWluaW5nIHNvdXJjZSB0byBAY29tbWFuZHt2c2N9LCB0aGUgaW5zdHJ1Y3Rpb24gc2NoZWR1bGVyLgorCitAaXRlbSAgICB2YmNjL2Jpbi8KK0RpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZXMgd2lsbCBiZSBwbGFjZWQgaW4uCitAZW5kIHRhYmxlCisKKyAgICBBbGwgY29tcGlsaW5nIGlzIGRvbmUgZnJvbSB0aGUgbWFpbiBkaXJlY3RvcnkuCisgICAgVGhlIGZyb250ZW5kIEBjb21tYW5ke3ZjfQorIGlzIG5vdCB0YXJnZXQtZGVwZW5kZW5kIGFuZCB0aGVyZWZvcmUgb25seSBvbmUgdmVyc2lvbgorICAgIGlzIGNyZWF0ZWQuCisKKyAgICBFdmVyeSBhdmFpbGFibGUgdGFyZ2V0IGhhcyBhdCBsZWFzdCBvbmUgc3ViZGlyZWN0b3J5IHdpdGggaXRzIG5hbWUgaW4KKyAgICBAZmlsZXt2YmNjL21hY2hpbmVzfSBhbmQgY29udGFpbnMgYXQgbGVhc3QgdGhlIGZpbGVzIAorQGZpbGV7bWFjaGluZS5ofSwgQGZpbGV7bWFjaGluZS5jfSBhbmQKKyAgICBAZmlsZXttYWNoaW5lLmR0fS4gVGFyZ2V0LXNwZWNpZmljIG9iamVjdC1maWxlcyB3aWxsIGFsc28gYmUgc3RvcmVkIGluIHRoYXQKKyAgICBkaXJlY3RvcnkuCisKKyAgICBUaGUgZXhlY3V0YWJsZXMgd2lsbCBiZSBwbGFjZWQgaW4gQGZpbGV7dmJjYy9iaW4vfS4gVGhlIG1haW4gY29tcGlsZXIgd2lsbAorICAgIGJlIGNhbGxlZCBAY29tbWFuZHt2YmNjPHRhcmdldD59LgorCisKK0BzdWJzZWN0aW9uIEFkYXB0aW5nIHRoZSBNYWtlZmlsZQorCisgICAgQmVmb3JlIGJ1aWxkaW5nIGFueXRoaW5nIHlvdSBoYXZlIHRvIGluc2VydCBjb3JyZWN0IHZhbHVlcyBmb3IKKyAgICBAY29kZXtDQywgTkNDLCBMREZMQUdTfSBhbmQgQGNvZGV7TkxERkxBR1N9IGluIHRoZSBAZmlsZXtNYWtlZmlsZX0uCisKK0B0YWJsZSBAY29kZQorICAgIEBpdGVtIENDCisgICAgICAgSGVyZSB5b3UgaGF2ZSB0byBpbnNlcnQgYSBjb21tYW5kIHRoYXQgaW52b2tlcyBhbiBBTlNJIEMKKyAgICAgICAgICAgICBjb21waWxlciB5b3Ugd2FudCB0byB1c2UgdG8gYnVpbGQgdmJjYy4gSXQgbXVzdCBzdXBwb3J0CisgICAgICAgICAgICAgQG9wdGlvbnstRH0sIEBvcHRpb257LUl9LCBAb3B0aW9uey1jfSBhbmQgQG9wdGlvbnstb30KKyAgICAgICAgICAgICAgICAgdGhlIHNhbWUgbGlrZSBlLmcuIEBjb21tYW5ke3ZjfSBvciBAY29tbWFuZHtnY2N9LgorICAgICAgICAgICAgIEFkZGl0aW9uYWwgb3B0aW9ucyBzaG91bGQgYWxzbyBiZSBpbnNlcnRlZCBoZXJlLiBFLmcuIGlmIHlvdQorICAgICAgICAgICAgIGFyZSBjb21waWxpbmcgZm9yIHRoZSBBbWlnYSB3aXRoIEBjb21tYW5ke3ZiY2N9IHlvdSBzaG91bGQgYWRkIAorICAgICAgICAgICAgICAgIEBvcHRpb257LURBTUlHQX0uCisKKyAgICBAaXRlbSBMREZMQUdTIAorICAgICAgICAgSGVyZSB5b3UgaGF2ZSB0byBhZGQgb3B0aW9ucyB3aGljaCBhcmUgbmVjZXNzYXJ5IGZvciBsaW5raW5nLgorICAgICAgICAgICAgIEUuZy4gc29tZSBjb21waWxlcnMgbmVlZCBzcGVjaWFsIGxpYnJhcmllcyBmb3IgZmxvYXRpbmctcG9pbnQuCisKKyAgICBAaXRlbSBOQ0MKKyAgICBAaXRlbXggTkxERkxBR1MKKyAgICBUaGVzZSBhcmUgc2ltaWxhciB0byBAY29kZXtDQ30gYW5kIEBjb2Rle0xERkxBR1N9IGJ1dCB0aGV5IG11c3QgYWx3YXlzCisgICAgZGVzY3JpYmUgYSBuYXRpdmUgY29tcGlsZXIsIGkuZS4gUHJvZ3JhbXMgY29tcGlsZWQgd2l0aCBAY29kZXtOQ0MvTkxERkxBR1N9CisgICAgbXVzdCBiZSBleGVjdXRhYmxlIG9uIHRoZSBob3N0IHN5c3RlbS4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBkdXJpbmcKKyAgICB0aGUgYnVpbGQgcHJvZ3JhbXMgbWF5IGhhdmUgdG8gYmUgZXhlY3V0ZWQgb24gdGhlIGhvc3QuCitAZW5kIHRhYmxlCisKKyAgICBBbiBleGFtcGxlIGZvciB0aGUgQW1pZ2EgdXNpbmcgQGNvbW1hbmR7dmJjY30gd291bGQgYmU6CitAZXhhbXBsZQorICAgICAgQ0MgPSB2YyAtREFNSUdBIC1jOTkKKyAgICAgIExERkxBR1MgPSAtbG1pZWVlCisgICAgICBOQ0MgPSAkKENDKQorICAgICAgTkxERkxBR1MgPSAkKExERkxBR1MpCitAZW5kIGV4YW1wbGUKKworICAgIEFuIGV4YW1wbGUgZm9yIGEgdHlwaWNhbCBVbml4LWluc3RhbGxhdGlvbiB3b3VsZCBiZToKK0BleGFtcGxlCisgICAgICBDQyA9IGNjCisgICAgICBMREZMQUdTID0gLWxtCisgICAgICBOQ0MgPSAkKENDKQorICAgICAgTkxERkxBR1MgPSAkKExERkxBR1MpCitAZW5kIGV4YW1wbGUKKworVGhlIGZvbGxvd2luZyBzZXR0aW5ncyBhcmUgcHJvYmFibHkgbmVjZXNzYXJ5IGZvciBPcGVuL0ZyZWUvQW55IEJTRCBpMzg2IHN5c3RlbXM6CitAZXhhbXBsZQorICAgICAgQ0MgPSBnY2MgLURfQU5TSV9TT1VSQ0UKKyAgICAgIExERkxBR1MgPSAtbG0KKyAgICAgIE5DQyA9ICQoQ0MpCisgICAgICBOTERGTEFHUyA9ICQoTERGTEFHUykKK0BlbmQgZXhhbXBsZQorCisKK0BzdWJzZWN0aW9uIEJ1aWxkaW5nIHZjCisKK05vdGUgdG8gdXNlcnMgb2YgT3Blbi9GcmVlL0FueSBCU0QgaTM4NiBzeXN0ZW1zOiBZb3Ugd2lsbCBwcm9iYWJseSBoYXZlIHRvIHVzZQorR05VIG1ha2UgaW5zdGVhZCBvZiBCU0QgbWFrZSwgaS5lLiBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGVzIHJlcGxhY2UgIm1ha2UiCit3aXRoICJnbWFrZSIuCisKKyAgICBUeXBlOgorQGV4YW1wbGUKKyAgICAgIG1ha2UgYmluL3ZjCitAZW5kIGV4YW1wbGUKKworQHN1YnNlY3Rpb24gQnVpbGRpbmcgdnNjCisKKyAgICBUeXBlOgorQGV4YW1wbGUKKyAgICAgIG1ha2UgVEFSR0VUPTx0YXJnZXQ+IGJpbi92c2M8dGFyZ2V0PgorQGVuZCBleGFtcGxlCisgICAgRm9yIGV4YW1wbGU6CitAZXhhbXBsZQorICAgICAgbWFrZSBUQVJHRVQ9YWxwaGEgYmluL3ZzY2FscGhhCitAZW5kIGV4YW1wbGUKKworICAgIE9taXQgdGhpcyBzdGVwIGlmIHRoZXJlIGlzIG5vIGZpbGUgQGZpbGV7bWFjaGluZXMvPHRhcmdldD4vc2NoZWR1bGUuY30uCisKKworQHN1YnNlY3Rpb24gQnVpbGRpbmcgdmJjYworCisgICAgVHlwZToKKworQGV4YW1wbGUKKyAgICAgIG1ha2UgVEFSR0VUPTx0YXJnZXQ+IGJpbi92YmNjPHRhcmdldD4KK0BlbmQgZXhhbXBsZQorRm9yIGV4YW1wbGU6CitAZXhhbXBsZQorICAgICAgbWFrZSBUQVJHRVQ9YWxwaGEgYmluL3ZiY2NhbHBoYQorQGVuZCBleGFtcGxlCisKKyAgICBEdXJpbmcgdGhlIGJ1aWxkIHRoZSBwcm9ncmFtIEBjb21tYW5ke2R0Z2VufSB3aWxsIGJlIGdlbmVyYXRlZCBhbmQgZXhlY3V0ZWQgb24KKyAgICB0aGUgaG9zdC1zeXN0ZW0uIEZpcnN0IGl0IHdpbGwgYXNrIHlvdSB3aGV0aGVyIHlvdSBhcmUgYnVpbGRpbmcgYQorICAgIGNyb3NzLWNvbXBpbGVyLgorCisgICAgQW5zd2VyIEBjb2Rle3l9IG9ubHkgaWYgeW91IGFyZSBidWlsZGluZyBhIGNyb3NzLWNvbXBpbGVyIChpLmUuIGEgY29tcGlsZXIKKyAgICB3aGljaCBkb2VzIG5vdCBwcm9kdWNlIGNvZGUgZm9yIHRoZSBzYW1lIG1hY2hpbmUgaXQgaXQgcnVubmluZyBvbikuCisKKyAgICBOb3RlIHRoYXQgaXQgZG9lcyBfbm90XyBtYXR0ZXIgaWYgeW91IGFyZSBjcm9zcy1idWlsZGluZyBhIGNvbXBpbGVyLAorICAgIGkuZS4gaWYgeW91IGFyZSBydW5uaW5nIG9uIHN5c3RlbSBBIGFuZCBidWlsZGluZyBhIEItPkIgY29tcGlsZXIKKyAgICBieSB1c2luZyBhbiBBLT5CIGNvbXBpbGVyIHRoZW4geW91IGNhbiBhbnN3ZXIgQGNvZGV7bn0uCisKKyAgICBJZiB5b3UgYW5zd2VyZWQgQGNvZGV7eX0geW91IHdpbGwgYmUgYXNrZWQgaWYgeW91ciBzeXN0ZW0vY29tcGlsZXIgb2ZmZXJzCisgICAgY2VydGFpbiBkYXRhdHlwZXMuIFRoaXMgcmVmZXJzIHRvIHRoZSBjb21waWxlciB5b3UgZGVzY3JpYmVkIHdpdGgKKyAgICBDQyBpbiB0aGUgTWFrZWZpbGUuCisgICAgRS5nLiBpZiBAY29kZXtDQ30gaXMgYW4gQS0+QiBjcm9zcy1jb21waWxlciB5b3UgaGF2ZSB0byBhbnN3ZXIgdGhlIHF1ZXN0aW9ucworICAgIGFjY29yZGluZyB0byBCLgorICAgIFRvIGVhY2ggcXVlc3Rpb24gYW5zd2VyIEBjb2Rle3l9IG9yIEBjb2Rle259IGRlcGVuZGluZyBpZiBzdWNoIGEgZGF0YXR5cGUgaXMKKyAgICBhdmFpbGFibGUgb24gdGhhdCBjb21waWxlci4gSWYgeW91IGFuc3dlcmVkIEBjb2Rle3l9IHlvdSBoYXZlIHRvIHR5cGUgaW4KKyAgICB0aGUgbmFtZSBvZiB0aGF0IHR5cGUgb24gdGhlIGNvbXBpbGVyIChlLmcuIEBjb2Rle3NpZ25lZCBpbnR9LAorICAgIEBjb2Rle3Vuc2lnbmVkIGNoYXJ9IGV0Yy4pLgorICAgIElmIHRoZXJlIGFyZSBub3QgZW5vdWdoIGRhdGF0eXBlcyBhdmFpbGFibGUgdG8gYnVpbGQgQGNvbW1hbmR7dmJjY30KKyAgICBhbiBlcnJvcgorICAgIG1lc3NhZ2Ugd2lsbCBiZSBwcmludGVkIGFuZCB0aGUgYnVpbGQgYWJvcnRzLgorCisKK0BzdWJzZWN0aW9uIENvbmZpZ3VyaW5nCisKKyAgICBDb25zdWx0IHRoZSBAY29tbWFuZHt2YmNjfS1kb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBvbgorICAgIGhvdyB0byBjcmVhdGUgdGhlIG5lY2Vzc2FyeSBjb25maWctZmlsZXMuCisKKworQHN1YnNlY3Rpb24gQnVpbGRpbmcgQ3Jvc3MtQ29tcGlsZXJzCisKKyAgICBBcyB0aGVyZSBpcyBvZnRlbiBjb25mdXNpb24gd2hlbiBpdCBjb21lcyB0byBjcm9zcy1idWlsZGluZyBjb21waWxlcnMKKyAgICBvciBidWlsZGluZyBjcm9zcy1jb21waWxlcnMsIGhlcmUgaXMgd2hhdCBoYXMgdG8gYmUgZG9uZSB0byBjcm9zcy1idWlsZAorICAgIGEgQi0+QyBjcm9zcy1jb21waWxlciBvbiBzeXN0ZW0gQSB3aXRoIG9ubHkgYSBuYXRpdmUgQS0+QSBjb21waWxlcgorICAgIGF2YWlsYWJsZS4KKworICAgIFRoaXMgaXMgZG9uZSBieSBmaXJzdCBidWlsZGluZyBhbiBBLT5CIGNvbXBpbGVyIGFuZCB0aGVuIGNyb3NzLWJ1aWxkaW5nCisgICAgdGhlIEItPkMgY29tcGlsZXIgdXNpbmcgdGhlIEEtPkIgY29tcGlsZXIuCisKKyAgICBGb3IgdGhlIGZpcnN0IHN0ZXAgeW91IHVzZSB0aGUgQS0+QSBjb21waWxlciBmb3IgQGNvZGV7Q0N9IGFzIHdlbGwgYXMKKyAgICAgICAgQGNvZGV7TkNDfS4KKyAgICBOb3cgeW91IHR5cGU6CitAZXhhbXBsZQorICAgICAgbWFrZSBiaW4vdmMKKyAgICAgIG1ha2UgVEFSR0VUPUIgYmluL3ZzY0IgICAjIG9taXQgaWYgdGhlcmUgaXMgbm8gbWFjaGluZXMvQi9zY2hlZHVsZS5jCisgICAgICBtYWtlIFRBUkdFVD1CIGJpbi92YmNjQgorQGVuZCBleGFtcGxlCisKKyAgICBUaGUgcXVlc3Rpb25zIGFib3V0IGRhdGF0eXBlcyBhcmUgYW5zd2VyZWQgYWNjb3JkaW5nIHRvIEEuCisgICAgVGhlbiB5b3Ugc2hvdWxkIHdyaXRlIGEgQGZpbGV7dmMuY29uZmlnfSBmb3IgdGhlIEBjb2Rle3ZiY2NCfQorIGNyb3NzLWNvbXBpbGVyLgorCisgICAgTm93IGNyZWF0ZSBhIHNlY29uZCBkaXJlY3RvcnkgY29udGFpbmluZyBhbGwgdGhlIHNvdXJjZXMgdG8gQGNvbW1hbmR7dmJjY30KKyBhbmQKKyAgICBzZXQgQGNvZGV7Q0MvTERGTEFHU30gdG8gQGNvbW1hbmR7dmN9IHVzaW5nIHRoZSBjb25maWctZmlsZSBmb3IgdmJjY0IgYW5kCisgICAgICAgIEBjb2Rle05DQy9OTERGTEFHU30KKyAgICB0byB0aGUgQS0+QSBjb21waWxlci4gVHlwZToKK0BleGFtcGxlCisgICAgICBtYWtlIGJpbi92YworICAgICAgbWFrZSBUQVJHRVQ9QyBiaW4vdnNjQyAgICMgb21pdCBpZiB0aGVyZSBpcyBubyBtYWNoaW5lcy9DL3NjaGVkdWxlLmMKKyAgICAgIG1ha2UgVEFSR0VUPUMgYmluL3ZiY2NDCitAZW5kIGV4YW1wbGUKKworCisKK0BzZWN0aW9uIFRoZSBJbnRlcm1lZGlhdGUgQ29kZQorCitAY29tbWFuZHt2YmNjfSB3aWxsIGdlbmVyYXRlIGludGVybWVkaWF0ZSBjb2RlIGZvciBldmVyeSBmdW5jdGlvbiBhbmQgcGFzcwordGhpcyBjb2RlIHRvIHRoZSBjb2RlIGdlbmVyYXRvciB3aGljaCBoYXMgdG8gY29udmVydCBpdCBpbnRvIHRoZSBkZXNpcmVkIG91dHB1dC4KKworSW4gdGhlIGZ1dHVyZSB0aGVyZSBtYXkgYmUgYSBjb2RlIGdlbmVyYXRvciBnZW5lcmF0b3Igd2hpY2ggcmVhZHMgYSBtYWNoaW5lCitkZXNjcmlwdGlvbiBmaWxlIGFuZCBnZW5lcmF0ZXMgYSBjb2RlIGdlbmVyYXRvciBmcm9tIHRoYXQsIGJ1dCBpdCBpcyBub3QKK2NsZWFyIHdoZXRoZXIgdGhpcyBjb3VsZCBzaW1wbGlmeSBtdWNoIHdpdGhvdXQgdGFraW5nIHBlbmFsdGllcyBpbiB0aGUKK2dlbmVyYXRlZCBjb2RlLgorQW55d2F5LCB0aGlzIHdvdWxkIGJlIGEgbGF5ZXIgb24gdG9wIG9mIHRoZSBjdXJyZW50IGludGVyZmFjZSB0byB0aGUgY29kZQorZ2VuZXJhdG9yLCBzbyB0aGF0IHRoZSBpbnRlcmZhY2UgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQgd291bGQgc3RpbGwgYmUKK3ZhbGlkIGFuZCBhY2Nlc3NpYmxlLgorCitAc3Vic2VjdGlvbiBHZW5lcmFsIEZvcm1hdAorCitUaGUgaW50ZXJtZWRpYXRlIGNvZGUgaXMgcmVwcmVzZW50ZWQgYXMgYSBkb3VibHkgbGlua2VkIGxpc3Qgb2YgcXVhZHJ1cGxlcworKEkgYW0gY2FsbGluZyB0aGVtIElDcyBmcm9tIG5vdyBvbikgY29uc2lzdGluZyBtYWlubHkgb2YgYW4gb3BlcmF0b3IsIHR3bworc291cmNlIG9wZXJhbmRzIGFuZCBhIHRhcmdldC4gVGhleSBhcmUgcmVwcmVzZW50ZWQgbGlrZSB0aGlzOgorCitAZXhhbXBsZQorCitzdHJ1Y3QgSUNAeworICAgIHN0cnVjdCBJQyAqcHJldjsKKyAgICBzdHJ1Y3QgSUMgKm5leHQ7CisgICAgaW50IGNvZGU7CisgICAgaW50IHR5cGY7CisgICAgaW50IHR5cGYyOworICAgIFsuLi5dCisgICAgc3RydWN0IG9iaiBxMTsKKyAgICBzdHJ1Y3Qgb2JqIHEyOworICAgIHN0cnVjdCBvYmogejsKKyAgICBbLi4uXQorICAgIHN0cnVjdCBleHRfaWMgZXh0OyAgLyogb3B0aW9uYWwgKi8KK0B9OworQGVuZCBleGFtcGxlCisKK1RoZSBvbmx5IG1lbWJlcnMgcmVsZXZhbnQgdG8gdGhlIGNvZGUgZ2VuZXJhdG9yIGFyZQorQGNvZGV7cHJldiwgbmV4dCwgY29kZSwgdHlwZiwgdHlwZjIsIHExLCBxMiwgen0gYW5kIChvcHRpb25hbGx5KSBAY29kZXtleHRfaWN9LgorCitAY29kZXtwcmV2fSBhbmQgQGNvZGV7bmV4dH0gYXJlIHBvaW50ZXJzIHRvIHRoZSBwcmV2aW91cyBhbmQgbmV4dCBJQy4KK1RoZSBmaXJzdCBJQyBoYXMgQGNvZGV7cHJldj09MH0gYW5kIHRoZSBsYXN0IG9uZSBoYXMgQGNvZGV7bmV4dD09MH0uCisKK0Bjb2Rle3R5cGZ9IGFuZCBAY29kZXt0eXBmMn0gYXJlIHRoZSB0eXBlIG9mIHRoZSBvcGVyYW5kcyBvZiB0aGlzIElDLgorSW4gbW9zdCBJQ3MgYWxsIG9wZXJhbmRzIGhhdmUgdGhlIHNhbWUgdHlwZSBhbmQgdGhlcmVmb3JlIG9ubHkgQGNvZGV7dHlwZn0KK2lzIHVzZWQuIEhvd2V2ZXIsIHNvbWUgSUNzIGhhdmUgb3BlcmFuZHMgb2YgZGlmZmVyZW50IHR5cGVzIChlLmcuCitjb252ZXJ0aW5nIGFuIG9wZXJhbmQgdG8gYW5vdGhlciB0eXBlIG9yIGFkZGluZyBhbiBpbnRlZ2VyIHRvIGEgcG9pbnRlcikuCitAY29kZXt0eXBmMn0gaXMgdXNlZCBpbiB0aGVzZSBjYXNlcy4KKworTWFjcm9zIGFyZSBwcm92aWRlZCB3aGljaCB5aWVsZCB0aGUgdHlwZSBvZiBhbiBvcGVyYW5kLgorQGNvZGV7cTF0eXAoKSwgcTJ0eXAoKX0gYW5kIEBjb2Rle3p0eXAoKX0gcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBmaXJzdCBzb3VyY2UKK29wZXJhbmQsIHRoZSBzZWNvbmQgc291cmNlIG9wZXJhbmQgYW5kIHRoZSBkZXN0aW5hdGlvbiwgcmVzcGVjdGl2ZWx5LgorVGhleSBoYXZlIHRvIGJlIHBhc3NlZCBhIHBvaW50ZXIgdG8gYSB2YWxpZCBJQyBhcyBhcmd1bWVudC4gVGhlIHJlc3VsdHMgYXJlCit1bmRlZmluZWQgaWYgdGhlIElDIGRvZXMgbm90IGNvbnRhaW4gdGhlIHNwZWNpZmllZCBvcGVyYW5kIChlLmcuIEBjb2Rle3EydHlwKCl9Citmb3IgYW4gSUMgd2l0aCBvbmx5IGEgc2luZ2xlIG9wZXJhbmQpLgorCitUaGUgc3RhbmRhcmQgdHlwZXMgd2hpY2ggYXJlIGRlZmluZWQgYnkgZGVmYXVsdCBhcmU6CisKK0BleGFtcGxlCisgICAgI2RlZmluZSBDSEFSIAorICAgICNkZWZpbmUgU0hPUlQgCisgICAgI2RlZmluZSBJTlQgCisgICAgI2RlZmluZSBMT05HIAorICAgICNkZWZpbmUgTExPTkcKKyAgICAjZGVmaW5lIEZMT0FUIAorICAgICNkZWZpbmUgRE9VQkxFIAorICAgICNkZWZpbmUgTERPVUJMRQorICAgICNkZWZpbmUgVk9JRCAKKyAgICAjZGVmaW5lIFBPSU5URVIgCisgICAgI2RlZmluZSBBUlJBWSAKKyAgICAjZGVmaW5lIFNUUlVDVCAKKyAgICAjZGVmaW5lIFVOSU9OIAorICAgICNkZWZpbmUgRU5VTSAgICAgICAgICAvKiAgbm90IHJlbGV2YW50IGZvciBjb2RlIGdlbmVyYXRvciAgICAgKi8KKyAgICAjZGVmaW5lIEZVTktUIAorQGVuZCBleGFtcGxlCisKKyAgICBhbmQgY2FuIGJlIGFkZGl0aW9uYWxseSBvcidlZCBieQorCitAZXhhbXBsZQorICAgICNkZWZpbmUgVU5TSUdORUQKKyAgICAjZGVmaW5lIENPTlNUCisgICAgI2RlZmluZSBWT0xBVElMRQorICAgICNkZWZpbmUgVU5DT01QTEVURQorQGVuZCBleGFtcGxlCisKKyAgICBIb3dldmVyLCBvbmx5IEBjb2Rle1VOU0lHTkVEfSBpcyBvZiByZWFsIGltcG9ydGFuY2UgZm9yIHRoZSBjb2RlIGdlbmVyYXRvci4KKyAgICBAY29kZXt0eXBmJk5RfSB5aWVsZHMgdGhlIHR5cGUgd2l0aG91dCBhbnkgcXVhbGlmaWVycywgQGNvZGV7dHlwZiZOVX0KKyAgICB5aWVsZHMgdGhlIHR5cGUgd2l0aG91dCBhbnkgcXVhbGlmaWVycyBidXQgQGNvZGV7VU5TSUdORUR9LgorCitJdCBpcyBwb3NzaWJsZSBmb3IgYmFja2VuZHMgdG8gZGVmaW5lIGFkZGl0aW9uYWwgdHlwZXMuIEB4cmVme2V4dHR5cGVzfQorZm9yIGRvY3VtZW50YXRpb24gb24gaG93IHRvIGV4dGVuZCB0aGUgdHlwZSBzeXN0ZW0uCisKK0Bub2RlIG9wZXJhbmRzCitAc3Vic2VjdGlvbiBPcGVyYW5kcworCitAY29kZXtxMSwgcTJ9IGFuZCBAY29kZXt6fSBhcmUgdGhlIHNvdXJjZTEgKHF1ZWxsZTEgaW4gR2VybWFuKSwgc291cmNlMiBhbmQKK3RhcmdldCAoemllbCkgb3BlcmFuZHMsIHJlc3BlY3RpdmVseS4KK0lmIGEgcmVzdWx0IGhhcyB0byBiZSBjb21wdXRlZCwgaXQgYWx3YXlzIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBvYmplY3QgQGNvZGV7en0KK2FuZCB0aGUgb2JqZWN0cyBAY29kZXtxMX0gYW5kIEBjb2Rle3EyfSB1c3VhbGx5IG1heSBub3QgYmUgZGVzdHJveWVkIGR1cmluZwordGhpcyBvcGVyYXRpb24gKHVubGVzcyB0aGV5IGFyZSBhbGlhc2VkIHdpdGggdGhlIGRlc3RpbmF0aW9uKS4KKworVGhlIG9iamVjdHMgYXJlIGRlc2NyaWJlZCBieSB0aGlzIHN0cnVjdHVyZToKKworQGV4YW1wbGUKKworc3RydWN0IG9iakB7CisgICAgaW50IGZsYWdzOworICAgIGludCByZWc7CisgICAgaW50IGR0eXA7CisgICAgc3RydWN0IFZhciAqdjsKKyAgICBzdHJ1Y3QgQWRkcmVzc2luZ01vZGUgKmFtOworICAgIHVuaW9uIGF0eXBzQHsKKyAgICAgICAgemNoYXIgdmNoYXI7CisgICAgICAgIHpjaGFyIHZ1Y2hhcjsKKyAgICAgICAgenNob3J0IHZzaG9ydDsKKyAgICAgICAgenVzaG9ydCB2dXNob3J0OworICAgICAgICB6aW50IHZpbnQ7CisgICAgICAgIHp1aW50IHZ1aW50OworICAgICAgICB6bG9uZyB2bG9uZzsKKyAgICAgICAgenVsb25nIHZ1bG9uZzsKKyAgICAgICAgemxsb25nIHZsbG9uZzsKKyAgICAgICAgenVsbG9uZyB2dWxsb25nOworICAgICAgICB6bWF4IHZtYXg7CisgICAgICAgIHp1bWF4IHZ1bWF4OworICAgICAgICB6ZmxvYXQgdmZsb2F0OworICAgICAgICB6ZG91YmxlIHZkb3VibGU7CisgICAgICAgIHpsZG91YmxlIHZsZG91YmxlOworICAgIEB9IHZhbDsKK0B9OworCitAZW5kIGV4YW1wbGUKKworQGNvZGV7ZmxhZ3N9IHNwZWNpZmllcyB0aGUga2luZCBvZiBvYmplY3QuIEl0IGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mCisKK0B0YWJsZSBAY29kZQorCitAaXRlbSAjZGVmaW5lIEtPTlNUIDEKKyAgICBUaGUgb2JqZWN0IGlzIGEgY29uc3RhbnQuIEl0cyB2YWx1ZSBpcyBpbiB0aGUgY29ycmVzcG9uZGluZyAodG8KKyAgICAgICAgQGNvZGV7dHlwZn0gb3IgQGNvZGV7dHlwZjJ9KQorICAgIG1lbWJlciBvZiBAY29kZXt2YWx9LgorCitAaXRlbSAjZGVmaW5lIFZBUiAyCisgICAgVGhlIG9iamVjdCBpcyBhIHZhcmlhYmxlLiBUaGUgcG9pbnRlciB0byBpdHMgQGNvZGV7c3RydWN0IFZhcn0gaXMgaW4gCisgICAgQGNvZGV7dn0uIEBjb2Rle3ZhbC52bG9uZ30gdm9udGFpbnMgYW4gb2Zmc2V0IHRoYXQgaGFzIHRvIGJlIGFkZGVkIHRvIGl0LgorICAgIEZ1ciBmdXJ0aGVyIGRldGFpbHMsIEBweHJlZntWYXJpYWJsZXN9LgorCitAaXRlbSAjZGVmaW5lIERSRUZPQkogMzIKKyAgICBUaGUgY29udGVudCBvZiB0aGUgbG9jYXRpb24gaW4gbWVtb3J5IHRoZSBvYmplY3QgcG9pbnRzIHRvIGlzIHVzZWQuCisgICAgICAgIEBjb2Rle2R0eXB9IGNvbnRhaW5zIHRoZSB0eXBlIG9mIHRoZSBwb2ludGVyLiBJbiBzeXN0ZW1zIHdpdGgKKyAgICAgICAgb25seSBvbmUgcG9pbnRlciB0eXBlLCB0aGlzIHdpbGwgYWx3YXlzIGJlIEBjb2Rle1BPSU5URVJ9LgorCitAaXRlbSAjZGVmaW5lIFJFRyA2NAorICAgIFRoZSBvYmplY3QgaXMgYSByZWdpc3Rlci4gQGNvZGV7cmVnfSBjb250YWlucyBpdHMgbnVtYmVyLgorCitAaXRlbSAjZGVmaW5lIFZBUkFEUiAxMjgKKyAgICBUaGUgYWRkcmVzcyBvZiB0aGUgb2JqZWN0IGlzIHRvIGJlIHVzZWQuIE9ubHkgdG9nZXRoZXIgd2l0aCBzdGF0aWMKKyAgICB2YXJpYWJsZXMgKGkuZS4gQGNvZGV7c3RvcmFnZV9jbGFzcyA9PSBTVEFUSUN9IG9yIEBjb2Rle0VYVEVSTn0pLgorCitAZW5kIHRhYmxlCisKK1RoZSBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgdGhlc2UgZmxhZ3Mgc2hvdWxkIGJlOgorCitAaXRlbWl6ZQorICAgICAgICBAaXRlbSBAY29kZXswfSAobm8gb2JqZWN0KQorICAgICAgICBAaXRlbSBAY29kZXtLT05TVH0KKyAgICAgICAgQGl0ZW0gQGNvZGV7S09OU1R8RFJFRk9CSn0KKyAgICAgICAgQGl0ZW0gQGNvZGV7UkVHfQorICAgICAgICBAaXRlbSBAY29kZXtWQVJ9CisgICAgICAgIEBpdGVtIEBjb2Rle1ZBUnxSRUd9CisgICAgICAgIEBpdGVtIEBjb2Rle1JFR3xEUkVGT0JKfQorICAgICAgICBAaXRlbSBAY29kZXtLT05TVHxEUkVGT0JKfQorICAgICAgICBAaXRlbSBAY29kZXtWQVJ8RFJFRk9CSn0KKyAgICAgICAgQGl0ZW0gQGNvZGV7VkFSfFJFR3xEUkVGT0JKfQorICAgICAgICBAaXRlbSBAY29kZXtWQVJ8VkFSQURSfQorQGVuZCBpdGVtaXplCisKK0Fsc28gc29tZSBvdGhlciBiaXRzIHdoaWNoIGFyZSBub3QgcmVsZXZhbnQgdG8gdGhlIGNvZGUgZ2VuZXJhdG9yIG1heSBiZSBzZXQuCisKK0NvbnN0YW50cyB3aWxsIHVzdWFsbHkgYmUgaW4gQGNvZGV7cTJ9IGlmIHBvc3NpYmxlLiBPbmUgb2YgdGhlIHNvdXJjZXMgYWx3YXlzCitpcyBub3QgY29uc3RhbnQgYW5kIHRoZSB0YXJnZXQgaXMgYWx3YXlzIGFuIGx2YWx1ZS4KK1RoZSB0eXBlcyBvZiB0aGUgb3BlcmFuZHMgY2FuIGJlIHF1ZXJpZWQgdXNpbmcgdGhlIG1hY3JvcworQGNvZGV7cTF0eXAoKSwgcTJ0eXAoKX0gYW5kIEBjb2Rle3p0eXAoKX0uCitJbiBtb3N0IGNhc2VzIChpLmUuIHdoZW4gbm90IGV4cGxpY2l0bHkgc3RhdGVkKSB0aGUgdHlwZSBpcyBhbiBlbGVtZW50YXJ5IHR5cGUKKyhpLmUuIGFyaXRobWV0aWMgb3IgcG9pbnRlcikuCisKK0Bjb2Rle2FtfSBjYW4gYmUgdXNlZCB0byBzdG9yZSBpbmZvcm1hdGlvbiBvbiBzcGVjaWFsIGFkZHJlc3NpbmcgbW9kZXMuCitUaGlzIGhhcyB0byBiZSBoYW5kbGVkIGJ5IHRoZSBieSB0aGUgY29kZSBnZW5lcmF0b3IuIEhvd2V2ZXIgQGNvZGV7YW19IGhhcyB0byBiZSAwCitvciBoYXMgdG8gcG9pbnQgdG8gYSBAY29kZXtzdHJ1Y3QgQWRkcmVzc2luZ01vZGV9IHRoYXQgd2FzIGFsbG9jYXRlZCB1c2luZyBAY29kZXttYWxsb2MoKX0KK3doZW4gdGhlIGNvZGUgZ2VuZXJhdG9yIHJldHVybnMuIEBjb2Rle3N0cnVjdCBBZGRyZXNzaW5nTW9kZX0gaGFzIHRvIGJlIGRlZmluZWQKK2luIEBmaWxle21hY2hpbmUuaH0uCisKK0Bjb2Rle3ZhbH0gc3RvcmVzIGVpdGhlciB0aGUgdmFsdWUgb2YgdGhlIG9iamVjdCBpZiBpdCBpcyBhIGNvbnN0YW50IG9yIGFuCitvZmZzZXQgaWYgaXQgaXMgYSB2YXJpYWJsZS4KKworQGNvZGV7Y29kZX0gc3BlY2lmaWVzIHRoZSBvcGVyYXRpb24uIEZ1ciBmdXJ0aGVyIGRldGFpbHMgQHB4cmVme29wZXJhdGlvbnN9LgorCisKKworQG5vZGUgVmFyaWFibGVzCitAc3Vic2VjdGlvbiBWYXJpYWJsZXMKKworICAgIEEgQGNvZGV7c3RydWN0IFZhcn0gbG9va3MgbGlrZToKKworQGV4YW1wbGUKKworICAgIHN0cnVjdCBWYXJAeworICAgICAgICBpbnQgc3RvcmFnZV9jbGFzczsKKyAgICAgICAgWy4uLl0KKyAgICAgICAgY2hhciAqaWRlbnRpZmllcjsKKyAgICAgICAgWy4uLl0KKyAgICAgICAgem1heCBvZmZzZXQ7CisgICAgICAgIHN0cnVjdCBUeXAgKnZ0eXA7CisgICAgICAgIFsuLi5dCisgICAgICAgIGNoYXIgKnZhdHRyOworICAgICAgICB1bnNpZ25lZCBsb25nIHRhdHRyOyAgIC8qIG9wdGlvbmFsICovCisgICAgQH07CitAZW5kIGV4YW1wbGUKKworCisgICAgVGhlIHJlbGV2YW50IGVudHJpZXMgYXJlOgorCitAdGFibGUgQGNvZGUKKyAgICBAaXRlbSBpZGVudGlmaWVyCisgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4gVXN1YWxseSBvbmx5IG9mIGludGVyZXN0IGZvciB2YXJpYWJsZXMKKyAgICAgICAgd2l0aCBleHRlcm5hbC1saW5rYWdlLgorCisgICAgQGl0ZW0gc3RvcmFnZV9jbGFzcworICAgICAgICBPbmUgb2Y6CisgICAgICAgIEBleGFtcGxlCisgICAgICAgICAgICAjZGVmaW5lIEFVVE8gMQorICAgICAgICAgICAgI2RlZmluZSBSRUdJU1RFUiAyCisgICAgICAgICAgICAjZGVmaW5lIFNUQVRJQyAzCisgICAgICAgICAgICAjZGVmaW5lIEVYVEVSTiAgNAorICAgICAgICAgICAgI2RlZmluZSBUWVBFREVGIDUgICAgICAgLyogIG5vdCByZWxldmFudCAgICAqLworICAgICAgICBAZW5kIGV4YW1wbGUKKyAgICAgICAgVGhlIGJhY2tlbmQgc2hvdWxkIHVzZSB0aGUgbWFjcm9zIEBjb2Rle2lzYXV0bygpLCBpc3N0YXRpYygpfQorICAgICAgICBhbmQgQGNvZGV7aXNleHRlcm4oKX0gdG8gY2hlY2sgd2hpY2ggY2F0ZWdvcnkgYSB2YXJpYWJsZSBmYWxscyBpbnRvLgorCisgICAgIEBpdGVtIG9mZnNldAorICAgICAgICBDb250YWlucyBhbiBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgdmFyaWFibGUncworICAgICAgICBzdG9yYWdlLiBVc2VkLCBmb3IgZXhhbXBsZSwgd2hlbiBhY2Nlc3NpbmcgbWVtYmVycyBvZiBzdHJ1Y3R1cmVzLgorCisgICAgIEBpdGVtIHZ0eXAKKyAgICAgICAgVGhlIHR5cGUgb2YgdGhlIHZhcmlhYmxlIChAcHhyZWZ7Y29tcG9zaXRldHlwZXN9KS4KKworICAgICBAaXRlbSB2YXR0cgorICAgICAgICBBIHN0cmluZyB3aXRoIGF0dHJpYnV0ZXMgdXNlZCBpbiB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIHZhcmlhYmxlLgorICAgICAgICBAeHJlZnt0YXJnZXRhdHRyaWJ1dGVzfSBmb3IgZnVydGhlciBkZXRhaWxzLgorCisgICAgIEBpdGVtIHRhdHRyCisgICAgICAgIEZsYWdzIHVzZWQgd2hlbiBkZWNsYXJpbmcgdGhlIHZhcmlhYmxlLgorICAgICAgICBAeHJlZnt0YXJnZXRhdHRyaWJ1dGVzfSBmb3IgZnVydGhlciBkZXRhaWxzLgorQGVuZCB0YWJsZQorCisgICAgICAgIElmIHRoZSB2YXJpYWJsZSBpcyBub3QgYXNzaWduZWQgdG8gYSByZWdpc3RlciAoaS5lLiBiaXQgQGNvZGV7UkVHfQorICAgICAgICBpcyBub3Qgc2V0IGluIHRoZSBmbGFncyBvZiB0aGUgY29ycmVzcG9uZGluZyBAY29kZXtzdHJ1Y3Qgb2JqfSkgdGhlbgorICAgICAgICB0aGUgdmFyaWFibGUgY2FuIGJlIGFkZHJlc3NlZCBpbiB0aGUgZm9sbG93aW5nIHdheXMgKHdpdGgKKyAgICAgICAgZXhhbXBsZXMgb2YgNjhrLWNvZGUpOgorCitAdGFibGUgQGNvZGUKKyAgICAgICAgQGl0ZW0gaXNhdXRvKHN0b3JhZ2VfY2xhc3MpICE9IDAKKyAgICAgICAgICAgIEBjb2Rle29mZnNldH0gY29udGFpbnMgdGhlIG9mZnNldCBpbnNpZGUgdGhlIGxvY2FsLXZhcmlhYmxlcworICAgICAgICAgICAgc2VjdGlvbi4gVGhlIGNvZGUgZ2VuZXJhdG9yIG11c3QgZGVjaWRlIGhvdyBpdCdzIGdvaW5nIHRvIGhhbmRsZQorICAgICAgICAgICAgdGhlIGFjdGl2YXRpb24gcmVjb3JkLgorICAgICAgICAgICAgSWYgQGNvZGV7b2Zmc2V0IDwgMH0gdGhlbiB0aGUgdmFyaWFibGUgaXMgYSBmdW5jdGlvbiBhcmd1bWVudCBvbgorICAgICAgICAgICAgICAgIHRoZQorICAgICAgICAgICAgc3RhY2suIEluIHRoaXMgY2FzZSB0aGUgb2Zmc2V0IGluIHRoZSBwYXJhbWV0ZXItYXJlYSBpcworICAgICAgICAgICAgIEBjb2Rley0gKG9mZnNldCArIG1heGFsaWduKX0uCisKKyAgICAgICAgICAgIFRoZSBjb2RlIGdlbmVyYXRvciBtYXkgaGF2ZSB0byBjYWxjdWxhdGUgdGhlIGFjdHVhbCBvZmZzZXQKKyAgICAgICAgICAgIHRvIGEgc3RhY2stIG9yIGZyYW1lLXBvaW50ZXIgZnJvbSB0aGUgdmFsdWUgaW4gQGNvZGV7b2Zmc2V0fS4KK0BleGFtcGxlCisgICAgICAgICAgICAgICAgb2Zmc2V0ICsgdmFsLnZsb25nKHNwKQorQGVuZCBleGFtcGxlCisgICAgICAgICAgICBOb3RlIHRoYXQgQGNvZGV7c3RvcmFnZV9jbGFzcyA9PSBSRUdJU1RFUn0gaXMgZXF1aXZhbGVudCB0bworICAgICAgICAgICAgICAgIEBjb2Rle0FVVE99IC0gd2hldGhlcgorICAgICAgICAgICAgdGhlIHZhcmlhYmxlIGlzIGFjdHVhbGx5IGFzc2lnbmVkIGEgcmVnaXN0ZXIgaXMgc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICB0aGUgYml0IEBjb2Rle1JFR30gaW4gdGhlIEBjb2Rle2ZsYWdzfSBvZiB0aGUgQGNvZGV7c3RydWN0IG9ian0uCisKKyAgICAgICAgQGl0ZW0gaXNleHRlcm4oc3RvcmFnZV9jbGFzcykgIT0gMAorICAgICAgICAgICAgVGhlIHZhcmlhYmxlIGNhbiBiZSBhZGRyZXNzZWQgdGhyb3VnaCBpdHMgbmFtZSBpbiBAY29kZXtpZGVudGlmaWVyfS4KK0BleGFtcGxlCisgICAgICAgICAgICAgICAgdmFsLnZsb25nICsgJ18naWRlbnRpZmllcgorQGVuZCBleGFtcGxlCisKKyAgICAgICAgQGl0ZW0gaXNzdGF0aWMoc3RvcmFnZV9jbGFzcykgIT0gMAorICAgICAgICAgICAgVGhlIHZhcmlhYmxlIGNhbiBiZSBhZGRyZXNzZWQgdGhyb3VnaCBhIG51bWJlcmVkIGxhYmVsLiBUaGUKKyAgICAgICAgICAgIGxhYmVsIG51bWJlciBpcyBzdG9yZWQgaW4gQGNvZGV7b2Zmc2V0fS4KK0BleGFtcGxlCisgICAgICAgICAgICAgICAgdmFsLnZsb25nKydsJ29mZnNldAorQGVuZCBleGFtcGxlCitAZW5kIHRhYmxlCisKK0Bub2RlIGNvbXBvc2l0ZXR5cGVzCitAc3Vic2VjdGlvbiBDb21wb3NpdGUgVHlwZXMKKworVGhlIEMgbGFuZ3VhZ2Ugb2ZmZXJzIHR5cGVzIHdoaWNoIGFyZSBjb21wb3NlZCBvdXQgb2Ygb3RoZXIgdHlwZXMsCitlLmcuIHN0cnVjdHVyZXMgb3IgYXJyYXlzLiBUaGVyZWZvcmUsIGEgQyB0eXBlIGNhbiBiZSBhbiBhcmJpdHJhcmlseQorY29tcGxleCBzdHJ1Y3R1cmUuIFVzdWFsbHkgdGhlIGJhY2tlbmQgZG9lcyBub3QgbmVlZCB0byBkZWFsIHdpdGgKK3Rob3NlIHN0cnVjdHVyZXMuIFRoZSBJQ3MgY29udGFpbiBvbmx5IHRoZSBzaW1wbGUgdHlwZSBmbGFncywgZS5nLgorQGNvZGV7SU5UfSBvciBAY29kZXtTVFJVQ1R9LCBidXQgbm90IHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0dXJlIChpbnN0ZWFkCit0aGUgc2l6ZSBpcyBnaXZlbikuCisKK01vc3QgYmFja2VuZHMgZG8gbm90IGhhdmUgdG8gZGVhbCB3aXRoIGNvbXBsZXggdHlwZXMgYXQgYWxsLCBidXQKK3RoZXJlIGFyZSBzb21lIHdheXMgdG8gYWNjZXNzIHRoZW0sIGlmIG5lZWRlZCAoZm9yIGV4YW1wbGUsIHRoZXkgbWF5IGJlCituZWVkZWQgd2hlbiBnZW5lcmF0aW5nIGRlYnVnIGluZm9ybWF0aW9uKS4gVGhlcmVmb3JlLCB0aGlzIGNoYXB0ZXIKK2Rlc2NyaWJlcyB0aGUgcmVwcmVzZW50YXRpb24gb2Ygc3VjaCBmdWxsIHR5cGVzLgorCitUeXBlcyBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CitAZXhhbXBsZQorc3RydWN0IFR5cCBAeworICBpbnQgZmxhZ3M7CisgIHN0cnVjdCBUeXAgKm5leHQ7CisgIHN0cnVjdCBzdHJ1Y3RfZGVjbGFyYXRpb24gKmV4YWN0OworICB6bWF4IHNpemU7CisgIGNoYXIgKmF0dHI7CitAfTsKK0BlbmQgZXhhbXBsZQorCitAY29kZXtmbGFnc30gaXMgdGhlIHNpbXBsZSB0eXBlIGFzIGl0IGlzIGdlbmVyYWxseSB1c2VkIGluIHRoZQorYmFja2VuZC4gVGhlIG1lYW5pbmcgb2YgdGhlIG90aGVyIG1lbWJlcnMgZGVwZW5kcyBvbiBAY29kZXtmbGFnc30uCitAY29kZXthdHRyfSBpcyBhbiBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIHR5cGUgdXNpbmcKK3RoZSBzeXRheCBAY29kZXtfX2F0dHIoIi4uLiIpfSAod2hpY2ggaXMgcGFyc2VkIGxpa2UgYSB0eXBlLXF1YWxpZmllciwKK2UuZy4gQGNvZGV7Y29uc3R9KS4gSWYgc2V2ZXJhbCBhdHRyaWJ1dGVzIGFyZSBzcGVjaWZpZWQKK2ZvciBhIHR5cGUsIHRoZSBzdHJpbmdzIHdpbGwgYmUgY29uY2F0ZW5hdGVkLCBzZXBhcmF0ZWQgYnkgc2VtaS1jb2xvbnMuCisKK0lmIHRoZSB0eXBlIGlzIGEgcG9pbnRlciAoQGNvZGV7SVNQT0lOVEVSKGZsYWdzKSAhPSAwfSksIHRoZW4gQGNvZGV7bmV4dH0KK3dpbGwgcG9pbnQgdG8gdGhlIHR5cGUgdGhlIHBvaW50ZXIgcG9pbnRzIHRvLgorCitJZiB0aGUgdHlwZSBpcyBhbiBhcnJheSAoQGNvZGV7SVNBUlJBWShmbGFncykgIT0gMH0pLCB0aGVuIEBjb2Rle3NpemV9Citjb250YWlucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFuZCBAY29kZXtuZXh0fSBwb2ludHMgdG8gYSB0eXBlIHN0cnVjdHVyZQorcmVwcmVzZW50aW5nIHRoZSB0eXBlIG9mIGVhY2ggYXJyYXkgZWxlbWVudC4KKworSWYgdGhlIHR5cGUgaXMgYSBzdHJ1Y3R1cmUgKEBjb2Rle0lTU1RSVUNUKGZsYWdzKSAhPSAwfSksIGEgdW5pb24KKyhAY29kZXtJU1VOSU9OKGZsYWdzKSAhPSAwfSkgb3IgYSBmdW5jdGlvbiAoQGNvZGV7SVNGVU5DKGZsYWdzKSAhPSAwfSksIAordGhlbiBAY29kZXtleGFjdH0KK2lzIGEgcG9pbnRlciB0byBhIEBjb2Rle3N0cnVjdF9kZWNsYXJhdGlvbn0gKHdoaWNoIGlzIGFsc28gdXNlZCB0byByZXByZXNlbnQKK3VuaW9ucyBhbmQgZnVuY3Rpb24gcHJvdG90eXBlcykgdGhhdCBsb29rcyBsaWtlIHRoaXM6CitAZXhhbXBsZQorc3RydWN0IHN0cnVjdF9kZWNsYXJhdGlvbiBAeworICBpbnQgY291bnQ7CisgIGludCBsYWJlbDsKKyAgaW50IHR5cDsKKyAgLi4uCisgIHN0cnVjdCBzdHJ1Y3RfbGlzdCAoKnNsKVtdOworICBjaGFyICppZGVudGlmaWVyOworQH07CitAZW5kIGV4YW1wbGUKKworQGNvZGV7Y291bnR9IGlzIHRoZSBudW1iZXIgb2YgbWVtYmVycywgQGNvZGV7bGFiZWx9IGNhbiBiZSB1c2VkIHRvIHN0b3JlCithIGxhYmVsIHdoZW4gZ2VuZXJhdGluZyBkZWJ1ZyBpbmZvcm1hdGlvbi4gQGNvZGV7dHlwfSBpcyBlaXRoZXIgQGNvZGV7U1RSVUNUfSwKK0Bjb2Rle1VOSU9OfSBvciBAY29kZXtGVU5LVH0gdG8gZGVub3RlIHdoZXRoZXIgaXQgYXBwbGllcyB0byBhIHN0cnVjdHVyZSwKK3VuaW9uIG9yIGZ1bmN0aW9uLXByb3RvdHlwZS4KKworQGNvZGV7aWRlbnRpZmllcn0gaXMgb25seSBhdmFpbGFibGUgZm9yIHN0cnVjdC0gYW5kIHVuaW9uLXRhZ3MuCisKK0Bjb2Rle3NsfSBwb2ludHMgdG8gYW4gYXJyYXkgb2YgQGNvZGV7c3RydWN0IHN0cnVjdF9saXN0fXMgd2hpY2ggY29udGFpbgoraW5mb3JtYXRpb24gb24gZWFjaCBtZW1iZXIvcGFyYW1ldGVyOgorQGV4YW1wbGUKK3N0cnVjdCBzdHJ1Y3RfbGlzdCBAeworICBjaGFyICppZGVudGlmaWVyOworICBzdHJ1Y3QgVHlwICpzdHlwOworICB6bWF4IGFsaWduOworICBpbnQgYmZvZmZzZXQ7CisgIGludCBiZnNpemU7CisgIGludCBzdG9yYWdlX2NsYXNzOworICBpbnQgcmVnOworQH07CitAZW5kIGV4YW1wbGUKKworQGNvZGV7aWRlbnRpZmllcn0gaXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIG1lbWJlci9wYXJhbWV0ZXIsIGlmIGF2YWlsYWJsZS4KK0Bjb2Rle3N0eXB9IGRlbm90ZXMgdGhlIGZ1bGwgdHlwZSwgQGNvZGV7YWxpZ259IHRoZSBhbGlnbm1lbnQgaW4gYnl0ZXMKKyhvbmx5IGZvciBzdHJ1Y3QvdW5pb24pLCBAY29kZXtiZm9mZnNldH0gYW5kIEBjb2Rle2Jmc2l6ZX0gdGhlIHNpemUgYW5kCitvZmZzZXQgb2YgYml0ZmllbGQtbWVtYmVycywgQGNvZGV7c3RvcmFnZV9jbGFzc30gdGhlIHN0b3JhZ2UgY2xhc3Mgb2YKK2Z1bmN0aW9uIHBhcmFtZXRlcnMgKG1heSBiZSBAY29kZXtBVVRPfSBvciBAY29kZXtSRUdJU1RFUn0pIGFuZCBAY29kZXtyZWd9CitkZW5vdGVzIHRoZSByZWdpc3RlciBhIHBhcmFtZXRlciBpcyBwYXNzZWQgaW4uCisKK0V4YW1wbGU6IElmIEBjb2Rle3N0cnVjdCBUeXAgKnR9IHBvaW50cyB0byBhIHN0cnVjdHVyZS10eXBlLCB0aGVuIHRoZSB0eXBlCitvZiB0aGUgc2Vjb25kIHN0cnVjdHVyZSBtZW1iZXIgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2gKK0Bjb2RleygqdC0+ZXhhY3QtPnNsKVsxXS5zdHlwfS4KKworQSBwcm90b3R5cGVkIGZ1bmN0aW9uIHdpbGwgaGF2ZSBhIGxhc3QgYXJndW1lbnQgb2YgdHlwZSBAY29kZXtWT0lEfSB1bmxlc3MKK2l0IGlzIGEgZnVuY3Rpb24gYWNjZXB0aW5nIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4gSWYgYSBmdW5jdGlvbgord2FzIGRlY2xhcmVkIHdpdGhvdXQgYSBwcm90b3R5cGUgaXQgd2lsbCBoYXZlIG5vIHBhcmFtZXRlcnMsIGEgZnVuY3Rpb24KK2RlY2xhcmVkIHdpdGggcHJvdG90eXBlIGFjY2VwdGluZyBubyBhcmd1bWVudHMgd2lsbCBoYXZlIG9uZSBwYXJhbWV0ZXIgb2YKK3R5cGUgQGNvZGV7Vk9JRH0uCisKK0Fsc28sIGluIHRoZSBjYXNlIG9mIGEgZnVuY3Rpb24gdHlwZSwgdGhlIEBjb2Rle25leHR9LW1lbWJlciBvZiBhCitAY29kZXtzdHJ1Y3QgVHlwfSBwb2ludHMgdG8gdGhlIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbi4KKworCitAbm9kZSBvcGVyYXRpb25zCitAc3Vic2VjdGlvbiBPcGVyYXRpb25zCisKK1RoaXMgc2VjdGlvbiBsaXN0cyBhbGwgdGhlIGRpZmZlcmVudCBvcGVyYXRpb25zIGFsbG93ZWQgaW4gdGhlCitpbnRlcm1lZGlhdGUgY29kZSBwYXNzZWQgdG8gdGhlIGJhY2tlbmQuIEl0IGxpc3RzIHRoZSBzeW1ib2xpYyBuYW1lCitvZiB0aGUgQGNvZGV7Y29kZX0gdmFsdWUgKHRoZSB2YWx1ZSBzaG91bGQgbm90IGJlIHVzZWQpLCBhIHRlbXBsYXRlCitvZiB0aGUgb3BlcmFuZHMgYW5kIGEgZGVzY3JpcHRpb24uIFRoZSBkZXNjcmlwdGlvbiBzb21ldGltZXMKK2NvbnRhaW5zIGludGVybmFscyAoZS5nLiB3aGljaCB0eXBlcyBhcmUgc3RvcmVkIGluIEBjb2Rle3R5cGZ9IGFuZAord2hpY2ggaW4gQGNvZGV7dHlwZjJ9KSwgYnV0IHRoZXkgc2hvdWxkIG5vdCBiZSB1c2VkLiBBY2Nlc3MgdGhlbSB1c2luZwordGhlIG1hY3JvcyBwcm92aWRlZCAoZS5nLiBAY29kZXtxMXR5cCxxMnR5cCx6dHlwfSkgd2hlbmV2ZXIgcG9zc2libGUuCisKKworQHRhYmxlIEBjb2RlCitAaXRlbSAjZGVmaW5lIEFTU0lHTiAyCisKKyAgICBDb3B5IEBjb2Rle3ExfSB0byBAY29kZXt6fS4gQGNvZGV7cTEtPnp9LgorCisgICAgQGNvZGV7cTIudmFsLnZtYXh9IGNvbnRhaW5zIHRoZSBzaXplIG9mIHRoZSBvYmplY3RzICh0aGlzIGlzCisgICAgbmVjZXNzYXJ5IGlmIGl0IGlzIGFuIGFycmF5IG9yIGEgc3RydWN0KS4gSXQgc2hvdWxkIGJlIGFjY2Vzc2VkCisgICAgdXNpbmcgdGhlIEBjb2Rle29wc2l6ZSgpfS1tYWNyby4KKyAgICBAY29kZXt0eXBmfSBkb2VzIG5vdCBoYXZlIHRvIGJlIGFuIGVsZW1lbnRhcnkgdHlwZSEKKworICAgIFRoZSBvbmx5IGNhc2Ugd2hlcmUgQGNvZGV7dHlwZiA9PSBBUlJBWX0gc2hvdWxkIGJlIGluIGF1dG9tYXRpYyBpbml0aWFsaXphdGlvbnMuCisKKyAgICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRoYXQgQGNvZGV7KHR5cGYmTlEpID09IENIQVJ9IGJ1dCB0aGUgc2l6ZSBpcyAhPSAxLiBUaGlzIGlzCisgICAgY3JlYXRlZCBmb3IgYW4gaW5saW5lIG1lbWNweS9zdHJjcHkgd2hlcmUgdGhlIHR5cGUgaXMgbm90IGtub3duLgorCitAaXRlbSAjZGVmaW5lIE9SIDE2CitAaXRlbSAjZGVmaW5lIFhPUiAxNworQGl0ZW14ICNkZWZpbmUgQU5EIDE4CisKKyAgICBCaXR3aXNlIGJvb2xlYW4gb3BlcmF0aW9ucy4gQGNvZGV7cTEscTItPnp9LgorCisgICAgQWxsIG9wZXJhbmRzIGFyZSBpbnRlZ2Vycy4KKworQGl0ZW0gI2RlZmluZSBMU0hJRlQgMjUKK0BpdGVteCAjZGVmaW5lIFJTSElGVCAyNgorCisgICAgQml0IHNoaWZ0aW5nLiBAY29kZXtxMSxxMi0+en0uCisKKyBAY29kZXsncTInfSBpcyB0aGUgbnVtYmVyIG9mIHNoaWZ0cy4KKyAgICBBbGwgb3BlcmFuZHMgYXJlIGludGVnZXJzLgorCitAaXRlbSAjZGVmaW5lIEFERCAyNworQGl0ZW0gI2RlZmluZSBTVUIgMjgKK0BpdGVtICNkZWZpbmUgTVVMVCAyOQorQGl0ZW14ICNkZWZpbmUgRElWIDMwCisKKyAgICBTdGFuZGFyZCBhcml0aG1ldGljIG9wZXJhdGlvbnMuIEBjb2Rle3ExLHEyLT56fS4KKworICAgIEFsbCBvcGVyYW5kcyBhcmUgb2YgYXJpdGhtZXRpYyB0eXBlcyAoaW50ZWdlcnMgb3IgZmxvYXRpbmcgcG9pbnQpLgorCitAaXRlbSAjZGVmaW5lIE1PRCAzMQorCisgICAgTW9kdWxvIChAY29kZXslfSkuIEBjb2Rle3ExLHEyLT56fS4KKworICAgIEFsbCBvcGVyYW5kcyBhcmUgaW50ZWdlcnMuCisKK0BpdGVtICNkZWZpbmUgS09NUExFTUVOVCAzMworCisgICAgQml0d2lzZSBjb21wbGVtZW50LiBAY29kZXtxMS0+en0uCisKKyAgICBBbGwgb3BlcmFuZHMgYXJlIGludGVnZXJzLgorCitAaXRlbSAjZGVmaW5lIE1JTlVTIDM4CisKKyAgICBVbmFyeSBtaW51cy4gQGNvZGV7cTEtPnp9LgorCisgICAgQWxsIG9wZXJhbmRzIGFyZSBvZiBhcml0aG1ldGljIHR5cGVzIChpbnRlZ2VycyBvciBmbG9hdGluZyBwb2ludCkuCisKK0BpdGVtICNkZWZpbmUgQUREUkVTUyA0MAorCisgICAgR2V0IHRoZSBhZGRyZXNzIG9mIGFuIG9iamVjdC4gQGNvZGV7cTEtPnp9LgorCisgICAgQGNvZGV7en0gaXMgYWx3YXlzIGEgcG9pbnRlciBhbmQgQGNvZGV7cTF9IGlzIGFsd2F5cyBhbiBhdXRvIHZhcmlhYmxlLgorCitAaXRlbSAjZGVmaW5lIENBTEwgNDIKKworICAgIENhbGwgdGhlIGZ1bmN0aW9uIEBjb2Rle3ExfS4gQGNvZGV7cTF9LgorCisgICAgQGNvZGV7cTIudmFsLnZtYXh9IGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcHVzaGVkIG9uIHRoZSBzdGFjayBhcworICAgIGZ1bmN0aW9uIGFyZ3VtZW50cyBmb3IgdGhpcyBjYWxsICh1c2UgdGhlIEBjb2Rle3B1c2hlZGFyZ3NpemUoKX0tbWFjcm8KKyAgICB0byBhY2Nlc3MgdGhpcyBzaXplKS4gVGhvc2UgbWF5IGhhdmUgdG8gYmUgcG9wcGVkIGZyb20gdGhlCisgICAgc3RhY2sgYWZ0ZXIgdGhlIGZ1bmN0aW9uIHJldHVybnMgZGVwZW5kaW5nIG9uIHRoZSBjYWxsaW5nIG1lY2hhbmlzbS4KKworICAgIEEgQGNvZGV7Q0FMTH0gSUMgaGFzIGEgbWVtYmVyIEBjb2Rle2FyZ19jbnR9IHdoaWNoIGNvbnRhaW5zIHRoZSBudW1iZXIKKyAgICBvZiBhcmd1bWVudHMgdG8gdGhpcyBmdW5jdGlvbiBjYWxsLiBAY29kZXthcmdfbGlzdFtpXX0gKHdpdGggQGNvZGV7aX0KKyAgICBpbiB0aGUgcmFuZ2UgMC4uLkBjb2Rle2FyZ19jbnQtMX0pIGNvbnRhaW5zIHRoZSBwb2ludGVyIHRvIHRoZQorICAgIElDIHBhc3NpbmcgdGhlIEBjb2Rle2l9LXRoIGFyZ3VtZW50LgorCitAaXRlbSAjZGVmaW5lIENPTlZFUlQgNTAKKworICAgIENvbnZlcnQgb25lIHR5cGUgdG8gYW5vdGhlci4gQGNvZGV7cTEtPnp9LgorCisgICAgQGNvZGV7en0gaXMgYWx3YXlzIG9mIHRoZSB0eXBlIEBjb2Rle3R5cGZ9LCBAY29kZXtxMX0gb2YgdHlwZSBAY29kZXt0eXBmMn0uCisKKyAgICBDb252ZXJzaW9ucyBiZXR3ZWVuIGZsb2F0aW5nIHBvaW50IGFuZCBwb2ludGVycyBkbyBub3Qgb2NjdXIsIG5laXRoZXIgCisgICAgZG8gY29udmVyc2lvbnMgdG8gYW5kIGZyb20gc3RydWN0cywgdW5pb25zLCBhcnJheXMgb3Igdm9pZC4KKworQGl0ZW0gI2RlZmluZSBBTExPQ1JFRyA2NQorCisgICAgQWxsb2NhdGUgYSByZWdpc3Rlci4gQGNvZGV7cTF9LgorCisgICAgRnJvbSBub3cgb24gdGhlIHJlZ2lzdGVyIEBjb2Rle3ExLnJlZ30gaXMgaW4gdXNlLiBObyBjb2RlIGhhcyB0byBiZSBnZW5lcmF0ZWQKKyAgICBmb3IgdGhpcywgYnV0IGl0IGlzIHByb2JhYmx5IHVzZWZ1bCB0byBrZWVwIHRyYWNrIG9mIHRoZSByZWdpc3RlcnMKKyAgICBpbiB1c2UgdG8ga25vdyB3aGljaCByZWdpc3RlcnMgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIGNvZGUgZ2VuZXJhdG9yCisgICAgYXQgYSBjZXJ0YWluIHRpbWUgYW5kIHdoaWNoIHJlZ2lzdGVycyBhcmUgdHJhc2hlZCBieSB0aGUgZnVuY3Rpb24uCisKK0BpdGVtICNkZWZpbmUgRlJFRVJFRyA2NgorCisgICAgUmVsZWFzZSBhIHJlZ2lzdGVyLiBAY29kZXtxMX0uCisKKyAgICBGcm9tIG5vdyBvbiB0aGUgcmVnaXN0ZXIgQGNvZGV7cTEucmVnfSBpcyBmcmVlLgorCisgICAgQWxzbyBpdCBtZWFucyB0aGF0IHRoZSB2YWx1ZSBjdXJyZW50bHkgc3RvcmVkIGluIEBjb2Rle3ExLnJlZ30gaXMgbm90IHVzZWQgYW55CisgICAgbW9yZSBhbmQgcHJvdmlkZXMgYSBsaXR0bGUgYml0IG9mIGRhdGEgZmxvdyBpbmZvcm1hdGlvbi4KKyAgICBOb3RlIGhvd2V2ZXIsIGlmIGEgQGNvZGV7RlJFRVJFR30gZm9sbG93cyBhIGJyYW5jaCwgdGhlIHZhbHVlIG9mIHRoZSByZWdpc3RlcgorICAgIG1heSBiZSB1c2VkIGF0IHRoZSB0YXJnZXQgb2YgdGhlIGJyYW5jaC4KKworQGl0ZW0gI2RlZmluZSBDT01QQVJFIDc3CisKKyAgICBDb21wYXJlIGFuZCBzZXQgY29uZGl0aW9uIGNvZGVzLiBAY29kZXtxMSxxMigtPnopfS4KKworICAgIENvbXBhcmUgdGhlIG9wZXJhbmRzIGFuZCBzZXQgdGhlIGNvbmRpdGlvbiBjb2RlLCBzbyB0aGF0CisgICAgQGNvZGV7QkVRLCBCTkUsIEJMVCwgQkdFLCBCTEV9IG9yIEBjb2Rle0JHVH0gd29ya3MgYXMgZGVzaXJlZC4KKyAgICBJZiBAY29kZXt6LmZsYWdzID09IDB9ICh0aGlzIGlzIGFsd2F5cyB0aGUgY2FzZSB1bmxlc3MgdGhlIGJhY2tlbmQgc2V0cworICAgIEBjb2Rle211bHRpcGxlX2Njc30gdG8gMSBhbmQgQG9wdGlvbnstbm8tbXVsdGlwbGUtY2NzfSBpcyBub3QgdXNlZCkgCisgICAgdGhlIGNvbmRpdGlvbiBjb2RlcyB3aWxsIGJlIGV2YWx1YXRlZCBvbmx5IGJ5IGFuIElDIGltbWVkaWF0ZWx5CisgICAgZm9sbG93aW5nIHRoZSBAY29kZXtDT01QQVJFfSwgaS5lLiB0aGUgbmV4dCBpbnN0cnVjdGlvbiAoZXhjZXB0IHBvc3NpYmxlCisgICAgQGNvZGV7RlJFRVJFR31zKSB3aWxsIGJlIGEgY29uZGl0aW9uYWwgYnJhbmNoLgorCisgICAgSG93ZXZlciwgaWYgYSB0YXJnZXQgc3VwcG9ydHMgc2V2ZXJhbCBjb25kaXRpb24gY29kZSByZWdpc3RlcnMgYW5kIHNldHMKKyAgICB0aGUgZ2xvYmFsIHZhcmlhYmxlIEBjb2Rle211bHRpcGxlX2Njc30gdG8gMSwgQGNvbW1hbmR7dmJjY30gbWlnaHQgdXNlIHRob3NlIHJlZ2lzdGVycworICAgIGFuZCBwZXJmb3JtIGNlcnRhaW4gb3B0aW1pemF0aW9ucy4gSW4gdGhpcyBjYXNlIEBjb2Rle3p9IG1heSBiZSBub24tZW1wdHkgYW5kIHRoZQorICAgIGNvbmRpdGlvbiBjb2RlcyBoYXZlIHRvIGJlIHN0b3JlZCBpbiBAY29kZXt6fS4KKworICAgIE5vdGUgdGhhdCBldmVuIGlmIEBjb2Rle211bHRpcGxlX2Njc30gaXMgc2V0LCBhIGJhY2tlbmQgbXVzdCBuZXZlcnRoZWxlc3MKKyAgICBiZSBhYmxlIHRvIGRlYWwgd2l0aCBAY29kZXt6ID09IDB9LgorCitAaXRlbSAjZGVmaW5lIFRFU1QgNjgKKworICAgIFRlc3QgQGNvZGV7cTF9IGFnYWluc3QgMCBhbmQgc2V0IGNvbmRpdGlvbiBjb2Rlcy4gQGNvZGV7cTEoLT56KX0KKworICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byBAY29kZXtDT01QQVJFIHExLCMwfQorICAgIGJ1dCBvbmx5IHRoZSBjb25kaXRpb24gY29kZSBmb3IgQGNvZGV7QkVRfSBhbmQgQGNvZGV7Qk5FfSBoYXMgdG8gYmUgc2V0LgorCitAaXRlbSBAY29kZXsjZGVmaW5lIExBQkVMIDY5fQorCisgICAgR2VuZXJhdGUgYSBsYWJlbC4gQGNvZGV7dHlwZn0gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGhlIGxhYmVsLgorCitAaXRlbSAjZGVmaW5lIEJFUSA3MAorQGl0ZW0gI2RlZmluZSBCTkUgNzEKK0BpdGVtICNkZWZpbmUgQkxUIDcyCitAaXRlbSAjZGVmaW5lIEJHRSA3MworQGl0ZW0gI2RlZmluZSBCTEUgNzQKK0BpdGVteCAjZGVmaW5lIEJHVCA3NQorCisgICAgQnJhbmNoIG9uIGNvbmRpdGlvbiBjb2Rlcy4gKEBjb2Rle3ExfSkuCisKKyAgICBAY29kZXt0eXBmfSBzcGVjaWZpZXMgdGhlIGxhYmVsIHdoZXJlIHByb2dyYW0gZXhlY3V0aW9uIHNoYWxsIGNvbnRpbnVlLCBpZiB0aGUKKyAgICBjb25kaXRpb24gY29kZSBpcyB0cnVlIChvdGhlcndpc2UgY29udGludWUgd2l0aCBuZXh0IHN0YXRlbWVudCkuCisgICAgVGhlIGNvbmRpdGlvbiBjb2RlcyBtZWFuIGVxdWFsLCBub3QgZXF1YWwsIGxlc3MgdGhhbiwgZ3JlYXRlciBvciBlcXVhbCwKKyAgICBsZXNzIG9yIGVxdWFsIGFuZCBncmVhdGVyIHRoYW4uCisgICAgSWYgQGNvZGV7cTF9IGlzIGVtcHR5IChAY29kZXtxMS5mbGFncyA9PSAwfSksIHRoZSBjb2RlcyBzZXQgYnkgdGhlIGxhc3QgQGNvZGV7Q09NUEFSRX0KKyAgICBvciBAY29kZXtURVNUfSBtdXN0IGJlIGV2YWx1YXRlZC4gT3RoZXJ3aXNlIEBjb2Rle3ExfSBjb250YWlucyB0aGUgY29uZGl0aW9uIGNvZGVzLgorCisgICAgT24gc29tZSBtYWNoaW5lcyB0aGUgdHlwZSBvZiBvcGVyYW5kcyBvZiBhIGNvbXBhcmlzb24gKGUuZyB1bnNpZ25lZCBvcgorICAgIHNpZ25lZCkgaXMgZW5jb2RlZCBpbiB0aGUgYnJhbmNoIGluc3RydWN0aW9ucyByYXRoZXIgdGhhbiBpbiB0aGUKKyAgICBjb21wYXJpc29uIGluc3RydWN0aW9ucy4gSW4gdGhpcyBjYXNlIHRoZSBjb2RlIGdlbmVyYXRvciBoYXMgdG8ga2VlcAorICAgIHRyYWNrIG9mIHRoZSB0eXBlIG9mIHRoZSBsYXN0IGNvbXBhcmlzb24uCisKKyAgICBTaW1pbGFybHksIGluIHNvbWUgYXJjaGl0ZWN0dXJlcywgdGhlIGNvbXBhcmUgYW5kIHRoZSBicmFuY2ggY2FuIGJlCisgICAgY29tYmluZWQuCisKK0BpdGVtICNkZWZpbmUgQlJBIDc2CisKKyAgICBCcmFuY2ggYWx3YXlzLiBAY29kZXt0eXBmfSBzcGVjaWZpZXMgdGhlIGxhYmVsIHdoZXJlIHByb2dyYW0gZXhlY3V0aW9uCisgICAgY29udGludWVzLgorCitAaXRlbSAjZGVmaW5lIFBVU0ggNzgKKworICAgIFB1c2ggQGNvZGV7cTF9IG9uIHRoZSBzdGFjayAoZm9yIGFyZ3VtZW50IHBhc3NpbmcpLiBAY29kZXtxMX0uCisKKyAgICBAY29kZXtxMi52YWwudm1heH0gY29udGFpbnMgdGhlIHNpemUgb2YgdGhlIG9iamVjdCAoc2hvdWxkIGJlIGFjY2Vzc2VkCisgICAgdXNpbmcgdGhlIEBjb2Rle29wc2l6ZSgpfS1tYWNybyksIEBjb2Rle3oudmFsLnZtYXh9CisgICAgY29udGFpbnMgdGhlIHNpemUgdGhhdCBoYXMgdG8gYmUgcHVzaGVkIChhY2Nlc3MgaXQgdXNpbmcgdGhlCisgICAgQGNvZGV7cHVzaHNpemUoKX0tbWFjcm8pLiBUaGVzZSBzaXplcyBtYXkgZGlmZmVyIGR1ZSB0bworICAgIGFsaWdubWVudCBpc3N1ZXMuCisKKyAgICBAY29kZXtxMX0gZG9lcyBub3QgaGF2ZSB0bworICAgIGJlIGFuIGVsZW1lbnRhcnkgdHlwZSAoc2VlIEBjb2Rle0FTU0lHTn0pLgorICAgIEFsc28sIEBjb2Rle3ExfSBjYW4gYmUgZW1wdHkuIFRoaXMgaXMgdXNlZCBmb3IgQUJJcyB3aGljaCByZXF1aXJlCisgICAgc3RhY2stc2xvdHMgdG8gYmUgb21pdHRlZC4KKworICAgIERlcGVuZGluZyBvbiBAY29kZXtPUkRFUkVEX1BVU0h9IHRoZSBAY29kZXtQVVNIfSBJQ3MgYXJlIGdlbmVyYXRlZAorICAgIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0IG9yIHRoZSBsYXN0IGFyZ3VtZW50cy4gVGhlIGRpcmVjdGlvbiBvZgorICAgIHRoZSBzdGFjay1ncm93dGggY2FuIGJlIGNob3NlbiBieSB0aGUgYmFja2VuZC4gTm90ZSB0aGF0IHRoaXMgaXMgb25seQorICAgIHVzZWQgZm9yIGZ1bmN0aW9uLWFyZ3VtZW50cywgdGhleSBjYW4gYmUgcHVzaGVkIGluIG9wcG9zaXRlIGRpcmVjdGlvbgorICAgIG9mIHRoZSByZWFsIHN0YWNrLgorCitAaXRlbSAjZGVmaW5lIEFEREkyUCA4MQorCisgICAgQWRkIGFuIGludGVnZXIgdG8gYSBwb2ludGVyLiBAY29kZXtxMSxxMi0+en0uCisKKyAgICBAY29kZXtxMX0gYW5kIEBjb2Rle3p9IGFyZSBhbHdheXMgcG9pbnRlcnMgKG9mIHR5cGUgQGNvZGV7dHlwZjJ9KSBhbmQKKyAgICBAY29kZXtxMn0gaXMgYW4gaW50ZWdlciBvZiB0eXBlIEBjb2Rle3R5cGZ9LgorICAgIEBjb2Rle3p9IGhhcyB0byBiZSBAY29kZXtxMX0gaW5jcmVhc2VkIGJ5IEBjb2Rle3EyfSBieXRlcy4KKworQGl0ZW0gI2RlZmluZSBTVUJJRlAgODIKKworICAgIFN1YnRyYWN0IGFuIEludGVnZXIgZnJvbSBhIHBvaW50ZXIuIEBjb2Rle3ExLHEyLT56fS4KKworICAgIEBjb2Rle3ExfSBhbmQgQGNvZGV7en0gYXJlIGFsd2F5cyBwb2ludGVycyAob2YgdHlwZSBAY29kZXt0eXBmMn0pIGFuZAorICAgIEBjb2Rle3EyfSBpcyBhbiBpbnRlZ2VyIG9mIHR5cGUgQGNvZGV7dHlwZn0uCisgICAgQGNvZGV7en0gaGFzIHRvIGJlIEBjb2Rle3ExfSBkZWNyZWFzZWQgYnkgQGNvZGV7cTJ9IGJ5dGVzLgorCitAaXRlbSAjZGVmaW5lIFNVQlBGUCA4MworCisgICAgU3VidHJhY3QgYSBwb2ludGVyIGZyb20gYSBwb2ludGVyLiBAY29kZXtxMSxxMi0+en0uCisKKyAgICBAY29kZXtxMX0gYW5kIEBjb2Rle3EyfSBhcmUgcG9pbnRlcnMgKG9mIHR5cGUgQGNvZGV7dHlwZjJ9KSBhbmQKKyAgICBAY29kZXt6fSBpcyBhbiBpbnRlZ2VyIG9mIHR5cGUgQGNvZGV7dHlwZn0uCisgICAgQGNvZGV7en0gaGFzIHRvIGJlIEBjb2Rle3ExIC0gcTJ9IGluIGJ5dGVzLgorCitAaXRlbSAjZGVmaW5lIEdFVFJFVFVSTiA5MworCisgICAgR2V0IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGxhc3QgZnVuY3Rpb24gY2FsbC4gQGNvZGV7LT56fS4KKworICAgIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgaW4gYSByZWdpc3RlciwgaXRzIG51bWJlciB3aWxsIGJlIEBjb2Rle3ExLnJlZ30uCisgICAgT3RoZXJ3aXNlIEBjb2Rle3ExLnJlZ30gd2lsbCBiZSAwLgorICAgIEBjb2Rle0dFVFJFVFVSTn0gaW1tZWRpYXRlbHkgZm9sbG93cyBhIEBjb2Rle0NBTEx9IElDIChleGNlcHQgcG9zc2libGUKKyAgICBAY29kZXtGUkVFUkVHfXMpLgorCitAaXRlbSAjZGVmaW5lIFNFVFJFVFVSTiA5NAorCisgICAgU2V0IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uIEBjb2Rle3ExfS4KKworICAgIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgcGFzc2VkIGluIGEgcmVnaXN0ZXIsIHRoZSByZWdpc3RlciBudW1iZXIgd2lsbCBiZSBAY29kZXt6LnJlZ30uCisgICAgT3RoZXJ3aXNlIEBjb2Rle3oucmVnfSB3aWxsIGJlIDAuCisgICAgQGNvZGV7U0VUUkVUVVJOfSBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIGZ1bmN0aW9uIGV4aXQgKGkuZS4gaXQgaXMgdGhlIGxhc3QKKyAgICBJQyBvciBmb2xsb3dlZCBieSBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCB0byBhIGxhYmVsIHdoaWNoIGlzIHRoZSBsYXN0CisgICAgSUMgLSBhbHdheXMgaWdub3JpbmcgcG9zc2libGUgQGNvZGV7RlJFRVJFR31zKS4KKworQGl0ZW0gI2RlZmluZSBNT1ZFRlJPTVJFRyA5NQorCisgICAgTW92ZSBhIHJlZ2lzdGVyIHRvIG1lbW9yeS4gQGNvZGV7cTEtPnp9LgorCisgICAgQGNvZGV7cTF9IGlzIGFsd2F5cyBhIHJlZ2lzdGVyIGFuZCBAY29kZXt6fSBhbiBhcnJheSBvZiBzaXplIEBjb2Rle3JlZ3NpemVbcTEucmVnXX0uCisKK0BpdGVtICNkZWZpbmUgTU9WRVRPUkVHIDk2CisKKyAgICBMb2FkIGEgcmVnaXN0ZXIgZnJvbSBtZW1vcnkuIEBjb2Rle3ExLT56fS4KKworICAgIEBjb2Rle3p9IGlzIGFsd2F5cyBhIHJlZ2lzdGVyIGFuZCBAY29kZXtxMX0gYW4gYXJyYXkgb2Ygc2l6ZSBAY29kZXtyZWdzaXplW3oucmVnXX0uCisKK0BpdGVtICNkZWZpbmUgTk9QIDk3CisKKyAgICBEbyBub3RoaW5nLgorCitAZW5kIHRhYmxlCisKKworQHNlY3Rpb24gVHlwZSBTeXN0ZW0KKworQHN1YnNlY3Rpb24gVGFyZ2V0IERhdGEgVHlwZXMKKworQXMgdGhlIGNvbXBpbGVyIHNob3VsZCBiZSBwb3J0YWJsZSwgd2UgbXVzdCBub3QgYXNzdW1lIGFueXRoaW5nIGFib3V0Cit0aGUgZGF0YSB0eXBlcyBvZiB0aGUgaG9zdCBzeXN0ZW0gd2hpY2ggaXMgbm90IGd1YXJhbnRlZWQgYnkKK0FOU0kvSVNPIEMuIEVzcGVjaWFsbHkgZG8gbm90IGFzc3VtZSB0aGF0IHRoZSBkYXRhIHR5cGVzIG9mIHRoZSBob3N0CitzeXN0ZW0gY29ycmVzcG9uZCB0byB0aGUgb25lcyBvZiB0aGUgdGFyZ2V0IHN5c3RlbS4KKworVGhlcmVmb3JlLCBAY29tbWFuZHt2YmNjfSB3aWxsIHByb3ZpZGUgdHlwZWRlZnMgd2hpY2ggY2FuIGhvbGQgYSBkYXRhIHR5cGUKK29mIHRoZSB0YXJnZXQgbWFjaGluZSBhbmQgKGFzIHRoZXJlIGlzIG5vIG9wZXJhdG9yIG92ZXJsb2FkaW5nIGluIEMpCitmdW5jdGlvbnMgb3IgbWFjcm9zIHRvIHBlcmZvcm0gYXJpdGhtZXRpYyBvbiB0aGVzZSB0eXBlcy4KKworVGhlIHR5cGVkZWZzIGZvciB0aGUgYmFzaWMgdGFyZ2V0J3MgZGF0YSB0eXBlcyAodGhleSBjYW4gYmUgZXh0ZW5kZWQKK2J5IGFkZGl0aW9uYWwgdHlwZXMpIGFyZToKKworQHRhYmxlIEBjb2RlCisgICAgQGl0ZW0gemNoYXIKKyAgICAgICAgICAgVHlwZSBAY29kZXtjaGFyfSBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUuCisgICAgQGl0ZW0genVjaGFyCisgICAgICAgICAgVHlwZSBAY29kZXt1bnNpZ25lZCBjaGFyfSBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUuCisgICAgQGl0ZW0genNob3J0CisgICAgICAgICAgIFR5cGUgQGNvZGV7c2hvcnR9IG9uIHRoZSB0YXJnZXQgbWFjaGluZS4KKyAgICBAaXRlbSB6dXNob3J0CisgICAgICAgICAgVHlwZSBAY29kZXt1bnNpZ25lZCBzaG9ydH0gb24gdGhlIHRhcmdldCBtYWNoaW5lLgorICAgIEBpdGVtIHppbnQKKyAgICAgICAgICAgVHlwZSBAY29kZXtpbnR9IG9uIHRoZSB0YXJnZXQgbWFjaGluZS4KKyAgICBAaXRlbSB6dWludAorICAgICAgICAgIFR5cGUgQGNvZGV7dW5zaWduZWQgaW50fSBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUuCisgICAgQGl0ZW0gemxvbmcKKyAgICAgICAgICAgVHlwZSBAY29kZXtsb25nfSBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUuCisgICAgQGl0ZW0genVsb25nCisgICAgICAgICAgVHlwZSBAY29kZXt1bnNpZ25lZCBsb25nfSBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUuCisgICAgQGl0ZW0gemxsb25nCisgICAgICAgICAgIFR5cGUgQGNvZGV7bG9uZyBsb25nfSBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUuCisgICAgQGl0ZW0genVsbG9uZworICAgICAgICAgIFR5cGUgQGNvZGV7dW5zaWduZWQgbG9uZyBsb25nfSBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUuCisgICAgQGl0ZW0gem1heAorICAgICAgICAgIEEgdHlwZSBjYXBhYmxlIG9mIHN0b3JpbmcgKGFuZCBjb3JyZWN0bHkgZG9pbmcgYXJpdGhtZXRpYyBvbikKKyAgICAgICAgICBldmVyeSBzaWduZWQgaW50ZWdlciB0eXBlLiBEZWZhdWx0cyB0byBAY29kZXt6bGxvbmd9LgorICAgIEBpdGVtIHp1bWF4CisgICAgICAgICAgQSB0eXBlIGNhcGFibGUgb2Ygc3RvcmluZyAoYW5kIGNvcnJlY3RseSBkb2luZyBhcml0aG1ldGljIG9uKQorICAgICAgICAgIGV2ZXJ5IHVuc2lnbmVkIGludGVnZXIgdHlwZS4gRGVmYXVsdHMgdG8gQGNvZGV7enVsbG9uZ30uCisgICAgQGl0ZW0gemZsb2F0CisgICAgICAgICAgIFR5cGUgQGNvZGV7ZmxvYXR9IG9uIHRoZSB0YXJnZXQgbWFjaGluZS4KKyAgICBAaXRlbSB6ZG91YmxlCisgICAgICAgICAgIFR5cGUgQGNvZGV7ZG91YmxlfSBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUuCisgICAgQGl0ZW0gemxkb3VibGUKKyAgICAgICAgICAgVHlwZSBAY29kZXtsb25nIGRvdWJsZX0gb24gdGhlIHRhcmdldCBtYWNoaW5lLgorICAgIEBpdGVtIHpwb2ludGVyCisgICAgICAgIEEgYnl0ZSBwb2ludGVyIG9uIHRoZSB0YXJnZXQgbWFjaGluZS4gTm90IHJlYWxseSB1c2VkLgorQGVuZCB0YWJsZQorCitUaGVzZSB0eXBlZGVmcyBhbmQgYXJpdGhtZXRpYyBmdW5jdGlvbnMgdG8gd29yayBvbiB0aGVtIHdpbGwgYmUKK2dlbmVyYXRlZCBieSB0aGUgcHJvZ3JhbSBAY29tbWFuZHtkdGdlbn0gd2hlbiBjb21waWxpbmcgQGNvbW1hbmR7dmJjY30uCitJdCB3aWxsIGNyZWF0ZSB0aGUgZmlsZXMgQGZpbGV7bWFjaGluZXMvJChUQVJHRVQpL2R0Lmh9IGFuZCBAZmlsZXtkdC5jfS4KKworVGhlc2UgZmlsZXMgYXJlIGdlbmVyYXRlZCBmcm9tIEBmaWxle21hY2hpbmVzLyQoVEFSR0VUKS9tYWNoaW5lLmR0fQord2hpY2ggbXVzdCBkZXNjcmliZSB3aGF0IHJlcHJlc2VudGF0aW9ucyB0aGUgY29kZSBnZW5lcmF0b3IgbmVlZHMuCitAY29tbWFuZHtkdGdlbn0gd2lsbCB0aGVuIGFzayBmb3IgYXZhaWxhYmxlIHR5cGVzIG9uIHRoZSBob3N0IHN5c3RlbSBhbmQKK2Nob29zZSBhcHByb3ByaWF0ZSBvbmVzIGFuZC9vciBpbnN0YWxsIGVtdWxhdGlvbiBmdW5jdGlvbnMsIGlmIGF2YWlsYWJsZS4KKworSW4gQGZpbGV7bWFjaGluZS5kdH0sIGV2ZXJ5IGRhdGEgdHlwZSByZXByZXNlbnRhdGlvbiBnZXRzIGEgc3ltYm9sICh0aGUgb25lcyB3aGljaCBhcmUKK2FscmVhZHkgYXZhaWxhYmxlIGNhbiBiZSBsb29rZWQgdXAgaW4gQGZpbGV7ZGF0YXR5cGVzL2RhdGF0eXBlcy5ofSAtIG5ldworb25lcyB3aWxsIGJlIGFkZGVkIHdoZW4gbmVjZXNzYXJ5KS4KK1RoZSBmaXJzdCAxNCBsaW5lcyBtdXN0IGNvbnRhaW4gdGhlIHJlcHJlc2VudGF0aW9ucyBmb3IgdGhlCitmb2xsb3dpbmcgdHlwZXM6CisKK0BlbnVtZXJhdGUKKyAgICAgICBAaXRlbSBAY29kZXtzaWduZWQgY2hhcn0KKyAgICAgICBAaXRlbSBAY29kZXt1bnNpZ25lZCBjaGFyfQorICAgICAgIEBpdGVtIEBjb2Rle3NpZ25lZCBzaG9ydH0KKyAgICAgICBAaXRlbSBAY29kZXt1bnNpZ25lZCBzaG9ydH0KKyAgICAgICBAaXRlbSBAY29kZXtzaWduZWQgaW50fQorICAgICAgIEBpdGVtIEBjb2Rle3Vuc2lnbmVkIGludH0KKyAgICAgICBAaXRlbSBAY29kZXtzaWduZWQgbG9uZ30KKyAgICAgICBAaXRlbSBAY29kZXt1bnNpZ25lZCBsb25nfQorICAgICAgIEBpdGVtIEBjb2Rle3NpZ25lZCBsb25nIGxvbmd9CisgICAgICAgQGl0ZW0gQGNvZGV7dW5zaWduZWQgbG9uZyBsb25nfQorICAgICAgIEBpdGVtIEBjb2Rle2Zsb2F0fQorICAgICAgIEBpdGVtIEBjb2Rle2RvdWJsZX0KKyAgICAgICBAaXRlbSBAY29kZXtsb25nIGRvdWJsZX0KKyAgICAgICBAaXRlbSBAY29kZXt2b2lkICp9CitAZW5kIGVudW1lcmF0ZQorCitJZiB0aGUgY29kZSBnZW5lcmF0b3IgY2FuIHVzZSBzZXZlcmFsIHJlcHJlc2VudGF0aW9ucywgdGhlc2UgY2FuIGJlCithZGRlZCBvbiB0aGUgc2FtZSBsaW5lIHNlcGFyYXRlZCBieSBzcGFjZXMuIEUuZy4gdGhlIGNvZGUgZ2VuZXJhdG9yCitmb3IgbTY4ayBkb2VzIG5vdCBjYXJlIGlmIHRoZSBpbnRlZ2VycyBhcmUgc3RvcmVkIGJpZy1lbmRpYW4gb3IKK2xpdHRsZS1lbmRpYW4gb24gdGhlIGhvc3Qgc3lzdGVtIGJlY2F1c2UgaXQgb25seSBhY2Nlc3NlcyB0aGVtIHRocm91Z2gKK3RoZSBwcm92aWRlZCBhcml0aG1ldGljIGZ1bmN0aW9ucy4gSXQgZG9lcywgaG93ZXZlciwgYWNjZXNzIGZsb2F0cworYW5kIGRvdWJsZXMgdGhyb3VnaCBieXRlLXBvaW50ZXJzIGFuZCB0aGVyZWZvcmUgcmVxdWlyZXMgdGhlbSB0bworYmUgc3RvcmVkIGluIGJpZy1lbmRpYW4tZm9ybWF0LgorCitAc3Vic2VjdGlvbiBUYXJnZXQgQXJpdGhtZXRpYworCitOb3cgeW91IGhhdmUgYSBsb3Qgb2YgZnVuY3Rpb25zL21hY3JvcyBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgdXNpbmcgdGhlCit0YXJnZXQgbWFjaGluZSdzIGFyaXRobWV0aWMuIFlvdSBjYW4gbG9vayB0aGVtIHVwIGluIEBmaWxle2R0LmgvZHQuY30uCitFLmcuIEBjb2Rle3ptYWRkKCl9IHRha2VzIHR3byBAY29kZXt6bWF4fSBhbmQgcmV0dXJucyB0aGVpciBzdW0gYXMgQGNvZGV7em1hZGR9LiBAY29kZXt6dW1hZGQoKX0gZG9lcwordGhlIHNhbWUgd2l0aCBAY29kZXt6dW1heH0sIEBjb2Rle3psZGFkZCgpfSB3aXRoIGxvbmcgZG91Ymxlcy4gTm8gZnVuY3Rpb25zIGZvciBzbWFsbGVyIHR5cGVzCithcmUgbmVlZGVkIGJlY2F1c2UgeW91IGNhbiBjYWxjdWxhdGUgd2l0aCB0aGUgd2lkZXIgdHlwZXMgYW5kIGNvbnZlcnQgdGhlCityZXN1bHRzIGRvd24gaWYgbmVlZGVkLgorCitUaGVyZWZvcmUsIHRoZXJlIGFyZSBhbHNvIGNvbnZlcnNpb24gZnVuY3Rpb25zIHdoaWNoIGNvbnZlcnQgYmV0d2VlbiB0eXBlcyBvZiB0aGUKK3RhcmdldCBtYWNoaW5lLiBFLmcuIEBjb2Rle3ptMnpjfSB0YWtlcyBhIEBjb2Rle3ptYXh9IGFuZCByZXR1cm5zIHRoZSB2YWx1ZQorY29udmVydGVkIHRvIGEgQGNvZGV7emNoYXJ9LgorQWdhaW4sIGxvb2sgYXQgQGZpbGV7ZHQuaC9kdC5jfSB0byBzZWUgd2hpY2ggb25lcyBhcmUgdGhlcmUuCisKK0EgZmV3IGZ1bmN0aW9ucyBmb3IgY29udmVydGluZyBiZXR3ZWVuIHRhcmdldCBhbmQgaG9zdCB0eXBlcyBhcmUgYWxzbwordGhlcmUsIGUuZy4gQGNvZGV7bDJ6bX0gdGFrZXMgYSBsb25nIGFuZCByZXR1cm5zIGl0IGNvbnZlcnRlZCB0byBAY29kZXt6bWF4fS4KKworQXQgbGFzdCB0aGVyZSBhcmUgZnVuY3Rpb25zIGZvciBjb21wYXJpbmcgdGFyZ2V0IGRhdGEgdHlwZXMuIEUuZy4KK0Bjb2Rle3ptbGVxKGEsYil9IHJldHVybnMgdHJ1ZSBpZiBAY29kZXt6bG9uZyBhIDw9IHpsb25nIGJ9IGFuZCBmYWxzZSBvdGhlcndpc2UuCitAY29kZXt6bGVxdG8oYSxiKX0gcmV0dXJucyB0cnVlIGlmIEBjb2Rle3psb25nIGEgPT0gemxvbmcgYn0gYW5kIGZhbHNlIG90aGVyd2lzZS4KKworCisKK0BzZWN0aW9uIEBmaWxle21hY2hpbmUuaH0KKworVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgQGZpbGV7bWFjaGluZS5ofS4KK05vdGUgdGhhdAorc29tZSBvcHRpb25hbCBtYWNyb3MvZGVjbGFyYXRpb24gbWF5IGJlIGRlc2NyaWJlZCBzb21lcGxhY2UgZWxzZSBpbiB0aGlzCittYW51YWwuCisKK0B0YWJsZSBAY29kZQorCitAaXRlbSAjaW5jbHVkZSAiZHQuaCIKK1RoaXMgc2hvdWxkIGJlIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gQGZpbGV7bWFjaGluZS5ofS4KKworQGl0ZW0gc3RydWN0IEFkZHJlc3NpbmdNb2RlIEB7IC4uLiBAfTsKK0lmIG1hY2hpbmUtc3BlY2lmaWMgYWRkcmVzc2luZyBtb2RlcyAoQHB4cmVme2FkZHJlc3Npbmdtb2Rlc30pIGFyZSB1c2VkLAorYW4gYXBwcm9wcmlhdGUgc3RydWN0dXJlIGNhbiBiZSBzcGVjaWZpZWQgaGVyZS4gT3RoZXJ3aXNlLCBqdXN0IGVudGVyCit0aGUgZm9sbG93aW5nIGNvZGU6CitAZXhhbXBsZQorc3RydWN0IEFkZHJlc3NpbmdNb2RlIEB7CisgICAgaW50IG5ldmVyX3VzZWQ7CitAfTsKK0BlbmQgZXhhbXBsZQorCitAaXRlbSAjZGVmaW5lIE1BWFIgPG4+CitJbnNlcnQgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgcmVnaXN0ZXJzLgorCitAaXRlbSAjZGVmaW5lIE1BWEdGIDxuPgorSW5zZXJ0IHRoZSBudW1iZXIgb2YgY29tbWFuZCBsaW5lIGZsYWdzIHRoYXQgY2FuIGJlIHVzZWQgdG8KK2NvbmZpZ3VyZSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBjb2RlIGdlbmVyYXRvci4gVGhpcyBtdXN0IGJlIGF0IGxlYXN0IG9uZQorZXZlbiBpZiB5b3UgZG8gbm90IHVzZSBhbnkgZmxhZ3MuCisKK0BpdGVtICNkZWZpbmUgVVNFUTJBU1ogPDAvMT4KK0lmIHRoaXMgaXMgc2V0IHRvIHplcm8sIEBjb21tYW5ke3ZiY2N9IHdpbGwgbm90IGdlbmVyYXRlIElDcyB3aXRoIHRoZQordGFyZ2V0IG9wZXJhbmQgYmVpbmcgdGhlIHNhbWUgYXMgdGhlIDJuZCBzb3VyY2Ugb3BlcmFuZC4KK1RoaXMgY2FuIHNvbWV0aW1lcyBzaW1wbGlmeSB0aGUgY29kZS1nZW5lcmF0b3IsIGJ1dCB1c3VhbGx5Cit0aGUgY29kZSBpcyBiZXR0ZXIgaWYgdGhlIGNvZGUtZ2VuZXJhdG9yIGFsbG93cyBpdC4KKworQGl0ZW0gI2RlZmluZSBNSU5BRERJMlAgPHR5cGU+CitJbnNlcnQgdGhlIHNtYWxsZXN0IGludGVnZXIgdHlwZQordGhhdCBjYW4gYmUgYWRkZWQgdG8gYSBwb2ludGVyLiBTbWFsbGVyIHR5cGVzIHdpbGwgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQKK3RvIHR5cGUgQGNvZGV7TUlOQURESTJQfSB3aGVuIHRoZXkgYXJlIHRvIGJlIGFkZGVkIHRvIGEgcG9pbnRlci4KK1RoaXMgbWF5IGJlIHN1YnN1bWVkIGJ5IEBjb2Rle3Nob3J0Y3V0KCl9IGluIHRoZSBmdXR1cmUuCisKK0BpdGVtICNkZWZpbmUgTUFYQURESTJQIDx0eXBlPgorSW5zZXJ0IHRoZSBsYXJnZXN0IGludGVnZXIgdHlwZQordGhhdCBjYW4gYmUgYWRkZWQgdG8gYSBwb2ludGVyLiBMYXJnZXIgdHlwZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZAordG8gdHlwZSBAY29kZXtNQVhBRERJMlB9IHdoZW4gdGhleSBhcmUgdG8gYmUgYWRkZWQgdG8gYSBwb2ludGVyLgorVGhpcyBtYXkgYmUgc3Vic3VtZWQgYnkgQGNvZGV7c2hvcnRjdXQoKX0gaW4gdGhlIGZ1dHVyZS4KKworQGl0ZW0gI2RlZmluZSBCSUdFTkRJQU4gPDAvMT4KK0luc2VydCAxIGlmIGludGVnZXJzIGFyZSByZXByZXNlbnRlZCBpbiBiaWcgZW5kaWFuLCBpLmUuIHRoZQorbW9zdCBzaWduaWZpY2FudCBieXRlIGlzIGF0IHRoZSBsb3dlc3QgbWVtb3J5IGFkZHJlc3MsIHRoZSBsZWFzdCBzaWduaWZpY2FudAorYnl0ZSBhdCB0aGUgaGlnaGVzdC4KKworQGl0ZW0gI2RlZmluZSBMSVRUTEVFTkRJQU4gPDAvMT4KK0luc2VydCAxIGlmIGludGVnZXJzIGFyZSByZXByZXNlbnRlZCBpbiBsaXR0bGUgZW5kaWFuLCBpLmUuCit0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBpcyBhdCB0aGUgbG93ZXN0IG1lbW9yeSBhZGRyZXNzLCB0aGUgbW9zdAorc2lnbmlmaWNhbnQgYnl0ZSBhdCB0aGUgaGlnaGVzdC4KKworQGl0ZW0gI2RlZmluZSBTV0lUQ0hTVUJTIDwwLzE+CitJbnNlcnQgMSBpZiBzd2l0Y2gtc3RhdGVtZW50cyBzaG91bGQgYmUgY29tcGlsZWQgaW50byBhCitzZXJpZXMgb2YgQGNvZGV7U1VCL1RFU1QvQkVRfSBpbnN0cnVjdGlvbnMgcmF0aGVyIHRoYW4gQGNvZGV7Q09NUEFSRS9CRVF9LgorVGhpcyBtYXkgYmUgdXNlZnVsIGlmIHRoZSB0YXJnZXQgaGFzIGEgbW9yZSBlZmZpY2llbnQgQGNvZGV7U1VCfS1pbnN0cnVjdGlvbgord2hpY2ggc2V0cyBjb25kaXRpb24gY29kZXMgKGUuZy4gNjhrKS4KKworQGl0ZW0gI2RlZmluZSBJTkxJTkVNRU1DUFkgPG4+CitJbnNlcnQgdGhlIGxhcmdlc3Qgc2l6ZSBpbiBieXRlcyBhbGxvd2VkIGZvciBpbmxpbmUgbWVtY3B5LgorSW4gb3B0aW1pemluZyBjb21waWxhdGlvbiwgY2VydGFpbiBsaWJyYXJ5IG1lbWNweS9zdHJjcHktY2FsbHMKK3dpdGggbGVuZ3RoIGtub3duIGF0IGNvbXBpbGUtdGltZSB3aWxsIGJlIGlubGluZWQgdXNpbmcgYW4KK0Bjb2Rle0FTU0lHTn0gSUMgaWYgdGhlIHNpemUgaXMgbGVzcyBvciBlcXVhbCB0byBAY29kZXtJTkxJTkVNRU1DUFl9LgorVGhlIHR5cGUgdXNlZCBmb3IgdGhlIEBjb2Rle0FTU0lHTn0gSUMgd2lsbCBiZSBAY29kZXtVTlNJR05FRHxDSEFSfS4KKworVGhpcyBtYXkgYmUgcmVwbGFjZWQgYnkgYSB2YXJpYWJsZSBvZiB0eXBlIEBjb2Rle3ptYXh9IGluIHRoZSBmdXR1cmUuCisKK0BpdGVtICNkZWZpbmUgT1JERVJFRF9QVVNIIDwwLzE+CitJbnNlcnQgMSBpZiBAY29kZXtQVVNIfSBJQ3MgZm9yIGZ1bmN0aW9uIGFyZ3VtZW50cyBzaGFsbAorYmUgZ2VuZXJhdGVkIGZyb20gbGVmdCB0byByaWdodCBpbnN0ZWFkIHJpZ2h0IHRvIGxlZnQuCisKK0BpdGVtICNkZWZpbmUgSEFWRV9SRUdQQVJNUyAxCitJbnNlcnQgdGhpcyBsaW5lIGlmIHRoZSBiYWNrZW5kIHN1cHBvcnRzIHJlZ2lzdGVyIHBhcmFtZXRlcnMKKyhAcHhyZWZ7cmVncGFybX0pLgorCitAaXRlbSAjZGVmaW5lIEhBVkVfUkVHUEFJUlMgMQorSW5zZXJ0IHRoaXMgbGluZSBpZiB0aGUgYmFja2VuZCBzdXBwb3J0cyByZWdpc3RlciBwYWlycworKEBweHJlZntyZWdwYWlyc30pLgorCitAaXRlbSAjZGVmaW5lIEhBVkVfSU5UX1NJWkVUIDEKK0luc2VydCB0aGlzIGxpbmUgaWYgQGNvZGV7c2l6ZV90fSBzaGFsbCBiZSBvZiB0eXBlIEBjb2Rle3Vuc2lnbmVkIGludH0KK3JhdGhlciB0aGFuIEBjb2Rle3Vuc2lnbmVkIGxvbmd9LgorCitAaXRlbSAjZGVmaW5lIEVNSVRfQlVGX0xFTiA8bj4KK0luc2VydCB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBsaW5lIG9mIGNvZGUgb3V0cHV0LgorCitAaXRlbSAjZGVmaW5lIEVNSVRfQlVGX0RFUFRIIDxuPgorSW5zZXJ0IHRoZSBudW1iZXIgb2Ygb3V0cHV0IGxpbmVzIHRoYXQgc2hvdWxkIGJlIGJ1ZmZlcmVkLiBUaGlzCitjYW4gYmUgdXNlZnVsIGZvciBwZWVwaG9sZS1vcHRpbWl6aW5nIHRoZSBhc3NlbWJseSBvdXRwdXQgKHNlZQorYmVsb3cpLgorCitAaXRlbSAjZGVmaW5lIEhBVkVfVEFSR0VUX1BFRVBIT0xFIDwwLzE+CitJbnNlcnQgMSBpZiB0aGUgYmFja2VuZCBwcm92aWRlcyBhbiBAY29kZXthc21fcGVlcGhvbGUoKX0KK2Z1bmN0aW9uIChAcHhyZWZ7YXNtcGVlcGhvbGV9KS4KKworQGl0ZW0gI2RlZmluZSBIQVZFX1RBUkdFVF9BVFRSSUJVVEVTIDEKK0luc2VydCB0aGlzIGxpbmUgaWYgdGhlIGJhY2tlbmQgcHJvdmlkZXMgb2xkIHRhcmdldC1zcGVjaWZpYwordmFyaWFibGUtYXR0cmlidXRlcyAoQHB4cmVme3RhcmdldGF0dHJpYnV0ZXN9KS4KKworQGl0ZW0gI2RlZmluZSBIQVZFX1RBUkdFVF9QUkFHTUFTIDEKK0luc2VydCB0aGlzIGxpbmUgaWYgdGhlIGJhY2tlbmQgcHJvdmlkZXMgdGFyZ2V0LXNwZWNpZmljCitAY29kZXsjcHJhZ21hfS1kaXJlY3RpdmVzIChAcHhyZWZ7dGFyZ2V0cHJhZ21hc30pLgorCitAaXRlbSAjZGVmaW5lIEhBVkVfUkVHU19NT0RJRklFRCAxCitJbnNlcnQgdGhpcyBsaW5lIGlmIHRoZSBiYWNrZW5kIHN1cHBvcnRzIGludGVyLXByb2NlZHVyYWwKK3JlZ2lzdGVyLWFsbG9jYXRpb24gKEBweHJlZntyZWdzbW9kaWZpZWR9KS4KKworQGl0ZW0gI2RlZmluZSBIQVZFX1RBUkdFVF9SQUxMT0MgMQorSW5zZXJ0IHRoaXMgbGluZSBpZiB0aGUgYmFja2VuZCBzdXBwb3J0cyBjb250ZXh0LXNlbnNpdGl2ZQorcmVnaXN0ZXItYWxsb2NhdGlvbiAoQHB4cmVme3RhcmdldHJhbGxvY30pLgorCitAaXRlbSAjZGVmaW5lIEhBVkVfVEFSR0VUX0VGRl9JQyAxCitJbnNlcnQgdGhpcyBsaW5lIGlmIHRoZSBiYWNrZW5kIHByb3ZpZGVzIGEgQGNvZGV7bWFya19lZmZfaWNzKCl9CitmdW5jdGlvbiAoQHB4cmVme21hcmtlZmZpY3N9KS4KKworQGl0ZW0gI2RlZmluZSBIQVZFX0VYVF9JQyAxCitJbnNlcnQgdGhpcyBsaW5lIGlmIHRoZSBiYWNrZW5kIHByb3ZpZGVzIGEgQGNvZGV7c3RydWN0IGV4dF9pY30KKyhAcHhyZWZ7ZXh0aWN9KS4KKworQGl0ZW0gI2RlZmluZSBIQVZFX0VYVF9UWVBFUyAxCitJbnNlcnQgdGhpcyBsaW5lIGlmIHRoZSBiYWNrZW5kIHN1cHBvcnRzIGFkZGl0aW9uYWwgdHlwZXMKKyhAcHhyZWZ7ZXh0dHlwZXN9KS4KKworQGl0ZW0gI2RlZmluZSBIQVZFX1RHVF9QUklOVFZBTCAxCitJbnNlcnQgdGhpcyBsaW5lIGlmIHRoZSBiYWNrZW5kIHByb3ZpZGVzIGFuIG93biBAY29kZXtwcmludHZhbH0gZnVuY3Rpb24KK0BweHJlZnt0Z3RwcmludHZhbH0pLgorCitAaXRlbSAjZGVmaW5lIEpVTVBfVEFCTEVfREVOU0lUWSA8ZmxvYXQ+CitAaXRlbSAjZGVmaW5lIEpVTVBfVEFCTEVfTEVOR1RIIDxpbnQ+CitUaGVzZSB2YWx1ZXMgY29udHJvbHMgdGhlIGNyZWF0aW9uIG9mIGp1bXAtdGFibGVzIChAcHhyZWZ7anVtcHRhYmxlc30pLgorCisKK0BpdGVtICNkZWZpbmUgQUxMT0NWTEFfUkVHIDxyZWc+CitAaXRlbSAjZGVmaW5lIEFMTE9DVkxBX0lOTElORUFTTSA8aW5saW5lLWFzbT4KK0BpdGVtICNkZWZpbmUgRlJFRVZMQV9SRUcgPHJlZz4KK0BpdGVtICNkZWZpbmUgRlJFRVZMQV9JTkxJTkVBU00gPGlubGluZS1hc20+CitAaXRlbSAjZGVmaW5lIE9MRFNQVkxBX0lOTElORUFTTSA8aW5saW5lLWFzbT4KK0BpdGVtICNkZWZpbmUgRlBWTEFfUkVHIDxyZWc+CitOZWNlc3NhcnkgZGVmaW5lcyBmb3IgQzk5IHZhcmlhYmxlLWxlbmd0aC1hcnJheXMgKEBweHJlZnt2bGFzfSkuCisKK0BpdGVtICNkZWZpbmUgSEFWRV9MSUJDQUxMUyAxCitJbnNlcnQgdGhpcyBsaW5lIGlmIHRoZSBiYWNrZW5kIHdhbnRzIGNlcnRhaW4gSUNzIHRvIGJlIHJlcGxhY2VkIHdpdGgKK2NhbGxzIHRvIGxpYnJhcnkgZnVuY3Rpb25zIChAcHhyZWZ7bGliY2FsbHN9KS4KKworQGl0ZW0gI2RlZmluZSBBVk9JRF9GTE9BVF9UT19VTlNJR05FRCAxCitAaXRlbSAjZGVmaW5lIEFWT0lEX1VOU0lHTkVEX1RPX0ZMT0FUIDEKK0luc2VydCB0aGVzZSBsaW5lcyB0byB0ZWxsIHRoZSBmcm9udGVuZCBub3QgdG8gZ2VuZXJhdGUgQGNvZGV7Q09OVkVSVH0gSUNzCit0aGF0IGNvbnZlcnQgYmV0d2VlbiB1bnNpZ25lZCBpbnRlZ2VycyBhbmQgZmxvYXRpbmcgcG9pbnQuIEluIHRob3NlIGNhc2VzLAorYWRkaXRpb25hbCBpbnRlcm1lZGlhdGUgY29kZSB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0IGltcGxlbWVudHMgdGhlCitjb252ZXJzaW9uIHVzaW5nIG9ubHkgc2lnbmVkIGludGVnZXJzLgorCitAZW5kIHRhYmxlCisKK0BzZWN0aW9uIEBmaWxle21hY2hpbmUuY30KKworVGhpcyBpcyB0aGUgbWFpbiBwYXJ0IG9mIHRoZSBjb2RlIGdlbmVyYXRvci4gVGhlIGZpcnN0IHN0YXRlbWVudAorc2hvdWxkIGJlIEBjb2RleyNpbmNsdWRlICJzdXBwLmgifSB3aGljaCB3aWxsIGluY2x1ZGUgYWxsIG5lY2Vzc2FyeQorZGVjbGFyYXRpb25zLgorCitUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIG11c3QgYmUgcHJvdmlkZWQgYnkgbWFjaGluZS5jLgorCitAc3Vic2VjdGlvbiBOYW1lIGFuZCBDb3B5cmlnaHQKKworICAgIFRoZSBjb2RlZ2VuZXJhdGVyIG11c3QgZGVmaW5lIGEgemVyby10ZXJtaW5hdGVkIGNoYXJhY3RlciBhcnJheQorICAgIEBjb2Rle2NoYXIgY2dfY29weXJpZ2h0W107fSBjb250YWluaW5nIG5hbWUgYW5kIGNvcHlyaWdodC1ub3RpY2Ugb2YKKyAgICB0aGUgY29kZS1nZW5lcmF0b3IuCisKK0BzdWJzZWN0aW9uIENvbW1hbmQgTGluZSBPcHRpb25zCisKKyAgICBZb3UgY2FuIHVzZSBjb2RlIGdlbmVyYXRvciBzcGVjaWZpYyBjb21tYW5kbGluZSBvcHRpb25zLgorICAgIFRoZSBudW1iZXIgb2YgZmxhZ3MgaXMgc3BlY2lmaWVkIGFzIEBjb2Rle01BWEdGfSBpbiBAZmlsZXttYWNoaW5lLmh9LgorICAgIEluc2VydCB0aGUgbmFtZXMgZm9yIHRoZSBmbGFncyBhcyBAY29kZXtjaGFyICpnX2ZsYWdzX25hbWVbTUFYR0ZdfS4KKyAgICBJZiBhbiBvcHRpb24gd2FzIHNwZWNpZmllZCBAY29kZXsoZ19mbGFnc1tpXSZVU0VERkxBRyl9IGlzIG5vdCB6ZXJvLgorICAgIEluIEBjb2Rle2ludCBnX2ZsYWdzW01BWEdGXX0geW91IGNhbiBjaG9vc2UgaG93IHRoZSBvcHRpb25zIGFyZSB0byBiZQorICAgIHVzZWQ6CitAdGFibGUgQGNvZGUKKyAgICAgICAgQGl0ZW0gMAorICAgICAgICAgICAgICAgIFRoZSBvcHRpb24gY2FuIG9ubHkgYmUgc3BlY2lmaWVkLiBFLmcuIGlmCisgICAgICAgICAgICAgICAgQGNvZGV7Z19mbGFnc19uYW1lWzJdPT0ibXlmbGFnIn0sIHRoZSBjb21tYW5kbGluZSBtYXkgY29udGFpbgorICAgICAgICAgICAgICAgIEBvcHRpb257LW15ZmxhZ30gYW5kIEBjb2RleyhnX2ZsYWdzWzJdJlVTRURGTEFHKSE9MH0uCisgICAgICBAaXRlbSBWQUxGTEFHCisgICBUaGUgb3B0aW9uIG11c3QgYmUgc3BlY2lmaWVkIHdpdGggYW4gaW50ZWdlciBjb25zdGFudCwgZS5nLgorICAgICAgICAgICAgICAgIEBvcHRpb257LW15ZmxhZz0xMjM0fS4gVGhpcyB2YWx1ZSBjYW4gYmUgZm91bmQgaW4KKyAgICAgICAgICAgICAgICBAY29kZXtnX2ZsYWdzX3ZhbFsyXS5sfS4KKyAgIEBpdGVtICBTVFJJTkdGTEFHCisgICBUaGUgb3B0aW9uIG11c3QgYmUgc3BlY2lmaWVkIHdpdGggYSBzdHJpbmcsIGUuZy4KKyAgICAgICAgICAgICAgICBAb3B0aW9uey1teWZsYWc9SGFsbG99LiBUaGUgcG9pbnRlciB0byB0aGUgc3RyaW5nIGNhbiBiZSBmb3VuZCBpbgorICAgICAgICAgICAgICAgIEBjb2Rle2dfZmxhZ3NfdmFsWzJdLnB9LgorQGVuZCB0YWJsZQorCitAc3Vic2VjdGlvbiBEYXRhIFR5cGVzCisKK1RoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGhhdmUgdG8gYmUgaW5pdGlhbGl6ZWQgdG8gZGVzY3JpYmUgdGhlCityZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0YSB0eXBlcy4KKworQHRhYmxlIEBjb2RlCitAaXRlbSBNQVhfVFlQRQorIFRoaXMgbWFjcm8gY29udGFpbnMgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgdHlwZXMuIEluIGNhc2Ugb2YgdGFyZ2V0LXNwZWNpZmljCisgZXh0ZW5kZWQgdHlwZXMgKEBweHJlZntleHR0eXBlc30pIHRoaXMgaXMgc2V0IGJ5IHRoZSBiYWNrZW5kLCBvdGhlcndpc2UgdGhlCisgZnJvbnRlbmQgd2lsbCB1c2UgYSBkZWZhdWx0LgorCitAaXRlbSB6bWF4IGNoYXJfYml0OworIFRoZSBudW1iZXIgb2YgYml0cyBpbiBhIEBjb2Rle2NoYXJ9IG9uIHRoZSB0YXJnZXQgKHVzdWFsbHkgOCkuCisKK0BpdGVtICAgIHptYXggYWxpZ25bTUFYX1RZUEUrMV07CisgVGhpcyBhcnJheSBtdXN0IGNvbnRhaW4gdGhlIG5lY2Vzc2FyeSBhbGlnbm1lbnRzIGZvciBldmVyeQorICAgIHR5cGUgaW4gYnl0ZXMuIFNvbWUgb2YgdGhlIGVudHJpZXMgaW4gdGhpcyBhcnJheSBhcmUgbm90IGFjdHVhbGx5CisgICAgdXNlZCwgYnV0IEBjb2Rle2FsaWduW3R5cGUmTlFdfSBtdXN0IHlpZWxkIHRoZSBjb3JyZWN0IGFsaWdubWVudCBmb3IgZXZlcnkgdHlwZS4KKyAgICBAY29kZXthbGlnbltDSEFSXX0gbXVzdCBiZSAxLgorCisgICAgVGhlIGFsaWdubWVudCBvZiBhIHN0cnVjdHVyZSBkZXBlbmRzIG5vdCBvbmx5IG9uIEBjb2Rle3NpemV0YWJbU1RSVUNUXX0KKyAgICBidXQgYWxzbyBvbiB0aGUgYWxpZ25tZW50IG9mIHRoZSBtZW1iZXJzLiBUaGUgbWF4aW11bSBvZiB0aGUgYWxpZ25tZW50cworICAgIG9mIGFsbCBtZW1iZXJzIGFuZCBAY29kZXtzaXpldGFiW1NUUlVDVF19IGlzIHRoZSBhbGlnbm1lbnQgb2YgYW55CisgICAgcGFydGljdWxhciBzdHJ1Y3R1cmUsIGkuZS4gQGNvZGV7c2l6ZXRhYltTVFJVQ1RdfSBpcyBvbmx5IGEgbWluaW11bQorICAgIGFsaWdubWVudC4KKworICAgIFRoZSBzYW1lIGFwcGxpZXMgdG8gdW5pb25zIGFuZCBhcnJheXMuCisKK0BpdGVtIHptYXggbWF4YWxpZ247CisgICAgICAgIFRoaXMgdmFyaWFibGUgIG11c3QgYmUgc2V0IHRvIGFuIGFsaWdubWVudCBpbiBieXRlcyB0aGF0IGlzIHVzZWQgd2hlbgorICAgIHB1c2hpbmcgYXJndW1lbnRzIG9uIHRoZSBzdGFjay4gKEZJWE1FOiBkZXNjcmliZSBzdGFja2FsaWduKQorCitAaXRlbSB6bWF4IHNpemV0YWJbTUFYX1RZUEUrMV07CisgVGhpcyBhcnJheSBtdXN0IGNvbnRhaW4gdGhlIHNpemVzIG9mIGV2ZXJ5IHR5cGUgaW4gYnl0ZXMuCisKK0BpdGVtIHptYXggdF9taW5bTUFYX1RZUEUrMV07CisgIFRoaXMgYXJyYXkgbXVzdCBjb250YWluIHRoZSBzbWFsbGVzdCByZXByZXNlbnRhYmxlIG51bWJlciBmb3IgZXZlcnkKKyAgICBzaWduZWQgaW50ZWdlciB0eXBlLgorCitAaXRlbSB6dW1heCB0X21heFtNQVhfVFlQRSsxXTsKKyAgVGhpcyBhcnJheSBtdXN0IGNvbnRhaW4gdGhlIGxhcmdlc3QgcmVwcmVzZW50YWJsZSBudW1iZXIgZm9yIGV2ZXJ5CisgICAgc2lnbmVkIGludGVnZXIgdHlwZS4KKworQGl0ZW0genVtYXggdHVfbWF4W01BWF9UWVBFKzFdOworICBUaGlzIGFycmF5IG11c3QgY29udGFpbiB0aGUgbGFyZ2VzdCByZXByZXNlbnRhYmxlIG51bWJlciBmb3IgZXZlcnkKKyAgICB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUuCisKK0BlbmQgdGFibGUKKworICAgIEFzIEBjb2Rle3ptYXh9IGFuZCBAY29kZXt6dW1heH0gbWF5IGJlIG5vIGVsZW1lbnRhcnkgdHlwZXMgb24gdGhlIGhvc3QKKyAgICBtYWNoaW5lLCB0aG9zZSBhcnJheXMgaGF2ZSB0byBiZSBpbml0aWFsaXplZCBkeW5hbWljYWxseSAoaW4gCisgICAgQGNvZGV7aW5pdF9jZygpfSkuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBleHBsaWNpdCB0eXBlbmFtZXMsIGUuZy4KKyAgICBAY29kZXtzaXpldGFiW0lOVF09bDJ6bSg0TCk7fSB0byBrZWVwIGl0IHBvcnRhYmxlIGFuZCBhbGxvdworICAgIGxhdGVyIGV4dGVuc2lvbnMgb2YgdGhlIHR5cGUgc3lzdGVtLgorCisgICAgQWxzbyBub3RlIHRoYXQgdGhvc2UgdmFsdWVzCisgICAgbWF5IG5vdCBiZSByZXByZXNlbnRhYmxlIGFzIGNvbnN0YW50cyBieSB0aGUgaG9zdCBhcmNoaXRlY3R1cmUgYW5kIGhhdmUgdG8KKyAgICBiZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBmdW5jdGlvbnMgZm9yIGFyaXRobWV0aWMgb24gdGhlIHRhcmdldCdzIGRhdGEKKyAgICB0eXBlcy4gRS5nLiB0aGUgc21hbGxlc3QgcmVwcmVzZW50YWJsZSB2YWx1ZSBvZiBhIDMyYml0IHR3b3MtY29tcGxlbWVudAorICAgIGRhdGEgdHlwZSBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSB2YWxpZCBvbiBldmVyeSBBTlNJIEMgaW1wbGVtZW50YXRpb24uCisKKyAgICBZb3UgbWF5IG5vdCB1c2Ugc2ltcGxlIG9wZXJhdG9ycyBvbiB0aGUgdGFyZ2V0IGRhdGEgdHlwZXMKKyAgICBidXQgeW91IGhhdmUgdG8gdXNlIHRoZSBmdW5jdGlvbnMgb3IgY29udmVydCB0aGVtIHRvIGFuIGVsZW1lbnRhcnkKKyAgICB0eXBlIG9mIHRoZSBob3N0IG1hY2hpbmUgYmVmb3JlIChpZiB5b3Uga25vdyB0aGF0IGl0IGlzIHJlcHJlc2VudGFibGUKKyAgICBhcyBzdWNoKS4KKworQHN1YnNlY3Rpb24gUmVnaXN0ZXIgU2V0CisKK1RoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGhhdmUgdG8gYmUgaW5pdGlhbGl6ZWQgdG8gZGVzY3JpYmUgdGhlCityZWdpc3RlciBzZXQgb2YgdGhlIHRhcmdldC4KKworQHRhYmxlIEBjb2RlCitAaXRlbSBNQVhSCisgICAgVGhlIHZhbGlkIHJlZ2lzdGVycyBhcmUgbnVtYmVyZWQgZnJvbSAxLi5AY29kZXtNQVhSfS4KKyAgICBAY29kZXtNQVhSfSBtdXN0IGJlIEBjb2RleyNkZWZpbmV9ZCBpbiBAZmlsZXttYWNoaW5lLmh9LgorCitAaXRlbSBjaGFyICpyZWduYW1lc1tNQVhSKzFdCitUaGlzIGFycmF5IG11c3QgY29udGFpbiB0aGUgbmFtZXMgZm9yIGV2ZXJ5IHJlZ2lzdGVyLiBUaGV5IGRvIG5vdAorbmVjZXNzYXJpbHkgaGF2ZSB0byBiZSB1c2VkIGluIHRoZSBhc3NlbWJseSBvdXRwdXQgYnV0IGFyZSB1c2VkIGZvcgorZXhwbGljaXQgcmVnaXN0ZXIgYXJndW1lbnRzLgorCitAaXRlbSB6bWF4IHJlZ3NpemVbTUFYUisxXQorVGhpcyBhcnJheSBtdXN0IGNvbnRhaW4gdGhlIHNpemUgb2YgZWFjaCByZWdpc3RlciBpbiBieXRlcy4KKyAgICBJdCBpcyB1c2VkIHRvIGNyZWF0ZSBzdG9yYWdlIGlmIHJlZ2lzdGVycyBoYXZlIHRvIGJlIHNhdmVkLgorCitAaXRlbSBpbnQgcmVnc2NyYXRjaFtNQVhSKzFdCitUaGlzIGFycmF5IG11c3QgY29udGFpbiBpbmZvcm1hdGlvbiB3aGV0aGVyIGEgcmVnaXN0ZXIgaXMKKyAgICBhIHNjcmF0Y2hyZWdpc3RlciwgaS5lLiBtYXkgYmUgZGVzdHJveWVkIGR1cmluZyBhIGZ1bmN0aW9uIGNhbGwgKDEgb3IgMCkuCisgICAgdmJjYyB3aWxsIGdlbmVyYXRlIGNvZGUgdG8gc2F2ZS9yZXN0b3JlIGFsbCBzY3JhdGNoLXJlZ2lzdGVycyB3aGljaCBhcmUKKyAgICBhc3NpZ25lZCBhIHZhbHVlIHdoZW4gY2FsbGluZyBhIGZ1bmN0aW9uICh1bmxlc3MgaXQga25vd3MgdGhlIHJlZ2lzdGVyCisgICAgd2lsbCBub3QgYmUgbW9kaWZpZWQpLiBIb3dldmVyLCBpZiB0aGUgY29kZSBnZW5lcmF0b3IKKyAgICB1c2VzIGFkZGl0aW9uYWwgc2NyYXRjaC1yZWdpc3RlcnMgaXQgaGFzIHRvIHRha2UgY2FyZSB0byBzYXZlL3Jlc3RvcmUKKyAgICB0aGVtLgorCisgICAgQWxzbywgdGhlIGNvZGUgZ2VuZXJhdG9yIG11c3QgdGFrZSBjYXJlIHRoYXQgdXNlZCBub24tc2NyYXRjaC1yZWdpc3RlcnMKKyAgICBhcmUgc2F2ZWQvcmVzdG9yZWQgb24gZnVuY3Rpb24gZW50cnkvZXhpdC4KKworQGl0ZW0gaW50IHJlZ3NhW01BWFIrMV0KK1RoaXMgYXJyYXkgbXVzdCBjb250YWluIGluZm9ybWF0aW9uIHdoZXRoZXIgYSByZWdpc3RlciBpcyBpbiB1c2UKKyAgICBvciBub3QgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGZ1bmN0aW9uICgxIG9yIDApLgorICAgIFRoZSBjb21waWxlciB3aWxsIG5vdCB1c2UgYW55IG9mIHRob3NlIHJlZ2lzdGVycyBmb3IgcmVnaXN0ZXIgdmFyaWFibGVzCisgICAgb3IgdGVtcG9yYXJpZXMsIHRoZXJlZm9yZSB0aGlzIGNhbiBiZSB1c2VkIHRvIG1hcmsgc3BlY2lhbCByZWdpc3RlcnMKKyAgICBsaWtlIGEgc3RhY2stIG9yIGZyYW1lLXBvaW50ZXIgYW5kIHRvIHJlc2VydmUgcmVnaXN0ZXJzIHRvIHRoZQorICAgIGNvZGUtZ2VuZXJhdG9yLiBUaGUgbGF0dGVyIG1heQorICAgIGJlIHJlYXNvbmFibGUgaWYgZm9yIG1hbnkgSUNzIGNvZGUgY2Fubm90IGJlIGdlbmVyYXRlZCB3aXRob3V0IHVzaW5nCisgICAgYWRkaXRpb25hbCByZWdpc3RlcnMuCisKKyAgICBZb3UgbXVzdCBzZXQgQGNvZGV7cmVnc3JhdGNoW2ldID0gMH0gaWYgQGNvZGV7cmVnc2FbaV0gPT0gMX0uIElmIHlvdQorICAgIHdhbnQgaXQgdG8gYmUKKyAgICBzYXZlZCBhY3Jvc3MgZnVuY3Rpb24gY2FsbHMgdGhlIGNvZGUgZ2VuZXJhdG9yIGhhcyB0byB0YWtlIGNhcmUgb2YgdGhpcy4KKworQGl0ZW0gaW50IHJlZ19wcmlvW01BWFIrMV07CitUaGlzIGFycmF5IG11c3QgY29udGFpbiBhIHByaW9yaXR5ICg+PTApIGZvciBldmVyeSByZWdpc3Rlci4gV2hlbiB0aGUKK3JlZ2lzdGVyIGFsbG9jYXRvciBoYXMgdG8gY2hvb3NlIGJldHdlZW4gc2V2ZXJhbCByZWdpc3RlcnMgd2hpY2ggc2VlbQordG8gYmUgZXF1YWwsIGl0IHdpbGwgY2hvb3NlIHRoZSBvbmUgd2l0aCB0aGUgaGlnaGVzdCBwcmlvcml0eSAoaWYKK3NldmVyYWwgcmVnaXN0ZXJzIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHkgaXQgaXMgdW5kZWZpbmVkIHdoaWNoIG9uZQord2lsbCBiZSB0YWtlbikuCisKK05vdGUgdGhhdCB0aGlzIHByaW9yaXR5IGlzIG9ubHkgdGhlIGxhc3QgZGVjaXNpb24gZmFjdG9yIGlmIGV2ZXJ5dGhpbmcKK2Vsc2Ugc2VlbXMgdG8gYmUgZXF1YWwuIElmIG9uZSByZWdpc3RlciBzZWVtcyB0byBnaXZlIGEgaGlnaGVyIGNvc3Qgc2F2aW5nCisoYWNjb3JkaW5nIHRvIHRoZSBlc3RpbWF0aW9uIG9mIHRoZSByZWdpc3RlciBhbGxvY2F0b3IpIGJ1dCBoYXMgYSBsb3dlcgorcHJpb3JpdHksIGl0IHdpbGwgbmV2ZXJ0aGVsZXNzIGJlIHVzZWQuIFRoZSBwcmlvcml0eSBjYW4gYmUgdXNlZCB0bworZmluZS10dW5lIHRoZSByZWdpc3RlciBzZWxlY3Rpb24uIFNvbWUgZ3VpZGVsaW5lczoKK0BpdGVtaXplIEBtaW51cworQGl0ZW0gU2NyYXRjaCByZWdpc3RlcnMgbWlnaHQgaGF2ZSBhIGhpZ2hlciBwcmlvcml0eSB0aGFuIG5vbi1zY3JhdGNoCisgICAgICAgIHJlZ2lzdGVycyAoYWx0aG91Z2ggdGhlIHJlZ2lzdGVyLWFsbG9jYXRvciB3aWxsIHVzdWFsbHkgaGFuZGxlCisgICAgICAgIHRoaXMgYW55d2F5KS4KK0BpdGVtIFJlZ2lzdGVycyB3aGljaCBhcmUgbW9yZSByZXN0cmljdGVkIHNob3VsZCBoYXZlIGEgaGlnaGVyIHByaW9yaXR5CisgICAgICAgIChpZiB0aGV5IHNlZW0gdG8gZ2l2ZSB0aGUgc2FtZSBzYXZpbmcgaXQgaXMgdXN1YWxseSBiZXR0ZXIgdG8gdXNlCisgICAgICAgIHRoZSByZXN0cmljdGVkIHJlZ2lzdGVycyBhbmQgdHJ5IHRvIGtlZXAgdGhlIG1vcmUgdmVyc2F0aWxlIG9uZXMKKyAgICAgICAgZm9yIHNpdHVhdGlvbiBpbiB3aGljaCB0aGV5IGNhbiBnaXZlIGJldHRlciBzYXZpbmdzKS4KK0BpdGVtIFJlZ2lzdGVycyB3aGljaCBhcmUgdXNlZCBmb3IgYXJndW1lbnQtcGFzc2luZyBzaG91bGQgaGF2ZSBsb3dlcgorICAgICAgICBwcmlvcml0eSB0aGFuIHJlZ2lzdGVycyBub3QgdXNlZCBmb3IgYXJndW1lbnRzLiBUaGUgcHJpb3JpdHkKKyAgICAgICAgd2l0aGluIHRoZSBhcmd1bWVudC1yZWdpc3RlcnMgc2hvdWxkIGRlY3JlYXNlIGFzIHRoZSBmcmVxdWVuY3kKKyAgICAgICAgb2YgdXNhZ2UgYXMgYXJndW1lbnQgaW5jcmVhc2VzICh0eXBpY2FsbHkgdGhlIHJlZ2lzdGVyIGZvciB0aGUgZmlyc3QKKyAgICAgICAgYXJndW1lbnQgaXMgdXNlZCBtb3N0IGZyZXF1ZW50bHksIGV0Yy4pLgorQGVuZCBpdGVtaXplCisKK0BlbmQgdGFibGUKKworTm90ZSB0aGF0IGZvciB0aGUgYXJyYXkgQGNvZGV7em1heCByZWdzaXplW119IHRoZSBzYW1lIGNvbW1lbnRzIG1lbnRpb25lZAoraW4gdGhlIHNlY3Rpb24gb24gZGF0YSB0eXBlcyByZWdhcmRpbmcgaW5pdGlhbGl6YXRpb24gYXBwbHkuCisKKworQHN1YnNlY3Rpb24gRnVuY3Rpb25zCisKK1RoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGhhdmUgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yLgorVGhlcmUgbWF5IGJlIG9wdGlvbmFsIGFkZGl0aW9uYWwgZnVuY3Rpb25zIGRlc2NyaWJlZCBpbiBvdGhlciBzZWN0aW9ucy4KKworQHRhYmxlIEBjb2RlCitAaXRlbSBpbnQgaW5pdF9jZyh2b2lkKTsKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgY29tbWFuZGxpbmUgYXJndW1lbnRzIGFyZSBwYXJzZWQuCisgICAgSXQgY2FuIHNldCB1cCBjZXJ0YWluIGludGVybmFsIGRhdGEsIGV0Yy4gVGhlIGFycmF5cyByZWdhcmRpbmcgdGhlCisgICAgZGF0YSB0eXBlcyBhbmQgdGhlIHJlZ2lzdGVyIHNldCBjYW4gYmUgc2V0IHVwIGF0IHRoaXMgcG9pbnQgcmF0aGVyCisgICAgdGhhbiB3aXRoIGEgc3RhdGljIGluaXRpYWxpemF0aW9uLCBob3dldmVyIHRoZSBhcnJheXMgcmVnYXJkaW5nIHRoZQorICAgIGNvbW1hbmRsaW5lIG9wdGlvbnMgaGF2ZSB0byBiZSBzdGF0aWMgaW5pdGlhbGl6ZWQuCisgICAgVGhlIHJlc3VsdHMgb2YgdGhlIGNvbW1hbmRsaW5lIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSBhdCB0aGlzIHBvaW50LgorCisgICAgSWYgc29tZXRoaW5nIGdvZXMgd3JvbmcsIDAgaGFzIHRvIGJlIHJldHVybmVkLCBvdGhlcndpc2UgMS4KKworQGl0ZW0gdm9pZCBjbGVhbnVwX2NnKEZJTEUgKmYpOworICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSB0aGUgY29tcGlsZXIgZXhpdHMuIEBjb2Rle2Z9IGlzIHRoZSBvdXRwdXQKKyAgICBmaWxlIHdoaWNoIG11c3QgYmUgY2hlY2tlZCBhZ2FpbnN0IDAgYmVmb3JlIHVzaW5nLgorCitAaXRlbSBpbnQgZnJldHVybihzdHJ1Y3QgVHlwICp0KTsKKyAgICBUaGlzIGZ1bmN0aW9uIGhhcyB0byByZXR1cm4gdGhlIG51bWJlciBvZiB0aGUgcmVnaXN0ZXIgcmV0dXJuCisgICAgdmFsdWVzIG9mIHR5cGUgQGNvZGV7dH0gYXJlIHBhc3NlZCBpbi4gSWYgdGhlIHR5cGUgaXMgbm90IHBhc3NlZCBpbiBhCisgICAgcmVnaXN0ZXIsIDAgbXVzdCBiZSByZXR1cm5lZC4gVXN1YWxseSB0aGUgZGVjaXNpb24gY2FuIGJlIG1hZGUKKyAgICBvbmx5IGNvbnNpZGVyaW5nIEBjb2Rle3QtPmZsYWdzfSwgaWdub3JpbmcgdGhlIGZ1bGwgdHlwZQorICAgIChAcHhyZWZ7Y29tcG9zaXRldHlwZXN9KS4KKworQGl0ZW0gaW50IHJlZ29rKGludCByLCBpbnQgdCwgaW50IG1vZGUpOworICAgIENoZWNrIHdoZXRoZXIgdGhlIHR5cGUgdCBjYW4gYmUgc3RvcmVkIGluIHJlZ2lzdGVyIEBjb2Rle3J9IGFuZCB3aGV0aGVyCisgICAgdGhlIHVzdWFsIG9wZXJhdGlvbnMgKGZvciB0aGlzIHR5cGUpIGNhbiBiZSBnZW5lcmF0ZWQuIFJldHVybiAwLCBpZiBub3QuCisKKyAgICBJZiBAY29kZXt0fSBpcyBhIHBvaW50ZXIgYW5kIEBjb2Rle21vZGU9PTB9IHRoZSByZWdpc3RlciBvbmx5IGhhcyB0byBiZQorICAgIGFibGUgdG8gc3RvcmUgdGhlIHBvaW50ZXIgYW5kIGRvIGFyaXRobWV0aWMsIGJ1dCBpZiBAY29kZXttb2RlIT0wfSBpdCBoYXMKKyAgICB0byBiZSBhYmxlIHRvIGRlcmVmZXJlbmNlIHRoZSBwb2ludGVyLgorCisgICAgQGNvZGV7bW9kZT09LTF9IGlzIHVzZWQgd2l0aCBjb250ZXh0LXNlbnNpdGl2ZSByZWdpc3Rlci1hbGxvY2F0aW9uCisgICAgKEBweHJlZnt0YXJnZXRyYWxsb2N9KS4gSWYgdGhlIGJhY2tlbmQgZG9lcyBub3Qgc3VwcG9ydCBpdCwgdGhpcyBjYXNlCisgICAgY2FuIGJlIGhhbmRsZWQgZXF1aXZhbGVudCB0byBAY29kZXttb2RlPT0wfS4KKworICAgIElmIEBjb2Rle3Q9PTB9IHJldHVybiB3aGV0aGVyIHRoZSByZWdpc3RlciBjYW4gYmUgdXNlZCB0byBzdG9yZSBjb25kaXRpb24gY29kZXMuCisgICAgVGhpcyBpcyBvbmx5IHJlbGV2YW50IGlmIEBjb2Rle211bHRpcGxlX2Njc30gaXMgc2V0IHRvIDEuCisKK0BpdGVtIGludCBkYW5nZXJvdXNfSUMoc3RydWN0IElDICpwKTsKKyAgICBDaGVjayBpZiB0aGlzIElDIGNhbiByYWlzZSBleGNlcHRpb25zIG9yIGlzIG90aGVyd2lzZSBkYW5nZXJvdXMuCisgICAgTW92ZW1lbnQgb2YgSUNzIHdoaWNoIGFyZSBkYW5nZXJvdXMgaXMgcmVzdHJpY3RlZCB0byBwcmVzZXJ2ZSB0aGUKKyAgICBzZW1hbnRpY3Mgb2YgdGhlIHByb2dyYW0uCisKKyAgICBUeXBpY2FsIGRhbmdlcm91cyBJQ3MgYXJlIGRpdmlzaW9ucyBvciBwb2ludGVyIGRlcmVmZXJlbmNpbmcuIE9uIGNlcnRhaW4KKyAgICB0YXJnZXRzIGZsb2F0aW5nIHBvaW50IG9yIGV2ZW4gc2lnbmVkIGludGVnZXIgYXJpdGhtZXRpYyBjYW4gcmFpc2UKKyAgICBleGNlcHRpb25zLCB0b28uCisKK0BpdGVtIGludCBtdXN0X2NvbnZlcnQoaW50IGZyb20saW50IHRvLGludCBjb25zdF9leHByKTsKKyAgICBDaGVjayBpZiBjb2RlIG11c3QgYmUgZ2VuZXJhdGVkIHRvIGNvbnZlcnQgZnJvbSB0eXBlIEBjb2Rle2Zyb219IHRvCisgICAgdHlwZSBAY29kZXt0b30uIEUuZy4gb24KKyAgICBtYW55IG1hY2hpbmVzIGNlcnRhaW4gdHlwZXMgaGF2ZSBpZGVudGljYWwgcmVwcmVzZW50YXRpb25zIChpbnRlZ2VycworICAgIG9mIHRoZSBzYW1lIHNpemUgb3IgcG9pbnRlcnMgYW5kIGludGVnZXJzIG9mIHRoZSBzYW1lIHNpemUpLgorCisgICAgSWYgQGNvZGV7Y29uc3RfZXhwciAhPSAwfSByZXR1cm4gaWYgYSBjb252ZXJzaW9uIHdhcyBuZWNlc3NhcnkgaW4KKyAgICBhIGNvbnN0YW50IGV4cHJlc3Npb24uCisKKyAgICBGb3IgZXhhbXBsZSwgYSBtYWNoaW5lIG1heSBoYXZlIGlkZW50aWNhbAorICAgIHBvaW50ZXJzIGFuZCBpbnRlZ2VycywgYnV0IGRpZmZlcmVudCBzZXRzIG9mIHJlZ2lzdGVycyAob25lIHNldAorICAgIHN1cHBvcnRzIGludGVnZXIgb3BlcmF0aW9ucyBhbmQgdGhlIG90aGVyIHBvaW50ZXIgb3BlcmF0aW9ucykuCisgICAgVGhlcmVmb3JlLCBAY29kZXttdXN0X2NvbnZlcnQoKX0gd291bGQgcmV0dXJuIDEgKHdlIG5lZWQgYQorICAgIEBjb2Rle0NPTlZFUlR9IElDIHRvIG1vdmUgdGhlIHZhbHVlIGZyb20gb25lIHJlZ2lzdGVyIHNldCB0byB0aGUKKyAgICBvdGhlcikuCisgICAgCisgICAgVGhpcyB3b3VsZCBpbXBseSB0aGF0IEBjb21tYW5ke3ZiY2N9IHdvdWxkIG5vdCBhbGxvdyBhCisgICAgY2FzdCBmcm9tIGEgcG9pbnRlciB0byBhbiBpbnRlZ2VyIG9yIHZpY2UtdmVyc2EgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMKKyAgICAoYXMgaXQgd2lsbCBub3QKKyAgICBnZW5lcmF0ZSBjb2RlIGZvciBzdGF0aWMgaW5pdGlhbGl6YXRpb25zKS4gSG93ZXZlciwgaW4gdGhpcworICAgIGNhc2UsIGEgc3RhdGljIGluaXRpYWxpemF0aW9uIHdvdWxkIGJlIG9rIGFzIHRoZSByZXByZXNlbnRhdGlvbiBpcworICAgIGlkZW50aWNhbCBhbmQgcmVnaXN0ZXJzIGFyZSBub3QgaW52b2x2ZWQuIFRoZXJlZm9yZSwgdGhlIGJhY2tlbmQKKyAgICBjYW4gcmV0dXJuIDEgaWYgQGNvZGV7Y29uc3RfZXhwciA9PSAwfSBhbmQgMCBvdGhlcndpc2UuCisKK0BpdGVtIGludCBzaG9ydGN1dChpbnQgY29kZSwgaW50IHQpOworICAgIEluIEMgbm8gb3BlcmF0aW9ucyBhcmUgZG9uZSB3aXRoIGNoYXJzIGFuZCBzaG9ydHMgYmVjYXVzZSBvZiBpbnRlZ3JhbAorICAgIHByb21vdGlvbi4gSG93ZXZlciBzb21ldGltZXMgQGNvbW1hbmR7dmJjY30gbWlnaHQgc2VlIHRoYXQgYW4gb3BlcmF0aW9uIGNvdWxkCisgICAgYmUgcGVyZm9ybWVkIHdpdGggdGhlIHNob3J0IHR5cGVzIHlpZWxkaW5nIHRoZSBzYW1lIHJlc3VsdC4KKworICAgIEJlZm9yZSBnZW5lcmF0aW5nIHN1Y2ggYW4gaW5zdHJ1Y3Rpb24gd2l0aCBzaG9ydCB0eXBlcyBAY29tbWFuZHt2YmNjfSB3aWxsIGFzaworICAgIHRoZSBjb2RlIGdlbmVyYXRvciBieSBjYWxsaW5nIEBjb2Rle3Nob3J0Y3V0KCl9IHRvIGZpbmQgb3V0IHdoZXRoZXIgaXQKKyAgICBzaG91bGQgZG8gc28uIFJldHVybiB0cnVlIGlmZiBpdCBpcyBhIHdpbiB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24KKyAgICBAY29kZXtjb2RlfSB3aXRoCisgICAgdHlwZSBAY29kZXt0fSByYXRoZXIgdGhhbiBwcm9tb3RpbmcgdGhlIG9wZXJhbmRzIGFuZCB1c2luZyBlLmcuIEBjb2Rle2ludH0uCisKK0BpdGVtIHZvaWQgZ2VuX2NvZGUoRklMRSAqZiwgc3RydWN0IElDICpwLCBzdHJ1Y3QgVmFyICp2LCB6bWF4IG9mZnNldCk7CisgICAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gZW1pdCBjb2RlIGZvciBhIGZ1bmN0aW9uIHRvIHN0cmVhbSBAY29kZXtmfS4KKyAgICBAY29kZXt2fSBpcyB0aGUgZnVuY3Rpb24gYmVpbmcgZ2VuZXJhdGVkLAorICAgIEBjb2Rle3B9IGlzIGEgcG9pbnRlciB0byB0aGUgbGlzdCBvZiBJQ3MsIHRoYXQgaGFzIHRvIGJlIGNvbnZlcnRlZC4KKyAgICBAY29kZXtvZmZzZXR9IGlzIHRoZSBzcGFjZSBuZWVkZWQgZm9yIGxvY2FsIHZhcmlhYmxlcyBpbiBieXRlcy4KKworICAgIFRoaXMgZnVuY3Rpb24gaGFzIHRvIHRha2UgY2FyZSB0aGF0IG9ubHkgc2NyYXRjaHJlZ2lzdGVycyBhcmUgZGVzdHJveWVkCisgICAgYnkgdGhpcyBmdW5jdGlvbi4gVGhlIGFycmF5IEBjb2Rle3JlZ3VzZWR9IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgIHJlZ2lzdGVycyB0aGF0IGhhdmUgYmVlbiB1c2VkIGJ5IEBjb21tYW5ke3ZiY2N9IGluIHRoaXMgZnVuY3Rpb24uIEhvd2V2ZXIgaWYgdGhlCisgICAgY29kZSBnZW5lcmF0b3IgdXNlcyBhZGRpdGlvbmFsIHJlZ2lzdGVycyBpdCBoYXMgdG8gdGFrZSBjYXJlIG9mIHRoZW0sCisgICAgdG9vLgorCisgICAgVGhlIEBjb2Rle3JlZ3NbXX0gYW5kIEBjb2Rle3JlZ3VzZWRbXX0gYXJyYXlzIG1heSBiZSBvdmVyd3JpdHRlbiBieSBAY29kZXtnZW5fY29kZSgpfSBhcyB3ZWxsCisgICAgYXMgcGFydHMgb2YgdGhlIGxpc3Qgb2YgSUNzLiBIb3dldmVyIHRoZSBsaXN0IG9mIElDcyBtdXN0IHN0aWxsIGJlIGEKKyAgICB2YWxpZCBsaXN0IG9mIElDcyBhZnRlciBAY29kZXtnZW5fY29kZSgpfSByZXR1cm5zLgorCisgICAgQWxsIGFzc2VtYmx5IG91dHB1dCBzaG91bGQgYmUgZ2VuZXJhdGVkIHVzaW5nIHRoZSBhdmFpbGFibGUKKyAgICBAY29kZXtlbWl0fSBmdW5jdGlvbnMuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgYWJsZSB0byBrZWVwIHNldmVyYWwKKyAgICBsaW5lcyBvZiBhc3NlbWJseSBvdXRwdXQgYnVmZmVyZWQgYW5kIGFsbG93IHBlZXBob2xlIG9wdGltaXphdGlvbnMKKyAgICBvbiBhc3NlbWJseSBvdXRwdXQgKEBweHJlZnthc21wZWVwaG9sZX0pLgorCitAaXRlbSB2b2lkIGdlbl9kcyhGSUxFICpmLCB6bWF4IHNpemUsIHN0cnVjdCBUeXAgKnQpOworICAgIEhhcyB0byBlbWl0IG91dHB1dCB0aGF0IGdlbmVyYXRlcyBAY29kZXtzaXplfSBieXRlcyBvZiB0eXBlIEBjb2Rle3R9CisgICAgaW5pdGlhbGl6ZWQgd2l0aCBwcm9wZXIgMC4KKworICAgIEBjb2Rle3R9IGlzIGEgcG9pbnRlciB0byBhIEBjb2Rle3N0cnVjdCBUeXB9IHdoaWNoIGNvbnRhaW5zIHRoZSBwcmVjaXNlIHR5cGUgb2YKKyAgICB0aGUgdmFyaWFibGUuIE9uIG1hY2hpbmVzIHdoZXJlIGV2ZXJ5IHR5cGUgY2FuIGJlIGluaXRpYWxpemVkIHRvIDAKKyAgICBieSBzZXR0aW5nIGFsbCBiaXRzIHRvIHplcm8sIHRoZSB0eXBlIGRvZXMgbm90IG1hdHRlci4gT3RoZXJ3aXNlCisgICAgQHB4cmVme2NvbXBvc2l0ZXR5cGVzfS4KKworICAgIEFsbCBhc3NlbWJseSBvdXRwdXQgc2hvdWxkIGJlIGdlbmVyYXRlZCB1c2luZyB0aGUgYXZhaWxhYmxlCisgICAgQGNvZGV7ZW1pdH0gZnVuY3Rpb25zLgorICAgIAorCitAaXRlbSB2b2lkIGdlbl9hbGlnbihGSUxFICpmLCB6bWF4IGFsaWduKTsKKyAgICBIYXMgdG8gZW1pdCBvdXRwdXQgdGhhdCBlbnN1cmVzIHRoZSBmb2xsb3dpbmcgZGF0YSB0byBiZSBhbGlnbmVkIHRvCisgICAgQGNvZGV7YWxpZ259IGJ5dGVzLgorCisgICAgQWxsIGFzc2VtYmx5IG91dHB1dCBzaG91bGQgYmUgZ2VuZXJhdGVkIHVzaW5nIHRoZSBhdmFpbGFibGUKKyAgICBAY29kZXtlbWl0fSBmdW5jdGlvbnMuCisKK0BpdGVtIHZvaWQgZ2VuX3Zhcl9oZWFkKEZJTEUgKmYsIHN0cnVjdCBWYXIgKnYpOworICAgIEhhcyB0byBwcmludCB0aGUgaGVhZCBvZiBhIHN0YXRpYyBvciBleHRlcm5hbCB2YXJpYWJsZSBAY29kZXt2fS4gVGhpcyBpbmNsdWRlcworICAgIHRoZSBsYWJlbCBhbmQgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciBleHRlcm5hbCBsaW5rYWdlIGV0Yy4KKworICAgIFR5cGljYWxseSB2YXJpYWJsZXMgd2lsbCBiZSBnZW5lcmF0ZWQgYnkgYSBjYWxsIHRvIEBjb2Rle2dlbl9hbGlnbigpfSBmb2xsb3dlZAorICAgIGJ5IEBjb2Rle2dlbl92YXJfaGVhZCgpfSBhbmQgKGEgc2VyaWVzIG9mKSBjYWxscyB0byBAY29kZXtnZW5fZGMoKX0gYW5kL29yIEBjb2Rle2dlbl9kcygpfS4gSXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBrZWVwIHRyYWNrIG9mIHRoZSBpbmZvcm1hdGlvbiBwYXNzZWQKKyAgICB0byBAY29kZXtnZW5fdmFyX2hlYWQoKX0uCisKKyAgICBBbGwgYXNzZW1ibHkgb3V0cHV0IHNob3VsZCBiZSBnZW5lcmF0ZWQgdXNpbmcgdGhlIGF2YWlsYWJsZQorICAgIEBjb2Rle2VtaXR9IGZ1bmN0aW9ucy4KKworQGl0ZW0gdm9pZCBnZW5fZGMoRklMRSAqZiwgaW50IHQsIHN0cnVjdCBjb25zdF9saXN0ICpwKTsKKyAgICBFbWl0IGluaXRpYWxpemVkIGRhdGEuIEBjb2Rle3R9IGlzIHRoZSBiYXNpYyB0eXBlIHRoYXQgaGFzIHRvIGJlCisgICAgZW1pdHRlZC4gQGNvZGV7cH0gcG9pbnRzIHRvIGEgQGNvZGV7c3RydWN0IGNvbnN0X2xpc3R9LgorCisgICAgSWYgQGNvZGV7cC0+dHJlZSAhPSAwfSB0aGVuIEBjb2Rle3AtPnRyZWUtPm99IGlzIGEgQGNvZGV7c3RydWN0IG9ian0KKyAgICB3aGljaCBoYXMgdG8gYmUgZW1pdHRlZC4gVGhpcyB3aWxsIHVzdWFsbHkgYmUgdGhlIGFkZHJlc3Mgb2YgYQorICAgIHZhcmlhYmxlIG9mIHN0b3JhZ2UgY2xhc3Mgc3RhdGljIG9yIHVuc2lnbmVkLCBwb3NzaWJseSB3aXRoIGFuIG9mZnNldAorICAgIGFkZGVkIChAcHhyZWZ7b3BlcmFuZHN9IGZvciBmdXJ0aGVyIGRldGFpbHMpLgorCisgICAgaWYgQGNvZGV7cC0+dHJlZSA9PSAwfSB0aGVuIEBjb2Rle3AtPnZhbH0gaXMgYSBAY29kZXt1bmlvbiBhdHlwc30KKyAgICB3aGljaCBjb250YWlucyAoaW4gdGhlIG1lbWJlciBjb3JyZXNwb25kaW5nIHRvIEBjb2Rle3R9KSB0aGUgY29uc3RhbnQKKyAgICB2YWx1ZSB0byBiZSBlbWl0dGVkLgorCisgICAgQWxsIGFzc2VtYmx5IG91dHB1dCBzaG91bGQgYmUgZ2VuZXJhdGVkIHVzaW5nIHRoZSBhdmFpbGFibGUKKyAgICBAY29kZXtlbWl0fSBmdW5jdGlvbnMuCisKK0BpdGVtIHZvaWQgaW5pdF9kYihGSUxFICpmKTsKKyAgICBJZiBkZWJ1Zy1pbmZvcm1hdGlvbiBpcyByZXF1ZXN0ZWQsIHRoaXMgZnVuY3Rpb25zIGlzIGNhbGxlZCBhZnRlcgorICAgIEBjb2Rle2luaXRfY2coKX0sIGJ1dCBiZWZvcmUgYW55IGNvZGUgaXMgZ2VuZXJhdGVkLgorICAgIFNlZSBhbHNvIEByZWZ7ZGVidWdpbmZvfS4KKworQGl0ZW0gdm9pZCBjbGVhbnVwX2RiKEZJTEUgKmYpOworICAgIElmIGRlYnVnLWluZm9ybWF0aW9uIGlzIHJlcXVlc3RlZCwgdGhpcyBmdW5jdGlvbnMgaXMgY2FsbGVkIHByaW9yIHRvCisgICAgQGNvZGV7Y2xlYW51cF9jZygpfS4KKyAgICBTZWUgYWxzbyBAcmVme2RlYnVnaW5mb30uCisKK0BlbmQgdGFibGUKKworQHNlY3Rpb24gQXZhaWxhYmxlIFN1cHBvcnQgRnVuY3Rpb25zLCBNYWNyb3MgYW5kIFZhcmlhYmxlcworCitUaGlzIHNlY3Rpb24gbGlzdHMgYSBzZXJpZXMgb2YgZ2VuZXJhbCB2YXJpYWJsZXMsIG1hY3JvcyBhbmQgZnVuY3Rpb25zCit3aGljaCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBiYWNrZW5kIGFuZCBtYXkgcHJvdmUgdXNlZnVsLiBOb3RlIHRoYXQgdGhlcmUKK21heSBiZSBhZGRpdGlvbmFsIHN1cHBvcnQgc3BlY2lmaWMgdG8gY2VydGFpbiBmZWF0dXJlcyB3aGljaCB3aWxsIGJlIG1lbnRpb25lZAorYXQgYXBwcm9wcmlhdGUgc2VjdGlvbnMgaW4gdGhpcyBtYW51YWwuCisKK0B0YWJsZSBAY29kZQorQGl0ZW0gTUFYSU5UCitBIGNvbnN0YW50IGZvciB0aGUgbGFyZ2VzdCB0YXJnZXQgaW50ZWdlciB0eXBlIChAY29kZXt6bWF4fSkuIEl0IGlzIG91dHNpZGUKK3RoZSByYW5nZSBvZiB0aGUgb3RoZXIgdHlwZXMgYW5kIGNhbm5vdCBiZSBhY2Nlc3NlZCBieSBhbiBhcHBsaWNhdGlvbgorKGFsdGhvdWdoIHRoZXJlIHdpbGwgdXN1YWxseSBiZSBhbiBhY2Nlc3NpYmxlIHR5cGUgd2l0aCB0aGUgc2FtZSAKK3JlcHJlc2VudGF0aW9uKS4KKworQGl0ZW0gTUFYX1RZUEUKK1RoZSB0eXBlIG51bWJlciBvZiB0aGUgbGFzdCB0eXBlLgorCitAaXRlbSBOUQorQSBtYXNrLiBAY29kZXt0ICYgTlF9IHdpbGwgZGVsZXRlIGFsbCB0eXBlLXF1YWxpZmllcnMgb2YgYSB0eXBlLgorCitAaXRlbSBOVQorQSBtYXNrLiBAY29kZXt0ICYgTlV9IHdpbGwgZGVsZXRlIGFsbCB0eXBlLXF1YWxpZmllcnMgYnV0CitAY29kZXtVTlNJR05FRH0gb2YgYSB0eXBlLgorCitAaXRlbSBxMXR5cChwKQorWWllbGRzIHRoZSB0eXBlIG9mIHRoZSBmaXJzdCBzb3VyY2Ugb3BlcmFuZCBvZiBJQyBAY29kZXtwfS4KK1VuZGVmaW5lZCBpZiB0aGUgb3BlcmFuZCBpcyBub3QgdXNlZCEKKworQGl0ZW0gcTJ0eXAocCkKK1lpZWxkcyB0aGUgdHlwZSBvZiB0aGUgc2Vjb25kIHNvdXJjZSBvcGVyYW5kIG9mIElDIEBjb2Rle3B9LgorVW5kZWZpbmVkIGlmIHRoZSBvcGVyYW5kIGlzIG5vdCB1c2VkIQorCitAaXRlbSB6dHlwKHApCitZaWVsZHMgdGhlIHR5cGUgb2YgdGhlIGRlc3RpbmF0aW9uIG9wZXJhbmQgb2YgSUMgQGNvZGV7cH0uCitVbmRlZmluZWQgaWYgdGhlIG9wZXJhbmQgaXMgbm90IHVzZWQhCisKK0BpdGVtIGljbGFiZWwocCkKK1JldHVybnMgdGhlIGxhYmVsIG9mIGFuIElDLiBPbmx5IGRlZmluZWQgaWYgQGNvZGV7cC0+Y29kZX0gaXMKK0Bjb2Rle0xBQkVMLCBCRVEsIEJORSwgQkxULCBCR1QsIEJMRX0gb3IgQGNvZGV7QkdFfS4KKworQGl0ZW0gb3BzaXplKHApCitSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBvcGVyYW5kIG9mIGFuIEBjb2Rle0FTU0lHTn0gb3IgQGNvZGV7UFVTSH0KK0lDIGFzIEBjb2Rle3ptYXh9LgorCitAaXRlbSBwdXNoc2l6ZShwKQorUmV0dXJucyB0aGUgc3RhY2stYWRqdXN0bWVudCB2YWx1ZSBvZiBhIEBjb2Rle1BVU0h9IElDIGFzIEBjb2Rle3ptYXh9LgorSXQgaXMgYWx3YXlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiBAY29kZXtvcHNpemUocCl9LgorCitAaXRlbSBwdXNoZWRhcmdzaXplKHApCitSZXR1cm5zIHRoZSBzcGFjZSBvY2N1cGllZCBieSBhcmd1bWVudHMgcGFzc2VkIG9uIHRoZSBzdGFjaworYXMgcGFyYW1ldGVycyBmb3IgYSBmdW5jdGlvbiBjYWxsLiBPbmx5IHZhbGlkIGZvciBAY29kZXtDQUxMfSBJQ3MuCisKK0BpdGVtIGlzc3RhdGljKHNjKQorVGVzdHMgd2hldGhlciB0aGUgc3RvcmFnZS1jbGFzcyBAY29kZXtzY30gZGVub3RlcyBhIHZhcmlhYmxlIHdpdGgKK3N0YXRpYyBzdG9yYWdlIGFuZCBubyBleHRlcm5hbCBsaW5rYWdlLgorCitAaXRlbSBpc2V4dGVybihzYykKK1Rlc3RzIHdoZXRoZXIgdGhlIHN0b3JhZ2UtY2xhc3MgQGNvZGV7c2N9IGRlbm90ZXMgYSB2YXJpYWJsZSB3aXRoCitzdGF0aWMgc3RvcmFnZSBhbmQgZXh0ZXJuYWwgbGlua2FnZS4KKworQGl0ZW0gaXNhdXRvKHNjKQorVGVzdHMgd2hldGhlciB0aGUgc3RvcmFnZS1jbGFzcyBAY29kZXtzY30gZGVub3RlcyBhIHZhcmlhYmxlIHdpdGgKK2F1dG9tYXRpYyBzdG9yYWdlLWR1cmF0aW9uLgorCitAaXRlbSB0X21pbih0KQorQGl0ZW14IHRfbWF4KHQpCitUaGVzZSBtYWNyb3MgeWllbGQgdGhlIHNtYWxsZXN0IGFuZCBsYXJnZXN0IHJlcHJlc2VudGFibGUgdmFsdWUgb2YgYW55Cit0YXJnZXQgaW50ZWdlciB0eXBlLCBlLmcuIEBjb2Rle3RfbWluKElOVCl9IG9yIEBjb2Rle3RfbWF4KFVOU0lHTkVEfExPTkcpfS4KKworQGl0ZW0gSVNQT0lOVEVSKHQpCitAaXRlbSBJU0lOVCh0KQorQGl0ZW0gSVNGTE9BVCh0KQorQGl0ZW0gSVNGVU5DKHQpCitAaXRlbSBJU1NUUlVDVCh0KQorQGl0ZW0gSVNVTklPTih0KQorQGl0ZW0gSVNBUlJBWSh0KQorQGl0ZW0gSVNTQ0FMQVIodCkKK0BpdGVteCBJU0FSSVRIKHQpCitUaGVzZSBtYWNyb3MgdGVzdCB3aGV0aGVyIHRoZSBzaW1wbGUgdHlwZSBAY29kZXt0fSBpcyBhIHBvaW50ZXIgdHlwZSwKK2FuIGludGVncmFsIHR5cGUsIGEgZmxvYXRpbmcgcG9pbnQgdHlwZSwgYSBmdW5jdGlvbiwgYSBzdHJ1Y3R1cmUgdHlwZSwKK2EgdW5pb24gdHlwZSwgYW4gYXJyYXkgdHlwZSwgYSBzY2FsYXIgKGludGVnZXIsIGZsb2F0aW5nIHBvaW50IG9yIHBvaW50ZXIpCithbmQgYW4gYXJpdGhtZXRpYyB0eXBlIChpbnRlZ2VyIG9yIGZsb2F0aW5nIHBvaW50KSwgcmVzcGVjdGl2ZWx5LgorCitAaXRlbSBpbnQgbGFiZWw7CitUaGUgbnVtYmVyIG9mIHRoZSBsYXN0IGxhYmVsIHVzZWQgc28gZmFyLiBGb3IgYSBuZXcgbGFiZWwgbnVtYmVyLCB1c2UKK0Bjb2RleysrbGFiZWx9LgorCitAaXRlbSB6bWF4IGZhbGlnbihzdHJ1Y3QgVHlwICp0KTsKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYWxpZ25tZW50IG9mIGEgZnVsbCB0eXBlLiBDb250cmFyeSB0byB0aGUKK0Bjb2Rle2FsaWduW119IGFycmF5IHByb3ZpZGVkIGJ5IHRoZSBiYWNrZW5kICh3aGljaCBpcyB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24pLAoraXQgd2lsbCB5aWVsZCBjb3JyZWN0IHZhbHVlcyBmb3IgY29tcG9zaXRlIHR5cGVzIGxpa2Ugc3RydWN0dXJlcyBhbmQgYXJyYXlzLgorCitAaXRlbSB6bWF4IHN6b2Yoc3RydWN0IFR5cCAqdCk7CitUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgYSBmdWxsIHR5cGUuIENvbnRyYXJ5IHRvIHRoZQorQGNvZGV7c2l6ZXRhYltdfSBhcnJheSBwcm92aWRlZCBieSB0aGUgYmFja2VuZCAod2hpY2ggaXMgdXNlZCBieSB0aGlzIGZ1bmN0aW9uKSwKK2l0IHdpbGwgeWllbGQgY29ycmVjdCB2YWx1ZXMgZm9yIGNvbXBvc2l0ZSB0eXBlcyBsaWtlIHN0cnVjdHVyZXMgYW5kIGFycmF5cy4KKworQGl0ZW0gdm9pZCAqbXltYWxsb2Moc2l6ZV90IHNpemUpOworQGl0ZW0gdm9pZCAqbXlyZWFsbG9jKHZvaWQgKnAsc2l6ZV90IHNpemUpOworQGl0ZW14IHZvaWQgbXlmcmVlKHZvaWQgKnApOworTWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIHNpbWlsYXIgdG8gQGNvZGV7bWFsbG9jKCksIHJlYWxsb2MoKX0gYW5kCitAY29kZXtmcmVlfS4gVGhleSB3aWxsIGF1dG9tYXRpY2FsbHkKK2NsZWFuIHVwIHRoZSBleGl0IGluIHRoZSBjYXNlIGFuIGFsbG9jYXRpb24gZmFpbHMuIEFsc28sIHNvbWUgZGVidWcKK3Bvc3NpYmlsaXRpZXMgYXJlIGF2YWlsYWJsZS4KKworQGl0ZW0gdm9pZCBlbWl0KEZJTEUgKmYsY29uc3QgY2hhciAqZm10LC4uLik7CitAaXRlbSB2b2lkIGVtaXRfY2hhcihGSUxFICpmLGludCBjKSA7CitAaXRlbSB2b2lkIGVtaXR2YWwoRklMRSAqZix1bmlvbiBhdHlwcyAqcCxpbnQgdCk7CitAaXRlbSB2b2lkIGVtaXR6bShGSUxFICpmLHptYXggeCk7CitAaXRlbSB2b2lkIGVtaXR6dW0oRklMRSAqZix6dW1heCB4KTsgCitBbGwgb3V0cHV0IHByb2R1Y2VkIGJ5IHRoZSBiYWNrZW5kIHNob3VsZCBiZSBwcm9kdWNlZCB1c2luZyB0aGVzZQorZnVuY3Rpb25zLiBAY29kZXtlbWl0KCl9IHVzZXMgYSBmb3JtYXQgbGlrZSBAY29kZXtwcmludGYoKX0sCitAY29kZXtlbWl0dmFsKCksIGVtaXR6bSgpfSBhbmQgQGNvZGV7ZW1pdHp1bSgpfSBhcmUgc3VpdGFibGUgdG8KK291dHB1dCB0YXJnZXQgaW50ZWdlcnMgYXMgZGVjaW1hbCB0ZXh0LiBDdXJyZW50bHkgZW1pdHRpbmcgZmxvYXRpbmcKK3BvaW50IGNvbnN0YW50cyBoYXMgdG8gYmUgZG9uZSBieSB0aGUgYmFja2VuZC4KKworQGl0ZW0gaW50IGlzX2NvbnN0KHN0cnVjdCBUeXAgKik7CitUZXN0cyB3aGV0aGVyIGEgZnVsbCB0eXBlIGlzIGNvbnN0YW50IChlLmcuIHRvIGRlY2lkZSB3aGV0aGVyIGl0IGNhbiBiZQorcHV0IGludG8gYSBST00gc2VjdGlvbikuCisKK0BpdGVtIGludCBpc192b2xhdGlsZV9vYmooc3RydWN0IG9iaiAqKTsKK0BpdGVteCBpbnQgaXNfdm9sYXRpbGVfaWMoc3RydWN0IElDICopOworVGVzdHMgd2hldGhlciBhbiBvYmplY3Qgb3IgSUMgaXMgdm9sYXRpbGUuIE9ubHkgb2YgaW50ZXJlc3QgdG8gdGhlIGJhY2tlbmQKK2luIHJhcmUgY2FzZXMuCisKK0BpdGVtIGludCBzd2l0Y2hfSUMoc3RydWN0IElDICpwKTsKK1RoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgQGNvZGV7cC0+cTJ9IGFuZCBAY29kZXtwLT56fSB1c2UgdGhlCitzYW1lIHJlZ2lzdGVyIChpbmNsdWRpbmcgcmVnaXN0ZXIgcGFpcnMpLiBJZiB0aGV5IGRvLCBpdCB3aWxsIHRyeQordG8gc3dhcCBAY29kZXtwLT5xMX0gYW5kIEBjb2Rle3AtPnEyfSAob25seSBwb3NzaWJsZSBpZiB0aGUgSUMgaXMKK2NvbW11dGF0aXZlKS4gSXQgaXMgb2Z0ZW4gcG9zc2libGUgdG8gZ2VuZXJhdGUKK2JldHRlciBjb2RlIGlmIEBjb2Rle3AtPnEyfSBhbmQgQGNvZGV7cC0+en0gZG8gbm90IGNvbGxpZGUuIE5vdGUKK2hvd2V2ZXIsIHRoYXQgaXQgaXMgbm90IGFsd2F5cyBwb3NzaWJsZSB0byBlbGltaW5hdGUgYSBjb25mbGljdCBhbmQKK3RoZSBjb2RlIGdlbmVyYXRvciBzdGlsbCBoYXMgdG8gYmUgYWJsZSB0byBoYW5kbGUgc3VjaCBhIGNhc2UuCisKK1RoZSBmdW5jdGlvbiByZXR1cm5zIDAgaWYgbm8gbW9kaWZpY2F0aW9uIHRvb2sgcGxhY2UgYW5kIG5vbi16ZXJvIGlmCit0aGUgSUMgaGFzIGJlZW4gbW9kaWZpZWQuCisKK0BpdGVtIHVuaW9uIGF0eXBzIGd2YWw7CitAaXRlbSB2b2lkIGV2YWxfY29uc3QodW5pb24gYXR5cHMgKnAsaW50IHQpOworQGl0ZW14IHZvaWQgaW5zZXJ0X2NvbnN0KHVuaW9uIGF0eXBzICpwLGludCB0KTsKK0ZvciBldmVyeSB0YXJnZXQgZGF0YSB0eXBlIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyBnbG9iYWwgdmFyaWFibGUKK29mIHRoYXQgdHlwZSwgZS5nLiBAY29kZXt6Y2hhciB2Y2hhciwgenVjaGFyIHZ1Y2hhciwgem1heCB2bWF4fSBldGMuCitUaGVzZSB0d28gZnVuY3Rpb25zIHNpbXBsaWZ5IGhhbmRsaW5nIG9mIHRhcmdldCBkYXRhIHR5cGVzIGJ5IHRyYW5zZmVycmluZworYmV0d2VlbiBhIEBjb2Rle3VuaW9uIGF0eXBzfSBhbmQgdGhlc2UgdmFyaWFibGVzLgorCitAY29kZXtldmFsX2NvbnN0KCl9IHJlYWRzIHRoZSBtZW1iZXIgb2YgdGhlIHVuaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlCit0eXBlIEBjb2Rle3R9IGFuZCBjb252ZXJ0cyBpdCBpbnRvIGFsbCB0aGUgZ2xvYmFsIHZhcmlhYmxlcyB3aGlsZQorQGNvZGV7aW5zZXJ0X2NvbnN0KCl9IHRha2VzIHRoZSBnbG9iYWwgdmFyaWFibGUgYWNjb3JkaW5nIHRvIEBjb2Rle3R9CithbmQgcHV0cyBpdCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBtZW1iZXIgb2YgdGhlIEBjb2Rle3VuaW9uIGF0eXBzfS4KKworVGhlIGdsb2JhbCB2YXJpYWJsZSBAY29kZXtndmFsfSBtYXkgYmUgdXNlZCBhcyBhIHRlbXBvcmFyeQorQGNvZGV7dW5pb24gYXR5cHN9IGJ5IHRoZSBiYWNrZW5kLgorCitAaXRlbSB2b2lkIHByaW50em0oRklMRSAqZix6bWF4IHgpOworQGl0ZW0gdm9pZCBwcmludHp1bShGSUxFICpmLHp1bWF4IHgpIDsKK0BpdGVtIHZvaWQgcHJpbnR2YWwoRklMRSAqZix1bmlvbiBhdHlwcyAqcCxpbnQgdCk7CitAaXRlbSB2b2lkIHByaW50dHlwZShGSUxFICpvLHN0cnVjdCBUeXAgKnApOworQGl0ZW0gdm9pZCBwcmludG9iaihGSUxFICpmLHN0cnVjdCBvYmogKnAsaW50IHQpOworQGl0ZW0gdm9pZCBwcmludGljKEZJTEUgKmYsc3RydWN0IElDICpwKTsKK0BpdGVteCB2b2lkIHByaW50aWNsaXN0KEZJTEUgKmYsc3RydWN0IElDICpmaXJzdCk7CitUaGlzIGlzIGEgc2VyaWVzIG9mIGZ1bmN0aW9ucyB3aGljaCBwcmludCBhIG1vcmUgb3IgbGVzcyBodW1hbgorcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgY29ycmVzcG9uZGluZyB0eXBlIHRvIGEgc3RyZWFtLiBUaGVzZSBmdW5jdGlvbnMKK2FyZSB0byBiZSB1c2VkIG9ubHkgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgbm90IGZvciBnZW5lcmF0aW5nIGNvZGUuCitBbHNvLCB0aGUgYXJndW1lbnRzIG11c3QgY29udGFpbiB2YWxpZCB2YWx1ZXMuCisKK0BpdGVtIGJ2dHlwZQorQGl0ZW14IEJWU0laRShuKQorQGNvbW1hbmR7dmJjY30gcHJvdmlkZXMgbWFjcm9zIGFuZCBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGJpdC12ZWN0b3JzCit3aGljaCBtYXkgYWxzbyBiZSB1c2VkIGJ5IHRoZSBiYWNrZW5kLiBAY29kZXtidnR5cGV9IGlzIHRoZSBiYXNpYyB0eXBlCit0byBjcmVhdGUgYml0LXZlY3RvcnMgb2YuIEBjb2Rle0JWU0laRShuKX0geWllbGRzIHRoZSBudW1iZXIgb2YKK2J5dGVzIG5lZWRlZCB0byBpbXBsZW1lbnQgYSBiaXQtdmVjdG9yIHdpdGggQGNvZGV7bn0gZWxlbWVudHMuCitAZXhhbXBsZQorYnZ0eXBlICpteWJ2ID0gbXltYWxsb2MoQlZTSVpFKG4pKTsKK0BlbmQgZXhhbXBsZQorCitAaXRlbSBCU0VUKGJ2LG4pCitAaXRlbSBCQ0xSKGJ2LG4pCitAaXRlbXggQlRTVChidixuKQorTWFjcm9zIHdoaWNoIHNldCwgY2xlYXIgYW5kIHRlc3QgdGhlIEBjb2Rle259LXRoIGJpdCBpbiBiaXQtdmVjdG9yIEBjb2Rle2J2fS4KKworQGl0ZW0gdm9pZCBidnVuaXRlKGJ2dHlwZSAqZGVzdCxidnR5cGUgKnNyYyxzaXplX3QgbGVuKTsKK0BpdGVtIHZvaWQgYnZpbnRlcnNlY3QoYnZ0eXBlICpkZXN0LGJ2dHlwZSAqc3JjLHNpemVfdCBsZW4pOworQGl0ZW14IHZvaWQgYnZkaWZmKGJ2dHlwZSAqZGVzdCxidnR5cGUgKnNyYyxzaXplX3QgbGVuKTsKK1RoZXNlIGZ1bmN0aW9ucyBjYWxjdWxhdGUgdGhlIHVuaW9uLCBpbnRlcnNlY3Rpb24gYW5kIGRpZmZlcmVuY2Ugb2YgdHdvCitiaXQtdmVjdG9ycy4gQGNvZGV7ZGVzdH0gaXMgdGhlIGZpcnN0IG9wZXJhbmQgYXMgd2VsbCBhcyB0aGUgZGVzdGluYXRpb24uCitAY29kZXtsZW59IGlzIHRoZSBsZW5ndGggb2YgdGhlIGJpdC12ZWN0b3JzIGluIGJ5dGVzLCBub3QgaW4gYml0cy4KKworQGl0ZW0gdm9pZCBidmNvcHkoYnZ0eXBlICpkZXN0LGJ2dHlwZSAqc3JjLHNpemVfdCBsZW4pOworQGl0ZW0gdm9pZCBidmNsZWFyKGJ2dHlwZSAqZGVzdCxzaXplX3QgbGVuKTsKK0BpdGVteCB2b2lkIGJ2c2V0YWxsKGJ2dHlwZSAqZGVzdCxzaXplX3QgbGVuKTsKK1RoZXNlIGZ1bmN0aW9ucyBjb3B5LCBjbGVhciBhbmQgZmlsbCBiaXQtdmVjdG9ycy4KKworQGl0ZW0gaW50IGJ2Y21wKGJ2dHlwZSAqYnYxLGJ2dHlwZSAqYnYyLHNpemVfdCBsZW4pOworQGl0ZW14IGludCBidmRvaW50ZXJzZWN0KGJ2dHlwZSAqYnYxLGJ2dHlwZSAqYnYyLHNpemVfdCBsZW4pOworVGhlc2UgZnVuY3Rpb25zIHRlc3Qgd2hldGhlciB0d28gYml0LXZlY3RvcnMgYXJlIGVxdWFsIG9yCitoYXZlIGEgbm9uLWVtcHR5IGludGVyc2VjdGlvbiwgcmVzcGVjdGl2ZWx5LiBUaGUgZG8gbm90IG1vZGlmeSB0aGUKK2JpdC12ZWN0b3JzLgorCitAZW5kIHRhYmxlCisKKworQHNlY3Rpb24gSGludHMgZm9yIGNvbW1vbiBPcHRpbWl6YXRpb25zCisKK1doaWxlIGl0IGlzIG5vIGVhc3kgam9iIHRvIHByb2R1Y2UgYSBzdGFibGUgY29kZSBnZW5lcmF0b3IgZm9yIGEgbmV3IHRhcmdldAorYXJjaGl0ZWN0dXJlLCB0aGVyZSBpcyBhIGh1Z2UgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgc2ltcGxlIGJhY2tlbmQgYW5kCithIGhpZ2hseSBvcHRpbWl6ZWQgY29kZSBnZW5lcmF0b3Igd2hpY2ggcHJvZHVjZXMgc21hbGwgYW5kIGVmZmljaWVudCAKK2hpZ2ggcXVhbGl0eSBjb2RlLiBBbHRob3VnaCBAY29tbWFuZHt2YmNjfSBpcyBhYmxlIHRvIGRvIGEgbG90IG1hY2hpbmUKK2luZGVwZW5kZW50IGdsb2JhbCBvcHRpbWl6YXRpb25zIGZvciBldmVyeSB0YXJnZXQgYXV0b21hdGljYWxseSwgaXQgaXMgc3RpbGwKK2NvbW1vbiBmb3IgYW4gb3B0aW1pemVkIGJhY2tlbmQgdG8gcHJvZHVjZSBjb2RlIHVwIHRvIHR3aWNlIGFzIGZhc3Qgb24KK2F2ZXJhZ2UgYXMgYSBzaW1wbGUgb25lLgorCitTb21ldGltZXMsIGEgc2ltcGxlIGJhY2tlbmQgaXMgc3VmZmljaWVudCBhbmQgdGhlCit3b3JrIHJlcXVpcmVkIHRvIHByb2R1Y2UgaGlnaC1xdWFsaXR5IGNvZGUgaXMgbm90IHdvcnRod2hpbGUuIEhvd2V2ZXIsCit0aGlzIHNlY3Rpb24gbGlzdHMgYSBzZXJpZXMgb2YgY29tbW9uIGJhY2tlbmQgb3B0aW1pemF0aW9ucyB3aGljaCBhcmUKK29mdGVuIGRvbmUgaW4gY2FzZSB0aGF0IGdvb2QgY29kZS1xdWFsaXR5IGlzIGRlc2lyZWQuIE5vdGUgdGhhdCBuZWl0aGVyIGFyZQorYWxsIG9mIHRoZXNlIG9wdGltaXphdGlvbnMgYXBwbGljYWJsZSAod2l0aG91dCBtb2RpZmljYXRpb25zIG9yIGF0IGFsbCkKK3RvIGFsbCBhcmNoaXRlY3R1cmVzIG5vciBpcwordGhpcyBhbiBleGhhdXN0aXZlIGxpc3QuIEl0IGlzIGp1c3QgYSBsaXN0IG9mIHJlY29tbWVuZGF0aW9ucyB0byBjb25zaWRlci4KK1lvdSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBvcHRpbWl6YXRpb24gaXMgc2FmZSBhbmQgYmVuZWZpY2lhbCBmb3IKK3RoZSBhcmNoaXRlY3R1cmUgeW91IGFyZSB0YXJnZXR0aW5nLiAKKworCitAc3Vic2VjdGlvbiBJbnN0cnVjdGlvbiBDb21iaW5pbmcKKworV2hpbGUgSUNzIGFyZSBvZnRlbiBhIGJpdCBtb3JlIHBvd2VyZnVsIHRoYW4gaW5zdHJ1Y3Rpb25zIG9mIGEgdHlwaWNhbAorbWljcm9wcm9jZXNzb3IsIHNvbWV0aW1lcyBzZXZlcmFsIG9mIHRoZW0gY2FuIGJlIGltcGxlbWVudGVkIGJ5IGEgc2luZ2xlCitpbnN0cnVjdGlvbiBvciBtb3JlIGVmZmljaWVudCBjb2RlIGNhbiBiZSBnZW5lcmF0ZWQgd2hlbiBsb29raW5nIGF0IGEKK2ZldyBvZiB0aGVtIHJhdGhlciB0aGFuIGF0IGVhY2ggb25lIHNlcGFyYXRlbHkuCisKK0luIHRoZSBzaW1wbGUgY2FzZSwgdGhpcyBjYW4gYmUgZG9uZSBieSBsb29raW5nIGF0IHRoZSBjdXJyZW50IElDLAorZGVjaWRpbmcgd2hldGhlciBpdCBpcyBhIGNhbmRpZGF0ZSBmb3IgY29tYmluaW5nIGFuZCB0aGVuIHRlc3Qgd2hldGhlcgordGhlIG5leHQgSUMgKG9yIElDcykgYXJlIHN1aXRhYmxlIGZvciBjb21iaW5pbmcuIFRoaXMgaXMgcmVsYXRpdmVseSBlYXN5Cit0byBwZXJmb3JtLCBob3dldmVyIHNvbWUgY2FyZSBoYXMgdG8gYmUgdGFrZW4gdG8gdmVyaWZ5IHRoYXQgdGhlCitjb21iaW5hdGlvbiBpcyBpbmRlZWQgbGVnYWwgKGUuZy4gd2hhdCBoYXBwZW5zIGlmIHRoZSBmaXJzdCBJQyBtb2RpZmllcworYSB2YWx1ZSB3aGljaCBpcyB1c2VkIGJ5IHRoZSBmb2xsb3dpbmcgSUMpLgorCitBIG1vcmUgc29waGlzdGljYXRlZCBpbXBsZW1lbnRhdGlvbiBtaWdodCBsb29rIGF0IGEgbGFyZ2VyIHNlcXVlbmNlIG9mCitpbnN0cnVjdGlvbnMgdG8gZmluZCBtb3JlIHBvc3NpYmlsaXRpZXMgZm9yIG9wdGltaXphdGlvbi4gRGV0ZWN0aW5nCit3aGV0aGVyIHRoZSBjb21iaW5hdGlvbiBpcyBsZWdhbCBiZWNvbWVzIG11Y2ggbW9yZSBkaWZmaWN1bHQgdGhlbi4KKworU29tZXRpbWVzIHRoZSBJQyBtaWdoIGNvbXB1dGUgYSB0ZW1wb3JhcnkgcmVzdWx0IHdoaWNoIHdvdWxkIGJlIGVsaW1pbmF0ZWQgYnkKK3RoZSBjb21wbGV4IG1hY2hpbmUgaW5zdHJ1Y3Rpb24uIFRoZW4gaXQgaXMgbmVjZXNzYXJ5IHRvIHZlcmlmeSB0aGF0IGl0Cit3YXMgaW5kZWVkIGEgdGVtcG9yYXJ5IHJlc3VsdCB3aGljaCBpcyBub3QgdXNlZCBhbnl3aGVyZSBlbHNlLiBBcyBsb25nIGFzCit0aGUgcmVzdWx0IGlzIGluIGEgcmVnaXN0ZXIsIHRoaXMgY2FuIGJlIGRvbmUgYnkgY2hlY2tpbmcgZm9yIGEKK0Bjb2Rle0ZSRUVSRUd9IElDLgorCitFeGFtcGxlcyBmb3IgaW5zdHJ1Y3Rpb24gY29tYmluaW5nIGFyZSBtdWx0aXBseS1hbmQtYWRkIG9yIGJpdC10ZXN0CitpbnN0cnVjdGlvbnMgd2hpY2ggYXJlIGF2YWlsYWJsZSBvbiBtYW55IGFyY2hpdGVjdHVyZXMuCitTcGVjaWFsIGNhc2VzIGFyZSBjb21wbGV4CithZGRyZXNzaW5nIG1vZGVzIGFuZCBpbnN0cnVjdGlvbnMgd2hpY2ggY2FuIGF1dG9tYXRpY2FsbHkgc2V0IGNvbmRpdGlvbgorY29kZXMgd2hpY2ggYXJlIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLgorCisKK0Bub2RlIGFkZHJlc3Npbmdtb2RlcworQHN1YnNlY3Rpb24gQWRkcmVzc2luZyBNb2RlcworCitUaGUgaW50ZXJtZWRpYXRlIGNvZGUgZ2VuZXJhdGVkIGJ5IHZiY2MgZG9lcyBub3QgdXNlIGFueQorYWRkcmVzc2luZy1tb2RlcyBhIHRhcmdldCBtaWdodCBvZmZlci4gVGhlcmVmb3JlIHRoZSBjb2RlIGdlbmVyYXRvcgorbXVzdCBmaW5kIGEgd2F5IHRvIGNvbWJpbmUgc2V2ZXJhbCBzdGF0ZW1lbnRzIGlmIGl0IHdhbnRzIHRvIG1ha2UgdXNlCitvZiB0aGVzZSBtb2Rlcy4gRS5nLiBvbiB0aGUgbTY4ayB0aGUgaW50ZXJtZWRpYXRlIGNvZGUKK0BleGFtcGxlCisgICAgICAgIEFEREkyUCAgaW50ICAgICBhMCwjMjAtPmExCisgICAgICAgIEFTU0lHICAgaW50ICAgICAjMTAtPihhMSkKKyAgICAgICAgRlJFRVJFRyAgICAgICAgIGExCitAZW5kIGV4YW1wbGUKK2NvdWxkIGJlIHRyYW5zbGF0ZWQgdG8KK0BleGFtcGxlCisgICAgICAgIG1vdmUubCAgIzEwLDIwKGEwKQorQGVuZCBleGFtcGxlCisobm90aWNlIHRoZSBAY29kZXtGUkVFUkVHfSB3aGljaCBpcyBpbXBvcnRhbnQpLgorCitUbyBhaWQgaW4gdGhpcyB0aGVyZSBpcyBhIHBvaW50ZXIgdG8gYSBAY29kZXtzdHJ1Y3QgQWRkcmVzc2luZ01vZGV9IGluIGV2ZXJ5CitAY29kZXtzdHJ1Y3Qgb2JqfS4gQSBjb2RlIGdlbmVyYXRvciBjb3VsZCBlLmcuIGRvIGEgcGFzcyBvdmVyIHRoZSBpbnRlcm1lZGlhdGUKK2NvZGUsIGZpbmQgcG9zc2libGUgdXNlcyBmb3IgYWRkcmVzc2luZy1tb2RlcywgYWxsb2NhdGUgYQorQGNvZGV7c3RydWN0IEFkZHJlc3NpbmdNb2RlfSBhbmQgc3RvcmUgYSBwb2ludGVyIGluIHRoZQorQGNvZGV7c3RydWN0IG9ian0sIGVmZmVjdGl2ZWx5IHJlcGxhY2luZyB0aGUgb2JqLgorCitJZiB0aGUgY29kZSBnZW5lcmF0b3Igc3VwcG9ydHMgZXh0ZW5kZWQgYWRkcmVzc2luZy1tb2RlcywgeW91IGhhdmUgdG8gdGhpbmsKK29mIGEgd2F5IHRvIHJlcHJlc2VudCB0aGVtIGFuZCBkZWZpbmUgdGhlIEBjb2Rle3N0cnVjdCBBZGRyZXNzaW5nTW9kZX0gc28gdGhhdAorYWxsIG1vZGVzIGNhbiBiZSBzdG9yZWQgaW4gaXQuIFRoZSBtYWNoaW5lIGluZGVwZW5kZW50IHBhcnQgb2YKK0Bjb21tYW5ke3ZiY2N9IHdpbGwKK25vdCB1c2UgdGhlc2UgbW9kZXMsIHNvIHlvdXIgY29kZSBnZW5lcmF0b3IgaGFzIHRvIGZpbmQgYSB3YXkgdG8gY29tYmluZQorc2V2ZXJhbCBzdGF0ZW1lbnRzIHRvIG1ha2UgdXNlIG9mIHRoZXNlIG1vZGVzLgorCitBIHBvc3NpYmxlIGltcGxlbWVudGF0aW9uIG9mIGEgc3RydWN0dXJlIHRvIGhhbmRsZSB0aGUgYWRkcmVzc2luZyBtb2RlCitkZXNjcmliZWQgYWJvdmUgYXMgd2VsbCBhcyBhIHJlZ2lzdGVyLWluZGlyZWN0IG1vZGUgY291bGQgYmU6CitAZXhhbXBsZQorI2RlZmluZSBJTU1fSU5EIDEKKyNkZWZpbmUgUkVHX0lORCAyCisKK3N0cnVjdCBBZGRyZXNzaW5nTW9kZSBAeworICBpbnQgZmxhZ3M7ICAgLyogZWl0aGVyIElNTV9JTkQgb3IgUkVHX0lORCAqLworICBpbnQgYmFzZTsgICAgLyogYmFzZSByZWdpc3RlciAqLworICB6bWF4IG9mZnNldDsgLyogb2Zmc2V0IGluIGNhc2Ugb2YgSU1NX0lORCAqLworICBpbnQgaWR4OyAgICAgLyogaW5kZXggcmVnaXN0ZXIgaW4gY2FzZSBvZiBSRUdfSU5EICovCitAfQorQGVuZCBleGFtcGxlCisKK1doZW4gdGhlIGNvZGUgZ2VuZXJhdG9yIGlzIGRvbmUgdGhhdCBwb2ludGVyIGluIGV2ZXJ5IEBjb2Rle3N0cnVjdCBvYmp9IG11c3QKK2VpdGhlciBiZSB6ZXJvIG9yIHBvaW50IHRvIGEgQGNvZGV7bXltYWxsb2N9ZWQgQGNvZGV7c3RydWN0IEFkZHJlc3NpbmdNb2RlfQord2hpY2ggd2lsbCBiZSBmcmVlJ2QgYnkgQGNvbW1hbmR7dmJjY30uCisKK0ZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgZnVuY3Rpb24gd2hpY2ggdHJhdmVyc2VzIGEgbGlzdCBvZiBJQ3MgYW5kCitpbnNlcnRzIGFkZHJlc3NpbmcgbW9kZXMgd2l0aCBjb25zdGFudCBvZmZzZXRzIHdoZXJlIHBvc3NpYmxlLgorQGV4YW1wbGUKKy8qIHNlYXJjaCBmb3IgcG9zc2libGUgYWRkcmVzc2luZy1tb2RlcyAqLworc3RhdGljIHZvaWQgZmluZF9hZGRyX21vZGVzKHN0cnVjdCBJQyAqcCkKK0B7CisgIGludCBjLGMyLHI7CisgIHN0cnVjdCBJQyAqcDI7CisgIHN0cnVjdCBBZGRyZXNzaW5nTW9kZSAqYW07CisKKyAgZm9yKDtwO3A9cC0+bmV4dClAeworICAgIGM9cC0+Y29kZTsKKworICAgIGlmKElNTV9JTkQmJihjPT1BRERJMlB8fGM9PVNVQklGUCkmJgorICAgICAgIGlzcmVnKHopJiYocC0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpQHsKKyAgICAgIC8qIHdlIGhhdmUgZm91bmQgYWRkaTJwIHExLCNjb25zdC0+cmVnICovCisgICAgICBpbnQgYmFzZTt6bWF4IG9mO3N0cnVjdCBvYmogKm87CisKKyAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxwLT50eXBmKTsKKyAgICAgIC8qIGhhbmRsZSBzdWIgaW5zdGVhZCBvZiBhZGQgKi8KKyAgICAgIGlmKGM9PVNVQklGUCkKKyAgICAgICAgb2Y9em1zdWIobDJ6bSgwTCksdm1heCk7CisgICAgICBlbHNlCisgICAgICAgIG9mPXZtYXg7CisKKyAgICAgIC8qIElzIHRoZSBvZmZzZXQgc3VpdGFibGUgZm9yIGFuIGFkZHJlc3NpbmcgbW9kZT8gKi8KKyAgICAgIGlmKElTVkFMSURfT0ZGU0VUKHZtYXgpKUB7CisgICAgICAgIHI9cC0+ei5yZWc7CisgICAgICAgIC8qIElmIHExIGlzIGEgcmVnaXN0ZXIsIHdlIHVzZSBpdCBhcyBiYXNlLXJlZ2lzdGVyLAorICAgICAgICAgICBvdGhlcndpc2UgcTEgaXMgbG9hZGVkIGluIHRoZSB0ZW1wb3JhcnkgcmVnaXN0ZXIKKyAgICAgICAgICAgYW5kIHRoaXMgb25lIHVzZWQgYXMgYmFzZSByZWdpc3Rlci4gKi8KKyAgICAgICAgaWYoaXNyZWcocTEpKQorICAgICAgICAgIGJhc2U9cC0+cTEucmVnOworICAgICAgICBlbHNlCisgICAgICAgICAgYmFzZT1yOworCisgICAgICAgIG89MDsKKyAgICAgICAgLyogTm93IHNlYXJjaCB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9ucy4gKi8KKyAgICAgICAgZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpQHsKKyAgICAgICAgICBjMj1wMi0+Y29kZTsKKworICAgICAgICAgIC8qIEVuZCBvZiBhIGJhc2ljIGJsb2NrLiBXZSBoYXZlIHRvIGFib3J0LiAqLworICAgICAgICAgIGlmKGMyPT1DQUxMfHxjMj09TEFCRUx8fChjMj49QkVRJiZjMjw9QlJBKSkgYnJlYWs7CisKKyAgICAgICAgICAvKiBUaGUgdGVtcG9yYXJ5IHJlZ2lzdGVyIGlzIHVzZWQuIFdlIGhhdmUgdG8gYWJvcnQuICovCisgICAgICAgICAgaWYoYzIhPUZSRUVSRUcmJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmCisgICAgICAgICAgICAgcDItPnExLnJlZz09cikKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAJICBpZihjMiE9RlJFRVJFRyYmKHAyLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiYKKyAgICAgICAgICAgICBwMi0+cTIucmVnPT1yKSAKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBpZihjMiE9Q0FMTCYmKGMyPExBQkVMfHxjMj5CUkEpJiZjMiE9QUREUkVTUylAeworICAgICAgICAgICAgLyogU2VlLCBpZiB3ZSBmaW5kIGEgdmFsaWQgdXNlIChkZXJlZmVyZW5jZSkgb2YgdGhlCisgICAgICAgICAgICAgICB0ZW1wb3JhcnkgcmVnaXN0ZXIuICovCisgICAgICAgICAgICBpZighcC0+cTEuYW0mJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJgorICAgICAgICAgICAgICBwMi0+cTEucmVnPT1yKUB7CisgICAgICAgICAgICAgIGlmKG8pIGJyZWFrOworICAgICAgICAgICAgICBvPSZwMi0+cTE7CisgICAgICAgICAgICBAfQorICAgICAgICAgICAgaWYoIXAtPnExLmFtJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiYKKyAgICAgICAgICAgICAgIHAyLT5xMi5yZWc9PXIpQHsKKyAgICAgICAgICAgICAgaWYobykgYnJlYWs7CisgICAgICAgICAgICAgIG89JnAyLT5xMjsKKyAgICAgICAgICAgIEB9CisgICAgICAgICAgICBpZighcC0+cTEuYW0mJihwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmCisgICAgICAgICAgICAgICBwMi0+ei5yZWc9PXIpQHsKKyAgICAgICAgICAgICAgaWYobykgYnJlYWs7CisgICAgICAgICAgICAgIG89JnAyLT56OworICAgICAgICAgICAgQH0KKyAgICAgICAgICBAfQorICAgICAgICAgIGlmKGMyPT1GUkVFUkVHfHwocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRylAeworICAgICAgICAgICAgaW50IG07CisgICAgICAgICAgICBpZihjMj09RlJFRVJFRykKKyAgICAgICAgICAgICAgbT1wMi0+cTEucmVnOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBtPXAyLT56LnJlZzsKKyAgICAgICAgICAgIGlmKG09PXIpQHsKKyAgICAgICAgICAgIC8qIFRoZSB2YWx1ZSBvZiB0aGUgdGVtcG9yYXJ5IHJlZ2lzdGVyIGlzIG5vdCB1c2VkIGFueSBtb3JlCisgICAgICAgICAgICAgICAoZWl0aGVyIGR1ZSB0byBGUkVFUkVHIG9yIGJlY2F1c2UgaXQgaXMgb3ZlcndyaXR0ZW4pLgorICAgICAgICAgICAgICAgSWYgd2UgaGF2ZSBmb3VuZCBleGFjdGx5IG9uZSBkZXJlZmVyZW5jZSwgd2UgY2FuIHVzZQorICAgICAgICAgICAgICAgYSB0YXJnZXQgYWRkcmVzc2luZyBtb2RlLiAqLworICAgICAgICAgICAgICBpZihvKUB7CisgICAgICAgICAgICAgICAgby0+YW09YW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworICAgICAgICAgICAgICAgIGFtLT5mbGFncz1JTU1fSU5EOworICAgICAgICAgICAgICAgIGFtLT5iYXNlPWJhc2U7CisgICAgICAgICAgICAgICAgYW0tPm9mZnNldD16bTJsKG9mKTsKKyAgICAgICAgICAgICAgICBpZihpc3JlZyhxMSkpQHsKKyAgICAgICAgICAgICAgICAgIC8qIFRoZSBiYXNlIGFscmVhZHkgd2FzIGluIGEgcmVnaXN0ZXIuIFdlIGNhbgorICAgICAgICAgICAgICAgICAgICAgZWxpbWluYXRlIHRoZSBBRERJMlAgSUMuICovCisgICAgICAgICAgICAgICAgICBwLT5jb2RlPWM9Tk9QO3AtPnExLmZsYWdzPXAtPnEyLmZsYWdzPXAtPnouZmxhZ3M9MDsKKyAgICAgICAgICAgICAgICBAfWVsc2VAeworICAgICAgICAgICAgICAgICAgLyogVGhlIGJhc2Ugd2FzIG5vdCBpbiBhIHJlZ2lzdGVyLgorICAgICAgICAgICAgICAgICAgICAgV2UgaGF2ZSB0byBsb2FkIGl0IC4gKi8KKyAgICAgICAgICAgICAgICAgIHAtPmNvZGU9Yz1BU1NJR047cC0+cTIuZmxhZ3M9MDsKKyAgICAgICAgICAgICAgICAgIHAtPnR5cGY9cC0+dHlwZjI7cC0+cTIudmFsLnZtYXg9c2l6ZXRhYltwLT50eXBmMiZOUV07CisgICAgICAgICAgICAgICAgQH0KKyAgICAgICAgICAgICAgQH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBAfQorICAgICAgICAgICAgaWYoYzIhPUZSRUVSRUcmJm09PWJhc2UpIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgQH0KKyAgICAgICAgQH0KKyAgICAgIEB9CisgICAgQH0KKyAgQH0KK0B9CitAZW5kIGV4YW1wbGUKKworQHN1YnNlY3Rpb24gSW1wbGljaXQgc2V0dGluZyBvZiBDb25kaXRpb24gQ29kZXMKKworTWFueSBhcmNoaXRlY3R1cmVzIGhhdmUgaW5zdHJ1Y3Rpb24gdGhhdCBhdXRvbWF0aWNhbGx5IHNldCB0aGUKK2NvbmRpdGlvbiBjb2RlcyBhY2NvcmRpbmcgdG8gdGhlIGNvbXB1dGVkIHJlc3VsdC4gRm9yIHRoZXNlIGFyY2hpdGVjdHVyZXMKK2l0IGlzIGdlbmVyYWxseSBhIGdvb2QgaWRlYSB0byBrZWVwIHRyYWNrIG9mIHRoZSBzZXR0aW5nIG9mIGNvbmRpdGlvbgorY29kZXMgKGUuZy4gaWYgdGhleSByZWZsZWN0IHRoZSBzdGF0ZSBvZiBzb21lIG9iamVjdCBvciByZWdpc3RlcikuIEEKK3N1YnNlcXVlbnQgQGNvZGV7VEVTVH0gb3IgQGNvZGV7Q09NUEFSRX0gaW5zdHJ1Y3Rpb24gY2FuIHRoZW4gb2Z0ZW4gYmUKK2VsaW1pbmF0ZWQuCisKK0NhcmUgaGFzIHRvIGJlIHRha2VuIHRvIGRlbGV0ZSB0aGlzIGluZm9ybWF0aW9uIGlmIGVpdGhlciB0aGUgY29uZGl0aW9uCitjb2RlcyBtYXkgYmUgbW9kaWZpZWQgb3IgdGhlIG9iamVjdCB0aGV5IHJlcHJlc2VudCBpcyBtb2RpZmllZC4gQWxzbywKK3RoaXMgb3B0aW1pemF0aW9uIGlzIHVzdWFsbHkgaGFyZCB0byBkbyBhY3Jvc3MgbGFiZWxzLgorCitTb21lIGFyY2hpdGVjdHVyZXMgcHJvdmlkZSB2ZXJzaW9ucyBvZiBpbnN0cnVjdGlvbnMgd2hpY2ggc2V0IGNvbmRpdGlvbgorY29kZXMgYXMgd2VsbCBhcyB2ZXJzaW9ucyB3aGljaCBkbyBub3QuIFRoaXMgb2J2aW91c2x5IGVuYWJsZSBtb3JlCitvcHRpbWl6YXRpb25zLCBidXQgaXQgaXMgbW9yZSBkaWZmaWN1bHQgdG8gbWFrZSB1c2Ugb2YgdGhpcy4gT25lCitwb3NzaWJpbGl0eSBpcyB0byBzZWFyY2ggdGhlIGxpc3Qgb2YgSUNzIGJhY2t3YXJkcyBzdGFydGluZyBmcm9tCitldmVyeSBzdWl0YWJsZSBAY29kZXtURVNUfSBvciBAY29kZXtDT01QQVJFfSBpbnN0cnVjdGlvbi4gSWYgYW4gSUMKK2lzIGZvdW5kIHdoaWNoIGNvbXB1dGVzIHRoZSB0ZXN0ZWQgb2JqZWN0LCB0aGUgSUMgY2FuIGJlIG1hcmtlZAorKGV4dGVuZGVkIElDcyBjYW4gYmUgdXNlZCBmb3IgbWFya2luZywgQHB4cmVme2V4dGljfSkuCisKKworQG5vZGUgcmVncGFybQorQHN1YnNlY3Rpb24gUmVnaXN0ZXIgUGFyYW1ldGVycworCitXaGlsZSBwYXNzaW5nIG9mIGFyZ3VtZW50cyB0byBmdW5jdGlvbnMgY2FuIGJlIGRvbmUgYnkgcHVzaGluZyB0aGVtIG9uCit0aGUgc3RhY2ssIGl0IGlzIG9mdGVuIG1vcmUgZWZmaWNpZW50IHRvIHBhc3MgdGhlbSBpbiByZWdpc3RlcnMgaWYgdGhlCithcmNoaXRlY3R1cmUgaGFzIGVub3VnaCByZWdpc3RlcnMuCisKK1RvIHVzZSByZWdpc3RlciBwYXJhbWV0ZXJzIHlvdSBoYXZlIHRvIGFkZCB0aGUgbGluZQorQGV4YW1wbGUKKyNkZWZpbmUgSEFWRV9SRUdQQVJNUyAxCitAZW5kIGV4YW1wbGUKK3RvIEBmaWxle21hY2hpbmUuaH0gYW5kIGRlZmluZSBhCitAZXhhbXBsZQorICAgICAgICBzdHJ1Y3QgcmVnX2hhbmRsZSBAey4uLkB9CitAZW5kIGV4YW1wbGUKK1RoaXMgc3RydWN0IGlzIHVzZWQgYnkgdGhlIGNvbXBpbGVyIHRvIGZpbmQgb3V0IHdoaWNoIHJlZ2lzdGVyIHNob3VsZCBiZSB1c2VkCit0byBwYXNzIGFuIGFyZ3VtZW50LiBAZmlsZXttYWNoaW5lLmN9IGhhcyB0byBjb250YWluIGFuIGluaXRpYWxpemVkCit2YXJpYWJsZQorQGV4YW1wbGUKKyAgICAgICAgc3RydWN0IHJlZ19oYW5kbGUgZW1wdHlfcmVnX2hhbmRsZTsKK0BlbmQgZXhhbXBsZQord2hpY2ggcmVwcmVzZW50cyB0aGUgZGVmYXVsdCBzdGF0ZSwgYW5kIGEgZnVuY3Rpb24KK0BleGFtcGxlCisgICAgICAgIGludCByZWdfcGFybShzdHJ1Y3QgcmVnX2hhbmRsZSAqLCBzdHJ1Y3QgVHlwICosIGludCB2YXJhcmcsIHN0cnVjdCBUeXAgKik7CitAZW5kIGV4YW1wbGUKK3doaWNoIHJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgcmVnaXN0ZXIgdGhlIG5leHQgYXJndW1lbnQgd2lsbCBiZQorcGFzc2VkIGluIChvciAwIGlmIHRoZSBhcmd1bWVudCBpcyBub3QgcGFzc2VkIGluIGEgcmVnaXN0ZXIpLiBBbHNvLAoraXQgaGFzIHRvIHVwZGF0ZSB0aGUgcmVnX2hhbmRsZSBpbiBhIHdheSB0aGF0IHN1Y2Nlc3NpdmUgY2FsbHMgdG8KK0Bjb2Rle3JlZ19wYXJtKCl9Cit5aWVsZCB0aGUgY29ycmVjdCByZWdpc3RlciBmb3IgZXZlcnkgYXJndW1lbnQuCisKK0Bjb2Rle3ZhcmFyZ30gaXMgZGlmZmVyZW50IGZyb20gemVybywgaWYgdGhlIGFyZ3VtZW50IGlzIHBhcnQgb2YgdGhlIHZhcmlhYmxlCithcmd1bWVudHMgb2YgYSBmdW5jdGlvbiBhY2NlcHRpbmcgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLgorCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHJldHVybiBhIG5lZ2F0aXZlIG51bWJlciBAY29kZXt4fS4gSW4gdGhpcyBjYXNlLAordGhlIGFyZ3VtZW50IHdpbGwgYmUgcGFzc2VkIGluIHJlZ2lzdGVyIG51bWJlciBAY29kZXsteH0sIGJ1dCBhbHNvIGEKK3N0YWNrLXNsb3Qgd2lsbCBiZSByZXNlcnZlZCBmb3IgdGhpcyBhcmd1bWVudCAoaS5lLiBhIEBjb2Rle1BVU0h9IElDCit3aXRob3V0IGFuIG9wZXJhbmQgd2lsbCBiZSBnZW5lcmF0ZWQpLiBJZiBAb3B0aW9uey1kb3VibGUtcHVzaH0gaXMKK3NwZWNpZmllZCwgdGhlIGFyZ3VtZW50IHdpbGwgYWxzbyBiZSB3cml0dGVuIHRvIHRoZSBzdGFjay1zbG90IChpLmUuCitpdCB3aWxsIGJlIHBhc3NlZCB0d2ljZSwgaW4gYSByZWdpc3RlciBhbmQgb24gdGhlIHN0YWNrKS4KKworQG5vZGUgcmVncGFpcnMKK0BzdWJzZWN0aW9uIFJlZ2lzdGVyIFBhaXJzCisKK09mdGVuLCB0aGVyZSBhcmUgdHlwZXMgd2hpY2ggY2Fubm90IGJlIHN0b3JlZCBpbiBhIHNpbmdsZSBtYWNoaW5lIHJlZ2lzdGVyLAorYnV0IGl0IG1heSBiZSBtb3JlIGVmZmljaWVudCB0byBzdG9yZSB0aGVtIGluIHR3byByZWdpc3RlcnMgcmF0aGVyIHRoYW4KK2luIG1lbW9yeS4gVHlwaWNhbCBleGFtcGxlcyBhcmUgaW50ZWdlcnMgd2hpY2ggYXJlIGJpZ2dlciB0aGFuIHRoZQorcmVnaXN0ZXIgc2l6ZSBvciBhcmNoaXRlY3R1cmVzIHdoaWNoIGNvbWJpbmUgdHdvIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycworaW50byBvbmUgcmVnaXN0ZXIgb2YgZG91YmxlIHByZWNpc2lvbi4KKworVG8gbWFrZSB1c2Ugb2YgcmVnaXN0ZXIgcGFpcnMsIHRoZSBsaW5lCitAZXhhbXBsZQorI2RlZmluZSBIQVZFX1JFR1BBSVJTIDEKK0BlbmQgZXhhbXBsZQoraGFzIHRvIGJlIGFkZGVkIHRvIEBmaWxle21hY2hpbmUuaH0uIFRoZSByZWdpc3RlciBwYWlycyBhcmUgZGVjbGFyZWQKK2FzIG5vcm1hbCByZWdpc3RlcnMgKGVhY2ggcmVnaXN0ZXIgcGFpciBjb3VudHMgYXMgYW4gb3duIHJlZ2lzdGVyIGFuZAorQGNvZGV7TUFYUn0gaGFzIHRvIGJlIGFkanVzdGVkKS4gVXN1YWxseSBvbmx5IGFkamFjZW50IHJlZ2lzdGVycyBhcmUKK2RlY2xhcmVkIGFzIHJlZ2lzdGVyIHBhaXJzLiBOb3RlIHRoYXQgQGNvZGV7cmVnc2NyYXRjaH0gbXVzdCBiZSBpZGVudGljYWwKK2ZvciBib3RoIHJlZ2lzdGVycyBvZiBhIHBhaXIuCisKK05vdyB0aGUgZnVuY3Rpb24KK0BleGFtcGxlCitpbnQgcmVnX3BhaXIoaW50IHIsc3RydWN0IHJwYWlyICpwKTsKK0BlbmQgZXhhbXBsZQorbXVzdCBiZSBpbXBsZW1lbnRlZC4gSWYgcmVnaXN0ZXIgQGNvZGV7cn0gaXMgYSByZWdpc3RlciBwYWlyLCB0aGUgZnVuY3Rpb24KK2hhcyB0byBzZXQgQGNvZGV7cC0+cjF9IGFuZCBAY29kZXtwLT5yMn0gdG8gdGhlIGZpcnN0IGFuZCBzZWNvbmQgcmVnaXN0ZXIKK3doaWNoIGNvbXByaXNlIHRoZSBwYWlyIGFuZCByZXR1cm4gMS4gT3RoZXJ3aXNlLCB6ZXJvIGhhcyB0byBiZSByZXR1cm5lZC4KKworCitAc3Vic2VjdGlvbiBFbGltaW5hdGlvbiBvZiBGcmFtZS1Qb2ludGVyCisKK0xvY2FsIHZhcmlhYmxlcyBvbiB0aGUgc3RhY2sgY2FuIHVzdWFsbHkgYmUgYWRkcmVzc2VkIHZpYSBhIHNvLWNhbGxlZAorZnJhbWUtcG9pbnRlciB3aGljaCBpcyBzZXQgc2V0IHRvIGN1cnJlbnQgc3RhY2stcG9pbnRlciBhdCB0aGUgZW50cnkKK29mIGEgZnVuY3Rpb24uIEhvd2V2ZXIsIGluIHRoZSBjb2RlIGdlbmVyYXRlZCBieSBAY29tbWFuZHt2YmNjfSwgdGhlCitkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN0YWNrLXBvaW50ZXIgYW5kIHRoZSBmcmFtZS1wb2ludGVyIGlzIGZpeGVkCithdCBhbnkgaW5zdHJ1Y3Rpb24uCisKK1RoZXJlZm9yZSBpdCBpcyBwb3NzaWJsZSB0byBrZWVwIHRyYWNrIG9mIHRoaXMgb2Zmc2V0IChieSBjb3VudGluZyB0aGUKK2J5dGVzIGV2ZXJ5IHRpbWUgY29kZSBmb3IgcHVzaGluZyBvciBwb3BwaW5nIGZyb20gdGhlIHN0YWNrIGlzIGdlbmVyYXRlZCkuCitVc2luZyB0aGlzIG9mZnNldCwgbG9jYWwgdmFyaWFibGVzIGNhbiBwZXJoYXBzIGJlIGFkZHJlc3NlZCB1c2luZyB0aGUKK3N0YWNrLXBvaW50ZXIgZGlyZWN0bHkuIEJlbmVmaXQgd291bGQgYmUgc21hbGxlciBmdW5jdGlvbiBlbnRyeS9leGl0IGNvZGUKK2FzIHdlbGwgYXMgYW4gYWRkaXRpb25hbCBmcmVlIHJlZ2lzdGVyIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBvdGhlcgorcHVycG9zZXMuCisKK05vdGUgdGhhdCBvbmx5IGZldyBkZWJ1Z2dlcnMgY2FuIGhhbmRsZSBzdWNoIGEgc2l0dWF0aW9uLgorCitAc3Vic2VjdGlvbiBEZWxheWVkIHBvcHBpbmcgb2YgU3RhY2stU2xvdHMKKworSW4gbW9zdCBBQklzIGFyZ3VtZW50cyB3aGljaCBhcmUgcHVzaGVkIG9uIHRoZSBzdGFjayBhcmUgbm90IHBvcHBlZAorYnkgdGhlIGNhbGxlZCBmdW5jdGlvbiBidXQgdGhlIGNhbGxlciBwb3BzIHRoZW0gYnkgYWRqdXN0aW5nIHRoZSBzdGFjaworYWZ0ZXIgdGhlIGNhbGxlZSByZXR1cm5zIChvdGhlcndpc2UgdmFyaWFibGUgYXJndW1lbnRzIHdvdWxkIGJlIGhhcmQKK3RvIGltcGxlbWVudCkuCisKK0lmIHNldmVyYWwgZnVuY3Rpb25zIGFyZSBjYWxsZWQgaW4gc2VxdWVuY2UsIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8KK2FkanVzdCB0aGUgc3RhY2sgYWZ0ZXIgZWFjaCBjYWxsIGJ1dCB0aGUgYXJndW1lbnRzIGZvciBzZXZlcmFsIGNhbGxzCitjYW4gYmUgcG9wcGVkIGF0IG9uY2UuIEl0IGNhbiBiZSBpbXBsZW1lbnRlZCBieSBrZWVwaW5nIHRyYWNrIG9mIHRoZQorc2l6ZSB0byBiZSBwb3BwZWQgYW5kIGRlZmVycmluZyBwb3BwaW5nIHRvIGEgcG9pbnQgd2hlcmUgaXQgaGFzIHRvIGJlCitkb25lIChlLmcuIGEgbGFiZWwgb3IgYSBicmFuY2gpLiBBbHNvLCBpbiB0aGUgY2FzZSBvZiBuZXN0ZWQgY2FsbHMsCitjYXJlIGhhcyB0byBiZSB0YWtlbiB0byBwb3AgYXJndW1lbnRzIGF0IHRoZSByaWdodCB0aW1lLgorCitOb3RlIHRoYXQgdGhpcyB1c3VhbGx5IHNhdmVzIGNvZGUtc2l6ZSBhbmQgZXhlY3V0aW9uIHRpbWUgYnV0IHdpbGwKK2luY3JlYXNlIHN0YWNrLXVzYWdlLiBUaGVyZWZvcmUsIGl0IG1heSBub3QgYmUgYWR2aXNhYmxlIGZvciBzbWFsbCBzeXN0ZW1zLgorCitAc3Vic2VjdGlvbiBPcHRpbWl6ZWQgUmV0dXJuCisKK1JldHVybiBpbnN0cnVjdGlvbnMgYXJlIG5vdCBleHBsaWNpdGx5IHJlcHJlc2VudGVkIGluIElDcy4gUmF0aGVyLCB0aGV5IGFyZQorYnJhbmNoZXMgdG8gYSBsYWJlbCB3aGljaCBpcyB0aGUgbGFzdCBJQyBpbiB0aGUgbGlzdCAoZXhjZXB0IHBvc3NpYmxlCitAY29kZXtGUkVFUkVHfXMpLgorCitJdCBpcyBwb3NzaWJsZSB0byBnZW5lcmF0ZSB3b3JraW5nIGNvZGUgYnkgdHJhbnNsYXRpbmcKK3RoZXNlIGJyYW5jaGVzIG5vcm1hbGx5LCBidXQgZGlyZWN0bHkgaW5zZXJ0aW5nIHRoZSBmdW5jdGlvbiBleGl0IGNvZGUKK2luc3RlYWQgb2YgYSBicmFuY2ggaXMgb2Z0ZW4gZmFzdGVyLiBJdCBpcyBtb3N0IHJlY29tbWVuZGFibGUgaWYgdGhlCitleGl0IGNvZGUgaXMgc21hbGwgKGUuZy4gbm8gcmVnaXN0ZXJzIGhhdmUgdG8gYmUgcmVzdG9yZWQgYW5kIG5vCitzdGFjay1mcmFtZSByZW1vdmVkKS4KKworQW5vdGhlciBjb21tb24gcG9zc2liaWxpdHkgZm9yIG9wdGltaXphdGlvbiBpcyBhIGZ1bmN0aW9uIGNhbGwgYXMgdGhlIGxhc3QKK0lDLiBJZiByZXR1cm4gYWRkcmVzc2VzIGFyZSBwdXNoZWQgb24gdGhlIHN0YWNrIGFuZCBubyBmdW5jdGlvbiBleGl0IGNvZGUKK2lzIG5lZWRlZCwgaXQgaXMgdXN1YWxseSBwb3NzaWJsZSB0byBnZW5lcmF0ZSBhIGp1bXAtaW5zdHJ1Y3Rpb24sIGkuZS4KK3JlcGxhY2UKK0BleGFtcGxlCisgICAgY2FsbCAgc29tZWZ1bmMKKyAgICByZXQKK0BlbmQgZXhhbXBsZQorYnkKK0BleGFtcGxlCisgICAgam1wICAgc29tZWZ1bmMKK0BlbmQgZXhhbXBsZQorCitAbm9kZSBqdW1wdGFibGVzCitAc3Vic2VjdGlvbiBKdW1wIFRhYmxlcworCitBbiBpbXBvcnRhbnQgb3B0aW1pemF0aW9uIGlzIHRoZSBjcmVhdGlvbiBvZiBqdW1wLXRhYmxlcyBmb3IgYSBzZXJpZXMgb2YKK2NvbXBhcmlzb25zIHdpdGggY29uc3RhbnRzLiBTdWNoIHNlcmllcyBhcmUgdXN1YWxseSBjcmVhdGVkIGJ5IGEgQworQGNvZGV7c3dpdGNofSBjb25zdHJ1Y3QsIGJ1dCB2YmNjIGNhbiBhbHNvIHJlY29nbml6ZSBzb21lIG9mIHRoZW0gaWYgdGhleQorYXJlIGNyZWF0ZWQgdGhyb3VnaCBAY29kZXtpZn0tc2VxdWVuY2VzLgorCitAZmlsZXtzdXBwLmN9IHByb3ZpZGVzIHRoZSBmdW5jdGlvbiBAY29kZXtjYWxjX2Nhc2VfdGFibGUoPElDPiw8ZGVuc2l0eT4pfQordG8gY2hlY2sgZm9yIGNvbnN0cnVjdHMgdGhhdCBjYW4gYmUgcmVwbGFjZWQgYnkgYSBqdW1wIHRhYmxlLiBUaGUgYXJndW1lbnRzCithcmUgdGhlIHN0YXJ0IElDIHRvIGxvb2sgZm9yIChpdCBoYXMgdG8gYmUgYSBAY29kZXtDT01QQVJFfS1JQyB3aXRoIGEgCitjb25zdGFudCBhcyBAY29kZXtxMn0pIGFuZCBhIG1pbmltYWwgZGVuc2l0eS4gVGhlIGRlbnNpdHkgcmVmbGVjdHMgdGhlCitudW1iZXIgb2YgY2FzZXMgdGhhdCBhcmUgdXNlZCBkaXZpZGVkIGJ5IHRoZSByYW5nZSBvZiBjYXNlcy4gSWYgdGhlIGRlbnNpdHkKK2lzIGhpZ2gsIHZiY2Mgd2lsbCB1c2UganVtcC10YWJsZXMgb25seSBmb3Igc2VxdWVuY2VzIHRoYXQgaGF2ZSBmZXcgdW51c2VkCitjYXNlcyBpbnNpZGUuIElmIHRoZSBjYXNlIHRhYmxlcyBvY2N1cHkgbXVsdGlwbGUgcmFuZ2VzLCB2YmNjIGlzIGFibGUgdG8gc3BsaXQKK3RoZW0gdXAgYW5kIGNyZWF0ZSBtdWx0aXBsZSBqdW1wLXRhYmxlcy4KKworQGNvZGV7Y2FsY19jYXNlX3RhYmxlfSByZXR1cm5zIGEgcG9pbnRlciB0byBhIEBjb2Rle3N0cnVjdCBjYXNlX3RhYmxlfSB3aXRoCit0aGUgZm9sbG93aW5nIGNvbnRlbnQ6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gbnVtCitUaGUgbnVtYmVyIG9mIGNhc2VzLgorCitAaXRlbSB0eXBmCitUaGUgdHlwZSBvZiB0aGUgY2FzZSBJRHMuCisKK0BpdGVtIG5leHRfaWMKK1RoZSBmaXJzdCBJQyBhZnRlciB0aGUgbGlzdCBvZiBJQ3MgdGhhdCBjYW4gYmUgcmVwbGFjZWQgYnkgdGhlIGp1bXAtdGFibGUuCisKK0BpdGVtIGRlbnNpdHkKK1RoZSBjYXNlIGRlbnNpdHkuCisKK0BpdGVtIHZhbHMKK1RoZSB2YWx1ZXMgb2YgdGhlIGNhc2UgSURzIChhcnJheSBjb250YWluaW5nIEBjb2Rle251bX0gZW50cmllcykuCisKK0BpdGVtIGxhYmVscworVGhlIGxhYmVscyBvZiB0aGUgY29kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjYXNlIElEcworKGFycmF5IGNvbnRhaW5pbmcgQGNvZGV7bnVtfSBlbnRyaWVzKS4KKworQGl0ZW0gbWluCitUaGUgbG93ZXN0IGNhc2UgSUQuCisKK0BpdGVtIG1heAorVGhlIGhpZ2hlc3QgY2FzZSBJRC4KKworQGl0ZW0gZGlmZgorQGNvZGV7bWF4LW1pbn0uCisKK0BlbmQgdGFibGUKKworSWYgdGhlIGJhY2tlbmQgZGVjaWRlcyB0byBlbWl0IGEganVtcC10YWJsZSwgaXQgaGFzIHRvIGdlbmVyYXRlIGNvZGUgdGhhdAord2lsbCBjaGVjayB0aGF0IHRoZSBjb250cm9sIGV4cHJlc3Npb24gbGllcyBiZXR3ZWVuIEBjb2Rle21pbn0gYW5kIEBjb2Rle21heH0uCitJZiBub3QsIHRoZSBqdW1wLXRhYmxlIG11c3Qgbm90IGJlIGV4ZWN1dGVkLiBDb2RlIGZvciB0aGUgY29tcHV0ZWQganVtcAorbXVzdCB0aGVuIGJlIGdlbmVyYXRlZC4gVGhlIGFjdHVhbCB0YWJsZSBjYW4gYmUgZW1pdHRlZCB1c2luZworQGNvZGV7ZW1pdF9qdW1wX3RhYmxlKCl9LiBQcm9jZXNzaW5nIGNhbiB0aGVuIGNvbnRpbnVlIHdpdGggQGNvZGV7bmV4dF9pY30uCisKK0Bub2RlIHRhcmdldHJhbGxvYworQHN1YnNlY3Rpb24gQ29udGV4dC1zZW5zaXRpdmUgUmVnaXN0ZXItQWxsb2NhdGlvbgorCitUaGUgQGNvZGV7cmVnb2soKX0gZnVuY3Rpb24gaXMgb25seSBhIHNpbXBsZSBtZWFucyBvZiB0ZWxsaW5nIHRoZQorcmVnaXN0ZXIgYWxsb2NhdG9yIHdoaWNoIHJlZ2lzdGVycyB0byB1c2UuIEl0IHdvcmtzIGZhaXJseSB3ZWxsIHdpdGgKK29ydGhvZ29uYWwgcmVnaXN0ZXIgYW5kIGluc3RydWN0aW9uIHNldHMuIEhvd2V2ZXIsIGl0IGRvZXMgbm90IHJlYWxseQorY2FyZSBhYm91dCB0aGUgb3BlcmF0aW9ucyBwZXJmb3JtZWQgYW5kIGl0IGFsbG9jYXRlcyB2YXJpYWJsZXMgdG8gcmVnaXN0ZXJzCitvbmx5IGFjY29yZGluZyB0byB0aGVpciB0eXBlLCBub3QgYWNjb3JkaW5nIHRvIHRoZSBvcGVyYXRpb25zIHBlcmZvcm1lZC4KKworU29tZSBhcmNoaXRlY3R1cmVzIHByb3ZpZGUgZGlmZmVyZW50IGtpbmRzIG9mIHJlZ2lzdGVycyB3aGljaCBhcmUgYWJsZSB0bworc3RvcmUgYSB0eXBlLCBidXQgbm90IGFsbCBvZiB0aGVtIGFyZSBhYmxlIHRvIHBlcmZvcm0gYWxsIG9wZXJhdGlvbnMgb3Igc29tZQorb3BlcmF0aW9ucyBhcmUgbW9yZSBleHBlbnNpdmUgd2l0aCBzb21lIHJlZ2lzdGVycy4gVG8gZG8gZ29vZCByZWdpc3RlcgorYWxsb2NhdGlvbiBmb3IgdGhlc2Ugc3lzdGVtcywgdGhlIG9wZXJhdGlvbnMgd2hpY2ggYXJlIHVzZWQgb24gdmFyaWFibGVzCitoYXZlIHRvIGJlIGNvbnNpZGVyZWQuCisKK0lmIHRoZSBiYWNrZW5kIHdhbnRzIHRvIHN1cHBvcnQgdGhpcyBraW5kIG9mIHJlZ2lzdGVyIGFsbG9jYXRpb24sIGl0IGhhcwordG8gZGVmaW5lIEBjb2Rle0hBVkVfVEFSR0VUX1JBTExPQ30gYW5kIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMKK29yIG1hY3JvczoKKworQHRhYmxlIEBjb2RlCitAaXRlbSBpbnQgY29zdF9tb3ZlX3JlZyhpbnQgeCxpbnQgeSk7CitUaGUgY29zdCBvZiBjb3B5aW5nIHJlZ2lzdGVyIEBjb2Rle3h9IHRvIHJlZ2lzdGVyIEBjb2Rle3l9LgorQGl0ZW0gaW50IGNvc3RfbG9hZF9yZWcoaW50IHIsc3RydWN0IFZhciAqdik7CitUaGUgY29zdCBvZiBsb2FkaW5nIHJlZ2lzdGVyIEBjb2Rle3J9IGZyb20gdmFyaWFibGUgQGNvZGV7dn0uCitAaXRlbSBpbnQgY29zdF9zYXZlX3JlZyhpbnQgcixzdHJ1Y3QgVmFyICp2KTsKK1RoZSBjb3N0IG9mIHN0b3JpbmcgcmVnaXN0ZXIgQGNvZGV7cn0gaW50byB2YXJpYWJsZSBAY29kZXt2fS4KK0BpdGVtIGludCBjb3N0X3B1c2hwb3BfcmVnKGludCByKTsKK1RoZSBjb3N0IG9mIHN0b3JpbmcgcmVnaXN0ZXIgQGNvZGV7cn0gZHVyaW5nIGZ1bmN0aW9uIHByb2xvZ3VlIGFuZAorcmVzdG9yaW5nIGl0IGluIHRoZSBlcGlsb2d1ZS4KK0BpdGVtIGludCBjb3N0X3NhdmluZ3Moc3RydWN0IElDICpwLGludCByLHN0cnVjdCBvYmogKm8pOworRXN0aW1hdGUgdGhlIHNhdmluZ3Mgd2hpY2ggd291bGQgYmUgb2J0YWluZWQgaWYgdGhlIG9iamVjdCBAY29kZXtvfQoraW4gSUMgQGNvZGV7cH0gd291bGQgYmUgYXNzaWduZWQgdG8gcmVnaXN0ZXIgQGNvZGV7cn0gKGluIHRoaXMgSUMpLiBJZiB0aGUKK2JhY2tlbmQgd2FzIG5vdCBhYmxlCit0byBlbWl0IGNvZGUgaW4gdGhpcyBjYXNlLCBAY29kZXtJTlRfTUlOfSBtdXN0IGJlIHJldHVybmVkLgorCitJZiBAY29kZXsoby0+ZmxhZ3MgJiBWS09OU1QpICE9IDB9LCB0aGUgcmVnaXN0ZXIgYWxsb2NhdG9yIGlzIHRoaW5raW5nCithYm91dCBwdXR0aW5nIGEgY29uc3RhbnQgKG9yIGFkZHJlc3Mgb2YgYSBzdGF0aWMgdmFyaWFibGUpIGluIGEgcmVnaXN0ZXIuCitJbiB0aGlzIGNhc2UsIHRoZSByZWFsIG9iamVjdCB3aGljaCB3b3VsZCBiZSBwdXQgaW4gYSByZWdpc3RlciBpcyBmb3VuZAoraW4gQGNvZGV7by0+di0+Y29ian0uCitAZW5kIHRhYmxlCisKK1RoZSB1bml0IG9mIHRoZSBjb3N0cyBjYW4gYmUgY2hvc2VuIGJ5IHRoZSBiYWNrZW5kLCBidXQgc2hvdWxkIGJlIHNvbWUKK3JlYXNvbmFibGUgc21hbGwgdmFsdWVzLgorCitJZiBAY29kZXtyZWdvaygpfSBpcyBjYWxsZWQgd2l0aCBhIHRoaXJkIHBhcmFtZXRlciBvZiAtMSwgaXQgaXMgcG9zc2libGUKK3RvIHJldHVybiBub24temVybyBmb3IgYSByZWdpc3RlciB3aGljaCBjYW5ub3QgcGVyZm9ybSBhbGwgb3BlcmF0aW9ucy4KK1RoZSByZWdpc3RlciBhbGxvY2F0b3Igd2lsbCBjYWxsIEBjb2Rle2Nvc3Rfc2F2aW5ncygpfSBhbmQgcmV0dXJuaW5nCitAY29kZXtJTlRfTUlOfSBjYW4gYmUgdXNlZCB0byBwcmV2ZW50IHRoaXMgcmVnaXN0ZXIgZnJvbSBiZWluZyBhbGxvY2F0ZWQsCitpZiB0aGUgcmVnaXN0ZXIgaXMgbm90IHN1aXRhYmxlIGZvciBhIGNlcnRhaW4gb3BlcmF0aW9uLgorCisKK0Bub2RlIHJlZ3Ntb2RpZmllZAorQHN1YnNlY3Rpb24gSW50ZXItcHJvY2VkdXJhbCBSZWdpc3Rlci1BbGxvY2F0aW9uCisKK1RvIHN1cHBvcnQgaW50ZXItcHJvY2VkdXJhbCByZWdpc3RlciBhbGxvY2F0aW9uLCB0aGUgYmFja2VuZCBtdXN0IHRlbGwgdGhlCitvcHRpbWl6ZXIgd2hpY2ggcmVnaXN0ZXJzIGFyZSB1c2VkIGJ5IGEgZnVuY3Rpb24uIEFzIHRoZSBiYWNrZW5kIG1pZ2h0IHVzZQorc29tZSByZWdpc3RlcnMgaW50ZXJuYWxseSwgdGhlIGZyb250ZW5kIGNhbiBub3Qga25vdyB0aGlzLgorCitBcGFydCBmcm9tIGRlZmluaW5nIEBjb2Rle0hBVkVfUkVHU19NT0RJRklFRH0gaW4gQGZpbGV7bWFjaGluZS5ofSwgdGhlCitiYWNrZW5kIGhhcyB0byBtYXJrIGFsbCByZWdpc3RlcnMgdGhhdCBhcmUgbW9kaWZpZWQgaW4gdGhlIGJpdGZpZWxkCitAY29kZXtyZWdzX21vZGlmaWVkfS4gQSByZWdpc3RlciBjYW4gYmUgbWFya2VkIHdpdGgKK0Bjb2Rle0JTRVQocmVnc19tb2RpZmllZCw8cmVnPil9LiBGb3IgYSBjYWxsIElDLCB0aGUgZnVuY3Rpb24gQGNvZGV7Y2FsY19yZWdzKCl9CisoZnJvbSBAZmlsZXtzdXBwLmh9KSBjYW4gYmUgY2FsbGVkIHRvIG1hcmsgdGhlIHJlZ2lzdGVycyB1c2VkIGJ5IGEgY2FsbCBJQy4KK0l0IHdpbGwgcmV0dXJuIDEgaWYgaXQgd2FzIGFibGUgdG8gZGV0ZXJtaW5lIGFsbCByZWdpc3RlcnMgdXNlZCBieSB0aGlzIElDLgorCitJZiB0aGUgcmVnaXN0ZXIgdXNhZ2UgY291bGQgYmUgZGV0ZXJtaW5lZCBmb3IgdGhlIGVudGlyZSBmdW5jdGlvbiwgdGhlCitiYWNrZW5kIGNhbiBzZXQgdGhlIGJpdCBAY29kZXtBTExfUkVHU30gaW4gdGhlIGZpLW1lbWJlciBvZiB0aGUgZnVuY3Rpb24KK3ZhcmlhYmxlIChAY29kZXt2LT5maS0+ZmxhZ3N8PUFMTF9SRUdTO30pLgorCisKK0BzdWJzZWN0aW9uIENvbmRpdGlvbmFsIEluc3RydWN0aW9ucworCitGSVhNRTogVG8gYmUgd3JpdHRlbi4KKworQG5vZGUgZXh0aWMKK0BzdWJzZWN0aW9uIEV4dGVuZGVkIElDcworCitJZiB0aGUgYmFja2VuZCBkZWZpbmVzIEBjb2Rle0hBQ0VfRVhUX0lDfSwgaXQgaGFzIHRvIGRlZmluZSBhCitAY29kZXtzdHJ1Y3QgZXh0X2ljfSBpbiBAZmlsZXttYWNoaW5lLmh9LiBUaGlzIHN0cnVjdHVyZSB3aWxsIGJlIGFkZGVkCit0byBlYWNoIElDIGFuZCBjYW4gYmUgdXNlZCBieSB0aGUgYmFja2VuZCBmb3IgcHJpdmF0ZSB1c2UuCisKK0Bub2RlIGFzbXBlZXBob2xlCitAc3Vic2VjdGlvbiBQZWVwaG9sZSBPcHRpbWl6YXRpb25zIG9uIEFzc2VtYmx5IE91dHB1dAorCitTb21lIG9wdGltaXphdGlvbnMgYXJlIGVhc2llciB0byBkbyBvbiB0aGUgZ2VuZXJhdGVkIGFzc2VtYmx5IGNvZGUgcmF0aGVyCit0aGFuIGRvaW5nIHRoZW0gYmVmb3JlIGVtaXR0aW5nIGNvZGUuIFRoZXJlZm9yZSBpdCBpcyBwb3NzaWJsZSB0byBkbworcGVlcGhvbGUgb3B0aW1pemF0aW9ucyBvbiB0aGUgZW1pdHRlZCBjb2RlIGJlZm9yZSBpdCBpcyByZWFsbHkKK3dyaXR0ZW4gdG8gYSBmaWxlLgorCitAY29kZXtFTUlUX0JVRl9ERVBUSH0gbGluZXMgd2lsbCBiZSBzdG9yZWQgaW4gYSByaW5nIGJ1ZmZlciBhbmQgYXJlIGF2YWlsYWJsZQordG8gZXhhbWluYXRpb24gYW5kIG1vZGlmaWNhdGlvbiBieSBhIGZ1bmN0aW9uIEBjb2Rle2VtaXRfcGVlcGhvbGUoKX0uIFRoZQorYWN0dWFsIGFzc2VtYmx5IG91dHB1dCBpcyBzdG9yZWQgaW4gQGNvZGV7ZW1pdF9idWZmZXJ9LCB0aGUgaW5kZXggb2YKK3RoZSBmaXJzdCBsaW5lIHRvIGJlIG91dHB1dCBpbiBAY29kZXtlbWl0X2Z9IGFuZCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb25lCitpbiBAY29kZXtlbWl0X2x9IChub3RlIHRoYXQgeW91IGhhdmUgdG8gY2FsY3VsYXRlIG1vZHVsbyBAY29kZXtFTUlUX0JVRl9ERVBUSH0KKy0gaXQgaXMgYSByaW5nIGJ1ZmZlcikuCisKK1RoZSBvdXRwdXQgbWF5IGJlIG1vZGlmaWVkIGluIG1lbW9yeSBhbmQgdGhlIGZpcnN0IGxpbmUgbWF5IGJlIHJlbW92ZWQKK3VzaW5nIEBjb2Rle3JlbW92ZV9hc20oKX0uIElmIGEgbW9kaWZpY2F0aW9uIHRvb2sgcGxhY2UsIGEgbm9uLXplcm8gdmFsdWUKK2hhcyB0byBiZSByZXR1cm5lZCAoMCBvdGhlcndpc2UpLiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY29kZSB3b3VsZCBjb21iaW5lCit0d28gY29uc2VjdXRpdmUgYWRkaXRpb25zIHRvIHRoZSBzYW1lIHJlZ2lzdGVyOgorQGV4YW1wbGUKK2ludCBlbWl0X3BlZXBob2xlKHZvaWQpCitAeworICBpbnQgZW50cmllcyxpLHIxLHIyOworICBsb25nIHgseTsKKyAgLyogcG9pbnRlciB0byB0aGUgbGluZXMgaW4gb3JkZXIgb2Ygb3V0cHV0ICovCisgIGNoYXIgKmFzbWxpbmVbRU1JVF9CVUZfREVQVEhdOworICBpPWVtaXRfbDsKKyAgLyogY29tcHV0ZSBudW1iZXIgb2YgZW50cmllcyBpbiByaW5nIGJ1ZmZlciAqLworICBpZihlbWl0X2Y9PTApCisgICAgZW50cmllcz1pLWVtaXRfZisxOworICBlbHNlCisgICAgZW50cmllcz1FTUlUX0JVRl9ERVBUSDsKKyAgLyogdGhlIGZpcnN0IGxpbmUgKi8KKyAgYXNtbGluZVswXT1lbWl0X2J1ZmZlcltpXTsKKyAgaWYoZW50cmllcz49MilAeworICAgIC8qIHdlIGhhdmUgYXQgbGVhc3QgdHdvIGxpbmUgc2luIHRoZSBidWZmZXIgKi8KKyAgICAvKiBjYWxjdWxhdGUgdGhlIG5leHQgbGluZSAobW9kdWxvIEVNSVRfQlVGX0RFUFRIKSAqLworICAgIGktLTsKKyAgICBpZihpPDApIGk9RU1JVF9CVUZfREVQVEgtMTsKKyAgICBhc21saW5lWzFdPWVtaXRfYnVmZmVyW2ldOworICAgIGlmKHNzY2FuZihhc21saW5lWzBdLCJcdGFkZFx0UiVkLCMlbGQiLCZyMSwmeCk9PTImJgorICAgICAgIHNzY2FuZihhc21saW5lWzFdLCJcdGFkZFx0UiVkLCMlbGQiLCZyMiwmeSk9PTImJgorICAgICAgIHIxPT1yMilAeworICAgICAgc3ByaW50Zihhc21saW5lWzFdLCJcdGFkZFx0UiVkLCMlbGRcbiIscjEseCt5KTsKKyAgICAgIHJlbW92ZV9hc20oKTsKKyAgICAgIHJldHVybiAxOworICAgIEB9CisgIEB9CisgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitAfQorQGVuZCBleGFtcGxlCisKK0JlIHZlcnkgY2FyZWZ1bCB3aGVuIGRvaW5nIHN1Y2ggb3B0aW1pemF0aW9ucy4gT25seSBwZXJmb3JtIG9wdGltaXphdGlvbnMKK3doaWNoIGFyZSByZWFsbHkgbGVnYWwuIEVzcGVjaWFsbHkgYXNzZW1ibHkgY29kZSBvZnRlbiBoYXMgc2lkZSBlZmZlY3RzCitsaWtlIHNldHRpbmcgb2YgZmxhZ3MuCisKK0RlcGVuZGluZyBvbiBjb21tYW5kIGxpbmUgZmxhZ3MgaW5saW5lIGFzc2VtYmx5IGNvZGUgbWF5IG9yIG1heSBub3QgYmUKK3Bhc3NlZCB0aHJvdWdoIHRoaXMgcGVlcGhvbGUgb3B0aW1pemVyLiBCeSBkZWZhdWx0LCBpdCB3aWxsIGJlIGRvbmUsCitlbmFibGluZyBvcHRpbWl6YXRpb25zIGJldHdlZW4gZ2VuZXJhdGVkIGNvZGUgYW5kIGlubGluZSBhc3NlbWJseS4KKworCitAbm9kZSBtYXJrZWZmaWNzCitAc3Vic2VjdGlvbiBNYXJraW5nIG9mIGVmZmljaWVudCBJQ3MKKworSWYgdGhlIGJhY2tlbmQgc2V0cyBAY29kZXtIQVZFX0VGRl9JQ1N9IGluIEBmaWxle21hY2hpbmUuaH0sIGl0IGhhcyB0bworcHJvdmlkZSBhIGZ1bmN0aW9uIEBjb2Rle3ZvaWQgbWFya19lZmZfaWNzKHZvaWQpfS4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlCitjYWxsZWQgKHBvc3NpYmx5IG11bHRpcGxlIHRpbWVzKSBieSB0aGUgZnJvbnRlbmQuIFRoZSBmdW5jdGlvbiBoYXMgdG8gc2V0CitvciBjbGVhciB0aGUgYml0IEBjb2Rle0VGRl9JQ30gaW4gdGhlIG1lbWJlciBAY29kZXtmbGFnc30gb2YgZXZlcnkgSUMuCisKK1RoZSBmbGFnIHNob3VsZCBiZSBzZXQgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGluIGEgY29udGV4dCB0aGF0IHN1Z2dlc3RzCitpdCB3aWxsIHRyYW5zbGF0ZSB0byBlZmZpY2llbnQgbWFjaGluZSBjb2RlLiBUaGUgb3B0aW1pemVyIHdpbGwgdHJhbnNmb3JtCit0aGlzIElDIGxlc3MgYWdncmVzc2l2ZWx5LgorCitBcyB0aGlzIGlzIGFsbCBoYXBwZW5zIGJlZm9yZSByZWdpc3RlciBhbGxvY2F0aW9uLCB0aGUgZGVjaXNpb24gaXMgb2YgYSB2ZXJ5CitoZXVyaXN0aWMgbmF0dXJlLgorCitAc3Vic2VjdGlvbiBGdW5jdGlvbiBlbnRyeS9leGl0IENvZGUKKworQXQgZW50cnkgYW5kIGV4aXQgb2YgZnVuY3Rpb24sIHRoZXJlIGlzIHVzdWFsbHkgc29tZSBjb2RlIHRvIHNldCB1cAordGhlIG5ldyBlbnZpcm9ubWVudCBmb3IgdGhpcyBmdW5jdGlvbi4gRm9yIGV4YW1wbGUsIHJlZ2lzdGVycyB3aWxsCitoYXZlIHRvIGJlIHNhdmVkL3Jlc3RvcmVkLCBhIGZyYW1lIHBvaW50ZXIgbWF5IGJlIHNldCB1cCBhbmQgYSBzdGFjaworZnJhbWUgd2lsbCBiZSBjcmVhdGVkLiBJdCBpcyBnZW5lcmFsbHkgd29ydGh3aWxlIHRvIG9wdGltaXplIHRoaXMgCitlbnRyeS9leGl0IGNvZGUuIEZvciBleGFtcGxlLCBpZiBubyByZWdpc3RlcnMgbmVlZCB0byBiZSBzYXZlZCBhbmQgbm8KK2xvY2FsIHZhcmlhYmxlcyBhcmUgdXNlZCBvbiB0aGUgc3RhY2ssIGl0IG1heSBub3QgYmUgbmVjZXNzYXJ5IHRvCitjcmVhdGUgYSBzdGFjayBmcmFtZS4KKworVGhlIGV4YWN0IHBvc3NpYmlsaXRpZXMgZm9yIG9wdGltaXphdGlvbiBkZXBlbmQgb24gdGhlIGFyY2hpdGVjdHVyZSBhbmQgdGhlCitBQkkuCisKKworQHN1YnNlY3Rpb24gTXVsdGlwbGljYXRpb24vZGl2aXNpb24gd2l0aCBDb25zdGFudHMKKworTWFueSBhcmNoaXRlY3R1cmVzIGRvIG5vdCBwcm92aWRlIGluc3RydWN0aW9uIGZvciBtdWx0aXBsaWNhdGlvbiwKK2RpdmlzaW9uIG9yIG1vZHVsbyBjYWxjdWxhdGlvbi4gQW5kIG9uIG1vc3QgYXJjaGl0ZWN0dXJlcyBwcm92aWRpbmcKK3N1Y2ggaW5zdHJ1Y3Rpb25zIHRoZXkgYXJlIHJhdGhlciBzbG93LiBUaGVyZWZvcmUsIGl0IGlzIHJlY29tbWVuZGVkCit0byBlbWl0IGNoZWFwZXIgaW5zdHJ1Y3Rpb25zLCBpZiBwb3NzaWJsZS4KKworVXN1YWxseSwgdGhpcyBjYW4gb25seSBiZSBkb25lIGlmIG9uZSBvcGVyYW5kIG9mIHRoZSBvcGVyYXRpb24gaXMgYQorY29uc3RhbnQuIE11bHRpcGxpY2F0aW9ucyBtYXkgYmUgcmVwbGFjZWQgYnkgYSBzZXJpZXMgb2Ygc2hpZnQgYW5kCithZGQgaW5zdHJ1Y3Rpb25zLCBmb3IgZXhhbXBsZS4gVGhlIHNpbXBsZXN0IGFuZCBtb3N0IGltcG9ydGFudCBjYXNlcwordG8gcmVwbGFjZSBhcmUgbXVsdGlwbGljYXRpb24sIGRpdmlzaW9uIGFuZCBtb2R1bG8gd2l0aCBhIHBvd2VyIG9mIHR3by4KK011bHRpcGxpY2F0aW9uIGJ5IHggY2FuIGJlIHJlcGxhY2VkIGJ5IGEgbGVmdCBzaGlmdCBvZiBsb2cyKHgpLAordW5zaWduZWQgZGl2aXNpb24gb2YgeCBjYW4gYmUgcmVwbGFjZWQgYnkgbG9naWNhbCByaWdodCBzaGlmdCBvZiBsb2cyKHgpCithbmQgdW5zaWduZWQgbW9kdWxvIGJ5IHggY2FuIGJlIHJlcGxhY2VkIGJ5IGFuZGluZyB3aXRoIHgtMS4KKworTm90ZSB0aGF0CitzaWduZWQgZGl2aXNpb24gYW5kIG1vZHVsbyBjYW4gdXN1YWxseSBub3QgYmUgcmVwbGFjZWQgdGhhdCBzaW1wbGUgYmVjYXVzZQorbW9zdCBkaXZpc2lvbiBpbnN0cnVjdGlvbnMgZ2l2ZSBkaWZmZXJlbnQgcmVzdWx0cyBmb3Igc29tZSBuZWdhdGl2ZQordmFsdWVzLiBBbiBhZGRpdGlvbmFsIGFkanVzdG1lbnQgd291bGQgYmUgbmVjZXNzYXJ5IHRvIGdldCBjb3JyZWN0IHJlc3VsdHMuCitXaGV0aGVyIHRoaXMgaXMgc3RpbGwgYW4gaW1wcm92ZW1lbnQsIGRlcGVuZHMgb24gdGhlIGFyY2hpdGVjdHVyZSBkZXRhaWxzLgorCitUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHRlc3Qgd2hldGhlciBhIHZhbHVlIGlzIGEgcG93ZXIgb2YKK3R3bzoKK0BleGFtcGxlCitzdGF0aWMgbG9uZyBwb2YyKHp1bWF4IHgpCisvKiAgWWllbGRzIGxvZzIoeCkrMSBvciAwLiAqLworQHsKKyAgenVtYXggcDtpbnQgbG49MTsKKyAgcD11bDJ6dW0oMUwpOworICB3aGlsZShsbjw9MzImJnp1bWxlcShwLHgpKUB7CisgICAgaWYoenVtZXF0byh4LHApKSByZXR1cm4gbG47CisgICAgbG4rKztwPXp1bWFkZChwLHApOworICBAfQorICByZXR1cm4gMDsKK0B9CitAZW5kIGV4YW1wbGUKKworQHN1YnNlY3Rpb24gQmxvY2sgY29weWluZworCitUaGVyZSBhcmUgbWFueSBjYXNlcyBvZiBjb3B5aW5nIG9mIGxhcmdlciBkYXRhLiBGb3IgdGhlIGJhY2tlbmQsIHRob3NlCit3aWxsIG1vc3RseSBiZSB1c2VkIGluIEBjb2Rle1BVU0h9IGFuZCBAY29kZXtBU1NJR059IElDcy4gSXQgaXMgdmVyeQoraW1wb3J0YW50IHRvIGltcGxlbWVudCB0aG9zZSBhcyBlZmZpY2llbnQgYXMgcG9zc2libGUuCisKK1NvbWUgdGhpbmdzIHRvIGNvbnNpZGVyOgorCitAaXRlbWl6ZSBAbWludXMKK0BpdGVtIFdoZW4gYWxpZ25tZW50IGlzIGtub3duLCB1c2Ugd29yZC1jb3B5IGluc3RlYWQgb2YgYnl0ZS1jb3B5LgorCitAaXRlbSBDb3B5IHNtYWxsIGJsb2NrcyBieSBhIHNlcmllcyBvZiBjb3B5IGluc3RydWN0aW9ucy4KKworQGl0ZW0gRm9yIGxhcmdlciBibG9ja3MsIGxvYWRpbmcgYWRkcmVzc2VzIGluIHJlZ2lzdGVycyBtYXkgaGVscC4KKworQGl0ZW0gRm9yIGxhcmdlIGJsb2NrcywgdXNlIGEgbG9vcC4gSW1wbGVtZW50IGl0IGVmZmljaWVudGx5IGFuZCB0cnkgdG8KK3Vucm9sbCB0aGUgbG9vcCBhIGZldyB0aW1lcy4KKworQGl0ZW0gRm9yIHZlcnkgbGFyZ2UgYmxvY2tzLCBjYWxsaW5nIGEgbGlicmFyeSBmdW5jdGlvbiBtYXkgYmUgdXNlZnVsLiBXaGlsZQordGhpcyBjcmVhdGVzIHNvbWUgb3ZlcmhlYWQsIHRoZSBmdW5jdGlvbiBjYW4gZHluYW1pY2FsbHkgY2hlY2sgdGhlIGFsaWdubWVudAorb3IgcGVyaGFwcyBldmVuIHVzZSBzcGVjaWFsIGhhcmR3YXJlLCBpZiBhdmFpbGFibGUuCisKK0BpdGVtIFNldCBAY29kZXtJTkxJTkVNRU1DT1BZfSB0byByZWFzb25hYmxlIHZhbHVlcy4gU2V0IGl0IHRvIGEgdmVyeSBoaWdoCit2YWx1ZSBpZiB5b3UgaW1wbGVtZW50IHZlcnkgZ29vZCBibG9jayBjb3B5aW5nLgorCitAZW5kIGl0ZW1pemUKKworCitAc3Vic2VjdGlvbiBPcHRpbWl6ZWQgTGlicmFyeSBGdW5jdGlvbnMKKworRklYTUU6IFRvIGJlIHdyaXR0ZW4uCisKK0BzdWJzZWN0aW9uIEluc3RydWN0aW9uIFNjaGVkdWxlcgorCitGSVhNRTogVG8gYmUgd3JpdHRlbi4KKworCitAc2VjdGlvbiBIaW50cyBmb3IgY29tbW9uIEV4dGVuc2lvbnMKKworVGhpcyBzZWN0aW9uIGxpc3RzIHNvbWUgY29tbW9uIGV4dGVuc2lvbnMgdG8gdGhlIEMgbGFuZ3VhZ2Ugd2hpY2ggYXJlCitvZnRlbiB2ZXJ5IGhlbHBmdWwgd2hlbiB1c2luZyBhIGNvbXBpbGVyIGluIHByYWN0aWNlLiBEZXBlbmRpbmcgb24gdGhlCitraW5kIG9mIHRhcmdldCBzeXN0ZW0gdGhleSBtYXkgcmFuZ2UgZnJvbSBub2JvZHktcmVhbGx5LWNhcmVzIHRvCithYnNvbHV0ZWx5IGVzc2VudGlhbC4gRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBhYmlsaXR5IHRvIHNwZWNpZnkgdGhlIHNlY3Rpb24KK3dpdGhpbiBhbiBvYmplY3QgZmlsZSBhIHZhcmlhYmxlIG9yIGZ1bmN0aW9uIHNob3VsZCBiZSBwbGFjZWQgaW4uIFRoaXMgaXMKK3JhcmVseSBvZiBhbnkgaW50ZXJlc3Qgd2hlbiB0YXJnZXRpbmcgYSBVbml4LWxpa2Ugb3BlcmF0aW5nIHN5c3RlbS4gT24KK2Egc3RhbmQtYWxvbmUgZW1iZWRkZWQgc3lzdGVtLCBob3dldmVyLCBpdCBtYXkgYmUgYWJzb2x1dGVseSBuZWNlc3NhcnkuCisKK1RoZXJlZm9yZSwgY29uc2lkZXIgdGhpcyBsaXN0IGFzIGEgcmVjb21tZW5kYXRpb24gb2YgaWRlYXMgdGhhdCBtaWdodAorYmUgaGVscGZ1bC4KKworQHN1YnNlY3Rpb24gSW5saW5lIEFzc2VtYmx5CisKK1RoZSBwb3NzaWJpbGl0eSB0byBpbnNlcnQgYXNzZW1ibHkgY29kZSBpbnRvIEMgc291cmNlIGlzIHZlcnkgaGFuZHkgaW4KK21hbnkgY2FzZXMuIEl0IGNhbiBiZSB1c2VkIGluIGhlYWRlcnMgdG8gaW1wbGVtZW50IHNwZWNpYWxseSBvcHRpbWl6ZWQKK3ZlcnNpb25zIG9mIHRpbWUtY3JpdGljYWwgbGlicmFyeSByb3V0aW5lcyBvciBlbmFibGUgYWNjZXNzIHRvIENQVQorZmVhdHVyZXMgd2hpY2ggYXJlIG5vdCBvdGhlcndpc2UgYWNjZXNzaWJsZSBieSBub3JtYWwgQyBjb25zdHJ1Y3RzLgorCitJbiBnZW5lcmFsLCBhbG1vc3QgYWxsIHdvcmsgaXMgZG9uZSBieSB0aGUgZnJvbnRlbmQgYW5kIG9ubHkgYSBmZXcgbGluZXMKK2hhdmUgdG8gYmUgaW5zZXJ0ZWQgaW4gdGhlIGJhY2tlbmQgdG8gbWFrZSBpdCB3b3JrLiBUaGVyZWZvcmUsIGl0IGlzCityZWNvbW1lbmRlZCB0byBhbHdheXMgc3VwcG9ydCB0aGlzIGltcG9ydGFudCBmZWF0dXJlLgorCitFdmVyeXRoaW5nIHRoYXQgaGFzIHRvIGJlIGRvbmUgaXMgdG8gY2hlY2sgYSBjZXJ0YWluIGNvbmRpdGlvbiB3aGVuIGNvZGUgZm9yCithIEBjb2Rle0NBTEx9IElDIGlzIGdlbmVyYXRlZC4gSW5zdGVhZCBvZiBlbWl0dGluZyBhIG5vcm1hbCBjYWxsIGluc3RydWN0aW9uLAorY2FsbCB0aGUgQGNvZGV7ZW1pdF9pbmxpbmVfYXNtKCl9IGZ1bmN0aW9uOgorQGV4YW1wbGUKK2lmKChwLT5xMS5mbGFncyAmIChWQVJ8RFJFRk9CSikpID09IFZBUiAmJgorICAgIHAtPnExLnYtPmZpICYmCisgICAgcC0+cTEudi0+ZmktPmlubGluZV9hc20pQHsKKyAgICAgICAgZW1pdF9pbmxpbmVfYXNtKGYscC0+cTEudi0+ZmktPmlubGluZV9hc20pOworICAgIEB9ZWxzZUB7CisgICAgICAgIGVtaXQoZiwiXHRjYWxsXHQiKTsKKyAgICAgICAgZW1pdF9vYmooZiwmcC0+cTEsdCk7CisgICAgICAgIGVtaXQoZiwiXG4iKTsKKyAgICBAfQorQGVuZCBleGFtcGxlCitOb3RlIHRoYXQgYXJndW1lbnQtcGFzc2luZywgYWRqdXN0aW5nIHRoZSBzdGFjayBhZnRlciBhIEBjb2Rle0NBTEx9IElDIGV0Yy4KK2lzIG5vdCBhZmZlY3RlZC4gT25seSB0aGUgYWN0dWFsIGVtaXR0aW5nIG9mIGNhbGwgY29kZSBpcyBjaGFuZ2VkIGluIHRoZQorY2FzZSBvZiBpbmxpbmUgYXNzZW1ibHkuCisKK0BzdWJzZWN0aW9uIC1zcGVlZC8tc2l6ZQorCitPZnRlbiBpdCBpcyBkZXNpcmVkIHRvIGdlbmVyYXRlIGNvZGUgd2hpY2ggcnVucyBhcyBmYXN0IGFzIHBvc3NpYmxlCitidXQgc29tZXRpbWVzIHNtYWxsIGNvZGUgaXMgbmVlZGVkLiBUaGUgY29tbWFuZCBsaW5lIG9wdGlvbnMKK0BvcHRpb257LXNwZWVkfSBhbmQgQG9wdGlvbnstc2l6ZX0gYXJlIHByb3ZpZGVkIGZvciB0aGUgdXNlciB0byBzcGVjaWZ5CitoaXMgaW50ZW50aW9uLgorCitUaGVzZSBvcHRpb25zIGFscmVhZHkgbWF5IGNoYW5nZSB0aGUgaW50ZXJtZWRpYXRlIGNvZGUgcHJvZHVjZWQgYnkgdGhlCitmcm9udGVuZCwgYnV0IHRoZSBiYWNrZW5kIHNob3VsZCBhbHNvIHJlc3BlY3QgdGhlc2Ugc3dpdGNoZXMsIGlmIHBvc3NpYmxlLgorVGhlIHZhcmlhYmxlcyBAY29kZXtvcHRzcGVlZH0gYW5kIEBjb2Rle29wdHNpemV9IGNhbiBiZSBxdWVyaWVkIHRvIHNlZQoraWYgdGhlc2Ugb3B0aW9ucyB3ZXJlIHNwZWNpZmllZC4KKworSWYgZS5nLiBAY29kZXtvcHRzcGVlZH0gd2FzIHNwZWNpZmllZCwgdGhlIGJhY2tlbmQgc2hvdWxkIGNob29zZSBmYXN0ZXIKK2NvZGUtc2VxdWVuY2VzLCBldmVuIGlmIGNvZGUtc2l6ZSBpcyBpbmNyZWFzZWQgc2lnbmlmaWNhbnRseS4gVmljZS12ZXJzYSwKK2lmIEBjb2Rle29wdHNpemV9IGlzIHNwZWNpZmllZCwgaXQgc2hvdWxkIGFsd2F5cyBjaG9vc2UgdGhlIHNob3J0ZXIgY29kZQoraWYgdGhlcmUgaXMgYSB0cmFkZS1vZmYgYmV0d2VlbiBzaXplIGFuZCBzcGVlZC4KKworVHlwaWNhbCBjYXNlcyBmb3Igc3VjaCB0cmFkZW9mZnMgYXJlIGZvciBleGFtcGxlLCBibG9jay1jb3B5IChAY29kZXtBU1NJR059CithbmQgQGNvZGV7UFVTSH0pIElDcy4gT2Z0ZW4gaXQgaXMgcG9zc2libGUgdG8gY2FsbCBhIGxpYnJhcnkgZnVuY3Rpb24gb3IKK2dlbmVyYXRlIGEgc2ltcGxlIHNob3J0IGxvb3AgZm9yIHNtYWxsIGNvZGUsIGJ1dCBhbiB1bnJvbGxlZCBpbmxpbmVkIGxvb3AKK2ZvciBmYXN0IGNvZGUuCisKK0Bub2RlIHRhcmdldG1hY3JvcworQHN1YnNlY3Rpb24gVGFyZ2V0LXNwZWNpZmljIE1hY3JvcworCitBIGJhY2tlbmQgaXMgYWJsZSB0byBwcm92aWRlIG1hY3JvIGRlZmluaXRpb25zIHdoaWNoIGFyZSBhdXRvbWF0aWNhbGx5CithY3RpdmUuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGRlZmluZSBtYWNyb3Mgd2hpY2ggYWxsb3cgYXBwbGljYXRpb25zIHRvCitxdWVyeSB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBhbmQgdGhlIHNlbGVjdGVkIGNoaXAgKGlmIHBvc3NpYmxlKS4KK0Fsc28sIGl0IGlzIHJlY29tbWVuZGVkIHRvIHByb3ZpZGUgaW50ZXJuYWwgbWFjcm9zIGZvciBiYWNrZW5kIHNwZWNpZmljCithdHRyaWJ1dGVzIHVzaW5nIHRoZSBAY29kZXtfX2F0dHIoKX0gYW5kIEBjb2Rle19fdmF0dHIoKX0gYXR0cmlidXRlcy4KKworVGhlIGRlZmluaXRpb24gb2YgdGhlc2UgbWFjcm9zIGNhbiBiZSBkb25lIGluIEBjb2Rle2luaXRfY2coKX0gKHRoZQorcmVzdWx0cyBvZiBjb21tYW5kIGxpbmUgcGFyc2luZyBhcmUgYXZhaWxhYmxlIGF0IHRoaXMgcG9pbnQpLiBUaGVyZSBpcworYSB2YXJpYWJsZQorQGV4YW1wbGUKK2NoYXIgKip0YXJnZXRfbWFjcm9zOworQGVuZCBleGFtcGxlCit3aGljaCBjYW4gYmUgc2V0IHRvIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHN0cmluZ3Mgd2hpY2ggY29udGFpbiB0aGUKK21hY3JvIGRlZmluaXRpb25zLiBUaGUgYXJyYXkgaGFzIHRvIGJlIHRlcm1pbmF0ZWQgYnkgYSBudWxsIHBvaW50ZXIgYW5kCit0aGUgc3ludGF4IG9mIHRoZSBtYWNybyBkZWZpbml0aW9ucyBpcyBzaW1pbGFyIHRvIHRoZSBjb21tYW5kIGxpbmUKK29wdGlvbiBAb3B0aW9uey1EfToKK0BleGFtcGxlCitzdGF0aWMgY2hhciAqbWFycmF5W10gPSBAeworICAiX19UQVJHRVRfQVJDSF9fIiwKKyAgIl9fc2VjdGlvbih4KT1fX3ZhdHRyKFwic2VjdGlvbihcIiN4XCIpXCIpIiwKKyAgMAorQH07CisuLi4KK3RhcmdldF9tYWNyb3MgPSBtYXJyYXk7CitAZW5kIGV4YW1wbGUKKworQHN1YnNlY3Rpb24gc3RkYXJnLmgKKworRklYTUU6IFRvIGJlIHdyaXR0ZW4uCisKKworQHN1YnNlY3Rpb24gU2VjdGlvbiBTcGVjaWZpZXJzCisKK0VzcGVjaWFsbHkgZm9yIGVtYmVkZGVkIHN5c3RlbXMgaXQgY2FuIGJlIHZlcnkgaW1wb3J0YW50IHRvIGJlIGFibGUgdG8KK3BsYWNlIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGluIHNwZWNpZmljIHNlY3Rpb24gdG8gb3ZlcnJpZGUgZGVmYXVsdAorcGxhY2VtZW50LiBUaGlzIGNhbiByZWxhdGl2ZWx5IGVhc2lseSBiZSBkb25lIHVzaW5nIHZhcmlhYmxlIGF0dHJpYnV0ZXMKKyhAcHhyZWZ7dGFyZ2V0YXR0cmlidXRlc30pLgorCisKK0Bub2RlIHRhcmdldGF0dHJpYnV0ZXMKK0BzdWJzZWN0aW9uIFRhcmdldC1zcGVjaWZpYyBBdHRyaWJ1dGVzCisKK1RoZXJlIGFyZSB0d28gd2F5cyBvZiBhZGRpbmcgdGFyZ2V0LXNwZWNpZmljIGF0dHJpYnV0ZXMgdG8gdmFyaWFibGVzIGFuZAorZnVuY3Rpb25zLiBBIGdlbmVyYWwgd2F5IGlzIHRoZSB1c2Ugb2YgQGNvZGV7X192YXR0cigpfSB3aGljaCB3aWxsIGFkZAordGhlIHN0cmluZyBhcmd1bWVudCB0byB0aGUgQGNvZGV7dmF0dHJ9IG1lbWJlciBvZiB0aGUgY29ycmVzcG9uZGluZworQGNvZGV7c3RydWN0IFZhcn0sIHNlcGFyYXRpbmcgaXQgYnkgYSBzZW1pLWNvbG9uLiBUaGUgYmFja2VuZCBjYW4gdXNlCit0aGlzIGluZm9ybWF0aW9uIGJ5IHBhcnNpbmcgdGhlIHN0cmluZy4gVGhlIGZyb250ZW5kIHdpbGwganVzdCBidWlsZAordGhlIHN0cmluZywgaXQgd2lsbCBub3QgaW50ZXJwcmV0IGl0LiBJZiBhIGJhY2tlbmQgb2ZmZXJzIGF0dHJpYnV0ZXMKK3VzaW5nIHRoZSBAY29kZXtfX3ZhdHRyKCl9IG1lY2hhbmlzbSwgaXQgaXMgcmVjb21tZW5kZWQgdG8gcHJvdmlkZQordGFyZ2V0LXNwZWNpZmljIG1hY3JvcyAoQHB4cmVme3RhcmdldG1hY3Jvc30pIHdoaWNoIGV4cGFuZCB0byB0aGUKK2FwcHJvcHJpYXRlIEBjb2Rle19fdmF0dHIoKX0tc3ludGF4LiBPbmx5IHRoZXNlIG1hY3JvcyBzaG91bGQgYmUKK2RvY3VtZW50ZWQuCisKK0Egc2Vjb25kIHdheSB0byBzcGVjaWZ5IGF0dHJpYnV0ZXMgaXMgZW5hYmxlZCBieSBhZGRpbmcKK0BleGFtcGxlCisjZGVmaW5lIEhBVkVfVEFSR0VUX1BSQUdNQVMgMQorQGVuZCBleGFtcGxlCit0byBAZmlsZXttYWNoaW5lLmh9IGFuZCBhZGRpbmcgYW4gYXJyYXkKK0BleGFtcGxlCitjaGFyICpnX2F0dHJfbmFtZVtdOworQGVuZCBleGFtcGxlCit0byBAZmlsZXttYWNoaW5lLmN9LiBUaGlzIGFycmF5IHNob3VsZCBwb2ludCB0byB0aGUgc3RyaW5ncyB1c2VkCitmb3IgdGhlIGF0dHJpYnV0ZXMsIHRlcm1pbmF0ZWQgYnkgYSBudWxsLXBvaW50ZXIsIGUuZy46CitAZXhhbXBsZQorY2hhciAqZ19hdHRyX25hbWVbXSA9IEB7CisgICJfX2ZhciIsCisgICJfX25lYXIiLAorICAiX19pbnRlcnJ1cHQiLAorICAwCitAfTsKK0BlbmQgZXhhbXBsZQorVGhlc2UgYXR0cmlidXRlcyBjYW4gYmUgcXVlcmllZCBpbiB0aGUgbWVtYmVyCitAZXhhbXBsZQordW5zaWduZWQgbG9uZyB0YXR0cjsKK0BlbmQgZXhhbXBsZQorb2YgYSBAY29kZXtzdHJ1Y3QgVmFyfS4gVGhlIGZpcnN0IGF0dHJpYnV0ZSBpcyByZXByZXNlbnRlZCBieSBiaXQgMSwgdGhlCitzZWNvbmQgYnkgYml0IDIgYW5kIHNvIG9uLiBVc2luZyB0aGlzIG1lY2hhbmlzbSwgdGhlIGZyb250ZW5kIHdpbGwgY2hlY2sgZm9yCityZWRlY2xhcmF0aW9ucyB3aXRoIGRpZmZlcmVudCBzZXR0aW5nIG9mIGF0dHJpYnV0ZXMgb3IgbXVsdGlwbGUgc3BlY2lmaWNhdGlvbgorb2YgYXR0cmlidXRlcy4gSG93ZXZlciwgb25seSBib29sZWFuIGF0dHJpYnV0ZXMgYXJlIHBvc3NpYmxlLiBJZiBwYXJhbWV0ZXJzCitoYXZlIHRvIGJlIHNwZWNpZmllZCwgdGhlIEBjb2Rle19fdmF0dHIoKX0tbWVjaGFuaXNtIGhhcyB0byBiZSB1c2VkLgorCitAbm9kZSB0YXJnZXRwcmFnbWFzCitAc3Vic2VjdGlvbiBUYXJnZXQtc3BlY2lmaWMgQGNvZGV7I3ByYWdtYX1zCisKK0ZJWE1FOiBUbyBiZSB3cml0dGVuLgorCitAbm9kZSBleHR0eXBlcworQHN1YnNlY3Rpb24gVGFyZ2V0LXNwZWNpZmljIGV4dGVuZGVkIFR5cGVzCisKK0ZJWE1FOiBUbyBiZSB3cml0dGVuLgorCitAbm9kZSB0Z3RwcmludHZhbAorQHN1YnNlY3Rpb24gVGFyZ2V0LXNwZWNpZmljIEBjb2Rle3ByaW50dmFsfQorCitGSVhNRTogVG8gYmUgd3JpdHRlbi4KKworQG5vZGUgZGVidWdpbmZvCitAc3Vic2VjdGlvbiBEZWJ1ZyBJbmZvcm1hdGlvbgorCitEZWJ1ZyBpbmZvcm1hdGlvbiB3aGljaCBlbmFibGVzIChzb3VyY2UgbGV2ZWwpIGRlYnVnZ2luZyBvZiBjb21waWxlZAorcHJvZ3JhbXMgaXMgYW4gaW1wb3J0YW50IGZlYXR1cmUgdG8gaW1wcm92ZSB0aGUgdXNlci1mcmllbmRsaW5lc3Mgb2YgYQorY29tcGlsZXIuIERlcGVuZGluZyBvbiB0aGUgb2JqZWN0IGZvcm1hdCBhbmQgZGVidWdnZXIgdXNlZCwgdGhlIGZvcm1hdAorYW5kIGNhcGFiaWxpdGllcyBvZiBkZWJ1ZyBpbmZvcm1hdGlvbiBjYW4gdmFyeSB3aWRlbHkuIFRoZXJlZm9yZSwgaXQgaXMKK3RoZSByZXNwb25zaWJpbGl0eSBvZiBlYWNoIGJhY2tlbmQgdG8gZ2VuZXJhdGUgZGVidWcgaW5mb3JtYXRpb24uIEhvd2V2ZXIsCitmb3IgY29tbW9uIGRlYnVnIHN0YW5kYXJkcyB0aGVyZSB3aWxsIGJlIG1vZHVsZXMgd2hpY2ggY2FuIGJlIHVzZWQgYnkKK3RoZSBiYWNrZW5kcyBhbmQgd2lsbCBkbyBtb3N0IG9mIHRoZSB3b3JrLiBDdXJyZW50bHkgdGhlcmUgaXMgb25lIHN1Y2gKK21vZHVsZSBmb3IgdGhlIERXQVJGMiBkZWJ1ZyBzdGFuZGFyZC4KKworVGhlIGNvbXBpbGVyIGZyb250ZW5kIHByb3ZpZGVzIGEgdmFyaWFibGUgQGNvZGV7ZGVidWdfaW5mb30gd2hpY2ggY2FuCitiZSBxdWVyaWVkIHRvIHRlc3Qgd2hldGhlciBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBkZXNpcmVkLiBBbHNvLCB0aGUKK2Z1bmN0aW9ucyBAY29kZXtpbml0X2RiKCl9IGFuZCBAY29kZXtjbGVhbnVwX2RiKCl9IGFyZSBoZWxwZnVsLgorCitFYWNoIEBjb2Rle3N0cnVjdCBWYXJ9IGNvbnRhaW5zIHRoZSBtZW1iZXJzIEBjb2Rle2NoYXIgKmRmaWxlbmFtZX0gYW5kCitAY29kZXtpbnQgZGxpbmV9IHdoaWNoIHNwZWNpZnkgdGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIG9mIHRoZSB2YXJpYWJsZSdzCitkZWZpbml0aW9uLiBBbHNvLCBldmVyeSBJQyBjb250YWlucyB0aGUgbWVtYmVycyBAY29kZXtjaGFyICpmaWxlfSBhbmQKK0Bjb2Rle2ludCBsaW5lfSB3aXRoIHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIHRoaXMgSUMgYmVsb25ncyB0by4gTm90ZQoraG93ZXZlciwgdGhhdCB0aGVyZSBtYXkgYmUgSUNzIHdpdGggQGNvZGV7ZmlsZSA9PSAwfSAtIG5vdCBhbGwgSUNzIGNhbgorYmUgYXNzaWduZWQgYSBjZXJ0YWluIGNvZGUgbG9jYXRpb24uIEFsc28sIElDcyBkbyBub3QgYWx3YXlzIGhhdmUgaW5jcmVhc2luZworbGluZSBudW1iZXJzIGFuZCBsaW5lIG51bWJlcnMgbWF5IHJlcGVhdC4gTm90IGFsbCBkZWJ1Z2dlcnMgbWF5IGJlIGFibGUKK3RvIGRlYWwgd2l0aCB0aGlzLgorCitAc3Vic3Vic2VjdGlvbiBEV0FSRjIKKworVGhlcmUgaXMgc3VwcG9ydCBmb3IgdGhlIERXQVJGMiBkZWJ1ZyBzdGFuZGFyZCB3aGljaCBjYW4gYmUgYWRkZWQgdG8gYSBiYWNrZW5kCityYXRoZXIgZWFzaWx5LiBUaGUgZm9sbG93aW5nIGFkZGl0aW9ucyBhcmUgbmVjZXNzYXJ5OgorCitAZW51bWVyYXRlCitAaXRlbSBBZGQgdGhlIGxpbmUKK0BleGFtcGxlCisjaW5jbHVkZSAiZHdhcmYyLmMiCitAZW5kIGV4YW1wbGUKK3RvIEBmaWxle21hY2hpbmUuY30uCitAaXRlbSBBZGQgdGhlIGZvbGxvd2luZyBsaW5lcyB0byBAY29kZXtpbml0X2RiKCl9OgorQGV4YW1wbGUKK2R3YXJmMl9zZXR1cChzaXpldGFiW1BPSU5URVJdLAorICAgICAgICAgICAgICIuYnl0ZSIsCisgICAgICAgICAgICAgIi4yYnl0ZSIsCisgICAgICAgICAgICAgIi40Ynl0ZSIsCisgICAgICAgICAgICAgIi40Ynl0ZSIsCisgICAgICAgICAgICAgbGFicHJlZml4LAorICAgICAgICAgICAgIGlkcHJlZml4LAorICAgICAgICAgICAgICIuc2VjdGlvbiIpOworZHdhcmYyX3ByaW50X2NvbXBfdW5pdF9oZWFkZXIoZik7CitAZW5kIGV4YW1wbGUKK1RoZSBhcmd1bWVudHMgdG8gQGNvZGV7ZHdhcmYyX3NldHVwKCl9IGhhdmUgdGhlIGZvbGxvd2luZyBtZWFuaW5nczoKK0BlbnVtZXJhdGUKK0BpdGVtIFRoZSBzaXplIG9mIGFuIGFkZHJlc3Mgb24gdGhlIHRhcmdldC4KK0BpdGVtIEFuIGFzc2VtYmxlciBkaXJlY3RpdmUgdG8gY3JlYXRlIG9uZSBieXRlIG9mIGluaXRpYWxpemVkIHN0b3JhZ2UuCitAaXRlbSBBbiBhc3NlbWJsZXIgZGlyZWN0aXZlIHRvIGNyZWF0ZSB0d28gYnl0ZXMgb2YgaW5pdGlhbGl6ZWQgc3RvcmFnZQorICAgICAgKHdpdGhvdXQgYW55IHBhZGRpbmcgZm9yIGFsaWdubWVudCkuCitAaXRlbSBBbiBhc3NlbWJsZXIgZGlyZWN0aXZlIHRvIGNyZWF0ZSBmb3VyIGJ5dGVzIG9mIGluaXRpYWxpemVkIHN0b3JhZ2UKKyAgICAgICh3aXRob3V0IGFueSBwYWRkaW5nIGZvciBhbGlnbm1lbnQpLgorQGl0ZW0gQW4gYXNzZW1ibGVyIGRpcmVjdGl2ZSB0byBjcmVhdGUgaW5pdGlhbGl6ZWQgc3RvcmFnZSByZXByZXNlbnRpbmcKKyAgICAgIGEgdGFyZ2V0IGFkZHJlc3MgKHdpdGhvdXQgYW55IHBhZGRpbmcgZm9yIGFsaWdubWVudCkuCitAaXRlbSBBIHByZWZpeCB3aGljaCBpcyB1c2VkIGZvciBlbWl0dGluZyBudW1iZXJlZCBsYWJlbHMgKG9yIGVtcHR5IHN0cmluZykuCitAaXRlbSBBIHByZWZpeCB3aGljaCBpcyB1c2VkIGZvciBlbWl0dGluZyBleHRlcm5hbCBpZGVudGlmaWVycworICAgICAgKG9yIGVtcHR5IHN0cmluZykuCitAaXRlbSBBbiBhc3NlbWJsZXIgZGlyZWN0aXZlIHRvIHN3aXRjaCB0byBhIG5ldyBuYW1lZCBzZWN0aW9uLgorQGVuZCBlbnVtZXJhdGUKK0BpdGVtIEFkZCB0aGUgbGluZQorQGV4YW1wbGUKK2R3YXJmMl9jbGVhbnVwKGYpOworQGVuZCBleGFtcGxlCit0byBAY29kZXtjbGVhbnVwX2RiKCl9LgorQGl0ZW0gV3JpdGUgdGhlIGZ1bmN0aW9uCitAZXhhbXBsZQorc3RhdGljIGludCBkd2FyZjJfcmVnbnVtYmVyKGludCByKTsKK0BlbmQgZXhhbXBsZQord2hpY2gKKyAgICAgIHJldHVybnMgdGhlIERXQVJGMiByZWdudW1iZXIgZm9yIGEgQGNvbW1hbmR7dmJjY30gcmVnaXN0ZXIgbnVtYmVyLgorQGl0ZW0gV3JpdGUgdGhlIGZ1bmN0aW9uCitAZXhhbXBsZQorc3RhdGljIHptYXggZHdhcmYyX2Zib2Zmc2V0KHN0cnVjdCBWYXIgKnYpOworQGVuZCBleGFtcGxlCisgICAgICB3aGljaCByZXR1cm5zIHRoZSBvZmZzZXQgb2YgdmFyaWFibGUgQGNvZGV7dn0gZnJvbSB0aGUgRFdBUkYyCisgICAgICBmcmFtZS1wb2ludGVyLgorQGl0ZW0gV3JpdGUgdGhlIGZ1bmN0aW9uCitAZXhhbXBsZQorc3RhdGljIHZvaWQgZHdhcmYyX3ByaW50X2ZyYW1lX2xvY2F0aW9uKEZJTEUgKmYsc3RydWN0IFZhciAqdik7CitAZW5kIGV4YW1wbGUKK3doaWNoIHByaW50cyBhIERXQVJGMiBsb2NhdGlvbiBvZiB0aGUgZnJhbWUgcG9pbnRlci4gSXQgY2FuIHVzZSB0aGUKK2Z1bmN0aW9uCitAZXhhbXBsZQordm9pZCBkd2FyZjJfcHJpbnRfbG9jYXRpb24oRklMRSAqZixzdHJ1Y3Qgb2JqICpvKTsKK0BlbmQgZXhhbXBsZQordG8gb3V0cHV0IHRoZSBsb2NhdGlvbi4gRm9yIGV4YW1wbGUsIGlmIHRoZSBmcmFtZSBwb2ludGVyIGlzIGEgc2ltcGxlCityZWdpc3RlciwgaXQgbWlnaHQgbG9vayBsaWtlIHRoaXM6CitAZXhhbXBsZQorc3RhdGljIHZvaWQgZHdhcmYyX3ByaW50X2ZyYW1lX2xvY2F0aW9uKEZJTEUgKmYsc3RydWN0IFZhciAqdikKK0B7CisgIHN0cnVjdCBvYmogbzsKKyAgby5mbGFncz1SRUc7CisgIG8ucmVnPWZyYW1lX3BvaW50ZXJfcmVnaXN0ZXI7CisgIG8udmFsLnZtYXg9bDJ6bSgwTCk7CisgIG8udj0wOworICBkd2FyZjJfcHJpbnRfbG9jYXRpb24oZiwmbyk7CitAfQorQGVuZCBleGFtcGxlCitAaXRlbSBCZWZvcmUgZW1pdHRpbmcgY29kZSBmb3IgYW4gSUMgQGNvZGV7cH0sIGV4ZWN1dGUgdGhlIGNvZGUKK0BleGFtcGxlCitpZihkZWJ1Z19pbmZvKQorICBkd2FyZjJfbGluZV9pbmZvKGYscCk7CitAZW5kIGV4YW1wbGUKK0BpdGVtIEFmdGVyIGVtaXR0aW5nIGNvZGUgZm9yIGEgZnVuY3Rpb24gQGNvZGV7dn0sIGEgbmV3IG51bWJlcmVkIGxhYmVsCisgICAgICBoYXMgdG8gYmUgZW1pdHRlZCBhZnRlciB0aGUgZnVuY3Rpb24gY29kZSBhbmQgdGhlIGZ1bmN0aW9uCitAZXhhbXBsZQordm9pZCBkd2FyZjJfZnVuY3Rpb24oRklMRSAqZixzdHJ1Y3QgVmFyICp2LGludCBlbmRsYWJlbCk7CitAZW5kIGV4YW1wbGUKK211c3QgYmUgY2FsbGVkLgorCitAZW5kIGVudW1lcmF0ZQorCitOb3RlIHRoYXQgdGhlIERXQVJGMiBzdGFuZGFyZCBzdXBwb3J0cyB1c2Ugb2YgbG9jYXRpb24gbGlzdHMgd2hpY2ggY2FuIGJlCit1c2VkIHRvIGRlc2NyaWJlIGEgdmFyaWFibGUgd2hvc2UgbG9jYXRpb24gY2hhbmdlcyBkdXJpbmcgdGhlIHByb2dyYW0gKGUuZy4KK2luIGEgcmVnaXN0ZXIgZm9yIHNvbWUgdGltZSwgdGhlbiBpbiBtZW1vcnkgYW5kIGFnYWluIGluIGEgcmVnaXN0ZXIpIGFzIHdlbGwKK2FzIGEgbW92aW5nIGZyYW1lIHBvaW50ZXIgKHZlcnkgdXNlZnVsIGlmIG5vIHNlcGFyYXRlIGZyYW1lIHBvaW50ZXIgaXMgdXNlZAorYnV0IGFsbCBsb2NhbCB2YXJpYWJsZXMgYXJlIGFjY2Vzc2VkIHRocm91Z2ggYSBtb3Zpbmcgc3RhY2sgcG9pbnRlcikuCitVbmZvcnR1bmF0ZWx5LCBub25lIG9mIHRoZSBkZWJ1Z2dlcnMgSSBoYXZlIHRyaWVkIHNvIGZhciBjb3VsZCBoYW5kbGUgdGhlc2UKK2xvY2F0aW9uIGxpc3RzLiBUaGVyZWZvcmUsIHRoZSBjdXJyZW50IERXQVJGMiBtb2R1bGUgZG9lcyBub3Qgb3V0cHV0Citsb2NhdGlvbiBsaXN0cywgYnV0IGZ1dHVyZSB2ZXJzaW9uIHdpbGwgcHJvYmFibHkgb2ZmZXIgdGhlbSBhcyBhbiBvcHRpb24uCisKK1dpdGhvdXQgbG9jYXRpb24gbGlzdHMsIGFjY2Vzc2luZyBsb2NhbCB2YXJpYWJsZXMgd2lsbCBvbmx5IHdvcmsgd2l0aAorYSBmaXhlZCBmcmFtZSBwb2ludGVyIGFuZCBubyByZWdpc3RlciB2YXJpYWJsZXMuIEV2ZW4gd2l0aCB0aGVzZSByZXN0cmljdGlvbnMsCitmdW5jdGlvbiBwYXJhbWV0ZXJzIHdoaWNoIGFyZSBwYXNzZWQgaW4gcmVnaXN0ZXJzIHdpbGwgbm90IGJlIGNvcnJlY3RseQorZGlzcGxheWVkIGR1cmluZyB0aGUgZnVuY3Rpb24gZW50cnkgY29kZS4KKworQHN1YnNlY3Rpb24gSW50ZXJydXB0IEhhbmRsZXJzCisKK0VzcGVjaWFsbHkgZm9yIGVtYmVkZGVkIHN5c3RlbXMsIHN1cHBvcnQgZm9yIHdyaXRpbmcgaW50ZXJydXB0IGhhbmRsZXJzIGluCitDIGlzIGEgY29tbW9uIGZlYXR1cmUuIFZhcmlhYmxlIGF0dHJpYnV0ZXMgKEBweHJlZnt0YXJnZXRhdHRyaWJ1dGVzfSkgY2FuCitiZSB1c2VkIHRvIG1hcmsgZnVuY3Rpb25zIHdoaWNoIGFyZSB1c2VkIGFzIGludGVycnVwdCBoYW5kbGVycy4KKworVHlwaWNhbCBjaGFuZ2VzIHdoaWNoIG1pZ2h0IGJlIG5lY2Vzc2FyeSBmb3IgaW50ZXJydXB0IGhhbmRsZXJzIGFyZToKK0BpdGVtaXplIEBtaW51cworQGl0ZW0gVXNpbmcgYSBkaWZmZXJlbnQgcmV0dXJuIGluc3RydWN0aW9uLgorQGl0ZW0gU2F2aW5nIGFsbCBtb2RpZmllZCByZWdpc3RlcnMsIGluY2x1ZGluZyBzY3JhdGNoLXJlZ2lzdGVycy4KK0BpdGVtIENyZWF0aW5nIGFuIGVudHJ5IGluIHRoZSBpbnRlcnJ1cHQgdmVjdG9yIHRhYmxlLgorQGVuZCBpdGVtaXplCisKKworQHN1YnNlY3Rpb24gU3RhY2sgY2hlY2tpbmcKKworRHluYW1pYyBjaGVja2luZyBvZiB0aGUgc3RhY2sgdXNlZCAob3IgcG9zc2libHkgZXh0ZW5kaW5nIHRoZSBzdGFjayBzaXplCitpZiBwb3NzaWJsZSkgaXMgYW5vdGhlciB1c2VmdWwgZmVhdHVyZS4gSWYgdGhlIHZhcmlhYmxlIEBjb2Rle3N0YWNrX2NoZWNrfQoraXMgc2V0LCBzdGFjay1jaGVja2luZyBjb2RlIHNob3VsZCBiZSBlbWl0dGVkLCBpZiBwb3NzaWJsZS4gRXZlcnkgZnVuY3Rpb24KK3Nob3VsZCBjYWxsIGEgbGlicmFyeSBmdW5jdGlvbiAodXN1YWxseSBjYWxsZWQgQGNvZGV7X19zdGFja19jaGVja30pIGFuZAorcGFzcyB0aGUgbWF4aW11bSBzaXplIG9mIHN0YWNrIHVzZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBhcmd1bWVudC4gVGhpcworb2J2aW91c2x5IGhhcyB0byBiZSBkb25lIGJlZm9yZSBhbGxvY2F0aW5nIHRoZSBzdGFjay1mcmFtZS4KKworVGhlIGxpYnJhcnkgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgdG8gdGFrZSBpbnRvIGFjY291bnQgaXRzIG93bgorc3RhY2stZnJhbWUuCisKK0BzdWJzZWN0aW9uIFByb2ZpbGluZworCitGSVhNRTogVG8gYmUgd3JpdHRlbi4KKworQG5vZGV7dmxhc30KK0BzdWJzZWN0aW9uIFZhcmlhYmxlLWxlbmd0aCBBcnJheXMKKworV2l0aCB0aGUgQGNvZGV7LWM5OX0gb3B0aW9uLCB2YmNjIHN1cHBvcnRzIHZhcmlhYmxlLWxlbmd0aCBhcnJheXMgdGhhdAorYXJlIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suIFRoZSBiYWNrZW5kIGhhcyB0byB0YWtlIHNldmVyYWwgc3RlcHMgdG8KK3N1cHBvcnQgdGhpczoKKworQHRhYmxlIEBjb2RlCitAaXRlbSB2bGFzCitXaGVuIHRoaXMgdmFyaWFibGUgaXMgbm9uLXplcm8sIHRoZSBjdXJyZW50IGZ1bmN0aW9uIHVzZXMgdmFyaWFibGUtbGVuZ3RoCithcnJheXMuIFRoZSBiYWNrZW5kIG1heSB0YWtlIG5lY2Vzc2FyeSBzdGVwcyB0byBzdXBwb3J0IHRoaXMuIEZvciBleGFtcGxlLAoraWYgbG9jYWwgdmFyaWFibGVzIGFyZSB1c3VhbGx5IGFkZHJlc3NlZCB2aWEgc3RhY2twb2ludGVyLCBzd2l0Y2hpbmcgdG8gYQorc2VwYXJhdGUgZnJhbWVwb2ludGVyIG1heSBiZSBuZWNlc3NhcnkuCisKK0BpdGVtIEFMTE9DVkxBX0lOTElORUFTTQorVGhpcyBkZWZpbmUgbXVzdCBjb250YWluIGlubGluZSBjb2RlIHRoYXQgaXMgY2FsbGVkIHdoZW4gYSB2bGEgaXMKK2FsbG9jYXRlZC4gSXQgaGFzIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIHJvb20gb24gdGhlIHN0YWNrIGFuZCByZXR1cm4gYQorcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXcgc3BhY2UuCisKK0BpdGVtIEFMTE9DVkxBX1JFRworVGhlIHJlZ2lzdGVyIGluIHdoaWNoIHRvIHBhc3MgdGhlIHNpemUgdG8gYmUgYWxsb2NhdGVkIG9uIHRoZSBzdGFjay4gMCB3aWxsCitwYXNzIG9uIHRoZSBzdGFjay4KKworQGl0ZW0gRlJFRVZMQV9JTkxJTkVBU00KK1RoaXMgZGVmaW5lIG11c3QgY29udGFpbiBpbmxpbmUgY29kZSB0aGF0IGlzIGNhbGxlZCB3aGVuIGEgdmxhIGlzCitmcmVlZC4gSXQgaGFzIHRvIHJlc3RvcmUgdGhlIG9sZCBzdGFjayBwb2ludGVyLgorCitAaXRlbSBGUkVFVkxBX1JFRworVGhlIHJlZ2lzdGVyIGluIHdoaWNoIHRvIHBhc3MgdGhlIG9sZCBzdGFjayBwb2ludGVyLiAwIHdpbGwKK3Bhc3Mgb24gdGhlIHN0YWNrLgorCitAaXRlbSBPTERTUFZMQV9JTkxJTkVBU00KK1RoaXMgZGVmaW5lIG11c3QgY29udGFpbiBpbmxpbmUgY29kZSB0aGF0IGlzIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IHZsYSBpcworYWxsb2NhdGVkLiBJdCBoYXMgdG8gcmV0dXJuIHRoZSBjdXJyZW50IHN0YWNrIHBvaW50ZXIgYmVmb3JlIGFueSB2bGEgaGFzCitiZWVuIGFsbG9jYXRlZC4KKworQGl0ZW0gRlBWTEFfUkVHCitBbiBhZGRpdGlvbmFsIHJlZ2lzdGVyIHVzZWQgaW4gZnVuY3Rpb25zIGNvbnRhaW5pbmcgdmxhcy4gVGhlIGJhY2tlbmQgY2FuCitzcGVjaWZ5IGEgcmVnaXN0ZXIgKHVzdWFsbHkgZnJhbWVwb2ludGVyKSB0aGF0IGNhbiBub3QgYmUgdXNlZCBpbiBmdW5jdGlvbnMKK3dpdGggdmxhcy4gVGhlcmVmb3JlLCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhpcyByZWdpc3RlciBpbiBvdGhlciBmdW5jdGlvbnMKKyhmb3IgZXhhbXBsZSwgaWYgbG9jYWwgdmFyaWFibGVzIGFyZSB1c3VhbGx5IGFkZHJlc3NlZCBkaXJlY3RseSB0aHJvdWdoIHRoZQorc3RhY2twb2ludGVyKS4KKworQGVuZCB0YWJsZQorCitAbm9kZXtsaWJjYWxsc30KK0BzdWJzZWN0aW9uIExpYnJhcnkgQ2FsbHMKKworU29tZXRpbWVzIG9wZXJhdGlvbnMgbWF5IGJlIHZlcnkgY29tcGxpY2F0ZWQgdG8gZ2VuZXJhdGUgY29kZSBmb3IgKGUuZy4KK2Zsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgZm9yIG1hY2hpbmVzIHdpdGhvdXQgRlBVLCBtdWx0aXBsaWNhdGlvbi9kaXZpc2lvbgorb24gc29tZSBhcmNoaXRlY3R1cmVzIG9yIGJpZyBkYXRhIHR5cGVzIGxpa2UgQGNvZGV7bG9uZyBsb25nfSkuIFRob3NlIGFyZQordXN1YWxseSBpbXBsZW1lbnRlZCBieSBjYWxsaW5nIGxpYnJhcnkgZnVuY3Rpb25zLgorCit2YmNjIGNhbiBiZSB0b2xkIHRvIGdlbmVyYXRlIGNhbGxzIHRvIGxpYnJhcnkgZnVuY3Rpb25zIGZvciBjZXJ0YWluIElDcy4gV2hlbgorZGVmaW5pbmcgQGNvZGV7SEFWRV9MSUJDQUxMU30sIHRoZSBiYWNrZW5kIG11c3QgcHJvdmlkZSB0aGUgZnVuY3Rpb24KK0Bjb2Rle2NoYXIgKnVzZV9saWJjYWxsKDxjb2RlPiw8dHlwZj4sPHR5cGYyPil9LiBUaGlzIGZ1bmN0aW9uIGdldHMKK2NhbGxlZCB3aXRoIHRoZSBlbGVtZW50cyBAY29kZXtjb2RlfSwgQGNvZGV7dHlwZn0gYW5kIEBjb2Rle3R5cGYyfSBvZiBhbiBJQy4KK0lmIEBjb2Rle3VzZV9saWJjYWxsfSByZXR1cm5zIGEgbmFtZSwgdGhpcyBsaWJyYXJ5IGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCitpbnN0ZWFkIG9mIHRoZSBJQy4gT3RoZXJ3aXNlLCAwIG11c3QgYmUgcmV0dXJuZWQuCisKK0FsbCBsaWJyYXJ5IGZ1bmN0aW9ucyBoYXZlIHRvIGJlIGRlY2xhcmVkIGluIEBjb2Rle2luaXRfY2coKX0gd2l0aAorQGNvZGV7ZGVjbGFyZV9idWlsdGluKCl9LCBzdXBwb3J0aW5nIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgorCitAdGFibGUgQGNvZGUKKworQGl0ZW0gbmFtZQorVGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgZnVuY3Rpb24uIFVzdWFsbHksIGEgcmVzZXJ2ZWQgaWRlbnRpZmllciBzaG91bGQgYmUKK2Nob3NlbiAoZS5nLiBzdGFydGluZyB3aXRoIEBjb2Rle19ffSkuCisKK0BpdGVtIHp0eXAKK1RoZSByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24gKG9ubHkgaW50ZWdyYWwgYW5kIGZsb2F0IHR5cGVzIGFyZSBzdXBwb3J0ZWQpLgorCitAaXRlbSBxMXR5cAorVGhlIHR5cGUgb2YgdGhlIGZpcnN0IHBhcmFtZXRlciAob25seSBpbnRlZ3JhbCBhbmQgZmxvYXQgdHlwZXMgYXJlIHN1cHBvcnRlZCkuCisKK0BpdGVtIHExcmVnCitUaGUgcmVnaXN0ZXIgdG8gcGFzcyB0aGUgZmlyc3QgYXJndW1lbnQgaW4gKDAgcGFzc2VzIHZpYSBzdGFjaykuCisKK0BpdGVtIHEydHlwCitUaGUgdHlwZSBvZiB0aGUgc2Vjb25kIHBhcmFtZXRlciAob25seSBpbnRlZ3JhbCBhbmQgZmxvYXQgdHlwZXMgYXJlIHN1cHBvcnRlZCkuCitGb3IgZnVuY3Rpb25zIHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyLCB1c2UgMC4KKworQGl0ZW0gcTJyZWcKK1RoZSByZWdpc3RlciB0byBwYXNzIHRoZSBzZWNvbmQgYXJndW1lbnQgaW4gKDAgcGFzc2VzIHZpYSBzdGFjaykuCisKK0BpdGVtIG5vc2lkZWZ4CitJZiB0aGlzIGlzIG5vbi16ZXJvLCB0aGUgZnVuY3Rpb24gd2lsbCBiZSBkZWNsYXJlZCB0byBoYXZlIG5vIHNpZGUtZWZmZWN0cworYW5kIGFsbG93IHNvbWUgbW9yZSBvcHRpbWl6YXRpb25zLgorCitAaXRlbSBpbmxpbmVfYXNtCitJbmxpbmUgYXNzZW1ibHkgY2FuIGJlIHNwZWNpZmllZCBmb3IgdGhlIGZ1bmN0aW9uLgorCitAZW5kIHRhYmxlCisKK05vdGUgdGhhdCBub3QgYWxsIElDcyBjYW4gYmUgY29udmVydGVkIHRvIGxpYnJhcnkgY2FsbHMuCisKKworQHNlY3Rpb24gQ2hhbmdlcyBmcm9tIDAuNyBJbnRlcmZhY2UKKworVGhlIGJhY2tlbmQgaW50ZXJmYWNlIGhhcyBjaGFuZ2VkIGluIHNldmVyYWwgd2F5cyBzaW5jZSBAY29tbWFuZHt2YmNjfSAwLjcuCitUaGUgZm9sbG93aW5nIGxpc3QgbWVudGlvbnMgbW9zdChhbGw/KSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBvbGQKK2FuZCBuZXcgaW50ZXJmYWNlcyAobm90IGluY2x1ZGluZyBuZXcgb3B0aW9uYWwgZmVhdHVyZXMgd2hpY2ggZG8gbm90IGhhdmUKK3RvIGJlIHVzZWQpOgorCitAaXRlbWl6ZSBAbWludXMKK0BpdGVtIFRoZXJlIGFyZSBtb3JlIHR5cGVzIChAY29kZXtMTE9ORywgTERPVUJMRSwgTUFYSU5UfSkuIFRoZXJlZm9yZQorICAgICAgdGhlIEBjb2Rle2FsaWduW119IGFuZCBAY29kZXtzaXpldGFiW119IGFycmF5cyBoYXZlIGRpbWVuc2lvbgorICAgICAgQGNvZGV7TUFYX1RZUEVTKzF9IHJhdGhlciB0aGFuIDE2LgorQGl0ZW0gVGhlIHJlcHJlc2VudGF0aW9uIGFuZCBhY2Nlc3Mgb2YgQGNvZGV7dF9taW5bXX0gYW5kIEBjb2Rle3RfbWF4W119CisgICAgICBoYXMgYmVlbiBjaGFuZ2VkLgorQGl0ZW0gQGNvZGV7em1heH0gcmVwbGFjZXMgQGNvZGV7emxvbmd9IGFzIGxhcmdlc3QgaW50ZWdlciB0YXJnZXQKKyAgICAgIHR5cGUuIEBjb2Rle3psb25nfSBpcyBvbmx5IHVzZWQgd2hlbiBhY3R1YWxseSByZWZlcnJpbmcgdG8gYQorICAgICAgQGNvZGV7bG9uZ30gb24gdGhlIHRhcmdldC4gQWxzbywgdGhlIG1hY3JvcyBmb3IgdGFyZ2V0IGFyaXRobWV0aWMKKyAgICAgIGFyZSBhdmFpbGFibGUgZm9yIEBjb2Rle3ptYXgvenVtYXh9IGluc3RlYWQgb2YgQGNvZGV7emxvbmcvenVsb25nfS4KK0BpdGVtIEBjb2Rle1BVU0h9IElDcyBjb250YWluIGEgc2Vjb25kIHNpemUgKGFjdHVhbCBzdGFjay1hZGp1c3RtZW50KS4KK0BpdGVtIFRoZSBzZWNvbmQgYXJndW1lbnQgb2YgQGNvZGV7U0hJRlR9IElDcyBoYXMgYW4gb3duIHR5cGUuCitAaXRlbSBAY29kZXtEUkVGT0JKfSBvYmplY3RzIGNvbnRhaW4gdGhlIHR5cGUgb2YgdGhlIGRlcmVmZXJlbmNlZCBwb2ludGVyCisgICAgICAob25seSBtZWFuaW5nZnVsIGlmIHRoZXJlIGFyZSBkaWZmZXJlbnQgcG9pbnRlciB0eXBlcykuCitAaXRlbSBUaGUgbmV3IEBjb2Rle0NPTlZFUlR9IElDIHJlcGxhY2VzIHRoZSBzZXJpZXMgb2Ygb2xkIElDcworICAgICAgKEBjb2Rle0NPTlZJTlR9IGV0Yy4pLgorQGl0ZW0gQGNvZGV7ZW1pdCgpfS1mdW5jdGlvbnMgaGF2ZSB0byBiZSB1c2VkIHRvIGdlbmVyYXRlIG91dHB1dCByYXRoZXIKKyAgICAgIHRoYW4gQGNvZGV7ZnByaW50ZigpfS4KK0BpdGVtIFRoZSBmdW5jdGlvbnMgQGNvZGV7aW5pdF9kYigpfSBhbmQgQGNvZGV7Y2xlYW51cF9kYigpfSBoYXZlIHRvIGJlCisgICAgICBwcm92aWRlZCAodGhleSBkbyBub3QgaGF2ZSBkbyB0byBhbnl0aGluZykuCitAaXRlbSBBIG5ldyBhcnJheSBAY29kZXtyZWdfcHJpb1tdfSBpcyBuZWVkZWQgYW5kIGNvbnRyb2xzIHRoZSBvcmRlcgorICAgICAgaW4gd2hpY2ggcmVnaXN0ZXJzIGFyZSBhbGxvY2F0ZWQuCitAaXRlbSBUaGUgcGFyYW1ldGVycyBvZiBAY29kZXttdXN0X2NvbnZlcnQoKX0gaGF2ZSBjaGFuZ2VkLgorQGl0ZW0gU3RhdGljIGZ1bmN0aW9ucyBtdXN0IG5vdCB1c2UgaWRlbnRpZmllcnMsIGJ1dCBoYXZlIHRvIHVzZSBudW1iZXJlZAorICAgICAgbGFiZWxzLgorCitAZW5kIGl0ZW1pemUKKworVm9sa2VyIEJhcnRoZWxtYW5uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YkBAY29tcGlsZXJzLmRlCisKZGlmZiAtLWdpdCBhL2RvYy91Y3BwLnRleGkgYi9kb2MvdWNwcC50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZhODgyMWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdWNwcC50ZXhpCkBAIC0wLDAgKzEsNDAgQEAKK3ZiY2MgY29udGFpbnMgdGhlIEMgcHJlcHJvY2Vzc29yIHVjcHAgYnkgVGhvbWFzIFBvcm5pbi4KKworQXR0YWNoZWQgaXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZnJvbSB0aGUgdWNwcC1kaXN0cmlidXRpb24gKG5vdGUgdGhhdAorYXBhcnQgZnJvbSB1Y3BwIG5vIG90aGVyIHBhcnQgb2YgdGhpcyBkaXN0cmlidXRpb24gZmFsbHMgdW5kZXIgdGhpcworbGljZW5zZSkuCisKKworVm9sa2VyIEJhcnRoZWxtYW5uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YkBjb21waWxlcnMuZGUKKworCistLS0tLS0tLS0tLS0tLSAKKworLyoKKyAqIChjKSBUaG9tYXMgUG9ybmluIDE5OTksIDIwMDAKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwKKyAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCmRpZmYgLS1naXQgYS9kb2MvdmJjYy50ZXhpIGIvZG9jL3ZiY2MudGV4aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2NmZWFhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3ZiY2MudGV4aQpAQCAtMCwwICsxLDQ2MSBAQAorXGlmeFxwZGZtaW5vcnZlcnNpb25cdW5kZWZpbmVkCisgXHBkZm9wdGlvbnBkZm1pbm9ydmVyc2lvbj0zCitcZWxzZQorIFxwZGZtaW5vcnZlcnNpb249MworXGZpCitcaW5wdXQgdGV4aW5mbworCitAc2V0ZmlsZW5hbWUgaW5kZXgudGV4aQorQHNldHRpdGxlIHZiY2MgbWFudWFsCitAc2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCitAc2V0IFVQREFURUQgRmVicnVhcnkgMjAyMgorCitAaWZpbmZvCisKK1RoaXMgaXMgdGhlIG1hbnVhbCBmb3IgdGhlIHZiY2MgY29tcGlsZXIgc3lzdGVtLgorCitDb3B5cmlnaHQgMTk5NS0yMDIyIFZvbGtlciBCYXJ0aGVsbWFubgorCitAZW5kIGlmaW5mbworCitAdGl0bGVwYWdlCitAdGl0bGUgdmJjYyBjb21waWxlciBzeXN0ZW0KK0BhdXRob3IgVm9sa2VyIEJhcnRoZWxtYW5uCitAc3VidGl0bGUgQHZhbHVle1VQREFURUR9CisKK0BwYWdlCisKK0BlbmQgdGl0bGVwYWdlCisKK0BwYXJhZ3JhcGhpbmRlbnQgMAorCitAY29udGVudHMKKworQGNoYXB0ZXIgR2VuZXJhbAorCitAc2VjdGlvbiBJbnRyb2R1Y3Rpb24KKworICAgIHZiY2MgaXMgYSBoaWdobHkgb3B0aW1pemluZyBwb3J0YWJsZSBhbmQgcmV0YXJnZXRhYmxlIElTTyBDIGNvbXBpbGVyLgorICAgIEl0IHN1cHBvcnRzIElTTyBDIGFjY29yZGluZyB0byBJU08vSUVDIDk4OTk6MTk4OSBhbmQgYSBzdWJzZXQgb2YgdGhlCisgICAgbmV3IHN0YW5kYXJkIElTTy9JRUMgOTg5OToxOTk5IChDOTkpLgorCisgICAgSXQgaXMgc3BsaXQgaW50byBhIHRhcmdldC1pbmRlcGVuZGVudCBhbmQgYSB0YXJnZXQtZGVwZW5kZW50IHBhcnQsIGFuZAorICAgIHByb3ZpZGVzIGNvbXBsZXRlIGFic3RyYWN0aW9uIG9mIGhvc3QtIGFuZCB0YXJnZXQtYXJpdGhtZXRpYy4gVGhlcmVmb3JlLAorICAgIGl0IGZ1bGx5IHN1cHBvcnRzIGNyb3NzLWNvbXBpbGluZyBmb3IgOCwgMTYsIDMyIGFuZCA2NGJpdCBhcmNoaXRlY3R1cmVzLgorCisgICAgRW1iZWRkZWQgc3lzdGVtcyBhcmUgc3VwcG9ydGVkIGJ5IGZlYXR1cmVzIGxpa2UgZGlmZmVyZW50IHBvaW50ZXItc2l6ZXMKKyAgICAoZS5nLiBkaWZmZXJlbnRseSBzaXplZCBmdW5jdGlvbi0gYW5kIG9iamVjdC1wb2ludGVycyBvciBuZWFyLSBhbmQKKyAgICBmYXItcG9pbnRlcnMpLCBST00tYWJsZSBjb2RlLCBpbmxpbmUtYXNzZW1ibHksIGJpdC10eXBlcywKKyAgICBpbnRlcnJ1cHQtaGFuZGxlcnMsIHNlY3Rpb24tYXR0cmlidXRlcywgc3RhY2stY2FsY3VsYXRpb24gYW5kIG1hbnkKKyAgICBvdGhlcnMgKGRlcGVuZGluZyBvbiB0aGUgYmFja2VuZCkuCisKKyAgICB2YmNjIHByb3ZpZGVzIGEgbGFyZ2Ugc2V0IG9mIGFnZ3Jlc3NpdmUgaGlnaC1sZXZlbCBvcHRpbWl6YXRpb25zCisgICAgKEBweHJlZntPcHRpbWl6YXRpb25zfSkKKyAgICBhcyB3ZWxsIGFzIHRhcmdldC1zcGVjaWZpYyBvcHRpbWl6YXRpb25zIHRvIHByb2R1Y2UgZmFzdGVyIG9yIHNtYWxsZXIKKyAgICBjb2RlLiBSYXRoZXIgdGhhbiByZXN0cmljdGluZyBhbmFseXNpcyBhbmQgb3B0aW1pemF0aW9uIHRvIHNpbmdsZQorICAgIGZ1bmN0aW9ucyBvciBmaWxlcywgdmJjYyBpcyBhYmxlIHRvIG9wdGltaXplIGFjcm9zcyBmdW5jdGlvbnMgYW5kCisgICAgZXZlbiBtb2R1bGVzLiBUYXJnZXQtaW5kZXBlbmRlbnQgb3B0aW1pemF0aW9ucyBpbmNsdWRlOgorCitAaXRlbWl6ZSBAbWludXMKKyAgICBAaXRlbSBjcm9zcy1tb2R1bGUgZnVuY3Rpb24taW5saW5pbmcKKyAgICBAaXRlbSBwYXJ0aWFsIGlubGluaW5nIG9mIHJlY3Vyc2l2ZSBmdW5jdGlvbnMKKyAgICBAaXRlbSBpbnRlci1wcm9jZWR1cmFsIGRhdGEtZmxvdyBhbmFseXNpcworICAgIEBpdGVtIGludGVyLXByb2NlZHVyYWwgcmVnaXN0ZXItYWxsb2NhdGlvbgorICAgIEBpdGVtIHJlZ2lzdGVyLWFsbG9jYXRpb24gZm9yIGdsb2JhbCB2YXJpYWJsZXMKKyAgICBAaXRlbSBnbG9iYWwgY29tbW9uLXN1YmV4cHJlc3Npb24tZWxpbWluYXRpb24KKyAgICBAaXRlbSBnbG9iYWwgY29uc3RhbnQtcHJvcGFnYXRpb24KKyAgICBAaXRlbSBnbG9iYWwgY29weS1wcm9wYWdhdGlvbgorICAgIEBpdGVtIGRlYWQtY29kZS1lbGltaW5hdGlvbgorICAgIEBpdGVtIGFsaWFzLWFuYWx5c2lzCisgICAgQGl0ZW0gbG9vcC11bnJvbGxpbmcKKyAgICBAaXRlbSBpbmR1Y3Rpb24tdmFyaWFibGUgZWxpbWluYXRpb24KKyAgICBAaXRlbSBsb29wLWludmFyaWFudCBjb2RlLW1vdGlvbgorICAgIEBpdGVtIGxvb3AtcmV2ZXJzYWwKK0BlbmQgaXRlbWl6ZQorCisKK0BzZWN0aW9uIExlZ2FsCisKKyAgICB2YmNjIGlzIGNvcHlyaWdodCBpbiAxOTk1LTIwMjIgYnkgVm9sa2VyIEJhcnRoZWxtYW5uLgorCisgICAgVGhpcyBhcmNoaXZlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHdpdGhvdXQgbW9kaWZpY2F0aW9ucyBhbmQgdXNlZAorICAgIGZvciBub24tY29tbWVyY2lhbCBwdXJwb3Nlcy4KKworICAgIEFuIGV4Y2VwdGlvbiBmb3IgY29tbWVyY2lhbCB1c2FnZSBpcyBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSB0YXJnZXQKKyAgICBDUFUgaXMgTTY4ayBhbmQgdGhlIHRhcmdldCBPUyBpcyBBbWlnYU9TLiBSZXN1bHRpbmcgYmluYXJpZXMgbWF5IGJlCisgICAgZGlzdHJpYnV0ZWQgY29tbWVyY2lhbGx5IHdpdGhvdXQgZnVydGhlciBsaWNlbnNpbmcuCisKKyAgICBBbiBleGNlcHRpb24gZm9yIGNvbW1lcmNpYWwgdXNhZ2UgaXMgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgdGFyZ2V0CisgICAgQ1BVIGlzIDY1MDIgd2l0aCBNRUdBNjUgZXh0ZW5zaW9ucyBhbmQgdGhlIHRhcmdldCBIVyBpcyBNRUdBNjUuCisgICAgUmVzdWx0aW5nIGJpbmFyaWVzIG1heSBiZQorICAgIGRpc3RyaWJ1dGVkIGNvbW1lcmNpYWxseSB3aXRob3V0IGZ1cnRoZXIgbGljZW5zaW5nLgorCisgICAgSW4gYWxsIG90aGVyIGNhc2VzIHlvdSBuZWVkIG15IHdyaXR0ZW4gY29uc2VudC4KKworICAgIFRoaXMgY29weXJpZ2h0IGFwcGxpZXMgdG8gdmMsIHZiY2MsIHZzYyBhbmQgdmNwci4KKworICAgIFRoaXMgYXJjaGl2ZSBtYXkgY29udGFpbiBvdGhlciB0b29scyAoZS5nLiBhc3NlbWJsZXJzIG9yIGxpbmtlcnMpCisgICAgd2hpY2ggZG8gbm90IGZhbGwgdW5kZXIgdGhpcyBsaWNlbnNlLiBQbGVhc2UgY29uc3VsdCB0aGUgY29ycmVzcG9uZGluZworICAgIGRvY3VtZW50YXRpb24gb2YgdGhlc2UgdG9vbHMuCisKKyAgICB2YmNjIGNvbnRhaW5zIHRoZSBwcmVwcm9jZXNzb3IgdWNwcCBieSBUaG9tYXMgUG9ybmluLiBJbmNsdWRlZCBpcyB0aGUKKyAgICBjb3B5cmlnaHQgbm90aWNlIG9mIHVjcHAgKG5vdGUgdGhhdCB0aGlzIGxpY2Vuc2UgZG9lcyBub3QgYXBwbHkgdG8gdmJjYworICAgIG9yIGFueSBvdGhlciBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uKToKKworQGV4YW1wbGUKKy8qCisgKiAoYykgVGhvbWFzIFBvcm5pbiAxOTk5LCAyMDAwCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsCisgKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworQGVuZCBleGFtcGxlCisKKworQHNlY3Rpb24gSW5zdGFsbGF0aW9uCisKK1RoZSB2YmNjIGRpcmVjdG9yeSB0cmVlIGxvb2tzIGFzIGZvbGxvd3M6CisKK0B0YWJsZSBAZmlsZQorCitAaXRlbSB2YmNjL2JpbgorICAgICAgICAgICAgICAgIFRoZSBleGVjdXRhYmxlcy4KKworQGl0ZW0gdmJjYy9jb25maWcKKyAgICAgICAgICAgICAgICBDb25maWcgZmlsZXMgZm9yIHRoZSBmcm9udGVuZC4KKworQGl0ZW0gdmJjYy90YXJnZXRzLzx0YXJnZXQ+CisgICAgICAgICAgICAgICAgU3ViZGlyZWN0b3J5IGNvbnRhaW5pbmcgYWxsIGZpbGVzIHNwZWNpZmljIHRvIGEgY2VydGFpbgorICAgICAgICAgICAgICAgIHRhcmdldCAoZS5nLiBtNjhrLWFtaWdhb3Mgb3IgcHBjLWVhYmkpLgorQGVuZCB0YWJsZQorCitAc3Vic2VjdGlvbiBJbnN0YWxsaW5nIGZvciBVbml4CisKKyAgICBAZW51bWVyYXRlCisKKyAgICBAaXRlbSBFeHRyYWN0IHRoZSBhcmNoaXZlLgorCisgICAgQGl0ZW0gU2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBAZW52e1ZCQ0N9IHRvIHRoZSB2YmNjIGRpcmVjdG9yeS4KKyAgICAgICAgRGVwZW5kaW5nIG9uIHlvdXIgc2hlbGwgdGhpcyBtaWdodCBiZSBkb25lIGUuZy4gYnkKKworICAgICAgICBAZXhhbXBsZQorICAgICAgICBWQkNDPTxwcmVmaXg+L3ZiY2MKKyAgICAgICAgQGVuZCBleGFtcGxlCisKKyAgICAgICAgb3IKKworICAgICAgICBAZXhhbXBsZQorICAgICAgICBzZXRlbnYgVkJDQyA8cHJlZml4Pi92YmNjCisgICAgICAgIEBlbmQgZXhhbXBsZQorCisgICAgQGl0ZW0gSW5jbHVkZSA8cHJlZml4Pi92YmNjL2JpbiB0byB5b3VyIHNlYXJjaC1wYXRoLiBEZXBlbmRpbmcgb24geW91cgorICAgICAgICBzaGVsbCB0aGlzIG1pZ2h0IGJlIGRvbmUgZS5nLiBieQorCisgICAgICAgIEBleGFtcGxlCisgICAgICAgIFBBVEg9PHByZWZpeD4vdmJjYy9iaW46IiRQQVRIIgorICAgICAgICBAZW5kIGV4YW1wbGUKKworICAgICAgICBvcgorCisgICAgICAgIEBleGFtcGxlCisgICAgICAgIHNldGVudiBQQVRIIDxwcmVmaXg+L3ZiY2MvYmluOiIkUEFUSCIKKyAgICAgICAgQGVuZCBleGFtcGxlCisKKyAgICBAZW5kIGVudW1lcmF0ZQorCisKK0BzdWJzZWN0aW9uIEluc3RhbGxpbmcgZm9yIERPUy9XaW5kb3dzCisKKyAgICBAZW51bWVyYXRlCisKKyAgICBAaXRlbSBFeHRyYWN0IHRoZSBhcmNoaXZlLgorCisgICAgQGl0ZW0gU2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBAZW52e1ZCQ0N9IHRvIHRoZSB2YmNjIGRpcmVjdG9yeS4KKworICAgICAgICBAZXhhbXBsZQorICAgICAgICBzZXQgVkJDQz08cHJlZml4Plx2YmNjCisgICAgICAgIEBlbmQgZXhhbXBsZQorCisgICAgQGl0ZW0gSW5jbHVkZSA8cHJlZml4Pi92YmNjL2JpbiB0byB5b3VyIHNlYXJjaC1wYXRoLgorCisgICAgICAgIEBleGFtcGxlCisgICAgICAgIHNldCBQQVRIPTxwcmVmaXg+XHZiY2NcYmluOyVQQVRIJQorICAgICAgICBAZW5kIGV4YW1wbGUKKworICAgIEBlbmQgZW51bWVyYXRlCisKKworQHN1YnNlY3Rpb24gSW5zdGFsbGluZyBmb3IgQW1pZ2FPUworCisgICAgVGhlcmUgaXMgYW4gQW1pZ2EgSW5zdGFsbGVyLCB3aGljaCBsZXRzCisgICAgeW91IGluc3RhbGwgdGhlIGJpbmFyeSBhbmQgdGFyZ2V0IGFyY2hpdmVzIHdpdGggYSBzaW1wbGUgbW91c2UgY2xpY2suCisgICAgQGNvbW1hbmR7dmJjY30gZm9yIEFtaWdhT1MvTW9ycGhPUyBpcyBkaXZpZGVkIGludG8gdGhlIGZvbGxvd2luZworICAgIHBhY2thZ2VzOgorCisgICAgQHRhYmxlIEBmaWxlCisgICAgQGl0ZW0gdmJjY19iaW5fYW1pZ2FvczY4aworCUJpbmFyaWVzIGZvciBBbWlnYU9TIDIueC8zLnggKDY4MDIwKykuCisgICAgQGl0ZW0gdmJjY19iaW5fYW1pZ2Fvc3BwYworCUJpbmFyaWVzIGZvciBBbWlnYU9TIDQueCAoUG93ZXJQQykuCisgICAgQGl0ZW0gdmJjY19iaW5fbW9ycGhvcworCUJpbmFyaWVzIGZvciBNb3JwaE9TIChQb3dlclBDKS4KKyAgICBAaXRlbSB2YmNjX2Jpbl9wb3dlcnVwCisJQWRkaXRpb25hbCBQUEMtbmF0aXZlIGJpbmFyaWVzIHVzaW5nIHRoZSBQb3dlclVwIGtlcm5lbCBmb3IKKwlBbWlnYU9TIDMueC4KKyAgICBAaXRlbSB2YmNjX2Jpbl93YXJwb3MKKwlBZGRpdGlvbmFsIFBQQy1uYXRpdmUgYmluYXJpZXMgdXNpbmcgdGhlIFdhcnBPUyBrZXJuZWwgZm9yCisJQW1pZ2FPUyAzLnguCisgICAgQGl0ZW0gdmJjY190YXJnZXRfbTY4ay1raWNrMTMKKwlIZWFkZXIgZmlsZXMgYW5kIGxpYnJhcmllcyBmb3IgQW1pZ2FPUyAxLngvTTY4ay4KKyAgICBAaXRlbSB2YmNjX3RhcmdldF9tNjhrLWFtaWdhb3MKKwlIZWFkZXIgZmlsZXMgYW5kIGxpYnJhcmllcyBmb3IgQW1pZ2FPUyAyLngvMy54L002OGsuCisgICAgQGl0ZW0gdmJjY190YXJnZXRfcHBjLWFtaWdhb3MKKwlIZWFkZXIgZmlsZXMgYW5kIGxpYnJhcmllcyBmb3IgQW1pZ2FPUyA0LnguCisgICAgQGl0ZW0gdmJjY190YXJnZXRfcHBjLW1vcnBob3MKKwlIZWFkZXIgZmlsZXMgYW5kIGxpYnJhcmllcyBmb3IgTW9ycGhPUy4KKyAgICBAaXRlbSB2YmNjX3RhcmdldF9wcGMtcG93ZXJ1cAorCUhlYWRlciBmaWxlcyBhbmQgbGlicmFyaWVzIGZvciBQb3dlclVwLgorICAgIEBpdGVtIHZiY2NfdGFyZ2V0X3BwYy13YXJwb3MKKwlIZWFkZXIgZmlsZXMgYW5kIGxpYnJhcmllcyBmb3IgV2FycE9TLgorICAgIEBlbmQgdGFibGUKKyAgIAorICAgIFVzdWFsbHkgeW91IHdpbGwgaW5zdGFsbCB0aGUgYmluYXJ5IGFyY2hpdmUgZm9yIHlvdXIgaG9zdCBhcmNoaXRlY3R1cmUKKyAgICBvZiBjaG9pY2UsIHRoZW4gYWRkIGFzIG1hbnkgdGFyZ2V0IGFyY2hpdmVzIHlvdSBuZWVkLgorCisgICAgV2hlbiBpbnN0YWxsaW5nIG1hbnVhbGx5IGl0IGlzIHJlY29tbWVuZGVkIHRvIGFkZCB0aGUgZm9sbG93aW5nCisgICAgYXNzaWducyB0byB5b3VyIEBmaWxle3M6VXNlci1TdGFydHVwfSBmaWxlIChvbmx5IGRvIHRoZSBhc3NpZ25tZW50cworICAgIHJlcXVpcmVkIGZvciB0aGUgaW5zdGFsbGVkIHRhcmdldHMpOiAKKworQGV4YW1wbGUKK2Fzc2lnbiA+TklMOiB2YmNjOiA8cGF0aCB0byB2YmNjIGRpcmVjdG9yeT4KK2Fzc2lnbiA+TklMOiBDOiB2YmNjOmJpbiBhZGQKKyAKK2Fzc2lnbiA+TklMOiB2aW5jbHVkZW9zMTogdmJjYzp0YXJnZXRzL202OGsta2ljazEzL2luY2x1ZGUKK2Fzc2lnbiA+TklMOiB2aW5jbHVkZW9zMTogPHBhdGggdG8geW91ciBLaWNrc3RhcnQgMS54IGhlYWRlciBmaWxlcz4gQURECithc3NpZ24gPk5JTDogdmxpYm9zMTogdmJjYzp0YXJnZXRzL202OGsta2ljazEzL2xpYgorCithc3NpZ24gPk5JTDogdmluY2x1ZGVvczM6IHZiY2M6dGFyZ2V0cy9tNjhrLWFtaWdhb3MvaW5jbHVkZQorYXNzaWduID5OSUw6IHZpbmNsdWRlb3MzOiA8cGF0aCB0byB5b3VyIEFtaWdhT1MzIGhlYWRlciBmaWxlcz4gQURECithc3NpZ24gPk5JTDogdmxpYm9zMzogdmJjYzp0YXJnZXRzL202OGstYW1pZ2Fvcy9saWIKKworYXNzaWduID5OSUw6IHZpbmNsdWRlb3M0OiB2YmNjOnRhcmdldHMvcHBjLWFtaWdhb3MvaW5jbHVkZQorYXNzaWduID5OSUw6IHZpbmNsdWRlb3M0OiA8cGF0aCB0byB5b3VyIEFtaWdhT1M0IGhlYWRlciBmaWxlcz4gQURECithc3NpZ24gPk5JTDogdmxpYm9zNDogdmJjYzp0YXJnZXRzL3BwYy1hbWlnYW9zL2xpYgorCithc3NpZ24gPk5JTDogdmluY2x1ZGVtb3M6IHZiY2M6dGFyZ2V0cy9wcGMtbW9ycGhvcy9pbmNsdWRlCithc3NpZ24gPk5JTDogdmluY2x1ZGVtb3M6IDxwYXRoIHRvIHlvdXIgTW9ycGhPUyBoZWFkZXIgZmlsZXM+IEFERAorYXNzaWduID5OSUw6IHZsaWJtb3M6IHZiY2M6dGFyZ2V0cy9wcGMtbW9ycGhvcy9saWIKKworYXNzaWduID5OSUw6IHZpbmNsdWRlcHVwOiB2YmNjOnRhcmdldHMvcHBjLXBvd2VydXAvaW5jbHVkZQorYXNzaWduID5OSUw6IHZpbmNsdWRlcHVwOiA8cGF0aCB0byB5b3VyIFBvd2VyVXAgaGVhZGVyIGZpbGVzPiBBREQKK2Fzc2lnbiA+TklMOiB2aW5jbHVkZXB1cDogPHBhdGggdG8geW91ciBBbWlnYU9TMyBoZWFkZXIgZmlsZXM+IEFERAorYXNzaWduID5OSUw6IHZsaWJwdXA6IHZiY2M6dGFyZ2V0cy9wcGMtcG93ZXJ1cC9saWIKKworYXNzaWduID5OSUw6IHZpbmNsdWRld29zOiB2YmNjOnRhcmdldC9wcGMtd2FycG9zL2luY2x1ZGUKK2Fzc2lnbiA+TklMOiB2aW5jbHVkZXdvczogPHBhdGggdG8geW91ciBXYXJwT1MgaGVhZGVyIGZpbGVzPiBBREQKK2Fzc2lnbiA+TklMOiB2aW5jbHVkZXdvczogPHBhdGggdG8geW91ciBBbWlnYU9TMyBoZWFkZXIgZmlsZXM+IEFERAorYXNzaWduID5OSUw6IHZsaWJ3b3M6IHZiY2M6dGFyZ2V0L3BwYy13YXJwb3MvbGliCisKK0BlbmQgZXhhbXBsZQorCisgICAgQWxzbywgdGhlIHN0YWNrLXNpemUgaGFzIHRvIGJlIGluY3JlYXNlZCBmcm9tIHRoZSBkZWZhdWx0LCBmb3IgdGhvc2UKKyAgICBiaW5hcmllcyB3aGljaCBkb24ndCBkbyB0aGF0IGF1dG9tYXRpY2FsbHkgKGUuZy4gQW1pZ2FPUzQpLgorICAgIDY0S0IgaXMgYSBzZW5zaWJsZSB2YWx1ZSwgZm9yIHZlcnkgbGFyZ2UgcHJvamVjdHMgaGlnaGVyCisgICAgdmFsdWVzIG1pZ2h0IGJlIG5lY2Vzc2FyeS4KKworICAgIEZvciB3cml0aW5nIEFtaWdhT1MvTW9ycGhPUyBwcm9ncmFtcyB5b3Ugd2lsbCBuZWVkIHRoZSBhcHByb3ByaWF0ZQorICAgIHN5c3RlbSBoZWFkZXIgZmlsZXMuIFBsZWFzZSB1c2UgTkRLIDMuOSBvciBsYXRlciBmb3IgQW1pZ2FPUyAyLngvMy54LCBhcworICAgIHRoZSBwcm90by9pbmxpbmUgaGVhZGVycyBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGl0LgorCisgICAgRm9yIEFtaWdhT1MgMS54IHlvdSBzaG91bGQgdXNlIHRoZSBvbGQgS2lja3N0YXJ0IDEueCBoZWFkZXJzIGZyb20gdGhhdAorICAgIHRpbWUuIEl0IG1ha2VzIHN1cmUgdGhhdCB5b3UgZG9uJ3QgdXNlIGEgZmVhdHVyZSBvZiBsYXRlciBPUyByZWxlYXNlcy4KKworICAgIFRoZXJlIGFyZSBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiBmaWxlcyBwcm92aWRlZCBpbiB0aGUKKyAgICBAZmlsZXtjb25maWd9LXN1YmRpcmVjdG9yeSB0byBjaG9vc2UgZGlmZmVyZW50IHRhcmdldHMgKGkuZS4KKyAgICB0aGUgc3lzdGVtIHlvdSB3YW50IHRvIGdlbmVyYXRlIHByb2dyYW1zIGZvcikgYW5kIGhvc3RzCisgICAgKGkuZS4gdGhlIHN5c3RlbSB5b3Ugd2FudCB0aGUgY29tcGlsZXIgYW4gdG9vbHMgdG8gcnVuIG9uKS4KKyAgICBUaGUgZ2VuZXJhbCBuYW1pbmctc2NoZW1lIGZvciB0aGVzZSBmaWxlcyBpcyA8dGFyZ2V0Pl88aG9zdD4uCisKKyAgICBBdmFpbGFibGUgY29uZmlnIGZpbGVzLCB3aGVuIGFsbCB0YXJnZXRzIGFyZSBpbnN0YWxsZWQsIGFyZQorQHRhYmxlIEBmaWxlCitAaXRlbSBhb3M2OGsKKyAgICBBbWlnYU9TIDIueC8zLnguCitAaXRlbSBhb3M2OGttCisgICAgQW1pZ2FPUyAyLngvMy54IHdpdGggbWluaW1hbCBzdGFydHVwIGNvZGUuCitAaXRlbSBhb3M2OGtyCisgICAgQW1pZ2FPUyAyLngvMy54IGZvciByZXNpZGVudCBwcm9ncmFtcy4KK0BpdGVtIGtpY2sxMworICAgIEFtaWdhT1MgMS54LgorQGl0ZW0ga2ljazEzbQorICAgIEFtaWdhT1MgMS54IHdpdGggbWluaW1hbCBzdGFydHVwIGNvZGUuCitAaXRlbSBraWNrMTNyCisgICAgQW1pZ2FPUyAxLnggZm9yIHJlc2lkZW50IHByb2dyYW1zLgorQGl0ZW0gYW9zcHBjCisgICAgQW1pZ2FPUyA0Lnggb24gUFBDIHVzaW5nIHZjbGliLgorQGl0ZW0gbmV3bGliCisgICAgQW1pZ2FPUyA0Lnggb24gUFBDIHVzaW5nIG5ld2xpYi4KK0BpdGVtIG1vcnBob3MKKyAgICBQUEMgc3lzdGVtcyBydW5uaW5nIE1vcnBoT1MuCitAaXRlbSBwb3dlcnVwCisgICAgUFBDIGJvYXJkcyB1c2luZyB0aGUgUG93ZXJVcCBzeXN0ZW0uCitAaXRlbSB3YXJwb3MKKyAgICBQUEMgYm9hcmRzIHVzaW5nIHRoZSBXYXJwT1Mgc3lzdGVtLgorQGVuZCB0YWJsZQorCisgICAgWW91IGNhbiBjaG9vc2Ugb25lIG9mIHRoZXNlIHN5c3RlbXMgdXNpbmcgdGhlIEBvcHRpb257K30tb3B0aW9uCisgICAgb2YgQGNvbW1hbmR7dmN9LCBlLmcuCisKK0BleGFtcGxlCisgICAgdmMgK2FvczY4a19wb3dlcnVwIC4uLgorQGVuZCBleGFtcGxlCisKKyAgICB3aWxsIGNvbXBpbGUgZm9yIEFtaWdhT1MvNjhrIHVzaW5nIHRoZSBjb21waWxlciBydW5uaW5nIG9uIFBvd2VyVXAuCisKKyAgICBZb3UgbWF5IGNob29zZSB0byBjcmVhdGUgY29waWVzIG9mIHNvbWUgb2YgdGhlc2UgY29uZmlndXJhdGlvbgorICAgIGZpbGVzIHdpdGggc2ltcGxlciBuYW1lcy4gRS5nLiBpZiB5b3UgdXN1YWxseSB3YW50IHRoZSBjb21waWxlcgorICAgIHRvIHJ1biBvbiBXYXJwT1MgeW91IGNvdWxkIGNvcHkgQGZpbGV7YW9zNjhrX3dhcnBvc30gdG8gQGZpbGV7YW9zNjhrfSwKKyAgICBAZmlsZXt3YXJwb3Nfd2FycG9zfSB0byBAZmlsZXt3YXJwb3N9IGFuZCBzbyBvbi4gVGhlbiB5b3UgY2FuIGp1c3Qgc3BlY2lmeQorICAgIHRoZSB0YXJnZXQgYW5kIHlvdXIgcHJlZmVycmVkIGhvc3Qgc3lzdGVtIHdpbGwgYmUgY2hvc2VuIGF1dG9tYXRpY2FsbHkuCisKKyAgICBBZGRpdGlvbmFsbHksIHlvdSBtYXkgY29weSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGZvciB5b3VyIHByZWZlcnJlZAorICAgIGhvc3QvdGFyZ2V0LWNvbWJpbmF0aW9uIHRvCisgICAgQGZpbGV7dmMuY29uZmlnfS4gVGhpcyBjb25maWd1cmF0aW9uIHdpbGwgYmUgY2hvc2VuIGJ5IGRlZmF1bHQgaWYKKyAgICB5b3UgZG8gbm90IHNwZWNpZnkgYW55dGhpbmcuCisKKyAgICBCeSBkZWZhdWx0LCB0aGUgdGFyZ2V0LW9ubHktc3BlY2lmaWNhdGlvbnMgdXNlIDY4MDIwLW5hdGl2ZSB0b29scyBvbgorICAgIEFtaWdhT1MgMi54LzMueCAtIGUuZy4gQG9wdGlvbnsrd2FycG9zfSB3aWxsIGNyZWF0ZSBjb2RlIGZvciBXYXJwT1MsCisgICAgYnV0IHRoZSBjb21waWxlciBhbmQgdG9vbHMgd2lsbCBydW4gb24gdGhlIDY4ay4gVGhlIGRlZmF1bHQKKyAgICBAZmlsZXt2Yy5jb25maWd9IHdpbGwgdGhlbiBjcmVhdGUgY29kZSBmb3IgNjhrIHVzaW5nIHRvb2xzIHJ1bm5pbmcKKyAgICBvbiA2OGsuIEhhdmluZyBpbnN0YWxsZWQgdGhlIE1vcnBoT1MtbmF0aXZlIGJpbmFyeSBhcmNoaXZlIGluc3RlYWQsCisgICAgdGhlIGRlZmF1bHQgQGZpbGV7dmMuY29uZmlnfSB3aWxsIGNyZWF0ZSBQUEMgY29kZSBmb3IgTW9ycGhPUyB1c2luZworICAgIHRvb2xzIHJ1bm5pbmcgb24gTW9ycGhPUy4KKworQHNlY3Rpb24gVHV0b3JpYWwKKworICAgIE5vdyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHZiY2MuIFRvIGNvbXBpbGUgYW5kCisgICAgbGluayB0aGUgcHJvZ3JhbSBAZmlsZXtoZWxsby5jfSwgdHlwZQorIAorQGV4YW1wbGUKKyAgICAgICAgdmMgaGVsbG8uYworQGVuZCBleGFtcGxlCisgCisgICAgVGhlIGZpbGUgQGZpbGV7aGVsbG8uY30gd2lsbCBiZSBjb21waWxlZCBhbmQgbGlua2VkLCB1c2luZyB0aGUKKyAgICBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZnJvbSBAZmlsZXt2Yy5jb25maWd9LCB0byBjcmVhdGUKKyAgICB0aGUgZXhlY3V0YWJsZSBhLm91dCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisKK0BleGFtcGxlCisgICAgICAgIHZjIGhlbGxvLmMgLW8gaGVsbG8KK0BlbmQgZXhhbXBsZQorIAorICAgIHdpbGwgZG8gdGhlIHNhbWUsIGJ1dCB0aGUgY3JlYXRlZCBleGVjdXRhYmxlIHdpbGwgYmUgY2FsbGVkIEBmaWxle2hlbGxvfS4KKyAKK0BleGFtcGxlCisgICAgICAgIHZjIC1jIHQxLmMgdDIuYworQGVuZCBleGFtcGxlCisgCisgICAgd2lsbCBjb21waWxlIEBmaWxle3QxLmN9IGFuZCBAZmlsZXt0Mi5jfSB3aXRob3V0IGxpbmtpbmcsIGNyZWF0aW5nIHRoZQorICAgIG9iamVjdCBmaWxlcyBAZmlsZXt0MS5vfSBhbmQgQGZpbGV7dDIub30uCisgCitAZXhhbXBsZQorICAgICAgICB2YyB0MS5vIHQyLm8gLW8gdHQKK0BlbmQgZXhhbXBsZQorIAorICAgIHdpbGwgbGluayB0aGVtIHRvZ2V0aGVyIGFuZCBjcmVhdGUgdGhlIGV4ZWN1dGFibGUgQGZpbGV7dHR9LgorIAorICAgIElmIHlvdXIgcHJvZ3JhbSB1c2VzIGZsb2F0aW5nIHBvaW50LCB5b3UgbWF5IGhhdmUgdG8gbGluayB3aXRoIGEKKyAgICBtYXRoLWxpYnJhcnkuIFRoZSBkZXRhaWxzIGFyZSBkZXBlbmRlbnQgb24gdGhlIHRhcmdldCwgYnV0IHVzdWFsbHkKKyAgICBAb3B0aW9uey1sbX0gd2lsbCBiZSBzdWl0YWJsZSAoZm9yIEFtaWdhT1Mgb24gbTY4ayBjaG9vc2Ugb25lIG9mCisgICAgQG9wdGlvbnstbG1pZWVlfSwgQG9wdGlvbnstbG04ODF9LCBAb3B0aW9uey1sbTA0MH0gb3IgQG9wdGlvbnstbG0wNjB9KS4KKworQGV4YW1wbGUgCisgICAgICAgIHZjIGNhbGMuYyAtbyBjYWxjIC1sbQorQGVuZCBleGFtcGxlCisKKworQG5vZGUgVGhlIEZyb250ZW5kCitAY2hhcHRlciBUaGUgRnJvbnRlbmQKK0BpbmNsdWRlIHZjLnRleGkKKworQG5vZGUgVGhlIENvbXBpbGVyCitAY2hhcHRlciBUaGUgQ29tcGlsZXIKK0BpbmNsdWRlIHZiY2NfbWFpbi50ZXhpCisKKworQG5vZGUgTTY4ay9Db2xkZmlyZSBCYWNrZW5kCitAY2hhcHRlciBNNjhrL0NvbGRmaXJlIEJhY2tlbmQKK0BpbmNsdWRlIHZiY2NtNjhrLnRleGkKKworQG5vZGUgUG93ZXJQQyBCYWNrZW5kCitAY2hhcHRlciBQb3dlclBDIEJhY2tlbmQKK0BpbmNsdWRlIHZiY2NwcGMudGV4aQorCitAbm9kZSBERUMgQWxwaGEgQmFja2VuZAorQGNoYXB0ZXIgREVDIEFscGhhIEJhY2tlbmQKK0BpbmNsdWRlIHZiY2NhbHBoYS50ZXhpCisKK0Bub2RlIGkzODYgQmFja2VuZAorQGNoYXB0ZXIgaTM4NiBCYWNrZW5kCitAaW5jbHVkZSB2YmNjaTM4Ni50ZXhpCisKK0Bub2RlIGMxNnggQmFja2VuZAorQGNoYXB0ZXIgYzE2eCBCYWNrZW5kCitAaW5jbHVkZSB2YmNjYzE2eC50ZXhpCisKK0Bub2RlIDY4aGMxMiBCYWNrZW5kCitAY2hhcHRlciA2OGhjMTIgQmFja2VuZAorQGluY2x1ZGUgdmJjY2hjMTIudGV4aQorCitAbm9kZSBWaWRlb0NvcmUgSVYgQmFja2VuZAorQGNoYXB0ZXIgVmlkZW9Db3JlIElWIEJhY2tlbmQKK0BpbmNsdWRlIHZiY2N2aWRjb3JlLnRleGkKKworQG5vZGUgNjUwMiBCYWNrZW5kCitAY2hhcHRlciA2NTAyIEJhY2tlbmQKK0BpbmNsdWRlIHZiY2M2NTAyLnRleGkKKworCitAbm9kZSBJbnN0cnVjdGlvbiBTY2hlZHVsZXIKK0BjaGFwdGVyIEluc3RydWN0aW9uIFNjaGVkdWxlcgorQGluY2x1ZGUgdnNjLnRleGkKKworQG5vZGUgQ29kZSBDb21wcmVzc29yCitAY2hhcHRlciBDb2RlIENvbXByZXNzb3IKK0BpbmNsdWRlIHZjcHIudGV4aQorCitAbm9kZSBDIExpYnJhcnkKK0BjaGFwdGVyIEMgTGlicmFyeQorQGluY2x1ZGUgdmNsaWIudGV4aQorCitAbm9kZSBMaXN0IG9mIEVycm9ycworQGNoYXB0ZXIgTGlzdCBvZiBFcnJvcnMKKworQGVudW1lcmF0ZSAwCitAaW5jbHVkZSBlcnJvcnMudGV4aQorQGVuZCBlbnVtZXJhdGUKKworQGNoYXB0ZXIgQmFja2VuZCBJbnRlcmZhY2UKK0BpbmNsdWRlIGludGVyZmFjZS50ZXhpCisKK0BieWUKZGlmZiAtLWdpdCBhL2RvYy92YmNjNjUwMi50ZXhpIGIvZG9jL3ZiY2M2NTAyLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc5YmRhYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy92YmNjNjUwMi50ZXhpCkBAIC0wLDAgKzEsNTE3IEBACitUaGlzIGNoYXB0ZXIgZG9jdW1lbnRzIHRoZSBiYWNrZW5kIGZvciB0aGUgNjUwMgorcHJvY2Vzc29yIGZhbWlseS4KKworQHNlY3Rpb24gQWRkaXRpb25hbCBvcHRpb25zCisKK1RoaXMgYmFja2VuZCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKKworQHRhYmxlIEBvcHRpb24KKworICAgIEBpdGVtIC1jMDIKKyAgICBAaXRlbSAtNjVjMDIKKyAgICAgICAgICAgICAgR2VuZXJhdGUgY29kZSB1c2luZyA2NUMwMiBleHRlbnNpb25zLgorCisgICAgQGl0ZW0gLWNlMDIKKyAgICAgICAgICAgICAgR2VuZXJhdGUgY29kZSB1c2luZyBDU0cgNjVDRTAyLzQ1MTAgZXh0ZW5zaW9ucy4KKworICAgIEBpdGVtIC1tZWdhNjUKKyAgICAgICAgICAgICAgR2VuZXJhdGUgY29kZSB1c2luZyB0aGUgTUVHQTY1IGV4dGVuc2lvbnMuICAgICAgICAgICAKKworICAgIEBpdGVtIC1tNjVpbworICAgICAgICAgICAgICBXaGVuIHVzaW5nIHRoZSBNRUdBNjUgbXVsdGlwbGllci9kaXZpZGVyLCBhc3N1bWUgdGhhdCB0aGUgSU8gYXJlYQorICAgICAgICAgICAgICBpcyBkaXJlY3RseSBhY2Nlc3NpYmxlIHRvIGdlbmVyYXRlIHNtYWxsZXIgYW5kIGZhc3RlciBjb2RlLgorCisgICAgQGl0ZW0gLWRpdi1idWcKKyAgICAgICAgICAgICAgRG8gbm90IGdlbmVyYXRlIGNvZGUgdXNpbmcgdGhlIE1FR0E2NSBkaXZpZGVyIGFzIHRoaXMgaXMgYnVnZ3kgaW4KKyAgICAgICAgICAgICAgZWFybHkgdmVyc2lvbnMuCisKKyAgICBAaXRlbSAtc3RkLXN5bnRheAorICAgICAgICAgICAgICBHZW5lcmF0ZSBjb2RlIGZvciB0aGUgc3RkIHN5bnRheCBtb2R1bGUgb2YgdmFzbSByYXRoZXIgdGhhbgorICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBvbGRzdHlsZSBzeW50YXggbW9kdWxlLgorCisgICAgQGl0ZW0gLWNibWFzY2lpCisgICAgICAgICAgICAgIENvbnZlcnQgc3RyaW5nLWNvbnN0YW50cyBhbmQgY2hhcmFjdGVyLWNvbnN0YW50cyB0byBDQk0gQVNDSUkuCisKKyAgICBAaXRlbSAtYXRhc2NpaQorICAgICAgICAgICAgICBDb252ZXJ0IHN0cmluZy1jb25zdGFudHMgYW5kIGNoYXJhY3Rlci1jb25zdGFudHMgdG8gQXRhcmkgQVNDSUkuCisKKyAgICBAaXRlbSAtaWVlZQorICAgICAgICAgICAgICBVc2UgMzIvNjRiaXQgSUVFRSBmb3JtYXQgZm9yIGZsb2F0aW5nIHBvaW50IHJhdGhlciB0aGFuIHdvemZwIGZvcm1hdC4KKworICAgIEBpdGVtIC1zb2Z0c3RhY2sKKyAgICAgICAgICAgICAgVHJ5IHRvIHVzZSB0aGUgaGFyZHdhcmUgc3RhY2sgYXMgbGl0dGxlIGFzIHBvc3NpYmxlLiBVc2UgdGhpcyBpZiB5b3VyCisgICAgICAgICAgICAgIGhhcmR3YXJlIHN0YWNrIGlzIG92ZXJmbG93aW5nLgorCisgICAgQGl0ZW0gLW1haW5hcmdzCisgICAgICAgICAgICAgIFNvbWUgdGFyZ2V0cyBtYXkgbmVlZCBzcGVjaWFsIGluaXRpYWxpemF0aW9ucyB3aGVuIHVzaW5nIHRoZSBjb21tYW5kCisgICAgICAgICAgICAgIGxpbmUgYXJndW1lbnRzIHRvIG1haW4oKS4gdmJjYyB3aWxsIGVtaXQgYSBjYWxsIHRvIGEgbGlicmFyeSBmdW5jdGlvbgorICAgICAgICAgICAgICB3aGVuIHRob3NlIGFyZSB1c2VkIGFuZCBAY29kZXstbWFpbmFyZ3N9IGlzIHNwZWNpZmllZC4KKworICAgIEBpdGVtIC1uby1iYW5rLXZhcnMKKyAgICAgICAgICAgICAgRG8gbm90IGF1dG9tYXRpY2FsbHkgaGFuZGxlIGFjY2Vzc2VzIHRvIGJhbmtlZCB2YXJpYWJsZXMsIGJ1dCBvbmx5CisgICAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGxzLiBTZWUgY2hhcHRlciBvbiBiYW5raW5nLgorCisgICAgQGl0ZW0gLW1hbnVhbC1iYW5raW5nCisgICAgICAgICAgICAgIERvIG5vdCBhdXRvbWF0aWNhbGx5IGhhbmRsZSBiYW5raW5nLiBVc2VmdWwgaWYgeW91IHdhbnQgdG8gdXNlIHRoZQorICAgICAgICAgICAgICBzZWN0aW9uIG1hcHBpbmcgb2YgdGhlIEBjb2Rle19fYmFua30tYXR0cmlidXRlIG9yIEBjb2RleyNwcmFnbWEgYmFua30KKyAgICAgICAgICAgICAgYnV0IHlvdSBwcmVmZXIgaGFuZGxlIGJhbmsgc3dpdGNoaW5nIHlvdXJzZWxmLgorCisgICAgQGl0ZW0gLWF2b2lkLWJhbmstc3dpdGNoCisgICAgICAgICAgICAgIFByZWZlciBjYWxsaW5nIEBjb2Rle19fYmFua2xvYWQvX19iYW5rc3RvcmV9IGluc3RlYWQgb2YgQGNvZGV7X19iYW5rc3dpdGNofS4KKyAgICAgICAgICAgICAgVXNlZnVsIGZvciBiYW5raW5nIG1lY2hhbmlzbXMgdGhhdCBkbyBub3QgcHJvdmlkZSBxdWljayBzd2l0Y2hpbmcKKyAgICAgICAgICAgICAgb2YgYW4gZW50aXJlIGJhbmsgKGUuZy4gdGhlIEM2NCBSRVUpLgorCisgICAgQGl0ZW0gLWNvbW1vbi1iYW5rbnI9PG4+CisgICAgICAgICAgICAgIFNwZWNpZnkgdGhlIGJhbmsgbnVtYmVyIG9mIHRoZSBjb21tb24gYmFuay4gU2VlIGNoYXB0ZXIgb24gYmFua2luZy4gVGhlCisgICAgICAgICAgICAgIGRlZmF1bHQgbnVtYmVyIGlzIDAuCisKKyAgICBAaXRlbSAtbGFyZ2UKKyAgICAgICAgICAgICAgVXNlIGxhcmdlIG1lbW9yeSBtb2RlbC4gQWxsIHBvaW50ZXJzIHdpbGwgYmUgZmFyIHBvaW50ZXJzLiBBIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgICAgbGlicmFyeSBpcyByZXF1aXJlZC4gVGhpcyBmZWF0dXJlIGlzIGV4cGVyaW1lbnRhbC4KKworICAgIEBpdGVtIC1nbG9iLWFjYworICAgICAgICAgICAgICBCeSBkZWZhdWx0LCB0aGUgcmVnaXN0ZXIgYWxsb2NhdG9yIHdpbGwgb25seSBhc3NpZ24gdGVtcG9yYXJ5CisgICAgICAgICAgICAgIHZhcmlhYmxlcyB0byB0aGUgYWNjdW11bGF0b3IgcmVnaXN0ZXIgb3IgQGNvZGV7YS94fSByZWdpc3RlciBwYWlyLgorICAgICAgICAgICAgICBVc3VhbGx5IHRoaXMgcmVkdWNlcyBuZWNlc3Nhcnkgc3RvcmluZy9sb2FkaW5nIG9mIHRoZSBhY2N1bXVsYXRvcgorICAgICAgICAgICAgICBhcyBpdCBpcyBuZWVkZWQgZHVyaW5nIG1vc3Qgb3BlcmF0aW9ucy4gVGhpcyBvcHRpb24gYWxsb3dzIHRoZQorICAgICAgICAgICAgICByZWdpc3RlciBhbGxvY2F0b3IgdG8gYXNzaWduIHZhcmlhYmxlcyB3aXRoIGJpZ2dlciBsaXZlIHJhbmdlcyB0bworICAgICAgICAgICAgICB0aGUgYWNjdW11bGF0b3IuIFRoaXMgb3B0aW9uIGlzIGxpa2VseSB0byBjcmVhdGUgd29yc2UgY29kZSBpbgorICAgICAgICAgICAgICBtb3N0IGNhc2VzLiBVc2Ugb25seSBmb3IgZXhwZXJpbWVudGF0aW9uLgorCitAZW5kIHRhYmxlCisKK0BzZWN0aW9uIEFCSQorCisgICAgVGhlIGN1cnJlbnQgdmVyc2lvbiBnZW5lcmF0ZXMgYXNzZW1ibGVyIG91dHB1dCBmb3IgdXNlIHdpdGggCisgICAgQGNvbW1hbmR7dmFzbTY1MDJfb2xkc3R5bGV9IG9yICBAY29tbWFuZHt2YXNtNjUwMl9zdGR9LiAKKyAgICBUaGUgb3B0aW9uIEBjb21tYW5key1vcHQtYnJhbmNofSBpcyBuZWVkZWQuCisKKyAgICBUaGUgcmVnaXN0ZXIgbmFtZXMgcHJvdmlkZWQgYnkgdGhpcyBiYWNrZW5kIGFyZToKKworQGV4YW1wbGUKKyAgICAgICAgYSwgc3AsIHIwLi5yMzEsIGJ0bXAwLi5idG1wMworQGVuZCBleGFtcGxlCisKKyAgICAgICAgQGNvZGV7YX0gaXMgdGhlIGFjY3VtdWxhdG9yLiBJdCBjYW4gYmUgdXNlZCBmb3IgdHlwZSBAY29kZXtjaGFyfS4KKworICAgICAgICBAY29kZXtyMH0gLi4uIEBjb2Rle3IzMX0gYXJlIDhiaXQgdmFyaWFibGVzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHR5cGUKKyAgICAgICAgQGNvZGV7Y2hhcn0uIFRoZXkgaGF2ZSB0byBiZSBtYXBwZWQKKyAgICAgICAgdG8gemVybyBwYWdlIGR1cmluZyBsaW5raW5nLiBUaGUgY29tcGlsZXIgZXhwZWN0cyByZWdpc3RlcnMgdGhhdCBjYW4KKyAgICAgICAgYmUgdXNlZCBhcyByZWdpc3RlciBwYWlycyAoc2VlIGJlbG93KSB0byBiZSBtYXBwZWQgdG8gY29udGlndW91cworICAgICAgICBtZW1vcnkgbG9jYXRpb25zLiBTb21lIGxpYnJhcnkgcm91dGluZXMgbWF5IGhhdmUgYWRkaXRpb25hbCByZXF1aXJlbWVudHMuCisKKyAgICAgICAgQGNvZGV7c3B9IGlzIGEgMTZiaXQgdmFyaWFibGUgdGhhdCBoYXMgdG8gYmUgbWFwcGVkIHRvIHplcm8gcGFnZS4gSXQgaXMKKyAgICAgICAgdXNlZCBieSB0aGUgY29tcGlsZXIgYW5kIG5vdCBhdmFpbGFibGUgZm9yIHVzZS4gQGNvZGV7c3B9IG11c3QgYmUKKyAgICAgICAgaW5pdGlhbGl6ZWQgdG8gYSBzdWl0YWJsZSBtZW1vcnkgYXJlYS4gVGhpcyBzdGFjayBpcyB1c2VkIGZvciBsb2NhbCB2YXJpYWJsZXMsCisgICAgICAgIHNhdmVkIHJlZ2lzdGVycyBldGMuIFRoZSBoYXJkd2FyZSBzdGFjayBpcyB1c2VkIG1haW5seSBmb3IgcmV0dXJuIGFkZHJlc3NlcworICAgICAgICBhbmQgc29tZXRpbWVzIHNhdmVkIHJlZ2lzdGVycy4KKworICAgICAgICBAY29kZXtidG1wMH0uLkBjb2Rle2J0bXAzfSBhcmUgMzJiaXQgdmFyaWFibGVzLiBUaGUgY29kZSBnZW5lcmF0ZWQgYnkgdmJjYworICAgICAgICBkb2VzIG5vdCByZXF1aXJlIHRoZW0gaW4gemVybyBwYWdlLCBidXQgdGhlIGN1cnJlbnQgbGlicmFyeSBpbXBsZW1lbnRhdGlvbgorICAgICAgICBleHBlY3RzIHRoZW0gdG8gYmUgbG9jYXRlZCB0byBjb250aWd1b3VzIHplcm8gcGFnZSBsb2NhdGlvbnMuCisKKyAgICAgICAgVGhlIGZvbGxvd2luZyByZWdpc3RlciBwYWlycyBjYW4gYmUgdXNlZCBmb3IKKyAgICAgICAgMTZiaXQgdmFsdWVzLgorCitAZXhhbXBsZQorICAgICAgICBhL3gsIHIwL3IxLCByMi9yMyAuLi4gcjMwL3IzMQorQGVuZCBleGFtcGxlICAgICAgICAKKworICAgICAgIEBjb2Rle2EveH0gY2FuIGJlIHVzZWQgZm9yIHR5cGVzIEBjb2Rle3Nob3J0fSBhbmQgQGNvZGV7aW50fSwgdGhlIG90aGVyCisgICAgICAgcmVnaXN0ZXIgcGFpcnMgY2FuIGFsc28gYmUgdXNlZCBmb3IgcG9pbnRlciB0eXBlcy4KKworICAgICAgICBUaGUgZm9sbG93aW5nIHJlZ2lzdGVyIHBhaXJzIGNhbiBiZSB1c2VkIGZvcgorICAgICAgICA2NGJpdCB2YWx1ZXMgKElFRUUgZG91YmxlcyBvciBsb25nIGxvbmcpLgorCitAZXhhbXBsZQorICAgICAgICBidG1wMC9idG1wMSwgYnRtcDIvYnRtcDMKK0BlbmQgZXhhbXBsZSAgICAgICAgIAorCisKKyAgICAgICBSZWdpc3RlcnMgQGNvZGV7YSwgcjAuLnIxNSwgcjI4Li5yMzEsIGJ0bXAwLi5idG1wM30gYXJlIHZvbGF0aWxlCisgICAgICAgKGkuZS4gdGhleSBjYW4gYmUgZGVzdHJveWVkIGluIGZ1bmN0aW9uIGNhbGxzKS4gQGNvZGV7cjE2Li5yMjd9IGFyZQorICAgICAgIHByZXNlcnZlZCBhY3Jvc3MgZnVuY3Rpb24gY2FsbHMuICAgCisKKyAgICAgICBAY29kZXtyMC4ucjd9IGFyZSB1c2VkIGZvciBwYXNzaW5nIGZ1bmN0aW9uIGFyZ3VtZW50cyBvZiB0eXBlCisgICAgICAgQGNvZGV7Y2hhciwgc2hvcnQsIGludH0gYW5kIHBvaW50ZXIgdHlwZXMuIEBjb2Rle2J0bXAwLi5idG1wM30gYXJlCisgICAgICAgdXNlZCBmb3IgcGFzc2luZyBhcmd1bWVudHMgb2YgdHlwZSBAY29kZXtsb25nLCBsb25nIGxvbmcsIGZsb2F0LCBkb3VibGUsCisgICAgICAgbG9uZyBkb3VibGV9IGFuZCBmYXIgcG9pbnRlcnMuIEFsbCBvdGhlciB0eXBlcyBhcmUgcGFzc2VkIG9uIHRoZSBzdGFjay4KKworICAgICAgIEZvciBmdW5jdGlvbnMgd2l0aCBhIHZhcmlhYmxlLWFyZ3VtZW50LWxpc3QsIGFyZ3VtZW50cyB0aGF0IGFyZSBwYXJ0CisgICAgICAgb2YgdGhlIHZhcmlhYmxlLWFyZ3VtZW50LWxpc3QgYXJlIGFsd2F5cyBwYXNzZWQgb24gdGhlIHN0YWNrLiBJdCBpcworICAgICAgIHRoZXJlZm9yZSByZXF1aXJlZCB0aGF0IGEgcHJvdG90eXBlIGlzIGluIHNjb3BlIHdoZW4gY2FsbGluZyBzdWNoIGZ1bmN0aW9ucworICAgICAgIChhcyByZXF1aXJlZCBieSBDKS4KKworICAgICAgIFNjYWxhciB0eXBlcyBhcmUgcmV0dXJuZWQgYXMgZm9sbG93czoKK0BleGFtcGxlCisgICAgdHlwZSAgICAgICAgcmVnaXN0ZXJzCisKKyAgICBjaGFyICAgICAgICBhCisgICAgc2hvcnQgICAgICAgYS94CisgICAgaW50ICAgICAgICAgYS94CisgICAgbG9uZyAgICAgICAgYnRtcDAKKyAgICBsb25nIGxvbmcgICBuL2EKKyAgICBwb2ludGVycyAgICBhL3gKKyAgICBmYXItcG9pbnRlciBidG1wMAorICAgIGZsb2F0ICAgICAgIGJ0bXAwCisgICAgZG91YmxlICAgICAgYnRtcDAgb3IgYnRtcDAvYnRtcDEgKElFRUUpCisgICAgbG9uZyBkb3VibGUgYnRtcDAgb3IgYnRtcDAvYnRtcDEgKElFRUUpCitAZW5kIGV4YW1wbGUKKworICAgICAgIEFsbCBvdGhlciB0eXBlcyBhcmUgcmV0dXJuZWQgYnkgcGFzc2luZyB0aGUgZnVuY3Rpb24gdGhlIGFkZHJlc3MKKyAgICAgICBvZiB0aGUgcmVzdWx0IGFzIGEgaGlkZGVuIGFyZ3VtZW50IC0gc3VjaCBhIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGNhbGxlZAorICAgICAgIHdpdGhvdXQgYSBwcm9wZXIgZGVjbGFyYXRpb24gaW4gc2NvcGUuCisKK1RoZSBiYXNpYyBkYXRhIHR5cGVzIGFyZSByZXByZXNlbnRlZCBsaWtlIHRoaXM6CisKK0BleGFtcGxlCisgICAgdHlwZSAgICAgICAgc2l6ZSBpbiBiaXRzICAgICAgICBhbGlnbm1lbnQgaW4gYnl0ZXMKKworICAgIGNoYXIgICAgICAgICAgICAgICAgOCAgICAgICAgICAgICAgICAgICAgICAgMQorICAgIHNob3J0ICAgICAgICAgICAgICAxNiAgICAgICAgICAgICAgICAgICAgICAgMQorICAgIGludCAgICAgICAgICAgICAgICAxNiAgICAgICAgICAgICAgICAgICAgICAgMQorICAgIGxvbmcgICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgICAgMQorICAgIGxvbmcgbG9uZyAgICAgICAgICA2NCAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAoY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQpCisgICAgbmVhciBwb2ludGVycyAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgICAxCisgICAgZmFyIHBvaW50ZXJzICAgICAgIDI0ICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgIAorICAgIGZsb2F0ICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICBzZWUgYmVsb3cKKyAgICBkb3VibGUgICAgICAgICAgICAgMzIvNjQgICAgICAgICAgICAgICAgICAgIDEgICAgICAgc2VlIGJlbG93CisgICAgbG9uZyBkb3VibGUgICAgICAgIDMyLzY0ICAgICAgICAgICAgICAgICAgICAxICAgICAgIHNlZSBiZWxvdworQGVuZCBleGFtcGxlCisKKworQHNlY3Rpb24gTWF0aAorCisKKyAgICBGb3IgY2VydGFpbiBvcGVyYXRpb25zIEBjb2Rle3ZiY2N9IHdpbGwgZW1pdCBjYWxscyB0byByb3V0aW5lcyB0aGF0IGhhdmUKKyAgICB0byBiZSBwcm92aWRlZCBieSBhIGxpYnJhcnkuCisgICAgRm9yIGludGVnZXIgY29kZSwgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGFyZSBoYW5kbGVkIGJ5IGxpYnJhcnkgcm91dGluZXMKKyAgICAoc29tZSBzcGVjaWFsIGNhc2VzIGludm9sdmluZyBjb25zdGFudHMgbWF5IGJlIGhhbmRsZWQgYnkgaW5saW5lIGNvZGUpLgorCitAZXhhbXBsZQorICAgICBfX211bGludDE2ICAgICAgICAgICAgICAgICAxNngxNj0+MTYgbXVsdGlwbGljYXRpb24KKyAgICAgX19tdWxpbnQzMiAgICAgICAgICAgICAgICAgMzJ4MzI9PjMyIG11bHRpcGxpY2F0aW9uCisgICAgIF9fZGl2aW50MTYgICAgICAgICAgICAgICAgIDE2eDE2PT4xNiBzaWduZWQgZGl2aXNpb24KKyAgICAgX19kaXZpbnQzMiAgICAgICAgICAgICAgICAgMzJ4MzI9PjMyIHNpZ25lZCBkaXZpc2lvbgorICAgICBfX2RpdnVpbnQxNiAgICAgICAgICAgICAgICAxNngxNj0+MTYgdW5zaWduZWQgZGl2aXNpb24KKyAgICAgX19kaXZ1aW50MzIgICAgICAgICAgICAgICAgMzJ4MzI9PjMyIHVuc2lnbmVkIGRpdmlzaW9uCisgICAgIF9fbW9kaW50MTYgICAgICAgICAgICAgICAgIDE2eDE2PT4xNiBzaWduZWQgbW9kdWxvCisgICAgIF9fbW9kaW50MzIgICAgICAgICAgICAgICAgIDMyeDMyPT4zMiBzaWduZWQgbW9kdWxvCisgICAgIF9fbW9kdWludDE2ICAgICAgICAgICAgICAgIDE2eDE2PT4xNiB1bnNpZ25lZCBtb2R1bG8KKyAgICAgX19tb2R1aW50MzIgICAgICAgICAgICAgICAgMzJ4MzI9PjMyIHVuc2lnbmVkIG1vZHVsbworQGVuZCBleGFtcGxlCisKK0BzdWJzZWN0aW9uIEZsb2F0aW5nIFBvaW50CisKKyAgICBCeSBkZWZhdWx0LCBhbGwgZmxvYXRpbmcgcG9pbnQgdHlwZXMgYXJlIGltcGxlbWVudGVkIGFzIDMyYml0IHZhbHVlcy4KKyAgICBUaGUgZm9ybWF0IHVzZWQgYnkgdGhlIGZsb2F0aW5nIHBvaW50IHJvdXRpbmVzIHB1Ymxpc2hlZCBieSBSb3kgUmFua2luCisgICAgYW5kIFN0ZXZlIFdvem5pYWsgaXMgdXNlZC4gV2hpbGUgdGhpcyBkb2VzIHdvcmsgZm9yIG1hbnkgdXNlIGNhc2VzLCBpdAorICAgIGlzIG5vdCBmdWxseSBDIGNvbXBsaWFudCBieSBhbnkgbWVhbnMuIENhbGN1bGF0aW9uIG9mIGNvbnN0YW50cyBpbiB0aGUKKyAgICBjb21waWxlciBpcyBub3QgZG9uZSBpbiB0aGF0IGZvcm1hdC4gVGhlcmVmb3JlLCB0aGUgcmVzdWx0cyBvZgorICAgIGNhbGN1bGF0aW9ucyBkb25lIGF0IGNvbXBpbGUtdGltZSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhvc2UgYXQgcnVuLXRpbWUuCisgICAgVGhlIGNvcnJlc3BvbmRpbmcgbWF0aCBsaWJyYXJ5IG11c3QgYmUgbGlua2VkIHVzaW5nIEBjb2Rley1sbX0uCisKKyAgICBBcyBhbiBhbHRlcm5hdGl2ZSwgQGNvZGV7dmJjY30gY2FuIHVzZSBJRUVFIGZvcm1hdCBieSBzcGVjaWZ5aW5nCisgICAgQGNvZGV7LWllZWV9LiBUaGlzIHdpbGwgc29sdmUgdGhlIHByb2JsZW1zIG1lbnRpb25lZCBhYm92ZSBhbmQgcHJvdmlkZQorICAgIGFjY3VyYXRlIHJlc3VsdHMgdXNpbmcgdGhlIFNBTkUgZmxvYXRpbmcgcG9pbnQgZW52aXJvbm1lbnQuIEhvd2V2ZXIsCisgICAgdGhlc2Ugcm91dGluZXMgYXJlIHNsb3dlciBhbmQgbXVjaCBiaWdnZXIuIEFsc28sIHlvdSBtYXkgaGF2ZSB0byBjbGFyaWZ5CisgICAgdGhlaXIgbGVnYWwgc3RhdHVzIGJlZm9yZSB1c2luZyB0aGVtLiBUaGUgSUVFRSByb3V0aW5lcyB3aWxsIGxpa2VseSBub3QKKyAgICB3b3JrIHdoZW4gcnVubmluZyBmcm9tIFJPTS4KKworICAgIEluIGFkZGl0aW9uIHRvIEBjb2Rley1pZWVlfSwgdGhlIFNBTkUgbGlicmFyeSBoYXMgdG8gYmUgbGlua2VyIHVzaW5nCisgICAgQGNvZGV7LWxtaWVlZX0uCisKKyAgICBXaGVuIHVzaW5nIGZsb2F0aW5nIHBvaW50LCB0aGUgZm9sbG93aW5nIGxpYnJhcnkgcm91dGluZXMgYXJlIG5lZWRlZAorICAgICh3aXRob3V0IEBjb2Rley1pZWVlfSk6CisKK0BleGFtcGxlCisgICAgX19hZGRmbHQzMiAgICAgICAgICAgICAgICAgZmxvYXRpbmcgcG9pbnQgYWRkaXRpb24KKyAgICBfX3N1YmZsdDMyICAgICAgICAgICAgICAgICBmbG9hdGluZyBwb2ludCBzdWJ0cmFjdGlvbgorICAgIF9fbXVsZmx0MzIgICAgICAgICAgICAgICAgIGZsb2F0aW5nIHBvaW50IG11bHRpcGxpY2F0aW9uCisgICAgX19kaXZmbHQzMiAgICAgICAgICAgICAgICAgZmxvYXRpbmcgcG9pbnQgZGl2aXNpb24KKyAgICBfX25lZ2ZsdDMyICAgICAgICAgICAgICAgICBmbG9hdGluZyBwb2ludCBuZWdhdGlvbiAoLXgpCisgICAgX19jbXBzZmx0MzIgICAgICAgICAgICAgICAgZmxvYXRpbmcgcG9pbnQgY29tcGFyaXNvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRzIEBjb2Rle2F9IHRvIHBvcy4sIG5lZy4gb3IgemVybywgZGVwZW5kaW5nIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbXBhcmlzb24gcmVzdWx0KQorICAgIF9fc2ludDE2dG9mbHQzMiAgICAgICAgICAgIGNvbnZlcnQgc2lnbmVkIDE2Yml0IGludGVnZXIgdG8gZmxvYXRpbmcgcG9pbnQKKyAgICBfX3VpbnQxNnRvZmx0MzIgICAgICAgICAgICBjb252ZXJ0IHVuc2lnbmVkIDE2Yml0IGludGVnZXIgdG8gZmxvYXRpbmcgcG9pbnQKKyAgICBfX3NpbnQzMnRvZmx0MzIgICAgICAgICAgICBjb252ZXJ0IHNpZ25lZCAzMmJpdCBpbnRlZ2VyIHRvIGZsb2F0aW5nIHBvaW50CisgICAgX191aW50MzJ0b2ZsdDMyICAgICAgICAgICAgY29udmVydCB1bnNpZ25lZCAzMmJpdCBpbnRlZ2VyIHRvIGZsb2F0aW5nIHBvaW50CisgICAgX19mbHQzMnRvc2ludDE2ICAgICAgICAgICAgY29udmVydCBmbG9hdGluZyBwb2ludCB2YWx1ZSB0byBzaWduZWQgMTZiaXQgaW50ZWdlcgorICAgIF9fZmx0MzJ0b3VpbnQxNiAgICAgICAgICAgIGNvbnZlcnQgZmxvYXRpbmcgcG9pbnQgdmFsdWUgdG8gdW5zaWduZWQgMTZiaXQgaW50ZWdlcgorICAgIF9fZmx0MzJ0b3NpbnQzMiAgICAgICAgICAgIGNvbnZlcnQgZmxvYXRpbmcgcG9pbnQgdmFsdWUgdG8gc2lnbmVkIDMyYml0IGludGVnZXIKKyAgICBfX2ZsdDMydG91aW50MzIgICAgICAgICAgICBjb252ZXJ0IGZsb2F0aW5nIHBvaW50IHZhbHVlIHRvIHVuc2lnbmVkIDMyYml0IGludGVnZXIKK0BlbmQgZXhhbXBsZQorCisgICAgIEZ1cnRoZXIgbWF0aCBsaWJyYXJ5IGZ1bmN0aW9ucyBtYXkgYmUgbmVlZGVkIGJ5IHVzZXIgY29kZSBvciB0aGUgQyBsaWJyYXJ5LgorCisKKworQHNlY3Rpb24gVGFyZ2V0LVNwZWNpZmljIFZhcmlhYmxlIEF0dHJpYnV0ZXMKKworICAgIFRoaXMgYmFja2VuZCBvZmZlcnMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZSBhdHRyaWJ1dGVzOgorCitAdGFibGUgQGNvZGUKKyAgICBAaXRlbSBfX2ludGVycnVwdAorICAgICAgICAgIFVzZWQgZm9yIHdyaXRpbmcgaW50ZXJydXB0IGhhbmRsZXJzLiBBbGwgdXNlZCByZWdpc3RlcnMKKyAgICAgICAgICAoaW5jbHVkaW5nIHZvbGF0aWxlcyBhbmQgYWNjdW11bGF0b3IpIGFyZSBzYXZlZC9yZXN0b3JlZCBhbmQKKyAgICAgICAgICBAY29kZXtydGl9IGlzIHVzZWQgdG8gbGVhdmUgdGhlIGZ1bmN0aW9uLiBBbHNvLCB0aGUgdXNlciBzdGFjaworICAgICAgICAgIHBvaW50ZXIgaXMgc2V0IHRvIEBjb2Rle19faXNyc3RhY2t9LiBUaGlzIHZhbHVlIGZvciB0aGUgaW50ZXJydXB0CisgICAgICAgICAgc3RhY2sgaGFzIHRvIGJlIHByb3ZpZGVkIGUuZy4gYnkgdGhlIGxpbmtlciBzY3JpcHQuCisKKyAgICBAaXRlbSBfX3pwYWdlCisgICAgICAgICAgICAgIFBsYWNlIHZhcmlhYmxlIGluIHNlY3Rpb24gQGNvZGV7enBhZ2V9IGFuZCBpbnN0cnVjdCBAY29kZXt2YmNjfQorICAgICAgICAgICAgICB0byB1c2UgaXQgd2l0aCB6ZXJvLXBhZ2UgYWRkcmVzc2luZy4KKworICAgIEBpdGVtIF9fbm9jcHIKKyAgICAgICAgICBUdXJuIG9mZiBjb2RlIGNvbXByZXNzaW9uIGZvciB0aGlzIGZ1bmN0aW9uIGV2ZW4gaWYgQGNvZGV7LXNpemV9IGlzIHVzZWQuCisgICAgICAgICAgVXNlZnVsIGZvciB0aW1lLWNyaXRpY2FsIGZ1bmN0aW9ucy4KKworICAgIEBpdGVtIF9fYmFuayg8bj4pCisgICAgICAgICAgUGxhY2UgdGhlIHZhcmlhYmxlL2Z1bmN0aW9uIGluIGJhbmsgbi4gU2VlIGNoYXB0ZXIgb24gYmFua2luZyBmb3IgZGV0YWlscy4KKworQGVuZCB0YWJsZQorCitAc2VjdGlvbiBUYXJnZXQtU3BlY2lmaWMgI3ByYWdtYXMKKworICAgIFRoaXMgYmFja2VuZCBvZmZlcnMgdGhlIGZvbGxvd2luZyAjcHJhZ21hcworCitAdGFibGUgQGNvZGUKKyAgICBAaXRlbSAjcHJhZ21hIHNlY3Rpb24gPHNlYz4KKyAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBhcmUgcGxhY2VkIGluIHNlY3Rpb24gPHNlYz4uCisKKyAgICBAaXRlbSAjcHJhZ21hIHNlY3Rpb24gZGVmYXVsdAorICAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGFyZSBwbGFjZWQgaW4gZGVmYXVsdCBzZWN0aW9ucy4KKworICAgIEBpdGVtICNwcmFnbWEgYmFuayA8bj4KKyAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBhcmUgcGxhY2VkIGluIGJhbmsgPG4+LiBTZWUgdGhlCisgICAgICAgICAgICAgIGNoYXB0ZXIgb24gYmFua2luZyBmb3IgZGV0YWlscy4KKworICAgIEBpdGVtICNwcmFnbWEgYmFuayAtMQorICAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGFyZSBwbGFjZWQgaW4gdGhlIGRlZmF1bHQgYmFuay4gU2VlIHRoZQorICAgICAgICAgICAgICBjaGFwdGVyIG9uIGJhbmtpbmcgZm9yIGRldGFpbHMuCisKK0BlbmQgdGFibGUKKworCitAc2VjdGlvbiBQcmVkZWZpbmVkIE1hY3JvcworCisgICAgICAgIFRoaXMgYmFja2VuZCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgbWFjcm9zOgorCitAdGFibGUgQGNvZGUKKyAgICAgICAgQGl0ZW0gX182NTAyX18KKyAgICAgICAgCisgICAgICAgIEBpdGVtIF9fU0laRV9UX0lOVAorCitAZW5kIHRhYmxlCisKKworQHNlY3Rpb24gU3RhY2sKKworICAgIExvY2FsIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb24gYXJndW1lbnRzIGFyZSBwdXQgb24gdGhlIHVzZXIgc3RhY2suIEl0CisgICAgY2FuIGJlIHVwIHRvIDY0S0IsIGJ1dCBhY2Nlc3NpbmcgdmFyaWFibGVzIG91dHNpZGUgdGhlIGxvd2VyIDI1NiBieXRlcworICAgIGlzIHNpZ25pZmljYW50bHkgc2xvd2VyLiBAY29kZXt2YmNjfSB3aWxsIHB1dCBzbWFsbCB2YXJpYWJsZXMgb24gbG93ZXIKKyAgICBvZmZzZXRzIHRvIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgdmFyaWFibGVzIHRoYXQgY2FuIGJlIGFkZHJlc3NlZCBmYXN0LgorICAgIEhvd2V2ZXIsIGFjY2Vzc2luZyB0aGUgc3RhY2sgaXMgYWx3YXlzIHJhdGhlciBzbG93IG9uIHRoZSA2NTAyLgorCisgICAgVGhlIHN0YWNrIHBvaW50ZXIgaXMgYWRqdXN0ZWQgb25jZSBkdXJpbmcgZnVuY3Rpb24gZW50cnkvZXhpdCB0byBhdm9pZAorICAgIG11bHRpcGxlIGNvc3RseSBhZGp1c3RtZW50cyB0byB0aGUgc3RhY2sgcG9pbnRlci4KKworICAgIFZhcmlhYmxlLWxlbmd0aC1hcnJheXMgYXMgc3BlY2lmaWVkIGluIGM5OSBzaG91bGQgYmUgZnVsbHkgc3VwcG9ydGVkLgorCisKK0BzZWN0aW9uIEJhbmtpbmcKKworICAgIE1hbnkgNjUwMiBzeXN0ZW1zIG9mZmVyL25lZWQgZGlmZmVyZW50IGJhbmtpbmcgbWVjaGFuaXNtcy4gdmJjYyBvZmZlcnMgZGlmZmVyZW50CisgICAgbGV2ZWxzIG9mIHN1cHBvcnQgZm9yIHRob3NlIHNjaGVtZXMuIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IGludGVncmF0aW9uLCBtb3JlCisgICAgb3IgbGVzcyBzdXBwb3J0IGlzIG9mZmVyZWQuCisKK0BzdWJzZWN0aW9uIE1hbnVhbCBCYW5raW5nCisKKyAgICBCYW5raW5nIGNhbiB1c3VhbGx5IGJlIGltcGxlbWVudGVkIG1hbnVhbGx5IGlmIHRoZXJlIGlzIG5vIHN1aXRhYmxlIHRhcmdldAorICAgIGludGVncmF0aW9uIG9yIGlmIG1hbnVhbCBvcHRpbWl6YXRpb24gaXMgcHJlZmVycmVkLgorCisgICAgRm9yIG1hbnVhbCBiYW5raW5nLCBmdW5jdGlvbnMgYW5kL29yIGRhdGEgY2FuIGJlIG1hcHBlZCB0byBzZWN0aW9ucyB1c2luZworICAgIHRoZSBAY29kZXtzZWN0aW9ufSBhdHRyaWJ1dGUgb3IgdGhlIEBjb2RleyNwcmFnbWEgc2VjdGlvbn0gZGlyZWN0aXZlLiBOb3RlIHRoYXQKKyAgICBzdHJpbmcgY29uc3RhbnRzIHdpbGwgYmUgbWFwcGVkIHRvIGJhbmtlZCBtZW1vcnkgb25seSB3aGVuIHVzaW5nIHRoZSBAY29kZXsjcHJhZ21hfQorICAgIGFwcHJvYWNoLgorCisgICAgQWZ0ZXIgcGxhY2luZyB0aGUgb2JqZWN0cyBpbiBzdWl0YWJsZSBzZWN0aW9ucywgdGhleSBoYXZlIHRvIGJlIGxvY2F0ZWQgdXNpbmcgYQorICAgIGxpbmtlciBjb21tYW5kIGZpbGUuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbiB2bGluay4gU3dpdGNoaW5nIGJldHdlZW4gYmFua3MgaGFzCisgICAgdG8gZG9uZSBtYW51YWxseSBpbiBhIHN5c3RlbS1zcGVjaWZpYyB3YXkuCisKKyAgICBJZiBpbml0aWFsaXplZCB2YXJpYWJsZXMgYXJlIG1hcHBlZCBpbnRvIGJhbmtlZCBzZWN0aW9ucywgYmUgYXdhcmUgdGhhdCB5b3UgbWF5IGhhdmUKKyAgICB0byBwcm92aWRlIG1lYW5zIHRvIGluaXRpYWxpemUgdGhlbSBvbiBzdGFydHVwLiBJdCBpcyBwcm9iYWJseSBub3QgaGFuZGxlZCBieQorICAgIHN0YXJ0dXAgY29kZSBmb3Igbm9uLWJhbmtlZCBzeXN0ZW1zLiBUaGlzIGlzIG5vdCByZWxldmFudCBmb3Igc3lzdGVtcyB0aGF0IG9ubHkKKyAgICBwcm92aWRlIGJhbmtlZCBST00uCisgICAgCisKK0BzdWJzZWN0aW9uIEF1dG9tYXRlZCBCYW5raW5nCisKKyAgICBJZiBhIHN1aXRhYmxlIHRhcmdldCBpbnRlZ3JhdGlvbiBpcyBhdmFpbGFibGUsIHZiY2MgaXMgYWJsZSB0byBhdXRvbWF0aWNhbGx5CisgICAgaGFuZGxlIGJhbmsgc3dpdGNoaW5nLgorCitAc3Vic3Vic2VjdGlvbiBNZW1vcnkgTW9kZWwKKworICAgIHZiY2MgYXNzdW1lcyBhIG1lbW9yeSBtb2RlbCB3aGljaCBwcm92aWRlcyBub24tYmFua2VkCisgICAgbWVtb3J5IGZvciBjb2RlIGFuZCBkYXRhIHRoYXQgaXMgYWx3YXlzIHZpc2libGUuIEFkZGl0aW9uYWxseSB0aGVyZSBjYW4gYmUgYQorICAgIG51bWJlciBvZiB1cCB0byAyNTUgbWVtb3J5IGJhbmtzLCBvbmUgb2Ygd2hpY2ggY2FuIGJlIHZpc2libGUgYXQgYSB0aW1lLgorCisgICAgSWYgc2V2ZXJhbCBiYW5rcyBjYW4gYmUgdmlzaWJsZSBhdCB0aGUgc2FtZSB0aW1lLCB0aGlzIHdpbGwgYWxzbyB3b3JrLCBidXQgdmJjYworICAgIGRvZXMgbm90IG1ha2UgdXNlIG9mIHRoaXMgZmVhdHVyZS4KKworQHN1YnN1YnNlY3Rpb24gTWFwcGluZworCisgICAgQ29kZS9kYXRhIGNhbiBiZSBwdXQgaW50byBiYW5rcyB1c2luZyB0aGUgQGNvZGV7YmFua30tYXR0cmlidXRlIG9yIAorICAgIEBjb2RleyNwcmFnbWEgYmFua30uIE5vdGUgdGhhdCBzdHJpbmcgY29uc3RhbnRzIHdpbGwgYmUgbWFwcGVkIHRvIGJhbmtlZCBtZW1vcnkgb25seQorICAgIHdoZW4gdXNpbmcgdGhlIEBjb2RleyNwcmFnbWF9IGFwcHJvYWNoLiBDb2RlL2RhdGEgbm90IG1hcHBlZCB0byBhIGJhbmsgd2lsbCBiZQorICAgIG1hcHBlZCB0byB0aGUgYWx3YXlzIHZpc2libGUgbm9uLWJhbmtlZCBhcmVhLgorCisgICAgQmFua2VkIG9iamVjdHMgd2lsbCBiZSBtYXBwZWQgdG8gc2VjdGlvbnMgc3VmZml4ZWQgd2l0aCB0aGUgYmFuayBudW1iZXIsIGUuZy4gaW4KKworQGV4YW1wbGUKK19fYmFuaygwKSBpbnQgaSA9IDE7CitfX2JhbmsoMSkgdm9pZCBmKCkgeyB9CitAZW5kIGV4YW1wbGUKKworICAgIEBjb2Rle2l9IHdpbGwgYmUgcHV0IGludG8gc2VjdGlvbiBAY29kZXtkYXRhMH0gYW5kIEBjb2Rle2Z9IHdpbGwgYmUgcHV0CisgICAgaW50byBzZWN0aW9uIEBjb2Rle3RleHQxfS4KKworQHN1YnN1YnNlY3Rpb24gQmFuayBTd2l0Y2hpbmcKKworICAgIHZiY2Mgd2lsbCB0cnkgdG8gZGV0ZXJtaW5lIHdoZW4gYSBiYW5rIHN3aXRjaCBoYXMgdG8KKyAgICBiZSBtYWRlIGFuZCBpdCB3aWxsIGNhbGwgbGlicmFyeSBmdW5jdGlvbnMgdG8gbWFwIGluIHRoZSByZXF1aXJlZCBkYXRhLiBUaGlzCisgICAgcmVxdWlyZXMgdGhhdCB3aGVuIGFjY2Vzc2luZyBhbiBvYmplY3QsIHZiY2MgaGFzIHRvIGtub3cgd2hpY2ggYmFuayB0aGUgb2JqZWN0IGlzCisgICAgYXNzaWduZWQgdG8uIFRoZXJlZm9yZSBhIGRlY2xhcmF0aW9uIHNwZWNpZnlpbmcgdGhlIGNvcnJlY3QgYmFuayBudW1iZXIgKGVpdGhlcgorICAgIHVzaW5nIHRoZSBAY29kZXtfX2JhbmsoKX0tYXR0cmlidXRlIG9yIEBjb2RleyNwcmFnbWEgYmFua30pLiBJZiBhbiBvYmplY3QgaXMKKyAgICBhY2Nlc3NlZCB3aGljaCBoYXMgbm90IGJlZW4gZGVjbGFyZWQgd2l0aCBhIGJhbmsgbnVtYmVyLCBpdCBpcyBhc3N1bWVkIHRoYXQgaXQKKyAgICBjYW4gYmUgYWNjZXNzZWQgd2l0aG91dCBiYW5rIHN3aXRjaGluZy4KKworQHN1YnN1YnNlY3Rpb24gRmFyIFBvaW50ZXJzCisKKyAgICBXaGVuIGFjY2Vzc2luZyBhbiBvYmplY3QgdGhyb3VnaCBhIG5vcm1hbCBwb2ludGVyLCB0aGUgYmFuayBudW1iZXIgaXMgbm90IGtub3duLgorICAgIEFsbCBhY2Nlc3NlcyB0aHJvdWdoIG5vcm1hbCBwb2ludGVycyBhc3N1bWUgdGhhdCB0aGUgdGFyZ2V0IGlzIGFsd2F5cyB2aXNpYmxlLgorICAgIEZvciBhbGwgb3RoZXIgY2FzZXMsIGZhci1vaW50ZXJzIGhhdmUgdG8gYmUgdXNlZC4gRmFyLXBvaW50ZXJzIGNvbnRhaW4gdGhlIGJhbmsgbnVtYmVyCisgICAgYXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgcmVzdWx0aW5nIGluIGEgc2l6ZSBvZiAzIGJ5dGVzLgorCisgICAgVGhleSBhcmUgZGVjbGFyZWQgdXNpbmcgdGhlIEBjb2Rle19fZmFyfS1xdWFsaWZpZXIuIEBjb2Rle19fZmFyfSBpcyB1c2VkIGxpa2UgYSB0eXBlCisgICAgcXVhbGlmaWVyLCBzaW1pbGFyIHRvIEBjb2Rle2NvbnN0fS4KKworQGV4YW1wbGUKKyAgICAgICBfX2JhbmsoMCkgaTA7CisgICAgICAgX19iYW5rKDEpIGkxOworICAgICAgIF9fZmFyIGludCAqZnA7CisgICAgICAgLi4uCisKKyAgICAgICBpZiguLikKKyAgICAgICAgIGZwID0gJmkwOworICAgICAgIGVsc2UKKyAgICAgICAgIGZwID0gJmkxOworQGVuZCBleGFtcGxlCisgICAgCisgICAgQ29udmVydGluZyBhIGZhci1wb2ludGVyIHRvIGEgbm9ybWFsIHBvaW50ZXIgd2lsbCBsb29zZSB0aGUgYmFuayBpbmZvcm1hdGlvbi4KKyAgICBDb252ZXJ0aW5nIGEgbm9ybWFsIHBvaW50ZXIgdG8gYSBmYXItcG9pbnRlciB3aWxsIGluc2VydCB0aGUgYmFuayBudW1iZXIgb2YgdGhlIGN1cnJlbnQKKyAgICBmdW5jdGlvbi4gQ2FyZSBtdXN0IGJlIHRha2VuIG5vdCB0byBsb29zZSBiYW5rIGluZm9ybWF0aW9uIHdoZW4gd29ya2luZyB3aXRoCisgICAgcG9pbnRlcnMuCisKK0BzdWJzdWJzZWN0aW9uIFBlcmZvcm1hbmNlIENvbnNpZGVyYXRpb25zCisKKyAgIEFjY2Vzc2luZyBvYmplY3RzIHRocm91Z2ggYmFuayBzd2l0Y2hpbmcgZ2VuZXJhdGVzIG11Y2ggc2xvd2VyIGFuZCBsYXJnZXIgY29kZSB0aGFuCisgICBkaXJlY3QgYWNjZXNzZXMuIFRoZXJlZm9yZSBpdCBpcyBjcnVjaWFsIHRvIG9yZ2FuaXplIHlvdXIgb2JqZWN0cyBpbiBhIHdheSB0aGF0IAorICAgcmVkdWNlcyB0YXNrIHN3aXRjaGVzIGFzIG11Y2ggYXMgcG9zc2libGUuIEZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgaGludHMgYW5kCisgICBleHBsYW5hdGlvbnMuCisKK0BpdGVtaXplCitAaXRlbSBVc2luZyBmYXIgcG9pbnRlcnMgd2lsbCBhbHdheXMgaW5jdXIgb3ZlcmhlYWQuIFRyeSB0byB1c2UgdGhlbSBvbmx5IHdoZW4KKyAgICAgIG5lY2Vzc2FyeS4KKworQGl0ZW0gQWNjZXNzaW5nIG9iamVjdHMgZnJvbSB0aGUgbm9uLWJhbmtlZCBhcmVhIGlzIGFsd2F5cyBmYXN0ICh1bmxlc3MgZG9uZSB0aHJvdWdoCisgICAgICBmYXItcG9pbnRlcnMpLgorCitAaXRlbSBBY2Nlc3Npbmcgb2JqZWN0cyBmcm9tIHRoZSBzYW1lIGJhbmsgdGhlIGZ1bmN0aW9uIGlzIG1hcHBlZCB0byBpcyB1c3VhbGx5IGZhc3QKKyAgICAgICh1bmxlc3MgZG9uZSB0aHJvdWdoIGZhci1wb2ludGVycykuCisKK0BpdGVtIEFjY2Vzc2luZyBiYW5rZWQgb2JqZWN0cyBmcm9tIG5vbi1iYW5rZWQgY29kZSBpcyB1c3VhbGx5IGZhc3RlciB0aGFuIGFjY2Vzc2luZworICAgICAgdGhlbSBmcm9tIGJhbmtlZCBjb2RlIGluIGFub3RoZXIgYmFuay4KKworQGl0ZW0gQ2FsbGluZyBmdW5jdGlvbnMgaW4gYW5vdGhlciBiYW5rIGlzIGEgcmVhc29uYWJseSBzbWFsbCBvdmVyaGVhZCBvbiBzeXN0ZW1zIHdpdGggYQorICAgICAgZmFzdCBiYW5rIHN3aXRjaC4gSXQgY2FuIGJlIG11Y2ggbW9yZSBvdmVyaGVhZCBvbiBSQU0gZXhwYW5zaW9ucyB0aGF0IGhhdmUgdG8KKyAgICAgIGNvcHkgY29kZS4KKworQGl0ZW0gQmUgY2FyZWZ1bCB3aGVuIHVzaW5nIGZ1bmN0aW9uIGlubGluaW5nLiBJbmxpbmVkIGNvZGUgd2lsbCBiZSBleGVjdXRlZCBpbgorICAgICAgdGhlIGJhbmsgb2YgdGhlIGNhbGxlci4KK0BlbmQgaXRlbWl6ZQorCitJbiBnZW5lcmFsLCB0cnkgdG8gcmVkdWNlIGNyb3NzLWJhbmsgYWNjZXNzZXMgYW5kIGZhci1wb2ludGVyIHVzYWdlIGFzIG11Y2ggYXMgcG9zc2libGUuCitGb3IgYmVzdCBwZXJmb3JtYW5jZSB5b3UgY2FuIGFsd2F5cyBvbmx5IHVzZSB0aGUgQGNvZGV7c2VjdGlvbn0tZmVhdHVyZXMgdG8gbWFwIGV2ZXJ5dGhpbmcKK2FuZCBoYW5kbGUgYWxsIGJhbmstc3dpdGNoaW5nIHlvdXJzZWxmLgorCitAc3Vic3Vic2VjdGlvbiBMaWJyYXJ5CisKK1RvIHVzZSB0aGUgYXV0b21hdGVkIGJhbmsgc3dpdGNoaW5nLCBhIHNlcmllcyBvZiBsaWJyYXJ5IGZ1bmN0aW9ucyBtdXN0IGJlIGF2YWlsYWJsZQorKFRPRE86IGFkZCBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uLCBtYXkgY2hhbmdlKToKKworCitAdGFibGUgQGNvZGUKK0BpdGVtIF9fX2Jhbmtzd2l0Y2gKKyAgICAgIE1ha2UgdGhlIGJhbmsgaW4gQGNvZGV7eX0gYWNjZXNzaWJsZS4KKworQGl0ZW0gX19fYmFua2pzcgorICAgICAgQ2FsbCB0aGUgZnVuY3Rpb24gcG9pbnRlciBAY29kZXtyMzAvcjMxfSBpbiBiYW5rIEBjb2Rle3l9LiBSZXR1cm4gdG8gdGhlIGNhbGxlcgorICAgICAgaW4gYmFuayBAY29kZXthfS4KKworQGl0ZW0gX19fYmFua2xvYWQ8bj4gKG49MSwyLDMsNCw4KQorICAgICAgQ29weSA8bj4gYnl0ZXMgZnJvbSBAY29kZXtyMzAvcjMxfSBpbiBiYW5rIEBjb2Rle3l9IHRvIG5vbi1iYW5rZWQgdmFyaWFibGUKKyAgICAgIEBjb2Rle19fX2Jhbmt2fSB3aXRoIG9mZnNldCBAY29kZXt4fS4gQ2FsbGVyIGJhbmsgaW4gQGNvZGV7YX0uCisKK0BpdGVtIF9fX2JhbmtzdG9yZTxuPiAobj0xLDIsMyw0LDgpCisgICAgICBDb3B5IDxuPiBieXRlcyBmcm9tIG5vbi1iYW5rZWQgdmFyaWFibGUgQGNvZGV7X19fYmFua3Z9IHdpdGggb2Zmc2V0IEBjb2Rle3h9IHRvCisgICAgICBAY29kZXtyMzAvcjMxfSBpbiBiYW5rIEBjb2Rle3l9LiBDYWxsZXIgYmFuayBpbiBAY29kZXthfS4KKworQGl0ZW0gX19fYmFua2NvcHkKKyAgICAgIENvcHkgQGNvZGV7X19fYmFua2NvcHlfbGVuL19fX2Jhbmtjb3B5X2xlbisxfSBieXRlcyBmcm9tIEBjb2Rle3IyOC9yMjl9IGluIGJhbmsgQGNvZGV7eX0gdG8KKyAgICAgIEBjb2Rle3IzMC9yMzF9IGluIGJhbmsgQGNvZGV7eH0uIENhbGxlciBiYW5rIGluIEBjb2Rle2F9LgorQGVuZCB0YWJsZQorCisKK0BzZWN0aW9uIERlYnVnZ2luZworCisgICAgVGhlIDY1MDIgYmFja2VuZCBoYXMgc29tZSBsaW1pdGVkIHN1cHBvcnQgZm9yIGRlYnVnZ2luZy4KKworICAgIFdoZW4gdXNpbmcgdmxpbmssIHRoZSBAY29kZXstdmljZWxhYmVsc30gb3B0aW9ucyBjYW4gYmUgdXNlZCB0byBvdXRwdXQgc3ltYm9sCisgICAgdmFsdWVzIGluIGEgZm9ybWF0IHRoYXQgY2FuIGJlIHJlYWQgYnkgdGhlIHZpY2UgZW11bGF0b3IvZGVidWdnZXIuCisKKyAgICBXaXRoIHRoZSBAY29kZXstZ30gb3B0aW9uLCBsaW5lIG51bWJlcnMgYW5kIGZpbGUgbmFtZXMgb2Ygc291cmNlIGNvZGUgd2lsbAorICAgIGJlIGFkZGVkIHRvIHRoZSBhc3NlbWJseSBvdXRwdXQuIFVzaW5nIHNvbWUgdG9vbHMsIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0bworICAgIGNyZWF0ZSBhIG1peGVkIEMvYXNzZW1ibHkgZmlsZSBmb3IgaW5zcGVjdGlvbi4KKyAgICBEZXBlbmRpbmcgb24gdGhlIG9wdGltaXphdGlvbiBsZXZlbCwgdGhlCisgICAgcmVzdWx0cyBtYXkgYmUgbW9yZSBvciBsZXNzIHVzYWJsZSwgc2VlIHNlY3Rpb24gRGVidWdnaW5nIE9wdGltaXplZCBDb2RlLgorICAgIE5vdGUgdGhhdCB0aGUgYWRkZWQgY29tbWVudHMgd2lsbCBhZmZlY3QgdGhlIGFzc2VtYmx5IHBlZXBob2xlCisgICAgb3B0aW1pemVyLCByZXN1bHRpbmcgaW4gd29yc2UgY29kZSB0aGFuIHdpdGhvdXQgQGNvZGV7LWd9LgorICAgIAorCitAc2VjdGlvbiBDb2RlIGNvbXByZXNzb3IKKworICAgIFRoZSBAY29kZXt2Y3ByNjUwMn0gY29kZSBjb21wcmVzc29yIHN1cHBvcnRzIHRoZSA2NTAyIHRhcmdldC4gSXQgc2hvdWxkCisgICAgYmUgY2FsbGVkIGF1dG9tYXRpY2FsbHkgb24gaGlnaGVyIG9wdGltaXphdGlvbiBsZXZlbHMgd2hlbiB1c2luZyB0aGUKKyAgICBmcm9udGVuZCBAY29kZXt2Y30uIEFzIHRoZSBjb2RlIHdpbGwgYmUgc2xvd2VkIGRvd24gd2hlbiB1c2luZyBjb21wcmVzc2lvbiwKKyAgICB0aGUgNjUwMiBiYWNrZW5kIHdpbGwgb25seSBlbmFibGUgY29tcHJlc3Npb24gd2hlbiB1c2luZyB0aGUgQGNvZGV7LXNpemV9CisgICAgb3B0aW9uLgorCisgICAgVE9ETzogbWFudWFsIG92ZXJyaWRpbmcKKworCitAc2VjdGlvbiBLbm93biBwcm9ibGVtcworCitAaXRlbWl6ZSBAbWludXMKKyAgICBAaXRlbSBAY29kZXtsb25nIGxvbmd9IG5vdCB5ZXQgc3VwcG9ydGVkCisKKyAgICBAaXRlbSByZXR1cm4gdmFsdWUgb2YgY3Jvc3MtYmFuayBmdW5jdGlvbiBjYWxscyBtYXkgbm90IHdvcmsKKworICAgIEBpdGVtIGJhbmtpbmcgbm90IHRlc3RlZCB2ZXJ5IG11Y2gKKyAgICAKKworQGVuZCBpdGVtaXplCisKKworCmRpZmYgLS1naXQgYS9kb2MvdmJjY19tYWluLnRleGkgYi9kb2MvdmJjY19tYWluLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU4NzIyZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy92YmNjX21haW4udGV4aQpAQCAtMCwwICsxLDE5OTAgQEAKK1RoaXMgY2hhcHRlciBkZXNjcmliZXMgdGhlIHRhcmdldC1pbmRlcGVuZGVudCBwYXJ0IG9mIHRoZSBjb21waWxlci4gSXQKK2RvY3VtZW50cyB0aGUgb3B0aW9ucyBhbmQgZXh0ZW5zaW9ucyB3aGljaCBhcmUgbm90IHNwZWNpZmljIHRvIGEgY2VydGFpbgordGFyZ2V0LiBCZSBzdXJlIHRvIGFsc28gcmVhZCB0aGUgY2hhcHRlciBvbiB0aGUgYmFja2VuZCB5b3UgYXJlIHVzaW5nLiBJdCB3aWxsCitsaWtlbHkgY29udGFpbiBpbXBvcnRhbnQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBsaWtlIGRhdGEtcmVwcmVzZW50YXRpb24KK29yIGFkZGl0aW9uYWwgb3B0aW9ucy4KKworQG5vZGUgR2VuZXJhbCBDb21waWxlciBPcHRpb25zCitAc2VjdGlvbiBHZW5lcmFsIENvbXBpbGVyIE9wdGlvbnMKKworICAgIFVzdWFsbHkgQGNvbW1hbmR7dmJjY30gd2lsbCBiZSBjYWxsZWQgYnkgQGNvbW1hbmR7dmN9LiBIb3dldmVyLCBpZiBjYWxsZWQKKyAgICBkaXJlY3RseSBpdCBleHBlY3RzIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorCitAZXhhbXBsZQorICAgICAgQGNvbW1hbmR7dmJjYzx0YXJnZXQ+IFtvcHRpb25zXSBmaWxlfQorQGVuZCBleGFtcGxlCisKKyAgICBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHN1cHBvcnRlZCBieSB0aGUgbWFjaGluZSBpbmRlcGVuZGVudCBwYXJ0CisgICAgb2YgQGNvbW1hbmR7dmJjY30gKGFuZCB3aWxsIGJlIHBhc3NlZCB0aHJvdWdoIGJ5IEBjb21tYW5ke3ZjfSk6CisKK0B0YWJsZSBAb3B0aW9uCisKKyAgICBAaXRlbSAtcXVpZXQgICAgICAKKyAgICAgICAgRG8gbm90IHByaW50IHRoZSBjb3B5cmlnaHQgbm90aWNlLgorCisgICAgQGl0ZW0gLWljMSAgICAgICAgCisgICAgICAgIFdyaXRlIHRoZSBpbnRlcm1lZGlhdGUgY29kZSBiZWZvcmUgb3B0aW1pemluZyB0byBmaWxlLmljMS4KKworICAgIEBpdGVtIC1pYzIgICAgICAgIAorICAgICAgICBXcml0ZSB0aGUgaW50ZXJtZWRpYXRlIGNvZGUgYWZ0ZXIgb3B0aW1pemluZyB0byBmaWxlLmljMi4KKworICAgIEBpdGVtIC1kZWJ1Zz1uICAgIAorICAgICAgICBTZXQgdGhlIGRlYnVnIGxldmVsIHRvIG4uCisKKyAgICBAaXRlbSAtbz1vZmlsZSAgICAKKyAgICAgICAgV3JpdGUgdGhlIGdlbmVyYXRlZCBhc3NlbWJsZXIgb3V0cHV0IHRvIDxvZmlsZT4gcmF0aGVyIHRoYW4KKyAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBmaWxlLgorCisgICAgQGl0ZW0gLW5vYXNtICAgICAgCisgICAgICAgIERvIG5vdCBnZW5lcmF0ZSBhc3NlbWJsZXIgb3V0cHV0IChvbmx5IGZvciB0ZXN0aW5nKS4KKworICAgIEBpdGVtIC1PPW4KKyAgICAgICAgICAgICAgICBUdXJucyBvcHRpbWl6aW5nIG9wdGlvbnMgb24vb2ZmOyBldmVyeSBiaXQgc2V0IGluIG4gdHVybnMKKyAgICAgICAgICAgICAgICBvbiBhbiBvcHRpb24uIFVzdWFsbHkgdGhlIHByZWRlZmluZWQgb3B0aW1pemF0aW9uIG9wdGlvbnMKKyAgICAgICAgICAgICAgICBieSB0aGUgY29tcGlsZXIgZHJpdmVyIHNob3VsZCBiZSB1c2VkLgorICAgICAgICAgICAgICAgIEB4cmVme09wdGltaXphdGlvbnN9LgorCisgICAgQGl0ZW0gLXNwZWVkCisgICAgICAgICAgICAgIFR1cm5zIG9uIG9wdGltaXphdGlvbnMgd2hpY2ggaW1wcm92ZSBzcGVlZCBldmVuIGlmIHRoZXkKKyAgICAgICAgICAgICAgICBpbmNyZWFzZSBjb2RlLXNpemUgcXVpdGUgYSBiaXQuCisKKyAgICBAaXRlbSAtc2l6ZQorICAgICAgICAgICAgICAgVHVybnMgb24gb3B0aW1pemF0aW9ucyB3aGljaCBpbXByb3ZlIGNvZGUtc2l6ZSBldmVuIGlmCisgICAgICAgICAgICAgICAgdGhleSBoYXZlIG5lZ2F0aXZlIGVmZmVjdCBvbiBleGVjdXRpb24tdGltZXMuCisKKyAgICBAaXRlbSAtZmluYWwKKyAgICAgICAgICAgICAgVGhpcyBmbGFnIGlzIHVzZWZ1bCBvbmx5IHdpdGggaGlnaGVyIG9wdGltaXphdGlvbiBsZXZlbHMuCisgICAgICAgICAgICAgICAgSXQgdGVsbHMgdGhlIGNvbXBpbGVyIHRoYXQgYWxsIHJlbGV2YW50IGZpbGVzIGhhdmUgYmVlbgorICAgICAgICAgICAgICAgIHByb3ZpZGVkIHRvIHRoZSBjb21waWxlciAoaS5lLiBpdCBpcyB0aGUgbGluay1zdGFnZSkuCisgICAgICAgICAgICAgICAgVGhlIGNvbXBpbGVyIHdpbGwgdHJ5IHRvIGVsaW1pbmF0ZSBhbGwgZnVuY3Rpb25zIGFuZAorICAgICAgICAgICAgICAgIHZhcmlhYmxlcyB3aGljaCBhcmUgbm90IHJlZmVyZW5jZWQuCisKKyAgICAgICAgICAgICAgICBAeHJlZntVbnVzZWQgT2JqZWN0IEVsaW1pbmF0aW9ufS4KKworICAgIEBpdGVtIC13cG8KKyAgICAgICAgICAgICAgICBDcmVhdGUgYSBoaWdoLWxldmVsIHBzZXVkbyBvYmplY3QgZm9yIGNyb3NzLW1vZHVsZQorICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbiAoQHB4cmVme0Nyb3NzLU1vZHVsZSBPcHRpbWl6YXRpb25zfSkuCisKKworICAgIEBpdGVtIC1nCisgICAgICAgICAgICAgICAgQ3JlYXRlIGRlYnVnIG91dHB1dC4gV2hldGhlciB0aGlzIGlzIHN1cHBvcnRlZCBhcyB3ZWxsIGFzIHRoZQorICAgICAgICAgICAgICAgIGZvcm1hdCBvZiB0aGUgZGVidWcgaW5mb3JtYXRpb24gZGVwZW5kcyBvbiB0aGUgYmFja2VuZC4KKyAgICAgICAgICAgICAgICBTb21lIGJhY2tlbmRzIG1heSBvZmZlciBhZGRpdGlvbmFsIG9wdGlvbnMgdG8gY29udHJvbCB0aGUKKyAgICAgICAgICAgICAgICBnZW5lcmF0aW9uIG9mIGRlYnVnIG91dHB1dC4KKworICAgICAgICAgICAgICAgIFVzdWFsbHkgRFdBUkYyLW91dHB1dCB3aWxsIGJlIGdlbmVyYXRlZCBieSBkZWZhdWx0LCBpZgorICAgICAgICAgICAgICAgIHBvc3NpYmxlLgorCisgICAgICAgICAgICAgICAgQWxzbywgb3B0aW9ucyByZWdhcmRpbmcgb3B0aW1pemF0aW9uIGFuZAorICAgICAgICAgICAgICAgIGNvZGUtZ2VuZXJhdGlvbiBtYXkgYWZmZWN0IHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAoQHB4cmVme0RlYnVnZ2luZyBPcHRpbWl6ZWQgQ29kZX0pLgorCisgICAgICAgIAorICAgIEBpdGVtIC1jbWQ9PGZpbGU+CisgICAgICAgICAgICAgICAgQSBmaWxlIGNvbnRhaW5pbmcgYWRkaXRpb25hbCBjb21tYW5kIGxpbmUgb3B0aW9ucyBjYW4KKyAgICAgICAgICAgICAgICBiZSBzcGVjaWZpZWQgdXNpbmcgdGhpcyBjb21tYW5kLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yCisgICAgICAgICAgICAgICAgdmVyeSBsb25nIGNvbW1hbmQgbGluZXMuCisKKyAgICBAaXRlbSAtYzg5CisgICAgQGl0ZW0gLWM5OQorICAgICAgICAgICAgICAgIFNldCB0aGUgQyBzdGFuZGFyZCB0byBiZSB1c2VkLgorICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIHRoZSAxOTk5IElTTyBDIHN0YW5kYXJkIChJU08vSUVDOTg5OToxOTk5KS4KKyAgICAgICAgICAgICAgICBDdXJyZW50bHkgdGhlIGZvbGxvd2luZyBjaGFuZ2VzIG9mIEM5OSBhcmUgaGFuZGxlZDoKK0BpdGVtaXplIEBtaW51cworICAgICAgICAgICAgICAgIEBpdGVtIGxvbmcgbG9uZyBpbnQgKG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGJhY2tlbmRzKQorICAgICAgICAgICAgICAgIEBpdGVtIGZsZXhpYmxlIGFycmF5IG1lbWJlcnMgYXMgbGFzdCBlbGVtZW50IG9mIGEgc3RydWN0CisgICAgICAgICAgICAgICAgQGl0ZW0gbWl4ZWQgc3RhdGVtZW50cyBhbmQgZGVjbGFyYXRpb25zCisgICAgICAgICAgICAgICAgQGl0ZW0gZGVjbGFyYXRpb25zIHdpdGhpbiBmb3ItbG9vcHMKKyAgICAgICAgICAgICAgICBAaXRlbSBAY29kZXtpbmxpbmV9IGZ1bmN0aW9uLXNwZWNpZmllcgorICAgICAgICAgICAgICAgIEBpdGVtIEBjb2Rle3Jlc3RyaWN0fS1xdWFsaWZpZXIKKyAgICAgICAgICAgICAgICBAaXRlbSBuZXcgcmVzZXJ2ZWQga2V5d29yZHMKKyAgICAgICAgICAgICAgICBAaXRlbSBAY29kZXsvL30tY29tbWVudHMKKyAgICAgICAgICAgICAgICBAaXRlbSB2YXJhcmctbWFjcm9zCisgICAgICAgICAgICAgICAgQGl0ZW0gQGNvZGV7X1ByYWdtYX0KKyAgICAgICAgICAgICAgICBAaXRlbSBpbXBsaWNpdCBpbnQgZGVwcmVjYXRlZAorICAgICAgICAgICAgICAgIEBpdGVtIGltcGxpY2l0IGZ1bmN0aW9uLWRlY2xhcmF0aW9ucyBkZXByZWNhdGVkCisgICAgICAgICAgICAgICAgQGl0ZW0gaW5jcmVhc2VkIHRyYW5zbGF0aW9uLWxpbWl0cworICAgICAgICAgICAgICAgIEBpdGVtIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXJzCisgICAgICAgICAgICAgICAgQGl0ZW0gbm9uLWNvbnN0YW50IGluaXRpYWxpemVycyBmb3IgYXV0b21hdGljIGFnZ3JlZ2F0ZXMKKyAgICAgICAgICAgICAgICBAaXRlbSBjb21wb3VuZCBsaXRlcmFscworICAgICAgICAgICAgICAgIEBpdGVtIHZhcmlhYmxlLWxlbmd0aCBhcnJheXMgKGluY29tcGxldGUpCitAZW5kIGl0ZW1pemUKKworICAgIEBpdGVtIC11bnNpZ25lZC1jaGFyCisJCU1ha2UgdGhlIHVucXVhbGlmaWVkIHR5cGUgb2YgQGNvZGV7Y2hhcn0gdW5zaWduZWQuCisKKyAgICBAaXRlbSAtbWF4b3B0cGFzc2VzPW4KKyAgICAgICAgICAgICAgICBTZXQgbWF4aW11bSBudW1iZXIgb2Ygb3B0aW1pemVyIHBhc3NlcyB0byBuLgorICAgICAgICAgICAgICAgIEB4cmVme09wdGltaXphdGlvbnN9LgorCisgICAgQGl0ZW0gLWlubGluZS1zaXplPW4KKyAgICAgICAgICAgICAgICBTZXQgdGhlIG1heGltdW0gJ3NpemUnIG9mIGZ1bmN0aW9ucyB0byBiZSBpbmxpbmVkLgorICAgICAgICAgICAgICAgIEB4cmVme0Z1bmN0aW9uIElubGluaW5nfS4KKworCisgICAgQGl0ZW0gLWlubGluZS1kZXB0aD1uCisgICAgICAgICAgICAgICAgSW5saW5lIGZ1bmN0aW9ucyB1cCB0byBuIG5lc3RpbmctbGV2ZWxzIChpbmNsdWRpbmcgcmVjdXJzaXZlCisgICAgICAgICAgICAgICAgY2FsbHMpLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxLiBCZSBjYXJlZnVsIHdpdGggdmFsdWVzIGdyZWF0ZXIKKyAgICAgICAgICAgICAgICB0aGFuIDIuCisgICAgICAgICAgICAgICAgQHhyZWZ7RnVuY3Rpb24gSW5saW5pbmd9LgorCisgICAgQGl0ZW0gLXVucm9sbC1zaXplPW4KKyAgICAgICAgICAgICAgICBTZXQgdGhlIG1heGltdW0gJ3NpemUnIG9mIHVucm9sbGVkIGxvb3BzLgorICAgICAgICAgICAgICAgIEB4cmVme0xvb3AgVW5yb2xsaW5nfS4KKworICAgIEBpdGVtIC11bnJvbGwtYWxsCisgICAgICAgICAgICAgICAgVW5yb2xsIGxvb3BzIHdpdGggYSBub24tY29uc3RhbnQgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgaWYKKyAgICAgICAgICAgICAgICB0aGUgbnVtYmVyIGNhbiBiZSBjYWxjdWxhdGVkIGF0IHJ1bnRpbWUgYmVmb3JlIGVudGVyaW5nCisgICAgICAgICAgICAgICAgdGhlIGxvb3AuIEB4cmVme0xvb3AgVW5yb2xsaW5nfS4KKworICAgIEBpdGVtIC1uby1pbmxpbmUtcGVlcGhvbGUKKyAgICAgICAgICAgICAgICBTb21lIGJhY2tlbmRzIHByb3ZpZGUgcGVlcGhvbGUtb3B0aW1pemVycyB3aGljaCBwZXJmb3JtCisgICAgICAgICAgICAgICAgc2ltcGxlIG9wdGltaXphdGlvbnMgb24gdGhlIGFzc2VtYmx5IGNvZGUgb3V0cHV0IGJ5IEBjb21tYW5ke3ZiY2N9LgorICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQsIHRoZXNlIG9wdGltaXphdGlvbnMgd2lsbCBhbHNvIGJlIHBlcmZvcm1lZAorICAgICAgICAgICAgICAgIG9uIGlubGluZS1hc3NlbWJseSBjb2RlIG9mIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBzd2l0Y2gKKyAgICAgICAgICAgICAgICB0dXJucyBvZmYgdGhpcyBiZWhhdmlvdXIuIEB4cmVme0lubGluZS1Bc3NlbWJseSBGdW5jdGlvbnN9LgorCisgICAgQGl0ZW0gLWZwLWFzc29jaWF0aXZlCisgICAgICAgICAgICAgICAgRmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucyBkbyBub3Qgb2JleSB0aGUgbGF3IG9mCisgICAgICAgICAgICAgICAgYXNzb2NpYXRpdml0eSwgZS5nLiBAY29kZXsoYStiKStjPT1hKyhiK2MpfSBpcyBub3QgdHJ1ZSBmb3IgYWxsCisgICAgICAgICAgICAgICAgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBAY29kZXthfSxAY29kZXtifSxAY29kZXtjfS4gVGhlcmVmb3JlCisgICAgICAgICAgICAgICAgY2VydGFpbiBvcHRpbWl6YXRpb25zCisgICAgICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHRoaXMgcHJvcGVydHkgY2Fubm90IGJlIHBlcmZvcm1lZCBvbiBmbG9hdGluZworICAgICAgICAgICAgICAgIHBvaW50IG51bWJlcnMuCisKKyAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiB0ZWxscyBAY29tbWFuZHt2YmNjfSB0byB0cmVhdCBmbG9hdGluZyBwb2ludAorICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMgYXMgYXNzb2NpYXRpdmUgYW5kIHBlcmZvcm0gdGhvc2Ugb3B0aW1pemF0aW9ucworICAgICAgICAgICAgICAgIGV2ZW4gaWYgdGhhdCBtYXkgY2hhbmdlIHRoZSByZXN1bHRzIGluIHNvbWUgY2FzZXMgKG5vdAorICAgICAgICAgICAgICAgIElTTyBjb25mb3JtaW5nKS4KKworICAgIEBpdGVtIC1uby1hbGlhcy1vcHQKKyAgICAgICAgICAgICAgICBEbyBub3QgcGVyZm9ybSB0eXBlLWJhc2VkIGFsaWFzIGFuYWx5c2lzLgorICAgICAgICAgICAgICAgIEB4cmVme0FsaWFzIEFuYWx5c2lzfS4KKworICAgIEBpdGVtIC1uby1tdWx0aXBsZS1jY3MKKyAgICAgICAgICAgICAgICBJZiB0aGUgYmFja2VuZCBzdXBwb3J0cyBtdWx0aXBsZSBjb25kaXRpb24gY29kZQorICAgICAgICAgICAgICAgIHJlZ2lzdGVycywgQGNvbW1hbmR7dmJjY30gd2lsbCB0cnkgdG8gdXNlIHRoZW0gd2hlbiBvcHRpbWl6aW5nLgorICAgICAgICAgICAgICAgIFRoaXMgZmxhZyBwcmV2ZW50cyBAY29tbWFuZHt2YmNjfSBmcm9tIHVzaW5nIHRoZW0uCisKKyAgICBAaXRlbSAtZG91YmxlLXB1c2gKKyAgICAgICAgICAgICAgICBPbiB0YXJnZXRzIHdoZXJlIGZ1bmN0aW9uLWFyZ3VtZW50cyBhcmUgcGFzc2VkIGluIHJlZ2lzdGVycworICAgICAgICAgICAgICAgIGJ1dCBhbHNvIHN0YWNrLXNsb3RzIGFyZSBsZWZ0IGVtcHR5IGZvciBzdWNoIGFyZ3VtZW50cywKKyAgICAgICAgICAgICAgICBwYXNzIHRob3NlIGFyZ3VtZW50cyBib3RoIGluIHJlZ2lzdGVycyBhbmQgb24gdGhlIHN0YWNrLgorCisgICAgICAgICAgICAgICAgVGhpcyBnZW5lcmF0ZXMgbGVzcyBlZmZpY2llbnQgY29kZSBidXQgc29tZSBicm9rZW4gY29kZQorICAgICAgICAgICAgICAgIChlLmcuIGNvZGUgd2hpY2ggY2FsbHMgdmFyYXJncyBmdW5jdGlvbnMgd2l0aG91dCBjb3JyZWN0CisgICAgICAgICAgICAgICAgcHJvdG90eXBlcyBpbiBzY29wZSkgbWF5IHdvcmsuCisKKyAgICBAaXRlbSAtc2hvcnQtcHVzaAorICAgICAgICAgICAgICAgIEluIHRoZSBwcmVzZW5jZSBvZiBhIHByb3RvdHlwZSwgbm8gcHJvbW90aW9uIHdpbGwgYmUgZG9uZQorICAgICAgICAgICAgICAgIG9uIGZ1bmN0aW9uIGFyZ3VtZW50cy4gRm9yIGV4YW1wbGUsIDxjaGFyPiB3aWxsIGJlIHBhc3NlZAorICAgICAgICAgICAgICAgIGFzIDxjaGFyPiByYXRoZXIgdGhhbiA8aW50PiBhbmQgPGZsb2F0PiB3aWxsIG5vdCBiZQorICAgICAgICAgICAgICAgIHByb21vdGVkIHRvIDxkb3VibGU+LiBUaGlzIG1heSBiZSBtb3JlIGVmZmljaWVudCBvbiBzbWFsbAorICAgICAgICAgICAgICAgIHRhcmdldHMuCisKKyAgICAgICAgICAgICAgICBIb3dldmVyLCBwbGVhc2Ugbm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBtYXkgbm90IGJlCisgICAgICAgICAgICAgICAgc3VwcG9ydGVkIGJ5IGFsbCBiYWNrZW5kcyBhbmQgdGhhdCB1c2luZyB0aGlzIG9wdGlvbgorICAgICAgICAgICAgICAgIGJyZWFrcyBBTlNJL0lTTyBjb25mb3JtYW5jZS4gRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICB3aXRoIGEgPGNoYXI+IHBhcmFtZXRlciBtdXN0IG5ldmVyIGJlIGNhbGxlZCB3aXRob3V0IGEKKyAgICAgICAgICAgICAgICBwcm90b3R5cGUgaW4gc2NvcGUuCisKKyAgICBAaXRlbSAtc29mdC1mbG9hdAorICAgICAgICAgICAgICAgIE9uIHRhcmdldHMgc3VwcG9ydGluZyB0aGlzIGZsYWcsIHNvZnR3YXJlIGZsb2F0aW5nIHBvaW50CisgICAgICAgICAgICAgICAgZW11bGF0aW9uIHdpbGwgYmUgdXNlZCByYXRoZXIgdGhhbiBhIGhhcmR3YXJlIEZQVS4gUGxlYXNlCisgICAgICAgICAgICAgICAgY29uc3VsdCB0aGUgY29ycmVzcG9uZGluZyBiYWNrZW5kIGRvY3VtZW50YXRpb24gd2hlbgorICAgICAgICAgICAgICAgIHVzaW5nIHRoaXMgZmxhZy4KKworICAgIEBpdGVtIC1zdGFjay1jaGVjaworICAgICAgICAgICAgICAgIEluc2VydCBjb2RlIGZvciBkeW5hbWljIHN0YWNrIGNoZWNraW5nL2V4dGVuZGluZyBpZiB0aGUKKyAgICAgICAgICAgICAgICBiYWNrZW5kIGFuZCB0aGUgZW52aXJvbm1lbnQgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCisKKyAgICBAaXRlbSAtYW5zaQorICAgIEBpdGVteCAtaXNvCisgICAgICAgU3dpdGNoIHRvIEFOU0kvSVNPIG1vZGUuCisKKworQGl0ZW1pemUgQG1pbnVzCitAaXRlbSAgSW4gSVNPIG1vZGUgd2FybmluZyAyMDkgd2lsbCBiZSBwcmludGVkIGJ5IGRlZmF1bHQuCitAaXRlbSAgSW5saW5lLWFzc2VtYmx5IGZ1bmN0aW9ucyBhcmUgbm90IHJlY29nbml6ZWQuCitAaXRlbSAgQXNzaWdubWVudHMgYmV0d2VlbiBwb2ludGVycyB0byA8dHlwZT4gYW5kIHBvaW50ZXJzCisgICAgICAgICAgICAgICAgdG8gdW5zaWduZWQgPHR5cGU+IHdpbGwgY2F1c2Ugd2FybmluZ3MuCitAZW5kIGl0ZW1pemUKKworICAgIEBpdGVtIC1tYXhlcnJvcnM9bgorICAgICAgICAgICAgICAgIEFib3J0IHRoZSBjb21waWxhdGlvbiBhZnRlciBuIGVycm9yczsgZG8gbm90IHN0b3AgaWYgbj09MC4KKworICAgIEBpdGVtIC1kb250d2Fybj1uWyxuLi4uXQorICAgICAgICAgICAgICAgIFN1cHByZXNzIHdhcm5pbmcgbnVtYmVyIG47IHN1cHByZXNzIGFsbCB3YXJuaW5ncyBpZiBuPDAuCisgICAgICAgICAgICAgICAgTXVsdGlwbGUgd2FybmluZ3MgbWF5IGJlIHNlcGFyYXRlZCBieSBjb21tYXMuCisgICAgICAgICAgICAgICAgQHhyZWZ7RXJyb3JzIGFuZCBXYXJuaW5nc30KKworICAgIEBpdGVtIC13YXJuPW4KKyAgICAgICAgICAgICAgICBUdXJuIG9uIHdhcm5pbmcgbnVtYmVyIG47IHR1cm4gb24gYWxsIHdhcm5pbmdzIGlmIG48MC4KKyAgICAgICAgICAgICAgICBAeHJlZntFcnJvcnMgYW5kIFdhcm5pbmdzfQorCisgICAgQGl0ZW0gLW5vLWNwcC13YXJuCisgICAgICAgICAgICAgICAgVHVybiBvZmYgYWxsIHByZXByb2Nlc3NvciB3YXJuaW5ncy4KKworICAgIEBpdGVtIC13YXJuaW5ncy1hcy1lcnJvcnMKKyAgICAgICAgICAgICAgICBUcmVhdCBhbGwgZW5hYmxlZCB3YXJuaW5ncyBhcyBlcnJvcnMuCisKKyAgICBAaXRlbSAtc3RyaXAtcGF0aAorICAgICAgICAgICAgICAgIFN0cmlwIHRoZSBwYXRoIG9mIGZpbGVuYW1lcyBmcm9tIGVycm9yIG1lc3NhZ2VzLgorICAgICAgICAgICAgICAgIEVycm9yIG1lc3NhZ2VzIG1heSBsb29rIG1vcmUgY29udmVuaWVudCB0aGF0CisgICAgICAgICAgICAgICAgd2F5LCBidXQgbWVzc2FnZSBicm93c2VycyBvcgorICAgICAgICAgICAgICAgIHNpbWlsYXIgcHJvZ3JhbXMgbWlnaHQgbmVlZCBmdWxsIHBhdGhzLgorCisgICAgQGl0ZW0gLW5vLWluY2x1ZGUtc3RhY2sKKyAgICAgICAgICAgICAgICBEbyBub3QgZGlzcGxheSB0aGUgaW5jbHVkZSBzdGFjayBpbiBlcnJvciBtZXNzYWdlcy4KKworCisgICAgQGl0ZW0gLSsKKyAgICBAaXRlbXggLWNwcC1jb21tZW50cworICAgICAgICAgICAgICAgIEFsbG93IEMrKyBzdHlsZSBjb21tZW50cyAobm90IElTTzg5IGNvbmZvcm1pbmcpLgorCisgICAgQGl0ZW0gLW5vLXRyaWdyYXBocworICAgICAgICAgICAgICAgIERvIG5vdCByZWNvZ25pemUgdHJpZ3JhcGhzIChub3QgSVNPIGNvbmZvcm1pbmcpLgorCisgICAgQGl0ZW0gLUUKKyAgICAgICAgICAgICAgICBXcml0ZSB0aGUgcHJlcHJvY2Vzc29yIG91dHB1dCB0byA8ZmlsZT4uaS4KKworICAgIEBpdGVtIC1kZXBzCisgICAgICAgICAgICAgICAgV3JpdGUgYSBtYWtlLXN0eWxlIGRlcGVuZGVuY3ktbGluZSB0byA8ZmlsZT4uZGVwLgorCisgICAgQGl0ZW0gLWRlcHMtZm9yLWxpYnMKKyAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCBAY29kZXstZGVwc30gd2lsbCBub3QgaW5jbHVkZSBmaWxlcyB0aGF0IGFyZQorICAgICAgICAgICAgICAgIGluY2x1ZGVkIHVzaW5nIHRoZSBzeW50YXggQGNvZGV7I2luY2x1ZGUgPC4uLj59LiBTcGVjaWZ5IHRoaXMgb3B0aW9uCisgICAgICAgICAgICAgICAgdG8gYWRkIHRob3NlIGZpbGVzIGFzIHdlbGwuCisKKyAgICBAaXRlbSAtZGVwb2JqPTxmaWxlPgorICAgICAgICAgICAgICAgIFVzZSB0aGUgc3BlY2lmaWVkIGZpbGVuYW1lIGFzIHRhcmdldCBpbiB0aGUgZ2VuZXJhdGVkIGRlcGVuZGVuY3kKKyAgICAgICAgICAgICAgICBmaWxlIGluc3RlYWQgb2YgYmFzaW5nIGl0IG9uIHRoZSBpbnB1dCBmaWxlIG5hbWUuCisKKyAgICBAaXRlbSAtcmVzZXJ2ZS1yZWc9PHJlZ2lzdGVyPgorICAgICAgICAgICAgICAgIFJlc2VydmUgdGhhdCByZWdpc3RlciBub3QgdG8gYmUgdXNlZCBieSB0aGUgYmFja2VuZC4KKyAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBpcyBkYW5nZXJvdXMgYW5kIG11c3Qgb25seSBiZSB1c2VkIGZvciByZWdpc3RlcnMKKyAgICAgICAgICAgICAgICBvdGhlcndpc2UgYXZhaWxhYmxlIGZvciB0aGUgcmVnaXN0ZXIgYWxsb2NhdG9yLiBJZiBpdCB1c2VkCisgICAgICAgICAgICAgICAgZm9yIHNwZWNpYWwgcmVnaXN0ZXJzIG9yIHJlZ2lzdGVycyB1c2VkIGludGVybmFsbHkgYnkgdGhlCisgICAgICAgICAgICAgICAgYmFja2VuZCwgaXQgbWF5IGJlIGlnbm9yZWQsIGxlYWQgdG8gY29ycnVwdCBjb2RlIG9yIGV2ZW4KKyAgICAgICAgICAgICAgICBjYXVzZSBpbnRlcm5hbCBlcnJvcnMgZnJvbSB0aGUgY29tcGlsZXIuCisKKyAgICAgICAgICAgICAgICBPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisKKyAgICBAaXRlbSAtZG9udGtlZXAtaW5pdGlhbGl6ZWQtZGF0YQorICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgQGNvbW1hbmR7dmJjY30ga2VlcHMgYWxsIGRhdGEgb2YgaW5pdGlhbGl6YXRpb25zIGluIG1lbW9yeQorICAgICAgICAgICAgICAgIGR1cmluZyB0aGUgd2hvbGUgY29tcGlsYXRpb24gKGl0IGNhbiBzb21ldGltZXMgbWFrZSB1c2UKKyAgICAgICAgICAgICAgICBvZiB0aGlzIHdoZW4gb3B0aW1pemluZykuIFRoaXMgY2FuIHRha2Ugc29tZSBhbW91bnQgb2YKKyAgICAgICAgICAgICAgICBtZW1vcnksIHRob3VnaC4gVGhpcyBvcHRpb25zIHRlbGxzIEBjb21tYW5ke3ZiY2N9IHRvCisgICAgICAgICAgICAgICAga2VlcCBhcyBsaXR0bGUgb2YgdGhpcyBkYXRhIGluIG1lbW9yeSBhcyBwb3NzaWJsZS4KKyAgICAgICAgICAgICAgICBUaGlzIGhhcyBub3QgeWV0IGJlZW4gdGVzdGVkIHZlcnkgd2VsbC4KKworICAgIEBpdGVtIC1wcmVmZXItc3RhdGljcworICAgICAgICAgICAgICAgIEFzc2lnbiBhdXRvIHZhcmlhYmxlcyB0byBzdGF0aWMgbWVtb3J5IHJhdGhlciB0aGFuIHRoZSBzdGFjayBpZiBpdAorICAgICAgICAgICAgICAgIGNhbiBiZSBkZWR1Y2VkIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIG5vdCBjYWxsZWQgcmVjdXJzaXZlbHksIGkuZS4gdGhlCisgICAgICAgICAgICAgICAgYmVoYXZpb3VyIGlzIHN0aWxsIEMgY29tcGxpYW50LiBUaGlzIG1heSBiZSBtb3JlIGVmZmljaWVudCBvbiB0YXJnZXRzCisgICAgICAgICAgICAgICAgdGhhdCBjYW4gYWNjZXNzIHN0YXRpYyBkYXRhIGZhc3RlciB0aGFuIHN0YWNrLiBXaGlsZSBzdGFjay11c2FnZSBpcworICAgICAgICAgICAgICAgIHJlZHVjZWQsIHRvdGFsIG1lbW9yeSBjb25zdW1wdGlvbiBpcyB1c3VhbGx5IGluY3JlYXNlZC4KKworICAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB3aWxsIG5vdCBiZSByZS1lbnRyYW50IGFueSBtb3JlLgorCisgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gb25seSBoYXMgZWZmZWN0IG9uIGhpZ2hlciBvcHRpbWl6YXRpb24gbGV2ZWxzIChAY29kZXstTzN9KS4KKworICAgIEBpdGVtIC1mb3JjZS1zdGF0aWNzCisgICAgICAgICAgICAgICAgTGlrZSBAY29kZXstcHJlZmVyLXN0YXRpY3N9LCBidXQgYXNzdW1lIGFsbCBmdW5jdGlvbnMgYXMgbm9uLXJlY3Vyc2l2ZS4KKyAgICAgICAgICAgICAgICBUaGlzIHdpbGwgYnJlYWsgQyBjb21wbGlhbmNlLgorCisgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gb25seSBoYXMgZWZmZWN0IG9uIGhpZ2hlciBvcHRpbWl6YXRpb24gbGV2ZWxzIChAY29kZXstT30pLgorCisgICAgQGl0ZW0gLXJhbmdlLW9wdAorICAgICAgICAgICAgICAgIFBlcmZvcm0gYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGJhc2VkIG9uIHZhbHVlIHJhbmdlIGFuYWx5c2lzLiBUaGlzCisgICAgICAgICAgICAgICAgb3B0aW9uIGlzIHVuZGVyIGRldmVsb3BtZW50IGFuZCBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbC4gVGhlIGZvbGxvd2luZworICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbnMgYXJlIGN1cnJlbnRseSBpbXBsZW1lbnRlZDoKKworICAgICAgICAgICAgICAgIEBpdGVtaXplIEBtaW51cworICAgICAgICAgICAgICAgIEBpdGVtIEluZHVjdGlvbiB2YXJpYWJsZXMgb2Ygc29tZSBsb29wcyBhcmUgdHJhbnNmb3JtZWQgdG8gc21hbGxlcgorICAgICAgICAgICAgICAgICAgICAgIHR5cGVzIGlmIGl0IGNhbiBiZSBkZXRlcm1pbmVkIHRoYXQgdGhleSB3aWxsIG9ubHkgZ2V0IGFzc2lnbmVkCisgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIHRoYXQgZml0IGludG8gYSBzbWFsbGVyIHR5cGUuCisgICAgICAgICAgICAgICAgQGVuZCBpdGVtaXplCisKKyAgICBAaXRlbSAtbWVyZ2Utc3RyaW5ncworICAgICAgICAgICAgICAgIE92ZXJsYXkgaWRlbnRpY2FsIHN0cmluZy1jb25zdGFudHMgdG8gc2F2ZSBtZW1vcnkuIEN1cnJlbnRseQorICAgICAgICAgICAgICAgIG9ubHkgc3RyaW5ncyBpZGVudGljYWwgdG8gc3RyaW5nLWNvbnN0YW50cyBvbiB0b3AtbGV2ZWwgYXJlCisgICAgICAgICAgICAgICAgcmVjb2duaXplZC4KKworICAgIEBpdGVtIC1zZWMtcGVyLW9iagorICAgICAgICAgICAgICAgIFRlbGxzIHRoZSBiYWNrZW5kIHRvIHB1dCBldmVyeSBmdW5jdGlvbi9vYmplY3QgaW50byBpdHMgb3duCisgICAgICAgICAgICAgICAgc2VwYXJhdGUgc2VjdGlvbi4gVGhpcyBhbGxvd3MgbW9yZSBmaW5lLWdyYWluZWQgZWxpbWluYXRpb24KKyAgICAgICAgICAgICAgICBvZiB1bnVzZWQgZnVuY3Rpb25zL29iamVjdHMgYnkgdGhlIGxpbmtlci4gT24gdGhlIG90aGVyIGhhbmQsCisgICAgICAgICAgICAgICAgaXQgbWF5IHByZXZlbnQgc29tZSBvcHRpbWl6YXRpb25zIGJ5IHRoZSBhc3NlbWJsZXIuCisKKyAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBvbmx5IGhhcyBlZmZlY3QgaWYgaXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBiYWNrZW5kLgorCisgICAgQGl0ZW0gLW1hc2stb3B0CisgICAgICAgICAgICAgICAgUGVyZm9ybSBtYXNrIG9wdGltaXphdGlvbnMgb24gc3VpdGFibGUgbGlicmFyeSBmdW5jdGlvbi4gVGhpcworICAgICAgICAgICAgICAgIHdpbGwgY3JlYXRlIGNhbGxzIHRvIG9wdGltaXplZCB2ZXJzaW9ucyBvZiBlLmcuIHRoZSBwcmludGYvc2NhbmYKKyAgICAgICAgICAgICAgICBmYW1pbHkgb2YgZnVuY3Rpb25zLgorCitAZW5kIHRhYmxlCisKKworICAgIFRoZSBhc3NlbWJsZXIgb3V0cHV0IHdpbGwgYmUgc2F2ZWQgdG8gQGZpbGV7ZmlsZS5hc219CisgICAgKGlmIEBmaWxle2ZpbGV9IGFscmVhZHkgY29udGFpbmVkCisgICAgYSBzdWZmaXgsIHRoaXMgd2lsbCBmaXJzdCBiZSByZW1vdmVkOyBzYW1lIGFwcGxpZXMgdG8gLmljMS8uaWMyKQorCisKK0Bub2RlIEVycm9ycyBhbmQgV2FybmluZ3MKK0BzZWN0aW9uIEVycm9ycyBhbmQgV2FybmluZ3MKKworICAgIEBjb21tYW5ke3ZiY2N9IGtub3dzIHRoZSBmb2xsb3dpbmcga2luZHMgb2YgbWVzc2FnZXM6CisKK0B0YWJsZSBAYXNpcworCisgICAgQGl0ZW0gRmF0YWwgRXJyb3JzCisgICAgICAgICAgICAgICAgICAgICAgICBTb21ldGhpbmcgaXMgYmFkbHkgd3JvbmcgYW5kIGZ1cnRoZXIgY29tcGlsYXRpb24gaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcG9zc2libGUgb3IgcG9pbnRsZXNzLiBAY29tbWFuZHt2YmNjfSB3aWxsIGFib3J0LgorICAgICAgICAgICAgICAgICAgICAgICAgRS5nLiBubyBzb3VyY2UgZmlsZSBvciByZWFsbHkgY29ycnVwdCBzb3VyY2UuCisKKyAgICBAaXRlbSBFcnJvcnMKKyAgICAgICAgICAgICAgICAgICAgICBUaGVyZSB3YXMgYW4gZXJyb3IgYW5kIEBjb21tYW5ke3ZiY2N9IGNhbm5vdCBnZW5lcmF0ZSB1c2VmdWwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuIENvbXBpbGF0aW9uIGNvbnRpbnVlcywgYnV0IG5vIGNvZGUgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgRS5nLiB1bmtub3duIGlkZW50aWZpZXJzLgorCisgICAgQGl0ZW0gV2FybmluZ3MgKDEpCisgICAgICAgICAgICAgICAgICAgICAgICBXYXJuaW5ncyB3aXRoIElTTy12aW9sYXRpb25zLiBUaGUgcHJvZ3JhbSBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgIElTTy1jb25mb3JtaW5nLCBidXQgQGNvbW1hbmR7dmJjY30gd2lsbCBnZW5lcmF0ZSBjb2RlIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdWxkIGJlIHdoYXQgeW91IHdhbnQgKG9yIG5vdCkuCisgICAgICAgICAgICAgICAgICAgICAgICBFLmcuIG1pc3Npbmcgc2VtaWNvbG9uLgorCisgICAgQGl0ZW0gV2FybmluZ3MgKDIpCisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgY29kZSBoYXMgbm8gSVNPLXZpb2xhdGlvbnMsIGJ1dCBjb250YWlucyBzb21lCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJhbmdlIHRoaW5ncyB5b3Ugc2hvdWxkIHBlcmhhcHMgbG9vayBhdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIEUuZy4gdW51c2VkIHZhcmlhYmxlcy4KK0BlbmQgdGFibGUKKworICAgIEVycm9ycyBvciB0aGUgZmlyc3Qga2luZCBvZiB3YXJuaW5ncyBhcmUgYWx3YXlzIGRpc3BsYXllZCBhbmQgY2Fubm90CisgICAgYmUgc3VwcHJlc3NlZC4KKworICAgIE9ubHkgc29tZSB3YXJuaW5ncyBvZiB0aGUgc2Vjb25kIGtpbmQgYXJlIHR1cm5lZCBvbiBieSBkZWZhdWx0LgorICAgIE1hbnkgb2YgdGhlbSBhcmUgdmVyeSB1c2VmdWwgZm9yIHNvbWUgYnV0IGFubm95aW5nIHRvIG90aGVycywgYW5kCisgICAgdGhlaXIgdXNhYmlsaXR5IG1heSBkZXBlbmQgb24gcHJvZ3JhbW1pbmcgc3R5bGUuCisgICAgRXZlcnlib2R5IGlzIHJlY29tbWVuZGVkIHRvIGZpbmQgdGhlaXIgb3duIHByZWZlcmVuY2VzLgorCisgICAgQSBnb29kIHdheSB0byBkbyB0aGlzIGlzIHN0YXJ0aW5nIHdpdGggYWxsIHdhcm5pbmdzIHR1cm5lZCBvbiBieQorICAgIEBvcHRpb257LXdhcm49LTF9LiBOb3cgYWxsIHBvc3NpYmxlIHdhcm5pbmdzIHdpbGwgYmUgaXNzdWVkLiBFdmVyeXRpbWUgCisgICAgYSB3YXJuaW5nIHRoYXQgaXMgbm90IGNvbnNpZGVyZWQgdXNlZnVsIGFwcGVhcnMsIHR1cm4gdGhhdCBvbmUgb2ZmIHdpdGgKKyAgICBAb3B0aW9uey1kb250d2Fybj1ufS4KKworICAgIFNlZSBAcmVme0xpc3Qgb2YgRXJyb3JzfSBmb3IgYSBsaXN0IG9mIGFsbCBkaWFnbm9zdGljIG1lc3NhZ2VzIGF2YWlsYWJsZS4KKworICAgIFNlZSBAcmVme1RoZSBGcm9udGVuZH0gdG8gZmluZCBvdXQgaG93IHRvIGNvbmZpZ3VyZSBAY29tbWFuZHt2Y30gdG8geW91cgorICAgIHByZWZlcmVuY2VzLgorCisKK0BzZWN0aW9uIERhdGEgVHlwZXMKKworICAgIEBjb21tYW5ke3ZiY2N9IGNhbiBoYW5kbGUgdGhlIGZvbGxvd2luZyBhdG9taWMgZGF0YSB0eXBlczoKKworQHRhYmxlIEBjb2RlCitAaXRlbSBzaWduZWQgY2hhcgorQGl0ZW0gdW5zaWduZWQgY2hhcgorQGl0ZW0gc2lnbmVkIHNob3J0CitAaXRlbSB1bnNpZ25lZCBzaG9ydAorQGl0ZW0gc2lnbmVkIGludAorQGl0ZW0gdW5zaWduZWQgaW50CitAaXRlbSBzaWduZWQgbG9uZyBpbnQKK0BpdGVtIHVuc2lnbmVkIGxvbmcgaW50CitAaXRlbSBzaWduZWQgbG9uZyBsb25nIGludAorICAgICAgICAod2l0aCBAb3B0aW9uey1jOTl9KQorQGl0ZW0gdW5zaWduZWQgbG9uZyBsb25nIGludAorICAgICAgICAod2l0aCBAb3B0aW9uey1jOTl9KQorQGl0ZW0gZmxvYXQKK0BpdGVtIGRvdWJsZQorQGl0ZW0gbG9uZyBkb3VibGUKK0BlbmQgdGFibGUKKworVGhlIGRlZmF1bHQgc2lnbmVkbmVzcyBmb3IgaW50ZWdlciB0eXBlcyBpcyBAY29kZXtzaWduZWR9LgorCitEZXBlbmRpbmcgb24gdGhlIGJhY2tlbmQsIHNvbWUgb2YgdGhlc2UgdHlwZXMgY2FuIGhhdmUgaWRlbnRpY2FsCityZXByZXNlbnRhdGlvbi4gVGhlIHJlcHJlc2VudGF0aW9uIChzaXplLCBhbGlnbm1lbnQgZXRjLikgb2YgdGhlc2UgdHlwZXMKK3VzdWFsbHkgdmFyaWVzIGJldHdlZW4gZGlmZmVyZW50IGJhY2tlbmRzLiBAY29tbWFuZHt2YmNjfSBpcyBhYmxlIHRvIHN1cHBvcnQKK2FyYml0cmFyeSBpbXBsZW1lbnRhdGlvbnMuCisKK0JhY2tlbmRzIG1heSBiZSByZXN0cmljdGVkIGFuZCBvbWl0IHNvbWUgdHlwZXMgKGUuZy4gZmxvYXRpbmcgcG9pbnQgb24gc21hbGwKK2VtYmVkZGVkIGFyY2hpdGVjdHVyZXMpIG9yIG9mZmVyIGFkZGl0aW9uYWwgdHlwZXMuIEUuZy4gc29tZSBiYWNrZW5kcworbWF5IHByb3ZpZGUgc3BlY2lhbCBiaXQgdHlwZXMgb3IgZGlmZmVyZW50IHBvaW50ZXIgdHlwZXMuCisKKworQG5vZGUgT3B0aW1pemF0aW9ucworQHNlY3Rpb24gT3B0aW1pemF0aW9ucworCisgICAgQGNvbW1hbmR7dmJjY30gb2ZmZXJzIGRpZmZlcmVudCBsZXZlbHMgb2Ygb3B0aW1pemF0aW9uLCByYW5naW5nIGZyb20gZmFzdAorICAgIGNvbXBpbGF0aW9uIHdpdGggc3RyYWlnaHQtZm9yd2FyZCBjb2RlIHN1aXRhYmxlIGZvciBlYXN5IGRlYnVnZ2luZworICAgIHRvIGhpZ2hseSBhZ2dyZXNzaXZlIGNyb3NzLW1vZHVsZSBvcHRpbWl6YXRpb25zIGRlbGl2ZXJpbmcgdmVyeQorICAgIGZhc3QgYW5kL29yIHRpZ2h0IGNvZGUuCisKKyAgICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBnZW5lcmFsIHBoYXNlcyBvZiBjb21waWxhdGlvbiBhbmQgZ2l2ZXMKKyAgICBhIHNob3J0IG92ZXJ2aWV3IG9uIHRoZSBhdmFpbGFibGUgb3B0aW1pemF0aW9ucy4KKworICAgIEluIHRoZSBmaXJzdCBjb21waWxhdGlvbiBwaGFzZSBldmVyeSBmdW5jdGlvbiBpcyBwYXJzZWQgaW50byBhIHRyZWUKKyAgICBzdHJ1Y3R1cmUgb25lIGV4cHJlc3Npb24gYWZ0ZXIgdGhlIG90aGVyLiBUeXBlLWNoZWNraW5nIGFuZCBzb21lCisgICAgbWlub3Igb3B0aW1pemF0aW9ucyBsaWtlIGNvbnN0YW50LWZvbGRpbmcgb3Igc29tZSBhbGdlYnJhaWMKKyAgICBzaW1wbGlmaWNhdGlvbnMgYXJlIGRvbmUgb24gdGhlIHRyZWVzLgorICAgIFRoaXMgcGhhc2Ugb2YgdGhlIHRyYW5zbGF0aW9uIGlzIGlkZW50aWNhbCBpbiBvcHRpbWl6aW5nIGFuZAorICAgIG5vbi1vcHRpbWl6aW5nIGNvbXBpbGF0aW9uLgorCisgICAgVGhlbiBpbnRlcm1lZGlhdGUgY29kZSBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgdHJlZXMuIEluIG5vbi1vcHRpbWl6aW5nCisgICAgY29tcGlsYXRpb24gdGVtcG9yYXJpZXMgbmVlZGVkIHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGFyZQorICAgIGltbWVkaWF0ZWx5IGFzc2lnbmVkIHRvIHJlZ2lzdGVycyB3aGlsZSBpbiBvcHRpbWl6aW5nCisgICAgY29tcGlsYXRpb24sIGEgbmV3IHZhcmlhYmxlIGlzIGdlbmVyYXRlZCBmb3IgZWFjaCB0ZW1wb3JhcnkuCisgICAgU2xpZ2h0bHkgZGlmZmVyZW50IGludGVybWVkaWF0ZSBjb2RlCisgICAgaXMgcHJvZHVjZWQgaW4gb3B0aW1pemluZyBjb21waWxhdGlvbi4KKyAgICBTb21lIG1pbm9yIG9wdGltaXphdGlvbnMgYXJlIHBlcmZvcm1lZCB3aGlsZSBnZW5lcmF0aW5nIHRoZSBpbnRlcm1lZGlhdGUKKyAgICBjb2RlIChzaW1wbGUgZWxpbWluYXRpb24gb2YgdW5yZWFjaGFibGUgY29kZSwgc29tZSBvcHRpbWl6YXRpb25zIG9uCisgICAgYnJhbmNoZXMgZXRjLikuCisKKyAgICBBZnRlciBpbnRlcm1lZGlhdGUgY29kZSBmb3IgdGhlIHdob2xlIGZ1bmN0aW9uIGhhcyBiZWVuIGdlbmVyYXRlZCwKKyAgICBzaW1wbGUgcmVnaXN0ZXIgYWxsb2NhdGlvbiBtYXkgYmUgZG9uZSBpbiBub24tb3B0aW1pemluZyBjb21waWxhdGlvbgorICAgIGlmIGJpdCAxIGhhcyBiZWVuIHNldCBpbiB0aGUgQG9wdGlvbnstT30gb3B0aW9uLgorICAgIEFmdGVyd2FyZHMsIHRoZSBpbnRlcm1lZGlhdGUgY29kZSBpcyBwYXNzZWQgdG8gdGhlIGNvZGUgZ2VuZXJhdG9yIGFuZAorICAgIHRoZW4gYWxsIG1lbW9yeSBmb3IgdGhlIGZ1bmN0aW9uLCBpdHMgdmFyaWFibGVzIGV0Yy4gaXMgZnJlZWQuCisKKyAgICBJbiBvcHRpbWl6aW5nIGNvbXBpbGF0aW9uIGZsb3dncmFwaHMgYXJlIGNvbnN0cnVjdGVkLCBkYXRhIGZsb3cgYW5hbHlzaXMKKyAgICBpcyBwZXJmb3JtZWQgYW5kIG1hbnkgcGFzc2VzIGFyZSBtYWRlIG92ZXIgdGhlIGZ1bmN0aW9uJ3MgaW50ZXJtZWRpYXRlCisgICAgY29kZS4gQ29kZSBtYXkgYmUgbW92ZWQgYXJvdW5kLCBuZXcgdmFyaWFibGVzIG1heSBiZSBhZGRlZCwgb3RoZXIKKyAgICB2YXJpYWJsZXMgcmVtb3ZlZCBldGMuIGV0Yy4gKGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZQorICAgIG9wdGltaXphdGlvbnMgbG9vayBhdCB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZQorICAgIEBvcHRpb257LU99IG9wdGlvbiBiZWxvdykuCisKKyAgICBNYW55IG9mIHRoZSBvcHRpbWl6YXRpb24gcm91dGluZXMgZGVwZW5kIG9uIGVhY2ggb3RoZXIuIElmIG9uZQorICAgIHJvdXRpbmUgZmluZHMgYW4gb3B0aW1pemF0aW9uLCB0aGlzIG9mdGVuIGVuYWJsZXMgb3RoZXIgcm91dGluZXMgdG8KKyAgICBmaW5kIGZ1cnRoZXIgb25lcy4gQWxzbywgc29tZSByb3V0aW5lcyBvbmx5IGRvIGEgZmlyc3Qgc3RlcCBhbmQgbGV0CisgICAgb3RoZXIgcm91dGluZXMgJ2NsZWFuIHVwJyBhZnRlcndhcmRzLiBUaGVyZWZvcmUgQGNvbW1hbmR7dmJjY30gdXN1YWxseQorICAgIG1ha2VzIG1hbnkgcGFzc2VzIHVudGlsIG5vIGZ1cnRoZXIgb3B0aW1pemF0aW9ucyBhcmUgZm91bmQuCisgICAgVG8gYXZvaWQgcG9zc2libGUgZXh0cmVtZWx5IGxvbmcgb3B0aW1pemF0aW9uIHRpbWVzLCB0aGUgbnVtYmVyIG9mCisgICAgdGhvc2UgcGFzc2VzIGNhbiBiZSBsaW1pdGVkIHdpdGggQG9wdGlvbnstbWF4b3B0cGFzc2VzfSAodGhlCisgICAgZGVmYXVsdCBpcyBtYXguIDEwIHBhc3NlcykuCisgICAgQGNvbW1hbmR7dmJjY30gd2lsbCBkaXNwbGF5IGEgd2FybmluZyBpZiBtb3JlIHBhc3NlcyBtaWdodCBiZSB1c2VmdWwuCisKKyAgICBEZXBlbmRpbmcgb24gdGhlIG9wdGltaXphdGlvbiBsZXZlbCwgYSB3aG9sZSB0cmFuc2xhdGlvbi11bml0IG9yCisgICAgZXZlbiBzZXZlcmFsIHRyYW5zbGF0aW9uLXVuaXRzIHdpbGwgYmUgcmVhZCBhdCBvbmNlLiBBbHNvLCB0aGUKKyAgICBpbnRlcm1lZGlhdGUgY29kZSBmb3IgYWxsIGZ1bmN0aW9ucyBtYXkgYmUga2VwdCBpbiBtZW1vcnkgZHVyaW5nCisgICAgdGhlIGVudGlyZSBjb21waWxhdGlvbi4gQmUgYXdhcmUgdGhhdCBoaWdoZXIgb3B0aW1pemF0aW9uIGxldmVscworICAgIGNhbiB0YWtlIG11Y2ggbW9yZSB0aW1lIGFuZCBtZW1vcnkgdG8gY29tcGxldGUuCisKKyAgICBUaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBvcHRpbWl6YXRpb25zIHdoaWNoIGFyZSBhY3RpdmF0ZWQgYnkKKyAgICBiaXRzIGluIHRoZSBhcmd1bWVudCBvZiB0aGUgQG9wdGlvbnstT30gb3B0aW9uLiBOb3RlIHRoYXQgbm90IGFsbAorICAgIGNvbWJpbmF0aW9ucyBhcmUgdmFsaWQuIEl0IGlzIGhlYXZpbHkgcmVjb21tZW5kZWQgbm90IHRvIGZpZGRsZSB3aXRoCisgICAgdGhpcyBvcHRpb24gYnV0IGp1c3QgdXNlIG9uZSBvZiB0aGUgc2V0dGluZ3MgcHJvdmlkZWQgYnkgQGNvbW1hbmR7dmN9CisgICAgKGUuZy4gQG9wdGlvbnstTzB9IC0gQG9wdGlvbnstTzR9KS4gVGhlc2Ugb3B0aW9ucyBhbHNvIGF1dG9tYXRpY2FsbHkKKyAgICBoYW5kbGUgYWN0aW9ucyBsaWtlIGludm9raW5nIHRoZSBzY2hlZHVsZXIgb3IgY3Jvc3MtbW9kdWxlIG9wdGltaXplci4KKworQHRhYmxlIEBhc2lzCisKK0BpdGVtIEJpdCAwICgxKQorICAgICAgICAgICAgICAgICBQZXJmb3JtIFJlZ2lzdGVyIGFsbG9jYXRpb24uIEB4cmVme1JlZ2lzdGVyIEFsbG9jYXRpb259LgorCitAaXRlbSBCaXQgMSAoMikKKyAgICBUaGlzIGZsYWcgdHVybnMgb24gdGhlIG9wdGltaXplci4gSWYgaXQgaXMgc2V0IHRvIHplcm8sIG5vIGdsb2JhbAorICAgIG9wdGltaXphdGlvbnMgd2lsbCBiZSBwZXJmb3JtZWQsIG5vIG1hdHRlciB3aGF0IHRoZSBvdGhlciBmbGFncyBhcmUgc2V0CisgICAgdG8uCisgICAgU2xpZ2h0bHkgZGlmZmVyZW50IGludGVybWVkaWF0ZSBjb2RlIHdpbGwgYmUgZ2VuZXJhdGVkCisgICAgYnkgdGhlIGZpcnN0IHRyYW5zbGF0aW9uIHBoYXNlcyBhbmQgYSBmbG93Z3JhcGggd2lsbCBiZSBjb25zdHJ1Y3RlZC4KKyAgICBAeHJlZntGbG93IE9wdGltaXphdGlvbnN9LgorCitAaXRlbSBCaXQgMiAoNCkKKyAgICBQZXJmb3JtIGNvbW1vbiBzdWJleHByZXNzaW9uIGVsaW1pbmF0aW9uCisgICAgKEBweHJlZntDb21tb24gU3ViZXhwcmVzc2lvbiBFbGltaW5hdGlvbn0pIGFuZCBjb3B5IHByb3BhZ2F0aW9uCisgICAgKEBweHJlZntDb3B5IFByb3BhZ2F0aW9ufSkuCisgICAgVGhpcyBjYW4gYmUgZG9uZSBnbG9iYWxseSBvciBvbmx5IHdpdGhpbiBiYXNpYyBibG9ja3MKKyAgICBkZXBlbmRpbmcgb24gYml0IDUuCisKK0BpdGVtIEJpdCAzICg4KQorICAgIFBlcmZvcm0gY29uc3RhbnQgcHJvcGFnYXRpb24gKEBweHJlZntDb25zdGFudCBQcm9wYWdhdGlvbn0pLgorICAgIFRoaXMgY2FuIGJlIGRvbmUgZ2xvYmFsbHkgb3Igb25seSB3aXRoaW4gYmFzaWMgYmxvY2tzCisgICAgZGVwZW5kaW5nIG9uIGJpdCA1LgorCitAaXRlbSBCaXQgNCAoMTYpCisgICAgUGVyZm9ybSBkZWFkIGNvZGUgZWxpbWluYXRpb24gKEBweHJlZntEZWFkIENvZGUgRWxpbWluYXRpb259KS4KKworCitAaXRlbSBCaXQgNSAoMzIpCisgICAgU29tZSBvcHRpbWl6YXRpb25zIGFyZSBhdmFpbGFibGUgaW4gbG9jYWwgYW5kIGdsb2JhbCB2ZXJzaW9ucy4gVGhpcworICAgIGZsYWcgdHVybnMgb24gdGhlIGdsb2JhbCB2ZXJzaW9ucy4gU2V2ZXJhbCBtYWpvciBvcHRpbWl6YXRpb25zCisgICAgd2lsbCBub3QgYmUgcGVyZm9ybWVkIGFuZCBvbmx5IG9uZSBvcHRpbWl6YXRpb24gcGFzcyBpcyBkb25lIHVubGVzcyAKKyAgICB0aGlzIGZsYWcgaXMgc2V0LgorCitAaXRlbSBCaXQgNiAoNjQpCisgICAgUmVzZXJ2ZWQuCisKK0BpdGVtIEJpdCA3ICgxMjgpCisgICAgQGNvbW1hbmR7dmJjY30gd2lsbCB0cnkgdG8gaWRlbnRpZnkgbG9vcHMgYW5kIHBlcmZvcm0gc29tZSBsb29wIG9wdGltaXphdGlvbnMuCisgICAgU2VlIEByZWZ7U3RyZW5ndGggUmVkdWN0aW9ufSBhbmQgQHJlZntMb29wLUludmFyaWFudCBDb2RlIE1vdGlvbn0uCisgICAgVGhlc2Ugb25seSB3b3JrIGlmIGJpdCA1ICgzMikgaXMgc2V0LgorCisKK0BpdGVtIEJpdCA4ICgyNTYpCisgICAgQGNvbW1hbmR7dmJjY30gdHJpZXMgdG8gcGxhY2UgdmFyaWFibGVzIGF0IHRoZSBzYW1lIG1lbW9yeSBhZGRyZXNzZXMgaWYgcG9zc2libGUKKyAgICAoc2VlIEByZWZ7VW51c2VkIE9iamVjdCBFbGltaW5hdGlvbn0pLgorCisKK0BpdGVtIEJpdCA5ICg1MTIpCisgICAgUmVzZXJ2ZWQuCisKK0BpdGVtIEJpdCAxMCAoMTAyNCkKKyAgICBQb2ludGVycyBhcmUgYW5hbHl6ZWQgYW5kIG1vcmUgcHJlY2lzZSBhbGlhcy1pbmZvcm1hdGlvbiBpcyBnZW5lcmF0ZWQKKyAgICAoQHB4cmVme0FsaWFzIEFuYWx5c2lzfSkuCisgICAgVXNpbmcgdGhpcyBpbmZvcm1hdGlvbiwgYmV0dGVyIGRhdGEtZmxvdyBhbmFseXNpcyBpcyBwb3NzaWJsZS4KKworICAgIEFsc28sIEBjb21tYW5ke3ZiY2N9IHRyaWVzIHRvIHBsYWNlIGdsb2JhbC9zdGF0aWMgdmFyaWFibGVzIGFuZCB2YXJpYWJsZXMgd2hpY2gKKyAgICBoYXZlIHRoZWlyIGFkZHJlc3MgdGFrZW4gaW4gcmVnaXN0ZXJzLCBpZiBwb3NzaWJsZQorICAgIChAcHhyZWZ7UmVnaXN0ZXIgQWxsb2NhdGlvbn0pLgorCisKK0BpdGVtIEJpdCAxMSAoMjA0OCkKKyAgICBNb3JlIGFnZ3Jlc3NpdmUgbG9vcCBvcHRpbWl6YXRpb25zIGFyZSBwZXJmb3JtZWQgKHNlZSAKKyAgICBAcmVme0xvb3AgVW5yb2xsaW5nfSBhbmQgQHJlZntJbmR1Y3Rpb24gVmFyaWFibGUgRWxpbWluYXRpb259KS4KKyAgICBPbmx5IHdvcmtzIGlmIGJpdCA1ICgzMikgYW5kIGJpdCA3ICgxMjgpIGFyZSBzZXQuCisKK0BpdGVtIEJpdCAxMiAoNDA5NikKKyAgICBQZXJmb3JtIGZ1bmN0aW9uIGlubGluaW5nIChAcHhyZWZ7RnVuY3Rpb24gSW5saW5pbmd9KS4KKworQGl0ZW0gQml0IDEzICg4MTkyKQorICAgIFJlc2VydmVkLgorCitAaXRlbSBCaXQgMTQgKDE2Mzg0KQorICAgIFBlcmZvcm0gaW50ZXItcHJvY2VkdXJhbCBhbmFseXNpcyAoQHB4cmVme0ludGVyLVByb2NlZHVyYWwgQW5hbHlzaXN9KQorICAgIGFuZCBjcm9zcy1tb2R1bGUgb3B0aW1pemF0aW9ucyAoQHB4cmVme0Nyb3NzLU1vZHVsZSBPcHRpbWl6YXRpb25zfSkuCisKK0BlbmQgdGFibGUKKworICAgIEFsc28gbG9vayBhdCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHRhcmdldC1kZXBlbmRlbnQgcGFydCBvZiBAY29tbWFuZHt2YmNjfS4KKyAgICBUaGVyZSBtYXkgYmUgYWRkaXRpb25hbCBtYWNoaW5lIHNwZWNpZmljIG9wdGltaXphdGlvbiBvcHRpb25zLgorCisKK0Bub2RlIFJlZ2lzdGVyIEFsbG9jYXRpb24KK0BzdWJzZWN0aW9uIFJlZ2lzdGVyIEFsbG9jYXRpb24KKworVGhpcyBvcHRpbWl6YXRpb24gdHJpZXMgdG8gYXNzaWduIHZhcmlhYmxlcyBvciB0ZW1wb3JhcmllcyBpbnRvIG1hY2hpbmUKK3JlZ2lzdGVycyB0byBzYXZlIHRpbWUgYW5kIHNwYWNlLiBUaGUgc2NvcGUgYW5kIGRldGFpbHMgb2YgdGhpcyBvcHRpbWl6YXRpb24KK3Zhcnkgb24gdGhlIG9wdGltaXphdGlvbiBsZXZlbC4KKworV2l0aCBAb3B0aW9uey1PMH0gb25seSB0ZW1wb3JhcmllcyBkdXJpbmcgZXhwcmVzc2lvbi1ldmFsdWF0aW9uIGFyZSBwdXQKK2ludG8gcmVnaXN0ZXJzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZy4KKworQXQgdGhlIGRlZmF1bHQgbGV2ZWwgKHdpdGhvdXQgdGhlIG9wdGltaXplciksIGFkZGl0aW9uYWxseSBsb2NhbCB2YXJpYWJsZXMKK3dob3NlIGFkZHJlc3MgaGFzIG5vdCBiZWVuIHRha2VuIG1heSBiZSBwdXQgaW50byByZWdpc3RlcnMgZm9yIGEgd2hvbGUKK2Z1bmN0aW9uLiBUaGUgZGVjaXNpb24gd2hpY2ggdmFyaWFibGVzIHRvIGFzc2lnbiB0byByZWdpc3RlcnMgaXMgYmFzZWQKK29uIHZlcnkgc2ltcGxlIGhldXJpc3RpY3MuCisKK0luIG9wdGltaXppbmcgY29tcGlsYXRpb24gYSBkaWZmZXJlbnQgYWxnb3JpdGhtIHdpbGwgYmUgdXNlZCB3aGljaCB1c2VzCitoaWVyYXJjaGljYWwgbGl2ZS1yYW5nZS1zcGxpdHRpbmcuIFRoaXMgbWVhbnMgdGhhdCB2YXJpYWJsZXMgbWF5IGJlIGFzc2lnbmVkCit0byBkaWZmZXJlbnQgcmVnaXN0ZXJzIGF0IGRpZmZlcmVudCB0aW1lLiBUaGlzIHR5cGljYWxseSBhbGxvd3MgdG8gcHV0IHRoZQorbW9zdCB1c2VkIHZhcmlhYmxlcyBpbnRvIHJlZ2lzdGVycyBpbiBhbGwgaW5uZXIgbG9vcHMuIE5vdGUgdGhhdCB0aGlzCittZWFucyB0aGF0IGEgdmFyaWFibGUgY2FuIGJlIGxvY2F0ZWQgaW4gZGlmZmVyZW50IHJlZ2lzdGVycyBhdCBkaWZmZXJlbnQKK2xvY2F0aW9ucy4gTW9zdCBkZWJ1Z2dlcnMgY2FuIG5vdCBoYW5kbGUgdGhpcy4KKworQWxzbywgdGhlIHVzZSBvZgorcmVnaXN0ZXJzIGNhbiBiZSBndWlkZWQgYnkgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIGJhY2tlbmQsIGlmCithdmFpbGFibGUuIEZvciBhcmNoaXRlY3R1cmVzIHdoaWNoIGFyZSBub3QgdmVyeSBvcnRob2dvbmFsIHRoaXMgYWxsb3dzCit0byBjaG9vc2UgcmVnaXN0ZXJzIHdoaWNoIGFyZSBiZXR0ZXIgc3VpdGVkIHRvIGNlcnRhaW4gb3BlcmF0aW9ucy4KK0NvbnN0YW50cyBjYW4gYWxzbyBiZSBhc3NpZ25lZCB0byByZWdpc3RlcnMsIGlmIHRoaXMgaXMgYmVuZWZpY2lhbCBmb3IKK3RoZSBhcmNoaXRlY3R1cmUuCisKK1RoZSBvcHRpb25zIEBvcHRpb257LXNwZWVkfSBhbmQgQG9wdGlvbnstc2l6ZX0gY2hhbmdlIHRoZSBiZWhhdmlvdXIgb2YgdGhlCityZWdpc3Rlci1hbGxvY2F0b3IgdG8gb3B0aW1pemUgZm9yIHNwZWVkIG9yIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlLgorCitPbiBsb3cgb3B0aW1pemF0aW9uIGxldmVscywgb25seSBsb2NhbCB2YXJpYWJsZXMgd2hvc2UgYWRkcmVzcyBoYXMgbm90CitiZWVuIHRha2VuIHdpbGwgYmUgYXNzaWduZWQgdG8gcmVnaXN0ZXJzLiBPbiBoaWdoZXIgb3B0aW1pemF0aW9uIGxldmVscywKK0Bjb21tYW5ke3ZiY2N9IHdpbGwgYWxzbyB0cnkgdG8gYXNzaWduIGdsb2JhbC9zdGF0aWMgdmFyaWFibGVzIGFuZCB2YXJpYWJsZXMgd2hpY2gKK2hhZCB0aGVpciBhZGRyZXNzIHRha2VuLCB0byByZWdpc3RlcnMuIFR5cGljYWxseSwgdGhpcyBvY2N1cnMgZHVyaW5nCitsb29wcy4gVGhlIHZhcmlhYmxlcyB3aWxsIGJlIGxvYWRlZCBpbnRvIGEgcmVnaXN0ZXIgYmVmb3JlIGVudGVyaW5nIGEgbG9vcAorYW5kIHN0b3JlZCBiYWNrIGFmdGVyIHRoZSBsb29wLiBIb3dldmVyLCB0aGlzIGNhbiBvbmx5IGJlIGRvbmUgaWYgQGNvbW1hbmR7dmJjY30KK2NhbiBkZXRlY3QgdGhhdCB0aGUgdmFyaWFibGUgaXMgbm90IG1vZGlmaWVkIGluIHVucHJlZGljdGFibGUgd2F5cy4KK1RoZXJlZm9yZSwgYWxpYXMtYW5hbHlzaXMgaXMgY3J1Y2lhbCBmb3IgdGhpcyBvcHRpbWl6YXRpb24uCisKK0R1cmluZyByZWdpc3Rlci1hbGxvY2F0aW9uIEBjb21tYW5ke3ZiY2N9IHdpbGwgdXNlIGluZm9ybWF0aW9uIG9uCityZWdpc3RlciB1c2FnZSBvZiBmdW5jdGlvbnMgdG8gbWluaW1pemUgbG9hZGluZy9zYXZpbmcgb2YgcmVnaXN0ZXJzIGJldHdlZW4KK2Z1bmN0aW9uLWNhbGxzLiBUaGVyZWZvcmUsIG90aGVyIG9wdGltaXphdGlvbnMgd2lsbCBhZmZlY3QgcmVnaXN0ZXIKK2FsbG9jYXRpb24uCitTZWUgQHJlZntBbGlhcyBBbmFseXNpc30sIEByZWZ7SW50ZXItUHJvY2VkdXJhbCBBbmFseXNpc30gYW5kCitAcmVme0Nyb3NzLU1vZHVsZSBPcHRpbWl6YXRpb25zfS4KKworCitAbm9kZSBGbG93IE9wdGltaXphdGlvbnMKK0BzdWJzZWN0aW9uIEZsb3cgT3B0aW1pemF0aW9ucworCitXaGVuIG9wdGltaXppbmcgQGNvbW1hbmR7dmJjY30gd2lsbCBjb25zdHJ1Y3QgYSBmbG93Z3JhcGggZm9yIGV2ZXJ5IGZ1bmN0aW9uIGFuZAorcGVyZm9ybSBvcHRpbWl6YXRpb25zIGJhc2VkIG9uIGNvbnRyb2wtZmxvdy4gRm9yIGV4YW1wbGUsIGNvZGUgd2hpY2ggaXMKK3VucmVhY2hhYmxlIHdpbGwgYmUgcmVtb3ZlZCBhbmQgYnJhbmNoZXMgdG8gb3RoZXIgYnJhbmNoZXMgb3IgYnJhbmNoZXMKK2Fyb3VuZCBicmFuY2hlcyB3aWxsIGJlIHNpbXBsaWZpZWQuCisKK0Fsc28sIHVudXNlZCBsYWJlbHMgd2lsbCBiZSByZW1vdmVkIGFuZCBiYXNpYyBibG9ja3MgdW5pdGVkIHRvIGFsbG93IGZ1cnRoZXIKK29wdGltaXphdGlvbnMuCisKK0ZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUKKworQGV4YW1wbGUKK3ZvaWQgZihpbnQgeCwgaW50IHkpCitAeworICBpZih4ID4geSkKKyAgICBnb3RvIGxhYmVsMTsKKyAgcSgpOworbGFiZWwxOgorICBnb3RvIGxhYmVsMjsKKyAgcigpOworbGFiZWwyOgorQH0KK0BlbmQgZXhhbXBsZQorCit3aWxsIGJlIG9wdGltaXplZCBsaWtlOgorCitAZXhhbXBsZQordm9pZCBmKGludCB4LCBpbnQgeSkKK0B7CisgIGlmKHggPD0geSkKKyAgICBxKCk7CitAfQorQGVuZCBleGFtcGxlCisKK0lkZW50aWNhbCBjb2RlIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kIG9mIGJhc2ljIGJsb2NrcyB3aWxsIGJlIG1vdmVkIHRvCit0aGUgc3VjY2Vzc29ycy9wcmVkZWNlc3NvcnMgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLgorCisKK0Bub2RlIENvbW1vbiBTdWJleHByZXNzaW9uIEVsaW1pbmF0aW9uCitAc3Vic2VjdGlvbiBDb21tb24gU3ViZXhwcmVzc2lvbiBFbGltaW5hdGlvbgorCitJZiBhbiBleHByZXNzaW9uIGhhcyBiZWVuIGNvbXB1dGVkIG9uIGFsbCBwYXRocyBsZWFkaW5nIHRvIGEgc2Vjb25kCitldmFsdWF0aW9uIGFuZCBAY29tbWFuZHt2YmNjfSBrbm93cyB0aGF0IHRoZSBvcGVyYW5kcyBoYXZlIG5vdCBiZWVuIGNoYW5nZWQsCit0aGVuIHRoZSByZXN1bHQgb2YgdGhlIG9yaWdpbmFsIGV2YWx1YXRpb24gd2lsbCBiZSByZXVzZWQgaW5zdGVhZCBvZgorcmVjb21wdXRpbmcgaXQuIEFsc28sIG1lbW9yeSBvcGVyYW5kcyB3aWxsIGJlIGxvYWRlZCBpbnRvIHJlZ2lzdGVycyBhbmQKK3JldXNlZCBpbnN0ZWFkIG9mIGJlaW5nIHJlbG9hZGVkLCBpZiBwb3NzaWJsZS4KKworRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZQorCitAZXhhbXBsZQordm9pZCBmKGludCB4LCBpbnQgeSkKK0B7CisgIHEoeCAqIHksIHggKiB5KTsKK0B9CitAZW5kIGV4YW1wbGUKKword2lsbCBiZSBvcHRpbWl6ZWQgbGlrZToKKworQGV4YW1wbGUKK3ZvaWQgZihpbnQgeCwgaW50IHkpCitAeworICBpbnQgdG1wOworCisgIHRtcCA9IHggKiB5OworICBxKHRtcCwgdG1wKTsKK0B9CitAZW5kIGV4YW1wbGUKKworRGVwZW5kaW5nIG9uIHRoZSBvcHRpbWl6YXRpb24gbGV2ZWwsIEBjb21tYW5ke3ZiY2N9IHdpbGwgcGVyZm9ybSB0aGlzIG9wdGltaXphdGlvbgorb25seSBsb2NhbGx5IHdpdGhpbiBiYXNpYyBibG9ja3Mgb3IgZ2xvYmFsbHkgYWNyb3NzIGFuIGVudGlyZSBmdW5jdGlvbi4KKworQXMgdGhpcyBvcHRpbWl6YXRpb24gcmVxdWlyZXMgZGV0ZWN0aW5nIHdoZXRoZXIgb3BlcmFuZCBvZiBhbiBleHByZXNzaW9uCittYXkgaGF2ZSBjaGFuZ2VkLCBpdCB3aWxsIGJlIGFmZmVjdGVkIGJ5IG90aGVyIG9wdGltaXphdGlvbnMuCitTZWUgQHJlZntBbGlhcyBBbmFseXNpc30sIEByZWZ7SW50ZXItUHJvY2VkdXJhbCBBbmFseXNpc30gYW5kCitAcmVme0Nyb3NzLU1vZHVsZSBPcHRpbWl6YXRpb25zfS4KKworCitAbm9kZSBDb3B5IFByb3BhZ2F0aW9uCitAc3Vic2VjdGlvbiBDb3B5IFByb3BhZ2F0aW9uCisKK0lmIGEgdmFyaWFibGUgaXMgYXNzaWduZWQgdG8gYW5vdGhlciBvbmUsIHRoZSBvcmlnaW5hbCB2YXJpYWJsZSB3aWxsIGJlCit1c2VkIGFzIGxvbmcgYXMgaXQgaXMgbm90IG1vZGlmaWVkLiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGluCitjb25qdW5jdGlvbiB3aXRoIG90aGVyIG9wdGltaXphdGlvbnMsIGUuZy4gY29tbW9uIHN1YmV4cHJlc3Npb24gZWxpbWluYXRpb24uCisKK0ZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUKKworQGV4YW1wbGUKK2ludCB5OworCitpbnQgZigpCitAeworICBpbnQgeDsKKyAgeCA9IHk7CisgIHJldHVybiB4OworQH0KK0BlbmQgZXhhbXBsZQorCit3aWxsIGJlIG9wdGltaXplZCBsaWtlOgorCitAZXhhbXBsZQoraW50IHk7CisKK2ludCBmKCkKK0B7CisgIHJldHVybiB5OworQH0KK0BlbmQgZXhhbXBsZQorCitEZXBlbmRpbmcgb24gdGhlIG9wdGltaXphdGlvbiBsZXZlbCwgQGNvbW1hbmR7dmJjY30gd2lsbCBwZXJmb3JtIHRoaXMgb3B0aW1pemF0aW9uCitvbmx5IGxvY2FsbHkgd2l0aGluIGJhc2ljIGJsb2NrcyBvciBnbG9iYWxseSBhY3Jvc3MgYW4gZW50aXJlIGZ1bmN0aW9uLgorCitBcyB0aGlzIG9wdGltaXphdGlvbiByZXF1aXJlcyBkZXRlY3Rpbmcgd2hldGhlciBhIHZhcmlhYmxlCittYXkgaGF2ZSBjaGFuZ2VkLCBpdCB3aWxsIGJlIGFmZmVjdGVkIGJ5IG90aGVyIG9wdGltaXphdGlvbnMuCitTZWUgQHJlZntBbGlhcyBBbmFseXNpc30sIEByZWZ7SW50ZXItUHJvY2VkdXJhbCBBbmFseXNpc30gYW5kCitAcmVme0Nyb3NzLU1vZHVsZSBPcHRpbWl6YXRpb25zfS4KKworCitAbm9kZSBDb25zdGFudCBQcm9wYWdhdGlvbgorQHN1YnNlY3Rpb24gQ29uc3RhbnQgUHJvcGFnYXRpb24KKworSWYgYSB2YXJpYWJsZSBpcyBrbm93biB0byBoYXZlIGEgY29uc3RhbnQgdmFsdWUgKHRoaXMgaW5jbHVkZXMgYWRkcmVzc2VzCitvZiBvYmplY3RzKSBhdCBzb21lIHVzZSwgaXQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgY29uc3RhbnQuCisKK0ZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUKKworQGV4YW1wbGUKK2ludCBmKCkKK0B7CisgIGludCB4OworICB4ID0gMTsKKyAgcmV0dXJuIHg7CitAfQorQGVuZCBleGFtcGxlCisKK3dpbGwgYmUgb3B0aW1pemVkIGxpa2U6CisKK0BleGFtcGxlCitpbnQgZigpCitAeworICByZXR1cm4gMTsKK0B9CitAZW5kIGV4YW1wbGUKKworRGVwZW5kaW5nIG9uIHRoZSBvcHRpbWl6YXRpb24gbGV2ZWwsIEBjb21tYW5ke3ZiY2N9IHdpbGwgcGVyZm9ybSB0aGlzIG9wdGltaXphdGlvbgorb25seSBsb2NhbGx5IHdpdGhpbiBiYXNpYyBibG9ja3Mgb3IgZ2xvYmFsbHkgYWNyb3NzIGFuIGVudGlyZSBmdW5jdGlvbi4KKworQXMgdGhpcyBvcHRpbWl6YXRpb24gcmVxdWlyZXMgZGV0ZWN0aW5nIHdoZXRoZXIgYSB2YXJpYWJsZQorbWF5IGhhdmUgY2hhbmdlZCwgaXQgd2lsbCBiZSBhZmZlY3RlZCBieSBvdGhlciBvcHRpbWl6YXRpb25zLgorU2VlIEByZWZ7QWxpYXMgQW5hbHlzaXN9LCBAcmVme0ludGVyLVByb2NlZHVyYWwgQW5hbHlzaXN9IGFuZAorQHJlZntDcm9zcy1Nb2R1bGUgT3B0aW1pemF0aW9uc30uCisKKworQG5vZGUgRGVhZCBDb2RlIEVsaW1pbmF0aW9uCitAc3Vic2VjdGlvbiBEZWFkIENvZGUgRWxpbWluYXRpb24KKworSWYgYSB2YXJpYWJsZSBpcyBhc3NpZ25lZCBhIHZhbHVlIHdoaWNoIGlzIG5ldmVyIHVzZWQgKGVpdGhlciBiZWNhdXNlIGl0CitpcyBvdmVyd3JpdHRlbiBvciBpdHMgbGlmZXRpbWUgZW5kcyksIHRoZSBhc3NpZ25tZW50IHdpbGwgYmUgcmVtb3ZlZC4KK1RoaXMgb3B0aW1pemF0aW9uIGlzIGNydWNpYWwgdG8gcmVtb3ZlIGNvZGUgd2hpY2ggaGFzIGJlY29tZSBkZWFkIGR1ZQordG8gb3RoZXIgb3B0aW1pemF0aW9ucy4KKworRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZQorCitAZXhhbXBsZQoraW50IHg7CisKK3ZvaWQgZigpCitAeworICBpbnQgeTsKKyAgeCA9IDE7CisgIHkgPSAyOworICB4ID0gMzsKK0B9CitAZW5kIGV4YW1wbGUKKword2lsbCBiZSBvcHRpbWl6ZWQgbGlrZToKKworQGV4YW1wbGUKK2ludCB4OworCit2b2lkIGYoKQorQHsKKyAgeCA9IDM7CitAfQorQGVuZCBleGFtcGxlCisKK0FzIHRoaXMgb3B0aW1pemF0aW9uIHJlcXVpcmVzIGRldGVjdGluZyB3aGV0aGVyIGEgdmFyaWFibGUKK21heSBiZSByZWFkLCBpdCB3aWxsIGJlIGFmZmVjdGVkIGJ5IG90aGVyIG9wdGltaXphdGlvbnMuCitTZWUgQHJlZntBbGlhcyBBbmFseXNpc30sIEByZWZ7SW50ZXItUHJvY2VkdXJhbCBBbmFseXNpc30gYW5kCitAcmVme0Nyb3NzLU1vZHVsZSBPcHRpbWl6YXRpb25zfS4KKworQG5vZGUgTG9vcC1JbnZhcmlhbnQgQ29kZSBNb3Rpb24KK0BzdWJzZWN0aW9uIExvb3AtSW52YXJpYW50IENvZGUgTW90aW9uCisKK0lmIHRoZSBvcGVyYW5kcyBvZiBhIGNvbXB1dGF0aW9uIHdpdGhpbiBhIGxvb3Agd2lsbCBub3QgY2hhbmdlCitkdXJpbmcgaXRlcmF0aW9ucywgdGhlIGNvbXB1dGF0aW9uIHdpbGwgYmUgbW92ZWQgb3V0c2lkZSBvZiB0aGUKK2xvb3AuCisKK0ZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUKKworQGV4YW1wbGUKK3ZvaWQgZihpbnQgeCwgaW50IHkpCitAeworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspCisgICAgcSh4ICogeSk7CitAfQorQGVuZCBleGFtcGxlCisKK3dpbGwgYmUgb3B0aW1pemVkIGxpa2U6CisKK0BleGFtcGxlCit2b2lkIGYoaW50IHgsIGludCB5KQorQHsKKyAgaW50IGksIHRtcCA9IHggKiB5OworCisgIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykKKyAgICBxKHRtcCk7CitAfQorQGVuZCBleGFtcGxlCisKK0FzIHRoaXMgb3B0aW1pemF0aW9uIHJlcXVpcmVzIGRldGVjdGluZyB3aGV0aGVyIG9wZXJhbmRzIG9mIGFuIGV4cHJlc3Npb24KK21heSBoYXZlIGNoYW5nZWQsIGl0IHdpbGwgYmUgYWZmZWN0ZWQgYnkgb3RoZXIgb3B0aW1pemF0aW9ucy4KK1NlZSBAcmVme0FsaWFzIEFuYWx5c2lzfSwgQHJlZntJbnRlci1Qcm9jZWR1cmFsIEFuYWx5c2lzfSBhbmQKK0ByZWZ7Q3Jvc3MtTW9kdWxlIE9wdGltaXphdGlvbnN9LgorCisKK0Bub2RlIFN0cmVuZ3RoIFJlZHVjdGlvbgorQHN1YnNlY3Rpb24gU3RyZW5ndGggUmVkdWN0aW9uCisKK1RoaXMgaXMgYW4gb3B0aW1pemF0aW9uIGFwcGxpZWQgdG8gbG9vcHMgaW4gb3JkZXIgdG8gcmVwbGFjZSBtb3JlIGNvc3RseQorb3BlcmF0aW9ucyAodXN1YWxseSBtdWx0aXBsaWNhdGlvbnMpIGJ5IGNoZWFwZXIgb25lcyAodHlwaWNhbGx5IGFkZGl0aW9ucykuCitMaW5lYXIgZnVuY3Rpb25zIG9mIGFuIGluZHVjdGlvbiB2YXJpYWJsZSAoYSB2YXJpYWJsZSB3aGljaCBpcyBjaGFuZ2VkIGJ5CithIGxvb3AtaW52YXJpYW50IHZhbHVlIGluIGV2ZXJ5IGl0ZXJhdGlvbikgd2lsbCBiZSByZXBsYWNlZCBieSBuZXcKK2luZHVjdGlvbiB2YXJpYWJsZXMuIElmIHBvc3NpYmxlLCB0aGUgb3JpZ2luYWwgaW5kdWN0aW9uIHZhcmlhYmxlIHdpbGwgYmUKK2VsaW1pbmF0ZWQuCisKK0FzIGFycmF5IGFjY2Vzc2VzIGFyZSBhY3R1YWxseSBjb21wb3NlZCBvZiBtdWx0aXBsaWNhdGlvbnMgYW5kIGFkZGl0aW9ucywKK3RoZXkgb2Z0ZW4gYmVuZWZpdCBzaWduaWZpY2FudGx5IGJ5IHRoaXMgb3B0aW1pemF0aW9uLgorCitGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlCisKK0BleGFtcGxlCit2b2lkIGYoaW50ICpwKQorQHsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgIHBbaV0gPSBpOworQH0KK0BlbmQgZXhhbXBsZQorCit3aWxsIGJlIG9wdGltaXplZCBsaWtlOgorCitAZXhhbXBsZQordm9pZCBmKGludCAqcCkKK0B7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykKKyAgICAqcCsrID0gaTsKK0B9CitAZW5kIGV4YW1wbGUKKworQXMgdGhpcyBvcHRpbWl6YXRpb24gcmVxdWlyZXMgZGV0ZWN0aW5nIHdoZXRoZXIgb3BlcmFuZHMgb2YgYW4gZXhwcmVzc2lvbgorbWF5IGhhdmUgY2hhbmdlZCwgaXQgd2lsbCBiZSBhZmZlY3RlZCBieSBvdGhlciBvcHRpbWl6YXRpb25zLgorU2VlIEByZWZ7QWxpYXMgQW5hbHlzaXN9LCBAcmVme0ludGVyLVByb2NlZHVyYWwgQW5hbHlzaXN9IGFuZAorQHJlZntDcm9zcy1Nb2R1bGUgT3B0aW1pemF0aW9uc30uCisKKworQG5vZGUgSW5kdWN0aW9uIFZhcmlhYmxlIEVsaW1pbmF0aW9uCitAc3Vic2VjdGlvbiBJbmR1Y3Rpb24gVmFyaWFibGUgRWxpbWluYXRpb24KKworSWYgYW4gaW5kdWN0aW9uIHZhcmlhYmxlIGlzIG9ubHkgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZgoraXRlcmF0aW9ucyB0aHJvdWdoIHRoZSBsb29wLCBpdCB3aWxsIGJlIHJlbW92ZWQuIEluc3RlYWQsIGEgbmV3IHZhcmlhYmxlCit3aWxsIGJlIGNyZWF0ZWQgd2hpY2ggY291bnRzIGRvd24gdG8gemVyby4gVGhpcyBpcyBnZW5lcmFsbHkgZmFzdGVyCithbmQgb2Z0ZW4gZW5hYmxlcyBzcGVjaWFsIGRlY3JlbWVudC1hbmQtYnJhbmNoIG9yIGRlY3JlbWVudC1hbmQtY29tcGFyZQoraW5zdHJ1Y3Rpb25zLgorCitGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlCisKK0BleGFtcGxlCit2b2lkIGYoaW50IG4pCitAeworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHB1dHMoImhlbGxvIik7CitAfQorQGVuZCBleGFtcGxlCisKK3dpbGwgYmUgb3B0aW1pemVkIGxpa2U6CisKK0BleGFtcGxlCit2b2lkIGYoaW50IG4pCitAeworICBpbnQgdG1wOworCisgIGZvcih0bXAgPSBuOyB0bXAgPiAwOyB0bXAtLSkKKyAgICBwdXRzKCJoZWxsbyIpOworCitAfQorQGVuZCBleGFtcGxlCisKK0FzIHRoaXMgb3B0aW1pemF0aW9uIHJlcXVpcmVzIGRldGVjdGluZyB3aGV0aGVyIG9wZXJhbmRzIG9mIGFuIGV4cHJlc3Npb24KK21heSBoYXZlIGNoYW5nZWQsIGl0IHdpbGwgYmUgYWZmZWN0ZWQgYnkgb3RoZXIgb3B0aW1pemF0aW9ucy4KK1NlZSBAcmVme0FsaWFzIEFuYWx5c2lzfSwgQHJlZntJbnRlci1Qcm9jZWR1cmFsIEFuYWx5c2lzfSBhbmQKK0ByZWZ7Q3Jvc3MtTW9kdWxlIE9wdGltaXphdGlvbnN9LgorCisKK0Bub2RlIExvb3AgVW5yb2xsaW5nCitAc3Vic2VjdGlvbiBMb29wIFVucm9sbGluZworCitAY29tbWFuZHt2YmNjfSByZWR1Y2VzIHRoZSBsb29wIG92ZXJoZWFkIGJ5IHJlcGxpY2F0aW5nIHRoZSBsb29wIGJvZHkKK2FuZCByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuIEFsc28sICBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgYmV0d2VlbgorZGlmZmVyZW50IGl0ZXJhdGlvbnMgb2YgdGhlIGxvb3Agd2lsbCBvZnRlbiBiZSBlbmFibGVkIGJ5IGNyZWF0aW5nIGxhcmdlcgorYmFzaWMgYmxvY2tzLiBIb3dldmVyLCBjb2RlLXNpemUgYXMgd2VsbCBhcyBjb21waWxhdGlvbi10aW1lcyBjYW4KK2luY3JlYXNlIHNpZ25pZmljYW50bHkuCisKK1RoaXMgb3B0aW1pemF0aW9uIGNhbiBiZSBjb250cm9sbGVkIGJ5IEBvcHRpb257LXVucm9sbC1zaXplfSBhbmQKK0BvcHRpb257LXVucm9sbC1hbGx9LiBAb3B0aW9uey11bnJvbGwtc2l6ZX0gc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlcgorb2YgaW50ZXJtZWRpYXRlIGluc3RydWN0aW9ucyBmb3IgdGhlIHVucm9sbGVkIGxvb3AgYm9keS4gQGNvbW1hbmR7dmJjY30gd2lsbCB0cnkKK3RvIHVucm9sbCB0aGUgbG9vcCBhcyBtYW55IHRpbWVzIHRvIHN1aXQgdGhpcyB2YWx1ZS4KKworSWYgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIGlzIGNvbnN0YW50IGFuZCB0aGUgc2l6ZSBvZiB0aGUgbG9vcCBib2R5CittdWx0aXBsaWVkIGJ5IHRoaXMgbnVtYmVyIGlzIGxlc3Mgb3IgZXF1YWwgdG8gdGhlIHZhbHVlIHNwZWNpZmllZCBieQorQG9wdGlvbnstdW5yb2xsLXNpemV9LCB0aGUgbG9vcCB3aWxsIGJlIHVucm9sbGVkIGNvbXBsZXRlbHkuIElmCit0aGUgbG9vcCBpcyBrbm93biB0byBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsIGl0IHdpbGwgYWx3YXlzIGJlIHVucm9sbGVkCitjb21wbGV0ZWx5LgorCitGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlCisKK0BleGFtcGxlCit2b2lkIGYoKQorQHsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICBxKGkpOworQH0KK0BlbmQgZXhhbXBsZQorCit3aWxsIGJlIG9wdGltaXplZCBsaWtlOgorCitAZXhhbXBsZQordm9pZCBmKCkKK0B7CisgIHEoMCk7CisgIHEoMSk7CisgIHEoMik7CisgIHEoMyk7CitAfQorQGVuZCBleGFtcGxlCisKK0lmIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9uIGlzIGNvbnN0YW50IHRoZSBsb29wIHdpbGwgYmUgdW5yb2xsZWQgYXMgbWFueQordGltZXMgYXMgcGVybWl0dGVkIGJ5IHRoZSBzaXplIG9mIHRoZSBsb29wIGFuZCBAb3B0aW9uey11bnJvbGwtc2l6ZX0uIElmIHRoZQorbnVtYmVyIG9mIGl0ZXJhdGlvbnMgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIG51bWJlciBvZiByZXBsaWNhdGlvbnMsIHRoZQorcmVtYWluaW5nIGl0ZXJhdGlvbnMgd2lsbCBiZSB1bnJvbGxlZCBzZXBhcmF0ZWx5LgorCitGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlCisKK0BleGFtcGxlCit2b2lkIGYoKQorQHsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IDEwMjsgaSsrKQorICAgIHEoaSk7CitAfQorQGVuZCBleGFtcGxlCisKK3dpbGwgYmUgb3B0aW1pemVkIGxpa2U6CisKK0BleGFtcGxlCit2b2lkIGYoKQorQHsKKyAgaW50IGk7CisgIHEoMCk7CisgIHEoMSk7CisgIGZvcihpID0gMjsgaSA8IDEwMjspQHsKKyAgICBxKGkrKyk7CisgICAgcShpKyspOworICAgIHEoaSsrKTsKKyAgICBxKGkrKyk7CisgIEB9CitAfQorQGVuZCBleGFtcGxlCisKK0J5IGRlZmF1bHQsIG9ubHkgbG9vcHMgd2l0aCBhIGNvbnN0YW50IG51bWJlciBvZiBpdGVyYXRpb25zIHdpbGwgYmUKK3Vucm9sbGVkLiBIb3dldmVyLCBpZiBAb3B0aW9uey11bnJvbGwtYWxsfSBpcyBzcGVjaWZpZWQsIEBjb21tYW5ke3ZiY2N9IHdpbGwgYWxzbwordW5yb2xsIGxvb3BzIGlmIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBjYW4gYmUgY2FsY3VsYXRlZCBhdCBlbnRyeSB0bwordGhlIGxvb3AuCisKK0ZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUKKworQGV4YW1wbGUKK3ZvaWQgZihpbnQgbikKK0B7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgcShpKTsKK0B9CitAZW5kIGV4YW1wbGUKKword2lsbCBiZSBvcHRpbWl6ZWQgbGlrZToKKworQGV4YW1wbGUKK3ZvaWQgZihpbnQgbikKK0B7CisgIGludCBpLCB0bXA7CisKKyAgaSA9IDA7CisgIHRtcCA9IG4gJiAzOworICBzd2l0Y2godG1wKUB7CisgIGNhc2UgMzoKKyAgICBxKGkrKyk7CisgIGNhc2UgMjoKKyAgICBxKGkrKyk7CisgIGNhc2UgMToKKyAgICBxKGkrKyk7ICAgCisgIEB9CisgIHdoaWxlKGkgPCBuKUB7CisgICAgcShpKyspOworICAgIHEoaSsrKTsKKyAgICBxKGkrKyk7CisgICAgcShpKyspOworICBAfQorQH0KK0BlbmQgZXhhbXBsZQorCitBcyB0aGlzIG9wdGltaXphdGlvbiByZXF1aXJlcyBkZXRlY3Rpbmcgd2hldGhlciBvcGVyYW5kcyBvZiBhbiBleHByZXNzaW9uCittYXkgaGF2ZSBjaGFuZ2VkLCBpdCB3aWxsIGJlIGFmZmVjdGVkIGJ5IG90aGVyIG9wdGltaXphdGlvbnMuCitTZWUgQHJlZntBbGlhcyBBbmFseXNpc30sIEByZWZ7SW50ZXItUHJvY2VkdXJhbCBBbmFseXNpc30gYW5kCitAcmVme0Nyb3NzLU1vZHVsZSBPcHRpbWl6YXRpb25zfS4KKworCitAbm9kZSBGdW5jdGlvbiBJbmxpbmluZworQHN1YnNlY3Rpb24gRnVuY3Rpb24gSW5saW5pbmcKKworVG8gcmVkdWNlIHRoZSBvdmVyaGVhZCwgYSBmdW5jdGlvbiBjYWxsIGNhbiBiZSBleHBhbmRlZCBpbmxpbmUuIFBhc3NpbmcKK3BhcmFtZXRlcnMgY2FuIGJlIG9wdGltaXplZCBhcyB0aGUgYXJndW1lbnRzIGNhbiBiZSBkaXJlY3RseSBhY2Nlc3NlZAorYnkgdGhlIGlubGluZWQgZnVuY3Rpb24uIEFsc28sIGZ1cnRoZXIgb3B0aW1pemF0aW9ucyBhcmUgZW5hYmxlZCwgZS5nLgorY29uc3RhbnQgYXJndW1lbnRzIGNhbiBiZSBldmFsdWF0ZWQgb3IgY29tbW9uIHN1YmV4cHJlc3Npb25zIGJldHdlZW4KK3RoZSBjYWxsZXIgYW5kIHRoZSBjYWxsZWUgY2FuIGJlIGVsaW1pbmF0ZWQuIEFuIGlubGluZWQgZnVuY3Rpb24gY2FsbCBpcworYXMgZmFzdCBhcyBhIG1hY3JvLiBIb3dldmVyIChqdXN0IGFzIHdpdGggdXNpbmcgbGFyZ2UgbWFjcm9zKSwgY29kZSBzaXplIGFuZAorY29tcGlsYXRpb24gdGltZSBjYW4gaW5jcmVhc2Ugc2lnbmlmaWNhbnRseS4KKworVGhlcmVmb3JlLCB0aGlzIG9wdGltaXphdGlvbiBjYW4gYmUgY29udHJvbGxlZCB3aXRoIEBvcHRpb257LWlubGluZS1zaXplfSBhbmQKK0BvcHRpb257LWlubGluZS1kZXB0aH0uIEBjb21tYW5ke3ZiY2N9IHdpbGwgb25seSBpbmxpbmUgZnVuY3Rpb25zIHdoaWNoIGNvbnRhaW4KK2xlc3MgaW50ZXJtZWRpYXRlIGluc3RydWN0aW9ucyB0aGFuIHNwZWNpZmllZCB3aXRoIHRoaXMgb3B0aW9uLgorCitGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlCisKK0BleGFtcGxlCitpbnQgZihpbnQgbikKK0B7CisgIHJldHVybiBxKCZuLDEpOworQH0KKwordm9pZCBxKGludCAqeCwgaW50IHkpCitAeworICBpZih5ID4gMCkKKyAgICAqeCA9ICp4ICsgeTsKKyAgZWxzZQorICAgIGFib3J0KCk7CitAfQorQGVuZCBleGFtcGxlCisKK3dpbGwgYmUgb3B0aW1pemVkIGxpa2U6CisKK0BleGFtcGxlCitpbnQgZihpbnQgbikKK0B7CisgIHJldHVybiBuICsgMTsKK0B9CisKK3ZvaWQgcShpbnQgKngsIGludCB5KQorQHsKKyAgaWYoeSA+IDApCisgICAgKnggPSAqeCArIHk7CisgIGVsc2UKKyAgICBhYm9ydCgpOworQH0KK0BlbmQgZXhhbXBsZQorCitJZiBhIGZ1bmN0aW9uIHRvIGJlIGlubGluZWQgY2FsbHMgYW5vdGhlciBmdW5jdGlvbiwgdGhhdCBmdW5jdGlvbiBjYW4gYWxzbyBiZQoraW5saW5lZC4gVGhpcyBhbHNvIGluY2x1ZGVzIGEgcmVjdXJzaXZlIGNhbGwgb2YgdGhlIGZ1bmN0aW9uLgorCitGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlCisKK0BleGFtcGxlCitpbnQgZihpbnQgbikKK0B7CisgIGlmKG4gPCAyKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIGYobiAtIDEpICsgZihuIC0gMik7CitAfQorQGVuZCBleGFtcGxlCisKK3dpbGwgYmUgb3B0aW1pemVkIGxpa2U6CisKK0BleGFtcGxlCitpbnQgZihpbnQgbikKK0B7CisgIGlmKG4gPCAyKQorICAgIHJldHVybiAxOworICBlbHNlQHsKKyAgICBpbnQgdG1wMSA9IG4gLSAxLCB0bXAyLCB0bXAzID0gbiAtIDIsIHRtcDQ7CisgICAgaWYodG1wMSA8IDIpCisgICAgICB0bXAyID0gMTsKKyAgICBlbHNlCisgICAgICB0bXAyID0gZih0bXAxIC0gMSkgKyBmKHRtcDIgLSAyKTsKKyAgICBpZih0bXAzIDwgMikKKyAgICAgIHRtcDQgPSAxOworICAgIGVsc2UKKyAgICAgIHRtcDQgPSBmKHRtcDMgLSAxKSArIGYodG1wMyAtIDIpOworICAgIHJldHVybiB0bXAyICsgdG1wNDsKKyAgQH0KK0B9CitAZW5kIGV4YW1wbGUKKworQnkgZGVmYXVsdCwgb25seSBvbmUgbGV2ZWwgb2YgaW5saW5pbmcgaXMgZG9uZS4gVGhlIG1heGltdW0gbmVzdGluZyBvZgoraW5saW5pbmcgY2FuIGJlIHNldCB3aXRoIEBvcHRpb257LWlubGluZS1kZXB0aH0uIEhvd2V2ZXIsIHRoaXMgb3B0aW9uCitzaG91bGQgYmUgdXNlZCB3aXRoIGNhcmUuIFRoZSBjb2RlLXNpemUgY2FuIGluY3JlYXNlIHZlcnkgZmFzdCBhbmQgaW4KK21hbnkgY2FzZXMgdGhlIGNvZGUgd2lsbCBiZSBzbG93ZXIuIE9ubHkgdXNlIGl0IGZvciBmaW5lLXR1bmluZyBhZnRlcgorbWVhc3VyaW5nIGlmIGl0IGlzIHJlYWxseSBiZW5lZmljaWFsLgorCisKK0F0IGxvd2VyIG9wdGltaXphdGlvbiBsZXZlbHMgYSBmdW5jdGlvbiBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHNhbWUKK3RyYW5zbGF0aW9uLXVuaXQgYXMgdGhlIGNhbGxlciB0byBiZSBpbmxpbmVkLiBXaXRoIGNyb3NzLW1vZHVsZQorb3B0aW1pemF0aW9ucywgQGNvbW1hbmR7dmJjY30gd2lsbCBhbHNvIGlubGluZSBmdW5jdGlvbnMgd2hpY2ggYXJlIGRlZmluZWQgaW4KK290aGVyIGZpbGVzLiBAeHJlZntDcm9zcy1Nb2R1bGUgT3B0aW1pemF0aW9uc30uCisKKworU2VlIGFsc28gQHJlZntJbmxpbmUtQXNzZW1ibHkgRnVuY3Rpb25zfS4KKworCisKK0Bub2RlIEludHJpbnNpYyBGdW5jdGlvbnMKK0BzdWJzZWN0aW9uIEludHJpbnNpYyBGdW5jdGlvbnMKKworVGhpcyBvcHRpbWl6YXRpb24gd2lsbCByZXBsYWNlIGNhbGxzIHRvIHNvbWUga25vd24gZnVuY3Rpb25zCisodXN1YWxseSBsaWJyYXJ5IGZ1bmN0aW9ucykgd2l0aCBjYWxscyB0byBkaWZmZXJlbnQgZnVuY3Rpb25zIG9yCitzcGVjaWFsIGlubGluZS1jb2RlLiBUaGlzIG9wdGltaXphdGlvbiB1c3VhbGx5IGRlcGVuZHMgb24gdGhlCithcmd1bWVudHMgdG8gYSBmdW5jdGlvbi4gVHlwaWNhbCBjYW5kaWRhdGVzIGFyZSB0aGUgQGNvZGV7cHJpbnRmfQorZmFtaWx5IG9mIGZ1bmN0aW9ucyBhbmQgc3RyaW5nLWZ1bmN0aW9ucyBhcHBsaWVkIHRvIHN0cmluZy1saXRlcmFscy4KKworRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZQorCitAZXhhbXBsZQoraW50IGYoKQorQHsKKyAgcmV0dXJuIHN0cmxlbigidmJjYyIpOworQH0KK0BlbmQgZXhhbXBsZQorCit3aWxsIGJlIG9wdGltaXplZCBsaWtlOgorCitAZXhhbXBsZQoraW50IGYoKQorQHsKKyAgcmV0dXJuIDQ7CitAfQorQGVuZCBleGFtcGxlCisKK05vdGUgdGhhdCB0aGVyZSBhcmUgYWxzbyBvdGhlciBwb3NzaWJpbGl0aWVzIG9mIHByb3ZpZGluZyBzcGVjaWFsbHkKK29wdGltaXplZCBsaWJyYXJ5IGZ1bmN0aW9ucy4gU2VlIEByZWZ7SW5saW5lLUFzc2VtYmx5IEZ1bmN0aW9uc30gYW5kCitAcmVme0Z1bmN0aW9uIElubGluaW5nfS4KKworCitAbm9kZSBVbnVzZWQgT2JqZWN0IEVsaW1pbmF0aW9uCitAc3Vic2VjdGlvbiBVbnVzZWQgT2JqZWN0IEVsaW1pbmF0aW9uCisKK0RlcGVuZGluZyBvbiB0aGUgb3B0aW1pemF0aW9uIGxldmVsLCBAY29tbWFuZHt2YmNjfSB3aWxsIHRyeSB0byBlbGltaW5hdGUgZGlmZmVyZW50CitvYmplY3RzIGFuZCByZWR1Y2UgdGhlIHNpemUgbmVlZGVkIGZvciBvYmplY3RzLgorCitHZW5lcmFsbHksIEBjb21tYW5ke3ZiY2N9IHdpbGwgdHJ5IHRvIHVzZSBjb21tb24gc3RvcmFnZSBmb3IgbG9jYWwgbm9uLXN0YXRpYyB2YXJpYWJsZXMKK3dpdGggbm9uLW92ZXJsYXBwaW5nIGxpdmUtcmFuZ2VzIC4KKworQXQgc29tZSBvcHRpbWl6YXRpb24gbGV2ZWxzIGFuZCB3aXRoIEBvcHRpb257LXNpemV9IHNwZWNpZmllZCwgQGNvbW1hbmR7dmJjY30gd2lsbCB0cnkgdG8KK29yZGVyIHRoZSBwbGFjZW1lbnQgb2YgdmFyaWFibGVzIHdpdGggc3RhdGljIHN0b3JhZ2UtZHVyYXRpb24gdG8gbWluaW1pemUKK3BhZGRpbmcgbmVlZGVkIGR1ZSB0byBkaWZmZXJlbnQgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4gVGhpcyBvcHRpbWl6YXRpb24KK2dlbmVyYWxseSBiZW5lZml0cyBmcm9tIGFuIGluY3JlYXNlZCBzY29wZSBvZiBvcHRpbWl6YXRpb24uCitAeHJlZntDcm9zcy1Nb2R1bGUgT3B0aW1pemF0aW9uc30uCisKK0F0IGhpZ2hlciBvcHRpbWl6YXRpb24gbGV2ZWxzIG9iamVjdHMgYW5kIGZ1bmN0aW9ucyB3aGljaCBhcmUgbm90CityZWZlcmVuY2VkIGFyZSBlbGltaW5hdGVkLiBUaGlzIGluY2x1ZGVzIGZ1bmN0aW9ucyB3aGljaCBoYXZlIGFsd2F5cworYmVlbiBpbmxpbmVkIG9yIHZhcmlhYmxlcyB3aGljaCBoYXZlIGFsd2F5cyBiZWVuIHJlcGxhY2VkIGJ5IGNvbnN0YW50cy4KKworV2hlbiB1c2luZyBzZXBhcmF0ZSBjb21waWxhdGlvbiwgb2JqZWN0cyBhbmQgZnVuY3Rpb25zIHdpdGggZXh0ZXJuYWwKK2xpbmthZ2UgdXN1YWxseSBjYW5ub3QgYmUgZWxpbWluYXRlZCwgYmVjYXVzZSB0aGV5IG1pZ2h0IGJlIHJlZmVyZW5jZWQKK2Zyb20gb3RoZXIgdHJhbnNsYXRpb24tdW5pdHMuIFRoaXMgcHJlY2x1ZGVzIGFsc28gZWxpbWluYXRpb24gb2YgYW55dGhpbmcKK3JlZmVyZW5jZWQgYnkgc3VjaCBhbiBvYmplY3Qgb3IgZnVuY3Rpb24uCisKK0hvd2V2ZXIsIHVudXNlZCBvYmplY3RzIGFuZCBmdW5jdGlvbnMgd2l0aAorZXh0ZXJuYWwgbGlua2FnZSBjYW4gYmUgZWxpbWluYXRlZCBpZiBAb3B0aW9uey1maW5hbH0gaXMgc3BlY2lmaWVkLgorSW4gdGhpcyBjYXNlIEBjb21tYW5ke3ZiY2N9IHdpbGwgYXNzdW1lIHRoYXQgYmFzaWNhbGx5IHRoZSBlbnRpcmUgcHJvZ3JhbSBpcyBwcmVzZW50ZWQKK2FuZCBlbGltaW5hdGUgZXZlcnl0aGluZyB3aGljaCBpcyBub3QgcmVmZXJlbmNlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5Citmcm9tIG1haW4oKS4gSWYgc29tZSBvYmplY3RzIGFyZSBub3QgcmVmZXJlbmNlZCBidXQgbXVzdCBub3QgYmUKK2VsaW1pbmF0ZWQsIHRoZXkgaGF2ZSB0byBiZSBkZWNsYXJlZCB3aXRoIHRoZSBAY29kZXtfX2VudHJ5fSBhdHRyaWJ1dGUuCitUeXBpY2FsIGV4YW1wbGVzIGFyZSBjYWxsYmFjayBmdW5jdGlvbnMgd2hpY2ggYXJlIGNhbGxlZCBmcm9tIGEgbGlicmFyeQorZnVuY3Rpb24gb3IgZnJvbSBhbnl3aGVyZSBvdXRzaWRlIHRoZSBwcm9ncmFtLCBpbnRlcnJ1cHQtaGFuZGxlcnMgb3IKK290aGVyIGRhdGEgd2hpY2ggc2hvdWxkIGJlIHByZXNlcnZlZC4KK0B4cmVme0Nyb3NzLU1vZHVsZSBPcHRpbWl6YXRpb25zfS4KKworCisKK0Bub2RlIEFsaWFzIEFuYWx5c2lzCitAc3Vic2VjdGlvbiBBbGlhcyBBbmFseXNpcworCitNYW55IG9wdGltaXphdGlvbnMgY2FuIG9ubHkgYmUgZG9uZSBpZiBpdCBpcyBrbm93biB0aGF0IHR3byBleHByZXNzaW9ucworYXJlIG5vdCBhbGlhc2VkLCBpLmUuIHRoZXkgZG8gbm90IHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdC4KK0lmIHN1Y2ggaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSwgd29yc3QtY2FzZSBhc3N1bXB0aW9ucyBoYXZlIHRvIGJlCittYWRlIGluIG9yZGVyIHRvIGNyZWF0ZSBjb3JyZWN0IGNvZGUuIEluIHRoZSBDCitsYW5ndWFnZSBhbGlhc2luZyBjYW4gb2NjdXIgYnkgdXNlIG9mIHBvaW50ZXJzLiBBcyBwb2ludGVycyBhcmUgZ2VuZXJhbGx5CithIHZlcnkgZnJlcXVlbnRseSB1c2VkIGZlYXR1cmUgb2YgQyBhbmQgYWxzbyBhcnJheSBhY2Nlc3NlcyBhcmUganVzdAorZGlzZ3Vpc2VkIHBvaW50ZXIgYXJpdGhtZXRpYywgYWxpYXMgYW5hbHlzaXMgaXMgdmVyeSBpbXBvcnRhbnQuCisKK0Bjb21tYW5ke3ZiY2N9IHVzZXMgdGhlIGZvbGxvd2luZyBtZXRob2RzIHRvIG9idGFpbiBhbGlhc2luZyBpbmZvcm1hdGlvbjoKKworQGl0ZW1pemUgQG1pbnVzCitAaXRlbSBUaGUgQyBsYW5ndWFnZSBkb2VzIG5vdCBhbGxvdyBhY2Nlc3NpbmcgYW4gb2JqZWN0IHVzaW5nIGFuIGx2YWx1ZQorICAgICAgICBvZiBhIGRpZmZlcmVudCB0eXBlLiBFeGNlcHRpb25zIGFyZSBhY2Nlc3NpbmcgYW4gb2JqZWN0IHVzaW5nIGEKKyAgICAgICAgcXVhbGlmaWVkIHZlcnNpb24gb2YgdGhlIHNhbWUgdHlwZSBhbmQgYWNjZXNzaW5nIGFuIG9iamVjdCB1c2luZworICAgICAgICBhIGNoYXJhY3RlciB0eXBlLiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgQGNvZGV7cDF9IGFuZCBAY29kZXtwMn0KKyAgICAgICAgbXVzdCBub3QgcG9pbnQgdG8gdGhlIHNhbWUgb2JqZWN0OgorCitAZXhhbXBsZQorZihpbnQgKnAxLCBsb25nICpwMikKK0B7CisgIC4uLgorQH0KK0BlbmQgZXhhbXBsZQorCisgICAgICAgIEBjb21tYW5ke3ZiY2N9IHdpbGwgYXNzdW1lIHRoYXQgdGhlIHNvdXJjZSBpcyBjb3JyZWN0IGFuZCBkb2VzIG5vdCBicmVhaworICAgICAgICB0aGlzIHJlcXVpcmVtZW50IG9mIHRoZSBDIGxhbmd1YWdlLiBJZiBhIHByb2dyYW0gZG9lcyBicmVhayB0aGlzCisgICAgICAgIHJlcXVpcmVtZW50IGFuZCBjYW5ub3QgYmUgZml4ZWQsIHRoZW4gQGNvZGV7LW5vLWFsaWFzLW9wdH0gbXVzdCBiZQorICAgICAgICBzcGVjaWZpZWQgYW5kIHNvbWUgcGVyZm9ybWFuY2Ugd2lsbCBiZSBsb3N0LgorCitAaXRlbSBBdCBoaWdoZXIgb3B0aW1pemF0aW9uIGxldmVscywgQGNvbW1hbmR7dmJjY30gd2lsbCB0cnkgdG8ga2VlcCB0cmFjayBvZiBhbGwKKyAgICAgICAgb2JqZWN0cyBhIHBvaW50ZXIgY2FuIHBvaW50IHRvLiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIEBjb21tYW5ke3ZiY2N9CisgICAgICAgIHdpbGwgc2VlIHRoYXQgQGNvZGV7cDF9IGNhbiBvbmx5IHBvaW50IHRvIEBjb2Rle3h9IG9yIEBjb2Rle3l9CisgICAgICAgIHdoZXJlYXMgQGNvZGV7cDJ9IGNhbiBvbmx5IHBvaW50IHRvIEBjb2Rle3p9LiBUaGVyZWZvcmUgaXQKKyAgICAgICAga25vd3MgdGhhdCBAY29kZXtwMX0gYW5kIEBjb2Rle3AyfSBhcmUgbm90IGFsaWFzZWQuCisKK0BleGFtcGxlCitpbnQgeFsxMF0sIHlbMTBdLCB6WzEwXTsKKworaW50IGYoaW50IGEsIGludCBiLCBpbnQgYykKK0B7CisgIGludCAqcDEsICpwMjsKKworICBpZihhIDwgYikKKyAgICBwMSA9ICZ4W2FdOworICBlbHNlCisgICAgcDEgPSAmeVtiXTsKKworICBwMiA9ICZ6W2NdOworCisgIC4uLgorQH0KK0BlbmQgZXhhbXBsZQorCisgICAgICAgIEFzIHBvaW50ZXJzIGl0c2VsZiBtYXkgYmUgYWxpYXNlZCBhbmQgZnVuY3Rpb24gY2FsbHMgbWlnaHQKKyAgICAgICAgbW9kaWZ5IHBvaW50ZXJzLCB0aGlzIGFuYWx5c2lzIHNvbWV0aW1lcyBiZW5lZml0cyBmcm9tIGEgbGFyZ2VyCisgICAgICAgIHNjb3BlIG9mIG9wdGltaXphdGlvbi4KKyAgICAgICAgU2VlIEByZWZ7SW50ZXItUHJvY2VkdXJhbCBBbmFseXNpc30gYW5kCisgICAgICAgIEByZWZ7Q3Jvc3MtTW9kdWxlIE9wdGltaXphdGlvbnN9LgorCisgICAgICAgIFRoaXMgb3B0aW1pemF0aW9uIHdpbGwgYWx0ZXIgdGhlIGJlaGF2aW91ciBvZiBicm9rZW4gY29kZSB3aGljaCB1c2VzCisgICAgICAgIHBvaW50ZXIgYXJpdGhtZXRpYyB0byBzdGVwIGZyb20gb25lIG9iamVjdCBpbnRvIGFub3RoZXIuCisKK0BpdGVtIFRoZSAxOTk5IEMgc3RhbmRhcmQgcHJvdmlkZXMgdGhlIEBjb2Rle3Jlc3RyaWN0fS1xdWFsaWZpZXIgdG8gaGVscAorICAgICAgICBhbGlhcyBhbmFseXNpcy4gSWYgYSBwb2ludGVyIGlzIGRlY2xhcmVkIHdpdGggdGhpcyBxdWFsaWZpZXIsIHRoZQorICAgICAgICBjb21waWxlciBtYXkgYXNzdW1lIHRoYXQgdGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5IHRoaXMgcG9pbnRlciBpcworICAgICAgICBvbmx5IGFsaWFzZWQgYnkgcG9pbnRlcnMgd2hpY2ggYXJlIGRlcml2ZWQgZnJvbSB0aGlzIHBvaW50ZXIuCisgICAgICAgIEZvciBhIGZvcm1hbCBkZWZpbml0aW9uIG9mIHRoZSBydWxlcyBmb3IgQGNvZGV7cmVzdHJpY3R9IHBsZWFzZQorICAgICAgICBjb25zdWx0IElTTy9JRUM5ODk5OjE5OTkuCisKKyAgICAgICAgQGNvbW1hbmR7dmJjY30gd2lsbCBtYWtlIHVzZSBvZiB0aGlzIGluZm9ybWF0aW9uIGF0IGhpZ2hlciBvcHRpbWl6YXRpb24KKyAgICAgICAgbGV2ZWxzIChAb3B0aW9uey1jOTl9IG11c3QgYmUgdXNlZCB0byB1c2UgdGhpcyBuZXcga2V5d29yZCkuCisKKyAgICAgICAgQSB2ZXJ5IHVzZWZ1bCBhcHBsaWNhdGlvbiBmb3IgQGNvZGV7cmVzdHJpY3R9IGFyZSBmdW5jdGlvbgorICAgICAgICBwYXJhbWV0ZXJzLiBDb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisKK0BleGFtcGxlCit2b2lkIGNyb3NzX3Byb2QoZmxvYXQgKnJlc3RyaWN0IHJlcywgCisgICAgICAgICAgICAgICAgZmxvYXQgKnJlc3RyaWN0IHgsCisgICAgICAgICAgICAgICAgZmxvYXQgKnJlc3RyaWN0IHkpCitAeworICByZXNbMF0gPSB4WzFdICogeVsyXSAtIHhbMl0gKiB5WzFdOworICByZXNbMV0gPSB4WzJdICogeVswXSAtIHhbMF0gKiB5WzJdOworICByZXNbMl0gPSB4WzBdICogeVsxXSAtIHhbMV0gKiB5WzBdOworQH0KK0BlbmQgZXhhbXBsZQorCisgICAgICAgIFdpdGhvdXQgQGNvZGV7cmVzdHJpY3R9LCBhIGNvbXBpbGVyIGhhcyB0byBhc3N1bWUgdGhhdCB3cml0aW5nIHRoZQorICAgICAgICByZXN1bHRzIHRocm91Z2ggQGNvZGV7cmVzfSBjYW4gbW9kaWZ5IHRoZSBvYmplY3QgcG9pbnRlZCB0byBieQorICAgICAgICBAY29kZXt4fSBhbmQgQGNvZGV7eX0uIFRoZXJlZm9yZSwgdGhlIGNvbXBpbGVyIGhhcyB0byByZWxvYWQgYWxsCisgICAgICAgIHRoZSB2YWx1ZXMgb24gdGhlIHJpZ2h0IHNpZGUgdHdpY2UuIFdpdGggQGNvZGV7cmVzdHJpY3R9IEBjb21tYW5ke3ZiY2N9CisgICAgICAgIHdpbGwgb3B0aW1pemUgdGhpcyBjb2RlIGxpa2U6CisKK0BleGFtcGxlCit2b2lkIGNyb3NzX3Byb2QoZmxvYXQgKnJlc3RyaWN0IHJlcywKKyAgICAgICAgICAgICAgICBmbG9hdCAqcmVzdHJpY3QgeCwKKyAgICAgICAgICAgICAgICBmbG9hdCAqcmVzdHJpY3QgeSkKK0B7CisgIGZsb2F0IHgwID0geFswXSwgeDEgPSB4WzFdLCB4MiA9IHhbMl07CisgIGZsb2F0IHkwID0geVswXSwgeTEgPSB4WzFdLCB5MiA9IHlbMl07CisKKyAgcmVzWzBdID0geDEgKiB5MiAtIHgyICogeTE7CisgIHJlc1sxXSA9IHgyICogeTAgLSB4MCAqIHkyOworICByZXNbMl0gPSB4MCAqIHkxIC0geDEgKiB5MDsKK0B9CitAZW5kIGV4YW1wbGUKKworCitAZW5kIGl0ZW1pemUKKworCitAbm9kZSBJbnRlci1Qcm9jZWR1cmFsIEFuYWx5c2lzCitAc3Vic2VjdGlvbiBJbnRlci1Qcm9jZWR1cmFsIEFuYWx5c2lzCisKK0FwYXJ0IGZyb20gdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgb3B0aW1pemF0aW9ucyBhIGNvbXBpbGVyIG9mZmVycywgYW5vdGhlcgoraW1wb3J0YW50IHBvaW50IGlzIHRoZSBzY29wZSBvZiB0aGUgdW5kZXJseWluZyBhbmFseXNpcy4gSWYgYSBjb21waWxlciBvbmx5Citsb29rcyBhdCBzbWFsbCBwYXJ0cyBvZiBjb2RlIHdoZW4gZGVjaWRpbmcgd2hldGhlciB0byBkbyBhbiBvcHRpbWl6YXRpb24sCitpdCBvZnRlbiBjYW5ub3QgcHJvdmUgdGhhdCBhIHRyYW5zZm9ybWF0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUKK2JlaGF2aW91ciBhbmQgdGhlcmVmb3JlIGhhcyB0byByZWplY3QgaXQuCisKK1NpbXBsZSBjb21waWxlcnMgb25seSBsb29rIGF0IHNpbmdsZSBleHByZXNzaW9ucywgIHNpbXBsZSBvcHRpbWl6aW5nCitjb21waWxlcnMgb2Z0ZW4gcmVzdHJpY3QgdGhlaXIgYW5hbHlzaXMgdG8gYmFzaWMgYmxvY2tzIG9yIGV4dGVuZGVkIGJhc2ljCitibG9ja3MuIEFuYWx5emluZyBhIHdob2xlIGZ1bmN0aW9uIGlzIGNvbW1vbiBpbiB0b2RheSdzIG9wdGltaXppbmcgY29tcGlsZXJzLgorCitUaGlzIGFscmVhZHkgYWxsb3dzIG1hbnkgb3B0aW1pemF0aW9ucyBidXQgb2Z0ZW4gd29yc3QtY2FzZSBhc3N1bXB0aW9ucworaGF2ZSB0byBiZSBtYWRlIHdoZW4gYSBmdW5jdGlvbiBpcyBjYWxsZWQuCitUbyBhdm9pZCB0aGlzLCBAY29tbWFuZHt2YmNjfSB3aWxsIG5vdCByZXN0cmljdCBpdHMgYW5hbHlzaXMgdG8gc2luZ2xlIGZ1bmN0aW9ucworYXQgaGlnaGVyIG9wdGltaXphdGlvbiBsZXZlbHMuIEludGVyLXByb2NlZHVyYWwgZGF0YS1mbG93IGFuYWx5c2lzIG9mdGVuCithbGxvd3MgZm9yIGV4YW1wbGUgdG8gZWxpbWluYXRlIG1vcmUgY29tbW9uIHN1YmV4cHJlc3Npb25zIG9yIGRlYWQgY29kZS4KK1JlZ2lzdGVyIGFsbG9jYXRpb24gYW5kIG1hbnkgb3RoZXIgb3B0aW1pemF0aW9ucyBhbHNvIHNvbWV0aW1lcyBiZW5lZml0Citmcm9tIGludGVyLXByb2NlZHVyYWwgYW5hbHlzaXMuCisKK0Z1cnRoZXIgZXh0ZW5zaW9uIG9mIHRoZSBzY29wZSBvZiBvcHRpbWl6YXRpb25zIGlzIHBvc3NpYmxlIGJ5IGFjdGl2YXRpbmcKK2Nyb3NzLW1vZHVsZSBvcHRpbWl6YXRpb25zLiBAeHJlZntDcm9zcy1Nb2R1bGUgT3B0aW1pemF0aW9uc30uCisKKworQG5vZGUgQ3Jvc3MtTW9kdWxlIE9wdGltaXphdGlvbnMKK0BzdWJzZWN0aW9uIENyb3NzLU1vZHVsZSBPcHRpbWl6YXRpb25zCisKK1NlcGFyYXRlIGNvbXBpbGF0aW9uIGhhcyBhbHdheXMgYmVlbiBhbiBpbXBvcnRhbnQgZmVhdHVyZSBvZiB0aGUgQyBsYW5ndWFnZS4KK1NwbGl0dGluZyB1cCBhbiBhcHBsaWNhdGlvbiBpbnRvIHNldmVyYWwgbW9kdWxlcyBkb2VzIG5vdCBvbmx5IHJlZHVjZQordHVybi1hcm91bmQgdGltZXMgYW5kIHJlc291cmNlLXJlcXVpcmVtZW50cyBmb3IgY29tcGlsYXRpb24sIGJ1dCBpdCBhbHNvCitoZWxwcyB3cml0aW5nIHJldXNhYmxlIHdlbGwtc3RydWN0dXJlZCBjb2RlLgorCitIb3dldmVyLCBhbiBvcHRpbWl6ZXIgaGFzIG11Y2ggbW9yZSBwb3NzaWJpbGl0aWVzIHdoZW4gaXQgaGFzIGFjY2VzcyB0byB0aGUKK2VudGlyZSBzb3VyY2UgY29kZS4gSW4gb3JkZXIgdG8gcHJvdmlkZSBtYXhpbXVtIHBvc3NpYmxlIG9wdGltaXphdGlvbnMKK3dpdGhvdXQgc2FjcmlmaWNpbmcgc3RydWN0dXJlIGFuZCBtb2R1bGFyaXR5IG9mIGNvZGUsIEBjb21tYW5ke3ZiY2N9IGNhbiBkbworb3B0aW1pemF0aW9ucyBhY3Jvc3MgZGlmZmVyZW50IHRyYW5zbGF0aW9uLXVuaXRzLiBBbm90aGVyIGJlbmVmaXQgaXMKK3RoYXQgY3Jvc3MtbW9kdWxlIGFuYWx5c2lzIGFsc28gd2lsbCBkZXRlY3Qgb2JqZWN0cyB3aGljaCBhcmUgZGVjbGFyZWQKK2luY29uc2lzdGVudGx5IGluIGRpZmZlcmVudCB0cmFuc2xhdGlvbi11bml0cy4KKworVW5mb3J0dW5hdGVseSBjb21tb24gb2JqZWN0LWNvZGUgZG9lcyBub3QgY29udGFpbiBlbm91Z2ggaW5mb3JtYXRpb24gdG8KK3BlcmZvcm0gYWdncmVzc2l2ZSBvcHRpbWl6YXRpb24sIFRvIG92ZXJjb21lIHRoaXMgcHJvYmxlbSwgQGNvbW1hbmR7dmJjY30gb2ZmZXJzCit0d28gc29sdXRpb25zOgorCitAaXRlbWl6ZSBAbWludXMKK0BpdGVtIElmIGNyb3NzLW1vZHVsZSBvcHRpbWl6YXRpb25zIGFyZSBlbmFibGVkIGFuZCBzZXZlcmFsIGZpbGVzIGFyZQorICAgICAgICBwYXNzZWQgdG8gQGNvbW1hbmR7dmJjY30sIGl0IHdpbGwgcmVhZCBpbiBhbGwgZmlsZXMgYXQgb25jZSwgcGVyZm9ybQorICAgICAgICBvcHRpbWl6YXRpb25zIGFjcm9zcyB0aGVzZSBmaWxlcyBhbmQgZ2VuZXJhdGUgYSBzaW5nbGUgb2JqZWN0CisgICAgICAgIGZpbGUgYXMgb3V0cHV0LiBUaGlzIGZpbGUgaXMgc2ltaWxhciB0byB3aGF0IHdvdWxkIGhhdmUgYmVlbgorICAgICAgICBvYnRhaW5lZCBieSBzZXBhcmF0ZWx5IGNvbXBpbGluZyB0aGUgZmlsZXMgYW5kIGxpbmtpbmcgdGhlCisgICAgICAgIHJlc3VsdGluZyBvYmplY3RzIHRvZ2V0aGVyLgorCitAaXRlbSBUaGUgbWV0aG9kIGRlc2NyaWJlZCBhYm92ZSBvZnRlbiByZXF1aXJlcyBjaGFuZ2VzIGluIG1ha2VmaWxlcyBhbmQKKyAgICAgICAgc29tZXdoYXQgZGlmZmVyZW50IGhhbmRsaW5nLiBUaGVyZWZvcmUgQGNvbW1hbmR7dmJjY30gYWxzbyBwcm92aWRlcyBtZWFucworICAgICAgICB0byBnZW5lcmF0ZSBzb21lIGtpbmQgb2Ygc3BlY2lhbCBwc2V1ZG8gb2JqZWN0IGZpbGVzIHdoaWNoIHByZXRhaW4KKyAgICAgICAgZW5vdWdoIGhpZ2gtbGV2ZWwgaW5mb3JtYXRpb24gdG8gcGVyZm9ybSBhZ2dyZXNzaXZlIG9wdGltaXphdGlvbnMKKyAgICAgICAgYXQgbGluayB0aW1lLgorCisgICAgICAgIElmIEBvcHRpb257LXdwb30gaXMgc3BlY2lmaWVkICh3aGljaCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZG9uZSBieQorICAgICAgICBAY29tbWFuZHt2Y30gYXQgaGlnaGVyIG9wdGltaXphdGlvbiBsZXZlbHMpIEBjb21tYW5ke3ZiY2N9IHdpbGwgZ2VuZXJhdGUgc3VjaCBmaWxlcworICAgICAgICByYXRoZXIgdGhhbiBub3JtYWwgYXNzZW1ibHkgb3Igb2JqZWN0IGZpbGVzLiBUaGVzZSBmaWxlcyBjYW4KKyAgICAgICAgbm90IGJlIGhhbmRsZWQgYnkgbm9ybWFsIGxpbmtlcnMuIEhvd2V2ZXIsIEBjb21tYW5ke3ZjfSB3aWxsIGRldGVjdCB0aGVzZQorICAgICAgICBmaWxlcyBhbmQgYmVmb3JlIGxpbmtpbmcgaXQgd2lsbCBwYXNzIGFsbCBzdWNoIGZpbGVzIHRvIEBjb21tYW5ke3ZiY2N9IGFnYWluLgorICAgICAgICBAY29tbWFuZHt2YmNjfSB3aWxsIG9wdGltaXplIHRoZSBlbnRpcmUgY29kZSBhbmQgZ2VuZXJhdGUgcmVhbCBjb2RlIHdoaWNoCisgICAgICAgIGlzIHRoZW4gcGFzc2VkIHRvIHRoZSBsaW5rZXIuCisKKyAgICAgICAgSXQgaXMgcG9zc2libGUgdG8gcGFzcyBAY29tbWFuZHt2Y30gYSBtaXh0dXJlIG9mIHJlYWwgYW5kIHBzZXVkbyBvYmplY3QKKyAgICAgICAgZmlsZXMuIEBjb21tYW5ke3ZjfSB3aWxsIGRldGVjdCB0aGUgcHNldWRvIG9iamVjdHMsIGNvbXBpbGUgdGhlbSBhbmQgbGluaworICAgICAgICB0aGVtIHRvZ2V0aGVyIHdpdGggdGhlIHJlYWwgb2JqZWN0cy4gT2J2aW91c2x5LCBAY29tbWFuZHt2Y30gaGFzIHRvIGJlIHVzZWQKKyAgICAgICAgZm9yIGxpbmtpbmcuIERpcmVjdGx5IGNhbGxpbmcgdGhlIGxpbmtlciB3aXRoIHBzZXVkbyBvYmplY3RzIHdpbGwKKyAgICAgICAgbm90IHdvcmsuCisKKyAgICAgICAgUGxlYXNlIG5vdGUgdGhhdCBvcHRpbWl6YXRpb24gYW5kIGNvZGUgZ2VuZXJhdGlvbiBpcyBkZWZlcnJlZCB0bworICAgICAgICBsaW5rLXRpbWUuIFRoZXJlZm9yZSwgYWxsIGNvbXBpbGVyIG9wdGlvbnMgcmVsYXRlZCB0byBvcHRpbWl6YXRpb24gYW5kCisgICAgICAgIGNvZGUgZ2VuZXJhdGlvbiBoYXZlIHRvIGJlIHNwZWNpZmllZCBhdCB0aGUgbGlua2VyIGNvbW1hbmQgYXMgd2VsbC4KKyAgICAgICAgT3RoZXJ3aXNlIHRoZXkgd291bGQgYmUgaWdub3JlZC4gT3RoZXIgb3B0aW9ucyAoZS5nLiBzZXR0aW5nIHBhdGhzCisgICAgICAgIG9yIGRlZmluaW5nIG1hY3JvcykgaGF2ZSB0byBiZSBzcGVjaWZpZWQgd2hlbiBjb21waWxpbmcuCisKKyAgICAgICAgQWxzbywgdHVybi1hcm91bmQgdGltZXMgd2lsbCBvYnZpb3VzbHkgaW5jcmVhc2UgYXMgdXN1YWxseSBldmVyeXRoaW5nCisgICAgICAgIHdpbGwgYmUgcmVidWlsZCBldmVuIGlmIG1ha2VmaWxlcyBhcmUgdXNlZC4gV2hpbGUgb25seSB0aGUKKyAgICAgICAgY29ycmVzcG9uZGluZyBwc2V1ZG8gb2JqZWN0IG1heSBiZSByZWJ1aWx0IGlmIG9uZSBmaWxlIGlzIGNoYW5nZWQsCisgICAgICAgIGFsbCB0aGUgcmVhbCB3b3JrIHdpbGwgYmUgZG9uZSBhdCB0aGUgbGlua2luZyBzdGFnZS4KKworQGVuZCBpdGVtaXplCisKK0Bub2RlIEluc3RydWN0aW9uIFNjaGVkdWxpbmcKK0BzdWJzZWN0aW9uIEluc3RydWN0aW9uIFNjaGVkdWxpbmcKKworU29tZSBiYWNrZW5kcyBwcm92aWRlIGFuIGluc3RydWN0aW9uIHNjaGVkdWxlciB3aGljaCBpcyBhdXRvbWF0aWNhbGx5IHJ1bgorYnkgQGNvbW1hbmR7dmN9IGF0IGhpZ2hlciBvcHRpbWl6YXRpb24gbGV2ZWxzLiBUaGUgcHVycG9zZSBpcyB0byByZW9yZGVyCitpbnN0cnVjdGlvbnMgdG8gbWFrZSBiZXR0ZXIgdXNlIG9mIHRoZSBkaWZmZXJlbnQgcGlwZWxpbmVzIGEgQ1BVIG1heQorb2ZmZXIuCisKK1RoZSBleGFjdCBkZXRhaWxzIGRlcGVuZCBoZWF2aWx5IG9uIHRoZSBiYWNrZW5kLCBidXQgaW4gZ2VuZXJhbCB0aGUKK3NjaGVkdWxlciB3aWxsIHRyeSB0byBwbGFjZSBpbnN0cnVjdGlvbnMgd2hpY2ggY2FuIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsCisoZS5nLiBvbiBzdXBlci1zY2FsYXIgYXJjaGl0ZWN0dXJlcykgY2xvc2UgdG8gZWFjaCBvdGhlci4gQWxzbywKK2luc3RydWN0aW9ucyB3aGljaCBkZXBlbmQgb24gdGhlIHJlc3VsdCBvZiBhbm90aGVyIGluc3RydWN0aW9uIHdpbGwgYmUKK21vdmVkIGZ1cnRoZXIgYXBhcnQgdG8gYXZvaWQgcGlwZWxpbmUtc3RhbGxzLgorCitQbGVhc2Ugbm90ZSB0aGF0IGl0IG1heSBiZSBjcnVjaWFsIHRvIHNwZWNpZnkgdGhlIGNvcnJlY3QgZGVyaXZhdGUgb2YgYQorQ1BVIGZhbWlseSBpbiBvcmRlciB0byBnZXQgYmVzdCByZXN1bHRzIGZyb20gdGhlIHNjZWR1bGVyLiBEaWZmZXJlbnQKK3ZhcmlhbnRzIG9mIGFuIGFyY2hpdGVjdHVyZSBtYXkgaGF2ZSBhIGRpZmZlcmVudCBudW1iZXIgYW5kIGJlaGF2aW91ciBvZgorcGlwZWxpbmVzIHJlcXVpcmluZyBkaWZmZXJlbnQgc2NoZWR1bGluZyBkZWNpc2lvbnMuCisKK0NvbnN1bHQgdGhlIGJhY2tlbmQgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KKworCitAbm9kZSBUYXJnZXQtU3BlY2lmaWMgT3B0aW1pemF0aW9ucworQHN1YnNlY3Rpb24gVGFyZ2V0LVNwZWNpZmljIE9wdGltaXphdGlvbnMKKworSW4gYWRkaXRpb24gdG8gdGhvc2Ugb3B0aW16YXRpb25zIHdoaWNoIGFyZSBhdmFpbGFibGUgZm9yIGFsbCB0YXJnZXRzLAorZXZlcnkgYmFja2VuZCB3aWxsIHByb3ZpZGUgYSBzZXJpZXMgb2YgYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zLiBUaGVzZQordmFyeSBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgYmFja2VuZHMsIGJ1dCBvcHRpbWl6YXRpb25zIGZyZXF1ZW50bHkgZG9uZSBieQorYmFja2VuZHMgYXJlOgorCitAaXRlbWl6ZSBAbWludXMKK0BpdGVtIHVzZSBvZiBjb21wbGV4IG9yIGF1dG8taW5jcmVtZW50IGFkZHJlc3NpbmctbW9kZXMKK0BpdGVtIGltcGxpY2l0IHNldHRpbmcgb2YgY29uZGl0aW9uLWNvZGVzCitAaXRlbSBpbnN0cnVjdGlvbi1jb21iaW5pbmcKK0BpdGVtIGRlbGF5ZWQgcG9wcGluZyBvZiBzdGFjay1zbG90cworQGl0ZW0gb3B0aW1pemVkIGZ1bmN0aW9uIGVudHJ5LSBhbmQgZXhpdC1jb2RlCitAaXRlbSBlbGltaW5hdGlvbiBvZiBhIGZyYW1lIHBvaW50ZXIKK0BpdGVtIG9wdGltaXplZCBtdWx0aXBsaWNhdGlvbi9kaXZpc2lvbiBieSBjb25zdGFudHMKK0BpdGVtIGlubGluZSBjb2RlIGZvciBibG9jay1jb3B5aW5nCitAZW5kIGl0ZW1pemUKKworCisKK0Bub2RlIERlYnVnZ2luZyBPcHRpbWl6ZWQgQ29kZQorQHN1YnNlY3Rpb24gRGVidWdnaW5nIE9wdGltaXplZCBDb2RlCisKK0RlYnVnZ2luZyBvZiBvcHRpbWl6ZWQgY29kZSBpcyB1c3VhbGx5IG5vdCBwb3NzaWJsZSB3aXRob3V0IHByb2JsZW1zLgorTWFueSBjb21waWxlcnMgdHVybiBvZmYgYWxtb3N0IGFsbCBvcHRpbWl6YXRpb25zIHdoZW4gZGVidWdnaW5nLgorQGNvbW1hbmR7dmJjY30gYWxsb3dzIGRlYnVnZ2luZyBvdXRwdXQgdG9nZXRoZXIgd2l0aCBvcHRpbWl6YXRpb25zIGFuZAordHJpZXMgdG8gc3RpbGwgZG8gYWxsIG9wdGltaXphdGlvbnMgKHNvbWUgcmVzdHJpY3Rpb25zIGhhdmUgdG8gYmUgbWFkZQorcmVnYXJkaW5nIGluc3RydWN0aW9uLXNjaGVkdWxpbmcpLgorCitIb3dldmVyLCBkZXBlbmRpbmcgb24gdGhlIGRlYnVnZ2VyIGFuZCBkZWJ1Z2dpbmctZm9ybWF0IHVzZWQsIHRoZQoraW5mb3JtYXRpb24gZGlzcGxheWVkIGluIHRoZSBkZWJ1Z2dlciBtYXkgZGlmZmVyIGZyb20gdGhlIHJlYWwKK3NpdHVhdGlvbi4gVHlwaWNhbCBwcm9ibGVtcyBhcmU6CisKK0BpdGVtaXplIEBtaW51cworCitAaXRlbSBJbmNvcnJlY3RseSBkaXNwbGF5ZWQgdmFsdWVzIG9mIHZhcmlhYmxlcy4KKworICAgICAgICBXaGVuIG9wdGltaXppbmcgdmJjYyB3aWxsIG9mdGVuIHJlbW92ZSBjZXJ0YWluIHZhcmlhYmxlcyBvcgorICAgICAgICBlbGltaW5hdGUgY29kZSB3aGljaCBzZXRzIHRoZW0uIFNvbWV0aW1lcyBpdCBpcyBwb3NzaWJsZSwgdG8KKyAgICAgICAgdGVsbCB0aGUgZGVidWdnZXIgdGhhdCBhIHZhcmlhYmxlIGhhcyBiZWVuIG9wdGltaXplZCBhd2F5LCBidXQKKyAgICAgICAgbW9zdCBvZiB0aGUgdGltZSB0aGUgZGVidWdnZXIgZG9lcyBub3QgYWxsb3cgdGhpcyBhbmQgeW91CisgICAgICAgIHdpbGwganVzdCBnZXQgYm9ndXMgdmFsdWVzIHdoZW4gdHJ5aW5nIHRvIGluc3BlY3QgYSB2YXJpYWJsZS4KKworICAgICAgICBBbHNvLCB2YXJpYWJsZXMgd2hvc2UgbG9jYXRpb25zIGRpZmZlcnMgYXQgdmFyaW91cyBsb2NhdGlvbnMKKyAgICAgICAgb2YgdGhlIHByb2dyYW0gKGUuZy4gYSB2YXJpYWJsZSBpcyBpbiBhIHJlZ2lzdGVyIGF0IG9uZSBwbGFjZQorICAgICAgICBhbmQgaW4gbWVtb3J5IGF0IGFub3RoZXIpIGNhbiBvbmx5IGJlIGNvcnJlY3RseSBkaXNwbGF5ZWQsIGlmCisgICAgICAgIHRoZSBkZWJ1Z2dlciBzdXBwb3J0cyB0aGlzLgorCisgICAgICAgIFNvbWV0aW1lcywgdGhpcyBjYW4gZXZlbiBvY2N1ciBpbiBub24tb3B0aW1pemVkIGNvZGUgKGUuZy4KKyAgICAgICAgd2l0aCByZWdpc3Rlci1wYXJhbWV0ZXJzIG9yIGEgY2hhbmdpbmcgc3RhY2stcG9pbnRlcikuCisKK0BpdGVtIFN0cmFuZ2UgcHJvZ3JhbSBmbG93LgorCisgICAgICAgIFdoZW4gc3RlcHBpbmcgdGhyb3VnaCBhIHByb2dyYW0sIHlvdSBtYXkgc2VlIGxpbmVzIG9mIGNvZGUKKyAgICAgICAgYmUgZXhlY3V0ZWQgb3V0LW9mLW9yZGVyIG9yIHBhcnRzIG9mIHRoZSBjb2RlIHNraXBwZWQuIFRoaXMKKyAgICAgICAgb2Z0ZW4gb2NjdXJzIGR1ZSB0byBjb2RlIGJlaW5nIG1vdmVkIGFyb3VuZCBvciBlbGltaW5hdGVkL2NvbWJpbmVkLgorCitAaXRlbSBNaXNzZWQgYnJlYWstcG9pbnRzLgorCisgICAgICAgIFNldHRpbmcgYnJlYWstcG9pbnRzIChlc3BlY2lhbGx5IG9uIHNvdXJjZS1saW5lcykgbmVlZHMgc29tZQorICAgICAgICBjYXJlIHdoZW4gb3B0aW1pemVkIGNvZGUgaXMgZGVidWdnZWQuIEUuZy4gY29kZSBtYXkgaGF2ZSBiZWVuCisgICAgICAgIG1vdmVkIG9yIGV2ZW4gcmVwbGljYXRlZCBhdCBkaWZmZXJlbnQgcGFydHMuIEEgYnJlYWstcG9pbnQKKyAgICAgICAgc2V0IGluIGEgZGVidWdnZXIgd2lsbCB1c3VhbGx5IG9ubHkgYmUgc2V0IG9uIG9uZSBpbnN0YW5jZSBvZgorICAgICAgICB0aGUgY29kZS4gVGhlcmVmb3JlLCBhIGRpZmZlcmVudCBpbnN0YW5jZSBvZiB0aGUgY29kZSBtYXkgaGF2ZSBiZWVuCisgICAgICAgIGV4ZWN1dGVkIGFsdGhvdWdoIHRoZSBicmVhay1wb2ludCB3YXMgbm90IGhpdC4KKworQGVuZCBpdGVtaXplCisKK0Bub2RlIEV4dGVuc2lvbnMKK0BzZWN0aW9uIEV4dGVuc2lvbnMKKworVGhpcyBzZWN0aW9uIGxpc3RzIGFuZCBkZXNjcmliZXMgYWxsIGV4dGVuc2lvbnMgdG8gdGhlIEMgbGFuZ3VhZ2UgcHJvdmlkZWQKK2J5IEBjb21tYW5ke3ZiY2N9LiBNb3N0IG9mIHRoZW0gYXJlIGltcGxlbWVudGVkIGluIGEgd2F5IHdoaWNoIGRvZXMgbm90IGJyZWFrCitjb3JyZWN0IEMgY29kZSBhbmQgc3RpbGwgYWxsb3dzIGFsbCBkaWFnbm9zdGljcyByZXF1aXJlZCBieSB0aGUgQyBzdGFuZGFyZAorYnkgdXNpbmcgcmVzZXJ2ZWQgaWRlbnRpZmllcnMuCisKK1RoZSBvbmx5IGV4Y2VwdGlvbiAoQHB4cmVme0lubGluZS1Bc3NlbWJseSBGdW5jdGlvbnN9KSBjYW4gYmUgdHVybmVkIG9mZgordXNpbmcgQG9wdGlvbnstaXNvfSBvciBAb3B0aW9uey1hbnNpfS4KKworQHN1YnNlY3Rpb24gUHJhZ21hcworCisgICAgICBAY29tbWFuZHt2YmNjfSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgQGNvZGV7I3ByYWdtYX0tZGlyZWN0aXZlczoKKworQHRhYmxlIEBjb2RlCisKKyAgICAgIEBpdGVtICNwcmFnbWEgcHJpbnRmbGlrZSA8ZnVuY3Rpb24+CisgICAgICBAaXRlbXggI3ByYWdtYSBzY2FuZmxpa2UgPGZ1bmN0aW9uPiAgICAKKyAgICAgICAgICAgQGNvbW1hbmR7dmJjY30gd2lsbCBoYW5kbGUgQGNvZGV7PGZ1bmN0aW9uPn0gc3BlY2lhbGx5LgorICAgICAgICAgICBAY29kZXs8ZnVuY3Rpb24+fSBoYXMgdG8gYmUgYW4gYWxyZWFkeSBkZWNsYXJlZAorICAgICAgICAgICBmdW5jdGlvbiwgd2l0aCBleHRlcm5hbCBsaW5rYWdlLCB0aGF0CisgICAgICAgICAgIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cworICAgICAgICAgICBhbmQgYSBAY29kZXtjb25zdCBjaGFyICp9IGFzIHRoZSBsYXN0IGZpeGVkCisgICAgICAgICAgIHBhcmFtZXRlci4KKworICAgICAgICAgICBJZiBzdWNoIGEgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYQorICAgICAgICAgICBzdHJpbmctY29uc3RhbnQgYXMgZm9ybWF0LXN0cmluZywgQGNvbW1hbmR7dmJjY30KKyAgICAgICAgICAgd2lsbCBjaGVjayBpZiB0aGUgYXJndW1lbnRzIHNlZW0gdG8KKyAgICAgICAgICAgbWF0Y2ggdGhlIGZvcm1hdC1zcGVjaWZpZXJzIGluIHRoZQorICAgICAgICAgICBmb3JtYXQtc3RyaW5nLCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzCisgICAgICAgICAgIG9mIHByaW50ZiBvciBzY2FuZi4KKyAgICAgICAgICAgQWxzbywgQGNvbW1hbmR7dmJjY30gd2lsbCByZXBsYWNlIHRoZSBjYWxsIGJ5IGEKKyAgICAgICAgICAgY2FsbCB0byBhIHNpbXBsaWZpZWQgdmVyc2lvbiBhY2NvcmRpbmcKKyAgICAgICAgICAgdG8gdGhlIGZvbGxvd2luZyBydWxlcywgaWYgc3VjaCBhCisgICAgICAgICAgIGZ1bmN0aW9uIGhhcyBiZWVuIGRlY2xhcmVkIHdpdGggZXh0ZXJuYWwKKyAgICAgICAgICAgbGlua2FnZToKKworQGl0ZW1pemUgQG1pbnVzCisgICAgICAgIEBpdGVtICAgSWYgbm8gZm9ybWF0LXNwZWNpZmllcnMgYXJlIHVzZWQgYXQgYWxsLAorICAgICAgICAgICBAY29kZXtfX3YwPGZ1bmN0aW9uPn0gd2lsbCBiZSBjYWxsZWQuCisKKyAgICAgICAgQGl0ZW0gICBJZiBubyBxdWFsaWZpZXJzIGFyZSB1c2VkIGFuZCBvbmx5CisgICAgICAgICAgIEBjb2Rle2QsaSx4LFgsbyxzLGN9IGFyZSB1c2VkLCBAY29kZXtfX3YxPGZ1bmN0aW9uPn0KKyAgICAgICAgICAgd2lsbCBiZSBjYWxsZWQuCisKKyAgICAgICAgQGl0ZW0gICBJZiBubyBmbG9hdGluZy1wb2ludCBhcmd1bWVudHMgYXJlIHVzZWQsCisgICAgICAgICAgIEBjb2Rle19fdjI8ZnVuY3Rpb24+fSB3aWxsIGJlIGNhbGxlZC4KK0BlbmQgaXRlbWl6ZQorCisgICAgICBAaXRlbSAjcHJhZ21hIGRvbnR3YXJuIDxuPgorICAgICAgICBEaXNhYmxlcyB3YXJuaW5nIG51bWJlciBuLiBNdXN0IGJlIGZvbGxvd2VkIGJ5IEBjb2RleyNwcmFnbWEgcG9wd2Fybn0uCisKKyAgICAgIEBpdGVtICNwcmFnbWEgd2FybiA8bj4KKyAgICAgICAgRW5hYmxlcyB3YXJuaW5nIG51bWJlciBuLiBNdXN0IGJlIGZvbGxvd2VkIGJ5IEBjb2RleyNwcmFnbWEgcG9wd2Fybn0uCisKKyAgICAgIEBpdGVtICNwcmFnbWEgcG9wd2FybgorICAgICAgICBVbmRvZXMgdGhlIGxhc3QgbW9kaWZpY2F0aW9uIGRvbmUgYnkgQGNvZGV7I3ByYWdtYSB3YXJufSBvcgorICAgICAgICBAY29kZXsjcHJhZ21hIGRvbnR3YXJufS4KKworICAgICAgQGl0ZW0gI3ByYWdtYSBvbmx5LWlubGluZSBvbgorICAgICAgICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB3aWxsIGJlIHBhcnNlZCBhbmQgYXJlIGF2YWlsYWJsZSBmb3IKKyAgICAgICAgaW5saW5pbmcgKEBweHJlZntGdW5jdGlvbiBJbmxpbmluZ30pLCBidXQgbm8gb3V0LW9mLWxpbmUgY29kZQorICAgICAgICB3aWxsIGJlIGdlbmVyYXRlZCwgZXZlbiBpZiBzb21lIGNhbGxzIGNvdWxkIG5vdCBiZSBpbmxpbmVkLgorCisgICAgICAgICAgIERvIG5vdCB1c2UgdGhpcyB3aXRoIGZ1bmN0aW9ucyB0aGF0IGhhdmUKKyAgICAgICAgICAgbG9jYWwgc3RhdGljIHZhcmlhYmxlcyEKKworICAgICAgQGl0ZW0gI3ByYWdtYSBvbmx5LWlubGluZSBvZmYKKyAgICAgICAgICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHRyYW5zbGF0ZWQKKyAgICAgICAgICAgYXMgdXN1YWwgYWdhaW4uCisKKyAgICAgIEBpdGVtICNwcmFnbWEgb3B0IDxuPgorICAgICAgICAgICBTZXRzIHRoZSBvcHRpbWl6YXRpb24gb3B0aW9ucyB0byA8bj4KKyAgICAgICAgICAgKHNpbWlsYXIgdG8gLU89PG4+KSBmb3IgdGhlIGZvbGxvd2luZworICAgICAgICAgICBmdW5jdGlvbnMuCisgICAgICAgICAgIFRoaXMgaXMgb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuIERvIG5vdCB1c2UhCisKKyAgICAgIEBpdGVtICNwcmFnbWEgYmVnaW5faGVhZGVyCisgICAgICAgIFVzZWQgdG8gbWFyayB0aGUgYmVnaW5uaW5nIG9mIGEgc3lzdGVtLWhlYWRlci4gTXVzdCBiZSBmb2xsb3dlZAorICAgICAgICBieSBAY29kZXsjcHJhZ21hIGVuZF9oZWFkZXJ9LiBOb3QgZm9yIHVzZSBpbiBhcHBsaWNhdGlvbnMhCisKKyAgICAgIEBpdGVtICNwcmFnbWEgZW5kX2hlYWRlcgorICAgICAgICBUaGUgY291bnRlcnBhcnQgdG8gQGNvZGV7I3ByYWdtYSBiZWdpbl9oZWFkZXJ9LiBNYXJrcyB0aGUgZW5kCisgICAgICAgIG9mIGEgc3lzdGVtLWhlYWRlci4gTm90IGZvciB1c2UgaW4gYXBwbGljYXRpb25zIQorCisgICAgICBAaXRlbSAjcHJhZ21hIHBhY2sobikKKyAgICAgICAgU2V0IGFsaWdubWVudCBvZiBzdHJ1Y3R1cmUgbWVtYmVycyB0byBhIG11bHRpcGxlIG9mIEBjb2Rle259IGJ5dGVzLgorCisgICAgICBAaXRlbSAjcHJhZ21hIHBhY2soKQorICAgICAgICBSZXN0b3JlcyBzdHJ1Y3R1cmUgYWxpZ25tZW50IHRvIHRoZSB0YXJnZXQncyBkZWZhdWx0IGFsaWdubWVudCwKKyAgICAgICAgd2hpY2ggd2FzIGluIGVmZmVjdCB3aGVuIHRoZSBjb21waWxhdGlvbiBzdGFydGVkLgorCisgICAgICBAaXRlbSAjcHJhZ21hIHBhY2socHVzaFssbl0pCisgICAgICAgIFB1c2hlcyB0aGUgY3VycmVudCBzdHJ1Y3R1cmUgYWxpZ25tZW50IG9udG8gYW4gaW50ZXJuYWwgc3RhY2sgYW5kCisgICAgICAgIG9wdGlvbmFsbHkgc2V0cyBhIG5ldyBhbGlnbm1lbnQgdG8gYSBtdWx0aXBsZSBvZiBAY29kZXtufSBieXRlcy4KKworICAgICAgQGl0ZW0gI3ByYWdtYSBwYWNrKHBvcCkKKyAgICAgICAgUmVzdG9yZXMgdGhlIHRvcG1vc3Qgc3RydWN0dXJlIGFsaWdubWVudCwgc2F2ZWQgYnkgQGNvZGV7cGFjayhwdXNoKX0sCisgICAgICAgIGZyb20gYW4gaW50ZXJuYWwgc3RhY2suIFJlc3RvcmVzIHRoZSBkZWZhdWx0IGFsaWdubWVudCwgd2hlbiB0aGUKKyAgICAgICAgc3RhY2sgaXMgZW1wdHkuCisKK0BlbmQgdGFibGUKKworCitAc3Vic2VjdGlvbiBSZWdpc3RlciBQYXJhbWV0ZXJzCisKKyAgICAgIElmIHRoZSBwYXJhbWV0ZXJzIGZvciBjZXJ0YWluIGZ1bmN0aW9ucyBzaG91bGQgYmUgcGFzc2VkIGluIGNlcnRhaW4KKyAgICAgIHJlZ2lzdGVycywgaXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSB0aGUgcmVnaXN0ZXJzIHVzaW5nCisgICAgICBAY29kZXtfX3JlZygiPHJlZz4iKX0gaW4gdGhlCisgICAgICBwcm90b3R5cGUsIGUuZy4KKworQGV4YW1wbGUKKyAgICAgICAgdm9pZCBmKF9fcmVnKCJkMCIpIGludCB4LCBfX3JlZygiYTAiKSBjaGFyICp5KSBAeyAuLi4gQH0KK0BlbmQgZXhhbXBsZQorCisgICAgICBUaGUgbmFtZXMgb2YgdGhlIGF2YWlsYWJsZSByZWdpc3RlcnMgZGVwZW5kIG9uIHRoZSBiYWNrZW5kIGFuZCB3aWxsCisgICAgICBiZSBsaXN0ZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcGFydCBvZiB0aGUgZG9jdW1lbnRhdGlvbi4KKyAgICAgIE5vdGUgdGhhdCBhIG1hdGNoaW5nIHByb3RvdHlwZSBtdXN0IGJlIGluIHNjb3BlIHdoZW4gY2FsbGluZyBzdWNoCisgICAgICBhIGZ1bmN0aW9uIC0gb3RoZXJ3aXNlIHdyb25nIGNvZGUgd2lsbCBiZSBnZW5lcmF0ZWQuCisgICAgICBUaGVyZWZvcmUgaXQgaXMgbm90IHVzZWZ1bCB0byB1c2UgcmVnaXN0ZXIgcGFyYW1ldGVycyBpbiBhbiBvbGQtc3R5bGUKKyAgICAgIGZ1bmN0aW9uLWRlZmluaXRpb24uCisKKyAgICAgIElmIHRoZSBiYWNrZW5kIGNhbm5vdCBoYW5kbGUgdGhlIHNwZWNpZmllZCByZWdpc3RlciBmb3IgYQorICAgICAgY2VydGFpbiB0eXBlLCB0aGlzIHdpbGwgY2F1c2UgYW4gZXJyb3IuIE5vdGUgdGhhdCB0aGlzIG1heSBoYXBwZW4KKyAgICAgIGFsdGhvdWdoIHRoZSByZWdpc3RlciBjb3VsZCBzdG9yZSB0aGF0IHR5cGUsIGlmIHRoZSBiYWNrZW5kCisgICAgICBkb2VzIG5vdCBwcm92aWRlIHRoZSBuZWNlc3Nhcnkgc3VwcG9ydC4KKworICAgICAgQWxzbyBub3RlIHRoYXQgdGhpcyBtYXkgZm9yY2UgQGNvbW1hbmR7dmJjY30gdG8gY3JlYXRlIHdvcnNlIGNvZGUuCisKKworQG5vZGUgSW5saW5lLUFzc2VtYmx5IEZ1bmN0aW9ucworQHN1YnNlY3Rpb24gSW5saW5lLUFzc2VtYmx5IEZ1bmN0aW9ucworCisgICAgICBPbmx5IHVzZSB0aGVtIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEKKworICAgICAgQSBmdW5jdGlvbi1kZWNsYXJhdGlvbiBtYXkgYmUgZm9sbG93ZWQgYnkgJz0nIGFuZCBhIHN0cmluZy1jb25zdGFudC4KKyAgICAgIElmIGEgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggc3VjaCBhIGRlY2xhcmF0aW9uIGluIHNjb3BlLCBubworICAgICAgZnVuY3Rpb24tY2FsbCB3aWxsIGJlIGdlbmVyYXRlZCBidXQgdGhlIHN0cmluZy1jb25zdGFudCB3aWxsIGJlCisgICAgICBpbnNlcnRlZCBpbiB0aGUgYXNzZW1ibHktb3V0cHV0LgorICAgICAgT3RoZXJ3aXNlIHRoZSBjb21waWxlciBhbmQgb3B0aW1pemVyIHdpbGwgdHJlYXQgdGhpcyBsaWtlIGEKKyAgICAgIGZ1bmN0aW9uLWNhbGwsIGkuZS4gdGhlIGlubGluZS1hc3NlbWJseSBtdXN0IG5vdCBtb2RpZnkgYW55IGNhbGxlZS1zYXZlCisgICAgICByZWdpc3RlcnMgd2l0aG91dCByZXN0b3JpbmcgdGhlbS4gSG93ZXZlciwgaXQgaXMgYWxzbyBwb3NzaWJsZSB0bworICAgICAgICBzcGVjaWZ5IHRoZSBzaWRlLWVmZmVjdHMgb2YgaW5saW5lLWFzc2VtYmx5IGZ1bmN0aW9ucyBsaWtlIAorICAgICAgICByZWdpc3RlcnMgdXNlZCBvciB2YXJpYWJsZXMgdXNlZCBhbmQgbW9kaWZpZWQKKyAgICAgICAgKEBweHJlZntTcGVjaWZ5aW5nIHNpZGUtZWZmZWN0c30pLgorCisgICAgICBFeGFtcGxlOgorCitAZXhhbXBsZQorICAgICAgICBkb3VibGUgc2luKF9fcmVnKCJmcDAiKSBkb3VibGUpID0gIlx0ZnNpbi54XHRmcDBcbiI7CitAZW5kIGV4YW1wbGUKKworICAgICAgVGhlcmUgYXJlIHNldmVyYWwgaXNzdWVzIHRvIHRha2UgY2FyZSBvZiB3aGVuIHdyaXRpbmcgaW5saW5lLWFzc2VtYmx5LgorCitAaXRlbWl6ZSBAbWludXMKK0BpdGVtIEFzIGlubGluZS1hc3NlbWJseSBpcyBzdWJqZWN0IHRvIGxvb3AgdW5yb2xsaW5nIG9yIGZ1bmN0aW9uIGlubGluaW5nCisgICAgICAgIGl0IG1heSBiZSByZXBsaWNhdGVkIGF0IGRpZmZlcmVudCBsb2NhdGlvbnMuIFVubGVzcyBpdCBpcyBhYnNvbHV0ZWx5CisgICAgICAgIGtub3duIHRoYXQgdGhpcyB3aWxsIG5vdCBoYXBwZW4sIHRoZSBjb2RlIHNob3VsZCBub3QgZGVmaW5lIGFueQorICAgICAgICBsYWJlbHMgKGUuZy4gZm9yIGJyYW5jaGVzKS4gVXNlIG9mZnNldHMgaW5zdGVhZC4KKworQGl0ZW0gSWYgYSBiYWNrZW5kIHByb3ZpZGVzIGFuIGluc3RydWN0aW9uIHNjaGVkdWxlciwgaW5saW5lLWFzc2VtYmx5IGNvZGUKKyAgICAgICAgd2lsbCBhbHNvIGJlIHNjaGVkdWxlZC4gU29tZSBzY2hlZHVsZXJzIG1ha2UgYXNzdW1wdGlvbnMgYWJvdXQKKyAgICAgICAgdGhlaXIgaW5wdXQgKHVzdWFsbHkgY29tcGlsZXItZ2VuZXJhdGVkIGNvZGUpIHRvIGltcHJvdmUgdGhlCisgICAgICAgIGNvZGUuIEhhdmUgYSBsb29rIGF0IHRoZSBiYWNrZW5kIGRvY3VtZW50YXRpb24gdG8gc2VlIGlmIHRoZXJlCisgICAgICAgIGFyZSBhbnkgaXNzdWVzIHRvIGNvbnNpZGVyLgorCitAaXRlbSBJZiBhIGJhY2tlbmQgcHJvdmlkZXMgYSBwZWVwaG9sZSBvcHRpbWl6ZXIgd2hpY2ggb3B0aW1pemVzIHRoZQorICAgICAgICBhc3NlbWJseSBvdXRwdXQsIGlubGluZS1hc3NlbWJseSBjb2RlIHdpbGwgYWxzbyBiZSBvcHRpbWl6ZWQKKyAgICAgICAgdW5sZXNzIEBvcHRpb257LW5vLWlubGluZS1wZWVwaG9sZX0gaXMgc3BlY2lmaWVkLgorICAgICAgICBIYXZlIGEgbG9vayBhdCB0aGUgYmFja2VuZCBkb2N1bWVudGF0aW9uIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55CisgICAgICAgIGlzc3VlcyB0byBjb25zaWRlci4KKworQGl0ZW0gQGNvbW1hbmR7dmJjY30gYXNzdW1lcyB0aGF0IGlubGluZS1hc3NlbWJseSBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IG5ldworICAgICAgICBjb250cm9sLWZsb3cgZWRnZXMuIEkuZS4gY29udHJvbCB3aWxsIG9ubHkgZW50ZXIgaW5saW5lLWFzc2VtYmx5CisgICAgICAgIGlmIHRoZSBmdW5jdGlvbiBjYWxsIGlzIHJlYWNoZWQgYW5kIGlmIGNvbnRyb2wgbGVhdmVzCisgICAgICAgIGlubGluZS1hc3NlbWJseSBpdCB3aWxsIGNvbnRpbnVlIGFmdGVyIHRoZSBjYWxsLgorCitAZW5kIGl0ZW1pemUKKworICAgICAgSW5saW5lLWFzc2VtYmx5LWZ1bmN0aW9ucyBhcmUgbm90IHJlY29nbml6ZWQgd2hlbiBBTlNJL0lTTyBtb2RlIGlzCisgICAgICB0dXJuZWQgb24uCisKKworQG5vZGUgVmFyaWFibGUgQXR0cmlidXRlcworQHN1YnNlY3Rpb24gVmFyaWFibGUgQXR0cmlidXRlcworCisgICAgICAgIEBjb21tYW5ke3ZiY2N9IG9mZmVycyBhdHRyaWJ1dGVzIHRvIHZhcmlhYmxlcyBvciBmdW5jdGlvbnMuIFRoZXNlIGF0dHJpYnV0ZXMKKyAgICAgICAgY2FuIGJlIHNwZWNpZmllZCBhdCB0aGUgZGVjbGFyYXRpb24gb2YgYSB2YXJpYWJsZSBvciBmdW5jdGlvbiBhbmQKKyAgICAgICAgYXJlIHN5bnRhY3RpY2FsbHkgc2ltaWxhciB0byBzdG9yYWdlLWNsYXNzLXNwZWNpZmllcnMKKyAgICAgICAgKGUuZy4gQGNvZGV7c3RhdGljfSkuCisKKyAgICAgICAgT2Z0ZW4sIHRoZXNlIGF0dHJpYnV0ZXMgYXJlIHNwZWNpZmljIHRvIG9uZSBiYWNrZW5kIGFuZCB3aWxsIGJlCisgICAgICAgIGRvY3VtZW50ZWQgaW4gdGhlIGJhY2tlbmQtZG9jdW1lbnRhdGlvbiAodHlwaWNhbCBhdHRyaWJ1dGVzIHdvdWxkCisgICAgICAgIGUuZy4gYmUgQGNvZGV7X19pbnRlcnJ1cHR9IG9yIEBjb2Rle19fc2VjdGlvbn0pLiBBdHRyaWJ1dGVzIG1heQorICAgICAgICBhbHNvIGhhdmUgcGFyYW1ldGVycy4gQSBnZW5lcmFsbHkgYXZhaWxhYmxlCisgICAgICAgIGF0dHJpYnV0ZSBzIEBjb2Rle19fZW50cnl9IHdoaWNoIGlzIHVzZWQgdG8gcHJlc2VydmUgdW5yZWZlcmVuY2VkCisgICAgICAgIG9iamVjdHMgYW5kIGZ1bmN0aW9ucyAoQHB4cmVme1VudXNlZCBPYmplY3QgRWxpbWluYXRpb259KToKKworQGV4YW1wbGUKK19fZW50cnkgX19pbnRlcnJ1cHQgX19zZWN0aW9uKCJ2ZWN0YWIiKSB2b2lkIG15X2hhbmRsZXIoKQorQGVuZCBleGFtcGxlCisKKyAgICAgICAgQWRkaXRpb25hbCBub24tdGFyZ2V0LXNwZWNpZmljIGF0dHJpYnV0ZXMgYXJlIGF2YWlsYWJsZSB0bworICAgICAgICBzcGVjaWZ5IHNpZGUtZWZmZWN0cyBvZiBmdW5jdGlvbnMgKEBweHJlZntTcGVjaWZ5aW5nIHNpZGUtZWZmZWN0c30pLgorCisKKyAgICAgICAgUGxlYXNlIG5vdGUgdGhhdCBzb21lIGNvbW1vbiBleHRlbnNpb25zIGxpa2UgQGNvZGV7X19mYXJ9IGFyZQorICAgICAgICB2YXJpYWJsZSBhdHRyaWJ1dGVzIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcywgYnV0IGFjdHVhbGx5IHR5cGUKKyAgICAgICAgYXR0cmlidXRlcyAoQHB4cmVme1R5cGUgQXR0cmlidXRlc30pIG9uIG90aGVycy4gVGhpcyBpcyBkdWUgdG8KKyAgICAgICAgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgbWVhbmluZ3Mgb24gZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuCisKKworQG5vZGUgVHlwZSBBdHRyaWJ1dGVzCitAc3Vic2VjdGlvbiBUeXBlIEF0dHJpYnV0ZXMKKworICAgICAgVHlwZXMgbWF5IGJlIHF1YWxpZmllZCBieSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMsIGUuZy4gQGNvZGV7X19mYXJ9LAorICAgICAgICBvbiBzb21lIGJhY2tlbmRzLiBSZWdhcmRpbmcgdGhlIGF2YWlsYWJpbGl0eSBvZiB0eXBlIGF0dHJpYnV0ZXMKKyAgICAgICAgcGxlYXNlIGNvbnN1bHQgdGhlIGJhY2tlbmQgZG9jdW1lbnRhdGlvbi4gCisKKyAgICAgIFN5bnRhY3RpY2FsbHkgdHlwZSBhdHRyaWJ1dGVzIGhhdmUgdG8gYmUgcGxhY2VkIGxpa2UgYSB0eXBlLXF1YWxpZmllcgorICAgICAgICAoZS5nLiBAY29kZXtjb25zdH0pLgorICAgICAgQXMgZXhhbXBsZSwgc29tZSBiYWNrZW5kcyBrbm93IHRoZSBhdHRyaWJ1dGUgQGNvZGV7X19mYXJ9LgorCisgICAgICBEZWNsYXJhdGlvbiBvZiBhIHBvaW50ZXIgdG8gYSBmYXItcXVhbGlmaWVkIGNoYXJhY3RlciB3b3VsZCBiZQorCitAZXhhbXBsZQorICAgICAgICBfX2ZhciBjaGFyICpwOworQGVuZCBleGFtcGxlCisKKyAgICAgIHdoZXJlYXMKKworQGV4YW1wbGUKKyAgICAgICAgY2hhciAqIF9fZmFyIHA7CitAZW5kIGV4YW1wbGUKKworICAgICAgaXMgYSBmYXItcXVhbGlmaWVkIHBvaW50ZXIgdG8gYW4gdW5xdWFsaWZpZWQgY2hhci4KKworICAgICAgICBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgY29tbW9uIGV4dGVuc2lvbnMgbGlrZSBAY29kZXtfX2Zhcn0gYXJlCisgICAgICAgIHR5cGUgYXR0cmlidXRlcyBvbiBzb21lIGFyY2hpdGVjdHVyZXMsIGJ1dCBhY3R1YWxseSB2YXJpYWJsZQorICAgICAgICBhdHRyaWJ1dGVzIChAcHhyZWZ7VmFyaWFibGUgQXR0cmlidXRlc30pIG9uIG90aGVycy4gVGhpcyBpcyBkdWUgdG8KKyAgICAgICAgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgbWVhbmluZ3Mgb24gZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuCisKK0BzdWJzZWN0aW9uIEBjb2Rle19fdHlwZW9mfQorCisgICAgICBAY29kZXtfX3R5cGVvZn0gaXMgc3ludGFjdGljYWxseSBlcXVpdmFsZW50IHRvIHNpemVvZiwgYnV0IGl0cyByZXN1bHQgaXMgb2YKKyAgICAgIHR5cGUgaW50IGFuZCBpcyBhIG51bWJlciByZXByZXNlbnRpbmcgdGhlIHR5cGUgb2YgaXRzIGFyZ3VtZW50LgorICAgICAgVGhpcyBtYXkgYmUgbmVjZXNzYXJ5IGZvciBpbXBsZW1lbnRpbmcgQGZpbGV7c3RkYXJnLmh9LgorCisKK0BzdWJzZWN0aW9uIEBjb2Rle19fYWxpZ25vZn0KKworICAgICAgQGNvZGV7X19hbGlnbm9mfSBpcyBzeW50YWN0aWNhbGx5IGVxdWl2YWxlbnQgdG8gc2l6ZW9mLCBidXQgaXRzIHJlc3VsdCBpcyBvZgorICAgICAgdHlwZSBpbnQgYW5kIGlzIHRoZSBhbGlnbm1lbnQgaW4gYnl0ZXMgb2YgdGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50LgorICAgICAgVGhpcyBtYXkgYmUgbmVjZXNzYXJ5IGZvciBpbXBsZW1lbnRpbmcgQGZpbGV7c3RkYXJnLmh9LgorCisKK0BzdWJzZWN0aW9uIEBjb2Rle19fb2Zmc2V0b2Z9CisKKyAgICAgIEBjb2Rle19fb2Zmc2V0b2Z9IGlzIGEgYnVpbHRpbiB2ZXJzaW9uIG9mIHRoZSBAY29kZXtvZmZzZXRvZn0tbWFjcm8KKyAgICAgICAgYXMgZGVmaW5lZCBpbiB0aGUgQyBsYW5ndWFnZS4gVGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgc3RydWN0dXJlCisgICAgICAgIHR5cGUgYW5kIHRoZSBzZWNvbmQgYSBtZW1iZXIgb2YgdGhlIHN0cnVjdHVyZSB0eXBlLiBUaGUgcmVzdWx0CisgICAgICAgIHdpbGwgYmUgYSBjb25zdGFudCBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgb2Zmc2V0IG9mIHRoZQorICAgICAgICBzcGVjaWZpZWQgbWVtYmVyIGluIHRoZSBzdHJ1Y3R1cmUuCisKK0Bub2RlIFNwZWNpZnlpbmcgc2lkZS1lZmZlY3RzCitAc3Vic2VjdGlvbiBTcGVjaWZ5aW5nIHNpZGUtZWZmZWN0cworCitPbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisKK1doZW4gb3B0aW1pemluZyBhbmQgZ2VuZXJhdGluZyBjb2RlLCBAY29tbWFuZHt2YmNjfSBvZnRlbiBoYXMgdG8gdGFrZQoraW50byBhY2NvdW50IHNpZGUtZWZmZWN0cyBvZiBmdW5jdGlvbi1jYWxscywgZS5nLiB3aGljaCByZWdpc3RlcnMgbWlnaHQKK2JlIG1vZGlmaWVkIGJ5IHRoaXMgZnVuY3Rpb24gYW5kIHdoYXQgdmFyaWFibGVzIGFyZSByZWFkIG9yIG1vZGlmaWVkLgorCitBIHJhdGhlciBpbXByZWNpc2Ugd2F5IHRvIG1ha2UgYXNzdW1wdGlvbnMgb24gc2lkZS1lZmZlY3RzIGlzIGdpdmVuIGJ5Cit0aGUgQUJJIG9mIGEgY2VydGFpbiBzeXN0ZW0gKHRoYXQgZGVmaW5lcyB3aGljaCByZWdpc3RlcnMgaGF2ZSB0byBiZQorcHJlc2VydmVkIGJ5IGZ1bmN0aW9ucykgb3IgcnVsZXMgZGVyaXZlZCBmcm9tIHRoZSBsYW5ndWFnZSAoZS5nLiBsb2NhbAordmFyaWFibGVzIHdob3NlIGFkZHJlc3MgaGFzIG5vdCBiZWVuIHRha2VuIGNhbm5vdCBiZSBhY2Nlc3NlZCBieSBhbm90aGVyCitmdW5jdGlvbikuCisKK09uIGhpZ2hlciBvcHRpbWl6YXRpb24gbGV2ZWxzIChAcHhyZWZ7SW50ZXItUHJvY2VkdXJhbCBBbmFseXNpc30gYW5kCitAcHhyZWZ7Q3Jvc3MtTW9kdWxlIE9wdGltaXphdGlvbnN9KSkgQGNvbW1hbmR7dmJjY30gd2lsbCB0cnkgdG8gYW5hbHlzZQorZnVuY3Rpb25zIGFuZCBvZnRlbiBnZXRzIG11Y2ggbW9yZSBwcmVjaXNlIGluZm9ybWF0aW9ucyByZWdhcmRpbmcKK3NpZGUtZWZmZWN0cy4KKworSG93ZXZlciwgaWYgdGhlIHNvdXJjZSBjb2RlIG9mIGZ1bmN0aW9ucyBpcyBub3QgdmlzaWJsZSB0byBAY29tbWFuZHt2YmNjfSwKK2UuZy4gYmVjYXVzZSB0aGUgZnVuY3Rpb25zIGFyZSBmcm9tIGxpYnJhcmllcyBvciB0aGV5IGFyZQord3JpdHRlbiBpbiBhc3NlbWJseSAoQHB4cmVme0lubGluZS1Bc3NlbWJseSBGdW5jdGlvbnN9KSwgaXQgaXMgb2J2aW91c2x5Citub3QgcG9zc2libGUgdG8gYW5hbHl6ZSB0aGUgY29kZS4gSW4gdGhpcyBjYXNlLCBpdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5Cit0aGVzZSBzaWRlLWVmZmVjdHMgdXNpbmcgdGhlIGZvbGxvd2luZyBzcGVjaWFsIHZhcmlhYmxlLWF0dHJpYnV0ZXMKKyhAcHhyZWZ7VmFyaWFibGUgQXR0cmlidXRlc30pLgorCitUaGUgQGNvZGV7X19yZWdzdXNlZCg8cmVnaXN0ZXItbGlzdD4pfSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSB2b2xhdGlsZQorcmVnaXN0ZXJzIHVzZWQgb3IgbW9kaWZpZWQgYnkgYSBmdW5jdGlvbi4gVGhlIHJlZ2lzdGVyIGxpc3QgaXMgYSBsaXN0IG9mCityZWdpc3RlciBuYW1lcyAoYXMgZGVmaW5lZCBpbiB0aGUgYmFja2VuZC1kb2N1bWVudGF0aW9uKSBzZXBhcmF0ZWQgYnkKK3NsYXNoZXMgYW5kIGVuY2xvc2VkIGluIGRvdWJsZS1xdW90ZXMsIGUuZy4KKworQGNvZGV7ICAgICAgICBfX3JlZ3N1c2VkKCJkMC9kMSIpIGludCBhYnMoKTt9CisKK2RlY2xhcmVzIGEgZnVuY3Rpb24gQGNvZGV7YWJzfSB3aGljaCBvbmx5IHVzZXMgcmVnaXN0ZXJzIEBjb2Rle2QwfSBhbmQKK0Bjb2Rle2QxfS4KKworQGNvZGV7X192YXJzbW9kaWZpZWQoPHZhcmlhYmxlLWxpc3Q+KX0gc3BlY2lmaWVzIGEgbGlzdCBvZiB2YXJpYWJsZXMgd2l0aAorZXh0ZXJuYWwgbGlua2FnZQord2hpY2ggYXJlIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbi4gQGNvZGV7X192YXJzdXNlZH0gaXMgc2ltaWxhciwgYnV0CitzcGVjaWZpZXMgdGhlIGV4dGVybmFsIHZhcmlhYmxlcyByZWFkIGJ5IHRoZSBmdW5jdGlvbi4gSWYgYSB2YXJpYWJsZSBpcworcmVhZCBhbmQgd3JpdHRlbiwgYm90aCBhdHRyaWJ1dGVzIGhhdmUgdG8gYmUgc3BlY2lmaWVkLiBUaGUgdmFyaWFibGUtbGlzdAoraXMgYSBsaXN0IG9mIGlkZW50aWZpZXJzLCBzZXBhcmF0ZWQgYnkgc2xhc2hlcyBhbmQgZW5jbG9zZWQgaW4gZG91YmxlCitxdW90ZXMuCisKK1RoZSBhdHRyaWJ1dGUgQGNvZGV7X193cml0ZXNtZW0oPHR5cGU+KX0gaXMgdXNlZCB0byBzcGVjaWZ5IHRoYXQgdGhlCitmdW5jdGlvbiBhY2Nlc3NlcyBtZW1vcnkgdXNpbmcgYSBjZXJ0YWluIHR5cGUuIFRoaXMgaXMgbmVjZXNzYXJ5IGlmIHRoZQorZnVuY3Rpb24gbW9kaWZpZXMgbWVtb3J5IGFjY2Vzc2libGUgdG8gdGhlIGNhbGxpbmcgZnVuY3Rpb24gd2hpY2ggY2Fubm90CitiZSBzcGVjaWZpZWQgdXNpbmcgQGNvZGV7X192YXJzbW9kaWZpZWR9IChlLmcuIGJlY2F1c2UgaXQgaXMgYWNjZXNzZWQgdmlhCitwb2ludGVycykuIEBjb2Rle19fcmVhZHNtZW19IGlzIHNpbWlsYXIsIGJ1dCBzcGVjaWZpZXMgbWVtb3J5IHdoaWNoIGlzCityZWFkLgorCitJZiBvbmUgb2YgQGNvZGV7X192YXJzdXNlZH0sIEBjb2Rle3ZhcnNtb2RpZmllZH0sIEBjb2Rle19fcmVhZHNtZW19IGFuZAorQGNvZGV7X193cml0ZXNtZW19IGlzIHNwZWNpZmllZCwgYWxsIHJlbGV2YW50IHNpZGUtZWZmZWN0cyBtdXN0IGJlCitzcGVjaWZpZWQuIElmLCBmb3IgZXhhbXBsZSwgb25seSBAY29kZXtfX3ZhcnN1c2VkKCJteV9nbG9iYWwiKX0gCitpcyBzcGVjaWZpZWQsIHRoaXMgaW1wbGllcyB0aGF0IHRoZSBmdW5jdGlvbiBvbmx5IHJlYWRzIEBjb2Rle215X2dsb2JhbH0KK2FuZCBkb2VzIG5vdCBtb2RpZnkgYW55IHZhcmlhYmxlIGFjY2Vzc2libGUgdG8gdGhlIGNhbGxlci4KKworQWxsIG9mIHRoZXNlIGF0dHJpYnV0ZXMgbWF5IGJlIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcy4KKworQHN1YnNlY3Rpb24gQXV0b21hdGljIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZnVuY3Rpb25zCisKK1RoZSBsaW5rZXIgQGNvbW1hbmR7dmxpbmt9IHByb3ZpZGVzIGEgZmVhdHVyZSB0byBjb2xsZWN0IHBvaW50ZXJzIHRvCithbGwgZnVuY3Rpb25zIHN0YXJ0aW5nIHdpdGggdGhlIG5hbWVzIEBjb2Rle19JTklUfSBvciBAY29kZXtfRVhJVH0gaW4KK2EgcHJpb3JpdGl6ZWQgYXJyYXksIGxhYmVsZWQgYnkgQGNvZGV7X19DVE9SX0xJU1RfX30gYW5kCitAY29kZXtfX0RUT1JfTElTVF9ffS4gVGhlIEMtbGlicmFyeSAodmNsaWIpIGNhbGxzIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMKK2JlZm9yZSBlbnRlcmluZyBAY29kZXttYWluKCl9IGFuZCB0aGUgZGVzdHJ1Y3RvciBmdW5jdGlvbnMgb24gcHJvZ3JhbQorZXhpdC4KKworVGhlIGZvcm1hdCBvZiB0aGVzZSBzcGVjaWFsIGZ1bmN0aW9uIG5hbWVzIGlzOgorQGV4YW1wbGUKKyAgICB2b2lkIF9JTklUW188cHJpPl1bXzxuYW1lPl0odm9pZCkKKyAgICB2b2lkIF9FWElUW188cHJpPl1bXzxuYW1lPl0odm9pZCkKK0BlbmQgZXhhbXBsZQorVGhlIG9wdGlvbmFsIHByaW9yaXR5IEBjb2Rlezxwcmk+fSBtYXkgYmUgYSBkaWdpdCBiZXR3ZWVuIDEgYW5kIDksIHdoZXJlCithIGNvbnN0cnVjdG9yIHdpdGggYSBwcmlvcml0eSBvZiAxIGlzIGV4ZWN1dGVkIGZpcnN0IHdoaWxlIGEgZGVzdHJ1Y3Rvcgord2l0aCBhIHByaW9yaXR5IG9mIDEgaXMgZXhlY3V0ZWQgbGFzdC4gQGNvZGV7PG5hbWU+fSBpcyBhbiBvcHRpb25hbCBuYW1lLAordXNlZCB0byBkaWZmZXJlbnRpYXRlIGZ1bmN0aW9ucyBvZiB0aGUgc2FtZSBsZXZlbC4KKworQHN1YnNlY3Rpb24gQGNvZGV7X19ub2lubGluZX0KKworQGNvZGV7X19ub2lubGluZX0gd2lsbCBwcmV2ZW50IGlubGluaW5nIG9mIGEgZ2l2ZW4gZnVuY3Rpb24uIFRoZSBoZXVyaXN0aWMKK3VzZWQgZm9yIGRlY2lkaW5nIHdoZXRoZXIgYSBmdW5jdGlvbiBzaG91bGQgYmUgaW5saW5lZCBnZW5lcmFsbHkgbWFrZXMgYSBnb29kCit0cmFkZS1vZmYgYmV0d2VlbiBjb2RlIHNpemUgYW5kIHBlcmZvcm1hbmNlLCBidXQgc29tZXRpbWVzIGl0IGNhbiBiZSB1c2VmdWwgdG8gb3ZlcnJpZGUKK3RoaXMgYmVoYXZpb3VyLiBVc2UtY2FzZXMgaW5jbHVkZSBrZWVwaW5nICJjb2xkIiBmdW5jdGlvbnMgb3V0LW9mIGxpbmUgdG8gcmVkdWNlIGNvZGUKK3NpemUsIG9yIHRvIGFsbG93IHNhZmUgdXNlIG9mIGlubGluZSBhc3NlbWJseSB3aXRoIGxhYmVscy4KKworQHN1YnNlY3Rpb24gUHJlZGVmaW5lZCBtYWNyb3MKK1RoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBkZWZpbmVkIGJ5IHRoZSBjb21waWxlci4KK0BleGFtcGxlCisgICNkZWZpbmUgX19WQkNDX18KKyAgI2RlZmluZSBfX2VudHJ5IF9fdmF0dHIoImVudHJ5IikKKyAgI2RlZmluZSBfX3N0cih4KSAjeAorICAjZGVmaW5lIF9fYXNtKHgpIGRve3N0YXRpYyB2b2lkIGlubGluZV9hc3NlbWJseSgpPXg7aW5saW5lX2Fzc2VtYmx5KCk7fXdoaWxlKDApCisgICNkZWZpbmUgX19yZWdzdXNlZCh4KSBfX3ZhdHRyKCJyZWd1c2VkKCJ4IikiKQorICAjZGVmaW5lIF9fdmFyc3VzZWQoeCkgX192YXR0cigidmFydXNlZCgieCIpIikKKyAgI2RlZmluZSBfX3ZhcnNtb2RpZmllZCh4KSBfX3ZhdHRyKCJ2YXJjaGFuZ2VkKCJ4IikiKQorICAjZGVmaW5lIF9fbm9yZXR1cm4gX192YXR0cigibm9yZXR1cm4oKSIpCisgICNkZWZpbmUgX19hbHdheXNyZXR1cm4gX192YXR0cigiYWx3YXlzcmV0dXJuKCkiKQorICAjZGVmaW5lIF9fbm9zaWRlZnggX192YXR0cigibm9zaWRlZngoKSIpCisgICNkZWZpbmUgX19zdGFjayh4KSBfX3ZhdHRyKF9fc3RyKHN0YWNrMSh4KSkpCisgICNkZWZpbmUgX19zdGFjazIoeCkgX192YXR0cihfX3N0cihzdGFjazIoeCkpKQorICAjZGVmaW5lIF9fbm9pbmxpbmUgX192YXR0cigibm9pbmxpbmUoKSIpCisgICNkZWZpbmUgX19TVERDX1ZFUlNJT05fXyAxOTk5MDFMCitAZW5kIGV4YW1wbGUKK0Bjb2Rle19fU1REQ19WRVJTSU9OX199IGlzIGRlZmluZWQgaW4gQzk5LW1vZGUgb25seS4KKworQHN1YnNlY3Rpb24gTWFza2VkIHN5bWJvbHMKK1RvZ2V0aGVyIHdpdGggdmxpbmssIHRoaXMgZmVhdHVyZSBhbGxvd3MgdG8gcHJvdmlkZSBhIGZhbWlseSBvZiBzcGVjaWFsbHkgdGFpbG9yZWQKK2Z1bmN0aW9ucyBpbiBhIGxpYnJhcnkuCisKK0Egc3ltYm9sIGNhbiBiZSBhdHRhY2hlZCBhIG1hc2sgdXNpbmcgdGhlIEBjb2Rle19fbWFza30gYXR0cmlidXRlLCBlLmcuCisKK0BleGFtcGxlCisgIF9fbWFzaygxNSkgdm9pZCBteWZ1bmModm9pZCk7CitAZW5kIGV4YW1wbGUKKworVGhlIHN5bWJvbCBvZiB0aGlzIGZ1bmN0aW9uIHdpbGwgZ2V0IHRoZSBzdWZmaXggQGNvZGV7LjE1fSBhdHRhY2hlZC4KKworQSByZWZlcmVuY2UgdG8gYSBtYXNrZWQgc3ltYm9sIGNhbiBlaXRoZXIgYmUgY3JlYXRlZCBieSB2YmNjIGl0c2VsZiB3aGVuIHVzaW5nIHRoZQorb3B0aW9uIEBjb2Rley1tYXNrLW9wdH0sIG9yIG1hbnVhbGx5IGJ5IHJlZmVyZW5jaW5nIGEgc3ltYm9sIHByZWZpeGVkIHdpdGgKK0Bjb2Rle19fbWFza21fPG1hc2s+fS4KKworQGV4YW1wbGUKKyBleHRlcm4gX19tYXNrKDE1KSB2b2lkIG15ZnVuYyh2b2lkKTsKKyAuLi4KKyAgIF9fbWFza21fMTVfbXlmdW5jKCk7CitAZW5kIGV4YW1wbGUKKworSWYgdGhlcmUgYXJlIHNldmVyYWwgbWFza2VkIHJlZmVyZW5jZXMgdG8gYSBzeW1ib2wsIHRoZSBsaW5rZXIgd2lsbCBwdWxsIHRoZSBmaXJzdAorc3ltYm9sIGNvbnRhaW5pbmcgYSBtYXNrIHRoYXQgaGFzIGF0IGxlYXN0IGFsbCBiaXRzIHNldCB0aGF0IGFyZSBzZXQgaW4gYW55IG1hc2tlZAorcmVmZXJlbmNlLiBJZiBubyBtYXNrZWQgc3ltYm9scyBtYXRjaGluZyB0aGF0IHJlcXVpcmVtZW50IGFyZSBhdmFpbGFibGUsIHRoZSBzeW1ib2wKK3dpdGhvdXQgYSBtYXNrIGlzIHVzZWQuIEFsc28sIGEgbm9uLW1hc2tlZCByZWZlcmVuY2Ugd2lsbCBvbmx5IHB1bGwgYSBub24tbWFza2VkCitzeW1ib2wgZnJvbSBhIGxpYnJhcnkuCisKK01hc2tlZCBvYmplY3RzIG1heSBvbmx5IGJlIGRlZmluZWQgaW4gbGlicmFyaWVzIGFuZCB6ZXJvIG1hc2tzIGFyZSBub3QgYWxsb3dlZC4KKworCitAc2VjdGlvbiBLbm93biBQcm9ibGVtcworCisgICAgU29tZSBrbm93biB0YXJnZXQtaW5kZXBlbmRlbnQgcHJvYmxlbXMgb2YgQGNvbW1hbmR7dmJjY30gYXQgdGhlIG1vbWVudDoKKworQGl0ZW1pemUgQG1pbnVzCisKKyAgICBAaXRlbSBTb21lIGV4b3RpYyBzY29wZS1ydWxlcyBhcmUgbm90IGhhbmRsZWQgY29ycmVjdGx5LgorCisgICAgQGl0ZW0gRGVidWdnaW5nLWluZm9zIG1heSBoYXZlIHByb2JsZW1zIG9uIGhpZ2hlciBvcHRpbWl6YXRpb24tbGV2ZWxzLgorCisgICAgQGl0ZW0gU3RyaW5nLWNvbnN0YW50cyBhcmUgbm90IG1lcmdlZCAocGFydGlhbGx5IGRvbmUpLgorCitAZW5kIGl0ZW1pemUKKworQHNlY3Rpb24gQ3JlZGl0cworCisgICAgQWxsIHRob3NlIHdobyB3cm90ZSBwYXJ0cyBvZiB0aGUgQGNvbW1hbmR7dmJjY30gZGlzdHJpYnV0aW9uLCBtYWRlIHN1Z2dlc3Rpb25zLAorICAgIGFuc3dlcmVkIG15IHF1ZXN0aW9ucywgdGVzdGVkIEBjb21tYW5ke3ZiY2N9LCByZXBvcnRlZCBlcnJvcnMgb3Igd2VyZSBvdGhlcndpc2UKKyAgICBpbnZvbHZlZCBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgQGNvbW1hbmR7dmJjY30gKGluIGRlc2NlbmRpbmcgYWxwaGFiZXRpY2FsIG9yZGVyLAorICAgIHVuZGVyIHdvcmssIG5vdCBjb21wbGV0ZSk6CisKK0BpdGVtaXplCisgICAgQGl0ZW0gRnJhbmsgV2lsbGUKKyAgICBAaXRlbSBHYXJ5IFdhdHNvbgorICAgIEBpdGVtIEFuZHJlYSBWYWxsaW5vdHRvCisgICAgQGl0ZW0gSm9obm55IFRldmVzc2VuCisgICAgQGl0ZW0gRWVybyBUYW1taW5lbgorICAgIEBpdGVtIEdhYnJpZWxlIFN2ZWx0bworICAgIEBpdGVtIERpcmsgU3RvZWNrZXIKKyAgICBAaXRlbSBSYWxwaCBTY2htaWR0CisgICAgQGl0ZW0gTWFya3VzIFNjaG1pZGluZ2VyCisgICAgQGl0ZW0gVGhvcnN0ZW4gU2NoYWFwcworICAgIEBpdGVtIEFudG9uIFJvbGxzCisgICAgQGl0ZW0gTWljaGFlbGEgUHJ1ZXNzCisgICAgQGl0ZW0gVGhvbWFzIFBvcm5pbgorICAgIEBpdGVtIEpvZXJnIFBsYXRlCisgICAgQGl0ZW0gR2lsbGVzIFBpcmlvCisgICAgQGl0ZW0gQmFydGxvbWllaiBQYXRlcgorICAgIEBpdGVtIEVsZW5hIE5vdmFyZXR0aQorICAgIEBpdGVtIEd1bnRoZXIgTmlrbAorICAgIEBpdGVtIENvbnN0YW50aW5vcyBOaWNvbGFrYWtpcworICAgIEBpdGVtIFRpbW0gUy4gTXVlbGxlcgorICAgIEBpdGVtIFJvYmVydCBDbGF1cyBNdWVsbGVyCisgICAgQGl0ZW0gSm9lcm4gTWFhc3MKKyAgICBAaXRlbSBBa2kgTSBMYXVra2FuZW4KKyAgICBAaXRlbSBLYWkgS29obG1vcmdlbgorICAgIEBpdGVtIFV3ZSBLbGluZ2VyCisgICAgQGl0ZW0gQW5kcmVhcyBLbGVpbmVydAorICAgIEBpdGVtIEp1bGlhbiBLaW5yYWlkCisgICAgQGl0ZW0gQWNlcmVkYSBNYWNpYSBKb3JnZQorICAgIEBpdGVtIERpcmsgSG9sdHdpY2sKKyAgICBAaXRlbSBNYXR0aGV3IEhleQorICAgIEBpdGVtIFRpbSBIYW5zb24KKyAgICBAaXRlbSBLYXNwZXIgR3JhdmVyc2VuCisgICAgQGl0ZW0gSmVucyBHcmFuc2V1ZXIKKyAgICBAaXRlbSBWb2xrZXIgR3JhZgorICAgIEBpdGVtIE1hcmN1cyBHZWVsbmFyZAorICAgIEBpdGVtIEZyYW50YSBGdWxpbgorICAgIEBpdGVtIE1hdHRoaWFzIEZsZWlzY2hlcgorICAgIEBpdGVtIEFsZXhhbmRlciBGaWNodG5lcgorICAgIEBpdGVtIE9saXZpZXIgRmFicmUKKyAgICBAaXRlbSBSb2JlcnQgRW5uYWxzCisgICAgQGl0ZW0gVGhvbWFzIERvcm4KKyAgICBAaXRlbSBXYWx0ZXIgRG9lcndhbGQKKyAgICBAaXRlbSBBYXJvbiBEaWd1bGxhCisgICAgQGl0ZW0gTGFycyBEYW5uZW5iZXJnCisgICAgQGl0ZW0gU2FtIENyb3cKKyAgICBAaXRlbSBNaWNoYWVsIEJvZGUKKyAgICBAaXRlbSBNaWNoYWVsIEJhdWVyCisgICAgQGl0ZW0gSnVlcmdlbiBCYXJ0aGVsbWFubgorICAgIEBpdGVtIFRob21hcyBBcm5ob2xkCisgICAgQGl0ZW0gQWxraW5vb3MgQWxleGFuZHJvcyBBcmdpcm9wb3Vsb3MKKyAgICBAaXRlbSBUaG9tYXMgQWdsYXNzaW5nZXIKK0BlbmQgaXRlbWl6ZQpkaWZmIC0tZ2l0IGEvZG9jL3ZiY2NhbHBoYS50ZXhpIGIvZG9jL3ZiY2NhbHBoYS50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE1ZTllNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdmJjY2FscGhhLnRleGkKQEAgLTAsMCArMSwxMzIgQEAKK1RoaXMgY2hhcHRlciBkb2N1bWVudHMgdGhlIEJhY2tlbmQgZm9yIHRoZSBERUMgQWxwaGEgcHJvY2Vzc29yIGZhbWlseS4KKworQHNlY3Rpb24gQWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGlzIHZlcnNpb24KKworVGhpcyBiYWNrZW5kIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgorCitAdGFibGUgQG9wdGlvbgorCisKKyAgICBAaXRlbSAtbWVyZ2UtY29uc3RhbnRzCisgICAgICAgICAgICAgICAgUGxhY2UgaWRlbnRpY2FsIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cyBhdCB0aGUgc2FtZQorICAgICAgICAgICAgICAgIG1lbW9yeSBsb2NhdGlvbi4gVGhpcyBjYW4gcmVkdWNlIHByb2dyYW0gc2l6ZSBhbmQgaW5jcmVhc2UKKyAgICAgICAgICAgICAgICBjb21waWxhdGlvbiB0aW1lLgorCisgICAgQGl0ZW0gLWNvbnN0LWluLWRhdGEKKyAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IGNvbnN0YW50IGRhdGEgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIGNvZGUKKyAgICAgICAgICAgICAgICBzZWN0aW9uIChhbmQgdGhlcmVmb3JlIGlzIGFjY2Vzc2FibGUgd2l0aCBmYXN0ZXIgcGMtcmVsYXRpdmUKKyAgICAgICAgICAgICAgICBhZGRyZXNzaW5nIG1vZGVzKS4gVXNpbmcgdGhpcyBvcHRpb24gaXQgd2lsbCBiZSBwbGFjZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgZGF0YSBzZWN0aW9uLgorICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBvbiBvcGVyYXRpbmcgc3lzdGVtcyB3aXRoIG1lbW9yeSBwcm90ZWN0aW9uIHRoaXMKKyAgICAgICAgICAgICAgICBvcHRpb24gd2lsbCBkaXNhYmxlIHdyaXRlLXByb3RlY3Rpb24gb2YgY29uc3RhbnQgZGF0YS4KKworICAgIEBpdGVtIC1uby1idWlsdGlucworICAgICAgICAgICAgICAgIERvIG5vdCByZXBsYWNlIGNlcnRhaW4gYnVpbHRpbiBmdW5jdGlvbnMgYnkgaW5saW5lIGNvZGUuCisgICAgICAgICAgICAgICAgVGhpcyBtYXkgYmUgdXNlZnVsIGlmIHlvdSB1c2UgdGhpcyBjb2RlIGdlbmVyYXRvciB3aXRoCisgICAgICAgICAgICAgICAgYW5vdGhlciBmcm9udGVuZCB0aGFuIHZiY2MuCisgICAgICAgICAgICAgICAgc3RkYXJnLmggd2lsbCBub3Qgd29yayB3aXRoIC1uby1idWlsdGlucy4KKworICAgIEBpdGVtIC1zdGFicworICAgICAgICAgICAgICAgIEdlbmVyYXRlIHN0YWJzIGRlYnVnIGluZm9zIChpZiAtZyBpcyBzcGVjaWZpZWQpIHJhdGhlciB0aGFuCisgICAgICAgICAgICAgICAgRFdBUkYyIHdoaWNoIGlzIHRoZSBkZWZhdWx0LiBDb25zaWRlciB0aGlzIG9ic29sZXRlLgorCitAZW5kIHRhYmxlCisKK0BzZWN0aW9uIEFCSQorCisKKyAgICAgICAgVGhpcyBiYWNrZW5kIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcmVnaXN0ZXJzOgorCisgICAgICAgIEBpdGVtaXplIEBtaW51cworICAgICAgICBAaXRlbSBAY29kZXskMH0gdGhyb3VnaCBAY29kZXskMzF9IGZvciB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyBhbmQKKyAgICAgICAgQGl0ZW0gQGNvZGV7JGYwfSB0aHJvdWdoIEBjb2RleyRmMzF9IGZvciB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzLgorICAgICAgICBAZW5kIGl0ZW1pemUKKworICAgIFRoZSBjdXJyZW50IHZlcnNpb24gZ2VuZXJhdGVzIGFzc2VtYmx5IG91dHB1dCBmb3IgdXNlIHdpdGggdGhlIEdOVQorICAgIGFzc2VtYmxlci4gVGhlIGdlbmVyYXRlZCBjb2RlIHNob3VsZCB3b3JrIG9uIHN5c3RlbXMgd2l0aCAyMTA2NCwKKyAgICAyMTA2NiwgMjExNjQgYW5kIGhpZ2hlciBBbHBoYSBDUFVzLgorCisgICAgVGhlIHJlZ2lzdGVycyBAY29kZXskMC0kOCwgJDE2LSQyOCwgJGYwLCAkZjF9IGFuZCBAY29kZXskZjEwLSRmMzB9CisgICAgYXJlIHVzZWQgYXMgc2NyYXRjaCByZWdpc3RlcnMgKGkuZS4gdGhleSBjYW4gYmUgZGVzdHJveWVkIGluIGZ1bmN0aW9uCisgICAgY2FsbHMpLCBhbGwgb3RoZXIgcmVnaXN0ZXJzIGFyZSBwcmVzZXJ2ZWQuIE9mIGNvdXJzZSBAY29kZXskMzF9IGFuZAorICAgIEBjb2RleyRmMzF9IGNhbm5vdCBiZSB1c2VkLgorCisgICAgVGhlIGZpcnN0IDYgZnVuY3Rpb24gYXJndW1lbnRzIHdoaWNoIGhhdmUgYXJpdGhtZXRpYyBvciBwb2ludGVyIHR5cGVzCisgICAgYXJlIHBhc3NlZCBpbiByZWdpc3RlcnMgQGNvZGV7JDE2LyRmMTZ9IHRocm91Z2ggQGNvZGV7JDIxLyRmMjF9LgorCisgICAgSW50ZWdlcnMgYW5kIHBvaW50ZXJzIGFyZSByZXR1cm5lZCBpbiBAY29kZXskMH0sIGZsb2F0cyBhbmQgZG91YmxlcyBpbgorICAgIEBjb2RleyRmMH0uCisgICAgQWxsIG90aGVyIHR5cGVzIGFyZSByZXR1cm5lZCBieSBwYXNzaW5nIHRoZSBmdW5jdGlvbiB0aGUgYWRkcmVzcworICAgIG9mIHRoZSByZXN1bHQgYXMgYSBoaWRkZW4gYXJndW1lbnQgLSBzbyB3aGVuIHlvdSBjYWxsIHN1Y2ggYSBmdW5jdGlvbgorICAgIHdpdGhvdXQgYSBwcm9wZXIgZGVjbGFyYXRpb24gaW4gc2NvcGUgeW91IGNhbiBleHBlY3QgYSBjcmFzaC4KKworICAgIFRoZSBlbGVtZW50YXJ5IGRhdGEgdHlwZXMgYXJlIHJlcHJlc2VudGVkIGxpa2U6CisKKyAgICBAZXhhbXBsZQorICAgIHR5cGUgICAgICAgIHNpemUgaW4gYml0cyAgICAgICAgYWxpZ25tZW50IGluIGJ5dGVzIAorCisgICAgY2hhciAgICAgICAgICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgICAxIAorICAgIHNob3J0ICAgICAgICAgICAgICAxNiAgICAgICAgICAgICAgICAgICAgICAgMiAKKyAgICBpbnQgICAgICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICAgICAgIDQgCisgICAgbG9uZyAgICAgICAgICAgICAgIDY0ICAgICAgICAgICAgICAgICAgICAgICA4CisgICAgbG9uZyBsb25nICAgICAgICAgIDY0ICAgICAgICAgICAgICAgICAgICAgICA4IAorICAgIGFsbCBwb2ludGVycyAgICAgICA2NCAgICAgICAgICAgICAgICAgICAgICAgOCAKKyAgICBmbG9hdCAgICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICAgICAgIDQgCisgICAgZG91YmxlICAgICAgICAgICAgIDY0ICAgICAgICAgICAgICAgICAgICAgICA4IAorICAgIEBlbmQgZXhhbXBsZQorCitAc2VjdGlvbiBQcmVkZWZpbmVkIE1hY3JvcworCisgICAgICAgIFRoaXMgYmFja2VuZCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgbWFjcm9zOgorCitAdGFibGUgQGNvZGUKKyAgICAgICAgQGl0ZW0gX19BTFBIQV9fCisgICAgICAgIAorQGVuZCB0YWJsZQorCisKK0BzZWN0aW9uIFN0ZGFyZworCisgICAgQSBwb3NzaWJsZSA8c3RkYXJnLmg+IGNvdWxkIGxvb2sgbGlrZSB0aGlzOgorCitAZXhhbXBsZQorCisgICAgdHlwZWRlZiBzdHJ1Y3QgQHsKKyAgICAgIGNoYXIgKnJlZ2Jhc2U7CisgICAgICBjaGFyICptZW1iYXNlOworICAgICAgaW50IGFyZzsKKyAgICBAfSB2YV9saXN0OworCisgICAgY2hhciAqX192YV9zdGFydCh2b2lkKTsKKyAgICBpbnQgX192YV9maXhhcmdzKHZvaWQpOworCisgICAgI2RlZmluZSB2YV9zdGFydCh2bCxkdW1teSkgXAorICAgICh2bC5hcmc9X192YV9maXhhcmdzKCksdmwucmVnYmFzZT1fX3ZhX3N0YXJ0KCksdmwubWVtYmFzZT12bC5yZWdiYXNlKyg2LXZsLmFyZykqMTYpCisKKyAgICAjZGVmaW5lIHZhX2VuZCh2bCkgKHZsLnJlZ2Jhc2U9dmwubWVtYmFzZT0wKQorCisgICAgI2RlZmluZSBfX3ZhX3NpemUodHlwZSkgKChzaXplb2YodHlwZSkrNykvOCo4KQorICAgICNkZWZpbmUgdmFfYXJnKHZsLHR5cGUpIFwKKyAgICAgKCBcCisgICAgICAoKF9fdHlwZW9mKHR5cGUpJjE1KTw9MTAmJisrdmwuYXJnPD02KSA/IFwKKyAgICAgICAoIFwKKyAgICAgICAgKChfX3R5cGVvZih0eXBlKSYxNSk+PTYmJihfX3R5cGVvZih0eXBlKSYxNSk8PTgpID8gXAorICAgICAgICAgICh2bC5yZWdiYXNlKz0xNiwqKHR5cGUgKikodmwucmVnYmFzZS04KSkgXAorICAgICAgICA6IFwKKyAgICAgICAgICAodmwucmVnYmFzZSs9MTYsKih0eXBlICopKHZsLnJlZ2Jhc2UtMTYpKSBcCisgICAgICAgKSBcCisgICAgICA6IFwKKyAgICAgICAodmwubWVtYmFzZSs9X192YV9zaXplKHR5cGUpLCoodHlwZSAqKSh2bC5tZW1iYXNlLV9fdmFfc2l6ZSh0eXBlKSkpIFwKKyAgICAgKQorCitAZW5kIGV4YW1wbGUKKworCitAc2VjdGlvbiBLbm93biBwcm9ibGVtcworCitAaXRlbWl6ZSBAbWludXMKKyAgICBAaXRlbSBnZW5lcmF0ZWQgY29kZSBpcyByYXRoZXIgcG9vcgorICAgIEBpdGVtIHNldmVyYWwgb3RoZXIgcHJvYmxlbXMKK0BlbmQgaXRlbWl6ZQorCisKZGlmZiAtLWdpdCBhL2RvYy92YmNjYzE2eC50ZXhpIGIvZG9jL3ZiY2NjMTZ4LnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliZTc4ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy92YmNjYzE2eC50ZXhpCkBAIC0wLDAgKzEsMjU4IEBACitUaGlzIGNoYXB0ZXIgZG9jdW1lbnRzIHRoZSBCYWNrZW5kIGZvciB0aGUgYzE2eC9zdDEwIG1pY3JvY29udHJvbGxlciBmYW1pbHkuCisKK0BzZWN0aW9uIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgdGhpcyB2ZXJzaW9uCisKK1RoaXMgYmFja2VuZCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKKworQHRhYmxlIEBvcHRpb24KKworICAgIEBpdGVtIC1tZXJnZS1jb25zdGFudHMKKyAgICAgICAgICAgICAgICBQbGFjZSBpZGVudGljYWwgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzIGF0IHRoZSBzYW1lCisgICAgICAgICAgICAgICAgbWVtb3J5IGxvY2F0aW9uLiBUaGlzIGNhbiByZWR1Y2UgcHJvZ3JhbSBzaXplIGFuZCBpbmNyZWFzZQorICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uIHRpbWUuCisKKyAgICBAaXRlbSAtY29uc3QtaW4tZGF0YQorICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgY29uc3RhbnQgZGF0YSB3aWxsIGJlIHBsYWNlZCBpbiBhIHJlYWQtb25seQorICAgICAgICAgICAgICAgIHNlY3Rpb24uIFVzaW5nIHRoaXMgb3B0aW9uIGl0IHdpbGwgYmUgcGxhY2VkIGluIHRoZQorICAgICAgICAgICAgICAgIGRhdGEgc2VjdGlvbi4KKworICAgIEBpdGVtIC1uby1kZWxheWVkLXBvcHBpbmcKKyAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IGFyZ3VtZW50cyBvZiBmdW5jdGlvbiBjYWxscyBhcmUgbm90IGFsd2F5cyBwb3BwZWQKKyAgICAgICAgICAgICAgICBmcm9tIHRoZSBzdGFjayBpbW1lZGlhdGVseSBhZnRlciB0aGUgY2FsbCwgc28gdGhhdCB0aGUKKyAgICAgICAgICAgICAgICBhcmd1bWVudHMgb2Ygc2V2ZXJhbCBjYWxscyBtYXkgYmUgcG9wcGVkIGF0IG9uY2UuCisgICAgICAgICAgICAgICAgV2l0aCB0aGlzIG9wdGlvbiB2YmNjIGNhbiBiZSBmb3JjZWQgdG8gcG9wIHRoZW0gYWZ0ZXIgZXZlcnkKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiBjYWxsLgorICAgICAgICAgICAgICAgIFRoaXMgbWF5IHNpbXBsaWZ5IGRlYnVnZ2luZyBhbmQgdmVyeSBzbGlnaHRseSByZWR1Y2UgdGhlCisgICAgICAgICAgICAgICAgc3RhY2sgc2l6ZSBuZWVkZWQgYnkgdGhlIGNvbXBpbGVkIHByb2dyYW0uCisKKyAgICBAaXRlbSAtbm8tcGVlcGhvbGUKKyAgICAgICAgICAgICAgICBEbyBub3QgcGVyZm9ybSBwZWVwaG9sZS1vcHRpbWl6YXRpb25zLgorCisgICAgQGl0ZW0gLXRhc2tpbmcKKyAgICAgICAgICAgICAgICBQcm9kdWNlIG91dHB1dCBmb3IgdGhlIFRhc2tpbmcgYXNzZW1ibGVyLgorCisgICAgQGl0ZW0gLW10aW55CisgICAgICAgICAgICAgIEFzc3VtZSBhbGwgZnVuY3Rpb25zIGFyZSB3aXRoaW4gb25lIGNvZGUtc2VnbWVudC4KKyAgICAgICAgICAgICAgICBTaG9ydGVyIGluc3RydWN0aW9ucyBmb3IgY2FsbGluZyBmdW5jdGlvbnMgYXJlIHVzZWQgYW5kCisgICAgICAgICAgICAgICAgZnVuY3Rpb24tcG9pbnRlcnMgd2lsbCBiZSBvbmx5IDIgYnl0ZXMgbG9uZy4KKyAgICAgICAgICAgICAgICBUaGlzIHJlc3VsdHMgaW4gc2hvcnRlciBhbmQgZmFzdGVyIGNvZGUuCisKKyAgICBAaXRlbSAtbWxhcmdlCisgICAgICAgICAgICAgQWxsIG9iamVjdHMgd2hpY2ggYXJlIG5vdCBleHBsaWNpdGx5IHF1YWxpZmllZCBhcmUgYXNzdW1lZAorICAgICAgICAgICAgICAgIHRvIGJlIGZhciAoaS5lLiB0aGV5IG1heSBiZSBpbiBkaWZmZXJlbnQgc2VnbWVudHMgYnV0IG11c3QKKyAgICAgICAgICAgICAgICBub3QgY3Jvc3Mgb25lIHNlZ21lbnQtYm91bmRhcnkpLiBUaGUgZGVmYXVsdCBwb2ludGVyIHNpemUKKyAgICAgICAgICAgICAgICB3aWxsIGJlIDQuCisKKyAgICBAaXRlbSAtbWh1Z2UKKyAgICAgICAgICAgICAgQWxsIG9iamVjdHMgd2hpY2ggYXJlIG5vdCBleHBsaWNpdGx5IHF1YWxpZmllZCBhcmUgYXNzdW1lZAorICAgICAgICAgICAgICAgIHRvIGJlIGh1Z2UgKGkuZS4gdGhleSBtYXkgYmUgaW4gZGlmZmVyZW50IHNlZ21lbnRzIGFuZCBtYXkKKyAgICAgICAgICAgICAgICBjcm9zcyBzZWdtZW50LWJvdW5kYXJpZXMpLiBUaGUgZGVmYXVsdCBwb2ludGVyIHNpemUgd2lsbAorICAgICAgICAgICAgICAgIGJlIDQuCisKKyAgICBAaXRlbSAtaW50MzIKKyAgICAgICAgICAgICAgRG8gbm90IHVzZS4KK0BlbmQgdGFibGUKKworQHNlY3Rpb24gQUJJCisKKyAgICAgICAgVGhpcyBiYWNrZW5kIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcmVnaXN0ZXJzOgorCisgICAgICAgIEBpdGVtaXplIEBtaW51cworICAgICAgICBAaXRlbSBAY29kZXtSMH0gdGhyb3VnaCBAY29kZXtSMTV9IGZvciB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycworICAgICAgICBAZW5kIGl0ZW1pemUKKworICAgICAgICBBZGRpdGlvbmFsbHksIHRoZSByZWdpc3RlciBwYWlycworICAgICAgICBAY29kZXtSMi9SMywgUjMvUjQsIFI0L1I1LCBSNi9SNywgUjcvUjgsIFI4L1I5LCBSMTIvUjEzLCBSMTMvUjE0LH0KKyAgICAgICAgYW5kIEBjb2Rle1IxNS9SMTV9CisgICAgICAgIGFyZSBhdmFpbGFibGUuCisKKyAgICAgICAgQGNvZGV7UjEsIFIxMX0gYW5kIEBjb2Rle1IxMn0gYXJlIHJlc2VydmVkIGJ5IHRoZSBiYWNrZW5kLgorCisgICAgVGhlIGN1cnJlbnQgdmVyc2lvbiBnZW5lcmF0ZXMgYXNzZW1ibHkgb3V0cHV0IGZvciB1c2Ugd2l0aCB0aGUgdmFzbQorICAgIGFzc2VtYmxlci4gT3B0aW9uYWxseSwgYXNzZW1ibHkgY29kZSBmb3IgdGhlIFRhc2tpbmcKKyAgICBhc3NlbWJsZXIgY2FuIGJlIGdlbmVyYXRlZC4KKyAgICBUaGUgZGVmYXVsdCBtZW1vcnkgbW9kZWwgY29ycmVzcG9uZHMgdG8gdGhlIFRhc2tpbmcgc21hbGwtbWVtb3J5CisgICAgbW9kZWwgd2l0aCAxNmJpdCBkYXRhLXBvaW50ZXJzIGFuZCAzMmJpdCBmdW5jdGlvbi1wb2ludGVycy4KKyAgICBIb3dldmVyLCB0aGUgQGNvZGV7RFBQeH0gcmVnaXN0ZXJzIGhhdmUgdG8gYmUgc2V0IHVwIGluIGEgd2F5IHRvCisgICAgY3JlYXRlIGEgbGluZWFyIDE2Yml0IGFkZHJlc3Mgc3BhY2UgKGkuZS4gQGNvZGV7RFBQeD14fSkuCisgICAgVGhlIGdlbmVyYXRlZCBjb2RlIHNob3VsZCB3b3JrIG9uIHN5c3RlbXMgd2l0aCBjMTYxLCBjMTYzLCBjMTY0LCBjMTY1CisgICAgYW5kIGMxNjcgbWljcm9jb250cm9sbGVycyBhcyB3ZWxsIGFzIFNUMTAgZGVyaXZhdGVzLiBPbGQgdmVyc2lvbnMgbGlrZQorICAgIHRoZSBjMTY2IGFyZSBub3Qgc3VwcG9ydGVkCisKKyAgICBUaGUgcmVnaXN0ZXJzIEBjb2Rle1IxLVI1fSBhbmQgQGNvZGV7UjEwLVIxNX0gYXJlIHVzZWQgYXMgc2NyYXRjaCByZWdpc3RlcnMgKGkuZS4gdGhleQorICAgIGNhbiBiZSBkZXN0cm95ZWQgaW4gZnVuY3Rpb24gY2FsbHMpLCBhbGwgb3RoZXIgcmVnaXN0ZXJzIGFyZSBwcmVzZXJ2ZWQuCisKKyAgICBAY29kZXtSMH0gaXMgdXNlZCBhcyB1c2VyIHN0YWNrIHBvaW50ZXIuIEF1dG9tYXRpYyB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyaWVzCisgICAgYXJlIHB1dCBvbiB0aGUgdXNlciBzdGFjay4gUmV0dXJuIGFkZHJlc3NlcyBhcmUgcHVzaGVkIG9uIHRoZSBzeXN0ZW0KKyAgICBzdGFjay4KKworICAgIFRoZSBmaXJzdCA0IGZ1bmN0aW9uIGFyZ3VtZW50cyB3aGljaCBoYXZlIGludGVnZXIgb3IgcG9pbnRlciB0eXBlcworICAgIGFyZSBwYXNzZWQgaW4gcmVnaXN0ZXJzIEBjb2Rle1IxMn0gdGhyb3VnaCBAY29kZXtSMTV9LgorCisgICAgSW50ZWdlcnMgYW5kIHBvaW50ZXJzIGFyZSByZXR1cm5lZCBpbiBAY29kZXtSNC9SNX0uCisgICAgQWxsIG90aGVyIHR5cGVzIGFyZSByZXR1cm5lZCBieSBwYXNzaW5nIHRoZSBmdW5jdGlvbiB0aGUgYWRkcmVzcworICAgIG9mIHRoZSByZXN1bHQgYXMgYSBoaWRkZW4gYXJndW1lbnQgLSBzbyB3aGVuIHlvdSBjYWxsIHN1Y2ggYSBmdW5jdGlvbgorICAgIHdpdGhvdXQgYSBwcm9wZXIgZGVjbGFyYXRpb24gaW4gc2NvcGUgeW91IGNhbiBleHBlY3QgYSBjcmFzaC4KKworICAgIFRoZSBlbGVtZW50YXJ5IGRhdGEgdHlwZXMgYXJlIHJlcHJlc2VudGVkIGxpa2U6CisKKyAgICBAZXhhbXBsZQorICAgIHR5cGUgICAgICAgIHNpemUgaW4gYml0cyAgICAgICAgYWxpZ25tZW50IGluIGJ5dGVzCisKKyAgICBjaGFyICAgICAgICAgICAgICAgIDggICAgICAgICAgICAgICAgICAgICAgIDEgCisgICAgc2hvcnQgICAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgICAyIAorICAgIGludCAgICAgICAgICAgICAgICAxNiAgICAgICAgICAgICAgICAgICAgICAgMiAKKyAgICBsb25nICAgICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICAgICAgIDIgCisgICAgbG9uZyBsb25nICAgICAgICAgIG4vYSAgICAgICAgICAgICAgICAgICAgIG4vYSAKKyAgICBuZWFyIHBvaW50ZXJzICAgICAgMTYgICAgICAgICAgICAgICAgICAgICAgIDIKKyAgICBmYXIgcG9pbnRlcnMgICAgICAgMzIgICAgICAgICAgICAgICAgICAgICAgIDIKKyAgICBodWdlIHBvaW50ZXJzICAgICAgMzIgICAgICAgICAgICAgICAgICAgICAgIDIKKyAgICBmbG9hdCAgICAgICAgICAgICAgbi9hICAgICAgICAgICAgICAgICAgICAgbi9hCisgICAgZG91YmxlICAgICAgICAgICAgIG4vYSAgICAgICAgICAgICAgICAgICAgIG4vYQorICAgIEBlbmQgZXhhbXBsZQorCisKK0BzZWN0aW9uIFRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZS1hdHRyaWJ1dGVzCisgCisgICAgVGhlIGMxNngtYmFja2VuZCBvZmZlcnMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZSBhdHRyaWJ1dGVzOgorCitAdGFibGUgQGNvZGUKKworICAgIEBpdGVtIF9faW50ZXJydXB0CisgICAgICAgICAgICAgICAgIFJldHVybiB3aXRoIHJmaSByYXRoZXIgdGhhbiBibHIuCisgICAgICAgICAgICAgICAgIEBjb2Rle01ETC9NREh9IHdpbGwgYmUgc2F2ZWQsIGhvd2V2ZXIgaXQgaXMgcmVjb21tZW5kZWQKKyAgICAgICAgICAgICAgICAgdG8gc3dpdGNoIHRvIGEgbmV3IHJlZ2lzdGVyIGJhbmsgYXMgdGhlIGdwcnMgYXJlCisgICAgICAgICAgICAgICAgIG5vdCBzYXZlZC4KKyAgICAgICAgICAgICAgICAgQWxzbywgQGNvZGV7RFBQMC1EUFAzfSBhcmUgbm90IHNhdmVkICh0aGUgY29tcGlsZXIgZG9lcyBub3QKKyAgICAgICAgICAgICAgICAgdXNlIHRoZW0pLgorCisgICAgQGl0ZW0gX19pbnRlcnJ1cHQoPHZlY3Rvcj4pCisgICAgICAgICAgICAgICAgTGlrZSBAY29kZXtfX2ludGVycnVwdH0sIGJ1dCBhbHNvIHBsYWNlcyBhIGp1bXAtaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgICAgICB0byB0aGUgaW50ZXJydXB0IHNlcnZpY2UgYXQgdGhlIGNvcnJlc3BvbmRpbmcgdmVjdG9yIHRhYmxlCisgICAgICAgICAgICAgICAgYWRkcmVzcyAobmVlZHMgc3VwcG9ydCBmcm9tIGxpYnJhcnkgYW5kIGxpbmtlciBmaWxlKS4KKworICAgIEBpdGVtIF9fc2VjdGlvbig8bmFtZT4pCisgICAgICAgICAgICAgICAgIFBsYWNlIHRoaXMgb2JqZWN0L2Z1bmN0aW9uIGluIHNlY3Rpb24gPG5hbWU+LgorCisgICAgQGl0ZW0gX19yYmFuayg8YmFuaz4pCisgICAgICAgICAgICAgICAgIFN3aXRjaCB0byBhbm90aGVyIHJlZ2lzdGVyLWJhbmsgZm9yIHRoaXMgZnVuY3Rpb24uCitAZW5kIHRhYmxlCisKKworQHNlY3Rpb24gVGFyZ2V0LXNwZWNpZmljIHR5cGUtYXR0cmlidXRlcworIAorICAgIFRoZSBjMTZ4LWJhY2tlbmQgb2ZmZXJzIHRoZSBmb2xsb3dpbmcgdHlwZSBhdHRyaWJ1dGVzOgorCitAdGFibGUgQGNvZGUKKyAgICBAaXRlbSBfX25lYXIKKyAgICAgICAgICBPYmplY3QgcmVzaWRlcyB3aXRoaW4gdGhlIHNhbWUgc2VnbWVudC4KKworICAgIEBpdGVtIF9fZmFyCisgICAgICAgICAgIE9iamVjdCBtYXkgcmVzaWRlIGluIGEgZGlmZmVyZW50IHNlZ21lbnQsIGJ1dCBkb2VzIG5vdCBjcm9zcworICAgICAgICAgICAgIGEgc2VnbWVudC1ib3VuZGFyeS4KKworICAgIEBpdGVtIF9faHVnZQorICAgICAgICAgIE9iamVjdCBtYXkgcmVzaWRlIGluIGEgZGlmZmVyZW50IHNlZ21lbnQgYW5kIG1heSBjcm9zcyBhCisgICAgICAgICAgICAgc2VnbWVudC1ib3VuZGFyeQorCisgICAgIEBpdGVtIF9fc2VjdGlvbig8bmFtZT4pCisgICAgICAgICAgIFBsYWNlIHRoaXMgZnVuY3Rpb24gb3Igb2JqZWN0IGluIHNlY3Rpb24gPG5hbWU+LgorCisgICAgIEBpdGVtIF9fc2ZyKDxhZGRyPikKKyAgICAgICAgICAgVXNlZCB0byBkZWNsYXJlIGEgc3BlY2lhbCBmdW5jdGlvbiByZWdpc3RlciBhdCA8YWRkcj4uCisKKyBFeGFtcGxlOgorIEBleGFtcGxlCisgICAgICAgICBfX3NmcigweGZmMTApIHZvbGF0aWxlIHVuc2lnbmVkIGludCBQU1c7CisgQGVuZCBleGFtcGxlCisKKyAgICAgQGl0ZW0gX19lc2ZyKDxhZGRyPikKKyAgICAgICAgICAgVGhlIHNhbWUgZm9yIGV4dGVuZGVkIHNwZWNpYWwgZnVuY3Rpb24gcmVnaXN0ZXJzLgorCisgICAgIEBpdGVtIF9fc2ZyYml0KDxhZGRyPiw8Yml0PikKKyAgICAgICAgICAgRGVjbGFyZSBhIHNpbmdsZSBiaXQgaW4gdGhlIGJpdC1hZGRyZXNzYWJsZSBhcmVhLgorCisgRXhhbXBsZToKKyBAZXhhbXBsZQorICAgICAgICAgX19zZnIoMHhmZjEwLDExKSB2b2xhdGlsZSBfX2JpdCBJRU47CisgQGVuZCBleGFtcGxlCisKKyAgICAgQGl0ZW0gX19lc2ZyYml0KDxhZGRyPiw8Yml0PikKKyAgICAgICAgICAgVGhlIHNhbWUgZm9yIHRoZSBleHRlbmRlZCBiaXQtYWRkcmVzc2FibGUgYXJlYS4KKworQGVuZCB0YWJsZQorCitAc2VjdGlvbiBUYXJnZXQtc3BlY2lmaWMgdHlwZXMKKworICAgIFRoZSBjMTZ4LWJhY2tlbmQgb2ZmZXJzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCB0eXBlczoKKworQHRhYmxlIEBjb2RlCisgICAgQGl0ZW0gX19iaXQKKyAgICAgICAgICAgQSBzaW5nbGUgYml0IGluIHRoZSBiaXQtYWRkcmVzc2FibGUgaW50ZXJuYWwgUkFNLWFyZWEuCisgICAgICAgICAgICAgT25seSBzdGF0aWMgYW5kIGV4dGVybmFsIHZhcmlhYmxlcyBtYXkgdXNlIHRoaXMgdHlwZS4KKyAgICAgICAgICAgICBJdCBpcyBub3QgYWxsb3dlZCBmb3IgYXV0byBvciByZWdpc3RlciBzdG9yYWdlLWNsYXNzLgorICAgICAgICAgICAgIEFsc28sIGFycmF5cyBvZiBiaXRzLCBwb2ludGVycyB0byBiaXRzIG9yIGJpdHMgd2l0aGluCisgICAgICAgICAgICAgYWdncmVnYXRlcyBhcmUgbm90IGFsbG93ZWQuCisgICAgICAgICAgICAgQ29udmVyc2lvbiBvZiBhIGJpdCB0byBhbiBpbnRlZ3JhbCB0eXBlIHlpZWxkcyAwIGlmIHRoZQorICAgICAgICAgICAgIGJpdCBpcyBjbGVhcmVkIGFuZCAxIGlmIGl0IGlzIHNldC4uCisgICAgICAgICAgICAgQ29udmVyc2lvbiBvZiBhbiBpbnRlZ3JhbCB0eXBlIHRvIGEgYml0IGNsZWFycyB0aGUgYml0IGlmCisgICAgICAgICAgICAgdGhlIGludGVnZXIgaXMgZXF1YWwgdG8gMCBhbmQgc2V0cyBpdCBvdGhlcndpc2UuCitAZW5kIHRhYmxlCisKK0BzZWN0aW9uIFByZWRlZmluZWQgTWFjcm9zCisKKyAgICAgICAgVGhpcyBiYWNrZW5kIGRlZmluZXMgdGhlIGZvbGxvd2luZyBtYWNyb3M6CisKK0B0YWJsZSBAY29kZQorICAgICAgICBAaXRlbSBfX0MxNlhfXworICAgICAgICBAaXRlbSBfX0MxNjdfXworICAgICAgICBAaXRlbSBfX1NUMTBfXyAgICAgICAgCitAZW5kIHRhYmxlCisKKworCitAc2VjdGlvbiBTdGFjaworCisgICAgSWYgdGhlIEBvcHRpb257LXN0YWNrLWNoZWNrfSBvcHRpb24gaXMgdXNlZCwgZXZlcnkgZnVuY3Rpb24tcHJvbG9ndWUgd2lsbAorICAgIGNhbGwgdGhlIGZ1bmN0aW9uIEBjb2Rle19fc3RhY2tfY2hlY2t9IHdpdGggdGhlIHN0YWNrc2l6ZSBuZWVkZWQgYnkgdGhpcworICAgIGZ1bmN0aW9uIGluIHJlZ2lzdGVyIEBjb2Rle1IxfS4gVGhpcyBmdW5jdGlvbiBoYXMgdG8gY29uc2lkZXIgaXRzIG93bgorICAgIHN0YWNrc2l6ZSBhbmQgbXVzdCByZXN0b3JlIGFsbCByZWdpc3RlcnMuCisKKyAgICBPbmx5IHN0YWNrLWNoZWNraW5nIG9mIHRoZSB1c2VyLXN0YWNrIGlzIHN1cHBvcnRlZC4gQ2hlY2tpbmcgdGhlCisgICAgc3lzdGVtLXN0YWNrIGlzIHN1cHBvcnRlZCBieSBoYXJkd2FyZS4KKworCisKK0BzZWN0aW9uIFN0ZGFyZworCisgICAgQSBwb3NzaWJsZSA8c3RkYXJnLmg+IGNvdWxkIGxvb2sgbGlrZSB0aGlzOgorCitAZXhhbXBsZQorICAgIHR5cGVkZWYgY2hhciAqdmFfbGlzdDsKKworICAgIHZhX2xpc3QgX192YV9zdGFydCh2b2lkKTsKKworICAgICNkZWZpbmUgX192YV9yb3VuZGVkX3NpemUoX19UWVBFKSAgXAorICAgICAgKCgoc2l6ZW9mIChfX1RZUEUpICsgc2l6ZW9mIChpbnQpIC0gMSkgLyBzaXplb2YgKGludCkpICogc2l6ZW9mIChpbnQpKQorCisgICAgI2RlZmluZSB2YV9zdGFydChfX0FQLF9fTEEpIChfX0FQPV9fdmFfc3RhcnQoKSkKKworICAgICNkZWZpbmUgdmFfYXJnKF9fQVAsIF9fVFlQRSkgXAorICAgICAoX19BUCA9ICgoY2hhciAqKSAoX19BUCkgKyBfX3ZhX3JvdW5kZWRfc2l6ZSAoX19UWVBFKSksICAgICBcCisgICAgICAqKChfX1RZUEUgKikoKF9fQVApIC0gX192YV9yb3VuZGVkX3NpemUgKF9fVFlQRSkpKSkKKyAKKyAgICAjZGVmaW5lIHZhX2VuZChfX0FQKSAoKF9fQVApID0gMCkKK0BlbmQgZXhhbXBsZQorCisKK0BzZWN0aW9uIEtub3duIFByb2JsZW1zCisKK0BpdGVtaXplIEBtaW51cworICAgIEBpdGVtIG5vIGZsb2F0aW5nLXBvaW50CisgICAgQGl0ZW0gaHVnZS1wb2ludGVycyBhcmUgc29tZXRpbWVzIGRlcmZlcmVuY2VkIGFzIGZhci1wb2ludGVycworICAgIEBpdGVtIGFkZHJlc3NpbmctbW9kZXMgc29tZXRpbWVzIGlnbm9yZSBodWdlCisgICAgQGl0ZW0gaW5pdGlhbGl6ZWQgZGF0YSBpcyBwbGFjZWQgaW4gUkFNLCBiaXRzIGFyZSBub3QgaW5pdGlhbGl6ZWQKKyAgICBAaXRlbSBzdHJ1Y3QtY29weSBvbmx5IHdvcmtzIHdpdGggbmVhci1wb2ludGVycworICAgIEBpdGVtIG5lYXIvZmFyLWNvbnZlcnNpb24gYXNzdW1lcyBEUFAwLURQUDMgbGluZWFyCitAZW5kIGl0ZW1pemUKKwpkaWZmIC0tZ2l0IGEvZG9jL3ZiY2NoYzEyLnRleGkgYi9kb2MvdmJjY2hjMTIudGV4aQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jODkyMjRiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3ZiY2NoYzEyLnRleGkKQEAgLTAsMCArMSwxNjMgQEAKK1RoaXMgY2hhcHRlciBkb2N1bWVudHMgdGhlIEJhY2tlbmQgZm9yIHRoZSA2OGhjMTIgYW5kIDY4MDkvNjMwOSBtaWNyb2NvbnRyb2xsZXIgZmFtaWxpZXMuCisKK0BzZWN0aW9uIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgdGhpcyB2ZXJzaW9uCisKK1RoaXMgYmFja2VuZCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKKworQHRhYmxlIEBvcHRpb24KKworICAgIEBpdGVtIC1tZXJnZS1jb25zdGFudHMKKyAgICAgICAgICAgICAgICBQbGFjZSBpZGVudGljYWwgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzIGF0IHRoZSBzYW1lCisgICAgICAgICAgICAgICAgbWVtb3J5IGxvY2F0aW9uLiBUaGlzIGNhbiByZWR1Y2UgcHJvZ3JhbSBzaXplIGFuZCBpbmNyZWFzZQorICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uIHRpbWUuIChObyBmcCBzdXBwb3J0IHlldC4pCisKKyAgICBAaXRlbSAtY29uc3QtaW4tZGF0YQorICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgY29uc3RhbnQgZGF0YSB3aWxsIGJlIHBsYWNlZCBpbiBhIHJlYWQtb25seQorICAgICAgICAgICAgICAgIHNlY3Rpb24uIFVzaW5nIHRoaXMgb3B0aW9uIGl0IHdpbGwgYmUgcGxhY2VkIGluIHRoZQorICAgICAgICAgICAgICAgIGRhdGEgc2VjdGlvbi4KKworICAgIEBpdGVtIC1uby1kZWxheWVkLXBvcHBpbmcKKyAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IGFyZ3VtZW50cyBvZiBmdW5jdGlvbiBjYWxscyBhcmUgbm90IGFsd2F5cyBwb3BwZWQKKyAgICAgICAgICAgICAgICBmcm9tIHRoZSBzdGFjayBpbW1lZGlhdGVseSBhZnRlciB0aGUgY2FsbCwgc28gdGhhdCB0aGUKKyAgICAgICAgICAgICAgICBhcmd1bWVudHMgb2Ygc2V2ZXJhbCBjYWxscyBtYXkgYmUgcG9wcGVkIGF0IG9uY2UuCisgICAgICAgICAgICAgICAgV2l0aCB0aGlzIG9wdGlvbiB2YmNjIGNhbiBiZSBmb3JjZWQgdG8gcG9wIHRoZW0gYWZ0ZXIgZXZlcnkKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiBjYWxsLgorICAgICAgICAgICAgICAgIFRoaXMgbWF5IHNpbXBsaWZ5IGRlYnVnZ2luZyBhbmQgdmVyeSBzbGlnaHRseSByZWR1Y2UgdGhlCisgICAgICAgICAgICAgICAgc3RhY2sgc2l6ZSBuZWVkZWQgYnkgdGhlIGNvbXBpbGVkIHByb2dyYW0uCisKKyAgICBAaXRlbSAtbm8tcGVlcGhvbGUKKyAgICAgICAgICAgICAgICBEbyBub3QgcGVyZm9ybSBwZWVwaG9sZS1vcHRpbWl6YXRpb25zLgorCisgICAgQGl0ZW0gLW1lbS1jc2UKKyAgICAgICAgICAgICAgICBUcnkgdG8gaG9sZCB2YWx1ZXMgbG9hZGVkIGZyb20gbWVtb3J5IGluIHJlZ2lzdGVycyBhbmQKKyAgICAgICAgICAgICAgICByZXVzZSB0aGVtLiBEdWUgdG8gdGhlIHNtYWxsIHJlZ2lzdGVyLXNldCBvZiB0aGUgaGMxMgorICAgICAgICAgICAgICAgIHRoaXMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhcyBpdCBpbmNyZWFzZXMgcmVnaXN0ZXItCisgICAgICAgICAgICAgICAgcHJlc3N1cmUgYW5kIHRlbmRzIHRvIHNwaWxsIHRvIHRoZSBzdGFjay4KKworICAgIEBpdGVtIC1jcHU9PG4+CisgICAgICAgICAgICAgICAgU3BlY2lmeSB0aGUgcHJvY2Vzc29yIGZhbWlseS4gQ3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgYXJlOgorQGl0ZW1pemUKK0BpdGVtIDY4MTI6IEdlbmVyYXRlIGNvZGUgZm9yIHRoZSBNb3Rvcm9sYSA2OGhjMTIgc2VyaWVzIChkZWZhdWx0KS4KKworQGl0ZW0gNjgwOTogR2VuZXJhdGUgY29kZSBmb3IgdGhlIE1vdG9yb2xhIDY4MDkgc2VyaWVzLgorCitAaXRlbSA2MzA5OiBHZW5lcmF0ZSBjb2RlIGZvciB0aGUgSGl0YWNoaSA2MzA5IHNlcmllcyAoY3VycmVudGx5IGlkZW50aWNhbCB0byA2ODA5KS4KK0BlbmQgaXRlbWl6ZQorCisKKyAgICAgQGl0ZW0gLWFjYy1nbG9iCisgICAgICAgICAgICAgICAgTWFrZSB0aGUgYWNjdW11bGF0b3IgYXZhaWxhYmxlIGZvciBnbG9iYWwgcmVnaXN0ZXIgYWxsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCB0aGUgYWNjdW11bGF0b3Igd2lsbCBvbmx5IGJlIHVzZWQgZm9yIHJlZ2lzdGVyIGFsbG9jYXRpb24KKyAgICAgICAgICAgICAgICB3aXRoaW4gYmFzaWMgYmxvY2tzLiBJbiBtYW55IGNhc2VzLCBnbG9iYWwgYWxsb2NhdGlvbiB3aWxsIHJlc3VsdCBpbgorICAgICAgICAgICAgICAgIHdvcnNlIGNvZGUsIGJlY2F1c2UgdGhlIGFjY3VtdWxhdG9yIGhhcyB0byBiZSBwdXNoZWQvcG9wcGVkIG1hbnkgdGltZXMuCisKKyAgICAgQGl0ZW0gLXBjcmVsCisgICAgICAgICAgICAgICAgR2VuZXJhdGUgUEMtcmVsYXRpdmUgY29kZS4gTWF5IG5vdCBmdWxseSB3b3JrIHdpdGggNjhoYzEyLgorCisgICAgIEBpdGVtIC1kcmVsCisgICAgICAgICAgICAgICAgR2VuZXJhdGUgY29kZSB0aGF0IGFjY2Vzc2VzIGRhdGEgcmVsYXRpdmUgdG8gcmVnaXN0ZXIgQGNvZGV7dX0uIERvZXMgbm90CisgICAgICAgICAgICAgICAgd29yayB3aXRoIDY4aGMxMi4KKworQGVuZCB0YWJsZQorCitAc2VjdGlvbiBBQkkKKworICAgIFRoZSBjdXJyZW50IHZlcnNpb24gZ2VuZXJhdGVzIGFzc2VtYmx5IG91dHB1dCBmb3IgdXNlIHdpdGggdmFzbTY4MDlfc3RkIG9yIHRoZSBHTlUKKyAgICBhc3NlbWJsZXIgdXNpbmcgdGhlIG5vbi1iYW5rZWQgbW9kZWwuCisKKyAgICAgICAgVGhpcyBiYWNrZW5kIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcmVnaXN0ZXJzOgorCisgICAgICAgIEBpdGVtaXplIEBtaW51cworICAgICAgICBAaXRlbSBAY29kZXtkfSAgZm9yIHRoZSBhY2N1bXVsYXRvciAoYWxzbyB1c2VkIGZvciBieXRlLCBpLmUuIEBjb2Rle2J9KQorICAgICAgICBAaXRlbSBAY29kZXt4fSAgZm9yIGluZGV4IHJlZ2lzdGVyIHgKKyAgICAgICAgQGl0ZW0gQGNvZGV7eX0gIGZvciBpbmRleCByZWdpc3RlciB5CisgICAgICAgIEBpdGVtIEBjb2Rle3V9ICBmb3IgaW5kZXggcmVnaXN0ZXIgdSAobm90IG9uIDY4aGMxMikKKyAgICAgICAgQGl0ZW0gQGNvZGV7c3B9IGZvciB0aGUgc3RhY2stcG9pbnRlcgorICAgICAgICBAZW5kIGl0ZW1pemUKKworICAgIFRoZSBhY2N1bXVsYXRvciBhbmQgQGNvZGV7eH0gYXJlIGNhbGxlci1zYXZlLiBUaGUgQGNvZGV7eX0gcmVnaXN0ZXIgaXMgY2FsbGVlLXNhdmUuCisgICAgVGhlIEBjb2Rle3V9IHJlZ2lzdGVyIGlzIHVzZWQgYXMgZGF0YS1wYWdlIHBvaW50ZXIgd2l0aCBAY29kZXstZHJlbH0uCisKKyAgICBUaGUgZmlyc3QgZnVuY3Rpb24gYXJndW1lbnQgd2hpY2ggaGFzIGludGVnZXIgb3IgcG9pbnRlciB0eXBlIHVwIHRvIDE2IGJpdHMKKyAgICBpcyBwYXNzZWQgaW4gdGhlIGFjY3VtdWxhdG9yIEBjb2Rle2R9LgorICAgIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSBwYXNzZWQgb24gdGhlIHN0YWNrLgorCisgICAgSW50ZWdlcnMgYW5kIHBvaW50ZXJzIGFyZSByZXR1cm5lZCBpbiBAY29kZXtkfSBvciBAY29kZXtkL3h9IChAY29kZXt4fSBjb250YWlucyB0aGUgaGlnaGVyIGJpdHMpLgorICAgIEFsbCBvdGhlciB0eXBlcyBhcmUgcmV0dXJuZWQgYnkgcGFzc2luZyB0aGUgZnVuY3Rpb24gdGhlIGFkZHJlc3MKKyAgICBvZiB0aGUgcmVzdWx0IGFzIGEgaGlkZGVuIGFyZ3VtZW50IC0gc28gd2hlbiB5b3UgY2FsbCBzdWNoIGEgZnVuY3Rpb24KKyAgICB3aXRob3V0IGEgcHJvcGVyIGRlY2xhcmF0aW9uIGluIHNjb3BlIHlvdSBjYW4gZXhwZWN0IGEgY3Jhc2guCisKKyAgICBUaGUgZWxlbWVudGFyeSBkYXRhIHR5cGVzIGFyZSByZXByZXNlbnRlZCBsaWtlOgorQGV4YW1wbGUKKyAgICB0eXBlICAgICAgICBzaXplIGluIGJpdHMgICAgICAgIGFsaWdubWVudCBpbiBieXRlcworCisgICAgY2hhciAgICAgICAgICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgICAxCisgICAgc2hvcnQgICAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgICAxCisgICAgaW50ICAgICAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgICAxCisgICAgbG9uZyAgICAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICAxIAorICAgIG5lYXIgcG9pbnRlcnMgICAgICAxNiAgICAgICAgICAgICAgICAgICAgICAgMQorICAgIGZhciBwb2ludGVycyAgICAgICAyNCAgICAgICAgICAgICAgICAgICAgICAgMSAobm90IHlldCkKKyAgICBodWdlIHBvaW50ZXJzICAgICAgMjQgICAgICAgICAgICAgICAgICAgICAgIDEgKG5vdCB5ZXQpCisgICAgZmxvYXQgICAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICAxIChub3QgeWV0KQorICAgIGRvdWJsZSAgICAgICAgICAgICA2NCAgICAgICAgICAgICAgICAgICAgICAgMSAobm90IHlldCkKKyAgICBsb25nIGRvdWJsZSAgICAgICAgNjQgICAgICAgICAgICAgICAgICAgICAgIDEgKG5vdCB5ZXQpCitAZW5kIGV4YW1wbGUKKworCitAc2VjdGlvbiBUYXJnZXQtc3BlY2lmaWMgdmFyaWFibGUtYXR0cmlidXRlcworIAorICAgIFRoZSA2ODA5L2hjMTItYmFja2VuZCBvZmZlcnMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZSBhdHRyaWJ1dGVzOgorCitAdGFibGUgQGNvZGUgCisgICAgQGl0ZW0gX19pbnRlcnJ1cHQKKyAgICAgICAgIFJldHVybiB3aXRoIEBjb2Rle3J0aX0gcmF0aGVyIHRoYW4gQGNvZGV7cnRzfS4KKworICAgIEBpdGVtIF9fc2VjdGlvbigibmFtZSIsImF0dHIiKQorICAgICAgICAgICAgICAgICBQbGFjZSB0aGlzIGZ1bmN0aW9uL29iamVjdCBpbiBzZWN0aW9uICJzZWN0aW9uIgorICAgICAgICAgICAgICAgICB3aXRoIGF0dHJpYnV0ZXMgImF0dHIiLgorCisgICAgQGl0ZW0gX19kcGFnZQorICAgICAgICAgIFBsYWNlIHRoZSB2YXJpYWJsZSBpbiBzZWN0aW9uIEBjb2Rley5kcGFnZX0gYW5kIHVzZSBkaXJlY3QgYWRkcmVzc2luZy4KKworQGVuZCB0YWJsZQorCitAc2VjdGlvbiBQcmVkZWZpbmVkIE1hY3JvcworCisgICAgICAgIFRoaXMgYmFja2VuZCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgbWFjcm9zOgorCitAdGFibGUgQGNvZGUKKyAgICBAaXRlbSBfX0hDMTJfXworICAgICAgICAgICAgICAgIElmIGNvZGUgZm9yIDY4aGMxMiBpcyBnZW5lcmF0ZWQuCisKKyAgICBAaXRlbSBfXzY4MDlfXworICAgICAgICAgICAgICAgIElmIGNvZGUgZm9yIDY4MDkgaXMgZ2VuZXJhdGVkLgorCisgICAgQGl0ZW0gX182MzA5X18KKyAgICAgICAgICAgICAgICBJZiBjb2RlIGZvciA2MzA5IGlzIGdlbmVyYXRlZC4KK0AgICAgICAgIAorQGVuZCB0YWJsZQorCitAc2VjdGlvbiBTdGFjaworCisgICAgSWYgdGhlIEBvcHRpb257LXN0YWNrLWNoZWNrfSBvcHRpb24gaXMgdXNlZCwgZXZlcnkgZnVuY3Rpb24tcHJvbG9ndWUgd2lsbAorICAgIGNhbGwgdGhlIGZ1bmN0aW9uIEBjb2Rle19fc3RhY2tfY2hlY2t9IHdpdGggdGhlIHN0YWNrc2l6ZSBuZWVkZWQgYnkgdGhpcworICAgIGZ1bmN0aW9uIGluIHJlZ2lzdGVyIEBjb2Rle3l9LiBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjb25zaWRlciBpdHMgb3duCisgICAgc3RhY2tzaXplIGFuZCBtdXN0IHJlc3RvcmUgYWxsIHJlZ2lzdGVycy4KKworCitAc2VjdGlvbiBTdGRhcmcKKworCVN0ZGFyZyBpcyBzdXBwb3J0ZWQgYnkgdGhlIHByb3ZpZGVkIGluY2x1ZGUuCisKK0BzZWN0aW9uIEtub3duIFByb2JsZW1zCisKK0BpdGVtaXplIEBtaW51cworICAgIEBpdGVtIFN1cHBvcnQgZm9yIGZsb2F0aW5nIHBvaW50IGFuZCBsb25nIGxvbmcgaXMgc3RpbGwgbWlzc2luZy4KKyAgICBAaXRlbSBVIHJlZ2lzdGVyIGlzIG5vdCByZWFsbHkgdXNlZCB5ZXQuCisgICAgQGl0ZW0gTm8gc3VwcG9ydCBmb3IgNjMwOSBleHRlbnNpb25zIHlldC4KKyAgICBAaXRlbSBNYW55IG9wdGltaXphdGlvbnMgc3RpbGwgbWlzc2luZy4KKyAgICBAaXRlbSBTb21lIGNvZGUgZ2VuZXJhdGlvbiBidWdzIHRvIGJlIGZpeGVkLgorCitAZW5kIGl0ZW1pemUKKworCmRpZmYgLS1naXQgYS9kb2MvdmJjY2kzODYudGV4aSBiL2RvYy92YmNjaTM4Ni50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNkNzlkNzcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdmJjY2kzODYudGV4aQpAQCAtMCwwICsxLDEyMyBAQAorVGhpcyBjaGFwdGVyIGRvY3VtZW50cyB0aGUgQmFja2VuZCBmb3IgdGhlIEludGVsIGkzODYgcHJvY2Vzc29yIGZhbWlseS4KKworQHNlY3Rpb24gQWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGlzIHZlcnNpb24KKworVGhpcyBiYWNrZW5kIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgorCitAdGFibGUgQG9wdGlvbgorCisgICAgQGl0ZW0gLWxvbmdhbGlnbgorICAgICAgICAgICAgICAgICBBbGlnbiBtdWx0aWJ5dGUtdmFsdWVzIG9uIDQtYnl0ZS1ib3VuZGFyaWVzLiBOZWVkZWQgYnkgc29tZQorICAgICAgICAgICAgICAgIG9wZXJhdGluZyBzeXN0ZW1zLgorCisgICAgQGl0ZW0gLWVsZgorICAgICAgICAgICAgICAgRG8gbm90IHVzZSBhICdfJy1wcmVmaXggaW4gZnJvbnQgb2YgZXh0ZXJuYWwgaWRlbnRpZmllcnMuCisgICAgICAgICAgICAgICAgVXNlIGEgJy4nLXByZWZpeCBmb3IgbGFiZWwgbmFtZXMuCisKKyAgICBAaXRlbSAtbWVyZ2UtY29uc3RhbnRzCisgICAgICAgICAgICAgICAgUGxhY2UgaWRlbnRpY2FsIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cyBhdCB0aGUgc2FtZQorICAgICAgICAgICAgICAgIG1lbW9yeSBsb2NhdGlvbi4gVGhpcyBjYW4gcmVkdWNlIHByb2dyYW0gc2l6ZSBhbmQgaW5jcmVhc2UKKyAgICAgICAgICAgICAgICBjb21waWxhdGlvbiB0aW1lLgorCisgICAgQGl0ZW0gLWNvbnN0LWluLWRhdGEKKyAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IGNvbnN0YW50IGRhdGEgd2lsbCBiZSBwbGFjZWQgaW4gYSByZWFkLW9ubHkKKyAgICAgICAgICAgICAgICBzZWN0aW9uLiBVc2luZyB0aGlzIG9wdGlvbiBpdCB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgZGF0YSBzZWN0aW9uCisgICAgICAgICAgICAgICAgTm90ZSB0aGF0IG9uIG9wZXJhdGluZyBzeXN0ZW1zIHdpdGggbWVtb3J5IHByb3RlY3Rpb24gdGhpcworICAgICAgICAgICAgICAgIG9wdGlvbiB3aWxsIGRpc2FibGUgd3JpdGUtcHJvdGVjdGlvbiBvZiBjb25zdGFudCBkYXRhLgorCisgICAgQGl0ZW0gLW5vLWRlbGF5ZWQtcG9wcGluZworICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgYXJndW1lbnRzIG9mIGZ1bmN0aW9uIGNhbGxzIGFyZSBub3QgYWx3YXlzIHBvcHBlZAorICAgICAgICAgICAgICAgIGZyb20gdGhlIHN0YWNrIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjYWxsLCBzbyB0aGF0IHRoZQorICAgICAgICAgICAgICAgIGFyZ3VtZW50cyBvZiBzZXZlcmFsIGNhbGxzIG1heSBiZSBwb3BwZWQgYXQgb25jZS4KKyAgICAgICAgICAgICAgICBXaXRoIHRoaXMgb3B0aW9uIHZiY2MgY2FuIGJlIGZvcmNlZCB0byBwb3AgdGhlbSBhZnRlciBldmVyeQorICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGwuCisgICAgICAgICAgICAgICAgVGhpcyBtYXkgc2ltcGxpZnkgZGVidWdnaW5nIGFuZCB2ZXJ5IHNsaWdodGx5IHJlZHVjZSB0aGUKKyAgICAgICAgICAgICAgICBzdGFjayBzaXplIG5lZWRlZCBieSB0aGUgY29tcGlsZWQgcHJvZ3JhbS4KKworICAgIEBpdGVtIC1zYWZlLWZwIAorICAgICAgICAgICAgICAgIERvIG5vdCB1c2UgdGhlIGZsb2F0aW5nLXBvaW50LXN0YWNrIGZvciByZWdpc3RlciB2YXJpYWJsZXMuCisgICAgICAgICAgICAgICAgQXQgdGhlIG1vbWVudCB0aGlzIGlzIG5lY2Vzc2FyeSBhcyB2YmNjaTM4NiBzdGlsbCBoYXMgcHJvYmxlbXMKKyAgICAgICAgICAgICAgICBpbiBzb21lIGNhc2VzIG90aGVyd2lzZS4KK0BlbmQgdGFibGUKKworCitAc2VjdGlvbiBBQkkKKworICAgICAgICBUaGlzIGJhY2tlbmQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyByZWdpc3RlcnM6CisKKyAgICAgICAgQGl0ZW1pemUgQG1pbnVzCisgICAgICAgIEBpdGVtIEBjb2RleyVlYXgsICVlYngsICVlY3gsICVlZHh9CisgICAgICAgIEBpdGVtIEBjb2RleyVlc2ksICVlZGksICVlYnAsICVlc3B9CisgICAgICAgIEBlbmQgaXRlbWl6ZQorCisgICAgICAgIChBbmQgQGNvZGV7JXN0KDApLSVzdCg3KX0gZm9yIHRoZSBmbG9hdGluZyBwb2ludCBzdGFjayBidXQgdGhlc2UgbXVzdCBub3QKKyAgICAgICAgIGJlcyB1c2VkIGZvciByZWdpc3RlciB2YXJpYWJsZXMgYmVjYXVzZSB0aGV5IGNhbm5vdCBiZSBoYW5kbGVkIGxpa2UKKyAgICAgICAgIG5vcm1hbCByZWdpc3RlcnMuKQorCisgICAgVGhlIGN1cnJlbnQgdmVyc2lvbiBnZW5lcmF0ZXMgYXNzZW1ibHkgb3V0cHV0IGZvciB1c2Ugd2l0aCB0aGUgR05VCisgICAgYXNzZW1ibGVyLiBUaGUgZ2VuZXJhdGVkIGNvZGUgc2hvdWxkIHdvcmsgb24gc3lzdGVtcyB3aXRoIEludGVsIDgwMzg2CisgICAgb3IgaGlnaGVyIENQVXMgd2l0aCBGUFUgYW5kIGNvbXBhdGlibGUgY2hpcHMuCisKKyAgICBUaGUgcmVnaXN0ZXJzIEBjb2RleyVlYXgsICVlY3h9IGFuZCBAY29kZXslZWR4fSAoYXMgd2VsbCBhcyB0aGUgZmxvYXRpbmcgcG9pbnQgc3RhY2spCisgICAgYXJlIHVzZWQgYXMgc2NyYXRjaCByZWdpc3RlcnMgKGkuZS4gdGhleSBjYW4gYmUgZGVzdHJveWVkIGluIGZ1bmN0aW9uCisgICAgY2FsbHMpLCBhbGwgb3RoZXIgcmVnaXN0ZXJzIGFyZSBwcmVzZXJ2ZWQuCisKKyAgICBBbGwgZWxlbWVudGFyeSB0eXBlcyB1cCB0byA0IGJ5dGVzIGFyZSByZXR1cm5lZCBpbiByZWdpc3RlciBAY29kZXslZWF4fQorICAgIEZsb2F0aW5nIHBvaW50IHZhbHVlcyBhcmUgcmV0dXJuZWQgaW4gJXN0KDApLgorICAgIEFsbCBvdGhlciB0eXBlcyBhcmUgcmV0dXJuZWQgYnkgcGFzc2luZyB0aGUgZnVuY3Rpb24gdGhlIGFkZHJlc3MKKyAgICBvZiB0aGUgcmVzdWx0IGFzIGEgaGlkZGVuIGFyZ3VtZW50IC0gc28gd2hlbiB5b3UgY2FsbCBzdWNoIGEgZnVuY3Rpb24KKyAgICB3aXRob3V0IGEgcHJvcGVyIGRlY2xhcmF0aW9uIGluIHNjb3BlIHlvdSBjYW4gZXhwZWN0IGEgY3Jhc2guCisKKyAgICBAY29kZXt2YmNjfSB1c2VzIEBjb2RleyVlYXgsICVlYngsICVlY3gsICVlZHgsICVlc2ksICVlZGksICVlYnB9IGFuZCB0aGUgZmxvYXRpbmcgcG9pbnQKKyAgICBzdGFjayBmb3IgdGVtcG9yYXJ5IHJlc3VsdHMgYW5kIHJlZ2lzdGVyIHZhcmlhYmxlcy4gTG9jYWwgdmFyaWFibGVzCisgICAgYXJlIGNyZWF0ZWQgb24gdGhlIHN0YWNrIGFuZCBhZGRyZXNzZWQgdmlhIEBjb2RleyVlc3B9LgorCisgICAgVGhlIGVsZW1lbnRhcnkgZGF0YSB0eXBlcyBhcmUgcmVwcmVzZW50ZWQgbGlrZToKKworICAgIEBleGFtcGxlCisgICAgdHlwZSAgICAgICAgc2l6ZSBpbiBiaXRzICAgICAgICBhbGlnbm1lbnQgaW4gYnl0ZXMgKC1sb25nYWxpZ24pCisKKyAgICBjaGFyICAgICAgICAgICAgICAgIDggICAgICAgICAgICAgICAgICAgICAgIDEgKDEpCisgICAgc2hvcnQgICAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgICAyICg0KQorICAgIGludCAgICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgICAgMiAoNCkKKyAgICBsb25nICAgICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICAgICAgIDIgKDQpCisgICAgbG9uZyBsb25nICAgICAgICAgIG4vYSAgICAgICAgICAgICAgICAgICAgICBuL2EKKyAgICBhbGwgcG9pbnRlcnMgICAgICAgMzIgICAgICAgICAgICAgICAgICAgICAgIDIgKDQpCisgICAgZmxvYXQgICAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICAyICg0KQorICAgIGRvdWJsZSAgICAgICAgICAgICA2NCAgICAgICAgICAgICAgICAgICAgICAgMiAoNCkKKyAgICBAZW5kIGV4YW1wbGUKKworQHNlY3Rpb24gUHJlZGVmaW5lZCBNYWNyb3MKKworICAgICAgICBUaGlzIGJhY2tlbmQgZGVmaW5lcyB0aGUgZm9sbG93aW5nIG1hY3JvczoKKworQHRhYmxlIEBjb2RlCisgICAgICAgIEBpdGVtIF9fSTM4Nl9fCisgICAgICAgIEBpdGVtIF9fWDg2X18KKyAgICAgICAgCitAZW5kIHRhYmxlCisKKworQHNlY3Rpb24gU3RkYXJnCisKKyAgICBBIHBvc3NpYmxlIDxzdGRhcmcuaD4gY291bGQgbG9vayBsaWtlIHRoaXM6CisKK0BleGFtcGxlCisgICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICp2YV9saXN0OworCisgICAgI2RlZmluZSB2YV9zdGFydChhcCwgbGFzdGFyZykgKChhcCkgPSAodmFfbGlzdCkoJmxhc3RhcmcgKyAxKSkKKyAgICAjZGVmaW5lIHZhX2FyZyhhcCwgdHlwZSkgKChhcCkgKz0gXAorICAgICAgKHNpemVvZih0eXBlKTxzaXplb2YoaW50KT9zaXplb2YoaW50KTpzaXplb2YodHlwZSkpLCAoKHR5cGUgKikoYXApKVstMV0pCisgICAgI2RlZmluZSB2YV9lbmQoYXApICgoYXApID0gMEwpCitAZW5kIGV4YW1wbGUKKworCitAc2VjdGlvbiBLbm93biBQcm9ibGVtcworCitAaXRlbWl6ZSBAbWludXMKKyAgICBAaXRlbSBnZW5lcmF0ZWQgY29kZSBpcyByYXRoZXIgcG9vcgorICAgIEBpdGVtICBmdW5jdGlvbnMgd2hpY2ggcmV0dXJuIGZsb2F0aW5nLXBvaW50IHZhbHVlcyBzb21ldGltZXMgYXJlIGJyb2tlbig/KQorICAgIEBpdGVtICBpbiBzb21lIGNhc2VzIChzY2FyZSByZWdpc3RlcnMpIG5vbi1yZWVudHJhbnQgY29kZSBpcyBnZW5lcmF0ZWQKK0BlbmQgaXRlbWl6ZQorCisKZGlmZiAtLWdpdCBhL2RvYy92YmNjbTY4ay50ZXhpIGIvZG9jL3ZiY2NtNjhrLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk5OWY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy92YmNjbTY4ay50ZXhpCkBAIC0wLDAgKzEsNDc0IEBACitUaGlzIGNoYXB0ZXIgZG9jdW1lbnRzIHRoZSBiYWNrZW5kIGZvciB0aGUgTTY4ayBhbmQgQ29sZGZpcmUKK3Byb2Nlc3NvciBmYW1pbGllcy4KKworQHNlY3Rpb24gQWRkaXRpb25hbCBvcHRpb25zCisKK1RoaXMgYmFja2VuZCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKKworQHRhYmxlIEBvcHRpb24KKworICAgIEBpdGVtIC1hMnNjcmF0Y2gKKyAgICAgICAgICAgICAgQWxsb3cgdXNpbmcgQGNvZGV7QTJ9IGFzIHNjcmF0Y2ggcmVnaXN0ZXIuCisKKyAgICBAaXRlbSAtYW1pZ2Etc29mdGZsb2F0CisgICAgICAgICAgICAgIENhbGwgQW1pZ2FPUyBNYXRoSUVFRSBsaWJyYXJ5IGZ1bmN0aW9ucyB2aWEgZGlyZWN0IGlubGluZQorICAgICAgICAgICAgICBjb2RlLCBpbnN0ZWFkIG9mIGNhbGxsaW5nIHN0dWIgcm91dGluZXMgZnJvbSBAZmlsZXttaWVlZS5saWJ9LgorICAgICAgICAgICAgICBJdCBzdGlsbCByZXF1aXJlcyB0aGF0IHlvdSBlaXRoZXIgbGluayB3aXRoIEBmaWxle21pZWVlLmxpYn0gb3IKKyAgICAgICAgICAgICAgZGVmaW5lIEBjb2Rle01hdGhJZWVlU2luZ0Jhc0Jhc2V9LCBAY29kZXtNYXRoSWVlZURvdWJCYXNCYXNlfQorICAgICAgICAgICAgICBhbmQgQGNvZGV7TWF0aEllZWVEb3ViVHJhbnNCYXNlfSB5b3Vyc2VsZi4KKworICAgIEBpdGVtIC1jb25zZXJ2YXRpdmUtc3IKKyAgICAgICAgICAgICAgUmVzdHJpY3Qgc3RyZW5ndGgtcmVkdWN0aW9uLiBFeHBlcmltZW50YWwuCisKKyAgICBAaXRlbSAtY29uc3QtaW4tZGF0YQorICAgICAgICAgICAgICBCeSBkZWZhdWx0IGNvbnN0YW50IGRhdGEgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIGNvZGUKKyAgICAgICAgICAgICAgc2VjdGlvbiAoYW5kIHRoZXJlZm9yZSBpcyBhY2Nlc3NpYmxlIHdpdGggZmFzdGVyIHBjLXJlbGF0aXZlCisgICAgICAgICAgICAgIGFkZHJlc3NpbmcgbW9kZXMpLiBVc2luZyB0aGlzIG9wdGlvbiBpdCB3aWxsIGJlIHBsYWNlZCBpbiB0aGUKKyAgICAgICAgICAgICAgZGF0YSBzZWN0aW9uLgorCisgICAgICAgICAgICAgIFRoaXMgY291bGQgZS5nLiBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gdXNlIHNtYWxsIGRhdGEgYW5kCisgICAgICAgICAgICAgIHNtYWxsIGNvZGUsIGJ1dCB5b3VyIGNvZGUgZ2V0cyB0b28gYmlnIHdpdGggYWxsIHRoZSBjb25zdGFudAorICAgICAgICAgICAgICBkYXRhLgorCisgICAgICAgICAgICAgIE5vdGUgdGhhdCBvbiBvcGVyYXRpbmcgc3lzdGVtcyB3aXRoIG1lbW9yeSBwcm90ZWN0aW9uIHRoaXMKKyAgICAgICAgICAgICAgb3B0aW9uIHdpbGwgZGlzYWJsZSB3cml0ZS1wcm90ZWN0aW9uIG9mIGNvbnN0YW50IGRhdGEuCisKKyAgICBAaXRlbSAtY3B1PW4KKyAgICAgICAgICAgICAgR2VuZXJhdGUgY29kZSBmb3IgY3B1IG4gKGUuZy4gQG9wdGlvbnstY3B1PTY4MDIwfSksCisgICAgICAgICAgICAgIGRlZmF1bHRzIHRvIDY4MDAwLgorCisgICAgQGl0ZW0gLWQyc2NyYXRjaAorICAgICAgICAgICAgICBBbGxvdyB1c2luZyBAY29kZXtEMn0gYXMgc2NyYXRjaCByZWdpc3Rlci4KKworICAgIEBpdGVtIC1mYXN0Y2FsbAorICAgICAgICAgICAgICBQYXNzIGZ1bmN0aW9uIGFyZ3VtZW50cyBpbiB2b2xhdGlsZSByZWdpc3RlcnMsIHdoZW4gcG9zc2libGUuCisKKyAgICBAaXRlbSAtZnAyc2NyYXRjaAorICAgICAgICAgICAgICBBbGxvdyB1c2luZyBAY29kZXtGUDJ9IGFzIHNjcmF0Y2ggcmVnaXN0ZXIuCisKKyAgICBAaXRlbSAtZnB1PW4KKyAgICAgICAgICAgICAgR2VuZXJhdGUgY29kZSBmb3IgZnB1IG4gKGUuZy4gQG9wdGlvbnstZnB1PTY4ODgxfSksIGRlZmF1bHQ6IDAuCisKKyAgICBAaXRlbSAtZ2FzCisgICAgICAgICAgICAgIENyZWF0ZSBvdXRwdXQgc3VpdGFibGUgZm9yIHRoZSBHTlUgYXNzZW1ibGVyLgorCisgICAgQGl0ZW0gLWh1bmtkZWJ1ZworICAgICAgICAgICAgICBXaGVuIGNyZWF0aW5nIGRlYnVnLW91dHB1dCAoQG9wdGlvbnstZ30gb3B0aW9uKSBjcmVhdGUKKyAgICAgICAgICAgICAgQW1pZ2EgZGVidWcgaHVua3MgcmF0aGVyIHRoYW4gRFdBUkYyLgorICAgICAgICAgICAgICBEb2VzIG5vdCB3b3JrIHdpdGggQG9wdGlvbnstZ2FzfS4KKworICAgIEBpdGVtIC1uby1kZWxheWVkLXBvcHBpbmcKKyAgICAgICAgICAgICAgQnkgZGVmYXVsdCBhcmd1bWVudHMgb2YgZnVuY3Rpb24gY2FsbHMgYXJlIG5vdCBhbHdheXMgcG9wcGVkCisgICAgICAgICAgICAgIGZyb20gdGhlIHN0YWNrIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjYWxsLCBzbyB0aGF0IHRoZQorICAgICAgICAgICAgICBhcmd1bWVudHMgb2Ygc2V2ZXJhbCBjYWxscyBtYXkgYmUgcG9wcGVkIGF0IG9uY2UuCisgICAgICAgICAgICAgIFdpdGggdGhpcyBvcHRpb24gQGNvbW1hbmR7dmJjY30gY2FuIGJlIGZvcmNlZCB0byBwb3AgdGhlbSBhZnRlciBldmVyeQorICAgICAgICAgICAgICBmdW5jdGlvbiBjYWxsLgorICAgICAgICAgICAgICBUaGlzIG1heSBzaW1wbGlmeSBkZWJ1Z2dpbmcgYW5kIHJlZHVjZSB0aGUKKyAgICAgICAgICAgICAgc3RhY2sgc2l6ZSBuZWVkZWQgYnkgdGhlIGNvbXBpbGVkIHByb2dyYW0uCisKKyAgICBAaXRlbSAtbm8tZnAtcmV0dXJuCisKKyAgICAgICAgICAgICAgRG8gbm90IHJldHVybiBmbG9hdHMgYW5kIGRvdWJsZXMgaW4gZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXJzCisgICAgICAgICAgICAgIGV2ZW4gaWYgY29kZSBmb3IgYW4gZnB1IGlzIGdlbmVyYXRlZC4KKworICAgIEBpdGVtIC1uby1pbnR6CisgICAgICAgICAgICAgIFdoZW4gZ2VuZXJhdGluZyBjb2RlIGZvciBGUFUgZG8gcXVpY2smZGlydHkgY29udmVyc2lvbnMKKyAgICAgICAgICAgICAgZnJvbSBmbG9hdGluZy1wb2ludCB0byBpbnRlZ2VyLiBUaGUgY29kZSBtYXkgYmUgc29tZXdoYXQKKyAgICAgICAgICAgICAgZmFzdGVyIGJ1dCB3aWxsIG5vdCBjb3JyZWN0bHkgcm91bmQgdG8gemVyby4KKyAgICAgICAgICAgICAgT25seSB1c2UgaXQgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgorCisgICAgQGl0ZW0gLW5vLW1yZWctcmV0dXJuCisgICAgICAgICAgICAgIERvIG5vdCB1c2UgbXVsdGlwbGUgcmVnaXN0ZXJzIHRvIHJldHVybiB0eXBlcyB0aGF0IGRvIG5vdAorICAgICAgICAgICAgICBmaXQgaW50byBhIHNpbmdsZSByZWdpc3Rlci4gVGhpcyBpcyBtYWlubHkgZm9yIGJhY2t3YXJkcworICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5IHdpdGggY2VydGFpbiBsaWJyYXJpZXMuCisKKyAgICBAaXRlbSAtbm8tcGVlcGhvbGUKKyAgICAgICAgICAgICAgRG8gbm90IHBlcmZvcm0gcGVlcGhvbGUtb3B0aW1pemF0aW9ucy4KKworICAgIEBpdGVtIC1uby1yZXNlcnZlLXJlZ3MKKyAgICAgICAgICAgICAgRG8gbm90IHJlc2VydmUgdGVtcG9yYXJ5IHJlZ2lzdGVycyBmb3IgdGhlIGJhY2tlbmQuIENhbiBsZWFkIHRvCisgICAgICAgICAgICAgIHdvcnNlIGNvZGUgZ2VuZXJhdGlvbi4KKworICAgIEBpdGVtIC1vbGQtc29mdGZsb2F0CisgICAgICAgICAgICAgIFVzZSBvbGQgbGliY2FsbCBtZWNoYW5pc20gZm9yIHNvZnR3YXJlIGZsb2F0aW5nIHBvaW50LgorICAgICAgICAgICAgICBTaG91bGQgbm90IGJlIHVzZWQsIHdpbGwgdXN1YWxseSBnZW5lcmF0ZSB3b3JzZSBjb2RlLgorCisgICAgQGl0ZW0gLW9sZC1saWJjYWxscworICAgICAgICAgICAgICBVc2Ugb2xkIGxpYmNhbGwgbWVjaGFuaXNtIGZvciAoc29tZSkgaW50ZWdlciBzdXBwb3J0IHJvdXRpbmVzLgorICAgICAgICAgICAgICBTaG91bGQgbm90IGJlIHVzZWQsIHdpbGwgdXN1YWxseSBnZW5lcmF0ZSB3b3JzZSBjb2RlLgorCisgICAgQGl0ZW0gLXBoeGFzcworICAgICAgICAgICAgICBHZW5lcmF0ZSBhc3NlbWJseSBvdXRwdXQgZm9yIHRoZSBQaHhBc3MgYXNzZW1ibGVyLgorCisgICAgQGl0ZW0gLXByb2YKKyAgICAgICAgICAgICAgSW5zZXJ0IGNvZGUgZm9yIHByb2ZpbGluZy4KKworICAgIEBpdGVtIC1zYworICAgICAgICAgICAgICBVc2Ugc21hbGwgY29kZSBtb2RlbCAoc2VlIGJlbG93KS4KKworICAgIEBpdGVtIC1zZAorICAgICAgICAgICAgICBVc2Ugc21hbGwgZGF0YSBtb2RlbCAoc2VlIGJlbG93KS4KKworICAgIEBpdGVtIC11c2UtY29tbW9ucworICAgICAgICAgICAgICBVc2UgcmVhbCBjb21tb24gc3ltYm9scyBpbnN0ZWFkIG9mIGJzcyBzeW1ib2xzIGZvcgorICAgICAgICAgICAgICBub24taW5pdGlhbGl6ZWQgZXh0ZXJuYWwgdmFyaWFibGVzLgorCisgICAgQGl0ZW0gLXVzZS1mcmFtZXBvaW50ZXIKKyAgICAgICAgICAgICAgQnkgZGVmYXVsdCBhdXRvbWF0aWMgdmFyaWFibGVzIGFyZSBhZGRyZXNzZWQgdGhyb3VnaCBhNworICAgICAgICAgICAgICBpbnN0ZWFkIG9mIGE1LiBUaGlzIGdlbmVyYXRlcyBzbGlnaHRseSBiZXR0ZXIgY29kZSwgYmVjYXVzZQorICAgICAgICAgICAgICB0aGUgZnVuY3Rpb24gZW50cnkgYW5kIGV4aXQgb3ZlcmhlYWQgaXMgcmVkdWNlZCBhbmQgYTUgY2FuIGJlCisgICAgICAgICAgICAgIHVzZWQgYXMgcmVnaXN0ZXIgdmFyaWFibGUgZXRjLgorCisgICAgICAgICAgICAgIEhvd2V2ZXIgdGhpcyBtYXkgYmUgYSBiaXQgY29uZnVzaW5nIHdoZW4gZGVidWdnaW5nIGFuZCB5b3UKKyAgICAgICAgICAgICAgY2FuIGZvcmNlIEBjb21tYW5ke3ZiY2N9IHRvIHVzZSBhNSBhcyBhIGZpeGVkIGZyYW1lcG9pbnRlci4KKworCisKKworQGVuZCB0YWJsZQorCitAc2VjdGlvbiBBQkkKKworICAgIFRoZSBjdXJyZW50IHZlcnNpb24gZ2VuZXJhdGVzIGFzc2VtYmxlciBvdXRwdXQgZm9yIHVzZSB3aXRoIHRoZQorICAgIEBjb21tYW5ke3Zhc21tNjhrX21vdH0uIE1vc3QgcGVlcGhvbGUgb3B0aW1pemF0aW9ucyBhcmUgZG9uZSBieSB0aGUKKyAgICBhc3NlbWJsZXIgc28gQGNvbW1hbmR7dmJjY30gb25seSBkb2VzIHNvbWUgdGhhdCB0aGUgYXNzZW1ibGVyIGNhbm5vdCBtYWtlLgorICAgIFRoZSBnZW5lcmF0ZWQgZXhlY3V0YWJsZXMgd2lsbCBwcm9iYWJseSBvbmx5IHdvcmsgd2l0aCBPUzIuMCBvciBoaWdoZXIuCisKKyAgICBXaXRoIEBvcHRpb257LWdhc30gYXNzZW1ibGVyIG91dHB1dCBzdWl0YWJsZSBmb3IgdGhlIEdOVSBhc3NlbWJsZXIgaXMgZ2VuZXJhdGVkCisgICAgKHRoZSB2ZXJzaW9uIG11c3QgdW5kZXJzdGFuZCB0aGUgTW90b3JvbGEgc3ludGF4IC0gc29tZSBvbGQgb25lcyBkbyBub3QpLgorICAgIFRoZSBvdXRwdXQgaXMgb25seSBzbGlnaHRseSBtb2RpZmllZCBmcm9tIHRoZSBAY29tbWFuZHt2YXNtfS1vdXRwdXQgYW5kIHdpbGwKKyAgICB0aGVyZWZvcmUgcmVzdWx0IGluIHdvcnNlIGNvZGUgb24gQGNvbW1hbmR7Z2FzfS4KKworICAgIFRoZSByZWdpc3RlciBuYW1lcyBwcm92aWRlZCBieSB0aGlzIGJhY2tlbmQgYXJlOgorCitAZXhhbXBsZQorICAgICAgICAgYTAsICBhMSwgIGEyLCAgYTMsICBhNCwgIGE1LCAgYTYsICBhNworICAgICAgICAgZDAsICBkMSwgIGQyLCAgZDMsICBkNCwgIGQ1LCAgZDYsICBkNworICAgICAgICBmcDAsIGZwMSwgZnAyLCBmcDMsIGZwNCwgZnA1LCBmcDYsIGZwNworQGVuZCBleGFtcGxlCisKKyAgICAgICAgVGhlIHJlZ2lzdGVycyBAY29kZXthMH0gLSBAY29kZXthN30gYXJlIHN1cHBvcnRlZCB0byBob2xkIHBvaW50ZXIKKyAgICAgICAgdHlwZXMuIEBjb2Rle2QwfSAtIEBjb2Rle2Q3fSBjYW4gYmUgdXNlZCBmb3IgaW50ZWdlcnMgdHlwZXMKKyAgICAgICAgZXhjbHVkaW5nIEBjb2Rle2xvbmcgbG9uZ30sIHBvaW50ZXJzIGFuZCBAY29kZXtmbG9hdH0gaWYgbm8KKyAgICAgICAgRlBVIGNvZGUgaXMgZ2VuZXJhdGVkLiBAY29kZXtmcDB9IC0gQGNvZGV7ZnA3fSBjYW4gYmUgdXNlZCBmb3IKKyAgICAgICAgYWxsIGZsb2F0aW5nIHBvaW50IHR5cGVzIGlmIEZQVSBjb2RlIGlzIGdlbmVyYXRlZC4KKworICAgICAgICBBZGRpdGlvbmFsbHkgdGhlIGZvbGxvd2luZyByZWdpc3RlciBwYWlycyBjYW4gYmUgdXNlZCBmb3IKKyAgICAgICAgQGNvZGV7bG9uZyBsb25nfToKKworQGV4YW1wbGUKKyAgICAgICAgZDAvZDEsIGQyL2QzLCBkNC9kNSwgZDYvZDcKK0BlbmQgZXhhbXBsZSAgICAgICAgCisKKyAgICBUaGUgcmVnaXN0ZXJzIEBjb2Rle2QwLCBkMSwgYTAsIGExLCBmcDB9IGFuZCBAY29kZXtmcDF9ICBhcmUgdXNlZCBhcyBzY3JhdGNoIHJlZ2lzdGVycworICAgIChpLmUuIHRoZXkgY2FuIGJlIGRlc3Ryb3llZCBpbiBmdW5jdGlvbiBjYWxscyksIGFsbCBvdGhlciByZWdpc3RlcnMgYXJlCisgICAgcHJlc2VydmVkLgorCisgICAgICAgIEJ5IGRlZmF1bHQsIGFsbCBmdW5jdGlvbiBhcmd1bWVudHMgYXJlIHBhc3NlZCBvbiB0aGUgc3RhY2suCisKKyAgICBBbGwgc2NhbGFyIHR5cGVzIHVwIHRvIDQgYnl0ZXMgYXJlIHJldHVybmVkIGluIHJlZ2lzdGVyIEBjb2Rle2QwfSwKKyAgICAgICAgQGNvZGV7bG9uZyBsb25nfSBpcyByZXR1cm5lZCBpbiBAY29kZXtkMC9kMX0uCisgICAgICAgIElmIGNvbXBpbGVkIGZvciBGUFUsIGZsb2F0aW5nIHBvaW50IHZhbHVlcyBhcmUgcmV0dXJuZWQgaW4KKyAgICBAY29kZXtmcDB9IHVubGVzcyBAb3B0aW9uey1uby1mcHJldHVybn0gaXMgc3BlY2lmaWVkLgorICAgIFR5cGVzIHdoaWNoIGFyZSA4LCAxMiBvciAxNiBieXRlcyBsYXJnZSB3aWxsIGJlIHJldHVybmVkIGluIHNldmVyYWwKKyAgICByZWdpc3RlcnMgKEBjb2Rle2QwL2QxL2EwL2ExfSkgdW5sZXNzIEBvcHRpb257LW5vLW1yZWctcmV0dXJufSBpcyBzcGVjaWZpZWQuCisgICAgQWxsIG90aGVyIHR5cGVzIGFyZSByZXR1cm5lZCBieSBwYXNzaW5nIHRoZSBmdW5jdGlvbiB0aGUgYWRkcmVzcworICAgIG9mIHRoZSByZXN1bHQgYXMgYSBoaWRkZW4gYXJndW1lbnQgLSBzdWNoIGEgZnVuY3Rpb24gbXVzdCBub3QgYmUgY2FsbGVkCisgICAgd2l0aG91dCBhIHByb3BlciBkZWNsYXJhdGlvbiBpbiBzY29wZS4KKworICAgIE9iamVjdHMgd2hpY2ggaGF2ZSBiZWVuIGNvbXBpbGVkIHdpdGggZGlmZmVyZW50IHNldHRpbmdzIG11c3Qgbm90IGJlCisgICAgICAgIGxpbmtlZCB0b2dldGhlci4KKworICAgICAgICBAY29kZXthN30gaXMgdXNlZCBhcyBzdGFjayBwb2ludGVyLiBJZiBAb3B0aW9uey1zZH0gaXMgdXNlZCwKKyAgICAgICAgQGNvZGV7YTR9IHdpbGwgYmUgdXNlZCBhcyBzbWFsbCBkYXRhIHBvaW50ZXIuIElmIAorICAgICAgICBAb3B0aW9uey11c2UtZnJhbWVwb2ludGVyfSBpcyB1c2VkLCBAY29kZXthNX0gd2lsbCBiZSB1c2VkIGFzCisgICAgICAgIGZyYW1lIHBvaW50ZXIuIEFsbCBvdGhlciByZWdpc3RlcnMgd2lsbCBiZSB1c2VkIGJ5IHRoZQorICAgICAgICByZWdpc3RlciBhbGxvY2F0b3IgYW5kIGNhbiBiZSB1c2VkIGZvciByZWdpc3RlciBwYXJhbWV0ZXJzLgorCisgICAgICAgIFRoZSBzaXplIG9mIHRoZSBzdGFjayBmcmFtZSBpcyBsaW1pdGVkIHRvIDMyS0IgZm9yIGVhcmx5IG1lbWJlcnMKKyAgICAgICAgb2YgdGhlIDY4MDAwIGZhbWlseSBwcmlvciB0byA2ODAyMC4KKworCitUaGUgYmFzaWMgZGF0YSB0eXBlcyBhcmUgcmVwcmVzZW50ZWQgbGlrZToKKworQGV4YW1wbGUKKyAgICB0eXBlICAgICAgICBzaXplIGluIGJpdHMgICAgICAgIGFsaWdubWVudCBpbiBieXRlcworCisgICAgY2hhciAgICAgICAgICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgICAxCisgICAgc2hvcnQgICAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgICAyCisgICAgaW50ICAgICAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICAyCisgICAgbG9uZyAgICAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICAyCisgICAgbG9uZyBsb25nICAgICAgICAgIDY0ICAgICAgICAgICAgICAgICAgICAgICAyCisgICAgYWxsIHBvaW50ZXJzICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICAyCisgICAgZmxvYXQoZnB1KSAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgIHNlZSBiZWxvdworICAgIGRvdWJsZShmcHUpICAgICAgICA2NCAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICBzZWUgYmVsb3cKKyAgICBsb25nIGRvdWJsZShmcHUpICAgNjQgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgc2VlIGJlbG93CitAZW5kIGV4YW1wbGUKKworCisKK0BzZWN0aW9uIFNtYWxsIGRhdGEKKworICAgIEBjb21tYW5ke3ZiY2N9IGNhbiBhY2Nlc3Mgc3RhdGljIGRhdGEgaW4gdHdvIHdheXMuIEJ5IGRlZmF1bHQgYWxsIHN1Y2ggZGF0YSB3aWxsCisgICAgYmUgYWNjZXNzZWQgd2l0aCBmdWxsIDMyYml0IGFkZHJlc3NlcyAobGFyZ2UgZGF0YSBtb2RlbCkuCisgICAgSG93ZXZlciB0aGVyZSBpcyBhIHNlY29uZCB3YXkuIFlvdSBjYW4gc2V0IHVwIGFuIGFkZHJlc3MgcmVnaXN0ZXIgCisgICAgICAgIChAY29kZXthNH0pCisgICAgdG8gcG9pbnQgaW50byB0aGUgZGF0YSBzZWdtZW50IGFuZCB0aGVuIGFkZHJlc3MgZGF0YSB3aXRoIGEgMTZiaXQKKyAgICBvZmZzZXQgdGhyb3VnaCB0aGlzIHJlZ2lzdGVyLgorCisgICAgVGhlIGFkdmFudGFnZXMgb2YgdGhlIHNtYWxsIGRhdGEgbW9kZWwgYXJlIHRoYXQgdGhlIHByb2dyYW0gd2lsbAorICAgIHVzdWFsbHkgYmUgc21hbGxlciAoYmVjYXVzZSB0aGUgMTZiaXQgb2Zmc2V0cyB1c2UgbGVzcyBzcGFjZSBhbmQgbm8KKyAgICByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGlzIG5lZWRlZCkgYW5kIGZhc3Rlci4KKworICAgIFRoZSBkaXNhZHZhbnRhZ2VzIGFyZSB0aGF0IG9uZSBhZGRyZXNzIHJlZ2lzdGVyIGNhbm5vdCBiZSB1c2VkIGJ5IHRoZQorICAgIGNvbXBpbGVyIGFuZCB0aGF0IGl0IGNhbiBvbmx5IGJlIHVzZWQgaWYgYWxsIHN0YXRpYyBkYXRhIG9jY3VwaWVzCisgICAgbGVzcyB0aGFuIDY0a2IuIEFsc28gb2JqZWN0IG1vZHVsZXMgYW5kIGxpYnJhcmllcyB0aGF0CisgICAgaGF2ZSBiZWVuIGNvbXBpbGVkIHdpdGggZGlmZmVyZW50IGRhdGEgbW9kZWxzIG11c3Qgbm90IGJlIG1peGVkCisgICAgKGl0IGlzIHBvc3NpYmxlIHRvIGNhbGwgZnVuY3Rpb25zCisgICAgY29tcGlsZWQgd2l0aCBsYXJnZSBkYXRhIG1vZGVsIGZyb20gb2JqZWN0IGZpbGVzIGNvbXBpbGVkIHdpdGggc21hbGwKKyAgICBkYXRhIG1vZGVsLCBidXQgbm90IHZpY2UgdmVyc2EgYW5kIG9ubHkgZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQgdGhhdAorICAgIHdheSAtIG90aGVyIGRhdGEgY2Fubm90IGJlIGFjY2Vzc2VkKS4KKworICAgIElmIHNtYWxsIGRhdGEgaXMgdXNlZCB3aXRoIGZ1bmN0aW9ucyB3aGljaCBhcmUgY2FsbGVkIGZyb20KKyAgICBmdW5jdGlvbnMgd2hpY2ggaGF2ZSBub3QgYmVlbiBjb21waWxlZCB3aXRoIEBjb21tYW5ke3ZiY2N9IG9yIHdpdGhvdXQgdGhlIHNtYWxsIGRhdGEKKyAgICBtb2RlbCB0aGVuIHRob3NlIGZ1bmN0aW9ucyBtdXN0IGJlIGRlY2xhcmVkIHdpdGggdGhlIEBjb2Rle19fc2F2ZWRzfSBhdHRyaWJ1dGUKKyAgICBvciBjYWxsIEBjb2Rle2dldGE0KCl9IGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgKGRvIG5vdCB1c2UKKyAgICBhdXRvbWF0aWMgaW5pdGlhbGl6YXRpb25zIHByaW9yIHRvIHRoZSBjYWxsIHRvIEBjb2Rle2dldGE0fSkuCisgICAgTm90ZSB0aGF0IEBjb2Rle2dldGE0KCl9IG11c3Qgbm90IGJlIGNhbGxlZCB0aHJvdWdoIGEgZnVuY3Rpb24gcG9pbnRlciEKKworCitAc2VjdGlvbiBTbWFsbCBjb2RlCisKKyAgICBJbiB0aGUgc21hbGwgY29kZSBtb2RlbCBjYWxscyB0byBleHRlcm5hbCBmdW5jdGlvbnMgKGkuZS4gZnJvbQorICAgIGxpYnJhcmllcyBvciBvdGhlciBvYmplY3QgZmlsZXMpIGFyZSBkb25lIHdpdGggMTZiaXQgb2Zmc2V0cyB0aHJvdWdoCisgICAgdGhlIHByb2dyYW0gY291bnRlciByYXRoZXIgdGhhbiB3aXRoIGFic29sdXRlIDMyYml0IGFkZHJlc3Nlcy4KKworICAgIFRoZSBhZHZhbnRhZ2UgaXMgc2xpZ2h0bHkgc21hbGxlciBhbmQgZmFzdGVyIGNvZGUuCisgICAgVGhlIGRpc2FkdmFudGFnZXMgYXJlIHRoYXQgYWxsIHRoZSBjb2RlIChpbmNsdWRpbmcgbGlicmFyeSBmdW5jdGlvbnMpCisgICAgbXVzdCBiZSBzbWFsbCBlbm91Z2guIE9iamVjdHMvbGlicmFyaWVzIGNhbiBiZSBsaW5rZWQgdG9nZXRoZXIgaWYgdGhleQorICAgIGhhdmUgYmVlbiBjb21waWxlZCB3aXRoIGRpZmZlcmVudCBjb2RlIG1vZGVscy4KKworCitAc2VjdGlvbiBDUFVzCisKKyAgICBUaGUgdmFsdWVzIG9mIEBvcHRpb257LWNwdT1ufSBoYXZlIHRob3NlIGVmZmVjdHM6CisKK0B0YWJsZSBAb3B0aW9uCisKKyAgICBAaXRlbSBuPDY4MDAwICAgICAKKyAgICAgICAgQ29kZSBmb3IgdGhlIENvbGRmaXJlIGZhbWlseSBpcyBnZW5lcmF0ZWQuCisKKyAgICBAaXRlbSBuPj02ODAwMCAgICAKKyAgICAgICAgQ29kZSBmb3IgdGhlIDY4ayBmYW1pbHkgaXMgZ2VuZXJhdGVkLgorCisgICAgQGl0ZW0gbj49NjgwMjAKK0BpdGVtaXplIEBtaW51cworICAgQGl0ZW0gMzJiaXQgbXVsdGlwbGljYXRpb24vZGl2aXNpb24vbW9kdWxvIGlzIGRvbmUgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgIG11bD8ubCwgZGl2Py5sIGFuZCBkaXY/bC5sIGluc3RydWN0aW9ucy4KKyAgIEBpdGVtIHRzdC5sIGF4IGlzIHVzZWQuCisgICBAaXRlbSBleHRiLmwgZHggaXMgdXNlZC4KKyAgIEBpdGVtIDE2LzMyYml0IG9mZnNldHMgYXJlIHVzZWQgaW4gY2VydGFpbiBhZGRyZXNzaW5nIG1vZGVzLgorICAgQGl0ZW0gbGluay5sIGlzIHVzZWQuCisgICBAaXRlbSBBZGRyZXNzaW5nIG1vZGVzIHdpdGggc2NhbGluZyBhcmUgdXNlZC4KK0BlbmQgaXRlbWl6ZQorCisgICAgQGl0ZW0gbj09NjgwNDAKK0BpdGVtaXplIEBtaW51cworICAgQGl0ZW0gOGJpdCBjb25zdGFudHMgYXJlIG5vdCBjb3BpZWQgaW4gZGF0YSByZWdpc3RlcnMuCisgICBAaXRlbSBTdGF0aWMgbWVtb3J5IGlzIG5vdCBzdWJqZWN0IHRvIGNvbW1vbiBzdWJleHByZXNzaW9uIGVsaW1pbmF0aW9uLgorQGVuZCBpdGVtaXplCisKK0BlbmQgdGFibGUKKworCitAc2VjdGlvbiBGUFVzCisKKyAgICBBdCB0aGUgbW9tZW50IHRoZSB2YWx1ZXMgb2YgLWZwdT1uIGhhdmUgdGhvc2UgZWZmZWN0czoKKworQHRhYmxlIEBvcHRpb24KKyAgICBAaXRlbSBuPjY4MDAwICAgIAorICAgICAgICBGbG9hdGluZyBwb2ludCBjYWxjdWxhdGlvbnMgYXJlIGRvbmUgdXNpbmcgdGhlIEZQVS4KKyAgICBAaXRlbSBuPTY4MDQwCisgICAgQGl0ZW14IG49NjgwNjAgICAgCisgICAgICAgIEluc3RydWN0aW9ucyB0aGF0IGhhdmUgdG8gYmUgZW11bGF0ZWQgb24gdGhlc2UgRlBVcworICAgICAgICAgICAgICAgICAgd2lsbCBub3QgYmUgdXNlZDsgYXQgdGhlIG1vbWVudCB0aGlzIG9ubHkgaW5jbHVkZXMKKyAgICAgICAgICAgICAgICAgIHRoZSBAY29kZXtmaW50cnp9IGluc3RydWN0aW9uIGluIGNhc2Ugb2YgdGhlIDA0MC4KK0BlbmQgdGFibGUKKworQHNlY3Rpb24gTWF0aAorCisgICAgTG9uZyBtdWx0aXBseQorICAgIG9uIENQVXMgPDY4MDIwIHVzZXMgaW5saW5lIHJvdXRpbmVzLiBUaGlzIG1heSBpbmNyZWFzZSBjb2RlIHNpemUgYSBiaXQsCisgICAgYnV0IGl0IHNob3VsZCBiZSBzaWduaWZpY2FudGx5IGZhc3RlciwgYmVjYXVzZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkCisgICAgaXMgbm90IG5lY2Vzc2FyeS4gCisgICAgTG9uZyBkaXZpc2lvbiBhbmQgbW9kdWxvIGlzIGhhbmRsZWQgYnkgY2FsbHMgdG8gbGlicmFyeQorICAgIGZ1bmN0aW9ucy4KKyAgICAoU29tZSBvcGVyYXRpb25zIGludm9sdmluZyBjb25zdGFudHMgKGUuZy4gcG93ZXJzIG9mIHR3bykgYXJlIGFsd2F5cworICAgIGltcGxlbWVudGVkIGJ5IG1vcmUgZWZmaWNpZW50IGlubGluZSBjb2RlLikKKworICAgIElmIG5vIEZQVSBpcyBzcGVjaWZpZWQgZmxvYXRpbmcgcG9pbnQgbWF0aCBpcyBkb25lIHVzaW5nCisgICAgbWF0aCBsaWJyYXJpZXMuIDMyYml0IElFRUUgZm9ybWF0IGlzIHVzZWQgZm9yIGZsb2F0IGFuZCA2NGJpdCBJRUVFCisgICAgZm9yIGRvdWJsZSBhbmQgbG9uZyBkb3VibGUuCisKKyAgICBJZiBmbG9hdGluZyBwb2ludCBtYXRoIGlzIGRvbmUgd2l0aCB0aGUgRlBVCisgICAgZmxvYXRpbmcgcG9pbnQgdmFsdWVzIGFyZSBrZXB0IGluIHJlZ2lzdGVycyBhbmQgdGhlcmVmb3JlIG1heQorICAgIGhhdmUgZXh0ZW5kZWQgcHJlY2lzaW9uIHNvbWV0aW1lcy4gVGhpcyBpcyBub3QgQU5TSSBjb21wbGlhbnQgYnV0CisgICAgd2lsbCB1c3VhbGx5IGNhdXNlIG5vIGhhcm0uIFdoZW4gZmxvYXRpbmcgcG9pbnQgdmFsdWVzIGFyZSBzdG9yZWQgaW4KKyAgICBtZW1vcnkgdGhleSB1c2UgdGhlIHNhbWUgSUVFRSBmb3JtYXRzIGFzIHdpdGhvdXQgRlBVLgorICAgIFJldHVybiB2YWx1ZXMgYXJlIHBhc3NlZCBpbiBAY29kZXtmcDB9LgorCisgICAgTm90ZSB0aGF0IHlvdSBtdXN0IG5vdCBsaW5rIG9iamVjdCBmaWxlcyB0b2dldGhlciBpZiB0aGV5IHdlcmUgbm90CisgICAgY29tcGlsZWQgd2l0aCB0aGUgc2FtZSBAY29kZXstZnB1fSBzZXR0aW5ncyBhbmQgdGhhdAorICAgIGEgcHJvcGVyIG1hdGggbGlicmFyeSBtdXN0IGJlIGxpbmtlZC4KKworCitAc2VjdGlvbiBUYXJnZXQtU3BlY2lmaWMgVmFyaWFibGUgQXR0cmlidXRlcworCisgICAgVGhpcyBiYWNrZW5kIG9mZmVycyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlIGF0dHJpYnV0ZXM6CisKK0B0YWJsZSBAY29kZQorICAgIEBpdGVtIF9fYW1pZ2FpbnRlcnJ1cHQKKyAgICAgICAgICAgICAgICBVc2VkIHRvIHdyaXRlIGludGVycnVwdC1oYW5kbGVycyBmb3IgQW1pZ2FPUy4gU3RhY2stY2hlY2tpbmcKKyAgICAgICAgICAgICAgICBmb3IgYSBmdW5jdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHdpbGwgYmUgZGlzYWJsZWQgYW5kIGlmIGEgdmFsdWUKKyAgICAgICAgICAgICAgICBpcyByZXR1cm5lZCBpbiBkMCwgdGhlCisgICAgICAgICAgICAgICAgY29uZGl0aW9uIGNvZGVzIHdpbGwgYmUgc2V0IGFjY29yZGluZ2x5LgorCisgICAgQGl0ZW0gX19jaGlwCisgICAgICAgICAgICAgIFBsYWNlIHZhcmlhYmxlIGluIGNoaXAtbWVtb3J5LiBPbmx5IGFwcGxpY2FibGUgb24KKyAgICAgICAgICAgICAgICAgQW1pZ2FPUyB0byB2YXJpYWJsZXMgd2l0aCBzdGF0aWMgc3RvcmFnZS1kdXJhdGlvbi4KKworICAgIEBpdGVtIF9fZmFyCisgICAgICAgICAgICAgICBEbyBub3QgcGxhY2UgdGhpcyB2YXJpYWJsZSBpbiB0aGUgc21hbGwtZGF0YSBzZWdtZW50CisgICAgICAgICAgICAgICAgIGluIHNtYWxsIGRhdGEgbW9kZS4gTm8gZWZmZWN0IGluIGxhcmdlIGRhdGEgbW9kZS4KKyAgICAgICAgICAgICAgICAgT25seSBhcHBsaWNhYmxlIHRvIHZhcmlhYmxlcyB3aXRoIHN0YXRpYworICAgICAgICAgICAgICAgIHN0b3JhZ2UtZHVyYXRpb24uCisKKyAgICBAaXRlbSBfX2ludGVycnVwdAorICAgICAgICAgICAgICAgICBUaGlzIGlzIHVzZWQgdG8gZGVjbGFyZSBpbnRlcnJ1cHQtaGFuZGxlcnMuIFRoZQorICAgICAgICAgICAgICAgICBmdW5jdGlvbiB1c2luZyB0aGlzIGF0dHJpYnV0ZSB3aWxsIHNhdmUgYWxsIHJlZ2lzdGVycworICAgICAgICAgICAgICAgICBpdCBkZXN0cm95cyAoaW5jbHVkaW5nIHNjcmF0Y2gtcmVnaXN0ZXJzKSBhbmQgcmV0dXJuCisgICAgICAgICAgICAgICAgIHdpdGggQGNvZGV7cnRlfSByYXRoZXIgdGhhbiBAY29kZXtydHN9LgorCisgICAgQGl0ZW0gX19uZWFyCisgICAgICAgICAgICAgIEN1cnJlbnRseSBpZ25vcmVkLgorCisgICAgQGl0ZW0gX19yZWdhcmdzCisgICAgICAgICAgICBEZWNsYXJlIGZ1bmN0aW9uIHRvIHVzZSB0aGUgQG9wdGlvbnstZmFzdGNhbGx9IEFCSS4gVGhlCisgICAgICAgICAgICBmaXJzdCBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiB2b2xhdGlsZSByZWdpc3RlcnMuCisKKyAgICBAaXRlbSBfX3NhdmVkcworICAgICAgICAgICAgTG9hZCB0aGUgcG9pbnRlciB0byB0aGUgc21hbGwgZGF0YSBzZWdtZW50IGF0CisgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLWVudHJ5LiBBcHBsaWNhYmxlIG9ubHkgdG8gZnVuY3Rpb25zLgorCisgICAgQGl0ZW0gX19zZWN0aW9uKDxzdHJpbmctbGl0ZXJhbD4pCisgICAgICAgICAgICAgICAgIFBsYWNlcyB0aGUgdmFyaWFibGUvZnVuY3Rpb24gaW4gYSBzZWN0aW9uIG5hbWVkCisgICAgICAgICAgICAgICAgIGFjY29yZGluZyB0byB0aGUgYXJndW1lbnQuCisKKyAgICBAaXRlbSBfX3N0ZGFyZ3MKKyAgICAgICAgICAgIERlY2xhcmUgZnVuY3Rpb24gdG8gdXNlIHRoZSBzdGFuZGFyZCBBQkkgKGRlZmF1bHQpLAorICAgICAgICAgICAgd2hpY2ggcGFzc2VzIGFsbCBhcmd1bWVudHMgb24gdGhlIHN0YWNrLgorQGVuZCB0YWJsZQorCitAc2VjdGlvbiBUYXJnZXQtc3BlY2lmaWMgcHJhZ21hcworCisgICAgVGhpcyBiYWNrZW5kIG9mZmVycyB0aGUgZm9sbG93aW5nICNwcmFnbWFzOgorCitAdGFibGUgQGNvZGUKKworICAgIEBpdGVtICNwcmFnbWEgc3RkYXJncy1vbgorICAgICAgICAgIEF1dG9tYXRpY2FsbHkgZGVjbGFyZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB3aXRoIHRoZQorICAgICAgICAgIEBjb2Rle19fc3RkYXJnc30gYXR0cmlidXRlLgorCisgICAgQGl0ZW0gI3ByYWdtYSBzdGRhcmdzLW9mZgorICAgICAgICAgIFN0b3AgYXV0b21hdGljYWxseSBkZWNsYXJpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgd2l0aCB0aGUKKyAgICAgICAgICBAY29kZXtfX3N0ZGFyZ3N9IGF0dHJpYnV0ZS4KKworQGVuZCB0YWJsZQorCitAc2VjdGlvbiBQcmVkZWZpbmVkIE1hY3JvcworCisgICAgICAgIFRoaXMgYmFja2VuZCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgbWFjcm9zOgorCitAdGFibGUgQGNvZGUKKyAgICAgICAgQGl0ZW0gX19BTUlHQURBVEVfXworICAgICAgICAgICAgICAgIFRoaXMgaXMgc2V0IHRvIGN1cnJlbnQgZGF0ZSBhcyBAY29kZXsiKERELk1NLllZWVkpIn0sCisgICAgICAgICAgICAgICAgdXNlZnVsIHdpdGggdmVyc2lvbiBzdHJpbmdzLgorCisgICAgICAgIEBpdGVtIF9fQ09MREZJUkUKKyAgICAgICAgICAgICAgICAoSWYgYSBDb2xkZmlyZSBDUFUgaXMgc2VsZWN0ZWQuKQorICAgICAgICAKKyAgICAgICAgQGl0ZW0gX19JTlRTSVpFCisgICAgICAgICAgICAgICAgSXMgc2V0IHRvIHRoZSBzaXplIG9mIHRoZSBAY29kZXtpbnR9IHR5cGUuCisgICAgICAgICAgICAgICAgRWl0aGVyIDE2ICh2YmNjbTY4a3MpIG9yIDMyICh2YmNjbTY4aykuCisKKyAgICAgICAgQGl0ZW0gX19NNjgweDAKKyAgICAgICAgICAgICAgICAoRGVwZW5kaW5nIG9uIHRoZSBzZXR0aW5ncyBvZiBAb3B0aW9uey1jcHV9LCBlLmcuCisgICAgICAgICAgICAgICAgQGNvZGV7X19NNjgwMjB9LikKKworICAgICAgICBAaXRlbSBfX002ODg4MSAKKyAgICAgICAgICAgICAgICAoSWYgQG9wdGlvbnstZnB1PTY4ODgxfSBpcyBzZWxlY3RlZC4pCisKKyAgICAgICAgQGl0ZW0gX19NNjg4ODIKKyAgICAgICAgICAgICAgICAoSWYgY29kZSBmb3IgYW5vdGhlciBGUFUgaXMgc2VsZWN0ZWQ7CisgICAgICAgICAgICAgICAgQG9wdGlvbnstZnB1PTY4MDQwfSBvciBAb3B0aW9uey1mcHU9NjgwNjB9IHdpbGwKKyAgICAgICAgICAgICAgICBzZXQgQGNvZGV7X19NNjg4ODJ9LikKKworICAgICAgICBAaXRlbSBfX002OEtfXworCisgICAgICAgIEBpdGVtIF9fU01BTExfREFUQV9fCisgICAgICAgICAgICAgICAgKElmIEBvcHRpb257LXNkfSBpcyBzZWxlY3RlZCB0byBlbmFibGUgc21hbGwgZGF0YS4pCitAZW5kIHRhYmxlCisKKworQHNlY3Rpb24gU3RhY2sKKworICAgIElmIHRoZSBAb3B0aW9uey1zdGFjay1jaGVja30gb3B0aW9uIGlzIHVzZWQsIGV2ZXJ5IGZ1bmN0aW9uLXByb2xvZ3VlIHdpbGwKKyAgICBjYWxsIHRoZSBmdW5jdGlvbiBAY29kZXtfX3N0YWNrX2NoZWNrfSB3aXRoIHRoZSBzdGFja3NpemUgbmVlZGVkIGJ5IHRoZQorICAgIGN1cnJlbnQgZnVuY3Rpb24gb24gdGhlIHN0YWNrLiBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjb25zaWRlciBpdHMgb3duCisgICAgc3RhY2tzaXplIGFuZCBtdXN0IHJlc3RvcmUgYWxsIHJlZ2lzdGVycy4KKworICAgIElmIHRoZSBjb21waWxlciBpcyBhYmxlIHRvIGNhbGN1bGF0ZSB0aGUgbWF4aW11bSBzdGFjay1zaXplIG9mIGEKKyAgICBmdW5jdGlvbiBpbmNsdWRpbmcgYWxsIGNhbGxlZXMsIGl0IHdpbGwgYWRkIGEgY29tbWVudCBpbiB0aGUKKyAgICBnZW5lcmF0ZWQgYXNzZW1ibHktb3V0cHV0IChzdWJqZWN0IHRvIGNoYW5nZSB0byBsYWJlbHMpLgorCisKK0BzZWN0aW9uIFN0ZGFyZworCisgICAgQSBwb3NzaWJsZSBAZmlsZXs8c3RkYXJnLmg+fSBjb3VsZCBsb29rIGxpa2UgdGhpczoKKworQGV4YW1wbGUKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICp2YV9saXN0OworCisjZGVmaW5lIF9fdmFfYWxpZ24odHlwZSkgKF9fYWxpZ25vZih0eXBlKT49ND9fX2FsaWdub2YodHlwZSk6NCkKKworI2RlZmluZSBfX3ZhX2RvX2FsaWduKHZsLHR5cGUpICgodmwpPShjaGFyICopKCgoKHVuc2lnbmVkIGludCkodmwpKStfX3ZhX2FsaWduKHR5cGUpLTEpL19fdmFfYWxpZ24odHlwZSkqX192YV9hbGlnbih0eXBlKSkpCisKKyNkZWZpbmUgX192YV9tZW0odmwsdHlwZSkgKF9fdmFfZG9fYWxpZ24oKHZsKSx0eXBlKSwodmwpKz1zaXplb2YodHlwZSksKCh0eXBlKikodmwpKVstMV0pCisKKyNkZWZpbmUgdmFfc3RhcnQoYXAsIGxhc3RhcmcpICgoYXApPSh2YV9saXN0KSgmbGFzdGFyZysxKSkKKyAKKyNkZWZpbmUgdmFfYXJnKHZsLHR5cGUpIF9fdmFfbWVtKHZsLHR5cGUpCisgCisjZGVmaW5lIHZhX2VuZCh2bCkgKCh2bCk9MCkKKworI2RlZmluZSB2YV9jb3B5KG5ldyxvbGQpICgobmV3KT0ob2xkKSkKKworI2VuZGlmCisKKworQGVuZCBleGFtcGxlCisKK0BzZWN0aW9uIEtub3duIHByb2JsZW1zCisKK0BpdGVtaXplIEBtaW51cworICAgIEBpdGVtIFRoZSBleHRlbmRlZCBwcmVjaXNpb24gb2YgdGhlIEZQVSByZWdpc3RlcnMgY2FuIGNhdXNlIHByb2JsZW1zIGlmCisgICAgICBhIHByb2dyYW0gZGVwZW5kcyBvbiB0aGUgZXhhY3QgcHJlY2lzaW9uLiBNb3N0IHByb2dyYW1zIHdpbGwgbm90CisgICAgICBoYXZlIHRyb3VibGUgd2l0aCB0aGF0LCBidXQgcHJvZ3JhbXMgd2hpY2ggZG8gZXhhY3QgY29tcGFyaXNvbnMKKyAgICAgIHdpdGggZmxvYXRpbmcgcG9pbnQgdHlwZXMgKGUuZy4gdG8gdHJ5IHRvIGNhbGN1bGF0ZSB0aGUgbnVtYmVyCisgICAgICBvZiBzaWduaWZpY2FudCBiaXRzKSBtYXkgbm90IHdvcmsgYXMgZXhwZWN0ZWQgKGVzcGVjaWFsbHkgaWYgdGhlCisgICAgICBvcHRpbWl6ZXIgd2FzIHR1cm5lZCBvbikuCitAZW5kIGl0ZW1pemUKKworCisKZGlmZiAtLWdpdCBhL2RvYy92YmNjcHBjLnRleGkgYi9kb2MvdmJjY3BwYy50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkN2ZlM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdmJjY3BwYy50ZXhpCkBAIC0wLDAgKzEsMzQ5IEBACitUaGlzIGNoYXB0ZXIgZG9jdW1lbnRzIHRoZSBCYWNrZW5kIGZvciB0aGUgUG93ZXJQQyBwcm9jZXNzb3IgZmFtaWx5LgorCitAc2VjdGlvbiBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoaXMgdmVyc2lvbgorCitUaGlzIGJhY2tlbmQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnM6CisKK0B0YWJsZSBAb3B0aW9uCisKKyAgICBAaXRlbSAtYW1pZ2EtYWxpZ24KKworICAgICAgICAgICAgICAgIERvIG5vdCByZXF1aXJlIGFueSBhbGlnbm1lbnRzIGdyZWF0ZXIgdGhhbiAyIGJ5dGVzLgorICAgICAgICAgICAgICAgIFRoaXMgaXMgbmVlZGVkIHdoZW4gYWNjZXNzaW5nIEFtaWdhIHN5c3RlbS1zdHJ1Y3R1cmVzLCBidXQKKyAgICAgICAgICAgICAgICBjYW4gY2F1c2UgYSBwZXJmb3JtYW5jZSBwZW5hbHR5LgorCisgICAgQGl0ZW0gLWJhc2VyZWwzMm1vcworCisgICAgICAgICAgICAgICAgVXNlIDMyYml0IGJhc2UtcmVsYXRpdmUgYWRkcmVzc2luZyBhcyB1c2VkIGJ5IE1vcnBoT1MuCisKKyAgICBAaXRlbSAtYmFzZXJlbDMyb3M0CisKKyAgICAgICAgICAgICAgICBVc2UgMzJiaXQgYmFzZS1yZWxhdGl2ZSBhZGRyZXNzaW5nIGFzIHVzZWQgYnkgQW1pZ2FPUyA0LgorCisgICAgQGl0ZW0gLWNvbnN0LWluLWRhdGEKKworICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgY29uc3RhbnQgZGF0YSB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgQGNvZGV7LnJvZGF0YX0KKyAgICAgICAgICAgICAgICBzZWN0aW9uLiBVc2luZyB0aGlzIG9wdGlvbiBpdCB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgCisgICAgICAgICAgICAgICAgQGNvZGV7LmRhdGF9IHNlY3Rpb24uCisgICAgICAgICAgICAgICAgTm90ZSB0aGF0IG9uIG9wZXJhdGluZyBzeXN0ZW1zIHdpdGggbWVtb3J5IHByb3RlY3Rpb24gdGhpcworICAgICAgICAgICAgICAgIG9wdGlvbiB3aWxsIGRpc2FibGUgd3JpdGUtcHJvdGVjdGlvbiBvZiBjb25zdGFudCBkYXRhLgorCisgICAgQGl0ZW0gLWVhYmkKKyAgICAgICAgICAgICAgIFVzZSB0aGUgUG93ZXJQQyBFbWJlZGRlZCBBQkkgKGVhYmkpLgorCisgICAgQGl0ZW0gLWVsZgorCisgICAgICAgICAgICAgICAgRG8gbm90IHByZWZpeCBzeW1ib2xzIHdpdGggJ18nLiBQcmVmaXggbGFiZWxzIHdpdGggJy4nLgorCisgICAgQGl0ZW0gLWZzdWItemVybworCisgICAgICAgICAgICAgICAgVXNlIGZzdWIgdG8gbG9hZCBhIGZsb2F0aW5nLXBvaW50LXJlZ2lzdGVyIHdpdGggemVyby4KKyAgICAgICAgICAgICAgICBUaGlzIGlzIGZhc3RlciBidXQgcmVxdWlyZXMgYWxsIHJlZ2lzdGVycyB0byBhbHdheXMgY29udGFpbgorICAgICAgICAgICAgICAgIHZhbGlkIHZhbHVlcyAoaS5lLiBubyBOYU5zIGV0Yy4pIHdoaWNoIG1heSBub3QgYmUgdGhlIGNhc2UKKyAgICAgICAgICAgICAgICBkZXBlbmRpbmcgb24gc3RhcnR1cC1jb2RlLCBsaWJyYXJpZXMgZXRjLgorCisgICAgQGl0ZW0gLWdhcworICAgICAgICAgICAgICAgIENyZWF0ZSBjb2RlIHN1aXRhYmxlIGZvciB0aGUgR05VIGFzc2VtYmxlci4KKworICAgIEBpdGVtIC1tYWRkCisgICAgICAgICAgICAgICBVc2UgdGhlIEBjb2Rle2ZtYWRkL2Ztc3VifSBpbnN0cnVjdGlvbnMgZm9yIGNvbWJpbmluZworICAgICAgICAgICAgICAgIG11bHRpcGxpY2F0aW9uIHdpdGggYWRkaXRpb24vc3VidHJhY3Rpb24gaW4gb25lIGluc3RydWN0aW9uLgorICAgICAgICAgICAgICAgIEFzIHRoZXNlIGluc3RydWN0aW9ucyBkbyBub3Qgcm91bmQgYmV0d2VlbiB0aGUgb3BlcmF0aW9ucywKKyAgICAgICAgICAgICAgICB0aGV5IGhhdmUgaW5jcmVhc2VkIHByZWNpc2lvbiBvdmVyIHNlcGFyYXRlIGFkZGl0aW9uIGFuZAorICAgICAgICAgICAgICAgIG11bHRpcGxpY2F0aW9uLgorCisgICAgICAgICAgICAgICAgV2hpbGUgdGhpcyB1c3VhbGx5IGRvZXMgbm8gaGFybSwgaXQgaXMgbm90IElTTyBjb25mb3JtaW5nCisgICAgICAgICAgICAgICAgYW5kIHRoZXJlZm9yZSBub3QgdGhlIGRlZmF1bHQgYmVoYXZpb3VyLgorCisgICAgQGl0ZW0gLW1lcmdlLWNvbnN0YW50cworCisgICAgICAgICAgICAgICAgUGxhY2UgaWRlbnRpY2FsIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cyBhdCB0aGUgc2FtZQorICAgICAgICAgICAgICAgIG1lbW9yeSBsb2NhdGlvbi4gVGhpcyBjYW4gcmVkdWNlIHByb2dyYW0gc2l6ZS4KKworICAgIEBpdGVtIC1uby1hbGlnbi1hcmdzCisKKyAgICAgICAgICAgICAgICBEbyBub3QgYWxpZ24gZnVuY3Rpb24gYXJndW1lbnRzIG9uIHRoZSBzdGFjayBzdHJpY3RlcgorICAgICAgICAgICAgICAgIHRoYW4gNCBieXRlcy4gRGVmYXVsdCB3aXRoIEBvcHRpb257LXBvd2Vyb3Blbn0uCisKKyAgICBAaXRlbSAtbm8tcGVlcGhvbGUKKworICAgICAgICAgICAgICAgIERvIG5vdCBwZXJmb3JtIHNldmVyYWwgcGVlcGhvbGUgb3B0aW1pemF0aW9ucy4KKyAgICAgICAgICAgICAgICBDdXJyZW50bHkgaW5jbHVkZXM6CisgICAgICAgICAgICAgICAgQGl0ZW1pemUgQG1pbnVzCisgICAgICAgICAgICAgICAgIEBpdGVtIGJldHRlciB1c2Ugb2YgZDE2KHIpIGFkZHJlc3NpbmcKKyAgICAgICAgICAgICAgICAgQGl0ZW0gdXNlIG9mIGluZGV4ZWQgYWRkcmVzc2luZyBtb2RlcworICAgICAgICAgICAgICAgICBAaXRlbSB1c2Ugb2YgdXBkYXRlLWZsYWcKKyAgICAgICAgICAgICAgICAgQGl0ZW0gdXNlIG9mIHJlY29yZC1mbGFnCisgICAgICAgICAgICAgICAgIEBpdGVtIHVzZSBvZiBjb25kaXRpb24tY29kZS1yZWdpc3RlcnMgdG8gYXZvaWQgY2VydGFpbiBicmFuY2hlcworICAgICAgICAgICAgICAgIEBlbmQgaXRlbWl6ZQorCisgICAgQGl0ZW0gLW5vLXJlZ25hbWVzCisKKyAgICAgICAgICAgICAgICBEbyBub3QgdXNlIHJlZ2lzdGVyIG5hbWVzIGJ1dCBvbmx5IG51bWJlcnMgaW4gdGhlIGFzc2VtYmx5CisgICAgICAgICAgICAgICAgb3V0cHV0LiBUaGlzIGlzIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgIHRvIGF2b2lkIG5hbWUtY29uZmxpY3RzIHdoZW4gdXNpbmcgQG9wdGlvbnstZWxmfS4KKworICAgIEBpdGVtIC1wb3dlcm9wZW4KKworICAgICAgICAgICAgICAgIEdlbmVyYXRlIGNvZGUgZm9yIHRoZSBQb3dlck9wZW4gQUJJIGxpa2UgdXNlZCBpbiBBSVguCisgICAgICAgICAgICAgICAgVGhpcyBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSB5ZXQuCisKKyAgICBAaXRlbSAtc2MKKworICAgICAgICAgICAgICAgIEdlbmVyYXRlIGNvZGUgZm9yIHRoZSBtb2RpZmllZCBQb3dlck9wZW4gQUJJIHVzZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgU3Rvcm1DIGNvbXBpbGVyIChha2EgV2FycE9TIEFCSSkuCisKKyAgICBAaXRlbSAtc2QKKyAgICAgICAgICAgICAgICAgUGxhY2UgYWxsIG9iamVjdHMgaW4gc21hbGwgZGF0YS1zZWN0aW9ucy4KKworICAgIEBpdGVtIC1zZXRjY3MKKworICAgICAgICAgICAgICAgIFRoZSBWLjQgQUJJIHJlcXVpcmVzIHNpZ25hbGxpbmcgKGluIGEgYml0IG9mIHRoZSBjb25kaXRpb24gY29kZQorICAgICAgICAgICAgICAgIHJlZ2lzdGVyKSB3aGVuIGFyZ3VtZW50cyB0byB2YXJhcmdzLWZ1bmN0aW9ucworICAgICAgICAgICAgICAgIGFyZSBwYXNzZWQgaW4gZmxvYXRpbmctcG9pbnQgcmVnaXN0ZXJzLgorICAgICAgICAgICAgICAgIHZiY2MgdXN1YWxseSBkb2VzIG5vdCBtYWtlIHVzZSBvZiB0aGlzIGFuZAorICAgICAgICAgICAgICAgIHRoZXJlZm9yZSBkb2VzIG5vdCBzZXQgdGhhdCBiaXQgYnkgZGVmYXVsdC4KKyAgICAgICAgICAgICAgICBUaGlzIG1heSBsZWFkIHRvIHByb2JsZW1zIHdoZW4gbGlua2luZyBvYmplY3RzIGNvbXBpbGVkIGJ5CisgICAgICAgICAgICAgICAgdmJjYyB0byBvYmplY3RzL2xpYnJhcmllcyBjcmVhdGVkIGJ5IG90aGVyCisgICAgICAgICAgICAgICAgY29tcGlsZXJzIGFuZCBjYWxsaW5nIHZhcmFyZ3MtZnVuY3Rpb25zIHdpdGggZmxvYXRpbmctcG9pbnQKKyAgICAgICAgICAgICAgICBhcmd1bWVudHMuCisgICAgICAgICAgICAgICAgQG9wdGlvbnstc2V0Y2NzfSB3aWxsIGZpeCB0aGlzIHByb2JsZW0uCisKKyAgICBAaXRlbSAtdXNlLWNvbW1vbnMKKworICAgICAgICAgICAgICAgIFVzZSByZWFsIGNvbW1vbiBzeW1ib2xzIGluc3RlYWQgb2YgYnNzIHN5bWJvbHMgZm9yCisgICAgICAgICAgICAgICAgbm9uLWluaXRpYWxpemVkIGV4dGVybmFsIHZhcmlhYmxlcy4KKworICAgIEBpdGVtIC11c2UtbG13CisKKyAgICAgICAgICAgICAgICBVc2UgQGNvZGV7bG13L3N0bXd9LWluc3RydWN0aW9ucy4gVGhpcyBjYW4gc2lnbmlmaWNhbnRseSByZWR1Y2UKKyAgICAgICAgICAgICAgICBjb2RlLXNpemUuIEhvd2V2ZXIgdGhlc2UgaW5zdHJ1Y3Rpb25zIG1heSBiZSBzbG93ZXIgb24KKyAgICAgICAgICAgICAgICBjZXJ0YWluIFBQQ3MuCisKK0BlbmQgdGFibGUKKworQHNlY3Rpb24gQUJJCisKKyAgICAgICAgVGhpcyBiYWNrZW5kIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcmVnaXN0ZXJzOgorCisgICAgICAgIEBpdGVtaXplIEBtaW51cworICAgICAgICBAaXRlbSBAY29kZXtyMH0gdGhyb3VnaCBAY29kZXtyMzF9IGZvciB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycywKKyAgICAgICAgQGl0ZW0gQGNvZGV7ZjB9IHRocm91Z2ggQGNvZGV7ZjMxfSBmb3IgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBhbmQKKyAgICAgICAgQGl0ZW0gQGNvZGV7Y3IwfSB0aHJvdWdoIEBjb2Rle2NyN30gZm9yIHRoZSBjb25kaXRpb24tY29kZSByZWdpc3RlcnMuCisgICAgICAgIEBlbmQgaXRlbWl6ZQorCisgICAgICAgIEFkZGl0aW9uYWxseSwgdGhlIHJlZ2lzdGVyIHBhaXJzIEBjb2Rle3IzL3I0LCByNS9yNiwgcjcvcjgsIHI5L3IxMCwKKyAgICAgICAgcjE0L3IxNSwgcjE2L3IxNywgcjE4L3IxOSwKKyAgICAgICAgcjIwL3IyMSwgcjIyL3IyMywgcjI0L3IyNSwgcjI2L3IyNywgcjI4L3IyOX0gYW5kIEBjb2Rle3IzMC9yMzF9IGFyZQorICAgICAgICBhdmFpbGFibGUuCisKKyAgICAgICAgQGNvZGV7cjAsIHIxMSwgcjEyLCBmMCwgZjEyfSBhbmQgQGNvZGV7ZjEzfSBhcmUgcmVzZXJ2ZWQgYnkgdGhlCisgICAgICAgIGJhY2tlbmQuCisKKyAgICAgICAgCisKKyAgICBUaGUgY3VycmVudCB2ZXJzaW9uIGdlbmVyYXRlcyBhc3NlbWJseSBvdXRwdXQgZm9yIHVzZSB3aXRoIEBmaWxle3Zhc21wcGN9CisgICAgb3IgdGhlIEdOVSBhc3NlbWJsZXIuIFRoZSBnZW5lcmF0ZWQgY29kZSBzaG91bGQKKyAgICB3b3JrIG9uIDMyYml0IHN5c3RlbXMgYmFzZWQgb24gYSBQb3dlclBDIENQVSB1c2luZyB0aGUgVi40IEFCSSBvciB0aGUKKyAgICBQb3dlclBDIEVtYmVkZGVkIEFCSSAoZWFiaSkuCisKKworICAgIFRoZSByZWdpc3RlcnMgcjAsIHIzLXIxMiwgZjAtZjEzIGFuZCBjcjAtY3IxIGFyZSB1c2VkIGFzIHNjcmF0Y2ggcmVnaXN0ZXJzCisgICAgKGkuZS4gdGhleSBjYW4gYmUgZGVzdHJveWVkIGluIGZ1bmN0aW9uIGNhbGxzKSwgYWxsIG90aGVyIHJlZ2lzdGVycyBhcmUKKyAgICBwcmVzZXJ2ZWQuIHIxIGlzIHRoZSBzdGFjay1wb2ludGVyIGFuZCByMTMgaXMgdGhlIHNtYWxsLWRhdGEtcG9pbnRlciBpZgorICAgIHNtYWxsLWRhdGEtbW9kZSBpcyB1c2VkLgorCisgICAgVGhlIGZpcnN0IDggZnVuY3Rpb24gYXJndW1lbnRzIHdoaWNoIGhhdmUgaW50ZWdlciBvciBwb2ludGVyIHR5cGVzCisgICAgYXJlIHBhc3NlZCBpbiByZWdpc3RlcnMgcjMgdGhyb3VnaCByMTAgYW5kIHRoZSBmaXJzdCA4IGZsb2F0aW5nLXBvaW50CisgICAgYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4gcmVnaXN0ZXJzIGYxIHRocm91Z2ggZjguIEFsbCBvdGhlciBhcmd1bWVudHMKKyAgICBhcmUgcGFzc2VkIG9uIHRoZSBzdGFjay4KKworICAgIEludGVnZXJzIGFuZCBwb2ludGVycyBhcmUgcmV0dXJuZWQgaW4gcjMgKGFuZCByNCBmb3IgbG9uZyBsb25nKSwKKyAgICBmbG9hdHMgYW5kIGRvdWJsZXMgaW4gZjEuCisgICAgQWxsIG90aGVyIHR5cGVzIGFyZSByZXR1cm5lZCBieSBwYXNzaW5nIHRoZSBmdW5jdGlvbiB0aGUgYWRkcmVzcworICAgIG9mIHRoZSByZXN1bHQgYXMgYSBoaWRkZW4gYXJndW1lbnQgLSBzbyB3aGVuIHlvdSBjYWxsIHN1Y2ggYSBmdW5jdGlvbgorICAgIHdpdGhvdXQgYSBwcm9wZXIgZGVjbGFyYXRpb24gaW4gc2NvcGUgeW91IGNhbiBleHBlY3QgYSBjcmFzaC4KKworICAgIFRoZSBlbGVtZW50YXJ5IGRhdGEgdHlwZXMgYXJlIHJlcHJlc2VudGVkIGxpa2U6CisKKyAgICBAZXhhbXBsZQorICAgIHR5cGUgICAgICAgIHNpemUgaW4gYml0cyAgICAgICAgYWxpZ25tZW50IGluIGJ5dGVzICgtYW1pZ2EtYWxpZ24pCisKKyAgICBjaGFyICAgICAgICAgICAgICAgIDggICAgICAgICAgICAgICAgICAgICAgIDEgKDEpCisgICAgc2hvcnQgICAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgICAyICgyKQorICAgIGludCAgICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgICAgNCAoMikKKyAgICBsb25nICAgICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICAgICAgIDQgKDIpCisgICAgbG9uZyBsb25nICAgICAgICAgIDY0ICAgICAgICAgICAgICAgICAgICAgICA4ICgyKQorICAgIGFsbCBwb2ludGVycyAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgICAgNCAoMikKKyAgICBmbG9hdCAgICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICAgICAgIDQgKDIpCisgICAgZG91YmxlICAgICAgICAgICAgIDY0ICAgICAgICAgICAgICAgICAgICAgICA4ICgyKQorICAgIEBlbmQgZXhhbXBsZQorCitAc2VjdGlvbiBUYXJnZXQtc3BlY2lmaWMgdmFyaWFibGUtYXR0cmlidXRlcworCisgICAgVGhlIFBQQy1iYWNrZW5kIG9mZmVycyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlLWF0dHJpYnV0ZXM6CisKK0B0YWJsZSBAY29kZQorCisgICAgQGl0ZW0gX19zYXZlZHMKKyAgICAgICAgICAgICAgICAgICAgTG9hZCB0aGUgcG9pbnRlciB0byB0aGUgc21hbGwgZGF0YSBzZWdtZW50IGF0CisgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLWVudHJ5LiBBcHBsaWNhYmxlIG9ubHkgdG8gZnVuY3Rpb25zLgorCisgICAgQGl0ZW0gX19jaGlwCisgICAgICAgICAgICAgICAgICAgICAgUGxhY2UgdmFyaWFibGUgaW4gY2hpcC1tZW1vcnkuIE9ubHkgYXBwbGljYWJsZSBvbgorICAgICAgICAgICAgICAgICBBbWlnYU9TIHRvIHZhcmlhYmxlcyB3aXRoIHN0YXRpYyBzdG9yYWdlLWR1cmF0aW9uLgorCisgICAgQGl0ZW0gX19mYXIKKyAgICAgICAgICAgICAgICAgICAgICAgRG8gbm90IHBsYWNlIHRoaXMgdmFyaWFibGUgaW4gdGhlIHNtYWxsLWRhdGEgc2VnbWVudAorICAgICAgICAgICAgICAgICBpbiBzbWFsbC1kYXRhLW1vZGUuIE5vIGVmZmVjdCBpbiBsYXJnZS1kYXRhLW1vZGUuCisgICAgICAgICAgICAgICAgIE9ubHkgYXBwbGljYWJsZSB0byB2YXJpYWJsZXMgd2l0aCBzdGF0aWMgc3RvcmFnZS0KKyAgICAgICAgICAgICAgICAgZHVyYXRpb24uCisKKyAgICBAaXRlbSBfX25lYXIKKyAgICAgICAgICAgICAgQ3VycmVudGx5IGlnbm9yZWQuCisKKyAgICBAaXRlbSBfX3NhdmVhbGwKKyAgICAgICAgICAgICAgICBNYWtlIHN1cmUgYWxsIHJlZ2lzdGVycyBhcmUgc2F2ZWQgYnkgdGhpcyBmdW5jdGlvbi4gT24gbG93ZXIKKyAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb24gbGV2ZWxzLCBhbGwgdm9sYXRpbGUgcmVnaXN0ZXJzIHdpbGwgYmUgc2F2ZWQKKyAgICAgICAgICAgICAgICBhZGRpdGlvbmFsbHkuIE9uIGhpZ2hlciBsZXZlbHMsIG9ubHkgdGhlIG9uZXMgdGhhdCBtYXkgYmUKKyAgICAgICAgICAgICAgICBkZXN0cm95ZWQsIGFyZSBzYXZlZC4KKworICAgIEBpdGVtIF9faW50ZXJydXB0CisgICAgICAgICAgICAgICAgUmV0dXJuIHdpdGggZW4gQGNvZGV7cmZpfS1pbnN0cnVjdGlvbiByYXRoZXIgdGhhbiBAY29kZXtibHJ9LgorCisgICAgQGl0ZW0gX19zZWN0aW9uKCJuYW1lIiwiYXR0ciIpCisgICAgICAgICAgICAgICAgIFBsYWNlIHRoaXMgZnVuY3Rpb24vb2JqZWN0IGluIHNlY3Rpb24gIm5hbWUiIHdpdGgKKyAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyAiYXR0ciIuCitAZW5kIHRhYmxlCisKKworQHNlY3Rpb24gVGFyZ2V0LXNwZWNpZmljIHByYWdtYXMKKworICAgIFRoZSBQUEMtYmFja2VuZCBvZmZlcnMgdGhlIGZvbGxvd2luZyAjcHJhZ21hczoKKworQHRhYmxlIEBjb2RlCisKKyAgICBAaXRlbSAjcHJhZ21hIGFtaWdhLWFsaWduCisgICAgICAgICAgICAgU2V0IGFsaWdubWVudCBsaWtlIC1hbWlnYS1hbGlnbm1lbnQgb3B0aW9uLgorCisgICAgQGl0ZW0gI3ByYWdtYSBuYXR1cmFsLWFsaWduCisgICAgICAgICAgIEFsaWduIGV2ZXJ5IHR5cGUgdG8gaXRzIG93biBzaXplLgorCisgICAgQGl0ZW0gI3ByYWdtYSBkZWZhdWx0LWFsaWduCisgICAgICAgICAgIFNldCBhbGlnbm1lbnQgYWNjb3JkaW5nIHRvIGNvbW1hbmQtbGluZSBvcHRpb25zLgorCitAZW5kIHRhYmxlCisKK0BzZWN0aW9uIFByZWRlZmluZWQgTWFjcm9zCisKKyAgICAgICAgVGhpcyBiYWNrZW5kIGRlZmluZXMgdGhlIGZvbGxvd2luZyBtYWNyb3M6CisKK0B0YWJsZSBAY29kZQorICAgICAgICBAaXRlbSBfX1BQQ19fCisgICAgICAgIAorICAgICAgICBAaXRlbSBfX0FNSUdBREFURV9fCisgICAgICAgICAgICAgICAgVGhpcyBpcyBzZXQgdG8gY3VycmVudCBkYXRlIGFzIEBjb2RleyIoREQuTU0uWVlZWSkifSwKKyAgICAgICAgICAgICAgICB1c2VmdWwgd2l0aCB2ZXJzaW9uIHN0cmluZ3MuCitAZW5kIHRhYmxlCisKK0BzZWN0aW9uIFN0YWNrCisKKyAgICBJZiB0aGUgQG9wdGlvbnstc3RhY2stY2hlY2t9IG9wdGlvbiBpcyB1c2VkLCBldmVyeSBmdW5jdGlvbi1wcm9sb2d1ZSB3aWxsCisgICAgY2FsbCB0aGUgZnVuY3Rpb24gQGNvZGV7X19zdGFja19jaGVja30gd2l0aCB0aGUgc3RhY2tzaXplIG5lZWRlZCBieSB0aGlzCisgICAgZnVuY3Rpb24gaW4gcmVnaXN0ZXIgcjEyLiBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjb25zaWRlciBpdHMgb3duCisgICAgc3RhY2tzaXplIGFuZCBtdXN0IHJlc3RvcmUgYWxsIHJlZ2lzdGVycy4KKworQHNlY3Rpb24gU3RkYXJnCisKKyAgICBBIHBvc3NpYmxlIDxzdGRhcmcuaD4gZm9yIFYuNCBBQkkgY291bGQgbG9vayBsaWtlIHRoaXM6CisKK0BleGFtcGxlCisKK3R5cGVkZWYgc3RydWN0IEB7CisgIGludCBncHI7CisgIGludCBmcHI7CisgIGNoYXIgKnJlZ2Jhc2U7CisgIGNoYXIgKm1lbWJhc2U7CitAfSB2YV9saXN0OworCitjaGFyICpfX3ZhX3N0YXJ0KHZvaWQpOworY2hhciAqX192YV9yZWdiYXNlKHZvaWQpOworaW50IF9fdmFfZml4ZWRncHIodm9pZCk7CitpbnQgX192YV9maXhlZGZwcih2b2lkKTsKKworI2RlZmluZSB2YV9zdGFydCh2bCxkdW1teSkgXAorICAoIFwKKyAgICB2bC5ncHI9X192YV9maXhlZGdwcigpLCBcCisgICAgdmwuZnByPV9fdmFfZml4ZWRmcHIoKSwgXAorICAgIHZsLnJlZ2Jhc2U9X192YV9yZWdiYXNlKCksIFwKKyAgICB2bC5tZW1iYXNlPV9fdmFfc3RhcnQoKSBcCisgICkKKworI2RlZmluZSB2YV9lbmQodmwpICgodmwpLnJlZ2Jhc2U9KHZsKS5tZW1iYXNlPTApCisKKyNkZWZpbmUgdmFfY29weShuZXcsb2xkKSAoKG5ldyk9KG9sZCkpCisKKyNkZWZpbmUgX192YV9hbGlnbih0eXBlKSAoX19hbGlnbm9mKHR5cGUpPj00P19fYWxpZ25vZih0eXBlKTo0KQorCisjZGVmaW5lIF9fdmFfZG9fYWxpZ24odmwsdHlwZSkgKCh2bCkubWVtYmFzZT0oY2hhciAqKSgoKCh1bnNpZ25lZCBpbnQpKCh2bCkubWVtYmFzZSkpK19fdmFfYWxpZ24odHlwZSktMSkvX192YV9hbGlnbih0eXBlKSpfX3ZhX2FsaWduKHR5cGUpKSkKKworI2RlZmluZSBfX3ZhX21lbSh2bCx0eXBlKSAoX192YV9kb19hbGlnbigodmwpLHR5cGUpLCh2bCkubWVtYmFzZSs9c2l6ZW9mKHR5cGUpLCgodHlwZSopKCh2bCkubWVtYmFzZSkpWy0xXSkKKworI2RlZmluZSB2YV9hcmcodmwsdHlwZSkgXAorICggXAorICAoX190eXBlb2YodHlwZSkmMTI3KT4xMD8gXAorICAgIF9fdmFfbWVtKCh2bCksdHlwZSkgXAorICA6IFwKKyAgICggXAorICAgICgoKF9fdHlwZW9mKHR5cGUpJjEyNyk+PTYmJihfX3R5cGVvZih0eXBlKSYxMjcpPD04KSkgPyBcCisgICAgICggXAorICAgICAgKysodmwpLmZwcjw9OCA/IFwKKyAgICAgICAgKCh0eXBlKikoKHZsKS5yZWdiYXNlKzMyKSlbKHZsKS5mcHItMV0gXAorICAgICAgOiBcCisgICAgICAgIF9fdmFfbWVtKCh2bCksdHlwZSkgXAorICAgICApIFwKKyAgICA6IFwKKyAgICAgKCBcCisgICAgICArKyh2bCkuZ3ByPD04ID8gXAorICAgICAgICAoKHR5cGUqKSgodmwpLnJlZ2Jhc2UrMCkpWyh2bCkuZ3ByLTFdIFwKKyAgICAgIDogXAorICAgICAgICBfX3ZhX21lbSgodmwpLHR5cGUpIFwKKyAgICAgKSBcCisgICApIFwKKyApCisKK0BlbmQgZXhhbXBsZQorCisgICAgQSBwb3NzaWJsZSA8c3RkYXJnLmg+IGZvciBQb3dlck9wZW4gQUJJIGNvdWxkIGxvb2sgbGlrZSB0aGlzOgorCitAZXhhbXBsZQorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgKnZhX2xpc3Q7CisKKyNkZWZpbmUgX192YV9hbGlnbih0eXBlKSAoNCkKKworI2RlZmluZSBfX3ZhX2RvX2FsaWduKHZsLHR5cGUpICgodmwpPShjaGFyICopKCgoKHVuc2lnbmVkIGludCkodmwpKStfX3ZhX2FsaWduKHR5cGUpLTEpL19fdmFfYWxpZ24odHlwZSkqX192YV9hbGlnbih0eXBlKSkpCisKKyNkZWZpbmUgX192YV9tZW0odmwsdHlwZSkgKF9fdmFfZG9fYWxpZ24oKHZsKSx0eXBlKSwodmwpKz1zaXplb2YodHlwZSksKCh0eXBlKikodmwpKVstMV0pCisKKyNkZWZpbmUgdmFfc3RhcnQoYXAsIGxhc3RhcmcpICgoYXApPSh2YV9saXN0KSgmbGFzdGFyZysxKSkKKyAKKyNkZWZpbmUgdmFfYXJnKHZsLHR5cGUpIF9fdmFfbWVtKHZsLHR5cGUpCisgCisjZGVmaW5lIHZhX2VuZCh2bCkgKCh2bCk9MCkKKworI2RlZmluZSB2YV9jb3B5KG5ldyxvbGQpICgobmV3KT0ob2xkKSkKKworQGVuZCBleGFtcGxlCisKKworQHNlY3Rpb24gS25vd24gcHJvYmxlbXMKKworQGl0ZW1pemUgQG1pbnVzCisgIEBpdGVtICBjb21wb3NpdGUgdHlwZXMgYXJlIHB1dCBvbiB0aGUgc3RhY2sgcmF0aGVyIHRoYW4gcGFzc2VkIHZpYSBwb2ludGVyCisgIEBpdGVtIGluZGljYXRpb24gb2YgZnAtcmVnaXN0ZXItYXJncyB3aXRoIGJpdCA2IG9mIGNyIGlzIG5vdCBkb25lIHdlbGwKK0BlbmQgaXRlbWl6ZQorCisKKworCmRpZmYgLS1naXQgYS9kb2MvdmJjY3ZpZGNvcmUudGV4aSBiL2RvYy92YmNjdmlkY29yZS50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NDMwYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdmJjY3ZpZGNvcmUudGV4aQpAQCAtMCwwICsxLDE1NyBAQAorVGhpcyBjaGFwdGVyIGRvY3VtZW50cyB0aGUgQmFja2VuZCBmb3IgdGhlIFZpZGVvQ29yZSBJViBwcm9jZXNzb3IgZmFtaWx5LgorCitUaGUgYmFja2VuZCBpcyBpbiBhIHZlcnkgZWFybHkgc3RhZ2UsIGl0IGlzIG5vdCBjb21wbGV0ZSwgYW5kIGl0IGNhbiBub3QKK3lldCBiZSBjb25zaWRlcmVkIHVzZWZ1bCEKKworQWxzbyBub3RlIHRoYXQgaXQgaXMgYmFzZWQgb24gZnJlZWx5IGF2YWlsYWJsZSwgdW5vZmZpY2lhbCwgYW5kIHBvc3NpYmx5CitpbmNvcnJlY3QgaW5mb3JtYXRpb24gb24gdGhlIHRhcmdldCBwcm9jZXNzb3IuCisKK0BzZWN0aW9uIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgdGhpcyB2ZXJzaW9uCisKK1RoaXMgYmFja2VuZCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKKworQHRhYmxlIEBvcHRpb24KKworICAgIEBpdGVtIC1zaG9ydC1kb3VibGUKKworICAgICAgICAgICAgICAgIFVzZSBuYXRpdmUgMzJiaXQgZmxvYXRpbmcgcG9pbnQgZm9yIGRvdWJsZSBhbmQgbG9uZyBkb3VibGUuCisgICAgICAgICAgICAgICAgVGhpcyBpcyBtdWNoIG1vcmUgZWZmaWNpZW50LCBidXQgbm90IElTTyBDIGNvbmZvcm1pbmcuCisKKyAgICBAaXRlbSAtb25lLXNlY3Rpb24KKworICAgICAgICAgICAgICAgIFB1dCBhbGwgY29kZSBhbmQgZGF0YSBpbiB0aGUgc2FtZSBzZWN0aW9uICgudGV4dCkuCisKKworICAgIEBpdGVtIC1uby1kZWxheWVkLXBvcHBpbmcKKworICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgYXJndW1lbnRzIG9mIGZ1bmN0aW9uIGNhbGxzIGFyZSBub3QgYWx3YXlzIHBvcHBlZAorICAgICAgICAgICAgICAgIGZyb20gdGhlIHN0YWNrIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjYWxsLCBzbyB0aGF0IHRoZQorICAgICAgICAgICAgICAgIGFyZ3VtZW50cyBvZiBzZXZlcmFsIGNhbGxzIG1heSBiZSBwb3BwZWQgYXQgb25jZS4KKyAgICAgICAgICAgICAgICBXaXRoIHRoaXMgb3B0aW9uIEBjb21tYW5ke3ZiY2N9IGNhbiBiZSBmb3JjZWQgdG8gcG9wIHRoZW0gYWZ0ZXIgZXZlcnkKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiBjYWxsLgorICAgICAgICAgICAgICAgIFRoaXMgbWF5IHNpbXBsaWZ5IGRlYnVnZ2luZyBhbmQgcmVkdWNlIHRoZQorICAgICAgICAgICAgICAgIHN0YWNrIHNpemUgbmVlZGVkIGJ5IHRoZSBjb21waWxlZCBwcm9ncmFtLgorCisgICAgQGl0ZW0gLW5vLXBlZXBob2xlCisKKyAgICAgICAgICAgICAgICBEaXNhYmxlIG1vc3QgYmFja2VuZCBwZWVwaG9sZSBvcHRpbWl6YXRpb25zLgorICAgICAgICAgICAgICAgIEp1c3QgZm9yIHRlc3RpbmcuCisKKyAgICBAaXRlbSAtbm9leHQtcmVncworCisgICAgICAgICAgICAgICAgRG8gbm90IHVzZSByZWdpc3RlcnMgcjE2LXIyMy4gSnVzdCBmb3IgdGVzdGluZy4KKworICAgIEBpdGVtIC1jb25kLWxpbWl0PTxuPgorCisgICAgICAgICAgICAgICAgU2V0IHRoZSBsaW1pdCAoaW4gbnVtYmVyIG9mIGludGVybWVkaWF0ZSBjb2RlIGluc3RydWN0aW9ucykKKyAgICAgICAgICAgICAgICBmb3IgdGhlIGxlbmd0aCBvZiBjb2RlLXNlcXVlbmNlcyBjb25zaWRlcmVkIGZvciBjb25kaXRpb25hbAorICAgICAgICAgICAgICAgIGV4ZWN1dGlvbiAoZGVmYXVsdDogMikuCisKKworQGVuZCB0YWJsZQorCitAc2VjdGlvbiBBQkkKKworICAgICAgICBUaGlzIGJhY2tlbmQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyByZWdpc3RlcnM6CisKKyAgICAgICAgQGl0ZW1pemUgQG1pbnVzCisgICAgICAgIEBpdGVtIEBjb2Rle3IwfSB0aHJvdWdoIEBjb2Rle3IzMX0gZm9yIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzCisgICAgICAgIEBlbmQgaXRlbWl6ZQorCisgICAgICAgIEFkZGl0aW9uYWxseSwgdGhlIHJlZ2lzdGVyIHBhaXJzIEBjb2Rle3IwL3IxfSBAY29kZXtyMi9yMywgcjQvcjUsIHI2L3I3LCByOC9yOSwKKyAgICAgICAgcjEwL3IxMSwgcjEyL3IxMywgcjE0L3IxNSwKKyAgICAgICAgcjE2L3IxNywgcjE4L3IxOSwgcjIwL3IyMSwgcjIyL3IyM30gYXJlCisgICAgICAgIGF2YWlsYWJsZS4KKworICAgICAgICBAY29kZXtyMTQsIHIxNSwgcjI0LXIzMX0gYXJlIGN1cnJlbnRseSByZXNlcnZlZCBieSB0aGUKKyAgICAgICAgYmFja2VuZC4KKworICAgICAgICAKKworICAgIFRoZSBjdXJyZW50IHZlcnNpb24gZ2VuZXJhdGVzIGFzc2VtYmx5IG91dHB1dCBmb3IgdXNlIHdpdGggQGZpbGV7dmFzbX0uCisKKworICAgIFRoZSByZWdpc3RlcnMgcjAtcjUgYW5kIHIxNC1yMTUgYXJlIHVzZWQgYXMgc2NyYXRjaCByZWdpc3RlcnMKKyAgICAoaS5lLiB0aGV5IGNhbiBiZSBkZXN0cm95ZWQgaW4gZnVuY3Rpb24gY2FsbHMpLCBhbGwgb3RoZXIgcmVnaXN0ZXJzIGFyZQorICAgIHByZXNlcnZlZC4gcjI1IGlzIHRoZSBzdGFjay1wb2ludGVyLgorCisgICAgVGhlIGZpcnN0IDYgZnVuY3Rpb24gYXJndW1lbnRzIHdoaWNoIGhhdmUgaW50ZWdlciwgZmxvYXQzMiBvciBwb2ludGVyIHR5cGVzCisgICAgYXJlIHBhc3NlZCBpbiByZWdpc3RlcnMgcjAgdGhyb3VnaCByNS4gQWxsIG90aGVyIGFyZ3VtZW50cworICAgIGFyZSBwYXNzZWQgb24gdGhlIHN0YWNrLgorCisgICAgSW50ZWdlcnMsIGZsb2F0MzIgYW5kIHBvaW50ZXJzIGFyZSByZXR1cm5lZCBpbiByMC4KKyAgICBBbGwgb3RoZXIgdHlwZXMgYXJlIHJldHVybmVkIGJ5IHBhc3NpbmcgdGhlIGZ1bmN0aW9uIHRoZSBhZGRyZXNzCisgICAgb2YgdGhlIHJlc3VsdCBhcyBhIGhpZGRlbiBhcmd1bWVudCAtIHNvIHdoZW4geW91IGNhbGwgc3VjaCBhIGZ1bmN0aW9uCisgICAgd2l0aG91dCBhIHByb3BlciBkZWNsYXJhdGlvbiBpbiBzY29wZSB5b3UgY2FuIGV4cGVjdCBhIGNyYXNoLgorCisgICAgVGhlIGVsZW1lbnRhcnkgZGF0YSB0eXBlcyBhcmUgcmVwcmVzZW50ZWQgbGlrZToKKworICAgIEBleGFtcGxlCisgICAgdHlwZSAgICAgICAgc2l6ZSBpbiBiaXRzICAgICAgICBhbGlnbm1lbnQgaW4gYnl0ZXMKKworICAgIGNoYXIgICAgICAgICAgICAgICAgOCAgICAgICAgICAgICAgICAgICAgICAgMSAKKyAgICBzaG9ydCAgICAgICAgICAgICAgMTYgICAgICAgICAgICAgICAgICAgICAgIDIgCisgICAgaW50ICAgICAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICA0IAorICAgIGxvbmcgICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgICAgNCAKKyAgICBsb25nIGxvbmcgICAgICAgICAgNjQgICAgICAgICAgICAgICAgICAgICAgIDggICAgbm90IHlldCBzdXBwb3J0ZWQKKyAgICBhbGwgcG9pbnRlcnMgICAgICAgMzIgICAgICAgICAgICAgICAgICAgICAgIDQgCisgICAgZmxvYXQgICAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICA0IAorICAgIGRvdWJsZSAgICAgICAgICAgICA2NCAoMzIpICAgICAgICAgICAgICAgICAgNCAKKyAgICBsb25nIGRvdWJsZSAgICAgICAgNjQgKDMyKSAgICAgICAgICAgICAgICAgIDQKKyAgICBAZW5kIGV4YW1wbGUKKworQHNlY3Rpb24gVGFyZ2V0LXNwZWNpZmljIHZhcmlhYmxlLWF0dHJpYnV0ZXMKKworICAgIFRoZSB2aWRjb3JlLWJhY2tlbmQgb2ZmZXJzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUtYXR0cmlidXRlczoKKworQHRhYmxlIEBjb2RlCisKKyAgICBAaXRlbSBfX3NlY3Rpb24oIm5hbWUiLCJhdHRyIikKKyAgICAgICAgICAgICAgICAgUGxhY2UgdGhpcyBmdW5jdGlvbi9vYmplY3QgaW4gc2VjdGlvbiAibmFtZSIgd2l0aAorICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzICJhdHRyIi4KK0BlbmQgdGFibGUKKworCitAc2VjdGlvbiBUYXJnZXQtc3BlY2lmaWMgcHJhZ21hcworCisgICAgVGhlIHZpZGNvcmUtYmFja2VuZCBvZmZlcnMgdGhlIGZvbGxvd2luZyAjcHJhZ21hczoKKworQHRhYmxlIEBjb2RlCisKKyAgICAgICBAaXRlbSBub25lIGF0IHRoZSBtb21lbnQuLi4KKworQGVuZCB0YWJsZQorCitAc2VjdGlvbiBQcmVkZWZpbmVkIE1hY3JvcworCisgICAgICAgIFRoaXMgYmFja2VuZCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgbWFjcm9zOgorCitAdGFibGUgQGNvZGUKKyAgICAgICAgQGl0ZW0gX19WSURFT0NPUkVfXworCisgICAgICAgIEBpdGVtIF9fU0hPUlRfRE9VQkxFX18gKGlmIC1zaG9ydC1kb3VibGUgaXMgdXNlZCkgICAgICAgIAorQGVuZCB0YWJsZQorCitAc2VjdGlvbiBTdGRhcmcKKworc3RkYXJnLWltcGxlbWVudGF0aW9uIGlzIG5vdCB5ZXQgZnVsbHkgd29ya2luZy4gT25lIHJlc3RyaWN0aW9uIGlzIHRoYXQKK3doZW4gY2FsbGluZyBhIHZhcmFyZ3MgZnVuY3Rpb24sIHRoZSBwcm90b3R5cGUgbXVzdCBiZSBpbiBzY29wZSAodGhpcyBpcworSVNPIEMgY29uZm9ybWluZykuIEFub3RoZXIgb25lIGlzIHRoYXQgdGhlIHN0ZGFyZy1tYWNyb3Mgb25seSB3b3JrIGFzCitsb25nIGFzIGFsbCBmaXhlZCBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiByZWdpc3RlcnMuCisKK1RoaXMgd2lsbCBiZSBmaXhlZCBpbiB0aGUgZnV0dXJlLgorCisKK0BzZWN0aW9uIEtub3duIHByb2JsZW1zCisKK0BpdGVtaXplIEBtaW51cworICAgICAgICAgQGl0ZW0gbm8gc3VwcG9ydCBmb3IgbG9uZyBsb25nCisgICAgICAgICBAaXRlbSBubyBzdXBwb3J0IGZvciA2NGJpdCBmbG9hdGluZyBwb2ludAorICAgICAgICAgQGl0ZW0gc3RkYXJnIHByb2JsZW1zIG1lbnRpb25lZCBhYm92ZQorICAgICAgICAgQGl0ZW0gc3Vib3B0aW1hbCBjb2RlIHF1YWxpdHkKKyAgICAgICAgIEBpdGVtIC4uLgorQGVuZCBpdGVtaXplCisKKworCisKZGlmZiAtLWdpdCBhL2RvYy92Yy50ZXhpIGIvZG9jL3ZjLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkZTQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy92Yy50ZXhpCkBAIC0wLDAgKzEsMjU0IEBACitUaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIEBjb21tYW5ke3ZjfSwgdGhlIGZyb250ZW5kIGZvciB2YmNjLiBJdCBrbm93cyBob3cKK3RvIGRlYWwgd2l0aCBkaWZmZXJlbnQgZmlsZSB0eXBlcyBhbmQgb3B0aW1pemF0aW9uIHNldHRpbmdzIGFuZCB3aWxsCitjYWxsIHRoZSBjb21waWxlciwgYXNzZW1ibGVyIGFuZCBsaW5rZXIuCitJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gY2FsbCB0aGUgZGlmZmVyZW50IHRyYW5zbGF0aW9uLXBoYXNlcyBkaXJlY3RseS4KK0Bjb21tYW5ke3ZjfSBwcm92aWRlcyBhbiBlYXN5LXRvLXVzZSBpbnRlcmZhY2Ugd2hpY2ggaXMgbW9zdGx5IGNvbXBhdGlibGUgdG8KK1VuaXggQGNvbW1hbmR7Y2N9LgorCitAc2VjdGlvbiBVc2FnZQorCisgICAgVGhlIGdlbmVyYWwgc3ludGF4IGZvciBjYWxsaW5nIEBjb21tYW5ke3ZjfQorCitAZXhhbXBsZQorICAgIEBjb21tYW5ke3ZjIFtvcHRpb25zXSBmaWxlMSBmaWxlMiAuLi59CitAZW5kIGV4YW1wbGUKKworICAgIHByb2Nlc3NlcyBhbGwgZmlsZXMgYWNjb3JkaW5nIHRvIHRoZWlyIHN1ZmZpeCBhbmQgbGlua3MgYWxsIG9iamVjdHMKKyAgICB0b2dldGhlciAodW5sZXNzIGFueSBvZiBAb3B0aW9uey1FfSwgQG9wdGlvbnstU30sIEBvcHRpb257LWN9IGlzIHNwZWNpZmllZCkuCisgVGhlIGZvbGxvd2luZyBmaWxlIHR5cGVzIGFyZSByZWNvZ25pemVkOgorCitAdGFibGUgQGZpbGUKKyAgICBAaXRlbSAuYyAgICAgIAorICAgICAgICAgICAgICAgIEMgc291cmNlCisgICAgQGl0ZW0gLmkgICAgICAKKyAgICAgICAgICAgICAgICBhbHJlYWR5IHByZXByb2Nlc3NlZCBDIHNvdXJjZQorICAgIEBpdGVtIC5zY3MgICAgCisgICAgICAgICAgICAgICAgYXNzZW1ibHkgc291cmNlIHRvIGJlIGZlZCB0byB0aGUgc2NoZWR1bGVyCisgICAgQGl0ZW0gLmFzbQorICAgIEBpdGVtIC5zICAgICAgCisgICAgICAgICAgICAgICAgYXNzZW1ibHkgc291cmNlCisgICAgQGl0ZW0gLm9iagorICAgIEBpdGVtIC5vICAgICAgCisgICAgICAgICAgICAgICAgb2JqZWN0IGZpbGUKK0BlbmQgdGFibGUKKworICAgIFVzdWFsbHkgcGF0dGVybiBtYXRjaGluZyBpcyBzdXBwb3J0ZWQgLSBob3dldmVyIHRoaXMgZGVwZW5kcyBvbiB0aGUKKyAgICBwb3J0IGFuZCB0aGUgaG9zdCBzeXN0ZW0uCisKKyAgICBUaGUgb3B0aW9ucyByZWNvZ25pemVkIGJ5IEBjb21tYW5ke3ZjfSBhcmU6CisKK0B0YWJsZSBAb3B0aW9uCisKKyAgICBAaXRlbSAtdiAgICAgIAorICAgICAgICAgICAgICAgIFZlcmJvc2UgbW9kZS4gUHJpbnRzIGFsbCBjb21tYW5kcyBiZWZvcmUgZXhlY3V0aW5nIHRoZW0uCisKKyAgICBAaXRlbSAtdnYgICAgIAorICAgICAgICAgICAgICAgIFZlcnkgdmVyYm9zZS4gRGlzcGxheXMgc29tZSBpbnRlcm5hbHMgYXMgd2VsbC4KKworICAgIEBpdGVtIC1PeCAgICAgCisgICAgICAgICAgICAgICAgU2V0cyB0aGUgb3B0aW1pemF0aW9uIGxldmVsLkAqCisgICAgICAgICAgICAtTzAgaXMgZXF1aXZhbGVudCB0byAtTz0wLkAqCisgICAgICAgICAgICAtTyAgd2lsbCBhY3RpdmF0ZSBzb21lIG9wdGltaXphdGlvbnMgKGF0IHRoZSBtb21lbnQgLU89OTkxKS5AKgorICAgICAgICAgICAgLU8yIHdpbGwgYWN0aXZhdGUgbW9zdCBvcHRpbWl6YXRpb25zIChhdCB0aGUgbW9tZW50IC1PPTEwMjMgLXNjaGVkdWxlKS5AKgorICAgICAgICAgICAgLU8zIHdpbGwgYWN0aXZhdGUgYWxsIG9wdGltaXphdGlvbnMgKGF0IHRoZSBtb21lbnQgLU89fjAgLXNjaGVkdWxlKS5AKgorICAgICAgICAgICAgLU80IHdpbGwgYWN0aXZhdGUgZnVsbCBjcm9zcy1tb2R1bGUtb3B0aW1pemF0aW9uLkAqCisKKyAgICAgICAgICAgIEFsc28sIC1PMyB3aWxsIGFjdGl2YXRlIGNyb3NzLW1vZHVsZS1vcHRpbWl6YXRpb25zLiBBbGwgc291cmNlCisgICAgICAgICAgICBmaWxlcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY29tcGlsZXIKKyAgICAgICAgICAgIGF0IG9uY2UuIE9ubHkgb25lIGFzc2VtYmx5L29iamVjdC1maWxlIHdpbGwgYmUgcHJvZHVjZWQgKGJ5IGRlZmF1bHQKKyAgICAgICAgICAgIHRoZSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmaXJzdCBzb3VyY2UgZmlsZSB3aXRoIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgIHN1ZmZpeCkuCisKKyAgICAgICAgICAgIFdoZW4gY29tcGlsaW5nIHdpdGggLU80IGFuZCAtYyB2YmNjIHdpbGwgbm90IHByb2R1Y2UgcmVhbCBvYmplY3QKKyAgICAgICAgICAgIGZpbGVzIGJ1dCBzcGVjaWFsIGZpbGVzIGNvbnRhaW5pbmcgYWxsIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0bworICAgICAgICAgICAgZGVmZXIgb3B0aW1pemF0aW9uIGFuZCBjb2RlLWdlbmVyYXRpb24gdG8gbGluay10aW1lLiBUaGlzIGlzCisgICAgICAgICAgICB1c2VmdWwgdG8gcHJvdmlkZSBhbGwgZmlsZXMgb2YgYSBwcm9qZWN0IHRvIHRoZSBvcHRpbWl6ZXIgYW5kCisgICAgICAgICAgICBtYWtlIGZ1bGwgdXNlIG9mIGNyb3NzLW1vZHVsZSBvcHRpbWl6YXRpb25zLgorICAgICAgICAgICAgTm90ZSB0aGF0IHlvdSBtdXN0IHVzZSB2YyB0byBkbyB0aGUgbGlua2luZy4gdmMgd2lsbCBkZXRlY3QgYW5kCisgICAgICAgICAgICBoYW5kbGUgdGhlc2UgZmlsZXMgY29ycmVjdGx5LiBUaGV5IGNhbiBub3QgYmUgbGlua2VkIGRpcmVjdGx5LgorICAgICAgICAgICAgQWxzbywgbWFrZSBzdXJlIHRvIHBhc3MgYWxsIHJlbGV2YW50IGNvbXBpbGVyIG9wdGlvbnMgYWxzbyB0bworICAgICAgICAgICAgdGhlIGxpbmtlci1jb21tYW5kLgorCisgICAgICAgICAgICBIaWdoZXIgdmFsdWVzIG1heSBvciBtYXkgbm90IGFjdGl2YXRlIGV2ZW4gbW9yZSBvcHRpbWl6YXRpb25zLgorICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgLU89MS4KKyAgICAgICAgICAgIEl0IGlzIGFsc28gcG9zc2libGUgdG8gc3BlY2lmeSBhbiBleGFjdCB2YWx1ZSB3aXRoIC1PPW4uCisgICAgICAgICAgICBIb3dldmVyLCBJIGRvIG5vdCByZWNvbW1lbmQgdGhpcyB1bmxlc3MgeW91IGtub3cgZXhhY3RseSB3aGF0CisgICAgICAgICAgICB5b3UgYXJlIGRvaW5nLgorCisgICAgQGl0ZW0gLW8gZmlsZSAKKyAgICAgICAgICAgICAgICBTYXZlIHRoZSB0YXJnZXQgYXMgQGZpbGV7ZmlsZX0gKGRlZmF1bHQgZm9yIGV4ZWN1dGFibGVzIGlzCisgICAgICAgICAgICAgICAgQGZpbGV7YS5vdXR9KS4KKworICAgIEBpdGVtIC1FICAgICAgCisgICAgICAgICAgICAgICAgU2F2ZSB0aGUgcHJlcHJvY2Vzc2VkIEMgc291cmNlcyB3aXRoIC5pIHN1ZmZpeC4KKworICAgIEBpdGVtIC1TICAgICAgCisgICAgICAgICAgICAgICAgRG8gbm90IGFzc2VtYmxlLiBTYXZlIHRoZSBjb21waWxlZCBmaWxlcyB3aXRoIC5hc20gc3VmZml4LgorCisgICAgQGl0ZW0gLVNDUyAgICAKKyAgICAgICAgICAgICAgICBEbyBub3Qgc2NoZWR1bGUuIFNhdmUgdGhlIGNvbXBpbGVkIGZpbGVzIHdpdGggLnNjcyBzdWZmaXguCisKKyAgICBAaXRlbSAtYyAgICAgIAorICAgICAgICAgICAgICAgIERvIG5vdCBsaW5rLiBTYXZlIHRoZSBjb21waWxlZCBmaWxlcyB3aXRoIC5vIHN1ZmZpeC4KKworICAgIEBpdGVtIC1rICAgICAgCisgICAgICAgICAgICAgICAgS2VlcCBhbGwgaW50ZXJtZWRpYXRlIGZpbGVzLiBCeSBkZWZhdWx0IGFsbCBnZW5lcmF0ZWQgZmlsZXMKKyAgICAgICAgICAgIGV4Y2VwdCB0aGUgc291cmNlIGZpbGVzIGFuZCB0aGUgdGFyZ2V0cyBhcmUgZGVsZXRlZC4KKworICAgIEBpdGVtIC1Ec3RyICAgCisgICAgICAgICAgICAgICAgQGNvZGV7I2RlZmluZX0gYSBwcmVwcm9jZXNzb3Igc3ltYm9sLCBlLmcuIC1EQU1JR0Egb3IgLURDUFU9NjgwMDAuCisgICAgICAgICAgICAgICAgVGhlIGZvcm1lciBzeW50YXggaXMgZXF1aXZhbGVudCB0bzoKK0BleGFtcGxlCisgI2RlZmluZSBBTUlHQSAxCitAZW5kIGV4YW1wbGUKKyAgICAgICAgICAgICAgICBUaGUgbGF0dGVyIGZvcm0gaXMgZXF1aXZhbGVudCB0bzoKK0BleGFtcGxlCisgI2RlZmluZSBDUFUgNjgwMDAKK0BlbmQgZXhhbXBsZQorCisgICAgQGl0ZW0gLUlwYXRoICAKKyAgICAgICAgICAgICAgICBBZGQgQGZpbGV7cGF0aH0gdG8gdGhlIGluY2x1ZGUtc2VhcmNoLXBhdGguCisgICAgICAgICAgICAgICAgQW4gZW1wdHkgQGZpbGV7cGF0aH0gYWRkcyB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisKKyAgICBAaXRlbSAtbHVsaWIgIAorICAgICAgICAgICAgICAgIExpbmsgd2l0aCBsaWJyYXJ5IEBmaWxle3VsaWJ9LgorCisgICAgQGl0ZW0gLUxwYXRoICAKKyAgICAgICAgICAgICAgICBBZGQgQGZpbGV7cGF0aH0gdG8gdGhlIGxpYnJhcnktc2VhcmNoLXBhdGguCisgICAgICAgICAgICBUaGlzIGlzIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBsaW5rZXIuCisKKyAgICBAaXRlbSAtc3RhdGljCisgICAgICAgICAgICAgICAgSW5zdHJ1Y3QgdGhlIGxpbmtlciB0byBsaW5rIGFnYWluc3Qgc3RhdGljIGxpYnJhcmllcy4KKyAgICAgICAgICAgICAgICBUaGlzIG1heSBvdmVycmlkZSB0aGUgZGVmYXVsdCB0byBsaW5rIGFnYWluc3QgZHluYW1pYworICAgICAgICAgICAgICAgIGxpYnJhcmllcyBmaXJzdC4KKworICAgIEBpdGVtIC1ub3N0ZGxpYiAgIAorICAgICAgICAgICAgICAgIERvIG5vdCBsaW5rIHdpdGggc3RhbmRhcmQtc3RhcnR1cC9saWJyYXJpZXMuIFVzZWZ1bCBvbmx5CisgICAgICAgICAgICAgICAgZm9yIHBlb3BsZSB3aG8ga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nLgorCisgICAgQGl0ZW0gLW5vdG1wZmlsZSAgCisgICAgICAgICAgICAgICAgRG8gbm90IHVzZSBuYW1lcyBmcm9tIHRtcG5hbSgpIGZvciB0ZW1wb3JhcnkgZmlsZXMuCisKKyAgICBAaXRlbSAtc2NoZWR1bGUgICAKKyAgICAgICAgICAgICAgICBJbnZva2UgdGhlIGluc3RydWN0aW9uLXNjaGVkdWxlciwgaWYgYXZhaWxhYmxlLgorCisgICAgQGl0ZW0gLXJtY2ZnLTxvcHQ+CisgICAgICAgICAgICAgICAgSWdub3JlIGFsbCBsaW5lcyBmcm9tIHRoZSBjb25maWcgZmlsZSBzdGFydGluZyB3aXRoIC08b3B0Pi4KKworICAgIEBpdGVtICtmaWxlICAgCisgICAgICAgIFVzZSBAZmlsZXtmaWxlfSBhcyBjb25maWctZmlsZS4KKworQGVuZCB0YWJsZQorCisKKyAgICBBbGwgb3RoZXIgb3B0aW9ucyBhcmUgcGFzc2VkIHRocm91Z2ggdG8gQGNvbW1hbmR7dmJjY30uCisKKworCisKKworQHNlY3Rpb24gQ29uZmlndXJhdGlvbgorCisgICAgQGNvbW1hbmR7dmN9IG5lZWRzIGEgY29uZmlnIGZpbGUgdG8ga25vdyBob3cgdG8gY2FsbCBhbGwgdGhlIHRyYW5zbGF0aW9uCisgICAgcGhhc2VzIChjb21waWxlciwgYXNzZW1ibGVyLCBsaW5rZXIpLiBVbmxlc3MgYSBkaWZmZXJlbnQgZmlsZSBpcworICAgIHNwZWNpZmllZCB1c2luZyB0aGUgQG9wdGlvbnsrfS1vcHRpb24sIGl0IHdpbGwgbG9vayBmb3IgYSBmaWxlCisgICAgQGZpbGV7dmMuY29uZmlnfSAoQGZpbGV7dmMuY2ZnfSBmb3IgRE9TL1dpbmRvd3MpLgorCisgICAgT24gQW1pZ2FPUyBAY29tbWFuZHt2Y30gd2lsbCBzZWFyY2ggaW4gdGhlIGN1cnJlbnQKKyAgICBkaXJlY3RvcnksIGluIEBmaWxle0VOVjp9IGFuZCBAZmlsZXtWQkNDOn0uCisKKyAgICBPbiBVbml4IEBjb21tYW5ke3ZjfSB3aWxsIHNlYXJjaCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgZm9sbG93ZWQKKyAgICBieSBAZmlsZXsvZXRjL30uCisKKyAgICBPbiBET1MvV2luZG93cyBpdCB3aWxsIHNlYXJjaCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisKKyAgICBJZiB0aGUgY29uZmlnIGZpbGUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgZGVmYXVsdCBzZWFyY2gtcGF0aHMgYW5kCisgICAgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgQGVudnskVkJDQ30gaXMgc2V0LCBAY29tbWFuZHt2Y30gd2lsbCBhbHNvIGxvb2sKKyAgICBpbiBAZW52eyRWQkNDfUBmaWxley9jb25maWd9LgorCisgICAgT25jZSBhIGNvbmZpZyBmaWxlIGlzIGZvdW5kLCBpdCB3aWxsCisgICAgYmUgdHJlYXRlZCBhcyBhIGNvbGxlY3Rpb24gb2YgYWRkaXRpb25hbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiBFdmVyeQorICAgIGxpbmUgb2YgdGhlIGZpbGUgd2lsbCBiZSB1c2VkIGFzIG9uZSBhcmd1bWVudC4gU28gbm8gcXVvdGluZyBzaGFsbCBiZQorICAgIHVzZWQgYW5kIGZ1cnRoZXJtb3JlIG11c3QgZWFjaCBhcmd1bWVudCBiZSBwbGFjZWQgb24gaXRzIG93biBsaW5lLgorCisKKyAgICBUaGUgZm9sbG93aW5nIG9wdGlvbnMgY2FuIGJlIHVzZWQgdG8gdGVsbCBAY29tbWFuZHt2Y30gaG93IHRvIGNhbGwgdGhlCisgICAgdHJhbnNsYXRpb24gcGhhc2VzICh0aGV5IHdpbGwgdXN1YWxseSBiZSBjb250YWluZWQgaW4gdGhlIGNvbmZpZy1maWxlKToKKworQHRhYmxlIEBvcHRpb24KKworICAgIEBpdGVtIC1wcD1zdHJpbmcKKyAgICAgICAgICAgICAgICBUaGUgcHJlcHJvY2Vzc29yIHdpbGwgYmUgY2FsbGVkIGxpa2UgaW4KKyAgICAgICAgICAgICAgICBAY29kZXtwcmludGYoc3RyaW5nLG9wdHMsaW5maWxlLG91dGZpbGUpfSwgZS5nLiB0aGUgZGVmYXVsdCBmb3IgQGNvbW1hbmR7dmNwcH0KKyAgICAgICAgICAgICAgICBzZWFyY2hpbmcgdGhlIGluY2x1ZGVzIGluIEBmaWxle3ZpbmNsdWRlOn0gYW5kIGRlZmluaW5nIEBjb2Rle19fU1REQ19ffSkKKyAgICAgICAgICAgICAgICBpcyBAb3B0aW9uey1wcD12Y3BwIC1JdmluY2x1ZGU6IC1EX19TVERDX189MSAlcyAlcyAlc30uCisgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoZXJlIGlzIGFuIGludGVybmFsIHByZXByb2Nlc3NvciwgY2FsbGVkCisgICAgICAgICAgICAgICAgQGNvbW1hbmR7dWNwcH0sIHNpbmNlIFYwLjgsIHlvdSB1c3VhbGx5IGRvbid0IG5lZWQgdGhpcworICAgICAgICAgICAgICAgIG9wdGlvbiBhbnkgbW9yZS4KKworICAgIEBpdGVtIC1jYz1zdHJpbmcKKyAgICAgICAgICAgICAgICBGb3IgdGhlIGNvbXBpbGVyLiBOb3RlIHRoYXQgeW91IGNhbm5vdCB1c2UgQGNvbW1hbmR7dmN9IHRvIGNhbGwKKyAgICAgICAgICAgICAgICBhbm90aGVyIGNvbXBpbGVyIHRoYW4gQGNvbW1hbmR7dmJjY30uIEJ1dCB5b3UgY2FuIGNhbGwgZGlmZmVyZW50CisgICAgICAgICAgICAgICAgdmVyc2lvbnMgb2YgQGNvbW1hbmR7dmJjY30gdGhpcyB3YXksIGUuZy46CisgICAgICAgICAgICAgICAgQG9wdGlvbnstY2M9dmJjY202OGsgLXF1aWV0fSBvcgorICAgICAgICAgICAgICAgIEBvcHRpb257LWNjPXZiY2NpMzg2IC1xdWlldH0KKworICAgIEBpdGVtIC1pc2M9c3RyaW5nCisgICAgICAgICAgICAgICAgVGhlIHNhbWUgZm9yIHRoZSBzY2hlZHVsZXIsIGUuZy46CisgICAgICAgICAgICAgICAgQG9wdGlvbnstaXNjPXZzY3BwYyAtcXVpZXQgJXMgJXN9CisgICAgICAgICAgICAgICAgT21pdCwgaWYgdGhlcmUgaXMgbm8gc2NoZWR1bGVyIGZvciB0aGUgYXJjaGl0ZWN0dXJlLgorCisgICAgQGl0ZW0gLWFzPXN0cmluZworICAgICAgICAgICAgICAgIFRoZSBzYW1lIGZvciB0aGUgYXNzZW1ibGVyLCBlLmcuOgorICAgICAgICAgICAgICAgIEBvcHRpb257LWFzPXZhc21tNjhrX21vdCAtcXVpZXQgLUZodW5rIC1waHhhc3MgLW9wdC1wZWEgLW9wdC1jbHIgJXMgLW8gJXN9IG9yCisgICAgICAgICAgICAgICAgQG9wdGlvbnstYXM9YXMgJXMgLW8gJXN9CisKKyAgICBAaXRlbSAtcm09c3RyaW5nIAorICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHN0cmluZyBmb3IgdGhlIGRlbGV0ZSBjb21tYW5kIGFuZCB0YWtlcyBvbmx5CisgICAgICAgICAgICAgICAgb25lIGFyZ3VtZW50LCBlLmcuCisgICAgICAgICAgICAgICAgQG9wdGlvbnstcm09ZGVsZXRlIHF1aWV0ICVzfSBvcgorICAgICAgICAgICAgICAgIEBvcHRpb257LXJtPXJtICVzfQorCisgICAgQGl0ZW0gLWxkPXN0cmluZworICAgICAgICAgICAgICAgIFRoaXMgaXMgZm9yIHRoZSBsaW5rZXIgYW5kIHRha2VzIHRocmVlIGFyZ3VtZW50cy4gVGhlIGZpcnN0CisgICAgICAgICAgICAgICAgb25lIGFyZSB0aGUgb2JqZWN0IGZpbGVzIChzZXBhcmF0ZWQgYnkgc3BhY2VzKSwgdGhlIHNlY29uZAorICAgICAgICAgICAgICAgIG9uZSB0aGUgdXNlciBzcGVjaWZpZWQgbGlicmFyaWVzIGFuZCB0aGUgbGFzdCBvbmUgdGhlIG5hbWUKKyAgICAgICAgICAgICAgICBvZiB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUuCisgICAgICAgICAgICAgICAgVGhpcyBoYXMgdG8gbGluayB3aXRoIHByb3BlciBzdGFydHVwLWNvZGUgYW5kIGMtbGlicmFyaWVzLAorICAgICAgICAgICAgICAgIGUuZy46CisgICAgICAgICAgICAgICAgQG9wdGlvbnstbGQ9dmxpbmsgLXggLUJzdGF0aWMgLUN2YmNjIC1ub3N0ZGxpYiAtTHZsaWJvczM6IHZsaWJvczM6c3RhcnR1cC5vICVzICVzIC1sdmMgLW8gJXN9IG9yCisgICAgICAgICAgICAgICAgQG9wdGlvbnstbGQ9bGQgL3Vzci9saWIvY3J0MC5vICVzICVzIC1sYyAtbyAlc30KKworICAgIEBpdGVtIC1sMj1zdHJpbmcKKyAgICAgICAgICAgICAgICBUaGUgc2FtZSBsaWtlIC1sZCwgYnV0IHN0YW5kYXJkLXN0YXJ0dXAgYW5kIC1saWJyYXJpZXMgc2hvdWxkCisgICAgICAgICAgICAgICAgbm90IGJlIGxpbmtlZDsgdXNlZCB3aGVuIC1ub3N0ZGxpYiBpcyBzcGVjaWZpZWQuCisKKyAgICBAaXRlbSAtbGRub2RiPXN0cmluZworICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIHN0cmluZyBpcyBpbnNlcnRlZCBpbiB0aGUgbGlua2VyIGNvbW1hbmQgYmVmb3JlCisgICAgICAgICAgICAgICAgc3BlY2lmeWluZyB0aGUgbGlicmFyaWVzLCB3aGVuZXZlciBhbiBleGVjdXRhYmxlIHdpdGhvdXQKKyAgICAgICAgICAgICAgICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYW5kIHN5bWJvbHMgc2hvdWxkIGJlIGNyZWF0ZWQgKEFLQQorICAgICAgICAgICAgICAgIGFzIGEgJ3N0cmlwcGVkJyBleGVjdXRhYmxlKS4KKworICAgIEBpdGVtIC1sZHN0YXRpYz1zdHJpbmcKKyAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBzdHJpbmcgaXMgaW5zZXJ0ZWQgaW4gdGhlIGxpbmtlciBjb21tYW5kIGJlZm9yZQorICAgICAgICAgICAgICAgIHNwZWNpZnlpbmcgdGhlIGxpYnJhcmllcyB3aGVuIHN0YXRpYyBsaW5raW5nIHdhcyByZXF1ZXN0ZWQKKyAgICAgICAgICAgICAgICB3aXRoIG9wdGlvbiBAb3B0aW9uey1zdGF0aWN9LgorICAgICAgICAgICAgICAgIAorQGVuZCB0YWJsZQorCisgICAgQWxsIHRob3NlIHN0cmluZ3Mgc2hvdWxkIHRlbGwgdGhlIGNvbW1hbmQgdG8gb21pdCBhbnkgb3V0cHV0IGFwYXJ0IGZyb20KKyAgICBlcnJvciBtZXNzYWdlcyBpZiBwb3NzaWJsZS4gSG93ZXZlciBmb3IgZXZlcnkgb2YgdGhvc2Ugb3B0aW9ucyB0aGVyZQorICAgIGV4aXN0cyBvbmUgd2l0aCBhbiBhZGRpdGlvbmFsIEBzYW1we3Z9LCBpLmUuIEBvcHRpb257LXBwdj19LCBAb3B0aW9uey1hc3Y9fSwgZXRjLiB3aGljaCBzaG91bGQKKyAgICBwcm9kdWNlIHNvbWUgb3V0cHV0LCBpZiBwb3NzaWJsZS4KKyAgICBJZiB2YyBpcyBpbnZva2VkIHdpdGggdGhlIEBvcHRpb257LXZ2fSBvcHRpb24gdGhlIHZlcmJvc2UgY29tbWFuZHMgd2lsbCBiZSBjYWxsZWQsCisgICAgaWYgbm90IHRoZSBxdWlldCBvbmVzIHdpbGwgYmUgdXNlZC4KKworQHRhYmxlIEBzYW1wCisgICAgQGl0ZW0gLXVsPXN0cmluZyAgCisgICAgICAgICAgICAgICAgRm9ybWF0IGZvciBhZGRpdGlvbmFsIGxpYnJhcmllcyBzcGVjaWZpZWQgd2l0aCBAb3B0aW9uey1sPGxpYj59LgorICAgICAgICAgICAgICAgIFRoZSByZXN1bHQgb2YgQGNvZGV7cHJpbnRmKHN0cmluZyxsaWIpfSB3aWxsIGJlIGFkZGVkIHRvIHRoZQorICAgICAgICAgICAgICAgIGNvbW1hbmQgaW52b2tpbmcgdGhlIGxpbmtlci4gRXhhbXBsZXMgYXJlOgorICAgICAgICAgICAgICAgIEBvcHRpb257LXVsPXZsaWI6JXMubGlifSBvciBAb3B0aW9uey11bD0tbCVzfQorCitAZW5kIHRhYmxlCisKZGlmZiAtLWdpdCBhL2RvYy92Y2xpYi50ZXhpIGIvZG9jL3ZjbGliLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVkZmYzZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy92Y2xpYi50ZXhpCkBAIC0wLDAgKzEsMjgxOCBAQAorVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyB0aGUgQyBsaWJyYXJ5IHVzdWFsbHkgcHJvdmlkZWQgd2l0aCBAY29tbWFuZHt2YmNjfS4KKworCitAc2VjdGlvbiBJbnRyb2R1Y3Rpb24KKworVG8gZXhlY3V0ZSBjb2RlIGNvbXBpbGVkIGJ5IEBjb21tYW5ke3ZiY2N9LCBhIGxpYnJhcnkgaXMgbmVlZGVkLiBJdAorcHJvdmlkZXMgYmFzaWMgaW50ZXJmYWNlcyB0byB0aGUgdW5kZXJseWluZyBvcGVyYXRpbmcgc3lzdGVtIG9yCitoYXJkd2FyZSBhcyB3ZWxsIGFzIGEgc2V0IG9mIG9mdGVuIHVzZWQgZnVuY3Rpb25zLgorCitBIGJpZyBwYXJ0IG9mIHRoZSBsaWJyYXJ5IGlzIHBvcnRhYmxlIGFjcm9zcyBhbGwgYXJjaGl0ZWN0dXJlcy4gSG93ZXZlciwKK3NvbWUgZnVuY3Rpb25zIChlLmcuIGZvciBpbnB1dC9vdXRwdXQgb3IgbWVtb3J5IGFsbG9jYXRpb24pIGFyZQorbmF0dXJhbGx5IGRlcGVuZGVudCBvbiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvciBoYXJkd2FyZS4gVGhlcmUgYXJlCitzZXZlcmFsIHNlY3Rpb25zIGluIHRoaXMgY2hhcHRlciBkZWFsaW5nIHdpdGggZGlmZmVyZW50IHZlcnNpb25zIG9mCit0aGUgbGlicmFyeS4KKworVGhlIGxpYnJhcnkgaXRzZWxmIG9mdGVuIGlzIHNwbGl0IGludG8gc2V2ZXJhbCBwYXJ0cy4gQSBzdGFydHVwLWNvZGUKK3dpbGwgZG8gdXNlZnVsIGluaXRpYWxpemF0aW9ucywgbGlrZSBzZXR0aW5nIHVwIElPLCBwYXJzaW5nIHRoZSBjb21tYW5kCitsaW5lIG9yIGluaXRpYWxpemluZyB2YXJpYWJsZXMgYW5kIGhhcmR3YXJlLgorCitUaGUgYmlnZ2VzdCBwYXJ0IG9mIHRoZSBmdW5jdGlvbnMgd2lsbCB1c3VhbGx5IGJlIHN0b3JlZCBpbiBvbmUgbGlicmFyeSBmaWxlLgorVGhlIG5hbWUgYW5kIGZvcm1hdCBvZiB0aGlzIGZpbGUgZGVwZW5kcyBvbiB0aGUgY29udmVudGlvbnMgb2YgdGhlIHVuZGVybHlpbmcKK3N5c3RlbSAoZS5nLiBAZmlsZXt2Yy5saWJ9IG9yIEBmaWxle2xpYnZjLmF9KS4KKworT2Z0ZW4sIGZsb2F0aW5nIHBvaW50IGNvZGUgKGlmIGF2YWlsYWJsZSkgaXMgc3RvcmVkIGluIGEgZGlmZmVyZW50IGZpbGUKKyhlLmcuIEBmaWxle20ubGlifSBvciBAZmlsZXtsaWJtLmF9KS4gSWYgZmxvYXRpbmcgcG9pbnQgaXMgdXNlZCBpbiBhbgorYXBwbGljYXRpb24sIGl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byBleHBsaWNpdGx5IGxpbmsgd2l0aCB0aGlzIGxpYnJhcnkKKyhlLmcuIGJ5IHNwZWNpZnlpbmcgQGZpbGV7LWxtfSkuCisKK0luIG1hbnkgY2FzZXMsIHRoZSBpbmNsdWRlIGZpbGVzIHByb3ZpZGUgc3BlY2lhbCBpbmxpbmUtY29kZSBvciBzaW1pbGFyCitvcHRpbWl6YXRpb25zLiBUaGVyZWZvcmUsIGl0IGlzIHJlY29tbWVuZGVkIHRvIGFsd2F5cyBpbmNsdWRlIHRoZQorY29ycmVzcG9uZGluZyBpbmNsdWRlIGZpbGUgd2hlbiB1c2luZyBhIGxpYnJhcnkgZnVuY3Rpb24uIEV2ZW4gaWYgaXQKK2lzIG5vdCBuZWNlc3NhcnkgaW4gYWxsIGNhc2VzLCBpdCBtYXkgYWZmZWN0IHRoZSBxdWFsaXR5IG9mIHRoZSBnZW5lcmF0ZWQKK2NvZGUuCisKK1RoZSBsaWJyYXJ5IGltcGxlbWVudHMgdGhlIGZ1bmN0aW9ucyBzcGVjaWZpZWQgYnkgSVNPOTg5OToxOTg5IGFzIHdlbGwKK2FzIGEgcGFydCBvZiB0aGUgbmV3IGZ1bmN0aW9ucyBmcm9tIElTTzk4OTk6MTk5OS4KKworQHNlY3Rpb24gTGVnYWwKKworTW9zdCBwYXJ0cyBvZiB0aGlzIGxpYnJhcnkgYXJlIHB1YmxpYyBkb21haW4uIEhvd2V2ZXIsIGZvciBzb21lIHN5c3RlbXMsCitwYXJ0cyBtYXkgYmUgdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZS4gUGxlYXNlIGNvbnN1bHQgdGhlIHN5c3RlbQorc3BlY2lmaWMgZG9jdW1lbnRhdGlvbi4gVXN1YWxseSwgbGlua2luZyBhZ2FpbnN0IHRoaXMgbGlicmFyeSB3aWxsCitub3QgcHV0IGFueSByZXN0cmljdGlvbnMgb24gdGhlIGNyZWF0ZWQgZXhlY3V0YWJsZSB1bmxlc3Mgb3RoZXJ3aXNlCittZW50aW9uZWQuCisKK1BhcnRzIG9mIHRoZSBtYXRoIGxpYnJhcnkgKGUuZy4gdHJhbnNjZW5kZW50YWwgZnVuY3Rpb25zKSBhcmUgZGVyaXZlZAorZnJvbSBTdW4ncyBmcmVlIG1hdGggbGlicmFyeToKK0BleGFtcGxlCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIERldmVsb3BlZCBhdCBTdW5Qcm8sIGEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBidXNpbmVzcy4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIAorICogaXMgcHJlc2VydmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQGVuZCBleGFtcGxlCisKK0Bub2RlIFNvZnRmbG9hdEhhdXNlcgorVGhlIHNvZnRmbG9hdCBmdW5jdGlvbnMsIHVzZWQgYnkgc29tZSB0YXJnZXRzLCBhcmUgZGVyaXZlZCBmcm9tIEpvaG4KK0hhdXNlcidzIElFQy9JRUVFIEZsb2F0aW5nLXBvaW50IEFydGl0aG1ldGljIFBhY2thZ2U6CisKK0BleGFtcGxlCitUaGlzIEMgc291cmNlIGZpbGUgaXMgcGFydCBvZiB0aGUgU29mdEZsb2F0IElFQy9JRUVFIEZsb2F0aW5nLXBvaW50CitBcml0aG1ldGljIFBhY2thZ2UsIFJlbGVhc2UgMi4KKworV3JpdHRlbiBieSBKb2huIFIuIEhhdXNlci4gIFRoaXMgd29yayB3YXMgbWFkZSBwb3NzaWJsZSBpbiBwYXJ0IGJ5IHRoZQorSW50ZXJuYXRpb25hbCBDb21wdXRlciBTY2llbmNlIEluc3RpdHV0ZSwgbG9jYXRlZCBhdCBTdWl0ZSA2MDAsIDE5NDcgQ2VudGVyCitTdHJlZXQsIEJlcmtlbGV5LCBDYWxpZm9ybmlhIDk0NzA0LiAgRnVuZGluZyB3YXMgcGFydGlhbGx5IHByb3ZpZGVkIGJ5IHRoZQorTmF0aW9uYWwgU2NpZW5jZSBGb3VuZGF0aW9uIHVuZGVyIGdyYW50IE1JUC05MzExOTgwLiAgVGhlIG9yaWdpbmFsIHZlcnNpb24KK29mIHRoaXMgY29kZSB3YXMgd3JpdHRlbiBhcyBwYXJ0IG9mIGEgcHJvamVjdCB0byBidWlsZCBhIGZpeGVkLXBvaW50IHZlY3RvcgorcHJvY2Vzc29yIGluIGNvbGxhYm9yYXRpb24gd2l0aCB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhIGF0IEJlcmtlbGV5LAorb3ZlcnNlZW4gYnkgUHJvZnMuIE5lbHNvbiBNb3JnYW4gYW5kIEpvaG4gV2F3cnp5bmVrLiAgTW9yZSBpbmZvcm1hdGlvbgoraXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdlYiBwYWdlIGBodHRwOi8vSFRUUC5DUy5CZXJrZWxleS5FRFUvfmpoYXVzZXIvCithcml0aG1ldGljL3NvZnRmbG9hdC5odG1sJy4KKworVEhJUyBTT0ZUV0FSRSBJUyBESVNUUklCVVRFRCBBUyBJUywgRk9SIEZSRUUuICBBbHRob3VnaCByZWFzb25hYmxlIGVmZm9ydAoraGFzIGJlZW4gbWFkZSB0byBhdm9pZCBpdCwgVEhJUyBTT0ZUV0FSRSBNQVkgQ09OVEFJTiBGQVVMVFMgVEhBVCBXSUxMIEFUCitUSU1FUyBSRVNVTFQgSU4gSU5DT1JSRUNUIEJFSEFWSU9SLiAgVVNFIE9GIFRISVMgU09GVFdBUkUgSVMgUkVTVFJJQ1RFRCBUTworUEVSU09OUyBBTkQgT1JHQU5JWkFUSU9OUyBXSE8gQ0FOIEFORCBXSUxMIFRBS0UgRlVMTCBSRVNQT05TSUJJTElUWSBGT1IgQU5ZCitBTkQgQUxMIExPU1NFUywgQ09TVFMsIE9SIE9USEVSIFBST0JMRU1TIEFSSVNJTkcgRlJPTSBJVFMgVVNFLgorCitEZXJpdmF0aXZlIHdvcmtzIGFyZSBhY2NlcHRhYmxlLCBldmVuIGZvciBjb21tZXJjaWFsIHB1cnBvc2VzLCBzbyBsb25nIGFzCisoMSkgdGhleSBpbmNsdWRlIHByb21pbmVudCBub3RpY2UgdGhhdCB0aGUgd29yayBpcyBkZXJpdmF0aXZlLCBhbmQgKDIpIHRoZXkKK2luY2x1ZGUgcHJvbWluZW50IG5vdGljZSBha2luIHRvIHRoZXNlIHRocmVlIHBhcmFncmFwaHMgZm9yIHRob3NlIHBhcnRzIG9mCit0aGlzIGNvZGUgdGhhdCBhcmUgcmV0YWluZWQuCitAZW5kIGV4YW1wbGUKKworCitAc2VjdGlvbiBHbG9iYWwgVmFyaWFibGVzCisKK0BzdWJzZWN0aW9uIHRpbWV6b25lCisKK09uIHNvbWUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtcyB2Y2xpYiBtaWdodCBiZSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZQorY3VycmVudCB0aW1lIHpvbmUsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBmdW5jdGlvbnMgbGlrZQorQGNvZGV7bWt0aW1lKCl9IG9yIEBjb2Rle2xvY2FsdGltZSgpfSB0byB3b3JrLiBIZXJlIHlvdSBjYW4gb3ZlcndyaXRlCit0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKKworQHRhYmxlIEBjb2RlCitAaXRlbSBsb25nIF9fZ210b2Zmc2V0CisgIE9mZnNldCBpbiBtaW51dGVzLCB3ZXN0IG9mIEdyZWVud2ljaCBNZWFuIFRpbWUgKEdNVCkuCitAaXRlbSBpbnQgX19kc3RmbGFnCisgIFNldCB0byBub24temVybywgd2hlbiBEYXlsaWdodCBTYXZpbmcgVGltZSBpcyBhY3RpdmUuCitAZW5kIHRhYmxlCisKK1RhcmdldHMgd2hpY2ggY2FuIGRldGVybWluZSB0aGVpciBjdXJyZW50IHRpbWUgem9uZSwgd2lsbCBkbyBzbyBieQoraW5pdGlhbGl6aW5nIHRoZXNlIHZhcmlhYmxlcyBvbiBzdGFydHVwLgorCisKK0BzZWN0aW9uIEVtYmVkZGVkIFN5c3RlbXMKKworVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBzcGVjaWZpY3Mgb2YgdGhlIEMgbGlicmFyeSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4KKworQHN1YnNlY3Rpb24gU3RhcnR1cAorCitUaGUgc3RhcnR1cCBpcyB1c3VhbGx5IHNwbGl0IGludG8gdHdvIHBhcnRzLiBUaGUgZmlyc3QgcGFydCBpcyBkb25lIGJ5Cithc3NlbWJseSBjb2RlIHRoYXQgcHJvZHVjZXMgdGhlIG9iamVjdCBmaWxlIEBmaWxle2xpYi9zdGFydHVwLm99LiBUaGlzCithc3NlbWJseSBjb2RlIGlzIHVzdWFsbHkgcHJvdmlkZWQgd2l0aCB2YmNjIGFuZCBtYXkgaGF2ZSB0byBiZSBhZGFwdGVkIHRvCit0aGUgaGFyZHdhcmUgeW91IGFyZSB1c2luZy4gVGhlIGtleSBhY3Rpb25zIHRoYXQgaGF2ZSB0byBiZSBwZXJmb3JtZWQgYnkgdGhpcworY29kZSBhcmU6CisKK0B0YWJsZSBAbWludXMKK0BpdGVtIGhhcmR3YXJlIGluaXRpYWxpemF0aW9uCisgICAgICAgIEl0IG1heSBiZSBuZWNlc3NhcnkgdG8gcGVyZm9ybSBzb21lIGhhcmR3YXJlIGluaXRpYWxpemF0aW9uIHJpZ2h0CisgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcsIGUuZy4gdG8gY29uZmlndXJlIHRoZSBtZW1vcnkgc3lzdGVtLiBUaGlzIGhhcyB0bworICAgICAgICBiZSBtb2RpZmllZCBieSB0aGUgdXNlci4KKworQGl0ZW0gdmFyaWFibGUgaW5pdGlhbGl6YXRpb25zCisgICAgICAgIFdoZW4gcnVubmluZyBjb2RlIGZyb20gUk9NLCBzb21lIG1lbW9yeSBzZWN0aW9ucyBoYXZlIHRvIGJlCisgICAgICAgIGluaXRpYWxpemVkLiBVc3VhbGx5LCB0aGUgaW5pdC12YWx1ZXMgb2YgaW5pdGlhbGl6ZWQgdmFyaWFibGVzCisgICAgICAgIGhhdmUgdG8gYmUgY29waWVkIGZyb20gUk9NIHRvIHRoZSBkYXRhIHNlZ21lbnQgYW5kIHRoZSB2YWx1ZXMgb2YKKyAgICAgICAgdW4taW5pdGlhbGl6ZWQgdmFyaWFibGVzIGhhdmUgdG8gYmUgY2xlYXJlZCBpbiB0aGUgYnNzIHNlZ21lbnQuCisgICAgICAgIFRoaXMgY29kZSBpcyB1c3VhbGx5IHByb3ZpZGVkIGluIHRoZSBzdGFydHVwIGNvZGUuCisKK0BpdGVtIHN0YWNrIHBvaW50ZXIKKyAgICAgICAgVGhlIHN0YWNrIHBvaW50ZXIgaGFzIHRvIGJlIHNldCB0byBhIHN1aXRhYmxlIG1lbW9yeSBhcmVhLgorICAgICAgICBUaGUgc3RhcnR1cCBjb2RlCisgICAgICAgIHdpbGwgc2V0IHRoZSBzdGFjayBwb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiB0aGUgcG9pbnRlciBAY29kZXtfX3N0YWNrfS4KKyAgICAgICAgVGhlcmUgaXMgYSBkZWZhdWx0IHN0YWNrIHByb3ZpZGVkIGluIHRoZSBDIGxpYnJhcnkgd2hpY2ggd2lsbCBiZSB1c2VkCisgICAgICAgIHVubGVzcyB0aGUgYXBwbGljYXRpb24gZGVmaW5lcyBpdHMgb3duIHN0YWNrIHVzaW5nLCBmb3IgZXhhbXBsZSwgdGhlCisgICAgICAgIGZvbGxvd2luZyBjb2RlIChhc3N1bWluZyB0aGF0IHRoZSBzdGFjayBncm93cyBkb3dud2FyZHMpOgorQGV4YW1wbGUKKyNkZWZpbmUgU1RBQ0tTSVpFIDx3aGF0ZXZlcj4KKworc3RhdGljIGxvbmcgbXlzdGFja1tTVEFDS1NJWkUvc2l6ZW9mKGxvbmcpXTsKK2NoYXIgKl9fc3RhY2s9KChjaGFyKilteXN0YWNrKStTVEFDS1NJWkU7CitAZW5kIGV4YW1wbGUKKworQGl0ZW0gY2FsbGluZyBAY29kZXtfX21haW59CisgICAgICAgIEFmdGVyIGFsbCB0aGUgYWJvdmUgaW5pdGlhbGl6YXRpb25zIGhhdmUgYmVlbiBwZXJmb3JtZWQsIHRoZSBmdW5jdGlvbgorICAgICAgICBAY29kZXtfX21haW4oKX0gaGFzIHRvIGJlIGNhbGxlZC4gVGhpcyBmdW5jdGlvbiBpcyBwcm92aWRlZCBieSB0aGUKKyAgICAgICAgbGlicmFyeSBhbmQgcGVyZm9ybXMgaGlnaC1sZXZlbCBpbml0aWFsaXphdGlvbnMsIGlmIG5lY2Vzc2FyeSAobWFpbmx5CisgICAgICAgIGl0IGNhbGxzIGNvbnN0cnVjdG9ycyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXIpIGFuZCB3aWxsIHRoZW4gY2FsbCB0aGUKKyAgICAgICAgdXNlciBAY29kZXttYWluKCl9IGZ1bmN0aW9uLiBOb3RlIHRoYXQgdGhlIGxpYnJhcnkKKyAgICAgICAgbWF5IG5vdCB3b3JrIGNvcnJlY3RseSBpZiB0aGUgdXNlciBAY29kZXttYWluKCl9IGZ1bmN0aW9uIGlzIGNhbGxlZAorICAgICAgICBkaXJlY3RseSBmcm9tIHRoZSBzdGFydHVwIGNvZGUuCisKK0BlbmQgdGFibGUKKworQHN1YnNlY3Rpb24gSGVhcAorCitXaGVuIGR5bmFtaWMgbWVtb3J5IG1hbmFnZW1lbnQgaXMgdXNlZCAoZS5nLiBieSB1c2luZyB0aGUgQGNvZGV7bWFsbG9jKCl9CitmdW5jdGlvbiksIGEgaGVhcCBtZW1vcnkgYXJlYSBpcyBuZWVkZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZyb20uIFRoZQorQGNvZGV7bWFsbG9jKCl9IGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBAY29kZXtfX2hlYXBwdHJ9IGlzIGEgdmFyaWFibGUgcG9pbnRpbmcKK3RvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGhlYXAgbWVtb3J5IGFuZCB0aGF0IEBjb2Rle19faGVhcHNpemV9IHNwZWNpZmllcwordGhlIHNpemUgb2YgdGhlIGhlYXAgYXJlYSBpbiBieXRlcy4gVGhlIGxpYnJhcnkgd2lsbCBwcm92aWRlIGEgZGVmYXVsdCBoZWFwCittZW1vcnkgYXJlYSB0aGF0IGNhbiBiZSByZXBsYWNlZCBieSBhZGRpbmcsIGZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGZpbGUKK3RvIHRoZSBhcHBsaWNhdGlvbjoKK0BleGFtcGxlCisjZGVmaW5lIEhFQVBTSVpFIDx3aGF0ZXZlcj4KKworY2hhciBfX2hlYXBbSEVBUFNJWkVdLCpfX2hlYXBwdHI9X19oZWFwOworc2l6ZV90IF9faGVhcHNpemU9SEVBUFNJWkU7CitAZW5kIGV4YW1wbGUKKworCitAc3Vic2VjdGlvbiBJbnB1dC9PdXRwdXQKKworVGhlIHN0YW5kYXJkIEMgaW5wdXQvb3V0cHV0IGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgYWxzbyBmb3IgZW1iZWRkZWQgc3lzdGVtcy4KK1JlYWRpbmcvd3JpdGluZyB0byBhIHN0cmVhbSB3aWxsIGJlIGRpcmVjdGVkIHRvIHZvaWQgdW5sZXNzIHRoZSBmb2xsb3dpbmcKK2xvdy1sZXZlbCBJL08tZnVuY3Rpb25zIGFyZSBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb246CitAZXhhbXBsZQoraW50IF9fb3Blbihjb25zdCBjaGFyICpuYW1lLGNvbnN0IGNoYXIgKm1vZGUpOwordm9pZCBfX2Nsb3NlKGludCBoKTsKK3NpemVfdCBfX3JlYWQoaW50IGgsY2hhciAqcCxzaXplX3QgbCk7CitzaXplX3QgX193cml0ZShpbnQgaCxjb25zdCBjaGFyICpwLHNpemVfdCBsKTsKK29mZl90IF9fc2VlayhpbnQgaCxvZmZfdCBvZmZzZXQsaW50IG9yaWdpbik7CitAZW5kIGV4YW1wbGUKKworVGhlIEBjb2Rle19fb3BlbigpfSBmdW5jdGlvbiByZWNlaXZlcyBhIG5hbWUgYW5kIGEgbW9kZSBzdHJpbmcgKGFzIGluIHRoZSBDCitAY29kZXtmb3BlbigpfSBmdW5jdGlvbikgYXMgYXJndW1lbnRzIGFuZCBoYXMgdG8gcmV0dXJuIGEgZmlsZS1kZXNjcmlwdG9yIGlmCitpdCBpcyBwb3NzaWJsZSB0byBvcGVuIHRoaXMgZmlsZS4gVGhlIG90aGVyIGZ1bmN0aW9ucyBhcmUgZXF1aXZhbGVudCB0byB0aGUKK2NvcnJlc3BvbmRpbmcgUE9TSVggZnVuY3Rpb25zLiBAY29kZXtfX3NlZWt9IGNhbiBiZSBpbXBsZW1lbnRlZCB0byByZXR1cm4gCitAY29kZXstMX0gaWYgdGhlIGZ1bmN0aW9uYWxpdHkgaXMgbm90IG5lZWRlZC4KKworQWxzbywgQGNvZGV7c3RkaW4sIHN0ZG91dH0gYW5kIEBjb2Rle3N0ZGVycn0gY2FuIGJlIHVzZWQgd2l0aCB0aGUgc3RhbmRhcmQKK2Rlc2NyaXB0b3JzLgorCitAc3Vic2VjdGlvbiBDVFJMLUMgSGFuZGxpbmcKKworU29tZSB0YXJnZXRzIGltcGxlbWVudCBoYW5kbGVycyB0byB0ZXJtaW5hdGUgdGhlIHByb2dyYW0gb24gY3RybC1jIG9yIGEKK3NpbWlsYXIgc2lnbmFsLiBUaGlzIHVzdWFsbHkgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBjYWxsaW5nCitAY29kZXtleGl0KDIwKX0uCisKK0lmIHlvdSB3YW50IHRvIGNoYW5nZSBvciBkaXNhYmxlIHRoZSBjdHJsLWMgaGFuZGxpbmcsIHlvdSBjYW4gb3ZlcndyaXRlCit0aGUgZnVuY3Rpb24gQGNvZGV7dm9pZCBfY2hrYWJvcnQodm9pZCl9LgorCitAc3Vic2VjdGlvbiBGbG9hdGluZyBQb2ludAorCitXaGV0aGVyIGZsb2F0aW5nIHBvaW50IGlzIHN1cHBvcnRlZCwgZGVwZW5kcyBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBhbmQKK2NoaXAuIElmIGl0IGlzIHN1cHBvcnRlZCwgdGhlcmUgd2lsbCB1c3VhbGx5IGJlIGEgbWF0aC1saWJyYXJ5IHRoYXQgaGFzIHRvCitiZSBsaW5rZWQgKHVzaW5nIG9wdGlvbiBAb3B0aW9uey1sbX0pIHdoZW4gZmxvYXRpbmcgcG9pbnQgaXMgdXNlZC4KKworQHN1YnNlY3Rpb24gVXNlbGVzcyBGdW5jdGlvbnMKKworT2YgY291cnNlLCBzb21lIG9mIHRoZSBDIGxpYnJhcnkgZnVuY3Rpb25zIGNhbiBub3QgYmUgaW1wbGVtZW50ZWQgcmVhc29uYWJseSBvbgorZW1iZWRkZWQgc3lzdGVtcy4gVGhlc2UgZnVuY3Rpb25zIGFyZSBjb250YWluZWQgaW4gdGhlIGxpYnJhcnkgYnV0IHdpbGwKK2Fsd2F5cyByZXR1cm4gYW4gZXJyb3IgdmFsdWUuIE1haW5seSBhZmZlY3RlZCBhcmU6CisKK0B0YWJsZSBAbWludXMKK0BpdGVtIGxvY2FsZQorQGl0ZW0gdGltZQorQGl0ZW0gc2lnbmFsCitAaXRlbSBmaWxlc3lzdGVtIGZ1bmN0aW9ucworQGVuZCB0YWJsZQorCitEZXBlbmRpbmcgb24gdGhlIGhhcmR3YXJlIHByb3ZpZGVkIGJ5IGEgc3lzdGVtIGl0IGlzIHBvc3NpYmxlIHRvIGltcGxlbWVudAordGhlc2UgZnVuY3Rpb25zIGFuZCBhZGQgdGhlbSB0byB0aGUgYXBwbGljYXRpb24uIEluIHRoaXMgY2FzZSwgdGhlIG5ldworZnVuY3Rpb25zIHdpbGwgYmUgdXNlZCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCBvbmVzIHJldHVybmluZyBvbmx5IGVycm9yCit2YWx1ZXMuCisKK0BzdWJzZWN0aW9uIExpbmtpbmcvTG9jYXRpbmcKKworVG8gcHJvZHVjZSBST00gaW1hZ2VzIChlLmcuIGluIHRoZSBmb3JtIG9mIGFic29sdXRlIEVMRiBleGVjdXRhYmxlcywgSW50ZWwKK0hleCBmaWxlcyBvciBNb3Rvcm9sYSBTLVJlY29yZHMpLCB0aGUgbGlua2VyIGlzIGNhbGxlZCB3aXRoIGEgbGlua2VyIHNjcmlwdC4KK1RoaXMgc2NyaXB0IGNhbiBiZSB1c2VkIHRvIGpvaW4gdG9nZXRoZXIgZGlmZmVyZW50IHNlY3Rpb25zIG9mIHRoZSBpbnB1dCBmaWxlcworYW5kIGxvY2F0ZSB0aGVtIHRvIHN1aXRhYmxlIGFic29sdXRlIG1lbW9yeSBhcmVhcy4gQWxzbywgdGhpcyBsaW5rZXIgc2NyaXB0CitjYW4gYmUgdXNlZCB0byBzZXQgc3ltYm9scyB0aGF0IG1heSBiZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBvciB0aGUgc3RhcnR1cAorY29kZSwgZS5nLiBhZGRyZXNzZXMgb2YgZGF0YSBzZWN0aW9ucywgaW5pdGlhbGl6YXRpb24gdmFsdWVzIG9yIHNtYWxsIGRhdGEKK3BvaW50ZXJzLgorCitDb2RlIG9yIGRhdGEgdGhhdCBoYXMgdG8gcmVzaWRlIGF0IHNwZWNpYWwgbG9jYXRpb25zIGNhbiBiZSBwdXQgaW50byBhIHNwZWNpYWwKK3NlY3Rpb24gdXNpbmcgdGhlIEBjb2Rle19fc2VjdGlvbn0gYXR0cmlidXRlLiBUaGlzIHNlY3Rpb24gY2FuIHRoZW4gYmUKK3BsYWNlZCBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiB1c2luZyB0aGUgbGlua2VyIHNjcmlwdC4KKworVXN1YWxseSwgYW4gZXhhbXBsZSBsaW5rZXIgc2NyaXB0IHdpbGwgYmUgcHJvdmlkZWQuIFdoaWxlIHRoaXMgaXMgb2Z0ZW4gbm90CitzdWl0YWJsZSBmb3IgZGlmZmVyZW50IGNoaXBzLCBpdCBtYXkgc2VydmUgYXMgYSBzdGFydGluZyBwb2ludC4KKworCitAc2VjdGlvbiBBbWlnYU9TLzY4aworCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHNwZWNpZmljcyBvZiB0aGUgQyBsaWJyYXJ5IGZvciBBbWlnYU9TLzY4aworcHJvdmlkZWQgYnkgdGhlIHRhcmdldCBAZmlsZXttNjhrLWFtaWdhb3N9LgorVGhlIHJlbGV2YW50IGZpbGVzIGFyZSBAZmlsZXtzdGFydHVwLm99LCBAZmlsZXttaW5zdGFydC5vfSwgQGZpbGV7bWlucmVzLm99LAorQGZpbGV7dmMubGlifSwgQGZpbGV7dmNzLmxpYn0sIEBmaWxle21pZWVlLmxpYn0sIEBmaWxle21pZWVlcy5saWJ9LAorQGZpbGV7bTg4MS5saWJ9LCBAZmlsZXttODgxcy5saWJ9LCBAZmlsZXttMDQwLmxpYn0sIEBmaWxle20wNDBzLmxpYn0sCitAZmlsZXttMDYwLmxpYn0sIEBmaWxle20wNjBzLmxpYn0sIEBmaWxle21zb2Z0LmxpYn0sIEBmaWxle21zb2Z0cy5saWJ9LAorQGZpbGV7YW1pZ2EubGlifSwgQGZpbGV7YW1pZ2FzLmxpYn0sIEBmaWxle2F1dG8ubGlifSBhbmQgQGZpbGV7YXV0b3MubGlifSwKK0BmaWxle3JlYWN0aW9uLmxpYn0sIEBmaWxle3JlYWN0aW9ucy5saWJ9LgorCitOb3RlIHRoYXQgQGZpbGV7ZXh0cmEubGlifSBpcyBubyBsb25nZXIgcGFydCBvZiB0aGUgdmJjYyBkaXN0cmlidXRpb24uCitJdCB3YXMgcmVwbGFjZWQgYnkgJ1Bvc2l4TGliJywgYXZhaWxhYmxlIG9uIEFtaW5ldAorQGZpbGV7ZGV2L2MvdmJjY19Qb3NpeExpYi5saGF9LCB3aGljaCBoYXMgYSBtdWNoIG1vcmUgY29tcHJlaGVuc2l2ZQorc3VwcG9ydCBmb3IgUE9TSVggYW5kIFVuaXggZnVuY3Rpb25zLgorCitUaGUgZm9sbG93aW5nIGNvbmZpZyBmaWxlcyBhcmUgYXZhaWxhYmxlOgorQHRhYmxlIEBjb2RlCitAaXRlbSBhb3M2OGsKKyAgU3RhbmRhcmQgc3RhcnR1cCBjb2RlIChAZmlsZXtzdGFydHVwLm99KSB3aXRoIGNvbW1hbmQgbGluZSBwYXJzaW5nCisgIGFuZCBvcHRpb25hbCBXb3JrYmVuY2ggc3RhcnR1cCAoQHhyZWZ7U3RhbmRhcmQgU3RhcnR1cH0pLgorQGl0ZW0gYW9zNjhrbQorICBNaW5pbWFsIHN0YXJ0dXAgY29kZSAoQGZpbGV7bWluc3RhcnQub30pIHdpdGhvdXQgY29tbWFuZCBsaW5lCisgIHBhcnNpbmcuIFlvdSBoYXZlIHRvIG9wZW4gYWxsIGxpYnJhcmllcyB5b3Vyc2VsZiAoQHhyZWZ7TWluaW1hbCBTdGFydHVwfSkuCitAaXRlbSBhb3M2OGtyCisgIE1pbmltYWwgc3RhcnR1cCBjb2RlIChAZmlsZXttaW5yZXMub30pIGZvciByZXNpZGVudCBwcm9ncmFtcy4KKyAgQWx3YXlzIGNvbXBpbGVzIGluIHNtYWxsIGRhdGEgbW9kZSBhbmQgbGlua3Mgd2l0aCBAZmlsZXt2Y3MubGlifQorICAoQHhyZWZ7TWluaW1hbCBSZXNpZGVudH0pLgorQGVuZCB0YWJsZQorCitAbm9kZSBTdGFuZGFyZCBTdGFydHVwCitAc3Vic2VjdGlvbiBTdGFydHVwCisKKyAgICBUaGUgc3RhcnR1cCBjb2RlIGN1cnJlbnRseSBjb25zaXN0cyBvZiBhIHNsaWdodGx5IG1vZGlmaWVkIHN0YW5kYXJkCisgICAgQW1pZ2Egc3RhcnR1cCAoQGZpbGV7c3RhcnR1cC5vfSkuIFRoZSBzdGFydHVwIGNvZGUgc2V0cyB1cCBzb21lCisgICAgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgaW5pdGlhbGl6ZXMgc3RkaW4sIHN0ZG91dCBhbmQgc3RkZXJyLgorICAgIFRoZSBleGl0IGNvZGUgY2xvc2VzIGFsbCBvcGVuIGZpbGVzIGFuZCBmcmVlcyBhbGwgbWVtb3J5LgorICAgIElmIHlvdSBsaW5rIHdpdGggYSBtYXRoIGxpYnJhcnkgdGhlIHN0YXJ0dXAvZXhpdCBjb2RlIHdpbGwgYmUgdGFrZW4KKyAgICBmcm9tIHRoZXJlIGlmIG5lY2Vzc2FyeS4KKworCitAbm9kZSBGbG9hdGluZyBwb2ludAorQHN1YnNlY3Rpb24gRmxvYXRpbmcgcG9pbnQKKworICAgIE5vdGUgdGhhdCB5b3UgaGF2ZSB0byBsaW5rIHdpdGggYSBtYXRoIGxpYnJhcnkgaWYgeW91IHdhbnQgdG8gdXNlCisgICAgZmxvYXRpbmcgcG9pbnQuIEFsbCBtYXRoIGZ1bmN0aW9ucywgc3BlY2lhbCBzdGFydHVwIGNvZGUgYW5kCisgICAgcHJpbnRmL3NjYW5mIGZ1bmN0aW9ucyB3aGljaCBzdXBwb3J0IGZsb2F0aW5nIHBvaW50IGFyZSBjb250YWluZWQgaW4KKyAgICB0aGUgbWF0aCBsaWJyYXJpZXMgb25seS4KKyAgICBBdCB0aGUgbW9tZW50IHRoZXJlIGFyZSBmaXZlIG1hdGggbGlicmFyaWVzOgorIAorQHRhYmxlIEBmaWxlCitAaXRlbSBtaWVlZS5saWIKKyAgIFRoaXMgb25lIHVzZXMgdGhlIEM9IG1hdGggbGlicmFyaWVzLiBUaGUgc3RhcnR1cCBjb2RlCisgICAgICAgICAgICAgICAgICAgIHdpbGwgYWx3YXlzIG9wZW4gTWF0aEllZWVTaW5nQmFzLmxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgIE1hdGhJZWVlRG91YkJhcy5saWJyYXJ5IGFuZCBNYXRoSWVlZURvdWJUcmFucy5saWJyYXJ5LgorICAgICAgICAgICAgICAgICAgICBGbG9hdCByZXR1cm4gdmFsdWVzIGFyZSBwYXNzZWQgaW4gZDAsIGRvdWJsZSByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzIGFyZSBwYXNzZWQgaW4gZDAvZDEuCisgICAgICAgICAgICAgICAgICAgIEEgNjgwMDAgaXMgc3VmZmljaWVudCB0byB1c2UgdGhpcyBsaWJyYXJ5LgorICAgICAgICAgICAgICAgICAgICBZb3UgbXVzdCBub3Qgc3BlY2lmeSBAb3B0aW9uey1mcHU9Li4ufQorICAgICAgICAgICAgICAgICAgICB3aGVuIHlvdSB1c2UgdGhpcyBsaWJyYXJ5LgorICAgQnkgZGVmYXVsdCBhbGwgZmxvYXRpbmcgcG9pbnQgcm91dGluZXMgYXJlIHByb3ZpZGVkIHZpYSBzdHViIGZ1bmN0aW9ucyBpbgorICAgQGZpbGV7bWllZWUubGlifS4gV2l0aCB0aGUgb3B0aW9uIEBvcHRpb257LWFtaWdhLXNvZnRmbG9hdH0geW91IGNhbiB0ZWxsCisgICBAY29tbWFuZHt2YmNjbTY4a30gdG8gZ2VuZXJhdGUgaW5saW5lIGNvZGUgZm9yIGNhbGxpbmcgdGhlCisgICBNYXRoSWVlZSBsaWJyYXJpZXMgZGlyZWN0bHkuCisgCitAaXRlbSBtc29mdC5saWIKKyAgICBUaGlzIG9uZSBpcyBiYXNlZCBvbiBKb2huIEhhdXNlcidzIElFQy9JRUVFIEZsb2F0aW5nLXBvaW50IEFyaXRobWV0aWMKKyAgICBQYWNrYWdlIChAeHJlZntTb2Z0ZmxvYXRIYXVzZXJ9KSBhbmQgZG9lc24ndCBuZWVkIGFueSBzeXN0ZW0gbGlicmFyaWVzIGZvcgorICAgIEZQIGVtdWxhdGlvbi4gTWF5IGJlIHNsb3dlciB0aGFuIHRoZSBST00gbGlicmFyaWVzLCB0aG91Z2guCisgICAgT3RoZXJ3aXNlIGV2ZXJ5dGhpbmcgbWVudGlvbmVkIGZvciBAZmlsZXttaWVlZS5saWJ9IGFwcGxpZXMgaGVyZQorICAgIGFzIHdlbGwuCisgICAgTm90ZSB0aGF0IHlvdSBoYXZlIHRvIGNhbGwgdGhlIEBjb21tYW5ke3ZjfSBmcm9udGVuZCB3aXRoIHRoZQorICAgIEBvcHRpb257LXJtY2ZnLWFtaWdhLXNvZnRmbG9hdH0gb3B0aW9uLCB3aGVuIHlvdXIgY29uZmlnIGZpbGUgY29udGFpbnMKKyAgICBAb3B0aW9uey1hbWlnYS1zb2Z0ZmxvYXR9ICh3aGljaCBpcyB0aGUgY2FzZSBmb3IgQGZpbGV7YW9zNjhrfQorICAgIHNpbmNlIHZiY2MgVjAuOWgpLgorCitAaXRlbSBtODgxLmxpYgorICAgIFRoaXMgb25lIHVzZXMgZGlyZWN0IEZQVSBpbnN0cnVjdGlvbnMgYW5kIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXMgYXJlIHBhc3NlZCBpbiBmcDAuIFlvdSBtdXN0IGhhdmUgYQorICAgICAgICAgICAgICAgICAgICA2ODAyMCBvciBoaWdoZXIgYW5kIGFuIEZQVSB0byB1c2UgdGhpcyBsaWJyYXJ5LiBZb3UKKyAgICAgICAgICAgICAgICAgICAgYWxzbyBoYXZlIHRvIHNwZWNpZnkgQG9wdGlvbnstZnB1PTY4ODgxfSBvcgorICAgICAgICAgICAgICAgICAgICBAb3B0aW9uey1mcHU9Njg4ODJ9LgorICAgICAgICAgICAgICAgICAgICBTZXZlcmFsIEZQVSBpbnN0cnVjdGlvbnMgdGhhdCBoYXZlIHRvIGJlIGVtdWxhdGVkIG9uCisgICAgICAgICAgICAgICAgICAgIDA0MC8wNjAgbWF5IGJlIHVzZWQuCisgCitAaXRlbSBtMDQwLmxpYgorICAgIFRoaXMgb25lIHVzZXMgb25seSBkaXJlY3QgRlBVIGluc3RydWN0aW9ucyB0aGF0IGRvIG5vdAorICAgICAgICAgICAgICAgICAgICBoYXZlIHRvIGJlIGVtdWxhdGVkIG9uIGEgNjgwNDAuIE90aGVyIGZ1bmN0aW9ucyB1c2UKKyAgICAgICAgICAgICAgICAgICAgdGhlIE1vdG9yb2xhIGVtdWxhdGlvbiByb3V0aW5lcyBtb2RpZmllZCBieQorICAgICAgICAgICAgICAgICAgICBBa2kgTSBMYXVra2FuZW4gYW5kIE1hdHRoZXcgSGV5LgorICAgICAgICAgICAgICAgICAgICBJdCBzaG91bGQgYmUgdXNlZCBmb3IgcHJvZ3JhbXMgY29tcGlsZWQgZm9yIDY4MDQwCisgICAgICAgICAgICAgICAgICAgIHdpdGggRlBVLgorICAgICAgICAgICAgICAgICAgICBSZXR1cm4gdmFsdWVzIGFyZSBwYXNzZWQgaW4gZnAwLgorCitAaXRlbSBtMDYwLmxpYgorICAgIFRoaXMgb25lIHVzZXMgb25seSBkaXJlY3QgRlBVIGluc3RydWN0aW9ucyB0aGF0IGRvIG5vdAorICAgICAgICAgICAgICAgICAgICBoYXZlIHRvIGJlIGVtdWxhdGVkIG9uIGEgNjgwNjAuIE90aGVyIGZ1bmN0aW9ucyB1c2UKKyAgICAgICAgICAgICAgICAgICAgdGhlIE1vdG9yb2xhIGVtdWxhdGlvbiByb3V0aW5lcyBtb2RpZmllZCBieQorICAgICAgICAgICAgICAgICAgICBBa2kgTSBMYXVra2FuZW4gYW5kIE1hdHRoZXcgSGV5LgorICAgICAgICAgICAgICAgICAgICBJdCBzaG91bGQgYmUgdXNlZCBmb3IgcHJvZ3JhbXMgY29tcGlsZWQgZm9yIDY4MDYwCisgICAgICAgICAgICAgICAgICAgIHdpdGggRlBVLgorICAgICAgICAgICAgICAgICAgICBSZXR1cm4gdmFsdWVzIGFyZSBwYXNzZWQgaW4gZnAwLgorQGVuZCB0YWJsZQorCitEZXBlbmRpbmcgb24gdGhlIENQVS9GUFUgc2VsZWN0ZWQsIGluY2x1ZGluZyBAZmlsZXttYXRoLmh9IHdpbGwKK2NhdXNlIGlubGluZS1jb2RlIGdlbmVyYXRlZCBmb3IgY2VydGFpbiBtYXRoIGZ1bmN0aW9ucy4KKworQG5vZGUgYW1pZ2Etc3RhY2sKK0BzdWJzZWN0aW9uIFN0YWNrCisKK0FuIGFwcGxpY2F0aW9uIGNhbiBzcGVjaWZ5IHRoZSBzdGFjay1zaXplIG5lZWRlZCBieSBkZWZpbmluZyBhIHZhcmlhYmxlCitAY29kZXtfX3N0YWNrfSAob2YgdHlwZSBAY29kZXtzaXplX3R9KSB3aXRoIGV4dGVybmFsIGxpbmthZ2UsIGUuZy4KKworQGV4YW1wbGUKK3NpemVfdCBfX3N0YWNrPTY1NTM2OyAvKiA2NEtCIHN0YWNrLXNpemUgKi8KK0BlbmQgZXhhbXBsZQorCitUaGUgc3RhcnR1cCBjb2RlIHdpbGwgY2hlY2sgd2hldGhlciB0aGUgc3RhY2stc2l6ZSBzcGVjaWZpZWQgaXMgbGFyZ2VyCit0aGFuIHRoZSBkZWZhdWx0IHN0YWNrLXNpemUgKGFzIHNldCBpbiB0aGUgc2hlbGwpIGFuZCBzd2l0Y2ggdG8gYSBuZXcKK3N0YWNrIG9mIGFwcHJvcHJpYXRlIHNpemUsIGlmIG5lY2Vzc2FyeS4KKworSWYgdGhlIEBvcHRpb257LXN0YWNrLWNoZWNrfSBvcHRpb24gaXMgc3BlY2lmaWVkIHdoZW4gY29tcGlsaW5nLCB0aGUKK2xpYnJhcnkgd2lsbCBjaGVjayBmb3IgYSBzdGFjayBvdmVyZmxvdyBhbmQgYWJvcnQgdGhlIHByb2dyYW0sIGlmIHRoZQorc3RhY2sgb3ZlcmZsb3dzLiBOb3RlLCBob3dldmVyLCB0aGF0IG9ubHkgY29kZSBjb21waWxlZCB3aXRoIHRoaXMKK29wdGlvbiB3aWxsIGJlIGNoZWNrZWQuIENhbGxzIHRvIGxpYnJhcmllcyB3aGljaCBoYXZlIG5vdCBiZWVuIGNvbXBpbGVkCit3aXRoIEBvcHRpb257LXN0YWNrLWNoZWNrfSBvciBjYWxscyB0byBPUyBmdW5jdGlvbiBtYXkgY2F1c2UgYSBzdGFjaworb3ZlcmZsb3cgd2hpY2ggaXMgbm90IG5vdGljZWQuCisKK0FkZGl0aW9uYWxseSwgaWYgQG9wdGlvbnstc3RhY2stY2hlY2t9IGlzIHVzZWQsIHRoZSBtYXhpbXVtIHN0YWNrLXNpemUKK3VzZWQgY2FuIGJlIHJlYWQgYnkgcXVlcnlpbmcgdGhlIGV4dGVybmFsIHZhcmlhYmxlIEBjb2Rle19fc3RhY2tfdXNhZ2V9LgorCitAZXhhbXBsZQorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2V4dGVybiBzaXplX3QgX19zdGFja191c2FnZTsKKworbWFpbigpCitAeworICAgIGRvX3Byb2dyYW0oKTsKKyAgICBwcmludGYoInN0YWNrIHVzZWQ6ICVsdVxuIiwodW5zaWduZWQgbG9uZylfX3N0YWNrX3VzYWdlKTsKK0B9CitAZW5kIGV4YW1wbGUKKworTGlrZSBhYm92ZSwgdGhlIHN0YWNrIHVzZWQgYnkgZnVuY3Rpb25zIG5vdCBjb21waWxlZCB1c2luZworQG9wdGlvbnstc3RhY2stY2hlY2t9IG9yIE9TIGZ1bmN0aW9ucyBpcyBpZ25vcmVkLgorCitAbm9kZSBhbWlnYXNtYWxsZGF0YQorQHN1YnNlY3Rpb24gU21hbGwgZGF0YSBtb2RlbAorCitXaGVuIHVzaW5nIHRoZSBzbWFsbCBkYXRhIG1vZGVsIG9mIHRoZSA2OGsgc2VyaWVzIENQVXMsIHlvdSBhbHNvIGhhdmUKK3RvIGxpbmsgd2l0aCBhcHByb3ByaWF0ZSBsaWJyYXJpZXMuIE1vc3QgbGlicmFyaWVzIGRvY3VtZW50ZWQgaGVyZSBhcmUKK2Fsc28gYXZhaWxhYmxlIGFzIHNtYWxsIGRhdGEgdmVyc2lvbnMgKHdpdGggYW4gJ3MnIGF0dGFjaGVkIHRvIHRoZQorZmlsZSBuYW1lKS4gRXhjZXB0aW9ucyBhcmUgdGhlIG1hdGggbGlicmFyaWVzLgorCitUbyBjb21waWxlIGFuZCBsaW5rIGEgcHJvZ3JhbSB1c2luZyB0aGUgc21hbGwgZGF0YSBtb2RlbCBhIGNvbW1hbmQgbGlrZQorCitAZXhhbXBsZQordmMgdGVzdC5jIC1vIHRlc3QgLXNkIC1sdmNzIC1sYW1pZ2FzCitAZW5kIGV4YW1wbGUKKworbWlnaHQgYmUgdXNlZC4KKworQHN1YnNlY3Rpb24gUmVzdHJpY3Rpb25zCisKK1RoZSBmb2xsb3dpbmcgbGlzdCBjb250YWlucyBzb21lIHJlc3RyaWN0aW9ucyBvZiB0aGlzIHZlcnNpb24gb2YgdGhlCitsaWJyYXJ5OgorCitAdGFibGUgQGNvZGUKKworQGl0ZW0gdG1wZmlsZSgpCitUaGUgQGNvZGV7dG1wZmlsZSgpfSBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyBhbiBlcnJvci4KKworQGl0ZW0gY2xvY2soKQorVGhlIEBjb2Rle2Nsb2NrKCl9IGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIC0xLiBUaGlzIGlzIGNvcnJlY3QsCithY2NvcmRpbmcgdG8gdGhlIEMgc3RhbmRhcmQsIGJlY2F1c2Ugb24gQW1pZ2FPUyBpdCBpcyBub3QgcG9zc2libGUgdG8KK29idGFpbiB0aGUgdGltZSB1c2VkIGJ5IHRoZSBjYWxsaW5nIHByb2Nlc3MuCisKK0BlbmQgdGFibGUKKworQG5vZGUgTWluaW1hbCBTdGFydHVwCitAc3Vic2VjdGlvbiBNaW5pbWFsIFN0YXJ0dXAgCisKK0lmIHlvdSB3YW50IHRvIHdyaXRlIHByb2dyYW1zIHRoYXQgdXNlIG9ubHkgQW1pZ2EgZnVuY3Rpb25zIGFuZCBub25lIGZyb20KK3ZjLmxpYiB5b3UgY2FuIHVzZSBAZmlsZXttaW5zdGFydC5vfSBpbnN0ZWFkIG9mIEBmaWxle3N0YXJ0dXAub30gYW5kCitwcm9kdWNlIHNtYWxsZXIgZXhlY3V0YWJsZXMuIFlvdSBjYW4gYWxzbyBhY2hpZXZlIHRoYXQgYnkgc2ltcGx5IHVzaW5nCit0aGUgQGZpbGV7YW9zNjhrbX0gY29uZmlnIGZpbGUgaW5zdGVhZC4KKworVGhpcyBzdGFydHVwIGNvZGUgZG9lcyBub3Qgc2V0IHVwIGV2ZXJ5dGhpbmcgbmVlZGVkIGJ5IHZjLmxpYiwgc28geW91CittdXN0IG5vdCB1c2UgbW9zdCBvZiB0aGVzZSBmdW5jdGlvbnMgKHN0cmluZyBhbmQgY3R5cGUgZnVuY3Rpb25zIGFyZSBvaywKK2J1dCBtb3N0IG90aGVyIGZ1bmN0aW9ucyAtIGVzcGVjaWFsbHkgSS9PIGFuZCBtZW1vcnkgaGFuZGxpbmcgLSBtdXN0IG5vdAorYmUgdXNlZCkuCitAY29kZXtleGl0KCl9IGlzIHN1cHBsaWVkIGJ5IG1pbnN0YXJ0IGFuZCBjYW4gYmUgdXNlZC4KKyAKK1RoZSBjb21tYW5kIGxpbmUgaXMgbm90IHBhcnNlZCwgYnV0IHBhc3NlZCB0byBAY29kZXttYWluKCl9IGFzIGEgc2luZ2xlCitzdHJpbmcsCitzbyB5b3UgY2FuIGRlY2xhcmUgbWFpbiBhcworQGNvZGV7aW50IG1haW4oY2hhciAqY29tbWFuZCl9IG9yIEBjb2Rle2ludCBtYWluKHZvaWQpfS4KKyAKK0Fsc28gbm8gQW1pZ2EgbGlicmFyaWVzIGFyZSBvcGVuZWQgKGJ1dCBAY29kZXtTeXNCYXNlfSBpcyBzZXQgdXApLCBzbyB5b3UKK2hhdmUgdG8gZGVmaW5lIGFuZCBvcGVuIEBjb2Rle0RPU0Jhc2V9IHlvdXJzZWxmIGlmIHlvdSBuZWVkIGl0LgorSWYgeW91IHdhbnQgdG8gdXNlIGZsb2F0aW5nIHBvaW50IHdpdGggdGhlIElFRUUgbGlicmFyaWVzCitvciBAb3B0aW9uey1hbWlnYS1zb2Z0ZmxvYXR9IHlvdSBoYXZlIHRvCitkZWZpbmUgYW5kIG9wZW4gTWF0aEllZWVTaW5nQmFzLmxpYnJhcnksIE1hdGhJZWVlRG91YkJhcy5saWJyYXJ5IGFuZAorTWF0aEllZWVEb3ViVHJhbnMubGlicmFyeSAoaW4gdGhpcyBvcmRlciEpIGFuZCBsaW5rIHdpdGggbWllZWUubGliIChpZgorY29tcGlsZWQgZm9yIEZQVSB0aGlzIGlzIG5vdCBuZWVkZWQpLgorIAorQSBoZWxsbyB3b3JsZCB1c2luZyBtaW5zdGFydCBjb3VsZCBsb29rIGxpa2UgdGhpczoKKworQGV4YW1wbGUgCisjaW5jbHVkZSA8cHJvdG8vZXhlYy5oPgorI2luY2x1ZGUgPHByb3RvL2Rvcy5oPgorIAorc3RydWN0IERvc0xpYnJhcnkgKkRPU0Jhc2U7CisgCitpbnQgbWFpbigpCitAeworICAgIGlmKERPU0Jhc2U9KHN0cnVjdCBEb3NMaWJyYXJ5ICopT3BlbkxpYnJhcnkoImRvcy5saWJyYXJ5IiwwKSlAeworICAgICAgICBXcml0ZShPdXRwdXQoKSwiSGVsbG8sIHdvcmxkIVxuIiwxNCk7CisgICAgICAgIENsb3NlTGlicmFyeSgoc3RydWN0IExpYnJhcnkgKilET1NCYXNlKTsKKyAgICBAfQorICAgIHJldHVybiAwOworQH0KKworQGVuZCBleGFtcGxlCisKK1RoaXMgY2FuIHlpZWxkIGFuIGV4ZWN1dGFibGUgb2YgdW5kZXIgMjU2IGJ5dGVzIHdoZW4gY29tcGlsZWQgd2l0aAorQG9wdGlvbnstc2MgLXNkfSBhbmQgbGlua2VkIHdpdGggQGZpbGV7bWluc3RhcnQub30gYW5kIEBjb2Rle2FtaWdhcy5saWJ9CisodXNpbmcgQGNvbW1hbmR7dmxpbmt9IC0gbWF5IG5vdCB3b3JrIHdpdGggb3RoZXIgbGlua2VycykuCisKK0Bub2RlIE1pbmltYWwgUmVzaWRlbnQKK0BzdWJzZWN0aW9uIE1pbmltYWwgU3RhcnR1cCBmb3IgcmVzaWRlbnQgcHJvZ3JhbXMKKworQW1pZ2FPUyBjYW4ga2VlcCBzcGVjaWFsICJwdXJlIiBwcm9ncmFtcyByZXNpZGVudCBpbiBSQU0sIGFuZCByZXN0YXJ0IHRoZW0KK2Zyb20gdGhlcmUgd2l0aG91dCBoYXZpbmcgdG8gbG9hZCB0aGVtIGFnYWluIGZyb20gZGlzay4gVG8gbWFrZSBpdCBlYXN5IHRvCitjcmVhdGUgc3VjaCByZWVudHJhbnQgcHJvZ3JhbXMsIGV2ZW4gd2l0aCBzdGF0aWMgZGF0YSwgeW91IGNhbiBsaW5rIHdpdGggdGhlCitzcGVjaWFsIHN0YXJ0dXAgY29kZSBAZmlsZXttaW5yZXMub30sIHdoaWNoIGlzIGEgbWluaW1hbCBzdGFydHVwIGNvZGUgZm9yCityZXNpZGVudCBwcm9ncmFtcy4gT3Igc2ltcGx5IHVzZSB0aGUgY29uZmlnIGZpbGUgQGZpbGV7YW9zNjhrcn0gaW5zdGVhZC4KK0V2ZXJ5dGhpbmcgbWVudGlvbmVkIGZvciBAZmlsZXttaW5zdGFydC5vfSBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiBpcyBhbHNvCit2YWxpZCBmb3IgQGZpbGV7bWlucmVzLm99LgorCitUbyBjcmVhdGUgcmVhbCByZXNpZGVudCBwcm9ncmFtcyB5b3UgaGF2ZSB0byBmb2xsb3cgdGhlIGZvbGxvd2luZyBydWxlczoKK0BpdGVtaXplIEBtaW51cworCitAaXRlbSBDb21waWxlIGFsbCB5b3VyIGNvZGUgZm9yIHRoZSBzbWFsbCBkYXRhIG1vZGVsIChAb3B0aW9uey1zZH0gb3B0aW9uKS4KKworQGl0ZW0gQXZvaWQgYWJzb2x1dGUgcmVmZXJlbmNlcyB0byBzbWFsbCBkYXRhIHN5bWJvbHMuCisgICAgICBVc3VhbGx5IHRoZXNlIGFyZSBjb25zdGFudCBwb2ludGVycyB0byBzdGF0aWMgZGF0YS4KKyAgICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjcmVhdGVzIHN1Y2ggYW4gaWxsZWdhbCByZWxvY2F0aW9uOgorQGV4YW1wbGUKK2ludCB4OworaW50IGNvbnN0ICpwID0gJng7CitAZW5kIGV4YW1wbGUKK0Bjb21tYW5ke3ZsaW5rfSB3YXJucyBhYm91dCBhbGwgcG90ZW50aWFsIHByb2JsZW1zLgorCitAaXRlbSBMaW5rIHdpdGggdGhlIEBmaWxle21pbnJlcy5vfSBzdGFydHVwIGNvZGUsCisgICAgICBhbmQgdXNlIHRoZSBzbWFsbCBkYXRhCisgICAgICB2ZXJzaW9ucyBvZiBsaW5rZXIgbGlicmFyaWVzIChAZmlsZXt2Y3MubGlifSwgQGZpbGV7YW1pZ2FzLmxpYn0sIGV0Yy4pLgorCitAaXRlbSBTZXQgdGhlIFB1cmUgZmxhZyBpbiB0aGUgZmlsZSBhdHRyaWJ1dGVzLgorICAgICAgTG9hZCB0aGUgcHJvZ3JhbSBpbnRvIFJBTQorICAgICAgd2l0aCB0aGUgQW1pZ2FET1MgQGNvbW1hbmR7cmVzaWRlbnR9IGNvbW1hbmQuCisKK0BlbmQgaXRlbWl6ZQorCisKK0Bub2RlIGFtaWdhbGliCitAc3Vic2VjdGlvbiBhbWlnYS5saWIKKworVG8gd3JpdGUgcHJvZ3JhbXMgdXNpbmcgQW1pZ2FPUyAocmF0aGVyIHRoYW4gc3RhbmRhcmQgQyBmdW5jdGlvbnMKK29ubHkpLCBhIHJlcGxhY2VtZW50IGZvciB0aGUgb3JpZ2luYWwgKGNvcHlyaWdodGVkKSBAZmlsZXthbWlnYS5saWJ9CitpcyBwcm92aWRlZCB3aXRoIEBjb21tYW5ke3ZiY2N9LiBUaGlzIHJlcGxhY2VtZW50IGlzIGFkYXB0ZWQgdG8gdmJjYywKK2RvZXMgbm90IGNhdXNlIGNvbGxpc2lvbnMgd2l0aCBzb21lIGZ1bmN0aW9ucyAoZS5nLiBAY29kZXtzcHJpbnRmfSkKK3Byb3ZpZGVkIGJ5IHRoZSBvcmlnaW5hbCBAZmlsZXthbWlnYS5saWJ9IGFuZCBpcyBhdmFpbGFibGUgZm9yIHRoZQorc21hbGwgZGF0YSBtb2RlIGFzIHdlbGwuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGFsd2F5cyB1c2UgdGhpcyBsaWJyYXJ5CityYXRoZXIgdGhhbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KKworQWRkaXRpb25hbGx5LCB0aGVyZSBhcmUgaGVhZGVyIGZpbGVzIChpbiB0aGUgQGZpbGV7cHJvdG99LSBhbmQKK0BmaWxle2lubGluZX0tc3ViZGlyZWN0b3JpZXMpIHdoaWNoIGNhdXNlIGlubGluZWQgY2FsbHMgdG8gQW1pZ2EKK2xpYnJhcnkgZnVuY3Rpb25zLgorCitCZXNpZGVzIHNvbWUgc3VwcG9ydCBmdW5jdGlvbnMgQGZpbGV7YW1pZ2EubGlifSBjb250YWlucyBzdHViIHJvdXRpbmVzCit0byBjYWxsIGZ1bmN0aW9ucyBmcm9tIGFsbCBjb21tb24gQW1pZ2FPUyBsaWJyYXJpZXMgd2l0aCBzdGFjayBhcmd1bWVudHMuCitCeSBpbmNsdWRpbmcgdGhlIGxpYnJhcnkncyBwcm90byBoZWFkZXIgZmlsZSB5b3UgbWFrZSBzdXJlIHRoYXQgQW1pZ2FPUworZnVuY3Rpb25zIGFyZSBjYWxsZWQgZGlyZWN0bHkgYnkgaW5saW5lIGNvZGUsIHVubGVzcyBAY29kZXtfTk9fSU5MSU5FfQoraXMgZGVmaW5lZC4KKworUHJlcHJvY2Vzc29yIGRlZmluZXMgdG8gY29udHJvbCB0aGUgYmVoYXZpb3VyIG9mIHZiY2MncyBwcm90byBoZWFkZXJzOgorQHRhYmxlIEBjb2RlCitAaXRlbSBfX05PTElCQkFTRV9fCisgIERvIG5vdCBkZWNsYXJlIHRoZSBsaWJyYXJ5IGJhc2Ugc3ltYm9sLgorQGl0ZW0gX05PX0lOTElORQorICBEbyBub3QgdXNlIG9wdGltaXplZCBpbmxpbmUgY29kZSBmb3IgbGlicmFyeSBmdW5jdGlvbiBjYWxscy4KK0BlbmQgdGFibGUKKworTm90ZSB0aGF0IHRoZSBPUy1jYWxsIGlubGluZXMgaGF2ZSBiZWVuIGdlbmVyYXRlZCB1c2luZyB0aGUgTkRLMy4yIGNsaWIKK2hlYWRlciBmaWxlcywgd2hpbGUgdHJ5aW5nIHRvIGtlZXAgY29tcGF0aWJpbGl0eSB0byBOREszLjksIHNvIGl0IGlzCithZHZpc2VkIHRvIHVzZSBvbmUgb2YgdGhlIHR3byBOREtzIGZvciBkZXZlbG9wbWVudC4KK090aGVyd2lzZSB5b3Ugd2lsbCBnZXQgd2FybmluZ3MgYWJvdXQgbWlzc2luZyBAY29kZXtDT05TVH0gdHlwZWRlZnMgYW5kCitzaW1pbGFyLgorCitTcGVjaWZ5IEBvcHRpb257LWxhbWlnYX0gdG8gbGluayB3aXRoIEBmaWxle2FtaWdhLmxpYn0uCisKK0Bub2RlIGF1dG9saWIKK0BzdWJzZWN0aW9uIGF1dG8ubGliCisKKyAgICBUbyBsaW5rIHdpdGggQGZpbGV7YXV0by5saWJ9IChvciB0aGUgc21hbGwgZGF0YSB2ZXJzaW9uCisgICAgQGZpbGV7YXV0b3MubGlifSkgc3BlY2lmeQorICAgIHRoZSBAb3B0aW9uey1sYXV0b30gb3IgQG9wdGlvbnstbGF1dG9zfSBvcHRpb24gdG8gQGNvbW1hbmR7dmN9LgorIAorICAgIFdoZW4geW91IGFyZSBjYWxsaW5nIGEgc3RhbmRhcmQgQW1pZ2EgbGlicmFyeSBmdW5jdGlvbiB3aXRob3V0CisgICAgaGF2aW5nIGRlZmluZWQgdGhlIGNvcnJlc3BvbmRpbmcgbGlicmFyeSBiYXNlLCB0aGVuIHRoZSBsaWJyYXJ5IGJhc2UKKyAgICBhcyB3ZWxsIGFzIGNvZGUgdG8gb3Blbi9jbG9zZSBpdCB3aWxsIGJlIHRha2VuIGZyb20gQGZpbGV7YXV0by5saWJ9LgorIAorICAgIEJ5IGRlZmF1bHQsIEBmaWxle2F1dG8ubGlifSB3aWxsIHRyeSB0byBvcGVuIGFueSBsaWJyYXJ5IHZlcnNpb24uIElmIHlvdQorICAgIG5lZWQgYXQgbGVhc3QgYSBjZXJ0YWluIHZlcnNpb24geW91IGNhbiBkZWZpbmUgYW5kIHNldCBhIHZhcmlhYmxlCisgICAgXzxsaWJyYXJ5LWJhc2U+VmVyIHdpdGggZXh0ZXJuYWwgbGlua2FnZSwgZS5nLiAob24gZmlsZS1zY29wZSk6CisKK0BleGFtcGxlIAorICAgICAgICBpbnQgX0ludHVpdGlvbkJhc2VWZXIgPSAzOTsKK0BlbmQgZXhhbXBsZQorCisgICAgTm90ZSB0aGF0IHlvdXIgcHJvZ3JhbSB3aWxsIGFib3J0IGJlZm9yZSByZWFjaGluZyBAY29kZXttYWluKCl9IGlmIG9uZQorICAgIG9mIHRoZSBsaWJyYXJpZXMgY2Fubm90IGJlIG9wZW5lZC4gQWxzbyBub3RlIHRoYXQgQGZpbGV7YXV0by5saWJ9CisgICAgZGVwZW5kcyBvbiBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGhhbmRsaW5nIGluIHZjbGliLCB3aGljaCBtZWFucyBpdAorICAgIGNhbm5vdCB3b3JrIHdoZW4gbGlua2luZyB3aXRob3V0IHZjbGliLCB3aXRob3V0IHN0YW5kYXJkIHN0YXJ0dXAgY29kZSwKKyAgICBvciBvbmx5IHdpdGggYSBtaW5pbWFsIHN0YXJ0dXAgY29kZSwgbGlrZSBAZmlsZXttaW5zdGFydC5vfS4KKworQHN1YnNlY3Rpb24gcmVhY3Rpb24ubGliCisKK1RoZSBAZmlsZXtyZWFjdGlvbi5saWJ9IGluIEBjb21tYW5ke3ZiY2N9IGlzIGEgcG9ydCBvZiBTdGVwaGFuIFJ1cHByZWNodCdzCityZXdyaXRlIG9mIHRoZSBjb3B5cmlnaHRlZCBsaW5rZXIgbGlicmFyeSwgZXh0ZW5kZWQgYW5kIGZpeGVkIGJ5CitPbGFmIEJhcnRoZWwgZm9yIHRoZSBOREsgMy4yIHJlbGVhc2UuIFRoaXMgdmVyc2lvbiBzaG91bGQgd29yayBpbgorY29tYmluYXRpb24gd2l0aCBOREsgMy45IGFzIHdlbGwuCisKK1RvIGxpbmsgd2l0aCBAZmlsZXtyZWFjdGlvbi5saWJ9IChvciB0aGUgc21hbGwgZGF0YSB2ZXJzaW9uCitAZmlsZXtyZWFjdGlvbnMubGlifSkgc3BlY2lmeSB0aGUgQG9wdGlvbnstbHJlYWN0aW9ufSBvcgorQG9wdGlvbnstbHJlYWN0aW9uc30gb3B0aW9uIHRvIEBjb21tYW5ke3ZjfS4KKworVGhlIGxpYnJhcnkgY29udGFpbnMgUmVBY3Rpb24gR1VJIGNsYXNzIHN1cHBvcnQgZnVuY3Rpb25zIGFuZCB0aGVpcgorYXV0b2luaXRpYWxpemF0aW9uIGNvZGUuIFJlZmVyIHRvIEBmaWxle3JlYWN0aW9uX2xpYi5kb2N9IGZyb20geW91cgorTkRLIEF1dG9kb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiBBcyBkb2N1bWVudGVkIHRoZXJlLCB0aGUgdmVyc2lvbgordXNlZCB0byBhdXRvbWF0aWNhbGx5IG9wZW4gdGhlIGNsYXNzZXMgY2FuIGJlIGRlZmluZWQgYnkgdGhlIHZhcmlhYmxlCitAY29kZXtfX3JlYWN0aW9udmVyc2lvbn0gd2l0aCBleHRlcm5hbCBsaW5rYWdlLiBPdGhlcndpc2UgYSBkZWZhdWx0CitvZiB2ZXJzaW9uIDAgaXMgdXNlZC4KKworCitAc2VjdGlvbiBLaWNrc3RhcnQxLngvNjhrCisKK1RoaXMgc2VjdGlvbiBkZXNjcmliZXMgc3BlY2lmaWNzIG9mIHRoZSBDIGxpYnJhcnkgZm9yIEFtaWdhIEtpY2tzdGFydCAxLjIKK2FuZCAxLjMgcHJvdmlkZWQgYnkgdGhlIHRhcmdldCBAZmlsZXttNjhrLWtpY2sxM30uCitUaGUgcmVsZXZhbnQgZmlsZXMgYXJlIEBmaWxle3N0YXJ0dXAub30sIEBmaWxle21pbnN0YXJ0Lm99LCBAZmlsZXttaW5yZXMub30sCitAZmlsZXtzdGFydHVwMTYub30sIEBmaWxle21pbnN0YXJ0MTYub30sIEBmaWxle21pbnJlczE2Lm99LAorQGZpbGV7dmMubGlifSwgQGZpbGV7dmNzLmxpYn0sIEBmaWxle20xMy5saWJ9LCBAZmlsZXttMTNzLmxpYn0sCitAZmlsZXttc29mdC5saWJ9LCBAZmlsZXttc29mdHMubGlifSwgQGZpbGV7bTg4MS5saWJ9LCBAZmlsZXttODgxcy5saWJ9LAorQGZpbGV7YW1pZ2EubGlifSwgQGZpbGV7YW1pZ2FzLmxpYn0sIEBmaWxle2F1dG8ubGlifSBhbmQgQGZpbGV7YXV0b3MubGlifSwKK0BmaWxle3ZjMTYubGlifSwgQGZpbGV7dmMxNnMubGlifSwgQGZpbGV7bTEzMTYubGlifSwgQGZpbGV7bTEzMTZzLmxpYn0sCitAZmlsZXttc29mdDE2LmxpYn0sIEBmaWxle21zb2Z0MTZzLmxpYn0sIEBmaWxle204ODExNi5saWJ9LCBAZmlsZXttODgxMTZzLmxpYn0sCitAZmlsZXthbWlnYTE2LmxpYn0sIEBmaWxle2FtaWdhMTZzLmxpYn0sIEBmaWxle2F1dG8xNi5saWJ9IGFuZAorQGZpbGV7YXV0bzE2cy5saWJ9LgorCitUaGlzIHRhcmdldCBtYWtlcyBpdCBwb3NzaWJsZSB0byBkZXZlbG9wIHByb2dyYW1zIHRhcmdldGVkIGZvciB0aGVzZSBvbGRlcgordmVyc2lvbnMgb2YgdGhlIEFtaWdhIG9wZXJhdGluZyBzeXN0ZW0sIHVzaW5nIHRoZSBvcmlnaW5hbCBDb21tb2RvcmUKK0tpY2tzdGFydCAxLjMgaGVhZGVyIGZpbGVzLiBOb3RlIHRoYXQgdGhlcmUgYXJlIGFsc28gbGlicmFyaWVzIGFuZAorY29uZmlnIGZpbGVzIGZvciB1c2luZyBhIDE2LWJpdCBpbnQgQUJJLCB3aGljaCB3YXMgY29tbW9uIGF0IHRoYXQgdGltZSwKK2FuZCBtYXkgaGF2ZSBzb21lIGFkdmFudGFnZXMgb24gMTYtYml0IENQVXMsIGxpa2UgdGhlIDY4MDAwIG9yIDY4MDEwLgorCitUaGUgZm9sbG93aW5nIGNvbmZpZyBmaWxlcyBhcmUgYXZhaWxhYmxlOgorQHRhYmxlIEBjb2RlCitAaXRlbSBraWNrMTMKKyAgU3RhbmRhcmQgc3RhcnR1cCBjb2RlIChAZmlsZXtzdGFydHVwLm99KSB3aXRoIGNvbW1hbmQgbGluZSBwYXJzaW5nCisgIGFuZCBvcHRpb25hbCBXb3JrYmVuY2ggc3RhcnR1cCAoQHhyZWZ7U3RhcnR1cDEzfSkgdXNpbmcgMzItYml0IGludC4KK0BpdGVtIGtpY2sxM20KKyAgTWluaW1hbCBzdGFydHVwIGNvZGUgKEBmaWxle21pbnN0YXJ0Lm99KSB3aXRob3V0IGNvbW1hbmQgbGluZQorICBwYXJzaW5nLiBZb3UgaGF2ZSB0byBvcGVuIGFsbCBsaWJyYXJpZXMgeW91cnNlbGYgKEB4cmVme01pbmltYWwgU3RhcnR1cH0pCisgIHVzaW5nIDMyLWJpdCBpbnQuCitAaXRlbSBraWNrMTNyCisgIE1pbmltYWwgc3RhcnR1cCBjb2RlIChAZmlsZXttaW5yZXMub30pIGZvciByZXNpZGVudCBwcm9ncmFtcy4KKyAgQWx3YXlzIGNvbXBpbGVzIGluIHNtYWxsIGRhdGEgbW9kZSBhbmQgbGlua3Mgd2l0aCBAZmlsZXt2Y3MubGlifQorICAoQHhyZWZ7TWluaW1hbCBSZXNpZGVudH0pIHVzaW5nIDMyLWJpdCBpbnQuCitAaXRlbSBraWNrMTNzCisgIFN0YW5kYXJkIHN0YXJ0dXAgY29kZSAoQGZpbGV7c3RhcnR1cC5vfSkgd2l0aCBjb21tYW5kIGxpbmUgcGFyc2luZworICBhbmQgb3B0aW9uYWwgV29ya2JlbmNoIHN0YXJ0dXAgKEB4cmVme1N0YXJ0dXAxM30pIHVzaW5nIDE2LWJpdCBpbnQuCitAaXRlbSBraWNrMTNzbQorICBNaW5pbWFsIHN0YXJ0dXAgY29kZSAoQGZpbGV7bWluc3RhcnQub30pIHdpdGhvdXQgY29tbWFuZCBsaW5lCisgIHBhcnNpbmcuIFlvdSBoYXZlIHRvIG9wZW4gYWxsIGxpYnJhcmllcyB5b3Vyc2VsZiAoQHhyZWZ7TWluaW1hbCBTdGFydHVwfSkKKyAgdXNpbmcgMTYtYml0IGludC4KK0BpdGVtIGtpY2sxM3NyCisgIE1pbmltYWwgc3RhcnR1cCBjb2RlIChAZmlsZXttaW5yZXMub30pIGZvciByZXNpZGVudCBwcm9ncmFtcy4KKyAgQWx3YXlzIGNvbXBpbGVzIGluIHNtYWxsIGRhdGEgbW9kZSBhbmQgbGlua3Mgd2l0aCBAZmlsZXt2Y3MubGlifQorICAoQHhyZWZ7TWluaW1hbCBSZXNpZGVudH0pIHVzaW5nIDE2LWJpdCBpbnQuCitAZW5kIHRhYmxlCisKK0Bub2RlIFN0YXJ0dXAxMworQHN1YnNlY3Rpb24gU3RhcnR1cAorCisgICAgVGhlIHN0YXJ0dXAgY29kZSBjdXJyZW50bHkgY29uc2lzdHMgb2YgYSBzbGlnaHRseSBtb2RpZmllZCBzdGFuZGFyZAorICAgIEFtaWdhT1MgMS4zIHN0YXJ0dXAgKEBmaWxle3N0YXJ0dXAub30pLiBUaGUgc3RhcnR1cCBjb2RlIHNldHMgdXAgc29tZQorICAgIGdsb2JhbCB2YXJpYWJsZXMgYW5kIGluaXRpYWxpemVzIHN0ZGluLCBzdGRvdXQgYW5kIHN0ZGVyci4KKyAgICBUaGUgZXhpdCBjb2RlIGNsb3NlcyBhbGwgb3BlbiBmaWxlcyBhbmQgZnJlZXMgYWxsIG1lbW9yeS4KKyAgICBJZiB5b3UgbGluayB3aXRoIGEgbWF0aCBsaWJyYXJ5IHRoZSBzdGFydHVwL2V4aXQgY29kZSB3aWxsIGJlIHRha2VuCisgICAgZnJvbSB0aGVyZSBpZiBuZWNlc3NhcnkuCisKKworQHN1YnNlY3Rpb24gRmxvYXRpbmcgcG9pbnQKKworICAgIE5vdGUgdGhhdCB5b3UgaGF2ZSB0byBsaW5rIHdpdGggYSBtYXRoIGxpYnJhcnkgaWYgeW91IHdhbnQgdG8gdXNlCisgICAgZmxvYXRpbmcgcG9pbnQuIEFsbCBtYXRoIGZ1bmN0aW9ucywgc3BlY2lhbCBzdGFydHVwIGNvZGUgYW5kCisgICAgcHJpbnRmL3NjYW5mIGZ1bmN0aW9ucyB3aGljaCBzdXBwb3J0IGZsb2F0aW5nIHBvaW50IGFyZSBjb250YWluZWQgaW4KKyAgICB0aGUgbWF0aCBsaWJyYXJpZXMgb25seS4KKyAgICBBdCB0aGUgbW9tZW50IHRoZXJlIGFyZSB0d28gbWF0aCBsaWJyYXJpZXM6CisgCitAdGFibGUgQGZpbGUKK0BpdGVtIG0xMy5saWIKKyAgIFRoaXMgb25lIHVzZXMgdGhlIEM9IG1hdGggbGlicmFyaWVzIHByZXNlbnQgdW5kZXIgS2lja3N0YXJ0IDEuMiBhbmQgMS4zLgorICAgVGhlIHN0YXJ0dXAgY29kZSB3aWxsIGFsd2F5cyBvcGVuIG1hdGhmZnAubGlicmFyeSwKKyAgIE1hdGhJZWVlRG91YkJhcy5saWJyYXJ5IGFuZCBNYXRoSWVlZURvdWJUcmFucy5saWJyYXJ5LgorICAgTm90ZSB0aGF0IGFsbCBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNhbGN1bGF0aW9ucyB0YWtlIHBsYWNlCisgICBpbiBGRlAgZm9ybWF0IGFuZCBoYXZlIHRvIGJlIGNvbnZlcnRlZCBiZXR3ZWVuIEZGUCBhbmQgSUVFRSBieSB0aGUKKyAgIGxpYnJhcnkuCisgICAgICAgICAgICAgICAgICAgIEZsb2F0IHJldHVybiB2YWx1ZXMgYXJlIHBhc3NlZCBpbiBkMCwgZG91YmxlIHJldHVybgorICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgYXJlIHBhc3NlZCBpbiBkMC9kMS4KKyAgICAgICAgICAgICAgICAgICAgQSA2ODAwMCBpcyBzdWZmaWNpZW50IHRvIHVzZSB0aGlzIGxpYnJhcnkuCisgICAgICAgICAgICAgICAgICAgIFlvdSBtdXN0IG5vdCBzcGVjaWZ5IEBvcHRpb257LWZwdT0uLi59CisgICAgICAgICAgICAgICAgICAgIHdoZW4geW91IHVzZSB0aGlzIGxpYnJhcnkuCisKK0BpdGVtIG1zb2Z0LmxpYgorICAgIFRoaXMgb25lIGlzIGJhc2VkIG9uIEpvaG4gSGF1c2VyJ3MgSUVDL0lFRUUgRmxvYXRpbmctcG9pbnQgQXJpdGhtZXRpYworICAgIFBhY2thZ2UgKEB4cmVme1NvZnRmbG9hdEhhdXNlcn0pIGFuZCBkb2Vzbid0IG5lZWQgYW55IHN5c3RlbSBsaWJyYXJpZXMgZm9yCisgICAgRlAgZW11bGF0aW9uLiBNYXkgYmUgc2xvd2VyIHRoYW4gdGhlIFJPTSBsaWJyYXJpZXMsIHRob3VnaC4KKyAgICBPdGhlcndpc2UgZXZlcnl0aGluZyBtZW50aW9uZWQgZm9yIEBmaWxle20xMy5saWJ9IGFwcGxpZXMgaGVyZQorICAgIGFzIHdlbGwuCisgCitAaXRlbSBtODgxLmxpYgorICAgIFRoaXMgb25lIHVzZXMgZGlyZWN0IEZQVSBpbnN0cnVjdGlvbnMgYW5kIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXMgYXJlIHBhc3NlZCBpbiBmcDAuIFlvdSBtdXN0IGhhdmUgYQorICAgICAgICAgICAgICAgICAgICA2ODAyMCBvciBoaWdoZXIgYW5kIGFuIEZQVSB0byB1c2UgdGhpcyBsaWJyYXJ5LiBZb3UKKyAgICAgICAgICAgICAgICAgICAgYWxzbyBoYXZlIHRvIHNwZWNpZnkgQG9wdGlvbnstZnB1PTY4ODgxfS4KKyAgICAgICAgICAgICAgICAgICAgU2V2ZXJhbCBGUFUgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZSB0byBiZSBlbXVsYXRlZCBvbgorICAgICAgICAgICAgICAgICAgICAwNDAvMDYwIG1heSBiZSB1c2VkLgorQGVuZCB0YWJsZQorCitAc3Vic2VjdGlvbiBTdGFjaworCitTdGFjay1jaGVja2luZyBpcyBhdmFpbGFibGUgc2ltaWxhciB0byBBbWlnYU9TLzY4ayAoQHhyZWZ7YW1pZ2Etc3RhY2t9KS4KK0J1dCB0aGVyZSBpcyBubyBhdXRvbWF0aWMgc3RhY2stZXh0ZW5zaW9uIHVuZGVyIEtpY2tzdGFydCAxLjMgYW5kIGEKK0Bjb2Rle19fc3RhY2t9IHZhcmlhYmxlIHdpbGwgYmUgaWdub3JlZC4KKworQHN1YnNlY3Rpb24gU21hbGwgZGF0YSBtb2RlbAorCitTbWFsbCBkYXRhIGlzIHN1cHBvcnRlZCBhcyBkZXNjcmliZWQgZm9yIEFtaWdhT1MvNjhrIChAeHJlZnthbWlnYXNtYWxsZGF0YX0pLgorVGhlIHN0YXJ0dXAgY29kZSB0YWtlcyBjYXJlIG9mIGNsZWFyaW5nIHRoZSB1bml0aXRhbGl6ZWQgcGFydCBvZiBhCitzbWFsbCBkYXRhIHNlY3Rpb24gKHdoaWNoIEtpY2tzdGFydCAxLnggZmFpbHMgdG8gZG8pLgorCitAc3Vic2VjdGlvbiBSZXN0cmljdGlvbnMKKworVGhlIGZvbGxvd2luZyBsaXN0IGNvbnRhaW5zIHNvbWUgcmVzdHJpY3Rpb25zIG9mIHRoaXMgdmVyc2lvbiBvZiB0aGUKK2xpYnJhcnk6CisKK0B0YWJsZSBAY29kZQorCitAaXRlbSB0bXBmaWxlKCkKK1RoZSBAY29kZXt0bXBmaWxlKCl9IGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIGFuIGVycm9yLgorCitAaXRlbSBjbG9jaygpCitUaGUgQGNvZGV7Y2xvY2soKX0gZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgLTEuIFRoaXMgaXMgY29ycmVjdCwKK2FjY29yZGluZyB0byB0aGUgQyBzdGFuZGFyZCwgYmVjYXVzZSBvbiBBbWlnYU9TIGl0IGlzIG5vdCBwb3NzaWJsZSB0bworb2J0YWluIHRoZSB0aW1lIHVzZWQgYnkgdGhlIGNhbGxpbmcgcHJvY2Vzcy4KKworQGVuZCB0YWJsZQorCitAc3Vic2VjdGlvbiBhbWlnYS5saWIKKworQHhyZWZ7YW1pZ2FsaWJ9LgorCitUaGlzIHZlcnNpb24gb2YgQGZpbGV7YW1pZ2EubGlifSBvbmx5IHN1cHBvcnRzIHRoZSBmdW5jdGlvbmFsaXR5IHByZXNlbnQKK2luIEtpY2tzdGFydCAxLjIvMS4zLgorCitAc3Vic2VjdGlvbiBhdXRvLmxpYgorCitUaGlzIGxpYnJhcnkgY29ycmVzcG9uZHMgdG8gdGhlIEFtaWdhT1MvNjhrIHZlcnNpb24gKEB4cmVme2F1dG9saWJ9KSwgYnV0Citvbmx5IHN1cHBvcnRzIGxpYnJhcmllcyBvZiBLaWNrc3RhcnQgMS4zLgorCitAc3Vic2VjdGlvbiBNaW5pbWFsIFN0YXJ0dXAgCisKK1lvdSBjYW4gdXNlIEBmaWxle21pbnN0YXJ0Lm99IHNpbWlsYXIgdG8gQW1pZ2FPUy82OGsgKEB4cmVme01pbmltYWwgU3RhcnR1cH0pLgorCitAc3Vic2VjdGlvbiBNaW5pbWFsIFN0YXJ0dXAgZm9yIFJlc2lkZW50IFByb2dyYW1zCisKK1lvdSBjYW4gdXNlIEBmaWxle21pbnJlcy5vfSBzaW1pbGFyIHRvIEFtaWdhT1MvNjhrIChAeHJlZntNaW5pbWFsIFJlc2lkZW50fSkuCisKKworQHNlY3Rpb24gUG93ZXJVcC9QUEMKKworVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBzcGVjaWZpY3Mgb2YgdGhlIEMgbGlicmFyeSBmb3IgUG93ZXJVcC9QUEMKK3Byb3ZpZGVkIGJ5IHRoZSB0YXJnZXQgQGZpbGV7cHBjLXBvd2VydXB9LgorVGhlIHJlbGV2YW50IGZpbGVzIGFyZSBAZmlsZXtzdGFydHVwLm99LCBAZmlsZXttaW5zdGFydC5vfSwKK0BmaWxle2xpYnZjLmF9LCBAZmlsZXtsaWJ2Y3MuYX0sIEBmaWxle2xpYm0uYX0sIEBmaWxle2xpYm1zLmF9CitAZmlsZXtsaWJhbWlnYS5hfSwgQGZpbGV7bGliYW1pZ2FzLmF9LAorQGZpbGV7bGliYXV0by5hfSBhbmQgQGZpbGV7bGliYXV0b3MuYX0uCisKK05vdGUgdGhhdCBAZmlsZXtsaWJleHRyYS5hfSBpcyBubyBsb25nZXIgcGFydCBvZiB0aGUgdmJjYyBkaXN0cmlidXRpb24uCitJdCB3YXMgcmVwbGFjZWQgYnkgJ1Bvc2l4TGliJywgYXZhaWxhYmxlIG9uIEFtaW5ldAorQGZpbGV7ZGV2L2MvdmJjY19Qb3NpeExpYi5saGF9LCB3aGljaCBoYXMgYSBtdWNoIG1vcmUgY29tcHJlaGVuc2l2ZQorc3VwcG9ydCBmb3IgUE9TSVggYW5kIFVuaXggZnVuY3Rpb25zLgorCitAc3Vic2VjdGlvbiBTdGFydHVwCisgCisgICAgVGhlIHN0YXJ0dXAgY29kZSBAZmlsZXtzdGFydHVwLm99IHNldHMgdXAgc29tZQorICAgIGdsb2JhbCB2YXJpYWJsZXMgYW5kIGluaXRpYWxpemVzIHN0ZGluLCBzdGRvdXQgYW5kIHN0ZGVyci4KKyAgICBUaGUgZXhpdCBjb2RlIGNsb3NlcyBhbGwgb3BlbiBmaWxlcyBhbmQgZnJlZXMgYWxsIG1lbW9yeS4KKyAgICBJZiB5b3UgbGluayB3aXRoIGEgbWF0aCBsaWJyYXJ5IHRoZSBzdGFydHVwL2V4aXQgY29kZSB3aWxsIGJlIHRha2VuCisgICAgZnJvbSB0aGVyZSBpZiBuZWNlc3NhcnkuCisKK0BzdWJzZWN0aW9uIEZsb2F0aW5nIHBvaW50CisgCisgICAgTm90ZSB0aGF0IHlvdSBoYXZlIHRvIGxpbmsgd2l0aCBhIG1hdGggbGlicmFyeSBpZiB5b3Ugd2FudCB0byB1c2UKKyAgICBmbG9hdGluZyBwb2ludC4gQWxsIG1hdGggZnVuY3Rpb25zLCBzcGVjaWFsIHN0YXJ0dXAgY29kZSBhbmQKKyAgICBwcmludGYvc2NhbmYgZnVuY3Rpb25zIHdoaWNoIHN1cHBvcnQgZmxvYXRpbmcgcG9pbnQgYXJlIGNvbnRhaW5lZCBpbgorICAgIHRoZSBtYXRoIGxpYnJhcmllcyBvbmx5LgorCisgICAgVGhlIG1hdGggbGlicmFyeSAoQGZpbGV7bGlibS5hfSkgaXMgbGlua2VkIGFnYWluc3QgdGhlIGZsb2F0aW5nIHBvaW50CisgICAgbGlicmFyeSBsaWJtb3RvIGJ5IE1vdG9yb2xhLgorCitEZXBlbmRpbmcgb24gdGhlIENQVS9GUFUgc2VsZWN0ZWQsIGluY2x1ZGluZyBAZmlsZXttYXRoLmh9IHdpbGwKK2NhdXNlIGlubGluZS1jb2RlIGdlbmVyYXRlZCBmb3IgY2VydGFpbiBtYXRoIGZ1bmN0aW9ucy4KKworQHN1YnNlY3Rpb24gU3RhY2sKKworU3RhY2staGFuZGxpbmcgaXMgc2ltaWxhciB0byBBbWlnYU9TLzY4ayAoQHhyZWZ7YW1pZ2Etc3RhY2t9KS4KK1RoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCBzdGFjay1zd2FwcGluZyBjYW5ub3QgYmUgZG9uZS4gSWYgdGhlCitkZWZhdWx0IHN0YWNrLXNpemUgaXMgbGVzcyB0aGFuIHRoZSBzdGFjay1zaXplIHNwZWNpZmllZCB3aXRoCitAY29kZXtfX3N0YWNrfSB0aGUgcHJvZ3JhbSB3aWxsIGFib3J0LgorCitAc3Vic2VjdGlvbiBTbWFsbCBkYXRhIG1vZGVsCisgCitXaGVuIHVzaW5nIHRoZSBzbWFsbCBkYXRhIG1vZGVsIG9mIHRoZSBQUEMgc2VyaWVzIENQVXMsIHlvdSBhbHNvIGhhdmUKK3RvIGxpbmsgd2l0aCBhcHByb3ByaWF0ZSBsaWJyYXJpZXMuIE1vc3QgbGlicmFyaWVzIGRvY3VtZW50ZWQgaGVyZSBhcmUKK2Fsc28gYXZhaWxhYmxlIGFzIHNtYWxsIGRhdGEgdmVyc2lvbnMgKHdpdGggYW4gJ3MnIGF0dGFjaGVkIHRvIHRoZQorZmlsZSBuYW1lKS4gRXhjZXB0aW9ucyBhcmUgdGhlIG1hdGggbGlicmFyaWVzLgorIAorVG8gY29tcGlsZSBhbmQgbGluayBhIHByb2dyYW0gdXNpbmcgdGhlIHNtYWxsIGRhdGEgbW9kZWwgYSBjb21tYW5kIGxpa2UKKyAKK0BleGFtcGxlCit2YyB0ZXN0LmMgLW8gdGVzdCAtc2QgLWx2Y3MgLWxhbWlnYXMKK0BlbmQgZXhhbXBsZQorIAorbWlnaHQgYmUgdXNlZC4KKworQHN1YnNlY3Rpb24gUmVzdHJpY3Rpb25zCisgCitUaGUgZm9sbG93aW5nIGxpc3QgY29udGFpbnMgc29tZSByZXN0cmljdGlvbnMgb2YgdGhpcyB2ZXJzaW9uIG9mIHRoZQorbGlicmFyeToKKyAKK0B0YWJsZSBAY29kZQorIAorQGl0ZW0gdG1wZmlsZSgpCitUaGUgQGNvZGV7dG1wZmlsZSgpfSBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyBhbiBlcnJvci4KKyAKK0BpdGVtIGNsb2NrKCkKK1RoZSBAY29kZXtjbG9jaygpfSBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyAtMS4gVGhpcyBpcyBjb3JyZWN0LAorYWNjb3JkaW5nIHRvIHRoZSBDIHN0YW5kYXJkLCBiZWNhdXNlIG9uIEFtaWdhT1MgaXQgaXMgbm90IHBvc3NpYmxlIHRvCitvYnRhaW4gdGhlIHRpbWUgdXNlZCBieSB0aGUgY2FsbGluZyBwcm9jZXNzLgorCitAZW5kIHRhYmxlCisKK0BzdWJzZWN0aW9uIE1pbmltYWwgU3RhcnR1cAorCitUaGUgcHJvdmlkZWQgbWluaW1hbCBzdGFydHVwIGNvZGUgKEBmaWxle21pbnN0YXJ0Lm99KSBpcyB1c2VkCitzaW1pbGFybHkgbGlrZSB0aGUgb25lIGZvciA2OGsgKEB4cmVme01pbmltYWwgU3RhcnR1cH0pLiBPbmx5IHVzZQoraXQgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgorCitAc3Vic2VjdGlvbiBsaWJhbWlnYS5hCisKK1RvIHdyaXRlIHByb2dyYW1zIGFjY2Vzc2luZyBBbWlnYU9TIChyYXRoZXIgdGhhbiBzdGFuZGFyZCBDIGZ1bmN0aW9ucworb25seSksIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBvcmlnaW5hbCAoY29weXJpZ2h0ZWQpIEBmaWxle2FtaWdhLmxpYn0KK2lzIHByb3ZpZGVkIHdpdGggQGNvbW1hbmR7dmJjY30uIFRoaXMgcmVwbGFjZW1lbnQgKEBmaWxle2xpYmFtaWdhLmF9KQorYXV0b21hdGljYWxseSBwZXJmb3JtcyBhIG5lY2Vzc2FyeSBjb250ZXh0IHN3aXRjaCB0byB0aGUgNjhrIHRvIGV4ZWN1dGUKK3RoZSBzeXN0ZW0gY2FsbC4gRnVydGhlcm1vcmUsIGl0IGlzIGFkYXB0ZWQgdG8gdmJjYywKK2RvZXMgbm90IGNhdXNlIGNvbGxpc2lvbnMgd2l0aCBzb21lIGZ1bmN0aW9ucyAoZS5nLiBAY29kZXtzcHJpbnRmfSkKK3Byb3ZpZGVkIGJ5IHRoZSBvcmlnaW5hbCBAZmlsZXthbWlnYS5saWJ9IGFuZCBpcyBhdmFpbGFibGUgaW4KK3NtYWxsIGRhdGEuCisKK1NwZWNpZnkgQG9wdGlvbnstbGFtaWdhfSB0byBsaW5rIHdpdGggQGZpbGV7bGliYW1pZ2EuYX0uCisgCitAc3Vic2VjdGlvbiBsaWJhdXRvLmEKKyAKK1RoaXMgbGlicmFyeSBjb3JyZXNwb25kcyB0byB0aGUgQW1pZ2FPUy82OGsgdmVyc2lvbiAoQHhyZWZ7YXV0b2xpYn0pLgorCitAc2VjdGlvbiBXYXJwT1MvUFBDCisgCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHNwZWNpZmljcyBvZiB0aGUgQyBsaWJyYXJ5IGZvciBXYXJwT1MvUFBDCitwcm92aWRlZCBieSB0aGUgdGFyZ2V0IEBmaWxle3BwYy13YXJwb3N9LgorVGhlIHJlbGV2YW50IGZpbGVzIGFyZSBAZmlsZXtzdGFydHVwLm99LCAKK0BmaWxle3ZjLmxpYn0sIEBmaWxle20ubGlifSwgQGZpbGV7YW1pZ2EubGlifSBhbmQgQGZpbGV7YXV0by5saWJ9LgorCitOb3RlIHRoYXQgQGZpbGV7ZXh0cmEubGlifSBpcyBubyBsb25nZXIgcGFydCBvZiB0aGUgdmJjYyBkaXN0cmlidXRpb24uCitJdCB3YXMgcmVwbGFjZWQgYnkgJ1Bvc2l4TGliJywgYXZhaWxhYmxlIG9uIEFtaW5ldAorQGZpbGV7ZGV2L2MvdmJjY19Qb3NpeExpYi5saGF9LCB3aGljaCBoYXMgYSBtdWNoIG1vcmUgY29tcHJlaGVuc2l2ZQorc3VwcG9ydCBmb3IgUE9TSVggYW5kIFVuaXggZnVuY3Rpb25zLgorCitAc3Vic2VjdGlvbiBTdGFydHVwCisgCisgICAgVGhlIHN0YXJ0dXAgY29kZSBAZmlsZXtzdGFydHVwLm99IHNldHMgdXAgc29tZQorICAgIGdsb2JhbCB2YXJpYWJsZXMgYW5kIGluaXRpYWxpemVzIHN0ZGluLCBzdGRvdXQgYW5kIHN0ZGVyci4KKyAgICBUaGUgZXhpdCBjb2RlIGNsb3NlcyBhbGwgb3BlbiBmaWxlcyBhbmQgZnJlZXMgYWxsIG1lbW9yeS4KKyAgICBJZiB5b3UgbGluayB3aXRoIGEgbWF0aCBsaWJyYXJ5IHRoZSBzdGFydHVwL2V4aXQgY29kZSB3aWxsIGJlIHRha2VuCisgICAgZnJvbSB0aGVyZSBpZiBuZWNlc3NhcnkuIAorCitAc3Vic2VjdGlvbiBGbG9hdGluZyBwb2ludAorIAorICAgIE5vdGUgdGhhdCB5b3UgaGF2ZSB0byBsaW5rIHdpdGggYSBtYXRoIGxpYnJhcnkgaWYgeW91IHdhbnQgdG8gdXNlCisgICAgZmxvYXRpbmcgcG9pbnQuIEFsbCBtYXRoIGZ1bmN0aW9ucywgc3BlY2lhbCBzdGFydHVwIGNvZGUgYW5kCisgICAgcHJpbnRmL3NjYW5mIGZ1bmN0aW9ucyB3aGljaCBzdXBwb3J0IGZsb2F0aW5nIHBvaW50IGFyZSBjb250YWluZWQgaW4KKyAgICB0aGUgbWF0aCBsaWJyYXJpZXMgb25seS4KKworICAgIFRoZSBtYXRoIGxpYnJhcnkgKEBmaWxle20ubGlifSkgY29udGFpbnMgZnVuY3Rpb25zIGZyb20gU3VuJ3MKKyAgICBwb3J0YWJsZSBmbG9hdGluZyBwb2ludCBsaWJyYXJ5LiBBZGRpdGlvbmFsbHksIHRoZXJlIGlzIGEKKyAgICBAY29tbWFuZHt2YmNjfSB2ZXJzaW9uIG9mIEFuZHJlYXMgSGV1bWFubidzIEBmaWxle3BwY21hdGgubGlifS4KKyAgICBUaGVzZSByb3V0aW5lcyBhcmUgbGlua2VkIGFnYWluc3QgTW90b3JvbGEncyBmbG9hdGluZyBwb2ludAorICAgIHJvdXRpbmVzIG9wdGltaXplZCBmb3IgUG93ZXJQQyBhbmQgdGhlcmVmb3JlIGFyZSBtdWNoIGZhc3Rlci4KKworICAgIFRvIG1ha2UgdXNlIG9mIHRoaXMgbGlicmFyeSwgbGluayB3aXRoIEBmaWxle3BwY21hdGgubGlifSBiZWZvcmUKKyAgICBAZmlsZXttLmxpYn0sIGUuZy4KKworQGV4YW1wbGUKKyAgICB2YyB0ZXN0LmMgLWxwcGNtYXRoIC1sbQorQGVuZCBleGFtcGxlCisgICAgCisKKyAKK0RlcGVuZGluZyBvbiB0aGUgQ1BVL0ZQVSBzZWxlY3RlZCwgaW5jbHVkaW5nIEBmaWxle21hdGguaH0gd2lsbAorY2F1c2UgaW5saW5lLWNvZGUgZ2VuZXJhdGVkIGZvciBjZXJ0YWluIG1hdGggZnVuY3Rpb25zLgorCitAc3Vic2VjdGlvbiBTdGFjaworCitTdGFjay1oYW5kbGluZyBpcyBzaW1pbGFyIHRvIEFtaWdhT1MvNjhrIChAeHJlZnthbWlnYS1zdGFja30pLgorCitAc3Vic2VjdGlvbiBSZXN0cmljdGlvbnMKKyAKK1RoZSBmb2xsb3dpbmcgbGlzdCBjb250YWlucyBzb21lIHJlc3RyaWN0aW9ucyBvZiB0aGlzIHZlcnNpb24gb2YgdGhlCitsaWJyYXJ5OgorIAorQHRhYmxlIEBjb2RlCisgCitAaXRlbSB0bXBmaWxlKCkKK1RoZSBAY29kZXt0bXBmaWxlKCl9IGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIGFuIGVycm9yLgorIAorQGl0ZW0gY2xvY2soKQorVGhlIEBjb2Rle2Nsb2NrKCl9IGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIC0xLiBUaGlzIGlzIGNvcnJlY3QsCithY2NvcmRpbmcgdG8gdGhlIEMgc3RhbmRhcmQsIGJlY2F1c2Ugb24gQW1pZ2FPUyBpdCBpcyBub3QgcG9zc2libGUgdG8KK29idGFpbiB0aGUgdGltZSB1c2VkIGJ5IHRoZSBjYWxsaW5nIHByb2Nlc3MuCisgCitAZW5kIHRhYmxlCisKK0BzdWJzZWN0aW9uIGFtaWdhLmxpYgorIAorVG8gd3JpdGUgcHJvZ3JhbXMgYWNjZXNzaW5nIEFtaWdhT1MgKHJhdGhlciB0aGFuIHN0YW5kYXJkIEMgZnVuY3Rpb25zCitvbmx5KSwgYSByZXBsYWNlbWVudCBmb3IgdGhlIG9yaWdpbmFsIChjb3B5cmlnaHRlZCkgQGZpbGV7YW1pZ2EubGlifQoraXMgcHJvdmlkZWQgd2l0aCBAY29tbWFuZHt2YmNjfS4gVGhpcyByZXBsYWNlbWVudAorYXV0b21hdGljYWxseSBwZXJmb3JtcyBhIG5lY2Vzc2FyeSBjb250ZXh0IHN3aXRjaCB0byB0aGUgNjhrIHRvIGV4ZWN1dGUKK3RoZSBzeXN0ZW0gY2FsbC4gRnVydGhlcm1vcmUsIGl0IGlzIGFkYXB0ZWQgdG8gdmJjYywKK2RvZXMgbm90IGNhdXNlIGNvbGxpc2lvbnMgd2l0aCBzb21lIGZ1bmN0aW9ucyAoZS5nLiBAY29kZXtzcHJpbnRmfSkKK3Byb3ZpZGVkIGJ5IHRoZSBvcmlnaW5hbCBAZmlsZXthbWlnYS5saWJ9IGFuZCBpcyBhdmFpbGFibGUgaW4KK3NtYWxsIGRhdGEuCisgCitTcGVjaWZ5IEBvcHRpb257LWxhbWlnYX0gdG8gbGluayB3aXRoIEBmaWxle2FtaWdhLmxpYn0uCisKKyAKK0BzdWJzZWN0aW9uIGF1dG8ubGliCisgCitUaGlzIGxpYnJhcnkgY29ycmVzcG9uZHMgdG8gdGhlIEFtaWdhT1MvNjhrIHZlcnNpb24gKEB4cmVme2F1dG9saWJ9KS4KKyAKKworQHNlY3Rpb24gTW9ycGhPUy9QUEMKKyAKK1RoaXMgc2VjdGlvbiBkZXNjcmliZXMgc3BlY2lmaWNzIG9mIHRoZSBDIGxpYnJhcnkgZm9yIE1vcnBoT1MvUFBDCitwcm92aWRlZCBieSB0aGUgdGFyZ2V0IEBmaWxle3BwYy1tb3JwaG9zfS4KK1RoZSByZWxldmFudCBmaWxlcyBhcmUgQGZpbGV7c3RhcnR1cC5vfSwgQGZpbGV7bWluc3RhcnQub30sCitAZmlsZXtsaWJ2Yy5hfSwgQGZpbGV7bGlidmNzLmF9LCBAZmlsZXtsaWJtLmF9LCBAZmlsZXtsaWJtcy5hfQorQGZpbGV7bGliYW1pZ2EuYX0sIEBmaWxle2xpYmFtaWdhcy5hfSwKK0BmaWxle2xpYmF1dG8uYX0gYW5kIEBmaWxle2xpYmF1dG9zLmF9LgorCitOb3RlIHRoYXQgQGZpbGV7bGliZXh0cmEuYX0gaXMgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIHZiY2MgZGlzdHJpYnV0aW9uLgorSXQgd2FzIHJlcGxhY2VkIGJ5ICdQb3NpeExpYicsIGF2YWlsYWJsZSBvbiBBbWluZXQKK0BmaWxle2Rldi9jL3ZiY2NfUG9zaXhMaWIubGhhfSwgd2hpY2ggaGFzIGEgbXVjaCBtb3JlIGNvbXByZWhlbnNpdmUKK3N1cHBvcnQgZm9yIFBPU0lYIGFuZCBVbml4IGZ1bmN0aW9ucy4KKyAKK0BzdWJzZWN0aW9uIFN0YXJ0dXAKKyAKKyAgICBUaGUgc3RhcnR1cCBjb2RlIEBmaWxle3N0YXJ0dXAub30gc2V0cyB1cCBzb21lCisgICAgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgaW5pdGlhbGl6ZXMgc3RkaW4sIHN0ZG91dCBhbmQgc3RkZXJyLgorICAgIFRoZSBleGl0IGNvZGUgY2xvc2VzIGFsbCBvcGVuIGZpbGVzIGFuZCBmcmVlcyBhbGwgbWVtb3J5LgorICAgIElmIHlvdSBsaW5rIHdpdGggYSBtYXRoIGxpYnJhcnkgdGhlIHN0YXJ0dXAvZXhpdCBjb2RlIHdpbGwgYmUgdGFrZW4KKyAgICBmcm9tIHRoZXJlIGlmIG5lY2Vzc2FyeS4KKyAKK0BzdWJzZWN0aW9uIEZsb2F0aW5nIHBvaW50CisgCisgICAgTm90ZSB0aGF0IHlvdSBoYXZlIHRvIGxpbmsgd2l0aCBhIG1hdGggbGlicmFyeSBpZiB5b3Ugd2FudCB0byB1c2UKKyAgICBmbG9hdGluZyBwb2ludC4gQWxsIG1hdGggZnVuY3Rpb25zLCBzcGVjaWFsIHN0YXJ0dXAgY29kZSBhbmQKKyAgICBwcmludGYvc2NhbmYgZnVuY3Rpb25zIHdoaWNoIHN1cHBvcnQgZmxvYXRpbmcgcG9pbnQgYXJlIGNvbnRhaW5lZCBpbgorICAgIHRoZSBtYXRoIGxpYnJhcmllcyBvbmx5LgorIAorICAgIFRoZSBtYXRoIGxpYnJhcnkgKEBmaWxle2xpYm0uYX0pIGlzIGxpbmtlZCBhZ2FpbnN0IHRoZSBmbG9hdGluZyBwb2ludAorICAgIGxpYnJhcnkgbGlibW90byBieSBNb3Rvcm9sYS4KKyAKK0RlcGVuZGluZyBvbiB0aGUgQ1BVL0ZQVSBzZWxlY3RlZCwgaW5jbHVkaW5nIEBmaWxle21hdGguaH0gd2lsbAorY2F1c2UgaW5saW5lLWNvZGUgZ2VuZXJhdGVkIGZvciBjZXJ0YWluIG1hdGggZnVuY3Rpb25zLgorCitAc3Vic2VjdGlvbiBTdGFjaworCitTdGFjay1oYW5kbGluZyBpcyBzaW1pbGFyIHRvIEFtaWdhT1MvNjhrIChAeHJlZnthbWlnYS1zdGFja30pLgorCitAc3Vic2VjdGlvbiBTbWFsbCBkYXRhIG1vZGVsCisgCitXaGVuIHVzaW5nIHRoZSBzbWFsbCBkYXRhIG1vZGVsIG9mIHRoZSBQUEMgc2VyaWVzIENQVXMsIHlvdSBhbHNvIGhhdmUKK3RvIGxpbmsgd2l0aCBhcHByb3ByaWF0ZSBsaWJyYXJpZXMuIE1vc3QgbGlicmFyaWVzIGRvY3VtZW50ZWQgaGVyZSBhcmUKK2Fsc28gYXZhaWxhYmxlIGFzIHNtYWxsIGRhdGEgdmVyc2lvbnMgKHdpdGggYW4gJ3MnIGF0dGFjaGVkIHRvIHRoZQorZmlsZSBuYW1lKS4gRXhjZXB0aW9ucyBhcmUgdGhlIG1hdGggbGlicmFyaWVzLgorIAorVG8gY29tcGlsZSBhbmQgbGluayBhIHByb2dyYW0gdXNpbmcgdGhlIHNtYWxsIGRhdGEgbW9kZWwgYSBjb21tYW5kIGxpa2UKKyAKK0BleGFtcGxlCit2YyB0ZXN0LmMgLW8gdGVzdCAtc2QgLWx2Y3MgLWxhbWlnYXMKK0BlbmQgZXhhbXBsZQorIAorbWlnaHQgYmUgdXNlZC4KKworQHN1YnNlY3Rpb24gUmVzdHJpY3Rpb25zCisgCitUaGUgZm9sbG93aW5nIGxpc3QgY29udGFpbnMgc29tZSByZXN0cmljdGlvbnMgb2YgdGhpcyB2ZXJzaW9uIG9mIHRoZQorbGlicmFyeToKKyAKK0B0YWJsZSBAY29kZQorIAorQGl0ZW0gdG1wZmlsZSgpCitUaGUgQGNvZGV7dG1wZmlsZSgpfSBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyBhbiBlcnJvci4KKyAKK0BpdGVtIGNsb2NrKCkKK1RoZSBAY29kZXtjbG9jaygpfSBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyAtMS4gVGhpcyBpcyBjb3JyZWN0LAorYWNjb3JkaW5nIHRvIHRoZSBDIHN0YW5kYXJkLCBiZWNhdXNlIG9uIE1vcnBoT1MgaXQgaXMgbm90IHBvc3NpYmxlIHRvCitvYnRhaW4gdGhlIHRpbWUgdXNlZCBieSB0aGUgY2FsbGluZyBwcm9jZXNzLgorIAorQGVuZCB0YWJsZQorCitAc3Vic2VjdGlvbiBsaWJhbWlnYS5hCisKK1RvIHdyaXRlIHByb2dyYW1zIHVzaW5nIEFtaWdhT1MgY29tcGF0aWJsZSBmdW5jdGlvbnMsIGEgcmVwbGFjZW1lbnQgZm9yCit0aGUgb3JpZ2luYWwgKGNvcHlyaWdodGVkKSBAZmlsZXthbWlnYS5saWJ9CitpcyBwcm92aWRlZCB3aXRoIEBjb21tYW5ke3ZiY2N9LiBUaGlzIHJlcGxhY2VtZW50IChAZmlsZXtsaWJhbWlnYS5hfSkKK3dpbGwgaW52b2tlIHRoZSBNb3JwaE9TIDY4ayBlbXVsYXRvciB0byBleGVjdXRlIHRoZSBzeXN0ZW0gZnVuY3Rpb24uCitGdXJ0aGVybW9yZSwgaXQgaXMgYWRhcHRlZCB0byB2YmNjIGFuZAorZG9lcyBub3QgY2F1c2UgY29sbGlzaW9ucyB3aXRoIHNvbWUgZnVuY3Rpb25zIChlLmcuIEBjb2Rle3NwcmludGZ9KQorYW5kIGlzIGF2YWlsYWJsZSBpbiBzbWFsbCBkYXRhLgorCitTcGVjaWZ5IEBvcHRpb257LWxhbWlnYX0gdG8gbGluayB3aXRoIEBmaWxle2xpYmFtaWdhLmF9LgorCisKK0BzdWJzZWN0aW9uIGxpYmF1dG8uYQorIAorVGhpcyBsaWJyYXJ5IGNvcnJlc3BvbmRzIHRvIHRoZSBBbWlnYU9TLzY4ayB2ZXJzaW9uIChAeHJlZnthdXRvbGlifSkuCisgCisKK0BzZWN0aW9uIEFtaWdhT1M0L1BQQworIAorVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBzcGVjaWZpY3Mgb2YgdGhlIEMgbGlicmFyeSBmb3IgQW1pZ2FPUzQvUFBDCitwcm92aWRlZCBieSB0aGUgdGFyZ2V0IEBmaWxle3BwYy1hbWlnYW9zfS4KK1RoZSByZWxldmFudCBmaWxlcyBhcmUgQGZpbGV7c3RhcnR1cC5vfSwgQGZpbGV7bWluc3RhcnQub30sCitAZmlsZXtsaWJ2Yy5hfSwgQGZpbGV7bGlidmNzLmF9LCBAZmlsZXtsaWJtLmF9LCBAZmlsZXtsaWJtcy5hfQorQGZpbGV7bGliYW1pZ2EuYX0sIEBmaWxle2xpYmFtaWdhcy5hfSwKK0BmaWxle2xpYmF1dG8uYX0gYW5kIEBmaWxle2xpYmF1dG9zLmF9LgorCitOb3RlIHRoYXQgQGZpbGV7bGliZXh0cmEuYX0gaXMgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIHZiY2MgZGlzdHJpYnV0aW9uLgorSXQgd2FzIHJlcGxhY2VkIGJ5ICdQb3NpeExpYicsIGF2YWlsYWJsZSBvbiBBbWluZXQKK0BmaWxle2Rldi9jL3ZiY2NfUG9zaXhMaWIubGhhfSwgd2hpY2ggaGFzIGEgbXVjaCBtb3JlIGNvbXByZWhlbnNpdmUKK3N1cHBvcnQgZm9yIFBPU0lYIGFuZCBVbml4IGZ1bmN0aW9ucy4KKyAKK0BzdWJzZWN0aW9uIFN0YXJ0dXAKKyAKK1RoZSBzdGFydHVwIGNvZGUgQGZpbGV7c3RhcnR1cC5vfSBzZXRzIHVwIHNvbWUKK2dsb2JhbCB2YXJpYWJsZXMgYW5kIGluaXRpYWxpemVzIHN0ZGluLCBzdGRvdXQgYW5kIHN0ZGVyci4KK1RoZW4gaXQgcnVucyBhbGwgY29uc3RydWN0b3JzIG9mIGR5bmFtaWNhbGx5IGxpbmtlZCBsaWJyYXJpZXMsIGJlZm9yZQorZW50ZXJpbmcgdGhlIG1haW4gcHJvZ3JhbS4KK1RoZSBleGl0IGNvZGUgcnVucyBhbGwgZGVzdHJ1Y3RvcnMgb2YgZHluYW1pY2FsbHkgbGlua2VkIGxpYnJhcmllcywKK2Nsb3NlcyBhbGwgb3BlbiBmaWxlcyBhbmQgZnJlZXMgYWxsIG1lbW9yeS4KK0lmIHlvdSBsaW5rIHdpdGggYSBtYXRoIGxpYnJhcnkgdGhlIHN0YXJ0dXAvZXhpdCBjb2RlIHdpbGwgYmUgdGFrZW4KK2Zyb20gdGhlcmUgaWYgbmVjZXNzYXJ5LgorIAorQHN1YnNlY3Rpb24gRmxvYXRpbmcgcG9pbnQKKyAKK05vdGUgdGhhdCB5b3UgaGF2ZSB0byBsaW5rIHdpdGggYSBtYXRoIGxpYnJhcnkgaWYgeW91IHdhbnQgdG8gdXNlCitmbG9hdGluZyBwb2ludC4gQWxsIG1hdGggZnVuY3Rpb25zLCBzcGVjaWFsIHN0YXJ0dXAgY29kZSBhbmQKK3ByaW50Zi9zY2FuZiBmdW5jdGlvbnMgd2hpY2ggc3VwcG9ydCBmbG9hdGluZyBwb2ludCBhcmUgY29udGFpbmVkIGluCit0aGUgbWF0aCBsaWJyYXJpZXMgb25seS4KKworVGhlIG1hdGggbGlicmFyeSAoQGZpbGV7bGlibS5hfSkgaXMgbGlua2VkIGFnYWluc3QgdGhlIGZsb2F0aW5nIHBvaW50CitsaWJyYXJ5IGxpYm1vdG8gYnkgTW90b3JvbGEuCisgCitEZXBlbmRpbmcgb24gdGhlIENQVS9GUFUgc2VsZWN0ZWQsIGluY2x1ZGluZyBAZmlsZXttYXRoLmh9IHdpbGwKK2NhdXNlIGlubGluZS1jb2RlIGdlbmVyYXRlZCBmb3IgY2VydGFpbiBtYXRoIGZ1bmN0aW9ucy4KKworQHN1YnNlY3Rpb24gU3RhY2sKKworVGhlcmUgaXMgbm8gYXV0b21hdGljIHN0YWNrIGV4dGVuc2lvbiBmb3IgQW1pZ2FPUyA0ISBUaGlzIHNob3VsZCBiZQorZG9uZSBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLgorCitAc3Vic2VjdGlvbiBTbWFsbCBkYXRhIG1vZGVsCisgCitXaGVuIHVzaW5nIHRoZSBzbWFsbCBkYXRhIG1vZGVsIG9mIHRoZSBQUEMgc2VyaWVzIENQVXMsIHlvdSBhbHNvIGhhdmUKK3RvIGxpbmsgd2l0aCBhcHByb3ByaWF0ZSBsaWJyYXJpZXMuIE1vc3QgbGlicmFyaWVzIGRvY3VtZW50ZWQgaGVyZSBhcmUKK2Fsc28gYXZhaWxhYmxlIGFzIHNtYWxsIGRhdGEgdmVyc2lvbnMgKHdpdGggYW4gJ3MnIGF0dGFjaGVkIHRvIHRoZQorZmlsZSBuYW1lKS4gRXhjZXB0aW9ucyBhcmUgdGhlIG1hdGggbGlicmFyaWVzLgorIAorVG8gY29tcGlsZSBhbmQgbGluayBhIHByb2dyYW0gdXNpbmcgdGhlIHNtYWxsIGRhdGEgbW9kZWwgYSBjb21tYW5kIGxpa2UKKyAKK0BleGFtcGxlCit2YyB0ZXN0LmMgLW8gdGVzdCAtc2QgLWx2Y3MgLWxhbWlnYXMKK0BlbmQgZXhhbXBsZQorIAorbWlnaHQgYmUgdXNlZC4KKworQHN1YnNlY3Rpb24gRHluYW1pYyBsaW5raW5nCitTaW5jZSBAZmlsZXtlbGYubGlicmFyeX0gQGNvZGV7VjUyLjJ9IEFtaWdhT1M0IHN1cHBvcnRzIGR5bmFtaWMgbGlua2luZyB3aXRoCitzaGFyZWQgb2JqZWN0IGZpbGVzIChAZmlsZXsuc299IGV4dGVuc2lvbiksIHNpbWlsYXIgdG8gVW5peC4gVGhlIGRlZmF1bHQKK2JlaGF2aW91ciBpcyB0byBwcmVmZXIgbGlua2luZyBhZ2FpbnN0IGEgc2hhcmVkIG9iamVjdCBvdmVyIGEgc3RhdGljCitsaWJyYXJ5LiBUbyBmb3JjZSBzdGF0aWMgbGlua2luZyB5b3UgbWlnaHQgd2FudCB0byBnaXZlIHRoZQorQG9wdGlvbnstc3RhdGljfSBvcHRpb24gdG8gdGhlIEBmaWxle3ZjfSBmcm9udGVuZC4KKworQHN1YnNlY3Rpb24gUmVzdHJpY3Rpb25zCisgCitUaGUgZm9sbG93aW5nIGxpc3QgY29udGFpbnMgc29tZSByZXN0cmljdGlvbnMgb2YgdGhpcyB2ZXJzaW9uIG9mIHRoZQorbGlicmFyeToKKyAKK0B0YWJsZSBAY29kZQorIAorQGl0ZW0gdG1wZmlsZSgpCitUaGUgQGNvZGV7dG1wZmlsZSgpfSBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyBhbiBlcnJvci4KKyAKK0BpdGVtIGNsb2NrKCkKK1RoZSBAY29kZXtjbG9jaygpfSBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyAtMS4gVGhpcyBpcyBjb3JyZWN0LAorYWNjb3JkaW5nIHRvIHRoZSBDIHN0YW5kYXJkLCBiZWNhdXNlIG9uIEFtaWdhT1MgaXQgaXMgbm90IHBvc3NpYmxlIHRvCitvYnRhaW4gdGhlIHRpbWUgdXNlZCBieSB0aGUgY2FsbGluZyBwcm9jZXNzLgorCitAaXRlbSBTbWFsbCBkYXRhIGluIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlcworVGhlcmUgaXMgYSBidWcgaW4gQGZpbGV7ZWxmLmxpYnJhcnl9IEBjb2Rle1Y1Mi40fSAoYW5kIGVhcmxpZXIpLCB3aGljaAorZG9lc24ndCBsb2FkIEBjb2Rley5zZGF0YX0gYW5kIEBjb2Rley5zYnNzfSBhcyBhIGNvbnRpZ3VvdXMgYmxvY2sgaW50bworbWVtb3J5LCB3aGVuIHRoZSBleGVjdXRhYmxlIHJlcXVpcmVzIGR5bmFtaWMgbGlua2luZy4gSSBkZWNpZGVkIGFnYWluc3QKK3dyaXRpbmcgYSB3b3JrYXJvdW5kLCBhcyB0aGUgYnVnIHNob3VsZCBiZSBmaXhlZCBpbiBPUzQuCisKK0BlbmQgdGFibGUKKworQHN1YnNlY3Rpb24gbGliYW1pZ2EuYQorCitJbiBjb250cmFzdCB0byBvdGhlciBhbWlnYWxpYnMgdGhlIE9TNCBAZmlsZXtsaWJhbWlnYS5hfSBkb2Vzbid0IGNvbnRhaW4KK2FueSBzdHVicyBmb3IgY2FsbGluZyBzeXN0ZW0gZnVuY3Rpb25zLiBBbWlnYU9TIDQgc3lzdGVtIGNhbGxzIGFyZSBkb25lCit0aHJvdWdoIHNwZWNpYWwgbWFjcm9zIGluIHRoZSBTREsncyBpbnRlcmZhY2UgaGVhZGVyIGZpbGVzLgorCitUaGUgbGlicmFyeSBvbmx5IGluY2x1ZGVzIHNvbWUgcmVtYWluaW5nIGFtaWdhbGliIGZ1bmN0aW9ucywgbm90IGFscmVhZHkKK2ludGVncmF0ZWQgaW50byB0aGUgT1MsIGxpa2UgQGNvZGV7Q3JlYXRlSU8oKX0sIGJ1dCBpdHMgdXNlIGlzIGRpc2NvdXJhZ2VkLgorCitTcGVjaWZ5IEBvcHRpb257LWxhbWlnYX0gdG8gbGluayB3aXRoIEBmaWxle2xpYmFtaWdhLmF9LgorCisKK0BzdWJzZWN0aW9uIGxpYmF1dG8uYQorCitJbmNsdWRlIGF1dG8tb3BlbiBhbmQgLWNsb3NlIGZ1bmN0aW9ucyBmb3IgdGhlIG1vc3QgY29tbW9uIE9TIGxpYnJhcmllcyBhbmQKK2ludGVyZmFjZXMuIE1heSBhbHNvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBuZXdsaWIgKHNlZSBiZWxvdykuCisgCisKK0BzdWJzZWN0aW9uIG5ld2xpYgorCitAc3Vic3Vic2VjdGlvbiBJbnRyb2R1Y3Rpb24KKworICAgIG5ld2xpYi5saWJyYXJ5IGlzIGEgc2hhcmVkIEFtaWdhT1M0IGxpYnJhcnksIHdoaWNoIGlzIGNvdmVyZWQgYnkKKyAgICBzZXZlcmFsIEJTRCBsaWtlIGxpY2Vuc2VzLAorICAgIGFuZCBpbmNsdWRlcyBzdGFuZGFyZCBBTlNJIGFuZCBQT1NJWCBmdW5jdGlvbnMgYXMgd2VsbCBhcyBzb21lCisgICAgZnVuY3Rpb25zIGNvbW1vbiBpbiBVbml4LCBCU0QgYW5kIHNpbWlsYXIgb3BlcmF0aW5nIHN5c3RlbXMuIEl0IGlzCisgICAgcGFydCBvZiB0aGUgT1M0IFNESy4KKworICAgIFRoZSBjb25maWcgZmlsZSBAZmlsZXtuZXdsaWJ9IHdpbGwgYmUgY3JlYXRlZCBvbiBpbnN0YWxsYXRpb24gdG8KKyAgICB1c2UgdGhlIHBhdGhzIGZvciBoZWFkZXIgZmlsZXMgYW5kIGxpYnJhcmllcyBwb2ludGluZyB0byB0aGUKKyAgICBuZXdsaWIgZnJvbSB0aGUgU0RLLiAKKworICAgIFdoYXQgYXJlIHRoZSBtYWluIGRpZmZlcmVuY2VzIGJldHdlZW4gdmNsaWIgYW5kIG5ld2xpYj8KKworQGl0ZW1pemUgQG1pbnVzCitAaXRlbSB2Y2xpYiBjb250YWlucyAoYWxtb3N0KSBvbmx5IHN0YW5kYXJkIEFOU0ktQyBhbmQgc29tZSBJU08tQzk5CisgICAgICBmdW5jdGlvbnMuIElmIHlvdSB3YW50IHRvIHBvcnQgVW5peCBwcm9ncmFtcyB5b3Ugd2lsbCBwcm9iYWJseQorICAgICAgbWlzcyBhIGxvdCBvZiBmdW5jdGlvbnMuCisgICAgICBBbHNvIG5ld2xpYiBzdXBwb3J0cyB0aGluZ3MgbGlrZSBtYXBwaW5nIFVuaXggZGlyZWN0b3J5IHBhdGhzIHRvCisgICAgICBBbWlnYSBwYXRocyBvciBleHBhbmRpbmcgd2lsZGNhcmRzIGluIGNvbW1hbmQgbGluZXMgYXV0b21hdGljYWxseS4KKyAKK0BpdGVtIFByb2dyYW1zIGNvbXBpbGVkIGZvciBuZXdsaWIgd2lsbCBiZSBzaG9ydGVyIGJlY2F1c2UgdGhlIGNvZGUgZm9yIGFsbAorICAgICAgZnVuY3Rpb25zIGlzIG5vdCBjb250YWluZWQgaW4gdGhlIGV4ZWN1dGFibGUgaXRzZWxmLgorCitAaXRlbSBQcm9ncmFtcyBjb21waWxlZCBmb3IgbmV3bGliIHdpbGwgbmVlZCB0aGUgc2hhcmVkIG9iamVjdAorICAgICAgQGZpbGV7bGliYy5zb30gcHJlc2VudCB3aGVuIHN0YXJ0ZWQuCisKK0BpdGVtIFByb2dyYW1zIGNvbXBpbGVkIGZvciBuZXdsaWIgd2lsbCBwcm9iYWJseSBuZWVkIG1vcmUgbWVtb3J5IGJlY2F1c2UKKyAgICAgIHRoZSBlbnRpcmUgKHJhdGhlciBsYXJnZSkgQGZpbGV7bGliYy5zb30gd2lsbCBiZSBsb2FkZWQgaW50byBtZW1vcnkuCisgICAgICBXaXRoIHZjbGliIG9ubHkgdGhlIGZ1bmN0aW9ucyB5b3VyIHByb2dyYW0gdXNlcyB3aWxsIGJlIGluIFJBTS4KKyAgICAgIEhvd2V2ZXIgaWYgeW91IGhhdmUgc2V2ZXJhbCBwcm9ncmFtcyB1c2luZyBuZXdsaWIgYXQgdGhlIHNhbWUKKyAgICAgIHRpbWUgb25seSBvbmUgY29weSBvZiBAZmlsZXtsaWJjLnNvfSBzaG91bGQgYmUgbG9hZGVkLgorQGVuZCBpdGVtaXplCisKKyAgICBUaGluZ3MgeW91IHNob3VsZCBub3RlOgorIAorQGl0ZW1pemUgQG1pbnVzCitAaXRlbSBXaXRoIG5ld2xpYiB5b3UgZG8gbm90IG5lZWQgZXh0cmEgbWF0aC1saWJyYXJpZXMuCisgCitAaXRlbSBZb3UgbXVzdCBsaW5rIHdpdGggYSB2YmNjLXNwZWNpZmljIEBmaWxle3N0YXJ0dXAub30gZnJvbSB0aGUgbmV3bGliCisgICAgICBAZmlsZXtsaWIvfSBkaXJlY3RvcnkgYXMgc3RhcnR1cCBjb2RlLgorICAgICAgVGhlIGNvbmZpZy1maWxlIEBmaWxle25ld2xpYn0gd2lsbCB1c3VhbGx5IHRha2UgY2FyZSBvZiB0aGlzLgorIAorQGl0ZW0gWW91IF9tdXN0XyB1c2UgdGhlIG5ld2xpYi1pbmNsdWRlcyBmcm9tIHRoZSBTREsKKyAgICAgIHJhdGhlciB0aGFuIHRoZSBvbmVzIHdoaWNoIGFyZSBmb3IgdmMubGliLgorICAgICAgVGhlIGNvbmZpZy1maWxlIEBmaWxle25ld2xpYn0gd2lsbCB1c3VhbGx5IHRha2UgY2FyZSBvZiB0aGlzLgorCitAaXRlbSBUaGVyZSBtYXkgYmUgdmJjYy1yZWxhdGVkIGJ1Z3MgaW4gdGhlIFNESy1uZXdsaWIuIFBhdGNoZXMgYXJlCisgICAgICBhdXRvbWF0aWNhbGx5IGluc3RhbGxlZCB3aGVuIHVzaW5nIHRoZSBBbWlnYSBJbnN0YWxsZXIuIFdoZW4KKyAgICAgIGluc3RhbGxpbmcgdGhlIHRhcmdldCBtYW51YWxseSwgeW91IGFsc28gaGF2ZSB0byBmaXggdGhlIFNESworICAgICAgbWFudWFsbHkuIEZvciBhIGxpc3Qgb2Yga25vd24gU0RLIGJ1Z3MgYXQgdGhpcyBwb2ludCBvZiB0aW1lLAorICAgICAgQHhyZWZ7S25vd24gTmV3bGliIEJ1Z3N9LgorQGVuZCBpdGVtaXplCisKK0Bub2RlIEtub3duIE5ld2xpYiBCdWdzCitAc3Vic3Vic2VjdGlvbiBLbm93biBOZXdsaWIgQnVncworCitAaXRlbWl6ZSBAbWludXMKKworQGl0ZW0gVGhlIEBjb2Rle19fYXNtX3RvdXBwZXIoKX0gYW5kIEBjb2Rle19fYXNtX3RvbG93ZXIoKX0gYXNzZW1ibGVyIGlubGluZXMKKyAgICAgIGluIEBmaWxle25ld2xpYi9pbmNsdWRlL2N0eXBlLmh9IGFyZSB3cm9uZywgd2hpY2ggbWFrZXMKKyAgICAgIEBjb2Rle3RvdXBwZXIoKX0gYW5kIEBjb2Rle3RvbG93ZXIoKX0gZmFpbCB3aGVuIGluY2x1ZGluZworICAgICAgQGZpbGV7Y3R5cGUuaH0uIEZpeDoKK0BleGFtcGxlCistLS0gY3R5cGUuaC5vcmlnCTIwMDYtMDQtMDMgMTg6MDA6MDAuMDAwMDAwMDAwICswMjAwCisrKysgY3R5cGUuaAkyMDE3LTA1LTA3IDE5OjMyOjAwLjAwMDAwMDAwMCArMDIwMAorQEBAQCAtNjQsOCArNjQsOCBAQEBACisgI2VsaWYgZGVmaW5lZChfX1ZCQ0NfXykKKyBpbnQgX19hc21fdG91cHBlcihfX3JlZygicjMiKSBpbnQpID0KKyAgICAgICAgICJcdC5leHRlcm5cdF9fY3R5cGVfcHRyXG4iCistICAgICAgICAiXHRsaXNcdDExLChfX2N0eXBlX3B0cilAQGhhXG4iCistICAgICAgICAiXHRhZGRpXHQxMSwxMSwoX19jdHlwZV9wdHIpQEBsXG4iCisrICAgICAgICAiXHRsaXNcdDExLF9fY3R5cGVfcHRyQEBoYVxuIgorKyAgICAgICAgIlx0bHd6XHQxMSwxMSxfX2N0eXBlX3B0ckBAbCgxMSlcbiIKKyAgICAgICAgICJcdGxienhcdDEyLDExLDNcbiIKKyAgICAgICAgICJcdGFuZGkuXHQxMiwxMiwyXG4iCisgICAgICAgICAiXHRiZXFcdCQrOFxuIgorQEBAQCAtNzMsOCArNzMsOCBAQEBACisgICAgICAgICAiI2JhcnJpZXIiOworIGludCBfX2FzbV90b2xvd2VyKF9fcmVnKCJyMyIpIGludCkgPQorICAgICAgICAgIlx0LmV4dGVyblx0X19jdHlwZV9wdHJcbiIKKy0gICAgICAgICJcdGxpc1x0MTEsKF9fY3R5cGVfcHRyKUBAaGFcbiIKKy0gICAgICAgICJcdGFkZGlcdDExLDExLChfX2N0eXBlX3B0cilAQGxcbiIKKysgICAgICAgICJcdGxpc1x0MTEsX19jdHlwZV9wdHJAQGhhXG4iCisrICAgICAgICAiXHRsd3pcdDExLDExLF9fY3R5cGVfcHRyQEBsKDExKVxuIgorICAgICAgICAgIlx0bGJ6eFx0MTIsMTEsM1xuIgorICAgICAgICAgIlx0YW5kaS5cdDEyLDEyLDFcbiIKKyAgICAgICAgICJcdGJlcVx0JCs4XG4iCitAZW5kIGV4YW1wbGUKK05vdGU6IFRoaXMgc2hvdWxkIGJlIGZpeGVkIHdpdGggdGhlIGxhdGVzdCBPUzQgU0RLLCBhbmQgdGhlIFYwLjloCitpbnN0YWxsZXIgd2lsbCBubyBsb25nZXIgaW5zdGFsbCBhIHBhdGNoIQorCitAaXRlbSBOZXdsaWIncyBAZmlsZXtsaWJhdXRvLmF9IGNvbnRhaW5zIG5vIHdvcmtpbmcgdmJjYy1zdHlsZQorY29uc3RydWN0b3JzIG9yIGRlc3RydWN0b3JzIGZvciBhdXRvLW9wZW5pbmcgb3IgLWNsb3Npbmcgb2YgbGlicmFyaWVzLgorWW91IGNhbiB3b3JrLWFyb3VuZCBpdCwgYnkgY29weWluZyB2Y2xpYidzIEBmaWxle2xpYmF1dG8uYX0gdG8KK25ld2xpYidzIGxpYi1kaXJlY3RvcnkuIFJlbmFtZSBpdCwgaWYgeW91IGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlCit0aGUgZ2NjLXZlcnNpb24gb2YgaXQuCisKK0BpdGVtIFNvbWUgaGVhZGVyIGZpbGVzLCBsaWtlIEBmaWxle3N5cy9zdGF0Lmh9LCB1c2UgdGhlIHJlc2VydmVkIHZiY2MKK2F0dHJpYnV0ZSBAY29kZXtfX21hc2t9IGFzIGFuIGFyZ3VtZW50IG5hbWUuIFRoZSBjb25maWcgZmlsZSBzaG91bGQKK3Rha2UgY2FyZSBvZiB0aGF0LCBieSByZWRlZmluaW5nIGl0IGFzIEBjb2Rle19fX21hc2t9LgorCitAZW5kIGl0ZW1pemUKKworQHN1YnN1YnNlY3Rpb24gVXNhZ2UKKworVG8gY29tcGlsZSBhIHByb2dyYW0gdG8gdXNlIG5ld2xpYiBmb3IgT1M0IHlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUgcHJvcGVyCitjb25maWctZmlsZSAoQGZpbGV7bmV3bGlifSkgaXMgdXNlZCwgZS5nLgorIAorQGV4YW1wbGUKKyAgICAgICAgdmMgK25ld2xpYiBoZWxsby5jCitAZW5kIGV4YW1wbGUKKworV2l0aCBhIG5ldyBTREsgdGhpcyB3aWxsIHVzdWFsbHkgZ2VuZXJhdGUgYSBkeW5hbWljYWxseSBsaW5rZWQgZXhlY3V0YWJsZSwKK3doaWNoIHJlcXVpcmVzIEBmaWxle2xpYmMuc299LiBUbyBmb3JjZSBhIHN0YXRpY2FsbHkgbGlua2VkIGV4ZWN1dGFibGU6CisKK0BleGFtcGxlCisgICAgICAgIHZjICtuZXdsaWIgLXN0YXRpYyBoZWxsby5jCitAZW5kIGV4YW1wbGUKKworCitAc2VjdGlvbiBBdGFyaSBUT1MvTWlOVAorCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHNwZWNpZmljcyBvZiB0aGUgQyBsaWJyYXJ5IGZvciBBdGFyaSBUT1MgYW5kIE1pTlQuCitNNjgweDAgcHJvY2Vzc29ycyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSB0YXJnZXQgQGZpbGV7bTY4ay1hdGFyaX0sIHdoaWxlCitDb2xkRmlyZSBwcm9jZXNzb3JzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIHRhcmdldCBAZmlsZXtjZi1hdGFyaX0uIEJvdGgKK3NoYXJlIHRoZSBzYW1lIHN0YXJ0dXAtY29kZSBhbmQgYXJlIGJhc2VkIG9uIGNvbW1vbiBsaWJyYXJ5IHNvdXJjZXMgYW5kCitoZWFkZXIgZmlsZXMuIEV4ZWN1dGFibGVzIGxpbmtlZCB3aXRoIHRoaXMgQyBsaWJyYXJ5IHJ1biBvbiBwbGFpbiBUT1MgYXMKK3dlbGwgYXMgb24gTWlOVCwgd2l0aG91dCBtb2RpZmljYXRpb25zLgorCitUaGUgcmVsZXZhbnQgZmlsZXMgYXJlIEBmaWxle3N0YXJ0dXAub30sIEBmaWxle21pbnN0YXJ0Lm99LAorQGZpbGV7bGlidmMuYX0sIEBmaWxle2xpYm0uYX0sIEBmaWxle2xpYmdlbS5hfS4gRm9yIHRoZSBNNjhrIHRhcmdldAordGhlcmUgYXJlIGFsc28gbWF0aCBsaWJzIHdpdGggRlBVIHN1cHBvcnQgKEBmaWxle2xpYm04ODEuYX0sCitAZmlsZXtsaWJtMDQwLmF9IGFuZCBAZmlsZXtsaWJtMDYwLmF9KSBhbmQgMTYtYml0IGludGVnZXIgdmVyc2lvbnMKK29mIGFsbCBsaWJyYXJpZXMgKEBmaWxle2xpYioxNi5hfSkuCisKK1RoZSBmb2xsb3dpbmcgY29uZmlnIGZpbGVzIGFyZSBhdmFpbGFibGU6CitAdGFibGUgQGNvZGUKK0BpdGVtIHRvcworICBNNjhrIDMyLWJpdCBAY29kZXtpbnR9IGZvciBjbGFzc2ljIFRPUyBtYWNoaW5lcy4KK0BpdGVtIHRvczE2CisgIE02OGsgMTYtYml0IEBjb2Rle2ludH0gZm9yIGNsYXNzaWMgVE9TIG1hY2hpbmVzLgorQGl0ZW0gbWludAorICBNNjhrIDMyLWJpdCBAY29kZXtpbnR9IGZvciBNaU5ULiBBbHNvIHdvcmtzIG9uIGNsYXNzaWMgbWFjaGluZXMsCisgIGJ1dCB1c2VzIGFuIGVtYmVkZGVkIGEub3V0IGhlYWRlciBmb3IgTWlOVCwgaW5jbHVkZXMgYSBjaGFuZ2VhYmxlCisgIEBjb2Rle19fc3Rrc2l6ZX0gYW5kIHNldHMgdGhlIEZhc3RMb2FkLCBGYXN0UkFNIGFuZCBGYXN0QWxsb2MgZmxhZ3MKKyAgaW4gdGhlIGhlYWRlci4KK0BpdGVtIG1pbnRjZgorICBDb2xkRmlyZSAzMi1iaXQgQGNvZGV7aW50fS4gT3RoZXJ3aXNlIHNhbWUgYXMgQGZpbGV7bWludH0uCitAZW5kIHRhYmxlCisKK0BzdWJzZWN0aW9uIFN0YXJ0dXAKKyAKK1RoZSBzdGFydHVwIGNvZGUgQGZpbGV7c3RhcnR1cC5vfSBzZXRzIHVwIHNvbWUKK2dsb2JhbCB2YXJpYWJsZXMgYW5kIGluaXRpYWxpemVzIHN0ZGluLCBzdGRvdXQgYW5kIHN0ZGVyciBhbmQgcmV0dXJucwordGhlIHVubmVlZGVkIG1lbW9yeSB0byB0aGUgc3lzdGVtLgorVGhlIGV4aXQgY29kZSBjbG9zZXMgYWxsIG9wZW4gZmlsZXMgYW5kIGZyZWVzIGFsbCBtZW1vcnkuCisKK0BzdWJzZWN0aW9uIEZsb2F0aW5nIHBvaW50CisKK05vdGUgdGhhdCB5b3UgaGF2ZSB0byBsaW5rIHdpdGggYSBtYXRoIGxpYnJhcnkgaWYgeW91IHdhbnQgdG8gdXNlCitmbG9hdGluZyBwb2ludC4gQWxsIG1hdGggZnVuY3Rpb25zLCBzcGVjaWFsIHN0YXJ0dXAgY29kZSBhbmQKK3ByaW50Zi9zY2FuZiBmdW5jdGlvbnMgd2hpY2ggc3VwcG9ydCBmbG9hdGluZyBwb2ludCBhcmUgY29udGFpbmVkIGluCit0aGUgbWF0aCBsaWJyYXJpZXMgb25seS4KKworT24gdGhlIE02OGsgdGFyZ2V0IHlvdSBoYXZlIHRoZSBvcHRpb24gdG8gZW5hYmxlIEZQVSBzdXBwb3J0IHdpdGgKK3RoZSBAb3B0aW9uey1mcHV9IG9wdGlvbiBhbmQgY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSBtYXRoIGxpYnJhcnkKKyhAeHJlZntGbG9hdGluZyBwb2ludH0pLiBPdGhlcndpc2UsIHRoZXJlIGlzIGEgc29mdC1mbG9hdCBsaWJyYXJ5LAord2hpY2ggaXMgY29tcGF0aWJsZSB3aXRoIGFsbCB0aGUgQXRhcmkgbW9kZWxzIHdpdGhvdXQgYW4gRlBVLgorCitAc3Vic2VjdGlvbiBTdGFjaworCitUaGUgZGVmYXVsdCBzdGFjayBzaXplIGlzIDY0ay4gVGhlcmUgaXMgYSBNaU5UIHRvb2wgY2FsbGVkIEBmaWxle3N0YWNrfQord2hpY2ggY2FuIGFkanVzdCB0aGUgc3RhY2sgc2l6ZSBvZiBhbiBleGVjdXRhYmxlIHRvIGFueSB2YWx1ZSwgYnkgbG9va2luZworZm9yIGEgc3ltYm9sIG5hbWVkIEBjb2Rle19fc3Rrc2l6ZX0gKGRlZmluZWQgYnkgdmNsaWIncyBzdGFydHVwIGNvZGUpLgorCitBZGRpdGlvbmFsbHkgdGhlIHJlcXVpcmVkIHN0YWNrIHNpemUgY2FuIGJlIHNwZWNpZmllZCBieSBkZWZpbmluZyBhCit2YXJpYWJsZSBAY29kZXtfX3N0YWNrfSAob2YgdHlwZSBAY29kZXtzaXplX3R9KSB3aXRoIGV4dGVybmFsIGxpbmthZ2UsIGFzCitpbiBvdGhlciB2YmNjIHRhcmdldHMuCisKK0BzdWJzZWN0aW9uIDE2LWJpdCBpbnRlZ2VyIG1vZGVsCisKK1RoZSBkZWZhdWx0IGxpYnJhcmllcyB1c2UgMzItYml0IEBjb2Rle2ludH0gdHlwZXMsIGJ1dCB5b3UgbWF5IHdhbnQgdG8KK3VzZSAxNi1iaXQgQGNvZGV7aW50fSB0eXBlcyBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLiBJbiB0aGlzIGNhc2UgeW91CitoYXZlIHRvIHNwZWNpZnkgdGhlIGNvbmZpZyBmaWxlIEBjb2Rle3RvczE2fSBhbmQgbGluayB3aXRoIHRoZSBhcHByb3ByaWF0ZQorMTYtYml0IGxpYnJhcmllcyAod2hpY2ggaGF2ZSBhICdAZmlsZXsxNn0nIGF0dGFjaGVkIHRvIHRoZWlyIG5hbWUpLgorCitUbyBjb21waWxlIGFuZCBsaW5rIGEgcHJvZ3JhbSB1c2luZyAxNi1iaXQgaW50ZWdlcnMgYSBjb21tYW5kIGxpa2UKKworQGV4YW1wbGUKK3ZjICt0b3MxNiB0ZXN0LmMgLW8gdGVzdCAtbG0xNiAtbHZjMTYKK0BlbmQgZXhhbXBsZQorIAorbWF5IGJlIHVzZWQuIFRoZXJlIGFyZSBubyAxNi1iaXQgdmVyc2lvbnMgZm9yIENvbGRGaXJlIHRhcmdldHMsCitiZWNhdXNlIHRoaXMgaXMgc3RyaWN0bHkgYSAzMi1iaXQgQ1BVLgorCitAc3Vic2VjdGlvbiBSZXN0cmljdGlvbnMKKyAKK1RoZSBmb2xsb3dpbmcgbGlzdCBjb250YWlucyBzb21lIHJlc3RyaWN0aW9ucyBvZiB0aGlzIHZlcnNpb24gb2YgdGhlCitsaWJyYXJ5OgorIAorQHRhYmxlIEBjb2RlCisgCitAaXRlbSB0bXBmaWxlKCkKK1RoZSBAY29kZXt0bXBmaWxlKCl9IGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIGFuIGVycm9yLgorIAorQGl0ZW0gY2xvY2soKQorVGhlIEBjb2Rle2Nsb2NrKCl9IGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIC0xLiBUaGlzIGlzIGNvcnJlY3QsCithY2NvcmRpbmcgdG8gdGhlIEMgc3RhbmRhcmQsIGJlY2F1c2UgbmVpdGhlciB1bmRlciBUT1Mgbm9yIHVuZGVyIE1pTlQgaXQKK2lzIHBvc3NpYmxlIHRvIG9idGFpbiB0aGUgdGltZSB1c2VkIGJ5IHRoZSBjYWxsaW5nIHByb2Nlc3MuCisKK0BlbmQgdGFibGUKKworQHNlY3Rpb24gVmlkZW9Db3JlL0xpbnV4CisKK1RoaXMgc2VjdGlvbiBkZXNjcmliZXMgc3BlY2lmaWNzIG9mIHRoZSBDIGxpYnJhcnkgZm9yIFZpZGVvQ29yZSB1bmRlciBMaW51eAorcHJvdmlkZWQgYnkgdGhlIHRhcmdldCBAZmlsZXt2aWRjb3JlLWxpbnV4fS4KKworVGhlIHJlbGV2YW50IGZpbGVzIGFyZSBAY29kZXt2Y2xvYWR9LCBAZmlsZXtzdGFydHVwLm99LAorQGZpbGV7bGlidmMuYX0sIEBmaWxle2xpYm0uYX0sIEBmaWxle2xpYm1zLmF9LgorCitUaGUgY29uZmlnIGZpbGUgQGNvZGV7dmM0LWxpbnV4fSBpcyBwYXJ0IG9mIHRoZSBsaWJyYXJ5LgorCitAc3Vic2VjdGlvbiBTdGFydHVwCisgCitUaGUgc3RhcnR1cCBjb2RlIEBmaWxle3N0YXJ0dXAub30gc2V0cyB1cCBzdGFjayBhbmQgaGVhcCBhbmQgcHJvdmlkZXMKK2EgZnVuY3Rpb24gQGNvZGV7X19hcm1jYWxsKCl9IHRvIHRyYW5zZmVyIGNvbnRyb2wgdG8gdGhlIGxvYWRlciBvbgordGhlIEFSTSBzaWRlLgorVGhlIHN0YXJ0dXAgcHJvY2VzcyBjYWxscyBjb25zdHJ1Y3RvcnMgdG8gc2V0IHVwIHNvbWUKK2dsb2JhbCB2YXJpYWJsZXMgYW5kIGluaXRpYWxpemUgc3RkaW4sIHN0ZG91dCBhbmQgc3RkZXJyIGlmIG5lZWRlZC4KKworQHN1YnNlY3Rpb24gRmxvYXRpbmcgcG9pbnQKKworTm90ZSB0aGF0IHlvdSBoYXZlIHRvIGxpbmsgd2l0aCBhIG1hdGggbGlicmFyeSBpZiB5b3Ugd2FudCB0byB1c2UKK2Zsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IG5hdGl2ZWx5IGltcGxlbWVudGVkLgorQWxsIG1hdGggZnVuY3Rpb25zLCBzcGVjaWFsIHN0YXJ0dXAgY29kZSBhbmQKK3ByaW50Zi9zY2FuZiBmdW5jdGlvbnMgd2hpY2ggc3VwcG9ydCBmbG9hdGluZyBwb2ludCBhcmUgY29udGFpbmVkIGluCit0aGUgbWF0aCBsaWJyYXJpZXMgb25seS4KKworQHN1YnNlY3Rpb24gU3RhY2sKKworVGhlIGxpYnJhcnkgY29udGFpbnMgYSBkZWZhdWx0IHN0YWNrIG9mIDMyS0IuIElmIGFub3RoZXIgc2l6ZSBpcyBuZWVkZWQsCit5b3UgY2FuIGFkZCB0aGUgZm9sbG93aW5nIHRvIHlvdXIgcHJvamVjdDoKKworQGV4YW1wbGUKKyAgICAgICAgLmFsaWduICA0CisgICAgICAgIC5zcGFjZSAgPGRlc2lyZWQtc2l6ZSwgc3VpdGFibHkgYWxpZ25lZD4KK19fX3N0YWNrZW5kOgorICAgICAgICAuZ2xvYmFsIF9fX3N0YWNrZW5kCitAZW5kIGV4YW1wbGUKKworQHN1YnNlY3Rpb24gSGVhcAorCitDdXJyZW50bHksIGEgZ2xvYmFsIHZhcmlhYmxlIG9mIDE2S0IgaXMgdXNlZCB0byBnZXQgbWVtb3J5IGZvcgorbWFsbG9jKCkgZXRjLiAgSWYgYW5vdGhlciBzaXplIGlzIG5lZWRlZCwKK3lvdSBjYW4gYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBwcm9qZWN0OgorCitAZXhhbXBsZQorI2RlZmluZSBIRUFQU0laRSA8ZGVzaXJlZCBzaXplPgorCitjaGFyIF9faGVhcFtIRUFQU0laRV0sKl9faGVhcHB0cj1fX2hlYXA7CitzaXplX3QgX19oZWFwc2l6ZT1IRUFQU0laRTsKK0BlbmQgZXhhbXBsZQorCitOb3RlIHRoYXQgdGhpcyBtZWNoYW5pc20gd2lsbCBsaWtlbHkgYmUgY2hhbmdlZCBpbiB0aGUgZnV0dXJlIQorCitAc3Vic2VjdGlvbiBTeXN0ZW0gQ2FsbHMKKworVG8gYWNjZXNzIHN5c3RlbSBmdW5jdGlvbnMgZnJvbSB0aGUgVmlkZW9Db3JlLXNpZGUsIHRoZSBmdW5jdGlvbgorQGNvZGV7X19hcm1jYWxsKCl9IGNhbiBiZSB1c2VkLiBJdCB3aWxsIHNhdmUgdGhlIGN1cnJlbnQgY29udGV4dCBhbmQgcmV0dXJuCit0byB0aGUgbG9hZGVyLiBSZWdpc3RlcnMgQGNvZGV7cjAtcjV9ICh0aGUgZnVuY3Rpb24gYXJndW1lbnRzKSB3aWxsIGJlIHNhdmVkCithbmQgYXJlIGF2YWlsYWJsZSB0byB0aGUgbG9hZGVyLiBUaGUgbG9hZGVyIGNhbiB0aGVuIGV4ZWN1dGUgdGhlIHN5c3RlbQorY2FsbCBhbmQgcmVzdW1lIGV4ZWN1dGlvbiwgcGFzc2luZyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBzeXN0ZW0KK2Z1bmN0aW9uLgorCitSZXN1bWluZyBpcyBkb25lIGJ5IGNhbGxpbmcgdGhlIGltYWdlIHdpdGggb2Zmc2V0IDIuCisKK1RoaXMgZnVuY3Rpb25hbGl0eSBjYW4gYWxzbyBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisKK0BzdWJzZWN0aW9uIExvYWRlcgorCitBIGxvYWRlciBpcyByZXF1aXJlZCB0byBleGVjdXRlIFZpZGVvQ29yZSBjb2RlIGZyb20gdGhlIEFSTSBzaWRlLiBGb3IKK3N0YW5kYWxvbmUgVmlkZW9Db3JlIGNvZGUsIHRoZSBwcm92aWRlZCBsb2FkZXIgY2FuIGJlIHVzZWQuIFVzdWFsbHksIGl0Cit3aWxsIGJlIG5lY2Vzc2FyeSB0byBhZGFwdCB0aGUgbG9hZGVyIHRvIGNvbW11bmljYXRlIGJldHdlZW4gQVJNIGFuZAorVmlkZW9Db3JlIHNpZGUgZHVyaW5nIHJ1bnRpbWUuCisKK0BzdWJzdWJzZWN0aW9uIE9iamVjdCBGb3JtYXQKKworQ3VycmVudGx5LCB0aGUgbG9hZGVyIGxvYWRzIGFuIHNpbXBsZSBiaW5hcnkgaW1hZ2UgdGhhdCBtdXN0IGJlIHBjLXJlbGF0aXZlCithbmQgbG9jYXRlZCB0byBhZGRyZXNzIDB4MDAwMDAwMDAuIEFkZGl0aW9uYWxseSwgaWYgcHJlc2VudCwgYSBmaWxlCit3aXRoIGV4dGVuc2lvbiBAZmlsZXsucmVsdGV4dH0gd2lsbCBiZSBsb2FkZWQgZm9yIHNvbWUgbGltaXRlZAorcmVsb2NhdGlvbi4gVGhpcyBmaWxlIGNvbnRhaW5zIGEgMzJiaXQgd29yZCBjb250YWluaW5nIHRoZSBudW1iZXIgb2YKK3JlbG9jYXRpb25zIGZvbGxvd2VkIGJ5IG4gMzJiaXQgd29yZHMgY29udGFpbmluZyBhbiBvZmZzZXQuIEZvciBlYWNoCitvZmZzZXQsIHRoZSBhZGRyZXNzIHdpbGwgYmUgcmVsb2NhdGVkIHRvIHRoZSBpbWFnZSBsb2FkIGFkZHJlc3MuCisKK0BzdWJzdWJzZWN0aW9uIENvbW1hbmQgbGluZSBhcmd1bWVudHMKKworQGNvZGV7dmNsb2FkIFstZGVidWddIFstY2FjaGVdIFstb2Zmc2V0XSA8aW1hZ2UtbmFtZT59CisKK1RoZSBsb2FkZXIgY3VycmVudGx5IGhhcyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKK0B0YWJsZSBAY29kZQorCitAaXRlbSAtZGVidWcKKworICAgIFRoZSBsb2FkZXIgd2lsbCBlbnRlciBkZWJ1ZyBtb2RlIChzZWUgYmVsb3cpLgorCitAaXRlbSAtY2FjaGUKKworICAgIFRoZSBsb2FkZXIgd2lsbCBzZXQgdGhlIExTQiBpbiB0aGUgc3RhcnQgYWRkcmVzcyB3aGVuIGV4ZWN1dGluZworICAgIGNvZGUuIFRoaXMgaXMgc3VwcG9zZWQgdG8gaW5oaWJpdCBhIGNhY2hlIGZsdXNoLgorCisgICAgSnVzdCBmb3IgdGVzdGluZyEKKworQGl0ZW0gLW9mZnNldAorCisgICAgVGhlIGxvYWRlciB3aWxsIGFsbG9jYXRlIDEgS0IgbW9yZSBtZW1vcnkgdGhhbiByZXF1aXJlZCBhbmQgbGVhdmVzCisgICAgdGhpcyBzcGFjZSB1bnVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeS4KKworICAgIEp1c3QgZm9yIHRlc3RpbmchCisKK0BlbmQgdGFibGUKKworQHN1YnN1YnNlY3Rpb24gRGVidWcgTW9kZQorCitJbiBkZWJ1ZyBtb2RlLCB0aGUgbG9hZGVyIHdpbGwgd2FpdCBmb3IgdXNlciBpbnB1dCBiZWZvcmUgc3RhcnRpbmcgdGhlCitWaWRlb0NvcmUgY29kZSBhcyB3ZWxsIGFzIGFmdGVyIGV2ZXJ5IEBjb2Rle19fYXJtY2FsbH0uCisKK1RoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGF2YWlsYWJsZToKKworQHRhYmxlIEBjb2RlCitAaXRlbSB3IDxhZGRyPiBbPG51bT5dCisgICAgICBEaXNwbGF5IDxudW0+IDMyYml0IHdvcmRzIHN0YXJ0aW5nIGF0IDxhZGRyPi4KKyAgICAgIDxhZGRyPiBtdXN0IGJlIHRoZSBvZmZzZXQgaW50byB0aGUgaW1hZ2UuIElmIDxudW0+IGlzIG9taXR0ZWQsCisgICAgICBvbmUgdW5pdCBpcyBkaXNwbGF5ZWQuCisKKyAgICAgIElmIG9uZSB3b3JkIGlzIGRpc3BsYXllZCwgaXQgaXMgYWRkaXRpb25hbGx5IGRpc3BsYXllZCB0cmFuc2xhdGVkCisgICAgICBhcyBhbiBvZmZzZXQgaW50byB0aGUgaW1hZ2UuCisKK0BpdGVtIGggPGFkZHI+IFs8bnVtPl0KKyAgICAgIERpc3BsYXkgPG51bT4gMTZiaXQgaGFsZndvcmRzIHN0YXJ0aW5nIGF0IDxhZGRyPi4KKyAgICAgIDxhZGRyPiBtdXN0IGJlIHRoZSBvZmZzZXQgaW50byB0aGUgaW1hZ2UuIElmIDxudW0+IGlzIG9taXR0ZWQsCisgICAgICBvbmUgdW5pdCBpcyBkaXNwbGF5ZWQuCisKK0BpdGVtIGIgPGFkZHI+IFs8bnVtPl0KKyAgICAgIERpc3BsYXkgPG51bT4gOGJpdCBieXRlcyBzdGFydGluZyBhdCA8YWRkcj4uCisgICAgICA8YWRkcj4gbXVzdCBiZSB0aGUgb2Zmc2V0IGludG8gdGhlIGltYWdlLiBJZiA8bnVtPiBpcyBvbWl0dGVkLAorICAgICAgb25lIHVuaXQgaXMgZGlzcGxheWVkLgorCitAaXRlbSBjCisgICAgICBTdGFydC9jb250aW51ZSBleGVjdXRpb24uCisKK0BpdGVtIHEKKyAgICAgIFF1aXQuCisKK0BpdGVtIGJwIDxhZGRyPgorICAgICAgU2V0IGEgYnJlYWtwb2ludCBhdCA8YWRkcj4uCisKKyAgICAgIFRoaXMgaXMgY3VycmVudGx5IGEgdmVyeSBjcnVkZSBpbXBsZW1lbnRhdGlvbi4gSXQgd2lsbCBqdXN0IHdyaXRlCisgICAgICBhIGJyYW5jaCB0byBAY29kZXtfX2FybWNhbGwoKX0gdG8gPGFkZHI+LiBJZiBldmVyeXRoaW5nIHdvcmtzIHdlbGwsCisgICAgICB5b3Ugd2lsbCBlbmQgaW4gdGhlIGRlYnVnZ2VyIGlmIDxhZGRyPiBpcyByZWFjaGVkLiBIb3dldmVyLCB0aGUKKyAgICAgIGFyZ3VtZW50cyBwYXNzZWQgYXJlIHJhbmRvbSAoYW5kIG1pZ2h0IGJlIGRhbmdlcm91cyBzeXNjYWxscyBieSAKKyAgICAgIGFjY2lkZW50KS4gQWxzbywgdGhlIG9sZCBjb2RlIGF0IHRoaXMgYWRkcmVzcyBpcyBjdXJyZW50bHkgbm90CisgICAgICByZXN0b3JlZC4KKworICAgICAgQXMgYSByZXN1bHQsIHlvdSBtdXN0IG5vdCBjb250aW51ZSBleGVjdXRpb24gYWZ0ZXIgaGl0dGluZyBhCisgICAgICBicmVha3BvaW50IQorQGVuZCB0YWJsZQorCisKK0BzdWJzZWN0aW9uIFJlc3RyaWN0aW9ucworIAorVGhlIGZvbGxvd2luZyBsaXN0IGNvbnRhaW5zIHNvbWUgcmVzdHJpY3Rpb25zIG9mIHRoaXMgdmVyc2lvbiBvZiB0aGUKK2xpYnJhcnk6CisgCitAaXRlbWl6ZSBAbWludXMKKyAKK0BpdGVtIG5vIHJlYWwgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCB5ZXQKKworQGl0ZW0gbG90cywgbG90cywgbG90cy4uLgorCisKK0BlbmQgaXRlbWl6ZQorCitAc2VjdGlvbiBBVEFSSSBKYWd1YXIvNjhrCisKK1RoaXMgc2VjdGlvbiBkZXNjcmliZXMgc3BlY2lmaWNzIG9mIHRoZSBDIGxpYnJhcnkgZm9yIEFUQVJJIEphZ3VhcgorcHJvdmlkZWQgYnkgdGhlIHRhcmdldCBAZmlsZXttNjhrLWphZ3Vhcn0uCisKK1RoZSByZWxldmFudCBmaWxlcyBhcmUgQGZpbGV7c3RhcnR1cC5vfSwKK0BmaWxle2xpYnZjLmF9LCBAZmlsZXtsaWJtLmF9LCBAZmlsZXtsaWJqYWcuYX0uCisKK1RoZSBjb25maWcgZmlsZXMgQGNvZGV7amFndWFyX3VuaXh9IGFuZCBAY29kZXtqYWd1YXJfd2luZG93c30gYXJlIHBhcnQgb2YgdGhlIGxpYnJhcnkuCisKK0BzdWJzZWN0aW9uIFN0YXJ0dXAKKyAKK1RoZSBzdGFydHVwIGNvZGUgQGZpbGV7c3RhcnR1cC5vfSBzZXRzIHVwIHN0YWNrIGFuZCBoZWFwLgorVGhlIHN0YXJ0dXAgcHJvY2VzcyBjYWxscyBjb25zdHJ1Y3RvcnMgdG8gc2V0IHVwIHNvbWUKK2dsb2JhbCB2YXJpYWJsZXMgYW5kIGluaXRpYWxpemUgc3RkaW4sIHN0ZG91dCBhbmQgc3RkZXJyLgorCitUaGUgQVRBUkkgSmFndWFyIGhhcyBubyBPUywgc28gaXQgaXMgaW1wb3NzaWJsZSB0byBkZWZpbmUgaG93IGlucHV0LCBvdXRwdXQgYW5kIGZpbGVzCitjYW4gYmUgaGFuZGxlZC4gVGhlcmUgYXJlIGEgZmV3IHNldCBvZiBmdW5jdGlvbiB5b3UgaGF2ZSB0byBkZWZpbmUgaWYgeW91IHdhbnQgdG8gdXNlIHN0ZGlvLgorCitBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gdXNlIHRoZSBAZmlsZXtsaWJqYWcuYX0uIFRoaXMgbGlicmFyeSBpbml0aWFsaXplcyBhIGNvbnNvbGUgd2luZG93IHdpdGggc3Rkb3V0CitzdXBwb3J0IGFuZCB1c2VzIG9wdGlvbmFsbHkgYSBTa3Vua0JvYXJkIHRvIHJlZGlyZWN0IHN0ZGVyciBhbmQgZmlsZSBJL08uCisKK0BzdWJzZWN0aW9uIEZsb2F0aW5nIHBvaW50CisKK05vdGUgdGhhdCB5b3UgaGF2ZSB0byBsaW5rIHdpdGggYSBtYXRoIGxpYnJhcnkgaWYgeW91IHdhbnQgdG8gdXNlCitmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zIHRoYXQgYXJlIG5vdCBuYXRpdmVseSBpbXBsZW1lbnRlZC4KK0FsbCBtYXRoIGZ1bmN0aW9ucywgc3BlY2lhbCBzdGFydHVwIGNvZGUgYW5kCitwcmludGYvc2NhbmYgZnVuY3Rpb25zIHdoaWNoIHN1cHBvcnQgZmxvYXRpbmcgcG9pbnQgYXJlIGNvbnRhaW5lZCBpbgordGhlIG1hdGggbGlicmFyeSBvbmx5LiBDb25zaWRlciB0aGUgQVRBUkkgSmFndWFyIGRvZXMgbm90IG93biBhIEZQVSBzbyB0aGlzIGxpYnJhcnkgaXMgcHJldHR5IHNsb3cuCisKK0BzdWJzZWN0aW9uIFN0YWNrCisKK1RoZSBsaWJyYXJ5IGNvbnRhaW5zIGEgZGVmYXVsdCBzdGFjayBvZiAzMktCLiBJZiBhbm90aGVyIHNpemUgaXMgbmVlZGVkLAoreW91IGNhbiBhZGQgYSBnbG9iYWwgdmFyaWFibGUgbmFtZWQgX19zdGFjayB0byB5b3VyIGNvZGU6CisKK0BleGFtcGxlCisKKy8qIFNldCA2NGtCIHN0YWNrICovCit1bnNpZ25lZCBsb25nIF9fc3RhY2sgPSA2NTUzNjsKKworQGVuZCBleGFtcGxlCisKK0BzdWJzZWN0aW9uIEhlYXAKKworQ3VycmVudGx5IHRoZSBmcmVlIFJBTSBpcyB1c2VkIGFzIGdsb2JhbCBoZWFwc2l6ZSBmb3IgbWFsbG9jKCkgZXRjLgorCitJdCBpcyBuZWNlc3NhcnkgdG8gcGxhY2UgYSBzeW1ib2wgbmFtZWQgX0JTU19FTkQgYXQgdGhlIGVuZCBvZiB0aGUgQlNTIHNlZ21lbnQuCitUaGUgaGVhcCBhbGxvY2F0ZXMgdGhlIGZyZWUgUkFNIGJldHdlZW4gX0JTU19FTkQgYW5kIHRoZSBib3R0b20gb2YgdGhlIHN0YWNrLgorCitJZiBsZXNzIHNpemUgaXMgbmVlZGVkIGZlZWwgZnJlZSB0byBtYW5pcHVsYXRlIHRoZSB2YWx1ZSBvZiBfQlNTX0VORC4KKworQWxsIGFsbG9jYXRlZCBoZWFwIG9iamVjdHMgY2FuIGJlIHVzZWQgYXMgaW50ZXJuYWwgSkFHVUFSIG9iamVjdHMsIGJlY2F1c2UgdGhleSBhcmUgcWhyYXNlIGFsaWduZWQuCisKK0BzdWJzZWN0aW9uIHN0ZGlvIHN1cHBvcnQKKworVGhlIEFUQVJJIEphZ3VhciBsYWNrcyBzdGRpbyBzdXBwb3J0LiBTbyB0aGUgQGZpbGV7bGlidmMuYX0gaGFzIGp1c3QgZW1wdHkgc3R1YiBmdW5jdGlvbnMgZm9yCitvcGVuLCBjbG9zZSwgcmVhZCBhbmQgd3JpdGUsIHdoaWNoIHlvdSBtYXkgb3ZlcndyaXRlIGlmIHlvdSBuZWVkIHN0ZGlvLgorQWx0ZXJuYXRpdmVseSB5b3UgY2FuIHVzZSBAZmlsZXtsaWJqYWcuYX0gd2hpY2ggaGFzIHNpbXBsZSBzdGRpbworYW5kIGZpbGUgSS9PIGZ1bmN0aW9uYWxpdHkuCisKK0BleGFtcGxlCisvKioKKyAqIHBhcmFtIG5hbWU6IG5hbWUgbWVudGlvbmVkIGluIGZvcGVuCisgKiBwYXJhbSBtb2RlOiBtb2RlIG1lbnRpb25lZCBpbiBmb3BlbgorICogcmV0dXJuczogPiAwIGEgdmFsaWQgZmlsZSBoYW5kbGUKKyAqICAgICAgICAgIDwgMCB0byBpbmRpY2F0ZSBhbiBlcnJvcgorICogICAgICAgICAgdGhlIHZhbHVlcyAwLDEsMiBhcmUgdXNlZCBieSBzdGRpbiwgc3Rkb3V0IGFuZCBzdGRlcnIKKyAqCisgKiBObyBuZWVkIHRvIGhhbmRsZSBzdGRpbiwgc3Rkb3V0IGFuZCBzdGRlcnIgaGVyZQorICovCitpbnQgamFnb3Blbihjb25zdCBjaGFyICpuYW1lLGNvbnN0IGNoYXIgKm1vZGUpCisKKy8qKgorICogcGFyYW0gaGFuZGxlOiBoYW5kbGUgZnJvbSBqYWdvcGVuCisgKgorICogTm8gbmVlZCB0byBoYW5kbGUgc3RkaW4sIHN0ZG91dCBhbmQgc3RkZXJyIGhlcmUKKyAqLwordm9pZCBqYWdjbG9zZShpbnQgaGFuZGxlKQorCisvKioKKyAqIHBhcmFtIGhhbmRsZTogaGFuZGxlIGZyb20gamFnb3BlbgorICogcGFyYW0gcDogcG9pbnRzIHRvIHRoZSBjaGFyIGJ1ZmZlciB0byBmaWxsLgorICogcGFyYW0gbDogYnVmZmVyIHNpemUgb2YgcAorICogcmV0dXJuczogPj0wIG51bWJlciBvZiByZWFkIGJ5dGVzCisgICAgICAgICAgICA8MCBpbmRpY2F0ZSBhbiBlcnJvcgorICoKKyAqIEhhbmRsZSBzdGRpbiwgc3Rkb3V0IGFuZCBzdGRlcnIgaGVyZQorICovCitzaXplX3QgamFncmVhZChpbnQgaGFuZGxlLGNoYXIgKnAsc2l6ZV90IGwpCisKKy8qKgorICogcGFyYW0gaGFuZGxlOiBoYW5kbGUgZnJvbSBqYWdvcGVuCisgKiBwYXJhbSBwOiBwb2ludHMgdG8gdGhlIGNoYXIgYnVmZmVyIHRvIHdyaXRlLgorICogcGFyYW0gbDogbnVtYmVyIG9mIGJ5dGVzIG9mIHAKKyAqIHJldHVybnM6ID49MCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbgorICAgICAgICAgICAgPDAgaW5kaWNhdGUgYW4gZXJyb3IKKyAqCisgKiBIYW5kbGUgc3RkaW4sIHN0ZG91dCBhbmQgc3RkZXJyIGhlcmUKKyAqLworc2l6ZV90IGphZ3dyaXRlKGludCBoYW5kbGUsY29uc3QgY2hhciAqcCwgc2l6ZV90IGwpCisKKy8qKgorICogcGFyYW0gaGFuZGxlOiBoYW5kbGUgZnJvbSBqYWdvcGVuCisgKiBwYXJhbSBvZmZzZXQ6IG51bWJlciBvZiBieXRlcyB0byBzZWVrLgorICogcGFyYW0gZGlyZWN0aW9uOiBzZWUgZnNlZWsgZGlyZWN0aW9uCisgKiByZXR1cm5zOiA9MCBzdWNjZXNzZnVsIHNlZWsKKyAgICAgICAgICAgIDw+MCBpbmRpY2F0ZSBhbiBlcnJvcgorICAgICAgICAgICAgLTE6IHNlZWsgbm90IHN1cHBvcnRlZAorICoKKyAqIEhhbmRsZSBzdGRpbiwgc3Rkb3V0IGFuZCBzdGRlcnIgaGVyZQorICovCitsb25nIGphZ3NlZWsoaW50IGhhbmRsZSxsb25nIG9mZnNldCxpbnQgZGlyZWN0aW9uKQorQGVuZCBleGFtcGxlCisKK0BzdWJzZWN0aW9uIFRoZSBqYWdsaWIKKworVGhlIGphZ2xpYiBAZmlsZXtsaWJqYWcuYX0gcHJvdmlkZXMgc2ltcGxlIGZ1bmN0aW9ucyB0byBzdXBwb3J0IHlvdXIgZmlyc3QKK3N0ZXBzIGluIEFUQVJJIEphZ3VhciBwcm9ncmFtbWluZy4gSXQgaW5pdGlhbGl6ZXMgYSBzaW1wbGUgY29uc29sZSBvdXRwdXQgd2luZG93IGFuZCBjb21lcyB3aXRoIAorYW4gb2xkIEFUQVJJIGNoYXJhY3RlciBzZXQuCitJZiBhIFNrdW5rQm9hcmQgaXMgYXZhaWxhYmxlIEkvTyBmdW5jdGlvbmFsaXR5IGNhbiBiZSByZWRpcmVjdGVkLgorCitZb3VyIGZpcnN0IEphZ3VhciBwcm9ncmFtIGNhbiBsb29rIGxpa2UgdGhpczoKKworQGV4YW1wbGUKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBtYWluKCkKK0B7CisgICAgcHJpbnRmKCJIZWxsbywgd29ybGRcbiIpOworQH0KKworQGVuZCBleGFtcGxlCisKK0tlZXAgaW4gbWluZDogWW91ciBKQUdVQVIgd2lsbCBnZXQgYSByZWQgYmFja2dyb3VuZCBjb2xvciB0byBpbmRpY2F0ZSBAY29kZXttYWluKCl9IGhhcyBleGl0ZWQuCisKK1RoZSBqYWdsaWIgQVBJIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGluIGEgc2VwYXJhdGUgZG9jdW1lbnQuIFRoZXJlIGlzIG1vcmUgZGVtbyBjb2RlCithdmFpbGFibGUgaW4gdGhlIEB1cmVme2h0dHBzOi8vZ2l0aHViLmNvbS90b2Fybm9sZC9qYWdsaWItZGVtbywgamFnbGliLWRlbW99IGdpYmh1YiByZXBvc2l0b3J5LgorCitAc2VjdGlvbiA2NTAyL0M2NAorCitUaGlzIGlzIGEgcG9ydCBvZiB2Y2xpYiB0byB0aGUgQzY0LgorCitAc3Vic2VjdGlvbiBTdGFydHVwIGFuZCBNZW1vcnkKKworU3RhcnR1cCBhbmQgbWVtb3J5IGxheW91dCBpcyBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyBwYXJhZ3JhcGhzLgorCitAc3Vic3Vic2VjdGlvbiBTdGFydHVwCisKK1RoZSBkZWZhdWx0IGxpbmtlciBmaWxlIGNyZWF0ZXMgcHJvZ3JhbSBmaWxlcyB0aGF0IGFyZSBsb2FkZWQgdG8gYWRkcmVzcworMHg4MDEuIEEgQkFTSUMgbGluZSBpcyBpbmNsdWRlZCBzbyB0aGF0IHRoZSBwcm9ncmFtIGNhbiBiZSBzdGFydGVkIHVzaW5nIEBjb2Rle1JVTn0KK2Zyb20gQkFTSUMuIFRoZSBzdGFydHVwIGNvZGUKK3dpbGwgdHVybiBvZmYgdGhlIEJBU0lDIFJPTSB0byBhbGxvdyB1c2FnZSBvZiBSQU0gdW50aWwgMHhEMDAwIGFuZCBtb3N0IG9mIHRoZQoremVybyBwYWdlIHdpdGhvdXQgbmVlZCBmb3IgYW55IHNwZWNpYWwgaGFuZGxpbmcuIFRoZSBCU1Mgc2VnbWVudCB3aWxsIGJlIGNsZWFyZWQKK2R1cmluZyBzdGFydHVwLgorCitXaXRoIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIGFmdGVyIGV4aXRpbmcgdGhlIEMgcHJvZ3JhbSwgYW4gaW5maW5pdGUgbG9vcCB3aWxsCitiZSBlbnRlcmVkLiBXaGVuIHVzaW5nIHRoZSBAY29kZXsrYzY0cn0gY29uZmlnLCB0aGUgcHJvZ3JhbSB3aWxsIHJldHVybiB0byBCQVNJQworYW4gY2FuIGJlIHN0YXJ0ZWQgYWdhaW4uCitIb3dldmVyLCB0aGlzIG5lZWRzIGFkZGl0aW9uYWwgbWVtb3J5IGFzIHRoZSBpbml0IHZhbHVlcyBmb3IgdGhlIGRhdGEgc2VjdGlvbiBoYXZlCit0byBiZSBzdG9yZWQgaW4gUkFNLiBBbHNvLCBzb21lIHJlZ2lzdGVyIHZhbHVlcyBhbmQgemVybyBwYWdlIGNvbnRlbnRzIGhhdmUgdG8gYmUKK3NhdmVkLiBUaGUgb3ZlcmhlYWQgZGVwZW5kcyBvbiB0aGUgYW1vdW50IG9mIGluaXRpYWxpemVkIHZhcmlhYmxlcy4KKworQHN1YnN1YnNlY3Rpb24gQ29tbWFuZCBsaW5lCisKK0NvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFyZSBzdXBwb3J0ZWQgYnkgdXNpbmcgdGhlIGNvbnZlbnRpb24vY29kZSBzdWJtaXR0ZWQgYnkKK1N0ZWZhbiBIYXViZW50aGFsLiAKKworQ29tbWFuZC1saW5lcyBsb29rIGxpa2UgdGhlc2UgbGluZXM6CisKK0BleGFtcGxlCisgICBydW4KKyAgIHJ1biA6IHJlbQorICAgcnVuOnJlbSBhcmcxICIgYXJnIDIgaXMgcXVvdGVkICIgIGFyZzMgIiIgYXJnNQorQGVuZCBleGFtcGxlCisKKworCitAc3Vic3Vic2VjdGlvbiBaZXJvIFBhZ2UKKworQGNvZGV7dmJjY30gdXNlcyBhIG51bWJlciBvZiB6ZXJvIHBhZ2UgbG9jYXRpb25zIGZvciByZWdpc3RlciB2YXJpYWJsZXMsIHN0YWNrCitwb2ludGVyIGV0Yy4gaW4gc2VjdGlvbiBAY29kZXt6cGFnZX0uIEFsc28sIHZhcmlhYmxlcyBjYW4gYmUgbWFwcGVkIHRvIHplcm8gcGFnZSB1c2luZwordGhlIEBjb2Rle19fenBhZ2V9IGF0dHJpYnV0ZS4gQnkgZGVmYXVsdCB0aGUgYXJlYSBAY29kZXsweDAyLi4weDhkfQoraXMgdXNlZCwgYnV0IHRoaXMgY2FuIGJlIGNoYW5nZWQgaW4gdGhlIGxpbmtlciBmaWxlLgorCitAc3Vic3Vic2VjdGlvbiBTdGFjaworCitCeSBkZWZhdWx0LCB0aGUgdXNlciBzdGFjayBpcyBtYXBwZWQgZnJvbSBAY29kZXsweEM4MDAuLjB4RDAwMH0uIFRoZSBzaXplIGNhbiBiZQorY2hhbmdlZCBhdCB0aGUgdG9wIG9mIEBjb2Rle3ZsaW5rLmNtZH0uCisKK0BzdWJzdWJzZWN0aW9uIEhlYXAKKworQ29kZSBhbmQgZGF0YS9CU1MgYXJlIG1hcHBlZCBzdGFydGluZyBhZnRlciB0aGUgQkFTSUMgaW5pdCBsaW5lLgorVGhlIGhlYXAgaXMgcGxhY2VkIGluIHRoZSByZW1haW5pbmcgc3BhY2UgdG8gc3RhY2sgc3RhcnQuCisKK0BzdWJzdWJzZWN0aW9uIEJhbmtpbmcKKworVGhlIGZvbGxvd2luZyBiYW5raW5nIG1vZGVscyBhcmUgc3VwcG9ydGVkOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIC1yZXVmbGF0CisgICAgICBUaGlzIGxpYnJhcnkgc3VwcG9ydHMgYSBSRVUgdXNpbmcgYSBmbGF0IDE2TUIgYWRkcmVzcyBzcGFjZS4gVGhlIG1lbW9yeSBoYXMgdG8KKyAgICAgIGJlIGFkZHJlc3NlZCB0aHJvdWdoIGZhci1wb2ludGVycy4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGRlY2xhcmUgdmFyaWFibGVzIGluCisgICAgICB0aGUgUkVVIG5vciB0byBwbGFjZSBjb2RlIGluIHRoZSBSRVUuIFRoZSBtZW1vcnkgaXMgYWRkcmVzc2VkIGFzIDB4MDAwMDAwIHRvCisgICAgICAweEZGRkZGRi4gQWxsIGFjY2Vzc2VzIHRocm91Z2ggZmFyLXBvaW50ZXJzIGFyZSBhZGRyZXNzaW5nIHRoZSBSRVUuIEl0IGlzIG5vdAorICAgICAgcG9zc2libGUgdG8gYWRkcmVzcyB0aGUgQzY0IG1lbW9yeSB0aHJvdWdoIGEgZmFyLXBvaW50ZXIuCisKKyAgICAgIEZhci1wb2ludGVyIGFyaXRobWV0aWMgb25seSB3b3JrcyBvbiB0aGUgbG93ZXIgMTZiaXRzLiBJdCBpcyBub3QgcG9zc2libGUgdG8KKyAgICAgIGNyb3NzIGEgYmFuayBib3VuZGFyeSB1c2luZyBmYXItcG9pbnRlcnMuIEh1Z2UtcG9pbnRlcnMgd2lsbCBzdXBwb3J0IHRoaXMsIGJ1dAorICAgICAgYXJlIG5vdCB5ZXQgZnVsbHkgaW1wbGVtZW50ZWQuIEluIHRoZSBtZWFudGltZSBpdCBpcyBwb3NzaWJsZSB0byB1c2UgbG9uZyBpbnRlZ2VycworICAgICAgYW5kIGNhc3QgdGhlbSB0byBmYXItcG9pbnRlcnMuCisKKyAgICAgIFVzZSBAY29kZXstbHJldWZsYXR9IHRvIGxpbmsgd2l0aCB0aGlzIGxpYnJhcnkuIE5vdGUgdGhhdCB0aGUgbGlicmFyeSBkb2VzCisgICAgICBub3QgY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIFJFVS4KKworQGl0ZW0gLXJldWJhbmsKKyAgICAgIFRoaXMgY29uZmlndXJhdGlvbiByZXNlcnZlcyBhIDE2S0IgbWVtb3J5IHNwYWNlIHdpdGhpbiB0aGUgQzY0IG1lbW9yeSBhcyB3aW5kb3cKKyAgICAgIGZvciBiYW5raW5nLiBBcyB0aGUgYmFuayBudW1iZXIgaXMgc3RvcmVkIGFzIGEgc2luZ2xlIGJ5dGUgKHdpdGggYmFuaworICAgICAgMjU1IGRlbm90aW5nIHRoZSB1bmJhbmtlZCBtZW1vcnkpLCBpdCBpcyBvbmx5IHBvc3NpYmxlIHRvIGFkZHJlc3MgdXAgdG8KKyAgICAgIGFib3V0IDRNQiBvZiBtZW1vcnkgaW4gdGhlIFJFVS4KKworICAgICAgVmFyaWFibGVzIGFuZCBjb2RlIGNhbiBiZSBtYXBwZWQgaW50byB0aGUgUkVVIHVzaW5nIHRoZSBAY29kZXtfX2JhbmsoKX0gYXR0cmlidXRlCisgICAgICBvciBAY29kZXsjcHJhZ21hIGJhbmt9LiBXaGVuIGNhbGxpbmcgYSBiYW5rZWQgZnVuY3Rpb24sIHRoZSBjb3JyZXNwb25kaW5nIGJhbmsKKyAgICAgIHdpbGwgYmUgY29waWVkIGZyb20gdGhlIFJFVSBpbnRvIHRoZSBDNjQgbWVtb3J5IHdpbmRvdy4KKworICAgICAgVXNlIHRoZSBAY29kZXsrYzY0cmV1fSBjb25maWd1cmF0aW9uIHRvIHVzZSB0aGlzIG1lY2hhbmlzbS4gQ3VycmVudGx5IHRoZQorICAgICAgbGlua2VyIGZpbGUgcHJvdmlkZXMgOCBiYW5rcyByZXN1bHRpbmcgaW4gYSAxMjhLIFJFVSBpbWFnZS4gTW9yZSBiYW5rcyBjYW4KKyAgICAgIGJlIGFkZGVkIGZvciBsYXJnZXIgZXhwYW5zaW9ucy4KKworICAgICAgVGhlIGNvbmZpZ3VyYXRpb24gd2lsbCBjcmVhdGUgYSB1c3VhbGx5IEM2NCBwcmcgZmlsZSBjb250YWluaW5nIHRoZSB1bmJhbmtlZAorICAgICAgY29kZSBhbmQgZGF0YSBhcyB3ZWxsIGFzIGEgUkVVIGltYWdlIHdpdGggZXh0ZW5zaW9uIEBjb2Rley5iMH0uIEl0IG11c3QKKyAgICAgIGJlIGxvYWRlZCAoZS5nLiB3aXRoIGFuIGVtdWxhdG9yIG9yIHRoZSBUdXJib0NoYW1lbGVvbikgYmVmb3JlIHRoZSBwcmcgZmlsZQorICAgICAgY2FuIGlzIGV4ZWN1dGVkLgorQGVuZCB0YWJsZQorCisKK0BzdWJzZWN0aW9uIFJ1bnRpbWUKKworQXBhcnQgZnJvbSBzdGFuZGFyZCBDIGxpYnJhcnkgZnVuY3Rpb25zLCBAY29kZXtsaWJ2Yy5hfSBhbHNvIHByb3ZpZGVzIGEgZmV3CitydW50aW1lIHN1cHBvcnQgZnVuY3Rpb25zIG5lZWRlZCBieSB0aGUgY29tcGlsZXIuIEFwYXJ0IGZyb20gdGhlIG1hdGggYW5kCitmbG9hdGluZyBwb2ludCBmdW5jdGlvbnMgbWVudGlvbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSA2NTAyIGJhY2tlbmQsCitpdCBpbmNsdWRlcyBmdW5jdGlvbnMgZm9yIHNhdmluZy9yZXN0b3JpbmcgcmVnaXN0ZXJzLgorCitAc3Vic2VjdGlvbiBAY29kZXtzdGRpb30KKworc3RkaW8gc3VwcG9ydHMgQGNvZGV7c3Rkb3V0fSwgQGNvZGV7c3RkZXJyfSAoYm90aCB1c2luZyB0aGUKK3NjcmVlbikgYW5kIEBjb2Rle3N0ZGlufSAoa2V5Ym9hcmQpLiBCb3RoIGFyZSB1bmJ1ZmZlcmVkIGJ5IGRlZmF1bHQuCisKK0Z1cnRoZXJtb3JlLCBmaWxlIElPIHdpdGggc3RhbmRhcmQgQyBmdW5jdGlvbnMgaXMgc3VwcG9ydGVkIAorZm9yIDE1NDEgYW5kIGNvbXBhdGlibGUgZGlzayBkcml2ZXMuIE90aGVyIGRldmljZXMgaGF2ZSBub3QgYmVlbiB0ZXN0ZWQuCitPbmx5IHNlcXVlbnRpYWwgcmVhZGluZyBhbmQgd3JpdGluZyBvZiBmaWxlcyBpcyBzdXBwb3J0ZWQuIE5vIHNlZWtpbmcgZXRjLgorVGhlcmUgYXJlIGhhcmRjb2RlZCBsaW1pdHMgZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBvcGVuIGZpbGVzIGFuZCB0aGUKK21heGltdW0gbGVuZ3RoIG9mIGZpbGVuYW1lcy4KKworVGhlIEBjb2Rle3JlbW92ZSgpfSBhbmQgQGNvZGV7cmVuYW1lKCl9IGZ1bmN0aW9ucyBhcmUgc3VwcG9ydGVkIHVzaW5nIDE1NDEKKworQnkgZGVmYXVsdCwgZGV2aWNlIElEIDggaXMgdXNlZC4gQW5vdGhlciBkZXZpY2UgSUQgY2FuIGJlIHNwZWNpZmllZCBhcyBwcmVmaXgKK3RvIHRoZSBmaWxlbmFtZToKKworQGV4YW1wbGUKKyAgLyogdHJ5IHRvIG9wZW4gZmlsZSAidGVzdCIgb24gdGhlIHNlY29uZCBkcml2ZSAqLworICBGSUxFICpmOworICBmPWZvcGVuKCI5OnRlc3QiLCJyIik7IAorICAuLi4KK0BlbmQgZXhhbXBsZQorCitAY29kZXtwcmludGYvc2NhbmZ9IGZ1bmN0aW9ucyB3aGljaCBzdXBwb3J0IGZsb2F0aW5nIHBvaW50IGFyZSBjb250YWluZWQgaW4KK3RoZSBtYXRoIGxpYnJhcnkgb25seS4KKworCitAc3Vic2VjdGlvbiBGbG9hdGluZyBQb2ludCAvIHdvemZwCisKK1doZW4gdXNpbmcgZmxvYXRpbmcgcG9pbnQsIHRoZSBtYXRoIGxpYnJhcnkgQGNvZGV7bGlibS5hfSBtdXN0IGJlIGxpbmtlZCB1c2luZwordGhlIEBjb2Rley1sbX0gb3B0aW9uLiBJdCBjb250YWlucyB0aGUgZmxvYXRpbmcgcm91dGluZXMgYXMgd2VsbCBhcyB2ZXJzaW9ucyBvZgordGhlIEBjb2Rle3ByaW50Zi9zY2FuZn0gZmFtaWx5IHRoYXQgc3VwcG9ydCBmbG9hdGluZyBwb2ludC4KKworVGhlIGZsb2F0aW5nIHBvaW50IHJvdXRpbmVzIGFyZSBiYXNlZCBvbiBTdGV2ZSBXb3puaWFrcyByb3V0aW5lcyBmcm9tIHRoZSA3MHMsCitzb21ld2hhdCBhZGFwdGVkIHRvIHRoZSBBQkkgb2YgQGNvZGV7dmJjY30uIFRoZXNlIGZ1bmN0aW9ucyBhcmUgc21hbGwgYW5kCityZWFzb25hYmx5IHVzYWJsZSwgYnV0IHRoZXkgZG8gbm90IGZ1bGx5IHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBvZiBDOTkuCisKK09ubHkgYSBwYXJ0IG9mIHRoZSBDIGxpYnJhcnkgZnVuY3Rpb25zIGZvciBmbG9hdGluZyBwb2ludCBpcyBpbXBsZW1lbnRlZC4gVGhlCitsaXN0IGN1cnJlbnRseSBpbmNsdWRlczoKKworQGl0ZW1pemUKK0BpdGVtIEBjb2Rle2V4cCgpfQorQGl0ZW0gQGNvZGV7cG93KCl9CitAaXRlbSBAY29kZXtsb2coKX0KK0BpdGVtIEBjb2Rle2xvZzEwKCl9CitAZW5kIGl0ZW1pemUKKworQHN1YnNlY3Rpb24gRmxvYXRpbmcgUG9pbnQgLyBJRUVFCisKK1doZW4gdXNpbmcgSUVFRSBmbG9hdGluZyBwb2ludCwgQGNvZGV7LWllZWV9IG11c3QgYmUgc3BlY2lmaWVkIGFuZCB0aGUgbWF0aCBsaWJyYXJ5CitAY29kZXtsaWJtaWVlZS5hfSBtdXN0IGJlIGxpbmtlZCB1c2luZwordGhlIEBjb2Rley1sbWllZWV9IG9wdGlvbi4gSXQgY29udGFpbnMgdGhlIGZsb2F0aW5nIHJvdXRpbmVzIGFzIHdlbGwgYXMgdmVyc2lvbnMgb2YKK3RoZSBAY29kZXtwcmludGYvc2NhbmZ9IGZhbWlseSB0aGF0IHN1cHBvcnQgZmxvYXRpbmcgcG9pbnQuCisKK1RoZSBmbG9hdGluZyBwb2ludCByb3V0aW5lcyBhcmUgYmFzZWQgb24gU0FORSwKK3NvbWV3aGF0IGFkYXB0ZWQgdG8gdGhlIEFCSSBvZiBAY29kZXt2YmNjfSB1c2luZyB3cmFwcGVyIGZ1bmN0aW9ucy4KK1RoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgZnVsbHkgQyBhbmQgSUVFRSBjb21wbGlhbnQgYW5kIHByb3ZpZGUgcHJlY2lzZSByZXN1bHRzIGZvcgorMzIgYW5kIDY0Yml0IGZsb2F0aW5nIHBvaW50IG51bWJlcnMgKHRoZSBsaWJyYXJ5IGFjdHVhbGx5IGludGVybmFsbHkgY2FsY3VsYXRlcworYWxsIG9wZXJhdGlvbiB1c2luZyA4MGJpdHMsIGJ1dCB2YmNjIGN1cnJlbnRseSBvbmx5IHVzZXMgdXAgdG8gNjQgYml0cykuCisKK0N1cnJlbnRseSwgdGhpcyBsaWJyYXJ5IHByb2JhYmx5IG11c3QgYmUgcnVuIGZyb20gUkFNLgorCitNb3N0IHBhcnRzIG9mIHRoZSBDIGxpYnJhcnkgZnVuY3Rpb25zIGZvciBmbG9hdGluZyBwb2ludCBhcmUgaW1wbGVtZW50ZWQuIFRoZQorbGlzdCBjdXJyZW50bHkgaW5jbHVkZXM6CisKK0BpdGVtaXplCitAaXRlbSBAY29kZXtleHAoKSwgZXhwZigpLCBleHBsKCl9CitAaXRlbSBAY29kZXtleHAyKCksIGV4cDJmKCksIGV4cDJsKCl9CitAaXRlbSBAY29kZXtleHAxbSgpLCBleHAxbWYoKSwgZXhwMW1sKCl9CitAaXRlbSBAY29kZXtwb3coKSwgcG93ZigpLCBwb3dsKCl9CitAaXRlbSBAY29kZXtsb2coKSwgbG9nZigpLCBsb2dsKCl9CitAaXRlbSBAY29kZXtsb2cxcCgpLCBsb2cxcGYoKSwgbG9nMXBsKCl9CitAaXRlbSBAY29kZXtsb2cyKCksIGxvZzJmKCksIGxvZzJsKCl9CitAaXRlbSBAY29kZXtsb2cxMCgpLCBsb2cxMGYoKSwgbG9nMTBsKCl9CitAaXRlbSBAY29kZXtzcXJ0KCksIHNxcnRmKCksIHNxcnRsKCl9CitAaXRlbSBAY29kZXtzaW4oKSwgc2luZigpLCBzaW5sKCl9CitAaXRlbSBAY29kZXtjb3MoKSwgY29zZigpLCBjb3NsKCl9CitAaXRlbSBAY29kZXt0YW4oKSwgdGFuZigpLCB0YW5sKCl9CitAaXRlbSBAY29kZXthdGFuKCksIGF0YW5mKCksIGF0YW5sKCl9CisKKworQGVuZCBpdGVtaXplCisKK0BzZWN0aW9uIDY1MDIvTkVTCisKK1RoaXMgaXMgYSBwb3J0IG9mIHZjbGliIHRvIHRoZSBORVMgY29uc29sZS4KKworCitAc3Vic2VjdGlvbiBTdGFydHVwIGFuZCBNZW1vcnkKKworU3RhcnR1cCBhbmQgbWVtb3J5IGxheW91dCBpcyBkZXBlbmRlbnQgb24gdGhlIFJPTSB1c2VkLiBDdXJyZW50bHkgdHdvIGV4YW1wbGUgY29uZmlndXJhdGlvbnMKK2FyZSBwcm92aWRlZC4gVGhleSBjYW4gYmUgc2VsZWN0ZWQgd2l0aCBAY29kZXsrbnJvbTI1NnZ9IGFuZCBAY29kZXsrdW5yb201MTJ2fS4gSGF2ZSBhCitsb29rIGF0IHRoZSBjb3JyZXNwb25kaW5nIGxpbmtlciBzY3JpcHRzIGluIEBjb2Rle3ZiY2MvdGFyZ2V0cy82NTAyLW5lc30gZm9yIGZ1cnRoZXIKK2RldGFpbHMuCisKK1RoZSBuZWNlc3NhcnkgbGlicmFyeSByb3V0aW5lcyB0byBzdXBwb3J0IGNvbmZpZ3VyYXRpb25zIHdpdGggc2V2ZXJhbCBST00gYmFua3MgYXJlCitpbmNsdWRlZC4KKworQHN1YnN1YnNlY3Rpb24gWmVybyBQYWdlCisKK0Bjb2Rle3ZiY2N9IHVzZXMgYSBudW1iZXIgb2YgemVybyBwYWdlIGxvY2F0aW9ucyBmb3IgcmVnaXN0ZXIgdmFyaWFibGVzLCBzdGFjaworcG9pbnRlciBldGMuIGluIHNlY3Rpb24gQGNvZGV7enBhZ2V9LiBBbHNvLCB2YXJpYWJsZXMgY2FuIGJlIG1hcHBlZCB0byB6ZXJvIHBhZ2UgdXNpbmcKK3RoZSBAY29kZXtfX3pwYWdlfSBhdHRyaWJ1dGUuIFRoZSBlbnRpcmUgemVybyBwYWdlIGNhbiBiZSB1c2VkLCBidXQgdGhpcyBjYW4gYmUgY2hhbmdlZAoraW4gdGhlIGxpbmtlciBmaWxlLgorCitAc3Vic3Vic2VjdGlvbiBTdGFjaworCitCeSBkZWZhdWx0LCB0aGUgdXNlciBzdGFjayBzdGFydHMgZnJvbSBAY29kZXsweDA4MDB9IGdyb3dpbmcgZG93bndhcmRzLgorCitAc3Vic3Vic2VjdGlvbiBIZWFwCisKK0J5IGRlZmF1bHQsIGNvZGUgYW5kIGRhdGEvQlNTIGFyZSBtYXBwZWQgc3RhcnRpbmcgYWZ0ZXIgdGhlIHN5c3RlbSBzdGFjayBhdCBAY29kZXsweDAyMDB9LgorVGhlIGhlYXAgaXMgcGxhY2VkIGluIHRoZSByZW1haW5pbmcgc3BhY2UgdG8gc3RhY2sgc3RhcnQuCisKK0BzdWJzZWN0aW9uIFJ1bnRpbWUKKworQXBhcnQgZnJvbSBzdGFuZGFyZCBDIGxpYnJhcnkgZnVuY3Rpb25zLCBAY29kZXtsaWJ2Yy5hfSBhbHNvIHByb3ZpZGVzIGEgZmV3CitydW50aW1lIHN1cHBvcnQgZnVuY3Rpb25zIG5lZWRlZCBieSB0aGUgY29tcGlsZXIuIEFwYXJ0IGZyb20gdGhlIG1hdGggYW5kCitmbG9hdGluZyBwb2ludCBmdW5jdGlvbnMgbWVudGlvbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSA2NTAyIGJhY2tlbmQsCitpdCBpbmNsdWRlcyBmdW5jdGlvbnMgZm9yIHNhdmluZy9yZXN0b3JpbmcgcmVnaXN0ZXJzLgorCitAc3Vic2VjdGlvbiBAY29kZXtzdGRpb30KKworQXQgdGhlIG1vbWVudCwgc3RkaW8gb25seSBzdXBwb3J0cyBAY29kZXtzdGRvdXR9LCBAY29kZXtzdGRlcnJ9IChib3RoIHVzaW5nIHRoZQorc2NyZWVuKSBhbmQgQGNvZGV7c3RkaW59IChzaW1wbGUgaW5wdXQgdmlhIGpveXBhZCkuCisKK0Bjb2Rle3ByaW50Zi9zY2FuZn0gZnVuY3Rpb25zIHdoaWNoIHN1cHBvcnQgZmxvYXRpbmcgcG9pbnQgYXJlIGNvbnRhaW5lZCBpbgordGhlIG1hdGggbGlicmFyeSBvbmx5LgorCitGb3IgaW5wdXQsIHVwL2Rvd24gY2hhbmdlcyB0aGUgY3VycmVudCBjaGFyYWN0ZXIsIGxlZnQvcmlnaHQgbW92ZXMgdGhlIGN1cnNvciwKK3RoZSBCIGJ1dHRvbiBkZWxldGVzIGZyb20gdGhlIGN1cnNvciBwb3NpdGlvbiwgYW5kIHRoZSBBIGJ1dHRvbiBjb25maXJtcyB0aGUgaW5wdXQuCitZb3UgZG8gbm90IHdhbnQgdG8gdXNlIHRoaXMgaW4gcmVhbCBjb2RlLgorCitUaGUgbGlicmFyeSBjb250YWlucyBhIGRlZmF1bHQgY2hhcmFjdGVyIHNldC4gVG8gcmVwbGFjZSBpdCwgbGluayBhbiBvYmplY3QgdGhhdAorY29udGFpbnMgYSBjaGFyYWN0ZXIgc2V0IG1hcHBlZCB0byBzZWN0aW9uIEBjb2Rle2NoYXJzfSBhbmQgZGVmaW5lcyB0aGUgZ2xvYmFsIHN5bWJvbAorQGNvZGV7X19fc3RkY2hyfS4KKworVG8gcmVwbGFjZSBzdGRpbywgdGhlIGZ1bmN0aW9uIEBjb2Rle19fcmVhZCgpfSBhbmQgQGNvZGV7X193cml0ZSgpfSBoYXZlIHRvIGJlCitpbXBsZW1lbnRlZC4KKworQHN1YnNlY3Rpb24gSW50ZXJydXB0cworCitUaGUgbGlicmFyeSBjb250YWlucyBhIGRlZmF1bHQgTk1JIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgdXNlZCBmb3Igc3RkaW8gaGFuZGxpbmcKK2FuZCB0aGUgQGNvZGV7Y2xvY2soKX0tZnVuY3Rpb24uIEl0IGNhbiBiZSByZXBsYWNlZCBieSBsaW5raW5nIHdpdGggYW4gb3duCitpbXBsZW1lbnRhdGlvbiB0aGF0IHN0YXJ0cyBhdCB0aGUgZ2xvYmFsIHN5bWJvbCBAY29kZXtfX19ubWl9LiBJbiB0aGlzIGNhc2UgdGhlIHN0ZGlvIGFuZAordGltaW5nIGZ1bmN0aW9ucyBmcm9tIHZjbGliIGNhbiBub3QgYmUgdXNlZC4KKworQGNvZGV7X19faXJxfSBjYW4gYmUgdXNlZCB0byBvdmVyd3JpdGUgdGhlIG90aGVyIElSUSB2ZWN0b3IuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCitpbiB0aGUgbGlicmFyeSBpbW1lZGlhdGVseSByZXR1cm5zLgorCitAc3Vic2VjdGlvbiBGbG9hdGluZyBQb2ludCAvIHdvemZwCisKK1doZW4gdXNpbmcgZmxvYXRpbmcgcG9pbnQsIHRoZSBtYXRoIGxpYnJhcnkgQGNvZGV7bGlibS5hfSBtdXN0IGJlIGxpbmtlZCB1c2luZwordGhlIEBjb2Rley1sbX0gb3B0aW9uLiBJdCBjb250YWlucyB0aGUgZmxvYXRpbmcgcm91dGluZXMgYXMgd2VsbCBhcyB2ZXJzaW9ucyBvZgordGhlIEBjb2Rle3ByaW50Zi9zY2FuZn0gZmFtaWx5IHRoYXQgc3VwcG9ydCBmbG9hdGluZyBwb2ludC4KKworVGhlIGZsb2F0aW5nIHBvaW50IHJvdXRpbmVzIGFyZSBiYXNlZCBvbiBTdGV2ZSBXb3puaWFrcyByb3V0aW5lcyBmcm9tIHRoZSA3MHMsCitzb21ld2hhdCBhZGFwdGVkIHRvIHRoZSBBQkkgb2YgQGNvZGV7dmJjY30uIFRoZXNlIGZ1bmN0aW9ucyBhcmUgc21hbGwgYW5kCityZWFzb25hYmx5IHVzYWJsZSwgYnV0IHRoZXkgZG8gbm90IGZ1bGx5IHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBvZiBDOTkuCisKK09ubHkgYSBwYXJ0IG9mIHRoZSBDIGxpYnJhcnkgZnVuY3Rpb25zIGZvciBmbG9hdGluZyBwb2ludCBpcyBpbXBsZW1lbnRlZC4gVGhlCitsaXN0IGN1cnJlbnRseSBpbmNsdWRlczoKKworQGl0ZW1pemUKK0BpdGVtIEBjb2Rle2V4cCgpfQorQGl0ZW0gQGNvZGV7cG93KCl9CitAaXRlbSBAY29kZXtsb2coKX0KK0BpdGVtIEBjb2Rle2xvZzEwKCl9CitAZW5kIGl0ZW1pemUKKworQHN1YnNlY3Rpb24gRmxvYXRpbmcgUG9pbnQgLyBJRUVFCisKK0lFRUUgZmxvYXRpbmcgcG9pbnQgaXMgY3VycmVudGx5IG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgdGFyZ2V0LgorCisKK0BzZWN0aW9uIDY1MDIvQXRhcmkKKworVGhpcyBpcyBhIHBvcnQgb2YgdmNsaWIgdG8gQXRhcmkgOGJpdCBjb21wdXRlcnMuCisKK0BzdWJzZWN0aW9uIFN0YXJ0dXAgYW5kIE1lbW9yeQorCitTdGFydHVwIGFuZCBtZW1vcnkgbGF5b3V0IGlzIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHBhcmFncmFwaHMuCisKK0BzdWJzdWJzZWN0aW9uIFN0YXJ0dXAKKworVGhlIGRlZmF1bHQgbGlua2VyIGZpbGUgY3JlYXRlcyBwcm9ncmFtIGZpbGVzIHRoYXQgYXJlIGxvYWRlZCB0byBhZGRyZXNzCisweDYwMC4gVGhlIG1lbW9yeSBhcmVhIGNhbiBiZSBhZGFwdGVkIGJ5IGNoYW5naW5nIEBjb2Rle01FTVNUQVJUfSBhbmQKK0Bjb2Rle01FTUVORH0gaW4gQGNvZGV7dmxpbmsuY21kfS4KKworV2l0aCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLCBhZnRlciBleGl0aW5nIHRoZSBDIHByb2dyYW0sIGl0IHdpbGwgd2FpdAorZm9yIHByZXNzaW5nIHRoZSByZXR1cm4ga2V5IGJlZm9yZSByZXR1cm5pbmcgdG8gRE9TLgorCitAc3Vic3Vic2VjdGlvbiBDb21tYW5kIGxpbmUKKworQ29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLgorCitAc3Vic3Vic2VjdGlvbiBaZXJvIFBhZ2UKKworQGNvZGV7dmJjY30gdXNlcyBhIG51bWJlciBvZiB6ZXJvIHBhZ2UgbG9jYXRpb25zIGZvciByZWdpc3RlciB2YXJpYWJsZXMsIHN0YWNrCitwb2ludGVyIGV0Yy4gaW4gc2VjdGlvbiBAY29kZXt6cGFnZX0uIEFsc28sIHZhcmlhYmxlcyBjYW4gYmUgbWFwcGVkIHRvIHplcm8gcGFnZSB1c2luZwordGhlIEBjb2Rle19fenBhZ2V9IGF0dHJpYnV0ZS4gQnkgZGVmYXVsdCB0aGUgYXJlYSBAY29kZXsweDgyLi4weEZGfQoraXMgdXNlZCwgYnV0IHRoaXMgY2FuIGJlIGNoYW5nZWQgaW4gdGhlIGxpbmtlciBmaWxlLgorCitAc3Vic3Vic2VjdGlvbiBTdGFjaworCitCeSBkZWZhdWx0LCB0aGUgc3RhcnR1cCBjb2RlIG1hcHMgdGhlIHVzZXIgc3RhY2sgZnJvbQorQGNvZGV7TUVNVE9QLVNUQUNLTEVOLi5NRU1UT1B9LgorVGhlIHNpemUgY2FuIGJlIGNoYW5nZWQgYXQgdGhlIHRvcCBvZiBAY29kZXt2bGluay5jbWR9LgorCitAc3Vic3Vic2VjdGlvbiBIZWFwCisKK0NvZGUgYW5kIGRhdGEvQlNTIGFyZSBtYXBwZWQgc3RhcnRpbmcgYXQgQGNvZGV7TUVNU1RBUlR9LgorVGhlIGhlYXAgaXMgcGxhY2VkIGluIHRoZSByZW1haW5pbmcgc3BhY2UgdG8gc3RhY2sgc3RhcnQuCisKK0BzdWJzdWJzZWN0aW9uIEJhbmtpbmcKKworQmFua2luZyBzdXBwb3J0IGZvciB0aGlzIHRhcmdldCBoYXMgbm90IHlldCBiZWVuIGltcGxlbWVudGVkLgorCitAc3Vic2VjdGlvbiBSdW50aW1lCisKK0FwYXJ0IGZyb20gc3RhbmRhcmQgQyBsaWJyYXJ5IGZ1bmN0aW9ucywgQGNvZGV7bGlidmMuYX0gYWxzbyBwcm92aWRlcyBhIGZldworcnVudGltZSBzdXBwb3J0IGZ1bmN0aW9ucyBuZWVkZWQgYnkgdGhlIGNvbXBpbGVyLiBBcGFydCBmcm9tIHRoZSBtYXRoIGFuZAorZmxvYXRpbmcgcG9pbnQgZnVuY3Rpb25zIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgNjUwMiBiYWNrZW5kLAoraXQgaW5jbHVkZXMgZnVuY3Rpb25zIGZvciBzYXZpbmcvcmVzdG9yaW5nIHJlZ2lzdGVycy4KKworQHN1YnNlY3Rpb24gQGNvZGV7c3RkaW99CisKK0F0IHRoZSBtb21lbnQsIHN0ZGlvIG9ubHkgc3VwcG9ydHMgQGNvZGV7c3Rkb3V0fSwgQGNvZGV7c3RkZXJyfSAoYm90aCB1c2luZyB0aGUKK3NjcmVlbikgYW5kIEBjb2Rle3N0ZGlufSAoa2V5Ym9hcmQpLiBCb3RoIGFyZSBsaW5lLWJ1ZmZlcmVkIGJ5IGRlZmF1bHQuCisKK0Bjb2Rle3ByaW50Zi9zY2FuZn0gZnVuY3Rpb25zIHdoaWNoIHN1cHBvcnQgZmxvYXRpbmcgcG9pbnQgYXJlIGNvbnRhaW5lZCBpbgordGhlIG1hdGggbGlicmFyeSBvbmx5LgorCisKK0BzdWJzZWN0aW9uIEZsb2F0aW5nIFBvaW50IC8gd296ZnAKKworV2hlbiB1c2luZyBmbG9hdGluZyBwb2ludCwgdGhlIG1hdGggbGlicmFyeSBAY29kZXtsaWJtLmF9IG11c3QgYmUgbGlua2VkIHVzaW5nCit0aGUgQGNvZGV7LWxtfSBvcHRpb24uIEl0IGNvbnRhaW5zIHRoZSBmbG9hdGluZyByb3V0aW5lcyBhcyB3ZWxsIGFzIHZlcnNpb25zIG9mCit0aGUgQGNvZGV7cHJpbnRmL3NjYW5mfSBmYW1pbHkgdGhhdCBzdXBwb3J0IGZsb2F0aW5nIHBvaW50LgorCitUaGUgZmxvYXRpbmcgcG9pbnQgcm91dGluZXMgYXJlIGJhc2VkIG9uIFN0ZXZlIFdvem5pYWtzIHJvdXRpbmVzIGZyb20gdGhlIDcwcywKK3NvbWV3aGF0IGFkYXB0ZWQgdG8gdGhlIEFCSSBvZiBAY29kZXt2YmNjfS4gVGhlc2UgZnVuY3Rpb25zIGFyZSBzbWFsbCBhbmQKK3JlYXNvbmFibHkgdXNhYmxlLCBidXQgdGhleSBkbyBub3QgZnVsbHkgc2F0aXNmeSB0aGUgcmVxdWlyZW1lbnRzIG9mIEM5OS4KKworT25seSBhIHBhcnQgb2YgdGhlIEMgbGlicmFyeSBmdW5jdGlvbnMgZm9yIGZsb2F0aW5nIHBvaW50IGlzIGltcGxlbWVudGVkLiBUaGUKK2xpc3QgY3VycmVudGx5IGluY2x1ZGVzOgorCitAaXRlbWl6ZQorQGl0ZW0gQGNvZGV7ZXhwKCl9CitAaXRlbSBAY29kZXtwb3coKX0KK0BpdGVtIEBjb2Rle2xvZygpfQorQGl0ZW0gQGNvZGV7bG9nMTAoKX0KK0BlbmQgaXRlbWl6ZQorCitAc3Vic2VjdGlvbiBGbG9hdGluZyBQb2ludCAvIElFRUUKKworV2hlbiB1c2luZyBJRUVFIGZsb2F0aW5nIHBvaW50LCBAY29kZXstaWVlZX0gbXVzdCBiZSBzcGVjaWZpZWQgYW5kIHRoZSBtYXRoIGxpYnJhcnkKK0Bjb2Rle2xpYm1pZWVlLmF9IG11c3QgYmUgbGlua2VkIHVzaW5nCit0aGUgQGNvZGV7LWxtaWVlZX0gb3B0aW9uLiBJdCBjb250YWlucyB0aGUgZmxvYXRpbmcgcm91dGluZXMgYXMgd2VsbCBhcyB2ZXJzaW9ucyBvZgordGhlIEBjb2Rle3ByaW50Zi9zY2FuZn0gZmFtaWx5IHRoYXQgc3VwcG9ydCBmbG9hdGluZyBwb2ludC4KKworVGhlIGZsb2F0aW5nIHBvaW50IHJvdXRpbmVzIGFyZSBiYXNlZCBvbiBTQU5FLAorc29tZXdoYXQgYWRhcHRlZCB0byB0aGUgQUJJIG9mIEBjb2Rle3ZiY2N9IHVzaW5nIHdyYXBwZXIgZnVuY3Rpb25zLgorVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBiZSBmdWxseSBDIGFuZCBJRUVFIGNvbXBsaWFudCBhbmQgcHJvdmlkZSBwcmVjaXNlIHJlc3VsdHMgZm9yCiszMiBhbmQgNjRiaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyAodGhlIGxpYnJhcnkgYWN0dWFsbHkgaW50ZXJuYWxseSBjYWxjdWxhdGVzCithbGwgb3BlcmF0aW9uIHVzaW5nIDgwYml0cywgYnV0IHZiY2MgY3VycmVudGx5IG9ubHkgdXNlcyB1cCB0byA2NCBiaXRzKS4KKworQ3VycmVudGx5LCB0aGlzIGxpYnJhcnkgcHJvYmFibHkgbXVzdCBiZSBydW4gZnJvbSBSQU0uCisKK01vc3QgcGFydHMgb2YgdGhlIEMgbGlicmFyeSBmdW5jdGlvbnMgZm9yIGZsb2F0aW5nIHBvaW50IGFyZSBpbXBsZW1lbnRlZC4gVGhlCitsaXN0IGN1cnJlbnRseSBpbmNsdWRlczoKKworQGl0ZW1pemUKK0BpdGVtIEBjb2Rle2V4cCgpLCBleHBmKCksIGV4cGwoKX0KK0BpdGVtIEBjb2Rle2V4cDIoKSwgZXhwMmYoKSwgZXhwMmwoKX0KK0BpdGVtIEBjb2Rle2V4cDFtKCksIGV4cDFtZigpLCBleHAxbWwoKX0KK0BpdGVtIEBjb2Rle3BvdygpLCBwb3dmKCksIHBvd2woKX0KK0BpdGVtIEBjb2Rle2xvZygpLCBsb2dmKCksIGxvZ2woKX0KK0BpdGVtIEBjb2Rle2xvZzFwKCksIGxvZzFwZigpLCBsb2cxcGwoKX0KK0BpdGVtIEBjb2Rle2xvZzIoKSwgbG9nMmYoKSwgbG9nMmwoKX0KK0BpdGVtIEBjb2Rle2xvZzEwKCksIGxvZzEwZigpLCBsb2cxMGwoKX0KK0BpdGVtIEBjb2Rle3NxcnQoKSwgc3FydGYoKSwgc3FydGwoKX0KK0BpdGVtIEBjb2Rle3NpbigpLCBzaW5mKCksIHNpbmwoKX0KK0BpdGVtIEBjb2Rle2NvcygpLCBjb3NmKCksIGNvc2woKX0KK0BpdGVtIEBjb2Rle3RhbigpLCB0YW5mKCksIHRhbmwoKX0KK0BpdGVtIEBjb2Rle2F0YW4oKSwgYXRhbmYoKSwgYXRhbmwoKX0KKworCitAZW5kIGl0ZW1pemUKKworQHNlY3Rpb24gNjUwMi9CQkMgTWljcm8vTWFzdGVyCisKK1RoaXMgaXMgYSBwb3J0IG9mIHZjbGliIHRvIEJCQyA4Yml0IGNvbXB1dGVycy4KKworQHN1YnNlY3Rpb24gU3RhcnR1cCBhbmQgTWVtb3J5CisKK1N0YXJ0dXAgYW5kIG1lbW9yeSBsYXlvdXQgaXMgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgcGFyYWdyYXBocy4KKworQHN1YnN1YnNlY3Rpb24gU3RhcnR1cAorCitUaGUgZGVmYXVsdCBsaW5rZXIgZmlsZSBjcmVhdGVzIHByb2dyYW0gZmlsZXMgdGhhdCBhcmUgbG9hZGVkIHRvIGFkZHJlc3MKKzB4MTkwMCB1cCB0byAweDdCMDAgd2l0aCAyNTYgYnl0ZXMgb2Ygc29mdHdhcmUgc3RhY2suIFRoZSBtZW1vcnkgYXJlYSBjYW4gYmUgYWRhcHRlZCBieQorY2hhbmdpbmcgQGNvZGV7T1NIV019LCBAY29kZXtISU1FTX0gYW5kIEBjb2Rle1NUQUNLU1RBUlR9IGluIEBjb2Rle3ZsaW5rLmNtZH0uCisKK1dpdGggdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiAoQGNvZGV7K2JiY30pLCBhZnRlciBleGl0aW5nIHRoZSBDIHByb2dyYW0sIHRoZSBjb2RlIHdpbGwgCitlbnRlciBhbiBlbmRsZXNzIGxvb3AuIElmIHRoZSByZWVudHJhbnQgY29uZmlncyBhcmUgdXNlZCAoQGNvZGV7K2JiY3J9IG9yCitAY29kZXsrYmJjYnJ9KSwgdGhlIHByb2dyYW0gd2lsbCByZXR1cm4gdG8gdGhlIGNvbW1hbmQgcHJvbXB0LiBBcyB0aGlzCityZXF1aXJlcyBzYXZpbmcgdGhlIHplcm8gcGFnZSwgYSBiaXQgbW9yZSBtZW1vcnkgaXMgdXNlZC4KKworCitAc3Vic3Vic2VjdGlvbiBDb21tYW5kIGxpbmUKKworSWYgQGNvZGV7bWFpbigpfSB1c2VzIGFyZ3VtZW50cywgdGhlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIHdpbGwgYmUgcGFzc2VkCithY2NvcmRpbmdseS4gVGhlcmUgYXJlIGhhcmRjb2RlZCBsaW1pdHMgdG8gdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKGN1cnJlbnRseSA4KQorYW5kIHRoZSBtYXhpbXVtIHRvdGFsIGNvbW1hbmQgbGVuZ3RoIChjdXJyZW50bHkgODApLgorCitTcGFjZSBpcyB1c2VkIHRvIHNlcGFyYXRlIGFyZ3VtZW50cy4gVGhlIHF1b3RlIGNoYXJhY3RlciAoQGNvZGV7In0pIGNhbiBiZSB1c2VkCit0byBncm91cCBhcmd1bWVudHMgY29udGFpbmluZyBzcGFjZXMuCisKKworQHN1YnN1YnNlY3Rpb24gWmVybyBQYWdlCisKK0Bjb2Rle3ZiY2N9IHVzZXMgYSBudW1iZXIgb2YgemVybyBwYWdlIGxvY2F0aW9ucyBmb3IgcmVnaXN0ZXIgdmFyaWFibGVzLCBzdGFjaworcG9pbnRlciBldGMuIGluIHNlY3Rpb24gQGNvZGV7enBhZ2V9LiBBbHNvLCB2YXJpYWJsZXMgY2FuIGJlIG1hcHBlZCB0byB6ZXJvIHBhZ2UgdXNpbmcKK3RoZSBAY29kZXtfX3pwYWdlfSBhdHRyaWJ1dGUuIEJ5IGRlZmF1bHQgdGhlIGFyZWEgQGNvZGV7MHgwMC4uMHg5MH0KK2lzIHVzZWQsIGJ1dCB0aGlzIGNhbiBiZSBjaGFuZ2VkIGluIHRoZSBsaW5rZXIgZmlsZS4KKworQHN1YnN1YnNlY3Rpb24gU3RhY2sKKworQnkgZGVmYXVsdCwgdGhlIHN0YXJ0dXAgY29kZSBtYXBzIHRoZSB1c2VyIHN0YWNrIGZyb20KK0Bjb2Rle1NUQUNLU1RBUlQuLkhJTUVNfS4KK1RoZSBzaXplIGNhbiBiZSBjaGFuZ2VkIGF0IHRoZSB0b3Agb2YgQGNvZGV7dmxpbmsuY21kfS4KKworQHN1YnN1YnNlY3Rpb24gSGVhcAorCitDb2RlIGFuZCBkYXRhL0JTUyBhcmUgbWFwcGVkIHN0YXJ0aW5nIGF0IEBjb2Rle09TSFdNfS4KK1RoZSBoZWFwIGlzIHBsYWNlZCBpbiB0aGUgcmVtYWluaW5nIHNwYWNlIHRvIHN0YWNrIHN0YXJ0LgorCitAc3Vic3Vic2VjdGlvbiBCYW5raW5nCisKK1doZW4gdXNpbmcgdGhlIEBjb2RleytiYmNifSBvciBAY29kZXtiYmNicn0gY29uZmlndXJhdGlvbnMsIHZiY2Mgc3VwcG9ydHMKK2JhbmtlZCBtZW1vcnksIGluY2x1ZGluZyBhdXRvbWF0ZWQgYmFuay1zd2l0Y2hpbmcuIFVwIHRvIDE2IHNlY3Rpb25zIG9mIDE2Sworc2l6ZSBhcmUgc3VwcG9ydGVkLiBFYWNoIHNlY3Rpb24gc3RhcnRzIGF0IDB4ODAwMC4KKworVGhlIGNvcnJlc3BvbmRpbmcgbGlua2VyCitmaWxlcyBAY29kZXt2bGlua2IuY21kfSBhbmQgQGNvZGV7dmxpbmtici5jbWR9IGNhbiBiZSBlZGl0ZWQgdG8gY2hvb3NlIHRoZQorYmFua3MgdGhhdCBhcmUgcmVxdWlyZWQuIFVudXNlZCBiYW5rcyBjYW4gYmUgcmVtb3ZlZCBieSBjb21tZW50aW5nIG91dAorKHVzaW5nIG9sZC1zdHlsZSBDLWNvbW1lbnRzKSB0aGUgY29ycmVzcG9uZGluZyBlbnRyaWVzIGluIHRoZSBAY29kZXtTRUNUSU9OU30KK3BhcnQgb2YgdGhlIGxpbmtlciBmaWxlLiBXaGVuIHVzaW5nIGJhbmsgMS0zIHRoZSBzZWN0aW9uIGluIHRoZSBsaW5rZXIgZmlsZQorY291bGQgbG9vayBsaWtlIHRoaXM6CisKK0BleGFtcGxlCisgIC4uLgorCitTRUNUSU9OUworQHsKKyAgdGV4dCA6IEB7Kih0ZXh0KUB9ID5yYW0KKyAgLmR0b3JzIDogQHsgKiguZHRvcnMpIEB9ID4gcmFtCisgIC5jdG9ycyA6IEB7ICooLmN0b3JzKSBAfSA+IHJhbQorICByb2RhdGEgOiBAeyoocm9kYXRhKUB9ID5yYW0KKyAgZGF0YTogQHsqKGRhdGEpQH0gPnJhbQorICBpbml0IDogQHsqKGluaXQpQH0gPnJhbQorICB6cGFnZSAoTk9MT0FEKSA6IEB7Kih6cGFnZSkgKih6cDEpICooenAyKUB9ID56ZXJvCisgIGJzcyAoTk9MT0FEKTogQHsqKGJzcylAfSA+cmFtCisKKy8qCisgIGIwIDogQHsuPVBBR0VBRERSOyAqKHRleHQwKSAqKHJvZGF0YTApICooZGF0YTApICooYnNzMCkKKyAgICAgICBSRVNFUlZFKFBBR0VBRERSK1BBR0VTSVpFLS4pOworICAgICAgQH0gPmIwIEFUPmR1bW15MAorKi8KKworICBiMSA6IEB7Lj1QQUdFQUREUjsgKih0ZXh0MSkgKihyb2RhdGExKSAqKGRhdGExKSAqKGJzczEpCisgICAgICAgUkVTRVJWRShQQUdFQUREUitQQUdFU0laRS0uKTsKKyAgICAgIEB9ID5iMSBBVD5kdW1teTEKKworICBiMiA6IEB7Lj1QQUdFQUREUjsgKih0ZXh0MikgKihyb2RhdGEyKSAqKGRhdGEyKSAqKGJzczIpCisgICAgICAgUkVTRVJWRShQQUdFQUREUitQQUdFU0laRS0uKTsKKyAgICAgIEB9ID5iMiBBVD5kdW1teTIKKworICBiMyA6IEB7Lj1QQUdFQUREUjsgKih0ZXh0MykgKihyb2RhdGEzKSAqKGRhdGEzKSAqKGJzczMpCisgICAgICAgUkVTRVJWRShQQUdFQUREUitQQUdFU0laRS0uKTsKKyAgICAgIEB9ID5iMyBBVD5kdW1teTMKKy8qCisgIGI0IDogQHsuPVBBR0VBRERSOyAqKHRleHQ0KSAqKHJvZGF0YTQpICooZGF0YTQpICooYnNzNCkKKyAgICAgICBSRVNFUlZFKFBBR0VBRERSK1BBR0VTSVpFLS4pOworICAgICAgQH0gPmI0IEFUPmR1bW15NAorKi8KKworICAuLi4KKworQGVuZCBleGFtcGxlCisKK0R1cmluZyB0aGUgbGlua2luZyBwcm9jZXNzLCBhcGFydCBmcm9tIHRoZSBub3JtYWwgb3V0cHV0IGZpbGUsIGEgMTZLIGxhcmdlCitpbWFnZSBmb3IgZWFjaCBiYW5rIGFuZCBhIGxvYWRlciBzY3JpcHQgd2lsbCBiZSBnZW5lcmF0ZWQuIEUuZy4gd2hlbiB1c2luZyBiYW5rcyAKKzEtMyBhbmQgdXNpbmcgdGhlIG91dHB1dCBmaWxlIG5hbWUgdGVzdCwgdGhlIGZvbGxvd2luZyBmaWxlcyB3aWxsIGJlIGdlbmVyYXRlZDoKKworQHRhYmxlIEBjb2RlCitAaXRlbSBAY29kZXt0ZXN0fQorICAgICAgVGhlIHVuYmFua2VkIGNvZGUvZGF0YS4KKworQGl0ZW0gQGNvZGV7dGVzdC5pbmZ9CisgICAgICBJbmZvIGZpbGUgd2l0aCBzdGFydCBhZGRyZXNzLgorCitAaXRlbSBAY29kZXt0ZXN0YjF9CisgICAgICBJbWFnZSBmb3IgYmFuazEuCisKK0BpdGVtIEBjb2Rle3Rlc3RiMn0KKyAgICAgIEltYWdlIGZvciBiYW5rMi4KKworQGl0ZW0gQGNvZGV7dGVzdGIyfQorICAgICAgSW1hZ2UgZm9yIGJhbmsyLgorCitAaXRlbSBAY29kZXtsb2FkdGVzdH0KKyBMb2FkZXIKKworQGVuZCB0YWJsZQorCitUaGUgY29udGVudHMgb2YgdGhlIGxvYWRlciBAY29kZXtsb2FkdGVzdH0gd2lsbCBsb29rIGxpa2UgdGhpczoKKworQGV4YW1wbGUKKypzcmxvYWQgdGVzdGIxIDgwMDAgMQorKnNybG9hZCB0ZXN0YjIgODAwMCAyCisqc3Jsb2FkIHRlc3RiMyA4MDAwIDMKKypydW4gdGVzdAorQGVuZCBleGFtcGxlCisKK1RoZSBwcm9ncmFtIGNhbiBiZSBzdGFydGVkIHdpdGggQGNvZGV7KmV4ZWMgbG9hZHRlc3R9LgorCitAc3Vic2VjdGlvbiBSdW50aW1lCisKK0FwYXJ0IGZyb20gc3RhbmRhcmQgQyBsaWJyYXJ5IGZ1bmN0aW9ucywgQGNvZGV7bGlidmMuYX0gYWxzbyBwcm92aWRlcyBhIGZldworcnVudGltZSBzdXBwb3J0IGZ1bmN0aW9ucyBuZWVkZWQgYnkgdGhlIGNvbXBpbGVyLiBBcGFydCBmcm9tIHRoZSBtYXRoIGFuZAorZmxvYXRpbmcgcG9pbnQgZnVuY3Rpb25zIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgNjUwMiBiYWNrZW5kLAoraXQgaW5jbHVkZXMgZnVuY3Rpb25zIGZvciBzYXZpbmcvcmVzdG9yaW5nIHJlZ2lzdGVycy4KKworQHN1YnNlY3Rpb24gQGNvZGV7c3RkaW99CisKK0Bjb2Rle3N0ZG91dH0sIEBjb2Rle3N0ZGVycn0gKGJvdGggdXNpbmcgdGhlIHNjcmVlbikgYW5kIEBjb2Rle3N0ZGlufSAoa2V5Ym9hcmQpCithcmUgc3VwcG9ydGVkLiBGdXJ0aGVybW9yZSBub3JtYWwgZmlsZSBvcGVyYXRpb25zIGFyZSBwb3NzaWJsZSB1c2luZyB0aGUgCit1c3VhbCBDIGZ1bmN0aW9ucy4gVGhlcmUgYXJlIGhhcmRjb2RlZCBsaW1pdHMgb24gdGhlIG1heGltdW0gbnVtYmVyIG9mCitzaW11bHRhbmVvdXNseSBvcGVuIGZpbGVzIGFzIHdlbGwgYXMgdGhlIGxlbmd0aCBvZiBmaWxlbmFtZXMuCisKK1NlcXVlbnRpYWwgcmVhZGluZyBhbmQgd3JpdGluZyBpcyBzdXBwb3J0ZWQsIGJ1dCBubyBzZWVraW5nLiBGdXJ0aGVybW9yZSwgdGhlCitAY29kZXtyZW1vdmUoKX0gY2FsbCBpcyBzdXBwb3J0ZWQuCisKK1doZW4gdXNpbmcgc3RkaW8gdG8gZW1pdCBWRFUgY29udHJvbCBzZXF1ZW5jZXMsIHRoZSBmdW5jdGlvbgorQGNvZGV7X192ZHVfc2VxdWVuY2UoKX0gaXMgYXZhaWxhYmxlIHRvIGVuc3VyZSB2ZXJiYXRpbSAxOjEgdHJhbnNtaXNzaW9uCitvZiBhbGwgY2hhcmFjdGVyczoKKworQGV4YW1wbGUKKyAvKiBwcmludCBkaWFnb25hbCBsaW5lICovCisgX192ZHVfc2VxdWVuY2UoMSk7CisgZm9yKGludCBpPTA7aTwyMDtpKyspCisgICBwcmludGYoIlx4MWYlYyVjTyIsaSxpKTsKKyBfX3ZkdV9zZXF1ZW5jZSgwKTsKK0BlbmQgZXhhbXBsZQorCitAY29kZXtwcmludGYvc2NhbmZ9IGZ1bmN0aW9ucyB3aGljaCBzdXBwb3J0IGZsb2F0aW5nIHBvaW50IGFyZSBjb250YWluZWQgaW4KK3RoZSBtYXRoIGxpYnJhcnkgb25seS4KKworCitAc3Vic2VjdGlvbiBGbG9hdGluZyBQb2ludCAvIHdvemZwCisKK1doZW4gdXNpbmcgZmxvYXRpbmcgcG9pbnQsIHRoZSBtYXRoIGxpYnJhcnkgQGNvZGV7bGlibS5hfSBtdXN0IGJlIGxpbmtlZCB1c2luZwordGhlIEBjb2Rley1sbX0gb3B0aW9uLiBJdCBjb250YWlucyB0aGUgZmxvYXRpbmcgcm91dGluZXMgYXMgd2VsbCBhcyB2ZXJzaW9ucyBvZgordGhlIEBjb2Rle3ByaW50Zi9zY2FuZn0gZmFtaWx5IHRoYXQgc3VwcG9ydCBmbG9hdGluZyBwb2ludC4KKworVGhlIGZsb2F0aW5nIHBvaW50IHJvdXRpbmVzIGFyZSBiYXNlZCBvbiBTdGV2ZSBXb3puaWFrcyByb3V0aW5lcyBmcm9tIHRoZSA3MHMsCitzb21ld2hhdCBhZGFwdGVkIHRvIHRoZSBBQkkgb2YgQGNvZGV7dmJjY30uIFRoZXNlIGZ1bmN0aW9ucyBhcmUgc21hbGwgYW5kCityZWFzb25hYmx5IHVzYWJsZSwgYnV0IHRoZXkgZG8gbm90IGZ1bGx5IHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBvZiBDOTkuCisKK09ubHkgYSBwYXJ0IG9mIHRoZSBDIGxpYnJhcnkgZnVuY3Rpb25zIGZvciBmbG9hdGluZyBwb2ludCBpcyBpbXBsZW1lbnRlZC4gVGhlCitsaXN0IGN1cnJlbnRseSBpbmNsdWRlczoKKworQGl0ZW1pemUKK0BpdGVtIEBjb2Rle2V4cCgpfQorQGl0ZW0gQGNvZGV7cG93KCl9CitAaXRlbSBAY29kZXtsb2coKX0KK0BpdGVtIEBjb2Rle2xvZzEwKCl9CitAZW5kIGl0ZW1pemUKKworQHN1YnNlY3Rpb24gRmxvYXRpbmcgUG9pbnQgLyBJRUVFCisKK1doZW4gdXNpbmcgSUVFRSBmbG9hdGluZyBwb2ludCwgQGNvZGV7LWllZWV9IG11c3QgYmUgc3BlY2lmaWVkIGFuZCB0aGUgbWF0aCBsaWJyYXJ5CitAY29kZXtsaWJtaWVlZS5hfSBtdXN0IGJlIGxpbmtlZCB1c2luZwordGhlIEBjb2Rley1sbWllZWV9IG9wdGlvbi4gSXQgY29udGFpbnMgdGhlIGZsb2F0aW5nIHJvdXRpbmVzIGFzIHdlbGwgYXMgdmVyc2lvbnMgb2YKK3RoZSBAY29kZXtwcmludGYvc2NhbmZ9IGZhbWlseSB0aGF0IHN1cHBvcnQgZmxvYXRpbmcgcG9pbnQuCisKK1RoZSBmbG9hdGluZyBwb2ludCByb3V0aW5lcyBhcmUgYmFzZWQgb24gU0FORSwKK3NvbWV3aGF0IGFkYXB0ZWQgdG8gdGhlIEFCSSBvZiBAY29kZXt2YmNjfSB1c2luZyB3cmFwcGVyIGZ1bmN0aW9ucy4KK1RoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgZnVsbHkgQyBhbmQgSUVFRSBjb21wbGlhbnQgYW5kIHByb3ZpZGUgcHJlY2lzZSByZXN1bHRzIGZvcgorMzIgYW5kIDY0Yml0IGZsb2F0aW5nIHBvaW50IG51bWJlcnMgKHRoZSBsaWJyYXJ5IGFjdHVhbGx5IGludGVybmFsbHkgY2FsY3VsYXRlcworYWxsIG9wZXJhdGlvbiB1c2luZyA4MGJpdHMsIGJ1dCB2YmNjIGN1cnJlbnRseSBvbmx5IHVzZXMgdXAgdG8gNjQgYml0cykuCisKK0N1cnJlbnRseSwgdGhpcyBsaWJyYXJ5IHByb2JhYmx5IG11c3QgYmUgcnVuIGZyb20gUkFNLgorCitNb3N0IHBhcnRzIG9mIHRoZSBDIGxpYnJhcnkgZnVuY3Rpb25zIGZvciBmbG9hdGluZyBwb2ludCBhcmUgaW1wbGVtZW50ZWQuIFRoZQorbGlzdCBjdXJyZW50bHkgaW5jbHVkZXM6CisKK0BpdGVtaXplCitAaXRlbSBAY29kZXtleHAoKSwgZXhwZigpLCBleHBsKCl9CitAaXRlbSBAY29kZXtleHAyKCksIGV4cDJmKCksIGV4cDJsKCl9CitAaXRlbSBAY29kZXtleHAxbSgpLCBleHAxbWYoKSwgZXhwMW1sKCl9CitAaXRlbSBAY29kZXtwb3coKSwgcG93ZigpLCBwb3dsKCl9CitAaXRlbSBAY29kZXtsb2coKSwgbG9nZigpLCBsb2dsKCl9CitAaXRlbSBAY29kZXtsb2cxcCgpLCBsb2cxcGYoKSwgbG9nMXBsKCl9CitAaXRlbSBAY29kZXtsb2cyKCksIGxvZzJmKCksIGxvZzJsKCl9CitAaXRlbSBAY29kZXtsb2cxMCgpLCBsb2cxMGYoKSwgbG9nMTBsKCl9CitAaXRlbSBAY29kZXtzcXJ0KCksIHNxcnRmKCksIHNxcnRsKCl9CitAaXRlbSBAY29kZXtzaW4oKSwgc2luZigpLCBzaW5sKCl9CitAaXRlbSBAY29kZXtjb3MoKSwgY29zZigpLCBjb3NsKCl9CitAaXRlbSBAY29kZXt0YW4oKSwgdGFuZigpLCB0YW5sKCl9CitAaXRlbSBAY29kZXthdGFuKCksIGF0YW5mKCksIGF0YW5sKCl9CisKKworQGVuZCBpdGVtaXplCisKKworCitAc2VjdGlvbiA2NTAyL01FR0E2NQorCitUaGlzIGlzIGEgcG9ydCBvZiB2Y2xpYiB0byB0aGUgTUVHQTY1LiBUaGlzIHBvcnQgaXMgaW50ZW5kZWQgZm9yIHRoZSBDNjUgbW9kZQord2l0aCBhIEM2NSBvciBjb21wYXRpYmxlIFJPTSAoYWx0aG91Z2ggdGhlIFJPTSBpcyBub3QgdXNlZCBhZnRlciB0aGUKK3Byb2dyYW0gaXMgc3RhcnRlZCkuIFRoZSBDNjQgY29uZmlndXJhdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgcHJvZ3JhbXMgZm9yCit0aGUgQzY0IG1vZGUuCisKKworQHN1YnNlY3Rpb24gU3RhcnR1cCBhbmQgTWVtb3J5CisKK1N0YXJ0dXAgYW5kIG1lbW9yeSBsYXlvdXQgaXMgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgcGFyYWdyYXBocy4KKworVGhlIGZvbGxvd2luZyBiYXNpYyBjb25maWd1cmF0aW9ucyBhcmUgYXZhaWxhYmxlLiBTZWUgYmVsb3cgZm9yIG1vcmUgZGV0YWlsczoKKworQHRhYmxlIEBjb2RlCitAaXRlbSArbTY1cworICAgICAgU3RhbmRhcmQgdW5iYW5rZWQgY29uZmlndXJhdGlvbi4KKworQGl0ZW0gK202NXNyCisgICAgICBTdGFuZGFyZCB1bmJhbmtlZCByZWVudHJhbnQgY29uZmlndXJhdGlvbi4KKworQGl0ZW0gK202NXNiCisgICAgICBTdGFuZGFyZCBiYW5rZWQgY29uZmlndXJhdGlvbi4KKworQGl0ZW0gK202NWwKKyAgICAgIExhcmdlIHVuYmFua2VkIGNvbmZpZ3VyYXRpb24uCisKK0BpdGVtICttNjVscgorICAgICAgTGFyZ2UgdW5iYW5rZWQgcmVlbnRyYW50IGNvbmZpZ3VyYXRpb24uCisKK0BpdGVtICttNjVsYgorICAgICAgTGFyZ2UgYmFua2VkIGNvbmZpZ3VyYXRpb24uCisKK0BlbmQgdGFibGUKKworQHN1YnN1YnNlY3Rpb24gU3RhcnR1cAorCitUaGUgZGVmYXVsdCBsaW5rZXIgZmlsZSBjcmVhdGVzIHByb2dyYW0gZmlsZXMgdGhhdCBhcmUgbG9hZGVkIHRvIGFkZHJlc3MKKzB4MjAwMS4gQSBCQVNJQyBsaW5lIGlzIGluY2x1ZGVkIHNvIHRoYXQgdGhlIHByb2dyYW0gY2FuIGJlIHN0YXJ0ZWQgdXNpbmcgQGNvZGV7UlVOfQorZnJvbSBCQVNJQy4gVGhlIHN0YXJ0dXAgY29kZQord2lsbCBzd2l0Y2ggdG8gVklDLUlWIG1vZGUsIHJlbW92ZSB3cml0ZSBwcm90ZWN0aW9uIG9mIFJPTSBiYW5rcywgdHVybiBvbiBmdWxsCitzcGVlZCBhbmQgY2hhbmdlIHRvIGEgc3VpdGFibGUgbWFwcGluZy4KK1RoZSBCU1Mgc2VnbWVudCB3aWxsIGJlIGNsZWFyZWQgZHVyaW5nIHN0YXJ0dXAuCisKK1RoZXJlIGFyZSB0d28gc2V0cyBvZiBjb25maWd1cmF0aW9ucyB0aGF0IGFmZmVjdCB0aGUgY29uZmlndXJhdGlvbiBvZgordXBwZXIgbWVtb3J5LiBUaGUgc3RhbmRhcmQgdmVyc2lvbnMgKEBjb2RleyttNjVzLCArbTY1c3IsICttNjVzYn0pCit3aWxsIGtlZXAgdGhlIElPIGFyZWEgbWFwcGVkIGluIGF0ICREMDAwLgorVGhpcyB3aWxsIGxpbWl0IHRoZSBjb250aWd1b3VzIG1lbW9yeSBibG9jayBmb3IgdW5iYW5rZWQgY29uZmlndXJhdGlvbnMgdG8gMHhDRkZGLiAKK0ZvciBiYW5rZWQgY29uZmlndXJhdGlvbnMgKHNlZSBiZWxvdykgaXQgd2lsbCBtYWtlIGEgMTZLIHdpbmRvdyBmcm9tCisweDgwMDAuLjB4QkZGRiBhdmFpbGFibGUgZm9yIGJhbmtpbmcuIFRoZSBsYXJnZSBjb25maWd1cmF0aW9ucworKEBjb2RleyttNjVsLCArbTY1bHIsICttNjVsYn0pIHdpbGwgbW92ZSB0aGUgdXBwZXIgYm91bmQgZm9yIHVuYmFua2VkIHByb2dyYW1zCit0byAweEZGRkYuIFdpdGggYmFua2luZywgMzJLIHdpbmRvdyB3aWxsIGJlIGF2YWlsYWJsZSBmcm9tIDB4ODAwMC4uMHhGRkZGLgorSW4gYm90aCBjYXNlcyB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSBhdmFpbGFibGUgZm9yIGJhbmtpbmcgaXMgdGhlIHNhbWUgaW4KK2JvdGggY29uZmlndXJhdGlvbnMuCisKK1doaWxlIHRoZSBsYXJnZSBjb25maWd1cmF0aW9ucyBwcm92aWRlIGxhcmdlciBjb250aWd1b3VzIG1lbW9yeSBhcmVhcywgYWNjZXNzZXMKK3RvIHRoZSBJTyBhcmVhIGhhdmUgdG8gYmUgbWFkZSB0aHJvdWdoIGV4dGVuZGVkIDI4Yml0IGluc3RydWN0aW9ucyB3aGljaCBhcmUKK211Y2ggbGFyZ2VyIGFuZCBzbG93ZXIuIEZvciBwcm9ncmFtcyBkb2luZyBtYW55IElPIGFjY2Vzc2VzLCB0aGUgc3RhbmRhcmQKK2NvbmZpZ3VyYXRpb25zIGFyZSByZWNvbW1lbmRlZC4KKworV2l0aCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9ucywgYWZ0ZXIgZXhpdGluZyB0aGUgQyBwcm9ncmFtLCBhbiBpbmZpbml0ZSBsb29wIHdpbGwKK2JlIGVudGVyZWQuIFdoZW4gdXNpbmcgdGhlIHJlZW50cmFudCAoQGNvZGV7K202NXNyLCArbTY1bHJ9KSBjb25maWdzLCB0aGUKK3Byb2dyYW0gd2lsbCByZXR1cm4gdG8gQkFTSUMgYW4gY2FuIGJlIHN0YXJ0ZWQgYWdhaW4uCitIb3dldmVyLCB0aGlzIG5lZWRzIGFkZGl0aW9uYWwgbWVtb3J5IGFzIHRoZSBpbml0IHZhbHVlcyBmb3IgdGhlIGRhdGEgc2VjdGlvbiBoYXZlCit0byBiZSBzdG9yZWQgaW4gUkFNLiBBbHNvLCBzb21lIHJlZ2lzdGVyIHZhbHVlcyBhbmQgemVybyBwYWdlIGNvbnRlbnRzIGhhdmUgdG8gYmUKK3NhdmVkLiBUaGUgb3ZlcmhlYWQgZGVwZW5kcyBvbiB0aGUgYW1vdW50IG9mIGluaXRpYWxpemVkIHZhcmlhYmxlcy4KKworQ2F1dGlvbjogVGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBhc3N1bWVzIHRoYXQgdGhlIFogcmVnaXN0ZXIgYWx3YXlzIGNvbnRhaW5zIDAuCitUbyB3b3JrIGNvcnJlY3RseSwgdGhlIFogcmVnaXN0ZXIgaGFzIHRvIGJlIDAgd2hlbiBDIGNvZGUgaXMKK2V4ZWN1dGVkLiBUaGUgc3RhcnR1cCBjb2RlIHdpbGwgc2V0IGl0IGNvcnJlY3RseSBhbmQgdGhlIGNvbXBpbGVyIGdlbmVyYXRlZCBjb2RlIHdpbGwKK25vdCB0b3VjaCBpdC4gSG93ZXZlciwgd2hlbiBjYWxsaW5nIG90aGVyIGNvZGUgeW91IG1heSBoYXZlIHRvIHRha2UgY2FyZQordG8gc2F2ZS9yZXN0b3JlIHRoZSBaIHJlZ2lzdGVyIG9yIHRvIHNldCB0aGUgWiByZWdpc3RlciB0byAwIGFnYWluLgorCitAc3Vic3Vic2VjdGlvbiBDb21tYW5kIGxpbmUKKworQ29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgYXJlIHN1cHBvcnRlZCBieSB1c2luZyB0aGUgY29udmVudGlvbi9jb2RlIHN1Ym1pdHRlZCBieQorU3RlZmFuIEhhdWJlbnRoYWwuIAorCitDb21tYW5kLWxpbmVzIGxvb2sgbGlrZSB0aGVzZSBsaW5lczoKKworQGV4YW1wbGUKKyAgIHJ1bgorICAgcnVuIDogcmVtCisgICBydW46cmVtIGFyZzEgIiBhcmcgMiBpcyBxdW90ZWQgIiAgYXJnMyAiIiBhcmc1CitAZW5kIGV4YW1wbGUKKworCisKK0BzdWJzdWJzZWN0aW9uIFplcm8gUGFnZQorCitAY29kZXt2YmNjfSB1c2VzIGEgbnVtYmVyIG9mIHplcm8gcGFnZSBsb2NhdGlvbnMgZm9yIHJlZ2lzdGVyIHZhcmlhYmxlcywgc3RhY2sKK3BvaW50ZXIgZXRjLiBpbiBzZWN0aW9uIEBjb2Rle3pwYWdlfS4gQWxzbywgdmFyaWFibGVzIGNhbiBiZSBtYXBwZWQgdG8gemVybyBwYWdlIHVzaW5nCit0aGUgQGNvZGV7X196cGFnZX0gYXR0cmlidXRlLiBCeSBkZWZhdWx0IHRoZSBhcmVhIEBjb2RlezB4MDIuLjB4RkZ9CitpcyB1c2VkLCBidXQgdGhpcyBjYW4gYmUgY2hhbmdlZCBpbiB0aGUgbGlua2VyIGZpbGUuCisKK0BzdWJzdWJzZWN0aW9uIFN0YWNrCisKK0J5IGRlZmF1bHQsIHRoZSB1c2VyIHN0YWNrIGlzIG1hcHBlZCBmcm9tIEBjb2RlezB4QjgwMC4uMHhDMDAwfS4gRm9yIHRoZSBiYW5rZWQgdmVyc2lvbiwKK2l0IGlzIG1hcHBlZCBmcm9tIEBjb2RlezB4NzgwMC4uMHg4MDAwfS4gIFRoZSBzaXplIGNhbiBiZQorY2hhbmdlZCBhdCB0aGUgdG9wIG9mIEBjb2Rle3ZsaW5rLmNtZH0gYW5kIEBjb2Rle3ZsaW5rYmFuay5jbWR9LgorCitAc3Vic3Vic2VjdGlvbiBIZWFwCisKK0NvZGUgYW5kIGRhdGEvQlNTIGFyZSBtYXBwZWQgc3RhcnRpbmcgYWZ0ZXIgdGhlIEJBU0lDIGluaXQgbGluZS4KK1RoZSBoZWFwIGlzIHBsYWNlZCBpbiB0aGUgcmVtYWluaW5nIHNwYWNlIGRlcGVuZGluZyBvbiB0aGUgY29uZmlndXJhdGlvbi4KKworQHN1YnN1YnNlY3Rpb24gQmFua2luZworCitUaGUgZm9sbG93aW5nIGJhbmtpbmcgbW9kZWxzIGFyZSBzdXBwb3J0ZWQ6CisKK0B0YWJsZSBAY29kZQorQGl0ZW0gK202NXNiCisgICAgICAxNksgd2luZG93IGF0IDB4ODAwMCB3aXRoIElPIGFyZWEgbWFwcGVkIGluIGF0IGFsbCB0aW1lcy4KKworQGl0ZW0gK202NWxiCisgICAgICAzMksgd2luZG93IGF0IDB4ODAwMC4KK0BlbmQgdGFibGUKKworCitBdXRvbWF0ZWQgYmFuayBzd2l0Y2hpbmcgaXMgc3VwcG9ydGVkIGluIGJvdGggbW9kZXMuIFRoZSBtYXBwaW5nIG9mIGJhbmtzIHRvCityZWFsIG1lbW9yeSBpbiB0aGUgc3RhbmRhcmQgY29uZmlndXJhdGlvbiBpcyBsaWtlIHRoaXM6CitAZXhhbXBsZQorVW5iYW5rZWQ6ICAgICAgIDB4MDAwMDAwLi4weDAwN0ZGRgorQmFuazA6ICAgICAgICAgIDB4MDA4MDAwLi4weDAwQkZGRgorQmFuazE6ICAgICAgICAgIDB4MDBDMDAwLi4weDAwRkZGRgorQmFuazI6ICAgICAgICAgIDB4MDEwMDAwLi4weDAxM0ZGRgorQmFuazM6ICAgICAgICAgIDB4MDE0MDAwLi4weDAxN0ZGRgorICAgICAgICAgLi4uCitAZW5kIGV4YW1wbGUKKworT24gdGhlIGxhcmdlIGNvbmZpZ3VyYXRpb24sIGl0IGxvb2tzIGxpa2UgdGhpczoKK0BleGFtcGxlCitVbmJhbmtlZDogICAgICAgMHgwMDAwMDAuLjB4MDA3RkZGCitCYW5rMDogICAgICAgICAgMHgwMDgwMDAuLjB4MDBGRkZGCitCYW5rMTogICAgICAgICAgMHgwMTAwMDAuLjB4MDE3RkZGCitCYW5rMjogICAgICAgICAgMHgwMTgwMDAuLjB4MDFGRkZGCitCYW5rMzogICAgICAgICAgMHgwMjAwMDAuLjB4MDI3RkZGCisgICAgICAgICAuLi4KK0BlbmQgZXhhbXBsZQorCitJbiBib3RoIGNhc2VzLCB0aGUgcHJvZ3JhbSBzdGFydCBpcyBtb3ZlZCB0byAweDEwMDAuCitXaGVuIHVzaW5nIHRoZSBiYW5rZWQgY29uZmlndXJhdGlvbnMsIHRoZSBjb2RlIGNhbiBub3QgYmUgc2ltcGx5IGxvYWRlZCBmcm9tCitCQVNJQy4gVGhlIGxpbmtlciB3aWxsIGNyZWF0ZSBvbiBsYXJnZSBpbWFnZSB3aXRob3V0IGFueSBCQVNJQyBsaW5lcy4gVGhlCitmaWxlIGNhbiBiZSBleGVjdXRlZCBmcm9tIFNELWNhcmQgYnkgdXNpbmcgYSBzcGVjaWFsIGxvYWRlciB0aGF0IGNhbiBiZSBsb2FkZWQKK2Zyb20gQkFTSUMgb2ZmIGEgZGlzayBvciBkaXNrIGltYWdlLiBXaGVuIHNwZWNpZnlpbmcgYSBuYW1lIGFzIGNvbW1hbmQgbGluZQorYXJndW1lbnQgKHNlZSBhYm92ZSksIHRoZSBsb2FkZXIgd2lsbCB0cnkgdG8gbG9hZCB0aGlzIGltYWdlIGZyb20gU0QtY2FyZC4gSWYKK25vIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgbG9hZGVyIHdpbGwgbG9vayBmb3IgYSBmaWxlIG9mIHRoZSBzYW1lIG5hbWUuCitUaGVyZWZvcmUgYnkgcmVuYW1pbmcgdGhlIGxvYWRlciBpdCBjYW4gYmUgbWFkZSB0byBhdXRvbWF0aWNhbGx5IHJ1biBhCitzcGVjaWZpYyBmaWxlLgorCitJZiB0aGUgbG9hZGVyIGlzIG9uIHRoZSBjdXJyZW50IGRpc2svaW1hZ2UgYW5kIEBjb2Rle215aW1hZ2V9IG9uIHRoZSBTRDoKK0BleGFtcGxlCitMT0FEICJMT0FERVIiCitSVU46UkVNIE1ZSU1BR0UKK0BlbmQgZXhhbXBsZQorCitBZnRlciByZW5hbWluZyBAY29kZXtMT0FERVJ9IHRvIEBjb2Rle01ZSU1BR0V9LCBpdCBjYW4gYmUgZG9uZSBsaWtlIHRoaXM6CitAZXhhbXBsZQorUlVOICJNWUlNQUdFIgorQGVuZCBleGFtcGxlCisKK1RoZSBjb2xvdXIgUkFNIHdpbGwgYmUgcmVsb2NhdGVkIHRvIDB4RkY4MDgwMCBiZWZvcmUgbG9hZGluZyB0byBhdm9pZCBiZWluZworb3ZlcndyaXR0ZW4gdGhyb3VnaCB0aGUgd2luZG93IGF0IDB4MUY4MDAuCisKK0BzdWJzZWN0aW9uIFJ1bnRpbWUKKworQXBhcnQgZnJvbSBzdGFuZGFyZCBDIGxpYnJhcnkgZnVuY3Rpb25zLCBAY29kZXtsaWJ2Yy5hfSBhbHNvIHByb3ZpZGVzIGEgZmV3CitydW50aW1lIHN1cHBvcnQgZnVuY3Rpb25zIG5lZWRlZCBieSB0aGUgY29tcGlsZXIuIEFwYXJ0IGZyb20gdGhlIG1hdGggYW5kCitmbG9hdGluZyBwb2ludCBmdW5jdGlvbnMgbWVudGlvbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSA2NTAyIGJhY2tlbmQsCitpdCBpbmNsdWRlcyBmdW5jdGlvbnMgZm9yIHNhdmluZy9yZXN0b3JpbmcgcmVnaXN0ZXJzLgorCitAc3Vic2VjdGlvbiBAY29kZXtzdGRpb30KKworQXQgdGhlIG1vbWVudCwgc3RkaW8gb25seSBzdXBwb3J0cyBAY29kZXtzdGRvdXR9LCBAY29kZXtzdGRlcnJ9IChib3RoIHVzaW5nIHRoZQorc2NyZWVuKSBhbmQgQGNvZGV7c3RkaW59IChrZXlib2FyZCkuIEJvdGggYXJlIHVuYnVmZmVyZWQgYnkgZGVmYXVsdC4KK1VzaW5nIHRob3NlIHN0cmVhbXMgd2lsbCBkaXJlY3RseSBhY2Nlc3MgdGhlIHNjcmVlbiBidWZmZXIgYW5kIGtleWJvYXJkCitoYXJkd2FyZS4gTm8gUk9NIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIG9uY2UgdGhlIHByb2dyYW0gcnVucy4KKworRnVydGhlcm1vcmUgaXQgaXMgcG9zc2libGUgdG8gcmVhZCBmaWxlcyBvbiB0aGUgU0QtY2FyZCB1c2luZyBzdGFuZGFyZAorQyBmdW5jdGlvbnMgYWZ0ZXIgb3BlbmluZyB0aGVtIHVzaW5nIEBjb2Rle2ZvcGVuKCl9LiBIeXBwbyBzZXJ2aWNlcyBhcmUKK3VzZWQgdG8gcmVhZCB0aG9zZSBmaWxlcy4gVGhlcmUgYXJlIHNldmVyYWwgbGltaXRhdGlvbnMgZHVlIHRvIHRoZQorcmVzdHJpY3Rpb25zIG9mIEh5cHBvOgorCitAaXRlbWl6ZQorQGl0ZW0gRmlsZXMgY2FuIG9ubHkgYmUgcmVhZCBzZXF1ZW50aWFsbHksIG5vIHNlZWtpbmcgZXRjLgorQGl0ZW0gRmlsZXMgY2FuIG5vdCBiZSB3cml0dGVuIHRvLgorQGl0ZW0gT25seSBvbmUgZmlsZSBjYW4gYmUgb3BlbiBhdCB0aGUgc2FtZSB0aW1lLgorQGVuZCBpdGVtaXplCisKKworQGNvZGV7cHJpbnRmL3NjYW5mfSBmdW5jdGlvbnMgd2hpY2ggc3VwcG9ydCBmbG9hdGluZyBwb2ludCBhcmUgY29udGFpbmVkIGluCit0aGUgbWF0aCBsaWJyYXJ5IG9ubHkuCisKK0BzdWJzZWN0aW9uIE11bHRpcGxpY2F0aW9uL0RpdmlzaW9uCisKK1doZW4gZ2VuZXJhdGluZyBjb2RlIGZvciB0aGUgTUVHQTY1LCBAY29kZXt2YmNjfSB3aWxsIG1ha2UgdXNlIG9mIGhhcmR3YXJlCittdWx0aXBsaWVyL2RpdmlkZXIuIFRoaXMgY2FuIGdyZWF0bHkgaW1wcm92ZSBwZXJmb3JtYW5jZSBvZiBzdWNoIG9wZXJhdGlvbnMuCitQbGVhc2Ugbm90ZSB0aGUgZm9sbG93aW5nIGlzc3VlczoKKworQGl0ZW1pemUKK0BpdGVtIFNvbWUgdmVyc2lvbnMgb2YgdGhlIE1FR0E2NSBjb3JlIGNvbnRhaW4gYSBidWcgaW4gdGhlIGhhcmR3YXJlIGRpdmlkZXIKKyAgICAgIHdoaWNoIHdpbGwgY2FsY3VsYXRlIHdyb25nIHJlc3VsdHMgaW4gY2VydGFpbiBjYXNlcy4gQXMgd29ya2Fyb3VuZCB5b3UgY2FuCisgICAgICBzcGVjaWZ5IG9wdGlvbiBAY29kZXstZGl2LWJ1Z30gdG8gdXNlIChtdWNoIHNsb3dlcikgNjUwMiBzb2Z0d2FyZQorICAgICAgcm91dGluZXMgaW5zdGVhZC4gTXVsdGlwbGljYXRpb24gaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSBidWcgYW5kIHdpbGwgc3RpbGwKKyAgICAgIGJlIHVzaW5nIHRoZSBoYXJkd2FyZSBtdWx0aXBsaWVyLgorCitAaXRlbSBUaGUgaGFyZHdhcmUgbXVsdGlwbGllciByZWdpc3RlcnMgYXJlIG1hcHBlZCBpbiB0aGUgSU8gYXJlYS4gV2hlbiB1c2luZworICAgICAgdGhlIGxhcmdlIGNvbmZpZ3VyYXRpb25zIChAY29kZXsrbTY1bCwgK202NWxyLCArbTY1bGJ9KSwgdGhleSBjYW4gb25seQorICAgICAgYmUgYWNjZXNzZWQgdXNpbmcgZXh0ZW5kZWQgMjhiaXQgaW5zdHJ1Y3Rpb25zLiBUaGUgY29kZSBnZW5lcmF0b3IgYW5kCisgICAgICBsaWJyYXJ5IGZ1bmN0aW9ucyB3aWxsIGhhbmRsZSB0aGlzLCBidXQgdGhlcmUgaXMgc29tZSBvdmVyaGVhZCAoc3RpbGwKKyAgICAgIG5vd2hlcmUgbmVhciB1c2luZyBzb2Z0d2FyZSBtdWx0aXBsaWNhdGlvbikuIElmIHlvdXIgY29kZSBpcyBzcGVlZAorICAgICAgY3JpdGljYWwgYW5kIHVzZXMgbWFueSBtdWx0aXBsaWNhdGlvbnMgd2Ugc3Ryb25nbHkgcmVjb21tZW50IHRvIHVzZQorICAgICAgdGhlIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb25zIChAY29kZXsrbTY1cywgK202NXNyLCArbTY1c2J9KS4gVGhvc2Ugd2lsbAorICAgICAgc2V0IHRoZSBvcHRpb24gQGNvZGV7LW02NWlvfSB0aGF0IHRlbGxzIEBjb2Rle3ZiY2N9IHRvIHVzZSBmYXN0ZXIKKyAgICAgIGRpcmVjdCBJTyBhY2Nlc3Nlcy4KK0BlbmQgaXRlbWl6ZQorICAgICAgCitAc3Vic2VjdGlvbiBJbnRlcnJ1cHRzCisKK1RoZSBwcm92aWRlZCBjb25maWd1cmF0aW9ucyB3aWxsIGRpc2FibGUgaW50ZXJydXB0cyBvbiB0aGUgTUVHQTY1LiBBbGwgdGhlCitsaWJyYXJ5IGZ1bmN0aW9ucyBhcmUgd3JpdHRlbiB0byB3b3JrIHdpdGggZGlzYWJsZWQgaW50ZXJydXB0cyBhbmQgZG8gbm90IHVzZQorYW55IFJPTSByb3V0aW5lcy4gVGhlIGludGVycnVwdCBoYW5kbGVycyBpbiBleGlzdGluZyBDNjUgUk9NcyBkbyBub3Qgd29yayB3ZWxsCit3aXRoIGFzc2VtYmx5IGxhbmd1YWdlIGNvZGUgYW5kIGRlZmljaWVuY2llcyBpbiB0aGUgbWFwcGluZyBoYXJkd2FyZSBtYWtlIGl0Cit2ZXJ5IGhhcmQgdG8gdXNlIHRoZSBST00gaW4gYSBub24tQkFTSUMgZW52aXJvbm1lbnQuCisKK0lmIGFuIGFwcGxpY2F0aW9uIHdhbnRzIHRvIHVzZSBpbnRlcnJ1cHRzLCBpbnRlcnJ1cHQgdmVjdG9ycyBoYXZlIHRvIGJlCitpbnN0YWxsZWQgYXQgMHhGRkZBLi4weEZGRkYuIFRha2UgY2FyZSB0aGF0IHRoZXJlIGFyZSBhbHdheXMgdmFsaWQgdmVjdG9ycwordmlzaWJsZSBhdCB0aGlzIGFkZHJlc3MgKGVzcGVjaWFsbHkgaW4gYSBiYW5rZWQgY29uZmlndXJhdGlvbikuIEFsc28gdGFrZQorY2FyZSB0aGF0IHRob3NlIGFsd2F5cyBwb2ludCB0byBhIHZhbGlkIGhhbmRsZXIgdGhhdCBpcyB2aXNpYmxlIChpLmUuIGRvCitub3QgdXNlIGFuIElTUiBpbiBiYW5rZWQgbWVtb3J5KS4KKworCitAc3Vic2VjdGlvbiBGbG9hdGluZyBQb2ludCAvIHdvemZwCisKK1doZW4gdXNpbmcgZmxvYXRpbmcgcG9pbnQsIHRoZSBtYXRoIGxpYnJhcnkgQGNvZGV7bGlibS5hfSBtdXN0IGJlIGxpbmtlZCB1c2luZwordGhlIEBjb2Rley1sbX0gb3B0aW9uLiBJdCBjb250YWlucyB0aGUgZmxvYXRpbmcgcm91dGluZXMgYXMgd2VsbCBhcyB2ZXJzaW9ucyBvZgordGhlIEBjb2Rle3ByaW50Zi9zY2FuZn0gZmFtaWx5IHRoYXQgc3VwcG9ydCBmbG9hdGluZyBwb2ludC4KKworVGhlIGZsb2F0aW5nIHBvaW50IHJvdXRpbmVzIGFyZSBiYXNlZCBvbiBTdGV2ZSBXb3puaWFrcyByb3V0aW5lcyBmcm9tIHRoZSA3MHMsCitzb21ld2hhdCBhZGFwdGVkIHRvIHRoZSBBQkkgb2YgQGNvZGV7dmJjY30uIFRoZXNlIGZ1bmN0aW9ucyBhcmUgc21hbGwgYW5kCityZWFzb25hYmx5IHVzYWJsZSwgYnV0IHRoZXkgZG8gbm90IGZ1bGx5IHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBvZiBDOTkuCisKK09ubHkgYSBwYXJ0IG9mIHRoZSBDIGxpYnJhcnkgZnVuY3Rpb25zIGZvciBmbG9hdGluZyBwb2ludCBpcyBpbXBsZW1lbnRlZC4gVGhlCitsaXN0IGN1cnJlbnRseSBpbmNsdWRlczoKKworQGl0ZW1pemUKK0BpdGVtIEBjb2Rle2V4cCgpfQorQGl0ZW0gQGNvZGV7cG93KCl9CitAaXRlbSBAY29kZXtsb2coKX0KK0BpdGVtIEBjb2Rle2xvZzEwKCl9CitAZW5kIGl0ZW1pemUKKworQHN1YnNlY3Rpb24gRmxvYXRpbmcgUG9pbnQgLyBJRUVFCisKK1doZW4gdXNpbmcgSUVFRSBmbG9hdGluZyBwb2ludCwgQGNvZGV7LWllZWV9IG11c3QgYmUgc3BlY2lmaWVkIGFuZCB0aGUgbWF0aCBsaWJyYXJ5CitAY29kZXtsaWJtaWVlZS5hfSBtdXN0IGJlIGxpbmtlZCB1c2luZwordGhlIEBjb2Rley1sbWllZWV9IG9wdGlvbi4gSXQgY29udGFpbnMgdGhlIGZsb2F0aW5nIHJvdXRpbmVzIGFzIHdlbGwgYXMgdmVyc2lvbnMgb2YKK3RoZSBAY29kZXtwcmludGYvc2NhbmZ9IGZhbWlseSB0aGF0IHN1cHBvcnQgZmxvYXRpbmcgcG9pbnQuCisKK1RoZSBmbG9hdGluZyBwb2ludCByb3V0aW5lcyBhcmUgYmFzZWQgb24gU0FORSwKK3NvbWV3aGF0IGFkYXB0ZWQgdG8gdGhlIEFCSSBvZiBAY29kZXt2YmNjfSB1c2luZyB3cmFwcGVyIGZ1bmN0aW9ucy4KK1RoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgZnVsbHkgQyBhbmQgSUVFRSBjb21wbGlhbnQgYW5kIHByb3ZpZGUgcHJlY2lzZSByZXN1bHRzIGZvcgorMzIgYW5kIDY0Yml0IGZsb2F0aW5nIHBvaW50IG51bWJlcnMgKHRoZSBsaWJyYXJ5IGFjdHVhbGx5IGludGVybmFsbHkgY2FsY3VsYXRlcworYWxsIG9wZXJhdGlvbiB1c2luZyA4MGJpdHMsIGJ1dCB2YmNjIGN1cnJlbnRseSBvbmx5IHVzZXMgdXAgdG8gNjQgYml0cykuCisKK0N1cnJlbnRseSwgdGhpcyBsaWJyYXJ5IHByb2JhYmx5IG11c3QgYmUgcnVuIGZyb20gUkFNLgorCitNb3N0IHBhcnRzIG9mIHRoZSBDIGxpYnJhcnkgZnVuY3Rpb25zIGZvciBmbG9hdGluZyBwb2ludCBhcmUgaW1wbGVtZW50ZWQuIFRoZQorbGlzdCBjdXJyZW50bHkgaW5jbHVkZXM6CisKK0BpdGVtaXplCitAaXRlbSBAY29kZXtleHAoKSwgZXhwZigpLCBleHBsKCl9CitAaXRlbSBAY29kZXtleHAyKCksIGV4cDJmKCksIGV4cDJsKCl9CitAaXRlbSBAY29kZXtleHAxbSgpLCBleHAxbWYoKSwgZXhwMW1sKCl9CitAaXRlbSBAY29kZXtwb3coKSwgcG93ZigpLCBwb3dsKCl9CitAaXRlbSBAY29kZXtsb2coKSwgbG9nZigpLCBsb2dsKCl9CitAaXRlbSBAY29kZXtsb2cxcCgpLCBsb2cxcGYoKSwgbG9nMXBsKCl9CitAaXRlbSBAY29kZXtsb2cyKCksIGxvZzJmKCksIGxvZzJsKCl9CitAaXRlbSBAY29kZXtsb2cxMCgpLCBsb2cxMGYoKSwgbG9nMTBsKCl9CitAaXRlbSBAY29kZXtzcXJ0KCksIHNxcnRmKCksIHNxcnRsKCl9CitAaXRlbSBAY29kZXtzaW4oKSwgc2luZigpLCBzaW5sKCl9CitAaXRlbSBAY29kZXtjb3MoKSwgY29zZigpLCBjb3NsKCl9CitAaXRlbSBAY29kZXt0YW4oKSwgdGFuZigpLCB0YW5sKCl9CitAaXRlbSBAY29kZXthdGFuKCksIGF0YW5mKCksIGF0YW5sKCl9CisKKworQGVuZCBpdGVtaXplCisKK0BzZWN0aW9uIDY1MDIvWDE2CisKK1RoaXMgaXMgYSBwb3J0IG9mIHZjbGliIHRvIHRoZSBDb21tYW5kZXIgWDE2LgorCisKK0BzdWJzZWN0aW9uIFN0YXJ0dXAgYW5kIE1lbW9yeQorCitTdGFydHVwIGFuZCBtZW1vcnkgbGF5b3V0IGlzIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHBhcmFncmFwaHMuCisKK0BzdWJzdWJzZWN0aW9uIFN0YXJ0dXAKKworVGhlIGRlZmF1bHQgbGlua2VyIGZpbGUgY3JlYXRlcyBwcm9ncmFtIGZpbGVzIHRoYXQgYXJlIGxvYWRlZCB0byBhZGRyZXNzCisweDgwMS4gQSBCQVNJQyBsaW5lIGlzIGluY2x1ZGVkIHNvIHRoYXQgdGhlIHByb2dyYW0gY2FuIGJlIHN0YXJ0ZWQgdXNpbmcgQGNvZGV7UlVOfQorZnJvbSBCQVNJQy4gVGhlIHN0YXJ0dXAgY29kZQord2lsbCB0dXJuIG9mZiB0aGUgQkFTSUMgUk9NIHRvIGFsbG93IHVzYWdlIG9mIFJBTSB1bnRpbCAweDlGMDAgYW5kIG1vc3Qgb2YgdGhlCit6ZXJvIHBhZ2Ugd2l0aG91dCBuZWVkIGZvciBhbnkgc3BlY2lhbCBoYW5kbGluZy4gVGhlIEJTUyBzZWdtZW50IHdpbGwgYmUgY2xlYXJlZAorZHVyaW5nIHN0YXJ0dXAuCisKK1dpdGggdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwgYWZ0ZXIgZXhpdGluZyB0aGUgQyBwcm9ncmFtLCBhbiBpbmZpbml0ZSBsb29wIHdpbGwKK2JlIGVudGVyZWQuIFdoZW4gdXNpbmcgdGhlIEBjb2Rleyt4MTZyfSBjb25maWcsIHRoZSBwcm9ncmFtIHdpbGwgcmV0dXJuIHRvIEJBU0lDCithbiBjYW4gYmUgc3RhcnRlZCBhZ2Fpbi4KK0hvd2V2ZXIsIHRoaXMgbmVlZHMgYWRkaXRpb25hbCBtZW1vcnkgYXMgdGhlIGluaXQgdmFsdWVzIGZvciB0aGUgZGF0YSBzZWN0aW9uIGhhdmUKK3RvIGJlIHN0b3JlZCBpbiBSQU0uIEFsc28sIHNvbWUgcmVnaXN0ZXIgdmFsdWVzIGFuZCB6ZXJvIHBhZ2UgY29udGVudHMgaGF2ZSB0byBiZQorc2F2ZWQuIFRoZSBvdmVyaGVhZCBkZXBlbmRzIG9uIHRoZSBhbW91bnQgb2YgaW5pdGlhbGl6ZWQgdmFyaWFibGVzLgorCitAc3Vic3Vic2VjdGlvbiBDb21tYW5kIGxpbmUKKworQ29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgYXJlIHN1cHBvcnRlZCBieSB1c2luZyB0aGUgY29udmVudGlvbi9jb2RlIHN1Ym1pdHRlZCBieQorU3RlZmFuIEhhdWJlbnRoYWwuIAorCitDb21tYW5kLWxpbmVzIGxvb2sgbGlrZSB0aGVzZSBsaW5lczoKKworQGV4YW1wbGUKKyAgIHJ1bgorICAgcnVuIDogcmVtCisgICBydW46cmVtIGFyZzEgIiBhcmcgMiBpcyBxdW90ZWQgIiAgYXJnMyAiIiBhcmc1CitAZW5kIGV4YW1wbGUKKworCisKK0BzdWJzdWJzZWN0aW9uIFplcm8gUGFnZQorCitAY29kZXt2YmNjfSB1c2VzIGEgbnVtYmVyIG9mIHplcm8gcGFnZSBsb2NhdGlvbnMgZm9yIHJlZ2lzdGVyIHZhcmlhYmxlcywgc3RhY2sKK3BvaW50ZXIgZXRjLiBpbiBzZWN0aW9uIEBjb2Rle3pwYWdlfS4gQWxzbywgdmFyaWFibGVzIGNhbiBiZSBtYXBwZWQgdG8gemVybyBwYWdlIHVzaW5nCit0aGUgQGNvZGV7X196cGFnZX0gYXR0cmlidXRlLiBCeSBkZWZhdWx0IHRoZSBhcmVhIEBjb2RlezB4MDIuLjB4N2V9CitpcyB1c2VkLCBidXQgdGhpcyBjYW4gYmUgY2hhbmdlZCBpbiB0aGUgbGlua2VyIGZpbGUuCisKK0BzdWJzdWJzZWN0aW9uIFN0YWNrCisKK0J5IGRlZmF1bHQsIHRoZSB1c2VyIHN0YWNrIGlzIG1hcHBlZCBmcm9tIEBjb2RlezB4OTcwMC4uMHg5RjAwfS4gVGhlIHNpemUgY2FuIGJlCitjaGFuZ2VkIGF0IHRoZSB0b3Agb2YgQGNvZGV7dmxpbmsuY21kfS4KKworQHN1YnN1YnNlY3Rpb24gSGVhcAorCitDb2RlIGFuZCBkYXRhL0JTUyBhcmUgbWFwcGVkIHN0YXJ0aW5nIGFmdGVyIHRoZSBCQVNJQyBpbml0IGxpbmUuCitUaGUgaGVhcCBpcyBwbGFjZWQgaW4gdGhlIHJlbWFpbmluZyBzcGFjZSB0byBzdGFjayBzdGFydC4KKworQHN1YnN1YnNlY3Rpb24gQmFua2luZworCitCYW5raW5nIHN1cHBvcnQgZm9yIHRoaXMgdGFyZ2V0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisKKworQHN1YnNlY3Rpb24gUnVudGltZQorCitBcGFydCBmcm9tIHN0YW5kYXJkIEMgbGlicmFyeSBmdW5jdGlvbnMsIEBjb2Rle2xpYnZjLmF9IGFsc28gcHJvdmlkZXMgYSBmZXcKK3J1bnRpbWUgc3VwcG9ydCBmdW5jdGlvbnMgbmVlZGVkIGJ5IHRoZSBjb21waWxlci4gQXBhcnQgZnJvbSB0aGUgbWF0aCBhbmQKK2Zsb2F0aW5nIHBvaW50IGZ1bmN0aW9ucyBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIDY1MDIgYmFja2VuZCwKK2l0IGluY2x1ZGVzIGZ1bmN0aW9ucyBmb3Igc2F2aW5nL3Jlc3RvcmluZyByZWdpc3RlcnMuCisKK0BzdWJzZWN0aW9uIEBjb2Rle3N0ZGlvfQorCitBdCB0aGUgbW9tZW50LCBzdGRpbyBvbmx5IHN1cHBvcnRzIEBjb2Rle3N0ZG91dH0sIEBjb2Rle3N0ZGVycn0gKGJvdGggdXNpbmcgdGhlCitzY3JlZW4pIGFuZCBAY29kZXtzdGRpbn0gKGtleWJvYXJkKS4gQm90aCBhcmUgdW5idWZmZXJlZCBieSBkZWZhdWx0LgorCitAY29kZXtwcmludGYvc2NhbmZ9IGZ1bmN0aW9ucyB3aGljaCBzdXBwb3J0IGZsb2F0aW5nIHBvaW50IGFyZSBjb250YWluZWQgaW4KK3RoZSBtYXRoIGxpYnJhcnkgb25seS4KKworCitAc3Vic2VjdGlvbiBGbG9hdGluZyBQb2ludCAvIHdvemZwCisKK1doZW4gdXNpbmcgZmxvYXRpbmcgcG9pbnQsIHRoZSBtYXRoIGxpYnJhcnkgQGNvZGV7bGlibS5hfSBtdXN0IGJlIGxpbmtlZCB1c2luZwordGhlIEBjb2Rley1sbX0gb3B0aW9uLiBJdCBjb250YWlucyB0aGUgZmxvYXRpbmcgcm91dGluZXMgYXMgd2VsbCBhcyB2ZXJzaW9ucyBvZgordGhlIEBjb2Rle3ByaW50Zi9zY2FuZn0gZmFtaWx5IHRoYXQgc3VwcG9ydCBmbG9hdGluZyBwb2ludC4KKworVGhlIGZsb2F0aW5nIHBvaW50IHJvdXRpbmVzIGFyZSBiYXNlZCBvbiBTdGV2ZSBXb3puaWFrcyByb3V0aW5lcyBmcm9tIHRoZSA3MHMsCitzb21ld2hhdCBhZGFwdGVkIHRvIHRoZSBBQkkgb2YgQGNvZGV7dmJjY30uIFRoZXNlIGZ1bmN0aW9ucyBhcmUgc21hbGwgYW5kCityZWFzb25hYmx5IHVzYWJsZSwgYnV0IHRoZXkgZG8gbm90IGZ1bGx5IHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBvZiBDOTkuCisKK09ubHkgYSBwYXJ0IG9mIHRoZSBDIGxpYnJhcnkgZnVuY3Rpb25zIGZvciBmbG9hdGluZyBwb2ludCBpcyBpbXBsZW1lbnRlZC4gVGhlCitsaXN0IGN1cnJlbnRseSBpbmNsdWRlczoKKworQGl0ZW1pemUKK0BpdGVtIEBjb2Rle2V4cCgpfQorQGl0ZW0gQGNvZGV7cG93KCl9CitAaXRlbSBAY29kZXtsb2coKX0KK0BpdGVtIEBjb2Rle2xvZzEwKCl9CitAZW5kIGl0ZW1pemUKKworQHN1YnNlY3Rpb24gRmxvYXRpbmcgUG9pbnQgLyBJRUVFCisKK1doZW4gdXNpbmcgSUVFRSBmbG9hdGluZyBwb2ludCwgQGNvZGV7LWllZWV9IG11c3QgYmUgc3BlY2lmaWVkIGFuZCB0aGUgbWF0aCBsaWJyYXJ5CitAY29kZXtsaWJtaWVlZS5hfSBtdXN0IGJlIGxpbmtlZCB1c2luZwordGhlIEBjb2Rley1sbWllZWV9IG9wdGlvbi4gSXQgY29udGFpbnMgdGhlIGZsb2F0aW5nIHJvdXRpbmVzIGFzIHdlbGwgYXMgdmVyc2lvbnMgb2YKK3RoZSBAY29kZXtwcmludGYvc2NhbmZ9IGZhbWlseSB0aGF0IHN1cHBvcnQgZmxvYXRpbmcgcG9pbnQuCisKK1RoZSBmbG9hdGluZyBwb2ludCByb3V0aW5lcyBhcmUgYmFzZWQgb24gU0FORSwKK3NvbWV3aGF0IGFkYXB0ZWQgdG8gdGhlIEFCSSBvZiBAY29kZXt2YmNjfSB1c2luZyB3cmFwcGVyIGZ1bmN0aW9ucy4KK1RoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgZnVsbHkgQyBhbmQgSUVFRSBjb21wbGlhbnQgYW5kIHByb3ZpZGUgcHJlY2lzZSByZXN1bHRzIGZvcgorMzIgYW5kIDY0Yml0IGZsb2F0aW5nIHBvaW50IG51bWJlcnMgKHRoZSBsaWJyYXJ5IGFjdHVhbGx5IGludGVybmFsbHkgY2FsY3VsYXRlcworYWxsIG9wZXJhdGlvbiB1c2luZyA4MGJpdHMsIGJ1dCB2YmNjIGN1cnJlbnRseSBvbmx5IHVzZXMgdXAgdG8gNjQgYml0cykuCisKK0N1cnJlbnRseSwgdGhpcyBsaWJyYXJ5IHByb2JhYmx5IG11c3QgYmUgcnVuIGZyb20gUkFNLgorCitNb3N0IHBhcnRzIG9mIHRoZSBDIGxpYnJhcnkgZnVuY3Rpb25zIGZvciBmbG9hdGluZyBwb2ludCBhcmUgaW1wbGVtZW50ZWQuIFRoZQorbGlzdCBjdXJyZW50bHkgaW5jbHVkZXM6CisKK0BpdGVtaXplCitAaXRlbSBAY29kZXtleHAoKSwgZXhwZigpLCBleHBsKCl9CitAaXRlbSBAY29kZXtleHAyKCksIGV4cDJmKCksIGV4cDJsKCl9CitAaXRlbSBAY29kZXtleHAxbSgpLCBleHAxbWYoKSwgZXhwMW1sKCl9CitAaXRlbSBAY29kZXtwb3coKSwgcG93ZigpLCBwb3dsKCl9CitAaXRlbSBAY29kZXtsb2coKSwgbG9nZigpLCBsb2dsKCl9CitAaXRlbSBAY29kZXtsb2cxcCgpLCBsb2cxcGYoKSwgbG9nMXBsKCl9CitAaXRlbSBAY29kZXtsb2cyKCksIGxvZzJmKCksIGxvZzJsKCl9CitAaXRlbSBAY29kZXtsb2cxMCgpLCBsb2cxMGYoKSwgbG9nMTBsKCl9CitAaXRlbSBAY29kZXtzcXJ0KCksIHNxcnRmKCksIHNxcnRsKCl9CitAaXRlbSBAY29kZXtzaW4oKSwgc2luZigpLCBzaW5sKCl9CitAaXRlbSBAY29kZXtjb3MoKSwgY29zZigpLCBjb3NsKCl9CitAaXRlbSBAY29kZXt0YW4oKSwgdGFuZigpLCB0YW5sKCl9CitAaXRlbSBAY29kZXthdGFuKCksIGF0YW5mKCksIGF0YW5sKCl9CisKKworQGVuZCBpdGVtaXplCisKK0BzZWN0aW9uIDY1MDIvUEVUCisKK1RoaXMgaXMgYSBwb3J0IG9mIHZjbGliIHRvIHRoZSBDQk0gUEVUIHNlcmllcyBvZiBjb21wdXRlcnMuCisKK0BzdWJzZWN0aW9uIFN0YXJ0dXAgYW5kIE1lbW9yeQorCitTdGFydHVwIGFuZCBtZW1vcnkgbGF5b3V0IGlzIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHBhcmFncmFwaHMuCisKK0BzdWJzdWJzZWN0aW9uIFN0YXJ0dXAKKworVGhlIGRlZmF1bHQgbGlua2VyIGZpbGUgY3JlYXRlcyBwcm9ncmFtIGZpbGVzIHRoYXQgYXJlIGxvYWRlZCB0byBhZGRyZXNzCisweDQwMS4gQSBCQVNJQyBsaW5lIGlzIGluY2x1ZGVkIHNvIHRoYXQgdGhlIHByb2dyYW0gY2FuIGJlIHN0YXJ0ZWQgdXNpbmcgQGNvZGV7UlVOfQorZnJvbSBCQVNJQy4gUkFNIGlzIGF2YWlsYWJsZSB1bnRpbCAweDdGRkYgYW5kIG1vc3Qgb2YgdGhlCit6ZXJvIHBhZ2Ugd2l0aG91dCBuZWVkIGZvciBhbnkgc3BlY2lhbCBoYW5kbGluZy4gVGhlIEJTUyBzZWdtZW50IHdpbGwgYmUgY2xlYXJlZAorZHVyaW5nIHN0YXJ0dXAuCisKK1dpdGggdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwgYWZ0ZXIgZXhpdGluZyB0aGUgQyBwcm9ncmFtLCBhbiBpbmZpbml0ZSBsb29wIHdpbGwKK2JlIGVudGVyZWQuIFdoZW4gdXNpbmcgdGhlIEBjb2RleytwZXRyfSBjb25maWcsIHRoZSBwcm9ncmFtIHdpbGwgcmV0dXJuIHRvIEJBU0lDCithbiBjYW4gYmUgc3RhcnRlZCBhZ2Fpbi4KK0hvd2V2ZXIsIHRoaXMgbmVlZHMgYWRkaXRpb25hbCBtZW1vcnkgYXMgdGhlIGluaXQgdmFsdWVzIGZvciB0aGUgZGF0YSBzZWN0aW9uIGhhdmUKK3RvIGJlIHN0b3JlZCBpbiBSQU0uIEFsc28sIHNvbWUgcmVnaXN0ZXIgdmFsdWVzIGFuZCB6ZXJvIHBhZ2UgY29udGVudHMgaGF2ZSB0byBiZQorc2F2ZWQuIFRoZSBvdmVyaGVhZCBkZXBlbmRzIG9uIHRoZSBhbW91bnQgb2YgaW5pdGlhbGl6ZWQgdmFyaWFibGVzLgorCitAc3Vic3Vic2VjdGlvbiBDb21tYW5kIGxpbmUKKworQ29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgYXJlIHN1cHBvcnRlZCBieSB1c2luZyB0aGUgY29udmVudGlvbi9jb2RlIHN1Ym1pdHRlZCBieQorU3RlZmFuIEhhdWJlbnRoYWwuIAorCitDb21tYW5kLWxpbmVzIGxvb2sgbGlrZSB0aGVzZSBsaW5lczoKKworQGV4YW1wbGUKKyAgIHJ1bgorICAgcnVuIDogcmVtCisgICBydW46cmVtIGFyZzEgIiBhcmcgMiBpcyBxdW90ZWQgIiAgYXJnMyAiIiBhcmc1CitAZW5kIGV4YW1wbGUKKworCisKK0BzdWJzdWJzZWN0aW9uIFplcm8gUGFnZQorCitAY29kZXt2YmNjfSB1c2VzIGEgbnVtYmVyIG9mIHplcm8gcGFnZSBsb2NhdGlvbnMgZm9yIHJlZ2lzdGVyIHZhcmlhYmxlcywgc3RhY2sKK3BvaW50ZXIgZXRjLiBpbiBzZWN0aW9uIEBjb2Rle3pwYWdlfS4gQWxzbywgdmFyaWFibGVzIGNhbiBiZSBtYXBwZWQgdG8gemVybyBwYWdlIHVzaW5nCit0aGUgQGNvZGV7X196cGFnZX0gYXR0cmlidXRlLiBCeSBkZWZhdWx0IHRoZSBhcmVhIEBjb2RlezB4MDIuLjB4OGR9CitpcyB1c2VkLCBidXQgdGhpcyBjYW4gYmUgY2hhbmdlZCBpbiB0aGUgbGlua2VyIGZpbGUuCisKK0BzdWJzdWJzZWN0aW9uIFN0YWNrCisKK0J5IGRlZmF1bHQsIHRoZSB1c2VyIHN0YWNrIGlzIG1hcHBlZCBmcm9tIEBjb2RlezB4N0YwMC4uMHg3RkZGfS4gVGhlIHNpemUgY2FuIGJlCitjaGFuZ2VkIGF0IHRoZSB0b3Agb2YgQGNvZGV7dmxpbmsuY21kfS4KKworQHN1YnN1YnNlY3Rpb24gSGVhcAorCitDb2RlIGFuZCBkYXRhL0JTUyBhcmUgbWFwcGVkIHN0YXJ0aW5nIGFmdGVyIHRoZSBCQVNJQyBpbml0IGxpbmUuCitUaGUgaGVhcCBpcyBwbGFjZWQgaW4gdGhlIHJlbWFpbmluZyBzcGFjZSB0byBzdGFjayBzdGFydC4KKworQHN1YnN1YnNlY3Rpb24gQmFua2luZworCitBdXRvbWF0ZWQgYmFua2luZyBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC4KKworCitAc3Vic2VjdGlvbiBSdW50aW1lCisKK0FwYXJ0IGZyb20gc3RhbmRhcmQgQyBsaWJyYXJ5IGZ1bmN0aW9ucywgQGNvZGV7bGlidmMuYX0gYWxzbyBwcm92aWRlcyBhIGZldworcnVudGltZSBzdXBwb3J0IGZ1bmN0aW9ucyBuZWVkZWQgYnkgdGhlIGNvbXBpbGVyLiBBcGFydCBmcm9tIHRoZSBtYXRoIGFuZAorZmxvYXRpbmcgcG9pbnQgZnVuY3Rpb25zIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgNjUwMiBiYWNrZW5kLAoraXQgaW5jbHVkZXMgZnVuY3Rpb25zIGZvciBzYXZpbmcvcmVzdG9yaW5nIHJlZ2lzdGVycy4KKworQHN1YnNlY3Rpb24gQGNvZGV7c3RkaW99CisKK0F0IHRoZSBtb21lbnQsIHN0ZGlvIG9ubHkgc3VwcG9ydHMgQGNvZGV7c3Rkb3V0fSwgQGNvZGV7c3RkZXJyfSAoYm90aCB1c2luZyB0aGUKK3NjcmVlbikgYW5kIEBjb2Rle3N0ZGlufSAoa2V5Ym9hcmQpLiBCb3RoIGFyZSB1bmJ1ZmZlcmVkIGJ5IGRlZmF1bHQuCisKK0Bjb2Rle3ByaW50Zi9zY2FuZn0gZnVuY3Rpb25zIHdoaWNoIHN1cHBvcnQgZmxvYXRpbmcgcG9pbnQgYXJlIGNvbnRhaW5lZCBpbgordGhlIG1hdGggbGlicmFyeSBvbmx5LgorCisKK0BzdWJzZWN0aW9uIEZsb2F0aW5nIFBvaW50IC8gd296ZnAKKworV2hlbiB1c2luZyBmbG9hdGluZyBwb2ludCwgdGhlIG1hdGggbGlicmFyeSBAY29kZXtsaWJtLmF9IG11c3QgYmUgbGlua2VkIHVzaW5nCit0aGUgQGNvZGV7LWxtfSBvcHRpb24uIEl0IGNvbnRhaW5zIHRoZSBmbG9hdGluZyByb3V0aW5lcyBhcyB3ZWxsIGFzIHZlcnNpb25zIG9mCit0aGUgQGNvZGV7cHJpbnRmL3NjYW5mfSBmYW1pbHkgdGhhdCBzdXBwb3J0IGZsb2F0aW5nIHBvaW50LgorCitUaGUgZmxvYXRpbmcgcG9pbnQgcm91dGluZXMgYXJlIGJhc2VkIG9uIFN0ZXZlIFdvem5pYWtzIHJvdXRpbmVzIGZyb20gdGhlIDcwcywKK3NvbWV3aGF0IGFkYXB0ZWQgdG8gdGhlIEFCSSBvZiBAY29kZXt2YmNjfS4gVGhlc2UgZnVuY3Rpb25zIGFyZSBzbWFsbCBhbmQKK3JlYXNvbmFibHkgdXNhYmxlLCBidXQgdGhleSBkbyBub3QgZnVsbHkgc2F0aXNmeSB0aGUgcmVxdWlyZW1lbnRzIG9mIEM5OS4KKworT25seSBhIHBhcnQgb2YgdGhlIEMgbGlicmFyeSBmdW5jdGlvbnMgZm9yIGZsb2F0aW5nIHBvaW50IGlzIGltcGxlbWVudGVkLiBUaGUKK2xpc3QgY3VycmVudGx5IGluY2x1ZGVzOgorCitAaXRlbWl6ZQorQGl0ZW0gQGNvZGV7ZXhwKCl9CitAaXRlbSBAY29kZXtwb3coKX0KK0BpdGVtIEBjb2Rle2xvZygpfQorQGl0ZW0gQGNvZGV7bG9nMTAoKX0KK0BlbmQgaXRlbWl6ZQorCitAc3Vic2VjdGlvbiBGbG9hdGluZyBQb2ludCAvIElFRUUKKworV2hlbiB1c2luZyBJRUVFIGZsb2F0aW5nIHBvaW50LCBAY29kZXstaWVlZX0gbXVzdCBiZSBzcGVjaWZpZWQgYW5kIHRoZSBtYXRoIGxpYnJhcnkKK0Bjb2Rle2xpYm1pZWVlLmF9IG11c3QgYmUgbGlua2VkIHVzaW5nCit0aGUgQGNvZGV7LWxtaWVlZX0gb3B0aW9uLiBJdCBjb250YWlucyB0aGUgZmxvYXRpbmcgcm91dGluZXMgYXMgd2VsbCBhcyB2ZXJzaW9ucyBvZgordGhlIEBjb2Rle3ByaW50Zi9zY2FuZn0gZmFtaWx5IHRoYXQgc3VwcG9ydCBmbG9hdGluZyBwb2ludC4KKworVGhlIGZsb2F0aW5nIHBvaW50IHJvdXRpbmVzIGFyZSBiYXNlZCBvbiBTQU5FLAorc29tZXdoYXQgYWRhcHRlZCB0byB0aGUgQUJJIG9mIEBjb2Rle3ZiY2N9IHVzaW5nIHdyYXBwZXIgZnVuY3Rpb25zLgorVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBiZSBmdWxseSBDIGFuZCBJRUVFIGNvbXBsaWFudCBhbmQgcHJvdmlkZSBwcmVjaXNlIHJlc3VsdHMgZm9yCiszMiBhbmQgNjRiaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyAodGhlIGxpYnJhcnkgYWN0dWFsbHkgaW50ZXJuYWxseSBjYWxjdWxhdGVzCithbGwgb3BlcmF0aW9uIHVzaW5nIDgwYml0cywgYnV0IHZiY2MgY3VycmVudGx5IG9ubHkgdXNlcyB1cCB0byA2NCBiaXRzKS4KKworQ3VycmVudGx5LCB0aGlzIGxpYnJhcnkgcHJvYmFibHkgbXVzdCBiZSBydW4gZnJvbSBSQU0uCisKK01vc3QgcGFydHMgb2YgdGhlIEMgbGlicmFyeSBmdW5jdGlvbnMgZm9yIGZsb2F0aW5nIHBvaW50IGFyZSBpbXBsZW1lbnRlZC4gVGhlCitsaXN0IGN1cnJlbnRseSBpbmNsdWRlczoKKworQGl0ZW1pemUKK0BpdGVtIEBjb2Rle2V4cCgpLCBleHBmKCksIGV4cGwoKX0KK0BpdGVtIEBjb2Rle2V4cDIoKSwgZXhwMmYoKSwgZXhwMmwoKX0KK0BpdGVtIEBjb2Rle2V4cDFtKCksIGV4cDFtZigpLCBleHAxbWwoKX0KK0BpdGVtIEBjb2Rle3BvdygpLCBwb3dmKCksIHBvd2woKX0KK0BpdGVtIEBjb2Rle2xvZygpLCBsb2dmKCksIGxvZ2woKX0KK0BpdGVtIEBjb2Rle2xvZzFwKCksIGxvZzFwZigpLCBsb2cxcGwoKX0KK0BpdGVtIEBjb2Rle2xvZzIoKSwgbG9nMmYoKSwgbG9nMmwoKX0KK0BpdGVtIEBjb2Rle2xvZzEwKCksIGxvZzEwZigpLCBsb2cxMGwoKX0KK0BpdGVtIEBjb2Rle3NxcnQoKSwgc3FydGYoKSwgc3FydGwoKX0KK0BpdGVtIEBjb2Rle3NpbigpLCBzaW5mKCksIHNpbmwoKX0KK0BpdGVtIEBjb2Rle2NvcygpLCBjb3NmKCksIGNvc2woKX0KK0BpdGVtIEBjb2Rle3RhbigpLCB0YW5mKCksIHRhbmwoKX0KK0BpdGVtIEBjb2Rle2F0YW4oKSwgYXRhbmYoKSwgYXRhbmwoKX0KKworCitAZW5kIGl0ZW1pemUKZGlmZiAtLWdpdCBhL2RvYy92Y3ByLnRleGkgYi9kb2MvdmNwci50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJhZTE5NDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdmNwci50ZXhpCkBAIC0wLDAgKzEsMTkyIEBACit2Y3ByIC0gY29kZSBjb21wcmVzc29yIGZvciB2YmNjIChjKSBpbiAyMDIwIGJ5IFZvbGtlciBCYXJ0aGVsbWFubgorCisKK0BzZWN0aW9uIEludHJvZHVjdGlvbgorCisgICAgdmNwciBpcyBhIGNvZGUgY29tcHJlc3NvciB3aGljaCBzY2FucyB0aGUgYXNzZW1ibHkgb3V0cHV0IG9mCisgICAgdmJjYyBhbmQgdHJpZXMgdG8gcmVkdWNlIGNvZGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUgYnkKKyAgICBtb3ZpbmcgY29tbW9uIGNvZGUgc2VxdWVuY2VzIGludG8gc2VwYXJhdGUgc3Vicm91dGluZXMuIEFzIGEKKyAgICB0cmFkZS1vZmYsIHRoZSBjb2RlIHdpbGwgdXN1YWxseSBydW4gc2xvd2VyLgorCisgICAgTGlrZSB0aGUgY29tcGlsZXIgdmJjYyBpdCBpcyBzcGxpdCBpbnRvIGEgdGFyZ2V0IGluZGVwZW5kZW50IGFuZCBhCisgICAgdGFyZ2V0IGRlcGVuZGVudCBwYXJ0LiBIb3dldmVyIHRoZXJlIG1heSBiZSBjb2RlLWdlbmVyYXRvcnMgZm9yIHZiY2MKKyAgICB3aGljaCBkbyBub3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgY29tcHJlc3Nvci4KKworICAgIFRoaXMgZG9jdW1lbnQgb25seSBkZWFscyB3aXRoIHRoZSB0YXJnZXQgaW5kZXBlbmRlbnQgcGFydHMgb2YgdmNwci4KKyAgICBCZSBzdXJlIHRvIHJlYWQgYWxsIHRoZSBkb2N1bWVudHMgZm9yIHlvdXIgbWFjaGluZS4KKworCitAc2VjdGlvbiBVc2FnZQorCisgICAgVXN1YWxseSBAY29tbWFuZHt2Y3ByfSB3aWxsIGJlIGNhbGxlZCBieSBhIGZyb250ZW5kLiBIb3dldmVyIGlmIHlvdSBjYWxsIGl0CisgICAgZGlyZWN0bHksIGl0IGhhcyB0byBiZSBkb25lIGxpa2UgdGhpczoKKworQGV4YW1wbGUKKyAgICB2Y3ByIFtvcHRpb25zXSBpbnB1dC1maWxlIG91dHB1dC1maWxlCitAZW5kIGV4YW1wbGUKKworICAgIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgc3VwcG9ydGVkOgorCitAdGFibGUgQG9wdGlvbgorICAgIEBpdGVtIC1xdWlldAorICAgICAgICAgICAgICAgICAgICAgIERvIG5vdCBwcmludCB0aGUgY29weXJpZ2h0IG5vdGljZS4KKworICAgIEBpdGVtIC1kZWJ1Zz08bj4KKyAgICAgICAgICAgICAgICAgIFNldCBkZWJ1Zy1sZXZlbCB0byA8bj4uCitAZW5kIHRhYmxlCisKKworICAgIE5vdGUgdGhhdCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldCBAY29tbWFuZHt2YmNjfSBtYXkgaW5zZXJ0IGhpbnRzIGludG8gdGhlCisgICAgZ2VuZXJhdGVkIGNvZGUuIEFzc2VtYmx5IGNvZGUgdGhhdCB3YXMgbm90IGdlbmVyYXRlZCBieSBAY29tbWFuZHt2YmNjfQorICAgIG1heSBub3Qgd29yayBjb3JyZWN0bHkgYWZ0ZXIgcnVubmluZyBpdCB0aHJvdWdoIEBjb21tYW5ke3ZjcHJ9LgorCisKK0BzZWN0aW9uIEtub3duIHByb2JsZW1zCisKK0BpdGVtaXplIEBtaW51cworICAgIEBpdGVtIHN0aWxsIGluIGVhcmx5IGRldmVsb3BtZW50CitAZW5kIGl0ZW1pemUKKworQHNlY3Rpb24gQmFja2VuZCBJbnRlcmZhY2UKKworQHN1YnNlY3Rpb24gQnVpbGRpbmcgQGNvZGV7dmNwcn0KKworVG8gd3JpdGUgYSBiYWNrZW5kIGZvciBAY29kZXt2Y3ByfSwgdGhlIGZpbGUgQGNvZGV7Y29tcHJlc3MuY30gaGFzIHRvIGJlIGNyZWF0ZWQKK2luIHRoZSBtYWNoaW5lIHN1YmRpcmVjdG9yeS4gVGhlIGV4ZWN1dGFibGUgQGNvZGV7dmNwcjx0YXJnZXQ+fSBjYW4gYmUgYnVpbHQKK3VzaW5nOgorCitAZXhhbXBsZQorICAgIG1ha2UgVEFSR0VUPTx0YXJnZXQ+IGJpbi92Y3ByPHRhcmdldD4KK0BlbmQgZXhhbXBsZQorCitAc3Vic2VjdGlvbiBCYXNpYyBGdW5jdGlvbgorCitAY29kZXt2Y3ByfSBmaXJzdCByZWFkcyB0aGUgYXNzZW1ibHkgc291cmNlIGludG8gYSBsaW5rZWQgbGlzdCBvZiBsaW5lcy4gSXQgd2lsbAorY2FsbCBhIGJhY2tlbmQgZnVuY3Rpb24gZm9yIGVhY2ggbGluZSB0byBwYXJzZSB0aGUgbGluZSBhbmQgZmlsbCBpbiBuZWNlc3NhcnkKK2luZm9ybWF0aW9uLgorCitUaGUgZnJvbnRlbmQgbG9va3MgZm9yIGlkZW50aWNhbCBjb2RlIHNlcXVlbmNlcyBhbmQgY2FsY3VsYXRlcyB0aGUKK3NhdmluZ3MgdGhhdCBjYW4gYmUgb2J0YWluZWQgYnkgb3V0bGluaW5nIHRoZSBjb2RlLiBJZiBjb2RlIHNlcXVlbmNlcyBhcmUgZm91bmQKK3RoYXQgcHJvdmlkZSBlbm91Z2ggc2F2aW5ncywgdGhleSB3aWxsIGJlIG1vdmVkIHRvIHN1YnJvdXRpbmVzIHVzaW5nIGZ1bmN0aW9ucworcHJvdmlkZWQgYnkgdGhlIGJhY2tlbmQuCisKK0xpbmVzIGhhdmUgdG8gYmUgdGV4dHVhbGx5IGlkZW50aWNhbCB0byBiZSBjb25zaWRlcmVkIGZvciBvdXRsaW5pbmcuIE9uZSBleGNlcHRpb24KK2FyZSBsYWJlbHMuIFRoZSBmb2xsb3dpbmcgc2VxdWVuY2VzIGFyZSBjb25zaWRlcmVkIGVxdWFsIGFzIGxvbmcgYXMgdGhlIGxhYmVscworYXJlIG5vdCB1c2VkIGFueXdoZXJlIGVsc2U6CisKK0BleGFtcGxlCisKKyAgYQorICBibmUgbDEKKyAgYgorbDE6CisgIGMKKworICBhCisgIGJuZSBsMgorICBiCitsMjoKKyAgYworQGVuZCBleGFtcGxlCisKK0N1cnJlbnRseSwgQGNvZGV7dmNwcn0gb25seSBzdXBwb3J0cyBjb2RlIHNlcXVlbmNlcyB3aXRoIG9uZSBsYWJlbC4KKworQHN1YnNlY3Rpb24gRGF0YSBUeXBlcworCitUaGUgbWFpbiBkYXRhIHR5cGUgcmVsZXZhbnQgZm9yIHRoZSBiYWNrZW5kIHJlcHJlc2VudHMgdGhlIGF0dHJpYnV0ZWQgc291cmNlIGxpbmVzOgorCitAZXhhbXBsZQordHlwZWRlZiBzdHJ1Y3QgbGluZSBAeworICAuLi4KKyAgY2hhciAqY29kZTsKKyAgaW50IGZsYWdzOworICBpbnQgc2l6ZTsKKyAgLi4uCisgIGludCBsMSxsMjsKK0B9IGxpbmU7CitAZW5kIGV4YW1wbGUKKworVGhlIGZvbGxvd2luZyBtZW1iZXJzIGFyZSByZWxldmFudCB0byB0aGUgYmFja2VuZDoKKworQGNvZGV7Y29kZX0gcG9pbnRzIHRvIHRoZSBhc3NlbWJseSB0ZXh0IG9mIHRoZSBsaW5lLgorCitAY29kZXtzaXplfSBjb250YWlucyB0aGUgKGVzdGltYXRlZCkgc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisKK0Bjb2Rle2wxLCBsMn0gc3BlY2lmeSB1cCB0byB0d28gbGFiZWxzIHJlZmVyZW5jZWQgYnkgdGhpcyBpbnN0cnVjdGlvbi4KKworQGNvZGV7ZmxhZ3N9IHNwZWNpZmllcyB0aGUgdHlwZSBvZiBpbnN0cnVjdGlvbiBhbmQgY2FuIGJlIGEgY29tYmluYXRpb24gb2Y6CisKK0BpdGVtaXplCitAaXRlbSBAY29kZXtMQUJERUZ9OiBUaGlzIGxpbmUgZGVmaW5lcyBhIGxhYmVsLgorQGl0ZW0gQGNvZGV7TEFCVVNFfTogVGhpcyBsaW5lIHJlZmVyZW5jZXMgYSBsYWJlbC4KK0BpdGVtIEBjb2Rle0JBUlJJRVJ9OiBUaGlzIGxpbmUgbXVzdCBub3QgYmUgbW92ZWQgaW50byBhIHN1YnJvdXRpbmUuCitAaXRlbSBAY29kZXtMQkFSUklFUn06IFVzZWQgYnkgdGhlIGZyb250ZW5kLgorQGVuZCBpdGVtaXplCisKK0BzdWJzZWN0aW9uIEJhY2tlbmQgVmFyaWFibGVzCisKK1RoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGhhdmUgdG8gYmUgZGVmaW5lZCBhbmQgaW5pdGlhbGl6ZWQgYnkgdGhlIGJhY2tlbmQ6CisKK0BpdGVtaXplCisKK0BpdGVtIEBjb2Rle2NvbnN0IGNoYXIgdGdfY29weXJpZ2h0W119CitBIGNvcHlyaWdodCBzdHJpbmcuCisKK0BpdGVtIEBjb2Rle2ludCBtaW5zYXZlO30KK1RoZSBtaW5pbXVtIHNpemUgdW5pdHMgc2F2ZWQgYnkgb3V0bGluaW5nIGEgZnVuY3Rpb24uIFNob3VsZCBhdCBsZWFzdCBiZSBsYXJnZXIKK3RoYW4gdGhlIHNpemUgb2YgdGhlIGNvZGUgZm9yIGEgc3Vicm91dGluZSBjYWxsLgorCitAZW5kIGl0ZW1pemUKKworQHN1YnNlY3Rpb24gQmFja2VuZCBGdW5jdGlvbnMKKworVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgaGF2ZSB0byBiZSBwcm92aWRlZCBieSB0aGUgYmFja2VuZDoKKworQGl0ZW1pemUKKworQGl0ZW0gQGNvZGV7dm9pZCBwYXJzZV9saW5lKGNoYXIgKnMsbGluZSAqcCk7fQorCitUaGlzIGZ1bmN0aW9uIHBhcnNlcyBhc3NlbWJseSBsaW5lIEBjb2Rle3N9IGFuZCBoYXMgdG8gZmlsbCB0aGUKK21lbWJlcnMgQGNvZGV7ZmxhZ3N9LCBAY29kZXtsMX0sIEBjb2Rle2wyfSBhbmQgQGNvZGV7c2l6ZX0gb2YgdGhlIGxpbmUgc3RydWN0dXJlCitAY29kZXtwfS4KKworQGl0ZW0gQGNvZGV7YWRkX2hlYWRlcihsaW5lICphZnRlcik7fQorCitUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBsaW5lIGZvciB0aGUgaGVhZGVyIG9mIG91dGxpbmVkIGNvZGUgYW5kIGluc2VydHMgaXQgaW50byB0aGUKK2xpbmUgbGlzdC4KKworQGl0ZW0gQGNvZGV7YWRkX3JldChsaW5lICphZnRlcik7fQorCitUaGlzIGZ1bmN0aW9uIGFkZHMgYSByZXR1cm4gbGluZSBhbmQgaW5zZXJ0cyBpdCBpbnRvIHRoZSBsaW5lIGxpc3QuCisKK0BpdGVtIEBjb2Rle2FkZF9qc3IobGluZSAqYWZ0ZXIpO30KKworVGhpcyBmdW5jdGlvbiBhZGRzIGEgc3Vicm91dGluZSBjYWxsIHRvIHRoZSBzdWJyb3V0aW5lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxhc3QKK2NhbGwgb2YgQGNvZGV7YWRkX2hlYWRlcigpfS4KKworQGVuZCBpdGVtaXplCisKK0BzdWJzZWN0aW9uIEZyb250ZW5kIEZ1bmN0aW9ucyAKKworVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHByb3ZpZGVkIGJ5IHRoZSBmcm9udGVuZCBhbmQgY2FuIGJlIHVzZWQgYnkgdGhlCitiYWNrZW5kOgorCitAaXRlbWl6ZQorCitAaXRlbSBAY29kZXt2b2lkICpteW1hbGxvYyhzaXplX3Qgc3opO30KKworQWxsb2NhdGUgbWVtb3J5LgorCitAaXRlbSBAY29kZXtpbnQgbmV3X2xhYmVsKHZvaWQpO30KKworQ3JlYXRlIGEgbmV3IHVudXNlZCBsYWJlbCBudW1iZXIuCisKK0BpdGVtIEBjb2Rle2xpbmUgKm5ld19saW5lKHZvaWQpO30KKworQ3JlYXRlIGEgbmV3IGxpbmUuCisKK0BpdGVtIEBjb2Rle3ZvaWQgaW5zZXJ0X2xpbmUobGluZSAqYWZ0ZXIsIGxpbmUgKm5ldyk7fQorCitJbnNlcnQgYSBsaW5lIGludG8gdGhlIGxpbmUgbGlzdCBhdCBhIHNwZWNpZmllZCBwb3NpdGlvbi4KKworQGVuZCBpdGVtaXplCmRpZmYgLS1naXQgYS9kb2MvdnByb2YudGV4aSBiL2RvYy92cHJvZi50ZXhpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNDQ5YjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdnByb2YudGV4aQpAQCAtMCwwICsxLDMzIEBACisKK0lOVFJPRFVDVElPTgorCisgICAgdnByb2YgaXMgYSBwb3J0YWJsZSB1dGlsaXR5IHRvIHZpc3VhbGl6ZSB0aGUgcHJvZmlsaW5nIGluZm9ybWF0aW9uLAorICAgIHdoaWNoIGFyZSB1c3VhbGx5IHN0b3JlZCBpbiB0aGUgZmlsZSAibW9uLm91dCIuCisgICAgSXQgc2hvd3MgdGhlIHBlcmNlbnRhZ2Ugb2YgdG90YWwgdGltZSBzcGVudCBpbiBhIGZ1bmN0aW9uLCB0aGUKKyAgICB0b3RhbCB0aW1lIGluIHNlY29uZHMsIHRoZSBudW1iZXIgb2YgZnVuY3Rpb24gY2FsbHMgYW5kIHRoZSB0aW1lCisgICAgYnkgY2FsbCBpbiBtcy4KKworCitMRUdBTAorCisgICAgdnByb2YgaXMgZnJlZXdhcmUuCisKKworVVNBR0UKKworICAgIHZwcm9mIFttb24ub3V0XQorCisgICAgSWYgdGhlIHByb2ZpbGluZyBmaWxlIGhhcyBhbm90aGVyIG5hbWUgdGhhbiAibW9uLm91dCIsIHlvdSBtYXkKKyAgICBzcGVjaWZ5IGl0IGFzIGFuIGFyZ3VtZW50IHRvIHZwcm9mLgorCisgICAgU29tZSB2YmNjIGNvZGUgZ2VuZXJhdG9ycyBhcmUgYWJsZSB0byBjcmVhdGUgcHJvZmlsaW5nIGluZm9ybWF0aW9uCisgICAgYnkgY29tcGlsaW5nIHdpdGggdGhlIC1wcm9mIG9wdGlvbiAodmJjY202OGssIGZvciBleGFtcGxlKS4KKworCitCVUdTCisKKyAgICBUaGUgcGVyY2VudGFnZSBjb2x1bW4gaXMgc3RpbGwgbm90IHdvcmtpbmcgYW5kIHdpbGwgYWx3YXlzCisgICAgZGlzcGxheSAibi5hLiIuCisKKworRnJhbmsgV2lsbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbmtAcGhvZW5peC5vd2wuZGUKZGlmZiAtLWdpdCBhL2RvYy92c2MudGV4aSBiL2RvYy92c2MudGV4aQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45M2FlY2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3ZzYy50ZXhpCkBAIC0wLDAgKzEsNTIgQEAKK3ZzYyAtIHNjaGVkdWxlciBmb3IgdmJjYyAoYykgaW4gMTk5Ny05OSBieSBWb2xrZXIgQmFydGhlbG1hbm4KKworCitAc2VjdGlvbiBJbnRyb2R1Y3Rpb24KKworICAgIHZzYyBpcyBhbiBpbnN0cnVjdGlvbi1zY2hlZHVsZXIgd2hpY2ggcmVvcmRlcnMgdGhlIGFzc2VtYmx5IG91dHB1dCBvZgorICAgIHZiY2MgYW5kIHRyaWVzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugb2YgdGhlIGdlbmVyYXRlZCBjb2RlIGJ5IGF2b2lkaW5nCisgICAgcGlwZWxpbmUgc3RhbGxzIGV0Yy4KKworICAgIExpa2UgdGhlIGNvbXBpbGVyIHZiY2MgaXQgaXMgc3BsaXQgaW50byBhIHRhcmdldCBpbmRlcGVuZGVudCBhbmQgYQorICAgIHRhcmdldCBkZXBlbmRlbnQgcGFydC4gSG93ZXZlciB0aGVyZSBtYXkgYmUgY29kZS1nZW5lcmF0b3JzIGZvciB2YmNjCisgICAgd2hpY2ggZG8gbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nIHNjaGVkdWxlci4KKworICAgIFRoaXMgZG9jdW1lbnQgb25seSBkZWFscyB3aXRoIHRoZSB0YXJnZXQgaW5kZXBlbmRlbnQgcGFydHMgb2YgdnNjLgorICAgIEJlIHN1cmUgdG8gcmVhZCBhbGwgdGhlIGRvY3VtZW50cyBmb3IgeW91ciBtYWNoaW5lLgorCisKK0BzZWN0aW9uIFVzYWdlCisKKyAgICBVc3VhbGx5IEBjb21tYW5ke3ZzY30gd2lsbCBiZSBjYWxsZWQgYnkgYSBmcm9udGVuZC4gSG93ZXZlciBpZiB5b3UgY2FsbCBpdAorICAgIGRpcmVjdGx5LCBpdCBoYXMgdG8gYmUgZG9uZSBsaWtlIHRoaXM6CisKK0BleGFtcGxlCisgICAgdnNjIFtvcHRpb25zXSBpbnB1dC1maWxlIG91dHB1dC1maWxlCitAZW5kIGV4YW1wbGUKKworICAgIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgc3VwcG9ydGVkOgorCitAdGFibGUgQG9wdGlvbgorICAgIEBpdGVtIC1xdWlldAorICAgICAgICAgICAgICAgICAgICAgIERvIG5vdCBwcmludCB0aGUgY29weXJpZ2h0IG5vdGljZS4KKworICAgIEBpdGVtIC1kZWJ1Zz08bj4KKyAgICAgICAgICAgICAgICAgIFNldCBkZWJ1Zy1sZXZlbCB0byA8bj4uCitAZW5kIHRhYmxlCisKKworICAgIE5vdGUgdGhhdCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldCBAY29tbWFuZHt2YmNjfSBtYXkgaW5zZXJ0IGhpbnRzIGludG8gdGhlCisgICAgZ2VuZXJhdGVkIGNvZGUgdG8gdGVsbCB2c2Mgd2hhdCBDUFUgdG8gc2NoZWR1bGUgZm9yLiBDb2RlCisgICAgc2NoZWR1bGVkIGZvciBhIGNlcnRhaW4gQ1BVIG1heSBydW4gbXVjaCBzbG93ZXIgb24gc2xpZ2h0bHkgZGlmZmVyZW50CisgICAgQ1BVcy4gVGhlcmVmb3JlIGl0IGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IHRvIHNwZWNpZnkgdGhlIGNvcnJlY3QKKyAgICB0YXJnZXQtQ1BVIHdoZW4gY29tcGlsaW5nLgorCisKK0BzZWN0aW9uIEtub3duIHByb2JsZW1zCisKK0BpdGVtaXplIEBtaW51cworICAgIEBpdGVtIHdvcmtzIG9ubHkgb24gYmFzaWMtYmxvY2tzCitAZW5kIGl0ZW1pemUKKworCisKZGlmZiAtLWdpdCBhL2R3YXJmMi5jIGIvZHdhcmYyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgxZGViMwotLS0gL2Rldi9udWxsCisrKyBiL2R3YXJmMi5jCkBAIC0wLDAgKzEsMTI5NCBAQAorLyogICRWRVI6IHZiY2MgKGR3YXJmMi5jKSAkUmV2aXNpb246IDEuNSAkICAgICAqLworCitlbnVtIGR3YXJmX3RhZworeworICBEV19UQUdfcGFkZGluZyA9IDB4MDAsCisgIERXX1RBR19hcnJheV90eXBlID0gMHgwMSwKKyAgRFdfVEFHX2NsYXNzX3R5cGUgPSAweDAyLAorICBEV19UQUdfZW50cnlfcG9pbnQgPSAweDAzLAorICBEV19UQUdfZW51bWVyYXRpb25fdHlwZSA9IDB4MDQsCisgIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyID0gMHgwNSwKKyAgRFdfVEFHX2ltcG9ydGVkX2RlY2xhcmF0aW9uID0gMHgwOCwKKyAgRFdfVEFHX2xhYmVsID0gMHgwYSwKKyAgRFdfVEFHX2xleGljYWxfYmxvY2sgPSAweDBiLAorICBEV19UQUdfbWVtYmVyID0gMHgwZCwKKyAgRFdfVEFHX3BvaW50ZXJfdHlwZSA9IDB4MGYsCisgIERXX1RBR19yZWZlcmVuY2VfdHlwZSA9IDB4MTAsCisgIERXX1RBR19jb21waWxlX3VuaXQgPSAweDExLAorICBEV19UQUdfc3RyaW5nX3R5cGUgPSAweDEyLAorICBEV19UQUdfc3RydWN0dXJlX3R5cGUgPSAweDEzLAorICBEV19UQUdfc3Vicm91dGluZV90eXBlID0gMHgxNSwKKyAgRFdfVEFHX3R5cGVkZWYgPSAweDE2LAorICBEV19UQUdfdW5pb25fdHlwZSA9IDB4MTcsCisgIERXX1RBR191bnNwZWNpZmllZF9wYXJhbWV0ZXJzID0gMHgxOCwKKyAgRFdfVEFHX3ZhcmlhbnQgPSAweDE5LAorICBEV19UQUdfY29tbW9uX2Jsb2NrID0gMHgxYSwKKyAgRFdfVEFHX2NvbW1vbl9pbmNsdXNpb24gPSAweDFiLAorICBEV19UQUdfaW5oZXJpdGFuY2UgPSAweDFjLAorICBEV19UQUdfaW5saW5lZF9zdWJyb3V0aW5lID0gMHgxZCwKKyAgRFdfVEFHX21vZHVsZSA9IDB4MWUsCisgIERXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGUgPSAweDFmLAorICBEV19UQUdfc2V0X3R5cGUgPSAweDIwLAorICBEV19UQUdfc3VicmFuZ2VfdHlwZSA9IDB4MjEsCisgIERXX1RBR193aXRoX3N0bXQgPSAweDIyLAorICBEV19UQUdfYWNjZXNzX2RlY2xhcmF0aW9uID0gMHgyMywKKyAgRFdfVEFHX2Jhc2VfdHlwZSA9IDB4MjQsCisgIERXX1RBR19jYXRjaF9ibG9jayA9IDB4MjUsCisgIERXX1RBR19jb25zdF90eXBlID0gMHgyNiwKKyAgRFdfVEFHX2NvbnN0YW50ID0gMHgyNywKKyAgRFdfVEFHX2VudW1lcmF0b3IgPSAweDI4LAorICBEV19UQUdfZmlsZV90eXBlID0gMHgyOSwKKyAgRFdfVEFHX2ZyaWVuZCA9IDB4MmEsCisgIERXX1RBR19uYW1lbGlzdCA9IDB4MmIsCisgIERXX1RBR19uYW1lbGlzdF9pdGVtID0gMHgyYywKKyAgRFdfVEFHX3BhY2tlZF90eXBlID0gMHgyZCwKKyAgRFdfVEFHX3N1YnByb2dyYW0gPSAweDJlLAorICBEV19UQUdfdGVtcGxhdGVfdHlwZV9wYXJhbSA9IDB4MmYsCisgIERXX1RBR190ZW1wbGF0ZV92YWx1ZV9wYXJhbSA9IDB4MzAsCisgIERXX1RBR190aHJvd25fdHlwZSA9IDB4MzEsCisgIERXX1RBR190cnlfYmxvY2sgPSAweDMyLAorICBEV19UQUdfdmFyaWFudF9wYXJ0ID0gMHgzMywKKyAgRFdfVEFHX3ZhcmlhYmxlID0gMHgzNCwKKyAgRFdfVEFHX3ZvbGF0aWxlX3R5cGUgPSAweDM1LAorICAvKiBTR0kvTUlQUyBFeHRlbnNpb25zICovCisgIERXX1RBR19NSVBTX2xvb3AgPSAweDQwODEsCisgIC8qIEdOVSBleHRlbnNpb25zICovCisgIERXX1RBR19mb3JtYXRfbGFiZWwgPSAweDQxMDEsCisgIERXX1RBR19mdW5jdGlvbl90ZW1wbGF0ZSA9IDB4NDEwMiwKKyAgRFdfVEFHX2NsYXNzX3RlbXBsYXRlID0gMHg0MTAzCit9OworCitlbnVtIGR3YXJmX2NoaWxkcmVuCit7CisgIERXX2NoaWxkcmVuX25vID0gMCwKKyAgRFdfY2hpbGRyZW5feWVzID0gMQorfTsKKworZW51bSBkd2FyZl9mb3JtCit7CisgIERXX0ZPUk1fYWRkciA9IDB4MDEsCisgIERXX0ZPUk1fYmxvY2syID0gMHgwMywKKyAgRFdfRk9STV9ibG9jazQgPSAweDA0LAorICBEV19GT1JNX2RhdGEyID0gMHgwNSwKKyAgRFdfRk9STV9kYXRhNCA9IDB4MDYsCisgIERXX0ZPUk1fZGF0YTggPSAweDA3LAorICBEV19GT1JNX3N0cmluZyA9IDB4MDgsCisgIERXX0ZPUk1fYmxvY2sgPSAweDA5LAorICBEV19GT1JNX2Jsb2NrMSA9IDB4MGEsCisgIERXX0ZPUk1fZGF0YTEgPSAweDBiLAorICBEV19GT1JNX2ZsYWcgPSAweDBjLAorICBEV19GT1JNX3NkYXRhID0gMHgwZCwKKyAgRFdfRk9STV9zdHJwID0gMHgwZSwKKyAgRFdfRk9STV91ZGF0YSA9IDB4MGYsCisgIERXX0ZPUk1fcmVmX2FkZHIgPSAweDEwLAorICBEV19GT1JNX3JlZjEgPSAweDExLAorICBEV19GT1JNX3JlZjIgPSAweDEyLAorICBEV19GT1JNX3JlZjQgPSAweDEzLAorICBEV19GT1JNX3JlZjggPSAweDE0LAorICBEV19GT1JNX3JlZl91ZGF0YSA9IDB4MTUsCisgIERXX0ZPUk1faW5kaXJlY3QgPSAweDE2Cit9OworCitlbnVtIGR3YXJmX2F0dHJpYnV0ZQoreworICBEV19BVF9zaWJsaW5nID0gMHgwMSwKKyAgRFdfQVRfbG9jYXRpb24gPSAweDAyLAorICBEV19BVF9uYW1lID0gMHgwMywKKyAgRFdfQVRfb3JkZXJpbmcgPSAweDA5LAorICBEV19BVF9zdWJzY3JfZGF0YSA9IDB4MGEsCisgIERXX0FUX2J5dGVfc2l6ZSA9IDB4MGIsCisgIERXX0FUX2JpdF9vZmZzZXQgPSAweDBjLAorICBEV19BVF9iaXRfc2l6ZSA9IDB4MGQsCisgIERXX0FUX2VsZW1lbnRfbGlzdCA9IDB4MGYsCisgIERXX0FUX3N0bXRfbGlzdCA9IDB4MTAsCisgIERXX0FUX2xvd19wYyA9IDB4MTEsCisgIERXX0FUX2hpZ2hfcGMgPSAweDEyLAorICBEV19BVF9sYW5ndWFnZSA9IDB4MTMsCisgIERXX0FUX21lbWJlciA9IDB4MTQsCisgIERXX0FUX2Rpc2NyID0gMHgxNSwKKyAgRFdfQVRfZGlzY3JfdmFsdWUgPSAweDE2LAorICBEV19BVF92aXNpYmlsaXR5ID0gMHgxNywKKyAgRFdfQVRfaW1wb3J0ID0gMHgxOCwKKyAgRFdfQVRfc3RyaW5nX2xlbmd0aCA9IDB4MTksCisgIERXX0FUX2NvbW1vbl9yZWZlcmVuY2UgPSAweDFhLAorICBEV19BVF9jb21wX2RpciA9IDB4MWIsCisgIERXX0FUX2NvbnN0X3ZhbHVlID0gMHgxYywKKyAgRFdfQVRfY29udGFpbmluZ190eXBlID0gMHgxZCwKKyAgRFdfQVRfZGVmYXVsdF92YWx1ZSA9IDB4MWUsCisgIERXX0FUX2lubGluZSA9IDB4MjAsCisgIERXX0FUX2lzX29wdGlvbmFsID0gMHgyMSwKKyAgRFdfQVRfbG93ZXJfYm91bmQgPSAweDIyLAorICBEV19BVF9wcm9kdWNlciA9IDB4MjUsCisgIERXX0FUX3Byb3RvdHlwZWQgPSAweDI3LAorICBEV19BVF9yZXR1cm5fYWRkciA9IDB4MmEsCisgIERXX0FUX3N0YXJ0X3Njb3BlID0gMHgyYywKKyAgRFdfQVRfc3RyaWRlX3NpemUgPSAweDJlLAorICBEV19BVF91cHBlcl9ib3VuZCA9IDB4MmYsCisgIERXX0FUX2Fic3RyYWN0X29yaWdpbiA9IDB4MzEsCisgIERXX0FUX2FjY2Vzc2liaWxpdHkgPSAweDMyLAorICBEV19BVF9hZGRyZXNzX2NsYXNzID0gMHgzMywKKyAgRFdfQVRfYXJ0aWZpY2lhbCA9IDB4MzQsCisgIERXX0FUX2Jhc2VfdHlwZXMgPSAweDM1LAorICBEV19BVF9jYWxsaW5nX2NvbnZlbnRpb24gPSAweDM2LAorICBEV19BVF9jb3VudCA9IDB4MzcsCisgIERXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uID0gMHgzOCwKKyAgRFdfQVRfZGVjbF9jb2x1bW4gPSAweDM5LAorICBEV19BVF9kZWNsX2ZpbGUgPSAweDNhLAorICBEV19BVF9kZWNsX2xpbmUgPSAweDNiLAorICBEV19BVF9kZWNsYXJhdGlvbiA9IDB4M2MsCisgIERXX0FUX2Rpc2NyX2xpc3QgPSAweDNkLAorICBEV19BVF9lbmNvZGluZyA9IDB4M2UsCisgIERXX0FUX2V4dGVybmFsID0gMHgzZiwKKyAgRFdfQVRfZnJhbWVfYmFzZSA9IDB4NDAsCisgIERXX0FUX2ZyaWVuZCA9IDB4NDEsCisgIERXX0FUX2lkZW50aWZpZXJfY2FzZSA9IDB4NDIsCisgIERXX0FUX21hY3JvX2luZm8gPSAweDQzLAorICBEV19BVF9uYW1lbGlzdF9pdGVtcyA9IDB4NDQsCisgIERXX0FUX3ByaW9yaXR5ID0gMHg0NSwKKyAgRFdfQVRfc2VnbWVudCA9IDB4NDYsCisgIERXX0FUX3NwZWNpZmljYXRpb24gPSAweDQ3LAorICBEV19BVF9zdGF0aWNfbGluayA9IDB4NDgsCisgIERXX0FUX3R5cGUgPSAweDQ5LAorICBEV19BVF91c2VfbG9jYXRpb24gPSAweDRhLAorICBEV19BVF92YXJpYWJsZV9wYXJhbWV0ZXIgPSAweDRiLAorICBEV19BVF92aXJ0dWFsaXR5ID0gMHg0YywKKyAgRFdfQVRfdnRhYmxlX2VsZW1fbG9jYXRpb24gPSAweDRkLAorICBEV19BVF9NSVBTX2ZkZSA9IDB4MjAwMSwKKyAgRFdfQVRfTUlQU19sb29wX2JlZ2luID0gMHgyMDAyLAorICBEV19BVF9NSVBTX3RhaWxfbG9vcF9iZWdpbiA9IDB4MjAwMywKKyAgRFdfQVRfTUlQU19lcGlsb2dfYmVnaW4gPSAweDIwMDQsCisgIERXX0FUX01JUFNfbG9vcF91bnJvbGxfZmFjdG9yID0gMHgyMDA1LAorICBEV19BVF9NSVBTX3NvZnR3YXJlX3BpcGVsaW5lX2RlcHRoID0gMHgyMDA2LAorICBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZSA9IDB4MjAwNywKKyAgRFdfQVRfTUlQU19zdHJpZGUgPSAweDIwMDgsCisgIERXX0FUX01JUFNfYWJzdHJhY3RfbmFtZSA9IDB4MjAwOSwKKyAgRFdfQVRfTUlQU19jbG9uZV9vcmlnaW4gPSAweDIwMGEsCisgIERXX0FUX01JUFNfaGFzX2lubGluZXMgPSAweDIwMGIsCisgIC8qIEdOVSAqLworICBEV19BVF9zZl9uYW1lcyA9IDB4MjEwMSwKKyAgRFdfQVRfc3JjX2luZm8gPSAweDIxMDIsCisgIERXX0FUX21hY19pbmZvID0gMHgyMTAzLAorICBEV19BVF9zcmNfY29vcmRzID0gMHgyMTA0LAorICBEV19BVF9ib2R5X2JlZ2luID0gMHgyMTA1LAorICBEV19BVF9ib2R5X2VuZCA9IDB4MjEwNgorfTsKKworZW51bSBkd2FyZl9sb2NhdGlvbl9hdG9tCit7CisgIERXX09QX2FkZHIgPSAweDAzLAorICBEV19PUF9kZXJlZiA9IDB4MDYsCisgIERXX09QX2NvbnN0MXUgPSAweDA4LAorICBEV19PUF9jb25zdDFzID0gMHgwOSwKKyAgRFdfT1BfY29uc3QydSA9IDB4MGEsCisgIERXX09QX2NvbnN0MnMgPSAweDBiLAorICBEV19PUF9jb25zdDR1ID0gMHgwYywKKyAgRFdfT1BfY29uc3Q0cyA9IDB4MGQsCisgIERXX09QX2NvbnN0OHUgPSAweDBlLAorICBEV19PUF9jb25zdDhzID0gMHgwZiwKKyAgRFdfT1BfY29uc3R1ID0gMHgxMCwKKyAgRFdfT1BfY29uc3RzID0gMHgxMSwKKyAgRFdfT1BfZHVwID0gMHgxMiwKKyAgRFdfT1BfZHJvcCA9IDB4MTMsCisgIERXX09QX292ZXIgPSAweDE0LAorICBEV19PUF9waWNrID0gMHgxNSwKKyAgRFdfT1Bfc3dhcCA9IDB4MTYsCisgIERXX09QX3JvdCA9IDB4MTcsCisgIERXX09QX3hkZXJlZiA9IDB4MTgsCisgIERXX09QX2FicyA9IDB4MTksCisgIERXX09QX2FuZCA9IDB4MWEsCisgIERXX09QX2RpdiA9IDB4MWIsCisgIERXX09QX21pbnVzID0gMHgxYywKKyAgRFdfT1BfbW9kID0gMHgxZCwKKyAgRFdfT1BfbXVsID0gMHgxZSwKKyAgRFdfT1BfbmVnID0gMHgxZiwKKyAgRFdfT1Bfbm90ID0gMHgyMCwKKyAgRFdfT1Bfb3IgPSAweDIxLAorICBEV19PUF9wbHVzID0gMHgyMiwKKyAgRFdfT1BfcGx1c191Y29uc3QgPSAweDIzLAorICBEV19PUF9zaGwgPSAweDI0LAorICBEV19PUF9zaHIgPSAweDI1LAorICBEV19PUF9zaHJhID0gMHgyNiwKKyAgRFdfT1BfeG9yID0gMHgyNywKKyAgRFdfT1BfYnJhID0gMHgyOCwKKyAgRFdfT1BfZXEgPSAweDI5LAorICBEV19PUF9nZSA9IDB4MmEsCisgIERXX09QX2d0ID0gMHgyYiwKKyAgRFdfT1BfbGUgPSAweDJjLAorICBEV19PUF9sdCA9IDB4MmQsCisgIERXX09QX25lID0gMHgyZSwKKyAgRFdfT1Bfc2tpcCA9IDB4MmYsCisgIERXX09QX2xpdDAgPSAweDMwLAorICBEV19PUF9saXQxID0gMHgzMSwKKyAgRFdfT1BfbGl0MiA9IDB4MzIsCisgIERXX09QX2xpdDMgPSAweDMzLAorICBEV19PUF9saXQ0ID0gMHgzNCwKKyAgRFdfT1BfbGl0NSA9IDB4MzUsCisgIERXX09QX2xpdDYgPSAweDM2LAorICBEV19PUF9saXQ3ID0gMHgzNywKKyAgRFdfT1BfbGl0OCA9IDB4MzgsCisgIERXX09QX2xpdDkgPSAweDM5LAorICBEV19PUF9saXQxMCA9IDB4M2EsCisgIERXX09QX2xpdDExID0gMHgzYiwKKyAgRFdfT1BfbGl0MTIgPSAweDNjLAorICBEV19PUF9saXQxMyA9IDB4M2QsCisgIERXX09QX2xpdDE0ID0gMHgzZSwKKyAgRFdfT1BfbGl0MTUgPSAweDNmLAorICBEV19PUF9saXQxNiA9IDB4NDAsCisgIERXX09QX2xpdDE3ID0gMHg0MSwKKyAgRFdfT1BfbGl0MTggPSAweDQyLAorICBEV19PUF9saXQxOSA9IDB4NDMsCisgIERXX09QX2xpdDIwID0gMHg0NCwKKyAgRFdfT1BfbGl0MjEgPSAweDQ1LAorICBEV19PUF9saXQyMiA9IDB4NDYsCisgIERXX09QX2xpdDIzID0gMHg0NywKKyAgRFdfT1BfbGl0MjQgPSAweDQ4LAorICBEV19PUF9saXQyNSA9IDB4NDksCisgIERXX09QX2xpdDI2ID0gMHg0YSwKKyAgRFdfT1BfbGl0MjcgPSAweDRiLAorICBEV19PUF9saXQyOCA9IDB4NGMsCisgIERXX09QX2xpdDI5ID0gMHg0ZCwKKyAgRFdfT1BfbGl0MzAgPSAweDRlLAorICBEV19PUF9saXQzMSA9IDB4NGYsCisgIERXX09QX3JlZzAgPSAweDUwLAorICBEV19PUF9yZWcxID0gMHg1MSwKKyAgRFdfT1BfcmVnMiA9IDB4NTIsCisgIERXX09QX3JlZzMgPSAweDUzLAorICBEV19PUF9yZWc0ID0gMHg1NCwKKyAgRFdfT1BfcmVnNSA9IDB4NTUsCisgIERXX09QX3JlZzYgPSAweDU2LAorICBEV19PUF9yZWc3ID0gMHg1NywKKyAgRFdfT1BfcmVnOCA9IDB4NTgsCisgIERXX09QX3JlZzkgPSAweDU5LAorICBEV19PUF9yZWcxMCA9IDB4NWEsCisgIERXX09QX3JlZzExID0gMHg1YiwKKyAgRFdfT1BfcmVnMTIgPSAweDVjLAorICBEV19PUF9yZWcxMyA9IDB4NWQsCisgIERXX09QX3JlZzE0ID0gMHg1ZSwKKyAgRFdfT1BfcmVnMTUgPSAweDVmLAorICBEV19PUF9yZWcxNiA9IDB4NjAsCisgIERXX09QX3JlZzE3ID0gMHg2MSwKKyAgRFdfT1BfcmVnMTggPSAweDYyLAorICBEV19PUF9yZWcxOSA9IDB4NjMsCisgIERXX09QX3JlZzIwID0gMHg2NCwKKyAgRFdfT1BfcmVnMjEgPSAweDY1LAorICBEV19PUF9yZWcyMiA9IDB4NjYsCisgIERXX09QX3JlZzIzID0gMHg2NywKKyAgRFdfT1BfcmVnMjQgPSAweDY4LAorICBEV19PUF9yZWcyNSA9IDB4NjksCisgIERXX09QX3JlZzI2ID0gMHg2YSwKKyAgRFdfT1BfcmVnMjcgPSAweDZiLAorICBEV19PUF9yZWcyOCA9IDB4NmMsCisgIERXX09QX3JlZzI5ID0gMHg2ZCwKKyAgRFdfT1BfcmVnMzAgPSAweDZlLAorICBEV19PUF9yZWczMSA9IDB4NmYsCisgIERXX09QX2JyZWcwID0gMHg3MCwKKyAgRFdfT1BfYnJlZzEgPSAweDcxLAorICBEV19PUF9icmVnMiA9IDB4NzIsCisgIERXX09QX2JyZWczID0gMHg3MywKKyAgRFdfT1BfYnJlZzQgPSAweDc0LAorICBEV19PUF9icmVnNSA9IDB4NzUsCisgIERXX09QX2JyZWc2ID0gMHg3NiwKKyAgRFdfT1BfYnJlZzcgPSAweDc3LAorICBEV19PUF9icmVnOCA9IDB4NzgsCisgIERXX09QX2JyZWc5ID0gMHg3OSwKKyAgRFdfT1BfYnJlZzEwID0gMHg3YSwKKyAgRFdfT1BfYnJlZzExID0gMHg3YiwKKyAgRFdfT1BfYnJlZzEyID0gMHg3YywKKyAgRFdfT1BfYnJlZzEzID0gMHg3ZCwKKyAgRFdfT1BfYnJlZzE0ID0gMHg3ZSwKKyAgRFdfT1BfYnJlZzE1ID0gMHg3ZiwKKyAgRFdfT1BfYnJlZzE2ID0gMHg4MCwKKyAgRFdfT1BfYnJlZzE3ID0gMHg4MSwKKyAgRFdfT1BfYnJlZzE4ID0gMHg4MiwKKyAgRFdfT1BfYnJlZzE5ID0gMHg4MywKKyAgRFdfT1BfYnJlZzIwID0gMHg4NCwKKyAgRFdfT1BfYnJlZzIxID0gMHg4NSwKKyAgRFdfT1BfYnJlZzIyID0gMHg4NiwKKyAgRFdfT1BfYnJlZzIzID0gMHg4NywKKyAgRFdfT1BfYnJlZzI0ID0gMHg4OCwKKyAgRFdfT1BfYnJlZzI1ID0gMHg4OSwKKyAgRFdfT1BfYnJlZzI2ID0gMHg4YSwKKyAgRFdfT1BfYnJlZzI3ID0gMHg4YiwKKyAgRFdfT1BfYnJlZzI4ID0gMHg4YywKKyAgRFdfT1BfYnJlZzI5ID0gMHg4ZCwKKyAgRFdfT1BfYnJlZzMwID0gMHg4ZSwKKyAgRFdfT1BfYnJlZzMxID0gMHg4ZiwKKyAgRFdfT1BfcmVneCA9IDB4OTAsCisgIERXX09QX2ZicmVnID0gMHg5MSwKKyAgRFdfT1BfYnJlZ3ggPSAweDkyLAorICBEV19PUF9waWVjZSA9IDB4OTMsCisgIERXX09QX2RlcmVmX3NpemUgPSAweDk0LAorICBEV19PUF94ZGVyZWZfc2l6ZSA9IDB4OTUsCisgIERXX09QX25vcCA9IDB4OTYKK307CisKK2VudW0gZHdhcmZfdHlwZQoreworICBEV19BVEVfdm9pZCA9IDB4MCwKKyAgRFdfQVRFX2FkZHJlc3MgPSAweDEsCisgIERXX0FURV9ib29sZWFuID0gMHgyLAorICBEV19BVEVfY29tcGxleF9mbG9hdCA9IDB4MywKKyAgRFdfQVRFX2Zsb2F0ID0gMHg0LAorICBEV19BVEVfc2lnbmVkID0gMHg1LAorICBEV19BVEVfc2lnbmVkX2NoYXIgPSAweDYsCisgIERXX0FURV91bnNpZ25lZCA9IDB4NywKKyAgRFdfQVRFX3Vuc2lnbmVkX2NoYXIgPSAweDgKK307CisKK2VudW0gZHdhcmZfYXJyYXlfZGltX29yZGVyaW5nCit7CisgIERXX09SRF9yb3dfbWFqb3IgPSAwLAorICBEV19PUkRfY29sX21ham9yID0gMQorfTsKKworZW51bSBkd2FyZl9hY2Nlc3NfYXR0cmlidXRlCit7CisgIERXX0FDQ0VTU19wdWJsaWMgPSAxLAorICBEV19BQ0NFU1NfcHJvdGVjdGVkID0gMiwKKyAgRFdfQUNDRVNTX3ByaXZhdGUgPSAzCit9OworCitlbnVtIGR3YXJmX3Zpc2liaWxpdHlfYXR0cmlidXRlCit7CisgIERXX1ZJU19sb2NhbCA9IDEsCisgIERXX1ZJU19leHBvcnRlZCA9IDIsCisgIERXX1ZJU19xdWFsaWZpZWQgPSAzCit9OworCitlbnVtIGR3YXJmX3ZpcnR1YWxpdHlfYXR0cmlidXRlCit7CisgIERXX1ZJUlRVQUxJVFlfbm9uZSA9IDAsCisgIERXX1ZJUlRVQUxJVFlfdmlydHVhbCA9IDEsCisgIERXX1ZJUlRVQUxJVFlfcHVyZV92aXJ0dWFsID0gMgorfTsKKworZW51bSBkd2FyZl9pZF9jYXNlCit7CisgIERXX0lEX2Nhc2Vfc2Vuc2l0aXZlID0gMCwKKyAgRFdfSURfdXBfY2FzZSA9IDEsCisgIERXX0lEX2Rvd25fY2FzZSA9IDIsCisgIERXX0lEX2Nhc2VfaW5zZW5zaXRpdmUgPSAzCit9OworCitlbnVtIGR3YXJmX2NhbGxpbmdfY29udmVudGlvbgoreworICBEV19DQ19ub3JtYWwgPSAweDEsCisgIERXX0NDX3Byb2dyYW0gPSAweDIsCisgIERXX0NDX25vY2FsbCA9IDB4MworfTsKKworZW51bSBkd2FyZl9pbmxpbmVfYXR0cmlidXRlCit7CisgIERXX0lOTF9ub3RfaW5saW5lZCA9IDAsCisgIERXX0lOTF9pbmxpbmVkID0gMSwKKyAgRFdfSU5MX2RlY2xhcmVkX25vdF9pbmxpbmVkID0gMiwKKyAgRFdfSU5MX2RlY2xhcmVkX2lubGluZWQgPSAzCit9OworCitlbnVtIGR3YXJmX2Rlc2NyaW1fbGlzdAoreworICBEV19EU0NfbGFiZWwgPSAwLAorICBEV19EU0NfcmFuZ2UgPSAxCit9OworCitlbnVtIGR3YXJmX2xpbmVfbnVtYmVyX29wcworeworICBEV19MTlNfZXh0ZW5kZWRfb3AgPSAwLAorICBEV19MTlNfY29weSA9IDEsCisgIERXX0xOU19hZHZhbmNlX3BjID0gMiwKKyAgRFdfTE5TX2FkdmFuY2VfbGluZSA9IDMsCisgIERXX0xOU19zZXRfZmlsZSA9IDQsCisgIERXX0xOU19zZXRfY29sdW1uID0gNSwKKyAgRFdfTE5TX25lZ2F0ZV9zdG10ID0gNiwKKyAgRFdfTE5TX3NldF9iYXNpY19ibG9jayA9IDcsCisgIERXX0xOU19jb25zdF9hZGRfcGMgPSA4LAorICBEV19MTlNfZml4ZWRfYWR2YW5jZV9wYyA9IDkKK307CisKK2VudW0gZHdhcmZfbGluZV9udW1iZXJfeF9vcHMKK3sKKyAgRFdfTE5FX2VuZF9zZXF1ZW5jZSA9IDEsCisgIERXX0xORV9zZXRfYWRkcmVzcyA9IDIsCisgIERXX0xORV9kZWZpbmVfZmlsZSA9IDMKK307CisKK2VudW0gZHdhcmZfY2FsbF9mcmFtZV9pbmZvCit7CisgIERXX0NGQV9hZHZhbmNlX2xvYyA9IDB4NDAsCisgIERXX0NGQV9vZmZzZXQgPSAweDgwLAorICBEV19DRkFfcmVzdG9yZSA9IDB4YzAsCisgIERXX0NGQV9ub3AgPSAweDAwLAorICBEV19DRkFfc2V0X2xvYyA9IDB4MDEsCisgIERXX0NGQV9hZHZhbmNlX2xvYzEgPSAweDAyLAorICBEV19DRkFfYWR2YW5jZV9sb2MyID0gMHgwMywKKyAgRFdfQ0ZBX2FkdmFuY2VfbG9jNCA9IDB4MDQsCisgIERXX0NGQV9vZmZzZXRfZXh0ZW5kZWQgPSAweDA1LAorICBEV19DRkFfcmVzdG9yZV9leHRlbmRlZCA9IDB4MDYsCisgIERXX0NGQV91bmRlZmluZWQgPSAweDA3LAorICBEV19DRkFfc2FtZV92YWx1ZSA9IDB4MDgsCisgIERXX0NGQV9yZWdpc3RlciA9IDB4MDksCisgIERXX0NGQV9yZW1lbWJlcl9zdGF0ZSA9IDB4MGEsCisgIERXX0NGQV9yZXN0b3JlX3N0YXRlID0gMHgwYiwKKyAgRFdfQ0ZBX2RlZl9jZmEgPSAweDBjLAorICBEV19DRkFfZGVmX2NmYV9yZWdpc3RlciA9IDB4MGQsCisgIERXX0NGQV9kZWZfY2ZhX29mZnNldCA9IDB4MGUsCisgIERXX0NGQV9NSVBTX2FkdmFuY2VfbG9jOCA9IDB4MWQKK307CisKKyNkZWZpbmUgRFdfQ0lFX0lECSAgMHhmZmZmZmZmZgorI2RlZmluZSBEV19DSUVfVkVSU0lPTgkgIDEKKworI2RlZmluZSBEV19DRkFfZXh0ZW5kZWQgICAwCisjZGVmaW5lIERXX0NGQV9sb3dfdXNlciAgIDB4MWMKKyNkZWZpbmUgRFdfQ0ZBX2hpZ2hfdXNlciAgMHgzZgorCisjZGVmaW5lIERXX0NISUxEUkVOX25vCQkgICAgIDB4MDAKKyNkZWZpbmUgRFdfQ0hJTERSRU5feWVzCQkgICAgIDB4MDEKKworI2RlZmluZSBEV19BRERSX25vbmUJCTAKKworZW51bSBkd2FyZl9zb3VyY2VfbGFuZ3VhZ2UKK3sKKyAgRFdfTEFOR19DODkgPSAweDAwMDEsCisgIERXX0xBTkdfQyA9IDB4MDAwMiwKKyAgRFdfTEFOR19BZGE4MyA9IDB4MDAwMywKKyAgRFdfTEFOR19DX3BsdXNfcGx1cyA9IDB4MDAwNCwKKyAgRFdfTEFOR19Db2JvbDc0ID0gMHgwMDA1LAorICBEV19MQU5HX0NvYm9sODUgPSAweDAwMDYsCisgIERXX0xBTkdfRm9ydHJhbjc3ID0gMHgwMDA3LAorICBEV19MQU5HX0ZvcnRyYW45MCA9IDB4MDAwOCwKKyAgRFdfTEFOR19QYXNjYWw4MyA9IDB4MDAwOSwKKyAgRFdfTEFOR19Nb2R1bGEyID0gMHgwMDBhLAorICBEV19MQU5HX01pcHNfQXNzZW1ibGVyID0gMHg4MDAxCit9OworCisKK2VudW0gZHdhcmZfbWFjaW5mb19yZWNvcmRfdHlwZQoreworICBEV19NQUNJTkZPX2RlZmluZSA9IDEsCisgIERXX01BQ0lORk9fdW5kZWYgPSAyLAorICBEV19NQUNJTkZPX3N0YXJ0X2ZpbGUgPSAzLAorICBEV19NQUNJTkZPX2VuZF9maWxlID0gNCwKKyAgRFdfTUFDSU5GT192ZW5kb3JfZXh0ID0gMjU1Cit9OworCisKKworI2RlZmluZSBIQVZFX0xPQ0FUSU9OX0xJU1RTIDAKKworLyogcHJvdmlkZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yICovCitzdGF0aWMgdm9pZCBkd2FyZjJfcHJpbnRfZnJhbWVfbG9jYXRpb24oRklMRSAqLFZhciAqKTsKK3N0YXRpYyB6bWF4IGR3YXJmMl9mYm9mZnNldChWYXIgKik7CitzdGF0aWMgaW50IGR3YXJmMl9yZWdudW1iZXIoaW50KTsKKworc3RhdGljIGludCBhYmJyZXZfbGFiZWwsaW5mb19zdGFydCxpbmZvX2VuZCxsaW5lX3N0YXJ0LGxpbmVfZW5kOworCitzdGF0aWMgaW50IHNpemVvZl9hZGRyOworc3RhdGljIGNoYXIgKmR3YXJmZDEsKmR3YXJmZDIsKmR3YXJmZDQsKmRhLCpscCwqaXAsKmRzZWM7CitzdGF0aWMgaW50IGFkZHJfZm9ybTsKK3N0YXRpYyBjaGFyICoqbmFtZXM7CitzdGF0aWMgaW50IG5hbWVjb3VudDsKKworZXh0ZXJuIFZhciAqbWVya192YXJmLCpmaXJzdF92YXJbXSwqZmlyc3RfZXh0OyAvKkZJWE1FOiBub3QgbmljZSAqLworZXh0ZXJuIHN0cnVjdF9kZWNsYXJhdGlvbiAqZmlyc3Rfc2RbXTsKKworI2RlZmluZSBDT01QX1VOSVQgMVVMCisjZGVmaW5lIFNVQlBST0dSQU0gMlVMCisjZGVmaW5lIFNVQlBST0dSQU1WT0lEIDNVTCAKKyNkZWZpbmUgQkFTRVRZUEUgNFVMCisjZGVmaW5lIFBPSU5URVJUWVBFIDVVTAorI2RlZmluZSBDT05TVFRZUEUgNlVMCisjZGVmaW5lIFZPTEFUSUxFVFlQRSA3VUwKKyNkZWZpbmUgRk9STUFMUEFSQU1FVEVSIDhVTAorI2RlZmluZSBWQVJJQUJMRSA5VUwKKyNkZWZpbmUgQVJSQVlUWVBFIDEwVUwKKyNkZWZpbmUgQVJSQVlESU0gMTFVTAorI2RlZmluZSBTVFJVQ1RUWVBFIDEyVUwKKyNkZWZpbmUgVU5JT05UWVBFIDEzVUwKKyNkZWZpbmUgU1RSVUNUVEFHIDE0VUwKKyNkZWZpbmUgVU5JT05UQUcgMTVVTAorI2RlZmluZSBUWVBFREVGVFlQRSAxNlVMCisjZGVmaW5lIE1FTUJFUlRZUEUgMTdVTAorI2RlZmluZSBGVU5DVFlQRSAxOFVMCisjZGVmaW5lIFZPSURGVU5DVFlQRSAxOVVMCisjZGVmaW5lIFBBUk1UWVBFIDIwVUwKKwordHlwZWRlZiBzdHJ1Y3QgZHdhcmYyX2xpbmVfaW5mbyB7CisgIHN0cnVjdCBkd2FyZjJfbGluZV9pbmZvICpuZXh0OworICBjaGFyICppZDsKKyAgaW50IGZpbGUsbGluZSxsYWJlbDsKK30gdGR3YXJmMl9saW5lX2luZm87CisKK3N0YXRpYyB0ZHdhcmYyX2xpbmVfaW5mbyAqZHdhcmYyX2ZpcnN0X2xpLCpkd2FyZjJfbGFzdF9saTsKKworc3RhdGljIHZvaWQgZHdhcmYyX2FkZF9saW5lKGludCBmaWxlLGludCBsaW5lLGludCBsYWJlbCxjaGFyICppZCkKK3sKKyAgdGR3YXJmMl9saW5lX2luZm8gKm5ldywqcCwqbHA7CisgIG5ldz1teW1hbGxvYyhzaXplb2YoKm5ldykpOworICBuZXctPmZpbGU9ZmlsZTsKKyAgbmV3LT5saW5lPWxpbmU7CisgIG5ldy0+bGFiZWw9bGFiZWw7CisgIGlmKGlkKXsKKyAgICBuZXctPmlkPW15bWFsbG9jKHN0cmxlbihpZCkrMSk7CisgICAgc3RyY3B5KG5ldy0+aWQsaWQpOworICB9ZWxzZXsKKyAgICBuZXctPmlkPTA7CisgIH0KKyAgbmV3LT5uZXh0PTA7CisjaWYgMAorICBmb3IobHA9cD1kd2FyZjJfZmlyc3RfbGk7cDtwPXAtPm5leHQpeworICAgIGlmKHAhPWxwJiZwLT5maWxlPT1maWxlJiZwLT5saW5lPj1saW5lKXsKKyAgICAgIG5ldy0+bmV4dD1scC0+bmV4dDsKKyAgICAgIGxwLT5uZXh0PW5ldzsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbHA9cDsKKyAgfQorI2VuZGlmCisgIGlmKGR3YXJmMl9sYXN0X2xpKXsKKyAgICBkd2FyZjJfbGFzdF9saS0+bmV4dD1uZXc7CisgICAgZHdhcmYyX2xhc3RfbGk9bmV3OworICB9ZWxzZXsKKyAgICBkd2FyZjJfZmlyc3RfbGk9ZHdhcmYyX2xhc3RfbGk9bmV3OworICB9CisjaWYgMAorICBwcmludGYoImxpbmZvOlxuIik7CisgIGZvcihwPWR3YXJmMl9maXJzdF9saTtwO3A9cC0+bmV4dCkKKyAgICBwcmludGYoImxpOiBsaW5lPSVkXG4iLHAtPmxpbmUpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGR3YXJmMl9zZXR1cChpbnQgc2EsY2hhciAqZHdhcmZkMXMsY2hhciAqZHdhcmZkMnMsY2hhciAqZHdhcmZkNHMsY2hhciAqZGFzLGNoYXIgKmxwcyxjaGFyICppcHMsY2hhciAqZHMpCit7CisgIHNpemVvZl9hZGRyPXNhOworICBkd2FyZmQxPWR3YXJmZDFzOworICBkd2FyZmQyPWR3YXJmZDJzOworICBkd2FyZmQ0PWR3YXJmZDRzOworICBkYT1kYXM7CisgIGxwPWxwczsKKyAgaXA9aXBzOworICBkc2VjPWRzOworICBpZihzaXplb2ZfYWRkcj09MikKKyAgICBhZGRyX2Zvcm09RFdfRk9STV9kYXRhMjsKKyAgZWxzZSBpZihzaXplb2ZfYWRkcj09NCkKKyAgICBhZGRyX2Zvcm09RFdfRk9STV9kYXRhNDsKKyAgZWxzZSBpZihzaXplb2ZfYWRkcj09OCkKKyAgICBhZGRyX2Zvcm09RFdfRk9STV9kYXRhODsKKyAgZWxzZQorICAgIGllcnJvcigwKTsKK30KK3N0YXRpYyBpbnQgZHdhcmYyX3VsZWIxMjhfc2l6ZSh6dW1heCB2YWx1ZSkKK3sKKyAgaW50IHNpemU9MDsKKyAgZG97CisgICAgdmFsdWU9enVtcnNoaWZ0KHZhbHVlLHVsMnp1bSg3VUwpKTsKKyAgICBzaXplKys7CisgIH13aGlsZSghem1lcXRvKHZhbHVlLHVsMnp1bSgwVUwpKSk7CisgIHJldHVybiBzaXplOworfQorc3RhdGljIHZvaWQgZHdhcmYyX3ByaW50X3VsZWIxMjgoRklMRSAqZix6dW1heCB2YWx1ZSkKK3sKKyAgdW5zaWduZWQgbG9uZyBieXRlOworICBlbWl0KGYsIlx0JXNcdCIsZHdhcmZkMSk7CisgIGRveworICAgIGJ5dGU9enVtMnVsKHp1bWFuZCh2YWx1ZSx1bDJ6dW0oMTI3VUwpKSk7CisgICAgdmFsdWU9enVtcnNoaWZ0KHZhbHVlLHVsMnp1bSg3VUwpKTsKKyAgICBpZighenVtZXF0byh2YWx1ZSx1bDJ6dW0oMFVMKSkpCisgICAgICBlbWl0KGYsIiVsdSwiLGJ5dGV8MHg4MCk7CisgICAgZWxzZQorICAgICAgZW1pdChmLCIlbHVcbiIsYnl0ZSk7CisgIH13aGlsZSghenVtZXF0byh2YWx1ZSx1bDJ6dW0oMFVMKSkpOworfQorc3RhdGljIGludCBkd2FyZjJfc2xlYjEyOF9zaXplKHptYXggdmFsdWUpCit7CisgIGludCBtb3JlPTEsc2l6ZT0wOworICBsb25nIGJ5dGU7CisgIGRveworICAgIGJ5dGU9em0ybCh6bWFuZCh2YWx1ZSxsMnptKDEyN0wpKSk7CisgICAgdmFsdWU9em1yc2hpZnQodmFsdWUsbDJ6bSg3TCkpOyAvKkZJWE1FKi8KKyAgICBpZigoem1lcXRvKHZhbHVlLGwyem0oMEwpKSYmIShieXRlJjB4NDApKXx8CisgICAgICAgKHptZXF0byh2YWx1ZSxsMnptKC0xTCkpJiYoYnl0ZSYweDQwKSkpCisgICAgICBtb3JlPTA7CisgICAgc2l6ZSsrOworICB9d2hpbGUobW9yZSk7CisgIHJldHVybiBzaXplOworfQorc3RhdGljIHZvaWQgZHdhcmYyX3ByaW50X3NsZWIxMjgoRklMRSAqZix6bWF4IHZhbHVlKQoreworICBpbnQgbW9yZT0xOworICBsb25nIGJ5dGU7CisgIGVtaXQoZiwiXHQlc1x0Iixkd2FyZmQxKTsKKyAgZG97CisgICAgYnl0ZT16bTJsKHptYW5kKHZhbHVlLGwyem0oMTI3TCkpKTsKKyAgICB2YWx1ZT16bXJzaGlmdCh2YWx1ZSxsMnptKDdMKSk7IC8qRklYTUUqLworICAgIGlmKCh6bWVxdG8odmFsdWUsbDJ6bSgwTCkpJiYhKGJ5dGUmMHg0MCkpfHwKKyAgICAgICAoem1lcXRvKHZhbHVlLGwyem0oLTFMKSkmJihieXRlJjB4NDApKSl7CisgICAgICBtb3JlPTA7CisgICAgICBlbWl0KGYsIiVsZFxuIixieXRlKTsKKyAgICB9ZWxzZXsKKyAgICAgIGVtaXQoZiwiJWxkLCIsYnl0ZXwweDgwKTsKKyAgICB9CisgIH13aGlsZShtb3JlKTsKK30KK3N0YXRpYyB2b2lkIGR3YXJmMl9wcmludF9sb2NhdGlvbihGSUxFICpmLG9iaiAqbykKK3sKKyAgaWYoby0+ZmxhZ3MmKEtPTlNUfERSRUZPQkopKSBpZXJyb3IoMCk7CisgIGlmKCEoby0+ZmxhZ3MmKFZBUnxSRUcpKSkgaWVycm9yKDApOworICBpZihvLT5mbGFncyZSRUcpeworICAgIGludCByPWR3YXJmMl9yZWdudW1iZXIoby0+cmVnKTsKKyAgICBpZihyPD0zMSl7CisgICAgICBlbWl0KGYsIlx0JXNcdCVkXG4iLGR3YXJmZDIsMSk7CisgICAgICBlbWl0KGYsIlx0JXNcdCVkXG4iLGR3YXJmZDEsRFdfT1BfcmVnMCtyKTsKKyAgICB9ZWxzZXsKKyAgICAgIGVtaXQoZiwiXHQlc1x0JWRcbiIsZHdhcmZkMiwxK2R3YXJmMl91bGViMTI4X3NpemUodWwyenVtKCh1bnNpZ25lZCBsb25nKXIpKSk7CisgICAgICBlbWl0KGYsIlx0JXNcdCVkXG4iLGR3YXJmZDEsRFdfT1BfcmVneCk7CisgICAgICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShyKSk7CisgICAgfQorICB9ZWxzZXsKKyAgICBpZihvLT52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUN8fG8tPnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisgICAgICBpZihjcm9zc19tb2R1bGUmJiEoby0+di0+ZmxhZ3MmUkVGRVJFTkNFRCkpeworCWVtaXQoZiwiXHQlc1x0MFxuIixkd2FyZmQxKTsKKyAgICAgIH1lbHNleworCWVtaXQoZiwiXHQlc1x0JWRcbiIsZHdhcmZkMiwoaW50KSgxK3NpemVvZl9hZGRyKSk7CisJZW1pdChmLCJcdCVzXHQlZFxuIixkd2FyZmQxLERXX09QX2FkZHIpOworCWlmKG8tPnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQykKKwkgIGVtaXQoZiwiXHQlc1x0JXMlbGRcbiIsZGEsbHAsem0ybChvLT52LT5vZmZzZXQpKTsKKwllbHNlCisJICBlbWl0KGYsIlx0JXNcdCVzJXNcbiIsZGEsaXAsby0+di0+aWRlbnRpZmllcik7CisgICAgICB9CisgICAgfWVsc2V7CisgICAgICB6bWF4IG9mPWR3YXJmMl9mYm9mZnNldChvLT52KTsKKyAgICAgIGVtaXQoZiwiXHQlc1x0JWRcbiIsZHdhcmZkMiwxK2R3YXJmMl9zbGViMTI4X3NpemUob2YpKTsKKyAgICAgIGVtaXQoZiwiXHQlc1x0JWRcbiIsZHdhcmZkMSxEV19PUF9mYnJlZyk7CisgICAgICBkd2FyZjJfcHJpbnRfc2xlYjEyOChmLG9mKTsKKyAgICB9CisgIH0KK30KK3N0YXRpYyBpbnQgZHdhcmYyX2ZpbGUoY29uc3QgY2hhciAqcCkKK3sKKyAgaW50IGk7CisgIGlmKCFwKSBpZXJyb3IoMCk7CisgIGZvcihpPTA7aTxuYW1lY291bnQ7aSsrKQorICAgIGlmKCFzdHJjbXAocCxuYW1lc1tpXSkpCisgICAgICByZXR1cm4gaSsxOworICBuYW1lY291bnQrKzsKKyAgbmFtZXM9bXlyZWFsbG9jKG5hbWVzLG5hbWVjb3VudCpzaXplb2YoKm5hbWVzKSk7CisgIG5hbWVzW25hbWVjb3VudC0xXT1teW1hbGxvYyhzdHJsZW4ocCkrMSk7CisgIHN0cmNweShuYW1lc1tuYW1lY291bnQtMV0scCk7CisgIHJldHVybiBuYW1lY291bnQ7Cit9CitzdGF0aWMgaW50IGR3YXJmMl90eXBlKEZJTEUgKmYsdHlwZSAqdCkKK3sKKyAgaW50IGwsbG87Y2hhciAqcDsKKyAgaWYoSVNQT0lOVEVSKHQtPmZsYWdzKSl7CisgICAgbG89ZHdhcmYyX3R5cGUoZix0LT5uZXh0KTsKKyAgICBsPSsrbGFiZWw7CisgICAgZW1pdChmLCIlcyVkOlxuIixscCxsKTsKKyAgICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShQT0lOVEVSVFlQRSkpOworICAgIGVtaXQoZiwiXHQlc1x0JXMlZFxuIixkYSxscCxsbyk7CisgIH1lbHNlIGlmKElTSU5UKHQtPmZsYWdzKXx8SVNGTE9BVCh0LT5mbGFncyl8fCh0LT5mbGFncyZOUSk9PVZPSUQpeworICAgIGw9KytsYWJlbDsKKyAgICBlbWl0KGYsIiVzJWQ6XG4iLGxwLGwpOworICAgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKEJBU0VUWVBFKSk7ICAgIAorICAgIGZvcihwPXR5cG5hbWVbdC0+ZmxhZ3MmTlFdOypwO3ArKykgZW1pdChmLCJcdCVzXHQlZFxuIixkd2FyZmQxLCpwKTsKKyAgICBlbWl0KGYsIlx0JXNcdDBcbiIsZHdhcmZkMSk7CisgICAgaWYoSVNGTE9BVCh0LT5mbGFncykpeworICAgICAgbG89RFdfQVRFX2Zsb2F0OworICAgIH1lbHNlIGlmKCh0LT5mbGFncyZOUSk9PUNIQVIpeworICAgICAgaWYodC0+ZmxhZ3MmVU5TSUdORUQpCisJbG89RFdfQVRFX3Vuc2lnbmVkX2NoYXI7CisgICAgICBlbHNlCisJbG89RFdfQVRFX3NpZ25lZF9jaGFyOworICAgIH1lbHNlIGlmKCh0LT5mbGFncyZOUSk9PVZPSUQpeworICAgICAgbG89RFdfQVRFX3Vuc2lnbmVkX2NoYXI7CisgICAgfWVsc2V7CisgICAgICBpZighSVNJTlQodC0+ZmxhZ3MpKSBpZXJyb3IoMCk7CisgICAgICBpZih0LT5mbGFncyZVTlNJR05FRCkKKwlsbz1EV19BVEVfdW5zaWduZWQ7CisgICAgICBlbHNlCisJbG89RFdfQVRFX3NpZ25lZDsKKyAgICB9CisgICAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oKHVuc2lnbmVkIGxvbmcpbG8pKTsKKyAgICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHNpemV0YWJbdC0+ZmxhZ3MmTlFdKTsKKyAgfWVsc2UgaWYoSVNBUlJBWSh0LT5mbGFncykpeworICAgIGxvPWR3YXJmMl90eXBlKGYsdC0+bmV4dCk7CisgICAgbD0rK2xhYmVsOworICAgIGVtaXQoZiwiJXMlZDpcbiIsbHAsbCk7CisgICAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oQVJSQVlUWVBFKSk7CisgICAgZW1pdChmLCJcdCVzXHQlcyVkXG4iLGRhLGxwLGxvKTsKKyAgICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShBUlJBWURJTSkpOworICAgIGR3YXJmMl9wcmludF91bGViMTI4KGYsenVtc3ViKHQtPnNpemUsdWwyenVtKDFVTCkpKTsKKyAgICBlbWl0KGYsIlx0JXNcdDBcbiIsZHdhcmZkMSk7CisgIH1lbHNlIGlmKElTU1RSVUNUKHQtPmZsYWdzKXx8SVNVTklPTih0LT5mbGFncykpeworICAgIGlmKHQtPmV4YWN0LT5sYWJlbD4wKXsKKyAgICAgIGw9dC0+ZXhhY3QtPmxhYmVsOworICAgIH1lbHNleworICAgICAgaW50IGksKnRsO3ptYXggb2Zmc2V0PWwyem0oMEwpLGFsOworICAgICAgdHlwZSAqdHA7CisgICAgICBsPSsrbGFiZWw7CisgICAgICB0LT5leGFjdC0+bGFiZWw9bDsKKyAgICAgIHRsPW15bWFsbG9jKHQtPmV4YWN0LT5jb3VudCpzaXplb2YoKnRsKSk7CisgICAgICBmb3IoaT0wO2k8dC0+ZXhhY3QtPmNvdW50O2krKykKKwl0bFtpXT1kd2FyZjJfdHlwZShmLCgqdC0+ZXhhY3QtPnNsKVtpXS5zdHlwKTsKKyAgICAgIGVtaXQoZiwiJXMlZDpcbiIsbHAsbCk7CisgICAgICBpZih0LT5leGFjdC0+aWRlbnRpZmllcil7CisJaWYoSVNTVFJVQ1QodC0+ZmxhZ3MpKQorCSAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZixTVFJVQ1RUQUcpOworCWVsc2UKKwkgIGR3YXJmMl9wcmludF91bGViMTI4KGYsVU5JT05UQUcpOworCWR3YXJmMl9wcmludF91bGViMTI4KGYsc3pvZih0KSk7CisJZm9yKHA9dC0+ZXhhY3QtPmlkZW50aWZpZXI7KnA7cCsrKSBlbWl0KGYsIlx0JXNcdCVkXG4iLGR3YXJmZDEsKnApOworCWVtaXQoZiwiXHQlc1x0MFxuIixkd2FyZmQxKTsKKyAgICAgIH1lbHNleworCWlmKElTU1RSVUNUKHQtPmZsYWdzKSkKKwkgIGR3YXJmMl9wcmludF91bGViMTI4KGYsU1RSVUNUVFlQRSk7CisJZWxzZQorCSAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZixVTklPTlRZUEUpOworCWR3YXJmMl9wcmludF91bGViMTI4KGYsc3pvZih0KSk7CisgICAgICB9CisgICAgICBmb3IoaT0wO2k8dC0+ZXhhY3QtPmNvdW50O2krKyl7CisJZHdhcmYyX3ByaW50X3VsZWIxMjgoZixNRU1CRVJUWVBFKTsKKwlmb3IocD0oKnQtPmV4YWN0LT5zbClbaV0uaWRlbnRpZmllcjsqcDtwKyspIGVtaXQoZiwiXHQlc1x0JWRcbiIsZHdhcmZkMSwqcCk7CisJZW1pdChmLCJcdCVzXHQwXG4iLGR3YXJmZDEpOworCWVtaXQoZiwiXHQlc1x0JXMlZFxuIixkYSxscCx0bFtpXSk7CisJZHdhcmYyX3ByaW50X3VsZWIxMjgoZix6dW1hZGQoZHdhcmYyX3VsZWIxMjhfc2l6ZSh6bTJ6dW0ob2Zmc2V0KSksdWwyenVtKDFMKSkpOworCXRwPSgqdC0+ZXhhY3QtPnNsKVtpXS5zdHlwOworCWFsPWZhbGlnbih0cCk7CisJb2Zmc2V0PXptbXVsdCh6bWRpdih6bWFkZChvZmZzZXQsem1zdWIoYWwsbDJ6bSgxTCkpKSxhbCksYWwpOworCWVtaXQoZiwiXHQlc1x0JWRcbiIsZHdhcmZkMSxEV19PUF9wbHVzX3Vjb25zdCk7CisJZHdhcmYyX3ByaW50X3VsZWIxMjgoZix6bTJ6dW0ob2Zmc2V0KSk7CisJaWYoSVNTVFJVQ1QodC0+ZmxhZ3MpKQorCSAgb2Zmc2V0PXptYWRkKG9mZnNldCxzem9mKHRwKSk7ICAgCQorICAgICAgfQorICAgICAgZW1pdChmLCJcdCVzXHQwXG4iLGR3YXJmZDEpOworICAgICAgZnJlZSh0bCk7CisgICAgfQorICB9ZWxzZSBpZihJU0ZVTkModC0+ZmxhZ3MpKXsKKyAgICBpbnQgKnRsLGk7CisgICAgbD0rK2xhYmVsOworICAgIHRsPW15bWFsbG9jKHQtPmV4YWN0LT5jb3VudCpzaXplb2YoKnRsKSk7CisgICAgZm9yKGk9MDtpPHQtPmV4YWN0LT5jb3VudDtpKyspeworICAgICAgaWYoKCgqdC0+ZXhhY3QtPnNsKVtpXS5zdHlwLT5mbGFncyZOUSkhPVZPSUQpCisJdGxbaV09ZHdhcmYyX3R5cGUoZiwoKnQtPmV4YWN0LT5zbClbaV0uc3R5cCk7CisgICAgfQorICAgIGlmKCh0LT5uZXh0LT5mbGFncyZOUSk9PVZPSUQpeworICAgICAgZW1pdChmLCIlcyVkOlxuIixscCxsKTsKKyAgICAgIGR3YXJmMl9wcmludF91bGViMTI4KGYsVk9JREZVTkNUWVBFKTsKKyAgICB9ZWxzZXsKKyAgICAgIGxvPWR3YXJmMl90eXBlKGYsdC0+bmV4dCk7CisgICAgICBlbWl0KGYsIiVzJWQ6XG4iLGxwLGwpOworICAgICAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZixGVU5DVFlQRSk7CisgICAgICBlbWl0KGYsIlx0JXNcdCVzJWRcbiIsZGEsbHAsbG8pOworICAgIH0KKyAgICBmb3IoaT0wO2k8dC0+ZXhhY3QtPmNvdW50O2krKyl7CisgICAgICBpZigoKCp0LT5leGFjdC0+c2wpW2ldLnN0eXAtPmZsYWdzJk5RKSE9Vk9JRCl7CisJZHdhcmYyX3ByaW50X3VsZWIxMjgoZixQQVJNVFlQRSk7CisJZW1pdChmLCJcdCVzXHQlcyVkXG4iLGRhLGxwLHRsW2ldKTsKKyAgICAgIH0KKyAgICB9CisgICAgZW1pdChmLCJcdCVzXHQwXG4iLGR3YXJmZDEpOworICAgIGZyZWUodGwpOworICB9ZWxzZXsKKyAgICBwcmludGYoIiVkXG4iLHQtPmZsYWdzKTsKKyAgICBpZXJyb3IoMCk7CisgIH0KKyAgaWYodC0+ZmxhZ3MmVk9MQVRJTEUpeworICAgIGxvPWw7bD0rK2xhYmVsOworICAgIGVtaXQoZiwiJXMlZDpcbiIsbHAsbCk7CisgICAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oVk9MQVRJTEVUWVBFKSk7CisgICAgZW1pdChmLCJcdCVzXHQlcyVkXG4iLGRhLGxwLGxvKTsKKyAgfQorICBpZih0LT5mbGFncyZDT05TVCl7CisgICAgbG89bDtsPSsrbGFiZWw7CisgICAgZW1pdChmLCIlcyVkOlxuIixscCxsKTsKKyAgICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShDT05TVFRZUEUpKTsKKyAgICBlbWl0KGYsIlx0JXNcdCVzJWRcbiIsZGEsbHAsbG8pOworICB9CisgIHJldHVybiBsOworfQorc3RhdGljIHZvaWQgZHdhcmYyX3ZhcihGSUxFICpmLFZhciAqdikKK3sKKyAgY2hhciAqcDtpbnQgbDsKKyAgaWYoISh2LT5mbGFncyYoREVGSU5FRHxURU5UQVRJVkUpKSkgcmV0dXJuOworICBpZih2LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMmJnYtPm5lc3Rpbmc+MCYmISh2LT5mbGFncyYoVVNFREFTU09VUkNFfFVTRURBU0RFU1QpKSkgcmV0dXJuOworCisgIGlmKElTRlVOQyh2LT52dHlwLT5mbGFncykpIHJldHVybjsKKyAgaWYoKnYtPmlkZW50aWZpZXImJnYtPnN0b3JhZ2VfY2xhc3MhPVRZUEVERUYpeworICAgIGw9ZHdhcmYyX3R5cGUoZix2LT52dHlwKTsKKyAgICBpZigodi0+c3RvcmFnZV9jbGFzcz09QVVUT3x8di0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpJiYoIXptbGVxKGwyem0oMEwpLHYtPm9mZnNldCl8fHYtPnJlZykpeworICAgICAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRk9STUFMUEFSQU1FVEVSKSk7CisgICAgfWVsc2V7CisgICAgICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShWQVJJQUJMRSkpOworICAgIH0KKyAgICBmb3IocD12LT5pZGVudGlmaWVyOypwO3ArKykgZW1pdChmLCJcdCVzXHQlZFxuIixkd2FyZmQxLCpwKTsKKyAgICBlbWl0KGYsIlx0JXNcdDBcbiIsZHdhcmZkMSk7CisgICAgZW1pdChmLCJcdCVzXHQlcyVkXG4iLGRhLGxwLGwpOworICAgIGlmKCh2LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHx2LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikmJighem1sZXEobDJ6bSgwTCksdi0+b2Zmc2V0KXx8di0+cmVnKSl7CisgICAgICAvKiBubyBleHRlcm5hbCBmbGFnIGZvciBmb3JtYWwtcGFyYW1ldGVyICovCisgICAgfWVsc2V7CisgICAgICBlbWl0KGYsIlx0JXNcdCVkXG4iLGR3YXJmZDEsKHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTikpOworICAgIH0KKyAgICBpZigoIXYtPmRmaWxlbmFtZXx8IXYtPmRsaW5lKSYmKCF2LT5maWxlbmFtZXx8IXYtPmxpbmUpKSBpZXJyb3IoMCk7CisgICAgaWYodi0+ZGZpbGVuYW1lKXsKKyAgICAgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKCh1bnNpZ25lZCBsb25nKWR3YXJmMl9maWxlKHYtPmRmaWxlbmFtZSkpKTsKKyAgICAgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKCh1bnNpZ25lZCBsb25nKXYtPmRsaW5lKSk7CisgICAgfWVsc2V7CisgICAgICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bSgodW5zaWduZWQgbG9uZylkd2FyZjJfZmlsZSh2LT5maWxlbmFtZSkpKTsKKyAgICAgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKCh1bnNpZ25lZCBsb25nKXYtPmxpbmUpKTsKKyAgICB9CisgICAgeyAgLypGSVhNRSEqLworICAgICAgb2JqIG87CisgICAgICBvLmZsYWdzPVZBUjsKKyAgICAgIG8udmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICBvLnY9djsKKyNpZiBIQVZFX0xPQ0FUSU9OX0xJU1RTCisgICAgICBlbWl0KGYsIlx0JXNcdFwiLmRlYnVnX2xvY1wiXG4iLGRzZWMpOworICAgICAgKytsYWJlbDsKKyAgICAgIGVtaXQoZiwiJXMlZDpcbiIsbHAsbGFiZWwpOworICAgICAgZW1pdChmLCJcdCVzXHQwXG4iLGRhKTsKKyAgICAgIGVtaXQoZiwiXHQlc1x0LTFcbiIsZGEpOworICAgICAgZHdhcmYyX3ByaW50X2xvY2F0aW9uKGYsJm8pOworICAgICAgZW1pdChmLCJcdCVzXHQwXG4iLGRhKTsKKyAgICAgIGVtaXQoZiwiXHQlc1x0MFxuIixkYSk7ICAgICAgCisgICAgICBlbWl0KGYsIlx0JXNcdFwiLmRlYnVnX2luZm9cIlxuIixkc2VjKTsKKyAgICAgIGVtaXQoZiwiXHQlc1x0JXMlZFxuIixkYSxscCxsYWJlbCk7CisjZWxzZQorICAgICAgZHdhcmYyX3ByaW50X2xvY2F0aW9uKGYsJm8pOworI2VuZGlmICAgICAgCisgICAgfQorICB9Cit9CitzdGF0aWMgdm9pZCBkd2FyZjJfcHJpbnRfY29tcF91bml0X2hlYWRlcihGSUxFICpmKQoreworICBjaGFyICpwOworICBleHRlcm4gY2hhciAqY29weXJpZ2h0OyAvKiBub3QgbmljZSAqLworICBleHRlcm4gY2hhciAqaW5uYW1lOyAvKiBub3QgbmljZSAqLworICAKKyAgYWJicmV2X2xhYmVsPSsrbGFiZWw7CisgIGVtaXQoZiwiXHQlc1x0XCIuZGVidWdfYWJicmV2XCJcbiIsZHNlYyk7CisgIGVtaXQoZiwiJXMlZDpcbiIsbHAsYWJicmV2X2xhYmVsKTsKKworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShDT01QX1VOSVQpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfVEFHX2NvbXBpbGVfdW5pdCkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19DSElMRFJFTl95ZXMpKTsgCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0FUX2xhbmd1YWdlKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0ZPUk1fdWRhdGEpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQVRfc3RtdF9saXN0KSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0ZPUk1fcmVmX2FkZHIpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQVRfcHJvZHVjZXIpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfRk9STV9zdHJpbmcpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQVRfaWRlbnRpZmllcl9jYXNlKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0ZPUk1fdWRhdGEpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQVRfbmFtZSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19GT1JNX3N0cmluZykpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bSgwVUwpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oMFVMKSk7CisKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oU1VCUFJPR1JBTSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19UQUdfc3VicHJvZ3JhbSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19DSElMRFJFTl95ZXMpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQVRfbmFtZSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19GT1JNX3N0cmluZykpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19BVF9sb3dfcGMpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfRk9STV9hZGRyKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0FUX2hpZ2hfcGMpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfRk9STV9hZGRyKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0FUX3R5cGUpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfRk9STV9yZWZfYWRkcikpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19BVF9leHRlcm5hbCkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19GT1JNX2ZsYWcpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQVRfZGVjbF9maWxlKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0ZPUk1fdWRhdGEpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQVRfZGVjbF9saW5lKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0ZPUk1fdWRhdGEpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQVRfZnJhbWVfYmFzZSkpOworI2lmIEhBVkVfTE9DQVRJT05fTElTVFMKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfRk9STV9yZWZfYWRkcikpOworI2Vsc2UKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfRk9STV9ibG9jazIpKTsKKyNlbmRpZgorICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bSgwTCkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bSgwTCkpOworCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKFNVQlBST0dSQU1WT0lEKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX1RBR19zdWJwcm9ncmFtKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0NISUxEUkVOX3llcykpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19BVF9uYW1lKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0ZPUk1fc3RyaW5nKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0FUX2xvd19wYykpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19GT1JNX2FkZHIpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQVRfaGlnaF9wYykpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19GT1JNX2FkZHIpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQVRfZXh0ZXJuYWwpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfRk9STV9mbGFnKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0FUX2RlY2xfZmlsZSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19GT1JNX3VkYXRhKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0FUX2RlY2xfbGluZSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19GT1JNX3VkYXRhKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0FUX2ZyYW1lX2Jhc2UpKTsKKyNpZiBIQVZFX0xPQ0FUSU9OX0xJU1RTCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0ZPUk1fcmVmX2FkZHIpKTsKKyNlbHNlCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0ZPUk1fYmxvY2syKSk7CisjZW5kaWYKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oMEwpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oMEwpKTsKKworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShGT1JNQUxQQVJBTUVURVIpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXIpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQ0hJTERSRU5fbm8pKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQVRfbmFtZSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19GT1JNX3N0cmluZykpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19BVF90eXBlKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0ZPUk1fcmVmX2FkZHIpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQVRfZGVjbF9maWxlKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0ZPUk1fdWRhdGEpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQVRfZGVjbF9saW5lKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0ZPUk1fdWRhdGEpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQVRfbG9jYXRpb24pKTsKKyNpZiBIQVZFX0xPQ0FUSU9OX0xJU1RTCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0ZPUk1fcmVmX2FkZHIpKTsKKyNlbHNlCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0ZPUk1fYmxvY2syKSk7CisjZW5kaWYKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oMEwpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oMEwpKTsKKworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShWQVJJQUJMRSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19UQUdfdmFyaWFibGUpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQ0hJTERSRU5fbm8pKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQVRfbmFtZSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19GT1JNX3N0cmluZykpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19BVF90eXBlKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0ZPUk1fcmVmX2FkZHIpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQVRfZXh0ZXJuYWwpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfRk9STV9mbGFnKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0FUX2RlY2xfZmlsZSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19GT1JNX3VkYXRhKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0FUX2RlY2xfbGluZSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19GT1JNX3VkYXRhKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0FUX2xvY2F0aW9uKSk7CisjaWYgSEFWRV9MT0NBVElPTl9MSVNUUworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19GT1JNX3JlZl9hZGRyKSk7CisjZWxzZQorICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19GT1JNX2Jsb2NrMikpOworI2VuZGlmCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKDBMKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKDBMKSk7CisKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oQkFTRVRZUEUpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfVEFHX2Jhc2VfdHlwZSkpOyAgCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0NISUxEUkVOX25vKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0FUX25hbWUpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfRk9STV9zdHJpbmcpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQVRfZW5jb2RpbmcpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfRk9STV91ZGF0YSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19BVF9ieXRlX3NpemUpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfRk9STV91ZGF0YSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bSgwTCkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bSgwTCkpOworCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKFBPSU5URVJUWVBFKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX1RBR19wb2ludGVyX3R5cGUpKTsgIAorICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19DSElMRFJFTl9ubykpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19BVF90eXBlKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0ZPUk1fcmVmX2FkZHIpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oMEwpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oMEwpKTsgIAorCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKENPTlNUVFlQRSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19UQUdfY29uc3RfdHlwZSkpOyAgCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0NISUxEUkVOX25vKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0FUX3R5cGUpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfRk9STV9yZWZfYWRkcikpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bSgwTCkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bSgwTCkpOworCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKFZPTEFUSUxFVFlQRSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19UQUdfdm9sYXRpbGVfdHlwZSkpOyAgCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0NISUxEUkVOX25vKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0FUX3R5cGUpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfRk9STV9yZWZfYWRkcikpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bSgwTCkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bSgwTCkpOworCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKEFSUkFZVFlQRSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19UQUdfYXJyYXlfdHlwZSkpOyAgCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0NISUxEUkVOX3llcykpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19BVF90eXBlKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0ZPUk1fcmVmX2FkZHIpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oMEwpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oMEwpKTsKKworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShBUlJBWURJTSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19UQUdfc3VicmFuZ2VfdHlwZSkpOyAgCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0NISUxEUkVOX25vKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0FUX3VwcGVyX2JvdW5kKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0ZPUk1fdWRhdGEpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oMEwpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oMEwpKTsKKworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShTVFJVQ1RUWVBFKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX1RBR19zdHJ1Y3R1cmVfdHlwZSkpOyAgCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0NISUxEUkVOX3llcykpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19BVF9ieXRlX3NpemUpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfRk9STV91ZGF0YSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bSgwTCkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bSgwTCkpOworCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKFVOSU9OVFlQRSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19UQUdfdW5pb25fdHlwZSkpOyAgCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0NISUxEUkVOX3llcykpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19BVF9ieXRlX3NpemUpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfRk9STV91ZGF0YSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bSgwTCkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bSgwTCkpOworCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKFNUUlVDVFRBRykpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19UQUdfc3RydWN0dXJlX3R5cGUpKTsgIAorICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19DSElMRFJFTl95ZXMpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQVRfYnl0ZV9zaXplKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0ZPUk1fdWRhdGEpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQVRfbmFtZSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19GT1JNX3N0cmluZykpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bSgwTCkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bSgwTCkpOworCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKFVOSU9OVEFHKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX1RBR191bmlvbl90eXBlKSk7ICAKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfQ0hJTERSRU5feWVzKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0FUX2J5dGVfc2l6ZSkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19GT1JNX3VkYXRhKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0FUX25hbWUpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfRk9STV9zdHJpbmcpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oMEwpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oMEwpKTsKKworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShNRU1CRVJUWVBFKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX1RBR19tZW1iZXIpKTsgIAorICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19DSElMRFJFTl9ubykpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19BVF9uYW1lKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0ZPUk1fc3RyaW5nKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0FUX3R5cGUpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfRk9STV9yZWZfYWRkcikpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19BVF9kYXRhX21lbWJlcl9sb2NhdGlvbikpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19GT1JNX2Jsb2NrKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKDBMKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKDBMKSk7CisKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRlVOQ1RZUEUpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfVEFHX3N1YnJvdXRpbmVfdHlwZSkpOyAgCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0NISUxEUkVOX3llcykpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShEV19BVF90eXBlKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0ZPUk1fcmVmX2FkZHIpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oMEwpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oMEwpKTsKKworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bShWT0lERlVOQ1RZUEUpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfVEFHX3N1YnJvdXRpbmVfdHlwZSkpOyAgCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0NISUxEUkVOX3llcykpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bSgwTCkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bSgwTCkpOworCisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKFBBUk1UWVBFKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX1RBR19mb3JtYWxfcGFyYW1ldGVyKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0NISUxEUkVOX25vKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0FUX3R5cGUpKTsKKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oRFdfRk9STV9yZWZfYWRkcikpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bSgwTCkpOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bSgwTCkpOworCisKKyAgaW5mb19zdGFydD0rK2xhYmVsO2luZm9fZW5kPSsrbGFiZWw7CisgIGVtaXQoZiwiXHQlc1x0XCIuZGVidWdfaW5mb1wiXG4iLGRzZWMpOworICAKKyAgLyogaGVhZGVyICovCisgIGVtaXQoZiwiJXMlZDpcbiIsbHAsaW5mb19zdGFydCk7CisgIGVtaXQoZiwiXHQlc1x0JXMlZC0lcyVkLTRcbiIsZHdhcmZkNCxscCxpbmZvX2VuZCxscCxpbmZvX3N0YXJ0KTsKKyAgZW1pdChmLCJcdCVzXHQyXG4iLGR3YXJmZDIpOyAvKiB2ZXJzaW9uICovCisgIGVtaXQoZiwiXHQlc1x0JXMlZFxuIixkd2FyZmQ0LGxwLGFiYnJldl9sYWJlbCk7CisgIGVtaXQoZiwiXHQlc1x0JWRcbiIsZHdhcmZkMSxzaXplb2ZfYWRkcik7CisgIAorICAvKiBjb21waWxlX3VuaXQgKi8KKyAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oQ09NUF9VTklUKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKERXX0xBTkdfQzg5KSk7CisgIGxpbmVfc3RhcnQ9KytsYWJlbDtsaW5lX2VuZD0rK2xhYmVsOworICBlbWl0KGYsIlx0JXNcdCVzJWRcbiIsZGEsbHAsbGluZV9zdGFydCk7CisgIGZvcihwPWNvcHlyaWdodDsqcDtwKyspIGVtaXQoZiwiXHQlc1x0JWRcbiIsZHdhcmZkMSwqcCk7CisgIGVtaXQoZiwiXHQlc1x0MFxuIixkd2FyZmQxKTsKKyAgZW1pdChmLCJcdCVzXHQlZFxuIixkd2FyZmQxLERXX0lEX2Nhc2Vfc2Vuc2l0aXZlKTsKKyAgZm9yKHA9aW5uYW1lP2lubmFtZToiPG11bHRpcGxlPiI7KnA7cCsrKSBlbWl0KGYsIlx0JXNcdCVkXG4iLGR3YXJmZDEsKnApOworICBlbWl0KGYsIlx0JXNcdDBcbiIsZHdhcmZkMSk7Cit9CitzdGF0aWMgdm9pZCBkd2FyZjJfY2xlYW51cChGSUxFICpmKQoreworICBpbnQgaSxsaW5lLGZpbGUsbGFiZWwsbGVuZ3RoO2NoYXIgKnA7CisgIHRkd2FyZjJfbGluZV9pbmZvICpsaSwqbTsKKyAgVmFyICp2bDsKKyAgc3RydWN0X2RlY2xhcmF0aW9uICpzZDsKKyAgZW1pdChmLCJcdCVzXHRcIi5kZWJ1Z19saW5lXCJcbiIsZHNlYyk7CisgIC8qIGxpbmUgaW5mbyAqLworICBlbWl0KGYsIiVzJWQ6XG4iLGxwLGxpbmVfc3RhcnQpOworICBlbWl0KGYsIlx0JXNcdCVzJWQtJXMlZC00XG4iLGR3YXJmZDQsbHAsbGluZV9lbmQsbHAsbGluZV9zdGFydCk7IC8qIGxlbmd0aCAqLworICBlbWl0KGYsIlx0JXNcdDJcbiIsZHdhcmZkMik7IC8qIHZlcnNpb24gKi8KKyAgbGVuZ3RoPTE2OworICBmb3IoaT0wO2k8bmFtZWNvdW50O2krKykgbGVuZ3RoKz1zdHJsZW4obmFtZXNbaV0pKzQ7CisgIGVtaXQoZiwiXHQlc1x0JWRcbiIsZHdhcmZkNCxsZW5ndGgpOyAvKiBwcm9sb2d1ZSBsZW5ndGggKi8KKyAgZW1pdChmLCJcdCVzXHQxXG4iLGR3YXJmZDEpOyAvKiBpbnN0cnVjdGlvbl9sZW5ndGggKi8KKyAgZW1pdChmLCJcdCVzXHQxXG4iLGR3YXJmZDEpOyAvKiBpc19zdG10ICovCisgIGVtaXQoZiwiXHQlc1x0LTEwXG4iLGR3YXJmZDEpOyAvKiBsaW5lX2Jhc2UgKi8KKyAgZW1pdChmLCJcdCVzXHQyNDVcbiIsZHdhcmZkMSk7IC8qIGxpbmVfcmFuZ2UgKi8KKyAgZW1pdChmLCJcdCVzXHQxMFxuIixkd2FyZmQxKTsgLyogb3Bjb2RlX2Jhc2UgKi8KKyAgZW1pdChmLCJcdCVzXHQwXG4iLGR3YXJmZDEpOyAvKiBzdGFuZGFyZCBvcGNvZGUgYXJndW1lbnRzICovCisgIGVtaXQoZiwiXHQlc1x0MVxuIixkd2FyZmQxKTsKKyAgZW1pdChmLCJcdCVzXHQxXG4iLGR3YXJmZDEpOworICBlbWl0KGYsIlx0JXNcdDFcbiIsZHdhcmZkMSk7CisgIGVtaXQoZiwiXHQlc1x0MVxuIixkd2FyZmQxKTsKKyAgZW1pdChmLCJcdCVzXHQwXG4iLGR3YXJmZDEpOworICBlbWl0KGYsIlx0JXNcdDBcbiIsZHdhcmZkMSk7CisgIGVtaXQoZiwiXHQlc1x0MFxuIixkd2FyZmQxKTsKKyAgZW1pdChmLCJcdCVzXHQxXG4iLGR3YXJmZDEpOworICBlbWl0KGYsIlx0JXNcdDBcbiIsZHdhcmZkMSk7IC8qIGluY2x1ZGUgZGlyZWN0b3JpZXMgKi8KKyAgZm9yKGk9MDtpPG5hbWVjb3VudDtpKyspeworICAgIGZvcihwPW5hbWVzW2ldOypwO3ArKykgZW1pdChmLCJcdCVzXHQlZFxuIixkd2FyZmQxLCpwKTsKKyAgICBlbWl0KGYsIlx0JXNcdDBcbiIsZHdhcmZkMSk7CisgICAgZW1pdChmLCJcdCVzXHQwXG4iLGR3YXJmZDEpOworICAgIGVtaXQoZiwiXHQlc1x0MFxuIixkd2FyZmQxKTsKKyAgICBlbWl0KGYsIlx0JXNcdDBcbiIsZHdhcmZkMSk7CisgIH0KKyAgZW1pdChmLCJcdCVzXHQwXG4iLGR3YXJmZDEpOyAvKiBmaWxlIG5hbWVzICovICAKKyAgCisgIGZpbGU9LTE7bGluZT0xO2xhYmVsPS0xOworICBsaT1kd2FyZjJfZmlyc3RfbGk7CisgIHdoaWxlKGxpKXsKKyAgICBtPWxpLT5uZXh0OworICAgIGlmKGxpLT5maWxlIT1maWxlKXsKKyAgICAgIGZpbGU9bGktPmZpbGU7CisgICAgICBlbWl0KGYsIlx0JXNcdCVkXG4iLGR3YXJmZDEsRFdfTE5TX3NldF9maWxlKTsKKyAgICAgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKChsb25nKWZpbGUpKTsKKyAgICB9CisgICAgaWYoIWxpLT5pZCYmbGktPmxhYmVsIT1sYWJlbCl7CisgICAgICBsYWJlbD1saS0+bGFiZWw7CisgICAgICBlbWl0KGYsIlx0JXNcdDBcbiIsZHdhcmZkMSk7IC8qIGV4dGVuZGVkIG9wY29kZSAqLworICAgICAgZW1pdChmLCJcdCVzXHQlZFxuIixkd2FyZmQxLDErc2l6ZW9mX2FkZHIpOyAvKiBsZW5ndGggKi8KKyAgICAgIGVtaXQoZiwiXHQlc1x0JWRcbiIsZHdhcmZkMSxEV19MTkVfc2V0X2FkZHJlc3MpOworICAgICAgZW1pdChmLCJcdCVzXHQlcyVkXG4iLGRhLGxwLGxhYmVsKTsgICAgICAKKyAgICB9CisgICAgaWYobGktPmlkKXsKKyAgICAgIGVtaXQoZiwiXHQlc1x0MFxuIixkd2FyZmQxKTsgLyogZXh0ZW5kZWQgb3Bjb2RlICovCisgICAgICBlbWl0KGYsIlx0JXNcdCVkXG4iLGR3YXJmZDEsMStzaXplb2ZfYWRkcik7IC8qIGxlbmd0aCAqLworICAgICAgZW1pdChmLCJcdCVzXHQlZFxuIixkd2FyZmQxLERXX0xORV9zZXRfYWRkcmVzcyk7CisgICAgICBlbWl0KGYsIlx0JXNcdCVzJXNcbiIsZGEsaXAsbGktPmlkKTsKKyAgICAgIGZyZWUobGktPmlkKTsKKyAgICB9ICAgICAgCisgICAgaWYobGktPmxpbmUhPWxpbmUpeworICAgICAgZW1pdChmLCJcdCVzXHQlZFxuIixkd2FyZmQxLERXX0xOU19hZHZhbmNlX2xpbmUpOworICAgICAgZHdhcmYyX3ByaW50X3NsZWIxMjgoZixsMnptKChsb25nKShsaS0+bGluZS1saW5lKSkpOworICAgICAgbGluZT1saS0+bGluZTsKKyAgICB9CisgICAgZW1pdChmLCJcdCVzXHQlZFxuIixkd2FyZmQxLERXX0xOU19jb3B5KTsKKyAgICBmcmVlKGxpKTsKKyAgICBsaT1tOworICB9CisgIGVtaXQoZiwiXHQlc1x0MCwxLDFcbiIsZHdhcmZkMSk7IC8qIGVuZF9zZXF1ZW5jZSAqLworICBlbWl0KGYsIiVzJWQ6XG4iLGxwLGxpbmVfZW5kKTsKKyAgZW1pdChmLCJcdCVzXHRcIi5kZWJ1Z19pbmZvXCJcbiIsZHNlYyk7CisgIGZvcihzZD1maXJzdF9zZFswXTtzZDtzZD1zZC0+bmV4dCl7CisgICAgaWYoc2QtPmlkZW50aWZpZXIpeworICAgICAgc3RhdGljIHR5cGUgc3R5cDsKKyAgICAgIHN0eXAuZmxhZ3M9c2QtPnR5cDsKKyAgICAgIHN0eXAuZXhhY3Q9c2Q7CisgICAgICBzZC0+bGFiZWw9MDsKKyAgICAgIGR3YXJmMl90eXBlKGYsJnN0eXApOworICAgIH0KKyAgfQorICBmb3Iodmw9Zmlyc3RfdmFyWzBdO3ZsO3ZsPXZsLT5uZXh0KQorICAgIGR3YXJmMl92YXIoZix2bCk7CisgIGZvcih2bD1maXJzdF9leHQ7dmw7dmw9dmwtPm5leHQpCisgICAgZHdhcmYyX3ZhcihmLHZsKTsKKyAgZW1pdChmLCJcdCVzXHQwXG4iLGR3YXJmZDEpOworICBlbWl0KGYsIiVzJWQ6XG4iLGxwLGluZm9fZW5kKTsKKyAgZm9yKGk9MDtpPG5hbWVjb3VudDtpKyspIGZyZWUobmFtZXNbaV0pOworICBmcmVlKG5hbWVzKTsKK30KKy8qIGdlbmVyYXRlIGxpbmUgaW5mbyBmb3IgSUMgcCwgcmV0dXJuIDAgaWYgbm90aGluZyBoYWQgdG8gYmUgZ2VuZXJhdGVkICovCitzdGF0aWMgdm9pZCBkd2FyZjJfbGluZV9pbmZvKEZJTEUgKmYsSUMgKnApCit7CisgIHN0YXRpYyBpbnQgbGluZSxmaWxlLG47CisgIHRkd2FyZjJfbGluZV9pbmZvICpuZXc7CisgIGlmKCFmKSByZXR1cm47CisgIGlmKHAtPmxpbmU9PTApIHJldHVybjsKKyAgaWYoIXAtPmZpbGUpIGllcnJvcigwKTsKKyAgbj1kd2FyZjJfZmlsZShwLT5maWxlKTsKKyAgaWYobiE9ZmlsZXx8cC0+bGluZSE9bGluZSl7CisgICAgZmlsZT1uOworICAgIGxpbmU9cC0+bGluZTsKKyAgICBlbWl0KGYsIiVzJWQ6XG4iLGxwLCsrbGFiZWwpOworICAgIGR3YXJmMl9hZGRfbGluZShmaWxlLGxpbmUsbGFiZWwsMCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgZHdhcmYyX2Z1bmN0aW9uKEZJTEUgKmYsVmFyICp2LGludCBlbmRsYWJlbCkKK3sKKyAgY2hhciAqcDtpbnQgbDtWYXIgKnZsOworICBzdHJ1Y3Qgc3RydWN0X2lkZW50aWZpZXIgKnNpOworICAvKiBzdWJwcm9ncmFtICovCisgIGlmKCFmKSByZXR1cm47CisgIGVtaXQoZiwiXHQlc1x0XCIuZGVidWdfaW5mb1wiXG4iLGRzZWMpOworICBpZighdi0+dnR5cHx8IXYtPnZ0eXAtPm5leHQpIGllcnJvcigwKTsKKyAgaWYoKHYtPnZ0eXAtPm5leHQtPmZsYWdzJk5RKT09Vk9JRCl7CisgICAgZHdhcmYyX3ByaW50X3VsZWIxMjgoZix1bDJ6dW0oU1VCUFJPR1JBTVZPSUQpKTsKKyAgfWVsc2V7CisgICAgbD1kd2FyZjJfdHlwZShmLHYtPnZ0eXAtPm5leHQpOworICAgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKFNVQlBST0dSQU0pKTsKKyAgfQorICBmb3IocD1pcDsqcDtwKyspIGVtaXQoZiwiXHQlc1x0JWRcbiIsZHdhcmZkMSwqcCk7CisgIGZvcihwPXYtPmlkZW50aWZpZXI7KnA7cCsrKSBlbWl0KGYsIlx0JXNcdCVkXG4iLGR3YXJmZDEsKnApOworICBlbWl0KGYsIlx0JXNcdDBcbiIsZHdhcmZkMSk7CisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisgICAgZW1pdChmLCJcdCVzXHQlcyVzXG4iLGRhLGlwLHYtPmlkZW50aWZpZXIpOworICB9ZWxzZXsKKyAgICBlbWl0KGYsIlx0JXNcdCVzJWxkXG4iLGRhLGxwLHptMmwodi0+b2Zmc2V0KSk7ICAgIAorICB9CisgIGVtaXQoZiwiXHQlc1x0JXMlZFxuIixkYSxscCxlbmRsYWJlbCk7CisgIGlmKCh2LT52dHlwLT5uZXh0LT5mbGFncyZOUSkhPVZPSUQpCisgICAgZW1pdChmLCJcdCVzXHQlcyVkXG4iLGRhLGxwLGwpOworICBpZighdi0+ZGZpbGVuYW1lfHx2LT5kbGluZTw9MCkgaWVycm9yKDApOworICBlbWl0KGYsIlx0JXNcdCVkXG4iLGR3YXJmZDEsKHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTikpOworICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pCisgICAgZHdhcmYyX2FkZF9saW5lKGR3YXJmMl9maWxlKHYtPmRmaWxlbmFtZSksdi0+ZGxpbmUsMCx2LT5pZGVudGlmaWVyKTsKKyAgZWxzZQorICAgIGR3YXJmMl9hZGRfbGluZShkd2FyZjJfZmlsZSh2LT5kZmlsZW5hbWUpLHYtPmRsaW5lLChpbnQpem0ybCh2LT5vZmZzZXQpLDApOworICBkd2FyZjJfcHJpbnRfdWxlYjEyOChmLHVsMnp1bSgobG9uZylkd2FyZjJfZmlsZSh2LT5kZmlsZW5hbWUpKSk7CisgIGR3YXJmMl9wcmludF91bGViMTI4KGYsdWwyenVtKChsb25nKXYtPmRsaW5lKSk7CisjaWYgSEFWRV9MT0NBVElPTl9MSVNUUworICBlbWl0KGYsIlx0JXNcdFwiLmRlYnVnX2xvY1wiXG4iLGRzZWMpOworICBlbWl0KGYsIiVzJWQ6XG4iLGxwLCsrbGFiZWwpOworICBlbWl0KGYsIlx0JXNcdDBcbiIsZGEpOworICBlbWl0KGYsIlx0JXNcdC0xXG4iLGRhKTsgCisgIGR3YXJmMl9wcmludF9mcmFtZV9sb2NhdGlvbihmLHYpOworICBlbWl0KGYsIlx0JXNcdDBcbiIsZGEpOworICBlbWl0KGYsIlx0JXNcdDBcbiIsZGEpOyAgIAorICBlbWl0KGYsIlx0JXNcdFwiLmRlYnVnX2luZm9cIlxuIixkc2VjKTsKKyAgZW1pdChmLCJcdCVzXHQlcyVkXG4iLGRhLGxwLGxhYmVsKTsKKyNlbHNlCisgIGR3YXJmMl9wcmludF9mcmFtZV9sb2NhdGlvbihmLHYpOworI2VuZGlmCisKKyAgLyogY2hpbGRyZW4gKi8KKworICAvKkZJWE1FOiBub3QgbmljZSAqLworICBpZihjcm9zc19tb2R1bGUpeworICAgIGlmKCF2LT5maSkgaWVycm9yKDApOworICAgIGZvcih2bD12LT5maS0+dmFyczt2bDt2bD12bC0+bmV4dCkKKyAgICAgIGR3YXJmMl92YXIoZix2bCk7CisgIH1lbHNleworICAgIGZvcih2bD1maXJzdF92YXJbMV07dmw7dmw9dmwtPm5leHQpCisgICAgICBkd2FyZjJfdmFyKGYsdmwpOworICAgIGZvcih2bD1tZXJrX3ZhcmY7dmw7dmw9dmwtPm5leHQpCisgICAgICBkd2FyZjJfdmFyKGYsdmwpOworICB9CisgIAorICAKKyAgZW1pdChmLCJcdCVzXHQwXG4iLGR3YXJmZDEpOworfQpkaWZmIC0tZ2l0IGEvZXJyb3JzLmggYi9lcnJvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDFiNGUwCi0tLSAvZGV2L251bGwKKysrIGIvZXJyb3JzLmgKQEAgLTAsMCArMSwzNzQgQEAKKy8qICAkVkVSOiB2YmNjIChlcnJvcnMuaCkgVjAuOCAgKi8KKworImRlY2xhcmF0aW9uIGV4cGVjdGVkIixFUlJPUnxBTlNJVnxGQVRBTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMCAgICovCisib25seSBvbmUgaW5wdXQgZmlsZSBhbGxvd2VkIixFUlJPUnxOT0xJTkV8RkFUQUwsICAgICAgICAgICAgICAgICAgIC8qICAxICAgKi8KKyJGbGFnIDwlcz4gc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlIixOT0xJTkV8V0FSTklORywgICAgICAgICAgICAgICAgLyogIDIgICAqLworIkZsYWcgPCVzPiBuZWVkcyBzdHJpbmciLE5PTElORXxGQVRBTHxFUlJPUiwgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMyAgICovCisiRmxhZyA8JXM+IG5lZWRzIHZhbHVlIixOT0xJTkV8RkFUQUx8RVJST1IsICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA0ICAgKi8KKyJVbmtub3duIEZsYWcgPCVzPiIsTk9MSU5FfEZBVEFMfEVSUk9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDUgICAqLworIk5vIGlucHV0IGZpbGUiLEVSUk9SfE5PTElORXxGQVRBTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNiAgICovCisiQ291bGQgbm90IG9wZW4gPCVzPiBmb3IgaW5wdXQiLE5PTElORXxGQVRBTHxFUlJPUiwgICAgICAgICAgICAgICAgIC8qICA3ICAgKi8KKyJuZWVkIGEgc3RydWN0IG9yIHVuaW9uIHRvIGdldCBhIG1lbWJlciIsRVJST1J8QU5TSVYsCisidG9vIG1hbnkgKCVkKSBuZXN0ZWQgYmxvY2tzIixFUlJPUnxGQVRBTCwKKyJsZWZ0IGJsb2NrIDAiLEVSUk9SfEFOU0lWLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDEwICAqLworImluY29tcGxldGUgc3RydWN0IixFUlJPUnxBTlNJViwKKyJvdXQgb2YgbWVtb3J5IixFUlJPUnxGQVRBTCwKKyJyZWRlY2xhcmF0aW9uIG9mIHN0cnVjdCA8JXM+IixFUlJPUnxBTlNJViwKKyJpbmNvbXBsZXRlIHR5cGUgKCVzKSBpbiBzdHJ1Y3QiLEVSUk9SfEFOU0lWLAorImZ1bmN0aW9uICglcykgaW4gc3RydWN0L3VuaW9uIixFUlJPUnxBTlNJViwgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMTUgICovCisicmVkZWNsYXJhdGlvbiBvZiBzdHJ1Y3QvdW5pb24gbWVtYmVyIDwlcz4iLEVSUk9SfEFOU0lWLAorInJlZGVjbGFyYXRpb24gb2YgPCVzPiIsRVJST1J8QU5TSVYsCisiaW52YWxpZCBjb25zdGFudCBleHByZXNzaW9uIixFUlJPUnxBTlNJViwKKyJhcnJheSBkaW1lbnNpb24gbXVzdCBiZSBjb25zdGFudCBpbnRlZ2VyIixFUlJPUnxBTlNJViwKKyJubyBkZWNsYXJhdG9yIGFuZCBubyBpZGVudGlmaWVyIGluIHByb3RvdHlwZSIsRVJST1J8QU5TSVZ8RkFUQUwsICAgICAgICAgLyogIDIwICAqLworImludmFsaWQgc3RvcmFnZS1jbGFzcyBpbiBwcm90b3R5cGUiLEVSUk9SfEFOU0lWLAorInZvaWQgbm90IHRoZSBvbmx5IGZ1bmN0aW9uIGFyZ3VtZW50IixFUlJPUnxBTlNJViwKKyI8JXM+IG5vIG1lbWJlciBvZiBzdHJ1Y3QvdW5pb24iLEVSUk9SfEFOU0lWLAorImluY3JlbWVudC9kZWNyZW1lbnQgaXMgb25seSBhbGxvd2VkIGZvciBhaXRobWV0aWMgYW5kIHBvaW50ZXIgdHlwZXMiLEVSUk9SfEFOU0lWLAorImZ1bmN0aW9ucyBtYXkgbm90IHJldHVybiBhcnJheXMgb3IgZnVuY3Rpb25zIixFUlJPUnxBTlNJViwgICAgICAgICAvKiAgMjUgICovCisib25seSBwb2ludGVycyB0byBmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZCIsRVJST1J8QU5TSVYsCisicmVkZWZpbml0aW9uIG9mIHZhciA8JXM+IixFUlJPUnxBTlNJViwKKyJyZWRlY2xhcmF0aW9uIG9mIHZhciA8JXM+IHdpdGggbmV3IHN0b3JhZ2UtY2xhc3MiLEVSUk9SfEFOU0lWLAorImZpcnN0IG9wZXJhbmQgb2YgY29uZGl0aW9uYWwtZXhwcmVzc2lvbiBtdXN0IGJlIGFyaXRobWV0aWMgb3IgcG9pbnRlciB0eXBlIixFUlJPUnxBTlNJViwKKyJtdWx0aXBsZSBkZWZpbml0aW9ucyBvZiB2YXIgPCVzPiIsRVJST1J8QU5TSVYsICAgICAgICAgICAgICAgICAgICAgLyogIDMwICAqLworIm9wZXJhbmRzIG9mIDogZG8gbm90IG1hdGNoIixFUlJPUnxBTlNJViwKKyJmdW5jdGlvbiBkZWZpbml0aW9uIGluIGlubmVyIGJsb2NrIixFUlJPUnxBTlNJViwKKyJyZWRlZmluaXRpb24gb2YgZnVuY3Rpb24gPCVzPiIsRVJST1J8QU5TSVYsCisiaW52YWxpZCBzdG9yYWdlLWNsYXNzIGZvciBmdW5jdGlvbiIsRVJST1J8QU5TSVYsCisiZGVjbGFyYXRpb24tc3BlY2lmaWVycyBleHBlY3RlZCIsRVJST1J8QU5TSVYsICAgICAgICAgICAgICAgICAgICAgIC8qICAzNSAgKi8KKyJkZWNsYXJhdG9yIGV4cGVjdGVkIixFUlJPUnxBTlNJViwKKyI8JXM+IGlzIG5vIHBhcmFtZXRlciIsRVJST1J8QU5TSVYsCisiYXNzaWdubWVudCBvZiBkaWZmZXJlbnQgc3RydWN0cy91bmlvbnMiLEVSUk9SfEFOU0lWLAorImludmFsaWQgdHlwZXMgZm9yIGFzc2lnbm1lbnQiLEVSUk9SfEFOU0lWLAorIm9ubHkgMCBjYW4gYmUgY29tcGFyZWQgYWdhaW5zdCBwb2ludGVyIixXQVJOSU5HfEFOU0lWLCAgICAgICAgICAgICAvKiAgNDAgICovCisicG9pbnRlcnMgZG8gbm90IHBvaW50IHRvIHRoZSBzYW1lIHR5cGUiLFdBUk5JTkd8QU5TSVYsCisiZnVuY3Rpb24gaW5pdGlhbGl6ZWQiLEVSUk9SfEFOU0lWfEZBVEFMLAorImluaXRpYWxpemF0aW9uIG9mIGluY29tcGxldGUgc3RydWN0IixFUlJPUnxGQVRBTHxBTlNJViwKKyJpbml0aWFsaXphdGlvbiBvZiBpbmNvbXBsZXRlIHVuaW9uIixFUlJPUnxGQVRBTHxBTlNJViwKKyJlbXB0eSBpbml0aWFsaXphdGlvbiIsRVJST1J8QU5TSVYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDQ1ICAqLworImluaXRpYWxpemVyIG5vdCBhIGNvbnN0YW50IixFUlJPUnxBTlNJViwKKyJkb3VibGUgdHlwZS1zcGVjaWZpZXIiLFdBUk5JTkd8QU5TSVYsCisiaWxsZWdhbCB0eXBlLXNwZWNpZmllciIsV0FSTklOR3xBTlNJViwKKyJtdWx0aXBsZSBzdG9yYWdlLWNsYXNzZXMiLFdBUk5JTkd8QU5TSVYsCisic3RvcmFnZS1jbGFzcyBzcGVjaWZpZXIgc2hvdWxkIGJlIGZpcnN0IixXQVJOSU5HfEFOU0lWLCAgICAgICAgICAgIC8qICA1MCAgKi8KKyJiaXRmaWVsZCB0eXBlIG5vbi1wb3J0YWJsZSIsV0FSTklORywKKyJiaXRmaWVsZCB3aWR0aCBtdXN0IGJlIGNvbnN0YW50IGludGVnZXIiLFdBUk5JTkd8QU5TSVYsCisic3RydWN0L3VuaW9uIG1lbWJlciBuZWVkcyBpZGVudGlmaWVyIixXQVJOSU5HfEFOU0lWLAorIjsgZXhwZWN0ZWQiLFdBUk5JTkd8QU5TSVYsCisic3RydWN0L3VuaW9uIGhhcyBubyBtZW1iZXJzIixXQVJOSU5HfEFOU0lWLCAgICAgICAgICAgICAgICAgICAgICAgIC8qICA1NSAgKi8KKyJ9IGV4cGVjdGVkIixXQVJOSU5HfEFOU0lWLAorIiwgZXhwZWN0ZWQiLFdBUk5JTkd8QU5TSVYsCisiaW52YWxpZCB0eXBlLXF1YWxpZmllciIsV0FSTklOR3xBTlNJViwKKyIpIGV4cGVjdGVkIixXQVJOSU5HfEFOU0lWLAorImFycmF5IGRpbWVuc2lvbiBoYXMgc2lkZWZ4ICh3aWxsIGJlIGlnbm9yZWQpIixXQVJOSU5HfEFOU0lWLCAgICAgICAvKiAgNjAgICovCisiYXJyYXkgb2Ygc2l6ZSA8PTAgKHNldCB0byAxKSIsV0FSTklOR3xBTlNJViwKKyJdIGV4cGVjdGVkIixXQVJOSU5HfEFOU0lWLAorIm1peGVkIGlkZW50aWZpZXItIGFuZCBwYXJhbWV0ZXItdHlwZS1saXN0IixXQVJOSU5HfEFOU0lWLAorInZhciA8JXM+IHdhcyBuZXZlciBhc3NpZ25lZCBhIHZhbHVlIixXQVJOSU5HfERPTlRXQVJOfElORlVOQywKKyJ2YXIgPCVzPiB3YXMgbmV2ZXIgdXNlZCIsV0FSTklOR3xET05UV0FSTnxJTkZVTkMsICAgICAgICAgICAgICAgICAgLyogIDY1ICAqLworImludmFsaWQgc3RvcmFnZS1jbGFzcyIsV0FSTklOR3xBTlNJViwKKyJ0eXBlIGRlZmF1bHRzIHRvIGludCIsV0FSTklOR3xET05UV0FSTiwKKyJyZWRlY2xhcmF0aW9uIG9mIHZhciA8JXM+IHdpdGggbmV3IHR5cGUiLFdBUk5JTkd8QU5TSVYsCisicmVkZWNsYXJhdGlvbiBvZiBwYXJhbWV0ZXIgPCVzPiIsV0FSTklOR3xBTlNJViwKKyI6IGV4cGVjdGVkIixXQVJOSU5HfEFOU0lWLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDcwICAqLworImlsbGVnYWwgZXNjYXBlLXNlcXVlbmNlIGluIHN0cmluZyIsV0FSTklOR3xBTlNJViwKKyJjaGFyYWN0ZXIgY29uc3RhbnQgY29udGFpbnMgbXVsdGlwbGUgY2hhcnMiLFdBUk5JTkcsCisiY291bGQgbm90IGV2YWx1YXRlIHNpemVvZi1leHByZXNzaW9uIixFUlJPUnxBTlNJViwKKyJcIiBleHBlY3RlZCIsRVJST1J8QU5TSVYsCisic29tZXRoaW5nIHdyb25nIHdpdGggbnVtZXJpYyBjb25zdGFudCIsRVJST1J8QU5TSVYsICAgICAgICAgICAgICAgIC8qICA3NSAgKi8KKyJpZGVudGlmaWVyIGV4cGVjdGVkIixFUlJPUnxBTlNJVnxGQVRBTCwKKyJkZWZpbml0aW9uIGRvZXMgbm90IG1hdGNoIHByZXZpb3VzIGRlY2xhcmF0aW9uIixXQVJOSU5HfEFOU0lWLAorImludGVnZXIgYWRkZWQgdG8gaWxsZWdhbCBwb2ludGVyIixXQVJOSU5HfEFOU0lWLAorIm9mZnNldCBlcXVhbHMgc2l6ZSBvZiBvYmplY3QiLFdBUk5JTkd8RE9OVFdBUk4sCisib2Zmc2V0IG91dCBvZiBvYmplY3QiLFdBUk5JTkd8QU5TSVYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA4MCAgKi8KKyJvbmx5IDAgc2hvdWxkIGJlIGNhc3QgdG8gcG9pbnRlciIsV0FSTklOR3xET05UV0FSTiwKKyJ1bmtub3duIGlkZW50aWZpZXIgPCVzPiIsRVJST1J8QU5TSVYsCisidG9vIGZldyBmdW5jdGlvbiBhcmd1bWVudHMiLFdBUk5JTkd8QU5TSVYsCisiZGl2aXNpb24gYnkgemVybyAocmVzdWx0IHNldCB0byAwKSIsV0FSTklOR3xBTlNJViwKKyJhc3NpZ25tZW50IG9mIGRpZmZlcmVudCBwb2ludGVycyIsV0FSTklOR3xBTlNJViwgICAgICAgICAgICAgICAgICAgLyogIDg1ICAqLworImx2YWx1ZSByZXF1aXJlZCBmb3IgYXNzaWdubWVudCIsRVJST1J8QU5TSVYsCisiYXNzaWdubWVudCB0byBjb25zdGFudCB0eXBlIixFUlJPUnxBTlNJViwKKyJhc3NpZ25tZW50IHRvIGluY29tcGxldGUgdHlwZSIsRVJST1J8QU5TSVYsCisib3BlcmFuZHMgZm9yIHx8IGFuZCAmJiBoYXZlIHRvIGJlIGFyaXRobWV0aWMgb3IgcG9pbnRlciIsRVJST1J8QU5TSVYsCisiYml0d2lzZSBvcGVyYXRpb25zIG5lZWQgaW50ZWdlciBvcGVyYW5kcyIsRVJST1J8QU5TSVYsICAgICAgICAgICAgIC8qICA5MCAgKi8KKyJhc3NpZ25tZW50IGRpc2NhcmRzIGNvbnN0IixXQVJOSU5HfEFOU0lWLAorInJlbGF0aW9uYWwgZXhwcmVzc2lvbiBuZWVkcyBhcml0aG1ldGljIG9yIHBvaW50ZXIgdHlwZSIsRVJST1J8QU5TSVYsCisiYm90aCBvcGVyYW5kcyBvZiBjb21wYXJpc29uIG11c3QgYmUgcG9pbnRlcnMiLEVSUk9SfEFOU0lWLAorIm9wZXJhbmQgbmVlZHMgYXJpdGhtZXRpYyB0eXBlIixFUlJPUnxBTlNJViwKKyJwb2ludGVyIGFyaXRobWV0aWMgd2l0aCB2b2lkICogaXMgbm90IHBvc3NpYmxlIixFUlJPUnxBTlNJViwgICAgICAgLyogIDk1ICAqLworInBvaW50ZXJzIGNhbiBvbmx5IGJlIHN1YnRyYWN0ZWQiLEVSUk9SfEFOU0lWLAorImludmFsaWQgdHlwZXMgZm9yIG9wZXJhdGlvbiA8JXM+IixFUlJPUnxBTlNJViwKKyJpbnZhbGlkIG9wZXJhbmQgdHlwZSIsRVJST1J8QU5TSVYsCisiaW50ZWdlci1wb2ludGVyIGlzIG5vdCBhbGxvd2VkIixFUlJPUnxBTlNJViwKKyJhc3NpZ25tZW50IGRpc2NhcmRzIHZvbGF0aWxlIixXQVJOSU5HfEFOU0lWLCAgICAgICAgICAgICAgICAgICAgICAgLyogIDEwMCAqLworIjw8LCA+PiBhbmQgJSUgbmVlZCBpbnRlZ2VyIG9wZXJhbmRzIixFUlJPUnxBTlNJViwKKyJjYXN0aW5nIGZyb20gdm9pZCBpcyBub3QgYWxsb3dlZCIsRVJST1J8QU5TSVYsCisiaW50ZWdlciB0b28gbGFyZ2UgdG8gZml0IGludG8gcG9pbnRlciIsV0FSTklORywKKyJvbmx5IGludGVnZXJzIGNhbiBiZSBjYXN0IHRvIHBvaW50ZXJzIixFUlJPUnxBTlNJViwKKyJpbnZhbGlkIGNhc3QiLEVSUk9SfEFOU0lWLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDEwNSAqLworInBvaW50ZXIgdG9vIGxhcmdlIHRvIGZpdCBpbnRvIGludGVnZXIiLFdBUk5JTkd8QU5TSVYsCisidW5hcnkgb3BlcmF0b3IgbmVlZHMgYXJpdGhtZXRpYyB0eXBlIixFUlJPUnxBTlNJViwKKyJuZWdhdGlvbiB0eXBlIG11c3QgYmUgYXJpdGhtZXRpYyBvciBwb2ludGVyIixFUlJPUnxBTlNJViwKKyJjb21wbGVtZW50IG9wZXJhdG9yIG5lZWRzIGludGVnZXIgdHlwZSIsRVJST1J8QU5TSVYsCisicG9pbnRlciBhc3NpZ25tZW50IHdpdGggZGlmZmVyZW50IHF1YWxpZmllcnMiLFdBUk5JTkd8QU5TSVYsICAgICAgIC8qICAxMTAgKi8KKyJkZXJlZmVyZW5jZWQgb2JqZWN0IGlzIG5vIHBvaW50ZXIiLEVSUk9SfEFOU0lWLAorImRlcmVmZXJlbmNlZCBvYmplY3QgaXMgaW5jb21wbGV0ZSIsRVJST1J8QU5TSVYsCisib25seSAwIHNob3VsZCBiZSBhc3NpZ25lZCB0byBwb2ludGVyIixXQVJOSU5HfEFOU0lWLAorInR5cGVkZWYgPCVzPiBpcyBpbml0aWFsaXplZCIsV0FSTklOR3xBTlNJViwKKyJsdmFsdWUgcmVxdWlyZWQgdG8gdGFrZSBhZGRyZXNzIixFUlJPUnxBTlNJViwgICAgICAgICAgICAgICAgICAgICAgLyogIDExNSAqLworInVua25vd24gdmFyIDwlcz4iLEVSUk9SfEFOU0lWLAorImFkZHJlc3Mgb2YgcmVnaXN0ZXIgdmFyaWFibGVzIG5vdCBhdmFpbGFibGUiLEVSUk9SfEFOU0lWLAorInZhciA8JXM+IGluaXRpYWxpemVkIGFmdGVyIFwnZXh0ZXJuXCciLFdBUk5JTkcsCisiY29uc3QgdmFyIDwlcz4gbm90IGluaXRpYWxpemVkIixXQVJOSU5HLAorImZ1bmN0aW9uIGRlZmluaXRpb24gYWZ0ZXIgXCdleHRlcm5cJyIsV0FSTklOR3xBTlNJViwgICAgICAgICAgICAgICAvKiAgMTIwICovCisicmV0dXJuIHR5cGUgb2YgbWFpbiBpcyBub3QgaW50IixXQVJOSU5HfEFOU0lWLAorImludmFsaWQgc3RvcmFnZS1jbGFzcyBmb3IgZnVuY3Rpb24gcGFyYW1ldGVyIixXQVJOSU5HfEFOU0lWLAorImZvcm1hbCBwYXJhbWV0ZXJzIGNvbmZsaWN0IHdpdGggcGFyYW1ldGVyLXR5cGUtbGlzdCIsV0FSTklOR3xBTlNJViwKKyJwYXJhbWV0ZXIgdHlwZSBkZWZhdWx0cyB0byBpbnQiLFdBUk5JTkd8RE9OVFdBUk4sCisibm8gZGVjbGFyYXRpb24tc3BlY2lmaWVyLCB1c2VkIGludCIsV0FSTklOR3xBTlNJViwgICAgICAgICAgICAgICAgIC8qICAxMjUgKi8KKyJubyBkZWNsYXJhdG9yIGluIHByb3RvdHlwZSIsV0FSTklOR3xBTlNJViwKKyJzdGF0aWMgdmFyIDwlcz4gbmV2ZXIgZGVmaW5lZCIsV0FSTklORywKKyJ9IGV4cGVjdGVkIixXQVJOSU5HLAorImxlZnQgb3BlcmFuZCBvZiBjb21tYSBvcGVyYXRvciBoYXMgbm8gc2lkZS1lZmZlY3RzIixXQVJOSU5HLAorImxhYmVsIGVtcHR5IixFUlJPUnxBTlNJViwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMTMwICovCisicmVkZWZpbml0aW9uIG9mIGxhYmVsIDwlcz4iLEVSUk9SfEFOU0lWLAorImNhc2Ugd2l0aG91dCBzd2l0Y2giLEVSUk9SfEFOU0lWLAorImNhc2UtZXhwcmVzc2lvbiBtdXN0IGJlIGNvbnN0YW50IixFUlJPUnxBTlNJViwKKyJjYXNlLWV4cHJlc3Npb24gbXVzdCBiZSBpbnRlZ2VyIixFUlJPUnxBTlNJViwKKyJlbXB0eSBpZi1leHByZXNzaW9uIixFUlJPUnxBTlNJViwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDEzNSAqLworImlmLWV4cHJlc3Npb24gbXVzdCBiZSBhcml0aG1ldGljIG9yIHBvaW50ZXIiLEVSUk9SfEFOU0lWLAorImVtcHR5IHN3aXRjaC1leHByZXNzaW9uIixFUlJPUnxBTlNJViwKKyJzd2l0Y2gtZXhwcmVzc2lvbiBtdXN0IGJlIGludGVnZXIiLEVSUk9SfEFOU0lWLAorIm11bHRpcGxlIGRlZmF1bHQgbGFiZWxzIixFUlJPUnxBTlNJViwKKyJ3aGlsZS1leHByZXNzaW9uIG11c3QgYmUgYXJpdGhtZXRpYyBvciBwb2ludGVyIixFUlJPUnxBTlNJViwgICAgICAgLyogIDE0MCAqLworImVtcHR5IHdoaWxlLWV4cHJlc3Npb24iLEVSUk9SfEFOU0lWLAorImZvci1leHByZXNzaW9uIG11c3QgYmUgYXJpdGhtZXRpYyBvciBwb2ludGVyIixFUlJPUnxBTlNJViwKKyJkby13aGlsZS0tZXhwcmVzc2lvbiBtdXN0IGJlIGFyaXRobWV0aWMgb3IgcG9pbnRlciIsRVJST1J8QU5TSVYsCisiZ290byB3aXRob3V0IGxhYmVsIixFUlJPUnxBTlNJViwKKyJjb250aW51ZSBub3Qgd2l0aGluIGxvb3AiLEVSUk9SfEFOU0lWLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDE0NSAqLworImJyZWFrIG5vdCBpbiBtYXRjaGluZyBjb25zdHJ1Y3QiLEVSUk9SfEFOU0lWLAorImxhYmVsIDwlcz4gd2FzIG5ldmVyIGRlZmluZWQiLEVSUk9SfEFOU0lWfElORlVOQ3xOT1JBVVMsCisibGFiZWwgPCVzPiB3YXMgbmV2ZXIgdXNlZCIsV0FSTklOR3xJTkZVTkMsCisicmVnaXN0ZXIgJXMgbm90IG9rIixXQVJOSU5HLAorImRlZmF1bHQgbm90IGluIHN3aXRjaCIsV0FSTklOR3xBTlNJViwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMTUwICovCisiKCBleHBlY3RlZCIsV0FSTklOR3xBTlNJViwKKyJsb29wIGVsaW1pbmF0ZWQiLFdBUk5JTkcsCisic3RhdGVtZW50IGhhcyBubyBlZmZlY3QiLFdBUk5JTkcsCisiXCd3aGlsZVwnIGV4cGVjdGVkIixXQVJOSU5HfEFOU0lWLAorImZ1bmN0aW9uIHNob3VsZCBub3QgcmV0dXJuIGEgdmFsdWUiLFdBUk5JTkd8QU5TSVYsICAgICAgICAgICAgICAgICAvKiAgMTU1ICovCisiZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhIHZhbHVlIixXQVJOSU5HLAorInsgZXhwZWN0ZWQiLFdBUk5JTkd8QU5TSVYsCisiaW50ZXJuYWwgZXJyb3IgJWQgaW4gbGluZSAlZCBvZiBmaWxlICVzICEhIixFUlJPUnxJTlRFUk5BTHxGQVRBTCwKKyJ0aGVyZSBpcyBubyBtZXNzYWdlIG51bWJlciAlZCIsTk9MSU5FfEZBVEFMfEVSUk9SLAorIm1lc3NhZ2UgbnVtYmVyICVkIGNhbm5vdCBiZSBzdXBwcmVzc2VkIixFUlJPUnxOT0xJTkV8RkFUQUwsICAgICAgICAvKiAgMTYwICovCisiaW1wbGljaXQgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb24gPCVzPiIsV0FSTklOR3xET05UV0FSTiwKKyJmdW5jdGlvbiBjYWxsIHdpdGhvdXQgcHJvdG90eXBlIGluIHNjb3BlIixXQVJOSU5HfERPTlRXQVJOLAorIiNwcmFnbWEgdXNlZCIsV0FSTklOR3xET05UV0FSTiwKKyJhc3NpZ25tZW50IGluIGNvbXBhcmlzb24gY29udGV4dCIsV0FSTklOR3xET05UV0FSTiwKKyJjb21wYXJpc29uIHJlZHVuZGFudCBiZWNhdXNlIG9wZXJhbmQgaXMgdW5zaWduZWQiLFdBUk5JTkcsICAgICAgICAgLyogIDE2NSAqLworImNhc3QgdG8gbmFycm93IHR5cGUgbWF5IGNhdXNlIGxvc3Mgb2YgcHJlY2lzaW9uIixXQVJOSU5HfERPTlRXQVJOLAorInBvaW50ZXIgY2FzdCBtYXkgY2F1c2UgYWxpZ25tZW50IHByb2JsZW1zIixXQVJOSU5HfERPTlRXQVJOLAorIm5vIGRlY2xhcmF0aW9uIG9mIGdsb2JhbCB2YXJpYWJsZSA8JXM+IGJlZm9yZSBkZWZpbml0aW9uIixXQVJOSU5HfERPTlRXQVJOLAorIidleHRlcm4nIGluc2lkZSBmdW5jdGlvbiIsV0FSTklOR3xET05UV0FSTiwKKyJkZWFkIGFzc2lnbm1lbnQgdG8gPCVzJXM+IGVsaW1pbmF0ZWQiLFdBUk5JTkd8SU5GVU5DfElOSUN8RE9OVFdBUk4sLyogIDE3MCAqLworInZhciA8JXM+IGlzIHVzZWQgYmVmb3JlIGRlZmluZWQiLFdBUk5JTkd8SU5GVU5DLAorIndvdWxkIG5lZWQgbW9yZSB0aGFuICVsZCBvcHRpbWl6ZXIgcGFzc2VzIGZvciBiZXN0IHJlc3VsdHMiLFdBUk5JTkd8SU5GVU5DLAorImZ1bmN0aW9uIDwlcz4gaGFzIG5vIHJldHVybiBzdGF0ZW1lbnQiLFdBUk5JTkd8SU5GVU5DLAorImZ1bmN0aW9uIDwlcz4gaGFzIG5vIHJldHVybiBzdGF0ZW1lbnQiLFdBUk5JTkd8RE9OVFdBUk58SU5GVU5DLAorInRoaXMgY29kZSBpcyB3ZWlyZCIsV0FSTklOR3xJTkZVTkMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMTc1ICovCisic2l6ZSBvZiBpbmNvbXBsZXRlIHR5cGUgbm90IGF2YWlsYWJsZSIsV0FSTklOR3xBTlNJViwKKyJsaW5lIHRvbyBsb25nIixGQVRBTHxFUlJPUnxBTlNJVnxQUkVQUk9DLAorImlkZW50aWZpZXIgbXVzdCBiZWdpbiB3aXRoIGEgbGV0dGVyIG9yIHVuZGVyc2NvcmUiLEZBVEFMfEVSUk9SfEFOU0lWfFBSRVBST0MsCisiY2Fubm90IHJlZGVmaW5lIG1hY3JvIixFUlJPUnxBTlNJVnxQUkVQUk9DLAorIm1pc3NpbmcgKSBhZnRlciBhcmd1bWVudGxpc3QiLEVSUk9SfEFOU0lWfFBSRVBST0MsICAgICAgICAgICAgICAgICAvKiAgMTgwICovCisiaWRlbnRpZmllciBleHBlY3RlZCIsRVJST1J8QU5TSVZ8UFJFUFJPQywKKyJpbGxlZ2FsIGNoYXJhY3RlciBpbiBpZGVudGlmaWVyIixFUlJPUnxBTlNJVnxQUkVQUk9DLAorIm1pc3Npbmcgb3BlcmFuZCBiZWZvcmUvYWZ0ZXIgIyMiLEVSUk9SfEFOU0lWfFBSRVBST0MsCisibm8gbWFjcm8tYXJndW1lbnQgYWZ0ZXIgIy1vcGVyYXRvciIsRVJST1J8QU5TSVZ8UFJFUFJPQywKKyJtYWNybyByZWRlZmluaXRpb24gbm90IGFsbG93ZWQiLEVSUk9SfEFOU0lWfFBSRVBST0MsICAgICAgICAgICAgICAgLyogIDE4NSAqLworInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgKHVudGVybWluYXRlZCBjb21tZW50KSIsRkFUQUx8RVJST1J8UFJFUFJPQywKKyJ0b28gbWFueSBuZXN0ZWQgaW5jbHVkZXMiLEZBVEFMfEVSUk9SfFBSRVBST0MsCisiI2Vsc2Ugd2l0aG91dCAjaWYvI2lmZGVmLyNpZm5kZWYiLEZBVEFMfEVSUk9SfEFOU0lWfFBSRVBST0MsCisiI2Vsc2UgYWZ0ZXIgI2Vsc2UiLEVSUk9SfEFOU0lWfFBSRVBST0MsCisiI2VuZGlmIHdpdGhvdXQgI2lmIixFUlJPUnxBTlNJVnxQUkVQUk9DLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAxOTAgKi8KKyJjYW5ub3QgaW5jbHVkZSBmaWxlIixGQVRBTHxFUlJPUnxQUkVQUk9DLAorImV4cGVjdGVkIFwiIG9yIDwgaW4gI2luY2x1ZGUtZGlyZWN0aXZlIixFUlJPUnxBTlNJVnxQUkVQUk9DLAorInVua25vd24gIy1kaXJlY3RpdmUiLFdBUk5JTkd8UFJFUFJPQywKKyJ3cm9uZyBudW1iZXIgb2YgbWFjcm8gYXJndW1lbnRzIixFUlJPUnxBTlNJVnxQUkVQUk9DLAorIm1hY3JvIGFyZ3VtZW50IGV4cGVjdGVkIixFUlJPUnxBTlNJVnxQUkVQUk9DLCAgICAgICAgICAgICAgICAgICAgICAvKiAgMTk1ICovCisib3V0IG9mIG1lbW9yeSIsRkFUQUx8RVJST1J8UFJFUFJPQywKKyJtYWNybyByZWRlZmluaXRpb24iLFdBUk5JTkd8UFJFUFJPQywKKyIvKiBpbiBjb21tZW50IixXQVJOSU5HfFBSRVBST0MsCisiY2Fubm90IHVuZGVmaW5lIG1hY3JvIixFUlJPUnxBTlNJVnxQUkVQUk9DLAorImNoYXJhY3RlcnMgYWZ0ZXIgIy1kaXJlY3RpdmUgaWdub3JlZCIsV0FSTklOR3xQUkVQUk9DLCAgICAgICAgICAgICAvKiAgMjAwICovCisiZHVwbGljYXRlIGNhc2UgbGFiZWxzIixXQVJOSU5HfEFOU0lWLAorInZhciA8JXM+IGlzIGluY29tcGxldGUiLFdBUk5JTkd8QU5TSVYsCisibG9uZyBmbG9hdCBpcyBubyBsb25nZXIgdmFsaWQiLFdBUk5JTkd8QU5TSVYsCisibG9uZyBkb3VibGUgaXMgbm90IHJlYWxseSBzdXBwb3J0ZWQgYnkgdmJjYyIsV0FSTklORywKKyJlbXB0eSBzdHJ1Y3QtZGVjbGFyYXRpb25zIGFyZSBub3QgeWV0IGhhbmRsZWQgY29ycmVjdCIsV0FSTklORywgICAgLyogIDIwNSAqLworImlkZW50aWZpZXIgdG9vIGxvbmcgKG9ubHkgJWQgY2hhcmFjdGVycyBhcmUgc2lnbmlmaWNhbnQpIixXQVJOSU5HLAorImlsbGVnYWwgaW5pdGlhbGl6YXRpb24gb2YgdmFyIDwlcz4iLFdBUk5JTkd8QU5TSVYsCisic3VzcGljaW91cyBsb29wIixXQVJOSU5HfElORlVOQywKKyJhbnNpL2lzby1tb2RlIHR1cm5lZCBvbiIsTk9MSU5FfFdBUk5JTkcsCisiZGl2aXNpb24gYnkgemVybyAocmVzdWx0IHNldCB0byAwKSIsV0FSTklOR3xBTlNJVnxJTkZVTkN8SU5JQywgICAgIC8qICAyMTAgKi8KKyJjb25zdGFudCBvdXQgb2YgcmFuZ2UiLFdBUk5JTkd8QU5TSVYsCisiY29uc3RhbnQgaXMgdW5zaWduZWQgZHVlIHRvIHNpemUiLFdBUk5JTkd8RE9OVFdBUk4sCisidmFyYXJncyBmdW5jdGlvbiBjYWxsZWQgd2l0aG91dCBwcm90b3R5cGUgaW4gc2NvcGUiLFdBUk5JTkcsCisic3VzcGljaW91cyBmb3JtYXQgc3RyaW5nIixXQVJOSU5HLAorImZvcm1hdCBzdHJpbmcgY29udGFpbnMgXCdcXDBcJyIsV0FSTklORywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMjE1ICovCisiaWxsZWdhbCB1c2Ugb2Yga2V5d29yZCA8JXM+IixXQVJOSU5HfEFOU0lWLAorInJlZ2lzdGVyIDwlcz4gdXNlZCB3aXRoIHdyb25nIHR5cGUiLEVSUk9SLAorInJlZ2lzdGVyIDwlcz4gaXMgbm90IGZyZWUiLEVSUk9SLAorIidfX3JlZycgdXNlZCBpbiBvbGQtc3R5bGUgZnVuY3Rpb24gZGVmaW5pdGlvbiIsV0FSTklORywKKyJ1bmtub3duIHJlZ2lzdGVyIFwiJXNcIiIsV0FSTklORywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDIyMCAqLworIicuLi4nIG9ubHkgYWxsb3dlZCB3aXRoIHByb3RvdHlwZXMiLFdBUk5JTkd8QU5TSVYsCisiSGV5LCBkbyB5b3UgcmVhbGx5IGtub3cgdGhlIHByaW9yaXR5IG9mICcmJicgdnMuICd8fCc/IixXQVJOSU5HfERPTlRXQVJOLAorImJlIGNhcmVmdWwgd2l0aCBwcmlvcml0aWVzIG9mIDw8Lz4+IHZzLiArLy0iLFdBUk5JTkcsCisiYWRkcmVzcyBvZiBhdXRvIHZhcmlhYmxlIHJldHVybmVkIixXQVJOSU5HLAorInZvaWQgZnVuY3Rpb24gcmV0dXJucyBhIHZvaWQgZXhwcmVzc2lvbiIsV0FSTklORywgICAgICAgICAgICAgICAgICAvKiAgMjI1ICovCisicmVkZWNsYXJhdGlvbiBvZiB0eXBlZGVmIDwlcz4iLFdBUk5JTkd8QU5TSVYsCisibXVsdGlwbGUgc3BlY2lmaWNhdGlvbiBvZiBhdHRyaWJ1dGUgXCIlc1wiIixXQVJOSU5HLAorInJlZGVjbGFyYXRpb24gb2YgdmFyIFwiJXNcIiB3aXRoIGRpZmZlcmluZyBzZXR0aW5nIG9mIGF0dHJpYnV0ZSBcIiVzXCIiLFdBUk5JTkcsCisic3RyaW5nLWNvbnN0YW50IGV4cGVjdGVkIixFUlJPUiwKKyJ0YWcgXCIlc1wiIHVzZWQgZm9yIHdyb25nIHR5cGUiLFdBUk5JTkd8QU5TSVYsICAgICAgICAgICAgICAgICAgICAgLyogIDIzMCAqLworIm1lbWJlciBhZnRlciBmbGV4aWJsZSBhcnJheSBtZW1iZXIiLEVSUk9SfEFOU0lWLAorImlsbGVnYWwgbnVtYmVyIixFUlJPUnxBTlNJViwKKyJ2b2lkIGNoYXJhY3RlciBjb25zdGFudCIsUFJFUFJPQ3xFUlJPUnxBTlNJViwKKyJzcHVyaW91cyB0YWlsIGluIG9jdGFsIGNoYXJhY3RlciBjb25zdGFudCIsUFJFUFJPQ3xFUlJPUnxBTlNJViwKKyJzcHVyaW91cyB0YWlsIGluIGhleGFkZWNpbWFsIGNoYXJhY3RlciBjb25zdGFudCIsUFJFUFJPQ3xFUlJPUnxBTlNJViwgIC8qIDIzNSAqLworImlsbGVnYWwgZXNjYXBlIHNlcXVlbmNlIGluIGNoYXJhY3RlciBjb25zdGFudCIsUFJFUFJPQ3xFUlJPUnxBTlNJViwKKyJpbnZhbGlkIGNvbnN0YW50IGludGVnZXIgdmFsdWUiLFBSRVBST0N8RVJST1J8QU5TSVYsCisiYSByaWdodCBwYXJlbnRoZXNpcyB3YXMgZXhwZWN0ZWQiLFBSRVBST0N8RVJST1J8QU5TSVYsCisiYSBjb2xvbiB3YXMgZXhwZWN0ZWQiLFBSRVBST0N8RVJST1J8QU5TSVYsCisidHJ1bmNhdGVkIGNvbnN0YW50IGludGVncmFsIGV4cHJlc3Npb24iLFBSRVBST0N8RVJST1J8QU5TSVYsICAgICAgIC8qICAyNDAgKi8KKyJyb2d1ZSBvcGVyYXRvciAnJXMnIGluIGNvbnN0YW50IGludGVncmFsIGV4cHJlc3Npb24iLFBSRVBST0N8RVJST1J8QU5TSVYsCisiaW52YWxpZCB0b2tlbiBpbiBjb25zdGFudCBpbnRlZ3JhbCBleHByZXNzaW9uIixQUkVQUk9DfEVSUk9SfEFOU0lWLAorInRyYWlsaW5nIGdhcmJhZ2UgaW4gY29uc3RhbnQgaW50ZWdyYWwgZXhwcmVzc2lvbiIsUFJFUFJPQ3xFUlJPUnxBTlNJViwKKyJ2b2lkIGNvbmRpdGlvbiBmb3IgYSAjaWYvI2VsaWYiLFBSRVBST0N8RVJST1J8QU5TSVYsCisidm9pZCBjb25kaXRpb24gKGFmdGVyIGV4cGFuc2lvbikgZm9yIGEgI2lmLyNlbGlmIixQUkVQUk9DfEVSUk9SfEFOU0lWLCAvKiAgMjQ1ICovCisiaW52YWxpZCAnI2luY2x1ZGUnIixQUkVQUk9DfEVSUk9SfEFOU0lWLAorIm1hY3JvIGV4cGFuc2lvbiBkaWQgbm90IHByb2R1Y2UgYSB2YWxpZCBmaWxlbmFtZSBmb3IgI2luY2x1ZGUiLFBSRVBST0N8RVJST1J8QU5TSVYsCisiZmlsZSAnJXMnIG5vdCBmb3VuZCIsUFJFUFJPQ3xFUlJPUnxBTlNJViwKKyJub3QgYSB2YWxpZCBudW1iZXIgZm9yICNsaW5lIixQUkVQUk9DfEVSUk9SfEFOU0lWLAorIm5vdCBhIHZhbGlkIGZpbGVuYW1lIGZvciAjbGluZSIsUFJFUFJPQ3xFUlJPUnxBTlNJViwgICAgICAgICAgICAgICAvKiAgMjUwICovCisicm9ndWUgJyMnIixQUkVQUk9DfEVSUk9SfEFOU0lWLAorInJvZ3VlICNlbHNlIixQUkVQUk9DfEVSUk9SfEFOU0lWLAorInJvZ3VlICNlbGlmIixQUkVQUk9DfEVSUk9SfEFOU0lWLAorInVubWF0Y2hlZCAjZW5kaWYiLFBSRVBST0N8RVJST1J8QU5TSVYsCisidW5rbm93biBjcHAgZGlyZWN0aXZlICcjJXMnIixQUkVQUk9DfFdBUk5JTkd8QU5TSVYsICAgICAgICAgICAgICAgIC8qICAyNTUgKi8KKyJ1bnRlcm1pbmF0ZWQgI2lmIGNvbnN0cnVjdGlvbiIsUFJFUFJPQ3xFUlJPUnxBTlNJViwKKyJjb3VsZCBub3QgZmx1c2ggb3V0cHV0IChkaXNrIGZ1bGwgPykiLFBSRVBST0N8RVJST1J8QU5TSVYsCisidHJ1bmNhdGVkIHRva2VuIixQUkVQUk9DfEVSUk9SfEFOU0lWLAorImlsbGVnYWwgY2hhcmFjdGVyICclYyciLFBSRVBST0N8RVJST1J8QU5TSVYsCisidW5maW5pc2hlZCBzdHJpbmcgYXQgZW5kIG9mIGxpbmUiLFBSRVBST0N8RVJST1J8QU5TSVYsICAgICAgICAgICAgIC8qICAyNjAgKi8KKyJtaXNzaW5nIG1hY3JvIG5hbWUiLFBSRVBST0N8RVJST1J8QU5TSVYsCisidHJ5aW5nIHRvIHJlZGVmaW5lIHRoZSBzcGVjaWFsIG1hY3JvICVzIixQUkVQUk9DfEVSUk9SfEFOU0lWLAorInRydW5jYXRlZCBtYWNybyBkZWZpbml0aW9uIixQUkVQUk9DfEVSUk9SfEFOU0lWLAorIicuLi4nIG11c3QgZW5kIHRoZSBtYWNybyBhcmd1bWVudCBsaXN0IixQUkVQUk9DfEVSUk9SfEFOU0lWLAorInZvaWQgbWFjcm8gYXJndW1lbnQiLFBSRVBST0N8RVJST1J8QU5TSVYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMjY1ICovCisibWlzc2luZyBjb21tYSBpbiBtYWNybyBhcmd1bWVudCBsaXN0IixQUkVQUk9DfEVSUk9SfEFOU0lWLAorImludmFsaWQgbWFjcm8gYXJndW1lbnQiLFBSRVBST0N8RVJST1J8QU5TSVYsCisiZHVwbGljYXRlIG1hY3JvIGFyZ3VtZW50IixQUkVQUk9DfEVSUk9SfEFOU0lWLAorIidfX1ZBX0FSR1NfXycgaXMgZm9yYmlkZGVuIGluIG1hY3JvcyB3aXRoIGEgZml4ZWQgbnVtYmVyIG9mIGFyZ3VtZW50cyIsUFJFUFJPQ3xFUlJPUnxBTlNJViwKKyJvcGVyYXRvciAnIyMnIG1heSBuZWl0aGVyIGJlZ2luIG5vciBlbmQgYSBtYWNybyIsUFJFUFJPQ3xFUlJPUnxBTlNJViwgIC8qICAyNzAgKi8KKyJvcGVyYXRvciAnIycgbm90IGZvbGxvd2VkIGJ5IGEgbWFjcm8gYXJndW1lbnQiLFBSRVBST0N8RVJST1J8QU5TSVYsCisibWFjcm8gJyVzJyByZWRlZmluZWQgdW5pZGVudGljYWxseSIsUFJFUFJPQ3xFUlJPUnxBTlNJViwKKyJub3QgZW5vdWdoIGFyZ3VtZW50cyB0byBtYWNybyIsUFJFUFJPQ3xFUlJPUnxBTlNJViwKKyJ1bmZpbmlzaGVkIG1hY3JvIGNhbGwiLFBSRVBST0N8RVJST1J8QU5TSVYsCisidG9vIG1hbnkgYXJndW1lbnRzIHRvIG1hY3JvIixQUkVQUk9DfEVSUk9SfEFOU0lWLCAgICAgICAgICAgICAgICAgICAvKiAgMjc1ICovCisib3BlcmF0b3IgJyMjJyBwcm9kdWNlZCB0aGUgaW52YWxpZCB0b2tlbiAnJXMlcyciLFBSRVBST0N8RVJST1J8QU5TSVYsCisicXVhZCBzaGFycCIsUFJFUFJPQ3xFUlJPUnxBTlNJViwKKyJ2b2lkIG1hY3JvIG5hbWUiLFBSRVBST0N8RVJST1J8QU5TSVYsCisibWFjcm8gJXMgYWxyZWFkeSBkZWZpbmVkIixQUkVQUk9DfEVSUk9SfEFOU0lWLAorInRyeWluZyB0byB1bmRlZiBzcGVjaWFsIG1hY3JvICVzIixQUkVQUk9DfEVSUk9SfEFOU0lWLCAgICAgICAgICAgICAvKiAgMjgwICovCisiaWxsZWdhbCBtYWNybyBuYW1lIGZvciAjaWZkZWYiLFBSRVBST0N8RVJST1J8QU5TSVYsCisidW5maW5pc2hlZCAjaWZkZWYiLFBSRVBST0N8RVJST1J8QU5TSVYsCisiaWxsZWdhbCBtYWNybyBuYW1lIGZvciAjdW5kZWYiLFBSRVBST0N8RVJST1J8QU5TSVYsCisidW5maW5pc2hlZCAjdW5kZWYiLFBSRVBST0N8RVJST1J8QU5TSVYsCisiaWxsZWdhbCBtYWNybyBuYW1lIGZvciAjaWZuZGVmIixQUkVQUk9DfEVSUk9SfEFOU0lWLCAgICAgICAgICAgICAgIC8qICAyODUgKi8KKyJ1bmZpbmlzaGVkICNpZm5kZWYiLFBSRVBST0N8RVJST1J8QU5TSVYsCisicmVjb25zdHJ1Y3Rpb24gb2YgPGZvbz4gaW4gI2luY2x1ZGUiLFBSRVBST0N8V0FSTklOR3xET05UV0FSTiwKKyJjb21tZW50IGluIHRoZSBtaWRkbGUgb2YgYSBjcHAgZGlyZWN0aXZlIixQUkVQUk9DfFdBUk5JTkd8RE9OVFdBUk4sCisibnVsbCBjcHAgZGlyZWN0aXZlIixQUkVQUk9DfFdBUk5JTkd8RE9OVFdBUk4sCisicm9ndWUgJyMnIGluIGNvZGUgY29tcGlsZWQgb3V0IixQUkVQUk9DfFdBUk5JTkcsICAgICAgICAgICAgICAgICAgIC8qICAyOTAgKi8KKyJyb2d1ZSAnIycgZHVtcGVkIixQUkVQUk9DfFdBUk5JTkd8RE9OVFdBUk4sCisiI2Vycm9yJXMiLFBSRVBST0N8QU5TSVZ8RVJST1IsCisidHJpZ3JhcGggPyIiPyVjIGVuY291bnRlcmVkIixQUkVQUk9DfFdBUk5JTkcsCisidW50ZXJtaW5hdGVkICNpZiBjb25zdHJ1Y3Rpb24gKGRlcHRoICVsZCkiLFBSRVBST0N8RVJST1J8QU5TSVYsCisibWFsZm9ybWVkIGlkZW50aWZpZXIgd2l0aCBVQ046ICclcyciLFBSRVBST0N8V0FSTklOR3xBTlNJViwgICAgICAgIC8qICAyOTUgKi8KKyJ0cnVuY2F0ZWQgVVRGLTggY2hhcmFjdGVyIixQUkVQUk9DfFdBUk5JTkd8QU5TSVYsCisiaWRlbnRpZmllciBub3QgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSBpbiAjZGVmaW5lIixQUkVQUk9DfFdBUk5JTkd8QU5TSVYsCisiYXNzaWdubWVudCBkaXNjYXJkcyByZXN0cmljdCIsV0FSTklOR3xBTlNJViwgICAgICAgICAgICAgICAgICAgICAgCisic3RvcmFnZS1jbGFzcyBpbiBkZWNsYXJhdGlvbiB3aXRoaW4gZm9yKCkgY29udmVydGVkIHRvIGF1dG8iLFdBUk5JTkd8QU5TSVYsCisiY29ycnVwdGVkIHNwZWNpYWwgb2JqZWN0IixBTlNJVnxGQVRBTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAzMDAgKi8KKyI8aW5saW5lPiBvbmx5IGFsbG93ZWQgaW4gZnVuY3Rpb24gZGVjbGFyYXRpb25zIixFUlJPUnxBTlNJViwKKyJyZWZlcmVuY2UgdG8gc3RhdGljIHZhcmlhYmxlIDwlcz4gaW4gaW5saW5lIGZ1bmN0aW9uIHdpdGggZXh0ZXJuYWwgbGlua2FnZSIsRVJST1J8QU5TSVYsCisidW5kZXJmbG93IG9mIHByYWdtYSBwb3B3YXJuIixFUlJPUnxGQVRBTHxBTlNJViwKKyJpbnZhbGlkIGFyZ3VtZW50IHRvIF9QcmFnbWEiLEVSUk9SfEFOU0lWfFBSRVBST0MsCisibWlzc2luZyBjb21tYSBiZWZvcmUgJy4uLiciLEVSUk9SfEFOU0lWfFBSRVBST0MsICAgICAgICAgICAgICAgICAgIC8qICAzMDUgKi8KKyJwYWRkaW5nIGJ5dGVzIGJlaGluZCBtZW1iZXIgPCVzPiIsV0FSTklOR3xET05UV0FSTiwKKyJtZW1iZXIgPCVzPiBkb2VzIG5vdCBoYXZlIG5hdHVyYWwgYWxpZ25tZW50IixXQVJOSU5HfERPTlRXQVJOLAorImZ1bmN0aW9uIDwlcz4gZXhjZWVkcyAlcyBsaW1pdCIsV0FSTklORywKKyIlcyBjb3VsZCBub3QgYmUgY2FsY3VsYXRlZCBmb3IgZnVuY3Rpb24gPCVzPiIsV0FSTklORywKKyJvZmZzZXRvZiBhcHBsaWVkIHRvIG5vbi1zdHJ1Y3QiLEVSUk9SfEFOU0lWLCAgICAgICAgICAgICAgICAgICAgICAgLyogIDMxMCAqLworInRyYWlsaW5nIGdhcmJhZ2UgaW4gI2lmZGVmIixXQVJOSU5HfEFOU0lWfFBSRVBST0MsCisidG9vIG1hbnkgYXJndW1lbnRzIHRvIG1hY3JvIixXQVJOSU5HfEFOU0lWfFBSRVBST0MsCisidHJ1bmNhdGVkIGNvbW1lbnQiLFdBUk5JTkd8QU5TSVZ8UFJFUFJPQywKKyJ0cmFpbGluZyBnYXJiYWdlIGluIHByZXByb2Nlc3NpbmcgZGlyZWN0aXZlIixXQVJOSU5HfEFOU0lWfFBSRVBST0MsCisidmFyaWFibGUtbGVuZ3RoIGFycmF5IG11c3QgaGF2ZSBhdXRvIHN0b3JhZ2UtY2xhc3MiLEVSUk9SfEFOU0lWLCAgLyogIDMxNSAqLworIm1lbWJlciA8JXM+IGhhcyB0eXBlIHdpdGggemVybyBhbGlnbm1lbnQvc2l6ZSAocHJvYmFibHkgdm9pZCkiLEVSUk9SfEFOU0lWfEZBVEFMLAorInN0YWNrIGluZm9ybWF0aW9uIGZvciB0YXJnZXQgPCVzPiB1bmF2YWlsYWJsZSIsV0FSTklOR3xJTklDfERPTlRXQVJOLAorInVzZWQgcmVnaXN0ZXJzIGluZm9ybWF0aW9uIHVuYXZhaWxhYmxlIGZvciB0YXJnZXQgPCVzPiIsV0FSTklOR3xJTklDfERPTlRXQVJOLAorImNvbXB1dGVkICVzc3RhY2sgdXNhZ2UgJWQgYnV0IHNldCB0byAlZCIsV0FSTklOR3xJTkZVTkMsCisidW5hYmxlIHRvIGNvbXB1dGUgY2FsbCB0YXJnZXRzIixXQVJOSU5HfElOSUN8RE9OVFdBUk4sICAgICAgICAgICAgLyogIDMyMCAqLworImNvbXB1dGVkIHJlZ2lzdGVyIHVzYWdlIGRpZmZlcnMgZnJvbSBzcGVjaWZpZWQgb25lIixXQVJOSU5HfElORlVOQywKKyJ0cmFpbGluZyBnYXJiYWdlIGluICNpbmNsdWRlIixXQVJOSU5HfEFOU0lWfFBSRVBST0MsCisidGFyZ2V0LXdhcm5pbmc6ICVzIixXQVJOSU5HLAorInRhcmdldC1lcnJvcjogJXMiLEVSUk9SfEZBVEFMLAorIiN3YXJuaW5nJXMiLFdBUk5JTkd8UFJFUFJPQ3xBTlNJViwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAzMjUgKi8KKyJ0cmFpbGluZyBnYXJiYWdlIGluICN1bmRlZiIsV0FSTklOR3xQUkVQUk9DfEFOU0lWLAorIkZsYWcgPCVzPjogc3ludGF4IGVycm9yIixGQVRBTHxFUlJPUnxOT0xJTkUsCisiV3JvbmcgTUlTUkEgdmVyc2lvbiAoJWQpIHNwZWNpZmllZCBmb3IgZmxhZyAlcyVzIixGQVRBTHxFUlJPUnxOT0xJTkUsCisiTm8gc3VjaCBNSVNSQSAxOTk4IFJ1bGUgKCVkKSBpbiBmbGFnICVzJXMiLEZBVEFMfEVSUk9SfE5PTElORSwKKyJObyBzdWNoIE1JU1JBIDIwMDQgUnVsZSglZC4lZCkgaW4gZmxhZyAlcyVzIixGQVRBTHxFUlJPUnxOT0xJTkUsICAvKiAgMzMwICovCisidW5rbm93biByZWdpc3RlciA8JXM+IixGQVRBTHxFUlJPUnxOT0xJTkUsCisiaWxsZWdhbCBiaXRmaWVsZCBzaXplIixFUlJPUnxBTlNJViwKKyJGbGFnIDwlcz4gY29uZmxpY3RzIHdpdGggZmxhZyA8JXM+IixGQVRBTHxFUlJPUnxOT0xJTkUsCisidmJjYyB3YXMgbm90IGNvbXBpbGVkIHdpdGggPCVzPiBzdXBwb3J0IixGQVRBTHxFUlJPUnxOT0xJTkUsCisieyBleHBlY3RlZCIsRVJST1J8QU5TSVYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDMzNSAqLworImJhc2UgY2xhc3MgPCVzPiBoYXMgaW5jb21wbGV0ZSB0eXBlIixFUlJPUnxBTlNJViwKKyJ1bmtub3duIGNsYXNzL3N0cnVjdCA8JXM+IixFUlJPUnxBTlNJViwKKyI8JXM+IGRlY2xhcmVkIGFzIGEgdmlydHVhbCBmaWVsZCIsRVJST1J8QU5TSVYsCisiPHZpcnR1YWw+IG9ubHkgYWxsb3dlZCBhdCBtZXRob2QgZGVjbGFyYXRpb25zIixFUlJPUnxBTlNJViwKKyJubyBzdWNoIG1lbWJlciBmdW5jdGlvbiBkZWNsYXJlZCIsRVJST1J8QU5TSVYsICAgICAgICAgICAgICAgICAgICAvKiAzNDAgKi8KKyI6OiB1bmV4cGVjdGVkIixFUlJPUnxBTlNJViwKKyJwb2x5bW9ycGhpYyB0eXBlIDwlcz4gbXVzdCBiZSBpbml0aWFsaXplZCBieSBjb25zdHJ1Y3RvciIsRVJST1J8QU5TSVYsCisidW5rbm93biBsYW5ndWFnZSBpbiBsaW5rYWdlIHNwZWNpZmljYXRpb24gPCVzPiIsRVJST1J8QU5TSVYsCisibXVsdGlwbGUgaW5pdGlhbGl6YXRpb25zIGZvciA8JXM+IixFUlJPUnxBTlNJViwKKyJ0b28gbWFueSBhcmd1bWVudHMgZm9yIDwlcz4iLEVSUk9SfEFOU0lWLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzNDUgKi8KKyJubyBmaXR0aW5nIG92ZXJsb2FkZWQgZnVuY3Rpb24gZm91bmQiLEVSUk9SfEFOU0lWLAorImNhbGwgb2Ygb3ZlcmxvYWRlZCBmdW5jdGlvbiA8JXM+IGlzIGFtYmlndW91cyIsRVJST1J8QU5TSVYsCisibWVtYmVyIGRpZmZlcnMgZnJvbSBwcmV2aW91cyBkZWNsYXJhdGlvbiIsRVJST1J8QU5TSVYsCisibWVtYmVyIG5vdCBwcmV2aW91c2x5IGRlY2xhcmVkIixFUlJPUnxBTlNJViwKKyJhY2Nlc3MgaXMgJXMiLEVSUk9SfEFOU0lWLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzNTAgKi8KKyJqdW1wIGludG8gc2NvcGUgb2YgdmFyaWFibGUtbGVuZ3RoLWFycmF5IixFUlJPUnxBTlNJVnxJTklDfEZBVEFMLAorInZhcmlhYmxlLWxlbmd0aC1hcnJheSAoJXMpIGluIHN0cnVjdC91bmlvbiIsRVJST1J8QU5TSVYsCisiZW5jb3VudGVyZWQgbm9uLWV4aXN0ZW50IGxhYmVsIGR1cmluZyBvcHRpbWl6aW5nIixFUlJPUnxBTlNJVnxJTkZVTkN8RkFUQUwsCisiYXJyYXkgZGVzaWduYXRvciBub3QgaW4gdmFsaWQgcmFuZ2UiLEVSUk9SfEFOU0lWLAorIic9JyBleHBlY3RlZCIsRVJST1J8QU5TSVYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM1NSAqLworInR5cGUgaGFzIG5vbi1lbXB0eSBpZGVudGlmaWVyIixXQVJOSU5HfEFOU0lWLAorInVudGVybWluYXRlZCAvLyBjb21tZW50IixQUkVQUk9DfFdBUk5JTkd8QU5TSVYsCisiaW5pdGlhbGl6YXRpb24gb2YgdmFyaWFibGUtbGVuZ3RoIGFycmF5IixFUlJPUnxBTlNJViwKKyJpbml0aWFsaXphdGlvbiBvZiBmbGV4aWJsZSBhcnJheSBtZW1iZXIiLEVSUk9SfEFOU0lWLAorImVtcHR5IGluaXRpYWxpemVyIixFUlJPUnxGQVRBTHxBTlNJViwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM2MCAqLworInJlZGVjbGFyYXRpb24gb2YgdmFyIDwlcz4gYXMgbmV3IGZ1bmN0aW9uIixFUlJPUnxGQVRBTHxBTlNJViwKKyJjb25zdGFudCBpbXBsaWNpdGx5IHNpZ24tY2hhbmdlZCIsV0FSTklOR3xET05UV0FSTiwKKyJjb25zdGFudCBpbXBsaWNpdGx5IHRydW5jYXRlZCIsV0FSTklORywKKyJoZXhhZGVjaW1hbCBlc2NhcGUgc2VxdWVuY2Ugb3ZlcmZsb3ciLFdBUk5JTkcsCisibWlzc2luZyBpZGVudGlmaWVyIixFUlJPUnxGQVRBTHxBTlNJViwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzY1ICovCisibmVnYXRpdmUgc2hpZnQgY291bnQgaXMgdW5kZWZpbmVkIixXQVJOSU5HLAorInNoaWZ0IGNvdW50IHRvbyBsYXJnZSBmb3IgZGF0YSB0eXBlIixXQVJOSU5HLAorInJlZGVjbGFyYXRpb24gb2YgZnVuY3Rpb24gYXJndW1lbnQgd2l0aCBkaWZmZXJlbnQgcmVnaXN0ZXIiLFdBUk5JTkcsCisiZGVjbGFyYXRpb24gZXhwZWN0ZWQiLFdBUk5JTkd8QU5TSVYsCisicG9zc2libGUgcmVkZWNsYXJhdGlvbiBvZiB2YXIgPCVzPiB3aXRoIGRpZmZlcmVudCBhdHRyaWJ1dGVzIDwlcz4gYW5kIDwlcz4iLFdBUk5JTkcsIC8qIDM3MCAqLworInJlZGVjbGFyYXRpb24gb2YgdmFyIDwlcz4gd2l0aCBuZXcgYXR0cmlidXRlIDwlcz4iLFdBUk5JTkcsCmRpZmYgLS1naXQgYS9mbG93LmMgYi9mbG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJlMWMwYwotLS0gL2Rldi9udWxsCisrKyBiL2Zsb3cuYwpAQCAtMCwwICsxLDYwOSBAQAorLyogICRWRVI6IHZiY2MgKGZsb3cuYykgJFJldmlzaW9uOiAxLjEzICQgICAgKi8KKy8qICBHZW5lcmllcnVuZyBkZXMgRkx1c3NncmFwaHMgdW5kIE9wdGltaWVydW5nZW4gZGVzIEtvbnRyb2xsZmx1c3NlcyAgICovCisKKyNpbmNsdWRlICJvcHQuaCIKKworc3RhdGljIGNoYXIgRklMRV9bXT1fX0ZJTEVfXzsKKworaW50IGJ2Y21wKGJ2dHlwZSAqZGVzdCxidnR5cGUgKnNyYyxzaXplX3QgbGVuKQorLyogIHZlcmdsZWljaHQgendlaSBCaXR2ZWt0b3JlbiAgICAqLworeworICBsZW4vPXNpemVvZihidnR5cGUpOworICBmb3IoO2xlbj4wO2xlbi0tKQorICAgIGlmKCpkZXN0KyshPSpzcmMrKykgcmV0dXJuKDApOworICByZXR1cm4oMSk7Cit9CisvKiBTY2huaXR0bWVuZ2UgbmljaHQgbGVlcj8gKi8KK2ludCBidmRvaW50ZXJzZWN0KGJ2dHlwZSAqcDEsYnZ0eXBlICpwMixzaXplX3QgbGVuKQoreworICBsZW4vPXNpemVvZihidnR5cGUpOworICBmb3IoO2xlbj4wO2xlbi0tKQorICAgIGlmKCpwMSsrJipwMisrKQorICAgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQordm9pZCBidnVuaXRlKGJ2dHlwZSAqZGVzdCxidnR5cGUgKnNyYyxzaXplX3QgbGVuKQorLyogIGJlcmVjaG5ldCBWZXJlaW5pZ3VuZyB6d2VpZXIgQml0dmVrdG9yZW4gICAgKi8KK3sKKyAgbGVuLz1zaXplb2YoYnZ0eXBlKTsKKyAgZm9yKDtsZW4+MDtsZW4tLSkKKyAgICAqZGVzdCsrfD0qc3JjKys7Cit9Cit2b2lkIGJ2aW50ZXJzZWN0KGJ2dHlwZSAqZGVzdCxidnR5cGUgKnNyYyxzaXplX3QgbGVuKQorLyogIGJlcmVjaG5ldCBEdXJjaHNjaG5pdHQgendlaWVyIEJpdHZla3RvcmVuICAgKi8KK3sKKyAgbGVuLz1zaXplb2YoYnZ0eXBlKTsKKyAgZm9yKDtsZW4+MDtsZW4tLSkKKyAgICAqZGVzdCsrJj0qc3JjKys7Cit9Cit2b2lkIGJ2ZGlmZihidnR5cGUgKmRlc3QsYnZ0eXBlICpzcmMsc2l6ZV90IGxlbikKKy8qICBiZXJlY2huZXQgJ0RpZmZlcmVueicgendlaWVyIEJpdHZla3RvcmVuICAgICovCit7CisgIGxlbi89c2l6ZW9mKGJ2dHlwZSk7CisgIGZvcig7bGVuPjA7bGVuLS0pCisgICAgKmRlc3QrKyY9figqc3JjKyspOworfQorCit1bnNpZ25lZCBpbnQgYmFzaWNfYmxvY2tzOworCitmbG93Z3JhcGggKm5ld19mbG93Z3JhcGgodm9pZCkKK3sKKyAgZmxvd2dyYXBoICpuZXc7CisgIG5ldz1teW1hbGxvYyhzaXplb2YoKm5ldykpOworICBuZXctPmF2X2luPW5ldy0+YXZfb3V0PW5ldy0+YXZfZ2VuPW5ldy0+YXZfa2lsbD0wOworICBuZXctPnJkX2luPW5ldy0+cmRfb3V0PW5ldy0+cmRfZ2VuPW5ldy0+cmRfa2lsbD0wOworICBuZXctPmFlX2luPW5ldy0+YWVfb3V0PW5ldy0+YWVfZ2VuPW5ldy0+YWVfa2lsbD0wOworICBuZXctPmNwX2luPW5ldy0+Y3Bfb3V0PW5ldy0+Y3BfZ2VuPW5ldy0+Y3Bfa2lsbD0wOworICBuZXctPnB0PTA7ICAKKyAgbmV3LT5zdGFydD1uZXctPmVuZD0wOworICBuZXctPm5vcm1hbG91dD1uZXctPmJyYW5jaG91dD0wOworICBuZXctPmluPTA7CisgIG5ldy0+bG9vcGVuZD0wOworI2lmIEFMRVhfUkVHCisgIG5ldy0+bG9vcF9kZXB0aD0wOworI2VuZGlmCisgIHJldHVybiBuZXc7Cit9CisKK2Zsb3dncmFwaCAqY29uc3RydWN0X2Zsb3dncmFwaCh2b2lkKQorLyogIGVudGZlcm50IHVlYmVyZmx1ZXNzaWdlIExhYmVscyB1bmQgZXJ6ZXVndCBGbHVzc2dyYXBoICAgKi8KK3sKKyAgICBJQyAqcCwqY2w7CisgICAgaW50IGZpcnN0bCxsY250LGN1cnJlbnRsLGksY29kZSxsOworICAgIGludCAqaXNlcSwqdXNlZDsKKyAgICBmbG93Z3JhcGggKipsZywqZywqZmc7CisgICAgaWYoY3Jvc3NfbW9kdWxlKXsKKyAgICAgIGludCBsYXN0bDsKKyAgICAgIGZpcnN0bD0wO2xhc3RsPTA7bGNudD0wOworICAgICAgZm9yKHA9Zmlyc3RfaWM7cDtwPXAtPm5leHQpeworCWlmKHAtPmNvZGU9PUxBQkVMKXsKKwkgIGlmKHAtPnR5cGY8Zmlyc3RsKSBmaXJzdGw9cC0+dHlwZjsKKwkgIGlmKHAtPnR5cGY+bGFzdGwpIGxhc3RsPXAtPnR5cGY7CisJfQorICAgICAgfQorICAgICAgbGNudD1sYXN0bC1maXJzdGwrMTsKKyAgICB9ZWxzZXsKKyAgICAgIGZpcnN0bD1sYXN0bGFiZWw7CisgICAgICBsY250PWxhYmVsLWZpcnN0bDsKKyAgICB9CisgICAgcmV0dXJuX2xhYmVsPTA7CisgICAgaWYobGFzdF9pYyYmbGFzdF9pYy0+Y29kZT09TEFCRUwpIHJldHVybl9sYWJlbD1sYXN0X2ljLT50eXBmOworICAgIGlmKGxhc3RfaWMmJmxhc3RfaWMtPmNvZGU9PVNFVFJFVFVSTiYmbGFzdF9pYy0+cHJldiYmbGFzdF9pYy0+cHJldi0+Y29kZT09TEFCRUwpIHJldHVybl9sYWJlbD1sYXN0X2ljLT5wcmV2LT50eXBmOworCisgICAgaXNlcT1teW1hbGxvYyhsY250KnNpemVvZihpbnQpKTsKKyAgICB1c2VkPW15bWFsbG9jKGxjbnQqc2l6ZW9mKGludCkpOworICAgIGxnPW15bWFsbG9jKGxjbnQqc2l6ZW9mKGZsb3dncmFwaCAqKSk7CisgICAgZz1uZXdfZmxvd2dyYXBoKCk7CisgICAgZmc9ZzsKKyAgICBnLT5zdGFydD1maXJzdF9pYztnLT5pbj0wO2ctPmJyYW5jaG91dD0wO2ctPmxvb3BlbmQ9MDsKKworICAgIGZvcihpPTA7aTxsY250O2krKykge2lzZXFbaV09dXNlZFtpXT0wO2xnW2ldPTA7fQorICAgIGN1cnJlbnRsPTA7Zmlyc3RsKys7CisgICAgLyogIERpZXNlIFNjaGxlaWZlIGVudGZlcm50IGFsbGUgTGFiZWxzLCBkaWUgbWl0IGFuZGVyZW4gICAgKi8KKyAgICAvKiAgdWViZXJlaW5zdGltbWVuLCBtZXJrdCBzaWNoIGRhcyB1bmQga2VubnplaWNobmV0IGFsbGUgICAqLworICAgIC8qICBMYWJlbHMsIGRpZSBiZW51dHp0IHdlcmRlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIEF1c3NlcmRlbSB3aXJkIGRlciBGbHVzc2dyYXBoIHRlaWx3ZWlzZSBhdWZnZWJhdXQuICAgICAgKi8KKyAgICBpZihERUJVRyYxMDI0KSB7cHV0cygiY29uc3RydWN0X2Zsb3dncmFwaCgpOiBsb29wMSIpOy8qc2NhbmYoIiVkIiwmaSk7Ki99CisgICAgaT0xO2ctPmluZGV4PWk7CisgICAgZm9yKHA9Zmlyc3RfaWM7cDspeworICAgICAgICBjb2RlPXAtPmNvZGU7CisgICAgICAgIGlmKGNvZGU+PUJFUSYmY29kZTw9QlJBKXsKKyAgICAgICAgICAgIGw9cC0+dHlwZjsKKyAgICAgICAgICAgIC8qICBhbHMgdXNlZCBtYXJraWVyZW47IGZhbGxzIGFlcXVpdmFsZW50LCBkYXMgZXJzdGUgbWFya2llcmVuICAqLworICAgICAgICAgICAgaWYoaXNlcVtsLWZpcnN0bF0pIHVzZWRbaXNlcVtsLWZpcnN0bF0tZmlyc3RsXT0xOworICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgIHVzZWRbbC1maXJzdGxdPTE7CisgICAgICAgICAgICAvKiAgRmx1c3NncmFwaCBiZWVuZGVuIHVuZCBldnRsLiBuYWVjaHN0ZW4gS25vdGVuIGVyemV1Z2VuICAqLworICAgICAgICAgICAgZy0+ZW5kPXA7CisgICAgICAgICAgICBpZihwLT5uZXh0KXsKKwkgICAgICBnLT5ub3JtYWxvdXQ9bmV3X2Zsb3dncmFwaCgpOworCSAgICAgIGctPm5vcm1hbG91dC0+aW49bXltYWxsb2Moc2l6ZW9mKGZsb3dsaXN0KSk7CisJICAgICAgZy0+bm9ybWFsb3V0LT5pbi0+bmV4dD0wOworCSAgICAgIGctPm5vcm1hbG91dC0+aW4tPmdyYXBoPWc7CisJICAgICAgZz1nLT5ub3JtYWxvdXQ7CisJICAgICAgZy0+c3RhcnQ9cC0+bmV4dDsKKwkgICAgICBnLT5icmFuY2hvdXQ9MDsKKwkgICAgICBnLT5sb29wZW5kPTA7CisJICAgICAgZy0+aW5kZXg9KytpOworICAgICAgICAgICAgfWVsc2UgZy0+bm9ybWFsb3V0PTA7CisKKyAgICAgICAgICAgIGN1cnJlbnRsPTA7cD1wLT5uZXh0O2NvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmKGNvZGU9PUFMTE9DUkVHfHxjb2RlPT1GUkVFUkVHKXtwPXAtPm5leHQ7IGNvbnRpbnVlO30KKyAgICAgICAgaWYoY29kZSE9TEFCRUwpe2N1cnJlbnRsPTA7cD1wLT5uZXh0O2NvbnRpbnVlO30KKyAgICAgICAgLyogIGlzdCBlaW4gTGFiZWwgICAqLworICAgICAgICBsPXAtPnR5cGY7CisgICAgICAgIGlmKGN1cnJlbnRsKXsKKwkgICAgSUMgKm07CisgICAgICAgICAgICBpc2VxW2wtZmlyc3RsXT1jdXJyZW50bDsKKwkgICAgaWYobD09cmV0dXJuX2xhYmVsKSByZXR1cm5fbGFiZWw9Y3VycmVudGw7CisgICAgICAgICAgICBpZih1c2VkW2wtZmlyc3RsXSkgdXNlZFtjdXJyZW50bC1maXJzdGxdPTE7CisJICAgIGNsLT5mbGFnc3w9cC0+ZmxhZ3M7CisJICAgIG09cDtwPXAtPm5leHQ7CisgICAgICAgICAgICByZW1vdmVfSUMobSk7CisJICAgIGNvbnRpbnVlOworLyogICAgICAgICAgICBpZihERUJVRyYxMDI0KSBwcmludGYoImxhYmVsICVkPT0lZFxuIixsLGlzZXFbbC1maXJzdGxdKTsqLworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGN1cnJlbnRsPWw7Y2w9cDsKKyAgICAgICAgICAgIGlmKGctPnN0YXJ0IT1wKXsKKyAgICAgICAgICAgICAgICBnLT5lbmQ9cC0+cHJldjsKKyAgICAgICAgICAgICAgICBnLT5ub3JtYWxvdXQ9bmV3X2Zsb3dncmFwaCgpOworICAgICAgICAgICAgICAgIGctPm5vcm1hbG91dC0+aW49bXltYWxsb2Moc2l6ZW9mKGZsb3dsaXN0KSk7CisgICAgICAgICAgICAgICAgZy0+bm9ybWFsb3V0LT5pbi0+bmV4dD0wOworICAgICAgICAgICAgICAgIGctPm5vcm1hbG91dC0+aW4tPmdyYXBoPWc7CisgICAgICAgICAgICAgICAgZz1nLT5ub3JtYWxvdXQ7CisgICAgICAgICAgICAgICAgZy0+c3RhcnQ9cDsKKyAgICAgICAgICAgICAgICBnLT5icmFuY2hvdXQ9MDsKKyAgICAgICAgICAgICAgICBnLT5sb29wZW5kPTA7CisgICAgICAgICAgICAgICAgZy0+aW5kZXg9KytpOworICAgICAgICAgICAgfWVsc2UgZy0+YnJhbmNob3V0PTA7CisgICAgICAgICAgICBsZ1tsLWZpcnN0bF09ZzsKKyAgICAgICAgfQorCXA9cC0+bmV4dDsKKyAgICB9CisgICAgZy0+ZW5kPWxhc3RfaWM7Zy0+bm9ybWFsb3V0PWctPmJyYW5jaG91dD0wOworICAgIGlmKERFQlVHJigxNjM4NHwxMDI0KSkgcHJpbnRmKCIlZCBiYXNpYyBibG9ja3NcbiIsaSk7CisgICAgYmFzaWNfYmxvY2tzPWk7CisKKy8qICAgIGlmKERFQlVHJjEwMjQpIGZvcihpPWZpcnN0bDtpPD1sY250O2krKykgcHJpbnRmKCJMJWQgdXNlZDogJWRcbiIsaSx1c2VkW2ktZmlyc3RsXSk7Ki8KKyAgICAvKiAgRGllc2UgU2NobGVpZmUgZW50ZmVybnQgYWxsZSBuaWNodCBiZW51dHp0ZW4gTGFiZWxzIHVuZCBiaWVndCBhbGxlICAqLworICAgIC8qICBCcmFuY2hlcyBhdWYgYWVxdWl2YWxlbnRlIExhYmVscyB1bS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYoREVCVUcmMTAyNCkge3B1dHMoImNvbnN0cnVjdF9mbG93Z3JhcGgoKTogbG9vcDIiKTsvKnNjYW5mKCIlZCIsJmkpOyovfQorICAgIGc9Zmc7CisgICAgd2hpbGUoZyl7CisgICAgICAgIGludCBmbGFnPTA7Zmxvd2xpc3QgKmxwOworLyogICAgICAgIHByaW50ZigiZz0lcFxuIiwodm9pZCAqKWcpOyovCisgICAgICAgIGctPmF2X2luPWctPmF2X291dD1nLT5hdl9nZW49Zy0+YXZfa2lsbD0wOworICAgICAgICBnLT5yZF9pbj1nLT5yZF9vdXQ9Zy0+cmRfZ2VuPWctPnJkX2tpbGw9MDsKKyAgICAgICAgZy0+YWVfaW49Zy0+YWVfb3V0PWctPmFlX2dlbj1nLT5hZV9raWxsPTA7CisgICAgICAgIGctPmNwX2luPWctPmNwX291dD1nLT5jcF9nZW49Zy0+Y3Bfa2lsbD0wOworCWctPnB0PTA7CisgICAgICAgIHA9Zy0+c3RhcnQ7CisgICAgICAgIHdoaWxlKHAmJiFmbGFnKXsKKy8qICAgICAgICAgICAgcHJpYzIoc3Rkb3V0LHApOyovCisgICAgICAgICAgICBjb2RlPXAtPmNvZGU7CisgICAgICAgICAgICBpZihjb2RlPj1CRVEmJmNvZGU8PUJSQSl7CisgICAgICAgICAgICAgICAgbD1wLT50eXBmOworICAgICAgICAgICAgICAgIGlmKGlzZXFbbC1maXJzdGxdKSBwLT50eXBmPWw9aXNlcVtsLWZpcnN0bF07CisgICAgICAgICAgICAgICAgLyogIGluIEZsdXNzZ3JhcGggZWludHJhZ2VuICovCisgICAgICAgICAgICAgICAgZy0+YnJhbmNob3V0PWxnW2wtZmlyc3RsXTsKKyAgICAgICAgICAgICAgICBpZighbGdbbC1maXJzdGxdKSBlcnJvcigzNTMpOworICAgICAgICAgICAgICAgIGxwPWxnW2wtZmlyc3RsXS0+aW47CisgICAgICAgICAgICAgICAgLyogIGRhcyBoaWVyIHNvbGx0ZSBtYW4gbm9jaCBzY2hvZW5lciBtYWNoZW4gICAgKi8KKyAgICAgICAgICAgICAgICBpZighbHApeworICAgICAgICAgICAgICAgICAgICBsZ1tsLWZpcnN0bF0tPmluPW15bWFsbG9jKHNpemVvZihmbG93bGlzdCkpOworICAgICAgICAgICAgICAgICAgICBsZ1tsLWZpcnN0bF0tPmluLT5uZXh0PTA7CisgICAgICAgICAgICAgICAgICAgIGxnW2wtZmlyc3RsXS0+aW4tPmdyYXBoPWc7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKGxwJiZscC0+bmV4dCkgbHA9bHAtPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIGxwLT5uZXh0PW15bWFsbG9jKHNpemVvZihmbG93bGlzdCkpOworICAgICAgICAgICAgICAgICAgICBscC0+bmV4dC0+bmV4dD0wOworICAgICAgICAgICAgICAgICAgICBscC0+bmV4dC0+Z3JhcGg9ZzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisvKiAgICAgICAgICAgIGlmKGNvZGU9PUxBQkVMJiYhdXNlZFtwLT50eXBmLWZpcnN0bF0pIHJlbW92ZV9JQyhwKTsqLworICAgICAgICAgICAgaWYocD09Zy0+ZW5kKSBmbGFnPTE7CisgICAgICAgICAgICBwPXAtPm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgZz1nLT5ub3JtYWxvdXQ7CisgICAgfQorICAgIC8qICBVbmJlbnV0enRlIExhYmVscyBlbnRmZXJuZW4gdW5kIEJsb2Vja2UgdmVyYmluZGVuICAgKi8KKyAgICBpZihERUJVRyYxMDI0KSB7cHV0cygiY29uc3RydWN0X2Zsb3dncmFwaCgpOiBsb29wMyIpOy8qc2NhbmYoIiVkIiwmaSk7Ki99CisgICAgZm9yKGc9Zmc7ZztnPWctPm5vcm1hbG91dCl7CisgICAgICAgIGlmKGctPmVuZCYmKGctPmVuZC0+Y29kZTxCRVF8fGctPmVuZC0+Y29kZT5CUkEpKXsKKyAgICAgICAgICAgIGZsb3dncmFwaCAqbmV4dD1nLT5ub3JtYWxvdXQ7Zmxvd2xpc3QgKmxwOworICAgICAgICAgICAgaWYobmV4dCYmbmV4dC0+c3RhcnQmJm5leHQtPnN0YXJ0LT5jb2RlPT1MQUJFTCYmIXVzZWRbbmV4dC0+c3RhcnQtPnR5cGYtZmlyc3RsXSl7CisgICAgICAgICAgICAgICAgaWYobmV4dC0+ZW5kIT1uZXh0LT5zdGFydCkgZy0+ZW5kPW5leHQtPmVuZDsKKyAgICAgICAgICAgICAgICBnLT5ub3JtYWxvdXQ9bmV4dC0+bm9ybWFsb3V0OworICAgICAgICAgICAgICAgIGctPmJyYW5jaG91dD1uZXh0LT5icmFuY2hvdXQ7CisgICAgICAgICAgICAgICAgZnJlZShuZXh0LT5pbik7IC8qICBkYXJmIGVpZ2VudGxpY2ggbnVyIGVpbmVuIFZvcmdhZW5nZXIgaGFiZW4gICovCisgICAgICAgICAgICAgICAgLyogIGluIGltIE5hY2hmb2xnZWtub3RlbiBhdWYgZGVuIGVyc3RlbiBkZXIgYmVpZGVuIHNldHplbiAgKi8KKyAgICAgICAgICAgICAgICBpZihuZXh0LT5ub3JtYWxvdXQmJm5leHQtPm5vcm1hbG91dC0+aW4pIG5leHQtPm5vcm1hbG91dC0+aW4tPmdyYXBoPWc7CisgICAgICAgICAgICAgICAgLyogIGluIGltIFppZWwgdm9uIG5leHQtPmJyYW5jaG91dCBhdWYgZGVuIGVyc3RlbiBzZXR6ZW4gICAgKi8KKyAgICAgICAgICAgICAgICBpZihuZXh0LT5icmFuY2hvdXQpeworICAgICAgICAgICAgICAgICAgICBscD1uZXh0LT5icmFuY2hvdXQtPmluOworICAgICAgICAgICAgICAgICAgICB3aGlsZSgxKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxwLT5ncmFwaD09bmV4dCl7IGxwLT5ncmFwaD1nO2JyZWFrO30KKyAgICAgICAgICAgICAgICAgICAgICAgIGxwPWxwLT5uZXh0O2lmKCFscCkgaWVycm9yKDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKERFQlVHJjEwMjQpeyBwcmludGYoInVudXNlZCBsYWJlbCBkZWxldGVkOlxuIik7cHJpYzIoc3Rkb3V0LG5leHQtPnN0YXJ0KTt9CisgICAgICAgICAgICAgICAgcmVtb3ZlX0lDKG5leHQtPnN0YXJ0KTsKKyAgICAgICAgICAgICAgICBmcmVlKG5leHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qICB1bmJlbnV0enRlIExhYmVscyBlbnRmZXJuZW4gKi8KKyAgICAgICAgaWYoZy0+c3RhcnQmJmctPnN0YXJ0LT5jb2RlPT1MQUJFTCYmIXVzZWRbZy0+c3RhcnQtPnR5cGYtZmlyc3RsXSkKKyAgICAgICAgICAgIHJlbW92ZV9JQ19mZyhnLGctPnN0YXJ0KTsKKyAgICB9CisgICAgZnJlZShpc2VxKTsKKyAgICBmcmVlKHVzZWQpOworICAgIHJldHVybihmZyk7Cit9CisKK3ZvaWQgcHJpbnRfZmxvd2dyYXBoKGZsb3dncmFwaCAqZykKKy8qICBHaWJ0IEZsdXNzZ3JhcGggYXVmIEJpbGRzY2hpcm0gYXVzICAqLworeworICAgIHN0YXRpYyBpbnQgZG9udHByaW50PTA7CisgICAgaW50IGZsYWcsaTtmbG93bGlzdCAqbHA7SUMgKmlwOworICAgIGlmKGRvbnRwcmludD4wKSB7ZG9udHByaW50LS07cmV0dXJuO30KKyAgICBpZihkb250cHJpbnQhPS0xKXsKKyAgICAgIHB1dHMoInByaW50X2Zsb3dncmFwaCgpIik7c2NhbmYoIiVkIiwmaSk7CisgICAgICBpZihpPC0xKXtkb250cHJpbnQ9LWk7cmV0dXJuO30KKyAgICAgIGlmKCFpKSByZXR1cm47CisgICAgICBpZihpPT0tMSl7ZG9udHByaW50PS0xOyBpPTE7fQorICAgIH1lbHNleworICAgICAgaT0xOworICAgIH0KKyAgICB3aGlsZShnKXsKKyAgICAgICAgcHJpbnRmKCJcbkJhc2ljIEJsb2NrIG5yLiAlZFxuIixnLT5pbmRleCk7CisgICAgICAgIHByaW50ZigiXHRpbiBmcm9tICIpOworICAgICAgICBscD1nLT5pbjsKKyAgICAgICAgd2hpbGUobHApe2lmKGxwLT5ncmFwaCkgcHJpbnRmKCIlZCAiLGxwLT5ncmFwaC0+aW5kZXgpO2xwPWxwLT5uZXh0O30KKyAgICAgICAgcHJpbnRmKCJcblx0b3V0IHRvICVkICVkXG4iLGctPm5vcm1hbG91dD9nLT5ub3JtYWxvdXQtPmluZGV4OjAsZy0+YnJhbmNob3V0P2ctPmJyYW5jaG91dC0+aW5kZXg6MCk7CisgICAgICAgIGlmKGctPmxvb3BlbmQpIHByaW50ZigiaGVhZCBvZiBhIGxvb3AgZW5kaW5nIGF0IGJsb2NrICVkXG4iLGctPmxvb3BlbmQtPmluZGV4KTsKKwlpZighKG9wdGZsYWdzJjMyKSYmZy0+cHQpCisJICBpZXJyb3IoMCk7CisgICAgICAgIGlmKGkmMil7CisgICAgICAgICAgICBwcmludGYoImF2X2dlbjpcbiIpOyBwcmludF9hdihnLT5hdl9nZW4pOworICAgICAgICAgICAgcHJpbnRmKCJhdl9raWxsOlxuIik7IHByaW50X2F2KGctPmF2X2tpbGwpOworICAgICAgICAgICAgcHJpbnRmKCJhdl9pbjpcbiIpOyBwcmludF9hdihnLT5hdl9pbik7CisgICAgICAgICAgICBwcmludGYoImF2X291dDpcbiIpOyBwcmludF9hdihnLT5hdl9vdXQpOworICAgICAgICB9CisgICAgICAgIGlmKGkmNCl7CisgICAgICAgICAgICBwcmludGYoInJkX2dlbjpcbiIpOyBwcmludF9yZChnLT5yZF9nZW4pOworICAgICAgICAgICAgcHJpbnRmKCJyZF9raWxsOlxuIik7IHByaW50X3JkKGctPnJkX2tpbGwpOworICAgICAgICAgICAgcHJpbnRmKCJyZF9pbjpcbiIpOyBwcmludF9yZChnLT5yZF9pbik7CisgICAgICAgICAgICBwcmludGYoInJkX291dDpcbiIpOyBwcmludF9yZChnLT5yZF9vdXQpOworICAgICAgICB9CisgICAgICAgIGlmKGkmOCl7CisgICAgICAgICAgICBwcmludGYoImFlX2dlbjpcbiIpOyBwcmludF9hZShnLT5hZV9nZW4pOworICAgICAgICAgICAgcHJpbnRmKCJhZV9raWxsOlxuIik7IHByaW50X2FlKGctPmFlX2tpbGwpOworICAgICAgICAgICAgcHJpbnRmKCJhZV9pbjpcbiIpOyBwcmludF9hZShnLT5hZV9pbik7CisgICAgICAgICAgICBwcmludGYoImFlX291dDpcbiIpOyBwcmludF9hZShnLT5hZV9vdXQpOworICAgICAgICB9CisgICAgICAgIGlmKGkmMTYpeworICAgICAgICAgICAgcHJpbnRmKCJjcF9nZW46XG4iKTsgcHJpbnRfY3AoZy0+Y3BfZ2VuKTsKKyAgICAgICAgICAgIHByaW50ZigiY3Bfa2lsbDpcbiIpOyBwcmludF9jcChnLT5jcF9raWxsKTsKKyAgICAgICAgICAgIHByaW50ZigiY3BfaW46XG4iKTsgcHJpbnRfY3AoZy0+Y3BfaW4pOworICAgICAgICAgICAgcHJpbnRmKCJjcF9vdXQ6XG4iKTsgcHJpbnRfY3AoZy0+Y3Bfb3V0KTsKKyAgICAgICAgfQorICAgICAgICBpZihpJjMyKXsKKyAgICAgICAgICAgIGludCByOworICAgICAgICAgICAgZm9yKHI9MTtyPD1NQVhSO3IrKykKKyAgICAgICAgICAgICAgICBpZihnLT5yZWd2W3JdKSBwcmludGYoIiglcyksJWxkIGFzc2lnbmVkIHRvICVzXG4iLGctPnJlZ3Zbcl0tPmlkZW50aWZpZXIsKGxvbmcpem0ybChnLT5yZWd2W3JdLT5vZmZzZXQpLHJlZ25hbWVzW3JdKTsKKyAgICAgICAgfQorCWlmKGkmNjQpeworCSAgcHJpbnRfcHQoZy0+cHQpOworCX0KKyAgICAgICAgZmxhZz0wO2lwPWctPnN0YXJ0OworICAgICAgICB3aGlsZShpcCYmIWZsYWcpeworICAgICAgICAgICAgcHJpYzIoc3Rkb3V0LGlwKTsKKyAgICAgICAgICAgIGlmKGkmNjQpeworICAgICAgICAgICAgICAgIGludCByOworICAgICAgICAgICAgICAgIHByaW50ZigiY2hhbmdlczogIik7CisgICAgICAgICAgICAgICAgZm9yKHI9MDtyPGlwLT5jaGFuZ2VfY250O3IrKykKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIoJXMsJWxkLCVkLCVkKSIsaXAtPmNoYW5nZV9saXN0W3JdLnYtPmlkZW50aWZpZXIsKGxvbmcpem0ybChpcC0+Y2hhbmdlX2xpc3Rbcl0udi0+b2Zmc2V0KSxpcC0+Y2hhbmdlX2xpc3Rbcl0uZmxhZ3MsaXAtPmNoYW5nZV9saXN0W3JdLnYtPmluZGV4KTsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxudXNlczogIik7CisgICAgICAgICAgICAgICAgZm9yKHI9MDtyPGlwLT51c2VfY250O3IrKykKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIoJXMsJWxkLCVkLCVkKSIsaXAtPnVzZV9saXN0W3JdLnYtPmlkZW50aWZpZXIsKGxvbmcpem0ybChpcC0+dXNlX2xpc3Rbcl0udi0+b2Zmc2V0KSxpcC0+dXNlX2xpc3Rbcl0uZmxhZ3MsaXAtPnVzZV9saXN0W3JdLnYtPmluZGV4KTsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihpcD09Zy0+ZW5kKSBmbGFnPTE7CisgICAgICAgICAgICBpcD1pcC0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBnPWctPm5vcm1hbG91dDsKKyAgICB9CisgICAgcHJpbnRmKCJyZXR1cm5fbGFiZWw9JWRcbiIscmV0dXJuX2xhYmVsKTsKK30KK3ZvaWQgZnJlZV9mbG93Z3JhcGgoZmxvd2dyYXBoICpnKQorLyogIEdpYnQgRmx1c3NncmFwaCBmcmVpICAgICovCit7CisgICAgZmxvd2dyYXBoICpwbTtmbG93bGlzdCAqbHAsKmxwbTsKKyAgICBpZihERUJVRyYoMTYzODR8MTAyNCkpIHB1dHMoImZyZWVfZmxvd2dyYXBoKCkiKTsKKyAgICB3aGlsZShnKXsKKyAgICAgICAgbHA9Zy0+aW47CisgICAgICAgIHdoaWxlKGxwKXsKKyAgICAgICAgICAgIGxwbT1scC0+bmV4dDsKKyAgICAgICAgICAgIGZyZWUobHApOworICAgICAgICAgICAgbHA9bHBtOworICAgICAgICB9CisgICAgICAgIGZyZWUoZy0+YXZfaW4pOworICAgICAgICBmcmVlKGctPmF2X291dCk7CisgICAgICAgIGZyZWUoZy0+YXZfZ2VuKTsKKyAgICAgICAgZnJlZShnLT5hdl9raWxsKTsKKyAgICAgICAgZnJlZShnLT5yZF9pbik7CisgICAgICAgIGZyZWUoZy0+cmRfb3V0KTsKKyAgICAgICAgZnJlZShnLT5yZF9nZW4pOworICAgICAgICBmcmVlKGctPnJkX2tpbGwpOworICAgICAgICBmcmVlKGctPmFlX2luKTsKKyAgICAgICAgZnJlZShnLT5hZV9vdXQpOworICAgICAgICBmcmVlKGctPmFlX2dlbik7CisgICAgICAgIGZyZWUoZy0+YWVfa2lsbCk7CisgICAgICAgIGZyZWUoZy0+Y3BfaW4pOworICAgICAgICBmcmVlKGctPmNwX291dCk7CisgICAgICAgIGZyZWUoZy0+Y3BfZ2VuKTsKKyAgICAgICAgZnJlZShnLT5jcF9raWxsKTsKKwlmcmVlX3B0KGctPnB0KTsKKworICAgICAgICBwbT1nLT5ub3JtYWxvdXQ7CisgICAgICAgIGZyZWUoZyk7CisgICAgICAgIGc9cG07CisgICAgfQorfQorc3RhdGljIHZvaWQgbWFya19yZWFjaGFibGUoZmxvd2dyYXBoICpmZykKKy8qIG5lZ2llcnQgZGVuIGluZGV4IGFsbGVyIEJsb2Vja2UsIGRpZSByZWFjaGFibGUgc2luZCAqLworeworICBmZy0+aW5kZXg9LWZnLT5pbmRleDsKKyAgaWYoZmctPmJyYW5jaG91dCYmZmctPmJyYW5jaG91dC0+aW5kZXg+PTApCisgICAgbWFya19yZWFjaGFibGUoZmctPmJyYW5jaG91dCk7CisgIGlmKGZnLT5ub3JtYWxvdXQmJighZmctPmVuZHx8ZmctPmVuZC0+Y29kZSE9QlJBKSYmZmctPm5vcm1hbG91dC0+aW5kZXg+PTApCisgICAgbWFya19yZWFjaGFibGUoZmctPm5vcm1hbG91dCk7Cit9CitmbG93Z3JhcGggKmp1bXBfb3B0aW1pemF0aW9uKHZvaWQpCisvKiAgZW50ZmVybnQgdWViZXJmbHVlc3NpZ2UgU3BydWVuZ2UgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgICAgZmxvd2dyYXBoICpmZywqZztJQyAqcDtpbnQgY2hhbmdlZCxpOworICAgIGZsb3dsaXN0ICpscDsKKyAgICBkb3sKKyAgICAgICAgY2hhbmdlZD0wOworICAgICAgICBmZz1jb25zdHJ1Y3RfZmxvd2dyYXBoKCk7CisJbWFya19yZWFjaGFibGUoZmcpOworICAgICAgICBpZihERUJVRyYxMDI0KSB7cHJpbnRmKCJqdW1wX29wdGltaXphdGlvbigpIHBhc3NcbiIpO3ByaW50X2Zsb3dncmFwaChmZyk7fQorICAgICAgICBnPWZnOworICAgICAgICB3aGlsZShnKXsKKyAgICAgICAgICAgIC8qICB0b3RlIEJsb2Vja2UgZW50ZmVybmVuICAgICAgICAgICAgICAgICAgKi8KKwkgICAgaWYoZy0+aW5kZXg8MCl7CisJICAgICAgICBnLT5pbmRleD0tZy0+aW5kZXg7CisJICAgIH1lbHNleworICAgICAgICAgICAgICAgIElDICptOworICAgICAgICAgICAgICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiZGVsZXRpbmcgZGVhZCBibG9jayAlZFxuIixnLT5pbmRleCk7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgICAgICAgICAgICAgcD1nLT5zdGFydDtpPTA7CisgICAgICAgICAgICAgICAgd2hpbGUocCYmIWkpeworICAgICAgICAgICAgICAgICAgICBpZihwPT1nLT5lbmQpIGk9MTsKKyAgICAgICAgICAgICAgICAgICAgaWYoREVCVUcmMTAyNCkgcHJpYzIoc3Rkb3V0LHApOworICAgICAgICAgICAgICAgICAgICBtPXAtPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9JQ19mZyhnLHApO2NoYW5nZWQ9Z2NoYW5nZWQ9MTsKKyAgICAgICAgICAgICAgICAgICAgcD1tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihnLT5icmFuY2hvdXQpeworICAgICAgICAgICAgICAgIC8qICBFaW50cmFnIGluIFppZWwgbG9lc2NoZW4gKG51ciBlaW5tYWwsIGZhbGxzIGF1Y2ggbm9ybWFsb3V0KSAgICAqLworICAgICAgICAgICAgICAgICAgICBscD1nLT5icmFuY2hvdXQtPmluOworICAgICAgICAgICAgICAgICAgICB3aGlsZShscCl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihscC0+Z3JhcGg9PWcpeyBscC0+Z3JhcGg9MDticmVhazt9CisgICAgICAgICAgICAgICAgICAgICAgICBscD1scC0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBnLT5icmFuY2hvdXQ9MDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZz1nLT5ub3JtYWxvdXQ7Y29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiAgU3BydWVuZ2UgenVtIGZvbGdlbmRlbiBDb2RlIGVudGZlcm5lbiAgICovCisgICAgICAgICAgICBpZihnLT5ub3JtYWxvdXQmJmctPm5vcm1hbG91dD09Zy0+YnJhbmNob3V0KXsKKyAgICAgICAgICAgICAgICBwPWctPmVuZDsKKyAgICAgICAgICAgICAgICBpZighcHx8cC0+Y29kZTxCRVF8fHAtPmNvZGU+QlJBKSBpZXJyb3IoMCk7CisgICAgICAgICAgICAgICAgaWYoREVCVUcmMTAyNCl7cHJpbnRmKCJicmFuY2ggdG8gZm9sbG93aW5nIGxhYmVsIGRlbGV0ZWQ6XG4iKTtwcmljMihzdGRvdXQscCk7fQorICAgICAgICAgICAgICAgIHJlbW92ZV9JQ19mZyhnLHApO2ctPmJyYW5jaG91dD0wO2NoYW5nZWQ9Z2NoYW5nZWQ9MTsKKyAgICAgICAgICAgICAgICBwPWctPmVuZDsKKyAgICAgICAgICAgICAgICAvKiAgdm9yYW5nZWhlbmRlbiBWZXJnbGVpY2ggYXVjaCBlbnRmZXJuZW4gICovCisgICAgICAgICAgICAgICAgaWYocCYmKHAtPmNvZGU9PUNPTVBBUkV8fHAtPmNvZGU9PVRFU1QpKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoREVCVUcmMTAyNCl7cHJpbnRmKCJwcmVjZWRpbmcgY29tcGFyaXNvbiBhbHNvIGRlbGV0ZWQ6XG4iKTtwcmljMihzdGRvdXQscCk7fQorICAgICAgICAgICAgICAgICAgICByZW1vdmVfSUNfZmcoZyxwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qICBiY2MgbDE7YnJhIGwyO2wxIGFlbmRlcm4gICAgKi8KKyAgICAgICAgICAgIHA9Zy0+ZW5kOworICAgICAgICAgICAgaWYocCYmcC0+Y29kZT49QkVRJiZwLT5jb2RlPEJSQSYmZy0+bm9ybWFsb3V0KXsKKyAgICAgICAgICAgICAgICBpZihnLT5ub3JtYWxvdXQtPnN0YXJ0JiZnLT5ub3JtYWxvdXQtPnN0YXJ0LT5jb2RlPT1CUkEpeworICAgICAgICAgICAgICAgICAgICBpZihnLT5ub3JtYWxvdXQtPm5vcm1hbG91dD09Zy0+YnJhbmNob3V0KXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGctPmJyYW5jaG91dD1nLT5ub3JtYWxvdXQtPmJyYW5jaG91dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGk9cC0+dHlwZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAtPnR5cGY9Zy0+bm9ybWFsb3V0LT5zdGFydC0+dHlwZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiY2hhbmdpbmcgYmNjIGwlZDticmEgbCVkO2wlZCB0byBiIWNjIGwlZFxuIixpLHAtPnR5cGYsaSxwLT50eXBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChwLT5jb2RlKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkVROiBwLT5jb2RlPUJORTticmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQk5FOiBwLT5jb2RlPUJFUTticmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkxUOiBwLT5jb2RlPUJHRTticmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkdFOiBwLT5jb2RlPUJMVDticmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkdUOiBwLT5jb2RlPUJMRTticmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkxFOiBwLT5jb2RlPUJHVDticmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGctPm5vcm1hbG91dC0+YnJhbmNob3V0PWctPm5vcm1hbG91dC0+bm9ybWFsb3V0OworICAgICAgICAgICAgICAgICAgICAgICAgZy0+bm9ybWFsb3V0LT5zdGFydC0+dHlwZj1pOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZD1nY2hhbmdlZD0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogIEhhYmVuIGFsbGUgVm9yZ2FlbmdlciBlaW5lcyBCbG9ja3MgZGllIHNlbGJlIEFud2Vpc3VuZyBhbSAgICovCisgICAgICAgICAgICAvKiAgQmxvY2tlbmRlIHVuZCBrZWluZW4gd2VpdGVyZW4gTmFjaGZvbGdlciwgZGFubiBrYW5uIGRpZSAgICAgKi8KKyAgICAgICAgICAgIC8qICBBbndlaXN1bmcgaW4gZGVuIE5hY2hmb2dlcmJsb2NrIGdlc2Nob2JlbiB3ZXJkZW4gICAgICAgICAgICAqLworICAgICAgICAgICAgaT0wO3A9MDsKKyAgICAgICAgICAgIGZvcihscD1nLT5pbjtscDtscD1scC0+bmV4dCl7CisgICAgICAgICAgICAgICAgaWYobHAtPmdyYXBoKXsKKyAgICAgICAgICAgICAgICAgICAgSUMgKm5wOworICAgICAgICAgICAgICAgICAgICBmbG93Z3JhcGggKm5nPWxwLT5ncmFwaDsKKyAgICAgICAgICAgICAgICAgICAgZmxvd2xpc3QgKmwyOworICAgICAgICAgICAgICAgICAgICAvKiAgZG9wcGVsdGUgQmxvZWNrZSBsb2VzY2hlbiB1bmQgdWViZXJzcHJpbmdlbiAqLworICAgICAgICAgICAgICAgICAgICBmb3IobDI9Zy0+aW47bDI7bDI9bDItPm5leHQpCisgICAgICAgICAgICAgICAgICAgICAgICBpZihsMiE9bHAmJmwyLT5ncmFwaD09bmcpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZihsMil7IGxwLT5ncmFwaD0wO2NvbnRpbnVlO30KKyAgICAgICAgICAgICAgICAgICAgbnA9bmctPmVuZDsKKyAgICAgICAgICAgICAgICAgICAgaWYoIW5wKXsgaT0tMTticmVhazt9CisgICAgICAgICAgICAgICAgICAgIGlmKG5nLT5icmFuY2hvdXQmJihucC0+Y29kZSE9QlJBfHxuZy0+YnJhbmNob3V0IT1nKSl7aT0tMTticmVhazt9CisgICAgICAgICAgICAgICAgICAgIGlmKG5wLT5jb2RlPT1CUkEpIG5wPW5wLT5wcmV2OworICAgICAgICAgICAgICAgICAgICBpZighbnApeyBpPS0xO2JyZWFrO30KKyAgICAgICAgICAgICAgICAgICAgaWYoIXApeworICAgICAgICAgICAgICAgICAgICAgICAgaT0xOworICAgICAgICAgICAgICAgICAgICAgICAgcD1ucDsKKyAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihwLT5jb2RlPT1ucC0+Y29kZSYmcC0+dHlwZj09bnAtPnR5cGYmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+Y29kZSE9Q0FMTCYmcC0+Y29kZSE9R0VUUkVUVVJOJiZwLT5jb2RlIT1QVVNIJiYocC0+Y29kZTxURVNUfHxwLT5jb2RlPkNPTVBBUkUpJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICFjb21wYXJlX29ianMoJnAtPnExLCZucC0+cTEscC0+dHlwZikmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNvbXBhcmVfb2JqcygmcC0+cTIsJm5wLT5xMixwLT50eXBmKSYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAhY29tcGFyZV9vYmpzKCZwLT56LCZucC0+eixwLT50eXBmKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaT0tMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGk+MSYmZy0+c3RhcnQpeworICAgICAgICAgICAgICAgIElDICpuZXc9bmV3X0lDKCk7CisgICAgICAgICAgICAgICAgaWYoREVCVUcmMTAyNCl7IHByaW50ZigibW92aW5nIGluc3RydWN0aW9uIGZyb20gcHJlY2VkaW5nIGJsb2NrcyB0byBzdWNjZXNzb3I6XG4iKTtwcmljMihzdGRvdXQscCk7fQorICAgICAgICAgICAgICAgIGNoYW5nZWQ9Z2NoYW5nZWQ9MTsKKyAgICAgICAgICAgICAgICBtZW1jcHkobmV3LHAsSUNTKTsKKyAgICAgICAgICAgICAgICBuZXctPnVzZV9jbnQ9bmV3LT5jaGFuZ2VfY250PTA7CisgICAgICAgICAgICAgICAgbmV3LT51c2VfbGlzdD1uZXctPmNoYW5nZV9saXN0PTA7CisgICAgICAgICAgICAgICAgaWYoZy0+c3RhcnQtPmNvZGU9PUxBQkVMKXsKKyAgICAgICAgICAgICAgICAgICAgaW5zZXJ0X0lDX2ZnKGcsZy0+c3RhcnQsbmV3KTsKKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgaW5zZXJ0X0lDX2ZnKGcsZy0+c3RhcnQtPnByZXYsbmV3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yKGxwPWctPmluO2xwO2xwPWxwLT5uZXh0KXsKKyAgICAgICAgICAgICAgICAgICAgZmxvd2dyYXBoICpuZz1scC0+Z3JhcGg7CisgICAgICAgICAgICAgICAgICAgIGlmKG5nKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFuZy0+ZW5kKSBpZXJyb3IoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihuZy0+ZW5kLT5jb2RlPT1CUkEpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9JQ19mZyhuZyxuZy0+ZW5kLT5wcmV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9JQ19mZyhuZyxuZy0+ZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qICBIYWJlbiBhbGxlIE5hY2hmb2xnZXIgZWluZXMgQmxvY2tzIGRpZSBzZWxiZSBBbndlaXN1bmcgYW0gICAqLworICAgICAgICAgICAgLyogIEJsb2NrYmVnaW5uIHVuZCBrZWluZW4gd2VpdGVyZW4gVm9yZ2FlbmdlciwgZGFubiBrYW5uIGRpZSAgICovCisgICAgICAgICAgICAvKiAgQW53ZWlzdW5nIGluIGRlbiBWb3JnYWVuZ2VyYmxvY2sgZ2VzY2hvYmVuIHdlcmRlbiAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmKGctPmJyYW5jaG91dCYmZy0+bm9ybWFsb3V0JiZnLT5icmFuY2hvdXQhPWctPm5vcm1hbG91dCYmZy0+ZW5kJiZnLT5lbmQtPmNvZGUhPUJSQSl7CisgICAgICAgICAgICAgICAgZmxvd2dyYXBoICphPWctPm5vcm1hbG91dCwqYj1nLT5icmFuY2hvdXQ7CisgICAgICAgICAgICAgICAgSUMgKmFzPWEtPnN0YXJ0LCpicz1iLT5zdGFydCwqdHA7CisgICAgICAgICAgICAgICAgaW50IGRlc3Ryb3lzOworICAgICAgICAgICAgICAgIGlmKGFzJiZhcy0+Y29kZT09TEFCRUwmJmFzIT1hLT5lbmQpIGFzPWFzLT5uZXh0OworICAgICAgICAgICAgICAgIGlmKGJzJiZicy0+Y29kZT09TEFCRUwmJmJzIT1iLT5lbmQpIGJzPWJzLT5uZXh0OworCisgICAgICAgICAgICAgICAgaWYoYXMmJmJzJiZhcy0+Y29kZT09YnMtPmNvZGUmJmFzLT5jb2RlIT1QVVNIJiYoYXMtPmNvZGU8VEVTVHx8YXMtPmNvZGU+Q09NUEFSRSkmJmFzLT50eXBmPT1icy0+dHlwZiYmCisgICAgICAgICAgICAgICAgICAgIWNvbXBhcmVfb2JqcygmYXMtPnExLCZicy0+cTEsYXMtPnR5cGYpJiYKKyAgICAgICAgICAgICAgICAgICAhY29tcGFyZV9vYmpzKCZhcy0+cTIsJmJzLT5xMixhcy0+dHlwZikmJgorICAgICAgICAgICAgICAgICAgICFjb21wYXJlX29ianMoJmFzLT56LCZicy0+eixhcy0+dHlwZikpeworICAgICAgICAgICAgICAgICAgICBpPTA7CisgICAgICAgICAgICAgICAgICAgIGZvcihscD1hLT5pbjtscDtscD1scC0+bmV4dCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxwLT5ncmFwaCYmbHAtPmdyYXBoIT1nJiYobHAtPmdyYXBoLT5icmFuY2hvdXQ9PWF8fCFscC0+Z3JhcGgtPmVuZHx8bHAtPmdyYXBoLT5lbmQtPmNvZGUhPUJSQSkpIGk9MTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGxwPWItPmluO2xwO2xwPWxwLT5uZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgaWYobHAtPmdyYXBoJiZscC0+Z3JhcGghPWcmJihscC0+Z3JhcGgtPmJyYW5jaG91dD09Ynx8IWxwLT5ncmFwaC0+ZW5kfHxscC0+Z3JhcGgtPmVuZC0+Y29kZSE9QlJBKSkgaT0xOworCQkgICAgaWYoYXMtPmNvZGU9PUNBTEwmJmFzLT5uZXh0JiYoYXMtPm5leHQtPmNvZGU9PUdFVFJFVFVSTnx8YXMtPmNvZGU9PU5PUCkpIGk9MTsKKwkJICAgIGlmKGJzLT5jb2RlPT1DQUxMJiZicy0+bmV4dCYmKGJzLT5uZXh0LT5jb2RlPT1HRVRSRVRVUk58fGJzLT5jb2RlPT1OT1ApKSBpPTE7CisgICAgICAgICAgICAgICAgICAgIGlmKCFpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEodHA9Zy0+ZW5kLT5wcmV2KSkgaWVycm9yKDApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYodHAtPmNvZGUhPVRFU1QmJnRwLT5jb2RlIT1DT01QQVJFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllcnJvcigwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qICBzY2hhdWVuLCBvYiBkaWUgQW53ZWlzdW5nIGVpbmUgZXZ0bC4gVEVTVCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiAgb2RlciBDT01QQVJFLUFud2Vpc3VuZyBiZWVpbmZsdXNzdCAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJveXM9MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFzLT56LmZsYWdzJkRSRUZPQkopIGRlc3Ryb3lzfD0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXMtPmNvZGU9PUNBTEwpIGRlc3Ryb3lzfD0yOworICAgICAgICAgICAgICAgICAgICAgICAgaWYodHAtPnExLmZsYWdzJlZBUil7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGVzdHJveXMmMyl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCh0cC0+cTEudi0+ZmxhZ3MmVVNFREFTQURSKXx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cC0+cTEuZmxhZ3MmRFJFRk9CSil8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHAtPnExLnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHAtPnExLnYtPm5lc3Rpbmc9PTApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaT0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZGVzdHJveXMmMikmJnRwLT5xMS52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpPTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChhcy0+ei5mbGFncyZWQVIpJiZhcy0+ei52PT10cC0+cTEudikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRwLT5xMi5mbGFncyZWQVIpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRlc3Ryb3lzJjMpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigodHAtPnEyLnYtPmZsYWdzJlVTRURBU0FEUil8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHAtPnEyLmZsYWdzJkRSRUZPQkopfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRwLT5xMi52LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRwLT5xMi52LT5uZXN0aW5nPT0wKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGRlc3Ryb3lzJjIpJiZ0cC0+cTIudi0+c3RvcmFnZV9jbGFzcz09U1RBVElDKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaT0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoYXMtPnouZmxhZ3MmVkFSKSYmYXMtPnoudj09dHAtPnEyLnYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpJiYhKGRpc2FibGUmMikpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKERFQlVHJjEwMjQpeyBwcmludGYoIm1vdmluZyBpbnN0cnVjdGlvbiBmcm9tIGZvbGxvd2luZyBibG9ja3MgdG8gcHJlZGVjZXNzb3I6XG4iKTtwcmljMihzdGRvdXQsYXMpO30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwPW5ld19JQygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwLGFzLElDUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX0lDX2ZnKGEsYXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9JQ19mZyhiLGJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT51c2VfY250PXAtPmNoYW5nZV9jbnQ9MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT51c2VfbGlzdD1wLT5jaGFuZ2VfbGlzdD0wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydF9JQ19mZyhnLGctPmVuZC0+cHJldi0+cHJldixwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkPWdjaGFuZ2VkPTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnPWctPm5vcm1hbG91dDsKKyAgICAgICAgfQorICAgICAgICBnPWZnOworICAgICAgICB3aGlsZShnKXsKKyAgICAgICAgICAgIC8qICBTcHJ1ZW5nZSB6dSBTcHJ1ZW5nZW4gdW1zZXR6ZW47IGVpbmlnZSBaZWlnZXIgaW0gRmx1c3NncmFwaCAqLworICAgICAgICAgICAgLyogIHdlcmRlbiBuaWNodCBrb3JyZWt0IGFrdHVhbGlzaWVydCwgYWJlciBkYXMgc29sbHRlIGVnYWwgc2VpbiovCisgICAgICAgICAgICBwPWctPnN0YXJ0OworICAgICAgICAgICAgZm9yKGk9MDtpPDI7aSsrKXsKKyAgICAgICAgICAgICAgICBpZihpKXtpZihwJiZwLT5jb2RlPT1MQUJFTCkgcD1wLT5uZXh0OyBlbHNlIGJyZWFrO30KKyAgICAgICAgICAgICAgICBpZihwJiZwLT5jb2RlPj1CRVEmJnAtPmNvZGU8PUJSQSl7CisgICAgICAgICAgICAgICAgICAgIGxwPWctPmluOworICAgICAgICAgICAgICAgICAgICB3aGlsZShscCl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihscC0+Z3JhcGgmJmxwLT5ncmFwaC0+YnJhbmNob3V0PT1nJiYoLypscC0+Z3JhcGgtPmVuZC0+Y29kZT09cC0+Y29kZXx8Ki9wLT5jb2RlPT1CUkEpJiZscC0+Z3JhcGgtPmVuZC0+dHlwZiE9cC0+dHlwZil7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoREVCVUcmMTAyNCl7cHJpbnRmKCJicmFuY2ggYnlwYXNzZWQgdG8gTCVkOlxuIixwLT50eXBmKTtwcmljMihzdGRvdXQsbHAtPmdyYXBoLT5lbmQpO30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihscC0+Z3JhcGgtPmVuZC0+Y29kZTxCRVF8fGxwLT5ncmFwaC0+ZW5kLT5jb2RlPkJSQSkgaWVycm9yKDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5ncmFwaC0+YnJhbmNob3V0PWctPmJyYW5jaG91dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+Z3JhcGgtPmVuZC0+dHlwZj1wLT50eXBmO2NoYW5nZWQ9Z2NoYW5nZWQ9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxwPWxwLT5uZXh0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKwkgICAgZz1nLT5ub3JtYWxvdXQ7CisJfQorICAgICAgICBpZihjaGFuZ2VkKSBmcmVlX2Zsb3dncmFwaChmZyk7CisgICAgfXdoaWxlKGNoYW5nZWQpOworICAgIHJldHVybiBmZzsKK30KKwordm9pZCBpbnNlcnRfSUNfZmcoZmxvd2dyYXBoICpmZyxJQyAqcCxJQyAqbmV3KQorLyogIGZ1ZWd0IGVpbiBJQyBoaW50ZXIgcCBlaW4gdW50ZXIgQmVpYmVoYWx0dW5nIGRlcyBGbHVzc2dyYXBoZW4gICAqLworeworICAgIGlmKGZnLT5zdGFydCl7CisgICAgICAgIGlmKCFwfHxwPT1mZy0+c3RhcnQtPnByZXYpIGZnLT5zdGFydD1uZXc7CisgICAgICAgIGlmKHA9PWZnLT5lbmQpIGZnLT5lbmQ9bmV3OworICAgIH1lbHNleworICAgICAgICBmZy0+c3RhcnQ9ZmctPmVuZD1uZXc7CisgICAgfQorICAgIGluc2VydF9JQyhwLG5ldyk7Cit9CmRpZmYgLS1naXQgYS9mcm9udGVuZC92Yy5jIGIvZnJvbnRlbmQvdmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTRlNjQzCi0tLSAvZGV2L251bGwKKysrIGIvZnJvbnRlbmQvdmMuYwpAQCAtMCwwICsxLDc3MCBAQAorLyogIEZyb250ZW5kIGZvciB2YmNjICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIChjKSBpbiAxOTk1LTIwMTYgYnkgVm9sa2VyIEJhcnRoZWxtYW5uICAqLworLyogICNkZWZpbmUgQU1JR0EgZm9yIEFtaWdhIHZlcnNpb24gICAgICAgICAqLworLyogICNkZWZpbmUgQVRBUkkgZm9yIEF0YXJpIHZlcnNpb24gICAgICAgICAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIEFNSUdBCisjcHJhZ21hIGFtaWdhLWFsaWduCisjaWZkZWYgX19hbWlnYW9zNF9fCisjaW5jbHVkZSA8ZG9zL2FuY2hvcnBhdGguaD4KKyNlbHNlCisjaW5jbHVkZSA8ZG9zL2Rvc2FzbC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZG9zL2Rvc2V4dGVucy5oPgorI2luY2x1ZGUgPGRvcy9kb3N0YWdzLmg+CisjaW5jbHVkZSA8ZXhlYy9saWJyYXJpZXMuaD4KKyNpbmNsdWRlIDxwcm90by9kb3MuaD4KKyNwcmFnbWEgZGVmYXVsdC1hbGlnbgorCisjaWZuZGVmIEVYSVRfRkFJTFVSRQorI2RlZmluZSBFWElUX0ZBSUxVUkUgMjAKKyNlbmRpZgorI2lmbmRlZiBFWElUX1NVQ0NFU1MKKyNkZWZpbmUgRVhJVF9TVUNDRVNTIDAKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX19hbWlnYW9zNF9fKSAmJiAhZGVmaW5lZChfX01PUlBIT1NfXykKK2V4dGVybiBzdHJ1Y3QgRG9zTGlicmFyeSAqRE9TQmFzZTsKKyNlbmRpZgorCisvKiAgTXVzdCBiZSAzMmJpdC1hbGlnbmVkIC0gSSBrbm93IGl0IHdpbGwgYmUgaWYgY29tcGlsZWQgd2l0aCB2YmNjLiAgICAqLworc3RydWN0IEZpbGVJbmZvQmxvY2sgZmliOworI2VuZGlmCisKK3N0cnVjdCBOYW1lTGlzdHsKKyAgICBzdHJ1Y3QgTmFtZUxpc3QgKm5leHQ7CisgICAgY2hhciAqb2JqOworfSAqZmlyc3Rfb2JqPTAsKmxhc3Rfb2JqPTAsKmZpcnN0X3NjcmF0Y2g9MCwqbGFzdF9zY3JhdGNoPTA7CisKKy8qICBMaW1pdCBmdWVyIExhZW5nZSBkZXIgTmFtZW4gKHdlZ2VuIFdpbGRjYXJkcykgICAqLworI2RlZmluZSBOQU1FQlVGIDEwMDAgICAgLyogIE1VU1QgQkUgPj0gflRNUE5BTV9MKzcgICovCisjZGVmaW5lIFVTRVJMSUJTIDEwMDAKKworLyogIEFiIGRpZXNlciBMYWVuZ2Ugd2VyZGVuIE9iamVrdGZpbGVzIG5pY2h0IGRpcmVrdCB1ZWJlcmdlYmVuLCAgICAqLworLyogIHNvbmRlcm4gYXVzIGVpbmVtIEZpbGUgYW4gZGVuIExpbmtlciB1ZWJlcmdlYmVuICAgICAgICAgICAgICAgICAqLworI2lmZGVmIEFNSUdBCitpbnQgTUFYQ0xFTj01MDA7CisjZWxzZQoraW50IE1BWENMRU49MzIwMDA7CisjZW5kaWYKKworI2RlZmluZSBXUE8gMTYzODQKKyNkZWZpbmUgQ1JPU1NNT0RVTEUgODE5MgorI2RlZmluZSBTQ0hFRFVMRVIgNDA5NgorI2RlZmluZSBOT1RNUEZJTEUgMjA0OAorI2RlZmluZSBPVVRQVVRTRVQgMTAyNAorI2RlZmluZSBOT1NURExJQiA1MTIKKyNkZWZpbmUgVkVSQk9TRSAyNTYKKyNkZWZpbmUgVkVSWVZFUkJPU0UgMTI4CisjZGVmaW5lIEtFRVBTQ1JBVENIIDY0CisKKyNkZWZpbmUgUFBTUkMgMQorI2RlZmluZSBDQ1NSQyAyCisjZGVmaW5lIFNDU1JDIDMKKyNkZWZpbmUgQVNTUkMgNAorI2RlZmluZSBPQkogNQorCitjaGFyICp2YmNjZW52OworY2hhciBlbXB0eVtdPSIiOworLyogIE5hbWVuIGRlciBlaW56ZWxuZW4gUGhhc2VuICAqLworY2hhciAqcHBuYW1lPWVtcHR5LCpjY25hbWU9ZW1wdHksKmFzbmFtZT1lbXB0eSwqbGRuYW1lPWVtcHR5LCpsMm5hbWU9ZW1wdHk7CitjaGFyICpybW5hbWU9ZW1wdHksKnNjbmFtZT1lbXB0eTsKKy8qICBkYXNzZWxiZSBmdWVyIFZFUkJPU0UgICAqLworY2hhciAqcHB2PWVtcHR5LCpjY3Y9ZW1wdHksKmFzdj1lbXB0eSwqbGR2PWVtcHR5LCpsMnY9ZW1wdHk7CitjaGFyICpybXY9ZW1wdHksKnNjdj1lbXB0eTsKKworLyogIExpbmtlci1Db21tYW5kZmlsZSAgKi8KK2NoYXIgKmNmPSJAJXMiOworY2hhciAqbm9kYj0iIjsKK2NoYXIgKnN0YXRpY2ZsYWc9IiI7CitjaGFyICp1bD0iLWwlcyI7CisKKyNpZiBkZWZpbmVkKEFNSUdBKQorY29uc3QgY2hhciAqY29uZmlnX25hbWU9InZjLmNvbmZpZyI7Citjb25zdCBjaGFyICpzZWFyY2hfZGlyc1tdPXsiIiwiRU5WOiIsIlZCQ0M6Y29uZmlnLyIsIlZCQ0M6In07CisjZWxpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChNU0RPUykKK2NvbnN0IGNoYXIgKmNvbmZpZ19uYW1lPSJ2Yy5jZmciOworY29uc3QgY2hhciAqc2VhcmNoX2RpcnNbXT17IiIsIiVWQ0NGRyVcXCJ9OworI2VsaWYgZGVmaW5lZChBVEFSSSkKK2NvbnN0IGNoYXIgKmNvbmZpZ19uYW1lPSJ2Yy5jZmciOworY29uc3QgY2hhciAqc2VhcmNoX2RpcnNbXT17IiIsIkM6XFwifTsKKyNlbHNlCitjb25zdCBjaGFyICpjb25maWdfbmFtZT0idmMuY29uZmlnIjsKK2NvbnN0IGNoYXIgKnNlYXJjaF9kaXJzW109eyIiLCJ+LyIsIi9ldGMvIn07CisjZW5kaWYKKworLyogIFN0cmluZyBmdWVyIGRpZSBEZWZhdWx0IGxpYnJhcmllcyAgICovCitjaGFyIHVzZXJsaWJzW1VTRVJMSUJTXTsKK2NoYXIgKm5vbWVtPSJOb3QgZW5vdWdoIG1lbW9yeSFcbiI7CisKK2NoYXIgKmRlc3RuYW1lPSJhLm91dCI7CitjaGFyIG5hbWVidWZbTkFNRUJVRisxXSxuYW1lYnVmMltOQU1FQlVGKzFdOworY2hhciAqb2xkZmlsZTsKKworY2hhciAqY21maWxlcywqY21vdXRwdXQsKmNtbmFtZTsKKyNpZiBkZWZpbmVkKEFNSUdBKXx8ZGVmaW5lZChfV0lOMzIpfHxkZWZpbmVkKE1TRE9TKQorI3VuZGVmIFVTRUNNREZJTEUKKyNkZWZpbmUgVVNFQ01ERklMRSAxCisjZW5kaWYKKyNpZmRlZiBVU0VDTURGSUxFCitGSUxFICpjbWRmaWxlOworI2VuZGlmCitpbnQgZmluYWw7CitpbnQgY29tcHJlc3NvcjsKKworY2hhciAqY29uZmlnOworY2hhciAqKmNvbmZwOworCitjaGFyICpjb21tYW5kLCpvcHRpb25zLCpsaW5rY21kLCpvYmplY3RzLCpsaWJzLCpwcG9wdHM7CisjaWZkZWYgQU1JR0EKK3N0cnVjdCBBbmNob3JQYXRoICphcDsKKyNlbmRpZgorCitpbnQgbGlua2xlbj0xMCxmbGFncz0wOworCisjaWYgZGVmaW5lZChNU0RPUyl8fGRlZmluZWQoQVRBUkkpCitjaGFyICp0bXBuYW0oY2hhciAqcCkKK3sKKyAgc3RhdGljIGludCBjPTE2NzU7CisgIHN0YXRpYyBjaGFyIHRtcFtOQU1FQlVGXTsKKyAgY2hhciAqZW52OworCisgIGVudj1nZXRlbnYoIlRFTVAiKTsKKyAgaWYoIWVudikgZW52PSIuIjsKKyAgaWYoIXApIHA9dG1wOworICBzbnByaW50ZihwLE5BTUVCVUYsIiVzXFx2YmNjJTA0eCIsZW52LCsrYyk7CisgIHJldHVybiBwOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGZyZWVfbmFtZWxpc3Qoc3RydWN0IE5hbWVMaXN0ICpwKQoreworICAgIHN0cnVjdCBOYW1lTGlzdCAqbTsKKyAgICB3aGlsZShwKXsKKyAgICAgICAgbT1wLT5uZXh0OworICAgICAgICBpZihmbGFncyZWRVJZVkVSQk9TRSl7CisgICAgICAgICAgICBwdXRzKCJmcmVlIHAtPm9iaiIpOworICAgICAgICAgICAgaWYoIXAtPm9iaikgcHV0cygiSVMgWkVSTyEhIik7IGVsc2UgcHV0cyhwLT5vYmopOworICAgICAgICB9CisgICAgICAgIGZyZWUoKHZvaWQgKilwLT5vYmopOworICAgICAgICBpZihmbGFncyZWRVJZVkVSQk9TRSl7cHV0cygiZnJlZSBwIik7IGlmKCFwKSBwdXRzKCJJUyBaRVJPISEiKTt9CisgICAgICAgIGZyZWUoKHZvaWQgKilwKTsKKyAgICAgICAgcD1tOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcmF1cyhpbnQgcmMpCit7CisgICAgaWYoY29uZnApICAgZnJlZShjb25mcCk7CisgICAgaWYoY29uZmlnKSAgZnJlZShjb25maWcpOworICAgIGlmKG9iamVjdHMpIGZyZWUob2JqZWN0cyk7CisgICAgaWYobGlicykgICAgZnJlZShsaWJzKTsKKyAgICBpZihjb21tYW5kKSBmcmVlKGNvbW1hbmQpOworICAgIGlmKHBwb3B0cykgIGZyZWUocHBvcHRzKTsKKyAgICBpZihvcHRpb25zKSBmcmVlKG9wdGlvbnMpOworICAgIGlmKGxpbmtjbWQpIGZyZWUobGlua2NtZCk7CisjaWZkZWYgQU1JR0EKKyAgICBpZihhcCkKKyNpZmRlZiBfX2FtaWdhb3M0X18KKyAgICAgICAgRnJlZURvc09iamVjdChET1NfQU5DSE9SUEFUSCxhcCk7CisjZWxzZQorICAgICAgICBmcmVlKGFwKTsKKyNlbmRpZgorI2VuZGlmCisgICAgZnJlZV9uYW1lbGlzdChmaXJzdF9vYmopOworICAgIGZyZWVfbmFtZWxpc3QoZmlyc3Rfc2NyYXRjaCk7CisgICAgZXhpdChyYyk7Cit9CisKKyNpZmRlZiBOT19MT05HRVJfTkVFREVECisvKiBMYXVuY2ggY29tbWFuZCBmcm9tICIkVkJDQ1xiaW5cIiwgd2hlbiBubyBhYnNvbHV0ZSBwYXRoIHdhcyBzcGVjaWZpZWQuICovCitzdGF0aWMgaW50IHJ1bmNtZChjaGFyICpjbWQpCit7CisgICAgY2hhciAqcDsKKworICAgIGZvcihwPWNtZDsqcCE9MCYmKnA+JyAnO3ArKyl7CisgICAgICAgIGlmKCpwPT0nOicpICAvKiBhYnNvbHV0ZSBwYXRoICovCisgICAgICAgICAgICBnb3RvIGRvX2NtZDsKKyAgICB9CisgICAgaWYodmJjY2Vudil7CisgICAgICAgIC8qIHByZXBlbmQgIiRWQkNDXGJpblwiIGluIGZyb250IG9mIG91ciBjb21tYW5kICovCisgICAgICAgIGludCBsZW49c3RybGVuKHZiY2NlbnYpOworICAgICAgICBpZih2YmNjZW52W2xlbi0xXT09J1xcJykgbGVuLS07CisgICAgICAgIG1lbW1vdmUoY21kK2xlbis1LGNtZCxzdHJsZW4oY21kKSsxKTsKKyAgICAgICAgbWVtY3B5KGNtZCx2YmNjZW52LGxlbik7CisgICAgICAgIG1lbWNweShjbWQrbGVuLCJcXGJpblxcIiw1KTsKKyAgICB9Citkb19jbWQ6CisgICAgcmV0dXJuIHN5c3RlbShjbWQpOworfQorI2Vsc2UKKyNkZWZpbmUgcnVuY21kKGMpIHN5c3RlbShjKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGRlbF9zY3JhdGNoKHN0cnVjdCBOYW1lTGlzdCAqcCkKK3sKKyAgICB3aGlsZShwKXsKKyAgICAgICAgc3ByaW50Zihjb21tYW5kLHJtbmFtZSxwLT5vYmopOworICAgICAgICBpZihmbGFncyZWRVJCT1NFKSBwcmludGYoIiVzXG4iLGNvbW1hbmQpOworICAgICAgICBpZihydW5jbWQoY29tbWFuZCkpe3ByaW50ZigiJXMgZmFpbGVkXG4iLGNvbW1hbmQpO3JhdXMoRVhJVF9GQUlMVVJFKTt9CisgICAgICAgIHA9cC0+bmV4dDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9uYW1lKGNoYXIgKm9iaixzdHJ1Y3QgTmFtZUxpc3QgKipmaXJzdCxzdHJ1Y3QgTmFtZUxpc3QgKipsYXN0KQoreworICAgIHN0cnVjdCBOYW1lTGlzdCAqbmV3OworICAgIGlmKGZsYWdzJlZFUllWRVJCT1NFKSBwcmludGYoImFkZF9uYW1lOiAlc1xuIixvYmopOworICAgIGlmKCEobmV3PW1hbGxvYyhzaXplb2Yoc3RydWN0IE5hbWVMaXN0KSkpKQorICAgICAgICB7cHJpbnRmKG5vbWVtKTtyYXVzKEVYSVRfRkFJTFVSRSk7fQorICAgIGlmKCEobmV3LT5vYmo9bWFsbG9jKHN0cmxlbihvYmopKzEpKSkKKyAgICAgICAge2ZyZWUoKHZvaWQgKiluZXcpO3ByaW50Zihub21lbSk7cmF1cyhFWElUX0ZBSUxVUkUpO30KKyAgICBpZihmaXJzdD09JmZpcnN0X29iaikgbGlua2xlbis9c3RybGVuKG9iaikrMTsKKyAgICBzdHJjcHkobmV3LT5vYmosb2JqKTsKKyAgICBuZXctPm5leHQ9MDsKKyAgICBpZighKmZpcnN0KXsKKyAgICAgICAgKmZpcnN0PSpsYXN0PW5ldzsKKyAgICB9ZWxzZXsKKyAgICAgICAgKCpsYXN0KS0+bmV4dD1uZXc7Kmxhc3Q9bmV3OworICAgIH0KK30KKworc3RhdGljIGludCByZWFkX2NvbmZpZyhjb25zdCBjaGFyICpjZmdfbmFtZSkKK3sKKyAgICBpbnQgaSxjb3VudDsgbG9uZyBzaXplOworICAgIGNoYXIgKnAsKm5hbWU7CisgICAgRklMRSAqZmlsZT0wOworICAgIGZvcihpPTA7aTxzaXplb2Yoc2VhcmNoX2RpcnMpL3NpemVvZihzZWFyY2hfZGlyc1swXSk7aSsrKXsKKyAgICAgIG5hbWU9bWFsbG9jKHN0cmxlbihzZWFyY2hfZGlyc1tpXSkrc3RybGVuKGNmZ19uYW1lKSsxKTsKKyAgICAgIGlmKCFuYW1lKSB7cHJpbnRmKG5vbWVtKTtyYXVzKEVYSVRfRkFJTFVSRSk7fQorICAgICAgc3RyY3B5KG5hbWUsc2VhcmNoX2RpcnNbaV0pOworICAgICAgc3RyY2F0KG5hbWUsY2ZnX25hbWUpOworICAgICAgZmlsZT1mb3BlbihuYW1lLCJyIik7CisgICAgICBmcmVlKG5hbWUpOworICAgICAgaWYoZmlsZSkgYnJlYWs7CisgICAgfQorICAgIGlmKCFmaWxlKXsKKyAgICAgIGlmKHA9dmJjY2Vudil7CisgICAgICAgIG5hbWU9bWFsbG9jKHN0cmxlbihwKStzdHJsZW4oY2ZnX25hbWUpKzIwKTsKKyAgICAgICAgaWYoIW5hbWUpe3ByaW50Zihub21lbSk7cmF1cyhFWElUX0ZBSUxVUkUpO30KKyAgICAgICAgc3RyY3B5KG5hbWUscCk7CisjaWYgZGVmaW5lZChfV0lOMzIpfHxkZWZpbmVkKE1TRE9TKXx8ZGVmaW5lZChBVEFSSSkKKyAgICAgICAgc3RyY2F0KG5hbWUsIlxcY29uZmlnXFwiKTsKKyAgICAgICAgc3RyY2F0KG5hbWUsY2ZnX25hbWUpOworI2VsaWYgZGVmaW5lZChBTUlHQSkKKyAgICAgICAgQWRkUGFydChuYW1lLCJjb25maWciLHN0cmxlbihwKStzdHJsZW4oY2ZnX25hbWUpKzIwKTsKKyAgICAgICAgQWRkUGFydChuYW1lLChTVFJQVFIpY2ZnX25hbWUsc3RybGVuKHApK3N0cmxlbihjZmdfbmFtZSkrMjApOworI2Vsc2UKKyAgICAgICAgc3RyY2F0KG5hbWUsIi9jb25maWcvIik7CisgICAgICAgIHN0cmNhdChuYW1lLGNmZ19uYW1lKTsKKyNlbmRpZgorICAgICAgICBmaWxlPWZvcGVuKG5hbWUsInIiKTsKKyAgICAgICAgZnJlZShuYW1lKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoIWZpbGUpIHtwdXRzKCJObyBjb25maWcgZmlsZSEiKTtyYXVzKEVYSVRfRkFJTFVSRSk7fQorICAgIGlmKGZzZWVrKGZpbGUsMCxTRUVLX0VORCkpIHJldHVybiAwOworICAgIHNpemU9ZnRlbGwoZmlsZSk7CisgICAgaWYoZnNlZWsoZmlsZSwwLFNFRUtfU0VUKSkgcmV0dXJuIDA7CisgICAgY29uZmlnPW1hbGxvYyhzaXplKzEpOworICAgIGlmKCFjb25maWcpe3ByaW50Zihub21lbSk7cmF1cyhFWElUX0ZBSUxVUkUpO30KKyAgICBzaXplPWZyZWFkKGNvbmZpZywxLHNpemUsZmlsZSk7CisgICAgZmNsb3NlKGZpbGUpOworICAgIGNvdW50PTA7cD1jb25maWc7CisgICAgd2hpbGUocDxjb25maWcrc2l6ZSYmKnApeworICAgICAgICBjb3VudCsrOworICAgICAgICB3aGlsZShwPGNvbmZpZytzaXplJiYqcCE9J1xuJykgcCsrOworICAgICAgICBpZigqcD09J1xuJykgKnArKz0wOworICAgIH0KKyAgICBjb25maWdbc2l6ZV09MDsKKyAgICBjb25mcD1tYWxsb2MoY291bnQqc2l6ZW9mKGNoYXIgKikpOworICAgIGZvcihwPWNvbmZpZyxpPTA7aTxjb3VudDtpKyspeworICAgICAgICBjb25mcFtpXT1wOworICAgICAgICB3aGlsZSgqcCkgcCsrOworICAgICAgICBwKys7CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCB0eXAoY2hhciAqZnApCit7CisgICAgY2hhciAqcD1zdHJyY2hyKGZwLCcuJyk7CisgICAgaWYocCYmKCFzdHJjbXAocCwiLmMiKXx8IXN0cmNtcChwLCIuQyIpKSkgcmV0dXJuIHBwbmFtZT09ZW1wdHk/Q0NTUkM6UFBTUkM7CisgICAgaWYocCYmIXN0cmNtcChwLCIuaSIpKSByZXR1cm4gQ0NTUkM7CisgICAgaWYocCYmKCFzdHJjbXAocCwiLnMiKXx8IXN0cmNtcChwLCIuUyIpfHwhc3RyY21wKHAsIi5hc20iKSkpIHJldHVybiBBU1NSQzsKKyAgICBpZihwJiYhc3RyY21wKHAsIi5zY3MiKSkgcmV0dXJuIFNDU1JDOworICAgIGlmKCFwfHwhc3RyY21wKHAsIi5vIil8fCFzdHJjbXAocCwiLm9iaiIpKXsKKyAgICAgIEZJTEUgKmY7CisgICAgICBpZihmPWZvcGVuKGZwLCJyIikpeworICAgICAgICBpZihmZ2V0YyhmKT09MCYmZmdldGMoZik9PSdWJyYmZmdldGMoZik9PSdCJyYmZmdldGMoZik9PSdDJyYmZmdldGMoZik9PSdDJyl7CisgICAgICAgICAgZmNsb3NlKGYpOyAgICAgCisgICAgICAgICAgcmV0dXJuIENDU1JDOworICAgICAgICB9CisgICAgICAgIGZjbG9zZShmKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBPQko7CisgICAgfQorICAgIHJldHVybiBPQko7Cit9CisKK3N0YXRpYyBjaGFyICphZGRfc3VmZml4KGNoYXIgKnMsY2hhciAqc3VmZml4KQoreworICAgIHN0YXRpYyBjaGFyIHN0cltOQU1FQlVGKzNdLCpwOworICAgIGlmKHN0cmxlbihzKStzdHJsZW4oc3VmZml4KT5OQU1FQlVGKXtwcmludGYoInN0cmluZyB0b28gbG9uZ1xuIik7cmF1cyhFWElUX0ZBSUxVUkUpO30KKyAgICBpZihzIT1zdHIpIHN0cmNweShzdHIscyk7CisgICAgcD1zdHJyY2hyKHN0ciwnLicpOworICAgIGlmKCFwKSBwPXN0citzdHJsZW4ocyk7CisgICAgaWYoIXB8fHA9PXN0cnx8KHA9PXN0cisxJiZzdHJbMF09PSdcIicpKSBwPXN0citzdHJsZW4ocyk7CisgICAgc3RyY3B5KHAsc3VmZml4KTsKKyAgICBzdHJjYXQocCwiXCIiKTsKKyAgICByZXR1cm4gc3RyOworfQorCisjaWYgZGVmaW5lZChfV0lOMzIpfHxkZWZpbmVkKE1TRE9TKXx8ZGVmaW5lZChBVEFSSSl8fGRlZmluZWQoQU1JR0EpCitzdGF0aWMgY2hhciAqY29udmVydF9wYXRoKGNoYXIgKnBhdGgpCit7CisgICAgY2hhciBjLCpwLCpuZXdwYXRoOworICAgIG5ld3BhdGg9cD1tYWxsb2Moc3RybGVuKHBhdGgpKzEpOworICAgIHdoaWxlKGM9KnBhdGgrKyl7CisjaWZkZWYgQU1JR0EKKyAgICAgICAgaWYoYz09Jy4nKXsKKyAgICAgICAgICAgIGlmKCpwYXRoPT0nLycpIGNvbnRpbnVlOworICAgICAgICAgICAgaWYoKnBhdGg9PScuJyYmKihwYXRoKzEpPT0nLycpeworICAgICAgICAgICAgICAgIHBhdGgrKzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgaWYoYz09Jy8nKSBjPSdcXCc7CisjZW5kaWYKKyAgICAgICAgKnArKz1jOworICAgIH0KKyAgICAqcD0wOworICAgIHJldHVybiBuZXdwYXRoOworfQorI2Vsc2UKKyNkZWZpbmUgY29udmVydF9wYXRoKHApIChwKQorI2VuZGlmCisKK2ludCBtYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IHRmbCxpLGxlbj0xMCxwbSxjb3VudCxkYj0wLHN0YXRpY21vZGU9MCxkZXBzPTA7CisgICAgY2hhciAqcGFybTsKKyAgICBsb25nIG9wdD0xOworICAgIGludCByYz1FWElUX1NVQ0NFU1M7CisKKyAgICBmb3IoaT0xO2k8YXJnYztpKyspeworICAgICAgICBpZihhcmd2W2ldWzBdPT0nKycpeworICAgICAgICAgICAgY29uZmlnX25hbWU9YXJndltpXSsxOworICAgICAgICAgICAgYXJndltpXVswXT0wOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgdmJjY2Vudj1nZXRlbnYoIlZCQ0MiKTsKKyAgICBjb3VudD1yZWFkX2NvbmZpZyhjb25maWdfbmFtZSk7CisjaWZkZWYgQU1JR0EKKyNpZiAhZGVmaW5lZChfX2FtaWdhb3M0X18pICYmICFkZWZpbmVkKF9fTU9SUEhPU19fKQorICAgIGlmKHBtPURPU0Jhc2UtPmRsX2xpYi5saWJfVmVyc2lvbj49MzYpCisjZWxzZQorICAgIGlmKHBtPTEpCisjZW5kaWYKKyAgICB7CisjaWZkZWYgX19hbWlnYW9zNF9fCisgICAgICAgIGlmKCEoYXA9KHN0cnVjdCBBbmNob3JQYXRoICopQWxsb2NEb3NPYmplY3RUYWdzKERPU19BTkNIT1JQQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRE9fU3RybGVuLE5BTUVCVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBR19ET05FKSkpCisgICAgICAgICAgcG09MDsKKyNlbHNlCisgICAgICAgIGlmKGFwPShzdHJ1Y3QgQW5jaG9yUGF0aCAqKWNhbGxvYyhzaXplb2Yoc3RydWN0IEFuY2hvclBhdGgpK05BTUVCVUYsMSkpCisgICAgICAgICAgICB7YXAtPmFwX1N0cmxlbj1OQU1FQlVGO2FwLT5hcF9CcmVha0JpdHM9MDt9IGVsc2UgcG09MDsKKyNlbmRpZgorICAgIH0KKyNlbmRpZgorICAgIGZvcihpPTE7aTxhcmdjK2NvdW50O2krKyl7CisgICAgICAgIGlmKGk8YXJnYykgcGFybT1hcmd2W2ldOyBlbHNlIHBhcm09Y29uZnBbaS1hcmdjXTsKKyAgICAgICAgaWYoIXN0cm5jbXAocGFybSwiLXVsPSIsNCkpe3VsPXBhcm0rNDsqcGFybT0wO30KKyAgICB9CisgICAgZm9yKGk9MTtpPGFyZ2MrY291bnQ7aSsrKXsKKyAgICAgICAgaWYoaTxhcmdjKSBwYXJtPWFyZ3ZbaV07IGVsc2UgcGFybT1jb25mcFtpLWFyZ2NdOworLyogICAgICAgIHByaW50ZigiUGFyYW1ldGVyICVkPSVzXG4iLGkscGFybSk7Ki8KKwlpZighc3RybmNtcChwYXJtLCItcm1jZmctIiw3KSl7CisJICBpbnQgaixsZW49c3RybGVuKHBhcm0pOworCSAgZm9yKGo9MDtqPGNvdW50O2orKykKKwkgICAgaWYoIXN0cm5jbXAoY29uZnBbal0scGFybSs2LGxlbi02KSkgY29uZnBbal1bMF09MDsKKwkgIHBhcm1bMF09MDsKKwkgIGNvbnRpbnVlOworCX0KKyAgICAgICAgaWYoIXN0cm5jbXAocGFybSwiLWxkbm9kYj0iLDgpKXtub2RiPXBhcm0rODsqcGFybT0wO30KKyAgICAgICAgaWYoIXN0cm5jbXAocGFybSwiLWxkc3RhdGljPSIsMTApKXtzdGF0aWNmbGFnPXBhcm0rMTA7KnBhcm09MDt9CisgICAgICAgIGlmKCFzdHJjbXAocGFybSwiLWciKSkgZGI9MTsKKwlpZighc3RyY21wKHBhcm0sIi1kZXBzIikpIGRlcHM9MTsKKyAgICAgICAgaWYoIXN0cmNtcChwYXJtLCItc3RhdGljIikpe3N0YXRpY21vZGU9MTsqcGFybT0wO30KKyAgICAgICAgaWYoIXN0cm5jbXAocGFybSwiLW1sPSIsNCkpe01BWENMRU49YXRvaShwYXJtKzQpOypwYXJtPTA7fQorICAgICAgICBpZighc3RybmNtcChwYXJtLCItcHA9Iiw0KSl7cHBuYW1lPXBhcm0rNDsqcGFybT0wO30KKyAgICAgICAgaWYoIXN0cm5jbXAocGFybSwiLWNjPSIsNCkpe2NjbmFtZT1wYXJtKzQ7KnBhcm09MDt9CisgICAgICAgIGlmKCFzdHJuY21wKHBhcm0sIi1hcz0iLDQpKXthc25hbWU9cGFybSs0OypwYXJtPTA7fQorICAgICAgICBpZighc3RybmNtcChwYXJtLCItbGQ9Iiw0KSl7bGRuYW1lPXBhcm0rNDsqcGFybT0wO30KKyAgICAgICAgaWYoIXN0cm5jbXAocGFybSwiLWwyPSIsNCkpe2wybmFtZT1wYXJtKzQ7KnBhcm09MDt9CisgICAgICAgIGlmKCFzdHJuY21wKHBhcm0sIi1ybT0iLDQpKXtybW5hbWU9cGFybSs0OypwYXJtPTA7fQorICAgICAgICBpZighc3RybmNtcChwYXJtLCItcHB2PSIsNSkpe3Bwdj1wYXJtKzU7KnBhcm09MDt9CisgICAgICAgIGlmKCFzdHJuY21wKHBhcm0sIi1jY3Y9Iiw1KSl7Y2N2PXBhcm0rNTsqcGFybT0wO30KKyAgICAgICAgaWYoIXN0cm5jbXAocGFybSwiLWFzdj0iLDUpKXthc3Y9cGFybSs1OypwYXJtPTA7fQorICAgICAgICBpZighc3RybmNtcChwYXJtLCItbGR2PSIsNSkpe2xkdj1wYXJtKzU7KnBhcm09MDt9CisgICAgICAgIGlmKCFzdHJuY21wKHBhcm0sIi1sMnY9Iiw1KSl7bDJ2PXBhcm0rNTsqcGFybT0wO30KKyAgICAgICAgaWYoIXN0cm5jbXAocGFybSwiLXJtdj0iLDUpKXtybXY9cGFybSs1OypwYXJtPTA7fQorICAgICAgICBpZighc3RybmNtcChwYXJtLCItY2Y9Iiw0KSl7Y2Y9cGFybSs0OypwYXJtPTA7fQorICAgICAgICBpZighc3RybmNtcChwYXJtLCItaXNjPSIsNSkpe3NjbmFtZT1wYXJtKzU7KnBhcm09MDt9CisgICAgICAgIGlmKCFzdHJuY21wKHBhcm0sIi1pc2N2PSIsNikpe3Njdj1wYXJtKzY7KnBhcm09MDt9CisJLyogVE9ETzogd2UgcmUtdXNlIHNjaGVkdWxlciBmb3IgY29tcHJlc3NvciAqLworICAgICAgICBpZighc3RybmNtcChwYXJtLCItY3ByPSIsNSkpe3NjbmFtZT1wYXJtKzU7KnBhcm09MDtjb21wcmVzc29yPTE7fQorICAgICAgICBpZighc3RybmNtcChwYXJtLCItY3Bydj0iLDYpKXtzY3Y9cGFybSs2OypwYXJtPTA7Y29tcHJlc3Nvcj0xO30KKyAgICAgICAgaWYoIXN0cmNtcChwYXJtLCItc2NoZWR1bGUiKSkge2ZsYWdzfD1TQ0hFRFVMRVI7KnBhcm09MDt9CisgICAgICAgIGlmKCFzdHJjbXAocGFybSwiLW5vdG1wZmlsZSIpKSB7ZmxhZ3N8PU5PVE1QRklMRTsqcGFybT0wO30KKyAgICAgICAgLyppZighc3RyY21wKHBhcm0sIi1FIikpIHtmbGFnc3w9Q0NTUkM7KnBhcm09MDt9Ki8KKyAgICAgICAgaWYoIXN0cmNtcChwYXJtLCItUyIpKSB7ZmxhZ3N8PUFTU1JDOypwYXJtPTA7fQorICAgICAgICBpZighc3RyY21wKHBhcm0sIi1TQ1MiKSkge2ZsYWdzfD1TQ1NSQzsqcGFybT0wO30KKyAgICAgICAgaWYoIXN0cmNtcChwYXJtLCItYyIpKSB7ZmxhZ3N8PU9CSjsqcGFybT0wO30KKyAgICAgICAgaWYoIXN0cmNtcChwYXJtLCItdiIpKSB7ZmxhZ3N8PVZFUkJPU0U7KnBhcm09MDt9CisgICAgICAgIGlmKCFzdHJjbXAocGFybSwiLWgiKSkge2ZsYWdzfD1WRVJCT1NFOypwYXJtPTA7fQorICAgICAgICBpZighc3RyY21wKHBhcm0sIi1rIikpIHtmbGFnc3w9S0VFUFNDUkFUQ0g7KnBhcm09MDt9CisgICAgICAgIGlmKCFzdHJjbXAocGFybSwiLXZ2IikpIHtmbGFnc3w9VkVSQk9TRXxWRVJZVkVSQk9TRTsqcGFybT0wO30KKyAgICAgICAgaWYoIXN0cmNtcChwYXJtLCItbm9zdGRsaWIiKSkge2ZsYWdzfD1OT1NURExJQjsqcGFybT0wO30KKyAgICAgICAgaWYocGFybVswXSA9PSAnOycpIHsqcGFybT0wO30KKyAgICAgICAgaWYoIXN0cm5jbXAocGFybSwiLU8iLDIpKXsKKyAgICAgICAgICBzdGF0aWMgaW50IGhhZF9vcHQ7CisgICAgICAgICAgaWYoaGFkX29wdCl7CisgICAgICAgICAgICBwdXRzKCJPcHRpbWl6YXRpb24gZmxhZ3Mgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzIik7CisgICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICAgICAgfQorICAgICAgICAgIGhhZF9vcHQ9MTsKKyAgICAgICAgICBpZihwYXJtWzJdPT0nMCcpIG9wdD0wOworICAgICAgICAgIGVsc2UgaWYocGFybVsyXT09JzEnfHxwYXJtWzJdPT0wKSBvcHQ9OTkxOworICAgICAgICAgIGVsc2UgaWYocGFybVsyXT09JzInKSB7b3B0PTEwMjM7ZmxhZ3N8PVNDSEVEVUxFUjt9CisgICAgICAgICAgZWxzZSBpZihwYXJtWzJdPT0nMycpIHtvcHQ9fjA7ZmxhZ3N8PShTQ0hFRFVMRVJ8Q1JPU1NNT0RVTEUpO30KKyAgICAgICAgICBlbHNlIGlmKHBhcm1bMl0+PSc0JyYmcGFybVsyXTw9JzknKSB7b3B0PX4wO2ZsYWdzfD0oU0NIRURVTEVSfFdQTyk7fQorICAgICAgICAgIAorICAgICAgICAgIGVsc2UgaWYocGFybVsyXT09Jz0nKSBvcHQ9YXRvaSgmcGFybVszXSk7CisgICAgICAgICAgKnBhcm09MDsKKyAgICAgICAgfQorICAgICAgICBpZighc3RyY21wKHBhcm0sIi1vIikmJmk8YXJnYy0xKSB7CisgICAgICAgICAgICAqYXJndltpKytdPTA7ZGVzdG5hbWU9Y29udmVydF9wYXRoKGFyZ3ZbaV0pOworICAgICAgICAgICAgZmxhZ3N8PU9VVFBVVFNFVDthcmd2W2ldPSIiO2NvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmKCFzdHJuY21wKHBhcm0sIi1vPSIsMykpeworICAgICAgICAgICAgZGVzdG5hbWU9Y29udmVydF9wYXRoKHBhcm0rMyk7CisgICAgICAgICAgICBmbGFnc3w9T1VUUFVUU0VUOypwYXJtPTA7Y29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYocGFybVswXT09Jy0nJiZwYXJtWzFdPT0nbCcpeworICAgICAgICAgICAgc2l6ZV90IGw9c3RybGVuKHVzZXJsaWJzKTsKKyAgICAgICAgICAgIGlmKChsK3N0cmxlbihwYXJtKS0yK3N0cmxlbih1bCkrMSk+PVVTRVJMSUJTKXtwdXRzKCJVc2VybGlicyB0b28gbG9uZyIpO2V4aXQoRVhJVF9GQUlMVVJFKTt9CisgICAgICAgICAgICB1c2VybGlic1tsXT0nICc7CisgICAgICAgICAgICBzcHJpbnRmKHVzZXJsaWJzK2wrMSx1bCxwYXJtKzIpOworICAgICAgICAgICAgKnBhcm09MDtjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZihwYXJtWzBdPT0nLScmJnBhcm1bMV09PSdMJyl7CisgICAgICAgICAgICBzaXplX3QgbD1zdHJsZW4odXNlcmxpYnMpOworICAgICAgICAgICAgaWYoKGwrc3RybGVuKHBhcm0pKzEpPj1VU0VSTElCUyl7cHV0cygiVXNlcmxpYnMgdG9vIGxvbmciKTtleGl0KEVYSVRfRkFJTFVSRSk7fQorICAgICAgICAgICAgdXNlcmxpYnNbbF09JyAnOworICAgICAgICAgICAgc3ByaW50Zih1c2VybGlicytsKzEsIiVzIixwYXJtKTsKKyAgICAgICAgICAgICpwYXJtPTA7Y29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbGVuKz1zdHJsZW4ocGFybSkrMTA7CisjaWZkZWYgQVRBUkkKKyAgICAgICAgaWYodmJjY2VudikKKyAgICAgICAgICBsZW4rPXN0cmxlbih2YmNjZW52KSs1OworI2VuZGlmCisgICAgfQorICAgIGlmKCFkYiYmKm5vZGIpeworICAgICAgaWYoc3RybGVuKHVzZXJsaWJzKSsyK3N0cmxlbihub2RiKT49VVNFUkxJQlMpeworICAgICAgICBwdXRzKCJVc2VybGlicyB0b28gbG9uZyIpO2V4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgIH0KKyAgICAgIHN0cmNhdCh1c2VybGlicywiICIpOworICAgICAgc3RyY2F0KHVzZXJsaWJzLG5vZGIpOworICAgIH0KKyAgICBpZihzdGF0aWNtb2RlJiYqc3RhdGljZmxhZyl7CisgICAgICBzaXplX3QgdWxlbj1zdHJsZW4odXNlcmxpYnMpOworICAgICAgc2l6ZV90IHNsZW49c3RybGVuKHN0YXRpY2ZsYWcpOworICAgICAgaWYodWxlbisyK3NsZW4+PVVTRVJMSUJTKXsKKyAgICAgICAgcHV0cygiVXNlcmxpYnMgdG9vIGxvbmciKTtleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICB9CisgICAgICBtZW1tb3ZlKHVzZXJsaWJzK3NsZW4rMSx1c2VybGlicyx1bGVuKzEpOworICAgICAgbWVtY3B5KHVzZXJsaWJzLHN0YXRpY2ZsYWcsc2xlbik7CisgICAgICB1c2VybGlic1tzbGVuXT0nICc7CisgICAgfQorICAgIGlmKGZsYWdzJlZFUkJPU0UpeworICAgICAgcHJpbnRmKCJ2YyBmcm9udGVuZCBmb3IgdmJjYyAoYykgaW4gMTk5NS0yMDIwIGJ5IFZvbGtlciBCYXJ0aGVsbWFublxuIik7CisjaWZkZWYgU1BFQ0lBTF9DT1BZUklHSFQKKyAgICAgIHByaW50ZigiJXNcbiIsU1BFQ0lBTF9DT1BZUklHSFQpOworI2VuZGlmCisgICAgfQorICAgIGlmKCEoZmxhZ3MmNykpIGZsYWdzfD1PQkorMTsKKyAgICB0Zmw9ZmxhZ3MmNzsKKyAgICBpZigoZmxhZ3MmV1BPKSYmdGZsIT1PQkopeworICAgICAgZmxhZ3MmPX5XUE87CisgICAgICBmbGFnc3w9Q1JPU1NNT0RVTEU7CisgICAgfQorICAgIGlmKHNjbmFtZT09ZW1wdHkpIGZsYWdzJj1+U0NIRURVTEVSOworICAgIGlmKGZsYWdzJlZFUllWRVJCT1NFKXsKKyAgICAgIHBwbmFtZT1wcHY7Y2NuYW1lPWNjdjthc25hbWU9YXN2O2xkbmFtZT1sZHY7CisgICAgICBybW5hbWU9cm12O2wybmFtZT1sMnY7c2NuYW1lPXNjdjsKKyAgICB9CisgICAgaWYoZmxhZ3MmTk9TVERMSUIpe2xkbmFtZT1sMm5hbWU7fQorICAgIC8qICBOdW1tZXIgc2ljaGVyLi4uICAgICovCisgICAgbGVuKz1zdHJsZW4ocHBuYW1lKStzdHJsZW4oY2NuYW1lKStzdHJsZW4oYXNuYW1lKSsKKyAgICAgICAgIHN0cmxlbihybW5hbWUpK3N0cmxlbihzY25hbWUpK3N0cmxlbih1c2VybGlicykrTkFNRUJVRisxMDA7CisgICAgaWYoIShjb21tYW5kPW1hbGxvYyhsZW4pKSl7cHJpbnRmKG5vbWVtKTtyYXVzKEVYSVRfRkFJTFVSRSk7fQorICAgIGlmKCEob2xkZmlsZT1tYWxsb2MobGVuKSkpe3ByaW50Zihub21lbSk7cmF1cyhFWElUX0ZBSUxVUkUpO30KKyAgICBpZighKG9wdGlvbnM9bWFsbG9jKGxlbikpKXtwcmludGYobm9tZW0pO3JhdXMoRVhJVF9GQUlMVVJFKTt9CisgICAgaWYoIShwcG9wdHM9bWFsbG9jKGxlbikpKXtwcmludGYobm9tZW0pO3JhdXMoRVhJVF9GQUlMVVJFKTt9CisgICAgKm9wdGlvbnM9MDsqcHBvcHRzPTA7CisgICAgZm9yKGk9MTtpPGFyZ2MrY291bnQ7aSsrKXsKKyAgICAgICAgaWYoaTxhcmdjKSBwYXJtPWFyZ3ZbaV07IGVsc2UgcGFybT1jb25mcFtpLWFyZ2NdOworICAgICAgICBpZigqcGFybT09Jy0nKXsKKyAgICAgICAgICAgIGlmKHBwbmFtZT09ZW1wdHl8fChwYXJtWzFdIT0nRCcmJnBhcm1bMV0hPSdJJyYmcGFybVsxXSE9JysnKSl7CisgICAgICAgICAgICAgICAgc3RyY2F0KG9wdGlvbnMscGFybSk7c3RyY2F0KG9wdGlvbnMsIiAiKTsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIHN0cmNhdChwcG9wdHMscGFybSk7c3RyY2F0KHBwb3B0cywiICIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmKGZsYWdzJlZFUllWRVJCT1NFKSBwcmludGYoImZsYWdzPSVkIG9wdD0lbGQgbGVuPSVkXG4iLGZsYWdzLG9wdCxsZW4pOworICAgIG5hbWVidWZbMF09J1wiJzsgbmFtZWJ1ZjJbMF09J1wiJzsKKyAgICBmb3IoaT0xO2k8YXJnYytjb3VudCsoKGZsYWdzJkNST1NTTU9EVUxFKSE9MCk7aSsrKXsKKyAgICAgICAgaW50IHQsajtjaGFyICpmaWxlOworI2lmZGVmIEFNSUdBCisgICAgICAgIEJQVFIgbG9jazsKKyNlbmRpZgorICAgICAgICBpZihpPGFyZ2MpCisgICAgICAgICAgcGFybT1hcmd2W2ldOworICAgICAgICBlbHNlIGlmKGk8YXJnYytjb3VudCkKKyAgICAgICAgICBwYXJtPWNvbmZwW2ktYXJnY107CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwYXJtPWNtZmlsZXM7CisgICAgICAgIGlmKCFwYXJtfHwoKnBhcm09PSctJyYmcGFybSE9Y21maWxlcyl8fCEqcGFybSkgY29udGludWU7CisgICAgICAgIGlmKGZsYWdzJlZFUllWRVJCT1NFKSBwcmludGYoIkFyZ3VtZW50ICVkOiVzXG4iLGkscGFybSk7CisjaWZkZWYgQU1JR0EKKyAgICAgICAgaWYocG0mJnBhcm0hPWNtZmlsZXMpCisgICAgICAgICAgICBpZihNYXRjaEZpcnN0KChTVFJQVFIpY29udmVydF9wYXRoKHBhcm0pLGFwKSl7CisgICAgICAgICAgICAgICAgTWF0Y2hFbmQoYXApOworICAgICAgICAgICAgICAgIHByaW50ZigiTm8gbWF0Y2ggZm9yICVzXG4iLHBhcm0pOworICAgICAgICAgICAgICAgIHJjPVJFVFVSTl9XQVJOOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGRveworICAgICAgICAgICAgaWYocGFybT09Y21maWxlcyl7CisgICAgICAgICAgICAgICAgZmlsZT1wYXJtOworICAgICAgICAgICAgICAgIHQ9Q0NTUkM7CisgICAgICAgICAgICB9ZWxzZXsKKyNpZmRlZiBBTUlHQQorI2lmZGVmIF9fYW1pZ2FvczRfXworICAgICAgICAgICAgICAgIGlmKHBtKSBmaWxlPShjaGFyICopYXAtPmFwX0J1ZmZlcjsgZWxzZSBmaWxlPXBhcm07CisjZWxzZQorICAgICAgICAgICAgICAgIGlmKHBtKSBmaWxlPShjaGFyICopJmFwLT5hcF9CdWZbMF07IGVsc2UgZmlsZT1wYXJtOworI2VuZGlmCisjZWxzZQorICAgICAgICAgICAgICAgIGZpbGU9Y29udmVydF9wYXRoKHBhcm0pOworI2VuZGlmCisgICAgICAgICAgICAgICAgdD10eXAoZmlsZSk7CisgICAgICAgICAgICAgICAgc3RyY3B5KG5hbWVidWYrMSxmaWxlKTsKKyAgICAgICAgICAgICAgICBzdHJjYXQobmFtZWJ1ZiwiXCIiKTsKKyAgICAgICAgICAgICAgICBmaWxlPW5hbWVidWY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihmbGFncyZWRVJZVkVSQk9TRSkgcHJpbnRmKCJGaWxlICVzPSVkXG4iLGZpbGUsdCk7CisgICAgICAgICAgICBpZighY21uYW1lJiYoZmxhZ3MmQ1JPU1NNT0RVTEUpJiZ0PD1DQ1NSQyl7CisgICAgICAgICAgICAgICAgY21uYW1lPW1hbGxvYyhOQU1FQlVGKTsKKyAgICAgICAgICAgICAgICBpZighY21uYW1lKXtwcmludGYobm9tZW0pO2V4aXQoRVhJVF9GQUlMVVJFKTt9CisgICAgICAgICAgICAgICAgaWYodGZsPT1PQkopeworICAgICAgICAgICAgICAgICAgICBzdHJjcHkoY21uYW1lLGZpbGUpOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBjbW5hbWVbMF09J1wiJzsKKyAgICAgICAgICAgICAgICAgICAgdG1wbmFtKGNtbmFtZSsxKTsKKwkJICAgIHN0cmNhdChjbW5hbWUsIi4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3Ioaj10O2o8dGZsO2orKyl7CisgICAgICAgICAgICAgICAgaWYoaj09T0JKKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoaj09dCkgYWRkX25hbWUoZmlsZSwmZmlyc3Rfb2JqLCZsYXN0X29iaik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJjcHkob2xkZmlsZSxmaWxlKTsKKyAgICAgICAgICAgICAgICBpZihmaWxlPT1jbWZpbGVzKXsKKyAgICAgICAgICAgICAgICAgICAgZmlsZT1jbW91dHB1dDsKKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgaWYoaj09dCYmaiE9dGZsLTEmJiEoZmxhZ3MmKE5PVE1QRklMRXxLRUVQU0NSQVRDSCkpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU9bmFtZWJ1ZjI7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXBuYW0oZmlsZSsxKTsKKwkJCXN0cmNhdChmaWxlLCIuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoaj09dGZsLTF8fChmbGFncyZXUE8pKSBmaWxlPW5hbWVidWY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKGo9PVBQU1JDKXsKKyAgICAgICAgICAgICAgICAgICAgZmlsZT1hZGRfc3VmZml4KGZpbGUsIi5pIik7CisgICAgICAgICAgICAgICAgICAgIGlmKHRmbD09Q0NTUkMmJihmbGFncyZPVVRQVVRTRVQpKSBmaWxlPWRlc3RuYW1lOworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGNvbW1hbmQscHBuYW1lLHBwb3B0cyxvbGRmaWxlLGZpbGUpOworICAgICAgICAgICAgICAgICAgICBpZigodGZsKSE9Q0NTUkMpIGFkZF9uYW1lKGZpbGUsJmZpcnN0X3NjcmF0Y2gsJmxhc3Rfc2NyYXRjaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIE1VU1QgY29tZSBiZWZvcmUgQ0NTUkMtaGFuZGxpbmchICovCisgICAgICAgICAgICAgICAgaWYoaj09U0NTUkMpeworICAgICAgICAgICAgICAgICAgICAvKmlmKGZpbmFsKSBmaWxlPWNtbmFtZTsqLworICAgICAgICAgICAgICAgICAgICBmaWxlPWFkZF9zdWZmaXgoZmlsZSwiLmFzbSIpOworICAgICAgICAgICAgICAgICAgICBpZih0Zmw9PUFTU1JDJiYoZmxhZ3MmT1VUUFVUU0VUKSkgZmlsZT1kZXN0bmFtZTsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50Zihjb21tYW5kLHNjbmFtZSxvbGRmaWxlLGZpbGUpOworICAgICAgICAgICAgICAgICAgICBpZih0ZmwhPUFTU1JDKSBhZGRfbmFtZShmaWxlLCZmaXJzdF9zY3JhdGNoLCZsYXN0X3NjcmF0Y2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihqPT1DQ1NSQyl7CisgICAgICAgICAgICAgICAgICAgIGlmKGZpbGUhPWNtb3V0cHV0KXsKKyAgICAgICAgICAgICAgICAgICAgICBpZihmbGFncyZXUE8peworICAgICAgICAgICAgICAgICAgICAgICAgaWYoZmxhZ3MmT1VUUFVUU0VUKQorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlPWRlc3RuYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlPWFkZF9zdWZmaXgoZmlsZSwiLm8iKTsKKyAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihmbGFncyZTQ0hFRFVMRVIpeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZT1hZGRfc3VmZml4KGZpbGUsIi5zY3MiKTsKKyAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCsraj09dGZsLTEpIGZpbGU9bmFtZWJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU9YWRkX3N1ZmZpeChmaWxlLCIuYXNtIik7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIGlmKHRmbD09aisxJiYoZmxhZ3MmT1VUUFVUU0VUKSkgZmlsZT1kZXN0bmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICBpZihmbGFncyZDUk9TU01PRFVMRSl7CisjaWZkZWYgVVNFQ01ERklMRQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWNtZGZpbGUpeworICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzOworICAgICAgICAgICAgICAgICAgICAgICAgICBzPXRtcG5hbSgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY21maWxlcz1tYWxsb2Moc3RybGVuKHMpKzE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWNtZmlsZXMpe3ByaW50Zihub21lbSk7ZXhpdChFWElUX0ZBSUxVUkUpO30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihjbWZpbGVzLCItY21kPSBcIiVzXCIiLHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRmaWxlPWZvcGVuKHMsInciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWNtZGZpbGUpe3ByaW50ZigiQ291bGQgbm90IG9wZW4gPCVzPiFcbiIscyk7ZXhpdChFWElUX0ZBSUxVUkUpO30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX25hbWUocywmZmlyc3Rfc2NyYXRjaCwmbGFzdF9zY3JhdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZwdXRzKG9sZGZpbGUsY21kZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHV0cygiXG4iLGNtZGZpbGUpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFjbWZpbGVzKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY21maWxlcz1tYWxsb2Moc3RybGVuKG9sZGZpbGUpKzMpOworICAgICAgICAgICAgICAgICAgICAgICAgICBpZighY21maWxlcyl7cHJpbnRmKG5vbWVtKTtleGl0KEVYSVRfRkFJTFVSRSk7fQorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoY21maWxlcyxvbGRmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICBjbWZpbGVzPXJlYWxsb2MoY21maWxlcyxzdHJsZW4oY21maWxlcykrc3RybGVuKG9sZGZpbGUpKzMpOworICAgICAgICAgICAgICAgICAgICAgICAgICBpZighY21maWxlcyl7cHJpbnRmKG5vbWVtKTtleGl0KEVYSVRfRkFJTFVSRSk7fQorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjYXQoY21maWxlcywiICIpO3N0cmNhdChjbWZpbGVzLG9sZGZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICBpZighY21vdXRwdXQpeworICAgICAgICAgICAgICAgICAgICAgICAgICBjbW91dHB1dD1tYWxsb2Moc3RybGVuKGZpbGUpKzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICBpZighY21vdXRwdXQpe3ByaW50Zihub21lbSk7ZXhpdChFWElUX0ZBSUxVUkUpO30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGNtb3V0cHV0LGZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKGZsYWdzJkNST1NTTU9EVUxFKXsKKyNpZmRlZiBVU0VDTURGSUxFCisgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKGNtZGZpbGUpOworICAgICAgICAgICAgICAgICAgICAgIGNtZGZpbGU9MDsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgIGZpbmFsPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoKGZsYWdzJihDUk9TU01PRFVMRXxTQ0hFRFVMRVIpKT09Q1JPU1NNT0RVTEUpIGorKzsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50Zihjb21tYW5kLGNjbmFtZSxvbGRmaWxlLGZpbGUsb3B0aW9ucyxvcHQpOworICAgICAgICAgICAgICAgICAgICBpZihmbGFncyZXUE8peworICAgICAgICAgICAgICAgICAgICAgIHN0cmNhdChjb21tYW5kLCIgLXdwbyIpOworICAgICAgICAgICAgICAgICAgICAgIGo9T0JKOworICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICBpZih0ZmwhPWorMSkgYWRkX25hbWUoZmlsZSwmZmlyc3Rfc2NyYXRjaCwmbGFzdF9zY3JhdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCQkgICAgaWYoZGVwcyYmdGZsPT1PQkomJihmbGFncyZPVVRQVVRTRVQpKXsKKwkJICAgICAgc3RyY2F0KGNvbW1hbmQsIiAtZGVwb2JqPSIpOworCQkgICAgICBzdHJjYXQoY29tbWFuZCxkZXN0bmFtZSk7CisJCSAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKGo9PUFTU1JDKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoZmluYWwpIGZpbGU9Y21uYW1lOworICAgICAgICAgICAgICAgICAgICBmaWxlPWFkZF9zdWZmaXgoZmlsZSwiLm8iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYodGZsPT1PQkomJihmbGFncyZPVVRQVVRTRVQpKSBmaWxlPWRlc3RuYW1lOworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGNvbW1hbmQsYXNuYW1lLG9sZGZpbGUsZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIGFkZF9uYW1lKGZpbGUsJmZpcnN0X29iaiwmbGFzdF9vYmopOworICAgICAgICAgICAgICAgICAgICBpZigodGZsKSE9T0JKKSBhZGRfbmFtZShmaWxlLCZmaXJzdF9zY3JhdGNoLCZsYXN0X3NjcmF0Y2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihmbGFncyZWRVJCT1NFKSBwcmludGYoIiVzXG4iLGNvbW1hbmQpOworI2lmZGVmIEFNSUdBCisjaWYgIWRlZmluZWQoX19hbWlnYW9zNF9fKSAmJiAhZGVmaW5lZChfX01PUlBIT1NfXykKKyAgICAgICAgICAgICAgICBpZihET1NCYXNlLT5kbF9saWIubGliX1ZlcnNpb24+PTM2KXsKKyNlbHNlCisgICAgICAgICAgICAgICAgaWYoMSl7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgaWYoU3lzdGVtVGFncyhjb21tYW5kLE5QX1ByaW9yaXR5LC0yLFRBR19ET05FKSl7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzIGZhaWxlZFxuIixjb21tYW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBtKSBNYXRjaEVuZChhcCk7CisgICAgICAgICAgICAgICAgICAgICAgICByYXVzKEVYSVRfRkFJTFVSRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9ZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgaWYocnVuY21kKGNvbW1hbmQpKXtwcmludGYoIiVzIGZhaWxlZFxuIixjb21tYW5kKTtyYXVzKEVYSVRfRkFJTFVSRSk7fQorICAgICAgICAgICAgfQorI2lmZGVmIEFNSUdBCisgICAgICAgIH13aGlsZShwbSYmIU1hdGNoTmV4dChhcCkpOworICAgICAgICBpZihwbSkgTWF0Y2hFbmQoYXApOworI2Vsc2UKKyAgICAgICAgfXdoaWxlKDApOworI2VuZGlmCisgICAgfQorICAgIGlmKCh0ZmwpPk9CSil7CisgICAgLyogIFp1IEV4ZWN1dGFibGUgbGlua2VuICAgICovCisgICAgICAgIHN0cnVjdCBOYW1lTGlzdCAqcDsKKyAgICAgICAgRklMRSAqb2JqZmlsZT0wOworICAgICAgICBjaGFyICp0Zm5hbWU7CisgICAgICAgIG9iamVjdHM9bWFsbG9jKGxpbmtsZW4pOworICAgICAgICBpZighb2JqZWN0cyl7cHJpbnRmKG5vbWVtKTtyYXVzKEVYSVRfRkFJTFVSRSk7fQorICAgICAgICBsaW5rbGVuKz1zdHJsZW4obGRuYW1lKStzdHJsZW4oZGVzdG5hbWUpK3N0cmxlbih1c2VybGlicykrMTA7CisjaWZkZWYgQVRBUkkKKyAgICAgICAgaWYodmJjY2VudikgbGlua2xlbis9c3RybGVuKHZiY2NlbnYpKzU7CisjZW5kaWYKKyAgICAgICAgaWYoZmxhZ3MmVkVSWVZFUkJPU0UpIHByaW50ZigibGlua2xlbj0lZFxuIixsaW5rbGVuKTsKKyAgICAgICAgaWYoIShsaW5rY21kPW1hbGxvYyhsaW5rbGVuKSkpe3ByaW50Zihub21lbSk7cmF1cyhFWElUX0ZBSUxVUkUpO30KKyAgICAgICAgcD1maXJzdF9vYmo7CisgICAgICAgIGlmKGxpbmtsZW4+PU1BWENMRU4peworICAgICAgICAgICAgdGZuYW1lPXRtcG5hbSgwKTsKKyAgICAgICAgICAgIHNwcmludGYob2JqZWN0cyxjZix0Zm5hbWUpOworICAgICAgICAgICAgaWYoIShvYmpmaWxlPWZvcGVuKHRmbmFtZSwidyIpKSl7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJDb3VsZCBub3Qgb3BlbiA8JXM+IVxuIix0Zm5hbWUpOworICAgICAgICAgICAgICAgIHJhdXMoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfWVsc2UgKm9iamVjdHM9MDsKKyAgICAgICAgd2hpbGUocCl7CisgICAgICAgICAgICBpZihwLT5vYmopeworICAgICAgICAgICAgICAgIGlmKGxpbmtsZW4+PU1BWENMRU4peworICAgICAgICAgICAgICAgICAgICBmcHV0cyhwLT5vYmosb2JqZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIGZwdXRzKCJcbiIsb2JqZmlsZSk7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIHN0cmNhdChvYmplY3RzLHAtPm9iaik7c3RyY2F0KG9iamVjdHMsIiAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwPXAtPm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYob2JqZmlsZSkgZmNsb3NlKG9iamZpbGUpOworICAgICAgICBpZigqb2JqZWN0cyl7CisgICAgICAgICAgICBzcHJpbnRmKGxpbmtjbWQsbGRuYW1lLG9iamVjdHMsdXNlcmxpYnMsZGVzdG5hbWUpOworICAgICAgICAgICAgaWYoZmxhZ3MmVkVSQk9TRSkgcHJpbnRmKCIlc1xuIixsaW5rY21kKTsKKyAgICAgICAgICAgIC8qICBoaWVyIHdpcmQgb2JqZmlsZSBiZWkgRmVobGVyIG5pY2h0IGdlbG9lc2NodCAgICAqLworICAgICAgICAgICAgaWYocnVuY21kKGxpbmtjbWQpKXtwcmludGYoIiVzIGZhaWxlZFxuIixsaW5rY21kKTtyYXVzKEVYSVRfRkFJTFVSRSk7fQorI2lmZGVmIEFNSUdBCisgICAgICAgICAgICBpZihmbGFncyZWRVJCT1NFKXsKKyAgICAgICAgICAgICAgICBCUFRSIGw7CisgICAgICAgICAgICAgICAgaWYobD1Mb2NrKChTVFJQVFIpZGVzdG5hbWUsLTIpKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoRXhhbWluZShsLCZmaWIpKSBwcmludGYoIlNpemUgb2YgZXhlY3V0YWJsZTogJWx1IGJ5dGVzXG4iLCh1bnNpZ25lZCBsb25nKWZpYi5maWJfU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIFVuTG9jayhsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfWVsc2UgcHV0cygiTm8gb2JqZWN0cyB0byBsaW5rIik7CisgICAgICAgIGlmKG9iamZpbGUpIHJlbW92ZSh0Zm5hbWUpOworICAgIH0KKyAgICBpZighKGZsYWdzJktFRVBTQ1JBVENIKSkgZGVsX3NjcmF0Y2goZmlyc3Rfc2NyYXRjaCk7CisgICAgcmF1cyhyYyk7Cit9CmRpZmYgLS1naXQgYS9pYy5jIGIvaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTc2OTIwCi0tLSAvZGV2L251bGwKKysrIGIvaWMuYwpAQCAtMCwwICsxLDI4MDIgQEAKKy8qICAkVkVSOiB2YmNjIChpYy5jKSAkUmV2aXNpb246IDEuNjUgJCAgKi8KKworI2luY2x1ZGUgInZiYy5oIgorI2luY2x1ZGUgIm9wdC5oIgorCisjZGVmaW5lIFJOT1NBVkUgMzIgLyogcmVnaXN0ZXIgZG9lcyBub3QgaGF2ZSB0byBiZSBzYXZlZCBhY3Jvc3MgY2FsbCAqLworI2RlZmluZSBSSEFMRiAgIDY0IC8qIGhhbGYgb2YgYSByZWdpc3RlciBwYWlyIHdhcyBhbHJlYWR5IGFsbG9jYXRlZCAqLworCitzdGF0aWMgY2hhciBGSUxFX1tdPV9fRklMRV9fOworCitzdGF0aWMgSUMgKmZpcnN0X3B1c2hlZDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgb3B1c2hlZDsKK3N0YXRpYyBpbnQgdm9sYXRpbGVfY29udmVydDsKKworaW50IGRvX2FyaXRoKG5wLElDICosbnAsb2JqICopOworc3RhdGljIG9iaiAqcG9zdG9wX29iajsKK3N0YXRpYyBpbnQgcG9zdG9wX3R5cGU7CitucCBnZW5fbGliY2FsbChjaGFyICpmbmFtZSxucCBhcmcxLHR5cGUgKnQxLG5wIGFyZzIsdHlwZSAqdDIpOworCitzdGF0aWMgdm9pZCBoYW5kbGVfcmVnbGlzdChyZWdhcmdzX2xpc3QgKixvYmogKik7CisKK3N0YXRpYyB2b2lkIGZpeF9wdXNoaWMoSUMgKipwdXNoaWMsSUMgKm5ldykKK3sKKyAgSUMgKnA9bGFzdF9pYzsKKyAgd2hpbGUocCYmcC0+Y29kZT09RlJFRVJFRykgcD1wLT5wcmV2OworICBpZihuZXc9PSpwdXNoaWMmJm5ldyE9cCl7CisgICAgaWYoREVCVUcmMSl7CisgICAgICBwcmludGYoInB1c2hpYyBjb252ZXJ0ZWQgdG86XG4iKTsKKyAgICAgIHByaWMyKHN0ZG91dCxwKTsKKyAgICB9CisgICAgKnB1c2hpYz1wOworICB9Cit9CisKKyNpZiBIQVZFX0xJQkNBTExTCisvKiBhdm9pZCBjYWxsaW5nIHVzZV9saWJjYWxsIHdpdGggaWxsZWdhbCBvcGVyYW5kcyAqLworc3RhdGljIGNoYXIgKnVzZV9saWJjYWxsX3dyYXAoaW50IGMsaW50IHQsaW50IHQyKQoreworICBpZihvcHRmbGFncyYyKQorICAgIHJldHVybiAwOworCisgIGlmKGM9PVBNVUxUKSBjPU1VTFQ7CisgIGlmKChjPj1PUiYmYzw9QU5EKXx8KGM+PUxTSElGVCYmYzw9S09NUExFTUVOVCl8fGM9PUNPTVBBUkV8fGM9PUNPTlZFUlR8fGM9PU1JTlVTfHxjPT1URVNUKQorICAgIHJldHVybiB1c2VfbGliY2FsbChjLHQsdDIpOworICByZXR1cm4gMDsKK30KKyNlbmRpZgorCit2b2lkIGdlbl90ZXN0KG9iaiAqbyxpbnQgdCxpbnQgYnJhbmNoLGludCBsYWJlbCkKKy8qICBHZW5lcmllcnQgZWluIHRlc3QgbywgYnJhbmNoIGxhYmVsIHVuZCBwYXNzdCBhdWYsIGRhc3MgICAgICAqLworLyogIGtlaW4gVEVTVCBjb25zdCBnZW5lcmllcnQgd2lyZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIElDICpuZXc7CisgIGlmKG8tPmZsYWdzJktPTlNUKXsKKyAgICBldmFsX2NvbnN0KCZvLT52YWwsdCk7CisgICAgaWYoemxkZXF0byh2bGRvdWJsZSxkMnpsZCgwLjApKSYmem1lcXRvKHZtYXgsbDJ6bSgwTCkpJiZ6dW1lcXRvKHZ1bWF4LHVsMnp1bSgwVUwpKSl7CisgICAgICBpZihicmFuY2g9PUJFUSkgYnJhbmNoPUJSQTsgZWxzZSBicmFuY2g9MDsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKGJyYW5jaD09Qk5FKSBicmFuY2g9QlJBOyBlbHNlIGJyYW5jaD0wOworICAgIH0KKyAgfWVsc2V7CisjaWYgSEFWRV9MSUJDQUxMUworICAgIHN0YXRpYyBub2RlIG49e1RFU1R9LG5uPXtSRUlOVEVSUFJFVH07CisgICAgc3RhdGljIHR5cGUgbnQsaXQ9e0lOVH07CisgICAgY2hhciAqbGlibmFtZTsKKyAgICBuLmxlZnQ9Jm5uOworICAgIG4ubnR5cD0maXQ7CisgICAgbm4ubnR5cD0mbnQ7CisgICAgbnQuZmxhZ3M9dDsKKyAgICBuLm89bm4ubz0qbzsKKyAgICBpZihsaWJuYW1lPXVzZV9saWJjYWxsX3dyYXAoVEVTVCx0LDApKXsKKyAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgIG5ldy0+Y29kZT1URVNUOworICAgICAgbmV3LT5xMi5mbGFncz1uZXctPnouZmxhZ3M9MDsKKyAgICAgIG5ldy0+dHlwZj1JTlQ7CisgICAgICBuZXctPnExPWdlbl9saWJjYWxsKGxpYm5hbWUsJm5uLCZudCwwLDApLT5vOworICAgICAgYWRkX0lDKG5ldyk7CisgICAgfWVsc2V7CisjZW5kaWYKKyAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgIG5ldy0+Y29kZT1URVNUOworICAgICAgbmV3LT5xMi5mbGFncz1uZXctPnouZmxhZ3M9MDsKKyAgICAgIG5ldy0+dHlwZj10OworICAgICAgbmV3LT5xMT0qbzsKKyAgICAgIGFkZF9JQyhuZXcpOworI2lmIEhBVkVfTElCQ0FMTFMKKyAgICB9CisjZW5kaWYKKyAgfQorICBpZihicmFuY2gpeworICAgIG5ldz1uZXdfSUMoKTsKKyAgICBuZXctPmNvZGU9YnJhbmNoOworICAgIG5ldy0+dHlwZj1sYWJlbDsKKyAgICBhZGRfSUMobmV3KTsKKyAgfQorfQorCisvKiByZW1vdmUgYSBmcmVlcmVnIGlmIGEgc2NyYXRjaCByZWdpc3RlciBpcyBuZWVkZWQgbW9yZSB0aGFuIG9uY2UgKi8KK3N0YXRpYyB2b2lkIGtlZXBfcmVnKGludCByKQoreworICBJQyAqbjsKKyAgaWYobm9jb2RlKSByZXR1cm47CisgIG49bGFzdF9pYzsKKyAgd2hpbGUobil7CisgICAgaWYobi0+Y29kZT09Q0FMTCYmcmVnc2NyYXRjaFtyXSl7CisgICAgICBJQyAqcmV0OworICAgICAgcmVnc1tyXT0xOworICAgICAgc2F2ZXNjcmF0Y2goTU9WRUZST01SRUcsbi0+cHJldiwwLCZuLT5xMSk7CisgICAgICByZXQ9bi0+bmV4dDsKKyAgICAgIHdoaWxlKHJldC0+Y29kZT09QUxMT0NSRUd8fHJldC0+Y29kZT09RlJFRVJFRykKKyAgICAgICAgcmV0PXJldC0+bmV4dDsKKyAgICAgIGlmKHJldC0+Y29kZT09R0VUUkVUVVJOKXsKKyAgICAgICAgaWYoKHJldC0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcmV0LT56LnJlZz09cikgCisgICAgICAgICAgcmV0LT56LmZsYWdzJj1+UkVHOworICAgICAgfWVsc2UKKyAgICAgICAgcmV0PXJldC0+cHJldjsKKyAgICAgIHNhdmVzY3JhdGNoKE1PVkVUT1JFRyxyZXQsMCwmbi0+cTEpOworICAgIH0KKyAgICBpZihuLT5jb2RlPT1GUkVFUkVHJiZuLT5xMS5yZWc9PXIpeworICAgICAgcmVtb3ZlX0lDKG4pOworICAgICAgaWYoIW5vY29kZSkKKyAgICAgICAgcmVnc1tyXT0xOworICAgICAgYnJlYWs7CisgICAgfQorICAgIG49bi0+cHJldjsKKyAgfQorfQorCisvKiBHZW5lcmF0ZSBjb2RlIHRvIGluc2VydCBhIGJpdGZpZWxkICovCit2b2lkIGluc2VydF9iaXRmaWVsZChvYmogKmRlc3Qsb2JqICpzcmMsb2JqICp2YWwsaW50IGJmcyxpbnQgYmZvLGludCB0LGludCBpc2NsZWFyKQoreworICAvKkZJWE1FOiBzaG9ydGN1dCBiZWFjaHRlbj8gKi8KKyAgSUMgKm5ldzsKKyAgb2JqIHRtcDEsdG1wMix0bXAzOworICBpbnQgdm1lcms7CisgIGJmbz1iZmxheW91dChiZm8sYmZzLHQpOworICBpZigoZGVzdC0+ZmxhZ3MmUkVHKSYmIXJlZ3NbZGVzdC0+cmVnXSkKKyAgICBrZWVwX3JlZyhkZXN0LT5yZWcpOworICBuZXc9bmV3X0lDKCk7CisgIG5ldy0+Y29kZT1BTkQ7CisgIG5ldy0+dHlwZj10OworICBuZXctPnExPSpzcmM7CisgIG5ldy0+cTEuZmxhZ3MmPX5TQ1JBVENIOworICBuZXctPnEyLmZsYWdzPUtPTlNUOworICBndmFsLnZtYXg9em1zdWIoem1sc2hpZnQobDJ6bSgxTCksbDJ6bSgoaW50KWJmcykpLGwyem0oMUwpKTsKKyAgZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworICBpbnNlcnRfY29uc3QoJm5ldy0+cTIudmFsLHQpOworICBnZXRfc2NyYXRjaCgmbmV3LT56LHQsMCwwKTsKKyAgdG1wMT1uZXctPno7CisgIGlmKChuZXctPnExLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKyAgICBjYWxjKEFORCxuZXctPnR5cGYsJm5ldy0+cTEudmFsLCZuZXctPnEyLnZhbCwmbmV3LT5xMS52YWwsMCk7CisgICAgbmV3LT5jb2RlPUFTU0lHTjsKKyAgICBuZXctPnEyLmZsYWdzPTA7CisgICAgbmV3LT5xMi52YWwudm1heD1zaXpldGFiW25ldy0+dHlwZiZOUV07CisgIH0KKyAgKnZhbD10bXAxOworICB2bWVyaz12YWwtPmZsYWdzOworICB0bXAxLmZsYWdzJj1+U0NSQVRDSDsKKyAgYWRkX0lDKG5ldyk7CisgIGlmKGJmbyE9MCl7CisgICAgbmV3PW5ld19JQygpOworICAgIG5ldy0+Y29kZT1MU0hJRlQ7CisgICAgbmV3LT50eXBmPXQ7CisgICAgbmV3LT50eXBmMj1JTlQ7CisgICAgbmV3LT5xMT10bXAxOworICAgIG5ldy0+cTIuZmxhZ3M9S09OU1Q7CisgICAgbmV3LT5xMi52YWwudmludD16bTJ6aShsMnptKChsb25nKWJmbykpOworICAgIGdldF9zY3JhdGNoKCZuZXctPnosdCwwLDApOworICAgIHRtcDM9bmV3LT56OworICAgIGFkZF9JQyhuZXcpOworICB9ZWxzZXsKKyAgICB0bXAzPXRtcDE7CisgIH0KKyAgaWYoIWlzY2xlYXIpeworICAgIG5ldz1uZXdfSUMoKTsKKyAgICBuZXctPmNvZGU9QU5EOworICAgIG5ldy0+dHlwZj10OworICAgIG5ldy0+cTE9KmRlc3Q7CisgICAgbmV3LT5xMS5mbGFncyY9flNDUkFUQ0g7CisgICAgbmV3LT5xMi5mbGFncz1LT05TVDsKKyAgICBndmFsLnZtYXg9em1rb21wbCh6bWxzaGlmdCh6bXN1Yih6bWxzaGlmdChsMnptKDFMKSxsMnptKChpbnQpYmZzKSksbDJ6bSgxTCkpLGwyem0oKGxvbmcpYmZvKSkpOworICAgIGV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKKyAgICBpbnNlcnRfY29uc3QoJm5ldy0+cTIudmFsLHQpOworICAgIGdldF9zY3JhdGNoKCZuZXctPnosdCwwLDApOworICAgIHRtcDI9bmV3LT56OworICAgIGFkZF9JQyhuZXcpOworICB9CisgIG5ldz1uZXdfSUMoKTsKKyAgbmV3LT5jb2RlPU9SOworICBuZXctPnR5cGY9dDsKKyAgaWYoaXNjbGVhcikKKyAgICBuZXctPnExPSpkZXN0OworICBlbHNlCisgICAgbmV3LT5xMT10bXAyOworICBuZXctPnEyPXRtcDM7CisgIG5ldy0+ej0qZGVzdDsKKyAgYWRkX0lDKG5ldyk7CisgIGlmKGRlc3QtPmZsYWdzJihSRUd8U0NSQVRDSCkpIGZyZWVfcmVnKGRlc3QtPnJlZyk7CisgIHZhbC0+ZmxhZ3M9dm1lcms7Cit9CisKK3ZvaWQgaW5saW5lX21lbWNweShucCB6LG5wIHEsem1heCBzaXplKQorLyogIGZ1ZWd0IGVpbiBBU1NJR04tSUMgZWluLCBkYXMgbWVtY3B5KHoscSxzaXplKSBlbnRzcHJpY2h0ICAgICovCit7CisgICAgSUMgKm5ldz1uZXdfSUMoKTsKKyAgICBpZighSVNQT0lOVEVSKHotPm50eXAtPmZsYWdzKSkge2Vycm9yKDM5KTtyZXR1cm47fQorICAgIGlmKCFJU1BPSU5URVIocS0+bnR5cC0+ZmxhZ3MpKSB7ZXJyb3IoMzkpO3JldHVybjt9CisKKyAgICBpZih6LT5mbGFncz09QUREUkVTU3x8ei0+ZmxhZ3M9PUFERFJFU1NBfHx6LT5mbGFncz09QUREUkVTU1MpeworICAgICAgZ2VuX0lDKHosMCwwKTsKKyAgICAgIG5ldy0+ej16LT5sZWZ0LT5vOworICAgICAgaWYoei0+ZmxhZ3MhPUFERFJFU1NTJiZ6LT5sZWZ0LT5mbGFncz09SURFTlRJRklFUiYmaXNfdmxlbmd0aCh6LT5sZWZ0LT5udHlwKSl7CisJLyogdmFyaWFibGUgbGVuZ3RoIGFycmF5ICovCisJbmV3LT56LmZsYWdzfD1EUkVGT0JKOworCW5ldy0+ei5kdHlwPVBPSU5URVJfVFlQRSh6LT5udHlwLT5uZXh0KTsKKyAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgIGdlbl9JQyh6LDAsMCk7CisgICAgICBpZih6LT5vLmZsYWdzJkRSRUZPQkopeworICAgICAgICBJQyAqbjI9bmV3X0lDKCk7CisgICAgICAgIG4yLT5jb2RlPUFTU0lHTjsKKyAgICAgICAgbjItPnR5cGY9cS0+bnR5cC0+ZmxhZ3M7CisgICAgICAgIG4yLT5xMT16LT5vOworICAgICAgICBnZXRfc2NyYXRjaCgmbjItPnosei0+bnR5cC0+ZmxhZ3Msei0+bnR5cC0+bmV4dC0+ZmxhZ3Msei0+bnR5cCk7CisgICAgICAgIG4yLT5xMi5mbGFncz0wOworICAgICAgICBuMi0+cTIudmFsLnZtYXg9c2l6ZXRhYltQT0lOVEVSX1RZUEUoei0+bnR5cC0+bmV4dCldOworICAgICAgICBuZXctPno9bjItPno7CisgICAgICAgIGFkZF9JQyhuMik7CisgICAgICB9ZWxzZXsKKyAgICAgICAgbmV3LT56PXotPm87CisgICAgICB9CisgICAgICBpZihuZXctPnouZmxhZ3MmVkFSQURSKXsKKwluZXctPnouZmxhZ3MmPX5WQVJBRFI7IAorICAgICAgfWVsc2V7CisJbmV3LT56LmZsYWdzfD1EUkVGT0JKOworCW5ldy0+ei5kdHlwPVBPSU5URVJfVFlQRSh6LT5udHlwLT5uZXh0KTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoei0+bnR5cC0+bmV4dC0+ZmxhZ3MmVk9MQVRJTEUpeworICAgICAgaWYobmV3LT56LmZsYWdzJkRSRUZPQkopCisJbmV3LT56LmR0eXB8PVBWT0xBVElMRTsKKyAgICB9CisgICAgaWYocS0+ZmxhZ3M9PUFERFJFU1N8fHEtPmZsYWdzPT1BRERSRVNTQXx8cS0+ZmxhZ3M9PUFERFJFU1NTKXsKKyAgICAgIGdlbl9JQyhxLDAsMCk7CisgICAgICBuZXctPnExPXEtPmxlZnQtPm87CisgICAgICBpZihxLT5mbGFncyE9QUREUkVTU1MmJnEtPmxlZnQtPmZsYWdzPT1JREVOVElGSUVSJiZpc192bGVuZ3RoKHEtPmxlZnQtPm50eXApKXsKKwkvKiB2YXJpYWJsZSBsZW5ndGggYXJyYXkgKi8KKwluZXctPnExLmZsYWdzfD1EUkVGT0JKOworCW5ldy0+cTEuZHR5cD1QT0lOVEVSX1RZUEUocS0+bnR5cC0+bmV4dCk7CisgICAgICB9CisgICAgfWVsc2V7ICAgIAorICAgICAgZ2VuX0lDKHEsMCwwKTsKKyAgICAgIGlmKHEtPm8uZmxhZ3MmRFJFRk9CSil7CisgICAgICAgIElDICpuMj1uZXdfSUMoKTsKKyAgICAgICAgbjItPmNvZGU9QVNTSUdOOworICAgICAgICBuMi0+dHlwZj1xLT5udHlwLT5mbGFnczsKKyAgICAgICAgbjItPnExPXEtPm87CisgICAgICAgIGdldF9zY3JhdGNoKCZuMi0+eixxLT5udHlwLT5mbGFncyxxLT5udHlwLT5uZXh0LT5mbGFncyxxLT5udHlwKTsKKyAgICAgICAgbjItPnEyLmZsYWdzPTA7CisgICAgICAgIG4yLT5xMi52YWwudm1heD1zaXpldGFiW1BPSU5URVJfVFlQRShxLT5udHlwLT5uZXh0KV07CisKKyAgICAgICAgbmV3LT5xMT1uMi0+ejsKKyAgICAgICAgYWRkX0lDKG4yKTsKKyAgICAgIH1lbHNleworICAgICAgICBuZXctPnExPXEtPm87CisgICAgICB9CisgICAgICBpZihuZXctPnExLmZsYWdzJlZBUkFEUil7CisJbmV3LT5xMS5mbGFncyY9flZBUkFEUjsKKyAgICAgIH1lbHNleworCW5ldy0+cTEuZmxhZ3N8PURSRUZPQko7CisJbmV3LT5xMS5kdHlwPVBPSU5URVJfVFlQRShxLT5udHlwLT5uZXh0KTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYocS0+bnR5cC0+bmV4dC0+ZmxhZ3MmVk9MQVRJTEUpeworICAgICAgaWYobmV3LT5xMS5mbGFncyZEUkVGT0JKKQorCW5ldy0+cTEuZHR5cHw9UFZPTEFUSUxFOworICAgIH0KKyAgICBuZXctPmNvZGU9QVNTSUdOOworICAgIG5ldy0+dHlwZj1VTlNJR05FRHxDSEFSOworICAgIG5ldy0+cTIuZmxhZ3M9MDsKKyAgICBuZXctPnEyLnZhbC52bWF4PXNpemU7CisKKyAgICBpZighem1lcXRvKHNpemUsWjApKQorICAgICAgYWRkX0lDKG5ldyk7Cit9CisKK3ZvaWQgYWRkX0lDKElDICpuZXcpCisvKiAgZnVlZ3QgZWluIElDIGVpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgICBpbnQgY29kZTsKKyAgICBpZighbmV3KSByZXR1cm47CisgICAgaWYobm9jb2RlKSB7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgICAvKmZyZWUobmV3KTsqLyAvKiBidWlsZGluZyBhIGxpc3QgdG8gZnJlZSBsYXRlciB3b3VsZCBiZSBuaWNlLi4uICovCisgICAgICByZXR1cm47CisgICAgfQorICAgIG5ldy0+bmV4dD0wOworICAgIG5ldy0+cTEuYW09bmV3LT5xMi5hbT1uZXctPnouYW09MDsKKyAgICBuZXctPmxpbmU9bGluZTsgbmV3LT5maWxlPWZpbGVuYW1lOworICAgIGNvZGU9bmV3LT5jb2RlOworICAgIGlmKGNvZGU+PUJFUSYmY29kZTw9QlJBKSBuZXctPnExLmZsYWdzPW5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CisgICAgaWYoY29kZT09QUxMT0NSRUd8fGNvZGU9PUZSRUVSRUd8fGNvZGU9PVNBVkVSRUdTfHxjb2RlPT1SRVNUT1JFUkVHUykgbmV3LT50eXBmPTA7CisgICAgaWYoREVCVUcmNjQpeyBwcmljKHN0ZG91dCxmaXJzdF9pYyk7cHJpbnRmKCJuZXdcbiIpO3ByaWMyKHN0ZG91dCxuZXcpO3ByaW50ZigiLVxuIik7fQorICAgIGlmKG5ldy0+cTEuZmxhZ3MmVkFSKXsKKyAgICAgICAgaWYoIW5ldy0+cTEudikgCisJICBpZXJyb3IoMCk7CisgICAgICAgIG5ldy0+cTEudi0+ZmxhZ3N8PVVTRURBU1NPVVJDRTsKKyAgICAgICAgaWYoY29kZT09QUREUkVTU3x8KG5ldy0+cTEuZmxhZ3MmVkFSQURSKSkKKwkgIGlmKCFpc192bGVuZ3RoKG5ldy0+cTEudi0+dnR5cCkpCisJICAgIG5ldy0+cTEudi0+ZmxhZ3N8PVVTRURBU0FEUjsKKyAgICAgICAgbmV3LT5xMS52LT5wcmlvcml0eSs9Y3VycmVudHByaTsKKyAgICB9CisgICAgaWYobmV3LT5xMi5mbGFncyZWQVIpeworICAgICAgICBpZighbmV3LT5xMi52KSBpZXJyb3IoMCk7CisgICAgICAgIG5ldy0+cTIudi0+ZmxhZ3N8PVVTRURBU1NPVVJDRTsKKyAgICAgICAgaWYoY29kZT09QUREUkVTU3x8KG5ldy0+cTIuZmxhZ3MmVkFSQURSKSkKKyAgIAkgIGlmKCFpc192bGVuZ3RoKG5ldy0+cTIudi0+dnR5cCkpCisJICAgIG5ldy0+cTIudi0+ZmxhZ3N8PVVTRURBU0FEUjsKKyAgICAgICAgbmV3LT5xMi52LT5wcmlvcml0eSs9Y3VycmVudHByaTsKKyAgICB9CisgICAgaWYobmV3LT56LmZsYWdzJlZBUil7CisgICAgICAgIGlmKCFuZXctPnoudikgaWVycm9yKDApOworICAgICAgICBpZihuZXctPnouZmxhZ3MmRFJFRk9CSikKKwkgIG5ldy0+ei52LT5mbGFnc3w9VVNFREFTU09VUkNFOworCWVsc2UKKwkgIG5ldy0+ei52LT5mbGFnc3w9VVNFREFTREVTVDsKKyAgICAgICAgbmV3LT56LnYtPnByaW9yaXR5Kz1jdXJyZW50cHJpOworICAgIH0KKyAgICBpZihibG9ja192bGFbbmVzdGluZ10peworICAgICAgLyogc3BlY2lhbCBoYW5kbGluZyBmb3IgYmxvY2tzIHdpdGggdmFyaWFibGUtbGVuZ3RoIGFycmF5cyAqLworICAgICAgbGxpc3QgKnA7CisgICAgICBpZihuZXctPmNvZGU9PUxBQkVMKXsKKwlwPW15bWFsbG9jKExTSVpFKTsKKwlwLT5sYWJlbD1uZXctPnR5cGY7CisJcC0+bmV4dD12bGFkZWZsYWJlbHNbbmVzdGluZ107CisJdmxhZGVmbGFiZWxzW25lc3RpbmddPXA7CisgICAgICB9ZWxzZSBpZigwJiZuZXctPmNvZGU9PUJSQSYmIShuZXctPmZsYWdzJkxPT1BfQ09ORF9UUlVFKSl7CisJcD1teW1hbGxvYyhMU0laRSk7CisJcC0+bGFiZWw9bmV3LT50eXBmOworCXAtPm5leHQ9dmxham1wbGFiZWxzW25lc3RpbmddOworCXZsYWptcGxhYmVsc1tuZXN0aW5nXT1wOworCXA9dmxhZGVmbGFiZWxzW25lc3RpbmddOworCXdoaWxlKHApeworCSAgaWYocC0+bGFiZWw9PW5ldy0+dHlwZikKKwkgICAgYnJlYWs7CisJICBwPXAtPm5leHQ7CisJfQorCWlmKCFwKXsgCisJICAvKiBsYWJlbCBub3QgZGVjbGFyZWQgaW4gdGhpcyBibG9jayBzbyBmYXI7CisJICAgICByZS1hZGp1c3Qgc3RhY2ssIGJ1dCBzdG9yZSB0aGUgcG9zaXRpb24gLSBsYWJlbCBtYXkgYmUKKwkgICAgIGRlY2xhcmVkIGxhdGVyIGluIHRoZSBzYW1lIGJsb2NrIGFuZCBhZGp1c3RlbWVudCBtdXN0IGJlCisJICAgICByZW1vdmVkICovCisJICB2bGFhZGp1c3RfbGlzdCAqdmw7CisJICBJQyAqZmlyc3Q7CisJICBmaXJzdD1sYXN0X2ljOworCSAgZnJlZXZsKCk7CisJICBmaXJzdD1maXJzdC0+bmV4dDsKKwkgIHZsPW15bWFsbG9jKHNpemVvZigqdmwpKTsKKwkgIHZsLT5icmFuY2g9bmV3OworCSAgdmwtPmZpcnN0PWZpcnN0OworCSAgdmwtPm5leHQ9dmxhYWRqdXN0c1tuZXN0aW5nXTsKKwkgIHZsYWFkanVzdHNbbmVzdGluZ109dmw7CisJfQorICAgICAgfQorICAgIH0KKyAgICBpZigvKihjX2ZsYWdzX3ZhbFswXS5sJjIpJiYqL2NvZGU9PUxBQkVMKXsKKyAgICAvKiAgZW50ZmVybnQgU3BydWVuZ2UgenUgZGlyZWt0IGZvbGdlbmRlbiBMYWJlbHMgICAgKi8KKyAgICAgICAgSUMgKnA9bGFzdF9pYzsKKyAgICAgICAgd2hpbGUocCl7CisgICAgICAgICAgICBpZihwLT50eXBmPT1uZXctPnR5cGYmJnAtPmNvZGU+PUJFUSYmcC0+Y29kZTw9QlJBKXsKKyAgICAgICAgICAgICAgICBJQyAqbjsKKwkJaWYocC0+Y29kZSE9QlJBKXsKKwkJICBJQyAqY21wPXAtPnByZXY7CisJCSAgd2hpbGUoY21wJiZjbXAtPmNvZGU9PUZSRUVSRUcpIGNtcD1jbXAtPnByZXY7CisJCSAgaWYoY21wLT5jb2RlPT1URVNUKXsKKwkJICAgIGlmKGlzX3ZvbGF0aWxlX29iaigmY21wLT5xMSkpCisJCSAgICAgIGJyZWFrOworCQkgICAgZWxzZXsKKwkJICAgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJwcmVjZWRpbmcgdGVzdCByZW1vdmVkXG4iKTsKKwkJICAgICAgcmVtb3ZlX0lDKGNtcCk7CisJCSAgICB9CisJCSAgfWVsc2UgaWYoY21wLT5jb2RlPT1DT01QQVJFKXsKKwkJICAgIGlmKGlzX3ZvbGF0aWxlX29iaigmY21wLT5xMSl8fGlzX3ZvbGF0aWxlX29iaigmY21wLT5xMikpCisJCSAgICAgIGJyZWFrOworCQkgICAgZWxzZXsKKwkJICAgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJwcmVjZWRpbmcgY29tcGFyZSByZW1vdmVkXG4iKTsKKwkJICAgICAgcmVtb3ZlX0lDKGNtcCk7CisJCSAgICB9CisJCSAgfWVsc2UKKwkJICAgIGJyZWFrOworCQl9CisJCWlmKHZsYWFkanVzdHNbbmVzdGluZ10peworCQkgIC8qIHJlbW92ZSBpdCBmcm9tIHZsYWFkanVzdHMtbGlzdHMsIGlmIG5lY2Vzc2FyeSAqLworCQkgIHZsYWFkanVzdF9saXN0ICp2bD12bGFhZGp1c3RzW25lc3RpbmddOworCQkgIHdoaWxlKHZsKXsKKwkJICAgIGlmKHZsLT5icmFuY2g9PXApeworCQkgICAgICBJQyAqbnA9dmwtPmJyYW5jaC0+cHJldjsKKwkJICAgICAgd2hpbGUobnAhPXZsLT5maXJzdC0+cHJldil7CisJCQlpZighbnApIGllcnJvcigwKTsKKwkJCW5wLT5jb2RlPU5PUDsKKwkJCW5wLT5xMS5mbGFncz1ucC0+cTIuZmxhZ3M9bnAtPnouZmxhZ3M9MDsKKwkJCW5wPW5wLT5wcmV2OworCQkgICAgICB9CisJCSAgICAgIHZsLT5icmFuY2g9MDsKKwkJICAgIH0KKwkJICAgIHZsPXZsLT5uZXh0OworCQkgIH0KKwkJfQorICAgICAgICAgICAgICAgIGlmKERFQlVHJjEpIHByaW50ZigiJXMgbCVkIGRlbGV0ZWRcbiIsZW5hbWVbcC0+Y29kZV0scC0+dHlwZik7CisgICAgICAgICAgICAgICAgbj1wLT5uZXh0OworICAgICAgICAgICAgICAgIHJlbW92ZV9JQyhwKTsKKyAgICAgICAgICAgICAgICBwPW47CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBpZihwLT5jb2RlIT1MQUJFTCkgYnJlYWs7CisgICAgICAgICAgICAgICAgcD1wLT5wcmV2OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmKGxhc3RfaWMpeworICAgICAgICBpZihjb2RlPT1BU1NJR04peworICAgICAgICAgICAgaWYoKGxhc3RfaWMtPnouZmxhZ3MmKFJFR3xTQ1JBVENIfERSRUZPQkopKT09KFJFR3xTQ1JBVENIKSYmKG5ldy0+cTEuZmxhZ3M9PWxhc3RfaWMtPnouZmxhZ3MpJiZsYXN0X2ljLT56LnJlZz09bmV3LT5xMS5yZWcvKiYmbGFzdF9pYy0+Y29kZSE9Q0FMTCovKXsKKyAgICAgICAgICAgICAgICBpZihVU0VRMkFTWnx8IShsYXN0X2ljLT5xMi5mbGFncyZSRUcpfHwhKG5ldy0+ei5mbGFncyZSRUcpfHxsYXN0X2ljLT5xMi5yZWchPW5ldy0+ei5yZWcpeworICAgICAgICAgICAgICAgICAgICBpZihVU0VRMkFTWnx8IShsYXN0X2ljLT5xMi5mbGFncyZWQVIpfHwhKG5ldy0+ei5mbGFncyZWQVIpfHxsYXN0X2ljLT5xMi52IT1uZXctPnoudil7CisgICAgICAgICAgICAgICAgICAgIC8qICB2ZXJiaW5kZXQgb3AgYSxiLT5yZWcsbW92ZSByZWctPmMgenUgb3AgYSxiLT5jICAqLworICAgICAgICAgICAgICAgICAgICAvKiAgaGllciBmZWhsdCBhYmVyIG5vY2ggUmVnaXN0ZXJmcmVpZ2FiZSAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfaWMtPno9bmV3LT56OworICAgICAgICAgICAgICAgICAgICAgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJtb3ZlIGFuZCBvcCBjb21iaW5lZFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZigobmV3LT5xMS5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSYmKG5ldy0+cTEucmVnIT1uZXctPnoucmVnfHwhKG5ldy0+ei5mbGFncyZSRUcpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX3JlZyhuZXctPnExLnJlZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG5ldyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZigobGFzdF9pYy0+ei5mbGFncyYoVkFSfFNDUkFUQ0h8RFJFRk9CSikpPT0oVkFSfFNDUkFUQ0gpJiYobmV3LT5xMS5mbGFncz09bGFzdF9pYy0+ei5mbGFncykmJmxhc3RfaWMtPnoudj09bmV3LT5xMS52LyomJmxhc3RfaWMtPmNvZGUhPUNBTEwqLyl7CisgICAgICAgICAgICAgICAgaWYoVVNFUTJBU1p8fCEobGFzdF9pYy0+cTIuZmxhZ3MmUkVHKXx8IShuZXctPnouZmxhZ3MmUkVHKXx8bGFzdF9pYy0+cTIucmVnIT1uZXctPnoucmVnKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoVVNFUTJBU1p8fCEobGFzdF9pYy0+cTIuZmxhZ3MmVkFSKXx8IShuZXctPnouZmxhZ3MmVkFSKXx8bGFzdF9pYy0+cTIudiE9bmV3LT56LnYpeworICAgICAgICAgICAgICAgICAgICAvKiAgdmVyYmluZGV0IG9wIGEsYi0+c2NyYXRjaCxtb3ZlIHNjcmF0Y2gtPmMgenUgb3AgYSxiLT5jICAqLworICAgICAgICAgICAgICAgICAgICAvKiAgaGllciBmZWhsdCBhYmVyIG5vY2ggUmVnaXN0ZXJmcmVpZ2FiZSAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfaWMtPno9bmV3LT56OworICAgICAgICAgICAgICAgICAgICAgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJtb3ZlIGFuZCBvcCBjb21iaW5lZCgyKVxuIik7CisvKiAgICAgICAgICAgICAgICAgICAgICAgIGlmKChuZXctPnExLmZsYWdzJihTQ1JBVENIfFJFRykpPT0oU0NSQVRDSHxSRUcpJiYobmV3LT5xMS5yZWchPW5ldy0+ei5yZWd8fCEobmV3LT56LmZsYWdzJlJFRykpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcmVnKG5ldy0+cTEucmVnKTsqLworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShuZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgaWYobGFzdF9pYy0+Y29kZT09QlJBKXsKKyAgICAgICAgICAgIGlmKCFkb250ZGVsZXRlJiZjb2RlIT1MQUJFTCYmY29kZSE9QUxMT0NSRUcmJmNvZGUhPUZSRUVSRUcpeworICAgICAgICAgICAgLyogIGxvZXNjaHQgYWxsZXMgbmFjaCBicmEgYmlzIGVpbiBMYWJlbCBrb21tdCAgKi8KKyAgICAgICAgICAgIC8qICBtb21lbnRhbiBub2NoIG5pY2h0IHBlcmZla3QsIGRhIGVzIGJlaSBhbGxvYy9mcmVlcmVnIHN0b3BwdCAqLworICAgICAgICAgICAgICAgIGZyZWUobmV3KTsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICBpZihERUJVRyYxKSBwcmludGYoIlVucmVhY2hhYmxlIFN0YXRlbWVudCBkZWxldGVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihsYXN0X2ljLT5wcmV2JiZjb2RlPT1MQUJFTCl7CisgICAgICAgICAgICAvKiAgZXJzZXR6dCBiY2MgbDE7YnJhIGwyO2wxIGR1cmNoIGIhY2MgbDIgICAgICAqLworICAgICAgICAgICAgICAgIGlmKGxhc3RfaWMtPnByZXYtPmNvZGU+PUJFUSYmbGFzdF9pYy0+cHJldi0+Y29kZTw9QkdUJiZuZXctPnR5cGY9PWxhc3RfaWMtPnByZXYtPnR5cGYpeworCQkgIGlmKGxhc3RfaWMtPm5leHQpIHByaWMyKHN0ZG91dCxsYXN0X2ljLT5uZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYoREVCVUcmMSkgcHJpbnRmKCIlcyBsJWQ7JXMgbCVkOyBzdWJzdGl0dXRlZFxuIixlbmFtZVtsYXN0X2ljLT5wcmV2LT5jb2RlXSxsYXN0X2ljLT5wcmV2LT50eXBmLGVuYW1lW2xhc3RfaWMtPmNvZGVdLGxhc3RfaWMtPnR5cGYpOworICAgICAgICAgICAgICAgICAgICBpZihsYXN0X2ljLT5wcmV2LT5jb2RlJjEpIAorCQkgICAgICBsYXN0X2ljLT5wcmV2LT5jb2RlLS07CisJCSAgICBlbHNlCisJCSAgICAgIGxhc3RfaWMtPnByZXYtPmNvZGUrKzsKKyAgICAgICAgICAgICAgICAgICAgbGFzdF9pYy0+cHJldi0+dHlwZj1sYXN0X2ljLT50eXBmOworICAgICAgICAgICAgICAgICAgICBsYXN0X2ljPWxhc3RfaWMtPnByZXY7CisJCSAgICBmcmVlKGxhc3RfaWMtPm5leHQpOworICAgICAgICAgICAgICAgICAgICBsYXN0X2ljLT5uZXh0PW5ldztuZXctPnByZXY9bGFzdF9pYzsKKyAgICAgICAgICAgICAgICAgICAgbGFzdF9pYz1uZXc7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKy8qICAgICAgICB9Ki8KKyAgICAgICAgbmV3LT5wcmV2PWxhc3RfaWM7CisgICAgICAgIGxhc3RfaWMtPm5leHQ9bmV3OworICAgICAgICBsYXN0X2ljPW5ldzsKKyAgICB9ZWxzZXsKKyAgICAgICAgbGFzdF9pYz1uZXc7Zmlyc3RfaWM9bmV3O25ldy0+cHJldj0wOworICAgIH0KKyAgICBpY19jb3VudCsrOworCisjaWYgSEFWRV9QT0YyT1BUCisgICAgaWYoKChuZXctPmNvZGU9PU1VTFQpfHwoKG5ldy0+Y29kZT09RElWfHxuZXctPmNvZGU9PU1PRCkmJihuZXctPnR5cGYmVU5TSUdORUQpKSkmJihuZXctPnEyLmZsYWdzJktPTlNUKSYmSVNJTlQobmV3LT50eXBmKSl7CisgICAgICAvKiAgZXJzZXR6dCBtdWwgZXRjLiBtaXQgWndlaWVycG90ZW56ZW4gICAgICovCisgICAgICBsb25nIGxuOworICAgICAgZXZhbF9jb25zdCgmbmV3LT5xMi52YWwsbmV3LT50eXBmKTsKKyAgICAgIGlmKHptbGVxKGwyem0oMEwpLHZtYXgpJiZ6dW1sZXEodWwyenVtKDBVTCksdnVtYXgpKXsKKwlpZihsbj1nZXRfcG9mMih2dW1heCkpeworCSAgaWYobmV3LT5jb2RlPT1NT0QpeworCSAgICB2bWF4PXptc3ViKHZtYXgsbDJ6bSgxTCkpOworCSAgICBuZXctPmNvZGU9QU5EOworCSAgfWVsc2V7CisJICAgIGlmKG5ldy0+Y29kZT09RElWKSBuZXctPmNvZGU9UlNISUZUOyBlbHNlIG5ldy0+Y29kZT1MU0hJRlQ7CisJICAgIHZtYXg9bDJ6bShsbi0xKTsKKwkgIH0KKwkgIGd2YWwudm1heD12bWF4OworCSAgZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworCSAgaW5zZXJ0X2NvbnN0KCZuZXctPnEyLnZhbCxuZXctPnR5cGYpOworCSAgbmV3LT50eXBmMj1uZXctPnR5cGY7CisJfQorICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgLyogIE1lcmtlbiwgb24gRmxpZXNza29tbWEgYmVudXR6dCB3dXJkZSAgICAqLworICAgIGlmKGNvZGUhPUxBQkVMJiYoY29kZTxCRVF8fGNvZGU+QlJBKSl7CisgICAgICAgIGlmKElTRkxPQVQobmV3LT50eXBmKSkgZmxvYXRfdXNlZD0xOworICAgICAgICBpZihjb2RlPT1DT05WRVJUJiZJU0ZMT0FUKG5ldy0+dHlwZjIpKSBmbG9hdF91c2VkPTE7CisgICAgfQorICAgIGlmKChuZXctPnExLmZsYWdzJihTQ1JBVENIfFJFRykpPT0oU0NSQVRDSHxSRUcpJiYoIShuZXctPnouZmxhZ3MmUkVHKXx8bmV3LT5xMS5yZWchPW5ldy0+ei5yZWcpKQorICAgICAgICBmcmVlX3JlZyhuZXctPnExLnJlZyk7CisgICAgaWYoKG5ldy0+cTIuZmxhZ3MmKFNDUkFUQ0h8UkVHKSk9PShTQ1JBVENIfFJFRykmJighKG5ldy0+ei5mbGFncyZSRUcpfHxuZXctPnEyLnJlZyE9bmV3LT56LnJlZykpCisgICAgICAgIGZyZWVfcmVnKG5ldy0+cTIucmVnKTsKK30KKworbnAgZ2VuX2xpYmNhbGwoY2hhciAqZm5hbWUsbnAgYXJnMSx0eXBlICp0MSxucCBhcmcyLHR5cGUgKnQyKQorLyogZ2VuZXJhdGUgY2FsbCB0byBhIGxpYnJhcnkgZnVuY3Rpb24gKGVtdWxhdGUgb3BlcmF0aW9uKSAqLworeworICBucCBuZXc7IAorICBhcmd1bWVudF9saXN0ICphbD0wLCp0OworICBuZXc9bmV3X25vZGUoKTsKKyAgbmV3LT5mbGFncz1DQUxMOworICBuZXctPnJpZ2h0PTA7CisgIG5ldy0+bGVmdD1uZXdfbm9kZSgpOworICBuZXctPmxlZnQtPmZsYWdzPUlERU5USUZJRVI7CisgIG5ldy0+bGVmdC0+bGVmdD1uZXctPmxlZnQtPnJpZ2h0PTA7CisgIG5ldy0+bGVmdC0+aWRlbnRpZmllcj1hZGRfaWRlbnRpZmllcihmbmFtZSxzdHJsZW4oZm5hbWUpKTsKKyAgbmV3LT5sZWZ0LT5udHlwPTA7CisgIG5ldy0+bGVmdC0+c2lkZWZ4PTA7CisgIG5ldy0+bGVmdC0+dmFsLnZtYXg9bDJ6bSgwTCk7IAorICBuZXctPmFsaXN0PTA7CisgIGlmKGFyZzEpeworICAgIGFsPW15bWFsbG9jKHNpemVvZigqYWwpKTsKKyAgICBpZihwb3N0b3Bfb2JqKXsKKyAgICAgIGFsLT5hcmc9bmV3X25vZGUoKTsKKyAgICAgIGFsLT5hcmctPm89KnBvc3RvcF9vYmo7CisgICAgICBhbC0+YXJnLT5udHlwPW5ld190eXAoKTsKKyAgICAgIGFsLT5hcmctPm50eXAtPmZsYWdzPXBvc3RvcF90eXBlOworICAgICAgYWwtPmFyZy0+ZmxhZ3M9UkVJTlRFUlBSRVQ7CisgICAgfWVsc2UKKyAgICAgIGFsLT5hcmc9YXJnMTsKKyAgICBhbC0+bmV4dD0wOworICAgIGlmKHQxKXsKKyAgICAgIG5wIGNudj1uZXdfbm9kZSgpOworICAgICAgY252LT5mbGFncz1DQVNUOworICAgICAgY252LT5sZWZ0PWFyZzE7CisgICAgICBjbnYtPnJpZ2h0PTA7CisgICAgICBjbnYtPm50eXA9dDE7CisgICAgICBhbC0+YXJnPWNudjsKKyAgICB9CisgIH0KKyAgaWYoYXJnMil7CisgICAgdD1teW1hbGxvYyhzaXplb2YoKnQpKTsKKyAgICB0LT5hcmc9YXJnMjsKKyAgICB0LT5uZXh0PTA7CisgICAgYWwtPm5leHQ9dDsKKyAgICBpZih0Mil7CisgICAgICBucCBjbnY9bmV3X25vZGUoKTsKKyAgICAgIGNudi0+ZmxhZ3M9Q0FTVDsKKyAgICAgIGNudi0+bGVmdD1hcmcyOworICAgICAgY252LT5yaWdodD0wOworICAgICAgY252LT5udHlwPXQyOworICAgICAgdC0+YXJnPWNudjsKKyAgICB9CisgIH0KKyAgbmV3LT5hbGlzdD1hbDsKKyAgLyogS2FubiBtYW4gdHlwZV9leHByIG5vY2htYWwgYXVmIGRpZSBBcmd1bWVudGUgYW53ZW5kZW4/ICovCisgIGlmKHQxfHx0MikKKyAgICBub19jYXN0X2ZyZWU9MTsKKyAgaWYoIXR5cGVfZXhwcmVzc2lvbihuZXcsMCkpCisgICAgaWVycm9yKDApOyAKKyAgbm9fY2FzdF9mcmVlPTA7CisgIGdlbl9JQyhuZXcsMCwwKTsKKyAgcmV0dXJuIG5ldzsKK30KKworCit2b2lkIGdlbl9JQyhucCBwLGludCBsdHJ1ZSxpbnQgbGZhbHNlKQorLyogIEVyemV1Z3QgZWluZSBJQy1MaXN0ZSBhdXMgZWluZXIgZXhwcmVzc2lvbiAgICAgICovCit7CisgICAgSUMgKm5ldzsgcmVnYXJnc19saXN0ICpybDsKKyAgICBpZighcCkgcmV0dXJuOworCisgICAgaWYocC0+ZmxhZ3M9PVNUUklORyl7CisgICAgICAgIFZhciAqdj0wOworCWlmKG1lcmdlX3N0cmluZ3MpeworCSAgZm9yKHY9Zmlyc3RfdmFyWzBdO3Y7dj12LT5uZXh0KXsKKwkgICAgaWYodi0+dnR5cC0+ZmxhZ3M9PUFSUkFZJiYodi0+dnR5cC0+bmV4dC0+ZmxhZ3MmU1RSSU5HQ09OU1QpJiZ6bWxlcShwLT5udHlwLT5zaXplLHYtPnZ0eXAtPnNpemUpKXsKKwkgICAgICB6bWF4IGk7Y29uc3RfbGlzdCAqY2wxPXAtPmNsLCpjbDI9di0+Y2xpc3Q7CisJICAgICAgZm9yKGk9WjA7IXptbGVxKHAtPm50eXAtPnNpemUsaSkmJmNsMSYmY2wyO2NsMT1jbDEtPm5leHQsY2wyPWNsMi0+bmV4dCxpPXptYWRkKGksWjEpKXsKKwkJaWYoIXp1bWVxdG8oenVjMnp1bShjbDEtPm90aGVyLT52YWwudnVjaGFyKSx6dWMyenVtKGNsMi0+b3RoZXItPnZhbC52dWNoYXIpKSkKKwkJICBicmVhazsKKwkgICAgICB9CisJICAgICAgaWYoem1sZXEocC0+bnR5cC0+c2l6ZSxpKSkgYnJlYWs7CisJICAgIH0KKwkgIH0KKwl9CisJaWYoIXYpeworCSAgcC0+by52PWFkZF92YXIoZW1wdHksY2xvbmVfdHlwKHAtPm50eXApLFNUQVRJQyxwLT5jbCk7CisJICBwLT5vLnYtPmZsYWdzfD1ERUZJTkVEOworCX1lbHNlCisJICBwLT5vLnY9djsKKyAgICAgICAgcC0+by5mbGFncz1WQVI7CisgICAgICAgIHAtPm8ucmVnPTA7CisgICAgICAgIHAtPm8udmFsPXAtPnZhbDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZihwLT5mbGFncz09TElURVJBTCl7CisgICAgICBpbnQgc2M7CisgICAgICBpZihuZXN0aW5nPT0wfHwoaXNfY29uc3QocC0+bnR5cCkmJnptZXF0byhwLT52YWwudm1heCxsMnptKDBMKSkpKQorCXNjPVNUQVRJQzsKKyAgICAgIGVsc2UKKwlzYz1BVVRPOworICAgICAgcC0+by52PWFkZF92YXIoZW1wdHksY2xvbmVfdHlwKHAtPm50eXApLHNjLHAtPmNsKTsKKyAgICAgIHAtPm8udi0+ZmxhZ3N8PURFRklORUQ7CisgICAgICBwLT5vLmZsYWdzPVZBUjsKKyAgICAgIHAtPm8ucmVnPTA7CisgICAgICBwLT5vLnZhbC52bWF4PWwyem0oMEwpOworICAgICAgaWYoc2M9PUFVVE8pCisJaW5pdF9sb2NhbF9jb21wb3VuZChwLT5vLnYpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZihwLT5mbGFncz09SURFTlRJRklFUil7CisvKiAgICAgICAgcC0+by52PWZpbmRfdmFyKHAtPmlkZW50aWZpZXIsMCk7Ki8KKyAgICAgICAgcC0+by5mbGFncz1WQVI7CisgICAgICAgIHAtPm8ucmVnPTA7CisgICAgICAgIHAtPm8udmFsPXAtPnZhbDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZihwLT5mbGFncz09Q0VYUFJ8fHAtPmZsYWdzPT1QQ0VYUFIpeworICAgICAgICBpZihwLT5sZWZ0KXsKKyAgICAgICAgICAgIGlmKHAtPmxlZnQtPmZsYWdzPT1QT1NUSU5DKSBwLT5sZWZ0LT5mbGFncz1QUkVJTkM7CisgICAgICAgICAgICBpZihwLT5sZWZ0LT5mbGFncz09UE9TVERFQykgcC0+bGVmdC0+ZmxhZ3M9UFJFREVDOworICAgICAgICAgICAgZ2VuX0lDKHAtPmxlZnQsMCwwKTsKKyAgICAgICAgICAgIGlmKChwLT5sZWZ0LT5vLmZsYWdzJihTQ1JBVENIfFJFRykpPT0oU0NSQVRDSHxSRUcpKSBmcmVlX3JlZyhwLT5sZWZ0LT5vLnJlZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYocC0+cmlnaHQpeworICAgICAgICAgICAgaWYocC0+cmlnaHQtPmZsYWdzPT1QT1NUSU5DKSBwLT5yaWdodC0+ZmxhZ3M9UFJFSU5DOworICAgICAgICAgICAgaWYocC0+cmlnaHQtPmZsYWdzPT1QT1NUREVDKSBwLT5yaWdodC0+ZmxhZ3M9UFJFREVDOworICAgICAgICAgICAgZ2VuX0lDKHAtPnJpZ2h0LDAsMCk7CisgICAgICAgICAgICBpZigocC0+cmlnaHQtPm8uZmxhZ3MmKFNDUkFUQ0h8UkVHKSk9PShTQ1JBVENIfFJFRykpIGZyZWVfcmVnKHAtPnJpZ2h0LT5vLnJlZyk7CisgICAgICAgIH0KKyAgICAgICAgcC0+by5mbGFncz1LT05TVDsKKyAgICAgICAgcC0+by52YWw9cC0+dmFsOworICAgICAgICBwLT5vLnJlZz0wOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHAtPmZsYWdzPT1LT01NQSl7CisgICAgICAgIGlmKHAtPmxlZnQtPnNpZGVmeCl7CisgICAgICAgICAgICBnZW5fSUMocC0+bGVmdCwwLDApOworICAgICAgICAgICAgaWYoKHAtPmxlZnQtPm8uZmxhZ3MmKFNDUkFUQ0h8UkVHKSk9PShTQ1JBVENIfFJFRykpIGZyZWVfcmVnKHAtPmxlZnQtPm8ucmVnKTsKKyAgICAgICAgfWVsc2UgaWYoIShwLT5sZWZ0LT5udHlwLT5mbGFncyZWT0xBVElMRSkpIAorCSAgZXJyb3IoMTI5KTsKKyAgICAgICAgZ2VuX0lDKHAtPnJpZ2h0LDAsMCk7CisgICAgICAgIHAtPm89cC0+cmlnaHQtPm87CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYocC0+ZmxhZ3M9PVJFSU5URVJQUkVUKXsKKyAgICAgIGlmKHAtPmxlZnQpeworCWdlbl9JQyhwLT5sZWZ0LDAsMCk7CisJcC0+bz1wLT5sZWZ0LT5vOworICAgICAgfQorICAgICAgLyogaWYgbm8gbGVmdCwgZG8gbm90aGluZywgdXNlIGp1c3Qgb2JqZWN0ICovCisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHAtPmZsYWdzPT1DQVNUKXsKKyAgICAgIGdlbl9JQyhwLT5sZWZ0LDAsMCk7CisgICAgICBpZigocC0+bnR5cC0+ZmxhZ3MmTlEpPT1WT0lEKXsKKwlpZigocC0+bGVmdC0+by5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSkgZnJlZV9yZWcocC0+bGVmdC0+by5yZWcpOworCXAtPm8uZmxhZ3M9MDsKKyAgICAgIH1lbHNleworCWlmKElTUE9JTlRFUihwLT5udHlwLT5mbGFncykmJihwLT5udHlwLT5uZXh0LT5mbGFncyZWT0xBVElMRSkpCisJICB2b2xhdGlsZV9jb252ZXJ0PTE7CisJY29udmVydChwLT5sZWZ0LHAtPm50eXAtPmZsYWdzKTsKKwlpZih2b2xhdGlsZV9jb252ZXJ0KXsKKwkgIGlmKChwLT5sZWZ0LT5vLmZsYWdzJlZBUikmJnAtPmxlZnQtPm8udi0+dnR5cC0+bmV4dCkKKwkgICAgcC0+bGVmdC0+by52LT52dHlwLT5uZXh0LT5mbGFnc3w9Vk9MQVRJTEU7CisJICB2b2xhdGlsZV9jb252ZXJ0PTA7CisJfQorCXAtPm89cC0+bGVmdC0+bzsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYocC0+ZmxhZ3M9PUZJUlNURUxFTUVOVCl7CisgICAgICAgIGdlbl9JQyhwLT5sZWZ0LDAsMCk7CisgICAgICAgIHAtPm89cC0+bGVmdC0+bzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIEhBVkVfUE9GMk9QVAorICAgIGlmKCgocC0+ZmxhZ3M9PU1VTFR8fHAtPmZsYWdzPT1QTVVMVCl8fCgocC0+ZmxhZ3M9PURJVnx8cC0+ZmxhZ3M9PU1PRCkmJihwLT5udHlwLT5mbGFncyZVTlNJR05FRCkpKSYmKHAtPnJpZ2h0LT5mbGFncz09Q0VYUFJ8fHAtPnJpZ2h0LT5mbGFncz09UENFWFBSKSYmSVNJTlQocC0+bnR5cC0+ZmxhZ3MpKXsKKyAgICAgIC8qICBlcnNldHp0IG11bCBldGMuIG1pdCBad2VpZXJwb3RlbnplbiAgICAgKi8KKyAgICAgIGxvbmcgbG47CisgICAgICBldmFsX2NvbnN0bihwLT5yaWdodCk7CisgICAgICBpZih6bWxlcShsMnptKDBMKSx2bWF4KSYmenVtbGVxKHVsMnp1bSgwVUwpLHZ1bWF4KSl7CisJaWYobG49Z2V0X3BvZjIodnVtYXgpKXsKKwkgIGlmKHAtPmZsYWdzPT1NT0QpeworCSAgICB2bWF4PXptc3ViKHZtYXgsbDJ6bSgxTCkpOworCSAgICBwLT5mbGFncz1BTkQ7CisJICB9ZWxzZXsKKwkgICAgaWYocC0+ZmxhZ3M9PURJVikgcC0+ZmxhZ3M9UlNISUZUOyBlbHNlIHAtPmZsYWdzPUxTSElGVDsKKwkgICAgdm1heD1sMnptKGxuLTEpOworCSAgfQorCSAgZ3ZhbC52bWF4PXZtYXg7CisJICBldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CisJICBpbnNlcnRfY29uc3RuKHAtPnJpZ2h0KTsKKwl9CisgICAgICB9CisgICAgfQorI2VuZGlmCisKKyNpZiBIQVZFX0xJQkNBTExTCisgICAgaWYoIShvcHRmbGFncyYyKSl7CisgICAgICBjaGFyICpsaWJuYW1lOworICAgICAgaWYobGlibmFtZT11c2VfbGliY2FsbF93cmFwKHAtPmZsYWdzLHAtPm50eXAtPmZsYWdzLDApKXsKKwlucCBsYzt0eXBlICp0MSwqdDI7CisJaWYocC0+ZmxhZ3M9PUxTSElGVHx8cC0+ZmxhZ3M9PVJTSElGVCl7CisJICB0MT1jbG9uZV90eXAocC0+bnR5cCk7CisJICB0Mj1uZXdfdHlwKCk7CisJICB0Mi0+ZmxhZ3M9SU5UOworCX1lbHNleworCSAgaWYocC0+cmlnaHQpeworCSAgICB0MT1hcml0aF90eXAocC0+bGVmdC0+bnR5cCxwLT5yaWdodC0+bnR5cCk7CisJICAgIHQyPWNsb25lX3R5cCh0MSk7CisJICB9ZWxzZXsKKwkgICAgdDE9YXJpdGhfdHlwKHAtPmxlZnQtPm50eXAscC0+bGVmdC0+bnR5cCk7CisJICAgIHQyPTA7CisJICB9CisJfQorCWxjPWdlbl9saWJjYWxsKGxpYm5hbWUscC0+bGVmdCx0MSxwLT5yaWdodCx0Mik7CisJKnA9KmxjOworCWZyZWUobGMpOworCXJldHVybjsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICBuZXc9bmV3X0lDKCk7CisgICAgbmV3LT50eXBmPXAtPm50eXAtPmZsYWdzOworICAgIG5ldy0+cTEucmVnPW5ldy0+cTIucmVnPW5ldy0+ei5yZWc9MDsKKyAgICBuZXctPnExLmZsYWdzPW5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CisgICAgaWYoKHAtPmZsYWdzPj1MU0hJRlQmJnAtPmZsYWdzPD1NT0QpfHwocC0+ZmxhZ3M+PU9SJiZwLT5mbGFnczw9QU5EKXx8cC0+ZmxhZ3M9PVBNVUxUKXsKKyAgICAgIGRvX2FyaXRoKHAsbmV3LDAsMCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHAtPmZsYWdzPT1DT05URU5UKXsKKyAgICAgICAgZ2VuX0lDKHAtPmxlZnQsMCwwKTsKKyAgICAgICAgaWYocC0+bGVmdC0+by5mbGFncyZWQVJBRFIpeworICAgICAgICAgICAgZnJlZShuZXcpOworICAgICAgICAgICAgcC0+bz1wLT5sZWZ0LT5vOworICAgICAgICAgICAgcC0+by5mbGFncyY9flZBUkFEUjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZighKHAtPmxlZnQtPm8uZmxhZ3MmRFJFRk9CSikpeworICAgICAgICAgICAgZnJlZShuZXcpOworICAgICAgICAgICAgcC0+bz1wLT5sZWZ0LT5vOworICAgICAgICAgICAgcC0+by5mbGFnc3w9RFJFRk9CSjsKKwkgICAgcC0+by5kdHlwPXAtPmxlZnQtPm50eXAtPmZsYWdzOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICBpZigocC0+bGVmdC0+by5mbGFncyZTQ1JBVENIKSYmcC0+bGVmdC0+by5kdHlwPT1QT0lOVEVSX1RZUEUocC0+bnR5cCkpeworICAgICAgICAgICAgbmV3LT56PXAtPmxlZnQtPm87CisgICAgICAgICAgICBuZXctPnouZmxhZ3MmPX5EUkVGT0JKOworICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgZ2V0X3NjcmF0Y2goJm5ldy0+eixwLT5sZWZ0LT5udHlwLT5mbGFncyxwLT5udHlwLT5mbGFncyxwLT5sZWZ0LT5udHlwKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbmV3LT5jb2RlPUFTU0lHTjtuZXctPnR5cGY9UE9JTlRFUl9UWVBFKHAtPm50eXApOworICAgICAgICAgIG5ldy0+cTE9cC0+bGVmdC0+bzsKKyAgICAgICAgICBuZXctPnEyLnZhbC52bWF4PXNpemV0YWJbbmV3LT50eXBmJk5RXTsKKyAgICAgICAgICBwLT5vPW5ldy0+ejsKKyAgICAgICAgICBhZGRfSUMobmV3KTsKKyAgICAgICAgICBwLT5vLmZsYWdzfD1EUkVGT0JKOworCSAgcC0+by5kdHlwPVBPSU5URVJfVFlQRShwLT5udHlwKTsKKyAgICAgICAgfQorCWlmKHAtPmxlZnQtPm50eXAtPm5leHQtPmZsYWdzJlZPTEFUSUxFKSBwLT5vLmR0eXB8PVBWT0xBVElMRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZihwLT5mbGFncz09QVNTSUdOKXsKKyAgICAgIGlmKHAtPmxlZnQtPmZsYWdzPT1CSVRGSUVMRCl7CisgICAgICAgIGdlbl9JQyhwLT5yaWdodCwwLDApOworICAgICAgICBnZW5fSUMocC0+bGVmdC0+bGVmdCwwLDApOworICAgICAgICBjb252ZXJ0KHAtPnJpZ2h0LHAtPm50eXAtPmZsYWdzKTsKKyAgICAgICAgaW5zZXJ0X2JpdGZpZWxkKCZwLT5sZWZ0LT5sZWZ0LT5vLCZwLT5yaWdodC0+bywmcC0+byxwLT5sZWZ0LT5iZnMscC0+bGVmdC0+YmZvLHAtPm50eXAtPmZsYWdzJk5VLDApOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBuZXctPmNvZGU9QVNTSUdOOworICAgICAgZ2VuX0lDKHAtPnJpZ2h0LDAsMCk7CisgICAgICBnZW5fSUMocC0+bGVmdCwwLDApOworICAgICAgY29udmVydChwLT5yaWdodCxwLT5udHlwLT5mbGFncyk7CisgICAgICBuZXctPnExPXAtPnJpZ2h0LT5vOworICAgICAgbmV3LT56PXAtPmxlZnQtPm87CisgICAgICBuZXctPnEyLnZhbC52bWF4PXN6b2YocC0+bGVmdC0+bnR5cCk7CisgICAgICBwLT5vPW5ldy0+ejsKKyAgICAgIGlmKCFJU1NDQUxBUihwLT5udHlwLT5mbGFncykpCisJbmV3LT50eXBmMj16bTJsKGZhbGlnbihwLT5udHlwKSk7CisgICAgICBhZGRfSUMobmV3KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYocC0+ZmxhZ3M9PUFTU0lHTk9QKXsKKyAgICAvKiAgZGFzIGhpZXIgaXN0IG5pY2h0IGJlc29uZGVycyBzY2hvZW4gKi8KKyAgICAgIG9iaiBvLHE7SUMgKm47aW50IGY7Y2hhciAqbGlibmFtZTsKKyAgICAgIG5wIGxjOworICAgICAgaWYocC0+cmlnaHQtPnJpZ2h0PT0wKXsKKyAgICAgICAgLyogIHNvd2FzIHdpZSBhKz0wIHd1cmRlIHdlZ29wdGltaWVydCAgICovCisJZnJlZShuZXcpOworCXAtPm89cC0+bGVmdC0+bzsKKwlyZXR1cm47CisgICAgICB9CisjaWYgSEFWRV9MSUJDQUxMUworICAgICAgaWYobGlibmFtZT11c2VfbGliY2FsbF93cmFwKHAtPnJpZ2h0LT5mbGFncyxwLT5yaWdodC0+bnR5cC0+ZmxhZ3MsKHAtPnJpZ2h0LT5mbGFncz09TFNISUZUfHxwLT5yaWdodC0+ZmxhZ3M9PVJTSElGVCk/SU5UOjApKXsKKwl0eXBlICp0MSwqdDI7CisJbnAgYTE7CisJZ2VuX0lDKHAtPmxlZnQsMCwwKTsKKwlhMT1uZXdfbm9kZSgpOworCWExLT5vPXAtPmxlZnQtPm87CisJYTEtPmZsYWdzPVJFSU5URVJQUkVUOworCWExLT5vLmZsYWdzJj1+U0NSQVRDSDsKKwlhMS0+bnR5cD1jbG9uZV90eXAocC0+bGVmdC0+bnR5cCk7CisJdDE9Y2xvbmVfdHlwKHAtPnJpZ2h0LT5udHlwKTsKKwlpZihwLT5yaWdodC0+ZmxhZ3M9PUxTSElGVHx8cC0+cmlnaHQtPmZsYWdzPT1SU0hJRlQpeworCSAgdDI9bmV3X3R5cCgpOworCSAgdDItPmZsYWdzPUlOVDsKKwl9ZWxzZQorCSAgdDI9Y2xvbmVfdHlwKHQxKTsKKwlsYz1nZW5fbGliY2FsbChsaWJuYW1lLGExLypwLT5yaWdodC0+bGVmdCovLHQxLHAtPnJpZ2h0LT5yaWdodCx0Mik7CisJLyoqcC0+cmlnaHQ9KmxjOyovCisJbz1wLT5sZWZ0LT5vOworCWZyZWUoYTEpOworCS8qcC0+bGVmdD0wOyovCisJLypmcmVlKGxjKTsqLworICAgICAgfWVsc2UKKyNlbmRpZgorCXsKKwkgIGxjPTA7CisJICBmPWRvX2FyaXRoKHAtPnJpZ2h0LG5ldyxwLT5sZWZ0LCZvKTsKKwkgIGlmKCFmKSBpZXJyb3IoMCk7CisJICBpZihmPjEpIGllcnJvcigwKTsKKwl9CisgICAgICBpZigoby5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSYmIXJlZ3Nbby5yZWddKQorICAgICAgICBrZWVwX3JlZyhvLnJlZyk7CisgICAgICBpZihsYykKKwljb252ZXJ0KGxjLHAtPm50eXAtPmZsYWdzKTsKKyAgICAgIGVsc2UKKwljb252ZXJ0KHAtPnJpZ2h0LHAtPm50eXAtPmZsYWdzKTsKKyAgICAgIGlmKHAtPmxlZnQmJnAtPmxlZnQtPmZsYWdzPT1CSVRGSUVMRCl7CisJaWYobGMpIGllcnJvcigwKTsKKyAgICAgICAgaW5zZXJ0X2JpdGZpZWxkKCZwLT5sZWZ0LT5sZWZ0LT5vLCZwLT5yaWdodC0+bywmcC0+byxwLT5sZWZ0LT5iZnMscC0+bGVmdC0+YmZvLHAtPm50eXAtPmZsYWdzJk5VLDApOworICAgICAgICBpZigocC0+cmlnaHQtPm8uZmxhZ3MmKFJFR3xTQ1JBVENIKSk9PShSRUd8U0NSQVRDSCkmJnJlZ3NbcC0+cmlnaHQtPm8ucmVnXSkKKyAgICAgICAgICBmcmVlX3JlZyhwLT5yaWdodC0+by5yZWcpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICBuZXctPnR5cGY9cC0+bnR5cC0+ZmxhZ3M7CisgICAgICBuZXctPnEyLmZsYWdzPTA7CisgICAgICBuZXctPmNvZGU9QVNTSUdOOworICAgICAgaWYobGMpeworCW5ldy0+cTE9bGMtPm87CisJLypmcmVlKGxjKTsqLworICAgICAgfWVsc2UKKwluZXctPnExPXAtPnJpZ2h0LT5vOworICAgICAgbmV3LT56PW87CisgICAgICBuZXctPnEyLnZhbC52bWF4PXN6b2YocC0+bnR5cCk7CisgICAgICBwLT5vPW5ldy0+ejsKKyAgICAgIGFkZF9JQyhuZXcpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZihwLT5mbGFncz09TUlOVVN8fHAtPmZsYWdzPT1LT01QTEVNRU5UKXsKKyAgICAgIG5ldy0+Y29kZT1wLT5mbGFnczsKKyAgICAgIGdlbl9JQyhwLT5sZWZ0LDAsMCk7CisgICAgICBjb252ZXJ0KHAtPmxlZnQscC0+bnR5cC0+ZmxhZ3MpOworICAgICAgaWYoKHAtPmxlZnQtPm8uZmxhZ3MmKFNDUkFUQ0h8UkVHKSk9PShTQ1JBVENIfFJFRykmJnJlZ29rKHAtPmxlZnQtPm8ucmVnLHAtPm50eXAtPmZsYWdzLDApKXsKKwluZXctPno9cC0+bGVmdC0+bzsKKwluZXctPnouZmxhZ3MmPX5EUkVGT0JKOworICAgICAgfWVsc2V7CisJZ2V0X3NjcmF0Y2goJm5ldy0+eixwLT5udHlwLT5mbGFncywwLHAtPm50eXApOworICAgICAgfQorICAgICAgbmV3LT5xMT1wLT5sZWZ0LT5vOworICAgICAgcC0+bz1uZXctPno7CisgICAgICBhZGRfSUMobmV3KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYocC0+ZmxhZ3M9PUFERFJFU1N8fHAtPmZsYWdzPT1BRERSRVNTQXx8cC0+ZmxhZ3M9PUFERFJFU1NTKXsKKyAgICAgIGlmKHAtPmZsYWdzIT1BRERSRVNTUyYmcC0+bGVmdC0+ZmxhZ3M9PUlERU5USUZJRVImJmlzX3ZsZW5ndGgocC0+bGVmdC0+bnR5cCkpeworCWdlbl9JQyhwLT5sZWZ0LDAsMCk7CisJaWYoIShwLT5sZWZ0LT5vLmZsYWdzJlZBUikpCisJICBpZXJyb3IoMCk7CisJZnJlZShuZXcpOworCXAtPm89cC0+bGVmdC0+bzsKKwlyZXR1cm47CisgICAgICB9CisgICAgICBuZXctPmNvZGU9QUREUkVTUzsKKyAgICAgIG5ldy0+dHlwZj1wLT5sZWZ0LT5udHlwLT5mbGFnczsKKyAgICAgIG5ldy0+dHlwZjI9UE9JTlRFUl9UWVBFKHAtPmxlZnQtPm50eXApOworICAgICAgZ2VuX0lDKHAtPmxlZnQsMCwwKTsKKyAgICAgIGlmKHAtPmxlZnQtPm8uZmxhZ3MmVkFSKSBwLT5sZWZ0LT5vLnYtPmZsYWdzfD0oVVNFREFTU09VUkNFfFVTRURBU0RFU1QpOworICAgICAgaWYocC0+bGVmdC0+by5mbGFncyZEUkVGT0JKKXsKKwlmcmVlKG5ldyk7CisJcC0+bz1wLT5sZWZ0LT5vOworCXAtPm8uZmxhZ3MmPX5EUkVGT0JKOworCXJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmKChwLT5sZWZ0LT5vLmZsYWdzJlZBUikmJiEocC0+bGVmdC0+by5mbGFncyZWQVJBRFIpCisJICYmKHAtPmxlZnQtPm8udi0+c3RvcmFnZV9jbGFzcz09RVhURVJOfHxwLT5sZWZ0LT5vLnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQykpeworCWZyZWUobmV3KTsKKwlwLT5vPXAtPmxlZnQtPm87CisJcC0+by5mbGFnc3w9VkFSQURSOworCXJldHVybjsKKyAgICAgIH0KKyAgICAgIG5ldy0+cTE9cC0+bGVmdC0+bzsKKyAgICAgIGdldF9zY3JhdGNoKCZuZXctPnosUE9JTlRFUl9UWVBFKHAtPm50eXAtPm5leHQpLHAtPm50eXAtPm5leHQtPmZsYWdzLDApOworICAgICAgcC0+bz1uZXctPno7CisgICAgICBhZGRfSUMobmV3KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYocC0+ZmxhZ3M9PUxBTkR8fHAtPmZsYWdzPT1MT1IpeworICAgICAgICBpbnQgbDEsbDIsbDMsbDQ7CisvKiAgICAgICAgcHJpbnRmKCIlcyB0cnVlPSVkIGZhbHNlPSVkXG4iLGVuYW1lW3AtPmZsYWdzXSxsdHJ1ZSxsZmFsc2UpOyovCisKKwlpZihJU1ZFQ1RPUihwLT5udHlwLT5mbGFncykpeworCSAgZG9fYXJpdGgocCxuZXcsMCwwKTsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgICAgbDE9KytsYWJlbDsKKwlpZighbHRydWUpIHtsMj0rK2xhYmVsO2wzPSsrbGFiZWw7bDQ9KytsYWJlbDt9CisgICAgICAgIGlmKCFsdHJ1ZSl7CisJICBpZihwLT5mbGFncz09TEFORCkKKwkgICAgZ2VuX0lDKHAtPmxlZnQsbDEsbDMpOworCSAgZWxzZSAKKwkgICAgZ2VuX0lDKHAtPmxlZnQsbDMsbDEpOworICAgICAgICB9ZWxzZXsKKwkgIGlmKHAtPmZsYWdzPT1MQU5EKSAKKwkgICAgZ2VuX0lDKHAtPmxlZnQsbDEsbGZhbHNlKTsKKwkgIGVsc2UgCisJICAgIGdlbl9JQyhwLT5sZWZ0LGx0cnVlLGwxKTsKKyAgICAgICAgfQorICAgICAgICBpZihwLT5sZWZ0LT5vLmZsYWdzIT0wKXsKKyAgICAgICAgICAgIGlmKHAtPmZsYWdzPT1MQU5EKQorICAgICAgICAgICAgICAgIGdlbl90ZXN0KCZwLT5sZWZ0LT5vLHAtPmxlZnQtPm50eXAtPmZsYWdzLEJFUSwoKCFsdHJ1ZSk/bDM6bGZhbHNlKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2VuX3Rlc3QoJnAtPmxlZnQtPm8scC0+bGVmdC0+bnR5cC0+ZmxhZ3MsQk5FLCgoIWx0cnVlKT9sMzpsdHJ1ZSkpOworICAgICAgICB9CisgICAgICAgIGdlbl9sYWJlbChsMSk7CisgICAgICAgIGlmKCFsdHJ1ZSl7CisJICBpZihwLT5mbGFncz09TEFORCkgCisJICAgIGdlbl9JQyhwLT5yaWdodCxsMixsMyk7CisJICBlbHNlCisJICAgIGdlbl9JQyhwLT5yaWdodCxsMyxsMik7CisgICAgICAgIH1lbHNlCisJICBnZW5fSUMocC0+cmlnaHQsbHRydWUsbGZhbHNlKTsKKyAgICAgICAgaWYocC0+cmlnaHQtPm8uZmxhZ3MhPTApeworICAgICAgICAgICAgaWYocC0+ZmxhZ3M9PUxBTkQpCisgICAgICAgICAgICAgICAgZ2VuX3Rlc3QoJnAtPnJpZ2h0LT5vLHAtPnJpZ2h0LT5udHlwLT5mbGFncyxCRVEsKCghbHRydWUpP2wzOmxmYWxzZSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdlbl90ZXN0KCZwLT5yaWdodC0+byxwLT5yaWdodC0+bnR5cC0+ZmxhZ3MsQk5FLCgoIWx0cnVlKT9sMzpsdHJ1ZSkpOworICAgICAgICB9CisgICAgICAgIGlmKCFsdHJ1ZSl7CisgICAgICAgICAgICBnZW5fbGFiZWwobDIpOworICAgICAgICAgICAgaWYocC0+ZmxhZ3M9PUxBTkQpIGdlbl9jb25kKCZwLT5vLDAsbDMsbDQpOyBlbHNlIGdlbl9jb25kKCZwLT5vLDEsbDMsbDQpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgICAgICAgIG5ldy0+Y29kZT1CUkE7CisgICAgICAgICAgICBpZihwLT5mbGFncz09TEFORCkgbmV3LT50eXBmPWx0cnVlOyBlbHNlIG5ldy0+dHlwZj1sZmFsc2U7CisgICAgICAgICAgICBhZGRfSUMobmV3KTsKKyAgICAgICAgfQorICAgICAgICBpZihsdHJ1ZSkgcC0+by5mbGFncz0wOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHAtPmZsYWdzPT1ORUdBVElPTil7CisgICAgICAgIGludCBsMSxsMixsMzsKKwlpZihJU1ZFQ1RPUihwLT5udHlwLT5mbGFncykpeworCSAgZ2VuX0lDKHAtPmxlZnQsMCwwKTsKKwkgIGlmKChwLT5sZWZ0LT5vLmZsYWdzJihTQ1JBVENIfFJFRykpPT0oU0NSQVRDSHxSRUcpJiZyZWdvayhwLT5sZWZ0LT5vLnJlZyxwLT5udHlwLT5mbGFncywwKSl7CisJICAgIG5ldy0+ej1wLT5sZWZ0LT5vOworCSAgICBuZXctPnouZmxhZ3MmPX5EUkVGT0JKOworCSAgfWVsc2V7CisJICAgIGdldF9zY3JhdGNoKCZuZXctPnoscC0+bGVmdC0+bnR5cC0+ZmxhZ3MsMCxwLT5sZWZ0LT5udHlwKTsKKwkgIH0KKwkgIG5ldy0+dHlwZj1wLT5sZWZ0LT5udHlwLT5mbGFnczsKKwkgIG5ldy0+cTE9cC0+bGVmdC0+bzsKKwkgIHAtPm89bmV3LT56OworCSAgbmV3LT5jb2RlPU5FR0FUSU9OOworCSAgYWRkX0lDKG5ldyk7CisJICByZXR1cm47CisJfQorICAgICAgICBpZighbHRydWUpIHtsMT0rK2xhYmVsO2wyPSsrbGFiZWw7bDM9KytsYWJlbDt9CisgICAgICAgIGlmKGx0cnVlKQorCSAgZ2VuX0lDKHAtPmxlZnQsbGZhbHNlLGx0cnVlKTsKKwllbHNlCisJICBnZW5fSUMocC0+bGVmdCxsMSxsMyk7CisgICAgICAgIGlmKCFwLT5sZWZ0LT5vLmZsYWdzKXsKKwkgIGZyZWUobmV3KTtwLT5vLmZsYWdzPTA7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgZ2VuX3Rlc3QoJnAtPmxlZnQtPm8scC0+bGVmdC0+bnR5cC0+ZmxhZ3MsQk5FLCgoIWx0cnVlKT9sMTpsZmFsc2UpKTsKKyAgICAgICAgfQorICAgICAgICBpZihsdHJ1ZSl7CisgICAgICAgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICAgICAgICBuZXctPmNvZGU9QlJBOworICAgICAgICAgICAgaWYoIWx0cnVlKSBuZXctPnR5cGY9bDI7IGVsc2UgbmV3LT50eXBmPWx0cnVlOworICAgICAgICAgICAgYWRkX0lDKG5ldyk7CisgICAgICAgICAgICBwLT5vLmZsYWdzPTA7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgZ2VuX2xhYmVsKGwzKTsKKyAgICAgICAgICAgIGdlbl9jb25kKCZwLT5vLDAsbDEsbDIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYocC0+ZmxhZ3M+PUVRVUFMJiZwLT5mbGFnczw9R1JFQVRFUkVRKXsKKyAgICAgIGludCBsMSxsMixsMyx0bCx0cjsKKyAgICAgIHR5cGUgKmF0PTA7CisgICAgICBjaGFyICpsaWJuYW1lOworICAgICAgaWYoSVNWRUNUT1IocC0+bnR5cC0+ZmxhZ3MpKXsKKwlkb19hcml0aChwLG5ldywwLDApOworCXJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmKCFsdHJ1ZSkge2wxPSsrbGFiZWw7bDI9KytsYWJlbDtsMz0rK2xhYmVsO30KKyAgICAgIGlmKHAtPmxlZnQtPmZsYWdzPT1DRVhQUil7CisgICAgICAgIC8qICBLb25zdGFudGVuIG5hY2ggcmVjaHRzICAqLworCW5wIG1lcms7bWVyaz1wLT5sZWZ0O3AtPmxlZnQ9cC0+cmlnaHQ7cC0+cmlnaHQ9bWVyazsKKwlpZihwLT5mbGFncz09TEVTUykgcC0+ZmxhZ3M9R1JFQVRFUjsKKwllbHNlIGlmKHAtPmZsYWdzPT1MRVNTRVEpIHAtPmZsYWdzPUdSRUFURVJFUTsKKwllbHNlIGlmKHAtPmZsYWdzPT1HUkVBVEVSKSBwLT5mbGFncz1MRVNTOworCWVsc2UgaWYocC0+ZmxhZ3M9PUdSRUFURVJFUSkgcC0+ZmxhZ3M9TEVTU0VROworICAgICAgfQorI2lmIEhBVkVfTElCQ0FMTFMKKyAgICAgIGF0PWFyaXRoX3R5cChwLT5sZWZ0LT5udHlwLHAtPnJpZ2h0LT5udHlwKTsKKyAgICAgIGlmKGxpYm5hbWU9dXNlX2xpYmNhbGxfd3JhcChDT01QQVJFLGF0LT5mbGFncywwKSl7CisJbmV3LT5xMT1nZW5fbGliY2FsbChsaWJuYW1lLHAtPmxlZnQsYXQscC0+cmlnaHQsY2xvbmVfdHlwKGF0KSktPm87CisJbmV3LT5jb2RlPUNPTVBBUkU7CisJbmV3LT50eXBmPUxJQkNBTExfQ01QVFlQRTsKKwluZXctPnEyLmZsYWdzPUtPTlNUOworCWd2YWwudm1heD1aMDsKKwlldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CisJaW5zZXJ0X2NvbnN0KCZuZXctPnEyLnZhbCxMSUJDQUxMX0NNUFRZUEUpOworICAgICAgfWVsc2V7CisjZW5kaWYKKyAgICAgICAgbmV3LT5jb2RlPUNPTVBBUkU7CisgICAgICAgIHRsPXAtPmxlZnQtPm50eXAtPmZsYWdzJk5VO3RyPXAtPnJpZ2h0LT5udHlwLT5mbGFncyZOVTsKKyAgICAgICAgaWYocC0+cmlnaHQtPmZsYWdzPT1DRVhQUiYmSVNJTlQodHIpJiZJU0lOVCh0bCkmJnptMmwoc2l6ZXRhYlt0bCZOUV0pPD16bTJsKHNpemV0YWJbdHImTlFdKSYmKCh0bCZOUSk+PUlOVHx8c2hvcnRjdXQoQ09NUEFSRSx0bCkpKXsKKwkgIGludCBuZWdhdGl2OworCSAgZXZhbF9jb25zdG4ocC0+cmlnaHQpOworCSAgaWYoem1sZXEodm1heCxsMnptKDBMKSkpIG5lZ2F0aXY9MTsgZWxzZSBuZWdhdGl2PTA7CisJICBpZigodGwmVU5TSUdORUQpfHwodHImVU5TSUdORUQpKSBuZWdhdGl2PTA7CisJICBpZigoIW5lZ2F0aXZ8fHptbGVxKHRfbWluKHRsKSx2bWF4KSkmJihuZWdhdGl2fHx6dW1sZXEodnVtYXgsdF9tYXgodGwpKSkpeworCSAgICBpZigodGwmVU5TSUdORUQpfHwhKHRyJlVOU0lHTkVEKXx8cC0+ZmxhZ3M9PUVRVUFMfHxwLT5mbGFncz09SU5FUVVBTCl7CisJICAgICAgY29udmVydChwLT5yaWdodCx0bCk7CisJICAgICAgdHI9dGw7CisJICAgIH0KKwkgIH0KKyAgICAgICAgfQorICAgICAgICBpZihJU0FSSVRIKHRsKSYmKHRsIT10cnx8IXNob3J0Y3V0KENPTVBBUkUsdGwpKSl7CisJICB0eXBlICp0OworCSAgdD1hcml0aF90eXAocC0+bGVmdC0+bnR5cCxwLT5yaWdodC0+bnR5cCk7CisJICBuZXctPnR5cGY9dC0+ZmxhZ3M7CisJICBmcmVldHlwKHQpOworICAgICAgICB9ZWxzZXsKKwkgIG5ldy0+dHlwZj1wLT5sZWZ0LT5udHlwLT5mbGFnczsKKyAgICAgICAgfQorICAgICAgICBnZW5fSUMocC0+bGVmdCwwLDApOworICAgICAgICBjb252ZXJ0KHAtPmxlZnQsbmV3LT50eXBmKTsKKyAgICAgICAgZ2VuX0lDKHAtPnJpZ2h0LDAsMCk7CisgICAgICAgIGNvbnZlcnQocC0+cmlnaHQsbmV3LT50eXBmKTsKKyAgICAgICAgbmV3LT5xMT1wLT5sZWZ0LT5vOworICAgICAgICBuZXctPnEyPXAtPnJpZ2h0LT5vOworICAgICAgICBuZXctPnouZmxhZ3M9MDsKKwlpZihwLT5mbGFncz09RVFVQUx8fHAtPmZsYWdzPT1JTkVRVUFMKXsKKwkgIC8qIGdlbmVyYXRlIFRFU1QsIGlmIHBvc3NpYmxlICovCisJICBpZihuZXctPnEyLmZsYWdzJktPTlNUKXsKKwkgICAgZXZhbF9jb25zdCgmbmV3LT5xMi52YWwsbmV3LT50eXBmKTsKKwkgICAgaWYoem1lcXRvKHZtYXgsbDJ6bSgwTCkpJiZ6dW1lcXRvKHZ1bWF4LHVsMnp1bSgwVUwpKSYmemxkZXF0byh2bGRvdWJsZSxkMnpsZCgwLjApKSl7CisJICAgICAgbmV3LT5jb2RlPVRFU1Q7CisJICAgICAgbmV3LT5xMi5mbGFncz0wOworCSAgICB9CisJICB9CisJfQorI2lmIEhBVkVfTElCQ0FMTFMKKyAgICAgIH0KKyNlbmRpZgorICAgICAgZnJlZXR5cChhdCk7CisgICAgICBhZGRfSUMobmV3KTsKKyAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgIGlmKHAtPmZsYWdzPT1FUVVBTCkgbmV3LT5jb2RlPUJFUTsKKyAgICAgIGlmKHAtPmZsYWdzPT1JTkVRVUFMKSBuZXctPmNvZGU9Qk5FOworICAgICAgaWYocC0+ZmxhZ3M9PUxFU1MpIG5ldy0+Y29kZT1CTFQ7CisgICAgICBpZihwLT5mbGFncz09TEVTU0VRKSBuZXctPmNvZGU9QkxFOworICAgICAgaWYocC0+ZmxhZ3M9PUdSRUFURVIpIG5ldy0+Y29kZT1CR1Q7CisgICAgICBpZihwLT5mbGFncz09R1JFQVRFUkVRKSBuZXctPmNvZGU9QkdFOworICAgICAgaWYobHRydWUpIG5ldy0+dHlwZj1sdHJ1ZTsgZWxzZSBuZXctPnR5cGY9bDE7CisgICAgICBhZGRfSUMobmV3KTsKKyAgICAgIGlmKGx0cnVlKXsKKwluZXc9bmV3X0lDKCk7CisJbmV3LT5jb2RlPUJSQTsKKwluZXctPnR5cGY9bGZhbHNlOworCWFkZF9JQyhuZXcpOworCXAtPm8uZmxhZ3M9MDsKKyAgICAgIH1lbHNleworCWdlbl9sYWJlbChsMyk7CisJZ2VuX2NvbmQoJnAtPm8sMSxsMSxsMik7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHAtPmZsYWdzPT1DQUxMKXsKKyAgICAgICAgaW50IHI9MCxyYWRycHVzaD0wOworCW9iaiAqb3AsY2Z1bmMscmV0X29iajsKKwl6bWF4IHN6OworICAgICAgICBpbnQgbXJlZ3NbTUFYUisxXTsKKwlJQyAqY2FsbGljOworI2lmZGVmIE9SREVSRURfUFVTSAorICAgICAgICBJQyAqbWVya19mcCwqbHA7CisJdW5zaWduZWQgaW50IG1lcmtfb3B1c2hlZD1vcHVzaGVkOworI2VuZGlmCisgICAgICAgIGlmKHAtPmxlZnQtPmZsYWdzPT1BRERSRVNTJiZwLT5sZWZ0LT5sZWZ0LT5mbGFncz09SURFTlRJRklFUil7CisgICAgICAgICAgICBWYXIgKnY7CisgICAgICAgICAgICBnZW5fSUMocC0+bGVmdCwwLDApOyByPTE7CisgICAgICAgICAgICB2PXAtPmxlZnQtPm8udjsKKyAgICAgICAgICAgIGlmKHYtPmZpJiZ2LT5maS0+Zmlyc3RfaWMmJiFjcm9zc19tb2R1bGUmJihjX2ZsYWdzX3ZhbFswXS5sJjQwOTYpKXsKKyAgICAgICAgICAgIC8qICBmdW5jdGlvbiBjYWxsIGlubGluaW5nICAqLworICAgICAgICAgICAgICAgIGFyZ3VtZW50X2xpc3QgKmFsOworICAgICAgICAgICAgICAgIFZhciAqdnAsKiphcmdsMSwqKmFyZ2wyOworICAgICAgICAgICAgICAgIElDICppcDtpbnQgbGM7CisgICAgICAgICAgICAgICAgaW50IGFyZ19jbnQ9MCxpOworICAgICAgICAgICAgICAgIGlmKERFQlVHJjEwMjQpeworICAgICAgICAgICAgICAgICAgICBwcmludGYoImlubGluaW5nIGNhbGwgdG8gPCVzPlxuIix2LT5pZGVudGlmaWVyKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKHZwPXYtPmZpLT52YXJzO3ZwO3ZwPXZwLT5uZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyglbGQpLyVwXG4iLHZwLT5pZGVudGlmaWVyLHptMmwodnAtPm9mZnNldCksKHZvaWQqKXZwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yKHZwPXYtPmZpLT52YXJzO3ZwO3ZwPXZwLT5uZXh0KXsKKwkJICAvKkZJWE1FOiB6bWVxdG8gaGllciBvaz8gc2llaGUgY3Jvc3NfbW9kdWxlX2lubGluZSAqLworCQkgIGlmKCh6bWVxdG8odnAtPm9mZnNldCxsMnptKDBMKSl8fHZwLT5yZWcpJiYqdnAtPmlkZW50aWZpZXImJih2cC0+c3RvcmFnZV9jbGFzcz09QVVUT3x8dnAtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKSkgYXJnX2NudCsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qICBBcmd1bWVudGUgaW4gZGllIGVyc3RlbiBQYXJhbWV0ZXJ2YXJpYWJsZW4ga29waWVyZW4gKi8KKyAgICAgICAgICAgICAgICBhcmdsMT1teW1hbGxvYyhhcmdfY250KnNpemVvZihWYXIgKikpOworICAgICAgICAgICAgICAgIGFyZ2wyPW15bWFsbG9jKGFyZ19jbnQqc2l6ZW9mKFZhciAqKSk7CisKKyAgICAgICAgICAgICAgICBhbD1wLT5hbGlzdDt2cD12LT5maS0+dmFycztpPTA7CisgICAgICAgICAgICAgICAgd2hpbGUoYWwpeworCQkgICAgLypGSVhNRTogem1lcXRvIGhpZXIgb2s/IHNpZWhlIGNyb3NzX21vZHVsZV9pbmxpbmUgKi8KKwkJICAgIHdoaWxlKHZwJiYoISp2cC0+aWRlbnRpZmllcnx8KCF6bWVxdG8odnAtPm9mZnNldCxsMnptKDBMKSkmJiF2cC0+cmVnKXx8KHZwLT5zdG9yYWdlX2NsYXNzIT1SRUdJU1RFUiYmdnAtPnN0b3JhZ2VfY2xhc3MhPUFVVE8pKSkgdnA9dnAtPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIGlmKCF2cCl7IGVycm9yKDM5KTsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgaWYoaT49YXJnX2NudCkgaWVycm9yKDApOworICAgICAgICAgICAgICAgICAgICBpZihERUJVRyYxMDI0KSBwcmludGYoImFyZzogJXMoJWxkKVxuIix2cC0+aWRlbnRpZmllcix6bTJsKHZwLT5vZmZzZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgYXJnbDFbaV09dnA7CisgICAgICAgICAgICAgICAgICAgIGFyZ2wyW2ldPWFkZF92YXIoZW1wdHksY2xvbmVfdHlwKHZwLT52dHlwKSx2cC0+c3RvcmFnZV9jbGFzcywwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIWFsLT5hcmcpIGllcnJvcigwKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX0lDKGFsLT5hcmcsMCwwKTsKKyAgICAgICAgICAgICAgICAgICAgY29udmVydChhbC0+YXJnLHZwLT52dHlwLT5mbGFncyk7CisgICAgICAgICAgICAgICAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3LT5jb2RlPUFTU0lHTjsKKyAgICAgICAgICAgICAgICAgICAgbmV3LT5xMT1hbC0+YXJnLT5vOworICAgICAgICAgICAgICAgICAgICBuZXctPnEyLmZsYWdzPTA7CisgICAgICAgICAgICAgICAgICAgIG5ldy0+cTIudmFsLnZtYXg9c3pvZih2cC0+dnR5cCk7CisgICAgICAgICAgICAgICAgICAgIG5ldy0+ei5mbGFncz1WQVI7CisgICAgICAgICAgICAgICAgICAgIG5ldy0+ei52YWwudm1heD1sMnptKDBMKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3LT56LnY9YXJnbDJbaV07CisgICAgICAgICAgICAgICAgICAgIG5ldy0+dHlwZj12cC0+dnR5cC0+ZmxhZ3M7CisJCSAgICBuZXctPnR5cGYyPWZhbGlnbih2cC0+dnR5cCk7CisgICAgICAgICAgICAgICAgICAgIGFkZF9JQyhuZXcpOworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIGFsPWFsLT5uZXh0OworICAgICAgICAgICAgICAgICAgICB2cD12cC0+bmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoaTxhcmdfY250KXsgZXJyb3IoODMpOyBhcmdfY250PWk7fQorCisgICAgICAgICAgICAgICAgLyogIEtvcGllbiBkZXIgVmFyaWFibGVuIGVyemV1Z2VuICAgKi8KKyAgICAgICAgICAgICAgICBmb3IodnA9di0+ZmktPnZhcnM7dnA7dnA9dnAtPm5leHQpeworICAgICAgICAgICAgICAgICAgICB2cC0+aW5saW5lX2NvcHk9MDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yKGk9MDtpPGFyZ19jbnQ7aSsrKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoYXJnbDFbaV0peworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWFyZ2wyW2ldKSBpZXJyb3IoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcmdsMVtpXS0+aW5saW5lX2NvcHk9YXJnbDJbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiAgUnVlY2tnYWJld2VydCAgICovCisgICAgICAgICAgICAgICAgaWYoKHAtPm50eXAtPmZsYWdzJk5RKSE9Vk9JRCl7CisgICAgICAgICAgICAgICAgICAgIHAtPm8uZmxhZ3M9U0NSQVRDSHxWQVI7CisgICAgICAgICAgICAgICAgICAgIHAtPm8ucmVnPTA7cC0+by52YWwudm1heD1sMnptKDBMKTsKKyAgICAgICAgICAgICAgICAgICAgcC0+by52PWFkZF92YXIoZW1wdHksY2xvbmVfdHlwKHAtPm50eXApLEFVVE8sMCk7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIHAtPm8uZmxhZ3M9MDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmcmVlKGFyZ2wxKTsKKyAgICAgICAgICAgICAgICBmcmVlKGFyZ2wyKTsKKworICAgICAgICAgICAgICAgIC8qICBDb2RlIGVpbmZ1ZWdlbiB1bmQgTGFiZWxzIHVtc2NocmVpYmVuICAgKi8KKyAgICAgICAgICAgICAgICBpcD12LT5maS0+Zmlyc3RfaWM7bGM9MDsKKyAgICAgICAgICAgICAgICB3aGlsZShpcCl7CisgICAgICAgICAgICAgICAgICAgIFZhciAqaXY7CisgICAgICAgICAgICAgICAgICAgIGludCBjOworICAgICAgICAgICAgICAgICAgICBuZXc9bmV3X0lDKCk7CisJCSAgICAqbmV3PSppcDsKKwkJICAgIGlwLT5jb3B5PW5ldzsKKyAgICAgICAgICAgICAgICAgICAgYz1pcC0+Y29kZTsKKyAgICAgICAgICAgICAgICAgICAgLyogIGV2dGwuIGlzdCBlaW4gSUMgcHJha3Rpc2NoIGVpbiBTRVRSRVRVUk4sIGZhbGxzIGRhcyAqLworICAgICAgICAgICAgICAgICAgICAvKiAgUnVlY2tnYWJlemllbCB1ZWJlciBQYXJhbWV0ZXJ6ZWlnZXIgYW5nZXNwci4gd2lyZCAgICovCisgICAgICAgICAgICAgICAgICAgIGlmKGlwLT56LmZsYWdzJlZBUil7CisgICAgICAgICAgICAgICAgICAgICAgaXY9aXAtPnoudjsKKyAgICAgICAgICAgICAgICAgICAgICBpZihpdi0+c3RvcmFnZV9jbGFzcz09QVVUT3x8aXYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEqaXYtPmlkZW50aWZpZXImJnptZXF0byhpdi0+b2Zmc2V0LGwyem0oMEwpKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+ej1wLT5vOworICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpdi0+aW5saW5lX2NvcHkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2LT5pbmxpbmVfY29weT1hZGRfdmFyKGVtcHR5LGNsb25lX3R5cChpdi0+dnR5cCksaXYtPnN0b3JhZ2VfY2xhc3MsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXYtPmlubGluZV9jb3B5LT5yZWc9aXYtPnJlZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXctPnoudj1pdi0+aW5saW5lX2NvcHk7CisgICAgICAgICAgICAgICAgICAgICAgICB9LyplbHNlIGlmKGl2LT5pbmxpbmVfY29weSkgaWVycm9yKDApOyovCisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qICBLb3BpZW4gYWxsZXIgYXV0by9yZWdpc3RlciBWYXJpYWJsZW4gZXJ6ZXVnZW4gICAqLworICAgICAgICAgICAgICAgICAgICBpZihpcC0+cTEuZmxhZ3MmVkFSKXsKKyAgICAgICAgICAgICAgICAgICAgICBpdj1pcC0+cTEudjsKKyAgICAgICAgICAgICAgICAgICAgICBpZihpdi0+c3RvcmFnZV9jbGFzcz09QVVUT3x8aXYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpdi0+aW5saW5lX2NvcHkpeworICAgICAgICAgICAgICAgICAgICAgICAgICBpdi0+aW5saW5lX2NvcHk9YWRkX3ZhcihlbXB0eSxjbG9uZV90eXAoaXYtPnZ0eXApLGl2LT5zdG9yYWdlX2NsYXNzLDApOworICAgICAgICAgICAgICAgICAgICAgICAgICBpdi0+aW5saW5lX2NvcHktPnJlZz1pdi0+cmVnOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3LT5xMS52PWl2LT5pbmxpbmVfY29weTsKKyAgICAgICAgICAgICAgICAgICAgICB9LyplbHNlIGlmKGl2LT5pbmxpbmVfY29weSkgaWVycm9yKDApOyovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoaXAtPnEyLmZsYWdzJlZBUil7CisgICAgICAgICAgICAgICAgICAgICAgaXY9aXAtPnEyLnY7CisgICAgICAgICAgICAgICAgICAgICAgaWYoaXYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fGl2LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CisgICAgICAgICAgICAgICAgICAgICAgICBpZighaXYtPmlubGluZV9jb3B5KXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXYtPmlubGluZV9jb3B5PWFkZF92YXIoZW1wdHksY2xvbmVfdHlwKGl2LT52dHlwKSxpdi0+c3RvcmFnZV9jbGFzcywwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXYtPmlubGluZV9jb3B5LT5yZWc9aXYtPnJlZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+cTIudj1pdi0+aW5saW5lX2NvcHk7CisgICAgICAgICAgICAgICAgICAgICAgfS8qZWxzZSBpZihpdi0+aW5saW5lX2NvcHkpIGllcnJvcigwKTsqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKGM9PUNBTEwpeworCQkgICAgICBpbnQgaTsKKwkJICAgICAgZnVuY3Rpb25fY2FsbHMrPWN1cnJlbnRwcmk7CisJCSAgICAgIG5ldy0+YXJnX2xpc3Q9bXltYWxsb2Moc2l6ZW9mKCpuZXctPmFyZ19saXN0KSpuZXctPmFyZ19jbnQpOworCQkgICAgICBmb3IoaT0wO2k8bmV3LT5hcmdfY250O2krKykgbmV3LT5hcmdfbGlzdFtpXT1pcC0+YXJnX2xpc3RbaV0tPmNvcHk7CisJCSAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKGM9PUxBQkVMfHwoYz49QkVRJiZjPD1CUkEpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5ldy0+dHlwZj5sYykgbGM9bmV3LT50eXBmOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3LT50eXBmKz1sYWJlbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihjPT1TRVRSRVRVUk4peworICAgICAgICAgICAgICAgICAgICAgICAgbmV3LT5jb2RlPUFTU0lHTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+ej1wLT5vOworICAgICAgICAgICAgICAgICAgICB9CisJCSAgICBhZGRfSUMobmV3KTsKKyAgICAgICAgICAgICAgICAgICAgaXA9aXAtPm5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhYmVsKz1sYzsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiAgZWluaWdlIHNwZXppZWxsZSBJbmxpbmUtRnVua3Rpb25lbjsgZGFzIHNldHp0IHZvcmF1cywgZGFzcyAgKi8KKyAgICAgICAgICAgIC8qICBkaWVzZSBpbiBkZW4gSGVhZGVyZmlsZXMgcGFzc2VuZCBkZWtsYXJpZXJ0IHdlcmRlbiAgICAgICAgICAqLworICAgICAgICAgICAgaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKKwkgICAgICAgIGlmKChvcHRmbGFncyYyKSYmKCFzdHJjbXAodi0+aWRlbnRpZmllciwic3RybGVuIil8fCFzdHJjbXAodi0+aWRlbnRpZmllciwiX19hc21fc3RybGVuIikpJiZwLT5hbGlzdCYmcC0+YWxpc3QtPmFyZyl7CisgICAgICAgICAgICAgICAgICAgIG5wIG49cC0+YWxpc3QtPmFyZzsKKyAgICAgICAgICAgICAgICAgICAgaWYobi0+ZmxhZ3M9PUFERFJFU1NBJiZuLT5sZWZ0LT5mbGFncz09U1RSSU5HJiZ6bWVxdG8obi0+bGVmdC0+dmFsLnZtYXgsbDJ6bSgwTCkpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2xpc3QgKmNsO3p1bWF4IGxlbj11bDJ6dW0oMFVMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsPW4tPmxlZnQtPmNsOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoY2wpeworCQkJICBpZih6bWVxdG8obDJ6bSgwTCksemMyem0oY2wtPm90aGVyLT52YWwudmNoYXIpKSkgYnJlYWs7CisJCQkgIGxlbj16dW1hZGQobGVuLHVsMnp1bSgxVUwpKTsKKwkJCSAgY2w9Y2wtPm5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwLT5vLnZhbC52dW1heD1sZW47CisgICAgICAgICAgICAgICAgICAgICAgICBldmFsX2NvbnN0KCZwLT5vLnZhbCxVTlNJR05FRHxNQVhJTlQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0X2NvbnN0bihwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydF9jb25zdCgmcC0+by52YWwscC0+bnR5cC0+ZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZmxhZ3M9Q0VYUFI7CisgICAgICAgICAgICAgICAgICAgICAgICBwLT5vLmZsYWdzPUtPTlNUOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoaW5saW5lX21lbWNweV9zej4wJiYob3B0ZmxhZ3MmMikpeworCQkgICAgaWYoKCFzdHJjbXAodi0+aWRlbnRpZmllciwic3RyY3B5Iil8fCFzdHJjbXAodi0+aWRlbnRpZmllciwiX19hc21fc3RyY3B5IikpJiZwLT5hbGlzdCYmcC0+YWxpc3QtPm5leHQmJnAtPmFsaXN0LT5uZXh0LT5hcmcpeworICAgICAgICAgICAgICAgICAgICAgICAgbnAgbj1wLT5hbGlzdC0+bmV4dC0+YXJnOworICAgICAgICAgICAgICAgICAgICAgICAgaWYobi0+ZmxhZ3M9PUFERFJFU1NBJiZuLT5sZWZ0LT5mbGFncz09U1RSSU5HJiZ6bWVxdG8obi0+bGVmdC0+dmFsLnZtYXgsbDJ6bSgwTCkpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9saXN0ICpjbDt6bWF4IGxlbj1sMnptKDBMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbD1uLT5sZWZ0LT5jbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShjbCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbj16bWFkZChsZW4sbDJ6bSgxTCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih6bWVxdG8oemMyem0oY2wtPm90aGVyLT52YWwudmNoYXIpLGwyem0oMEwpKSkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsPWNsLT5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih6bWxlcShsZW4sbDJ6bSgobG9uZylpbmxpbmVfbWVtY3B5X3N6KSkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVfbWVtY3B5KHAtPmFsaXN0LT5hcmcsbixsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5vPXAtPmFsaXN0LT5hcmctPm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoIXN0cmNtcCh2LT5pZGVudGlmaWVyLCJtZW1jcHkiKXx8IXN0cmNtcCh2LT5pZGVudGlmaWVyLCJfX2FzbV9tZW1jcHkiKSl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihwLT5hbGlzdCYmcC0+YWxpc3QtPm5leHQmJnAtPmFsaXN0LT5uZXh0LT5uZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAmJnAtPmFsaXN0LT5uZXh0LT5uZXh0LT5hcmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICYmcC0+YWxpc3QtPm5leHQtPm5leHQtPmFyZy0+ZmxhZ3M9PUNFWFBSKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsX2NvbnN0bihwLT5hbGlzdC0+bmV4dC0+bmV4dC0+YXJnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih6bWxlcSh2bWF4LGwyem0oKGxvbmcpaW5saW5lX21lbWNweV9zeikpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lX21lbWNweShwLT5hbGlzdC0+YXJnLHAtPmFsaXN0LT5uZXh0LT5hcmcsdm1heCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPm89cC0+YWxpc3QtPmFyZy0+bzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBybD0wOworICAgICAgICBpZighKG9wdGZsYWdzJjIpKXsKKyAgICAgICAgICBpbnQgcjsKKyAgICAgICAgICBmb3Iocj0xO3I8PU1BWFI7cisrKXttcmVnc1tyXT1yZWdzW3JdO3JlZ3Nbcl0mPX4oUk5PU0FWRXxSSEFMRik7fQorICAgICAgICB9ZWxzZXsKKwkgIGdlbl9JQyhwLT5sZWZ0LDAsMCk7CisJfQorI2lmZGVmIE9SREVSRURfUFVTSAorICAgICAgICBtZXJrX2ZwPWZpcnN0X3B1c2hlZDsKKyAgICAgICAgZmlyc3RfcHVzaGVkPTA7CisgICAgICAgIGxwPWxhc3RfaWM7CisjZW5kaWYKKyNpZmRlZiBIQVZFX1JFR1BBUk1TCisgICAgICAgIGlmKCFmZnJldHVybihwLT5udHlwKSYmKHAtPm50eXAtPmZsYWdzJk5RKSE9Vk9JRCl7CisgICAgICAgICAgSUMgKm5ldzI7c3RhdGljIHR5cGUgcHR5cD17MH07CisJICB0cmVnX2hhbmRsZSByZWdfaGFuZGxlPWVtcHR5X3JlZ19oYW5kbGU7CisJICBpbnQgcmVnOworCSAgcHR5cC5uZXh0PXAtPm50eXA7CisJICBwdHlwLmZsYWdzPVBPSU5URVJfVFlQRShwLT5udHlwKTsKKwkgIHJlZz1yZWdfcGFybSgmcmVnX2hhbmRsZSwmcHR5cCwwLHAtPmxlZnQtPm50eXAtPm5leHQpOworCSAgaWYocmVnKXsKKwkgICAgbmV3Mj1uZXdfSUMoKTsKKwkgICAgbmV3Mi0+Y29kZT1BRERSRVNTOworCSAgICBuZXcyLT50eXBmPXAtPm50eXAtPmZsYWdzOworCSAgICBuZXcyLT50eXBmMj1QT0lOVEVSX1RZUEUocC0+bnR5cCk7CisJICAgIG5ldzItPnExLmZsYWdzPVZBUjsKKwkgICAgbmV3Mi0+cTEudj1hZGRfdmFyKGVtcHR5LGNsb25lX3R5cChwLT5udHlwKSxBVVRPLDApOworCSAgICBuZXcyLT5xMS52YWwudm1heD1sMnptKDBMKTsKKwkgICAgb3A9Jm5ldzItPnExOworCSAgICBuZXcyLT5xMi5mbGFncz0wOworCSAgICBnZXRfc2NyYXRjaCgmbmV3Mi0+eixQT0lOVEVSX1RZUEUocC0+bnR5cCkscC0+bnR5cC0+ZmxhZ3MsMCk7CisJICAgIHJldF9vYmo9bmV3Mi0+ejsKKwkgICAgYWRkX0lDKG5ldzIpOworCSAgICBzej1wdXNoX2FyZ3MocC0+YWxpc3QscC0+bGVmdC0+bnR5cC0+bmV4dC0+ZXhhY3QsMCwmcmwsJnJlZ19oYW5kbGUsJnJldF9vYmoscC0+bnR5cCxyZWcscC0+bGVmdC0+bnR5cCk7CisJICAgIGlmKG9wdGZsYWdzJjIpCisJICAgICAgaGFuZGxlX3JlZ2xpc3QocmwsJnJldF9vYmopOworCSAgfWVsc2V7CisJICAgIHN6PXB1c2hfYXJncyhwLT5hbGlzdCxwLT5sZWZ0LT5udHlwLT5uZXh0LT5leGFjdCwwLCZybCwmcmVnX2hhbmRsZSwwLHAtPm50eXAscmVnLHAtPmxlZnQtPm50eXApOworCSAgICByYWRycHVzaD0xOworCSAgICBpZihvcHRmbGFncyYyKQorCSAgICAgIGhhbmRsZV9yZWdsaXN0KHJsLDApOworCSAgfQorCX1lbHNleworCSAgdHJlZ19oYW5kbGUgcmVnX2hhbmRsZT1lbXB0eV9yZWdfaGFuZGxlOworCSAgc3o9cHVzaF9hcmdzKHAtPmFsaXN0LHAtPmxlZnQtPm50eXAtPm5leHQtPmV4YWN0LDAsJnJsLCZyZWdfaGFuZGxlLDAsMCwtMSxwLT5sZWZ0LT5udHlwKTsKKwkgIGlmKG9wdGZsYWdzJjIpCisJICAgIGhhbmRsZV9yZWdsaXN0KHJsLDApOworCX0KKyNlbHNlCisgICAgICAgIHN6PXB1c2hfYXJncyhwLT5hbGlzdCxwLT5sZWZ0LT5udHlwLT5uZXh0LT5leGFjdCwwLCZybCk7CisJaWYob3B0ZmxhZ3MmMikKKwkgIGhhbmRsZV9yZWdsaXN0KHJsLDApOworI2VuZGlmCisgICAgICAgIGlmKCFyJiYhKG9wdGZsYWdzJjIpKSBnZW5fSUMocC0+bGVmdCwwLDApOworICAgICAgICBpZighKHAtPmxlZnQtPm8uZmxhZ3MmRFJFRk9CSikpeworICAgICAgICAgICAgZnJlZShuZXcpOworICAgICAgICAgICAgcC0+bz1wLT5sZWZ0LT5vOworICAgICAgICAgICAgaWYocC0+by5mbGFncyZWQVJBRFIpeworCSAgICAgIHAtPm8uZmxhZ3MmPX5WQVJBRFI7CisJICAgIH1lbHNleworCSAgICAgIHAtPm8uZmxhZ3N8PURSRUZPQko7CisJICAgICAgcC0+by5kdHlwPXAtPmxlZnQtPm50eXAtPmZsYWdzOworCSAgICB9CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgaWYocC0+bGVmdC0+by5mbGFncyZWQVJBRFIpeworICAgICAgICAgICAgICAgIGZyZWUobmV3KTsKKyAgICAgICAgICAgICAgICBwLT5vPXAtPmxlZnQtPm87CisgICAgICAgICAgICAgICAgcC0+by5mbGFncyY9flZBUkFEUjsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGlmKChwLT5sZWZ0LT5vLmZsYWdzJlNDUkFUQ0gpJiZwLT5udHlwLT5mbGFncz09cC0+bGVmdC0+bnR5cC0+ZmxhZ3MpeworCQkgIG5ldy0+ej1wLT5sZWZ0LT5vOworCQkgIG5ldy0+ei5mbGFncyY9fkRSRUZPQko7CisgICAgICAgICAgICAgICAgfWVsc2V7CisJCSAgZ2V0X3NjcmF0Y2goJm5ldy0+eixwLT5sZWZ0LT5udHlwLT5mbGFncyxGVU5LVCxwLT5sZWZ0LT5udHlwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmV3LT5jb2RlPUFTU0lHTjsKKwkJbmV3LT50eXBmPXAtPmxlZnQtPm50eXAtPmZsYWdzOworICAgICAgICAgICAgICAgIG5ldy0+cTE9cC0+bGVmdC0+bzsKKyAgICAgICAgICAgICAgICBuZXctPnEyLnZhbC52bWF4PXNpemV0YWJbbmV3LT50eXBmJk5RXTsKKyAgICAgICAgICAgICAgICBuZXctPnEyLmZsYWdzPTA7CisgICAgICAgICAgICAgICAgcC0+bz1uZXctPno7CisgICAgICAgICAgICAgICAgYWRkX0lDKG5ldyk7CisgICAgICAgICAgICAgICAgcC0+by5mbGFnc3w9RFJFRk9CSjsKKwkJcC0+by5kdHlwPXAtPmxlZnQtPm50eXAtPmZsYWdzOworICAgICAgICAgICAgfQorICAgICAgICB9CisvKiAgICAgICAgICAgIHAtPmxlZnQtPm8uZmxhZ3MtPURSRUZPQkp8VkFSQURSOyBXYXMgc29sbHRlIGRhcz8/ICAgICovCisKKyNpZiAwCisgICAgICAgIGlmKG9wdGZsYWdzJjIpeworICAgICAgICAgICAgd2hpbGUocmwpeworICAgICAgICAgICAgICAgIHJlZ2FyZ3NfbGlzdCAqbTsKKyAgICAgICAgICAgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICAgICAgICAgICAgbmV3LT5jb2RlPU5PUDsKKyAgICAgICAgICAgICAgICBuZXctPnExLmZsYWdzPVZBUjsKKyAgICAgICAgICAgICAgICBuZXctPnExLnY9cmwtPnY7CisgICAgICAgICAgICAgICAgbmV3LT5xMS52YWwudm1heD1sMnptKDBMKTsKKyAgICAgICAgICAgICAgICBuZXctPnR5cGY9MDsKKyAgICAgICAgICAgICAgICBuZXctPnEyLmZsYWdzPW5ldy0+ei5mbGFncz0wOworICAgICAgICAgICAgICAgIGFkZF9JQyhuZXcpOworICAgICAgICAgICAgICAgIG09cmwtPm5leHQ7ZnJlZShybCk7cmw9bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgLyogIGdlZ2ViZW5lbmZhbGxzIEFkcmVzc2UgZGVzIFppZWxzIGF1ZiBkZW4gU3RhY2sgICovCisjaWZkZWYgSEFWRV9SRUdQQVJNUworCWlmKHJhZHJwdXNoKQorI2Vsc2UKKyAgICAgICAgaWYoIWZmcmV0dXJuKHAtPm50eXApJiYocC0+bnR5cC0+ZmxhZ3MmTlEpIT1WT0lEKQorI2VuZGlmCisJeworI2lmIGRlZmluZWQoT1JERVJFRF9QVVNIKSAmJiBkZWZpbmVkKEhBVkVfUkVHUEFSTVMpCisJICBpZXJyb3IoMCk7CisjZW5kaWYKKwkgIG5ldz1uZXdfSUMoKTsKKwkgIG5ldy0+Y29kZT1BRERSRVNTOworCSAgbmV3LT50eXBmPXAtPm50eXAtPmZsYWdzOworCSAgbmV3LT50eXBmMj1QT0lOVEVSX1RZUEUocC0+bnR5cCk7CisJICBuZXctPnExLmZsYWdzPVZBUjsKKwkgIG5ldy0+cTEudj1hZGRfdmFyKGVtcHR5LGNsb25lX3R5cChwLT5udHlwKSxBVVRPLDApOworCSAgbmV3LT5xMS52YWwudm1heD1sMnptKDBMKTsKKwkgIG9wPSZuZXctPnExOworCSAgbmV3LT5xMi5mbGFncz0wOworCSAgZ2V0X3NjcmF0Y2goJm5ldy0+eixQT0lOVEVSX1RZUEUocC0+bnR5cCkscC0+bnR5cC0+ZmxhZ3MsMCk7CisJICByZXRfb2JqPW5ldy0+ejsKKwkgIGFkZF9JQyhuZXcpOworCSAgbmV3PW5ld19JQygpOworCSAgbmV3LT5jb2RlPVBVU0g7CisJICBuZXctPnR5cGY9UE9JTlRFUl9UWVBFKHAtPm50eXApOworCSAgbmV3LT5xMT1yZXRfb2JqOworCSAgbmV3LT5xMi5mbGFncz1uZXctPnouZmxhZ3M9MDsKKwkgIG5ldy0+cTIudmFsLnZtYXg9c2l6ZXRhYltuZXctPnR5cGYmTlFdOworCSAgbmV3LT56LnZhbC52bWF4PW5ldy0+cTIudmFsLnZtYXg7CisJICBhZGRfSUMobmV3KTsKKwkgIHN6PXptYWRkKHN6LHNpemV0YWJbbmV3LT50eXBmJk5RXSk7CisgICAgICAgIH0KKworICAgICAgICAvKiAgU2NyYXRjaHJlZ2lzdGVyIGV2dGwuIHNpY2hlcm4gICAqLworCWNmdW5jPXAtPm87CisgICAgICAgIGlmKCFub2NvZGUpCisJICBzYXZlc2NyYXRjaChNT1ZFRlJPTVJFRyxsYXN0X2ljLDAsJmNmdW5jKTsKKyAgICAgICAgZnVuY3Rpb25fY2FsbHMrPWN1cnJlbnRwcmk7CisgICAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgICAgbmV3LT5jb2RlPUNBTEw7CisJY2FsbGljPW5ldzsKKwlpZihwLT5hbGlzdCl7CisJICAvKiBpbnNlcnQgbGlzdCBvZiBhcmd1bWVudCBJQ3MgKi8KKwkgIGludCBpPTA7CisJICBhcmd1bWVudF9saXN0ICphPXAtPmFsaXN0OworCSAgd2hpbGUoYSl7aSsrO2E9YS0+bmV4dDt9CisJICBuZXctPmFyZ19jbnQ9aTsKKwkgIG5ldy0+YXJnX2xpc3Q9bXltYWxsb2Moc2l6ZW9mKCpuZXctPmFyZ19saXN0KSppKTsKKwkgIGZvcihhPXAtPmFsaXN0LGk9MDthO2E9YS0+bmV4dCxpKyspIG5ldy0+YXJnX2xpc3RbaV09YS0+cHVzaGljOworCX1lbHNleworCSAgbmV3LT5hcmdfY250PTA7CisJICBuZXctPmFyZ19saXN0PTA7CisJfQorICAgICAgICBuZXctPnR5cGY9RlVOS1Q7CisgICAgICAgIG5ldy0+cTE9cC0+bzsKKyAgICAgICAgbmV3LT5xMi5mbGFncz1uZXctPnouZmxhZ3M9MDsKKyAgICAgICAgbmV3LT5xMi52YWwudm1heD1zejsgLyogIEdyb2Vzc2UgZGVyIFBhcmFtZXRlciBhdWYgZGVtIFN0YWNrICovCisgICAgICAgIGFkZF9JQyhuZXcpOworCisJLy9wcmljMihzdGRvdXQsbmV3KTsKKworICAgICAgICBpZihvcHRmbGFncyYyKXsKKyAgICAgICAgICAgIHdoaWxlKHJsKXsKKyAgICAgICAgICAgICAgICByZWdhcmdzX2xpc3QgKm07CisgICAgICAgICAgICAgICAgbmV3PW5ld19JQygpOworICAgICAgICAgICAgICAgIG5ldy0+Y29kZT1OT1A7CisgICAgICAgICAgICAgICAgbmV3LT5xMS5mbGFncz1WQVI7CisgICAgICAgICAgICAgICAgbmV3LT5xMS52PXJsLT52OworICAgICAgICAgICAgICAgIG5ldy0+cTEudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICAgICAgICAgICAgbmV3LT50eXBmPTA7CisgICAgICAgICAgICAgICAgbmV3LT5xMi5mbGFncz1uZXctPnouZmxhZ3M9MDsKKyAgICAgICAgICAgICAgICBhZGRfSUMobmV3KTsKKyAgICAgICAgICAgICAgICBtPXJsLT5uZXh0O2ZyZWUocmwpO3JsPW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByPTA7CisgICAgICAgIGlmKChwLT5udHlwLT5mbGFncyZOUSkhPVZPSUQpeworICAgICAgICAgICAgbmV3PW5ld19JQygpOworICAgICAgICAgICAgbmV3LT5jb2RlPUdFVFJFVFVSTjsKKyAgICAgICAgICAgIG5ldy0+cTEuZmxhZ3M9bmV3LT5xMi5mbGFncz0wOworICAgICAgICAgICAgbmV3LT5xMS5yZWc9ZmZyZXR1cm4ocC0+bnR5cCk7CisgICAgICAgICAgICBuZXctPnEyLnZhbC52bWF4PXN6b2YocC0+bnR5cCk7CisgICAgICAgICAgICBuZXctPnR5cGY9cC0+bnR5cC0+ZmxhZ3M7CisgICAgICAgICAgICBpZihmZnJldHVybihwLT5udHlwKSl7CisgICAgICAgICAgICAgIGludCB0PXAtPm50eXAtPmZsYWdzJk5ROworICAgICAgICAgICAgICBpZihJU1NUUlVDVCh0KXx8SVNVTklPTih0KSl7CisgICAgICAgICAgICAgICAgbmV3LT56LnY9YWRkX3ZhcihlbXB0eSxjbG9uZV90eXAocC0+bnR5cCksQVVUTywwKTsKKyAgICAgICAgICAgICAgICBuZXctPnouZmxhZ3M9VkFSOworICAgICAgICAgICAgICAgIG5ldy0+ei52YWwudm1heD1sMnptKDBMKTsKKyAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgaWYob3B0ZmxhZ3MmMil7CisgICAgICAgICAgICAgICAgICBnZXRfc2NyYXRjaCgmbmV3LT56LHAtPm50eXAtPmZsYWdzLDAscC0+bnR5cCk7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAvKiBTdWNoZSBnZWVpZ25ldGVzIFJlZ2lzdGVyLCB1bSBSdWVja2dhYmV3ZXJ0IHp1IHNwZWljaGVybi4gKi8KKyAgICAgICAgICAgICAgICAgIHJlZ2FyZ3NfbGlzdCAqbDI7CisgICAgICAgICAgICAgICAgICBpbnQgcjsKKyAgICAgICAgICAgICAgICAgIHI9bmV3LT5xMS5yZWc7CisgICAgICAgICAgICAgICAgICBpZihyZWdzW3JdfHwhcmVnb2socixwLT5udHlwLT5mbGFncywwKXx8KHJlZ19wYWlyKHIsJnJwKSYmKHJlZ3NbcnAucjFdfHxyZWdzW3JwLnIyXSkpKXsKKyAgICAgICAgICAgICAgICAgICAgcj0wOworICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIGZvcihsMj1ybDtsMjtsMj1sMi0+bmV4dCl7CisgICAgICAgICAgICAgICAgICAgICAgaWYobDItPnYmJmFicyhsMi0+cmVnKT09cikge3I9MDticmVhazt9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGlmKHI9PTApeworICAgICAgICAgICAgICAgICAgICBmb3Iocj0xO3I8PU1BWFI7cisrKXsKKyAgICAgICAgICAgICAgICAgICAgICBpZighcmVnc1tyXSYmcmVnb2socixwLT5udHlwLT5mbGFncywwKSYmKCFyZWdfcGFpcihyLCZycCl8fCghcmVnc1tycC5yMV0mJiFyZWdzW3JwLnIyXSkpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsMj1ybDtsMjtsMj1sMi0+bmV4dCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGwyLT52JiZhYnMobDItPnJlZyk9PXIpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYobDIpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBpZihyPj0xJiZyPD1NQVhSKXsKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NfaGFyZHJlZyhyKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3LT56LmZsYWdzPShSRUd8U0NSQVRDSCk7CisgICAgICAgICAgICAgICAgICAgIG5ldy0+ei5yZWc9cjsKKyAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBnZXRfc2NyYXRjaCgmbmV3LT56LHAtPm50eXAtPmZsYWdzLDAscC0+bnR5cCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgbmV3LT56PSpvcDsKKyAgICAgICAgICAgIGlmKChuZXctPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRykgcj1uZXctPnoucmVnOworICAgICAgICAgICAgcC0+bz1uZXctPno7CisgICAgICAgICAgICBhZGRfSUMobmV3KTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBwLT5vLmZsYWdzPTA7CisgICAgICAgIH0KKyAgICAgICAgLyogIFNjcmF0Y2hyZWdpc3RlciBldnRsLiB3aWVkZXJoZXJzdGVsbGVuICAqLworICAgICAgICBpZighbm9jb2RlKQorCSAgc2F2ZXNjcmF0Y2goTU9WRVRPUkVHLGxhc3RfaWMsciwmY2Z1bmMpOworICAgICAgICBpZighKG9wdGZsYWdzJjIpKXsKKyAgICAgICAgICBpbnQgcjsKKyAgICAgICAgICBmb3Iocj0xO3I8PU1BWFI7cisrKXsKKyAgICAgICAgICAgIGlmKHJlZ3Nbcl0pCisgICAgICAgICAgICAgIHJlZ3Nbcl18PShtcmVnc1tyXSZSTk9TQVZFKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogIEV2dGwuIGdlc3BlaWNoZXJ0ZSBSZWdpc3RlcmFyZ3VtZW50ZSB3aWVkZXJoZXJzdGVsbGVuLiAgKi8KKyAgICAgICAgd2hpbGUocmwpeworICAgICAgICAgICAgcmVnYXJnc19saXN0ICptOworICAgICAgICAgICAgaWYocmwtPnYpeworCSAgICAgIGludCByOworCSAgICAgIGZvcihyPU1BWFI7cj49MTtyLS0peworCQlpZihyZWdzW3JdJiZyZWdfcGFpcihyLCZycCkmJihycC5yMT09YWJzKHJsLT5yZWcpfHxycC5yMj09YWJzKHJsLT5yZWcpKSkKKwkJICBicmVhazsKKwkgICAgICB9CisJICAgICAgaWYocjw9MSkgcj1hYnMocmwtPnJlZyk7CisJICAgICAgbmV3PW5ld19JQygpOworCSAgICAgIG5ldy0+Y29kZT1NT1ZFVE9SRUc7CisJICAgICAgbmV3LT50eXBmPTA7CisJICAgICAgbmV3LT5xMS5mbGFncz1WQVJ8RE9OVFJFR0lTVEVSSVpFOworCSAgICAgIG5ldy0+cTEudj1ybC0+djsKKwkgICAgICBuZXctPnExLnZhbC52bWF4PWwyem0oMEwpOworCSAgICAgIG5ldy0+ei5mbGFncz1SRUc7CisJICAgICAgaWYocmwtPnJzYXZlZCkKKwkJbmV3LT56LnJlZz1ybC0+cnNhdmVkOworCSAgICAgIGVsc2UKKwkJbmV3LT56LnJlZz1hYnMocik7CisJICAgICAgbmV3LT5xMi5mbGFncz0wOworCSAgICAgIG5ldy0+cTIudmFsLnZtYXg9cmVnc2l6ZVtyXTsKKwkgICAgICBhZGRfSUMobmV3KTsKKwkgICAgICBpZihybC0+cnNhdmVkKQorCQlmcmVlX3JlZyhhYnMocmwtPnJlZykpOworICAgICAgICAgICAgfWVsc2V7CisJICAgICAgZnJlZV9yZWcoYWJzKHJsLT5yZWcpKTsKKwkgICAgfQorICAgICAgICAgICAgbT1ybC0+bmV4dDtmcmVlKHJsKTtybD1tOworICAgICAgICB9CisjaWZkZWYgT1JERVJFRF9QVVNICisgICAgICAgIC8qIElmIGFyZ3VtZW50cyBoYXZlIGJlZW4gcHVzaGVkIG5lc3RlZCB3ZSBoYXZlIHRvIGNvcHkgdGhlbSBhbmQgKi8KKyAgICAgICAgLyogcHVzaCB0aGVtIGxhdGVyLiAqLworICAgICAgICBpZihtZXJrX2ZwJiZvcHVzaGVkIT1tZXJrX29wdXNoZWQpeworICAgICAgICAgIElDICpwLCptPTAsKm5wOworICAgICAgICAgIGlmKCFscCkgaWVycm9yKDApOworICAgICAgICAgIGZvcihwPW1lcmtfZnA7cDspeworICAgICAgICAgICAgbnA9cC0+bmV4dDsKKyAgICAgICAgICAgIGlmKHAtPmNvZGU9PVBVU0gpeworICAgICAgICAgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICAgICAgICAgICpuZXc9KnA7CisJICAgICAgLyogYmUgY2FyZWZ1bCBhYm91dCB0aGUgYWRkcmVzcyBiZWNhdXNlIG9mIGFyZ19saXN0ISAqLworCSAgICAgIGlmKHAtPnByZXYpIHAtPnByZXYtPm5leHQ9bmV3OworCSAgICAgIG5ldy0+cHJldj1wLT5wcmV2OworCSAgICAgIGlmKHAtPm5leHQpIHAtPm5leHQtPnByZXY9bmV3OworCSAgICAgIG5ldy0+bmV4dD1wLT5uZXh0OworCSAgICAgIGlmKHA9PWxhc3RfaWMpIGxhc3RfaWM9bmV3OworCSAgICAgIGlmKHA9PWZpcnN0X2ljKSBmaXJzdF9pYz1uZXc7CisgICAgICAgICAgICAgIGlmKG5ldy0+cTEuZmxhZ3MmJiEocC0+ZmxhZ3MmT1JERVJFRF9QVVNIX0NPUFkpKXsKKyAgICAgICAgICAgICAgICBuZXctPmNvZGU9QVNTSUdOOworICAgICAgICAgICAgICAgIG5ldy0+ei5mbGFncz1WQVI7CisgICAgICAgICAgICAgICAgbmV3LT56LnZhbC52bWF4PWwyem0oMEwpOworCQkvKiB0eXAgYWxsb2NhdGVkIGluIHB1c2hfYXJncyBhbmQgbm90IHVzZWQgdGhlcmUgKi8KKwkJLyoJCWlmKCFwLT5pdHlwKSBpZXJyb3IoMCk7Ki8KKwkJbmV3LT56LnY9YWRkX3RtcF92YXIoY2xvbmVfdHlwKHAtPml0eXApKTsgLypGSVhNRT8/Ki8KKyAgICAgICAgICAgICAgICBwLT5xMT1uZXctPno7CisJCS8qCQlwLT5pdHlwPTA7Ki8KKyAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgcmVtb3ZlX0lDKG5ldyk7CisgICAgICAgICAgICAgIH0KKwkgICAgICBwLT5uZXh0PXAtPnByZXY9MDsKKwkgICAgICBwLT5mbGFnc3w9T1JERVJFRF9QVVNIX0NPUFk7CisgICAgICAgICAgICAgIGFkZF9JQyhwKTsKKyAgICAgICAgICAgICAgaWYoIW0mJiFub2NvZGUpIG09cDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHA9PWxwKSBicmVhazsKKyAgICAgICAgICAgIHA9bnA7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKCFtKSBpZXJyb3IoMCk7CisgICAgICAgICAgZmlyc3RfcHVzaGVkPW07CisgICAgICAgIH1lbHNlCisgICAgICAgICAgZmlyc3RfcHVzaGVkPW1lcmtfZnA7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZihwLT5mbGFncz49UFJFSU5DJiZwLT5mbGFnczw9UE9TVERFQyl7CisgICAgICAgIG9iaiBvOworI2lmIEhBVkVfTElCQ0FMTFMKKwljaGFyICpsaWJuYW1lOworCW5vZGUgdG49e0FERH0sb25lPXtDRVhQUn07CisjZW5kaWYKKyAgICAgICAgZ2VuX0lDKHAtPmxlZnQsMCwwKTsKKyAgICAgICAgaWYoKHAtPmZsYWdzPT1QT1NUSU5DfHxwLT5mbGFncz09UE9TVERFQykpeworCSAgLypuZXc9bmV3X0lDKCk7Ki8KKyAgICAgICAgICAgIG5ldy0+Y29kZT1BU1NJR047CisgICAgICAgICAgICBuZXctPnR5cGY9cC0+bnR5cC0+ZmxhZ3M7CisgICAgICAgICAgICBuZXctPnEyLnZhbC52bWF4PXNpemV0YWJbcC0+bnR5cC0+ZmxhZ3MmTlFdOworICAgICAgICAgICAgbmV3LT5xMT1wLT5sZWZ0LT5vOworCSAgICBwb3N0b3Bfb2JqPSZuZXctPnExOworCSAgICBwb3N0b3BfdHlwZT1uZXctPnR5cGY7CisgICAgICAgICAgICBuZXctPnExLmZsYWdzJj1+U0NSQVRDSDsKKyAgICAgICAgICAgIGdldF9zY3JhdGNoKCZuZXctPnoscC0+bGVmdC0+bnR5cC0+ZmxhZ3MsMCxwLT5sZWZ0LT5udHlwKTsKKyAgICAgICAgICAgIG5ldy0+cTIuZmxhZ3M9MDsKKyAgICAgICAgICAgIG89bmV3LT56OworICAgICAgICAgICAgYWRkX0lDKG5ldyk7CisgICAgICAgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICAgIH1lbHNlCisJICBvPXAtPmxlZnQtPm87CisjaWYgSEFWRV9MSUJDQUxMUworCWlmKHAtPmZsYWdzPT1QUkVERUN8fHAtPmZsYWdzPT1QT1NUREVDKQorCSAgdG4uZmxhZ3M9U1VCOworCXRuLmxlZnQ9cC0+bGVmdDsKKwl0bi5yaWdodD0mb25lOworCXRuLm50eXA9cC0+bnR5cDsKKwlvbmUuZmxhZ3M9Q0VYUFI7CisJb25lLm50eXA9cC0+bnR5cDsKKwlndmFsLnZtYXg9bDJ6bSgxTCk7CisJZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworCWluc2VydF9jb25zdCgmb25lLnZhbCxwLT5udHlwLT5mbGFncyZOVSk7CisJaWYobGlibmFtZT11c2VfbGliY2FsbF93cmFwKHRuLmZsYWdzLHRuLm50eXAtPmZsYWdzLDApKXsKKwkgIG5wIGxjOworCSAgbGM9Z2VuX2xpYmNhbGwobGlibmFtZSxwLT5sZWZ0LDAsJm9uZSwwKTsKKwkgIG5ldz1uZXdfSUMoKTsKKwkgIG5ldy0+Y29kZT1BU1NJR047CisJICBuZXctPnR5cGY9cC0+bnR5cC0+ZmxhZ3M7CisJICBuZXctPnEyLnZhbC52bWF4PXNpemV0YWJbcC0+bnR5cC0+ZmxhZ3MmTlFdOworCSAgbmV3LT5xMT1sYy0+bzsKKwkgIG5ldy0+cTEuZmxhZ3MmPX5TQ1JBVENIOworCSAgbmV3LT56PXAtPmxlZnQtPm87CisJICBhZGRfSUMobmV3KTsKKwkgIG5ldz1uZXdfSUMoKTsKKwkgIGZyZWUobGMpOworCX1lbHNlCisjZW5kaWYKKyAgICAgICAgaWYoSVNQT0lOVEVSKHAtPmxlZnQtPm50eXAtPmZsYWdzKSl7CisgICAgICAgICAgICBpZihwLT5mbGFncz09UFJFSU5DfHxwLT5mbGFncz09UE9TVElOQykKKwkgICAgICBuZXctPmNvZGU9QURESTJQOyAKKwkgICAgZWxzZQorCSAgICAgIG5ldy0+Y29kZT1TVUJJRlA7CisgICAgICAgICAgICB2bWF4PXN6b2YocC0+bGVmdC0+bnR5cC0+bmV4dCk7CisgICAgICAgICAgICBuZXctPnEyLnZhbC52aW50PXptMnppKHZtYXgpOworICAgICAgICAgICAgbmV3LT50eXBmPUlOVDsKKwkgICAgbmV3LT50eXBmMj1wLT5sZWZ0LT5udHlwLT5mbGFnczsKKyAgICAgICAgICAgIG5ldy0+cTE9cC0+bGVmdC0+bzsKKyAgICAgICAgICAgIG5ldy0+ej1wLT5sZWZ0LT5vOworICAgICAgICAgICAgbmV3LT5xMi5mbGFncz1LT05TVDsKKyAgICAgICAgICAgIGFkZF9JQyhuZXcpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGlmKHAtPmZsYWdzPT1QUkVJTkN8fHAtPmZsYWdzPT1QT1NUSU5DKQorCSAgICAgIG5ldy0+Y29kZT1BREQ7CisJICAgIGVsc2UgCisJICAgICAgbmV3LT5jb2RlPVNVQjsKKyAgICAgICAgICAgIG5ldy0+dHlwZj1wLT5udHlwLT5mbGFnczsKKyAgICAgICAgICAgIG5ldy0+cTE9cC0+bGVmdC0+bzsKKyAgICAgICAgICAgIG5ldy0+ej1wLT5sZWZ0LT5vOworICAgICAgICAgICAgbmV3LT5xMi5mbGFncz1LT05TVDsKKwkgICAgZ3ZhbC52aW50PXptMnppKGwyem0oMUwpKTsKKwkgICAgZXZhbF9jb25zdCgmZ3ZhbCxJTlQpOworCSAgICBpbnNlcnRfY29uc3QoJm5ldy0+cTIudmFsLG5ldy0+dHlwZik7CisgICAgICAgICAgICBhZGRfSUMobmV3KTsKKyAgICAgICAgfQorICAgICAgICBpZihwLT5sZWZ0LT5mbGFncz09QklURklFTEQpeworICAgICAgICAgIGluc2VydF9iaXRmaWVsZCgmcC0+bGVmdC0+bGVmdC0+bywmbmV3LT56LCZwLT5vLHAtPmxlZnQtPmJmcyxwLT5sZWZ0LT5iZm8scC0+bnR5cC0+ZmxhZ3MsMCk7CisgICAgICAgICAgaWYocC0+ZmxhZ3MhPVBPU1RJTkMmJnAtPmZsYWdzIT1QT1NUREVDKXsKKyAgICAgICAgICAgIG89cC0+bzsKKyAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGlmKChwLT5vLmZsYWdzJihSRUd8U0NSQVRDSCkpPT0oUkVHfFNDUkFUQ0gpKQorICAgICAgICAgICAgICBmcmVlX3JlZyhwLT5vLnJlZyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKHAtPmZsYWdzPT1QT1NUSU5DfHxwLT5mbGFncz09UE9TVERFQ3x8cC0+bGVmdC0+ZmxhZ3M9PUJJVEZJRUxEKXsKKyAgICAgICAgICBpZigocC0+bGVmdC0+by5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSkgCisgICAgICAgICAgICBmcmVlX3JlZyhwLT5sZWZ0LT5vLnJlZyk7CisgICAgICAgIH0KKworCXBvc3RvcF9vYmo9MDsKKyAgICAgICAgcC0+bz1vOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHAtPmZsYWdzPT1DT05EKXsKKyAgICAgICAgaW50IGx0cnVlLGxmYWxzZSxsb3V0OworICAgICAgICBsdHJ1ZT0rK2xhYmVsO2xmYWxzZT0rK2xhYmVsO2xvdXQ9KytsYWJlbDsKKyAgICAgICAgZ2VuX0lDKHAtPmxlZnQsbHRydWUsbGZhbHNlKTsKKyAgICAgICAgaWYoIXAtPmxlZnQtPm8uZmxhZ3MpeworICAgICAgICAgICAgZnJlZShuZXcpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGlmKHAtPmxlZnQtPmZsYWdzIT1DRVhQUil7CisgICAgICAgICAgICAgICAgZ2VuX3Rlc3QoJnAtPmxlZnQtPm8scC0+bGVmdC0+bnR5cC0+ZmxhZ3MsQkVRLGxmYWxzZSk7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBldmFsX2NvbnN0bihwLT5sZWZ0KTsKKyAgICAgICAgICAgICAgICBpZih6bWVxdG8odm1heCxsMnptKDBMKSkmJnp1bWVxdG8odnVtYXgsdWwyenVtKDBVTCkpJiZ6bGRlcXRvKHZsZG91YmxlLGQyemxkKDAuMCkpKXsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX0lDKHAtPnJpZ2h0LT5yaWdodCwwLDApOworICAgICAgICAgICAgICAgICAgICBwLT5vPXAtPnJpZ2h0LT5yaWdodC0+bzsKKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX0lDKHAtPnJpZ2h0LT5sZWZ0LDAsMCk7CisgICAgICAgICAgICAgICAgICAgIHAtPm89cC0+cmlnaHQtPmxlZnQtPm87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBnZW5fbGFiZWwobHRydWUpOworICAgICAgICBnZW5fSUMocC0+cmlnaHQtPmxlZnQsMCwwKTsKKyAgICAgICAgaWYoKHAtPm50eXAtPmZsYWdzJk5RKSE9Vk9JRCl7CisgICAgICAgICAgICBjb252ZXJ0KHAtPnJpZ2h0LT5sZWZ0LHAtPm50eXAtPmZsYWdzKTsKKyAgICAgICAgICAgIGlmKChwLT5yaWdodC0+bGVmdC0+by5mbGFncyYoU0NSQVRDSHxEUkVGT0JKKSk9PVNDUkFUQ0gpeworICAgICAgICAgICAgICAgIHAtPm89cC0+cmlnaHQtPmxlZnQtPm87CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBnZXRfc2NyYXRjaCgmcC0+byxwLT5udHlwLT5mbGFncywwLHAtPm50eXApOworICAgICAgICAgICAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgICAgICAgICAgICBuZXctPmNvZGU9QVNTSUdOOworICAgICAgICAgICAgICAgIG5ldy0+cTE9cC0+cmlnaHQtPmxlZnQtPm87CisgICAgICAgICAgICAgICAgbmV3LT56PXAtPm87CisgICAgICAgICAgICAgICAgbmV3LT5xMi5mbGFncz0wOworICAgICAgICAgICAgICAgIG5ldy0+cTIudmFsLnZtYXg9c3pvZihwLT5udHlwKTsKKyAgICAgICAgICAgICAgICBuZXctPnR5cGY9cC0+bnR5cC0+ZmxhZ3M7CisgICAgICAgICAgICAgICAgcC0+bz1uZXctPno7CisgICAgICAgICAgICAgICAgYWRkX0lDKG5ldyk7CisgICAgICAgICAgICB9CisgICAgICAgIH1lbHNlCisJICBwLT5vLmZsYWdzPTA7CisgICAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgICAgbmV3LT5jb2RlPUJSQTsKKyAgICAgICAgbmV3LT50eXBmPWxvdXQ7CisgICAgICAgIGFkZF9JQyhuZXcpOworICAgICAgICBnZW5fbGFiZWwobGZhbHNlKTsKKyAgICAgICAgZ2VuX0lDKHAtPnJpZ2h0LT5yaWdodCwwLDApOworICAgICAgICBpZigocC0+bnR5cC0+ZmxhZ3MmTlEpIT1WT0lEKXsKKyAgICAgICAgICAgIGNvbnZlcnQocC0+cmlnaHQtPnJpZ2h0LHAtPm50eXAtPmZsYWdzKTsKKyAgICAgICAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgICAgICAgIG5ldy0+Y29kZT1BU1NJR047CisgICAgICAgICAgICBuZXctPnExPXAtPnJpZ2h0LT5yaWdodC0+bzsKKyAgICAgICAgICAgIG5ldy0+ej1wLT5vOworICAgICAgICAgICAgbmV3LT5xMi5mbGFncz0wOworICAgICAgICAgICAgbmV3LT5xMi52YWwudm1heD1zem9mKHAtPm50eXApOworICAgICAgICAgICAgbmV3LT50eXBmPXAtPm50eXAtPmZsYWdzOworICAgICAgICAgICAgYWRkX0lDKG5ldyk7CisgICAgICAgIH0KKyAgICAgICAgZ2VuX2xhYmVsKGxvdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHAtPmZsYWdzPT1CSVRGSUVMRCl7CisgICAgICBpbnQgbHNjLHJzYyxiZm87CisgICAgICBvYmogdG1wOworICAgICAgYmZvPWJmbGF5b3V0KHAtPmJmbyxwLT5iZnMscC0+bnR5cC0+ZmxhZ3MpOworICAgICAgbHNjPXptMmwoem1tdWx0KHNpemV0YWJbcC0+bnR5cC0+ZmxhZ3MmTlFdLGNoYXJfYml0KSktcC0+YmZzLWJmbzsKKyAgICAgIHJzYz1sc2MrYmZvOworICAgICAgZ2VuX0lDKHAtPmxlZnQsMCwwKTsKKyAgICAgIG5ldy0+Y29kZT1MU0hJRlQ7CisgICAgICBuZXctPnR5cGY9cC0+bnR5cC0+ZmxhZ3M7CisgICAgICBuZXctPnR5cGYyPUlOVDsKKyAgICAgIG5ldy0+cTE9cC0+bGVmdC0+bzsKKyAgICAgIG5ldy0+cTIuZmxhZ3M9S09OU1Q7CisgICAgICBuZXctPnEyLnZhbC52aW50PXptMnppKGwyem0oKGxvbmcpbHNjKSk7CisgICAgICBnZXRfc2NyYXRjaCgmbmV3LT56LG5ldy0+dHlwZiwwLDApOworICAgICAgdG1wPW5ldy0+ejsKKyAgICAgIGFkZF9JQyhuZXcpOworICAgICAgbmV3PW5ld19JQygpOworICAgICAgbmV3LT5jb2RlPVJTSElGVDsKKyAgICAgIG5ldy0+dHlwZj1wLT5udHlwLT5mbGFnczsKKyAgICAgIG5ldy0+dHlwZjI9SU5UOworICAgICAgbmV3LT5xMT10bXA7CisgICAgICBuZXctPnEyLmZsYWdzPUtPTlNUOworICAgICAgbmV3LT5xMi52YWwudmludD16bTJ6aShsMnptKChsb25nKXJzYykpOworICAgICAgbmV3LT56PXRtcDsKKyAgICAgIHAtPm89bmV3LT56OworICAgICAgYWRkX0lDKG5ldyk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHByaW50ZigiT3BlcmF0aW9uOiAlZD0lc1xuIixwLT5mbGFncyxlbmFtZVtwLT5mbGFnc10pOworICAgIGllcnJvcigwKTsKKyAgICBmcmVlKG5ldyk7CisgICAgcC0+by5mbGFncz0wOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfcmVnbGlzdChyZWdhcmdzX2xpc3QgKm5ybCxvYmogKnJhZHIpCit7CisgIElDICpuZXc7CisgIC8qICBMZXR6dGVzIEFyZ3VtZW50OyBqZXR6dCBpbiBSZWdpc3RlciBsYWRlbi4gICovCisjaWZkZWYgSEFWRV9SRUdQQVJNUworICBpbnQgZGlkcmFkcj0wOworI2VuZGlmCisgIHdoaWxlKG5ybCl7CisgICAgbmV3PW5ld19JQygpOworICAgIG5ldy0+Y29kZT1BU1NJR047CisgICAgbmV3LT50eXBmPW5ybC0+di0+dnR5cC0+ZmxhZ3MvKnxWT0xBVElMRSovOworICAgIG5ldy0+cTEuZmxhZ3M9VkFSOworICAgIG5ldy0+cTEudj1ucmwtPnY7CisgICAgbmV3LT5xMS52YWwudm1heD1sMnptKDBMKTsKKyAgICBuZXctPnEyLmZsYWdzPTA7CisgICAgbmV3LT5xMi52YWwudm1heD1zem9mKG5ybC0+di0+dnR5cCk7CisgICAgbmV3LT56LmZsYWdzPVZBUjsKKyAgICBuZXctPnoudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgbmV3LT56LnY9YWRkX3ZhcihlbXB0eSxjbG9uZV90eXAobnJsLT52LT52dHlwKSxBVVRPLDApOworICAgIG5ldy0+ei52LT5yZWc9bnJsLT5yZWc7CisgICAgbmV3LT56LnYtPnZ0eXAtPmZsYWdzfD1WT0xBVElMRTsKKyAgICBucmwtPnY9bmV3LT56LnY7CisgICAgYWRkX0lDKG5ldyk7CisgICAgCisjaWZkZWYgSEFWRV9SRUdQQVJNUworICAgIGlmKHJhZHImJiFkaWRyYWRyKXsKKyAgICAgIGRpZHJhZHI9MTsKKyAgICB9ZWxzZXsKKyNlbmRpZgorICAgICAgbnJsLT5hbC0+cHVzaGljPW5ldzsKKyAgICAgIGZpeF9wdXNoaWMoJm5ybC0+YWwtPnB1c2hpYyxuZXcpOworI2lmZGVmIEhBVkVfUkVHUEFSTVMKKyAgICB9CisjZW5kaWYKKyAgICBucmw9bnJsLT5uZXh0OworICB9Cit9CisKKyNpZmRlZiBIQVZFX1JFR1BBUk1TCit6bWF4IHB1c2hfYXJncyhhcmd1bWVudF9saXN0ICphbCxzdHJ1Y3RfZGVjbGFyYXRpb24gKnNkLGludCBuLHJlZ2FyZ3NfbGlzdCAqKnJsLHRyZWdfaGFuZGxlICpyZWdfaGFuZGxlLG9iaiAqcmFkcix0eXBlICpydHlwZSxpbnQgcnJlZyx0eXBlICpma3QpCisjZWxzZQorem1heCBwdXNoX2FyZ3MoYXJndW1lbnRfbGlzdCAqYWwsc3RydWN0X2RlY2xhcmF0aW9uICpzZCxpbnQgbixyZWdhcmdzX2xpc3QgKipybCkKKyNlbmRpZgorLyogIExlZ3QgZGllIEFyZ3VtZW50ZSBlaW5lcyBGdW5rdGlvbnNhdWZydWZzIGluIHVtZ2VrZWhydGVyIFJlaWhlbmZvbGdlICAgICovCisvKiAgYXVmIGRlbiBTdGFjay4gRXMgd2lyZCBJbnRlZ2VyLUVyd2VpdGVydW5nIHZvcmdlbm9tbWVuIHVuZCBmbG9hdCB3aXJkICAgKi8KKy8qICBuYWNoIGRvdWJsZSBrb252ZXJ0aWVydCwgZmFsbHMga2VpbiBQcm90b3R5cGUgZGEgaXN0LiAgICAgICAgICAgICAgICAgICAqLworeworICAgIGludCB0LHJlZyxyZWdwdXNoLGV2YWx1YXRlZD0wO3R5cGUgKmZ0OworICAgIElDICpuZXc7cmVnYXJnc19saXN0ICpucmw7em1heCBzeixyc3osb2Y7b2JqICphcmc7CisjaWZkZWYgSEFWRV9SRUdQQVJNUworICAgIGludCBzdGRyZWc7CisgICAgaWYoIWFsJiYhcmFkcikgcmV0dXJuKDApOworICAgIGlmKHJhZHIpeworICAgICAgc3RkcmVnPXJyZWc7CisgICAgfWVsc2V7CisgICAgICBpZihuPHNkLT5jb3VudCl7CisgICAgICAgIHN0ZHJlZz1yZWdfcGFybShyZWdfaGFuZGxlLCgqc2QtPnNsKVtuXS5zdHlwLDAsZmt0LT5uZXh0KTsKKyAgICAgIH1lbHNleworICAgICAgICBpZihzZC0+Y291bnQpCisgICAgICAgICAgc3RkcmVnPXJlZ19wYXJtKHJlZ19oYW5kbGUsYWwtPmFyZy0+bnR5cCwxLGZrdC0+bmV4dCk7CisgICAgICAgIGVsc2V7CisJICBpZihzaG9ydF9wdXNoJiZJU0lOVChhbC0+YXJnLT5udHlwLT5mbGFncykpeworCSAgICBzdGF0aWMgdHlwZSB0OworCSAgICB0LmZsYWdzPWludF9lcncoYWwtPmFyZy0+bnR5cC0+ZmxhZ3MpOworCSAgICBzdGRyZWc9cmVnX3Bhcm0ocmVnX2hhbmRsZSwmdCwwLGZrdC0+bmV4dCk7CisJICB9ZWxzZXsKKwkgICAgc3RkcmVnPXJlZ19wYXJtKHJlZ19oYW5kbGUsYWwtPmFyZy0+bnR5cCwwLGZrdC0+bmV4dCk7CisJICB9CisJfQorICAgICAgfQorICAgIH0KKyAgICByZWc9c3RkcmVnOworI2Vsc2UKKyAgICBpZighYWwpIHJldHVybigwKTsKKyAgICByZWc9MDsKKyNlbmRpZgorI2lmZGVmIEhBVkVfUkVHUEFSTVMKKyAgICBpZighcmFkcil7CisjZW5kaWYKKyAgICAgIGlmKCFhbC0+YXJnKSBpZXJyb3IoMCk7CisgICAgICBpZighc2QpIGllcnJvcigwKTsKKyAgICAgIGlmKG48c2QtPmNvdW50KXsKKyAgICAgICAgZnQ9Y2xvbmVfdHlwKCgqc2QtPnNsKVtuXS5zdHlwKTtzej1zem9mKGZ0KTsKKwl0PWZ0LT5mbGFnczsKKyAgICAgICAgcmVnPSgqc2QtPnNsKVtuXS5yZWc7CisgICAgICB9ZWxzZXsKKyAgICAgICAgZnQ9Y2xvbmVfdHlwKGFsLT5hcmctPm50eXApO3N6PXN6b2YoZnQpOworCXQ9ZnQtPmZsYWdzOworICAgICAgfQorICAgICAgaWYoSVNJTlQodCkpeworCWlmKG4+PXNkLT5jb3VudHx8IXNob3J0X3B1c2gpCisJICB0PWludF9lcncodCk7CisJZnQtPmZsYWdzPXQ7CisJc3o9c2l6ZXRhYlt0Jk5RXTsKKyAgICAgIH0KKyAgICAgIGlmKCh0Jk5RKT09RkxPQVQmJm4+PXNkLT5jb3VudCkge3Q9RE9VQkxFO2Z0LT5mbGFncz10O3N6PXNpemV0YWJbdCZOUV07fQorI2lmZGVmIEhBVkVfUkVHUEFSTVMKKyAgICB9ZWxzZXsKKyAgICAgIGZ0PW5ld190eXAoKTsKKyAgICAgIGZ0LT5mbGFncz10PVBPSU5URVJfVFlQRShydHlwZSk7CisgICAgICBmdC0+bmV4dD1jbG9uZV90eXAocnR5cGUpOworICAgICAgc3o9c2l6ZXRhYlt0Jk5RXTsKKyAgICB9CisjZW5kaWYKKyAgICBpZihyZWc8MCkge3JlZz0tcmVnO3JlZ3B1c2g9MTt9IGVsc2UgcmVncHVzaD0wOworICAgIHJzej1zejsKKyAgICBzej16bW11bHQoem1kaXYoem1hZGQoc3osem1zdWIoc3RhY2thbGlnbixsMnptKDFMKSkpLHN0YWNrYWxpZ24pLHN0YWNrYWxpZ24pOworI2lmZGVmIE9SREVSRURfUFVTSAorICAgIGlmKHJlZz09MHx8cmVncHVzaCl7CisgICAgICBuZXc9bmV3X0lDKCk7CisjaWZkZWYgSEFWRV9SRUdQQVJNUworICAgICAgaWYoIXJhZHImJiFldmFsdWF0ZWQpeworI2VuZGlmCisgICAgICAgIGdlbl9JQyhhbC0+YXJnLDAsMCk7CisgICAgICAgIGNvbnZlcnQoYWwtPmFyZyx0KTsKKyAgICAgICAgZXZhbHVhdGVkPTE7CisgICAgICAgIG5ldy0+cTE9YWwtPmFyZy0+bzsKKwlhbC0+cHVzaGljPW5ldzsKKyNpZmRlZiBIQVZFX1JFR1BBUk1TCisgICAgICB9ZWxzZQorICAgICAgICBuZXctPnExPSpyYWRyOworI2VuZGlmCisgICAgICAvKiAgUGFyYW1ldGVydWViZXJnYWJlIHVlYmVyIFN0YWNrLiAqLworICAgICAgbmV3LT5jb2RlPVBVU0g7CisgICAgICBuZXctPnR5cGY9dDsKKyAgICAgIG5ldy0+aXR5cD1mdDsKKyAgICAgIG5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CisgICAgICBuZXctPnEyLnZhbC52bWF4PXN6OworICAgICAgbmV3LT56LnZhbC52bWF4PXJzejsKKyAgICAgIGlmKHJlZ3B1c2gpeworICAgICAgICBpZihjX2ZsYWdzWzI2XSZVU0VERkxBRyl7CisgICAgICAgICAgbmV3LT5xMS5hbT1uZXctPnEyLmFtPW5ldy0+ei5hbT0wOworICAgICAgICAgIG5ldy0+bGluZT1saW5lOyBuZXctPmZpbGU9ZmlsZW5hbWU7CisgICAgICAgICAgaW5zZXJ0X0lDKGxhc3RfaWMsbmV3KTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgbmV3LT5xMS5mbGFncz0wOworICAgICAgICAgIGFkZF9JQyhuZXcpOworCSAgaWYoYWwpIGZpeF9wdXNoaWMoJmFsLT5wdXNoaWMsbmV3KTsKKyAgICAgICAgfQorICAgICAgfWVsc2V7CisgICAgICAgIGFkZF9JQyhuZXcpOworCWlmKGFsKSBmaXhfcHVzaGljKCZhbC0+cHVzaGljLG5ldyk7CisgICAgICB9CisgICAgICBvcHVzaGVkKys7CisgICAgICBpZighZmlyc3RfcHVzaGVkJiYhbm9jb2RlKSBmaXJzdF9wdXNoZWQ9bmV3OworICAgICAgaWYoYWwmJiFhbC0+bmV4dCYmIXJlZ3B1c2gpIHJldHVybiBzejsKKyAgICB9CisjZW5kaWYKKyNpZmRlZiBIQVZFX1JFR1BBUk1TCisgICAgaWYocmFkcil7CisgICAgICBpZihhbCkgb2Y9cHVzaF9hcmdzKGFsLHNkLDAscmwscmVnX2hhbmRsZSwwLDAsMCxma3QpOyBlbHNlIG9mPWwyem0oMEwpOworICAgIH1lbHNleworICAgICAgaWYoYWwtPm5leHQpIG9mPXB1c2hfYXJncyhhbC0+bmV4dCxzZCxuKzEscmwscmVnX2hhbmRsZSwwLDAsMCxma3QpOyBlbHNlIG9mPWwyem0oMEwpOworICAgIH0KKyNlbHNlCisgICAgaWYoYWwtPm5leHQpIG9mPXB1c2hfYXJncyhhbC0+bmV4dCxzZCxuKzEscmwpOyBlbHNlIG9mPWwyem0oMEwpOworI2VuZGlmCisjaWZkZWYgT1JERVJFRF9QVVNICisgICAgaWYocmVnPT0wKSByZXR1cm4gem1hZGQob2Ysc3opOworI2VuZGlmCisKKyAgICBpZihyZWdwdXNoKSBvZj16bWFkZChvZixzeik7CisKKyNpZmRlZiBIQVZFX1JFR1BBUk1TCisgICAgaWYocmFkcil7CisgICAgICBhcmc9cmFkcjsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKCFldmFsdWF0ZWQpeworICAgICAgICBnZW5fSUMoYWwtPmFyZywwLDApOworICAgICAgICBjb252ZXJ0KGFsLT5hcmcsdCk7CisgICAgICAgIGV2YWx1YXRlZD0xOworICAgICAgfQorICAgICAgYXJnPSZhbC0+YXJnLT5vOworICAgIH0KKyNlbHNlCisgICAgaWYoIWV2YWx1YXRlZCl7CisgICAgICBnZW5fSUMoYWwtPmFyZywwLDApOworICAgICAgY29udmVydChhbC0+YXJnLHQpOworICAgICAgZXZhbHVhdGVkPTE7CisgICAgfQorICAgIGFyZz0mYWwtPmFyZy0+bzsKKyNlbmRpZgorI2lmbmRlZiBPUkRFUkVEX1BVU0gKKyAgICBpZihyZWc9PTB8fHJlZ3B1c2gpeworICAgICAgICAvKiAgUGFyYW1ldGVydWViZXJnYWJlIHVlYmVyIFN0YWNrLiAqLworICAgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICAgIG5ldy0+Y29kZT1QVVNIOworICAgICAgICBuZXctPnR5cGY9dDsKKyAgICAgICAgbmV3LT5xMT0qYXJnOworICAgICAgICBpZihyZWdwdXNoJiYhKGNfZmxhZ3NbMjZdJlVTRURGTEFHKSkgbmV3LT5xMS5mbGFncz0wOworICAgICAgICBuZXctPnEyLmZsYWdzPW5ldy0+ei5mbGFncz0wOworICAgICAgICBuZXctPnEyLnZhbC52bWF4PXN6OworCW5ldy0+ei52YWwudm1heD1yc3o7CisgICAgICAgIGFkZF9JQyhuZXcpOworCWFsLT5wdXNoaWM9bmV3OworCWZpeF9wdXNoaWMoJmFsLT5wdXNoaWMsbmV3KTsKKyAgICAgICAgaWYoIXJlZ3B1c2gpIHJldHVybih6bWFkZChvZixzeikpOworICAgIH0KKyNlbmRpZgorICAgIGlmKHJlZyl7CisgICAgICAgIC8qICBQYXJhbWV0ZXJ1ZWJlcmdhYmUgaW4gUmVnaXN0ZXIuICovCisgICAgICAgIFZhciAqdj0wOyB0eXBlICp0MjsKKwlpbnQgcnNhdmVkPTA7CisgICAgICAgIGlmKG9wdGZsYWdzJjIpeworICAgICAgICAvKiAgVmVyc2lvbiBmdWVyIE9wdGltaXplci4gKi8KKyAgICAgICAgICAgIHQyPW5ld190eXAoKTsKKyAgICAgICAgICAgIHQyLT5mbGFncz10OworICAgICAgICAgICAgaWYoSVNQT0lOVEVSKHQpKXsKKyAgICAgICAgICAgICAgICB0Mi0+bmV4dD1uZXdfdHlwKCk7CisgICAgICAgICAgICAgICAgdDItPm5leHQtPmZsYWdzPVZPSUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2PWFkZF92YXIoZW1wdHksdDIsQVVUTywwKTsKKyAgICAgICAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgICAgICAgIG5ldy0+Y29kZT1BU1NJR047CisgICAgICAgICAgICBuZXctPnR5cGY9dDsKKyAgICAgICAgICAgIG5ldy0+cTE9KmFyZzsKKyAgICAgICAgICAgIG5ldy0+cTIuZmxhZ3M9MDsKKyAgICAgICAgICAgIG5ldy0+cTIudmFsLnZtYXg9c2l6ZXRhYlt0Jk5RXTsKKyAgICAgICAgICAgIG5ldy0+ei5mbGFncz1WQVI7CisgICAgICAgICAgICBuZXctPnoudj12OworICAgICAgICAgICAgbmV3LT56LnZhbC52bWF4PWwyem0oMEwpOworICAgICAgICAgICAgYWRkX0lDKG5ldyk7CisgICAgICAgICAgICBucmw9bXltYWxsb2Moc2l6ZW9mKCpucmwpKTsKKyAgICAgICAgICAgIG5ybC0+bmV4dD0qcmw7CisgICAgICAgICAgICBucmwtPnJlZz1yZWc7CisgICAgICAgICAgICBucmwtPnY9djsKKwkgICAgbnJsLT5hbD1hbDsKKyAgICAgICAgICAgICpybD1ucmw7CisgICAgICAgICAgICByZXR1cm4gb2Y7CisgICAgICAgIH1lbHNleworICAgICAgICAvKiAgTmljaHQtb3B0aW1pZXJlbmRlIFZlcnNpb24uICovCisKKwkgIGlmKERFQlVHJjE2KXsKKwkgICAgcHJpbnRmKCJyZWdbJXNdPSVkICIscmVnbmFtZXNbcmVnXSxyZWdzW3JlZ10pOworCSAgICBpZihyZWdfcGFpcihyZWcsJnJwKSkKKwkgICAgICBwcmludGYoInJlZ1slc109JWQgcmVnWyVzXT0lZCAiLHJlZ25hbWVzW3JwLnIxXSxyZWdzW3JwLnIxXSxyZWduYW1lc1tycC5yMl0scmVnc1tycC5yMl0pOworCSAgICBwcmludGYoIlxuIik7CisJICB9CisJICBpZihyZWdfcGFpcihyZWcsJnJwKSYmKGFyZy0+ZmxhZ3MmKFJFR3xTQ1JBVENIKSk9PShSRUd8U0NSQVRDSCkmJihhcmctPnJlZz09cnAucjF8fGFyZy0+cmVnPT1ycC5yMikpeworCSAgICAvKiByeC0+cmVnX3BhaXIocngscnkpOiBtYWtlIGEgY29weSAqLworCSAgICBuZXc9bmV3X0lDKCk7CisJICAgIG5ldy0+Y29kZT1BU1NJR047CisJICAgIG5ldy0+dHlwZj10OworCSAgICBuZXctPnExPSphcmc7CisJICAgIG5ldy0+cTIuZmxhZ3M9MDsKKwkgICAgbmV3LT5xMi52YWwudm1heD1zaXpldGFiW3QmTlFdOworCSAgICBzY3JhdGNoX3ZhcigmbmV3LT56LHQsMCk7CisJICAgIGFkZF9JQyhuZXcpOworCSAgICAqYXJnPW5ldy0+ejsKKwkgICAgZnJlZV9yZWcoYXJnLT5yZWcpOworCSAgfQorCSAgaWYoIXJlZ3NbcmVnXSYmKCFyZWdfcGFpcihyZWcsJnJwKXx8KCFyZWdzW3JwLnIxXSYmIXJlZ3NbcnAucjJdKSkmJiFub2NvZGUpeworCSAgICBuZXc9bmV3X0lDKCk7CisJICAgIG5ldy0+Y29kZT1BTExPQ1JFRzsKKwkgICAgbmV3LT50eXBmPTA7CisJICAgIG5ldy0+cTEuZmxhZ3M9UkVHOworCSAgICBuZXctPnExLnJlZz1yZWc7CisJICAgIG5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CisJICAgIGFkZF9JQyhuZXcpOworCSAgICByZWdzW3JlZ109KDF8Uk5PU0FWRSk7cmVndXNlZFtyZWddKys7CisJICAgIGlmKERFQlVHJjE2KSBwcmludGYoImFsbG9jYXRlZCAlcyAoMSlcbiIscmVnbmFtZXNbcmVnXSk7CisJICAgIGlmKHJlZ19wYWlyKHJlZywmcnApKXsKKwkgICAgICByZWdzW3JwLnIxXT0xfFJOT1NBVkU7cmVndXNlZFtycC5yMV0rKzsKKwkgICAgICByZWdzW3JwLnIyXT0xfFJOT1NBVkU7cmVndXNlZFtycC5yMl0rKzsKKwkgICAgfQorCSAgfWVsc2UgaWYoIXJlZ3NbcmVnXSYmcmVnX3BhaXIocmVnLCZycCkmJihyZWdzW3JwLnIxXXx8cmVnc1tycC5yMl0pJiYhbm9jb2RlKXsKKwkgICAgaW50IHI9MDsKKwkgICAgcmVnYXJnc19saXN0ICpwOworCisJICAgIG5ldz1uZXdfSUMoKTsKKwkgICAgbmV3LT5jb2RlPUFMTE9DUkVHOworCSAgICBuZXctPnR5cGY9MDsKKwkgICAgbmV3LT5xMS5mbGFncz1SRUc7CisJICAgIG5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CisJICAgIGlmKHJlZ3NbcnAucjFdKXsKKwkgICAgICBuZXctPnExLnJlZz1ycC5yMjsKKwkgICAgICByPXJwLnIxOworCSAgICAgIHJlZ3Nbcl18PVJIQUxGOworCSAgICB9ZWxzZXsKKwkgICAgICBuZXctPnExLnJlZz1ycC5yMTsKKwkgICAgICByPXJwLnIyOworCSAgICAgIHJlZ3Nbcl18PVJIQUxGOworCSAgICB9CisJICAgIHJlZ3NbbmV3LT5xMS5yZWddPSgxfFJOT1NBVkUpO3JlZ3VzZWRbbmV3LT5xMS5yZWddKys7CisJICAgIHJlZ3NbcmVnXT0oMXxSTk9TQVZFKTtyZWd1c2VkW3JlZ10rKzsKKwkgICAgYWRkX0lDKG5ldyk7CisJICAgIGlmKERFQlVHJjE2KSBwcmludGYoImFsbG9jYXRlZCAlcyAoaGFsZilcbiIscmVnbmFtZXNbbmV3LT5xMS5yZWddKTsKKwkgICAgcnNhdmVkPXI7CisJICAgIC8qIFRlc3Rlbiwgb2IgUXVlbGxyZWdpc3RlciBnZXNpY2hlcnQgd3VyZGUuIFVuc2Nob2VuLiAqLworCSAgICBmb3IocD0qcmw7cDtwPXAtPm5leHQpeworCSAgICAgIGludCByaTsKKwkgICAgICBpZihwLT52JiYocmk9YWJzKHAtPnJlZykpKXsKKwkJaWYocmk9PXIpIGJyZWFrOworCQlpZihyZWdfcGFpcihyaSwmcnApJiYocnAucjE9PXJ8fHJwLnIyPT1yKSkgYnJlYWs7CisJICAgICAgfQorCSAgICB9CisJICAgIAorCSAgICBpZihyJiYhcCl7CisJICAgICAgdDI9Y2xvbmVfdHlwKHJlZ3R5cGVbcl0pOworCSAgICAgIHY9YWRkX3ZhcihlbXB0eSx0MixBVVRPLDApOworCSAgICAgIHYtPmZsYWdzfD1VU0VEQVNBRFI7CisJICAgICAgbmV3PW5ld19JQygpOworCSAgICAgIG5ldy0+Y29kZT1NT1ZFRlJPTVJFRzsKKwkgICAgICBuZXctPnR5cGY9MDsKKwkgICAgICBuZXctPnExLmZsYWdzPVJFRzsKKwkgICAgICBuZXctPnExLnJlZz1yOworCSAgICAgIG5ldy0+cTIuZmxhZ3M9MDsKKwkgICAgICBuZXctPnEyLnZhbC52bWF4PXJlZ3NpemVbcl07CisJICAgICAgbmV3LT56LmZsYWdzPVZBUnxET05UUkVHSVNURVJJWkU7CisJICAgICAgbmV3LT56LnY9djsKKwkgICAgICBuZXctPnoudmFsLnZtYXg9bDJ6bSgwTCk7CisJICAgICAgYWRkX0lDKG5ldyk7CisJICAgIH0KKwkgIH1lbHNleworCSAgICBpZigoYXJnLT5mbGFncyYoUkVHfFNDUkFUQ0gpKSE9KFJFR3xTQ1JBVENIKXx8YXJnLT5yZWchPXJlZyl7CisJICAgICAgaW50IHI9MDsKKyAgICAgICAgICAgICAgcmVnYXJnc19saXN0ICpwOworCisJICAgICAgLyogcmVnaXN0ZXIgcGFpcnMgKi8KKwkgICAgICBpZihyZWdfcGFpcihyZWcsJnJwKSl7CisJCWlmKHJlZ3NbcmVnXXx8cmVnc1tycC5yMV18fHJlZ3NbcnAucjJdKSAKKwkJICByPXJlZzsKKwkgICAgICB9ZWxzZXsKKwkJZm9yKHI9TUFYUjtyPj0xO3ItLSl7CisJCSAgaWYocmVnc1tyXSYmcmVnX3BhaXIociwmcnApJiYocnAucjE9PXJlZ3x8cnAucjI9PXJlZykpCisJCSAgICBicmVhazsKKwkJfQorCQlpZihyPDEpIHI9cmVnOworCSAgICAgIH0KKworCisgICAgICAgICAgICAgIC8qIFRlc3Rlbiwgb2IgUXVlbGxyZWdpc3RlciBnZXNpY2hlcnQgd3VyZGUuIFVuc2Nob2VuLiAqLworICAgICAgICAgICAgICBmb3IocD0qcmw7cDtwPXAtPm5leHQpeworICAgICAgICAgICAgICAgIGludCByaTsKKyAgICAgICAgICAgICAgICBpZihwLT52JiYocmk9YWJzKHAtPnJlZykpKXsKKyAgICAgICAgICAgICAgICAgIGlmKHJpPT1yfHwocmVnX3BhaXIociwmcnApJiYocnAucjE9PXJpfHxycC5yMj09cmkpKSkge2JyZWFrO30KKyAgICAgICAgICAgICAgICAgIGlmKHJlZ19wYWlyKHJpLCZycCkmJihycC5yMT09cnx8cnAucjI9PXIpKSB7YnJlYWs7fQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGlmKHImJiFwKXsKKyAgICAgICAgICAgICAgICB0Mj1jbG9uZV90eXAocmVndHlwZVtyXSk7CisgICAgICAgICAgICAgICAgdj1hZGRfdmFyKGVtcHR5LHQyLEFVVE8sMCk7CisgICAgICAgICAgICAgICAgdi0+ZmxhZ3N8PVVTRURBU0FEUjsKKyAgICAgICAgICAgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICAgICAgICAgICAgbmV3LT5jb2RlPU1PVkVGUk9NUkVHOworICAgICAgICAgICAgICAgIG5ldy0+dHlwZj0wOworICAgICAgICAgICAgICAgIG5ldy0+cTEuZmxhZ3M9UkVHOworICAgICAgICAgICAgICAgIG5ldy0+cTEucmVnPXI7CisgICAgICAgICAgICAgICAgbmV3LT5xMi5mbGFncz0wOworICAgICAgICAgICAgICAgIG5ldy0+cTIudmFsLnZtYXg9cmVnc2l6ZVtyXTsKKyAgICAgICAgICAgICAgICBuZXctPnouZmxhZ3M9VkFSfERPTlRSRUdJU1RFUklaRTsKKyAgICAgICAgICAgICAgICBuZXctPnoudj12OworICAgICAgICAgICAgICAgIG5ldy0+ei52YWwudm1heD1sMnptKDBMKTsKKyAgICAgICAgICAgICAgICBhZGRfSUMobmV3KTsKKyAgICAgICAgICAgICAgfQorCSAgICB9ZWxzZXsKKwkgICAgICByZWdzW3JlZ118PVJOT1NBVkU7CisJICAgIH0KKwkgIH0KKwkgIG5ldz1uZXdfSUMoKTsKKyNpZmRlZiBIQVZFX1JFR1BBUk1TCisJICAgIGlmKCFyYWRyKXsKKwkgICAgICBhbC0+cHVzaGljPW5ldzsKKwkgICAgfQorI2Vsc2UKKwkgICAgYWwtPnB1c2hpYz1uZXc7CisjZW5kaWYKKwkgICAgbmV3LT5jb2RlPUFTU0lHTjsKKwkgICAgbmV3LT50eXBmPXQ7CisgICAgICAgICAgICBuZXctPnExPSphcmc7CisgICAgICAgICAgICAvKiBUZXN0ZW4sIG9iIFF1ZWxscmVnaXN0ZXIgZ2VzaWNoZXJ0IHd1cmRlLiBVbnNjaG9lbi4gKi8KKyAgICAgICAgICAgIGlmKChuZXctPnExLmZsYWdzJlJFRykpeworICAgICAgICAgICAgICByZWdhcmdzX2xpc3QgKnA7CisgICAgICAgICAgICAgIGZvcihwPSpybDtwO3A9cC0+bmV4dCl7CisJCWludCByOworICAgICAgICAgICAgICAgIGlmKHAtPnYmJihyPWFicyhwLT5yZWcpKSl7CisJCSAgaWYobmV3LT5xMS5yZWc9PXJ8fChyZWdfcGFpcihuZXctPnExLnJlZywmcnApJiYocnAucjE9PXJ8fHJwLnIyPT1yKSkpIHtuZXctPnExLnY9cC0+djtuZXctPnExLnZhbC52bWF4PWwyem0oMEwpO2JyZWFrO30KKwkJICAvKkZJWE1FOiBhbmRlcnNydW0gYmVpIExJVFRMRUVORElBTj8/ICovCisJCSAgaWYocmVnX3BhaXIociwmcnApJiZycC5yMT09bmV3LT5xMS5yZWcpIHtuZXctPnExLnY9cC0+djtuZXctPnExLnZhbC52bWF4PWwyem0oMEwpO2JyZWFrO30KKwkJICBpZihyZWdfcGFpcihyLCZycCkmJnJwLnIyPT1uZXctPnExLnJlZykge25ldy0+cTEudj1wLT52O25ldy0+cTEudmFsLnZtYXg9cmVnc2l6ZVtycC5yMV07YnJlYWs7fQorCisJCX0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZihwJiZuZXctPnExLnYpeworCQlpZighKG5ldy0+cTEuZmxhZ3MmRFJFRk9CSikmJm11c3RfY29udmVydChuZXctPnR5cGYscmVndHlwZVtuZXctPnExLnJlZ10tPmZsYWdzLDApKXsKKwkJICBuZXctPmNvZGU9Q09OVkVSVDsKKwkJICBuZXctPnR5cGYyPXJlZ3R5cGVbbmV3LT5xMS5yZWddLT5mbGFnczsKKwkJfQorICAgICAgICAgICAgICAgIG5ldy0+cTEuZmxhZ3MmPX5SRUc7CisgICAgICAgICAgICAgICAgbmV3LT5xMS5mbGFnc3w9VkFSOworICAgICAgICAgICAgICAgIC8qbmV3LT5xMS52YWwudm1heD1sMnptKDBMKTsqLworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXctPnEyLmZsYWdzPW5ldy0+ei5mbGFncz0wOworICAgICAgICAgICAgbmV3LT5xMi52YWwudm1heD1zaXpldGFiW3QmTlFdOworICAgICAgICAgICAgbmV3LT56LmZsYWdzPVJFRzsKKyAgICAgICAgICAgIG5ldy0+ei5yZWc9cmVnOworICAgICAgICAgICAgYWRkX0lDKG5ldyk7CisJICAgIGlmKGFsKSBmaXhfcHVzaGljKCZhbC0+cHVzaGljLG5ldyk7CisgICAgICAgICAgICBucmw9bXltYWxsb2Moc2l6ZW9mKCpucmwpKTsKKyAgICAgICAgICAgIG5ybC0+bmV4dD0qcmw7CisgICAgICAgICAgICBucmwtPnJlZz1yZWc7CisgICAgICAgICAgICBucmwtPnY9djsKKwkgICAgbnJsLT5yc2F2ZWQ9cnNhdmVkOyAvKiBpZiBvbmx5IHBhcnQgb2YgYSBwYWlyIHdhcyBzYXZlZCAqLworCSAgICByc2F2ZWQ9MDsKKyAgICAgICAgICAgICpybD1ucmw7CisgICAgICAgICAgICByZXR1cm4gb2Y7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgY29udmVydChucCBwLGludCBmKQorLyogIGtvbnZlcnRpZXJ0IGRhcyBPYmpla3QgaW4gcC0+byBpbiBiZXN0aW1tdGVuIFR5cCAgICAqLworLyogd2VubiB2b2xhdGlsZV9jb252ZXJ0IGdlc2V0enQgaXN0LCB3aXJkIGltbWVyIElDIGVyemV1Z3QgKi8KK3sKKyAgSUMgKm5ldzsKKyAgaW50IG89cC0+bnR5cC0+ZmxhZ3M7CisgIGludCB0byx0bixtYyxkcjsKKyAgc3RhdGljIG5vZGUgbixubjsKKyAgc3RhdGljIHR5cGUgbnQ7CisgIGNoYXIgKmxpYm5hbWU7CisgIGlmKChmJk5RKT09Vk9JRCkgcmV0dXJuOworCisgIGlmKHAtPmZsYWdzPT1DRVhQUnx8cC0+ZmxhZ3M9PVBDRVhQUil7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgZXZhbF9jb25zdG4ocCk7CisgICAgcC0+bnR5cC0+ZmxhZ3M9ZjsKKyAgICBpbnNlcnRfY29uc3RuKHApOworICAgIHAtPm8udmFsPXAtPnZhbDsKKyAgICByZXR1cm47CisgIH0KKyAgaWYoKEFWT0lEX0ZMT0FUX1RPX1VOU0lHTkVEJiZJU0ZMT0FUKG8pJiYoZiZVTlNJR05FRCkpfHwKKyAgICAgKEFWT0lEX1VOU0lHTkVEX1RPX0ZMT0FUJiZJU0ZMT0FUKGYpJiYobyZVTlNJR05FRCkpKXsKKyAgICB1bmlvbiBhdHlwcyB2YWw7CisgICAgaW50IGwxLGwyLGl0OworICAgIFZhciAqdG1wOworICAgIG5wIHQ7CisgICAgdHlwZSAqdHR5cDsKKyAgICBpZihmJlVOU0lHTkVEKQorICAgICAgaXQ9ZiZOUTsKKyAgICBlbHNlCisgICAgICBpdD1vJk5ROworICAgIHR0eXA9Y2xvbmVfdHlwKHAtPm50eXApOworICAgIHR0eXAtPmZsYWdzPWY7CisgICAgdG1wPWFkZF90bXBfdmFyKHR0eXApOworICAgIG5ldz1uZXdfSUMoKTsKKyAgICBuZXctPmNvZGU9Q09NUEFSRTsKKyAgICBuZXctPnR5cGY9bzsKKyAgICBuZXctPnExPXAtPm87CisgICAgbmV3LT5xMS5mbGFncyY9flNDUkFUQ0g7CisgICAgbmV3LT5xMi5mbGFncz1LT05TVDsKKyAgICBuZXctPnEyLnZhbC52dW1heD10X21heFtpdF07CisgICAgZXZhbF9jb25zdCgmbmV3LT5xMi52YWwsTUFYSU5UfFVOU0lHTkVEKTsKKyAgICBpbnNlcnRfY29uc3QoJm5ldy0+cTIudmFsLG8pOworICAgIHZhbD1uZXctPnEyLnZhbDsKKyAgICBhZGRfSUMobmV3KTsKKyAgICBuZXc9bmV3X0lDKCk7CisgICAgbmV3LT5jb2RlPUJMRTsKKyAgICBsMT0rK2xhYmVsOworICAgIG5ldy0+dHlwZj1sMTsKKyAgICBhZGRfSUMobmV3KTsKKyAgICBuZXc9bmV3X0lDKCk7CisgICAgbmV3LT5jb2RlPVNVQjsKKyAgICBuZXctPnR5cGY9bzsKKyAgICBuZXctPnExPXAtPm87CisgICAgbmV3LT5xMS5mbGFncyY9flNDUkFUQ0g7CisgICAgbmV3LT5xMi5mbGFncz1LT05TVDsKKyAgICBuZXctPnEyLnZhbD12YWw7CisgICAgbmV3LT56LmZsYWdzPVZBUjsKKyAgICBnZXRfc2NyYXRjaCgmbmV3LT56LG8sMCwwKTsKKyAgICB0PW5ld19ub2RlKCk7CisgICAgdC0+bnR5cD1jbG9uZV90eXAocC0+bnR5cCk7CisgICAgdC0+bnR5cC0+ZmxhZ3MmPX5VTlNJR05FRDsKKyAgICB0LT5vPW5ldy0+ejsKKyAgICBhZGRfSUMobmV3KTsKKyAgICBjb252ZXJ0KHQsZiZOUSk7CisgICAgbmV3PW5ld19JQygpOworICAgIG5ldy0+Y29kZT1BREQ7CisgICAgbmV3LT50eXBmPWY7CisgICAgbmV3LT5xMT10LT5vOworICAgIG5ldy0+cTEuZmxhZ3MmPX5TQ1JBVENIOworICAgIGZyZWV0eXAodC0+bnR5cCk7CisgICAgZnJlZSh0KTsKKyAgICBuZXctPnEyLmZsYWdzPUtPTlNUOworICAgIG5ldy0+cTIudmFsLnZ1bWF4PXRfbWF4W2l0XTsKKyAgICBldmFsX2NvbnN0KCZuZXctPnEyLnZhbCxNQVhJTlR8VU5TSUdORUQpOworICAgIGluc2VydF9jb25zdCgmbmV3LT5xMi52YWwsZik7CisgICAgbmV3LT56LmZsYWdzPVZBUjsKKyAgICBuZXctPnoudj10bXA7CisgICAgbmV3LT56LnZhbC52bWF4PWwyem0oMEwpOworICAgIGFkZF9JQyhuZXcpOworICAgIG5ldz1uZXdfSUMoKTsKKyAgICBuZXctPmNvZGU9QlJBOworICAgIGwyPSsrbGFiZWw7CisgICAgbmV3LT50eXBmPWwyOworICAgIGFkZF9JQyhuZXcpOworICAgIG5ldz1uZXdfSUMoKTsKKyAgICBuZXctPmNvZGU9TEFCRUw7CisgICAgbmV3LT50eXBmPWwxOworICAgIGFkZF9JQyhuZXcpOworICAgIHAtPm50eXAtPmZsYWdzJj1+VU5TSUdORUQ7CisgICAgY29udmVydChwLGYmTlEpOworICAgIG5ldz1uZXdfSUMoKTsKKyAgICBuZXctPmNvZGU9QVNTSUdOOworICAgIG5ldy0+dHlwZj1mOworICAgIG5ldy0+cTE9cC0+bzsKKyAgICBuZXctPnouZmxhZ3M9VkFSOworICAgIG5ldy0+ei52PXRtcDsKKyAgICBuZXctPnoudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgbmV3LT5xMi52YWwudm1heD1zaXpldGFiW2YmTlFdOworICAgIHAtPm89bmV3LT56OworICAgIHAtPm50eXAtPmZsYWdzPWY7CisgICAgYWRkX0lDKG5ldyk7CisgICAgbmV3PW5ld19JQygpOworICAgIG5ldy0+Y29kZT1MQUJFTDsKKyAgICBuZXctPnR5cGY9bDI7CisgICAgYWRkX0lDKG5ldyk7CisgICAgcmV0dXJuOworICB9CisgIGlmKElTVkVDVE9SKGYpJiZJU1NDQUxBUihvKSl7CisgICAgbz1WRUNUWVBFKGYpOworICAgIGNvbnZlcnQocCxvKTsKKyAgfQorICBpZighdm9sYXRpbGVfY29udmVydCYmKChvJihOVSZ+VU5TSUdORUQpKT09KGYmKE5VJn5VTlNJR05FRCkpfHwoIShtYz1tdXN0X2NvbnZlcnQobyxmLGNvbnN0X2V4cHIpKSYmKGNvbnN0X2V4cHJ8fCEob3B0ZmxhZ3MmMikpKSkpeworICAgIHAtPm50eXAtPmZsYWdzPWY7CisgICAgaWYoIUlTUE9JTlRFUihmKSYmIUlTQVJSQVkoZikpe2ZyZWV0eXAocC0+bnR5cC0+bmV4dCk7cC0+bnR5cC0+bmV4dD0wO30KKyAgICByZXR1cm47CisgIH0KKyAgLyogZG8gbm90IGNyZWF0ZSBkaXJlY3QgY29udmVydHMgYmV0d2VlbiBmbG9hdCBhbmQgc21hbGwgdHlwZXMKKyAgICAgaWYgdGhlIGJhY2tlbmQgZG9lcyBub3QgbGlrZSB0aGF0ICovCisgIGlmKElTRkxPQVQobykmJklTSU5UKGYpJiYoZiZOUSk8TUlOX0ZMT0FUX1RPX0lOVF9UWVBFKQorICAgIHRuPU1JTl9GTE9BVF9UT19JTlRfVFlQRXwoZiZVTlNJR05FRCk7CisgIGVsc2UKKyAgICB0bj1mOworICBsaWJuYW1lPTA7CisgIGlmKElTRkxPQVQoZikmJklTSU5UKG8pJiYobyZOUSk8TUlOX0lOVF9UT19GTE9BVF9UWVBFKXsKKyNpZiBIQVZFX0xJQkNBTExTCisgICAgaWYoKGxpYm5hbWU9dXNlX2xpYmNhbGxfd3JhcChDT05WRVJULHRuLG8pKSYmbWMpeworICAgICAgdG89bzsKKyAgICAgIGxpYm5hbWU9dXNlX2xpYmNhbGxfd3JhcChDT05WRVJULHRuLE1JTl9JTlRfVE9fRkxPQVRfVFlQRXwobyZVTlNJR05FRCkpOworICAgICAgaWYoIWxpYm5hbWUpIGllcnJvcigwKTsKKyAgICB9ZWxzZQorI2VuZGlmCisgICAgeworICAgICAgdG89TUlOX0lOVF9UT19GTE9BVF9UWVBFfChvJlVOU0lHTkVEKTsKKyAgICAgIGNvbnZlcnQocCx0byk7CisgICAgfQorICB9ZWxzZXsKKyAgICB0bz1vOworICB9CisjaWYgSEFWRV9MSUJDQUxMUworICBuLmZsYWdzPUNPTlZFUlQ7CisgIG4ubnR5cD0mbnQ7CisgIG50LmZsYWdzPWY7CisgIG4ubGVmdD0mbm47CisgIG5uLm50eXA9cC0+bnR5cDsKKyAgaWYoKGxpYm5hbWV8fChsaWJuYW1lPXVzZV9saWJjYWxsX3dyYXAoQ09OVkVSVCx0bix0bykpKSYmbWMpeworICAgIG5vZGUgKm49bmV3X25vZGUoKTsKKyAgICBuLT5mbGFncz1SRUlOVEVSUFJFVDsKKyAgICBuLT5vPXAtPm87CisgICAgbi0+bnR5cD1wLT5udHlwOworICAgIHAtPm89Z2VuX2xpYmNhbGwobGlibmFtZSxuLHAtPm50eXAsMCwwKS0+bzsKKyAgfWVsc2V7CisjZW5kaWYKKyAgICBuZXc9bmV3X0lDKCk7CisgICAgbmV3LT5xMT1wLT5vOworICAgIG5ldy0+cTIuZmxhZ3M9MDsKKyAgICBuZXctPmNvZGU9Q09OVkVSVDsKKyAgICBuZXctPnR5cGYyPXRvOworICAgIG5ldy0+dHlwZj10bjsKKyAgICBpZigocC0+by5mbGFncyYoU0NSQVRDSHxSRUcpKSE9KFNDUkFUQ0h8UkVHKXx8IXJlZ29rKHAtPm8ucmVnLHRuLDApKXsKKyAgICAgIGdldF9zY3JhdGNoKCZuZXctPnosdG4sMCwwKTsKKyAgICB9ZWxzZXsKKyAgICAgIG5ldy0+ej1wLT5vO25ldy0+ei5mbGFncyY9fkRSRUZPQko7CisgICAgfQorICAgIHAtPm89bmV3LT56OworICAgIC8qIGhtbS4uLiAqLworICAgIGlmKCFtYyYmbGlibmFtZSl7CisgICAgICBuZXctPmNvZGU9QVNTSUdOOworICAgICAgbmV3LT5xMi52YWwudm1heD1zaXpldGFiW3RuJk5RXTsKKyAgICB9CisgICAgYWRkX0lDKG5ldyk7CisjaWYgSEFWRV9MSUJDQUxMUworICB9CisjZW5kaWYKKyAgaWYoZiE9dG4peworICAgIHAtPm50eXAtPmZsYWdzPXRuOworICAgIGNvbnZlcnQocCxmKTsKKyAgfQorfQorCit2b2lkIGFsbG9jX2hhcmRyZWcoaW50IHIpCisvKiAgQmVsZWd0IFJlZ2lzdGVyIHIuICAqLworeworICBJQyAqbmV3OworICBpZihub2NvZGUpIHJldHVybjsKKyAgaWYoREVCVUcmMTYpIHByaW50ZigiYWxsb2NhdGVkICVzXG4iLHJlZ25hbWVzW3JdKTsKKyAgcmVnc1tyXT0xO3JlZ3VzZWRbcl0rKzsKKyAgbmV3PW5ld19JQygpOworICBuZXctPmNvZGU9QUxMT0NSRUc7CisgIG5ldy0+dHlwZj0wOworICBuZXctPnExLmZsYWdzPVJFRzsKKyAgbmV3LT5xMS5yZWc9cjsKKyAgbmV3LT5xMi5mbGFncz1uZXctPnouZmxhZ3M9MDsKKyAgYWRkX0lDKG5ldyk7CisgIGlmKHJlZ19wYWlyKHIsJnJwKSl7CisgICAgcmVnc1tycC5yMV09MTtyZWd1c2VkW3JwLnIxXSsrOworICAgIHJlZ3NbcnAucjJdPTE7cmVndXNlZFtycC5yMl0rKzsKKyAgfQorfQorCitpbnQgYWxsb2NyZWcoaW50IGYsaW50IG1vZGUpCisvKiAgRm9yZGVydCBSZWdpc3RlciBmdWVyIFR5cCBmIGFuLiAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBpLHI9MCxwcmlvPS0xOworICBpZihub2NvZGUpIHJldHVybigxKTsKKyAgZm9yKGk9MTtpPD1NQVhSO2krKyl7CisgICAgaWYoIXJlZ3NbaV0mJnJlZ19wcmlvW2ldPnByaW8mJnJlZ29rKGksZixtb2RlKSYmKCFyZWdfcGFpcihpLCZycCl8fCghcmVnc1tycC5yMV0mJiFyZWdzW3JwLnIyXSkpKXsKKyAgICAgIHI9aTsKKyAgICAgIHByaW89cmVnX3ByaW9baV07CisgICAgfQorICB9CisgIGlmKHIpeworICAgIGlmKERFQlVHJjE2KSBwcmludGYoImFsbG9jICVzXG4iLHJlZ25hbWVzW3JdKTsKKyAgICBhbGxvY19oYXJkcmVnKHIpOworICAgIHJldHVybiByOworICB9CisgIGlmKERFQlVHJjEpIHByaW50ZigiQ291bGRuJ3QgYWxsb2NhdGUgcmVnaXN0ZXIgZm9yIHR5cGUgJWRcbiIsZik7CisgIHJldHVybiAwOworfQordm9pZCBmcmVlX3JlZyhpbnQgcikKKy8qICBHaWJ0IFJlZ2lzdGVyIHIgZnJlaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgICBJQyAqbmV3OworICAgIGlmKCFyfHxub2NvZGUpIHJldHVybjsKKyAgICBpZihyZWdzW3JdPT0wJiYhY3Jvc3NfbW9kdWxlKQorICAgICAge3ByaW50ZigiUmVnaXN0ZXIgJWQoJXMpOlxuIixyLHJlZ25hbWVzW3JdKTtpZXJyb3IoMCk7fQorICAgIGlmKERFQlVHJjE2KSBwcmludGYoImZyZWVkICVzXG4iLHJlZ25hbWVzW3JdKTsKKyAgICBuZXc9bmV3X0lDKCk7CisgICAgbmV3LT5jb2RlPUZSRUVSRUc7CisgICAgbmV3LT50eXBmPTA7CisgICAgbmV3LT5xMS5mbGFncz1SRUc7CisgICAgbmV3LT5xMS5yZWc9cjsKKyAgICBuZXctPnEyLmZsYWdzPW5ldy0+ei5mbGFncz0wOworICAgIHJlZ3Nbcl09MDsKKyAgICBpZihyZWdfcGFpcihyLCZycCkpeworICAgICAgaWYocmVnc1tycC5yMV0mUkhBTEYpeworCWlmKERFQlVHJjE2KSBwcmludGYoImtlZXAgJXNcbiIscmVnbmFtZXNbcnAucjFdKTsKKwlyZWdzW3JwLnIxXSY9flJIQUxGOworCW5ldy0+cTEucmVnPXJwLnIyOworICAgICAgfWVsc2UKKwlyZWdzW3JwLnIxXT0wOworICAgICAgaWYocmVnc1tycC5yMl0mUkhBTEYpeworCWlmKERFQlVHJjE2KSBwcmludGYoImtlZXAgJXNcbiIscmVnbmFtZXNbcnAucjJdKTsKKwlyZWdzW3JwLnIyXSY9flJIQUxGOworCW5ldy0+cTEucmVnPXJwLnIxOworICAgICAgfWVsc2UKKwlyZWdzW3JwLnIyXT0wOworICAgIH0KKyAgICBhZGRfSUMobmV3KTsKK30KK3ZvaWQgZ2VuX2xhYmVsKGludCBsKQorLyogIEVyemV1Z3QgZWluIExhYmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICAgIElDICpuZXc7CisgICAgbmV3PW5ld19JQygpOworICAgIG5ldy0+Y29kZT1MQUJFTDsKKyAgICBuZXctPnR5cGY9bDsKKyAgICBuZXctPnExLmZsYWdzPW5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CisgICAgYWRkX0lDKG5ldyk7Cit9Cit2b2lkIGdlbl9jb25kKG9iaiAqcCxpbnQgbSxpbnQgbDEsaW50IGwyKQorLyogIEdlbmVyaWVydCBjb2RlLCBkZXIgMCBvZGVyIDEgaW4gUmVnaXN0ZXIgc2NocmVpYnQuIFNjaHJlaWJ0IG9iaiBuYWNoIHAuICovCit7CisgICAgSUMgKm5ldzsKKyAgICBvYmogb21lcms7CisgICAgbmV3PW5ld19JQygpOworICAgIG5ldy0+Y29kZT1BU1NJR047CisgICAgbmV3LT50eXBmPUlOVDsKKyAgICBuZXctPnExLmZsYWdzPUtPTlNUOworICAgIG5ldy0+cTIuZmxhZ3M9MDsKKyAgICBuZXctPnEyLnZhbC52bWF4PXNpemV0YWJbSU5UXTsKKyAgICBpZighbSkgdm1heD1sMnptKDFMKTsgZWxzZSB2bWF4PWwyem0oMEwpOworICAgIG5ldy0+cTEudmFsLnZpbnQ9em0yemkodm1heCk7CisgICAgZ2V0X3NjcmF0Y2goJm5ldy0+eixJTlQsMCwwKTsKKyAgICBvbWVyaz1uZXctPno7CisgICAgYWRkX0lDKG5ldyk7CisgICAgbmV3PW5ld19JQygpOworICAgIG5ldy0+Y29kZT1CUkE7CisgICAgbmV3LT50eXBmPWwyOworICAgIGFkZF9JQyhuZXcpOworICAgIGdlbl9sYWJlbChsMSk7CisgICAgbmV3PW5ld19JQygpOworICAgIG5ldy0+Y29kZT1BU1NJR047CisgICAgbmV3LT50eXBmPUlOVDsKKyAgICBuZXctPnExLmZsYWdzPUtPTlNUOworICAgIG5ldy0+cTIuZmxhZ3M9MDsKKyAgICBuZXctPnEyLnZhbC52bWF4PXNpemV0YWJbSU5UXTsKKyAgICBpZighbSkgdm1heD1sMnptKDBMKTsgZWxzZSB2bWF4PWwyem0oMUwpOworICAgIG5ldy0+cTEudmFsLnZpbnQ9em0yemkodm1heCk7CisgICAgbmV3LT56PW9tZXJrOworLyogICAgbmV3LT56LnJlZz1yOworICAgIG5ldy0+ei5mbGFncz1TQ1JBVENIfFJFRzsqLworICAgIGFkZF9JQyhuZXcpOworICAgIGdlbl9sYWJlbChsMik7CisgICAgKnA9b21lcms7Cit9Cit2b2lkIHNjcmF0Y2hfdmFyKG9iaiAqbyxpbnQgdCx0eXBlICp0eXApCisvKiAgbGllZmVydCBlaW5lIHRlbXBvcmFlcmUgVmFyaWFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBuaWNodCBlZmZpemllbnQsIGFiZXIgd2VyIGhhdCBzY2hvbiBzbyB3ZW5pZyBSZWdpc3Rlci4uLiAgICAqLworeworICB0eXBlICpudDsKKyAgaWYoIUlTU0NBTEFSKHQpJiYhSVNWRUNUT1IodCkpeworICAgIGlmKCF0eXApIGllcnJvcigwKTsKKyAgICBudD1jbG9uZV90eXAodHlwKTsKKyAgfWVsc2V7CisgICAgbnQ9bmV3X3R5cCgpOworICAgIG50LT5mbGFncz10OworICAgIGlmKElTUE9JTlRFUih0KSl7CisgICAgICBudC0+bmV4dD1uZXdfdHlwKCk7CisgICAgICBudC0+bmV4dC0+ZmxhZ3M9Vk9JRDsKKyAgICB9CisgIH0KKyAgby0+ZmxhZ3M9U0NSQVRDSHxWQVI7by0+cmVnPTA7CisgIG8tPnY9YWRkX3ZhcihlbXB0eSxudCxBVVRPLDApOworICBvLT52YWwudm1heD1sMnptKDBMKTsKK30KK3ZvaWQgZ2V0X3NjcmF0Y2gob2JqICpvLGludCB0MSxpbnQgdDIsdHlwZSAqdHlwKQorLyogIGxpZWZlcnQgZWluIFNjcmF0Y2hyZWdpc3RlciBvZGVyIGVpbmUgU2NyYXRjaHZhcmlhYmxlICAgICAgICovCit7CisgICAgaWYoIShvcHRmbGFncyYyKSYmKG8tPnJlZz1hbGxvY3JlZyh0MSx0MikpKXsKKyAgICAgICAgby0+ZmxhZ3M9U0NSQVRDSHxSRUc7CisgICAgfWVsc2V7CisgICAgICAgIHNjcmF0Y2hfdmFyKG8sdDEsdHlwKTsKKyAgICB9Cit9CitpbnQgZG9fYXJpdGgobnAgcCxJQyAqbmV3LG5wIGRlc3Qsb2JqICpvKQorLyogIGVyemV1Z3QgSUMgbmV3IGZ1ZXIgZWluZW4gYXJpdGhtZXRpc2NoZW4gS25vdGVuIHVuZCBzcGVpY2hlcnQgZGFzICAgKi8KKy8qICBSZXN1bHRhdCB2b20gVW50ZXJrbm90ZW4gZGVzdCBpbiBvIChmdWVyIGEgb3A9IGIpICAgICAgICAgICAgICAgKi8KKy8qICBsaWVmZXJ0IDAsIHdlbm4gZGVzdCBuaWNodCBnZWZ1bmRlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgICBpbnQgZj0wLG1mbGFnczsKKyAgICBuZXctPmNvZGU9cC0+ZmxhZ3M7CisgICAgaWYobmV3LT5jb2RlPT1QTVVMVCkgbmV3LT5jb2RlPU1VTFQ7CisgICAgZ2VuX0lDKHAtPmxlZnQsMCwwKTsKKyAgICBpZihkZXN0JiZwLT5sZWZ0PT1kZXN0KXsKKyAgICAgICpvPXAtPmxlZnQtPm87ZisrOworICAgICAgaWYocC0+bGVmdC0+ZmxhZ3M9PUJJVEZJRUxEKXsKKyAgICAgICAgKm89cC0+bGVmdC0+bGVmdC0+bzsKKyAgICAgICAgaWYoKG8tPmZsYWdzJihSRUd8U0NSQVRDSCkpPT0oUkVHfFNDUkFUQ0gpKQorICAgICAgICAgIGtlZXBfcmVnKG8tPnJlZyk7CisgICAgICB9CisgICAgfQorICAgIGdlbl9JQyhwLT5yaWdodCwwLDApOworICAgIGlmKGRlc3QmJnAtPnJpZ2h0PT1kZXN0KSB7Km89cC0+cmlnaHQtPm87ZisrO30KKyAgICBpZihkZXN0KXsKKyAgICAgIG1mbGFncz1kZXN0LT5vLmZsYWdzOworICAgICAgaWYocC0+bGVmdC0+ZmxhZ3MhPUJJVEZJRUxEKSAKKyAgICAgICAgZGVzdC0+by5mbGFncyY9KH5TQ1JBVENIKTsKKyAgICB9CisKKyAgICBpZihJU1BPSU5URVIocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpJiZJU1BPSU5URVIocC0+cmlnaHQtPm50eXAtPmZsYWdzKSl7CisgICAgLyogIFN1YnRyYWhpZXJlbiB6d2VpZXIgUG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBpbnQgZHQ9UFRSRElGRl9UKHAtPmxlZnQtPm50eXAtPmZsYWdzKTsKKyAgICAgIGlmKHAtPmZsYWdzIT1TVUIpIGllcnJvcigwKTsKKyAgICAgIG5ldy0+dHlwZj1kdDsKKyAgICAgIG5ldy0+dHlwZjI9cC0+bGVmdC0+bnR5cC0+ZmxhZ3M7CisgICAgICBuZXctPmNvZGU9U1VCUEZQOworICAgICAgbmV3LT5xMT1wLT5sZWZ0LT5vOworICAgICAgbmV3LT5xMj1wLT5yaWdodC0+bzsKKyAgICAgIGlmKCFkZXN0JiYocC0+bGVmdC0+by5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSYmcmVnb2socC0+bGVmdC0+by5yZWcsZHQsMCkpeworCW5ldy0+ej1wLT5sZWZ0LT5vOworCW5ldy0+ei5mbGFncyY9fkRSRUZPQko7CisgICAgICB9ZWxzZXsKKwlpZihVU0VRMkFTWiYmKHAtPnJpZ2h0LT5vLmZsYWdzJihTQ1JBVENIfFJFRykpPT0oU0NSQVRDSHxSRUcpJiZyZWdvayhwLT5yaWdodC0+by5yZWcsZHQsMCkpeworCSAgbmV3LT56PXAtPnJpZ2h0LT5vOworCSAgbmV3LT56LmZsYWdzJj0ofkRSRUZPQkopOworCX1lbHNleworCSAgZ2V0X3NjcmF0Y2goJm5ldy0+eixkdCwwLDApOworCX0KKyAgICAgIH0KKyAgICAgIHAtPm89bmV3LT56OworICAgICAgYWRkX0lDKG5ldyk7CisgICAgICBpZighem1sZXEoc3pvZihwLT5sZWZ0LT5udHlwLT5uZXh0KSxsMnptKDFMKSkpeworCWxvbmcgbG47CisJbmV3PW5ld19JQygpOworCW5ldy0+cTE9cC0+bzsKKwluZXctPnEyLmZsYWdzPUtPTlNUOworCWd2YWwudm1heD1zem9mKHAtPmxlZnQtPm50eXAtPm5leHQpOworCWV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKKwlpZihsbj1nZXRfcG9mMih2dW1heCkpeworCSAgLyogRGl2aXNpb24gaW1tZXIgb2huZSBSZXN0LCBkYWhlciBzaGlmdCBt9mdsaWNoICovCisJICAvKiBUT0RPOiBIYWJlbiB3aXIgVGFyZ2V0cyBvaG5lIGFyaXRoLiBzaGlmdCByaWdodD8gKi8KKwkgIGd2YWwudm1heD1sMnptKGxuLTEpOworCSAgZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworCSAgaW5zZXJ0X2NvbnN0KCZuZXctPnEyLnZhbCxJTlQpOworCSAgbmV3LT50eXBmMj1JTlQ7CisJICBuZXctPmNvZGU9UlNISUZUOworCX1lbHNleworCSAgaW5zZXJ0X2NvbnN0KCZuZXctPnEyLnZhbCxkdCk7CisJICBuZXctPmNvZGU9RElWOworCX0KKwluZXctPno9cC0+bzsKKwluZXctPnR5cGY9ZHQ7CisJYWRkX0lDKG5ldyk7CisgICAgICB9CisgICAgICBpZihkZXN0KSBkZXN0LT5vLmZsYWdzPW1mbGFnczsKKyAgICAgIHJldHVybiBmOworICAgIH0KKyAgICBpZigocC0+ZmxhZ3M9PUFERHx8cC0+ZmxhZ3M9PVNVQikmJihJU1BPSU5URVIocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpfHxJU1BPSU5URVIocC0+cmlnaHQtPm50eXAtPmZsYWdzKSkpeworICAgICAgLyogIEFkZGllcmVuIHVuZCBTdWJ0cmFoaWVyZW4gZWluZXMgSW50ZWdlcnMgenUgZWluZW0gUG9pbnRlciAgICovCisgICAgICBpZihwLT5mbGFncz09QUREKXsKKwluZXctPmNvZGU9QURESTJQOworCWlmKCFJU1BPSU5URVIocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXsKKwkgIG5wIHRtcD1wLT5sZWZ0OworCSAgcC0+bGVmdD1wLT5yaWdodDsKKwkgIHAtPnJpZ2h0PXRtcDsKKwl9CisgICAgICB9ZWxzZQorCW5ldy0+Y29kZT1TVUJJRlA7CisgICAgICBuZXctPnR5cGY9cC0+cmlnaHQtPm50eXAtPmZsYWdzOworICAgICAgbmV3LT50eXBmMj1wLT5udHlwLT5mbGFnczsKKyAgICAgIG5ldy0+cTE9cC0+bGVmdC0+bzsKKyAgICAgIC8qICBrbGVpbmVyZSBUeXBlbiBhbHMgTUlOQURESTJQIGVyc3QgaW4gZGllc2VuIHdhbmRlbG4gKi8KKyAgICAgIGlmKG5ldy0+dHlwZiZVTlNJR05FRCl7CisJaWYoKG5ldy0+dHlwZiZOUSk8KE1JTkFERFVJMlAmTlEpKXtjb252ZXJ0KHAtPnJpZ2h0LE1JTkFERFVJMlApO25ldy0+dHlwZj1NSU5BRERVSTJQO30KKyAgICAgIH1lbHNleworCWlmKChuZXctPnR5cGYmTlEpPE1JTkFEREkyUCl7Y29udmVydChwLT5yaWdodCxNSU5BRERJMlApO25ldy0+dHlwZj1NSU5BRERJMlA7fQorICAgICAgfQorICAgICAgLyogIGdyb2Vzc2VyZSBUeXBlbiBhbHMgTUFYQURESTJQIGVyc3QgaW4gZGllc2VuIHdhbmRlbG4gKi8KKyAgICAgIGlmKG5ldy0+dHlwZiZVTlNJR05FRCl7CisJaWYoKG5ldy0+dHlwZiZOUSk+KE1BWEFEREkyUCZOUSkpe2NvbnZlcnQocC0+cmlnaHQsTUFYQUREVUkyUCk7bmV3LT50eXBmPU1BWEFERFVJMlA7fSAgICAgIAorICAgICAgfWVsc2V7CisJaWYoKG5ldy0+dHlwZiZOUSk+TUFYQURESTJQKXtjb252ZXJ0KHAtPnJpZ2h0LE1BWEFEREkyUCk7bmV3LT50eXBmPU1BWEFEREkyUDt9ICAgICAgCisgICAgICB9CisgICAgICBpZigocC0+bGVmdC0+by5mbGFncyZWQVJBRFIpJiYocC0+cmlnaHQtPm8uZmxhZ3MmS09OU1QpKXsKKwlldmFsX2NvbnN0KCZwLT5yaWdodC0+by52YWwscC0+cmlnaHQtPm50eXAtPmZsYWdzKTsKKwlwLT5vPXAtPmxlZnQtPm87CisJcC0+by52YWwudm1heD16bWFkZCh2bWF4LHAtPmxlZnQtPm8udmFsLnZtYXgpOworCWZyZWUobmV3KTsKKwlyZXR1cm4gZjsKKyAgICAgIH0KKyAgICAgIG5ldy0+cTI9cC0+cmlnaHQtPm87CisgICAgICBpZighZGVzdCYmKHAtPmxlZnQtPm8uZmxhZ3MmKFNDUkFUQ0h8UkVHKSk9PShTQ1JBVENIfFJFRykmJnJlZ29rKG5ldy0+cTEucmVnLFBPSU5URVJfVFlQRShwLT5sZWZ0LT5udHlwLT5uZXh0KSxwLT5sZWZ0LT5udHlwLT5uZXh0LT5mbGFncykpeworCW5ldy0+ej1wLT5sZWZ0LT5vOworCW5ldy0+ei5mbGFncyY9KH5EUkVGT0JKKTsKKyAgICAgIH1lbHNleworCS8qZ2V0X3NjcmF0Y2goJm5ldy0+eixQT0lOVEVSX1RZUEUocC0+bGVmdC0+bnR5cC0+bmV4dCkscC0+bGVmdC0+bnR5cC0+bmV4dC0+ZmxhZ3MsMCk7Ki8KKwlnZXRfc2NyYXRjaCgmbmV3LT56LHAtPm50eXAtPmZsYWdzLHAtPm50eXAtPm5leHQtPmZsYWdzLDApOworICAgICAgfQorICAgICAgcC0+bz1uZXctPno7CisgICAgICBhZGRfSUMobmV3KTsKKyAgICAgIGlmKGRlc3QpIGRlc3QtPm8uZmxhZ3M9bWZsYWdzOworICAgICAgcmV0dXJuIGY7CisgICAgfQorICAgIGlmKCFJU1ZFQ1RPUihwLT5udHlwLT5mbGFncyl8fCFJU1ZFQ1RPUihwLT5sZWZ0LT5udHlwLT5mbGFncykpCisgICAgICBjb252ZXJ0KHAtPmxlZnQscC0+bnR5cC0+ZmxhZ3MpOworICAgIGlmKHAtPmZsYWdzPT1MU0hJRlR8fHAtPmZsYWdzPT1SU0hJRlQpeworICAgICAgaWYoc2hvcnRjdXQocC0+ZmxhZ3MscC0+bGVmdC0+bnR5cC0+ZmxhZ3MmTlUpKXsKKwljb252ZXJ0KHAtPnJpZ2h0LHAtPnJpZ2h0LT5udHlwLT5mbGFncyk7CisJbmV3LT50eXBmMj1wLT5yaWdodC0+bnR5cC0+ZmxhZ3M7CisgICAgICB9ZWxzZXsKKwljb252ZXJ0KHAtPnJpZ2h0LElOVCk7CisJbmV3LT50eXBmMj1JTlQ7CisgICAgICB9CisjaWYgMAorICAgICAgdHlwZSAqc3Q7CisgICAgICBzdD1jbG9uZV90eXAocC0+cmlnaHQtPm50eXApOworICAgICAgLypzdC0+ZmxhZ3M9aW50X2VydyhzdC0+ZmxhZ3MpOyovCisgICAgICBzdC0+ZmxhZ3M9SU5UOworICAgICAgY29udmVydChwLT5yaWdodCxzdC0+ZmxhZ3MpOworICAgICAgbmV3LT50eXBmMj1zdC0+ZmxhZ3M7CisgICAgICBmcmVldHlwKHN0KTsKKyNlbmRpZgorICAgIH1lbHNleworICAgICAgaWYoIUlTVkVDVE9SKHAtPm50eXAtPmZsYWdzKXx8IUlTVkVDVE9SKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpCisJY29udmVydChwLT5yaWdodCxwLT5udHlwLT5mbGFncyk7CisgICAgfQorICAgIG5ldy0+cTE9cC0+bGVmdC0+bzsKKyAgICBuZXctPnEyPXAtPnJpZ2h0LT5vOworICAgIGlmKElTVkVDVE9SKHAtPm50eXAtPmZsYWdzKSl7CisgICAgICBuZXctPnR5cGY9cC0+bGVmdC0+bnR5cC0+ZmxhZ3M7CisgICAgICBuZXctPnR5cGYyPXAtPm50eXAtPmZsYWdzOworICAgIH1lbHNlCisgICAgICBuZXctPnR5cGY9cC0+bnR5cC0+ZmxhZ3M7CisgICAgLyogIEJlaSBkZXN0IT0wLCBkLmguIEFTU0lHTk9QLCBkYXJmIHExIG5pY2h0IGFscyBaaWVsIGJlbnV6dCB3ZXJkZW4hICAqLworICAgIGlmKCFkZXN0JiYobmV3LT5xMS5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSYmcmVnb2sobmV3LT5xMS5yZWcscC0+bnR5cC0+ZmxhZ3MsMCkpeworICAgICAgbmV3LT56PW5ldy0+cTE7CisgICAgICBuZXctPnouZmxhZ3MmPX5EUkVGT0JKOworICAgIH1lbHNleworICAgICAgaWYoKG5ldy0+cTIuZmxhZ3MmU0NSQVRDSCkmJnJlZ29rKG5ldy0+cTIucmVnLHAtPm50eXAtPmZsYWdzLDApKXsKKwlpZigocC0+ZmxhZ3M+PU9SJiZwLT5mbGFnczw9QU5EKXx8cC0+ZmxhZ3M9PUFERHx8cC0+ZmxhZ3M9PU1VTFR8fHAtPmZsYWdzPT1QTVVMVCl7CisJICAvKiAgYmVpIGtvbW11dGF0aXZlbiBPcGVyYXRvcmVuIHZlcnRhdXNjaGVuICAgICAqLworCSAgbmV3LT56PW5ldy0+cTI7CisJICBuZXctPnEyPW5ldy0+cTE7CisJICBuZXctPnExPW5ldy0+ejsKKwkgIG5ldy0+ei5mbGFncyY9fkRSRUZPQko7CisJfWVsc2V7CisJICBpZihVU0VRMkFTWil7CisJICAgIG5ldy0+ej1uZXctPnEyOworCSAgICBuZXctPnouZmxhZ3MmPX5EUkVGT0JKOworCSAgfWVsc2V7CisJICAgIGdldF9zY3JhdGNoKCZuZXctPnosbmV3LT50eXBmLDAsMCk7CisJICB9CisJfQorICAgICAgfWVsc2V7CisJZ2V0X3NjcmF0Y2goJm5ldy0+eixuZXctPnR5cGYsMCwwKTsKKyAgICAgIH0KKyAgICB9CisgICAgcC0+bz1uZXctPno7CisgICAgYWRkX0lDKG5ldyk7CisgICAgaWYoZGVzdCl7CisgICAgICBkZXN0LT5vLmZsYWdzPW1mbGFnczsKKyAgICAgIC8qCisgICAgICBpZigoZGVzdC0+by5mbGFncyZSRUcpJiYhcmVnc1tkZXN0LT5vLnJlZ10pCisgICAgICAgIGtlZXBfcmVnKGRlc3QtPm8ucmVnKTsKKyAgICAgICovCisgICAgfQorCisgICAgcmV0dXJuIGY7Cit9Cit2b2lkIHNhdmVzY3JhdGNoKGludCBjb2RlLElDICpwLGludCBkb250c2F2ZSxvYmogKm8pCisvKiAgc3BlaWNoZXJ0IFNjcmF0Y2hyZWdpc3RlciBiencuIHN0ZWxsdCBzaWUgd2llZGVyIGhlciAoamUgbmFjaCBjb2RlICAqLworLyogIGVudHdlZGVyIE1PVkVGUk9NUkVHIG9kZXIgTU9WRVRPUkVHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGkscyxlLGIsZHMxLGRzMjtJQyAqbmV3OworICBpZihjb2RlPT1NT1ZFVE9SRUcpeyBzPTE7ZT1NQVhSKzE7Yj0xO30gZWxzZSB7cz1NQVhSO2U9MDtiPS0xO30KKyAgaWYocmVnX3BhaXIoZG9udHNhdmUsJnJwKSl7CisgICAgZHMxPXJwLnIxOworICAgIGRzMj1ycC5yMjsKKyAgfWVsc2UKKyAgICBkczE9ZHMyPTA7CisgIGZvcihpPXM7aSE9ZTtpKz1iKXsKKyAgICBpbnQgbXVzdHNhdmU9MDsKKyAgICBpZigoby0+ZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmby0+di0+ZmkmJihvLT52LT5maS0+ZmxhZ3MmQUxMX1JFR1MpKQorICAgICAgbXVzdHNhdmU9QlRTVChvLT52LT5maS0+cmVnc19tb2RpZmllZCxpKTsKKyAgICBlbHNlCisgICAgICBtdXN0c2F2ZT1yZWdzY3JhdGNoW2ldOworICAgIGlmKHJlZ3NhW2ldKSBtdXN0c2F2ZT0wOworICAgIGlmKG11c3RzYXZlKSBzaW1wbGVfc2NyYXRjaFtpXT0xOworICAgIGlmKHJlZ3NbaV0mJiEocmVnc1tpXSZSTk9TQVZFKSYmbXVzdHNhdmUmJmkhPWRvbnRzYXZlJiZpIT1kczEmJmkhPWRzMiYmIXJlZ19wYWlyKGksJnJwKSl7CisgICAgICBpZighcmVnc2J1ZltpXSl7CisJdHlwZSAqdDsKKwlpZihjb2RlIT1NT1ZFRlJPTVJFRykgY29udGludWU7CisJdD1jbG9uZV90eXAocmVndHlwZVtpXSk7CisJcmVnc2J1ZltpXT1hZGRfdmFyKGVtcHR5LHQsQVVUTywwKTsKKwlyZWdzYnVmW2ldLT5mbGFnc3w9VVNFREFTQURSOworCXJlZ2JuZXN0aW5nW2ldPW5lc3Rpbmc7CisgICAgICB9CisgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICBuZXctPnR5cGY9bmV3LT5xMi5mbGFncz0wOworICAgICAgbmV3LT5saW5lPTA7bmV3LT5maWxlPTA7CisgICAgICBuZXctPmNvZGU9Y29kZTsKKyAgICAgIGlmKGNvZGU9PU1PVkVGUk9NUkVHKXsKKwluZXctPnExLmZsYWdzPVJFRztuZXctPnExLnJlZz1pOworCW5ldy0+ei5mbGFncz1WQVJ8RE9OVFJFR0lTVEVSSVpFO25ldy0+ei52PXJlZ3NidWZbaV07CisJbmV3LT56LnZhbC52bWF4PWwyem0oMEwpOworICAgICAgfWVsc2V7CisJbmV3LT56LmZsYWdzPVJFRztuZXctPnoucmVnPWk7CisJbmV3LT5xMS5mbGFncz1WQVJ8RE9OVFJFR0lTVEVSSVpFO25ldy0+cTEudj1yZWdzYnVmW2ldOworCW5ldy0+cTEudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICB9CisgICAgICBuZXctPnVzZV9jbnQ9bmV3LT5jaGFuZ2VfY250PTA7CisgICAgICBuZXctPnVzZV9saXN0PW5ldy0+Y2hhbmdlX2xpc3Q9MDsKKyAgICAgIGluc2VydF9JQyhwLG5ldyk7CisgICAgfQorICB9Cit9CisKZGlmZiAtLWdpdCBhL2ljbi5jIGIvaWNuLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGU0ZmVhYgotLS0gL2Rldi9udWxsCisrKyBiL2ljbi5jCkBAIC0wLDAgKzEsMjEwNCBAQAorLyogICRWRVI6IHZiY2MgKGljLmMpIFYwLjggICovCisKKyNpbmNsdWRlICJ2YmMuaCIKKworc3RhdGljIGNoYXIgRklMRV9bXT1fX0ZJTEVfXzsKKworc3RhdGljIHN0cnVjdCBJQyAqZmlyc3RfcHVzaGVkOworc3RhdGljIHVuc2lnbmVkIGludCBvcHVzaGVkOworCitzdGF0aWMgaW50IHZvbGF0aWxlX2NvbnZlcnQ7CisKK2ludCBkb19hcml0aChucCxzdHJ1Y3QgSUMgKixucCxzdHJ1Y3Qgb2JqICopOworCitzdGF0aWMgdm9pZCBoYW5kbGVfcmVnbGlzdChzdHJ1Y3QgcmVnYXJnc19saXN0ICosc3RydWN0IG9iaiAqKTsKKwordm9pZCBnZW5fdGVzdChzdHJ1Y3Qgb2JqICpvLGludCB0LGludCBicmFuY2gsaW50IGxhYmVsKQorLyogIEdlbmVyaWVydCBlaW4gdGVzdCBvLCBicmFuY2ggbGFiZWwgdW5kIHBhc3N0IGF1ZiwgZGFzcyAgICAgICovCisvKiAga2VpbiBURVNUIGNvbnN0IGdlbmVyaWVydCB3aXJkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgICBzdHJ1Y3QgSUMgKm5ldzsKKyAgICBpZihvLT5mbGFncyZLT05TVCl7CisgICAgICAgIGV2YWxfY29uc3QoJm8tPnZhbCx0KTsKKyAgICAgICAgaWYoemxkZXF0byh2bGRvdWJsZSxkMnpsZCgwLjApKSYmem1lcXRvKHZtYXgsbDJ6bSgwTCkpJiZ6dW1lcXRvKHZ1bWF4LHVsMnp1bSgwVUwpKSl7CisgICAgICAgICAgICBpZihicmFuY2g9PUJFUSkgYnJhbmNoPUJSQTsgZWxzZSBicmFuY2g9MDsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBpZihicmFuY2g9PUJORSkgYnJhbmNoPUJSQTsgZWxzZSBicmFuY2g9MDsKKyAgICAgICAgfQorICAgIH1lbHNleworICAgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICAgIG5ldy0+Y29kZT1URVNUOworICAgICAgICBuZXctPnEyLmZsYWdzPW5ldy0+ei5mbGFncz0wOworICAgICAgICBuZXctPnR5cGY9dDsKKyAgICAgICAgbmV3LT5xMT0qbzsKKyAgICAgICAgYWRkX0lDKG5ldyk7CisgICAgfQorICAgIGlmKGJyYW5jaCl7CisgICAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgICAgbmV3LT5jb2RlPWJyYW5jaDsKKyAgICAgICAgbmV3LT50eXBmPWxhYmVsOworICAgICAgICBhZGRfSUMobmV3KTsKKyAgICB9Cit9CisKK3ZvaWQgaW5saW5lX21lbWNweShucCB6LG5wIHEsem1heCBzaXplKQorLyogIGZ1ZWd0IGVpbiBBU1NJR04tSUMgZWluLCBkYXMgbWVtY3B5KHoscSxzaXplKSBlbnRzcHJpY2h0ICAgICovCit7CisgICAgc3RydWN0IElDICpuZXc9bmV3X0lDKCk7CisgICAgaWYoIUlTUE9JTlRFUih6LT5udHlwLT5mbGFncykpIGllcnJvcigwKTsKKyAgICBpZighSVNQT0lOVEVSKHEtPm50eXAtPmZsYWdzKSkgaWVycm9yKDApOworCisgICAgaWYoei0+ZmxhZ3M9PUFERFJFU1N8fHotPmZsYWdzPT1BRERSRVNTQXx8ei0+ZmxhZ3M9PUFERFJFU1NTKXsKKyAgICAgIGdlbl9JQyh6LDAsMCk7CisgICAgICBuZXctPno9ei0+bGVmdC0+bzsKKyAgICAgIGlmKHotPmZsYWdzIT1BRERSRVNTUyYmei0+bGVmdC0+ZmxhZ3M9PUlERU5USUZJRVImJmlzX3ZsZW5ndGgoei0+bGVmdC0+bnR5cCkpeworCS8qIHZhcmlhYmxlIGxlbmd0aCBhcnJheSAqLworCW5ldy0+ei5mbGFnc3w9RFJFRk9CSjsKKwluZXctPnouZHR5cD1QT0lOVEVSX1RZUEUoei0+bnR5cC0+bmV4dCk7CisgICAgICB9CisgICAgfWVsc2V7CisgICAgICBnZW5fSUMoeiwwLDApOworICAgICAgaWYoei0+by5mbGFncyZEUkVGT0JKKXsKKyAgICAgICAgc3RydWN0IElDICpuMj1uZXdfSUMoKTsKKyAgICAgICAgbjItPmNvZGU9QVNTSUdOOworICAgICAgICBuMi0+dHlwZj1xLT5udHlwLT5mbGFnczsKKyAgICAgICAgbjItPnExPXotPm87CisgICAgICAgIGdldF9zY3JhdGNoKCZuMi0+eix6LT5udHlwLT5mbGFncyx6LT5udHlwLT5uZXh0LT5mbGFncyx6LT5udHlwKTsKKyAgICAgICAgbjItPnEyLmZsYWdzPTA7CisgICAgICAgIG4yLT5xMi52YWwudm1heD1zaXpldGFiW1BPSU5URVJfVFlQRSh6LT5udHlwLT5uZXh0KV07CisgICAgICAgIG5ldy0+ej1uMi0+ejsKKyAgICAgICAgYWRkX0lDKG4yKTsKKyAgICAgIH1lbHNleworICAgICAgICBuZXctPno9ei0+bzsKKyAgICAgIH0KKyAgICAgIGlmKG5ldy0+ei5mbGFncyZWQVJBRFIpeworCW5ldy0+ei5mbGFncyY9flZBUkFEUjsgCisgICAgICB9ZWxzZXsKKwluZXctPnouZmxhZ3N8PURSRUZPQko7CisJbmV3LT56LmR0eXA9UE9JTlRFUl9UWVBFKHotPm50eXAtPm5leHQpOworICAgICAgfQorICAgIH0KKyAgICBpZihxLT5mbGFncz09QUREUkVTU3x8cS0+ZmxhZ3M9PUFERFJFU1NBfHxxLT5mbGFncz09QUREUkVTU1MpeworICAgICAgZ2VuX0lDKHEsMCwwKTsKKyAgICAgIG5ldy0+cTE9cS0+bGVmdC0+bzsKKyAgICAgIGlmKHEtPmZsYWdzIT1BRERSRVNTUyYmcS0+bGVmdC0+ZmxhZ3M9PUlERU5USUZJRVImJmlzX3ZsZW5ndGgocS0+bGVmdC0+bnR5cCkpeworCS8qIHZhcmlhYmxlIGxlbmd0aCBhcnJheSAqLworCW5ldy0+cTEuZmxhZ3N8PURSRUZPQko7CisJbmV3LT5xMS5kdHlwPVBPSU5URVJfVFlQRShxLT5udHlwLT5uZXh0KTsKKyAgICAgIH0KKyAgICB9ZWxzZXsgICAgCisgICAgICBnZW5fSUMocSwwLDApOworICAgICAgaWYocS0+by5mbGFncyZEUkVGT0JKKXsKKyAgICAgICAgc3RydWN0IElDICpuMj1uZXdfSUMoKTsKKyAgICAgICAgbjItPmNvZGU9QVNTSUdOOworICAgICAgICBuMi0+dHlwZj1xLT5udHlwLT5mbGFnczsKKyAgICAgICAgbjItPnExPXEtPm87CisgICAgICAgIGdldF9zY3JhdGNoKCZuMi0+eixxLT5udHlwLT5mbGFncyxxLT5udHlwLT5uZXh0LT5mbGFncyxxLT5udHlwKTsKKyAgICAgICAgbjItPnEyLmZsYWdzPTA7CisgICAgICAgIG4yLT5xMi52YWwudm1heD1zaXpldGFiW1BPSU5URVJfVFlQRShxLT5udHlwLT5uZXh0KV07CisKKyAgICAgICAgbmV3LT5xMT1uMi0+ejsKKyAgICAgICAgYWRkX0lDKG4yKTsKKyAgICAgIH1lbHNleworICAgICAgICBuZXctPnExPXEtPm87CisgICAgICB9CisgICAgICBpZihuZXctPnExLmZsYWdzJlZBUkFEUil7CisJbmV3LT5xMS5mbGFncyY9flZBUkFEUjsKKyAgICAgIH1lbHNleworCW5ldy0+cTEuZmxhZ3N8PURSRUZPQko7CisJbmV3LT5xMS5kdHlwPVBPSU5URVJfVFlQRShxLT5udHlwLT5uZXh0KTsKKyAgICAgIH0KKyAgICB9CisgICAgbmV3LT5jb2RlPUFTU0lHTjsKKyAgICBuZXctPnR5cGY9VU5TSUdORUR8Q0hBUjsKKyAgICBuZXctPnEyLmZsYWdzPTA7CisgICAgbmV3LT5xMi52YWwudm1heD1zaXplOworICAgIGFkZF9JQyhuZXcpOworfQorCit2b2lkIGFkZF9JQyhzdHJ1Y3QgSUMgKm5ldykKKy8qICBmdWVndCBlaW4gSUMgZWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICAgIGludCBjb2RlOworICAgIGlmKCFuZXcpIHJldHVybjsKKyAgICBpZihub2NvZGUpIHsKKyNpZmRlZiBIQVZFX01JU1JBCisJCW1pc3JhX25ldSg1MiwxNCwxLC0xKTsKKyNlbmRpZgorCQlmcmVlKG5ldyk7cmV0dXJuO30KKyAgICBuZXctPm5leHQ9MDsKKyAgICBuZXctPnExLmFtPW5ldy0+cTIuYW09bmV3LT56LmFtPTA7CisgICAgbmV3LT5saW5lPWxpbmU7IG5ldy0+ZmlsZT1maWxlbmFtZTsKKyAgICBjb2RlPW5ldy0+Y29kZTsKKyAgICBpZihjb2RlPj1CRVEmJmNvZGU8PUJSQSkgbmV3LT5xMS5mbGFncz1uZXctPnEyLmZsYWdzPW5ldy0+ei5mbGFncz0wOworICAgIGlmKGNvZGU9PUFMTE9DUkVHfHxjb2RlPT1GUkVFUkVHfHxjb2RlPT1TQVZFUkVHU3x8Y29kZT09UkVTVE9SRVJFR1MpIG5ldy0+dHlwZj0wOworICAgIGlmKERFQlVHJjY0KXsgcHJpYyhzdGRvdXQsZmlyc3RfaWMpO3ByaW50ZigibmV3XG4iKTtwcmljMihzdGRvdXQsbmV3KTtwcmludGYoIi1cbiIpO30KKyAgICBpZihuZXctPnExLmZsYWdzJlZBUil7CisgICAgICAgIGlmKCFuZXctPnExLnYpIGllcnJvcigwKTsKKyAgICAgICAgbmV3LT5xMS52LT5mbGFnc3w9VVNFREFTU09VUkNFOworICAgICAgICBpZihjb2RlPT1BRERSRVNTfHwobmV3LT5xMS5mbGFncyZWQVJBRFIpKQorCSAgaWYoIWlzX3ZsZW5ndGgobmV3LT5xMS52LT52dHlwKSkKKwkgICAgbmV3LT5xMS52LT5mbGFnc3w9VVNFREFTQURSOworICAgICAgICBuZXctPnExLnYtPnByaW9yaXR5Kz1jdXJyZW50cHJpOworICAgIH0KKyAgICBpZihuZXctPnEyLmZsYWdzJlZBUil7CisgICAgICAgIGlmKCFuZXctPnEyLnYpIGllcnJvcigwKTsKKyAgICAgICAgbmV3LT5xMi52LT5mbGFnc3w9VVNFREFTU09VUkNFOworICAgICAgICBpZihjb2RlPT1BRERSRVNTfHwobmV3LT5xMi5mbGFncyZWQVJBRFIpKQorICAgCSAgaWYoIWlzX3ZsZW5ndGgobmV3LT5xMi52LT52dHlwKSkKKwkgICAgbmV3LT5xMi52LT5mbGFnc3w9VVNFREFTQURSOworICAgICAgICBuZXctPnEyLnYtPnByaW9yaXR5Kz1jdXJyZW50cHJpOworICAgIH0KKyAgICBpZihuZXctPnouZmxhZ3MmVkFSKXsKKyAgICAgICAgaWYoIW5ldy0+ei52KSBpZXJyb3IoMCk7CisgICAgICAgIGlmKG5ldy0+ei5mbGFncyZEUkVGT0JKKQorCSAgbmV3LT56LnYtPmZsYWdzfD1VU0VEQVNTT1VSQ0U7CisJZWxzZQorCSAgbmV3LT56LnYtPmZsYWdzfD1VU0VEQVNERVNUOworICAgICAgICBuZXctPnoudi0+cHJpb3JpdHkrPWN1cnJlbnRwcmk7CisgICAgfQorICAgIGlmKGJsb2NrX3ZsYVtuZXN0aW5nXSl7CisgICAgICAvKiBzcGVjaWFsIGhhbmRsaW5nIGZvciBibG9ja3Mgd2l0aCB2YXJpYWJsZS1sZW5ndGggYXJyYXlzICovCisgICAgICBzdHJ1Y3QgbGxpc3QgKnA7CisgICAgICBpZihuZXctPmNvZGU9PUxBQkVMKXsKKwlwPW15bWFsbG9jKExTSVpFKTsKKwlwLT5sYWJlbD1uZXctPnR5cGY7CisJcC0+bmV4dD12bGFkZWZsYWJlbHNbbmVzdGluZ107CisJdmxhZGVmbGFiZWxzW25lc3RpbmddPXA7CisgICAgICB9ZWxzZSBpZigwJiZuZXctPmNvZGU9PUJSQSYmIShuZXctPmZsYWdzJkxPT1BfQ09ORF9UUlVFKSl7CisJcD1teW1hbGxvYyhMU0laRSk7CisJcC0+bGFiZWw9bmV3LT50eXBmOworCXAtPm5leHQ9dmxham1wbGFiZWxzW25lc3RpbmddOworCXZsYWptcGxhYmVsc1tuZXN0aW5nXT1wOworCXA9dmxhZGVmbGFiZWxzW25lc3RpbmddOworCXdoaWxlKHApeworCSAgaWYocC0+bGFiZWw9PW5ldy0+dHlwZikKKwkgICAgYnJlYWs7CisJICBwPXAtPm5leHQ7CisJfQorCWlmKCFwKXsgCisJICAvKiBsYWJlbCBub3QgZGVjbGFyZWQgaW4gdGhpcyBibG9jayBzbyBmYXI7CisJICAgICByZS1hZGp1c3Qgc3RhY2ssIGJ1dCBzdG9yZSB0aGUgcG9zaXRpb24gLSBsYWJlbCBtYXkgYmUKKwkgICAgIGRlY2xhcmVkIGxhdGVyIGluIHRoZSBzYW1lIGJsb2NrIGFuZCBhZGp1c3RlbWVudCBtdXN0IGJlCisJICAgICByZW1vdmVkICovCisJICBzdHJ1Y3QgdmxhYWRqdXN0X2xpc3QgKnZsOworCSAgc3RydWN0IElDICpmaXJzdDsKKwkgIGZpcnN0PWxhc3RfaWM7CisJICBmcmVldmwoKTsKKwkgIGZpcnN0PWZpcnN0LT5uZXh0OworCSAgdmw9bXltYWxsb2Moc2l6ZW9mKCp2bCkpOworCSAgdmwtPmJyYW5jaD1uZXc7CisJICB2bC0+Zmlyc3Q9Zmlyc3Q7CisJICB2bC0+bmV4dD12bGFhZGp1c3RzW25lc3RpbmddOworCSAgdmxhYWRqdXN0c1tuZXN0aW5nXT12bDsKKwl9CisgICAgICB9CisgICAgfQorICAgIGlmKC8qKGNfZmxhZ3NfdmFsWzBdLmwmMikmJiovY29kZT09TEFCRUwpeworICAgIC8qICBlbnRmZXJudCBTcHJ1ZW5nZSB6dSBkaXJla3QgZm9sZ2VuZGVuIExhYmVscyAgICAqLworICAgICAgICBzdHJ1Y3QgSUMgKnA9bGFzdF9pYzsKKyAgICAgICAgd2hpbGUocCl7CisgICAgICAgICAgICBpZihwLT50eXBmPT1uZXctPnR5cGYmJnAtPmNvZGU+PUJFUSYmcC0+Y29kZTw9QlJBKXsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgSUMgKm47CisJCWlmKHAtPmNvZGUhPUJSQSl7CisJCSAgc3RydWN0IElDICpjbXA9cC0+cHJldjsKKwkJICB3aGlsZShjbXAmJmNtcC0+Y29kZT09RlJFRVJFRykgY21wPWNtcC0+cHJldjsKKwkJICBpZihjbXAtPmNvZGU9PVRFU1QpeworCQkgICAgaWYoaXNfdm9sYXRpbGVfb2JqKCZjbXAtPnExKSkKKwkJICAgICAgYnJlYWs7CisJCSAgICBlbHNleworCQkgICAgICBpZihERUJVRyYxKSBwcmludGYoInByZWNlZGluZyB0ZXN0IHJlbW92ZWRcbiIpOworCQkgICAgICByZW1vdmVfSUMoY21wKTsKKwkJICAgIH0KKwkJICB9ZWxzZSBpZihjbXAtPmNvZGU9PUNPTVBBUkUpeworCQkgICAgaWYoaXNfdm9sYXRpbGVfb2JqKCZjbXAtPnExKXx8aXNfdm9sYXRpbGVfb2JqKCZjbXAtPnEyKSkKKwkJICAgICAgYnJlYWs7CisJCSAgICBlbHNleworCQkgICAgICBpZihERUJVRyYxKSBwcmludGYoInByZWNlZGluZyBjb21wYXJlIHJlbW92ZWRcbiIpOworCQkgICAgICByZW1vdmVfSUMoY21wKTsKKwkJICAgIH0KKwkJICB9ZWxzZQorCQkgICAgYnJlYWs7CisJCX0KKwkJaWYodmxhYWRqdXN0c1tuZXN0aW5nXSl7CisJCSAgLyogcmVtb3ZlIGl0IGZyb20gdmxhYWRqdXN0cy1saXN0cywgaWYgbmVjZXNzYXJ5ICovCisJCSAgc3RydWN0IHZsYWFkanVzdF9saXN0ICp2bD12bGFhZGp1c3RzW25lc3RpbmddOworCQkgIHdoaWxlKHZsKXsKKwkJICAgIGlmKHZsLT5icmFuY2g9PXApeworCQkgICAgICBzdHJ1Y3QgSUMgKm5wPXZsLT5icmFuY2gtPnByZXY7CisJCSAgICAgIHdoaWxlKG5wIT12bC0+Zmlyc3QtPnByZXYpeworCQkJaWYoIW5wKSBpZXJyb3IoMCk7CisJCQlucC0+Y29kZT1OT1A7CisJCQlucC0+cTEuZmxhZ3M9bnAtPnEyLmZsYWdzPW5wLT56LmZsYWdzPTA7CisJCQlucD1ucC0+cHJldjsKKwkJICAgICAgfQorCQkgICAgICB2bC0+YnJhbmNoPTA7CisJCSAgICB9CisJCSAgICB2bD12bC0+bmV4dDsKKwkJICB9CisJCX0KKyAgICAgICAgICAgICAgICBpZihERUJVRyYxKSBwcmludGYoIiVzIGwlZCBkZWxldGVkXG4iLGVuYW1lW3AtPmNvZGVdLHAtPnR5cGYpOworICAgICAgICAgICAgICAgIG49cC0+bmV4dDsKKyAgICAgICAgICAgICAgICByZW1vdmVfSUMocCk7CisgICAgICAgICAgICAgICAgcD1uOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgaWYocC0+Y29kZSE9TEFCRUwpIGJyZWFrOworICAgICAgICAgICAgICAgIHA9cC0+cHJldjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZihsYXN0X2ljKXsKKyAgICAgICAgaWYoY29kZT09QVNTSUdOKXsKKyAgICAgICAgICAgIGlmKChsYXN0X2ljLT56LmZsYWdzJihSRUd8U0NSQVRDSHxEUkVGT0JKKSk9PShSRUd8U0NSQVRDSCkmJihuZXctPnExLmZsYWdzPT1sYXN0X2ljLT56LmZsYWdzKSYmbGFzdF9pYy0+ei5yZWc9PW5ldy0+cTEucmVnLyomJmxhc3RfaWMtPmNvZGUhPUNBTEwqLyl7CisgICAgICAgICAgICAgICAgaWYoVVNFUTJBU1p8fCEobGFzdF9pYy0+cTIuZmxhZ3MmUkVHKXx8IShuZXctPnouZmxhZ3MmUkVHKXx8bGFzdF9pYy0+cTIucmVnIT1uZXctPnoucmVnKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoVVNFUTJBU1p8fCEobGFzdF9pYy0+cTIuZmxhZ3MmVkFSKXx8IShuZXctPnouZmxhZ3MmVkFSKXx8bGFzdF9pYy0+cTIudiE9bmV3LT56LnYpeworICAgICAgICAgICAgICAgICAgICAvKiAgdmVyYmluZGV0IG9wIGEsYi0+cmVnLG1vdmUgcmVnLT5jIHp1IG9wIGEsYi0+YyAgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogIGhpZXIgZmVobHQgYWJlciBub2NoIFJlZ2lzdGVyZnJlaWdhYmUgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2ljLT56PW5ldy0+ejsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKERFQlVHJjEpIHByaW50ZigibW92ZSBhbmQgb3AgY29tYmluZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoKG5ldy0+cTEuZmxhZ3MmKFNDUkFUQ0h8UkVHKSk9PShTQ1JBVENIfFJFRykmJihuZXctPnExLnJlZyE9bmV3LT56LnJlZ3x8IShuZXctPnouZmxhZ3MmUkVHKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9yZWcobmV3LT5xMS5yZWcpOworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShuZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoKGxhc3RfaWMtPnouZmxhZ3MmKFZBUnxTQ1JBVENIfERSRUZPQkopKT09KFZBUnxTQ1JBVENIKSYmKG5ldy0+cTEuZmxhZ3M9PWxhc3RfaWMtPnouZmxhZ3MpJiZsYXN0X2ljLT56LnY9PW5ldy0+cTEudi8qJiZsYXN0X2ljLT5jb2RlIT1DQUxMKi8peworICAgICAgICAgICAgICAgIGlmKFVTRVEyQVNafHwhKGxhc3RfaWMtPnEyLmZsYWdzJlJFRyl8fCEobmV3LT56LmZsYWdzJlJFRyl8fGxhc3RfaWMtPnEyLnJlZyE9bmV3LT56LnJlZyl7CisgICAgICAgICAgICAgICAgICAgIGlmKFVTRVEyQVNafHwhKGxhc3RfaWMtPnEyLmZsYWdzJlZBUil8fCEobmV3LT56LmZsYWdzJlZBUil8fGxhc3RfaWMtPnEyLnYhPW5ldy0+ei52KXsKKyAgICAgICAgICAgICAgICAgICAgLyogIHZlcmJpbmRldCBvcCBhLGItPnNjcmF0Y2gsbW92ZSBzY3JhdGNoLT5jIHp1IG9wIGEsYi0+YyAgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogIGhpZXIgZmVobHQgYWJlciBub2NoIFJlZ2lzdGVyZnJlaWdhYmUgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2ljLT56PW5ldy0+ejsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKERFQlVHJjEpIHByaW50ZigibW92ZSBhbmQgb3AgY29tYmluZWQoMilcbiIpOworLyogICAgICAgICAgICAgICAgICAgICAgICBpZigobmV3LT5xMS5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSYmKG5ldy0+cTEucmVnIT1uZXctPnoucmVnfHwhKG5ldy0+ei5mbGFncyZSRUcpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX3JlZyhuZXctPnExLnJlZyk7Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUobmV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGlmKGxhc3RfaWMtPmNvZGU9PUJSQSl7CisgICAgICAgICAgICBpZihjb2RlIT1MQUJFTCYmY29kZSE9QUxMT0NSRUcmJmNvZGUhPUZSRUVSRUcpeworICAgICAgICAgICAgLyogIGxvZXNjaHQgYWxsZXMgbmFjaCBicmEgYmlzIGVpbiBMYWJlbCBrb21tdCAgKi8KKyAgICAgICAgICAgIC8qICBtb21lbnRhbiBub2NoIG5pY2h0IHBlcmZla3QsIGRhIGVzIGJlaSBhbGxvYy9mcmVlcmVnIHN0b3BwdCAqLworICAgICAgICAgICAgICAgIGZyZWUobmV3KTsKKyNpZmRlZiBIQVZFX01JU1JBCisJCW1pc3JhX25ldSg1MiwxNCwxLC0xKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmKERFQlVHJjEpIHByaW50ZigiVW5yZWFjaGFibGUgU3RhdGVtZW50IGRlbGV0ZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGxhc3RfaWMtPnByZXYmJmNvZGU9PUxBQkVMKXsKKyAgICAgICAgICAgIC8qICBlcnNldHp0IGJjYyBsMTticmEgbDI7bDEgZHVyY2ggYiFjYyBsMiAgICAgICovCisgICAgICAgICAgICAgICAgaWYobGFzdF9pYy0+cHJldi0+Y29kZT49QkVRJiZsYXN0X2ljLT5wcmV2LT5jb2RlPD1CR1QmJm5ldy0+dHlwZj09bGFzdF9pYy0+cHJldi0+dHlwZil7CisJCSAgaWYobGFzdF9pYy0+bmV4dCkgcHJpYzIoc3Rkb3V0LGxhc3RfaWMtPm5leHQpOworICAgICAgICAgICAgICAgICAgICBpZihERUJVRyYxKSBwcmludGYoIiVzIGwlZDslcyBsJWQ7IHN1YnN0aXR1dGVkXG4iLGVuYW1lW2xhc3RfaWMtPnByZXYtPmNvZGVdLGxhc3RfaWMtPnByZXYtPnR5cGYsZW5hbWVbbGFzdF9pYy0+Y29kZV0sbGFzdF9pYy0+dHlwZik7CisgICAgICAgICAgICAgICAgICAgIGlmKGxhc3RfaWMtPnByZXYtPmNvZGUmMSkgCisJCSAgICAgIGxhc3RfaWMtPnByZXYtPmNvZGUtLTsKKwkJICAgIGVsc2UKKwkJICAgICAgbGFzdF9pYy0+cHJldi0+Y29kZSsrOworICAgICAgICAgICAgICAgICAgICBsYXN0X2ljLT5wcmV2LT50eXBmPWxhc3RfaWMtPnR5cGY7CisgICAgICAgICAgICAgICAgICAgIGxhc3RfaWM9bGFzdF9pYy0+cHJldjsKKwkJICAgIGZyZWUobGFzdF9pYy0+bmV4dCk7CisgICAgICAgICAgICAgICAgICAgIGxhc3RfaWMtPm5leHQ9bmV3O25ldy0+cHJldj1sYXN0X2ljOworICAgICAgICAgICAgICAgICAgICBsYXN0X2ljPW5ldzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorLyogICAgICAgIH0qLworICAgICAgICBuZXctPnByZXY9bGFzdF9pYzsKKyAgICAgICAgbGFzdF9pYy0+bmV4dD1uZXc7CisgICAgICAgIGxhc3RfaWM9bmV3OworICAgIH1lbHNleworICAgICAgICBsYXN0X2ljPW5ldztmaXJzdF9pYz1uZXc7bmV3LT5wcmV2PTA7CisgICAgfQorICAgIGljX2NvdW50Kys7CisgICAgLyogIE1lcmtlbiwgb24gRmxpZXNza29tbWEgYmVudXR6dCB3dXJkZSAgICAqLworICAgIGlmKGNvZGUhPUxBQkVMJiYoY29kZTxCRVF8fGNvZGU+QlJBKSl7CisgICAgICAgIGlmKElTRkxPQVQobmV3LT50eXBmKSkgZmxvYXRfdXNlZD0xOworICAgICAgICBpZihjb2RlPT1DT05WRVJUJiZJU0ZMT0FUKG5ldy0+dHlwZjIpKSBmbG9hdF91c2VkPTE7CisgICAgfQorICAgIGlmKChuZXctPnExLmZsYWdzJihTQ1JBVENIfFJFRykpPT0oU0NSQVRDSHxSRUcpJiYobmV3LT5xMS5yZWchPW5ldy0+ei5yZWd8fCEobmV3LT56LmZsYWdzJlJFRykpKQorICAgICAgICBmcmVlX3JlZyhuZXctPnExLnJlZyk7CisgICAgaWYoKG5ldy0+cTIuZmxhZ3MmKFNDUkFUQ0h8UkVHKSk9PShTQ1JBVENIfFJFRykmJihuZXctPnEyLnJlZyE9bmV3LT56LnJlZ3x8IShuZXctPnouZmxhZ3MmUkVHKSkpCisgICAgICAgIGZyZWVfcmVnKG5ldy0+cTIucmVnKTsKK30KKworbnAgZ2VuX2xpYmNhbGwoY2hhciAqZm5hbWUsbnAgYXJnMSxzdHJ1Y3QgVHlwICp0MSxucCBhcmcyLHN0cnVjdCBUeXAgKnQyKQorLyogZ2VuZXJhdGUgY2FsbCB0byBhIGxpYnJhcnkgZnVuY3Rpb24gKGVtdWxhdGUgb3BlcmF0aW9uKSAqLworeworICBucCBuZXc7IAorICBzdHJ1Y3QgYXJndW1lbnRfbGlzdCAqYWw9MCwqdDsKKyAgbmV3PW15bWFsbG9jKE5PREVTKTsKKyAgbmV3LT5mbGFncz1DQUxMOworICBuZXctPnJpZ2h0PTA7CisgIG5ldy0+bGVmdD1teW1hbGxvYyhOT0RFUyk7CisgIG5ldy0+bGVmdC0+ZmxhZ3M9SURFTlRJRklFUjsKKyAgbmV3LT5sZWZ0LT5sZWZ0PW5ldy0+bGVmdC0+cmlnaHQ9MDsKKyAgbmV3LT5sZWZ0LT5pZGVudGlmaWVyPWFkZF9pZGVudGlmaWVyKGZuYW1lLHN0cmxlbihmbmFtZSkpOworICBuZXctPmxlZnQtPm50eXA9MDsKKyAgbmV3LT5sZWZ0LT5zaWRlZng9MDsKKyAgbmV3LT5sZWZ0LT52YWwudm1heD1sMnptKDBMKTsgCisgIG5ldy0+YWxpc3Q9MDsKKyAgaWYoYXJnMSl7CisgICAgYWw9bXltYWxsb2Moc2l6ZW9mKCphbCkpOworICAgIGFsLT5hcmc9YXJnMTsKKyAgICBhbC0+bmV4dD0wOworICAgIGlmKHQxKXsKKyAgICAgIG5wIGNudj1teW1hbGxvYyhOT0RFUyk7CisgICAgICBjbnYtPmZsYWdzPUNBU1Q7CisgICAgICBjbnYtPmxlZnQ9YXJnMTsKKworICAgICAgY252LT5yaWdodD0wOworICAgICAgY252LT5udHlwPXQxOworICAgICAgYWwtPmFyZz1jbnY7CisgICAgfQorICB9CisgIGlmKGFyZzIpeworICAgIHQ9bXltYWxsb2Moc2l6ZW9mKCp0KSk7CisgICAgdC0+YXJnPWFyZzI7CisgICAgdC0+bmV4dD0wOworICAgIGFsLT5uZXh0PXQ7CisgICAgaWYodDIpeworICAgICAgbnAgY252PW15bWFsbG9jKE5PREVTKTsKKyAgICAgIGNudi0+ZmxhZ3M9Q0FTVDsKKyAgICAgIGNudi0+bGVmdD1hcmcyOworICAgICAgY252LT5yaWdodD0wOworICAgICAgY252LT5udHlwPXQyOworICAgICAgdC0+YXJnPWNudjsKKyAgICB9CisgIH0KKyAgbmV3LT5hbGlzdD1hbDsKKyAgLyogS2FubiBtYW4gdHlwZV9leHByIG5vY2htYWwgYXVmIGRpZSBBcmd1bWVudGUgYW53ZW5kZW4/ICovCisgIGlmKCF0eXBlX2V4cHJlc3Npb24obmV3KSkKKyAgICBpZXJyb3IoMCk7IAorICBnZW5fSUMobmV3LDAsMCk7CisgIHJldHVybiBuZXc7Cit9CisKKwordm9pZCBnZW5fSUMobnAgcCxpbnQgbHRydWUsaW50IGxmYWxzZSkKKy8qICBFcnpldWd0IGVpbmUgSUMtTGlzdGUgYXVzIGVpbmVyIGV4cHJlc3Npb24gICAgICAqLworeworICAgIHN0cnVjdCBJQyAqbmV3OyBzdHJ1Y3QgcmVnYXJnc19saXN0ICpybDsKKyAgICBpZighcCkgcmV0dXJuOworICAgIGlmKHAtPmZsYWdzPT1TVFJJTkcpeworICAgIC8qICBoaWVyIGZlaGx0IG5vY2ggZGllIFZlcndhbHR1bmcgZGVyIFN0cmluZy1JbmhhbHRlICAgKi8KKyAgICAgICAgcC0+by52PWFkZF92YXIoZW1wdHksY2xvbmVfdHlwKHAtPm50eXApLFNUQVRJQyxwLT5jbCk7CisgICAgICAgIHAtPm8udi0+ZmxhZ3N8PURFRklORUQ7CisgICAgICAgIHAtPm8uZmxhZ3M9VkFSOworICAgICAgICBwLT5vLnJlZz0wOworICAgICAgICBwLT5vLnZhbD1wLT52YWw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYocC0+ZmxhZ3M9PUlERU5USUZJRVIpeworLyogICAgICAgIHAtPm8udj1maW5kX3ZhcihwLT5pZGVudGlmaWVyLDApOyovCisgICAgICAgIHAtPm8uZmxhZ3M9VkFSOworICAgICAgICBwLT5vLnJlZz0wOworICAgICAgICBwLT5vLnZhbD1wLT52YWw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYocC0+ZmxhZ3M9PUNFWFBSfHxwLT5mbGFncz09UENFWFBSKXsKKyAgICAgICAgaWYocC0+bGVmdCl7CisgICAgICAgICAgICBpZihwLT5sZWZ0LT5mbGFncz09UE9TVElOQykgcC0+bGVmdC0+ZmxhZ3M9UFJFSU5DOworICAgICAgICAgICAgaWYocC0+bGVmdC0+ZmxhZ3M9PVBPU1RERUMpIHAtPmxlZnQtPmZsYWdzPVBSRURFQzsKKyAgICAgICAgICAgIGdlbl9JQyhwLT5sZWZ0LDAsMCk7CisgICAgICAgICAgICBpZigocC0+bGVmdC0+by5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSkgZnJlZV9yZWcocC0+bGVmdC0+by5yZWcpOworICAgICAgICB9CisgICAgICAgIGlmKHAtPnJpZ2h0KXsKKyAgICAgICAgICAgIGlmKHAtPnJpZ2h0LT5mbGFncz09UE9TVElOQykgcC0+cmlnaHQtPmZsYWdzPVBSRUlOQzsKKyAgICAgICAgICAgIGlmKHAtPnJpZ2h0LT5mbGFncz09UE9TVERFQykgcC0+cmlnaHQtPmZsYWdzPVBSRURFQzsKKyAgICAgICAgICAgIGdlbl9JQyhwLT5yaWdodCwwLDApOworICAgICAgICAgICAgaWYoKHAtPnJpZ2h0LT5vLmZsYWdzJihTQ1JBVENIfFJFRykpPT0oU0NSQVRDSHxSRUcpKSBmcmVlX3JlZyhwLT5yaWdodC0+by5yZWcpOworICAgICAgICB9CisgICAgICAgIHAtPm8uZmxhZ3M9S09OU1Q7CisgICAgICAgIHAtPm8udmFsPXAtPnZhbDsKKyAgICAgICAgcC0+by5yZWc9MDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZihwLT5mbGFncz09S09NTUEpeworICAgICAgICBpZihwLT5sZWZ0LT5zaWRlZngpeworICAgICAgICAgICAgZ2VuX0lDKHAtPmxlZnQsMCwwKTsKKyAgICAgICAgICAgIGlmKChwLT5sZWZ0LT5vLmZsYWdzJihTQ1JBVENIfFJFRykpPT0oU0NSQVRDSHxSRUcpKSBmcmVlX3JlZyhwLT5sZWZ0LT5vLnJlZyk7CisgICAgICAgIH1lbHNlIGlmKCEocC0+bGVmdC0+bnR5cC0+ZmxhZ3MmVk9MQVRJTEUpKSAKKwkgIGVycm9yKDEyOSk7CisgICAgICAgIGdlbl9JQyhwLT5yaWdodCwwLDApOworICAgICAgICBwLT5vPXAtPnJpZ2h0LT5vOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHAtPmZsYWdzPT1DQVNUKXsKKyAgICAgICAgZ2VuX0lDKHAtPmxlZnQsMCwwKTsKKyAgICAgICAgaWYoKHAtPm50eXAtPmZsYWdzJk5RKT09Vk9JRCl7CisgICAgICAgICAgICBpZigocC0+bGVmdC0+by5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSkgZnJlZV9yZWcocC0+bGVmdC0+by5yZWcpOworICAgICAgICAgICAgcC0+by5mbGFncz0wOworICAgICAgICB9ZWxzZXsKKwkgIGlmKElTUE9JTlRFUihwLT5udHlwLT5mbGFncykmJihwLT5udHlwLT5uZXh0LT5mbGFncyZWT0xBVElMRSkpCisJICAgIHZvbGF0aWxlX2NvbnZlcnQ9MTsKKwkgIGNvbnZlcnQocC0+bGVmdCxwLT5udHlwLT5mbGFncyk7CisJICBpZih2b2xhdGlsZV9jb252ZXJ0KXsKKwkgICAgaWYoIShwLT5sZWZ0LT5vLmZsYWdzJlZBUikpCisJICAgICAgaWVycm9yKDApOworCSAgICBpZighcC0+bGVmdC0+by52LT52dHlwLT5uZXh0KQorCSAgICAgIGllcnJvcigwKTsKKwkgICAgcC0+bGVmdC0+by52LT52dHlwLT5uZXh0LT5mbGFnc3w9Vk9MQVRJTEU7CisJICAgIHZvbGF0aWxlX2NvbnZlcnQ9MDsKKwkgIH0KKwkgIHAtPm89cC0+bGVmdC0+bzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHAtPmZsYWdzPT1GSVJTVEVMRU1FTlQpeworICAgICAgICBnZW5fSUMocC0+bGVmdCwwLDApOworICAgICAgICBwLT5vPXAtPmxlZnQtPm87CisgICAgICAgIHJldHVybjsKKyAgICB9CisjaWYgSEFWRV9MSUJDQUxMUworICAgIHsgY2hhciAqbGlibmFtZTsKKyAgICBpZihsaWJuYW1lPXVzZV9saWJjYWxsKHApKXsKKyAgICAgIG5wIGxjO3N0cnVjdCBUeXAgKnQxLCp0MjsKKyAgICAgIGlmKHAtPmZsYWdzPT1MU0hJRlR8fHAtPmZsYWdzPT1SU0hJRlQpeworCXQxPWNsb25lX3R5cChwLT5udHlwKTsKKwl0Mj1uZXdfdHlwKCk7CisJdDItPmZsYWdzPUlOVDsKKyAgICAgIH1lbHNleworCXQxPWFyaXRoX3R5cChwLT5sZWZ0LT5udHlwLHAtPnJpZ2h0LT5udHlwKTsKKwl0Mj1jbG9uZV90eXAodDEpOworICAgICAgfQorICAgICAgbGM9Z2VuX2xpYmNhbGwobGlibmFtZSxwLT5sZWZ0LHQxLHAtPnJpZ2h0LHQyKTsKKyAgICAgICpwPSpsYzsKKyAgICAgIGZyZWUobGMpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICBuZXc9bmV3X0lDKCk7CisgICAgbmV3LT50eXBmPXAtPm50eXAtPmZsYWdzOworICAgIG5ldy0+cTEucmVnPW5ldy0+cTIucmVnPW5ldy0+ei5yZWc9MDsKKyAgICBuZXctPnExLmZsYWdzPW5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CisgICAgaWYoKHAtPmZsYWdzPj1MU0hJRlQmJnAtPmZsYWdzPD1NT0QpfHwocC0+ZmxhZ3M+PU9SJiZwLT5mbGFnczw9QU5EKXx8cC0+ZmxhZ3M9PVBNVUxUKXsKKyAgICAgIGRvX2FyaXRoKHAsbmV3LDAsMCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHAtPmZsYWdzPT1DT05URU5UKXsKKyAgICAgICAgZ2VuX0lDKHAtPmxlZnQsMCwwKTsKKyAgICAgICAgaWYocC0+bGVmdC0+by5mbGFncyZWQVJBRFIpeworICAgICAgICAgICAgZnJlZShuZXcpOworICAgICAgICAgICAgcC0+bz1wLT5sZWZ0LT5vOworICAgICAgICAgICAgcC0+by5mbGFncyY9flZBUkFEUjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZighKHAtPmxlZnQtPm8uZmxhZ3MmRFJFRk9CSikpeworICAgICAgICAgICAgZnJlZShuZXcpOworICAgICAgICAgICAgcC0+bz1wLT5sZWZ0LT5vOworICAgICAgICAgICAgcC0+by5mbGFnc3w9RFJFRk9CSjsKKwkgICAgcC0+by5kdHlwPXAtPmxlZnQtPm50eXAtPmZsYWdzOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICBpZigocC0+bGVmdC0+by5mbGFncyZTQ1JBVENIKSYmcC0+bGVmdC0+by5kdHlwPT1QT0lOVEVSX1RZUEUocC0+bnR5cCkpeworICAgICAgICAgICAgbmV3LT56PXAtPmxlZnQtPm87CisgICAgICAgICAgICBuZXctPnouZmxhZ3MmPX5EUkVGT0JKOworICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgZ2V0X3NjcmF0Y2goJm5ldy0+eixwLT5sZWZ0LT5udHlwLT5mbGFncyxwLT5udHlwLT5mbGFncyxwLT5sZWZ0LT5udHlwKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbmV3LT5jb2RlPUFTU0lHTjtuZXctPnR5cGY9UE9JTlRFUl9UWVBFKHAtPm50eXApOworICAgICAgICAgIG5ldy0+cTE9cC0+bGVmdC0+bzsKKyAgICAgICAgICBuZXctPnEyLnZhbC52bWF4PXNpemV0YWJbbmV3LT50eXBmXTsKKyAgICAgICAgICBwLT5vPW5ldy0+ejsKKyAgICAgICAgICBhZGRfSUMobmV3KTsKKyAgICAgICAgICBwLT5vLmZsYWdzfD1EUkVGT0JKOworCSAgcC0+by5kdHlwPVBPSU5URVJfVFlQRShwLT5udHlwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHAtPmZsYWdzPT1BU1NJR04peworICAgICAgICBuZXctPmNvZGU9QVNTSUdOOworICAgICAgICBnZW5fSUMocC0+cmlnaHQsMCwwKTsKKyAgICAgICAgZ2VuX0lDKHAtPmxlZnQsMCwwKTsKKyAgICAgICAgY29udmVydChwLT5yaWdodCxwLT5udHlwLT5mbGFncyk7CisgICAgICAgIG5ldy0+cTE9cC0+cmlnaHQtPm87CisgICAgICAgIG5ldy0+ej1wLT5sZWZ0LT5vOworICAgICAgICBuZXctPnEyLnZhbC52bWF4PXN6b2YocC0+bGVmdC0+bnR5cCk7CisgICAgICAgIHAtPm89bmV3LT56OworICAgICAgICBhZGRfSUMobmV3KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZihwLT5mbGFncz09QVNTSUdOT1ApeworICAgIC8qICBkYXMgaGllciBpc3QgbmljaHQgYmVzb25kZXJzIHNjaG9lbiAqLworICAgICAgc3RydWN0IG9iaiBvLHE7c3RydWN0IElDICpuO2ludCBmO2NoYXIgKmxpYm5hbWU7CisgICAgICBpZihwLT5yaWdodC0+cmlnaHQ9PTApeworICAgICAgICAvKiAgc293YXMgd2llIGErPTAgd3VyZGUgd2Vnb3B0aW1pZXJ0ICAgKi8KKwlmcmVlKG5ldyk7CisJcC0+bz1wLT5sZWZ0LT5vOworCXJldHVybjsKKyAgICAgIH0KKyNpZiBIQVZFX0xJQkNBTExTCisgICAgICBpZihsaWJuYW1lPXVzZV9saWJjYWxsKHAtPnJpZ2h0KSl7CisJbnAgbGM7c3RydWN0IFR5cCAqdDEsKnQyOworCXQxPWNsb25lX3R5cChwLT5udHlwKTsKKwlpZihwLT5yaWdodC0+ZmxhZ3M9PUxTSElGVHx8cC0+cmlnaHQtPmZsYWdzPT1SU0hJRlQpeworCSAgdDI9bmV3X3R5cCgpOworCSAgdDItPmZsYWdzPUlOVDsKKwl9ZWxzZQorCSAgdDI9Y2xvbmVfdHlwKHAtPm50eXApOworCWxjPWdlbl9saWJjYWxsKGxpYm5hbWUscC0+cmlnaHQtPmxlZnQsdDEscC0+cmlnaHQtPnJpZ2h0LHQyKTsKKwkqcC0+cmlnaHQ9KmxjOworCW89cC0+bGVmdC0+bzsKKwlwLT5sZWZ0PTA7CisJZnJlZShsYyk7CisgICAgICB9ZWxzZQorI2VuZGlmCisJeworCSAgZj1kb19hcml0aChwLT5yaWdodCxuZXcscC0+bGVmdCwmbyk7CisJICBpZighZikgaWVycm9yKDApOworCSAgaWYoZj4xKSBpZXJyb3IoMCk7CisJfQorICAgICAgaWYoIW5vY29kZSYmKG8uZmxhZ3MmKFNDUkFUQ0h8UkVHKSk9PShTQ1JBVENIfFJFRykmJiFyZWdzW28ucmVnXSl7CisJLyogIHVlYmVyZmx1ZXNzaWdlcyBGUkVFUkVHIGVudGZlcm5lbiAgICovCisJbj1sYXN0X2ljOworCXdoaWxlKG4peworCSAgaWYoIW5vY29kZSYmbi0+Y29kZT09Q0FMTCYmcmVnc2NyYXRjaFtvLnJlZ10peworCSAgICBzdHJ1Y3QgSUMgKnJldDsKKwkgICAgcmVnc1tvLnJlZ109MTsKKwkgICAgc2F2ZXNjcmF0Y2goTU9WRUZST01SRUcsbi0+cHJldiwwLCZuLT5xMSk7CisJICAgIHJldD1uLT5uZXh0OworCSAgICB3aGlsZShyZXQtPmNvZGU9PUFMTE9DUkVHfHxyZXQtPmNvZGU9PUZSRUVSRUcpCisJICAgICAgcmV0PXJldC0+bmV4dDsKKwkgICAgaWYocmV0LT5jb2RlPT1HRVRSRVRVUk4peworCSAgICAgIGlmKChyZXQtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnJldC0+ei5yZWc9PW8ucmVnKSByZXQtPnouZmxhZ3MmPX5SRUc7CisJICAgIH1lbHNlCisJICAgICAgcmV0PXJldC0+cHJldjsKKwkgICAgc2F2ZXNjcmF0Y2goTU9WRVRPUkVHLHJldCwwLCZuLT5xMSk7CisJICB9CisJICBpZihuLT5jb2RlPT1GUkVFUkVHJiZuLT5xMS5yZWc9PW8ucmVnKXsKKwkgICAgcmVtb3ZlX0lDKG4pO2lmKCFub2NvZGUpIHJlZ3Nbby5yZWddPTE7CisJICAgIGJyZWFrOworCSAgfQorCSAgbj1uLT5wcmV2OworCX0KKyAgICAgIH0KKyAgICAgIGNvbnZlcnQocC0+cmlnaHQscC0+bnR5cC0+ZmxhZ3MpOworICAgICAgbmV3PW5ld19JQygpOworICAgICAgbmV3LT50eXBmPXAtPm50eXAtPmZsYWdzOworICAgICAgbmV3LT5xMi5mbGFncz0wOworICAgICAgbmV3LT5jb2RlPUFTU0lHTjsKKyAgICAgIG5ldy0+cTE9cC0+cmlnaHQtPm87CisgICAgICBuZXctPno9bzsKKyAgICAgIG5ldy0+cTIudmFsLnZtYXg9c3pvZihwLT5udHlwKTsKKyAgICAgIHAtPm89bmV3LT56OworICAgICAgYWRkX0lDKG5ldyk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHAtPmZsYWdzPT1NSU5VU3x8cC0+ZmxhZ3M9PUtPTVBMRU1FTlQpeworICAgICAgbmV3LT5jb2RlPXAtPmZsYWdzOworICAgICAgZ2VuX0lDKHAtPmxlZnQsMCwwKTsKKyAgICAgIGNvbnZlcnQocC0+bGVmdCxwLT5udHlwLT5mbGFncyk7CisgICAgICBpZigocC0+bGVmdC0+by5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSYmcmVnb2socC0+bGVmdC0+by5yZWcscC0+bnR5cC0+ZmxhZ3MsMCkpeworCW5ldy0+ej1wLT5sZWZ0LT5vOworCW5ldy0+ei5mbGFncyY9fkRSRUZPQko7CisgICAgICB9ZWxzZXsKKwlnZXRfc2NyYXRjaCgmbmV3LT56LHAtPmxlZnQtPm50eXAtPmZsYWdzLDAscC0+bGVmdC0+bnR5cCk7CisgICAgICB9CisgICAgICBuZXctPnExPXAtPmxlZnQtPm87CisgICAgICBwLT5vPW5ldy0+ejsKKyAgICAgIGFkZF9JQyhuZXcpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZihwLT5mbGFncz09QUREUkVTU3x8cC0+ZmxhZ3M9PUFERFJFU1NBfHxwLT5mbGFncz09QUREUkVTU1MpeworICAgICAgaWYocC0+ZmxhZ3MhPUFERFJFU1NTJiZwLT5sZWZ0LT5mbGFncz09SURFTlRJRklFUiYmaXNfdmxlbmd0aChwLT5sZWZ0LT5udHlwKSl7CisJZ2VuX0lDKHAtPmxlZnQsMCwwKTsKKwlpZighKHAtPmxlZnQtPm8uZmxhZ3MmVkFSKSkKKwkgIGllcnJvcigwKTsKKwlmcmVlKG5ldyk7CisJcC0+bz1wLT5sZWZ0LT5vOworCXJldHVybjsKKyAgICAgIH0KKyAgICAgIG5ldy0+Y29kZT1BRERSRVNTOworICAgICAgbmV3LT50eXBmPXAtPmxlZnQtPm50eXAtPmZsYWdzOworICAgICAgbmV3LT50eXBmMj1QT0lOVEVSX1RZUEUocC0+bGVmdC0+bnR5cCk7CisgICAgICBnZW5fSUMocC0+bGVmdCwwLDApOworICAgICAgaWYocC0+bGVmdC0+by5mbGFncyZWQVIpIHAtPmxlZnQtPm8udi0+ZmxhZ3N8PShVU0VEQVNTT1VSQ0V8VVNFREFTREVTVCk7CisgICAgICBpZihwLT5sZWZ0LT5vLmZsYWdzJkRSRUZPQkopeworCWZyZWUobmV3KTsKKwlwLT5vPXAtPmxlZnQtPm87CisJcC0+by5mbGFncyY9fkRSRUZPQko7CisJcmV0dXJuOworICAgICAgfQorICAgICAgaWYoKHAtPmxlZnQtPm8uZmxhZ3MmVkFSKSYmIShwLT5sZWZ0LT5vLmZsYWdzJlZBUkFEUikKKwkgJiYocC0+bGVmdC0+by52LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk58fHAtPmxlZnQtPm8udi0+c3RvcmFnZV9jbGFzcz09U1RBVElDKSl7CisJZnJlZShuZXcpOworCXAtPm89cC0+bGVmdC0+bzsKKwlwLT5vLmZsYWdzfD1WQVJBRFI7CisJcmV0dXJuOworICAgICAgfQorICAgICAgbmV3LT5xMT1wLT5sZWZ0LT5vOworICAgICAgZ2V0X3NjcmF0Y2goJm5ldy0+eixQT0lOVEVSX1RZUEUocC0+bnR5cC0+bmV4dCkscC0+bnR5cC0+bmV4dC0+ZmxhZ3MsMCk7CisgICAgICBwLT5vPW5ldy0+ejsKKyAgICAgIGFkZF9JQyhuZXcpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZihwLT5mbGFncz09TEFORHx8cC0+ZmxhZ3M9PUxPUil7CisgICAgICAgIGludCBsMSxsMixsMyxsNDsKKy8qICAgICAgICBwcmludGYoIiVzIHRydWU9JWQgZmFsc2U9JWRcbiIsZW5hbWVbcC0+ZmxhZ3NdLGx0cnVlLGxmYWxzZSk7Ki8KKyAgICAgICAgbDE9KytsYWJlbDsKKwlpZighbHRydWUpIHtsMj0rK2xhYmVsO2wzPSsrbGFiZWw7bDQ9KytsYWJlbDt9CisgICAgICAgIGlmKCFsdHJ1ZSl7CisJICBpZihwLT5mbGFncz09TEFORCkKKwkgICAgZ2VuX0lDKHAtPmxlZnQsbDEsbDMpOworCSAgZWxzZSAKKwkgICAgZ2VuX0lDKHAtPmxlZnQsbDMsbDEpOworICAgICAgICB9ZWxzZXsKKwkgIGlmKHAtPmZsYWdzPT1MQU5EKSAKKwkgICAgZ2VuX0lDKHAtPmxlZnQsbDEsbGZhbHNlKTsKKwkgIGVsc2UgCisJICAgIGdlbl9JQyhwLT5sZWZ0LGx0cnVlLGwxKTsKKyAgICAgICAgfQorICAgICAgICBpZihwLT5sZWZ0LT5vLmZsYWdzIT0wKXsKKyAgICAgICAgICAgIGlmKHAtPmZsYWdzPT1MQU5EKQorICAgICAgICAgICAgICAgIGdlbl90ZXN0KCZwLT5sZWZ0LT5vLHAtPmxlZnQtPm50eXAtPmZsYWdzLEJFUSwoKCFsdHJ1ZSk/bDM6bGZhbHNlKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2VuX3Rlc3QoJnAtPmxlZnQtPm8scC0+bGVmdC0+bnR5cC0+ZmxhZ3MsQk5FLCgoIWx0cnVlKT9sMzpsdHJ1ZSkpOworICAgICAgICB9CisgICAgICAgIGdlbl9sYWJlbChsMSk7CisgICAgICAgIGlmKCFsdHJ1ZSl7CisJICBpZihwLT5mbGFncz09TEFORCkgCisJICAgIGdlbl9JQyhwLT5yaWdodCxsMixsMyk7CisJICBlbHNlCisJICAgIGdlbl9JQyhwLT5yaWdodCxsMyxsMik7CisgICAgICAgIH1lbHNlCisJICBnZW5fSUMocC0+cmlnaHQsbHRydWUsbGZhbHNlKTsKKyAgICAgICAgaWYocC0+cmlnaHQtPm8uZmxhZ3MhPTApeworICAgICAgICAgICAgaWYocC0+ZmxhZ3M9PUxBTkQpCisgICAgICAgICAgICAgICAgZ2VuX3Rlc3QoJnAtPnJpZ2h0LT5vLHAtPnJpZ2h0LT5udHlwLT5mbGFncyxCRVEsKCghbHRydWUpP2wzOmxmYWxzZSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdlbl90ZXN0KCZwLT5yaWdodC0+byxwLT5yaWdodC0+bnR5cC0+ZmxhZ3MsQk5FLCgoIWx0cnVlKT9sMzpsdHJ1ZSkpOworICAgICAgICB9CisgICAgICAgIGlmKCFsdHJ1ZSl7CisgICAgICAgICAgICBnZW5fbGFiZWwobDIpOworICAgICAgICAgICAgaWYocC0+ZmxhZ3M9PUxBTkQpIGdlbl9jb25kKCZwLT5vLDAsbDMsbDQpOyBlbHNlIGdlbl9jb25kKCZwLT5vLDEsbDMsbDQpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgICAgICAgIG5ldy0+Y29kZT1CUkE7CisgICAgICAgICAgICBpZihwLT5mbGFncz09TEFORCkgbmV3LT50eXBmPWx0cnVlOyBlbHNlIG5ldy0+dHlwZj1sZmFsc2U7CisgICAgICAgICAgICBhZGRfSUMobmV3KTsKKyAgICAgICAgfQorICAgICAgICBpZihsdHJ1ZSkgcC0+by5mbGFncz0wOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHAtPmZsYWdzPT1ORUdBVElPTil7CisgICAgICAgIGludCBsMSxsMixsMzsKKyAgICAgICAgaWYoIWx0cnVlKSB7bDE9KytsYWJlbDtsMj0rK2xhYmVsO2wzPSsrbGFiZWw7fQorICAgICAgICBpZihsdHJ1ZSkKKwkgIGdlbl9JQyhwLT5sZWZ0LGxmYWxzZSxsdHJ1ZSk7CisJZWxzZQorCSAgZ2VuX0lDKHAtPmxlZnQsbDEsbDMpOworICAgICAgICBpZighcC0+bGVmdC0+by5mbGFncyl7CisJICBmcmVlKG5ldyk7cC0+by5mbGFncz0wOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGdlbl90ZXN0KCZwLT5sZWZ0LT5vLHAtPmxlZnQtPm50eXAtPmZsYWdzLEJORSwoKCFsdHJ1ZSk/bDE6bGZhbHNlKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYobHRydWUpeworICAgICAgICAgICAgbmV3PW5ld19JQygpOworICAgICAgICAgICAgbmV3LT5jb2RlPUJSQTsKKyAgICAgICAgICAgIGlmKCFsdHJ1ZSkgbmV3LT50eXBmPWwyOyBlbHNlIG5ldy0+dHlwZj1sdHJ1ZTsKKyAgICAgICAgICAgIGFkZF9JQyhuZXcpOworICAgICAgICAgICAgcC0+by5mbGFncz0wOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGdlbl9sYWJlbChsMyk7CisgICAgICAgICAgICBnZW5fY29uZCgmcC0+bywwLGwxLGwyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHAtPmZsYWdzPj1FUVVBTCYmcC0+ZmxhZ3M8PUdSRUFURVJFUSl7CisgICAgICAgIGludCBsMSxsMixsMyx0bCx0cjsKKyAgICAgICAgaWYoIWx0cnVlKSB7bDE9KytsYWJlbDtsMj0rK2xhYmVsO2wzPSsrbGFiZWw7fQorICAgICAgICBpZihwLT5sZWZ0LT5mbGFncz09Q0VYUFIpeworICAgICAgICAvKiAgS29uc3RhbnRlbiBuYWNoIHJlY2h0cyAgKi8KKyAgICAgICAgICAgIG5wIG1lcms7bWVyaz1wLT5sZWZ0O3AtPmxlZnQ9cC0+cmlnaHQ7cC0+cmlnaHQ9bWVyazsKKyAgICAgICAgICAgIGlmKHAtPmZsYWdzPT1MRVNTKSBwLT5mbGFncz1HUkVBVEVSOworICAgICAgICAgICAgZWxzZSBpZihwLT5mbGFncz09TEVTU0VRKSBwLT5mbGFncz1HUkVBVEVSRVE7CisgICAgICAgICAgICBlbHNlIGlmKHAtPmZsYWdzPT1HUkVBVEVSKSBwLT5mbGFncz1MRVNTOworICAgICAgICAgICAgZWxzZSBpZihwLT5mbGFncz09R1JFQVRFUkVRKSBwLT5mbGFncz1MRVNTRVE7CisgICAgICAgIH0KKyAgICAgICAgbmV3LT5jb2RlPUNPTVBBUkU7CisgICAgICAgIHRsPXAtPmxlZnQtPm50eXAtPmZsYWdzJk5VO3RyPXAtPnJpZ2h0LT5udHlwLT5mbGFncyZOVTsKKyAgICAgICAgaWYocC0+cmlnaHQtPmZsYWdzPT1DRVhQUiYmSVNJTlQodHIpJiZJU0lOVCh0bCkpeworICAgICAgICAgICAgaW50IG5lZ2F0aXY7CisgICAgICAgICAgICBldmFsX2NvbnN0bihwLT5yaWdodCk7CisgICAgICAgICAgICBpZih6bWxlcSh2bWF4LGwyem0oMEwpKSkgbmVnYXRpdj0xOyBlbHNlIG5lZ2F0aXY9MDsKKyAgICAgICAgICAgIGlmKCh0bCZVTlNJR05FRCl8fCh0ciZVTlNJR05FRCkpIG5lZ2F0aXY9MDsKKyAgICAgICAgICAgIGlmKCghbmVnYXRpdnx8em1sZXEodF9taW4odGwpLHZtYXgpKSYmKG5lZ2F0aXZ8fHp1bWxlcSh2dW1heCx0X21heCh0bCkpKSl7CisgICAgICAgICAgICAgICAgY29udmVydChwLT5yaWdodCx0bCk7CisgICAgICAgICAgICAgICAgdHI9dGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoSVNBUklUSCh0bCkmJih0bCE9dHJ8fCFzaG9ydGN1dChDT01QQVJFLHRsKSkpeworICAgICAgICAgICAgc3RydWN0IFR5cCAqdDsKKyAgICAgICAgICAgIHQ9YXJpdGhfdHlwKHAtPmxlZnQtPm50eXAscC0+cmlnaHQtPm50eXApOworICAgICAgICAgICAgbmV3LT50eXBmPXQtPmZsYWdzOworICAgICAgICAgICAgZnJlZXR5cCh0KTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBuZXctPnR5cGY9cC0+bGVmdC0+bnR5cC0+ZmxhZ3M7CisgICAgICAgIH0KKyAgICAgICAgZ2VuX0lDKHAtPmxlZnQsMCwwKTsKKyAgICAgICAgY29udmVydChwLT5sZWZ0LG5ldy0+dHlwZik7CisgICAgICAgIGdlbl9JQyhwLT5yaWdodCwwLDApOworICAgICAgICBjb252ZXJ0KHAtPnJpZ2h0LG5ldy0+dHlwZik7CisgICAgICAgIG5ldy0+cTE9cC0+bGVmdC0+bzsKKyAgICAgICAgbmV3LT5xMj1wLT5yaWdodC0+bzsKKyAgICAgICAgbmV3LT56LmZsYWdzPTA7CisJaWYocC0+ZmxhZ3M9PUVRVUFMfHxwLT5mbGFncz09SU5FUVVBTCl7CisJICAvKiBnZW5lcmF0ZSBURVNULCBpZiBwb3NzaWJsZSAqLworCSAgaWYobmV3LT5xMi5mbGFncyZLT05TVCl7CisJICAgIGV2YWxfY29uc3QoJm5ldy0+cTIudmFsLG5ldy0+dHlwZik7CisJICAgIGlmKHptZXF0byh2bWF4LGwyem0oMEwpKSYmenVtZXF0byh2dW1heCx1bDJ6dW0oMFVMKSkmJnpsZGVxdG8odmxkb3VibGUsZDJ6bGQoMC4wKSkpeworCSAgICAgIG5ldy0+Y29kZT1URVNUOworCSAgICAgIG5ldy0+cTIuZmxhZ3M9MDsKKwkgICAgfQorCSAgfQorCX0KKyAgICAgICAgYWRkX0lDKG5ldyk7CisgICAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgICAgaWYocC0+ZmxhZ3M9PUVRVUFMKSBuZXctPmNvZGU9QkVROworICAgICAgICBpZihwLT5mbGFncz09SU5FUVVBTCkgbmV3LT5jb2RlPUJORTsKKyAgICAgICAgaWYocC0+ZmxhZ3M9PUxFU1MpIG5ldy0+Y29kZT1CTFQ7CisgICAgICAgIGlmKHAtPmZsYWdzPT1MRVNTRVEpIG5ldy0+Y29kZT1CTEU7CisgICAgICAgIGlmKHAtPmZsYWdzPT1HUkVBVEVSKSBuZXctPmNvZGU9QkdUOworICAgICAgICBpZihwLT5mbGFncz09R1JFQVRFUkVRKSBuZXctPmNvZGU9QkdFOworICAgICAgICBpZihsdHJ1ZSkgbmV3LT50eXBmPWx0cnVlOyBlbHNlIG5ldy0+dHlwZj1sMTsKKyAgICAgICAgYWRkX0lDKG5ldyk7CisgICAgICAgIGlmKGx0cnVlKXsKKyAgICAgICAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgICAgICAgIG5ldy0+Y29kZT1CUkE7CisgICAgICAgICAgICBuZXctPnR5cGY9bGZhbHNlOworICAgICAgICAgICAgYWRkX0lDKG5ldyk7CisgICAgICAgICAgICBwLT5vLmZsYWdzPTA7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgZ2VuX2xhYmVsKGwzKTsKKyAgICAgICAgICAgIGdlbl9jb25kKCZwLT5vLDEsbDEsbDIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYocC0+ZmxhZ3M9PUNBTEwpeworICAgICAgICBpbnQgcj0wO3N0cnVjdCBvYmogKm9wLGNmdW5jLHJldF9vYmo7em1heCBzejsKKyAgICAgICAgaW50IG1yZWdzW01BWFIrMV07CisJc3RydWN0IElDICpjYWxsaWM7CisjaWZkZWYgT1JERVJFRF9QVVNICisgICAgICAgIHN0cnVjdCBJQyAqbWVya19mcCwqbHA7CisJdW5zaWduZWQgaW50IG1lcmtfb3B1c2hlZD1vcHVzaGVkOworI2VuZGlmCisgICAgICAgIGlmKHAtPmxlZnQtPmZsYWdzPT1BRERSRVNTJiZwLT5sZWZ0LT5sZWZ0LT5mbGFncz09SURFTlRJRklFUil7CisgICAgICAgICAgICBzdHJ1Y3QgVmFyICp2OworICAgICAgICAgICAgZ2VuX0lDKHAtPmxlZnQsMCwwKTsgcj0xOworICAgICAgICAgICAgdj1wLT5sZWZ0LT5vLnY7CisgICAgICAgICAgICBpZih2LT5maSYmdi0+ZmktPmZpcnN0X2ljJiYhY3Jvc3NfbW9kdWxlJiYoY19mbGFnc192YWxbMF0ubCY0MDk2KSl7CisgICAgICAgICAgICAvKiAgZnVuY3Rpb24gY2FsbCBpbmxpbmluZyAgKi8KKyAgICAgICAgICAgICAgICBzdHJ1Y3QgYXJndW1lbnRfbGlzdCAqYWw7CisgICAgICAgICAgICAgICAgc3RydWN0IFZhciAqdnAsKiphcmdsMSwqKmFyZ2wyOworICAgICAgICAgICAgICAgIHN0cnVjdCBJQyAqaXA7aW50IGxjOworICAgICAgICAgICAgICAgIGludCBhcmdfY250PTAsaTsKKyAgICAgICAgICAgICAgICBpZihERUJVRyYxMDI0KXsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJpbmxpbmluZyBjYWxsIHRvIDwlcz5cbiIsdi0+aWRlbnRpZmllcik7CisgICAgICAgICAgICAgICAgICAgIGZvcih2cD12LT5maS0+dmFyczt2cDt2cD12cC0+bmV4dCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMoJWxkKS8lcFxuIix2cC0+aWRlbnRpZmllcix6bTJsKHZwLT5vZmZzZXQpLCh2b2lkKil2cCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvcih2cD12LT5maS0+dmFyczt2cDt2cD12cC0+bmV4dCl7CisJCSAgLypGSVhNRTogem1lcXRvIGhpZXIgb2s/IHNpZWhlIGNyb3NzX21vZHVsZV9pbmxpbmUgKi8KKwkJICBpZigoem1lcXRvKHZwLT5vZmZzZXQsbDJ6bSgwTCkpfHx2cC0+cmVnKSYmKnZwLT5pZGVudGlmaWVyJiYodnAtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHZwLT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikpIGFyZ19jbnQrKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiAgQXJndW1lbnRlIGluIGRpZSBlcnN0ZW4gUGFyYW1ldGVydmFyaWFibGVuIGtvcGllcmVuICovCisgICAgICAgICAgICAgICAgYXJnbDE9bXltYWxsb2MoYXJnX2NudCpzaXplb2Yoc3RydWN0IFZhciAqKSk7CisgICAgICAgICAgICAgICAgYXJnbDI9bXltYWxsb2MoYXJnX2NudCpzaXplb2Yoc3RydWN0IFZhciAqKSk7CisKKyAgICAgICAgICAgICAgICBhbD1wLT5hbGlzdDt2cD12LT5maS0+dmFycztpPTA7CisgICAgICAgICAgICAgICAgd2hpbGUoYWwpeworCQkgICAgLypGSVhNRTogem1lcXRvIGhpZXIgb2s/IHNpZWhlIGNyb3NzX21vZHVsZV9pbmxpbmUgKi8KKwkJICAgIHdoaWxlKHZwJiYoISp2cC0+aWRlbnRpZmllcnx8KCF6bWVxdG8odnAtPm9mZnNldCxsMnptKDBMKSkmJiF2cC0+cmVnKXx8KHZwLT5zdG9yYWdlX2NsYXNzIT1SRUdJU1RFUiYmdnAtPnN0b3JhZ2VfY2xhc3MhPUFVVE8pKSkgdnA9dnAtPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIGlmKCF2cCl7IGVycm9yKDM5KTsgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgaWYoaT49YXJnX2NudCkgaWVycm9yKDApOworICAgICAgICAgICAgICAgICAgICBpZihERUJVRyYxMDI0KSBwcmludGYoImFyZzogJXMoJWxkKVxuIix2cC0+aWRlbnRpZmllcix6bTJsKHZwLT5vZmZzZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgYXJnbDFbaV09dnA7CisgICAgICAgICAgICAgICAgICAgIGFyZ2wyW2ldPWFkZF92YXIoZW1wdHksY2xvbmVfdHlwKHZwLT52dHlwKSx2cC0+c3RvcmFnZV9jbGFzcywwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIWFsLT5hcmcpIGllcnJvcigwKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX0lDKGFsLT5hcmcsMCwwKTsKKyAgICAgICAgICAgICAgICAgICAgY29udmVydChhbC0+YXJnLHZwLT52dHlwLT5mbGFncyk7CisgICAgICAgICAgICAgICAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3LT5jb2RlPUFTU0lHTjsKKyAgICAgICAgICAgICAgICAgICAgbmV3LT5xMT1hbC0+YXJnLT5vOworICAgICAgICAgICAgICAgICAgICBuZXctPnEyLmZsYWdzPTA7CisgICAgICAgICAgICAgICAgICAgIG5ldy0+cTIudmFsLnZtYXg9c3pvZih2cC0+dnR5cCk7CisgICAgICAgICAgICAgICAgICAgIG5ldy0+ei5mbGFncz1WQVI7CisgICAgICAgICAgICAgICAgICAgIG5ldy0+ei52YWwudm1heD1sMnptKDBMKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3LT56LnY9YXJnbDJbaV07CisgICAgICAgICAgICAgICAgICAgIG5ldy0+dHlwZj12cC0+dnR5cC0+ZmxhZ3M7CisgICAgICAgICAgICAgICAgICAgIGFkZF9JQyhuZXcpOworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIGFsPWFsLT5uZXh0OworICAgICAgICAgICAgICAgICAgICB2cD12cC0+bmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoaTxhcmdfY250KXsgZXJyb3IoODMpOyBhcmdfY250PWk7fQorCisgICAgICAgICAgICAgICAgLyogIEtvcGllbiBkZXIgVmFyaWFibGVuIGVyemV1Z2VuICAgKi8KKyAgICAgICAgICAgICAgICBmb3IodnA9di0+ZmktPnZhcnM7dnA7dnA9dnAtPm5leHQpeworICAgICAgICAgICAgICAgICAgICB2cC0+aW5saW5lX2NvcHk9MDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yKGk9MDtpPGFyZ19jbnQ7aSsrKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoYXJnbDFbaV0peworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWFyZ2wyW2ldKSBpZXJyb3IoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcmdsMVtpXS0+aW5saW5lX2NvcHk9YXJnbDJbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiAgUnVlY2tnYWJld2VydCAgICovCisgICAgICAgICAgICAgICAgaWYoKHAtPm50eXAtPmZsYWdzJk5RKSE9Vk9JRCl7CisgICAgICAgICAgICAgICAgICAgIHAtPm8uZmxhZ3M9U0NSQVRDSHxWQVI7CisgICAgICAgICAgICAgICAgICAgIHAtPm8ucmVnPTA7cC0+by52YWwudm1heD1sMnptKDBMKTsKKyAgICAgICAgICAgICAgICAgICAgcC0+by52PWFkZF92YXIoZW1wdHksY2xvbmVfdHlwKHAtPm50eXApLEFVVE8sMCk7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIHAtPm8uZmxhZ3M9MDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmcmVlKGFyZ2wxKTsKKyAgICAgICAgICAgICAgICBmcmVlKGFyZ2wyKTsKKworICAgICAgICAgICAgICAgIC8qICBDb2RlIGVpbmZ1ZWdlbiB1bmQgTGFiZWxzIHVtc2NocmVpYmVuICAgKi8KKyAgICAgICAgICAgICAgICBpcD12LT5maS0+Zmlyc3RfaWM7bGM9MDsKKyAgICAgICAgICAgICAgICB3aGlsZShpcCl7CisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBWYXIgKml2OworICAgICAgICAgICAgICAgICAgICBpbnQgYzsKKyAgICAgICAgICAgICAgICAgICAgbmV3PW5ld19JQygpOworCQkgICAgKm5ldz0qaXA7CisJCSAgICBpcC0+Y29weT1uZXc7CisgICAgICAgICAgICAgICAgICAgIGM9aXAtPmNvZGU7CisgICAgICAgICAgICAgICAgICAgIC8qICBldnRsLiBpc3QgZWluIElDIHByYWt0aXNjaCBlaW4gU0VUUkVUVVJOLCBmYWxscyBkYXMgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogIFJ1ZWNrZ2FiZXppZWwgdWViZXIgUGFyYW1ldGVyemVpZ2VyIGFuZ2VzcHIuIHdpcmQgICAqLworICAgICAgICAgICAgICAgICAgICBpZihpcC0+ei5mbGFncyZWQVIpeworICAgICAgICAgICAgICAgICAgICAgIGl2PWlwLT56LnY7CisgICAgICAgICAgICAgICAgICAgICAgaWYoaXYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fGl2LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CisgICAgICAgICAgICAgICAgICAgICAgICBpZighKml2LT5pZGVudGlmaWVyJiZ6bWVxdG8oaXYtPm9mZnNldCxsMnptKDBMKSkpeworICAgICAgICAgICAgICAgICAgICAgICAgICBuZXctPno9cC0+bzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICBpZighaXYtPmlubGluZV9jb3B5KXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdi0+aW5saW5lX2NvcHk9YWRkX3ZhcihlbXB0eSxjbG9uZV90eXAoaXYtPnZ0eXApLGl2LT5zdG9yYWdlX2NsYXNzLDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2LT5pbmxpbmVfY29weS0+cmVnPWl2LT5yZWc7CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3LT56LnY9aXYtPmlubGluZV9jb3B5OworICAgICAgICAgICAgICAgICAgICAgICAgfS8qZWxzZSBpZihpdi0+aW5saW5lX2NvcHkpIGllcnJvcigwKTsqLworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiAgS29waWVuIGFsbGVyIGF1dG8vcmVnaXN0ZXIgVmFyaWFibGVuIGVyemV1Z2VuICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYoaXAtPnExLmZsYWdzJlZBUil7CisgICAgICAgICAgICAgICAgICAgICAgaXY9aXAtPnExLnY7CisgICAgICAgICAgICAgICAgICAgICAgaWYoaXYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fGl2LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CisgICAgICAgICAgICAgICAgICAgICAgICBpZighaXYtPmlubGluZV9jb3B5KXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXYtPmlubGluZV9jb3B5PWFkZF92YXIoZW1wdHksY2xvbmVfdHlwKGl2LT52dHlwKSxpdi0+c3RvcmFnZV9jbGFzcywwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXYtPmlubGluZV9jb3B5LT5yZWc9aXYtPnJlZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+cTEudj1pdi0+aW5saW5lX2NvcHk7CisgICAgICAgICAgICAgICAgICAgICAgfS8qZWxzZSBpZihpdi0+aW5saW5lX2NvcHkpIGllcnJvcigwKTsqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKGlwLT5xMi5mbGFncyZWQVIpeworICAgICAgICAgICAgICAgICAgICAgIGl2PWlwLT5xMi52OworICAgICAgICAgICAgICAgICAgICAgIGlmKGl2LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxpdi0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWl2LT5pbmxpbmVfY29weSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGl2LT5pbmxpbmVfY29weT1hZGRfdmFyKGVtcHR5LGNsb25lX3R5cChpdi0+dnR5cCksaXYtPnN0b3JhZ2VfY2xhc3MsMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGl2LT5pbmxpbmVfY29weS0+cmVnPWl2LT5yZWc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXctPnEyLnY9aXYtPmlubGluZV9jb3B5OworICAgICAgICAgICAgICAgICAgICAgIH0vKmVsc2UgaWYoaXYtPmlubGluZV9jb3B5KSBpZXJyb3IoMCk7Ki8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihjPT1DQUxMKXsKKwkJICAgICAgaW50IGk7CisJCSAgICAgIGZ1bmN0aW9uX2NhbGxzKz1jdXJyZW50cHJpOworCQkgICAgICBuZXctPmFyZ19saXN0PW15bWFsbG9jKHNpemVvZigqbmV3LT5hcmdfbGlzdCkqbmV3LT5hcmdfY250KTsKKwkJICAgICAgZm9yKGk9MDtpPG5ldy0+YXJnX2NudDtpKyspIG5ldy0+YXJnX2xpc3RbaV09aXAtPmFyZ19saXN0W2ldLT5jb3B5OworCQkgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihjPT1MQUJFTHx8KGM+PUJFUSYmYzw9QlJBKSl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihuZXctPnR5cGY+bGMpIGxjPW5ldy0+dHlwZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+dHlwZis9bGFiZWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoYz09U0VUUkVUVVJOKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+Y29kZT1BU1NJR047CisgICAgICAgICAgICAgICAgICAgICAgICBuZXctPno9cC0+bzsKKyAgICAgICAgICAgICAgICAgICAgfQorCQkgICAgYWRkX0lDKG5ldyk7CisgICAgICAgICAgICAgICAgICAgIGlwPWlwLT5uZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYWJlbCs9bGM7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogIGVpbmlnZSBzcGV6aWVsbGUgSW5saW5lLUZ1bmt0aW9uZW47IGRhcyBzZXR6dCB2b3JhdXMsIGRhc3MgICovCisgICAgICAgICAgICAvKiAgZGllc2UgaW4gZGVuIEhlYWRlcmZpbGVzIHBhc3NlbmQgZGVrbGFyaWVydCB3ZXJkZW4gICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisJICAgICAgICBpZigob3B0ZmxhZ3MmMikmJiFzdHJjbXAodi0+aWRlbnRpZmllciwic3RybGVuIikmJnAtPmFsaXN0JiZwLT5hbGlzdC0+YXJnKXsKKyAgICAgICAgICAgICAgICAgICAgbnAgbj1wLT5hbGlzdC0+YXJnOworICAgICAgICAgICAgICAgICAgICBpZihuLT5mbGFncz09QUREUkVTU0EmJm4tPmxlZnQtPmZsYWdzPT1TVFJJTkcmJnptZXF0byhuLT5sZWZ0LT52YWwudm1heCxsMnptKDBMKSkpeworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbnN0X2xpc3QgKmNsO3p1bWF4IGxlbj11bDJ6dW0oMFVMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsPW4tPmxlZnQtPmNsOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoY2wpeworCQkJICBpZih6bWVxdG8obDJ6bSgwTCksemMyem0oY2wtPm90aGVyLT52YWwudmNoYXIpKSkgYnJlYWs7CisJCQkgIGxlbj16dW1hZGQobGVuLHVsMnp1bSgxVUwpKTsKKwkJCSAgY2w9Y2wtPm5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwLT5vLnZhbC52dW1heD1sZW47CisgICAgICAgICAgICAgICAgICAgICAgICBldmFsX2NvbnN0KCZwLT5vLnZhbCxVTlNJR05FRHxNQVhJTlQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0X2NvbnN0bihwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydF9jb25zdCgmcC0+by52YWwscC0+bnR5cC0+ZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZmxhZ3M9Q0VYUFI7CisgICAgICAgICAgICAgICAgICAgICAgICBwLT5vLmZsYWdzPUtPTlNUOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoSU5MSU5FTUVNQ1BZPjAmJihvcHRmbGFncyYyKSl7CisgICAgICAgICAgICAgICAgICAgIGlmKCFzdHJjbXAodi0+aWRlbnRpZmllciwic3RyY3B5IikmJnAtPmFsaXN0JiZwLT5hbGlzdC0+bmV4dCYmcC0+YWxpc3QtPm5leHQtPmFyZyl7CisgICAgICAgICAgICAgICAgICAgICAgICBucCBuPXAtPmFsaXN0LT5uZXh0LT5hcmc7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihuLT5mbGFncz09QUREUkVTU0EmJm4tPmxlZnQtPmZsYWdzPT1TVFJJTkcmJnptZXF0byhuLT5sZWZ0LT52YWwudm1heCxsMnptKDBMKSkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb25zdF9saXN0ICpjbDt6bWF4IGxlbj1sMnptKDBMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbD1uLT5sZWZ0LT5jbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShjbCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbj16bWFkZChsZW4sbDJ6bSgxTCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih6bWVxdG8oemMyem0oY2wtPm90aGVyLT52YWwudmNoYXIpLGwyem0oMEwpKSkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsPWNsLT5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih6bWxlcShsZW4sbDJ6bSgobG9uZylJTkxJTkVNRU1DUFkpKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZV9tZW1jcHkocC0+YWxpc3QtPmFyZyxuLGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPm89cC0+YWxpc3QtPmFyZy0+bzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZighc3RyY21wKHYtPmlkZW50aWZpZXIsIm1lbWNweSIpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHAtPmFsaXN0JiZwLT5hbGlzdC0+bmV4dCYmcC0+YWxpc3QtPm5leHQtPm5leHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICYmcC0+YWxpc3QtPm5leHQtPm5leHQtPmFyZworICAgICAgICAgICAgICAgICAgICAgICAgICAgJiZwLT5hbGlzdC0+bmV4dC0+bmV4dC0+YXJnLT5mbGFncz09Q0VYUFIpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWxfY29uc3RuKHAtPmFsaXN0LT5uZXh0LT5uZXh0LT5hcmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHptbGVxKHZtYXgsbDJ6bSgobG9uZylJTkxJTkVNRU1DUFkpKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZV9tZW1jcHkocC0+YWxpc3QtPmFyZyxwLT5hbGlzdC0+bmV4dC0+YXJnLHZtYXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5vPXAtPmFsaXN0LT5hcmctPm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmw9MDsKKyAgICAgICAgaWYoIShvcHRmbGFncyYyKSl7CisgICAgICAgICAgaW50IHI7CisgICAgICAgICAgZm9yKHI9MTtyPD1NQVhSO3IrKyl7bXJlZ3Nbcl09cmVnc1tyXTtyZWdzW3JdJj1+MzI7fQorICAgICAgICB9CisjaWZkZWYgT1JERVJFRF9QVVNICisgICAgICAgIG1lcmtfZnA9Zmlyc3RfcHVzaGVkOworICAgICAgICBmaXJzdF9wdXNoZWQ9MDsKKyAgICAgICAgbHA9bGFzdF9pYzsKKyNlbmRpZgorI2lmZGVmIEhBVkVfUkVHUEFSTVMKKyAgICAgICAgaWYoIWZyZXR1cm4ocC0+bnR5cCkmJihwLT5udHlwLT5mbGFncyZOUSkhPVZPSUQpeworICAgICAgICAgIHN0cnVjdCBJQyAqbmV3MjtzdGF0aWMgc3RydWN0IFR5cCBwdHlwPXswfTsKKwkgIHN0cnVjdCByZWdfaGFuZGxlIHJlZ19oYW5kbGU9ZW1wdHlfcmVnX2hhbmRsZTsKKwkgIGludCByZWc7CisgICAgICAgICAgbmV3Mj1uZXdfSUMoKTsKKyAgICAgICAgICBuZXcyLT5jb2RlPUFERFJFU1M7CisgICAgICAgICAgbmV3Mi0+dHlwZj1wLT5udHlwLT5mbGFnczsKKwkgIG5ldzItPnR5cGYyPVBPSU5URVJfVFlQRShwLT5udHlwKTsKKyAgICAgICAgICBuZXcyLT5xMS5mbGFncz1WQVI7CisgICAgICAgICAgbmV3Mi0+cTEudj1hZGRfdmFyKGVtcHR5LGNsb25lX3R5cChwLT5udHlwKSxBVVRPLDApOworICAgICAgICAgIG5ldzItPnExLnZhbC52bWF4PWwyem0oMEwpOworICAgICAgICAgIG9wPSZuZXcyLT5xMTsKKyAgICAgICAgICBuZXcyLT5xMi5mbGFncz0wOworICAgICAgICAgIGdldF9zY3JhdGNoKCZuZXcyLT56LFBPSU5URVJfVFlQRShwLT5udHlwKSxwLT5udHlwLT5mbGFncywwKTsKKyAgICAgICAgICByZXRfb2JqPW5ldzItPno7CisgICAgICAgICAgYWRkX0lDKG5ldzIpOworCSAgcHR5cC5uZXh0PXAtPm50eXA7CisJICBwdHlwLmZsYWdzPVBPSU5URVJfVFlQRShwLT5udHlwKTsKKwkgIHJlZz1yZWdfcGFybSgmcmVnX2hhbmRsZSwmcHR5cCwwLHAtPmxlZnQtPm50eXApOworCSAgaWYoIXJlZykgaWVycm9yKDApOworCSAgc3o9cHVzaF9hcmdzKHAtPmFsaXN0LHAtPmxlZnQtPm50eXAtPm5leHQtPmV4YWN0LDAsJnJsLCZyZWdfaGFuZGxlLCZyZXRfb2JqLHAtPm50eXAscmVnLHAtPmxlZnQtPm50eXApOworCSAgaWYob3B0ZmxhZ3MmMikKKwkgICAgaGFuZGxlX3JlZ2xpc3QocmwsJnJldF9vYmopOworCX1lbHNleworCSAgc3RydWN0IHJlZ19oYW5kbGUgcmVnX2hhbmRsZT1lbXB0eV9yZWdfaGFuZGxlOworCSAgc3o9cHVzaF9hcmdzKHAtPmFsaXN0LHAtPmxlZnQtPm50eXAtPm5leHQtPmV4YWN0LDAsJnJsLCZyZWdfaGFuZGxlLDAsMCwtMSxwLT5sZWZ0LT5udHlwKTsKKwkgIGlmKG9wdGZsYWdzJjIpCisJICAgIGhhbmRsZV9yZWdsaXN0KHJsLDApOworCX0KKyNlbHNlCisgICAgICAgIHN6PXB1c2hfYXJncyhwLT5hbGlzdCxwLT5sZWZ0LT5udHlwLT5uZXh0LT5leGFjdCwwLCZybCk7CisJaWYob3B0ZmxhZ3MmMikKKwkgIGhhbmRsZV9yZWdsaXN0KHJsLDApOworI2VuZGlmCisgICAgICAgIGlmKCFyKSBnZW5fSUMocC0+bGVmdCwwLDApOworICAgICAgICBpZighKHAtPmxlZnQtPm8uZmxhZ3MmRFJFRk9CSikpeworICAgICAgICAgICAgZnJlZShuZXcpOworICAgICAgICAgICAgcC0+bz1wLT5sZWZ0LT5vOworICAgICAgICAgICAgaWYocC0+by5mbGFncyZWQVJBRFIpeworCSAgICAgIHAtPm8uZmxhZ3MmPX5WQVJBRFI7CisJICAgIH1lbHNleworCSAgICAgIHAtPm8uZmxhZ3N8PURSRUZPQko7CisJICAgICAgcC0+by5kdHlwPXAtPmxlZnQtPm50eXAtPmZsYWdzOworCSAgICB9CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgaWYocC0+bGVmdC0+by5mbGFncyZWQVJBRFIpeworICAgICAgICAgICAgICAgIGZyZWUobmV3KTsKKyAgICAgICAgICAgICAgICBwLT5vPXAtPmxlZnQtPm87CisgICAgICAgICAgICAgICAgcC0+by5mbGFncyY9flZBUkFEUjsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGlmKChwLT5sZWZ0LT5vLmZsYWdzJlNDUkFUQ0gpJiZwLT5udHlwLT5mbGFncz09cC0+bGVmdC0+bnR5cC0+ZmxhZ3MpeworCQkgIG5ldy0+ej1wLT5sZWZ0LT5vOworCQkgIG5ldy0+ei5mbGFncyY9fkRSRUZPQko7CisgICAgICAgICAgICAgICAgfWVsc2V7CisJCSAgZ2V0X3NjcmF0Y2goJm5ldy0+eixwLT5sZWZ0LT5udHlwLT5mbGFncyxGVU5LVCxwLT5sZWZ0LT5udHlwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmV3LT5jb2RlPUFTU0lHTjsKKwkJbmV3LT50eXBmPXAtPmxlZnQtPm50eXAtPmZsYWdzOworICAgICAgICAgICAgICAgIG5ldy0+cTE9cC0+bGVmdC0+bzsKKyAgICAgICAgICAgICAgICBuZXctPnEyLnZhbC52bWF4PXNpemV0YWJbbmV3LT50eXBmXTsKKyAgICAgICAgICAgICAgICBuZXctPnEyLmZsYWdzPTA7CisgICAgICAgICAgICAgICAgcC0+bz1uZXctPno7CisgICAgICAgICAgICAgICAgYWRkX0lDKG5ldyk7CisgICAgICAgICAgICAgICAgcC0+by5mbGFnc3w9RFJFRk9CSjsKKwkJcC0+by5kdHlwPXAtPmxlZnQtPm50eXAtPmZsYWdzOworICAgICAgICAgICAgfQorICAgICAgICB9CisvKiAgICAgICAgICAgIHAtPmxlZnQtPm8uZmxhZ3MtPURSRUZPQkp8VkFSQURSOyBXYXMgc29sbHRlIGRhcz8/ICAgICovCisKKyNpZiAwCisgICAgICAgIGlmKG9wdGZsYWdzJjIpeworICAgICAgICAgICAgd2hpbGUocmwpeworICAgICAgICAgICAgICAgIHN0cnVjdCByZWdhcmdzX2xpc3QgKm07CisgICAgICAgICAgICAgICAgbmV3PW5ld19JQygpOworICAgICAgICAgICAgICAgIG5ldy0+Y29kZT1OT1A7CisgICAgICAgICAgICAgICAgbmV3LT5xMS5mbGFncz1WQVI7CisgICAgICAgICAgICAgICAgbmV3LT5xMS52PXJsLT52OworICAgICAgICAgICAgICAgIG5ldy0+cTEudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICAgICAgICAgICAgbmV3LT50eXBmPTA7CisgICAgICAgICAgICAgICAgbmV3LT5xMi5mbGFncz1uZXctPnouZmxhZ3M9MDsKKyAgICAgICAgICAgICAgICBhZGRfSUMobmV3KTsKKyAgICAgICAgICAgICAgICBtPXJsLT5uZXh0O2ZyZWUocmwpO3JsPW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfUkVHUEFSTVMKKyAgICAgICAgLyogIGdlZ2ViZW5lbmZhbGxzIEFkcmVzc2UgZGVzIFppZWxzIGF1ZiBkZW4gU3RhY2sgICovCisgICAgICAgIGlmKCFmcmV0dXJuKHAtPm50eXApJiYocC0+bnR5cC0+ZmxhZ3MmTlEpIT1WT0lEKXsKKyNpZmRlZiBPUkRFUkVEX1BVU0gKKyAgICAgICAgICAgIGllcnJvcigwKTsKKyNlbmRpZgorICAgICAgICAgICAgbmV3PW5ld19JQygpOworICAgICAgICAgICAgbmV3LT5jb2RlPUFERFJFU1M7CisgICAgICAgICAgICBuZXctPnR5cGY9cC0+bnR5cC0+ZmxhZ3M7CisJICAgIG5ldy0+dHlwZjI9UE9JTlRFUl9UWVBFKHAtPm50eXAtPm5leHQpOworICAgICAgICAgICAgbmV3LT5xMS5mbGFncz1WQVI7CisgICAgICAgICAgICBuZXctPnExLnY9YWRkX3ZhcihlbXB0eSxjbG9uZV90eXAocC0+bnR5cCksQVVUTywwKTsKKyAgICAgICAgICAgIG5ldy0+cTEudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICAgICAgICBvcD0mbmV3LT5xMTsKKyAgICAgICAgICAgIG5ldy0+cTIuZmxhZ3M9MDsKKyAgICAgICAgICAgIGdldF9zY3JhdGNoKCZuZXctPnosUE9JTlRFUl9UWVBFKHAtPm50eXApLHAtPm50eXAtPmZsYWdzLDApOworICAgICAgICAgICAgcmV0X29iaj1uZXctPno7CisgICAgICAgICAgICBhZGRfSUMobmV3KTsKKyAgICAgICAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgICAgICAgIG5ldy0+Y29kZT1QVVNIOworICAgICAgICAgICAgbmV3LT50eXBmPVBPSU5URVJfVFlQRShwLT5udHlwKTsKKyAgICAgICAgICAgIG5ldy0+cTE9cmV0X29iajsKKyAgICAgICAgICAgIG5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CisgICAgICAgICAgICBuZXctPnEyLnZhbC52bWF4PXNpemV0YWJbbmV3LT50eXBmXTsKKwkgICAgbmV3LT56LnZhbC52bWF4PW5ldy0+cTIudmFsLnZtYXg7CisgICAgICAgICAgICBhZGRfSUMobmV3KTsKKyAgICAgICAgICAgIHN6PXptYWRkKHN6LHNpemV0YWJbbmV3LT50eXBmXSk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8qICBTY3JhdGNocmVnaXN0ZXIgZXZ0bC4gc2ljaGVybiAgICovCisJY2Z1bmM9cC0+bzsKKyAgICAgICAgaWYoIW5vY29kZSkKKwkgIHNhdmVzY3JhdGNoKE1PVkVGUk9NUkVHLGxhc3RfaWMsMCwmY2Z1bmMpOworICAgICAgICBmdW5jdGlvbl9jYWxscys9Y3VycmVudHByaTsKKyAgICAgICAgbmV3PW5ld19JQygpOworICAgICAgICBuZXctPmNvZGU9Q0FMTDsKKwljYWxsaWM9bmV3OworCWlmKHAtPmFsaXN0KXsKKwkgIC8qIGluc2VydCBsaXN0IG9mIGFyZ3VtZW50IElDcyAqLworCSAgaW50IGk9MDsKKwkgIHN0cnVjdCBhcmd1bWVudF9saXN0ICphPXAtPmFsaXN0OworCSAgd2hpbGUoYSl7aSsrO2E9YS0+bmV4dDt9CisJICBuZXctPmFyZ19jbnQ9aTsKKwkgIG5ldy0+YXJnX2xpc3Q9bXltYWxsb2Moc2l6ZW9mKCpuZXctPmFyZ19saXN0KSppKTsKKwkgIGZvcihhPXAtPmFsaXN0LGk9MDthO2E9YS0+bmV4dCxpKyspIG5ldy0+YXJnX2xpc3RbaV09YS0+cHVzaGljOworCX1lbHNleworCSAgbmV3LT5hcmdfY250PTA7CisJICBuZXctPmFyZ19saXN0PTA7CisJfQorICAgICAgICBuZXctPnR5cGY9RlVOS1Q7CisgICAgICAgIG5ldy0+cTE9cC0+bzsKKyAgICAgICAgbmV3LT5xMi5mbGFncz1uZXctPnouZmxhZ3M9MDsKKyAgICAgICAgbmV3LT5xMi52YWwudm1heD1zejsgLyogIEdyb2Vzc2UgZGVyIFBhcmFtZXRlciBhdWYgZGVtIFN0YWNrICovCisgICAgICAgIGFkZF9JQyhuZXcpOworCisgICAgICAgIGlmKG9wdGZsYWdzJjIpeworICAgICAgICAgICAgd2hpbGUocmwpeworICAgICAgICAgICAgICAgIHN0cnVjdCByZWdhcmdzX2xpc3QgKm07CisgICAgICAgICAgICAgICAgbmV3PW5ld19JQygpOworICAgICAgICAgICAgICAgIG5ldy0+Y29kZT1OT1A7CisgICAgICAgICAgICAgICAgbmV3LT5xMS5mbGFncz1WQVI7CisgICAgICAgICAgICAgICAgbmV3LT5xMS52PXJsLT52OworICAgICAgICAgICAgICAgIG5ldy0+cTEudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICAgICAgICAgICAgbmV3LT50eXBmPTA7CisgICAgICAgICAgICAgICAgbmV3LT5xMi5mbGFncz1uZXctPnouZmxhZ3M9MDsKKyAgICAgICAgICAgICAgICBhZGRfSUMobmV3KTsKKyAgICAgICAgICAgICAgICBtPXJsLT5uZXh0O2ZyZWUocmwpO3JsPW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByPTA7CisgICAgICAgIGlmKChwLT5udHlwLT5mbGFncyZOUSkhPVZPSUQpeworICAgICAgICAgICAgbmV3PW5ld19JQygpOworICAgICAgICAgICAgbmV3LT5jb2RlPUdFVFJFVFVSTjsKKyAgICAgICAgICAgIG5ldy0+cTEuZmxhZ3M9bmV3LT5xMi5mbGFncz0wOworICAgICAgICAgICAgbmV3LT5xMS5yZWc9ZnJldHVybihwLT5udHlwKTsKKyAgICAgICAgICAgIG5ldy0+cTIudmFsLnZtYXg9c3pvZihwLT5udHlwKTsKKyAgICAgICAgICAgIG5ldy0+dHlwZj1wLT5udHlwLT5mbGFnczsKKyAgICAgICAgICAgIGlmKGZyZXR1cm4ocC0+bnR5cCkpeworICAgICAgICAgICAgICBpbnQgdD1wLT5udHlwLT5mbGFncyZOUTsKKyAgICAgICAgICAgICAgaWYoSVNTVFJVQ1QodCl8fElTVU5JT04odCkpeworICAgICAgICAgICAgICAgIG5ldy0+ei52PWFkZF92YXIoZW1wdHksY2xvbmVfdHlwKHAtPm50eXApLEFVVE8sMCk7CisgICAgICAgICAgICAgICAgbmV3LT56LmZsYWdzPVZBUjsKKyAgICAgICAgICAgICAgICBuZXctPnoudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGlmKG9wdGZsYWdzJjIpeworICAgICAgICAgICAgICAgICAgZ2V0X3NjcmF0Y2goJm5ldy0+eixwLT5udHlwLT5mbGFncywwLHAtPm50eXApOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgLyogU3VjaGUgZ2VlaWduZXRlcyBSZWdpc3RlciwgdW0gUnVlY2tnYWJld2VydCB6dSBzcGVpY2hlcm4uICovCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVnYXJnc19saXN0ICpsMjsKKyAgICAgICAgICAgICAgICAgIGludCByOworICAgICAgICAgICAgICAgICAgcj1uZXctPnExLnJlZzsKKyAgICAgICAgICAgICAgICAgIGlmKHJlZ3Nbcl18fCFyZWdvayhyLHAtPm50eXAtPmZsYWdzLDApfHwocmVnX3BhaXIociwmcnApJiYocmVnc1tycC5yMV18fHJlZ3NbcnAucjJdKSkpeworICAgICAgICAgICAgICAgICAgICByPTA7CisgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGwyPXJsO2wyO2wyPWwyLT5uZXh0KXsKKyAgICAgICAgICAgICAgICAgICAgICBpZihsMi0+diYmYWJzKGwyLT5yZWcpPT1yKSB7cj0wO2JyZWFrO30KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgaWYocj09MCl7CisgICAgICAgICAgICAgICAgICAgIGZvcihyPTE7cjw9TUFYUjtyKyspeworICAgICAgICAgICAgICAgICAgICAgIGlmKCFyZWdzW3JdJiZyZWdvayhyLHAtPm50eXAtPmZsYWdzLDApJiYoIXJlZ19wYWlyKHIsJnJwKXx8KCFyZWdzW3JwLnIxXSYmIXJlZ3NbcnAucjJdKSkpeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGwyPXJsO2wyO2wyPWwyLT5uZXh0KXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobDItPnYmJmFicyhsMi0+cmVnKT09cikgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZihsMikgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGlmKHI+PTEmJnI8PU1BWFIpeworICAgICAgICAgICAgICAgICAgICBhbGxvY19oYXJkcmVnKHIpOworICAgICAgICAgICAgICAgICAgICBuZXctPnouZmxhZ3M9KFJFR3xTQ1JBVENIKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3LT56LnJlZz1yOworICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIGdldF9zY3JhdGNoKCZuZXctPnoscC0+bnR5cC0+ZmxhZ3MsMCxwLT5udHlwKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICBuZXctPno9Km9wOworICAgICAgICAgICAgaWYoKG5ldy0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKSByPW5ldy0+ei5yZWc7CisgICAgICAgICAgICBwLT5vPW5ldy0+ejsKKyAgICAgICAgICAgIGFkZF9JQyhuZXcpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHAtPm8uZmxhZ3M9MDsKKyAgICAgICAgfQorICAgICAgICAvKiAgU2NyYXRjaHJlZ2lzdGVyIGV2dGwuIHdpZWRlcmhlcnN0ZWxsZW4gICovCisgICAgICAgIGlmKCFub2NvZGUpCisJICBzYXZlc2NyYXRjaChNT1ZFVE9SRUcsbGFzdF9pYyxyLCZjZnVuYyk7CisgICAgICAgIGlmKCEob3B0ZmxhZ3MmMikpeworICAgICAgICAgIGludCByOworICAgICAgICAgIGZvcihyPTE7cjw9TUFYUjtyKyspeworICAgICAgICAgICAgaWYocmVnc1tyXSkKKyAgICAgICAgICAgICAgcmVnc1tyXXw9KG1yZWdzW3JdJjMyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogIEV2dGwuIGdlc3BlaWNoZXJ0ZSBSZWdpc3RlcmFyZ3VtZW50ZSB3aWVkZXJoZXJzdGVsbGVuLiAgKi8KKyAgICAgICAgd2hpbGUocmwpeworICAgICAgICAgICAgc3RydWN0IHJlZ2FyZ3NfbGlzdCAqbTsKKyAgICAgICAgICAgIGlmKHJsLT52KXsKKwkgICAgICBpbnQgcjsKKwkgICAgICBmb3Iocj1NQVhSO3I+PTE7ci0tKXsKKwkJaWYocmVnc1tyXSYmcmVnX3BhaXIociwmcnApJiYocnAucjE9PWFicyhybC0+cmVnKXx8cnAucjI9PWFicyhybC0+cmVnKSkpCisJCSAgYnJlYWs7CisJICAgICAgfQorCSAgICAgIGlmKHI8PTEpIHI9YWJzKHJsLT5yZWcpOworCSAgICAgIG5ldz1uZXdfSUMoKTsKKwkgICAgICBuZXctPmNvZGU9TU9WRVRPUkVHOworCSAgICAgIG5ldy0+dHlwZj0wOworCSAgICAgIG5ldy0+cTEuZmxhZ3M9VkFSfERPTlRSRUdJU1RFUklaRTsKKwkgICAgICBuZXctPnExLnY9cmwtPnY7CisJICAgICAgbmV3LT5xMS52YWwudm1heD1sMnptKDBMKTsKKwkgICAgICBuZXctPnouZmxhZ3M9UkVHOworCSAgICAgIG5ldy0+ei5yZWc9YWJzKHIpOworCSAgICAgIG5ldy0+cTIuZmxhZ3M9MDsKKwkgICAgICBuZXctPnEyLnZhbC52bWF4PXJlZ3NpemVbcl07CisJICAgICAgYWRkX0lDKG5ldyk7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICAgICAgICAgICAgbmV3LT5jb2RlPUZSRUVSRUc7CisgICAgICAgICAgICAgICAgbmV3LT50eXBmPTA7CisgICAgICAgICAgICAgICAgbmV3LT5xMS5mbGFncz1SRUc7CisgICAgICAgICAgICAgICAgbmV3LT5xMi5mbGFncz1uZXctPnouZmxhZ3M9MDsKKyAgICAgICAgICAgICAgICBuZXctPnExLnJlZz1hYnMocmwtPnJlZyk7CisgICAgICAgICAgICAgICAgYWRkX0lDKG5ldyk7CisgICAgICAgICAgICAgICAgcmVnc1thYnMocmwtPnJlZyldPTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtPXJsLT5uZXh0O2ZyZWUocmwpO3JsPW07CisgICAgICAgIH0KKyNpZmRlZiBPUkRFUkVEX1BVU0gKKyAgICAgICAgLyogSWYgYXJndW1lbnRzIGhhdmUgYmVlbiBwdXNoZWQgbmVzdGVkIHdlIGhhdmUgdG8gY29weSB0aGVtIGFuZCAqLworICAgICAgICAvKiBwdXNoIHRoZW0gbGF0ZXIuICovCisgICAgICAgIGlmKG1lcmtfZnAmJm9wdXNoZWQhPW1lcmtfb3B1c2hlZCl7CisgICAgICAgICAgc3RydWN0IElDICpwLCptPTAsKm5wOworICAgICAgICAgIGlmKCFscCkgaWVycm9yKDApOworICAgICAgICAgIGZvcihwPW1lcmtfZnA7cDspeworICAgICAgICAgICAgbnA9cC0+bmV4dDsKKyAgICAgICAgICAgIGlmKHAtPmNvZGU9PVBVU0gpeworICAgICAgICAgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICAgICAgICAgICpuZXc9KnA7CisJICAgICAgLyogYmUgY2FyZWZ1bCBhYm91dCB0aGUgYWRkcmVzcyBiZWNhdXNlIG9mIGFyZ19saXN0ISAqLworCSAgICAgIGlmKHAtPnByZXYpIHAtPnByZXYtPm5leHQ9bmV3OworCSAgICAgIG5ldy0+cHJldj1wLT5wcmV2OworCSAgICAgIGlmKHAtPm5leHQpIHAtPm5leHQtPnByZXY9bmV3OworCSAgICAgIG5ldy0+bmV4dD1wLT5uZXh0OworCSAgICAgIGlmKHA9PWxhc3RfaWMpIGxhc3RfaWM9bmV3OworCSAgICAgIGlmKHA9PWZpcnN0X2ljKSBmaXJzdF9pYz1uZXc7CisgICAgICAgICAgICAgIGlmKG5ldy0+cTEuZmxhZ3MpeworICAgICAgICAgICAgICAgIG5ldy0+Y29kZT1BU1NJR047CisgICAgICAgICAgICAgICAgbmV3LT56LmZsYWdzPVZBUjsKKyAgICAgICAgICAgICAgICBuZXctPnoudmFsLnZtYXg9bDJ6bSgwTCk7CisJCS8qIHR5cCBhbGxvY2F0ZWQgaW4gcHVzaF9hcmdzIGFuZCBub3QgdXNlZCB0aGVyZSAqLworCQkvKgkJaWYoIXAtPml0eXApIGllcnJvcigwKTsqLworCQluZXctPnoudj1hZGRfdG1wX3ZhcihjbG9uZV90eXAocC0+aXR5cCkpOyAvKkZJWE1FPz8qLworICAgICAgICAgICAgICAgIHAtPnExPW5ldy0+ejsKKwkJLyoJCXAtPml0eXA9MDsqLworICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICByZW1vdmVfSUMobmV3KTsKKyAgICAgICAgICAgICAgfQorCSAgICAgIHAtPm5leHQ9cC0+cHJldj0wOworICAgICAgICAgICAgICBhZGRfSUMocCk7CisgICAgICAgICAgICAgIGlmKCFtKSBtPXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihwPT1scCkgYnJlYWs7CisgICAgICAgICAgICBwPW5wOworICAgICAgICAgIH0KKyAgICAgICAgICBpZighbSkgaWVycm9yKDApOworICAgICAgICAgIGZpcnN0X3B1c2hlZD1tOworICAgICAgICB9ZWxzZQorICAgICAgICAgIGZpcnN0X3B1c2hlZD1tZXJrX2ZwOworI2VuZGlmCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYocC0+ZmxhZ3M+PVBSRUlOQyYmcC0+ZmxhZ3M8PVBPU1RERUMpeworICAgICAgICBzdHJ1Y3Qgb2JqIG87CisjaWYgSEFWRV9MSUJDQUxMUworCWNoYXIgKmxpYm5hbWU7CisJc3RydWN0IG5vZGUgdG49e0FERH0sb25lPXtDRVhQUn07CisjZW5kaWYKKyAgICAgICAgZ2VuX0lDKHAtPmxlZnQsMCwwKTsKKyAgICAgICAgaWYocC0+ZmxhZ3M9PVBPU1RJTkN8fHAtPmZsYWdzPT1QT1NUREVDKXsKKwkgIC8qbmV3PW5ld19JQygpOyovCisgICAgICAgICAgICBuZXctPmNvZGU9QVNTSUdOOworICAgICAgICAgICAgbmV3LT50eXBmPXAtPm50eXAtPmZsYWdzOworICAgICAgICAgICAgbmV3LT5xMi52YWwudm1heD1zaXpldGFiW3AtPm50eXAtPmZsYWdzJk5RXTsKKyAgICAgICAgICAgIG5ldy0+cTE9cC0+bGVmdC0+bzsKKyAgICAgICAgICAgIG5ldy0+cTEuZmxhZ3MmPX5TQ1JBVENIOworICAgICAgICAgICAgZ2V0X3NjcmF0Y2goJm5ldy0+eixwLT5sZWZ0LT5udHlwLT5mbGFncywwLHAtPmxlZnQtPm50eXApOworICAgICAgICAgICAgbmV3LT5xMi5mbGFncz0wOworICAgICAgICAgICAgbz1uZXctPno7CisgICAgICAgICAgICBhZGRfSUMobmV3KTsKKyAgICAgICAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgICAgfWVsc2UKKwkgIG89cC0+bGVmdC0+bzsKKyNpZiBIQVZFX0xJQkNBTExTCisJaWYocC0+ZmxhZ3M9PVBSRURFQ3x8cC0+ZmxhZ3M9PVBPU1RERUMpCisJICB0bi5mbGFncz1TVUI7CisJdG4ubGVmdD1wLT5sZWZ0OworCXRuLnJpZ2h0PSZvbmU7CisJdG4ubnR5cD1wLT5udHlwOworCW9uZS5mbGFncz1DRVhQUjsKKwlvbmUubnR5cD1wLT5udHlwOworCWd2YWwudm1heD1sMnptKDFMKTsKKwlldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CisJaW5zZXJ0X2NvbnN0KCZvbmUudmFsLHAtPm50eXAtPmZsYWdzJk5VKTsKKwlpZihsaWJuYW1lPXVzZV9saWJjYWxsKCZ0bikpeworCSAgbnAgbGM7CisJICBsYz1nZW5fbGliY2FsbChsaWJuYW1lLHAtPmxlZnQsMCwmb25lLDApOworCSAgbmV3PW5ld19JQygpOworCSAgbmV3LT5jb2RlPUFTU0lHTjsKKwkgIG5ldy0+dHlwZj1wLT5udHlwLT5mbGFnczsKKwkgIG5ldy0+cTIudmFsLnZtYXg9c2l6ZXRhYltwLT5udHlwLT5mbGFncyZOUV07CisJICBuZXctPnExPWxjLT5vOworCSAgbmV3LT5xMS5mbGFncyY9flNDUkFUQ0g7CisJICBuZXctPno9cC0+bGVmdC0+bzsKKwkgIGFkZF9JQyhuZXcpOworCSAgbmV3PW5ld19JQygpOworCSAgZnJlZShsYyk7CisJfWVsc2UKKyNlbmRpZgorICAgICAgICBpZihJU1BPSU5URVIocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXsKKyAgICAgICAgICAgIGlmKHAtPmZsYWdzPT1QUkVJTkN8fHAtPmZsYWdzPT1QT1NUSU5DKQorCSAgICAgIG5ldy0+Y29kZT1BRERJMlA7IAorCSAgICBlbHNlCisJICAgICAgbmV3LT5jb2RlPVNVQklGUDsKKyAgICAgICAgICAgIHZtYXg9c3pvZihwLT5sZWZ0LT5udHlwLT5uZXh0KTsKKyAgICAgICAgICAgIG5ldy0+cTIudmFsLnZpbnQ9em0yemkodm1heCk7CisgICAgICAgICAgICBuZXctPnR5cGY9SU5UOworCSAgICBuZXctPnR5cGYyPXAtPmxlZnQtPm50eXAtPmZsYWdzOworICAgICAgICAgICAgbmV3LT5xMT1wLT5sZWZ0LT5vOworICAgICAgICAgICAgbmV3LT56PXAtPmxlZnQtPm87CisgICAgICAgICAgICBuZXctPnEyLmZsYWdzPUtPTlNUOworICAgICAgICAgICAgYWRkX0lDKG5ldyk7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgaWYocC0+ZmxhZ3M9PVBSRUlOQ3x8cC0+ZmxhZ3M9PVBPU1RJTkMpCisJICAgICAgbmV3LT5jb2RlPUFERDsKKwkgICAgZWxzZSAKKwkgICAgICBuZXctPmNvZGU9U1VCOworICAgICAgICAgICAgbmV3LT50eXBmPXAtPm50eXAtPmZsYWdzOworICAgICAgICAgICAgbmV3LT5xMT1wLT5sZWZ0LT5vOworICAgICAgICAgICAgbmV3LT56PXAtPmxlZnQtPm87CisgICAgICAgICAgICBuZXctPnEyLmZsYWdzPUtPTlNUOworCSAgICBndmFsLnZpbnQ9em0yemkobDJ6bSgxTCkpOworCSAgICBldmFsX2NvbnN0KCZndmFsLElOVCk7CisJICAgIGluc2VydF9jb25zdCgmbmV3LT5xMi52YWwsbmV3LT50eXBmKTsKKyAgICAgICAgICAgIGFkZF9JQyhuZXcpOworICAgICAgICB9CisgICAgICAgIGlmKHAtPmZsYWdzPT1QT1NUSU5DfHxwLT5mbGFncz09UE9TVERFQyl7CisgICAgICAgICAgICBpZigocC0+bGVmdC0+by5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSkgCisJICAgICAgZnJlZV9yZWcocC0+bGVmdC0+by5yZWcpOworICAgICAgICB9CisgICAgICAgIHAtPm89bzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZihwLT5mbGFncz09Q09ORCl7CisgICAgICAgIGludCBsdHJ1ZSxsZmFsc2UsbG91dDsKKyAgICAgICAgbHRydWU9KytsYWJlbDtsZmFsc2U9KytsYWJlbDtsb3V0PSsrbGFiZWw7CisgICAgICAgIGdlbl9JQyhwLT5sZWZ0LGx0cnVlLGxmYWxzZSk7CisgICAgICAgIGlmKCFwLT5sZWZ0LT5vLmZsYWdzKXsKKyAgICAgICAgICAgIGZyZWUobmV3KTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBpZihwLT5sZWZ0LT5mbGFncyE9Q0VYUFIpeworICAgICAgICAgICAgICAgIGdlbl90ZXN0KCZwLT5sZWZ0LT5vLHAtPmxlZnQtPm50eXAtPmZsYWdzLEJFUSxsZmFsc2UpOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgZXZhbF9jb25zdG4ocC0+bGVmdCk7CisgICAgICAgICAgICAgICAgaWYoem1lcXRvKHZtYXgsbDJ6bSgwTCkpJiZ6dW1lcXRvKHZ1bWF4LHVsMnp1bSgwVUwpKSYmemxkZXF0byh2bGRvdWJsZSxkMnpsZCgwLjApKSl7CisgICAgICAgICAgICAgICAgICAgIGdlbl9JQyhwLT5yaWdodC0+cmlnaHQsMCwwKTsKKyAgICAgICAgICAgICAgICAgICAgcC0+bz1wLT5yaWdodC0+cmlnaHQtPm87CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIGdlbl9JQyhwLT5yaWdodC0+bGVmdCwwLDApOworICAgICAgICAgICAgICAgICAgICBwLT5vPXAtPnJpZ2h0LT5sZWZ0LT5vOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZ2VuX2xhYmVsKGx0cnVlKTsKKyAgICAgICAgZ2VuX0lDKHAtPnJpZ2h0LT5sZWZ0LDAsMCk7CisgICAgICAgIGlmKChwLT5udHlwLT5mbGFncyZOUSkhPVZPSUQpeworICAgICAgICAgICAgY29udmVydChwLT5yaWdodC0+bGVmdCxwLT5udHlwLT5mbGFncyk7CisgICAgICAgICAgICBpZigocC0+cmlnaHQtPmxlZnQtPm8uZmxhZ3MmKFNDUkFUQ0h8RFJFRk9CSikpPT1TQ1JBVENIKXsKKyAgICAgICAgICAgICAgICBwLT5vPXAtPnJpZ2h0LT5sZWZ0LT5vOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgZ2V0X3NjcmF0Y2goJnAtPm8scC0+bnR5cC0+ZmxhZ3MsMCxwLT5udHlwKTsKKyAgICAgICAgICAgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICAgICAgICAgICAgbmV3LT5jb2RlPUFTU0lHTjsKKyAgICAgICAgICAgICAgICBuZXctPnExPXAtPnJpZ2h0LT5sZWZ0LT5vOworICAgICAgICAgICAgICAgIG5ldy0+ej1wLT5vOworICAgICAgICAgICAgICAgIG5ldy0+cTIuZmxhZ3M9MDsKKyAgICAgICAgICAgICAgICBuZXctPnEyLnZhbC52bWF4PXN6b2YocC0+bnR5cCk7CisgICAgICAgICAgICAgICAgbmV3LT50eXBmPXAtPm50eXAtPmZsYWdzOworICAgICAgICAgICAgICAgIHAtPm89bmV3LT56OworICAgICAgICAgICAgICAgIGFkZF9JQyhuZXcpOworICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZQorCSAgcC0+by5mbGFncz0wOworICAgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICAgIG5ldy0+Y29kZT1CUkE7CisgICAgICAgIG5ldy0+dHlwZj1sb3V0OworICAgICAgICBhZGRfSUMobmV3KTsKKyAgICAgICAgZ2VuX2xhYmVsKGxmYWxzZSk7CisgICAgICAgIGdlbl9JQyhwLT5yaWdodC0+cmlnaHQsMCwwKTsKKyAgICAgICAgaWYoKHAtPm50eXAtPmZsYWdzJk5RKSE9Vk9JRCl7CisgICAgICAgICAgICBjb252ZXJ0KHAtPnJpZ2h0LT5yaWdodCxwLT5udHlwLT5mbGFncyk7CisgICAgICAgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICAgICAgICBuZXctPmNvZGU9QVNTSUdOOworICAgICAgICAgICAgbmV3LT5xMT1wLT5yaWdodC0+cmlnaHQtPm87CisgICAgICAgICAgICBuZXctPno9cC0+bzsKKyAgICAgICAgICAgIG5ldy0+cTIuZmxhZ3M9MDsKKyAgICAgICAgICAgIG5ldy0+cTIudmFsLnZtYXg9c3pvZihwLT5udHlwKTsKKyAgICAgICAgICAgIG5ldy0+dHlwZj1wLT5udHlwLT5mbGFnczsKKyAgICAgICAgICAgIGFkZF9JQyhuZXcpOworICAgICAgICB9CisgICAgICAgIGdlbl9sYWJlbChsb3V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwcmludGYoIk9wZXJhdGlvbjogJWQ9JXNcbiIscC0+ZmxhZ3MsZW5hbWVbcC0+ZmxhZ3NdKTsKKyAgICBpZXJyb3IoMCk7CisgICAgZnJlZShuZXcpOworICAgIHAtPm8uZmxhZ3M9MDsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX3JlZ2xpc3Qoc3RydWN0IHJlZ2FyZ3NfbGlzdCAqbnJsLHN0cnVjdCBvYmogKnJhZHIpCit7CisgIHN0cnVjdCBJQyAqbmV3OworICAvKiAgTGV0enRlcyBBcmd1bWVudDsgamV0enQgaW4gUmVnaXN0ZXIgbGFkZW4uICAqLworI2lmZGVmIEhBVkVfUkVHUEFSTVMKKyAgaW50IGRpZHJhZHI9MDsKKyNlbmRpZgorICB3aGlsZShucmwpeworICAgIG5ldz1uZXdfSUMoKTsKKyAgICBuZXctPmNvZGU9QVNTSUdOOworICAgIG5ldy0+dHlwZj1ucmwtPnYtPnZ0eXAtPmZsYWdzLyp8Vk9MQVRJTEUqLzsKKyAgICBuZXctPnExLmZsYWdzPVZBUjsKKyAgICBuZXctPnExLnY9bnJsLT52OworICAgIG5ldy0+cTEudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgbmV3LT5xMi5mbGFncz0wOworICAgIG5ldy0+cTIudmFsLnZtYXg9c3pvZihucmwtPnYtPnZ0eXApOworICAgIG5ldy0+ei5mbGFncz1WQVI7CisgICAgbmV3LT56LnZhbC52bWF4PWwyem0oMEwpOworICAgIG5ldy0+ei52PWFkZF92YXIoZW1wdHksY2xvbmVfdHlwKG5ybC0+di0+dnR5cCksQVVUTywwKTsKKyAgICBuZXctPnoudi0+cmVnPW5ybC0+cmVnOworICAgIG5ldy0+ei52LT52dHlwLT5mbGFnc3w9Vk9MQVRJTEU7CisgICAgbnJsLT52PW5ldy0+ei52OworICAgIGFkZF9JQyhuZXcpOworICAgIAorI2lmZGVmIEhBVkVfUkVHUEFSTVMKKyAgICBpZihyYWRyJiYhZGlkcmFkcil7CisgICAgICBkaWRyYWRyPTE7CisgICAgfWVsc2V7CisjZW5kaWYKKyAgICAgIG5ybC0+YWwtPnB1c2hpYz1uZXc7CisjaWZkZWYgSEFWRV9SRUdQQVJNUworICAgIH0KKyNlbmRpZgorICAgIG5ybD1ucmwtPm5leHQ7CisgIH0KK30KKworI2lmZGVmIEhBVkVfUkVHUEFSTVMKK3ptYXggcHVzaF9hcmdzKHN0cnVjdCBhcmd1bWVudF9saXN0ICphbCxzdHJ1Y3Qgc3RydWN0X2RlY2xhcmF0aW9uICpzZCxpbnQgbixzdHJ1Y3QgcmVnYXJnc19saXN0ICoqcmwsc3RydWN0IHJlZ19oYW5kbGUgKnJlZ19oYW5kbGUsc3RydWN0IG9iaiAqcmFkcixzdHJ1Y3QgVHlwICpydHlwZSxpbnQgcnJlZyxzdHJ1Y3QgVHlwICpma3QpCisjZWxzZQorem1heCBwdXNoX2FyZ3Moc3RydWN0IGFyZ3VtZW50X2xpc3QgKmFsLHN0cnVjdCBzdHJ1Y3RfZGVjbGFyYXRpb24gKnNkLGludCBuLHN0cnVjdCByZWdhcmdzX2xpc3QgKipybCkKKyNlbmRpZgorLyogIExlZ3QgZGllIEFyZ3VtZW50ZSBlaW5lcyBGdW5rdGlvbnNhdWZydWZzIGluIHVtZ2VrZWhydGVyIFJlaWhlbmZvbGdlICAgICovCisvKiAgYXVmIGRlbiBTdGFjay4gRXMgd2lyZCBJbnRlZ2VyLUVyd2VpdGVydW5nIHZvcmdlbm9tbWVuIHVuZCBmbG9hdCB3aXJkICAgKi8KKy8qICBuYWNoIGRvdWJsZSBrb252ZXJ0aWVydCwgZmFsbHMga2VpbiBQcm90b3R5cGUgZGEgaXN0LiAgICAgICAgICAgICAgICAgICAqLworeworICAgIGludCB0LHJlZyxyZWdwdXNoLGV2YWx1YXRlZD0wO3N0cnVjdCBUeXAgKmZ0OworICAgIHN0cnVjdCBJQyAqbmV3O3N0cnVjdCByZWdhcmdzX2xpc3QgKm5ybDt6bWF4IHN6LHJzeixvZjtzdHJ1Y3Qgb2JqICphcmc7CisjaWZkZWYgSEFWRV9SRUdQQVJNUworICAgIGludCBzdGRyZWc7CisgICAgaWYoIWFsJiYhcmFkcikgcmV0dXJuKDApOworICAgIGlmKHJhZHIpeworICAgICAgc3RkcmVnPXJyZWc7CisgICAgfWVsc2V7CisgICAgICBpZihuPHNkLT5jb3VudCl7CisgICAgICAgIHN0ZHJlZz1yZWdfcGFybShyZWdfaGFuZGxlLCgqc2QtPnNsKVtuXS5zdHlwLDAsZmt0KTsKKyAgICAgIH1lbHNleworICAgICAgICBpZihzZC0+Y291bnQpCisgICAgICAgICAgc3RkcmVnPXJlZ19wYXJtKHJlZ19oYW5kbGUsYWwtPmFyZy0+bnR5cCwxLGZrdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzdGRyZWc9cmVnX3Bhcm0ocmVnX2hhbmRsZSxhbC0+YXJnLT5udHlwLDAsZmt0KTsKKyAgICAgIH0KKyAgICB9CisgICAgcmVnPXN0ZHJlZzsKKyNlbHNlCisgICAgaWYoIWFsKSByZXR1cm4oMCk7CisgICAgcmVnPTA7CisjZW5kaWYKKyNpZmRlZiBIQVZFX1JFR1BBUk1TCisgICAgaWYoIXJhZHIpeworI2VuZGlmCisgICAgICBpZighYWwtPmFyZykgaWVycm9yKDApOworICAgICAgaWYoIXNkKSBpZXJyb3IoMCk7CisgICAgICBpZihuPHNkLT5jb3VudCl7CisgICAgICAgIGZ0PWNsb25lX3R5cCgoKnNkLT5zbClbbl0uc3R5cCk7c3o9c3pvZihmdCk7CisJdD1mdC0+ZmxhZ3M7CisgICAgICAgIHJlZz0oKnNkLT5zbClbbl0ucmVnOworICAgICAgfWVsc2V7CisgICAgICAgIGZ0PWNsb25lX3R5cChhbC0+YXJnLT5udHlwKTtzej1zem9mKGZ0KTsKKwl0PWZ0LT5mbGFnczsKKyAgICAgIH0KKyAgICAgIGlmKElTSU5UKHQpKSB7dD1pbnRfZXJ3KHQpO2Z0LT5mbGFncz10O3N6PXNpemV0YWJbdCZOUV07fQorICAgICAgaWYoKHQmTlEpPT1GTE9BVCYmbj49c2QtPmNvdW50KSB7dD1ET1VCTEU7ZnQtPmZsYWdzPXQ7c3o9c2l6ZXRhYlt0XTt9CisjaWZkZWYgSEFWRV9SRUdQQVJNUworICAgIH1lbHNleworICAgICAgZnQ9bmV3X3R5cCgpOworICAgICAgZnQtPmZsYWdzPXQ9UE9JTlRFUl9UWVBFKHJ0eXBlKTsKKyAgICAgIGZ0LT5uZXh0PWNsb25lX3R5cChydHlwZSk7CisgICAgICBzej1zaXpldGFiW3RdOworICAgIH0KKyNlbmRpZgorICAgIGlmKHJlZzwwKSB7cmVnPS1yZWc7cmVncHVzaD0xO30gZWxzZSByZWdwdXNoPTA7CisgICAgcnN6PXN6OworICAgIHN6PXptbXVsdCh6bWRpdih6bWFkZChzeix6bXN1YihzdGFja2FsaWduLGwyem0oMUwpKSksc3RhY2thbGlnbiksc3RhY2thbGlnbik7CisjaWZkZWYgT1JERVJFRF9QVVNICisgICAgaWYocmVnPT0wfHxyZWdwdXNoKXsKKyAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgIGlmKCFyYWRyJiYhZXZhbHVhdGVkKXsKKyAgICAgICAgZ2VuX0lDKGFsLT5hcmcsMCwwKTsKKyAgICAgICAgY29udmVydChhbC0+YXJnLHQpOworICAgICAgICBldmFsdWF0ZWQ9MTsKKyAgICAgICAgbmV3LT5xMT1hbC0+YXJnLT5vOworCWFsLT5wdXNoaWM9bmV3OworICAgICAgfWVsc2UKKyAgICAgICAgbmV3LT5xMT0qcmFkcjsKKyAgICAgIC8qICBQYXJhbWV0ZXJ1ZWJlcmdhYmUgdWViZXIgU3RhY2suICovCisgICAgICBuZXctPmNvZGU9UFVTSDsKKyAgICAgIG5ldy0+dHlwZj10OworICAgICAgbmV3LT5pdHlwPWZ0OworICAgICAgbmV3LT5xMi5mbGFncz1uZXctPnouZmxhZ3M9MDsKKyAgICAgIG5ldy0+cTIudmFsLnZtYXg9c3o7CisgICAgICBuZXctPnoudmFsLnZtYXg9cnN6OworICAgICAgaWYocmVncHVzaCl7CisgICAgICAgIGlmKGNfZmxhZ3NbMjZdJlVTRURGTEFHKXsKKyAgICAgICAgICBuZXctPnExLmFtPW5ldy0+cTIuYW09bmV3LT56LmFtPTA7CisgICAgICAgICAgbmV3LT5saW5lPWxpbmU7IG5ldy0+ZmlsZT1maWxlbmFtZTsKKyAgICAgICAgICBpbnNlcnRfSUMobGFzdF9pYyxuZXcpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICBuZXctPnExLmZsYWdzPTA7CisgICAgICAgICAgYWRkX0lDKG5ldyk7CisgICAgICAgIH0KKyAgICAgIH1lbHNleworICAgICAgICBhZGRfSUMobmV3KTsKKyAgICAgIH0KKyAgICAgIG9wdXNoZWQrKzsKKyAgICAgIGlmKCFmaXJzdF9wdXNoZWQpIGZpcnN0X3B1c2hlZD1uZXc7CisgICAgICBpZihhbCYmIWFsLT5uZXh0JiYhcmVncHVzaCkgcmV0dXJuIHN6OworICAgIH0KKyNlbmRpZgorI2lmZGVmIEhBVkVfUkVHUEFSTVMKKyAgICBpZihyYWRyKXsKKyAgICAgIGlmKGFsKSBvZj1wdXNoX2FyZ3MoYWwsc2QsMCxybCxyZWdfaGFuZGxlLDAsMCwwLGZrdCk7IGVsc2Ugb2Y9bDJ6bSgwTCk7CisgICAgfWVsc2V7CisgICAgICBpZihhbC0+bmV4dCkgb2Y9cHVzaF9hcmdzKGFsLT5uZXh0LHNkLG4rMSxybCxyZWdfaGFuZGxlLDAsMCwwLGZrdCk7IGVsc2Ugb2Y9bDJ6bSgwTCk7CisgICAgfQorI2Vsc2UKKyAgICBpZihhbC0+bmV4dCkgb2Y9cHVzaF9hcmdzKGFsLT5uZXh0LHNkLG4rMSxybCk7IGVsc2Ugb2Y9bDJ6bSgwTCk7CisjZW5kaWYKKyNpZmRlZiBPUkRFUkVEX1BVU0gKKyAgICBpZihyZWc9PTApIHJldHVybiB6bWFkZChvZixzeik7CisjZW5kaWYKKworICAgIGlmKHJlZ3B1c2gpIG9mPXptYWRkKG9mLHN6KTsKKworI2lmZGVmIEhBVkVfUkVHUEFSTVMKKyAgICBpZihyYWRyKXsKKyAgICAgIGFyZz1yYWRyOworICAgIH1lbHNleworICAgICAgaWYoIWV2YWx1YXRlZCl7CisgICAgICAgIGdlbl9JQyhhbC0+YXJnLDAsMCk7CisgICAgICAgIGNvbnZlcnQoYWwtPmFyZyx0KTsKKyAgICAgICAgZXZhbHVhdGVkPTE7CisgICAgICB9CisgICAgICBhcmc9JmFsLT5hcmctPm87CisgICAgfQorI2Vsc2UKKyAgICBpZighZXZhbHVhdGVkKXsKKyAgICAgIGdlbl9JQyhhbC0+YXJnLDAsMCk7CisgICAgICBjb252ZXJ0KGFsLT5hcmcsdCk7CisgICAgICBldmFsdWF0ZWQ9MTsKKyAgICB9CisgICAgYXJnPSZhbC0+YXJnLT5vOworI2VuZGlmCisjaWZuZGVmIE9SREVSRURfUFVTSAorICAgIGlmKHJlZz09MHx8cmVncHVzaCl7CisgICAgICAgIC8qICBQYXJhbWV0ZXJ1ZWJlcmdhYmUgdWViZXIgU3RhY2suICovCisgICAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgICAgbmV3LT5jb2RlPVBVU0g7CisgICAgICAgIG5ldy0+dHlwZj10OworICAgICAgICBuZXctPnExPSphcmc7CisgICAgICAgIGlmKHJlZ3B1c2gmJiEoY19mbGFnc1syNl0mVVNFREZMQUcpKSBuZXctPnExLmZsYWdzPTA7CisgICAgICAgIG5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CisgICAgICAgIG5ldy0+cTIudmFsLnZtYXg9c3o7CisJbmV3LT56LnZhbC52bWF4PXJzejsKKyAgICAgICAgYWRkX0lDKG5ldyk7CisJYWwtPnB1c2hpYz1uZXc7CisgICAgICAgIGlmKCFyZWdwdXNoKSByZXR1cm4oem1hZGQob2Ysc3opKTsKKyAgICB9CisjZW5kaWYKKyAgICBpZihyZWcpeworICAgICAgICAvKiAgUGFyYW1ldGVydWViZXJnYWJlIGluIFJlZ2lzdGVyLiAqLworICAgICAgICBzdHJ1Y3QgVmFyICp2PTA7IHN0cnVjdCBUeXAgKnQyOworICAgICAgICBpZihvcHRmbGFncyYyKXsKKyAgICAgICAgLyogIFZlcnNpb24gZnVlciBPcHRpbWl6ZXIuICovCisgICAgICAgICAgICB0Mj1uZXdfdHlwKCk7CisgICAgICAgICAgICB0Mi0+ZmxhZ3M9dDsKKyAgICAgICAgICAgIGlmKElTUE9JTlRFUih0KSl7CisgICAgICAgICAgICAgICAgdDItPm5leHQ9bmV3X3R5cCgpOworICAgICAgICAgICAgICAgIHQyLT5uZXh0LT5mbGFncz1WT0lEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdj1hZGRfdmFyKGVtcHR5LHQyLEFVVE8sMCk7CisgICAgICAgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICAgICAgICBuZXctPmNvZGU9QVNTSUdOOworICAgICAgICAgICAgbmV3LT50eXBmPXQ7CisgICAgICAgICAgICBuZXctPnExPSphcmc7CisgICAgICAgICAgICBuZXctPnEyLmZsYWdzPTA7CisgICAgICAgICAgICBuZXctPnEyLnZhbC52bWF4PXNpemV0YWJbdCZOUV07CisgICAgICAgICAgICBuZXctPnouZmxhZ3M9VkFSOworICAgICAgICAgICAgbmV3LT56LnY9djsKKyAgICAgICAgICAgIG5ldy0+ei52YWwudm1heD1sMnptKDBMKTsKKyAgICAgICAgICAgIGFkZF9JQyhuZXcpOworICAgICAgICAgICAgbnJsPW15bWFsbG9jKHNpemVvZigqbnJsKSk7CisgICAgICAgICAgICBucmwtPm5leHQ9KnJsOworICAgICAgICAgICAgbnJsLT5yZWc9cmVnOworICAgICAgICAgICAgbnJsLT52PXY7CisJICAgIG5ybC0+YWw9YWw7CisgICAgICAgICAgICAqcmw9bnJsOworICAgICAgICAgICAgcmV0dXJuIG9mOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgLyogIE5pY2h0LW9wdGltaWVyZW5kZSBWZXJzaW9uLiAqLworICAgICAgICAgICAgaWYoIXJlZ3NbcmVnXSYmKCFyZWdfcGFpcihyZWcsJnJwKXx8KCFyZWdzW3JwLnIxXSYmIXJlZ3NbcnAucjJdKSkpeworICAgICAgICAgICAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgICAgICAgICAgICBuZXctPmNvZGU9QUxMT0NSRUc7CisgICAgICAgICAgICAgICAgbmV3LT50eXBmPTA7CisgICAgICAgICAgICAgICAgbmV3LT5xMS5mbGFncz1SRUc7CisgICAgICAgICAgICAgICAgbmV3LT5xMS5yZWc9cmVnOworICAgICAgICAgICAgICAgIG5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CisgICAgICAgICAgICAgICAgYWRkX0lDKG5ldyk7CisgICAgICAgICAgICAgICAgcmVnc1tyZWddPTMzO3JlZ3VzZWRbcmVnXSsrOworCQlpZihyZWdfcGFpcihyZWcsJnJwKSl7CisJCSAgcmVnc1tycC5yMV09MzM7cmVndXNlZFtycC5yMV0rKzsKKwkJICByZWdzW3JwLnIyXT0zMztyZWd1c2VkW3JwLnIyXSsrOworCQl9CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBpZihhcmctPmZsYWdzIT0oUkVHfFNDUkFUQ0gpfHxhcmctPnJlZyE9cmVnKXsKKwkJICBpbnQgcj0wOworCQkgIC8qIHJlZ2lzdGVyIHBhaXJzICovCisJCSAgaWYocmVnX3BhaXIocmVnLCZycCkpeworCQkgICAgaWYocmVnc1tyZWddfHxyZWdzW3JwLnIxXXx8cmVnc1tycC5yMl0pIAorCQkgICAgICByPXJlZzsKKwkJICB9ZWxzZXsKKwkJICAgIGZvcihyPU1BWFI7cj49MTtyLS0peworCQkgICAgICBpZihyZWdzW3JdJiZyZWdfcGFpcihyLCZycCkmJihycC5yMT09cmVnfHxycC5yMj09cmVnKSkKKwkJCWJyZWFrOworCQkgICAgfQorCQkgICAgaWYocjwxKSByPXJlZzsKKwkJICB9CisJCSAgdDI9Y2xvbmVfdHlwKHJlZ3R5cGVbcl0pOworCQkgIHY9YWRkX3ZhcihlbXB0eSx0MixBVVRPLDApOworCQkgIHYtPmZsYWdzfD1VU0VEQVNBRFI7CisJCSAgbmV3PW5ld19JQygpOworCQkgIG5ldy0+Y29kZT1NT1ZFRlJPTVJFRzsKKwkJICBuZXctPnR5cGY9MDsKKwkJICBuZXctPnExLmZsYWdzPVJFRzsKKwkJICBuZXctPnExLnJlZz1yOworCQkgIG5ldy0+cTIuZmxhZ3M9MDsKKwkJICBuZXctPnEyLnZhbC52bWF4PXJlZ3NpemVbcl07CisJCSAgbmV3LT56LmZsYWdzPVZBUnxET05UUkVHSVNURVJJWkU7CisJCSAgbmV3LT56LnY9djsKKwkJICBuZXctPnoudmFsLnZtYXg9bDJ6bSgwTCk7CisJCSAgYWRkX0lDKG5ldyk7CisgICAgICAgICAgICAgICAgfWVsc2UKKwkJICByZWdzW3JlZ118PTMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3PW5ld19JQygpOworI2lmZGVmIEhBVkVfUkVHUEFSTVMKKwkgICAgaWYoIXJhZHIpeworCSAgICAgIGFsLT5wdXNoaWM9bmV3OworCSAgICB9CisjZWxzZQorCSAgICBhbC0+cHVzaGljPW5ldzsKKyNlbmRpZgorCSAgICBuZXctPmNvZGU9QVNTSUdOOworCSAgICBuZXctPnR5cGY9dDsKKyAgICAgICAgICAgIG5ldy0+cTE9KmFyZzsKKyAgICAgICAgICAgIC8qIFRlc3Rlbiwgb2IgUXVlbGxyZWdpc3RlciBnZXNpY2hlcnQgd3VyZGUuIFVuc2Nob2VuLiAqLworICAgICAgICAgICAgaWYoKG5ldy0+cTEuZmxhZ3MmUkVHKSl7CisgICAgICAgICAgICAgIHN0cnVjdCByZWdhcmdzX2xpc3QgKnA7CisgICAgICAgICAgICAgIGZvcihwPSpybDtwO3A9cC0+bmV4dCl7CisJCWludCByOworICAgICAgICAgICAgICAgIGlmKHAtPnYmJihyPWFicyhwLT5yZWcpKSl7CisJCSAgaWYobmV3LT5xMS5yZWc9PXJ8fChyZWdfcGFpcihuZXctPnExLnJlZywmcnApJiYocnAucjE9PXJ8fHJwLnIyPT1yKSkpIHtuZXctPnExLnY9cC0+djtuZXctPnExLnZhbC52bWF4PWwyem0oMEwpO2JyZWFrO30KKwkJICAvKkZJWE1FOiBhbmRlcnNydW0gYmVpIExJVFRMRUVORElBTj8/ICovCisJCSAgaWYocmVnX3BhaXIociwmcnApJiZycC5yMT09bmV3LT5xMS5yZWcpIHtuZXctPnExLnY9cC0+djtuZXctPnExLnZhbC52bWF4PWwyem0oMEwpO2JyZWFrO30KKwkJICBpZihyZWdfcGFpcihyLCZycCkmJnJwLnIyPT1uZXctPnExLnJlZykge25ldy0+cTEudj1wLT52O25ldy0+cTEudmFsLnZtYXg9cmVnc2l6ZVtycC5yMV07YnJlYWs7fQorCisJCX0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZihwJiZuZXctPnExLnYpeworCQlpZihtdXN0X2NvbnZlcnQobmV3LT50eXBmLHJlZ3R5cGVbbmV3LT5xMS5yZWddLT5mbGFncywwKSl7CisJCSAgbmV3LT5jb2RlPUNPTlZFUlQ7CisJCSAgbmV3LT50eXBmMj1yZWd0eXBlW25ldy0+cTEucmVnXS0+ZmxhZ3M7CisJCX0KKyAgICAgICAgICAgICAgICBuZXctPnExLmZsYWdzJj1+UkVHOworICAgICAgICAgICAgICAgIG5ldy0+cTEuZmxhZ3N8PVZBUjsKKyAgICAgICAgICAgICAgICAvKm5ldy0+cTEudmFsLnZtYXg9bDJ6bSgwTCk7Ki8KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3LT5xMi5mbGFncz1uZXctPnouZmxhZ3M9MDsKKyAgICAgICAgICAgIG5ldy0+cTIudmFsLnZtYXg9c2l6ZXRhYlt0Jk5RXTsKKyAgICAgICAgICAgIG5ldy0+ei5mbGFncz1SRUc7CisgICAgICAgICAgICBuZXctPnoucmVnPXJlZzsKKyAgICAgICAgICAgIGFkZF9JQyhuZXcpOworICAgICAgICAgICAgbnJsPW15bWFsbG9jKHNpemVvZigqbnJsKSk7CisgICAgICAgICAgICBucmwtPm5leHQ9KnJsOworICAgICAgICAgICAgbnJsLT5yZWc9cmVnOworICAgICAgICAgICAgbnJsLT52PXY7CisgICAgICAgICAgICAqcmw9bnJsOworICAgICAgICAgICAgcmV0dXJuIG9mOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGNvbnZlcnQobnAgcCxpbnQgZikKKy8qICBrb252ZXJ0aWVydCBkYXMgT2JqZWt0IGluIHAtPm8gaW4gYmVzdGltbXRlbiBUeXAgICAgKi8KKy8qIHdlbm4gdm9sYXRpbGVfY29udmVydCBnZXNldHp0IGlzdCwgd2lyZCBpbW1lciBJQyBlcnpldWd0ICovCit7CisgIHN0cnVjdCBJQyAqbmV3OworICBpbnQgbz1wLT5udHlwLT5mbGFnczsKKyAgaWYoKGYmTlEpPT1WT0lEKSByZXR1cm47CisgIGlmKHAtPmZsYWdzPT1DRVhQUnx8cC0+ZmxhZ3M9PVBDRVhQUil7CisjaWZkZWYgSEFWRV9NSVNSQQorICAgIGlmKChvJk5VKTwoZiZOVSkpCisgICAgICBtaXNyYV9uZXUoMTgsMCwwLC0xKTsKKyNlbmRpZgorICAgIGV2YWxfY29uc3RuKHApOworICAgIHAtPm50eXAtPmZsYWdzPWY7CisgICAgaW5zZXJ0X2NvbnN0bihwKTsKKyAgICBwLT5vLnZhbD1wLT52YWw7CisgICAgcmV0dXJuOworICB9CisgIGlmKCF2b2xhdGlsZV9jb252ZXJ0JiYoKG8mTlUpPT0oZiZOVSl8fCghbXVzdF9jb252ZXJ0KG8sZixjb25zdF9leHByKSYmKGNvbnN0X2V4cHJ8fCEob3B0ZmxhZ3MmMikpKSkpeworICAgIHAtPm50eXAtPmZsYWdzPWY7CisgICAgaWYoIUlTUE9JTlRFUihmKSYmIUlTQVJSQVkoZikpe2ZyZWV0eXAocC0+bnR5cC0+bmV4dCk7cC0+bnR5cC0+bmV4dD0wO30KKyAgICByZXR1cm47CisgIH0KKyAgbmV3PW5ld19JQygpOworICBuZXctPnExPXAtPm87CisgIG5ldy0+cTIuZmxhZ3M9MDsKKyAgbmV3LT5jb2RlPUNPTlZFUlQ7CisgIG5ldy0+dHlwZjI9bzsKKyAgbmV3LT50eXBmPWY7CisgIGlmKChwLT5vLmZsYWdzJihTQ1JBVENIfFJFRykpIT0oU0NSQVRDSHxSRUcpfHwhcmVnb2socC0+by5yZWcsZiwwKSl7CisgICAgZ2V0X3NjcmF0Y2goJm5ldy0+eixmLDAsMCk7CisgICAgcC0+bz1uZXctPno7CisgICAgYWRkX0lDKG5ldyk7CisgIH1lbHNleworICAgIG5ldy0+ej1wLT5vO25ldy0+ei5mbGFncyY9fkRSRUZPQko7CisgICAgcC0+bz1uZXctPno7CisgICAgYWRkX0lDKG5ldyk7CisgIH0KK30KKwordm9pZCBhbGxvY19oYXJkcmVnKGludCByKQorLyogIEJlbGVndCBSZWdpc3RlciByLiAgKi8KK3sKKyAgc3RydWN0IElDICpuZXc7CisgIGlmKG5vY29kZSkgcmV0dXJuOworICBpZihERUJVRyYxNikgcHJpbnRmKCJhbGxvY2F0ZWQgJXNcbiIscmVnbmFtZXNbcl0pOworICByZWdzW3JdPTE7cmVndXNlZFtyXSsrOworICBuZXc9bmV3X0lDKCk7CisgIG5ldy0+Y29kZT1BTExPQ1JFRzsKKyAgbmV3LT50eXBmPTA7CisgIG5ldy0+cTEuZmxhZ3M9UkVHOworICBuZXctPnExLnJlZz1yOworICBuZXctPnEyLmZsYWdzPW5ldy0+ei5mbGFncz0wOworICBhZGRfSUMobmV3KTsKKyAgaWYocmVnX3BhaXIociwmcnApKXsKKyAgICByZWdzW3JwLnIxXT0xO3JlZ3VzZWRbcnAucjFdKys7CisgICAgcmVnc1tycC5yMl09MTtyZWd1c2VkW3JwLnIyXSsrOworICB9Cit9CisKK2ludCBhbGxvY3JlZyhpbnQgZixpbnQgbW9kZSkKKy8qICBGb3JkZXJ0IFJlZ2lzdGVyIGZ1ZXIgVHlwIGYgYW4uICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGkscj0wLHByaW89LTE7CisgIGlmKG5vY29kZSkgcmV0dXJuKDEpOworICBmb3IoaT0xO2k8PU1BWFI7aSsrKXsKKyAgICBpZighcmVnc1tpXSYmcmVnX3ByaW9baV0+cHJpbyYmcmVnb2soaSxmLG1vZGUpJiYoIXJlZ19wYWlyKGksJnJwKXx8KCFyZWdzW3JwLnIxXSYmIXJlZ3NbcnAucjJdKSkpeworICAgICAgcj1pOworICAgICAgcHJpbz1yZWdfcHJpb1tpXTsKKyAgICB9CisgIH0KKyAgaWYocil7CisgICAgaWYoREVCVUcmMTYpIHByaW50ZigiYWxsb2MgJXNcbiIscmVnbmFtZXNbcl0pOworICAgIGFsbG9jX2hhcmRyZWcocik7CisgICAgcmV0dXJuIHI7CisgIH0KKyAgaWYoREVCVUcmMSkgcHJpbnRmKCJDb3VsZG4ndCBhbGxvY2F0ZSByZWdpc3RlciBmb3IgdHlwZSAlZFxuIixmKTsKKyAgcmV0dXJuIDA7Cit9Cit2b2lkIGZyZWVfcmVnKGludCByKQorLyogIEdpYnQgUmVnaXN0ZXIgciBmcmVpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEVpbnRyYWcgZWluZXMgSUMgZmVobHQgbm9jaCAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICAgIHN0cnVjdCBJQyAqbmV3OworICAgIGlmKCFyfHxub2NvZGUpIHJldHVybjsKKyAgICBpZihyZWdzW3JdPT0wKQorICAgICAge3ByaW50ZigiUmVnaXN0ZXIgJWQoJXMpOlxuIixyLHJlZ25hbWVzW3JdKTtpZXJyb3IoMCk7fQorICAgIGlmKERFQlVHJjE2KSBwcmludGYoImZyZWVkICVzXG4iLHJlZ25hbWVzW3JdKTsKKyAgICBuZXc9bmV3X0lDKCk7CisgICAgbmV3LT5jb2RlPUZSRUVSRUc7CisgICAgbmV3LT50eXBmPTA7CisgICAgbmV3LT5xMS5mbGFncz1SRUc7CisgICAgbmV3LT5xMS5yZWc9cjsKKyAgICBuZXctPnEyLmZsYWdzPW5ldy0+ei5mbGFncz0wOworICAgIGFkZF9JQyhuZXcpOworICAgIHJlZ3Nbcl09MDsKKyAgICBpZihyZWdfcGFpcihyLCZycCkpeworICAgICAgcmVnc1tycC5yMV09MDsKKyAgICAgIHJlZ3NbcnAucjJdPTA7CisgICAgfQorfQordm9pZCBnZW5fbGFiZWwoaW50IGwpCisvKiAgRXJ6ZXVndCBlaW4gTGFiZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgICAgc3RydWN0IElDICpuZXc7CisgICAgbmV3PW5ld19JQygpOworICAgIG5ldy0+Y29kZT1MQUJFTDsKKyAgICBuZXctPnR5cGY9bDsKKyAgICBuZXctPnExLmZsYWdzPW5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CisgICAgYWRkX0lDKG5ldyk7Cit9Cit2b2lkIGdlbl9jb25kKHN0cnVjdCBvYmogKnAsaW50IG0saW50IGwxLGludCBsMikKKy8qICBHZW5lcmllcnQgY29kZSwgZGVyIDAgb2RlciAxIGluIFJlZ2lzdGVyIHNjaHJlaWJ0LiBTY2hyZWlidCBvYmogbmFjaCBwLiAqLworeworICAgIHN0cnVjdCBJQyAqbmV3OworICAgIHN0cnVjdCBvYmogb21lcms7CisgICAgbmV3PW5ld19JQygpOworICAgIG5ldy0+Y29kZT1BU1NJR047CisgICAgbmV3LT50eXBmPUlOVDsKKyAgICBuZXctPnExLmZsYWdzPUtPTlNUOworICAgIG5ldy0+cTIuZmxhZ3M9MDsKKyAgICBuZXctPnEyLnZhbC52bWF4PXNpemV0YWJbSU5UXTsKKyAgICBpZighbSkgdm1heD1sMnptKDFMKTsgZWxzZSB2bWF4PWwyem0oMEwpOworICAgIG5ldy0+cTEudmFsLnZpbnQ9em0yemkodm1heCk7CisgICAgZ2V0X3NjcmF0Y2goJm5ldy0+eixJTlQsMCwwKTsKKyAgICBvbWVyaz1uZXctPno7CisgICAgYWRkX0lDKG5ldyk7CisgICAgbmV3PW5ld19JQygpOworICAgIG5ldy0+Y29kZT1CUkE7CisgICAgbmV3LT50eXBmPWwyOworICAgIGFkZF9JQyhuZXcpOworICAgIGdlbl9sYWJlbChsMSk7CisgICAgbmV3PW5ld19JQygpOworICAgIG5ldy0+Y29kZT1BU1NJR047CisgICAgbmV3LT50eXBmPUlOVDsKKyAgICBuZXctPnExLmZsYWdzPUtPTlNUOworICAgIG5ldy0+cTIuZmxhZ3M9MDsKKyAgICBuZXctPnEyLnZhbC52bWF4PXNpemV0YWJbSU5UXTsKKyAgICBpZighbSkgdm1heD1sMnptKDBMKTsgZWxzZSB2bWF4PWwyem0oMUwpOworICAgIG5ldy0+cTEudmFsLnZpbnQ9em0yemkodm1heCk7CisgICAgbmV3LT56PW9tZXJrOworLyogICAgbmV3LT56LnJlZz1yOworICAgIG5ldy0+ei5mbGFncz1TQ1JBVENIfFJFRzsqLworICAgIGFkZF9JQyhuZXcpOworICAgIGdlbl9sYWJlbChsMik7CisgICAgKnA9b21lcms7Cit9Cit2b2lkIHNjcmF0Y2hfdmFyKHN0cnVjdCBvYmogKm8saW50IHQsc3RydWN0IFR5cCAqdHlwKQorLyogIGxpZWZlcnQgZWluZSB0ZW1wb3JhZXJlIFZhcmlhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgbmljaHQgZWZmaXppZW50LCBhYmVyIHdlciBoYXQgc2Nob24gc28gd2VuaWcgUmVnaXN0ZXIuLi4gICAgKi8KK3sKKyAgc3RydWN0IFR5cCAqbnQ7CisgIGlmKCFJU1NDQUxBUih0KSl7CisgICAgaWYoIXR5cCkgaWVycm9yKDApOworICAgIG50PWNsb25lX3R5cCh0eXApOworICB9ZWxzZXsKKyAgICBudD1uZXdfdHlwKCk7CisgICAgbnQtPmZsYWdzPXQ7CisgICAgaWYoSVNQT0lOVEVSKHQpKXsKKyAgICAgIG50LT5uZXh0PW5ld190eXAoKTsKKyAgICAgIG50LT5uZXh0LT5mbGFncz1WT0lEOworICAgIH0KKyAgfQorICBvLT5mbGFncz1TQ1JBVENIfFZBUjtvLT5yZWc9MDsKKyAgby0+dj1hZGRfdmFyKGVtcHR5LG50LEFVVE8sMCk7CisgIG8tPnZhbC52bWF4PWwyem0oMEwpOworfQordm9pZCBnZXRfc2NyYXRjaChzdHJ1Y3Qgb2JqICpvLGludCB0MSxpbnQgdDIsc3RydWN0IFR5cCAqdHlwKQorLyogIGxpZWZlcnQgZWluIFNjcmF0Y2hyZWdpc3RlciBvZGVyIGVpbmUgU2NyYXRjaHZhcmlhYmxlICAgICAgICovCit7CisgICAgaWYoIShvcHRmbGFncyYyKSYmKG8tPnJlZz1hbGxvY3JlZyh0MSx0MikpKXsKKyAgICAgICAgby0+ZmxhZ3M9U0NSQVRDSHxSRUc7CisgICAgfWVsc2V7CisgICAgICAgIHNjcmF0Y2hfdmFyKG8sdDEsdHlwKTsKKyAgICB9Cit9CitpbnQgZG9fYXJpdGgobnAgcCxzdHJ1Y3QgSUMgKm5ldyxucCBkZXN0LHN0cnVjdCBvYmogKm8pCisvKiAgZXJ6ZXVndCBJQyBuZXcgZnVlciBlaW5lbiBhcml0aG1ldGlzY2hlbiBLbm90ZW4gdW5kIHNwZWljaGVydCBkYXMgICAqLworLyogIFJlc3VsdGF0IHZvbSBVbnRlcmtub3RlbiBkZXN0IGluIG8gKGZ1ZXIgYSBvcD0gYikgICAgICAgICAgICAgICAqLworLyogIGxpZWZlcnQgMCwgd2VubiBkZXN0IG5pY2h0IGdlZnVuZGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICAgIGludCBmPTAsbWZsYWdzOworICAgIG5ldy0+Y29kZT1wLT5mbGFnczsKKyAgICBpZihuZXctPmNvZGU9PVBNVUxUKSBuZXctPmNvZGU9TVVMVDsKKyAgICBnZW5fSUMocC0+bGVmdCwwLDApOworICAgIGlmKGRlc3QmJnAtPmxlZnQ9PWRlc3QpIHsqbz1wLT5sZWZ0LT5vO2YrKzt9CisgICAgZ2VuX0lDKHAtPnJpZ2h0LDAsMCk7CisgICAgaWYoZGVzdCYmcC0+cmlnaHQ9PWRlc3QpIHsqbz1wLT5yaWdodC0+bztmKys7fQorICAgIGlmKGRlc3Qpe21mbGFncz1kZXN0LT5vLmZsYWdzO2Rlc3QtPm8uZmxhZ3MmPSh+U0NSQVRDSCk7fQorCisgICAgaWYoSVNQT0lOVEVSKHAtPmxlZnQtPm50eXAtPmZsYWdzKSYmSVNQT0lOVEVSKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpeworICAgIC8qICBTdWJ0cmFoaWVyZW4gendlaWVyIFBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaW50IGR0PVBUUkRJRkZfVChwLT5sZWZ0LT5udHlwLT5mbGFncyk7CisgICAgICBpZihwLT5mbGFncyE9U1VCKSBpZXJyb3IoMCk7CisgICAgICBuZXctPnR5cGY9ZHQ7CisgICAgICBuZXctPnR5cGYyPXAtPmxlZnQtPm50eXAtPmZsYWdzOworICAgICAgbmV3LT5jb2RlPVNVQlBGUDsKKyAgICAgIG5ldy0+cTE9cC0+bGVmdC0+bzsKKyAgICAgIG5ldy0+cTI9cC0+cmlnaHQtPm87CisgICAgICBpZighZGVzdCYmKHAtPmxlZnQtPm8uZmxhZ3MmKFNDUkFUQ0h8UkVHKSk9PShTQ1JBVENIfFJFRykmJnJlZ29rKHAtPmxlZnQtPm8ucmVnLGR0LDApKXsKKwluZXctPno9cC0+bGVmdC0+bzsKKwluZXctPnouZmxhZ3MmPX5EUkVGT0JKOworICAgICAgfWVsc2V7CisJaWYoVVNFUTJBU1omJihwLT5yaWdodC0+by5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSYmcmVnb2socC0+cmlnaHQtPm8ucmVnLGR0LDApKXsKKwkgIG5ldy0+ej1wLT5yaWdodC0+bzsKKwkgIG5ldy0+ei5mbGFncyY9KH5EUkVGT0JKKTsKKwl9ZWxzZXsKKwkgIGdldF9zY3JhdGNoKCZuZXctPnosZHQsMCwwKTsKKwl9CisgICAgICB9CisgICAgICBwLT5vPW5ldy0+ejsKKyAgICAgIGFkZF9JQyhuZXcpOworICAgICAgaWYoIXptbGVxKHN6b2YocC0+bGVmdC0+bnR5cC0+bmV4dCksbDJ6bSgxTCkpKXsKKwluZXc9bmV3X0lDKCk7CisJbmV3LT5jb2RlPURJVjsKKwluZXctPnExPXAtPm87CisJbmV3LT5xMi5mbGFncz1LT05TVDsKKwlndmFsLnZtYXg9c3pvZihwLT5sZWZ0LT5udHlwLT5uZXh0KTsKKwlldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CisJaW5zZXJ0X2NvbnN0KCZuZXctPnEyLnZhbCxkdCk7CisJbmV3LT56PXAtPm87CisJbmV3LT50eXBmPWR0OworCWFkZF9JQyhuZXcpOworICAgICAgfQorICAgICAgaWYoZGVzdCkgZGVzdC0+by5mbGFncz1tZmxhZ3M7CisgICAgICByZXR1cm4gZjsKKyAgICB9CisgICAgaWYoKHAtPmZsYWdzPT1BRER8fHAtPmZsYWdzPT1TVUIpJiZJU1BPSU5URVIocC0+bnR5cC0+ZmxhZ3MpKXsKKyAgICAgIC8qICBBZGRpZXJlbiB1bmQgU3VidHJhaGllcmVuIGVpbmVzIEludGVnZXJzIHp1IGVpbmVtIFBvaW50ZXIgICAqLworICAgICAgaWYocC0+ZmxhZ3M9PUFERCl7CisJbmV3LT5jb2RlPUFEREkyUDsKKwlpZighSVNQT0lOVEVSKHAtPmxlZnQtPm50eXAtPmZsYWdzKSl7CisJICBucCB0bXA9cC0+bGVmdDsKKwkgIHAtPmxlZnQ9cC0+cmlnaHQ7CisJICBwLT5yaWdodD10bXA7CisJfQorICAgICAgfWVsc2UKKwluZXctPmNvZGU9U1VCSUZQOworICAgICAgbmV3LT50eXBmPXAtPnJpZ2h0LT5udHlwLT5mbGFnczsKKyAgICAgIG5ldy0+dHlwZjI9cC0+bnR5cC0+ZmxhZ3M7CisgICAgICBuZXctPnExPXAtPmxlZnQtPm87CisgICAgICAvKiAga2xlaW5lcmUgVHlwZW4gYWxzIE1JTkFEREkyUCBlcnN0IGluIGRpZXNlbiB3YW5kZWxuICovCisgICAgICBpZigobmV3LT50eXBmJk5RKTxNSU5BRERJMlApe2NvbnZlcnQocC0+cmlnaHQsTUlOQURESTJQKTtuZXctPnR5cGY9TUlOQURESTJQO30KKyAgICAgIC8qICBncm9lc3NlcmUgVHlwZW4gYWxzIE1BWEFEREkyUCBlcnN0IGluIGRpZXNlbiB3YW5kZWxuICovCisgICAgICBpZigobmV3LT50eXBmJk5RKT5NQVhBRERJMlApe2NvbnZlcnQocC0+cmlnaHQsTUFYQURESTJQKTtuZXctPnR5cGY9TUFYQURESTJQO30gICAgICAKKyAgICAgIGlmKChwLT5sZWZ0LT5vLmZsYWdzJlZBUkFEUikmJihwLT5yaWdodC0+by5mbGFncyZLT05TVCkpeworCWV2YWxfY29uc3QoJnAtPnJpZ2h0LT5vLnZhbCxwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpOworCXAtPm89cC0+bGVmdC0+bzsKKwlwLT5vLnZhbC52bWF4PXptYWRkKHZtYXgscC0+bGVmdC0+by52YWwudm1heCk7CisJZnJlZShuZXcpOworCXJldHVybiBmOworICAgICAgfQorICAgICAgbmV3LT5xMj1wLT5yaWdodC0+bzsKKyAgICAgIGlmKCFkZXN0JiYocC0+bGVmdC0+by5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSYmcmVnb2sobmV3LT5xMS5yZWcsUE9JTlRFUl9UWVBFKHAtPmxlZnQtPm50eXAtPm5leHQpLHAtPmxlZnQtPm50eXAtPm5leHQtPmZsYWdzKSl7CisJbmV3LT56PXAtPmxlZnQtPm87CisJbmV3LT56LmZsYWdzJj0ofkRSRUZPQkopOworICAgICAgfWVsc2V7CisJZ2V0X3NjcmF0Y2goJm5ldy0+eixQT0lOVEVSX1RZUEUocC0+bGVmdC0+bnR5cC0+bmV4dCkscC0+bGVmdC0+bnR5cC0+bmV4dC0+ZmxhZ3MsMCk7CisgICAgICB9CisgICAgICBwLT5vPW5ldy0+ejsKKyAgICAgIGFkZF9JQyhuZXcpOworICAgICAgaWYoZGVzdCkgZGVzdC0+by5mbGFncz1tZmxhZ3M7CisgICAgICByZXR1cm4gZjsKKyAgICB9CisgICAgY29udmVydChwLT5sZWZ0LHAtPm50eXAtPmZsYWdzKTsKKyAgICBpZihwLT5mbGFncz09TFNISUZUfHxwLT5mbGFncz09UlNISUZUKXsKKyAgICAgIHN0cnVjdCBUeXAgKnN0PWNsb25lX3R5cChwLT5yaWdodC0+bnR5cCk7CisgICAgICAvKnN0LT5mbGFncz1pbnRfZXJ3KHN0LT5mbGFncyk7Ki8KKyAgICAgIHN0LT5mbGFncz1JTlQ7CisgICAgICBjb252ZXJ0KHAtPnJpZ2h0LHN0LT5mbGFncyk7CisgICAgICBuZXctPnR5cGYyPXN0LT5mbGFnczsKKyAgICAgIGZyZWV0eXAoc3QpOworICAgIH1lbHNlCisgICAgICBjb252ZXJ0KHAtPnJpZ2h0LHAtPm50eXAtPmZsYWdzKTsKKyAgICBuZXctPnExPXAtPmxlZnQtPm87CisgICAgbmV3LT5xMj1wLT5yaWdodC0+bzsKKyAgICBuZXctPnR5cGY9cC0+bnR5cC0+ZmxhZ3M7CisgICAgLyogIEJlaSBkZXN0IT0wLCBkLmguIEFTU0lHTk9QLCBkYXJmIHExIG5pY2h0IGFscyBaaWVsIGJlbnV6dCB3ZXJkZW4hICAqLworICAgIGlmKCFkZXN0JiYobmV3LT5xMS5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSYmcmVnb2sobmV3LT5xMS5yZWcscC0+bnR5cC0+ZmxhZ3MsMCkpeworICAgICAgbmV3LT56PW5ldy0+cTE7CisgICAgICBuZXctPnouZmxhZ3MmPX5EUkVGT0JKOworICAgIH1lbHNleworICAgICAgaWYoKG5ldy0+cTIuZmxhZ3MmU0NSQVRDSCkmJnJlZ29rKG5ldy0+cTIucmVnLHAtPm50eXAtPmZsYWdzLDApKXsKKwlpZigocC0+ZmxhZ3M+PU9SJiZwLT5mbGFnczw9QU5EKXx8cC0+ZmxhZ3M9PUFERHx8cC0+ZmxhZ3M9PU1VTFR8fHAtPmZsYWdzPT1QTVVMVCl7CisJICAvKiAgYmVpIGtvbW11dGF0aXZlbiBPcGVyYXRvcmVuIHZlcnRhdXNjaGVuICAgICAqLworCSAgbmV3LT56PW5ldy0+cTI7CisJICBuZXctPnEyPW5ldy0+cTE7CisJICBuZXctPnExPW5ldy0+ejsKKwkgIG5ldy0+ei5mbGFncyY9fkRSRUZPQko7CisJfWVsc2V7CisJICBpZihVU0VRMkFTWil7CisJICAgIG5ldy0+ej1uZXctPnEyOworCSAgICBuZXctPnouZmxhZ3MmPX5EUkVGT0JKOworCSAgfWVsc2V7CisJICAgIGdldF9zY3JhdGNoKCZuZXctPnosbmV3LT50eXBmLDAsMCk7CisJICB9CisJfQorICAgICAgfWVsc2V7CisJZ2V0X3NjcmF0Y2goJm5ldy0+eixuZXctPnR5cGYsMCwwKTsKKyAgICAgIH0KKyAgICB9CisgICAgcC0+bz1uZXctPno7CisgICAgYWRkX0lDKG5ldyk7CisgICAgaWYoZGVzdCkgZGVzdC0+by5mbGFncz1tZmxhZ3M7CisgICAgcmV0dXJuIGY7Cit9Cit2b2lkIHNhdmVzY3JhdGNoKGludCBjb2RlLHN0cnVjdCBJQyAqcCxpbnQgZG9udHNhdmUsc3RydWN0IG9iaiAqbykKKy8qICBzcGVpY2hlcnQgU2NyYXRjaHJlZ2lzdGVyIGJ6dy4gc3RlbGx0IHNpZSB3aWVkZXIgaGVyIChqZSBuYWNoIGNvZGUgICovCisvKiAgZW50d2VkZXIgTU9WRUZST01SRUcgb2RlciBNT1ZFVE9SRUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgaSxzLGUsYixkczEsZHMyO3N0cnVjdCBJQyAqbmV3OworICBpZihjb2RlPT1NT1ZFVE9SRUcpeyBzPTE7ZT1NQVhSKzE7Yj0xO30gZWxzZSB7cz1NQVhSO2U9MDtiPS0xO30KKyAgaWYocmVnX3BhaXIoZG9udHNhdmUsJnJwKSl7CisgICAgZHMxPXJwLnIxOworICAgIGRzMj1ycC5yMjsKKyAgfWVsc2UKKyAgICBkczE9ZHMyPTA7CisgIGZvcihpPXM7aSE9ZTtpKz1iKXsKKyAgICBpbnQgbXVzdHNhdmU9MDsKKyAgICBpZigoby0+ZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmby0+di0+ZmkmJihvLT52LT5maS0+ZmxhZ3MmQUxMX1JFR1MpKQorICAgICAgbXVzdHNhdmU9QlRTVChvLT52LT5maS0+cmVnc19tb2RpZmllZCxpKTsKKyAgICBlbHNlCisgICAgICBtdXN0c2F2ZT1yZWdzY3JhdGNoW2ldOworICAgIGlmKHJlZ3NhW2ldKSBtdXN0c2F2ZT0wOworICAgIGlmKG11c3RzYXZlKSBzaW1wbGVfc2NyYXRjaFtpXT0xOworICAgIGlmKHJlZ3NbaV0mJiEocmVnc1tpXSYzMikmJm11c3RzYXZlJiZpIT1kb250c2F2ZSYmaSE9ZHMxJiZpIT1kczImJiFyZWdfcGFpcihpLCZycCkpeworICAgICAgaWYoIXJlZ3NidWZbaV0peworCXN0cnVjdCBUeXAgKnQ7CisJaWYoY29kZSE9TU9WRUZST01SRUcpIGNvbnRpbnVlOworCXQ9Y2xvbmVfdHlwKHJlZ3R5cGVbaV0pOworCXJlZ3NidWZbaV09YWRkX3ZhcihlbXB0eSx0LEFVVE8sMCk7CisJcmVnc2J1ZltpXS0+ZmxhZ3N8PVVTRURBU0FEUjsKKwlyZWdibmVzdGluZ1tpXT1uZXN0aW5nOworICAgICAgfQorICAgICAgbmV3PW5ld19JQygpOworICAgICAgbmV3LT50eXBmPW5ldy0+cTIuZmxhZ3M9MDsKKyAgICAgIG5ldy0+bGluZT0wO25ldy0+ZmlsZT0wOworICAgICAgbmV3LT5jb2RlPWNvZGU7CisgICAgICBpZihjb2RlPT1NT1ZFRlJPTVJFRyl7CisJbmV3LT5xMS5mbGFncz1SRUc7bmV3LT5xMS5yZWc9aTsKKwluZXctPnouZmxhZ3M9VkFSfERPTlRSRUdJU1RFUklaRTtuZXctPnoudj1yZWdzYnVmW2ldOworCW5ldy0+ei52YWwudm1heD1sMnptKDBMKTsKKyAgICAgIH1lbHNleworCW5ldy0+ei5mbGFncz1SRUc7bmV3LT56LnJlZz1pOworCW5ldy0+cTEuZmxhZ3M9VkFSfERPTlRSRUdJU1RFUklaRTtuZXctPnExLnY9cmVnc2J1ZltpXTsKKwluZXctPnExLnZhbC52bWF4PWwyem0oMEwpOworICAgICAgfQorICAgICAgbmV3LT51c2VfY250PW5ldy0+Y2hhbmdlX2NudD0wOworICAgICAgbmV3LT51c2VfbGlzdD1uZXctPmNoYW5nZV9saXN0PTA7CisgICAgICBpbnNlcnRfSUMocCxuZXcpOworICAgIH0KKyAgfQorfQorCmRpZmYgLS1naXQgYS9sb29wLmMgYi9sb29wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxOTBjNgotLS0gL2Rldi9udWxsCisrKyBiL2xvb3AuYwpAQCAtMCwwICsxLDIwNzcgQEAKKy8qICAkVkVSOiB2YmNjIChsb29wLmMpICRSZXZpc2lvbjogMS4xOSAkICAgICovCisvKiAgc2NobGVpZmVub3JpZW50aWVydGUgT3B0aW1pZXJ1bmdlbiAgKi8KKworI2luY2x1ZGUgIm9wdC5oIgorCitzdGF0aWMgY2hhciBGSUxFX1tdPV9fRklMRV9fOworCisjZGVmaW5lIE1PVkVfSUMgMQorI2RlZmluZSBNT1ZFX0NPTVAgMgorCisvKiAgTGlzdGUsIGluIGRpZSBJQ3MgZWluZ2V0cmFnZW4gd2VyZGVuLCBkaWUgYXVzIFNjaGxlaWZlbiAqLworLyogIGdlem9nZW4gd2VyZGVuIHNvbGxlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3R5cGVkZWYgc3RydWN0IG1vdmxpc3R7CisgIHN0cnVjdCBtb3ZsaXN0ICpuZXh0OworICBJQyAqSUM7CisgIGZsb3dncmFwaCAqdGFyZ2V0X2ZnOworICBpbnQgZmxhZ3M7Cit9IG1vdmxpc3Q7CisKK21vdmxpc3QgKmZpcnN0X21vdiwqbGFzdF9tb3Y7CisKK2ludCByZXBvcnRfd2VpcmRfY29kZSxyZXBvcnRfc3VzcGljaW91c19sb29wczsKKworc3RhdGljIGludCBvbmx5X3Nob3J0ZW47CisKKy8qICBCaXR2ZWt0b3JlbiBmdWVyIHNjaGxlaWZlbmludmFyaWFudGUgSUNzICAgICovCitidnR5cGUgKmludmFyaWFudCwqaW5sb29wLCptb3ZlZCwqbW92ZWRfY29tcGxldGVseTsKK2J2dHlwZSAqZmdfdG1wOworYnZ0eXBlICpub3RfbW92YWJsZTsKK3NpemVfdCBic2l6ZTsKKworCisvKiAgTGlzdGUsIGluIGRpZSBJQ3MgZnVlciBzdHJlbmd0aC1yZWR1Y3Rpb24gZWluZ2V0cmFnZW4gICAqLworLyogIHdlcmRlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3R5cGVkZWYgc3RydWN0IHNybGlzdHsKKyAgc3RydWN0IHNybGlzdCAqbmV4dDsKKyAgSUMgKmluZF92YXI7CisgIElDICpJQzsKKyAgZmxvd2dyYXBoICp0YXJnZXRfZmc7CisgIC8qICBIaWxmc3ZhcmlhYmxlLCBmYWxscyBlaW5lIGFlcXVpdmFsZW50ZSBPcGVyYXRpb24gc2Nob24gcmVkdXppZXJ0ICAgICovCisgIC8qICB3dXJkZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFZhciAqaHY7Cit9IHNybGlzdCA7CisKK3NybGlzdCAqZmlyc3Rfc3IsKmxhc3Rfc3I7CisKKy8qICBMaXN0ZSwgaW4gZGllIERhdGVuIGZ1ZXIgbG9vcC11bnJvbGxpbmcgZWluZ2V0cmFnZW4gd2VyZGVuLiAqLwordHlwZWRlZiBzdHJ1Y3QgdXJsaXN0eworICBpbnQgZmxhZ3M7CisgIGxvbmcgdG90YWwsdW5yb2xsOworICBJQyAqY21wLCpicmFuY2gsKmluZDsKKyAgZmxvd2dyYXBoICpzdGFydCwqaGVhZDsKKyAgc3RydWN0IHVybGlzdCAqbmV4dDsKK30gdXJsaXN0OworCit1cmxpc3QgKmZpcnN0X3VyOworCisjZGVmaW5lIFVOUk9MTF9DT01QTEVURUxZIDEKKyNkZWZpbmUgVU5ST0xMX01PRFVMTyAyCisjZGVmaW5lIFVOUk9MTF9JTlZBUklBTlQgNAorI2RlZmluZSBVTlJPTExfUkVWRVJTRSA4CisjZGVmaW5lIFVOUk9MTF9TSE9SVEVOIDE2CisjZGVmaW5lIElORF9PTkxZX0NPVU5UUyAzMgorI2RlZmluZSBNVUxUSVBMRV9FWElUUyA2NAorCisvKiAgSGllciB3ZXJkZW4gSW5kdWt0aW9uc3ZhcmlhYmxlbiB2ZXJtZXJrdCAgICAqLworSUMgKippbmRfdmFyczsKKworc3RhdGljIGZsb3dncmFwaCAqZmlyc3RfZmc7CisKKyNpZmRlZiBBTEVYX1JFRwordm9pZCBJbmNyZW1lbnRMb29wRGVwdGgoZmxvd2dyYXBoKiBmZyxpbnQgc3RhcnQsaW50IGVuZCkKKyAgICAgLyogZXJob2VodCBsb29wX2RlcHRoIGluIGRlbiBCbG9lY2tlbiBbc3RhcnQsZW5kXSAqLworeworICBpZiAoIChmZy0+aW5kZXggPj0gc3RhcnQpICYmIChmZy0+aW5kZXggPD0gZW5kKSApCisgICAgeworICAgICAgZmctPmxvb3BfZGVwdGgrKzsKKyAgICB9CisgIGlmIChmZy0+bm9ybWFsb3V0KQorICAgIEluY3JlbWVudExvb3BEZXB0aChmZy0+bm9ybWFsb3V0LHN0YXJ0LGVuZCk7Cit9CisjZW5kaWYKKworI2lmICFIQVZFX0RFQ0lERV9SRVZFUlNFCitpbnQgZGVjaWRlX3JldmVyc2Uoem1heCB2KQoreworICBpZihvcHRzcGVlZHx8em1lcXRvKHYsbDJ6bSgxTCkpKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitpbnQgbG9vcHMoZmxvd2dyYXBoICpmZyxpbnQgZm9vdGVycykKKy8qICBrZW5uemVpY2huZXQgU2NobGVpZmVuIGltIEZsdXNzZ3JhcGg7IHdlbm4gZm9vdGVycyE9MCB3ZXJkZW4gZGFyZiBlaW5lICAqLworLyogIFNjaGxlaWZlIG51ciBlaW5lbiBnZW1laW5zYW1lbiBBdXN0cml0dHNwdW5rdCBoYWJlbiAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBpLHN0YXJ0LGVuZCxjPTA7Zmxvd2xpc3QgKmxwO2Zsb3dncmFwaCAqZywqbG9vcGVuZDsKKyAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJzZWFyY2hpbmcgbG9vcHNcbiIpOworICBnPWZnOworICB3aGlsZShnKXsKKyAgICBzdGFydD1nLT5pbmRleDsKKyAgICBlbmQ9LTE7CisgICAgZm9yKGxwPWctPmluO2xwO2xwPWxwLT5uZXh0KXsKKyAgICAgIGlmKCFscC0+Z3JhcGgpIGNvbnRpbnVlOworICAgICAgaWYobHAtPmdyYXBoLT5icmFuY2hvdXQ9PWd8fCFscC0+Z3JhcGgtPmVuZHx8bHAtPmdyYXBoLT5lbmQtPmNvZGUhPUJSQSl7CisJaT1scC0+Z3JhcGgtPmluZGV4OworCWlmKGk+PXN0YXJ0JiZpPmVuZCl7IGVuZD1pO2xvb3BlbmQ9bHAtPmdyYXBoOyB9CisgICAgICB9CisgICAgfQorICAgIGlmKGVuZD49MCl7CisgICAgICAvKiAgU2NobGVpZmUgb2RlciBldHdhcyBhZWhubGljaGVzICAqLworICAgICAgZmxvd2dyYXBoICpwPWc7CisgICAgICBpZihERUJVRyYxMDI0KSBwcmludGYoImZvdW5kIHBvc3NpYmxlIGxvb3AgZnJvbSBibG9ja3MgJWQgdG8gJWRcbiIsc3RhcnQsZW5kKTsKKyAgICAgIGlmKDEvKmdvdG9fdXNlZCovKXsKKwlpZihERUJVRyYxMDI0KSBwcmludGYoImhhdmUgdG8gY2hlY2suLi5cbiIpOworCWRveworCSAgaWYoIXB8fHAtPmluZGV4PmVuZCkgYnJlYWs7CisKKwkgIC8qICB0ZXN0ZW4sIG9iIGF1cyBkZXIgU2NobGVpZmUgZ2VzcHJ1bmdlbiB3aXJkICovCisJICBpZihwLT5icmFuY2hvdXQmJmZvb3RlcnMpeworCSAgICBpPXAtPmJyYW5jaG91dC0+aW5kZXg7CisJICAgIGlmKGk8c3RhcnQpeworCSAgICAgIGVuZD0tMTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgICBpZihpPmVuZCYmKERFQlVHJjEwMjQpKXsKKwkgICAgICBwdXRzKCJqdW1wIG91dCBvZiBsb29wIik7CisJICAgICAgaWYocC0+YnJhbmNob3V0IT1sb29wZW5kLT5ub3JtYWxvdXQpeworCQlwdXRzKCJubyBicmVhayIpOworCQlpZihwLT5icmFuY2hvdXQtPnN0YXJ0LT50eXBmIT1yZXR1cm5fbGFiZWwpIHB1dHMoIm5vIHJldHVybiIpOworCSAgICAgIH0KKwkgICAgfQorCSAgICBpZihpPmVuZCYmcC0+YnJhbmNob3V0IT1sb29wZW5kLT5ub3JtYWxvdXQmJnAtPmJyYW5jaG91dC0+c3RhcnQtPnR5cGYhPXJldHVybl9sYWJlbCl7CisJICAgICAgLyogIFNwcnVuZyB6dSBhbmRlcmVtIGFscyBkZW0gbm9ybWFsZW4gQXVzdHJpdHQgb2RlciByZXR1cm4gKi8KKwkgICAgICBlbmQ9LTE7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIH0KKwkgIC8qICB0ZXN0ZW4sIG9iIGluIGRpZSBTY2hsZWlmZSBnZXNwcnVuZ2VuIHdpcmQgICovCisJICBpZihwIT1nKXsKKwkgICAgZm9yKGxwPXAtPmluO2xwO2xwPWxwLT5uZXh0KXsKKwkgICAgICBpZighbHAtPmdyYXBoKSBjb250aW51ZTsKKwkgICAgICBpZihscC0+Z3JhcGgtPmJyYW5jaG91dD09cCl7CisJCWk9bHAtPmdyYXBoLT5pbmRleDsKKwkJaWYoaTxzdGFydCl7CisJCSAgaWYocmVwb3J0X3dlaXJkX2NvZGUpe2Vycm9yKDE3NSk7cmVwb3J0X3dlaXJkX2NvZGU9MDt9CisJCSAgZW5kPS0xOworCQkgIGJyZWFrOworCQl9CisJCWlmKGk+ZW5kKXsKKwkJICBlbmQ9LTE7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICB9CisJICAgIH0KKwkgIH0KKwkgIGlmKHAtPmluZGV4PT1lbmQpIGJyZWFrOworCSAgcD1wLT5ub3JtYWxvdXQ7CisJfXdoaWxlKGVuZD49MCk7CisgICAgICB9ZWxzZXsKKwlpZihERUJVRyYxMDI0KSBwcmludGYoIm11c3QgYmUgYSBsb29wLCBiZWNhdXNlIHRoZXJlIHdhcyBubyBnb3RvXG4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoZW5kPj0wKXsKKyAgICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiY29uZmlybWVkIHRoYXQgaXQgaXMgYSBsb29wXG4iKTsKKyAgICAgIGctPmxvb3BlbmQ9bG9vcGVuZDsKKyAgICAgIGMrKzsKKyNpZmRlZiBBTEVYX1JFRworICAgICAgSW5jcmVtZW50TG9vcERlcHRoKGZnLHN0YXJ0LGVuZCk7CisjZW5kaWYKKyAgICB9CisgICAgZz1nLT5ub3JtYWxvdXQ7CisgIH0KKyAgcmV0dXJuIGM7Cit9CisKK2Zsb3dncmFwaCAqY3JlYXRlX2xvb3BfaGVhZGVycyhmbG93Z3JhcGggKmZnLGludCBhdikKKy8qICBGdWVndCB2b3IgamVkZSBTY2hsZWlmZSBlaW5lbiBLb3BmLUJsb2NrIGVpbiwgd2VubiBub2V0aWcuICAqLworLyogIFdlbm4gYXYhPTAgd2VyZGVuIGFrdGl2ZSBWYXJpYWJsZW4ga29ycmVrdCB1ZWJlcnRyYWdlbiB1bmQgICovCisvKiAgZGl2ZXJzZSBSZWdpc3Rlcmxpc3RlbiB1ZWJlcm5vbW1lbiB1bmQgaW5kZXg9LTEgZ2VzZXR6dC4gICAgKi8KKy8qICBLYW5uIGVpbmVuIEJsb2NrIG1laHJtYWxzIGluIGRlciAtPmluIExpc3RlIGVpbnRyYWdlbiAgICAgICAqLworeworICBmbG93Z3JhcGggKmcsKmxhc3QsKm5ldywqcmc9Zmc7CisgIElDICpsaWMsKmxhc3RpYzsKKyAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJjcmVhdGluZyBsb29wLWhlYWRlcnNcbiIpOworICBnPWZnO2xhc3Q9MDtsYXN0aWM9MDsKKyAgd2hpbGUoZyl7CisgICAgbmV3PTA7CisgICAgaWYoZy0+bG9vcGVuZCl7CisgICAgICBpZighbGFzdCl7CisJZmxvd2xpc3QgKmxwOworCW5ldz1uZXdfZmxvd2dyYXBoKCk7CisJcmc9bmV3OworCW5ldy0+aW49MDsKKwlsaWM9bmV3X0lDKCk7CisJbGljLT5jb2RlPUxBQkVMOworCWxpYy0+dHlwZj0rK2xhYmVsOworCWxpYy0+cTEuZmxhZ3M9bGljLT5xMi5mbGFncz1saWMtPnouZmxhZ3M9MDsKKwlsaWMtPnExLmFtPWxpYy0+cTIuYW09bGljLT56LmFtPTA7CisJbmV3LT5zdGFydD1uZXctPmVuZD1saWM7CisJbGljLT5uZXh0PWZpcnN0X2ljOworCWxpYy0+cHJldj0wOworCWZpcnN0X2ljLT5wcmV2PWxpYzsKKwlmaXJzdF9pYz1saWM7CisJbHA9bXltYWxsb2Moc2l6ZW9mKGZsb3dsaXN0KSk7CisJbHAtPmdyYXBoPW5ldzsKKwlscC0+bmV4dD1nLT5pbjsKKwlnLT5pbj1scDsKKyAgICAgIH1lbHNleworCWZsb3dsaXN0ICpscCwqbmwsKipsczsKKwluZXc9bmV3X2Zsb3dncmFwaCgpOworCWxhc3QtPm5vcm1hbG91dD1uZXc7CisJbGljPW5ld19JQygpOworCW5ldy0+c3RhcnQ9bmV3LT5lbmQ9bGljOworCWxpYy0+Y29kZT1MQUJFTDsKKwlsaWMtPnR5cGY9KytsYWJlbDsKKwlsaWMtPnExLmZsYWdzPWxpYy0+cTIuZmxhZ3M9bGljLT56LmZsYWdzPTA7CisJbGljLT5xMS5hbT1saWMtPnEyLmFtPWxpYy0+ei5hbT0wOworCWlmKGxhc3RpYykgbGFzdGljLT5uZXh0PWxpYzsKKwllbHNlICAgZmlyc3RfaWM9bGljOworCWxpYy0+cHJldj1sYXN0aWM7CisJZy0+c3RhcnQtPnByZXY9bGljOworCWxpYy0+bmV4dD1nLT5zdGFydDsKKwlscD1nLT5pbjtscz0mbmV3LT5pbjsKKwl3aGlsZShscCl7CisJICBpZihscC0+Z3JhcGgmJmxwLT5ncmFwaC0+aW5kZXg8Zy0+aW5kZXgpeworCSAgICAvKiAgRWludHJpdHQgdm9uIG9iZW4gc29sbCBpbiBkZW4gS29wZiAgKi8KKwkgICAgbmw9bXltYWxsb2Moc2l6ZW9mKGZsb3dsaXN0KSk7CisJICAgIG5sLT5ncmFwaD1scC0+Z3JhcGg7CisJICAgIG5sLT5uZXh0PTA7CisJICAgICgqbHMpPW5sOworCSAgICBscz0mbmwtPm5leHQ7CisJICAgIGlmKGxwLT5ncmFwaC0+YnJhbmNob3V0PT1nKXsKKwkgICAgICBJQyAqcD1scC0+Z3JhcGgtPmVuZDsKKwkgICAgICBpZihERUJVRyYxMDI0KSBwcmludGYoImNoYW5naW5nIGJyYW5jaFxuIik7CisJICAgICAgd2hpbGUocCYmcC0+Y29kZT09RlJFRVJFRykgcD1wLT5wcmV2OworCSAgICAgIGlmKCFwfHxwLT5jb2RlPEJFUXx8cC0+Y29kZT5CUkEpIGllcnJvcigwKTsKKwkgICAgICBwLT50eXBmPWxpYy0+dHlwZjsKKwkgICAgICBscC0+Z3JhcGgtPmJyYW5jaG91dD1uZXc7CisJICAgIH0KKwkgICAgbHAtPmdyYXBoPW5ldzsKKwkgIH0KKwkgIGxwPWxwLT5uZXh0OworCX0KKwlpZighbmV3LT5pbikgaWVycm9yKDApOworICAgICAgfQorICAgICAgaWYobmV3KXsKKwlpZihERUJVRyYxMDI0KSBwcmludGYoIm11c3QgaW5zZXJ0IGxvb3AtaGVhZGVyIGJlZm9yZSBibG9jayAlZFxuIixnLT5pbmRleCk7CisJYmFzaWNfYmxvY2tzKys7CisJbmV3LT5icmFuY2hvdXQ9MDsKKwluZXctPmxvb3BlbmQ9MDsKKwlpZihhdikKKwkgIG5ldy0+aW5kZXg9LTE7CisJZWxzZQorCSAgbmV3LT5pbmRleD1iYXNpY19ibG9ja3M7CisJbmV3LT5ub3JtYWxvdXQ9ZzsKKwluZXctPmNhbGxzPTA7CisJbmV3LT5sb29wX2NhbGxzPTA7CisJbmV3LT5yZF9pbj1uZXctPnJkX291dD1uZXctPnJkX2tpbGw9bmV3LT5yZF9nZW49MDsKKwluZXctPmFlX2luPW5ldy0+YWVfb3V0PW5ldy0+YWVfa2lsbD1uZXctPmFlX2dlbj0wOworCW5ldy0+Y3BfaW49bmV3LT5jcF9vdXQ9bmV3LT5jcF9raWxsPW5ldy0+Y3BfZ2VuPTA7CisJaWYoIWF2KXsKKwkgIG5ldy0+YXZfaW49bmV3LT5hdl9vdXQ9bmV3LT5hdl9raWxsPW5ldy0+YXZfZ2VuPTA7CisJfWVsc2V7CisJICBuZXctPmF2X2luPW15bWFsbG9jKHZzaXplKTsKKwkgIG5ldy0+YXZfb3V0PW15bWFsbG9jKHZzaXplKTsKKwkgIG5ldy0+YXZfZ2VuPW15bWFsbG9jKHZzaXplKTsKKwkgIG5ldy0+YXZfa2lsbD1teW1hbGxvYyh2c2l6ZSk7CisJICBtZW1zZXQobmV3LT5hdl9nZW4sMCx2c2l6ZSk7CisJICBtZW1zZXQobmV3LT5hdl9raWxsLDAsdnNpemUpOworCSAgbWVtY3B5KG5ldy0+YXZfb3V0LGctPmF2X2luLHZzaXplKTsKKwkgIG1lbWNweShuZXctPmF2X2luLGctPmF2X2luLHZzaXplKTsKKwkgIG1lbWNweSgmbmV3LT5yZWd2LCZnLT5yZWd2LHNpemVvZihuZXctPnJlZ3YpKTsKKwkgIG1lbWNweSgmbmV3LT5yZWd1c2VkLCZnLT5yZWd1c2VkLHNpemVvZihuZXctPnJlZ3VzZWQpKTsKKwl9CisgICAgICB9CisgICAgfQorICAgIGxhc3Q9ZztpZihsYXN0LT5lbmQpIGxhc3RpYz1sYXN0LT5lbmQ7CisgICAgZz1nLT5ub3JtYWxvdXQ7CisgIH0KKyAgcmV0dXJuIHJnOworfQorZmxvd2dyYXBoICpjcmVhdGVfbG9vcF9mb290ZXJzKGZsb3dncmFwaCAqZmcsaW50IGF2KQorLyogIEZ1ZWd0IGhpbnRlciBqZWRlIFNjaGxlaWZlIGVpbmVuIEZ1c3MtQmxvY2sgZWluLCB3ZW5uIG5vZXRpZy4gICAqLworLyogIFdlbm4gYXYhPTAgd2VyZGVuIGFrdGl2ZSBWYXJpYWJsZW4ga29ycmVrdCB1ZWJlcnRyYWdlbiB1bmQgICAgICAqLworLyogIGRpdmVyc2UgUmVnaXN0ZXJsaXN0ZW4gdWViZXJub21tZW4gdW5kIGluZGV4IGF1ZiAtMiBnZXNldHp0LiAgICAqLworeworICBmbG93Z3JhcGggKmcsKmxvb3BlbmQsKm91dCwqbmV3OworICBJQyAqbGljOworICBpZihERUJVRyYxMDI0KSBwcmludGYoImNyZWF0aW5nIGxvb3AtZm9vdGVyc1xuIik7CisgIGc9Zmc7CisgIHdoaWxlKGcpeworICAgIG5ldz0wOworICAgIGxvb3BlbmQ9Zy0+bG9vcGVuZDsKKyAgICBpZihsb29wZW5kKXsKKyAgICAgIGZsb3dsaXN0ICpscCwqbmwsKipsczsKKyAgICAgIG91dD1sb29wZW5kLT5ub3JtYWxvdXQ7CisgICAgICBuZXc9bmV3X2Zsb3dncmFwaCgpOworICAgICAgbmV3LT5ub3JtYWxvdXQ9b3V0OworICAgICAgbG9vcGVuZC0+bm9ybWFsb3V0PW5ldzsKKyAgICAgIGxpYz1uZXdfSUMoKTsKKyAgICAgIGxpYy0+bGluZT0wOworICAgICAgbGljLT5maWxlPTA7CisgICAgICBuZXctPnN0YXJ0PW5ldy0+ZW5kPWxpYzsKKyAgICAgIGxpYy0+Y29kZT1MQUJFTDsKKyAgICAgIGxpYy0+dHlwZj0rK2xhYmVsOworICAgICAgbGljLT5xMS5mbGFncz1saWMtPnEyLmZsYWdzPWxpYy0+ei5mbGFncz0wOworICAgICAgbGljLT5xMS5hbT1saWMtPnEyLmFtPWxpYy0+ei5hbT0wOworICAgICAgbGljLT51c2VfY250PWxpYy0+Y2hhbmdlX2NudD0wOworICAgICAgbGljLT51c2VfbGlzdD1saWMtPmNoYW5nZV9saXN0PTA7CisgICAgICBpZihvdXQpIGxwPW91dC0+aW47IGVsc2Uge2xwPTA7bmV3LT5pbj0wO30KKyAgICAgIGxzPSZuZXctPmluOworICAgICAgd2hpbGUobHApeworCWlmKGxwLT5ncmFwaCYmbHAtPmdyYXBoLT5pbmRleDw9bG9vcGVuZC0+aW5kZXgmJmxwLT5ncmFwaC0+aW5kZXg+PWctPmluZGV4KXsKKwkgIC8qICBBdXN0cml0dCBhdXMgU2NobGVpZmUgc29sbCBpbiBkZW4gRnVzcyAgKi8KKwkgIG5sPW15bWFsbG9jKHNpemVvZihmbG93bGlzdCkpOworCSAgbmwtPmdyYXBoPWxwLT5ncmFwaDsKKwkgIG5sLT5uZXh0PTA7CisJICAoKmxzKT1ubDsKKwkgIGxzPSZubC0+bmV4dDsKKwkgIGlmKGxwLT5ncmFwaC0+YnJhbmNob3V0PT1vdXQpeworCSAgICBJQyAqcD1scC0+Z3JhcGgtPmVuZDsKKwkgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJjaGFuZ2luZyBicmFuY2hcbiIpOworCSAgICB3aGlsZShwJiZwLT5jb2RlPT1GUkVFUkVHKSBwPXAtPnByZXY7CisJICAgIGlmKCFwfHxwLT5jb2RlPEJFUXx8cC0+Y29kZT5CUkEpIGllcnJvcigwKTsKKwkgICAgcC0+dHlwZj1saWMtPnR5cGY7CisJICAgIGxwLT5ncmFwaC0+YnJhbmNob3V0PW5ldzsKKwkgIH0KKwkgIGxwLT5ncmFwaD1uZXc7CisJfQorCWxwPWxwLT5uZXh0OworICAgICAgfQorICAgICAgaWYob3V0JiYhbmV3LT5pbikgaWVycm9yKDApOworICAgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJtdXN0IGluc2VydCBsb29wLWZvb3RlciBhZnRlciBibG9jayAlZFxuIixsb29wZW5kLT5pbmRleCk7CisgICAgICBiYXNpY19ibG9ja3MrKzsKKyAgICAgIG5ldy0+YnJhbmNob3V0PTA7CisgICAgICBuZXctPmxvb3BlbmQ9MDsKKyAgICAgIGlmKGF2KQorCW5ldy0+aW5kZXg9LTI7CisgICAgICBlbHNlCisJbmV3LT5pbmRleD1iYXNpY19ibG9ja3M7CisgICAgICBuZXctPm5vcm1hbG91dD1vdXQ7CisgICAgICBuZXctPmNhbGxzPTA7CisgICAgICBuZXctPmxvb3BfY2FsbHM9MDsKKyAgICAgIG5ldy0+cmRfaW49bmV3LT5yZF9vdXQ9bmV3LT5yZF9raWxsPW5ldy0+cmRfZ2VuPTA7CisgICAgICBuZXctPmFlX2luPW5ldy0+YWVfb3V0PW5ldy0+YWVfa2lsbD1uZXctPmFlX2dlbj0wOworICAgICAgbmV3LT5jcF9pbj1uZXctPmNwX291dD1uZXctPmNwX2tpbGw9bmV3LT5jcF9nZW49MDsKKyAgICAgIGlmKCFhdil7CisJbmV3LT5hdl9pbj1uZXctPmF2X291dD1uZXctPmF2X2tpbGw9bmV3LT5hdl9nZW49MDsKKyAgICAgIH1lbHNleworCW5ldy0+YXZfaW49bXltYWxsb2ModnNpemUpOworCW5ldy0+YXZfb3V0PW15bWFsbG9jKHZzaXplKTsKKwluZXctPmF2X2tpbGw9bXltYWxsb2ModnNpemUpOworCW5ldy0+YXZfZ2VuPW15bWFsbG9jKHZzaXplKTsKKwltZW1zZXQobmV3LT5hdl9nZW4sMCx2c2l6ZSk7CisJbWVtc2V0KG5ldy0+YXZfa2lsbCwwLHZzaXplKTsKKwlpZihvdXQpeworCSAgbWVtY3B5KG5ldy0+YXZfb3V0LG91dC0+YXZfaW4sdnNpemUpOworCSAgbWVtY3B5KG5ldy0+YXZfaW4sb3V0LT5hdl9pbix2c2l6ZSk7CisJfWVsc2V7CisJICBtZW1jcHkobmV3LT5hdl9vdXQsYXZfZ2xvYmFscyx2c2l6ZSk7CisJICBidnVuaXRlKG5ldy0+YXZfb3V0LGF2X3N0YXRpY3MsdnNpemUpOworCSAgbWVtY3B5KG5ldy0+YXZfaW4sbmV3LT5hdl9vdXQsdnNpemUpOworCX0KKwltZW1jcHkoJm5ldy0+cmVndiwmZy0+cmVndixzaXplb2YobmV3LT5yZWd2KSk7CisJbWVtY3B5KCZuZXctPnJlZ3VzZWQsJmctPnJlZ3VzZWQsc2l6ZW9mKG5ldy0+cmVndXNlZCkpOworICAgICAgfQorICAgICAgaW5zZXJ0X0lDX2ZnKG5ldyxsb29wZW5kLT5lbmQsbGljKTsKKyAgICB9CisgICAgZz1nLT5ub3JtYWxvdXQ7CisgIH0KKyAgcmV0dXJuIGZnOworfQordm9pZCBhZGRfbW92YWJsZShJQyAqcCxmbG93Z3JhcGggKmZnLGludCBmbGFncykKKy8qICBGdWVndCBJQyBwLCBkYXMgYXVzIGRlciBTY2hsZWlmZSBpbiBCbG9jayBmZyBtaXQgRmxhZ3MgZmxhZ3MgICAgKi8KKy8qICB2ZXJzY2hvYmVuIHdlcmRlbiBkYXJmIGluIGVpbmUgTGlzdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgbW92bGlzdCAqbmV3PW15bWFsbG9jKHNpemVvZigqbmV3KSk7CisgIG5ldy0+SUM9cDsKKyAgbmV3LT50YXJnZXRfZmc9Zmc7CisgIG5ldy0+ZmxhZ3M9ZmxhZ3M7CisgIG5ldy0+bmV4dD0wOworICBpZihsYXN0X21vdil7CisgICAgbGFzdF9tb3YtPm5leHQ9bmV3OworICAgIGxhc3RfbW92PW5ldzsKKyAgfWVsc2V7CisgICAgZmlyc3RfbW92PWxhc3RfbW92PW5ldzsKKyAgfQorICBCU0VUKG1vdmVkLHAtPmRlZmluZGV4KTsKKyAgaWYoZmxhZ3M9PU1PVkVfSUMpIEJTRVQobW92ZWRfY29tcGxldGVseSxwLT5kZWZpbmRleCk7Cit9CitpbnQgbW92ZV90b19oZWFkKHZvaWQpCisvKiAgR2VodCBkaWUgTGlzdGUgbWl0IHZlcnNjaGllYmJhcmVuIElDcyBkdXJjaCB1bmQgc2NoaWVidCBkaWUgSUNzICovCisvKiAgaW4gZGVuIFZvcmtvcGYgZGVyIFNjaGxlaWZlLiBBdXNzZXJkZW0gd2lyZCBkaWUgTGlzdGUgICAgICAgICAgICovCisvKiAgZnJlaWdlZ2ViZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVyIFJ1ZWNrZ2FiZXdlcnQgaGF0IEJpdCAxIGdlc2V0enQsIHdlbm4gSUNzIGdhbnogdmVyc2Nob2JlbiAgICovCisvKiAgd3VyZGVuIHVuZCBCaXQgMiwgZmFsbHMgZWluZSBCZXJlY2hudW5nIG1pdCBIaWxmc3ZhcmlhYmxlIHZvciAgICovCisvKiAgZGllIFNjaGxlaWZlIGdlem9nZW4gd3VyZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIElDICoqZmdsaXN0OyAvKiBMZXR6dGVzIElDIHZvciBqZWRlbSBCbG9jayAgICovCisgIGZsb3dncmFwaCAqZztJQyAqcDttb3ZsaXN0ICptOworICBpbnQgY2hhbmdlZD0wOworCisgIGlmKCFmaXJzdF9tb3YpIHJldHVybiAwOworCisgIGlmKERFQlVHJjEwMjQpIHByaW50ZigibW92aW5nIHRoZSBJQ3Mgb3V0IG9mIHRoZSBsb29wXG4iKTsKKworICBmZ2xpc3Q9bXltYWxsb2MoKGJhc2ljX2Jsb2NrcysxKSpzaXplb2YoKmZnbGlzdCkpOworICBwPTA7CisgIGZvcihnPWZpcnN0X2ZnO2c7Zz1nLT5ub3JtYWxvdXQpeworICAgIGlmKGctPmluZGV4PmJhc2ljX2Jsb2NrcykgaWVycm9yKDApOworICAgIGlmKGctPmVuZCkgcD1nLT5lbmQ7CisgICAgZmdsaXN0W2ctPmluZGV4XT1wOworICB9CisgIHdoaWxlKGZpcnN0X21vdil7CisgICAgcD1maXJzdF9tb3YtPklDOworICAgIGc9Zmlyc3RfbW92LT50YXJnZXRfZmc7CisgICAgaWYoZmlyc3RfbW92LT5mbGFncz09TU9WRV9JQyl7CisgICAgICBpZihERUJVRyYxMDI0KSB7cHJpbnRmKCJtb3ZpbmcgSUMgb3V0IG9mIGxvb3A6XG4iKTtwcmljMihzdGRvdXQscCk7fQorICAgICAgaWYoIXAtPnByZXZ8fCFwLT5uZXh0KSBpZXJyb3IoMCk7CisgICAgICBwLT5uZXh0LT5wcmV2PXAtPnByZXY7CisgICAgICBwLT5wcmV2LT5uZXh0PXAtPm5leHQ7CisgICAgICBpbnNlcnRfSUNfZmcoZyxmZ2xpc3RbZy0+aW5kZXhdLHApOworICAgICAgZmdsaXN0W2ctPmluZGV4XT1wOworICAgICAgY2hhbmdlZHw9MTsKKyAgICB9ZWxzZSBpZigxKXsKKyAgICAgIHR5cGUgKnQ9bmV3X3R5cCgpOworICAgICAgSUMgKm5ldz1uZXdfSUMoKTsKKyAgICAgIFZhciAqdjsKKyAgICAgIGlmKERFQlVHJjEwMjQpIHtwcmludGYoIm1vdmluZyBjb21wdXRhdGlvbiBvdXQgb2YgbG9vcDpcbiIpO3ByaWMyKHN0ZG91dCxwKTt9CisgICAgICB0LT5mbGFncz16dHlwKHApOworICAgICAgaWYocC0+Y29kZT09Q09NUEFSRXx8cC0+Y29kZT09VEVTVCkgdC0+ZmxhZ3M9MDsKKyAgICAgIGlmKElTUE9JTlRFUih0LT5mbGFncykpeworCXQtPm5leHQ9bmV3X3R5cCgpOworCXQtPm5leHQtPmZsYWdzPVZPSUQ7CisgICAgICB9CisgICAgICB2PWFkZF90bXBfdmFyKHQpOworICAgICAgKm5ldz0qcDsKKyAgICAgIG5ldy0+ei5mbGFncz1WQVI7CisgICAgICBuZXctPnoudj12OworICAgICAgbmV3LT56LnZhbC52bWF4PWwyem0oMEwpOworCisgICAgICAvKiAgRGllIG5ldWUgT3BlcmF0aW9uIGJlbnV0enQgbWF4aW1hbCwgd2FzIGRpZSBhbmRlcmUgYmVudXR6dGUgKi8KKyAgICAgIC8qICB1bmQgYWVuZGVydCBudXIgZGllIEhpbGZzdmFyaWFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaWYoaGF2ZV9hbGlhcyl7CisJbmV3LT51c2VfY250PXAtPnVzZV9jbnQ7CisJbmV3LT51c2VfbGlzdD1teW1hbGxvYyhuZXctPnVzZV9jbnQqVkxTKTsKKwltZW1jcHkobmV3LT51c2VfbGlzdCxwLT51c2VfbGlzdCxuZXctPnVzZV9jbnQqVkxTKTsKKwluZXctPmNoYW5nZV9jbnQ9MTsKKwluZXctPmNoYW5nZV9saXN0PW15bWFsbG9jKFZMUyk7CisJbmV3LT5jaGFuZ2VfbGlzdFswXS52PXY7CisJbmV3LT5jaGFuZ2VfbGlzdFswXS5mbGFncz0wOworICAgICAgfQorICAgICAgaW5zZXJ0X0lDX2ZnKGcsZmdsaXN0W2ctPmluZGV4XSxuZXcpOworICAgICAgZmdsaXN0W2ctPmluZGV4XT1uZXc7CisgICAgICBwLT5jb2RlPUFTU0lHTjsKKyAgICAgIHAtPnR5cGY9dC0+ZmxhZ3M7CisgICAgICBwLT5xMS5mbGFncz1WQVI7CisgICAgICBwLT5xMS52PXY7CisgICAgICBwLT5xMS52YWwudm1heD1sMnptKDBMKTsKKyAgICAgIHAtPnEyLmZsYWdzPTA7CisgICAgICBwLT5xMi52YWwudm1heD1zem9mKHQpOworICAgICAgLyogIERpZSBPcGVyYXRpb24gaW4gZGVyIFNjaGxlaWZlIGJlbnV0enQgbnVuIHp1c2FldHpsaWNoICAgKi8KKyAgICAgIC8qICBub2NoIGRpZSBIaWxmc3ZhcmlhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBpZihoYXZlX2FsaWFzKXsKKwl2b2lkICptPXAtPnVzZV9saXN0OworCXAtPnVzZV9jbnQrKzsKKwlwLT51c2VfbGlzdD1teW1hbGxvYyhwLT51c2VfY250KlZMUyk7CisJbWVtY3B5KCZwLT51c2VfbGlzdFsxXSxtLChwLT51c2VfY250LTEpKlZMUyk7CisJZnJlZShtKTsKKwlwLT51c2VfbGlzdFswXS52PXY7CisJcC0+dXNlX2xpc3RbMF0uZmxhZ3M9MDsKKyAgICAgIH0KKyAgICAgIGNoYW5nZWR8PTI7CisgICAgfQorICAgIG09Zmlyc3RfbW92LT5uZXh0OworICAgIGZyZWUoZmlyc3RfbW92KTsKKyAgICBmaXJzdF9tb3Y9bTsKKyAgfQorICBpZihERUJVRyYxMDI0KSBwcmludF9mbG93Z3JhcGgoZmlyc3RfZmcpOworICBmcmVlKGZnbGlzdCk7CisgIHJldHVybiBjaGFuZ2VkOworfQordm9pZCBjYWxjX21vdmFibGUoZmxvd2dyYXBoICpzdGFydCxmbG93Z3JhcGggKmVuZCkKKy8qICBCZXJlY2huZXQsIHdlbGNoZSBEZWZpbml0aW9uZW4gbmljaHQgYXVzIGRlciBTY2hsZWlmZSBzdGFydC1lbmQgICAgICovCisvKiAgdmVyc2Nob2JlbiB3ZXJkZW4gZHVlcmZlbi4gRWluZSBEZWYuIHAgdm9uIHogZGFyZiBudXIgdmVyc2Nob2JlbiAgICAqLworLyogIHdlcmRlbiwgd2VubiBrZWluZSBhbmRlcmUgRGVmLiB2b24gcCBleGlzdGllcnQgdW5kIGFsbGUgICAgICAgICAgICAgKi8KKy8qICBWZXJ3ZW5kdW5nZW4gdm9uIHogbnVyIHZvbiBwIGVycmVpY2h0IHdlcmRlbi4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQmVudXR6dCByZF9kZWZzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBmbG93Z3JhcGggKmc7SUMgKnA7CisgIGludCBpLGosayxkOworICBidnR5cGUgKmNoYW5nZWRfdmFyczsKKyAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJjYWxjdWxhdGluZyBub3RfbW92YWJsZSBmb3IgYmxvY2tzICVkIHRvICVkXG4iLHN0YXJ0LT5pbmRleCxlbmQtPmluZGV4KTsKKyAgaWYoMC8qIShvcHRmbGFncyYxMDI0KSovKXsKKyAgICBtZW1zZXQobm90X21vdmFibGUsVUNIQVJfTUFYLGRzaXplKTsKKyAgICByZXR1cm47CisgIH0KKyAgbWVtc2V0KG5vdF9tb3ZhYmxlLDAsZHNpemUpOworICBjaGFuZ2VkX3ZhcnM9bXltYWxsb2ModnNpemUpOworICBtZW1zZXQoY2hhbmdlZF92YXJzLDAsdnNpemUpOworICBmb3IoaT0wO2k8dmNvdW50LXJjb3VudDtpKyspeworICAgIGlmKHZpbGlzdFtpXS0+dnR5cC0+ZmxhZ3MmVk9MQVRJTEUpIEJTRVQoY2hhbmdlZF92YXJzLGkpOworICAgIGlmKGk8cmNvdW50KXsKKyAgICAgIGlmKCF2aWxpc3RbaV0tPnZ0eXAtPm5leHR8fCh2aWxpc3RbaV0tPnZ0eXAtPm5leHQtPmZsYWdzJlZPTEFUSUxFKSkgQlNFVChjaGFuZ2VkX3ZhcnMsaSt2Y291bnQtcmNvdW50KTsKKyAgICB9CisgIH0KKyAgZm9yKGc9c3RhcnQ7ZztnPWctPm5vcm1hbG91dCl7CisgICAgaWYoIWctPnJkX2luKSBpZXJyb3IoMCk7CisgICAgbWVtY3B5KHJkX2RlZnMsZy0+cmRfaW4sZHNpemUpOworICAgIGZvcihwPWctPnN0YXJ0O3A7cD1wLT5uZXh0KXsKKyAgICAgIGZvcihqPTA7ajxwLT5jaGFuZ2VfY250O2orKyl7CisJaT1wLT5jaGFuZ2VfbGlzdFtqXS52LT5pbmRleDsKKwlpZihwLT5jaGFuZ2VfbGlzdFtqXS5mbGFncyZEUkVGT0JKKSBpKz12Y291bnQtcmNvdW50OworCWlmKGk+PXZjb3VudCkgY29udGludWU7CisJaWYoQlRTVChjaGFuZ2VkX3ZhcnMsaSl8fGlzX3ZvbGF0aWxlX2ljKHApKXsKKwkgIGJ2dW5pdGUobm90X21vdmFibGUsdmFyX2RlZnNbaV0sZHNpemUpOworCX1lbHNleworCSAgQlNFVChjaGFuZ2VkX3ZhcnMsaSk7CisJfQorICAgICAgfQorICAgICAgZm9yKGs9MDtrPHAtPnVzZV9jbnQ7aysrKXsKKwlpPXAtPnVzZV9saXN0W2tdLnYtPmluZGV4OworCWlmKHAtPnVzZV9saXN0W2tdLmZsYWdzJkRSRUZPQkopIGkrPXZjb3VudC1yY291bnQ7CisJaWYoaT49dmNvdW50KSBjb250aW51ZTsKKwlmb3IoZD0tMSxqPTE7ajw9ZGNvdW50O2orKyl7CisJICBpZihCVFNUKHJkX2RlZnMsaikmJkJUU1QodmFyX2RlZnNbaV0saikpeworCSAgICBpZihkPj0wKXsgIC8qICBtZWhyIGFscyBlaW5lIERlZi4gICovCisJICAgICAgYnZ1bml0ZShub3RfbW92YWJsZSx2YXJfZGVmc1tpXSxkc2l6ZSk7CisJICAgICAgZD0tMTticmVhazsKKwkgICAgfWVsc2UgZD1qOworCSAgfQorCSAgaWYoQlRTVChyZF9kZWZzLFVOREVGKGopKSYmQlRTVCh2YXJfZGVmc1tpXSxVTkRFRihqKSkpeworCSAgICBidnVuaXRlKG5vdF9tb3ZhYmxlLHZhcl9kZWZzW2ldLGRzaXplKTsKKwkgICAgZD0tMTticmVhazsKKwkgIH0KKwl9CisgICAgICB9CisgICAgICAvKiAgRGFzIGhpZXIsIHVtIHJkX2RlZnMgenUgYWt0dWFsaXNpZXJlbi4gICovCisgICAgICByZF9jaGFuZ2UocCk7CisgICAgICBpZihwPT1nLT5lbmQpIGJyZWFrOworICAgIH0KKyAgICBpZihnPT1lbmQpIGJyZWFrOworICB9CisgIGZyZWUoY2hhbmdlZF92YXJzKTsKK30KKy8qICBUZXN0ZXQsIG9iIFZhcmlhYmxlIG51ciBpbiBkZXIgU2NobGVpZmUgYmVudXR6dCB3aXJkLiAgICAgICAgICAgICAgICovCisvKiBjb3VsZCBiZSBpbXByb3ZlZCAqLworaW50IHVzZWRfaW5fbG9vcF9vbmx5KGZsb3dncmFwaCAqc3RhcnQsZmxvd2dyYXBoICplbmQsb2JqICpvKQoreworICBWYXIgKnY7Zmxvd2dyYXBoICpnO0lDICpwOworICBpZigoby0+ZmxhZ3MmKFZBUnxEUkVGT0JKKSkhPVZBUikgcmV0dXJuIDA7CisgIHY9by0+djsKKyAgaWYoKHYtPmZsYWdzJlVTRURBU0FEUil8fHYtPm5lc3Rpbmc9PTB8fHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTnx8di0+c3RvcmFnZV9jbGFzcz09U1RBVElDKQorICAgIHJldHVybiAwOworICBmb3IoZz1maXJzdF9mZztnO2c9Zy0+bm9ybWFsb3V0KXsKKyAgICBpZihnPT1zdGFydCkgZz1lbmQtPm5vcm1hbG91dDsKKyAgICBpZighZykgYnJlYWs7CisgICAgZm9yKHA9Zy0+c3RhcnQ7cDtwPXAtPm5leHQpeworICAgICAgaWYoKHAtPnExLmZsYWdzJlZBUikmJnAtPnExLnY9PXYpIHJldHVybiAwOworICAgICAgaWYoKHAtPnEyLmZsYWdzJlZBUikmJnAtPnEyLnY9PXYpIHJldHVybiAwOworICAgICAgaWYoKHAtPnouZmxhZ3MmVkFSKSYmcC0+ei52PT12KSByZXR1cm4gMDsKKyAgICAgIGlmKHA9PWctPmVuZCkgYnJlYWs7CisgICAgfQorICAgIGlmKGc9PWVuZCkgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qICBUZXN0ZXQsIG9iIHogaW1tZXIgYXVzZ2VmdWVocnQgd2lyZCwgZmFsbHMgc3RhcnQgaW4gZmcgYXVzZ2VmdWVocnQgICovCisvKiAgd2lyZC4gZmdfdG1wIGlzdCBlaW4gQml0dmVrdG9yLCB1bSB6dSBtZXJrZW4sIHdlbGNoZSBCbG9lY2tlIHNpY2hlciAqLworLyogIHp1IHogZnVlaHJlbi4gRGFzIGdhbnplIGZ1ZXIgZGllIFNjaGxlaWZlIHN0YXJ0LWVuZC4gICAgICAgICAgICAgICAgKi8KKy8qICBXZW5uIGlnbm9yZWNhbGwhPTAgaXN0LCB3aXJkIGFuZ2Vub21tZW4sIGRhc3MgamVkZXIgQ0FMTCAgICAgICAgICAgICovCisvKiAgenVydWVja2tlaHJ0IChkYXMgaXN0IG51ZXR6bGljaCBmdWVyIGxvb3AtdW5yb2xsaW5nKS4gICAgICAgICAgICAgICAqLworaW50IGFsd2F5c19yZWFjaGVkKGZsb3dncmFwaCAqc3RhcnQsZmxvd2dyYXBoICplbmQsZmxvd2dyYXBoICpmZyxJQyAqeixpbnQgaWdub3JlY2FsbCkKK3sKKyAgYnZ0eXBlICpibWs9ZmdfdG1wOworICBJQyAqcDtmbG93Z3JhcGggKmc7CisgIGludCBjaGFuZ2VkOworICAKKyAgZm9yKHA9ejtwO3A9cC0+cHJldil7CisgICAgaWYoIWlnbm9yZWNhbGwmJnAtPmNvZGU9PUNBTEwpIHJldHVybiAwOworICAgIGlmKHA9PWZnLT5zdGFydCkgYnJlYWs7CisgIH0KKyAgCisgIGlmKGZnPT1zdGFydCkgcmV0dXJuIDE7CisgIAorICBtZW1zZXQoYm1rLDAsYnNpemUpOworICBCU0VUKGJtayxmZy0+aW5kZXgpOworICAKKyAgZG97CisgICAgY2hhbmdlZD0wOworICAgIGZvcihnPXN0YXJ0O2c7Zz1nLT5ub3JtYWxvdXQpeworICAgICAgaWYoIUJUU1QoYm1rLGctPmluZGV4KSl7CisJZmxvd2dyYXBoICpuPWctPm5vcm1hbG91dDsKKwlmbG93Z3JhcGggKmI9Zy0+YnJhbmNob3V0OworCWlmKG58fGIpeworCSAgaWYoKCFifHxCVFNUKGJtayxiLT5pbmRleCkpJiYKKwkgICAgICghbnx8KGctPmVuZCYmZy0+ZW5kLT5jb2RlPT1CUkEpfHxCVFNUKGJtayxuLT5pbmRleCkpKXsKKwkgICAgZm9yKHA9Zy0+ZW5kO3A7cD1wLT5wcmV2KXsKKwkgICAgICBpZighaWdub3JlY2FsbCYmcC0+Y29kZT09Q0FMTCkgYnJlYWs7CisJICAgICAgaWYocD09Zy0+c3RhcnQpeworCQlpZihnPT1zdGFydCkgcmV0dXJuIDE7CisJCWNoYW5nZWQ9MTsgQlNFVChibWssZy0+aW5kZXgpOworCQlicmVhazsKKwkgICAgICB9CisJICAgIH0KKwkgIH0KKwl9CisgICAgICB9CisgICAgICBpZihnPT1lbmQpIGJyZWFrOworICAgIH0KKyAgfXdoaWxlKGNoYW5nZWQpOworICByZXR1cm4gMDsKK30KKworLyogIEVybWl0dGVsdCwgb2IgVmFyaWFibGUgdmluZGV4IHNjaGxlaWZlbmludmFyaWFudCB1bnRlciBkZW4gQmVkaW5ndW5nZW4gICovCisvKiAgcmRfZGVmcywgaW5sb29wIHVuZCBpbnZhcmlhbnQgaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEZWZpbml0aW9uIGlnbm9yZSB3aXJkIG5pY2h0IGJlYWNodGV0LiBXZW5uIGlnbm9yZSBhdWYgZWluZSBndWVsdGlnZSAgICAqLworLyogIERlZmluaXRpb24gZ2VzZXR6dCB3aXJkLCBrYW5uIG1hbiBzb21pdCBhdWYgSW5kdWt0aW9uc3ZhcmlhYmxlbiB0ZXN0ZW4gICovCisvKiAgKGRhcyBFcmdlYm5pcyBzYWd0IGRhbm4sIG9iIGRhcyBkaWUgZWluemlnZSBEZWZpbml0aW9uIGluIGRlciBTY2hsZWlmZSAgKi8KKy8qICBpc3QpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworaW50IGRlZl9pbnZhcmlhbnQoaW50IHZpbmRleCxpbnQgaWdub3JlKQoreworICBpbnQgaSxrLGosZD0wOworICAvKnByaW50ZigiZGVmX2ludiglZCk9JXMoJWxkKVxuIix2aW5kZXgsdmlsaXN0W3ZpbmRleF0tPmlkZW50aWZpZXIsem0ybCh2aWxpc3RbdmluZGV4XS0+b2Zmc2V0KSk7Ki8KKyAgZm9yKGo9MTtqPD1kY291bnQ7aisrKXsKKyAgICBpZihqIT1pZ25vcmUmJkJUU1QocmRfZGVmcyxqKSl7CisgICAgICBpZihCVFNUKHZhcl9kZWZzW3ZpbmRleF0saikmJkJUU1QoaW5sb29wLGopKXsKKwkvKiAgTWVociBhbHMgZWluZSBtb2VnbGljaGUgRGVmLiBpbm5lcmhhbGIgZGVyIFNjaGxlaWZlIG9kZXIgICAgKi8KKwkvKiAgZWluZSBpbnZhcmlhbnRlIERlZi4gaW4gZGVyIFNjaGxlaWZlID0+IG5pY2h0IGludmFyaWFudC4gICAgKi8KKwlpZihkKSByZXR1cm4gMDsKKwlpZighQlRTVChtb3ZlZF9jb21wbGV0ZWx5LGopKSByZXR1cm4gMDsKKwlkPTE7CisgICAgICB9CisgICAgfSAgCisgICAgaWYoQlRTVChyZF9kZWZzLFVOREVGKGopKSl7CisgICAgICBpZihCVFNUKHZhcl9kZWZzW3ZpbmRleF0sVU5ERUYoaikpJiZCVFNUKGlubG9vcCxVTkRFRihqKSkpeworCS8qICBNZWhyIGFscyBlaW5lIG1vZWdsaWNoZSBEZWYuIGlubmVyaGFsYiBkZXIgU2NobGVpZmUgb2RlciAgICAqLworCS8qICBlaW5lIGludmFyaWFudGUgRGVmLiBpbiBkZXIgU2NobGVpZmUgPT4gbmljaHQgaW52YXJpYW50LiAgICAqLworCWlmKGQpIHJldHVybiAwOworCWlmKCFCVFNUKG1vdmVkX2NvbXBsZXRlbHksVU5ERUYoaikpKSByZXR1cm4gMDsKKwlkPTE7CisgICAgICB9CisgICAgfSAgICAgIAorICB9CisgIHJldHVybiAxOworI2lmIDAKKyAgaWYoIUJUU1QocmRfZGVmcyx2aW5kZXgrZGNvdW50KzEpKXsKKyAgICBtZW1jcHkocmRfdG1wLHJkX2RlZnMsZHNpemUpOworICAgIGJ2aW50ZXJzZWN0KHJkX3RtcCx2YXJfZGVmc1t2aW5kZXhdLGRzaXplKTsKKyAgICBmb3Ioaj0xO2o8PWRjb3VudDtqKyspeworICAgICAgaWYoaiE9aWdub3JlJiZCVFNUKHJkX3RtcCxqKSYmQlRTVChpbmxvb3AsaikpeworCS8qICBNZWhyIGFscyBlaW5lIG1vZWdsaWNoZSBEZWYuIGlubmVyaGFsYiBkZXIgU2NobGVpZmUgb2RlciAgICAqLworCS8qICBlaW5lIGludmFyaWFudGUgRGVmLiBpbiBkZXIgU2NobGVpZmUgPT4gbmljaHQgaW52YXJpYW50LiAgICAqLworCWlmKGQpIHJldHVybiAwOworCWlmKCFCVFNUKG1vdmVkX2NvbXBsZXRlbHksaikpIHJldHVybiAwOworCWQ9MTsKKyAgICAgIH0KKyAgICB9CisgIH1lbHNleworICAgIGZvcihqPTE7ajw9ZGNvdW50O2orKyl7CisgICAgICBpZihqIT1pZ25vcmUmJkJUU1QocmRfZGVmcyxqKSYmQlRTVChpbmxvb3AsaikpeworCUlDICpwPWRsaXN0W2pdOworCWZvcihrPTA7azxwLT5jaGFuZ2VfY250O2srKyl7CisJICBpPXAtPmNoYW5nZV9saXN0W2tdLnYtPmluZGV4OworCSAgaWYocC0+Y2hhbmdlX2xpc3Rba10uZmxhZ3MmRFJFRk9CSikgaSs9dmNvdW50LXJjb3VudDsKKwkgIGlmKGk9PXZpbmRleCkgYnJlYWs7CisJfQorCWlmKGs+PXAtPmNoYW5nZV9jbnQpIGNvbnRpbnVlOworCS8qICBNZWhyIGFscyBlaW5lIG1vZWdsaWNoZSBEZWYuIGlubmVyaGFsYiBkZXIgU2NobGVpZmUgb2RlciAgICAqLworCS8qICBlaW5lIGludmFyaWFudGUgRGVmLiBpbiBkZXIgU2NobGVpZmUgPT4gbmljaHQgaW52YXJpYW50LiAgICAqLworCWlmKGQpIHJldHVybiAwOworCWlmKCFCVFNUKG1vdmVkX2NvbXBsZXRlbHksaikpIHJldHVybiAwOworCWQ9MTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7CisjZW5kaWYKK30KKwordm9pZCBmcmVxdWVuY3lfcmVkdWN0aW9uKGZsb3dncmFwaCAqc3RhcnQsZmxvd2dyYXBoICplbmQsZmxvd2dyYXBoICpoZWFkKQorLyogIFNjaGxlaWZlbmludmFyaWFudGUgSUNzIGZpbmRlbiB1bmQgaW4gZWluZSBMaXN0ZSBlaW50cmFnZW4sIGZhbGxzICAgKi8KKy8qICBzaWUgdm9yIGRpZSBTY2hsZWlmZSBnZXpvZ2VuIHdlcmRlbiBrb2VubmVuLiAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIElDICpwO2Zsb3dncmFwaCAqZzsKKyAgaW50IGksY2hhbmdlZDsKKworICBpZihoZWFkJiZzdGFydC0+bG9vcGVuZCl7CisgICAgZW5kPXN0YXJ0LT5sb29wZW5kOworCisgICAgaWYoREVCVUcmMTAyNCl7CisgICAgICBwcmludGYoInNlYXJjaGluZyBmb3IgbG9vcC1pbnZhcmlhbnQgY29kZSBpbiBsb29wIGZyb20gYmxvY2sgJWQgdG8gJWRcbiIsc3RhcnQtPmluZGV4LGVuZC0+aW5kZXgpOworICAgICAgcHJpbnRmKCJoZWFkX2ZnPSVkXG4iLGhlYWQtPmluZGV4KTsKKyAgICB9CisgICAgY2FsY19tb3ZhYmxlKHN0YXJ0LGVuZCk7CisgICAgLyogIGVyc3RtYWwga2VpbiBJQyBpbnZhcmlhbnQgICAqLworICAgIG1lbXNldChpbnZhcmlhbnQsMCxkc2l6ZSk7CisKKyAgICAvKiAga2VubnplaWNobmVuLCB3ZWxjaGUgSUNzIGluIGRlciBTY2hsZWlmZSBsaWVnZW4gKi8KKyAgICBtZW1zZXQoaW5sb29wLDAsZHNpemUpOworICAgIGZvcihnPXN0YXJ0O2c7Zz1nLT5ub3JtYWxvdXQpeworICAgICAgZm9yKHA9Zy0+c3RhcnQ7cDtwPXAtPm5leHQpeworCWlmKHAtPmRlZmluZGV4KSBCU0VUKGlubG9vcCxwLT5kZWZpbmRleCk7CisJaWYocD09Zy0+ZW5kKSBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmKGc9PWVuZCkgYnJlYWs7CisgICAgfQorCisgICAgZG97CisgICAgICBjaGFuZ2VkPTA7CisgICAgICBpZihERUJVRyYxMDI0KSBwcmludGYoImxvb3AtaW52YXJpYW50IHBhc3NcbiIpOworCisgICAgICAvKiAgU2NobGVpZmVuaW52YXJpYW50ZSBJQ3Mgc3VjaGVuICAqLworCisgICAgICBmb3IoZz1zdGFydDtnO2c9Zy0+bm9ybWFsb3V0KXsKKwltZW1jcHkocmRfZGVmcyxnLT5yZF9pbixkc2l6ZSk7CisJZm9yKHA9Zy0+c3RhcnQ7cDtwPXAtPm5leHQpeworCSAgaW50IGsxLGsyOworCSAgLyogIHRlc3Rlbiwgb2IgSUMgbmV1IGFscyBpbnZhcmlhbnQgbWFya2llcnQgd2VyZGVuIGthbm4gICAgKi8KKwkgIGlmKHAtPmRlZmluZGV4JiZwLT5jb2RlIT1DQUxMJiZwLT5jb2RlIT1HRVRSRVRVUk4mJiFCVFNUKGludmFyaWFudCxwLT5kZWZpbmRleCkpeworCSAgICBpZighQlRTVChpbmxvb3AscC0+ZGVmaW5kZXgpKSBpZXJyb3IoMCk7CisJICAgIGlmKHAtPmNvZGU9PUFERFJFU1N8fCFwLT5xMS5mbGFnc3x8KHAtPnExLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUfHwocC0+cTEuZmxhZ3MmVkFSQURSKSl7CisJICAgICAgazE9MTsKKwkgICAgfWVsc2V7CisJICAgICAgaWYoIShwLT5xMS5mbGFncyZWQVIpKXsKKwkJazE9MDsKKwkgICAgICB9ZWxzZXsKKwkJaT1wLT5xMS52LT5pbmRleDsKKwkJaWYocC0+cTEuZmxhZ3MmRFJFRk9CSil7CisJCSAgaSs9dmNvdW50LXJjb3VudDsKKwkJICBpZihwLT5xMS5kdHlwJihWT0xBVElMRXxQVk9MQVRJTEUpKQorCQkgICAgazE9MDsKKwkJICBlbHNlCisJCSAgICBrMT1kZWZfaW52YXJpYW50KGksLTEpOworCQl9ZWxzZQorCQkgIGsxPWRlZl9pbnZhcmlhbnQoaSwtMSk7CisJICAgICAgfQorCSAgICB9CisJICAgIGlmKGsxKXsKKwkgICAgICBpZighcC0+cTIuZmxhZ3N8fChwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVHx8KHAtPnEyLmZsYWdzJlZBUkFEUikpeworCQlrMj0xOworCSAgICAgIH1lbHNleworCQlpZighKHAtPnEyLmZsYWdzJlZBUikpeworCQkgIGsyPTA7CisJCX1lbHNleworCQkgIGk9cC0+cTIudi0+aW5kZXg7CisJCSAgaWYocC0+cTIuZmxhZ3MmRFJFRk9CSil7CisJCSAgICBpKz12Y291bnQtcmNvdW50OworCQkgICAgaWYocC0+cTIuZHR5cCYoVk9MQVRJTEV8UFZPTEFUSUxFKSkKKwkJICAgICAgazI9MDsKKwkJICAgIGVsc2UKKwkJICAgICAgazI9ZGVmX2ludmFyaWFudChpLC0xKTsKKwkJICB9ZWxzZQorCQkgICAgazI9ZGVmX2ludmFyaWFudChpLC0xKTsKKwkJfQorCSAgICAgIH0KKwkgICAgfQorCSAgICBpZihrMSYmazImJiEoenR5cChwKSZWT0xBVElMRSkmJiEocTF0eXAocCkmVk9MQVRJTEUpKXsKKwkgICAgICBpZihERUJVRyYxMDI0KXsgcHJpbnRmKCJmb3VuZCBsb29wLWludmFyaWFudCBJQzpcbiIpO3ByaWMyKHN0ZG91dCxwKTt9CisJICAgICAgaWYoIUJUU1QobW92ZWQscC0+ZGVmaW5kZXgpJiYoYWx3YXlzX3JlYWNoZWQoc3RhcnQsZW5kLGcscCwwKXx8KCFkYW5nZXJvdXNfSUMocCkmJnVzZWRfaW5fbG9vcF9vbmx5KHN0YXJ0LGVuZCwmcC0+eikpKSl7CisJCWlmKHAtPnouZmxhZ3MmRFJFRk9CSil7CisJCSAgaWYocC0+ei5mbGFncyZLT05TVCkKKwkJICAgIGsxPTA7CisJCSAgZWxzZQorCQkgICAgazE9ZGVmX2ludmFyaWFudChwLT56LnYtPmluZGV4LC0xKTsKKwkJfWVsc2UKKwkJICBrMT0xOworCQkvKmlmKERFQlVHJjEwMjQpIHByaW50ZigiYWx3YXlzIHJlYWNoZWQgb3IgdXNlZCBvbmx5IGluIGxvb3BcbiIpOyovCisJCWlmKGsxJiYhQlRTVChub3RfbW92YWJsZSxwLT5kZWZpbmRleCkmJiEoenR5cChwKSZWT0xBVElMRSkmJighKHAtPnouZmxhZ3MmVkFSKXx8IXAtPnoudi0+cmVnKSl7CisJCSAgLyppZihERUJVRyYxMDI0KSBwcmludGYoIm1vdmFibGVcbiIpOyovCisJCSAgYWRkX21vdmFibGUocCxoZWFkLE1PVkVfSUMpOworCQl9ZWxzZXsKKwkJICBpZihwLT5jb2RlPT1BRERSRVNTfHwoSVNTQ0FMQVIocC0+dHlwZikmJihwLT5xMi5mbGFnc3x8KHAtPnExLmZsYWdzJkRSRUZPQkopKSkpeworCQkgICAgLyppZihERUJVRyYxMDI0KSBwcmludGYoIm1vdmUgY29tcHV0YXRpb24gb3V0IG9mIGxvb3BcbiIpOyovCisJCSAgICBpZighKGRpc2FibGUmMjU2KSkKKwkJICAgICAgYWRkX21vdmFibGUocCxoZWFkLE1PVkVfQ09NUCk7CisJCSAgfQorCQl9CisJICAgICAgfWVsc2V7CisJCS8qICBXZW5uIElDIGltbWVyIGVycmVpY2h0IHdpcmQgb2RlciB1bmdlZmFlaHJsaWNoICAqLworCQkvKiAgaXN0LCBrYW5uIG1hbiB6dW1pbmRlc3QgZGllIE9wZXJhdGlvbiAgICAgICAgICAgKi8KKwkJLyogIHJhdXN6aWVoZW4sIGZhbGxzIGRhcyBsb2hudC4gICAgICAgICAgICAgICAgICAgICovCisJCWlmKCFCVFNUKG1vdmVkLHAtPmRlZmluZGV4KSYmKCFkYW5nZXJvdXNfSUMocCkmJklTU0NBTEFSKHAtPnR5cGYpJiYocC0+cTIuZmxhZ3N8fChwLT5xMS5mbGFncyZEUkVGT0JKKXx8cC0+Y29kZT09QUREUkVTUykpKXsKKwkJICAvKmlmKERFQlVHJjEwMjQpIHByaW50ZigibW92ZSBjb21wdXRhdGlvbiBvdXQgb2YgbG9vcFxuIik7Ki8KKwkJICBpZighKGRpc2FibGUmMjU2KSkKKwkJICAgIGFkZF9tb3ZhYmxlKHAsaGVhZCxNT1ZFX0NPTVApOworCQl9CisJICAgICAgfQorCSAgICAgIEJTRVQoaW52YXJpYW50LHAtPmRlZmluZGV4KTsKKwkgICAgICBjaGFuZ2VkPTE7CisJICAgIH0KKwkgIH0KKworCSAgLyogIERhcyBoaWVyLCB1bSByZF9kZWZzIHp1IGFrdHVhbGlzaWVyZW4uICAqLworCSAgcmRfY2hhbmdlKHApOworCisJICBpZihwPT1nLT5lbmQpIGJyZWFrOworCX0KKwlpZihnPT1lbmQpIGJyZWFrOworICAgICAgfQorICAgIH13aGlsZShjaGFuZ2VkKTsKKworICB9CisgIHJldHVybjsKK30KK3ZvaWQgYWRkX3NyKElDICpwLGZsb3dncmFwaCAqZmcsaW50IGlfdmFyKQorLyogIEZ1ZWd0IElDIHAsIGRhcyBhdXMgZGVyIFNjaGxlaWZlIGluIEJsb2NrIGZnIGxpbmVhcmUgRmt0LiBkZXIgICAqLworLyogIEluZHVrdGlvbnN2YXJpYWJsZSBpX3ZhciBpc3QsIGluIExpc3RlIGVpbi4gICAgICAgICAgICAgICAgICAgICAqLworLyogIEZ1bmt0aW9uaWVydCBhbHMgU3RhY2suIERhIG1pdCBhZXVzc2VyZW4gU2NobGVpZmVuIGFuZ2VmYW5nZW4gICAqLworLyogIHdpcmQsIHdlcmRlbiBJQ3MgenVlcnN0IGluIGlubmVyZW4gU2NobGVpZmVuIHJlZHV6aWVydC4gRGEgZWluICAqLworLyogIElDIG51ciBlaW5tYWwgcmVkdXppZXJ0IHdpcmQsIHNvbGx0ZSBkYWR1cmNoIGRhcyBQcm9ibGVtIGVpbmVzICAqLworLyogIElDcywgZGFzIHBvdGVudGllbGwgaW4gbWVocmVyZW4gU2NobGVpZmVuIHJlZHV6aWVydCB3ZXJkZW4gICAgICAqLworLyogIGtvZW5udGUsIGdlbG9lc3Qgd2VyZGVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBzcmxpc3QgKm5ldz1teW1hbGxvYyhzaXplb2YoKm5ldykpOworICBpZihERUJVRyYxMDI0KSBwcmludGYoImFsbDolcFxuIiwodm9pZCopbmV3KTsKKyAgbmV3LT5JQz1wOworICBuZXctPnRhcmdldF9mZz1mZzsKKyAgbmV3LT5pbmRfdmFyPWluZF92YXJzW2lfdmFyXTsKKyAgbmV3LT5uZXh0PWZpcnN0X3NyOworICBuZXctPmh2PTA7CisgIGZpcnN0X3NyPW5ldzsKKyNpZiAwCisgIGlmKGxhc3Rfc3IpeworICAgIGxhc3Rfc3ItPm5leHQ9bmV3OworICAgIGxhc3Rfc3I9bmV3OworICB9ZWxzZXsKKyAgICBmaXJzdF9zcj1sYXN0X3NyPW5ldzsKKyAgfQorI2VuZGlmCit9CitpbnQgZG9fc3IoaW50IGRvbm90aGluZykKKy8qICBEdXJjaGxhdWZlIGRpZSBMaXN0ZSBhbGxlciBzdHJlbmd0aC1yZWR1Y3Rpb24tS2FuZGlkYXRlbiB1bmQgICAgKi8KKy8qICBlcnNldHplIHNpZSBkdXJjaCBuZXVlIEluZHVrdGlvbnN2YXJpYWJsZW4uIERhYmVpIGF1ZnBhc3NlbiwgICAgKi8KKy8qICBmYWxscyBlaW4gSUMgc2Nob24gdm9uIGZyZXF1ZW5jeS1yZWR1Y3Rpb24gYmVhcmJlaXRldCB3dXJkZS4gICAgKi8KKy8qICBBdXNzZXJkZW0gd2lyZCBkaWUgTGlzdGUgZnJlaWdlZ2ViZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgSUMgKipmZ2xpc3Q7IC8qIExldHp0ZXMgSUMgdm9yIGplZGVtIEJsb2NrICAgKi8KKyAgSUMgKnA7CisgIGZsb3dncmFwaCAqZzsKKyAgc3JsaXN0ICptZjsKKyAgaW50IGNoYW5nZWQ9MDsKKworICBpZighZmlyc3Rfc3IpIHJldHVybiAwOworCisgIGlmKERFQlVHJjEwMjQpIHByaW50ZigicGVyZm9ybWluZyBzdHJlbmd0aC1yZWR1Y3Rpb25zXG4iKTsKKworICBmZ2xpc3Q9bXltYWxsb2MoKGJhc2ljX2Jsb2NrcysxKSpzaXplb2YoKmZnbGlzdCkpOworICBwPTA7CisgIGZvcihnPWZpcnN0X2ZnO2c7Zz1nLT5ub3JtYWxvdXQpeworICAgIGlmKGctPmluZGV4PmJhc2ljX2Jsb2NrcykgaWVycm9yKDApOworICAgIGlmKGctPmVuZCkgcD1nLT5lbmQ7CisgICAgZmdsaXN0W2ctPmluZGV4XT1wOworICB9CisKKyAgd2hpbGUoZmlyc3Rfc3IpeworICAgIFZhciAqbml2LCpuc3RlcDsKKyAgICB0eXBlICp0MSwqdDI7CisgICAgSUMgKml2X2ljLCpuZXcsKm07CisgICAgaW50IGksYzsKKyAgICBwPWZpcnN0X3NyLT5JQzsKKyAgICBpPXAtPmRlZmluZGV4OworICAgIC8qICBGYWxscyBJQyBub2NoIG5pY2h0IHZlcnNjaG9iZW4gdW5kIG5vY2ggbmljaHQgcmVkdXppZXJ0IHd1cmRlLiAgKi8KKyAgICBpZighZG9ub3RoaW5nJiYhQlRTVChtb3ZlZCxpKSYmcC0+Y29kZSE9QVNTSUdOKXsKKyAgICAgIGlmKGZpcnN0X3NyLT5odil7CisJLyogIEVzIHd1cmRlIHNjaG9uIGVpbmUgYWVxdWl2YWxlbnRlIE9wZXJhdGlvbiByZWR1emllcnQsIHdpciAgICovCisJLyogIGtvZW5uZW4gYWxzbyBkaWVzZWxiZSBIaWxmc3ZhcmlhYmxlIGJlbnV0emVuLiAgICAgICAgICAgICAgICovCisJcC0+Y29kZT1BU1NJR047CisJcC0+cTEuZmxhZ3M9VkFSOworCXAtPnExLnY9Zmlyc3Rfc3ItPmh2OworCXAtPnExLnZhbC52bWF4PWwyem0oMEwpOworCXAtPnEyLmZsYWdzPTA7CisJcC0+cTIudmFsLnZtYXg9c3pvZihwLT56LnYtPnZ0eXApOworICAgICAgICBwLT50eXBmPXAtPnoudi0+dnR5cC0+ZmxhZ3M7CisJLyogIEhpbGZzdmFyaWFibGUgd2lyZCBqZXR6dCBhdWNoIGJlbnV0enQuICAqLworCWlmKGhhdmVfYWxpYXMpeworCSAgdm9pZCAqbT1wLT51c2VfbGlzdDsKKwkgIHAtPnVzZV9jbnQrKzsKKwkgIHAtPnVzZV9saXN0PW15bWFsbG9jKHAtPnVzZV9jbnQqVkxTKTsKKwkgIG1lbWNweSgmcC0+dXNlX2xpc3RbMV0sbSwocC0+dXNlX2NudC0xKSpWTFMpOworCSAgZnJlZShtKTsKKwkgIHAtPnVzZV9saXN0WzBdLnY9Zmlyc3Rfc3ItPmh2OworCSAgcC0+dXNlX2xpc3RbMF0uZmxhZ3M9MDsKKwl9CisgICAgICB9ZWxzZXsKKwlpbnQgbWludXM9MCxxMXQscTJ0OworCWlmKERFQlVHJjEwMjQpeyBwcmludGYoInBlcmZvcm1pbmcgc3RyZW5ndGgtcmVkdWN0aW9uIG9uIElDOlxuIik7cHJpYzIoc3Rkb3V0LHApO30KKwljPXAtPmNvZGU7CisJZz1maXJzdF9zci0+dGFyZ2V0X2ZnOworCWl2X2ljPWZpcnN0X3NyLT5pbmRfdmFyOworCS8qICBNZXJrZW4sIHdlbm4gSUMgdm9uIGRlciBGb3JtIFNVQiB4LGluZF92YXItPnogICAqLworCWlmKChjPT1TVUJ8fGM9PVNVQklGUCkmJiFjb21wYXJlX29ianMoJnAtPnEyLCZpdl9pYy0+eixpdl9pYy0+dHlwZikpCisJICBtaW51cz0xOworCXQxPW5ld190eXAoKTsKKwl0MS0+ZmxhZ3M9cC0+dHlwZjsKKwlpZihjPT1BRERJMlB8fGM9PVNVQklGUCl7CisJICB0MS0+ZmxhZ3M9cC0+dHlwZjI7CisJICB0MS0+bmV4dD1uZXdfdHlwKCk7CisJICB0MS0+bmV4dC0+ZmxhZ3M9Vk9JRDsKKwl9CisJbml2PWFkZF90bXBfdmFyKHQxKTsKKwkvKiAgU3VjaGVuLCBvYiBlcyBub2NoIGFlcXVpdmFsZW50ZSBPcGVyYXRpb25lbiBnaWJ0LiAgICovCisJLyogIE5vY2ggc2VociBpbmVmZml6aWVudC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXExdD1xMXR5cChwKTtxMnQ9cTJ0eXAocCk7CisJZm9yKG1mPWZpcnN0X3NyLT5uZXh0O21mO21mPW1mLT5uZXh0KXsKKwkgIGlmKG1mLT50YXJnZXRfZmc9PWcmJm1mLT5pbmRfdmFyPT1pdl9pYyl7CisJICAgIG09bWYtPklDOworCSAgICBpZihjPT1tLT5jb2RlJiZwLT50eXBmPT1tLT50eXBmJiYKKwkgICAgICAgIWNvbXBhcmVfb2JqcygmcC0+cTEsJm0tPnExLHExdCkmJgorCSAgICAgICAhY29tcGFyZV9vYmpzKCZwLT5xMiwmbS0+cTIscTJ0KSl7CisJICAgICAgaWYobWYtPmh2KSBpZXJyb3IoMCk7CisJICAgICAgbWYtPmh2PW5pdjsKKwkgICAgICBpZihERUJVRyYxMDI0KXsgcHJpbnRmKCJlcXVpdmFsZW50IG9wZXJhdGlvblxuIik7cHJpYzIoc3Rkb3V0LG0pO30KKwkgICAgfQorCSAgfQorCX0KKwkvKiAgSW5pdGlhbGlzaWVydW5nIGRlciBIaWxmc2luZHVrdGlvbnN2YXJpYWJsZW4gICAgKi8KKwluZXc9bmV3X0lDKCk7CisJKm5ldz0qcDsKKwluZXctPnouZmxhZ3M9VkFSOworCW5ldy0+ei52PW5pdjsKKwluZXctPnoudmFsLnZtYXg9bDJ6bSgwTCk7CisJLyogIElDIGJlbnV0enQgZGFzc2VsYmUgd2llIHAgdW5kIGFlbmRlcnQgbnVyIG5pdi4gICovCisJaWYoaGF2ZV9hbGlhcyl7CisJICBuZXctPmNoYW5nZV9jbnQ9MTsKKwkgIG5ldy0+Y2hhbmdlX2xpc3Q9bXltYWxsb2MoVkxTKTsKKwkgIG5ldy0+Y2hhbmdlX2xpc3RbMF0udj1uaXY7CisJICBuZXctPmNoYW5nZV9saXN0WzBdLmZsYWdzPTA7CisJICBuZXctPnVzZV9jbnQ9cC0+dXNlX2NudDsKKwkgIG5ldy0+dXNlX2xpc3Q9bXltYWxsb2MobmV3LT51c2VfY250KlZMUyk7CisJICBtZW1jcHkobmV3LT51c2VfbGlzdCxwLT51c2VfbGlzdCxuZXctPnVzZV9jbnQqVkxTKTsKKwl9CisJaW5zZXJ0X0lDX2ZnKGcsZmdsaXN0W2ctPmluZGV4XSxuZXcpOworCWZnbGlzdFtnLT5pbmRleF09bT1uZXc7CisJLyogIEVyc2V0emVuIGRlciBPcGVyYXRpb24gZHVyY2ggZGllIEhpbGZzdmFyaWFibGUgICovCisJcC0+Y29kZT1BU1NJR047CisJcC0+dHlwZj10MS0+ZmxhZ3M7CisJcC0+cTE9bS0+ejsKKwlwLT5xMi5mbGFncz0wOworCXAtPnEyLnZhbC52bWF4PXN6b2YodDEpOworCS8qICBCZW51dHp0IGpldHp0IGF1Y2ggSGlsZnN2YXJpYWJsZS4gICAgICAgICAgICAgICAqLworCWlmKGhhdmVfYWxpYXMpeworCSAgdm9pZCAqbXI9cC0+dXNlX2xpc3Q7CisJICBwLT51c2VfY250Kys7CisJICBwLT51c2VfbGlzdD1teW1hbGxvYyhwLT51c2VfY250KlZMUyk7CisJICBtZW1jcHkoJnAtPnVzZV9saXN0WzFdLG1yLChwLT51c2VfY250LTEpKlZMUyk7CisJICBmcmVlKG1yKTsKKwkgIHAtPnVzZV9saXN0WzBdLnY9bml2OworCSAgcC0+dXNlX2xpc3RbMF0uZmxhZ3M9MDsKKwl9CisJLyogIEJlcmVjaG5lbiBkZXIgU2Nocml0dHdlaXRlIGZ1ZXIgSGlsZnN2YXJpYWJsZSAgICovCisJaWYoYz09TVVMVHx8Yz09TFNISUZUKXsKKwkgIGludCBzdHlwOworCSAgdDI9bmV3X3R5cCgpOworCSAgdDItPmZsYWdzPWl2X2ljLT50eXBmOworCSAgbnN0ZXA9YWRkX3RtcF92YXIodDIpOworCSAgbmV3PW5ld19JQygpOworCSAgbmV3LT5saW5lPWl2X2ljLT5saW5lOworCSAgbmV3LT5maWxlPWl2X2ljLT5maWxlOworCSAgbmV3LT5jb2RlPU1VTFQ7CisJICBuZXctPnR5cGY9cC0+dHlwZjsKKwkgIG5ldy0+ei5mbGFncz1WQVI7CisJICBuZXctPnoudj1uc3RlcDsKKwkgIG5ldy0+ei52YWwudm1heD1sMnptKDBMKTsKKwkgIGlmKCFjb21wYXJlX29ianMoJm0tPnExLCZpdl9pYy0+eixpdl9pYy0+dHlwZikpeworCSAgICBuZXctPnExPW0tPnEyOworCSAgICBzdHlwPXEydHlwKG0pOworCSAgfWVsc2V7CisJICAgIG5ldy0+cTE9bS0+cTE7CisJICAgIHN0eXA9bS0+dHlwZjsKKwkgIH0KKwkgIGlmKCFjb21wYXJlX29ianMoJml2X2ljLT5xMSwmaXZfaWMtPnosaXZfaWMtPnR5cGYpKSBuZXctPnEyPWl2X2ljLT5xMjsKKwkgIGVsc2UgbmV3LT5xMj1pdl9pYy0+cTE7CisJICBpZihjPT1MU0hJRlQpeworCSAgICBpZigobmV3LT5xMS5mbGFncyYoS09OU1R8RFJFRk9CSikpIT1LT05TVCkgaWVycm9yKDApOworCSAgICBldmFsX2NvbnN0KCZuZXctPnExLnZhbCxzdHlwKTsKKwkgICAgZ3ZhbC52bWF4PXptbHNoaWZ0KFoxLHZtYXgpOworCSAgICBldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CisJICAgIGluc2VydF9jb25zdCgmbmV3LT5xMS52YWwsbmV3LT50eXBmKTsKKwkgIH0KKwkgIC8qICBCZW51dHp0IGRhc3NlbGJlIHdpZSBpdl9pYyB1bmQgbS4gICAqLworCSAgaWYoaGF2ZV9hbGlhcyl7CisJICAgIG5ldy0+dXNlX2NudD1pdl9pYy0+dXNlX2NudCttLT51c2VfY250OworCSAgICBuZXctPnVzZV9saXN0PW15bWFsbG9jKG5ldy0+dXNlX2NudCpWTFMpOworCSAgICBtZW1jcHkobmV3LT51c2VfbGlzdCxpdl9pYy0+dXNlX2xpc3QsaXZfaWMtPnVzZV9jbnQqVkxTKTsKKwkgICAgbWVtY3B5KCZuZXctPnVzZV9saXN0W2l2X2ljLT51c2VfY250XSxtLT51c2VfbGlzdCxtLT51c2VfY250KlZMUyk7CisJICAgIG5ldy0+Y2hhbmdlX2NudD0xOworCSAgICBuZXctPmNoYW5nZV9saXN0PW15bWFsbG9jKFZMUyk7CisJICAgIG5ldy0+Y2hhbmdlX2xpc3RbMF0udj1uc3RlcDsKKwkgICAgbmV3LT5jaGFuZ2VfbGlzdFswXS5mbGFncz0wOworCSAgfQorCSAgaW5zZXJ0X0lDX2ZnKGcsZmdsaXN0W2ctPmluZGV4XSxuZXcpOworCSAgZmdsaXN0W2ctPmluZGV4XT1tPW5ldzsKKwl9CisJLyogIEVyaG9laGVuIGRlciBIaWxmc3ZhcmlhYmxlIHVtIFNjaHJpdHR3ZWl0ZSAgICAgICovCisJbmV3PW5ld19JQygpOworCW5ldy0+bGluZT1pdl9pYy0+bGluZTsKKwluZXctPmZpbGU9aXZfaWMtPmZpbGU7CisKKwluZXctPmNvZGU9aXZfaWMtPmNvZGU7CisJaWYobWludXMpeworCSAgc3dpdGNoKG5ldy0+Y29kZSl7CisJICBjYXNlIEFERDogICAgIG5ldy0+Y29kZT1TVUI7IGJyZWFrOworCSAgY2FzZSBTVUI6ICAgICBuZXctPmNvZGU9QUREOyBicmVhazsKKwkgIGNhc2UgQURESTJQOiAgbmV3LT5jb2RlPVNVQklGUDsgYnJlYWs7CisJICBjYXNlIFNVQklGUDogIG5ldy0+Y29kZT1BRERJMlA7IGJyZWFrOworCSAgfQorCX0KKwlpZihJU1BPSU5URVIodDEtPmZsYWdzKSl7CisJICBpZihuZXctPmNvZGU9PUFERCkgbmV3LT5jb2RlPUFEREkyUDsKKwkgIGlmKG5ldy0+Y29kZT09U1VCKSBuZXctPmNvZGU9U1VCSUZQOworCSAgbmV3LT50eXBmPXQxLT5mbGFnczsKKwl9CisJbmV3LT50eXBmPWl2X2ljLT50eXBmOworCW5ldy0+cTEuZmxhZ3M9VkFSOworCW5ldy0+cTEudj1uaXY7CisJbmV3LT50eXBmMj1uaXYtPnZ0eXAtPmZsYWdzOworCW5ldy0+cTEudmFsLnZtYXg9bDJ6bSgwTCk7CisJbmV3LT56PW5ldy0+cTE7CisJaWYoYz09TVVMVHx8Yz09TFNISUZUKXsKKwkgIG5ldy0+cTI9bS0+ejsKKwl9ZWxzZXsKKwkgIGlmKCFjb21wYXJlX29ianMoJml2X2ljLT5xMSwmaXZfaWMtPnosaXZfaWMtPnR5cGYpKSBuZXctPnEyPWl2X2ljLT5xMjsKKwkgIGVsc2UgbmV3LT5xMj1pdl9pYy0+cTE7CisJfQorCWlmKGhhdmVfYWxpYXMpeworCSAgbmV3LT51c2VfY250PWl2X2ljLT51c2VfY250K20tPnVzZV9jbnQ7CisJICBuZXctPnVzZV9saXN0PW15bWFsbG9jKG5ldy0+dXNlX2NudCpWTFMpOworCSAgbWVtY3B5KG5ldy0+dXNlX2xpc3QsaXZfaWMtPnVzZV9saXN0LGl2X2ljLT51c2VfY250KlZMUyk7CisJICBtZW1jcHkoJm5ldy0+dXNlX2xpc3RbaXZfaWMtPnVzZV9jbnRdLG0tPnVzZV9saXN0LG0tPnVzZV9jbnQqVkxTKTsKKwkgIG5ldy0+Y2hhbmdlX2NudD0xOworCSAgbmV3LT5jaGFuZ2VfbGlzdD1teW1hbGxvYyhWTFMpOworCSAgbmV3LT5jaGFuZ2VfbGlzdFswXS52PW5pdjsKKwkgIG5ldy0+Y2hhbmdlX2xpc3RbMF0uZmxhZ3M9MDsKKwl9CisJLyogIEZsdXNzZ3JhcGggbXVzcyBudXIgYmVpIGRlbiBTY2hsZWlmZW5rb2VwZmVuIG9rIHNlaW4uICAgKi8KKwlpbnNlcnRfSUMoaXZfaWMsbmV3KTsKKwljaGFuZ2VkfD0yOworICAgICAgfQorICAgIH0KKworICAgIG1mPWZpcnN0X3NyLT5uZXh0OworICAgIGZyZWUoZmlyc3Rfc3IpOworICAgIGZpcnN0X3NyPW1mOworICB9CisgIGZyZWUoZmdsaXN0KTsKKyAgcmV0dXJuIGNoYW5nZWQ7Cit9Cit2b2lkIHN0cmVuZ3RoX3JlZHVjdGlvbihmbG93Z3JhcGggKnN0YXJ0LGZsb3dncmFwaCAqZW5kLGZsb3dncmFwaCAqaGVhZCkKKy8qICBFcnNldHplbiB2b24gT3BlcmF0aW9uZW4gbWl0IGVpbmVyIEluZHVrdGlvbnN2YXJpYWJsZW4gdW5kIGVpbmVtICAgICovCisvKiAgc2NobGVpZmVuaW52YXJpYW50ZW4gT3BlcmFuZGVuIGR1cmNoIGVpbmUgenVzYWV0emxpY2hlICAgICAgICAgICAgICAqLworLyogIEhpbGZzaW5kdWt0aW9uc3ZhcmlhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgZmxvd2dyYXBoICpnO0lDICpwOworICBpbnQgaTsKKyAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJwZXJmb3JtaW5nIHN0cmVuZ3RoX3JlZHVjdGlvbiBvbiBibG9ja3MgJWQgdG8gJWRcbiIsc3RhcnQtPmluZGV4LGVuZC0+aW5kZXgpOworICBmb3IoaT0wO2k8dmNvdW50O2krKykgaW5kX3ZhcnNbaV09MDsKKyAgLyogIE5hY2ggSW5kdWt0aW9uc3ZhcmlhYmxlbiBzdWNoZW4uICAgICovCisgIGZvcihnPXN0YXJ0O2c7Zz1nLT5ub3JtYWxvdXQpeworICAgIG1lbWNweShyZF9kZWZzLGctPnJkX2luLGRzaXplKTsKKyAgICBmb3IocD1nLT5zdGFydDtwO3A9cC0+bmV4dCl7CisgICAgICBpbnQgYz1wLT5jb2RlOworICAgICAgaWYoYz09QUREfHxjPT1BRERJMlB8fGM9PVNVQnx8Yz09U1VCSUZQKXsKKwkvKiBUT0RPOiB3aGF0IGlzIHBvc3NpYmxlL3VzZWZ1bCB3aXRoIGZsb2F0aW5nIHBvaW50IGluZHVjdGlvbiB2YXJpYWJsZXM/ICovCisJaWYoIWNvbXBhcmVfb2JqcygmcC0+cTEsJnAtPnoscC0+dHlwZikmJiFJU0ZMT0FUKHAtPnR5cGYpKXsKKwkgIGlmKERFQlVHJjEwMjQpe3ByaW50ZigicG9zc2libGUgaW5kdWN0aW9uOlxuIik7cHJpYzIoc3Rkb3V0LHApO30KKwkgIGlmKHAtPnEyLmZsYWdzJlZBUil7CisJICAgIGk9cC0+cTIudi0+aW5kZXg7CisJICAgIGlmKHAtPnEyLmZsYWdzJkRSRUZPQkopIGkrPXZjb3VudC1yY291bnQ7CisJICB9CisJICBpZigocC0+ei5mbGFncyZWQVIpJiYoKHAtPnEyLmZsYWdzJihWQVJ8VkFSQURSKSkhPVZBUnx8ZGVmX2ludmFyaWFudChpLC0xKSkpeworCSAgICBpPXAtPnoudi0+aW5kZXg7CisJICAgIGlmKHAtPnouZmxhZ3MmRFJFRk9CSikgaSs9dmNvdW50LXJjb3VudDsKKwkgICAgaWYoZGVmX2ludmFyaWFudChpLHAtPmRlZmluZGV4KSl7CisJICAgICAgaWYoREVCVUcmMTAyNCkge3ByaW50ZigiZm91bmQgYmFzaWMgaW5kdWN0aW9uIHZhcjpcbiIpO3ByaWMyKHN0ZG91dCxwKTt9CisJICAgICAgaW5kX3ZhcnNbaV09cDsKKwkgICAgfQorCSAgfQorCX0KKwlpZihVU0VRMkFTWiYmYyE9U1VCJiZjIT1TVUJJRlAmJiFjb21wYXJlX29ianMoJnAtPnEyLCZwLT56LHAtPnR5cGYpKXsKKwkgIGlmKERFQlVHJjEwMjQpe3ByaW50ZigicG9zc2libGUgaW5kdWN0aW9uOlxuIik7cHJpYzIoc3Rkb3V0LHApO30KKwkgIGlmKHAtPnExLmZsYWdzJlZBUil7CisJICAgIGk9cC0+cTEudi0+aW5kZXg7CisJICAgIGlmKHAtPnExLmZsYWdzJkRSRUZPQkopIGkrPXZjb3VudC1yY291bnQ7CisJICB9CisJICBpZigocC0+cTEuZmxhZ3MmKFZBUnxWQVJBRFIpKSE9VkFSfHxkZWZfaW52YXJpYW50KGksLTEpKXsKKwkgICAgaT1wLT56LnYtPmluZGV4OworCSAgICBpZihwLT56LmZsYWdzJkRSRUZPQkopIGkrPXZjb3VudC1yY291bnQ7CisJICAgIGlmKGRlZl9pbnZhcmlhbnQoaSxwLT5kZWZpbmRleCkpeworCSAgICAgIGlmKERFQlVHJjEwMjQpIHtwcmludGYoImZvdW5kIGJhc2ljIGluZHVjdGlvbiB2YXI6XG4iKTtwcmljMihzdGRvdXQscCk7fQorCSAgICAgIGluZF92YXJzW2ldPXA7CisJICAgIH0KKwkgIH0KKwl9CisgICAgICB9CisKKyAgICAgIC8qICBEYXMgaGllciwgdW0gcmRfZGVmcyB6dSBha3R1YWxpc2llcmVuLiAgKi8KKyAgICAgIHJkX2NoYW5nZShwKTsKKworICAgICAgaWYocD09Zy0+ZW5kKSBicmVhazsKKyAgICB9CisgICAgaWYoZz09ZW5kKSBicmVhazsKKyAgfQorCisgIGlmKGRpc2FibGUmMTAyNCkgcmV0dXJuOworCisgIC8qICBOYWNoIHJlZHV6aWVyYmFyZW4gT3BlcmF0aW9uZW4gc3VjaGVuICAgKi8KKyAgZm9yKGc9c3RhcnQ7ZztnPWctPm5vcm1hbG91dCl7CisgICAgbWVtY3B5KHJkX2RlZnMsZy0+cmRfaW4sZHNpemUpOworICAgIGZvcihwPWctPnN0YXJ0O3A7cD1wLT5uZXh0KXsKKyAgICAgIGlmKCgocC0+Y29kZT09TVVMVHx8cC0+Y29kZT09TFNISUZUKXx8KChwLT5jb2RlPT1BRER8fHAtPmNvZGU9PVNVQnx8cC0+Y29kZT09QURESTJQfHxwLT5jb2RlPT1TVUJJRlApJiYhKGRpc2FibGUmNTEyKSkpJiYKKwkgKCghSVNGTE9BVChwLT50eXBmKSl8fGZwX2Fzc29jKSYmIShwLT5mbGFncyZFRkZfSUMpICl7CisJaW50IGsxLGsyLGl2OworCWlmKChwLT5xMS5mbGFncyYoVkFSfFZBUkFEUikpPT1WQVIpeworCSAgaT1wLT5xMS52LT5pbmRleDsKKwkgIGlmKHAtPnExLmZsYWdzJkRSRUZPQkopIGkrPXZjb3VudC1yY291bnQ7CisJICBpZihpbmRfdmFyc1tpXSl7CisJICAgIGsxPTE7aXY9aTsKKwkgIH1lbHNlIGlmKGRlZl9pbnZhcmlhbnQoaSwtMSkpCisJICAgIGsxPTI7CisJICBlbHNlCisJICAgIGsxPTA7CisJfWVsc2UKKwkgIGsxPTI7CisJaWYoKHAtPnEyLmZsYWdzJihWQVJ8VkFSQURSKSk9PVZBUil7CisJICBpPXAtPnEyLnYtPmluZGV4OworCSAgaWYocC0+cTIuZmxhZ3MmRFJFRk9CSikgaSs9dmNvdW50LXJjb3VudDsKKwkgIGlmKGluZF92YXJzW2ldKXsKKwkgICAgazI9MTtpdj1pOworCSAgfWVsc2UgaWYoZGVmX2ludmFyaWFudChpLC0xKSkKKwkgICAgazI9MjsKKwkgIGVsc2UKKwkgICAgazI9MDsKKwl9ZWxzZQorCSAgazI9MjsKKwlpZihwLT5jb2RlPT1MU0hJRlQmJihwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpIT1LT05TVCkKKwkgIGsyPTA7CisJaWYocC0+ei5mbGFncyZWQVIpeworCSAgLyogIEF1ZnBhc3NlbiwgZGFzcyBlaW5lIEluZHVrdGlvbiBuaWNodCBzZWxic3QgcmVkdXppZXJ0ICAgKi8KKwkgIC8qICB3aXJkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJICBpPXAtPnoudi0+aW5kZXg7CisJICBpZihwLT56LmZsYWdzJkRSRUZPQkopIGkrPXZjb3VudC1yY291bnQ7CisJICBpZihpbmRfdmFyc1tpXSkgazE9MDsKKwl9CisJaWYoazErazI9PTMpeworCSAgLyogICAgICAgICAgICAgICAgICAgIGlmKERFQlVHJjEwMjQpIHtwcmludGYoImNvdWxkIHBlcmZvcm0gc3RyZW5ndGgtcmVkdWN0aW9uIG9uOlxuIik7cHJpYzIoc3Rkb3V0LHApO30qLworCSAgYWRkX3NyKHAsaGVhZCxpdik7CisJfQorICAgICAgfQorICAgICAgLyogIERhcyBoaWVyLCB1bSByZF9kZWZzIHp1IGFrdHVhbGlzaWVyZW4uICAqLworICAgICAgcmRfY2hhbmdlKHApOworCisgICAgICBpZihwPT1nLT5lbmQpIGJyZWFrOworICAgIH0KKyAgICBpZihnPT1lbmQpIGJyZWFrOworICB9Cit9Cit2b2lkIGNvcHlfY29kZShJQyAqc3RhcnQsSUMgKmVuZCxJQyAqZGVzdCxpbnQgbixJQyAqaWdub3JlKQorLyogIEtvcGllcnQgQ29kZSB2b24gc3RhcnQgYmlzIGVuZCBuLW1hbCBoaW50ZXIgZGVzdC4gR2VuZXJpZXJ0ICAgICAgICAgKi8KKy8qICBlbnRzcHJlY2hlbmQgbmV1ZSBMYWJlbHMuIEFsbGVyZGluZ3Mgd2lyZCBkZXIgRmx1c3NncmFwaCB1bmQgICAgICAgICovCisvKiAgYWxpYXNpbmctaW5mbyBuaWNodCBhbmdlcGFzc3QgdW5kIG11c3MgZGFuYWNoIG5ldSBnZW5lcmllcnQgd2VyZGVuLiAqLworLyogIElDIGlnbm9yZSB3aXJkIG5pY2h0IGtvcGllcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGZpcnN0bD0wLGxhc3RsPTAsKmxhcnJheSxpLGo7CisgIElDICpwLCpuZXcsKmN1cnJlbnQ7CisgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiY29weV9jb2RlICVkIHRpbWVzXG4iLG4pOworICAvKiAgRmVzdHN0ZWxsZW4sIHdlbGNoZSBMYWJlbHMgaW4gZGVyIFNjaGxlaWZlIGRlZmluaWVydCB3ZXJkZW4uICAgICovCisgIGZvcihwPXN0YXJ0O3A7cD1wLT5uZXh0KXsKKyAgICBpZihwLT5jb2RlPT1MQUJFTCl7CisgICAgICBpZihmaXJzdGw9PTB8fGZpcnN0bD5wLT50eXBmKSBmaXJzdGw9cC0+dHlwZjsKKyAgICAgIGlmKGxhc3RsID09MHx8IGxhc3RsPHAtPnR5cGYpIGxhc3RsID1wLT50eXBmOworICAgIH0KKyAgICBpZihwPT1lbmQpIGJyZWFrOworICB9CisgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiZmlyc3RsPSVkLCBsYXN0bD0lZFxuIixmaXJzdGwsbGFzdGwpOworICBsYXJyYXk9bXltYWxsb2MoKGxhc3RsLWZpcnN0bCsxKSpzaXplb2YoKmxhcnJheSkpOworICBmb3IoaT0wO2k8PWxhc3RsLWZpcnN0bDtpKyspIGxhcnJheVtpXT0wOworICBmb3IocD1zdGFydDtwO3A9cC0+bmV4dCl7CisgICAgaWYocC0+Y29kZT09TEFCRUwpIGxhcnJheVtwLT50eXBmLWZpcnN0bF09MTsKKyAgICBpZihwPT1lbmQpIGJyZWFrOworICB9CisgIGN1cnJlbnQ9ZGVzdDsKKyAgLyogIEhhdXB0c2NobGVpZmUuICAqLworICBmb3IoaT0wO2k8bjtpKyspeworICAgIC8qICBOZXVlIExhYmVscyBlcnpldWdlbi4gICAqLworICAgIGZvcihqPTA7ajw9bGFzdGwtZmlyc3RsO2orKykKKyAgICAgIGlmKGxhcnJheVtqXSkgbGFycmF5W2pdPSsrbGFiZWw7CisgICAgLyogIENvZGUga29waWVyZW4gKHJ1ZWNrd2FlcnRzKS4gICAgKi8KKyAgICBmb3IocD1zdGFydDtwO3A9cC0+bmV4dCl7CisgICAgICBpZihwIT1pZ25vcmUpeworCW5ldz1uZXdfSUMoKTsKKwkqbmV3PSpwOworCXAtPmNvcHk9bmV3OworCS8qICBGdWVyIGZyZWVfYWxpYXMuICAgICovCisJbmV3LT5jaGFuZ2VfY250PW5ldy0+dXNlX2NudD0wOworCW5ldy0+Y2hhbmdlX2xpc3Q9bmV3LT51c2VfbGlzdD0wOworCS8qICBFdnRsLiBMYWJlbCBhbnBhc3Nlbi4gICAqLworCWlmKHAtPmNvZGU+PUxBQkVMJiZwLT5jb2RlPD1CUkEpeworCSAgaWYocC0+dHlwZj49Zmlyc3RsJiZwLT50eXBmPD1sYXN0bCYmbGFycmF5W3AtPnR5cGYtZmlyc3RsXSkKKwkgICAgbmV3LT50eXBmPWxhcnJheVtwLT50eXBmLWZpcnN0bF07CisJfQorCWlmKHAtPmNvZGU9PUNBTEwpeworCSAgaW50IGk7CisJICBuZXctPmFyZ19saXN0PW15bWFsbG9jKHNpemVvZigqbmV3LT5hcmdfbGlzdCkqbmV3LT5hcmdfY250KTsKKwkgIGZvcihpPTA7aTxuZXctPmFyZ19jbnQ7aSsrKSBuZXctPmFyZ19saXN0W2ldPXAtPmFyZ19saXN0W2ldLT5jb3B5OworCSAgbmV3LT5jYWxsX2xpc3Q9bXltYWxsb2MobmV3LT5jYWxsX2NudCpzaXplb2YoKm5ldy0+Y2FsbF9saXN0KSk7CisJICBtZW1jcHkobmV3LT5jYWxsX2xpc3QscC0+Y2FsbF9saXN0LG5ldy0+Y2FsbF9jbnQqc2l6ZW9mKCpuZXctPmNhbGxfbGlzdCkpOworCX0KKwlpbnNlcnRfSUMoY3VycmVudCxuZXcpOworCWN1cnJlbnQ9bmV3OworICAgICAgfQorICAgICAgaWYocD09ZW5kKSBicmVhazsKKyAgICB9CisgIH0KKyAgZnJlZShsYXJyYXkpOworfQordm9pZCBhZGRfdXIoaW50IGZsYWdzLGxvbmcgdG90YWwsbG9uZyB1bnJvbGwsZmxvd2dyYXBoICpzdGFydCxmbG93Z3JhcGggKmhlYWQsSUMgKmNtcCxJQyAqYnJhbmNoLElDICppbmQpCisvKiAgRnVlZ3QgRGF0ZW4gZnVlciBsb29wLXVucm9sbGluZyBpbiBTdGFjayBlaW4uICAgICAgICAgICAgICAgICAgICAgICAqLworeworICB1cmxpc3QgKm5ldz1teW1hbGxvYyhzaXplb2YodXJsaXN0KSk7CisgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiYWRkX3VyLCBmbGFncz0lZFxuIixmbGFncyk7CisgIG5ldy0+ZmxhZ3M9ZmxhZ3M7CisgIG5ldy0+dG90YWw9dG90YWw7CisgIG5ldy0+dW5yb2xsPXVucm9sbDsKKyAgbmV3LT5zdGFydD1zdGFydDsKKyAgbmV3LT5oZWFkPWhlYWQ7CisgIG5ldy0+Y21wPWNtcDsKKyAgbmV3LT5icmFuY2g9YnJhbmNoOworICBuZXctPmluZD1pbmQ7CisgIG5ldy0+bmV4dD1maXJzdF91cjsKKyAgZmlyc3RfdXI9bmV3OworfQorCitzdGF0aWMgaW50IGRlY2lkZV9zaG9ydGVuKGludCB0LGZsb3dncmFwaCAqc3RhcnQsSUMgKmluZCxJQyAqY21wKQoreworICBJQyAqcDsKKyAgVmFyICpvaXY9aW5kLT56LnY7CisgIGludCBjbnQ9MDsKKyAgZm9yKHA9c3RhcnQtPnN0YXJ0O3A7cD1wLT5uZXh0KXsKKyAgICBpZihwPT1pbmQpIGNvbnRpbnVlOworICAgIGlmKHA9PWNtcCkgYnJlYWs7CisgICAgaWYoKHAtPnExLmZsYWdzJlZBUikmJnAtPnExLnY9PW9pdil7CisgICAgICBpZighKHAtPmNvZGU9PUNPTlZFUlQmJiFjb21wYXJlX29ianMoJnAtPnExLCZpbmQtPnExLHAtPnR5cGYpJiYocC0+dHlwZiZOUSk9PSh0Jk5RKSkpCisJY250Kys7CisgICAgfQorICAgIGlmKChwLT5xMi5mbGFncyZWQVIpJiZwLT5xMi52PT1vaXYpeworICAgICAgaWYoISgocC0+Y29kZT09QURESTJQfHxwLT5jb2RlPT1TVUJJRlApJiYhY29tcGFyZV9vYmpzKCZwLT5xMiwmaW5kLT5xMSxwLT50eXBmKSYmKHAtPnR5cGYmTlEpPj1NSU5BRERJMlApKQorCWNudCsrOworICAgIH0KKyAgICBpZigocC0+ei5mbGFncyZWQVIpJiZwLT56LnY9PW9pdikgY250Kys7CisgIH0KKyAgcmV0dXJuIGNudD09MDsKK30KKworc3RhdGljIGludCBkb19zaG9ydGVuKCkKK3sKKyAgaW50IGNoYW5nZWQ9MDsgdXJsaXN0ICptOworICBmb3IobT1maXJzdF91cjttO209bS0+bmV4dCl7CisgICAgaWYobS0+ZmxhZ3MmVU5ST0xMX1NIT1JURU4peworICAgICAgLyogdXNlIHNob3J0ZXIgaW5kdWN0aW9uIHZhcmlhYmxlICovCisgICAgICB0eXBlIHN0PXtDSEFSfTsKKyAgICAgIGludCBjbnQ9MDsKKyAgICAgIFZhciAqbml2LCpvaXY7SUMgKm5ldywqcCwqY21wPW0tPmNtcCwqaW5kPW0tPmluZDsKKyAgICAgIGlmKERFQlVHJjEwMjQpIHByaW50Zigic2hvcnRlbiBpbmR1Y3Rpb24gdmFyaWFibGUgdG8gJXMgJXNcbiIsKG0tPnRvdGFsJlVOU0lHTkVEKT8idW5zaWduZWQiOiJzaWduZWQiLHR5cG5hbWVbbS0+dG90YWwmTlFdKTsKKyAgICAgIHN0LmZsYWdzPW0tPnRvdGFsOworICAgICAgbml2PWFkZF90bXBfdmFyKGNsb25lX3R5cCgmc3QpKTsKKyAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgIG5ldy0+Y29kZT1DT05WRVJUOworICAgICAgbmV3LT5xMT1pbmQtPno7CisgICAgICBuZXctPnouZmxhZ3M9VkFSOworICAgICAgbmV3LT56LnZhbC52bWF4PVowOworICAgICAgbmV3LT56LnY9bml2OworICAgICAgbmV3LT50eXBmMj1pbmQtPnR5cGY7CisgICAgICBuZXctPnR5cGY9c3QuZmxhZ3M7CisgICAgICBpbnNlcnRfSUMobS0+aGVhZC0+ZW5kLG5ldyk7CisgICAgICBpbmQtPnExPW5ldy0+ejsKKyAgICAgIGluZC0+ej1uZXctPno7CisgICAgICBpbmQtPnR5cGY9c3QuZmxhZ3M7CisgICAgICBjbXAtPnExPW5ldy0+ejsKKyAgICAgIGV2YWxfY29uc3QoJmNtcC0+cTIudmFsLGNtcC0+dHlwZik7CisgICAgICBjbXAtPnR5cGY9c3QuZmxhZ3M7CisgICAgICBpbnNlcnRfY29uc3QoJmNtcC0+cTIudmFsLGNtcC0+dHlwZik7CisgICAgICBvaXY9bmV3LT5xMS52OworICAgICAgLyogcmVwbGFjZSB1c2VzIG9mIHRoZSBvbGQgaW5kdWN0aW9uIHZhcmlhYmxlIHRoYXQgZG8gbm90IG5lZWQgY29udmVyc2lvbnMgKi8KKyAgICAgIGZvcihwPW0tPnN0YXJ0LT5zdGFydDtwO3A9cC0+bmV4dCl7CisJaWYocD09Y21wKSBicmVhazsKKwlpZigocC0+Y29kZT09QURESTJQfHxwLT5jb2RlPT1TVUJJRlApJiYhY29tcGFyZV9vYmpzKCZwLT5xMiwmbmV3LT5xMSxwLT50eXBmKSYmKHAtPnR5cGYmTlEpPj1NSU5BRERJMlApeworCSAgaWYoREVCVUcmMTAyNCl7CisJICAgIHByaW50ZigicmVwbGFjZSB1c2Ugb2YgbGFyZ2UgaW5kdWN0aW9uIHZhcmlhYmxlIChBRERJMlApOlxuIik7CisJICAgIHByaWMyKHN0ZG91dCxwKTsKKwkgIH0KKwkgIHAtPnEyPW5ldy0+ejsKKwkgIHAtPnR5cGY9bmV3LT50eXBmOworCX0KKwlpZihwLT5jb2RlPT1DT05WRVJUJiYhY29tcGFyZV9vYmpzKCZwLT5xMSwmbmV3LT5xMSxwLT50eXBmKSYmKHAtPnR5cGYmTlEpPT0obmV3LT50eXBmJk5RKSl7CisJICBpZihERUJVRyYxMDI0KXsKKwkgICAgcHJpbnRmKCJyZXBsYWNlIHVzZSBvZiBsYXJnZSBpbmR1Y3Rpb24gdmFyaWFibGUgKENPTlZFUlQpOlxuIik7CisJICAgIHByaWMyKHN0ZG91dCxwKTsKKwkgIH0KKwkgIHAtPnExPW5ldy0+ejsKKwkgIHAtPmNvZGU9QVNTSUdOOworCSAgcC0+cTIudmFsLnZtYXg9c2l6ZXRhYltwLT50eXBmJk5RXTsKKwl9CisJaWYoKHAtPnExLmZsYWdzJlZBUikmJnAtPnExLnY9PW9pdikgY250Kys7CisJaWYoKHAtPnEyLmZsYWdzJlZBUikmJnAtPnEyLnY9PW9pdikgY250Kys7CisJaWYoKHAtPnouZmxhZ3MmVkFSKSYmcC0+ei52PT1vaXYpIGNudCsrOworICAgICAgfQorICAgICAgcD1uZXdfSUMoKTsKKyAgICAgIHAtPmNvZGU9Q09OVkVSVDsKKyAgICAgIHAtPnExPW5ldy0+ejsKKyAgICAgIHAtPno9bmV3LT5xMTsKKyAgICAgIHAtPnR5cGY9bmV3LT50eXBmMjsKKyAgICAgIHAtPnR5cGYyPW5ldy0+dHlwZjsKKyAgICAgIGlmKGNudHx8KG0tPmZsYWdzJk1VTFRJUExFX0VYSVRTKSkKKwlpbnNlcnRfSUMoaW5kLHApOworICAgICAgZWxzZQorCWluc2VydF9JQyhtLT5icmFuY2gscCk7CisKKyAgICAgIG0tPmZsYWdzPTA7CisgICAgICBjaGFuZ2VkfD0yOworICAgIH0KKyAgfQorICByZXR1cm4gY2hhbmdlZDsKK30KKworaW50IGRvX3Vucm9sbChpbnQgZG9ub3RoaW5nKQorLyogIEZ1ZWhydCBsb29wLXVucm9sbGluZyBkdXJjaC4gV2VubiBkb25vdGhpbmchPTAsIHdpcmQgZGllIExpc3RlIG51ciAgKi8KKy8qICBmcmVpZ2VnZWJlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBjaGFuZ2VkPTA7IHVybGlzdCAqbTsKKyAgSUMgKmRpdjsKKyAgd2hpbGUobT1maXJzdF91cil7CisgICAgaW50IGZsYWdzPW0tPmZsYWdzOworICAgIGxvbmcgdG90YWw9bS0+dG90YWwsdW5yb2xsPW0tPnVucm9sbDsKKyAgICBmbG93Z3JhcGggKnN0YXJ0PW0tPnN0YXJ0LCpoZWFkPW0tPmhlYWQ7CisgICAgSUMgKmNtcD1tLT5jbXAsKmJyYW5jaD1tLT5icmFuY2gsKmluZD1tLT5pbmQ7CisgICAgaWYoZG9ub3RoaW5nKSBmbGFncz0wOworICAgIGlmKGZsYWdzJlVOUk9MTF9DT01QTEVURUxZKXsKKyAgICAgIC8qICBTY2hsZWlmZSBrb21wbGV0dCBhdXNyb2xsZW4uICAgICovCisgICAgICBpZihERUJVRyYxMDI0KSBwcmludGYoInVucm9sbCBsb29wIGNvbXBsZXRlbHlcbiIpOworICAgICAgY29weV9jb2RlKHN0YXJ0LT5zdGFydC0+bmV4dCxjbXAtPnByZXYsc3RhcnQtPnN0YXJ0LHRvdGFsLTEsMCk7CisgICAgICBpZihERUJVRyYxMDI0KSBwcmludGYoInJlbW92aW5nIGxvb3AgYnJhbmNoXG4iKTsKKyAgICAgIHJlbW92ZV9JQyhicmFuY2gpOworICAgICAgaWYoIWNtcC0+ei5mbGFncyl7CisJcmVtb3ZlX0lDKGNtcCk7CisJaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJyZW1vdmluZyBsb29wIGNvbXBhcmVcbiIpOworICAgICAgfQorICAgICAgY2hhbmdlZHw9MTsKKyAgICB9CisKKyAgICBpZihmbGFncyZVTlJPTExfTU9EVUxPKXsKKyAgICAgIC8qICBTY2hsZWlmZSB0ZWlsd2Vpc2UgYXVzcm9sbGVuLiAgICovCisgICAgICBpZihERUJVRyYxMDI0KSBwcmludGYoInVucm9sbCBsb29wIHBhcnRpYWxseSwgbj0lbGQscj0lbGRcbiIsdW5yb2xsLHRvdGFsJXVucm9sbCk7CisgICAgICBpZih1bnJvbGw+MSl7CisJaWYoKGZsYWdzJihJTkRfT05MWV9DT1VOVFN8TVVMVElQTEVfRVhJVFMpKT09SU5EX09OTFlfQ09VTlRTKXsKKwkgIElDICpuZXc9bmV3X0lDKCk7CisJICBjb3B5X2NvZGUoc3RhcnQtPnN0YXJ0LT5uZXh0LGNtcC0+cHJldixoZWFkLT5zdGFydCx0b3RhbCV1bnJvbGwsaW5kKTsKKwkgICpuZXc9KmluZDsKKwkgIG5ldy0+dXNlX2NudD1uZXctPmNoYW5nZV9jbnQ9MDsKKwkgIG5ldy0+dXNlX2xpc3Q9bmV3LT5jaGFuZ2VfbGlzdD0wOworCSAgaWYoIShpbmQtPnEyLmZsYWdzJktPTlNUKSkgaWVycm9yKDApOworCSAgZXZhbF9jb25zdCgmaW5kLT5xMi52YWwsaW5kLT50eXBmKTsKKwkgIGlmKGluZC0+dHlwZiZVTlNJR05FRCl7CisJICAgIGd2YWwudnVtYXg9enVtbXVsdCh2dW1heCx1bDJ6dW0oKHVuc2lnbmVkIGxvbmcpKHRvdGFsJXVucm9sbCkpKTsKKwkgICAgZXZhbF9jb25zdCgmZ3ZhbCwoVU5TSUdORUR8TUFYSU5UKSk7CisJICB9ZWxzZXsKKwkgICAgZ3ZhbC52dW1heD16dW1tdWx0KHZ1bWF4LHVsMnp1bSgodW5zaWduZWQgbG9uZykodG90YWwldW5yb2xsKSkpOworCSAgICBldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CisJICB9CisJICBpbnNlcnRfY29uc3QoJm5ldy0+cTIudmFsLGluZC0+dHlwZik7CisJICBpbnNlcnRfSUMoaGVhZC0+ZW5kLG5ldyk7CisJICBjb3B5X2NvZGUoc3RhcnQtPnN0YXJ0LT5uZXh0LGNtcC0+cHJldixzdGFydC0+c3RhcnQsdW5yb2xsLTEsaW5kKTsKKwkgIGV2YWxfY29uc3QoJmluZC0+cTIudmFsLGluZC0+dHlwZik7CisJICBpZihpbmQtPnR5cGYmVU5TSUdORUQpeworCSAgICBndmFsLnZ1bWF4PXp1bW11bHQodnVtYXgsdWwyenVtKCh1bnNpZ25lZCBsb25nKSh1bnJvbGwpKSk7CisJICAgIGV2YWxfY29uc3QoJmd2YWwsKFVOU0lHTkVEfE1BWElOVCkpOworCSAgfWVsc2V7CisJICAgIGd2YWwudnVtYXg9enVtbXVsdCh2dW1heCx1bDJ6dW0oKHVuc2lnbmVkIGxvbmcpKHVucm9sbCkpKTsKKwkgICAgZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworCSAgfQorCSAgaW5zZXJ0X2NvbnN0KCZpbmQtPnEyLnZhbCxpbmQtPnR5cGYpOwkJCisJICBjaGFuZ2VkfD0xOworCX1lbHNleworCSAgY29weV9jb2RlKHN0YXJ0LT5zdGFydC0+bmV4dCxjbXAtPnByZXYsaGVhZC0+c3RhcnQsdG90YWwldW5yb2xsLDApOworCSAgY29weV9jb2RlKHN0YXJ0LT5zdGFydC0+bmV4dCxjbXAtPnByZXYsc3RhcnQtPnN0YXJ0LHVucm9sbC0xLDApOworCSAgY2hhbmdlZHw9MTsKKwl9CisgICAgICB9CisgICAgfQorICAgIGlmKGZsYWdzJlVOUk9MTF9JTlZBUklBTlQpeworICAgICAgSUMgKm5ldywqbWMsKm1uOyBWYXIgKnY7IGludCBvdXQ9KytsYWJlbCxjb2RlOworICAgICAgbG9uZyBpOyB0eXBlICp0O3N0YXRpYyB0eXBlIHRwdHJkaWZmPXswfTsKKyAgICAgIElDIHRtcDsKKyAgICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigidW5yb2xsaW5nIG5vbi1jb25zdGFudCBsb29wXG4iKTsKKyAgICAgIGlmKElTUE9JTlRFUihjbXAtPnR5cGYpKXsKKwl0cHRyZGlmZi5mbGFncz1QVFJESUZGX1QoY21wLT50eXBmKTsKKwl0PSZ0cHRyZGlmZjsKKyAgICAgIH1lbHNleworCWlmKGNtcC0+cTEuZmxhZ3MmVkFSKQorCSAgdD1jbXAtPnExLnYtPnZ0eXA7CisJZWxzZQorCSAgdD1jbXAtPnEyLnYtPnZ0eXA7CisgICAgICB9CisgICAgICB2PWFkZF90bXBfdmFyKGNsb25lX3R5cCh0KSk7CisgICAgICAvKiAgYnJhbmNoIGRpZW50IGhpZXIgdGVpbHdlaXNlIGFscyBsZWVyZSBTY2hhYmxvbmUuICAgICovCisgICAgICAvKiAgTGFiZWwgYW4gU2NobGVpZmVuYXVzZ2FuZyBzZXR6ZW4uICAgKi8KKyAgICAgIG5ldz1uZXdfSUMoKTsgCisgICAgICAqbmV3PSpicmFuY2g7CisgICAgICBuZXctPnExLmZsYWdzPTA7CisgICAgICBuZXctPmNoYW5nZV9jbnQ9bmV3LT51c2VfY250PTA7CisgICAgICBuZXctPmNoYW5nZV9saXN0PW5ldy0+dXNlX2xpc3Q9MDsKKyAgICAgIG5ldy0+Y29kZT1MQUJFTDsKKyAgICAgIG5ldy0+dHlwZj1vdXQ7CisgICAgICBpbnNlcnRfSUMoYnJhbmNoLG5ldyk7CisgICAgICAvKiAgVGVzdCB2b3IgZGllIHVucm9sbC1WYXJpYW50ZS4gICAqLworICAgICAgbmV3PW5ld19JQygpOyAqbmV3PSpicmFuY2g7CisgICAgICBuZXctPmNoYW5nZV9jbnQ9bmV3LT51c2VfY250PTA7CisgICAgICBuZXctPmNoYW5nZV9saXN0PW5ldy0+dXNlX2xpc3Q9MDsKKyAgICAgIGlmKGJyYW5jaC0+Y29kZT09QkxUKSBuZXctPmNvZGU9QkdFOworICAgICAgaWYoYnJhbmNoLT5jb2RlPT1CTEUpIG5ldy0+Y29kZT1CR1Q7CisgICAgICBpZihicmFuY2gtPmNvZGU9PUJHVCkgbmV3LT5jb2RlPUJMRTsKKyAgICAgIGlmKGJyYW5jaC0+Y29kZT09QkdFKSBuZXctPmNvZGU9QkxUOworICAgICAgaWYoYnJhbmNoLT5jb2RlPT1CRVEpIGllcnJvcigwKTsKKyAgICAgIGlmKGJyYW5jaC0+Y29kZT09Qk5FKSBpZXJyb3IoMCk7CisgICAgICBjb2RlPWJyYW5jaC0+Y29kZTsKKyAgICAgIG1jPW5ldzsKKyAgICAgIG5ldy0+dHlwZj1vdXQ7CisgICAgICBpbnNlcnRfSUMoaGVhZC0+c3RhcnQsbmV3KTsKKyAgICAgIG5ldz1uZXdfSUMoKTsgKm5ldz0qY21wOworICAgICAgbmV3LT5jaGFuZ2VfY250PW5ldy0+dXNlX2NudD0wOworICAgICAgbmV3LT5jaGFuZ2VfbGlzdD1uZXctPnVzZV9saXN0PTA7CisgICAgICBpbnNlcnRfSUMoaGVhZC0+c3RhcnQsbmV3KTsKKyAgICAgIC8qICBFaW5zcHJ1bmdwdW5rdGUgZnVlciBkaWUgTW9kdWxvcy4gICAqLworICAgICAgbGFiZWwrPXVucm9sbDsKKyAgICAgIGZvcihpPTE7aTx1bnJvbGw7aSsrKXsKKwljb3B5X2NvZGUoc3RhcnQtPnN0YXJ0LT5uZXh0LGNtcC0+cHJldixoZWFkLT5zdGFydCwxLDApOworCW5ldz1uZXdfSUMoKTsgKm5ldz0qYnJhbmNoOworCW5ldy0+cTEuZmxhZ3M9MDsKKwluZXctPmNoYW5nZV9jbnQ9bmV3LT51c2VfY250PTA7CisJbmV3LT5jaGFuZ2VfbGlzdD1uZXctPnVzZV9saXN0PTA7CisJbmV3LT5jb2RlPUxBQkVMOworCW5ldy0+dHlwZj1vdXQraTsKKwlpbnNlcnRfSUMoaGVhZC0+c3RhcnQsbmV3KTsKKyAgICAgIH0KKyAgICAgIC8qICBUZXN0ZW4sIHdlbGNoZXMgTW9kdWxvLiAqLworICAgICAgZm9yKGk9dW5yb2xsLTI7aT49MDtpLS0peworCW5ldz1uZXdfSUMoKTsgKm5ldz0qYnJhbmNoOworCW5ldy0+Y2hhbmdlX2NudD1uZXctPnVzZV9jbnQ9MDsKKwluZXctPmNoYW5nZV9saXN0PW5ldy0+dXNlX2xpc3Q9MDsKKwluZXctPmNvZGU9QkVROworCWlmKGk+MCkgbmV3LT50eXBmPW91dCtpOworCWVsc2UgbmV3LT50eXBmPXN0YXJ0LT5zdGFydC0+dHlwZjsKKwlpbnNlcnRfSUMoaGVhZC0+c3RhcnQsbmV3KTsKKwluZXc9bmV3X0lDKCk7ICpuZXc9KmJyYW5jaDsKKwluZXctPmNoYW5nZV9jbnQ9bmV3LT51c2VfY250PTA7CisJbmV3LT5jaGFuZ2VfbGlzdD1uZXctPnVzZV9saXN0PTA7CisJaWYoU1dJVENIU1VCUykgZ3ZhbC52aW50PXptMnppKGwyem0oMUwpKTsKKwllbHNlICAgICAgIGd2YWwudmludD16bTJ6aShsMnptKGkpKTsKKwlldmFsX2NvbnN0KCZndmFsLElOVCk7CisJbmV3LT5xMS5mbGFncz1WQVI7CisJbmV3LT5xMS52PXY7CisJbmV3LT5xMS52YWwudm1heD1sMnptKDBMKTsKKwluZXctPnR5cGY9dC0+ZmxhZ3M7CisJaWYoU1dJVENIU1VCU3x8aT09MCl7CisJICBuZXctPmNvZGU9VEVTVDsKKwkgIGluc2VydF9JQyhoZWFkLT5zdGFydCxuZXcpOworCSAgaWYoaT4wKXsKKwkgICAgbmV3PW5ld19JQygpOworCSAgICAqbmV3PSpoZWFkLT5zdGFydC0+bmV4dDsKKwkgICAgbmV3LT5jaGFuZ2VfY250PW5ldy0+dXNlX2NudD0wOworCSAgICBuZXctPmNoYW5nZV9saXN0PW5ldy0+dXNlX2xpc3Q9MDsKKwkgICAgbmV3LT5jb2RlPVNVQjsKKwkgICAgbmV3LT56PW5ldy0+cTE7CisJICAgIG5ldy0+cTIuZmxhZ3M9S09OU1Q7CisJICAgIGluc2VydF9jb25zdCgmbmV3LT5xMi52YWwsbmV3LT50eXBmJk5VKTsKKwkgICAgaW5zZXJ0X0lDKGhlYWQtPnN0YXJ0LG5ldyk7CisJICB9CisJfWVsc2V7CisJICBuZXctPmNvZGU9Q09NUEFSRTsKKwkgIG5ldy0+cTIuZmxhZ3M9S09OU1Q7CisJICBpbnNlcnRfY29uc3QoJm5ldy0+cTIudmFsLG5ldy0+dHlwZiZOVSk7CisJICBpbnNlcnRfSUMoaGVhZC0+c3RhcnQsbmV3KTsKKwl9CisgICAgICB9CisgICAgICAvKiAgRHVyY2hsYWV1ZmUgbW9kdWxvIHVucm9sbCBiZXJlY2huZW4uICAgICovCisgICAgICBuZXc9bmV3X0lDKCk7ICpuZXc9KmJyYW5jaDsKKyAgICAgIG5ldy0+Y2hhbmdlX2NudD1uZXctPnVzZV9jbnQ9MDsKKyAgICAgIG5ldy0+Y2hhbmdlX2xpc3Q9bmV3LT51c2VfbGlzdD0wOworICAgICAgbmV3LT5jb2RlPUFORDsKKyAgICAgIG5ldy0+dHlwZj10LT5mbGFnczsKKyAgICAgIG5ldy0+cTEuZmxhZ3M9VkFSOworICAgICAgbmV3LT5xMS52PXY7CisgICAgICBuZXctPnExLnZhbC52bWF4PWwyem0oMEwpOworICAgICAgbmV3LT56PW5ldy0+cTE7CisgICAgICBuZXctPnEyLmZsYWdzPUtPTlNUOworICAgICAgZ3ZhbC52bWF4PWwyem0odW5yb2xsLTEpOworICAgICAgZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworICAgICAgaW5zZXJ0X2NvbnN0KCZuZXctPnEyLnZhbCxuZXctPnR5cGYpOworICAgICAgaW5zZXJ0X0lDKGhlYWQtPnN0YXJ0LG5ldyk7CisgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICAqbmV3PSppbmQ7CisgICAgICBuZXctPmNoYW5nZV9jbnQ9bmV3LT51c2VfY250PTA7CisgICAgICBuZXctPmNoYW5nZV9saXN0PW5ldy0+dXNlX2xpc3Q9MDsKKyAgICAgIG5ldy0+Y29kZT1ESVY7CisgICAgICBkaXY9bmV3OworICAgICAgbmV3LT5xMT1oZWFkLT5zdGFydC0+bmV4dC0+ejsKKyAgICAgIG5ldy0+ej1uZXctPnExOworICAgICAgaW5zZXJ0X0lDKGhlYWQtPnN0YXJ0LG5ldyk7CisgICAgICB0bXA9Km5ldzsKKyAgICAgIGZpeF9zaG9ydG9wKGhlYWQsbmV3KTsKKyAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgICpuZXc9dG1wOworICAgICAgbmV3LT5jaGFuZ2VfY250PW5ldy0+dXNlX2NudD0wOworICAgICAgbmV3LT5jaGFuZ2VfbGlzdD1uZXctPnVzZV9saXN0PTA7CisgICAgICBuZXctPmNvZGU9QUREOworICAgICAgaW5zZXJ0X0lDKGhlYWQtPnN0YXJ0LG5ldyk7CisgICAgICBuZXctPmNoYW5nZV9jbnQ9bmV3LT51c2VfY250PTA7CisgICAgICBuZXctPmNoYW5nZV9saXN0PW5ldy0+dXNlX2xpc3Q9MDsKKyAgICAgIGlmKGNvZGU9PUJMVHx8Y29kZT09QkdUKXsKKwluZXc9bmV3X0lDKCk7CisJKm5ldz0qaGVhZC0+c3RhcnQtPm5leHQ7CisJbmV3LT5jaGFuZ2VfY250PW5ldy0+dXNlX2NudD0wOworCW5ldy0+Y2hhbmdlX2xpc3Q9bmV3LT51c2VfbGlzdD0wOworCW5ldy0+Y29kZT1TVUI7CisJZ3ZhbC52bWF4PWwyem0oMUwpOworCWV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKKwlpbnNlcnRfY29uc3QoJm5ldy0+cTIudmFsLG5ldy0+dHlwZik7CisJaW5zZXJ0X0lDKGhlYWQtPnN0YXJ0LG5ldyk7CisgICAgICB9CisgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICAqbmV3PXRtcDsKKyAgICAgIG5ldy0+Y2hhbmdlX2NudD1uZXctPnVzZV9jbnQ9MDsKKyAgICAgIG5ldy0+Y2hhbmdlX2xpc3Q9bmV3LT51c2VfbGlzdD0wOworICAgICAgbmV3LT5jb2RlPVNVQjsKKyAgICAgIGlmKHQ9PSZ0cHRyZGlmZikKKwluZXctPmNvZGU9U1VCUEZQOworCisgICAgICBpZighY29tcGFyZV9vYmpzKCZpbmQtPnosJmNtcC0+cTEsbmV3LT50eXBmKSl7CisJaWYoY29kZT09QkxUfHxjb2RlPT1CTEUpeworCSAgbmV3LT5xMT1jbXAtPnEyO25ldy0+cTI9aW5kLT56OworCX1lbHNleworCSAgbmV3LT5xMj1jbXAtPnEyO25ldy0+cTE9aW5kLT56OworCX0KKyAgICAgIH1lbHNleworCWlmKGNvZGU9PUJMVHx8Y29kZT09QkxFKXsKKwkgIG5ldy0+cTE9Y21wLT5xMTtuZXctPnEyPWluZC0+ejsKKwl9ZWxzZXsKKwkgIG5ldy0+cTI9Y21wLT5xMTtuZXctPnExPWluZC0+ejsKKwl9CisgICAgICB9CisjaWYgMAorICAgICAgaWYoaW5kLT5jb2RlPT1TVUIpeworCW9iaiBvOworCW89bmV3LT5xMTtuZXctPnExPW5ldy0+cTI7bmV3LT5xMj1vOworICAgICAgfQorI2VuZGlmCisgICAgICBpZighbmV3LT5xMS5mbGFncyl7CisJaWYoIW5ldy0+cTIuZmxhZ3MpIGllcnJvcigwKTsKKwluZXctPnExLmZsYWdzPUtPTlNUOworCWd2YWwudm1heD1sMnptKDBMKTsKKwlldmFsX2NvbnN0KCZndmFsLG5ldy0+dHlwZik7CisJaW5zZXJ0X2NvbnN0KCZuZXctPnExLnZhbCxuZXctPnR5cGYpOworICAgICAgfQorICAgICAgaWYoIW5ldy0+cTIuZmxhZ3MpeworCWlmKCFuZXctPnExLmZsYWdzKSBpZXJyb3IoMCk7CisJbmV3LT5xMi5mbGFncz1LT05TVDsKKwlndmFsLnZtYXg9bDJ6bSgwTCk7CisJZXZhbF9jb25zdCgmZ3ZhbCxuZXctPnR5cGYpOworCisJaW5zZXJ0X2NvbnN0KCZuZXctPnEyLnZhbCxuZXctPnR5cGYpOworICAgICAgfQorICAgICAgaW5zZXJ0X0lDKGhlYWQtPnN0YXJ0LG5ldyk7CisgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICAqbmV3PSptYzsKKyAgICAgIG5ldy0+Y2hhbmdlX2NudD1uZXctPnVzZV9jbnQ9MDsKKyAgICAgIG5ldy0+Y2hhbmdlX2xpc3Q9bmV3LT51c2VfbGlzdD0wOworICAgICAgbmV3LT50eXBmPW91dCsxOworICAgICAgaW5zZXJ0X0lDKGhlYWQtPnN0YXJ0LG5ldyk7CisgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICAqbmV3PSpjbXA7IG5ldy0+Y2hhbmdlX2NudD1uZXctPnVzZV9jbnQ9MDsKKyAgICAgIG5ldy0+Y2hhbmdlX2xpc3Q9bmV3LT51c2VfbGlzdD0wOworICAgICAgaW5zZXJ0X0lDKGhlYWQtPnN0YXJ0LG5ldyk7CisgICAgICBpZigoZmxhZ3MmKElORF9PTkxZX0NPVU5UU3xNVUxUSVBMRV9FWElUUykpPT1JTkRfT05MWV9DT1VOVFMpeworCWlmKCEoaW5kLT5xMi5mbGFncyZLT05TVCkpIGllcnJvcigwKTsKKwljb3B5X2NvZGUoc3RhcnQtPnN0YXJ0LT5uZXh0LGNtcC0+cHJldixzdGFydC0+c3RhcnQsdW5yb2xsLTEsaW5kKTsKKwlldmFsX2NvbnN0KCZpbmQtPnEyLnZhbCxpbmQtPnR5cGYpOworCWlmKGluZC0+dHlwZiZVTlNJR05FRCl7CisJICBndmFsLnZ1bWF4PXp1bW11bHQodnVtYXgsdWwyenVtKCh1bnNpZ25lZCBsb25nKSh1bnJvbGwpKSk7CisJICBldmFsX2NvbnN0KCZndmFsLChVTlNJR05FRHxNQVhJTlQpKTsKKwl9ZWxzZXsKKwkgIGd2YWwudnVtYXg9enVtbXVsdCh2dW1heCx1bDJ6dW0oKHVuc2lnbmVkIGxvbmcpKHVucm9sbCkpKTsKKwkgIGV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKKwl9CisJaW5zZXJ0X2NvbnN0KCZpbmQtPnEyLnZhbCxpbmQtPnR5cGYpOwkJCisJY2hhbmdlZHw9MjsKKyAgICAgIH1lbHNleworCWNvcHlfY29kZShzdGFydC0+c3RhcnQtPm5leHQsY21wLT5wcmV2LHN0YXJ0LT5zdGFydCx1bnJvbGwtMSwwKTsKKwljaGFuZ2VkfD0yOworICAgICAgfQorICAgICAgZGl2LT50eXBmfD1VTlNJR05FRDsKKyAgICB9CisgICAgaWYoZmxhZ3MmVU5ST0xMX1JFVkVSU0UpeworICAgICAgSUMgKm5ldywqbWM7IFZhciAqdjsgaW50IG91dD0rK2xhYmVsLGNvZGU7CisgICAgICBsb25nIGk7IHR5cGUgKnQ7c3RhdGljIHR5cGUgdHB0cmRpZmY9ezB9OworICAgICAgSUMgdG1wOworICAgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJyZXZlcnNpbmcgbG9vcFxuIik7CisgICAgICBpZihJU1BPSU5URVIoY21wLT50eXBmKSl7CisJdHB0cmRpZmYuZmxhZ3M9UFRSRElGRl9UKGNtcC0+dHlwZik7CisJdD0mdHB0cmRpZmY7CisgICAgICB9ZWxzZXsKKwlpZihjbXAtPnExLmZsYWdzJlZBUikKKwkgIHQ9Y21wLT5xMS52LT52dHlwOworCWVsc2UKKwkgIHQ9Y21wLT5xMi52LT52dHlwOworICAgICAgfQorICAgICAgdj1hZGRfdG1wX3ZhcihjbG9uZV90eXAodCkpOworICAgICAgbmV3PW5ld19JQygpOworICAgICAgKm5ldz0qaW5kOworICAgICAgbmV3LT5jb2RlPVNVQjsKKyAgICAgIG5ldy0+dHlwZj10LT5mbGFnczsKKyAgICAgIG5ldy0+Y2hhbmdlX2NudD1uZXctPnVzZV9jbnQ9MDsKKyAgICAgIG5ldy0+Y2hhbmdlX2xpc3Q9bmV3LT51c2VfbGlzdD0wOworICAgICAgbmV3LT5xMS5mbGFncz1WQVI7CisgICAgICBuZXctPnExLnY9djsKKyAgICAgIG5ldy0+cTEudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICBuZXctPno9bmV3LT5xMTsKKyAgICAgIG5ldy0+cTIuZmxhZ3M9S09OU1Q7CisgICAgICBndmFsLnZtYXg9bDJ6bSgxTCk7CisgICAgICBldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CisgICAgICBpbnNlcnRfY29uc3QoJm5ldy0+cTIudmFsLG5ldy0+dHlwZik7CisgICAgICBpbnNlcnRfSUMoY21wLT5wcmV2LG5ldyk7CisgICAgICBjb2RlPWJyYW5jaC0+Y29kZTsKKyNpZiBIQVZFX1dBTlRCTkUKKyAgICAgIGJyYW5jaC0+Y29kZT1CTkU7CisjZWxzZQorICAgICAgYnJhbmNoLT5jb2RlPUJHVDsKKyNlbmRpZgorICAgICAgLyogIER1cmNobGFldWZlIGJlcmVjaG5lbi4gICAgKi8KKyAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgICpuZXc9KmluZDsKKyAgICAgIG5ldy0+Y2hhbmdlX2NudD1uZXctPnVzZV9jbnQ9MDsKKyAgICAgIG5ldy0+Y2hhbmdlX2xpc3Q9bmV3LT51c2VfbGlzdD0wOworICAgICAgbmV3LT5jb2RlPURJVjsKKyAgICAgIGRpdj1uZXc7CisgICAgICBuZXctPnExLmZsYWdzPVZBUjsKKyAgICAgIG5ldy0+cTEudj12OworICAgICAgbmV3LT5xMS52YWwudm1heD1sMnptKDBMKTsKKyAgICAgIG5ldy0+ej1uZXctPnExOworICAgICAgaW5zZXJ0X0lDKGhlYWQtPnN0YXJ0LG5ldyk7CisgICAgICB0bXA9Km5ldzsKKyAgICAgIGZpeF9zaG9ydG9wKGhlYWQsbmV3KTsKKyAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgICpuZXc9dG1wOworICAgICAgbmV3LT5jaGFuZ2VfY250PW5ldy0+dXNlX2NudD0wOworICAgICAgbmV3LT5jaGFuZ2VfbGlzdD1uZXctPnVzZV9saXN0PTA7CisgICAgICBuZXctPmNvZGU9QUREOworICAgICAgaW5zZXJ0X0lDKGhlYWQtPnN0YXJ0LG5ldyk7CisgICAgICBuZXctPmNoYW5nZV9jbnQ9bmV3LT51c2VfY250PTA7CisgICAgICBuZXctPmNoYW5nZV9saXN0PW5ldy0+dXNlX2xpc3Q9MDsKKyAgICAgIGlmKGNvZGU9PUJMVHx8Y29kZT09QkdUfHxjb2RlPT1CTkUpeworCUlDICphPWhlYWQtPnN0YXJ0LT5uZXh0OworCWd2YWwudm1heD1sMnptKDFMKTsKKwlldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CisJaW5zZXJ0X2NvbnN0KCZndmFsLGEtPnR5cGYpOworCWNhbGMoU1VCLGEtPnR5cGYsJmEtPnEyLnZhbCwmZ3ZhbCwmYS0+cTIudmFsLDApOworICAgICAgfQorICAgICAgbmV3PW5ld19JQygpOworICAgICAgKm5ldz10bXA7CisgICAgICBuZXctPmNoYW5nZV9jbnQ9bmV3LT51c2VfY250PTA7CisgICAgICBuZXctPmNoYW5nZV9saXN0PW5ldy0+dXNlX2xpc3Q9MDsKKyAgICAgIG5ldy0+Y29kZT1TVUI7CisgICAgICBpZih0PT0mdHB0cmRpZmYpCisJbmV3LT5jb2RlPVNVQlBGUDsKKworICAgICAgaWYoIWNvbXBhcmVfb2JqcygmaW5kLT56LCZjbXAtPnExLG5ldy0+dHlwZikpeworCWlmKGNvZGU9PUJMVHx8Y29kZT09QkxFfHwoY29kZT09Qk5FJiYoaW5kLT5jb2RlPT1BRER8fGluZC0+Y29kZT09QURESTJQKSkpeworCSAgbmV3LT5xMT1jbXAtPnEyO25ldy0+cTI9aW5kLT56OworCX1lbHNleworCSAgbmV3LT5xMj1jbXAtPnEyO25ldy0+cTE9aW5kLT56OworCX0KKyAgICAgIH1lbHNleworCWlmKGNvZGU9PUJMVHx8Y29kZT09QkxFfHwoY29kZT09Qk5FJiYoaW5kLT5jb2RlPT1BRER8fGluZC0+Y29kZT09QURESTJQKSkpeworCSAgbmV3LT5xMT1jbXAtPnExO25ldy0+cTI9aW5kLT56OworCX1lbHNleworCSAgbmV3LT5xMj1jbXAtPnExO25ldy0+cTE9aW5kLT56OworCX0KKyAgICAgIH0KKyNpZiAwCisgICAgICBpZihpbmQtPmNvZGU9PVNVQil7CisJb2JqIG87CisJbz1uZXctPnExO25ldy0+cTE9bmV3LT5xMjtuZXctPnEyPW87CisgICAgICB9CisjZW5kaWYKKyAgICAgIGlmKCFuZXctPnExLmZsYWdzfHwhbmV3LT5xMi5mbGFncykgaWVycm9yKDApOworICAgICAgaW5zZXJ0X0lDKGhlYWQtPnN0YXJ0LG5ldyk7CisgICAgICBjbXAtPmNvZGU9VEVTVDsKKyAgICAgIGNtcC0+cTEuZmxhZ3M9VkFSOworICAgICAgY21wLT5xMS52PXY7CisgICAgICBjbXAtPnExLnZhbC52bWF4PWwyem0oMEwpOworICAgICAgY21wLT5xMi5mbGFncz0wOworICAgICAgZGl2LT50eXBmfD1VTlNJR05FRDsKKyAgICAgIGNoYW5nZWR8PTI7CisgICAgfQorICAgIGZpcnN0X3VyPW0tPm5leHQ7CisgICAgZnJlZShtKTsKKyAgfQorICByZXR1cm4gY2hhbmdlZDsKK30KKwordm9pZCB1bnJvbGwoZmxvd2dyYXBoICpzdGFydCxmbG93Z3JhcGggKmhlYWQpCisvKiAgVmVyc3VjaHQgbG9vcC11bnJvbGxpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBmbG93bGlzdCAqbHA7Zmxvd2dyYXBoICplbmQsKmc7SUMgKnAsKm0sKmJyYW5jaCwqY21wOworICBvYmogKm8sKmUsKmNjOyB1bmlvbiBhdHlwcyBpbml0X3ZhbCxlbmRfdmFsLHN0ZXBfdmFsOworICBidnR5cGUgKnRtcDsKKyAgbG9uZyBkaXN0LHN0ZXAsaWNfY250LG4sc21hbGxfdHlwZTsKKyAgaW50IGJmbGFnPTAsdD0wLGksZmxhZ3M9MDsgLyogMTogc3ViLCAyOiBpbml0X3ZhbCBnZWZ1bmRlbiAgKi8KKyAgaW50IGluZF9vbmx5X2NvdW50cyxtdWx0aXBsZV9leGl0cyxjZmw7CisgIGVuZD1zdGFydC0+bG9vcGVuZDsKKyAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJjaGVja2luZyBmb3IgcG9zc2libGUgdW5yb2xsaW5nIGZyb20gJWQgdG8gJWRcbiIsc3RhcnQtPmluZGV4LGVuZC0+aW5kZXgpOworICBpZihlbmQtPmVuZC0+Y29kZT09QlJBKXsKKyAgICBpZihERUJVRyYxMDI0KSBwcmludGYoImxvb3AgZW5kcyB3aXRoIEJSQVxuIik7CisgICAgcmV0dXJuOworICB9CisgIGZvcihscD1zdGFydC0+aW47bHA7bHA9bHAtPm5leHQpCisgICAgaWYobHAtPmdyYXBoLT5pbmRleD5zdGFydC0+aW5kZXgmJmxwLT5ncmFwaC0+aW5kZXg8PWVuZC0+aW5kZXgmJmxwLT5ncmFwaCE9ZW5kKSByZXR1cm47CisgIGlmKERFQlVHJjEwMjQpIHByaW50Zigib25seSBvbmUgYmFja3dhcmQtYnJhbmNoXG4iKTsKKyAgZT0wOyBwPWVuZC0+ZW5kOyBjZmw9MDsKKyAgZG97CisgICAgaWYocC0+Y29kZT49QkVRJiZwLT5jb2RlPEJSQSl7IGJyYW5jaD1wO2JmbGFnPXAtPmNvZGU7Y2M9JnAtPnExOyBjZmw9MTt9CisgICAgaWYocC0+Y29kZT09VEVTVCl7CisgICAgICBpZighY2ZsKSByZXR1cm47CisgICAgICBpZihjb21wYXJlX29ianMoY2MsJnAtPnoscC0+dHlwZikpIHJldHVybjsKKyAgICAgIG89JnAtPnExO3Q9cC0+dHlwZjtjbXA9cDsKKyAgICAgIGVuZF92YWwudm1heD1sMnptKDBMKTsgZXZhbF9jb25zdCgmZW5kX3ZhbCxNQVhJTlQpOworICAgICAgaW5zZXJ0X2NvbnN0KCZlbmRfdmFsLHQpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmKHAtPmNvZGU9PUNPTVBBUkUpeworICAgICAgaWYoIWNmbCkgcmV0dXJuOworICAgICAgaWYoY29tcGFyZV9vYmpzKGNjLCZwLT56LHAtPnR5cGYpKSByZXR1cm47CisgICAgICBjbXA9cDsKKyAgICAgIGlmKHAtPnExLmZsYWdzJlZBUil7CisJaWYoaW5kX3ZhcnNbcC0+cTEudi0+aW5kZXhdKXsKKwkgIG89JnAtPnExO3Q9cC0+dHlwZjsKKwkgIGU9JnAtPnEyOworCSAgYnJlYWs7CisJfQorICAgICAgfQorICAgICAgaWYocC0+cTIuZmxhZ3MmVkFSKXsKKwlpZihpbmRfdmFyc1twLT5xMi52LT5pbmRleF0peworCSAgbz0mcC0+cTI7dD1wLT50eXBmOworCSAgZT0mcC0+cTE7CisJICBpZihiZmxhZz09QkxUKSBiZmxhZz1CR1Q7CisJICBpZihiZmxhZz09QkxFKSBiZmxhZz1CR0U7CisJICBpZihiZmxhZz09QkdUKSBiZmxhZz1CTFQ7CisJICBpZihiZmxhZz09QkdFKSBiZmxhZz1CTEU7CisJICBicmVhazsKKwl9CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHA9PWVuZC0+c3RhcnQpIHJldHVybjsKKyAgICBwPXAtPnByZXY7CisgIH13aGlsZShwKTsKKyAgaWYoIWV8fChlLT5mbGFncyZLT05TVCkpeworICAgIGlmKGUpIGVuZF92YWw9ZS0+dmFsOworICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiZW5kIGNvbmRpdGlvbiBpcyBjb25zdGFudFxuIik7CisgIH1lbHNleworICAgIGlmKCEoZS0+ZmxhZ3MmVkFSKSkgcmV0dXJuOworICAgIGk9ZS0+di0+aW5kZXg7CisgICAgaWYoZS0+ZmxhZ3MmRFJFRk9CSikgaSs9dmNvdW50LXJjb3VudDsKKyAgICBpZihERUJVRyYxMDI0KSBwcmludGYoInRlc3RpbmcgZW5kLWNvbmRpdGlvblxuIik7CisgICAgbWVtY3B5KHJkX2RlZnMsZW5kLT5yZF9pbixkc2l6ZSk7CisgICAgZm9yKG09ZW5kLT5zdGFydDttO209bS0+bmV4dCl7CisgICAgICBpZihtPT1jbXApeworCWlmKERFQlVHJjEwMjQpIHByaWMyKHN0ZG91dCxtKTsKKwlpZighZGVmX2ludmFyaWFudChpLC0xKSkgcmV0dXJuOworCWlmKERFQlVHJjEwMjQpIHByaW50ZigiZW5kIGNvbmRpdGlvbiBsb29wLWludmFyaWFudFxuIik7CisJYnJlYWs7CisgICAgICB9CisgICAgICByZF9jaGFuZ2UobSk7CisgICAgICBpZihtPT1lbmQtPmVuZCkgaWVycm9yKDApOworICAgIH0KKyAgfQorICBpZigoby0+ZmxhZ3MmKFZBUnxEUkVGT0JKKSkhPVZBUikgcmV0dXJuOworICBwPWluZF92YXJzW28tPnYtPmluZGV4XTsKKyAgaWYoIXApIHJldHVybjsKKyAgaWYoY29tcGFyZV9vYmpzKG8sJnAtPnosdCkpIHJldHVybjsKKyAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJsb29wIGNvbmRpdGlvbiBvbmx5IGRlcGVuZGFudCBvbiBpbmR1Y3Rpb24gdmFyXG4iKTsKKyAgaWYoIShwLT5xMi5mbGFncyZLT05TVCkpIHJldHVybjsKKyAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJpbmR1Y3Rpb24gaXMgY29uc3RhbnRcbiIpOworICBpbmRfb25seV9jb3VudHM9SU5EX09OTFlfQ09VTlRTOworICBtdWx0aXBsZV9leGl0cz0wOworICBmb3IoaWNfY250PTAsZz1zdGFydDtnO2c9Zy0+bm9ybWFsb3V0KXsKKyAgICBmb3IobT1nLT5zdGFydDttO209bS0+bmV4dCl7CisgICAgICBpZihtIT1wJiZtIT1jbXAmJmluZF9vbmx5X2NvdW50cyl7CisJaW50IGk7CisJZm9yKGk9MDtpPG0tPnVzZV9jbnQ7aSsrKXsKKwkgIGlmKG0tPnVzZV9saXN0W2ldLnY9PXAtPnExLnYpeworCSAgICBpZihERUJVRyYxMDI0KXtwcmludGYoInVzZSBvZiBpbmRfdmFyOiIpO3ByaWMyKHN0ZG91dCxtKTt9CisJICAgIGluZF9vbmx5X2NvdW50cz0wO2JyZWFrOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGlmKG09PXAmJiFhbHdheXNfcmVhY2hlZChzdGFydCxlbmQsZyxwLDEpKSByZXR1cm47CisgICAgICBpY19jbnQrKzsKKyAgICAgIGlmKG09PWctPmVuZCkgYnJlYWs7CisgICAgfQorICAgIGlmKGc9PWVuZCkgYnJlYWs7CisgICAgaWYoIW11bHRpcGxlX2V4aXRzJiZnLT5icmFuY2hvdXQmJihnLT5icmFuY2hvdXQtPmluZGV4PHN0YXJ0LT5pbmRleHx8Zy0+YnJhbmNob3V0LT5pbmRleD5lbmQtPmluZGV4KSkKKyAgICAgIG11bHRpcGxlX2V4aXRzPU1VTFRJUExFX0VYSVRTOworICB9CisgIGljX2NudC09MjsgIC8qICBCcmFuY2ggdW5kIFRlc3QgKi8KKyAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJpbmR1Y3Rpb24gYWx3YXlzIHJlYWNoZWRcbiIpOworICBpZihpbmRfb25seV9jb3VudHMmJihERUJVRyYxMDI0KSkgcHJpbnRmKCJpbmR1Y3Rpb24gdmFyaWFibGUgb25seSB1c2VkIGFzIGNvdW50ZXJcbiIpOworICBpZihtdWx0aXBsZV9leGl0cyYmKERFQlVHJjEwMjQpKSBwcmludGYoImxvb3AgaGFzIG11bHRpcGxlIGV4aXRzXG4iKTsKKyAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJJQ3MgaW4gbG9vcDogJWxkXG4iLGljX2NudCk7CisgIHN0ZXBfdmFsPXAtPnEyLnZhbDsKKyAgaWYocC0+Y29kZT09U1VCKSBmbGFnc3w9MTsKKyAgaWYoc3RhcnQtPnN0YXJ0LT5jb2RlPT1MQUJFTCYmKHN0YXJ0LT5zdGFydC0+ZmxhZ3MmTE9PUF9DT05EX1RSVUUpJiZlJiZpbmRfb25seV9jb3VudHMpeworICAgIGlmKGUtPmZsYWdzJktPTlNUKQorICAgICAgZXZhbF9jb25zdCgmZS0+dmFsLHQpOworICAgIGlmKCEoZS0+ZmxhZ3MmS09OU1QpfHwhem1lcXRvKHZtYXgsbDJ6bSgwTCkpfHwhenVtZXF0byh2dW1heCx1bDJ6dW0oMFVMKSl8fCF6bGRlcXRvKHZsZG91YmxlLGQyemxkKDAuMCkpKXsKKyAgICAgIGludCBiYz1icmFuY2gtPmNvZGU7CisgICAgICBldmFsX2NvbnN0KCZzdGVwX3ZhbCx0KTsKKyAgICAgIGlmKCghKGZsYWdzJjEpJiYoYmM9PUJMVHx8YmM9PUJMRSkpCisJIHx8KChmbGFncyYxKSYmKGJjPT1CR1R8fGJjPT1CR0UpKQorCSB8fChiYz09Qk5FJiZ6bWVxdG8odm1heCxsMnptKDFMKSkmJnp1bWVxdG8odnVtYXgsdWwyenVtKDFVTCkpKSl7CisJaWYoKHQmVU5TSUdORUQpfHx6bWxlcShsMnptKDBMKSx2bWF4KSl7CisJICBpZihkZWNpZGVfcmV2ZXJzZSh2bWF4KSl7CisJICAgIGFkZF91cihVTlJPTExfUkVWRVJTRXxpbmRfb25seV9jb3VudHN8bXVsdGlwbGVfZXhpdHMsMCwxLHN0YXJ0LGhlYWQsY21wLGJyYW5jaCxwKTsKKwkgICAgcmV0dXJuOworCSAgfQorCX0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIWV8fChlLT5mbGFncyZLT05TVCkpeworICAgIElDIHRtcGljOworICAgIGk9cC0+ei52LT5pbmRleDsKKyAgICBpZihwLT56LmZsYWdzJkRSRUZPQkopIGkrPXZjb3VudC1yY291bnQ7CisgICAgbWVtY3B5KHJkX2RlZnMsaGVhZC0+cmRfb3V0LGRzaXplKTsKKyAgICB0bXBpYz0qcDsKKyAgICBpZihwcm9wYWdhdGUoJnRtcGljLCZ0bXBpYy56LDEsMSkpeworICAgICAgaW5pdF92YWw9dG1waWMuei52YWw7CisgICAgfWVsc2V7CisgICAgICBnb3RvIGludjsKKyAgICB9CisgICAgaWYoREVCVUcmMTAyNCl7CisgICAgICBwcmludGYoImxvb3AgbnVtYmVyIGRldGVybWluYWJsZVxuIik7CisgICAgICBwcmludGYoImluaXRfdmFsOiAiKTtwcmludHZhbChzdGRvdXQsJmluaXRfdmFsLHQpOworICAgICAgcHJpbnRmKCJcbmVuZF92YWw6ICIpO3ByaW50dmFsKHN0ZG91dCwmZW5kX3ZhbCx0KTsKKyAgICAgIHByaW50ZigiXG5zdGVwX3ZhbDogIik7cHJpbnR2YWwoc3Rkb3V0LCZzdGVwX3ZhbCx0KTsKKyAgICAgIHByaW50ZigiXG5mbGFncz0lZCBiZmxhZz0lZFxuIixmbGFncyxiZmxhZyk7CisgICAgfQorICAgIC8qICBOdXIgaW50ZWdlcnMgYWxzIEluZHVrdGlvbnN2YXJpYWJsZW4uICAgKi8KKyAgICBpZighSVNJTlQodCkpIGdvdG8gaW52OworICAgIC8qICBEaXN0YW56IHVuZCBTdGVwIHdlcmRlbiBhbHMgbG9uZyBiZWhhbmRlbHQsIGRlc2hhbGIgcHJ1ZWZlbiwgb2IgKi8KKyAgICAvKiAgYWxsZXMgaW0gQmVyZWljaCBkZXMgZ2FyYW50aWVydGVuIE1pbmRlc3R3ZXJ0ZSBmdWVyIGxvbmcuICAgICAgICovCisgICAgLyogIFdlbm4gbWFuIGhpZXIgZGllIEFyaXRobWV0aWsgZGVyIFppZWxtYXNjaGluZSBiZW51dHplbiB3dWVyZGUsICAqLworICAgIC8qICBrb2VubnRlIG1hbiB0aGVvcmV0aXNjaCBtZWhyIEZhZWxsZSBlcmtlbm5lbiwgYWJlciBkYXMgd2FlcmUgICAgKi8KKyAgICAvKiAgcmVjaHQgcG9wZWxpZyB1bmQgbWFuIG11c3Mgc2VociBhdWZwYXNzZW4uICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYodCZVTlNJR05FRCl7CisgICAgICBldmFsX2NvbnN0KCZzdGVwX3ZhbCx0KTsKKyAgICAgIGlmKCF6dW1sZXEodnVtYXgsbDJ6bSgyMTQ3NDgzNjQ3KSkpIHJldHVybjsKKyAgICAgIHN0ZXA9enVtMnVsKHZ1bWF4KTsKKyAgICAgIGlmKGZsYWdzJjEpIHN0ZXA9LXN0ZXA7CisgICAgICBldmFsX2NvbnN0KCZlbmRfdmFsLHQpOworICAgICAgaWYoIXp1bWxlcSh2dW1heCxsMnptKDIxNDc0ODM2NDcpKSkgZ290byBpbnY7CisgICAgICBkaXN0PXp1bTJ1bCh2dW1heCk7CisgICAgICBldmFsX2NvbnN0KCZpbml0X3ZhbCx0KTsKKyAgICAgIGlmKCF6dW1sZXEodnVtYXgsbDJ6bSgyMTQ3NDgzNjQ3KSkpIGdvdG8gaW52OworICAgICAgZGlzdC09enVtMnVsKHZ1bWF4KTsKKyAgICB9ZWxzZXsKKyAgICAgIGV2YWxfY29uc3QoJnN0ZXBfdmFsLHQpOworICAgICAgaWYoIXptbGVxKHZtYXgsbDJ6bSgyMTQ3NDgzNjQ3KSkpIHJldHVybjsKKyAgICAgIGlmKHptbGVxKHZtYXgsbDJ6bSgtMjE0NzQ4MzY0NykpKSByZXR1cm47IC8qICBlaW5zIHdlbmlnZXIgYWxzIG1vZWdsaWNoIHdhZXJlICovCisgICAgICBzdGVwPXptMmwodm1heCk7CisgICAgICBpZihmbGFncyYxKSBzdGVwPS1zdGVwOworICAgICAgZXZhbF9jb25zdCgmZW5kX3ZhbCx0KTsKKyAgICAgIGlmKCF6bWxlcSh2bWF4LGwyem0oMjE0NzQ4MzY0Ny8yKSkpIGdvdG8gaW52OworICAgICAgaWYoem1sZXEodm1heCxsMnptKC0yMTQ3NDgzNjQ3LzIpKSkgZ290byBpbnY7IC8qICBlaW5zIHdlbmlnZXIgYWxzIG1vZWdsaWNoIHdhZXJlICovCisgICAgICBkaXN0PXptMmwodm1heCk7CisgICAgICBldmFsX2NvbnN0KCZpbml0X3ZhbCx0KTsKKyAgICAgIGlmKCF6bWxlcSh2bWF4LGwyem0oMjE0NzQ4MzY0Ny8yKSkpIGdvdG8gaW52OworICAgICAgaWYoem1sZXEodm1heCxsMnptKC0yMTQ3NDgzNjQ3LzIpKSkgZ290byBpbnY7IC8qICBlaW5zIHdlbmlnZXIgYWxzIG1vZWdsaWNoIHdhZXJlICovCisgICAgICBkaXN0LT16bTJsKHZtYXgpOworICAgIH0KKyAgICBpZihERUJVRyYxMDI0KSBwcmludGYoImRpc3Q9JWxkLCBzdGVwPSVsZFxuIixkaXN0LHN0ZXApOworICAgIGlmKHN0ZXA9PTApIGllcnJvcigwKTsKKyAgICAvKiAgRGllIEZhZWxsZSBrYW5uIG1hbiBub2NoIGdlbmF1ZXIgdW50ZXJzdWNoZW4sIG9iIGRpZSBTY2hsZWlmZSAgICovCisgICAgLyogIGV2dGwuIG51ciBlaW5tYWwgZHVyY2hsYXVmZW4gd2lyZCBvLmFlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmKHN0ZXA8MCYmZGlzdD49MCl7CisgICAgICBpZihyZXBvcnRfc3VzcGljaW91c19sb29wcyl7IGVycm9yKDIwOCk7cmVwb3J0X3N1c3BpY2lvdXNfbG9vcHM9MDt9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHN0ZXA+MCYmZGlzdDw9MCl7CisgICAgICBpZihyZXBvcnRfc3VzcGljaW91c19sb29wcyl7IGVycm9yKDIwOCk7cmVwb3J0X3N1c3BpY2lvdXNfbG9vcHM9MDt9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKGJmbGFnPT1CRVEpeworICAgICAgaWYocmVwb3J0X3N1c3BpY2lvdXNfbG9vcHMpeyBlcnJvcigyMDgpO3JlcG9ydF9zdXNwaWNpb3VzX2xvb3BzPTA7fQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiAgQXVmcGFzc2VuLCBvYiBkYXMgU2NobGVpZmVuZW5kZSBiZWkgQk5FIGF1Y2ggZ2V0cm9mZmVuIHdpcmQuICAgICovCisgICAgaWYoYmZsYWc9PUJORSl7CisgICAgICBpZihkaXN0JXN0ZXApeworCWlmKHJlcG9ydF9zdXNwaWNpb3VzX2xvb3BzKXsgZXJyb3IoMjA4KTtyZXBvcnRfc3VzcGljaW91c19sb29wcz0wO30KKwlyZXR1cm47CisgICAgICB9CisgICAgfQorICAgIGlmKGJmbGFnPT1CTFR8fGJmbGFnPT1CR1R8fGJmbGFnPT1CTkUpeworICAgICAgaWYoc3RlcD4wKSBkaXN0LS07IGVsc2UgZGlzdCsrOworICAgIH0KKyAgICBpZihkaXN0L3N0ZXA8MCkgaWVycm9yKDApOworICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigibG9vcCBpcyBleGVjdXRlZCAlbGQgdGltZXNcbiIsZGlzdC9zdGVwKzEpOworICAgIGlmKHN0YXJ0LT5zdGFydC0+Y29kZSE9TEFCRUwpIGllcnJvcigwKTsKKworICAgIC8qIGRldGVybWluZSBzbWFsbGVzdCB0eXBlIGZvciBpbmR1Y3Rpb24gdmFyaWFibGUgKi8KKyAgICBzbWFsbF90eXBlPShVTlNJR05FRHxDSEFSKTsKKyAgICBldmFsX2NvbnN0KCZpbml0X3ZhbCx0KTsKKyAgICBpZighKHQmVU5TSUdORUQpJiYhem1sZXEoWjAsdm1heCkpeworICAgICAgc21hbGxfdHlwZSY9flVOU0lHTkVEOworICAgICAgd2hpbGUoKHNtYWxsX3R5cGUmTlEpPCh0Jk5RKSYmKCF6bWxlcSh0X21pbihzbWFsbF90eXBlKSx2bWF4KXx8IXNob3J0Y3V0KEFERCxzbWFsbF90eXBlKXx8IXNob3J0Y3V0KENPTVBBUkUsc21hbGxfdHlwZSkpKQorCXNtYWxsX3R5cGUrKzsKKyAgICB9ZWxzZXsKKyAgICAgIHdoaWxlKChzbWFsbF90eXBlJk5RKTwodCZOUSkmJighenVtbGVxKHZ1bWF4LHRfbWF4KHNtYWxsX3R5cGUpKXx8IXNob3J0Y3V0KEFERCxzbWFsbF90eXBlKXx8IXNob3J0Y3V0KENPTVBBUkUsc21hbGxfdHlwZSkpKQorCXNtYWxsX3R5cGUrKzsKKyAgICB9CisgICAgZXZhbF9jb25zdCgmZW5kX3ZhbCx0KTsKKyAgICBpZighKHQmVU5TSUdORUQpJiYhem1sZXEoWjAsdm1heCkpeworICAgICAgc21hbGxfdHlwZSY9flVOU0lHTkVEOworICAgICAgd2hpbGUoKHNtYWxsX3R5cGUmTlEpPCh0Jk5RKSYmKCF6bWxlcSh0X21pbihzbWFsbF90eXBlKSx2bWF4KXx8IXNob3J0Y3V0KEFERCxzbWFsbF90eXBlKXx8IXNob3J0Y3V0KENPTVBBUkUsc21hbGxfdHlwZSkpKQorCXNtYWxsX3R5cGUrKzsKKyAgICB9ZWxzZXsKKyAgICAgIHdoaWxlKChzbWFsbF90eXBlJk5RKTwodCZOUSkmJighenVtbGVxKHZ1bWF4LHRfbWF4KHNtYWxsX3R5cGUpKXx8IXNob3J0Y3V0KEFERCxzbWFsbF90eXBlKXx8IXNob3J0Y3V0KENPTVBBUkUsc21hbGxfdHlwZSkpKQorCXNtYWxsX3R5cGUrKzsKKyAgICB9CisgICAgaWYoem1sZXEoc2l6ZXRhYlt0Jk5RXSxzaXpldGFiW3NtYWxsX3R5cGUmTlFdKSkKKyAgICAgIHNtYWxsX3R5cGU9MDsKKyAgICBpZihzbWFsbF90eXBlJiYoREVCVUcmMTAyNCkpIHByaW50ZigiaW5kdWN0aW9uIHZhcmlhYmxlIGNhbiBiZSBkb25lIGluICVzICVzXG4iLChzbWFsbF90eXBlJlVOU0lHTkVEKT8idW5zaWduZWQiOiJzaWduZWQiLHR5cG5hbWVbc21hbGxfdHlwZSZOUV0pOworICAgIGlmKHJhbmdlX29wdCYmc21hbGxfdHlwZSYmZGVjaWRlX3Nob3J0ZW4oc21hbGxfdHlwZSxzdGFydCxwLGNtcCkpeworICAgICAgYWRkX3VyKFVOUk9MTF9TSE9SVEVOfGluZF9vbmx5X2NvdW50c3xtdWx0aXBsZV9leGl0cyxzbWFsbF90eXBlLHNtYWxsX3R5cGUsc3RhcnQsaGVhZCxjbXAsYnJhbmNoLHApOworICAgIH1lbHNlIGlmKGRpc3Qvc3RlcCsxPT0xfHxpY19jbnQqKGRpc3Qvc3RlcCsxKTw9dW5yb2xsX3NpemUpeworICAgICAgLyogIFNjaGxlaWZlIGtvbXBsZXR0IGF1c3JvbGxlbi4gICAgKi8KKyAgICAgIGFkZF91cihVTlJPTExfQ09NUExFVEVMWXxpbmRfb25seV9jb3VudHN8bXVsdGlwbGVfZXhpdHMsZGlzdC9zdGVwKzEsZGlzdC9zdGVwKzEsc3RhcnQsaGVhZCxjbXAsYnJhbmNoLHApOworICAgIH1lbHNleworICAgICAgLyogIFNjaGxlaWZlIHRlaWx3ZWlzZSBhdXNyb2xsZW4uICAgKi8KKyAgICAgIG49KHVucm9sbF9zaXplLWljX2NudC0yKS8oMippY19jbnQpOworICAgICAgaWYobj4wKQorCWFkZF91cihVTlJPTExfTU9EVUxPfGluZF9vbmx5X2NvdW50c3xtdWx0aXBsZV9leGl0cyxkaXN0L3N0ZXArMSxuLHN0YXJ0LGhlYWQsY21wLGJyYW5jaCxwKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgaW52OgorICAvKiAgQW56YWhsIGRlciBTY2hsZWlmZW5kdXJjaGxhZXVmZSBrYW5uIGJlaW0gRWludHJpdHQgaW4gZGllICAgKi8KKyAgLyogIFNjaGxlaWZlIHp1ciBMYXVmemVpdCBiZXJlY2huZXQgd2VyZGVuLiAgICAgICAgICAgICAgICAgICAgICovCisgIGlmKCEocC0+cTIuZmxhZ3MmS09OU1QpKSByZXR1cm47CisgIGlmKHQmVU5TSUdORUQpeworICAgIGV2YWxfY29uc3QoJnN0ZXBfdmFsLHQpOworICAgIGlmKCF6dW1sZXEodnVtYXgsbDJ6bSgyMTQ3NDgzNjQ3KSkpIHJldHVybjsKKyAgICBzdGVwPXp1bTJ1bCh2dW1heCk7CisgICAgaWYoZmxhZ3MmMSkgc3RlcD0tc3RlcDsKKyAgfWVsc2V7CisgICAgZXZhbF9jb25zdCgmc3RlcF92YWwsdCk7CisgICAgaWYoIXptbGVxKHZtYXgsbDJ6bSgyMTQ3NDgzNjQ3KSkpIHJldHVybjsKKyAgICBpZih6bWxlcSh2bWF4LGwyem0oMCkpKSByZXR1cm47IC8qIGdpYnQgUHJvYmxlbWUgKi8KKyAgICBzdGVwPXptMmwodm1heCk7CisgICAgaWYoZmxhZ3MmMSkgc3RlcD0tc3RlcDsKKyAgfQorICBpZighY29tcGFyZV9vYmpzKCZjbXAtPnExLCZwLT56LHQpKXsKKyAgICBpZihzdGVwPjAmJihicmFuY2gtPmNvZGU9PUJHVHx8YnJhbmNoLT5jb2RlPT1CR0UpKXsKKyAgICAgIGlmKHJlcG9ydF9zdXNwaWNpb3VzX2xvb3BzKXsgZXJyb3IoMjA4KTtyZXBvcnRfc3VzcGljaW91c19sb29wcz0wO30KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoc3RlcDwwJiYoYnJhbmNoLT5jb2RlPT1CTFR8fGJyYW5jaC0+Y29kZT09QkxFKSl7CisgICAgICBpZihyZXBvcnRfc3VzcGljaW91c19sb29wcyl7IGVycm9yKDIwOCk7cmVwb3J0X3N1c3BpY2lvdXNfbG9vcHM9MDt9CisgICAgICByZXR1cm47CisgICAgfQorICB9ZWxzZXsKKyAgICBpZihzdGVwPDAmJihicmFuY2gtPmNvZGU9PUJHVHx8YnJhbmNoLT5jb2RlPT1CR0UpKXsKKyAgICAgIGlmKHJlcG9ydF9zdXNwaWNpb3VzX2xvb3BzKXsgZXJyb3IoMjA4KTtyZXBvcnRfc3VzcGljaW91c19sb29wcz0wO30KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoc3RlcD4wJiYoYnJhbmNoLT5jb2RlPT1CTFR8fGJyYW5jaC0+Y29kZT09QkxFKSl7CisgICAgICBpZihyZXBvcnRfc3VzcGljaW91c19sb29wcyl7IGVycm9yKDIwOCk7cmVwb3J0X3N1c3BpY2lvdXNfbG9vcHM9MDt9CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGlmKCF1bnJvbGxfYWxsKSByZXR1cm47CisgIGlmKGJmbGFnIT1CRVEmJmJmbGFnIT1CTkUpeworICAgIGlmKHVucm9sbF9zaXplPj04KmljX2NudCs4KQorICAgICAgYWRkX3VyKFVOUk9MTF9JTlZBUklBTlR8aW5kX29ubHlfY291bnRzfG11bHRpcGxlX2V4aXRzLDAsOCxzdGFydCxoZWFkLGNtcCxicmFuY2gscCk7CisgICAgZWxzZSBpZih1bnJvbGxfc2l6ZT49NCppY19jbnQrNCkKKyAgICAgIGFkZF91cihVTlJPTExfSU5WQVJJQU5UfGluZF9vbmx5X2NvdW50c3xtdWx0aXBsZV9leGl0cywwLDQsc3RhcnQsaGVhZCxjbXAsYnJhbmNoLHApOworICAgIGVsc2UgaWYodW5yb2xsX3NpemU+PTQqaWNfY250KzIpCisgICAgICBhZGRfdXIoVU5ST0xMX0lOVkFSSUFOVHxpbmRfb25seV9jb3VudHN8bXVsdGlwbGVfZXhpdHMsMCwyLHN0YXJ0LGhlYWQsY21wLGJyYW5jaCxwKTsKKyAgICByZXR1cm47CisgIH0KK30KKworaW50IGxvb3Bfb3B0aW1pemF0aW9ucyhmbG93Z3JhcGggKmZnKQorLyogIHN0ZXVlcnQgT3B0aW1pZXJ1bmdlbiBpbiBTY2hsZWlmZW4gICovCit7CisgIGludCBjaGFuZ2VkPTAsaTsKKyAgZmxvd2dyYXBoICpnLCpsYXN0OworICBpZihERUJVRyYxMDI0KSBwcmludF9mbG93Z3JhcGgoZmcpOworICBpZihsb29wcyhmZywwKT09MCkgcmV0dXJuIDA7CisgIGlmKERFQlVHJjEwMjQpIHByaW50X2Zsb3dncmFwaChmZyk7CisgIGZpcnN0X2ZnPWZnPWNyZWF0ZV9sb29wX2hlYWRlcnMoZmcsMCk7CisgIGlmKERFQlVHJjEwMjQpIHByaW50X2Zsb3dncmFwaChmZyk7CisgIG51bV9kZWZzKCk7CisKKyAgLypic2l6ZT0oYmFzaWNfYmxvY2tzK0NIQVJfQklUKS9DSEFSX0JJVDsqLworICBic2l6ZT1CVlNJWkUoYmFzaWNfYmxvY2tzKzEpOworICBmZ190bXA9bXltYWxsb2MoYnNpemUpOworICBpbmRfdmFycz1teW1hbGxvYyh2Y291bnQqc2l6ZW9mKCppbmRfdmFycykpOworICBpbnZhcmlhbnQ9bXltYWxsb2MoZHNpemUpOworICBpbmxvb3A9bXltYWxsb2MoZHNpemUpOworICByZF9kZWZzPW15bWFsbG9jKGRzaXplKTsKKyAgcmVhY2hpbmdfZGVmaW5pdGlvbnMoZmcpOworICBpZihERUJVRyYxMDI0KSBwcmludF9mbG93Z3JhcGgoZmcpOworICBtb3ZlZD1teW1hbGxvYyhkc2l6ZSk7CisgIG1lbXNldChtb3ZlZCwwLGRzaXplKTsKKyAgbW92ZWRfY29tcGxldGVseT1teW1hbGxvYyhkc2l6ZSk7CisgIG1lbXNldChtb3ZlZF9jb21wbGV0ZWx5LDAsZHNpemUpOworICBub3RfbW92YWJsZT1teW1hbGxvYyhkc2l6ZSk7CisKKyAgZmlyc3RfbW92PWxhc3RfbW92PTA7CisgIGZpcnN0X3NyPWxhc3Rfc3I9MDsKKworICBmb3IobGFzdD0wLGc9Zmc7ZztnPWctPm5vcm1hbG91dCl7CisgICAgaWYoZy0+bG9vcGVuZCl7CisgICAgICBmcmVxdWVuY3lfcmVkdWN0aW9uKGcsZy0+bG9vcGVuZCxsYXN0KTsKKyAgICAgIHN0cmVuZ3RoX3JlZHVjdGlvbihnLGctPmxvb3BlbmQsbGFzdCk7CisgICAgICBpZihvcHRmbGFncyYyMDQ4KSB1bnJvbGwoZyxsYXN0KTsKKyAgICB9CisgICAgbGFzdD1nOworICB9CisKKyAgZnJlZShyZF9tYXRyaXgpOworICBmcmVlKHZhcl9kZWZzKTsKKyAgZnJlZShkZWZzX2tpbGwpOworICBmcmVlKGRlZnNfZ2VuKTsKKyAgZnJlZShkbGlzdCk7CisgIGZyZWUocmRfZGVmcyk7CisgIGZyZWUoaW52YXJpYW50KTsKKyAgZnJlZShpbmxvb3ApOworICBjaGFuZ2VkfD1tb3ZlX3RvX2hlYWQoKTsKKyAgaWYoREVCVUcmMTAyNCkgcHV0cygiZG9uZSIpOworICBpZihyYW5nZV9vcHQpCisgICAgY2hhbmdlZHw9ZG9fc2hvcnRlbigpOworICBjaGFuZ2VkfD1kb19zcihjaGFuZ2VkKTsKKyAgaWYoREVCVUcmMTAyNCkgcHV0cygiZG9uZSIpOworICBjaGFuZ2VkfD1kb191bnJvbGwoY2hhbmdlZCk7CisgIGlmKERFQlVHJjEwMjQpIHB1dHMoImRvbmUiKTsKKyAgZnJlZShtb3ZlZCk7CisgIGZyZWUobm90X21vdmFibGUpOworICBmcmVlKG1vdmVkX2NvbXBsZXRlbHkpOworICBpZihERUJVRyYxMDI0KSBwdXRzKCI0Iik7CisgIGlmKGNoYW5nZWQmMil7CisgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJtdXN0IHJlcGVhdCBudW1fdmFyc1xuIik7CisgICAgZnJlZSh2aWxpc3QpOworICAgIGZyZWUoYXZfZ2xvYmFscyk7ZnJlZShhdl9zdGF0aWNzKTsKKyAgICBmcmVlKGF2X2RyZWZzKTtmcmVlKGF2X2FkZHJlc3MpOworICAgIG51bV92YXJzKCk7CisgIH0KKworICBmcmVlKGluZF92YXJzKTsKKyAgZnJlZShmZ190bXApOworCisgIHJldHVybiBjaGFuZ2VkOworfQorCmRpZmYgLS1naXQgYS9tYWNoaW5lcy82NTAyL2NvbXByZXNzLmMgYi9tYWNoaW5lcy82NTAyL2NvbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI5NTIyOQotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzLzY1MDIvY29tcHJlc3MuYwpAQCAtMCwwICsxLDEyNyBAQAorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgInZjcHIuaCIKKworCitjb25zdCBjaGFyIHRnX2NvcHlyaWdodFtdPSI2NTAyIGNvZGUgY29tcHJlc3NvciBWMC4xIChjKSAyMDIwIGJ5IFZvbGtlciBCYXJ0aGVsbWFubiI7CisKK2NoYXIgKmluc3RbXT17CisgICJsZGEiLCJsZHgiLCJzdGEiLCJzdHgiLCJsZHkiLCJzdHkiLCJsZHoiLCJzdHoiLCJsZHEiLCJzdHEiLAorICAiYWRjIiwic2JjIiwiYW5kIiwib3JhIiwiZW9yIiwiYWRjcSIsInNiY3EiLCJhbmRxIiwib3JhcSIsImVvcnEiLAorICAiYm5lIiwiYmVxIiwiYmNjIiwiYmNzIiwiYnZzIiwiYnZjIiwiYnBsIiwiYm1pIiwiYnJhIiwKKyAgImNsYyIsInNlYyIsCisgIC8qInBsYSIsInBoYSIsKi8KKyAgInR4YSIsInRheCIsInR5YSIsInRheSIsInR6YSIsInRheiIsCisgICJpbmMiLCJkZWMiLCJkZXgiLCJpbngiLCJpbnkiLCJkZXkiLCJpbnoiLCJkZXoiLCJpbnciLCJkZXciLCJwdXNoIiwKKyAgLyoicnRzIiwicnRpIiwqLyJqc3IiLCJqbXAiLAorICAiY21wIiwiY3B4IiwiY3B5IiwKKyAgImFzbCIsImxzciIsInJvciIsInJvbCIsImFzdyIsImFzbHEiLCJsc3JxIiwiYXNyIiwiYXNycSIKK307CisKK2ludCBtaW5zYXZlPTU7CisKK3ZvaWQgcGFyc2VfbGluZShjaGFyICpzLGxpbmUgKnApCit7CisgIGludCBsLGk7CisgIHN0YXRpYyBpbnQgc2Vjb2s9MDsKKyAgY2hhciBidWZbMTZdLGJ1ZjJbMTZdLCplOworCisgIGlmKHNzY2FuZihzLCIgJThzICU4cyIsYnVmLGJ1ZjIpPT0yJiYhc3RyY21wKGJ1Ziwic2VjdGlvbiIpKXsKKyAgICBpZighc3RyY21wKGJ1ZjIsInRleHQiKSkKKyAgICAgIHNlY29rPTE7CisgICAgZWxzZQorICAgICAgc2Vjb2s9MDsKKyAgICBwLT5mbGFncz1CQVJSSUVSOworICAgIHJldHVybjsKKyAgfQorCisgIGlmKHNzY2FuZihzLCJsJWQ6IiwmbCk9PTEpeworICAgIHAtPmZsYWdzfD1MQUJERUY7CisgICAgcC0+bDE9bDsKKyAgICBwLT5zaXplPTA7CisgICAgaWYoIXNlY29rKSBwLT5mbGFnc3w9QkFSUklFUjsKKyAgICByZXR1cm47CisgIH0KKworICBpZighc2Vjb2speworICAgIHAtPmZsYWdzfD1CQVJSSUVSOworICAgIHJldHVybjsKKyAgfQorCisgIGlmKCFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpzKSl7CisgICAgcC0+ZmxhZ3M9QkFSUklFUjsKKyAgICByZXR1cm47CisgIH0KKyAgd2hpbGUoaXNzcGFjZSgodW5zaWduZWQgY2hhcikqcykpCisgICAgcysrOworICBmb3IoZT1zO2lzYWxwaGEoKHVuc2lnbmVkIGNoYXIpKmUpO2UrKyk7CisKKyAgZm9yKGk9MDtpPHNpemVvZihpbnN0KS9zaXplb2YoaW5zdFswXSk7aSsrKXsKKyAgICBpZighc3RybmNtcChzLGluc3RbaV0sZS1zKSl7CisgICAgICBpbnQgcXVhZD0wOworICAgICAgaWYoZVstMV09PSdxJykgcXVhZD0yOworICAgICAgd2hpbGUoaXNzcGFjZSgodW5zaWduZWQgY2hhcikqZSkpIGUrKzsKKyAgICAgIGlmKCplPT0wKXsKKwlwLT5zaXplPTE7CisJcmV0dXJuOworICAgICAgfQorICAgICAgaWYoKmU9PSdbJykgcC0+c2l6ZSsrOworICAgICAgcC0+c2l6ZT0yOworICAgICAgcC0+c2l6ZSs9cXVhZDsKKyAgICAgIGlmKHNzY2FuZihlLCJsJWQiLCZsKT09MSl7CisJcC0+ZmxhZ3N8PUxBQlVTRTsKKwlwLT5sMT1sOworICAgICAgfQorICAgICAgaWYoKnM9PSdiJ3x8IXN0cm5jbXAocywiam1wIiwzKSl7CisJcC0+ZmxhZ3N8PUJSQU5DSDsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgcC0+ZmxhZ3M9QkFSUklFUjsKK30KKworc3RhdGljIGludCBubGFiOworCisjZGVmaW5lIFNFQ1RJT04gIlx0c2VjdGlvblx0dGV4dFxuIgorCit2b2lkIGFkZF9oZWFkZXIobGluZSAqYWZ0ZXIpCit7CisgIG5sYWI9bmV3X2xhYmVsKCk7CisgIGxpbmUgKm5ldzsKKyAgbmV3PW5ld19saW5lKCk7CisgIG5ldy0+ZmxhZ3M9TEFCREVGOworICBuZXctPmwxPW5sYWI7CisgIG5ldy0+Y29kZT1teW1hbGxvYygxNik7IC8qIFRPRE8gKi8KKyAgc3ByaW50ZihuZXctPmNvZGUsInglZDpcbiIsbmxhYik7CisgIGluc2VydF9saW5lKGFmdGVyLG5ldyk7CisgIG5ldz1uZXdfbGluZSgpOworICBuZXctPmZsYWdzPUJBUlJJRVI7CisgIG5ldy0+Y29kZT1teW1hbGxvYyhzdHJsZW4oU0VDVElPTikrMSk7CisgIHN0cmNweShuZXctPmNvZGUsU0VDVElPTik7CisgIGluc2VydF9saW5lKGFmdGVyLG5ldyk7Cit9CisKK3ZvaWQgYWRkX3JldChsaW5lICphZnRlcikKK3sKKyAgbGluZSAqbmV3PW5ld19saW5lKCk7CisgIG5ldy0+c2l6ZT0xOworICBuZXctPmZsYWdzPUJBUlJJRVI7CisgIG5ldy0+Y29kZT1teW1hbGxvYyg4KTsgLypUT0RPKi8KKyAgc3RyY3B5KG5ldy0+Y29kZSwiXHRydHNcbiIpOworICBpbnNlcnRfbGluZShhZnRlcixuZXcpOworfQorCit2b2lkIGFkZF9qc3IobGluZSAqYWZ0ZXIpCit7CisgIGxpbmUgKm5ldz1uZXdfbGluZSgpOworICBuZXctPmZsYWdzPUxBQlVTRTsKKyAgbmV3LT5zaXplPTM7CisgIG5ldy0+bDE9bmxhYjsKKyAgbmV3LT5jb2RlPW15bWFsbG9jKDI0KTsgLyogVE9ETyAqLworICBzcHJpbnRmKG5ldy0+Y29kZSwiXHRqc3JcdHglZFxuIixubGFiKTsKKyAgaW5zZXJ0X2xpbmUoYWZ0ZXIsbmV3KTsKK30KZGlmZiAtLWdpdCBhL21hY2hpbmVzLzY1MDIvbWFjaGluZS5jIGIvbWFjaGluZXMvNjUwMi9tYWNoaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzhlMTRiNgotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzLzY1MDIvbWFjaGluZS5jCkBAIC0wLDAgKzEsNjAyOSBAQAorLyogIDY1MDIgYmFja2VuZCBmb3IgdmJjYworICAgIChjKSBWb2xrZXIgQmFydGhlbG1hbm4gMjAyMAorCisqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyNpbmNsdWRlICJzdXBwLmgiCisjaW5jbHVkZSAidmJjLmgiCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKK3N0YXRpYyBjaGFyIEZJTEVfW109X19GSUxFX187CisKKy8qICBQdWJsaWMgZGF0YSB0aGF0IE1VU1QgYmUgdGhlcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBOYW1lIGFuZCBjb3B5cmlnaHQuICovCitjaGFyIGNnX2NvcHlyaWdodFtdPSJ2YmNjIDY1MDIgY29kZS1nZW5lcmF0b3IgVjAuNSAoYykgaW4gMjAyMiBieSBWb2xrZXIgQmFydGhlbG1hbm4iOworCisvKiAgQ29tbWFuZGxpbmUtZmxhZ3MgdGhlIGNvZGUtZ2VuZXJhdG9yIGFjY2VwdHM6CisgICAgMDoganVzdCBhIGZsYWcKKyAgICBWQUxGTEFHOiBhIHZhbHVlIG11c3QgYmUgc3BlY2lmaWVkCisgICAgU1RSSU5HRkxBRzogYSBzdHJpbmcgY2FuIGJlIHNwZWNpZmllZAorICAgIEZVTkNGTEFHOiBhIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCisgICAgYXBhcnQgZnJvbSBGVU5DRkxBRywgYWxsIG90aGVyIHZlcnNpb25zIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBvbmNlICovCitpbnQgZ19mbGFnc1tNQVhHRl09ezAsMCwKKwkJICAgIFZBTEZMQUcsMCwwLAorCQkgICAgMCwwLAorCQkgICAgVkFMRkxBRyxWQUxGTEFHLDAsMCwKKwkJICAgIFZBTEZMQUcsMCwwLDAsCisJCSAgICAwLDAsMCwKKwkJICAgIDAsMCwwLDAsMCwwfTsKKworLyogdGhlIGZsYWctbmFtZSwgZG8gbm90IHVzZSBuYW1lcyBiZWdpbm5pbmcgd2l0aCBsLCBMLCBJLCBEIG9yIFUsIGJlY2F1c2UKKyAgIHRoZXkgY29sbGlkZSB3aXRoIHRoZSBmcm9udGVuZCAqLworY2hhciAqZ19mbGFnc19uYW1lW01BWEdGXT17InN0ZC1zeW50YXgiLCJuby1yYXgiLAorCQkJICAgInZvbGF0aWxlLXJlZ3MiLCJpZWVlIiwibm8tcGVlcGhvbGUiLAorCQkJICAgImNibWFzY2lpIiwic29mdHN0YWNrIiwKKwkJCSAgICJyZWctYXJncyIsImludC1hcmdzIiwibWFpbmFyZ3MiLCJuby1iYW5rLXZhcnMiLAorCQkJICAgImNvbW1vbi1iYW5rbnIiLCJidG1wLXpwYWdlIiwib2xkZnAiLCJsYXJnZSIsCisJCQkgICAiZ2xvYi1hY2MiLCJhdm9pZC1iYW5rLXN3aXRjaCIsIm1hbnVhbC1iYW5raW5nIiwKKwkJCSAgICJhdGFzY2lpIiwiNjVjMDIiLCJub3giLCJtZWdhNjUiLCJjZTAyIiwiYzAyIiwKKwkJCSAgICJkaXYtYnVnIiwibTY1aW8ifTsKKworLyogdGhlIHJlc3VsdHMgb2YgcGFyc2luZyB0aGUgY29tbWFuZC1saW5lLWZsYWdzIHdpbGwgYmUgc3RvcmVkIGhlcmUgKi8KK3VuaW9uIHBwaSBnX2ZsYWdzX3ZhbFtNQVhHRl07CisKKy8qICBBbGlnbm1lbnQtcmVxdWlyZW1lbnRzIGZvciBhbGwgdHlwZXMgaW4gYnl0ZXMuICAgICAgICAgICAgICAqLworem1heCBhbGlnbltNQVhfVFlQRSsxXTsKKworLyogIEFsaWdubWVudCB0aGF0IGlzIHN1ZmZpY2llbnQgZm9yIGV2ZXJ5IG9iamVjdC4gICAgICAgICAgICAgICovCit6bWF4IG1heGFsaWduOworCisvKiAgQ0hBUl9CSVQgZm9yIHRoZSB0YXJnZXQgbWFjaGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggY2hhcl9iaXQ7CisKKy8qICBzaXplcyBvZiB0aGUgYmFzaWMgdHlwZXMgKGluIGJ5dGVzKSAqLworem1heCBzaXpldGFiW01BWF9UWVBFKzFdOworCisvKiAgTWluaW11bSBhbmQgTWF4aW11bSB2YWx1ZXMgZWFjaCB0eXBlIGNhbiBoYXZlLiAgICAgICAgICAgICAgKi8KKy8qICBNdXN0IGJlIGluaXRpYWxpemVkIGluIGluaXRfY2coKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworem1heCB0X21pbltNQVhfVFlQRSsxXTsKK3p1bWF4IHRfbWF4W01BWF9UWVBFKzFdOworenVtYXggdHVfbWF4W01BWF9UWVBFKzFdOworCisvKiAgTmFtZXMgb2YgYWxsIHJlZ2lzdGVycy4gd2lsbCBiZSBpbml0aWFsaXplZCBpbiBpbml0X2NnKCksCisgICAgcmVnaXN0ZXIgbnVtYmVyIDAgaXMgaW52YWxpZCwgdmFsaWQgcmVnaXN0ZXJzIHN0YXJ0IGF0IDEgKi8KK2NoYXIgKnJlZ25hbWVzW01BWFIrMV07CisKKy8qICBUaGUgU2l6ZSBvZiBlYWNoIHJlZ2lzdGVyIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworem1heCByZWdzaXplW01BWFIrMV07CisKKy8qICBhIHR5cGUgd2hpY2ggY2FuIHN0b3JlIGVhY2ggcmVnaXN0ZXIuICovCitzdHJ1Y3QgVHlwICpyZWd0eXBlW01BWFIrMV07CisKKy8qICByZWdzYVtyZWddIT0wIGlmIGEgY2VydGFpbiByZWdpc3RlciBpcyBhbGxvY2F0ZWQgYW5kIHNob3VsZCAqLworLyogIG5vdCBiZSB1c2VkIGJ5IHRoZSBjb21waWxlciBwYXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitpbnQgcmVnc2FbTUFYUisxXTsKKworLyogIFNwZWNpZmllcyB3aGljaCByZWdpc3RlcnMgbWF5IGJlIHNjcmF0Y2hlZCBieSBmdW5jdGlvbnMuICAgICovCitpbnQgcmVnc2NyYXRjaFtNQVhSKzFdOworCisvKiBzcGVjaWZpZXMgdGhlIHByaW9yaXR5IGZvciB0aGUgcmVnaXN0ZXItYWxsb2NhdG9yLCBpZiB0aGUgc2FtZQorICAgZXN0aW1hdGVkIGNvc3Qtc2F2aW5nIGNhbiBiZSBvYnRhaW5lZCBieSBzZXZlcmFsIHJlZ2lzdGVycywgdGhlCisgICBvbmUgd2l0aCB0aGUgaGlnaGVzdCBwcmlvcml0eSB3aWxsIGJlIHVzZWQgKi8KK2ludCByZWdfcHJpb1tNQVhSKzFdOworCisvKiBhbiBlbXB0eSByZWctaGFuZGxlIHJlcHJlc2VudGluZyBpbml0aWFsIHN0YXRlICovCitzdHJ1Y3QgcmVnX2hhbmRsZSBlbXB0eV9yZWdfaGFuZGxlPXswLDB9OworCisvKiBOYW1lcyBvZiB0YXJnZXQtc3BlY2lmaWMgdmFyaWFibGUgYXR0cmlidXRlcy4gICAgICAgICAgICAgICAgKi8KK2NoYXIgKmdfYXR0cl9uYW1lW109eyJfX2ludGVycnVwdCIsIl9fenBhZ2UiLCJfX25vY3ByIiwwfTsKKworI2RlZmluZSBJTlRFUlJVUFQgMQorI2RlZmluZSBaUEFHRSAyCisjZGVmaW5lIE5PQ09NUFJFU1MgNAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBQcml2YXRlIGRhdGEgYW5kIGZ1bmN0aW9ucy4gICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU1REU1lOVEFYICAoZ19mbGFnc1swXSZVU0VERkxBRykKKyNkZWZpbmUgTk9SQVggICAgICAoZ19mbGFnc1sxXSZVU0VERkxBRykKKyNkZWZpbmUgVk9MX0dQUlMgICAoKGdfZmxhZ3NbMl0mVVNFREZMQUcpP2dfZmxhZ3NfdmFsWzJdLmw6TlVNX0dQUlMvMikKKyNkZWZpbmUgSUVFRSAgICAgICAoZ19mbGFnc1szXSZVU0VERkxBRykKKyNkZWZpbmUgTk9QRUVQICAgICAoZ19mbGFnc1s0XSZVU0VERkxBRykKKyNkZWZpbmUgQ0JNQVNDSUkgICAoZ19mbGFnc1s1XSZVU0VERkxBRykKKyNkZWZpbmUgU09GVFNUQUNLICAoZ19mbGFnc1s2XSZVU0VERkxBRykKKyNkZWZpbmUgR1BSX0FSR1MgICAoKGdfZmxhZ3NbN10mVVNFREZMQUcpP2dfZmxhZ3NfdmFsWzddLmw6OCkKKyNkZWZpbmUgTUFJTkFSR1MgICAoZ19mbGFnc1s5XSZVU0VERkxBRykKKyNkZWZpbmUgTk9CQU5LVkFSUyAoZ19mbGFnc1sxMF0mVVNFREZMQUcpCisjZGVmaW5lIENPTU1PTkJBTksgKChnX2ZsYWdzWzExXSZVU0VERkxBRyk/Z19mbGFnc192YWxbMTFdLmw6MCkKKyNkZWZpbmUgQklHWlBBR0UgICAoZ19mbGFnc1sxMl0mVVNFREZMQUcpCisjZGVmaW5lIE9MREZQICAgICAgKGdfZmxhZ3NbMTNdJlVTRURGTEFHKQorI2RlZmluZSBMQVJHRSAgICAgIChnX2ZsYWdzWzE0XSZVU0VERkxBRykKKyNkZWZpbmUgR0xPQkFDQyAgICAoZ19mbGFnc1sxNV0mVVNFREZMQUcpCisjZGVmaW5lIE5PU1dJVENIICAgKGdfZmxhZ3NbMTZdJlVTRURGTEFHKQorI2RlZmluZSBOT0JBTktJTkcgIChnX2ZsYWdzWzE3XSZVU0VERkxBRykKKyNkZWZpbmUgQVRBU0NJSSAgICAoZ19mbGFnc1sxOF0mVVNFREZMQUcpCisjZGVmaW5lIEMwMiAgICAgICAgKGdfZmxhZ3NbMTldJlVTRURGTEFHKQorI2RlZmluZSBOT1ggICAgICAgIChnX2ZsYWdzWzIwXSZVU0VERkxBRykKKyNkZWZpbmUgTUVHQTY1ICAgICAoZ19mbGFnc1syMV0mVVNFREZMQUcpCisjZGVmaW5lIENFMDIgICAgICAgKGdfZmxhZ3NbMjJdJlVTRURGTEFHKQorI2RlZmluZSBDMDJBTFQgICAgIChnX2ZsYWdzWzIzXSZVU0VERkxBRykKKyNkZWZpbmUgRElWQlVHICAgICAoZ19mbGFnc1syNF0mVVNFREZMQUcpCisjZGVmaW5lIE02NUlPICAgICAgKGdfZmxhZ3NbMjVdJlVTRURGTEFHKQorCisKKworI2RlZmluZSBTVFJfTkVBUiAibmVhciIKKyNkZWZpbmUgU1RSX0ZBUiAiZmFyIgorI2RlZmluZSBTVFJfSFVHRSAiaHVnZSIKKworI2RlZmluZSBQTEEgKC0xKQorI2RlZmluZSBKTVBJTkQgKC0yKQorCitzdGF0aWMgdm9pZCBmdW5jdGlvbl90b3AoRklMRSAqLHN0cnVjdCBWYXIgKixsb25nKTsKK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX2JvdHRvbShGSUxFICpmLHN0cnVjdCBWYXIgKixsb25nKTsKKworI2RlZmluZSBpc3JlZyh4KSAoKHAtPnguZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRykKKyNkZWZpbmUgaXNhY2MoeCkgKGlzcmVnKHgpJiYocC0+eC5yZWc9PXJhfHxwLT54LnJlZz09cmF4KSkKKyNkZWZpbmUgaXNjb25zdCh4KSAoKHAtPnguZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpCisKKyNkZWZpbmUgaXN6cGFnZShvKSAoKChvKS0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFR3x8KCgobyktPmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJihvKS0+di0+dGF0dHImWlBBR0UpKQorCisjZGVmaW5lIGlzcHRyKHIpICgocik+PUZJUlNUX1BBSVImJihyKTw9TEFTVF9QQUlSKQorCitzdGF0aWMgaW50IHExcmVnLHEycmVnLHpyZWc7CisKK3N0YXRpYyBjaGFyICpjY3NbXT17ImVxIiwibmUiLCJsdCIsImdlIiwibGUiLCJndCIsIiJ9Oworc3RhdGljIGNoYXIgKmxvZ2ljYWxzW109eyJvcmEiLCJlb3IiLCJhbmQifTsKK3N0YXRpYyBjaGFyICphcml0aG1ldGljc1tdPXsic2x3Iiwic3J3IiwiYWRjIiwic2JjIiwibXVsbHciLCJkaXZ3IiwibW9kIn07CisKKy8qIGFsaWdubWVudCBvZiBiYXNpYyBkYXRhLXR5cGVzLCB1c2VkIHRvIGluaXRpYWxpemUgYWxpZ25bXSAqLworc3RhdGljIGxvbmcgbWFsaWduW01BWF9UWVBFKzFdPSAgezEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxfTsKKy8qIHNpemVzIG9mIGJhc2ljIGRhdGEtdHlwZXMsIHVzZWQgdG8gaW5pdGlhbGl6ZSBzaXpldGFiW10gKi8KK3N0YXRpYyBsb25nIG1zaXpldGFiW01BWF9UWVBFKzFdPXsxLDEsMiwyLDQsOCw0LDQsNCwwLDIsMywzLDAsMCwwLDEsMH07CitzdGF0aWMgY2hhciAqbXJlZ25hbWVzW01BWFIrMSs0XTsKKworLyogVHlwZW5hbWVzIChuZWVkZWQgYmVjYXVzZSBvZiBIQVZFX0VYVF9UWVBFUykuICovCitjaGFyICp0eXBuYW1lW109eyJzdHJhbmdlIiwiY2hhciIsInNob3J0IiwiaW50IiwibG9uZyIsImxvbmcgbG9uZyIsCisgICAgICAgICAgICAgICAgICJmbG9hdCIsImRvdWJsZSIsImxvbmcgZG91YmxlIiwidm9pZCIsCisgICAgICAgICAgICAgICAgICJuZWFyLXBvaW50ZXIiLCJmYXItcG9pbnRlciIsImh1Z2UtcG9pbnRlciIsCisgICAgICAgICAgICAgICAgICJhcnJheSIsInN0cnVjdCIsInVuaW9uIiwiZW51bSIsImZ1bmN0aW9uIn07CisKKworLyogdXNlZCB0byBpbml0aWFsaXplIHJlZ3R5cFtdICovCitzdGF0aWMgc3RydWN0IFR5cCBpdHlwPXtJTlR9LGN0eXA9e0NIQVJ9LGZ0eXA9e0ZMT0FUfSxsbHR5cD17TExPTkd9OworCisvKiBtYWNyb3MgZGVmaW5lZCBieSB0aGUgYmFja2VuZCAqLworc3RhdGljIGNoYXIgKm1hcnJheVtdPXsiX19zZWN0aW9uKHgpPV9fdmF0dHIoXCJzZWN0aW9uKFwiI3hcIilcIikiLAorCQkgICAgICAgIl9fNjUwMl9fIiwKKwkJICAgICAgICJfX1NJWkVfVF9JTlQiLAorCQkgICAgICAgIl9fYmFuayh4KT1fX3ZhdHRyKFwiYmFuayhcIiN4XCIpXCIpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIl9fZmFyPV9fYXR0cihcImZhclwiKSIsCisgICAgICAgICAgICAgICAgICAgICAgICJfX25lYXI9X19hdHRyKFwibmVhclwiKSIsCisgICAgICAgICAgICAgICAgICAgICAgICJfX2h1Z2U9X19hdHRyKFwiaHVnZVwiKSIsCisJCSAgICAgICAwfTsKKworLyogc3BlY2lhbCByZWdpc3RlcnMgKi8KK3N0YXRpYyBpbnQgcmE9MSwgcng9Miwgcnk9Mywgc3AxPTQsc3AyPTUsc3A9NixmcCxmcDEsZnAyOworc3RhdGljIGludCB0ND1MQVNUX0dQUix0Mz1MQVNUX0dQUi0xLHQyPUxBU1RfR1BSLTIsdDE9TEFTVF9HUFItMzsKK3N0YXRpYyBpbnQgcmF4PTc7CitzdGF0aWMgaW50IHl2YWw7CisjZGVmaW5lIE5PVkFMIDEwMDAKKworI2RlZmluZSBSRUdEVU1NWTEgTUFYUisxCisjZGVmaW5lIFJFR0RVTU1ZMiBNQVhSKzIKKyNkZWZpbmUgUkVHRFVNTVkzIE1BWFIrMworCitzdGF0aWMgaW50IHQxLHQyLGYxLGYyOyAvKnRPRE86IHJlbW92ZSovCisKK3N0YXRpYyBpbnQgcHVzaGVkYWNjLHB1c2hlZHgsbm9wZWVwLGNibWFzY2lpLGF0YXNjaWksaWVlZTsKK3N0YXRpYyBpbnQgc3RvcmVkYWNjLHN0b3JlZHg7CitzdGF0aWMgaW50IGMwMixtNjUsY2UwMix6emVybyxub3k7CitzdGF0aWMgaW50IGRpdmJ1ZzsKK3N0YXRpYyBpbnQgbTY1aW87CitzdGF0aWMgaW50IG1hbmJhbms7CitzdGF0aWMgY2hhciAqam1waW5zdDsKK3N0YXRpYyBpbnQgcGFzczsKK3N0YXRpYyBpbnQgbGlic2F2ZTsKK3N0YXRpYyBzdHJ1Y3QgcnBhaXIgcnAyOworc3RhdGljIGludCBjYmFuazsKK3N0YXRpYyBWYXIgYmFua3Y7CitzdGF0aWMgaW50IGJhbmt2b2Zmc2V0Oworc3RhdGljIGludCBiYW5rY251bTsKK3N0YXRpYyBvYmogenN0b3JlOworc3RhdGljIGludCB6c3RvcmVmbGFnOworc3RhdGljIGludCBoYXNyZXR2YWw7CisKKyNkZWZpbmUgU0VDTEVOIDEyOAorY2hhciAqdXNlX3NlYzsKK2ludCB1c2VfYmFuaz0tMTsKKworI2RlZmluZSBkdCh0KSAoKCh0KSZVTlNJR05FRCk/dWR0Wyh0KSZOUV06c2R0Wyh0KSZOUV0pCitzdGF0aWMgY2hhciAqc2R0W01BWF9UWVBFKzFdPXsiPz8iLCJjIiwicyIsImkiLCJsIiwibGwiLCJmIiwiZCIsImxkIiwidiIsInAifTsKK3N0YXRpYyBjaGFyICp1ZHRbTUFYX1RZUEUrMV09eyI/PyIsInVjIiwidXMiLCJ1aSIsInVsIiwidWxsIiwiZiIsImQiLCJsZCIsInYiLCJwIn07CisKKy8qIHBlcmhhcHMgcHJvdmlkZSB2ZXJzaW9uIHdpdGggOGJpdCBpbnQ/ICovCisjZGVmaW5lIElTQ0hBUih0KSAoKHQmTlEpPT1DSEFSKQorI2RlZmluZSBJU1NIT1JUKHQpICgodCZOUSk9PVNIT1JUfHwodCZOUSk9PUlOVHx8KHQmTlEpPT1QT0lOVEVSKQorI2RlZmluZSBJU0ZQT0lOVEVSKHQpICgodCZOUSk9PUZQT0lOVEVSKQorI2RlZmluZSBJU0xPTkcodCkgKCh0Jk5RKT09TE9ORykKKyNkZWZpbmUgSVNMTE9ORyh0KSAoKHQmTlEpPT1MTE9ORykKKworI2RlZmluZSBJU0lEWChyKSAocj09cngpCisjZGVmaW5lIElTUklEWChvcCkgKGlzcmVnKG9wKSYmSVNJRFgocC0+b3AucmVnKSkKKyNkZWZpbmUgSVNQUkVHKG9wKSAoaXNyZWcob3ApJiZpc3B0cihwLT5vcC5yZWcpKQorCisjZGVmaW5lIExPTkdNNjUoYykgKChjKT09QVNTSUdOfHwoYyk9PVBVU0h8fChjKT09R0VUUkVUVVJOfHwoYyk9PVNFVFJFVFVSTnx8KChjKT49TFNISUZUJiYoYyk8PU1PRCl8fCgoYyk+PU9SJiYoYyk8PUFORCkpCisKKy8qIGFtICovCisjZGVmaW5lIElNTV9JTkQgMQorI2RlZmluZSBHUFJfSU5EIDIKKyNkZWZpbmUgQUJTX0lORCAzCisKKy8qIHNlY3Rpb25zICovCisjZGVmaW5lIERBVEEgMAorI2RlZmluZSBCU1MgMQorI2RlZmluZSBDT0RFIDIKKyNkZWZpbmUgUk9EQVRBIDMKKyNkZWZpbmUgU1BFQ0lBTCA0CisKK3N0YXRpYyBsb25nIHN0YWNrOworc3RhdGljIGludCBzdGFja192YWxpZDsKK3N0YXRpYyBpbnQgc2VjdGlvbj0tMSxuZXdvYmo7CitzdGF0aWMgY2hhciAqY29kZW5hbWU9Ilx0c2VjdGlvblx0dGV4dCIsCisgICpkYXRhbmFtZT0iXHRzZWN0aW9uXHRkYXRhIiwKKyAgKmJzc25hbWU9Ilx0c2VjdGlvblx0YnNzIiwKKyAgKnJvZGF0YW5hbWU9Ilx0c2VjdGlvblx0cm9kYXRhIjsKKworLyogcmV0dXJuLWluc3RydWN0aW9uICovCitzdGF0aWMgY2hhciAqcmV0OworCisvKiBsYWJlbCBhdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiAoaWYgYW55KSAqLworc3RhdGljIGludCBleGl0X2xhYmVsOworCisvKiBhc3NlbWJseS1wcmVmaXhlcyBmb3IgbGFiZWxzIGFuZCBleHRlcm5hbCBpZGVudGlmaWVycyAqLworc3RhdGljIGNoYXIgKmxhYnByZWZpeD0ibCIsKmlkcHJlZml4PSJfIjsKKworLyogdmFyaWFibGVzIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBhbmQgcGFydGl0aW9uaW5nIG9mIHRoZSBzdGFjay1mcmFtZQorICAgaW4gdGhlIGNhc2Ugb2YgRklYRURfU1AgKi8KK3N0YXRpYyBsb25nIGZyYW1lb2Zmc2V0LHB1c2hlZCxtYXhwdXNoZWQsZnJhbWVzaXplOworCitzdGF0aWMgbG9uZyBsb2NhbHNpemUscnNhdmVzaXplLHJzY250LGFyZ3NpemU7CisKK3N0YXRpYyB2b2lkIGVtaXRfb2JqKEZJTEUgKmYsc3RydWN0IG9iaiAqcCxpbnQgdCk7CisKKy8qIGNhbGN1bGF0ZSB0aGUgYWN0dWFsIGN1cnJlbnQgb2Zmc2V0IG9mIGFuIG9iamVjdCByZWxhdGl2IHRvIHRoZQorICAgc3RhY2stcG9pbnRlcjsgd2UgdXNlIGEgbGF5b3V0IGxpa2UgdGhpczoKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCBhcmd1bWVudHMgdG8gdGhpcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICB8CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHwgY2FsbGVyLXNhdmUgcmVnaXN0ZXJzIFtzaXplPXJzYXZlc2l6ZV0gICAgICAgfAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB8IGxvY2FsIHZhcmlhYmxlcyBbc2l6ZT1sb2NhbHNpemVdICAgICAgICAgICAgIHwKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCBhcmd1bWVudHMgdG8gY2FsbGVkIGZ1bmN0aW9ucyBbc2l6ZT1hcmdzaXplXSB8CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEFsbCBzaXplcyB3aWxsIGJlIGFsaWduZWQgYXMgbmVjZXNzYXJ5LgorICAgSW4gdGhlIGNhc2Ugb2YgRklYRURfU1AsIHRoZSBzdGFjay1wb2ludGVyIHdpbGwgYmUgYWRqdXN0ZWQgYXQKKyAgIGZ1bmN0aW9uLWVudHJ5IHRvIGxlYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhlIGFyZ3VtZW50cyBhbmQgaGF2ZSBpdAorICAgYWxpZ25lZCB0byAxNiBieXRlcy4gVGhlcmVmb3JlLCB3aGVuIGNhbGxpbmcgYSBmdW5jdGlvbiwgdGhlCisgICBzdGFjay1wb2ludGVyIGlzIGFsd2F5cyBhbGlnbmVkIHRvIDE2IGJ5dGVzLgorICAgRm9yIGEgbW92aW5nIHN0YWNrLXBvaW50ZXIsIHRoZSBzdGFjay1wb2ludGVyIHdpbGwgdXN1YWxseSBwb2ludAorICAgdG8gdGhlIGJvdHRvbSBvZiB0aGUgYXJlYSBmb3IgbG9jYWwgdmFyaWFibGVzLCBidXQgd2lsbCBtb3ZlIHdoaWxlCisgICBhcmd1bWVudHMgYXJlIHB1dCBvbiB0aGUgc3RhY2suCisKKyAgIFRoaXMgaXMganVzdCBhbiBleGFtcGxlIGxheW91dC4gT3RoZXIgbGF5b3V0cyBhcmUgYWxzbyBwb3NzaWJsZS4KKyovCisKKyNkZWZpbmUgYmFuayh4KSBiYW5reCgoeCksbWFuYmFuaykKKyNkZWZpbmUgc2JhbmsoeCkgYmFua3goKHgpLDApCisKK3N0YXRpYyBpbnQgYmFua3goVmFyICp2LGludCBub2JhbmspCit7CisgIGNoYXIgKnM9di0+dmF0dHI7CisgIGludCBuLHI7CisgIGlmKCFub2JhbmsmJnMmJihzPXN0cnN0cihzLCJiYW5rKCIpKSl7CisgICAgaWYoc3NjYW5mKHMrNSwiJWkiLCZuKT09MSkKKyAgICAgIHJldHVybiBuOworICB9CisgIHJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgZWJhbmsoRklMRSAqZixpbnQgYikKK3sKKyAgaWYoYj49MCkgZW1pdChmLCIlZCIsYik7CisgIGVtaXQoZiwiXG4iKTsKK30KKworc3RhdGljIGxvbmcgcmVhbF9vZmZzZXQoc3RydWN0IG9iaiAqbykKK3sKKyAgbG9uZyBvZmY9em0ybChvLT52LT5vZmZzZXQpOworICBpZihvZmY8MCl7CisgICAgLyogZnVuY3Rpb24gcGFyYW1ldGVyICovCisgICAgb2ZmPWxvY2Fsc2l6ZStyc2F2ZXNpemUtb2ZmLXptMmwobWF4YWxpZ24pOworICB9CisKKyAgb2ZmKz1hcmdzaXplOworICBvZmYrPXptMmwoby0+dmFsLnZtYXgpOworICByZXR1cm4gb2ZmOworfQorCisvKiAgSW5pdGlhbGl6ZXMgYW4gYWRkcmVzc2luZy1tb2RlIHN0cnVjdHVyZSBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8KKyAgICB0aGF0IG9iamVjdC4gV2lsbCBub3Qgc3Vydml2ZSBhIHNlY29uZCBjYWxsISAqLworc3RhdGljIHN0cnVjdCBvYmogKmNhbShpbnQgZmxhZ3MsaW50IGJhc2UsbG9uZyBvZmZzZXQpCit7CisgIHN0YXRpYyBzdHJ1Y3Qgb2JqIG9iajsKKyAgc3RhdGljIHN0cnVjdCBBZGRyZXNzaW5nTW9kZSBhbTsKKyAgb2JqLmFtPSZhbTsKKyAgYW0uZmxhZ3M9ZmxhZ3M7CisgIGFtLmJhc2U9YmFzZTsKKyAgYW0ub2Zmc2V0PW9mZnNldDsKKyAgcmV0dXJuICZvYmo7Cit9CisKKy8qIGNoYW5nZXMgdG8gYSBzcGVjaWFsIHNlY3Rpb24sIHVzZWQgZm9yIF9fc2VjdGlvbigpICovCitzdGF0aWMgaW50IHNwZWNpYWxfc2VjdGlvbihGSUxFICpmLHN0cnVjdCBWYXIgKnYpCit7CisgIGNoYXIgKnNlYzsKKyAgaWYodi0+dGF0dHImWlBBR0UpeworICAgIGVtaXQoZiwiXHRzZWN0aW9uXHR6cGFnZVxuIik7CisgIH1lbHNleworICAgIGlmKCF2LT52YXR0cikgcmV0dXJuIDA7CisgICAgc2VjPXN0cnN0cih2LT52YXR0ciwic2VjdGlvbigiKTsKKyAgICBpZighc2VjKSByZXR1cm4gMDsKKyAgICBzZWMrPXN0cmxlbigic2VjdGlvbigiKTsKKyAgICBlbWl0KGYsIlx0c2VjdGlvblx0Iik7CisgICAgd2hpbGUoKnNlYyYmKnNlYyE9JyknKSBlbWl0X2NoYXIoZiwqc2VjKyspOworICAgIGVtaXQoZiwiXG4iKTsKKyAgfQorICBpZihmKSBzZWN0aW9uPVNQRUNJQUw7CisgIHJldHVybiAxOworfQorCisKKworI2RlZmluZSBjaGtfY29sbCh4KSBkb3tpZigoeCk9PXJ8fCh4KT09cjF8fCh4KT09cjIpIHJldHVybiAwOwlcCisgICAgaWYocmVnX3BhaXIoKHgpLCZycCkmJihycC5yMT09cnx8cnAucjI9PXIpKSByZXR1cm4gMDt9d2hpbGUoMCkKKworc3RhdGljIGludCBzY3JhdGNoKElDICpwLGludCByLGludCBpc25leHQpCit7CisgIGludCByMSxyMjsKKyAgaWYoIXApIHJldHVybiAxOworICBpZihyZWdfcGFpcihyLCZycCkpeworICAgIHIxPXJwLnIxOworICAgIHIyPXJwLnIyOworICB9ZWxzZXsKKyAgICByMT0wOworICAgIHIyPTA7CisgIH0KKyAgaWYoIWlzbmV4dCYmaXNyZWcoeikmJnAtPnoucmVnPT1yKXsKKyAgICBpZighKHAtPnEyLmZsYWdzJlJFRykpCisgICAgICByZXR1cm4gMTsKKyAgICBpZihwLT5xMi5yZWc9PXJ8fHAtPnEyLnJlZz09cjF8fHAtPnEyLnJlZz09cjIpCisgICAgICByZXR1cm4gMDsKKyAgICBpZihyZWdfcGFpcihwLT5xMi5yZWcsJnJwKSkKKyAgICAgIGlmKHJwLnIxPT1yfHxycC5yMj09cikKKwlyZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKKyAgfQorICB3aGlsZShwKXsKKyAgICBpZihwLT5jb2RlPT1MQUJFTHx8cC0+Y29kZT09Q0FMTCkKKyAgICAgIHJldHVybiAwOworICAgIGlmKHAtPmNvZGU+PUJFUSYmcC0+Y29kZTw9QlJBKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYocC0+Y29kZT09RlJFRVJFR3x8cC0+Y29kZT09QUxMT0NSRUcpeworICAgICAgaWYocC0+cTEucmVnPT1yKQorCXJldHVybiAxOworICAgICAgaWYocmVnX3BhaXIocC0+cTEucmVnLCZycCkmJihycC5yMT09cnx8cnAucjI9PXIpKQorCXJldHVybiAxOworICAgIH0KKyAgICBpZihwLT5xMS5hbSl7CisgICAgICBjaGtfY29sbChwLT5xMS5hbS0+YmFzZSk7CisgICAgICBpZihwLT5xMS5hbS0+ZmxhZ3MhPUlNTV9JTkQpIGNoa19jb2xsKHAtPnExLmFtLT5pZHgpOworICAgIH0KKyAgICBpZihwLT5xMi5hbSl7CisgICAgICBjaGtfY29sbChwLT5xMi5hbS0+YmFzZSk7CisgICAgICBpZihwLT5xMi5hbS0+ZmxhZ3MhPUlNTV9JTkQpIGNoa19jb2xsKHAtPnEyLmFtLT5pZHgpOworICAgIH0KKyAgICBpZihwLT56LmFtKXsKKyAgICAgIGNoa19jb2xsKHAtPnouYW0tPmJhc2UpOworICAgICAgaWYocC0+ei5hbS0+ZmxhZ3MhPUlNTV9JTkQpIGNoa19jb2xsKHAtPnouYW0tPmlkeCk7CisgICAgfQorICAgIGlmKHAtPnExLmZsYWdzJlJFRykgY2hrX2NvbGwocC0+cTEucmVnKTsKKyAgICBpZihwLT5xMi5mbGFncyZSRUcpIGNoa19jb2xsKHAtPnEyLnJlZyk7CisgICAgaWYocC0+ei5mbGFncyZSRUcpeworICAgICAgaWYocC0+ei5mbGFncyZEUkVGT0JKKQorCWNoa19jb2xsKHAtPnoucmVnKTsKKyAgICAgIGVsc2V7CisJaWYocC0+ei5yZWc9PXIpCisJICByZXR1cm4gMTsKKwlpZihyZWdfcGFpcihwLT56LnJlZywmcnApJiYocnAucjE9PXJ8fHJwLnIyPT1yKSkKKwkgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKworICAgIHA9cC0+bmV4dDsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCByc2F2ZWN1cjsKK3N0YXRpYyBpbnQgaW5faXNyOworCitzdGF0aWMgaW50IGdldF9yZWcoRklMRSAqZixJQyAqcCxpbnQgdCkKK3sKKyAgaW50IHIscjEscjIscGFzcyxmbGFnOworCisgIGZvcihwYXNzPTA7cGFzczw1O3Bhc3MrKyl7CisgICAgZm9yKHI9TUFYUjtyPnNwO3ItLSl7CisgICAgICBpZihyZWdfcGFpcihyLCZycCkpeworCXIxPXJwLnIxOworCXIyPXJwLnIyOworICAgICAgfWVsc2V7CisJcjE9MDsKKwlyMj0wOworICAgICAgfQorICAgICAgaWYoKHBhc3M9PTB8fHBhc3M9PTMpJiYoIXJlZ3NjcmF0Y2hbcl18fGluX2lzcikpCisJY29udGludWU7CisgICAgICBpZihwYXNzPDMpeworCWlmKHJlZ3Nbcl0pIGNvbnRpbnVlOworCWlmKHIxJiYocmVnc1tyMV18fHJlZ3NbcjJdKSkgY29udGludWU7CisgICAgICB9CisgICAgICBpZihwYXNzPT0yJiYhKHJlZ3Nbcl0mNCkpCisJY29udGludWU7CisgICAgICBpZihwLT5xMS5mbGFncyZSRUcpeworCWlmKHAtPnExLnJlZz09cnx8cC0+cTEucmVnPT1yMXx8cC0+cTEucmVnPT1yMikgY29udGludWU7CisJaWYocjE9PTAmJnJlZ19wYWlyKHAtPnExLnJlZywmcnApJiYocnAucjE9PXJ8fHJwLnIyPT1yKSkgY29udGludWU7CisgICAgICB9CisgICAgICBpZihwLT5xMi5mbGFncyZSRUcpeworCWlmKHAtPnEyLnJlZz09cnx8cC0+cTIucmVnPT1yMXx8cC0+cTIucmVnPT1yMikgY29udGludWU7CisJaWYocjE9PTAmJnJlZ19wYWlyKHAtPnEyLnJlZywmcnApJiYocnAucjE9PXJ8fHJwLnIyPT1yKSkgY29udGludWU7CisgICAgICB9CisgICAgICBpZihwLT56LmZsYWdzJlJFRyl7CisJaWYocC0+ei5yZWc9PXJ8fHAtPnoucmVnPT1yMXx8cC0+ei5yZWc9PXIyKSBjb250aW51ZTsKKwlpZihyMT09MCYmcmVnX3BhaXIocC0+ei5yZWcsJnJwKSYmKHJwLnIxPT1yfHxycC5yMj09cikpIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYocmVnb2socix0LDEpKXsKKwlmbGFnPTg7CisJaWYocmVnc1tyXSl7CisJICBmbGFnfD0yOworCSAgaWYocC0+Y29kZT09Q09NUEFSRXx8cC0+Y29kZT09VEVTVCkKKwkgICAgaWVycm9yKDApOworCSAgaWYocmVnc1tyYV0peworCSAgICBlbWl0KGYsIlx0dGF5XG4iKTsKKwkgICAgeXZhbD1OT1ZBTDsKKwkgIH0KKwkgIGlmKHIxKXsKKwkgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3IxXSk7CisJICAgIGVtaXQoZiwiXHRwaGFcbiIpOworCSAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcjJdKTsKKwkgICAgZW1pdChmLCJcdHBoYVxuIik7CisJICB9ZWxzZXsKKwkgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgICAgZW1pdChmLCJcdHBoYVxuIik7CisJICB9CisJICBpZihyZWdzW3JhXSkKKwkgICAgZW1pdChmLCJcdHR5YVxuIik7CisJfQorCWlmKHIxKXsKKwkgIHJlZ3NbcjFdfD1mbGFnOworCSAgcmVnc1tyMl18PWZsYWc7CisJfQorCXJlZ3Nbcl18PWZsYWc7CisJcmVndXNlZFtyXT0xOworCXJlZ3VzZWRbcjFdPTE7CisJcmVndXNlZFtyMl09MTsKKwkvKmVtaXQoZiwiOyBwPSVwIHI9JXNcbiIsKHZvaWQqKXAsbXJlZ25hbWVzW3JdKTsqLworCXJldHVybiByOworICAgICAgfQorICAgIH0KKyAgfQorICBwcmljMihzdGRvdXQscCk7CisgIGllcnJvcigwKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X2FjYyhGSUxFICpmLCBJQyAqcCxpbnQgdCkKK3sKKyAgaW50IHI7CisgIGlmKGlzYWNjKHopKSByZXR1cm47CisgIHQmPU5ROworICBpZihJU0NIQVIodCkpeworICAgIGlmKDEvKiFpc3JlZyhxMSl8fChwLT5xMS5yZWchPXJhJiZwLT5xMS5yZWchPXJheCkqLyl7CisgICAgICBpZigocmVnc1tyYV18fHJlZ3NbcmF4XSkmJiFzY3JhdGNoKHAscmEsMCkmJiFwdXNoZWRhY2MpeworCWlmKHN0b3JlZGFjYykKKwkgIHB1c2hlZGFjYz1zdG9yZWRhY2M7CisJZWxzZSBpZihvcHRzaXplfHwocmVnc1t0MV0mJnJlZ3NbdDJdJiZyZWdzW3QzXSYmcmVnc1t0NF0pKXsKKwkgIGVtaXQoZiwiXHRwaGFcbiIpOworCSAgcHVzaGVkYWNjPS0xOworCX1lbHNleworCSAgcj1nZXRfcmVnKGYscCxDSEFSKTsKKwkgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICBwdXNoZWRhY2M9cjsKKwl9CisgICAgICB9CisgICAgfQorICB9ZWxzZXsKKyAgICBpZigxLyohaXNyZWcocTEpfHxwLT5xMS5yZWchPXJheCovKXsKKyAgICAgIGlmKChyZWdzW3JhXXx8cmVnc1tyYXhdKSYmKCFzY3JhdGNoKHAscmEsMCl8fCFzY3JhdGNoKHAscmF4LDApKSYmIXB1c2hlZGFjYyl7CisJaWYoIXN0b3JlZGFjYyl7CisJICByPWdldF9yZWcoZixwLENIQVIpOworCSAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgIHB1c2hlZGFjYz1yOworCX1lbHNlCisJICBwdXNoZWRhY2M9c3RvcmVkYWNjOworICAgICAgfQorICAgICAgaWYoKHJlZ3NbcnhdfHxyZWdzW3JheF0pJiYhc2NyYXRjaChwLHJheCwwKSYmIXB1c2hlZHgpeworCWlmKCFzdG9yZWR4KXsKKwkgIHI9Z2V0X3JlZyhmLHAsQ0hBUik7CisJICBlbWl0KGYsIlx0c3R4XHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgcHVzaGVkeD1yOworCX1lbHNlCisJICBwdXNoZWR4PXN0b3JlZHg7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBpbnQgY21wX2dldF9hY2MoRklMRSAqZixJQyAqcCxJQyAqYnJhbmNoKQoreworICBpZighcmVnc1tyYV0mJiFyZWdzW3JheF0pCisgICAgcmV0dXJuIDA7CisgIGlmKGJyYW5jaD09MCYmcHVzaGVkYWNjKQorICAgIHJldHVybiAwOworICBpZihicmFuY2gmJmlzcmVnKHExKSYmKHAtPnExLnJlZz09cmF8fHAtPnExLnJlZz09cmF4KSkKKyAgICBpZihicmFuY2gtPmNvZGU9PUJFUXx8YnJhbmNoLT5jb2RlPT1CTkV8fChwLT50eXBmJlVOU0lHTkVEKSkKKyAgICAgIHJldHVybiAwOworICBpZihzY3JhdGNoKHAscmEsMCkpCisgICAgcmV0dXJuIDA7CisgIGlmKCFyZWdzW3J4XSYmIXJlZ3NbcmF4XSl7CisgICAgZW1pdChmLCJcdHRheFxuIik7CisgICAgcHVzaGVkYWNjPXJ4OworICB9CisgIGVtaXQoZiwiXHRwaGFcbiIpOworICBwdXNoZWRhY2M9LTE7CisgIHJldHVybiBwdXNoZWRhY2M7Cit9CisKK3N0YXRpYyB2b2lkIHJlbG9hZF9hY2Nfb3B0KEZJTEUgKmYsSUMgKnApCit7CisgIGlmKHB1c2hlZGFjYz09MCkgcmV0dXJuOworICBpZihwdXNoZWRhY2M+MCl7CisgICAgd2hpbGUocCl7CisgICAgICBpZihwLT5jb2RlIT1GUkVFUkVHKSBicmVhazsKKyAgICAgIGlmKHAtPnExLnJlZz09cmF8fHAtPnExLnJlZz09cmF4KXsKKwlwdXNoZWRhY2M9MDsKKwlyZXR1cm47CisgICAgICB9CisgICAgICBwPXAtPm5leHQ7CisgICAgfQorICB9CisgIGlmKHB1c2hlZGFjYz09LTEpCisgICAgZW1pdChmLCJcdHBsYVxuIik7CisgIGVsc2UgaWYocHVzaGVkYWNjPT1yeCkKKyAgICBlbWl0KGYsIlx0dHhhXG4iKTsKKyAgZWxzZSBpZihwdXNoZWRhY2M9PXJ5KQorICAgIGVtaXQoZiwiXHR0eWFcbiIpOworICBlbHNlIGlmKHB1c2hlZGFjYyl7CisgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3B1c2hlZGFjY10pOworICAgIHJlZ3NbcHVzaGVkYWNjXSY9fjg7CisgIH0KKyAgcHVzaGVkYWNjPTA7Cit9CisKK3N0YXRpYyB2b2lkIHJlbG9hZF9hY2MoRklMRSAqZikKK3sKKyAgcmVsb2FkX2FjY19vcHQoZiwwKTsKK30KKworc3RhdGljIHZvaWQgcHVzaChpbnQgaSkKK3sKKyAgcHVzaGVkLT1pOworICBpZihwdXNoZWQ8bWF4cHVzaGVkKQorICAgIG1heHB1c2hlZD1wdXNoZWQ7Cit9CisKK3N0YXRpYyB2b2lkIHBvcChpbnQgaSkKK3sKKyAgcHVzaGVkKz1pOworICBpZihwdXNoZWQ+MCkgaWVycm9yKDApOworfQorCitzdGF0aWMgaW50IGluZGlyZWN0KG9iaiAqbykKK3sKKyAgaWYoby0+YW0peworICAgIGlmKG8tPmFtLT5mbGFncz09QUJTX0lORCYmby0+YW0tPmlkeD09cngpCisgICAgICByZXR1cm4gMDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gMTsKKyAgfQorICBpZigoby0+ZmxhZ3MmKERSRUZPQkp8S09OU1QpKT09RFJFRk9CSikKKyAgICByZXR1cm4gMTsKKyAgaWYoKG8tPmZsYWdzJihSRUd8VkFSKSkhPVZBUil7CisgICAgaWYoKG8tPmZsYWdzJlJFRykmJihvLT5yZWc9PXJhfHxJU0lEWChvLT5yZWcpfHxvLT5yZWc9PXJheCkpCisgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZihvLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgY29udmZsb2F0KHZvaWQpCit7Cit9ICAKKwordm9pZCBzZXR5KEZJTEUgKmYsaW50IHZhbCkKK3sKKyAgaWYoeXZhbD09dmFsKQorICAgIHJldHVybjsKKyAgaWYodmFsLXl2YWw9PTEpCisgICAgZW1pdChmLCJcdGlueVxuIik7CisgIGVsc2UgaWYoeXZhbC12YWw9PTEpCisgICAgZW1pdChmLCJcdGRleVxuIik7CisgIGVsc2V7CisgICAgZW1pdChmLCJcdGxkeVx0IyVkXG4iLHZhbCk7CisgICAgaWYodmFsPDB8fHZhbD4yNTUpCisgICAgICBpZXJyb3IoMCk7CisgIH0KKyAgeXZhbD12YWw7Cit9CisKK3N0YXRpYyB2b2lkIGNudl9mcCh2b2lkKQoreworICBkb3VibGUgZCxtYW50OworICBpbnQgZXhwOworICB1bnNpZ25lZCBsb25nIHQ7CisKKyAgaWYoaWVlZSl7CisgICAgdmZsb2F0PXpsZDJ6Zih2bGRvdWJsZSk7CisgICAgbWVtY3B5KCh2b2lkKikmdm1heCwodm9pZCopJnZmbG9hdCw0KTsKKyAgfWVsc2V7CisgICAgZD16bGQyZCh2bGRvdWJsZSk7CisgICAgbWFudD1mcmV4cChkLCZleHApOworICAgIGV4cD0oZXhwKzEyNykmMjU1OworICAgIHQ9KCh1bnNpZ25lZCBsb25nKShtYW50KjgzODg2MDgpKSYweGZmZmZmZjsKKyAgICB0fD0oKGxvbmcpZXhwKTw8MjQ7CisgICAgCisgICAgdD0oKHQmMHhmZik8PDI0KXwoKHQmMHhmZjAwKTw8OCl8KCh0JjB4ZmYwMDAwKT4+OCl8KCh0JjB4ZmYwMDAwMDApPj4yNCk7CisgICAgdm1heD1sMnptKChsb25nKXQpOworICAgIGlmKG1hbnQ9PTAmJmQ9PTApIHZtYXg9WjA7CisgIH0KK30KKworc3RhdGljIHZvaWQgZW1pdF9pZWVlKEZJTEUgKmYsdW5pb24gYXR5cHMgKnAsaW50IHQpCit7CisgIHVuc2lnbmVkIGNoYXIgKmlwPSh1bnNpZ25lZCBjaGFyICopJnAtPnZkb3VibGU7CisgIGVtaXQoZiwiMHglMDJ4JTAyeCwweCUwMnglMDJ4IixpcFsxXSxpcFswXSxpcFszXSxpcFsyXSk7CisgIGlmKHQ9PURPVUJMRXx8dD09TERPVUJMRSkKKyAgICBlbWl0KGYsIiwweCUwMnglMDJ4LDB4JTAyeCUwMngiLGlwWzVdLGlwWzRdLGlwWzddLGlwWzZdKTsKKyAgZW1pdChmLCJcbiIpOworfQorCitzdGF0aWMgdm9pZCBlbWl0X2xvYnl0ZShGSUxFICpmLG9iaiAqbyxpbnQgdCkKK3sKKyAgaWYoby0+ZmxhZ3MmS09OU1QpeworICAgIGlmKG8tPmZsYWdzJkRSRUZPQkopeworICAgICAgZXZhbF9jb25zdCgmby0+dmFsLG8tPmR0eXApOworICAgICAgIGVtaXQoZiwiJWQiLHptMmwodm1heCkpOworICAgIH1lbHNleworICAgICAgZXZhbF9jb25zdCgmby0+dmFsLHQpOworICAgICAgaWYoSVNGTE9BVCh0KSkgY252X2ZwKCk7CisgICAgICBlbWl0KGYsIiMlZCIsem0ybCh2bWF4KSYyNTUpOworICAgIH0KKyAgfWVsc2UgaWYoby0+ZmxhZ3MmVkFSQURSKXsKKyAgICBlbWl0KGYsIiM8KCIpOworICAgIGVtaXRfb2JqKGYsbyx0KTsKKyAgICBlbWl0KGYsIikiKTsKKyAgfWVsc2UgaWYoKG8tPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpeworICAgIGlmKCFyZWdfcGFpcihvLT5yZWcsJnJwKSkKKyAgICAgIGVtaXQoZiwiJXMiLG1yZWduYW1lc1tvLT5yZWddKTsKKyAgICBlbHNlCisgICAgICBlbWl0KGYsIiVzIixtcmVnbmFtZXNbcnAucjFdKTsKKyAgfWVsc2V7CisgICAgaWYoenplcm8mJihvLT5mbGFncyYoRFJFRk9CSnxLT05TVCkpPT1EUkVGT0JKKSBub3k9MTsKKyAgICBlbWl0X29iaihmLG8sdCk7CisgICAgbm95PTA7CisgIH0KK30KKworc3RhdGljIHZvaWQgZW1pdF9oaWJ5dGUoRklMRSAqZixvYmogKm8saW50IHQpCit7CisgIGlmKG8tPmZsYWdzJktPTlNUKXsKKyAgICBpZihvLT5mbGFncyZEUkVGT0JKKXsKKyAgICAgIGV2YWxfY29uc3QoJm8tPnZhbCxvLT5kdHlwKTsKKyAgICAgIGVtaXQoZiwiJWQiLHptMmwodm1heCkrMSk7CisgICAgfWVsc2V7CisgICAgICBldmFsX2NvbnN0KCZvLT52YWwsdCk7CisgICAgICBpZihJU0ZMT0FUKHQpKSBjbnZfZnAoKTsKKyAgICAgIGVtaXQoZiwiIyVkIiwoem0ybCh2bWF4KT4+OCkmMjU1KTsKKyAgICB9CisgIH1lbHNlIGlmKG8tPmZsYWdzJlZBUkFEUil7CisgICAgZW1pdChmLCIjPigiKTsKKyAgICBlbWl0X29iaihmLG8sdCk7CisgICAgZW1pdChmLCIpIik7CisgIH1lbHNlIGlmKChvLT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKyAgICBpZihvLT5yZWc+PUZJUlNUX0JJRyYmby0+cmVnPD1MQVNUX0JJR1ApeworICAgICAgZW1pdChmLCIlcysxIixtcmVnbmFtZXNbby0+cmVnXSk7CisgICAgfWVsc2V7CisgICAgICBpZighcmVnX3BhaXIoby0+cmVnLCZycCkpCisJaWVycm9yKDApOworICAgICAgZW1pdChmLCIlcyIsbXJlZ25hbWVzW3JwLnIyXSk7CisgICAgfQorICB9ZWxzZXsKKyAgICBpZihvLT5mbGFncyZWQVJBRFIpCisgICAgICBlbWl0KGYsIiMiKTsKKyAgICBpZighKG8tPmZsYWdzJkRSRUZPQkopKQorICAgICAgby0+dmFsLnZtYXg9em1hZGQoby0+dmFsLnZtYXgsWjEpOworICAgIGVtaXRfb2JqKGYsbyx0KTsKKyAgICBpZighKG8tPmZsYWdzJkRSRUZPQkopKQorICAgICAgby0+dmFsLnZtYXg9em1zdWIoby0+dmFsLnZtYXgsWjEpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfYnl0ZTMoRklMRSAqZixvYmogKm8saW50IHQpCit7CisgIGlmKG8tPmZsYWdzJktPTlNUKXsKKyAgICBpZihvLT5mbGFncyZEUkVGT0JKKXsKKyAgICAgIGV2YWxfY29uc3QoJm8tPnZhbCxvLT5kdHlwKTsKKyAgICAgIGVtaXQoZiwiJWQiLHptMmwodm1heCkrMik7CisgICAgfWVsc2V7CisgICAgICBldmFsX2NvbnN0KCZvLT52YWwsdCk7CisgICAgICBpZihJU0ZMT0FUKHQpKSBjbnZfZnAoKTsKKyAgICAgIGVtaXQoZiwiIyVkIiwoem0ybCh2bWF4KT4+MTYpJjI1NSk7CisgICAgfQorICB9ZWxzZSBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgZW1pdChmLCIlcysyIixtcmVnbmFtZXNbby0+cmVnXSk7CisgIH1lbHNlIGlmKG8tPmZsYWdzJlZBUkFEUil7CisgICAgZW1pdChmLCIjJWQiLGJhbmsoby0+dikpOworICB9ZWxzZXsKKyAgICBpZighKG8tPmZsYWdzJkRSRUZPQkopKQorICAgICAgby0+dmFsLnZtYXg9em1hZGQoby0+dmFsLnZtYXgsbDJ6bSgyTCkpOworICAgIGVtaXRfb2JqKGYsbyx0KTsKKyAgICBpZighKG8tPmZsYWdzJkRSRUZPQkopKQorICAgICAgby0+dmFsLnZtYXg9em1zdWIoby0+dmFsLnZtYXgsbDJ6bSgyTCkpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfYnl0ZTQoRklMRSAqZixvYmogKm8saW50IHQpCit7CisgIGlmKG8tPmZsYWdzJktPTlNUKXsKKyAgICBpZihvLT5mbGFncyZEUkVGT0JKKXsKKyAgICAgIGV2YWxfY29uc3QoJm8tPnZhbCxvLT5kdHlwKTsKKyAgICAgIGVtaXQoZiwiJWQiLHptMmwodm1heCkrMyk7CisgICAgfWVsc2V7CisgICAgICBldmFsX2NvbnN0KCZvLT52YWwsdCk7CisgICAgICBpZihJU0ZMT0FUKHQpKSBjbnZfZnAoKTsKKyAgICAgIGVtaXQoZiwiIyVkIiwoem0ybCh2bWF4KT4+MjQpJjI1NSk7CisgICAgfQorICB9ZWxzZSBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgZW1pdChmLCIlcyszIixtcmVnbmFtZXNbby0+cmVnXSk7CisgIH1lbHNleworICAgIGlmKCEoby0+ZmxhZ3MmRFJFRk9CSikpCisgICAgICBvLT52YWwudm1heD16bWFkZChvLT52YWwudm1heCxsMnptKDNMKSk7CisgICAgZW1pdF9vYmooZixvLHQpOworICAgIGlmKCEoby0+ZmxhZ3MmRFJFRk9CSikpCisgICAgICBvLT52YWwudm1heD16bXN1YihvLT52YWwudm1heCxsMnptKDNMKSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgbGRxX29mZnNldChGSUxFICpmLG9iaiAqbykKK3sKKyAgaWYoby0+YW0peworICAgIGlmKG8tPmFtLT5mbGFncz09SU1NX0lORCkKKyAgICAgIGVtaXQoZiwiXHRsZHpcdCMlbGRcbiIsby0+YW0tPm9mZnNldCk7CisgICAgZWxzZSBpZihvLT5hbS0+ZmxhZ3M9PUdQUl9JTkR8fG8tPmFtLT5mbGFncz09QUJTX0lORCl7CisgICAgICBpZihvLT5hbS0+aWR4PT1yYSkKKwllbWl0KGYsIlx0dGF6XG4iKTsKKyAgICAgIGVsc2V7CisJaWYoSVNJRFgoby0+YW0tPmlkeCkpeworCSAgaWYoby0+YW0tPmZsYWdzPT1HUFJfSU5EKXsKKwkgICAgZW1pdChmLCJcdHBoYVxuIik7CisJICAgIGVtaXQoZiwiXHR0JXNhXG4iLG1yZWduYW1lc1tvLT5hbS0+aWR4XSk7CisJICAgIGVtaXQoZiwiXHR0YXpcbiIpOworCSAgICBlbWl0KGYsIlx0cGxhXG4iKTsKKwkgIH0KKwl9ZWxzZQorCSAgZW1pdChmLCJcdGxkelx0JXNcbiIsbXJlZ25hbWVzW28tPmFtLT5pZHhdKTsKKyAgICAgIH0KKyAgICB9ZWxzZQorICAgICAgaWVycm9yKDApOworICB9ZWxzZSBpZigoby0+ZmxhZ3MmKERSRUZPQkp8S09OU1QpKT09RFJFRk9CSil7CisgICAgLyppZighenplcm8pKi8gZW1pdChmLCJcdGxkelx0IzBcbiIpOworICB9ZWxzZSBpZigoby0+ZmxhZ3MmKFZBUnxSRUd8VkFSQURSKSk9PVZBUiYmKG8tPnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fG8tPnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKSl7CisgICAgZW1pdChmLCJcdGxkelx0IyVsZFxuIixyZWFsX29mZnNldChvKSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgZG9fYW1sb2FkKEZJTEUgKmYsb2JqICpvKQoreworICBpZihvLT5hbS0+ZmxhZ3M9PUdQUl9JTkR8fG8tPmFtLT5mbGFncz09QUJTX0lORCl7CisgICAgaWYoby0+YW0tPmlkeD09cmEpCisgICAgICBlbWl0KGYsIlx0dGF5XG4iKTsKKyAgICBlbHNleworICAgICAgaWYoSVNJRFgoby0+YW0tPmlkeCkpeworCWlmKG8tPmFtLT5mbGFncz09R1BSX0lORCl7CisJICBlbWl0KGYsIlx0cGhhXG4iKTsKKwkgIGVtaXQoZiwiXHR0JXNhXG4iLG1yZWduYW1lc1tvLT5hbS0+aWR4XSk7CisJICBlbWl0KGYsIlx0dGF5XG4iKTsKKwkgIGVtaXQoZiwiXHRwbGFcbiIpOworCX0KKyAgICAgIH1lbHNleworCWlmKG8tPmFtLT5pZHg9PXJhKQorCSAgZW1pdChmLCJcdHRheVxuIik7CisJZWxzZQorCSAgZW1pdChmLCJcdGxkeVx0JXNcbiIsbXJlZ25hbWVzW28tPmFtLT5pZHhdKTsKKyAgICAgIH0KKyAgICB9CisgIH1lbHNlCisgICAgaWVycm9yKDApOworfQorc3RhdGljIHZvaWQgZG9fbG9ieXRlKEZJTEUgKmYsY2hhciAqcyxvYmogKm8saW50IHR5cGUpCit7CisgIGlmKG8tPmFtKXsKKyAgICBpZihvLT5hbS0+ZmxhZ3M9PUlNTV9JTkQpCisgICAgICBzZXR5KGYsby0+YW0tPm9mZnNldCk7CisgICAgZWxzZXsKKyAgICAgIGRvX2FtbG9hZChmLG8pOworICAgICAgeXZhbD1OT1ZBTDsKKyAgICB9CisgIH1lbHNlIGlmKChvLT5mbGFncyYoRFJFRk9CSnxLT05TVCkpPT1EUkVGT0JKKXsKKyAgICBpZighenplcm8pIHNldHkoZiwwKTsKKyAgfWVsc2UgaWYoKG8tPmZsYWdzJihWQVJ8UkVHfFZBUkFEUikpPT1WQVImJihvLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikpeworICAgIHNldHkoZiwoaW50KXJlYWxfb2Zmc2V0KG8pKTsKKyAgfQorICBlbWl0KGYsIlx0JXNcdCIscyk7CisgIGVtaXRfbG9ieXRlKGYsbyx0eXBlKTsKKyAgZW1pdChmLCJcbiIpOworfQorCitzdGF0aWMgdm9pZCBkb19oaWJ5dGUoRklMRSAqZixjaGFyICpzLG9iaiAqbyxpbnQgdHlwZSkKK3sKKyAgaW50IGFtaT0wOworICBpZihvLT5hbSl7CisgICAgaWYoby0+YW0tPmZsYWdzPT1JTU1fSU5EKQorICAgICAgc2V0eShmLG8tPmFtLT5vZmZzZXQrMSk7CisgICAgZWxzZXsKKyAgICAgIGRvX2FtbG9hZChmLG8pOworICAgICAgaWYoby0+YW0tPmZsYWdzPT1HUFJfSU5EKXsKKwllbWl0KGYsIlx0aW55XG4iKTsKKyAgICAgIH1lbHNleworCW8tPmFtLT5vZmZzZXQrKzthbWk9MTsKKyAgICAgIH0KKyAgICAgIHl2YWw9Tk9WQUw7CisgICAgfQorICB9ZWxzZSAgaWYoKG8tPmZsYWdzJihEUkVGT0JKfEtPTlNUKSk9PURSRUZPQkopeworICAgIHNldHkoZiwxKTsKKyAgfWVsc2UgaWYoKG8tPmZsYWdzJihWQVJ8UkVHfFZBUkFEUikpPT1WQVImJihvLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikpeworICAgIHNldHkoZiwoaW50KXJlYWxfb2Zmc2V0KG8pKzEpOworICB9CisgIGVtaXQoZiwiXHQlc1x0IixzKTsKKyAgZW1pdF9oaWJ5dGUoZixvLHR5cGUpOworICBlbWl0KGYsIlxuIik7CisgIGlmKGFtaSkgby0+YW0tPm9mZnNldC0tOworfQorCitzdGF0aWMgdm9pZCBkb19ieXRlMyhGSUxFICpmLGNoYXIgKnMsb2JqICpvLGludCB0eXBlKQoreworICBpbnQgYW1pPTA7CisgIGlmKG8tPmFtKXsKKyAgICBpZihvLT5hbS0+ZmxhZ3M9PUlNTV9JTkQpCisgICAgICBzZXR5KGYsby0+YW0tPm9mZnNldCsyKTsKKyAgICBlbHNleworICAgICAgZG9fYW1sb2FkKGYsbyk7CisgICAgICBpZihvLT5hbS0+ZmxhZ3M9PUdQUl9JTkQpeworCWVtaXQoZiwiXHRpbnlcblx0aW55XG4iKTsKKyAgICAgIH1lbHNleworCW8tPmFtLT5vZmZzZXQrPTI7YW1pPTE7CisgICAgICB9CisgICAgICB5dmFsPU5PVkFMOworICAgIH0KKyAgfWVsc2UgIGlmKChvLT5mbGFncyYoRFJFRk9CSnxLT05TVCkpPT1EUkVGT0JKKXsKKyAgICBzZXR5KGYsMik7CisgIH1lbHNlIGlmKChvLT5mbGFncyYoVkFSfFJFR3xWQVJBRFIpKT09VkFSJiYoby0+di0+c3RvcmFnZV9jbGFzcz09QVVUT3x8by0+di0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpKXsKKyAgICBzZXR5KGYsKGludClyZWFsX29mZnNldChvKSsyKTsKKyAgfQorICBlbWl0KGYsIlx0JXNcdCIscyk7CisgIGVtaXRfYnl0ZTMoZixvLHR5cGUpOworICBlbWl0KGYsIlxuIik7CisgIGlmKGFtaSkgby0+YW0tPm9mZnNldC09MjsKK30KKworc3RhdGljIHZvaWQgZG9fYnl0ZTQoRklMRSAqZixjaGFyICpzLG9iaiAqbyxpbnQgdHlwZSkKK3sKKyAgaW50IGFtaT0wOworICBpZihvLT5hbSl7CisgICAgaWYoby0+YW0tPmZsYWdzPT1JTU1fSU5EKQorICAgICAgc2V0eShmLG8tPmFtLT5vZmZzZXQrMyk7CisgICAgZWxzZXsKKyAgICAgIGRvX2FtbG9hZChmLG8pOworICAgICAgaWYoby0+YW0tPmZsYWdzPT1HUFJfSU5EKXsKKwllbWl0KGYsIlx0aW55XG5cdGlueVxuXHRpbnlcbiIpOworICAgICAgfWVsc2V7CisJby0+YW0tPm9mZnNldCs9MzthbWk9MTsKKyAgICAgIH0KKyAgICAgIHl2YWw9Tk9WQUw7CisgICAgfQorICB9ZWxzZSAgaWYoKG8tPmZsYWdzJihEUkVGT0JKfEtPTlNUKSk9PURSRUZPQkopeworICAgIHNldHkoZiwzKTsKKyAgfWVsc2UgaWYoKG8tPmZsYWdzJihWQVJ8UkVHfFZBUkFEUikpPT1WQVImJihvLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikpeworICAgIHNldHkoZiwoaW50KXJlYWxfb2Zmc2V0KG8pKzMpOworICB9CisgIGVtaXQoZiwiXHQlc1x0IixzKTsKKyAgZW1pdF9ieXRlNChmLG8sdHlwZSk7CisgIGVtaXQoZiwiXG4iKTsKKyAgaWYoYW1pKSBvLT5hbS0+b2Zmc2V0LT0zOworfQorCitzdGF0aWMgdm9pZCBsb2FkX2xvYnl0ZShGSUxFICpmLG9iaiAqbyxpbnQgdCkKK3sKKyAgaWYoKG8tPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpeworICAgIGlmKG8tPnJlZz09cmF8fG8tPnJlZz09cmF4KQorICAgICAgcmV0dXJuOworICAgIGlmKG8tPnJlZz09cngpeworICAgICAgZW1pdChmLCJcdHR4YVxuIik7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGRvX2xvYnl0ZShmLCJsZGEiLG8sdCk7Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfaGlieXRlKEZJTEUgKmYsb2JqICpvLGludCB0KQoreworICBpZigoby0+ZmxhZ3MmUkVHKSYmKG8tPnJlZz09cnh8fG8tPnJlZz09cmF4KSkKKyAgICBlbWl0KGYsIlx0dHhhXG4iKTsKKyAgZWxzZQorICAgIGRvX2hpYnl0ZShmLCJsZGEiLG8sdCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3JlX2xvYnl0ZShGSUxFICpmLG9iaiAqbyxpbnQgdCkKK3sKKyAgaWYoKG8tPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpeworICAgIGlmKG8tPnJlZz09cmF8fG8tPnJlZz09cmF4KQorICAgICAgcmV0dXJuOworICAgIGlmKG8tPnJlZz09cngpeworICAgICAgZW1pdChmLCJcdHRheFxuIik7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGRvX2xvYnl0ZShmLCJzdGEiLG8sdCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3JlX2hpYnl0ZShGSUxFICpmLG9iaiAqbyxpbnQgdCkKK3sKKyAgaWYoKG8tPmZsYWdzJlJFRykmJihvLT5yZWc9PXJ4fHxvLT5yZWc9PXJheCkpCisgICAgZW1pdChmLCJcdHRheFxuIik7CisgIGVsc2UKKyAgICBkb19oaWJ5dGUoZiwic3RhIixvLHQpOworfQorCitzdGF0aWMgdm9pZCBsb2FkX2FjYyhGSUxFICpmLG9iaiAqbyxpbnQgdHlwZSkKK3sKKyAgaWYoKG8tPmZsYWdzJlJFRykmJihvLT5yZWc9PXJhfHxvLT5yZWc9PXJheCkpCisgICAgcmV0dXJuOworICBpZighSVNDSEFSKHR5cGUpKXsKKyAgICBpZihpbmRpcmVjdChvKSl7CisgICAgICBkb19oaWJ5dGUoZiwibGRhIixvLHR5cGUpOworICAgICAgZW1pdChmLCJcdHRheFxuIik7CisgICAgfWVsc2UKKyAgICAgIGRvX2hpYnl0ZShmLCJsZHgiLG8sdHlwZSk7CisgIH0KKyAgaWYoKG8tPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJm8tPnJlZz09cngpCisgICAgZW1pdChmLCJcdHR4YVxuIik7CisgIGVsc2UKKyAgICBkb19sb2J5dGUoZiwibGRhIixvLHR5cGUpOworfQorCitzdGF0aWMgdm9pZCBzdG9yZV9hY2MoRklMRSAqZixvYmogKm8saW50IHR5cGUpCit7CisgIGlmKChvLT5mbGFncyYoRFJFRk9CSnxLT05TVCkpPT1EUkVGT0JKJiYoKCEoby0+ZmxhZ3MmUkVHKSl8fCFpc3B0cihvLT5yZWcpKSl7CisgICAgaWVycm9yKDApOworICB9CisgIGlmKChvLT5mbGFncyZSRUcpJiYoby0+cmVnPT1yYXx8by0+cmVnPT1yYXgpKQorICAgIHJldHVybjsKKyAgaWYoKG8tPmZsYWdzJlJFRykmJm8tPnJlZz09cngpeworICAgIGVtaXQoZiwiXHR0YXhcbiIpOworICAgIHJldHVybjsKKyAgfQorICBzdG9yZV9sb2J5dGUoZixvLHR5cGUpOworICBpZighSVNDSEFSKHR5cGUpKXsKKyAgICBpZihpbmRpcmVjdChvKSl7CisgICAgICAvKlRPRE86IHNhdmUgYWNjdSAqLworICAgICAgZW1pdChmLCJcdHR4YVxuIik7CisgICAgICBzdG9yZV9oaWJ5dGUoZixvLHR5cGUpOworICAgIH1lbHNlCisgICAgICBkb19oaWJ5dGUoZiwic3R4IixvLHR5cGUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfcmVnKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdHlwZSkKK3sKKyAgc3RhdGljIG9iaiBybzsKKyAgaWYoSVNJRFgocikmJiFpbmRpcmVjdChvKSl7CisgICAgc3RhdGljIGNoYXIgbGRyWzRdPSJsZHIiOworICAgIGxkclsyXT1tcmVnbmFtZXNbcl1bMF07CisgICAgZG9fbG9ieXRlKGYsbGRyLG8sdHlwZSk7CisgICAgcmV0dXJuOworICB9CisgIHJvLmZsYWdzPVJFRzsKKyAgcm8ucmVnPXI7CisgIGxvYWRfbG9ieXRlKGYsbyx0eXBlKTsKKyAgc3RvcmVfbG9ieXRlKGYsJnJvLHR5cGUpOworICBpZighSVNDSEFSKHR5cGUpKXsKKyAgICBsb2FkX2hpYnl0ZShmLG8sdHlwZSk7CisgICAgc3RvcmVfaGlieXRlKGYsJnJvLHR5cGUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHN0b3JlX3JlZyhGSUxFICpmLGludCByLHN0cnVjdCBvYmogKm8saW50IHR5cGUpCit7CisgIHN0YXRpYyBvYmogcm87CisgIGlmKElTSURYKHIpKXsKKyAgICBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgICBpZihvLT5yZWc9PXIpCisJcmV0dXJuOworICAgICAgaWYoby0+cmVnPT1yYSl7CisJZW1pdChmLCJcdHQlc2FcbiIsbXJlZ25hbWVzW3JdKTsKKwlyZXR1cm47CisgICAgICB9CisgICAgfQorICAgIGlmKCFpbmRpcmVjdChvKSl7CisgICAgICBzdGF0aWMgY2hhciBzdHJbNF09InN0ciI7CisgICAgICBzdHJbMl09bXJlZ25hbWVzW3JdWzBdOworICAgICAgZG9fbG9ieXRlKGYsc3RyLG8sdHlwZSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIHJvLmZsYWdzPVJFRzsKKyAgcm8ucmVnPXI7CisgIGlmKHIhPXJhJiZyIT1yYXgpCisgICAgbG9hZF9hY2MoZiwmcm8sdHlwZSk7CisgIHN0b3JlX2FjYyhmLG8sdHlwZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnBjb25zdGxpc3QgeworICBzdHJ1Y3QgZnBjb25zdGxpc3QgKm5leHQ7CisgIGludCBsYWJlbDsKKyAgaW50IHQ7CisgIHVuaW9uIGF0eXBzIHZhbDsKK30gKmZpcnN0ZnBjOworCitzdGF0aWMgaW50IGFkZGZwY29uc3Qoc3RydWN0IG9iaiAqbyxpbnQgdCkKK3sKKyAgc3RydWN0IGZwY29uc3RsaXN0ICpwPWZpcnN0ZnBjOworICB0Jj1OUTsKKyAgaWYodD09TERPVUJMRSkgdD1ET1VCTEU7CisgIGZvcihwPWZpcnN0ZnBjO3A7cD1wLT5uZXh0KXsKKyAgICBpZih0PT1wLT50KXsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnZhbCx0KTsKKyAgICAgIGlmKHQ9PUZMT0FUJiZ6bGRlcXRvKHZsZG91YmxlLHpmMnpsZChvLT52YWwudmZsb2F0KSkpIHJldHVybiBwLT5sYWJlbDsKKyAgICAgIGlmKHQ9PURPVUJMRSYmemxkZXF0byh2bGRvdWJsZSx6ZDJ6bGQoby0+dmFsLnZkb3VibGUpKSkgcmV0dXJuIHAtPmxhYmVsOworICAgICAgaWYodD09TE9ORyYmem1lcXRvKHZtYXgsemwyem0oby0+dmFsLnZsb25nKSkpIHJldHVybiBwLT5sYWJlbDsKKyAgICAgIGlmKHQ9PUxMT05HJiZ6bWVxdG8odm1heCx6bGwyem0oby0+dmFsLnZsbG9uZykpKSByZXR1cm4gcC0+bGFiZWw7CisgICAgfQorICB9CisgIHA9bXltYWxsb2Moc2l6ZW9mKHN0cnVjdCBmcGNvbnN0bGlzdCkpOworICBwLT5uZXh0PWZpcnN0ZnBjOworICBwLT50PXQ7CisgIHAtPmxhYmVsPSsrbGFiZWw7CisgIHAtPnZhbD1vLT52YWw7CisgIGZpcnN0ZnBjPXA7CisgIHJldHVybiBwLT5sYWJlbDsKK30KKworLyogZ2VuZXJhdGUgY29kZSB0byBsb2FkIHRoZSBhZGRyZXNzIG9mIGEgbG9jYWwgdmFyaWFibGUgaW50byByZWdpc3RlciByICovCitzdGF0aWMgdm9pZCBsb2FkX2xhZGRyKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbykKK3sKKyAgbG9uZyBsPXJlYWxfb2Zmc2V0KG8pOworICAvKiBhc3N1bWVzIGFjYyBpcyBhdmFpbGFibGUgKi8KKyAgaWYoIXJlZ19wYWlyKHIsJnJwKSkgaWVycm9yKDApOworICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbZnBdKTsKKyAgaWYobCE9MCkKKyAgICBlbWl0KGYsIlx0Y2xjXG4iKTsKKyAgaWYobCYyNTUpCisgICAgZW1pdChmLCJcdGFkY1x0IyVsZFxuIixsJjI1NSk7CisgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMV0pOworICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbZnAyXSk7CisgIGlmKGwhPTApCisgICAgZW1pdChmLCJcdGFkY1x0IyVsZFxuIiwobD4+OCkmMjU1KTsKKyAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIyXSk7Cit9CisKKy8qIGdlbmVyYXRlIGNvZGUgdG8gbG9hZCB0aGUgYWRkcmVzcyBvZiBhIHZhcmlhYmxlIGludG8gcmVnaXN0ZXIgciAqLworc3RhdGljIHZvaWQgbG9hZF9hZGRyZXNzKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdCkKK3sKKyAgaWYoby0+ZmxhZ3MmRFJFRk9CSil7CisgICAgby0+ZmxhZ3MmPX5EUkVGT0JKOworICAgIGxvYWRfcmVnKGYscixvLFBPSU5URVIpOworICAgIG8tPmZsYWdzfD1EUkVGT0JKOworICB9ZWxzZSBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgaWYoIXJlZ19wYWlyKHIsJnJwKSkgaWVycm9yKDApOworICAgIGVtaXQoZiwiXHRsZGFcdCM+JXNcbiIsbXJlZ25hbWVzW28tPnJlZ10pOworICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworICAgIGVtaXQoZiwiXHRsZGFcdCM8JXNcbiIsbXJlZ25hbWVzW28tPnJlZ10pOworICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMV0pOyAgICAKKyAgfWVsc2UgaWYoby0+ZmxhZ3MmVkFSKXsKKyAgICBpZihvLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CisgICAgICBsb2FkX2xhZGRyKGYscixvKTsKKyAgICB9ZWxzZXsKKyAgICAgIG8tPmZsYWdzfD1WQVJBRFI7CisgICAgICBsb2FkX3JlZyhmLHIsbyxQT0lOVEVSKTsKKyAgICAgIG8tPmZsYWdzJj1+VkFSQURSOworICAgIH0KKyAgfWVsc2UgaWYoKG8tPmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKyAgICBpbnQgbD1hZGRmcGNvbnN0KG8sdCk7CisgICAgaWYoIWllZWUpIGllcnJvcigwKTsKKyAgICBpZighcmVnX3BhaXIociwmcnApKSBpZXJyb3IoMCk7CisgICAgZW1pdChmLCJcdGxkYVx0Iz4lcyVkXG4iLGxhYnByZWZpeCxsKTsKKyAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsKKyAgICBlbWl0KGYsIlx0bGRhXHQjPCVzJWRcbiIsbGFicHJlZml4LGwpOworICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMV0pOyAgICAKKyAgfWVsc2UKKyAgICBpZXJyb3IoMCk7Cit9CisKKworLyogIFlpZWxkcyBsb2cyKHgpKzEgb3IgMC4gKi8KK3N0YXRpYyBsb25nIHBvZjIoenVtYXggeCkKK3sKKyAgenVtYXggcDtpbnQgbG49MTsKKyAgcD11bDJ6dW0oMUwpOworICB3aGlsZShsbjw9MzImJnp1bWxlcShwLHgpKXsKKyAgICBpZih6dW1lcXRvKHgscCkpIHJldHVybiBsbjsKKyAgICBsbisrO3A9enVtYWRkKHAscCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGluY21lbShGSUxFICpmLG9iaiAqbyxpbnQgdCxpbnQgb3AsaW50IHgpCit7CisgIGludCBpLGlkeD0wOworICBjaGFyICpzOworICBpZihjZTAyJiZJU1NIT1JUKHQpKXsKKyAgICBpZigoKG8tPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJihvcD09QUREfHxvcD09U1VCKSl8fAorICAgICAgIChvcD09TFNISUZUJiYhaW5kaXJlY3QobykmJiFvLT5hbSkpeworICAgICAgZG97CisJZW1pdChmLCJcdCVzXHQlc1xuIixvcD09QUREPyJpbnciOihvcD09U1VCPyJkZXciOiJhc3ciKSxtcmVnbmFtZXNbby0+cmVnXSk7CisgICAgICB9d2hpbGUoLS14KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgaWYoKG8tPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJklTSURYKG8tPnJlZykpeworICAgIHN0YXRpYyBjaGFyIGJ1Zls0XT0iICAgIjsKKyAgICBpZHg9MTtzPWJ1ZjsKKyAgICBpZihvcD09QUREKXtzWzBdPSdpJztzWzFdPSduJzt9ZWxzZXtzWzBdPSdkJztzWzFdPSdlJzt9CisgICAgc1syXT1tcmVnbmFtZXNbby0+cmVnXVswXTsKKyAgfWVsc2UgaWYob3A9PUFERCkKKyAgICBzPSJpbmMiOworICBlbHNlIGlmKG9wPT1TVUIpCisgICAgcz0iZGVjIjsKKyAgZWxzZSBpZihvcD09TFNISUZUKQorICAgIHM9ImFzbCI7CisgIGVsc2UgaWYob3A9PVJTSElGVCYmKHQmVU5TSUdORUQpKQorICAgIHM9ImxzciI7CisgIGVsc2UgaWYob3A9PVJTSElGVCl7CisgICAgcz0iY21wXHQjMTI4XG5cdHJvciI7CisgIH1lbHNlCisgICAgaWVycm9yKDApOworICBpZihJU0NIQVIodCkpeworICAgIGZvcihpPTA7aTx4O2krKyl7CisgICAgICBpZihpZHgpeworCWVtaXQoZiwiXHQlc1xuIixzKTsKKyAgICAgIH1lbHNleworCWVtaXQoZiwiXHQlc1x0IixzKTsKKwllbWl0X29iaihmLG8sdCk7CisJZW1pdChmLCJcbiIpOworICAgICAgfQorICAgIH0KKyAgfWVsc2V7CisgICAgZm9yKGk9MDtpPHg7aSsrKXsKKyAgICAgIGlmKG9wPT1TVUIpeworCWlmKG02NSYmSVNMT05HKHQpKXsKKwkgIGVtaXQoZiwiXHRkZXFcdCIpOworCSAgZW1pdF9vYmooZixvLHQpOworCSAgZW1pdChmLCJcbiIpOworCX1lbHNlIGlmKGNlMDImJmlzenBhZ2UobykpeworCSAgZW1pdChmLCJcdGRld1xuIik7CisJfWVsc2V7CisJICAvKiBjYWxsZXIgbXVzIG1ha2Ugc3VyZSBhY2N1IGlzIGF2YWlsYWJsZSAqLworCSAgbG9hZF9sb2J5dGUoZixvLHQpOworCSAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICBlbWl0KGYsIlx0ZGVjXHQiKTsKKwkgIGVtaXRfaGlieXRlKGYsbyx0KTsKKwkgIGVtaXQoZiwiXG4iKTsKKwkgIGlmKElTTE9ORyh0KSl7CisJICAgIGllcnJvcigwKTsKKwkgIH0KKwkgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgIGVtaXQoZiwiXHRkZWNcdCIpOworCSAgZW1pdF9sb2J5dGUoZixvLHQpOworCSAgZW1pdChmLCJcbiIpOworCX0KKyAgICAgIH1lbHNlIGlmKG9wPT1BREQpeworCWlmKCFvcHRzcGVlZCYmbTY1JiZJU0xPTkcodCkpeworCSAgZW1pdChmLCJcdGlucVx0Iik7CisJICBlbWl0X29iaihmLG8sdCk7CisJICBlbWl0KGYsIlxuIik7CisJfWVsc2UgaWYoIW9wdHNwZWVkJiZjZTAyJiZpc3pwYWdlKG8pKXsKKwkgIGVtaXQoZiwiXHRpbndcdCIpOworCSAgZW1pdF9sb2J5dGUoZixvLHQpOworCSAgZW1pdChmLCJcbiIpOworCSAgaWYoSVNMT05HKHQpKXsKKwkgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICAgIGVtaXQoZiwiXHRpbndcdCIpOworCSAgICBlbWl0X2J5dGUzKGYsbyx0KTsKKwkgICAgZW1pdChmLCJcbiIpOworCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICB9CisJfWVsc2V7CisJICBlbWl0KGYsIlx0JXNcdCIscyk7CisJICBlbWl0X2xvYnl0ZShmLG8sdCk7CisJICBlbWl0KGYsIlxuIik7CisJICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgIGVtaXQoZiwiXHQlc1x0IixzKTsKKwkgIGVtaXRfaGlieXRlKGYsbyx0KTsKKwkgIGVtaXQoZiwiXG4iKTsKKwkgIGlmKElTTE9ORyh0KSl7CisJICAgIGVtaXQoZiwiXHRibmVcdCVzJWRcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgICAgZW1pdChmLCJcdCVzXHQiLHMpOworCSAgICBlbWl0X2J5dGUzKGYsbyx0KTsKKwkgICAgZW1pdChmLCJcbiIpOworCSAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgIGVtaXQoZiwiXHQlc1x0IixzKTsKKwkgICAgZW1pdF9ieXRlNChmLG8sdCk7CisJICAgIGVtaXQoZiwiXG4iKTsKKwkgIH0KKwkgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwl9CisgICAgICB9ZWxzZSBpZihvcD09TFNISUZUKXsKKwlpZihjZTAyJiYhaW5kaXJlY3QobykmJiFvLT5hbSl7CisJICBlbWl0KGYsIlx0YXN3XHQiKTsKKwkgIGVtaXRfb2JqKGYsbyx0KTsKKwkgIGVtaXQoZiwiXG4iKTsKKwl9ZWxzZXsKKwkgIGVtaXQoZiwiXHRhc2xcdCIpOworCSAgZW1pdF9sb2J5dGUoZixvLHQpOworCSAgZW1pdChmLCJcbiIpOworCSAgZW1pdChmLCJcdHJvbFx0Iik7CisJICBlbWl0X2hpYnl0ZShmLG8sdCk7CisJICBlbWl0KGYsIlxuIik7CisJfQorCWlmKElTTE9ORyh0KSl7CisJICBkb19ieXRlMyhmLCJyb2wiLG8sdCk7CisJICBkb19ieXRlNChmLCJyb2wiLG8sdCk7CisJfQorICAgICAgfWVsc2UgaWYob3A9PVJTSElGVCYmKHQmVU5TSUdORUQpKXsKKwkvKmVtaXQoZiwiXHRjbGNcbiIpOworCSAgZW1pdChmLCJcdHJvclx0Iik7Ki8KKwlpZihJU0xPTkcodCkpeworCSAgZG9fYnl0ZTQoZiwibHNyIixvLHQpOworCSAgZG9fYnl0ZTMoZiwicm9yIixvLHQpOworCSAgZG9faGlieXRlKGYsInJvciIsbyx0KTsKKwl9ZWxzZQorCSAgZG9faGlieXRlKGYsImxzciIsbyx0KTsKKwlkb19sb2J5dGUoZiwicm9yIixvLHQpOworICAgICAgfWVsc2UgaWYob3A9PVJTSElGVCl7CisJaWYoY2UwMil7CisJICBlbWl0KGYsIlx0YXNyXHQiKTsKKwl9ZWxzZXsKKwkgIGlmKElTTE9ORyh0KSkKKwkgICAgZG9fYnl0ZTQoZiwibGRhIixvLHQpOworCSAgZWxzZQorCSAgICBsb2FkX2hpYnl0ZShmLG8sdCk7CisJICBlbWl0KGYsIlx0Y21wXHQjMTI4XG4iKTsKKwkgIGVtaXQoZiwiXHRyb3JcdCIpOworCX0KKwlpZihJU0xPTkcodCkpCisJICBlbWl0X2J5dGU0KGYsbyx0KTsKKwllbHNlCisJICBlbWl0X2hpYnl0ZShmLG8sdCk7CisJZW1pdChmLCJcbiIpOworCWlmKElTTE9ORyh0KSl7CisJICBkb19ieXRlMyhmLCJyb3IiLG8sdCk7CisJICBkb19oaWJ5dGUoZiwicm9yIixvLHQpOworCX0KKwlkb19sb2J5dGUoZiwicm9yIixvLHQpOworICAgICAgfWVsc2V7CisJcHJpbnRmKCJvcD0lZFxuIixvcCk7CisJaWVycm9yKDApOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBwcmVsb2FkX29iaihGSUxFICpmLElDICpwLG9iaiAqbykKK3sKKyAgaW50IHIscGE9MCxweD0wLGxvbmdtNjU9MDtsb25nIG9mOworCisgIGlmKChwLT50eXBmJlZPTEFUSUxFKXx8KHAtPnR5cGYyJlZPTEFUSUxFKXx8CisgICAgICgocC0+cTEuZmxhZ3MmRFJFRk9CSikmJihwLT5xMS5kdHlwJihWT0xBVElMRXxQVk9MQVRJTEUpKSl8fAorICAgICAoKHAtPnEyLmZsYWdzJkRSRUZPQkopJiYocC0+cTIuZHR5cCYoVk9MQVRJTEV8UFZPTEFUSUxFKSkpfHwKKyAgICAgKChwLT56LmZsYWdzJkRSRUZPQkopJiYocC0+ei5kdHlwJihWT0xBVElMRXxQVk9MQVRJTEUpKSkpCisgICAgZW1pdChmLCI7IHZvbGF0aWxlIGJhcnJpZXJcbiIpOworCisKKyAgaWYobTY1KXsKKyAgICBpbnQgdDsKKyAgICBpZihvPT0mcC0+cTEpCisgICAgICB0PXExdHlwKHApOworICAgIGVsc2V7CisgICAgICBpZihvPT0mcC0+cTIpIHQ9cTJ0eXAocCk7CisgICAgICBlbHNlIGlmKG89PSZwLT56KSB0PXp0eXAocCk7CisgICAgICBlbHNlIGllcnJvcigwKTsKKyAgICAgIGlmKElTTE9ORyh0KSYmTE9OR002NShwLT5jb2RlKSkgbG9uZ202NT0xOworICAgIH0KKyAgfQorCisgIGlmKChvLT5mbGFncyYoVkFSfFJFRykpPT1WQVImJihvLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikmJigoKG9mPXJlYWxfb2Zmc2V0KG8pKSt6bTJsKHN6b2Yoby0+di0+dnR5cCkpPjI1NSl8fGxvbmdtNjUpKXsKKyAgICByPWdldF9yZWcoZixwLFBPSU5URVIpOworICAgIGlmKG8tPmZsYWdzJkRSRUZPQkopeworICAgICAgaWYocC0+Y29kZT09R0VUUkVUVVJOJiYocC0+cTEucmVnPT1yYXx8cC0+cTEucmVnPT1yYXgpKXsKKwllbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbdDFdKTsKKwllbWl0KGYsIlx0c3R4XHQlc1xuIixtcmVnbmFtZXNbdDJdKTsKKwlwYT1weD0xOworICAgICAgfWVsc2UKKwlnZXRfYWNjKGYscCxJTlQpOworICAgIH1lbHNleworICAgICAgaWYocC0+Y29kZT09R0VUUkVUVVJOJiYocC0+cTEucmVnPT1yYXx8cC0+cTEucmVnPT1yYXgpKXsKKwllbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbdDFdKTsKKwlwYT0xOworICAgICAgfWVsc2UKKwljbXBfZ2V0X2FjYyhmLHAsMCk7CisgICAgfQorICAgIGlmKCFyZWdfcGFpcihyLCZycCkpIGllcnJvcigwKTsKKyAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbZnAxXSk7CisgICAgZW1pdChmLCJcdGNsY1xuIik7CisgICAgaWYob2YmMHhmZikKKyAgICAgIGVtaXQoZiwiXHRhZGNcdCMlbGRcbiIsb2YmMHhmZik7CisgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW2ZwMl0pOworICAgIGlmKDEvKm9mJjB4ZmYwMCovKQorICAgICAgZW1pdChmLCJcdGFkY1x0IyVsZFxuIiwob2Y+PjgpJjB4ZmYpOworICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworICAgIG8tPmZsYWdzfD1SRUc7CisgICAgby0+cmVnPXI7CisgICAgaWYoby0+ZmxhZ3MmRFJFRk9CSil7CisgICAgICBpZighenplcm8pIHNldHkoZiwwKTsKKyAgICAgIGVtaXQoZiwiXHRsZGFcdCglcyklc1xuIixtcmVnbmFtZXNbcl0senplcm8/IiI6Iix5Iik7CisgICAgICBlbWl0KGYsIlx0dHhhXG4iKTsKKyAgICAgIHNldHkoZiwxKTsKKyAgICAgIGVtaXQoZiwiXHRsZGFcdCglcykseVxuIixtcmVnbmFtZXNbcl0pOworICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIyXSk7CisgICAgICBlbWl0KGYsIlx0c3R4XHQlc1xuIixtcmVnbmFtZXNbcnAucjFdKTsKKyAgICB9ZWxzZXsKKyAgICAgIG8tPmZsYWdzfD1EUkVGT0JKOworICAgICAgby0+ZHR5cD1QT0lOVEVSOworICAgIH0KKyAgICBpZihwYSl7IGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1t0MV0pOyBwYT0wO30KKyAgICBpZihweCl7IGVtaXQoZiwiXHRsZHhcdCVzXG4iLG1yZWduYW1lc1t0Ml0pOyBweD0wO30KKyAgfQorCisgIGlmKChvLT5mbGFncyYoRFJFRk9CSnxLT05TVCkpPT1EUkVGT0JKJiYoIShvLT5mbGFncyZSRUcpfHwhaXNwdHIoby0+cmVnKSkmJighKG8tPmZsYWdzJlZBUil8fCEoby0+di0+dGF0dHImWlBBR0UpKSYmIUlTRlBPSU5URVIoby0+ZHR5cCkpeworICAgIGlmKHAtPmNvZGU9PUdFVFJFVFVSTiYmKHAtPnExLnJlZz09cmF8fHAtPnExLnJlZz09cmF4KSl7CisgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbdDFdKTsKKyAgICAgIHBhPTE7CisgICAgfWVsc2UKKyAgICAgIGNtcF9nZXRfYWNjKGYscCwwKTsKKyAgICByPWdldF9yZWcoZixwLFBPSU5URVIpOworICAgIG8tPmZsYWdzJj1+RFJFRk9CSjsKKyAgICBsb2FkX3JlZyhmLHIsbyxQT0lOVEVSKTsKKyAgICBvLT5mbGFnc3w9UkVHfERSRUZPQko7CisgICAgby0+cmVnPXI7CisgICAgaWYocGEpeyBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbdDFdKTsgcGE9MDt9CisgIH0KK30KKworc3RhdGljIHZvaWQgZmFyX2NvcHkoRklMRSAqZixJQyAqcCkKK3sKKyAgaW50IGI7bG9uZyBsOworICBnZXRfYWNjKGYscCxJTlQpOworICBpZihwLT5jb2RlPT1QVVNIKXsKKyAgICBpZighcmVnX3BhaXIoTEFTVF9QQUlSLCZycCkpIGllcnJvcigwKTsKKyAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbc3BdKTsKKyAgICBpZihwdXNoZWQpIGVtaXQoZiwiXHRjbGNcbiIpOworICAgIGlmKHB1c2hlZCYweGZmKSBlbWl0KGYsIlx0YWRjXHQjJWRcbiIsKHB1c2hlZCYweGZmKSk7CisgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisgICAgZW1pdChmLCJcdGxkYVx0JXMrMVxuIixtcmVnbmFtZXNbc3BdKTsKKyAgICBpZihwdXNoZWQpIGVtaXQoZiwiXHRhZGNcdCMlZFxuIiwoKHB1c2hlZD4+OCkmMHhmZikpOworICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworICAgIHB1c2hlZCs9em0ybChwLT5xMi52YWwudm1heCk7CisgICAgZW1pdChmLCJcdGxkeFx0IyVkXG4iLGJhbmtjbnVtKTsKKyAgfWVsc2UgaWYocC0+ei5mbGFncyZEUkVGT0JKKXsKKyAgICBpZighcmVnX3BhaXIoTEFTVF9QQUlSLCZycCkpIGllcnJvcigwKTsKKyAgICBwLT56LmZsYWdzJj1+RFJFRk9CSjsKKyAgICBsb2FkX2xvYnl0ZShmLCZwLT56LEZQT0lOVEVSKTsKKyAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAucjFdKTsKKyAgICBsb2FkX2hpYnl0ZShmLCZwLT56LEZQT0lOVEVSKTsKKyAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsKKyAgICBpZihpbmRpcmVjdCgmcC0+eikpeworICAgICAgZG9fYnl0ZTMoZiwibGRhIiwmcC0+eixGUE9JTlRFUik7CisgICAgICBlbWl0KGYsIlx0dGF4XG4iKTsKKyAgICB9ZWxzZQorICAgICAgZG9fYnl0ZTMoZiwibGR4IiwmcC0+eixGUE9JTlRFUik7CisgIH1lbHNleworICAgIGxvYWRfYWRkcmVzcyhmLExBU1RfUEFJUiwmcC0+eixQT0lOVEVSKTsKKyAgICBiPWJhbmsocC0+ei52KTsKKyAgICBlbWl0KGYsIlx0bGR4XHQjJWRcbiIsYj49MD9iOmJhbmtjbnVtKTsKKyAgfQorICBpZihwLT5xMS5mbGFncyZEUkVGT0JKKXsKKyAgICBpZighcmVnX3BhaXIoTEFTVF9QQUlSLTEsJnJwKSkgaWVycm9yKDApOworICAgIHAtPnExLmZsYWdzJj1+RFJFRk9CSjsKKyAgICBsb2FkX2xvYnl0ZShmLCZwLT5xMSxGUE9JTlRFUik7CisgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisgICAgbG9hZF9oaWJ5dGUoZiwmcC0+cTEsRlBPSU5URVIpOworICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworICAgIGlmKGluZGlyZWN0KCZwLT5xMSkpeworICAgICAgZG9fYnl0ZTMoZiwibGRhIiwmcC0+cTEsRlBPSU5URVIpOworICAgICAgZW1pdChmLCJcdHRheVxuIik7CisgICAgfWVsc2UKKyAgICAgIGRvX2J5dGUzKGYsImxkeSIsJnAtPnExLEZQT0lOVEVSKTsKKyAgfWVsc2V7CisgICAgbG9hZF9hZGRyZXNzKGYsTEFTVF9QQUlSLTEsJnAtPnExLFBPSU5URVIpOworICAgIGI9YmFuayhwLT5xMS52KTsKKyAgICBzZXR5KGYsYj49MD9iOmJhbmtjbnVtKTsKKyAgfQorICBsPXptMmwocC0+cTIudmFsLnZtYXgpOworICBlbWl0KGYsIlx0bGRhXHQjJWRcbiIsKGw+PjgpJjB4ZmYpOworICBlbWl0KGYsIlx0c3RhXHQlc19fYmFua2NvcHlfbGVuKzFcbiIsaWRwcmVmaXgpOworICBlbWl0KGYsIlx0bGRhXHQjJWRcbiIsKGwpJjB4ZmYpOworICBlbWl0KGYsIlx0c3RhXHQlc19fYmFua2NvcHlfbGVuXG4iLGlkcHJlZml4KTsKKyAgZW1pdChmLCJcdGxkYVx0IyVkXG4iLGNiYW5rPj0wP2NiYW5rOmJhbmtjbnVtKTsKKyAgZW1pdChmLCJcdGpzclx0JXNfX2Jhbmtjb3B5XG4iLGlkcHJlZml4KTsKKyAgeXZhbD1OT1ZBTDsKK30KKworc3RhdGljIHZvaWQgbG9hZF9mYXIoRklMRSAqZixJQyAqcCxvYmogKm8saW50IHQpCit7CisgIGludCBwdXNoZWQ9MDsKKyAgaWYoIShvLT5mbGFncyZEUkVGT0JKKSkgaWVycm9yKDApOworICBvLT5mbGFncyY9fkRSRUZPQko7CisgIHQmPU5ROworICBpZih6bWVxdG8oc2l6ZXRhYlt0XSxaMCkpIHJldHVybjsKKyAgLypnZXRfYWNjKGYscCxJTlQpOyovCisgIGlmKHB1c2hlZGFjYz09dDN8fHB1c2hlZGFjYz09dDQpIGllcnJvcigwKTsKKyAgaWYocHVzaGVkeD09dDN8fHB1c2hlZHg9PXQ0KSBpZXJyb3IoMCk7CisgIGlmKHJlZ3NbcmFdfHxyZWdzW3JheF0peworICAgIGlmKGlzYWNjKHExKXx8aXNhY2MocTIpfHwhaXNhY2MoeikpeworICAgICAgcHVzaGVkPTE7CisgICAgICBlbWl0KGYsIlx0cGhhXG4iKTsKKyAgICAgIGlmKHJlZ3NbcmF4XSkgZW1pdChmLCJcdHR4YVxuXHRwaGFcbiIpOworICAgIH0KKyAgfQorICBsb2FkX3JlZyhmLExBU1RfUEFJUixvLFBPSU5URVIpOworICBpZighaW5kaXJlY3QobykpCisgICAgZG9fYnl0ZTMoZiwibGR5IixvLENIQVIpOworICBlbHNleworICAgIGRvX2J5dGUzKGYsImxkYSIsbyxDSEFSKTsKKyAgICBlbWl0KGYsIlx0dGF5XG4iKTsKKyAgfQorICBlbWl0KGYsIlx0bGR4XHQjJWRcbiIsYmFua3ZvZmZzZXQpOworICBlbWl0KGYsIlx0bGRhXHQjJWRcbiIsY2Jhbms+PTA/Y2Jhbms6YmFua2NudW0pOworICBlbWl0KGYsIlx0anNyXHQlc19fYmFua2xvYWQlZFxuIixpZHByZWZpeCwoaW50KXptMmwoc2l6ZXRhYlt0XSkpOworICB5dmFsPU5PVkFMOworICBvLT5mbGFncz1WQVI7CisgIG8tPnY9JmJhbmt2OworICBvLT52YWwudm1heD1sMnptKChsb25nKWJhbmt2b2Zmc2V0KTsKKyAgYmFua3ZvZmZzZXQrPXptMmwoc2l6ZXRhYlt0XSk7CisgIGlmKHB1c2hlZCl7CisgICAgaWYocmVnc1tyYXhdKSBlbWl0KGYsIlx0cGxhXG5cdHRheFxuIik7CisgICAgZW1pdChmLCJcdHBsYVxuIik7CisgIH0KK30KKworc3RhdGljIHZvaWQgbG9hZF9iYW5rZWQoRklMRSAqZixJQyAqcCxvYmogKm8saW50IHQpCit7CisgIGludCBwdXNoZWQ9MCxtOworICBpZihvLT5mbGFncyZEUkVGT0JKKSB0PW8tPmR0eXA7CisgIHQmPU5ROworICBpZih6bWVxdG8oc2l6ZXRhYlt0XSxaMCkpIHJldHVybjsKKyAgLypnZXRfYWNjKGYscCxJTlQpOyovCisgIGlmKHB1c2hlZGFjYz09dDN8fHB1c2hlZGFjYz09dDQpIGllcnJvcigwKTsKKyAgaWYocHVzaGVkeD09dDN8fHB1c2hlZHg9PXQ0KSBpZXJyb3IoMCk7CisgIGlmKHJlZ3NbcmFdfHxyZWdzW3JheF0peworICAgIGlmKGlzYWNjKHExKXx8aXNhY2MocTIpfHwhaXNhY2MoeikpeworICAgICAgcHVzaGVkPTE7CisgICAgICBlbWl0KGYsIlx0cGhhXG4iKTsKKyAgICAgIGlmKHJlZ3NbcmF4XXx8cmVnc1tyeF0pIGVtaXQoZiwiXHR0eGFcblx0cGhhXG4iKTsKKyAgICB9CisgIH0KKyAgbT1vLT5mbGFnczsKKyAgby0+ZmxhZ3MmPX5EUkVGT0JKOworICBsb2FkX2FkZHJlc3MoZixMQVNUX1BBSVIsbyxQT0lOVEVSKTsKKyAgby0+ZmxhZ3M9bTsKKyAgZW1pdChmLCJcdGxkeFx0IyVkXG4iLGJhbmt2b2Zmc2V0KTsKKyAgZW1pdChmLCJcdGxkYVx0IyVkXG4iLGNiYW5rPj0wP2NiYW5rOmJhbmtjbnVtKTsKKyAgc2V0eShmLGJhbmsoby0+dikpOworICBlbWl0KGYsIlx0anNyXHQlc19fYmFua2xvYWQlZFxuIixpZHByZWZpeCwoaW50KXptMmwoc2l6ZXRhYlt0XSkpOworICB5dmFsPU5PVkFMOworICBvLT52PSZiYW5rdjsKKyAgby0+dmFsLnZtYXg9bDJ6bSgobG9uZyliYW5rdm9mZnNldCk7CisgIGJhbmt2b2Zmc2V0Kz16bTJsKHNpemV0YWJbdF0pOworICBpZihwdXNoZWQpeworICAgIGlmKHJlZ3NbcmF4XXx8cmVnc1tyeF0pIGVtaXQoZiwiXHRwbGFcblx0dGF4XG4iKTsKKyAgICBlbWl0KGYsIlx0cGxhXG4iKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBwcmVsb2FkKEZJTEUgKmYsSUMgKnApCit7CisgIGludCByLG1yYT1yZWdzW3JhXSxtcmF4PXJlZ3NbcmF4XTsKKyAgaW50IGJxMT0tMSxicTI9LTEsYno9LTEsc2I9LTEsemJ1Zj0wOworCisgIGlmKCgocC0+cTEuZmxhZ3MmRFJFRk9CSikmJnAtPnExLmFtJiYocC0+cTEuYW0tPmZsYWdzPT1HUFJfSU5EfHxwLT5xMS5hbS0+ZmxhZ3M9PUFCU19JTkQpJiZwLT5xMS5hbS0+aWR4PT1yYSl8fAorICAgICAoKHAtPnEyLmZsYWdzJkRSRUZPQkopJiZwLT5xMi5hbSYmKHAtPnEyLmFtLT5mbGFncz09R1BSX0lORHx8cC0+cTIuYW0tPmZsYWdzPT1BQlNfSU5EKSYmcC0+cTIuYW0tPmlkeD09cmEpfHwKKyAgICAgKChwLT56LmZsYWdzJkRSRUZPQkopJiZwLT56LmFtJiYocC0+ei5hbS0+ZmxhZ3M9PUdQUl9JTkR8fHAtPnouYW0tPmZsYWdzPT1BQlNfSU5EKSYmcC0+ei5hbS0+aWR4PT1yYSkKKyAgICAgKXsKKyAgICBpZihwdXNoZWRhY2M+MCkKKyAgICAgIHI9cHVzaGVkYWNjOworICAgIGVsc2V7CisgICAgICByPWdldF9yZWcoZixwLENIQVIpOworICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKyAgICB9CisgICAgcHVzaGVkYWNjPXI7CisgICAgaWYoKHAtPnExLmZsYWdzJkRSRUZPQkopJiZwLT5xMS5hbSYmKHAtPnExLmFtLT5mbGFncz09R1BSX0lORHx8cC0+cTEuYW0tPmZsYWdzPT1BQlNfSU5EKSYmcC0+cTEuYW0tPmlkeD09cmEpCisgICAgICBwLT5xMS5hbS0+aWR4PXI7CisgICAgaWYoKHAtPnEyLmZsYWdzJkRSRUZPQkopJiZwLT5xMi5hbSYmKHAtPnEyLmFtLT5mbGFncz09R1BSX0lORHx8cC0+cTIuYW0tPmZsYWdzPT1BQlNfSU5EKSYmcC0+cTIuYW0tPmlkeD09cmEpCisgICAgICBwLT5xMi5hbS0+aWR4PXI7CisgICAgaWYoKHAtPnouZmxhZ3MmRFJFRk9CSikmJnAtPnouYW0mJihwLT56LmFtLT5mbGFncz09R1BSX0lORHx8cC0+ei5hbS0+ZmxhZ3M9PUFCU19JTkQpJiZwLT56LmFtLT5pZHg9PXJhKQorICAgICAgcC0+ei5hbS0+aWR4PXI7CisgIH0KKworICBpZihwLT5jb2RlPT1HRVRSRVRVUk4mJnAtPnExLnJlZz09cmEmJiFyZWdzW3JhXSkKKyAgICByZWdzW3JhXT0xOworCisgIGlmKHAtPmNvZGU9PUdFVFJFVFVSTiYmcC0+cTEucmVnPT1yYXgmJiFyZWdzW3JheF0pCisgICAgcmVnc1tyYXhdPTE7CisKKyAgYmFua3ZvZmZzZXQ9MDsKKworICBpZighTk9CQU5LVkFSUyl7CisgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8VkFSQURSKSk9PVZBUikgYnExPWJhbmsocC0+cTEudik7CisgICAgaWYoKHAtPnEyLmZsYWdzJihWQVJ8VkFSQURSKSk9PVZBUikgYnEyPWJhbmsocC0+cTIudik7CisgICAgaWYoKHAtPnouZmxhZ3MmKFZBUnxWQVJBRFIpKT09VkFSKSBiej1iYW5rKHAtPnoudik7CisKKyAgICBpZigocC0+cTEuZmxhZ3MmKFZBUnxWQVJBRFIpKT09KFZBUnxWQVJBRFIpKXsKKyAgICAgIHI9YmFuayhwLT5xMS52KTsKKyAgICAgIC8qaWYocj49MCYmciE9Y2JhbmspIGllcnJvcigwKTsqLworICAgIH0KKyAgICAKKyAgICBpZigocC0+Y29kZT09QVNTSUdOfHxwLT5jb2RlPT1QVVNIKSYmIXptbGVxKHAtPnEyLnZhbC52bWF4LGwyem0oNEwpKSl7CisgICAgICBpZihwLT5xMS5mbGFncyZEUkVGT0JKKSBwcmVsb2FkX29iaihmLHAsJnAtPnExKTsKKyAgICAgIGlmKHAtPnouZmxhZ3MmRFJFRk9CSikgcHJlbG9hZF9vYmooZixwLCZwLT56KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZihwLT5jb2RlIT1DQUxMKXsKKyAgICAgIC8qIFRPRE86IHNvbWUgb3B0aW1pemF0aW9ucyBwb3NzaWJsZSAqLworICAgICAgaWYoYnExPj0wJiZicTEhPWNiYW5rKXsKKwlpZihjYmFuazwwJiYhTk9TV0lUQ0gpCisJICBzYj1icTE7CisJZWxzZQorCSAgbG9hZF9iYW5rZWQoZixwLCZwLT5xMSxxMXR5cChwKSk7CisgICAgICB9CisgICAgICBpZihicTI+PTAmJmJxMiE9Y2JhbmspeworCWlmKChicTI9PXNifHwoY2Jhbms8MCYmc2I8MCkpJiYhTk9TV0lUQ0gpCisJICBzYj1icTI7CisJZWxzZQorCSAgbG9hZF9iYW5rZWQoZixwLCZwLT5xMixxMnR5cChwKSk7CisgICAgICB9CisgICAgICBpZihiej49MCYmYnohPWNiYW5rJiYocC0+ei5mbGFncyZEUkVGT0JKKSl7CisJaWYoKGJ6PT1zYnx8KGNiYW5rPDAmJnNiPDApKXx8IU5PU1dJVENIKQorCSAgc2I9Yno7CisJZWxzZQorCSAgbG9hZF9iYW5rZWQoZixwLCZwLT56LHp0eXAocCkpOworICAgICAgfQorICAgICAgCisgICAgICBpZihzYj49MCl7CisJaWYoTk9TV0lUQ0gpIGllcnJvcigwKTsKKwlzZXR5KGYsc2IpOworCWVtaXQoZiwiXHRqc3JcdCVzX19iYW5rc3dpdGNoXG4iLGlkcHJlZml4KTsKKwl5dmFsPU5PVkFMOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmKChwLT5xMS5mbGFncyZEUkVGT0JKKSYmSVNGUE9JTlRFUihwLT5xMS5kdHlwKSYmcC0+Y29kZSE9Q0FMTCkgbG9hZF9mYXIoZixwLCZwLT5xMSxxMXR5cChwKSk7CisgIGlmKChwLT5xMi5mbGFncyZEUkVGT0JKKSYmSVNGUE9JTlRFUihwLT5xMi5kdHlwKSkgbG9hZF9mYXIoZixwLCZwLT5xMixxMnR5cChwKSk7CisKKyAgaWYoaXNhY2MocTIpKXsKKyAgICBzdGF0aWMgb2JqIG87CisgICAgaW50IHQ9cTJ0eXAocCk7CisgICAgcj1nZXRfcmVnKGYscCx0KTsKKyAgICBvLmZsYWdzPVJFRzsKKyAgICBvLnJlZz1yOworICAgIHN0b3JlX2FjYyhmLCZvLHQpOworICAgIHAtPnEyLnJlZz1yOworICAgIGlmKCFwdXNoZWRhY2MpeworICAgICAgaWYoKHQmTlEpPT1DSEFSKQorCXN0b3JlZGFjYz1yOworICAgICAgZWxzZXsKKwlpZighcmVnX3BhaXIociwmcnApKSBpZXJyb3IoMCk7CisJc3RvcmVkYWNjPXJwLnIxOworCXN0b3JlZHg9cnAucjI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYoKHAtPmNvZGU9PUFEREkyUHx8cC0+Y29kZT09U1VCSUZQKSYmSVNSSURYKHEyKSl7CisgICAgc3RhdGljIG9iaiBvOworICAgIGlmKHAtPnEyLnJlZz09cngpeworICAgICAgaWYocHVzaGVkeD4wKSByPXB1c2hlZHg7CisgICAgICBlbHNlIGlmKHN0b3JlZHg+MCkgcj1zdG9yZWR4OworICAgICAgZWxzZSByPWdldF9yZWcoZixwLENIQVIpOworICAgIH1lbHNlCisgICAgICByPWdldF9yZWcoZixwLENIQVIpOworICAgIG8uZmxhZ3M9UkVHOworICAgIG8ucmVnPXI7CisgICAgc3RvcmVfcmVnKGYscC0+cTIucmVnLCZvLENIQVIpOworICAgIHAtPnEyLnJlZz1yOworICAgIHN0b3JlZHg9cjsKKyAgfQorCisgIGlmKHAtPmNvZGUhPUFERFJFU1MpeworICAgIHByZWxvYWRfb2JqKGYscCwmcC0+cTEpOworICAgIGlmKChwLT5xMS5mbGFncyYoRFJFRk9CSnxWQVJ8UkVHKSk9PShEUkVGT0JKfFZBUnxSRUcpJiYKKyAgICAgICAocC0+cTIuZmxhZ3MmKERSRUZPQkp8VkFSfFJFRykpPT0oRFJFRk9CSnxWQVIpJiYKKyAgICAgICBwLT5xMS52PT1wLT5xMi52KXsKKyAgICAgIHAtPnEyLmZsYWdzfD1SRUc7CisgICAgICBwLT5xMi5yZWc9cC0+cTEucmVnOworICAgIH0KKyAgICBpZigocC0+cTEuZmxhZ3MmKERSRUZPQkp8VkFSfFJFRykpPT0oRFJFRk9CSnxWQVJ8UkVHKSYmCisgICAgICAgKHAtPnouZmxhZ3MmKERSRUZPQkp8VkFSfFJFRykpPT0oRFJFRk9CSnxWQVIpJiYKKyAgICAgICBwLT5xMS52PT1wLT56LnYpeworICAgICAgcC0+ei5mbGFnc3w9UkVHOworICAgICAgcC0+ei5yZWc9cC0+cTEucmVnOworICAgIH0KKyAgfQorCisgIHByZWxvYWRfb2JqKGYscCwmcC0+cTIpOworICBpZigocC0+cTIuZmxhZ3MmKERSRUZPQkp8VkFSfFJFRykpPT0oRFJFRk9CSnxWQVJ8UkVHKSYmCisgICAgIChwLT56LmZsYWdzJihEUkVGT0JKfFZBUnxSRUcpKT09KERSRUZPQkp8VkFSKSYmCisgICAgIHAtPnEyLnY9PXAtPnoudil7CisgICAgcC0+ei5mbGFnc3w9UkVHOworICAgIHAtPnoucmVnPXAtPnEyLnJlZzsKKyAgfQorCisKKyAgaWYoKHAtPnouZmxhZ3MmRFJFRk9CSikmJklTRlBPSU5URVIocC0+ei5kdHlwKSkgemJ1Zj0xOworICBpZigocC0+ei5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSKXsKKyAgICBiej1iYW5rKHAtPnoudik7CisgICAgaWYoYno+PTAmJmJ6IT1jYmFuaykgemJ1Zj0xOworICB9CisgIAorICBpZih6YnVmJiYhTk9CQU5LVkFSUyl7CisgICAgenN0b3JlPXAtPno7CisgICAgcC0+ei5mbGFncz1WQVI7CisgICAgcC0+ei52PSZiYW5rdjsKKyAgICBwLT56LnZhbC52bWF4PWwyem0oKGxvbmcpYmFua3ZvZmZzZXQpOworICAgIHpzdG9yZWZsYWc9MTsKKyAgICAvKmJhbmt2b2Zmc2V0Kz16bTJsKHNpemV0YWJbcC0+dHlwZiZOUV0pOyovCisgIH1lbHNleworICAgIHByZWxvYWRfb2JqKGYscCwmcC0+eik7CisKKyAgICBpZihpc3JlZyh6KSl7CisgICAgICByPTA7CisgICAgICBpZihwLT5xMS5hbSYmcC0+cTEuYW0tPmJhc2U9PXAtPnoucmVnKXsKKwlyPWdldF9yZWcoZixwLFBPSU5URVIpOworCWNtcF9nZXRfYWNjKGYscCwwKTsKKwlpZighcmVnX3BhaXIocC0+cTEuYW0tPmJhc2UsJnJwKSkgaWVycm9yKDApOworCWlmKCFyZWdfcGFpcihyLCZycDIpKSBpZXJyb3IoMCk7CisJZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisJZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwMi5yMV0pOworCWVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworCWVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycDIucjJdKTsKKwlwLT5xMS5hbS0+YmFzZT1wLT5xMS5yZWc9cjsKKyAgICAgIH1lbHNlIGlmKCFwLT5xMS5hbSYmKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwLT5xMS5yZWc9PXAtPnoucmVnKXsKKwlyPWdldF9yZWcoZixwLFBPSU5URVIpOworCWNtcF9nZXRfYWNjKGYscCwwKTsKKwlpZighcmVnX3BhaXIocC0+ei5yZWcsJnJwKSkgaWVycm9yKDApOworCWlmKCFyZWdfcGFpcihyLCZycDIpKSBpZXJyb3IoMCk7CisJZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisJZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwMi5yMV0pOworCWVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworCWVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycDIucjJdKTsKKwlwLT5xMS5yZWc9cjsKKyAgICAgIH0KKyAgICAgIGlmKHAtPnEyLmFtJiZwLT5xMi5hbS0+YmFzZT09cC0+ei5yZWcpeworCWlmKHI9PTApeworCSAgcj1nZXRfcmVnKGYscCxQT0lOVEVSKTsKKwkgIGNtcF9nZXRfYWNjKGYscCwwKTsKKwkgIGlmKCFyZWdfcGFpcihwLT5xMi5hbS0+YmFzZSwmcnApKSBpZXJyb3IoMCk7CisJICBpZighcmVnX3BhaXIociwmcnAyKSkgaWVycm9yKDApOworCSAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisJICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAyLnIxXSk7CisJICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsKKwkgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycDIucjJdKTsKKwl9CisJcC0+cTIuYW0tPmJhc2U9cC0+cTIucmVnPXI7CisgICAgICB9ZWxzZSBpZighcC0+cTIuYW0mJihwLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcC0+cTIucmVnPT1wLT56LnJlZyl7CisJaWYocj09MCl7CisJICByPWdldF9yZWcoZixwLFBPSU5URVIpOworCSAgY21wX2dldF9hY2MoZixwLDApOworCSAgaWYoIXJlZ19wYWlyKHAtPnoucmVnLCZycCkpIGllcnJvcigwKTsKKwkgIGlmKCFyZWdfcGFpcihyLCZycDIpKSBpZXJyb3IoMCk7CisJICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcnAucjFdKTsKKwkgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycDIucjFdKTsKKwkgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworCSAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwMi5yMl0pOworCX0KKwlwLT5xMi5yZWc9cjsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoaXNhY2MoeikpeworICAgICAgaWYoaXNhY2MocTIpKXsKKwlpZihwLT5xMi5yZWc9PXJheCl7CisJICByPWdldF9yZWcoZixwLElOVCk7CisJICBpZighcmVnX3BhaXIociwmcnApKSBpZXJyb3IoMCk7CisJICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAucjFdKTsKKwkgIGVtaXQoZiwiXHRzdHhcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworCSAgc3RvcmVkYWNjPXJwLnIxOworCSAgc3RvcmVkeD1ycC5yMjsKKwl9ZWxzZXsKKwkgIHI9Z2V0X3JlZyhmLHAsQ0hBUik7CisJICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgc3RvcmVkYWNjPXI7CisJfQorCXAtPnEyLnJlZz1yOworCWlmKGlzYWNjKHExKSkKKwkgIHAtPnExLnJlZz1yOworICAgICAgfQorICAgIH0KKyAgfSAgICAgCisgCisgIHJlbG9hZF9hY2MoZik7CisKKyAgcmVnc1tyYV09bXJhOworICByZWdzW3JheF09bXJheDsKK30KKworCisvKiBjb21wYXJlIGlmIHR3byBvYmplY3RzIGFyZSB0aGUgc2FtZSAqLworc3RhdGljIGludCBjb21wYXJlX29iamVjdHMoc3RydWN0IG9iaiAqbzEsc3RydWN0IG9iaiAqbzIpCit7CisgIGlmKChvMS0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmKG8yLT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZvMS0+cmVnPT1vMi0+cmVnKQorICAgIHJldHVybiAxOworICBpZihvMS0+ZmxhZ3M9PW8yLT5mbGFncyl7CisgICAgaWYobzEtPmFtKXsKKyAgICAgIGlmKG8yLT5hbSl7CisJaWYobzEtPmFtLT5mbGFncyE9bzItPmFtLT5mbGFnc3x8bzEtPmFtLT5iYXNlIT1vMi0+YW0tPmJhc2V8fAorCSAgIG8xLT5hbS0+aWR4IT1vMi0+YW0tPmlkeHx8bzEtPmFtLT5vZmZzZXQhPW8yLT5hbS0+b2Zmc2V0KQorCSAgcmV0dXJuIDA7CisJZWxzZQorCSAgcmV0dXJuIDE7CisgICAgICB9ZWxzZQorCXJldHVybiAwOworICAgIH1lbHNlIGlmKG8yLT5hbSkKKyAgICAgIHJldHVybiAwOworICAgIGlmKCEobzEtPmZsYWdzJlZBUil8fChvMS0+dj09bzItPnYmJnptZXF0byhvMS0+dmFsLnZtYXgsbzItPnZhbC52bWF4KSkpeworICAgICAgaWYoIShvMS0+ZmxhZ3MmUkVHKXx8bzEtPnJlZz09bzItPnJlZyl7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworLyogc2F2ZSB0aGUgcmVzdWx0IChpbiB6cmVnKSBpbnRvIHAtPnogKi8KK3ZvaWQgc2F2ZV9yZXN1bHQoRklMRSAqZixzdHJ1Y3QgSUMgKnApCit7CisgIGllcnJvcigwKTsKK30KKworLyogcHJpbnRzIGFuIG9iamVjdCAqLworc3RhdGljIHZvaWQgZW1pdF9vYmooRklMRSAqZixzdHJ1Y3Qgb2JqICpwLGludCB0KQoreworICBpZihwLT5hbSl7CisgICAgaWYocC0+YW0tPmZsYWdzPT1JTU1fSU5EKQorICAgICAgZW1pdChmLCIoJXMpLHkgO2FtKCVsZCkiLG1yZWduYW1lc1twLT5hbS0+YmFzZV0scC0+YW0tPm9mZnNldCk7CisgICAgZWxzZSBpZihwLT5hbS0+ZmxhZ3M9PUdQUl9JTkQpCisgICAgICBlbWl0KGYsIiglcykseSA7YW0oJXMpIixtcmVnbmFtZXNbcC0+YW0tPmJhc2VdLG1yZWduYW1lc1twLT5hbS0+aWR4XSk7CisgICAgZWxzZSBpZihwLT5hbS0+ZmxhZ3M9PUFCU19JTkQpeworICAgICAgZW1pdChmLCIlbGQiLHAtPmFtLT5vZmZzZXQpOworICAgICAgaWYocC0+YW0tPnYpeworCVZhciAqdj1wLT5hbS0+djsKKwlpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pCisJICBlbWl0KGYsIislcyVzIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKwllbHNlCisJICBlbWl0KGYsIislcyVsZCIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgICB9CisgICAgICBpZihJU0lEWChwLT5hbS0+aWR4KSkKKwllbWl0KGYsIiwlcyA7YW0oJXMpIixtcmVnbmFtZXNbcC0+YW0tPmlkeF0sbXJlZ25hbWVzW3AtPmFtLT5pZHhdKTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIix5IDthbSglcykiLG1yZWduYW1lc1twLT5hbS0+aWR4XSk7CisgICAgfWVsc2UKKyAgICAgIGllcnJvcigwKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYoKHAtPmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PShLT05TVHxEUkVGT0JKKSl7CisgICAgZW1pdHZhbChmLCZwLT52YWwscC0+ZHR5cCZOVSk7CisgICAgcmV0dXJuOworICB9CisgIGlmKHAtPmZsYWdzJkRSRUZPQkopIGVtaXQoZiwiKCIpOworICBpZihwLT5mbGFncyZSRUcpeworICAgIGVtaXQoZiwiJXMiLG1yZWduYW1lc1twLT5yZWddKTsKKyAgfWVsc2UgaWYocC0+ZmxhZ3MmVkFSKSB7CisgICAgaWYocC0+di0+c3RvcmFnZV9jbGFzcz09QVVUT3x8cC0+di0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpCisgICAgICBlbWl0KGYsIiglcyksJXMiLG1yZWduYW1lc1tmcF0sbm95PT0yPyJ6IjoieSIpOworICAgIGVsc2V7CisgICAgICBpZighem1lcXRvKGwyem0oMEwpLHAtPnZhbC52bWF4KSl7ZW1pdHZhbChmLCZwLT52YWwsTUFYSU5UKTtlbWl0KGYsIisiKTt9CisgICAgICBpZihwLT52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpeworICAgICAgICBlbWl0KGYsIiVzJWxkIixsYWJwcmVmaXgsem0ybChwLT52LT5vZmZzZXQpKTsKKyAgICAgIH1lbHNleworICAgICAgICBlbWl0KGYsIiVzJXMiLGlkcHJlZml4LHAtPnYtPmlkZW50aWZpZXIpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihwLT5mbGFncyZLT05TVCl7CisgICAgaWYoLyppZWVlJiYoKHQmTlEpPT1ET1VCTEV8fCh0Jk5RKT09TERPVUJMRSkqL0lTRkxPQVQodCkpCisgICAgICBlbWl0KGYsIiVzJWQiLGxhYnByZWZpeCxhZGRmcGNvbnN0KHAsdCkpOworICAgIGVsc2UKKyAgICAgIGVtaXR2YWwoZiwmcC0+dmFsLHQmTlUpOworICB9CisgIGlmKHAtPmZsYWdzJkRSRUZPQkopIGVtaXQoZiwiKSVzIixub3k9PTA/Iix5Ijoobm95PT0xPyIiOiIseiIpKTsKK30KKworLyogIFRlc3QgaWYgdGhlcmUgaXMgYSBzZXF1ZW5jZSBvZiBGUkVFUkVHcyBjb250YWluaW5nIEZSRUVSRUcgcmVnLgorICAgIFVzZWQgYnkgcGVlcGhvbGUuICovCitzdGF0aWMgaW50IGV4aXN0c19mcmVlcmVnKHN0cnVjdCBJQyAqcCxpbnQgcmVnKQoreworICB3aGlsZShwJiYocC0+Y29kZT09RlJFRVJFR3x8cC0+Y29kZT09QUxMT0NSRUcpKXsKKyAgICBpZihwLT5jb2RlPT1GUkVFUkVHJiZwLT5xMS5yZWc9PXJlZykgcmV0dXJuIDE7CisgICAgcD1wLT5uZXh0OworICB9CisgIHJldHVybiAwOworfQorCisvKiBzZWFyY2ggZm9yIHBvc3NpYmxlIGFkZHJlc3NpbmctbW9kZXMgKi8KK3N0YXRpYyB2b2lkIHBlZXBob2xlKHN0cnVjdCBJQyAqcCkKK3sKKyAgaW50IGMsYzIscjtzdHJ1Y3QgSUMgKnAyLCpmcmVlX2Jhc2UsKnVzZTtzdHJ1Y3QgQWRkcmVzc2luZ01vZGUgKmFtOworCisgIGZvcig7cDtwPXAtPm5leHQpeworICAgIGM9cC0+Y29kZTsKKyAgICBpZihjIT1GUkVFUkVHJiZjIT1BTExPQ1JFRyYmKGMhPVNFVFJFVFVSTnx8IWlzcmVnKHExKXx8cC0+cTEucmVnIT1wLT56LnJlZykpIGV4aXRfbGFiZWw9MDsKKyAgICBpZihjPT1MQUJFTCkgZXhpdF9sYWJlbD1wLT50eXBmOworCisgICAgLyogVHJ5IGNvbnN0KHJlZykgKi8KKyAgICBpZigoYz09QURESTJQfHxjPT1TVUJJRlApJiZJU1BSRUcoeikmJihwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCYmIUlTRlBPSU5URVIocC0+dHlwZjIpKXsKKyAgICAgIGludCBiYXNlO3ptYXggb2Y7c3RydWN0IG9iaiAqbztJQyAqZHViPTA7CisgICAgICBldmFsX2NvbnN0KCZwLT5xMi52YWwscC0+dHlwZik7CisgICAgICBpZihjPT1TVUJJRlApIG9mPXptc3ViKGwyem0oMEwpLHZtYXgpOyBlbHNlIG9mPXZtYXg7CisgICAgICBpZih6bWxlcShaMCxvZikmJnptbGVxKG9mLGwyem0oMjU1TCkpKXsKKwlyPXAtPnoucmVnOworCWlmKGlzcmVnKHExKSYmaXNwdHIocC0+cTEucmVnKSkgYmFzZT1wLT5xMS5yZWc7IGVsc2UgYmFzZT1yOworCW89MDtmcmVlX2Jhc2U9MDsKKwlmb3IocDI9cC0+bmV4dDtwMjtwMj1wMi0+bmV4dCl7CisJICBjMj1wMi0+Y29kZTsKKwkgIGlmKGMyPT1DQUxMfHxjMj09TEFCRUx8fChjMj49QkVRJiZjMjw9QlJBKSkgYnJlYWs7CisJICBpZihjMj09RlJFRVJFRyYmcDItPnExLnJlZz09cC0+ei5yZWcpIGZyZWVfYmFzZT1wMjsKKwkgIGlmKGMyIT1GUkVFUkVHJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMS5yZWc9PXIpIGJyZWFrOworCSAgaWYoYzIhPUZSRUVSRUcmJihwMi0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnEyLnJlZz09cikgYnJlYWs7CisJICBpZihjMiE9Q0FMTCYmKGMyPExBQkVMfHxjMj5CUkEpLyomJmMyIT1BRERSRVNTKi8peworCSAgICBpbnQgdCxtYzsKKwkgICAgaWYoKGMyPT1BU1NJR058YzI9PVBVU0gpJiYocDItPnR5cGYmTlEpPT1DSEFSJiYhem1lcXRvKHAyLT5xMi52YWwudm1heCxaMSkpCisJICAgICAgbWM9MTsKKwkgICAgZWxzZQorCSAgICAgIG1jPTA7CisJICAgIGlmKCFvJiYoYzI9PUFERHx8YzI9PVNVQnx8YzI9PUFORHx8YzI9PU9SfHxjMj09WE9SKSYmLyoocDItPnR5cGYmTlEpPT1DSEFSJiYqLyFwMi0+cTEuYW0mJiFwMi0+ei5hbSYmCisJICAgICAgIChwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJgorCSAgICAgICBwMi0+cTEuZmxhZ3M9PXAyLT56LmZsYWdzJiZwMi0+cTEucmVnPT1yJiZwMi0+ei5yZWc9PXIpeworCSAgICAgIG89JnAyLT5xMTt1c2U9cDI7CisJICAgICAgZHViPXAyOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICAgIGlmKCFwMi0+cTEuYW0mJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT5xMS5yZWc9PXIpeworCSAgICAgIGlmKG98fG1jKSBicmVhazsKKwkgICAgICB0PXExdHlwKHAyKSZOUTsKKwkgICAgICBpZih0PlBPSU5URVJ8fElTRkxPQVQodCkpIGJyZWFrOworCSAgICAgIGlmKG02NSYmSVNMT05HKHQpKSBicmVhazsKKwkgICAgICBvPSZwMi0+cTE7dXNlPXAyOworCSAgICB9CisJICAgIGlmKCFwMi0+cTIuYW0mJihwMi0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT5xMi5yZWc9PXIpeworCSAgICAgIGlmKG98fG1jKSBicmVhazsKKwkgICAgICB0PXEydHlwKHAyKSZOUTsKKwkgICAgICBpZih0PlBPSU5URVJ8fElTRkxPQVQodCkpIGJyZWFrOworCSAgICAgIGlmKG02NSYmSVNMT05HKHQpKSBicmVhazsKKwkgICAgICBvPSZwMi0+cTI7dXNlPXAyOworCSAgICB9CisJICAgIGlmKCFwMi0+ei5hbSYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+ei5yZWc9PXIpeworCSAgICAgIGlmKG98fG1jKSBicmVhazsKKwkgICAgICB0PXp0eXAocDIpJk5ROworCSAgICAgIGlmKHQ+UE9JTlRFUnx8SVNGTE9BVCh0KSkgYnJlYWs7CisJICAgICAgaWYobTY1JiZJU0xPTkcodCkpIGJyZWFrOworCSAgICAgIG89JnAyLT56O3VzZT1wMjsKKwkgICAgfQorCSAgfQorCSAgaWYoYzI9PUZSRUVSRUd8fChwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKwkgICAgaW50IG07CisJICAgIGlmKGMyPT1GUkVFUkVHKQorCSAgICAgIG09cDItPnExLnJlZzsKKwkgICAgZWxzZXsKKwkgICAgICBtPXAyLT56LnJlZzsKKwkgICAgICBpZihvPT0mcC0+cTF8fG89PSZwLT5xMikgYnJlYWs7CisJICAgIH0KKwkgICAgaWYobT09cil7CisJICAgICAgaWYobyl7CisJCW8tPmFtPWFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKKwkJYW0tPmZsYWdzPUlNTV9JTkQ7CisJCWFtLT5iYXNlPWJhc2U7CisJCWFtLT5vZmZzZXQ9KGludCl6bTJsKG9mKTsKKwkJaWYoSVNQUkVHKHExKSl7CisJCSAgcC0+Y29kZT1jPU5PUDtwLT5xMS5mbGFncz1wLT5xMi5mbGFncz1wLT56LmZsYWdzPTA7CisJCX1lbHNleworCQkgIHAtPmNvZGU9Yz1BU1NJR047cC0+cTIuZmxhZ3M9MDsKKwkJICBwLT50eXBmPXAtPnR5cGYyO3AtPnEyLnZhbC52bWF4PXNpemV0YWJbcC0+dHlwZjImTlFdOworCQl9CisJICAgICAgfQorCSAgICAgIGlmKGR1Yil7CisJCWR1Yi0+ej0qbzsKKwkJZHViLT56LmFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKKwkJKmR1Yi0+ei5hbT0qby0+YW07CisJICAgICAgfQorCSAgICAgIGlmKGZyZWVfYmFzZSkgbW92ZV9JQyh1c2UsZnJlZV9iYXNlKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgICBpZihjMiE9RlJFRVJFRyYmbT09YmFzZSkgYnJlYWs7CisJICAgIGNvbnRpbnVlOworCSAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8qIFRyeSByZWcscmVnICovCisgICAgaWYoYz09QURESTJQJiYocC0+dHlwZiZOVSk9PShVTlNJR05FRHxDSEFSKSYmIUlTRlBPSU5URVIocC0+dHlwZjIpJiZpc3JlZyhxMikvKiYmcC0+cTIucmVnIT1yYSovJiZJU1BSRUcoeikmJihJU1BSRUcocTEpfHxwLT5xMi5yZWchPXAtPnoucmVnKSl7CisgICAgICBpbnQgYmFzZSxpZHgsaW5kO3N0cnVjdCBvYmogKm87SUMgKmZyZWVfaWR4LCpkdWI9MDsKKyAgICAgIHI9cC0+ei5yZWc7aWR4PXAtPnEyLnJlZzsKKyAgICAgIGlmKElTUFJFRyhxMSkpIGJhc2U9cC0+cTEucmVnOyBlbHNlIGJhc2U9cjsKKyAgICAgIGlmKChwLT5xMS5mbGFncyZWQVJBRFIpfHwocC0+cTEuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpCisJaW5kPTA7CisgICAgICBlbHNlCisJaW5kPTE7CisgICAgICBvPTA7ZnJlZV9iYXNlPWZyZWVfaWR4PXVzZT0wOworICAgICAgZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpeworICAgICAgICBjMj1wMi0+Y29kZTsKKyAgICAgICAgaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKKwlpZihjMj09RlJFRVJFRyYmcDItPnExLnJlZz09cC0+ei5yZWcpIGZyZWVfYmFzZT1wMjsKKwlpZihjMj09RlJFRVJFRyYmcDItPnExLnJlZz09cC0+cTIucmVnKSBmcmVlX2lkeD1wMjsKKyAgICAgICAgaWYoYzIhPUZSRUVSRUcmJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09cikgYnJlYWs7CisgICAgICAgIGlmKGMyIT1GUkVFUkVHJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMi5yZWc9PXIpIGJyZWFrOworICAgICAgICBpZigocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmaWR4IT1yKXsKKwkgIGlmKHAyLT56LnJlZz09aWR4KSBicmVhazsKKwkgIGlmKHJlZ19wYWlyKHAyLT56LnJlZywmcnApKXsKKwkgICAgaWYocnAucjE9PWlkeCkgYnJlYWs7CisJICAgIGlmKHJwLnIyPT1pZHgpIGJyZWFrOworCSAgfQorCX0KKworICAgICAgICBpZihjMiE9Q0FMTCYmKGMyPExBQkVMfHxjMj5CUkEpLyomJmMyIT1BRERSRVNTKi8peworCSAgaWYoIW8mJihjMj09QUREfHxjMj09U1VCfHxjMj09QU5EfHxjMj09T1J8fGMyPT1YT1IpJiYvKihwMi0+dHlwZiZOUSk9PUNIQVImJiovIXAyLT5xMS5hbSYmIXAyLT56LmFtJiYKKwkgICAgIChwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJgorCSAgICAgcDItPnExLmZsYWdzPT1wMi0+ei5mbGFncyYmcDItPnExLnJlZz09ciYmcDItPnoucmVnPT1yKXsKKwkgICAgbz0mcDItPnExO3VzZT1wMjsKKwkgICAgZHViPXAyOworCSAgICBjb250aW51ZTsKKwkgIH0KKyAgICAgICAgICBpZighcDItPnExLmFtJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTEucmVnPT1yKXsKKyAgICAgICAgICAgIGlmKG98fChpbmQmJihxMXR5cChwMikmTlEpIT1DSEFSKSkgYnJlYWs7CisJICAgIGlmKGllZWUmJklTRkxPQVQocTF0eXAocDIpKSkgYnJlYWs7CisgICAgICAgICAgICBvPSZwMi0+cTE7dXNlPXAyOworICAgICAgICAgIH0KKyAgICAgICAgICBpZighcDItPnEyLmFtJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTIucmVnPT1yKXsKKyAgICAgICAgICAgIGlmKG98fChpbmQmJihxMnR5cChwMikmTlEpIT1DSEFSKSkgYnJlYWs7CisJICAgIGlmKGllZWUmJklTRkxPQVQocTJ0eXAocDIpKSkgYnJlYWs7CisgICAgICAgICAgICBvPSZwMi0+cTI7dXNlPXAyOworICAgICAgICAgIH0KKyAgICAgICAgICBpZighcDItPnouYW0mJihwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnoucmVnPT1yKXsKKyAgICAgICAgICAgIGlmKG98fChpbmQmJih6dHlwKHAyKSZOUSkhPUNIQVIpKSBicmVhazsKKwkgICAgaWYoaWVlZSYmSVNGTE9BVCh6dHlwKHAyKSkpIGJyZWFrOworICAgICAgICAgICAgbz0mcDItPno7dXNlPXAyOworICAgICAgICAgIH0KKyAgICAgICAgfQorCQorICAgICAgICBpZihjMj09RlJFRVJFR3x8KHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpeworICAgICAgICAgIGludCBtOworICAgICAgICAgIGlmKGMyPT1GUkVFUkVHKQorICAgICAgICAgICAgbT1wMi0+cTEucmVnOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG09cDItPnoucmVnOworICAgICAgICAgIGlmKG09PXIpeworICAgICAgICAgICAgaWYobyl7CisgICAgICAgICAgICAgIG8tPmFtPWFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKKwkgICAgICBhbS0+aWR4PWlkeDsKKwkgICAgICBpZihpbmQpeworCQlhbS0+ZmxhZ3M9R1BSX0lORDsKKwkJYW0tPmJhc2U9YmFzZTsKKwkJaWYoSVNQUkVHKHExKSl7CisJCSAgcC0+Y29kZT1jPU5PUDtwLT5xMS5mbGFncz1wLT5xMi5mbGFncz1wLT56LmZsYWdzPTA7CisJCX1lbHNleworCQkgIHAtPmNvZGU9Yz1BU1NJR047cC0+cTIuZmxhZ3M9MDsKKwkJICBwLT50eXBmPXAtPnR5cGYyO3AtPnEyLnZhbC52bWF4PXNpemV0YWJbcC0+dHlwZjImTlFdOworCQl9CisJICAgICAgfWVsc2V7CisJCWFtLT5mbGFncz1BQlNfSU5EOworCQlhbS0+YmFzZT0wOworCQlldmFsX2NvbnN0KCZwLT5xMS52YWwsTUFYSU5UKTsKKwkJYW0tPm9mZnNldD16bTJsKHZtYXgpOworCQlpZihwLT5xMS5mbGFncyZWQVJBRFIpCisJCSAgYW0tPnY9cC0+cTEudjsKKwkJZWxzZQorCQkgIGFtLT52PTA7CisJCXAtPmNvZGU9Yz1OT1A7cC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworCSAgICAgIH0KKwkgICAgICBpZihkdWIpeworCQlkdWItPno9Km87CisJCWR1Yi0+ei5hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CisJCSpkdWItPnouYW09Km8tPmFtOworCSAgICAgIH0KKwkgICAgICBpZihmcmVlX2lkeCkgbW92ZV9JQyh1c2UsZnJlZV9pZHgpOworCSAgICAgIGlmKGZyZWVfYmFzZSkgbW92ZV9JQyh1c2UsZnJlZV9iYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZihjMiE9RlJFRVJFRyYmbT09YmFzZSkgYnJlYWs7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgcHIoRklMRSAqZixzdHJ1Y3QgSUMgKnApCit7CisgIGludCByOworCisgIGlmKHpzdG9yZWZsYWcpeworICAgIGludCBvZmY7CisgICAgaWYocC0+ei5mbGFncyE9VkFSfHxwLT56LnYhPSZiYW5rdikgaWVycm9yKDApOworICAgIG9mZj0oaW50KXptMmwocC0+ei52YWwudm1heCk7CisgICAgcC0+ej16c3RvcmU7CisgICAgZ2V0X2FjYyhmLHAsSU5UKTsKKyAgICBpZih6c3RvcmUuZmxhZ3MmRFJFRk9CSil7CisgICAgICBpZighSVNGUE9JTlRFUih6c3RvcmUuZHR5cCkpIGllcnJvcigwKTsKKyAgICAgIHpzdG9yZS5mbGFncyY9fkRSRUZPQko7CisgICAgICBsb2FkX3JlZyhmLExBU1RfUEFJUiwmenN0b3JlLFBPSU5URVIpOworICAgICAgaWYoaW5kaXJlY3QoJnpzdG9yZSkpeworCWRvX2J5dGUzKGYsImxkYSIsJnpzdG9yZSxGUE9JTlRFUik7CisJZW1pdChmLCJcdHRheVxuIik7CisgICAgICB9ZWxzZQorCWRvX2J5dGUzKGYsImxkeSIsJnpzdG9yZSxGUE9JTlRFUik7CisgICAgICB5dmFsPU5PVkFMOworICAgIH1lbHNleworICAgICAgbG9hZF9hZGRyZXNzKGYsTEFTVF9QQUlSLCZ6c3RvcmUscC0+dHlwZik7CisgICAgICByPWJhbmsoenN0b3JlLnYpOworICAgICAgc2V0eShmLHI+PTA/cjpiYW5rY251bSk7CisgICAgfQorICAgIGVtaXQoZiwiXHRsZHhcdCMlZFxuIixvZmYpOworICAgIGVtaXQoZiwiXHRsZGFcdCMlZFxuIixjYmFuaz49MD9jYmFuazpiYW5rY251bSk7CisgICAgZW1pdChmLCJcdGpzclx0JXNfX2JhbmtzdG9yZSVkXG4iLGlkcHJlZml4LChpbnQpem0ybChzaXpldGFiW3AtPnR5cGYmTlFdKSk7CisgICAgeXZhbD1OT1ZBTDsKKyAgICB6c3RvcmVmbGFnPTA7CisgIH0KKworICBmb3Iocj0xO3I8PU1BWFI7cisrKXsKKyAgICBpZihyZWdzW3JdJjgpCisgICAgICByZWdzW3JdJj1+ODsKKyAgfQorICBmb3Iocj1GSVJTVF9HUFI7cjw9TEFTVF9HUFI7cisrKXsKKyAgICBpbnQgdGE9MDsKKyAgICBpZihyZWdzW3JdJjIpeworICAgICAgaWYocmVnc1tyYV0mJiFwdXNoZWRhY2MpeworCWVtaXQoZiwiXHR0YXlcbiIpOworCXl2YWw9Tk9WQUw7CisJdGE9MTsKKyAgICAgIH0KKyAgICAgIGVtaXQoZiwiXHRwbGFcbiIpOworICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKyAgICAgIHJlZ3Nbcl0mPX4yOworICAgIH0KKyAgICBpZih0YSkKKyAgICAgIGVtaXQoZiwiXHR0eWFcbiIpOworICB9CisgIGlmKHB1c2hlZHgpeworICAgIGVtaXQoZiwiXHRsZHhcdCVzXG4iLG1yZWduYW1lc1twdXNoZWR4XSk7CisgICAgcHVzaGVkeD0wOworICB9CisKKyAgcmVsb2FkX2FjY19vcHQoZixwLT5uZXh0KTsKKworICBzdG9yZWRhY2M9MDsKKyAgc3RvcmVkeD0wOworfQorCitzdHJ1Y3QgY21wbGlzdCB7c3RydWN0IGNtcGxpc3QgKm5leHQ7aW50IGZyb20sdG8sbW9kZTt9ICpmaXJzdF9jbXBsaXN0OworCitzdGF0aWMgdm9pZCBhZGRfY21wbGlzdChpbnQgZnJvbSwgaW50IHRvLCBpbnQgbW9kZSkKK3sKKyAgc3RydWN0IGNtcGxpc3QgKm5ldzsKKyAgbmV3PW15bWFsbG9jKHNpemVvZigqbmV3KSk7CisgIG5ldy0+bmV4dD1maXJzdF9jbXBsaXN0OworICBuZXctPmZyb209ZnJvbTsKKyAgbmV3LT50bz10bzsKKyAgbmV3LT5tb2RlPW1vZGU7CisgIGZpcnN0X2NtcGxpc3Q9bmV3OworfQorCitzdGF0aWMgdm9pZCBpbmNzcChGSUxFICpmLGxvbmcgb2YpCit7CisgIGlmKG9mPT0wKSByZXR1cm47CisgIGlmKG9mPT0xfHxvZj09LTEpeworICAgIHN0YXRpYyBvYmogbzsKKyAgICBvLmZsYWdzPVJFRzsKKyAgICBvLnJlZz1zcDsKKyAgICBpZihvZj09MSkKKyAgICAgIGluY21lbShmLCZvLElOVCxBREQsMSk7CisgICAgZWxzZQorICAgICAgaW5jbWVtKGYsJm8sSU5ULFNVQiwxKTsKKyAgfWVsc2UgaWYob2Y9PTI1Nil7CisgICAgZW1pdChmLCJcdGluY1x0JXMrMVxuIixtcmVnbmFtZXNbc3BdKTsKKyAgfWVsc2UgaWYob2Y9PS0yNTYpeworICAgIGVtaXQoZiwiXHRkZWNcdCVzKzFcbiIsbXJlZ25hbWVzW3NwXSk7CisgIH1lbHNleworICAgIGxvbmcgYWJzOworICAgIGlmKG9mPjApeworICAgICAgYWJzPW9mOworICAgICAgZW1pdChmLCJcdGNsY1xuIik7CisgICAgfWVsc2V7CisgICAgICBhYnM9LW9mOworICAgICAgZW1pdChmLCJcdHNlY1xuIik7CisgICAgfQorICAgIGlmKGFicyYyNTUpeworICAgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3NwXSk7CisgICAgICBpZihvZj4wKXsKKwllbWl0KGYsIlx0YWRjXHQjJWxkXG4iLGFicyYyNTUpOworICAgICAgfWVsc2V7CisJZW1pdChmLCJcdHNiY1x0IyVsZFxuIixhYnMmMjU1KTsKKyAgICAgIH0KKyAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tzcF0pOworICAgIH0KKyAgICBpZigoYWJzJjB4ZmYwMCk9PTApeworICAgICAgaWYob2Y+MCl7CisJZW1pdChmLCJcdGJjY1x0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJZW1pdChmLCJcdGluY1x0JXMrMVxuIixtcmVnbmFtZXNbc3BdKTsKKwllbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisgICAgICB9ZWxzZXsKKwllbWl0KGYsIlx0YmNzXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwllbWl0KGYsIlx0ZGVjXHQlcysxXG4iLG1yZWduYW1lc1tzcF0pOworCWVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKyAgICAgIH0JCisgICAgfWVsc2V7CisgICAgICBlbWl0KGYsIlx0bGRhXHQlcysxXG4iLG1yZWduYW1lc1tzcF0pOworICAgICAgaWYob2Y+MCkKKwllbWl0KGYsIlx0YWRjXHQjJWxkXG4iLChhYnM+PjgpJjI1NSk7CisgICAgICBlbHNlCisJZW1pdChmLCJcdHNiY1x0IyVsZFxuIiwoYWJzPj44KSYyNTUpOworICAgICAgZW1pdChmLCJcdHN0YVx0JXMrMVxuIixtcmVnbmFtZXNbc3BdKTsKKyAgICB9CisgIH0KK30KKworLyogZ2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBlbnRyeSBjb2RlICovCitzdGF0aWMgdm9pZCBmdW5jdGlvbl90b3AoRklMRSAqZixzdHJ1Y3QgVmFyICp2LGxvbmcgb2Zmc2V0KQoreworICBpbnQgaSxyLG9mOworICByc2F2ZXNpemU9MDsKKyAgbGlic2F2ZT0xOworICBoYXNyZXR2YWw9MDsKKworICBpZighb3B0c2l6ZXx8KHYtPnRhdHRyJk5PQ09NUFJFU1MpKSBlbWl0KGYsIjt2Y3BybWluPTEwMDAwXG4iKTsKKyAgaWYodmxhcykgZW1pdChmLCJfX19mb1x0c2V0XHQlbGRcbiIsKGxvbmcpYXJnc2l6ZSk7CisgIHI9MDsKKyAgZm9yKGk9RklSU1RfR1BSO2k8PUxBU1RfR1BSO2krKyl7CisgICAgaWYoKHJlZ3VzZWRbaV0mJihpbl9pc3J8fCFyZWdzY3JhdGNoW2ldKSl8fChpbl9pc3ImJmZ1bmN0aW9uX2NhbGxzJiZyZWdzY3JhdGNoW2ldJiYhcmVnc2FbaV0pKXsKKyAgICAgIGlmKGkhPUxBU1RfR1BSLVZPTF9HUFJTKzEmJnI9PTApIGxpYnNhdmU9MDsKKyAgICAgIHJzYXZlc2l6ZSsrOworICAgICAgcj0xOworICAgIH1lbHNleworICAgICAgaWYoaT09TEFTVF9HUFItVk9MX0dQUlMrMSkgbGlic2F2ZT0wOworICAgICAgcj0wOworICAgIH0KKyAgfQorICByc2NudD1yc2F2ZXNpemU7CisgIGlmKHJzY250JiYhU09GVFNUQUNLKXsKKyAgICBpZihvcHRzcGVlZHx8cnNjbnQ8MikKKyAgICAgIHJzYXZlc2l6ZT0wOworICAgIGVsc2UgaWYoIW9wdHNpemUmJnJzY250PD01KQorICAgICAgcnNhdmVzaXplPTA7CisgIH0KKworICBpZighc3BlY2lhbF9zZWN0aW9uKGYsdikpe2VtaXQoZixjb2RlbmFtZSk7ZWJhbmsoZixzYmFuayh2KSk7aWYoZikgc2VjdGlvbj1DT0RFO30gCisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisgICAgaWYoKHYtPmZsYWdzJihJTkxJTkVGVU5DfElOTElORUVYVCkpIT1JTkxJTkVGVU5DKQorICAgICAgZW1pdChmLCJcdGdsb2JhbFx0JXMlc1xuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICBlbWl0KGYsIiVzJXM6XG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICB9ZWxzZQorICAgIGVtaXQoZiwiJXMlbGQ6XG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworCisgIG9mZnNldD1sb2NhbHNpemUrYXJnc2l6ZStyc2F2ZXNpemU7CisKKyAgaWYoaW5faXNyKXsKKyAgICBlbWl0KGYsIlx0cGhhXG4iKTsKKyAgICBpZihjMDIpeworICAgICAgZW1pdChmLCJcdHBoeFxuIik7CisgICAgICBlbWl0KGYsIlx0cGh5XG4iKTsKKyAgICB9ZWxzZXsKKyAgICAgIGVtaXQoZiwiXHR0eGFcbiIpOworICAgICAgZW1pdChmLCJcdHBoYVxuIik7CisgICAgICBlbWl0KGYsIlx0dHlhXG4iKTsKKyAgICAgIGVtaXQoZiwiXHRwaGFcbiIpOworICAgIH0KKyAgICBpZihvZmZzZXR8fGZ1bmN0aW9uX2NhbGxzKXsKKyAgICAgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tzcF0pOworICAgICAgZW1pdChmLCJcdHBoYVxuIik7CisgICAgICBlbWl0KGYsIlx0bGRhXHQlcysxXG4iLG1yZWduYW1lc1tzcF0pOworICAgICAgZW1pdChmLCJcdHBoYVxuIik7CisgICAgICBlbWl0KGYsIlx0bGRhXHQjPChfX19pc3JzdGFjay0lbGQpXG4iLG9mZnNldCk7CisgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbc3BdKTsKKyAgICAgIGVtaXQoZiwiXHRsZGFcdCM+KF9fX2lzcnN0YWNrLSVsZClcbiIsb2Zmc2V0KTsKKyAgICAgIGVtaXQoZiwiXHRzdGFcdCVzKzFcbiIsbXJlZ25hbWVzW3NwXSk7CisgICAgfQorICB9CisKKyAgaWYoTUFJTkFSR1MmJnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTiYmIXN0cmNtcCh2LT5pZGVudGlmaWVyLCJtYWluIikmJnYtPnZ0eXAtPmV4YWN0LT5jb3VudD4xKQorICAgIGVtaXQoZiwiXHRqc3JcdGluaXRtYWluYXJnc1xuIik7CisKKyAgeXZhbD1OT1ZBTDsKKyAgb2Y9YXJnc2l6ZStsb2NhbHNpemU7CisKKyAgaWYocnNhdmVzaXplPjAmJm9mK3JzYXZlc2l6ZT4yNTUpeworICAgIG9mZnNldC09cnNhdmVzaXplOworICAgIGluY3NwKGYsLXJzYXZlc2l6ZSk7CisgICAgb2Y9MDsKKyAgfWVsc2V7CisgICAgaW5jc3AoZiwtb2Zmc2V0KTsKKyAgICBvZmZzZXQ9MDsKKyAgfQorCisKKyAgaWYoIWxpYnNhdmV8fHJzY250IT1yc2F2ZXNpemV8fG9wdHNwZWVkfHxyc2NudDw9MXx8KHJzY250PD0zJiYoIW9wdHNpemUpKSkKKyAgICBsaWJzYXZlPTA7CisgIAorICBpZihsaWJzYXZlKXsKKyAgICBzZXR5KGYsb2YrcnNhdmVzaXplLTEpOworICAgIGlmKDAvKm1hc2tfb3B0Ki8pCisgICAgICBlbWl0KGYsIlx0anNyXHQlc19fcnNhdmUuJWQrJWxkXG4iLGlkcHJlZml4LCgxPDwocnNjbnQtMikpLChyc2NudC0yKSo1KTsKKyAgICBlbHNlCisgICAgICBlbWl0KGYsIlx0anNyXHQlc19fcnNhdmUlbGRcbiIsaWRwcmVmaXgscnNjbnQpOworICAgIHl2YWw9b2Y7CisgIH1lbHNleworICAgIGludCBsYXN0PTA7CisgICAgZm9yKGk9RklSU1RfR1BSO2k8PUxBU1RfR1BSO2krKyl7CisgICAgICBpZigocmVndXNlZFtpXSYmKGluX2lzcnx8IXJlZ3NjcmF0Y2hbaV0pKXx8KGluX2lzciYmZnVuY3Rpb25fY2FsbHMmJnJlZ3NjcmF0Y2hbaV0mJiFyZWdzYVtpXSkpeworCWlmKHJzY250IT1yc2F2ZXNpemUpeworCSAgaWYoY2UwMiYmbGFzdD09aS0xKXsKKwkgICAgZW1pdChmLCJcdHBod1x0JXNcbiIsbXJlZ25hbWVzW2xhc3RdKTsKKwkgICAgbGFzdD0wOworCSAgfWVsc2V7CisJICAgIGlmKCFjZTAyKXsKKwkgICAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbaV0pOworCSAgICAgIGVtaXQoZiwiXHRwaGFcbiIpOworCSAgICB9ZWxzZQorCSAgICAgIGxhc3Q9aTsKKwkgIH0KKwl9ZWxzZXsKKwkgIHNldHkoZixvZisrKTsKKwkgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tpXSk7CisJICBlbWl0KGYsIlx0c3RhXHQoJXMpLHlcbiIsbXJlZ25hbWVzW3NwXSk7CisJfQorICAgICAgfQorICAgIH0KKyAgICBpZihsYXN0KXsKKyAgICAgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tsYXN0XSk7CisgICAgICBlbWl0KGYsIlx0cGhhXG4iKTsKKyAgICB9CisgIH0KKworCisKKyAgaW5jc3AoZiwtb2Zmc2V0KTsKKworICBpZih2bGFzKXsKKyAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbc3BdKTsKKyAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbZnBdKTsKKyAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbc3AyXSk7CisgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW2ZwMl0pOworICB9Cit9CisKKy8qIGdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gZXhpdCBjb2RlICovCitzdGF0aWMgdm9pZCBmdW5jdGlvbl9ib3R0b20oRklMRSAqZixzdHJ1Y3QgVmFyICp2LGxvbmcgb2Zmc2V0KQoreworICBpbnQgaSxvZixhcjsKKyAgc3RydWN0IGNtcGxpc3QgKnA7CisgIG9mZnNldD1sb2NhbHNpemUrYXJnc2l6ZStyc2F2ZXNpemU7CisgIG9mPWFyZ3NpemUrbG9jYWxzaXplOworCisgIGk9ZnJldHVybih2LT52dHlwLT5uZXh0KTsKKyAgaWYoaGFzcmV0dmFsJiYoaT09cmF8fGk9PXJheCkpIGFyPTE7IGVsc2UgYXI9MDsKKworICBpZihyc2NudCE9cnNhdmVzaXplKXsKKyAgICBpZihhciYmIXB1c2hlZGFjYyl7CisgICAgICBwdXNoZWRhY2M9dDQ7CisgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcHVzaGVkYWNjXSk7CisgICAgfQorICAgIGZvcihpPUxBU1RfR1BSO2k+PUZJUlNUX0dQUjtpLS0peworICAgICAgaWYoKHJlZ3VzZWRbaV0mJihpbl9pc3J8fCFyZWdzY3JhdGNoW2ldKSl8fChpbl9pc3ImJmZ1bmN0aW9uX2NhbGxzJiZyZWdzY3JhdGNoW2ldJiYhcmVnc2FbaV0pKXsKKwllbWl0KGYsIlx0cGxhXG4iKTsKKwllbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbaV0pOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihyc2F2ZXNpemU+MCYmb2YrcnNhdmVzaXplPjI1NSl7CisgICAgaWYob2YhPTEmJmFyJiYhcHVzaGVkYWNjKXsKKyAgICAgIHB1c2hlZGFjYz10NDsKKyAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1twdXNoZWRhY2NdKTsKKyAgICB9CisgICAgaW5jc3AoZixvZik7CisgICAgb2Zmc2V0LT1vZjsKKyAgICBvZj0wOworICB9CisgIGlmKHJzYXZlc2l6ZT4wKXsKKyAgICBpZihhciYmIXB1c2hlZGFjYyl7CisgICAgICBwdXNoZWRhY2M9dDQ7CisgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcHVzaGVkYWNjXSk7CisgICAgfQorICB9CisgIGlmKHJzYXZlc2l6ZSl7CisgICAgaWYobGlic2F2ZSl7CisgICAgICBzZXR5KGYsb2YrcnNhdmVzaXplLTEpOworICAgICAgaWYoMC8qbWFza19vcHQqLykKKwllbWl0KGYsIlx0anNyXHQlc19fcmxvYWQuJWQrJWxkXG4iLGlkcHJlZml4LCgxPDwocnNjbnQtMikpLChyc2NudC0yKSo1KTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIlx0anNyXHQlc19fcmxvYWQlbGRcbiIsaWRwcmVmaXgscnNjbnQpOworICAgICAgeXZhbD1vZjsKKyAgICB9ZWxzZXsKKyAgICAgIGZvcihpPUZJUlNUX0dQUjtpPD1MQVNUX0dQUjtpKyspeworCWlmKChyZWd1c2VkW2ldJiYoaW5faXNyfHwhcmVnc2NyYXRjaFtpXSkpfHwoaW5faXNyJiZmdW5jdGlvbl9jYWxscyYmcmVnc2NyYXRjaFtpXSYmIXJlZ3NhW2ldKSl7CisJICBzZXR5KGYsb2YrKyk7CisJICBlbWl0KGYsIlx0bGRhXHQoJXMpLHlcbiIsbXJlZ25hbWVzW3NwXSk7CisJICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbaV0pOworCX0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoaW5faXNyKXsKKyAgICBpZihvZmZzZXR8fGZ1bmN0aW9uX2NhbGxzKXsKKyAgICAgIGVtaXQoZiwiXHRwbGFcbiIpOworICAgICAgZW1pdChmLCJcdHN0YVx0JXMrMVxuIixtcmVnbmFtZXNbc3BdKTsKKyAgICAgIGVtaXQoZiwiXHRwbGFcbiIpOworICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3NwXSk7CisgICAgfQorICB9ZWxzZSBpZihvZmZzZXQ9PTImJiFwdXNoZWRhY2MpeworICAgIGVtaXQoZiwiXHRpbmNcdCVzXG4iLG1yZWduYW1lc1tzcF0pOworICAgIGVtaXQoZiwiXHRiZXFcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworICAgIGVtaXQoZiwiXHRpbmNcdCVzXG4iLG1yZWduYW1lc1tzcF0pOworICAgIGVtaXQoZiwiXHRiZXFcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworICAgIHJlbG9hZF9hY2MoZik7CisgICAgZW1pdChmLHJldCk7CisgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwtMSk7CisgICAgZW1pdChmLCJcdGluY1x0JXNcbiIsbXJlZ25hbWVzW3NwXSk7CisgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwpOworICAgIGVtaXQoZiwiXHRpbmNcdCVzKzFcbiIsbXJlZ25hbWVzW3NwXSk7CisgIH1lbHNleworICAgIGlmKG9mZnNldCE9MCYmYXImJiFwdXNoZWRhY2MpeworICAgICAgcHVzaGVkYWNjPXQ0OworICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3B1c2hlZGFjY10pOworICAgIH0KKyAgICBpbmNzcChmLG9mZnNldCk7CisgIH0KKworICByZWxvYWRfYWNjKGYpOworCisgIGlmKGluX2lzcil7CisgICAgaWYoYzAyKXsKKyAgICAgIGVtaXQoZiwiXHRwbHlcbiIpOworICAgICAgZW1pdChmLCJcdHBseFxuIik7CisgICAgfWVsc2V7CisgICAgICBlbWl0KGYsIlx0cGxhXG4iKTsKKyAgICAgIGVtaXQoZiwiXHR0YXlcbiIpOworICAgICAgZW1pdChmLCJcdHBsYVxuIik7CisgICAgICBlbWl0KGYsIlx0dGF4XG4iKTsKKyAgICB9CisgICAgZW1pdChmLCJcdHBsYVxuIik7CisgIH0KKyAgZW1pdChmLHJldCk7CisKKyAgZm9yKHA9Zmlyc3RfY21wbGlzdDtwOyl7CisgICAgc3RydWN0IGNtcGxpc3QgKm07CisgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgscC0+ZnJvbSk7CisgICAgaWYocC0+bW9kZT09Sk1QSU5EKXsKKyAgICAgIC8qIGluZGlyZWN0IGNhbGwgKi8KKyAgICAgIGVtaXQoZiwiXHRqbXBcdCglcylcbiIsbXJlZ25hbWVzW3AtPnRvXSk7CisgICAgfWVsc2V7CisgICAgICBwdXNoZWRhY2M9cC0+bW9kZTsKKyAgICAgIHJlbG9hZF9hY2MoZik7CisgICAgICBlbWl0KGYsIlx0JXNcdCVzJWRcbiIsam1waW5zdCxsYWJwcmVmaXgscC0+dG8pOworICAgIH0KKyAgICBtPXA7CisgICAgcD1wLT5uZXh0OworICAgIGZyZWUobSk7CisgIH0KKyAgZmlyc3RfY21wbGlzdD0wOworICBwdXNoZWRhY2M9MDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgRW5kIG9mIHByaXZhdGUgZGF0YSBhbmQgZnVuY3Rpb25zLiAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAgRG9lcyBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb25zIGZvciB0aGUgY29kZS1nZW5lcmF0b3IuIEdldHMgY2FsbGVkICAqLworLyogIG9uY2UgYXQgdGhlIGJlZ2lubmluZyBhbmQgc2hvdWxkIHJldHVybiAwIGluIGNhc2Ugb2YgcHJvYmxlbXMuICAgICAgKi8KK2ludCBpbml0X2NnKHZvaWQpCit7CisgIGludCBpOworICAvKiAgSW5pdGlhbGl6ZSBzb21lIHZhbHVlcyB3aGljaCBjYW5ub3QgYmUgc3RhdGljYWxseSBpbml0aWFsaXplZCAgICovCisgIC8qICBiZWNhdXNlIHRoZXkgYXJlIHN0b3JlZCBpbiB0aGUgdGFyZ2V0J3MgYXJpdGhtZXRpYy4gICAgICAgICAgICAgKi8KKyAgbWF4YWxpZ249bDJ6bSgxTCk7CisgIGNoYXJfYml0PWwyem0oOEwpOworICBzdGFja2FsaWduPWwyem0oMSk7CisKKyAgaWYoSUVFRSl7CisgICAgaWVlZT0xOworICAgIG1zaXpldGFiW0RPVUJMRV09bXNpemV0YWJbTERPVUJMRV09bDJ6bSg4TCk7CisgIH0KKworCisgIG1yZWduYW1lc1swXT1yZWduYW1lc1swXT0ibm9yZWciOworICBtcmVnbmFtZXNbUkVHRFVNTVkxXT1teW1hbGxvYyhNQVhJKzgpOworICBtcmVnbmFtZXNbUkVHRFVNTVkyXT1teW1hbGxvYyhNQVhJKzgpOworICBtcmVnbmFtZXNbUkVHRFVNTVkzXT1teW1hbGxvYyhNQVhJKzgpOworCisgIGZvcihpPUZJUlNUX0dQUjtpPD1MQVNUX0dQUjtpKyspeworICAgIHJlZ25hbWVzW2ldPW15bWFsbG9jKDEwKTsKKyAgICBzcHJpbnRmKHJlZ25hbWVzW2ldLCJyJWQiLGktRklSU1RfR1BSKTsKKyAgICBtcmVnbmFtZXNbaV09cmVnbmFtZXNbaV07CisgICAgcmVnc2l6ZVtpXT1sMnptKDFMKTsKKyAgICByZWd0eXBlW2ldPSZjdHlwOworICB9CisgIGZvcihpPUZJUlNUX1BBSVI7aTw9TEFTVF9QQUlSO2krKyl7CisgICAgaW50IHNyPShpLUZJUlNUX1BBSVIpKjIrRklSU1RfR1BSOworICAgIHJlZ25hbWVzW2ldPW15bWFsbG9jKDEwKTsKKyAgICBzcHJpbnRmKHJlZ25hbWVzW2ldLCIlcy8lcyIsbXJlZ25hbWVzW3NyXSxtcmVnbmFtZXNbc3IrMV0pOworICAgIG1yZWduYW1lc1tpXT1yZWduYW1lc1tzcl07CisgICAgcmVnc2l6ZVtpXT1sMnptKDJMKTsKKyAgICByZWd0eXBlW2ldPSZpdHlwOworICB9CisgIGZvcihpPUZJUlNUX0JJRztpPD1MQVNUX0JJRztpKyspeworICAgIHJlZ25hbWVzW2ldPW15bWFsbG9jKDEwKTsKKyAgICBzcHJpbnRmKHJlZ25hbWVzW2ldLCJidG1wJWQiLGktRklSU1RfQklHKTsKKyAgICBtcmVnbmFtZXNbaV09cmVnbmFtZXNbaV07CisgICAgcmVnc2l6ZVtpXT1tc2l6ZXRhYltGTE9BVF07CisgICAgcmVndHlwZVtpXT0mZnR5cDsKKyAgICByZWdzYVtpXT0wOworICAgIHJlZ3NjcmF0Y2hbaV09MTsKKyAgfQorICBmb3IoaT1GSVJTVF9CSUdQO2k8PUxBU1RfQklHUDtpKyspeworICAgIGludCBzcj0oaS1GSVJTVF9CSUdQKSoyK0ZJUlNUX0JJRzsKKyAgICByZWduYW1lc1tpXT1teW1hbGxvYygyMCk7CisgICAgc3ByaW50ZihyZWduYW1lc1tpXSwiJXMvJXMiLG1yZWduYW1lc1tzcl0sbXJlZ25hbWVzW3NyKzFdKTsKKyAgICBtcmVnbmFtZXNbaV09cmVnbmFtZXNbc3JdOworICAgIHJlZ3NpemVbaV09bXNpemV0YWJbTExPTkddOworICAgIHJlZ3R5cGVbaV09JmxsdHlwOworICAgIHJlZ3NhW2ldPTA7CisgICAgcmVnc2NyYXRjaFtpXT0xOworICB9CisKKyAgbXJlZ25hbWVzW3JhXSA9IHJlZ25hbWVzW3JhXSA9ICJhIjsKKyAgbXJlZ25hbWVzW3J4XSA9IHJlZ25hbWVzW3J4XSA9ICJ4IjsKKyAgbXJlZ25hbWVzW3J5XSA9IHJlZ25hbWVzW3J5XSA9ICJ5IjsKKyAgcmVnc2l6ZVtyYV09cmVnc2l6ZVtyeF09cmVnc2l6ZVtyeV09bDJ6bSgxTCk7CisgIHJlZ3R5cGVbcmFdPXJlZ3R5cGVbcnhdPXJlZ3R5cGVbcnldPSZjdHlwOworICBtcmVnbmFtZXNbc3BdPXJlZ25hbWVzW3NwXSA9ICJzcCI7CisgIG1yZWduYW1lc1tzcDFdPXJlZ25hbWVzW3NwMV0gPSAic3AiOworICBtcmVnbmFtZXNbc3AyXT1yZWduYW1lc1tzcDJdID0gInNwKzEiOworCisgIG1yZWduYW1lc1tyYXhdPXJlZ25hbWVzW3JheF0gPSAiYS94IjsKKyAgcmVnc2l6ZVtyYXhdPXJlZ3NpemVbc3BdPWwyem0oMkwpOworICByZWd0eXBlW3JheF09cmVndHlwZVtzcF09Jml0eXA7CisKKyAgcmVnX3ByaW9bcmFdPXJlZ19wcmlvW3JheF09MTAwOworICByZWdfcHJpb1tyeF09NTA7CisKKyAgLyogIFVzZSBtdWx0aXBsZSBjY3MuICAgKi8KKyAgbXVsdGlwbGVfY2NzPTA7CisKKyAgc2hvcnRfcHVzaD0xOworCisgIHN0YXRpY19jc2U9MDsKKworICBkcmVmX2NzZT0xOworCisgIC8qcHJlZmVyX3N0YXRpY3M9MTsgVE9ETyAqLworCisKKyAgaWYob3B0c2l6ZSl7CisgICAgY2xpc3RfY29weV9zdGFjaz0yOworICAgIGNsaXN0X2NvcHlfcG9pbnRlcj0yOworICAgIGNsaXN0X2NvcHlfc3RhdGljPTI7CisgIH1lbHNlIGlmKG9wdHNwZWVkKXsKKyAgICBjbGlzdF9jb3B5X3N0YWNrPTY0OworICAgIGNsaXN0X2NvcHlfcG9pbnRlcj02NDsKKyAgICBjbGlzdF9jb3B5X3N0YXRpYz02NDsKKyAgfWVsc2V7CisgICAgY2xpc3RfY29weV9zdGFjaz04OworICAgIGNsaXN0X2NvcHlfcG9pbnRlcj04OworICAgIGNsaXN0X2NvcHlfc3RhdGljPTg7CisgIH0KKworICAvKiAgSW5pdGlhbGl6ZSB0aGUgbWluL21heC1zZXR0aW5ncy4gTm90ZSB0aGF0IHRoZSB0eXBlcyBvZiB0aGUgICAgICovCisgIC8qICBob3N0IHN5c3RlbSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIHRhcmdldCBzeXN0ZW0gYW5kIHlvdSBtYXkgKi8KKyAgLyogIG9ubHkgdXNlIHRoZSBzbWFsbGVzdCBtYXhpbXVtIHZhbHVlcyBBTlNJIGd1YXJhbnRlZXMgaWYgeW91ICAgICAqLworICAvKiAgd2FudCB0byBiZSBwb3J0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBUaGF0J3MgdGhlIHJlYXNvbiBmb3IgdGhlIHN1YnRyYWN0aW9uIGluIHRfbWluW0lOVF0uIExvbmcgY291bGQgKi8KKyAgLyogIGJlIHVuYWJsZSB0byByZXByZXNlbnQgLTIxNDc0ODM2NDggb24gdGhlIGhvc3Qgc3lzdGVtLiAgICAgICAgICAqLworICB0X21pbltDSEFSXT1sMnptKC0xMjhMKTsKKyAgdF9taW5bU0hPUlRdPWwyem0oLTMyNzY4TCk7CisgIHRfbWluW0xPTkddPXptc3ViKGwyem0oLTIxNDc0ODM2NDdMKSxsMnptKDFMKSk7CisgIHRfbWluW0lOVF09dF9taW4oU0hPUlQpOworICB0X21pbltMTE9OR109em1sc2hpZnQobDJ6bSgxTCksbDJ6bSg2M0wpKTsKKyAgdF9taW5bTUFYSU5UXT10X21pbihMTE9ORyk7CisgIHRfbWF4W0NIQVJdPXVsMnp1bSgxMjdMKTsKKyAgdF9tYXhbU0hPUlRdPXVsMnp1bSgzMjc2N1VMKTsKKyAgdF9tYXhbTE9OR109dWwyenVtKDIxNDc0ODM2NDdVTCk7CisgIHRfbWF4W0lOVF09dF9tYXgoU0hPUlQpOworICB0X21heFtMTE9OR109enVtcnNoaWZ0KHp1bWtvbXBsKHVsMnp1bSgwVUwpKSx1bDJ6dW0oMVVMKSk7CisgIHRfbWF4W01BWElOVF09dF9tYXgoTExPTkcpOworICB0dV9tYXhbQ0hBUl09dWwyenVtKDI1NVVMKTsKKyAgdHVfbWF4W1NIT1JUXT11bDJ6dW0oNjU1MzVVTCk7CisgIHR1X21heFtMT05HXT11bDJ6dW0oNDI5NDk2NzI5NVVMKTsKKyAgdHVfbWF4W0lOVF09dF9tYXgoVU5TSUdORUR8U0hPUlQpOworICB0dV9tYXhbTExPTkddPXp1bWtvbXBsKHVsMnp1bSgwVUwpKTsKKyAgdHVfbWF4W01BWElOVF09dF9tYXgoVU5TSUdORUR8TExPTkcpOworICAKKyAgLyogIFJlc2VydmUgYSBmZXcgcmVnaXN0ZXJzIGZvciB1c2UgYnkgdGhlIGNvZGUtZ2VuZXJhdG9yLiAgICAgICovCisgIC8qICBUaGlzIGlzIG5vdCBvcHRpbWFsIGJ1dCBzaW1wbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICByZWdzYVtyeV09cmVnc2Fbc3BdPXJlZ3NhW3NwMV09cmVnc2Fbc3AyXT1SRUdTQV9ORVZFUjsKKyAgcmVnc2FbdDFdPXJlZ3NhW3QyXT1yZWdzYVt0M109cmVnc2FbdDRdPVJFR1NBX05FVkVSOworICByZWdzY3JhdGNoW3JhXT1yZWdzY3JhdGNoW3J4XT1yZWdzY3JhdGNoW3JheF09MTsKKyAgaWYoIUdMT0JBQ0MpCisgICAgcmVnc2FbcmFdPXJlZ3NhW3J4XT1yZWdzYVtyYXhdPVJFR1NBX1RFTVBTOworICByZWdzYVtyeF09MDsKKyAgcmVnc2NyYXRjaFtzcF09cmVnc2NyYXRjaFtzcDFdPXJlZ3NjcmF0Y2hbc3AyXT1yZWdzY3JhdGNoW3J5XT0wOworICByZWdzY3JhdGNoW3QxXT1yZWdzY3JhdGNoW3QyXT1yZWdzY3JhdGNoW3QzXT1yZWdzY3JhdGNoW3Q0XT0xOworCisgIGZvcihpPUZJUlNUX0dQUjtpPD1MQVNUX0dQUi1WT0xfR1BSUztpKyspeworICAgIHJlZ3NjcmF0Y2hbaV09MTsKKyAgICBpZihpJjEpCisgICAgICByZWdzY3JhdGNoW0ZJUlNUX1BBSVIrKGktRklSU1RfR1BSKS8yXT0xOworICB9CisKKyAgdGFyZ2V0X21hY3Jvcz1tYXJyYXk7CisKKyAgZGVjbGFyZV9idWlsdGluKCJfX211bGludDgiLENIQVIsQ0hBUixGSVJTVF9HUFIsQ0hBUixGSVJTVF9HUFIrMSwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbXVsaW50MTYiLElOVCxJTlQsRklSU1RfUEFJUixJTlQsRklSU1RfUEFJUisxLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19tdWx1aW50MTYiLFVOU0lHTkVEfElOVCxVTlNJR05FRHxJTlQsRklSU1RfUEFJUixVTlNJR05FRHxJTlQsRklSU1RfUEFJUisxLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZ1aW50MTYiLFVOU0lHTkVEfElOVCxVTlNJR05FRHxJTlQsRklSU1RfUEFJUixVTlNJR05FRHxJTlQsRklSU1RfUEFJUisxLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZpbnQxNiIsSU5ULElOVCxGSVJTVF9QQUlSLElOVCxGSVJTVF9QQUlSKzEsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZGludDE2IixJTlQsSU5ULEZJUlNUX1BBSVIsSU5ULEZJUlNUX1BBSVIrMSwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbW9kdWludDE2IixVTlNJR05FRHxJTlQsVU5TSUdORUR8SU5ULEZJUlNUX1BBSVIsVU5TSUdORUR8SU5ULEZJUlNUX1BBSVIrMSwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbW9kaW50MTZ3byIsSU5ULElOVCxGSVJTVF9QQUlSLElOVCxGSVJTVF9QQUlSKzEsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2RpdnVpbnQxNndvIixVTlNJR05FRHxJTlQsVU5TSUdORUR8SU5ULEZJUlNUX1BBSVIsVU5TSUdORUR8SU5ULEZJUlNUX1BBSVIrMSwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2aW50MTZ3byIsSU5ULElOVCxGSVJTVF9QQUlSLElOVCxGSVJTVF9QQUlSKzEsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZHVpbnQxNndvIixVTlNJR05FRHxJTlQsVU5TSUdORUR8SU5ULEZJUlNUX1BBSVIsVU5TSUdORUR8SU5ULEZJUlNUX1BBSVIrMSwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbW9kaW50MTZ3byIsSU5ULElOVCxGSVJTVF9QQUlSLElOVCxGSVJTVF9QQUlSKzEsMSwwKTsKKworICBkZWNsYXJlX2J1aWx0aW4oIl9fbXVsaW50MzIiLExPTkcsTE9ORyxGSVJTVF9CSUcrMSxMT05HLEZJUlNUX0JJRysyLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19tdWx1aW50MzIiLFVOU0lHTkVEfExPTkcsVU5TSUdORUR8TE9ORyxGSVJTVF9CSUcrMSxVTlNJR05FRHxMT05HLEZJUlNUX0JJRysyLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZpbnQzMiIsTE9ORyxMT05HLEZJUlNUX0JJRyxMT05HLEZJUlNUX0JJRysxLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZ1aW50MzIiLFVOU0lHTkVEfExPTkcsVU5TSUdORUR8TE9ORyxGSVJTVF9CSUcsVU5TSUdORUR8TE9ORyxGSVJTVF9CSUcrMSwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbW9kaW50MzIiLExPTkcsTE9ORyxGSVJTVF9CSUcsTE9ORyxGSVJTVF9CSUcrMSwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbW9kdWludDMyIixVTlNJR05FRHxMT05HLFVOU0lHTkVEfExPTkcsRklSU1RfQklHLFVOU0lHTkVEfExPTkcsRklSU1RfQklHKzEsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2RpdmludDMyd28iLExPTkcsTE9ORyxGSVJTVF9CSUcsTE9ORyxGSVJTVF9CSUcrMSwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2dWludDMyd28iLFVOU0lHTkVEfExPTkcsVU5TSUdORUR8TE9ORyxGSVJTVF9CSUcsVU5TSUdORUR8TE9ORyxGSVJTVF9CSUcrMSwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbW9kaW50MzJ3byIsTE9ORyxMT05HLEZJUlNUX0JJRyxMT05HLEZJUlNUX0JJRysxLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19tb2R1aW50MzJ3byIsVU5TSUdORUR8TE9ORyxVTlNJR05FRHxMT05HLEZJUlNUX0JJRyxVTlNJR05FRHxMT05HLEZJUlNUX0JJRysxLDEsMCk7CisKKworCisgIGRlY2xhcmVfYnVpbHRpbigiX19tdWxpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19hZGRpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19zdWJpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19hbmRpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19vcmludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2VvcmludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX25lZ2ludDY0IixMTE9ORyxMTE9ORywwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbHNsaW50NjQiLExMT05HLExMT05HLDAsSU5ULDAsMSwwKTsKKworICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2aW50NjQiLExMT05HLExMT05HLDAsTExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2dWludDY0IixVTlNJR05FRHxMTE9ORyxVTlNJR05FRHxMTE9ORywwLFVOU0lHTkVEfExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZGludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZHVpbnQ2NCIsVU5TSUdORUR8TExPTkcsVU5TSUdORUR8TExPTkcsMCxVTlNJR05FRHxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19sc3JpbnQ2NCIsTExPTkcsTExPTkcsMCxJTlQsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbHNydWludDY0IixVTlNJR05FRHxMTE9ORyxVTlNJR05FRHxMTE9ORywwLElOVCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19jbXBzaW50NjQiLElOVCxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2NtcHVpbnQ2NCIsSU5ULFVOU0lHTkVEfExMT05HLDAsVU5TSUdORUR8TExPTkcsMCwxLDApOworCisgIGRlY2xhcmVfYnVpbHRpbigiX19zaW50MzJ0b2ZsdDMyIixGTE9BVCxMT05HLE9MREZQPzA6RklSU1RfQklHLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fdWludDMydG9mbHQzMiIsRkxPQVQsVU5TSUdORUR8TE9ORyxPTERGUD8wOkZJUlNUX0JJRywwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDMydG9zaW50MzIiLExPTkcsRkxPQVQsT0xERlA/MDpGSVJTVF9CSUcsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvdWludDMyIixVTlNJR05FRHxMT05HLEZMT0FULE9MREZQPzA6RklSU1RfQklHLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDE2dG9mbHQzMiIsRkxPQVQsSU5ULEZJUlNUX1BBSVIsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX191aW50MTZ0b2ZsdDMyIixGTE9BVCxVTlNJR05FRHxJTlQsRklSU1RfUEFJUiwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDMydG9zaW50MTYiLElOVCxGTE9BVCxPTERGUD8wOkZJUlNUX0JJRywwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDMydG91aW50MTYiLFVOU0lHTkVEfElOVCxGTE9BVCxPTERGUD8wOkZJUlNUX0JJRywwLDAsMSwwKTsKKworICBkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDMydG9mbHQ2NCIsRE9VQkxFLExPTkcsT0xERlA/MDpGSVJTVF9CSUcsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX191aW50MzJ0b2ZsdDY0IixET1VCTEUsVU5TSUdORUR8TE9ORyxPTERGUD8wOkZJUlNUX0JJRywwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDY0dG9zaW50MzIiLExPTkcsRE9VQkxFLE9MREZQPzA6RklSU1RfQklHUCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDY0dG91aW50MzIiLFVOU0lHTkVEfExPTkcsRE9VQkxFLE9MREZQPzA6RklSU1RfQklHUCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3NpbnQxNnRvZmx0NjQiLERPVUJMRSxJTlQsRklSU1RfUEFJUiwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3VpbnQxNnRvZmx0NjQiLERPVUJMRSxVTlNJR05FRHxJTlQsRklSU1RfUEFJUiwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDY0dG9zaW50MTYiLElOVCxET1VCTEUsT0xERlA/MDpGSVJTVF9CSUdQLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b3VpbnQxNiIsVU5TSUdORUR8SU5ULERPVUJMRSxPTERGUD8wOkZJUlNUX0JJR1AsMCwwLDEsMCk7CisKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDY0dG9mbHQzMiIsRkxPQVQsRE9VQkxFLE9MREZQPzA6RklSU1RfQklHUCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDMydG9mbHQ2NCIsRE9VQkxFLEZMT0FULE9MREZQPzA6RklSU1RfQklHLDAsMCwxLDApOworCisgIGRlY2xhcmVfYnVpbHRpbigiX19hZGRmbHQzMiIsRkxPQVQsRkxPQVQsT0xERlA/MDpGSVJTVF9CSUcrMSxGTE9BVCxPTERGUD8wOkZJUlNUX0JJRywxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fc3ViZmx0MzIiLEZMT0FULEZMT0FULE9MREZQPzA6RklSU1RfQklHKzEsRkxPQVQsT0xERlA/MDpGSVJTVF9CSUcsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX211bGZsdDMyIixGTE9BVCxGTE9BVCxPTERGUD8wOkZJUlNUX0JJRysxLEZMT0FULE9MREZQPzA6RklSU1RfQklHLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZmbHQzMiIsRkxPQVQsRkxPQVQsT0xERlA/MDpGSVJTVF9CSUcrMSxGTE9BVCxPTERGUD8wOkZJUlNUX0JJRywxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbmVnZmx0MzIiLEZMT0FULEZMT0FULE9MREZQPzA6RklSU1RfQklHLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fY21wc2ZsdDMyIixDSEFSLEZMT0FULE9MREZQPzA6RklSU1RfQklHKzEsRkxPQVQsT0xERlA/MDpGSVJTVF9CSUcsMSwwKTsKKworI2lmIDAKKyAgZm9yKGk9MTtpPE1BWFI7aSsrKXsKKyAgICBwcmludGYoIiUwMmQgJXMgc2NyYXRjaD0lZCAiLGkscmVnbmFtZXNbaV0scmVnc2NyYXRjaFtpXSk7CisgICAgaWYocmVnX3BhaXIoaSwmcnApKQorICAgICAgcHJpbnRmKCJwYWlyKCVzLCVzKSIscmVnbmFtZXNbcnAucjFdLHJlZ25hbWVzW3JwLnIyXSk7CisgICAgcHJpbnRmKCJcbiIpOworICB9CisjZW5kaWYKKworICBpZihOT1BFRVApIG5vcGVlcD0xOworICBpZihDQk1BU0NJSSkgY2JtYXNjaWk9MTsKKyAgaWYoQVRBU0NJSSkgYXRhc2NpaT0xOworICBpZihESVZCVUcpIGRpdmJ1Zz0xOworICBpZihNNjVJTykgbTY1aW89MTsKKyAgaWYoTk9CQU5LSU5HKSBtYW5iYW5rPTE7CisgIGptcGluc3Q9ImptcCI7CisgIGlmKEMwMnx8QzAyQUxUKXsKKyAgICBjMDI9MTt6emVybz0xOworICAgIGptcGluc3Q9ImJyYSI7CisgIH0KKyAgaWYoQ0UwMil7CisgICAgYzAyPTE7Y2UwMj0xOworICAgIGptcGluc3Q9ImJyYSI7CisgIH0KKyAgaWYoTUVHQTY1KXsKKyAgICBtNjU9MTtjMDI9MTtjZTAyPTE7CisgICAgam1waW5zdD0iYnJhIjsKKyAgfQorCisgIGZvcihpPTA7aTw9TUFYX1RZUEU7aSsrKXsKKyAgICBzaXpldGFiW2ldPWwyem0obXNpemV0YWJbaV0pOworICAgIGFsaWduW2ldPWwyem0obWFsaWduW2ldKTsKKyAgfQorCisgIGJhbmt2LnN0b3JhZ2VfY2xhc3M9RVhURVJOOworICBiYW5rdi5pZGVudGlmaWVyPSJfX2Jhbmt2IjsKKyAgYmFua3YudnR5cD1uZXdfdHlwKCk7CisgIGJhbmt2LnZ0eXAtPmZsYWdzPUNIQVI7CisKKyAgYmFua2NudW09Q09NTU9OQkFOSzsKKworICByZXR1cm4gMTsKK30KKwordm9pZCBpbml0X2RiKEZJTEUgKmYpCit7Cit9CisKK2ludCBmcmV0dXJuKHN0cnVjdCBUeXAgKnQpCisvKiAgUmV0dXJucyB0aGUgcmVnaXN0ZXIgaW4gd2hpY2ggdmFyaWFibGVzIG9mIHR5cGUgdCBhcmUgcmV0dXJuZWQuICovCisvKiAgSWYgdGhlIHZhbHVlIGNhbm5vdCBiZSByZXR1cm5lZCBpbiBhIHJlZ2lzdGVyIHJldHVybnMgMC4gICAgICAgICovCisvKiAgQSBwb2ludGVyIE1VU1QgYmUgcmV0dXJuZWQgaW4gYSByZWdpc3Rlci4gVGhlIGNvZGUtZ2VuZXJhdG9yICAgICovCisvKiAgaGFzIHRvIHNpbXVsYXRlIGEgcHNldWRvIHJlZ2lzdGVyIGlmIG5lY2Vzc2FyeS4gICAgICAgICAgICAgICAgICovCit7CisgIGludCB0eXA9dC0+ZmxhZ3MmTlE7CisgIGlmKElTU1RSVUNUKHR5cCl8fElTVU5JT04odHlwKXx8dHlwPT1WT0lEKSAKKyAgICByZXR1cm4gMDsKKyAgaWYoT0xERlAmJklTRkxPQVQodHlwKSkgcmV0dXJuIEZJUlNUX0dQUjsKKyAgaWYodHlwPT1MT05HfHx0eXA9PUZMT0FUfHxJU0ZQT0lOVEVSKHR5cCl8fCghaWVlZSYmKHR5cD09RE9VQkxFfHx0eXA9PUxET1VCTEUpKSkKKyAgICByZXR1cm4gRklSU1RfQklHOworICBpZih0eXA9PUxMT05HfHwoaWVlZSYmKHR5cD09RE9VQkxFfHx0eXA9PUxET1VCTEUpKSkKKyAgICByZXR1cm4gRklSU1RfQklHUDsKKyAgaWYoem1sZXEoc3pvZih0KSxsMnptKDFMKSkpCisgICAgcmV0dXJuIHJhOworICBpZih6bWxlcShzem9mKHQpLGwyem0oMkwpKSkgCisgICAgcmV0dXJuIHJheDsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitpbnQgcmVnX3BhaXIoaW50IHIsc3RydWN0IHJwYWlyICpwKQorLyogUmV0dXJucyAwIGlmIHRoZSByZWdpc3RlciBpcyBubyByZWdpc3RlciBwYWlyLiBJZiByICAqLworLyogaXMgYSByZWdpc3RlciBwYWlyIG5vbi16ZXJvIHdpbGwgYmUgcmV0dXJuZWQgYW5kIHRoZSAqLworLyogc3RydWN0dXJlIHBvaW50ZWQgdG8gcCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSB0d28gICAqLworLyogZWxlbWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpZihyPj1GSVJTVF9QQUlSJiZyPD1MQVNUX1BBSVIpeworICAgIHAtPnIxPShyLUZJUlNUX1BBSVIpKjIrRklSU1RfR1BSOworICAgIHAtPnIyPXAtPnIxKzE7CisgICAgcmV0dXJuIDE7CisgIH1lbHNlIGlmKHI+PUZJUlNUX0JJR1AmJnI8PUxBU1RfQklHUCl7CisgICAgcC0+cjE9KHItRklSU1RfQklHUCkqMitGSVJTVF9CSUc7CisgICAgcC0+cjI9cC0+cjErMTsKKyAgICByZXR1cm4gMTsKKyAgfWVsc2UgaWYocj09cmF4KXsKKyAgICBwLT5yMT1yYTsKKyAgICBwLT5yMj1yeDsKKyAgICByZXR1cm4gMTsKKyAgfWVsc2UgaWYocj09c3ApeworICAgIHAtPnIxPXNwMTsKKyAgICBwLT5yMj1zcDI7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIGVzdGltYXRlIHRoZSBjb3N0LXNhdmluZyBpZiBvYmplY3QgbyBmcm9tIElDIHAgaXMgcGxhY2VkIGluCisgICByZWdpc3RlciByICovCitpbnQgY29zdF9zYXZpbmdzKHN0cnVjdCBJQyAqcCxpbnQgcixzdHJ1Y3Qgb2JqICpvKQoreworICBpbnQgYz1wLT5jb2RlLGNvOworICBpZigoby0+ZmxhZ3MmVkFSKSYmKG8tPnYtPnRhdHRyJlpQQUdFKSkgcmV0dXJuIDA7CisgIGlmKGluZGlyZWN0KG8pKSBjbz01OyBlbHNlIGNvPTI7CisKKyAgLypUT0RPOiBhZGFwdCB0aGlzICovCisgIGlmKG8tPmZsYWdzJlZLT05TVCl7CisgICAgaWYobyE9JnAtPnExfHxwLT5xMi5mbGFncyE9MCkgcmV0dXJuIDA7CisgICAgaWYocj09cmF8fHI9PXJheCkgcmV0dXJuIGNvOworICAgIGlmKHI9PXJ4JiYoYz09QVNTSUdOfHxjPT1QVVNIKSkgcmV0dXJuIGNvLTE7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZihJU0lEWChyKSl7CisgICAgaWYoYz09QUREfHxjPT1TVUJ8fGM9PUFEREkyUHx8Yz09U1VCSUZQfHxjPT1BTkR8fGM9PU9SfHxjPT1YT1IpeworICAgICAgaWYobz09JnAtPnEyJiZjIT1BRERJMlApIHJldHVybiBjby00OworICAgICAgaWYocj09cngmJm89PSZwLT5xMiYmKChwLT5xMS5mbGFncyYoVkFSQURSfEtPTlNUfFZLT05TVCkpPT0wfHwocC0+cTEuZmxhZ3MmRFJFRk9CSikpKQorCXJldHVybiBjby00OworICAgICAgaWYoKGM9PUFERHx8Yz09U1VCKSYmbz09JnAtPnomJihwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisJZXZhbF9jb25zdCgmcC0+cTIudmFsLHEydHlwKHApKTsKKwlpZih6bWVxdG8odm1heCxaMSkmJnp1bWVxdG8odnVtYXgsWlUxKSkKKwkgIHJldHVybiBjbysyOworICAgICAgfQorICAgIH1lbHNlIGlmKGM9PUFTU0lHTnx8Yz09Q09OVkVSVCl7CisgICAgICBpZihvPT0mcC0+cTEmJmluZGlyZWN0KCZwLT56KSkgcmV0dXJuIDE7CisgICAgICBpZihvPT0mcC0+eiYmaW5kaXJlY3QoJnAtPnExKSkgcmV0dXJuIDE7CisgICAgfWVsc2UgaWYoYz09Q09NUEFSRSl7CisgICAgICAvL2lmKG89PSZwLT5xMSYmaW5kaXJlY3QoJnAtPnEyKSkgcmV0dXJuIElOVF9NSU47CisgICAgICAvL2lmKG89PSZwLT5xMiYmaW5kaXJlY3QoJnAtPnExKSkgcmV0dXJuIElOVF9NSU47CisgICAgfWVsc2UgaWYoYz09U0VUUkVUVVJOfHxjPT1HRVRSRVRVUk58fGM9PVBVU0gpeworICAgIH1lbHNlIGlmKGM9PVRFU1QpeworICAgIH1lbHNlCisgICAgICByZXR1cm4gSU5UX01JTjsKKyAgfQorCisgIGlmKGM9PUFEREkyUCYmbz09JnAtPnExJiYocC0+dHlwZiZOVSk9PUNIQVImJihyPT1yYXgpKQorICAgIHJldHVybiBJTlRfTUlOOworCisKKyAgaWYoby0+ZmxhZ3MmRFJFRk9CSil7CisgICAgaWYoaXNwdHIocikpCisgICAgICByZXR1cm4gY28rY28rMTA7CisgICAgaWYocj09cmF4KQorICAgICAgcmV0dXJuIElOVF9NSU47CisgIH0KKyAgaWYoYz09U0VUUkVUVVJOJiZyPT1wLT56LnJlZyYmIShvLT5mbGFncyZEUkVGT0JKKSkgcmV0dXJuIGNvKzI7CisgIGlmKGM9PUdFVFJFVFVSTiYmcj09cC0+cTEucmVnJiYhKG8tPmZsYWdzJkRSRUZPQkopKSByZXR1cm4gY28rMjsKKyAgaWYoKGM9PUFERHx8Yz09U1VCKSYmbz09JnAtPnomJnAtPnExLmZsYWdzPT1wLT56LmZsYWdzJiZwLT5xMS52PT1wLT56LnYmJihwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHEydHlwKHApKTsKKyAgICBpZih6bWVxdG8odm1heCxaMSkmJnp1bWVxdG8odnVtYXgsWlUxKSkKKyAgICAgIHJldHVybiBjbysxOworICB9CisgIGlmKHI9PXJhKQorICAgIHJldHVybiBjbysyOworICBpZihJU0lEWChyKSkKKyAgICByZXR1cm4gY28rMTsKKyAgaWYocj09cmF4KQorICAgIHJldHVybiBjbytjbys0OworICByZXR1cm4gY287Cit9CisKK2ludCByZWdvayhpbnQgcixpbnQgdCxpbnQgbW9kZSkKKy8qICBSZXR1cm5zIDAgaWYgcmVnaXN0ZXIgciBjYW5ub3Qgc3RvcmUgdmFyaWFibGVzIG9mICAgKi8KKy8qICB0eXBlIHQuIElmIHQ9PVBPSU5URVIgYW5kIG1vZGUhPTAgdGhlbiBpdCByZXR1cm5zICAgKi8KKy8qICBub24temVybyBvbmx5IGlmIHRoZSByZWdpc3RlciBjYW4gc3RvcmUgYSBwb2ludGVyICAgKi8KKy8qICBhbmQgZGVyZWZlcmVuY2UgYSBwb2ludGVyIHRvIG1vZGUuICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYocj09MCkKKyAgICByZXR1cm4gMDsKKyAgaWYocj09cmF4JiZOT1JBWCkKKyAgICByZXR1cm4gMDsKKyAgaWYocj09cngmJk5PWCkKKyAgICByZXR1cm4gMDsKKyAgdCY9TlE7CisgIGlmKElTQ0hBUih0KSkKKyAgICBpZihyPT1yYXx8KElTSURYKHIpJiYob3B0ZmxhZ3MmMikpfHwocj49RklSU1RfR1BSJiZyPD1MQVNUX0dQUikpCisgICAgICByZXR1cm4gMTsKKyAgaWYoSVNTSE9SVCh0KSl7CisgICAgaWYocj09cmF4KXsKKyAgICAgIGlmKHQ9PVBPSU5URVImJm1vZGU8MCkKKwlyZXR1cm4gMTsKKyAgICAgIGlmKHQhPVBPSU5URVIpCisJcmV0dXJuIDE7CisgICAgfQorICAgIGlmKHI+PUZJUlNUX1BBSVImJnI8PUxBU1RfUEFJUikKKyAgICAgIHJldHVybiAxOworICB9CisgIGlmKHI+PUZJUlNUX0JJRyYmcjw9TEFTVF9CSUcpeworICAgIGlmKHQ9PUxPTkd8fHQ9PUZMT0FUfHwoKHQ9PURPVUJMRXx8dD09TERPVUJMRSkmJiFpZWVlKSkKKyAgICAgIHJldHVybiAxOworICAgIGlmKHQ9PUZQT0lOVEVSKQorICAgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYocj49RklSU1RfQklHUCYmcjw9TEFTVF9CSUdQKXsKKyAgICBpZih0PT1MTE9OR3x8KCh0PT1ET1VCTEV8fHQ9PUxET1VCTEUpJiZpZWVlKSkKKyAgICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCitpbnQgZGFuZ2Vyb3VzX0lDKHN0cnVjdCBJQyAqcCkKKy8qICBSZXR1cm5zIHplcm8gaWYgdGhlIElDIHAgY2FuIGJlIHNhZmVseSBleGVjdXRlZCAgICAgKi8KKy8qICB3aXRob3V0IGRhbmdlciBvZiBleGNlcHRpb25zIG9yIHNpbWlsYXIgdGhpbmdzLiAgICAgKi8KKy8qICB2YmNjIG1heSBnZW5lcmF0ZSBjb2RlIGluIHdoaWNoIG5vbi1kYW5nZXJvdXMgSUNzICAgKi8KKy8qICBhcmUgc29tZXRpbWVzIGV4ZWN1dGVkIGFsdGhvdWdoIGNvbnRyb2wtZmxvdyBtYXkgICAgKi8KKy8qICBuZXZlciByZWFjaCB0aGVtIChtYWlubHkgd2hlbiBtb3ZpbmcgY29tcHV0YXRpb25zICAgKi8KKy8qICBvdXQgb2YgbG9vcHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUeXBpY2FsIElDcyB0aGF0IGdlbmVyYXRlIGV4Y2VwdGlvbnMgb24gc29tZSAgICAgICAgKi8KKy8qICBtYWNoaW5lcyBhcmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBhY2Nlc3NlcyB2aWEgcG9pbnRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBkaXZpc2lvbi9tb2R1bG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBvdmVyZmxvdyBvbiBzaWduZWQgaW50ZWdlci9mbG9hdHMgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGM9cC0+Y29kZTsKKyAgaWYoKHAtPnExLmZsYWdzJkRSRUZPQkopfHwocC0+cTIuZmxhZ3MmRFJFRk9CSil8fChwLT56LmZsYWdzJkRSRUZPQkopKQorICAgIHJldHVybiAxOworICBpZigoYz09RElWfHxjPT1NT0QpJiYhaXNjb25zdChxMikpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitpbnQgbXVzdF9jb252ZXJ0KGludCBvLGludCB0LGludCBjb25zdF9leHByKQorLyogIFJldHVybnMgemVybyBpZiBjb2RlIGZvciBjb252ZXJ0aW5nIG5wIHRvIHR5cGUgdCAgICAqLworLyogIGNhbiBiZSBvbWl0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE9uIHRoZSBQb3dlclBDIGNwdSBwb2ludGVycyBhbmQgMzJiaXQgICAgICAgICAgICAgICAqLworLyogIGludGVnZXJzIGhhdmUgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gYW5kIGNhbiB1c2UgICAqLworLyogIHRoZSBzYW1lIHJlZ2lzdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgb3A9byZOUSx0cD10Jk5ROworCisgIGlmKG9wPT10cCkgcmV0dXJuIDA7CisgIGlmKElTQ0hBUihvcCkmJklTQ0hBUih0cCkpIHJldHVybiAwOworICBpZihJU1NIT1JUKG9wKSYmSVNTSE9SVCh0cCkpIHJldHVybiAwOworICBpZighaWVlZSYmSVNGTE9BVChvcCkmJklTRkxPQVQodHApKSByZXR1cm4gMDsKKyAgaWYob3A9PURPVUJMRSYmdHA9PUxET1VCTEUpIHJldHVybiAwOworICBpZihvcD09TERPVUJMRSYmdHA9PURPVUJMRSkgcmV0dXJuIDA7CisKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgZ2VuX2RzKEZJTEUgKmYsem1heCBzaXplLHN0cnVjdCBUeXAgKnQpCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIDxzaXplPiBieXRlcyBvZiBzdG9yYWdlICovCisvKiAgaW5pdGlhbGl6ZWQgd2l0aCB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGlmKFNURFNZTlRBWCkKKyAgICBlbWl0KGYsIlx0c3BhY2VcdCVsZFxuIix6bTJsKHNpemUpKTsKKyAgZWxzZQorICAgIGVtaXQoZiwiXHRyZXNlcnZlXHQlbGRcbiIsem0ybChzaXplKSk7CisgIG5ld29iaj0wOworfQorCit2b2lkIGdlbl9hbGlnbihGSUxFICpmLHptYXggYWxpZ24pCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gbWFrZSBzdXJlIHRoZSBuZXh0IGRhdGEgaXMgICAgICovCisvKiAgYWxpZ25lZCB0byBtdWx0aXBsZXMgb2YgPGFsaWduPiBieXRlcy4gICAgICAgICAgICAgICovCit7CisgIGlmKHptMmwoYWxpZ24pPjEpIGVtaXQoZiwiXHRhbGlnbiAxXG4iKTsKK30KKwordm9pZCBnZW5fdmFyX2hlYWQoRklMRSAqZixzdHJ1Y3QgVmFyICp2KQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSB0aGUgaGVhZCBvZiBhIHZhcmlhYmxlICAqLworLyogIGRlZmluaXRpb24sIGkuZS4gdGhlIGxhYmVsIGFuZCBpbmZvcm1hdGlvbiBmb3IgICAgICAqLworLyogIGxpbmthZ2UgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgY29uc3RmbGFnLGI9c2Jhbmsodik7Y2hhciAqc2VjOworICBpZih2LT5jbGlzdCkgY29uc3RmbGFnPWlzX2NvbnN0KHYtPnZ0eXApOworICBpZih2LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpeworICAgIGlmKElTRlVOQyh2LT52dHlwLT5mbGFncykpIHJldHVybjsKKyAgICBpZih2LT50YXR0ciZaUEFHRSkKKyAgICAgIGVtaXQoZiwiXHR6cGFnZVx0JXMlbGRcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgaWYoIXNwZWNpYWxfc2VjdGlvbihmLHYpKXsKKyAgICAgIGlmKHYtPmNsaXN0JiYoIWNvbnN0ZmxhZ3x8KGdfZmxhZ3NbMl0mVVNFREZMQUcpKSl7ZW1pdChmLGRhdGFuYW1lKTtlYmFuayhmLGIpO2lmKGYpIHNlY3Rpb249REFUQTt9CisgICAgICBpZih2LT5jbGlzdCYmY29uc3RmbGFnJiYhKGdfZmxhZ3NbMl0mVVNFREZMQUcpKXtlbWl0KGYscm9kYXRhbmFtZSk7ZWJhbmsoZixiKTtpZihmKSBzZWN0aW9uPVJPREFUQTt9CisgICAgICBpZighdi0+Y2xpc3Qpe2VtaXQoZixic3NuYW1lKTtlYmFuayhmLGIpO2lmKGYpIHNlY3Rpb249QlNTO30KKyAgICB9CisgICAgZ2VuX2FsaWduKGYsZmFsaWduKHYtPnZ0eXApKTsKKyAgICBlbWl0KGYsIiVzJWxkOlxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKyAgICBuZXdvYmo9MTsKKyAgfQorICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4peworICAgIGVtaXQoZiwiXHQlc1x0JXMlc1xuIiwodi0+ZmxhZ3MmTkVFRFMpPyJuZWVkcyI6Imdsb2JhbCIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgaWYodi0+dGF0dHImWlBBR0UpCisgICAgICBlbWl0KGYsIlx0enBhZ2VcdCVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgaWYodi0+ZmxhZ3MmKERFRklORUR8VEVOVEFUSVZFKSl7CisgICAgICBpZighc3BlY2lhbF9zZWN0aW9uKGYsdikpeworCWlmKHYtPmNsaXN0JiYoIWNvbnN0ZmxhZ3x8KGdfZmxhZ3NbMl0mVVNFREZMQUcpKSl7ZW1pdChmLGRhdGFuYW1lKTtlYmFuayhmLGIpO2lmKGYpIHNlY3Rpb249REFUQTt9CisJaWYodi0+Y2xpc3QmJmNvbnN0ZmxhZyYmIShnX2ZsYWdzWzJdJlVTRURGTEFHKSl7ZW1pdChmLHJvZGF0YW5hbWUpO2ViYW5rKGYsYik7aWYoZikgc2VjdGlvbj1ST0RBVEE7fQorCWlmKCF2LT5jbGlzdCl7ZW1pdChmLGJzc25hbWUpO2ViYW5rKGYsYik7aWYoZikgc2VjdGlvbj1CU1M7fQorICAgICAgfQorCisgICAgICBnZW5fYWxpZ24oZixmYWxpZ24odi0+dnR5cCkpOworICAgICAgZW1pdChmLCIlcyVzOlxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICAgIG5ld29iaj0xOworICAgIH0KKyAgfQorfQorCit2b2lkIGdlbl9kYyhGSUxFICpmLGludCB0LHN0cnVjdCBjb25zdF9saXN0ICpwKQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSBzdGF0aWMgc3RvcmFnZSAgICAgICAgICAqLworLyogIGluaXRpYWxpemVkIHdpdGggY29uc3QtbGlzdCBwLiAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpZihJU0NIQVIodCkpCisgICAgZW1pdChmLCJcdGJ5dGVcdCIpOworICBlbHNlCisgICAgZW1pdChmLCJcdHdvcmRcdCIpOworICBpZighcC0+dHJlZSl7CisgICAgaWYoSVNMT05HKHQpfHxJU0ZMT0FUKHQpKXsKKyAgICAgIGlmKGllZWUmJklTRkxPQVQodCkpeworCWVtaXRfaWVlZShmLCZwLT52YWwsdCZOUSk7CisgICAgICB9ZWxzZXsKKwlldmFsX2NvbnN0KCZwLT52YWwsdCZOVSk7CisJaWYoSVNGTE9BVCh0KSkgY252X2ZwKCk7CisJZ3ZhbC52bWF4PXptYW5kKHZtYXgsbDJ6bSgweGZmZmZMKSk7CisJZW1pdHZhbChmLCZndmFsLE1BWElOVCk7CisJZW1pdChmLCIsIik7CisJZ3ZhbC52bWF4PXptYW5kKHptcnNoaWZ0KHZtYXgsbDJ6bSgxNkwpKSxsMnptKDB4ZmZmZkwpKTsKKwllbWl0dmFsKGYsJmd2YWwsTUFYSU5UKTsKKyAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgIGlmKElTRlBPSU5URVIodCkpeworCWV2YWxfY29uc3QoJnAtPnZhbCx0Jk5VKTsKKwllbWl0KGYsIiVsZFxuIiwobG9uZyl6bTJsKHZtYXgpJjB4ZmZmZik7CisJZW1pdChmLCJcdGJ5dGVcdCVkXG4iLChpbnQpKCh6bTJsKHZtYXgpPj4xNikmMHhmZikpOworICAgICAgfWVsc2UKKwllbWl0dmFsKGYsJnAtPnZhbCx0Jk5VKTsKKyAgICB9CisgIH1lbHNleworICAgIGVtaXRfb2JqKGYsJnAtPnRyZWUtPm8sdCZOVSk7CisgICAgaWYoSVNGUE9JTlRFUih0KSl7CisgICAgICBpbnQgYjsKKyAgICAgIGlmKChwLT50cmVlLT5vLmZsYWdzJihWQVJ8VkFSQURSKSkhPShWQVJ8VkFSQURSKSkgaWVycm9yKDApOworICAgICAgYj1iYW5rKHAtPnRyZWUtPm8udik7CisgICAgICBlbWl0KGYsIlxuXHRieXRlXHQlZCIsYj49MD9iOmJhbmtjbnVtKTsKKyAgICB9CisgIH0KKyAgZW1pdChmLCJcbiIpO25ld29iaj0wOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9tNjUoRklMRSAqZixJQyAqcCkKK3sKKyAgaW50IHQ9cC0+dHlwZixjPXAtPmNvZGUsbm9vcDI9MDsKKyAgaWYoYz09TVVMVCYmKElTU0hPUlQodCl8fElTQ0hBUih0KSkpeworICAgIGdldF9hY2MoZixwLElOVCk7CisgICAgbG9hZF9hY2MoZiwmcC0+cTEsdCk7CisgICAgaWYobTY1aW8peworICAgICAgZW1pdChmLCJcdHN0YVx0JGQ3NzBcbiIpOworICAgICAgaWYoSVNTSE9SVCh0KSkgZW1pdChmLCJcdHN0eFx0JGQ3NzFcbiIpOworICAgIH1lbHNleworICAgICAgZW1pdChmLCJcdGxkelx0IyQ3MFxuIik7CisgICAgICBlbWl0KGYsIlx0c3R6XHRfX19tNjVtYXRocHRyXG4iKTsKKyAgICAgIGVtaXQoZiwiXHRzdHFcdFtfX19tNjVtYXRocHRyXVxuIik7CisgICAgfQorICAgIGxvYWRfYWNjKGYsJnAtPnEyLHQpOworICAgIGlmKG02NWlvKXsKKyAgICAgIGVtaXQoZiwiXHRzdGFcdCRkNzc0XG4iKTsKKyAgICAgIGlmKElTU0hPUlQodCkpIGVtaXQoZiwiXHRzdHhcdCRkNzc1XG4iKTsKKyAgICB9CisgICAgaWYobTY1aW8peworICAgICAgZW1pdChmLCJcdGxkYVx0JGQ3NzhcbiIpOworICAgICAgaWYoSVNTSE9SVCh0KSkgZW1pdChmLCJcdGxkeFx0JGQ3NzlcbiIpOworICAgIH1lbHNleworICAgICAgZW1pdChmLCJcdGxkelx0IyQ3NFxuIik7CisgICAgICBlbWl0KGYsIlx0c3R6XHRfX19tNjVtYXRocHRyXG4iKTsKKyAgICAgIGVtaXQoZiwiXHRzdHFcdFtfX19tNjVtYXRocHRyXVxuIik7ICAgIAorICAgICAgZW1pdChmLCJcdGxkelx0IzRcbiIpOworICAgICAgZW1pdChmLCJcdGxkcVx0W19fX202NW1hdGhwdHJdLHpcbiIpOworICAgICAgZW1pdChmLCJcdGxkelx0IzBcbiIpOworICAgIH0KKyAgICB5dmFsPU5PVkFMOworICAgIHN0b3JlX2FjYyhmLCZwLT56LHQpOworICAgIHJldHVybiAxOworICB9CisgIGlmKElTTE9ORyh0KSYmTE9OR002NShjKSl7CisgICAgaW50IG1ub3k7CisKKyAgICBpZihjPT1BU1NJR04mJmlzcmVnKHExKSYmaXNyZWcoeikmJnAtPnExLnJlZz09cC0+ei5yZWcpIHJldHVybiAxOworICAgIGlmKGM9PUdFVFJFVFVSTiYmaXNyZWcoeikmJnAtPnoucmVnPT1GSVJTVF9CSUcpIHJldHVybiAxOworICAgIGlmKGM9PVNFVFJFVFVSTiYmaXNyZWcocTEpJiZwLT5xMS5yZWc9PUZJUlNUX0JJRykgcmV0dXJuIDE7CisKKyAgICBnZXRfYWNjKGYscCxJTlQpOworCisgICAgaWYoYz09TFNISUZUfHxjPT1SU0hJRlQpeworICAgICAgaW50IHIsY250PS0xLG16emVybzsKKyAgICAgIAorICAgICAgaWYoKHAtPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKwlldmFsX2NvbnN0KCZwLT5xMi52YWwscC0+dHlwZjIpOworCWNudD0oaW50KSh6bTJsKHZtYXgpKTsKKwljbnQmPTMxOworICAgICAgfQorCisgICAgICBpZihjbnQ9PTI0fHxjbnQ9PTE2fHxjbnQ9PTh8fChjbnQ+PTAmJighb3B0c2l6ZXx8Y250PD0yKSkpeworCXI9MDsKKyAgICAgIH1lbHNleworCWlmKGlzcmVnKHEyKSYmcC0+cTIucmVnPj1GSVJTVF9HUFImJnNjcmF0Y2gocCxyLDApKXsKKwkgIHI9cC0+cTIucmVnOworCSAgaWYocmVnX3BhaXIociwmcnApKSByPXJwLnIxOworCX1lbHNleworCSAgLyogVE9ETzogaW1wcm92ZSBmb3IgeCBvciB6ICovCisJICBsb2FkX2xvYnl0ZShmLCZwLT5xMixwLT50eXBmMik7CisJICByPXQxOworCSAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwl9CisgICAgICB9CisKKyAgICAgIG16emVybz16emVybzsKKyAgICAgIHp6ZXJvPTA7CisgICAgICBpZihjbnQ9PTI0fHwoIW9wdHNpemUmJmNudD49MjQpKXsKKwljbnQtPTI0OworCWlmKGM9PUxTSElGVCl7CisJICBpZihpbmRpcmVjdCgmcC0+cTEpKXsKKwkgICAgbG9hZF9sb2J5dGUoZiwmcC0+cTEsdCk7CisJICAgIGVtaXQoZiwiXHR0YXpcbiIpOworCSAgfWVsc2UKKwkgICAgZG9fbG9ieXRlKGYsImxkeiIsJnAtPnExLHQpOworCSAgZW1pdChmLCJcdGxkYVx0IzBcbiIpOworCSAgZW1pdChmLCJcdHRheFxuIik7CisJICBlbWl0KGYsIlx0dGF5XG4iKTsKKwkgIHl2YWw9MDsKKwl9ZWxzZSBpZih0JlVOU0lHTkVEKXsKKwkgIGRvX2J5dGU0KGYsImxkYSIsJnAtPnExLHQpOworCSAgZW1pdChmLCJcdGxkeFx0IzBcbiIpOworCSAgZW1pdChmLCJcdGxkelx0IzBcbiIpOworCSAgZW1pdChmLCJcdGxkeVx0IzBcbiIpOworCSAgeXZhbD0wOworCX1lbHNleworCSAgZW1pdChmLCJcdGxkeFx0IzBcbiIpOworCSAgZW1pdChmLCJcdGxkelx0IzBcbiIpOworCSAgZW1pdChmLCJcdGxkeVx0IzBcbiIpOworCSAgeXZhbD0wOworCSAgZG9fYnl0ZTQoZiwibGRhIiwmcC0+cTEsdCk7CisJICBlbWl0KGYsIlx0YnBsXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgIGVtaXQoZiwiXHRkZXhcbiIpOworCSAgaWYoeXZhbD09MCkgCisJICAgIGVtaXQoZiwiXHRkZXlcbiIpOworCSAgZW1pdChmLCJcdGRlelxuIik7CisJICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICBpZih5dmFsIT0wKXsKKwkgICAgZW1pdChmLCJcdHBoeFxuIik7CisJICAgIGVtaXQoZiwiXHRwbHlcbiIpOworCSAgfQorCX0KKyAgICAgIH1lbHNlIGlmKGNudD09MTZ8fCghb3B0c2l6ZSYmY250Pj0xNikpeworCWNudC09MTY7CisJaWYoYz09TFNISUZUKXsKKwkgIGlmKGluZGlyZWN0KCZwLT5xMSkpeworCSAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgZW1pdChmLCJcdHRhelxuIik7CisJICAgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgICBlbWl0KGYsIlx0dGF5XG4iKTsKKwkgIH1lbHNleworCSAgICBkb19sb2J5dGUoZiwibGR5IiwmcC0+cTEsdCk7CisJICAgIGRvX2hpYnl0ZShmLCJsZHoiLCZwLT5xMSx0KTsKKwkgIH0KKwkgIGVtaXQoZiwiXHRsZGFcdCMwXG4iKTsKKwkgIGVtaXQoZiwiXHR0YXhcbiIpOworCX1lbHNlIGlmKHQmVU5TSUdORUQpeworCSAgaWYoaW5kaXJlY3QoJnAtPnExKSl7CisJICAgIGRvX2J5dGU0KGYsImxkYSIsJnAtPnExLHQpOworCSAgICBlbWl0KGYsIlx0dGF4XG4iKTsKKwkgICAgZG9fYnl0ZTMoZiwibGRhIiwmcC0+cTEsdCk7CisJICB9ZWxzZXsKKwkgICAgZG9fYnl0ZTMoZiwibGRhIiwmcC0+cTEsdCk7CisJICAgIGRvX2J5dGU0KGYsImxkeCIsJnAtPnExLHQpOworCSAgfQorCSAgZW1pdChmLCJcdGxkeVx0IzBcbiIpOworCSAgZW1pdChmLCJcdGxkelx0IzBcbiIpOworCX1lbHNleworCSAgZW1pdChmLCJcdGxkeVx0IzBcbiIpOworCSAgZW1pdChmLCJcdGxkelx0IzBcbiIpOworCSAgeXZhbD0wOworCSAgaWYoaW5kaXJlY3QoJnAtPnExKSl7CisJICAgIGRvX2J5dGU0KGYsImxkYSIsJnAtPnExLHQpOworCSAgICBlbWl0KGYsIlx0dGF4XG4iKTsKKwkgICAgZG9fYnl0ZTMoZiwibGRhIiwmcC0+cTEsdCk7CisJICAgIGVtaXQoZiwiXHRjcHhcdCMwXG4iKTsKKwkgIH1lbHNleworCSAgICBkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgZG9fYnl0ZTQoZiwibGR4IiwmcC0+cTEsdCk7CisJICB9CisJICBlbWl0KGYsIlx0YnBsXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgIGVtaXQoZiwiXHRkZXpcbiIpOworCSAgaWYoeXZhbD09MCkKKwkgICAgZW1pdChmLCJcdGRleVxuIik7CisJICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICBpZih5dmFsIT0wKXsKKwkgICAgZW1pdChmLCJcdHBoelxuIik7CisJICAgIGVtaXQoZiwiXHRwbHlcbiIpOworCSAgfQorCX0KKyAgICAgIH1lbHNlIGlmKGNudD09OHx8KCFvcHRzaXplJiZjbnQ+PTgpKXsKKwljbnQtPTg7CisJaWYoYz09TFNISUZUKXsKKwkgIGlmKGluZGlyZWN0KCZwLT5xMSkpeworCSAgICBkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgZW1pdChmLCJcdHRhelxuIik7CisJICAgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgICBlbWl0KGYsIlx0dGF4XG4iKTsKKwkgICAgbG9hZF9oaWJ5dGUoZiwmcC0+cTEsdCk7CisJICAgIGVtaXQoZiwiXHR0YXlcbiIpOworCSAgfWVsc2V7CisJICAgIGRvX2xvYnl0ZShmLCJsZHgiLCZwLT5xMSx0KTsKKwkgICAgZG9fYnl0ZTMoZiwibGR6IiwmcC0+cTEsdCk7CisJICAgIGRvX2hpYnl0ZShmLCJsZHkiLCZwLT5xMSx0KTsKKwkgIH0KKwkgIGVtaXQoZiwiXHRsZGFcdCMwXG4iKTsKKwl9ZWxzZSBpZih0JlVOU0lHTkVEKXsKKwkgIGVtaXQoZiwiXHRsZHpcdCMwXG4iKTsKKwkgIGlmKGluZGlyZWN0KCZwLT5xMSkpeworCSAgICBkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgZW1pdChmLCJcdHBoYVxuIik7CisJICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCSAgICBlbWl0KGYsIlx0dGF4XG4iKTsKKwkgICAgZG9faGlieXRlKGYsImxkYSIsJnAtPnExLHQpOworCSAgICBlbWl0KGYsIlx0cGx5XG4iKTsKKwkgIH1lbHNleworCSAgICBkb19oaWJ5dGUoZiwibGRhIiwmcC0+cTEsdCk7CisJICAgIGRvX2J5dGUzKGYsImxkeCIsJnAtPnExLHQpOworCSAgICBkb19ieXRlNChmLCJsZHkiLCZwLT5xMSx0KTsKKwkgIH0KKwl9ZWxzZXsKKwkgIGVtaXQoZiwiXHRsZHpcdCMwXG4iKTsKKwkgIGlmKGluZGlyZWN0KCZwLT5xMSkpeworCSAgICBkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgZW1pdChmLCJcdHBoYVxuIik7CisJICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCSAgICBlbWl0KGYsIlx0dGF4XG4iKTsKKwkgICAgZG9faGlieXRlKGYsImxkYSIsJnAtPnExLHQpOworCSAgICBlbWl0KGYsIlx0cGx5XG4iKTsKKwkgIH1lbHNleworCSAgICBkb19oaWJ5dGUoZiwibGRhIiwmcC0+cTEsdCk7CisJICAgIGRvX2J5dGUzKGYsImxkeCIsJnAtPnExLHQpOworCSAgICBkb19ieXRlNChmLCJsZHkiLCZwLT5xMSx0KTsKKwkgIH0KKwkgIGVtaXQoZiwiXHRicGxcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCSAgZW1pdChmLCJcdGRlelxuIik7CisJICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJfQorICAgICAgfWVsc2V7CisJbW5veT1ub3k7CisJbGRxX29mZnNldChmLCZwLT5xMSk7CisJbm95PTI7CisJZW1pdChmLCJcdGxkcVx0Iik7CisJZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJZW1pdChmLCJcbiIpOworCW5veT1tbm95OworICAgICAgfQorICAgICAgaWYocil7CisJZW1pdChmLCJcdGRlY1x0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwllbWl0KGYsIlx0Ym1pXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwllbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwllbWl0KGYsIlx0JXNcbiIsYz09TFNISUZUPyJhc2xxIjooKHQmVU5TSUdORUQpPyJsc3JxIjoiYXNycSIpKTsKKwllbWl0KGYsIlx0ZGVjXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCWVtaXQoZiwiXHRicGxcdCVzJWRcbiIsbGFicHJlZml4LGxhYmVsKTsKKwllbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbC0xKTsKKyAgICAgIH1lbHNleworCXdoaWxlKC0tY250Pj0wKQorCSAgZW1pdChmLCJcdCVzXG4iLGM9PUxTSElGVD8iYXNscSI6KCh0JlVOU0lHTkVEKT8ibHNycSI6ImFzcnEiKSk7CisgICAgICB9CisgICAgICB5dmFsPU5PVkFMOworICAgICAgbW5veT1ub3k7CisgICAgICBub3k9MTsKKyAgICAgIGVtaXQoZiwiXHRzdHFcdCIpOworICAgICAgZW1pdF9vYmooZiwmcC0+eix0KTsKKyAgICAgIGVtaXQoZiwiXG4iKTsKKyAgICAgIG5veT1tbm95OworICAgICAgZW1pdChmLCJcdGxkelx0IzBcbiIpOworICAgICAgenplcm89bXp6ZXJvOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYoYz09UFVTSCl7CisgICAgICBpZihwdXNoZWQpeworCWVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tzcF0pOworCWVtaXQoZiwiXHRsZHhcdCVzKzFcbiIsbXJlZ25hbWVzW3NwXSk7CisJZW1pdChmLCJcdGNsY1xuIik7CisJZW1pdChmLCJcdGFkY1x0IyVkXG4iLHB1c2hlZCk7CisJZW1pdChmLCJcdGJjY1x0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJZW1pdChmLCJcdGlueFxuIik7CisJZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwpOworCWVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1t0MV0pOworCWVtaXQoZiwiXHRzdHhcdCVzXG4iLG1yZWduYW1lc1t0Ml0pOworICAgICAgfQorICAgICAgcHVzaGVkKz00OworICAgIH0KKyAgICBpZigoYz09TVVMVHx8Yz09RElWKSYmIW02NWlvKXsKKyAgICAgIGVtaXQoZiwiXHRsZGFcdCMkNzBcbiIpOworICAgICAgZW1pdChmLCJcdHN0YVx0X19fbTY1bWF0aHB0clxuIik7CisgICAgfQorICAgIHl2YWw9Tk9WQUw7CisgICAgbm95PTE7CisgICAgaWYoKHAtPnExLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKyAgICAgIHVuc2lnbmVkIGxvbmcgdjsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnExLnZhbCxxMXR5cChwKSk7CisgICAgICB2PXp1bTJ1bCh2dW1heCk7CisgICAgICBlbWl0KGYsIlx0bGRhXHQjJWRcbiIsKGludCkodiYyNTUpKTt2Pj49ODsKKyAgICAgIGVtaXQoZiwiXHRsZHhcdCMlZFxuIiwoaW50KSh2JjI1NSkpO3Y+Pj04OworICAgICAgZW1pdChmLCJcdGxkeVx0IyVkXG4iLChpbnQpKHYmMjU1KSk7dj4+PTg7CisgICAgICBlbWl0KGYsIlx0bGR6XHQjJWRcbiIsKGludCkodiYyNTUpKTsKKyAgICB9ZWxzZSBpZihjPT1HRVRSRVRVUk4peworICAgICAgZW1pdChmLCJcdGxkcVx0JXNcbiIsbXJlZ25hbWVzW0ZJUlNUX0JJR10pOworICAgIH1lbHNleworICAgICAgbm95PTI7CisgICAgICBsZHFfb2Zmc2V0KGYsJnAtPnExKTsKKyAgICAgIGVtaXQoZiwiXHRsZHFcdCIpOworICAgICAgLypUT0RPOiBWQVJBRFIgKi8KKyAgICAgIGlmKChwLT5xMS5mbGFncyZWQVJBRFIpfHwocC0+cTEuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworCWVtaXQoZiwiJXMlZCIsbGFicHJlZml4LGFkZGZwY29uc3QoJnAtPnExLHExdHlwKHApKSk7CisgICAgICB9ZWxzZQorCWVtaXRfb2JqKGYsJnAtPnExLHQpOworICAgICAgZW1pdChmLCJcbiIpOworICAgICAgbm95PTE7CisgICAgfQorICAgIGlmKGM9PUFERCl7CisgICAgICBpZigocC0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworCWV2YWxfY29uc3QoJnAtPnEyLnZhbCx0KTsKKwlpZih6bWVxdG8odm1heCxaMSkpe25vb3AyPTE7ZW1pdChmLCJcdGlucVxuIik7fQorCWVsc2UgaWYoem1lcXRvKHZtYXgsbDJ6bSgyTCkpKXtub29wMj0xO2VtaXQoZiwiXHRpbnFcblx0aW5xXG4iKTt9CisJZWxzZSBpZih6bWVxdG8odm1heCxsMnptKDNMKSkpe25vb3AyPTE7ZW1pdChmLCJcdGlucVxuXHRpbnFcblx0aW5xXG4iKTt9CisJZWxzZSBpZih6bWVxdG8odm1heCxsMnptKDRMKSkpe25vb3AyPTE7ZW1pdChmLCJcdGlucVxuXHRpbnFcblx0aW5xXG5cdGlucVxuIik7fQorICAgICAgfQorICAgICAgaWYoIW5vb3AyKXsKKwllbWl0KGYsIlx0Y2xjXG4iKTsKKwllbWl0KGYsIlx0YWRjcVx0Iik7CisgICAgICB9CisgICAgfWVsc2UgaWYoYz09U1VCKXsKKyAgICAgIGlmKChwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisJZXZhbF9jb25zdCgmcC0+cTIudmFsLHQpOworCWlmKHptZXF0byh2bWF4LFoxKSl7bm9vcDI9MTtlbWl0KGYsIlx0ZGVxXG4iKTt9CisJZWxzZSBpZih6bWVxdG8odm1heCxsMnptKDJMKSkpe25vb3AyPTE7ZW1pdChmLCJcdGRlcVxuXHRkZXFcbiIpO30KKwllbHNlIGlmKHptZXF0byh2bWF4LGwyem0oM0wpKSl7bm9vcDI9MTtlbWl0KGYsIlx0ZGVxXG5cdGRlcVxuXHRkZXFcbiIpO30KKwllbHNlIGlmKHptZXF0byh2bWF4LGwyem0oNEwpKSl7bm9vcDI9MTtlbWl0KGYsIlx0ZGVxXG5cdGRlcVxuXHRkZXFcblx0ZGVxXG4iKTt9CisgICAgICB9CisgICAgICBpZighbm9vcDIpeworCWVtaXQoZiwiXHRzZWNcbiIpOworCWVtaXQoZiwiXHRzYmNxXHQiKTsKKyAgICAgIH0KKyAgICB9ZWxzZSBpZihjPT1PUil7CisgICAgICBlbWl0KGYsIlx0b3JxXHQiKTsKKyAgICB9ZWxzZSBpZihjPT1BTkQpeworICAgICAgZW1pdChmLCJcdGFuZHFcdCIpOworICAgIH1lbHNlIGlmKGM9PVhPUil7CisgICAgICBlbWl0KGYsIlx0ZW9ycVx0Iik7CisgICAgfWVsc2UgaWYoYz09TVVMVHx8Yz09RElWKXsKKyAgICAgIGlmKG02NWlvKXsKKwllbWl0KGYsIlx0c3RxXHQkZDc3MFxuIik7CisgICAgICB9ZWxzZXsKKwllbWl0KGYsIlx0c3RxXHRbX19fbTY1bWF0aHB0cl1cbiIpOworCWVtaXQoZiwiXHRsZGFcdCMkNzRcbiIpOworCWVtaXQoZiwiXHRzdGFcdF9fX202NW1hdGhwdHJcbiIpOworICAgICAgfQorICAgICAgbm95PTI7CisgICAgICBsZHFfb2Zmc2V0KGYsJnAtPnEyKTsKKyAgICAgIGVtaXQoZiwiXHRsZHFcdCIpOworICAgIH0KKyAgICBpZihjIT1BU1NJR04mJmMhPVBVU0gmJmMhPUdFVFJFVFVSTiYmYyE9U0VUUkVUVVJOJiYhbm9vcDIpeworICAgICAgaWYoKHAtPnEyLmZsYWdzJlZBUkFEUil8fChwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisJZW1pdChmLCIlcyVkIixsYWJwcmVmaXgsYWRkZnBjb25zdCgmcC0+cTIscTJ0eXAocCkpKTsKKyAgICAgIH1lbHNlCisJZW1pdF9vYmooZiwmcC0+cTIsdCk7CisgICAgICBlbWl0KGYsIlxuIik7CisgICAgfQorICAgIG5veT0xOworICAgIGlmKGM9PU1VTFR8fGM9PURJVil7CisgICAgICBpZihtNjVpbykKKwllbWl0KGYsIlx0c3RxXHQkZDc3NFxuIik7CisgICAgICBlbHNlCisJZW1pdChmLCJcdHN0cVx0W19fX202NW1hdGhwdHJdXG4iKTsKKyAgICAgIGlmKG02NWlvKXsKKwlpZihjPT1ESVYpeworCSAgLyogZGVsYXkgKi8KKwkgIGVtaXQoZiwiXHRsZGFcdCRkNzZjXG4iKTsKKwkgIGVtaXQoZiwiXHRsZGFcdCRkNzZjXG4iKTsKKwkgIGVtaXQoZiwiXHRsZGFcdCRkNzZjXG4iKTsKKwkgIGVtaXQoZiwiXHRsZGFcdCRkNzZjXG4iKTsKKwkgIGVtaXQoZiwiXHRsZHFcdCRkNzZjXG4iKTsKKwl9ZWxzZQorCSAgZW1pdChmLCJcdGxkcVx0JGQ3NzhcbiIpOworICAgICAgfWVsc2V7CisJaWYoYz09RElWKXsKKwkgIGVtaXQoZiwiXHRsZGFcdCMkNmNcbiIpOworCSAgZW1pdChmLCJcdHN0YVx0X19fbTY1bWF0aHB0clxuIik7CisJICBlbWl0KGYsIlx0bGR6XHQjMFxuIik7CisJICBlbWl0KGYsIlx0bGRhXHRbX19fbTY1bWF0aHB0cl0selxuIik7IC8qIGRlbGF5IGZvciBkaXZpc2lvbiAqLworCX1lbHNlCisJICBlbWl0KGYsIlx0bGR6XHQjNFxuIik7CisJZW1pdChmLCJcdGxkcVx0W19fX202NW1hdGhwdHJdLHpcbiIpOworICAgICAgfQorICAgIH0KKyAgICBlbWl0KGYsIlx0c3RxXHQiKTsKKyAgICBpZihjPT1QVVNIKQorICAgICAgZW1pdChmLCIoJXMpIixwdXNoZWQ9PTQ/bXJlZ25hbWVzW3NwXTptcmVnbmFtZXNbdDFdKTsKKyAgICBlbHNlIGlmKGM9PVNFVFJFVFVSTikKKyAgICAgIGVtaXQoZiwiJXMiLG1yZWduYW1lc1tGSVJTVF9CSUddKTsKKyAgICBlbHNlCisgICAgICBlbWl0X29iaihmLCZwLT56LHQpOworICAgIGVtaXQoZiwiXG4iKTsKKyAgICBub3k9MDsKKyAgICBpZih6emVybykgCisgICAgICBlbWl0KGYsIlx0bGR6XHQjMFxuIik7CisgICAgZWxzZQorICAgICAgaWVycm9yKDApOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCisvKiAgVGhlIG1haW4gY29kZS1nZW5lcmF0aW9uIHJvdXRpbmUuICAgICAgICAgICAgICAgICAgICovCisvKiAgZiBpcyB0aGUgc3RyZWFtIHRoZSBjb2RlIHNob3VsZCBiZSB3cml0dGVuIHRvLiAgICAgICovCisvKiAgcCBpcyBhIHBvaW50ZXIgdG8gYSBkb3VibHkgbGlua2VkIGxpc3Qgb2YgSUNzICAgICAgICovCisvKiAgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gYm9keSB0byBnZW5lcmF0ZSBjb2RlIGZvci4gICovCisvKiAgdiBpcyBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb2Zmc2V0IGlzIHRoZSBzaXplIG9mIHRoZSBzdGFja2ZyYW1lIHRoZSBmdW5jdGlvbiAgICovCisvKiAgbmVlZHMgZm9yIGxvY2FsIHZhcmlhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3ZvaWQgZ2VuX2NvZGUoRklMRSAqZixzdHJ1Y3QgSUMgKnAsc3RydWN0IFZhciAqdix6bWF4IG9mZnNldCkKKy8qICBUaGUgbWFpbiBjb2RlLWdlbmVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBjLHQsaTsKKyAgc3RydWN0IElDICptaTsKKyAgRklMRSAqcmY9ZjsKKyAgc3RhdGljIGNoYXIgKmRiZ2ZpbGU7CisgIHN0YXRpYyBpbnQgZGJnbGluZTsKKworICBpZih2bGFzKXsKKyAgICBmcD1GUFZMQV9SRUc7CisgICAgaWYoIXJlZ19wYWlyKGZwLCZycCkpIGllcnJvcigwKTsKKyAgICBmcDE9cnAucjE7CisgICAgZnAyPXJwLnIyOworICAgIHJlZ3VzZWRbZnBdPXJlZ3VzZWRbZnAxXT1yZWd1c2VkW2ZwMl09MTsKKyAgIH1lbHNleworICAgIGZwPXNwOworICAgIGZwMT1zcDE7CisgICAgZnAyPXNwMjsKKyAgfQorICBhcmdzaXplPTA7CisgIGxvY2Fsc2l6ZT1vZmZzZXQ7CisgIGlmKERFQlVHJjEpIHByaW50ZigiZ2VuX2NvZGUoKVxuIik7CisKKyAgaWYoY2UwMikgenplcm89MTsgLyogVE9ETzogY2hlY2sgd2hhdCB0byBkbyAqLworCisgIGNiYW5rPWJhbmsodik7CisKKyAgaWYoIXYtPmZpKSB2LT5maT1uZXdfZmkoKTsKKyAgdi0+ZmktPmZsYWdzfD1BTExfUkVHUzsKKworICBmb3IobWk9cDttaTttaT1taS0+bmV4dCkKKyAgICBzd2l0Y2hfSUMobWkpOworCisgIGZvcihwYXNzPTA7cGFzczwyO3Bhc3MrKyl7CisKKyAgICBpZihERUJVRyYxKSBwcmludGYoInBhc3MgJWRcbiIscGFzcyk7CisKKyAgICBpZihwYXNzPT0wKXsKKyAgICAgIGY9MDsKKyAgICAgIG1pPWNsb25lX2ljKHApOworICAgIH1lbHNlCisgICAgICBmPXJmOworCisgICAgZm9yKGM9MTtjPD1NQVhSO2MrKykgcmVnc1tjXT0wOyAvKnJlZ3NhW2NdOyovCisgICAgbWF4cHVzaGVkPTA7CisKKyAgICAvKkZJWE1FKi8KKyAgICBpZih2LT50YXR0ciZJTlRFUlJVUFQpeworICAgICAgcmV0PSJcdHJ0aVxuIjsKKyAgICAgIGluX2lzcj0xOworICAgIH1lbHNleworICAgICAgcmV0PSJcdHJ0c1xuIjsKKyAgICAgIGluX2lzcj0wOworICAgIH0KKworICAgIGlmKCFub3BlZXApIHBlZXBob2xlKHBhc3M9PTA/cDptaSk7CisKKyAgICBmdW5jdGlvbl90b3AoZix2LGxvY2Fsc2l6ZSk7CisKKyAgICBwdXNoZWQ9MDsKKworICAgIHl2YWw9Tk9WQUw7CisKKyAgICBkYmdmaWxlPTA7CisgICAgZGJnbGluZT0wOworCisgICAgZm9yKHA9cGFzcz09MD9wOm1pO3A7cHIoZixwKSxwPXAtPm5leHQpeworCisKKworICAgICAgaWYoREVCVUcmMSkgcHJpYzIoc3Rkb3V0LHApOworCisgICAgICBpZihkZWJ1Z19pbmZvKXsKKwlpZihwLT5maWxlJiZwLT5saW5lKXsKKwkgIGlmKHAtPmZpbGUhPWRiZ2ZpbGV8fHAtPmxpbmUhPWRiZ2xpbmUpeworCSAgICBkYmdmaWxlPXAtPmZpbGU7CisJICAgIGRiZ2xpbmU9cC0+bGluZTsKKwkgICAgZW1pdChmLCI7ICVkIFwiJXNcIlxuIixkYmdsaW5lLGRiZ2ZpbGUpOworCSAgfQorCX0KKyAgICAgIH0KKworICAgICAgYz1wLT5jb2RlO3Q9cC0+dHlwZjsKKworICAgICAgaWYoYz09Tk9QKSB7cC0+ei5mbGFncz0wO2NvbnRpbnVlO30KKyAgICAgIGlmKGM9PUFMTE9DUkVHKXsKKwlyZWdzW3AtPnExLnJlZ109MTsKKwlpZihyZWdfcGFpcihwLT5xMS5yZWcsJnJwKSl7CisJICByZWdzW3JwLnIxXT0xOworCSAgcmVnc1tycC5yMl09MTsKKwl9CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZihjPT1GUkVFUkVHKXsKKwlyZWdzW3AtPnExLnJlZ109MDsKKwlpZihyZWdfcGFpcihwLT5xMS5yZWcsJnJwKSl7CisJICByZWdzW3JwLnIxXT0wOworCSAgcmVnc1tycC5yMl09MDsKKwl9CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZihjPT1MQUJFTCkge2VtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LHQpO3l2YWw9Tk9WQUw7Y29udGludWU7fQorICAgICAgaWYoYz09QlJBKXsKKwl5dmFsPU5PVkFMOworCWlmKHQ9PWV4aXRfbGFiZWwmJmxvY2Fsc2l6ZSthcmdzaXplK3JzYXZlc2l6ZStyc2NudD09MCkKKwkgIGVtaXQoZixyZXQpOworCWVsc2UKKwkgIGVtaXQoZiwiXHQlc1x0JXMlZFxuIixqbXBpbnN0LGxhYnByZWZpeCx0KTsKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKGM+PUJFUSYmYzxCUkEpeworCXl2YWw9Tk9WQUw7CisJY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmKGM9PU1PVkVUT1JFRyl7CisJcC0+Y29kZT1jPUFTU0lHTjsKKwlwLT50eXBmPXQ9cmVndHlwZVtwLT56LnJlZ10tPmZsYWdzOworCXAtPnEyLnZhbC52bWF4PXNpemV0YWJbcmVndHlwZVtwLT56LnJlZ10tPmZsYWdzXTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PU1PVkVGUk9NUkVHKXsKKwlwLT5jb2RlPWM9QVNTSUdOOworCXAtPnR5cGY9dD1yZWd0eXBlW3AtPnExLnJlZ10tPmZsYWdzOworCXAtPnEyLnZhbC52bWF4PXNpemV0YWJbcmVndHlwZVtwLT5xMS5yZWddLT5mbGFnc107CisgICAgICB9CisgICAgICBpZihjPT1DT05WRVJUJiZJU0NIQVIodCkmJklTQ0hBUihwLT50eXBmMikpeworCXAtPmNvZGU9Yz1BU1NJR047CisJcC0+cTIudmFsLnZtYXg9c2l6ZXRhYltDSEFSXTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PUNPTlZFUlQmJm1zaXpldGFiW3QmTlFdPT0zJiZtc2l6ZXRhYltwLT50eXBmMiZOUV09PTMpeworCXAtPmNvZGU9Yz1BU1NJR047CisJcC0+cTIudmFsLnZtYXg9c2l6ZXRhYltTSE9SVF07CisgICAgICB9CisgICAgICBpZihjPT1DT05WRVJUJiZJU1NIT1JUKHQpJiZJU1NIT1JUKHAtPnR5cGYyKSl7CisJcC0+Y29kZT1jPUFTU0lHTjsKKwlwLT5xMi52YWwudm1heD1zaXpldGFiW1NIT1JUXTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PUNPTlZFUlQmJklTTE9ORyh0KSYmSVNMT05HKHAtPnR5cGYyKSl7CisJcC0+Y29kZT1jPUFTU0lHTjsKKwlwLT5xMi52YWwudm1heD1zaXpldGFiW0xPTkddOworICAgICAgfQorICAgICAgaWYoYz09Q09OVkVSVCYmSVNMTE9ORyh0KSYmSVNMTE9ORyhwLT50eXBmMikpeworCXAtPmNvZGU9Yz1BU1NJR047CisJcC0+cTIudmFsLnZtYXg9c2l6ZXRhYltMTE9OR107CisgICAgICB9CisgICAgICBpZihjPT1DT05WRVJUJiZJU0ZMT0FUKHQpJiZJU0ZMT0FUKHAtPnR5cGYyKSl7CisJcC0+Y29kZT1jPUFTU0lHTjsKKwlwLT5xMi52YWwudm1heD1zaXpldGFiW3QmTlFdOworICAgICAgfQorCisKKyAgICAgIC8qIHN3aXRjaCBjb21tdXRhdGl2ZSBvcGVyYW5kcyBpZiBzdWl0YWJsZSAqLworICAgICAgaWYoYz09QUREfHxjPT1NVUxUfHxjPT1BTkR8fGM9PVhPUnx8Yz09T1J8fChjPT1BRERJMlAmJklTU0hPUlQodCkmJiFJU0ZQT0lOVEVSKHAtPnR5cGYyKSkpeworCWlmKChjb21wYXJlX29iamVjdHMoJnAtPnEyLCZwLT56KSYmIWlzYWNjKHExKSl8fGlzYWNjKHEyKSl7CisJICBzdHJ1Y3Qgb2JqIHRtcDsKKwkgIHRtcD1wLT5xMTsKKwkgIHAtPnExPXAtPnEyOworCSAgcC0+cTI9dG1wOworCX0KKyAgICAgIH0KKworICAgICAgaWYoYz09Q09NUEFSRSYmKChwLT5xMS5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVHx8SVNSSURYKHEyKXx8KGlzYWNjKHEyKSYmIUlTUklEWChxMSkpKSl7CisJb2JqIHRtcDtJQyAqYjsKKwl0bXA9cC0+cTE7CisJcC0+cTE9cC0+cTI7CisJcC0+cTI9dG1wOworCWZvcihiPXAtPm5leHQ7YjtiPWItPm5leHQpeworCSAgaW50IGJjOworCSAgaWYoIWJ8fGItPmNvZGU9PUxBQkVMKSBpZXJyb3IoMCk7CisJICBiYz1iLT5jb2RlOworCSAgaWYoYmM9PUJHVCl7Yi0+Y29kZT1CTFQ7YnJlYWs7fQorCSAgaWYoYmM9PUJHRSl7Yi0+Y29kZT1CTEU7YnJlYWs7fQorCSAgaWYoYmM9PUJMVCl7Yi0+Y29kZT1CR1Q7YnJlYWs7fQorCSAgaWYoYmM9PUJMRSl7Yi0+Y29kZT1CR0U7YnJlYWs7fQorCSAgaWYoYmM9PUJORXx8YmM9PUJFUSkgYnJlYWs7CisJfQorICAgICAgfQorCisgICAgICBjPXAtPmNvZGU7CisgICAgICBpZihjPT1TVUJQRlApIGM9U1VCOworICAgICAgLyppZihjPT1BRERJMlApIGM9QUREOyovCisgICAgICAvKmlmKGM9PVNVQklGUCkgYz1TVUI7Ki8KKworCisgICAgICBpZihjPT1NSU5VUyl7CisJaWYoaXNhY2MocTEpJiZpc2FjYyh6KSl7CisJICBlbWl0KGYsIlx0ZW9yXHQjMjU1XG4iKTsKKwkgIGlmKGMwMiYmSVNDSEFSKHQpKXsKKwkgICAgZW1pdChmLCJcdGluYVxuIik7CisJICB9ZWxzZXsKKwkgICAgZW1pdChmLCJcdGNsY1xuIik7CisJICAgIGVtaXQoZiwiXHRhZGNcdCMxXG4iKTsKKwkgIH0KKwkgIGlmKCFJU0NIQVIodCkpeworCSAgICBlbWl0KGYsIlx0cGhhXG4iKTsKKwkgICAgZW1pdChmLCJcdHR4YVxuIik7CisJICAgIGVtaXQoZiwiXHRlb3JcdCMyNTVcbiIpOworCSAgICBlbWl0KGYsIlx0YWRjXHQjMFxuIik7CisJICAgIGVtaXQoZiwiXHR0YXhcbiIpOworCSAgICBlbWl0KGYsIlx0cGxhXG4iKTsKKwkgIH0KKwkgIGNvbnRpbnVlOworCX0KKwlwLT5jb2RlPWM9U1VCOworCXAtPnEyPXAtPnExOworCXAtPnExLmZsYWdzPUtPTlNUOworCXAtPnExLmFtPTA7CisJZ3ZhbC52bWF4PVowOworCWV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKKwlpbnNlcnRfY29uc3QoJnAtPnExLnZhbCx0KTsKKyAgICAgIH0KKworICAgICAgcHJlbG9hZChmLHApOworCisgICAgICBpZigoYz09QUREfHxjPT1TVUJ8fGM9PUFEREkyUHx8Yz09U1VCSUZQKSYmY29tcGFyZV9vYmplY3RzKCZwLT5xMSwmcC0+eikmJighaW5kaXJlY3QoJnAtPnExKXx8KGlzcmVnKHExKSYmSVNJRFgocC0+cTEucmVnKSkpJiZpc2NvbnN0KHEyKSYmIWlzYWNjKHopKXsKKwlsb25nIGw7CisJZXZhbF9jb25zdCgmcC0+cTIudmFsLHEydHlwKHApKTsKKwlsPXptMmwodm1heCk7CisJaWYoYz09QURESTJQLyomJih0MiZOUSk9PVBPSU5URVIqLykge2M9QUREO3Q9VU5TSUdORUR8SU5UO30KKwlpZihjPT1TVUJJRlAvKiYmKHQyJk5RKT09UE9JTlRFUiovKSB7Yz1TVUI7dD1VTlNJR05FRHxJTlQ7fQorCWlmKGM9PVNVQnx8Yz09U1VCSUZQKSBsPS1sOworCS8qVE9ETzogYWxsb3cgbGFyZ2VyIHR5cGVzICovCisJaWYobDwzJiZsPi0zJiYodCZOUSk8PUlOVCl7CisJICBpZihsPDApeworCSAgICBpZighYzAyfHwhaXNyZWcocTEpKSBnZXRfYWNjKGYscCxDSEFSKTsKKwkgICAgaW5jbWVtKGYsJnAtPnosdCxTVUIsLWwpOworCSAgfWVsc2UKKwkgICAgaW5jbWVtKGYsJnAtPnosdCxBREQsbCk7CisJICBjb250aW51ZTsKKwl9CisJaWYoSVNMT05HKHQpJiYoKG02NSYmbGFicyhsKTwzKXx8KG9wdHNwZWVkJiZsPjAmJmw8NCl8fChsPjAmJmw8MikpKXsKKwkgIGlmKGw8MCl7CisJICAgIGluY21lbShmLCZwLT56LHQsU1VCLC1sKTsKKwkgIH1lbHNlCisJICAgIGluY21lbShmLCZwLT56LHQsQURELGwpOworCSAgY29udGludWU7CisJfQorICAgICAgfQorCisgICAgICBpZihtNjUmJmhhbmRsZV9tNjUoZixwKSkKKwljb250aW51ZTsKKworICAgICAgaWYoYz09Q09OVkVSVCl7CisJaW50IHRvPXExdHlwKHApJk5VOworCXQmPU5VOworCWlmKElTQ0hBUih0KSl7CisJICBpZighaXNhY2MocTEpKQorCSAgICBnZXRfYWNjKGYscCxDSEFSKTsKKwkgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHRvKTsKKwkgIHN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCSAgY29udGludWU7CisJfQorCWlmKElTTE9ORyh0bykpeworCSAgaWYoIWlzYWNjKHopKQorCSAgICBnZXRfYWNjKGYscCxDSEFSKTsKKwkgIGlmKHptMmwoc2l6ZXRhYlt0Jk5RXSk9PTMpeworCSAgICBkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSx0byk7CisJICAgIGRvX2J5dGUzKGYsInN0YSIsJnAtPnosdCk7CisJICB9CisJICBpZih6bTJsKHNpemV0YWJbdCZOUV0pPj0yKXsKKwkgICAgaWYoaXNhY2MoeikmJiFpbmRpcmVjdCgmcC0+cTEpKXsKKwkgICAgICBkb19oaWJ5dGUoZiwibGR4IiwmcC0+cTEsdG8pOworCSAgICB9ZWxzZXsKKwkgICAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0byk7CisJICAgICAgc3RvcmVfaGlieXRlKGYsJnAtPnosdCk7CisJICAgIH0KKwkgIH0KKwkgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHRvKTsKKwkgIHN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCSAgY29udGludWU7CisJfQorCWlmKElTU0hPUlQodG8pKXsKKwkgIGlmKCh0JlVOU0lHTkVEKXx8SVNGUE9JTlRFUih0KSkKKwkgICAgZ2V0X2FjYyhmLHAsQ0hBUik7CisJICBlbHNlCisJICAgIGdldF9hY2MoZixwLFNIT1JUKTsKKwkgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHRvKTsKKwkgIHN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCSAgbG9hZF9oaWJ5dGUoZiwmcC0+cTEsdG8pOworCSAgc3RvcmVfaGlieXRlKGYsJnAtPnosdCk7CisJICBpZihJU0ZQT0lOVEVSKHQpKXsKKwkgICAgaW50IGI9LTE7CisJICAgIGlmKChwLT5xMS5mbGFncyYoVkFSQURSfERSRUZPQkopKT09VkFSQURSKSBiPWJhbmsocC0+cTEudik7CisJICAgIGVtaXQoZiwiXHRsZGFcdCMlZFxuIixiPj0wP2I6YmFua2NudW0pOworCSAgICBkb19ieXRlMyhmLCJzdGEiLCZwLT56LHQpOworCSAgICBjb250aW51ZTsKKwkgIH0KKwkgIGlmKHRvJlVOU0lHTkVEKXsKKwkgICAgaWYoenplcm8mJiFpbmRpcmVjdCgmcC0+eikpeworCSAgICAgIGRvX2J5dGUzKGYsInN0eiIsJnAtPnosdCk7CisJICAgICAgZG9fYnl0ZTQoZiwic3R6IiwmcC0+eix0KTsKKwkgICAgfWVsc2V7CisJICAgICAgZW1pdChmLCJcdGxkYVx0IzBcbiIpOworCSAgICAgIGRvX2J5dGUzKGYsInN0YSIsJnAtPnosdCk7CisJICAgICAgZG9fYnl0ZTQoZiwic3RhIiwmcC0+eix0KTsKKwkgICAgfQorCSAgfWVsc2V7CisJICAgIGVtaXQoZiwiXHRsZHhcdCMwXG4iKTsKKwkgICAgZW1pdChmLCJcdGNtcFx0IzBcbiIpOworCSAgICBlbWl0KGYsIlx0YnBsXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgICAgZW1pdChmLCJcdGRleFxuIik7CisJICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgICAgaWYoaW5kaXJlY3QoJnAtPnopKXsKKwkgICAgICBlbWl0KGYsIlx0dHhhXG4iKTsKKwkgICAgICBkb19ieXRlMyhmLCJzdGEiLCZwLT56LHQpOworCSAgICAgIGRvX2J5dGU0KGYsInN0YSIsJnAtPnosdCk7CisJICAgIH1lbHNleworCSAgICAgIGRvX2J5dGUzKGYsInN0eCIsJnAtPnosdCk7CisJICAgICAgZG9fYnl0ZTQoZiwic3R4IiwmcC0+eix0KTsKKwkgICAgfQorCSAgfQorCSAgY29udGludWU7CisJfQorCWlmKElTQ0hBUih0bykpeworCSAgaWYodG8mVU5TSUdORUQpeworCSAgICBjaGFyICpzOworCSAgICBnZXRfYWNjKGYscCxDSEFSKTsKKwkgICAgaWYoaXNyZWcocTEpJiZwLT5xMS5yZWc9PXJ4JiYhaW5kaXJlY3QoJnAtPnopKXsKKwkgICAgICBkb19sb2J5dGUoZiwic3R4IiwmcC0+eixDSEFSKTsKKwkgICAgfWVsc2V7CisJICAgICAgbG9hZF9sb2J5dGUoZiwmcC0+cTEsdG8pOworCSAgICAgIHN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCSAgICB9CisJICAgIGlmKGlzYWNjKHopKXsKKwkgICAgICBlbWl0KGYsIlx0bGR4XHQjMFxuIik7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgICAgaWYoenplcm8mJiFpbmRpcmVjdCgmcC0+eikpCisJICAgICAgcz0ic3R6IjsKKwkgICAgZWxzZXsKKwkgICAgICBlbWl0KGYsIlx0bGRhXHQjMFxuIik7CisJICAgICAgcz0ic3RhIjsKKwkgICAgfQorCSAgICBkb19oaWJ5dGUoZixzLCZwLT56LHQpOworCSAgICBpZihJU0xPTkcodCkpeworCSAgICAgIGRvX2J5dGUzKGYscywmcC0+eix0KTsKKwkgICAgICBkb19ieXRlNChmLHMsJnAtPnosdCk7CisJICAgIH0KKwkgIH1lbHNleworCSAgICBpbnQgbD0rK2xhYmVsOworCSAgICBnZXRfYWNjKGYscCxTSE9SVCk7CisJICAgIGVtaXQoZiwiXHRsZHhcdCMwXG4iKTsKKwkgICAgaWYoaXNyZWcocTEpJiZwLT5xMS5yZWc9PXJhKQorCSAgICAgIGVtaXQoZiwiXHRjbXBcdCMwXG4iKTsKKwkgICAgZWxzZQorCSAgICAgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHRvKTsKKwkgICAgZW1pdChmLCJcdGJwbFx0JXMlZFxuIixsYWJwcmVmaXgsbGFiZWwpOworCSAgICBlbWl0KGYsIlx0ZGV4XG4iKTsKKwkgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwpOworCSAgICBzdG9yZV9sb2J5dGUoZiwmcC0+eix0KTsKKwkgICAgaWYoaW5kaXJlY3QoJnAtPnopJiYoIWlzcmVnKHopfHxwLT56LnJlZyE9cmF4KSl7CisJICAgICAgZW1pdChmLCJcdHR4YVxuIik7CisJICAgICAgc3RvcmVfaGlieXRlKGYsJnAtPnosdCk7CisJICAgICAgaWYoSVNMT05HKHQpKXsKKwkJZG9fYnl0ZTMoZiwic3RhIiwmcC0+eix0KTsKKwkJZG9fYnl0ZTQoZiwic3RhIiwmcC0+eix0KTsKKwkgICAgICB9CisJICAgIH1lbHNleworCSAgICAgIGlmKCFpc3JlZyh6KXx8cC0+ei5yZWchPXJheCl7CisJCWVtaXQoZiwiXHRzdHhcdCIpOworCQllbWl0X2hpYnl0ZShmLCZwLT56LHQpOworCQllbWl0KGYsIlxuIik7CisJICAgICAgfQorCSAgICAgIGlmKElTTE9ORyh0KSl7CisJCWRvX2J5dGUzKGYsInN0eCIsJnAtPnosdCk7CisJCWRvX2J5dGU0KGYsInN0eCIsJnAtPnosdCk7CisJICAgICAgfQorCSAgICB9CisJICB9CisJICBpZihJU0ZQT0lOVEVSKHQpKXsKKwkgICAgZW1pdChmLCJcdGxkYVx0IyVkXG4iLGNiYW5rPj0wP2NiYW5rOmJhbmtjbnVtKTsKKwkgICAgZG9fYnl0ZTMoZiwic3RhIiwmcC0+eix0KTsKKwkgIH0KKwkgIGNvbnRpbnVlOworCX0KKwlpZihJU0ZQT0lOVEVSKHRvKSl7CisJICBnZXRfYWNjKGYscCxDSEFSKTsKKwkgIGlmKHptMmwoc2l6ZXRhYlt0Jk5RXSk+PTMpeworCSAgICBkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSx0byk7CisJICAgIGRvX2J5dGUzKGYsInN0YSIsJnAtPnosdCk7CisJICB9CisJICBpZih6bTJsKHNpemV0YWJbdCZOUV0pPj0yKXsKKwkgICAgbG9hZF9oaWJ5dGUoZiwmcC0+cTEsdG8pOworCSAgICBzdG9yZV9oaWJ5dGUoZiwmcC0+eix0KTsKKwkgIH0KKwkgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHRvKTsKKwkgIHN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCisJICBjb250aW51ZTsKKwl9CisJcHJpYzIoc3Rkb3V0LHApOworCWllcnJvcigwKTsKKyAgICAgIH0KKworICAgICAgaWYoYz09S09NUExFTUVOVCl7CisJZ2V0X2FjYyhmLHAsQ0hBUik7CisJaWYoSVNDSEFSKHQpKXsKKwkgIGxvYWRfYWNjKGYsJnAtPnExLHQpOworCSAgZW1pdChmLCJcdGVvclx0Iy0xXG4iKTsKKwkgIHN0b3JlX2FjYyhmLCZwLT56LHQpOworCX1lbHNleworCSAgaWYoaXNhY2MocTEpKQorCSAgICBlbWl0KGYsIlx0cGhhXG4iKTsKKwkgIGlmKElTTE9ORyh0KSl7CisJICAgIGRvX2J5dGU0KGYsImxkYSIsJnAtPnExLHQpOworCSAgICBlbWl0KGYsIlx0ZW9yXHQjLTFcbiIpOworCSAgICBkb19ieXRlNChmLCJzdGEiLCZwLT56LHQpOworCSAgICBkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgZW1pdChmLCJcdGVvclx0Iy0xXG4iKTsKKwkgICAgZG9fYnl0ZTMoZiwic3RhIiwmcC0+eix0KTsKKwkgIH0KKwkgIGxvYWRfaGlieXRlKGYsJnAtPnExLHQpOworCSAgZW1pdChmLCJcdGVvclx0Iy0xXG4iKTsKKwkgIHN0b3JlX2hpYnl0ZShmLCZwLT56LHQpOworCSAgaWYoaXNhY2MocTEpKQorCSAgICBlbWl0KGYsIlx0cGxhXG4iKTsKKwkgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgZW1pdChmLCJcdGVvclx0Iy0xXG4iKTsKKwkgIHN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCX0KKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PVNFVFJFVFVSTil7CisJaGFzcmV0dmFsPTE7CisJdCY9TlE7CisJaWYoaXNyZWcocTEpJiZwLT5xMS5yZWc9PXAtPnoucmVnKSBjb250aW51ZTsKKwlpZih0PT1MT05HfHx0PT1MTE9OR3x8SVNGTE9BVCh0KXx8SVNGUE9JTlRFUih0KSl7CisJICBsb25nIGw9em0ybChwLT5xMi52YWwudm1heCk7CisJICBpbnQgenI9cC0+ei5yZWc7CisJICAvL2dldF9hY2MoZixwLHQpOworCSAgaWYoKG9wdHNpemV8fGw+NCkmJiFJU0ZQT0lOVEVSKHQpKXsKKwkgICAgaW50IGluZD1pbmRpcmVjdCgmcC0+cTEpOworCSAgICBpZihpbmQpIGxvYWRfYWRkcmVzcyhmLExBU1RfUEFJUiwmcC0+cTEsdCk7CisJICAgIEJTRVQocmVndXNlZCx0Myk7CisJICAgIEJTRVQocmVndXNlZCx0NCk7CisJICAgIHNldHkoZixsLTEpOworCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgICAgaWYoaW5kKQorCSAgICAgIGVtaXQoZiwiXHRsZGFcdCglcykseVxuIixtcmVnbmFtZXNbTEFTVF9QQUlSXSk7CisJICAgIGVsc2V7CisJICAgICAgZW1pdChmLCJcdGxkYVx0Iik7CisJICAgICAgaWYoIUlTRkxPQVQodCkmJihwLT5xMS5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisJCWVtaXQoZiwiJXMlZCIsbGFicHJlZml4LGFkZGZwY29uc3QoJnAtPnExLHQpKTsKKwkgICAgICB9ZWxzZQorCQllbWl0X29iaihmLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIix5XG4iKTsKKwkgICAgfQorCSAgICBlbWl0KGYsIlx0c3RhXHQlcyx5XG4iLG1yZWduYW1lc1t6cl0pOworCSAgICBlbWl0KGYsIlx0ZGV5XG4iKTsKKwkgICAgZW1pdChmLCJcdGJwbFx0JXMlZFxuIixsYWJwcmVmaXgsbGFiZWwpOworCSAgICB5dmFsPTI1NTsKKwkgIH1lbHNleworCSAgICBpZigocC0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikpeworCSAgICAgIGlmKHAtPnExLnJlZz09enIpeworCQlpbnQgcj1nZXRfcmVnKGYscCxQT0lOVEVSKTsKKwkJaWYocj09RklSU1RfUEFJUnx8cj09RklSU1RfUEFJUisxKQorCQkgIGllcnJvcigwKTsKKwkJaWYoIXJlZ19wYWlyKHIsJnJwMikpIGllcnJvcigwKTsKKwkJZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3pyXSk7CisJCWVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycDIucjFdKTsKKwkJZW1pdChmLCJcdGxkYVx0JXMrMVxuIixtcmVnbmFtZXNbenJdKTsKKwkJZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwMi5yMl0pOworCQlwLT5xMS5yZWc9cjsKKwkgICAgICB9CisJICAgIH0KKwkgICAgbG9hZF9sb2J5dGUoZiwmcC0+cTEsdCk7CisJICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1t6cl0pOworCSAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgZW1pdChmLCJcdHN0YVx0JXMrMVxuIixtcmVnbmFtZXNbenJdKTsKKwkgICAgZG9fYnl0ZTMoZiwibGRhIiwmcC0+cTEsdCk7CisJICAgIGVtaXQoZiwiXHRzdGFcdCVzKzJcbiIsbXJlZ25hbWVzW3pyXSk7CisJICAgIGlmKCFJU0ZQT0lOVEVSKHQpKXsKKwkgICAgICBkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlcyszXG4iLG1yZWduYW1lc1t6cl0pOworCSAgICB9CisJICAgIC8qVE9ETzpyZWd1c2VkIE9MREZQICovCisJICAgIHJlZ3VzZWRbenJdPTE7CisJICB9CisJICBjb250aW51ZTsKKwl9CisJLy9nZXRfYWNjKGYscCx0KTsKKwlsb2FkX2FjYyhmLCZwLT5xMSx0KTsKKwlyZWd1c2VkW3JhXT0xOworCXJlZ3VzZWRbcnhdPTE7CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZihjPT1HRVRSRVRVUk4peworCXQmPU5ROworCWlmKGlzcmVnKHopJiZwLT5xMS5yZWc9PXAtPnoucmVnKSBjb250aW51ZTsKKwlpZih0PT1MT05HfHx0PT1MTE9OR3x8SVNGTE9BVCh0KXx8SVNGUE9JTlRFUih0KSl7CisJICBsb25nIGw9em0ybChwLT5xMi52YWwudm1heCk7CisJICBpbnQgcXI9cC0+cTEucmVnOworCSAgaWYoKG9wdHNpemV8fGw+NCkmJiFJU0ZQT0lOVEVSKHQpKXsKKwkgICAgaW50IGluZD1pbmRpcmVjdCgmcC0+eik7CisJICAgIGlmKGluZCkgbG9hZF9hZGRyZXNzKGYsTEFTVF9QQUlSLCZwLT56LHQpOworCSAgICBCU0VUKHJlZ3VzZWQsdDMpOworCSAgICBCU0VUKHJlZ3VzZWQsdDQpOworCSAgICBzZXR5KGYsbC0xKTsKKwkgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICAgIGVtaXQoZiwiXHRsZGFcdCVzLHlcbiIsbXJlZ25hbWVzW3FyXSk7CisJICAgIGlmKGluZCkKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQoJXMpLHlcbiIsbXJlZ25hbWVzW0xBU1RfUEFJUl0pOworCSAgICBlbHNleworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCIpOworCSAgICAgIGVtaXRfb2JqKGYsJnAtPnosdCk7CisJICAgICAgZW1pdChmLCIseVxuIik7CisJICAgIH0KKwkgICAgZW1pdChmLCJcdGRleVxuIik7CisJICAgIGVtaXQoZiwiXHRicGxcdCVzJWRcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgICAgeXZhbD0yNTU7CisJICB9ZWxzZXsKKwkgICAgaWYoKHAtPnoucmVnJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopKXsKKwkgICAgICBpZihwLT56LnJlZz09cXIpIGllcnJvcigwKTsKKwkgICAgfQorCSAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcXJdKTsKKwkgICAgc3RvcmVfbG9ieXRlKGYsJnAtPnosdCk7CisJICAgIGVtaXQoZiwiXHRsZGFcdCVzKzFcbiIsbXJlZ25hbWVzW3FyXSk7CisJICAgIHN0b3JlX2hpYnl0ZShmLCZwLT56LHQpOworCSAgICBlbWl0KGYsIlx0bGRhXHQlcysyXG4iLG1yZWduYW1lc1txcl0pOworCSAgICBkb19ieXRlMyhmLCJzdGEiLCZwLT56LHQpOworCSAgICBpZighSVNGUE9JTlRFUih0KSl7CisJICAgICAgZW1pdChmLCJcdGxkYVx0JXMrM1xuIixtcmVnbmFtZXNbcXJdKTsKKwkgICAgICBkb19ieXRlNChmLCJzdGEiLCZwLT56LHQpOworCSAgICB9CisJICB9CisJICBjb250aW51ZTsKKwl9CisJaWYocC0+cTEucmVnKQorCSAgc3RvcmVfYWNjKGYsJnAtPnosdCk7CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZihjPT1DQUxMKXsKKwlpbnQgcmVnOworCisJaWYoYXJnc2l6ZTx6bTJsKHAtPnEyLnZhbC52bWF4KSkgYXJnc2l6ZT16bTJsKHAtPnEyLnZhbC52bWF4KTsKKworCS8qRklYTUUqLworI2lmIDAgICAgICAKKwlpZihzdGFja192YWxpZCYmKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJnAtPnExLnYtPmZpJiYocC0+cTEudi0+ZmktPmZsYWdzJkFMTF9TVEFDSykpeworCSAgaWYoZnJhbWVzaXplK3p1bTJ1bChwLT5xMS52LT5maS0+c3RhY2sxKT5zdGFjaykKKwkgICAgc3RhY2s9ZnJhbWVzaXplK3p1bTJ1bChwLT5xMS52LT5maS0+c3RhY2sxKTsKKwl9ZWxzZQorCSAgc3RhY2tfdmFsaWQ9MDsKKyNlbmRpZgorCWlmKChwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiYhc3RyY21wKCJfX3ZhX3N0YXJ0IixwLT5xMS52LT5pZGVudGlmaWVyKSl7CisJICBsb25nIG9mPXZhX29mZnNldCh2KStsb2NhbHNpemUrcnNhdmVzaXplK2FyZ3NpemU7CisJICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbZnBdKTsKKwkgIGlmKG9mKXsKKwkgICAgZW1pdChmLCJcdGNsY1xuIik7CisJICAgIGlmKG9mJjI1NSkKKwkgICAgICBlbWl0KGYsIlx0YWRjXHQjJWRcbiIsKG9mJjI1NSkpOworCSAgfQorCSAgZW1pdChmLCJcdGxkeFx0JXMrMVxuIixtcmVnbmFtZXNbZnBdKTsKKwkgIGlmKG9mJjB4ZmYwMCl7CisJICAgIGVtaXQoZiwiXHRwaGFcbiIpOworCSAgICBlbWl0KGYsIlx0dHhhXG4iKTsKKwkgICAgZW1pdChmLCJcdGFkY1x0IyVkXG4iLChvZj4+OCkmMjU1KTsKKwkgICAgZW1pdChmLCJcdHRheFxuIik7CisJICAgIGVtaXQoZiwiXHRwbGFcbiIpOworCSAgfWVsc2UgaWYob2YpeworCSAgICBlbWl0KGYsIlx0YmNjXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgICAgZW1pdChmLCJcdGlueFxuIik7CisJICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgIH0KKwkgIGNvbnRpbnVlOworCX0KKwlpZigocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmcC0+cTEudi0+ZmkmJnAtPnExLnYtPmZpLT5pbmxpbmVfYXNtKXsKKwkgIGVtaXQoZiwiO3N0YXJ0aW5saW5lXG4iKTsKKwkgIGVtaXRfaW5saW5lX2FzbShmLHAtPnExLnYtPmZpLT5pbmxpbmVfYXNtKTsKKwkgIGVtaXQoZiwiO2VuZGlubGluZVxuIik7CisJfWVsc2UgaWYocC0+cTEuZmxhZ3MmRFJFRk9CSil7CisJICBpZihJU0ZQT0lOVEVSKHAtPnExLmR0eXApKXsKKwkgICAgcC0+cTEuZmxhZ3MmPX5EUkVGT0JKOworCSAgICBsb2FkX3JlZyhmLExBU1RfUEFJUiwmcC0+cTEsUE9JTlRFUik7CisJICAgIGlmKGluZGlyZWN0KCZwLT5xMSkpeworCSAgICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLEZQT0lOVEVSKTsKKwkgICAgICBlbWl0KGYsIlx0dGF5XG4iKTsKKwkgICAgfWVsc2UKKwkgICAgICBkb19ieXRlMyhmLCJsZHkiLCZwLT5xMSxGUE9JTlRFUik7CisJICAgIGVtaXQoZiwiXHRsZGFcdCMlZFxuIixjYmFuaz49MD9jYmFuazpiYW5rY251bSk7CisJICAgIGVtaXQoZiwiXHRqc3JcdCVzX19iYW5ranNyXG4iLGlkcHJlZml4KTsKKwkgICAgeXZhbD1OT1ZBTDsKKwkgIH1lbHNleworCSAgICBpZighKHAtPnExLmZsYWdzJlJFRykpIGllcnJvcigwKTsKKwkgICAgZW1pdChmLCJcdGpzclx0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICAgIHl2YWw9Tk9WQUw7CisJICAgIGFkZF9jbXBsaXN0KGxhYmVsLHAtPnExLnJlZyxKTVBJTkQpOworCSAgfQorCX1lbHNleworCSAgaW50IHRiYW5rPS0xOworCSAgaWYocC0+cTEuZmxhZ3MmVkFSKSB0YmFuaz1iYW5rKHAtPnExLnYpOworCSAgaWYodGJhbmshPWNiYW5rJiZ0YmFuaz49MCl7CisJICAgIGlmKGNiYW5rPj0wKXsKKwkgICAgICBsb2FkX2FkZHJlc3MoZixMQVNUX1BBSVIsJnAtPnExLHQpOworCSAgICAgIHNldHkoZix0YmFuayk7CisJICAgICAgZW1pdChmLCJcdGxkYVx0IyVkXG4iLGNiYW5rKTsKKwkgICAgICBlbWl0KGYsIlx0anNyXHQlc19fYmFua2pzclxuIixpZHByZWZpeCk7CisJICAgICAgeXZhbD1OT1ZBTDsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgICBzZXR5KGYsdGJhbmspOworCSAgICBlbWl0KGYsIlx0anNyXHQlc19fYmFua3N3aXRjaFxuIixpZHByZWZpeCk7CisJICAgIHl2YWw9Tk9WQUw7CisJICB9CisJICBpZigocC0+cTEuZmxhZ3MmVkFSKSYmIXN0cmNtcChwLT5xMS52LT5pZGVudGlmaWVyLCJfZm1lbWNweSIpKQorCSAgICBlbWl0KGYsIlx0bGRhXHQjJWRcbiIsY2Jhbms+PTA/Y2Jhbms6YmFua2NudW0pOworCSAgZW1pdChmLCJcdGpzclx0Iik7CisJICBlbWl0X29iaihmLCZwLT5xMSx0KTsKKwkgIGVtaXQoZiwiXG4iKTsKKwl9CisJcHVzaGVkLT16bTJsKHAtPnEyLnZhbC52bWF4KTsKKwlpZighY2FsY19yZWdzKHAsZiE9MCkmJnYtPmZpKSB2LT5maS0+ZmxhZ3MmPX5BTExfUkVHUzsKKwl5dmFsPU5PVkFMOworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoYz09QVNTSUdOfHxjPT1QVVNIKXsKKwlpZih0PT0wKSBpZXJyb3IoMCk7CisJaWYoKHAtPnExLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUJiYodCZOUSk9PUxMT05HKXsKKwkgIGludCBpOworCSAgZXZhbF9jb25zdCgmcC0+cTEudmFsLHQpOworCSAgZm9yKGk9MDtpPDg7aSsrKXsKKwkgICAgZW1pdChmLCJcdGxkYVx0IyVkXG4iLHptMmwodm1heCkmMjU1KTsKKwkgICAgdm1heD16bXJzaGlmdCh2bWF4LGwyem0oOEwpKTsKKwkgICAgaWYoYz09UFVTSHx8KHAtPnouZmxhZ3MmRFJFRk9CSikpeworCSAgICAgIHNldHkoZixpKygoYz09UFVTSCk/cHVzaGVkOjApKTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQoJXMpLHlcbiIsKGM9PVBVU0gpP21yZWduYW1lc1tzcF06bXJlZ25hbWVzW3AtPnoucmVnXSk7CisJICAgIH1lbHNleworCSAgICAgIHAtPnoudmFsLnZtYXg9em1hZGQocC0+ei52YWwudm1heCxsMnptKChsb25nKWkpKTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQiKTsKKwkgICAgICBlbWl0X2xvYnl0ZShmLCZwLT56LHQpOworCSAgICAgIGVtaXQoZiwiXG4iKTsKKwkgICAgICBwLT56LnZhbC52bWF4PXptc3ViKHAtPnoudmFsLnZtYXgsbDJ6bSgobG9uZylpKSk7CisJICAgIH0KKwkgIH0KKwkgIGlmKGM9PVBVU0gpIHB1c2hlZCs9ODsKKwkgIGNvbnRpbnVlOworCX0gIAorCisJaWYoIXptbGVxKHAtPnEyLnZhbC52bWF4LGwyem0oNEwpKSl7CisJICBsb25nIGxlbj16bTJsKHAtPnEyLnZhbC52bWF4KTsKKwkgIGludCByMSxyMixsb29wcyxsb29wbGFiOworCSAgaWYobGVuPjMyNzY3KSBpZXJyb3IoMCk7CisJICBpZighTk9CQU5LVkFSUyl7CisJICAgIGludCBicT0tMSxiej0tMSxzPS0xOworCSAgICBpZigocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUikgYnE9YmFuayhwLT5xMS52KTsKKwkgICAgaWYoKHAtPnouZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUikgYno9YmFuayhwLT56LnYpOworCSAgICBpZigoKHAtPnExLmZsYWdzJkRSRUZPQkopJiZJU0ZQT0lOVEVSKHAtPnExLmR0eXApKXx8CisJICAgICAgICgocC0+ei5mbGFncyZEUkVGT0JKKSYmSVNGUE9JTlRFUihwLT56LmR0eXApKSl7CisJICAgICAgZmFyX2NvcHkoZixwKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgICBpZihjYmFuazwwKXsKKwkgICAgICBpZihicT49MCYmYno+PTApeworCQlpZihicSE9YnopeworCQkgIGZhcl9jb3B5KGYscCk7CisJCSAgY29udGludWU7CisJCX0KKwkJcz1icTsKKwkgICAgICB9ZWxzZXsKKwkJaWYoYnE+PTApIHM9YnE7CisJCWlmKGJ6Pj0wKSBzPWJ6OworCSAgICAgIH0KKwkgICAgICBpZihzPj0wKXsKKwkJc2V0eShmLHMpOworCQllbWl0KGYsIlx0anNyXHQlc19fYmFua3N3aXRjaFxuIixpZHByZWZpeCk7CisJCXl2YWw9Tk9WQUw7CisJICAgICAgfQorCSAgICB9ZWxzZXsKKwkgICAgICBpZigoYnE+PTAmJmJxIT1jYmFuayl8fChiej49MCYmYnohPWNiYW5rKSl7CisJCWZhcl9jb3B5KGYscCk7CisJCWNvbnRpbnVlOworCSAgICAgIH0KKwkgICAgfQorCSAgfQorCSAgZ2V0X2FjYyhmLHAsQ0hBUik7CisJICBpZigocC0+cTEuZmxhZ3MmKERSRUZPQkp8S09OU1QpKT09RFJFRk9CSil7CisJICAgIGlmKHAtPnExLmZsYWdzJlJFRyl7CisJICAgICAgcjE9cC0+cTEucmVnOworCSAgICAgIGlmKCFyZWdfcGFpcihyMSwmcnApKSBpZXJyb3IoMCk7CisJICAgICAgaWYobGVuPjEyOCl7CisJCWVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMV0pOworCQllbWl0KGYsIlx0Y2xjXG4iKTsKKwkJaWYobGVuJjEyOCkKKwkJICBlbWl0KGYsIlx0YWRjXHQjMTI4XG4iKTsKKwkJZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisJCWlmKGxlbj4yNTUpeworCQkgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworCQkgIGVtaXQoZiwiXHRhZGNcdCMlbGRcbiIsKGxlbj4+OCkmMjU1KTsKKwkJICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsJCisJCX1lbHNleworCQkgIGVtaXQoZiwiXHRiY2NcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCQkgIGVtaXQoZiwiXHRpbmNcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworCQkgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkJfQorCSAgICAgIH0KKwkgICAgfWVsc2UKKwkgICAgICBpZXJyb3IoMCk7CisJICB9ZWxzZSBpZighaW5kaXJlY3QoJnAtPnExKSYmbGVuPD0xMjgmJihwLT5xMS5mbGFncyYoRFJFRk9CSnxLT05TVCkpIT1LT05TVCl7CisJICAgIHIxPTA7CisJICB9ZWxzZXsKKwkgICAgVmFyICp2PXAtPnExLnY7CisJICAgIC8qaWYoKHAtPnExLmZsYWdzJihWQVJBRFJ8VkFSKSkhPVZBUikgaWVycm9yKDApOyovCisJICAgIC8qcHJpbnRmKCJsZW49JWxkICVsZFxuIixsZW4sbGVuJjB4ZmY4MCk7Ki8KKwkgICAgcjE9Z2V0X3JlZyhmLHAsUE9JTlRFUik7CisJICAgIGlmKGxlbj4xMjgpIHAtPnExLnZhbC52bWF4PXptYWRkKHAtPnExLnZhbC52bWF4LGwyem0oKGxlbi0xKSYweGZmODApKTsKKwkgICAgbG9hZF9hZGRyZXNzKGYscjEsJnAtPnExLHQpOworCSAgICBpZihsZW4+MTI4KSBwLT5xMS52YWwudm1heD16bXN1YihwLT5xMS52YWwudm1heCxsMnptKChsZW4tMSkmMHhmZjgwKSk7CisJICB9CisJICBpZigocC0+ei5mbGFncyYoRFJFRk9CSnxLT05TVCkpPT1EUkVGT0JKKXsKKwkgICAgaWYocC0+ei5mbGFncyZSRUcpeworCSAgICAgIHIyPXAtPnoucmVnOworCSAgICAgIGlmKCFyZWdfcGFpcihyMiwmcnApKSBpZXJyb3IoMCk7CisJICAgICAgaWYobGVuPjEyOCl7CisJCWVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMV0pOworCQllbWl0KGYsIlx0Y2xjXG4iKTsKKwkJaWYobGVuJjEyOCkKKwkJICBlbWl0KGYsIlx0YWRjXHQjMTI4XG4iKTsKKwkJZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisJCWlmKGxlbj4yNTUpeworCQkgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworCQkgIGVtaXQoZiwiXHRhZGNcdCMlbGRcbiIsKGxlbj4+OCkmMjU1KTsKKwkJICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsJCisJCX1lbHNleworCQkgIGVtaXQoZiwiXHRiY2NcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCQkgIGVtaXQoZiwiXHRpbmNcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworCQkgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkJfQorCSAgICAgIH0KKwkgICAgfWVsc2UKKwkgICAgICBpZXJyb3IoMCk7CisJICB9ZWxzZSBpZihjPT1QVVNIKXsKKwkgICAgaWYobGVuPD0xMjgmJnB1c2hlZD09MCl7CisJICAgICAgcjI9c3A7CisJICAgIH1lbHNleworCSAgICAgIHIyPWdldF9yZWcoZixwLFBPSU5URVIpOworCSAgICAgIGlmKCFyZWdfcGFpcihyMiwmcnApKSBpZXJyb3IoMCk7CisJICAgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3NwXSk7CisJICAgICAgZW1pdChmLCJcdGNsY1xuIik7CisJICAgICAgaWYoKChwdXNoZWQrKGxlbiYxMjgpKSYyNTUpIT0wKQorCQllbWl0KGYsIlx0YWRjXHQjJWxkXG4iLChwdXNoZWQrKGxlbiYxMjgpKSYyNTUpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMV0pOworCSAgICAgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tzcDJdKTsKKwkgICAgICBlbWl0KGYsIlx0YWRjXHQjJWxkXG4iLCgocHVzaGVkK2xlbik+PjgpJjI1NSk7CisJICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIyXSk7CisJICAgIH0KKwkgIH1lbHNlIGlmKCFpbmRpcmVjdCgmcC0+eikmJmxlbjw9MTI4KXsKKwkgICAgcjI9MDsKKwkgIH1lbHNleworCSAgICBWYXIgKnY9cC0+ei52OworCSAgICByMj1nZXRfcmVnKGYscCxQT0lOVEVSKTsKKwkgICAgaWYobGVuPjEyOCkgcC0+ei52YWwudm1heD16bWFkZChwLT56LnZhbC52bWF4LGwyem0oKGxlbi0xKSYweGZmODApKTsKKwkgICAgbG9hZF9hZGRyZXNzKGYscjIsJnAtPnosdCk7CisJICAgIGlmKGxlbj4xMjgpIHAtPnoudmFsLnZtYXg9em1zdWIocC0+ei52YWwudm1heCxsMnptKChsZW4tMSkmMHhmZjgwKSk7CisJICB9CisJICBpZihsZW4+MTI4KXsKKwkgICAgZ2V0X2FjYyhmLHAsUE9JTlRFUik7IC8qIGdldCB4ICovCisJICAgIGVtaXQoZiwiXHRsZHhcdCMlbGRcbiIsKCgobGVuLTEyOCk+PjcpKzEpJjI1NSk7CisJICB9CisJICBzZXR5KGYsKGxlbi0xKSYxMjcpOworCSAgaWYoKG9wdHNpemUmJmxlbj40KXx8bGVuPjgpeworCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsb29wbGFiPSsrbGFiZWwpOworCSAgICBpZihvcHRzaXplKQorCSAgICAgIGxvb3BzPTE7CisJICAgIGVsc2V7CisJICAgICAgaWYoKGxlbiYzKT09MCkKKwkJbG9vcHM9NDsKKwkgICAgICBlbHNlIGlmKChsZW4mMSk9PTApCisJCWxvb3BzPTI7CisJICAgICAgZWxzZQorCQlsb29wcz0xOworCSAgICB9CisJICB9ZWxzZQorCSAgICBsb29wcz1sZW47CisJICBpZihyMSYmIXJlZ19wYWlyKHIxLCZycCkpIGllcnJvcigwKTsKKwkgIGlmKHIyJiYhcmVnX3BhaXIocjIsJnJwMikpIGllcnJvcigwKTsKKwkgIGZvcihpPTA7aTxsb29wcztpKyspeworCSAgICBpZihyMSkKKwkgICAgICBlbWl0KGYsIlx0bGRhXHQoJXMpLHlcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisJICAgIGVsc2V7CisJICAgICAgZW1pdChmLCJcdGxkYVx0Iik7CisJICAgICAgZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJICAgICAgZW1pdChmLCIseVxuIik7CisJICAgIH0KKwkgICAgaWYocjIpCisJICAgICAgZW1pdChmLCJcdHN0YVx0KCVzKSx5XG4iLG1yZWduYW1lc1tycDIucjFdKTsKKwkgICAgZWxzZXsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQiKTsKKwkgICAgICBlbWl0X29iaihmLCZwLT56LHQpOworCSAgICAgIGVtaXQoZiwiLHlcbiIpOworCSAgICB9CisJICAgIGVtaXQoZiwiXHRkZXlcbiIpOworCSAgfQorCSAgaWYobG9vcHMhPWxlbil7CisJICAgIGVtaXQoZiwiXHRicGxcdCVzJWRcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgIH0JICAKKwkgIGlmKGxlbj4xMjgpeworCSAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcnAucjFdKTsKKwkgICAgZW1pdChmLCJcdHNlY1xuIik7CisJICAgIGVtaXQoZiwiXHRzYmNcdCMxMjhcbiIpOworCSAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAucjFdKTsKKwkgICAgZW1pdChmLCJcdGJjc1x0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICAgIGVtaXQoZiwiXHRkZWNcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tycDIucjFdKTsKKwkgICAgZW1pdChmLCJcdHNlY1xuIik7CisJICAgIGVtaXQoZiwiXHRzYmNcdCMxMjhcbiIpOworCSAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAyLnIxXSk7CisJICAgIGVtaXQoZiwiXHRiY3NcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCSAgICBlbWl0KGYsIlx0ZGVjXHQlc1xuIixtcmVnbmFtZXNbcnAyLnIyXSk7CisJICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgICAgZW1pdChmLCJcdGxkeVx0IzEyN1xuIik7CisJICAgIGVtaXQoZiwiXHRkZXhcbiIpOworCSAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxsb29wbGFiKTsKKwkgIH0KKwkgIHl2YWw9Tk9WQUw7CisJICBpZihjPT1QVVNIKQorCSAgICBwdXNoZWQrPXptMmwocC0+cTIudmFsLnZtYXgpOworCSAgY29udGludWU7CisJfQorCWlmKGM9PVBVU0gpeworCSAgaWYoIXNjcmF0Y2gocC0+bmV4dCxyYSwxKSkKKwkgICAgZ2V0X2FjYyhmLHAsQ0hBUik7CisJICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0KTsKKwkgIGlmKHp6ZXJvJiZwdXNoZWQ9PTApeworCSAgICBlbWl0KGYsIlx0c3RhXHQoJXMpXG4iLG1yZWduYW1lc1tzcF0pOworCSAgfWVsc2V7CisJICAgIHNldHkoZixwdXNoZWQpOworCSAgICBlbWl0KGYsIlx0c3RhXHQoJXMpLHlcbiIsbXJlZ25hbWVzW3NwXSk7CisJICB9CisJICBpZighem1sZXEocC0+cTIudmFsLnZtYXgsWjEpKXsKKwkgICAgbG9hZF9oaWJ5dGUoZiwmcC0+cTEsdCk7CisJICAgIHNldHkoZixwdXNoZWQrMSk7CisJICAgIGVtaXQoZiwiXHRzdGFcdCglcykseVxuIixtcmVnbmFtZXNbc3BdKTsKKwkgIH0KKwkgIGlmKCF6bWxlcShwLT5xMi52YWwudm1heCxsMnptKDJMKSkpeworCSAgICBkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgc2V0eShmLHB1c2hlZCsyKTsKKwkgICAgZW1pdChmLCJcdHN0YVx0KCVzKSx5XG4iLG1yZWduYW1lc1tzcF0pOworCSAgfQorCSAgaWYoIXptbGVxKHAtPnEyLnZhbC52bWF4LGwyem0oM0wpKSl7CisJICAgIGRvX2J5dGU0KGYsImxkYSIsJnAtPnExLHQpOworCSAgICBzZXR5KGYscHVzaGVkKzMpOworCSAgICBlbWl0KGYsIlx0c3RhXHQoJXMpLHlcbiIsbXJlZ25hbWVzW3NwXSk7CisJICB9CisKKwkgIHB1c2hlZCs9em0ybChwLT5xMi52YWwudm1heCk7CisJICBjb250aW51ZTsKKwl9CisJaWYoYz09QVNTSUdOKXsKKwkgIGludCBjMm07dW5zaWduZWQgbG9uZyB2OworCSAgaWYoaXNyZWcocTEpJiZpc3JlZyh6KSYmcC0+cTEucmVnPT1wLT56LnJlZykgY29udGludWU7CisJICBpZihpc2FjYyhxMSkpeworCSAgICBpZihwLT5xMS5yZWc9PXJheCYmaW5kaXJlY3QoJnAtPnopKSBnZXRfYWNjKGYscCxDSEFSKTsKKwkgICAgc3RvcmVfYWNjKGYsJnAtPnosdCk7CisJICAgIGNvbnRpbnVlOworCSAgfQorCSAgaWYoenplcm8mJiFpbmRpcmVjdCgmcC0+eikmJihwLT5xMS5mbGFncyYoRFJFRk9CSnxLT05TVCkpPT1LT05TVCl7CisJICAgIGV2YWxfY29uc3QoJnAtPnExLnZhbCx0KTsKKwkgICAgaWYoSVNGTE9BVCh0KSl7CisJICAgICAgY252X2ZwKCk7CisJICAgICAgdj16dW0ydWwoem0yenVtKHZtYXgpKTsKKwkgICAgfWVsc2UKKwkgICAgICB2PXp1bTJ1bCh2dW1heCk7CisJICAgIGMybT0xOworCSAgfWVsc2UKKwkgICAgYzJtPTA7CisJICBpZighYzJtfHx2IT0wKQorCSAgICBnZXRfYWNjKGYscCxDSEFSKTsKKwkgIGlmKDAvKklTQ0hBUih0KSovKXsKKwkgICAgbG9hZF9hY2MoZiwmcC0+cTEsdCk7CisJICAgIHN0b3JlX2FjYyhmLCZwLT56LHQpOworCSAgfWVsc2V7CisJICAgIGlmKCF6bWxlcShwLT5xMi52YWwudm1heCxsMnptKDNMKSkpeworCSAgICAgIGlmKGMybSYmKHYmMHhGRjAwMDAwMCk9PTApeworCQlkb19ieXRlNChmLCJzdHoiLCZwLT56LHQpOworCSAgICAgIH1lbHNleworCQlkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkJZG9fYnl0ZTQoZiwic3RhIiwmcC0+eix0KTsKKwkgICAgICB9CisJICAgIH0KKwkgICAgaWYoIXptbGVxKHAtPnEyLnZhbC52bWF4LGwyem0oMkwpKSl7CisJICAgICAgaWYoYzJtJiYodiYweEZGMDAwMCk9PTApeworCQlkb19ieXRlMyhmLCJzdHoiLCZwLT56LHQpOworCSAgICAgIH1lbHNleworCQlkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSx0KTsKKwkJZG9fYnl0ZTMoZiwic3RhIiwmcC0+eix0KTsKKwkgICAgICB9CisJICAgIH0KKwkgICAgaWYoIXptbGVxKHAtPnEyLnZhbC52bWF4LGwyem0oMUwpKSl7CisJICAgICAgaWYoaXNyZWcoeikmJnAtPnoucmVnPT1yYXgmJiFpbmRpcmVjdCgmcC0+cTEpKXsKKwkJZG9faGlieXRlKGYsImxkeCIsJnAtPnExLHQpOworCSAgICAgIH1lbHNlIGlmKGMybSYmKHYmMHhGRjAwKT09MCl7CisJCWRvX2hpYnl0ZShmLCJzdHoiLCZwLT56LHQpOworCSAgICAgIH1lbHNleworCQlsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkJc3RvcmVfaGlieXRlKGYsJnAtPnosdCk7CisJICAgICAgfQorCSAgICB9CisJICAgIGlmKGMybSYmKHYmMHhGRik9PTApeworCSAgICAgIGRvX2xvYnl0ZShmLCJzdHoiLCZwLT56LHQpOworCSAgICB9ZWxzZXsKKwkgICAgICBpZihpc3JlZyhxMSkmJklTSURYKHAtPnExLnJlZykpeworCQlzdG9yZV9yZWcoZixwLT5xMS5yZWcsJnAtPnosQ0hBUik7CisJICAgICAgfWVsc2UgaWYoaXNyZWcoeikmJklTSURYKHAtPnoucmVnKSl7CisJCWxvYWRfcmVnKGYscC0+ei5yZWcsJnAtPnExLHQpOworCSAgICAgIH1lbHNleworCQlsb2FkX2xvYnl0ZShmLCZwLT5xMSx0KTsKKwkJc3RvcmVfbG9ieXRlKGYsJnAtPnosdCk7CisJICAgICAgfQorCSAgICB9CisJICB9CisJfQorCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoYz09QUREUkVTUyl7CisJbG9uZyBvPXJlYWxfb2Zmc2V0KCZwLT5xMSk7CisJZ2V0X2FjYyhmLHAsQ0hBUik7CisJZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW2ZwMV0pOworCWlmKG8peworCSAgZW1pdChmLCJcdGNsY1xuIik7CisJICBpZigobyYyNTUpIT0wKQorCSAgICBlbWl0KGYsIlx0YWRjXHQjJWxkXG4iLHJlYWxfb2Zmc2V0KCZwLT5xMSkmMjU1KTsKKwl9CisJaWYoaXNhY2MoeikpeworCSAgaWYobz09MCkge2VtaXQoZiwiXHRsZHhcdCVzXG4iLG1yZWduYW1lc1tmcDJdKTtjb250aW51ZTt9CisJICBpZihvPT0yNTYpe2VtaXQoZiwiXHRsZHhcdCVzXG5cdGlueFxuIixtcmVnbmFtZXNbZnAyXSk7Y29udGludWU7fQorCSAgaWYobz09NTEyKXtlbWl0KGYsIlx0bGR4XHQlc1xuXHRpbnhcblx0aW54XG4iLG1yZWduYW1lc1tmcDJdKTtjb250aW51ZTt9CisJICBpZihvPDI1Nil7KytsYWJlbDtlbWl0KGYsIlx0bGR4XHQlc1xuXHRiY2NcdCVzJWRcblx0aW54XG4lcyVkOlxuIixtcmVnbmFtZXNbZnAyXSxsYWJwcmVmaXgsbGFiZWwsbGFicHJlZml4LGxhYmVsKTtjb250aW51ZTt9CisJICBpZihvPDUxMil7KytsYWJlbDtlbWl0KGYsIlx0bGR4XHQlc1xuXHRpbnhcblx0YmNjXHQlcyVkXG5cdGlueFxuJXMlZDpcbiIsbXJlZ25hbWVzW2ZwMl0sbGFicHJlZml4LGxhYmVsLGxhYnByZWZpeCxsYWJlbCk7Y29udGludWU7fQorCX0KKwlzdG9yZV9sb2J5dGUoZiwmcC0+eix0KTsKKwlpZihpc2FjYyh6KSkgZW1pdChmLCJcdHBoYVxuIik7CisJZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW2ZwMl0pOworCWlmKG8hPTApCisJICBlbWl0KGYsIlx0YWRjXHQjJWxkXG4iLHJlYWxfb2Zmc2V0KCZwLT5xMSk+PjgmMjU1KTsKKwlzdG9yZV9oaWJ5dGUoZiwmcC0+eix0KTsKKwlpZihpc2FjYyh6KSkgZW1pdChmLCJcdHBsYVxuIik7CisJY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmKGM9PUNPTVBBUkV8fGM9PVRFU1QpeworCUlDICpicmFuY2g9cC0+bmV4dDsKKwlpbnQgcGFjYz0wLGJjLGJvdXQ7CisJaWYoSVNQT0lOVEVSKHQpKSB0fD1VTlNJR05FRDsKKwl3aGlsZShicmFuY2gpeworCSAgaWYoYnJhbmNoLT5jb2RlPj1CRVEmJmJyYW5jaC0+Y29kZTxCUkEpCisJICAgIGJyZWFrOworCSAgaWYoYnJhbmNoLT5jb2RlIT1GUkVFUkVHJiZicmFuY2gtPmNvZGUhPUFMTE9DUkVHJiZicmFuY2gtPmNvZGUhPU5PUCkKKwkgICAgaWVycm9yKDApOworCSAgYnJhbmNoPWJyYW5jaC0+bmV4dDsKKwl9CisJYmM9YnJhbmNoLT5jb2RlOworCWJvdXQ9YnJhbmNoLT50eXBmOworCWlmKGM9PVRFU1QpeworCSAgcC0+cTIuZmxhZ3M9S09OU1Q7CisJICBndmFsLnZtYXg9WjA7CisJICBldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CisJICBpbnNlcnRfY29uc3QoJnAtPnEyLnZhbCx0KTsKKwl9CisJaWYoKHQmTlUpPT0oVU5TSUdORUR8Q0hBUikmJihiYz09QkxFfHxiYz09QkdUKSYmKHAtPnEyLmZsYWdzJihEUkVGT0JKfEtPTlNUKSk9PUtPTlNUKXsKKwkgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCx0KTsKKwkgIGlmKCF6bWVxdG8odm1heCxsMnptKDI1NUwpKSl7CisJICAgIHZtYXg9em1hZGQodm1heCxaMSk7CisJICAgIGd2YWwudm1heD12bWF4OworCSAgICBldmFsX2NvbnN0KCZndmFsLHQpOworCSAgICBpbnNlcnRfY29uc3QoJnAtPnEyLnZhbCx0KTsKKwkgICAgaWYoYmM9PUJMRSkgYmM9QkxUOyBlbHNlIGJjPUJHRTsKKwkgICAgYnJhbmNoLT5jb2RlPWJjOworCSAgfQorCX0KKwlpZigoKHQmTlEpPT1TSE9SVHx8KHQmTlEpPT1JTlR8fCh0Jk5RKT09TE9ORykmJihiYz09Qk5FfHxiYz09QkVRKSYmaXNjb25zdChxMikmJiFpc2FjYyhxMSkpeworCSAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHQpOworCSAgaWYoem1lcXRvKHZtYXgsWjApJiZ6dW1lcXRvKHZ1bWF4LFpVMCkpeworCSAgICBpZihwYWNjPWNtcF9nZXRfYWNjKGYscCxicmFuY2gpKQorCSAgICAgIGJvdXQ9KytsYWJlbDsKKwkgICAgbG9hZF9sb2J5dGUoZiwmcC0+cTEsdCk7CisJICAgIGRvX2hpYnl0ZShmLCJvcmEiLCZwLT5xMSx0KTsKKwkgICAgaWYoKHQmTlEpPT1MT05HKXsKKwkgICAgICBkb19ieXRlMyhmLCJvcmEiLCZwLT5xMSx0KTsKKwkgICAgICBkb19ieXRlNChmLCJvcmEiLCZwLT5xMSx0KTsKKwkgICAgfQorCSAgICBlbWl0KGYsIlx0JXNcdCVzJWRcbiIsKGJjPT1CTkUpPyJibmUiOiJiZXEiLGxhYnByZWZpeCxib3V0KTsKKwkgICAgaWYocGFjYyl7CisJICAgICAgcmVsb2FkX2FjYyhmKTsKKwkgICAgICBhZGRfY21wbGlzdChib3V0LGJyYW5jaC0+dHlwZixwYWNjKTsKKwkgICAgfQorCSAgICBjb250aW51ZTsKKwkgIH0KKwl9CisJaWYoaWVlZSYmSVNGTE9BVCh0KSl7CisJICBpZighaWVlZSkgaWVycm9yKDApOworCSAgdCY9TlE7CisJICBpZihyZWdzW0xBU1RfUEFJUl0pIGllcnJvcigwKTsKKwkgIHJlZ3NbTEFTVF9QQUlSXT0xOworCSAgaWYocmVnc1tyYV18fHJlZ3NbcmF4XSkKKwkgICAgaWVycm9yKDApOworCSAgbG9hZF9hZGRyZXNzKGYsTEFTVF9QQUlSLCZwLT5xMix0KTsKKwkgIEJTRVQocmVndXNlZCx0Myk7CisJICBCU0VUKHJlZ3VzZWQsdDQpOworCSAgZW1pdChmLCJcdGpzclx0JXNfX2Zsb2FkJWNcbiIsaWRwcmVmaXgsKHQ9PUZMT0FUPydzJzonZCcpKTsKKwkgIHl2YWw9Tk9WQUw7CisJICBsb2FkX2FkZHJlc3MoZixMQVNUX1BBSVIsJnAtPnExLHQpOworCSAgZW1pdChmLCJcdGpzclx0JXNfX2ZjbXAlY1xuIixpZHByZWZpeCwodD09RkxPQVQ/J3MnOidkJykpOworCSAgeXZhbD1OT1ZBTDsKKwkgIHJlZ3NbTEFTVF9QQUlSXT0wOworCSAgaWYoYmM9PUJMVHx8YmM9PUJMRSkKKwkgICAgZW1pdChmLCJcdGJtaVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICBlbHNlIGlmKGJjPT1CR1R8YmM9PUJHRSkKKwkgICAgZW1pdChmLCJcdGJ2c1x0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICBpZihiYz09QkVRfHxiYz09QkxFfHxiYz09QkdFKQorCSAgICBlbWl0KGYsIlx0YmVxXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgIGlmKGJjPT1CTkUpCisJICAgIGVtaXQoZiwiXHRibmVcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgY29udGludWU7CisJfQorCWlmKElTQ0hBUih0KSl7CisJICBjaGFyICpzPTA7CisJICBpZihpc3JlZyhxMSkmJklTSURYKHAtPnExLnJlZykmJiFpbmRpcmVjdCgmcC0+cTIpJiYoYmM9PUJFUXx8YmM9PUJORXx8KHQmVU5TSUdORUQpKSl7CisJICAgIHN0YXRpYyBjaGFyIGJ1Zls0XT0iY3ByIjsKKwkgICAgcz1idWY7c1syXT1tcmVnbmFtZXNbcC0+cTEucmVnXVswXTsKKwkgIH1lbHNleworCSAgICBpZihwYWNjPWNtcF9nZXRfYWNjKGYscCxicmFuY2gpKQorCSAgICAgIGJvdXQ9KytsYWJlbDsKKwkgICAgbG9hZF9hY2MoZiwmcC0+cTEsdCk7CisJICAgIGlmKGJjPT1CRVF8fGJjPT1CTkV8fCh0JlVOU0lHTkVEKSl7CisJICAgICAgcz0iY21wIjsKKwkgICAgfWVsc2V7CisJICAgICAgaWYoYmM9PUJMVHx8YmM9PUJHRSkKKwkJZW1pdChmLCJcdHNlY1xuIik7CisJICAgICAgZWxzZQorCQllbWl0KGYsIlx0Y2xjXG4iKTsKKwkgICAgICBzPSJzYmMiOworCSAgICB9CisJICB9CisJICBpZihjPT1URVNUKQorCSAgICBlbWl0KGYsIlx0JXNcdCMwXG4iLHMpOworCSAgZWxzZQorCSAgICBkb19sb2J5dGUoZixzLCZwLT5xMix0KTsKKwkgIGlmKGJjPT1CRVEpCisJICAgIGVtaXQoZiwiXHRiZXFcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgZWxzZSBpZihiYz09Qk5FKQorCSAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgIGVsc2UgaWYodCZVTlNJR05FRCl7CisJICAgIGlmKGJjPT1CTFQpCisJICAgICAgZW1pdChmLCJcdGJjY1x0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICAgIGVsc2UgaWYoYmM9PUJHRSkKKwkgICAgICBlbWl0KGYsIlx0YmNzXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgICAgZWxzZSBpZihiYz09QkxFKXsKKwkgICAgICBlbWl0KGYsIlx0YmNjXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgICAgICBlbWl0KGYsIlx0YmVxXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgICAgfWVsc2UgaWYoYmM9PUJHVCl7CisJICAgICAgZW1pdChmLCI7XG5cdGJlcVx0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICAgICAgZW1pdChmLCJcdGJjc1x0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICAgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwpOworCSAgICB9ZWxzZQorCSAgICAgIGllcnJvcigwKTsKKwkgIH1lbHNleworCSAgICBlbWl0KGYsIlx0YnZjXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgICAgZW1pdChmLCJcdGVvclx0IzEyOFxuIik7CisJICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgICAgaWYoYmM9PUJMVHx8YmM9PUJMRSkKKwkgICAgICBlbWl0KGYsIlx0Ym1pXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgICAgZWxzZQorCSAgICAgIGVtaXQoZiwiXHRicGxcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgfQorCSAgaWYocGFjYyl7CisJICAgIHJlbG9hZF9hY2MoZik7CisJICAgIGFkZF9jbXBsaXN0KGJvdXQsYnJhbmNoLT50eXBmLHBhY2MpOworCSAgfQorCSAgY29udGludWU7CisJfWVsc2UgaWYoYmM9PUJFUXx8YmM9PUJORXx8KHQmVU5TSUdORUQpfHxJU0ZQT0lOVEVSKHQpKXsKKwkgIGludCBpbj0wOworCSAgaWYocGFjYz1jbXBfZ2V0X2FjYyhmLHAsYnJhbmNoKSkKKwkgICAgYm91dD0rK2xhYmVsOworCSAgaWYoSVNMT05HKHQpKXsKKwkgICAgZG9fYnl0ZTQoZiwibGRhIiwmcC0+cTEsdCk7CisJICAgIGlmKGM9PVRFU1QpCisJICAgICAgZW1pdChmLCJcdGNtcFx0IzBcbiIpOworCSAgICBlbHNlCisJICAgICAgZG9fYnl0ZTQoZiwiY21wIiwmcC0+cTIsdCk7CisJICAgIGlmKGJjPT1CRVEpCisJICAgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsaW49KytsYWJlbCk7CisJICAgIGVsc2UgaWYoYmM9PUJORSkKKwkgICAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgICAgZWxzZSBpZihiYz09QkxUfHxiYz09QkxFKXsKKwkgICAgICBlbWl0KGYsIlx0YmNjXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgICAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxpbj0rK2xhYmVsKTsKKwkgICAgfWVsc2UgaWYoYmM9PUJHRXx8YmM9PUJHVCl7CisJICAgICAgZW1pdChmLCJcdGJjY1x0JXMlZFxuIixsYWJwcmVmaXgsaW49KytsYWJlbCk7CQorCSAgICAgIGVtaXQoZiwiXHRibmVcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgICB9ZWxzZQorCSAgICAgIGllcnJvcigwKTsKKwkgIH0KKwkgIGlmKElTTE9ORyh0KXx8SVNGUE9JTlRFUih0KSl7CisJICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCSAgICBpZihjPT1URVNUKQorCSAgICAgIGVtaXQoZiwiXHRjbXBcdCMwXG4iKTsKKwkgICAgZWxzZQorCSAgICAgIGRvX2J5dGUzKGYsImNtcCIsJnAtPnEyLHQpOworCSAgICBpZihiYz09QkVRKQorCSAgICAgIGVtaXQoZiwiXHRibmVcdCVzJWRcbiIsbGFicHJlZml4LGluP2luOihpbj0rK2xhYmVsKSk7CisJICAgIGVsc2UgaWYoYmM9PUJORSkKKwkgICAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgICAgZWxzZSBpZihiYz09QkxUfHxiYz09QkxFKXsKKwkgICAgICBlbWl0KGYsIlx0YmNjXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgICAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxpbj9pbjooaW49KytsYWJlbCkpOworCSAgICB9ZWxzZSBpZihiYz09QkdFfHxiYz09QkdUKXsKKwkgICAgICBlbWl0KGYsIlx0YmNjXHQlcyVkXG4iLGxhYnByZWZpeCxpbj9pbjooaW49KytsYWJlbCkpOwkKKwkgICAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgICAgfWVsc2UKKwkgICAgICBpZXJyb3IoMCk7CSAgCisJICB9CisJICBpZihpc2FjYyhxMSkpeworCSAgICBpZighaW5kaXJlY3QoJnAtPnEyKSl7CisJICAgICAgZG9faGlieXRlKGYsImNweCIsJnAtPnEyLHQpOworCSAgICB9ZWxzZXsKKwkgICAgICBpbnQgcj1nZXRfcmVnKGYscCxDSEFSKTsKKwkgICAgICBlbWl0KGYsIlx0cGhhXG4iKTsKKwkgICAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMix0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICAgIGVtaXQoZiwiXHRwbGFcbiIpOworCSAgICAgIGVtaXQoZiwiXHRjcHhcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgIH0KKwkgIH1lbHNleworCSAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgaWYoYz09VEVTVCkKKwkgICAgICBlbWl0KGYsIlx0Y21wXHQjMFxuIik7CisJICAgIGVsc2UKKwkgICAgICBkb19oaWJ5dGUoZiwiY21wIiwmcC0+cTIsdCk7CisJICB9CisJICBpZihiYz09QkVRKQorCSAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxpbj9pbjooaW49KytsYWJlbCkpOworCSAgZWxzZSBpZihiYz09Qk5FKQorCSAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgIGVsc2UgaWYoYmM9PUJMVHx8YmM9PUJMRSl7CisJICAgIGVtaXQoZiwiXHRiY2NcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxpbj9pbjooaW49KytsYWJlbCkpOworCSAgfWVsc2UgaWYoYmM9PUJHRXx8YmM9PUJHVCl7CisJICAgIGVtaXQoZiwiXHRiY2NcdCVzJWRcbiIsbGFicHJlZml4LGluP2luOihpbj0rK2xhYmVsKSk7CisJICAgIGVtaXQoZiwiXHRibmVcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgfWVsc2UKKwkgICAgaWVycm9yKDApOworCSAgbG9hZF9sb2J5dGUoZiwmcC0+cTEsdCk7CisJICBpZihjPT1URVNUKQorCSAgICBlbWl0KGYsIlx0Y21wXHQjMFxuIik7CisJICBlbHNlCisJICAgIGRvX2xvYnl0ZShmLCJjbXAiLCZwLT5xMix0KTsKKwkgIGlmKGJjPT1CRVEpCisJICAgIGVtaXQoZiwiXHRiZXFcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgZWxzZSBpZihiYz09Qk5FKQorCSAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgIGVsc2UgaWYoYmM9PUJMVCkKKwkgICAgZW1pdChmLCJcdGJjY1x0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICBlbHNlIGlmKGJjPT1CR0UpCisJICAgIGVtaXQoZiwiXHRiY3NcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOwkKKwkgIGVsc2UgaWYoYmM9PUJMRSl7CisJICAgIGVtaXQoZiwiXHRiY2NcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgICBlbWl0KGYsIlx0YmVxXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgIH1lbHNlIGlmKGJjPT1CR1QpeworCSAgICBlbWl0KGYsIlx0YmNjXHQlcyVkXG4iLGxhYnByZWZpeCxpbik7CisJICAgIGVtaXQoZiwiXHRibmVcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgfWVsc2UKKwkgICAgaWVycm9yKDApOworCSAgaWYoaW4pCisJICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGluKTsKKwkgIGlmKHBhY2MpeworCSAgICByZWxvYWRfYWNjKGYpOworCSAgICBhZGRfY21wbGlzdChib3V0LGJyYW5jaC0+dHlwZixwYWNjKTsKKwkgIH0KKwkgIGNvbnRpbnVlOworCX1lbHNleworCSAgaWYoYmM9PUJHVHx8YmM9PUJMRSl7CisJICAgIG9iaiBvOworCSAgICBpZihpc2FjYyhxMSkpeworCSAgICAgIGludCByOworCSAgICAgIGlmKHBhY2M9Y21wX2dldF9hY2MoZixwLGJyYW5jaCkpCisJCWJvdXQ9KytsYWJlbDsKKwkgICAgICByPWdldF9yZWcoZixwLENIQVIpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgICAgbG9hZF9sb2J5dGUoZiwmcC0+cTIsdCk7CisJICAgICAgZW1pdChmLCJcdGNtcFx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgICAgICBlbWl0KGYsIlx0c3R4XHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICAgIGxvYWRfaGlieXRlKGYsJnAtPnEyLHQpOworCSAgICAgIGVtaXQoZiwiXHRzYmNcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgICAgZW1pdChmLCJcdGJ2Y1x0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICAgICAgZW1pdChmLCJcdGVvclx0IzEyOFxuIik7CisJICAgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwpOworCSAgICAgIGlmKGJjPT1CR1QpCisJCWVtaXQoZiwiXHRibWlcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgICAgIGVsc2UKKwkJZW1pdChmLCJcdGJwbFx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICAgICAgaWYocGFjYyl7CisJCXJlbG9hZF9hY2MoZik7CisJCWFkZF9jbXBsaXN0KGJvdXQsYnJhbmNoLT50eXBmLHBhY2MpOworCSAgICAgIH0KKwkgICAgICBjb250aW51ZTsKKwkgICAgfWVsc2V7CisJICAgICAgbz1wLT5xMTtwLT5xMT1wLT5xMjtwLT5xMj1vOworCSAgICAgIGlmKGJjPT1CR1QpIGJjPUJMVDsgZWxzZSBiYz1CR0U7CisJICAgIH0KKwkgIH0KKwkgIGlmKHBhY2M9Y21wX2dldF9hY2MoZixwLGJyYW5jaCkpCisJICAgIGJvdXQ9KytsYWJlbDsKKwkgIGlmKElTTE9ORyh0KSl7CisJICAgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgICBkb19sb2J5dGUoZiwiY21wIiwmcC0+cTIsdCk7CisJICAgIGxvYWRfaGlieXRlKGYsJnAtPnExLHQpOworCSAgICBkb19oaWJ5dGUoZiwic2JjIiwmcC0+cTIsdCk7CisJICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCSAgICBkb19ieXRlMyhmLCJzYmMiLCZwLT5xMix0KTsKKwkgICAgZG9fYnl0ZTQoZiwibGRhIiwmcC0+cTEsdCk7CisJICAgIGRvX2J5dGU0KGYsInNiYyIsJnAtPnEyLHQpOworCSAgfWVsc2V7CisJICAgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgICBkb19sb2J5dGUoZiwiY21wIiwmcC0+cTIsdCk7CisJICAgIGxvYWRfaGlieXRlKGYsJnAtPnExLHQpOworCSAgICBkb19oaWJ5dGUoZiwic2JjIiwmcC0+cTIsdCk7CisJICB9CisJICBlbWl0KGYsIlx0YnZjXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgIGVtaXQoZiwiXHRlb3JcdCMxMjhcbiIpOworCSAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwpOworCSAgaWYoYmM9PUJMVCkKKwkgICAgZW1pdChmLCJcdGJtaVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICBlbHNlIGlmKGJjPT1CR0UpCisJICAgIGVtaXQoZiwiXHRicGxcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgZWxzZQorCSAgICBpZXJyb3IoMCk7CisJICBpZihwYWNjKXsKKwkgICAgcmVsb2FkX2FjYyhmKTsKKwkgICAgYWRkX2NtcGxpc3QoYm91dCxicmFuY2gtPnR5cGYscGFjYyk7CisJICB9CisJICBjb250aW51ZTsgCisJfQorCWllcnJvcigwKTsKKyAgICAgIH0KKworCisgICAgICBpZigoYz09QUREfHxjPT1TVUIpJiZJU1JJRFgoeikmJmlzY29uc3QocTIpKXsKKwlldmFsX2NvbnN0KCZwLT5xMi52YWwsdCk7CisJaWYoem1lcXRvKHZtYXgsbDJ6bSgtMUwpKSl7IAorCSAgdm1heD1aMTsgdnVtYXg9WlUxOyAKKwkgIGlmKGM9PUFERCkgYz1TVUI7IGVsc2UgYz1BREQ7CisJfQorCWlmKHptZXF0byh2bWF4LFoxKSYmenVtZXF0byh2dW1heCxaVTEpKXsKKwkgIGlmKGluZGlyZWN0KCZwLT5xMSkpeworCSAgICBnZXRfYWNjKGYscCxDSEFSKTsKKwkgICAgbG9hZF9yZWcoZixwLT56LnJlZywmcC0+cTEsdCk7CisJICB9ZWxzZQorCSAgICBkb19sb2J5dGUoZiwibGR4IiwmcC0+cTEsdCk7CisJICBlbWl0KGYsIlx0JXMlc1xuIiwoYz09QUREKT8iaW4iOiJkZSIsbXJlZ25hbWVzW3AtPnoucmVnXSk7CisJICBjb250aW51ZTsKKwl9CisgICAgICB9CisKKyAgICAgIGlmKChjPT1MU0hJRlR8fGM9PVJTSElGVCkmJmlzY29uc3QocTIpJiYKKwkgKAorCSAoaXNyZWcocTEpJiZpc3JlZyh6KSYmcC0+cTEucmVnPT1wLT56LnJlZyYmcC0+ei5yZWchPXJhJiZwLT56LnJlZyE9cmF4KXx8CisJICghaW5kaXJlY3QoJnAtPnExKSYmY29tcGFyZV9vYmplY3RzKCZwLT5xMSwmcC0+eikpCisJICkKKwkgKXsKKwlsb25nIGw7CisJZXZhbF9jb25zdCgmcC0+cTIudmFsLHEydHlwKHApKTsKKwlsPXptMmwodm1heCk7CisJLypUT0RPOiBhbGxvdyBsYXJnZXIgdHlwZXMgKi8KKwlpZigobDwzfHwoaXN6cGFnZSgmcC0+eikmJmw8NSkpJiYodCZOUSk8PUxPTkcpeworCSAgaWYoYz09UlNISUZUJiYoIWMwMiYmISh0JlVOU0lHTkVEKSkpCisJICAgIGdldF9hY2MoZixwLENIQVIpOworCSAgaW5jbWVtKGYsJnAtPnosdCxjLGwpOworCSAgY29udGludWU7CisJfQorICAgICAgfQorCisgICAgICBpZihjPT1MU0hJRlR8fGM9PVJTSElGVCl7CisJbG9uZyBsPS0xLG07aW50IGxvb3A9MCxyPTAscjI9MCxyMz0wLG91dGw9MCxzYW1lPTA7CisJaWYoaXNjb25zdChxMikpeworCSAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHEydHlwKHApKTsKKwkgIGw9em0ybCh2bWF4KTsKKwkgIGxvb3A9MDsKKwl9ZWxzZQorCSAgbG9vcD0xOworCWlmKGw+PTAmJm9wdHNpemUpeworCSAgaWYoYz09TFNISUZUJiYobCY3KT42KSAKKwkgICAgbG9vcD0xOworCSAgZWxzZSBpZihjPT1SU0hJRlQmJih0JlVOU0lHTkVEKSYmKGwmNyk+MykKKwkgICAgbG9vcD0xOworCSAgZWxzZSBpZihjPT1SU0hJRlQmJiEodCZVTlNJR05FRCkmJihsJjcpPjIpCisJICAgIGxvb3A9MTsKKwl9CisKKwlpZihJU0xPTkcodCkpeworCSAgaWYoIWluZGlyZWN0KCZwLT56KSYmCisJICAgICAoaXNyZWcoeil8fChwLT56LmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVIpJiYKKwkgICAgIChpc3pwYWdlKCZwLT56KXx8KGwmNyk8PTIpJiYKKwkgICAgICghKHAtPnEyLmZsYWdzJlJFRyl8fCEocC0+ei5mbGFncyZSRUcpfHxwLT5xMi5yZWchPXAtPnoucmVnKSYmCisJICAgICAoIShwLT5xMi5mbGFncyZWQVIpfHwhKHAtPnouZmxhZ3MmVkFSKXx8cC0+cTIudiE9cC0+ei52KQorCSAgICAgKXsKKwkgICAgaWYoaXNyZWcoeikpCisJICAgICAgc3RyY3B5KG1yZWduYW1lc1tSRUdEVU1NWTFdLG1yZWduYW1lc1twLT56LnJlZ10pOworCSAgICBlbHNlIGlmKHAtPnoudi0+c3RvcmFnZV9jbGFzcz09U1RBVElDKQorCSAgICAgIHNwcmludGYobXJlZ25hbWVzW1JFR0RVTU1ZMV0sIiVzJWxkIixsYWJwcmVmaXgsem0ybChwLT56LnYtPm9mZnNldCkpOworCSAgICBlbHNlCisJICAgICAgc3ByaW50ZihtcmVnbmFtZXNbUkVHRFVNTVkxXSwiJXMlcyIsaWRwcmVmaXgscC0+ei52LT5pZGVudGlmaWVyKTsKKwkgICAgc3RyY3B5KG1yZWduYW1lc1tSRUdEVU1NWTJdLG1yZWduYW1lc1tSRUdEVU1NWTFdKTsKKwkgICAgc3RyY3B5KG1yZWduYW1lc1tSRUdEVU1NWTNdLG1yZWduYW1lc1tSRUdEVU1NWTFdKTsKKwkgICAgc3RyY2F0KG1yZWduYW1lc1tSRUdEVU1NWTFdLCIrMSIpOworCSAgICBzdHJjYXQobXJlZ25hbWVzW1JFR0RVTU1ZMl0sIisyIik7CisJICAgIGlmKGMhPVJTSElGVHx8KHQmVU5TSUdORUQpKQorCSAgICAgIHN0cmNhdChtcmVnbmFtZXNbUkVHRFVNTVkzXSwiKzMiKTsKKwkgICAgaWYoYz09UlNISUZUJiYhKHQmVU5TSUdORUQpKXsKKwkgICAgICByPVJFR0RVTU1ZMjtyMj1SRUdEVU1NWTE7cjM9UkVHRFVNTVkzOworCSAgICB9ZWxzZXsKKwkgICAgICByPVJFR0RVTU1ZMTtyMj1SRUdEVU1NWTI7cjM9UkVHRFVNTVkzOworCSAgICB9CisJICAgIGlmKGNvbXBhcmVfb2JqZWN0cygmcC0+cTEsJnAtPnopKSBzYW1lPTE7CisJICB9ZWxzZXsKKwkgICAgcjI9Z2V0X3JlZyhmLHAsQ0hBUik7CisJICAgIHIzPWdldF9yZWcoZixwLENIQVIpOworCSAgfQorCX0KKwlpZighSVNDSEFSKHQpJiZyMiE9UkVHRFVNTVkxJiZyMiE9UkVHRFVNTVkyKQorCSAgcj1nZXRfcmVnKGYscCxDSEFSKTsKKwlpZihJU0xPTkcodCkpeworCSAgZ2V0X2FjYyhmLHAsQ0hBUik7CisJICBpZihsPj0yNCl7CisJICAgIGlmKGM9PUxTSElGVCl7CisJICAgICAgbG9hZF9sb2J5dGUoZiwmcC0+cTEsdCk7CisJICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3IzXSk7CisJICAgICAgZW1pdChmLCJcdGxkYVx0IzBcbiIpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3IyXSk7CisJICAgIH1lbHNlIGlmKGM9PVJTSElGVCYmISh0JlVOU0lHTkVEKSl7CisJICAgICAgZG9fYnl0ZTQoZiwibGRhIiwmcC0+cTEsdCk7CisJICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3IzXSk7CisJICAgICAgc2V0eShmLDApOworCSAgICAgIGVtaXQoZiwiXHRjbXBcdCMwXG4iKTsKKwkgICAgICBlbWl0KGYsIlx0YnBsXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgICAgICBlbWl0KGYsIlx0ZGV5XG4iKTsKKwkgICAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgICAgZW1pdChmLCJcdHN0eVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgICAgICBlbWl0KGYsIlx0c3R5XHQlc1xuIixtcmVnbmFtZXNbcjJdKTsKKwkgICAgICBlbWl0KGYsIlx0dHlhXG4iKTsKKwkgICAgICB5dmFsPU5PVkFMOworCSAgICB9ZWxzZXsKKwkgICAgICBkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgICBzZXR5KGYsMCk7CisJICAgICAgZW1pdChmLCJcdHN0eVx0JXNcbiIsbXJlZ25hbWVzW3IzXSk7CisJICAgICAgZW1pdChmLCJcdHN0eVx0JXNcbiIsbXJlZ25hbWVzW3IyXSk7CisJICAgICAgZW1pdChmLCJcdHN0eVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgICAgfQorCSAgfWVsc2UgaWYobD49MTYpeworCSAgICBpZihjPT1MU0hJRlQpeworCSAgICAgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyMl0pOworCSAgICAgIGxvYWRfaGlieXRlKGYsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyM10pOworCSAgICAgIGVtaXQoZiwiXHRsZGFcdCMwXG4iKTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICB9ZWxzZSBpZihjPT1SU0hJRlQmJiEodCZVTlNJR05FRCkpeworCSAgICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyM10pOworCSAgICAgIGRvX2J5dGU0KGYsImxkYSIsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyMl0pOworCSAgICAgIHNldHkoZiwwKTsKKwkgICAgICBlbWl0KGYsIlx0Y21wXHQjMFxuIik7CisJICAgICAgZW1pdChmLCJcdGJwbFx0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICAgICAgZW1pdChmLCJcdGRleVxuIik7CisJICAgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwpOworCSAgICAgIGVtaXQoZiwiXHRzdHlcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgICAgZW1pdChmLCJcdHR5YVxuIik7CisJICAgICAgeXZhbD1OT1ZBTDsKKwkgICAgfWVsc2V7CisJICAgICAgZG9fYnl0ZTQoZiwibGRhIiwmcC0+cTEsdCk7CisJICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgICAgICBkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgICBzZXR5KGYsMCk7CisJICAgICAgZW1pdChmLCJcdHN0eVx0JXNcbiIsbXJlZ25hbWVzW3IyXSk7CisJICAgICAgZW1pdChmLCJcdHN0eVx0JXNcbiIsbXJlZ25hbWVzW3IzXSk7CisJICAgIH0KKwkgIH1lbHNlIGlmKGw+PTgpeworCSAgICBpZihjPT1MU0hJRlQpeworCSAgICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyM10pOworCSAgICAgIGxvYWRfaGlieXRlKGYsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyMl0pOworCSAgICAgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgICAgZW1pdChmLCJcdGxkYVx0IzBcbiIpOworCSAgICB9ZWxzZSBpZihjPT1SU0hJRlQmJiEodCZVTlNJR05FRCkpeworCSAgICAgIGxvYWRfaGlieXRlKGYsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyM10pOworCSAgICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyMl0pOworCSAgICAgIGRvX2J5dGU0KGYsImxkYSIsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgICAgc2V0eShmLDApOworCSAgICAgIGVtaXQoZiwiXHRjbXBcdCMwXG4iKTsKKwkgICAgICBlbWl0KGYsIlx0YnBsXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgICAgICBlbWl0KGYsIlx0ZGV5XG4iKTsKKwkgICAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgICAgZW1pdChmLCJcdHR5YVxuIik7CisJICAgICAgeXZhbD1OT1ZBTDsKKwkgICAgfWVsc2V7CisJICAgICAgaWYoc2FtZSl7CisJCWxvYWRfaGlieXRlKGYsJnAtPnExLHQpOworCQlkb19ieXRlMyhmLCJsZHkiLCZwLT5xMSx0KTsKKwkJeXZhbD1OT1ZBTDsKKwkJZW1pdChmLCJcdHN0eVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkJZG9fYnl0ZTQoZiwibGR5IiwmcC0+cTEsdCk7CisJCWVtaXQoZiwiXHRzdHlcdCVzXG4iLG1yZWduYW1lc1tyMl0pOworCQlzZXR5KGYsMCk7CisJCWVtaXQoZiwiXHRzdHlcdCVzXG4iLG1yZWduYW1lc1tyM10pOworCSAgICAgIH1lbHNleworCQllbWl0KGYsIlx0bGRhXHQjMFxuIik7CisJCWVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyM10pOworCQlkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkJZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3IyXSk7CisJCWRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCQllbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCQlsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgICB9CisJICAgIH0KKwkgIH1lbHNlIGlmKGM9PVJTSElGVCYmISh0JlVOU0lHTkVEKSl7CisJICAgIGlmKCFzYW1lKXsKKwkgICAgICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjNdKTsKKwkgICAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjJdKTsKKwkgICAgICBkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICB9CisJICAgIGRvX2J5dGU0KGYsImxkYSIsJnAtPnExLHQpOworCSAgfWVsc2V7CisJICAgIGlmKCFzYW1lKXsKKwkgICAgICBkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjNdKTsKKwkgICAgICBkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjJdKTsKKwkgICAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICB9CisJICAgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgfQorCX1lbHNlCisJICBnZXRfYWNjKGYscCx0KTsKKwlpZighSVNMT05HKHQpKXsKKwkgIGlmKGw+PTgpeworCSAgICBpZighSVNTSE9SVCh0KSkgaWVycm9yKDApOworCSAgICBpZihjPT1MU0hJRlQpeworCSAgICAgIGlmKGluZGlyZWN0KCZwLT5xMSkpeworCQlsb2FkX2xvYnl0ZShmLCZwLT5xMSx0KTsKKwkJZW1pdChmLCJcdHRheFxuIik7CisJCWVtaXQoZiwiXHRsZGFcdCMwXG4iKTsKKwkgICAgICB9ZWxzZXsKKwkJaWYoaXNhY2MocTEpKQorCQkgIGVtaXQoZiwiXHR0YXhcbiIpOworCQllbHNlCisJCSAgZG9fbG9ieXRlKGYsImxkeCIsJnAtPnExLHQpOworCQllbWl0KGYsIlx0bGRhXHQjMFxuIik7CisJICAgICAgfQorCSAgICB9ZWxzZXsKKwkgICAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0bGR4XHQjMFxuIik7CisJICAgICAgaWYoISh0JlVOU0lHTkVEKSl7CisJCWVtaXQoZiwiXHRjbXBcdCMwXG4iKTsKKwkJZW1pdChmLCJcdGJwbFx0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJCWVtaXQoZiwiXHRkZXhcbiIpOworCQllbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgICAgfQorCSAgICB9CisJICB9ZWxzZQorCSAgICBsb2FkX2FjYyhmLCZwLT5xMSx0KTsKKwl9CisJaWYobD49MCkgbCY9NzsKKwltPWw7CisJaWYoSVNTSE9SVCh0KSYmKGw+MHx8bG9vcCkpCisJICBlbWl0KGYsIlx0c3R4XHQlc1xuIixtcmVnbmFtZXNbcl0pOworCWlmKGxvb3ApeworCSAgaWYobD49MCkKKwkgICAgc2V0eShmLGwpOworCSAgZWxzZXsKKwkgICAgaWYoaW5kaXJlY3QoJnAtPnEyKSl7CisJICAgICAgZW1pdChmLCJcdHBoYVxuIik7CisJICAgICAgbG9hZF9sb2J5dGUoZiwmcC0+cTIscTJ0eXAocCkpOworCSAgICAgIGVtaXQoZiwiXHR0YXlcbiIpOworCSAgICAgIGVtaXQoZiwiXHRwbGFcbiIpOworCSAgICAgIGVtaXQoZiwiXHRjcHlcdCMwXG4iKTsKKwkgICAgfWVsc2V7CisJICAgICAgZW1pdChmLCJcdGxkeVx0Iik7CisJICAgICAgZW1pdF9sb2J5dGUoZiwmcC0+cTIscTJ0eXAocCkpOworCSAgICAgIGVtaXQoZiwiXG4iKTsKKwkgICAgfQorCSAgICBvdXRsPSsrbGFiZWw7CisJICAgIGVtaXQoZiwiXHRiZXFcdCVzJWRcbiIsbGFicHJlZml4LG91dGwpOworCSAgfQorCSAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJfWVsc2V7CisJICBpZihJU0NIQVIodCkpCisJICAgIGwmPTc7CisJICBlbHNlIGlmKElTU0hPUlQodCkpCisJICAgIGwmPTE1OworCSAgZWxzZQorCSAgICBsJj0zMTsKKwl9CisJd2hpbGUobD4wfHxsb29wKXsKKwkgIGlmKGM9PUxTSElGVCl7CisJICAgIGVtaXQoZiwiXHRhc2xcbiIpOworCSAgICBpZighSVNDSEFSKHQpKQorCSAgICAgIGVtaXQoZiwiXHRyb2xcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgIGlmKElTTE9ORyh0KSl7CisJICAgICAgZW1pdChmLCJcdHJvbFx0JXNcbiIsbXJlZ25hbWVzW3IyXSk7CisJICAgICAgZW1pdChmLCJcdHJvbFx0JXNcbiIsbXJlZ25hbWVzW3IzXSk7CisJICAgIH0KKwkgIH1lbHNlIGlmKHQmVU5TSUdORUQpeworCSAgICBlbWl0KGYsIlx0bHNyIik7CisJICAgIGlmKElTTE9ORyh0KSl7CisJICAgICAgZW1pdChmLCJcdCVzXG4iLG1yZWduYW1lc1tyM10pOworCSAgICAgIGVtaXQoZiwiXHRyb3JcdCVzXG4iLG1yZWduYW1lc1tyMl0pOworCSAgICAgIGVtaXQoZiwiXHRyb3IiKTsKKwkgICAgfQorCSAgICBpZighSVNDSEFSKHQpKXsKKwkgICAgICBlbWl0KGYsIlx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgICAgICBlbWl0KGYsIlx0cm9yIik7CisJICAgIH0KKwkgICAgZW1pdChmLCJcbiIpOworCSAgfWVsc2V7CisJICAgIGlmKElTTE9ORyh0KSl7CisJICAgICAgaWYoY2UwMikKKwkJZW1pdChmLCJcdGFzclxuIik7CisJICAgICAgZWxzZXsKKwkJZW1pdChmLCJcdGNtcFx0IzEyOFxuIik7CisJCWVtaXQoZiwiXHRyb3JcbiIpOworCSAgICAgIH0KKwkgICAgICBlbWl0KGYsIlx0cm9yXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICAgIGVtaXQoZiwiXHRyb3JcdCVzXG4iLG1yZWduYW1lc1tyMl0pOworCSAgICAgIGVtaXQoZiwiXHRyb3JcdCVzXG4iLG1yZWduYW1lc1tyM10pOworCSAgICB9ZWxzZXsKKwkgICAgICBpZighSVNDSEFSKHQpKXsKKwkJZW1pdChmLCJcdGNweFx0IzEyOFxuIik7CisJCWVtaXQoZiwiXHRyb3JcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgICAgfWVsc2UKKwkJZW1pdChmLCJcdGNtcFx0IzEyOFxuIik7CisJICAgICAgZW1pdChmLCJcdHJvclxuIik7CisJICAgIH0KKwkgIH0KKwkgIGlmKGxvb3ApeworCSAgICBlbWl0KGYsIlx0ZGV5XG4iKTsKKwkgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsbGFiZWwpOworCSAgICBpZihvdXRsKSBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxvdXRsKTsKKwkgICAgeXZhbD0wOworCSAgICBicmVhazsKKwkgIH0KKwkgIGwtLTsKKwl9CisJaWYoSVNMT05HKHQpKXsKKwkgIGlmKGM9PVJTSElGVCYmISh0JlVOU0lHTkVEKSl7CisJICAgIGRvX2J5dGU0KGYsInN0YSIsJnAtPnosdCk7CisJICAgIGlmKHIhPVJFR0RVTU1ZMil7CisJICAgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgICAgICBkb19ieXRlMyhmLCJzdGEiLCZwLT56LHQpOworCSAgICAgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tyMl0pOworCSAgICAgIHN0b3JlX2hpYnl0ZShmLCZwLT56LHQpOworCSAgICAgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tyM10pOworCSAgICAgIHN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCSAgICB9CisJICB9ZWxzZXsKKwkgICAgc3RvcmVfbG9ieXRlKGYsJnAtPnosdCk7CisJICAgIGlmKHIhPVJFR0RVTU1ZMSl7CisJICAgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgICAgICBzdG9yZV9oaWJ5dGUoZiwmcC0+eix0KTsKKwkgICAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcjJdKTsKKwkgICAgICBkb19ieXRlMyhmLCJzdGEiLCZwLT56LHQpOworCSAgICAgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tyM10pOworCSAgICAgIGRvX2J5dGU0KGYsInN0YSIsJnAtPnosdCk7CisJICAgIH0KKwkgIH0KKwl9ZWxzZXsKKwkgIGlmKCFJU0NIQVIodCkmJihtPjB8fGxvb3ApKQorCSAgICBlbWl0KGYsIlx0bGR4XHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgaWYoSVNDSEFSKHQpfHxpbmRpcmVjdCgmcC0+eikpCisJICAgIHN0b3JlX2FjYyhmLCZwLT56LHQpOworCSAgZWxzZXsKKwkgICAgc3RvcmVfbG9ieXRlKGYsJnAtPnosdCk7CisJICAgIGlmKCFpc3JlZyh6KXx8cC0+ei5yZWchPXJheCl7CisJICAgICAgZW1pdChmLCJcdHN0eFx0Iik7CisJICAgICAgZW1pdF9oaWJ5dGUoZiwmcC0+eix0KTsKKwkgICAgICBlbWl0KGYsIlxuIik7CisJICAgIH0KKwkgIH0KKwl9CisJY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmKChjPj1PUiYmYzw9QU5EKXx8KGM+PUxTSElGVCYmYzw9TU9EKXx8Yz09QURESTJQfHxjPT1TVUJJRlApeworCWNoYXIgKnM7aW50IHQyPXQscHQ9cC0+dHlwZjI7CisJaWYoIWlzYWNjKHopKXsKKwkgIC8qIFRPRE86IGNoZWNrIG90aGVyIG9wZXJhdGlvbnMgKi8KKwkgIGlmKChjPT1BRER8fGM9PVNVQnx8Yz09QU5EfHxjPT1YT1J8fGM9PU9SfHxjPT1BRERJMlB8fGM9PVNVQklGUCkmJmlzYWNjKHExKSYmc2NyYXRjaChwLT5uZXh0LHJhLDEpKQorCSAgICA7CisJICBlbHNleworCSAgICBpZigoYz09QURESTJQfHxjPT1TVUJJRlApJiYocC0+dHlwZjImTlUpPT1DSEFSKQorCSAgICAgIGdldF9hY2MoZixwLElOVCk7CisJICAgIGVsc2UKKwkgICAgICBnZXRfYWNjKGYscCxDSEFSKTsKKwkgIH0KKwl9CisJaWYoYz09QURESTJQfHxjPT1TVUJJRlApeworCSAgaWYoYz09QURESTJQKSBjPUFERDsgZWxzZSBjPVNVQjsKKwkgIHQ9VU5TSUdORUR8SU5UOworCSAgaWYoKHB0Jk5RKT09UE9JTlRFUiYmKHAtPnExLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKwkgICAgZXZhbF9jb25zdCgmcC0+cTEudmFsLFBPSU5URVIpOworCSAgICBpbnNlcnRfY29uc3QoJnAtPnExLnZhbCxVTlNJR05FRHxJTlQpOworCSAgfQorCX0KKwlpZihjPj1PUiYmYzw9QU5EKQorCSAgcz1sb2dpY2Fsc1tjLU9SXTsKKwllbHNlCisJICBzPWFyaXRobWV0aWNzW2MtTFNISUZUXTsKKyAgICAgIAorCWlmKElTRkxPQVQodCkpeworCSAgaWYoIWllZWUpIGllcnJvcigwKTsKKwkgIHQmPU5ROworCSAgaWYocmVnc1tMQVNUX1BBSVJdKSBpZXJyb3IoMCk7CisJICBnZXRfYWNjKGYscCxJTlQpOworCSAgcmVnc1tMQVNUX1BBSVJdPTE7CisJICBsb2FkX2FkZHJlc3MoZixMQVNUX1BBSVIsJnAtPnExLHQpOworCSAgQlNFVChyZWd1c2VkLHQzKTsKKwkgIEJTRVQocmVndXNlZCx0NCk7CisJICBlbWl0KGYsIlx0anNyXHQlc19fZmxvYWQlY1xuIixpZHByZWZpeCwodD09RkxPQVQ/J3MnOidkJykpOworCSAgeXZhbD1OT1ZBTDsKKwkgIGxvYWRfYWRkcmVzcyhmLExBU1RfUEFJUiwmcC0+cTIsdCk7CisJICBlbWl0KGYsIlx0anNyXHQlc19fZiVzJWNcbiIsaWRwcmVmaXgsZW5hbWVbY10sKHQ9PUZMT0FUPydzJzonZCcpKTsKKwkgIHl2YWw9Tk9WQUw7CisJICBsb2FkX2FkZHJlc3MoZixMQVNUX1BBSVIsJnAtPnosdCk7CisJICBlbWl0KGYsIlx0anNyXHQlc19fZnN0b3JlJWNcbiIsaWRwcmVmaXgsKHQ9PUZMT0FUPydzJzonZCcpKTsKKwkgIHl2YWw9Tk9WQUw7CisJICByZWdzW0xBU1RfUEFJUl09MDsKKwkgIGNvbnRpbnVlOworCX1lbHNlIGlmKElTTE9ORyh0KSl7CisJICBsb25nIGw7aW50IGNuc3Q9MDsKKwkgIGlmKGM9PUFERCkgZW1pdChmLCJcdGNsY1xuIik7CisJICBpZihjPT1TVUIpIGVtaXQoZiwiXHRzZWNcbiIpOworCSAgaWYoKHAtPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKwkgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHQpOworCSAgICBsPXptMmwodm1heCk7CisJICAgIGNuc3Q9MTsKKwkgIH0KKwkgIGlmKGNuc3QmJmM9PUFORCYmKGwmMHhmZik9PTApIGVtaXQoZiwiXHRsZGFcdCMwXG4iKTsKKwkgIGVsc2UgaWYoY25zdCYmYz09T1ImJihsJjB4ZmYpPT0weGZmKSBlbWl0KGYsIlx0bGRhXHQjMjU1XG4iKTsKKwkgIGVsc2V7CisJICAgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgICBpZighKGNuc3QmJigoYz09QU5EJiYobCYweGZmKT09MHhmZil8fChjPT1PUiYmKGwmMHhmZik9PTApfHwoYz09WE9SJiYobCYweGZmKT09MCkpKSkgZG9fbG9ieXRlKGYscywmcC0+cTIsdCk7CisJICB9CisJICBzdG9yZV9sb2J5dGUoZiwmcC0+eix0KTsKKwkgIGlmKGNuc3QmJmM9PUFORCYmKGwmMHhmZjAwKT09MCkgZW1pdChmLCJcdGxkYVx0IzBcbiIpOworCSAgZWxzZSBpZihjbnN0JiZjPT1PUiYmKGwmMHhmZjAwKT09MHhmZjAwKSBlbWl0KGYsIlx0bGRhXHQjMjU1XG4iKTsKKwkgIGVsc2V7CisJICAgIGxvYWRfaGlieXRlKGYsJnAtPnExLHQpOworCSAgICBpZighKGNuc3QmJigoYz09QU5EJiYobCYweGZmMDApPT0weGZmMDApfHwoYz09T1ImJihsJjB4ZmYwMCk9PTApfHwoYz09WE9SJiYobCYweGZmMDApPT0wKSkpKSBkb19oaWJ5dGUoZixzLCZwLT5xMix0KTsKKwkgIH0KKwkgIHN0b3JlX2hpYnl0ZShmLCZwLT56LHQpOworCSAgaWYoY25zdCYmYz09QU5EJiYobCYweGZmMDAwMCk9PTApIGVtaXQoZiwiXHRsZGFcdCMwXG4iKTsKKwkgIGVsc2UgaWYoY25zdCYmYz09T1ImJihsJjB4ZmYwMDAwKT09MHhmZjAwMDApIGVtaXQoZiwiXHRsZGFcdCMyNTVcbiIpOworCSAgZWxzZXsKKwkgICAgZG9fYnl0ZTMoZiwibGRhIiwmcC0+cTEsdCk7CisJICAgIGlmKCEoY25zdCYmKChjPT1BTkQmJihsJjB4ZmYwMDAwKT09MHhmZjAwMDApfHwoYz09T1ImJihsJjB4ZmYwMDAwKT09MCl8fChjPT1YT1ImJihsJjB4ZmYwMDAwKT09MCkpKSkgZG9fYnl0ZTMoZixzLCZwLT5xMix0KTsKKwkgIH0KKwkgIGRvX2J5dGUzKGYsInN0YSIsJnAtPnosdCk7CisJICBpZihjbnN0JiZjPT1BTkQmJihsJjB4ZmYwMDAwMDApPT0wKSBlbWl0KGYsIlx0bGRhXHQjMFxuIik7CisJICBlbHNlIGlmKGNuc3QmJmM9PU9SJiYobCYweGZmMDAwMDAwKT09MHhmZjAwMDAwMCkgZW1pdChmLCJcdGxkYVx0IzI1NVxuIik7CisJICBlbHNleworCSAgICBkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgaWYoIShjbnN0JiYoKGM9PUFORCYmKGwmMHhmZjAwMDAwMCk9PTB4ZmYwMDAwMDApfHwoYz09T1ImJihsJjB4ZmYwMDAwMDApPT0wKXx8KGM9PVhPUiYmKGwmMHhmZjAwMDAwMCk9PTApKSkpIGRvX2J5dGU0KGYscywmcC0+cTIsdCk7CisJICB9CisJICBkb19ieXRlNChmLCJzdGEiLCZwLT56LHQpOworCSAgY29udGludWU7CisJfWVsc2UgaWYoSVNDSEFSKHQpKXsKKwkgIGxvYWRfYWNjKGYsJnAtPnExLHQpOworCSAgaWYoYzAyJiYoYz09QUREfHxjPT1TVUIpJiYocC0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworCSAgICBldmFsX2NvbnN0KCZwLT5xMi52YWwsdCk7CisJICAgIGlmKHptZXF0byh2bWF4LFoxKXx8em1lcXRvKHZtYXgsbDJ6bSgyTCkpKXsKKwkgICAgICBpZih6bWVxdG8odm1heCxsMnptKDJMKSkpCisJCWVtaXQoZiwiXHQlc1xuIixjPT1BREQ/ImluYSI6ImRlYSIpOworCSAgICAgIGVtaXQoZiwiXHQlc1xuIixjPT1BREQ/ImluYSI6ImRlYSIpOworCSAgICAgIHN0b3JlX2FjYyhmLCZwLT56LHQpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICB9CisJICBpZihjPT1BREQpIGVtaXQoZiwiXHRjbGNcbiIpOworCSAgaWYoYz09U1VCKSBlbWl0KGYsIlx0c2VjXG4iKTsKKwkgIGlmKGlzcmVnKHEyKSYmSVNJRFgocC0+cTIucmVnKSl7CisJICAgIGludCByPWdldF9yZWcoZixwLENIQVIpOworCSAgICBlbWl0KGYsIlx0c3Qlc1x0JXNcbiIsbXJlZ25hbWVzW3AtPnEyLnJlZ10sbXJlZ25hbWVzW3JdKTsKKwkgICAgcC0+cTIuZmxhZ3M9UkVHOworCSAgICBwLT5xMi5yZWc9cjsKKwkgIH0KKwkgIGRvX2xvYnl0ZShmLHMsJnAtPnEyLHQpOworCSAgc3RvcmVfYWNjKGYsJnAtPnosdCk7CisJfWVsc2UgaWYoYz09QUREfHxjPT1TVUIpeworCSAgaW50IGEscjtsb25nIGw9MTsKKwkgIGlmKGlzY29uc3QocTIpKXsKKwkgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHQyKTsKKwkgICAgbD16bTJsKHZtYXgpOworCSAgICBpZihpc2FjYyh6KSYmKGwmMHhmZmZmKTw9NzY4KXsKKwkgICAgICBsb2FkX2FjYyhmLCZwLT5xMSx0KTsKKwkgICAgICBpZihjPT1BREQpeworCQlpZihsJjB4ZmYpCisJCSAgZW1pdChmLCJcdGNsY1xuXHRhZGNcdCMlZFxuIiwoaW50KShsJjI1NSkpOworCQlsJj0weGZmZmY7CisJCWlmKGw9PTI1Nil7ZW1pdChmLCJcdGlueFxuIik7Y29udGludWU7fQorCQlpZihsPT01MTIpe2VtaXQoZiwiXHRpbnhcblx0aW54XG4iKTtjb250aW51ZTt9CisJCWlmKGw9PTc2OCl7ZW1pdChmLCJcdGlueFxuXHRpbnhcblx0aW54XG4iKTtjb250aW51ZTt9CisJCWlmKGw8MjU2KXsrK2xhYmVsO2VtaXQoZiwiXHRiY2NcdCVzJWRcblx0aW54XG4lcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwsbGFicHJlZml4LGxhYmVsKTtjb250aW51ZTt9CisJCWlmKGw8NTEyKXsrK2xhYmVsO2VtaXQoZiwiXHRpbnhcblx0YmNjXHQlcyVkXG5cdGlueFxuJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsLGxhYnByZWZpeCxsYWJlbCk7Y29udGludWU7fQorCQlpZihsPDc2OCl7KytsYWJlbDtlbWl0KGYsIlx0aW54XG5cdGlueFxuXHRiY2NcdCVzJWRcblx0aW54XG4lcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwsbGFicHJlZml4LGxhYmVsKTtjb250aW51ZTt9CisJICAgICAgfWVsc2V7CisJCWlmKGwmMHhmZikKKwkJICBlbWl0KGYsIlx0c2VjXG5cdHNiY1x0IyVkXG4iLChpbnQpKGwmMjU1KSk7CisJCWwmPTB4ZmZmZjsKKwkJaWYobD09MjU2KXtlbWl0KGYsIlx0ZGV4XG4iKTtjb250aW51ZTt9CisJCWlmKGw9PTUxMil7ZW1pdChmLCJcdGRleFxuXHRkZXhcbiIpO2NvbnRpbnVlO30KKwkJaWYobD09NzY4KXtlbWl0KGYsIlx0ZGV4XG5cdGRleFxuXHRkZXhcbiIpO2NvbnRpbnVlO30KKwkJaWYobDwyNTYpeysrbGFiZWw7ZW1pdChmLCJcdGJjc1x0JXMlZFxuXHRkZXhcbiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCxsYWJwcmVmaXgsbGFiZWwpO2NvbnRpbnVlO30KKwkJaWYobDw1MTIpeysrbGFiZWw7ZW1pdChmLCJcdGRleFxuXHRiY3NcdCVzJWRcblx0ZGV4XG4lcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwsbGFicHJlZml4LGxhYmVsKTtjb250aW51ZTt9CisJCWlmKGw8NzY4KXsrK2xhYmVsO2VtaXQoZiwiXHRkZXhcblx0ZGV4XG5cdGJjc1x0JXMlZFxuXHRkZXhcbiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCxsYWJwcmVmaXgsbGFiZWwpO2NvbnRpbnVlO30KKwkgICAgICB9CisJICAgIH0KKwkgICAgbCY9MHhmZjAwOworCSAgfQorCSAgaWYoaXNyZWcoeikmJnAtPnoucmVnPT1yYXgpIGE9MTsgZWxzZSBhPTA7CisJICBpZigodDImTlUpPT1DSEFSJiYocC0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKSE9S09OU1QpeworCSAgICBnZXRfYWNjKGYscCxJTlQpOworCSAgICBlbWl0KGYsIlx0bGR4XHQjMFxuIik7CisJICAgIGxvYWRfbG9ieXRlKGYsJnAtPnEyLHQpOworCSAgICBlbWl0KGYsIlx0YnBsXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgICAgZW1pdChmLCJcdGRleFxuIik7CisJICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgICAgaWYoYz09QUREKXsKKwkgICAgICBpZihjPT1BREQpIGVtaXQoZiwiXHRjbGNcbiIpOyBlbHNlIGVtaXQoZiwiXHRzZWNcbiIpOworCSAgICAgIGRvX2xvYnl0ZShmLHMsJnAtPnExLHQpOworCSAgICAgIGlmKGlzYWNjKHopKQorCQllbWl0KGYsIlx0cGhhXG4iKTsKKwkgICAgICBlbHNlCisJCXN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCSAgICAgIGVtaXQoZiwiXHR0eGFcbiIpOworCSAgICAgIGRvX2hpYnl0ZShmLHMsJnAtPnExLHQpOworCSAgICAgIHN0b3JlX2hpYnl0ZShmLCZwLT56LHQpOworCSAgICAgIGlmKElTRlBPSU5URVIocHQpJiYhY29tcGFyZV9vYmplY3RzKCZwLT5xMSwmcC0+eikpeworCQlkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSxwdCk7CisJCWRvX2J5dGUzKGYsInN0YSIsJnAtPnoscHQpOworCSAgICAgIH0KKwkgICAgICBpZihpc2FjYyh6KSkKKwkJZW1pdChmLCJcdHBsYVxuIik7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgICAgcj1nZXRfcmVnKGYscCxDSEFSKTsKKwkgICAgZW1pdChmLCJcdHN0eFx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgIH0KKwkgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgaWYoYz09QUREKSBlbWl0KGYsIlx0Y2xjXG4iKTsgZWxzZSBlbWl0KGYsIlx0c2VjXG4iKTsKKwkgIGRvX2xvYnl0ZShmLHMsJnAtPnEyLHQyKTsKKwkgIHN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCSAgaWYobD09MCYmaXNyZWcocTEpJiZpc3JlZyh6KSYmcC0+cTEucmVnPT1wLT56LnJlZyl7CisJICAgIGlmKGM9PUFERCl7CisJICAgICAgZW1pdChmLCJcdGJjY1x0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICAgICAgaWYoYSkKKwkJZW1pdChmLCJcdGlueFxuIik7CisJICAgICAgZWxzZXsKKwkJLyppZighcmVnX3BhaXIocC0+ei5yZWcsJnJwKSkgaWVycm9yKDApOyovCisJCWVtaXQoZiwiXHRpbmNcdCVzKzFcbiIsbXJlZ25hbWVzW3AtPnoucmVnXSk7CisJICAgICAgfQorCSAgICB9ZWxzZXsKKwkgICAgICBlbWl0KGYsIlx0YmNzXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgICAgICBpZihhKQorCQllbWl0KGYsIlx0ZGV4XG4iKTsKKwkgICAgICBlbHNleworCQlpZighcmVnX3BhaXIocC0+ei5yZWcsJnJwKSkgaWVycm9yKDApOworCQllbWl0KGYsIlx0ZGVjXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsKKwkgICAgICB9CisJICAgIH0KKwkgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwpOworCSAgfWVsc2V7CisJICAgIGlmKGE9PTEpIGVtaXQoZiwiXHRwaGFcbiIpOworCSAgICBpZigodDImTlEpPT1DSEFSKXsKKwkgICAgICBpZih0MiZVTlNJR05FRCl7CisJCWxvYWRfaGlieXRlKGYsJnAtPnExLHQpOworCQllbWl0KGYsIlx0JXNcdCMwXG4iLHMpOworCSAgICAgIH1lbHNleworCQlsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkJaWYoKHAtPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKwkJICBldmFsX2NvbnN0KCZwLT5xMi52YWwsdDIpOworCQkgIGlmKHptbGVxKFowLHZtYXgpKQorCQkgICAgZW1pdChmLCJcdCVzXHQjMFxuIixzKTsKKwkJICBlbHNlCisJCSAgICBlbWl0KGYsIlx0JXNcdCMyNTVcbiIscyk7CisJCX1lbHNleworCQkgIGVtaXQoZiwiXHQlc1x0JXNcbiIscyxtcmVnbmFtZXNbcl0pOworCQl9CisJICAgICAgfQorCSAgICB9ZWxzZXsKKwkgICAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgICBkb19oaWJ5dGUoZixzLCZwLT5xMix0Mik7CisJICAgIH0KKwkgICAgc3RvcmVfaGlieXRlKGYsJnAtPnosdCk7CisJICAgIGlmKGE9PTEpIGVtaXQoZiwiXHRwbGFcbiIpOworCSAgICBpZihJU0ZQT0lOVEVSKHB0KSYmcC0+Y29kZSE9U1VCUEZQKXsKKwkgICAgICBpZighY29tcGFyZV9vYmplY3RzKCZwLT5xMSwmcC0+eikpeworCQlkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSxGUE9JTlRFUik7CisJCWRvX2J5dGUzKGYsInN0YSIsJnAtPnosRlBPSU5URVIpOworCSAgICAgIH0KKwkgICAgfQorCSAgfQorCX1lbHNleworCSAgbG9uZyBsPS0xO2ludCBkZWxsbz0wOworCSAgaWYoYyE9QU5EJiZjIT1PUiYmYyE9WE9SKSBpZXJyb3IoMCk7CisJICBpZigocC0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworCSAgICBldmFsX2NvbnN0KCZwLT5xMi52YWwsdCk7CisJICAgIGw9em0ybCh2bWF4KSYweGZmZmY7CisJICB9CisJICBpZihsPjAmJigoYz09QU5EJiYobCYweEZGKT09MCl8fChjPT1PUiYmKGwmMHhGRik9PTB4RkYpKSl7CisJICAgIGRlbGxvPTE7CisJICB9ZWxzZSBpZihsPjAmJigoYz09QU5EJiYobCYweEZGKT09MHhGRil8fCgoYz09T1J8fGM9PVhPUikmJihsJjB4RkYpPT0wKSkpeworCSAgICBpZighY29tcGFyZV9vYmplY3RzKCZwLT5xMSwmcC0+eikpeworCSAgICAgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgICAgIHN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCSAgICB9CisJICB9ZWxzZXsKKwkgICAgbG9hZF9sb2J5dGUoZiwmcC0+cTEsdCk7CisJICAgIGRvX2xvYnl0ZShmLHMsJnAtPnEyLHQpOworCSAgICBzdG9yZV9sb2J5dGUoZiwmcC0+eix0KTsKKwkgIH0KKwkgIGlmKGw+MCYmKChjPT1BTkQmJihsJjB4RkYwMCk9PTApfHwoYz09T1ImJihsJjB4RkYwMCk9PTB4RkYwMCkpKXsKKwkgICAgaW50IHZhbD0oYz09QU5EKT8wOjI1NTsKKwkgICAgaWYoaXNhY2MoeikpeworCSAgICAgIGVtaXQoZiwiXHRsZHhcdCMlZFxuIix2YWwpOworCSAgICB9ZWxzZXsKKwkgICAgICBlbWl0KGYsIlx0bGRhXHQjJWRcbiIsdmFsKTsKKwkgICAgICBzdG9yZV9oaWJ5dGUoZiwmcC0+eix0KTsKKwkgICAgfQorCSAgfWVsc2UgaWYobD4wJiYoKGM9PUFORCYmKGwmMHhGRjAwKT09MHhGRjAwKXx8KChjPT1PUnx8Yz09WE9SKSYmKGwmMHhGRjAwKT09MCkpKXsKKwkgICAgaWYoaXNhY2MoeikmJiFpbmRpcmVjdCgmcC0+cTEpKXsKKwkgICAgICBkb19oaWJ5dGUoZiwibGR4IiwmcC0+cTEsdCk7CisJICAgIH1lbHNleworCSAgICAgIGlmKCFjb21wYXJlX29iamVjdHMoJnAtPnExLCZwLT56KSl7CisJCWlmKCFkZWxsbyYmaXNhY2MoeikpCisJCSAgZW1pdChmLCJcdHBoYVxuIik7CisJCWxvYWRfaGlieXRlKGYsJnAtPnExLHQpOworCQlzdG9yZV9oaWJ5dGUoZiwmcC0+eix0KTsKKwkJaWYoIWRlbGxvJiZpc2FjYyh6KSkKKwkJICBlbWl0KGYsIlx0cGxhXG4iKTsKKwkgICAgICB9CisJICAgIH0KKwkgIH1lbHNleworCSAgICBpZighZGVsbG8mJmlzYWNjKHopKQorCSAgICAgIGVtaXQoZiwiXHRwaGFcbiIpOworCSAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgZG9faGlieXRlKGYscywmcC0+cTIsdCk7CisJICAgIHN0b3JlX2hpYnl0ZShmLCZwLT56LHQpOworCSAgICBpZighZGVsbG8mJmlzYWNjKHopKQorCSAgICAgIGVtaXQoZiwiXHRwbGFcbiIpOworCSAgfQorCSAgaWYoZGVsbG8peworCSAgICBlbWl0KGYsIlx0bGRhXHQjJWRcbiIsKGM9PUFORCk/MDoyNTUpOworCSAgICBzdG9yZV9sb2J5dGUoZiwmcC0+eix0KTsKKwkgIH0KKwl9CisJY29udGludWU7CisgICAgICB9CisgICAgICBwcmljMihzdGRvdXQscCk7CisgICAgICBpZXJyb3IoMCk7CisgICAgfQorCisgICAgZnVuY3Rpb25fYm90dG9tKGYsdixsb2NhbHNpemUpOworICAgIAorICAgIGZvcihjPTE7Yzw9TUFYUjtjKyspeworICAgICAgaWYocmVnc2FbY118fHJlZ3VzZWRbY10peworCUJTRVQocmVnc19tb2RpZmllZCxjKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZihzdGFja192YWxpZCl7CisgICAgICBpZighdi0+ZmkpIHYtPmZpPW5ld19maSgpOworICAgICAgdi0+ZmktPmZsYWdzfD1BTExfU1RBQ0s7CisgICAgICB2LT5maS0+c3RhY2sxPXN0YWNrOworICAgIH0KKyAgfQorCisgIGZyZWVfSUMobWkpOworCisgIGVtaXQoZiwiOyBzdGFja3NpemU9JWx1JXNcbiIsenVtMnVsKHN0YWNrKSxzdGFja192YWxpZD8iIjoiKz8/Iik7Cit9CisKK2ludCBzaG9ydGN1dChpbnQgY29kZSxpbnQgdHlwKQoreworICBpZihjb2RlPT1DT01QQVJFfHxjb2RlPT1NVUxUfHxjb2RlPT1BRER8fGNvZGU9PVNVQnx8Y29kZT09QU5EfHxjb2RlPT1PUnx8Y29kZT09WE9SfHxjb2RlPT1MU0hJRlR8fGNvZGU9PVJTSElGVHx8Y29kZT09TUlOVVN8fGNvZGU9PUtPTVBMRU1FTlR8fGNvZGU9PU5FR0FUSU9OKQorICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZhdHRyKHR5cGUgKnAsY2hhciAqcykKK3sKKyAgaWYocC0+YXR0ciYmc3Ryc3RyKHAtPmF0dHIscykpCisgICAgcmV0dXJuIDE7CisgIGlmKHAtPm5leHQpCisgICAgcmV0dXJuIGZhdHRyKHAtPm5leHQscyk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworaW50IHJlZ19wYXJtKHN0cnVjdCByZWdfaGFuZGxlICptLCBzdHJ1Y3QgVHlwICp0LGludCB2YXJhcmcsc3RydWN0IFR5cCAqZCkKK3sKKyAgaW50IGY7CisKKyAgaWYodmFyYXJnKQorICAgIHJldHVybiAwOworICBmPXQtPmZsYWdzJk5ROworICBpZihPTERGUCYmSVNGTE9BVChmKSkgcmV0dXJuIDA7CisgIGlmKGQmJmZhdHRyKGQsIl9fc3RhY2twYXJtc19fIikpCisgICAgcmV0dXJuIDA7CisgIGlmKGQmJmZhdHRyKGQsIl9fY2M2NV9fIikpeworICAgIG0tPnJlZ3MrKzsKKyAgICBwcmludGYoImFyZz0lZCBjbnQ9JWRcbiIsbS0+cmVncyxkLT5leGFjdC0+Y291bnQpOworICAgIGlmKG0tPnJlZ3M9PWQtPmV4YWN0LT5jb3VudC0xKXsKKyAgICAgIGlmKElTQ0hBUih0LT5mbGFncykpCisJcmV0dXJuIHJhOworICAgICAgaWYoSVNTSE9SVCh0LT5mbGFncykpCisJcmV0dXJuIHJheDsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYoSVNDSEFSKGYpKXsKKyAgICBpZighdC0+ZXhhY3QpeworICAgICAgaWYobS0+cmVncz49R1BSX0FSR1MtMSkKKwlyZXR1cm4gMDsKKyAgICAgIGY9RklSU1RfR1BSK20tPnJlZ3M7CisgICAgICBtLT5yZWdzKz0yOworICAgICAgcmV0dXJuIGY7CisgICAgfWVsc2V7CisgICAgICBpZihtLT5yZWdzPj1HUFJfQVJHUykKKwlyZXR1cm4gMDsKKyAgICAgIGVsc2UKKwlyZXR1cm4gRklSU1RfR1BSK20tPnJlZ3MrKzsKKyAgICB9CisgIH0KKyAgaWYoSVNTSE9SVChmKXx8Zj09UE9JTlRFUil7CisgICAgaWYobS0+cmVncz49R1BSX0FSR1MtMSkKKyAgICAgIHJldHVybiAwOworICAgIGVsc2V7CisgICAgICBpZihtLT5yZWdzJjEpIG0tPnJlZ3MrPTE7CisgICAgICBtLT5yZWdzKz0yOworICAgICAgcmV0dXJuIEZJUlNUX1BBSVIrbS0+cmVncy8yLTE7CisgICAgfQorICB9CisgIGlmKGY9PUZQT0lOVEVSfHxmPT1MT05HfHxmPT1GTE9BVHx8KCFpZWVlJiYoZj09RE9VQkxFfHxmPT1MRE9VQkxFKSkpeworICAgIGlmKG0tPmJyZWdzPj00KQorICAgICAgcmV0dXJuIDA7CisgICAgZWxzZQorICAgICAgcmV0dXJuIEZJUlNUX0JJRyttLT5icmVncysrOworICB9CisgIGlmKGY9PUxMT05HfHwoaWVlZSYmKGY9PURPVUJMRXx8Zj09TERPVUJMRSkpKXsKKyAgICBpZihtLT5icmVncz49MykKKyAgICAgIHJldHVybiAwOworICAgIGVsc2V7CisgICAgICBpZihtLT5icmVncyYxKSAgbS0+YnJlZ3MrKzsKKyAgICAgIG0tPmJyZWdzKz0yOworICAgICAgcmV0dXJuIEZJUlNUX0JJR1ArbS0+YnJlZ3MvMi0xOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IGhhbmRsZV9wcmFnbWEoY29uc3QgY2hhciAqcykKK3sKKyAgc3RhdGljIGNoYXIgc2VjW1NFQ0xFTl07CisgIGludCBpOworICBpZihzc2NhbmYocywic2VjdGlvbiAlMTI3cyIsc2VjKT09MSl7CisgICAgaWYoIXN0cmNtcChzZWMsImRlZmF1bHQiKSkKKyAgICAgIHVzZV9zZWM9MDsKKyAgICBlbHNlCisgICAgICB1c2Vfc2VjPXNlYzsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZihzc2NhbmYocywiYmFuayAlZCIsJmkpPT0xKXsKKyAgICB1c2VfYmFuaz1pOworICAgIHJldHVybiAxOworICB9Cit9Cit2b2lkIGNsZWFudXBfY2coRklMRSAqZikKK3sKKyAgaW50IGk7CisgIHN0cnVjdCBmcGNvbnN0bGlzdCAqcD1maXJzdGZwYzsKKworICBpZihmJiZwKXsKKyAgICBlbWl0KGYscm9kYXRhbmFtZSk7ZW1pdChmLCJcbiIpOworICAgIHNlY3Rpb249Uk9EQVRBOworICB9CisgIHdoaWxlKHA9Zmlyc3RmcGMpeworICAgIGVtaXQoZiwiJXMlZDpcblx0d29yZFx0IixsYWJwcmVmaXgscC0+bGFiZWwpOworICAgIGlmKGllZWUpCisgICAgICBlbWl0X2llZWUoZiwmcC0+dmFsLHAtPnQpOworICAgIGVsc2V7CisgICAgICBpbnQgd29yZHM9em0ybChzaXpldGFiW3AtPnQmTlFdKS8yOworICAgICAgZXZhbF9jb25zdCgmcC0+dmFsLHAtPnQpOworICAgICAgaWYoSVNGTE9BVChwLT50KSkgY252X2ZwKCk7CisgICAgICBmb3IoaT0wO2k8d29yZHM7aSsrKXsKKwllbWl0KGYsIiVsZCIsem0ybCh2bWF4KSYweGZmZmYpOworCWlmKGk8d29yZHMtMSl7ZW1pdChmLCIsIik7dm1heD16bXJzaGlmdCh2bWF4LGwyem0oMTZMKSk7fQorICAgICAgfQorICAgICAgZW1pdChmLCJcbiIpOworICAgICAgLyplbWl0KGYsIiVsZCwlbGRcbiIsem0ybCh2bWF4KSYweGZmZmYsem0ybCh6bXJzaGlmdCh2bWF4LGwyem0oMTZMKSkpJjB4ZmZmZik7Ki8KKyAgICB9CisgICAgZmlyc3RmcGM9cC0+bmV4dDsKKyAgICBmcmVlKHApOworICB9CisKKyAgZW1pdChmLCJcdHpwYWdlXHQlc1xuIixtcmVnbmFtZXNbc3BdKTsKKyAgZm9yKGk9RklSU1RfR1BSO2k8PUxBU1RfR1BSO2krKykKKyAgICBlbWl0KGYsIlx0enBhZ2VcdCVzXG4iLG1yZWduYW1lc1tpXSk7CisgIGZvcihpPUZJUlNUX0JJRztpPD1MQVNUX0JJRztpKyspCisgICAgZW1pdChmLCJcdHpwYWdlXHQlc1xuIixtcmVnbmFtZXNbaV0pOworCit9Cit2b2lkIGNsZWFudXBfZGIoRklMRSAqZikKK3sKKyAgaWYoZikgc2VjdGlvbj0tMTsKK30KKworc3RhdGljIGNoYXIgKnpvcHNbXT17CisgICJhZGMiLCJhbmQiLCJhc2wiLCJiaXQiLCJlb3IiLCJsZGEiLCJvcmEiLAorICAidGF4IiwidHhhIiwidGF5IiwidHlhIiwic2JjIn07CisKK3N0YXRpYyBpbnQgc2V0c3pmbGFnKGNoYXIgKm9wKQoreworICBpbnQgaTsKKyAgZm9yKGk9MDtpPHNpemVvZih6b3BzKS9zaXplb2Yoem9wc1swXSk7aSsrKQorICAgIGlmKCFzdHJjbXAob3Asem9wc1tpXSkpCisgICAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICp6eG9wc1tdPXsKKyAgInRheCIsInR4YSIsImxkeCIsImlueCIsImRleCJ9OworCitzdGF0aWMgaW50IHNldHN6eGZsYWcoY2hhciAqb3ApCit7CisgIGludCBpOworICBmb3IoaT0wO2k8c2l6ZW9mKHp4b3BzKS9zaXplb2YoenhvcHNbMF0pO2krKykKKyAgICBpZighc3RyY21wKG9wLHp4b3BzW2ldKSkKKyAgICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworZW51bSBwZWVwZiB7IE5FRURTQU1FID0gMSwgUkVNT1ZFMVNUID0gMn07CitzdHJ1Y3QgcGVlcHMge2NoYXIgKnMxLCpzMiwqcjtlbnVtIHBlZXBmIGZsYWdzO307CisKKworCitpbnQgZW1pdF9wZWVwaG9sZSh2b2lkKQoreworICBpbnQgZW50cmllcyxpLGo7CisgIGNoYXIgKmFzbWxpbmVbRU1JVF9CVUZfREVQVEhdOworICBjaGFyIGJ1ZjFbMTAyNF0sYnVmMlsxMDI0XTsKKyAgY2hhciBvcDFbOF0sb3AyWzhdOworICBzdGF0aWMgY2hhciBjYVsxMDI0XSxjeFsxMDI0XSxjeVsxMDI0XSxjelsxMDI0XTsKKyAgc3RhdGljIGludCBybSxkaXNhYmxlZDsKKworICBzdGF0aWMgc3RydWN0IHBlZXBzIGVsaW1bXT17CisgICAgImxkYSIsInN0YSIsMCxORUVEU0FNRSwKKyAgICAibGR4Iiwic3R4IiwwLE5FRURTQU1FLAorICAgICJsZHkiLCJzdHkiLDAsTkVFRFNBTUUsCisgICAgImxkeiIsInN0eiIsMCxORUVEU0FNRSwKKyAgICAibGRxIiwic3RxIiwwLE5FRURTQU1FLAorICAgICJzdGEiLCJzdGEiLDAsTkVFRFNBTUUsCisgICAgInN0eCIsInN0eCIsMCxORUVEU0FNRSwKKyAgICAic3R5Iiwic3R5IiwwLE5FRURTQU1FLAorICAgICJzdHoiLCJzdHoiLDAsTkVFRFNBTUUsCisgICAgInN0cSIsInN0cSIsMCxORUVEU0FNRSwKKyAgICAic3RhIiwibGRhIiwwLE5FRURTQU1FLAorICAgICJzdHgiLCJsZHgiLDAsTkVFRFNBTUUsCisgICAgInN0eSIsImxkeSIsMCxORUVEU0FNRSwKKyAgICAic3R6IiwibGR6IiwwLE5FRURTQU1FLAorICAgICJzdHEiLCJsZHEiLDAsTkVFRFNBTUUsCisgICAgInR4YSIsInRheCIsMCwwLAorICAgICJ0YXgiLCJ0eGEiLDAsMCwKKyAgICAidGF5IiwidHlhIiwwLDAsCisgICAgInR5YSIsInRheSIsMCwwLAorICAgICJ0emEiLCJ0YXoiLDAsMCwKKyAgICAidGF6IiwidHphIiwwLDAsCisgICAgImxkYSIsImxkYSIsMCxSRU1PVkUxU1QsCisgICAgImxkeCIsImxkeCIsMCxSRU1PVkUxU1QsCisgICAgImxkeSIsImxkeSIsMCxSRU1PVkUxU1QsCisgICAgImxkeiIsImxkeiIsMCxSRU1PVkUxU1QsCisgICAgImxkcSIsImxkcSIsMCxSRU1PVkUxU1QsCisgICAgImxkYSIsImxkcSIsMCxSRU1PVkUxU1QsCisgICAgImxkeCIsImxkcSIsMCxSRU1PVkUxU1QsCisgICAgImxkeSIsImxkcSIsMCxSRU1PVkUxU1QsCisgICAgImxkYSIsInBsYSIsMCxSRU1PVkUxU1QsCisgICAgImxkeCIsInBseCIsMCxSRU1PVkUxU1QsCisgICAgImxkeSIsInBseSIsMCxSRU1PVkUxU1QsCisgICAgImxkeiIsInBseiIsMCxSRU1PVkUxU1QsCisgICAgImxkYSIsInR4YSIsMCxSRU1PVkUxU1QsCisgICAgImxkYSIsInR5YSIsMCxSRU1PVkUxU1QsCisgICAgImxkYSIsInR6YSIsMCxSRU1PVkUxU1QsCisgICAgImxkeCIsInRheCIsMCxSRU1PVkUxU1QsCisgICAgImxkeSIsInRheSIsMCxSRU1PVkUxU1QsCisgICAgImxkeiIsInRheiIsMCxSRU1PVkUxU1QsCisgICAgInRheSIsImxkeSIsMCxSRU1PVkUxU1QsCisgICAgInRheCIsImxkeCIsMCxSRU1PVkUxU1QsCisgICAgInRheiIsImxkeiIsMCxSRU1PVkUxU1QsCisgICAgInR4YSIsImxkYSIsMCxSRU1PVkUxU1QsCisgICAgInR5YSIsImxkYSIsMCxSRU1PVkUxU1QsCisgICAgInR6YSIsImxkYSIsMCxSRU1PVkUxU1QsCisgICAgImxkYSIsImxkeCIsIlx0dGF4XG4iLE5FRURTQU1FLAorICAgICJsZGEiLCJsZHkiLCJcdHRheVxuIixORUVEU0FNRSwKKyAgICAibGRhIiwibGR6IiwiXHR0YXpcbiIsTkVFRFNBTUUsCisgICAgImxkeCIsImxkYSIsIlx0dHhhXG4iLE5FRURTQU1FLAorICAgICJsZHkiLCJsZGEiLCJcdHR5YVxuIixORUVEU0FNRSwKKyAgICAibGR6IiwibGRhIiwiXHR0emFcbiIsTkVFRFNBTUUsCisgICAgInN0YSIsImxkeCIsIlx0dGF4XG4iLE5FRURTQU1FLAorICAgICJzdGEiLCJsZHkiLCJcdHRheVxuIixORUVEU0FNRSwKKyAgICAic3RhIiwibGR6IiwiXHR0YXpcbiIsTkVFRFNBTUUsCisgICAgInN0eCIsImxkYSIsIlx0dHhhXG4iLE5FRURTQU1FLAorICAgICJzdHkiLCJsZGEiLCJcdHR5YVxuIixORUVEU0FNRSwKKyAgICAic3R6IiwibGRhIiwiXHR0emFcbiIsTkVFRFNBTUUsIC8qIG11c3QgYmUgbGFzdCAqLworICB9OworCisgIGlmKG5vcGVlcCkgcmV0dXJuIDA7CisKKyAgLyogYWN0aXZhdGUgb3B0aW1pemF0aW9uIHRoYXQgaXMgbm90IHZhbGlkIGZvciBjMDIgKi8KKyAgaWYoIWNlMDIpIGVsaW1bc2l6ZW9mKGVsaW0pL3NpemVvZihlbGltWzBdKS0xXS5yPSJcdGxkYVx0IzBcbiI7CisKKyAgaT1lbWl0X2w7CisgIGlmKGVtaXRfZj09MCkKKyAgICBlbnRyaWVzPWktZW1pdF9mKzE7CisgIGVsc2UKKyAgICBlbnRyaWVzPUVNSVRfQlVGX0RFUFRIOworICBhc21saW5lWzBdPWVtaXRfYnVmZmVyW2ldOworCisgIGlmKCFzdHJjbXAoYXNtbGluZVswXSwiO3N0YXJ0aW5saW5lXG4iKSkgZGlzYWJsZWQ9MTsKKyAgaWYoIXN0cmNtcChhc21saW5lWzBdLCI7ZW5kaW5saW5lXG4iKSkgZGlzYWJsZWQ9MDsKKyAgaWYoZGlzYWJsZWQpIHJldHVybiAwOworCisgIGJ1ZjFbMF09MDtvcDFbMF09MDsKKyAgaWYoKGo9c3NjYW5mKGFzbWxpbmVbMF0sIiAlNnMgJTk5OXMiLG9wMSxidWYxKSk+PTEpeworICAgIC8qcHJpbnRmKCJhPSVzIHg9JXMgeT0lcyB6PSVzXG4iLGNhLGN4LGN5LGN6KTsKKyAgICAgIHByaW50ZigiXHRcdCVzICVzXG4iLG9wMSxidWYxKTsqLworICAgIGlmKCFzdHJjbXAob3AxLCJsZGEiKSl7CisgICAgICBpZihidWYxWzBdPT0nIycpeworCWlmKCFybSYmIXN0cmNtcChidWYxLGNhKSl7cmVtb3ZlX2FzbSgpO3JldHVybiBybT0xO30KKwlpZighcm0mJiFzdHJjbXAoYnVmMSxjeCkpe3N0cmNweShhc21saW5lWzBdLCJcdHR4YVxuIik7cmV0dXJuIHJtPTE7fQorCWlmKCFybSYmIXN0cmNtcChidWYxLGN5KSl7c3RyY3B5KGFzbWxpbmVbMF0sIlx0dHlhXG4iKTtyZXR1cm4gcm09MTt9CisJaWYoIXJtJiYhc3RyY21wKGJ1ZjEsY3opKXtzdHJjcHkoYXNtbGluZVswXSwiXHR0emFcbiIpO3JldHVybiBybT0xO30KKwlzdHJjcHkoY2EsYnVmMSk7CisgICAgICB9ZWxzZSBjYVswXT0wOworICAgIH1lbHNlIGlmKCFzdHJjbXAob3AxLCJsZHgiKSl7CisgICAgICBpZihidWYxWzBdPT0nIycpeworCWlmKCFybSYmIXN0cmNtcChidWYxLGN4KSl7cmVtb3ZlX2FzbSgpO3JldHVybiBybT0xO30KKwlpZighcm0mJiFzdHJjbXAoYnVmMSxjYSkpe3N0cmNweShhc21saW5lWzBdLCJcdHRheFxuIik7cmV0dXJuIHJtPTE7fQorCXN0cmNweShjeCxidWYxKTsKKyAgICAgIH1lbHNlIGN4WzBdPTA7CisgICAgfWVsc2UgaWYoIXN0cmNtcChvcDEsImxkeSIpKXsKKyAgICAgIGlmKGJ1ZjFbMF09PScjJyl7CisJaWYoIXJtJiYhc3RyY21wKGJ1ZjEsY3kpKXtyZW1vdmVfYXNtKCk7cmV0dXJuIHJtPTE7fQorCWlmKCFybSYmIXN0cmNtcChidWYxLGNhKSl7c3RyY3B5KGFzbWxpbmVbMF0sIlx0dGF5XG4iKTtyZXR1cm4gcm09MTt9CisJc3RyY3B5KGN5LGJ1ZjEpOworICAgICAgfWVsc2UgY3lbMF09MDsKKyAgICB9ZWxzZSBpZighc3RyY21wKG9wMSwibGR6IikpeworICAgICAgaWYoYnVmMVswXT09JyMnKXsKKwlpZighcm0mJiFzdHJjbXAoYnVmMSxjeikpe3JlbW92ZV9hc20oKTtyZXR1cm4gcm09MTt9CisJaWYoIXJtJiYhc3RyY21wKGJ1ZjEsY2EpKXtzdHJjcHkoYXNtbGluZVswXSwiXHR0YXpcbiIpO3JldHVybiBybT0xO30KKwlzdHJjcHkoY3osYnVmMSk7CisgICAgICB9ZWxzZSBjelswXT0wOworICAgIH1lbHNleworICAgICAgc3RhdGljIGNoYXIgY2xvYmJlcm5vbmVbXT0iYXN3IGJpdCBjbGMgY2xkIGNsaSBjbHYgY21wIGNweCBjcHkgZGVjIGRlcSBkZXcgaW5jIGlucSBpbncgbm9wIHBoYSBwaHAgcGh3IHBoeiBwbHAgc2VjIHNlZCBzZWkgc3RhIHN0cSBzdHggc3R5IjsKKyAgICAgIHN0YXRpYyBjaGFyIGNsb2JiZXJhW109ImFkYyBhbmQgYXNsIGFzciBlb3IgbHNyIG9yYSBwbGEgcm9sIHJvciBzYmMgdHhhIHR5YSB0emEiOworICAgICAgc3RhdGljIGNoYXIgY2xvYmJlcnhbXT0iZGV4IGlueCB0YXggdHN4IjsKKyAgICAgIHN0YXRpYyBjaGFyIGNsb2JiZXJ5W109ImRleSBpbnkgdGF5IjsKKyAgICAgIHN0YXRpYyBjaGFyIGNsb2JiZXJ6W109ImRleiBpbnogdGF6IjsKKyAgICAgIGlmKHN0cnN0cihjbG9iYmVybm9uZSxvcDEpKXsKKyAgICAgIH1lbHNlIGlmKHN0cnN0cihjbG9iYmVyYSxvcDEpKQorCWNhWzBdPTA7CisgICAgICBlbHNlIGlmKHN0cnN0cihjbG9iYmVyeCxvcDEpKQorCWN4WzBdPTA7CisgICAgICBlbHNlIGlmKHN0cnN0cihjbG9iYmVyeSxvcDEpKQorCWN5WzBdPTA7CisgICAgICBlbHNlIGlmKHN0cnN0cihjbG9iYmVyeixvcDEpKQorCWN6WzBdPTA7CisgICAgICBlbHNlCisJY2FbMF09Y3hbMF09Y3lbMF09Y3pbMF09MDsKKyAgICB9CisgIH1lbHNleworICAgIGNhWzBdPWN4WzBdPWN5WzBdPWN6WzBdPTA7CisgIH0KKworICBybT0wOworCisgIGlmKHNzY2FuZihhc21saW5lWzBdLCIgJTZzICU5OTlzIixvcDEsYnVmMSk9PTImJiFzdHJjbXAob3AxLCJhbmQiKSYmIXN0cmNtcChidWYxLCIjMCIpKXsKKyAgICBzdHJjcHkoYXNtbGluZVswXSwiXHRsZGFcdCMwXG4iKTsKKyAgICByZXR1cm4gcm09MTsKKyAgfQorCisgIGlmKGVudHJpZXM+PTIpeworICAgIGktLTsKKyAgICBpZihpPDApIGk9RU1JVF9CVUZfREVQVEgtMTsKKyAgICBhc21saW5lWzFdPWVtaXRfYnVmZmVyW2ldOworCisKKyAgICBpZighc3RyY21wKGFzbWxpbmVbMF0sIjsgdm9sYXRpbGUgYmFycmllclxuIikmJiFzdHJjbXAoYXNtbGluZVswXSxhc21saW5lWzFdKSl7CisgICAgICByZW1vdmVfYXNtKCk7CisgICAgICByZXR1cm4gcm09MTsKKyAgICB9CisKKyAgICBpZihzc2NhbmYoYXNtbGluZVswXSwiICU2cyIsb3AxKT09MSYmIXN0cmNtcChvcDEsInJ0cyIpJiYKKyAgICAgICBzc2NhbmYoYXNtbGluZVsxXSwiICU2cyAlOTk5cyIsb3AyLGJ1ZjIpPT0yJiYhc3RyY21wKG9wMiwianNyIikpeworICAgICAgc3ByaW50Zihhc21saW5lWzFdLCJcdGptcFx0JXNcbiIsYnVmMik7CisgICAgICByZW1vdmVfYXNtKCk7CisgICAgICByZXR1cm4gcm09MTsKKyAgICB9CisKKyAgICBmb3Ioaj0wO2o8c2l6ZW9mKGVsaW0pL3NpemVvZihlbGltWzBdKTtqKyspeworICAgICAgaWYoZWxpbVtqXS5mbGFncyZORUVEU0FNRSl7CisJaWYoc3NjYW5mKGFzbWxpbmVbMF0sIiAlNnMgJTk5OXMiLG9wMixidWYyKT09MiYmCisJICAgc3NjYW5mKGFzbWxpbmVbMV0sIiAlNnMgJTk5OXMiLG9wMSxidWYxKT09MiYmCisJICAgIXN0cmNtcChvcDEsZWxpbVtqXS5zMSkmJiFzdHJjbXAob3AyLGVsaW1bal0uczIpJiYKKwkgICAhc3RyY21wKGJ1ZjEsYnVmMikpeworCSAgaWYoZWxpbVtqXS5yKXsKKwkgICAgc3RyY3B5KGFzbWxpbmVbMF0sZWxpbVtqXS5yKTsKKwkgIH1lbHNleworCSAgICBpZihlbGltW2pdLmZsYWdzJlJFTU9WRTFTVCkKKwkgICAgICBzdHJjcHkoYXNtbGluZVsxXSxhc21saW5lWzBdKTsKKwkgICAgcmVtb3ZlX2FzbSgpOworCSAgfQorCSAgcmV0dXJuIHJtPTE7CisJfQorICAgICAgfWVsc2V7CisJaWYoc3NjYW5mKGFzbWxpbmVbMV0sIiAlNnMiLG9wMSk9PTEmJgorCSAgIHNzY2FuZihhc21saW5lWzBdLCIgJTZzIixvcDIpPT0xJiYKKwkgICAhc3RyY21wKG9wMSxlbGltW2pdLnMxKSYmIXN0cmNtcChvcDIsZWxpbVtqXS5zMikpeworCSAgaWYoZWxpbVtqXS5mbGFncyZSRU1PVkUxU1QpCisJICAgIHN0cmNweShhc21saW5lWzFdLGFzbWxpbmVbMF0pOworCSAgcmVtb3ZlX2FzbSgpOworCSAgcmV0dXJuIHJtPTE7CisJfQorICAgICAgfQorICAgIH0KKworCisgIH0KKworICBpZihlbnRyaWVzPj0zKXsKKyAgICBpLS07CisgICAgaWYoaTwwKSBpPUVNSVRfQlVGX0RFUFRILTE7CisgICAgYXNtbGluZVsyXT1lbWl0X2J1ZmZlcltpXTsKKyAgICBpZihzc2NhbmYoYXNtbGluZVswXSwiICU2cyAlOTk5cyIsb3AxLGJ1ZjEpPT0yKXsKKyNpZiAwCisgICAgICBpZighc3RyY21wKG9wMSwibGRhIikmJmJ1ZjFbMF09PScjJyl7CisJaWYoc3NjYW5mKGFzbWxpbmVbMV0sIiAlNnMgJTk5OXMiLG9wMixidWYyKT09MiYmCisJICAgIXN0cmNtcChvcDIsInN0YSIpKXsKKwkgIGlmKHNzY2FuZihhc21saW5lWzJdLCIgJTZzICU5OTlzIixvcDIsYnVmMik9PTImJgorCSAgICAgIXN0cmNtcChvcDIsImxkYSIpJiYhc3RyY21wKGJ1ZjEsYnVmMikpeworCSAgICByZW1vdmVfYXNtKCk7CisJICAgIHJldHVybiBybT0xOworCSAgfQorCX0KKyAgICAgIH0KKyNlbmRpZgorICAgICAgaWYoIXN0cmNtcChvcDEsImJlcSIpfHwhc3RyY21wKG9wMSwiYm5lIikpeworCWlmKHNzY2FuZihhc21saW5lWzFdLCIgJTZzICU5OTlzIixvcDIsYnVmMik9PTImJgorCSAgICFzdHJjbXAob3AyLCJjbXAiKSYmIXN0cmNtcChidWYyLCIjMCIpKXsKKwkgIGlmKHNzY2FuZihhc21saW5lWzJdLCIgJTZzIixvcDIpPT0xJiYKKwkgICAgIHNldHN6ZmxhZyhvcDIpKXsKKwkgICAgc3RyY3B5KGFzbWxpbmVbMV0sYXNtbGluZVswXSk7CisJICAgIHJlbW92ZV9hc20oKTsKKwkgICAgcmV0dXJuIHJtPTE7CisJICB9CisJfQorICAgICAgfQorICAgICAgaWYoIXN0cmNtcChvcDEsImJlcSIpfHwhc3RyY21wKG9wMSwiYm5lIikpeworCWlmKHNzY2FuZihhc21saW5lWzFdLCIgJTZzICU5OTlzIixvcDIsYnVmMik9PTImJgorCSAgICFzdHJjbXAob3AyLCJjcHgiKSYmIXN0cmNtcChidWYyLCIjMCIpKXsKKwkgIGlmKHNzY2FuZihhc21saW5lWzJdLCIgJTZzIixvcDIpPT0xJiYKKwkgICAgIHNldHN6eGZsYWcob3AyKSl7CisJICAgIHN0cmNweShhc21saW5lWzFdLGFzbWxpbmVbMF0pOworCSAgICByZW1vdmVfYXNtKCk7CisJICAgIHJldHVybiBybT0xOworCSAgfQorCX0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoZW50cmllcz49NCl7CisgICAgaS0tOworICAgIGlmKGk8MCkgaT1FTUlUX0JVRl9ERVBUSC0xOworICAgIGFzbWxpbmVbM109ZW1pdF9idWZmZXJbaV07CisgIH0KKyAgaWYoZW50cmllcz49NSl7CisgICAgaS0tOworICAgIGlmKGk8MCkgaT1FTUlUX0JVRl9ERVBUSC0xOworICAgIGFzbWxpbmVbNF09ZW1pdF9idWZmZXJbaV07CisgICAgaWYoc3NjYW5mKGFzbWxpbmVbMF0sIiAlcyAlcyIsb3AxLGJ1ZjEpPj0xKXsKKyAgICAgIGlmKCFzdHJjbXAob3AxLCJsZGEiKXx8IXN0cmNtcChvcDEsInBsYSIpfHwhc3RyY21wKG9wMSwidHhhIil8fCFzdHJjbXAob3AxLCJ0eWEiKSl7CisJaWYoc3NjYW5mKGFzbWxpbmVbMV0sIiAlcyAlcyIsb3AxLGJ1ZjEpPj0xJiYhc3RyY21wKG9wMSwicGxhIikmJgorCSAgIHNzY2FuZihhc21saW5lWzJdLCIgJXMgJXMiLG9wMSxidWYxKT49MSYmIXN0cmNtcChvcDEsInRheSIpJiYKKwkgICBzc2NhbmYoYXNtbGluZVszXSwiICVzICVzIixvcDEsYnVmMSk+PTEmJiFzdHJjbXAob3AxLCJ0eGEiKSYmCisJICAgc3NjYW5mKGFzbWxpbmVbNF0sIiAlcyAlcyIsb3AxLGJ1ZjEpPj0xJiYhc3RyY21wKG9wMSwicGhhIikpeworCSAgc3RyY3B5KGFzbWxpbmVbNF0sYXNtbGluZVszXSk7CisJICBzdHJjcHkoYXNtbGluZVszXSxhc21saW5lWzJdKTsKKwkgIHN0cmNweShhc21saW5lWzJdLGFzbWxpbmVbMF0pOworCSAgcmVtb3ZlX2FzbSgpOworCSAgcmVtb3ZlX2FzbSgpOworCSAgcmV0dXJuIHJtPTE7CisJfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworLyogUmV0dXJuIG5hbWUgb2YgbGlicmFyeSBmdW5jdGlvbiwgaWYgdGhpcyBub2RlIHNob3VsZCBiZQorICAgaW1wbGVtZW50ZWQgdmlhIGxpYmNhbGwuICovCitjaGFyICp1c2VfbGliY2FsbChpbnQgYyxpbnQgdCxpbnQgdDIpCit7CisgIHN0YXRpYyBjaGFyIGZuYW1lWzE2XTsKKyAgY2hhciAqcmV0PTA7CisKKyAgaWYoYz09Q09NUEFSRSl7CisgICAgaWYoKHQmTlEpPT1MTE9OR3x8KElTRkxPQVQodCkmJiFpZWVlKSl7CisgICAgICBzcHJpbnRmKGZuYW1lLCJfX2NtcCVzJXMlbGQiLCh0JlVOU0lHTkVEKT8idSI6InMiLElTRkxPQVQodCk/ImZsdCI6ImludCIsem0ybChzaXpldGFiW3QmTlFdKSo4KTsKKyAgICAgIHJldD1mbmFtZTsKKyAgICB9CisgIH1lbHNleworICAgIHQmPU5VOworICAgIHQyJj1OVTsKKyAgICBpZihJU1NIT1JUKHQpJiZjIT1NVUxUJiZjIT1ESVYmJmMhPU1PRCYmIUlTRkxPQVQodDIpKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYoSVNMT05HKHQpJiZjIT1NVUxUJiZjIT1ESVYmJmMhPU1PRCYmIUlTRkxPQVQodDIpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBpZighaWVlZSYmSVNGTE9BVCh0KSkgdD1GTE9BVDsKKyAgICBpZih0PT1MRE9VQkxFKSB0PURPVUJMRTsKKyAgICBpZih0Mj09TERPVUJMRSkgdDI9RE9VQkxFOworICAgIGlmKCFpZWVlJiZJU0ZMT0FUKHQyKSkgdDI9RkxPQVQ7CisgICAgaWYoYz09Q09OVkVSVCl7CisgICAgICBpZih0PT10MikgcmV0dXJuIDA7CisgICAgICBpZih0PT1GTE9BVCYmdDI9PURPVUJMRSkgcmV0dXJuICJfX2ZsdDY0dG9mbHQzMiI7CisgICAgICBpZih0PT1ET1VCTEUmJnQyPT1GTE9BVCkgcmV0dXJuICJfX2ZsdDMydG9mbHQ2NCI7CisKKyAgICAgIGlmKElTRkxPQVQodCkpeworICAgICAgICBzcHJpbnRmKGZuYW1lLCJfXyVjaW50JWxkdG9mbHQlZCIsKHQyJlVOU0lHTkVEKT8ndSc6J3MnLHptMmwoc2l6ZXRhYlt0MiZOUV0pKjgsKHQ9PUZMT0FUKT8zMjo2NCk7CisgICAgICAgIHJldD1mbmFtZTsKKyAgICAgIH0KKyAgICAgIGlmKElTRkxPQVQodDIpKXsKKyAgICAgICAgc3ByaW50ZihmbmFtZSwiX19mbHQlZHRvJWNpbnQlbGQiLCgodDImTlUpPT1GTE9BVCk/MzI6NjQsKHQmVU5TSUdORUQpPyd1Jzoncycsem0ybChzaXpldGFiW3QmTlFdKSo4KTsKKyAgICAgICAgcmV0PWZuYW1lOworICAgICAgfQorICAgIH0KKyAgICBpZihjPT1NVUxUJiYodCZOUSk9PUNIQVImJiFtNjUpIHJldHVybiAiX19tdWxpbnQ4IjsKKyAgICBpZigodCZOUSk9PVNIT1JUfHwodCZOUSk9PUlOVHx8KHQmTlEpPT1MT05HfHwodCZOUSk9PUxMT05HfHwoIWllZWUmJklTRkxPQVQodCkpKXsKKyAgICAgIGlmKChjPj1MU0hJRlQmJmM8PU1PRCl8fChjPj1PUiYmYzw9QU5EKXx8Yz09S09NUExFTUVOVHx8Yz09TUlOVVMpeworCWlmKG02NSYmSVNMT05HKHQpJiYoYz09TVVMVHx8KGM9PURJViYmIWRpdmJ1ZyYmKHQmVU5TSUdORUQpKSkpIHJldHVybiAwOworCWlmKG02NSYmYz09TVVMVCYmSVNTSE9SVCh0KSkgcmV0dXJuIDA7CisgICAgICAgIGlmKHQ9PShVTlNJR05FRHxMTE9ORykmJihjPT1NVUxUfHxjPT1ESVZ8fGM9PU1PRHx8Yz09UlNISUZUKSl7CisgICAgICAgICAgc3ByaW50ZihmbmFtZSwiX18lc3VpbnQ2NCIsZW5hbWVbY10pOworICAgICAgICAgIHJldD1mbmFtZTsKKyAgICAgICAgfWVsc2UgaWYoKHQmTlEpPT1MTE9ORyl7CisgICAgICAgICAgc3ByaW50ZihmbmFtZSwiX18lc2ludDY0IixlbmFtZVtjXSk7CisgICAgICAgICAgcmV0PWZuYW1lOworICAgICAgICB9ZWxzZSBpZih0PT0oVU5TSUdORUR8TE9ORykmJihjPT1ESVZ8fGM9PU1PRHx8Yz09UlNISUZUKSl7CisgICAgICAgICAgc3ByaW50ZihmbmFtZSwiX18lc3VpbnQzMiIsZW5hbWVbY10pOworICAgICAgICAgIHJldD1mbmFtZTsKKyAgICAgICAgfWVsc2UgaWYoKHQmTlEpPT1MT05HKXsKKyAgICAgICAgICBzcHJpbnRmKGZuYW1lLCJfXyVzaW50MzIiLGVuYW1lW2NdKTsKKyAgICAgICAgICByZXQ9Zm5hbWU7CisgICAgICAgIH1lbHNlIGlmKHQ9PShVTlNJR05FRHxJTlQpJiYoYz09RElWfHxjPT1NT0R8fGM9PVJTSElGVCkpeworICAgICAgICAgIHNwcmludGYoZm5hbWUsIl9fJXN1aW50MTYiLGVuYW1lW2NdKTsKKyAgICAgICAgICByZXQ9Zm5hbWU7CisgICAgICAgIH1lbHNlIGlmKCh0Jk5RKT09SU5UKXsKKyAgICAgICAgICBzcHJpbnRmKGZuYW1lLCJfXyVzaW50MTYiLGVuYW1lW2NdKTsKKyAgICAgICAgICByZXQ9Zm5hbWU7CisgICAgICAgIH1lbHNleworICAgICAgICAgIHNwcmludGYoZm5hbWUsIl9fJXMlcyVzJWxkIixlbmFtZVtjXSwodCZVTlNJR05FRCk/InUiOiIiLElTRkxPQVQodCk/ImZsdCI6ImludCIsem0ybChzaXpldGFiW3QmTlFdKSo4KTsKKyAgICAgICAgICByZXQ9Zm5hbWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZihyZXQmJmRpdmJ1ZyYmKGM9PURJVnx8Yz09TU9EKSYmIUlTRkxPQVQodCkpIHN0cmNhdChyZXQsIndvIik7CisKKyAgcmV0dXJuIHJldDsKK30KKworCitpbnQgcG9pbnRlcl92YXJhZHIoVmFyICp2KQoreworICBpbnQgYj1iYW5rKHYpOworICBpZihiPj0wJiZiIT1iYW5rY251bSYmIU5PQkFOS1ZBUlMpeworICAgIGlmKGN1cl9mdW5jdiYmYmFuayhjdXJfZnVuY3YpIT1iKQorICAgICAgcmV0dXJuIEZQT0lOVEVSOworICB9CisgIHJldHVybiBwb2ludGVyX3R5cGUodi0+dnR5cCk7Cit9CisKK2ludCBwb2ludGVyX3R5cGUoc3RydWN0IFR5cCAqcCkKK3sKKyAgc3RydWN0IFR5cCAqbWVyaz1wOworICBpZighcCkgaWVycm9yKDApOworICBpZihMQVJHRSkgcmV0dXJuIEZQT0lOVEVSOworICB3aGlsZShJU0FSUkFZKHAtPmZsYWdzKXx8SVNGVU5DKHAtPmZsYWdzKSkgcD1wLT5uZXh0OworICBpZihwLT5hdHRyKXsKKyAgICBjaGFyICpzOworICAgIGlmKHN0cnN0cihwLT5hdHRyLFNUUl9IVUdFKSkgcmV0dXJuIEhQT0lOVEVSOworICAgIGlmKHN0cnN0cihwLT5hdHRyLFNUUl9GQVIpKSByZXR1cm4gRlBPSU5URVI7CisgICAgaWYoc3Ryc3RyKHAtPmF0dHIsU1RSX05FQVIpKSByZXR1cm4gUE9JTlRFUjsKKyAgfQorICByZXR1cm4gUE9JTlRFUjsKK30KKwordW5zaWduZWQgY2hhciBjYm1jb252KHVuc2lnbmVkIGNoYXIgeCkKK3sKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgY3RhYlsyNTZdPXsKKyAgICAweDAwLDB4MDEsMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgxNCwweDA5LDB4MEQsMHgxMSwweDkzLDB4MEEsMHgwRSwweDBGLAorICAgIDB4MTAsMHgwQiwweDEyLDB4MTMsMHgwOCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLDB4MUMsMHgxRCwweDFFLDB4MUYsCisgICAgMHgyMCwweDIxLDB4MjIsMHgyMywweDI0LDB4MjUsMHgyNiwweDI3LDB4MjgsMHgyOSwweDJBLDB4MkIsMHgyQywweDJELDB4MkUsMHgyRiwKKyAgICAweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwweDM2LDB4MzcsMHgzOCwweDM5LDB4M0EsMHgzQiwweDNDLDB4M0QsMHgzRSwweDNGLAorICAgIDB4NDAsMHhDMSwweEMyLDB4QzMsMHhDNCwweEM1LDB4QzYsMHhDNywweEM4LDB4QzksMHhDQSwweENCLDB4Q0MsMHhDRCwweENFLDB4Q0YsCisgICAgMHhEMCwweEQxLDB4RDIsMHhEMywweEQ0LDB4RDUsMHhENiwweEQ3LDB4RDgsMHhEOSwweERBLDB4NUIsMHhCRiwweDVELDB4NUUsMHhBNCwKKyAgICAweEFELDB4NDEsMHg0MiwweDQzLDB4NDQsMHg0NSwweDQ2LDB4NDcsMHg0OCwweDQ5LDB4NEEsMHg0QiwweDRDLDB4NEQsMHg0RSwweDRGLAorICAgIDB4NTAsMHg1MSwweDUyLDB4NTMsMHg1NCwweDU1LDB4NTYsMHg1NywweDU4LDB4NTksMHg1QSwweEIzLDB4REQsMHhBQiwweEIxLDB4REYsCisgICAgMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4ODgsMHg4OSwweDhBLDB4OEIsMHg4QywweDhELDB4OEUsMHg4RiwKKyAgICAweDkwLDB4OTEsMHg5MiwweDBDLDB4OTQsMHg5NSwweDk2LDB4OTcsMHg5OCwweDk5LDB4OUEsMHg5QiwweDlDLDB4OUQsMHg5RSwweDlGLAorICAgIDB4QTAsMHhBMSwweEEyLDB4QTMsMHg1RiwweEE1LDB4QTYsMHhBNywweEE4LDB4QTksMHhBQSwweDdELDB4QUMsMHg2MCwweEFFLDB4QUYsCisgICAgMHhCMCwweDdFLDB4QjIsMHg3QiwweEI0LDB4QjUsMHhCNiwweEI3LDB4QjgsMHhCOSwweEJBLDB4QkIsMHhCQywweEJELDB4QkUsMHg1QywKKyAgICAweDYwLDB4NjEsMHg2MiwweDYzLDB4NjQsMHg2NSwweDY2LDB4NjcsMHg2OCwweDY5LDB4NkEsMHg2QiwweDZDLDB4NkQsMHg2RSwweDZGLAorICAgIDB4NzAsMHg3MSwweDcyLDB4NzMsMHg3NCwweDc1LDB4NzYsMHg3NywweDc4LDB4NzksMHg3QSwweDdCLDB4REMsMHg3QywweERFLDB4N0YsCisgICAgMHhFMCwweEUxLDB4RTIsMHhFMywweEU0LDB4RTUsMHhFNiwweEU3LDB4RTgsMHhFOSwweEVBLDB4RUIsMHhFQywweEVELDB4RUUsMHhFRiwKKyAgICAweEYwLDB4RjEsMHhGMiwweEYzLDB4RjQsMHhGNSwweEY2LDB4RjcsMHhGOCwweEY5LDB4RkEsMHhGQiwweEZDLDB4RkQsMHhGRSwweEZGCisgIH07CisKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgYXRhYltdPXsweGZkLDgsMHg3ZiwweDliLDExLDB4N2R9OworCisgIGlmKGNibWFzY2lpKQorICAgIHJldHVybiBjdGFiW3gmMjU1XTsKKyAgZWxzZSBpZihhdGFzY2lpJiZ4Pj03JiZ4PD0xMikKKyAgICByZXR1cm4gYXRhYlt4LTddOworICBlbHNlCisgICAgcmV0dXJuIHg7Cit9CisKK3ZvaWQgaW5zZXJ0X2NvbnN0KHVuaW9uIGF0eXBzICpwLGludCB0KQorLyogIFRyYWVndCBLb25zdGFudGUgaW4gZW50cHJlY2hlbmRlcyBGZWxkIGVpbi4gICAgICAgKi8KK3sKKyAgaWYoIXApIGllcnJvcigwKTsKKy8qICAqcCA9ICh1bmlvbiBhdHlwcykgMCA7IC8qIHJmaTogY2xlYXIgdW51c2VkIGJpdHMgKi8KKyAgdCY9TlU7CisgIGlmKHQ9PUNIQVIpIHtwLT52Y2hhcj12Y2hhcjtyZXR1cm47fQorICBpZih0PT1TSE9SVCkge3AtPnZzaG9ydD12c2hvcnQ7cmV0dXJuO30KKyAgaWYodD09SU5UKSB7cC0+dmludD12aW50O3JldHVybjt9CisgIGlmKHQ9PUxPTkcpIHtwLT52bG9uZz12bG9uZztyZXR1cm47fQorICBpZih0PT1MTE9ORykge3AtPnZsbG9uZz12bGxvbmc7cmV0dXJuO30KKyAgaWYodD09TUFYSU5UKSB7cC0+dm1heD12bWF4O3JldHVybjt9CisgIGlmKHQ9PShVTlNJR05FRHxDSEFSKSkge3AtPnZ1Y2hhcj12dWNoYXI7cmV0dXJuO30KKyAgaWYodD09KFVOU0lHTkVEfFNIT1JUKSkge3AtPnZ1c2hvcnQ9dnVzaG9ydDtyZXR1cm47fQorICBpZih0PT0oVU5TSUdORUR8SU5UKSkge3AtPnZ1aW50PXZ1aW50O3JldHVybjt9CisgIGlmKHQ9PShVTlNJR05FRHxMT05HKSkge3AtPnZ1bG9uZz12dWxvbmc7cmV0dXJuO30KKyAgaWYodD09KFVOU0lHTkVEfExMT05HKSkge3AtPnZ1bGxvbmc9dnVsbG9uZztyZXR1cm47fQorICBpZih0PT0oVU5TSUdORUR8TUFYSU5UKSkge3AtPnZ1bWF4PXZ1bWF4O3JldHVybjt9CisgIGlmKHQ9PUZMT0FUKSB7cC0+dmZsb2F0PXZmbG9hdDtyZXR1cm47fQorICBpZih0PT1ET1VCTEUpIHtwLT52ZG91YmxlPXZkb3VibGU7cmV0dXJuO30KKyAgaWYodD09TERPVUJMRSkge3AtPnZsZG91YmxlPXZsZG91YmxlO3JldHVybjt9CisgIGlmKHQ9PVBPSU5URVIpIHtwLT52dWludD12dWludDtyZXR1cm47fQorICBpZih0PT1GUE9JTlRFUnx8dD09SFBPSU5URVIpIHtwLT52dWxvbmc9dnVsb25nO3JldHVybjt9Cit9CisKK3ZvaWQgZXZhbF9jb25zdCh1bmlvbiBhdHlwcyAqcCxpbnQgdCkKKy8qICBXZWlzdCBiZXN0aW1tdGVuIGdsb2JhbGVuIFZhcmlhYmxlbiBXZXJ0IGVpbmVyIENFWFBSIHp1LiAgICAgICAqLworeworICBpbnQgZj10Jk5ROworICBpZighcCkgaWVycm9yKDApOworICBpZihmPT1NQVhJTlR8fChmPj1DSEFSJiZmPD1MTE9ORykpeworICAgIGlmKCEodCZVTlNJR05FRCkpeworICAgICAgaWYoZj09Q0hBUikgdm1heD16YzJ6bShwLT52Y2hhcik7CisgICAgICBlbHNlIGlmKGY9PVNIT1JUKXZtYXg9enMyem0ocC0+dnNob3J0KTsKKyAgICAgIGVsc2UgaWYoZj09SU5UKSAgdm1heD16aTJ6bShwLT52aW50KTsKKyAgICAgIGVsc2UgaWYoZj09TE9ORykgdm1heD16bDJ6bShwLT52bG9uZyk7CisgICAgICBlbHNlIGlmKGY9PUxMT05HKSB2bWF4PXpsbDJ6bShwLT52bGxvbmcpOworICAgICAgZWxzZSBpZihmPT1NQVhJTlQpIHZtYXg9cC0+dm1heDsKKyAgICAgIGVsc2UgaWVycm9yKDApOworICAgICAgdnVtYXg9em0yenVtKHZtYXgpOworICAgICAgdmxkb3VibGU9em0yemxkKHZtYXgpOworICAgIH1lbHNleworICAgICAgaWYoZj09Q0hBUikgdnVtYXg9enVjMnp1bShwLT52dWNoYXIpOworICAgICAgZWxzZSBpZihmPT1TSE9SVCl2dW1heD16dXMyenVtKHAtPnZ1c2hvcnQpOworICAgICAgZWxzZSBpZihmPT1JTlQpICB2dW1heD16dWkyenVtKHAtPnZ1aW50KTsKKyAgICAgIGVsc2UgaWYoZj09TE9ORykgdnVtYXg9enVsMnp1bShwLT52dWxvbmcpOworICAgICAgZWxzZSBpZihmPT1MTE9ORykgdnVtYXg9enVsbDJ6dW0ocC0+dnVsbG9uZyk7CisgICAgICBlbHNlIGlmKGY9PU1BWElOVCkgdnVtYXg9cC0+dnVtYXg7CisgICAgICBlbHNlIGllcnJvcigwKTsKKyAgICAgIHZtYXg9enVtMnptKHZ1bWF4KTsKKyAgICAgIHZsZG91YmxlPXp1bTJ6bGQodnVtYXgpOworICAgIH0KKyAgfWVsc2V7CisgICAgaWYoSVNQT0lOVEVSKGYpKXsKKyAgICAgIGlmKGY9PVBPSU5URVIpCisJdnVtYXg9enVpMnp1bShwLT52dWludCk7CisgICAgICBlbHNlCisJdnVtYXg9enVsMnp1bShwLT52dWxvbmcpOworICAgICAgdm1heD16dW0yem0odnVtYXgpO3ZsZG91YmxlPXp1bTJ6bGQodnVtYXgpOworICAgIH1lbHNleworICAgICAgaWYoZj09RkxPQVQpIHZsZG91YmxlPXpmMnpsZChwLT52ZmxvYXQpOworICAgICAgZWxzZSBpZihmPT1ET1VCTEUpIHZsZG91YmxlPXpkMnpsZChwLT52ZG91YmxlKTsKKyAgICAgIGVsc2Ugdmxkb3VibGU9cC0+dmxkb3VibGU7CisgICAgICB2bWF4PXpsZDJ6bSh2bGRvdWJsZSk7CisgICAgICB2dW1heD16bGQyenVtKHZsZG91YmxlKTsKKyAgICB9CisgIH0KKyAgdmZsb2F0PXpsZDJ6Zih2bGRvdWJsZSk7CisgIHZkb3VibGU9emxkMnpkKHZsZG91YmxlKTsKKyAgdnVjaGFyPXp1bTJ6dWModnVtYXgpOworICB2dXNob3J0PXp1bTJ6dXModnVtYXgpOworICB2dWludD16dW0yenVpKHZ1bWF4KTsKKyAgdnVsb25nPXp1bTJ6dWwodnVtYXgpOworICB2dWxsb25nPXp1bTJ6dWxsKHZ1bWF4KTsKKyAgdmNoYXI9em0yemModm1heCk7CisgIHZzaG9ydD16bTJ6cyh2bWF4KTsKKyAgdmludD16bTJ6aSh2bWF4KTsKKyAgdmxvbmc9em0yemwodm1heCk7CisgIHZsbG9uZz16bTJ6bGwodm1heCk7Cit9CisKK3ZvaWQgcHJpbnR2YWwoRklMRSAqZix1bmlvbiBhdHlwcyAqcCxpbnQgdCkKKy8qICBHaWJ0IGF0eXBzIGF1cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgdCY9TlU7CisgIGlmKHQ9PUNIQVIpe2ZwcmludGYoZiwiQyIpO3ZtYXg9emMyem0ocC0+dmNoYXIpO3ByaW50em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxDSEFSKSl7ZnByaW50ZihmLCJVQyIpO3Z1bWF4PXp1YzJ6dW0ocC0+dnVjaGFyKTtwcmludHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PVNIT1JUKXtmcHJpbnRmKGYsIlMiKTt2bWF4PXpzMnptKHAtPnZzaG9ydCk7cHJpbnR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfFNIT1JUKSl7ZnByaW50ZihmLCJVUyIpO3Z1bWF4PXp1czJ6dW0ocC0+dnVzaG9ydCk7cHJpbnR6dW0oZix2dW1heCk7fQorICBpZih0PT1GTE9BVCl7ZnByaW50ZihmLCJGIik7dmxkb3VibGU9emYyemxkKHAtPnZmbG9hdCk7cHJpbnR6bGQoZix2bGRvdWJsZSk7fQorICBpZih0PT1ET1VCTEUpe2ZwcmludGYoZiwiRCIpO3ZsZG91YmxlPXpkMnpsZChwLT52ZG91YmxlKTtwcmludHpsZChmLHZsZG91YmxlKTt9CisgIGlmKHQ9PUxET1VCTEUpe2ZwcmludGYoZiwiTEQiKTtwcmludHpsZChmLHAtPnZsZG91YmxlKTt9CisgIGlmKHQ9PUlOVCl7ZnByaW50ZihmLCJJIik7dm1heD16aTJ6bShwLT52aW50KTtwcmludHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8SU5UKXx8dD09UE9JTlRFUil7ZnByaW50ZihmLCJVSSIpO3Z1bWF4PXp1aTJ6dW0ocC0+dnVpbnQpO3ByaW50enVtKGYsdnVtYXgpO30KKyAgaWYodD09TE9ORyl7ZnByaW50ZihmLCJMIik7dm1heD16bDJ6bShwLT52bG9uZyk7cHJpbnR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfExPTkcpfHx0PT1GUE9JTlRFUnx8dD09SFBPSU5URVIpe2ZwcmludGYoZiwiVUwiKTt2dW1heD16dWwyenVtKHAtPnZ1bG9uZyk7cHJpbnR6dW0oZix2dW1heCk7fQorICBpZih0PT1MTE9ORyl7ZnByaW50ZihmLCJMTCIpO3ZtYXg9emxsMnptKHAtPnZsbG9uZyk7cHJpbnR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfExMT05HKSl7ZnByaW50ZihmLCJVTEwiKTt2dW1heD16dWxsMnp1bShwLT52dWxsb25nKTtwcmludHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PU1BWElOVCkgcHJpbnR6bShmLHAtPnZtYXgpOworICBpZih0PT0oVU5TSUdORUR8TUFYSU5UKSkgcHJpbnR6dW0oZixwLT52dW1heCk7Cit9CisKK3ZvaWQgZW1pdHZhbChGSUxFICpmLHVuaW9uIGF0eXBzICpwLGludCB0KQorLyogIEdpYnQgYXR5cHMgYXVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICB0Jj1OVTsKKyAgaWYodD09Q0hBUil7dm1heD16YzJ6bShwLT52Y2hhcik7ZW1pdHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8Q0hBUikpe3Z1bWF4PXp1YzJ6dW0ocC0+dnVjaGFyKTtlbWl0enVtKGYsdnVtYXgpO30KKyAgaWYodD09U0hPUlQpe3ZtYXg9enMyem0ocC0+dnNob3J0KTtlbWl0em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxTSE9SVCkpe3Z1bWF4PXp1czJ6dW0ocC0+dnVzaG9ydCk7ZW1pdHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUZMT0FUKXt2bGRvdWJsZT16ZjJ6bGQocC0+dmZsb2F0KTtlbWl0emxkKGYsdmxkb3VibGUpO30KKyAgaWYodD09RE9VQkxFKXt2bGRvdWJsZT16ZDJ6bGQocC0+dmRvdWJsZSk7ZW1pdHpsZChmLHZsZG91YmxlKTt9CisgIGlmKHQ9PUxET1VCTEUpe2VtaXR6bGQoZixwLT52bGRvdWJsZSk7fQorICBpZih0PT1JTlQpe3ZtYXg9emkyem0ocC0+dmludCk7ZW1pdHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8SU5UKXx8dD09UE9JTlRFUil7dnVtYXg9enVpMnp1bShwLT52dWludCk7ZW1pdHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUxPTkcpe3ZtYXg9emwyem0ocC0+dmxvbmcpO2VtaXR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfExPTkcpfHx0PT1GUE9JTlRFUnx8dD09SFBPSU5URVIpe3Z1bWF4PXp1bDJ6dW0ocC0+dnVsb25nKTtlbWl0enVtKGYsdnVtYXgpO30KKyAgaWYodD09TExPTkcpe3ZtYXg9emxsMnptKHAtPnZsbG9uZyk7ZW1pdHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8TExPTkcpKXt2dW1heD16dWxsMnp1bShwLT52dWxsb25nKTtlbWl0enVtKGYsdnVtYXgpO30KKyAgaWYodD09TUFYSU5UKSBlbWl0em0oZixwLT52bWF4KTsKKyAgaWYodD09KFVOU0lHTkVEfE1BWElOVCkpIGVtaXR6dW0oZixwLT52dW1heCk7Cit9CisKK3ZvaWQgY29udl90eXAoc3RydWN0IFR5cCAqcCkKKy8qIEVyemV1Z3QgZXh0ZW5kZWQgdHlwZXMgaW4gZWluZW0gVHlwLiAqLworeworICBjaGFyICphdHRyOworICB3aGlsZShwKXsKKyAgICBpZihJU1BPSU5URVIocC0+ZmxhZ3MpKXsKKyAgICAgIHAtPmZsYWdzPSgocC0+ZmxhZ3Mmfk5VKXxQT0lOVEVSX1RZUEUocC0+bmV4dCkpOworICAgICAgaWYoYXR0cj1wLT5uZXh0LT5hdHRyKXsKKyAgICAgICAgaWYoc3Ryc3RyKGF0dHIsU1RSX05FQVIpKQorICAgICAgICAgIHAtPmZsYWdzPSgocC0+ZmxhZ3Mmfk5VKXxQT0lOVEVSKTsKKyAgICAgICAgaWYoc3Ryc3RyKGF0dHIsU1RSX0ZBUikpCisgICAgICAgICAgcC0+ZmxhZ3M9KChwLT5mbGFncyZ+TlUpfEZQT0lOVEVSKTsKKyAgICAgICAgaWYoc3Ryc3RyKGF0dHIsU1RSX0hVR0UpKQorICAgICAgICAgIHAtPmZsYWdzPSgocC0+ZmxhZ3Mmfk5VKXxIUE9JTlRFUik7CisgICAgICB9CisgICAgfQorICAgIHA9cC0+bmV4dDsKKyAgfQorfQorCit2b2lkIGFkZF92YXJfaG9va19wb3N0KFZhciAqdikKK3sKKyAgaWYodXNlX3NlYyYmKHYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQ3x8di0+c3RvcmFnZV9jbGFzcz09RVhURVJOKSl7CisgICAgY2hhciBidWZbU0VDTEVOKzMyXTsKKyAgICBzcHJpbnRmKGJ1Ziwic2VjdGlvbihcIiVzXCIpOyIsdXNlX3NlYyk7CisgICAgYWRkX2F0dHIoJnYtPnZhdHRyLGJ1Zik7CisgIH0KKyAgaWYodXNlX2Jhbms+PTAmJih2LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUN8fHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTikpeworICAgIGNoYXIgYnVmWzY0XTsKKyAgICAvKnNwcmludGYoYnVmLCJzZWN0aW9uKFwiYmFuayVkXCIpO2JhbmsoJWQpIix1c2VfYmFuayx1c2VfYmFuayk7Ki8KKyAgICBzcHJpbnRmKGJ1ZiwiYmFuayglZCkiLHVzZV9iYW5rKTsKKyAgICBhZGRfYXR0cigmdi0+dmF0dHIsYnVmKTsKKyAgfQorfQorCitpbnQgZGVjaWRlX3JldmVyc2Uoem1heCB2KQoreworICBpZih6bWVxdG8odixaMSl8fHptZXF0byh2LGwyem0oMkwpKSkKKyAgICByZXR1cm4gMTsKKyAgaWYob3B0c3BlZWQpCisgICAgaWYoem1lcXRvKHYsbDJ6bSg0TCkpfHx6bWVxdG8odixsMnptKDhMKSl8fHptZXF0byh2LGwyem0oMjU2TCkpfHx6bWVxdG8odixsMnptKDUxMkwpKSkKKyAgICAgIHJldHVybiAxOworICAKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNfc2luZ2xlX2VmZl9pYyhzdHJ1Y3QgSUMgKnApCit7CisgIHN0cnVjdCBWYXIgKnYsKmlkeDsKKyAgaWYocC0+Y29kZSE9QURESTJQfHwocC0+dHlwZjImTlEpIT1QT0lOVEVSKQorICAgIHJldHVybiAwOworICBpZighKHAtPnEyLmZsYWdzJktPTlNUKSl7CisgICAgaWYoKHAtPnR5cGYmTlUpIT0oVU5TSUdORUR8Q0hBUikpCisgICAgICByZXR1cm4gMDsKKyAgICBpZigocC0+cTIuZmxhZ3MmKFZBUnxEUkVGT0JKKSkhPVZBUikKKyAgICAgIHJldHVybiAwOworICAgIGlmKHAtPnEyLnYtPnN0b3JhZ2VfY2xhc3MhPUFVVE8mJnAtPnEyLnYtPnN0b3JhZ2VfY2xhc3MhPVJFR0lTVEVSKQorICAgICAgcmV0dXJuIDA7CisgICAgaWR4PXAtPnEyLnY7CisgIH1lbHNleworICAgIGlkeD0wOworICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxwLT50eXBmKTsKKyAgICAvKiBUT0RPOiBtb3JlIHByZWNpc2UgY2hlY2sgY29uc2lkZXJpbmcgZGF0YSB0eXBlIHVzZWZ1bD8gKi8KKyAgICBpZighem1sZXEodnVtYXgsbDJ6bSgyNTVMKSkpCisgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZihwLT5xMS5mbGFncyZEUkVGT0JKKQorICAgIHJldHVybiAwOworICBpZigocC0+ei5mbGFncyYoVkFSfERSRUZPQkopKSE9VkFSKQorICAgIHJldHVybiAwOworICBpZihwLT56LnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQ3x8cC0+ei52LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pCisgICAgcmV0dXJuIDA7CisgIHY9cC0+ei52OworICBmb3IocD1wLT5uZXh0O3A7cD1wLT5uZXh0KXsKKyAgICBpbnQgYz1wLT5jb2RlOworICAgIGlmKGM9PUxBQkVMfHwoYz49QkVRJiZjPD1CUkEpKQorICAgICAgcmV0dXJuIDE7IC8qIFRPRE86IGhvdyBlbGFib3JhdGUgc2hvdWxkIHdlIHRlc3Q/ICovCisgICAgaWYoKHAtPnExLmZsYWdzJlZBUikmJnAtPnExLnY9PXYpeworICAgICAgaWYocC0+cTEuZmxhZ3MmRFJFRk9CSikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZigocC0+cTIuZmxhZ3MmVkFSKSYmcC0+cTIudj09dil7CisgICAgICBpZihwLT5xMi5mbGFncyZEUkVGT0JKKQorICAgICAgICByZXR1cm4gMTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmKChwLT56LmZsYWdzJlZBUikmJnAtPnoudj09dil7CisgICAgICBpZihwLT56LmZsYWdzJkRSRUZPQkopCisgICAgICAgIHJldHVybiAxOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYoKHAtPnouZmxhZ3MmVkFSKSYmcC0+ei52PT1pZHgpCisgICAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMDsKK30KKwordm9pZCBtYXJrX2VmZl9pY3Modm9pZCkKK3sKKyAgc3RydWN0IElDICpwOworICBmb3IocD1maXJzdF9pYztwO3A9cC0+bmV4dCl7CisgICAgaWYoaXNfc2luZ2xlX2VmZl9pYyhwKSkKKyAgICAgIHAtPmZsYWdzfD1FRkZfSUM7CisgICAgZWxzZQorICAgICAgcC0+ZmxhZ3MmPX5FRkZfSUM7CisgIH0KK30KZGlmZiAtLWdpdCBhL21hY2hpbmVzLzY1MDIvbWFjaGluZS5kdCBiL21hY2hpbmVzLzY1MDIvbWFjaGluZS5kdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYWIzOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvNjUwMi9tYWNoaW5lLmR0CkBAIC0wLDAgKzEsMTYgQEAKK1M4QlMKK1M4QlUKK1MxNkJTTEUgUzE2QlNCRQorUzE2QlVMRSBTMTZCVUJFCitTMTZCU0xFIFMxNkJTQkUKK1MxNkJVTEUgUzE2QlVCRQorUzMyQlNMRSBTMzJCU0JFCitTMzJCVUxFIFMzMkJVQkUKK1M2NEJTTEUgUzY0QlNCRQorUzY0QlVMRSBTNjRCVUJFCitTMzJCSUVFRUxFCitTNjRCSUVFRUxFCitTNjRCSUVFRUxFCitTMTZCVUxFIFMxNkJVQkUKKworCmRpZmYgLS1naXQgYS9tYWNoaW5lcy82NTAyL21hY2hpbmUuaCBiL21hY2hpbmVzLzY1MDIvbWFjaGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIyYzVlNDUKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy82NTAyL21hY2hpbmUuaApAQCAtMCwwICsxLDI2NyBAQAorLyogIDY1MDIgYmFja2VuZCBmb3IgdmJjYworICAgIChjKSBWb2xrZXIgQmFydGhlbG1hbm4gMjAyMAorCisqLworCisvKiBidWlsLXRpbWUgY29uZmlndXJhYmxlIG9wdGlvbnM6ICovCisjZGVmaW5lIE5VTV9HUFJTIDMyCisjZGVmaW5lIE5VTV9QQUlSUyAoTlVNX0dQUlMvMikKKyNkZWZpbmUgTlVNX0JJRyA0CisjZGVmaW5lIE5VTV9CSUdQIChOVU1fQklHLzIpCisjZGVmaW5lIEZJWEVEX1NQIDEKKworI2luY2x1ZGUgImR0LmgiCisKKyN1bmRlZiBDSEFSCisjdW5kZWYgU0hPUlQKKyN1bmRlZiBJTlQKKyN1bmRlZiBMT05HCisjdW5kZWYgTExPTkcKKyN1bmRlZiBGTE9BVAorI3VuZGVmIERPVUJMRQorI3VuZGVmIExET1VCTEUKKyN1bmRlZiBWT0lECisjdW5kZWYgUE9JTlRFUgorI3VuZGVmIEFSUkFZCisjdW5kZWYgU1RSVUNUCisjdW5kZWYgVU5JT04KKyN1bmRlZiBFTlVNCisjdW5kZWYgRlVOS1QKKyN1bmRlZiBCT09MCisjdW5kZWYgTUFYSU5UCisjdW5kZWYgTUFYX1RZUEUKKworI2RlZmluZSBDSEFSIDEKKyNkZWZpbmUgU0hPUlQgMgorI2RlZmluZSBJTlQgMworI2RlZmluZSBMT05HIDQKKyNkZWZpbmUgTExPTkcgNQorI2RlZmluZSBGTE9BVCA2CisjZGVmaW5lIERPVUJMRSA3CisjZGVmaW5lIExET1VCTEUgOAorI2RlZmluZSBWT0lEIDkKKyNkZWZpbmUgUE9JTlRFUiAxMAorI2RlZmluZSBGUE9JTlRFUiAxMQorI2RlZmluZSBIUE9JTlRFUiAxMgorI2RlZmluZSBBUlJBWSAxMworI2RlZmluZSBTVFJVQ1QgMTQKKyNkZWZpbmUgVU5JT04gMTUKKyNkZWZpbmUgRU5VTSAxNgorI2RlZmluZSBGVU5LVCAxNworI2RlZmluZSBCT09MIDE4CisKKyNkZWZpbmUgTUFYSU5UIDE5CisKKyNkZWZpbmUgTUFYX1RZUEUgTUFYSU5UCisKKworI2RlZmluZSBQT0lOVEVSX1RZUEUoeCkgcG9pbnRlcl90eXBlKHgpCisjZGVmaW5lIFBPSU5URVJfVkFSQURSKHgpIHBvaW50ZXJfdmFyYWRyKHgpCitleHRlcm4gaW50IHBvaW50ZXJfdHlwZSgpOworZXh0ZXJuIGludCBwb2ludGVyX3ZhcmFkcigpOworI2RlZmluZSBJU1BPSU5URVIoeCkgKCh4Jk5RKT49UE9JTlRFUiYmKHgmTlEpPD1IUE9JTlRFUikKKyNkZWZpbmUgSVNTQ0FMQVIoeCkgKCh4Jk5RKT49Q0hBUiYmKHgmTlEpPD1IUE9JTlRFUikKKyNkZWZpbmUgSVNJTlQoeCkgKCh4Jk5RKT49Q0hBUiYmKHgmTlEpPD1MTE9ORykKKyNkZWZpbmUgUFRSRElGRl9UKHgpICgoeCk9PUhQT0lOVEVSP0xPTkc6SU5UKQorCit0eXBlZGVmIHpsbG9uZyB6bWF4OwordHlwZWRlZiB6dWxsb25nIHp1bWF4OworCit1bmlvbiBhdHlwc3sKKyAgemNoYXIgdmNoYXI7CisgIHp1Y2hhciB2dWNoYXI7CisgIHpzaG9ydCB2c2hvcnQ7CisgIHp1c2hvcnQgdnVzaG9ydDsKKyAgemludCB2aW50OworICB6dWludCB2dWludDsKKyAgemxvbmcgdmxvbmc7CisgIHp1bG9uZyB2dWxvbmc7CisgIHpsbG9uZyB2bGxvbmc7CisgIHp1bGxvbmcgdnVsbG9uZzsKKyAgem1heCB2bWF4OworICB6dW1heCB2dW1heDsKKyAgemZsb2F0IHZmbG9hdDsKKyAgemRvdWJsZSB2ZG91YmxlOworICB6bGRvdWJsZSB2bGRvdWJsZTsKK307CisKKworLyogaW50ZXJuYWxseSB1c2VkIGJ5IHRoZSBiYWNrZW5kICovCisjZGVmaW5lIEZJUlNUX0dQUiA4CisjZGVmaW5lIExBU1RfR1BSIChGSVJTVF9HUFIrTlVNX0dQUlMtMSkKKyNkZWZpbmUgRklSU1RfUEFJUiAoTEFTVF9HUFIrMSkKKyNkZWZpbmUgTEFTVF9QQUlSIChGSVJTVF9QQUlSK05VTV9QQUlSUy0xKQorI2RlZmluZSBGSVJTVF9CSUcgKExBU1RfUEFJUisxKQorI2RlZmluZSBMQVNUX0JJRyAoRklSU1RfQklHK05VTV9CSUctMSkKKyNkZWZpbmUgRklSU1RfQklHUCAoTEFTVF9CSUcrMSkKKyNkZWZpbmUgTEFTVF9CSUdQIChGSVJTVF9CSUdQK05VTV9CSUdQLTEpCisKKy8qICBUaGlzIHN0cnVjdCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgbWFjaGluZS1zcGVjaWZpYyAgICAgICAgICAgKi8KKy8qICBhZGRyZXNzaW5nLW1vZGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDdXJyZW50bHkgcG9zc2libGUgYXJlIChjb25zdCxncHIpIGFuZCAoZ3ByLGdwcikgICAgICAgICAgICAgICAgKi8KK3N0cnVjdCBBZGRyZXNzaW5nTW9kZXsKKyAgaW50IGZsYWdzOworICBpbnQgYmFzZTsKKyAgaW50IGlkeDsKKyAgbG9uZyBvZmZzZXQ7CisgIHZvaWQgKnY7Cit9OworCisvKiAgVGhlIG51bWJlciBvZiByZWdpc3RlcnMgb2YgdGhlIHRhcmdldCBtYWNoaW5lLiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1BWFIgTEFTVF9CSUdQCisKKy8qICBOdW1iZXIgb2YgY29tbWFuZGxpbmUtb3B0aW9ucyB0aGUgY29kZS1nZW5lcmF0b3IgYWNjZXB0cy4gICAgICAgKi8KKyNkZWZpbmUgTUFYR0YgMzAKKworLyogIElmIHRoaXMgaXMgc2V0IHRvIHplcm8gdmJjYyB3aWxsIG5vdCBnZW5lcmF0ZSBJQ3Mgd2hlcmUgdGhlICAgICAqLworLyogIHRhcmdldCBvcGVyYW5kIGlzIHRoZSBzYW1lIGFzIHRoZSAybmQgc291cmNlIG9wZXJhbmQuICAgICAgICAgICAqLworLyogIFRoaXMgY2FuIHNvbWV0aW1lcyBzaW1wbGlmeSB0aGUgY29kZS1nZW5lcmF0b3IsIGJ1dCB1c3VhbGx5ICAgICAqLworLyogIHRoZSBjb2RlIGlzIGJldHRlciBpZiB0aGUgY29kZS1nZW5lcmF0b3IgYWxsb3dzIGl0LiAgICAgICAgICAgICAqLworI2RlZmluZSBVU0VRMkFTWiAxCisKKy8qICBUaGlzIHNwZWNpZmllcyB0aGUgc21hbGxlc3QgaW50ZWdlciB0eXBlIHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgKi8KKy8qICBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlOQURESTJQIENIQVIKKworLyogIElmIHRoZSBieXRlcyBvZiBhbiBpbnRlZ2VyIGFyZSBvcmRlcmVkIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSAgICAqLworLyogIGJ5dGUgZmlyc3QgYW5kIHRoZW4gZGVjcmVhc2luZyBzZXQgQklHRU5ESUFOIHRvIDEuICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdFTkRJQU4gMAorCisvKiAgSWYgdGhlIGJ5dGVzIG9mIGFuIGludGVnZXIgYXJlIG9yZGVyZWQgbGVzdCBzaWduaWZpY2FudCBieXRlICAgICovCisvKiAgYnl0ZSBmaXJzdCBhbmQgdGhlbiBpbmNyZWFzaW5nIHNldCBMSVRUTEVFTkRJQU4gdG8gMS4gICAgICAgICAgICovCisjZGVmaW5lIExJVFRMRUVORElBTiAxCisKKy8qICBOb3RlIHRoYXQgQklHRU5ESUFOIGFuZCBMSVRUTEVFTkRJQU4gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gICAgKi8KKworLyogIElmIHN3aXRjaC1zdGF0ZW1lbnRzIHNob3VsZCBiZSBnZW5lcmF0ZWQgYXMgYSBzZXF1ZW5jZSBvZiAgICAgICAqLworLyogIFNVQixUU1QsQkVRIElDcyByYXRoZXIgdGhhbiBDT01QQVJFLEJFUSBJQ3Mgc2V0IHRoaXMgdG8gMS4gICAgICAqLworLyogIFRoaXMgY2FuIHlpZWxkIGJldHRlciBjb2RlIG9uIHNvbWUgbWFjaGluZXMuICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTV0lUQ0hTVUJTIDAKKworLyogIEluIG9wdGltaXppbmcgY29tcGlsYXRpb24gY2VydGFpbiBsaWJyYXJ5IG1lbWNweS9zdHJjcHktY2FsbHMgICAqLworLyogIHdpdGggbGVuZ3RoIGtub3duIGF0IGNvbXBpbGUtdGltZSB3aWxsIGJlIGlubGluZWQgdXNpbmcgYW4gICAgICAqLworLyogIEFTU0lHTi1JQyBpZiB0aGUgc2l6ZSBpcyBsZXNzIG9yIGVxdWFsIHRvIElOTElORU1FTUNQWS4gICAgICAgICAqLworLyogIFRoZSB0eXBlIHVzZWQgZm9yIHRoZSBBU1NJR04tSUMgd2lsbCBiZSBVTlNJR05FRHxDSEFSLiAgICAgICAgICAqLworI2RlZmluZSBJTkxJTkVNRU1DUFkgMTI4CisKKy8qICBQYXJhbWV0ZXJzIGFyZSBzb21ldGltZXMgcGFzc2VkIGluIHJlZ2lzdGVycyB3aXRob3V0IF9fcmVnLiAgICAgKi8KKyNkZWZpbmUgSEFWRV9SRUdQQVJNUyAxCisKKy8qICBQYXJhbWV0ZXJzIG9uIHRoZSBzdGFjayBzaG91bGQgYmUgcHVzaGVkIGluIG9yZGVyIHJhdGhlciB0aGFuICAgKi8KKy8qICBpbiByZXZlcnNlIG9yZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT1JERVJFRF9QVVNIIEZJWEVEX1NQCisKKy8qICBTdHJ1Y3R1cmUgZm9yIHJlZ19wYXJtKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0cnVjdCByZWdfaGFuZGxleworICBpbnQgcmVnczsKKyAgaW50IGJyZWdzOworfTsKKworLyogIFdlIGhhdmUgc29tZSB0YXJnZXQtc3BlY2lmaWMgdmFyaWFibGUgYXR0cmlidXRlcy4gICAgICAgICAgICAgICAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9BVFRSSUJVVEVTCisKKy8qIFdlIGhhdmUgdGFyZ2V0LXNwZWNpZmljIHByYWdtYXMgKi8KKyNkZWZpbmUgSEFWRV9UQVJHRVRfUFJBR01BUworCisvKiAgV2Uga2VlcCB0cmFjayBvZiBhbGwgcmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IGEgZnVuY3Rpb24uICAgICAgICAgICovCisjZGVmaW5lIEhBVkVfUkVHU19NT0RJRklFRCAxCisKKy8qIFdlIGhhdmUgYSBpbXBsZW1lbnQgb3VyIG93biBjb3N0LWZ1bmN0aW9ucyB0byBhZGFwdCAKKyAgIHJlZ2lzdGVyLWFsbG9jYXRpb24gKi8KKyNkZWZpbmUgSEFWRV9UQVJHRVRfUkFMTE9DIDEKKyNkZWZpbmUgY29zdF9tb3ZlX3JlZyh4LHkpIDYgLy82CisjZGVmaW5lIGNvc3RfbG9hZF9yZWcoeCx5KSAxMCAvLzEwCisjZGVmaW5lIGNvc3Rfc2F2ZV9yZWcoeCx5KSAxMCAvLzEwCisjZGVmaW5lIGNvc3RfcHVzaHBvcF9yZWcoeCkgMiAvLzEyCisKKy8qIHNpemUgb2YgYnVmZmVyIGZvciBhc20tb3V0cHV0LCB0aGlzIGNhbiBiZSB1c2VkIHRvIGRvCisgICBwZWVwaG9sZS1vcHRpbWl6YXRpb25zIG9mIHRoZSBnZW5lcmF0ZWQgYXNzZW1ibHktb3V0cHV0ICovCisjZGVmaW5lIEVNSVRfQlVGX0xFTiAxMDI0IC8qIHNob3VsZCBiZSBlbm91Z2ggKi8KKy8qIG51bWJlciBvZiBhc20tb3V0cHV0IGxpbmVzIGJ1ZmZlcmVkICovCisjZGVmaW5lIEVNSVRfQlVGX0RFUFRIIDgKKworLyogIFdlIGhhdmUgbm8gYXNtX3BlZXBob2xlIHRvIG9wdGltaXplIGFzc2VtYmx5LW91dHB1dCAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9QRUVQSE9MRSAxCisKKy8qIHdlIGRvIG5vdCBoYXZlIGEgbWFya19lZmZfaWNzIGZ1bmN0aW9uLCB0aGlzIGlzIHVzZWQgdG8gcHJldmVudAorICAgb3B0aW1pemF0aW9ucyBvbiBjb2RlIHdoaWNoIGNhbiBhbHJlYWR5IGJlIGltcGxlbWVudGVkIGJ5IGVmZmljaWVudAorICAgYXNzZW1ibHkgKi8KKyN1bmRlZiBIQVZFX1RBUkdFVF9FRkZfSUMKKworLyogd2UgaGF2ZSBhZGRpdGlvbmFsIHR5cGVzICovCisjZGVmaW5lIEhBVkVfRVhUX1RZUEVTCisjZGVmaW5lIEhBVkVfVEdUX1BSSU5UVkFMCisKKy8qIHdlIGRvIG5vdCBuZWVkIGV4dHJhIGVsZW1lbnRzIGluIHRoZSBJQyAqLworI3VuZGVmIEhBVkVfRVhUX0lDCisKKy8qIHdlIGRvIG5vdCB1c2UgdW5zaWduZWQgaW50IGFzIHNpemVfdCAoYnV0IHVuc2lnbmVkIGxvbmcsIHRoZSBkZWZhdWx0KSAqLworI2RlZmluZSBIQVZFX0lOVF9TSVpFVCAxCisKKy8qIHdlIGRvIG5vdCBuZWVkIHJlZ2lzdGVyLXBhaXJzICovCisjZGVmaW5lIEhBVkVfUkVHUEFJUlMgMQorCisKKy8qIGRvIG5vdCBjcmVhdGUgQ09OVkVSVCBJQ3MgZnJvbSBpbnRlZ2VycyBzbWFsbGVyIHRoYW4gaW50IHRvIGZsb2F0cyAqLworI2RlZmluZSBNSU5fSU5UX1RPX0ZMT0FUX1RZUEUgSU5UCisKKy8qIGRvIG5vdCBjcmVhdGUgQ09OVkVSVCBJQ3MgZnJvbSBmbG9hdHMgdG8gaW50cyBzbWFsbGVyIHRoYW4gaW50ICovCisjZGVmaW5lIE1JTl9GTE9BVF9UT19JTlRfVFlQRSBJTlQKKworLyogZG8gbm90IGNyZWF0ZSBDT05WRVJUX0lDcyBmcm9tIGZsb2F0cyB0byB1bnNpZ25lZCBpbnRlZ2VycyAqLworI2RlZmluZSBBVk9JRF9GTE9BVF9UT19VTlNJR05FRCAwCisKKy8qIGRvIG5vdCBjcmVhdGUgQ09OVkVSVF9JQ3MgZnJvbSB1bnNpZ25lZCBpbnRlZ2VycyB0byBmbG9hdHMgKi8KKyNkZWZpbmUgQVZPSURfVU5TSUdORURfVE9fRkxPQVQgMAorCisvKiBjb252ZXJ0IG11bHRpcGxpY2F0aW9ucy9kaXZpc2lvbiBieSBwb3dlcnMgb2YgdHdvIHRvIHNoaWZ0cyAqLworI2RlZmluZSBIQVZFX1BPRjJPUFQgMQorCisvKiBXZSB1c2UgYnVpbHRpbiBsaWJjYWxscyBmb3Igc29tZSBvcGVyYXRpb25zICovCisjZGVmaW5lIEhBVkVfTElCQ0FMTFMgMQorCisvKiBVc2UgY2hhciBmb3IgcmV0dXJuIG9mIGNvbXBhcmlzb24gbGliY2FsbHMgKi8KKyNkZWZpbmUgTElCQ0FMTF9DTVBUWVBFIENIQVIKKworLyogV2UgcHJlZmVyIEJORSByYXRoZXIgdGhhbiBCR1QuICovCisjZGVmaW5lIEhBVkVfV0FOVEJORSAxCisKKyNkZWZpbmUgQkVTVENPUFlUIENIQVIKKworI2RlZmluZSBIQVZFX0FPUzQgMQorCisjZGVmaW5lIENIQVJDT05WKHgpIGNibWNvbnYoeCkKK3Vuc2lnbmVkIGNoYXIgY2JtY29udih1bnNpZ25lZCBjaGFyKTsKKworI2RlZmluZSBBTExPQ1ZMQV9SRUcgRklSU1RfUEFJUgorI2RlZmluZSBBTExPQ1ZMQV9JTkxJTkVBU00gIlx0bGRhXHRzcFxuIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdHNlY1xuIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdHNiY1x0cjBcbiJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRzdGFcdHNwXG4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0bGRhXHRzcCsxXG4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0c2JjXHRyMVxuIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdHN0YVx0c3ArMVxuIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdGxkYVx0c3BcbiJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRjbGNcbiJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRsZHhcdHNwKzFcbiJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRhZGNcdCNfX19mb1xuIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdGJjY1x0KiszXG4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0aW54XG4iCisKKyNkZWZpbmUgRlJFRVZMQV9SRUcgRklSU1RfUEFJUgorI2RlZmluZSBGUkVFVkxBX0lOTElORUFTTSAiXHRsZGFcdHIwXG4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRzdGFcdHNwXG4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRsZGFcdHIxXG4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRzdGFcdHNwKzFcbiIKKworI2RlZmluZSBPTERTUFZMQV9JTkxJTkVBU00gIlx0bGRhXHRzcCsxXG4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0dGF4XG4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0bGRhXHRzcCIKKworI2RlZmluZSBGUFZMQV9SRUcgKExBU1RfUEFJUi0yKQorCisjZGVmaW5lIEhBVkVfVEFSR0VUX1ZBUkhPT0tfUE9TVCAxCisKKyNkZWZpbmUgSEFWRV9ERUNJREVfUkVWRVJTRSAxCisKKyNkZWZpbmUgSEFWRV9UQVJHRVRfRUZGX0lDIDEKZGlmZiAtLWdpdCBhL21hY2hpbmVzLzgzMi9hZGRyZXNzaW5nbW9kZXMuYyBiL21hY2hpbmVzLzgzMi9hZGRyZXNzaW5nbW9kZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGVmZTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvODMyL2FkZHJlc3Npbmdtb2Rlcy5jCkBAIC0wLDAgKzEsNzQwIEBACisvKiBzZWFyY2ggZm9yIHBvc3NpYmxlIGFkZHJlc3NpbmctbW9kZXMgKi8KKworLyogRE9ORTogRGV0ZXJtaW5lIHdoZXRoZXIgYSBnaXZlbiBvYiBpcyBkaXNwb3NhYmxlLiAqLworCisvKiBUb0RvOiBMb29rIGZvciBwYWlycyBvZiBJQ3Mgd2l0aCBaIHNldCB0byByZWdpc3RlciwKKyAgIGZvbGxvd2VkIGJ5IGRpc3Bvc2FibGUgcTEgb24gdGhlIHNhbWUgcmVnaXN0ZXIgLT4KKyAgIHVzZSB0bXAgZm9yIHRoYXQgcmVnaXN0ZXIuICAoUHJvdmlkZWQgc2Vjb25kIElDIHdvbid0IHRyYXNoIHRtcCkKKyAgIENhbiB3ZSBhdm9pZCB0aGUgcGFzc2luZyByZWdpc3RlciBiZWluZyBhbGxvY2F0ZWQ/ICovCisKKy8qIExvb2sgZm9yIHdheXMgdG8gdXNlIGxkaWR4IHdoZW4gYW4gSUMgYWRkcyB0byBhIHBvaW50ZXIgYW5kIHRoZSBuZXh0IG9uZSBkZXJlZmVyZW5jZXMgaXQgKi8KKworCisjZGVmaW5lIERFRkVSUkVEUE9QX0ZMT1dDT05UUk9MIDAKKyNkZWZpbmUgREVGRVJSRURQT1BfTkVTVEVEQ0FMTFMgMQorI2RlZmluZSBERUZFUlJFRFBPUF9PSyAyCisKKworI2RlZmluZSBBTV9ERUJVRyAwCisKKy8vIElmIHRoZSBvYmogZG9lc24ndCBhbHJlYWR5IGhhdmUgYW4gYWRkcmVzc2luZyBtb2RlLCBjcmVhdGUgb25lIGFuZCB6ZXJvIGl0IG91dC4KK3N0YXRpYyB2b2lkIGFtX2FsbG9jKHN0cnVjdCBvYmogKm8pCit7CisJaWYgKCFvLT5hbSkgeworCQlvLT5hbSA9IG15bWFsbG9jKHNpemVvZihzdHJ1Y3QgQWRkcmVzc2luZ01vZGUpKTsKKwkJbWVtc2V0KG8tPmFtLCAwLCBzaXplb2Yoc3RydWN0IEFkZHJlc3NpbmdNb2RlKSk7CisJfQorfQorCisKK3ZvaWQgYW1fZGVmZXJyZWRwb3Aoc3RydWN0IElDICpwKQoreworCXN0cnVjdCBJQyAqcDI7CisJaW50IHB1c2hlZD0wOworCWludCBkZWZlcnJlZHBvcD0wOworCWludCBjYW5kZWZlcj0wOworCWZvcig7cDtwPXAtPm5leHQpCisJeworCQlzd2l0Y2gocC0+Y29kZSkKKwkJeworCQkJY2FzZSBQVVNIOgorCQkJCXB1c2hlZCs9cHVzaHNpemUocCk7CisvLwkJCQlwcmludGYoIlB1c2hpbmcgJWQgYnl0ZXMsICVkIHNvIGZhclxuIixwdXNoc2l6ZShwKSxwdXNoZWQpOworCQkJCWJyZWFrOworCQkJY2FzZSBDQUxMOgorLy8JCQkJcHJpbnRmKCJDQUxMIElDIHdpdGggcHVzaGVkc2l6ZSAlZFxuIixwdXNoZWRhcmdzaXplKHApKTsKKworCQkJCWFtX2FsbG9jKCZwLT56KTsKKworCQkJCS8qIFdlIGRldGVjdGVkIG5lc3RlZCBmdW5jdGlvbiBjYWxscyBieSBjb21wYXJpbmcgdGhlIGFtb3VudCBvZiBkYXRhIHB1c2hlZCB0byB0aGUgCisJCQkJICAgc3RhY2sgd2l0aCB0aGlzIGNhbGwncyBwdXNoZWRhcmdzaXplKCkuICBJZiB0aGV5IGRvbid0IG1hdGNoIHdlJ3JlIGRlYWxpbmcgd2l0aAorICAgICAgICAgICAgICAgICAgIG5lc3RlZCBjYWxscy4gIElmIHRoZXkgZG8gbWF0Y2gsIHdlIG1pZ2h0IGJlIGFibGUgdG8gZGVmZXIgc3RhY2sgcG9wcGluZy4gKi8KKwkJCQlpZihwdXNoZWQ9PXB1c2hlZGFyZ3NpemUocCkpCisJCQkJeworLy8JCQkJCXByaW50ZigiQ2hlY2tpbmcgZm9yIGZsb3cgY2hhbmdlXG4iKTsKKwkJCQkJcDI9cC0+bmV4dDsKKwkJCQkJY2FuZGVmZXI9MTsKKwkJCQkJd2hpbGUocDIpCisJCQkJCXsKKwkJCQkJCXN3aXRjaChwMi0+Y29kZSkKKwkJCQkJCXsKKwkJCQkJCQkvKiBJZiB3ZSBlbmNvdW50ZXIgTEFCRUwsIENPTVBBUkUsIFRFU1Qgb3IgYSBicmFuY2ggb3BlcmF0aW9uIHRoZW4gcHJvZ3JhbSBmbG93IGNoYW5nZXMKKwkJCQkJCQkgICBiZWZvcmUgdGhlIG5leHQgUFVTSCwgYW5kIHdlIGNhbid0IGRlZmVyIHRoZSBzdGFjayBwb3AuICovCisJCQkJCQkJY2FzZSBMQUJFTDoKKwkJCQkJCQljYXNlIENPTVBBUkU6CisJCQkJCQkJY2FzZSBURVNUOgorCQkJCQkJCWNhc2UgQkxUOgorCQkJCQkJCWNhc2UgQkdUOgorCQkJCQkJCWNhc2UgQkxFOgorCQkJCQkJCWNhc2UgQkdFOgorCQkJCQkJCWNhc2UgQkVROgorCQkJCQkJCWNhc2UgQk5FOgorCQkJCQkJCWNhc2UgQlJBOgorLy8JCQkJCQkJCXByaW50ZigiRmxvdyBjb250cm9sIGNoYW5nZWQgLSBjYW4ndCBkZWZlclxuIik7CisJCQkJCQkJCXAtPnouYW0tPmRlZmVycmVkcG9wPURFRkVSUkVEUE9QX0ZMT1dDT05UUk9MOworCQkJCQkJCQljYW5kZWZlcj0wOworCQkJCQkJCQlwMj0wOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQkvKiBJZiB3ZSBlbmNvdW50ZXIgYW5vdGhlciBQVVNIIG9wZXJhdGlvbiB3aXRob3V0IGEgZmxvdyBjb250cm9sIGNoYW5nZSB3ZSBjYW4gZGVmZXIgKi8KKwkJCQkJCQljYXNlIFBVU0g6CisvLwkJCQkJCQkJcHJpbnRmKCJDYW4gZGVmZXIgc3RhY2sgcG9wcGluZ1xuIik7CisJCQkJCQkJCXAyPTA7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCXAyPXAyLT5uZXh0OworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIC8qIHB1c2hlZGFyZ3NpemUoKSBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdGFjayBkaWZmZXJlZCBpbiBzaXplIC0gbmVzdGVkIGNhbGxzLiAqLworCQkJCXsKKwkJCQkJcC0+ei5hbS0+ZGVmZXJyZWRwb3A9REVGRVJSRURQT1BfTkVTVEVEQ0FMTFM7CisvLwkJCQkJcHJpbnRmKCJOZXN0ZWQgY2FsbCAtIGNhbid0IGRlZmVyIHN0YWNrIHBvcHBpbmdcbiIpOworCQkJCQljYW5kZWZlcj0wOworCQkJCX0KKworCQkJCWlmKGNhbmRlZmVyKQorCQkJCXsKKwkJCQkJcC0+ei5hbS0+ZGVmZXJyZWRwb3A9REVGRVJSRURQT1BfT0s7CisJCQkJCWRlZmVycmVkcG9wPXB1c2hlZGFyZ3NpemUocCk7CisJCQkJfQorCisJCQkJcHVzaGVkLT1wdXNoZWRhcmdzaXplKHApOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCX0KK30KKworCitzdGF0aWMgaW50IGlzX2FyaXRobWV0aWNfYml0d2lzZShpbnQgY29kZSkKK3sKKwlzd2l0Y2goY29kZSkKKwl7CisJCWNhc2UgQUREOgorCQljYXNlIEFEREkyUDoKKwkJY2FzZSBTVUI6CisJCWNhc2UgU1VCSUZQOgorCQljYXNlIE1VTFQ6CisJCWNhc2UgT1I6CisJCWNhc2UgWE9SOgorCQljYXNlIEFORDoKKwkJY2FzZSBMU0hJRlQ6CisJCWNhc2UgUlNISUZUOgorCQkJcmV0dXJuKDEpOworCQkJYnJlYWs7CisJfQorCXJldHVybigwKTsKK30KKworCit2b2lkIGFtX2NvbnZlcnNpb25zKHN0cnVjdCBJQyAqcCkKK3sKKwlpbnQgYzsKKwlzdHJ1Y3QgSUMgKnAyOworCXN0cnVjdCBJQyAqcDM7CisJZm9yICg7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWMgPSBwLT5jb2RlOworCQlzd2l0Y2goYykKKwkJeworCQkJY2FzZSBCRVE6CisJCQljYXNlIEJORToKKwkJCWNhc2UgQkxUOgorCQkJY2FzZSBCTEU6CisJCQljYXNlIEJHVDoKKwkJCWNhc2UgQkdFOgorCQkJY2FzZSBBTExPQ1JFRzoKKwkJCWNhc2UgRlJFRVJFRzoKKwkJCWNhc2UgTk9QOgorCQkJCWJyZWFrOworCQkJY2FzZSBDT05WRVJUOgorCQkJCXByaW50ZigiKGNvbnZlcnNpb24pXG4iKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlzd2l0Y2gocTF0eXAocCkmTlEpCisJCQkJeworCQkJCQljYXNlIENIQVI6CisJCQkJCWNhc2UgU0hPUlQ6CisJCQkJCQlwcmludGYoIklDICVkLCBub24taW50IG9wZXJhdGlvbiAleCwgJXhcbiIsYyxxMXR5cChwKSx6dHlwKHApKTsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCX0KK30KKworLy8gTG9vayBmb3IgODMyLXNwZWNpZmljIG9wdGltaXphdGlvbnMKKworZXh0ZXJuIHptYXggc2l6ZXRhYltNQVhfVFlQRSArIDFdOworCit2b2lkIGFtX3NpbXBsaWZ5KHN0cnVjdCBJQyAqcCkKK3sKKwlpbnQgYzsKKwlzdHJ1Y3QgSUMgKnAyOworCXN0cnVjdCBJQyAqcDM7CisJc3RydWN0IElDICpwcmV2OworCWZvciAoOyBwOyBwID0gcC0+bmV4dCkgeworCQljID0gcC0+Y29kZTsKKworCQlwMj1wLT5uZXh0OworCQlpZighcDIpCisJCQlicmVhazsKKwkJcDM9cDItPm5leHQ7CisJCWlmKCFwMykKKwkJCWJyZWFrOworCisJCXN3aXRjaChjKQorCQl7CisJCQkvLyBDaGVjayBmb3IgQUREUkVTUyBmb2xsb3dlZCBieSBwdXNoIC0gY2FuIHdlIG1lcmdlPworCQkJY2FzZSBBRERSRVNTOgorCQkJCWlmKChwLT56LmZsYWdzJihSRUd8RFJFRk9CSnxTQ1JBVENIKSkhPShSRUd8U0NSQVRDSCkpCisJCQkJCWJyZWFrOworCisvLwkJCQlwcmludGYoIkFkZHJlc3MgSUMgY2FuZGlkYXRlOiB6cmVnOiAlZCwgeiBmbGFncyAleFxuIixwLT56LnJlZyxwLT56LmZsYWdzKTsKKworCQkJCXdoaWxlKHAzKQorCQkJCXsKKy8vCQkJCQlwcmludGYoIiBuZXh0IG9wOiAleCwgcTFyZWc6ICVkLCBxMWZsYWdzOiAleCwgcTJyZWc6ICVkLCBxMmZsYWdzOiAleFxuIiwKKy8vCQkJCQkJcDItPmNvZGUscDItPnExLnJlZyxwMi0+cTEuZmxhZ3MscDItPnEyLnJlZyxwMi0+cTIuZmxhZ3MpOworCQkJCQlzd2l0Y2gocDItPmNvZGUpCisJCQkJCXsKKwkJCQkJCWNhc2UgUFVTSDoKKwkJCQkJCQlpZigocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSnxWQVJBRFIpKT09UkVHICYmIHAyLT5xMS5yZWc9PXAtPnoucmVnKQorCQkJCQkJCXsKKy8vCQkJCQkJCQlwcmludGYoInAzIGNvZGU6ICV4LCByZWc6ICVkXG4iLHAzLT5jb2RlLHAzLT5xMS5yZWcpOworCQkJCQkJCQlpZihwMy0+Y29kZSE9RlJFRVJFRyB8fCBwMy0+cTEucmVnIT1wLT56LnJlZykKKwkJCQkJCQkJCWJyZWFrOworLy8JCQkJCQkJCXByaW50ZigiUHVzaDogbWVyZ2luZ1xuIik7CisJCQkJCQkJCXAtPmNvZGU9Tk9QOwkvLyBEb24ndCBwcmVwYXJlIHRoZSBhZGRyZXNzIHRvIGEgcmVnaXN0ZXIuLi4KKwkJCQkJCQkJcDItPnExPXAtPnExOwkvLyBQdXNoIGl0IGRpcmVjdGx5LgorCQkJCQkJCQlwMi0+cTEuZmxhZ3N8PVZBUkFEUjsKKwkJCQkJCQkJcDM9MDsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIEZSRUVSRUc6CisJCQkJCQkJaWYocDItPnExLnJlZz09cC0+ei5yZWcpCisJCQkJCQkJeworLy8JCQkJCQkJCXByaW50ZigiRnJlZXJlZzogYmFpbGluZyBvdXRcbiIpOworCQkJCQkJCQlwMz0wOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJLy8gRG9lcyB0aGUgSUMgcmVmZXJlbmNlIHRoZSByZWdpc3Rlcj8KKwkJCQkJaWYoKHAyLT5xMS5mbGFncyZSRUcpICYmIHAyLT5xMS5yZWc9PXAtPnoucmVnKQorCQkJCQkJcDM9MDsKKwkJCQkJZWxzZSBpZigocDItPnEyLmZsYWdzJlJFRykgJiYgcDItPnEyLnJlZz09cC0+ei5yZWcpCisJCQkJCQlwMz0wOworCQkJCQlwMj1wMzsKKwkJCQkJaWYocDMpCisJCQkJCQlwMz1wMy0+bmV4dDsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCS8vIENoZWNrIGZvciBHRVRSRVRVUk4gZm9sbG93ZWQgYnkgVEVTVC9DT01QQVJFIG9mIGNhbGwgcmVzdWx0IHdoaWNoIGlzIHRoZW4gZGlzY2FyZGVkLi4uCisJCQljYXNlIEdFVFJFVFVSTjoKKwkJCQlpZigocC0+ei5mbGFncyYoUkVHfERSRUZPQkp8U0NSQVRDSCkpIT0oUkVHfFNDUkFUQ0gpKQorCQkJCQlicmVhazsKKworCQkJCS8vIEZJWE1FIC0gY2FuIGRvIHRoZSBzYW1lIGZvciBvdGhlciBpbnN0cnVjdGlvbnMsIHByb3ZpZGVkIHdlIGRvbid0IG5lZWQgdG8gdXNlIHIwIHRvIGRlcml2ZSB0aGUgc2Vjb25kIG9wLgorCisJCQkJaWYocDMtPmNvZGUhPUZSRUVSRUcgfHwgcDMtPnExLnJlZyE9cC0+ei5yZWcpCisJCQkJCWJyZWFrOworCisJCQkJc3dpdGNoKHAyLT5jb2RlKQorCQkJCXsKKwkJCQkJY2FzZSBURVNUOgorCQkJCQkJaWYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikhPVJFRyB8fCBwMi0+cTEucmVnIT1wLT56LnJlZykKKwkJCQkJCQlicmVhazsKKwkJCQkJCXAtPmNvZGU9Tk9QOwkvLyBEb24ndCBib3RoZXIgcmV0cmlldmluZyB0aGUgcmV0dXJuIHZhbHVlLi4uCisJCQkJCQlwMi0+cTEucmVnPXAtPnExLnJlZzsJLy8gVGVzdCBpdCBkaXJlY3RseSBmcm9tIHJldHVybiByZWdpc3Rlci4KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFNFVFJFVFVSTjoKKwkJCQkJCWlmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopIT1SRUcgfHwgcDItPnExLnJlZyE9cC0+ei5yZWcpCisJCQkJCQkJYnJlYWs7CisJCQkJCQlwLT5jb2RlPU5PUDsJLy8gRG9uJ3QgYm90aGVyIHJldHJpZXZpbmcgdGhlIHJldHVybiB2YWx1ZS4uLgorCQkJCQkJcDItPnExLnJlZz1wLT5xMS5yZWc7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBDT01QQVJFOgorCQkJCQkJaWYoKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHICYmIHAyLT5xMS5yZWc9PXAtPnoucmVnKQorCQkJCQkJeworCQkJCQkJCS8vIE1ha2Ugc3VyZSB0aGUgb3RoZXIgb3AgaXMgc2ltcGxlIGVub3VnaCBub3QgdG8gbmVlZCByMDogRklYTUUgLSBjYW4gd2UgaW1wcm92ZSB0aGlzPworLy8JCQkJCQkJaWYoKHAyLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHIHx8IHAyLT5xMi5mbGFncyZLT05TVCkKKy8vCQkJCQkJCXsKKwkJCQkJCQkJLy8gQ09NUEFSRSBpcyBndWFyYW50ZWVkIG5vdCB0byB0b3VjaCB0MSAocjApLgorCQkJCQkJCQlwLT5jb2RlPU5PUDsJLy8gRG9uJ3QgYm90aGVyIHJldHJpZXZpbmcgdGhlIHJldHVybiB2YWx1ZS4uLgorCQkJCQkJCQlwMi0+cTEucmVnPXAtPnExLnJlZzsJLy8gVGVzdCBpdCBkaXJlY3RseSBmcm9tIHJldHVybiByZWdpc3Rlci4KKy8vCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYoKHAyLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHICYmIHAyLT5xMi5yZWc9PXAtPnoucmVnKQorCQkJCQkJeworLy8JCQkJCQkJaWYoKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHIHx8IHAyLT5xMS5mbGFncyZLT05TVCkKKy8vCQkJCQkJCXsKKwkJCQkJCQkJLy8gQ09NUEFSRSBpcyBndWFyYW50ZWVkIG5vdCB0byB0b3VjaCB0MSAocjApLgorCQkJCQkJCQlwLT5jb2RlPU5PUDsJLy8gRG9uJ3QgYm90aGVyIHJldHJpZXZpbmcgdGhlIHJldHVybiB2YWx1ZS4uLgorCQkJCQkJCQlwMi0+cTIucmVnPXAtPnExLnJlZzsJLy8gVGVzdCBpdCBkaXJlY3RseSBmcm9tIHJldHVybiByZWdpc3Rlci4KKy8vCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJLy8gTG9hZHMgY2F1c2UgYXV0b21hdGljIHplcm8tZXh0ZW5zaW9uIHNvIGNhbiBhdm9pZCBjb252ZXJzaW9uCisJCQkvLyBpbiB0aGF0IGNhc2UuICBBcml0aG1ldGljIGZ1bmN0aW9ucyBtYXkgcmVxdWlyZSBjb252ZXJzaW9uIC0gd2l0aCB0aGUgZXhjZXB0aW9uIG9mIEFORCBhbmQgKHVuc2lnbmVkKSBTSFIsCisJCQkvLyBzaW5jZSBuZWl0aGVyIGNhbiByZXN1bHQgaW4gZXh0cmEgc2V0IGJpdHMgaW4gdGhlIE1TQnMuCisJCQljYXNlIENPTlZFUlQ6CisJCQkJaWYocDItPmNvZGU9PUNPTlZFUlQpCisJCQkJeworLy8JCQkJCXByaW50ZigiRm91bmQgc3VjY2Vzc2l2ZSBDb252ZXJ0IElDc1xuIik7CisvLwkJCQkJcHJpbnRmKCJwMTogJXgsICVkLCAleCAtPiAleCwgcDI6ICV4LCAlZCwgJXggLT4gJXhcbiIscC0+ei5mbGFncyxwLT56LnJlZyxxMXR5cChwKSx6dHlwKHApLAorLy8JCQkJCQlwMi0+cTEuZmxhZ3MscDItPnExLnJlZyxxMXR5cChwMiksenR5cChwMikpOworCQkJCQlpZigocC0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHICYmICgocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpICYmIHAtPnoucmVnPT1wMi0+cTEucmVnKQorCQkJCQl7CisvLwkJCQkJCXByaW50ZigiUmVnaXN0ZXIgbWF0Y2hcbiIpOworCQkJCQkJaWYoKChxMXR5cChwKSZOUSk8KHp0eXAocCkmTlEpKSAmJiAocTF0eXAocCk9PXp0eXAocDIpKSkKKwkJCQkJCXsKKy8vCQkJCQkJCXByaW50ZigiU2l6ZXMgbWF0Y2ggLSBudWxsaWZ5aW5nIGNvbnZlcnNpb24gdG8gd2lkZXIgdHlwZS5cbiIpOworCQkJCQkJCXAtPmNvZGU9Tk9QOworCQkJCQkJCXAyLT5xMT1wLT5xMTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmIChBTV9ERUJVRykKKwkJCQkJCXByaW50ZigiQ2hlY2tpbmcgY29udmVyc2lvbiBmcm9tICVkIHRvICVkLCAlZCB0byAlZFxuIixxMXR5cChwKSx6dHlwKHApLHAtPnExLnJlZyxwLT56LnJlZyk7CisJCQkJCS8qIEVsaW1pbmF0ZSBjb252ZXJzaW9ucyB0byB3aWRlciB0eXBlcyB3aXRoaW4gYSBzaW5nbGUgcmVnaXN0ZXIgaWYgdGhlIHZhbHVlIGlzIHVuc2lnbmVkICovCisJCQkJCWlmKChwLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcgJiYgKChwLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKSAmJiBwLT56LnJlZz09cC0+cTEucmVnKSB7CisJCQkJCQlpZigocTF0eXAocCkmVU5TSUdORUQpICYmIChzaXpldGFiW3ExdHlwKHApICYgTlFdIDwgc2l6ZXRhYlt6dHlwKHApICYgTlFdKSkgeworCQkJCQkJCWlmIChBTV9ERUJVRykKKwkJCQkJCQkJcHJpbnRmKCJFbGltaW5hdGluZyB1bm5lY2Vzc2FyeSBjb252ZXJzaW9uXG4iKTsKKwkJCQkJCQlwLT5jb2RlPU5PUDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKy8vCQkJCXByaW50aWMoc3Rkb3V0LHApOworCQkJCWJyZWFrOworCisJCQkvLyBMb29rIGZvciBzaXR1YXRpb25zIHdoZXJlIGFuIGFyaXRobWV0aWMgb3BlcmF0aW9uIHdpbGwgaGF2ZSBzZXQgZmxhZ3MsCisJCQkvLyByZW5kZXJpbmcgYW4gZXhwbGljaXQgVEVTVCB1bm5lY2Vzc2FyeS4KKwkJCWNhc2UgVEVTVDoKKwkJCQlwcmV2PXAtPnByZXY7CisJCQkJaWYocHJldikKKwkJCQl7CisvLwkJCQkJcHJpbnRmKCJURVNUIGZvdW5kLCBldmFsdWF0aW5nIHByZXZpb3VzIElDXG4iKTsKKwkJCQkJaWYoaXNfYXJpdGhtZXRpY19iaXR3aXNlKHByZXYtPmNvZGUpKQorCQkJCQl7CisvLwkJCQkJCQlwcmludGYoIkFyaXRobWV0aWMgLyBiaXR3aXNlIElDIGZvdW5kXG4iKTsKKy8vCQkJCQkJCXByaW50ZigiJXgsICVkLCAleCwgJWRcbiIscHJldi0+ei5mbGFncyxwcmV2LT56LnJlZyxwLT5xMS5mbGFncyxwLT5xMS5yZWcpOworCQkJCQkJaWYoKHByZXYtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyAmJiAoKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpICYmIHByZXYtPnoucmVnPT1wLT5xMS5yZWcpCisJCQkJCQl7CisvLwkJCQkJCQkJcHJpbnRmKCJSZWdpc3RlciBtYXRjaFxuIik7CisJCQkJCQkJcC0+Y29kZT1OT1A7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJLy8gTG9vayBmb3IgY2FzZXMgd2hlcmUgbXVsdGlwbGUgYXJpdGhtZXRpYyAvIGJpdHdpc2UgaW5zdHJ1Y3Rpb25zIGFyZSBjaGFpbmVkIGFuZCBjb3VsZAorCQkJCS8vIGF2b2lkIHdyaXRpbmcgdG8gYW4gaW50ZXJtZWRpYXRlIHJlZ2lzdGVyLi4uCisJCQkJaWYoaXNfYXJpdGhtZXRpY19iaXR3aXNlKGMpICYmIGlzX2FyaXRobWV0aWNfYml0d2lzZShwMi0+Y29kZSkgJiYgcDMtPmNvZGU9PUZSRUVSRUcpCisJCQkJeworCQkJCQlpZiAoQU1fREVCVUcpCisJCQkJCQlwcmludGYoIkV2YWx1YXRpbmcgcGFpciBvZiBhcml0aG1ldGljIG9wcyBmb2xsb3dlZCBieSBmcmVlcmVnLi4uXG4iKTsKKwkJCQkJaWYoKChwLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpICYmICgocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpICYmICgocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRykpCisJCQkJCXsKKwkJCQkJCWlmIChBTV9ERUJVRykKKwkJCQkJCQlwcmludGYoIk9wcyBhcmUgYWxsIHJlZ2lzdGVyIGJhc2VkLi4uXG4iKTsKKwkJCQkJCWlmIChBTV9ERUJVRykKKwkJCQkJCQlwcmludGYoInAxLnExOiAlcywgcDEucTI6ICVzLCBwMS56OiAlcyAgLSAgcDIucTE6ICVzLCBwMi5xMjogJXMsIHAyLno6ICVzXG4iLAorCQkJCQkJCQlyZWduYW1lc1twLT5xMS5yZWddLHJlZ25hbWVzW3AtPnEyLnJlZ10scmVnbmFtZXNbcC0+ei5yZWddLAorCQkJCQkJCQlyZWduYW1lc1twMi0+cTEucmVnXSxyZWduYW1lc1twMi0+cTIucmVnXSxyZWduYW1lc1twMi0+ei5yZWddKTsKKwkJCQkJCWlmKHAyLT5xMS5yZWc9PXAzLT5xMS5yZWcgJiYgcC0+ei5yZWc9PXAyLT5xMS5yZWcgJiYgcDItPnExLnJlZyE9cDItPnoucmVnICYmIHAyLT5xMi5yZWchPXAyLT56LnJlZykKKwkJCQkJCXsKKwkJCQkJCQlpZiAoQU1fREVCVUcpCisJCQkJCQkJCXByaW50ZigiRnJlZXJlZyBtYXRjaGVzIC0gYWRqdXN0aW5nXG4iKTsKKwkJCQkJCQlwLT56LnJlZz1wMi0+ei5yZWc7CisJCQkJCQkJcDItPnExLnJlZz1wMi0+ei5yZWc7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJLy8gRklYTUUgLSBleHBsb3JlIHRoZSBsaWZldGltZSBvZiB0aGUgcmVnaXN0ZXIgd2UndmUganVzdCBhdm9pZGVkOyBjYW4gd2UKKwkJCQkJLy8gYXZvaWQgYWxsb2NhdGluZyAvIGZyZWVpbmcgaXQ/ICBXb24ndCBoZWxwIHRoZSBjb2RlLWdlbmVyYXRvciBidXQgbWlnaHQgYmUKKwkJCQkJLy8gYWJsZSB0byBhdm9pZCBzYXZpbmcgLyByZXN0b3JpbmcgaXQgaW4gdGhlIGZ1bmN0aW9uIGhlYWQgLyB0YWlsLgorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvLyBMb29rIHNwZWNpZmljaWFsbHkgZm9yIGFkZHQgY2FuZGlkYXRlcy4uLgorCQkJCQlpZihjPT1BREQgfHwgYz09QURESTJQKQorCQkJCQl7CisJCQkJCQlpbnQgenI9KHAtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyA/IDEgOiAwOworCisvLwkJCQkJCXByaW50ZigiYWRkICV4LCAleCwgJXgsICVzLCAlcywgJXNcbiIscC0+cTEuZmxhZ3MscC0+cTIuZmxhZ3MscC0+ei5mbGFncywKKy8vCQkJCQkJCQlyZWduYW1lc1twLT5xMS5yZWddLHJlZ25hbWVzW3AtPnEyLnJlZ10scmVnbmFtZXNbcC0+ei5yZWddKTsKKwkJCQkJCWlmKChwLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKQorCQkJCQkJeworCQkJCQkJCWlmKCF6ciB8fCBwLT56LnJlZyE9cC0+cTEucmVnKQorCQkJCQkJCXsKKwkJCQkJCQkJaWYoKHAtPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpICAvLyByZWcgKyByZWcgPT4gcmVnCisJCQkJCQkJCXsKKwkJCQkJCQkJCS8vIEFsbCB0aHJlZSBvcGVyYW5kcyBhcmUgcmVnaXN0ZXJzIC0gYXJlIHRoZXkgYWxsIGRpZmZlcmVudD8KKwkJCQkJCQkJCWlmKCh6ciB8fCBwLT56LnJlZyE9cC0+cTIucmVnKSAmJiBwLT5xMS5yZWchPXAtPnEyLnJlZykKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQlhbV9hbGxvYygmcC0+cTEpOworCQkJCQkJCQkJCXAtPnExLmFtLT50eXBlPUFNX0FERFQ7CisJCQkJCQkJCQkJaWYgKEFNX0RFQlVHKQorCQkJCQkJCQkJCQlwcmludGYoIk1hcmtlZCBhZGR0IGNhbmRpZGF0ZVxuIik7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJaWYoKHAtPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKSAvLyByZWcgKyBjb25zdCA9PiByZWcKKwkJCQkJCQkJeworCQkJCQkJCQkJYW1fYWxsb2MoJnAtPnExKTsKKwkJCQkJCQkJCXAtPnExLmFtLT50eXBlPUFNX0FERFQ7CisJCQkJCQkJCQlpZiAoQU1fREVCVUcpCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJcHJpbnRmKCJNYXJrZWQgYWRkdCBjYW5kaWRhdGVcbiIpOworCQkJCQkJCQkJCXByaW50ZigiUmVnICsgS29uc3QgPT4gUmVnXG4iKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCX0KK30KKwordm9pZCBhbV9kaXNwb3NhYmxlKHN0cnVjdCBJQyAqcCwgc3RydWN0IG9iaiAqbykKK3sKKwlzdHJ1Y3QgSUMgKnAyOworCWludCBkaXNwb3NhYmxlID0gMDsKKwlpZiAoby0+ZmxhZ3MgJiBSRUcpIHsKKwkJLy8gQ292ZXIgdGhlIGNhc2Ugd2hlcmUgcTEgb3IgcTIgYXJlIHRoZSBzYW1lIHJlZ2lzdGVyIGFzIHouCisJCWlmKG8hPSZwLT56KQorCQl7CisJCQkvLyBXZSdyZSB3cml0aW5nIHRvIHRoZSBzYW1lIHJlZ2lzdGVyIGFzIHdlJ3JlIHJlYWRpbmcgZnJvbSAtIG5vdCBkaXNwb3NhYmxlIQorCQkJaWYoKHAtPnouZmxhZ3MmUkVHKSAmJiBwLT56LnJlZz09by0+cmVnKQorCQkJCXJldHVybjsKKwkJfQorCQlwMiA9IHAtPm5leHQ7CisJCXdoaWxlIChwMikgeworCQkJaWYgKHAyLT5jb2RlID09IEZSRUVSRUcgJiYgcDItPnExLnJlZyA9PSBvLT5yZWcpIHsKKwkJCQlpZiAoQU1fREVCVUcpCisJCQkJCXByaW50ZigiXHQoJXMgZGlzcG9zYWJsZS4pXG4iLCByZWduYW1lc1tvLT5yZWddKTsKKwkJCQlhbV9hbGxvYyhvKTsKKwkJCQlvLT5hbS0+ZGlzcG9zYWJsZSA9IDE7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKCgocDItPnExLmZsYWdzICYgUkVHKQorCQkJICAgICAmJiBwMi0+cTEucmVnID09IG8tPnJlZykKKwkJCSAgICB8fCAoKHAyLT5xMi5mbGFncyAmIFJFRykKKwkJCQkmJiBwMi0+cTIucmVnID09IG8tPnJlZykKKwkJCSAgICB8fCAoKHAyLT56LmZsYWdzICYgUkVHKQorCQkJCSYmIHAyLT56LnJlZyA9PSBvLT5yZWcpKSB7CisJCQkJLy9Gb3VuZCBhbm90aGVyIGluc3RydWN0aW9uIHJlZmVyZW5jaW5nIHJlZyAtIG5vdCBkaXNwb3NhYmxlLgorCQkJCXJldHVybjsKKwkJCX0KKwkJCXN3aXRjaCAocDItPmNvZGUpIHsKKwkJCWNhc2UgQ0FMTDoKKwkJCWNhc2UgQkVROgorCQkJY2FzZSBCTkU6CisJCQljYXNlIEJMVDoKKwkJCWNhc2UgQkdFOgorCQkJY2FzZSBCTEU6CisJCQljYXNlIEJHVDoKKwkJCWNhc2UgQlJBOgorCQkJCS8vIENvbnRyb2wgZmxvdyBjaGFuZ2VkLCBlcnJpbmcgb24gdGhlIHNpZGUgb2Ygc2FmZXR5IC0gbm90IGRpc3Bvc2FibGUuCisJCQkJcmV0dXJuOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCXAyID0gcDItPm5leHQ7CisJCX0KKwl9Cit9CisKK3N0cnVjdCBvYmogKnRocm93YXdheV9yZWcoc3RydWN0IElDICpwLGludCByZWcpCit7CisJc3RydWN0IG9iaiAqcmVzdWx0PTA7CisJaWYgKEFNX0RFQlVHKQorCQlwcmludGYoIlx0Q2hlY2tpbmcgSUMgZm9yIHJlZyAlc1xuIiwgcmVnbmFtZXNbcmVnXSk7CisJaWYocCkgeworCQlpZigocC0+cTEuZmxhZ3MmUkVHKSAmJiBwLT5xMS5yZWc9PXJlZykgeworCQkJYW1fZGlzcG9zYWJsZShwLCZwLT5xMSk7CisJCQlpZihwLT5xMS5hbSAmJiBwLT5xMS5hbS0+ZGlzcG9zYWJsZSkKKwkJCQlyZXN1bHQ9JnAtPnExOworCQl9IGVsc2UgaWYoKHAtPnouZmxhZ3MmUkVHKSAmJiBwLT56LnJlZz09cmVnKSB7CisJCQlhbV9kaXNwb3NhYmxlKHAsJnAtPnopOworCQkJaWYocC0+ei5hbSAmJiBwLT56LmFtLT5kaXNwb3NhYmxlKQorCQkJCXJlc3VsdD0mcC0+ejsKKwkJfQorCX0KKwlpZiAoQU1fREVCVUcpCisJCXByaW50ZigiXHRSZXR1cm5pbmcgJXhcbiIsIHJlc3VsdCk7CisJcmV0dXJuKHJlc3VsdCk7Cit9CisKKworc3RydWN0IElDICphbV9maW5kX2FkanVzdG1lbnQoc3RydWN0IElDICpwLCBpbnQgcmVnKQoreworCXN0cnVjdCBJQyAqcDIgPSBwLT5uZXh0OworCS8vIEZJWE1FIC0gbGltaXQgaG93IG1hbnkgc3RlcHMgd2UgY2hlY2suLi4KKwkvKiBMb29rIGZvciBhIHBvc3QtaW5jcmVtZW50ICovCisJd2hpbGUgKHAyKSB7CisvLwkJcHJpbnRmKCJcdFx0Q2hlY2tpbmcgY29kZSAlZFxuIixwMi0+Y29kZSk7CisJCWlmIChwMi0+Y29kZSA9PSBBRERJMlApIHsKKy8vCQkJaWYgKEFNX0RFQlVHKQorLy8JCQkJcHJpbnRmKCJcdEZvdW5kIEFkZGkycCB0byByZWdpc3RlciAlcyBcbiIsIHJlZ25hbWVzW3AyLT56LnJlZ10pOworCQkJaWYgKChwMi0+cTIuZmxhZ3MgJiBLT05TVCkgJiYgKHAyLT56LmZsYWdzICYgUkVHKSkgeworCQkJCWlmIChwMi0+ei5yZWcgPT0gcmVnKSB7CisJCQkJCWlmIChBTV9ERUJVRykKKwkJCQkJCXByaW50ZigiXHRcdEFkanVzdGluZyB0aGUgY29ycmVjdCByZWdpc3RlciAtIG1hdGNoIGZvdW5kXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYocDIgJiYgcDItPnExLnJlZyA9PSByZWcpIHsJCisJCQkJCQlpZiAoQU1fREVCVUcpCisJCQkJCQkJcHJpbnRmKCJcdFx0V3JpdGluZyB0byBkaWZmZXJlbnQgcmVnIC0gaXMgc291cmNlIHJlZyBkaXNwb3NhYmxlPyAgIik7CisJCQkJCQlhbV9kaXNwb3NhYmxlKHAyLCAmcDItPnExKTsKKwkJCQkJCWlmKHAyLT5xMS5hbSAmJiBwMi0+cTEuYW0tPmRpc3Bvc2FibGUpeworCQkJCQkJCWlmIChBTV9ERUJVRykKKwkJCQkJCQkJcHJpbnRmKCJ5ZXNcbiIpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpZiAoQU1fREVCVUcpCisJCQkJCQkJCXByaW50Zigibm8gLSBiYWlsaW5nIG91dFxuIik7CisJCQkJCQkJcDI9MDsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChBTV9ERUJVRykKKwkJCQkJCQlwcmludGYoIlx0XHRXcm9uZyByZWdpc3RlciAtIGtlZXAgbG9va2luZ1xuIik7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChBTV9ERUJVRykKKwkJCQkJcHJpbnRmKCJcdFx0bm90IGEgY29uc3RhbnQsIGhvd2V2ZXIgLSBiYWlsaW5nIG91dC5cbiIpOworCQkJCXAyID0gMDsKKwkJCX0KKwkJfSBlbHNlIGlmICgoKHAyLT5xMS5mbGFncyAmIChSRUcgfCBEUkVGT0JKKSkgJiYgcDItPnExLnJlZyA9PSByZWcpCisJCQkgICB8fCAoKHAyLT5xMi5mbGFncyAmIChSRUcgfCBEUkVGT0JKKSkKKwkJCSAgICAgICAmJiBwMi0+cTIucmVnID09IHJlZykKKwkJCSAgIHx8ICgocDItPnouZmxhZ3MgJiAoUkVHIHwgRFJFRk9CSikpCisJCQkgICAgICAgJiYgcDItPnoucmVnID09IHJlZykpIHsKKwkJCWlmIChBTV9ERUJVRykKKwkJCQlwcmludGYoIlx0XHRGb3VuZCBhbm90aGVyIGluc3RydWN0aW9uIHJlZmVyZW5jaW5nIHJlZyAtIGJhaWxpbmcgb3V0XG4iKTsKKwkJCXAyID0gMDsKKwkJfSBlbHNlIGlmIChwMi0+Y29kZT49QkVRICYmIHAyLT5jb2RlPD1CUkEpIHsKKwkJCWlmIChBTV9ERUJVRykKKwkJCQlwcmludGYoIlx0XHRGb3VuZCBhIGJyYW5jaCBpbnN0cnVjdGlvbiAtIGJhaWxpbmcgb3V0XG4iKTsKKwkJCXAyID0gMDsKKwkJfSBlbHNlIGlmIChwMi0+Y29kZT49TEFCRUwpIHsKKwkJCWlmIChBTV9ERUJVRykKKwkJCQlwcmludGYoIlx0XHRGb3VuZCBhIGxhYmVsIC0gYmFpbGluZyBvdXRcbiIpOworCQkJcDIgPSAwOworCQl9CisJCWlmIChwMikKKwkJCXAyID0gcDItPm5leHQ7CisJfQorCWlmIChwMikKKwkJcmV0dXJuIChwMik7CisJaWYgKEFNX0RFQlVHKQorCQlwcmludGYoIlx0Tm8gcG9zdGluY3JlbWVudHMgZm91bmQgLSBjaGVja2luZyBmb3IgcHJlZGVjcmVtZW50c1xuIik7CisJLyogU2VhcmNoIGZvciBhIHByZWRlY3JlbWVudCAqLworCXAyID0gcC0+cHJldjsKKwl3aGlsZSAocDIpIHsKKwkJaWYgKHAyLT5jb2RlID09IFNVQklGUCkgeworCQkJaWYgKEFNX0RFQlVHKQorCQkJCXByaW50ZigiXHRcdEZvdW5kIHN1YmlmcCB0byByZWdpc3RlciAlcyBcbiIsIHJlZ25hbWVzW3AyLT56LnJlZ10pOworCQkJaWYgKChwMi0+cTIuZmxhZ3MgJiBLT05TVCkgJiYgKHAyLT56LmZsYWdzICYgUkVHKSkgeworCQkJCWlmIChwMiAmJiBwMi0+ei5yZWcgPT0gcmVnKSB7CisJCQkJCWlmIChBTV9ERUJVRykKKwkJCQkJCXByaW50ZigiXHRcdEFkanVzdGluZyB0aGUgY29ycmVjdCByZWdpc3RlciAtIG1hdGNoIGZvdW5kXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYocDIgJiYgcDItPnExLnJlZyA9PSByZWcpIHsJCisJCQkJCQlpZiAoQU1fREVCVUcpCisJCQkJCQkJcHJpbnRmKCJcdFx0V3JpdGluZyB0byBkaWZmZXJlbnQgcmVnIC0gaXMgc291cmNlIHJlZyBkaXNwb3NhYmxlPyAgIik7CisJCQkJCQlhbV9kaXNwb3NhYmxlKHAyLCAmcDItPnExKTsKKwkJCQkJCWlmKHAyLT5xMS5hbSAmJiBwMi0+cTEuYW0tPmRpc3Bvc2FibGUpeworCQkJCQkJCWlmIChBTV9ERUJVRykKKwkJCQkJCQkJcHJpbnRmKCJ5ZXNcbiIpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpZiAoQU1fREVCVUcpCisJCQkJCQkJCXByaW50Zigibm8gLSBiYWlsaW5nIG91dFxuIik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChBTV9ERUJVRykKKwkJCQkJcHJpbnRmKCJcdFx0bm90IGEgY29uc3RhbnQsIGhvd2V2ZXIgLSBiYWlsaW5nIG91dC5cbiIpOworCQkJCXAyID0gMDsKKwkJCX0KKwkJfSBlbHNlIGlmICgoKHAyLT5xMS5mbGFncyAmIChSRUcgfCBEUkVGT0JKKSkgJiYgcDItPnExLnJlZyA9PSByZWcpCisJCQkgICB8fCAoKHAyLT5xMi5mbGFncyAmIChSRUcgfCBEUkVGT0JKKSkKKwkJCSAgICAgICAmJiBwMi0+cTIucmVnID09IHJlZykKKwkJCSAgIHx8ICgocDItPnouZmxhZ3MgJiAoUkVHIHwgRFJFRk9CSikpCisJCQkgICAgICAgJiYgcDItPnoucmVnID09IHJlZykpIHsKKwkJCWlmIChBTV9ERUJVRykKKwkJCQlwcmludGYoIlx0XHRGb3VuZCBhbm90aGVyIGluc3RydWN0aW9uIHJlZmVyZW5jaW5nIHJlZyAtIGJhaWxpbmcgb3V0XG4iKTsKKwkJCXAyID0gMDsKKwkJfQorCQkvLyBGSVhNRSAtIGNoZWNrIGZvciBjb250cm9sIGZsb3cgY2hhbmdlcworCQlpZiAocDIpCisJCQlwMiA9IHAyLT5wcmV2OworCX0KKwlyZXR1cm4gKHAyKTsKK30KKworLy8gSWYgd2UgaGF2ZSBhIGNhbmRpZGF0ZSBmb3IgcHJlL3Bvc3QgaW5jcmVtZW50L2RlY3JlbWVudCwgdmFsaWRhdGUgdGhhdCB3ZSBjYW4gdXNlIGl0LAorLy8gYW5kIHJldHVybiB0aGUgb2Zmc2V0LiAgWmVybyBpZiB3ZSBjYW4ndCB1c2UgaXQuCitpbnQgYW1fZ2V0X2FkanZhbHVlKHN0cnVjdCBJQyAqcCwgaW50IHR5cGUsIGludCB0YXJnZXQpCit7CisJaW50IG9mZnNldCA9IHAtPnEyLnZhbC52bWF4OworCWlmIChwLT5jb2RlID09IFNVQklGUCkKKwkJb2Zmc2V0ID0gLW9mZnNldDsKKwlpZiAoQU1fREVCVUcpCisJCXByaW50ZigiT2Zmc2V0IGlzICVkLCB0eXBlIGlzICVkLCB3cml0aW5nIHRvIHRhcmdldD8gJXNcbiIsIG9mZnNldCwgdHlwZSAmIE5RLCB0YXJnZXQgPyAieWVzIiA6ICJubyIpOworCS8vIFZhbGlkYXRlIG9mZnNldCBhZ2FpbnN0IHR5cGUgYW5kIENQVSdzIGNhcGFiaWxpdGllcy4KKwlzd2l0Y2ggKHR5cGUgJiBOUSkgeworCWNhc2UgQ0hBUjoJCS8vIFdlIG9ubHkgc3VwcG9ydCBwb3N0aW5jcmVtZW50IGZvciBDSEFScworCQlpZiAob2Zmc2V0ICE9IDEpCisJCQlvZmZzZXQgPSAwOworCQlpZiAocC0+Y29kZSA9PSBTVUJJRlApCisJCQlvZmZzZXQgPSAwOworCQlicmVhazsKKwljYXNlIElOVDoKKwljYXNlIExPTkc6CisJY2FzZSBQT0lOVEVSOgkJLy8gV2Ugc3VwcG9ydCBwb3N0LWluY3JlbWVudCBhbmQgcHJlZGVjcmVtZW50IGZvciBJTlRzL0xPTkdzL1BUUnMKKy8vICAgICAgICAgICAgICAgICAgICAgIGlmKHRhcmdldCAmJiBvZmZzZXQhPS00KSAgICAgICAgLy8gV2Ugb25seSBzdXBwb3J0IHByZWRlYyBmb3Igd3JpdGluZy4KKwkJaWYgKHRhcmdldCAmJiAoKG9mZnNldCAhPSAtNCkgJiYgKG9mZnNldCAhPSA0KSkpCS8vIFdlIG5vdyBzdXBwb3J0IHByZWRlYyBhbmQgcG9zdGluYyBmb3Igd3JpdGluZy4KKwkJCW9mZnNldCA9IDA7CisJCWlmICghdGFyZ2V0ICYmIG9mZnNldCAhPSA0KQkvLyBXZSBvbmx5IHN1cHBvcnQgcG9zdGluYyBmb3IgcmVhZGluZworCQkJb2Zmc2V0ID0gMDsKKwkJaWYgKHAtPmNvZGUgPT0gQURESTJQICYmIG9mZnNldCAhPSA0KQorCQkJb2Zmc2V0ID0gMDsKKwkJaWYgKHAtPmNvZGUgPT0gU1VCSUZQICYmIG9mZnNldCAhPSAtNCkKKwkJCW9mZnNldCA9IDA7CisJCWJyZWFrOworCWNhc2UgU0hPUlQ6CQkvLyBXZSBkb24ndCBzdXBwb3J0IGVpdGhlciBtb2RlIGZvciBzaG9ydHMgb3IgYW55dGhpbmcgZWxzZS4KKwlkZWZhdWx0OgorCQlvZmZzZXQgPSAwOworCX0KKwlpZiAoQU1fREVCVUcpCisJCXByaW50ZigiVmFsaWRhdGVkIG9mZnNldCBpcyAlZFxuIiwgb2Zmc2V0KTsKKwlyZXR1cm4gKG9mZnNldCk7Cit9CisKK3ZvaWQgYW1fcHJlcG9zdF9pbmNkZWMoc3RydWN0IElDICpwLCBzdHJ1Y3Qgb2JqICpvKQoreworCXN0cnVjdCBJQyAqcDIgPSAwOworCWludCB0eXBlOworCisJaWYgKG8tPmZsYWdzICYgKFJFRykgJiYgKG8tPmZsYWdzICYgRFJFRk9CSikpIHsKKwkJaWYgKEFNX0RFQlVHKQorCQkJcHJpbnRmKCJEZXJlZmVyZW5jaW5nIHJlZ2lzdGVyICVzIC0gc2VhcmNoaW5nIGZvciBhZGp1c3RtZW50c1xuIiwgcmVnbmFtZXNbby0+cmVnXSk7CisJCXAyID0gYW1fZmluZF9hZGp1c3RtZW50KHAsIG8tPnJlZyk7CisKKwkJaWYgKHAyKQkJLy8gRGlkIHdlIGZpbmQgYSBjYW5kaWRhdGUgZm9yIHBvc3RpbmMgLyBwcmVkZWM/CisJCXsKKwkJCWludCBhZGo7CisJCQlzd2l0Y2ggKHAtPmNvZGUpIHsKKwkJCWNhc2UgQ09OVkVSVDoKKwkJCQkvLyBBcmUgd2UgY29uc2lkZXJpbmcgcTEgb3Igej8KKwkJCQlpZihvPT0mcC0+eikKKwkJCQkJdHlwZSA9IHAtPnR5cGY7CisJCQkJZWxzZQorCQkJCQl0eXBlID0gcC0+dHlwZjI7CisJCQkJaWYgKEFNX0RFQlVHKQorCQkJCQlwcmludGYoIlx0Q29udmVydCBvcGVyYXRpb24gLSB0eXBlIGlzICVkXG4iLCB0eXBlKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJaWYgKEFNX0RFQlVHKQorCQkJCQlwcmludGYoIlx0UmVndWxhciBvcGVyYXRpb24gLSB0eXBlIGlzICVkXG4iLCBwLT50eXBmKTsKKwkJCQl0eXBlID0gcC0+dHlwZjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWFkaiA9IGFtX2dldF9hZGp2YWx1ZShwMiwgdHlwZSwgbyA9PSAmcC0+eik7CS8vIFZhbGlkYXRlIHRoZSBhZGp1c3RtZW50CisJCQlpZiAoYWRqKSB7CisJCQkJb2JqICp0ZW1wb2I7CisJCQkJc3dpdGNoKHAyLT5jb2RlKQorCQkJCXsKKwkJCQkJY2FzZSBBRERJMlA6CisJCQkJCWNhc2UgU1VCSUZQOgorCQkJCQkJLy8gQXJlIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHJlZ3MgdGhlIHNhbWU/CisJCQkJCQlpZihwMi0+cTEucmVnPT1wMi0+ei5yZWcpIHsKKwkJCQkJCQlwMi0+Y29kZT1OT1A7IC8vIE51bGxpZnkgdGhlIG1hbnVhbCBhZGp1c3RtZW50IGlmIHdlIGNhbiBkbyBpdCBhcyBhbiBvcGNvZGUgc2lkZS1lZmZlY3QKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJLy8gQ2hlY2sgbmV4dCBJQyB0byBzZWUgaWYgaXQncyBkaXNwb3NhYmxlLCBhbmQgcmVmZXJlbmNpbmcgdGhlIHNhbWUgcmVnaXN0ZXI6CisJCQkJCQlpZih0ZW1wb2I9dGhyb3dhd2F5X3JlZyhwMi0+bmV4dCxwMi0+ei5yZWcpKSB7CisJCQkJCQkJaWYgKEFNX0RFQlVHKQorCQkJCQkJCQlwcmludGYoIlx0Q2hhbmdpbmduZXh0IElDIGZyb20gcmVnICVzIHRvIHJlZyAlc1xuIiwgcmVnbmFtZXNbdGVtcG9iLT5yZWddLCByZWduYW1lc1twMi0+cTEucmVnXSk7CisJCQkJCQkJdGVtcG9iLT5yZWc9cDItPnExLnJlZzsgLy8gQWRqdXN0IHRoZSByZWdpc3RlciByZWZlcmVuY2VkIGluIHRoZSBuZXh0IElDLgorCQkJCQkJCXAyLT5jb2RlPU5PUDsgLy8gTnVsbGlmeSB0aGUgYWRqdXN0bWVudCBzaW5jZSB3ZSd2ZSBhbGlhc2VkIHRoZSByZWdpc3RlcgorCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCXAyLT5jb2RlPUFTU0lHTjsgLy8gT3RoZXJ3aXNlIHJlcGxhY2UgaXQgd2l0aCBhbiBhc3NpZ24gaWYgdGhlIHJlZ2lzdGVycyBhcmVuJ3QgZXF1YWwuCisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXAyLT5jb2RlID0gTk9QOwkvLyBOdWxsaWZ5IHRoZSBtYW51YWwgYWRqdXN0bWVudCBpZiB3ZSBjYW4gZG8gaXQgYXMgYW4gb3Bjb2RlIHNpZGUtZWZmZWN0CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYW1fYWxsb2Mobyk7CisJCQkJby0+YW0tPnR5cGUgPSAoYWRqID4gMCkgPyBBTV9QT1NUSU5DIDogQU1fUFJFREVDOworCQkJfQorCQl9CisJfQorfQorCisjZGVmaW5lIGdldHJlZyh4KSAoeC5mbGFncyZSRUcgPyB4LnJlZyA6IDApCisKK3N0YXRpYyB2b2lkIGZpbmRfYWRkcmVzc2luZ21vZGVzKHN0cnVjdCBJQyAqcCkKK3sKKwlpbnQgYzsKKwlzdHJ1Y3Qgb2JqICpvOworCXN0cnVjdCBBZGRyZXNzaW5nTW9kZSAqYW07CisKKwlhbV9kZWZlcnJlZHBvcChwKTsKKwlhbV9zaW1wbGlmeShwKTsKKy8vCWFtX2NvbnZlcnNpb25zKHApOworCisJZm9yICg7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWMgPSBwLT5jb2RlOworCisJCS8vIEhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgb3BlcmFuZHMgYXJlIGRpZmZlcmVudCByZWdpc3RlcnMhCisJCWlmICgoZ2V0cmVnKHAtPnExKSA9PSBnZXRyZWcocC0+cTIpKQorCQkgICAgfHwgKGdldHJlZyhwLT5xMSkgPT0gZ2V0cmVnKHAtPnopKSkgeworCQkJaWYgKGdldHJlZyhwLT5xMSkpCisJCQkJaWYgKEFNX0RFQlVHKQorCQkJCQlwcmludGYoIkNvbGxpc2lvbiBiZXR3ZWVuIHExIGFuZCBxMiBvciB6IC0gaWdub3JpbmdcbiIpOworCQl9IGVsc2UKKwkJCWFtX3ByZXBvc3RfaW5jZGVjKHAsICZwLT5xMSk7CisKKwkJaWYgKChnZXRyZWcocC0+cTEpID09IGdldHJlZyhwLT5xMikpCisJCSAgICB8fCAoZ2V0cmVnKHAtPnEyKSA9PSBnZXRyZWcocC0+eikpKSB7CisJCQlpZiAoZ2V0cmVnKHAtPnExKSkKKwkJCQlpZiAoQU1fREVCVUcpCisJCQkJCXByaW50ZigiQ29sbGlzaW9uIGJldHdlZW4gcTIgYW5kIHExIG9yIHogLSBpZ25vcmluZ1xuIik7CisJCX0gZWxzZQorCQkJYW1fcHJlcG9zdF9pbmNkZWMocCwgJnAtPnEyKTsKKworCQlpZiAoKGdldHJlZyhwLT5xMSkgPT0gZ2V0cmVnKHAtPnopKQorCQkgICAgfHwgKGdldHJlZyhwLT5xMikgPT0gZ2V0cmVnKHAtPnopKSkgeworCQkJaWYgKGdldHJlZyhwLT56KSkKKwkJCQlpZiAoQU1fREVCVUcpCisJCQkJCXByaW50ZigiQ29sbGlzaW9uIGJldHdlZW4geiBhbmQgcTEgb3IgcTIgLSBpZ25vcmluZ1xuIik7CisJCX0gZWxzZQorCQkJYW1fcHJlcG9zdF9pbmNkZWMocCwgJnAtPnopOworLy8JCXByaW50aWMoc3Rkb3V0LHApOworCisJCWFtX2Rpc3Bvc2FibGUocCwgJnAtPnExKTsKKwkJYW1fZGlzcG9zYWJsZShwLCAmcC0+cTIpOworCQlhbV9kaXNwb3NhYmxlKHAsICZwLT56KTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL21hY2hpbmVzLzgzMi9pbmxpbmVtZW1jcHkuYyBiL21hY2hpbmVzLzgzMi9pbmxpbmVtZW1jcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTE0NmY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvODMyL2lubGluZW1lbWNweS5jCkBAIC0wLDAgKzEsMjYyIEBACisvKiBGSVhNRSAtIGVtaXQgYSBtZW1jcHkgZnVuY3Rpb24gd2l0aCB3ZWFrIGxpbmthZ2UgaWYgLXNpemUgaXMgc3BlY2lmaWVkICovCisKK3ZvaWQgZW1pdF9pbmxpbmVtZW1jcHkoRklMRSAqZixzdHJ1Y3QgSUMgKnAsIGludCB0KQoreworCWludCBzcmN0eXBlPXQ7CisJaW50IHNyY3IgPSB0MTsKKwlpbnQgZHN0cj0wOworCWludCBjbnRyPTA7CisJaW50IHNhdmVjPTE7CisJaW50IHNhdmVkPTA7CisJaW50IHdvcmRjb3B5OworCWludCBieXRlY29weTsKKwl6bWF4IGNvcHlzaXplID0gb3BzaXplKHApOworCWludCB1bnJvbGx3b3Jkcz0wOworCWludCB1bnJvbGxieXRlcz0wOworCisJLy8gQ2FuIHdlIGNyZWF0ZSBsYXJnZXIgY29kZSBpbiB0aGUgaW50ZXJlc3RzIG9mIHNwZWVkPyAgSWYgc28sIHBhcnRpYWxseSB1bnJvbGwgdGhlIGNvcHkuCisJd29yZGNvcHkgPSBjb3B5c2l6ZSAmIH4zOworCWJ5dGVjb3B5ID0gY29weXNpemUgLSB3b3JkY29weTsKKworCWlmICh3b3JkY29weSA8IDMyICYmICFvcHRzaXplKQorCQl1bnJvbGx3b3Jkcz0xOworCWlmIChieXRlY29weSA8IDUpCisJCXVucm9sbGJ5dGVzPTE7CisKKwljbGVhcnRlbXBvYmooZix0MSk7CisJY2xlYXJ0ZW1wb2JqKGYsdG1wKTsKKworCS8vIEV2ZW4gaWYgYSByZWdpc3RlciBpcyBhdmFpbGFibGUgd2Ugc3RpbGwgaGF2ZSB0byBzYXZlIGl0IGJlY2F1c2UgdGhlIGN1cnJlbnQgZnVuY3Rpb24gd291bGRuJ3QKKwkvLyBidXQgdGhlIHBhcmVudCBmdW5jdGlvbiBtYXkgYmUgdXNpbmcgaXQuICBUaGVyZWZvcmUgd2UgbWlnaHQgYXMgd2VsbCB1c2UgYSBoYXJkY29kZWQgcmVnaXN0ZXIuCisJZHN0cj10MSsxOworCWlmKHAtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKT09UkVHKQorCQlkc3RyPXAtPnoucmVnOworCS8vIEZJWE1FIC0gY2hlY2sgdGhpcyBsb2dpYy4gIElmIHRoZSB0YXJnZXQgaXMgYSByZWdpc3RlciwgaXQgbWF5IG5vdCBiZSBhIHNjcmF0Y2ggcmVnaXN0ZXIuCisJaWYocmVnc1tkc3RyXSkgLy8gU2NyYXRjaCByZWdpc3RlciAtIG9ubHkgbmVlZCB0byBzYXZlIGlmIGl0J3MgaW4gdXNlPworCXsKKwkJc2F2ZWQ9MTsKKwkJZW1pdChmLCJcdG10XHQlc1xuIixyZWduYW1lc1tkc3RyXSk7CisJCWVtaXQoZiwiXHRzdGRlY1x0JXNcbiIscmVnbmFtZXNbc3BdKTsKKwkJcHVzaGVkKz00OworCX0KKworCWNudHI9dDErMjsKKwlpZihjbnRyPT1kc3RyKQkvKiBVc2UgcjEgaW5zdGVhZCBvZiByMiBpZiB0aGUgZGVzdCBwb2ludGVyIGlzIGluIHIyIGFscmVhZHkuICovCisJCWNudHI9dDErMTsKKwlpZihjbnRyPT1zcmNyKSAgLyogSWYgY250ciAmJiBzcmNyIG5vdyBjbGFzaCwgdXNlIHIzIGluc3RlYWQgKi8KKwkJY250cj10MSszOworCisJaWYoKHVucm9sbHdvcmRzICYmIHVucm9sbGJ5dGVzKSB8fCByZWdzW2NudHJdPT0wKQorCQlzYXZlYz0wOworCWVsc2UgeworCQllbWl0KGYsIlx0bXRcdCVzXG4iLHJlZ25hbWVzW2NudHJdKTsKKwkJZW1pdChmLCJcdHN0ZGVjXHQlc1xuIixyZWduYW1lc1tzcF0pOworCQlwdXNoZWQrPTQ7CisJfQorCisJLyogUHJlcGFyZSBzb3VyY2UgcmVnaXN0ZXIgKi8KKwlpZiAoKHQgJiBOUSkgPT0gQ0hBUiAmJiAob3BzaXplKHApICE9IDEpKSB7CisJCWVtaXQoZiwgIlx0XHRcdFx0XHQvLyAoY2hhciB3aXRoIHNpemUhPTEgLT4gYXJyYXkgb2YgdW5rbm93biB0eXBlKVxuIik7CisJCXNyY3R5cGUgPSBBUlJBWTsJLy8gRklYTUUgLSB1Z2x5IGhhY2sKKwl9CisJZW1pdF9vYmp0b3JlZyhmLCAmcC0+cTEsIHNyY3R5cGUsc3Jjcik7CisKKwkvKiBQcmVwYXJlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyICovCisKKwllbWl0X3ByZXBvYmooZiwgJnAtPnosIHQsIGRzdHIsIDApOworCisJaWYgKHAtPnouZmxhZ3MgJiBSRUcpIHsKKwkJaWYocC0+ei5yZWchPWRzdHIpIHsvLyBNb3ZlIHRhcmdldCByZWdpc3RlciB0byBkc3RyCisJCQllbWl0KGYsICJcdG10XHQlc1xuIiwgcmVnbmFtZXNbcC0+ei5yZWddKTsKKwkJCWVtaXQoZiwgIlx0bXJcdCVzXG4iLCByZWduYW1lc1tkc3RyXSk7CisJCX0KKwl9CisKKwllbWl0KGYsICJcdFx0XHRcdFx0Ly8gQ29weWluZyAlZCB3b3JkcyBhbmQgJWQgYnl0ZXMgdG8gJXNcbiIsIHdvcmRjb3B5IC8gNCwgYnl0ZWNvcHksCisJICAgICBwLT56LnYgPyBwLT56LnYtPmlkZW50aWZpZXIgOiAiKG51bGwpIik7CisvLwlwcmludGYoIm1lbWNweTogQ29weWluZyAlZCB3b3JkcyBhbmQgJWQgYnl0ZXMgdG8gJXNcbiIsIHdvcmRjb3B5IC8gNCwgYnl0ZWNvcHksCisvLwkgICAgIHAtPnoudiA/IHAtPnoudi0+aWRlbnRpZmllciA6ICIobnVsbCkiKTsKKworLy8JaWYoIXAtPnoudikKKy8vCQlwcmludGYoIk5vIHotPnY6IHogZmxhZ3M6ICV4XG4iLHAtPnouZmxhZ3MpOworCisJLy8gUHJlcGFyZSB0aGUgY29weQorCS8vIEZJWE1FIC0gd2UgZG9uJ3QgbmVjZXNzYXJpbHkgaGF2ZSBhIHZhbGlkIHotPnYhICBJZiBub3QsIHdoZXJlIGRvZXMgdGhlIHRhcmdldCBjb21lIGZyb20/CisJLy8gU3RhY2sgYmFzZWQgdmFyaWFibGU/CisKKwlpZiAodW5yb2xsd29yZHMpIHsKKwkJd29yZGNvcHkgPj49IDI7CisJCWlmICh3b3JkY29weSkgeworCQkJZW1pdChmLCAiXHRcdFx0XHRcdC8vIENvcHlpbmcgJWQgd29yZHMgdG8gJXNcbiIsIHdvcmRjb3B5LCBwLT56LnYgPyBwLT56LnYtPmlkZW50aWZpZXIgOiAiKG51bGwpIik7CisJCX0KKwkJd2hpbGUgKHdvcmRjb3B5LS0pIHsKKwkJCWVtaXQoZiwgIlx0bGRpbmNcdCVzXG5cdHN0aW5jXHQlc1xuIiwgcmVnbmFtZXNbc3Jjcl0sIHJlZ25hbWVzW2RzdHJdKTsKKwkJfQorCX0gZWxzZSBpZih3b3JkY29weSkgeworCQllbWl0KGYsICJcdFx0XHRcdFx0Ly8gQ29weWluZyAlZCB3b3JkcyB0byAlc1xuIiwgd29yZGNvcHkgLyA0LCBwLT56LnYgPyBwLT56LnYtPmlkZW50aWZpZXIgOiAiKG51bGwpIik7CisJCS8vIENvcHkgYnl0ZXMuLi4KKwkJZW1pdF9jb25zdGFudHRvdGVtcChmLCB3b3JkY29weSk7CisJCWVtaXQoZiwgIlx0YWRkdFx0JXNcbiIsIHJlZ25hbWVzW2RzdHJdKTsKKwkJZW1pdChmLCAiXHRtclx0JXNcbiIsIHJlZ25hbWVzW2NudHJdKTsKKwkJZW1pdChmLCAiLmNweSVzd29yZGxvb3AlZDpcbiIsIHAtPnoudiA/IHAtPnoudi0+aWRlbnRpZmllciA6ICJudWxsIiwgbG9vcGlkKTsKKwkJZW1pdChmLCAiXHRsZGluY1x0JXNcblx0c3RpbmNcdCVzXG4iLCByZWduYW1lc1tzcmNyXSwgcmVnbmFtZXNbZHN0cl0pOworCQllbWl0KGYsICJcdG10XHQlc1xuXHRjbXBcdCVzXG4iLCByZWduYW1lc1tkc3RyXSwgcmVnbmFtZXNbY250cl0pOworCQllbWl0KGYsICJcdGNvbmRcdE5FUVxuIik7CisJCWVtaXQoZiwgIlx0XHQubGlwY3JlbFx0LmNweSVzd29yZGxvb3AlZFxuIiwgcC0+ei52ID8gcC0+ei52LT5pZGVudGlmaWVyIDogIm51bGwiLCBsb29waWQpOworCQllbWl0KGYsICJcdFx0YWRkXHQlc1xuIiwgcmVnbmFtZXNbcGNdKTsKKwl9CisKKwlpZiAodW5yb2xsYnl0ZXMpIHsKKwkJaWYgKGJ5dGVjb3B5KQorCQkJZW1pdChmLCAiXHRcdFx0XHRcdC8vIENvcHlpbmcgJWQgYnl0ZSB0YWlsIHRvICVzXG4iLCBieXRlY29weSxwLT56LnYgPyBwLT56LnYtPmlkZW50aWZpZXIgOiAibnVsbCIpOworCQl3aGlsZSAoYnl0ZWNvcHktLSkKKwkJCWVtaXQoZiwgIlx0bGRiaW5jXHQlc1xuXHRzdGJpbmNcdCVzXG4iLCByZWduYW1lc1tzcmNyXSwgcmVnbmFtZXNbZHN0cl0pOworCX0gZWxzZSBpZiAoYnl0ZWNvcHkpIHsKKwkJZW1pdChmLCAiXHRcdFx0XHRcdC8vIENvcHlpbmcgJWQgYnl0ZXMgdG8gJXNcbiIsIGJ5dGVjb3B5LCBwLT56LnYgPyBwLT56LnYtPmlkZW50aWZpZXIgOiAibnVsbCIpOworCQkvLyBDb3B5IGJ5dGVzLi4uCisJCWVtaXRfY29uc3RhbnR0b3RlbXAoZiwgYnl0ZWNvcHkpOworCQllbWl0KGYsICJcdGFkZHRcdCVzXG4iLCByZWduYW1lc1tkc3RyXSk7CisJCWVtaXQoZiwgIlx0bXJcdCVzXG4iLCByZWduYW1lc1tjbnRyXSk7CisJCWVtaXQoZiwgIi5jcHklc2xvb3AlZDpcbiIsIHAtPnoudiA/IHAtPnoudi0+aWRlbnRpZmllciA6ICJudWxsIiwgbG9vcGlkKTsKKwkJZW1pdChmLCAiXHRsZGJpbmNcdCVzXG5cdHN0YmluY1x0JXNcbiIsIHJlZ25hbWVzW3NyY3JdLCByZWduYW1lc1tkc3RyXSk7CisJCWVtaXQoZiwgIlx0bXRcdCVzXG5cdGNtcFx0JXNcbiIsIHJlZ25hbWVzW2RzdHJdLCByZWduYW1lc1tjbnRyXSk7CisJCWVtaXQoZiwgIlx0Y29uZFx0TkVRXG4iKTsKKwkJZW1pdChmLCAiXHRcdC5saXBjcmVsXHQuY3B5JXNsb29wJWRcbiIsIHAtPnoudiA/IHAtPnoudi0+aWRlbnRpZmllciA6ICJudWxsIiwgbG9vcGlkKTsKKwkJZW1pdChmLCAiXHRcdGFkZFx0JXNcbiIsIHJlZ25hbWVzW3BjXSk7CisKKwl9CisJLy8gY2xlYW51cAorCWlmKHNhdmVjKSB7CisJCWVtaXQoZiwiXHRsZGluY1x0JXNcbiIscmVnbmFtZXNbc3BdKTsKKwkJZW1pdChmLCJcdG1yXHQlc1xuIixyZWduYW1lc1tjbnRyXSk7CisJCXB1c2hlZC09NDsKKwl9CisJaWYoc2F2ZWQpIHsKKwkJZW1pdChmLCJcdGxkaW5jXHQlc1xuIixyZWduYW1lc1tzcF0pOworCQllbWl0KGYsIlx0bXJcdCVzXG4iLHJlZ25hbWVzW2RzdHJdKTsKKwkJcHVzaGVkLT00OworCX0KKwljbGVhcnRlbXBvYmooZix0MSk7CisJY2xlYXJ0ZW1wb2JqKGYsdG1wKTsKKwlsb29waWQrKzsKK30KKworCisvKiBTaW1pbGFyIHRvIGlubGluZW1lbWNweSwgYnV0IGNvcGllcyBhbiBhcnJheSBvciBzdHJ1Y3QgdG8gdGhlIHN0YWNrICovCisKK3ZvaWQgZW1pdF9pbmxpbmVwdXNoKEZJTEUgKmYsc3RydWN0IElDICpwLCBpbnQgdCkKK3sKKwlpbnQgc3JjciA9IHQxOworCWludCBkc3RyPTA7CisJaW50IGNudHI9MDsKKwlpbnQgc2F2ZWM9MTsKKwlpbnQgc2F2ZWQ9MDsKKwlpbnQgd29yZGNvcHk7CisJaW50IGJ5dGVjb3B5OworCXptYXggY29weXNpemUgPSBvcHNpemUocCk7CisJaW50IHVucm9sbHdvcmRzPTA7CisJaW50IHVucm9sbGJ5dGVzPTA7CisKKwkvLyBDYW4gd2UgY3JlYXRlIGxhcmdlciBjb2RlIGluIHRoZSBpbnRlcmVzdHMgb2Ygc3BlZWQ/ICBJZiBzbywgcGFydGlhbGx5IHVucm9sbCB0aGUgY29weS4KKwl3b3JkY29weSA9IGNvcHlzaXplICYgfjM7CisJYnl0ZWNvcHkgPSBjb3B5c2l6ZSAtIHdvcmRjb3B5OworCisJaWYgKCh3b3JkY29weSA8IDMyICYmICFvcHRzaXplKSB8fCAod29yZGNvcHk8MTYpKQorCQl1bnJvbGx3b3Jkcz0xOworCWlmIChieXRlY29weSA8IDUpCisJCXVucm9sbGJ5dGVzPTE7CisKKwljbGVhcnRlbXBvYmooZix0MSk7CisJY2xlYXJ0ZW1wb2JqKGYsdG1wKTsKKworCS8vIEV2ZW4gaWYgYSByZWdpc3RlciBpcyBhdmFpbGFibGUgd2Ugc3RpbGwgaGF2ZSB0byBzYXZlIGl0IGJlY2F1c2UgdGhlIGN1cnJlbnQgZnVuY3Rpb24gd291bGRuJ3QKKwkvLyBidXQgdGhlIHBhcmVudCBmdW5jdGlvbiBtYXkgYmUgdXNpbmcgaXQuICBUaGVyZWZvcmUgd2UgbWlnaHQgYXMgd2VsbCB1c2UgYSBoYXJkY29kZWQgcmVnaXN0ZXIuCisJZHN0cj1zcDsKKworCS8vIEZJWE1FIC0gZG9uJ3QgbmVjZXNzYXJpbHkgbmVlZCB0aGUgY291bnRlciByZWdpc3RlciBpZiB0aGUgY29weSBpcyBzbWFsbC4uLgorCisJLyogSXMgb3VyIHNvdXJjZSBhIHJlZ2lzdGVyPyAgSWYgc28sIHNldCBzcmNyIGFjY29yZGluZ2x5ICovCisJaWYgKHAtPnExLmZsYWdzICYgUkVHKSB7CisJCXNyY3I9cC0+cTEucmVnOworCQljbnRyPXQxOworCX0gZWxzZQorCQljbnRyPXQxKzI7CisKKwlpZigodW5yb2xsd29yZHMgJiYgdW5yb2xsYnl0ZXMpIHx8IHJlZ3NbY250cl09PTApCisJCXNhdmVjPTA7CisJZWxzZSB7CisJCWVtaXQoZiwiXHRtdFx0JXNcbiIscmVnbmFtZXNbY250cl0pOworCQllbWl0KGYsIlx0c3RkZWNcdCVzXG4iLHJlZ25hbWVzW3NwXSk7CisJCXB1c2hlZCs9NDsKKwl9CisKKwllbWl0KGYsICJcdFx0XHRcdFx0Ly8gQ29weWluZyAlZCB3b3JkcyBhbmQgJWQgYnl0ZXMgdG8gc3RhY2tcbiIsIHdvcmRjb3B5IC8gNCwgYnl0ZWNvcHkpOworCisvLwlpZighcC0+ei52KQorLy8JCXByaW50ZigiTm8gei0+djogeiBmbGFnczogJXhcbiIscC0+ei5mbGFncyk7CisKKwkvLyBQcmVwYXJlIHRoZSBjb3B5CisJZW1pdF9wcmVwb2JqKGYsICZwLT5xMSwgdCxzcmNyLDApOworCisJLy8gTWFrZSByb29tIG9uIHRoZSBzdGFjayBmb3IgdGhlIGNvcGllZCBvYmplY3QKKworCWVtaXQoZiwiXHQubGljb25zdFx0JWRcbiIscHVzaHNpemUocCkpOworCWVtaXQoZiwiXHRzdWJcdCVzXG4iLHJlZ25hbWVzW3NwXSk7CisKKwlpZiAodW5yb2xsd29yZHMpIHsKKwkJd29yZGNvcHkgPj49IDI7CisJCWlmICh3b3JkY29weSkgeworCQkJZW1pdChmLCAiXHRcdFx0XHRcdC8vIENvcHlpbmcgJWQgd29yZHMgdG8gc3RhY2tcbiIsIHdvcmRjb3B5KTsKKwkJfQorCQl3aGlsZSAod29yZGNvcHktLSkgeworCQkJZW1pdChmLCAiXHRsZGluY1x0JXNcblx0c3RpbmNcdCVzXG4iLCByZWduYW1lc1tzcmNyXSwgcmVnbmFtZXNbZHN0cl0pOworCQl9CisJfSBlbHNlIHsKKwkJZW1pdChmLCAiXHRcdFx0XHRcdC8vIENvcHlpbmcgJWQgd29yZHMgdG8gc3RhY2tcbiIsIHdvcmRjb3B5IC8gNCk7CisJCS8vIENvcHkgYnl0ZXMuLi4KKwkJZW1pdF9jb25zdGFudHRvdGVtcChmLCB3b3JkY29weSk7CisJCWVtaXQoZiwgIlx0YWRkdFx0JXNcbiIsIHJlZ25hbWVzW2RzdHJdKTsKKwkJZW1pdChmLCAiXHRtclx0JXNcbiIsIHJlZ25hbWVzW2NudHJdKTsKKwkJZW1pdChmLCAiLmNweXN0YWNrd29yZGxvb3AlZDpcbiIsIGxvb3BpZCk7CisJCWVtaXQoZiwgIlx0bGRpbmNcdCVzXG5cdHN0aW5jXHQlc1xuIiwgcmVnbmFtZXNbc3Jjcl0sIHJlZ25hbWVzW2RzdHJdKTsKKwkJZW1pdChmLCAiXHRtdFx0JXNcblx0Y21wXHQlc1xuIiwgcmVnbmFtZXNbZHN0cl0sIHJlZ25hbWVzW2NudHJdKTsKKwkJZW1pdChmLCAiXHRjb25kXHRORVFcbiIpOworCQllbWl0KGYsICJcdFx0LmxpcGNyZWxcdC5jcHlzdGFja3dvcmRsb29wJWRcbiIsIGxvb3BpZCk7CisJCWVtaXQoZiwgIlx0XHRhZGRcdCVzXG4iLCByZWduYW1lc1twY10pOworCX0KKworCWlmICh1bnJvbGxieXRlcykgeworCQlpZiAoYnl0ZWNvcHkpCisJCQllbWl0KGYsICJcdFx0XHRcdFx0Ly8gQ29weWluZyAlZCBieXRlIHRhaWwgdG8gc3RhY2tcbiIsIGJ5dGVjb3B5KTsKKwkJd2hpbGUgKGJ5dGVjb3B5LS0pCisJCQllbWl0KGYsICJcdGxkYmluY1x0JXNcblx0c3RiaW5jXHQlc1xuIiwgcmVnbmFtZXNbc3Jjcl0sIHJlZ25hbWVzW2RzdHJdKTsKKwl9IGVsc2UgeworCQllbWl0KGYsICJcdFx0XHRcdFx0Ly8gQ29weWluZyAlZCBieXRlcyB0byBzdGFja1xuIiwgYnl0ZWNvcHkpOworCQkvLyBDb3B5IGJ5dGVzLi4uCisJCWVtaXRfY29uc3RhbnR0b3RlbXAoZiwgYnl0ZWNvcHkpOworCQllbWl0KGYsICJcdGFkZHRcdCVzXG4iLCByZWduYW1lc1tkc3RyXSk7CisJCWVtaXQoZiwgIlx0bXJcdCVzXG4iLCByZWduYW1lc1tjbnRyXSk7CisJCWVtaXQoZiwgIi5jcHlzdGFja2xvb3AlZDpcbiIsIGxvb3BpZCk7CisJCWVtaXQoZiwgIlx0bGRiaW5jXHQlc1xuXHRzdGJpbmNcdCVzXG4iLCByZWduYW1lc1tzcmNyXSwgcmVnbmFtZXNbZHN0cl0pOworCQllbWl0KGYsICJcdG10XHQlc1xuXHRjbXBcdCVzXG4iLCByZWduYW1lc1tkc3RyXSwgcmVnbmFtZXNbY250cl0pOworCQllbWl0KGYsICJcdGNvbmRcdE5FUVxuIik7CisJCWVtaXQoZiwgIlx0XHQubGlwY3JlbFx0LmNweXN0YWNrbG9vcCVkXG4iLCBsb29waWQpOworCQllbWl0KGYsICJcdFx0YWRkXHQlc1xuIiwgcmVnbmFtZXNbcGNdKTsKKworCX0KKwkvLyBjbGVhbnVwCisKKwkvLyBSZXNldCB0aGUgc3RhY2sgcG9pbnRlciBzaW5jZSB3ZSd2ZSBiZWVuIGJsaXRoZWx5IHBvc3QtaW5jcmVtZW50aW5nIGl0LgorCWVtaXQoZiwiXHQubGljb25zdFx0JWRcbiIsb3BzaXplKHApKTsKKwllbWl0KGYsIlx0c3ViXHQlc1xuIixyZWduYW1lc1tzcF0pOworCisJaWYoc2F2ZWMpIHsKKwkJZW1pdChmLCJcdGxkaW5jXHQlc1xuIixyZWduYW1lc1tzcF0pOworCQllbWl0KGYsIlx0bXJcdCVzXG4iLHJlZ25hbWVzW2NudHJdKTsKKwkJcHVzaGVkLT00OworCX0KKwljbGVhcnRlbXBvYmooZix0MSk7CisJY2xlYXJ0ZW1wb2JqKGYsdG1wKTsKKwlsb29waWQrKzsKK30KKwpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvODMyL2xpYmNhbGxzLmMgYi9tYWNoaW5lcy84MzIvbGliY2FsbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTFmMDYyCi0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvODMyL2xpYmNhbGxzLmMKQEAgLTAsMCArMSw1MCBAQAorLyogRmlyc3Qgc3RlcHMgdG93YXJkcyBMT05HIExPTkcgYW5kIEZMT0FUIHN1cHBvcnQuCisgICA4MzIgaXMgbm90IHdlbGwgc3VpdGVkIHRvIGhhbmRsaW5nIHRoZXNlIHR5cGVzLiAqLworCitjaGFyICp1c2VfbGliY2FsbChpbnQgY29kZSxpbnQgdHlwZjEsIGludCB0eXBmMikKK3sKKwljaGFyICpyZXN1bHQ9MDsKKy8vCXByaW50ZigiUXVlcnlpbmcgbGliY2FsbCBmb3IgJWQsICVkLCAlZFxuIixjb2RlLHR5cGYxLHR5cGYyKTsKKwlzd2l0Y2goY29kZSkKKwl7CisJCWNhc2UgQ09OVkVSVDoKKwkJCWlmKCh0eXBmMSZOVSk9PUxMT05HICYmICh0eXBmMiZOVSk9PUlOVCkKKwkJCQlyZXR1cm4oIl9fY29udl9sbF9pbnRcbiIpOworCQkJaWYoKHR5cGYxJk5VKT09KFVOU0lHTkVEfExMT05HKSAmJiAodHlwZjImTlUpPT0oVU5TSUdORUR8SU5UKSkKKwkJCQlyZXR1cm4oIl9fY29udl91bGxfdWludFxuIik7CisJCQlpZigodHlwZjEmTlUpPT1JTlQgJiYgKHR5cGYyJk5VKT09TExPTkcpCisJCQkJcmV0dXJuKCJfX2NvbnZfaW50X2xsXG4iKTsKKwkJCWlmKCh0eXBmMSZOVSk9PShVTlNJR05FRHxJTlQpICYmICh0eXBmMiZOVSk9PShVTlNJR05FRHxMTE9ORykpCisJCQkJcmV0dXJuKCJfX2NvbnZfdWludF91bGxcbiIpOworCQljYXNlIEFERDoKKwkJCWlmKCh0eXBmMSZOVSk9PUxMT05HKQorCQkJCXJldHVybigiX19hZGRfbGxfbGxcbiIpOworCQkJaWYoKHR5cGYxJk5VKT09KFVOU0lHTkVEfExMT05HKSkKKwkJCQlyZXR1cm4oIl9fYWRkX3VsbF91bGxcbiIpOworCQljYXNlIE1VTFQ6CisJCQlpZigodHlwZjEmTlUpPT1MTE9ORyAmJiAodHlwZjImTlUpPT1JTlQpCisJCQkJcmV0dXJuKCJfX211bF9sbF9pbnRcbiIpOworCQkJaWYoKHR5cGYxJk5VKT09KFVOU0lHTkVEfExMT05HKSAmJiAodHlwZjImTlUpPT0oVU5TSUdORUR8SU5UKSkKKwkJCQlyZXR1cm4oIl9fbXVsX3VsbF91aW50XG4iKTsKKwkJCWlmKCh0eXBmMSZOVSk9PUxMT05HICYmICh0eXBmMiZOVSk9PUxMT05HKQorCQkJCXJldHVybigiX19tdWxfbGxfbGxcbiIpOworCQkJaWYoKHR5cGYxJk5VKT09KFVOU0lHTkVEfExMT05HKSAmJiAodHlwZjImTlUpPT0oVU5TSUdORUR8TExPTkcpKQorCQkJCXJldHVybigiX19tdWxfdWxsX3VsbFxuIik7CisJCWRlZmF1bHQ6CisJCQlicmVhazsJCisJfQorCXJldHVybihyZXN1bHQpOworfQorCit2b2lkIGRlY2xhcmVfYnVpbHRpbnMoKQoreworCWRlY2xhcmVfYnVpbHRpbigiX19jb252X2ludF9sbCIsSU5ULExMT05HLDAsTExPTkcsMCwxLDApOworCWRlY2xhcmVfYnVpbHRpbigiX19jb252X3VsbF91bGwiLFVOU0lHTkVEfElOVCxVTlNJR05FRHxMTE9ORywwLFVOU0lHTkVEfExMT05HLDAsMSwwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fYWRkX2xsX2xsIixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fYWRkX3VsbF91bGwiLFVOU0lHTkVEfExMT05HLFVOU0lHTkVEfExMT05HLDAsVU5TSUdORUR8TExPTkcsMCwxLDApOworCWRlY2xhcmVfYnVpbHRpbigiX19tdWxfbGxfbGwiLExMT05HLExMT05HLDAsTExPTkcsMCwxLDApOworCWRlY2xhcmVfYnVpbHRpbigiX19tdWxfdWxsX3VsbCIsVU5TSUdORUR8TExPTkcsVU5TSUdORUR8TExPTkcsMCxVTlNJR05FRHxMTE9ORywwLDEsMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX211bF9sbF9pbnQiLExMT05HLExMT05HLDAsSU5ULDAsMSwwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fbXVsX3VsbF91aW50IixVTlNJR05FRHxMTE9ORyxVTlNJR05FRHxMTE9ORywwLFVOU0lHTkVEfElOVCwwLDEsMCk7Cit9CisKZGlmZiAtLWdpdCBhL21hY2hpbmVzLzgzMi9tYWNoaW5lLmMgYi9tYWNoaW5lcy84MzIvbWFjaGluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzODk5ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy84MzIvbWFjaGluZS5jCkBAIC0wLDAgKzEsMjQyMCBAQAorLyogIEVpZ2h0VGhpcnR5VHdvIGJhY2tlbmQgZm9yIHZiY2MsCisJYmFzZWQgb24gdGhlIGdlbmVyaWMgUklTQyBiYWNrZW5kCisKKwlUaGUgQ1BVIHRhcmdldGVkIGJ5IHRoaXMgYmFja2VuZCwgYW5kIHRoZSBsYXRlc3QgdmVyc2lvbiwgY2FuIGJlIGZvdW5kIGF0CisgICAgaHR0cHM6Ly9naXRodWIuY29tL3JvYmluc29uYjUvRWlnaHRUaGlydHlUd28KKworKi8KKworLy8gRE9ORSAtIFQyIG5vIGxvbmdlciB1c2VkIGF0IGFsbCAtIGZyZWVzIHVwIGEgcmVnaXN0ZXIgZm9yIHRoZSBtYWluIGNvZGUgZ2VuZXJhdG9yCisKKy8vIERPTkUgVXBkYXRlIHRoZSBtZW1jcHkgY29kZSB0byBzYXZlL2FsbG9jYXRlIHJlZ2lzdGVycyBpZiBuZWVkZWQuCisvLyBET05FIFVwZGF0ZSB0aGUgZGl2IGNvZGUgbGlrZXdpc2UuCisKKy8vIENvbXBsZXRlIHRoZSB3b3JrIG9uIG9iamVjdCB0cmFja2luZy4gIEluIHBhcnRpY3VsYXIgdGFrZSBjYXJlIG9mIHRyYWNraW5nIGFuIG9iamVjdCB2cworLy8gaXRzIGFkZHJlc3MuCisvLyBBbHNvIHRyYWNrIHZpYSBhZGRyZXNzaW5nLW1vZGUgYW5hbHlzaXMgd2hldGhlciBvciBub3QgaXQncyB2YWx1YWJsZSB0byBzYXZlIGEgdmFsdWU7CisvLyBWYWx1ZXMgY2FuIGFsc28gYmUgc2F2ZWQgdG8gb3RoZXJ3aXNlIHVudXNlZCByZWdpc3RlcnMuICAoVGhlIGNvbXBpbGVyIGlzIGFsbW9zdCBjZXJ0YWlubHkKKy8vIGFscmVhZHkgc21hcnQgZW5vdWdoIHRvIG1ha2UgdXNlIG9mIHVudXNlZCByZWdpc3RlcnMgZm9yIHRoaXMsIGhvd2V2ZXIhKQorCisvLyBET05FOiBlbGltaW5hdGUgdW5uZWNlc3NhcnkgcmVnaXN0ZXIgc2h1ZmZsaW5nIGZvciBjb21wYXJlLgorCisvLyBET05FOiBJbXBsZW1lbnQgYmxvY2sgY29weWluZworCisvLyBET05FOiBJbXBsZW1lbnQgZGl2aXNpb24gLyBtb2R1bG8gdXNpbmcgbGlicmFyeSBjb2RlLgorLy8gRE9ORTogTWFyayByZWdpc3RlcnMgYXMgZGlzcG9zYWJsZSBpZiB0aGVpciBjb250ZW50cyBhcmUgbmV2ZXIgdXNlZCBiZXlvbmQgdGhlIGN1cnJlbnQgb3AuCisKKy8vIExvb2sgYXQgd2F5cyBvZiBpbXByb3ZpbmcgY29kZSBlZmZpY2llbmN5LiAgTG9vayBmb3Igc2l0dWF0aW9ucyB3aGVyZSB0aGUgb3V0cHV0IG9mIG9uZSBJQworLy8gYmVjb21lcyB0aGUgaW5wdXQgb2YgYW5vdGhlcj8gIFdvdWxkIG1ha2UgYSBiaWcgZGlmZmVyZW5jZSB3aGVuIHJlZ2lzdGVycyBhcmUgYWxsIGluIHVzZS4KKworLy8gTWludXMgY291bGQgYmUgb3B0aW1pc2VkIGZvciB0aGUgaW4tcmVnaXN0ZXIgY2FzZS4KKworLy8gRE9ORTogRG8gd2UgbmVlZCB0byByZXNlcnZlIHR3byB0ZW1wIHJlZ2lzdGVycz8gIFR1cm5zIG91dCBvbmUgd2FzIHN1ZmZpY2llbnQsIGFuZCBnaXZpbmcKKy8vIHRoZSBjb2RlIGdlbmVyYXRvciBhbiBleHRyYSBvbmUgdG8gcGxheSB3aXRoIGhlbHBlZCBhIGdyZWF0IGRlYWwuCisKKy8vIFJlc3RyaWN0IGJ5dGUgYW5kIGhhbGZ3b3JkIHN0b3JhZ2UgdG8gc3RhdGljIGFuZCBleHRlcm4gdHlwZXMsIG5vdCBzdGFjay1iYXNlZCB2YXJpYWJsZXMuCisvLyAoSGF2aW5nIGxlYXJuZWQgbW9yZSwgYnl0ZXMgYW5kIGhhbGZ3b3JkcyBvbiB0aGUgc3RhY2sgYXJlIGZpbmUsIHRoZSBjb21wbGljYXRpb24gaXMgd2l0aAorLy8gZnVuY3Rpb24gcGFyYW1ldGVycywgd2hpY2ggYXJlIHByb21vdGVkIHRvIGludCAtIHRodXMgdGhlIHNpemUgbW9kaWZpZXIgd2lsbCBiZSBkaWZmZXJlbnQKKy8vIGZvciBwYXJhbWV0ZXJzIGFuZCBsb2NhbCB2YXJpYWJsZXMgZXZlbiB0aG91Z2ggYm90aCBsaXZlIG9uIHRoZSBzdGFjay4pCisKKy8vIERPTkUgLSBBdm9pZCBtb3ZpbmcgcmVnaXN0ZXJzIGZvciBjbXAgYW5kIHRlc3Qgd2hlbiBwb3NzaWJsZS4KKworLy8gQ29uZGl0aW9uIGNvZGUgZm9yIHRlc3QgbWF5IHdlbGwgYmUgYWxyZWFkeSBzZXQgYnkgcHJldmlvdXMgbG9hZC4KKy8vIERvbmUgZm9yIFRFU1QsIGRvIHRoZSBzYW1lIGZvciBjb21wYXJpc29ucz8KKworLy8gRGVhbCB3aXRoIGRlcmVmZXJlbmNpbmcgaW4gdGVtcCBjYWNoaW5nIC0gY2FuIHdlIGF2b2lkIHJlcGVhdGVkIHNldHVwcyBpbiB0bXAsIG1heWJlIHVzaW5nIHIwPworCisKKyNpbmNsdWRlICJzdXBwLmgiCisKKyNkZWZpbmUgREJHTVNHIDEKKworc3RhdGljIGNoYXIgRklMRV9bXSA9IF9fRklMRV9fOworCisvKiAgUHVibGljIGRhdGEgdGhhdCBNVVNUIGJlIHRoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogTmFtZSBhbmQgY29weXJpZ2h0LiAqLworY2hhciBjZ19jb3B5cmlnaHRbXSA9CisgICAgInZiY2MgRWlnaHRUaGlydHlUd28gY29kZS1nZW5lcmF0b3IsIChjKSAyMDE5LzIwMjAgYnkgQWxhc3RhaXIgTS4gUm9iaW5zb25cbkJhc2VkIG9uIHRoZSBnZW5lcmljIFJJU0MgZXhhbXBsZSBiYWNrZW5kIChjKSAyMDAxIGJ5IFZvbGtlciBCYXJ0aGVsbWFubiI7CisKKy8qICBDb21tYW5kbGluZS1mbGFncyB0aGUgY29kZS1nZW5lcmF0b3IgYWNjZXB0czoKKyAgICAwOiBqdXN0IGEgZmxhZworICAgIFZBTEZMQUc6IGEgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQKKyAgICBTVFJJTkdGTEFHOiBhIHN0cmluZyBjYW4gYmUgc3BlY2lmaWVkCisgICAgRlVOQ0ZMQUc6IGEgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKKyAgICBhcGFydCBmcm9tIEZVTkNGTEFHLCBhbGwgb3RoZXIgdmVyc2lvbnMgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIG9uY2UgKi8KK2ludCBnX2ZsYWdzW01BWEdGXSA9IHsgMCB9OworCisjZGVmaW5lIEZMQUdfUElDIDAKKyNkZWZpbmUgRkxBR19MRSAxCisjZGVmaW5lIEZMQUdfQkUgMgorCisvKiB0aGUgZmxhZy1uYW1lLCBkbyBub3QgdXNlIG5hbWVzIGJlZ2lubmluZyB3aXRoIGwsIEwsIEksIEQgb3IgVSwgYmVjYXVzZQorICAgdGhleSBjb2xsaWRlIHdpdGggdGhlIGZyb250ZW5kICovCisvKiA4MzItc3BlY2lmaWMgZmxhZ3MsICJmcGljIiBlbmFibGVzIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgLSBuYW1lIGNob3NlbiB0byBtYXRjaCBnY2MgKi8KK2NoYXIgKmdfZmxhZ3NfbmFtZVtNQVhHRl0gPSB7ICJmcGljIiwiZWwiLCJlYiIgfTsKKworY2hhciBmbGFnXzgzMl9iaWdlbmRpYW47CisKKy8qIHRoZSByZXN1bHRzIG9mIHBhcnNpbmcgdGhlIGNvbW1hbmQtbGluZS1mbGFncyB3aWxsIGJlIHN0b3JlZCBoZXJlICovCit1bmlvbiBwcGkgZ19mbGFnc192YWxbTUFYR0ZdID0geyAwLDAsMCB9OworCisvKiAgQWxpZ25tZW50LXJlcXVpcmVtZW50cyBmb3IgYWxsIHR5cGVzIGluIGJ5dGVzLiAgICAgICAgICAgICAgKi8KK3ptYXggYWxpZ25bTUFYX1RZUEUgKyAxXTsKKworLyogIEFsaWdubWVudCB0aGF0IGlzIHN1ZmZpY2llbnQgZm9yIGV2ZXJ5IG9iamVjdC4gICAgICAgICAgICAgICovCit6bWF4IG1heGFsaWduOworCisvKiAgQ0hBUl9CSVQgZm9yIHRoZSB0YXJnZXQgbWFjaGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggY2hhcl9iaXQ7CisKKy8qICBzaXplcyBvZiB0aGUgYmFzaWMgdHlwZXMgKGluIGJ5dGVzKSAqLworem1heCBzaXpldGFiW01BWF9UWVBFICsgMV07CisKKy8qICBNaW5pbXVtIGFuZCBNYXhpbXVtIHZhbHVlcyBlYWNoIHR5cGUgY2FuIGhhdmUuICAgICAgICAgICAgICAqLworLyogIE11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gaW5pdF9jZygpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IHRfbWluW01BWF9UWVBFICsgMV07Cit6dW1heCB0X21heFtNQVhfVFlQRSArIDFdOworenVtYXggdHVfbWF4W01BWF9UWVBFICsgMV07CisKKy8qICBOYW1lcyBvZiBhbGwgcmVnaXN0ZXJzLiB3aWxsIGJlIGluaXRpYWxpemVkIGluIGluaXRfY2coKSwKKyAgICByZWdpc3RlciBudW1iZXIgMCBpcyBpbnZhbGlkLCB2YWxpZCByZWdpc3RlcnMgc3RhcnQgYXQgMSAqLworY2hhciAqcmVnbmFtZXNbTUFYUiArIDFdOworCisvKiAgVGhlIFNpemUgb2YgZWFjaCByZWdpc3RlciBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggcmVnc2l6ZVtNQVhSICsgMV07CisKKy8qICBhIHR5cGUgd2hpY2ggY2FuIHN0b3JlIGVhY2ggcmVnaXN0ZXIuICovCitzdHJ1Y3QgVHlwICpyZWd0eXBlW01BWFIgKyAxXTsKKworLyogIHJlZ3NhW3JlZ10hPTAgaWYgYSBjZXJ0YWluIHJlZ2lzdGVyIGlzIGFsbG9jYXRlZCBhbmQgc2hvdWxkICovCisvKiAgbm90IGJlIHVzZWQgYnkgdGhlIGNvbXBpbGVyIHBhc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2ludCByZWdzYVtNQVhSICsgMV07CisKKy8qICBTcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXJzIG1heSBiZSBzY3JhdGNoZWQgYnkgZnVuY3Rpb25zLiAgICAqLworaW50IHJlZ3NjcmF0Y2hbTUFYUiArIDFdOworCisvKiBzcGVjaWZpZXMgdGhlIHByaW9yaXR5IGZvciB0aGUgcmVnaXN0ZXItYWxsb2NhdG9yLCBpZiB0aGUgc2FtZQorICAgZXN0aW1hdGVkIGNvc3Qtc2F2aW5nIGNhbiBiZSBvYnRhaW5lZCBieSBzZXZlcmFsIHJlZ2lzdGVycywgdGhlCisgICBvbmUgd2l0aCB0aGUgaGlnaGVzdCBwcmlvcml0eSB3aWxsIGJlIHVzZWQgKi8KK2ludCByZWdfcHJpb1tNQVhSICsgMV07CisKKy8qIGFuIGVtcHR5IHJlZy1oYW5kbGUgcmVwcmVzZW50aW5nIGluaXRpYWwgc3RhdGUgKi8KK3N0cnVjdCByZWdfaGFuZGxlIGVtcHR5X3JlZ19oYW5kbGUgPSB7IDAsIDAgfTsKKworLyogTmFtZXMgb2YgdGFyZ2V0LXNwZWNpZmljIHZhcmlhYmxlIGF0dHJpYnV0ZXMuICAgICAgICAgICAgICAgICovCitjaGFyICpnX2F0dHJfbmFtZVtdID0geyAiX19pbnRlcnJ1cHQiLCAiX19jdG9yIiwgIl9fZHRvciIsICJfX3dlYWsiLCAwIH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFByaXZhdGUgZGF0YSBhbmQgZnVuY3Rpb25zLiAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBVU0VfQ09NTU9OUyAwCisKKy8qIGFsaWdubWVudCBvZiBiYXNpYyBkYXRhLXR5cGVzLCB1c2VkIHRvIGluaXRpYWxpemUgYWxpZ25bXSAqLworLyogSW4gYWN0dWFsIGZhY3QgODMyIGhhcyBmdWxsIGxvYWQvc3RvcmUgYWxpZ25tZW50IHNvIHRoaXMgaXMgbmVnb3RpYWJsZSBiYXNlZCBvbiAtc3BlZWQgLyAtc2l6ZSBmbGFncy4gKi8KK3N0YXRpYyBsb25nIG1hbGlnbltNQVhfVFlQRSArIDFdID0geyAxLCAxLCAyLCA0LCA0LCA0LCA0LCA4LCA4LCAxLCA0LCAxLCAxLCAxLCA0LCAxIH07CisKKy8qIHNpemVzIG9mIGJhc2ljIGRhdGEtdHlwZXMsIHVzZWQgdG8gaW5pdGlhbGl6ZSBzaXpldGFiW10gKi8KK3N0YXRpYyBsb25nIG1zaXpldGFiW01BWF9UWVBFICsgMV0gPSB7IDEsIDEsIDIsIDQsIDQsIDgsIDQsIDgsIDgsIDAsIDQsIDAsIDAsIDAsIDQsIDAgfTsKKworLyogdXNlZCB0byBpbml0aWFsaXplIHJlZ3R5cFtdICovCitzdGF0aWMgc3RydWN0IFR5cCBsdHlwID0geyBMT05HIH0sIGxkYmwgPSB7CitET1VCTEV9LCBsY2hhciA9IHsKK0NIQVJ9OworCisvKiBtYWNyb3MgZGVmaW5lZCBieSB0aGUgYmFja2VuZCAqLworc3RhdGljIGNoYXIgKm1hcnJheVtdID0geyAiX19zZWN0aW9uKHgpPV9fdmF0dHIoXCJzZWN0aW9uKFwiI3hcIilcIikiLAorCSJfX0VJR0hUVEhJUlRZVFdPX18iLAorCSJfX2NvbnN0cnVjdG9yKHByaSk9X192YXR0cihcImN0b3IoXCIjcHJpXCIpXCIpIiwKKwkiX19kZXN0cnVjdG9yKHByaSk9X192YXR0cihcImR0b3IoXCIjcHJpXCIpXCIpIiwKKwkiX193ZWFrPV9fdmF0dHIoXCJ3ZWFrXCIpIiwKKwkwCit9OworCisvKiBzcGVjaWFsIHJlZ2lzdGVycyAqLworc3RhdGljIGludCBwYzsJCQkvKiAgUHJvZ3JhbSBjb3VudGVyICAgICAgICAgICAgICAgICAgICAgKi8KK3N0YXRpYyBpbnQgc3A7CQkJLyogIFN0YWNrcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICovCitzdGF0aWMgaW50IHRtcDsKK3N0YXRpYyBpbnQgdDEsIHQyOwkJLyogIHRlbXBvcmFyeSBncHJzICovCitzdGF0aWMgaW50IGYxLCBmMiwgZjM7CQkvKiAgdGVtcG9yYXJ5IGZwcnMgKi8KK3N0YXRpYyBpbnQgbG9vcGlkID0gMDsJLyogbXVzdCBiZSB1bmlxdWUgZm9yIGV2ZXJ5IGZ1bmN0aW9uIGluIGEgY29tcGlsYXRpb24gdW5pdCAqLworCisKKy8qIHNlY3Rpb25zICovCisjZGVmaW5lIERBVEEgMAorI2RlZmluZSBCU1MgMQorI2RlZmluZSBDT0RFIDIKKyNkZWZpbmUgUk9EQVRBIDMKKyNkZWZpbmUgU1BFQ0lBTCA0CisKKy8vc3RhdGljIGxvbmcgc3RhY2s7CitzdGF0aWMgaW50IHNlY3Rpb24gPSAtMSwgbmV3b2JqOworc3RhdGljIGNoYXIgKmNvZGVuYW1lID0gIlx0LnNlY3Rpb25cdC50ZXh0IjsKK3N0YXRpYyBjaGFyICpkYXRhbmFtZSA9ICJcdC5zZWN0aW9uXHQuZGF0YSI7CitzdGF0aWMgY2hhciAqYnNzbmFtZSA9ICJcdC5zZWN0aW9uXHQuYnNzIjsKK3N0YXRpYyBjaGFyICpyb2RhdGFuYW1lID0gIlx0LnNlY3Rpb25cdC5yb2RhdGEiOworc3RhdGljIGludCBzZWN0aW9uaWQ9MDsKKworLyogYXNzZW1ibHktcHJlZml4ZXMgZm9yIGxhYmVscyBhbmQgZXh0ZXJuYWwgaWRlbnRpZmllcnMgKi8KK3N0YXRpYyBjaGFyICpsYWJwcmVmaXggPSAibCIsICppZHByZWZpeCA9ICJfIjsKKworLyogdmFyaWFibGVzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc3RhY2stb2Zmc2V0IGluIHRoZSBjYXNlIG9mCisgICBhIG1vdmluZyBzdGFjay1wb2ludGVyICovCitzdGF0aWMgbG9uZyBwdXNoZWQ7CitzdGF0aWMgbG9uZyBub3R5ZXRwb3BwZWQ7CisKK3N0YXRpYyBsb25nIGxvY2Fsc2l6ZSwgcnNhdmVzaXplLCBhcmdzaXplOworCitzdGF0aWMgaW50IGNvdW50X2NvbnN0YW50Y2h1bmtzKHptYXggdik7CitzdGF0aWMgdm9pZCBlbWl0X2NvbnN0YW50dG90ZW1wKEZJTEUgKiBmLCB6bWF4IHYpOworc3RhdGljIHZvaWQgZW1pdF9zdGF0aWN0b3RlbXAoRklMRSAqIGYsIGNoYXIgKmxhYiwgaW50IHN1ZmZpeCwgaW50IG9mZnNldCk7CitzdGF0aWMgdm9pZCBlbWl0X2V4dGVybnRvdGVtcChGSUxFICogZiwgY2hhciAqbGFiLCBpbnQgb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIGVtaXRfcGNyZWx0b3RlbXAyKEZJTEUgKmYsc3RydWN0IG9iaiAqcCk7CisKK3N0YXRpYyB2b2lkIGVtaXRfcHJlcG9iaihGSUxFICogZiwgc3RydWN0IG9iaiAqcCwgaW50IHQsIGludCByZWcsIGludCBvZmZzZXQpOworc3RhdGljIGludCBlbWl0X29ianRvcmVnKEZJTEUgKiBmLCBzdHJ1Y3Qgb2JqICpwLCBpbnQgdCxpbnQgcmVnKTsKKworLyogY2FsY3VsYXRlIHRoZSBhY3R1YWwgY3VycmVudCBvZmZzZXQgb2YgYW4gb2JqZWN0IHJlbGF0aXYgdG8gdGhlCisgICBzdGFjay1wb2ludGVyOyB3ZSB1c2UgYSBsYXlvdXQgbGlrZSB0aGlzOgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB8IGFyZ3VtZW50cyB0byB0aGlzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgIHwKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCByZXR1cm4tYWRkcmVzcyBbc2l6ZT00XSAgICAgICAgICAgICAgICAgICAgICB8CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHwgY2FsbGVyLXNhdmUgcmVnaXN0ZXJzIFtzaXplPXJzYXZlc2l6ZV0gICAgICAgfAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB8IGxvY2FsIHZhcmlhYmxlcyBbc2l6ZT1sb2NhbHNpemVdICAgICAgICAgICAgIHwKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCBhcmd1bWVudHMgdG8gY2FsbGVkIGZ1bmN0aW9ucyBbc2l6ZT1hcmdzaXplXSB8CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEFsbCBzaXplcyB3aWxsIGJlIGFsaWduZWQgYXMgbmVjZXNzYXJ5LgorICAgRm9yIGEgbW92aW5nIHN0YWNrLXBvaW50ZXIsIHRoZSBzdGFjay1wb2ludGVyIHdpbGwgdXN1YWxseSBwb2ludAorICAgdG8gdGhlIGJvdHRvbSBvZiB0aGUgYXJlYSBmb3IgbG9jYWwgdmFyaWFibGVzLCBidXQgd2lsbCBtb3ZlIHdoaWxlCisgICBhcmd1bWVudHMgYXJlIHB1dCBvbiB0aGUgc3RhY2suCisKKyAgIFRoaXMgaXMganVzdCBhbiBleGFtcGxlIGxheW91dC4gT3RoZXIgbGF5b3V0cyBhcmUgYWxzbyBwb3NzaWJsZS4KKyovCisKK3N0YXRpYyBsb25nIHJlYWxfb2Zmc2V0KHN0cnVjdCBvYmogKm8pCit7CisJbG9uZyBvZmYgPSAwOworCWlmKChvLT5mbGFncyZWQVIpICYmIGlzYXV0byhvLT52LT5zdG9yYWdlX2NsYXNzKSkKKwkJb2ZmPXptMmwoby0+di0+b2Zmc2V0KTsKKy8vICAgICAgcHJpbnRmKCJQYXJhbWV0ZXIgb2Zmc2V0OiAlZCwgbG9jYWxzaXplOiAlZCwgcnNhdmVzaXplOiAlZFxuIixvZmYsbG9jYWxzaXplLHJzYXZlc2l6ZSk7CisJaWYgKG9mZiA8IDApIHsKKwkJLyogZnVuY3Rpb24gcGFyYW1ldGVyICovCisJCW9mZiA9IGxvY2Fsc2l6ZSArIHJzYXZlc2l6ZSArIDQgLSBvZmYgLSB6bTJsKG1heGFsaWduKTsKKwl9CisJb2ZmICs9IHB1c2hlZDsKKwlvZmYgKz0gbm90eWV0cG9wcGVkOworCW9mZiArPSB6bTJsKG8tPnZhbC52bWF4KTsKKwlyZXR1cm4gb2ZmOworfQorCisKK3N0YXRpYyBpbnQgaXNzdGFja3BhcmFtKHN0cnVjdCBvYmogKm8pCit7CisJaW50IHJlc3VsdD0wOworLy8JaWYoby0+ZmxhZ3MmVkFSICYmIG8tPmZsYWdzJlJFRyAmJiBvLT5yZWc9PXNwKQorLy8JaWYoby0+ZmxhZ3MmKFZBUnxEUkVGT0JKKT09VkFSKQorCWlmKChvLT5mbGFncyZWQVIpICYmICEoby0+ZmxhZ3MmUkVHKSkKKwl7CisJCWlmKGlzYXV0byhvLT52LT5zdG9yYWdlX2NsYXNzKSkKKwkJeworCQkJbG9uZyBvZmYgPSB6bTJsKG8tPnYtPm9mZnNldCk7CisJCQlpZiAob2ZmIDwgMCkKKwkJCQlyZXN1bHQ9MTsKKwkJfQorCX0KKwlyZXR1cm4ocmVzdWx0KTsKK30KKworLyogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UncmUgYXNzaWduaW5nIHRvIDAocjYpCisgICBhbmQgY2FuIHRodXMgdXNlIGEgbW9yZSBlZmZpY2llbnQgd3JpdGluZyBzZXF1ZW5jZS4gKi8KKworaW50IGlzdG9wc3RhY2tzbG90KHN0cnVjdCBvYmogKm8pCit7CisJaWYoIW8pCisJCXJldHVybigwKTsKKwlpZigoby0+ZmxhZ3MmKFZBUnxSRUd8RFJFRk9CSikpPT1WQVIgJiYgby0+dikKKwl7CisJCWlmKGlzYXV0byhvLT52LT5zdG9yYWdlX2NsYXNzKQorCQkJCSYmIHJlYWxfb2Zmc2V0KG8pPT0wKQorCQkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKKy8qIGNoYW5nZXMgdG8gYSBzcGVjaWFsIHNlY3Rpb24sIHVzZWQgZm9yIF9fc2VjdGlvbigpICovCitzdGF0aWMgaW50IHNwZWNpYWxfc2VjdGlvbihGSUxFICogZiwgc3RydWN0IFZhciAqdikKK3sKKwljaGFyICpzZWM7CisJaWYgKCF2LT52YXR0cikKKwkJcmV0dXJuIDA7CisJc2VjID0gc3Ryc3RyKHYtPnZhdHRyLCAic2VjdGlvbigiKTsKKwlpZiAoIXNlYykKKwkJcmV0dXJuIDA7CisJc2VjICs9IHN0cmxlbigic2VjdGlvbigiKTsKKwllbWl0KGYsICJcdC5zZWN0aW9uXHQiKTsKKwl3aGlsZSAoKnNlYyAmJiAqc2VjICE9ICcpJykKKwkJZW1pdF9jaGFyKGYsICpzZWMrKyk7CisJZW1pdChmLCAiXG4iKTsKKwlpZiAoZikKKwkJc2VjdGlvbiA9IFNQRUNJQUw7CisJcmV0dXJuIDE7Cit9CisKKy8qIFJldHVybnMgMSBpZiB0aGUgc3ltYm9sIGhhcyB3ZWFrIGxpbmthZ2UgKi8KK3N0YXRpYyBpbnQgaXN3ZWFrKHN0cnVjdCBWYXIgKnYpCit7CisJaWYgKCF2LT52YXR0cikKKwkJcmV0dXJuIDA7CisJaWYgKHN0cnN0cih2LT52YXR0ciwgIndlYWsiKSkKKwkJcmV0dXJuICgxKTsKKwlyZXR1cm4gMDsKK30KKworLyogRW1pdHMgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gaW4gYSAuY3RvciBvciAuZHRvciBzZWN0aW9uIGZvciBhdXRvbWF0aWMgc2V0dXAvY2xlYW51cCAqLworc3RhdGljIGludCBjdG9yX2R0b3IoRklMRSAqIGYsIHN0cnVjdCBWYXIgKnYpCit7CisJaW50IGR0b3IgPSAwOworCWNoYXIgKnNlYzsKKwlpZiAoIXYtPnZhdHRyKQorCQlyZXR1cm4gMDsKKwlzZWMgPSBzdHJzdHIodi0+dmF0dHIsICJjdG9yKCIpOworCWlmICghc2VjKSB7CisJCWR0b3IgPSAxOworCQlzZWMgPSBzdHJzdHIodi0+dmF0dHIsICJkdG9yKCIpOworCX0KKwlpZiAoIXNlYykKKwkJcmV0dXJuIDA7CisJc2VjICs9IHN0cmxlbigiY3RvcigiKTsKKwllbWl0KGYsICJcdCVzLiIsIGR0b3IgPyAiLmR0b3IgLmR0b3IiIDogIi5jdG9yIC5jdG9yIik7CisJd2hpbGUgKCpzZWMgJiYgKnNlYyAhPSAnKScpCisJCWVtaXRfY2hhcihmLCAqc2VjKyspOworCWVtaXQoZiwgIlxuXHQucmVmXHQlcyVzXG4iLCBpZHByZWZpeCwgdi0+aWRlbnRpZmllcik7CisKKwlyZXR1cm4gMTsKK30KKworCisjZGVmaW5lIFRFTVBfVE1QIDAKKyNkZWZpbmUgVEVNUF9UMSAxCitzdHJ1Y3QgdGVtcG9iagoreworCXN0cnVjdCBvYmogbzsKKwlpbnQgcmVnOworfTsKK3N0cnVjdCB0ZW1wb2JqIHRlbXBvYmpzWzJdOworCit2b2lkIGNsZWFydGVtcG9iaihGSUxFICpmLCBpbnQgcmVnKQoreworCWludCBpOworCWlmKHJlZz09dG1wKSBpPVRFTVBfVE1QOworCWVsc2UgaWYocmVnPT10MSkgaT1URU1QX1QxOworCWVsc2UgcmV0dXJuOworLy8JZW1pdChmLCIvLyBjbGVhcmluZyAlc1xuIixyZWduYW1lc1tyZWddKTsKKworCXRlbXBvYmpzW2ldLnJlZz0wOworfQorCit2b2lkIHNldHRlbXBrb25zdChGSUxFICpmLGludCByZWcsaW50IHYpCit7CisJaW50IGk7CisJaWYocmVnPT10bXApIGk9VEVNUF9UTVA7CisJZWxzZSBpZihyZWc9PXQxKSBpPVRFTVBfVDE7CisJZWxzZSByZXR1cm47CisJdGVtcG9ianNbaV0ucmVnPXJlZzsKKwl0ZW1wb2Jqc1tpXS5vLmZsYWdzPUtPTlNUOworCXRlbXBvYmpzW2ldLm8udmFsLnZsb25nPXY7CisvLwllbWl0KGYsIi8vIHNldCAlcyB0byBrb25zdCAlZFxuIixyZWduYW1lc1tyZWddLHYpOworfQorCisKKy8vIEFkZCBhbiBhZGp1c3RtZW50IGR1ZSB0byBwb3N0aW5jIC8gcHJlZGVjIHRvIGEgY2FjaGVkIG9iamVjdAordm9pZCBhZGp0ZW1wb2JqKEZJTEUgKmYsaW50IHJlZyxpbnQgb2Zmc2V0KQoreworCWlmKHJlZzw9MSkKKwkJdGVtcG9ianNbcmVnXS5vLnZhbC52bG9uZys9b2Zmc2V0OworfQorCisKKy8vIFN0b3JlIGFueSBwYXNzaW5nIHZhbHVlIGluIHRlbXBvYmogcmVjb3JkcyBmb3Igb3B0aW1pc2F0aW9uLgorLy8gRklYTUUgLSBuZWVkIHRvIGZpZ3VyZSBvdXQgVkFSQURSIHNlbWFudGljcyBmb3Igc3RvcmVkIG9iamVjdHMuCit2b2lkIHNldHRlbXBvYmooRklMRSAqZixpbnQgcmVnLHN0cnVjdCBvYmogKm8saW50IG9mZnNldCxpbnQgdmFyYWRyKQoreworCWludCBpOworCWlmKHJlZz09dG1wKSBpPVRFTVBfVE1QOworCWVsc2UgaWYocmVnPT10MSkgaT1URU1QX1QxOworCWVsc2UgcmV0dXJuOworLy8JaWYocmVnPT10MSkKKy8vCQllbWl0KGYsIi8vIFNldHRpbmcgJXMgdG8gJXggKCV4KVxuIixyZWduYW1lc1tyZWddLG8sby0+dik7CisJdGVtcG9ianNbaV0ucmVnPXJlZzsKKwl0ZW1wb2Jqc1tpXS5vPSpvOworCXRlbXBvYmpzW2ldLm8udmFsLnZsb25nKz1vZmZzZXQ7CS8vIEFjY291bnQgZm9yIGFueSBwb3N0aW5jIC8gcHJlZGVjCisJaWYodmFyYWRyKQorCQl0ZW1wb2Jqc1tpXS5vLmZsYWdzfD1WQVJBRFI7Cit9CisKKworLy8gQ29tcGFyZSBhIHBhaXIgb2Ygc3RydWN0IG9iaiogZm9yIGVxdWl2YWxlbmNlLgorLy8gVGhlIGZpcnN0IG9iamVjdCBzaG91bGQgYmUgdGhlICJsaXZlIiBvYmplY3QsIHRoZSBzZWNvbmQgb25lIHRoZSBjYWNoZWQgb2JqZWN0LiIKK2ludCBtYXRjaG9iaihGSUxFICpmLHN0cnVjdCBvYmogKm8xLHN0cnVjdCBvYmogKm8yLGludCB2YXJhZHIpCit7CisJaW50IHJlc3VsdD0xOworCWludCBmbGc9bzEtPmZsYWdzOworCWlmKHZhcmFkcikKKwkJZmxnfD1WQVJBRFI7CisvLwllbWl0KGYsIi8vIGNvbXBhcmluZyBmbGFncyAleCB3aXRoICV4XG4iLG8xLT5mbGFncywgbzItPmZsYWdzKTsKKy8vCWlmKChvMS0+ZmxhZ3MmflZBUkFEUikhPShvMi0+ZmxhZ3MmflZBUkFEUikpCisJLy8gRklYTUUgLSBuZWVkIHRvIGZpZ3VyZSBvdXQgVkFSQURSIHNlbWFudGljcyBmb3Igc3RvcmVkIG9iamVjdHMuCisJZW1pdChmLCJcdFx0XHRcdFx0XHQvLyBtYXRjaG9iaiBjb21wYXJpbmcgZmxhZ3MgJWQgd2l0aCAlZFxuIixmbGcsbzItPmZsYWdzKTsKKwlpZihmbGchPShvMi0+ZmxhZ3MpKQorCQlyZXR1cm4oMCk7CisKKy8vCWVtaXQoZiwiLy8gY29tcGFyaW5nIHJlZ3MgJWQgd2l0aCAlZFxuIixvMS0+cmVnLCBvMi0+cmVnKTsKKwkvLyBJZiB0aGUgcmVnaXN0ZXItYmFzZWQgdmFsdWUgaXMgYmVpbmcgZGVyZWZlcmVuY2VkIHdlIHdvdWxkIGhhdmUgdG8gdHJhY2sKKwkvLyB0aGUgcmVnaXN0ZXIgaXRzZWxmIGJlaW5nIHVwZGF0ZWQuICBVbmxlc3MgdGhlIHZhbHVlJ3MgaW4gdG1wIHVzaW5nIGEgY2FjaGVkCisJLy8gdmVyc2lvbiBpc24ndCBhIHdpbiBhbnl3YXkuCisJaWYoKG8xLT5mbGFncyYoUkVHfERSRUZPQkopPT1SRUcpICYmIChvMS0+cmVnPT1vMi0+cmVnKSkKKwkJcmV0dXJuKDEpOworCisJaWYobzEtPmZsYWdzJktPTlNUKQorCXsKKy8vCQllbWl0KGYsIlx0XHRcdFx0XHRcdC8vIENvbXBhcmluZyBjb25zdGFudHMgJXggd2l0aCAleFxuIixvMS0+dmFsLnZsb25nLG8yLT52YWwudmxvbmcpOworCQlpZihvMS0+dmFsLnZsb25nID09IG8yLT52YWwudmxvbmcpCisJCQlyZXR1cm4oMSk7CisJCWVsc2UKKwkJewkJCS8vIEF0dGVtcHQgZnV6enkgbWF0Y2hpbmcuLi4KKwkJCWludCBkPW8xLT52YWwudmxvbmctbzItPnZhbC52bG9uZzsKKwkJCS8vIERvbid0IGJvdGhlciBpZiB3ZSBuZWVkIGZld2VyIHRoYW4gZm91ciBMSXMgdG8gcmVwcmVzZW50IHRoZSB2YWx1ZSwgb3IgaWYgd2UnZCBuZWVkIG1vcmUgdGhhbiAxIExJIGZvciB0aGUgb2Zmc2V0LgorCQkJaWYoY291bnRfY29uc3RhbnRjaHVua3MobzEtPnZhbC52bG9uZyk8NCB8fCBjb3VudF9jb25zdGFudGNodW5rcyhkKT4xKQorCQkJeworLy8JCQkJZW1pdChmLCJcdFx0XHRcdFx0XHQvLyBHYWlucyBmcm9tIGZ1enp5IG1hdGNoaW5nIHRvbyBzbWFsbCwgaWdub3JpbmcuXG4iKTsKKwkJCQlyZXR1cm4oMCk7CisJCQl9CisJCQllbHNlCisJCQkJcmV0dXJuKDIpOworCQl9CisJfQorCisJaWYoIShvMS0+ZmxhZ3MmVkFSKSkKKwkJcmV0dXJuKDApOyAvLyBOb3QgYSB2YXI/ICBDYW4ndCBkbyBhbnkgbW9yZS4KKworCWlmKG8xLT52PT0wIHx8IG8yLT52PT0wKQorCQlyZXR1cm4oMCk7CisKKwlpZihvMS0+diA9PSBvMi0+diAmJiBvMS0+dmFsLnZsb25nID09IG8yLT52YWwudmxvbmcpCisJCXJldHVybigxKTsKKworCWlmKCEoZmxnJlZBUkFEUikpCisJCXJldHVybigwKTsgLy8gQ2FuIG9ubHkgYXR0ZW1wdCBmdXp6eSBtYXRjaGluZyBpZiB0aGlzIGlzIGEgdmFyYWRyCisKKwlpZihpc2F1dG8obzEtPnYtPnN0b3JhZ2VfY2xhc3MpICYmIGlzYXV0byhvMi0+di0+c3RvcmFnZV9jbGFzcykpCisJeworCQlpZihEQkdNU0cpCisJCQllbWl0KGYsIlx0XHRcdFx0XHRcdC8vYXV0bzogZmxhZ3M6ICV4LCBjb21wYXJpbmcgJWQsICVkIHdpdGggJWQsICVkXG4iLAorCQkJCWZsZyxvMS0+di0+b2Zmc2V0LG8xLT52YWwudmxvbmcsIG8yLT52LT5vZmZzZXQsbzItPnZhbC52bG9uZyk7CisJCS8vIENhbid0IGZ1enp5IG1hdGNoIGJldHdlZW4gcGFyYW1ldGVycyBhbmQgdmFycyBvbiBzdGFjaworCQlpZigobzEtPnYtPm9mZnNldDwwICYmIG8yLT52LT5vZmZzZXQ+PTApIHx8IChvMS0+di0+b2Zmc2V0Pj0wICYmIG8yLT52LT5vZmZzZXQ8MCkpCisJCQlyZXR1cm4oMCk7CisJCWlmKG8xLT52LT5vZmZzZXQ9PW8yLT52LT5vZmZzZXQgJiYgbzEtPnZhbC52bG9uZz09bzItPnZhbC52bG9uZykKKwkJCXJldHVybigxKTsKKwkJaWYoKG8xLT5mbGFncyZEUkVGT0JKKSB8fCAobzItPmZsYWdzJkRSRUZPQkopKQkvLyBDYW4ndCBmdXp6eSBtYXRjaCBpZiB3ZSdyZSBkZXJlZmVyZW5jaW5nLgorCQkJcmV0dXJuKDApOworCQlyZXR1cm4oMik7CisJfQorCisJaWYoaXNleHRlcm4obzEtPnYtPnN0b3JhZ2VfY2xhc3MpICYmIGlzZXh0ZXJuKG8yLT52LT5zdG9yYWdlX2NsYXNzKSkKKwl7CisJCWlmKERCR01TRykKKwkJCWVtaXQoZiwiXHRcdFx0XHRcdFx0Ly9leHRlcm46IGNvbXBhcmluZyAlZCB3aXRoICVkXG4iLG8xLT52YWwudmxvbmcsIG8yLT52YWwudmxvbmcpOworCQlpZihzdHJjbXAobzEtPnYtPmlkZW50aWZpZXIsbzItPnYtPmlkZW50aWZpZXIpKQorCQkJcmV0dXJuKDApOworCQlpZihvMS0+dmFsLnZsb25nPT1vMi0+dmFsLnZsb25nKQorCQkJcmV0dXJuKDEpOworCQlpZigobzEtPmZsYWdzJkRSRUZPQkopIHx8IChvMi0+ZmxhZ3MmRFJFRk9CSikpCS8vIENhbid0IGZ1enp5IG1hdGNoIGlmIHdlJ3JlIGRlcmVmZXJlbmNpbmcuCisJCQlyZXR1cm4oMCk7CisJCXJldHVybigyKTsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKKworaW50IG1hdGNob2Zmc2V0KHN0cnVjdCBvYmogKm8sc3RydWN0IG9iaiAqbzIpCit7CisJaWYoby0+ZmxhZ3MmS09OU1QpCisJCXJldHVybihvLT52YWwudmxvbmctbzItPnZhbC52bG9uZyk7CisJaWYoaXNleHRlcm4oby0+di0+c3RvcmFnZV9jbGFzcykpCisJCXJldHVybihvLT52YWwudmxvbmctbzItPnZhbC52bG9uZyk7CisJaWYoaXNhdXRvKG8tPnYtPnN0b3JhZ2VfY2xhc3MpKQorLy8JCXJldHVybigoby0+dmFsLnZsb25nK3JlYWxfb2Zmc2V0KG8pKS0obzItPnZhbC52bG9uZytyZWFsX29mZnNldChvMikpKTsKKwkJcmV0dXJuKChvLT52YWwudmxvbmcrby0+di0+b2Zmc2V0KS0obzItPnZhbC52bG9uZytvMi0+di0+b2Zmc2V0KSk7CisJcmV0dXJuKDApOworfQorCisKK3ZvaWQgb2Jzb2xldGV0ZW1wb2JqKEZJTEUgKmYsaW50IHJlZyxzdHJ1Y3Qgb2JqICpvLGludCB2YXJhZHIpCit7CisvLwllbWl0KGYsIlx0XHRcdFx0XHQvLyBBdHRlbXB0aW5nIHRvIG9ic29sZXRlIG9ialxuIik7CisJaWYodGVtcG9ianNbMF0ucmVnPT1yZWcgJiYgbWF0Y2hvYmooZixvLCZ0ZW1wb2Jqc1swXS5vLHZhcmFkcikpCisJeworCQllbWl0KGYsIlx0XHRcdFx0XHRcdC8vIE9ic29sZXRpbmcgdG1wXG4iKTsKKwkJY2xlYXJ0ZW1wb2JqKGYsdG1wKTsKKwl9CisJaWYodGVtcG9ianNbMV0ucmVnPT1yZWcgJiYgbWF0Y2hvYmooZixvLCZ0ZW1wb2Jqc1swXS5vLHZhcmFkcikpCisJeworCQllbWl0KGYsIlx0XHRcdFx0XHRcdC8vIE9ic29sZXRpbmcgdDFcbiIpOworCQljbGVhcnRlbXBvYmooZix0MSk7CisJfQorfQorCisKKy8vIENoZWNrIHRoZSB0ZW1wb2JqIHJlY29yZHMgdG8gc2VlIGlmIHRoZSB2YWx1ZSB3ZSdyZSBpbnRlcmVzdGVkIGluIGNhbiBiZSBmb3VuZCBpbiBlaXRoZXIuCitpbnQgbWF0Y2h0ZW1wb2JqKEZJTEUgKmYsc3RydWN0IG9iaiAqbyxpbnQgdmFyYWRyLGludCBwcmVmZXJyZWRyZWcpCit7CisJaW50IGhpdD0wOwkvLyBIaXQgd2lsbCBiZSAxIGZvciBhbiBleGFjdCBtYXRjaCwgMiBmb3IgYSBuZWFyIG1pc3MuCisvLwlyZXR1cm4oMCk7IC8vIFRlbXBvcmFyaWx5IGRpc2FibGUgbWF0Y2hpbmcKKwlpZih0ZW1wb2Jqc1swXS5yZWcgJiYgKGhpdD1tYXRjaG9iaihmLG8sJnRlbXBvYmpzWzBdLm8sdmFyYWRyKSkpCisJeworLy8JCWVtaXQoZiwiLy9tYXRjaCBmb3VuZCAtIHRtcFxuIik7CisvLwkJcHJpbnRmKCIvL21hdGNoIGZvdW5kIC0gdG1wXG4iKTsKKwkJaWYoaGl0PT0xKQorCQkJcmV0dXJuKHRlbXBvYmpzWzBdLnJlZyk7CisJCWVsc2UgaWYoaGl0PT0yKQorCQl7CisJCQlpbnQgb2Zmc2V0PW1hdGNob2Zmc2V0KG8sJnRlbXBvYmpzWzBdLm8pOworCQkJZW1pdChmLCJcdFx0XHRcdFx0XHQvLyBGdXp6eSBtYXRjaCBmb3VuZCBhZ2FpbnN0IHRtcC5cbiIpOworCQkJaWYocHJlZmVycmVkcmVnPT10bXApCisJCQl7CisJCQkJZW1pdChmLCJcdG1yXHQlc1xuIixyZWduYW1lc1t0MV0pOworCQkJCWVtaXQoZiwiXHQubGljb25zdFx0JWRcbiIsb2Zmc2V0KTsKKwkJCQllbWl0KGYsIlx0YWRkdFx0JXNcbiIscmVnbmFtZXNbdDFdKTsKKwkJCQlzZXR0ZW1wb2JqKGYsdDEsJnRlbXBvYmpzWzBdLm8sMCwwKTsKKwkJCQlzZXR0ZW1wb2JqKGYsdG1wLG8sMCx2YXJhZHIpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWVtaXQoZiwiXHRtclx0JXNcbiIscmVnbmFtZXNbcHJlZmVycmVkcmVnXSk7CisJCQkJZW1pdChmLCJcdC5saWNvbnN0XHQlZFxuIixvZmZzZXQpOworCQkJCXNldHRlbXBrb25zdChmLHRtcCxvZmZzZXQpOworCQkJCWVtaXQoZiwiXHRhZGRcdCVzXG4iLHJlZ25hbWVzW3ByZWZlcnJlZHJlZ10pOworCQkJCXNldHRlbXBvYmooZixwcmVmZXJyZWRyZWcsbywwLHZhcmFkcik7CisJCQl9CisJCQlyZXR1cm4ocHJlZmVycmVkcmVnKTsKKy8vCQkJcmV0dXJuKHRlbXBvYmpzWzBdLnJlZyk7CisJCX0KKwkJZWxzZQorCQkJcmV0dXJuKDApOworCX0KKwllbHNlIGlmKHRlbXBvYmpzWzFdLnJlZyAmJiAoaGl0PW1hdGNob2JqKGYsbywmdGVtcG9ianNbMV0ubyx2YXJhZHIpKSkKKwl7CisJCS8vIFRlbXBvcmFyaWx5IGRpc2FibGUgdDEgbWF0Y2hpbmcuICBGSVhNRSAtIGtlZXAgdDEgcmVjb3JkcyBtb3JlIHVwLXRvLWRhdGUuCisvLwkJcmV0dXJuKDApOworLy8JCWVtaXQoZiwiLy9tYXRjaCBmb3VuZCAtIHQxXG4iKTsKKy8vCQlwcmludGYoIi8vbWF0Y2ggZm91bmQgLSB0MVxuIik7CisJCWlmKGhpdD09MSkKKwkJCXJldHVybih0ZW1wb2Jqc1sxXS5yZWcpOworCQllbHNlIGlmKGhpdD09MikKKwkJeworCQkJaW50IG9mZnNldD1tYXRjaG9mZnNldChvLCZ0ZW1wb2Jqc1sxXS5vKTsKKwkJCWlmKERCR01TRykKKwkJCQllbWl0KGYsIlx0XHRcdFx0XHRcdC8vRnV6enkgbWF0Y2ggZm91bmQsIG9mZnNldDogJWQgKHZhcmFkcjogJWQpXG4iLG9mZnNldCx2YXJhZHIpOworCQkJLy8gRnV6enkgbWF0Y2ggYWdhaW5zdCB0MSAtIGlmIHRhcmdldCBpcyB0MSB1c2UgYWRkLCBvdGhlcndpc2UgdXNlIGFkZHQuCisJCQllbWl0KGYsIlx0LmxpY29uc3RcdCVkXG4iLG9mZnNldCk7CisJCQlpZihwcmVmZXJyZWRyZWchPXRlbXBvYmpzWzFdLnJlZykKKwkJCXsKKwkJCQllbWl0KGYsIlx0YWRkdFx0JXNcbiIscmVnbmFtZXNbdGVtcG9ianNbMV0ucmVnXSk7CisJCQkJaWYocHJlZmVycmVkcmVnIT10bXApCisJCQkJCWVtaXQoZiwiXHRtclx0JXNcbiIscmVnbmFtZXNbcHJlZmVycmVkcmVnXSk7CisJCQkJc2V0dGVtcG9iaihmLHRtcCxvLDAsMCk7CisJCQkJc2V0dGVtcG9iaihmLHByZWZlcnJlZHJlZyxvLDAsdmFyYWRyKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQllbWl0KGYsIlx0YWRkXHQlc1xuIixyZWduYW1lc1t0ZW1wb2Jqc1sxXS5yZWddKTsKKwkJCQlzZXR0ZW1wa29uc3QoZix0bXAsb2Zmc2V0KTsKKwkJCQlzZXR0ZW1wb2JqKGYsdGVtcG9ianNbMV0ucmVnLG8sMCx2YXJhZHIpOworCQkJfQorCQkJcmV0dXJuKHByZWZlcnJlZHJlZyk7CisJCX0KKwkJcmV0dXJuKDApOworCX0KKwllbHNlCisJCXJldHVybigwKTsKK30KKworCitpbnQgbWF0Y2h0ZW1wa29uc3QoRklMRSAqZixpbnQgayxpbnQgcHJlZmVycmVkcmVnKQoreworLy8JcmV0dXJuKDApOyAvLyBUZW1wb3JhcmlseSBkaXNhYmxlIG1hdGNoaW5nCisJc3RydWN0IG9iaiBvOworCW8uZmxhZ3M9S09OU1Q7CisJby52YWwudmxvbmc9azsKKwlyZXR1cm4obWF0Y2h0ZW1wb2JqKGYsJm8sMCxwcmVmZXJyZWRyZWcpKTsKK30KKworCisvKiAgR2VuZXJhdGVzIGNvZGUgdG8gc3RvcmUgcmVnaXN0ZXIgciBpbnRvIG1lbW9yeSBvYmplY3Qgby4gKi8KKworc3RhdGljIHZvaWQgc3RvcmVfcmVnKEZJTEUgKiBmLCBpbnQgciwgc3RydWN0IG9iaiAqbywgaW50IHR5cGUpCit7CisJLy8gTmVlZCB0byB0YWtlIGRpZmZlcmVudCB0eXBlcyBpbnRvIGFjY291bnQgaGVyZS4KKwlpZihEQkdNU0cpCisJCWVtaXQoZiwgIlx0XHRcdFx0XHRcdC8vIFN0b3JlX3JlZyB0byB0eXBlIDB4JXgsIGZsYWdzIDB4JXhcbiIsIHR5cGUsby0+ZmxhZ3MpOworCisJdHlwZSAmPSBOUTsJCS8vIEZpbHRlciBvdXQgdW5zaWduZWQsIGV0Yy4KKwlpZigodHlwZT09Q0hBUiB8fCB0eXBlPT1TSE9SVCkgJiYgaXNzdGFja3BhcmFtKG8pKQorCXsKKwkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gUHJvbW90aW5nIHN0b3JhZ2Ugc2l6ZSBvZiBzdGFjayBwYXJhbWV0ZXIgdG8gaW50XG4iKTsKKwkJdHlwZT1JTlQ7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBDSEFSOgorCQllbWl0X3ByZXBvYmooZiwgbywgdHlwZSAmIE5RLCB0bXAsIDApOworCQllbWl0KGYsICJcdGV4Z1x0JXNcbiIsIHJlZ25hbWVzW3JdKTsKKwkJZW1pdChmLCAiXHRzdGJpbmNcdCVzXHQvL1dBUk5JTkcgLSBwb2ludGVyIC8gcmVnIG5vdCByZXN0b3JlZCwgbWlnaHQgY2F1c2UgdHJvdWJsZSFcbiIsIHJlZ25hbWVzW3JdKTsKKwkJY2xlYXJ0ZW1wb2JqKGYsdG1wKTsKKwkJY2xlYXJ0ZW1wb2JqKGYscik7CisJCWJyZWFrOworCWNhc2UgU0hPUlQ6CisJCWVtaXRfcHJlcG9iaihmLCBvLCB0eXBlICYgTlEsIHRtcCwgMCk7CisJCWVtaXQoZiwgIlx0ZXhnXHQlc1xuIiwgcmVnbmFtZXNbcl0pOworCQllbWl0KGYsICJcdGhsZlxuXHRzdFx0JXNcbiIsIHJlZ25hbWVzW3JdKTsKKwkJY2xlYXJ0ZW1wb2JqKGYsdG1wKTsKKwkJY2xlYXJ0ZW1wb2JqKGYscik7CisJCWJyZWFrOworCWNhc2UgSU5UOgorCWNhc2UgTE9ORzoKKwljYXNlIFBPSU5URVI6CisJCS8vIGlmIG8gaXMgYSByZWcsIGNhbiBzdG9yZSBkaXJlY3RseS4KKwkJaWYgKChvLT5mbGFncyAmIChSRUcgfCBEUkVGT0JKKSkgPT0gKFJFRyB8IERSRUZPQkopKSB7CisJCQllbWl0KGYsICJcdG10XHQlc1xuIiwgcmVnbmFtZXNbcl0pOworCQkJZW1pdChmLCAiXHRzdFx0JXNcbiIsIHJlZ25hbWVzW28tPnJlZ10pOworLy8JCQlzZXR0ZW1wb2JqKGYscixvLDAsMCk7CisJCQlpZigodHlwZSZOUSkhPUlOVCB8fCAodHlwZSAmIFZPTEFUSUxFKSB8fCAodHlwZSAmIFBWT0xBVElMRSkpCisJCQl7CisJCQkJZW1pdChmLCJcdC8vIFZvbGF0aWxlLCBvciBub3QgaW50IC0gbm90IGNhY2hpbmdcbiIpOworCQkJCWNsZWFydGVtcG9iaihmLHIpOworCQkJfQorCQkJZWxzZQorCQkJCXNldHRlbXBvYmooZixyLG8sMCwwKTsgLy8gRklYTUUgLSBpcyB0aGlzIGNvcnJlY3Q/CisJCQlzZXR0ZW1wb2JqKGYsdG1wLG8sMCwwKTsgLy8gRklYTUUgLSBpcyB0aGlzIGNvcnJlY3Q/CisJCX0gZWxzZSB7CisJCQlpZihvLT5mbGFncyAmIERSRUZPQkopIHsgIC8vIENhbid0IHVzZSB0aGUgb2Zmc2V0IC8gc3RtcGRlYyB0cmljayBmb3IgZGVyZWZlcmVuY2VkIG9iamVjdHMuCisJCQkJLy8gRklYTUUsIG5vdCBzdHJpY3RseSB0cnVlIC0gY291bGQgdXNlIGl0IGZvciBkZXJlZmVyZW5jZWQgY29uc3RhbnRzCisJCQkJZW1pdF9wcmVwb2JqKGYsIG8sIHR5cGUgJiBOUSwgdG1wLCAwKTsKKwkJCQllbWl0KGYsICJcdGV4Z1x0JXNcbiIsIHJlZ25hbWVzW3JdKTsKKwkJCQllbWl0KGYsICJcdHN0XHQlc1xuIiwgcmVnbmFtZXNbcl0pOworCQkJCWlmKHI9PXQxIHx8IChvLT5hbSAmJiBvLT5hbS0+ZGlzcG9zYWJsZSkpCisJCQkJCWVtaXQoZiwgIlx0XHRcdFx0XHRcdC8vIFdBUk5JTkcgLSBPYmplY3QgaXMgZGlzcG9zYWJsZSwgbm90IGJvdGhlcmluZyB0byB1bmRvIGV4ZyAtIGNoZWNrIGNvcnJlY3RuZXNzXG4iKTsKKwkJCQllbHNlCisJCQkJCWVtaXQoZiwgIlx0ZXhnXHQlc1xuIiwgcmVnbmFtZXNbcl0pOworCQkJCWNsZWFydGVtcG9iaihmLHRtcCk7CisJCQkJY2xlYXJ0ZW1wb2JqKGYscik7CisJCQl9CisJCQllbHNlIHsKKwkJCQllbWl0X3ByZXBvYmooZiwgbywgdHlwZSAmIE5RLCB0bXAsIDQpOwkvLyBzdG1wZGVjIHByZWRlY3JlbWVudHMsIHNvIG5lZWQgdG8gYWRkIDQhCisJCQkJZW1pdChmLCAiXHRzdG1wZGVjXHQlc1xuIFx0XHRcdFx0XHRcdC8vIFdBUk5JTkcgLSBjaGVjayB0aGF0IDQgaGFzIGJlZW4gYWRkZWQuXG4iLCByZWduYW1lc1tyXSk7CisJCQkJYWRqdGVtcG9iaihmLHRtcCwtNCk7CisvLwkJCQljbGVhcnRlbXBvYmooZix0bXApOworCQkJCWlmKCh0eXBlJk5RKSE9SU5UIHx8ICh0eXBlICYgVk9MQVRJTEUpIHx8ICh0eXBlICYgUFZPTEFUSUxFKSkKKwkJCQl7CisJCQkJCWVtaXQoZiwiXHQvLyBWb2xhdGlsZSwgb3Igbm90IGludCAtIG5vdCBjYWNoaW5nXG4iKTsKKwkJCQkJY2xlYXJ0ZW1wb2JqKGYscik7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJc2V0dGVtcG9iaihmLHIsbywwLDApOyAvLyBGSVhNRSAtIGlzIHRoaXMgY29ycmVjdD8KKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIExMT05HOgorCQlpZiAoKG8tPmZsYWdzICYgKFJFRyB8IERSRUZPQkopKSA9PSAoUkVHIHwgRFJFRk9CSikpIHsKKwkJCWVtaXRfcHJlcG9iaihmLCBvLCB0eXBlICYgTlEsIHRtcCwgMCk7CisJCQlwcmludGYoInN0b3JlX3JlZzogc3RvcmluZyBsb25nIGxvbmcgdG8gZGVyZWZlcmVuY2VkIHJlZ2lzdGVyXG4iKTsKKwkJCWVtaXQoZiwiLy9GSVhNRSAtIG5lZWQgdG8gc3RvcmUgNjQtYml0c1xuIik7CisJCQlpZXJyb3IoMCk7CisJCX0KKwkJZWxzZSB7CisJCQkvLyAKKwkJCXByaW50Zigic3RvcmVfcmVnOiBzdG9yaW5nIGxvbmcgbG9uZyBpbiAlcyB0byByZWdcbiIscmVnbmFtZXNbcl0pOworCQkJaWVycm9yKDApOworCQl9CisJCWJyZWFrOwkJCisJZGVmYXVsdDoKKwkJcHJpbnRmKCJzdG9yZV9yZWc6IHVuaGFuZGxlZCB0eXBlIDB4JXhcbiIsIHR5cGUpOworCQlpZXJyb3IoMCk7CisJCWJyZWFrOworCX0KK30KKworCisvKiAgWWllbGRzIGxvZzIoeCkrMSBvciAwLiAqLworc3RhdGljIGxvbmcgcG9mMih6dW1heCB4KQoreworCXp1bWF4IHA7CisJaW50IGxuID0gMTsKKwlwID0gdWwyenVtKDFMKTsKKwl3aGlsZSAobG4gPD0gMzIgJiYgenVtbGVxKHAsIHgpKSB7CisJCWlmICh6dW1lcXRvKHgsIHApKQorCQkJcmV0dXJuIGxuOworCQlsbisrOworCQlwID0genVtYWRkKHAsIHApOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGF2YWlscmVnKCkKK3sKKwlpbnQgaTsKKwlmb3IoaT1GSVJTVF9HUFIrUkVTRVJWRURfR1BSUztpPChMQVNUX0dQUi0xKTsrK2kpCisJCWlmKHJlZ3NbaV09PTApCisJCQlyZXR1cm4oaSk7CisJcmV0dXJuKDApOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgSUMgKnByZWxvYWQoRklMRSAqLCBzdHJ1Y3QgSUMgKixpbnQgc3RhY2tzdWJzdCk7CisKK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX3RvcChGSUxFICosIHN0cnVjdCBWYXIgKiwgbG9uZyk7CitzdGF0aWMgaW50IGZ1bmN0aW9uX2JvdHRvbShGSUxFICogZiwgc3RydWN0IFZhciAqLCBsb25nLGludCk7CisKKyNkZWZpbmUgaXNyZWcoeCkgKChwLT54LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpCisjZGVmaW5lIGludm9sdmVzcmVnKHgpICgocC0+eC5mbGFncyYoUkVHKSk9PVJFRykKKyNkZWZpbmUgaXNjb25zdCh4KSAoKHAtPnguZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpCisKK3N0YXRpYyBpbnQgcTFyZWcsIHEycmVnLCB6cmVnOworCitzdGF0aWMgY2hhciAqY2NzW10gPSB7ICJFUSIsICJORVEiLCAiU0xUIiwgIkdFIiwgIkxFIiwgIlNHVCIsICJFWCIsICIiIH07CitzdGF0aWMgY2hhciAqbG9naWNhbHNbXSA9IHsgIm9yIiwgInhvciIsICJhbmQiIH07CisKK3N0YXRpYyBjaGFyICphcml0aG1ldGljc1tdID0geyAic2hsIiwgInNociIsICJhZGQiLCAic3ViIiwgIm11bCIsICIoZGl2KSIsICIobW9kKSIgfTsKKworLyogRG9lcyBzb21lIHByZS1wcm9jZXNzaW5nIGxpa2UgZmV0Y2hpbmcgb3BlcmFuZHMgZnJvbSBtZW1vcnkgdG8KKyAgIHJlZ2lzdGVycyBldGMuICovCitzdGF0aWMgc3RydWN0IElDICpwcmVsb2FkKEZJTEUgKiBmLCBzdHJ1Y3QgSUMgKnAsaW50IHN0YWNrc3Vic3QpCit7CisJaW50IHI7CisKKwlpZihzdGFja3N1YnN0KQorCXsKKwkJaWYoaXN0b3BzdGFja3Nsb3QoJnAtPnExKSkKKwkJeworCQkJcC0+cTEucmVnPXNwOworCQkJcC0+cTEuZmxhZ3N8PVJFR3xEUkVGT0JKOworCQl9CisKKwkJaWYoaXN0b3BzdGFja3Nsb3QoJnAtPnEyKSkKKwkJeworCQkJcC0+cTIucmVnPXNwOworCQkJcC0+cTIuZmxhZ3N8PVJFR3xEUkVGT0JKOworCQl9CisKKwkJaWYoaXN0b3BzdGFja3Nsb3QoJnAtPnopKQorCQl7CisJCQlwLT56LnJlZz1zcDsKKwkJCXAtPnouZmxhZ3N8PVJFR3xEUkVGT0JKOworCQl9CisJfQorCisJaWYgKGludm9sdmVzcmVnKHExKSkKKwkJcTFyZWcgPSBwLT5xMS5yZWc7CisJZWxzZQorCQlxMXJlZyA9IDA7CisKKwlpZiAoaW52b2x2ZXNyZWcocTIpKQorCQlxMnJlZyA9IHAtPnEyLnJlZzsKKwllbHNlCisJCXEycmVnID0gMDsKKworCWlmIChpc3JlZyh6KSkgeworCQl6cmVnID0gcC0+ei5yZWc7CisJfSBlbHNlIHsKKwkJaWYgKElTRkxPQVQoenR5cChwKSkpCisJCQl6cmVnID0gZjE7CisJCWVsc2UKKwkJCXpyZWcgPSB0MTsKKwl9CisKKwlyZXR1cm4gcDsKK30KKworLyogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHJlZ2lzdGVyIHdlJ3JlIGFib3V0IHRvIHdyaXRlIHRvIHdpbGwgbWVyZWx5IGJlIHBhc3NlZCB0byBTZXRSZXR1cm4uCisgICBJZiBzbywgcmV0dXJuIDEsIGFuZCBjb252ZXJ0IHRoZSBTZXRSZXR1cm4gSUMgdG8gTk9QICovCitpbnQgbmV4dF9zZXRyZXR1cm4oc3RydWN0IElDICpwLGludCByZWcpCit7CisJaW50IHJlc3VsdD0wOworCXN0cnVjdCBJQyAqcDI9cC0+bmV4dDsKKwl3aGlsZShwMiAmJiBwMi0+Y29kZT09RlJFRVJFRykKKwkJcDI9cDItPm5leHQ7CisJaWYocDIgJiYgcDItPmNvZGU9PVNFVFJFVFVSTiAmJiAocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcgJiYgcDItPnExLnJlZz09cmVnKQorCXsKKwkJcDItPmNvZGU9Tk9QOworCQlyZXN1bHQ9MTsKKwl9CisJcmV0dXJuKHJlc3VsdCk7Cit9CisKKworaW50IGNvbnNlY3V0aXZlYWNjZXNzKHN0cnVjdCBJQyAqcCxzdHJ1Y3QgSUMgKnAyKQoreworCWlmKCFwIHx8ICFwMikKKwkJcmV0dXJuKDApOworLy8JcHJpbnRmKCJGbGFncyAleCwgJXhcbiIscC0+ei5mbGFncyxwMi0+ei5mbGFncyk7CisJaWYoKChwLT56LmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVIpICYmICgocDItPnouZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUikpCisJeworCQlpbnQgcmVzdWx0PXJlYWxfb2Zmc2V0KCZwMi0+eiktcmVhbF9vZmZzZXQoJnAtPnopOworLy8JCXByaW50ZigiR290IHR3byB2YXJzXG4iKTsKKwkJaWYoc3RyY21wKHAtPnoudi0+aWRlbnRpZmllcixwMi0+ei52LT5pZGVudGlmaWVyKSkKKwkJCXJldHVybigwKTsKKwkJaWYoaXNzdGF0aWMocC0+ei52LT5zdG9yYWdlX2NsYXNzKSAmJiBpc3N0YXRpYyhwLT56LnYtPnN0b3JhZ2VfY2xhc3MpKQorCQl7CisvLwkJCXByaW50ZigiQm90aCBzdGF0aWMgLSBkaWYgJWRcbiIscmVzdWx0KTsKKwkJCXJldHVybihyZXN1bHQpOworCQl9CisJCWlmKGlzZXh0ZXJuKHAtPnoudi0+c3RvcmFnZV9jbGFzcykgJiYgaXNleHRlcm4ocC0+ei52LT5zdG9yYWdlX2NsYXNzKSkKKwkJeworLy8JCQlwcmludGYoIkJvdGggZXh0ZXJuIC0gZGlmICVkXG4iLHJlc3VsdCk7CisJCQlyZXR1cm4ocmVzdWx0KTsKKwkJfQorCX0KKwlyZXR1cm4oMCk7Cit9CisKKy8qIHNhdmUgdGhlIHJlc3VsdCAoaW4gdGVtcCkgaW50byBwLT56ICovCisvKiBHdWFyYW50ZWVkIG5vdCB0byB0b3VjaCB0MS90MiB1bmxlc3Mgbm9taW5hdGVkICovCisvKiBvciBmb2xsb3dlZCBieSBhIFNldFJldHVybiBJQy4gKi8KK3ZvaWQgc2F2ZV90ZW1wKEZJTEUgKiBmLCBzdHJ1Y3QgSUMgKnAsIGludCB0cmVnKQoreworCWludCB0eXBlID0genR5cChwKSAmIE5ROworCWlmKERCR01TRykKKwkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gKHNhdmUgdGVtcCkiKTsKKworCWlmIChpc3JlZyh6KSkgeworCQlpbnQgdGFyZ2V0PXAtPnoucmVnOworCQlpZihEQkdNU0cpCisJCQllbWl0KGYsICJpc3JlZ1xuIik7CisJCWlmKG5leHRfc2V0cmV0dXJuKHAsdGFyZ2V0KSkKKwkJCXRhcmdldD10MTsKKwkJZW1pdChmLCAiXHRtclx0JXNcbiIsIHJlZ25hbWVzW3RhcmdldF0pOworCX0gZWxzZSB7CisJCWlmICgocC0+ei5mbGFncyAmIERSRUZPQkopICYmIChwLT56LmZsYWdzICYgUkVHKSkKKwkJCXRyZWcgPSBwLT56LnJlZzsKKwkJZWxzZSBpZihpc3N0YWNrcGFyYW0oJnAtPnopICYmICEocC0+ei5mbGFncyAmIERSRUZPQkopKQorCQkJdHlwZT1JTlQ7CisKKwkJaWYoREJHTVNHKQorCQkJZW1pdChmLCAic3RvcmUgdHlwZSAleFxuIix0eXBlKTsKKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBDSEFSOgorCQkJaWYgKHAtPnouYW0gJiYgcC0+ei5hbS0+dHlwZSA9PSBBTV9QT1NUSU5DKQorCQkJeworCQkJCWVtaXQoZiwgIlx0c3RiaW5jXHQlc1xuIiwgcmVnbmFtZXNbdHJlZ10pOworCQkJCWFkanRlbXBvYmooZix0cmVnLDEpOworCQkJfQorCQkJZWxzZSBpZiAoKHAtPnouYW0gJiYgcC0+ei5hbS0+ZGlzcG9zYWJsZSkKKwkJCQkgfHwgKHRyZWcgPT0gdDEpKQorCQkJeworCQkJCWVtaXQoZiwgIlx0c3RiaW5jXHQlc1xuXHRcdFx0XHRcdFx0Ly9EaXNwb3NhYmxlLCBwb3N0aW5jIGRvZXNuJ3QgbWF0dGVyLlxuIiwgcmVnbmFtZXNbdHJlZ10pOworCQkJCWFkanRlbXBvYmooZix0cmVnLDEpOworCQkJfQorCQkJZWxzZQorCQkJCWVtaXQoZiwgIlx0Ynl0XG5cdHN0XHQlc1xuIiwgcmVnbmFtZXNbdHJlZ10pOworCQkJYnJlYWs7CisJCWNhc2UgU0hPUlQ6CisJCQllbWl0KGYsICJcdGhsZlxuXHRzdFx0JXNcbiIsIHJlZ25hbWVzW3RyZWddKTsKKwkJCWJyZWFrOworCQljYXNlIElOVDoKKwkJY2FzZSBMT05HOgorCQljYXNlIFBPSU5URVI6CisvLwkJCS8vIFdvdWxkIG5lZWQgdG8gYWRqdXN0IHRoZSBwb2ludGVyIGF0IHRoZSBzZXR1cCBzdGFnZSBzaW5jZSB3ZSdyZSBwcmVkZWNyZW1lbnRpbmcKKy8vCQkJaWYgKGNvbnNlY3V0aXZlYWNjZXNzKHAscC0+bmV4dCk9PS00IHx8IChwLT56LmFtICYmIHAtPnouYW0tPnR5cGUgPT0gQU1fUFJFREVDKSkKKy8vCQkJeworLy8JCQkJZW1pdChmLCAiXHRzdGRlY1x0JXNcbiIsIHJlZ25hbWVzW3RyZWddKTsKKy8vCQkJCWFkanRlbXBvYmooZix0cmVnLC00KTsKKy8vCQkJfQorCQkJaWYgKGNvbnNlY3V0aXZlYWNjZXNzKHAscC0+bmV4dCk9PTQgfHwgKHAtPnouYW0gJiYgcC0+ei5hbS0+dHlwZSA9PSBBTV9QT1NUSU5DKSkKKwkJCXsKKwkJCQllbWl0KGYsICJcdHN0aW5jXHQlc1xuIiwgcmVnbmFtZXNbdHJlZ10pOworCQkJCWFkanRlbXBvYmooZix0cmVnLDQpOworCQkJfQorCQkJZWxzZQorCQkJCWVtaXQoZiwgIlx0c3RcdCVzXG4iLCByZWduYW1lc1t0cmVnXSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50Zigic2F2ZV90ZW1wIC0gdHlwZSAlZCBub3QgeWV0IGhhbmRsZWRcbiIsIHp0eXAocCkpOworCQkJZW1pdChmLCJcdFx0XHRcdFx0XHQvLyBGSVhNRSAtIHNhdmVfdGVtcCBkb2Vzbid0IHN1cHBvcnQgc2l6ZVxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZihEQkdNU0cpCisJCWVtaXQoZiwgIlx0XHRcdFx0XHRcdC8vc2F2ZV90ZW1wIGRvbmVcbiIpOworfQorCisvKiBzYXZlIHRoZSByZXN1bHQgKGluIHpyZWcpIGludG8gcC0+eiAqLwordm9pZCBzYXZlX3Jlc3VsdChGSUxFICogZiwgc3RydWN0IElDICpwKQoreworCWlmKERCR01TRykKKwkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gKHNhdmUgcmVzdWx0KSAiKTsKKwlpZiAoaXNyZWcoeikpIHsKKwkJaWYoREJHTVNHKQorCQkJZW1pdChmLCAiLy8gaXNyZWdcbiIpOworCQlpZiAocC0+ei5yZWcgIT0genJlZykKKwkJeworCQkJZW1pdChmLCAiXHRtdFx0JXNcblx0bXJcdCVzXG4iLCByZWduYW1lc1t6cmVnXSwgcmVnbmFtZXNbcC0+ei5yZWddKTsKKwkJCXNldHRlbXBvYmooZix0bXAsJnAtPnosMCwwKTsKKwkJCXNldHRlbXBvYmooZixwLT56LnJlZywmcC0+eiwwLDApOworCQl9CisJfQorCWVsc2UKKwl7CisJCWVtaXQoZiwgIi8vIG5vdCByZWdcbiIpOworCQlzdG9yZV9yZWcoZix6cmVnLCZwLT56LHp0eXAocCkpOworCX0KKwlyZXR1cm47Cit9CisKKyNpbmNsdWRlICJhZGRyZXNzaW5nbW9kZXMuYyIKKyNpbmNsdWRlICJ0ZW1wcmVncy5jIgorI2luY2x1ZGUgImlubGluZW1lbWNweS5jIgorI2luY2x1ZGUgImxpYmNhbGxzLmMiCisKKy8qIGdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gZW50cnkgY29kZSAqLworc3RhdGljIHZvaWQgZnVuY3Rpb25fdG9wKEZJTEUgKiBmLCBzdHJ1Y3QgVmFyICp2LCBsb25nIG9mZnNldCkKK3sKKwlpbnQgaTsKKwlpbnQgcmVnY291bnQgPSAwOworCisJY2xlYXJ0ZW1wb2JqKGYsdG1wKTsKKwljbGVhcnRlbXBvYmooZix0MSk7CisKKwlpZihEQkdNU0cpCisJeworCQllbWl0KGYsICJcdC8vcmVnaXN0ZXJzIHVzZWQ6XG4iKTsKKwkJZm9yIChpID0gRklSU1RfR1BSK1JFU0VSVkVEX0dQUlM7IGkgPD0gTEFTVF9HUFI7ICsraSkgeworCQkJZW1pdChmLCAiXHRcdC8vJXM6ICVzXG4iLCByZWduYW1lc1tpXSwgcmVndXNlZFtpXSA/ICJ5ZXMiIDogIm5vIik7CisJCQlpZiAocmVndXNlZFtpXSAmJiAoaSA+PSAoRklSU1RfR1BSK1NDUkFUQ0hfR1BSUytSRVNFUlZFRF9HUFJTKSkgJiYgKGkgPD0gTEFTVF9HUFIgLSAyKSkKKwkJCQkrK3JlZ2NvdW50OworCQl9CisJfQorCisvLyBFbWl0IGN0b3IgLyBkdG9yIHRhYmxlcworCWN0b3JfZHRvcihmLCB2KTsKKworCXJzYXZlc2l6ZSA9IDA7CisJaWYgKCFzcGVjaWFsX3NlY3Rpb24oZiwgdikpIHsKKwkJZW1pdChmLCAiXHQuc2VjdGlvblx0LnRleHQuJXhcbiIsIHNlY3Rpb25pZCk7CisJCXNlY3Rpb249Q09ERTsKKwkJKytzZWN0aW9uaWQ7CisJfQorCWlmICh2LT5zdG9yYWdlX2NsYXNzID09IEVYVEVSTikgeworCQlpZiAoKHYtPmZsYWdzICYgKElOTElORUZVTkMgfCBJTkxJTkVFWFQpKSAhPSBJTkxJTkVGVU5DKSB7CisJCQlpZiAoaXN3ZWFrKHYpKQorCQkJCWVtaXQoZiwgIlx0LndlYWtcdCVzJXNcbiIsIGlkcHJlZml4LCB2LT5pZGVudGlmaWVyKTsKKwkJCWVsc2UKKwkJCQllbWl0KGYsICJcdC5nbG9iYWxcdCVzJXNcbiIsIGlkcHJlZml4LCB2LT5pZGVudGlmaWVyKTsKKwkJfQorCQllbWl0KGYsICIlcyVzOlxuIiwgaWRwcmVmaXgsIHYtPmlkZW50aWZpZXIpOworCX0gZWxzZQorCQllbWl0KGYsICIlcyVsZDpcbiIsIGxhYnByZWZpeCwgem0ybCh2LT5vZmZzZXQpKTsKKworCWlmIChyZWdjb3VudCA8IDMpIHsKKwkJZW1pdChmLCAiXHRzdGRlY1x0JXNcbiIsIHJlZ25hbWVzW3NwXSk7CisJCWZvciAoaSA9IEZJUlNUX0dQUiArIFNDUkFUQ0hfR1BSUzsgaSA8PSBMQVNUX0dQUiAtIDM7ICsraSkgeworCQkJaWYgKHJlZ3VzZWRbaV0gJiYgIXJlZ3NjcmF0Y2hbaV0pIHsKKwkJCQllbWl0KGYsICJcdG10XHQlc1xuXHRzdGRlY1x0JXNcbiIsIHJlZ25hbWVzW2ldLCByZWduYW1lc1tzcF0pOworCQkJCXJzYXZlc2l6ZSArPSA0OworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZW1pdChmLCAiXHRleGdcdCVzXG5cdHN0bXBkZWNcdCVzXG4iLCByZWduYW1lc1tzcF0sIHJlZ25hbWVzW3NwXSk7CisJCWZvciAoaSA9IEZJUlNUX0dQUiArIFNDUkFUQ0hfR1BSUzsgaSA8PSBMQVNUX0dQUiAtIDM7ICsraSkgeworCQkJaWYgKHJlZ3VzZWRbaV0gJiYgIXJlZ3NjcmF0Y2hbaV0pIHsKKwkJCQllbWl0KGYsICJcdHN0bXBkZWNcdCVzXG4iLCByZWduYW1lc1tpXSk7CisJCQkJcnNhdmVzaXplICs9IDQ7CisJCQl9CisJCX0KKwkJZW1pdChmLCAiXHRleGdcdCVzXG4iLCByZWduYW1lc1tzcF0pOworCX0KKworCS8vIEZJWE1FIC0gQWxsb3cgdGhlIHN0YWNrIHRvIGZsb2F0LCBpbiB0aGUgaG9wZSB0aGF0IHdlIGNhbiB1c2Ugc3RkZWMgdG8gYWRqdXN0IGl0LgorCisJaWYgKChvZmZzZXQgPT0gNCkgJiYgb3B0c2l6ZSkKKwkJZW1pdChmLCAiXHRzdGRlY1x0cjZcdC8vIHNob3J0ZXN0IHdheSB0byBkZWNyZW1lbnQgc3AgYnkgNFxuIik7CisJZWxzZSBpZiAob2Zmc2V0KSB7CisJCWVtaXRfY29uc3RhbnR0b3RlbXAoZiwgLW9mZnNldCk7CisJCWVtaXQoZiwgIlx0YWRkXHQlc1xuIiwgcmVnbmFtZXNbc3BdKTsKKwl9Cit9CisKKy8qIGdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gZXhpdCBjb2RlICovCisvKiBSZXR1cm5zIDEgaWYgdGFpbCBjb2RlIHdhcyBnZW5lcmF0ZWQuICovCitzdGF0aWMgaW50IGZ1bmN0aW9uX2JvdHRvbShGSUxFICogZiwgc3RydWN0IFZhciAqdiwgbG9uZyBvZmZzZXQsaW50IGZpcnN0dGFpbCkKK3sKKwlpbnQgaTsKKwlpbnQgdGFpbD0wOworCisJaW50IHJlZ2NvdW50ID0gMDsKKwlmb3IgKGkgPSBGSVJTVF9HUFIgKyBTQ1JBVENIX0dQUlMgKyBSRVNFUlZFRF9HUFJTOyBpIDw9IExBU1RfR1BSIC0gMzsgKytpKSB7CisJCWlmIChyZWd1c2VkW2ldICYmICFyZWdzY3JhdGNoW2ldKQorCQkJKytyZWdjb3VudDsKKwl9CisKKwlpZiAoKG9mZnNldCA9PSA0KSAmJiBvcHRzaXplKQorCQllbWl0KGYsICJcdGxkaW5jXHQlc1x0Ly8gc2hvcnRlc3Qgd2F5IHRvIGFkZCA0IHRvIHNwXG4iLCByZWduYW1lc1tzcF0pOworCWVsc2UgaWYgKG9mZnNldCkgeworCQllbWl0X2NvbnN0YW50dG90ZW1wKGYsIC1vZmZzZXQpOwkvLyBOZWdhdGl2ZSByYW5nZSBleHRlbmRzIG9uZSBpbnRlZ2VyIGZ1cnRoZXIgdGhhbiBwb3NpdGl2ZSByYW5nZS4KKwkJZW1pdChmLCAiXHRzdWJcdCVzXG4iLCByZWduYW1lc1tzcF0pOworCX0KKworCWlmKG9wdHNpemUpIC8vIElmIHdlJ3JlIG9wdGltaXNpbmcgZm9yIHNpemUgd2UgY2FuIHBvdGVudGlhbGx5IHNhdmUgc29tZSBieXRlcyBpbiB0aGUgZnVuY3Rpb24gdGFpbHMuCisJeworCQlpZihyZWdjb3VudCkKKwkJeworCQkJLyogV2UgaGF2ZSB0byByZXN0b3JlIHNvbWUgcmVnaXN0ZXJzLiAgSnVtcCBpbnRvIHRoZSB0YWlsIGNvZGUgYXQgdGhlIGFwcHJvcHJpYXRlIHBsYWNlLiAqLworCQkJaWYocmVnY291bnQ8KDUtU0NSQVRDSF9HUFJTKSB8fCAhZmlyc3R0YWlsKQorCQkJeworCQkJCWVtaXQoZiwiXHQubGlwY3JlbFx0LmZ1bmN0aW9udGFpbCwgJWRcbiIsKCg1LVNDUkFUQ0hfR1BSUyktcmVnY291bnQpKjIpOworCQkJCWVtaXQoZiwiXHRhZGRcdCVzXG5cbiIscmVnbmFtZXNbcGNdKTsKKwkJCX0KKwkJCWlmKGZpcnN0dGFpbCkKKwkJCXsKKwkJCQkvKiBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIG5lZWRlZCB0byByZXN0b3JlIHJlZ2lzdGVycyAtIGdlbmVyYXRlIHRhaWwgY29kZSAqLworCQkJCWVtaXQoZiwiLmZ1bmN0aW9udGFpbDpcbiIpOworCQkJCWZvciAoaSA9IExBU1RfR1BSIC0gMzsgaSA+PSBGSVJTVF9HUFIgKyBTQ1JBVENIX0dQUlM7IC0taSkgeworCQkJCQlpZiAoIXJlZ3NjcmF0Y2hbaV0pCisJCQkJCQllbWl0KGYsICJcdGxkaW5jXHQlc1xuXHRtclx0JXNcblxuIiwgcmVnbmFtZXNbc3BdLCByZWduYW1lc1tpXSk7CisJCQkJfQorCQkJCWVtaXQoZiwgIlx0bGRpbmNcdCVzXG5cdG1yXHQlc1xuXG4iLCByZWduYW1lc1tzcF0sIHJlZ25hbWVzW3BjXSk7CisJCQkJaWYoZikKKwkJCQkJdGFpbD0xOyAvKiBIaWdoZXIgb3B0aW1pc2F0aW9uIGxldmVscyBkbyBhIGR1bW15IHJ1biB3aXRoIG51bGwgZmlsZSAqLworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJLyogRGlkbid0IG5lZWQgdG8gcHJlc2VydmUgYW55IHJlZ2lzdGVycywganVzdCByZXN0b3JlIFBDICovCisJCQllbWl0KGYsICJcdGxkaW5jXHQlc1xuXHRtclx0JXNcblxuIiwgcmVnbmFtZXNbc3BdLCByZWduYW1lc1twY10pOworCQl9CisJfQorCWVsc2UKKwl7CisJCWZvciAoaSA9IExBU1RfR1BSIC0gMzsgaSA+PSBGSVJTVF9HUFIgKyBTQ1JBVENIX0dQUlM7IC0taSkgeworCQkJaWYgKHJlZ3VzZWRbaV0gJiYgIXJlZ3NjcmF0Y2hbaV0pCisJCQkJZW1pdChmLCAiXHRsZGluY1x0JXNcblx0bXJcdCVzXG5cbiIsIHJlZ25hbWVzW3NwXSwgcmVnbmFtZXNbaV0pOworCQl9CisJCWVtaXQoZiwgIlx0bGRpbmNcdCVzXG5cdG1yXHQlc1xuXG4iLCByZWduYW1lc1tzcF0sIHJlZ25hbWVzW3BjXSk7CisJfQorCXJldHVybih0YWlsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgRW5kIG9mIHByaXZhdGUgZGF0YSBhbmQgZnVuY3Rpb25zLiAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAgRG9lcyBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb25zIGZvciB0aGUgY29kZS1nZW5lcmF0b3IuIEdldHMgY2FsbGVkICAqLworLyogIG9uY2UgYXQgdGhlIGJlZ2lubmluZyBhbmQgc2hvdWxkIHJldHVybiAwIGluIGNhc2Ugb2YgcHJvYmxlbXMuICAgICAgKi8KK2ludCBpbml0X2NnKHZvaWQpCit7CisJaW50IGk7CisJLyogIEluaXRpYWxpemUgc29tZSB2YWx1ZXMgd2hpY2ggY2Fubm90IGJlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgICAqLworCS8qICBiZWNhdXNlIHRoZXkgYXJlIHN0b3JlZCBpbiB0aGUgdGFyZ2V0J3MgYXJpdGhtZXRpYy4gICAgICAgICAgICAgKi8KKwltYXhhbGlnbiA9IGwyem0oNEwpOworCWNoYXJfYml0ID0gbDJ6bSg4TCk7CisJc3RhY2thbGlnbiA9IGwyem0oNCk7CisKKwlmbGFnXzgzMl9iaWdlbmRpYW49MDsKKwlpZihnX2ZsYWdzW0ZMQUdfQkVdJlVTRURGTEFHKQorCQlmbGFnXzgzMl9iaWdlbmRpYW49MTsKKwllbHNlIGlmKCFnX2ZsYWdzW0ZMQUdfQkVdJlVTRURGTEFHKQorCQlwcmludGYoIk5laXRoZXIgLWViIG5vciAtZWwgc3BlY2lmaWVkIC0gZGVmYXVsdGluZyB0byBsaXR0bGUtZW5kaWFuXG4iKTsKKworI2lmbmRlZiBWMDlHCisJY2xpc3RfY29weV9zdGFjaz0wOworCWNsaXN0X2NvcHlfc3RhdGljPTA7CisJY2xpc3RfY29weV9wb2ludGVyPTA7CisjZW5kaWYKKworCS8vIFdlIGhhdmUgZnVsbCBsb2FkLXN0b3JlIGFsaWduLCBzbyBpbiBzaXplIG1vZGUgd2UgY2FuIHBhY2sgZGF0YSBtb3JlIHRpZ2h0bHkuLi4KKworCWZvciAoaSA9IDA7IGkgPD0gTUFYX1RZUEU7IGkrKykgeworCQlzaXpldGFiW2ldID0gbDJ6bShtc2l6ZXRhYltpXSk7CisJCWFsaWduW2ldID0gb3B0c2l6ZSA/IDEgOiBsMnptKG1hbGlnbltpXSk7CisKKy8vIENhbid0IGFsaWduIGV2ZXJ5dGhpbmcgdG8gNCBieXRlcyBmb3Igc3BlZWQgd2l0aG91dCBtZXNzaW5nIHVwIHN0cnVjdCBwYWNraW5nLiAgSXMgdGhlcmUgYSBiZXR0ZXIgd2F5PworLy8JCWFsaWduW2ldID0gb3B0c3BlZWQgPyA0IDogKG9wdHNpemUgPyAxIDogbDJ6bShtYWxpZ25baV0pKTsKKy8vCQlhbGlnbltpXSA9IGwyem0obWFsaWduW2ldKTsKKwl9CisKKwlyZWduYW1lc1swXSA9ICJub3JlZyI7CisJZm9yIChpID0gRklSU1RfR1BSOyBpIDw9IExBU1RfR1BSIC0gMTsgaSsrKSB7CisJCXJlZ25hbWVzW2ldID0gbXltYWxsb2MoNSk7CisJCXNwcmludGYocmVnbmFtZXNbaV0sICJyJWQiLCBpIC0gRklSU1RfR1BSKTsKKwkJcmVnc2l6ZVtpXSA9IGwyem0oNEwpOworCQlyZWd0eXBlW2ldID0gJmx0eXA7CisJCXJlZ3NhW2ldID0gMDsKKwl9CisJcmVnbmFtZXNbaV0gPSBteW1hbGxvYyg1KTsKKwlzcHJpbnRmKHJlZ25hbWVzW2ldLCAidG1wIik7CisJcmVnc2l6ZVtpXSA9IGwyem0oNEwpOworCXJlZ3R5cGVbaV0gPSAmbHR5cDsKKwlyZWdzYVtpXSA9IDE7CisJZm9yIChpID0gRklSU1RfRlBSOyBpIDw9IExBU1RfRlBSOyBpKyspIHsKKwkJcmVnbmFtZXNbaV0gPSBteW1hbGxvYygxMCk7CisJCXNwcmludGYocmVnbmFtZXNbaV0sICJmcHIlZCIsIGkgLSBGSVJTVF9GUFIpOworCQlyZWdzaXplW2ldID0gbDJ6bSg4TCk7CisJCXJlZ3R5cGVbaV0gPSAmbGRibDsKKwl9CisKKwkvKiAgVXNlIG11bHRpcGxlIGNjcy4gICAqLworCW11bHRpcGxlX2NjcyA9IDA7CisKKwkvKiAgSW5pdGlhbGl6ZSB0aGUgbWluL21heC1zZXR0aW5ncy4gTm90ZSB0aGF0IHRoZSB0eXBlcyBvZiB0aGUgICAgICovCisJLyogIGhvc3Qgc3lzdGVtIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgdGFyZ2V0IHN5c3RlbSBhbmQgeW91IG1heSAqLworCS8qICBvbmx5IHVzZSB0aGUgc21hbGxlc3QgbWF4aW11bSB2YWx1ZXMgQU5TSSBndWFyYW50ZWVzIGlmIHlvdSAgICAgKi8KKwkvKiAgd2FudCB0byBiZSBwb3J0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogIFRoYXQncyB0aGUgcmVhc29uIGZvciB0aGUgc3VidHJhY3Rpb24gaW4gdF9taW5bSU5UXS4gTG9uZyBjb3VsZCAqLworCS8qICBiZSB1bmFibGUgdG8gcmVwcmVzZW50IC0yMTQ3NDgzNjQ4IG9uIHRoZSBob3N0IHN5c3RlbS4gICAgICAgICAgKi8KKwl0X21pbltDSEFSXSA9IGwyem0oLTEyOEwpOworCXRfbWluW1NIT1JUXSA9IGwyem0oLTMyNzY4TCk7CisJdF9taW5bSU5UXSA9IHptc3ViKGwyem0oLTIxNDc0ODM2NDdMKSwgbDJ6bSgxTCkpOworCXRfbWluW0xPTkddID0gdF9taW4oSU5UKTsKKwl0X21pbltMTE9OR10gPSB6bWxzaGlmdChsMnptKDFMKSwgbDJ6bSg2M0wpKTsKKwl0X21pbltNQVhJTlRdID0gdF9taW4oTExPTkcpOworCXRfbWF4W0NIQVJdID0gdWwyenVtKDEyN0wpOworCXRfbWF4W1NIT1JUXSA9IHVsMnp1bSgzMjc2N1VMKTsKKwl0X21heFtJTlRdID0gdWwyenVtKDIxNDc0ODM2NDdVTCk7CisJdF9tYXhbTE9OR10gPSB0X21heChJTlQpOworCXRfbWF4W0xMT05HXSA9IHp1bXJzaGlmdCh6dW1rb21wbCh1bDJ6dW0oMFVMKSksIHVsMnp1bSgxVUwpKTsKKwl0X21heFtNQVhJTlRdID0gdF9tYXgoTExPTkcpOworCXR1X21heFtDSEFSXSA9IHVsMnp1bSgyNTVVTCk7CisJdHVfbWF4W1NIT1JUXSA9IHVsMnp1bSg2NTUzNVVMKTsKKwl0dV9tYXhbSU5UXSA9IHVsMnp1bSg0Mjk0OTY3Mjk1VUwpOworCXR1X21heFtMT05HXSA9IHRfbWF4KFVOU0lHTkVEIHwgSU5UKTsKKwl0dV9tYXhbTExPTkddID0genVta29tcGwodWwyenVtKDBVTCkpOworCXR1X21heFtNQVhJTlRdID0gdF9tYXgoVU5TSUdORUQgfCBMTE9ORyk7CisKKwkvKiAgUmVzZXJ2ZSBhIGZldyByZWdpc3RlcnMgZm9yIHVzZSBieSB0aGUgY29kZS1nZW5lcmF0b3IuICAgICAgKi8KKwkvKiAgVGhpcyBpcyBub3Qgb3B0aW1hbCBidXQgc2ltcGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl0bXAgPSBGSVJTVF9HUFIgKyA4OworCXBjID0gRklSU1RfR1BSICsgNzsKKwlzcCA9IEZJUlNUX0dQUiArIDY7CisJdDEgPSBGSVJTVF9HUFI7CQkvLyByMCwgYWxzbyByZXR1cm4gcmVnaXN0ZXIuCisJdDIgPSBGSVJTVF9HUFIgKyAxOworLy8gIGYxPUZJUlNUX0ZQUjsKKy8vICBmMj1GSVJTVF9GUFIrMTsKKworCWZvciAoaSA9IEZJUlNUX0dQUjsgaSA8PSBMQVNUX0dQUjsgaSsrKQorCQlyZWdzY3JhdGNoW2ldID0gMDsKKwlmb3IgKGkgPSBGSVJTVF9GUFI7IGkgPD0gTEFTVF9GUFI7IGkrKykKKwkJcmVnc2NyYXRjaFtpXSA9IDA7CisKKwlyZWdzYVtGSVJTVF9HUFJdID0gMTsJLy8gQWxsb2NhdGUgdGhlIHJldHVybiByZWdpc3RlcgorCXJlZ3NhW3QxXSA9IDE7CisJcmVnc2FbdDJdID0gMDsKKwlyZWdzYVtzcF0gPSAxOworCXJlZ3NhW3BjXSA9IDE7CisJcmVnc2FbdG1wXSA9IDE7CisJcmVnc2NyYXRjaFtGSVJTVF9HUFJdID0gMDsKKwlmb3IoaT1GSVJTVF9HUFIrUkVTRVJWRURfR1BSUztpPChGSVJTVF9HUFIrUkVTRVJWRURfR1BSUytTQ1JBVENIX0dQUlMpOysraSkKKwkJcmVnc2NyYXRjaFtpXSA9IDE7CisJcmVnc2NyYXRjaFtzcF0gPSAwOworCXJlZ3NjcmF0Y2hbcGNdID0gMDsKKworCXRhcmdldF9tYWNyb3MgPSBtYXJyYXk7CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBpbml0X2RiKEZJTEUgKiBmKQoreworfQorCitpbnQgZnJldHVybihzdHJ1Y3QgVHlwICp0KQorLyogIFJldHVybnMgdGhlIHJlZ2lzdGVyIGluIHdoaWNoIHZhcmlhYmxlcyBvZiB0eXBlIHQgYXJlIHJldHVybmVkLiAqLworLyogIElmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgcmV0dXJuZWQgaW4gYSByZWdpc3RlciByZXR1cm5zIDAuICAgICAgICAqLworLyogIEEgcG9pbnRlciBNVVNUIGJlIHJldHVybmVkIGluIGEgcmVnaXN0ZXIuIFRoZSBjb2RlLWdlbmVyYXRvciAgICAqLworLyogIGhhcyB0byBzaW11bGF0ZSBhIHBzZXVkbyByZWdpc3RlciBpZiBuZWNlc3NhcnkuICAgICAgICAgICAgICAgICAqLworeworCWlmIChJU0ZMT0FUKHQtPmZsYWdzKSkKKwkJcmV0dXJuIDA7CisJaWYgKElTU1RSVUNUKHQtPmZsYWdzKSB8fCBJU1VOSU9OKHQtPmZsYWdzKSkKKwkJcmV0dXJuIDA7CisJaWYgKHptbGVxKHN6b2YodCksIGwyem0oNEwpKSkKKwkJcmV0dXJuIEZJUlNUX0dQUjsKKwllbHNlCisJCXJldHVybiAwOworfQorCitpbnQgcmVnX3BhaXIoaW50IHIsIHN0cnVjdCBycGFpciAqcCkKKy8qIFJldHVybnMgMCBpZiB0aGUgcmVnaXN0ZXIgaXMgbm8gcmVnaXN0ZXIgcGFpci4gSWYgciAgKi8KKy8qIGlzIGEgcmVnaXN0ZXIgcGFpciBub24temVybyB3aWxsIGJlIHJldHVybmVkIGFuZCB0aGUgKi8KKy8qIHN0cnVjdHVyZSBwb2ludGVkIHRvIHAgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgdHdvICAgKi8KKy8qIGVsZW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKwlyZXR1cm4gMDsKK30KKworLyogZXN0aW1hdGUgdGhlIGNvc3Qtc2F2aW5nIGlmIG9iamVjdCBvIGZyb20gSUMgcCBpcyBwbGFjZWQgaW4KKyAgIHJlZ2lzdGVyIHIgKi8KK2ludCBjb3N0X3NhdmluZ3Moc3RydWN0IElDICpwLCBpbnQgciwgc3RydWN0IG9iaiAqbykKK3sKKwlpbnQgYyA9IHAtPmNvZGU7CisJaWYoby0+diAmJiBpc2V4dGVybihvLT52LT5zdG9yYWdlX2NsYXNzKSkgIC8vIEV4dGVybnMgYXJlIHBhcnRpY3VsYXJseSBjb3N0bHkgZHVlIHRvIHRoZSBsZGluYyByNyBzaHVmZmxlCisJCXJldHVybihvLT5mbGFncyAmIERSRUZPQkogPyA1IDogMyk7CisJaWYgKG8tPmZsYWdzICYgVktPTlNUKSB7CisJCWlmIChpc2V4dGVybihvLT5mbGFncykgfHwgaXNzdGF0aWMoby0+ZmxhZ3MpKQorCQkJcmV0dXJuIDI7CisJCWVsc2UgeworCQkJc3RydWN0IG9iaiAqbzIgPSAmby0+di0+Y29iajsKKwkJCWludCBjID0gY291bnRfY29uc3RhbnRjaHVua3MobzItPnZhbC52bWF4KTsKKwkJCXJldHVybiBjIC0gMTsKKwkJfQorCX0KKwlpZiAoby0+ZmxhZ3MgJiBEUkVGT0JKKQorCQlyZXR1cm4gMjsKKwlpZiAoYyA9PSBTRVRSRVRVUk4pLy8gJiYgciA9PSBwLT56LnJlZyAmJiAhKG8tPmZsYWdzICYgRFJFRk9CSikpCisJCXJldHVybiAxOworCWlmIChjID09IEdFVFJFVFVSTikvLyAmJiByID09IHAtPnExLnJlZyAmJiAhKG8tPmZsYWdzICYgRFJFRk9CSikpCisJCXJldHVybiAxOworCXJldHVybiAxOworfQorCitpbnQgcmVnb2soaW50IHIsIGludCB0LCBpbnQgbW9kZSkKKy8qICBSZXR1cm5zIDAgaWYgcmVnaXN0ZXIgciBjYW5ub3Qgc3RvcmUgdmFyaWFibGVzIG9mICAgKi8KKy8qICB0eXBlIHQuIElmIHQ9PVBPSU5URVIgYW5kIG1vZGUhPTAgdGhlbiBpdCByZXR1cm5zICAgKi8KKy8qICBub24temVybyBvbmx5IGlmIHRoZSByZWdpc3RlciBjYW4gc3RvcmUgYSBwb2ludGVyICAgKi8KKy8qICBhbmQgZGVyZWZlcmVuY2UgYSBwb2ludGVyIHRvIG1vZGUuICAgICAgICAgICAgICAgICAgKi8KK3sKKwlpZiAociA9PSAwKQorCQlyZXR1cm4gMDsKKwl0ICY9IE5ROworCWlmIChJU0ZMT0FUKHQpICYmIHIgPj0gRklSU1RfRlBSICYmIHIgPD0gTEFTVF9GUFIpCisJCXJldHVybiAxOworCWlmICh0ID09IFBPSU5URVIgJiYgciA+PSBGSVJTVF9HUFIgJiYgciA8PSBMQVNUX0dQUikKKwkJcmV0dXJuIDE7CisJaWYgKHQgPj0gQ0hBUiAmJiB0IDw9IExPTkcgJiYgciA+PSBGSVJTVF9HUFIgJiYgciA8PSBMQVNUX0dQUikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkYW5nZXJvdXNfSUMoc3RydWN0IElDICpwKQorLyogIFJldHVybnMgemVybyBpZiB0aGUgSUMgcCBjYW4gYmUgc2FmZWx5IGV4ZWN1dGVkICAgICAqLworLyogIHdpdGhvdXQgZGFuZ2VyIG9mIGV4Y2VwdGlvbnMgb3Igc2ltaWxhciB0aGluZ3MuICAgICAqLworLyogIHZiY2MgbWF5IGdlbmVyYXRlIGNvZGUgaW4gd2hpY2ggbm9uLWRhbmdlcm91cyBJQ3MgICAqLworLyogIGFyZSBzb21ldGltZXMgZXhlY3V0ZWQgYWx0aG91Z2ggY29udHJvbC1mbG93IG1heSAgICAqLworLyogIG5ldmVyIHJlYWNoIHRoZW0gKG1haW5seSB3aGVuIG1vdmluZyBjb21wdXRhdGlvbnMgICAqLworLyogIG91dCBvZiBsb29wcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFR5cGljYWwgSUNzIHRoYXQgZ2VuZXJhdGUgZXhjZXB0aW9ucyBvbiBzb21lICAgICAgICAqLworLyogIG1hY2hpbmVzIGFyZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtIGFjY2Vzc2VzIHZpYSBwb2ludGVycyAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtIGRpdmlzaW9uL21vZHVsbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtIG92ZXJmbG93IG9uIHNpZ25lZCBpbnRlZ2VyL2Zsb2F0cyAgICAgICAgICAgICAqLworeworCWludCBjID0gcC0+Y29kZTsKKwlpZiAoKHAtPnExLmZsYWdzICYgRFJFRk9CSikgfHwgKHAtPnEyLmZsYWdzICYgRFJFRk9CSikKKwkgICAgfHwgKHAtPnouZmxhZ3MgJiBEUkVGT0JKKSkKKwkJcmV0dXJuIDE7CisJaWYgKChjID09IERJViB8fCBjID09IE1PRCkgJiYgIWlzY29uc3QocTIpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IG11c3RfY29udmVydChpbnQgbywgaW50IHQsIGludCBjb25zdF9leHByKQorLyogIFJldHVybnMgemVybyBpZiBjb2RlIGZvciBjb252ZXJ0aW5nIG5wIHRvIHR5cGUgdCAgICAqLworLyogIGNhbiBiZSBvbWl0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE9uIHRoZSBQb3dlclBDIGNwdSBwb2ludGVycyBhbmQgMzJiaXQgICAgICAgICAgICAgICAqLworLyogIGludGVnZXJzIGhhdmUgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gYW5kIGNhbiB1c2UgICAqLworLyogIHRoZSBzYW1lIHJlZ2lzdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworCWludCBvcCA9IG8gJiBOUSwgdHAgPSB0ICYgTlE7CisJaWYgKChvcCA9PSBJTlQgfHwgb3AgPT0gTE9ORyB8fCBvcCA9PSBQT0lOVEVSKQorCSAgICAmJiAodHAgPT0gSU5UIHx8IHRwID09IExPTkcgfHwgdHAgPT0gUE9JTlRFUikpCisJCXJldHVybiAwOworCWlmIChvcCA9PSBET1VCTEUgJiYgdHAgPT0gTERPVUJMRSkKKwkJcmV0dXJuIDA7CisJaWYgKG9wID09IExET1VCTEUgJiYgdHAgPT0gRE9VQkxFKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKwordm9pZCBnZW5fZHMoRklMRSAqIGYsIHptYXggc2l6ZSwgc3RydWN0IFR5cCAqdCkKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjcmVhdGUgPHNpemU+IGJ5dGVzIG9mIHN0b3JhZ2UgKi8KKy8qICBpbml0aWFsaXplZCB3aXRoIHplcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKwlpZiAobmV3b2JqICYmIHNlY3Rpb24gIT0gU1BFQ0lBTCkKKwkJZW1pdChmLCAiJWxkXG4iLCB6bTJsKHNpemUpKTsKKwllbHNlCisJCWVtaXQoZiwgIlx0LnNwYWNlXHQlbGRcbiIsIHptMmwoc2l6ZSkpOworCW5ld29iaiA9IDA7Cit9CisKKworLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIG1ha2Ugc3VyZSB0aGUgbmV4dCBkYXRhIGlzCisgICAgYWxpZ25lZCB0byBtdWx0aXBsZXMgb2YgPGFsaWduPiBieXRlcy4KKyAgICBJZiB0aGUgc3BlZWQgb3B0aW1pc2F0aW9uIGZsYWcgaXMgc2V0LCBhbHdheXMgYWxpZ24KKyAgICB0byBmb3VyIGJ5dGVzLiAqLwordm9pZCBnZW5fYWxpZ24oRklMRSAqIGYsIHptYXggYWxpZ24pCit7CisJaWYob3B0c3BlZWQpCisJCWVtaXQoZiwiXHQuYWxpZ25cdDRcbiIpOworCWVsc2UgaWYgKHptMmwoYWxpZ24pID4gMSkKKwkJZW1pdChmLCAiXHQuYWxpZ25cdCVkXG4iLCBhbGlnbik7Cit9CisKK3ZvaWQgZ2VuX3Zhcl9oZWFkKEZJTEUgKiBmLCBzdHJ1Y3QgVmFyICp2KQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSB0aGUgaGVhZCBvZiBhIHZhcmlhYmxlICAqLworLyogIGRlZmluaXRpb24sIGkuZS4gdGhlIGxhYmVsIGFuZCBpbmZvcm1hdGlvbiBmb3IgICAgICAqLworLyogIGxpbmthZ2UgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworCWludCBjb25zdGZsYWc7CisJY2hhciAqc2VjOworCWlmICh2LT5jbGlzdCkKKwkJY29uc3RmbGFnID0gaXNfY29uc3Qodi0+dnR5cCk7CisJaWYgKHYtPnN0b3JhZ2VfY2xhc3MgPT0gU1RBVElDKSB7CisJCWlmIChJU0ZVTkModi0+dnR5cC0+ZmxhZ3MpKQorCQkJcmV0dXJuOworCQlpZiAoIXNwZWNpYWxfc2VjdGlvbihmLCB2KSkgeworCQkJaWYgKHYtPmNsaXN0ICYmICghY29uc3RmbGFnKSkgeyAvLyB8fCAoZ19mbGFnc1syXSAmIFVTRURGTEFHKSkKKy8vCQkJICAgICYmIHNlY3Rpb24gIT0gREFUQSkgeworCQkJCWVtaXQoZiwgIiVzLiV4XG4iLGRhdGFuYW1lLHNlY3Rpb25pZCk7CisJCQkJKytzZWN0aW9uaWQ7CisJCQkJaWYgKGYpCisJCQkJCXNlY3Rpb24gPSBEQVRBOworCQkJfQorCQkJaWYgKHYtPmNsaXN0ICYmIGNvbnN0ZmxhZykgeyAvLyAmJiAhKGdfZmxhZ3NbMl0gJiBVU0VERkxBRykKKy8vCQkJICAgICYmIHNlY3Rpb24gIT0gUk9EQVRBKSB7CisJCQkJZW1pdChmLCAiJXMuJXhcbiIscm9kYXRhbmFtZSxzZWN0aW9uaWQpOworCQkJCSsrc2VjdGlvbmlkOworCQkJCWlmIChmKQorCQkJCQlzZWN0aW9uID0gUk9EQVRBOworCQkJfQorCQkJaWYgKCF2LT5jbGlzdCkgeyAvLyAmJiBzZWN0aW9uICE9IEJTUykgeworCQkJCWVtaXQoZiwgIiVzLiV4XG4iLGJzc25hbWUsc2VjdGlvbmlkKTsKKwkJCQkrK3NlY3Rpb25pZDsKKwkJCQlpZiAoZikKKwkJCQkJc2VjdGlvbiA9IEJTUzsKKwkJCX0KKwkJfQorCQlpZiAodi0+Y2xpc3QgfHwgc2VjdGlvbiA9PSBTUEVDSUFMKSB7CisJCQlnZW5fYWxpZ24oZiwgZmFsaWduKHYtPnZ0eXApKTsKKwkJCWVtaXQoZiwgIiVzJWxkOlxuIiwgbGFicHJlZml4LCB6bTJsKHYtPm9mZnNldCkpOworCQl9IGVsc2UgeworCQkJZ2VuX2FsaWduKGYsIGZhbGlnbih2LT52dHlwKSk7CisJCQllbWl0KGYsICJcdC5sY29tbVx0JXMlbGQsIiwgbGFicHJlZml4LCB6bTJsKHYtPm9mZnNldCkpOworCQl9CisJCW5ld29iaiA9IDE7CisJfQorCWlmICh2LT5zdG9yYWdlX2NsYXNzID09IEVYVEVSTikgeworLy8JCWVtaXQoZiwgIlx0Lmdsb2JhbFx0JXMlc1xuIiwgaWRwcmVmaXgsIHYtPmlkZW50aWZpZXIpOworCQlpZiAodi0+ZmxhZ3MgJiAoREVGSU5FRCB8IFRFTlRBVElWRSkpIHsKKwkJCWlmICghc3BlY2lhbF9zZWN0aW9uKGYsIHYpKSB7CisJCQkJaWYgKHYtPmNsaXN0ICYmICghY29uc3RmbGFnKSkgeyAvLyB8fCAoZ19mbGFnc1syXSAmIFVTRURGTEFHKSkKKy8vCQkJCSAgICAmJiBzZWN0aW9uICE9IERBVEEpIHsKKwkJCQkJZW1pdChmLCAiJXMuJXhcbiIsZGF0YW5hbWUsc2VjdGlvbmlkKTsKKwkJCQkJKytzZWN0aW9uaWQ7CisJCQkJCWlmIChmKQorCQkJCQkJc2VjdGlvbiA9IERBVEE7CisJCQkJfQorCQkJCWlmICh2LT5jbGlzdCAmJiBjb25zdGZsYWcpIHsgLy8gJiYgIShnX2ZsYWdzWzJdICYgVVNFREZMQUcpCisvLwkJCQkgICAgJiYgc2VjdGlvbiAhPSBST0RBVEEpIHsKKwkJCQkJZW1pdChmLCAiJXMuJXhcbiIscm9kYXRhbmFtZSxzZWN0aW9uaWQpOworCQkJCQkrK3NlY3Rpb25pZDsKKwkJCQkJaWYgKGYpCisJCQkJCQlzZWN0aW9uID0gUk9EQVRBOworCQkJCX0KKwkJCQlpZiAoIXYtPmNsaXN0KSB7IC8vICYmIHNlY3Rpb24gIT0gQlNTKSB7CisJCQkJCWVtaXQoZiwgIiVzLiV4XG4iLGJzc25hbWUsc2VjdGlvbmlkKTsKKwkJCQkJKytzZWN0aW9uaWQ7CisJCQkJCWlmIChmKQorCQkJCQkJc2VjdGlvbiA9IEJTUzsKKwkJCQl9CisJCQl9CisJCQlpZiAodi0+Y2xpc3QgfHwgc2VjdGlvbiA9PSBTUEVDSUFMKSB7CisJCQkJZ2VuX2FsaWduKGYsIGZhbGlnbih2LT52dHlwKSk7CisJCQkJaWYgKGlzd2Vhayh2KSkKKwkJCQkJZW1pdChmLCAiXHQud2Vha1x0JXMlc1xuIiwgaWRwcmVmaXgsIHYtPmlkZW50aWZpZXIpOworCQkJCWVsc2UKKwkJCQkJZW1pdChmLCAiXHQuZ2xvYmFsXHQlcyVzXG4iLCBpZHByZWZpeCwgdi0+aWRlbnRpZmllcik7CisJCQkJZW1pdChmLCAiJXMlczpcbiIsIGlkcHJlZml4LCB2LT5pZGVudGlmaWVyKTsKKwkJCX0gZWxzZSB7CisJCQkJZ2VuX2FsaWduKGYsIGZhbGlnbih2LT52dHlwKSk7CisJCQkJaWYgKGlzd2Vhayh2KSkKKwkJCQkJZW1pdChmLCAiXHQud2Vha1x0JXMlc1xuIiwgaWRwcmVmaXgsIHYtPmlkZW50aWZpZXIpOworCQkJCWVsc2UgeworCQkJCQllbWl0KGYsICJcdC5nbG9iYWxcdCVzJXNcbiIsIGlkcHJlZml4LCB2LT5pZGVudGlmaWVyKTsKKwkJCQkJZW1pdChmLCAiXHQuY29tbVx0JXMlcywiLCBpZHByZWZpeCwgdi0+aWRlbnRpZmllcik7CisJCQkJfQorCQkJfQorCQkJbmV3b2JqID0gMTsKKwkJfQorCX0KK30KKwordm9pZCBnZW5fZGMoRklMRSAqIGYsIGludCB0LCBzdHJ1Y3QgY29uc3RfbGlzdCAqcCkKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjcmVhdGUgc3RhdGljIHN0b3JhZ2UgICAgICAgICAgKi8KKy8qICBpbml0aWFsaXplZCB3aXRoIGNvbnN0LWxpc3QgcC4gICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKwlpZiAoIXAtPnRyZWUpIHsKKwkJc3dpdGNoICh0ICYgTlEpIHsKKwkJY2FzZSBDSEFSOgorCQkJZW1pdChmLCAiXHQuYnl0ZVx0Iik7CisJCQlicmVhazsKKwkJY2FzZSBTSE9SVDoKKwkJCWVtaXQoZiwgIlx0LnNob3J0XHQiKTsKKwkJCWJyZWFrOworCQljYXNlIExPTkc6CisJCWNhc2UgSU5UOgorCQljYXNlIE1BWElOVDoKKwkJY2FzZSBQT0lOVEVSOgorCQkJZW1pdChmLCAiXHQuaW50XHQiKTsKKwkJCWJyZWFrOworCQljYXNlIExMT05HOgorCQkJZW1pdChmLCAiLy9GSVhNRSAtIHVuc3VwcG9ydGVkIHR5cGVcbiIpOworCQkJZW1pdChmLCAiXHQubG9uZ1x0Iik7CisvLwkJCWllcnJvcigwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCJnZW5fZGM6IHVuc3VwcG9ydGVkIHR5cGUgMHgleFxuIiwgdCk7CisJCQlpZXJyb3IoMCk7CisJCX0KKwkJZW1pdHZhbChmLCAmcC0+dmFsLCB0ICYgTlUpOworCQllbWl0KGYsICJcbiIpOworCisjaWYgMAorCQlpZiAoSVNGTE9BVCh0KSkgeworCQkJLyogIGF1Y2ggd2llZGVyIG5pY2h0IHNlaHIgc2Nob2VuIHVuZCBJRUVFIG5vZXRpZyAgICovCisJCQl1bnNpZ25lZCBjaGFyICppcDsKKwkJCWlwID0gKHVuc2lnbmVkIGNoYXIgKikmcC0+dmFsLnZkb3VibGU7CisJCQllbWl0KGYsICIweCUwMnglMDJ4JTAyeCUwMngiLCBpcFswXSwgaXBbMV0sIGlwWzJdLCBpcFszXSk7CisJCQlpZiAoKHQgJiBOUSkgIT0gRkxPQVQpIHsKKwkJCQllbWl0KGYsICIsMHglMDJ4JTAyeCUwMnglMDJ4IiwgaXBbNF0sIGlwWzVdLCBpcFs2XSwgaXBbN10pOworCQkJfQorCQl9IGVsc2UgeworCQkJZW1pdHZhbChmLCAmcC0+dmFsLCB0ICYgTlUpOworCQl9CisjZW5kaWYKKwl9IGVsc2UgeworCQlzdHJ1Y3Qgb2JqICpvID0gJnAtPnRyZWUtPm87CisJCWVtaXQoZiwgIlx0XHRcdFx0XHRcdC8vIERlY2xhcmluZyBmcm9tIHRyZWVcbiIpOworCQlpZiAoaXNleHRlcm4oby0+di0+c3RvcmFnZV9jbGFzcykpIHsKKwkJCWVtaXQoZiwgIlx0XHRcdFx0XHRcdC8vIGV4dGVybiAob2Zmc2V0ICVkKVxuIiwgby0+dmFsLnZtYXgpOworCQkJaWYgKG8tPnZhbC52bWF4KQorCQkJCWVtaXQoZiwgIlx0LnJlZlx0XyVzLCAlZFxuIiwgby0+di0+aWRlbnRpZmllciwgby0+dmFsLnZtYXgpOworCQkJZWxzZQorCQkJCWVtaXQoZiwgIlx0LnJlZlx0XyVzXG4iLCBvLT52LT5pZGVudGlmaWVyKTsKKwkJfSBlbHNlIGlmIChpc3N0YXRpYyhvLT52LT5zdG9yYWdlX2NsYXNzKSkgeworCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gc3RhdGljXG4iKTsKKwkJCWlmKG8tPnZhbC52bG9uZykKKwkJCQllbWl0KGYsICJcdC5yZWZcdCVzJWQsJWRcbiIsIGxhYnByZWZpeCwgem0ybChvLT52LT5vZmZzZXQpLG8tPnZhbC52bG9uZyk7CisJCQllbHNlCisJCQkJZW1pdChmLCAiXHQucmVmXHQlcyVkXG4iLCBsYWJwcmVmaXgsIHptMmwoby0+di0+b2Zmc2V0KSk7CisJCX0gZWxzZSB7CisJCQlwcmludGYoImVycm9yOiBHZW5EQyAodHJlZSkgLSB1bmtub3duIHN0b3JhZ2UgY2xhc3MgMHgleCFcbiIsIG8tPnYtPnN0b3JhZ2VfY2xhc3MpOworCQl9CisJfQorCW5ld29iaiA9IDA7Cit9CisKKworLyogUmV0dXJuIDEgaWYgYW55IG9mIHAncyBvcGVyYW5kcyB1c2VzIHByZWRlYyBvciBwb3N0aW5jIGFkZHJlc3NpbmcgbW9kZSAqLworaW50IGNoZWNrX2FtKHN0cnVjdCBJQyAqcCkKK3sKKwlpZihwLT5xMS5hbSAmJiAocC0+cTEuYW0tPnR5cGU9PUFNX1BPU1RJTkMgfHwgcC0+cTEuYW0tPnR5cGU9PUFNX1BSRURFQykpCisJCXJldHVybigxKTsKKwlpZihwLT5xMi5hbSAmJiAocC0+cTIuYW0tPnR5cGU9PUFNX1BPU1RJTkMgfHwgcC0+cTIuYW0tPnR5cGU9PUFNX1BSRURFQykpCisJCXJldHVybigxKTsKKwlpZihwLT56LmFtICYmIChwLT56LmFtLT50eXBlPT1BTV9QT1NUSU5DIHx8IHAtPnouYW0tPnR5cGU9PUFNX1BSRURFQykpCisJCXJldHVybigxKTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qICBUaGUgbWFpbiBjb2RlLWdlbmVyYXRpb24gcm91dGluZS4gICAgICAgICAgICAgICAgICAgKi8KKy8qICBmIGlzIHRoZSBzdHJlYW0gdGhlIGNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8uICAgICAgKi8KKy8qICBwIGlzIGEgcG9pbnRlciB0byBhIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBJQ3MgICAgICAgKi8KKy8qICBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBib2R5IHRvIGdlbmVyYXRlIGNvZGUgZm9yLiAgKi8KKy8qICB2IGlzIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBvZmZzZXQgaXMgdGhlIHNpemUgb2YgdGhlIHN0YWNrZnJhbWUgdGhlIGZ1bmN0aW9uICAgKi8KKy8qICBuZWVkcyBmb3IgbG9jYWwgdmFyaWFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwordm9pZCBnZW5fY29kZShGSUxFICogZiwgc3RydWN0IElDICpwLCBzdHJ1Y3QgVmFyICp2LCB6bWF4IG9mZnNldCkKKy8qICBUaGUgbWFpbiBjb2RlLWdlbmVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisJc3RhdGljIGludCBpZGVtcCA9IDA7CisJc3RhdGljIGludCBmaXJzdHRhaWw9MTsKKwlpbnQgcmV2ZXJzZWNtcD0wOworCWludCBjLCB0LCBpOworCXN0cnVjdCBJQyAqbTsKKwlhcmdzaXplID0gMDsKKwkvLyBpZihERUJVRyYxKSAKKworCWlmKCFwKQorCQlwcmludGYoIihnZW5fY29kZSBjYWxsZWQgd2l0aCBudWxsIElDIGxpc3Q/KVxuIik7CisKKwlmb3IgKGMgPSAxOyBjIDw9IE1BWFI7IGMrKykKKwkJcmVnc1tjXSA9IHJlZ3NhW2NdOworCXB1c2hlZCA9IDA7CisJbm90eWV0cG9wcGVkID0gMDsKKworI2lmIDAKKwlpZiAoIWlkZW1wKSB7CisJCXNlY3Rpb25pZCA9IDA7CisJCWlmIChwICYmIHAtPmZpbGUpIHsKKwkJCWludCB2OworCQkJY2hhciAqYyA9IHAtPmZpbGU7CisJCQlpZGVtcCA9IDE7CisJCQl3aGlsZSAodiA9ICpjKyspIHsKKwkJCQlzZWN0aW9uaWQgPDw9IDM7CisJCQkJc2VjdGlvbmlkIF49IHY7CisJCQl9CisJCQlwcmludGYoIkNyZWF0ZWQgc2VjdGlvbiBJRCAleFxuIixzZWN0aW9uaWQpOworCQl9CisJCWVsc2UKKwkJCXByaW50ZigiTm8gc2VjdGlvbmlkIGNyZWF0ZWQgKCV4LCAleClcbiIscCxwID8gcC0+ZmlsZSA6IDApOworCX0KKyNlbmRpZgorCisJZm9yIChtID0gcDsgbTsgbSA9IG0tPm5leHQpIHsKKwkJYyA9IG0tPmNvZGU7CisJCXQgPSBtLT50eXBmICYgTlU7CisJCWlmIChjID09IEFMTE9DUkVHKSB7CisJCQlyZWdzW20tPnExLnJlZ10gPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGMgPT0gRlJFRVJFRykgeworCQkJcmVnc1ttLT5xMS5yZWddID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogY29udmVydCBNVUxUL0RJVi9NT0Qgd2l0aCBwb3dlcnMgb2YgdHdvICovCisJCS8vIFBlcnZlcnNlbHksIG11bCBpcyBmYXN0ZXIgdGhhbiBzaGlmdGluZyBvbiA4MzIsIHNvIHdlIG9ubHkgd2FudCB0byBkbyB0aGlzIGZvciBkaXYuCisJCS8vIEZJWE1FIC0gd2UgY2FuIGRvIHRoaXMgZm9yIHNpZ25lZCB2YWx1ZXMgdG9vLgorCQlpZiAoKHQgJiBOUSkgPD0gTE9ORyAmJiAobS0+cTIuZmxhZ3MgJiAoS09OU1QgfCBEUkVGT0JKKSkgPT0gS09OU1QgJiYgKHQgJiBOUSkgPD0gTE9ORworCQkgICAgJiYgKCgoYyA9PSBESVYgfHwgYyA9PSBNT0QpICYmICh0ICYgVU5TSUdORUQpKSkpIHsKKwkJCWV2YWxfY29uc3QoJm0tPnEyLnZhbCwgdCk7CisJCQlpID0gcG9mMih2bWF4KTsKKwkJCWlmIChpKSB7CisJCQkJaWYgKGMgPT0gTU9EKSB7CisJCQkJCXZtYXggPSB6bXN1Yih2bWF4LCBsMnptKDFMKSk7CisJCQkJCW0tPmNvZGUgPSBBTkQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJdm1heCA9IGwyem0oaSAtIDEpOworCQkJCQlpZiAoYyA9PSBESVYpCisJCQkJCQltLT5jb2RlID0gUlNISUZUOworCQkJCQllbHNlCisJCQkJCQltLT5jb2RlID0gTFNISUZUOworCQkJCX0KKwkJCQljID0gbS0+Y29kZTsKKwkJCQlndmFsLnZtYXggPSB2bWF4OworCQkJCWV2YWxfY29uc3QoJmd2YWwsIE1BWElOVCk7CisJCQkJaWYgKGMgPT0gQU5EKSB7CS8vIEZJWE1FIC0gd2h5PworCQkJCQlpbnNlcnRfY29uc3QoJm0tPnEyLnZhbCwgdCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaW5zZXJ0X2NvbnN0KCZtLT5xMi52YWwsIElOVCk7CisJCQkJCXAtPnR5cGYyID0gSU5UOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWZvciAoYyA9IDE7IGMgPD0gTUFYUjsgYysrKSB7CisJCWlmIChyZWdzYVtjXSB8fCByZWd1c2VkW2NdKSB7CisJCQlCU0VUKHJlZ3NfbW9kaWZpZWQsIGMpOworCQl9CisJfQorCWxvY2Fsc2l6ZSA9ICh6bTJsKG9mZnNldCkgKyAzKSAvIDQgKiA0OworCisvLyAgICBwcmludGYoIlxuU2Vla2luZyBhZGRyZXNzaW5nIG1vZGVzIGZvciBmdW5jdGlvbiAlc1xuIix2LT5pZGVudGlmaWVyKTsKKwlmaW5kX2FkZHJlc3Npbmdtb2RlcyhwKTsKKworCWZ1bmN0aW9uX3RvcChmLCB2LCBsb2NhbHNpemUpOworLy8gICAgcHJpbnRmKCIlczpcbiIsdi0+aWRlbnRpZmllcik7CisKKwlmb3IgKDsgcDsgcCA9IHAtPm5leHQpIHsKKy8vCQlwcmludGljKHN0ZG91dCxwKTsKKwkJYyA9IHAtPmNvZGU7CisJCXQgPSBxMXR5cChwKTsKKworCQlpZiAoYyA9PSBOT1ApIHsKKwkJCXAtPnouZmxhZ3MgPSAwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGMgPT0gQUxMT0NSRUcpIHsKKwkJCWlmKERCR01TRykKKwkJCQllbWl0KGYsICJcdFx0XHRcdFx0XHQvLyBhbGxvY3JlZyAlc1xuIiwgcmVnbmFtZXNbcC0+cTEucmVnXSk7CisJCQlyZWdzW3AtPnExLnJlZ10gPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGMgPT0gRlJFRVJFRykgeworCQkJaWYoREJHTVNHKQorCQkJCWVtaXQoZiwgIlx0XHRcdFx0XHRcdC8vIGZyZWVyZWcgJXNcbiIsIHJlZ25hbWVzW3AtPnExLnJlZ10pOworCQkJcmVnc1twLT5xMS5yZWddID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID09IExBQkVMKSB7CisJCQlpbnQgaTsKKwkJCWVtaXQoZiwgIiVzJWQ6ICMgXG4iLCBsYWJwcmVmaXgsIHQpOworCQkJY2xlYXJ0ZW1wb2JqKGYsdG1wKTsJLy8gQ2FuJ3QgY2FycnkgdGVtcG9yYXJ5IGNvbnRleHQgcGFzdCBhIGxhYmVsCisJCQljbGVhcnRlbXBvYmooZix0MSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChEQkdNU0cgJiYgcC0+ZmlsZSkKKwkJCWVtaXQoZiwgIlxuXHRcdFx0XHRcdFx0Ly8lcywgbGluZSAlZFxuIiwgcC0+ZmlsZSwgcC0+bGluZSk7CisJCWlmKHAtPnExLmFtICYmIHAtPnExLmFtLT5kaXNwb3NhYmxlKQorCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gUTEgZGlzcG9zYWJsZVxuIik7CisJCWlmKHAtPnEyLmFtICYmIHAtPnEyLmFtLT5kaXNwb3NhYmxlKQorCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gUTIgZGlzcG9zYWJsZVxuIik7CisJCWlmKHAtPnouYW0gJiYgcC0+ei5hbS0+ZGlzcG9zYWJsZSkKKwkJCWVtaXQoZiwgIlx0XHRcdFx0XHRcdC8vIFogZGlzcG9zYWJsZVxuIik7CisKKwkJLy8gT0sKKwkJaWYgKGMgPT0gQlJBKSB7CisJCQlpZigwKSAvLyBGSVhNRSAtIGNvdWxkIGR1cGxpY2F0ZSBmdW5jdGlvbiB0YWlsIGhlcmUuICBQZXJoYXBzIGRvIGl0IGRlcGVuZGluZyBvbiBudW1iZXIgb2Ygc2F2ZWQgcmVnaXN0ZXJzPworCQkJCWZ1bmN0aW9uX2JvdHRvbShmLCB2LCBsb2NhbHNpemUsIDApOworCQkJZWxzZQorCQkJCWVtaXRfcGNyZWx0b3RlbXAoZiwgbGFicHJlZml4LCB0KTsKKwkJCWVtaXQoZiwgIlx0YWRkXHQlc1xuIiwgcmVnbmFtZXNbcGNdKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8vIE9LCisJCWlmIChjID49IEJFUSAmJiBjIDwgQlJBKSB7CisJCQlpZihyZXZlcnNlY21wKQorCQkJeworCQkJCXN3aXRjaChjKQorCQkJCXsKKwkJCQkJY2FzZSBCTFQ6CisJCQkJCQljPUJHVDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIEJMRToKKwkJCQkJCWM9QkdFOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgQkdUOgorCQkJCQkJYz1CTFQ7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBCR0U6CisJCQkJCQljPUJMRTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWVtaXQoZiwgIlx0Y29uZFx0JXNcbiIsY2NzW2MgLSBCRVFdKTsKKwkJCWlmKERCR01TRykKKwkJCQllbWl0KGYsICJcdFx0XHRcdFx0XHQvL2NvbmRpdGlvbmFsIGJyYW5jaCAlc1xuIixyZXZlcnNlY21wID8gInJldmVyc2VkIiA6ICJyZWd1bGFyIik7CisJCQlyZXZlcnNlY21wPTA7CisJCQllbWl0X3BjcmVsdG90ZW1wKGYsIGxhYnByZWZpeCwgdCk7CS8vIEZJWE1FIC0gZG91YmxlLWNoZWNrIHRoYXQgd2Ugc2hvdWxkbid0IGluY2x1ZGUgYW4gb2Zmc2V0IGhlcmUuCisJCQllbWl0KGYsICJcdFx0YWRkXHRyN1xuIik7CisJCQljb250aW51ZTsKKwkJfQorCQkvLyBJbnZlc3RpZ2F0ZSAtIGJ1dCBub3QgY3VycmVudGx5IHNlZWluZyBpdCB1c2VkLgorCQlpZiAoYyA9PSBNT1ZFVE9SRUcpIHsKKwkJCWVtaXQoZiwgIlx0XHRcdFx0XHRcdC8vQ0hFQ0tNRSBtb3ZldG9yZWdcbiIpOworCQkJZW1pdF9vYmp0b3JlZyhmLCAmcC0+cTEsIHp0eXAocCksenJlZyk7CisJCQljb250aW51ZTsKKwkJfQorCQkvLyBJbnZlc3RpZ2F0ZSAtIGJ1dCBub3QgY3VycmVudGx5IHNlZWluZyBpdCB1c2VkLgorCQlpZiAoYyA9PSBNT1ZFRlJPTVJFRykgeworCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly9DSEVDS01FIG1vdmVmcm9tcmVnXG4iKTsKKwkJCXN0b3JlX3JlZyhmLCBwLT5xMS5yZWcsICZwLT56LCByZWd0eXBlW3AtPnExLnJlZ10tPmZsYWdzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8vIFJlamVjdCB0eXBlcyB3ZSBjYW4ndCBoYW5kbGUgLSBhbnl0aGluZyBiZXlvbmQgYSBwb2ludGVyIGFuZCBjaGFycyB3aXRoIG1vcmUgdGhhbiAxIGJ5dGUuCisvLwkJaWYgKChjID09IFBVU0gpCisvLwkJICAgICYmICgodCAmIE5RKSA+IFBPSU5URVIgfHwgKCh0ICYgTlEpID09IENIQVIgJiYgem0ybChwLT5xMi52YWwudm1heCkgIT0gMSkpKSB7CisvLwkJCXByaW50ZigiUHVzaGluZyBhIHR5cGUgd2UgZG9uJ3QgeWV0IGhhbmRsZTogMHgleFxuIiwgdCk7CisvLwkJCWllcnJvcigwKTsKKy8vCQl9CisKKwkJaWYgKChjID09IEFTU0lHTikgJiYgKCh0ICYgTlEpID4gVU5JT04pKSB7CisJCQlwcmludGYoIkFzc2lnbm1lbnQgb2YgYSB0eXBlIHdlIGRvbid0IHlldCBoYW5kbGU6IDB4JXhcbiIsIHQpOworCQkJaWVycm9yKDApOworCQl9CisKKwkJLy8gQXZvaWQgc3RhY2sgdG9wIHNsb3QgdHJpY2tlcnkgaWYgdGhlIG9wZXJhdGlvbiBpbnZvbHZlcyBwdXNoaW5nIG9wZXJhbmRzIHRvIHRoZSBzdGFjaworCSAgICBpZihjPT1ESVYgfHwgYz09TU9EIHx8CisJCQkoKGM9PUFTU0lHTiB8fCBjPT1QVVNIKSAmJiAoKHQgJiBOUSkgPiBQT0lOVEVSIHx8ICgodCAmIE5RKSA9PSBDSEFSICYmIHptMmwocC0+cTIudmFsLnZtYXgpICE9IDEpKSkpCisJCQlwID0gcHJlbG9hZChmLCBwLCAwKTsJLy8gU2V0dXAgenJlZywgZXRjLgorCQllbHNlCisJCQlwID0gcHJlbG9hZChmLCBwLCAxKTsJLy8gU2V0dXAgenJlZywgZXRjLgorCisJCWMgPSBwLT5jb2RlOworCisJCWlmIChjID09IFNVQlBGUCkKKwkJCWMgPSBTVUI7CisJCWlmIChjID09IEFEREkyUCkKKwkJCWMgPSBBREQ7CisJCWlmIChjID09IFNVQklGUCkKKwkJCWMgPSBTVUI7CisKKy8vCQllbWl0KGYsICIvLyBjb2RlIDB4JXgsIHExLT52OiAleFxuIiwgYywmcC0+cTEudik7CisvLwkJaWYocC0+cHJldiAmJiBtYXRjaG9iaihmLCZwLT5xMSwmcC0+cHJldi0+cTEpKQorLy8JCQllbWl0KGYsICIvLyBNYXRjaGluZyBvYmpzIGZvdW5kXG4iLCBwLT5wcmV2LT5jb2RlLCZwLT5wcmV2LT5xMS52KTsKKworCQlpZiAoYyA9PSBDT05WRVJUKSB7CisJCQlpZihEQkdNU0cpCisJCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly9GSVhNRSBjb252ZXJ0XG4iKTsKKwkJCWlmIChJU0ZMT0FUKHExdHlwKHApKSB8fCBJU0ZMT0FUKHp0eXAocCkpKSB7CisJCQkJcHJpbnRmKCJGbG9hdCBub3QgeWV0IHN1cHBvcnRlZFxuIik7CisJCQkJaWVycm9yKDApOworCQkJfQorCQkJaWYgKHNpemV0YWJbcTF0eXAocCkgJiBOUV0gPCBzaXpldGFiW3p0eXAocCkgJiBOUV0pIHsKKwkJCQlpbnQgc2hhbXQgPSAwOworCQkJCWlmKERCR01TRykKKwkJCQkJZW1pdChmLCJcdFx0XHRcdFx0XHQvL0NvbnZlcnRpbmcgdG8gd2lkZXIgdHlwZS4uLlxuIik7CisJCQkJc3dpdGNoIChxMXR5cChwKSAmIE5VKSB7CisJCQkJCWNhc2UgQ0hBUiB8IFVOU0lHTkVEOgorCQkJCQljYXNlIFNIT1JUIHwgVU5TSUdORUQ6CisJCQkJCQlpZihEQkdNU0cpCisJCQkJCQkJZW1pdChmLCJcdFx0XHRcdFx0XHQvL0J1dCB1bnNpZ25lZCwgc28gbm8gbmVlZCB0byBleHRlbmRcbiIpOworCisJCQkJCQlpZihpbnZvbHZlc3JlZyh6KSkgeworCQkJCQkJCWVtaXRfcHJlcG9iaihmLCAmcC0+eiwgenR5cChwKSwgenJlZywgMCk7CisJCQkJCQkJZW1pdF9vYmp0b3JlZyhmLCAmcC0+cTEsIHExdHlwKHApLCB0bXApOworCQkJCQkJCXNhdmVfdGVtcChmLCBwLCB6cmVnKTsKKwkJCQkJCQkvLyBXQVJOSU5HIC0gbWlnaHQgbmVlZCB0byBpbnZhbGlkYXRlIHRlbXAgb2JqZWN0cyBoZXJlLi4uCisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWVtaXRfb2JqdG9yZWcoZiwgJnAtPnExLCBxMXR5cChwKSwgenJlZyk7CisJCQkJCQkJc2F2ZV9yZXN1bHQoZiwgcCk7CisJCQkJCQkJLy8gV0FSTklORyAtIG1pZ2h0IG5lZWQgdG8gaW52YWxpZGF0ZSB0ZW1wIG9iamVjdHMgaGVyZS4uLgorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgQ0hBUjoKKwkJCQkJCWVtaXRfb2JqdG9yZWcoZiwgJnAtPnExLCBxMXR5cChwKSwgenJlZyk7CisJCQkJCQllbWl0X2NvbnN0YW50dG90ZW1wKGYsMHhmZmZmZmY4MCk7CisJCQkJCQllbWl0KGYsIlx0YWRkXHQlc1xuIixyZWduYW1lc1t6cmVnXSk7CisJCQkJCQllbWl0KGYsIlx0eG9yXHQlc1xuIixyZWduYW1lc1t6cmVnXSk7CisJCQkJCQljbGVhcnRlbXBvYmooZix6cmVnKTsKKwkJCQkJCXNhdmVfcmVzdWx0KGYsIHApOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgU0hPUlQ6CisJCQkJCQllbWl0X29ianRvcmVnKGYsICZwLT5xMSwgcTF0eXAocCksIHpyZWcpOworCQkJCQkJZW1pdF9jb25zdGFudHRvdGVtcChmLDB4ZmZmZjgwMDApOworCQkJCQkJZW1pdChmLCJcdGFkZFx0JXNcbiIscmVnbmFtZXNbenJlZ10pOworCQkJCQkJZW1pdChmLCJcdHhvclx0JXNcbiIscmVnbmFtZXNbenJlZ10pOworCQkJCQkJY2xlYXJ0ZW1wb2JqKGYsenJlZyk7CisJCQkJCQlzYXZlX3Jlc3VsdChmLCBwKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKy8vCQkJCXNldHRlbXBvYmooZix6cmVnLCZwLT56LDAsMCk7CisJCQl9IGVsc2UgaWYoc2l6ZXRhYltxMXR5cChwKSAmIE5RXSA+PSBzaXpldGFiW3p0eXAocCkgJiBOUV0pIHsJLy8gUmVkdWNpbmcgdGhlIHNpemUsIG11c3QgbWFzayBvZmYgZXhjZXNzIGJpdHMuLi4KKwkJCQlpZihEQkdNU0cpCisJCQkJCWVtaXQoZiwiXHRcdFx0XHRcdFx0Ly8gKGNvbnZlcnQgLSByZWR1Y2luZyB0eXBlICV4IHRvICV4XG4iLHExdHlwKHApLHp0eXAocCkpOworCisJCQkJLy8gSWYgWiBpcyBub3QgYSByZWdpc3RlciB0aGVuIHdlJ3JlIHN0b3JpbmcgYSBoYWxmd29yZCBvciBieXRlLCBhbmQgdGh1cyBkb24ndCBuZWVkIHRvIG1hc2suLi4KKworCQkJCWlmKCgocC0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRykgJiYgKHAtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSkhPVJFRykgeworCQkJCQlpZihwLT56LmZsYWdzJkRSRUZPQkopIHsJLy8gQ2FuJ3QgdXNlIHN0bXBkZWMgZm9yIGRlcmVmZXJlbmNlZCBvYmplY3RzCisJCQkJCQllbWl0X3ByZXBvYmooZiwgJnAtPnosIHQsIHpyZWcsIDApOyAvLyBOZWVkIGFuIG9mZnNldAorCQkJCQkJZW1pdF9vYmp0b3JlZyhmLCAmcC0+cTEsIHExdHlwKHApLCB0bXApOworCQkJCQkJc2F2ZV90ZW1wKGYscCx6cmVnKTsKKyNpZiAwCisJCQkJCQllbWl0X3ByZXBvYmooZiwgJnAtPnosIHQsIHRtcCwgMCk7IC8vIE5lZWQgYW4gb2Zmc2V0CisJCQkJCQllbWl0KGYsICJcdGV4Z1x0JXNcbiIsIHJlZ25hbWVzW3ExcmVnXSk7CisvLwkJCQkJCWlmKCFpc3N0YWNrcGFyYW0oJnAtPnopIHx8IChwLT56LmZsYWdzJkRSRUZPQkopKQorCQkJCQkJCWVtaXRfc2l6ZW1vZChmLHp0eXAocCkpOworCQkJCQkJZW1pdChmLCAiXHRzdFx0JXNcbiIsIHJlZ25hbWVzW3ExcmVnXSk7CisJCQkJCQlpZihwLT56LmFtICYmIHAtPnouYW0tPmRpc3Bvc2FibGUgJiYgcC0+cTEuYW0gJiYgcC0+cTEuYW0tPmRpc3Bvc2FibGUpCisJCQkJCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gQm90aCBxMSBhbmQgeiBhcmUgZGlzcG9zYWJsZSwgbm90IGJvdGhlcmluZyB0byB1bmRvIGV4Z1xuIik7CisJCQkJCQllbHNlCisJCQkJCQkJZW1pdChmLCAiXHRleGdcdCVzXG4iLCByZWduYW1lc1txMXJlZ10pOworI2VuZGlmCisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQkvLyBVc2Ugc3RtcGRlYyBpZiBxMSBpcyBhbHJlYWR5IGluIGEgcmVnaXN0ZXIuLi4KKwkJCQkJCWVtaXRfcHJlcG9iaihmLCAmcC0+eiwgenR5cChwKSwgdG1wLCA0KTsgLy8gTmVlZCBhbiBvZmZzZXQKKwkJCQkJCWlmKCFpc3N0YWNrcGFyYW0oJnAtPnopKQorCQkJCQkJCWVtaXRfc2l6ZW1vZChmLHp0eXAocCkpOworCQkJCQkJZW1pdChmLCJcdHN0bXBkZWNcdCVzXG4iLHJlZ25hbWVzW3ExcmVnXSk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7IC8vIERlc3RpbmF0aW9uIGlzIGEgcmVnaXN0ZXIgLSB3ZSBtdXN0IG1hc2suLi4KKwkJCQkJLy8gUG90ZW50aWFsIG9wdGltaXNhdGlvbiBoZXJlIC0gdHJhY2sgd2hpY2ggb3BzIGNvdWxkIGhhdmUgY2F1c2VkIGEgdmFsdWUgdG8gcmVxdWlyZSB0cnVuY2F0aW9uLgorCQkJCQkvLyBBbHNvIGZpZ3VyZSBvdXQgd2hhdCdzIGhhcHBlbmluZyBuZXh0IHRvIHRoZSB2YWx1ZS4gIElmIGl0J3Mgb25seSBiZWluZyBhZGRlZCwgYW5kZWQsIG9yZWQsIHhvcmVkCisJCQkJCS8vIGFuZCB0aGVuIHRydW5jYXRlZCBieSBhIHdyaXRlIHRvIG1lbW9yeSB3ZSBkb24ndCBuZWVkIHRvIHdvcnJ5LgorCQkJCQlpZighaXNyZWcocTEpIHx8ICFpc3JlZyh6KSB8fCBxMXJlZyE9enJlZykgLy8gRG8gd2UganVzdCBuZWVkIHRvIG1hc2sgaW4gcGxhY2UsIG9yIG1vdmUgdGhlIHZhbHVlIGZpcnN0PworCQkJCQl7CisJCQkJCQlpZighaXNyZWcoeikpCisJCQkJCQkJenJlZz10MTsKKwkJCQkJCWVtaXRfcHJlcG9iaihmLCAmcC0+eiwgenR5cChwKSwgdDEsIDApOworCisJCQkJCQllbWl0X29ianRvcmVnKGYsICZwLT5xMSwgdCx0bXApOworCQkJCQkJZW1pdChmLCJcdFx0XHRcdFx0XHQvL1NhdmluZyB0byByZWcgJXNcbiIscmVnbmFtZXNbenJlZ10pOworCQkJCQkJc2F2ZV90ZW1wKGYsIHAsIHpyZWcpOworCQkJCQl9CisvLwkJCQkJZWxzZQorCQkJCQlpZih6cmVnIT1zcCAmJiAocC0+ei5mbGFncyYoRFJFRk9CSnxSRUcpKT09UkVHKQorCQkJCQl7CisJCQkJCQlzd2l0Y2goenR5cChwKSZOUSkgeworCQkJCQkJCWNhc2UgU0hPUlQ6CisJCQkJCQkJCWVtaXRfY29uc3RhbnR0b3RlbXAoZiwgMHhmZmZmKTsKKwkJCQkJCQkJZW1pdChmLCAiXHRhbmRcdCVzXG4iLCByZWduYW1lc1t6cmVnXSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgQ0hBUjoKKwkJCQkJCQkJZW1pdF9jb25zdGFudHRvdGVtcChmLCAweGZmKTsKKwkJCQkJCQkJZW1pdChmLCAiXHRhbmRcdCVzXG4iLCByZWduYW1lc1t6cmVnXSk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCWVtaXQoZiwiXHRcdFx0XHRcdFx0Ly9ObyBuZWVkIHRvIG1hc2sgLSBzYW1lIHNpemVcbiIpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGMgPT0gS09NUExFTUVOVCkgeworCQkJaWYoREJHTVNHKQorCQkJCWVtaXQoZiwgIlx0XHRcdFx0XHRcdC8vY29tcFxuIik7CisJCQllbWl0X29ianRvcmVnKGYsICZwLT5xMSwgcTF0eXAocCksIHpyZWcpOworCQkJZW1pdF9jb25zdGFudHRvdGVtcChmLC0xKTsKKwkJCWVtaXQoZiwgIlx0eG9yXHQlc1xuIiwgcmVnbmFtZXNbenJlZ10pOworLy8JCQljbGVhcnRlbXBvYmooZix6cmVnKTsKKwkJCXNhdmVfcmVzdWx0KGYsIHApOworCQkJY29udGludWU7CisJCX0KKwkJLy8gTWF5IG5vdCBuZWVkIHRvIGFjdHVhbGx5IGxvYWQgdGhlIHJlZ2lzdGVyIGhlcmUgLSBjZXJ0YWlubHkgY2hlY2sgYmVmb3JlIGVtaXR0aW5nIGNvZGUuCisJCWlmIChjID09IFNFVFJFVFVSTikgeworCQkJaWYoREJHTVNHKQorCQkJCWVtaXQoZiwgIlx0XHRcdFx0XHRcdC8vc2V0cmV0dXJuXG4iKTsKKwkJCWVtaXRfb2JqdG9yZWcoZiwgJnAtPnExLCBxMXR5cChwKSwgenJlZyk7CisJCQlCU0VUKHJlZ3NfbW9kaWZpZWQsIHAtPnoucmVnKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8vIEludmVzdGlnYXRlIC0gTWF5IG5vdCBiZSBuZWVkZWQgZm9yIHJlZ2lzdGVyIG1vZGU/CisJCWlmIChjID09IEdFVFJFVFVSTikgeworCQkJaWYoREJHTVNHKQorCQkJCWVtaXQoZiwgIlx0XHRcdFx0XHRcdC8vIChnZXRyZXR1cm4pIik7CisJCQlpZiAocC0+cTEucmVnKSB7CisJCQkJenJlZyA9IHAtPnExLnJlZzsKKwkJCQlzYXZlX3Jlc3VsdChmLCBwKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYoREJHTVNHKQorCQkJCQllbWl0KGYsICIgbm90IHJlZ1xuIik7CisJCQkJcC0+ei5mbGFncyA9IDA7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQkvLyBPSyAtIGZpZ3VyZSBvdXQgd2hhdCB0aGUgYnZ1bml0ZSBzdHVmZiBpcyBhbGwgYWJvdXQuCisJCWlmIChjID09IENBTEwpIHsKKwkJCWludCByZWc7CisJCQlpZihEQkdNU0cpCisJCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly9jYWxsXG4iKTsKKwkJCWlmICgocC0+cTEuZmxhZ3MgJiAoVkFSIHwgRFJFRk9CSikpID09IFZBUiAmJiBwLT5xMS52LT5maSAmJiBwLT5xMS52LT5maS0+aW5saW5lX2FzbSkgeworCQkJCWVtaXRfaW5saW5lX2FzbShmLCBwLT5xMS52LT5maS0+aW5saW5lX2FzbSk7CisJCQkJY2xlYXJ0ZW1wb2JqKGYsdDEpOworCQkJCWNsZWFydGVtcG9iaihmLHRtcCk7CisJCQkJLyogRklYTUUgLSByZXN0b3JlIHN0YWNrIGZyb20gcHVzaGVkIGFyZ3VtZW50cz8gKi8KKwkJCX0gZWxzZSB7CisJCQkJLyogRklYTUUgLSBkZWFsIHdpdGggZGlmZmVyZW50IG9iamVjdCB0eXBlcyBoZXJlICovCisJCQkJaWYgKHAtPnExLnYtPnN0b3JhZ2VfY2xhc3MgPT0gU1RBVElDKSB7CisJCQkJCS8vIEZJWE1FIC0gZG91YmxlLWNoZWNrIHRoYXQgd2Ugc2hvdWxkbid0IGluY2x1ZGUgYW4gb2Zmc2V0IGhlcmUuCisJCQkJCWVtaXRfcGNyZWx0b3RlbXAyKGYsICZwLT5xMSk7CisJCQkJCWlmIChwLT5xMS5mbGFncyAmIERSRUZPQkopIHsKKwkJCQkJCWVtaXQoZiwgIlx0YWRkdFx0JXNcdC8vRGVyZWYgZnVuY3Rpb24gcG9pbnRlclxuIiwgcmVnbmFtZXNbcGNdKTsKKwkJCQkJCWVtaXQoZiwgIlx0bGR0XG5cdGV4Z1x0JXNcbiIsIHJlZ25hbWVzW3BjXSk7CisJCQkJCX0gZWxzZQorCQkJCQkJZW1pdChmLCAiXHRhZGRcdCVzXG4iLCByZWduYW1lc1twY10pOworCQkJCX0gZWxzZSBpZiAocC0+cTEudi0+c3RvcmFnZV9jbGFzcyA9PSBFWFRFUk4pIHsKKwkJCQkJaWYgKHAtPnExLmZsYWdzICYgRFJFRk9CSikgewkvLyBJcyB0aGlzIGEgZnVuY3Rpb24gcG9pbnRlcj8KKwkJCQkJCWVtaXRfZXh0ZXJudG90ZW1wKGYsIHAtPnExLnYtPmlkZW50aWZpZXIsIHAtPnExLnZhbC52bWF4KTsKKwkJCQkJCWVtaXQoZiwgIlx0bGR0XHQvLyBkZXJlZiBmdW5jdGlvbiBwdHJcbiIpOworCQkJCQkJZW1pdChmLCAiXHRleGdcdCVzXG4iLCByZWduYW1lc1twY10pOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJZW1pdF9wY3JlbHRvdGVtcDIoZiwgJnAtPnExKTsKKwkJCQkJCWVtaXQoZiwgIlx0YWRkXHQlc1xuIiwgcmVnbmFtZXNbcGNdKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWVtaXRfb2JqdG9yZWcoZiwgJnAtPnExLCB0LCB0bXApOworCQkJCQllbWl0KGYsICJcdGV4Z1x0JXNcbiIsIHJlZ25hbWVzW3BjXSk7CisJCQkJfQorCisJCQkJY2xlYXJ0ZW1wb2JqKGYsdG1wKTsKKworCQkJCS8qIElmIHdlIGhhdmUgYW4gYWRkcmVzc2luZ21vZGUsIHNlZSBpZiB3ZSdyZSBhYmxlIHRvIGRlZmVyIHN0YWNrIHBvcHBpbmcuICovCisJCQkJaWYocC0+ei5hbSkKKwkJCQl7CisJCQkJCXN3aXRjaChwLT56LmFtLT5kZWZlcnJlZHBvcCkKKwkJCQkJeworCQkJCQkJLyogSWYgd2UgY291bGRuJ3QgZGVmZXIgcG9wcGluZyBkdWUgdG8gZmxvdyBjb250cm9sIGNoYW5nZXMsIHdlIG5lZWQgdG8gcG9wIGFueSBwcmV2aW91c2x5CisJCQkJCQkgICBkZWZlcnJlZCBzdGFjayBlbnRyaWVzIGF0IHRoaXMgcG9pbnQuKi8KKwkJCQkJCWNhc2UgREVGRVJSRURQT1BfRkxPV0NPTlRST0w6CisJCQkJCQkJZW1pdChmLCJcdFx0XHRcdFx0XHQvLyBGbG93IGNvbnRyb2wgLSBwb3BwaW5nICVkICsgJWQgYnl0ZXNcbiIscHVzaGVkYXJnc2l6ZShwKSxub3R5ZXRwb3BwZWQpOworCQkJCQkJCWlmKHB1c2hlZGFyZ3NpemUocCkrbm90eWV0cG9wcGVkKQorCQkJCQkJCXsKKwkJCQkJCQkJZW1pdF9jb25zdGFudHRvdGVtcChmLCBwdXNoZWRhcmdzaXplKHApK25vdHlldHBvcHBlZCk7CQkJCQorCQkJCQkJCQllbWl0KGYsICJcdGFkZFx0JXNcbiIsIHJlZ25hbWVzW3NwXSk7CisJCQkJCQkJfQorCQkJCQkJCXB1c2hlZCAtPSBwdXNoZWRhcmdzaXplKHApOworCQkJCQkJCW5vdHlldHBvcHBlZD0wOworCQkJCQkJCWJyZWFrOworCisJCQkJCQkvKiBJZiB3ZSBjb3VsZG4ndCBkZWZlciBwb3BwaW5nIGR1ZSB0byBuZXN0ZWQgY2FsbHMgdGhlbiB3ZSBvbmx5IHBvcCB0aGlzIGZ1bmN0aW9uJ3Mgc3RhY2sgZW50cmllcy4gKi8KKwkJCQkJCWNhc2UgREVGRVJSRURQT1BfTkVTVEVEQ0FMTFM6CisJCQkJCQkJZW1pdChmLCJcdFx0XHRcdFx0XHQvLyBOZXN0ZWQgY2FsbCAtIHBvcHBpbmcgJWQgYnl0ZXNcbiIscHVzaGVkYXJnc2l6ZShwKSk7CisJCQkJCQkJaWYocHVzaGVkYXJnc2l6ZShwKSkKKwkJCQkJCQl7CisJCQkJCQkJCWVtaXRfY29uc3RhbnR0b3RlbXAoZiwgcHVzaGVkYXJnc2l6ZShwKSk7CisJCQkJCQkJCWVtaXQoZiwgIlx0YWRkXHQlc1xuIiwgcmVnbmFtZXNbc3BdKTsKKwkJCQkJCQl9CisJCQkJCQkJcHVzaGVkIC09IHB1c2hlZGFyZ3NpemUocCk7CisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCS8qCU90aGVyd2lzZSwgd2UncmUgT0sgdG8gZGVmZXIgcG9wcGluZyB1bnRpbCBsYXRlci4gKi8KKwkJCQkJCWNhc2UgREVGRVJSRURQT1BfT0s6CisJCQkJCQkJbm90eWV0cG9wcGVkKz1wdXNoZWRhcmdzaXplKHApOworCQkJCQkJCXB1c2hlZCAtPSBwdXNoZWRhcmdzaXplKHApOworCQkJCQkJCWVtaXQoZiwiXHRcdFx0XHRcdFx0Ly8gRGVmZXJyZWQgcG9wcGluZyBvZiAlZCBieXRlcyAoJWQgaW4gdG90YWwpXG4iLHB1c2hlZGFyZ3NpemUocCksbm90eWV0cG9wcGVkKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmKHB1c2hlZGFyZ3NpemUocCkpCisJCQkJeworCQkJCQllbWl0X2NvbnN0YW50dG90ZW1wKGYsIHB1c2hlZGFyZ3NpemUocCkpOworCQkJCQlwdXNoZWQgLT0gcHVzaGVkYXJnc2l6ZShwKTsKKwkJCQkJZW1pdChmLCAiXHRhZGRcdCVzXG4iLCByZWduYW1lc1tzcF0pOworCQkJCX0KKy8vCQkJCWNsZWFydGVtcG9iaihmLHRtcCk7CisJCQkJY2xlYXJ0ZW1wb2JqKGYsdDEpOworCQkJfQorCQkJIC8qRklYTUUqLworCQkJaWYgKChwLT5xMS5mbGFncyAmIChWQVIgfCBEUkVGT0JKKSkgPT0gVkFSICYmIHAtPnExLnYtPmZpCisJCQkJICAgICAgICYmIChwLT5xMS52LT5maS0+ZmxhZ3MgJiBBTExfUkVHUykpIHsKKwkJCQlidnVuaXRlKHJlZ3NfbW9kaWZpZWQsIHAtPnExLnYtPmZpLT5yZWdzX21vZGlmaWVkLCBSU0laRSk7CisJCQl9IGVsc2UgeworCQkJCWludCBpOworCQkJCWZvciAoaSA9IDE7IGkgPD0gTUFYUjsgaSsrKSB7CisJCQkJCWlmIChyZWdzY3JhdGNoW2ldKQorCQkJCQkJQlNFVChyZWdzX21vZGlmaWVkLCBpKTsKKwkJCQl9CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgoYyA9PSBBU1NJR04gfHwgYyA9PSBQVVNIKSAmJiB0ID09IDApIHsKKwkJCXByaW50ZigiQmFkIHR5cGUgZm9yIGFzc2lnbiAvIHB1c2hcbiIpOworCQkJaWVycm9yKDApOworCQl9CisJCS8vIEJhc2ljYWxseSBPSy4KKwkJaWYgKGMgPT0gUFVTSCkgeworCQkJaW50IG1hdGNocmVnOworCQkJaWYoREJHTVNHKQorCQkJCWVtaXQoZiwgIlx0XHRcdFx0XHRcdC8vIChhL3AgcHVzaClcbiIpOworCisJCQkvKiBIYW5kbGUgY29tcG9zaXRlIHR5cGVzICovCisJCSAgICBpZigodCAmIE5RKSA+IFBPSU5URVIgfHwgKCh0ICYgTlEpID09IENIQVIgJiYgem0ybChwLT5xMi52YWwudm1heCkgIT0gMSkpIHsKKy8vCQkJCWlmKERCR01TRykKKwkJCQkJZW1pdChmLCJcdFx0XHRcdFx0XHQvLyBQdXNoaW5nIGNvbXBvc2l0ZSB0eXBlIC0gc2l6ZSAlZCwgcHVzaGVkIHNpemUgJWRcbiIsb3BzaXplKHApLHB1c2hzaXplKHApKTsKKwkJCQllbWl0X2lubGluZXB1c2goZixwLHQpOworCQkJCXB1c2hlZCArPSBwdXNoc2l6ZShwKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBuZWVkIHRvIHRha2UgZHQgaW50byBhY2NvdW50ICovCisJCQkJaWYoREJHTVNHKQorCQkJCQllbWl0KGYsICJcdFx0XHRcdFx0XHQvLyBhOiBwdXNoZWQgJWxkLCByZWduYW1lc1tzcF0gJXNcbiIsIHB1c2hlZCwgcmVnbmFtZXNbc3BdKTsKKwkJCQlzd2l0Y2godCZOUSkKKwkJCQl7CisJCQkJCWNhc2UgSU5UOgorCQkJCQljYXNlIExPTkc6CisJCQkJCWNhc2UgUE9JTlRFUjoKKwkJCQkJCWVtaXRfb2JqdG9yZWcoZiwgJnAtPnExLCB0LCB0bXApOworCQkJCQkJZW1pdChmLCAiXHRzdGRlY1x0JXNcbiIsIHJlZ25hbWVzW3NwXSk7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXByaW50ZigiUHVzaGluZyB1bmhhbmRsZWQgdHlwZSAweCV4IHRvIHRoZSBzdGFja1xuIix0KTsKKwkJCQkJCWllcnJvcigwKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlwdXNoZWQgKz0gcHVzaHNpemUocCk7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChjID09IEFTU0lHTikgeworCQkJaWYoREJHTVNHKQorCQkJCWVtaXQoZiwgIlx0XHRcdFx0XHRcdC8vIChhL3AgYXNzaWduKVxuIik7CisJCQlpZiAoKCh0ICYgTlEpID09IFNUUlVDVCkgfHwgKCh0ICYgTlEpID09IFVOSU9OKSB8fCAoKHQgJiBOUSkgPT0gQVJSQVkpCisJCQkgICAgfHwgKCh0ICYgTlEpID09IENIQVIgJiYgb3BzaXplKHApICE9IDEpKSB7CisJCQkJZW1pdF9pbmxpbmVtZW1jcHkoZixwLHQpOworCQkJfSBlbHNlIHsKKwkJCQkvLyBJcyB0aGUgc21hbGwgc3BlZWR1cCBoZXJlIHdvcnRoIHRoZSBjb21wbGV4aXR5PyAgKFllcywgYmVjYXVzZSBpdCBpbXByb3ZlcyBjb2RlIGRlbnNpdHkpCisJCQkJLy8gVXNlIHN0bXBkZWMgaWYgcTEgaXMgYWxyZWFkeSBpbiBhIHJlZ2lzdGVyIGFuZCB3ZSdyZSBub3QgdXNpbmcgYWRkcmVzc2luZyBtb2Rlcy4uLgorCQkJCWlmKCFjaGVja19hbShwKSAmJiAoKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpICYmICEocC0+ei5mbGFncyZSRUcpKQorCQkJCXsKKwkJCQkJaWYocC0+ei5mbGFncyZEUkVGT0JKKQkvLyBDYW4ndCB1c2Ugc3RtcGRlYyBmb3IgZGVyZWZlcmVuY2VkIG9iamVjdHMKKwkJCQkJeworCQkJCQkJZW1pdF9wcmVwb2JqKGYsICZwLT56LCB0LCB0bXAsIDApOworCQkJCQkJZW1pdChmLCAiXHRleGdcdCVzXG4iLCByZWduYW1lc1txMXJlZ10pOworCQkJCQkJZW1pdF9zaXplbW9kKGYsdCk7CisJCQkJCQllbWl0KGYsICJcdHN0XHQlc1xuIiwgcmVnbmFtZXNbcTFyZWddKTsKKwkJCQkJCWlmKHAtPnouYW0gJiYgcC0+ei5hbS0+ZGlzcG9zYWJsZSkKKwkJCQkJCXsKKwkJCQkJCQljbGVhcnRlbXBvYmooZix0bXApOworCQkJCQkJCWVtaXQoZiwgIlx0XHRcdFx0XHRcdC8vIE9iamVjdCBpcyBkaXNwb3NhYmxlLCBub3QgYm90aGVyaW5nIHRvIHVuZG8gZXhnXG4iKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQllbWl0KGYsICJcdGV4Z1x0JXNcbiIsIHJlZ25hbWVzW3ExcmVnXSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQllbWl0X3ByZXBvYmooZiwgJnAtPnosIHQsIHRtcCwgNCk7IC8vIE5lZWQgYW4gb2Zmc2V0CisJCQkJCQlpZighaXNzdGFja3BhcmFtKCZwLT56KSkKKwkJCQkJCQllbWl0X3NpemVtb2QoZix0KTsKKwkJCQkJCWVtaXQoZiwiXHRzdG1wZGVjXHQlc1xuIixyZWduYW1lc1txMXJlZ10pOworCQkJCQkJY2xlYXJ0ZW1wb2JqKGYsdG1wKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQllbWl0X3ByZXBvYmooZiwgJnAtPnosIHQsIHQxLCAwKTsKKwkJCQkJZW1pdF9vYmp0b3JlZyhmLCAmcC0+cTEsIHQsIHRtcCk7CisJCQkJCXNhdmVfdGVtcChmLCBwLCB0MSk7CisJCQkJfQorCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJLy8gU2VlbXMgdG8gd29yay4KKwkJaWYgKGMgPT0gQUREUkVTUykgeworCQkJaWYoREJHTVNHKQorCQkJCWVtaXQoZiwgIlx0XHRcdFx0XHRcdC8vIChhZGRyZXNzKVxuIik7CisJCQlpZihpbnZvbHZlc3JlZyh6KSkKKwkJCXsKKwkJCQllbWl0X3ByZXBvYmooZiwgJnAtPnExLCBQT0lOVEVSLCB0bXAsIDApOworCQkJCXNhdmVfdGVtcChmLHAsenJlZyk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZW1pdF9wcmVwb2JqKGYsICZwLT5xMSwgUE9JTlRFUiwgenJlZywgMCk7CisJCQkJc2F2ZV9yZXN1bHQoZiwgcCk7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQkvLyBPSworCQlpZiAoYyA9PSBNSU5VUykgeworCQkJaWYoREJHTVNHKQorCQkJCWVtaXQoZiwgIlx0XHRcdFx0XHRcdC8vIChtaW51cylcbiIpOworCQkJZW1pdF9vYmp0b3JlZyhmLCAmcC0+cTEsIHExdHlwKHApLCB6cmVnKTsKKwkJCWVtaXRfY29uc3RhbnR0b3RlbXAoZiwwKTsKKwkJCWVtaXQoZiwgIlx0ZXhnICVzXG5cdHN1YiAlc1xuIiwgcmVnbmFtZXNbenJlZ10sIHJlZ25hbWVzW3pyZWddKTsKKwkJCXNldHRlbXBvYmooZix0bXAsJnAtPnExLDAsMCk7IC8vIFRlbXAgY29udGFpbnMgdW4tbmVnYXRlZCB2YWx1ZQorCQkJLy8gY2xlYXJ0ZW1wb2JqKGYsdG1wKTsKKwkJCXNhdmVfcmVzdWx0KGYsIHApOworCQkJY29udGludWU7CisJCX0KKwkJLy8gQ29tcGFyZSAtICMKKwkJLy8gUmV2aXNpdAorCQlpZiAoYyA9PSBURVNUKSB7CisJCQlpZihEQkdNU0cpCisJCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gKHRlc3QpXG4iKTsKKwkJCWlmKCFlbWl0X29ianRvcmVnKGYsICZwLT5xMSwgdCwgdG1wKSkgLyogZW1pdF9vYmp0b3JlZyBtaWdodCBhbHJlYWR5IGhhdmUgc2V0IHRoZSBaIGZsYWcgKi8KKwkJCXsKKwkJCQllbWl0KGYsIlx0XHRcdFx0Ly8gZmxhZ3MgJXhcbiIscC0+cTEuZmxhZ3MpOworCQkJCWlmICgocC0+cTEuZmxhZ3MgJiAoUkVHfERSRUZPQkopKSA9PSBSRUcpCS8vIENhbiBhdm9pZCBtciBpZiB0aGUgdmFsdWUgY2FtZSBmcm9tIGEgcmVnaXN0ZXIKKwkJCQkJCWVtaXQoZiwgIlx0YW5kXHQlc1xuIiwgcmVnbmFtZXNbcC0+cTEucmVnXSk7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJCWVtaXQoZiwgIlx0bXJcdCVzXG5cdGFuZFx0JXNcbiIsIHJlZ25hbWVzW3QxXSwgcmVnbmFtZXNbdDFdKTsKKwkJCQkJCXNldHRlbXBvYmooZix0MSwmcC0+cTEsMCwwKTsKKwkJCQl9CisvLwkJCQljbGVhcnRlbXBvYmooZix0bXApOworLy8JCQkJY2xlYXJ0ZW1wb2JqKGYsdDEpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJLy8gQ29tcGFyZQorCQkvLyBSZXZpc2l0CisJCWlmIChjID09IENPTVBBUkUpIHsKKwkJCWlmKERCR01TRykKKwkJCXsKKwkJCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gKGNvbXBhcmUpIik7CisJCQkJaWYgKHExdHlwKHApICYgVU5TSUdORUQpCisJCQkJCWVtaXQoZiwgIiAocTEgdW5zaWduZWQpIik7CisJCQkJZWxzZQorCQkJCQllbWl0KGYsICIgKHExIHNpZ25lZCkiKTsKKwkJCQlpZiAocTJ0eXAocCkgJiBVTlNJR05FRCkKKwkJCQkJZW1pdChmLCAiIChxMiB1bnNpZ25lZCkiKTsKKwkJCQllbHNlCisJCQkJCWVtaXQoZiwgIiAocTIgc2lnbmVkKSIpOworCQkJCWVtaXQoZiwiXG4iKTsKKwkJCX0KKworCQkJLy8gSWYgcTIgaXMgYSByZWdpc3RlciBidXQgcTEgaXNuJ3Qgd2UgY291bGQgcmV2ZXJzZSB0aGUgY29tcGFyaXNvbiwgYnV0IHdvdWxkIHRoZW4gaGF2ZSB0byByZXZlcnNlCisJCQkvLyB0aGUgc3Vic2VxdWVudCBjb25kaXRpb25hbCBicmFuY2guCisJCQkvLyBGSVhNRSAtIGNhbiBhbHNvIHJldmVyc2UgaWYgb25lIHZhbHVlIGlzIGNhY2hlZAorCisJCQlpZiAoIWlzcmVnKHExKSkgeworCQkJCWlmKGlzcmVnKHEyKSkgewkvLyBSZXZlcnNlIHRoZSB0ZXN0LgorCQkJCQllbWl0X29ianRvcmVnKGYsICZwLT5xMSwgdCx0bXApOworCQkJCQlxMXJlZz1xMnJlZzsKKwkJCQkJcmV2ZXJzZWNtcD0xOworCQkJCX0gZWxzZSB7IC8vIE5laXRoZXIgb2JqZWN0IGlzIGluIGEgcmVnaXN0ZXIsIHNvIGxvYWQgcTEgaW50byB0MSBhbmQgcTIgaW50byB0bXAuCisJCQkJCWVtaXRfb2JqdG9yZWcoZiwgJnAtPnExLCB0LHQxKTsKKwkJCQkJY2xlYXJ0ZW1wb2JqKGYsdDEpOworCQkJCQlxMXJlZyA9IHQxOworCQkJCQllbWl0X29ianRvcmVnKGYsICZwLT5xMiwgdCx0bXApOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCQllbWl0X29ianRvcmVnKGYsICZwLT5xMiwgdCx0bXApOworCQkJaWYgKCghKHExdHlwKHApICYgVU5TSUdORUQpKSAmJiAoIShxMnR5cChwKSAmIFVOU0lHTkVEKSkpIHsJLy8gSWYgd2UgaGF2ZSBhIG1pc21hdGNoIG9mIHNpZ25lZG5lc3Mgd2UgdHJlYXQgYXMgdW5zaWduZWQuCisJCQkJaW50IG5leHRvcD1wLT5uZXh0LT5jb2RlOwkvLyBEb2VzIHRoZSBzaWduIG1hdHRlciBmb3IgdGhlIGJyYW5jaCBiZWluZyBkb25lPworCQkJCWlmKG5leHRvcD09RlJFRVJFRykKKwkJCQkJbmV4dG9wPXAtPm5leHQtPm5leHQtPmNvZGU7CisJCQkJaWYoKG5leHRvcCE9QkVRKSAmJiAobmV4dG9wIT1CTkUpKQorCQkJCQllbWl0KGYsICJcdHNnblxuIik7CS8vIFNpZ25lZCBjb21wYXJpc29uCisJCQl9CisJCQllbWl0KGYsICJcdGNtcFx0JXNcbiIsIHJlZ25hbWVzW3ExcmVnXSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8vIERpdmlzaW9uIGFuZCBtb2R1bG8KKwkJaWYgKChjID09IE1PRCkgfHwgKGMgPT0gRElWKSkgeworCQkJaW50IHRhcmdldHJlZz16cmVnOworCQkJaW50IGRvbmVxMj0wOworCQkJLy8gRklYTUUgLSBkbyB3ZSBuZWVkIHRvIHVzZSBzd2l0Y2hfSUMgaGVyZT8KKwkJCWlmKERCR01TRykKKwkJCQllbWl0KGYsICJcdFx0XHRcdFx0XHQvL0NhbGwgZGl2aXNpb24gcm91dGluZVxuIik7CisKKwkJCS8vIGRldGVybWluZSBoZXJlIHdoZXRoZXIgUjEgYW5kIFIyIHJlYWxseSBuZWVkIHNhdmluZyAtIG1heSBub3QgYmUgaW4gdXNlLCBvciBtYXkgYmUgdGhlIHRhcmdldCByZWdpc3Rlci4KKwkJCWlmKHJlZ3NbdDJdICYmIHpyZWchPXQyKQorCQkJeworCQkJCWVtaXQoZiwgIlx0bXRcdCVzXG5cdHN0ZGVjXHQlc1xuIiwgcmVnbmFtZXNbdDJdLCByZWduYW1lc1tzcF0pOworCQkJCWNsZWFydGVtcG9iaihmLHRtcCk7CisJCQkJcHVzaGVkKz00OworCQkJfQorCQkJaWYocmVnc1t0MisxXSAmJiB6cmVnIT0odDIrMSkpCisJCQl7CisJCQkJZW1pdChmLCAiXHRtdFx0JXNcblx0c3RkZWNcdCVzXG4iLCByZWduYW1lc1t0MiArIDFdLCByZWduYW1lc1tzcF0pOworCQkJCWNsZWFydGVtcG9iaihmLHRtcCk7CisJCQkJcHVzaGVkICs9IDQ7CisJCQl9CisJCQkvLyBxMSBtdXN0IGJlIHdyaXR0ZW4gdG8gdDIsIHEyIG11c3QgYmUgd3JpdHRlbiB0byB0MisyCisJCQkvLyBpZiBxMiBzdGFydHMgaW4gdDIgd2UgaGF2ZSB0byBhdm9pZCBvdmVyd3JpdGluZyBpdC4KKworCQkJLy8gSWYgcTEgaXMgYWxyZWFkeSBpbiB0MiwgcTIgY2FuJ3QgYmUsIHNvIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgc3dhcHBpbmcKKwkJCWlmKCFpc3JlZyhxMSkgfHwgcTFyZWchPXQyKQorCQkJeworCQkJCWVtaXRfb2JqdG9yZWcoZiwgJnAtPnExLCB0LHRtcCk7CisKKwkJCQkvLyBOZWVkIHRvIG1ha2Ugc3VyZSB3ZSdyZSBub3QgYWJvdXQgdG8gb3ZlcndyaXRlIHRoZSBvdGhlciBvcGVyYW5kIQorCQkJCWlmKGlzcmVnKHEyKSAmJiBxMnJlZz09dDIpCisJCQkJeworCQkJCQllbWl0KGYsIlx0ZXhnXHQlc1xuIixyZWduYW1lc1t0Ml0pOworCQkJCQllbWl0KGYsIlx0bXJcdCVzXG4iLHJlZ25hbWVzW3QyKzFdKTsKKwkJCQkJZG9uZXEyPTE7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJZW1pdChmLCAiXHRtclx0JXNcbiIsIHJlZ25hbWVzW3QyXSk7CisJCQl9CisJCQlpZighZG9uZXEyICYmICghaXNyZWcocTIpIHx8IHEycmVnIT10MisxKSkKKwkJCXsKKwkJCQllbWl0X29ianRvcmVnKGYsICZwLT5xMiwgdCx0bXApOworCQkJCWVtaXQoZiwgIlx0bXJcdCVzXG4iLCByZWduYW1lc1t0MiArIDFdKTsKKwkJCX0KKwkJCWNsZWFydGVtcG9iaihmLHQxKTsKKwkJCWNsZWFydGVtcG9iaihmLHQyKTsKKworCQkJaWYgKCghKHExdHlwKHApICYgVU5TSUdORUQpKSAmJiAoIShxMnR5cChwKSAmIFVOU0lHTkVEKSkpCS8vIElmIHdlIGhhdmUgYSBtaXNtYXRjaCBvZiBzaWduZWRuZXNzIHdlIHRyZWF0IGFzIHVuc2lnbmVkLgorCQkJCWVtaXQoZiwgIlx0LmxpcGNyZWxcdF9kaXZfczMyYnlzMzJcbiIpOworCQkJZWxzZQorCQkJCWVtaXQoZiwgIlx0LmxpcGNyZWxcdF9kaXZfdTMyYnl1MzJcbiIpOworCQkJZW1pdChmLCAiXHRhZGRcdCVzXG4iLCByZWduYW1lc1twY10pOworCisJCQkvLyBJZiB0aGUgbmV4dCBJQyBpcyBTZXRSZXR1cm4gZnJvbSB0aGUgc2FtZSByZWdpc3RlciB3ZSBjYW4gc2tpcCBzYXZpbmcgdGhlIHJlc3VsdC4KKwkJCWlmKG5leHRfc2V0cmV0dXJuKHAsenJlZykpCisJCQl7CisJCQkJZW1pdChmLCJcdFx0XHRcdFx0XHQvLyBTa2lwcGluZyBzYXZlX3Jlc3VsdC4uLlxuIik7CisJCQkJdGFyZ2V0cmVnPXQxOworCQkJfQorCisJCQlpZiAoYyA9PSBNT0QpCisJCQl7CisJCQkJaWYodGFyZ2V0cmVnIT10MikKKwkJCQkJZW1pdChmLCAiXHRtdFx0JXNcblx0bXJcdCVzXG4iLCByZWduYW1lc1t0Ml0sIHJlZ25hbWVzW3pyZWddKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZih0YXJnZXRyZWchPXQxKQorCQkJCQllbWl0KGYsICJcdG10XHQlc1xuXHRtclx0JXNcbiIsIHJlZ25hbWVzW3QxXSwgcmVnbmFtZXNbenJlZ10pOworCQkJfQorCisJCQlpZihyZWdzW3QyKzFdICYmIHpyZWchPSh0MisxKSkKKwkJCXsKKwkJCQllbWl0KGYsICJcdGxkaW5jXHQlc1xuXHRtclx0JXNcbiIsIHJlZ25hbWVzW3NwXSwgcmVnbmFtZXNbdDIrMV0pOworCQkJCXB1c2hlZCAtPSA0OworCQkJfQorCQkJaWYocmVnc1t0Ml0gJiYgenJlZyE9dDIpCisJCQl7CisJCQkJZW1pdChmLCAiXHRsZGluY1x0JXNcblx0bXJcdCVzXG4iLCByZWduYW1lc1tzcF0sIHJlZ25hbWVzW3QyXSk7CisJCQkJcHVzaGVkIC09IDQ7CisJCQl9CisKKwkJCWNsZWFydGVtcG9iaihmLHRtcCk7CisJCQljbGVhcnRlbXBvYmooZix0MSk7CisKKwkJCS8vIFRhcmdldCBub3QgZ3VhcmFudGVlZCB0byBiZSBhIHJlZ2lzdGVyLgorCQkJc2F2ZV9yZXN1bHQoZiwgcCk7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLy8gUmVtYWluaW5nIGFyaXRobWV0aWMgYW5kIGJpdHdpc2Ugb3BlcmF0aW9ucworCisJCWlmICgoYyA+PSBPUiAmJiBjIDw9IEFORCkgfHwgKGMgPj0gTFNISUZUICYmIGMgPD0gTVVMVCkpIHsKKwkJCWlmKERCR01TRykKKwkJCQllbWl0KGYsICJcdFx0XHRcdFx0XHQvLyAoYml0d2lzZS9hcml0aG1ldGljKSAiKTsKKwkJCWlmKERCR01TRykKKwkJCQllbWl0KGYsICJcdC8vb3BzOiAlZCwgJWQsICVkXG4iLCBxMXJlZywgcTJyZWcsIHpyZWcpOworCQkJaWYocC0+cTEuYW0gJiYgcC0+cTEuYW0tPnR5cGU9PUFNX0FERFQpCisJCQl7CisJCQkJaWYoREJHTVNHKQorCQkJCQllbWl0KGYsIlx0XHRcdFx0XHRcdC8vU3BlY2lhbCBjYXNlIC0gYWRkdFxuIik7CisJCQkJLy8gRklYTUUgLSBpZiBxMiBpcyBhbHJlYWR5IGluIHRtcCBjb3VsZCByZXZlcnNlIHRoaXMKKwkJCQlpZihwLT5xMi5mbGFncyZLT05TVCkKKwkJCQl7CisJCQkJCXpyZWc9dDE7CisJCQkJCWVtaXRfcHJlcG9iaihmLCAmcC0+eiwgdCwgdDEsIDApOworCisJCQkJCWVtaXRfb2JqdG9yZWcoZiwgJnAtPnEyLCB0LHRtcCk7CisJCQkJCWVtaXQoZiwiXHRhZGR0XHQlc1xuIixyZWduYW1lc1twLT5xMS5yZWddKTsKKwkJCQkJc2V0dGVtcG9iaihmLHRtcCwmcC0+eiwwLDApOworCQkJCQlzYXZlX3RlbXAoZiwgcCwgenJlZyk7CisJCQkJCW9ic29sZXRldGVtcG9iaihmLHQxLCZwLT56LDApOworLy8JCQkJCWVtaXQoZiwiXHRtclx0JXNcbiIscmVnbmFtZXNbcC0+ei5yZWddKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJenJlZz10MTsKKwkJCQkJZW1pdF9wcmVwb2JqKGYsICZwLT56LCB0LCB0MSwgMCk7CisKKwkJCQkJZW1pdF9vYmp0b3JlZyhmLCAmcC0+cTEsIHQsdG1wKTsKKwkJCQkJZW1pdChmLCJcdGFkZHRcdCVzXG4iLHJlZ25hbWVzW3AtPnEyLnJlZ10pOworCQkJCQlzZXR0ZW1wb2JqKGYsdG1wLCZwLT56LDAsMCk7CisJCQkJCXNhdmVfdGVtcChmLCBwLCB6cmVnKTsKKwkJCQkJb2Jzb2xldGV0ZW1wb2JqKGYsdDEsJnAtPnosMCk7CisvLwkJCQkJZW1pdChmLCJcdG1yXHQlc1xuIixyZWduYW1lc1twLT56LnJlZ10pOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKGludm9sdmVzcmVnKHEyKSAmJiBxMnJlZyA9PSB6cmVnKSB7CisvLyAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlRhcmdldCByZWdpc3RlciBhbmQgcTIgYXJlIHRoZSBzYW1lISAgQXR0ZW1wdGluZyBhIHN3aXRjaC4uLlxuIik7CisJCQkJaWYgKHN3aXRjaF9JQyhwKSkgeworCQkJCQlwcmVsb2FkKGYscCwxKTsJLy8gcmVmcmVzaCBxMXJlZywgZXRjIGFmdGVyIHN3aXRjaGluZyB0aGUgSUMKKwkJCQl9IGVsc2UgeworCQkJCQllbWl0KGYsCisJCQkJCSAgICAgIlx0XHRcdFx0XHRcdC8vIFdBUk5JTkcgLSBldmFkaW5nIHEyIGFuZCB0YXJnZXQgY29sbGlzaW9uIC0gY2hlY2sgY29kZSBmb3IgY29ycmVjdG5lc3MuXG4iKTsKKwkJCQkJenJlZyA9IHQxOworCQkJCX0KKwkJCX0KKwkJCWlmIChpbnZvbHZlc3JlZyhxMSkgJiYgcTFyZWcgPT0genJlZykKKwkJCQllbWl0KGYsIlx0XHRcdFx0XHRcdC8vIFdBUk5JTkcgLSBxMSBhbmQgdGFyZ2V0IGNvbGxpc2lvbiAtIGNoZWNrIGNvZGUgZm9yIGNvcnJlY3RuZXNzLlxuIik7CisKKwkJCWlmICghaXNyZWcocTEpIHx8IHExcmVnICE9IHpyZWcpIHsKKwkJCQllbWl0X29ianRvcmVnKGYsICZwLT5xMSwgdCx6cmVnKTsKKy8vCQkJCWVtaXQoZiwgIlx0bXJcdCVzXG4iLCByZWduYW1lc1t6cmVnXSk7CS8vIEZJWE1FIC0gd2hhdCBoYXBwZW5zIGlmIHpyZWcgYW5kIHExLzIgYXJlIHRoZSBzYW1lPworCQkJfQorCQkJZW1pdF9vYmp0b3JlZyhmLCAmcC0+cTIsIHQsdG1wKTsKKwkJCWlmIChjID49IE9SICYmIGMgPD0gQU5EKQorCQkJCWVtaXQoZiwgIlx0JXNcdCVzXG4iLCBsb2dpY2Fsc1tjIC0gT1JdLCByZWduYW1lc1t6cmVnXSk7CisJCQllbHNlIHsKKwkJCQlpZiAoYyA9PSBSU0hJRlQgfHwgYz09TVVMVCkJLy8gTW9kaWZ5IHJpZ2h0IHNoaWZ0IG9wZXJhdGlvbnMgd2l0aCBhcHByb3ByaWF0ZSBzaWduZWRuZXNzLi4uCisJCQkJeworLy8JCQkJCXByaW50ZigicTF0eXA6ICV4LCBxMnR5cDogJXgsIHp0eXA6ICV4XG4iLHExdHlwKHApLHEydHlwKHApLHp0eXAocCkpOworCQkJCQlpZiAoISh0ICYgVU5TSUdORUQpKQorCQkJCQl7CisJCQkJCQkvLyBFdmFsdWF0ZSBxMSAtIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGNvbnN0YW50IHRoYXQgZG9lc24ndCBoYXZlIGJpdCAzMSBzZXQgd2UgZG9uJ3QgbmVlZCBzZ24uLi4KKwkJCQkJCWlmKCghKHAtPnR5cGYyICYgVU5TSUdORUQpICYmIGM9PVJTSElGVCkgCisJCQkJCQkJCQl8fCAocC0+cTEuZmxhZ3MmKEtPTlNUfERSRUZPQkopIT1LT05TVCkKKwkJCQkJCQkJCQkJfHwgKHZhbDJ6bWF4KCZwLT5xMSxwLT50eXBmKSYweDgwMDAwMDAwKSkKKwkJCQkJCQllbWl0KGYsICJcdHNnblxuIik7CisJCQkJCX0KKwkJCQl9CisJCQkJZW1pdChmLCAiXHQlc1x0JXNcbiIsIGFyaXRobWV0aWNzW2MgLSBMU0hJRlRdLCByZWduYW1lc1t6cmVnXSk7CisJCQkJaWYoYz09TVVMVCkKKwkJCQkJY2xlYXJ0ZW1wb2JqKGYsdG1wKTsKKwkJCX0KKwkJCXNldHRlbXBvYmooZix6cmVnLCZwLT56LDAsMCk7CisJCQljbGVhcnRlbXBvYmooZix6cmVnKTsKKwkJCXNhdmVfcmVzdWx0KGYsIHApOworCQkJY29udGludWU7CisJCX0KKwkJcHJpbnRmKCJVbmhhbmRsZWQgSUNcbiIpOworCQlwcmljMihzdGRvdXQsIHApOworCQlpZXJyb3IoMCk7CisJfQorCWlmKGZ1bmN0aW9uX2JvdHRvbShmLCB2LCBsb2NhbHNpemUrbm90eWV0cG9wcGVkLGZpcnN0dGFpbCkpCisJCWZpcnN0dGFpbD0wOworfQorCitpbnQgc2hvcnRjdXQoaW50IGNvZGUsIGludCB0eXApCit7CisJLy8gT25seSBSU0hJRlQgYW5kIEFORCBhcmUgc2FmZSBvbiA4MzIuCisJLy8gU28gZmFyIGhhdmUgc2VlbiBzaG9ydGN1dCByZXF1ZXN0cyBmb3IKKwkvLyBESVYKKwkvLyBBREQKKwkvLyBSU0hJRlQKKwkvLyBDT01QQVJFCisJLy8gU1VCCisJLy8gTFNISUZUCisJLy8gQU5ECisJLy8gTVVMVAorCS8vIE9SCisKKy8vCXByaW50ZigiRXZhbHVhdGluZyBzaG9ydGN1dCBmb3IgY29kZSAlZCwgdHlwZSAleFxuIixjb2RlLHR5cCk7CisJaWYoY29kZT09UlNISUZUKQorCQlyZXR1cm4oMSk7CisJaWYoY29kZT09QU5EKQorCQlyZXR1cm4oMSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJlZ19wYXJtKHN0cnVjdCByZWdfaGFuZGxlICptLCBzdHJ1Y3QgVHlwICp0LCBpbnQgdmFyYXJnLCBzdHJ1Y3QgVHlwICpkKQoreworCWludCBmOworCWYgPSB0LT5mbGFncyAmIE5ROworCWlmKGlzX3ZhcmFyZ3MoZCkpCS8qIERpc2FsbG93IHJlZ2lzdGVyIHBhcmFtZXRlcnMgZm9yIHZhcmFyZ3MgZnVuY3Rpb25zICovCisJCXJldHVybigwKTsKKworCWlmIChmIDw9IExPTkcgfHwgZiA9PSBQT0lOVEVSKSB7CisJCWlmIChtLT5ncmVncyA+PSBSRUdQQVJNX0NPVU5UKQorCQkJcmV0dXJuIDA7CisJCWVsc2UKKwkJCXJldHVybiBGSVJTVF9HUFIgKyAxICsgbS0+Z3JlZ3MrKzsKKwl9CisJaWYgKElTRkxPQVQoZikpIHsKKwkJcmV0dXJuKDApOworLyoJCWlmIChtLT5mcmVncyA+PSAwKQorCQkJcmV0dXJuIDA7CisJCWVsc2UKKwkJCXJldHVybiBGSVJTVF9GUFIgKyAyICsgbS0+ZnJlZ3MrKzsKKyovCisJfQorCXJldHVybiAwOworfQorCitpbnQgaXNjb21tZW50KGNoYXIgKnN0cikKK3sKKwljaGFyIGM7CisJd2hpbGUoYz0qc3RyKyspCisJeworCQlpZighYyB8fCBjPT0nXG4nIHx8IGM9PScvJykKKwkJCXJldHVybigxKTsKKwkJaWYoYyE9JyAnJiZjIT0nXHQnKQorCQkJcmV0dXJuKDApOworCX0KKwlyZXR1cm4oMSk7Cit9CisKKworaW50IGVtaXRfcGVlcGhvbGUodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgaGF2ZW1yPTA7CisJaW50IGhhdmVtdD0wOworCWludCBoYXZlc3RvcmU9MDsKKwlpbnQgaGF2ZWxvYWQ9MDsKKwlpbnQgbG9hZGlkeD0wOworCWk9ZW1pdF9mOworCisJd2hpbGUoaSE9ZW1pdF9sKQorCXsKKwkJaW50IHJlZyxyZWcyOworCSAgICBpZihzc2NhbmYoZW1pdF9idWZmZXJbaV0sIlx0bXJcdHIlZCIsJnJlZyk9PTEpCisJCXsKKwkJCWlmKGhhdmVtdCAmJiByZWc9PXJlZzIpCisJCQl7CisJCQkJc3RyY3B5KGVtaXRfYnVmZmVyW2ldLCJcdC8vbXJcbiIpOworCQkJCXJldHVybigxKTsKKwkJCX0KKwkJCXJlZzI9cmVnOworCQkJaGF2ZW1yPTE7CisJCQloYXZlbXQ9MDsKKwkJfQorCSAgICBlbHNlIGlmKHNzY2FuZihlbWl0X2J1ZmZlcltpXSwiXHRtdFx0ciVkIiwmcmVnKT09MSkKKwkJeworCQkJaWYoaGF2ZW1yICYmIHJlZz09cmVnMikKKwkJCXsKKwkJCQlzdHJjcHkoZW1pdF9idWZmZXJbaV0sIlx0Ly9tdFxuIik7CisJCQkJcmV0dXJuKDEpOworCQkJfQorCQkJcmVnMj1yZWc7CisJCQloYXZlbXI9MDsKKwkJCWhhdmVtdD0xOworCQl9CisJCWVsc2UgaWYoc3NjYW5mKGVtaXRfYnVmZmVyW2ldLCJcdHN0XHRyJWQiLCZyZWcpPT0xKQorCQl7CisJCQloYXZlbXI9aGF2ZW10PTA7CisJCQloYXZlc3RvcmU9MTsKKwkJfQorCQllbHNlIGlmKHNzY2FuZihlbWl0X2J1ZmZlcltpXSwiXHRsZFx0ciVkIiwmcmVnMik9PTEgJiYgaGF2ZXN0b3JlKQorCQl7CisJCQloYXZlbXI9aGF2ZW10PTA7CisJCQlpZihyZWc9PXJlZzIgJiYgcmVnPT02KSAvKiBPbmx5IHN0YWNrIG9wcyAtIG90aGVycyB3b3VsZCBiZSByaXNreSBkdWUgdG8gcG90ZW50aWFsIGhhcmR3YXJlIHJlZ2lzdGVycy4gKi8KKwkJCXsKKwkJCQlsb2FkaWR4PWk7CisJCQkJaGF2ZWxvYWQ9MTsKKy8vCQkJCXByaW50ZigiRm91bmQgbWF0Y2hpbmcgbG9hZCBkaXJlY3RpdmUsIHIlZFxuIixyZWcpOworLy8JCQkJc3RyY3B5KGVtaXRfYnVmZmVyW2ldLCJcdC8vbm9wXG4iKTsKKy8vCQkJCXJldHVybigxKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKCFpc2NvbW1lbnQoZW1pdF9idWZmZXJbaV0pKSAvKiBDaGVjayB0aGF0IHRoZSBuZXh0IGluc3RydWN0aW9uIGlzbid0ICJjb25kIiAqLworCQl7CisJCQloYXZlbXI9aGF2ZW10PTA7CisJCQlpZihoYXZlbG9hZCAmJiBzdHJuY21wKGVtaXRfYnVmZmVyW2ldLCJcdGNvbmQiLDUpKSAvKiBJZiBub3QsIHdlJ3JlIE9LIHRvIHplcm8gb3V0IHRoZSBsb2FkICovCisJCQl7CisJCQkJc3RyY3B5KGVtaXRfYnVmZmVyW2xvYWRpZHhdLCJcdC8vbm9wXG4iKTsKKwkJCQlyZXR1cm4oMSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaGF2ZXN0b3JlPWhhdmVsb2FkPTA7CisJCQl9CisJCX0KKwkJaT0oaSsxKSVFTUlUX0JVRl9ERVBUSDsKKwl9CisJcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30KKworCitpbnQgaGFuZGxlX3ByYWdtYShjb25zdCBjaGFyICpzKQoreworCXJldHVybigwKTsKK30KKwordm9pZCBjbGVhbnVwX2NnKEZJTEUgKiBmKQoreworfQorCit2b2lkIGNsZWFudXBfZGIoRklMRSAqIGYpCit7CisJaWYgKGYpCisJCXNlY3Rpb24gPSAtMTsKK30KZGlmZiAtLWdpdCBhL21hY2hpbmVzLzgzMi9tYWNoaW5lLmR0IGIvbWFjaGluZXMvODMyL21hY2hpbmUuZHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2YzhkNAotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzLzgzMi9tYWNoaW5lLmR0CkBAIC0wLDAgKzEsMTYgQEAKK1M4QlMKK1M4QlUKK1MxNkJTQkUgUzE2QlNMRQorUzE2QlVCRSBTMTZCVUxFCitTMzJCU0JFIFMzMkJTTEUKK1MzMkJVQkUgUzMyQlVMRQorUzMyQlNCRSBTMzJCU0xFCitTMzJCVUJFIFMzMkJVTEUKK1M2NEJTQkUgUzY0QlNMRQorUzY0QlVCRSBTNjRCVUxFCitTMzJCSUVFRUJFCitTNjRCSUVFRUJFCitTNjRCSUVFRUJFCitTMzJCVUJFIFMzMkJVTEUKKworCmRpZmYgLS1naXQgYS9tYWNoaW5lcy84MzIvbWFjaGluZS5oIGIvbWFjaGluZXMvODMyL21hY2hpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2FiYTUzCi0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvODMyL21hY2hpbmUuaApAQCAtMCwwICsxLDE0OCBAQAorLyogIEVpZ2h0VGhpcnR5VHdvIGJhY2tlbmQgZm9yIHZiY2MuCisgICAgQmFzZWQgb24gdGhlICJnZW5lcmljIiBiYWNrZW5kLgorKi8KKworLyogYnVpbGQtdGltZSBjb25maWd1cmFibGUgb3B0aW9uczogKi8KKyNkZWZpbmUgTlVNX0dQUlMgOQorI2RlZmluZSBTQ1JBVENIX0dQUlMgMgorI2RlZmluZSBOVU1fRlBSUyAwCisjZGVmaW5lIE5VTV9DQ1JTIDAKKyNkZWZpbmUgRklYRURfU1AgMAorCisjaW5jbHVkZSAiZHQuaCIKKworLyogRGVmaW5lIHRoaXMgaWYgeW91IG5lZWQgdG8gYnVpbGQgd2l0aCAwLjlnICovCisvKiAjZGVmaW5lIFYwOUcgKi8KKworLyogaW50ZXJuYWxseSB1c2VkIGJ5IHRoZSBiYWNrZW5kICovCisjZGVmaW5lIEZJUlNUX0dQUiAxCisjZGVmaW5lIExBU1RfR1BSIChGSVJTVF9HUFIrTlVNX0dQUlMtMSkKKyNkZWZpbmUgRklSU1RfRlBSIChMQVNUX0dQUisxKQorI2RlZmluZSBMQVNUX0ZQUiAoRklSU1RfRlBSK05VTV9GUFJTLTEpCisjZGVmaW5lIFJFU0VSVkVEX0dQUlMgMQorCisvKiAgVGhpcyBzdHJ1Y3QgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IG1hY2hpbmUtc3BlY2lmaWMgICAgICAgICAgICovCisvKiAgYWRkcmVzc2luZy1tb2Rlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ3VycmVudGx5IHBvc3NpYmxlIGFyZSAoY29uc3QsZ3ByKSBhbmQgKGdwcixncHIpICAgICAgICAgICAgICAgICovCisvKiAgRklYTUUgLSB3ZSBjYW4gbWFrZSB1c2Ugb2YgbGRpZHggaGVyZSAqLworZW51bSBBZGRyZXNzaW5nTW9kZV9UeXBlIHsgQU1fUE9TVElOQz0xLCBBTV9QUkVERUMsIEFNX0FERFQgfTsKK3N0cnVjdCBBZGRyZXNzaW5nTW9kZXsKKyAgICBlbnVtIEFkZHJlc3NpbmdNb2RlX1R5cGUgdHlwZTsKKwlpbnQgZGlzcG9zYWJsZTsKKwlpbnQgZGVmZXJyZWRwb3A7Cit9OworCisvKiAgVGhlIG51bWJlciBvZiByZWdpc3RlcnMgb2YgdGhlIHRhcmdldCBtYWNoaW5lLiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1BWFIgTlVNX0dQUlMrTlVNX0ZQUlMrTlVNX0NDUlMKKworLyogIE51bWJlciBvZiBjb21tYW5kbGluZS1vcHRpb25zIHRoZSBjb2RlLWdlbmVyYXRvciBhY2NlcHRzLiAgICAgICAqLworI2RlZmluZSBNQVhHRiAzCisKKy8qICBJZiB0aGlzIGlzIHNldCB0byB6ZXJvIHZiY2Mgd2lsbCBub3QgZ2VuZXJhdGUgSUNzIHdoZXJlIHRoZSAgICAgKi8KKy8qICB0YXJnZXQgb3BlcmFuZCBpcyB0aGUgc2FtZSBhcyB0aGUgMm5kIHNvdXJjZSBvcGVyYW5kLiAgICAgICAgICAgKi8KKy8qICBUaGlzIGNhbiBzb21ldGltZXMgc2ltcGxpZnkgdGhlIGNvZGUtZ2VuZXJhdG9yLCBidXQgdXN1YWxseSAgICAgKi8KKy8qICB0aGUgY29kZSBpcyBiZXR0ZXIgaWYgdGhlIGNvZGUtZ2VuZXJhdG9yIGFsbG93cyBpdC4gICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNFUTJBU1ogMQorCisvKiAgVGhpcyBzcGVjaWZpZXMgdGhlIHNtYWxsZXN0IGludGVnZXIgdHlwZSB0aGF0IGNhbiBiZSBhZGRlZCB0byBhICovCisvKiAgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JTkFEREkyUCBJTlQKKworLyogIElmIHRoZSBieXRlcyBvZiBhbiBpbnRlZ2VyIGFyZSBvcmRlcmVkIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSAgICAqLworLyogIGJ5dGUgZmlyc3QgYW5kIHRoZW4gZGVjcmVhc2luZyBzZXQgQklHRU5ESUFOIHRvIDEuICAgICAgICAgICAgICAqLworCitleHRlcm4gY2hhciBmbGFnXzgzMl9iaWdlbmRpYW47CisjZGVmaW5lIEJJR0VORElBTiAoZmxhZ184MzJfYmlnZW5kaWFuKQorCisvKiAgSWYgdGhlIGJ5dGVzIG9mIGFuIGludGVnZXIgYXJlIG9yZGVyZWQgbGVzdCBzaWduaWZpY2FudCBieXRlICAgICovCisvKiAgYnl0ZSBmaXJzdCBhbmQgdGhlbiBpbmNyZWFzaW5nIHNldCBMSVRUTEVFTkRJQU4gdG8gMS4gICAgICAgICAgICovCisjZGVmaW5lIExJVFRMRUVORElBTiAoIWZsYWdfODMyX2JpZ2VuZGlhbikKKworLyogIE5vdGUgdGhhdCBCSUdFTkRJQU4gYW5kIExJVFRMRUVORElBTiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAgICAqLworCisvKiAgSWYgc3dpdGNoLXN0YXRlbWVudHMgc2hvdWxkIGJlIGdlbmVyYXRlZCBhcyBhIHNlcXVlbmNlIG9mICAgICAgICovCisvKiAgU1VCLFRTVCxCRVEgSUNzIHJhdGhlciB0aGFuIENPTVBBUkUsQkVRIElDcyBzZXQgdGhpcyB0byAxLiAgICAgICovCisvKiAgVGhpcyBjYW4geWllbGQgYmV0dGVyIGNvZGUgb24gc29tZSBtYWNoaW5lcy4gICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNXSVRDSFNVQlMgMQorCisvKiAgSW4gb3B0aW1pemluZyBjb21waWxhdGlvbiBjZXJ0YWluIGxpYnJhcnkgbWVtY3B5L3N0cmNweS1jYWxscyAgICovCisvKiAgd2l0aCBsZW5ndGgga25vd24gYXQgY29tcGlsZS10aW1lIHdpbGwgYmUgaW5saW5lZCB1c2luZyBhbiAgICAgICovCisvKiAgQVNTSUdOLUlDIGlmIHRoZSBzaXplIGlzIGxlc3Mgb3IgZXF1YWwgdG8gSU5MSU5FTUVNQ1BZLiAgICAgICAgICovCisvKiAgVGhlIHR5cGUgdXNlZCBmb3IgdGhlIEFTU0lHTi1JQyB3aWxsIGJlIFVOU0lHTkVEfENIQVIuICAgICAgICAgICovCisjZGVmaW5lIElOTElORU1FTUNQWSAxMDI0CisKKy8qICBQYXJhbWV0ZXJzIGFyZSBzb21ldGltZXMgcGFzc2VkIGluIHJlZ2lzdGVycyB3aXRob3V0IF9fcmVnLiAgICAgKi8KKyNkZWZpbmUgSEFWRV9SRUdQQVJNUyAxCisjZGVmaW5lIFJFR1BBUk1fQ09VTlQgMQorCisvKiAgUGFyYW1ldGVycyBvbiB0aGUgc3RhY2sgc2hvdWxkIGJlIHB1c2hlZCBpbiBvcmRlciByYXRoZXIgdGhhbiAgICovCisvKiAgaW4gcmV2ZXJzZSBvcmRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvLyAjZGVmaW5lIE9SREVSRURfUFVTSCAxCisvLyBGSVhFRF9TUAorCisvKiAgU3RydWN0dXJlIGZvciByZWdfcGFybSgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdHJ1Y3QgcmVnX2hhbmRsZXsKKyAgICB1bnNpZ25lZCBsb25nIGdyZWdzOworICAgIHVuc2lnbmVkIGxvbmcgZnJlZ3M7Cit9OworCisvKiAgV2UgaGF2ZSBzb21lIHRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZSBhdHRyaWJ1dGVzLiAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBVkVfVEFSR0VUX0FUVFJJQlVURVMKKworLyogV2UgaGF2ZSB0YXJnZXQtc3BlY2lmaWMgcHJhZ21hcyAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9QUkFHTUFTCisKKy8qICBXZSBrZWVwIHRyYWNrIG9mIGFsbCByZWdpc3RlcnMgbW9kaWZpZWQgYnkgYSBmdW5jdGlvbi4gICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9SRUdTX01PRElGSUVEIDEKKworLyogV2UgaGF2ZSBpbXBsZW1lbnRlZCBvdXIgb3duIGNvc3QtZnVuY3Rpb25zIHRvIGFkYXB0IAorICAgcmVnaXN0ZXItYWxsb2NhdGlvbiAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9SQUxMT0MgMQorI2RlZmluZSBjb3N0X21vdmVfcmVnKHgseSkgMQorI2RlZmluZSBjb3N0X2xvYWRfcmVnKHgseSkgNQorI2RlZmluZSBjb3N0X3NhdmVfcmVnKHgseSkgNQorI2RlZmluZSBjb3N0X3B1c2hwb3BfcmVnKHgpIDEKKworLyogc2l6ZSBvZiBidWZmZXIgZm9yIGFzbS1vdXRwdXQsIHRoaXMgY2FuIGJlIHVzZWQgdG8gZG8KKyAgIHBlZXBob2xlLW9wdGltaXphdGlvbnMgb2YgdGhlIGdlbmVyYXRlZCBhc3NlbWJseS1vdXRwdXQgKi8KKyNkZWZpbmUgRU1JVF9CVUZfTEVOIDEwMjQgLyogc2hvdWxkIGJlIGVub3VnaCAqLworLyogbnVtYmVyIG9mIGFzbS1vdXRwdXQgbGluZXMgYnVmZmVyZWQgKi8KKyNkZWZpbmUgRU1JVF9CVUZfREVQVEggMTYKKworLyogIFdlIGhhdmUgbm8gYXNtX3BlZXBob2xlIHRvIG9wdGltaXplIGFzc2VtYmx5LW91dHB1dCAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9QRUVQSE9MRSAxCisKKy8qIHdlIGRvIG5vdCBoYXZlIGEgbWFya19lZmZfaWNzIGZ1bmN0aW9uLCB0aGlzIGlzIHVzZWQgdG8gcHJldmVudAorICAgb3B0aW1pemF0aW9ucyBvbiBjb2RlIHdoaWNoIGNhbiBhbHJlYWR5IGJlIGltcGxlbWVudGVkIGJ5IGVmZmljaWVudAorICAgYXNzZW1ibHkgKi8KKyN1bmRlZiBIQVZFX1RBUkdFVF9FRkZfSUMKKworLyogd2Ugb25seSBuZWVkIHRoZSBzdGFuZGFyZCBkYXRhIHR5cGVzIChubyBiaXQtdHlwZXMsIGRpZmZlcmVudCBwb2ludGVycworICAgZXRjLikgKi8KKyN1bmRlZiBIQVZFX0VYVF9UWVBFUworI3VuZGVmIEhBVkVfVEdUX1BSSU5UVkFMCisKKy8qIHdlIGRvIG5vdCBuZWVkIGV4dHJhIGVsZW1lbnRzIGluIHRoZSBJQyAqLworI3VuZGVmIEhBVkVfRVhUX0lDCisKKy8qIHdlIHVzZSB1bnNpZ25lZCBpbnQgYXMgc2l6ZV90IChidXQgdW5zaWduZWQgbG9uZywgdGhlIGRlZmF1bHQpICovCisjZGVmaW5lIEhBVkVfSU5UX1NJWkVUIDEKKworLyogd2UgZG8gbm90IG5lZWQgcmVnaXN0ZXItcGFpcnMgKi8KKyN1bmRlZiBIQVZFX1JFR1BBSVJTCisKKy8qIFdlICh3aWxsIGV2ZW50dWFsbHkpIHVzZSBsaWJjYWxscyBmb3IgNjQtYml0IGFuZCBmbG9hdCBzdXBwb3J0ICovCisvKiBFbmFibGluZyB0aGlzIGNvbXBsZXRlbHkgY2hhbmdlcyBjb2RlIGdlbmVyYXRpb24gLSBpbnZlc3RpZ2F0ZS4gKi8KKyNkZWZpbmUgSEFWRV9MSUJDQUxMUyAwCisKKy8qIGRvIG5vdCBjcmVhdGUgQ09OVkVSVCBJQ3MgZnJvbSBpbnRlZ2VycyBzbWFsbGVyIHRoYW4gaW50IHRvIGZsb2F0cyAqLworI2RlZmluZSBNSU5fSU5UX1RPX0ZMT0FUX1RZUEUgSU5UCisKKy8qIGRvIG5vdCBjcmVhdGUgQ09OVkVSVCBJQ3MgZnJvbSBmbG9hdHMgdG8gaW50cyBzbWFsbGVyIHRoYW4gaW50ICovCisjZGVmaW5lIE1JTl9GTE9BVF9UT19JTlRfVFlQRSBJTlQKKworLyogZG8gbm90IGNyZWF0ZSBDT05WRVJUX0lDcyBmcm9tIGZsb2F0cyB0byB1bnNpZ25lZCBpbnRlZ2VycyAqLworI2RlZmluZSBBVk9JRF9GTE9BVF9UT19VTlNJR05FRCAxCisKKy8qIGRvIG5vdCBjcmVhdGUgQ09OVkVSVF9JQ3MgZnJvbSB1bnNpZ25lZCBpbnRlZ2VycyB0byBmbG9hdHMgKi8KKyNkZWZpbmUgQVZPSURfVU5TSUdORURfVE9fRkxPQVQgMQpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvODMyL3RlbXByZWdzLmMgYi9tYWNoaW5lcy84MzIvdGVtcHJlZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGIxNzdmCi0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvODMyL3RlbXByZWdzLmMKQEAgLTAsMCArMSw2MjQgQEAKKy8qCitUbyBkbzogCisJUGVlcGhvbGUgb3B0aW1pc2UgYXdheSBzdWNoIGNvbnN0cnVjdHMgYXMgbXIgcjAsIG10IHIwCisJfCBPcHRpbWlzZSBhZGRyZXNzZXMgb2Ygc3RhY2sgdmFyaWFibGVzIC0gbGVhJ3MgY2FuIG1vc3RseSBiZSByZXBsYWNlZCB3aXRoIHNpbXBsZSBhZGRzLgorCURldGVjdCBhYnNvbHV0ZSBtb3ZlcyB0byByZWcsIHBydW5lIGFueSB0aGF0IGFyZW4ndCBuZWVkZWQuCisKKwl0ZW1wcmVnIGxvZ2ljIHNob3VsZCBiZSBjb3JyZWN0IC0gbm93IGl0J3MgdXAgdG8gbWFjaGluZS5jIHRvIG1ha2UgZ29vZCB1c2Ugb2YgaXQuCisqLworCit6bWF4IHZhbDJ6bWF4KHN0cnVjdCBvYmogKm8sIGludCB0KQoreworCXVuaW9uIGF0eXBzICpwID0gJm8tPnZhbDsKKwl0ICY9IE5VOworCWlmICh0ID09IENIQVIpCisJCXJldHVybiAoemMyem0ocC0+dmNoYXIpKTsKKwlpZiAodCA9PSAoVU5TSUdORUQgfCBDSEFSKSkKKwkJcmV0dXJuICh6dWMyenVtKHAtPnZ1Y2hhcikpOworCWlmICh0ID09IFNIT1JUKQorCQlyZXR1cm4gKHpzMnptKHAtPnZzaG9ydCkpOworCWlmICh0ID09IChVTlNJR05FRCB8IFNIT1JUKSkKKwkJcmV0dXJuICh6dXMyenVtKHAtPnZ1c2hvcnQpKTsKKworCS8qCisJICAgaWYodD09RkxPQVQpIHJldHVybih6ZjJ6bGQocC0+dmZsb2F0KTtlbWl0emxkKGYsdmxkb3VibGUpO30KKwkgICBpZih0PT1ET1VCTEUpe3ZsZG91YmxlPXpkMnpsZChwLT52ZG91YmxlKTtlbWl0emxkKGYsdmxkb3VibGUpO30KKwkgICBpZih0PT1MRE9VQkxFKXtlbWl0emxkKGYscC0+dmxkb3VibGUpO30KKwkgKi8KKworCWlmICh0ID09IElOVCkKKwkJcmV0dXJuICh6aTJ6bShwLT52aW50KSk7CisJaWYgKHQgPT0gKFVOU0lHTkVEIHwgSU5UKSkKKwkJcmV0dXJuICh6dWkyenVtKHAtPnZ1aW50KSk7CisJaWYgKHQgPT0gTE9ORykKKwkJcmV0dXJuICh6bDJ6bShwLT52bG9uZykpOworCWlmICh0ID09IChVTlNJR05FRCB8IExPTkcpKQorCQlyZXR1cm4gKHp1bDJ6dW0ocC0+dnVsb25nKSk7CisJaWYgKHQgPT0gTExPTkcpCisJCXJldHVybiAoemxsMnptKHAtPnZsbG9uZykpOworCWlmICh0ID09IChVTlNJR05FRCB8IExMT05HKSkKKwkJcmV0dXJuICh6dWxsMnp1bShwLT52dWxsb25nKSk7CisJaWYgKHQgPT0gTUFYSU5UKQorCQlyZXR1cm4gKHAtPnZtYXgpOworCWlmICh0ID09IChVTlNJR05FRCB8IE1BWElOVCkpCisJCXJldHVybiAocC0+dnVtYXgpOworCWlmICh0ID09IFBPSU5URVIpCisJCXJldHVybiAoenVsMnp1bShwLT52dWxvbmcpKTsKKwlwcmludGYoIiNGSVhNRSAtIG5vIGZsb2F0IHN1cHBvcnQgeWV0XG4iKTsKKwlpZXJyb3IoMCk7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfc2l6ZW1vZChGSUxFICogZiwgaW50IHR5cGUpCit7CisJaWYoREJHTVNHKQorCQllbWl0KGYsICJcdFx0XHRcdFx0XHQvL3NpemVtb2QgYmFzZWQgb24gdHlwZSAweCV4XG4iLCB0eXBlKTsKKwlzd2l0Y2ggKHR5cGUgJiBOUSkgeworCWNhc2UgMDoKKwkJaWYoREJHTVNHKQorCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly9zaXplbW9kIHR5cGUgaXMgemVybyAobW92ZWZyb21yZWc/KSIpOworCQlicmVhazsKKwljYXNlIENIQVI6CisJCWVtaXQoZiwgIlx0Ynl0XG4iKTsKKwkJYnJlYWs7CisJY2FzZSBTSE9SVDoKKwkJZW1pdChmLCAiXHRobGZcbiIpOworCQlicmVhazsKKwljYXNlIElOVDoKKwljYXNlIExPTkc6CisJY2FzZSBMTE9ORzoKKwljYXNlIFBPSU5URVI6CisJY2FzZSBGVU5LVDoJCS8vIEZ1bmN0aW9uIHBvaW50ZXJzIGFyZSBkZXJlZmVyZW5jZWQgYnkgY2FsbGluZyB0aGVtLgorCWNhc2UgU1RSVUNUOgorCWNhc2UgVU5JT046CisJY2FzZSBBUlJBWToKKwkJYnJlYWs7CQkvLyBTdHJ1Y3RzIGFuZCB1bmlvbnMgaGF2ZSB0byByZW1haW4gYXMgcG9pbnRlcnMKKwlkZWZhdWx0OgorCQlwcmludGYoImVtaXRfc2l6ZW1vZCAtIHR5cGUgJWQgbm90IGhhbmRsZWRcbiIsIHR5cGUpOworCQlpZXJyb3IoMCk7CisJCWJyZWFrOworCX0KK30KKworCisvLyBXQVJOSU5HOiBNdXN0IGludmFsaWRhdGUgdG1wIGlmIGNvbnRyb2wgZmxvdyBkb2Vzbid0IGNoYW5nZSBpbW1lZGlhdGVseSBhZnRlciB0aGlzIGluc3RydWN0aW9uLgorCitzdGF0aWMgdm9pZCBlbWl0X3BjcmVsdG90ZW1wKEZJTEUgKiBmLCBjaGFyICpsYWIsIGludCBzdWZmaXgpCit7CisJaW50IGk7CisJaWYoREJHTVNHKQorCQllbWl0KGYsICJcdFx0XHRcdFx0XHQvL3BjcmVsdG90ZW1wXG4iKTsKKwllbWl0KGYsICJcdC5saXBjcmVsXHQlcyVkXG4iLCBsYWIsIHN1ZmZpeCk7CisvLwljbGVhcnRlbXBvYmooZix0bXApOworfQorCitzdGF0aWMgdm9pZCBlbWl0X3BjcmVsdG90ZW1wMihGSUxFICpmLHN0cnVjdCBvYmogKnApCit7CisJaWYoREJHTVNHKQorCQllbWl0KGYsICJcdFx0XHRcdFx0XHQvL3BjcmVsdG90ZW1wXG4iKTsKKwlpZiAocC0+di0+c3RvcmFnZV9jbGFzcyA9PSBTVEFUSUMpCisJCWVtaXQoZiwiXHQubGlwY3JlbFx0JXMlZFxuIixsYWJwcmVmaXgsIHptMmwocC0+di0+b2Zmc2V0KSk7CisJZWxzZSBpZihwLT52LT5zdG9yYWdlX2NsYXNzID09IEVYVEVSTikKKwl7CisJCWlmKHAtPnZhbC52bWF4KQorCQkJZW1pdChmLCJcdC5saXBjcmVsXHRfJXMlZFxuIixwLT52LT5pZGVudGlmaWVyLCBwLT52YWwudm1heCk7CisJCWVsc2UKKwkJCWVtaXQoZiwiXHQubGlwY3JlbFx0XyVzXG4iLHAtPnYtPmlkZW50aWZpZXIpOworCX0KKy8vCWNsZWFydGVtcG9iaihmLHRtcCk7Cit9CisKKy8vIHRlbXBvYmogbG9naWMgc2hvdWxkIGJlIGNvcnJlY3QuCisKK3N0YXRpYyB2b2lkIGVtaXRfZXh0ZXJudG90ZW1wKEZJTEUgKiBmLCBjaGFyICpsYWIsIGludCBvZmZzZXQpCS8vIEZJWE1FIC0gbmVlZCB0byBmaW5kIGEgd2F5IHRvIGRvIHRoaXMgUEMtcmVsYXRpdmUuCit7CisjaWYgMAorCWVtaXQoZiwgIlx0bGRpbmNcdCVzXG4iLCByZWduYW1lc1twY10pOworCWlmIChvZmZzZXQpCisJCWVtaXQoZiwgIlx0LnJlZlx0XyVzLCAlZFxuIixsYWIsIG9mZnNldCk7CisJZWxzZQorCQllbWl0KGYsICJcdC5yZWZcdF8lc1xuIixsYWIpOworI2Vsc2UKKwlpZihnX2ZsYWdzW0ZMQUdfUElDXSZVU0VERkxBRykKKwl7CisJCWlmIChvZmZzZXQpCisJCQllbWl0KGYsICJcdC5saXBjcmVsXHRfJXMsICVkXG4iLGxhYiwgb2Zmc2V0KTsKKwkJZWxzZQorCQkJZW1pdChmLCAiXHQubGlwY3JlbFx0XyVzXG4iLGxhYik7CisJCWVtaXQoZiwgIlx0YWRkdFx0JXNcbiIscmVnbmFtZXNbcGNdKTsKKwl9CisJZWxzZQorCXsKKwkJaWYgKG9mZnNldCkKKwkJCWVtaXQoZiwgIlx0LmxpYWJzXHRfJXMsICVkXG4iLGxhYiwgb2Zmc2V0KTsKKwkJZWxzZQorCQkJZW1pdChmLCAiXHQubGlhYnNcdF8lc1xuIixsYWIpOworCX0KKyNlbmRpZgorCWNsZWFydGVtcG9iaihmLHRtcCk7Cit9CisKKworLy8gdGVtcG9iaiBsb2dpYyBzaG91bGQgYmUgY29ycmVjdC4KKworc3RhdGljIHZvaWQgZW1pdF9zdGF0aWN0b3RlbXAoRklMRSAqIGYsIGNoYXIgKmxhYiwgaW50IHN1ZmZpeCwgaW50IG9mZnNldCkJLy8gRklYTUUgLSBuZWVkIHRvIGZpbmQgYSB3YXkgdG8gZG8gdGhpcyBQQyByZWxhdGl2ZQoreworCWlmKERCR01TRykKKwkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly9zdGF0aWN0b3RlbXAgKEZJWE1FIC0gbWFrZSBQQy1yZWxhdGl2ZT8pXG4iKTsKKwlpZihnX2ZsYWdzW0ZMQUdfUElDXSZVU0VERkxBRykKKwl7CisJCWVtaXQoZiwgIlx0LmxpcGNyZWxcdCVzJWQsJWRcbiIsIGxhYiwgc3VmZml4LCBvZmZzZXQpOworCQllbWl0KGYsICJcdGFkZHRcdCVzXG4iLHJlZ25hbWVzW3BjXSk7CisJfQorCWVsc2UKKwl7CisJCWVtaXQoZiwgIlx0LmxpYWJzXHQlcyVkLCVkXG4iLCBsYWIsIHN1ZmZpeCwgb2Zmc2V0KTsKKwl9CisJY2xlYXJ0ZW1wb2JqKGYsdG1wKTsKK30KKworc3RhdGljIGludCBjb3VudF9jb25zdGFudGNodW5rcyh6bWF4IHYpCit7CisJaW50IGNodW5rID0gMTsKKwlpbnQgdjIgPSAoaW50KXY7CisJd2hpbGUgKCgodjIgJiAweGZmZmZmZmUwKSAhPSAwKSAmJiAoKHYyICYgMHhmZmZmZmZlMCkgIT0gMHhmZmZmZmZlMCkpCS8vIEFyZSB3ZSBsb29raW5nIGF0IGEgc2lnbi1leHRlbmRlZCA2LWJpdCB2YWx1ZSB5ZXQ/CisJeworLy8gICAgICAgICAgICAgICBwcmludGYoIiUwOHhcbiIsdjIpOworCQl2MiA+Pj0gNjsKKwkJKytjaHVuazsKKwl9CisJcmV0dXJuIChjaHVuayk7Cit9CisKKworLy8gdGVtcG9iaiBsb2dpYyBzaG91bGQgYmUgY29ycmVjdC4KKworc3RhdGljIHZvaWQgZW1pdF9jb25zdGFudHRvcmVnKEZJTEUgKiBmLCB6bWF4IHYsaW50IHJlZykKK3sKKwlpbnQgbWF0Y2hyZWc9bWF0Y2h0ZW1wa29uc3QoZix2LHJlZyk7CisvLwllbWl0KGYsIi8vIG1hdGNocmVnICVzXG4iLHJlZ25hbWVzW21hdGNocmVnXSk7CisKKy8vCWlmKG1hdGNocmVnPT10bXApCisvLwkJcmV0dXJuOworLy8JZWxzZSBpZihtYXRjaHJlZykKKy8vCQllbWl0KGYsIlx0bXRcdCVzXG4iLHJlZ25hbWVzW21hdGNocmVnXSk7CisJaWYobWF0Y2hyZWcpIHsKKwkJLy8gTmVlZCB0byBkZWFsIHdpdGggdGhlIGNhc2Ugd2hlcmUgYSBjb25zdGFudCBpcyBpbiByMCBidXQgcmVxdWlyZWQgaW4gdG1wIG9yIHZpY2UgdmVyc2EuCisJCWlmKG1hdGNocmVnIT1yZWcpIHsKKwkJCWlmKHJlZz09dG1wKQorCQkJCWVtaXQoZiwiXHRtdFx0JXNcbiIscmVnbmFtZXNbbWF0Y2hyZWddKTsKKwkJCWVsc2UKKwkJCQllbWl0KGYsIlx0bXJcdCVzXG4iLHJlZ25hbWVzW3JlZ10pOworCQkJc2V0dGVtcGtvbnN0KGYscmVnLHYpOworCQl9CisJfSBlbHNlIHsKKwkJZW1pdChmLCAiXHQubGljb25zdFx0JWRcbiIsIHYpOworCQlzZXR0ZW1wa29uc3QoZix0bXAsdik7CisJCWlmKHJlZyE9dG1wKQorCQl7CisJCQllbWl0KGYsIlx0bXJcdCVzXG4iLHJlZ25hbWVzW3JlZ10pOworCQkJc2V0dGVtcGtvbnN0KGYscmVnLHYpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBlbWl0X2NvbnN0YW50dG90ZW1wKEZJTEUgKiBmLCB6bWF4IHYpCit7CisJZW1pdF9jb25zdGFudHRvcmVnKGYsdix0bXApOworfQorCisKKy8vIHRlbXBvYmogbG9naWMgc2hvdWxkIGJlIGNvcnJlY3QuCisKK3N0YXRpYyB2b2lkIGVtaXRfc3RhY2t2YXJ0b3RlbXAoRklMRSAqIGYsIHptYXggb2Zmc2V0LCBpbnQgZGVyZWYpCit7CisJaWYgKGRlcmVmKSB7CisJCWlmIChvZmZzZXQpIHsKKwkJCWVtaXRfY29uc3RhbnR0b3RlbXAoZiwgb2Zmc2V0KTsKKwkJCWVtaXQoZiwgIlx0bGRpZHhcdCVzXG4iLCByZWduYW1lc1tzcF0pOworCQl9IGVsc2UKKwkJCWVtaXQoZiwgIlx0bGRcdCVzXG4iLCByZWduYW1lc1tzcF0pOworCX0gZWxzZSB7CisJCWlmIChvZmZzZXQpIHsKKwkJCWVtaXRfY29uc3RhbnR0b3RlbXAoZiwgb2Zmc2V0KTsKKwkJCWVtaXQoZiwgIlx0YWRkdFx0JXNcbiIsIHJlZ25hbWVzW3NwXSk7CisJCX0gZWxzZQorCQkJZW1pdChmLCAiXHRtdFx0JXNcbiIsIHJlZ25hbWVzW3NwXSk7CisJfQorCWNsZWFydGVtcG9iaihmLHRtcCk7Cit9CisKKworLy8gTG9hZCB0aGUgYWRkcmVzcyBvZiBhIHRhcmdldCBvYmogaW50byByZWcgaW4gcHJlcGFyYXRpb24gZm9yIGEgc3RvcmUuCisvLyBJZiB0aGUgdGFyZ2V0IGlzIHNpbXBseSBhIHJlZ2lzdGVyIHRoZW4gZG9lcyBub3RoaW5nLgorLy8gVGhlIG5vbWluYXRlZCByZWdpc3RlciBjYW4gYmUgdG1wIG9yIGFueSBncHIuCisvLyBHdWFyYW50ZWVkIG5vdCB0byBtb2RpZnkgdDEgb3IgdDIgZXhjZXB0IHdoZW4gbm9taW5hdGVkLgorLy8gdGVtcG9iaiBsb2dpYyBzaG91bGQgYmUgY29ycmVjdC4KKworc3RhdGljIHZvaWQgZW1pdF9wcmVwb2JqKEZJTEUgKiBmLCBzdHJ1Y3Qgb2JqICpwLCBpbnQgdCwgaW50IHJlZywgaW50IG9mZnNldCkKK3sKKwlpbnQgbWF0Y2hyZWc9MDsKKworCWlmKERCR01TRykKKwkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gKHByZXBvYmogJXMpXG4gIiwgcmVnbmFtZXNbcmVnXSk7CisKKwlpZiAocC0+ZmxhZ3MgJiBSRUcpIHsKKwkJaWYoREJHTVNHKQorCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gcmVnICVzIC0gbm8gbmVlZCB0byBwcmVwXG4iLCByZWduYW1lc1twLT5yZWddKTsKKwkJaWYocC0+ZmxhZ3MgJiBEUkVGT0JKKQorCQl7CisJCQlpZiAocmVnID09IHRtcCkKKwkJCXsKKwkJCQllbWl0KGYsICJcdG10XHQlc1xuIiwgcmVnbmFtZXNbcC0+cmVnXSk7CisJCQkJY2xlYXJ0ZW1wb2JqKGYsdG1wKTsKKwkJCX0KKwkJfQorCQlyZXR1cm47CisJfQorCisJaWYoIW9mZnNldCkKKwkJbWF0Y2hyZWc9bWF0Y2h0ZW1wb2JqKGYscCwxLHQxKTsgIC8vIEZJWE1FIC0gd2UncmUgaHVudGluZyBmb3IgdmFyYWRyIGhlcmUuCisKKwlpZihtYXRjaHJlZykKKwl7CisJCWlmKERCR01TRykKKwkJCWVtaXQoZiwiXG5cdFx0XHRcdFx0XHQvLyByZXF1aXJlZCB2YWx1ZSBmb3VuZCBpbiAlc1xuIixyZWduYW1lc1ttYXRjaHJlZ10pOworCQlpZihtYXRjaHJlZz09cmVnKQorCQkJcmV0dXJuOworCQllbHNlIGlmKG1hdGNocmVnPT10bXApIHsKKwkJCWVtaXQoZiwiXHRtclx0JXNcbiIscmVnbmFtZXNbcmVnXSk7CisJCQlzZXR0ZW1wb2JqKGYscmVnLHAsMCwwKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWVtaXQoZiwiXHRtdFx0JXNcbiIscmVnbmFtZXNbbWF0Y2hyZWddKTsKKwkJCXNldHRlbXBvYmooZix0bXAscCwwLDApOworCQkJaWYocmVnIT10bXApCisJCQl7CisJCQkJZW1pdChmLCJcdG1yXHQlc1xuIixyZWduYW1lc1tyZWddKTsKKwkJCQlzZXR0ZW1wb2JqKGYscmVnLHAsMCwwKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCX0KKworCWlmIChwLT5mbGFncyAmIERSRUZPQkopIHsKKwkJaWYgKHAtPmZsYWdzICYgVkFSQURSKQorCQkJaWYoREJHTVNHKQorCQkJCWVtaXQoZiwgIlx0XHRcdFx0XHRcdC8vdmFyYWRyIEFORCAiKTsKKwkJaWYoREJHTVNHKQorCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gZGVyZWZcbiIpOworCQkvKiBEZXJlZmVyZW5jaW5nIGEgcG9pbnRlciAqLworCQlpZiAocC0+ZmxhZ3MgJiBLT05TVCkgeworCQkJaWYoREJHTVNHKQorCQkJCWVtaXQoZiwgIlx0XHRcdFx0XHRcdC8vIGNvbnN0IHRvICVzXG4iLHJlZ25hbWVzW3JlZ10pOworCQkJZW1pdF9jb25zdGFudHRvcmVnKGYsIHZhbDJ6bWF4KHAsIHAtPmR0eXApICsgb2Zmc2V0LHJlZyk7CisvLwkJCWlmIChyZWcgIT0gdG1wKQorLy8JCQkJZW1pdChmLCAiXHRtclx0JXNcbiIsIHJlZ25hbWVzW3JlZ10pOworCQkJc2V0dGVtcGtvbnN0KGYscmVnLHZhbDJ6bWF4KHAsIHAtPmR0eXApICsgb2Zmc2V0KTsKKwkJfSBlbHNlIGlmIChwLT5mbGFncyAmIFJFRykgeworCQkJaWYgKHJlZyA9PSB0bXApCisJCQl7CisJCQkJZW1pdChmLCAiXHRtdFx0JXNcbiIsIHJlZ25hbWVzW3AtPnJlZ10pOworCQkJCWNsZWFydGVtcG9iaihmLHRtcCk7CisJCQl9CisJCQllbHNlIGlmKERCR01TRykKKwkJCQllbWl0KGYsICJcdFx0XHRcdFx0XHQvLyByZWcgJXMgLSBubyBuZWVkIHRvIHByZXBcbiIsIHJlZ25hbWVzW3AtPnJlZ10pOworCQl9IGVsc2UgaWYgKHAtPmZsYWdzICYgVkFSKSB7CisJCQlpZihEQkdNU0cpCisJCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gdmFyIEZJWE1FIC0gZGVyZWY/XG4iKTsKKwkJCWlmKG9mZnNldCkKKwkJCXsKKwkJCQlwcmludGYoImVtaXRfcHJlcG9iajogT2Zmc2V0IHN1cHBsaWVkIGJ1dCBvYmplY3QgaXMgYmVpbmcgZGVyZWZlcmVuY2VkIVxuIik7CisJCQkJaWVycm9yKDApOworCQkJfQorCQkJaWYgKGlzYXV0byhwLT52LT5zdG9yYWdlX2NsYXNzKSkgeworCQkJCWlmKERCR01TRykKKwkJCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gcmVnIC0gYXV0b1xuIik7CisJCQkJZW1pdF9zdGFja3ZhcnRvdGVtcChmLCByZWFsX29mZnNldChwKSArIG9mZnNldCwgMSk7CisJCQkJaWYgKHJlZyAhPSB0bXApCisJCQkJeworCQkJCQllbWl0KGYsICJcdG1yXHQlc1xuIiwgcmVnbmFtZXNbcmVnXSk7CisJCQkJCWNsZWFydGVtcG9iaihmLHJlZyk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChpc3N0YXRpYyhwLT52LT5zdG9yYWdlX2NsYXNzKSkgeworCQkJCWNsZWFydGVtcG9iaihmLHRtcCk7CisJCQkJY2xlYXJ0ZW1wb2JqKGYscmVnKTsKKwkJCQlpZihEQkdNU0cpCisJCQkJCWVtaXQoZiwgIlx0XHRcdFx0XHRcdC8vIHN0YXRpY1xuIik7CisJCQkJZW1pdChmLCAiXHRsZGluY1x0cjdcblx0LnJlZlx0JXMlZCwlZFxuIiwKKwkJCQkgICAgIGxhYnByZWZpeCwgem0ybChwLT52LT5vZmZzZXQpLCBvZmZzZXQgKyBwLT52YWwudm1heCk7CisJCQkJZW1pdChmLCAiXHRsZHRcbiIpOworCQkJCWlmIChyZWcgIT0gdG1wKQorCQkJCQllbWl0KGYsICJcdG1yXHQlc1xuIiwgcmVnbmFtZXNbcmVnXSk7CisJCQl9IGVsc2UgaWYgKGlzZXh0ZXJuKHAtPnYtPnN0b3JhZ2VfY2xhc3MpKSB7CisJCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly9FeHRlcm5cbiIpOworCQkJCWVtaXRfZXh0ZXJudG90ZW1wKGYsIHAtPnYtPmlkZW50aWZpZXIsIHAtPnZhbC52bWF4KTsKKwkJCQllbWl0KGYsICJcdGxkdFxuIik7CisJCQkJaWYgKHJlZyAhPSB0bXApCisJCQkJCWVtaXQoZiwgIlx0bXJcdCVzXG4iLCByZWduYW1lc1tyZWddKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYoREJHTVNHKQorCQkJCQlwcmludGYoIi8vIGVtaXRfcHJlcG9iaiAoZGVyZWYpOiAtIHVua25vd24gc3RvcmFnZSBjbGFzcyFcbiIpOworCQkJCWllcnJvcigwKTsKKwkJCX0KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXptZXF0byhsMnptKDBMKSxwLT52YWwudm1heCkpeworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwiIG9mZnNldCAiKTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsIiBGSVhNRSAtIGRlcmVmP1xuIik7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdF9jb25zdGFudHRvdGVtcChmLHZhbDJ6bWF4KGYscCxMT05HKSk7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCJcdG1yXHQlc1xuIixyZWduYW1lc1tyZWddKTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0X3BjcmVsdG90ZW1wKGYsbGFicHJlZml4LHptMmwocC0+di0+b2Zmc2V0KSk7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCJcdGFkZFx0JXNcbiIscmVnbmFtZXNbcmVnXSk7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChwLT5mbGFncyAmIFJFRykgeworCQkJaWYoREJHTVNHKQorCQkJCWVtaXQoZiwgIlx0XHRcdFx0XHRcdC8vIHJlZyAlcyAtIG5vIG5lZWQgdG8gcHJlcFxuIiwgcmVnbmFtZXNbcC0+cmVnXSk7CisJCX0gZWxzZSBpZiAocC0+ZmxhZ3MgJiBWQVIpIHsKKwkJCWlmIChpc2F1dG8ocC0+di0+c3RvcmFnZV9jbGFzcykpIHsKKwkJCQkvKiBTZXQgYSByZWdpc3RlciB0byBwb2ludCB0byBhIHN0YWNrLWJhc2UgdmFyaWFibGUuICovCisJCQkJaWYoREJHTVNHKQorCQkJCQllbWl0KGYsICJcdFx0XHRcdFx0XHQvLyB2YXIsIGF1dG98cmVnXG4iKTsKKwkJCQlpZiAocC0+di0+c3RvcmFnZV9jbGFzcyA9PSBSRUdJU1RFUikKKwkJCQkJaWYoREJHTVNHKQorCQkJCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gKGlzIGFjdHVhbGx5IFJFR0lTVEVSKVxuIik7CisJCQkJZW1pdF9zdGFja3ZhcnRvdGVtcChmLCByZWFsX29mZnNldChwKSArIG9mZnNldCwgMCk7CisJCQkJaWYgKHJlZyAhPSB0bXApCisJCQkJCWVtaXQoZiwgIlx0bXJcdCVzXG5cbiIsIHJlZ25hbWVzW3JlZ10pOworCQkJfSBlbHNlIGlmIChpc2V4dGVybihwLT52LT5zdG9yYWdlX2NsYXNzKSkgeworCQkJCWlmKERCR01TRykKKwkJCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gZXh0ZXJuIChvZmZzZXQgJWQpXG4iLCBwLT52YWwudm1heCk7CisJCQkJZW1pdF9leHRlcm50b3RlbXAoZiwgcC0+di0+aWRlbnRpZmllciwgcC0+dmFsLnZtYXggKyBvZmZzZXQpOworCQkJCWlmKERCR01TRykKKwkJCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gZXh0ZXJuIHBlICVzIHZhcmFkclxuIiwgcC0+ZmxhZ3MgJiBWQVJBRFIgPyAiaXMiIDogIm5vdCIpOworCQkJCWlmIChyZWcgIT0gdG1wKQorCQkJCQllbWl0KGYsICJcdG1yXHQlc1xuIiwgcmVnbmFtZXNbcmVnXSk7CisJCQl9IGVsc2UgaWYgKGlzc3RhdGljKHAtPnYtPnN0b3JhZ2VfY2xhc3MpKSB7CisJCQkJaWYoREJHTVNHKQorCQkJCQllbWl0KGYsICJcdFx0XHRcdFx0XHQvLyBzdGF0aWNcbiIpOworLy8JCQkJZW1pdChmLCAiXHRsZGluY1x0cjdcblx0LnJlZlx0JXMlZCwlZFxuIiwKKy8vCQkJCSAgICAgbGFicHJlZml4LCB6bTJsKHAtPnYtPm9mZnNldCksIG9mZnNldCArIHAtPnZhbC52bWF4KTsKKwkJCQlpZihnX2ZsYWdzW0ZMQUdfUElDXSZVU0VERkxBRykKKwkJCQl7CisJCQkJCWVtaXQoZiwgIlx0LmxpcGNyZWxcdCVzJWQsJWRcbiIsCisJCQkJCQkgbGFicHJlZml4LCB6bTJsKHAtPnYtPm9mZnNldCksIG9mZnNldCArIHAtPnZhbC52bWF4KTsKKwkJCQkJZW1pdChmLCAiXHRhZGR0XHQlc1xuIixyZWduYW1lc1twY10pOworCQkJCX0KKwkJCQllbHNlCisJCQkJCWVtaXQoZiwgIlx0LmxpYWJzXHQlcyVkLCVkXG4iLAorCQkJCQkJIGxhYnByZWZpeCwgem0ybChwLT52LT5vZmZzZXQpLCBvZmZzZXQgKyBwLT52YWwudm1heCk7CisJCQkJaWYoREJHTVNHKQorCQkJCQllbWl0KGYsICJcdFx0XHRcdFx0XHQvLyBzdGF0aWMgcGUgJXMgdmFyYWRyXG4iLCBwLT5mbGFncyAmIFZBUkFEUiA/ICJpcyIgOiAibm90Iik7CisJCQkJaWYgKHJlZyAhPSB0bXApCisJCQkJCWVtaXQoZiwgIlx0bXJcdCVzXG4iLCByZWduYW1lc1tyZWddKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYoREJHTVNHKQorCQkJCQlwcmludGYoImVtaXRfcHJlcG9iajogLSB1bmtub3duIHN0b3JhZ2UgY2xhc3MhXG4iKTsKKwkJCQlpZXJyb3IoMCk7CisJCQl9CisJCQlzZXR0ZW1wb2JqKGYsdG1wLHAsMCwxKTsKKwkJCXNldHRlbXBvYmooZixyZWcscCwwLDEpOworCQl9CisJfQorfQorCisKKy8vIFJldHVybnMgMSBpZiB0aGUgWiBmbGFnIGhhcyBiZWVuIHNldCAoaS5lLiBhIGxvYWQgaGFzIG9jY3VycmVkKQorLy8gR3VhcmFudGVlZCBub3QgdG8gbW9kaWZ5IHQxIG9yIHQyLgorCitzdGF0aWMgaW50IGVtaXRfb2JqdG9yZWcoRklMRSAqIGYsIHN0cnVjdCBvYmogKnAsIGludCB0LGludCByZWcpCit7CisJaW50IHJlc3VsdD0wOworCWludCBtYXRjaHJlZzsKKwlpbnQgZWxlbWVudGFyeTsKKwlpbnQgcG9zdGluYz0wOworCWlmKERCR01TRykKKwkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gKG9iaiB0byAlcykgZmxhZ3MgJXggdHlwZSAleFxuIixyZWduYW1lc1tyZWddLHAtPmZsYWdzLHQpOworCisJLyogSWYgd2UncmUgZGVhbGluZyB3aXRoIGFuIGVsZW1lbnRhcnkgdHlwZSBvbiB0aGUgc3RhY2sgd2UnbGwgY29weSB0aGUgYWN0dWFsIG9iamVjdCBpbnRvCisJICAgYSByZWdpc3Rlci4gIElmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGNvbXBvc2l0ZSB0eXBlLCBvciB0YWtpbmcgdGhlIGFkZHJlc3Mgb2YgYW4gZWxlbWVudGFyeQorCSAgIHR5cGUgdGhlbiBpbnN0ZWFkIHdlJ2xsIHRha2UgaXRzIGFkZHJlc3MgaW50byB0aGUgcmVnaXN0ZXIuICBUaGVyZSdzIGEgc3VidGxldHkgdG8gdGFrZSBjYXJlCisJICAgb2Ygd2l0aCBBU1NJR04gSUNzIGFuZCBpbmxpbmUgbWVtY3B5L3N0cmNweSB3aGVyZSB0aGV5IHR5cGUgY2FuIGJlIENIQVIgd2l0aCBhIHNpemUhPTEuCisJICAgSSBoYWNrIGFyb3VuZCB0aGlzIGJ5IG92ZXJyaWRpbmcgdHlwZSBpbiB0aGUgcGFyZW50IGZ1Y2N0aW9uLiAqLworCWlmICgoIShwLT5mbGFncyAmIFZBUkFEUikpICYmICgodCAmIE5RKSAhPSBTVFJVQ1QpICYmICgodCAmIE5RKSAhPSBVTklPTikgJiYgKCh0ICYgTlEpICE9IEFSUkFZKSkKKwkJZWxlbWVudGFyeT0xOworCWVsc2UKKwkJZWxlbWVudGFyeT0wOworCisJbWF0Y2hyZWc9bWF0Y2h0ZW1wb2JqKGYscCwwLHJlZyk7CisKKwlpZiAoKHAtPmZsYWdzICYgKFJFR3xEUkVGT0JKKSkgPT0gUkVHKSB7CisJCXNldHRlbXBvYmooZixyZWcscCwwLDApOworCQlpZihEQkdNU0cpCisJCQllbWl0KGYsICJcdFx0XHRcdFx0XHQvLyByZWcgJXMgLSBvbmx5IG1hdGNoIGFnYWluc3QgdG1wXG4iLCByZWduYW1lc1twLT5yZWddKTsKKwkJaWYgKHJlZyA9PSBwLT5yZWcpCisJCQlyZXR1cm4oMCk7CisJCWlmKG1hdGNocmVnIT10bXApCisJCXsKKwkJCWVtaXQoZiwiXHRtdFx0JXNcbiIscmVnbmFtZXNbcC0+cmVnXSk7CisJCQlzZXR0ZW1wb2JqKGYsdG1wLHAsMCwwKTsKKwkJfQorCQlpZihyZWchPXRtcCkKKwkJeworCQkJZW1pdChmLCAiXHRtclx0JXNcbiIsIHJlZ25hbWVzW3JlZ10pOworCQkJc2V0dGVtcG9iaihmLHJlZyxwLDAsMCk7CisJCX0KKwkJcmV0dXJuKDApOworCX0KKworCWlmKG1hdGNocmVnKQorCXsKKwkJaWYoREJHTVNHKQorCQkJZW1pdChmLCJcblx0XHRcdC8vIHJlcXVpcmVkIHZhbHVlIGZvdW5kIGluICVzXG4iLHJlZ25hbWVzW21hdGNocmVnXSk7CisJCWlmKG1hdGNocmVnPT1yZWcpCisJCQlyZXR1cm4oMCk7CisJCWlmKG1hdGNocmVnIT10bXApCisJCXsKKwkJCWVtaXQoZiwiXHRtdFx0JXNcbiIscmVnbmFtZXNbbWF0Y2hyZWddKTsKKwkJCXNldHRlbXBvYmooZix0bXAscCwwLDApOworCQl9CisJCWlmKHJlZyE9dG1wKQorCQl7CisJCQllbWl0KGYsIlx0bXJcdCVzXG4iLHJlZ25hbWVzW3JlZ10pOworCQkJc2V0dGVtcG9iaihmLHJlZyxwLDAsMCk7CisJCX0KKwkJZW1pdChmLCJcdFx0XHRcdC8vcmV0dXJuIDBcbiIpOworCQlyZXR1cm4oMCk7CisJfQorCisJLy8gRklYTUUgLSBkb2VzIHRoaXMgaGF2ZSBpbXBsaWNhdGlvbnMgZm9yIHN0cnVjdHMsIHVuaW9ucywgZnB0cnMsIGV0Yz8KKwlpZihwLT5mbGFncyZWQVJBRFIpCisJeworCQllbWl0X3ByZXBvYmooZixwLHQscmVnLDApOworCQlyZXR1cm4oMCk7CisJfQorCWlmICgocC0+ZmxhZ3MgJiAoS09OU1QgfCBEUkVGT0JKKSkgPT0gKEtPTlNUIHwgRFJFRk9CSikpIHsKKwkJaWYoREJHTVNHKQorCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gY29uc3QvZGVyZWZcbiIpOworCQltYXRjaHJlZz1tYXRjaHRlbXBrb25zdChmLCB2YWwyem1heChwLCBwLT5kdHlwKSx0bXApOworCQlpZihtYXRjaHJlZyAmJiBtYXRjaHJlZyE9dG1wKSB7CisJCQllbWl0X3NpemVtb2QoZiwgdCk7CisJCQllbWl0KGYsIlx0bGRcdCVzXG4iLHJlZ25hbWVzW21hdGNocmVnXSk7CisJCX0gZWxzZSB7CisJCQllbWl0X3ByZXBvYmooZiwgcCwgdCwgdG1wLCAwKTsKKwkJCWVtaXRfc2l6ZW1vZChmLCB0KTsKKwkJCWVtaXQoZiwgIlx0bGR0XG4iKTsKKwkJfQorCQlzZXR0ZW1wb2JqKGYsdG1wLHAsMCwwKTsKKwkJc2V0dGVtcG9iaihmLHJlZyxwLDAsMCk7CisJCWlmKHJlZyE9dG1wKQorCQkJZW1pdChmLCJcdG1yXHQlc1xuIixyZWduYW1lc1tyZWddKTsKKwkJcmV0dXJuKDEpOworCX0KKworLy8JcHJpbnRmKCJwLT5mbGFncyAleCwgdHlwZSAlZFxuIixwLT5mbGFncyx0KTsKKworCWlmIChwLT5mbGFncyAmIERSRUZPQkopIHsKKwkJaWYoREJHTVNHKQorCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gZGVyZWYgXG4iKTsKKwkJLyogRGVyZWZlcmVuY2luZyBhIHBvaW50ZXIgKi8KKwkJaWYgKHAtPmZsYWdzICYgUkVHKSB7CisJCQlzd2l0Y2ggKHQgJiBOUSkgeworCQkJY2FzZSBDSEFSOgorCQkJCWlmIChwLT5hbSAmJiBwLT5hbS0+dHlwZSA9PSBBTV9QT1NUSU5DKQorCQkJCXsKKwkJCQkJZW1pdChmLCAiXHRsZGJpbmNcdCVzXG4iLCByZWduYW1lc1twLT5yZWddKTsKKwkJCQkJcG9zdGluYz0xOworCQkJCX0KKwkJCQllbHNlIGlmIChwLT5hbSAmJiBwLT5hbS0+ZGlzcG9zYWJsZSkKKwkJCQkJZW1pdChmLAorCQkJCQkgICAgICJcdGxkYmluY1x0JXNcbi8vRGlzcG9zYWJsZSwgcG9zdGluYyBkb2Vzbid0IG1hdHRlci5cbiIsIHJlZ25hbWVzW3AtPnJlZ10pOworCQkJCWVsc2UKKwkJCQkJZW1pdChmLCAiXHRieXRcblx0bGRcdCVzXG4iLCByZWduYW1lc1twLT5yZWddKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0hPUlQ6CisJCQkJZW1pdChmLCAiXHRobGZcbiIpOworCQkJCWVtaXQoZiwgIlx0bGRcdCVzXG4iLCByZWduYW1lc1twLT5yZWddKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSU5UOgorCQkJY2FzZSBMT05HOgorCQkJY2FzZSBQT0lOVEVSOgorCQkJCWlmIChwLT5hbSAmJiBwLT5hbS0+dHlwZSA9PSBBTV9QT1NUSU5DKQorCQkJCXsKKwkJCQkJZW1pdChmLCAiXHRsZGluY1x0JXNcbiIsIHJlZ25hbWVzW3AtPnJlZ10pOworCQkJCQlwb3N0aW5jPTQ7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJZW1pdChmLCAiXHRsZFx0JXNcbiIsIHJlZ25hbWVzW3AtPnJlZ10pOworCQkJCWJyZWFrOworCQkJY2FzZSBTVFJVQ1Q6CisJCQljYXNlIFVOSU9OOgorCQkJY2FzZSBBUlJBWToKKwkJCWNhc2UgRlVOS1Q6CS8vIEZ1bmN0aW9uIHBvaW50ZXJzIGFyZSBkZXJlZmVyZW5jZWQgYnkgY2FsbGluZyB0aGVtLgorCQkJCWVtaXQoZiwgIlx0bXRcdCVzXG4iLCByZWduYW1lc1twLT5yZWddKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZnByaW50ZihzdGRlcnIsIk9ianRvcmVnIC0gdW5oYW5kbGVkIHR5cGUgJWRcbiIsdCk7CisJCQkJaWVycm9yKDApOworCQkJCWJyZWFrOworCQkJfQorCQkJcmVzdWx0PTE7CisJCX0gZWxzZSB7CisJCQllbWl0X3ByZXBvYmooZiwgcCwgdCwgdG1wLCAwKTsKKwkJCS8vIEV4Y2x1c2lvbnMgZm9yIGZwdHJzLCBzdHJ1Y3RzIGFuZCB1bmlvbnMgdG8gYXZvaWQgZG91YmxlLWRlcmVmZXJlbmNlLgorCQkJLy8gSW5jbHVkZWQgYXJyYXkgdHlwZSBpbiB0aGVzZSBleGNsdXNpb25zLiAgRklYTUUgLSBpcyB0aGlzIHN1ZmZpY2llbnQ/CisJCQlpZiAoKHQgJiBOUSkgIT0gRlVOS1QgJiYgKHQgJiBOUSkgIT0gU1RSVUNUICYmICh0ICYgTlEpICE9IFVOSU9OICYmICh0ICYgTlEpICE9IEFSUkFZKQorCQkJeworCQkJCWVtaXRfc2l6ZW1vZChmLCB0KTsKKwkJCQllbWl0KGYsICJcdGxkdFxuIik7CisJCQkJcmVzdWx0PTE7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAocC0+ZmxhZ3MgJiBSRUcpIHsKKwkJCS8vIEFscmVhZHkgaGFuZGxlZCBpbiB0aGUgcHJlYW1ibGUuCisJCQlpZihEQkdNU0cpCisJCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gcmVnICVzXG4iLCByZWduYW1lc1twLT5yZWddKTsKKwkJCWVtaXQoZiwgIlx0bXRcdCVzXG4iLCByZWduYW1lc1twLT5yZWddKTsKKwkJfSBlbHNlIGlmIChwLT5mbGFncyAmIFZBUikgeworCQkJaWYgKGlzYXV0byhwLT52LT5zdG9yYWdlX2NsYXNzKSkgeworCQkJCWlmKERCR01TRykKKwkJCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gdmFyLCBhdXRvfHJlZ1xuIik7CisJCQkJLyogRG8gd2UgbmVlZCB0byBkZWZlcmVuY2U/ICovCisJCQkJaWYgKGVsZW1lbnRhcnkpIHsKKwkJCQkJaWYgKHJlYWxfb2Zmc2V0KHApKSB7CisJCQkJCQllbWl0X2NvbnN0YW50dG90ZW1wKGYsIHJlYWxfb2Zmc2V0KHApKTsKKwkJCQkJCWlmKCFpc3N0YWNrcGFyYW0ocCkpCisJCQkJCQkJZW1pdF9zaXplbW9kKGYsIHQpOworCQkJCQkJZW1pdChmLCAiXHRsZGlkeFx0JXNcbiIsIHJlZ25hbWVzW3NwXSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQllbWl0X3NpemVtb2QoZiwgdCk7CisJCQkJCQllbWl0KGYsICJcdGxkXHQlc1xuIiwgcmVnbmFtZXNbc3BdKTsKKwkJCQkJfQorCQkJCQlyZXN1bHQ9MTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAocmVhbF9vZmZzZXQocCkpIHsKKwkJCQkJCWVtaXRfY29uc3RhbnR0b3RlbXAoZiwgcmVhbF9vZmZzZXQocCkpOworCQkJCQkJZW1pdChmLCAiXHRhZGR0XHQlc1xuIiwgcmVnbmFtZXNbc3BdKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWVtaXQoZiwgIlx0bXRcdCVzXG4iLCByZWduYW1lc1tzcF0pOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmIChpc2V4dGVybihwLT52LT5zdG9yYWdlX2NsYXNzKSkgeworCQkJCWlmKERCR01TRykKKwkJCQkJZW1pdChmLCAiXHRcdFx0XHRcdFx0Ly8gZXh0ZXJuXG4iKTsKKwkJCQllbWl0X2V4dGVybnRvdGVtcChmLCBwLT52LT5pZGVudGlmaWVyLCBwLT52YWwudm1heCk7CisJCQkJLy8gU3RydWN0cywgdW5pb25zIGFuZCBhcnJheXMgaGF2ZSB0byByZW1haW4gYXMgcG9pbnRlcnMKKwkJCQlpZiAoZWxlbWVudGFyeSkgeworCQkJCQlpZihEQkdNU0cpCisJCQkJCQllbWl0KGYsICJcdFx0XHRcdFx0XHQvL2V4dGVybiBkZXJlZlxuIik7CisJCQkJCWVtaXRfc2l6ZW1vZChmLCB0KTsKKwkJCQkJZW1pdChmLCAiXHRsZHRcbiIpOworCQkJCQlyZXN1bHQ9MTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGlzc3RhdGljKHAtPnYtPnN0b3JhZ2VfY2xhc3MpKSB7CisJCQkJaWYoREJHTVNHKQorCQkJCQllbWl0KGYsICJcdFx0XHRcdFx0XHQvL3N0YXRpYyAlc1xuIiwgcC0+ZmxhZ3MgJiBWQVJBRFIgPyAidmFyYWRyIiA6ICJub3QgdmFyYWRyIik7CisJCQkJZW1pdF9zdGF0aWN0b3RlbXAoZiwgbGFicHJlZml4LCB6bTJsKHAtPnYtPm9mZnNldCksIHAtPnZhbC52bWF4KTsKKwkJCQkvLyBTdHJ1Y3RzLCB1bmlvbnMgYW5kIGFycmF5cyBoYXZlIHRvIHJlbWFpbiBhcyBwb2ludGVycworCQkJCWlmIChlbGVtZW50YXJ5KSB7CisJCQkJCWlmKERCR01TRykKKwkJCQkJCWVtaXQoZiwgIlx0XHRcdFx0XHRcdC8vc3RhdGljIGRlcmVmXG4iKTsKKwkJCQkJZW1pdF9zaXplbW9kKGYsIHQpOworCQkJCQllbWl0KGYsICJcdGxkdFxuIik7CisJCQkJCXJlc3VsdD0xOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRmKCJPYmp0b3RlbXA6IFVuaGFuZGxlZCBzdG9yYWdlIGNsYXNzOiAlZFxuIiwgcC0+di0+c3RvcmFnZV9jbGFzcyk7CisJCQkJaWVycm9yKDApOworCQkJfQorCQl9IGVsc2UgaWYgKHAtPmZsYWdzICYgS09OU1QpIHsKKwkJCWlmKERCR01TRykKKwkJCQllbWl0KGYsICJcdFx0XHRcdFx0XHQvLyBjb25zdFxuIik7CisJCQllbWl0X2NvbnN0YW50dG90ZW1wKGYsIHZhbDJ6bWF4KHAsIHQpKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiT2JqdG90ZW1wOiB1bmtub3duIGZsYWdzICVkXG4iLCBwLT5mbGFncyk7CisJCQlpZXJyb3IoMCk7CisJCX0KKwl9CisJaWYocmVnIT10bXApCisJCWVtaXQoZiwiXHRtclx0JXNcbiIscmVnbmFtZXNbcmVnXSk7CisJc2V0dGVtcG9iaihmLHJlZyxwLC1wb3N0aW5jLDApOworCXNldHRlbXBvYmooZix0bXAscCwtcG9zdGluYywwKTsKKwlyZXR1cm4ocmVzdWx0KTsKK30KKwpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvYWxwaGEvbWFjaGluZS5jIGIvbWFjaGluZXMvYWxwaGEvbWFjaGluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM1MDM4YzAKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9hbHBoYS9tYWNoaW5lLmMKQEAgLTAsMCArMSwxNzA3IEBACisvKiAgQ29kZSBnZW5lcmF0b3IgZm9yIGEgREVDIEFscGhhIDY0Yml0IFJJU0MgY3B1IHdpdGggMzIgICAgICAgKi8KKy8qICBnZW5lcmFsIHB1cnBvc2UgYW5kIDMyIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycy4gICAgICAgICAgICAqLworCisjaW5jbHVkZSAic3VwcC5oIgorCitzdGF0aWMgY2hhciBGSUxFX1tdPV9fRklMRV9fOworCisjaW5jbHVkZSAiZHdhcmYyLmMiCisKKy8qICBQdWJsaWMgZGF0YSB0aGF0IE1VU1QgYmUgdGhlcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBOYW1lIGFuZCBjb3B5cmlnaHQuICovCitjaGFyIGNnX2NvcHlyaWdodFtdPSJ2YmNjIGNvZGUtZ2VuZXJhdG9yIGZvciBERUMgQWxwaGEgVjAuM2MgKGMpIGluIDE5OTctMjAwMCBieSBWb2xrZXIgQmFydGhlbG1hbm4iOworCisvKiAgQ29tbWFuZGxpbmUtZmxhZ3MgdGhlIGNvZGUtZ2VuZXJhdG9yIGFjY2VwdHMgICAgICAgICAgICAgICAgKi8KK2ludCBnX2ZsYWdzW01BWEdGXT17VkFMRkxBRyxWQUxGTEFHLDAsMCwwLDAsMH07CitjaGFyICpnX2ZsYWdzX25hbWVbTUFYR0ZdPXsiY3B1IiwiZnB1IiwiY29uc3QtaW4tZGF0YSIsInNkIiwibWVyZ2UtY29uc3RhbnRzIiwic3RhYnMiLCJuby1idWlsdGlucyJ9OwordW5pb24gcHBpIGdfZmxhZ3NfdmFsW01BWEdGXTsKKworLyogIEFsaWdubWVudC1yZXF1aXJlbWVudHMgZm9yIGFsbCB0eXBlcyBpbiBieXRlcy4gICAgICAgICAgICAgICovCit6bWF4IGFsaWduW01BWF9UWVBFKzFdOworCisvKiAgQWxpZ25tZW50IHRoYXQgaXMgc3VmZmljaWVudCBmb3IgZXZlcnkgb2JqZWN0LiAgICAgICAgICAgICAgKi8KK3ptYXggbWF4YWxpZ247CisKKy8qICBDSEFSX0JJVCBmb3IgdGhlIHRhcmdldCBtYWNoaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworem1heCBjaGFyX2JpdDsKKworLyogIFRhYmVsbGUgZnVlciBkaWUgR3JvZXNzZSBkZXIgZWluemVsbmVuIFR5cGVuICAgICAgICAgICAgICAgICovCit6bWF4IHNpemV0YWJbTUFYX1RZUEUrMV07CisKKy8qICBNaW5pbXVtIGFuZCBNYXhpbXVtIHZhbHVlcyBlYWNoIHR5cGUgY2FuIGhhdmUuICAgICAgICAgICAgICAqLworLyogIE11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gaW5pdF9jZygpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IHRfbWluW01BWF9UWVBFKzFdOworenVtYXggdF9tYXhbTUFYX1RZUEUrMV07Cit6dW1heCB0dV9tYXhbTUFYX1RZUEUrMV07CisKKy8qICBOYW1lcyBvZiBhbGwgcmVnaXN0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworY2hhciAqcmVnbmFtZXNbTUFYUisxXT17Im5vcmVnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIkMCIsIiQxIiwiJDIiLCIkMyIsIiQ0IiwiJDUiLCIkNiIsIiQ3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIkOCIsIiQ5IiwiJDEwIiwiJDExIiwiJDEyIiwiJDEzIiwiJDE0IiwiJDE1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIkMTYiLCIkMTciLCIkMTgiLCIkMTkiLCIkMjAiLCIkMjEiLCIkMjIiLCIkMjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiQyNCIsIiQyNSIsIiQyNiIsIiQyNyIsIiQyOCIsIiQyOSIsIiQzMCIsIiQzMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiJGYwIiwiJGYxIiwiJGYyIiwiJGYzIiwiJGY0IiwiJGY1IiwiJGY2IiwiJGY3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIkZjgiLCIkZjkiLCIkZjEwIiwiJGYxMSIsIiRmMTIiLCIkZjEzIiwiJGYxNCIsIiRmMTUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiRmMTYiLCIkZjE3IiwiJGYxOCIsIiRmMTkiLCIkZjIwIiwiJGYyMSIsIiRmMjIiLCIkZjIzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIkZjI0IiwiJGYyNSIsIiRmMjYiLCIkZjI3IiwiJGYyOCIsIiRmMjkiLCIkZjMwIiwiJGYzMSJ9OworCisvKiAgVGhlIFNpemUgb2YgZWFjaCByZWdpc3RlciBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggcmVnc2l6ZVtNQVhSKzFdOworCisvKiAgQSB0eXBlIHdoaWNoIGNhbiBzdG9yZSBlYWNoIHJlZ2lzdGVyLiAqLworc3RydWN0IFR5cCAqcmVndHlwZVtNQVhSKzFdOworCisvKiAgcmVnc2FbcmVnXSE9MCBpZiBhIGNlcnRhaW4gcmVnaXN0ZXIgaXMgYWxsb2NhdGVkIGFuZCBzaG91bGQgKi8KKy8qICBub3QgYmUgdXNlZCBieSB0aGUgY29tcGlsZXIgcGFzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworaW50IHJlZ3NhW01BWFIrMV07CisKKy8qICBTcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXJzIG1heSBiZSBzY3JhdGNoZWQgYnkgZnVuY3Rpb25zLiAgICAqLworaW50IHJlZ3NjcmF0Y2hbTUFYUisxXT17MCwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAxLDEsMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMSwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxfTsKKworc3RydWN0IHJlZ19oYW5kbGUgZW1wdHlfcmVnX2hhbmRsZT17MH07CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgUHJpdmF0ZSBkYXRhIGFuZCBmdW5jdGlvbnMuICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgbG9uZyBtYWxpZ25bTUFYX1RZUEUrMV09ICB7MSwxLDIsNCw4LDgsNCw4LDgsMSw4LDEsMSwxLDQsMX07CitzdGF0aWMgbG9uZyBtc2l6ZXRhYltNQVhfVFlQRSsxXT17MSwxLDIsNCw4LDgsNCw4LDgsMCw4LDAsMCwwLDQsMH07CisKK3N0YXRpYyBzdHJ1Y3QgVHlwIGx0eXA9e0xPTkd9OworCitzdGF0aWMgY2hhciB4X3RbTUFYX1RZUEUrMV09eyc/JywnYicsJ3cnLCdsJywncScsJ3EnLCdzJywndCcsJ3QnLCc/JywncSd9OworCitzdGF0aWMgaW50IHNwPTMxOyAgICAgICAgICAgICAgICAgIC8qICBTdGFja3BvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIGludCBncD0zMDsgICAgICAgICAgICAgICAgICAvKiAgR2xvYmFsIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0YXRpYyBpbnQgbHI9Mjc7ICAgICAgICAgICAgICAgICAgLyogIExpbmsgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICovCitzdGF0aWMgaW50IHZwPTI4OyAgICAgICAgICAgICAgICAgIC8qICBWaXJ0dWFsIGZyYW1lIHBvaW50ZXIgICAgICAgICAgICAgICAqLworc3RhdGljIGludCByMzE9MzI7ICAgICAgICAgICAgICAgICAvKiAgUmVhZCBhcyB6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0YXRpYyBpbnQgZjMxPTY0OyAgICAgICAgICAgICAgICAgLyogIFJlYWQgYXMgemVybyAgICAgICAgICAgICAgICAgICAgICAgICovCitzdGF0aWMgaW50IHNkPTE0OyAgICAgICAgICAgICAgICAgIC8qICBTbWFsbERhdGFQb2ludGVyICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIGludCB0MT0yLHQyPTMsdDM9NDsgICAgICAgICAvKiAgVGVtcG9yYXJpZXMgdXNlZCBieSBjb2RlIGdlbmVyYXRvciAgKi8KK3N0YXRpYyBpbnQgdDQ9NSx0NT02Oworc3RhdGljIGludCBmMT0zNCxmMj0zNSxmMz0zNjsgICAgICAvKiAgVGVtcG9yYXJpZXMgdXNlZCBieSBjb2RlIGdlbmVyYXRvciAgKi8KKworI2RlZmluZSBEQVRBIDAKKyNkZWZpbmUgQlNTIDEKKyNkZWZpbmUgQ09ERSAyCisKK3N0YXRpYyBjaGFyICptYXJyYXlbXT17Il9fQUxQSEFfXyIsMH07CisKK3N0YXRpYyBpbnQgc2VjdGlvbj0tMSxuZXdvYmosY3JzYXZlLGhlbHBsLGhlbHBzLHN0YWJzOworc3RhdGljIGNoYXIgKmNvZGVuYW1lPSJcdC50ZXh0XG4iLCpkYXRhbmFtZT0iXHQuZGF0YVxuIiwqYnNzbmFtZT0iIjsKK3N0YXRpYyBpbnQgYmFsaWduKHN0cnVjdCBvYmogKik7CitzdGF0aWMgY2hhciAqbGFicHJlZml4PSIkQyIsKmlkcHJlZml4PSIiOworc3RhdGljIGxvbmcgZnJhbWVzaXplLGZyYW1lb2Zmc2V0Oworc3RhdGljIHZvaWQgcHJvYmoyKEZJTEUgKmYsc3RydWN0IG9iaiAqcCxpbnQgdCk7CisKKyNkZWZpbmUgRVNHTiAxCisjZGVmaW5lIEVVTlMgMgorc3RhdGljIGludCBzdFtNQVhSKzFdOworCitzdGF0aWMgc3RydWN0IGZwY29uc3RsaXN0IHsKKyAgc3RydWN0IGZwY29uc3RsaXN0ICpuZXh0OworICBpbnQgbGFiZWwsdHlwOworICB1bmlvbiBhdHlwcyB2YWw7Cit9ICpmaXJzdGZwYzsKKworc3RhdGljIHZvaWQgbW92ZV9yZWcoRklMRSAqZixpbnQgcyxpbnQgdCkKK3sKKyAgaWYodD09cjMxfHx0PT1mMzEpIGllcnJvcigwKTsKKyAgaWYoczw9MzImJnQ+MzIpIGllcnJvcigwKTsKKyAgaWYodDw9MzImJnM+MzIpIGllcnJvcigwKTsKKyAgaWYocz09dCkgcmV0dXJuOworICBpZihzPD0zMil7CisgICAgZW1pdChmLCJcdGJpc1x0JXMsJXMsJXNcbiIscmVnbmFtZXNbcjMxXSxyZWduYW1lc1tzXSxyZWduYW1lc1t0XSk7CisgIH1lbHNleworICAgIGVtaXQoZiwiXHRjcHlzXHQlcywlcywlc1xuIixyZWduYW1lc1tzXSxyZWduYW1lc1tzXSxyZWduYW1lc1t0XSk7CisgIH0KKyAgc3RbdF09c3Rbc107Cit9CisKK3N0YXRpYyBpbnQgYWRkZnBjb25zdChzdHJ1Y3Qgb2JqICpvLGludCB0KQoreworICBzdHJ1Y3QgZnBjb25zdGxpc3QgKnA9Zmlyc3RmcGM7CisgIHQmPU5ROworICBpZihnX2ZsYWdzWzRdJlVTRURGTEFHKXsKKyAgICBmb3IocD1maXJzdGZwYztwO3A9cC0+bmV4dCl7CisgICAgICBpZih0PT1wLT50eXApeworICAgICAgICBldmFsX2NvbnN0KCZwLT52YWwsdCk7CisgICAgICAgIGlmKHQ9PUlOVCYmem1lcXRvKHZtYXgsemkyem0oby0+dmFsLnZpbnQpKSkgcmV0dXJuIHAtPmxhYmVsOworICAgICAgICBpZih0PT1MT05HJiZ6bWVxdG8odm1heCx6bDJ6bShvLT52YWwudmxvbmcpKSkgcmV0dXJuIHAtPmxhYmVsOworICAgICAgICBpZih0PT1MTE9ORyYmem1lcXRvKHZtYXgsemxsMnptKG8tPnZhbC52bGxvbmcpKSkgcmV0dXJuIHAtPmxhYmVsOworICAgICAgICBpZih0PT1GTE9BVCYmemxkZXF0byh2bGRvdWJsZSx6ZjJ6bGQoby0+dmFsLnZmbG9hdCkpKSByZXR1cm4gcC0+bGFiZWw7CisgICAgICAgIGlmKHQ9PURPVUJMRSYmemxkZXF0byh2bGRvdWJsZSx6ZDJ6bGQoby0+dmFsLnZkb3VibGUpKSkgcmV0dXJuIHAtPmxhYmVsOworICAgICAgICBpZih0PT1MRE9VQkxFJiZ6bGRlcXRvKHZsZG91YmxlLG8tPnZhbC52bGRvdWJsZSkpIHJldHVybiBwLT5sYWJlbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcD1teW1hbGxvYyhzaXplb2Yoc3RydWN0IGZwY29uc3RsaXN0KSk7CisgIHAtPm5leHQ9Zmlyc3RmcGM7CisgIHAtPmxhYmVsPSsrbGFiZWw7CisgIHAtPnR5cD10OworICBwLT52YWw9by0+dmFsOworICBmaXJzdGZwYz1wOworICByZXR1cm4gcC0+bGFiZWw7Cit9CisKKyNkZWZpbmUgUkVHX0lORCAxCisjZGVmaW5lIElNTV9JTkQgMgorCitzdGF0aWMgc3RydWN0IG9iaiAqY2FtKGludCBmbGFncyxpbnQgYmFzZSxpbnQgYWxpZ24sbG9uZyBvZmZzZXQpCisvKiAgSW5pdGlhbGl6ZXMgYW4gYWRkcmVzc2luZy1tb2RlIHN0cnVjdHVyZSBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gICAqLworLyogIHRoYXQgb2JqZWN0LiBXaWxsIG5vdCBzdXJ2aXZlIGEgc2Vjb25kIGNhbGwhICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgc3RhdGljIHN0cnVjdCBvYmogb2JqOworICBzdGF0aWMgc3RydWN0IEFkZHJlc3NpbmdNb2RlIGFtOworICBvYmouYW09JmFtOworICBhbS5mbGFncz1mbGFnczsKKyAgYW0uYmFzZT1iYXNlOworICBhbS5vZmZzZXQ9b2Zmc2V0OworICBhbS5hbGlnbj1hbGlnbjsKKyAgcmV0dXJuICZvYmo7Cit9CisKK3ZvaWQgdGl0bGUoRklMRSAqZikKK3sKKyAgc3RhdGljIGludCBkb25lOworICBleHRlcm4gY2hhciAqaW5uYW1lOyAvKmdybXBmKi8KKyAgaWYoIWRvbmUmJmYpeworICAgIGRvbmU9MTsKKyAgICBlbWl0KGYsIlx0LmZpbGVcdFwiJXNcIlxuIixpbm5hbWUpOworICB9Cit9IAorCitzdGF0aWMgY2hhciAqZGN0W109eyI/PyIsImJ5dGUiLCJzaG9ydCIsImxvbmciLCJxdWFkIiwibG9uZyIsImxvbmciLCJxdWFkIiwiPz8iLCI/PyIsIj8/IiwiPz8ifTsKKworc3RhdGljIHZvaWQgbG9hZF9hZGRyZXNzKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdHlwKQorLyogIEdlbmVyYXRlcyBjb2RlIHRvIGxvYWQgdGhlIGFkZHJlc3Mgb2YgYSB2YXJpYWJsZSBpbnRvIHJlZ2lzdGVyIHIuICAgKi8KK3sKKyAgaWYoKG8tPmZsYWdzJlZBUikmJihvLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikpeworICAgIGxvbmcgb2Y9em0ybChvLT52LT5vZmZzZXQpOworICAgIGlmKG9mPj0wKQorICAgICAgb2YrPWZyYW1lb2Zmc2V0K3ptMmwoby0+dmFsLnZsb25nKTsKKyAgICBlbHNlCisgICAgICBvZj0tb2Ytem0ybChtYXhhbGlnbikrZnJhbWVzaXplK3ptMmwoby0+dmFsLnZtYXgpOworICAgIGlmKG9mPjMyNzY3KSBpZXJyb3IoMCk7CisgICAgZW1pdChmLCJcdGxkYVx0JXMsJWxkKCVzKVxuIixyZWduYW1lc1tyXSxvZixyZWduYW1lc1tzcF0pOworICB9ZWxzZXsKKyAgICBlbWl0KGYsIlx0bGRhXHQlcywiLHJlZ25hbWVzW3JdKTsKKyAgICBwcm9iajIoZixvLHR5cCk7ZW1pdChmLCJcbiIpOworICB9CisgIHN0W3JdPUVTR047Cit9CitzdGF0aWMgdm9pZCBsb2FkX29iaihGSUxFICpmLGludCByLHN0cnVjdCBvYmogKm8saW50IHR5cCxpbnQgdG1wKQoreworICBpbnQgYWRyLHNoaWZ0LGFsOworICBzd2l0Y2godHlwJk5RKXsKKyAgY2FzZSBQT0lOVEVSOgorICBjYXNlIExET1VCTEU6CisgIGNhc2UgRE9VQkxFOgorICBjYXNlIEZMT0FUOgorICBjYXNlIExMT05HOgorICBjYXNlIExPTkc6CisgIGNhc2UgSU5UOgorICAgIGVtaXQoZiwiXHRsZCVjXHQlcywiLHhfdFt0eXAmTlFdLHJlZ25hbWVzW3JdKTsKKyAgICBwcm9iajIoZixvLHR5cCk7ZW1pdChmLCJcbiIpOworICAgIHN0W3JdPUVTR047cmV0dXJuOworICBjYXNlIFNIT1JUOgorICAgIGFsPWJhbGlnbihvKTsKKyAgICBpZihhbD49MCl7CisgICAgICBlbWl0KGYsIlx0bGRxX3VcdCVzLCIscmVnbmFtZXNbcl0pOworICAgICAgcHJvYmoyKGYsbyx0eXApO2VtaXQoZiwiXG4iKTsKKyAgICAgIHNoaWZ0PTY0LTE2LWFsKjg7CisgICAgICBpZihzaGlmdCkgZW1pdChmLCJcdHNsbFx0JXMsJWQsJXNcbiIscmVnbmFtZXNbcl0sc2hpZnQscmVnbmFtZXNbcl0pOworICAgICAgaWYodHlwJlVOU0lHTkVEKXsKKyAgICAgICAgZW1pdChmLCJcdHNybFx0JXMsJWQsJXNcbiIscmVnbmFtZXNbcl0sNjQtMTYscmVnbmFtZXNbcl0pOworICAgICAgICBzdFtyXT1FVU5TOworICAgICAgfWVsc2V7CisgICAgICAgIGVtaXQoZiwiXHRzcmFcdCVzLCVkLCVzXG4iLHJlZ25hbWVzW3JdLDY0LTE2LHJlZ25hbWVzW3JdKTsKKyAgICAgICAgc3Rbcl09RVNHTjsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYWRyPTA7CisgICAgaWYoby0+YW0mJm8tPmFtLT5vZmZzZXQ9PTApCisgICAgICBhZHI9by0+YW0tPmJhc2U7CisgICAgZWxzZSBpZih6bWVxdG8oby0+dmFsLnZtYXgsbDJ6bSgwTCkpKQorICAgICAgYWRyPW8tPnJlZzsKKyAgICBpZighYWRyKXsKKyAgICAgIGFkcj10bXA7bG9hZF9hZGRyZXNzKGYsYWRyLG8sUE9JTlRFUik7CisgICAgfQorCisgICAgaWYodHlwJlVOU0lHTkVEKXsKKyAgICAgIGVtaXQoZiwiXHRiaWNcdCVzLDYsJXNcbiIscmVnbmFtZXNbYWRyXSxyZWduYW1lc1t0NF0pOyAvKiBsZHFfdSA/ICovCisgICAgICBlbWl0KGYsIlx0bGRxXHQlcywwKCVzKVxuIixyZWduYW1lc1t0NV0scmVnbmFtZXNbdDRdKTsKKyAgICAgIGVtaXQoZiwiXHRiaWNcdCVzLDEsJXNcbiIscmVnbmFtZXNbYWRyXSxyZWduYW1lc1t0NF0pOworICAgICAgZW1pdChmLCJcdGV4dHdsXHQlcywlcywlc1xuIixyZWduYW1lc1t0NV0scmVnbmFtZXNbdDRdLHJlZ25hbWVzW3JdKTsKKyAgICAgIC8qCisgICAgICBlbWl0KGYsIlx0YmljXHQlcywyLCVzXG4iLHJlZ25hbWVzW2Fkcl0scmVnbmFtZXNbdDRdKTsKKyAgICAgIGVtaXQoZiwiXHRhbmRcdCVzLDIsJXNcbiIscmVnbmFtZXNbYWRyXSxyZWduYW1lc1t0NV0pOworICAgICAgZW1pdChmLCJcdGxkcVx0JXMsMCglcylcbiIscmVnbmFtZXNbcl0scmVnbmFtZXNbdDRdKTsKKyAgICAgIGVtaXQoZiwiXHRleHR3aFx0JXMsJXMsJXNcbiIscmVnbmFtZXNbcl0scmVnbmFtZXNbdDVdLHJlZ25hbWVzW3JdKTsKKyAgICAgICovCisgICAgICBzdFtyXT1FVU5TO3JldHVybjsKKyAgICB9ZWxzZXsKKyAgICAgIGVtaXQoZiwiXHRiaWNcdCVzLDYsJXNcbiIscmVnbmFtZXNbYWRyXSxyZWduYW1lc1t0NF0pOworICAgICAgZW1pdChmLCJcdGFuZFx0JXMsNiwlc1xuIixyZWduYW1lc1thZHJdLHJlZ25hbWVzW3Q1XSk7CisgICAgICBlbWl0KGYsIlx0bGRxXHQlcywwKCVzKVxuIixyZWduYW1lc1tyXSxyZWduYW1lc1t0NF0pOworICAgICAgZW1pdChmLCJcdGxkYVx0JXMsMiglcylcbiIscmVnbmFtZXNbdDVdLHJlZ25hbWVzW3Q1XSk7CisgICAgICBlbWl0KGYsIlx0ZXh0cWhcdCVzLCVzLCVzXG4iLHJlZ25hbWVzW3JdLHJlZ25hbWVzW3Q1XSxyZWduYW1lc1tyXSk7CisgICAgICBlbWl0KGYsIlx0c3JhXHQlcyw0OCwlc1xuIixyZWduYW1lc1tyXSxyZWduYW1lc1tyXSk7CisgICAgICBzdFtyXT1FU0dOO3JldHVybjsKKyAgICB9CisgIGNhc2UgQ0hBUjoKKyAgICBhbD1iYWxpZ24obyk7CisgICAgaWYoYWw+PTApeworICAgICAgZW1pdChmLCJcdGxkcV91XHQlcywiLHJlZ25hbWVzW3JdKTsKKyAgICAgIHByb2JqMihmLG8sdHlwKTtlbWl0KGYsIlxuIik7CisgICAgICBzaGlmdD02NC04LWFsKjg7CisgICAgICBpZihzaGlmdCYmYWwpIGVtaXQoZiwiXHRzbGxcdCVzLCVkLCVzXG4iLHJlZ25hbWVzW3JdLHNoaWZ0LHJlZ25hbWVzW3JdKTsKKyAgICAgIGlmKHR5cCZVTlNJR05FRCl7CisgICAgICAgIGlmKGFsPT0wKQorICAgICAgICAgIGVtaXQoZiwiXHRhbmRcdCVzLDI1NSwlc1xuIixyZWduYW1lc1tyXSxyZWduYW1lc1tyXSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBlbWl0KGYsIlx0c3JsXHQlcywlZCwlc1xuIixyZWduYW1lc1tyXSw2NC04LHJlZ25hbWVzW3JdKTsKKyAgICAgICAgc3Rbcl09RVVOUzsKKyAgICAgIH1lbHNleworICAgICAgICBpZihhbD09MCkKKyAgICAgICAgICBlbWl0KGYsIlx0c2V4dGJcdCVzLCVzXG4iLHJlZ25hbWVzW3JdLHJlZ25hbWVzW3JdKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGVtaXQoZiwiXHRzcmFcdCVzLCVkLCVzXG4iLHJlZ25hbWVzW3JdLDY0LTgscmVnbmFtZXNbcl0pOworICAgICAgICBzdFtyXT1FU0dOOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZih0eXAmVU5TSUdORUQpeworICAgICAgYWRyPTA7CisgICAgICBpZihvLT5hbSYmby0+YW0tPm9mZnNldD09MCkKKyAgICAgICAgYWRyPW8tPmFtLT5iYXNlOworICAgICAgZWxzZSBpZih6bWVxdG8oby0+dmFsLnZtYXgsbDJ6bSgwTCkpKQorICAgICAgICBhZHI9by0+cmVnOworICAgICAgaWYoIWFkcil7CisgICAgICAgIGFkcj10bXA7IGxvYWRfYWRkcmVzcyhmLGFkcixvLFBPSU5URVIpOworICAgICAgfQorICAgICAgZW1pdChmLCJcdGxkcV91XHQlcywwKCVzKVxuIixyZWduYW1lc1tyXSxyZWduYW1lc1thZHJdKTsKKyAgICAgIGVtaXQoZiwiXHRleHRibFx0JXMsJXMsJXNcbiIscmVnbmFtZXNbcl0scmVnbmFtZXNbYWRyXSxyZWduYW1lc1tyXSk7CisgICAgICBzdFtyXT1FVU5TO3JldHVybjsKKyAgICB9ZWxzZXsKKyAgICAgIGVtaXQoZiwiXHRsZHFfdVx0JXMsIixyZWduYW1lc1t0NV0pOworICAgICAgcHJvYmoyKGYsbyx0eXApO2VtaXQoZiwiXG5cdGxkYVx0JXMsIixyZWduYW1lc1t0NF0pOworICAgICAgaWYoby0+YW0pIG8tPmFtLT5vZmZzZXQrKzsgZWxzZSBvLT52YWwudm1heD16bWFkZChvLT52YWwudm1heCxsMnptKDFMKSk7CisgICAgICBwcm9iajIoZixvLHR5cCk7CisgICAgICBpZihvLT5hbSkgby0+YW0tPm9mZnNldC0tOyBlbHNlIG8tPnZhbC52bWF4PXptc3ViKG8tPnZhbC52bWF4LGwyem0oMUwpKTsKKyAgICAgIGVtaXQoZiwiXG5cdGV4dHFoXHQlcywlcywlc1xuIixyZWduYW1lc1t0NV0scmVnbmFtZXNbdDRdLHJlZ25hbWVzW3Q1XSk7CisgICAgICBlbWl0KGYsIlx0c3JhXHQlcyw1Niwlc1xuIixyZWduYW1lc1t0NV0scmVnbmFtZXNbcl0pOworICAgICAgc3Rbcl09RVNHTjtyZXR1cm47CisgICAgfQorICB9CisgIGllcnJvcigwKTsKK30KK3N0YXRpYyB2b2lkIGxvYWRfcmVnKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdHlwLGludCB0bXApCisvKiAgR2VuZXJhdGVzIGNvZGUgdG8gbG9hZCBhIG1lbW9yeSBvYmplY3QgaW50byByZWdpc3RlciByLiB0bXAgaXMgYSAgICAqLworLyogIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciB3aGljaCBtYXkgYmUgdXNlZC4gdG1wIGNhbiBiZSByLiAgICAgICAgICAgKi8KK3sKKyAgdHlwJj1OVTsKKyAgaWYoby0+YW0peworICAgIGxvYWRfb2JqKGYscixvLHR5cCx0bXApOworICAgIHJldHVybjsKKyAgfQorICBpZihvLT5mbGFncyZLT05TVCl7CisgICAgbG9uZyBsO2ludCBsYWI7CisgICAgZXZhbF9jb25zdCgmby0+dmFsLHR5cCk7CisgICAgaWYoSVNGTE9BVCh0eXApKXsKKyAgICAgIGxhYj1hZGRmcGNvbnN0KG8sdHlwKTsKKyAgICAgIGVtaXQoZiwiXHRsZGFcdCVzLCVzJWRcbiIscmVnbmFtZXNbdG1wXSxsYWJwcmVmaXgsbGFiKTsKKyAgICAgIGVtaXQoZiwiXHRsZCVjXHQlcywwKCVzKVxuIix4X3RbdHlwJk5RXSxyZWduYW1lc1tyXSxyZWduYW1lc1t0bXBdKTsKKyAgICAgIHN0W3JdPUVTR047CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHptbGVxKHZtYXgsbDJ6bSgzMjc2NykpJiZ6bWxlcShsMnptKC0zMjc2OCksdm1heCkpeworICAgICAgZW1pdChmLCJcdGxkYVx0JXMsJWxkKCVzKVxuIixyZWduYW1lc1tyXSx6bTJsKHZtYXgpLHJlZ25hbWVzW3IzMV0pOworICAgIH1lbHNleworLyogICAgICAgaWYoKHR5cCZOUSk8SU5UKSBpZXJyb3IoMCk7ICovCisgICAgICBsYWI9YWRkZnBjb25zdChvLHR5cCk7CisgICAgICBlbWl0KGYsIlx0bGRhXHQlcywlcyVkXG4iLHJlZ25hbWVzW3RtcF0sbGFicHJlZml4LGxhYik7CisgICAgICBlbWl0KGYsIlx0bGRxXHQlcywwKCVzKVxuIixyZWduYW1lc1tyXSxyZWduYW1lc1t0bXBdKTsKKyAgICB9CisgICAgc3Rbcl09RVNHTjsKKyAgICByZXR1cm47CisgIH0KKyAgaWYoKG8tPmZsYWdzJlZBUikmJihvLT52LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk58fG8tPnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQykpeworICAgIGlmKCEoby0+ZmxhZ3MmVkFSQURSKSl7CisgICAgICBsb2FkX2FkZHJlc3MoZix0bXAsbyxQT0lOVEVSKTsKKyAgICAgIGxvYWRfb2JqKGYscixjYW0oSU1NX0lORCx0bXAsYmFsaWduKG8pLDBMKSx0eXAsdG1wKTsKKyAgICB9ZWxzZXsKKyAgICAgIGxvYWRfYWRkcmVzcyhmLHIsbyxQT0lOVEVSKTsKKyAgICB9CisgIH1lbHNleworICAgIGlmKG8tPmFtfHwoby0+ZmxhZ3MmKERSRUZPQkp8UkVHKSk9PVJFRyl7CisgICAgICBpZihyIT1vLT5yZWcpCisgICAgICAgIG1vdmVfcmVnKGYsby0+cmVnLHIpOworICAgIH1lbHNleworICAgICAgaWYoby0+ZmxhZ3MmRFJFRk9CSikgaWVycm9yKDApOworICAgICAgbG9hZF9vYmooZixyLG8sdHlwLHRtcCk7CisgICAgfQorICB9Cit9CisKKworc3RhdGljIHZvaWQgc3RvcmVfcmVnKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdHlwKQorLyogIEdlbmVyYXRlcyBjb2RlIHRvIHN0b3JlIHJlZ2lzdGVyIHIgaW50byBtZW1vcnkgb2JqZWN0IG8uICAgICAgICAgICAgKi8KK3sKKyAgaW50IGFkcix0Nix0NzsKKyAgaWYoKG8tPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpIGllcnJvcigwKTsKKyAgaWYocj09dDEpeyB0Nj10Mjt0Nz10Mzt9CisgIGVsc2UgaWYocj09dDIpIHt0Nj10MTt0Nz10Mzt9CisgIGVsc2Uge3Q2PXQxO3Q3PXQyO30KKyAgaWYoKHR5cCZOUSk+U0hPUlQpeworICAgIGlmKChvLT5mbGFncyZWQVIpJiYoby0+di0+c3RvcmFnZV9jbGFzcz09RVhURVJOfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpKXsKKyAgICAgIGxvYWRfYWRkcmVzcyhmLHQ2LG8sUE9JTlRFUik7CisgICAgICBlbWl0KGYsIlx0c3QlY1x0JXMsMCglcylcbiIseF90W3R5cCZOUV0scmVnbmFtZXNbcl0scmVnbmFtZXNbdDZdKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZW1pdChmLCJcdHN0JWNcdCVzLCIseF90W3R5cCZOUV0scmVnbmFtZXNbcl0pOworICAgIHByb2JqMihmLG8sdHlwKTtlbWl0KGYsIlxuIik7CisgICAgcmV0dXJuOworICB9ZWxzZXsKKyAgICBhZHI9MDsKKyAgICBpZihvLT5hbSYmby0+YW0tPm9mZnNldD09MCl7CisgICAgICBhZHI9by0+YW0tPmJhc2U7CisgICAgICBpZihhZHI8MXx8YWRyPjMyKSBpZXJyb3IoMCk7CisgICAgfWVsc2UgaWYoKG8tPmZsYWdzJlJFRykmJnptZXF0byhvLT52YWwudm1heCxsMnptKDBMKSkpeworICAgICAgYWRyPW8tPnJlZzsKKyAgICAgIGlmKGFkcjwxfHxhZHI+MzIpIGllcnJvcigwKTsKKyAgICB9CisgICAgaWYoIWFkcil7CisgICAgICBhZHI9dDc7IGxvYWRfYWRkcmVzcyhmLGFkcixvLFBPSU5URVIpOworICAgIH0KKyAgICBpZihhZHI8MXx8YWRyPjMyKSBpZXJyb3IoMCk7CisgICAgaWYoKHR5cCZOUSk9PVNIT1JUKXsKKyAgICAgIGVtaXQoZiwiXHRiaWNcdCVzLDIsJXNcbiIscmVnbmFtZXNbYWRyXSxyZWduYW1lc1t0NF0pOworICAgICAgZW1pdChmLCJcdGxkbFx0JXMsMCglcylcbiIscmVnbmFtZXNbdDZdLHJlZ25hbWVzW3Q0XSk7CisgICAgICBlbWl0KGYsIlx0YW5kXHQlcywyLCVzXG4iLHJlZ25hbWVzW2Fkcl0scmVnbmFtZXNbdDVdKTsKKyAgICAgIGVtaXQoZiwiXHRtc2t3bFx0JXMsJXMsJXNcbiIscmVnbmFtZXNbdDZdLHJlZ25hbWVzW3Q1XSxyZWduYW1lc1t0Nl0pOworICAgICAgZW1pdChmLCJcdGluc3dsXHQlcywlcywlc1xuIixyZWduYW1lc1tyXSxyZWduYW1lc1t0NV0scmVnbmFtZXNbdDddKTsKKyAgICAgIGVtaXQoZiwiXHRiaXNcdCVzLCVzLCVzXG4iLHJlZ25hbWVzW3Q2XSxyZWduYW1lc1t0N10scmVnbmFtZXNbdDZdKTsKKyAgICAgIGVtaXQoZiwiXHRzdGxcdCVzLDAoJXMpXG4iLHJlZ25hbWVzW3Q2XSxyZWduYW1lc1t0NF0pOworICAgICAgcmV0dXJuOworICAgIH1lbHNleworICAgICAgZW1pdChmLCJcdGxkcV91XHQlcywwKCVzKVxuIixyZWduYW1lc1t0NF0scmVnbmFtZXNbYWRyXSk7CisgICAgICBlbWl0KGYsIlx0bXNrYmxcdCVzLCVzLCVzXG4iLHJlZ25hbWVzW3Q0XSxyZWduYW1lc1thZHJdLHJlZ25hbWVzW3Q0XSk7CisgICAgICBlbWl0KGYsIlx0aW5zYmxcdCVzLCVzLCVzXG4iLHJlZ25hbWVzW3JdLHJlZ25hbWVzW2Fkcl0scmVnbmFtZXNbdDVdKTsKKyAgICAgIGVtaXQoZiwiXHRiaXNcdCVzLCVzLCVzXG4iLHJlZ25hbWVzW3Q0XSxyZWduYW1lc1t0NV0scmVnbmFtZXNbdDRdKTsKKyAgICAgIGVtaXQoZiwiXHRzdHFfdVx0JXMsMCglcylcbiIscmVnbmFtZXNbdDRdLHJlZ25hbWVzW2Fkcl0pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBleHRlbmQoRklMRSAqZixpbnQgcikKK3sKKyAgaWYoIXIpIHJldHVybjsKKyAgaWYoc3Rbcl09PUVTR04pIHJldHVybjsKKyAgZW1pdChmLCJcdGFkZGxcdCVzLCVzLCVzXG4iLHJlZ25hbWVzW3JdLHJlZ25hbWVzW3IzMV0scmVnbmFtZXNbcl0pOworICBzdFtyXT1FU0dOOworfQorc3RhdGljIHZvaWQgdWV4dGVuZChGSUxFICpmLGludCByKQoreworICBpZighcikgcmV0dXJuOworICBpZihzdFtyXT09RVVOUykgcmV0dXJuOworICBlbWl0KGYsIlx0emFwbm90XHQlcywxNSwlc1xuIixyZWduYW1lc1tyXSxyZWduYW1lc1tyXSk7CisgIHN0W3JdPUVVTlM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgSUMgKmRvX3JlZnMoRklMRSAqLHN0cnVjdCBJQyAqKTsKK3N0YXRpYyB2b2lkIHByKEZJTEUgKixzdHJ1Y3QgSUMgKik7CitzdGF0aWMgdm9pZCBmdW5jdGlvbl90b3AoRklMRSAqLHN0cnVjdCBWYXIgKixsb25nLGxvbmcpOworc3RhdGljIHZvaWQgZnVuY3Rpb25fYm90dG9tKEZJTEUgKmYsc3RydWN0IFZhciAqLGxvbmcsbG9uZyk7CisKKyNkZWZpbmUgaXNyZWcoeCkgKChwLT54LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpCisKK3N0YXRpYyBpbnQgcTFyZWcscTJyZWcsenJlZzsKKworc3RhdGljIGNoYXIgKmNjc1tdPXsiZXEiLCJuZSIsImx0IiwiZ2UiLCJsZSIsImd0IiwiIn07CitzdGF0aWMgY2hhciAqbG9naWNhbHNbXT17ImJpcyIsInhvciIsImFuZCJ9Oworc3RhdGljIGNoYXIgKmFyaXRobWV0aWNzW109eyJzbGwiLCJzcmwiLCJhZGQiLCJzdWIiLCJtdWwiLCJkaXYiLCJyZW0ifTsKKworc3RhdGljIHN0cnVjdCBJQyAqZG9fcmVmcyhGSUxFICpmLHN0cnVjdCBJQyAqcCkKKy8qICBEb2VzIHNvbWUgcHJlLXByb2Nlc3NpbmcgbGlrZSBmZXRjaGluZyBvcGVyYW5kcyBmcm9tIG1lbW9yeSB0byAgICAgICovCisvKiAgcmVnaXN0ZXJzIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgdHlwPXAtPnR5cGYsdHlwMSxyZWcsYz1wLT5jb2RlOworCisgIHR5cD1xMXR5cChwKTsKKyAgaWYoSVNQT0lOVEVSKHR5cCkpIHR5cD0oVU5TSUdORUR8TE9ORyk7CisKKyAgcTFyZWc9cTJyZWc9enJlZz0wOworICBpZihwLT5xMS5mbGFncyZSRUcpIHExcmVnPXAtPnExLnJlZzsKKyAgaWYocC0+cTIuZmxhZ3MmUkVHKSBxMnJlZz1wLT5xMi5yZWc7CisgIGlmKChwLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpIHpyZWc9cC0+ei5yZWc7CisKKworICBpZigocC0+cTEuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworICAgIGV2YWxfY29uc3QoJnAtPnExLnZhbCx0eXApOworICAgIGlmKHptZXF0byh2bWF4LGwyem0oMEwpKSYmenVtZXF0byh2dW1heCx1bDJ6dW0oMFVMKSkmJnpsZGVxdG8odmxkb3VibGUsZDJ6bGQoMC4wKSkpeworICAgICAgaWYoSVNGTE9BVCh0eXApKSBxMXJlZz1mMzE7IGVsc2UgcTFyZWc9cjMxOworICAgIH1lbHNleworICAgICAgaWYoSVNGTE9BVCh0eXApKSByZWc9ZjE7IGVsc2UgcmVnPXQxOworICAgICAgaWYoYz09QVNTSUdOJiZ6cmVnKSByZWc9enJlZzsKKyAgICAgIGlmKGM9PVNFVFJFVFVSTiYmcC0+ei5yZWcpIHJlZz1wLT56LnJlZzsKKyAgICAgIGlmKChjPT1NT0R8fGM9PURJVikmJklTSU5UKHR5cCkmJiFyZWdzWzI1XSkgcmVnPTI1OyAvKiBMaW51eC1kaXYgKi8KKyAgICAgIGlmKElTRkxPQVQodHlwKXx8Yz09RElWfHxjPT1TVUJ8fGM9PUFTU0lHTnx8Yz09UFVTSHx8Yz09U0VUUkVUVVJOfHxjPT1MU0hJRlR8fGM9PVJTSElGVHx8Yz09Q09NUEFSRSl7CisgICAgICAgIGxvYWRfcmVnKGYscmVnLCZwLT5xMSx0eXAsdDEpOworICAgICAgICBxMXJlZz1yZWc7CisgICAgICB9ZWxzZXsKKyAgICAgICAgaWYoSVNJTlQodHlwKSl7CisgICAgICAgICAgaWYoIXp1bWxlcSh2dW1heCx1bDJ6dW0oMjU1VUwpKXx8IXptbGVxKHZtYXgsbDJ6bSgyNTVMKSl8fHptbGVxKHZtYXgsbDJ6bSgtMUwpKSl7CisgICAgICAgICAgICBsb2FkX3JlZyhmLHJlZywmcC0+cTIsdHlwLHQxKTsKKyAgICAgICAgICAgIHExcmVnPXJlZzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH1lbHNlIGlmKGMhPUFERFJFU1MpeworICAgIGlmKHAtPnExLmZsYWdzJiYhcTFyZWcpeworICAgICAgaWYoSVNGTE9BVCh0eXApKSByZWc9ZjE7IGVsc2UgcmVnPXQxOworICAgICAgaWYoKGM9PUFTU0lHTnx8Yz09Q09OVkVSVCkmJnpyZWcmJihyZWctcjMxKSooenJlZy1yMzEpPjApIHJlZz16cmVnOworICAgICAgaWYoYz09U0VUUkVUVVJOJiZwLT56LnJlZykgcmVnPXAtPnoucmVnOworICAgICAgaWYoKHAtPnExLmZsYWdzJkRSRUZPQkopfHxjPT1BRERJMlB8fGM9PVNVQklGUCkge3R5cDE9UE9JTlRFUjtyZWc9dDE7fSBlbHNlIHR5cDE9dHlwOworICAgICAgaWYoYz09Q0FMTCkgcmVnPXZwOworICAgICAgaWYoKGM9PU1PRHx8Yz09RElWKSYmSVNJTlQodHlwMSkmJiFyZWdzWzI1XSkgcmVnPTI1OyAvKiBMaW51eC1kaXYgKi8KKyAgICAgIGlmKElTU0NBTEFSKHR5cDEpKXsKKyAgICAgICAgaW50IG09cC0+cTEuZmxhZ3M7CisgICAgICAgIHAtPnExLmZsYWdzJj1+RFJFRk9CSjsKKyAgICAgICAgbG9hZF9yZWcoZixyZWcsJnAtPnExLHR5cDEsdDEpOworICAgICAgICBwLT5xMS5mbGFncz1tOworICAgICAgICBxMXJlZz1yZWc7CisgICAgICB9CisgICAgfQorICAgIGlmKChwLT5xMS5mbGFncyZEUkVGT0JKKSYmSVNTQ0FMQVIodHlwKSl7CisgICAgICBpZihJU0ZMT0FUKHR5cCkpIHJlZz1mMTsgZWxzZSByZWc9dDE7CisgICAgICBpZigoYz09QVNTSUdOfHxjPT1DT05WRVJUKSYmenJlZyYmcmVnb2soenJlZyx0eXAsMCkpIHJlZz16cmVnOworICAgICAgaWYoYz09U0VUUkVUVVJOJiZwLT56LnJlZykgcmVnPXAtPnoucmVnOworICAgICAgaWYoKGM9PU1PRHx8Yz09RElWKSYmKHR5cCZOUSk8PUxPTkcmJiFyZWdzWzI1XSkgcmVnPTI1OyAvKiBMaW51eC1kaXYgKi8KKyAgICAgIGlmKGM9PUFEREkyUHx8Yz09U1VCSUZQKQorICAgICAgICBsb2FkX3JlZyhmLHJlZyxjYW0oSU1NX0lORCxxMXJlZywtMSwwKSxQT0lOVEVSLHQxKTsKKyAgICAgIGVsc2UKKyAgICAgICAgbG9hZF9yZWcoZixyZWcsY2FtKElNTV9JTkQscTFyZWcsLTEsMCksdHlwLHQxKTsKKyAgICAgIHExcmVnPXJlZzsKKyAgICB9CisgIH0KKyAgdHlwPXEydHlwKHApOworICBpZigocC0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCx0eXApOworICAgIGlmKHptZXF0byh2bWF4LGwyem0oMEwpKSYmenVtZXF0byh2dW1heCx1bDJ6dW0oMFVMKSkmJnpsZGVxdG8odmxkb3VibGUsZDJ6bGQoMC4wKSkpeworICAgICAgaWYoSVNGTE9BVCh0eXApKSBxMnJlZz1mMzE7IGVsc2UgcTJyZWc9cjMxOworICAgIH1lbHNleworICAgICAgaWYoSVNGTE9BVCh0eXApKSByZWc9ZjI7IGVsc2UgcmVnPXQyOworICAgICAgaWYoKGM9PU1PRHx8Yz09RElWKSYmSVNJTlQodHlwKSYmIXJlZ3NbMjZdKSByZWc9MjY7IC8qIExpbnV4LWRpdiAqLworICAgICAgaWYoSVNGTE9BVCh0eXApKXsKKyAgICAgICAgbG9hZF9yZWcoZixyZWcsJnAtPnEyLHR5cCx0Mik7CisgICAgICAgIHEycmVnPXJlZzsKKyAgICAgIH1lbHNleworICAgICAgICBpZihJU0lOVCh0eXApKXsKKyAgICAgICAgICBpZighenVtbGVxKHZ1bWF4LHVsMnp1bSgyNTVVTCkpfHwhem1sZXEodm1heCxsMnptKDI1NUwpKXx8em1sZXEodm1heCxsMnptKC0xTCkpKXsKKyAgICAgICAgICAgIGxvYWRfcmVnKGYscmVnLCZwLT5xMix0eXAsdDIpOworICAgICAgICAgICAgcTJyZWc9cmVnOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfWVsc2V7CisgICAgaWYocC0+cTIuZmxhZ3MmJiFxMnJlZyl7CisgICAgICBpZihwLT5xMi5mbGFncyZEUkVGT0JKKSB0eXAxPVBPSU5URVI7IGVsc2UgdHlwMT10eXA7CisgICAgICBpZihJU0ZMT0FUKHR5cDEpKSByZWc9ZjI7IGVsc2UgcmVnPXQyOworICAgICAgaWYoKGM9PU1PRHx8Yz09RElWKSYmSVNJTlQodHlwMSkmJiFyZWdzWzI2XSkgcmVnPTI2OyAvKiBMaW51eC1kaXYgKi8KKyAgICAgIGlmKElTU0NBTEFSKHR5cDEpKXsKKyAgICAgICAgaW50IG09cC0+cTIuZmxhZ3M7CisgICAgICAgIHAtPnEyLmZsYWdzJj1+RFJFRk9CSjsKKyAgICAgICAgbG9hZF9yZWcoZixyZWcsJnAtPnEyLHR5cDEsdDIpOworICAgICAgICBwLT5xMi5mbGFncz1tOworICAgICAgICBxMnJlZz1yZWc7CisgICAgICB9CisgICAgfQorICAgIGlmKChwLT5xMi5mbGFncyZEUkVGT0JKKSYmSVNTQ0FMQVIodHlwKSl7CisgICAgICBpZihJU0ZMT0FUKHR5cCkpIHJlZz1mMjsgZWxzZSByZWc9dDI7CisgICAgICBpZigoYz09TU9EfHxjPT1ESVYpJiZJU0lOVCh0eXApJiYhcmVnc1syNl0pIHJlZz0yNjsgLyogTGludXgtZGl2ICovCisgICAgICBsb2FkX3JlZyhmLHJlZyxjYW0oSU1NX0lORCxxMnJlZywtMSwwKSx0eXAsdDIpOworICAgICAgcTJyZWc9cmVnOworICAgIH0KKyAgfQorICBpZihwLT56LmZsYWdzJiYhaXNyZWcoeikpeworICAgIHR5cD16dHlwKHApOworICAgIGlmKElTRkxPQVQodHlwKSkgenJlZz1mMzsgZWxzZSB6cmVnPXQzOworICAgIGlmKChjPT1NT0R8fGM9PURJVikmJklTSU5UKHR5cCkmJiFyZWdzWzI4XSkgenJlZz0yODsgLyogTGludXgtZGl2ICovCisgIH0KKyAgaWYocTFyZWcpeyBwLT5xMS5mbGFncz1SRUc7IHAtPnExLnJlZz1xMXJlZzt9CisgIGlmKHEycmVnKXsgcC0+cTIuZmxhZ3M9UkVHOyBwLT5xMi5yZWc9cTJyZWc7fQorICByZXR1cm4gcDsKK30KK3N0YXRpYyBsb25nIHBvZjIoenVtYXggeCkKKy8qICBZaWVsZHMgbG9nMih4KSsxIG9kZXIgMC4gKi8KK3sKKyAgICB6dW1heCBwO2ludCBsbj0xOworICAgIHA9dWwyenVtKDFMKTsKKyAgICB3aGlsZShsbjw9NjQmJnp1bWxlcShwLHgpKXsKKyAgICAgICAgaWYoenVtZXF0byh4LHApKSByZXR1cm4gbG47CisgICAgICAgIGxuKys7cD16dW1hZGQocCxwKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CitzdGF0aWMgdm9pZCBwcihGSUxFICpmLHN0cnVjdCBJQyAqcCkKKy8qICBXcml0ZXMgdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uIGlmIG5lY2Vzc2FyeS4gICAqLworeworICBpbnQgdHlwPXAtPnR5cGY7CisgIGlmKHAtPnouZmxhZ3MpeworICAgIGlmKHAtPmNvZGU9PUFERFJFU1N8fHAtPmNvZGU9PUFEREkyUHx8cC0+Y29kZT09U1VCSUZQKSB0eXA9UE9JTlRFUjsKKyAgICBpZighaXNyZWcoeikpeworICAgICAgaWYocC0+ei5mbGFncyZEUkVGT0JKKXsKKyAgICAgICAgaWYocC0+ei5mbGFncyZSRUcpeworICAgICAgICAgIHN0b3JlX3JlZyhmLHpyZWcsY2FtKElNTV9JTkQscC0+ei5yZWcsLTEsMCksdHlwKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgaW50IHIsbTsKKyAgICAgICAgICBpZih0MT09enJlZykgcj10MjsgZWxzZSByPXQxOworICAgICAgICAgIG09cC0+ei5mbGFnczsKKyAgICAgICAgICBwLT56LmZsYWdzJj1+RFJFRk9CSjsKKyAgICAgICAgICBsb2FkX3JlZyhmLHIsJnAtPnosUE9JTlRFUixyKTsKKyAgICAgICAgICBwLT56LmZsYWdzPW07CisgICAgICAgICAgc3RvcmVfcmVnKGYsenJlZyxjYW0oSU1NX0lORCxyLGJhbGlnbigmcC0+eiksMCksdHlwKTsKKyAgICAgICAgfQorICAgICAgfWVsc2V7CisgICAgICAgIHN0b3JlX3JlZyhmLHpyZWcsJnAtPnosdHlwKTsKKyAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgIGlmKHAtPnoucmVnIT16cmVnKQorICAgICAgICBtb3ZlX3JlZyhmLHpyZWcscC0+ei5yZWcpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBwcm9iajIoRklMRSAqZixzdHJ1Y3Qgb2JqICpwLGludCB0KQorLyogIFByaW50cyBhbiBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGlmKHAtPmFtKXsKKyAgICBpZihwLT5hbS0+ZmxhZ3M9PVJFR19JTkQpIGllcnJvcigwKTsKKyAgICBpZihwLT5hbS0+ZmxhZ3M9PUlNTV9JTkQpIGVtaXQoZiwiJWxkKCVzKSIscC0+YW0tPm9mZnNldCxyZWduYW1lc1twLT5hbS0+YmFzZV0pOworICAgIHJldHVybjsKKyAgfQorICBpZihwLT5mbGFncyZEUkVGT0JKKSBlbWl0KGYsIigiKTsKKyAgaWYocC0+ZmxhZ3MmVkFSKSB7CisgICAgaWYocC0+di0+c3RvcmFnZV9jbGFzcz09QVVUT3x8cC0+di0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpeworICAgICAgaWYocC0+ZmxhZ3MmUkVHKXsKKyAgICAgICAgZW1pdChmLCIlcyIscmVnbmFtZXNbcC0+cmVnXSk7CisgICAgICB9ZWxzZXsKKyAgICAgICAgbG9uZyBvZj16bTJsKHAtPnYtPm9mZnNldCk7CisgICAgICAgIGlmKG9mPj0wKQorICAgICAgICAgIG9mKz1mcmFtZW9mZnNldCt6bTJsKHAtPnZhbC52bWF4KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG9mPS1vZi16bTJsKG1heGFsaWduKStmcmFtZXNpemUrem0ybChwLT52YWwudm1heCk7CisgICAgICAgIGlmKG9mPjMyNzY3KSBpZXJyb3IoMCk7CisgICAgICAgIGVtaXQoZiwiJWxkKCVzKSIsb2YscmVnbmFtZXNbc3BdKTsKKyAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgIGlmKCF6bWVxdG8obDJ6bSgwTCkscC0+dmFsLnZtYXgpKXtlbWl0dmFsKGYsJnAtPnZhbCxNQVhJTlQpO2VtaXQoZiwiKyIpO30KKyAgICAgIGlmKHAtPnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQyl7CisgICAgICAgIGVtaXQoZiwiJXMlbGQiLGxhYnByZWZpeCx6bTJsKHAtPnYtPm9mZnNldCkpOworICAgICAgfWVsc2V7CisgICAgICAgIGVtaXQoZiwiJXMlcyIsaWRwcmVmaXgscC0+di0+aWRlbnRpZmllcik7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKChwLT5mbGFncyZSRUcpJiYhKHAtPmZsYWdzJlZBUikpIGVtaXQoZiwiJXMiLHJlZ25hbWVzW3AtPnJlZ10pOworICBpZihwLT5mbGFncyZLT05TVCl7CisgICAgZW1pdHZhbChmLCZwLT52YWwsdCZOVSk7CisgIH0KKyAgaWYocC0+ZmxhZ3MmRFJFRk9CSikgZW1pdChmLCIpIik7Cit9CitzdGF0aWMgdm9pZCBkd2FyZjJfcHJpbnRfZnJhbWVfbG9jYXRpb24oRklMRSAqZixzdHJ1Y3QgVmFyICp2KQoreworICBzdHJ1Y3Qgb2JqIG87CisgIG8uZmxhZ3M9UkVHOworICAvKkZJWE1FOiBuZWVkIGNvcnJlY3QgcmVnaXN0ZXIgdHJhbnNsYXRpb24gKi8KKyAgby5yZWc9c3A7CisgIG8udmFsLnZtYXg9bDJ6bSgwTCk7CisgIG8udj0wOworICBkd2FyZjJfcHJpbnRfbG9jYXRpb24oZiwmbyk7Cit9CitzdGF0aWMgaW50IGR3YXJmMl9yZWdudW1iZXIoaW50IHIpCit7CisgIC8qRklYTUU6IG5lZWRzIGNvcnJlY3QgdHJhbnNsYXRpb24gKi8KKyAgcmV0dXJuIHItMTsKK30KK3N0YXRpYyB6bWF4IGR3YXJmMl9mYm9mZnNldChzdHJ1Y3QgVmFyICp2KQoreworICBsb25nIG9mOworICBpZighdnx8KHYtPnN0b3JhZ2VfY2xhc3MhPUFVVE8mJnYtPnN0b3JhZ2VfY2xhc3MhPVJFR0lTVEVSKSkgaWVycm9yKDApOworICBvZj16bTJsKHYtPm9mZnNldCk7CisgIGlmKG9mPj0wKQorICAgIG9mKz1mcmFtZW9mZnNldDsKKyAgZWxzZQorICAgIG9mPS1vZi16bTJsKG1heGFsaWduKStmcmFtZXNpemU7CisgIGlmKG9mPjMyNzY3KSBpZXJyb3IoMCk7CisgIHJldHVybiBsMnptKG9mKTsKK30KK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX3RvcChGSUxFICpmLHN0cnVjdCBWYXIgKnYsbG9uZyBvZmZzZXQsbG9uZyBtYXhwdXNoZWQpCisvKiAgR2VuZXJhdGVzIGZ1bmN0aW9uIHRvcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBpOworICAgZW1pdChmLCJcdC5zZXRcdG5vYXRcbiIpOworICBpZihzZWN0aW9uIT1DT0RFKXtlbWl0KGYsY29kZW5hbWUpO2lmKGYpIHNlY3Rpb249Q09ERTt9CisgIGVtaXQoZiwiXHQuYWxpZ25cdDNcbiIpOworICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pCisgICAgaWYoKHYtPmZsYWdzJihJTkxJTkVGVU5DfElOTElORUVYVCkpIT1JTkxJTkVGVU5DKQorICAgICAgZW1pdChmLCJcdC5nbG9iYWxcdCVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgIGVtaXQoZiwiXHQuZW50XHQlcyVzXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICBpZih2LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpCisgICAgZW1pdChmLCIlcyVsZDpcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgIGVsc2UKKyAgICBlbWl0KGYsIiVzJXM6XG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICBpZihmdW5jdGlvbl9jYWxscykgZW1pdChmLCJcdGxkZ3BcdCVzLDAoJXMpXG4iLHJlZ25hbWVzW2dwXSxyZWduYW1lc1t2cF0pOworICBpZih2LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpCisgICAgZW1pdChmLCIlcyVsZC4ubmc6XG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICBlbHNlICAKKyAgICBlbWl0KGYsIiVzJXMuLm5nOlxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgZnJhbWVzaXplPW9mZnNldCttYXhwdXNoZWQ7CisgIGlmKGZ1bmN0aW9uX2NhbGxzKSBmcmFtZXNpemUrPTg7IC8qIGxyICovCisgIGZvcihpPTE7aTw9TUFYUjtpKyspCisgICAgaWYocmVndXNlZFtpXSYmIXJlZ3NjcmF0Y2hbaV0mJiFyZWdzYVtpXSkKKyAgICAgIGZyYW1lc2l6ZSs9ODsKKyAgZnJhbWVzaXplPSgoZnJhbWVzaXplKzE2LTEpLzE2KSoxNjsKKyAgaWYoZnJhbWVzaXplPjMyNzY3KSBpZXJyb3IoMCk7CisgIGlmKGZyYW1lc2l6ZSkgZW1pdChmLCJcdGxkYVx0JXMsJWxkKCVzKVxuIixyZWduYW1lc1tzcF0sLWZyYW1lc2l6ZSxyZWduYW1lc1tzcF0pOworICBlbWl0KGYsIlx0LmZyYW1lXHQlcywlbGQsJXMsMFxuIixyZWduYW1lc1tzcF0sZnJhbWVzaXplLHJlZ25hbWVzW2xyXSk7CisgIGZyYW1lb2Zmc2V0PW1heHB1c2hlZDsKKyAgaWYoZnVuY3Rpb25fY2FsbHMpeworICAgIGVtaXQoZiwiXHRzdHFcdCVzLCVsZCglcylcbiIscmVnbmFtZXNbbHJdLGZyYW1lb2Zmc2V0LHJlZ25hbWVzW3NwXSk7CisgICAgZnJhbWVvZmZzZXQrPTg7CisgIH0KKyAgZm9yKGk9MTtpPD1NQVhSO2krKyl7CisgICAgaWYocmVndXNlZFtpXSYmIXJlZ3NjcmF0Y2hbaV0mJiFyZWdzYVtpXSl7CisgICAgICBpZihpPD0zMil7CisgICAgICAgIGVtaXQoZiwiXHRzdHFcdCVzLCVsZCglcylcbiIscmVnbmFtZXNbaV0sZnJhbWVvZmZzZXQscmVnbmFtZXNbc3BdKTsKKyAgICAgIH1lbHNleworICAgICAgICBlbWl0KGYsIlx0c3R0XHQlcywlbGQoJXMpXG4iLHJlZ25hbWVzW2ldLGZyYW1lb2Zmc2V0LHJlZ25hbWVzW3NwXSk7CisgICAgICB9CisgICAgICBmcmFtZW9mZnNldCs9ODsKKyAgICB9CisgIH0KKyAgZW1pdChmLCJcdC5tYXNrXHQweDQwMDAwMDAsJWxkXG4iLC1mcmFtZXNpemUpOworICBlbWl0KGYsIlx0LnByb2xvZ3VlXHQlY1xuIixmdW5jdGlvbl9jYWxscz8nMSc6JzAnKTsKK30KK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX2JvdHRvbShGSUxFICpmLHN0cnVjdCBWYXIgKnYsbG9uZyBvZmZzZXQsbG9uZyBtYXhwdXNoZWQpCisvKiAgR2VuZXJhdGVzIGZ1bmN0aW9uIGJvdHRvbS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBpOworICBmcmFtZW9mZnNldD1tYXhwdXNoZWQ7CisgIGlmKGZ1bmN0aW9uX2NhbGxzKXsKKyAgICBlbWl0KGYsIlx0bGRxXHQlcywlbGQoJXMpXG4iLHJlZ25hbWVzW2xyXSxmcmFtZW9mZnNldCxyZWduYW1lc1tzcF0pOworICAgIGZyYW1lb2Zmc2V0Kz04OworICB9CisgIGZvcihpPTE7aTw9TUFYUjtpKyspeworICAgIGlmKHJlZ3VzZWRbaV0mJiFyZWdzY3JhdGNoW2ldJiYhcmVnc2FbaV0peworICAgICAgaWYoaTw9MzIpeworICAgICAgICBlbWl0KGYsIlx0bGRxXHQlcywlbGQoJXMpXG4iLHJlZ25hbWVzW2ldLGZyYW1lb2Zmc2V0LHJlZ25hbWVzW3NwXSk7CisgICAgICB9ZWxzZXsKKyAgICAgICAgZW1pdChmLCJcdGxkdFx0JXMsJWxkKCVzKVxuIixyZWduYW1lc1tpXSxmcmFtZW9mZnNldCxyZWduYW1lc1tzcF0pOworCisgICAgICB9CisgICAgICBmcmFtZW9mZnNldCs9ODsKKyAgICB9CisgIH0KKyAgaWYoZnJhbWVzaXplKSBlbWl0KGYsIlx0bGRhXHQlcywlbGQoJXMpXG4iLHJlZ25hbWVzW3NwXSxmcmFtZXNpemUscmVnbmFtZXNbc3BdKTsKKyAgZW1pdChmLCJcdHJldFx0JXMsKCVzKSwxXG4iLHJlZ25hbWVzW3IzMV0scmVnbmFtZXNbbHJdKTsKKyAgZW1pdChmLCJcdC5lbmRcdCVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgIGVtaXQoZiwiXHQudHlwZVx0JXMlcyxAZnVuY3Rpb25cbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgIGVtaXQoZiwiXHQuc2l6ZVx0JXMlcywkLSVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKK30KK3N0YXRpYyBpbnQgYmFsaWduKHN0cnVjdCBvYmogKm8pCisvKiAgTGllZmVydCBkaWUgdW50ZXJlbiAzIEJpdHMgZGVzIE9iamVrdHMuIC0xIHdlbm4gdW5rbGFyLiAqLworeworICBpbnQgc2M7CisgIGlmKG8tPmZsYWdzJkRSRUZPQkopIHJldHVybiAtMTsKKyAgaWYoby0+YW0pIHJldHVybiBvLT5hbS0+YWxpZ247CisgIGlmKCEoby0+ZmxhZ3MmVkFSKSkgaWVycm9yKDApOworICBzYz1vLT52LT5zdG9yYWdlX2NsYXNzOworICBpZihzYz09RVhURVJOfHxzYz09U1RBVElDKXsKKyAgICAvKiBBbGxlIHN0YXRpc2NoZW4gRGF0ZW4gd2VyZGVuIHZvbSBjZyBhdWYgNjRiaXQgYWxpZ250LiAqLworICAgIHJldHVybiB6bTJsKHptYW5kKG8tPnZhbC52bWF4LGwyem0oN0wpKSk7CisgIH0KKyAgaWYoc2M9PUFVVE98fHNjPT1SRUdJU1RFUil7CisgICAgem1heCBvZj1vLT52LT5vZmZzZXQ7CisgICAgaWYoIXptbGVxKGwyem0oMEwpLG9mKSkKKyAgICAgIG9mPXptc3ViKGwyem0oMEwpLHptYWRkKG9mLG1heGFsaWduKSk7CisgICAgcmV0dXJuIHptMmwoem1hbmQoem1hZGQob2Ysby0+dmFsLnZtYXgpLGwyem0oN0wpKSk7CisgIH0KKyAgaWVycm9yKDApOworfQorCisvKiBSb3V0aW5lbiBmdWVyIERlYnVnLUluZm9ybWF0aW9uZW4gbWl0IHN0YWJzLiAqLworCitzdGF0aWMgaW50IGRlYnVnX2JsYWJlbCxkZWJ1Z19lbGFiZWw7CitzdGF0aWMgaW50IGRlYnVnX3R5cGUoRklMRSAqLHN0cnVjdCBUeXAgKik7CitzdGF0aWMgdm9pZCBkZWJ1Z19pbml0KEZJTEUgKixzdHJ1Y3QgVmFyICopOworc3RhdGljIHZvaWQgZGVidWdfZXhpdChGSUxFICosc3RydWN0IFZhciAqKTsKK3N0YXRpYyB2b2lkIGRlYnVnX3ZhcihGSUxFICosc3RydWN0IG9iaiAqKTsKK3N0YXRpYyB2b2lkIGRlYnVnX0lDKEZJTEUgKixzdHJ1Y3QgSUMgKik7CitzdGF0aWMgdm9pZCBkZWJ1Z19jbGVhbnVwKEZJTEUgKik7CisKK3N0YXRpYyBpbnQgZGVidWdfdHlwZShGSUxFICpmLHN0cnVjdCBUeXAgKnQpCisgICAgIC8qIExpZWZlcnQgVHlwaW5kZXguICAqLworeworICByZXR1cm4gdC0+ZmxhZ3MmTlU7Cit9CitzdGF0aWMgdm9pZCBkZWJ1Z19pbml0KEZJTEUgKmYsc3RydWN0IFZhciAqdikKKyAgICAgLyogRGVidWctSW5mb3MuIFdpcmQgYW0gQW5mYW5nIHZvbiBnZW5fY29kZSBhdWZnZXJ1ZmVuLiAqLworeworICBzdGF0aWMgaW50IGRpZF9oZWFkZXI7CisgIGlmKCFkaWRfaGVhZGVyKXsKKyAgICBlbWl0KGYsIlx0LnN0YWJzIFwiXCIsMTAwLDAsMCwlc3RleHQwXG4iLGxhYnByZWZpeCk7CisgICAgZW1pdChmLCJcdC5zdGFicyBcIiVzXCIsMTAwLDAsMCwlc3RleHQwXG4iLGZpbGVuYW1lLGxhYnByZWZpeCk7CisgICAgZW1pdChmLCJcdC50ZXh0XG4lc3RleHQwOlxuIixsYWJwcmVmaXgpO2lmKGYpIHNlY3Rpb249Q09ERTsKKyAgICBlbWl0KGYsIlx0LnN0YWJzXHRcImNoYXI6dCVkPXIxOy0xMjg7MTI3O1wiLDEyOCwwLDAsMFxuIixDSEFSKTsKKyAgICBlbWl0KGYsIlx0LnN0YWJzXHRcInNob3J0OnQlZD1yMTstMzI3Njg7MzI3Njc7XCIsMTI4LDAsMCwwXG4iLFNIT1JUKTsKKyAgICBlbWl0KGYsIlx0LnN0YWJzXHRcImludDp0JWQ9cjE7LTIxNDc0ODM2NDg7MjE0NzQ4MzY0NztcIiwxMjgsMCwwLDBcbiIsSU5UKTsKKyAgICBlbWl0KGYsIlx0LnN0YWJzXHRcImxvbmc6dCVkPXIxOzAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDswMDA3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7XCIsMTI4LDAsMCwwXG4iLExPTkcpOworICAgIGVtaXQoZiwiXHQuc3RhYnNcdFwidW5zaWduZWQgY2hhcjp0JWQ9cjE7MDsyNTU7XCIsMTI4LDAsMCwwXG4iLFVOU0lHTkVEfENIQVIpOworICAgIGVtaXQoZiwiXHQuc3RhYnNcdFwidW5zaWduZWQgc2hvcnQ6dCVkPXIxOzA7NjU1MzU7XCIsMTI4LDAsMCwwXG4iLFVOU0lHTkVEfFNIT1JUKTsKKyAgICBlbWl0KGYsIlx0LnN0YWJzXHRcInVuc2lnbmVkIGludDp0JWQ9cjE7MDstMTtcIiwxMjgsMCwwLDBcbiIsVU5TSUdORUR8SU5UKTsKKyAgICBlbWl0KGYsIlx0LnN0YWJzXHRcInVuc2lnbmVkIGxvbmc6dCVkPXIxOzA7LTE7XCIsMTI4LDAsMCwwXG4iLFVOU0lHTkVEfExPTkcpOworICAgIGVtaXQoZiwiXHQuc3RhYnNcdFwiZmxvYXQ6dCVkPXIxOzQ7MDtcIiwxMjgsMCwwLDBcbiIsRkxPQVQpOworICAgIGVtaXQoZiwiXHQuc3RhYnNcdFwiZG91YmxlOnQlZD1yMTs4OzA7XCIsMTI4LDAsMCwwXG4iLERPVUJMRSk7CisgICAgZW1pdChmLCJcdC5zdGFic1x0XCJ2b2lkOnQlZD0lZDs4OzA7XCIsMTI4LDAsMCwwXG4iLFZPSUQsVk9JRCk7CisgICAgZGlkX2hlYWRlcj0xOworICB9CisgIGVtaXQoZiwiXHQuc3RhYnNcdFwiJXM6RiVkXCIsMzYsMCwwLCVzJXNcbiIsdi0+aWRlbnRpZmllcixkZWJ1Z190eXBlKGYsdi0+dnR5cC0+bmV4dCksaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgIGRlYnVnX2JsYWJlbD0rK2xhYmVsO2RlYnVnX2VsYWJlbD0rK2xhYmVsOworfQorc3RhdGljIHZvaWQgZGVidWdfZXhpdChGSUxFICpmLHN0cnVjdCBWYXIgKnYpCisgICAgIC8qIERlYnVnLUluZm9zLiBXaXJkIGFtIEVuZGUgdm9uIGdlbl9jb2RlIGF1ZmdlcnVmZW4uICovCit7CisgIHN0cnVjdCBJQyAqcDsKKyAgaWVycm9yKDApOworICBlbWl0KGYsIlx0LnN0YWJuXHQxOTIsMCwwLCVzJWRcbiIsbGFicHJlZml4LGRlYnVnX2JsYWJlbCk7CisgIGVtaXQoZiwiXHQuc3RhYm5cdDIyNCwwLDAsJXMlZFxuIixsYWJwcmVmaXgsZGVidWdfZWxhYmVsKTsKKyAgZm9yKHA9Zmlyc3RfaWM7cDtwPXAtPm5leHQpeworICAgIGlmKHAtPnExLmZsYWdzJlZBUikgZGVidWdfdmFyKGYsJnAtPnExKTsKKyAgICBpZihwLT5xMi5mbGFncyZWQVIpIGRlYnVnX3ZhcihmLCZwLT5xMik7CisgICAgaWYocC0+ei5mbGFncyZWQVIpIGRlYnVnX3ZhcihmLCZwLT56KTsKKyAgfQorfQorc3RhdGljIHZvaWQgZGVidWdfdmFyKEZJTEUgKmYsc3RydWN0IG9iaiAqbykKKyAgICAgLyogRGVidWctSW5mb3MgZnVlciBlaW5lIFZhcmlhYmxlIGF1c2dlYmVuLiAqLworeworICBzdHJ1Y3QgVmFyICp2PW8tPnY7IGludCB0ZDsKKyAgaWYoISp2LT5pZGVudGlmaWVyKSByZXR1cm47CisgIHRkPWRlYnVnX3R5cGUoZix2LT52dHlwKTsKKyAgaWYoSVNGVU5DKHRkKSkgcmV0dXJuOworICBpZihvLT5mbGFncyZSRUcpeworICAgIGVtaXQoZiwiXHQuc3RhYnNcdFwiJXM6ciVkXCIsMHg0MCwwLDAsJWRcbiIsdi0+aWRlbnRpZmllcix0ZCxvLT5yZWctMSk7CisgICAgcmV0dXJuOworICB9CisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKXsKKyAgICBsb25nIG9mPXptMmwodi0+b2Zmc2V0KTsKKyAgICBpZighem1sZXEobDJ6bSgwTCksdi0+b2Zmc2V0KSl7CisgICAgICBvZj0tb2Ytem0ybChtYXhhbGlnbikrZnJhbWVzaXplOworICAgICAgZW1pdChmLCIjXHRvZmZzZXQgJWxkOlxuIixvZik7CisgICAgICBlbWl0KGYsIlx0LnN0YWJzXHRcIiVzOnAlZFwiLDB4ODAsMCwwLCVsZFxuIix2LT5pZGVudGlmaWVyLHRkLG9mLWZyYW1lc2l6ZSk7CisgICAgfWVsc2V7CisgICAgICBvZis9ZnJhbWVvZmZzZXQ7CisgICAgICBlbWl0KGYsIiNcdG9mZnNldCAlbGQ6XG4iLG9mKTsKKyAgICAgIGVtaXQoZiwiXHQuc3RhYnNcdFwiJXM6JWRcIiwweDgwLDAsMCwlbGRcbiIsdi0+aWRlbnRpZmllcix0ZCxvZi1mcmFtZXNpemUpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWVycm9yKHRkKTsKK30KK3N0YXRpYyB2b2lkIGRlYnVnX0lDKEZJTEUgKmYsc3RydWN0IElDICpwKQorICAgICAvKiBEZWJ1Zy1JbmZvcy4gV2lyZCBmdWVyIGplZGVzIElDIGF1ZmdlcnVmZW4uICovCit7CisgIHN0YXRpYyBpbnQgbGFzdGxpbmU7aW50IGxhYjsKKyAgcHJpbnRmKCIlZCIscC0+bGluZSk7cHJpYzIoc3Rkb3V0LHApOworICBpZighcC0+cHJldikKKyAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxkZWJ1Z19ibGFiZWwpOworLyogICBpZihwLT5xMS5mbGFncyZWQVIpIGRlYnVnX3ZhcihmLCZwLT5xMSk7ICovCisvKiAgIGlmKHAtPnEyLmZsYWdzJlZBUikgZGVidWdfdmFyKGYsJnAtPnEyKTsgKi8KKy8qICAgaWYocC0+ei5mbGFncyZWQVIpIGRlYnVnX3ZhcihmLCZwLT56KTsgKi8KKyAgaWYocC0+bGluZSYmcC0+bGluZSE9bGFzdGxpbmUpeworICAgIGxhYj0rK2xhYmVsO2xhc3RsaW5lPXAtPmxpbmU7CisgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiKTsKKyAgICBlbWl0KGYsIlx0LnN0YWJuXHQ2OCwwLCVkLCVzJWRcbiIsbGFzdGxpbmUsbGFicHJlZml4LGxhYik7CisgIH0KKyAgaWYoIXAtPm5leHQpIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGRlYnVnX2VsYWJlbCk7Cit9CitzdGF0aWMgdm9pZCBkZWJ1Z19jbGVhbnVwKEZJTEUgKmYpCisgICAgIC8qIERlYnVnLUluZm9zLiBXaXJkIGluIGNsZWFudXBfY2cgYXVmZ2VydWZlbi4gKi8KK3sKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBFbmQgb2YgcHJpdmF0ZSBkYXRhIGFuZCBmdW5jdGlvbnMuICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW50IGluaXRfY2codm9pZCkKKy8qICBEb2VzIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbnMgZm9yIHRoZSBjb2RlLWdlbmVyYXRvci4gR2V0cyBjYWxsZWQgICovCisvKiAgb25jZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCBzaG91bGQgcmV0dXJuIDAgaW4gY2FzZSBvZiBwcm9ibGVtcy4gICAgICAqLworeworICBpbnQgaTsKKyAgLyogIEluaXRpYWxpemUgc29tZSB2YWx1ZXMgd2hpY2ggY2Fubm90IGJlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgICAqLworICAvKiAgYmVjYXVzZSB0aGV5IGFyZSBzdG9yZWQgaW4gdGhlIHRhcmdldCdzIGFyaXRobWV0aWMuICAgICAgICAgICAgICovCisgIG1heGFsaWduPWwyem0oOEwpOworICBjaGFyX2JpdD1sMnptKDhMKTsKKyAgZm9yKGk9MDtpPD1NQVhfVFlQRTtpKyspeworICAgIHNpemV0YWJbaV09bDJ6bShtc2l6ZXRhYltpXSk7CisgICAgYWxpZ25baV09bDJ6bShtYWxpZ25baV0pOworICB9CisgIGZvcihpPSAxO2k8PTMyO2krKykge3JlZ3NpemVbaV09bDJ6bSg4TCk7cmVndHlwZVtpXT0mbHR5cDt9CisgIGZvcihpPTMzO2k8PTY0O2krKykge3JlZ3NpemVbaV09bDJ6bSg4TCk7cmVndHlwZVtpXT0mbHR5cDt9CisKKyAgLyogIFVzZSBtdWx0aXBsZSBjY3MuICAgKi8KKyAgbXVsdGlwbGVfY2NzPTA7IC8qIG5vdCB5ZXQgKi8KKworICAvKiAgSW5pdGlhbGl6ZSB0aGUgbWluL21heC1zZXR0aW5ncy4gTm90ZSB0aGF0IHRoZSB0eXBlcyBvZiB0aGUgICAgICovCisgIC8qICBob3N0IHN5c3RlbSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIHRhcmdldCBzeXN0ZW0gYW5kIHlvdSBtYXkgKi8KKyAgLyogIG9ubHkgdXNlIHRoZSBzbWFsbGVzdCBtYXhpbXVtIHZhbHVlcyBBTlNJIGd1YXJhbnRlZXMgaWYgeW91ICAgICAqLworICAvKiAgd2FudCB0byBiZSBwb3J0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBUaGF0J3MgdGhlIHJlYXNvbiBmb3IgdGhlIHN1YnRyYWN0aW9uIGluIHRfbWluW0lOVF0uIExvbmcgY291bGQgKi8KKyAgLyogIGJlIHVuYWJsZSB0byByZXByZXNlbnQgLTIxNDc0ODM2NDggb24gdGhlIGhvc3Qgc3lzdGVtLiAgICAgICAgICAqLworICB0X21pbltDSEFSXT1sMnptKC0xMjhMKTsKKyAgdF9taW5bU0hPUlRdPWwyem0oLTMyNzY4TCk7CisgIHRfbWluW0lOVF09em1zdWIobDJ6bSgtMjE0NzQ4MzY0N0wpLGwyem0oMUwpKTsKKyAgdF9taW5bTExPTkddPXptbHNoaWZ0KGwyem0oMUwpLGwyem0oNjNMKSk7CisgIHRfbWluW0xPTkddPXRfbWluW0xMT05HXTsKKyAgdF9taW5bTUFYSU5UXT10X21pbihMTE9ORyk7CisgIHRfbWF4W0NIQVJdPXVsMnp1bSgxMjdMKTsKKyAgdF9tYXhbU0hPUlRdPXVsMnp1bSgzMjc2N1VMKTsKKyAgdF9tYXhbSU5UXT11bDJ6dW0oMjE0NzQ4MzY0N1VMKTsKKyAgdF9tYXhbTExPTkddPXp1bXJzaGlmdCh6dW1rb21wbCh1bDJ6dW0oMFVMKSksdWwyenVtKDFVTCkpOworICB0X21heFtMT05HXT10X21heFtMTE9OR107CisgIHRfbWF4W01BWElOVF09dF9tYXgoTExPTkcpOworICB0dV9tYXhbQ0hBUl09dWwyenVtKDI1NVVMKTsKKyAgdHVfbWF4W1NIT1JUXT11bDJ6dW0oNjU1MzVVTCk7CisgIHR1X21heFtJTlRdPXVsMnp1bSg0Mjk0OTY3Mjk1VUwpOworICB0dV9tYXhbTExPTkddPXp1bWtvbXBsKHVsMnp1bSgwVUwpKTsKKyAgdHVfbWF4W0xPTkddPXR1X21heFtMTE9OR107CisgIHR1X21heFtNQVhJTlRdPXRfbWF4KFVOU0lHTkVEfExMT05HKTsKKworICAvKiAgUmVzZXJ2ZSBhIGZldyByZWdpc3RlcnMgZm9yIHVzZSBieSB0aGUgY29kZS1nZW5lcmF0b3IuICAgICAgKi8KKyAgLyogIFRoaXMgaXMgbm90IG9wdGltYWwgYnV0IHNpbXBsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHJlZ3NhW3QxXT1yZWdzYVt0Ml09cmVnc2FbdDNdPXJlZ3NhW3Q0XT1yZWdzYVt0NV09MTsKKyAgcmVnc2FbZjFdPXJlZ3NhW2YyXT1yZWdzYVtmM109MTsKKyAgcmVnc2Fbc3BdPXJlZ3NhW2dwXT1yZWdzYVtzZF09MTsKKyAgcmVnc2FbbHJdPXJlZ3NhW3IzMV09cmVnc2FbZjMxXT0xOworICByZWdzY3JhdGNoW3QxXT1yZWdzY3JhdGNoW3QyXT1yZWdzY3JhdGNoW3QzXT1yZWdzY3JhdGNoW3Q0XT1yZWdzY3JhdGNoW3Q1XT0wOworICByZWdzY3JhdGNoW2YxXT1yZWdzY3JhdGNoW2YyXT1yZWdzY3JhdGNoW2YzXT0wOworICByZWdzY3JhdGNoW3NwXT1yZWdzY3JhdGNoW2dwXT1yZWdzY3JhdGNoW3NkXT0wOworICByZWdzY3JhdGNoW2xyXT1yZWdzY3JhdGNoW3IzMV09cmVnc2NyYXRjaFtmMzFdPTA7CisgIC8qIHJlc2VydmUgYXQgLSBub2NoIGFlbmRlcm4gKi8KKyAgLyogcmVnc2FbMjldPTE7cmVnc2NyYXRjaFsyOV09MDsgKi8KKyAgLyogRGVidWcgc3RhYnM/ICovCisgIHN0YWJzPShnX2ZsYWdzWzVdJlVTRURGTEFHKTsKKyAgdGFyZ2V0X21hY3Jvcz1tYXJyYXk7CisgIHJldHVybiAxOworfQorCitpbnQgZnJldHVybihzdHJ1Y3QgVHlwICp0KQorLyogIFJldHVybnMgdGhlIHJlZ2lzdGVyIGluIHdoaWNoIHZhcmlhYmxlcyBvZiB0eXBlIHQgYXJlIHJldHVybmVkLiAqLworLyogIElmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgcmV0dXJuZWQgaW4gYSByZWdpc3RlciByZXR1cm5zIDAuICAgICAgICAqLworLyogIEEgcG9pbnRlciBNVVNUIGJlIHJldHVybmVkIGluIGEgcmVnaXN0ZXIuIFRoZSBjb2RlLWdlbmVyYXRvciAgICAqLworLyogIGhhcyB0byBzaW11bGF0ZSBhIHBzZXVkbyByZWdpc3RlciBpZiBuZWNlc3NhcnkuICAgICAgICAgICAgICAgICAqLworeworICBpZihJU0ZMT0FUKHQtPmZsYWdzKSkgcmV0dXJuIDMzOworICBpZihJU1NUUlVDVCh0LT5mbGFncyl8fElTVU5JT04odC0+ZmxhZ3MpKSByZXR1cm4gMDsKKyAgaWYoem1sZXEoc3pvZih0KSxsMnptKDhMKSkpCisgICAgcmV0dXJuIDE7IAorICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCByZWdfcGFpcihpbnQgcixzdHJ1Y3QgcnBhaXIgKnApCisvKiBSZXR1cm5zIDAgaWYgdGhlIHJlZ2lzdGVyIGlzIG5vIHJlZ2lzdGVyIHBhaXIuIElmIHIgICovCisvKiBpcyBhIHJlZ2lzdGVyIHBhaXIgbm9uLXplcm8gd2lsbCBiZSByZXR1cm5lZCBhbmQgdGhlICovCisvKiBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBwIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHR3byAgICovCisvKiBlbGVtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIHJldHVybiAwOworfSAgICAgCisKK2ludCByZWdvayhpbnQgcixpbnQgdCxpbnQgbW9kZSkKKy8qICBSZXR1cm5zIDAgaWYgcmVnaXN0ZXIgciBjYW5ub3Qgc3RvcmUgdmFyaWFibGVzIG9mICAgKi8KKy8qICB0eXBlIHQuIElmIHQ9PVBPSU5URVIgYW5kIG1vZGUhPTAgdGhlbiBpdCByZXR1cm5zICAgKi8KKy8qICBub24temVybyBvbmx5IGlmIHRoZSByZWdpc3RlciBjYW4gc3RvcmUgYSBwb2ludGVyICAgKi8KKy8qICBhbmQgZGVyZWZlcmVuY2UgYSBwb2ludGVyIHRvIG1vZGUuICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYocj09MCkgcmV0dXJuIDA7CisgIGlmKHQ9PTApIHJldHVybiAwOworICBpZihJU0ZMT0FUKHQpKXsKKyAgICBpZihyPj0zMyYmcjw9NjQpCisgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gMDsKKyAgfQorICBpZihJU1NDQUxBUih0KSYmcj49MSYmcjw9MzIpIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworaW50IGRhbmdlcm91c19JQyhzdHJ1Y3QgSUMgKnApCisvKiAgUmV0dXJucyB6ZXJvIGlmIHRoZSBJQyBwIGNhbiBiZSBzYWZlbHkgZXhlY3V0ZWQgICAgICovCisvKiAgd2l0aG91dCBkYW5nZXIgb2YgZXhjZXB0aW9ucyBvciBzaW1pbGFyIHRoaW5ncy4gICAgICovCisvKiAgdmJjYyBtYXkgZ2VuZXJhdGUgY29kZSBpbiB3aGljaCBub24tZGFuZ2Vyb3VzIElDcyAgICovCisvKiAgYXJlIHNvbWV0aW1lcyBleGVjdXRlZCBhbHRob3VnaCBjb250cm9sLWZsb3cgbWF5ICAgICovCisvKiAgbmV2ZXIgcmVhY2ggdGhlbSAobWFpbmx5IHdoZW4gbW92aW5nIGNvbXB1dGF0aW9ucyAgICovCisvKiAgb3V0IG9mIGxvb3BzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVHlwaWNhbCBJQ3MgdGhhdCBnZW5lcmF0ZSBleGNlcHRpb25zIG9uIHNvbWUgICAgICAgICovCisvKiAgbWFjaGluZXMgYXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gYWNjZXNzZXMgdmlhIHBvaW50ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gZGl2aXNpb24vbW9kdWxvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gb3ZlcmZsb3cgb24gc2lnbmVkIGludGVnZXIvZmxvYXRzICAgICAgICAgICAgICovCit7CisgIGludCBjPXAtPmNvZGU7CisgIGlmKChwLT5xMS5mbGFncyZEUkVGT0JKKXx8KHAtPnEyLmZsYWdzJkRSRUZPQkopfHwocC0+ei5mbGFncyZEUkVGT0JKKSkKKyAgICByZXR1cm4gMTsKKyAgaWYoKGM9PURJVnx8Yz09TU9EKSYmIShwLT5xMi5mbGFncyZLT05TVCkpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitpbnQgbXVzdF9jb252ZXJ0KGludCBvLGludCB0LGludCBjb25zdF9leHByKQorLyogIFJldHVybnMgemVybyBpZiBjb2RlIGZvciBjb252ZXJ0aW5nIG5wIHRvIHR5cGUgdCAgICAqLworLyogIGNhbiBiZSBvbWl0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE9uIHRoZSBQb3dlclBDIGNwdSBwb2ludGVycyBhbmQgMzJiaXQgICAgICAgICAgICAgICAqLworLyogIGludGVnZXJzIGhhdmUgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gYW5kIGNhbiB1c2UgICAqLworLyogIHRoZSBzYW1lIHJlZ2lzdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgb3A9byZOUSx0cD10Jk5ROworICBpZigob3A9PUxPTkd8fG9wPT1MTE9OR3x8b3A9PVBPSU5URVIpJiYodHA9PUxPTkd8fHRwPT1MTE9OR3x8dHA9PVBPSU5URVIpKSByZXR1cm4gMDsKKyAgaWYoKG9wPT1ET1VCTEV8fG9wPT1MRE9VQkxFKSYmKHRwPT1ET1VCTEV8fHRwPT1MRE9VQkxFKSkgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCit2b2lkIGdlbl9kcyhGSUxFICpmLHptYXggc2l6ZSxzdHJ1Y3QgVHlwICp0KQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSA8c2l6ZT4gYnl0ZXMgb2Ygc3RvcmFnZSAqLworLyogIGluaXRpYWxpemVkIHdpdGggemVyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICB0aXRsZShmKTsKKyAgaWYobmV3b2JqKXsKKyAgICBzaXplPXptbXVsdCh6bWRpdih6bWFkZChzaXplLGwyem0oN0wpKSxsMnptKDhMKSksbDJ6bSg4TCkpOworICAgIGVtaXR6bShmLHNpemUpOworICB9ZWxzZXsKKyAgICBlbWl0KGYsIlx0Lnplcm9cdCIpOworICAgIGVtaXR6bShmLHNpemUpOworICB9CisgIGVtaXQoZiwiXG4iKTsKKyAgbmV3b2JqPTA7Cit9CisKK3ZvaWQgZ2VuX2FsaWduKEZJTEUgKmYsem1heCBhbGlnbikKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBtYWtlIHN1cmUgdGhlIG5leHQgZGF0YSBpcyAgICAgKi8KKy8qICBhbGlnbmVkIHRvIG11bHRpcGxlcyBvZiA8YWxpZ24+IGJ5dGVzLiAgICAgICAgICAgICAgKi8KK3sKKyAgdGl0bGUoZik7CisgIGlmKHptMmwoYWxpZ24pPjEpCisgICAgZW1pdChmLCJcdC5hbGlnblx0M1xuIik7Cit9CisKK3ZvaWQgZ2VuX3Zhcl9oZWFkKEZJTEUgKmYsc3RydWN0IFZhciAqdikKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjcmVhdGUgdGhlIGhlYWQgb2YgYSB2YXJpYWJsZSAgKi8KKy8qICBkZWZpbml0aW9uLCBpLmUuIHRoZSBsYWJlbCBhbmQgaW5mb3JtYXRpb24gZm9yICAgICAgKi8KKy8qICBsaW5rYWdlIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGNvbnN0ZmxhZzsKKyAgdGl0bGUoZik7CisgIGlmKHYtPmNsaXN0KSBjb25zdGZsYWc9aXNfY29uc3Qodi0+dnR5cCk7CisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQyl7CisgICAgaWYoSVNGVU5DKHYtPnZ0eXAtPmZsYWdzKSkgcmV0dXJuOworICAgIGlmKHYtPmNsaXN0JiYoIWNvbnN0ZmxhZ3x8KGdfZmxhZ3NbMl0mVVNFREZMQUcpKSYmc2VjdGlvbiE9REFUQSl7ZW1pdChmLGRhdGFuYW1lKTtpZihmKSBzZWN0aW9uPURBVEE7fQorICAgIGlmKHYtPmNsaXN0JiZjb25zdGZsYWcmJiEoZ19mbGFnc1syXSZVU0VERkxBRykmJnNlY3Rpb24hPUNPREUpe2VtaXQoZixjb2RlbmFtZSk7aWYoZikgc2VjdGlvbj1DT0RFO30KKyAgICBpZighdi0+Y2xpc3QmJnNlY3Rpb24hPUJTUyl7ZW1pdChmLGJzc25hbWUpO2lmKGYpIHNlY3Rpb249QlNTO30KKyAgICBlbWl0KGYsIlx0LnR5cGVcdCVzJWxkLEBvYmplY3RcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgZW1pdChmLCJcdC5zaXplXHQlcyVsZCwlbGRcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSx6bTJsKHN6b2Yodi0+dnR5cCkpKTsKKyAgICBpZihzZWN0aW9uIT1CU1MpCisgICAgICBlbWl0KGYsIlx0LmFsaWduXHQzXG4lcyVsZDpcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgZWxzZXsKKyAgICAgIGVtaXQoZiwiXHQubGNvbW1cdCVzJWxkLCIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgICBuZXdvYmo9MTsKKyAgICB9CisgIH0KKyAgaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKKyAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXMlc1xuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICBpZih2LT5mbGFncyYoREVGSU5FRHxURU5UQVRJVkUpKXsKKyAgICAgIGlmKHYtPmNsaXN0JiYoIWNvbnN0ZmxhZ3x8KGdfZmxhZ3NbMl0mVVNFREZMQUcpKSYmc2VjdGlvbiE9REFUQSl7ZW1pdChmLGRhdGFuYW1lKTtpZihmKSBzZWN0aW9uPURBVEE7fQorICAgICAgaWYodi0+Y2xpc3QmJmNvbnN0ZmxhZyYmIShnX2ZsYWdzWzJdJlVTRURGTEFHKSYmc2VjdGlvbiE9Q09ERSl7ZW1pdChmLGNvZGVuYW1lKTtpZihmKSBzZWN0aW9uPUNPREU7fQorICAgICAgaWYoIXYtPmNsaXN0JiZzZWN0aW9uIT1CU1Mpe2VtaXQoZixic3NuYW1lKTtpZihmKSBzZWN0aW9uPUJTUzt9CisgICAgICBlbWl0KGYsIlx0LnR5cGVcdCVzJXMsQG9iamVjdFxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICAgIGVtaXQoZiwiXHQuc2l6ZVx0JXMlcywlbGRcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcix6bTJsKHN6b2Yodi0+dnR5cCkpKTsKKyAgICAgIGlmKHNlY3Rpb24hPUJTUykKKwllbWl0KGYsIlx0LmFsaWduXHQzXG4lcyVzOlxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICAgIGVsc2V7CisJZW1pdChmLCJcdC5jb21tXHQlcyVzLCIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisJbmV3b2JqPTE7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgZ2VuX2RjKEZJTEUgKmYsaW50IHQsc3RydWN0IGNvbnN0X2xpc3QgKnApCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIHN0YXRpYyBzdG9yYWdlICAgICAgICAgICovCisvKiAgaW5pdGlhbGl6ZWQgd2l0aCBjb25zdC1saXN0IHAuICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIHRpdGxlKGYpOworICBpZihJU1BPSU5URVIodCkpIHQ9VU5TSUdORUR8TE9ORzsKKyAgZW1pdChmLCJcdC4lc1x0IixkY3RbdCZOUV0pOworICBpZighcC0+dHJlZSl7CisgICAgaWYoSVNGTE9BVCh0KSl7CisgICAgICAvKiAgYXVjaCB3aWVkZXIgbmljaHQgc2VociBzY2hvZW4gdW5kIElFRUUgbm9ldGlnICAgKi8KKyAgICAgIHVuc2lnbmVkIGNoYXIgKmlwOworICAgICAgaXA9KHVuc2lnbmVkIGNoYXIgKikmcC0+dmFsLnZkb3VibGU7CisgICAgICBlbWl0KGYsIjB4JTAyeCUwMnglMDJ4JTAyeCIsaXBbM10saXBbMl0saXBbMV0saXBbMF0pOworICAgICAgaWYoKHQmTlEpIT1GTE9BVCl7CisgICAgICAgIGVtaXQoZiwiLDB4JTAyeCUwMnglMDJ4JTAyeCIsaXBbN10saXBbNl0saXBbNV0saXBbNF0pOworICAgICAgfQorICAgIH1lbHNleworICAgICAgZW1pdHZhbChmLCZwLT52YWwsdCZOVSk7CisgICAgfQorICB9ZWxzZXsKKyAgICBpZihwLT50cmVlLT5vLmFtKSBpZXJyb3IoOSk7CisgICAgcHJvYmoyKGYsJnAtPnRyZWUtPm8sdCZOVSk7CisgIH0KKyAgZW1pdChmLCJcbiIpO25ld29iaj0wOworfQorCisKKy8qICBUaGUgbWFpbiBjb2RlLWdlbmVyYXRpb24gcm91dGluZS4gICAgICAgICAgICAgICAgICAgKi8KKy8qICBmIGlzIHRoZSBzdHJlYW0gdGhlIGNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8uICAgICAgKi8KKy8qICBwIGlzIGEgcG9pbnRlciB0byBhIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBJQ3MgICAgICAgKi8KKy8qICBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBib2R5IHRvIGdlbmVyYXRlIGNvZGUgZm9yLiAgKi8KKy8qICB2IGlzIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBvZmZzZXQgaXMgdGhlIHNpemUgb2YgdGhlIHN0YWNrZnJhbWUgdGhlIGZ1bmN0aW9uICAgKi8KKy8qICBuZWVkcyBmb3IgbG9jYWwgdmFyaWFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwordm9pZCBnZW5fY29kZShGSUxFICpmLHN0cnVjdCBJQyAqcCxzdHJ1Y3QgVmFyICp2LHptYXggb2Zmc2V0KQorLyogIFRoZSBtYWluIGNvZGUtZ2VuZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGFkZGJ1ZixjLHQsY21wcmVnLGNtcGZsYWcsd2Fzbm9yZWcsaSx2YXJhcmdzPTAsZml4YXJncztzdHJ1Y3QgSUMgKm07CisgIGxvbmcgcHVzaGVkLG1heHB1c2hlZDsKKyAgaWYoREVCVUcmMSkgcHJpbnRmKCJnZW5fY29kZSgpXG4iKTsKKyAgaWYoc3RhYnMpIGRlYnVnX2luaXQoZix2KTsKKyAgZm9yKGM9MTtjPD1NQVhSO2MrKyl7cmVnc1tjXT1yZWdzYVtjXTtzdFtjXT1FU0dOO30KKyAgLyogV2UgZG8gYSBwYXNzIG92ZXIgdGhlIGNvZGUgdG8gcmV0cmlldmUgc29tZSBpbmZvIGFuZCBwcmVwYXJlIGNlcnRhaW4gb3B0aW1pemF0aW9ucyAqLworICBhZGRidWY9MDttYXhwdXNoZWQ9MDsKKyAgdGl0bGUoZik7CisgIGZvcihtPXA7bTttPW0tPm5leHQpeworICAgIGM9bS0+Y29kZTt0PW0tPnR5cGYmTlU7CisgICAgaWYoYz09QUxMT0NSRUcpIHtyZWdzW20tPnExLnJlZ109MTtjb250aW51ZTt9CisgICAgaWYoYz09RlJFRVJFRykge3JlZ3NbbS0+cTEucmVnXT0wO2NvbnRpbnVlO30KKyAgICBpZihjPT1DT01QQVJFJiYobS0+cTIuZmxhZ3MmS09OU1QpKXsKKyAgICAgIGV2YWxfY29uc3QoJm0tPnEyLnZhbCx0KTsKKyAgICAgIGlmKHptZXF0byh2bWF4LGwyem0oMEwpKSYmenVtZXF0byh2dW1heCx1bDJ6dW0oMFVMKSkmJnpsZGVxdG8odmxkb3VibGUsZDJ6bGQoMC4wKSkpeworICAgICAgICBtLT5xMi5mbGFncz0wO20tPmNvZGU9Yz1URVNUOworICAgICAgfQorICAgIH0KKyAgICBpZihJU0lOVCh0KSYmKG0tPnEyLmZsYWdzJktPTlNUKSYmKGM9PU1VTFR8fCgoYz09RElWfHxjPT1NT0QpJiYodCZVTlNJR05FRCkpKSl7CisgICAgICBldmFsX2NvbnN0KCZtLT5xMi52YWwsdCk7CisgICAgICBpPXBvZjIodnVtYXgpOworICAgICAgaWYoaSl7CisgICAgICAgIGlmKGM9PU1PRCl7CisgICAgICAgICAgdm1heD16bXN1Yih2bWF4LGwyem0oMUwpKTsKKyAgICAgICAgICBtLT5jb2RlPUFORDsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgdm1heD1sMnptKGktMSk7CisgICAgICAgICAgaWYoYz09RElWKSBtLT5jb2RlPVJTSElGVDsgZWxzZSBtLT5jb2RlPUxTSElGVDsKKyAgICAgICAgfQorICAgICAgICBjPW0tPmNvZGU7CisJZ3ZhbC52bWF4PXZtYXg7CisJZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworCWlmKGM9PUFORCl7CisJICBpbnNlcnRfY29uc3QoJm0tPnEyLnZhbCx0Jk5VKTsKKwl9ZWxzZXsKKwkgIGluc2VydF9jb25zdCgmbS0+cTIudmFsLElOVCk7CisJICBwLT50eXBmMj1JTlQ7CisJfQorICAgICAgfQorICAgIH0KKyAgICAvKiBOZWVkIG9uZSBzdGFjayBzbG90IGZvciB0cmFuc2ZycmluZyBiZXR3ZWVuIGludGVnZXIgYW5kIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVycy4gKi8KKyAgICB0Jj1OUTsKKyAgICBpZihjPT1DT05WRVJUJiZhZGRidWY8OCYmKChJU0ZMT0FUKHQpJiYhSVNGTE9BVChtLT50eXBmMikpfHwoIUlTRkxPQVQodCkmJklTRkxPQVQocC0+dHlwZjIpKSkpIGFkZGJ1Zj04OworICAgIC8qIE1heSBuZWVkIG9uZSBzdGFjayBzbG90IGZvciBpbmxpbmUgbWVtY3B5LiAqLworLyogICAgIGlmKChjPT1BU1NJR058fGM9PVBVU0gpJiZ0Pj1QT0lOVEVSJiZhZGRidWY8OCkgYWRkYnVmPTg7ICovCisgICAgLyogTmVlZCBhZGRpdGlvbmFsIHN0YWNrIHNsb3RzIGZvciBwYXNzaW5nIGZ1bmN0aW9uIGFyZ3VtZW50cy4gKi8KKyAgICBpZihjPT1DQUxMJiZtYXhwdXNoZWQ8em0ybChtLT5xMi52YWwudm1heCkpIG1heHB1c2hlZD16bTJsKG0tPnEyLnZhbC52bWF4KTsKKyAgICBpZihjPT1DQUxMJiYobS0+cTEuZmxhZ3MmVkFSKSYmIXN0cmNtcChtLT5xMS52LT5pZGVudGlmaWVyLCJfX3ZhX3N0YXJ0IikpIHZhcmFyZ3M9MTsKKyAgICAvKiBOZWVkIHVwIHRvIDQgc3RhY2sgc2xvdHMgZm9yIGNhbGxpbmcgZGl2L21vZC1mdW5jdGlvbnMuICovCisgICAgaWYoKGM9PURJVnx8Yz09TU9EKSYmSVNJTlQodCkmJmFkZGJ1ZjwzMil7CisgICAgICBpZihyZWdzWzI1XXx8cmVnc1syNl18fHJlZ3NbMjhdfHxyZWdzWzI5XSkgYWRkYnVmPTMyOworICAgIH0KKyAgfQorICAvKiBOb2NoIG5pY2h0IG9rLiAqLworICBpZih2YXJhcmdzKXsKKyAgICBmaXhhcmdzPTA7CisgICAgZm9yKGk9MDtpPHYtPnZ0eXAtPmV4YWN0LT5jb3VudDtpKyspeworICAgICAgYz0oKnYtPnZ0eXAtPmV4YWN0LT5zbClbaV0uc3R5cC0+ZmxhZ3M7CisgICAgICBpZihJU1BPSU5URVIoYykpIGZpeGFyZ3MrKzsKKyAgICB9CisgICAgaWYoZml4YXJnczw2KSBhZGRidWYrPSg2LWZpeGFyZ3MpKjE2OworICB9CisgIGZ1bmN0aW9uX3RvcChmLHYsem0ybChvZmZzZXQrYWRkYnVmKSxtYXhwdXNoZWQpOworICBpZih2YXJhcmdzKXsKKyAgICBmb3IoaT1maXhhcmdzKzE7aTw9NjtpKyspeworICAgICAgZW1pdChmLCJcdHN0cVx0JXMsJWxkKCVzKVxuIixyZWduYW1lc1sxNitpXSxmcmFtZXNpemUtKDctaSkqMTYscmVnbmFtZXNbc3BdKTsKKyAgICAgIGVtaXQoZiwiXHRzdHRcdCVzLCVsZCglcylcbiIscmVnbmFtZXNbNDgraV0sZnJhbWVzaXplLSg3LWkpKjE2KzgscmVnbmFtZXNbc3BdKTsKKyAgICB9CisgIH0KKyAgcHVzaGVkPTA7CisgIGZvcig7cDtwcihmLHApLHA9cC0+bmV4dCl7CisgICAgaWYoREVCVUcpIHByaWMyKHN0ZG91dCxwKTsKKyAgICBpZihkZWJ1Z19pbmZvKXsKKyAgICAgIGlmKHN0YWJzKSAKKwlkZWJ1Z19JQyhmLHApOworICAgICAgZWxzZQorCWR3YXJmMl9saW5lX2luZm8oZixwKTsKKyAgICB9CisgICAgYz1wLT5jb2RlO3Q9cC0+dHlwZjsKKyAgICBpZihjPT1OT1ApIGNvbnRpbnVlOworICAgIGlmKGM9PUFMTE9DUkVHKSB7cmVnc1twLT5xMS5yZWddPTE7Y29udGludWU7fQorICAgIGlmKGM9PUZSRUVSRUcpIHtyZWdzW3AtPnExLnJlZ109MDtjb250aW51ZTt9CisgICAgaWYoYz09TEFCRUx8fChjPj1CRVEmJmM8PUJSQSkpeworICAgICAgaW50IGk7CisgICAgICBmb3IoaT0xO2k8PTMyO2krKykKKyAgICAgICAgaWYocmVnc1tpXSYmIXJlZ3NhW2ldKSBleHRlbmQoZixpKTsKKyAgICB9CisgICAgaWYoYz09TEFCRUwpIHtlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCx0KTtjb250aW51ZTt9CisgICAgaWYoYz09QlJBKSB7ZW1pdChmLCJcdGJyXHQlcyVkXG4iLGxhYnByZWZpeCx0KTtjb250aW51ZTt9CisgICAgaWYoYz49QkVRJiZjPEJSQSl7CisgICAgICBpZihjbXBmbGFnKXsKKyAgICAgICAgZW1pdChmLCJcdCVzYiVzXHQlcywlcyVkXG4iLGNtcHJlZzw9MzI/IiI6ImYiLGNtcGZsYWc8MD8iZXEiOiJuZSIscmVnbmFtZXNbY21wcmVnXSxsYWJwcmVmaXgsdCk7CisgICAgICB9ZWxzZXsKKyAgICAgICAgZW1pdChmLCJcdCVzYiVzXHQlcywlcyVkXG4iLGNtcHJlZzw9MzI/IiI6ImYiLGNjc1tjLUJFUV0scmVnbmFtZXNbY21wcmVnXSxsYWJwcmVmaXgsdCk7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09TU9WRVRPUkVHKXsKKyAgICAgIGxvYWRfcmVnKGYscC0+ei5yZWcsJnAtPnExLHAtPnoucmVnPD0zMj9MT05HOkRPVUJMRSwwKTsKKyAgICAgIHAtPnouZmxhZ3M9MDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1NT1ZFRlJPTVJFRyl7CisgICAgICBzdG9yZV9yZWcoZixwLT5xMS5yZWcsJnAtPnoscC0+cTEucmVnPD0zMj9MT05HOkRPVUJMRSk7CisgICAgICBwLT56LmZsYWdzPTA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoSVNQT0lOVEVSKHQpKSB0PSgodCZ+TlUpfFVOU0lHTkVEfExPTkcpOworICAgIGlmKChjPT1BU1NJR058fGM9PVBVU0gpJiYoIUlTU0NBTEFSKHQpfHwoKHQmTlEpPT1DSEFSJiZ6bTJsKHAtPnEyLnZhbC52bWF4KSE9MSkpKXsKKyAgICAgIHptYXggc2l6ZTsgc3RydWN0IG9iaiBsb29wczsKKyAgICAgIGludCBzYWxpZ24sZGFsaWduLGNsLGExLGEyLG1yLG1zOworICAgICAgc2l6ZT1wLT5xMi52YWwudm1heDsKKyAgICAgIHNhbGlnbj1iYWxpZ24oJnAtPnExKTsKKyAgICAgIGlmKGM9PVBVU0gpIGRhbGlnbj0wOyBlbHNlIGRhbGlnbj1iYWxpZ24oJnAtPnopOworICAgICAgaWYoc2FsaWduPj0wJiZkYWxpZ24+PTAmJihzYWxpZ24mMyk9PShkYWxpZ24mMykpeworICAgICAgICBhMT10MTsgYTI9dDI7CisgICAgICB9ZWxzZXsKKyAgICAgICAgaWYoIWhlbHBsKSBoZWxwbD0rK2xhYmVsOworICAgICAgICBjbD0wO21yPTA7bXM9MDsKKyAgICAgICAgZm9yKGk9MTtpPD0zMjtpKyspeworICAgICAgICAgIGlmKGkhPTE3JiZpIT0xOCYmaSE9MTkmJnJlZ3VzZWRbaV0mJiFyZWdzY3JhdGNoW2ldJiYhcmVnc1tpXSkgbXI9aTsKKyAgICAgICAgICBpZihyZWdzW2ldJiZyZWdzY3JhdGNoW2ldKSBtcz0xOworICAgICAgICB9CisgICAgICAgIGlmKG1yPT0wKSBtcj10MzsKKyAgICAgICAgaWYocmVnc1sxN118fHJlZ3NbMThdfHxyZWdzWzE5XXx8ZnVuY3Rpb25fY2FsbHM9PTApIG1zPTE7CisgICAgICAgIGlmKG1zKSBlbWl0KGYsIlx0bGRhXHQlcywlcyVkXG4iLHJlZ25hbWVzW21yXSxsYWJwcmVmaXgsaGVscGwpOworICAgICAgICBpZihyZWdzWzE3XSkgZW1pdChmLCJcdHN0cVx0JXMsJWQoJXMpXG4iLHJlZ25hbWVzWzE3XSw4KmNsKysscmVnbmFtZXNbbXJdKTsKKyAgICAgICAgaWYocmVnc1sxOF0pIGVtaXQoZiwiXHRzdHFcdCVzLCVkKCVzKVxuIixyZWduYW1lc1sxOF0sOCpjbCsrLHJlZ25hbWVzW21yXSk7CisgICAgICAgIGlmKHJlZ3NbMTldKSBlbWl0KGYsIlx0c3RxXHQlcywlZCglcylcbiIscmVnbmFtZXNbMTldLDgqY2wrKyxyZWduYW1lc1ttcl0pOworICAgICAgICBhMT0xODthMj0xNzsKKyAgICAgICAgaWYocC0+ei5hbSYmcC0+ei5hbS0+YmFzZT09MTgpIGllcnJvcigwKTsKKyAgICAgICAgaWYoIXAtPnouYW0mJihwLT56LmZsYWdzJlJFRykmJnAtPnoucmVnPT0xOCkgaWVycm9yKDApOworICAgICAgfQorICAgICAgaWYocC0+cTEuZmxhZ3MmRFJFRk9CSil7CisgICAgICAgIHAtPnExLmZsYWdzJj1+RFJFRk9CSjsKKyAgICAgICAgbG9hZF9yZWcoZixhMSwmcC0+cTEsUE9JTlRFUixhMSk7CisgICAgICAgIHAtPnExLmZsYWdzfD1EUkVGT0JKOworICAgICAgfWVsc2V7CisgICAgICAgIGxvYWRfYWRkcmVzcyhmLGExLCZwLT5xMSxQT0lOVEVSKTsKKyAgICAgIH0KKyAgICAgIGlmKHAtPnouZmxhZ3MmRFJFRk9CSil7CisgICAgICAgIHAtPnouZmxhZ3MmPX5EUkVGT0JKOworICAgICAgICBsb2FkX3JlZyhmLGEyLCZwLT56LFBPSU5URVIsYTIpOworICAgICAgICBwLT56LmZsYWdzfD1EUkVGT0JKOworICAgICAgfWVsc2V7CisgICAgICAgIGlmKGM9PVBVU0gpeworICAgICAgICAgIGVtaXQoZiwiXHRsZGFcdCVzLCVsZCglcylcbiIscmVnbmFtZXNbYTJdLHB1c2hlZCxyZWduYW1lc1tzcF0pOworICAgICAgICAgIHB1c2hlZCs9em0ybChwLT5xMi52YWwudm1heCk7CisgICAgICAgIH1lbHNleworICAgICAgICAgIGxvYWRfYWRkcmVzcyhmLGEyLCZwLT56LFBPSU5URVIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZihzYWxpZ24+PTAmJmRhbGlnbj49MCYmKHNhbGlnbiYzKT09KGRhbGlnbiYzKSl7CisgICAgICAgIGludCBkbzY0LG0sczsKKyAgICAgICAgaWYoKHNhbGlnbiY3KT09KGRhbGlnbiY3KSkKKyAgICAgICAgICB7ZG82ND0xO209ODtzPSdxJzt9CisgICAgICAgIGVsc2UKKyAgICAgICAgICB7ZG82ND0wO209NDtzPSdsJztzYWxpZ24mPTM7fQorICAgICAgICBpZihzYWxpZ24mNyl7CisgICAgICAgICAgZW1pdChmLCJcdGxkJWNcdCVzLCVkKCVzKVxuIixzLHJlZ25hbWVzW3QzXSwtc2FsaWduLHJlZ25hbWVzW3QxXSk7CisgICAgICAgICAgZW1pdChmLCJcdGxkJWNcdCVzLCVkKCVzKVxuIixzLHJlZ25hbWVzW3Q0XSwtc2FsaWduLHJlZ25hbWVzW3QyXSk7CisgICAgICAgICAgY2w9KDE8PHNhbGlnbiktMTsKKyAgICAgICAgICBpZighem1sZXEobDJ6bShtLXNhbGlnbiksc2l6ZSkpIGNsKz0oKDE8PChtLXNhbGlnbi16bTJsKHNpemUpKSktMSk8PChzYWxpZ24rem0ybChzaXplKSk7CisgICAgICAgICAgZW1pdChmLCJcdHphcFx0JXMsJWQsJXNcbiIscmVnbmFtZXNbdDNdLGNsLHJlZ25hbWVzW3QzXSk7CisgICAgICAgICAgZW1pdChmLCJcdHphcG5vdFx0JXMsJWQsJXNcbiIscmVnbmFtZXNbdDRdLGNsLHJlZ25hbWVzW3Q0XSk7CisgICAgICAgICAgZW1pdChmLCJcdGJpc1x0JXMsJXMsJXNcbiIscmVnbmFtZXNbdDNdLHJlZ25hbWVzW3Q0XSxyZWduYW1lc1t0M10pOworICAgICAgICAgIGVtaXQoZiwiXHRzdCVjXHQlcywlZCglcylcbiIscyxyZWduYW1lc1t0M10sLXNhbGlnbixyZWduYW1lc1t0Ml0pOworICAgICAgICAgIHNpemU9em1zdWIoc2l6ZSx6bTJsKG0tc2FsaWduKSk7CisgICAgICAgICAgc2FsaWduPW0tc2FsaWduOworICAgICAgICB9ZWxzZQorICAgICAgICAgIHNhbGlnbj0wOworICAgICAgICBsb29wcy52YWwudm1heD16bWRpdihzaXplLGwyem0oOCptKSk7CisgICAgICAgIGlmKHptbGVxKGwyem0oMkwpLGxvb3BzLnZhbC52bWF4KSl7CisgICAgICAgICAgbG9vcHMuZmxhZ3M9S09OU1Q7CisgICAgICAgICAgbG9vcHMuYW09MDsKKyAgICAgICAgICBsb2FkX3JlZyhmLHQzLCZsb29wcyxMT05HLHQzKTsKKyAgICAgICAgICBjbD0rK2xhYmVsOworICAgICAgICAgIGVtaXQoZiwiXHQuYWxpZ25cdDRcbiVzJWQ6XG4iLGxhYnByZWZpeCxjbCk7CisgICAgICAgIH0KKyAgICAgICAgaWYoIXptZXF0byhsb29wcy52YWwudm1heCxsMnptKDApKSl7CisgICAgICAgICAgZm9yKGk9MDtpPDg7aSs9Mil7CisgICAgICAgICAgICBlbWl0KGYsIlx0bGQlY1x0JXMsJWQoJXMpXG4iLHMscmVnbmFtZXNbdDRdLHNhbGlnbitpKm0scmVnbmFtZXNbdDFdKTsKKyAgICAgICAgICAgIGVtaXQoZiwiXHRsZCVjXHQlcywlZCglcylcbiIscyxyZWduYW1lc1t0NV0sc2FsaWduK2kqbSttLHJlZ25hbWVzW3QxXSk7CisgICAgICAgICAgICBlbWl0KGYsIlx0c3QlY1x0JXMsJWQoJXMpXG4iLHMscmVnbmFtZXNbdDRdLHNhbGlnbitpKm0scmVnbmFtZXNbdDJdKTsKKyAgICAgICAgICAgIGVtaXQoZiwiXHRzdCVjXHQlcywlZCglcylcbiIscyxyZWduYW1lc1t0NV0sc2FsaWduK2kqbSttLHJlZ25hbWVzW3QyXSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKHptbGVxKGwyem0oMkwpLGxvb3BzLnZhbC52bWF4KSl7CisgICAgICAgICAgZW1pdChmLCJcdGFkZHFcdCVzLCVkLCVzXG4iLHJlZ25hbWVzW3QxXSw4Km0scmVnbmFtZXNbdDFdKTsKKyAgICAgICAgICBlbWl0KGYsIlx0YWRkcVx0JXMsJWQsJXNcbiIscmVnbmFtZXNbdDJdLDgqbSxyZWduYW1lc1t0Ml0pOworICAgICAgICAgIGVtaXQoZiwiXHRzdWJxXHQlcywxLCVzXG4iLHJlZ25hbWVzW3QzXSxyZWduYW1lc1t0M10pOworICAgICAgICAgIGVtaXQoZiwiXHRibmVcdCVzLCVzJWRcbiIscmVnbmFtZXNbdDNdLGxhYnByZWZpeCxjbCk7CisgICAgICAgIH1lbHNleworICAgICAgICAgIGlmKCF6bWVxdG8obG9vcHMudmFsLnZtYXgsbDJ6bSgwTCkpKQorICAgICAgICAgICAgc2FsaWduKz04Km07CisgICAgICAgIH0KKyAgICAgICAgc2l6ZT16bWFuZChzaXplLGwyem0oOCptLTEpKTsKKyAgICAgICAgZm9yKGk9MDtpPCh6bTJsKHNpemUpL20vMikqMjtpKz0yKXsKKyAgICAgICAgICBlbWl0KGYsIlx0bGQlY1x0JXMsJWQoJXMpXG4iLHMscmVnbmFtZXNbdDRdLHNhbGlnbitpKm0scmVnbmFtZXNbdDFdKTsKKyAgICAgICAgICBlbWl0KGYsIlx0bGQlY1x0JXMsJWQoJXMpXG4iLHMscmVnbmFtZXNbdDVdLHNhbGlnbitpKm0rbSxyZWduYW1lc1t0MV0pOworICAgICAgICAgIGVtaXQoZiwiXHRzdCVjXHQlcywlZCglcylcbiIscyxyZWduYW1lc1t0NF0sc2FsaWduK2kqbSxyZWduYW1lc1t0Ml0pOworICAgICAgICAgIGVtaXQoZiwiXHRzdCVjXHQlcywlZCglcylcbiIscyxyZWduYW1lc1t0NV0sc2FsaWduK2kqbSttLHJlZ25hbWVzW3QyXSk7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZT16bWFuZChzaXplLGwyem0oMiptLTEpKTsKKyAgICAgICAgaWYoem0ybChzaXplKT49bSl7CisgICAgICAgICAgZW1pdChmLCJcdGxkJWNcdCVzLCVkKCVzKVxuIixzLHJlZ25hbWVzW3Q0XSxzYWxpZ24raSptLHJlZ25hbWVzW3QxXSk7CisgICAgICAgICAgZW1pdChmLCJcdHN0JWNcdCVzLCVkKCVzKVxuIixzLHJlZ25hbWVzW3Q0XSxzYWxpZ24raSptLHJlZ25hbWVzW3QyXSk7CisgICAgICAgICAgc2l6ZT16bXN1YihzaXplLGwyem0obSkpO2krKzsKKyAgICAgICAgfQorICAgICAgICBpZih6bTJsKHNpemUpPjApeworICAgICAgICAgIGlmKHptMmwoc2l6ZSk9PTQpeworICAgICAgICAgICAgZW1pdChmLCJcdGxkbFx0JXMsJWQoJXMpXG4iLHJlZ25hbWVzW3Q0XSxzYWxpZ24raSptLHJlZ25hbWVzW3QxXSk7CisgICAgICAgICAgICBlbWl0KGYsIlx0c3RsXHQlcywlZCglcylcbiIscmVnbmFtZXNbdDRdLHNhbGlnbitpKm0scmVnbmFtZXNbdDJdKTsKKyAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGVtaXQoZiwiXHRsZCVjXHQlcywlZCglcylcbiIscyxyZWduYW1lc1t0NF0sc2FsaWduK2kqbSxyZWduYW1lc1t0MV0pOworICAgICAgICAgICAgZW1pdChmLCJcdGxkJWNcdCVzLCVkKCVzKVxuIixzLHJlZ25hbWVzW3Q1XSxzYWxpZ24raSptLHJlZ25hbWVzW3QyXSk7CisgICAgICAgICAgICBjbD0oMTw8em0ybChzaXplKSktMTsKKyAgICAgICAgICAgIGVtaXQoZiwiXHR6YXBub3RcdCVzLCVkLCVzXG4iLHJlZ25hbWVzW3Q0XSxjbCxyZWduYW1lc1t0NF0pOworICAgICAgICAgICAgZW1pdChmLCJcdHphcFx0JXMsJWQsJXNcbiIscmVnbmFtZXNbdDVdLGNsLHJlZ25hbWVzW3Q1XSk7CisgICAgICAgICAgICBlbWl0KGYsIlx0YmlzXHQlcywlcywlc1xuIixyZWduYW1lc1t0NF0scmVnbmFtZXNbdDVdLHJlZ25hbWVzW3Q0XSk7CisgICAgICAgICAgICBlbWl0KGYsIlx0c3QlY1x0JXMsJWQoJXMpXG4iLHMscmVnbmFtZXNbdDRdLHNhbGlnbitpKm0scmVnbmFtZXNbdDJdKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcC0+ei5mbGFncz0wOyAvKiB0byBwcmV2ZW50IHByKCkgZnJvbS4uLiAqLworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGZvcihpPTE7aTw9MzI7aSsrKXsKKyAgICAgICAgaWYoaSE9MTcmJmkhPTE4JiZpIT0xOSYmcmVnc1tpXSYmcmVnc2NyYXRjaFtpXSkKKyAgICAgICAgICBlbWl0KGYsIlx0c3RxXHQlcywlZCglcylcbiIscmVnbmFtZXNbaV0sOCpjbCsrLHJlZ25hbWVzW21yXSk7CisgICAgICB9CisgICAgICBpZihmdW5jdGlvbl9jYWxscz09MCkgZW1pdChmLCJcdHN0cVx0JXMsJWQoJXMpXG4iLHJlZ25hbWVzW2xyXSw4KmNsKysscmVnbmFtZXNbbXJdKTsKKyAgICAgIGlmKGNsPmhlbHBzKSBoZWxwcz1jbDsKKyAgICAgIGxvb3BzLnZhbC52bWF4PXNpemU7CisgICAgICBsb29wcy5mbGFncz1LT05TVDsKKyAgICAgIGxvb3BzLmFtPTA7CisgICAgICBsb2FkX3JlZyhmLDE5LCZsb29wcyxMT05HLDE5KTsKKyAgICAgIGVtaXQoZiwiXHQuZ2xvYmFsXHQlc21lbWNweVxuIixpZHByZWZpeCk7CisgICAgICBlbWl0KGYsIlx0anNyXHQlcywlc21lbWNweVxuIixyZWduYW1lc1tscl0saWRwcmVmaXgpOworICAgICAgZW1pdChmLCJcdGxkZ3BcdCVzLDAoJXMpXG4iLHJlZ25hbWVzW2dwXSxyZWduYW1lc1tscl0pOworICAgICAgY2w9MDsKKyAgICAgIGlmKG1zJiZtcj09dDMpIGVtaXQoZiwiXHRsZGFcdCVzLCVzJWRcbiIscmVnbmFtZXNbbXJdLGxhYnByZWZpeCxoZWxwbCk7CisgICAgICBpZihyZWdzWzE3XSkgZW1pdChmLCJcdGxkcVx0JXMsJWQoJXMpXG4iLHJlZ25hbWVzWzE3XSw4KmNsKysscmVnbmFtZXNbbXJdKTsKKyAgICAgIGlmKHJlZ3NbMThdKSBlbWl0KGYsIlx0bGRxXHQlcywlZCglcylcbiIscmVnbmFtZXNbMThdLDgqY2wrKyxyZWduYW1lc1ttcl0pOworICAgICAgaWYocmVnc1sxOV0pIGVtaXQoZiwiXHRsZHFcdCVzLCVkKCVzKVxuIixyZWduYW1lc1sxOV0sOCpjbCsrLHJlZ25hbWVzW21yXSk7CisgICAgICBmb3IoaT0xO2k8PTMyO2krKyl7CisgICAgICAgIGlmKGkhPTE3JiZpIT0xOCYmaSE9MTkmJnJlZ3NbaV0mJnJlZ3NjcmF0Y2hbaV0pCisgICAgICAgICAgZW1pdChmLCJcdGxkcVx0JXMsJWQoJXMpXG4iLHJlZ25hbWVzW2ldLDgqY2wrKyxyZWduYW1lc1ttcl0pOworICAgICAgfQorICAgICAgaWYoZnVuY3Rpb25fY2FsbHM9PTApIGVtaXQoZiwiXHRsZHFcdCVzLCVkKCVzKVxuIixyZWduYW1lc1tscl0sOCpjbCsrLHJlZ25hbWVzW21yXSk7CisgICAgICBwLT56LmZsYWdzPTA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoaXNyZWcocTEpKSB3YXNub3JlZz0xOyBlbHNlIHdhc25vcmVnPTA7CisgICAgcD1kb19yZWZzKGYscCk7CisgICAgYz1wLT5jb2RlOworICAgIGlmKGM9PUNPTlZFUlQpeworICAgICAgaW50IHRvOworICAgICAgdG89cC0+dHlwZjImTlU7CisgICAgICBpZihJU1BPSU5URVIodG8pKSB0bz0oVU5TSUdORUR8TE9ORyk7CisgICAgICBpZihJU0lOVCh0bykmJklTSU5UKHQpKXsKKyAgICAgICAgaWYoKHRvJk5RKT49KHQmTlEpKXsKKyAgICAgICAgICBpZigodCZOUSk8SU5UKXsKKyAgICAgICAgICAgIGlmKHQmVU5TSUdORUQpeworICAgICAgICAgICAgICBlbWl0KGYsIlx0emFwbm90XHQlcywlZCwlc1xuIixyZWduYW1lc1txMXJlZ10sKHQmTlEpPT1DSEFSPzE6MyxyZWduYW1lc1t6cmVnXSk7CisgICAgICAgICAgICAgIHN0W3pyZWddPUVVTlM7Y29udGludWU7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgZW1pdChmLCJcdHNleHQlY1x0JXMsJXNcbiIsKHQmTlEpPT1DSEFSPydiJzondycscmVnbmFtZXNbcTFyZWddLHJlZ25hbWVzW3pyZWddKTsKKyAgICAgICAgICAgICAgc3RbenJlZ109RVNHTjtjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgenJlZz1xMXJlZzsKKyAgICAgICAgfWVsc2UgaWYoKHQmTlEpPT1MT05HfHwodCZOUSk9PUxMT05HKXsKKyAgICAgICAgICBpZih0byZVTlNJR05FRCkKKyAgICAgICAgICAgIHVleHRlbmQoZixxMXJlZyk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZXh0ZW5kKGYscTFyZWcpOworICAgICAgICAgIHN0W3ExcmVnXT1FU0dOOworICAgICAgICAgIHpyZWc9cTFyZWc7CisgICAgICAgIH1lbHNleworICAgICAgICAgIGlmKCh0byZVTlNJR05FRCk9PSh0JlVOU0lHTkVEKSl7CisgICAgICAgICAgICB6cmVnPXExcmVnOworICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgaWYodG8mVU5TSUdORUQpeworICAgICAgICAgICAgICBlbWl0KGYsIlx0emFwbm90XHQlcywlZCwlc1xuIixyZWduYW1lc1txMXJlZ10sKHQmTlEpPT1DSEFSPzE6MyxyZWduYW1lc1t6cmVnXSk7CisgICAgICAgICAgICAgIHN0W3pyZWddPUVVTlM7Y29udGludWU7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgZW1pdChmLCJcdHNleHQlY1x0JXMsJXNcbiIsKHQmTlEpPT1DSEFSPydiJzondycscmVnbmFtZXNbcTFyZWddLHJlZ25hbWVzW3pyZWddKTsKKyAgICAgICAgICAgICAgc3RbenJlZ109RVNHTjtjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZihJU0ZMT0FUKHRvKSl7CisgICAgICAgIHN0W3pyZWddPUVTR047CisgICAgICAgIGlmKElTRkxPQVQodCkpeworICAgICAgICAgIGVtaXQoZiwiXHRjdnQlYyVjXHQlcywlc1xuIix4X3RbdG8mTlFdLHhfdFt0Jk5RXSxyZWduYW1lc1txMXJlZ10scmVnbmFtZXNbenJlZ10pOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisvKiAgICAgIGlmKHQmVU5TSUdORUQpIGllcnJvcigwKTsgKi8KKyAgICAgICAgZW1pdChmLCJcdGN2dHRxY1x0JXMsJXNcbiIscmVnbmFtZXNbcTFyZWddLHJlZ25hbWVzW2YzXSk7CisvKiAgICAgIGVtaXQoZiwiXHRmdG9pdFx0JXMsJXNcbiIscmVnbmFtZXNbcTFyZWddLHJlZ25hbWVzW3pyZWddKTsgICovCisvKiAgICAgIGVtaXQoZiwiXHQubG9uZ1x0JWxkXG4iLCgweDFjbDw8MjYpKygweDcwbDw8NSkrKDMxbDw8MTYpKygobG9uZykocTFyZWctMzMpPDwyMSkrenJlZy0xKTsgKi8KKyAgICAgICAgZW1pdChmLCJcdHN0dFx0JXMsJWxkKCVzKVxuIixyZWduYW1lc1tmM10sZnJhbWVzaXplLWFkZGJ1ZixyZWduYW1lc1tzcF0pOworICAgICAgICBlbWl0KGYsIlx0bGRxXHQlcywlbGQoJXMpXG4iLHJlZ25hbWVzW3pyZWddLGZyYW1lc2l6ZS1hZGRidWYscmVnbmFtZXNbc3BdKTsKKyAgICAgICAgc3RbenJlZ109RVNHTjsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZihJU0ZMT0FUKHQpKXsKKy8qICAgICAgaWYodG8mVU5TSUdORUQpIGllcnJvcigwKTsgKi8KKy8qICAgICAgZW1pdChmLCJcdGl0b2Z0XHQlcywlc1xuIixyZWduYW1lc1txMXJlZ10scmVnbmFtZXNbenJlZ10pOyAgKi8KKyAgICAgICAgZW1pdChmLCJcdHN0cVx0JXMsJWxkKCVzKVxuIixyZWduYW1lc1txMXJlZ10sZnJhbWVzaXplLWFkZGJ1ZixyZWduYW1lc1tzcF0pOworICAgICAgICBlbWl0KGYsIlx0bGR0XHQlcywlbGQoJXMpXG4iLHJlZ25hbWVzW3pyZWddLGZyYW1lc2l6ZS1hZGRidWYscmVnbmFtZXNbc3BdKTsKKyAgICAgICAgZW1pdChmLCJcdGN2dHElY1x0JXMsJXNcbiIseF90W3QmMTVdLHJlZ25hbWVzW3pyZWddLHJlZ25hbWVzW3pyZWddKTsKKworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoYz09S09NUExFTUVOVCl7CisgICAgICBlbWl0KGYsIlx0b3Jub3RcdCVzLCVzLCVzXG4iLHJlZ25hbWVzW3IzMV0scmVnbmFtZXNbcTFyZWddLHJlZ25hbWVzW3pyZWddKTsKKyAgICAgIGlmKCh0Jk5RKT09SU5UKSBzdFt6cmVnXT0wOyBlbHNlIHN0W3pyZWddPUVTR047CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09U0VUUkVUVVJOKXsKKyAgICAgIGlmKHAtPnoucmVnKXsKKyAgICAgICAgaWYoenJlZz09MCkgbG9hZF9yZWcoZixwLT56LnJlZywmcC0+cTEsdCx0Myk7CisgICAgICAgIGV4dGVuZChmLHAtPnoucmVnKTsKKyAgICAgIH1lbHNlCisgICAgICAgIGllcnJvcigwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1HRVRSRVRVUk4peworICAgICAgaWYocC0+cTEucmVnKXsKKyAgICAgICAgenJlZz1wLT5xMS5yZWc7CisgICAgICAgIHN0W3pyZWddPUVTR047CisgICAgICB9ZWxzZQorICAgICAgICBwLT56LmZsYWdzPTA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09Q0FMTCl7CisgICAgICBpbnQgcmVnOworICAgICAgaWYoKHAtPnExLmZsYWdzJlZBUikmJnAtPnExLnYtPmZpJiZwLT5xMS52LT5maS0+aW5saW5lX2FzbSl7CisgICAgICAgIGVtaXRfaW5saW5lX2FzbShmLHAtPnExLnYtPmZpLT5pbmxpbmVfYXNtKTsKKyAgICAgICAgcHVzaGVkLT16bTJsKHAtPnEyLnZhbC52bWF4KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZigocC0+cTEuZmxhZ3MmVkFSKSYmcC0+cTEudi0+c3RvcmFnZV9jbGFzcz09RVhURVJOJiYhKGdfZmxhZ3NbNl0mVVNFREZMQUcpKXsKKyAgICAgICAgY2hhciAqcz1wLT5xMS52LT5pZGVudGlmaWVyOworICAgICAgICBpZighc3RyY21wKCJhYnMiLHMpfHwhc3RyY21wKCJsYWJzIixzKSl7CisgICAgICAgICAgZW1pdChmLCJcdHN1YnFcdCVzLCVzLCVzXG4iLHJlZ25hbWVzW3IzMV0scmVnbmFtZXNbMTddLHJlZ25hbWVzWzFdKTsKKyAgICAgICAgICBlbWl0KGYsIlx0Y21vdmdlXHQlcywlcywlc1xuIixyZWduYW1lc1sxN10scmVnbmFtZXNbMTddLHJlZ25hbWVzWzFdKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZighc3RyY21wKCJmYWJzIixzKSl7CisgICAgICAgICAgZW1pdChmLCJcdGZhYnNcdCVzLCVzXG4iLHJlZ25hbWVzWzE3XSxyZWduYW1lc1sxXSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYoIXN0cmNtcCgiX192YV9maXhhcmdzIixzKSl7CisgICAgICAgICAgZW1pdChmLCJcdGxkYVx0JXMsJWQoJXMpXG4iLHJlZ25hbWVzWzFdLGZpeGFyZ3MscmVnbmFtZXNbcjMxXSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYoIXN0cmNtcCgiX192YV9zdGFydCIscykpeworICAgICAgICAgIGVtaXQoZiwiXHRsZGFcdCVzLCVsZCglcylcbiIscmVnbmFtZXNbMV0sZnJhbWVzaXplLSg2LWZpeGFyZ3MpKjE2LHJlZ25hbWVzW3NwXSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvcihyZWc9MTc7cmVnPD0yMjtyZWcrKykKKyAgICAgICAgZXh0ZW5kKGYscmVnKTsKKyAgICAgIGlmKHExcmVnKXsKKyAgICAgICAgaWYocTFyZWchPXZwKSBtb3ZlX3JlZyhmLHExcmVnLHZwKTsKKyAgICAgICAgZW1pdChmLCJcdGpzclx0JXMsKCVzKSwwXG4iLHJlZ25hbWVzW2xyXSxyZWduYW1lc1t2cF0pOworICAgICAgfWVsc2V7CisgICAgICAgIGVtaXQoZiwiXHRqc3JcdCVzLCIscmVnbmFtZXNbbHJdKTsKKyAgICAgICAgcHJvYmoyKGYsJnAtPnExLHQpO2VtaXQoZiwiXG4iKTsKKyAgICAgIH0KKyAgICAgIGVtaXQoZiwiXHRsZGdwXHQlcywwKCVzKVxuIixyZWduYW1lc1tncF0scmVnbmFtZXNbbHJdKTsKKyAgICAgIHB1c2hlZC09em0ybChwLT5xMi52YWwudm1heCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09QVNTSUdOfHxjPT1QVVNIKXsKKyAgICAgIGlmKHQ9PTApIGllcnJvcigwKTsKKyAgICAgIGlmKHExcmVnKXsKKyAgICAgICAgaWYoYz09UFVTSCl7CisgICAgICAgICAgZXh0ZW5kKGYscTFyZWcpOworICAgICAgICAgIGlmKCh0Jk5RKT09RkxPQVQpeworICAgICAgICAgICAgZW1pdChmLCJcdGN2dHN0XHQlcywlc1xuIixyZWduYW1lc1txMXJlZ10scmVnbmFtZXNbZjFdKTsKKyAgICAgICAgICAgIHExcmVnPWYxOworCSAgICBlbWl0KGYsIlx0c3RzXHQlcywlbGQoJXMpXG4iLHJlZ25hbWVzW3ExcmVnXSxwdXNoZWQscmVnbmFtZXNbc3BdKTsKKyAgICAgICAgICB9ZWxzZXsKKwkgICAgZW1pdChmLCJcdHN0JWNcdCVzLCVsZCglcylcbiIscTFyZWc8PTMyPydxJzondCcscmVnbmFtZXNbcTFyZWddLHB1c2hlZCxyZWduYW1lc1tzcF0pOworCSAgfQorICAgICAgICAgIHB1c2hlZCs9ODsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZihjPT1BU1NJR04pIHpyZWc9cTFyZWc7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfWVsc2UgaWVycm9yKDApOworICAgIH0KKyAgICBpZihjPT1BRERSRVNTKXsKKyAgICAgIGxvYWRfYWRkcmVzcyhmLHpyZWcsJnAtPnExLFBPSU5URVIpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PU1JTlVTKXsKKyAgICAgIGlmKElTSU5UKHQpKQorICAgICAgICBlbWl0KGYsIlx0c3ViJWNcdCVzLCVzLCVzXG4iLHhfdFt0Jk5RXSxyZWduYW1lc1tyMzFdLHJlZ25hbWVzW3ExcmVnXSxyZWduYW1lc1t6cmVnXSk7CisgICAgICBlbHNlCisgICAgICAgIGVtaXQoZiwiXHRzdWIlY1x0JXMsJXMsJXNcbiIseF90W3QmTlFdLHJlZ25hbWVzW2YzMV0scmVnbmFtZXNbcTFyZWddLHJlZ25hbWVzW3pyZWddKTsKKyAgICAgIHN0W3pyZWddPUVTR047CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09VEVTVCl7CisgICAgICBpZihzdFtxMXJlZ109PTApIGV4dGVuZChmLHExcmVnKTsKKyAgICAgIGNtcHJlZz1xMXJlZzsKKyAgICAgIGNtcGZsYWc9MDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1DT01QQVJFKXsKKyAgICAgIHN0cnVjdCBJQyAqYnI9cC0+bmV4dDsKKyAgICAgIHdoaWxlKDEpeworICAgICAgICBpZihici0+Y29kZT49QkVRJiZici0+Y29kZTxCUkEpIGJyZWFrOworICAgICAgICBpZihici0+Y29kZSE9RlJFRVJFRykgaWVycm9yKDApOworICAgICAgICBicj1ici0+bmV4dDsKKyAgICAgIH0KKyAgICAgIGlmKElTRkxPQVQodCkpIGNtcHJlZz1mMzsgZWxzZSBjbXByZWc9dDM7CisgICAgICBpZihici0+Y29kZT09QkVRfHxici0+Y29kZT09Qk5FKXsKKyAgICAgICAgaWYoKHQmTlUpPT0oVU5TSUdORUR8SU5UKSl7CisgICAgICAgICAgaWYoc3RbcTFyZWddPT1FU0dOKSBleHRlbmQoZixxMnJlZyk7CisgICAgICAgICAgZWxzZSBpZihzdFtxMnJlZ109PUVTR04pIGV4dGVuZChmLHExcmVnKTsKKyAgICAgICAgICBlbHNlIGlmKHN0W3ExcmVnXT09RVVOUykgdWV4dGVuZChmLHEycmVnKTsKKyAgICAgICAgICBlbHNlIGlmKHN0W3EycmVnXT09RVVOUykgdWV4dGVuZChmLHExcmVnKTsKKyAgICAgICAgICBlbHNlIHtleHRlbmQoZixxMXJlZyk7ZXh0ZW5kKGYscTJyZWcpO30KKyAgICAgICAgfQorICAgICAgICBpZigodCZOVSk9PUlOVCl7ZXh0ZW5kKGYscTFyZWcpO2V4dGVuZChmLHEycmVnKTt9CisgICAgICAgIGlmKElTRkxPQVQodCkpIGVtaXQoZiwiXHRzdWIlY1x0JXMsIix4X3RbdCZOUV0scmVnbmFtZXNbcTFyZWddKTsKKyAgICAgICAgICBlbHNlIGVtaXQoZiwiXHRzdWIlY1x0JXMsIix4X3RbdCZOUV0scmVnbmFtZXNbcTFyZWddKTsKKyAgICAgICAgcHJvYmoyKGYsJnAtPnEyLHQpO2VtaXQoZiwiLCVzXG4iLHJlZ25hbWVzW2NtcHJlZ10pOworICAgICAgICBjbXBmbGFnPTA7c3RbY21wcmVnXT1FU0dOOworICAgICAgfWVsc2V7CisgICAgICAgIGNoYXIgKnM9IiI7CisgICAgICAgIGlmKHQmVU5TSUdORUQpIHM9InUiOworICAgICAgICBpZigodCZOVSk9PShVTlNJR05FRHxJTlQpKXt1ZXh0ZW5kKGYscTFyZWcpO3VleHRlbmQoZixxMnJlZyk7fQorICAgICAgICBpZigodCZOVSk9PUlOVCl7ZXh0ZW5kKGYscTFyZWcpO2V4dGVuZChmLHEycmVnKTt9CisgICAgICAgIGlmKElTRkxPQVQodCkpIHM9InQiOworICAgICAgICBpZihici0+Y29kZT09QkxUfHxici0+Y29kZT09QkdFKXsKKyAgICAgICAgICBlbWl0KGYsIlx0Y21wJXNsdFx0JXMsIixzLHJlZ25hbWVzW3ExcmVnXSk7CisgICAgICAgICAgcHJvYmoyKGYsJnAtPnEyLHQpO2VtaXQoZiwiLCVzXG4iLHJlZ25hbWVzW2NtcHJlZ10pOworICAgICAgICAgIGlmKGJyLT5jb2RlPT1CR0UpIGNtcGZsYWc9LTE7IGVsc2UgY21wZmxhZz0xOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICBlbWl0KGYsIlx0Y21wJXNsZVx0JXMsIixzLHJlZ25hbWVzW3ExcmVnXSk7CisgICAgICAgICAgcHJvYmoyKGYsJnAtPnEyLHQpO2VtaXQoZiwiLCVzXG4iLHJlZ25hbWVzW2NtcHJlZ10pOworICAgICAgICAgIGlmKGJyLT5jb2RlPT1CR1QpIGNtcGZsYWc9LTE7IGVsc2UgY21wZmxhZz0xOworICAgICAgICB9CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz49T1ImJmM8PUFORCl7CisgICAgICBlbWl0KGYsIlx0JXNcdCVzLCIsbG9naWNhbHNbYy1PUl0scmVnbmFtZXNbcTFyZWddKTsKKyAgICAgIHByb2JqMihmLCZwLT5xMix0KTtlbWl0KGYsIiwlc1xuIixyZWduYW1lc1t6cmVnXSk7CisgICAgICAvKiBoaWVyIGlzdCBtZWhyIG1vZWdsaWNoICovCisgICAgICBpZigodCZOUSk9PUlOVCkgc3RbenJlZ109MDsgZWxzZSBzdFt6cmVnXT1FU0dOOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM+PUxTSElGVCYmYzw9TU9EKXsKKyAgICAgIGludCB4dDsKKyAgICAgIGlmKGM9PUxTSElGVCYmKHAtPnEyLmZsYWdzJktPTlNUKSl7CisgICAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCx0KTsKKyAgICAgICAgaWYoenVtZXF0byh2dW1heCx1bDJ6dW0oMVVMKSkpeworICAgICAgICAgIGVtaXQoZiwiXHRhZGQlY1x0JXMsJXMsJXNcbiIseF90W3QmTlFdLHJlZ25hbWVzW3ExcmVnXSxyZWduYW1lc1txMXJlZ10scmVnbmFtZXNbenJlZ10pOworICAgICAgICAgIHN0W3pyZWddPUVTR047Y29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYoenVtZXF0byh2dW1heCx1bDJ6dW0oMlVMKSkpeworICAgICAgICAgIGVtaXQoZiwiXHRzNGFkZCVjXHQlcywwLCVzXG4iLHhfdFt0Jk5RXSxyZWduYW1lc1txMXJlZ10scmVnbmFtZXNbenJlZ10pOworICAgICAgICAgIHN0W3pyZWddPUVTR047Y29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYoenVtZXF0byh2dW1heCx1bDJ6dW0oM1VMKSkpeworICAgICAgICAgIGVtaXQoZiwiXHRzOGFkZCVjXHQlcywwLCVzXG4iLHhfdFt0Jk5RXSxyZWduYW1lc1txMXJlZ10scmVnbmFtZXNbenJlZ10pOworICAgICAgICAgIHN0W3pyZWddPUVTR047Y29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmKGM9PVJTSElGVHx8Yz09TFNISUZUKXsKKyAgICAgICAgaWYoYz09UlNISUZUKXsKKyAgICAgICAgICBpZih0JlVOU0lHTkVEKXsKKyAgICAgICAgICAgIGlmKCh0Jk5RKTxMT05HKSB1ZXh0ZW5kKGYscTFyZWcpOworICAgICAgICAgICAgZW1pdChmLCJcdHNybFx0Iik7CisgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBleHRlbmQoZixxMXJlZyk7CisgICAgICAgICAgICBlbWl0KGYsIlx0c3JhXHQiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgc3RbenJlZ109c3RbcTFyZWddOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICBlbWl0KGYsIlx0c2xsXHQiKTsKKyAgICAgICAgICBpZigodCZOUSk8PUlOVCkgc3RbenJlZ109MDsgZWxzZSBzdFt6cmVnXT1FU0dOOworICAgICAgICB9CisgICAgICAgIGVtaXQoZiwiJXMsIixyZWduYW1lc1txMXJlZ10pOworICAgICAgICBwcm9iajIoZiwmcC0+cTIsdCk7ZW1pdChmLCIsJXNcbiIscmVnbmFtZXNbenJlZ10pOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKChjPT1ESVZ8fGM9PU1PRCkmJklTSU5UKHQpKXsKKyAgICAgICAgLyogTGludXgtUm91dGluZW4gYXVmcnVmZW4uIHExPSQyNCBxMj0kMjUgej0kMjcgJDI4IHNjcmF0Y2ggKi8KKyAgICAgICAgaWYoIXExcmVnKSBpZXJyb3IoMCk7CisgICAgICAgIGlmKHExcmVnIT0yNSl7CisgICAgICAgICAgaWYocmVnc1syNV0pIGVtaXQoZiwiXHRzdHFcdCVzLCVsZCglcylcbiIscmVnbmFtZXNbMjVdLGZyYW1lc2l6ZS1hZGRidWYscmVnbmFtZXNbc3BdKTsKKyAgICAgICAgICBtb3ZlX3JlZyhmLHExcmVnLDI1KTsKKyAgICAgICAgfQorICAgICAgICBpZihxMnJlZyE9MjYmJnJlZ3NbMjZdKSBlbWl0KGYsIlx0c3RxXHQlcywlbGQoJXMpXG4iLHJlZ25hbWVzWzI2XSxmcmFtZXNpemUtYWRkYnVmKzgscmVnbmFtZXNbc3BdKTsKKyAgICAgICAgaWYocTJyZWc9PTI1KQorICAgICAgICAgIGVtaXQoZiwiXHRsZHFcdCVzLCVsZCglcylcbiIscmVnbmFtZXNbMjZdLGZyYW1lc2l6ZS1hZGRidWYscmVnbmFtZXNbc3BdKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGxvYWRfcmVnKGYsMjYsJnAtPnEyLHQsMjYpOworICAgICAgICBpZih6cmVnIT0yOCYmcmVnc1syOF0pIGVtaXQoZiwiXHRzdHFcdCVzLCVsZCglcylcbiIscmVnbmFtZXNbMjhdLGZyYW1lc2l6ZS1hZGRidWYrMTYscmVnbmFtZXNbc3BdKTsKKyAgICAgICAgaWYocmVnc1syOV0pIGVtaXQoZiwiXHRzdHFcdCVzLCVsZCglcylcbiIscmVnbmFtZXNbMjldLGZyYW1lc2l6ZS1hZGRidWYrMjQscmVnbmFtZXNbc3BdKTsKKyAgICAgICAgZW1pdChmLCJcdCVzcSVzXHQlcywlcywlc1xuIixhcml0aG1ldGljc1tjLUxTSElGVF0sKHQmVU5TSUdORUQpPyJ1IjoiIixyZWduYW1lc1syNV0scmVnbmFtZXNbMjZdLHJlZ25hbWVzWzI4XSk7CisgICAgICAgIGlmKHpyZWchPTI4KSBtb3ZlX3JlZyhmLDI4LHpyZWcpOworICAgICAgICBpZihxMXJlZyE9MjUmJnJlZ3NbMjVdKSBlbWl0KGYsIlx0bGRxXHQlcywlbGQoJXMpXG4iLHJlZ25hbWVzWzI1XSxmcmFtZXNpemUtYWRkYnVmLHJlZ25hbWVzW3NwXSk7CisgICAgICAgIGlmKHEycmVnIT0yNiYmcmVnc1syNl0pIGVtaXQoZiwiXHRsZHFcdCVzLCVsZCglcylcbiIscmVnbmFtZXNbMjZdLGZyYW1lc2l6ZS1hZGRidWYrOCxyZWduYW1lc1tzcF0pOworICAgICAgICBpZih6cmVnIT0yOCYmcmVnc1syOF0pIGVtaXQoZiwiXHRsZHFcdCVzLCVsZCglcylcbiIscmVnbmFtZXNbMjhdLGZyYW1lc2l6ZS1hZGRidWYrMTYscmVnbmFtZXNbc3BdKTsKKyAgICAgICAgaWYocmVnc1syOV0pIGVtaXQoZiwiXHRsZHFcdCVzLCVsZCglcylcbiIscmVnbmFtZXNbMjldLGZyYW1lc2l6ZS1hZGRidWYrMjQscmVnbmFtZXNbc3BdKTsKKyAgICAgICAgLyogV2FzIGZ1ZXIgc3RbenJlZ10/ICovCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgeHQ9eF90W3QmTlFdOworICAgICAgaWYoKHQmTlEpPElOVCkgeHQ9J2wnOworICAgICAgZW1pdChmLCJcdCVzJWNcdCVzLCIsYXJpdGhtZXRpY3NbYy1MU0hJRlRdLHh0LHJlZ25hbWVzW3ExcmVnXSk7CisgICAgICBwcm9iajIoZiwmcC0+cTIsdCk7ZW1pdChmLCIsJXNcbiIscmVnbmFtZXNbenJlZ10pOworICAgICAgc3RbenJlZ109RVNHTjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1TVUJQRlApeworICAgICAgZW1pdChmLCJcdHN1YnFcdCVzLCVzLCVzXG4iLHJlZ25hbWVzW3ExcmVnXSxyZWduYW1lc1txMnJlZ10scmVnbmFtZXNbenJlZ10pOworICAgICAgc3RbenJlZ109RVNHTjtjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09QURESTJQfHxjPT1TVUJJRlApeworICAgICAgaWYodCZVTlNJR05FRCl7CisgICAgICAgIGlmKCh0Jk5RKTxMT05HKSB1ZXh0ZW5kKGYscTJyZWcpOworICAgICAgfWVsc2UKKyAgICAgICAgZXh0ZW5kKGYscTJyZWcpOworICAgICAgaWYoYz09QURESTJQKSBlbWl0KGYsIlx0YWRkcVx0JXMsIixyZWduYW1lc1txMXJlZ10pOworICAgICAgZWxzZSBlbWl0KGYsIlx0c3VicVx0JXMsIixyZWduYW1lc1txMXJlZ10pOworICAgICAgcHJvYmoyKGYsJnAtPnEyLHQpOworICAgICAgZW1pdChmLCIsJXNcbiIscmVnbmFtZXNbenJlZ10pOworICAgICAgc3RbenJlZ109RVNHTjtjb250aW51ZTsKKyAgICB9CisgICAgaWVycm9yKDApOworICB9CisgIGZ1bmN0aW9uX2JvdHRvbShmLHYsem0ybChvZmZzZXQrYWRkYnVmKSxtYXhwdXNoZWQpOworICBpZihkZWJ1Z19pbmZvKXsKKyAgICBpZihzdGFicyl7CisgICAgICBkZWJ1Z19leGl0KGYsdik7CisgICAgfWVsc2V7CisgICAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKyAgICAgIGR3YXJmMl9mdW5jdGlvbihmLHYsbGFiZWwpOworICAgICAgaWYoZikgc2VjdGlvbj0tMTsgICAgCisgICAgfQorICB9ICAKK30KKworaW50IHNob3J0Y3V0KGludCBjb2RlLGludCB0eXApCit7CisgIHJldHVybiAwOworfQorCitpbnQgcmVnX3Bhcm0oc3RydWN0IHJlZ19oYW5kbGUgKm0sIHN0cnVjdCBUeXAgKnQsaW50IHZhcmFyZyxzdHJ1Y3QgVHlwICpma3QpCit7CisgIGludCBmOworICBmPXQtPmZsYWdzJk5ROworICBpZihJU0lOVChmKXx8SVNQT0lOVEVSKGYpKXsKKyAgICBpZihtLT5uZXh0cj49NikgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE3K20tPm5leHRyKys7CisgIH0KKyAgaWYoSVNGTE9BVChmKSl7CisgICAgaWYobS0+bmV4dHI+PTYpIHJldHVybiAwOworICAgIHJldHVybiA0OSttLT5uZXh0cisrOworICB9CisgIHJldHVybiAwOworfQordm9pZCBjbGVhbnVwX2NnKEZJTEUgKmYpCit7CisgIHN0cnVjdCBmcGNvbnN0bGlzdCAqcDsKKyAgdW5zaWduZWQgY2hhciAqaXA7CisKKyAgdGl0bGUoZik7CisgIGlmKGYmJnN0YWJzKSBkZWJ1Z19jbGVhbnVwKGYpOworICB3aGlsZShwPWZpcnN0ZnBjKXsKKyAgICBpZihmKXsKKyAgICAgIGludCB0PXAtPnR5cCZOUTsKKyAgICAgIGlmKHNlY3Rpb24hPUNPREUpe2VtaXQoZixjb2RlbmFtZSk7aWYoZikgc2VjdGlvbj1DT0RFO30KKyAgICAgIGVtaXQoZiwiXHQuYWxpZ25cdDNcbiVzJWQ6XG5cdCIsbGFicHJlZml4LHAtPmxhYmVsKTsKKyAgICAgIGlmKElTRkxPQVQodCkpeworICAgICAgICBpcD0odW5zaWduZWQgY2hhciAqKSZwLT52YWwudmRvdWJsZTsKKyAgICAgICAgZW1pdChmLCJcdC5sb25nXHQweCUwMnglMDJ4JTAyeCUwMngiLGlwWzNdLGlwWzJdLGlwWzFdLGlwWzBdKTsKKyAgICAgICAgaWYoKHAtPnR5cCZOUSkhPUZMT0FUKXsKKyAgICAgICAgICBlbWl0KGYsIiwweCUwMnglMDJ4JTAyeCUwMngiLGlwWzddLGlwWzZdLGlwWzVdLGlwWzRdKTsKKyAgICAgICAgfQorICAgICAgfWVsc2V7CisgICAgICAgIGVtaXQoZiwiXHQucXVhZFx0Iik7CisgICAgICAgIGVtaXR2YWwoZiwmcC0+dmFsLHAtPnR5cCk7CisgICAgICB9CisgICAgICBlbWl0KGYsIlxuIik7CisgICAgfQorICAgIGZpcnN0ZnBjPXAtPm5leHQ7CisgICAgZnJlZShwKTsKKyAgfQorICBpZihmJiZoZWxwcykgZW1pdChmLCJcdC5sY29tbVx0JXMlZCwlZFxuIixsYWJwcmVmaXgsaGVscGwsaGVscHMqOCk7Cit9CisKK3ZvaWQgaW5pdF9kYihGSUxFICpmKQoreworICBpZighc3RhYnMpeworICAgIGR3YXJmMl9zZXR1cChzaXpldGFiW1BPSU5URVJdLCIuYnl0ZSIsIi4yYnl0ZSIsIi40Ynl0ZSIsIi44Ynl0ZSIsbGFicHJlZml4LGlkcHJlZml4LCIuc2VjdGlvbiIpOworICAgIGR3YXJmMl9wcmludF9jb21wX3VuaXRfaGVhZGVyKGYpOworICB9Cit9IAordm9pZCBjbGVhbnVwX2RiKEZJTEUgKmYpCit7CisgIGlmKCFzdGFicyYmZikKKyAgICBkd2FyZjJfY2xlYW51cChmKTsKKyAgaWYoZikgc2VjdGlvbj0tMTsKK30KZGlmZiAtLWdpdCBhL21hY2hpbmVzL2FscGhhL21hY2hpbmUuZHQgYi9tYWNoaW5lcy9hbHBoYS9tYWNoaW5lLmR0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYwY2YwYjkKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9hbHBoYS9tYWNoaW5lLmR0CkBAIC0wLDAgKzEsMTYgQEAKK1M4QlMKK1M4QlUKK1MxNkJTTEUgUzE2QlNCRQorUzE2QlVMRSBTMTZCVUJFCitTMzJCU0xFIFMzMkJTQkUKK1MzMkJVTEUgUzMyQlVCRQorUzY0QlNMRSBTNjRCU0JFCitTNjRCVUxFIFM2NEJVQkUKK1M2NEJTTEUgUzY0QlNCRQorUzY0QlVMRSBTNjRCVUJFCitTMzJCSUVFRUxFCitTNjRCSUVFRUxFCitTNjRCSUVFRUxFCitTNjRCVUxFIFM2NEJVQkUKKworCmRpZmYgLS1naXQgYS9tYWNoaW5lcy9hbHBoYS9tYWNoaW5lLmggYi9tYWNoaW5lcy9hbHBoYS9tYWNoaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWEwNWJhOAotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL2FscGhhL21hY2hpbmUuaApAQCAtMCwwICsxLDcwIEBACisvKiAgRXhhbXBsZSBvZiBhIGNvZGUtZ2VuZXJhdG9yIGZvciBhIERFQyBBbHBoYSAgICAgICAgICAgICAgICAgICAgICovCisKKyNpbmNsdWRlICJkdC5oIgorCisvKiAgVGhpcyBzdHJ1Y3QgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IG1hY2hpbmUtc3BlY2lmaWMgICAgICAgICAgICovCisvKiAgYWRkcmVzc2luZy1tb2Rlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTm90IHVzZWQgaW4gdGhpcyBjb2RlLWdlbmVycmF0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdHJ1Y3QgQWRkcmVzc2luZ01vZGV7CisgIGludCBmbGFnczsKKyAgaW50IGJhc2U7CisgIGludCBhbGlnbjsKKyAgbG9uZyBvZmZzZXQ7Cit9OworCisvKiAgVGhlIG51bWJlciBvZiByZWdpc3RlcnMgb2YgdGhlIHRhcmdldCBtYWNoaW5lLiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1BWFIgNjQKKworLyogIE51bWJlciBvZiBjb21tYW5kbGluZS1vcHRpb25zIHRoZSBjb2RlLWdlbmVyYXRvciBhY2NlcHRzLiAgICAgICAqLworI2RlZmluZSBNQVhHRiAxMAorCisvKiAgSWYgdGhpcyBpcyBzZXQgdG8gemVybyB2YmNjIHdpbGwgbm90IGdlbmVyYXRlIElDcyB3aGVyZSB0aGUgICAgICovCisvKiAgdGFyZ2V0IG9wZXJhbmQgaXMgdGhlIHNhbWUgYXMgdGhlIDJuZCBzb3VyY2Ugb3BlcmFuZC4gICAgICAgICAgICovCisvKiAgVGhpcyBjYW4gc29tZXRpbWVzIHNpbXBsaWZ5IHRoZSBjb2RlLWdlbmVyYXRvciwgYnV0IHVzdWFsbHkgICAgICovCisvKiAgdGhlIGNvZGUgaXMgYmV0dGVyIGlmIHRoZSBjb2RlLWdlbmVyYXRvciBhbGxvd3MgaXQuICAgICAgICAgICAgICovCisjZGVmaW5lIFVTRVEyQVNaIDEKKworLyogIFRoaXMgc3BlY2lmaWVzIHRoZSBzbWFsbGVzdCBpbnRlZ2VyIHR5cGUgdGhhdCBjYW4gYmUgYWRkZWQgdG8gYSAqLworLyogIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNSU5BRERJMlAgTE9ORworCisvKiAgSWYgdGhlIGJ5dGVzIG9mIGFuIGludGVnZXIgYXJlIG9yZGVyZWQgbW9zdCBzaWduaWZpY2FudCBieXRlICAgICovCisvKiAgYnl0ZSBmaXJzdCBhbmQgdGhlbiBkZWNyZWFzaW5nIHNldCBCSUdFTkRJQU4gdG8gMS4gICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR0VORElBTiAwCisKKy8qICBJZiB0aGUgYnl0ZXMgb2YgYW4gaW50ZWdlciBhcmUgb3JkZXJlZCBsZXN0IHNpZ25pZmljYW50IGJ5dGUgICAgKi8KKy8qICBieXRlIGZpcnN0IGFuZCB0aGVuIGluY3JlYXNpbmcgc2V0IExJVFRMRUVORElBTiB0byAxLiAgICAgICAgICAgKi8KKyNkZWZpbmUgTElUVExFRU5ESUFOIDEKKworLyogIE5vdGUgdGhhdCBCSUdFTkRJQU4gYW5kIExJVFRMRUVORElBTiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAgICAqLworCisvKiAgSWYgc3dpdGNoLXN0YXRlbWVudHMgc2hvdWxkIGJlIGdlbmVyYXRlZCBhcyBhIHNlcXVlbmNlIG9mICAgICAgICovCisvKiAgU1VCLFRTVCxCRVEgSUNzIHJhdGhlciB0aGFuIENPTVBBUkUsQkVRIElDcyBzZXQgdGhpcyB0byAxLiAgICAgICovCisvKiAgVGhpcyBjYW4geWllbGQgYmV0dGVyIGNvZGUgb24gc29tZSBtYWNoaW5lcy4gICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNXSVRDSFNVQlMgMQorCisvKiAgSW4gb3B0aW1pemluZyBjb21waWxhdGlvbiBjZXJ0YWluIGxpYnJhcnkgbWVtY3B5L3N0cmNweS1jYWxscyAgICovCisvKiAgd2l0aCBsZW5ndGgga25vd24gYXQgY29tcGlsZS10aW1lIHdpbGwgYmUgaW5saW5lZCB1c2luZyBhbiAgICAgICovCisvKiAgQVNTSUdOLUlDIGlmIHRoZSBzaXplIGlzIGxlc3Mgb3IgZXF1YWwgdG8gSU5MSU5FTUVNQ1BZLiAgICAgICAgICovCisvKiAgVGhlIHR5cGUgdXNlZCBmb3IgdGhlIEFTU0lHTi1JQyB3aWxsIGJlIFVOU0lHTkVEfENIQVIuICAgICAgICAgICovCisjZGVmaW5lIElOTElORU1FTUNQWSAxMDI0CisKKy8qICBQYXJhbWV0ZXJzIGFyZSBzb21ldGltZXMgcGFzc2VkIGluIHJlZ2lzdGVycyB3aXRob3V0IF9fcmVnLiAgICAgKi8KKyNkZWZpbmUgSEFWRV9SRUdQQVJNUyAxCisKKy8qICBQYXJhbWV0ZXJzIG9uIHRoZSBzdGFjayBzaG91bGQgYmUgcHVzaGVkIGluIG9yZGVyIHJhdGhlciB0aGFuICAgKi8KKy8qICBpbiByZXZlcnNlIG9yZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT1JERVJFRF9QVVNIIDEKKworLyogIFN0cnVjdHVyZSBmb3IgcmVnX3Bhcm0oKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RydWN0IHJlZ19oYW5kbGV7CisgICAgaW50IG5leHRyOworfTsKKworLyogc2l6ZSBvZiBidWZmZXIgZm9yIGFzbS1vdXRwdXQgKi8KKyNkZWZpbmUgRU1JVF9CVUZfTEVOIDEwMjQgLyogc2hvdWxkIGJlIGVub3VnaCAqLworLyogbnVtYmVyIG9mIGFzbS1vdXRwdXQgbGluZXMgYnVmZmVyZWQgKi8KKyNkZWZpbmUgRU1JVF9CVUZfREVQVEggNAorCisvKiAgV2UgaGF2ZSBubyBhc21fcGVlcGhvbGUgdG8gb3B0aW1pemUgYXNzZW1ibHktb3V0cHV0ICovCisjZGVmaW5lIEhBVkVfVEFSR0VUX1BFRVBIT0xFIDAKZGlmZiAtLWdpdCBhL21hY2hpbmVzL2FscGhhL3NjaGVkdWxlLmMgYi9tYWNoaW5lcy9hbHBoYS9zY2hlZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUxOWUxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9hbHBoYS9zY2hlZHVsZS5jCkBAIC0wLDAgKzEsMTA2IEBACisjaW5jbHVkZSAidnNjLmgiCisKK2NoYXIgdGdfY29weXJpZ2h0W109IkFscGhhIHNjaGVkdWxlciBWMC4wIChjKSBpbiAxOTk3IGJ5IFZvbGtlciBCYXJ0aGVsbWFubiI7CisKK2ludCBzY2hlZF9pbml0KHZvaWQpCit7CisgIHJldHVybiAxOworfQordm9pZCBzY2hlZF9jbGVhbnVwKHZvaWQpCit7Cit9CitpbnQgc2NoZWRfaW5mbyhzdHJ1Y3Qgc2luZm8gKnApCit7CisgIGNoYXIgYnVmWzIwXTtpbnQgcTEscTIseixpOworICBpZihzc2NhbmYocC0+dHh0LCIkQyVkOiIsJmkpPT0xKXsKKyAgICBwLT5sYWJlbD1pOworICAgIHAtPmZsYWdzPUxBQkVMOworICAgIHJldHVybiAxOworICB9CisgIC8qIGxkYSAkcjEsaW1tKCRyMikgKi8KKyAgaWYoc3NjYW5mKHAtPnR4dCwibGRhICQlZCwlZCgkJWQpIiwmeiwmaSwmcTEpPT0zKXsKKyAgICBwLT5sYXRlbmN5PTE7CisgICAgQlNFVChwLT5waXBlcywwKTsKKyAgICBCU0VUKHAtPnBpcGVzLDEpOworICAgIEJTRVQocC0+dXNlcyxxMSk7CisgICAgQlNFVChwLT5tb2RpZmllcyx6KTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAvKiBsZGEgJHIxLC4uLiAqLworICBpZihzc2NhbmYocC0+dHh0LCJsZGEgJCVkLCIsJnopPT0xKXsKKyAgICBCU0VUKHAtPnBpcGVzLDApOworICAgIEJTRVQocC0+cGlwZXMsMSk7CisgICAgQlNFVChwLT5tb2RpZmllcyx6KTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAvKiBvcCAkcjEsJHIyLCRyMyAqLworICBpZihzc2NhbmYocC0+dHh0LCIlMTlzICQlZCwkJWQsJCVkIixidWYsJnExLCZxMiwmeik9PTQpeworICAgIHAtPmxhdGVuY3k9MTsKKyAgICBCU0VUKHAtPnBpcGVzLDApOworICAgIEJTRVQocC0+cGlwZXMsMSk7CisgICAgQlNFVChwLT51c2VzLHExKTsKKyAgICBCU0VUKHAtPnVzZXMscTIpOworICAgIEJTRVQocC0+bW9kaWZpZXMseik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgLyogb3AgJHIxLCRyMiAqLworICBpZihzc2NhbmYocC0+dHh0LCIlMTlzICQlZCwkJWQiLGJ1ZiwmcTEsJnopPT0zKXsKKyAgICBwLT5sYXRlbmN5PTE7CisgICAgQlNFVChwLT5waXBlcywwKTsKKyAgICBCU0VUKHAtPnBpcGVzLDEpOworICAgIEJTRVQocC0+dXNlcyxxMSk7CisgICAgQlNFVChwLT5tb2RpZmllcyx6KTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAvKiBvcCAkcjEsaW1tLCRyMiAqLworICBpZihzc2NhbmYocC0+dHh0LCIlMTlzICQlZCwlZCwkJWQiLGJ1ZiwmcTEsJmksJnopPT00KXsKKyAgICBwLT5sYXRlbmN5PTE7CisgICAgQlNFVChwLT5waXBlcywwKTsKKyAgICBCU0VUKHAtPnBpcGVzLDEpOworICAgIEJTRVQocC0+dXNlcyxxMSk7CisgICAgQlNFVChwLT5tb2RpZmllcyx6KTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAvKiBvcCAkZnIxLCRmcjIsJGZyMyAqLworICBpZihzc2NhbmYocC0+dHh0LCIlMTlzICRmJWQsJGYlZCwkZiVkIixidWYsJnExLCZxMiwmeik9PTQpeworICAgIHAtPmxhdGVuY3k9MTsKKyAgICBCU0VUKHAtPnBpcGVzLDIpOworICAgIEJTRVQocC0+cGlwZXMsMyk7CisgICAgQlNFVChwLT51c2VzLHExKzMyKTsKKyAgICBCU0VUKHAtPnVzZXMscTIrMzIpOworICAgIEJTRVQocC0+bW9kaWZpZXMseiszMik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgLyogbG9hZC9zdG9yZSAkcjEsYygkcjIpICovCisgIGlmKHNzY2FuZihwLT50eHQsIiUxOXMgJCVkLCVkKCQlZCkiLGJ1ZiwmeiwmaSwmcTEpPT00KXsKKyAgICBwLT5sYXRlbmN5PTM7CisgICAgQlNFVChwLT5waXBlcywwKTsKKyAgICBCU0VUKHAtPnVzZXMscTEpOworICAgIGlmKCpidWY9PSdsJyl7CisgICAgICBCU0VUKHAtPnBpcGVzLDEpOworICAgICAgQlNFVChwLT5tb2RpZmllcyx6KTsKKyAgICAgIEJTRVQocC0+dXNlcyxNRU0pOworICAgIH1lbHNleworICAgICAgQlNFVChwLT51c2VzLHopOworICAgICAgQlNFVChwLT5tb2RpZmllcyxNRU0pOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorICAvKiBsb2FkL3N0b3JlICRmcjEsYygkcjIpICovCisgIGlmKHNzY2FuZihwLT50eHQsIiUxOXMgJGYlZCwlZCgkJWQpIixidWYsJnosJmksJnExKT09NCl7CisgICAgcC0+bGF0ZW5jeT0zOworICAgIEJTRVQocC0+cGlwZXMsMCk7CisgICAgQlNFVChwLT51c2VzLHExKTsKKyAgICBpZigqYnVmPT0nbCcpeworICAgICAgQlNFVChwLT5waXBlcywxKTsKKyAgICAgIEJTRVQocC0+bW9kaWZpZXMseiszMik7CisgICAgICBCU0VUKHAtPnVzZXMsTUVNKTsKKyAgICB9ZWxzZXsKKyAgICAgIEJTRVQocC0+dXNlcyx6KzMyKTsKKyAgICAgIEJTRVQocC0+bW9kaWZpZXMsTUVNKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcC0+ZmxhZ3M9QkFSUklFUjsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9tYWNoaW5lcy9hbHBoYS9zY2hlZHVsZS5oIGIvbWFjaGluZXMvYWxwaGEvc2NoZWR1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NjAzNzI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvYWxwaGEvc2NoZWR1bGUuaApAQCAtMCwwICsxLDQgQEAKKworI2RlZmluZSBQSVBFUyA0CisjZGVmaW5lIFJFR1MgNjQKKwpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvYXJtL21hY2hpbmUuYyBiL21hY2hpbmVzL2FybS9tYWNoaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTQ2MmJlZgotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL2FybS9tYWNoaW5lLmMKQEAgLTAsMCArMSwyNDYwIEBACisvKgorICogQVJNIGNvZGUgZ2VuZXJhdG9yCisgKiBBIDMyLWJpdCBSSVNDIHdpdGggMTYgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycy4KKyAqIFdyaXR0ZW4gYnkgRnJhbmsgV2lsbGUgPGZyYW5rQHBob2VuaXgub3dsLmRlPgorICovCisKKyNpbmNsdWRlICJzdXBwLmgiCisjaW5jbHVkZSAidmJjLmgiCisKK3N0YXRpYyBjaGFyIEZJTEVfW10gPSBfX0ZJTEVfXzsKKworCisvKiAgUHVibGljIGRhdGEgdGhhdCBNVVNUIGJlIHRoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogTmFtZSBhbmQgY29weXJpZ2h0LiAqLworY2hhciBjZ19jb3B5cmlnaHRbXSA9ICJ2YmNjIGNvZGUtZ2VuZXJhdG9yIGZvciBBUk0gVjAuMCAoYykgaW4gMjAwNiBieSBGcmFuayBXaWxsZSI7CisKKy8qIENvbW1hbmRsaW5lLWZsYWdzIHRoZSBjb2RlLWdlbmVyYXRvciBhY2NlcHRzOgorICAgMDoganVzdCBhIGZsYWcKKyAgIFZBTEZMQUc6IGEgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQKKyAgIFNUUklOR0ZMQUc6IGEgc3RyaW5nIGNhbiBiZSBzcGVjaWZpZWQKKyAgIEZVTkNGTEFHOiBhIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCisgICBhcGFydCBmcm9tIEZVTkNGTEFHLCBhbGwgb3RoZXIgdmVyc2lvbnMgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIG9uY2UgKi8KK2ludCBnX2ZsYWdzW01BWEdGXSA9IHsKKyAgICBTVFJJTkdGTEFHLFNUUklOR0ZMQUcsMCwwLDAsMCwKKyAgICAwLDAsMCwwCit9OworCisvKiB0aGUgZmxhZy1uYW1lLCBkbyBub3QgdXNlIG5hbWVzIGJlZ2lubmluZyB3aXRoIGwsIEwsIEksIEQgb3IgVSwgYmVjYXVzZQorICAgdGhleSBjb2xsaWRlIHdpdGggdGhlIGZyb250ZW5kICovCitjaGFyICpnX2ZsYWdzX25hbWVbTUFYR0ZdID0geworICAgICJjcHUiLCJmcHUiLCJsaXR0bGUtZW5kaWFuIiwiYmlnLWVuZGlhbiIsImFybSIsInRodW1iIiwKKyAgICAiY29uc3QtaW4tZGF0YSIsIm1lcmdlLWNvbnN0YW50cyIsImVsZiIsInVzZS1jb21tb25zIgorfTsKKworLyogdGhlIHJlc3VsdHMgb2YgcGFyc2luZyB0aGUgY29tbWFuZC1saW5lLWZsYWdzIHdpbGwgYmUgc3RvcmVkIGhlcmUgKi8KK3VuaW9uIHBwaSBnX2ZsYWdzX3ZhbFtNQVhHRl07CisKKy8qICBBbGlnbm1lbnQtcmVxdWlyZW1lbnRzIGZvciBhbGwgdHlwZXMgaW4gYnl0ZXMuICAgICAgICAgICAgICAqLworem1heCBhbGlnbltNQVhfVFlQRSsxXTsKKworLyogIEFsaWdubWVudCB0aGF0IGlzIHN1ZmZpY2llbnQgZm9yIGV2ZXJ5IG9iamVjdC4gICAgICAgICAgICAgICovCit6bWF4IG1heGFsaWduOworCisvKiAgQ0hBUl9CSVQgZm9yIHRoZSB0YXJnZXQgbWFjaGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggY2hhcl9iaXQ7CisKKy8qICBzaXplcyBvZiB0aGUgYmFzaWMgdHlwZXMgKGluIGJ5dGVzKSAqLworem1heCBzaXpldGFiW01BWF9UWVBFKzFdOworCisvKiAgTWluaW11bSBhbmQgTWF4aW11bSB2YWx1ZXMgZWFjaCB0eXBlIGNhbiBoYXZlLiAgICAgICAgICAgICAgKi8KKy8qICBNdXN0IGJlIGluaXRpYWxpemVkIGluIGluaXRfY2coKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworem1heCB0X21pbltNQVhfVFlQRSsxXTsKK3p1bWF4IHRfbWF4W01BWF9UWVBFKzFdOworenVtYXggdHVfbWF4W01BWF9UWVBFKzFdOworCisvKiAgTmFtZXMgb2YgYWxsIHJlZ2lzdGVycy4gKi8KK2NoYXIgKnJlZ25hbWVzW01BWFIrMV0gPSB7CisgICAgIm5vcmVnIiwKKyAgICAicjAiLCJyMSIsInIyIiwicjMiLCJyNCIsInI1IiwicjYiLCJyNyIsCisgICAgInI4IiwicjkiLCJyMTAiLCJyMTEiLCJyMTIiLCJzcCIsImxyIiwicGMiLAorICAgICJzMCIsInMxIiwiczIiLCJzMyIsInM0IiwiczUiLCJzNiIsInM3IiwKKyAgICAiczgiLCJzOSIsInMxMCIsInMxMSIsInMxMiIsInMxMyIsInMxNCIsInMxNSIsCisgICAgImNwc3IiLAorICAgICJyMC9yMSIsInIyL3IzIiwicjQvcjUiLCJyNi9yNyIsInIxMC9yMTEiLAorICAgICJkMCIsImQxIiwiZDIiLCJkMyIsImQ0IiwiZDUiLCJkNiIsImQ3IgorfTsKKworLyogIFRoZSBTaXplIG9mIGVhY2ggcmVnaXN0ZXIgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IHJlZ3NpemVbTUFYUisxXTsKKworLyogIGEgdHlwZSB3aGljaCBjYW4gc3RvcmUgZWFjaCByZWdpc3Rlci4gKi8KK3N0cnVjdCBUeXAgKnJlZ3R5cGVbTUFYUisxXTsKKworLyogIHJlZ3NhW3JlZ10hPTAgaWYgYSBjZXJ0YWluIHJlZ2lzdGVyIGlzIGFsbG9jYXRlZCBhbmQgc2hvdWxkICovCisvKiAgbm90IGJlIHVzZWQgYnkgdGhlIGNvbXBpbGVyIHBhc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2ludCByZWdzYVtNQVhSKzFdOworCisvKiAgU3BlY2lmaWVzIHdoaWNoIHJlZ2lzdGVycyBtYXkgYmUgc2NyYXRjaGVkIGJ5IGZ1bmN0aW9ucy4gICAgKi8KK2ludCByZWdzY3JhdGNoW01BWFIrMV0gPSB7CisgICAgMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLCAgLyogcjAtcjMscjEyICovCisgICAgMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgICAgLyogdmZwIHMwLXMzICovCisgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3BzciAqLworICAgIDEsMSwwLDAsMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHIwL3IxLCByMi9yMyAqLworICAgIDEsMSwwLDAsMCwwLDAsMCAgICAgICAgICAgICAgICAgICAgIC8qIHZmcCBkMC1kMSAqLworfTsKKworLyogc3BlY2lmaWVzIHRoZSBwcmlvcml0eSBmb3IgdGhlIHJlZ2lzdGVyLWFsbG9jYXRvciwgaWYgdGhlIHNhbWUKKyAgIGVzdGltYXRlZCBjb3N0LXNhdmluZyBjYW4gYmUgb2J0YWluZWQgYnkgc2V2ZXJhbCByZWdpc3RlcnMsIHRoZQorICAgb25lIHdpdGggdGhlIGhpZ2hlc3QgcHJpb3JpdHkgd2lsbCBiZSB1c2VkICovCitpbnQgcmVnX3ByaW9bTUFYUisxXSA9IHsKKyAgICAwLDEwLDExLDEyLDEzLDIsMyw0LDUsNiw3LDgsOSwxNCwwLDEsMCwKKyAgICAxLDIsMyw0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsCisgICAgMTAsMTIsMiw0LDgsCisgICAgMSwyLDAsMCwwLDAsMCwwCit9OworCisvKiBhbiBlbXB0eSByZWctaGFuZGxlIHJlcHJlc2VudGluZyBpbml0aWFsIHN0YXRlICovCitzdHJ1Y3QgcmVnX2hhbmRsZSBlbXB0eV9yZWdfaGFuZGxlID0gezAsMH07CisKKy8qIE5hbWVzIG9mIHRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZSBhdHRyaWJ1dGVzLiAgICAgICAgICAgICAgICAqLworY2hhciAqZ19hdHRyX25hbWVbXSA9IHsKKyAgICAiX19hcm0iLCJfX3RodW1iIiwiX19pbnRlcnJ1cHQiLCJfX3N5c2NhbGwiLDAKK307CisjZGVmaW5lIEFSTSAxCisjZGVmaW5lIFRIVU1CIDIKKyNkZWZpbmUgSU5URVJSVVBUIDQKKyNkZWZpbmUgU1lTQ0FMTCA4CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgUHJpdmF0ZSBkYXRhIGFuZCBmdW5jdGlvbnMuICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExFX01PREUgKGdfZmxhZ3NbMl0mVVNFREZMQUcpCisjZGVmaW5lIEJFX01PREUgKGdfZmxhZ3NbM10mVVNFREZMQUcpCisjZGVmaW5lIEFSTV9ERUZBVUxUIChnX2ZsYWdzWzRdJlVTRURGTEFHKQorI2RlZmluZSBUSFVNQl9ERUZBVUxUIChnX2ZsYWdzWzVdJlVTRURGTEFHKQorI2RlZmluZSBDT05TVF9JTl9EQVRBIChnX2ZsYWdzWzZdJlVTRURGTEFHKQorI2RlZmluZSBFTEZfTEFCRUxTIChnX2ZsYWdzWzhdJlVTRURGTEFHKQorI2RlZmluZSBVU0VfQ09NTU9OUyAoZ19mbGFnc1s5XSZVU0VERkxBRykKKworaW50IGFybV9sZV9tb2RlID0gMTsgICAgICAgICAgLyogZGVmYXVsdHMgdG8gbGl0dGxlLWVuZGlhbiAqLworc3RhdGljIGludCB0aHVtYl9kZWZhdWx0ID0gMDsgLyogd2Ugc3RhcnQgaW4gQVJNIG1vZGUgKi8KK3N0YXRpYyBpbnQgdGh1bWIgPSAwOyAgICAgICAgIC8qIGN1cnJlbnQgbW9kZSAqLworCitlbnVtIHsKKyAgQUFBTlk9MCxBQTIsQUEzLEFBM00sQUE0LEFBNFQsQUE1LEFBNVQsQUE1VEUKK307CitzdGF0aWMgaW50IGFhID0gQUFBTlk7ICAgICAgICAvKiBBUk0gYXJjaGl0ZWN0dXJlIHZlcnNpb24gKi8KKworLyogYWxpZ25tZW50IG9mIGJhc2ljIGRhdGEtdHlwZXMsIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbGlnbltdICovCitzdGF0aWMgbG9uZyBtYWxpZ25bTUFYX1RZUEUrMV0gPSB7CisgICAgMSwxLDIsNCw0LDgsNCw4LDgsMSw0LDEsMSwxLDQsMQorfTsKKy8qIHNpemVzIG9mIGJhc2ljIGRhdGEtdHlwZXMsIHVzZWQgdG8gaW5pdGlhbGl6ZSBzaXpldGFiW10gKi8KK3N0YXRpYyBsb25nIG1zaXpldGFiW01BWF9UWVBFKzFdID0geworICAgIDEsMSwyLDQsNCw4LDQsOCw4LDAsNCwwLDAsMCw0LDAKK307CisKKy8qIHVzZWQgdG8gaW5pdGlhbGl6ZSByZWd0eXBbXSAqLworc3RhdGljIHN0cnVjdCBUeXAgbHR5cCAgPSB7TE9OR307CitzdGF0aWMgc3RydWN0IFR5cCBsbHR5cCA9IHtMTE9OR307CitzdGF0aWMgc3RydWN0IFR5cCBmdHlwICA9IHtGTE9BVH07CitzdGF0aWMgc3RydWN0IFR5cCBkdHlwICA9IHtET1VCTEV9OworCisvKiBtYWNyb3MgZGVmaW5lZCBieSB0aGUgYmFja2VuZCAqLworc3RhdGljIGNoYXIgKm1hcnJheVtdPXsiX19zZWN0aW9uKHgseSk9X192YXR0cihcInNlY3Rpb24oXCIjeFwiLFwiI3lcIilcIikiLAorICAgICAgICAgICAgICAgICAgICAgICAiX19BUk1fXyIsCisgICAgICAgICAgICAgICAgICAgICAgIDB9OworCisvKiBzcGVjaWFsIHJlZ2lzdGVycyAqLworc3RhdGljIGludCBpcCA9IEZJUlNUX0dQUisxMjsgICAgICAgLyogaW50ZXItcHJvY2VkdXJhbCBzY3JhdGNoIHJlZ2lzdGVyICovCitzdGF0aWMgaW50IHNwID0gRklSU1RfR1BSKzEzOyAgICAgICAvKiBzdGFjayBwb2ludGVyICovCitzdGF0aWMgaW50IGxyID0gRklSU1RfR1BSKzE0OyAgICAgICAvKiBsaW5rIHJlZ2lzdGVyICovCitzdGF0aWMgaW50IHBjID0gRklSU1RfR1BSKzE1OyAgICAgICAvKiBwcm9ncmFtIGNvdW50ZXIgKi8KK3N0YXRpYyBpbnQgcjAgPSBGSVJTVF9HUFI7CitzdGF0aWMgaW50IHIxID0gRklSU1RfR1BSKzE7CisKKy8qIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zICovCitzdGF0aWMgY2hhciAqbGR0c1tNQVhfVFlQRSsxXSA9IHsKKyAgICAibGRyIiwibGRyc2IiLCJsZHJzaCIsImxkciIsImxkciIsImxkciIsImxkciIsImxkciIsImxkciIsIj8/IiwibGRyIn07CitzdGF0aWMgY2hhciAqbGR0dVtNQVhfVFlQRSsxXSA9IHsKKyAgICAibGRyIiwibGRyYiIsImxkcmgiLCJsZHIiLCJsZHIiLCJsZHIiLCI/PyIsIj8/IiwiPz8iLCI/PyIsIj8/In07CitzdGF0aWMgY2hhciAqc2R0c1tNQVhfVFlQRSsxXSA9IHsKKyAgICAic3RyIiwic3RyYiIsInN0cmgiLCJzdHIiLCJzdHIiLCJzdHIiLCJzdHIiLCJzdHIiLCJzdHIiLCI/PyIsInN0ciJ9Oworc3RhdGljIGNoYXIgKnNkdHVbTUFYX1RZUEUrMV0gPSB7CisgICAgInN0ciIsInN0cmIiLCJzdHJoIiwic3RyIiwic3RyIiwic3RyIiwiPz8iLCI/PyIsIj8/IiwiPz8iLCI/PyJ9OworI2RlZmluZSBsZHQodCkgKCh0JlVOU0lHTkVEKSA/IGxkdHVbKHQpJk5RXSA6IGxkdHNbKHQpJk5RXSkKKyNkZWZpbmUgc2R0KHQpICgodCZVTlNJR05FRCkgPyBzZHR1Wyh0KSZOUV0gOiBzZHRzWyh0KSZOUV0pCisKK3N0YXRpYyBjaGFyICpsZHN0cHJlZml4W10gPSB7CisgICAgImxkIiwic3QiCit9OworCitzdGF0aWMgY2hhciAqZGN0W10gPSB7CisgICAgIiIsImJ5dGUiLCJzaG9ydCIsIndvcmQiLCJ3b3JkIiwid29yZCIsIndvcmQiLCJ3b3JkIiwid29yZCIKK307CisKK3N0YXRpYyBjaGFyICpjY3NbXSA9IHsKKyAgICAiZXEiLCJuZSIsImx0IiwiZ2UiLCJsZSIsImd0IiwiIgorfTsKKworc3RhdGljIGNoYXIgKmxvZ2ljYWxzW10gPSB7CisgICAgIm9yciIsImVvciIsImFuZCIKK307CisKK3N0YXRpYyBjaGFyICpzaGlmdHNbMl1bMl0gPSB7CisgICAgImxzbCIsImFzciIsImxzbCIsImxzciIKK307CisKKy8qIHNlY3Rpb25zICovCisjZGVmaW5lIERBVEEgMAorI2RlZmluZSBCU1MgMQorI2RlZmluZSBDT0RFIDIKKyNkZWZpbmUgUk9EQVRBIDMKKyNkZWZpbmUgU1BFQ0lBTCA0CisKKyNpZiAwCitzdGF0aWMgbG9uZyBzdGFjazsKK3N0YXRpYyBpbnQgc3RhY2tfdmFsaWQ7CisjZW5kaWYKK3N0YXRpYyBpbnQgbmV3b2JqOworc3RhdGljIGludCBzZWN0aW9uID0gLTE7CisKK3N0YXRpYyBjaGFyICpjb2RlbmFtZSA9ICJcdC50ZXh0XG4iOworc3RhdGljIGNoYXIgKmRhdGFuYW1lID0gIlx0LmRhdGFcbiI7CitzdGF0aWMgY2hhciAqYnNzbmFtZSA9ICIiOworc3RhdGljIGNoYXIgKnJvZGF0YW5hbWUgPSAiXHQucm9kYXRhXG4iOworCisvKiBsaXN0IG9mIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cyB0byBvdXRwdXQgYXQgZW5kIG9mIGZpbGUgKi8KK3N0cnVjdCBmcGNvbnN0bGlzdCB7CisgIHN0cnVjdCBmcGNvbnN0bGlzdCAqbmV4dDsKKyAgaW50IGxhYmVsOworICBpbnQgdHlwOworICB1bmlvbiBhdHlwcyB2YWw7Cit9Oworc3RhdGljIHN0cnVjdCBmcGNvbnN0bGlzdCAqZmlyc3RmcGMgPSBOVUxMOworCisvKiBkYXRhIHJlZmVyZW5jZSBwb2ludGVycyBhdCB0aGUgZW5kIG9mIGVhY2ggZnVuY3Rpb24gKi8KK3N0cnVjdCBEYXRhUmVmUHRyTGlzdCB7CisgIHN0cnVjdCBEYXRhUmVmUHRyTGlzdCAqbmV4dDsKKyAgaW50IGxhYmVsOworICBzdHJ1Y3QgVmFyICp2cHRyOyAgICAgICAgICAgICAvKiB2YWxpZCwgd2hlbiBsYWJlbD09MCAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgRGF0YVJlZlB0ckxpc3QgKmRhdGFwdHJzID0gTlVMTDsKK3N0YXRpYyBpbnQgZHJlZnB0cl9hcnJheV9sYWJlbDsgLyogY3VycmVudCBhcnJheSdzIGxhYmVsICovCisKKyNkZWZpbmUgaXNyZWcoeCkgKCgoeCkmKFJFR3xEUkVGT0JKKSk9PVJFRykKKyNkZWZpbmUgaXNjb25zdCh4KSAoKCh4KSYoS09OU1R8RFJFRk9CSikpPT1LT05TVCkKKworc3RhdGljIGludCBxMXJlZyxxMnJlZyx6cmVnOworc3RhdGljIHN0cnVjdCBWYXIgKmN1cnJlbnRfZnVuY3Rpb247CitzdGF0aWMgaW50IGljbnQ7ICAgICAgICAgICAgICAgIC8qIGNvdW50cyBudW1iZXIgb2YgbGluZXMgaW4gY3VyLiBmdW5jdGlvbiAqLworCisjZGVmaW5lIE1BWENPREVMSU5FUyA1MDAgICAgICAgIC8qIGVtaXQgZGF0YS1yZWYuIHB0ciBhcnJheSBhZnRlciB0aGF0ICovCisjZGVmaW5lIE1BWENPUFlJTlNUUyA0ICAgICAgICAgIC8qIG1heC4gbmIuIG9mIGxvYWQvc3RvcmUgY29weS1pbnN0cnVjdGlvbnMgKi8KKworLyogcmV0dXJuLWluc3RydWN0aW9uICovCitzdGF0aWMgY2hhciAqcmV0OworCisvKiBsYWJlbCBhdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiAoaWYgYW55KSAqLworc3RhdGljIGludCBleGl0X2xhYmVsOworCisvKiBhc3NlbWJseS1wcmVmaXhlcyBmb3IgbGFiZWxzIGFuZCBleHRlcm5hbCBpZGVudGlmaWVycyAqLworc3RhdGljIGNoYXIgKmxhYnByZWZpeD0ibCI7CitzdGF0aWMgY2hhciAqaWRwcmVmaXg9Il8iOworCisvKiB2YXJpYWJsZXMgdG8gY2FsY3VsYXRlIHRoZSBzaXplIGFuZCBwYXJ0aXRpb25pbmcgb2YgdGhlIHN0YWNrLWZyYW1lICovCitzdGF0aWMgbG9uZyBmcmFtZW9mZnNldCxwdXNob2ZmcyxmcmFtZXNpemU7CitzdGF0aWMgaW50IG5lZWRmcmFtZTsKK3N0YXRpYyBsb25nIGxvY2Fsc2l6ZSxyc2F2ZXNpemUsYXJnc2l6ZSxyc2F2ZW9mZnMsbWF4cnNhdmVvZmZzOworCisKKworc3RhdGljIGxvbmcgcmVhbF9vZmZzZXQoc3RydWN0IG9iaiAqbykKKy8qIGNhbGN1bGF0ZSB0aGUgYWN0dWFsIGN1cnJlbnQgb2Zmc2V0IG9mIGFuIG9iamVjdCByZWxhdGl2ZSB0byB0aGUKKyAgIHN0YWNrLXBvaW50ZXI7IHdlIHVzZSBhIGxheW91dCBsaWtlIHRoaXM6CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHwgc3RhY2stYXJndW1lbnRzIHRvIHRoaXMgZnVuY3Rpb24gICAgICAgICAgICAgfAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB8IGNhbGxlci1zYXZlIHJlZ2lzdGVycyBbc2l6ZT1yc2F2ZXNpemVdICAgICAgIHwKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCBsb2NhbCB2YXJpYWJsZXMgW3NpemU9bG9jYWxzaXplXSAgICAgICAgICAgICB8CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHwgYXJndW1lbnRzIHRvIGNhbGxlZCBmdW5jdGlvbnMgW3NpemU9YXJnc2l6ZV0gfAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBBbGwgc2l6ZXMgd2lsbCBiZSBhbGlnbmVkIGFzIG5lY2Vzc2FyeS4KKyAgIFRoZSBzdGFjay1wb2ludGVyIHdpbGwgYmUgYWRqdXN0ZWQgYXQKKyAgIGZ1bmN0aW9uLWVudHJ5IHRvIGxlYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhlIGFyZ3VtZW50cyBhbmQgaGF2ZSBpdAorICAgYWxpZ25lZCB0byAxNiBieXRlcy4gVGhlcmVmb3JlLCB3aGVuIGNhbGxpbmcgYSBmdW5jdGlvbiwgdGhlCisgICBzdGFjay1wb2ludGVyIGlzIGFsd2F5cyBhbGlnbmVkIHRvIDE2IGJ5dGVzLgorKi8KK3sKKyAgbG9uZyBvZmYgPSB6bTJsKG8tPnYtPm9mZnNldCk7CisKKyAgaWYgKG9mZiA8IDApIHsKKyAgICAvKiBmdW5jdGlvbiBwYXJhbWV0ZXIgKi8KKyAgICBvZmYgPSBsb2NhbHNpemUgKyByc2F2ZXNpemUgLSBvZmYgLSB6bTJsKG1heGFsaWduKTsKKyAgfQorICBlbHNlIHsKKyAgICAvKiBsb2NhbCB2YXJpYWJsZSAqLworICAgIG9mZiArPSBhcmdzaXplOworICAgIG9mZiArPSB6bTJsKG8tPnZhbC52bWF4KTsKKyAgfQorCisgIHJldHVybiBvZmY7Cit9CisKKworc3RhdGljIHN0cnVjdCBvYmogKmNhbShpbnQgZmxhZ3MsaW50IGJhc2UsbG9uZyBvZmZzZXQpCisvKiAgSW5pdGlhbGl6ZXMgYW4gYWRkcmVzc2luZy1tb2RlIHN0cnVjdHVyZSBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8KKyAgICB0aGF0IG9iamVjdC4gV2lsbCBub3Qgc3Vydml2ZSBhIHNlY29uZCBjYWxsISAqLworeworICBzdGF0aWMgc3RydWN0IG9iaiBvYmo7CisgIHN0YXRpYyBzdHJ1Y3QgQWRkcmVzc2luZ01vZGUgYW07CisKKyNpZiAwCisgIG9iai5hbSA9ICZhbTsKKyAgYW0uZmxhZ3MgPSBmbGFnczsKKyAgYW0uYmFzZSA9IGJhc2U7CisgIGFtLm9mZnNldCA9IG9mZnNldDsKKyNlbmRpZgorICByZXR1cm4gJm9iajsKK30KKworCitzdGF0aWMgaW50IG9iamFsaWduKHN0cnVjdCBvYmogKm8pCisvKiB5aWVsZHMgdGhlIG9iamVjdCdzIGxvd2VyIHR3byBiaXRzLCAxIHdoZW4gdW5rbm93biAqLworeworICBpZiAoby0+ZmxhZ3MgJiBEUkVGT0JKKQorICAgIHJldHVybiAxOworICBpZiAoby0+YW0pCisgICAgaWVycm9yKDApOworICBpZiAoIShvLT5mbGFncyAmIFZBUikpCisgICAgaWVycm9yKDApOworCisgIGlmIChpc3N0YXRpYyhvLT52LT5zdG9yYWdlX2NsYXNzKSB8fCBpc2V4dGVybihvLT52LT5zdG9yYWdlX2NsYXNzKSkgeworICAgIC8qIGFsbCBzdGF0aWMgZGF0YSBzaG91bGQgYmUgMzItYml0cyBhbGlnbmVkICovCisgICAgcmV0dXJuIHptMmwoem1hbmQoby0+dmFsLnZtYXgsbDJ6bSgzTCkpKTsKKyAgfQorCisgIGlmIChpc2F1dG8oby0+di0+c3RvcmFnZV9jbGFzcykpIHsKKyAgICB6bWF4IG9mID0gby0+di0+b2Zmc2V0OworCisgICAgaWYgKCF6bWxlcShsMnptKDBMKSxvZikpCisgICAgICBvZiA9IHptc3ViKGwyem0oMEwpLHptYWRkKG9mLG1heGFsaWduKSk7CisgICAgcmV0dXJuIHptMmwoem1hbmQoem1hZGQob2Ysby0+dmFsLnZtYXgpLGwyem0oM0wpKSk7CisgIH0KKworICBpZXJyb3IoMCk7Cit9CisKKworc3RhdGljIHZvaWQgdGl0bGUoRklMRSAqZikKKy8qIHNldCBmaWxlIHN5bWJvbCB3aXRoIGlucHV0IGZpbGUgbmFtZSAqLworeworICBleHRlcm4gY2hhciAqaW5uYW1lOworICBzdGF0aWMgaW50IGRvbmU7CisKKyAgaWYgKCFkb25lICYmIGYpIHsKKyAgICBkb25lID0gMTsKKyAgICBlbWl0KGYsIlx0LmZpbGVcdFwiJXNcIlxuIixpbm5hbWUpOworICB9Cit9CisKKworc3RhdGljIHZvaWQgZW1pdG5sKEZJTEUgKmYpCisvKiBlbWl0IGEgbmV3bGluZSBjaGFyYWN0ZXIgKi8KK3sKKyAgZW1pdChmLCJcbiIpOworfQorCisKK3N0YXRpYyB2b2lkIGVtaXRfb2JqKEZJTEUgKmYsc3RydWN0IG9iaiAqcCxpbnQgdCkKKy8qIHByaW50cyBhbiBvYmplY3QgKi8KK3sKKyAgaWYgKHAtPmZsYWdzICYgVkFSKSB7CisgICAgaWYgKGlzYXV0byhwLT52LT5zdG9yYWdlX2NsYXNzKSkgeworICAgICAgZW1pdChmLCJbJXMsIyVsZF0iLHJlZ25hbWVzW3NwXSxyZWFsX29mZnNldChwKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKCF6bWVxdG8obDJ6bSgwTCkscC0+dmFsLnZtYXgpKSB7CisgICAgICAgIGVtaXR2YWwoZiwmcC0+dmFsLExPTkcpOworICAgICAgICBlbWl0KGYsIisiKTsKKyAgICAgIH0KKyAgICAgIGlmIChpc3N0YXRpYyhwLT52LT5zdG9yYWdlX2NsYXNzKSkKKyAgICAgICAgZW1pdChmLCIlcyVsZCIsbGFicHJlZml4LHptMmwocC0+di0+b2Zmc2V0KSk7CisgICAgICBlbHNlCisgICAgICAgIGVtaXQoZiwiJXMlcyIsaWRwcmVmaXgscC0+di0+aWRlbnRpZmllcik7CisgICAgfQorICB9CisKKyAgaWYgKHAtPmZsYWdzICYgUkVHKSB7CisgICAgZW1pdChmLCIlcyIscmVnbmFtZXNbcC0+cmVnXSk7CisgIH0KKworICBpZiAocC0+ZmxhZ3MgJiBLT05TVCkgeworICAgIGVtaXQoZiwiIyIpOworICAgIGVtaXR2YWwoZiwmcC0+dmFsLHQmTlUpOworICB9Cit9CisKKworc3RhdGljIGludCBzcGVjaWFsX3NlY3Rpb24oRklMRSAqZixzdHJ1Y3QgVmFyICp2KQorLyogY2hhbmdlcyB0byBhIHNwZWNpYWwgc2VjdGlvbiwgdXNlZCBmb3IgX19zZWN0aW9uKCkgKi8KK3sKKyAgY2hhciAqc2VjOworCisgIGlmICh2LT52YXR0cikgeworICAgIGlmIChzZWMgPSBzdHJzdHIodi0+dmF0dHIsInNlY3Rpb24oIikpIHsKKyAgICAgIHNlYyArPSBzdHJsZW4oInNlY3Rpb24oIik7CisgICAgICBlbWl0KGYsIlx0LnNlY3Rpb25cdCIpOworICAgICAgd2hpbGUgKCpzZWMgJiYgKnNlYyE9JyknKQorICAgICAgICBlbWl0X2NoYXIoZiwqc2VjKyspOworICAgICAgZW1pdG5sKGYpOworICAgICAgaWYgKGYpCisgICAgICAgIHNlY3Rpb24gPSBTUEVDSUFMOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYWRkZnBjb25zdChzdHJ1Y3Qgb2JqICpvLGludCB0KQorLyogcmV0dXJuIGxhYmVsIGZvciBhIGZsb2F0LWNvbnN0YW50LCBjcmVhdGUgaWYgaXQgZGlkbid0IGV4aXN0ICovCit7CisgIHN0cnVjdCBmcGNvbnN0bGlzdCAqcD1maXJzdGZwYzsKKworICB0ICY9IE5ROworICBpZiAodCA9PSBMRE9VQkxFKQorICAgIHQgPSBET1VCTEU7CisKKyAgZm9yIChwPWZpcnN0ZnBjOyBwOyBwPXAtPm5leHQpIHsKKyAgICBpZiAodCA9PSBwLT50eXApIHsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnZhbCx0KTsKKyAgICAgIGlmICh0PT1GTE9BVCAmJiB6bGRlcXRvKHZsZG91YmxlLHpmMnpsZChvLT52YWwudmZsb2F0KSkpCisgICAgICAgIHJldHVybiBwLT5sYWJlbDsKKyAgICAgIGlmICh0PT1ET1VCTEUgJiYgemxkZXF0byh2bGRvdWJsZSx6ZDJ6bGQoby0+dmFsLnZkb3VibGUpKSkKKyAgICAgICAgcmV0dXJuIHAtPmxhYmVsOworICAgIH0KKyAgfQorCisgIHAgPSBteW1hbGxvYyhzaXplb2Yoc3RydWN0IGZwY29uc3RsaXN0KSk7CisgIHAtPm5leHQgPSBmaXJzdGZwYzsKKyAgcC0+bGFiZWwgPSArK2xhYmVsOworICBwLT50eXAgPSB0OworICBwLT52YWwgPSBvLT52YWw7CisgIGZpcnN0ZnBjID0gcDsKKworICByZXR1cm4gcC0+bGFiZWw7Cit9CisKKworc3RhdGljIHZvaWQgZW1pdF9kYXRhcHRyX2FycmF5KEZJTEUgKmYpCisvKiBlbWl0IGFsbCBkYXRhLXJlZmVyZW5jZSBwb2ludGVycyB3aGljaCB3ZXJlIGNvbGxlY3RlZCB1bnRpbCBub3csCisgICB0aGVuIHJlc2V0IHRoZSBhcnJheSAqLworeworICBzdHJ1Y3QgRGF0YVJlZlB0ckxpc3QgKmRycCwqbmV4dDsKKworICBpZiAobmV4dCA9IGRhdGFwdHJzKSB7CisgICAgZW1pdChmLCJcdC5hbGlnblx0MlxuIik7CisgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsZHJlZnB0cl9hcnJheV9sYWJlbCk7CisKKyAgICB3aGlsZSAoZHJwID0gbmV4dCkgeworICAgICAgbmV4dCA9IGRycC0+bmV4dDsKKyAgICAgIGVtaXQoZiwiXHQuJXNcdCIsZGN0W0xPTkddKTsKKyAgICAgIGlmIChkcnAtPmxhYmVsKSB7CisgICAgICAgIGVtaXQoZiwiJXMlZFxuIixsYWJwcmVmaXgsZHJwLT5sYWJlbCk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKGlzc3RhdGljKGRycC0+dnB0ci0+c3RvcmFnZV9jbGFzcykpCisgICAgICAgICAgZW1pdChmLCIlcyVsZFxuIixsYWJwcmVmaXgsem0ybChkcnAtPnZwdHItPm9mZnNldCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgZW1pdChmLCIlcyVzXG4iLGlkcHJlZml4LGRycC0+dnB0ci0+aWRlbnRpZmllcik7CisgICAgICB9CisgICAgICBmcmVlKGRycCk7CisgICAgfQorICAgIGRhdGFwdHJzID0gTlVMTDsKKyAgfQorICBkcmVmcHRyX2FycmF5X2xhYmVsID0gMDsKK30KKworCitzdGF0aWMgaW50IGNnX2dldHJlZyhGSUxFICpmLHN0cnVjdCBJQyAqaWMpCisvKiBhbGxvY2F0ZSBhIGNvZGUgZ2VuZXJhdG9yIGludGVybmFsIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciAqLworeworICAvKiBhbGxvY19jb2RlOiAxOmNvbXBpbGVyLCAyOmJhY2tlbmQsID49NDpiYWNrZW5kIHJzYXZlLWFyZWEgb2Zmc2V0IC0gNCAqLworICBpbnQgYWxsb2NfY29kZSA9IDI7CisgIGludCBpLHAscjsKKworICAvKiB0cnkgdG8gZ2V0IGEgZnJlZSBzY3JhdGNoLXJlZ2lzdGVyIG9yIGEgbm9uLXZvbGF0aWxlCisgICAgIHJlZ2lzdGVyIHdoaWNoIGhhcyB0byBiZSBzYXZlZCBhbnl3YXksCisgICAgIHIxMiAoaXApIGlzIHJlc2VydmVkIHRvIHRoZSBiYWNrZW5kIGFuZCB3aWxsIGJlIHVzZWQgYXMgd2VsbCwKKyAgICAgcjE0IChscikgaXMgYXZhaWxhYmxlIHdoZW4gdGhlIGZ1bmN0aW9uIGJ1aWxkcyBhIHN0YWNrIGZyYW1lICovCisgIGZvciAoaT1GSVJTVF9HUFIscD0wLHI9MDsgaTxGSVJTVF9HUFIrMTM7IGkrKykgeworICAgIGlmICgoKGk9PWlwICYmIHJlZ3NbaV09PTEpIHx8CisgICAgICAgICAoaT09bHIgJiYgcmVnc1tpXT09MSAmJiBuZWVkZnJhbWUpIHx8CisgICAgICAgICAocmVnc1tpXT09MCAmJiAocmVnc2NyYXRjaFtpXSB8fCByZWd1c2VkW2ldKSkpICYmCisgICAgICAgIHJlZ19wcmlvW2ldKyhyZWd1c2VkW2ldPDw4KSA+IHApIHsKKyAgICAgIHAgPSByZWdfcHJpb1tpXSArIChyZWd1c2VkW2ldIDw8IDgpOworICAgICAgciA9IGk7CisgICAgfQorICB9CisgIGlmICghcikgeworICAgIC8qIHNlZW1zIHdlIGhhdmUgdG8gc2F2ZSBhIG5ldyBub24tdm9sYXRpbGUgcmVnaXN0ZXIgKi8KKyAgICBmb3IgKGk9RklSU1RfR1BSLHA9MDsgaTxGSVJTVF9HUFIrMTM7IGkrKykgeworICAgICAgaWYgKHJlZ3NbaV09PTAgJiYgcmVnX3ByaW9baV0+cCkgeworICAgICAgICBwID0gcmVnX3ByaW9baV07CisgICAgICAgIHIgPSBpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoIXIpIHsKKyAgICAvKiBubyByZWdpc3RlciBhdmFpbGFibGUgLSBzYXZlIG9uZSB0byB0aGUgc3RhY2stZnJhbWUsIGJ1dAorICAgICAgIG1ha2Ugc3VyZSBpdCBpcyBub3QgdXNlZCBpbiB0aGlzIElDICovCisgICAgZm9yIChpPUZJUlNUX0dQUixwPTA7IGk8RklSU1RfR1BSKzEzOyBpKyspIHsKKyAgICAgIGlmIChyZWdzW2ldPDIgJiYgcmVnX3ByaW9baV0+cCkgeworICAgICAgICBpZiAoKCFpc3JlZyhpYy0+cTEuZmxhZ3MpIHx8IGljLT5xMS5yZWchPWkpICYmCisgICAgICAgICAgICAoIWlzcmVnKGljLT5xMi5mbGFncykgfHwgaWMtPnEyLnJlZyE9aSkgJiYKKyAgICAgICAgICAgICghaXNyZWcoaWMtPnouZmxhZ3MpIHx8IGljLT56LnJlZyE9aSkpIHsKKyAgICAgICAgICBwID0gcmVnX3ByaW9baV07CisgICAgICAgICAgciA9IGk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHIpIHsKKyAgICAgIGlmIChmKQorICAgICAgICBlbWl0KGYsIlx0c3RyXHQlcyxbJXMsIyVsZF1cbiIsCisgICAgICAgICAgICAgcmVnbmFtZXNbcl0scmVnbmFtZXNbc3BdLGFyZ3NpemUrbG9jYWxzaXplK3JzYXZlb2Zmcyk7CisgICAgICByc2F2ZW9mZnMgKz0gNDsKKyAgICAgIGlmIChyc2F2ZW9mZnMgPiBtYXhyc2F2ZW9mZnMpCisgICAgICAgIG1heHJzYXZlb2ZmcyA9IHJzYXZlb2ZmczsKKyAgICAgIGFsbG9jX2NvZGUgPSByc2F2ZW9mZnM7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGllcnJvcigwKTsKKyAgfQorCisgIHJlZ3Nbcl0gPSBhbGxvY19jb2RlOworICByZWd1c2VkW3JdID0gMTsKKyAgcmV0dXJuIHI7Cit9CisKKworc3RhdGljIGludCBjZ19nZXRkcHJlZyhGSUxFICpmLHN0cnVjdCBJQyAqaWMpCisvKiBhbGxvY2F0ZSBhIGNvZGUgZ2VuZXJhdG9yIGludGVybmFsIGRvdWJsZSBwcmVjaXNpb24gRlAgcmVnaXN0ZXIgKi8KK3sKKyAgaW50IGkscCxyOworICBzdHJ1Y3QgcnBhaXIgcnA7CisKKyAgLyogdHJ5IHRvIGdldCBhIGZyZWUgc2NyYXRjaC1yZWdpc3RlciBvciBhIG5vbi12b2xhdGlsZQorICAgICByZWdpc3RlciB3aGljaCBoYXMgdG8gYmUgc2F2ZWQgYW55d2F5ICovCisgIGZvciAoaT1GSVJTVF9ET1VCTEUscD0wLHI9MDsgaTw9TEFTVF9QQUlSOyBpKyspIHsKKyAgICBpZiAocmVnc1tpXT09MCAmJiAocmVnc2NyYXRjaFtpXSB8fCByZWd1c2VkW2ldKSAmJgorICAgICAgICByZWdfcHJpb1tpXSsocmVndXNlZFtpXTw8OCkgPiBwICYmIHJlZ19wYWlyKGksJnJwKSkgeworICAgICAgaWYgKHJlZ3NbcnAucjFdPT0wICYmIHJlZ3NbcnAucjJdPT0wKSB7CisgICAgICAgIHAgPSByZWdfcHJpb1tpXSArIChyZWd1c2VkW2ldIDw8IDgpOworICAgICAgICByID0gaTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKCFyKSB7CisgICAgaWVycm9yKDApOyAvKiBAQEAgRklYTUUgKi8KKyAgfQorCisgIHJlZ3Nbcl0gPSAyOworICByZWd1c2VkW3JdID0gMTsKKyAgaWYgKCFyZWdfcGFpcihpLCZycCkpCisgICAgaWVycm9yKDApOworICByZWdzW3JwLnIxXSA9IHJlZ3NbcnAucjJdID0gMjsKKyAgcmVndXNlZFtycC5yMV0gPSByZWd1c2VkW3JwLnIyXSA9IDE7CisgIHJldHVybiByOworfQorCisKK3N0YXRpYyB2b2lkIGNnX3Jlc3RvcmVyZWcoRklMRSAqZixpbnQgcikKK3sKKyAgaWYgKGYpIHsKKyAgICBpZiAociA8PSBMQVNUX0dQUikKKyAgICAgIGVtaXQoZiwiXHRsZHJcdCVzLFslcywjJWxkXVxuIiwKKyAgICAgICAgICAgcmVnbmFtZXNbcl0scmVnbmFtZXNbc3BdLGFyZ3NpemUrbG9jYWxzaXplK3JlZ3Nbcl0tNCk7CisgICAgZWxzZQorICAgICAgaWVycm9yKDApOyAgLyogQEBAIEZJWE1FICovCisgIH0KK30KKworCitzdGF0aWMgdm9pZCBjZ19mcmVlcmVnKEZJTEUgKmYsaW50IHIpCisvKiBmcmVlIGEgY29kZSBnZW5lcmF0b3IgaW50ZXJuYWwgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyICovCit7CisgIHN0cnVjdCBycGFpciBycDsKKworICBpZiAocmVnc1tyXSA+IDEpIHsKKyAgICBpZiAocmVnc1tyXSA+IDIpCisgICAgICBjZ19yZXN0b3JlcmVnKGYscik7CisgICAgcmVnc1tyXSA9IChyPT1pcHx8cj09bHIpID8gMSA6IDA7ICAvKiBpcC9sciBuZWVkIHRvIHN0YXkgcmVzZXJ2ZWQgKi8KKyAgfQorICBlbHNlCisgICAgaWVycm9yKDApOworCisgIGlmIChyZWdfcGFpcihyLCZycCkpIHsKKyAgICBpZiAocmVnc1tycC5yMV0+MSAmJiByZWdzW3JwLnIyXT4xKSB7CisgICAgICBpZiAocmVnc1tycC5yMV0gPiAyKQorICAgICAgICBjZ19yZXN0b3JlcmVnKGYscnAucjEpOworICAgICAgaWYgKHJlZ3NbcnAucjJdID4gMikKKyAgICAgICAgY2dfcmVzdG9yZXJlZyhmLHJwLnIyKTsKKyAgICAgIHJlZ3NbcnAucjFdID0gcmVnc1tycC5yMl0gPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgICBpZXJyb3IoMCk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBjZ19mcmVlYWxsKEZJTEUgKmYpCisvKiByZXNldCBpbnRlcm5hbCByZWdpc3RlciBhbGxvY2F0aW9ucyAqLworeworICBpbnQgaTsKKworICBmb3IgKGk9MTsgaTw9TUFYUjsgaSsrKSB7CisgICAgaWYgKHJlZ3NbaV0gPiAxKSB7CisgICAgICBpZiAocmVnc1tpXSA+IDIpCisgICAgICAgIGNnX3Jlc3RvcmVyZWcoZixpKTsKKyAgICAgIHJlZ3NbaV0gPSAoaT09aXB8fGk9PWxyKSA/IDEgOiAwOyAgLyogaXAvbHIgbmVlZCB0byBzdGF5IHJlc2VydmVkICovCisgICAgfQorICB9CisgIHJzYXZlb2ZmcyA9IDA7Cit9CisKKworc3RhdGljIGxvbmcgZGF0YXB0cl9vZmZzZXQoaW50IGxhYmVsLHN0cnVjdCBvYmogKm8pCisvKiByZXR1cm4gb2Zmc2V0IGludG8gZGF0YS1yZWZlcmVuY2UtcG9pbnRlciBhcnJheSBmb3IgbGFiZWwgbAorICAgb3IgZm9yIG9iamVjdCBvIChtdXR1YWxseSBleGNsdXNpdmUpICovCit7CisgIGxvbmcgb2ZmID0gMDsKKyAgc3RydWN0IERhdGFSZWZQdHJMaXN0ICoqb2xkZHJwID0gJmRhdGFwdHJzOworICBzdHJ1Y3QgRGF0YVJlZlB0ckxpc3QgKmRycCA9IGRhdGFwdHJzOworCisgIGlmICghbGFiZWwpIHsKKyAgICBpZiAoIShvLT5mbGFncyAmIFZBUikpCisgICAgICBpZXJyb3IoMCk7CisgICAgaWYgKCFpc3N0YXRpYyhvLT52LT5zdG9yYWdlX2NsYXNzKSAmJiAhaXNleHRlcm4oby0+di0+c3RvcmFnZV9jbGFzcykpCisgICAgICBpZXJyb3IoMCk7CisgIH0KKworICAvKiBjaGVjayBpZiBhIHBvaW50ZXIgdG8gdGhpcyBvYmplY3QgYWxyZWFkeSBleGlzdHMgKi8KKyAgd2hpbGUgKGRycCkgeworICAgIGlmIChsYWJlbCkgeworICAgICAgaWYgKGRycC0+bGFiZWwgPT0gbGFiZWwpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmIChkcnAtPnZwdHIgPT0gby0+dikKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIG9sZGRycCA9ICZkcnAtPm5leHQ7CisgICAgZHJwID0gZHJwLT5uZXh0OworICAgIG9mZiArPSA0OworICB9CisKKyAgLyogY3JlYXRlIGEgbmV3IGVudHJ5IGlmIGl0IGRvZXNuJ3QgZXhpc3QgKi8KKyAgaWYgKGRycCA9PSBOVUxMKSB7CisgICAgKm9sZGRycCA9IGRycCA9IG15bWFsbG9jKHNpemVvZihzdHJ1Y3QgRGF0YVJlZlB0ckxpc3QpKTsKKworICAgIGRycC0+bmV4dCA9IE5VTEw7CisgICAgaWYgKGRycC0+bGFiZWwgPSBsYWJlbCkKKyAgICAgIGRycC0+dnB0ciA9IE5VTEw7CisgICAgZWxzZQorICAgICAgZHJwLT52cHRyID0gby0+djsKKyAgfQorCisgIHJldHVybiBvZmY7Cit9CisKKworc3RhdGljIHZvaWQgbG9hZF9kYXRhcHRyKEZJTEUgKmYsaW50IHIsaW50IGwsc3RydWN0IG9iaiAqbykKKy8qIGxvYWQgZGF0YS1yZWZlcmVuY2UtcG9pbnRlciBhcnJheSBlbnRyeSBmb3IgbGFiZWwgbCBvciBvYmplY3QgbyBpbnRvIHIgKi8KK3sKKyAgQlNFVChyZWdzX21vZGlmaWVkLHIpOworCisgIGlmICghZHJlZnB0cl9hcnJheV9sYWJlbCkKKyAgICBkcmVmcHRyX2FycmF5X2xhYmVsID0gKytsYWJlbDsKKworICBlbWl0KGYsIlx0bGRyXHQlcywlcyVkKyVsZFxuIiwKKyAgICAgICByZWduYW1lc1tyXSxsYWJwcmVmaXgsZHJlZnB0cl9hcnJheV9sYWJlbCxkYXRhcHRyX29mZnNldChsLG8pKTsKK30KKworCitzdGF0aWMgdm9pZCBsZHN0NjQoRklMRSAqZixpbnQgc3RvcmUsc3RydWN0IHJwYWlyICpycCxpbnQgYmFzZSkKKy8qIGdlbmVyYXRlIGEgbGRtaWEgb3Igc3RtaWEgKHN0b3JlPTEpIGluc3RydWN0aW9uIHRvIHRyYW5zZmVyIGEgNjQtYml0CisgICB2YWx1ZSBpbiByZWdpc3RlciBwYWlyIHJwIHBvaW50ZWQgdG8gYnkgYmFzZS1yZWdpc3RlciBiYXNlICovCit7CisgIGVtaXQoZiwiJXNtaWFcdCVzLHslcy0lc31cbiIsCisgICAgICAgbGRzdHByZWZpeFtzdG9yZV0scmVnbmFtZXNbYmFzZV0scmVnbmFtZXNbcnAtPnIxXSxyZWduYW1lc1tycC0+cjJdKTsKK30KKworCitzdGF0aWMgdm9pZCBsb2FkX2FkZHJlc3MoRklMRSAqZixpbnQgcixzdHJ1Y3Qgb2JqICpvLGludCB0eXBlKQorLyogIEdlbmVyYXRlcyBjb2RlIHRvIGxvYWQgdGhlIGFkZHJlc3Mgb2YgYSB2YXJpYWJsZSBpbnRvIHJlZ2lzdGVyIHIuICovCit7CisgIEJTRVQocmVnc19tb2RpZmllZCxyKTsKKworICBpZiAoIShvLT5mbGFncyAmIFZBUikpCisgICAgaWVycm9yKDApOworCisgIGlmIChpc2F1dG8oby0+di0+c3RvcmFnZV9jbGFzcykpCisgICAgZW1pdChmLCJcdGFkZFx0JXMsJXMsIyVsZFxuIixyZWduYW1lc1tyXSxyZWduYW1lc1tzcF0scmVhbF9vZmZzZXQobykpOworICBlbHNlCisgICAgbG9hZF9kYXRhcHRyKGYsciwwLG8pOworfQorCisKK3N0YXRpYyB2b2lkIGxvYWRfcmVnaW5kaXIoRklMRSAqZixzdHJ1Y3QgSUMgKnAsaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3QsaW50IGJhc2UsbG9uZyBvZmYpCisvKiAgTG9hZCByZWdpc3RlciBkc3Qgb2YgdHlwZSB0eXBlIGZyb20gW2Jhc2UsI29mZl0uCisgICAgYmFzZSBhbmQgZHN0IG1heSBiZSB0aGUgc2FtZS4KKyAgICBQZXJmb3JtIHNpemUgZXh0ZW5zaW9ucyBhcyByZXF1aXJlZCBieSBhcmNoaXRlY3R1cmUuICovCit7CisgIEJTRVQocmVnc19tb2RpZmllZCxkc3QpOworCisgIGlmIChhYSA+PSBBQTQpIHsKKyAgICBlbWl0KGYsIlx0JXNcdCVzLFslcywjJWxkXVxuIiwKKyAgICAgICAgIGxkdCh0eXBlKSxyZWduYW1lc1tkc3RdLHJlZ25hbWVzW2Jhc2VdLG9mZik7CisgIH0KKworICBlbHNlIHsKKyAgICAvKiB0aGlzIHJlcXVpcmVzIG1vcmUgZWZmb3J0IG9uIG9sZGVyIEFSTXMgKi8KKyAgICBpbnQgdG1wOworCisgICAgc3dpdGNoIChzaXpldGFiW3R5cGUmTlFdKSB7CisgICAgICBjYXNlIDE6CisgICAgICAgIGVtaXQoZiwiXHRsZHJiXHQlcyxbJXMsIyVsZF1cbiIscmVnbmFtZXNbZHN0XSxyZWduYW1lc1tiYXNlXSxvZmYpOworICAgICAgICBpZiAoISh0eXBlICYgVU5TSUdORUQpKSB7CisgICAgICAgICAgZW1pdChmLCJcdG1vdlx0JXMsJXMsbHNsICMyNFxuIixyZWduYW1lc1tkc3RdLHJlZ25hbWVzW2RzdF0pOworICAgICAgICAgIGVtaXQoZiwiXHRtb3ZcdCVzLCVzLGFzciAjMjRcbiIscmVnbmFtZXNbZHN0XSxyZWduYW1lc1tkc3RdKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgdG1wID0gY2dfZ2V0cmVnKGYscCk7CisgICAgICAgIGVtaXQoZiwiXHRsZHJiXHQlcyxbJXMsIyVsZF1cbiIscmVnbmFtZXNbdG1wXSxyZWduYW1lc1tiYXNlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmYrMS1hcm1fbGVfbW9kZSk7CisgICAgICAgIGVtaXQoZiwiXHRsZHJiXHQlcyxbJXMsIyVsZF1cbiIscmVnbmFtZXNbZHN0XSxyZWduYW1lc1tiYXNlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmYrYXJtX2xlX21vZGUpOworICAgICAgICBpZiAoISh0eXBlICYgVU5TSUdORUQpKSB7CisgICAgICAgICAgZW1pdChmLCJcdG1vdlx0JXMsJXMsbHNsICMyNFxuIixyZWduYW1lc1tkc3RdLHJlZ25hbWVzW2RzdF0pOworICAgICAgICAgIGVtaXQoZiwiXHRvcnJcdCVzLCVzLCVzIGFzciAjMTZcbiIsCisgICAgICAgICAgICAgICByZWduYW1lc1tkc3RdLHJlZ25hbWVzW3RtcF0scmVnbmFtZXNbZHN0XSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgZW1pdChmLCJcdG9yclx0JXMsJXMsJXMgbHNsICM4XG4iLAorICAgICAgICAgICAgICAgcmVnbmFtZXNbZHN0XSxyZWduYW1lc1t0bXBdLHJlZ25hbWVzW2RzdF0pOworICAgICAgICB9CisgICAgICAgIGNnX2ZyZWVyZWcoZix0bXApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgZW1pdChmLCJcdGxkclx0JXMsWyVzLCMlbGRdXG4iLHJlZ25hbWVzW2RzdF0scmVnbmFtZXNbYmFzZV0sb2ZmKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZXJyb3IoMCk7CisgICAgfQorICB9Cit9CisKKworc3RhdGljIHZvaWQgbG9hZF9yZWcoRklMRSAqZixzdHJ1Y3QgSUMgKnAsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdHlwZSkKKy8qIEdlbmVyYXRlcyBjb2RlIHRvIGxvYWQgYSBtZW1vcnkgb2JqZWN0IGludG8gcmVnaXN0ZXIgci4gKi8KK3sKKyAgdHlwZSAmPSBOVTsKKyAgQlNFVChyZWdzX21vZGlmaWVkLHIpOworCisgIGlmIChvLT5mbGFncyAmIEtPTlNUKSB7CisgICAgLyogZXZhbHVhdGUgYW5kIGxvYWQgYSBjb25zdGFudCAqLworCisgICAgZXZhbF9jb25zdCgmby0+dmFsLHR5cGUpOworCisgICAgaWYgKElTRkxPQVQodHlwZSkpIHsKKyAgICAgIGludCBsYWIgPSBhZGRmcGNvbnN0KG8sdHlwZSk7CisKKyAgICAgIGxvYWRfZGF0YXB0cihmLHIsbGFiLE5VTEwpOworICAgICAgaWYgKHR5cGUgPT0gRkxPQVQpCisgICAgICAgIGxvYWRfcmVnaW5kaXIoZixwLHR5cGUscixyLDApOworICAgICAgZWxzZQorICAgICAgICBpZXJyb3IoMCk7ICAvKiBkb3VibGUgY2FuIG9ubHkgYmUgaW4gYSByZWdpc3Rlci1wYWlyICovCisgICAgfQorCisgICAgZWxzZSB7CisgICAgICAvKiBpbnRlZ2VyIGNvbnN0YW50ICovCisgICAgICBlbWl0KGYsIlx0bW92XHQlcywiLHJlZ25hbWVzW3JdKTsKKyAgICAgIGVtaXRfb2JqKGYsbyx0eXBlKTsKKyAgICAgIGVtaXRubChmKTsKKyAgICB9CisgIH0KKworICBlbHNlIGlmIChpc3JlZyhvLT5mbGFncykpIHsKKyAgICBpZiAociAhPSBvLT5yZWcpCisgICAgICBlbWl0KGYsIlx0bW92XHQlcywlc1xuIixyZWduYW1lc1tyXSxyZWduYW1lc1tvLT5yZWddKTsKKyAgfQorCisgIGVsc2UgaWYgKChvLT5mbGFncyAmIChSRUd8RFJFRk9CSikpID09IChSRUd8RFJFRk9CSikpIHsKKyAgICBsb2FkX3JlZ2luZGlyKGYscCx0eXBlLHIsby0+cmVnLDApOworICB9CisKKyAgZWxzZSBpZiAoby0+ZmxhZ3MgJiBWQVIpIHsKKyAgICBpZiAoaXNzdGF0aWMoby0+di0+c3RvcmFnZV9jbGFzcykgfHwgaXNleHRlcm4oby0+di0+c3RvcmFnZV9jbGFzcykpIHsKKyAgICAgIC8qIGxvYWQgZnJvbSBhIHN0YXRpYyB2YXJpYWJsZSAqLworICAgICAgaWYgKG8tPmZsYWdzICYgVkFSQURSKSB7CisgICAgICAgIGxvYWRfYWRkcmVzcyhmLHIsbyxQT0lOVEVSKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBsb2FkX2RhdGFwdHIoZixyLDAsbyk7CisgICAgICAgIGxvYWRfcmVnaW5kaXIoZixwLHR5cGUscixyLHptMmwoby0+dmFsLnZtYXgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvKiBkeW5hbWljIHZhcmlhYmxlIG9uIHN0YWNrICovCisgICAgICBsb2FkX3JlZ2luZGlyKGYscCx0eXBlLHIsc3AscmVhbF9vZmZzZXQobykpOworICAgIH0KKyAgfQorCisgIGVsc2UKKyAgICBpZXJyb3IoMCk7Cit9CisKKworc3RhdGljIHZvaWQgc3RvcmVfcmVnaW5kaXIoRklMRSAqZixzdHJ1Y3QgSUMgKnAsaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjLGludCBiYXNlLGxvbmcgb2ZmKQorLyogIFN0b3JlIHJlZ2lzdGVyIHNyYyBvZiB0eXBlIHR5cGUgdG8gW2Jhc2UsI29mZl0uICovCit7CisgIGlmIChhYT49QUE0IHx8IHNpemV0YWJbdHlwZSZOUV0hPTIpIHsKKyAgICBlbWl0KGYsIlx0JXNcdCVzLFslcywjJWxkXVxuIiwKKyAgICAgICAgIHNkdCh0eXBlKSxyZWduYW1lc1tzcmNdLHJlZ25hbWVzW2Jhc2VdLG9mZik7CisgIH0KKworICBlbHNlIHsKKyAgICAvKiBzdG9yaW5nIGhhbGZ3b3JkcyByZXF1aXJlcyBtb3JlIGVmZm9ydCBvbiBvbGRlciBBUk1zICovCisgICAgaW50IHRtcCA9IGNnX2dldHJlZyhmLHApOworCisgICAgZW1pdChmLCJcdHN0cmJcdCVzLFslcywjJWxkXVxuIixyZWduYW1lc1tzcmNdLHJlZ25hbWVzW2Jhc2VdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmKzEtYXJtX2xlX21vZGUpOworICAgIGVtaXQoZiwiXHRtb3ZcdCVzLCVzLGFzciAjOFxuIixyZWduYW1lc1t0bXBdLHJlZ25hbWVzW3NyY10pOworICAgIGVtaXQoZiwiXHRzdHJiXHQlcyxbJXMsIyVsZF1cbiIscmVnbmFtZXNbc3JjXSxyZWduYW1lc1tiYXNlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZithcm1fbGVfbW9kZSk7CisgICAgY2dfZnJlZXJlZyhmLHRtcCk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZCBzdG9yZV9yZWcoRklMRSAqZixzdHJ1Y3QgSUMgKnAsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdHlwZSkKKy8qIEdlbmVyYXRlcyBjb2RlIHRvIHN0b3JlIHJlZ2lzdGVyIHIgaW50byBtZW1vcnkgb2JqZWN0IG8uICovCit7CisgIGlmIChpc3JlZyhvLT5mbGFncykpIHsKKyAgICBpZiAociAhPSBvLT5yZWcpCisgICAgICBlbWl0KGYsIlx0bW92XHQlcywlc1xuIixyZWduYW1lc1tvLT5yZWddLHJlZ25hbWVzW3JdKTsKKyAgfQorCisgIGVsc2UgaWYgKChvLT5mbGFncyAmIChSRUd8RFJFRk9CSikpID09IChSRUd8RFJFRk9CSikpIHsKKyAgICBzdG9yZV9yZWdpbmRpcihmLHAsdHlwZSxyLG8tPnJlZywwKTsKKyAgfQorCisgIGVsc2UgaWYgKG8tPmZsYWdzICYgVkFSKSB7CisgICAgaWYgKGlzc3RhdGljKG8tPnYtPnN0b3JhZ2VfY2xhc3MpIHx8IGlzZXh0ZXJuKG8tPnYtPnN0b3JhZ2VfY2xhc3MpKSB7CisgICAgICAvKiBzdG9yZSB0byBhIHN0YXRpYyB2YXJpYWJsZSAqLworICAgICAgaW50IHRtcCA9IGNnX2dldHJlZyhmLHApOworCisgICAgICBsb2FkX2RhdGFwdHIoZix0bXAsMCxvKTsKKyAgICAgIHN0b3JlX3JlZ2luZGlyKGYscCx0eXBlLHIsdG1wLHptMmwoby0+dmFsLnZtYXgpKTsKKyAgICAgIGNnX2ZyZWVyZWcoZix0bXApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8qIGR5bmFtaWMgdmFyaWFibGUgb24gc3RhY2sgKi8KKyAgICAgIHN0b3JlX3JlZ2luZGlyKGYscCx0eXBlLHIsc3AscmVhbF9vZmZzZXQobykpOworICAgIH0KKyAgfQorCisgIGVsc2UKKyAgICBpZXJyb3IoMCk7Cit9CisKKworc3RhdGljIGludCBsb2FkX29ianB0cihGSUxFICpmLHN0cnVjdCBJQyAqcCxzdHJ1Y3Qgb2JqICpvKQorLyogTWFrZSBzdXJlIG9iamVjdCBvIGNhbiBiZSBkZXJlZmVyZW5jZWQgYnkgYSBzaW5nbGUgbG9hZC4KKyAgIFJldHVybiBuZXcgYmFzZSByZWdpc3Rlciwgb3IgMCBpZiBvYmplY3Qgd2FzIG5vdCBtb2RpZmllZC4gKi8KK3sKKyAgaWYgKChvLT5mbGFncyAmIChSRUd8RFJFRk9CSikpID09IERSRUZPQkopIHsKKyAgICBpbnQgciA9IGNnX2dldHJlZyhmLHApOworCisgICAgbG9hZF9yZWcoZixwLHIsbyxQT0lOVEVSKTsKKyAgICBvLT5mbGFncyB8PSBSRUc7CisgICAgby0+cmVnID0gcjsKKyAgICByZXR1cm4gcjsKKyAgfQorCisgIGlmICgoby0+ZmxhZ3MgJiAoVkFSfFJFRykpID09IFZBUikgeworICAgIGlmIChpc3N0YXRpYyhvLT52LT5zdG9yYWdlX2NsYXNzKSB8fCBpc2V4dGVybihvLT52LT5zdG9yYWdlX2NsYXNzKSkgeworICAgICAgaW50IHIgPSBjZ19nZXRyZWcoZixwKTsKKworICAgICAgbG9hZF9kYXRhcHRyKGYsciwwLG8pOworICAgICAgby0+cmVnID0gcjsKKyAgICAgIG8tPmZsYWdzID0gUkVHfERSRUZPQko7CisgICAgICByZXR1cm4gcjsKKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBsb2FkX3JlZ3BhaXIoRklMRSAqZixzdHJ1Y3QgSUMgKnAsc3RydWN0IHJwYWlyICpycCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb2JqICpvLGludCB0eXBlKQorLyogR2VuZXJhdGVzIGNvZGUgdG8gbG9hZCBhIG1lbW9yeSBvYmplY3QgaW50byB0aGUgcmVnaXN0ZXIgcGFpciBycC4KKyAgIHRtcCBpcyBhIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciB3aGljaCBtYXkgYmUgdXNlZC4gKi8KK3sKKyAgQlNFVChyZWdzX21vZGlmaWVkLHJwLT5yMSk7CisgIEJTRVQocmVnc19tb2RpZmllZCxycC0+cjIpOworCisgIGlmIChvLT5mbGFncyAmIEtPTlNUKSB7CisgICAgLyogZXZhbHVhdGUgYW5kIGxvYWQgYSBjb25zdGFudCAqLworICAgIGV2YWxfY29uc3QoJm8tPnZhbCx0eXBlKTsKKworICAgIGlmIChJU0ZMT0FUKHR5cGUpKSB7CisgICAgICBpbnQgbGFiID0gYWRkZnBjb25zdChvLHR5cGUpOworICAgICAgaW50IHRtcCA9IGNnX2dldHJlZyhmLHApOworCisgICAgICBsb2FkX2RhdGFwdHIoZix0bXAsbGFiLE5VTEwpOworICAgICAgaWYgKHR5cGUgIT0gRkxPQVQpCisgICAgICAgIGxkc3Q2NChmLDAscnAsdG1wKTsKKyAgICAgIGVsc2UKKyAgICAgICAgaWVycm9yKDApOyAgLyogaGF2ZSB0byBsb2FkIGZsb2F0IGluIGEgc2luZ2xlIHJlZ2lzdGVyICovCisgICAgICBjZ19mcmVlcmVnKGYsdG1wKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzdHJ1Y3Qgb2JqIGNvYmo7CisKKyAgICAgIGNvYmouZmxhZ3MgPSBLT05TVDsKKyAgICAgIGNvYmoudmFsLnZ1bG9uZyA9IHp1bTJ6dWwoenVtYW5kKHZ1bWF4LHVsMnp1bSgweGZmZmZmZmZmKSkpOyAKKyAgICAgIGxvYWRfcmVnKGYscCxhcm1fbGVfbW9kZT9ycC0+cjE6cnAtPnIyLCZjb2JqLFVOU0lHTkVEfExPTkcpOworICAgICAgY29iai52YWwudnVsb25nID0genVtMnp1bCh6dW1hbmQoenVtcnNoaWZ0KHZ1bWF4LHVsMnp1bSgzMlVMKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bDJ6dW0oMHhmZmZmZmZmZikpKTsKKyAgICAgIGxvYWRfcmVnKGYscCxhcm1fbGVfbW9kZT9ycC0+cjI6cnAtPnIxLCZjb2JqLFVOU0lHTkVEfExPTkcpOworICAgIH0KKyAgfQorCisgIGVsc2UgeworICAgIC8qIG1ha2Ugc3VyZSB0aGF0IG9iamVjdCBjYW4gYmUgYWRkcmVzc2VkIHRocm91Z2ggYSByZWdpc3RlciAqLworICAgIGxvYWRfb2JqcHRyKGYscCxvKTsKKworICAgIGlmIChpc3JlZyhvLT5mbGFncykpIHsKKyAgICAgIHN0cnVjdCBycGFpciBxcnA7CisKKyAgICAgIGlmICghcmVnX3BhaXIoby0+cmVnLCZxcnApKQorICAgICAgICBpZXJyb3IoMCk7CisgICAgICBpZiAocXJwLnIxICE9IHJwLT5yMSkgeworICAgICAgICBlbWl0KGYsIlx0bW92XHQlcywlc1xuXHRtb3ZcdCVzLCVzXG4iLHJlZ25hbWVzW3JwLT5yMV0sCisgICAgICAgICAgICAgcmVnbmFtZXNbcXJwLnIxXSxyZWduYW1lc1tycC0+cjJdLHJlZ25hbWVzW3FycC5yMl0pOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgoby0+ZmxhZ3MgJiAoUkVHfERSRUZPQkopKSA9PSAoUkVHfERSRUZPQkopKSB7CisgICAgICBsZHN0NjQoZiwwLHJwLG8tPnJlZyk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGllcnJvcigwKTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIHN0b3JlX3JlZ3BhaXIoRklMRSAqZixzdHJ1Y3QgSUMgKnAsc3RydWN0IHJwYWlyICpycCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9iaiAqbyxpbnQgdHlwZSkKKy8qIEdlbmVyYXRlcyBjb2RlIHRvIHN0b3JlIHRoZSByZWdpc3RlciBwYWlyIHJwIGludG8gbWVtb3J5IG9iamVjdCBvLgorICAgdG1wIGlzIGEgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIHdoaWNoIG1heSBiZSB1c2VkLiAqLworeworICAvKiBtYWtlIHN1cmUgdGhhdCBvYmplY3QgY2FuIGJlIGFkZHJlc3NlZCB0aHJvdWdoIGEgcmVnaXN0ZXIgKi8KKyAgbG9hZF9vYmpwdHIoZixwLG8pOworCisgIGlmIChpc3JlZyhvLT5mbGFncykpIHsKKyAgICBzdHJ1Y3QgcnBhaXIgenJwOworCisgICAgaWYgKCFyZWdfcGFpcihvLT5yZWcsJnpycCkpCisgICAgICBpZXJyb3IoMCk7CisgICAgaWYgKHpycC5yMSAhPSBycC0+cjEpIHsKKyAgICAgIGVtaXQoZiwiXHRtb3ZcdCVzLCVzXG5cdG1vdlx0JXMsJXNcbiIscmVnbmFtZXNbenJwLnIxXSwKKyAgICAgICAgICAgcmVnbmFtZXNbcnAtPnIxXSxyZWduYW1lc1t6cnAucjJdLHJlZ25hbWVzW3JwLT5yMl0pOworICAgIH0KKyAgfQorICBlbHNlIGlmICgoby0+ZmxhZ3MgJiAoUkVHfERSRUZPQkopKSA9PSAoUkVHfERSRUZPQkopKSB7CisgICAgbGRzdDY0KGYsMSxycCxvLT5yZWcpOworICB9CisgIGVsc2UKKyAgICBpZXJyb3IoMCk7Cit9CisKKworc3RhdGljIGxvbmcgcG9mMih6dW1heCB4KQorLyogeWllbGRzIGxvZzIoeCkrMSBvciAwICovCit7CisgIHp1bWF4IHA7CisgIGludCBsbiA9IDE7CisKKyAgcCA9IHVsMnp1bSgxTCk7CisgIHdoaWxlIChsbjw9MzIgJiYgenVtbGVxKHAseCkpIHsKKyAgICBpZiAoenVtZXF0byh4LHApKQorICAgICAgICByZXR1cm4gbG47CisgICAgbG4rKzsKKyAgICBwID0genVtYWRkKHAscCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBJQyAqcHJlbG9hZChGSUxFICpmLHN0cnVjdCBJQyAqcCkKKy8qIERvZXMgc29tZSBwcmUtcHJvY2Vzc2luZyBsaWtlIGZldGNoaW5nIG9wZXJhbmRzIGZyb20gbWVtb3J5IHRvCisgICByZWdpc3RlcnMgZXRjLiAqLworLyogQEBAIEZJWE1FIC0gSXMgdGhpcyBmdW5jdGlvbiBuZWVkZWQgYXQgYWxsID8/PyAqLworeworI2lmIDAKKyAgaWYgKGlzcmVnKHAtPnExLmZsYWdzKSkKKyAgICBxMXJlZyA9IHAtPnExLnJlZzsKKyAgZWxzZQorICAgIHExcmVnID0gMDsKKworICBpZiAoaXNyZWcocC0+cTIuZmxhZ3MpKQorICAgIHEycmVnID0gcC0+cTIucmVnOworICBlbHNlCisgICAgcTJyZWcgPSAwOworI2VuZGlmCisKKyAgaWYgKGlzcmVnKHAtPnouZmxhZ3MpKSB7CisgICAgenJlZyA9IHAtPnoucmVnOworICB9CisgIGVsc2UgeworICAgIGlmIChJU0ZMT0FUKHp0eXAocCkpKQorICAgICAgenJlZyA9IEZJUlNUX1BBSVI7ICAvKiBAQEAgVkZQPyAtPmYxICovCisgICAgZWxzZQorICAgICAgenJlZyA9IGNnX2dldHJlZyhmLHApOworICB9CisgIAorI2lmIDAgIC8qIEJldHRlciB1c2UgbG9hZF9vYmpwdHIoKSB3aGVuIG5lZWRlZD8gKi8KKyAgaWYgKChwLT5xMS5mbGFncyAmIChSRUd8RFJFRk9CSikpID09IERSRUZPQkopIHsKKyAgICBpbnQgdG1wID0gY2dfZ2V0cmVnKGYscCk7CisKKyAgICBwLT5xMS5mbGFncyAmPSB+RFJFRk9CSjsKKyAgICBsb2FkX3JlZyhmLHAsdG1wLCZwLT5xMSxxMXR5cChwKSk7CisgICAgcC0+cTEucmVnID0gdG1wOworICAgIHAtPnExLmZsYWdzIHw9IFJFR3xEUkVGT0JKOworICB9CisKKyAgaWYgKChwLT5xMi5mbGFncyAmIChSRUd8RFJFRk9CSikpID09IERSRUZPQkopIHsKKyAgICBpbnQgdG1wID0gY2dfZ2V0cmVnKGYscCk7CisKKyAgICBwLT5xMi5mbGFncyAmPSB+RFJFRk9CSjsKKyAgICBsb2FkX3JlZyhmLHAsdG1wLCZwLT5xMixxMnR5cChwKSk7CisgICAgcC0+cTIucmVnID0gdG1wOworICAgIHAtPnEyLmZsYWdzIHw9IFJFR3xEUkVGT0JKOworICB9CisjZW5kaWYKKworICByZXR1cm4gcDsKK30KKworCitzdGF0aWMgdm9pZCBzYXZlX3Jlc3VsdChGSUxFICpmLHN0cnVjdCBJQyAqcCkKKy8qIHNhdmUgdGhlIHJlc3VsdCAoaW4genJlZykgaW50byBwLT56ICovCit7CisgIGlmICgocC0+ei5mbGFncyYoUkVHfERSRUZPQkopKSA9PSBEUkVGT0JKKSB7CisgICAgaW50IHRtcCA9IGNnX2dldHJlZyhmLHApOworCisgICAgcC0+ei5mbGFncyAmPSB+RFJFRk9CSjsKKyAgICBsb2FkX3JlZyhmLHAsdG1wLCZwLT56LFBPSU5URVIpOworICAgIHAtPnoucmVnID0gdG1wOworICAgIHAtPnouZmxhZ3MgfD0gUkVHfERSRUZPQko7CisgIH0KKyAgaWYgKGlzcmVnKHAtPnouZmxhZ3MpKSB7CisgICAgaWYgKHAtPnoucmVnICE9IHpyZWcpCisgICAgICBlbWl0KGYsIlx0bW92XHQlcywlc1xuIixyZWduYW1lc1twLT56LnJlZ10scmVnbmFtZXNbenJlZ10pOworICB9CisgIGVsc2UgeworICAgIHN0b3JlX3JlZyhmLHAsenJlZywmcC0+eix6dHlwKHApKTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkIHJlZ2lzdGVyaXplKEZJTEUgKmYsc3RydWN0IElDICpwLHN0cnVjdCBvYmogKm8saW50IHQpCisvKiBtYWtlIHN1cmUgb2JqZWN0IGlzIGxvYWRlZCBpbnRvIGEgcmVnaXN0ZXIgKi8KK3sKKyAgaWYgKCEoaXNyZWcoby0+ZmxhZ3MpKSkgeworICAgIGludCByOworCisgICAgciA9IGxvYWRfb2JqcHRyKGYscCxvKTsKKyAgICBpZiAoIXIpCisgICAgICByID0gY2dfZ2V0cmVnKGYscCk7CisgICAgaWYgKChvLT5mbGFncyAmIChSRUd8RFJFRk9CSikpID09IERSRUZPQkopCisgICAgICBpZXJyb3IoMCk7CisgICAgbG9hZF9yZWcoZixwLHIsbyx0KTsKKyAgICBvLT5yZWcgPSByOworICB9CisgIG8tPmZsYWdzID0gUkVHOworfQorCisKK3N0YXRpYyB2b2lkIGNnX21lbWNvcHkoRklMRSAqZixzdHJ1Y3QgSUMgKnApCisvKiBnZW5lcmF0ZXMgY29kZSB0byBjb3B5IGFuIG9iamVjdCBvZiBub24tZWxlbWVudGFyeSB0eXBlIChBUlJBWSwgU1RSVUNUKSAqLworeworICB1bnNpZ25lZCBsb25nIHNpemUgPSBvcHNpemUocCk7CisgIGludCBhMSA9IG9iamFsaWduKCZwLT5xMSk7CisgIGludCBhMiA9IChwLT5jb2RlPT1BU1NJR04pID8gb2JqYWxpZ24oJnAtPnopIDogMDsKKyAgaW50IGIgPSAxOworICBjaGFyICpsZCA9IGxkdChDSEFSKTsKKyAgY2hhciAqc3QgPSBzZHQoQ0hBUik7CisgIHVuc2lnbmVkIGxvbmcgbDsKKyAgaW50IHNyY3JlZyxkc3RyZWcsdG1wcmVnLGNudHJlZyxuY3A7CisKKyAgaWYgKHAtPnExLmZsYWdzICYgVkFSKSB7CisgICAgaWYgKHAtPnExLmZsYWdzICYgRFJFRk9CSikgeworICAgICAgaWYgKHAtPnExLnYtPnZ0eXAtPm5leHQgJiYKKyAgICAgICAgICB6bWVxdG8ocC0+cTIudmFsLnZtYXgsc3pvZihwLT5xMS52LT52dHlwLT5uZXh0KSkgJiYgKGExJjEpKSB7CisgICAgICAgIGExID0gem0ybChmYWxpZ24ocC0+cTEudi0+dnR5cC0+bmV4dCkpICYgMzsKKyAgICAgICAgYTIgJj0gYTE7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKHptZXF0byhwLT5xMi52YWwudm1heCxzem9mKHAtPnExLnYtPnZ0eXApKSAmJiAoYTEmMSkpIHsKKyAgICAgICAgYTEgPSB6bTJsKGZhbGlnbihwLT5xMS52LT52dHlwKSkgJiAzOworICAgICAgICBhMiAmPSBhMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKHAtPnouZmxhZ3MgJiBWQVIpIHsKKyAgICBpZiAocC0+ei5mbGFncyAmIERSRUZPQkopIHsKKyAgICAgIGlmIChwLT56LnYtPnZ0eXAtPm5leHQgJiYKKyAgICAgICAgICB6bWVxdG8ocC0+cTIudmFsLnZtYXgsc3pvZihwLT56LnYtPnZ0eXAtPm5leHQpKSAmJiAoYTImMSkpIHsKKyAgICAgICAgYTIgPSB6bTJsKGZhbGlnbihwLT56LnYtPnZ0eXAtPm5leHQpKSAmIDM7CisgICAgICAgIGExICY9IGEyOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGlmICh6bWVxdG8ocC0+cTIudmFsLnZtYXgsc3pvZihwLT56LnYtPnZ0eXApKSAmJiAoYTImMSkpIHsKKyAgICAgICAgYTIgPSB6bTJsKGZhbGlnbihwLT56LnYtPnZ0eXApKSAmIDM7CisgICAgICAgIGExICY9IGEyOworICAgICAgfQorICAgIH0KKyAgfSAKKworICAvKiBAQEAgaW1wbGVtZW50IHdpdGggbGRtaWEvc3RtaWEgKi8KKyAgaWYgKGExPj0wICYmIGEyPj0wKSB7CisgICAgaWYgKGExPT0wICYmIGEyPT0wKSB7CisgICAgICAvKiAzMi1iaXQgY29weSAqLworICAgICAgYiA9IDQ7CisgICAgICBsZCA9IGxkdChMT05HKTsKKyAgICAgIHN0ID0gc2R0KExPTkcpOworICAgIH0KKyAgICBlbHNlIGlmICgoYTEmMSk9PTAgJiYgKGEyJjEpPT0wICYmIGFhPj1BQTQpIHsKKyAgICAgIC8qIDE2LWJpdCBjb3B5IGZvciBBUk0tYXJjaGl0ZWN0dXJlIDQgYW5kIGJldHRlciBvbmx5ICovCisgICAgICBiID0gMjsKKyAgICAgIGxkID0gbGR0KFNIT1JUKTsKKyAgICAgIHN0ID0gc2R0KFNIT1JUKTsKKyAgICB9CisgIH0KKworICBzcmNyZWcgPSBjZ19nZXRyZWcoZixwKTsKKyAgQlNFVChyZWdzX21vZGlmaWVkLHNyY3JlZyk7CisKKyAgaWYgKHAtPnExLmZsYWdzICYgRFJFRk9CSikgeworICAgIHAtPnExLmZsYWdzICY9IH5EUkVGT0JKOworICAgIGlmIChpc3JlZyhwLT5xMS5mbGFncykpCisgICAgICBlbWl0KGYsIlx0bW92XHQlcywlc1xuIixyZWduYW1lc1tzcmNyZWddLHJlZ25hbWVzW3AtPnExLnJlZ10pOworICAgIGVsc2UKKyAgICAgIGxvYWRfcmVnKGYscCxzcmNyZWcsJnAtPnExLFBPSU5URVIpOworICAgIHAtPnExLmZsYWdzIHw9IERSRUZPQko7CisgIH0KKyAgZWxzZSB7CisgICAgbG9hZF9hZGRyZXNzKGYsc3JjcmVnLCZwLT5xMSxQT0lOVEVSKTsKKyAgfQorCisgIGRzdHJlZyA9IGNnX2dldHJlZyhmLHApOworICBCU0VUKHJlZ3NfbW9kaWZpZWQsZHN0cmVnKTsKKworICBpZiAocC0+ei5mbGFncyAmIERSRUZPQkopIHsKKyAgICBwLT56LmZsYWdzICY9IH5EUkVGT0JKOworICAgIGlmIChpc3JlZyhwLT56LmZsYWdzKSkKKyAgICAgIGVtaXQoZiwiXHRtb3ZcdCVzLCVzXG4iLHJlZ25hbWVzW2RzdHJlZ10scmVnbmFtZXNbcC0+ei5yZWddKTsKKyAgICBlbHNlCisgICAgICBsb2FkX3JlZyhmLHAsZHN0cmVnLCZwLT56LFBPSU5URVIpOworICAgIHAtPnouZmxhZ3MgfD0gRFJFRk9CSjsKKyAgfQorICBlbHNlIHsKKyAgICBpZiAocC0+Y29kZSA9PSBQVVNIKSB7CisgICAgICBlbWl0KGYsIlx0YWRkXHQlcywlcywjJWxkXG4iLHJlZ25hbWVzW2RzdHJlZ10scmVnbmFtZXNbc3BdLHB1c2hvZmZzKTsKKyAgICAgIHB1c2hvZmZzICs9IHNpemU7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGxvYWRfYWRkcmVzcyhmLGRzdHJlZywmcC0+eixQT0lOVEVSKTsKKyAgfQorCisgIHRtcHJlZyA9IGNnX2dldHJlZyhmLHApOworICBCU0VUKHJlZ3NfbW9kaWZpZWQsdG1wcmVnKTsKKyAgbCA9IHNpemUvYjsKKworICBpZiAobCA+IE1BWENPUFlJTlNUUykgeyAvKiBAQEAgbWFrZSBNQVhDT1BZSU5TVFMgY2hhbmdlYWJsZSBieSBhbiBvcHRpb24/ICovCisgICAgY250cmVnID0gY2dfZ2V0cmVnKGYscCk7CisgICAgQlNFVChyZWdzX21vZGlmaWVkLGNudHJlZyk7CisgICAgZW1pdChmLCJcdG1vdlx0JXMsIyVsdVxuIixyZWduYW1lc1tjbnRyZWddLGwpOworICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LCsrbGFiZWwpOworICAgIG5jcCA9IDE7CisgIH0KKyAgZWxzZQorICAgIG5jcCA9IGw7CisgIHdoaWxlIChuY3AtLSkgeworICAgIGVtaXQoZiwiXHQlc1x0JXMsWyVzXSwjJWRcbiIsbGQscmVnbmFtZXNbdG1wcmVnXSxyZWduYW1lc1tzcmNyZWddLGIpOworICAgIGVtaXQoZiwiXHQlc1x0JXMsWyVzXSwjJWRcbiIsc3QscmVnbmFtZXNbdG1wcmVnXSxyZWduYW1lc1tkc3RyZWddLGIpOworICB9CisgIGlmIChsID4gTUFYQ09QWUlOU1RTKSB7CisgICAgZW1pdChmLCJcdHN1YnNcdCVzLCVzLCMxXG4iLHJlZ25hbWVzW2NudHJlZ10scmVnbmFtZXNbY250cmVnXSk7CisgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsbGFiZWwpOworICAgIGNnX2ZyZWVyZWcoZixjbnRyZWcpOworICB9CisKKyAgc2l6ZSA9IHNpemUgJSBiOworICBuY3AgPSAwOworICBpZiAoc2l6ZSAmIDIpIHsKKyAgICBpZiAoYWEgPj0gQUE0KSB7CisgICAgICBlbWl0KGYsIlx0JXNcdCVzLFslc10sIyVkXG4iLGxkdChTSE9SVCkscmVnbmFtZXNbdG1wcmVnXSxyZWduYW1lc1tzcmNyZWddLGIpOworICAgICAgZW1pdChmLCJcdCVzXHQlcyxbJXNdLCMlZFxuIixzZHQoU0hPUlQpLHJlZ25hbWVzW3RtcHJlZ10scmVnbmFtZXNbZHN0cmVnXSxiKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgbmNwID0gMjsKKyAgfQorICBuY3AgKz0gKHNpemUgJiAxKTsKKyAgd2hpbGUgKG5jcC0tKSB7CisgICAgZW1pdChmLCJcdCVzXHQlcyxbJXNdLCMlZFxuIixsZHQoQ0hBUikscmVnbmFtZXNbdG1wcmVnXSxyZWduYW1lc1tzcmNyZWddLGIpOworICAgIGVtaXQoZiwiXHQlc1x0JXMsWyVzXSwjJWRcbiIsc2R0KENIQVIpLHJlZ25hbWVzW3RtcHJlZ10scmVnbmFtZXNbZHN0cmVnXSxiKTsKKyAgfQorfQorCisKK3N0YXRpYyBpbnQgZXhpc3RzX2ZyZWVyZWcoc3RydWN0IElDICpwLGludCByZWcpCisvKiAgVGVzdCBpZiB0aGVyZSBpcyBhIHNlcXVlbmNlIG9mIEZSRUVSRUdzIGNvbnRhaW5pbmcgRlJFRVJFRyByZWcuCisgICAgVXNlZCBieSBwZWVwaG9sZSgpLiAqLworeworICB3aGlsZSAocCAmJiAocC0+Y29kZT09RlJFRVJFRyB8fCBwLT5jb2RlPT1BTExPQ1JFRykpIHsKKyAgICBpZiAocC0+Y29kZT09RlJFRVJFRyAmJiBwLT5xMS5yZWc9PXJlZykKKyAgICAgIHJldHVybiAxOworICAgIHA9cC0+bmV4dDsKKyAgfQorICByZXR1cm4gMDsKK30KKworCisjaWYgMAorc3RhdGljIHZvaWQgcGVlcGhvbGUoc3RydWN0IElDICpwKQorLyogc2VhcmNoIGZvciBwb3NzaWJsZSBhZGRyZXNzaW5nLW1vZGVzICovCit7CisgIGludCBjLGMyLHI7c3RydWN0IElDICpwMjtzdHJ1Y3QgQWRkcmVzc2luZ01vZGUgKmFtOworCisgIGZvcig7cDtwPXAtPm5leHQpeworICAgIGM9cC0+Y29kZTsKKyAgICBpZihjIT1GUkVFUkVHJiZjIT1BTExPQ1JFRyYmKGMhPVNFVFJFVFVSTnx8IWlzcmVnKHAtPnExLmZsYWdzKXx8cC0+cTEucmVnIT1wLT56LnJlZykpIGV4aXRfbGFiZWw9MDsKKyAgICBpZihjPT1MQUJFTCkgZXhpdF9sYWJlbD1wLT50eXBmOworCisgICAgLyogVHJ5IGNvbnN0KHJlZykgKi8KKyAgICBpZihJTU1fSU5EJiYoYz09QURESTJQfHxjPT1TVUJJRlApJiZpc3JlZyhwLT56LmZsYWdzKSYmaXNjb25zdChwLT5xMi5mbGFncykpeworICAgICAgaW50IGJhc2U7em1heCBvZjtzdHJ1Y3Qgb2JqICpvOworICAgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHAtPnR5cGYpOworICAgICAgaWYoYz09U1VCSUZQKSBvZj16bXN1YihsMnptKDBMKSx2bWF4KTsgZWxzZSBvZj12bWF4OworICAgICAgaWYoMS8qem1sZXEobDJ6bSgtMzI3NjhMKSx2bWF4KSYmem1sZXEodm1heCxsMnptKDMyNzY3TCkpKi8peworICAgICAgICByPXAtPnoucmVnOworICAgICAgICBpZihpc3JlZyhwLT5xMS5mbGFncykpIGJhc2U9cC0+cTEucmVnOyBlbHNlIGJhc2U9cjsKKyAgICAgICAgbz0wOworICAgICAgICBmb3IocDI9cC0+bmV4dDtwMjtwMj1wMi0+bmV4dCl7CisgICAgICAgICAgYzI9cDItPmNvZGU7CisgICAgICAgICAgaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKKyAgICAgICAgICBpZihjMiE9RlJFRVJFRyYmaXNyZWcocDItPnExLmZsYWdzKSYmcDItPnExLnJlZz09cikgYnJlYWs7CisgICAgICAgICAgaWYoYzIhPUZSRUVSRUcmJmlzcmVnKHAyLT5xMi5mbGFncykmJnAyLT5xMi5yZWc9PXIpIGJyZWFrOworICAgICAgICAgIGlmKGMyIT1DQUxMJiYoYzI8TEFCRUx8fGMyPkJSQSkvKiYmYzIhPUFERFJFU1MqLyl7CisgICAgICAgICAgICBpZighcDItPnExLmFtJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTEucmVnPT1yKXsKKyAgICAgICAgICAgICAgaWYobykgYnJlYWs7CisgICAgICAgICAgICAgIG89JnAyLT5xMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCFwMi0+cTIuYW0mJihwMi0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT5xMi5yZWc9PXIpeworICAgICAgICAgICAgICBpZihvKSBicmVhazsKKyAgICAgICAgICAgICAgbz0mcDItPnEyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIXAyLT56LmFtJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT56LnJlZz09cil7CisgICAgICAgICAgICAgIGlmKG8pIGJyZWFrOworICAgICAgICAgICAgICBvPSZwMi0+ejsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYoYzI9PUZSRUVSRUd8fGlzcmVnKHAyLT56LmZsYWdzKSl7CisgICAgICAgICAgICBpbnQgbTsKKyAgICAgICAgICAgIGlmKGMyPT1GUkVFUkVHKQorICAgICAgICAgICAgICBtPXAyLT5xMS5yZWc7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIG09cDItPnoucmVnOworICAgICAgICAgICAgaWYobT09cil7CisgICAgICAgICAgICAgIGlmKG8peworICAgICAgICAgICAgICAgIG8tPmFtPWFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKKyAgICAgICAgICAgICAgICBhbS0+ZmxhZ3M9SU1NX0lORDsKKyAgICAgICAgICAgICAgICBhbS0+YmFzZT1iYXNlOworICAgICAgICAgICAgICAgIGFtLT5vZmZzZXQ9em0ybChvZik7CisgICAgICAgICAgICAgICAgaWYoaXNyZWcocC0+cTEuZmxhZ3MpKXsKKyAgICAgICAgICAgICAgICAgIHAtPmNvZGU9Yz1OT1A7cC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgcC0+Y29kZT1jPUFTU0lHTjtwLT5xMi5mbGFncz0wOworICAgICAgICAgICAgICAgICAgcC0+dHlwZj1wLT50eXBmMjtwLT5xMi52YWwudm1heD1zaXpldGFiW3AtPnR5cGYyJk5RXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihjMiE9RlJFRVJFRyYmbT09YmFzZSkgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgLyogVHJ5IHJlZyxyZWcgKi8KKyAgICBpZihHUFJfSU5EJiZjPT1BRERJMlAmJmlzcmVnKHAtPnEyLmZsYWdzKSYmaXNyZWcocC0+ei5mbGFncykmJihpc3JlZyhwLT5xMS5mbGFncyl8fHAtPnEyLnJlZyE9cC0+ei5yZWcpKXsKKyAgICAgIGludCBiYXNlLGlkeDtzdHJ1Y3Qgb2JqICpvOworICAgICAgcj1wLT56LnJlZztpZHg9cC0+cTIucmVnOworICAgICAgaWYoaXNyZWcocC0+cTEuZmxhZ3MpKSBiYXNlPXAtPnExLnJlZzsgZWxzZSBiYXNlPXI7CisgICAgICBvPTA7CisgICAgICBmb3IocDI9cC0+bmV4dDtwMjtwMj1wMi0+bmV4dCl7CisgICAgICAgIGMyPXAyLT5jb2RlOworICAgICAgICBpZihjMj09Q0FMTHx8YzI9PUxBQkVMfHwoYzI+PUJFUSYmYzI8PUJSQSkpIGJyZWFrOworICAgICAgICBpZihjMiE9RlJFRVJFRyYmaXNyZWcocDItPnExLmZsYWdzKSYmcDItPnExLnJlZz09cikgYnJlYWs7CisgICAgICAgIGlmKGMyIT1GUkVFUkVHJiZpc3JlZyhwMi0+cTIuZmxhZ3MpJiZwMi0+cTIucmVnPT1yKSBicmVhazsKKyAgICAgICAgaWYoaXNyZWcocDItPnouZmxhZ3MpJiZwMi0+ei5yZWc9PWlkeCYmaWR4IT1yKSBicmVhazsKKyAgICAgICAgCisgICAgICAgIGlmKGMyIT1DQUxMJiYoYzI8TEFCRUx8fGMyPkJSQSkvKiYmYzIhPUFERFJFU1MqLyl7CisgICAgICAgICAgaWYoIXAyLT5xMS5hbSYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnExLnJlZz09cil7CisgICAgICAgICAgICBpZihvfHwocTF0eXAocDIpJk5RKT09TExPTkcpIGJyZWFrOworICAgICAgICAgICAgbz0mcDItPnExOworICAgICAgICAgIH0KKyAgICAgICAgICBpZighcDItPnEyLmFtJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTIucmVnPT1yKXsKKyAgICAgICAgICAgIGlmKG98fChxMnR5cChwMikmTlEpPT1MTE9ORykgYnJlYWs7CisgICAgICAgICAgICBvPSZwMi0+cTI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKCFwMi0+ei5hbSYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+ei5yZWc9PXIpeworICAgICAgICAgICAgaWYob3x8KHp0eXAocDIpJk5RKT09TExPTkcpIGJyZWFrOworICAgICAgICAgICAgbz0mcDItPno7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKGMyPT1GUkVFUkVHfHxpc3JlZyhwMi0+ei5mbGFncykpeworICAgICAgICAgIGludCBtOworICAgICAgICAgIGlmKGMyPT1GUkVFUkVHKQorICAgICAgICAgICAgbT1wMi0+cTEucmVnOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG09cDItPnoucmVnOworICAgICAgICAgIGlmKG09PXIpeworICAgICAgICAgICAgaWYobyl7CisgICAgICAgICAgICAgIG8tPmFtPWFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKKyAgICAgICAgICAgICAgYW0tPmZsYWdzPUdQUl9JTkQ7CisgICAgICAgICAgICAgIGFtLT5iYXNlPWJhc2U7CisgICAgICAgICAgICAgIGFtLT5vZmZzZXQ9aWR4OworICAgICAgICAgICAgICBpZihpc3JlZyhwLT5xMS5mbGFncykpeworICAgICAgICAgICAgICAgIHAtPmNvZGU9Yz1OT1A7cC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBwLT5jb2RlPWM9QVNTSUdOO3AtPnEyLmZsYWdzPTA7CisgICAgICAgICAgICAgICAgcC0+dHlwZj1wLT50eXBmMjtwLT5xMi52YWwudm1heD1zaXpldGFiW3AtPnR5cGYyJk5RXTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKGMyIT1GUkVFUkVHJiZtPT1iYXNlKSBicmVhazsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorI2VuZGlmCisKKworc3RhdGljIHZvaWQgZnVuY3Rpb25fdG9wKEZJTEUgKmYsc3RydWN0IFZhciAqdixsb25nIG9mZnNldCkKKy8qIGdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gZW50cnkgY29kZSAqLworeworICBzdGF0aWMgY2hhciByZXRfaW5zdHJbNjRdOworICBjaGFyIGdwcnNhdmVbMzJdOworICBjaGFyICpwOworICBpbnQgaTsKKworICB0aXRsZShmKTsKKworICAvKiBkZXRlcm1pbmUgcnNhdmVzaXplIGFuZCByZWdpc3RlcnMgdG8gc2F2ZSAqLworICByc2F2ZXNpemUgPSAwOworICBncHJzYXZlWzBdID0gJ1wwJzsKKyAgZm9yIChpPUZJUlNUX0dQUixwPWdwcnNhdmU7IGk8PUxBU1RfR1BSOyBpKyspIHsKKyAgICBpZiAoIXJlZ3NhW2ldICYmICFyZWdzY3JhdGNoW2ldICYmIHJlZ3VzZWRbaV0pIHsKKyAgICAgIHAgKz0gc3ByaW50ZihwLCIlcywiLHJlZ25hbWVzW2ldKTsKKyAgICAgIHJzYXZlc2l6ZSArPSA0OworICAgIH0KKyAgfQorCisgIGlmICghc3BlY2lhbF9zZWN0aW9uKGYsdikgJiYgc2VjdGlvbiE9Q09ERSkgeworICAgIGVtaXQoZixjb2RlbmFtZSk7CisgICAgc2VjdGlvbiA9IENPREU7CisgIH0gCisKKyAgaWYgKGlzZXh0ZXJuKHYtPnN0b3JhZ2VfY2xhc3MpKSB7CisgICAgaWYgKCh2LT5mbGFncyAmIChJTkxJTkVGVU5DfElOTElORUVYVCkpICE9IElOTElORUZVTkMpCisgICAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXMlc1xuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICBlbWl0KGYsIiVzJXM6XG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICB9CisgIGVsc2UKKyAgICBlbWl0KGYsIiVzJWxkOlxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKworICBpZiAocnNhdmVzaXplPT0wICYmICFuZWVkZnJhbWUpIHsKKyAgICByZXQgPSAiXHRtb3ZcdHBjLGxyXG4iOworICB9CisgIGVsc2UgeworICAgIHJzYXZlc2l6ZSArPSAzKjQ7ICAvKiBzcCxscixwYyB0byBiZSBzYXZlZCBhcyB3ZWxsICovCisgICAgZW1pdChmLCJcdHN0bWZkXHQlcyEseyVzJXMsJXMsJXN9XG4iLAorICAgICAgICAgcmVnbmFtZXNbc3BdLGdwcnNhdmUscmVnbmFtZXNbc3BdLHJlZ25hbWVzW2xyXSxyZWduYW1lc1twY10pOworICAgIHNwcmludGYocmV0X2luc3RyLCJcdGxkbWZkXHQlcyx7JXMlcywlc31cbiIsCisgICAgICAgICAgICByZWduYW1lc1tzcF0sZ3Byc2F2ZSxyZWduYW1lc1tzcF0scmVnbmFtZXNbcGNdKTsKKyAgICByZXQgPSByZXRfaW5zdHI7CisgICAgaWYgKGxvY2Fsc2l6ZSthcmdzaXplID4gMCkgeworICAgICAgZW1pdChmLCJcdHN1Ylx0JXMsJXMsIyVsZFxuIiwKKyAgICAgICAgICAgcmVnbmFtZXNbc3BdLHJlZ25hbWVzW3NwXSxsb2NhbHNpemUrYXJnc2l6ZSk7CisgICAgfQorICB9Cit9CisKKworc3RhdGljIHZvaWQgZnVuY3Rpb25fYm90dG9tKEZJTEUgKmYsc3RydWN0IFZhciAqdixsb25nIG9mZnNldCkKKy8qIGdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gZXhpdCBjb2RlICovCit7CisgIGlmIChsb2NhbHNpemUrYXJnc2l6ZSA+IDApIHsKKyAgICBlbWl0KGYsIlx0YWRkXHQlcywlcywjJWxkXG4iLAorICAgICAgICAgcmVnbmFtZXNbc3BdLHJlZ25hbWVzW3NwXSxsb2NhbHNpemUrYXJnc2l6ZSk7CisgIH0KKyAgZW1pdChmLHJldCk7CisgIGVtaXRfZGF0YXB0cl9hcnJheShmKTsKKworICBpZiAoaXNleHRlcm4odi0+c3RvcmFnZV9jbGFzcykpIHsKKyAgICBlbWl0KGYsIlx0LnR5cGVcdCVzJXMsQGZ1bmN0aW9uXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgIGVtaXQoZiwiXHQuc2l6ZVx0JXMlcywuLSVzJXNcblxuIiwKKyAgICAgICAgIGlkcHJlZml4LHYtPmlkZW50aWZpZXIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgIH0KKyAgZWxzZSB7CisgICAgZW1pdChmLCJcdC50eXBlXHQlcyVsZCxAZnVuY3Rpb25cbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgZW1pdChmLCJcdC5zaXplXHQlcyVsZCwuLSVzJWxkXG5cbiIsCisgICAgICAgICBsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICB9ICAgIAorCisgIC8qaWYoYWxsX3JlZ3MmJnYtPmZpKSB2LT5maS0+ZmxhZ3N8PUFMTF9SRUdTOyovCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgRW5kIG9mIHByaXZhdGUgZGF0YSBhbmQgZnVuY3Rpb25zLiAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ludCBpbml0X2NnKHZvaWQpCisvKiAgRG9lcyBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb25zIGZvciB0aGUgY29kZS1nZW5lcmF0b3IuIEdldHMgY2FsbGVkICAqLworLyogIG9uY2UgYXQgdGhlIGJlZ2lubmluZyBhbmQgc2hvdWxkIHJldHVybiAwIGluIGNhc2Ugb2YgcHJvYmxlbXMuICAgICAgKi8KK3sKKyAgaW50IGk7CisKKyAgLyogIEluaXRpYWxpemUgc29tZSB2YWx1ZXMgd2hpY2ggY2Fubm90IGJlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgICAqLworICAvKiAgYmVjYXVzZSB0aGV5IGFyZSBzdG9yZWQgaW4gdGhlIHRhcmdldCdzIGFyaXRobWV0aWMuICAgICAgICAgICAgICovCisgIG1heGFsaWduID0gbDJ6bSg4TCk7CisgIHN0YWNrYWxpZ24gPSBsMnptKDRMKTsKKyAgY2hhcl9iaXQgPSBsMnptKDhMKTsKKworICBmb3IgKGk9MDsgaTw9TUFYX1RZUEU7IGkrKykgeworICAgIHNpemV0YWJbaV0gPSBsMnptKG1zaXpldGFiW2ldKTsKKyAgICBhbGlnbltpXSA9IGwyem0obWFsaWduW2ldKTsKKyAgfQorCisgIGZvciAoaT1GSVJTVF9HUFI7IGk8PUxBU1RfR1BSOyBpKyspIHsKKyAgICByZWdzaXplW2ldID0gbDJ6bSg0TCk7CisgICAgcmVndHlwZVtpXSA9ICZsdHlwOworICB9CisKKyAgZm9yIChpPUZJUlNUX0ZQUjsgaTw9TEFTVF9GUFI7IGkrKykgeworICAgIHJlZ3NpemVbaV0gPSBsMnptKDhMKTsKKyAgICByZWd0eXBlW2ldID0gJmZ0eXA7CisgIH0KKworICBmb3IgKGk9RklSU1RfQ0NSOyBpPD1MQVNUX0NDUjsgaSsrKSB7CisgICAgcmVnc2l6ZVtpXSA9IGwyem0oNEwpOworICAgIHJlZ3R5cGVbaV0gPSAmbHR5cDsKKyAgfQorCisgIGZvciAoaT1GSVJTVF9QQUlSOyBpPEZJUlNUX0RPVUJMRTsgaSsrKSB7CisgICAgcmVnc2l6ZVtpXSA9IGwyem0oOEwpOworICAgIHJlZ3R5cGVbaV0gPSAmbGx0eXA7CisgIH0KKworICBmb3IgKGk9RklSU1RfRE9VQkxFOyBpPD1MQVNUX1BBSVI7IGkrKykgeworICAgIHJlZ3NpemVbaV0gPSBsMnptKDhMKTsKKyAgICByZWd0eXBlW2ldID0gJmR0eXA7CisgIH0KKworICAvKiAgSW5pdGlhbGl6ZSB0aGUgbWluL21heC1zZXR0aW5ncy4gTm90ZSB0aGF0IHRoZSB0eXBlcyBvZiB0aGUgICAgICovCisgIC8qICBob3N0IHN5c3RlbSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIHRhcmdldCBzeXN0ZW0gYW5kIHlvdSBtYXkgKi8KKyAgLyogIG9ubHkgdXNlIHRoZSBzbWFsbGVzdCBtYXhpbXVtIHZhbHVlcyBBTlNJIGd1YXJhbnRlZXMgaWYgeW91ICAgICAqLworICAvKiAgd2FudCB0byBiZSBwb3J0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBUaGF0J3MgdGhlIHJlYXNvbiBmb3IgdGhlIHN1YnRyYWN0aW9uIGluIHRfbWluW0lOVF0uIExvbmcgY291bGQgKi8KKyAgLyogIGJlIHVuYWJsZSB0byByZXByZXNlbnQgLTIxNDc0ODM2NDggb24gdGhlIGhvc3Qgc3lzdGVtLiAgICAgICAgICAqLworICB0X21pbltDSEFSXSA9IGwyem0oLTEyOEwpOworICB0X21pbltTSE9SVF0gPSBsMnptKC0zMjc2OEwpOworICB0X21pbltJTlRdID0gem1zdWIobDJ6bSgtMjE0NzQ4MzY0N0wpLGwyem0oMUwpKTsKKyAgdF9taW5bTE9OR10gPSB0X21pbihJTlQpOworICB0X21pbltMTE9OR10gPSB6bWxzaGlmdChsMnptKDFMKSxsMnptKDYzTCkpOworICB0X21pbltNQVhJTlRdID0gdF9taW4oTExPTkcpOworICB0X21heFtDSEFSXSA9IHVsMnp1bSgxMjdMKTsKKyAgdF9tYXhbU0hPUlRdID0gdWwyenVtKDMyNzY3VUwpOworICB0X21heFtJTlRdID0gdWwyenVtKDIxNDc0ODM2NDdVTCk7CisgIHRfbWF4W0xPTkddID0gdF9tYXgoSU5UKTsKKyAgdF9tYXhbTExPTkddID0genVtcnNoaWZ0KHp1bWtvbXBsKHVsMnp1bSgwVUwpKSx1bDJ6dW0oMVVMKSk7CisgIHRfbWF4W01BWElOVF0gPSB0X21heChMTE9ORyk7CisgIHR1X21heFtDSEFSXSA9IHVsMnp1bSgyNTVVTCk7CisgIHR1X21heFtTSE9SVF0gPSB1bDJ6dW0oNjU1MzVVTCk7CisgIHR1X21heFtJTlRdID0gdWwyenVtKDQyOTQ5NjcyOTVVTCk7CisgIHR1X21heFtMT05HXSA9IHRfbWF4KFVOU0lHTkVEfElOVCk7CisgIHR1X21heFtMTE9OR10gPSB6dW1rb21wbCh1bDJ6dW0oMFVMKSk7CisgIHR1X21heFtNQVhJTlRdID0gdF9tYXgoVU5TSUdORUR8TExPTkcpOworCisgIC8qICBSZXNlcnZlIGEgZmV3IHJlZ2lzdGVycyBmb3IgdXNlIGJ5IHRoZSBjb2RlLWdlbmVyYXRvci4gICAgICAqLworICByZWdzYVtpcF0gPSByZWdzYVtzcF0gPSByZWdzYVtscl0gPSByZWdzYVtwY10gPSAxOworICByZWdzY3JhdGNoW2lwXSA9IHJlZ3NjcmF0Y2hbc3BdID0gcmVnc2NyYXRjaFtscl0gPSByZWdzY3JhdGNoW3BjXSA9IDA7CisKKyAgaWYgKExFX01PREUpCisgICAgYXJtX2xlX21vZGUgPSAxOworICBpZiAoQkVfTU9ERSkKKyAgICBhcm1fbGVfbW9kZSA9IDA7CisgIGlmIChBUk1fREVGQVVMVCkKKyAgICB0aHVtYl9kZWZhdWx0ID0gMDsKKyAgaWYgKFRIVU1CX0RFRkFVTFQpCisgICAgdGh1bWJfZGVmYXVsdCA9IDE7CisgIGlmIChFTEZfTEFCRUxTKSB7CisgICAgbGFicHJlZml4ID0gIi5sIjsKKyAgICBpZHByZWZpeCA9ICIiOworICB9CisKKyAgdGFyZ2V0X21hY3JvcyA9IG1hcnJheTsKKworCisgIC8qIFRPRE86IHNldCBhcmd1bWVudCByZWdpc3RlcnMgKi8KKyAgZGVjbGFyZV9idWlsdGluKCJfX211bGludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2FkZGludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3N1YmludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2FuZGludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX29yaW50NjQiLExMT05HLExMT05HLDAsTExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZW9yaW50NjQiLExMT05HLExMT05HLDAsTExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbmVnaW50NjQiLExMT05HLExMT05HLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19sc2xpbnQ2NCIsTExPTkcsTExPTkcsMCxJTlQsMCwxLDApOworCisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZzaW50NjQiLExMT05HLExMT05HLDAsTExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2dWludDY0IixVTlNJR05FRHxMTE9ORyxVTlNJR05FRHxMTE9ORywwLFVOU0lHTkVEfExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZHNpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19tb2R1aW50NjQiLFVOU0lHTkVEfExMT05HLFVOU0lHTkVEfExMT05HLDAsVU5TSUdORUR8TExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbHNyc2ludDY0IixMTE9ORyxMTE9ORywwLElOVCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19sc3J1aW50NjQiLFVOU0lHTkVEfExMT05HLFVOU0lHTkVEfExMT05HLDAsSU5ULDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2NtcHNpbnQ2NCIsSU5ULExMT05HLDAsTExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fY21wdWludDY0IixJTlQsVU5TSUdORUR8TExPTkcsMCxVTlNJR05FRHxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19zaW50NjR0b2ZsdDMyIixGTE9BVCxMTE9ORywwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fdWludDY0dG9mbHQzMiIsRkxPQVQsVU5TSUdORUR8TExPTkcsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3NpbnQ2NHRvZmx0NjQiLERPVUJMRSxMTE9ORywwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fdWludDY0dG9mbHQ2NCIsRE9VQkxFLFVOU0lHTkVEfExMT05HLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvc2ludDY0IixMTE9ORyxGTE9BVCwwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0MzJ0b3VpbnQ2NCIsVU5TSUdORUR8TExPTkcsRkxPQVQsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDY0dG9zaW50NjQiLExMT05HLERPVUJMRSwwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b3VpbnQ2NCIsVU5TSUdORUR8TExPTkcsRE9VQkxFLDAsMCwwLDEsMCk7CisKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDMydG9mbHQ2NCIsRE9VQkxFLEZMT0FULDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQ2NHRvZmx0MzIiLEZMT0FULERPVUJMRSwwLDAsMCwxLDApOworCisKKyAgZGVjbGFyZV9idWlsdGluKCJfX2FkZGZsdDMyIixGTE9BVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3N1YmZsdDMyIixGTE9BVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX211bGZsdDMyIixGTE9BVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2RpdmZsdDMyIixGTE9BVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX25lZ2ZsdDMyIixGTE9BVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2NtcGZsdDMyIixJTlQsRkxPQVQsMCxGTE9BVCwwLDEsMCk7CisKKyAgZGVjbGFyZV9idWlsdGluKCJfX2FkZGZsdDY0IixET1VCTEUsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3N1YmZsdDY0IixET1VCTEUsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX211bGZsdDY0IixET1VCTEUsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2RpdmZsdDY0IixET1VCTEUsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX25lZ2ZsdDY0IixET1VCTEUsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2NtcGZsdDY0IixJTlQsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKworCisgIHJldHVybiAxOworfQorCisKK3ZvaWQgaW5pdF9kYihGSUxFICpmKQoreworfQorCisKK2ludCBmcmV0dXJuKHN0cnVjdCBUeXAgKnQpCisvKiAgUmV0dXJucyB0aGUgcmVnaXN0ZXIgaW4gd2hpY2ggdmFyaWFibGVzIG9mIHR5cGUgdCBhcmUgcmV0dXJuZWQuICovCisvKiAgSWYgdGhlIHZhbHVlIGNhbm5vdCBiZSByZXR1cm5lZCBpbiBhIHJlZ2lzdGVyIHJldHVybnMgMC4gICAgICAgICovCisvKiAgQSBwb2ludGVyIE1VU1QgYmUgcmV0dXJuZWQgaW4gYSByZWdpc3Rlci4gVGhlIGNvZGUtZ2VuZXJhdG9yICAgICovCisvKiAgaGFzIHRvIHNpbXVsYXRlIGEgcHNldWRvIHJlZ2lzdGVyIGlmIG5lY2Vzc2FyeS4gICAgICAgICAgICAgICAgICovCit7CisgIGludCB0dSA9IHQtPmZsYWdzJk5ROworCisgIC8qIEBAQCBoYW5kbGUgVkZQICovCisKKyAgaWYgKHR1PT1MTE9ORyB8fCB0dT09RE9VQkxFKQorICAgIHJldHVybiBGSVJTVF9QQUlSOworCisgIGlmICh6bWxlcShzem9mKHQpLGwyem0oNEwpKSkKKyAgICByZXR1cm4gRklSU1RfR1BSOworCisgIHJldHVybiAwOworfQorCisKK2ludCByZWdfcGFpcihpbnQgcixzdHJ1Y3QgcnBhaXIgKnApCisvKiBSZXR1cm5zIDAgaWYgdGhlIHJlZ2lzdGVyIGlzIG5vIHJlZ2lzdGVyIHBhaXIuIElmIHIgICovCisvKiBpcyBhIHJlZ2lzdGVyIHBhaXIgbm9uLXplcm8gd2lsbCBiZSByZXR1cm5lZCBhbmQgdGhlICovCisvKiBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBwIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHR3byAgICovCisvKiBlbGVtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGlmIChyPEZJUlNUX1BBSVIgfHwgcj5MQVNUX1BBSVIpCisgICAgcmV0dXJuIDA7CisKKyAgc3dpdGNoIChyKSB7CisgICAgY2FzZSBGSVJTVF9QQUlSOgorICAgICAgcC0+cjEgPSBGSVJTVF9HUFI7CisgICAgICBwLT5yMiA9IEZJUlNUX0dQUisxOworICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBGSVJTVF9QQUlSKzE6CisgICAgICBwLT5yMSA9IEZJUlNUX0dQUisyOworICAgICAgcC0+cjIgPSBGSVJTVF9HUFIrMzsKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgRklSU1RfUEFJUisyOgorICAgICAgcC0+cjEgPSBGSVJTVF9HUFIrNDsKKyAgICAgIHAtPnIyID0gRklSU1RfR1BSKzU7CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIEZJUlNUX1BBSVIrMzoKKyAgICAgIHAtPnIxID0gRklSU1RfR1BSKzY7CisgICAgICBwLT5yMiA9IEZJUlNUX0dQUis3OworICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBGSVJTVF9QQUlSKzQ6CisgICAgICBwLT5yMSA9IEZJUlNUX0dQUisxMDsKKyAgICAgIHAtPnIyID0gRklSU1RfR1BSKzExOworICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBGSVJTVF9ET1VCTEU6CisgICAgICBwLT5yMSA9IEZJUlNUX0ZQUjsKKyAgICAgIHAtPnIyID0gRklSU1RfRlBSKzE7CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIEZJUlNUX0RPVUJMRSsxOgorICAgICAgcC0+cjEgPSBGSVJTVF9GUFIrMjsKKyAgICAgIHAtPnIyID0gRklSU1RfRlBSKzM7CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIEZJUlNUX0RPVUJMRSsyOgorICAgICAgcC0+cjEgPSBGSVJTVF9GUFIrNDsKKyAgICAgIHAtPnIyID0gRklSU1RfRlBSKzU7CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIEZJUlNUX0RPVUJMRSszOgorICAgICAgcC0+cjEgPSBGSVJTVF9GUFIrNjsKKyAgICAgIHAtPnIyID0gRklSU1RfRlBSKzc7CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIEZJUlNUX0RPVUJMRSs0OgorICAgICAgcC0+cjEgPSBGSVJTVF9GUFIrODsKKyAgICAgIHAtPnIyID0gRklSU1RfRlBSKzk7CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIEZJUlNUX0RPVUJMRSs1OgorICAgICAgcC0+cjEgPSBGSVJTVF9GUFIrMTA7CisgICAgICBwLT5yMiA9IEZJUlNUX0ZQUisxMTsKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgRklSU1RfRE9VQkxFKzY6CisgICAgICBwLT5yMSA9IEZJUlNUX0ZQUisxMjsKKyAgICAgIHAtPnIyID0gRklSU1RfRlBSKzEzOworICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBGSVJTVF9ET1VCTEUrNzoKKyAgICAgIHAtPnIxID0gRklSU1RfRlBSKzE0OworICAgICAgcC0+cjIgPSBGSVJTVF9GUFIrMTU7CisgICAgICByZXR1cm4gMTsKKyAgICBkZWZhdWx0OgorICAgICAgaWVycm9yKDApOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKworaW50IGNvc3Rfc2F2aW5ncyhzdHJ1Y3QgSUMgKnAsaW50IHIsc3RydWN0IG9iaiAqbykKKy8qIGVzdGltYXRlIHRoZSBjb3N0LXNhdmluZyBpZiBvYmplY3QgbyBmcm9tIElDIHAgaXMgcGxhY2VkIGluICovCisvKiByZWdpc3RlciByICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgYyA9IHAtPmNvZGU7CisKKyAgLyogQEBAIEZJWE1FICovCisgIGlmIChvLT5mbGFncyAmIFZLT05TVCkgeworICAgIGlmIChvPT0mcC0+cTEgJiYgcC0+Y29kZT09QVNTSUdOICYmIChwLT56LmZsYWdzJkRSRUZPQkopKQorICAgICAgcmV0dXJuIDQ7CisgICAgZWxzZQorICAgICAgcmV0dXJuIDI7CisgIH0KKyAgaWYgKG8tPmZsYWdzICYgRFJFRk9CSikKKyAgICByZXR1cm4gNDsKKyAgaWYgKGM9PVNFVFJFVFVSTiAmJiByPT1wLT56LnJlZyAmJiAhKG8tPmZsYWdzJkRSRUZPQkopKQorICAgIHJldHVybiAzOworICBpZiAoYz09R0VUUkVUVVJOICYmIHI9PXAtPnExLnJlZyAmJiAhKG8tPmZsYWdzJkRSRUZPQkopKQorICAgIHJldHVybiAzOworICByZXR1cm4gMjsKK30KKworCitpbnQgcmVnb2soaW50IHIsaW50IHQsaW50IG1vZGUpCisvKiAgUmV0dXJucyAwIGlmIHJlZ2lzdGVyIHIgY2Fubm90IHN0b3JlIHZhcmlhYmxlcyBvZiAgICovCisvKiAgdHlwZSB0LiBJZiB0PT1QT0lOVEVSIGFuZCBtb2RlIT0wIHRoZW4gaXQgcmV0dXJucyAgICovCisvKiAgbm9uLXplcm8gb25seSBpZiB0aGUgcmVnaXN0ZXIgY2FuIHN0b3JlIGEgcG9pbnRlciAgICovCisvKiAgYW5kIGRlcmVmZXJlbmNlIGEgcG9pbnRlciB0byBtb2RlLiAgICAgICAgICAgICAgICAgICovCit7CisgIGlmIChyPT0wKQorICAgIHJldHVybiAwOworCisgIGlmICh0PT0wICYmIHI+PUZJUlNUX0NDUiAmJiByPD1MQVNUX0NDUikKKyAgICByZXR1cm4gMTsKKworICB0ICY9IE5ROworCisgIGlmIChJU0ZMT0FUKHQpKSB7CisgICAgLyogQEBAIGhhbmRsZSBWRlAgKi8KKyAgICBpZiAodD09RkxPQVQgJiYgcj49RklSU1RfR1BSICYmIHI8PUxBU1RfR1BSKQorICAgICAgcmV0dXJuIDE7CisgICAgZWxzZSBpZiAocj49RklSU1RfUEFJUiAmJiByPD1MQVNUX1BBSVIpCisgICAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlIGlmICh0PT1QT0lOVEVSICYmIHI+PUZJUlNUX0dQUiAmJiByPD1MQVNUX0dQUikKKyAgICByZXR1cm4gMTsKKyAgZWxzZSBpZiAodD49Q0hBUiAmJiB0PD1MT05HICYmIHI+PUZJUlNUX0dQUiAmJiByPD1MQVNUX0dQUikKKyAgICByZXR1cm4gMTsKKyAgZWxzZSBpZiAodD09TExPTkcgJiYgcj49RklSU1RfUEFJUiAmJiByPD1MQVNUX1BBSVIpCisgICAgcmV0dXJuIDE7CisKKyAgcmV0dXJuIDA7Cit9CisKKworaW50IGRhbmdlcm91c19JQyhzdHJ1Y3QgSUMgKnApCisvKiAgUmV0dXJucyB6ZXJvIGlmIHRoZSBJQyBwIGNhbiBiZSBzYWZlbHkgZXhlY3V0ZWQgICAgICovCisvKiAgd2l0aG91dCBkYW5nZXIgb2YgZXhjZXB0aW9ucyBvciBzaW1pbGFyIHRoaW5ncy4gICAgICovCisvKiAgdmJjYyBtYXkgZ2VuZXJhdGUgY29kZSBpbiB3aGljaCBub24tZGFuZ2Vyb3VzIElDcyAgICovCisvKiAgYXJlIHNvbWV0aW1lcyBleGVjdXRlZCBhbHRob3VnaCBjb250cm9sLWZsb3cgbWF5ICAgICovCisvKiAgbmV2ZXIgcmVhY2ggdGhlbSAobWFpbmx5IHdoZW4gbW92aW5nIGNvbXB1dGF0aW9ucyAgICovCisvKiAgb3V0IG9mIGxvb3BzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVHlwaWNhbCBJQ3MgdGhhdCBnZW5lcmF0ZSBleGNlcHRpb25zIG9uIHNvbWUgICAgICAgICovCisvKiAgbWFjaGluZXMgYXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gYWNjZXNzZXMgdmlhIHBvaW50ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gZGl2aXNpb24vbW9kdWxvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gb3ZlcmZsb3cgb24gc2lnbmVkIGludGVnZXIvZmxvYXRzICAgICAgICAgICAgICovCit7CisgIGlmICgocC0+cTEuZmxhZ3MmRFJFRk9CSikgfHwgKHAtPnEyLmZsYWdzJkRSRUZPQkopIHx8IChwLT56LmZsYWdzJkRSRUZPQkopKQorICAgIHJldHVybiAxOworICAvKiBBUk0gaGFzIG5vIGRpdmlzaW9uL21vZHVsbyBpbnN0cnVjdGlvbnMgKi8KKyAgcmV0dXJuIDA7Cit9CisKKworaW50IG11c3RfY29udmVydChpbnQgbyxpbnQgdCxpbnQgY29uc3RfZXhwcikKKy8qICBSZXR1cm5zIHplcm8gaWYgY29kZSBmb3IgY29udmVydGluZyBucCB0byB0eXBlIHQgICAgKi8KKy8qICBjYW4gYmUgb21pdHRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBPbiB0aGUgUG93ZXJQQyBjcHUgcG9pbnRlcnMgYW5kIDMyYml0ICAgICAgICAgICAgICAgKi8KKy8qICBpbnRlZ2VycyBoYXZlIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uIGFuZCBjYW4gdXNlICAgKi8KKy8qICB0aGUgc2FtZSByZWdpc3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IG9wID0gbyAmIE5ROworICBpbnQgdHAgPSB0ICYgTlE7CisKKyAgaWYgKChvcD09SU5UfHxvcD09TE9OR3x8b3A9PVBPSU5URVIpICYmICh0cD09SU5UfHx0cD09TE9OR3x8dHA9PVBPSU5URVIpKQorICAgIHJldHVybiAwOworICBpZiAob3A9PURPVUJMRSAmJiB0cD09TERPVUJMRSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKG9wPT1MRE9VQkxFICYmIHRwPT1ET1VCTEUpCisgICAgcmV0dXJuIDA7CisgIGlmKG9wPT10cCkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKKworY2hhciAqdXNlX2xpYmNhbGwoaW50IGMsaW50IHQsaW50IHQyKQorLyogUmV0dXJuIG5hbWUgb2YgbGlicmFyeSBmdW5jdGlvbiwgaWYgdGhpcyBub2RlIHNob3VsZCBiZQorICAgaW1wbGVtZW50ZWQgdmlhIGxpYmNhbGwuICovCit7CisgIHN0YXRpYyBjaGFyIGZuYW1lWzE2XTsKKyAgY2hhciAqcmV0ID0gTlVMTDsKKworICBpZiAoKChjPT1NVUxUICYmIGFhPEFBMikgfHwKKyAgICAgICAoYz5NVUxUICYmIGM8PU1PRCkpICYmICh0Jk5RKSA8PSBMT05HKSB7CisgICAgaWYgKCh0JlVOU0lHTkVEKSAmJiAoYz09RElWIHx8IGM9PU1PRCkpCisgICAgICBzcHJpbnRmKGZuYW1lLCJfXyVzIixlbmFtZVtjXSk7CisgICAgZWxzZQorICAgICAgc3ByaW50ZihmbmFtZSwiX18lc3MiLGVuYW1lW2NdKTsKKyAgICByZXQgPSBmbmFtZTsKKyAgfQorCisgIGlmKGM9PUNPTVBBUkUpeworICAgIGlmKCh0Jk5RKT09TExPTkd8fElTRkxPQVQodCkpeworICAgICAgc3ByaW50ZihmbmFtZSwiX19jbXAlcyVzJWxkIiwodCZVTlNJR05FRCk/InUiOiJzIixJU0ZMT0FUKHQpPyJmbHQiOiJpbnQiLHptMmwoc2l6ZXRhYlt0Jk5RXSkqOCk7CisgICAgICByZXQ9Zm5hbWU7CisgICAgfQorICB9ZWxzZXsKKyAgICB0Jj1OVTsKKyAgICB0MiY9TlU7CisgICAgaWYodD09TERPVUJMRSkgdD1ET1VCTEU7CisgICAgaWYodDI9PUxET1VCTEUpIHQyPURPVUJMRTsKKyAgICBpZihjPT1DT05WRVJUKXsKKyAgICAgIGlmKHQ9PXQyKSByZXR1cm4gMDsKKyAgICAgIGlmKHQ9PUZMT0FUJiZ0Mj09RE9VQkxFKSByZXR1cm4gIl9fZmx0NjR0b2ZsdDMyIjsKKyAgICAgIGlmKHQ9PURPVUJMRSYmdDI9PUZMT0FUKSByZXR1cm4gIl9fZmx0MzJ0b2ZsdDY0IjsKKworICAgICAgaWYoSVNGTE9BVCh0KSl7CisgICAgICAgIHNwcmludGYoZm5hbWUsIl9fJWNpbnQlbGR0b2ZsdCVkIiwodDImVU5TSUdORUQpPyd1Jzoncycsem0ybChzaXpldGFiW3QyJk5RXSkqOCwodD09RkxPQVQpPzMyOjY0KTsKKyAgICAgICAgcmV0PWZuYW1lOworICAgICAgfQorICAgICAgaWYoSVNGTE9BVCh0MikmJih0Jk5VKT09TExPTkcpeworICAgICAgICBzcHJpbnRmKGZuYW1lLCJfX2ZsdCVkdG8lY2ludCVsZCIsKCh0MiZOVSk9PUZMT0FUKT8zMjo2NCwodCZVTlNJR05FRCk/J3UnOidzJyx6bTJsKHNpemV0YWJbdCZOUV0pKjgpOworICAgICAgICByZXQ9Zm5hbWU7CisgICAgICB9CisgICAgfQorICAgIGlmKCh0Jk5RKT09TExPTkd8fElTRkxPQVQodCkpeworICAgICAgaWYoKGM+PUxTSElGVCYmYzw9TU9EKXx8KGM+PU9SJiZjPD1BTkQpfHxjPT1LT01QTEVNRU5UfHxjPT1NSU5VUyl7CisJaWYodD09KFVOU0lHTkVEfExMT05HKSYmKGM9PURJVnx8Yz09TU9EfHxjPT1SU0hJRlQpKXsKKwkgIHNwcmludGYoZm5hbWUsIl9fJXN1aW50NjQiLGVuYW1lW2NdKTsKKwkgIHJldD1mbmFtZTsKKwl9ZWxzZSBpZigodCZOUSk9PUxMT05HKXsKKyAgICAgICAgICBzcHJpbnRmKGZuYW1lLCJfXyVzaW50NjQiLGVuYW1lW2NdKTsKKyAgICAgICAgICByZXQ9Zm5hbWU7CisgICAgICAgIH1lbHNleworCSAgc3ByaW50ZihmbmFtZSwiX18lcyVzJXMlbGQiLGVuYW1lW2NdLCh0JlVOU0lHTkVEKT8idSI6IiIsSVNGTE9BVCh0KT8iZmx0IjoiaW50Iix6bTJsKHNpemV0YWJbdCZOUV0pKjgpOworICAgICAgICAgIHJldD1mbmFtZTsKKwl9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworCit2b2lkIGdlbl9kcyhGSUxFICpmLHptYXggc2l6ZSxzdHJ1Y3QgVHlwICp0KQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSA8c2l6ZT4gYnl0ZXMgb2Ygc3RvcmFnZSAqLworLyogIGluaXRpYWxpemVkIHdpdGggemVyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICB0aXRsZShmKTsKKworICBpZiAobmV3b2JqICYmIHNlY3Rpb24hPVNQRUNJQUwpCisgICAgZW1pdChmLCIlbGRcbiIsem0ybChzaXplKSk7CisgIGVsc2UKKyAgICBlbWl0KGYsIlx0LnNwYWNlXHQlbGRcbiIsem0ybChzaXplKSk7CisKKyAgbmV3b2JqID0gMDsKK30KKworCit2b2lkIGdlbl9hbGlnbihGSUxFICpmLHptYXggYWxpZ24pCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gbWFrZSBzdXJlIHRoZSBuZXh0IGRhdGEgaXMgICAgICovCisvKiAgYWxpZ25lZCB0byBtdWx0aXBsZXMgb2YgPGFsaWduPiBieXRlcy4gICAgICAgICAgICAgICovCit7CisgIHRpdGxlKGYpOworCisgIGlmICh6bTJsKGFsaWduKSA+IDEpCisgICAgZW1pdChmLCJcdC5hbGlnblx0MlxuIik7Cit9CisKKwordm9pZCBnZW5fdmFyX2hlYWQoRklMRSAqZixzdHJ1Y3QgVmFyICp2KQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSB0aGUgaGVhZCBvZiBhIHZhcmlhYmxlICAqLworLyogIGRlZmluaXRpb24sIGkuZS4gdGhlIGxhYmVsIGFuZCBpbmZvcm1hdGlvbiBmb3IgICAgICAqLworLyogIGxpbmthZ2UgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgY29uc3RmbGFnOworICBjaGFyICpzZWM7CisKKyAgdGl0bGUoZik7CisKKyAgaWYodi0+Y2xpc3QpCisgICAgY29uc3RmbGFnID0gaXNfY29uc3Qodi0+dnR5cCk7CisKKyAgaWYgKGlzc3RhdGljKHYtPnN0b3JhZ2VfY2xhc3MpKSB7CisgICAgaWYgKElTRlVOQyh2LT52dHlwLT5mbGFncykpCisgICAgICByZXR1cm47CisgICAgaWYgKCFzcGVjaWFsX3NlY3Rpb24oZix2KSkgeworICAgICAgaWYgKHYtPmNsaXN0ICYmICghY29uc3RmbGFnIHx8IENPTlNUX0lOX0RBVEEpICYmIHNlY3Rpb24hPURBVEEpIHsKKyAgICAgICAgZW1pdChmLGRhdGFuYW1lKTsKKyAgICAgICAgaWYgKGYpCisgICAgICAgICAgc2VjdGlvbiA9IERBVEE7CisgICAgICB9CisgICAgICBpZiAodi0+Y2xpc3QgJiYgY29uc3RmbGFnICYmICFDT05TVF9JTl9EQVRBICYmIHNlY3Rpb24hPVJPREFUQSkgeworICAgICAgICBlbWl0KGYscm9kYXRhbmFtZSk7CisgICAgICAgIGlmIChmKQorICAgICAgICAgIHNlY3Rpb24gPSBST0RBVEE7CisgICAgICB9CisgICAgICBpZiAoIXYtPmNsaXN0ICYmIHNlY3Rpb24hPUJTUykgeworICAgICAgICBlbWl0KGYsYnNzbmFtZSk7CisgICAgICAgIGlmIChmKQorICAgICAgICAgIHNlY3Rpb24gPSBCU1M7CisgICAgICB9CisgICAgfQorICAgIGlmICh2LT5jbGlzdCB8fCBzZWN0aW9uPT1TUEVDSUFMKSB7CisgICAgICBnZW5fYWxpZ24oZixmYWxpZ24odi0+dnR5cCkpOworICAgICAgZW1pdChmLCIlcyVsZDpcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGVtaXQoZiwiXHQubGNvbW1cdCVzJWxkLCIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgbmV3b2JqID0gMTsKKyAgfQorCisgIGlmIChpc2V4dGVybih2LT5zdG9yYWdlX2NsYXNzKSkgeworICAgIGVtaXQoZiwiXHQuZ2xvYmxcdCVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgaWYgKHYtPmZsYWdzICYgKERFRklORUR8VEVOVEFUSVZFKSkgeworICAgICAgaWYgKCFzcGVjaWFsX3NlY3Rpb24oZix2KSkgeworICAgICAgICBpZiAodi0+Y2xpc3QgJiYgKCFjb25zdGZsYWcgfHwgQ09OU1RfSU5fREFUQSkgJiYgc2VjdGlvbiE9REFUQSkgeworICAgICAgICAgIGVtaXQoZixkYXRhbmFtZSk7CisgICAgICAgICAgaWYoZikKKyAgICAgICAgICAgIHNlY3Rpb24gPSBEQVRBOworICAgICAgICB9CisgICAgICAgIGlmICh2LT5jbGlzdCAmJiBjb25zdGZsYWcgJiYgIUNPTlNUX0lOX0RBVEEgJiYgc2VjdGlvbiE9Uk9EQVRBKSB7CisgICAgICAgICAgZW1pdChmLHJvZGF0YW5hbWUpOworICAgICAgICAgIGlmIChmKQorICAgICAgICAgICAgc2VjdGlvbiA9IFJPREFUQTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXYtPmNsaXN0ICYmIHNlY3Rpb24hPUJTUykgeworICAgICAgICAgIGVtaXQoZixic3NuYW1lKTsKKyAgICAgICAgICBpZiAoZikKKyAgICAgICAgICAgIHNlY3Rpb24gPSBCU1M7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICh2LT5jbGlzdCB8fCBzZWN0aW9uPT1TUEVDSUFMKSB7CisgICAgICAgIGdlbl9hbGlnbihmLGZhbGlnbih2LT52dHlwKSk7CisgICAgICAgIGVtaXQoZiwiJXMlczpcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgZW1pdChmLCJcdC5nbG9iYWxcdCVzJXNcblx0LiVzY29tbVx0JXMlcywiLGlkcHJlZml4LAorICAgICAgICAgICAgIHYtPmlkZW50aWZpZXIsKFVTRV9DT01NT05TPyIiOiJsIiksaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgICB9CisgICAgICBuZXdvYmogPSAxOworICAgIH0KKyAgfQorfQorCisKK3ZvaWQgZ2VuX2RjKEZJTEUgKmYsaW50IHQsc3RydWN0IGNvbnN0X2xpc3QgKnApCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIHN0YXRpYyBzdG9yYWdlICAgICAgICAgICovCisvKiAgaW5pdGlhbGl6ZWQgd2l0aCBjb25zdC1saXN0IHAuICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIHRpdGxlKGYpOworCisgIGlmICgodCZOUSkgPT0gUE9JTlRFUikKKyAgICB0ID0gVU5TSUdORUR8TE9ORzsKKyAgZW1pdChmLCJcdC4lc1x0IixkY3RbdCZOUV0pOworCisgIGlmICghcC0+dHJlZSkgeworICAgIGlmIChJU0ZMT0FUKHQpKSB7CisgICAgICB1bnNpZ25lZCBjaGFyICppcCA9ICh1bnNpZ25lZCBjaGFyICopJnAtPnZhbC52ZG91YmxlOworCisgICAgICBlbWl0KGYsIjB4JTAyeCUwMnglMDJ4JTAyeCIsaXBbMF0saXBbMV0saXBbMl0saXBbM10pOworICAgICAgaWYgKCh0Jk5RKSAhPSBGTE9BVCkKKyAgICAgICAgZW1pdChmLCIsMHglMDJ4JTAyeCUwMnglMDJ4IixpcFs0XSxpcFs1XSxpcFs2XSxpcFs3XSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZW1pdHZhbChmLCZwLT52YWwsdCZOVSk7CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGVtaXRfb2JqKGYsJnAtPnRyZWUtPm8sdCZOVSk7CisgIH0KKworICBlbWl0bmwoZik7CisgIG5ld29iaiA9IDA7Cit9CisKKworLyogIFRoZSBtYWluIGNvZGUtZ2VuZXJhdGlvbiByb3V0aW5lLiAgICAgICAgICAgICAgICAgICAqLworLyogIGYgaXMgdGhlIHN0cmVhbSB0aGUgY29kZSBzaG91bGQgYmUgd3JpdHRlbiB0by4gICAgICAqLworLyogIHAgaXMgYSBwb2ludGVyIHRvIGEgZG91Ymx5IGxpbmtlZCBsaXN0IG9mIElDcyAgICAgICAqLworLyogIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIGJvZHkgdG8gZ2VuZXJhdGUgY29kZSBmb3IuICAqLworLyogIHYgaXMgYSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAqLworLyogIG9mZnNldCBpcyB0aGUgc2l6ZSBvZiB0aGUgc3RhY2tmcmFtZSB0aGUgZnVuY3Rpb24gICAqLworLyogIG5lZWRzIGZvciBsb2NhbCB2YXJpYWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCit2b2lkIGdlbl9jb2RlKEZJTEUgKmYsc3RydWN0IElDICpwLHN0cnVjdCBWYXIgKnYsem1heCBvZmZzZXQpCisvKiAgVGhlIG1haW4gY29kZS1nZW5lcmF0aW9uIHJvdXRpbmUuICAgICAgICAgICAgICAgICAgICovCit7CisgIEZJTEUgKm91dGZpbGUgPSBmOworICBzdHJ1Y3QgSUMgKnBfc3RhcnQgPSBwOworICBpbnQgYyx0LGkscGFzczsKKyAgc3RydWN0IHJwYWlyIHJwOworCisgIGlmIChERUJVRyAmIDEpCisgICAgcHJpbnRmKCJnZW5fY29kZSgpXG4iKTsKKworICBjdXJyZW50X2Z1bmN0aW9uID0gdjsKKyAgaWNudCA9IDA7CisgIGRyZWZwdHJfYXJyYXlfbGFiZWwgPSAwOworICBhcmdzaXplID0gMDsKKyAgcnNhdmVzaXplID0gMDsKKyAgbWF4cnNhdmVvZmZzID0gMDsKKyAgbmVlZGZyYW1lID0gMDsKKworICBmb3IgKGM9MTsgYzw9TUFYUjsgYysrKQorICAgIHJlZ3NbY10gPSByZWdzYVtjXTsKKworICBmb3IgKHA9cF9zdGFydDsgcDsgcD1wLT5uZXh0KSB7CisgICAgYyA9IHAtPmNvZGU7CisgICAgdCA9IHAtPnR5cGYgJiBOVTsKKworICAgIGlmIChjID09IEFMTE9DUkVHKSB7CisgICAgICBpZiAocmVnX3BhaXIocC0+cTEucmVnLCZycCkpIHsKKyAgICAgICAgcmVnc1tycC5yMV0gPSAxOworICAgICAgICByZWdzW3JwLnIyXSA9IDE7CisgICAgICB9CisgICAgICByZWdzW3AtPnExLnJlZ10gPSAxOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKGMgPT0gRlJFRVJFRykgeworICAgICAgaWYgKHJlZ19wYWlyKHAtPnExLnJlZywmcnApKSB7CisgICAgICAgIHJlZ3NbcnAucjFdID0gMDsKKyAgICAgICAgcmVnc1tycC5yMl0gPSAwOworICAgICAgfQorICAgICAgcmVnc1twLT5xMS5yZWddID0gMDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIHRyeSBNVUxUL0RJVi9NT0Qgd2l0aCBwb3dlcnMgb2YgdHdvICovCisgICAgaWYgKChjPT1NVUxUIHx8ICgoYz09RElWIHx8IGM9PU1PRCkgJiYgKHQmVU5TSUdORUQpKSkgJiYKKyAgICAgICAgKHQmTlEpPD1MT05HICYmIGlzY29uc3QocC0+cTIuZmxhZ3MpKSB7CisgICAgICBldmFsX2NvbnN0KCZwLT5xMi52YWwsdCk7CisgICAgICBpZiAoaSA9IHBvZjIodm1heCkpIHsKKyAgICAgICAgaWYgKGMgPT0gTU9EKSB7CisgICAgICAgICAgdm1heCA9IHptc3ViKHZtYXgsbDJ6bSgxTCkpOworICAgICAgICAgIHAtPmNvZGUgPSBBTkQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgdm1heCA9IGwyem0oaS0xKTsKKyAgICAgICAgICBwLT5jb2RlID0gYz09RElWID8gUlNISUZUIDogTFNISUZUOworICAgICAgICB9CisgICAgICAgIGMgPSBwLT5jb2RlOworICAgICAgICBndmFsLnZtYXggPSB2bWF4OworICAgICAgICBldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CisgICAgICAgIGlmIChjID09IEFORCkgeworICAgICAgICAgIGluc2VydF9jb25zdCgmcC0+cTIudmFsLHQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGluc2VydF9jb25zdCgmcC0+cTIudmFsLElOVCk7CisgICAgICAgICAgcC0+dHlwZjIgPSBJTlQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYyA9PSBDQUxMKSB7CisgICAgICBuZWVkZnJhbWUgPSAxOworICAgICAgaWYgKGFyZ3NpemUgPCB6bTJsKHB1c2hlZGFyZ3NpemUocCkpKQorICAgICAgICBhcmdzaXplID0gem0ybChwdXNoZWRhcmdzaXplKHApKTsgIC8qIHNldCBtYXggYXJnc2l6ZSAqLworICAgIH0KKyAgfQorCisgIC8qcGVlcGhvbGUocCk7IEBAQCBGSVhNRSAqLworCisgIGZvciAoYz1pOyBpPD1NQVhSOyBpKyspIHsKKyAgICBpZiAocmVnc2FbaV0gfHwgcmVndXNlZFtpXSkKKyAgICAgIEJTRVQocmVnc19tb2RpZmllZCxpKTsKKyAgICBpZiAoIXJlZ3NhW2ldICYmICFyZWdzY3JhdGNoW2ldICYmIHJlZ3VzZWRbaV0pCisgICAgICBuZWVkZnJhbWUgPSAxOworICB9CisKKyAgLyogZGV0ZXJtaW5lIHdvcmQtYWxpZ25lZCBzcGFjZSBmb3IgbG9jYWwgdmFyaWFibGVzICovCisgIGxvY2Fsc2l6ZSA9ICgoem0ybChvZmZzZXQpICsgMykgLyA0KSAqIDQ7CisgIGlmIChsb2NhbHNpemUgPiAwKQorICAgIG5lZWRmcmFtZSA9IDE7CisKKyAgZm9yIChwYXNzPTAsZj1OVUxMOyBwYXNzPDI7IHBhc3MrKyxmPW91dGZpbGUpIHsKKyAgICBzdHJ1Y3QgSUMgbXlfaWM7CisgICAgc3RydWN0IElDICpwMjsKKworICAgIGlmIChwYXNzKSB7CisgICAgICBlbWl0X2RhdGFwdHJfYXJyYXkoTlVMTCk7ICAvKiByZXNldCBwdHItYXJyYXkgKi8KKyAgICAgIGljbnQgPSAwOworICAgICAgZnVuY3Rpb25fdG9wKGYsdixhcmdzaXplK2xvY2Fsc2l6ZSk7CisgICAgfQorCisgICAgcHVzaG9mZnMgPSAwOworCisgICAgZm9yIChwMj1wX3N0YXJ0OyBwMjsgcDI9cDItPm5leHQpIHsKKyAgICAgIGlmIChwYXNzKSB7CisgICAgICAgIHAgPSBwMjsKKyAgICAgIH0KKyAgICAgIGVsc2UgeyAgLyogd29yayBvbiBhIGNvcHkgaW4gZmlyc3QgcGFzcyAqLworICAgICAgICBwID0gJm15X2ljOworICAgICAgICAqcCA9ICpwMjsKKyAgICAgIH0KKworICAgICAgYyA9IHAtPmNvZGU7CisgICAgICB0ID0gcC0+dHlwZjsKKworICAgICAgY2dfZnJlZWFsbChmKTsgIC8qIHJlc2V0IGludGVybmFsIHJlZ2lzdGVyIGFsbG9jYXRpb25zICovCisKKyAgICAgIGlmIChpY250ID4gTUFYQ09ERUxJTkVTKSB7CisgICAgICAgIC8qIGZ1bmN0aW9uIGhhcyBncm93biB0b28gYmlnLCBlbWl0IGFsbCBkYXRhLXJlZmVyZW5jZSBwb2ludGVycyBmaXJzdCAqLworICAgICAgICBlbWl0KGYsIlx0Ylx0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisgICAgICAgIGVtaXRfZGF0YXB0cl9hcnJheShmKTsKKyAgICAgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwpOworICAgICAgICBpY250ID0gMDsKKyAgICAgIH0KKworICAgICAgaWYgKGMgPT0gTk9QKSB7CisgICAgICAgIHAtPnouZmxhZ3MgPSAwOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGMgPT0gQUxMT0NSRUcpIHsKKyAgICAgICAgaWYgKHJlZ19wYWlyKHAtPnExLnJlZywmcnApKSB7CisgICAgICAgICAgcmVnc1tycC5yMV0gPSAxOworICAgICAgICAgIHJlZ3NbcnAucjJdID0gMTsKKyAgICAgICAgfQorICAgICAgICByZWdzW3AtPnExLnJlZ10gPSAxOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGMgPT0gRlJFRVJFRykgeworICAgICAgICBpZiAocmVnX3BhaXIocC0+cTEucmVnLCZycCkpIHsKKyAgICAgICAgICByZWdzW3JwLnIxXSA9IDA7CisgICAgICAgICAgcmVnc1tycC5yMl0gPSAwOworICAgICAgICB9CisgICAgICAgIHJlZ3NbcC0+cTEucmVnXSA9IDA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoYyA9PSBMQUJFTCkgeworICAgICAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCx0KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChjID09IEJSQSkgeworICAgICAgICBpZiAodD09ZXhpdF9sYWJlbCAmJiBmcmFtZXNpemU9PTApCisgICAgICAgICAgZW1pdChmLHJldCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBlbWl0KGYsIlx0Ylx0JXMlZFxuIixsYWJwcmVmaXgsdCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoYz49QkVRICYmIGM8QlJBKSB7CisgICAgICAgIGVtaXQoZiwiXHRiJXNcdCIsY2NzW2MtQkVRXSk7CisgICAgICAgIGlmIChpc3JlZyhwLT5xMS5mbGFncykpIHsKKyAgICAgICAgICBpZXJyb3IoMCk7ICAvKiBAQEAgd2FzIGlzdCBkYXM/ICovCisgICAgICAgICAgZW1pdF9vYmooZiwmcC0+cTEsMCk7CisgICAgICAgICAgZW1pdChmLCIsIik7CisgICAgICAgIH0KKyAgICAgICAgZW1pdChmLCIlcyVkXG4iLGxhYnByZWZpeCx0KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChjID09IE1PVkVUT1JFRykgeworICAgICAgICBpZiAocC0+ei5yZWc+PUZJUlNUX0dQUiAmJiBwLT56LnJlZzw9TEFTVF9HUFIpIHsKKyAgICAgICAgICBsb2FkX3JlZyhmLHAscC0+ei5yZWcsJnAtPnExLHQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHJlZ19wYWlyKHAtPnoucmVnLCZycCkpIHsKKyAgICAgICAgICBCU0VUKHJlZ3NfbW9kaWZpZWQscC0+ei5yZWcpOworICAgICAgICAgIGxvYWRfcmVncGFpcihmLHAsJnJwLCZwLT5xMSx0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgaWVycm9yKDApOyAgLyogQEBAIFZGUCByZWdpc3RlcnMgKi8KKyAgICAgICAgcC0+ei5mbGFncyA9IDA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoYyA9PSBNT1ZFRlJPTVJFRykgeworICAgICAgICBpZiAocC0+cTEucmVnPj1GSVJTVF9HUFIgJiYgcC0+cTEucmVnPD1MQVNUX0dQUikgeworICAgICAgICAgIHN0b3JlX3JlZyhmLHAscC0+cTEucmVnLCZwLT56LHQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHJlZ19wYWlyKHAtPnExLnJlZywmcnApKSB7CisgICAgICAgICAgc3RvcmVfcmVncGFpcihmLHAsJnJwLCZwLT56LHQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBpZXJyb3IoMCk7ICAvKiBAQEAgVkZQIHJlZ2lzdGVycyAqLworICAgICAgICBwLT56LmZsYWdzID0gMDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmICgoYz09QVNTSUdOIHx8IGM9PVBVU0gpICYmCisgICAgICAgICAgKCh0Jk5RKT5QT0lOVEVSIHx8ICgodCZOUSk9PUNIQVIgJiYgem0ybChvcHNpemUocCkpIT0xKSkpIHsKKyAgICAgICAgY2dfbWVtY29weShmLHApOworICAgICAgICBwLT56LmZsYWdzID0gMDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHAgPSBwcmVsb2FkKGYscCk7CisgICAgICBjID0gcC0+Y29kZTsKKworICAgICAgaWYgKGMgPT0gU1VCUEZQKQorICAgICAgICBjID0gU1VCOworICAgICAgZWxzZSBpZiAoYyA9PSBBRERJMlApCisgICAgICAgIGMgPSBBREQ7CisgICAgICBlbHNlIGlmIChjID09IFNVQklGUCkKKyAgICAgICAgYyA9IFNVQjsKKworICAgICAgaWYgKGMgPT0gQ09OVkVSVCkgeworICAgICAgICBpZiAoSVNGTE9BVChxMXR5cChwKSkgfHwgSVNGTE9BVCh6dHlwKHApKSkgICAvKiBAQEAgKi8KKyAgICAgICAgICBpZXJyb3IoMCk7CisKKyAgICAgICAgaWYgKHNpemV0YWJbcTF0eXAocCkmTlFdIDwgc2l6ZXRhYlt6dHlwKHApJk5RXSkgeworICAgICAgICAgIGludCBzaCA9IDA7CisKKyAgICAgICAgICBpZiAoKHExdHlwKHApJk5RKSA9PSBDSEFSKQorICAgICAgICAgICAgc2ggPSAyNDsKKyAgICAgICAgICBlbHNlIGlmICgocTF0eXAocCkmTlEpID09IFNIT1JUKQorICAgICAgICAgICAgc2ggPSAxNjsKKyAgICAgICAgICBlbHNlIGlmIChzaXpldGFiW3p0eXAocCkmTlFdID4gNCkKKyAgICAgICAgICAgIGllcnJvcigwKTsgIC8qIEBAQCAqLworCisgICAgICAgICAgaWYgKHNoKSB7CisgICAgICAgICAgICByZWdpc3Rlcml6ZShmLHAsJnAtPnExLHExdHlwKHApKTsKKyAgICAgICAgICAgIGVtaXQoZiwiXHRtb3ZcdCVzLCVzLGxzbCAjJWRcbiIscmVnbmFtZXNbenJlZ10scmVnbmFtZXNbcC0+cTEucmVnXSxzaCk7CisgICAgICAgICAgICBlbWl0KGYsIlx0bW92XHQlcywlcywlY3NyICMlZFxuIixyZWduYW1lc1t6cmVnXSxyZWduYW1lc1t6cmVnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChxMXR5cChwKSZVTlNJR05FRCk/J2wnOidhJyxzaCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNhdmVfcmVzdWx0KGYscCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoYyA9PSBLT01QTEVNRU5UKSB7CisgICAgICAgIHJlZ2lzdGVyaXplKGYscCwmcC0+cTEsdCk7CisgICAgICAgIGVtaXQoZiwiXHRtdm5cdCVzLCVzXG4iLHJlZ25hbWVzW3pyZWddLHJlZ25hbWVzW3AtPnExLnJlZ10pOworICAgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGMgPT0gU0VUUkVUVVJOKSB7CisgICAgICAgIGxvYWRfcmVnKGYscCxwLT56LnJlZywmcC0+cTEsdCk7CisgICAgICAgIEJTRVQocmVnc19tb2RpZmllZCxwLT56LnJlZyk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoYyA9PSBHRVRSRVRVUk4pIHsKKyAgICAgICAgaWYgKHAtPnExLnJlZykgeyAgLyogUkVHLWZsYWcgaXMgbm90IHNldCE/ICovCisgICAgICAgICAgenJlZyA9IHAtPnExLnJlZzsKKyAgICAgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwLT56LmZsYWdzID0gMDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChjID09IENBTEwpIHsKKyAgICAgICAgaWYgKChwLT5xMS5mbGFncyAmIChWQVJ8RFJFRk9CSikpPT1WQVIgJiYKKyAgICAgICAgICAgIHAtPnExLnYtPmZpICYmIHAtPnExLnYtPmZpLT5pbmxpbmVfYXNtKSB7CisgICAgICAgICAgZW1pdF9pbmxpbmVfYXNtKGYscC0+cTEudi0+ZmktPmlubGluZV9hc20pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHAtPnExLmZsYWdzICYgRFJFRk9CSikgeworICAgICAgICAgIGludCByZWc7CisKKyAgICAgICAgICBpZiAocC0+cTEuZmxhZ3MgJiBSRUcpIHsKKyAgICAgICAgICAgIHJlZyA9IHAtPnExLnJlZzsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZWcgPSBjZ19nZXRyZWcoZixwKTsKKyAgICAgICAgICAgIGxvYWRfcmVnKGYscCxyZWcsJnAtPnExLFBPSU5URVIpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbWl0KGYsIlx0bW92XHQlcywlc1xuIixyZWduYW1lc1tscl0scmVnbmFtZXNbcGNdKTsKKyAgICAgICAgICBpZiAoYWEgPCBBQTRUKQorICAgICAgICAgICAgZW1pdChmLCJcdG1vdlx0JXMsJXNcbiIscmVnbmFtZXNbcGNdLHJlZ25hbWVzW3JlZ10pOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVtaXQoZiwiXHRieFx0JXNcbiIscmVnbmFtZXNbcmVnXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgZW1pdChmLCJcdGJsXHQiKTsKKyAgICAgICAgICBlbWl0X29iaihmLCZwLT5xMSx0KTsKKyAgICAgICAgICBlbWl0bmwoZik7CisgICAgICAgIH0KKworICAgICAgICBwdXNob2ZmcyAtPSB6bTJsKHB1c2hlZGFyZ3NpemUocCkpOworCisgICAgICAgIGlmICgocC0+cTEuZmxhZ3MgJiAoVkFSfERSRUZPQkopKT09VkFSICYmCisgICAgICAgICAgICBwLT5xMS52LT5maSAmJiAocC0+cTEudi0+ZmktPmZsYWdzICYgQUxMX1JFR1MpKSB7CisgICAgICAgICAgYnZ1bml0ZShyZWdzX21vZGlmaWVkLHAtPnExLnYtPmZpLT5yZWdzX21vZGlmaWVkLFJTSVpFKTsKKyAgICAgICAgfQorICAgICAgICBlbHNleworICAgICAgICAgIGludCBpOworCisgICAgICAgICAgZm9yIChpPTE7IGk8PU1BWFI7IGkrKykgeworICAgICAgICAgICAgaWYgKHJlZ3NjcmF0Y2hbaV0pCisgICAgICAgICAgICAgIEJTRVQocmVnc19tb2RpZmllZCxpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChjID09IFBVU0gpIHsKKyAgICAgICAgaWYgKHQgPT0gMCkKKyAgICAgICAgICBpZXJyb3IoMCk7CisgICAgICAgIHJlZ2lzdGVyaXplKGYscCwmcC0+cTEsdCk7CisgICAgICAgIGVtaXQoZiwiXHRzdHJcdCVzLFslcywjJWxkXVxuIiwKKyAgICAgICAgICAgICByZWduYW1lc1twLT5xMS5yZWddLHJlZ25hbWVzW3NwXSxwdXNob2Zmcyk7CisgICAgICAgIHB1c2hvZmZzICs9IHptMmwob3BzaXplKHApKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChjID09IEFTU0lHTikgeworICAgICAgICBpZiAodCA9PSAwKQorICAgICAgICAgIGllcnJvcigwKTsKKyAgICAgICAgaWYgKGlzcmVnKHAtPnExLmZsYWdzKSkKKyAgICAgICAgICB6cmVnID0gcC0+cTEucmVnOworICAgICAgICBlbHNlCisgICAgICAgICAgbG9hZF9yZWcoZixwLHpyZWcsJnAtPnExLHQpOworICAgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGMgPT0gQUREUkVTUykgeworICAgICAgICBsb2FkX2FkZHJlc3MoZix6cmVnLCZwLT5xMSxQT0lOVEVSKTsKKyAgICAgICAgc2F2ZV9yZXN1bHQoZixwKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChjID09IE1JTlVTKSB7CisgICAgICAgIHJlZ2lzdGVyaXplKGYscCwmcC0+cTEsdCk7CisgICAgICAgIGVtaXQoZiwiXHRyc2JcdCVzLCVzLCMwXG4iLHJlZ25hbWVzW3pyZWddLHJlZ25hbWVzW3AtPnExLnJlZ10pOworICAgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGMgPT0gVEVTVCkgeworICAgICAgICByZWdpc3Rlcml6ZShmLHAsJnAtPnExLHQpOworICAgICAgICBlbWl0KGYsIlx0dGVxXHQlcywjMFxuIixyZWduYW1lc1twLT5xMS5yZWddKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChjID09IENPTVBBUkUpIHsKKyAgICAgICAgaWYgKCFpc2NvbnN0KHAtPnExLmZsYWdzKSkKKyAgICAgICAgICByZWdpc3Rlcml6ZShmLHAsJnAtPnExLHQpOworICAgICAgICBlbWl0KGYsIlx0Y21wXHQlcywiLHJlZ25hbWVzW3AtPnExLnJlZ10pOworICAgICAgICBlbWl0X29iaihmLCZwLT5xMix0KTsKKyAgICAgICAgZW1pdG5sKGYpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKChjPj1PUiAmJiBjPD1BTkQpKSB7CisgICAgICAgIHJlZ2lzdGVyaXplKGYscCwmcC0+cTEsdCk7CisgICAgICAgIGlmICghaXNjb25zdChwLT5xMi5mbGFncykpCisgICAgICAgICAgcmVnaXN0ZXJpemUoZixwLCZwLT5xMix0KTsKKyAgICAgICAgZW1pdChmLCJcdCVzXHQlcywlcywiLGxvZ2ljYWxzW2MtT1JdLHJlZ25hbWVzW3pyZWddLAorICAgICAgICAgICAgIHJlZ25hbWVzW3AtPnExLnJlZ10pOworICAgICAgICBlbWl0X29iaihmLCZwLT5xMix0KTsKKyAgICAgICAgZW1pdG5sKGYpOworICAgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGM+PUxTSElGVCAmJiBjPD1SU0hJRlQpIHsKKyAgICAgICAgcmVnaXN0ZXJpemUoZixwLCZwLT5xMSx0KTsKKyAgICAgICAgaWYgKCFpc2NvbnN0KHAtPnEyLmZsYWdzKSkKKyAgICAgICAgICByZWdpc3Rlcml6ZShmLHAsJnAtPnEyLHQpOworICAgICAgICBlbWl0KGYsIlx0bW92XHQlcywlcywlcyAiLHJlZ25hbWVzW3pyZWddLHJlZ25hbWVzW3AtPnExLnJlZ10sCisgICAgICAgICAgICAgc2hpZnRzWyh0JlVOU0lHTkVEKSE9MF1bYy1MU0hJRlRdKTsKKyAgICAgICAgZW1pdF9vYmooZiwmcC0+cTIsdCk7CisgICAgICAgIGVtaXRubChmKTsKKyAgICAgICAgc2F2ZV9yZXN1bHQoZixwKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChjPj1BREQgJiYgYzw9U1VCKSB7CisgICAgICAgIHJlZ2lzdGVyaXplKGYscCwmcC0+cTEsdCk7CisgICAgICAgIGlmICghaXNjb25zdChwLT5xMi5mbGFncykpCisgICAgICAgICAgcmVnaXN0ZXJpemUoZixwLCZwLT5xMix0KTsKKyAgICAgICAgZW1pdChmLCJcdCVzXHQlcywlcywiLGM9PUFERD8iYWRkIjoic3ViIiwKKyAgICAgICAgICAgICByZWduYW1lc1t6cmVnXSxyZWduYW1lc1twLT5xMS5yZWddKTsKKyAgICAgICAgZW1pdF9vYmooZiwmcC0+cTIsdCk7CisgICAgICAgIGVtaXRubChmKTsKKyAgICAgICAgc2F2ZV9yZXN1bHQoZixwKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChjPT1NVUxUICYmIGFhPj1BQTIgJiYgc2l6ZXRhYlt0Jk5RXTw9NCkgeworICAgICAgICByZWdpc3Rlcml6ZShmLHAsJnAtPnExLHQpOworICAgICAgICByZWdpc3Rlcml6ZShmLHAsJnAtPnEyLHQpOworICAgICAgICBlbWl0KGYsIlx0bXVsXHQlcywlcywlc1xuIiwKKyAgICAgICAgICAgICByZWduYW1lc1t6cmVnXSxyZWduYW1lc1twLT5xMS5yZWddLHJlZ25hbWVzW3AtPnEyLnJlZ10pOworICAgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKHBhc3MpIHsKKyAgICAgICAgcHJpYzIoc3Rkb3V0LHApOworICAgICAgICBpZXJyb3IoMCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgY2dfZnJlZWFsbChmKTsKKyAgZnVuY3Rpb25fYm90dG9tKGYsdixhcmdzaXplK2xvY2Fsc2l6ZStyc2F2ZXNpemUpOworCisjaWYgMCAgLyogQEBAIHdvenU/ICovCisgIGlmIChzdGFja192YWxpZCkgeworICAgIGlmICghdi0+ZmkpCisgICAgICB2LT5maSA9IG5ld19maSgpOworICAgIHYtPmZpLT5mbGFncyB8PSBBTExfU1RBQ0s7CisgICAgdi0+ZmktPnN0YWNrMSA9IHN0YWNrOworICB9CisgIGVtaXQoZiwiOyBzdGFja3NpemU9JWx1JXNcbiIsenVtMnVsKHN0YWNrKSxzdGFja192YWxpZD8iIjoiKz8/Iik7CisjZW5kaWYKK30KKworCitpbnQgc2hvcnRjdXQoaW50IGNvZGUsaW50IHR5cCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKKworaW50IHJlZ19wYXJtKHN0cnVjdCByZWdfaGFuZGxlICptLCBzdHJ1Y3QgVHlwICp0LGludCB2YXJhcmcsc3RydWN0IFR5cCAqZCkKK3sKKyAgaW50IGY7CisKKyAgaWYgKCFtIHx8ICF0KQorICAgIGllcnJvcigwKTsKKworICBmID0gdC0+ZmxhZ3MgJiBOUTsKKworICBpZiAoZjw9TE9ORyB8fCBmPT1QT0lOVEVSKSB7CisgICAgaWYgKG0tPmdyZWdzID49IEdQUl9BUkdTKQorICAgICAgcmV0dXJuIDA7CisgICAgZWxzZQorICAgICAgcmV0dXJuIEZJUlNUX0dQUiArIG0tPmdyZWdzKys7CisgIH0KKworICBpZiAoZiA9PSBMTE9ORykgeworICAgIGlmIChtLT5ncmVncyA+PSBHUFJfQVJHUy0xKQorICAgICAgcmV0dXJuIDA7CisgICAgZWxzZQorICAgICAgaWVycm9yKDApOyAgLyogQEBAIGNoZWNrIEFCSSBpZiBvZGQgcmVnaXN0ZXJzIGFyZSBza2lwcGVkIT8gKi8KKyAgfQorCisgIGlmIChJU0ZMT0FUKGYpKSB7CisjaWYgMCAvKiBAQEAgVkZQIG9ubHkhICovCisgICAgaWYgKG0tPmZyZWdzID49IEZQUl9BUkdTKQorICAgICAgcmV0dXJuIDA7CisgICAgZWxzZQorICAgICAgcmV0dXJuIEZJUlNUX0RPVUJMRSArIG0tPmZyZWdzKys7CisjZW5kaWYKKyAgfQorCisgIHJldHVybiAwOworfQorCisKK2ludCBlbWl0X3BlZXBob2xlKHZvaWQpCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IG9wdGltaXplIGFueXRoaW5nLCBidXQganVzdCB1cGRhdGUgdGhlCisgICBudW1iZXIgb2YgbGluZXMgY291bnRlciwgaWNudCwgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICAgSXQgaXMgcmVxdWlyZWQgdG8gZXN0aW1hdGUgaWYgYSBkYXRhLXJlZmVyZW5jZS1wb2ludGVyIGFycmF5CisgICBpcyBzdGlsbCByZWFjaGFibGUgd2l0aCBhIDEyLWJpdCBvZmZzZXQuICovCit7CisgIGludCBlbnRyaWVzOworCisgIGVudHJpZXMgPSBlbWl0X2YgPyBFTUlUX0JVRl9ERVBUSCA6IGVtaXRfbCAtIGVtaXRfZiArIDE7CisgIGljbnQgKz0gZW50cmllczsKKyAgcmV0dXJuIDA7Cit9CisKKworaW50IGhhbmRsZV9wcmFnbWEoY29uc3QgY2hhciAqcykKK3sKKyAgcmV0dXJuIDA7Cit9CisKKwordm9pZCBjbGVhbnVwX2NnKEZJTEUgKmYpCit7Cit9CisKKwordm9pZCBjbGVhbnVwX2RiKEZJTEUgKmYpCit7CisgIGlmIChmKQorICAgIHNlY3Rpb24gPSAtMTsKK30KZGlmZiAtLWdpdCBhL21hY2hpbmVzL2FybS9tYWNoaW5lLmR0IGIvbWFjaGluZXMvYXJtL21hY2hpbmUuZHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDdiMWJmYQotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL2FybS9tYWNoaW5lLmR0CkBAIC0wLDAgKzEsMTYgQEAKK1M4QlMKK1M4QlUKK1MxNkJTTEUgUzE2QlNCRQorUzE2QlVMRSBTMTZCVUJFCitTMzJCU0xFIFMzMkJTQkUKK1MzMkJVTEUgUzMyQlVCRQorUzMyQlNMRSBTMzJCU0JFCitTMzJCVUxFIFMzMkJVQkUKK1M2NEJTTEUgUzY0QlNCRQorUzY0QlVMRSBTNjRCVUJFCitTMzJCSUVFRUxFCitTNjRCSUVFRUxFCitTNjRCSUVFRUxFCitTMzJCVUxFIFMzMkJVQkUKKworCmRpZmYgLS1naXQgYS9tYWNoaW5lcy9hcm0vbWFjaGluZS5oIGIvbWFjaGluZXMvYXJtL21hY2hpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NzMwMzc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvYXJtL21hY2hpbmUuaApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIEFSTSBjb2RlIGdlbmVyYXRvcgorICogV3JpdHRlbiBieSBGcmFuayBXaWxsZSA8ZnJhbmtAcGhvZW5peC5vd2wuZGU+CisgKi8KKworLyogYnVpbHQtdGltZSBjb25maWd1cmFibGUgb3B0aW9uczogKi8KKyNkZWZpbmUgTlVNX0dQUlMgMTYKKyNkZWZpbmUgTlVNX0ZQUlMgMTYKKyNkZWZpbmUgTlVNX0NDUlMgMQorI2RlZmluZSBOVU1fUEFJUlMgMTMKKworI2luY2x1ZGUgImR0LmgiCisKKy8qIGludGVybmFsbHkgdXNlZCBieSB0aGUgYmFja2VuZCAqLworI2RlZmluZSBGSVJTVF9HUFIgMQorI2RlZmluZSBMQVNUX0dQUiAoRklSU1RfR1BSK05VTV9HUFJTLTEpCisjZGVmaW5lIEZJUlNUX0ZQUiAoTEFTVF9HUFIrMSkKKyNkZWZpbmUgTEFTVF9GUFIgKEZJUlNUX0ZQUitOVU1fRlBSUy0xKQorI2RlZmluZSBGSVJTVF9DQ1IgKExBU1RfRlBSKzEpCisjZGVmaW5lIExBU1RfQ0NSIChGSVJTVF9DQ1IrTlVNX0NDUlMtMSkKKyNkZWZpbmUgRklSU1RfUEFJUiAoTEFTVF9DQ1IrMSkKKyNkZWZpbmUgRklSU1RfRE9VQkxFIChGSVJTVF9QQUlSKzUpCisjZGVmaW5lIExBU1RfUEFJUiAoRklSU1RfUEFJUitOVU1fUEFJUlMtMSkKKworCisvKiAgVGhpcyBzdHJ1Y3QgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IG1hY2hpbmUtc3BlY2lmaWMgICAgICAgICAgICovCisvKiAgYWRkcmVzc2luZy1tb2Rlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ3VycmVudGx5IHBvc3NpYmxlIGFyZSAoY29uc3QsZ3ByKSBhbmQgKGdwcixncHIpICAgICAgICAgICAgICAgICovCitzdHJ1Y3QgQWRkcmVzc2luZ01vZGV7CisgICAgaW50IG5ldmVyX3VzZWQ7Cit9OworCisvKiAgVGhlIG51bWJlciBvZiByZWdpc3RlcnMgb2YgdGhlIHRhcmdldCBtYWNoaW5lLiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1BWFIgTlVNX0dQUlMrTlVNX0ZQUlMrTlVNX0NDUlMrTlVNX1BBSVJTCisKKy8qICBOdW1iZXIgb2YgY29tbWFuZGxpbmUtb3B0aW9ucyB0aGUgY29kZS1nZW5lcmF0b3IgYWNjZXB0cy4gICAgICAgKi8KKyNkZWZpbmUgTUFYR0YgMTAKKworLyogIElmIHRoaXMgaXMgc2V0IHRvIHplcm8gdmJjYyB3aWxsIG5vdCBnZW5lcmF0ZSBJQ3Mgd2hlcmUgdGhlICAgICAqLworLyogIHRhcmdldCBvcGVyYW5kIGlzIHRoZSBzYW1lIGFzIHRoZSAybmQgc291cmNlIG9wZXJhbmQuICAgICAgICAgICAqLworLyogIFRoaXMgY2FuIHNvbWV0aW1lcyBzaW1wbGlmeSB0aGUgY29kZS1nZW5lcmF0b3IsIGJ1dCB1c3VhbGx5ICAgICAqLworLyogIHRoZSBjb2RlIGlzIGJldHRlciBpZiB0aGUgY29kZS1nZW5lcmF0b3IgYWxsb3dzIGl0LiAgICAgICAgICAgICAqLworI2RlZmluZSBVU0VRMkFTWiAxCisKKy8qICBUaGlzIHNwZWNpZmllcyB0aGUgc21hbGxlc3QgaW50ZWdlciB0eXBlIHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgKi8KKy8qICBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlOQURESTJQIElOVAorCisvKiAgVGhpcyBzcGVjaWZpZXMgdGhlIGxhcmdlc3QgaW50ZWdlciB0eXBlIHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgICovCisvKiAgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1BWEFEREkyUCBMT05HCisKKy8qICBJZiB0aGUgYnl0ZXMgb2YgYW4gaW50ZWdlciBhcmUgb3JkZXJlZCBtb3N0IHNpZ25pZmljYW50IGJ5dGUgICAgKi8KKy8qICBieXRlIGZpcnN0IGFuZCB0aGVuIGRlY3JlYXNpbmcgc2V0IEJJR0VORElBTiB0byAxLiAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHRU5ESUFOICghYXJtX2xlX21vZGUpCisKKy8qICBJZiB0aGUgYnl0ZXMgb2YgYW4gaW50ZWdlciBhcmUgb3JkZXJlZCBsZXN0IHNpZ25pZmljYW50IGJ5dGUgICAgKi8KKy8qICBieXRlIGZpcnN0IGFuZCB0aGVuIGluY3JlYXNpbmcgc2V0IExJVFRMRUVORElBTiB0byAxLiAgICAgICAgICAgKi8KKyNkZWZpbmUgTElUVExFRU5ESUFOIChhcm1fbGVfbW9kZSkKKworZXh0ZXJuIGludCBhcm1fbGVfbW9kZTsKKy8qICBOb3RlIHRoYXQgQklHRU5ESUFOIGFuZCBMSVRUTEVFTkRJQU4gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gICAgKi8KKworLyogIElmIHN3aXRjaC1zdGF0ZW1lbnRzIHNob3VsZCBiZSBnZW5lcmF0ZWQgYXMgYSBzZXF1ZW5jZSBvZiAgICAgICAqLworLyogIFNVQixUU1QsQkVRIElDcyByYXRoZXIgdGhhbiBDT01QQVJFLEJFUSBJQ3Mgc2V0IHRoaXMgdG8gMS4gICAgICAqLworLyogIFRoaXMgY2FuIHlpZWxkIGJldHRlciBjb2RlIG9uIHNvbWUgbWFjaGluZXMuICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTV0lUQ0hTVUJTIDAKKworLyogIEluIG9wdGltaXppbmcgY29tcGlsYXRpb24gY2VydGFpbiBsaWJyYXJ5IG1lbWNweS9zdHJjcHktY2FsbHMgICAqLworLyogIHdpdGggbGVuZ3RoIGtub3duIGF0IGNvbXBpbGUtdGltZSB3aWxsIGJlIGlubGluZWQgdXNpbmcgYW4gICAgICAqLworLyogIEFTU0lHTi1JQyBpZiB0aGUgc2l6ZSBpcyBsZXNzIG9yIGVxdWFsIHRvIElOTElORU1FTUNQWS4gICAgICAgICAqLworLyogIFRoZSB0eXBlIHVzZWQgZm9yIHRoZSBBU1NJR04tSUMgd2lsbCBiZSBVTlNJR05FRHxDSEFSLiAgICAgICAgICAqLworI2RlZmluZSBJTkxJTkVNRU1DUFkgMTAyNAorCisvKiAgUGFyYW1ldGVycyBhcmUgc29tZXRpbWVzIHBhc3NlZCBpbiByZWdpc3RlcnMgd2l0aG91dCBfX3JlZy4gICAgICovCisjZGVmaW5lIEhBVkVfUkVHUEFSTVMgMQorCisvKiAgUGFyYW1ldGVycyBvbiB0aGUgc3RhY2sgc2hvdWxkIGJlIHB1c2hlZCBpbiBvcmRlciByYXRoZXIgdGhhbiAgICovCisvKiAgaW4gcmV2ZXJzZSBvcmRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9SREVSRURfUFVTSCAxCisKKy8qICBTdHJ1Y3R1cmUgZm9yIHJlZ19wYXJtKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0cnVjdCByZWdfaGFuZGxleworICAgIHVuc2lnbmVkIGxvbmcgZ3JlZ3M7CisgICAgdW5zaWduZWQgbG9uZyBmcmVnczsKK307CisKKy8qICBOdW1iZXIgcmVnaXN0ZXJzIHVzZWQgZm9yIGZ1bmN0aW9uIGFyZ3VtZW50cyAqLworI2RlZmluZSBHUFJfQVJHUyA0CisjZGVmaW5lIEZQUl9BUkdTIDQKKworLyogIFdlIGhhdmUgc29tZSB0YXJnZXQtc3BlY2lmaWMgdmFyaWFibGUgYXR0cmlidXRlcy4gICAgICAgICAgICAgICAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9BVFRSSUJVVEVTCisKKy8qIFdlIGhhdmUgbm8gdGFyZ2V0LXNwZWNpZmljIHByYWdtYXMgKi8KKyN1bmRlZiBIQVZFX1RBUkdFVF9QUkFHTUFTCisKKy8qICBXZSBrZWVwIHRyYWNrIG9mIGFsbCByZWdpc3RlcnMgbW9kaWZpZWQgYnkgYSBmdW5jdGlvbi4gICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9SRUdTX01PRElGSUVEIDEKKworLyogV2UgaGF2ZSB0byBpbXBsZW1lbnQgb3VyIG93biBjb3N0LWZ1bmN0aW9ucyB0byBhZGFwdCAKKyAgIHJlZ2lzdGVyLWFsbG9jYXRpb24gKi8KKyNkZWZpbmUgSEFWRV9UQVJHRVRfUkFMTE9DIDEKKyNkZWZpbmUgY29zdF9tb3ZlX3JlZyh4LHkpIDEKKyNkZWZpbmUgY29zdF9sb2FkX3JlZyh4LHkpIDIKKyNkZWZpbmUgY29zdF9zYXZlX3JlZyh4LHkpIDIKKyNkZWZpbmUgY29zdF9wdXNocG9wX3JlZyh4KSAzCisKKy8qIHNpemUgb2YgYnVmZmVyIGZvciBhc20tb3V0cHV0LCB0aGlzIGNhbiBiZSB1c2VkIHRvIGRvCisgICBwZWVwaG9sZS1vcHRpbWl6YXRpb25zIG9mIHRoZSBnZW5lcmF0ZWQgYXNzZW1ibHktb3V0cHV0ICovCisjZGVmaW5lIEVNSVRfQlVGX0xFTiAxMDI0IC8qIHNob3VsZCBiZSBlbm91Z2ggKi8KKy8qIG51bWJlciBvZiBhc20tb3V0cHV0IGxpbmVzIGJ1ZmZlcmVkICovCisjZGVmaW5lIEVNSVRfQlVGX0RFUFRIIDQKKworLyogIFdlIGhhdmUgYXNtX3BlZXBob2xlIHRvIG9wdGltaXplIGFzc2VtYmx5LW91dHB1dCAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9QRUVQSE9MRSAxCisKKy8qIHdlIGRvIG5vdCBoYXZlIGEgbWFya19lZmZfaWNzIGZ1bmN0aW9uLCB0aGlzIGlzIHVzZWQgdG8gcHJldmVudAorICAgb3B0aW1pemF0aW9ucyBvbiBjb2RlIHdoaWNoIGNhbiBhbHJlYWR5IGJlIGltcGxlbWVudGVkIGJ5IGVmZmljaWVudAorICAgYXNzZW1ibHkgKi8KKyN1bmRlZiBIQVZFX1RBUkdFVF9FRkZfSUMKKworLyogd2Ugb25seSBuZWVkIHRoZSBzdGFuZGFyZCBkYXRhIHR5cGVzIChubyBiaXQtdHlwZXMsIGRpZmZlcmVudCBwb2ludGVycworICAgZXRjLikgKi8KKyN1bmRlZiBIQVZFX0VYVF9UWVBFUworI3VuZGVmIEhBVkVfVEdUX1BSSU5UVkFMCisKKy8qIHdlIGRvIG5vdCBuZWVkIGV4dHJhIGVsZW1lbnRzIGluIHRoZSBJQyAqLworI3VuZGVmIEhBVkVfRVhUX0lDCisKKy8qIHdlIGRvIG5vdCB1c2UgdW5zaWduZWQgaW50IGFzIHNpemVfdCAoYnV0IHVuc2lnbmVkIGxvbmcsIHRoZSBkZWZhdWx0KSAqLworI3VuZGVmIEhBVkVfSU5UX1NJWkVUCisKKy8qIHdlIGhhdmUgcmVnaXN0ZXItcGFpcnMgKi8KKyNkZWZpbmUgSEFWRV9SRUdQQUlSUyAxCisKKyNkZWZpbmUgSlVNUF9UQUJMRV9ERU5TSVRZIDAuOAorI2RlZmluZSBKVU1QX1RBQkxFX0xFTkdUSCAxMgorCisvKiBXZSB1c2UgYnVpbHRpbiBsaWJjYWxscyBmb3Igc29tZSBvcGVyYXRpb25zICovCisjZGVmaW5lIEhBVkVfTElCQ0FMTFMgMQpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvYmMxNi9tYWNoaW5lLmMgYi9tYWNoaW5lcy9iYzE2L21hY2hpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MmFiOTZmCi0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvYmMxNi9tYWNoaW5lLmMKQEAgLTAsMCArMSwxMTc5IEBACisvKiAgRXhhbXBsZSBiYWNrZW5kIGZvciB2YmNjLCBpdCBtb2RlbHMgYSBnZW5lcmljIDMyYml0IFJJU0Mgb3IgQ0lTQworICAgIENQVS4KKyAKKyAgICBDb25maWd1cmFibGUgYXQgYnVpbGQtdGltZSBhcmU6CisgICAgLSBudW1iZXIgb2YgKDMyYml0KSBnZW5lcmFsLXB1cnBvc2UtcmVnaXN0ZXJzCisgICAgLSBudW1iZXIgb2YgKDY0Yml0KSBmbG9hdGluZy1wb2ludC1yZWdpc3RlcnMKKyAgICAtIG51bWJlciBvZiAoOGJpdCkgY29uZGl0aW9uLWNvZGUtcmVnaXN0ZXJzCisgICAgLSBtZWNoYW5pc20gZm9yIHN0YWNrLWFyZ3VtZW50cyAobW92aW5nIG90IGZpeGVkIHNwKQorIAorICAgIEl0IGFsbG93cyB0byBzZWxlY3QgYXMgcnVuLXRpbWUtb3B0aW9uczoKKyAgICAtIHR3by0gb3IgdGhyZWUtYWRkcmVzcyBjb2RlCisgICAgLSBtZW1vcnkgb3BlcmFuZHMgb3IgbG9hZC1zdG9yZS1hcmNoaXRlY3R1cmUKKyAgICAtIG51bWJlciBvZiByZWdpc3Rlci1hcmd1bWVudHMKKyAgICAtIG51bWJlciBvZiBjYWxsZXItc2F2ZS1yZWdpc3RlcnMKKyovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworI2luY2x1ZGUgInN1cHAuaCIKKworc3RhdGljIGNoYXIgRklMRV9bXT1fX0ZJTEVfXzsKKworLyogIFB1YmxpYyBkYXRhIHRoYXQgTVVTVCBiZSB0aGVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIE5hbWUgYW5kIGNvcHlyaWdodC4gKi8KK2NoYXIgY2dfY29weXJpZ2h0W109InZiY2MgYmMxNiBjb2RlLWdlbmVyYXRvciBWMC4xIChjKSBpbiAyMDIxIGJ5IFZvbGtlciBCYXJ0aGVsbWFubiI7CisKKy8qICBDb21tYW5kbGluZS1mbGFncyB0aGUgY29kZS1nZW5lcmF0b3IgYWNjZXB0czoKKyAgICAwOiBqdXN0IGEgZmxhZworICAgIFZBTEZMQUc6IGEgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQKKyAgICBTVFJJTkdGTEFHOiBhIHN0cmluZyBjYW4gYmUgc3BlY2lmaWVkCisgICAgRlVOQ0ZMQUc6IGEgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKKyAgICBhcGFydCBmcm9tIEZVTkNGTEFHLCBhbGwgb3RoZXIgdmVyc2lvbnMgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIG9uY2UgKi8KK2ludCBnX2ZsYWdzW01BWEdGXT17MCwwLAorCQkgICAgVkFMRkxBRyxWQUxGTEFHLFZBTEZMQUcsCisJCSAgICAwLDAsCisJCSAgICBWQUxGTEFHLFZBTEZMQUcsMH07CisKKy8qIHRoZSBmbGFnLW5hbWUsIGRvIG5vdCB1c2UgbmFtZXMgYmVnaW5uaW5nIHdpdGggbCwgTCwgSSwgRCBvciBVLCBiZWNhdXNlCisgICB0aGV5IGNvbGxpZGUgd2l0aCB0aGUgZnJvbnRlbmQgKi8KK2NoYXIgKmdfZmxhZ3NfbmFtZVtNQVhHRl09eyJ0aHJlZS1hZGRyIiwibG9hZC1zdG9yZSIsCisJCQkgICAidm9sYXRpbGUtZ3BycyIsInZvbGF0aWxlLWZwcnMiLCJ2b2xhdGlsZS1jY3JzIiwKKwkJCSAgICJpbW0taW5kIiwiZ3ByLWluZCIsCisJCQkgICAiZ3ByLWFyZ3MiLCJmcHItYXJncyIsInVzZS1jb21tb25zIn07CisKKy8qIHRoZSByZXN1bHRzIG9mIHBhcnNpbmcgdGhlIGNvbW1hbmQtbGluZS1mbGFncyB3aWxsIGJlIHN0b3JlZCBoZXJlICovCit1bmlvbiBwcGkgZ19mbGFnc192YWxbTUFYR0ZdOworCisvKiAgQWxpZ25tZW50LXJlcXVpcmVtZW50cyBmb3IgYWxsIHR5cGVzIGluIGJ5dGVzLiAgICAgICAgICAgICAgKi8KK3ptYXggYWxpZ25bTUFYX1RZUEUrMV07CisKKy8qICBBbGlnbm1lbnQgdGhhdCBpcyBzdWZmaWNpZW50IGZvciBldmVyeSBvYmplY3QuICAgICAgICAgICAgICAqLworem1heCBtYXhhbGlnbjsKKworLyogIENIQVJfQklUIGZvciB0aGUgdGFyZ2V0IG1hY2hpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IGNoYXJfYml0OworCisvKiAgc2l6ZXMgb2YgdGhlIGJhc2ljIHR5cGVzIChpbiBieXRlcykgKi8KK3ptYXggc2l6ZXRhYltNQVhfVFlQRSsxXTsKKworLyogIE1pbmltdW0gYW5kIE1heGltdW0gdmFsdWVzIGVhY2ggdHlwZSBjYW4gaGF2ZS4gICAgICAgICAgICAgICovCisvKiAgTXVzdCBiZSBpbml0aWFsaXplZCBpbiBpbml0X2NnKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggdF9taW5bTUFYX1RZUEUrMV07Cit6dW1heCB0X21heFtNQVhfVFlQRSsxXTsKK3p1bWF4IHR1X21heFtNQVhfVFlQRSsxXTsKKworLyogIE5hbWVzIG9mIGFsbCByZWdpc3RlcnMuIHdpbGwgYmUgaW5pdGlhbGl6ZWQgaW4gaW5pdF9jZygpLAorICAgIHJlZ2lzdGVyIG51bWJlciAwIGlzIGludmFsaWQsIHZhbGlkIHJlZ2lzdGVycyBzdGFydCBhdCAxICovCitjaGFyICpyZWduYW1lc1tNQVhSKzFdOworCisvKiAgVGhlIFNpemUgb2YgZWFjaCByZWdpc3RlciBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggcmVnc2l6ZVtNQVhSKzFdOworCisvKiAgYSB0eXBlIHdoaWNoIGNhbiBzdG9yZSBlYWNoIHJlZ2lzdGVyLiAqLworc3RydWN0IFR5cCAqcmVndHlwZVtNQVhSKzFdOworCisvKiAgcmVnc2FbcmVnXSE9MCBpZiBhIGNlcnRhaW4gcmVnaXN0ZXIgaXMgYWxsb2NhdGVkIGFuZCBzaG91bGQgKi8KKy8qICBub3QgYmUgdXNlZCBieSB0aGUgY29tcGlsZXIgcGFzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworaW50IHJlZ3NhW01BWFIrMV07CisKKy8qICBTcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXJzIG1heSBiZSBzY3JhdGNoZWQgYnkgZnVuY3Rpb25zLiAgICAqLworaW50IHJlZ3NjcmF0Y2hbTUFYUisxXTsKKworLyogc3BlY2lmaWVzIHRoZSBwcmlvcml0eSBmb3IgdGhlIHJlZ2lzdGVyLWFsbG9jYXRvciwgaWYgdGhlIHNhbWUKKyAgIGVzdGltYXRlZCBjb3N0LXNhdmluZyBjYW4gYmUgb2J0YWluZWQgYnkgc2V2ZXJhbCByZWdpc3RlcnMsIHRoZQorICAgb25lIHdpdGggdGhlIGhpZ2hlc3QgcHJpb3JpdHkgd2lsbCBiZSB1c2VkICovCitpbnQgcmVnX3ByaW9bTUFYUisxXTsKKworLyogYW4gZW1wdHkgcmVnLWhhbmRsZSByZXByZXNlbnRpbmcgaW5pdGlhbCBzdGF0ZSAqLworc3RydWN0IHJlZ19oYW5kbGUgZW1wdHlfcmVnX2hhbmRsZT17MCwwfTsKKworLyogTmFtZXMgb2YgdGFyZ2V0LXNwZWNpZmljIHZhcmlhYmxlIGF0dHJpYnV0ZXMuICAgICAgICAgICAgICAgICovCitjaGFyICpnX2F0dHJfbmFtZVtdPXsiX19pbnRlcnJ1cHQiLDB9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFByaXZhdGUgZGF0YSBhbmQgZnVuY3Rpb25zLiAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUSFJFRV9BRERSIChnX2ZsYWdzWzBdJlVTRURGTEFHKQorI2RlZmluZSBMT0FEX1NUT1JFIChnX2ZsYWdzWzFdJlVTRURGTEFHKQorI2RlZmluZSBWT0xfR1BSUyAgICgoZ19mbGFnc1syXSZVU0VERkxBRyk/Z19mbGFnc192YWxbMl0ubDpOVU1fR1BSUy8yKQorI2RlZmluZSBWT0xfRlBSUyAgICgoZ19mbGFnc1szXSZVU0VERkxBRyk/Z19mbGFnc192YWxbM10ubDpOVU1fRlBSUy8yKQorI2RlZmluZSBWT0xfQ0NSUyAgICgoZ19mbGFnc1s0XSZVU0VERkxBRyk/Z19mbGFnc192YWxbNF0ubDpOVU1fQ0NSUy8yKQorI2RlZmluZSBJTU1fSU5EICAgICgoZ19mbGFnc1s1XSZVU0VERkxBRyk/MTowKQorI2RlZmluZSBHUFJfSU5EICAgICgoZ19mbGFnc1s2XSZVU0VERkxBRyk/MjowKQorI2RlZmluZSBHUFJfQVJHUyAgICgoZ19mbGFnc1s3XSZVU0VERkxBRyk/Z19mbGFnc192YWxbN10ubDowKQorI2RlZmluZSBGUFJfQVJHUyAgICgoZ19mbGFnc1s4XSZVU0VERkxBRyk/Z19mbGFnc192YWxbOF0ubDowKQorI2RlZmluZSBVU0VfQ09NTU9OUyAoZ19mbGFnc1s5XSZVU0VERkxBRykKKworCisvKiBhbGlnbm1lbnQgb2YgYmFzaWMgZGF0YS10eXBlcywgdXNlZCB0byBpbml0aWFsaXplIGFsaWduW10gKi8KK3N0YXRpYyBsb25nIG1hbGlnbltNQVhfVFlQRSsxXT0gIHsxLDEsMiw0LDQsNCw0LDgsOCwxLDQsMSwxLDEsNCwxfTsKKy8qIHNpemVzIG9mIGJhc2ljIGRhdGEtdHlwZXMsIHVzZWQgdG8gaW5pdGlhbGl6ZSBzaXpldGFiW10gKi8KK3N0YXRpYyBsb25nIG1zaXpldGFiW01BWF9UWVBFKzFdPXsxLDEsMiw0LDQsOCw0LDgsOCwwLDQsMCwwLDAsNCwwfTsKKworLyogdXNlZCB0byBpbml0aWFsaXplIHJlZ3R5cFtdICovCitzdGF0aWMgc3RydWN0IFR5cCBsdHlwPXtMT05HfSxsZGJsPXtET1VCTEV9LGxjaGFyPXtDSEFSfTsKKworLyogbWFjcm9zIGRlZmluZWQgYnkgdGhlIGJhY2tlbmQgKi8KK3N0YXRpYyBjaGFyICptYXJyYXlbXT17Il9fc2VjdGlvbih4KT1fX3ZhdHRyKFwic2VjdGlvbihcIiN4XCIpXCIpIiwKKwkJICAgICAgICJfX0dFTkVSSUNfXyIsCisJCSAgICAgICAwfTsKKworLyogc3BlY2lhbCByZWdpc3RlcnMgKi8KK3N0YXRpYyBpbnQgc3A7ICAgICAgICAgICAgICAgICAgICAgLyogIFN0YWNrcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICovCitzdGF0aWMgaW50IHQxLHQyLHQzOyAgICAgICAgICAgICAgIC8qICB0ZW1wb3JhcnkgZ3BycyAqLworc3RhdGljIGludCBmMSxmMixmMzsgICAgICAgICAgICAgICAvKiAgdGVtcG9yYXJ5IGZwcnMgKi8KKworI2RlZmluZSBkdCh0KSAoKCh0KSZVTlNJR05FRCk/dWR0Wyh0KSZOUV06c2R0Wyh0KSZOUV0pCitzdGF0aWMgY2hhciAqc2R0W01BWF9UWVBFKzFdPXsiPz8iLCJjIiwicyIsImkiLCJsIiwibGwiLCJmIiwiZCIsImxkIiwidiIsInAifTsKK3N0YXRpYyBjaGFyICp1ZHRbTUFYX1RZUEUrMV09eyI/PyIsInVjIiwidXMiLCJ1aSIsInVsIiwidWxsIiwiZiIsImQiLCJsZCIsInYiLCJwIn07CisKKy8qIHNlY3Rpb25zICovCisjZGVmaW5lIERBVEEgMAorI2RlZmluZSBCU1MgMQorI2RlZmluZSBDT0RFIDIKKyNkZWZpbmUgUk9EQVRBIDMKKyNkZWZpbmUgU1BFQ0lBTCA0CisKK3N0YXRpYyBsb25nIHN0YWNrOworc3RhdGljIGludCBzdGFja192YWxpZDsKK3N0YXRpYyBpbnQgc2VjdGlvbj0tMSxuZXdvYmo7CitzdGF0aWMgY2hhciAqY29kZW5hbWU9Ilx0LnRleHRcbiIsCisgICpkYXRhbmFtZT0iXHQuZGF0YVxuIiwKKyAgKmJzc25hbWU9IiIsCisgICpyb2RhdGFuYW1lPSJcdC5zZWN0aW9uXHQucm9kYXRhXG4iOworCisvKiByZXR1cm4taW5zdHJ1Y3Rpb24gKi8KK3N0YXRpYyBjaGFyICpyZXQ7CisKKy8qIGxhYmVsIGF0IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uIChpZiBhbnkpICovCitzdGF0aWMgaW50IGV4aXRfbGFiZWw7CisKKy8qIGFzc2VtYmx5LXByZWZpeGVzIGZvciBsYWJlbHMgYW5kIGV4dGVybmFsIGlkZW50aWZpZXJzICovCitzdGF0aWMgY2hhciAqbGFicHJlZml4PSJsIiwqaWRwcmVmaXg9Il8iOworCisjaWYgRklYRURfU1AKKy8qIHZhcmlhYmxlcyB0byBjYWxjdWxhdGUgdGhlIHNpemUgYW5kIHBhcnRpdGlvbmluZyBvZiB0aGUgc3RhY2stZnJhbWUKKyAgIGluIHRoZSBjYXNlIG9mIEZJWEVEX1NQICovCitzdGF0aWMgbG9uZyBmcmFtZW9mZnNldCxwdXNoZWQsbWF4cHVzaGVkLGZyYW1lc2l6ZTsKKyNlbHNlCisvKiB2YXJpYWJsZXMgdG8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBzdGFjay1vZmZzZXQgaW4gdGhlIGNhc2Ugb2YKKyAgIGEgbW92aW5nIHN0YWNrLXBvaW50ZXIgKi8KK3N0YXRpYyBsb25nIG5vdHBvcHBlZCxkb250cG9wLHB1c2hlZCxzdGFja29mZnNldCxtYXhwdXNoZWQ7CisjZW5kaWYKKworc3RhdGljIGxvbmcgbG9jYWxzaXplLHJzYXZlc2l6ZSxhcmdzaXplOworCitzdGF0aWMgdm9pZCBlbWl0X29iaihGSUxFICpmLHN0cnVjdCBvYmogKnAsaW50IHQpOworCisvKiBjYWxjdWxhdGUgdGhlIGFjdHVhbCBjdXJyZW50IG9mZnNldCBvZiBhbiBvYmplY3QgcmVsYXRpdiB0byB0aGUKKyAgIHN0YWNrLXBvaW50ZXI7IHdlIHVzZSBhIGxheW91dCBsaWtlIHRoaXM6CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHwgYXJndW1lbnRzIHRvIHRoaXMgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgfAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB8IHJldHVybi1hZGRyZXNzIFtzaXplPTRdICAgICAgICAgICAgICAgICAgICAgIHwKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCBjYWxsZXItc2F2ZSByZWdpc3RlcnMgW3NpemU9cnNhdmVzaXplXSAgICAgICB8CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHwgbG9jYWwgdmFyaWFibGVzIFtzaXplPWxvY2Fsc2l6ZV0gICAgICAgICAgICAgfAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB8IGFyZ3VtZW50cyB0byBjYWxsZWQgZnVuY3Rpb25zIFtzaXplPWFyZ3NpemVdIHwKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgQWxsIHNpemVzIHdpbGwgYmUgYWxpZ25lZCBhcyBuZWNlc3NhcnkuCisgICBJbiB0aGUgY2FzZSBvZiBGSVhFRF9TUCwgdGhlIHN0YWNrLXBvaW50ZXIgd2lsbCBiZSBhZGp1c3RlZCBhdAorICAgZnVuY3Rpb24tZW50cnkgdG8gbGVhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgYXJndW1lbnRzIGFuZCBoYXZlIGl0CisgICBhbGlnbmVkIHRvIDE2IGJ5dGVzLiBUaGVyZWZvcmUsIHdoZW4gY2FsbGluZyBhIGZ1bmN0aW9uLCB0aGUKKyAgIHN0YWNrLXBvaW50ZXIgaXMgYWx3YXlzIGFsaWduZWQgdG8gMTYgYnl0ZXMuCisgICBGb3IgYSBtb3Zpbmcgc3RhY2stcG9pbnRlciwgdGhlIHN0YWNrLXBvaW50ZXIgd2lsbCB1c3VhbGx5IHBvaW50CisgICB0byB0aGUgYm90dG9tIG9mIHRoZSBhcmVhIGZvciBsb2NhbCB2YXJpYWJsZXMsIGJ1dCB3aWxsIG1vdmUgd2hpbGUKKyAgIGFyZ3VtZW50cyBhcmUgcHV0IG9uIHRoZSBzdGFjay4KKworICAgVGhpcyBpcyBqdXN0IGFuIGV4YW1wbGUgbGF5b3V0LiBPdGhlciBsYXlvdXRzIGFyZSBhbHNvIHBvc3NpYmxlLgorKi8KKworc3RhdGljIHZvaWQgcHVzaChpbnQgaSkKK3sKKyAgcHVzaGVkLT1pOworICBpZihwdXNoZWQ8bWF4cHVzaGVkKQorICAgIG1heHB1c2hlZD1wdXNoZWQ7Cit9CisKK3N0YXRpYyB2b2lkIHBvcChpbnQgaSkKK3sKKyAgcHVzaGVkKz1pOworICBpZihwdXNoZWQ+MCkgaWVycm9yKDApOworfQorCitzdGF0aWMgbG9uZyByZWFsX29mZnNldChzdHJ1Y3Qgb2JqICpvKQoreworICBsb25nIG9mZj16bTJsKG8tPnYtPm9mZnNldCk7CisgIGlmKG9mZjwwKXsKKyAgICAvKiBmdW5jdGlvbiBwYXJhbWV0ZXIgKi8KKyAgICBvZmY9bG9jYWxzaXplK3JzYXZlc2l6ZSs0LW9mZi16bTJsKG1heGFsaWduKTsKKyAgfQorCisjaWYgRklYRURfU1AKKyAgb2ZmKz1hcmdzaXplOworI2Vsc2UKKyAgb2ZmKz1zdGFja29mZnNldDsKKyNlbmRpZgorICBvZmYrPXptMmwoby0+dmFsLnZtYXgpOworICByZXR1cm4gb2ZmOworfQorCisvKiAgSW5pdGlhbGl6ZXMgYW4gYWRkcmVzc2luZy1tb2RlIHN0cnVjdHVyZSBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8KKyAgICB0aGF0IG9iamVjdC4gV2lsbCBub3Qgc3Vydml2ZSBhIHNlY29uZCBjYWxsISAqLworc3RhdGljIHN0cnVjdCBvYmogKmNhbShpbnQgZmxhZ3MsaW50IGJhc2UsbG9uZyBvZmZzZXQpCit7CisgIHN0YXRpYyBzdHJ1Y3Qgb2JqIG9iajsKKyAgc3RhdGljIHN0cnVjdCBBZGRyZXNzaW5nTW9kZSBhbTsKKyAgb2JqLmFtPSZhbTsKKyAgYW0uZmxhZ3M9ZmxhZ3M7CisgIGFtLmJhc2U9YmFzZTsKKyAgYW0ub2Zmc2V0PW9mZnNldDsKKyAgcmV0dXJuICZvYmo7Cit9CisKKy8qIGNoYW5nZXMgdG8gYSBzcGVjaWFsIHNlY3Rpb24sIHVzZWQgZm9yIF9fc2VjdGlvbigpICovCitzdGF0aWMgaW50IHNwZWNpYWxfc2VjdGlvbihGSUxFICpmLHN0cnVjdCBWYXIgKnYpCit7CisgIGNoYXIgKnNlYzsKKyAgaWYoIXYtPnZhdHRyKSByZXR1cm4gMDsKKyAgc2VjPXN0cnN0cih2LT52YXR0ciwic2VjdGlvbigiKTsKKyAgaWYoIXNlYykgcmV0dXJuIDA7CisgIHNlYys9c3RybGVuKCJzZWN0aW9uKCIpOworICBlbWl0KGYsIlx0LnNlY3Rpb25cdCIpOworICB3aGlsZSgqc2VjJiYqc2VjIT0nKScpIGVtaXRfY2hhcihmLCpzZWMrKyk7CisgIGVtaXQoZiwiXG4iKTsKKyAgaWYoZikgc2VjdGlvbj1TUEVDSUFMOworICByZXR1cm4gMTsKK30KKworLyogZ2VuZXJhdGUgY29kZSB0byBsb2FkIHRoZSBhZGRyZXNzIG9mIGEgdmFyaWFibGUgaW50byByZWdpc3RlciByICovCitzdGF0aWMgdm9pZCBsb2FkX2FkZHJlc3MoRklMRSAqZixpbnQgcixzdHJ1Y3Qgb2JqICpvLGludCB0eXBlKQorLyogIEdlbmVyYXRlcyBjb2RlIHRvIGxvYWQgdGhlIGFkZHJlc3Mgb2YgYSB2YXJpYWJsZSBpbnRvIHJlZ2lzdGVyIHIuICAgKi8KK3sKKyAgaWYoIShvLT5mbGFncyZWQVIpKSBpZXJyb3IoMCk7CisgIGlmKG8tPnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fG8tPnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKXsKKyAgICBsb25nIG9mZj1yZWFsX29mZnNldChvKTsKKyAgICBpZihUSFJFRV9BRERSKXsKKyAgICAgIGVtaXQoZiwiXHRhZGQuJXNcdCVzLCVzLCVsZFxuIixkdChQT0lOVEVSKSxyZWduYW1lc1tyXSxyZWduYW1lc1tzcF0sb2ZmKTsKKyAgICB9ZWxzZXsKKyAgICAgIGVtaXQoZiwiXHRtb3YuJXNcdCVzLCVzXG4iLGR0KFBPSU5URVIpLHJlZ25hbWVzW3JdLHJlZ25hbWVzW3NwXSk7CisgICAgICBpZihvZmYpCisJZW1pdChmLCJcdGFkZC4lc1x0JXMsJWxkXG4iLGR0KFBPSU5URVIpLHJlZ25hbWVzW3JdLG9mZik7CisgICAgfQorICB9ZWxzZXsKKyAgICBlbWl0KGYsIlx0bW92LiVzXHQlcywiLGR0KFBPSU5URVIpLHJlZ25hbWVzW3JdKTsKKyAgICBlbWl0X29iaihmLG8sdHlwZSk7CisgICAgZW1pdChmLCJcbiIpOworICB9Cit9CisvKiBHZW5lcmF0ZXMgY29kZSB0byBsb2FkIGEgbWVtb3J5IG9iamVjdCBpbnRvIHJlZ2lzdGVyIHIuIHRtcCBpcyBhCisgICBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgd2hpY2ggbWF5IGJlIHVzZWQuIHRtcCBjYW4gYmUgci4gKi8KK3N0YXRpYyB2b2lkIGxvYWRfcmVnKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdHlwZSkKK3sKKyAgdHlwZSY9TlU7CisgIGlmKG8tPmZsYWdzJlZBUkFEUil7CisgICAgbG9hZF9hZGRyZXNzKGYscixvLFBPSU5URVIpOworICB9ZWxzZXsKKyAgICBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmby0+cmVnPT1yKQorICAgICAgcmV0dXJuOworICAgIGVtaXQoZiwiXHRtb3YuJXNcdCVzLCIsZHQodHlwZSkscmVnbmFtZXNbcl0pOworICAgIGVtaXRfb2JqKGYsbyx0eXBlKTsKKyAgICBlbWl0KGYsIlxuIik7CisgIH0KK30KKworLyogIEdlbmVyYXRlcyBjb2RlIHRvIHN0b3JlIHJlZ2lzdGVyIHIgaW50byBtZW1vcnkgb2JqZWN0IG8uICovCitzdGF0aWMgdm9pZCBzdG9yZV9yZWcoRklMRSAqZixpbnQgcixzdHJ1Y3Qgb2JqICpvLGludCB0eXBlKQoreworICB0eXBlJj1OUTsKKyAgZW1pdChmLCJcdG1vdi4lc1x0IixkdCh0eXBlKSk7CisgIGVtaXRfb2JqKGYsbyx0eXBlKTsKKyAgZW1pdChmLCIsJXNcbiIscmVnbmFtZXNbcl0pOworfQorCisvKiAgWWllbGRzIGxvZzIoeCkrMSBvciAwLiAqLworc3RhdGljIGxvbmcgcG9mMih6dW1heCB4KQoreworICB6dW1heCBwO2ludCBsbj0xOworICBwPXVsMnp1bSgxTCk7CisgIHdoaWxlKGxuPD0zMiYmenVtbGVxKHAseCkpeworICAgIGlmKHp1bWVxdG8oeCxwKSkgcmV0dXJuIGxuOworICAgIGxuKys7cD16dW1hZGQocCxwKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBJQyAqcHJlbG9hZChGSUxFICosc3RydWN0IElDICopOworCitzdGF0aWMgdm9pZCBmdW5jdGlvbl90b3AoRklMRSAqLHN0cnVjdCBWYXIgKixsb25nKTsKK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX2JvdHRvbShGSUxFICpmLHN0cnVjdCBWYXIgKixsb25nKTsKKworI2RlZmluZSBpc3JlZyh4KSAoKHAtPnguZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRykKKyNkZWZpbmUgaXNjb25zdCh4KSAoKHAtPnguZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpCisKK3N0YXRpYyBpbnQgcTFyZWcscTJyZWcsenJlZzsKKworc3RhdGljIGNoYXIgKmNjc1tdPXsiZXEiLCJuZSIsImx0IiwiZ2UiLCJsZSIsImd0IiwiIn07CitzdGF0aWMgY2hhciAqbG9naWNhbHNbXT17Im9yIiwieG9yIiwiYW5kIn07CitzdGF0aWMgY2hhciAqYXJpdGhtZXRpY3NbXT17InNsdyIsInNydyIsImFkZCIsInN1YiIsIm11bGx3IiwiZGl2dyIsIm1vZCJ9OworCisvKiBjb21wYXJlIGlmIHR3byBvYmplY3RzIGFyZSB0aGUgc2FtZSAqLworc3RhdGljIGludCBjb21wYXJlX29iamVjdHMoc3RydWN0IG9iaiAqbzEsc3RydWN0IG9iaiAqbzIpCit7CisgIGlmKChvMS0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmKG8yLT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZvMS0+cmVnPT1vMi0+cmVnKQorICAgIHJldHVybiAxOworICBpZihvMS0+ZmxhZ3M9PW8yLT5mbGFncyYmbzEtPmFtPT1vMi0+YW0peworICAgIGlmKCEobzEtPmZsYWdzJlZBUil8fChvMS0+dj09bzItPnYmJnptZXF0byhvMS0+dmFsLnZtYXgsbzItPnZhbC52bWF4KSkpeworICAgICAgaWYoIShvMS0+ZmxhZ3MmUkVHKXx8bzEtPnJlZz09bzItPnJlZyl7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworLyogRG9lcyBzb21lIHByZS1wcm9jZXNzaW5nIGxpa2UgZmV0Y2hpbmcgb3BlcmFuZHMgZnJvbSBtZW1vcnkgdG8KKyAgIHJlZ2lzdGVycyBldGMuICovCitzdGF0aWMgc3RydWN0IElDICpwcmVsb2FkKEZJTEUgKmYsc3RydWN0IElDICpwKQoreworICBpbnQgcjsKKworICBpZihpc3JlZyhxMSkpCisgICAgcTFyZWc9cC0+cTEucmVnOworICBlbHNlCisgICAgcTFyZWc9MDsKKworICBpZihpc3JlZyhxMikpCisgICAgcTJyZWc9cC0+cTIucmVnOworICBlbHNlCisgICAgcTJyZWc9MDsKKworICBpZihpc3JlZyh6KSYmKFRIUkVFX0FERFJ8fCFjb21wYXJlX29iamVjdHMoJnAtPnEyLCZwLT56KSkpeworICAgIHpyZWc9cC0+ei5yZWc7CisgIH1lbHNleworICAgIGlmKElTRkxPQVQoenR5cChwKSkpCisgICAgICB6cmVnPWYxOworICAgIGVsc2UKKyAgICAgIHpyZWc9dDE7CisgIH0KKyAgCisgIGlmKChwLT5xMS5mbGFncyYoRFJFRk9CSnxSRUcpKT09RFJFRk9CSiYmIXAtPnExLmFtKXsKKyAgICBwLT5xMS5mbGFncyY9fkRSRUZPQko7CisgICAgbG9hZF9yZWcoZix0MSwmcC0+cTEscTF0eXAocCkpOworICAgIHAtPnExLnJlZz10MTsKKyAgICBwLT5xMS5mbGFnc3w9KFJFR3xEUkVGT0JKKTsKKyAgfQorICBpZihwLT5xMS5mbGFncyYmTE9BRF9TVE9SRSYmIWlzcmVnKHExKSl7CisgICAgaWYocC0+Y29kZT09QVNTSUdOJiZpc3JlZyh6KSkKKyAgICAgIHExcmVnPXAtPnoucmVnOworICAgIGVsc2UgaWYoSVNGTE9BVChxMXR5cChwKSkpCisgICAgICBxMXJlZz1mMTsKKyAgICBlbHNlCisgICAgICBxMXJlZz10MTsKKyAgICBsb2FkX3JlZyhmLHExcmVnLCZwLT5xMSxxMXR5cChwKSk7CisgICAgcC0+cTEucmVnPXExcmVnOworICAgIHAtPnExLmZsYWdzPVJFRzsKKyAgfQorCisgIGlmKChwLT5xMi5mbGFncyYoRFJFRk9CSnxSRUcpKT09RFJFRk9CSiYmIXAtPnEyLmFtKXsKKyAgICBwLT5xMi5mbGFncyY9fkRSRUZPQko7CisgICAgbG9hZF9yZWcoZix0MSwmcC0+cTIscTJ0eXAocCkpOworICAgIHAtPnEyLnJlZz10MTsKKyAgICBwLT5xMi5mbGFnc3w9KFJFR3xEUkVGT0JKKTsKKyAgfQorICBpZihwLT5xMi5mbGFncyYmTE9BRF9TVE9SRSYmIWlzcmVnKHEyKSl7CisgICAgaWYoSVNGTE9BVChxMnR5cChwKSkpCisgICAgICBxMnJlZz1mMjsKKyAgICBlbHNlCisgICAgICBxMnJlZz10MjsKKyAgICBsb2FkX3JlZyhmLHEycmVnLCZwLT5xMixxMnR5cChwKSk7CisgICAgcC0+cTIucmVnPXEycmVnOworICAgIHAtPnEyLmZsYWdzPVJFRzsKKyAgfQorICByZXR1cm4gcDsKK30KKworLyogc2F2ZSB0aGUgcmVzdWx0IChpbiB6cmVnKSBpbnRvIHAtPnogKi8KK3ZvaWQgc2F2ZV9yZXN1bHQoRklMRSAqZixzdHJ1Y3QgSUMgKnApCit7CisgIGlmKChwLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1EUkVGT0JKJiYhcC0+ei5hbSl7CisgICAgcC0+ei5mbGFncyY9fkRSRUZPQko7CisgICAgbG9hZF9yZWcoZix0MiwmcC0+eixQT0lOVEVSKTsKKyAgICBwLT56LnJlZz10MjsKKyAgICBwLT56LmZsYWdzfD0oUkVHfERSRUZPQkopOworICB9CisgIGlmKGlzcmVnKHopKXsKKyAgICBpZihwLT56LnJlZyE9enJlZykKKyAgICAgIGVtaXQoZiwiXHRtb3YuJXNcdCVzLCVzXG4iLGR0KHp0eXAocCkpLHJlZ25hbWVzW3AtPnoucmVnXSxyZWduYW1lc1t6cmVnXSk7CisgIH1lbHNleworICAgIHN0b3JlX3JlZyhmLHpyZWcsJnAtPnosenR5cChwKSk7CisgIH0KK30KKworLyogcHJpbnRzIGFuIG9iamVjdCAqLworc3RhdGljIHZvaWQgZW1pdF9vYmooRklMRSAqZixzdHJ1Y3Qgb2JqICpwLGludCB0KQoreworICBpZihwLT5hbSl7CisgICAgaWYocC0+YW0tPmZsYWdzJkdQUl9JTkQpIGVtaXQoZiwiKCVzLCVzKSIscmVnbmFtZXNbcC0+YW0tPm9mZnNldF0scmVnbmFtZXNbcC0+YW0tPmJhc2VdKTsKKyAgICBpZihwLT5hbS0+ZmxhZ3MmSU1NX0lORCkgZW1pdChmLCIoJWxkLCVzKSIscC0+YW0tPm9mZnNldCxyZWduYW1lc1twLT5hbS0+YmFzZV0pOworICAgIHJldHVybjsKKyAgfQorICBpZigocC0+ZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09KEtPTlNUfERSRUZPQkopKXsKKyAgICBlbWl0dmFsKGYsJnAtPnZhbCxwLT5kdHlwJk5VKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYocC0+ZmxhZ3MmRFJFRk9CSikgZW1pdChmLCIoIik7CisgIGlmKHAtPmZsYWdzJlJFRyl7CisgICAgZW1pdChmLCIlcyIscmVnbmFtZXNbcC0+cmVnXSk7CisgIH1lbHNlIGlmKHAtPmZsYWdzJlZBUikgeworICAgIGlmKHAtPnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHAtPnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKQorICAgICAgZW1pdChmLCIlbGQoJXMpIixyZWFsX29mZnNldChwKSxyZWduYW1lc1tzcF0pOworICAgIGVsc2V7CisgICAgICBpZighem1lcXRvKGwyem0oMEwpLHAtPnZhbC52bWF4KSl7ZW1pdHZhbChmLCZwLT52YWwsTE9ORyk7ZW1pdChmLCIrIik7fQorICAgICAgaWYocC0+di0+c3RvcmFnZV9jbGFzcz09U1RBVElDKXsKKyAgICAgICAgZW1pdChmLCIlcyVsZCIsbGFicHJlZml4LHptMmwocC0+di0+b2Zmc2V0KSk7CisgICAgICB9ZWxzZXsKKyAgICAgICAgZW1pdChmLCIlcyVzIixpZHByZWZpeCxwLT52LT5pZGVudGlmaWVyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYocC0+ZmxhZ3MmS09OU1QpeworICAgIGVtaXR2YWwoZiwmcC0+dmFsLHQmTlUpOworICB9CisgIGlmKHAtPmZsYWdzJkRSRUZPQkopIGVtaXQoZiwiKSIpOworfQorCisvKiAgVGVzdCBpZiB0aGVyZSBpcyBhIHNlcXVlbmNlIG9mIEZSRUVSRUdzIGNvbnRhaW5pbmcgRlJFRVJFRyByZWcuCisgICAgVXNlZCBieSBwZWVwaG9sZS4gKi8KK3N0YXRpYyBpbnQgZXhpc3RzX2ZyZWVyZWcoc3RydWN0IElDICpwLGludCByZWcpCit7CisgIHdoaWxlKHAmJihwLT5jb2RlPT1GUkVFUkVHfHxwLT5jb2RlPT1BTExPQ1JFRykpeworICAgIGlmKHAtPmNvZGU9PUZSRUVSRUcmJnAtPnExLnJlZz09cmVnKSByZXR1cm4gMTsKKyAgICBwPXAtPm5leHQ7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIHNlYXJjaCBmb3IgcG9zc2libGUgYWRkcmVzc2luZy1tb2RlcyAqLworc3RhdGljIHZvaWQgcGVlcGhvbGUoc3RydWN0IElDICpwKQoreworICBpbnQgYyxjMixyO3N0cnVjdCBJQyAqcDI7c3RydWN0IEFkZHJlc3NpbmdNb2RlICphbTsKKworICBmb3IoO3A7cD1wLT5uZXh0KXsKKyAgICBjPXAtPmNvZGU7CisgICAgaWYoYyE9RlJFRVJFRyYmYyE9QUxMT0NSRUcmJihjIT1TRVRSRVRVUk58fCFpc3JlZyhxMSl8fHAtPnExLnJlZyE9cC0+ei5yZWcpKSBleGl0X2xhYmVsPTA7CisgICAgaWYoYz09TEFCRUwpIGV4aXRfbGFiZWw9cC0+dHlwZjsKKworICAgIC8qIFRyeSBjb25zdChyZWcpICovCisgICAgaWYoSU1NX0lORCYmKGM9PUFEREkyUHx8Yz09U1VCSUZQKSYmaXNyZWcoeikmJihwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisgICAgICBpbnQgYmFzZTt6bWF4IG9mO3N0cnVjdCBvYmogKm87CisgICAgICBldmFsX2NvbnN0KCZwLT5xMi52YWwscC0+dHlwZik7CisgICAgICBpZihjPT1TVUJJRlApIG9mPXptc3ViKGwyem0oMEwpLHZtYXgpOyBlbHNlIG9mPXZtYXg7CisgICAgICBpZigxLyp6bWxlcShsMnptKC0zMjc2OEwpLHZtYXgpJiZ6bWxlcSh2bWF4LGwyem0oMzI3NjdMKSkqLyl7CisJcj1wLT56LnJlZzsKKwlpZihpc3JlZyhxMSkpIGJhc2U9cC0+cTEucmVnOyBlbHNlIGJhc2U9cjsKKwlvPTA7CisJZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpeworCSAgYzI9cDItPmNvZGU7CisJICBpZihjMj09Q0FMTHx8YzI9PUxBQkVMfHwoYzI+PUJFUSYmYzI8PUJSQSkpIGJyZWFrOworCSAgaWYoYzIhPUZSRUVSRUcmJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09cikgYnJlYWs7CisJICBpZihjMiE9RlJFRVJFRyYmKHAyLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTIucmVnPT1yKSBicmVhazsKKwkgIGlmKGMyIT1DQUxMJiYoYzI8TEFCRUx8fGMyPkJSQSkvKiYmYzIhPUFERFJFU1MqLyl7CisJICAgIGlmKCFwMi0+cTEuYW0mJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT5xMS5yZWc9PXIpeworCSAgICAgIGlmKG8pIGJyZWFrOworCSAgICAgIG89JnAyLT5xMTsKKwkgICAgfQorCSAgICBpZighcDItPnEyLmFtJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTIucmVnPT1yKXsKKwkgICAgICBpZihvKSBicmVhazsKKwkgICAgICBvPSZwMi0+cTI7CisJICAgIH0KKwkgICAgaWYoIXAyLT56LmFtJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT56LnJlZz09cil7CisJICAgICAgaWYobykgYnJlYWs7CisJICAgICAgbz0mcDItPno7CisJICAgIH0KKwkgIH0KKwkgIGlmKGMyPT1GUkVFUkVHfHwocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisJICAgIGludCBtOworCSAgICBpZihjMj09RlJFRVJFRykKKwkgICAgICBtPXAyLT5xMS5yZWc7CisJICAgIGVsc2UKKwkgICAgICBtPXAyLT56LnJlZzsKKwkgICAgaWYobT09cil7CisJICAgICAgaWYobyl7CisJCW8tPmFtPWFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKKwkJYW0tPmZsYWdzPUlNTV9JTkQ7CisJCWFtLT5iYXNlPWJhc2U7CisJCWFtLT5vZmZzZXQ9em0ybChvZik7CisJCWlmKGlzcmVnKHExKSl7CisJCSAgcC0+Y29kZT1jPU5PUDtwLT5xMS5mbGFncz1wLT5xMi5mbGFncz1wLT56LmZsYWdzPTA7CisJCX1lbHNleworCQkgIHAtPmNvZGU9Yz1BU1NJR047cC0+cTIuZmxhZ3M9MDsKKwkJICBwLT50eXBmPXAtPnR5cGYyO3AtPnEyLnZhbC52bWF4PXNpemV0YWJbcC0+dHlwZjImTlFdOworCQl9CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGlmKGMyIT1GUkVFUkVHJiZtPT1iYXNlKSBicmVhazsKKwkgICAgY29udGludWU7CisJICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgLyogVHJ5IHJlZyxyZWcgKi8KKyAgICBpZihHUFJfSU5EJiZjPT1BRERJMlAmJmlzcmVnKHEyKSYmaXNyZWcoeikmJihpc3JlZyhxMSl8fHAtPnEyLnJlZyE9cC0+ei5yZWcpKXsKKyAgICAgIGludCBiYXNlLGlkeDtzdHJ1Y3Qgb2JqICpvOworICAgICAgcj1wLT56LnJlZztpZHg9cC0+cTIucmVnOworICAgICAgaWYoaXNyZWcocTEpKSBiYXNlPXAtPnExLnJlZzsgZWxzZSBiYXNlPXI7CisgICAgICBvPTA7CisgICAgICBmb3IocDI9cC0+bmV4dDtwMjtwMj1wMi0+bmV4dCl7CisgICAgICAgIGMyPXAyLT5jb2RlOworICAgICAgICBpZihjMj09Q0FMTHx8YzI9PUxBQkVMfHwoYzI+PUJFUSYmYzI8PUJSQSkpIGJyZWFrOworICAgICAgICBpZihjMiE9RlJFRVJFRyYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1yKSBicmVhazsKKyAgICAgICAgaWYoYzIhPUZSRUVSRUcmJihwMi0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnEyLnJlZz09cikgYnJlYWs7CisgICAgICAgIGlmKChwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+ei5yZWc9PWlkeCYmaWR4IT1yKSBicmVhazsKKwkKKyAgICAgICAgaWYoYzIhPUNBTEwmJihjMjxMQUJFTHx8YzI+QlJBKS8qJiZjMiE9QUREUkVTUyovKXsKKyAgICAgICAgICBpZighcDItPnExLmFtJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTEucmVnPT1yKXsKKyAgICAgICAgICAgIGlmKG98fChxMXR5cChwMikmTlEpPT1MTE9ORykgYnJlYWs7CisgICAgICAgICAgICBvPSZwMi0+cTE7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKCFwMi0+cTIuYW0mJihwMi0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT5xMi5yZWc9PXIpeworICAgICAgICAgICAgaWYob3x8KHEydHlwKHAyKSZOUSk9PUxMT05HKSBicmVhazsKKyAgICAgICAgICAgIG89JnAyLT5xMjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYoIXAyLT56LmFtJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT56LnJlZz09cil7CisgICAgICAgICAgICBpZihvfHwoenR5cChwMikmTlEpPT1MTE9ORykgYnJlYWs7CisgICAgICAgICAgICBvPSZwMi0+ejsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoYzI9PUZSRUVSRUd8fChwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKyAgICAgICAgICBpbnQgbTsKKyAgICAgICAgICBpZihjMj09RlJFRVJFRykKKyAgICAgICAgICAgIG09cDItPnExLnJlZzsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtPXAyLT56LnJlZzsKKyAgICAgICAgICBpZihtPT1yKXsKKyAgICAgICAgICAgIGlmKG8peworICAgICAgICAgICAgICBvLT5hbT1hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CisgICAgICAgICAgICAgIGFtLT5mbGFncz1HUFJfSU5EOworICAgICAgICAgICAgICBhbS0+YmFzZT1iYXNlOworICAgICAgICAgICAgICBhbS0+b2Zmc2V0PWlkeDsKKwkgICAgICBpZihpc3JlZyhxMSkpeworCQlwLT5jb2RlPWM9Tk9QO3AtPnExLmZsYWdzPXAtPnEyLmZsYWdzPXAtPnouZmxhZ3M9MDsKKwkgICAgICB9ZWxzZXsKKwkJcC0+Y29kZT1jPUFTU0lHTjtwLT5xMi5mbGFncz0wOworCQlwLT50eXBmPXAtPnR5cGYyO3AtPnEyLnZhbC52bWF4PXNpemV0YWJbcC0+dHlwZjImTlFdOworCSAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZihjMiE9RlJFRVJFRyYmbT09YmFzZSkgYnJlYWs7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyogZ2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBlbnRyeSBjb2RlICovCitzdGF0aWMgdm9pZCBmdW5jdGlvbl90b3AoRklMRSAqZixzdHJ1Y3QgVmFyICp2LGxvbmcgb2Zmc2V0KQoreworICByc2F2ZXNpemU9MDsKKyAgaWYoIXNwZWNpYWxfc2VjdGlvbihmLHYpJiZzZWN0aW9uIT1DT0RFKXtlbWl0KGYsY29kZW5hbWUpO2lmKGYpIHNlY3Rpb249Q09ERTt9IAorICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4peworICAgIGlmKCh2LT5mbGFncyYoSU5MSU5FRlVOQ3xJTkxJTkVFWFQpKSE9SU5MSU5FRlVOQykKKyAgICAgIGVtaXQoZiwiXHQuZ2xvYmFsXHQlcyVzXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgIGVtaXQoZiwiJXMlczpcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgIH1lbHNlCisgICAgZW1pdChmLCIlcyVsZDpcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7Cit9CisvKiBnZW5lcmF0ZXMgdGhlIGZ1bmN0aW9uIGV4aXQgY29kZSAqLworc3RhdGljIHZvaWQgZnVuY3Rpb25fYm90dG9tKEZJTEUgKmYsc3RydWN0IFZhciAqdixsb25nIG9mZnNldCkKK3sKKyAgZW1pdChmLHJldCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIEVuZCBvZiBwcml2YXRlIGRhdGEgYW5kIGZ1bmN0aW9ucy4gICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogIERvZXMgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9ucyBmb3IgdGhlIGNvZGUtZ2VuZXJhdG9yLiBHZXRzIGNhbGxlZCAgKi8KKy8qICBvbmNlIGF0IHRoZSBiZWdpbm5pbmcgYW5kIHNob3VsZCByZXR1cm4gMCBpbiBjYXNlIG9mIHByb2JsZW1zLiAgICAgICovCitpbnQgaW5pdF9jZyh2b2lkKQoreworICBpbnQgaTsKKyAgLyogIEluaXRpYWxpemUgc29tZSB2YWx1ZXMgd2hpY2ggY2Fubm90IGJlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgICAqLworICAvKiAgYmVjYXVzZSB0aGV5IGFyZSBzdG9yZWQgaW4gdGhlIHRhcmdldCdzIGFyaXRobWV0aWMuICAgICAgICAgICAgICovCisgIG1heGFsaWduPWwyem0oOEwpOworICBjaGFyX2JpdD1sMnptKDhMKTsKKyAgc3RhY2thbGlnbj1sMnptKDQpOworCisgIGZvcihpPTA7aTw9TUFYX1RZUEU7aSsrKXsKKyAgICBzaXpldGFiW2ldPWwyem0obXNpemV0YWJbaV0pOworICAgIGFsaWduW2ldPWwyem0obWFsaWduW2ldKTsKKyAgfQorCisgIHJlZ25hbWVzWzBdPSJub3JlZyI7CisgIGZvcihpPUZJUlNUX0dQUjtpPD1MQVNUX0dQUjtpKyspeworICAgIHJlZ25hbWVzW2ldPW15bWFsbG9jKDEwKTsKKyAgICBzcHJpbnRmKHJlZ25hbWVzW2ldLCJncHIlZCIsaS1GSVJTVF9HUFIpOworICAgIHJlZ3NpemVbaV09bDJ6bSg0TCk7CisgICAgcmVndHlwZVtpXT0mbHR5cDsKKyAgfQorICBmb3IoaT1GSVJTVF9GUFI7aTw9TEFTVF9GUFI7aSsrKXsKKyAgICByZWduYW1lc1tpXT1teW1hbGxvYygxMCk7CisgICAgc3ByaW50ZihyZWduYW1lc1tpXSwiZnByJWQiLGktRklSU1RfRlBSKTsKKyAgICByZWdzaXplW2ldPWwyem0oOEwpOworICAgIHJlZ3R5cGVbaV09JmxkYmw7CisgIH0KKyAgZm9yKGk9RklSU1RfQ0NSO2k8PUxBU1RfQ0NSO2krKyl7CisgICAgcmVnbmFtZXNbaV09bXltYWxsb2MoMTApOworICAgIHNwcmludGYocmVnbmFtZXNbaV0sImNjciVkIixpLUZJUlNUX0NDUik7CisgICAgcmVnc2l6ZVtpXT1sMnptKDFMKTsKKyAgICByZWd0eXBlW2ldPSZsY2hhcjsKKyAgfQorCisgIC8qICBVc2UgbXVsdGlwbGUgY2NzLiAgICovCisgIG11bHRpcGxlX2Njcz0wOworCisgIC8qICBJbml0aWFsaXplIHRoZSBtaW4vbWF4LXNldHRpbmdzLiBOb3RlIHRoYXQgdGhlIHR5cGVzIG9mIHRoZSAgICAgKi8KKyAgLyogIGhvc3Qgc3lzdGVtIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgdGFyZ2V0IHN5c3RlbSBhbmQgeW91IG1heSAqLworICAvKiAgb25seSB1c2UgdGhlIHNtYWxsZXN0IG1heGltdW0gdmFsdWVzIEFOU0kgZ3VhcmFudGVlcyBpZiB5b3UgICAgICovCisgIC8qICB3YW50IHRvIGJlIHBvcnRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIFRoYXQncyB0aGUgcmVhc29uIGZvciB0aGUgc3VidHJhY3Rpb24gaW4gdF9taW5bSU5UXS4gTG9uZyBjb3VsZCAqLworICAvKiAgYmUgdW5hYmxlIHRvIHJlcHJlc2VudCAtMjE0NzQ4MzY0OCBvbiB0aGUgaG9zdCBzeXN0ZW0uICAgICAgICAgICovCisgIHRfbWluW0NIQVJdPWwyem0oLTEyOEwpOworICB0X21pbltTSE9SVF09bDJ6bSgtMzI3NjhMKTsKKyAgdF9taW5bSU5UXT16bXN1YihsMnptKC0yMTQ3NDgzNjQ3TCksbDJ6bSgxTCkpOworICB0X21pbltMT05HXT10X21pbihJTlQpOworICB0X21pbltMTE9OR109em1sc2hpZnQobDJ6bSgxTCksbDJ6bSg2M0wpKTsKKyAgdF9taW5bTUFYSU5UXT10X21pbihMTE9ORyk7CisgIHRfbWF4W0NIQVJdPXVsMnp1bSgxMjdMKTsKKyAgdF9tYXhbU0hPUlRdPXVsMnp1bSgzMjc2N1VMKTsKKyAgdF9tYXhbSU5UXT11bDJ6dW0oMjE0NzQ4MzY0N1VMKTsKKyAgdF9tYXhbTE9OR109dF9tYXgoSU5UKTsKKyAgdF9tYXhbTExPTkddPXp1bXJzaGlmdCh6dW1rb21wbCh1bDJ6dW0oMFVMKSksdWwyenVtKDFVTCkpOworICB0X21heFtNQVhJTlRdPXRfbWF4KExMT05HKTsKKyAgdHVfbWF4W0NIQVJdPXVsMnp1bSgyNTVVTCk7CisgIHR1X21heFtTSE9SVF09dWwyenVtKDY1NTM1VUwpOworICB0dV9tYXhbSU5UXT11bDJ6dW0oNDI5NDk2NzI5NVVMKTsKKyAgdHVfbWF4W0xPTkddPXRfbWF4KFVOU0lHTkVEfElOVCk7CisgIHR1X21heFtMTE9OR109enVta29tcGwodWwyenVtKDBVTCkpOworICB0dV9tYXhbTUFYSU5UXT10X21heChVTlNJR05FRHxMTE9ORyk7CisgIAorICAvKiAgUmVzZXJ2ZSBhIGZldyByZWdpc3RlcnMgZm9yIHVzZSBieSB0aGUgY29kZS1nZW5lcmF0b3IuICAgICAgKi8KKyAgLyogIFRoaXMgaXMgbm90IG9wdGltYWwgYnV0IHNpbXBsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHNwPUZJUlNUX0dQUjsKKyAgdDE9RklSU1RfR1BSKzE7CisgIHQyPUZJUlNUX0dQUisyOworICBmMT1GSVJTVF9GUFI7CisgIGYyPUZJUlNUX0ZQUisxOworICByZWdzYVt0MV09cmVnc2FbdDJdPTE7CisgIHJlZ3NhW2YxXT1yZWdzYVtmMl09MTsKKyAgcmVnc2Fbc3BdPTE7CisgIHJlZ3NjcmF0Y2hbdDFdPXJlZ3NjcmF0Y2hbdDJdPTA7CisgIHJlZ3NjcmF0Y2hbZjFdPXJlZ3NjcmF0Y2hbZjJdPTA7CisgIHJlZ3NjcmF0Y2hbc3BdPTA7CisKKyAgZm9yKGk9RklSU1RfR1BSO2k8PUxBU1RfR1BSLVZPTF9HUFJTO2krKykKKyAgICByZWdzY3JhdGNoW2ldPTE7CisgIGZvcihpPUZJUlNUX0ZQUjtpPD1MQVNUX0ZQUi1WT0xfRlBSUztpKyspCisgICAgcmVnc2NyYXRjaFtpXT0xOworICBmb3IoaT1GSVJTVF9DQ1I7aTw9TEFTVF9DQ1ItVk9MX0NDUlM7aSsrKQorICAgIHJlZ3NjcmF0Y2hbaV09MTsKKworICB0YXJnZXRfbWFjcm9zPW1hcnJheTsKKworCisgIHJldHVybiAxOworfQorCit2b2lkIGluaXRfZGIoRklMRSAqZikKK3sKK30KKworaW50IGZyZXR1cm4oc3RydWN0IFR5cCAqdCkKKy8qICBSZXR1cm5zIHRoZSByZWdpc3RlciBpbiB3aGljaCB2YXJpYWJsZXMgb2YgdHlwZSB0IGFyZSByZXR1cm5lZC4gKi8KKy8qICBJZiB0aGUgdmFsdWUgY2Fubm90IGJlIHJldHVybmVkIGluIGEgcmVnaXN0ZXIgcmV0dXJucyAwLiAgICAgICAgKi8KKy8qICBBIHBvaW50ZXIgTVVTVCBiZSByZXR1cm5lZCBpbiBhIHJlZ2lzdGVyLiBUaGUgY29kZS1nZW5lcmF0b3IgICAgKi8KKy8qICBoYXMgdG8gc2ltdWxhdGUgYSBwc2V1ZG8gcmVnaXN0ZXIgaWYgbmVjZXNzYXJ5LiAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYoSVNGTE9BVCh0LT5mbGFncykpIAorICAgIHJldHVybiBGSVJTVF9GUFIrMjsKKyAgaWYoSVNTVFJVQ1QodC0+ZmxhZ3MpfHxJU1VOSU9OKHQtPmZsYWdzKSkgCisgICAgcmV0dXJuIDA7CisgIGlmKHptbGVxKHN6b2YodCksbDJ6bSg0TCkpKSAKKyAgICByZXR1cm4gRklSU1RfR1BSKzM7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworaW50IHJlZ19wYWlyKGludCByLHN0cnVjdCBycGFpciAqcCkKKy8qIFJldHVybnMgMCBpZiB0aGUgcmVnaXN0ZXIgaXMgbm8gcmVnaXN0ZXIgcGFpci4gSWYgciAgKi8KKy8qIGlzIGEgcmVnaXN0ZXIgcGFpciBub24temVybyB3aWxsIGJlIHJldHVybmVkIGFuZCB0aGUgKi8KKy8qIHN0cnVjdHVyZSBwb2ludGVkIHRvIHAgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgdHdvICAgKi8KKy8qIGVsZW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIGVzdGltYXRlIHRoZSBjb3N0LXNhdmluZyBpZiBvYmplY3QgbyBmcm9tIElDIHAgaXMgcGxhY2VkIGluCisgICByZWdpc3RlciByICovCitpbnQgY29zdF9zYXZpbmdzKHN0cnVjdCBJQyAqcCxpbnQgcixzdHJ1Y3Qgb2JqICpvKQoreworICBpbnQgYz1wLT5jb2RlOworICBpZihvLT5mbGFncyZWS09OU1QpeworICAgIGlmKCFMT0FEX1NUT1JFKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYobz09JnAtPnExJiZwLT5jb2RlPT1BU1NJR04mJihwLT56LmZsYWdzJkRSRUZPQkopKQorICAgICAgcmV0dXJuIDQ7CisgICAgZWxzZQorICAgICAgcmV0dXJuIDI7CisgIH0KKyAgaWYoby0+ZmxhZ3MmRFJFRk9CSikKKyAgICByZXR1cm4gNDsKKyAgaWYoYz09U0VUUkVUVVJOJiZyPT1wLT56LnJlZyYmIShvLT5mbGFncyZEUkVGT0JKKSkgcmV0dXJuIDM7CisgIGlmKGM9PUdFVFJFVFVSTiYmcj09cC0+cTEucmVnJiYhKG8tPmZsYWdzJkRSRUZPQkopKSByZXR1cm4gMzsKKyAgcmV0dXJuIDI7Cit9CisKK2ludCByZWdvayhpbnQgcixpbnQgdCxpbnQgbW9kZSkKKy8qICBSZXR1cm5zIDAgaWYgcmVnaXN0ZXIgciBjYW5ub3Qgc3RvcmUgdmFyaWFibGVzIG9mICAgKi8KKy8qICB0eXBlIHQuIElmIHQ9PVBPSU5URVIgYW5kIG1vZGUhPTAgdGhlbiBpdCByZXR1cm5zICAgKi8KKy8qICBub24temVybyBvbmx5IGlmIHRoZSByZWdpc3RlciBjYW4gc3RvcmUgYSBwb2ludGVyICAgKi8KKy8qICBhbmQgZGVyZWZlcmVuY2UgYSBwb2ludGVyIHRvIG1vZGUuICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYocj09MCkKKyAgICByZXR1cm4gMDsKKyAgdCY9TlE7CisgIGlmKHQ9PTAmJnI+PUZJUlNUX0NDUiYmcjw9TEFTVF9DQ1IpCisgICAgcmV0dXJuIDE7CisgIGlmKElTRkxPQVQodCkmJnI+PUZJUlNUX0ZQUiYmcjw9TEFTVF9GUFIpCisgICAgcmV0dXJuIDE7CisgIGlmKHQ9PVBPSU5URVImJnI+PUZJUlNUX0dQUiYmcjw9TEFTVF9HUFIpCisgICAgcmV0dXJuIDE7CisgIGlmKHQ+PUNIQVImJnQ8PUxPTkcmJnI+PUZJUlNUX0dQUiYmcjw9TEFTVF9HUFIpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitpbnQgZGFuZ2Vyb3VzX0lDKHN0cnVjdCBJQyAqcCkKKy8qICBSZXR1cm5zIHplcm8gaWYgdGhlIElDIHAgY2FuIGJlIHNhZmVseSBleGVjdXRlZCAgICAgKi8KKy8qICB3aXRob3V0IGRhbmdlciBvZiBleGNlcHRpb25zIG9yIHNpbWlsYXIgdGhpbmdzLiAgICAgKi8KKy8qICB2YmNjIG1heSBnZW5lcmF0ZSBjb2RlIGluIHdoaWNoIG5vbi1kYW5nZXJvdXMgSUNzICAgKi8KKy8qICBhcmUgc29tZXRpbWVzIGV4ZWN1dGVkIGFsdGhvdWdoIGNvbnRyb2wtZmxvdyBtYXkgICAgKi8KKy8qICBuZXZlciByZWFjaCB0aGVtIChtYWlubHkgd2hlbiBtb3ZpbmcgY29tcHV0YXRpb25zICAgKi8KKy8qICBvdXQgb2YgbG9vcHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUeXBpY2FsIElDcyB0aGF0IGdlbmVyYXRlIGV4Y2VwdGlvbnMgb24gc29tZSAgICAgICAgKi8KKy8qICBtYWNoaW5lcyBhcmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBhY2Nlc3NlcyB2aWEgcG9pbnRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBkaXZpc2lvbi9tb2R1bG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBvdmVyZmxvdyBvbiBzaWduZWQgaW50ZWdlci9mbG9hdHMgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGM9cC0+Y29kZTsKKyAgaWYoKHAtPnExLmZsYWdzJkRSRUZPQkopfHwocC0+cTIuZmxhZ3MmRFJFRk9CSil8fChwLT56LmZsYWdzJkRSRUZPQkopKQorICAgIHJldHVybiAxOworICBpZigoYz09RElWfHxjPT1NT0QpJiYhaXNjb25zdChxMikpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitpbnQgbXVzdF9jb252ZXJ0KGludCBvLGludCB0LGludCBjb25zdF9leHByKQorLyogIFJldHVybnMgemVybyBpZiBjb2RlIGZvciBjb252ZXJ0aW5nIG5wIHRvIHR5cGUgdCAgICAqLworLyogIGNhbiBiZSBvbWl0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE9uIHRoZSBQb3dlclBDIGNwdSBwb2ludGVycyBhbmQgMzJiaXQgICAgICAgICAgICAgICAqLworLyogIGludGVnZXJzIGhhdmUgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gYW5kIGNhbiB1c2UgICAqLworLyogIHRoZSBzYW1lIHJlZ2lzdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgb3A9byZOUSx0cD10Jk5ROworICBpZigob3A9PUlOVHx8b3A9PUxPTkd8fG9wPT1QT0lOVEVSKSYmKHRwPT1JTlR8fHRwPT1MT05HfHx0cD09UE9JTlRFUikpCisgICAgcmV0dXJuIDA7CisgIGlmKG9wPT1ET1VCTEUmJnRwPT1MRE9VQkxFKSByZXR1cm4gMDsKKyAgaWYob3A9PUxET1VCTEUmJnRwPT1ET1VCTEUpIHJldHVybiAwOworICByZXR1cm4gMTsKK30KKwordm9pZCBnZW5fZHMoRklMRSAqZix6bWF4IHNpemUsc3RydWN0IFR5cCAqdCkKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjcmVhdGUgPHNpemU+IGJ5dGVzIG9mIHN0b3JhZ2UgKi8KKy8qICBpbml0aWFsaXplZCB3aXRoIHplcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYobmV3b2JqJiZzZWN0aW9uIT1TUEVDSUFMKQorICAgIGVtaXQoZiwiJWxkXG4iLHptMmwoc2l6ZSkpOworICBlbHNlCisgICAgZW1pdChmLCJcdC5zcGFjZVx0JWxkXG4iLHptMmwoc2l6ZSkpOworICBuZXdvYmo9MDsKK30KKwordm9pZCBnZW5fYWxpZ24oRklMRSAqZix6bWF4IGFsaWduKQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIG1ha2Ugc3VyZSB0aGUgbmV4dCBkYXRhIGlzICAgICAqLworLyogIGFsaWduZWQgdG8gbXVsdGlwbGVzIG9mIDxhbGlnbj4gYnl0ZXMuICAgICAgICAgICAgICAqLworeworICBpZih6bTJsKGFsaWduKT4xKSBlbWl0KGYsIlx0LmFsaWduXHQyXG4iKTsKK30KKwordm9pZCBnZW5fdmFyX2hlYWQoRklMRSAqZixzdHJ1Y3QgVmFyICp2KQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSB0aGUgaGVhZCBvZiBhIHZhcmlhYmxlICAqLworLyogIGRlZmluaXRpb24sIGkuZS4gdGhlIGxhYmVsIGFuZCBpbmZvcm1hdGlvbiBmb3IgICAgICAqLworLyogIGxpbmthZ2UgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgY29uc3RmbGFnO2NoYXIgKnNlYzsKKyAgaWYodi0+Y2xpc3QpIGNvbnN0ZmxhZz1pc19jb25zdCh2LT52dHlwKTsKKyAgaWYodi0+c3RvcmFnZV9jbGFzcz09U1RBVElDKXsKKyAgICBpZihJU0ZVTkModi0+dnR5cC0+ZmxhZ3MpKSByZXR1cm47CisgICAgaWYoIXNwZWNpYWxfc2VjdGlvbihmLHYpKXsKKyAgICAgIGlmKHYtPmNsaXN0JiYoIWNvbnN0ZmxhZ3x8KGdfZmxhZ3NbMl0mVVNFREZMQUcpKSYmc2VjdGlvbiE9REFUQSl7ZW1pdChmLGRhdGFuYW1lKTtpZihmKSBzZWN0aW9uPURBVEE7fQorICAgICAgaWYodi0+Y2xpc3QmJmNvbnN0ZmxhZyYmIShnX2ZsYWdzWzJdJlVTRURGTEFHKSYmc2VjdGlvbiE9Uk9EQVRBKXtlbWl0KGYscm9kYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1ST0RBVEE7fQorICAgICAgaWYoIXYtPmNsaXN0JiZzZWN0aW9uIT1CU1Mpe2VtaXQoZixic3NuYW1lKTtpZihmKSBzZWN0aW9uPUJTUzt9CisgICAgfQorICAgIGlmKHYtPmNsaXN0fHxzZWN0aW9uPT1TUEVDSUFMKXsKKyAgICAgIGdlbl9hbGlnbihmLGZhbGlnbih2LT52dHlwKSk7CisgICAgICBlbWl0KGYsIiVzJWxkOlxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKyAgICB9ZWxzZQorICAgICAgZW1pdChmLCJcdC5sY29tbVx0JXMlbGQsIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKyAgICBuZXdvYmo9MTsKKyAgfQorICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4peworICAgIGVtaXQoZiwiXHQuZ2xvYmxcdCVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgaWYodi0+ZmxhZ3MmKERFRklORUR8VEVOVEFUSVZFKSl7CisgICAgICBpZighc3BlY2lhbF9zZWN0aW9uKGYsdikpeworCWlmKHYtPmNsaXN0JiYoIWNvbnN0ZmxhZ3x8KGdfZmxhZ3NbMl0mVVNFREZMQUcpKSYmc2VjdGlvbiE9REFUQSl7ZW1pdChmLGRhdGFuYW1lKTtpZihmKSBzZWN0aW9uPURBVEE7fQorCWlmKHYtPmNsaXN0JiZjb25zdGZsYWcmJiEoZ19mbGFnc1syXSZVU0VERkxBRykmJnNlY3Rpb24hPVJPREFUQSl7ZW1pdChmLHJvZGF0YW5hbWUpO2lmKGYpIHNlY3Rpb249Uk9EQVRBO30KKwlpZighdi0+Y2xpc3QmJnNlY3Rpb24hPUJTUyl7ZW1pdChmLGJzc25hbWUpO2lmKGYpIHNlY3Rpb249QlNTO30KKyAgICAgIH0KKyAgICAgIGlmKHYtPmNsaXN0fHxzZWN0aW9uPT1TUEVDSUFMKXsKKwlnZW5fYWxpZ24oZixmYWxpZ24odi0+dnR5cCkpOworICAgICAgICBlbWl0KGYsIiVzJXM6XG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgICAgfWVsc2UKKyAgICAgICAgZW1pdChmLCJcdC5nbG9iYWxcdCVzJXNcblx0LiVzY29tbVx0JXMlcywiLGlkcHJlZml4LHYtPmlkZW50aWZpZXIsKFVTRV9DT01NT05TPyIiOiJsIiksaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgICBuZXdvYmo9MTsKKyAgICB9CisgIH0KK30KKwordm9pZCBnZW5fZGMoRklMRSAqZixpbnQgdCxzdHJ1Y3QgY29uc3RfbGlzdCAqcCkKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjcmVhdGUgc3RhdGljIHN0b3JhZ2UgICAgICAgICAgKi8KKy8qICBpbml0aWFsaXplZCB3aXRoIGNvbnN0LWxpc3QgcC4gICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgZW1pdChmLCJcdGRjLiVzXHQiLGR0KHQmTlEpKTsKKyAgaWYoIXAtPnRyZWUpeworICAgIGlmKElTRkxPQVQodCkpeworICAgICAgLyogIGF1Y2ggd2llZGVyIG5pY2h0IHNlaHIgc2Nob2VuIHVuZCBJRUVFIG5vZXRpZyAgICovCisgICAgICB1bnNpZ25lZCBjaGFyICppcDsKKyAgICAgIGlwPSh1bnNpZ25lZCBjaGFyICopJnAtPnZhbC52ZG91YmxlOworICAgICAgZW1pdChmLCIweCUwMnglMDJ4JTAyeCUwMngiLGlwWzBdLGlwWzFdLGlwWzJdLGlwWzNdKTsKKyAgICAgIGlmKCh0Jk5RKSE9RkxPQVQpeworCWVtaXQoZiwiLDB4JTAyeCUwMnglMDJ4JTAyeCIsaXBbNF0saXBbNV0saXBbNl0saXBbN10pOworICAgICAgfQorICAgIH1lbHNleworICAgICAgZW1pdHZhbChmLCZwLT52YWwsdCZOVSk7CisgICAgfQorICB9ZWxzZXsKKyAgICBlbWl0X29iaihmLCZwLT50cmVlLT5vLHQmTlUpOworICB9CisgIGVtaXQoZiwiXG4iKTtuZXdvYmo9MDsKK30KKworCisvKiAgVGhlIG1haW4gY29kZS1nZW5lcmF0aW9uIHJvdXRpbmUuICAgICAgICAgICAgICAgICAgICovCisvKiAgZiBpcyB0aGUgc3RyZWFtIHRoZSBjb2RlIHNob3VsZCBiZSB3cml0dGVuIHRvLiAgICAgICovCisvKiAgcCBpcyBhIHBvaW50ZXIgdG8gYSBkb3VibHkgbGlua2VkIGxpc3Qgb2YgSUNzICAgICAgICovCisvKiAgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gYm9keSB0byBnZW5lcmF0ZSBjb2RlIGZvci4gICovCisvKiAgdiBpcyBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb2Zmc2V0IGlzIHRoZSBzaXplIG9mIHRoZSBzdGFja2ZyYW1lIHRoZSBmdW5jdGlvbiAgICovCisvKiAgbmVlZHMgZm9yIGxvY2FsIHZhcmlhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3ZvaWQgZ2VuX2NvZGUoRklMRSAqZixzdHJ1Y3QgSUMgKnAsc3RydWN0IFZhciAqdix6bWF4IG9mZnNldCkKKy8qICBUaGUgbWFpbiBjb2RlLWdlbmVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBjLHQsaTsKKyAgc3RydWN0IElDICptOworICBhcmdzaXplPTA7CisgIGlmKERFQlVHJjEpIHByaW50ZigiZ2VuX2NvZGUoKVxuIik7CisgIGZvcihjPTE7Yzw9TUFYUjtjKyspIHJlZ3NbY109cmVnc2FbY107CisgIG1heHB1c2hlZD0wOworCisgIC8qRklYTUUqLworICByZXQ9Ilx0cnRzXG4iOworCisgIGZvcihtPXA7bTttPW0tPm5leHQpeworICAgIGM9bS0+Y29kZTt0PW0tPnR5cGYmTlU7CisgICAgaWYoYz09QUxMT0NSRUcpIHtyZWdzW20tPnExLnJlZ109MTtjb250aW51ZTt9CisgICAgaWYoYz09RlJFRVJFRykge3JlZ3NbbS0+cTEucmVnXT0wO2NvbnRpbnVlO30KKworICAgIC8qIGNvbnZlcnQgTVVMVC9ESVYvTU9EIHdpdGggcG93ZXJzIG9mIHR3byAqLworICAgIGlmKCh0Jk5RKTw9TE9ORyYmKG0tPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUJiYodCZOUSk8PUxPTkcmJihjPT1NVUxUfHwoKGM9PURJVnx8Yz09TU9EKSYmKHQmVU5TSUdORUQpKSkpeworICAgICAgZXZhbF9jb25zdCgmbS0+cTIudmFsLHQpOworICAgICAgaT1wb2YyKHZtYXgpOworICAgICAgaWYoaSl7CisgICAgICAgIGlmKGM9PU1PRCl7CisgICAgICAgICAgdm1heD16bXN1Yih2bWF4LGwyem0oMUwpKTsKKyAgICAgICAgICBtLT5jb2RlPUFORDsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgdm1heD1sMnptKGktMSk7CisgICAgICAgICAgaWYoYz09RElWKSBtLT5jb2RlPVJTSElGVDsgZWxzZSBtLT5jb2RlPUxTSElGVDsKKyAgICAgICAgfQorICAgICAgICBjPW0tPmNvZGU7CisJZ3ZhbC52bWF4PXZtYXg7CisJZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworCWlmKGM9PUFORCl7CisJICBpbnNlcnRfY29uc3QoJm0tPnEyLnZhbCx0KTsKKwl9ZWxzZXsKKwkgIGluc2VydF9jb25zdCgmbS0+cTIudmFsLElOVCk7CisJICBwLT50eXBmMj1JTlQ7CisJfQorICAgICAgfQorICAgIH0KKyNpZiBGSVhFRF9TUAorICAgIGlmKGM9PUNBTEwmJmFyZ3NpemU8em0ybChtLT5xMi52YWwudm1heCkpIGFyZ3NpemU9em0ybChtLT5xMi52YWwudm1heCk7CisjZW5kaWYKKyAgfQorICBwZWVwaG9sZShwKTsKKworICBmb3IoYz0xO2M8PU1BWFI7YysrKXsKKyAgICBpZihyZWdzYVtjXXx8cmVndXNlZFtjXSl7CisgICAgICBCU0VUKHJlZ3NfbW9kaWZpZWQsYyk7CisgICAgfQorICB9CisKKyAgbG9jYWxzaXplPSh6bTJsKG9mZnNldCkrMykvNCo0OworI2lmIEZJWEVEX1NQCisgIC8qRklYTUU6IGFkanVzdCBsb2NhbHNpemUgdG8gZ2V0IGFuIGFsaWduZWQgc3RhY2stZnJhbWUgKi8KKyNlbmRpZgorCisgIGZ1bmN0aW9uX3RvcChmLHYsbG9jYWxzaXplKTsKKworI2lmIEZJWEVEX1NQCisgIHB1c2hlZD0wOworI2VuZGlmCisKKyAgZm9yKDtwO3A9cC0+bmV4dCl7CisgICAgYz1wLT5jb2RlO3Q9cC0+dHlwZjsKKyAgICBpZihjPT1OT1ApIHtwLT56LmZsYWdzPTA7Y29udGludWU7fQorICAgIGlmKGM9PUFMTE9DUkVHKSB7cmVnc1twLT5xMS5yZWddPTE7Y29udGludWU7fQorICAgIGlmKGM9PUZSRUVSRUcpIHtyZWdzW3AtPnExLnJlZ109MDtjb250aW51ZTt9CisgICAgaWYoYz09TEFCRUwpIHtlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCx0KTtjb250aW51ZTt9CisgICAgaWYoYz09QlJBKXsKKyAgICAgIGlmKDAvKnQ9PWV4aXRfbGFiZWwmJmZyYW1lc2l6ZT09MCovKQorCWVtaXQoZixyZXQpOworICAgICAgZWxzZQorCWVtaXQoZiwiXHRiXHQlcyVkXG4iLGxhYnByZWZpeCx0KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPj1CRVEmJmM8QlJBKXsKKyAgICAgIGVtaXQoZiwiXHRiJXNcdCIsY2NzW2MtQkVRXSk7CisgICAgICBpZihpc3JlZyhxMSkpeworCWVtaXRfb2JqKGYsJnAtPnExLDApOworCWVtaXQoZiwiLCIpOworICAgICAgfQorICAgICAgZW1pdChmLCIlcyVkXG4iLGxhYnByZWZpeCx0KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1NT1ZFVE9SRUcpeworICAgICAgbG9hZF9yZWcoZixwLT56LnJlZywmcC0+cTEscmVndHlwZVtwLT56LnJlZ10tPmZsYWdzKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1NT1ZFRlJPTVJFRyl7CisgICAgICBzdG9yZV9yZWcoZixwLT56LnJlZywmcC0+cTEscmVndHlwZVtwLT56LnJlZ10tPmZsYWdzKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZigoYz09QVNTSUdOfHxjPT1QVVNIKSYmKCh0Jk5RKT5QT0lOVEVSfHwoKHQmTlEpPT1DSEFSJiZ6bTJsKHAtPnEyLnZhbC52bWF4KSE9MSkpKXsKKyAgICAgIGllcnJvcigwKTsKKyAgICB9CisgICAgLyogc3dpdGNoIGNvbW11dGF0aXZlIG9wZXJhbmRzIGlmIHN1aXRhYmxlICovCisgICAgaWYoYz09QUREfHxjPT1NVUxUfHxjPT1BTkR8fGM9PVhPUnx8Yz09T1IpeworICAgICAgaWYoY29tcGFyZV9vYmplY3RzKCZwLT5xMiwmcC0+eikpeworCXN0cnVjdCBvYmogdG1wOworCXRtcD1wLT5xMTsKKwlwLT5xMT1wLT5xMjsKKwlwLT5xMj10bXA7CisgICAgICB9CisgICAgfQorCisgICAgcD1wcmVsb2FkKGYscCk7CisgICAgYz1wLT5jb2RlOworICAgIGlmKGM9PVNVQlBGUCkgYz1TVUI7CisgICAgaWYoYz09QURESTJQKSBjPUFERDsKKyAgICBpZihjPT1TVUJJRlApIGM9U1VCOworICAgIGlmKGM9PUNPTlZFUlQpeworICAgICAgaWYoSVNGTE9BVChxMXR5cChwKSl8fElTRkxPQVQoenR5cChwKSkpIGllcnJvcigwKTsKKyAgICAgIGlmKHNpemV0YWJbcTF0eXAocCkmTlFdPHNpemV0YWJbenR5cChwKSZOUV0peworCWlmKHExdHlwKHApJlVOU0lHTkVEKQorCSAgZW1pdChmLCJcdHpleHQuJXNcdCVzXG4iLGR0KHExdHlwKHApKSxyZWduYW1lc1t6cmVnXSk7CisJZWxzZQorCSAgZW1pdChmLCJcdHNleHQuJXNcdCVzXG4iLGR0KHExdHlwKHApKSxyZWduYW1lc1t6cmVnXSk7CisgICAgICB9CisgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PUtPTVBMRU1FTlQpeworICAgICAgbG9hZF9yZWcoZix6cmVnLCZwLT5xMSx0KTsKKyAgICAgIGVtaXQoZiwiXHRjcGwuJXNcdCVzXG4iLGR0KHQpLHJlZ25hbWVzW3pyZWddKTsKKyAgICAgIHNhdmVfcmVzdWx0KGYscCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09U0VUUkVUVVJOKXsKKyAgICAgIGxvYWRfcmVnKGYscC0+ei5yZWcsJnAtPnExLHQpOworICAgICAgQlNFVChyZWdzX21vZGlmaWVkLHAtPnoucmVnKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1HRVRSRVRVUk4peworICAgICAgaWYocC0+cTEucmVnKXsKKyAgICAgICAgenJlZz1wLT5xMS5yZWc7CisJc2F2ZV9yZXN1bHQoZixwKTsKKyAgICAgIH1lbHNlCisgICAgICAgIHAtPnouZmxhZ3M9MDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1DQUxMKXsKKyAgICAgIGludCByZWc7CisgICAgICAvKkZJWE1FKi8KKyNpZiAwICAgICAgCisgICAgICBpZihzdGFja192YWxpZCYmKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJnAtPnExLnYtPmZpJiYocC0+cTEudi0+ZmktPmZsYWdzJkFMTF9TVEFDSykpeworCWlmKGZyYW1lc2l6ZSt6dW0ydWwocC0+cTEudi0+ZmktPnN0YWNrMSk+c3RhY2spCisJICBzdGFjaz1mcmFtZXNpemUrenVtMnVsKHAtPnExLnYtPmZpLT5zdGFjazEpOworICAgICAgfWVsc2UKKwlzdGFja192YWxpZD0wOworI2VuZGlmCisgICAgICBpZigocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmcC0+cTEudi0+ZmkmJnAtPnExLnYtPmZpLT5pbmxpbmVfYXNtKXsKKyAgICAgICAgZW1pdF9pbmxpbmVfYXNtKGYscC0+cTEudi0+ZmktPmlubGluZV9hc20pOworICAgICAgfWVsc2V7CisJZW1pdChmLCJcdGNhbGxcdCIpOworCWVtaXRfb2JqKGYsJnAtPnExLHQpOworCWVtaXQoZiwiXG4iKTsKKyAgICAgIH0KKyAgICAgIC8qRklYTUUqLworI2lmIEZJWEVEX1NQCisgICAgICBwdXNoZWQtPXptMmwocC0+cTIudmFsLnZtYXgpOworI2VuZGlmCisgICAgICBpZigocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmcC0+cTEudi0+ZmkmJihwLT5xMS52LT5maS0+ZmxhZ3MmQUxMX1JFR1MpKXsKKwlidnVuaXRlKHJlZ3NfbW9kaWZpZWQscC0+cTEudi0+ZmktPnJlZ3NfbW9kaWZpZWQsUlNJWkUpOworICAgICAgfWVsc2V7CisJaW50IGk7CisJZm9yKGk9MTtpPD1NQVhSO2krKyl7CisJICBpZihyZWdzY3JhdGNoW2ldKSBCU0VUKHJlZ3NfbW9kaWZpZWQsaSk7CisJfQorICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PUFTU0lHTnx8Yz09UFVTSCl7CisgICAgICBpZih0PT0wKSBpZXJyb3IoMCk7CisgICAgICBpZihjPT1QVVNIKXsKKyNpZiBGSVhFRF9TUAorCWVtaXQoZiwiXHRtb3YuJXNcdCVsZCglcyksIixkdCh0KSxwdXNoZWQscmVnbmFtZXNbc3BdKTsKKwllbWl0X29iaihmLCZwLT5xMSx0KTsKKwllbWl0KGYsIlxuIik7CisJcHVzaGVkKz16bTJsKHAtPnEyLnZhbC52bWF4KTsKKyNlbHNlCisJZW1pdChmLCJcdHB1c2guJXNcdCIsZHQodCkpOworCWVtaXRfb2JqKGYsJnAtPnExLHQpOworCWVtaXQoZiwiXG4iKTsKKwlwdXNoKHptMmwocC0+cTIudmFsLnZtYXgpKTsKKyNlbmRpZgorCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoYz09QVNTSUdOKXsKKwlsb2FkX3JlZyhmLHpyZWcsJnAtPnExLHQpOworCXNhdmVfcmVzdWx0KGYscCk7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09QUREUkVTUyl7CisgICAgICBsb2FkX2FkZHJlc3MoZix6cmVnLCZwLT5xMSxQT0lOVEVSKTsKKyAgICAgIHNhdmVfcmVzdWx0KGYscCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09TUlOVVMpeworICAgICAgbG9hZF9yZWcoZix6cmVnLCZwLT5xMSx0KTsKKyAgICAgIGVtaXQoZiwiXHRuZWcuJXNcdCVzXG4iLGR0KHQpLHJlZ25hbWVzW3pyZWddKTsKKyAgICAgIHNhdmVfcmVzdWx0KGYscCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09VEVTVCl7CisgICAgICBlbWl0KGYsIlx0dHN0LiVzXHQiLGR0KHQpKTsKKyAgICAgIGlmKG11bHRpcGxlX2NjcykKKwllbWl0KGYsIiVzLCIscmVnbmFtZXNbenJlZ10pOworICAgICAgZW1pdF9vYmooZiwmcC0+cTEsdCk7CisgICAgICBlbWl0KGYsIlxuIik7CisgICAgICBpZihtdWx0aXBsZV9jY3MpCisJc2F2ZV9yZXN1bHQoZixwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1DT01QQVJFKXsKKyAgICAgIGVtaXQoZiwiXHRjbXAuJXNcdCIsZHQodCkpOworICAgICAgaWYobXVsdGlwbGVfY2NzKQorCWVtaXQoZiwiJXMsIixyZWduYW1lc1t6cmVnXSk7CisgICAgICBlbWl0X29iaihmLCZwLT5xMSx0KTsKKyAgICAgIGVtaXQoZiwiLCIpOworICAgICAgZW1pdF9vYmooZiwmcC0+cTIsdCk7CisgICAgICBlbWl0KGYsIlxuIik7CisgICAgICBpZihtdWx0aXBsZV9jY3MpCisJc2F2ZV9yZXN1bHQoZixwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZigoYz49T1ImJmM8PUFORCl8fChjPj1MU0hJRlQmJmM8PU1PRCkpeworICAgICAgaWYoIVRIUkVFX0FERFIpCisJbG9hZF9yZWcoZix6cmVnLCZwLT5xMSx0KTsKKyAgICAgIGlmKGM+PU9SJiZjPD1BTkQpCisJZW1pdChmLCJcdCVzLiVzXHQlcywiLGxvZ2ljYWxzW2MtT1JdLGR0KHQpLHJlZ25hbWVzW3pyZWddKTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIlx0JXMuJXNcdCVzLCIsYXJpdGhtZXRpY3NbYy1MU0hJRlRdLGR0KHQpLHJlZ25hbWVzW3pyZWddKTsKKyAgICAgIGlmKFRIUkVFX0FERFIpeworCWVtaXRfb2JqKGYsJnAtPnExLHQpOworCWVtaXQoZiwiLCIpOworICAgICAgfQorICAgICAgZW1pdF9vYmooZiwmcC0+cTIsdCk7CisgICAgICBlbWl0KGYsIlxuIik7CisgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIHByaWMyKHN0ZG91dCxwKTsKKyAgICBpZXJyb3IoMCk7CisgIH0KKyAgZnVuY3Rpb25fYm90dG9tKGYsdixsb2NhbHNpemUpOworICBpZihzdGFja192YWxpZCl7CisgICAgaWYoIXYtPmZpKSB2LT5maT1uZXdfZmkoKTsKKyAgICB2LT5maS0+ZmxhZ3N8PUFMTF9TVEFDSzsKKyAgICB2LT5maS0+c3RhY2sxPXN0YWNrOworICB9CisgIGVtaXQoZiwiIyBzdGFja3NpemU9JWx1JXNcbiIsenVtMnVsKHN0YWNrKSxzdGFja192YWxpZD8iIjoiKz8/Iik7Cit9CisKK2ludCBzaG9ydGN1dChpbnQgY29kZSxpbnQgdHlwKQoreworICByZXR1cm4gMDsKK30KKworaW50IHJlZ19wYXJtKHN0cnVjdCByZWdfaGFuZGxlICptLCBzdHJ1Y3QgVHlwICp0LGludCB2YXJhcmcsc3RydWN0IFR5cCAqZCkKK3sKKyAgaW50IGY7CisgIGY9dC0+ZmxhZ3MmTlE7CisgIGlmKGY8PUxPTkd8fGY9PVBPSU5URVIpeworICAgIGlmKG0tPmdyZWdzPj1HUFJfQVJHUykKKyAgICAgIHJldHVybiAwOworICAgIGVsc2UKKyAgICAgIHJldHVybiBGSVJTVF9HUFIrMyttLT5ncmVncysrOworICB9CisgIGlmKElTRkxPQVQoZikpeworICAgIGlmKG0tPmZyZWdzPj1GUFJfQVJHUykKKyAgICAgIHJldHVybiAwOworICAgIGVsc2UKKyAgICAgIHJldHVybiBGSVJTVF9GUFIrMittLT5mcmVncysrOworICB9CisgIHJldHVybiAwOworfQorCitpbnQgaGFuZGxlX3ByYWdtYShjb25zdCBjaGFyICpzKQoreworfQordm9pZCBjbGVhbnVwX2NnKEZJTEUgKmYpCit7Cit9Cit2b2lkIGNsZWFudXBfZGIoRklMRSAqZikKK3sKKyAgaWYoZikgc2VjdGlvbj0tMTsKK30KKwpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvYmMxNi9tYWNoaW5lLmR0IGIvbWFjaGluZXMvYmMxNi9tYWNoaW5lLmR0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNkMmNkZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9iYzE2L21hY2hpbmUuZHQKQEAgLTAsMCArMSwxNiBAQAorUzhCUworUzhCVQorUzE2QlNCRSBTMTZCU0xFCitTMTZCVUJFIFMxNkJVTEUKK1MxNkJTQkUgUzE2QlNMRQorUzE2QlVCRSBTMTZCVUxFCitTMzJCU0JFIFMzMkJTTEUKK1MzMkJVQkUgUzMyQlVMRQorUzY0QlNCRSBTNjRCU0xFCitTNjRCVUJFIFM2NEJVTEUKK1MzMkJJRUVFQkUKK1M2NEJJRUVFQkUKK1M2NEJJRUVFQkUKK1MxNkJVQkUgUzE2QlVMRQorCisKZGlmZiAtLWdpdCBhL21hY2hpbmVzL2JjMTYvbWFjaGluZS5oIGIvbWFjaGluZXMvYmMxNi9tYWNoaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODM1NzliZQotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL2JjMTYvbWFjaGluZS5oCkBAIC0wLDAgKzEsMTUzIEBACisvKiAgRXhhbXBsZSBiYWNrZW5kIGZvciB2YmNjLCBpdCBtb2RlbHMgYSBnZW5lcmljIDMyYml0IFJJU0Mgb3IgQ0lTQworICAgIENQVS4KKworICAgIENvbmZpZ3VyYWJsZSBhdCBidWlsZC10aW1lIGFyZToKKyAgICAtIG51bWJlciBvZiAoMzJiaXQpIGdlbmVyYWwtcHVycG9zZS1yZWdpc3RlcnMKKyAgICAtIG51bWJlciBvZiAoNjRiaXQpIGZsb2F0aW5nLXBvaW50LXJlZ2lzdGVycworICAgIC0gbnVtYmVyIG9mICg4Yml0KSBjb25kaXRpb24tY29kZS1yZWdpc3RlcnMKKyAgICAtIG1lY2hhbmlzbSBmb3Igc3RhY2stYXJndW1lbnRzIChtb3Zpbmcgb3QgZml4ZWQgc3ApCisKKyAgICBJdCBhbGxvd3MgdG8gc2VsZWN0IGFzIHJ1bi10aW1lLW9wdGlvbnM6CisgICAgLSB0d28tIG9yIHRocmVlLWFkZHJlc3MgY29kZQorICAgIC0gbWVtb3J5IG9wZXJhbmRzIG9yIGxvYWQtc3RvcmUtYXJjaGl0ZWN0dXJlCisgICAgLSBudW1iZXIgb2YgcmVnaXN0ZXItYXJndW1lbnRzCisgICAgLSBudW1iZXIgb2YgY2FsbGVyLXNhdmUtcmVnaXN0ZXJzCisqLworCisvKiBidWlsLXRpbWUgY29uZmlndXJhYmxlIG9wdGlvbnM6ICovCisjZGVmaW5lIE5VTV9HUFJTIDgKKyNkZWZpbmUgTlVNX0ZQUlMgMAorI2RlZmluZSBOVU1fQ0NSUyAxCisjZGVmaW5lIEZJWEVEX1NQIDAKKworI2luY2x1ZGUgImR0LmgiCisKKy8qIGludGVybmFsbHkgdXNlZCBieSB0aGUgYmFja2VuZCAqLworI2RlZmluZSBGSVJTVF9HUFIgMQorI2RlZmluZSBMQVNUX0dQUiAoRklSU1RfR1BSK05VTV9HUFJTLTEpCisjZGVmaW5lIEZJUlNUX0ZQUiAoTEFTVF9HUFIrMSkKKyNkZWZpbmUgTEFTVF9GUFIgKEZJUlNUX0ZQUitOVU1fRlBSUy0xKQorI2RlZmluZSBGSVJTVF9DQ1IgKExBU1RfRlBSKzEpCisjZGVmaW5lIExBU1RfQ0NSIChGSVJTVF9DQ1IrTlVNX0NDUlMtMSkKKworLyogIFRoaXMgc3RydWN0IGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBtYWNoaW5lLXNwZWNpZmljICAgICAgICAgICAqLworLyogIGFkZHJlc3NpbmctbW9kZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEN1cnJlbnRseSBwb3NzaWJsZSBhcmUgKGNvbnN0LGdwcikgYW5kIChncHIsZ3ByKSAgICAgICAgICAgICAgICAqLworc3RydWN0IEFkZHJlc3NpbmdNb2RleworICAgIGludCBmbGFnczsKKyAgICBpbnQgYmFzZTsKKyAgICBsb25nIG9mZnNldDsKK307CisKKy8qICBUaGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUuICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFYUiBOVU1fR1BSUytOVU1fRlBSUytOVU1fQ0NSUworCisvKiAgTnVtYmVyIG9mIGNvbW1hbmRsaW5lLW9wdGlvbnMgdGhlIGNvZGUtZ2VuZXJhdG9yIGFjY2VwdHMuICAgICAgICovCisjZGVmaW5lIE1BWEdGIDIwCisKKy8qICBJZiB0aGlzIGlzIHNldCB0byB6ZXJvIHZiY2Mgd2lsbCBub3QgZ2VuZXJhdGUgSUNzIHdoZXJlIHRoZSAgICAgKi8KKy8qICB0YXJnZXQgb3BlcmFuZCBpcyB0aGUgc2FtZSBhcyB0aGUgMm5kIHNvdXJjZSBvcGVyYW5kLiAgICAgICAgICAgKi8KKy8qICBUaGlzIGNhbiBzb21ldGltZXMgc2ltcGxpZnkgdGhlIGNvZGUtZ2VuZXJhdG9yLCBidXQgdXN1YWxseSAgICAgKi8KKy8qICB0aGUgY29kZSBpcyBiZXR0ZXIgaWYgdGhlIGNvZGUtZ2VuZXJhdG9yIGFsbG93cyBpdC4gICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNFUTJBU1ogMQorCisvKiAgVGhpcyBzcGVjaWZpZXMgdGhlIHNtYWxsZXN0IGludGVnZXIgdHlwZSB0aGF0IGNhbiBiZSBhZGRlZCB0byBhICovCisvKiAgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JTkFEREkyUCBJTlQKKworLyogIElmIHRoZSBieXRlcyBvZiBhbiBpbnRlZ2VyIGFyZSBvcmRlcmVkIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSAgICAqLworLyogIGJ5dGUgZmlyc3QgYW5kIHRoZW4gZGVjcmVhc2luZyBzZXQgQklHRU5ESUFOIHRvIDEuICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdFTkRJQU4gMAorCisvKiAgSWYgdGhlIGJ5dGVzIG9mIGFuIGludGVnZXIgYXJlIG9yZGVyZWQgbGVzdCBzaWduaWZpY2FudCBieXRlICAgICovCisvKiAgYnl0ZSBmaXJzdCBhbmQgdGhlbiBpbmNyZWFzaW5nIHNldCBMSVRUTEVFTkRJQU4gdG8gMS4gICAgICAgICAgICovCisjZGVmaW5lIExJVFRMRUVORElBTiAxCisKKy8qICBOb3RlIHRoYXQgQklHRU5ESUFOIGFuZCBMSVRUTEVFTkRJQU4gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gICAgKi8KKworLyogIElmIHN3aXRjaC1zdGF0ZW1lbnRzIHNob3VsZCBiZSBnZW5lcmF0ZWQgYXMgYSBzZXF1ZW5jZSBvZiAgICAgICAqLworLyogIFNVQixUU1QsQkVRIElDcyByYXRoZXIgdGhhbiBDT01QQVJFLEJFUSBJQ3Mgc2V0IHRoaXMgdG8gMS4gICAgICAqLworLyogIFRoaXMgY2FuIHlpZWxkIGJldHRlciBjb2RlIG9uIHNvbWUgbWFjaGluZXMuICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTV0lUQ0hTVUJTIDAKKworLyogIEluIG9wdGltaXppbmcgY29tcGlsYXRpb24gY2VydGFpbiBsaWJyYXJ5IG1lbWNweS9zdHJjcHktY2FsbHMgICAqLworLyogIHdpdGggbGVuZ3RoIGtub3duIGF0IGNvbXBpbGUtdGltZSB3aWxsIGJlIGlubGluZWQgdXNpbmcgYW4gICAgICAqLworLyogIEFTU0lHTi1JQyBpZiB0aGUgc2l6ZSBpcyBsZXNzIG9yIGVxdWFsIHRvIElOTElORU1FTUNQWS4gICAgICAgICAqLworLyogIFRoZSB0eXBlIHVzZWQgZm9yIHRoZSBBU1NJR04tSUMgd2lsbCBiZSBVTlNJR05FRHxDSEFSLiAgICAgICAgICAqLworI2RlZmluZSBJTkxJTkVNRU1DUFkgMTAyNAorCisvKiAgUGFyYW1ldGVycyBhcmUgc29tZXRpbWVzIHBhc3NlZCBpbiByZWdpc3RlcnMgd2l0aG91dCBfX3JlZy4gICAgICovCisjZGVmaW5lIEhBVkVfUkVHUEFSTVMgMQorCisvKiAgUGFyYW1ldGVycyBvbiB0aGUgc3RhY2sgc2hvdWxkIGJlIHB1c2hlZCBpbiBvcmRlciByYXRoZXIgdGhhbiAgICovCisvKiAgaW4gcmV2ZXJzZSBvcmRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9SREVSRURfUFVTSCBGSVhFRF9TUAorCisvKiAgU3RydWN0dXJlIGZvciByZWdfcGFybSgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdHJ1Y3QgcmVnX2hhbmRsZXsKKyAgICB1bnNpZ25lZCBsb25nIGdyZWdzOworICAgIHVuc2lnbmVkIGxvbmcgZnJlZ3M7Cit9OworCisvKiAgV2UgaGF2ZSBzb21lIHRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZSBhdHRyaWJ1dGVzLiAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBVkVfVEFSR0VUX0FUVFJJQlVURVMKKworLyogV2UgaGF2ZSB0YXJnZXQtc3BlY2lmaWMgcHJhZ21hcyAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9QUkFHTUFTCisKKy8qICBXZSBrZWVwIHRyYWNrIG9mIGFsbCByZWdpc3RlcnMgbW9kaWZpZWQgYnkgYSBmdW5jdGlvbi4gICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9SRUdTX01PRElGSUVEIDEKKworLyogV2UgaGF2ZSBhIGltcGxlbWVudCBvdXIgb3duIGNvc3QtZnVuY3Rpb25zIHRvIGFkYXB0IAorICAgcmVnaXN0ZXItYWxsb2NhdGlvbiAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9SQUxMT0MgMQorI2RlZmluZSBjb3N0X21vdmVfcmVnKHgseSkgMQorI2RlZmluZSBjb3N0X2xvYWRfcmVnKHgseSkgMgorI2RlZmluZSBjb3N0X3NhdmVfcmVnKHgseSkgMgorI2RlZmluZSBjb3N0X3B1c2hwb3BfcmVnKHgpIDMKKworLyogc2l6ZSBvZiBidWZmZXIgZm9yIGFzbS1vdXRwdXQsIHRoaXMgY2FuIGJlIHVzZWQgdG8gZG8KKyAgIHBlZXBob2xlLW9wdGltaXphdGlvbnMgb2YgdGhlIGdlbmVyYXRlZCBhc3NlbWJseS1vdXRwdXQgKi8KKyNkZWZpbmUgRU1JVF9CVUZfTEVOIDEwMjQgLyogc2hvdWxkIGJlIGVub3VnaCAqLworLyogbnVtYmVyIG9mIGFzbS1vdXRwdXQgbGluZXMgYnVmZmVyZWQgKi8KKyNkZWZpbmUgRU1JVF9CVUZfREVQVEggNAorCisvKiAgV2UgaGF2ZSBubyBhc21fcGVlcGhvbGUgdG8gb3B0aW1pemUgYXNzZW1ibHktb3V0cHV0ICovCisjZGVmaW5lIEhBVkVfVEFSR0VUX1BFRVBIT0xFIDAKKworLyogd2UgZG8gbm90IGhhdmUgYSBtYXJrX2VmZl9pY3MgZnVuY3Rpb24sIHRoaXMgaXMgdXNlZCB0byBwcmV2ZW50CisgICBvcHRpbWl6YXRpb25zIG9uIGNvZGUgd2hpY2ggY2FuIGFscmVhZHkgYmUgaW1wbGVtZW50ZWQgYnkgZWZmaWNpZW50CisgICBhc3NlbWJseSAqLworI3VuZGVmIEhBVkVfVEFSR0VUX0VGRl9JQworCisvKiB3ZSBvbmx5IG5lZWQgdGhlIHN0YW5kYXJkIGRhdGEgdHlwZXMgKG5vIGJpdC10eXBlcywgZGlmZmVyZW50IHBvaW50ZXJzCisgICBldGMuKSAqLworI3VuZGVmIEhBVkVfRVhUX1RZUEVTCisjdW5kZWYgSEFWRV9UR1RfUFJJTlRWQUwKKworLyogd2UgZG8gbm90IG5lZWQgZXh0cmEgZWxlbWVudHMgaW4gdGhlIElDICovCisjdW5kZWYgSEFWRV9FWFRfSUMKKworLyogd2UgZG8gbm90IHVzZSB1bnNpZ25lZCBpbnQgYXMgc2l6ZV90IChidXQgdW5zaWduZWQgbG9uZywgdGhlIGRlZmF1bHQpICovCisjdW5kZWYgSEFWRV9JTlRfU0laRVQKKworLyogd2UgZG8gbm90IG5lZWQgcmVnaXN0ZXItcGFpcnMgKi8KKyN1bmRlZiBIQVZFX1JFR1BBSVJTCisKKworLyogZG8gbm90IGNyZWF0ZSBDT05WRVJUIElDcyBmcm9tIGludGVnZXJzIHNtYWxsZXIgdGhhbiBpbnQgdG8gZmxvYXRzICovCisjZGVmaW5lIE1JTl9JTlRfVE9fRkxPQVRfVFlQRSBJTlQKKworLyogZG8gbm90IGNyZWF0ZSBDT05WRVJUIElDcyBmcm9tIGZsb2F0cyB0byBpbnRzIHNtYWxsZXIgdGhhbiBpbnQgKi8KKyNkZWZpbmUgTUlOX0ZMT0FUX1RPX0lOVF9UWVBFIElOVAorCisvKiBkbyBub3QgY3JlYXRlIENPTlZFUlRfSUNzIGZyb20gZmxvYXRzIHRvIHVuc2lnbmVkIGludGVnZXJzICovCisjZGVmaW5lIEFWT0lEX0ZMT0FUX1RPX1VOU0lHTkVEIDEKKworLyogZG8gbm90IGNyZWF0ZSBDT05WRVJUX0lDcyBmcm9tIHVuc2lnbmVkIGludGVnZXJzIHRvIGZsb2F0cyAqLworI2RlZmluZSBBVk9JRF9VTlNJR05FRF9UT19GTE9BVCAxCisKKy8qIGNvbnZlcnQgbXVsdGlwbGljYXRpb25zL2RpdmlzaW9uIGJ5IHBvd2VycyBvZiB0d28gdG8gc2hpZnRzICovCisjZGVmaW5lIEhBVkVfUE9GMk9QVCAxCisKKyNkZWZpbmUgSEFWRV9XQU5UQk5FIDEKZGlmZiAtLWdpdCBhL21hY2hpbmVzL2JpMzg2L21hY2hpbmUuYyBiL21hY2hpbmVzL2JpMzg2L21hY2hpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zN2ZlN2ExCi0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvYmkzODYvbWFjaGluZS5jCkBAIC0wLDAgKzEsMTQ0NiBAQAorLyogIENvZGUgZ2VuZXJhdG9yIGZvciBJbnRlbCA4MDM4NiBvciBoaWdoZXIuCQkJKi8KKworI2luY2x1ZGUgInN1cHAuaCIKKworLyogV2FzIGdlaG9lcnQgaGllciBoaW4/ICovCisjZGVmaW5lIE5fU08gMTI4CisjZGVmaW5lIE5fTFNZTSAxMjgKKyNkZWZpbmUgTl9GVU4gMzYKKyNkZWZpbmUgTl9QU1lNIDEyOAorCitzdGF0aWMgY2hhciBGSUxFX1tdPV9fRklMRV9fOworCisvKiAgUHVibGljIGRhdGEgdGhhdCBNVVNUIGJlIHRoZXJlLgkJCQkqLworCisvKiBOYW1lIGFuZCBjb3B5cmlnaHQuICovCitjaGFyIGNnX2NvcHlyaWdodFtdPSJ2YmNjIGNvZGUtZ2VuZXJhdG9yIGZvciBpMzg2L0JFIFYwLjEgKGMpIGluIDE5OTcgYnkgVm9sa2VyIEJhcnRoZWxtYW5uIjsKKworLyogIENvbW1hbmRsaW5lLWZsYWdzIHRoZSBjb2RlLWdlbmVyYXRvciBhY2NlcHRzCQkqLworaW50IGdfZmxhZ3NbTUFYR0ZdPXtWQUxGTEFHLFZBTEZMQUcsMCwwLAorCQkgICAgMCwwLDAsMCwKKyAgICAgICAgICAgICAgICAgICAgMH07CitjaGFyICpnX2ZsYWdzX25hbWVbTUFYR0ZdPXsiY3B1IiwiZnB1Iiwibm8tZGVsYXllZC1wb3BwaW5nIiwiY29uc3QtaW4tZGF0YSIsCisJCQkgICAibWVyZ2UtY29uc3RhbnRzIiwiZWxmIiwibG9uZ2FsaWduIiwidXNlLWZyYW1lcG9pbnRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZyJ9OwordW5pb24gcHBpIGdfZmxhZ3NfdmFsW01BWEdGXTsKKworLyogIEFsaWdubWVudC1yZXF1aXJlbWVudHMgZm9yIGFsbCB0eXBlcyBpbiBieXRlcy4JCSovCit6bG9uZyBhbGlnblsxNl07CisKKy8qICBBbGlnbm1lbnQgdGhhdCBpcyBzdWZmaWNpZW50IGZvciBldmVyeSBvYmplY3QuCQkqLworemxvbmcgbWF4YWxpZ247CisKKy8qICBDSEFSX0JJVCBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUuCQkJCSovCit6bG9uZyBjaGFyX2JpdDsKKworLyogIFNpemVzIG9mIGFsbCBlbGVtZW50YXJ5IHR5cGVzIGluIGJ5dGVzLgkJCSovCit6bG9uZyBzaXpldGFiWzE2XTsKKworLyogIE1pbmltdW0gYW5kIE1heGltdW0gdmFsdWVzIGVhY2ggdHlwZSBjYW4gaGF2ZS4JCSovCisvKiAgTXVzdCBiZSBpbml0aWFsaXplZCBpbiBpbml0X2NnKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3psb25nIHRfbWluWzMyXTsKK3p1bG9uZyB0X21heFszMl07CisKKy8qICBOYW1lcyBvZiBhbGwgcmVnaXN0ZXJzLgkJCQkJKi8KK2NoYXIgKnJlZ25hbWVzW01BWFIrMV09eyJub3JlZyIsIiVlYXgiLCIlZWN4IiwiJWVkeCIsIiVlYngiLAorCQkJCSIlZXNpIiwiJWVkaSIsIiVlYnAiLCIlZXNwIiwKKwkJCQkiJXN0KDApIiwiJXN0KDEpIiwiJXN0KDIpIiwiJXN0KDMpIiwKKwkJCQkiJXN0KDQpIiwiJXN0KDUpIiwiJXN0KDYpIiwiJXN0KDcpIn07CisKKy8qICBUaGUgU2l6ZSBvZiBlYWNoIHJlZ2lzdGVyIGluIGJ5dGVzLiAJCQkqLworemxvbmcgcmVnc2l6ZVtNQVhSKzFdOworCisvKiAgcmVnc2FbcmVnXSE9MCBpZiBhIGNlcnRhaW4gcmVnaXN0ZXIgaXMgYWxsb2NhdGVkIGFuZCBzaG91bGQgKi8KKy8qICBub3QgYmUgdXNlZCBieSB0aGUgY29tcGlsZXIgcGFzcy4JCQkJKi8KK2ludCByZWdzYVtNQVhSKzFdOworCisvKiAgU3BlY2lmaWVzIHdoaWNoIHJlZ2lzdGVycyBtYXkgYmUgc2NyYXRjaGVkIGJ5IGZ1bmN0aW9ucy4JKi8KK2ludCByZWdzY3JhdGNoW01BWFIrMV09ezAsMSwxLDEsMCwwLDAsMCwwLDEsMSwxLDEsMSwxLDEsMX07CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgU29tZSBwcml2YXRlIGRhdGEgYW5kIGZ1bmN0aW9ucy4JKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgbG9uZyBtYWxpZ25bMTZdPXsxLDEsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMn07CitzdGF0aWMgbG9uZyBtc2l6ZXRhYlsxNl09ezAsMSwyLDQsNCw0LDgsMCw0LDAsMCwwLDQsMH07CisKKworI2RlZmluZSBEQVRBIDAKKyNkZWZpbmUgQlNTIDEKKyNkZWZpbmUgQ09ERSAyCisKK3N0YXRpYyBpbnQgc2VjdGlvbj0tMSxuZXdvYmo7CitzdGF0aWMgY2hhciAqY29kZW5hbWU9Ilx0LnRleHRcbiIsKmRhdGFuYW1lPSJcdC5kYXRhXG4iLCpic3NuYW1lPSIiOworc3RhdGljIGludCBpc19jb25zdChzdHJ1Y3QgVHlwICopOworc3RhdGljIGNvbnN0IGludCBheD0xLGN4PTIsZHg9MyxieD00LHNpPTUsZGk9NixicD03LHNwPTg7CitzdGF0aWMgY2hhciB4X3RbXT17Jz8nLCdiJywndycsJ2wnLCdsJywncycsJ2wnLCd2JywnbCcsJ2EnLCdzJywndScsJ2UnLCdmJywnPycsJz8nfTsKK3N0YXRpYyBpbnQgaXNfY29uc3Qoc3RydWN0IFR5cCAqKTsKK3N0YXRpYyB2b2lkIHByKEZJTEUgKixzdHJ1Y3QgSUMgKik7CitzdGF0aWMgdm9pZCBmdW5jdGlvbl90b3AoRklMRSAqLHN0cnVjdCBWYXIgKixsb25nKTsKK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX2JvdHRvbShGSUxFICpmLHN0cnVjdCBWYXIgKixsb25nKTsKKworI2RlZmluZSBpc3JlZyh4KSAoKHAtPnguZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRykKKworc3RhdGljIGxvbmcgbG9mZixzdGFja29mZnNldCxub3Rwb3BwZWQsZG9udHBvcDsKKworc3RhdGljIGNoYXIgKmNjc1tdPXsieiIsIm56IiwibCIsImdlIiwibGUiLCJnIiwibXAifTsKK3N0YXRpYyBjaGFyICpjY3VbXT17InoiLCJueiIsImIiLCJhZSIsImJlIiwiYSIsIm1wIn07CitzdGF0aWMgY2hhciAqbG9naWNhbHNbXT17Im9yIiwieG9yIiwiYW5kIn07CitzdGF0aWMgY2hhciAqYXJpdGhtZXRpY3NbXT17InNhbCIsInNhciIsImFkZCIsInN1YiIsImltdWwiLCJkaXYiLCJtb2QifTsKK3N0YXRpYyBjaGFyICpmYXJpdGhtZXRpY3NbXT17ImY/IiwiZj8iLCJmYWRkIiwiZnN1YiIsImZtdWwiLCJmZGl2IiwiZnN1YnIiLCJmZGl2ciJ9Oworc3RhdGljIGNoYXIgKmRjdFtdPXsiIiwiYnl0ZSIsInNob3J0IiwibG9uZyIsImxvbmciLCJsb25nIiwibG9uZyIsImxvbmciLCJsb25nIn07CitzdGF0aWMgcHVzaGVkc2l6ZSxwdXNob3JkZXI9MjsKK3N0YXRpYyBpbnQgZnN0WzhdOworc3RhdGljIGludCBjeGwsZGlsLHNpbDsKK3N0YXRpYyBjaGFyICppZHByZWZpeD0iXyIsKmxhYnByZWZpeD0ibCI7CisKK3N0YXRpYyBzdHJ1Y3QgZnBjb25zdGxpc3QgeworICAgIHN0cnVjdCBmcGNvbnN0bGlzdCAqbmV4dDsKKyAgICBpbnQgbGFiZWwsdHlwOworICAgIHVuaW9uIGF0eXBzIHZhbDsKK30gKmZpcnN0ZnBjOworCitzdGF0aWMgaW50IGFkZGZwY29uc3Qoc3RydWN0IG9iaiAqbyxpbnQgdCkKK3sKKyAgICBzdHJ1Y3QgZnBjb25zdGxpc3QgKnA9Zmlyc3RmcGM7CisgICAgdCY9TlE7CisgICAgaWYoZ19mbGFnc1s0XSZVU0VERkxBRyl7CisJZm9yKHA9Zmlyc3RmcGM7cDtwPXAtPm5leHQpeworCSAgICBpZih0PT1wLT50eXApeworCQlldmFsX2NvbnN0KCZwLT52YWwsdCk7CisJCWlmKHQ9PUZMT0FUJiZ6ZGVxdG8odmRvdWJsZSx6ZjJ6ZChvLT52YWwudmZsb2F0KSkpIHJldHVybihwLT5sYWJlbCk7CisJCWlmKHQ9PURPVUJMRSYmemRlcXRvKHZkb3VibGUsby0+dmFsLnZkb3VibGUpKSByZXR1cm4ocC0+bGFiZWwpOworCSAgICB9CisJfQorICAgIH0KKyAgICBwPW15bWFsbG9jKHNpemVvZihzdHJ1Y3QgZnBjb25zdGxpc3QpKTsKKyAgICBwLT5uZXh0PWZpcnN0ZnBjOworICAgIHAtPmxhYmVsPSsrbGFiZWw7CisgICAgcC0+dHlwPXQ7CisgICAgcC0+dmFsPW8tPnZhbDsKKyAgICBmaXJzdGZwYz1wOworICAgIHJldHVybihwLT5sYWJlbCk7Cit9CisKK3ZvaWQgdGl0bGUoRklMRSAqZikKK3sKKyAgc3RhdGljIGludCBkb25lOworICBleHRlcm4gY2hhciAqaW5uYW1lOyAvKmdybXBmKi8KKyAgaWYoIWRvbmUmJmYpeworICAgIGRvbmU9MTsKKyAgICBlbWl0KGYsIlx0LmZpbGVcdFwiJXNcIlxuIixpbm5hbWUpOworICB9Cit9IAorCitzdGF0aWMgdm9pZCBwcm9iajIoRklMRSAqZixzdHJ1Y3Qgb2JqICpwLGludCB0KQorLyogIEdpYnQgT2JqZWt0IGF1ZiBCaWxkc2NoaXJtIGF1cwkJCSovCit7CisgICAgaWYoKHAtPmZsYWdzJihEUkVGT0JKfFJFRykpPT0oRFJFRk9CSnxSRUcpKSBmcHJpbnRmKGYsIigiKTsKKyAgICBpZihwLT5mbGFncyZWQVJBRFIpIGZwcmludGYoZiwiJCIpOworICAgIGlmKChwLT5mbGFncyZWQVIpJiYhKHAtPmZsYWdzJlJFRykpIHsKKwlpZihwLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CisJICAgIGlmKHAtPnYtPm9mZnNldDwwKSBmcHJpbnRmKGYsIiVsZCglJWVzcCkiLChsb25nKShsb2ZmLXpsMmwocC0+di0+b2Zmc2V0KSt6bDJsKHAtPnZhbC52bG9uZykpLXN0YWNrb2Zmc2V0K3B1c2hlZHNpemUpOworCQllbHNlCSAgICAgICBmcHJpbnRmKGYsIiVsZCglJWVzcCkiLChsb25nKSh6bDJsKHAtPnYtPm9mZnNldCkremwybChwLT52YWwudmxvbmcpLXN0YWNrb2Zmc2V0KSk7CisJfWVsc2V7CisJICAgIGlmKCF6bGVxdG8obDJ6bCgwTCkscC0+dmFsLnZsb25nKSl7cHJpbnR2YWwoZiwmcC0+dmFsLExPTkcsMCk7ZnByaW50ZihmLCIrIik7fQorCSAgICBpZihwLT52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMmJihwLT52LT52dHlwLT5mbGFncyZOUSkhPUZVTktUKXsKKwkJZnByaW50ZihmLCIlcyVsZCIsbGFicHJlZml4LHpsMmwocC0+di0+b2Zmc2V0KSk7CisJICAgIH1lbHNleworCQlmcHJpbnRmKGYsIiVzJXMiLGlkcHJlZml4LHAtPnYtPmlkZW50aWZpZXIpOworCSAgICB9CisJfQorICAgIH0KKyAgICBpZihwLT5mbGFncyZSRUcpeworCWlmKHAtPnJlZz44KXsKKwkgICAgaW50IGk7CisJICAgIGZvcihpPTA7aTw4O2krKyl7CisJCWlmKGZzdFtpXT09cC0+cmVnKQorCQkgICAgZnByaW50ZihmLCIlcyIscmVnbmFtZXNbaSs5XSk7CisJICAgIH0KKwl9ZWxzZXsKKwkgICAgZnByaW50ZihmLCIlcyIscmVnbmFtZXNbcC0+cmVnXSk7CisJfQorICAgIH0KKyAgICBpZihwLT5mbGFncyZLT05TVCl7CisJaWYoKHQmTlEpPT1GTE9BVHx8KHQmTlEpPT1ET1VCTEUpeworCSAgICBmcHJpbnRmKGYsIiVzJWQiLGxhYnByZWZpeCxhZGRmcGNvbnN0KHAsdCkpOworCX1lbHNleworCSAgICBmcHJpbnRmKGYsIiQiKTtwcmludHZhbChmLCZwLT52YWwsdCZOVSwwKTsKKwl9CisgICAgfQorICAgIGlmKChwLT5mbGFncyYoRFJFRk9CSnxSRUcpKT09KERSRUZPQkp8UkVHKSkgZnByaW50ZihmLCIpIik7Cit9CitzdGF0aWMgdm9pZCBmeGNoKEZJTEUgKmYsaW50IGkpCit7CisgICAgaW50IG07CisgICAgZnByaW50ZihmLCJcdGZ4Y2hcdCVzXG4iLHJlZ25hbWVzW2krOV0pOworICAgIG09ZnN0WzBdO2ZzdFswXT1mc3RbaV07ZnN0W2ldPW07Cit9CitzdGF0aWMgaW50IGZyZWVzdCh2b2lkKQoreworICAgIGludCBpOworICAgIGZvcihpPTA7aTw4O2krKyl7CisJaWYoZnN0W2ldPDApIHJldHVybihpKTsKKyAgICB9CisgICAgZm9yKGk9MDtpPDg7aSsrKXsKKwlpZihmc3RbaV09PTApIHJldHVybihpKTsKKyAgICB9CisgICAgaWVycm9yKDApOworfQorc3RhdGljIHZvaWQgZnB1c2goRklMRSAqZikKK3sKKyAgICBpbnQgaTsKKyAgICBpZihmc3RbN10+MCl7CisJaT1mcmVlc3QoKTsKKwlpZihmc3RbaV09PTApIGZwcmludGYoZiwiXHRmZnJlZVx0JXNcbiIscmVnbmFtZXNbaSs5XSk7CisJZnhjaChmLGkpO2Z4Y2goZiw3KTsKKyAgICB9CisgICAgZm9yKGk9NztpPjA7aS0tKQorCWZzdFtpXT1mc3RbaS0xXTsKKyAgICBmc3RbMF09LTE7Cit9CitzdGF0aWMgdm9pZCBmcG9wKHZvaWQpCit7CisgICAgaW50IGk7CisvKiAgICBpZihmc3RbMF0+MCYmcmVnc1tmc3RbMF1dKSBpZXJyb3IoMCk7Ki8KKyAgICBmb3IoaT0wO2k8NztpKyspCisJZnN0W2ldPWZzdFtpKzFdOworICAgIGZzdFs3XT0tMTsKK30KK3N0YXRpYyB2b2lkIGZsb2FkKEZJTEUgKmYsc3RydWN0IG9iaiAqbyxpbnQgdCkKK3sKKyAgICBmcHJpbnRmKGYsIlx0ZmxkIik7CisgICAgaWYoKG8tPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpIGZwcmludGYoZiwiXHQiKTsKKwllbHNlIGZwcmludGYoZiwiJWNcdCIseF90W3QmTlFdKTsKKyAgICBwcm9iajIoZixvLHQpO2ZwcmludGYoZiwiXG4iKTsKKyAgICBmcHVzaChmKTsKK30KK3N0YXRpYyB2b2lkIGZzdG9yZShGSUxFICpmLHN0cnVjdCBvYmogKm8saW50IHQpCit7CisgICAgaW50IGk7CisgICAgaWYoKG8tPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpeworCWZvcihpPTA7aTw4O2krKykKKwkgICAgaWYoZnN0W2ldPT1vLT5yZWcpIGZzdFtpXT0tMTsKKwlmc3RbMF09by0+cmVnOworICAgIH1lbHNleworCWZwcmludGYoZiwiXHRmc3RwJWNcdCIseF90W3QmTlFdKTtwcm9iajIoZixvLHQpOworCWZwb3AoKTtmcHJpbnRmKGYsIlxuIik7CisgICAgfQorfQorc3RhdGljIHZvaWQgcHJmc3QoRklMRSAqZixjaGFyICpzKQoreworICAgIGludCBpOworICAgIGlmKERFQlVHPT0wKSByZXR1cm47CisgICAgZnByaW50ZihmLCIqXHQlc1x0IixzKTsKKyAgICBmb3IoaT0wO2k8ODtpKyspeworCWlmKGZzdFtpXT49MCl7CisJICAgIGlmKGZzdFtpXT09MCkgZnByaW50ZihmLCIrKysgIik7CisJICAgICAgZWxzZQkgIGZwcmludGYoZiwiJXMgIixyZWduYW1lc1tmc3RbaV1dKzMpOworCX1lbHNleworCSAgICBmcHJpbnRmKGYsIi0tLSAiKTsKKwl9CisgICAgfQorICAgIGZwcmludGYoZiwiXG4iKTsKK30KK3N0YXRpYyB2b2lkIGZpbml0KHZvaWQpCit7CisgICAgaW50IGk7CisgICAgZm9yKGk9MDtpPDg7aSsrKXsKKwlpZihyZWdzW2krOV0pCisJICAgIGZzdFtpXT1pKzk7CisJZWxzZQorCSAgICBmc3RbaV09LTE7CisgICAgfQorfQorc3RhdGljIHZvaWQgZm9yZGVyKEZJTEUgKmYpCit7CisgICAgaW50IGksbSx1bm9yZGVyZWQ7CisgICAgcHJmc3QoZiwiZm9yZGVyIik7CisgICAgZm9yKGk9MDtpPDg7aSsrKXsKKwlpZihmc3RbaV09PTApe2ZwcmludGYoZiwiXHRmZnJlZVx0JXNcbiIscmVnbmFtZXNbaSs5XSk7ZnN0W2ldPS0xO30KKyAgICB9CitvbG9vcDoKKyAgICB1bm9yZGVyZWQ9MDsKKyAgICBmb3IoaT0wO2k8ODtpKyspeworCWlmKGZzdFtpXT4wJiZmc3RbaV0hPWkrOSYmcmVnc1tmc3RbaV1dKXt1bm9yZGVyZWQ9MTticmVhazt9CisgICAgfQorICAgIGlmKCF1bm9yZGVyZWQpIHJldHVybjsKKyAgICBpZihmc3RbMF0+PTAmJnJlZ3NbZnN0WzBdXSl7CisJaWYoZnN0WzBdIT05KXsKKwkgICAgZnhjaChmLGZzdFswXS05KTsKKwkgICAgZ290byBvbG9vcDsKKwl9ZWxzZXsKKwkgICAgZnhjaChmLGZyZWVzdCgpKTsKKwl9CisgICAgfQorICAgIGZvcihpPTE7aTw4O2krKyl7CisJaWYoZnN0W2ldPj0wJiZmc3RbaV0hPWkrOSYmcmVnc1tmc3RbaV1dJiZmc3RbaV0hPTkpeworCSAgICBmeGNoKGYsaSk7CisJICAgIGdvdG8gb2xvb3A7CisJfQorICAgIH0KKyAgICBpZihyZWdzWzldKXsKKwlmb3IoaT0xO2k8ODtpKyspeworCSAgICBpZihmc3RbaV09PTkpeyBmeGNoKGYsaSk7cmV0dXJuO30KKwl9CisgICAgfQorfQorc3RhdGljIHZvaWQgcHIoRklMRSAqZixzdHJ1Y3QgSUMgKnApCit7CisgICAgaW50IGk7CisgICAgZm9yKDtwdXNob3JkZXI+MjtwdXNob3JkZXI+Pj0xKXsKKwlmb3IoaT0xO2k8PTg7aSsrKXsKKwkgICAgaWYocmVnc1tpXSZwdXNob3JkZXIpeworCQlmcHJpbnRmKGYsIlx0cG9wbFx0JXNcbiIscmVnbmFtZXNbaV0pOworCQlzdGFja29mZnNldCs9NDtyZWdzW2ldJj1+cHVzaG9yZGVyOworCSAgICB9CisJfQorICAgIH0KKyAgICBmb3IoaT0xO2k8PTg7aSsrKQorCWlmKHJlZ3NbaV0mMikgcmVnc1tpXSY9fjI7Cit9CisKKy8qQURBKi8KK3N0YXRpYyBpbnQgbG9jYWxfZGVidWdfbGluZV9jb3VudDsKK3N0YXRpYyBpbnQgbG9jYWxfZGVidWdfZnVuY19jb3VudDsKK3N0YXRpYyBjaGFyICogZGVidWdfb2Zmc2V0X2Z1bmMgPSBOVUxMOworCitzdGF0aWMgdm9pZCBlbWl0ZGVidWdsaW5lIChGSUxFICpmLCBpbnQgbGluZSkKK3sKKyAgaWYoZ19mbGFnc1s4XSZVU0VERkxBRyl7CisgICAgaWYgKGRlYnVnX29mZnNldF9mdW5jICYmIGxpbmUpCisgICAgICB7CisJLyoKKwkgIFRlbGwgR0RCIHRoYXQgYSBuZXcgbGluZSBzdGFydHMgaGVyZS4KKwkgIAorCSAgRm9ybWF0OiA2OCwwLDxsaW5lPiw8b2Zmc2V0PgorCSAgCisJICA8bGluZT4gaXMgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIKKwkgIDxvZmZzZXQ+IGlzIHRoZSBvZmZzZXQgdG8gdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisJICAqLworCWZwcmludGYgKGYsICIuc3RhYm4gNjgsMCwlZCwlc00lZC0lc1xuIiwgbGluZSwgbGFicHJlZml4LCBsb2NhbF9kZWJ1Z19saW5lX2NvdW50LCBkZWJ1Z19vZmZzZXRfZnVuYyk7CisJZnByaW50ZiAoZiwgIiVzTSVkOlxuIiwgbGFicHJlZml4LCBsb2NhbF9kZWJ1Z19saW5lX2NvdW50KTsKKwlsb2NhbF9kZWJ1Z19saW5lX2NvdW50ICsrOworICAgIH0KKyAgfQorfQorCisjaWZuZGVmIFBBVEhfTUFYCisjICAgZGVmaW5lIFBBVEhfTUFYICAxMDI0CisjZW5kaWYKKworc3RhdGljIGludCBuZXh0X2ZyZWVfdHlwZWlkID0gMzI7CisKK3N0YXRpYyB2b2lkIGJlZ2luX2ZpbGUgKEZJTEUgKmYsIGNoYXIgKm5hbWUpCit7CisgICAgY2hhciAqIHB0cjsKKyAgICBjaGFyIHBhdGhbUEFUSF9NQVhdOworICAgIGludCBsZW4xLCBsZW4yLCB0OworCisgICAgcHRyID0gc3RycmNociAobmFtZSwgJy8nKTsKKyAgICBpZiAoIXB0cikKKwlwdHIgPSBuYW1lLTE7CisKKyAgICAvKiBGaWxlbmFtZSB3aXRob3V0IHBhdGggKi8KKyAgICBmcHJpbnRmIChmLCAiXHQuZmlsZVx0XCIlc1wiXG4iLCBwdHIrMSk7CisgICAgZnByaW50ZiAoZiwgIlx0LnZlcnNpb25cdFwiMDEuMDFcIlxuIik7CisKKyAgICBnZXRjd2QgKHBhdGgsIHNpemVvZihwYXRoKSk7CisgICAgc3RyY2F0IChwYXRoLCAiLyIpOworICAgIGlmIChwdHIgIT0gbmFtZS0xKQorICAgIHsKKwlsZW4xID0gc3RybGVuKHBhdGgpOworCWxlbjIgPSBwdHItbmFtZTsKKwlzdHJuY3B5IChwYXRoK2xlbjEsIG5hbWUsIGxlbjIpOworCXBhdGhbbGVuMStsZW4yXSA9IDA7CisJc3RyY2F0IChwYXRoLCAiLyIpOworICAgIH0KKworICAgIC8qIEVtaXQgYWJzb2x1dGUgcGF0aCB0byBzb3VyY2UgZmlsZSBhbmQgdGhlIGZpbGVuYW1lIHdpdGggYW55CisJcGF0aCB0aGUgdXNlciBnYXZlIHRvIHRoZSBmcm9udGVuZCAqLworICAgIGZwcmludGYgKGYsICJcdC5zdGFicyBcIiVzXCIsJWQsMCwwLCVzdGV4dDBcbiIsIHBhdGgsIE5fU08sIGxhYnByZWZpeCk7CisgICAgZnByaW50ZiAoZiwgIlx0LnN0YWJzIFwiJXNcIiwlZCwwLDAsJXN0ZXh0MFxuIiwgbmFtZSwgTl9TTywgbGFicHJlZml4KTsKKyAgICBmcHJpbnRmIChmLCAiLnRleHRcbiVzdGV4dDA6XG4iLGxhYnByZWZpeCk7CisgICAgZnByaW50ZiAoZiwgIlx0LnN0YWJzICBcInZiY2NfY29tcGlsZWQuXCIsIDB4M2MsIDAsIDAsIDBcbiIpOworCisgICAgLyogRW1pdCB0eXBlcy4gRm9ybWF0IGlzOgorCisJIjxuYW1lPjo8dCMxPj08ciMyO21pbjttYXg7PiIsMTI4LDAsMCwwCisKKwkxMjgsMCwwLDAgdGVsbHMgR0RCIHRoaXMgaXMgYSB0eXBlIGRlZmluaXRpb24KKwk8bmFtZT4gaXMgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbC4KKwk8dCMxPiBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBhbmQgaXRzIG51bWJlcgorICAgICAgICA8ciMyO21pbjttYXg7PiBpcyBhIHJhbmdlLiBUaGUgbWluIGFuZCBtYXggdmFsdWVzIGFyZSBpbiB0aGUgZm9ybWF0CisgICAgICAgICAgICAgICBvZiB0aGUgdHlwZSAjMi4gbWluIGFuZCBtYXggdmFsdWVzIGZvciB0aGlzIHR5cGUgY2FuIGJlCisgICAgICAgICAgICAgICBvbWl0dGVkLgorICAgICAgICB2b2lkIGlzIGRlZmluZWQgYnkgPHQjMT0jMT4uCisgICAgICAqLworICAgIGZvciAodD1DSEFSOyB0PD1MT05HOyB0KyspCisgICAgICB7CisJZnByaW50ZiAoZiwgIi5zdGFicyBcIiVzOnQlZD1yJWQ7JWxkOyVsZDtcIiwlZCwwLDAsMFxuIiwgdHlwbmFtZVt0XSx0LHQ9PUNIQVIgPyBDSEFSOklOVCwKKwkJIHpsMmwodF9taW5bdF0pLHpsMmwodF9tYXhbdF0pLE5fTFNZTSk7CisJZnByaW50ZiAoZiwgIi5zdGFicyBcInVuc2lnbmVkICVzOnQlZD1yJWQ7JWx1OyVsdTtcIiwlZCwwLDAsMFxuIiwgdHlwbmFtZVt0XSwKKwkJIHR8VU5TSUdORUQsIElOVCwKKwkJIHp1bDJ1bCh0X21pblt0fFVOU0lHTkVEXSksenVsMnVsKHRfbWF4W3R8VU5TSUdORURdKSwgTl9MU1lNKTsKKyAgICAgIH0KKyAKKyAgICBmcHJpbnRmIChmLCAiLnN0YWJzIFwiZmxvYXQ6dCVkPXIlZDslbGQ7MDtcIiwlZCwwLDAsMFxuIiwKKwkgICAgIEZMT0FULElOVCx6bDJsKHNpemV0YWJbRkxPQVRdKSxOX0xTWU0pOworICAgIGZwcmludGYgKGYsICIuc3RhYnMgXCJkb3VibGU6dCVkPXIlZDslbGQ7MDtcIiwlZCwwLDAsMFxuIiwKKwkgICAgIERPVUJMRSxJTlQsemwybChzaXpldGFiW0RPVUJMRV0pLE5fTFNZTSk7CisgICAgZnByaW50ZiAoZiwgIi5zdGFicyBcInZvaWQ6dCVkPXIlZFwiLCVkLDAsMCwwXG4iLAorCSAgICAgVk9JRCxWT0lELE5fTFNZTSk7CisJICAgICAKKyAKKyAgICAvKgorICAgICAgZnByaW50ZiAoZiwgIi5zdGFicyBcImNoYXI6dDI9cjI7MDsxMjc7XCIsMTI4LDAsMCwwXG4iKTsKKyAgICAgIGZwcmludGYgKGYsICIuc3RhYnMgXCJpbnQ6dDE9cjE7LTIxNDc0ODM2NDg7MjE0NzQ4MzY0NztcIiwxMjgsMCwwLDBcbiIpOworICAgICAgZnByaW50ZiAoZiwgIi5zdGFicyBcImxvbmcgaW50OnQzPXIxOy0yMTQ3NDgzNjQ4OzIxNDc0ODM2NDc7XCIsMTI4LDAsMCwwXG4iKTsKKyAgICAgIGZwcmludGYgKGYsICIuc3RhYnMgXCJ1bnNpZ25lZCBpbnQ6dDQ9cjE7MDstMTtcIiwxMjgsMCwwLDBcbiIpOworICAgICAgZnByaW50ZiAoZiwgIi5zdGFicyBcImxvbmcgdW5zaWduZWQgaW50OnQ1PXIxOzA7LTE7XCIsMTI4LDAsMCwwXG4iKTsKKyAgICAgIGZwcmludGYgKGYsICIuc3RhYnMgXCJ2b2lkOnQxOT0xOVwiLDEyOCwwLDAsMFxuIik7CisgICAgICAqLworfQorCitzdGF0aWMgdm9pZCBkZWJ1Z19wcmludF9zdGFiX3R5cGUgKEZJTEUgKmYsIHN0cnVjdCBUeXAgKnR5cCkKK3sKKyAgaW50IHQgPSB0eXAtPmZsYWdzICYgTlU7CisgIAorICBpZiAodCA8PSBWT0lEKQorICAgIGZwcmludGYgKGYsICIlZCIsIHQpOworICBlbHNlIGlmICh0ID09IEFSUkFZIHx8IHQgPT0gUE9JTlRFUikKKyAgICB7CisgICAgICBmcHJpbnRmIChmLCAiJWQ9KiIsIG5leHRfZnJlZV90eXBlaWQrKyk7CisgICAgICBkZWJ1Z19wcmludF9zdGFiX3R5cGUgKGYsIHR5cC0+bmV4dCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWVycm9yKHQpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBmdW5jdGlvbl90b3AoRklMRSAqZixzdHJ1Y3QgVmFyICp2LGxvbmcgb2Zmc2V0KQorLyogIGVyemV1Z3QgRnVua3Rpb25za29wZgkJCSovCit7CisgICAgaW50IGk7CisgICAgc3RydWN0IHN0cnVjdF9kZWNsYXJhdGlvbiAqcDsKKworICAgIGlmKHNlY3Rpb24hPUNPREUpe2ZwcmludGYoZixjb2RlbmFtZSk7c2VjdGlvbj1DT0RFO30KKworICAgIC8qQURBKi8KKyAgICBpZihnX2ZsYWdzWzhdJlVTRURGTEFHKXsgLyp2YiovCisgICAgICBmcHJpbnRmIChmLCAiXHQuYWxpZ25cdDE2XG4iKTsKKyAgICAgIC8qIFRlbGwgR0RCIHRoYXQgYSBuZXcgZnVuY3Rpb24gc3RhcnRzIGhlcmUuCisJIAorCSBGb3JtYXQ6ICI8bmFtZT46Rjx0eXBlPiIsMzYsMCw8bGluZT4sPHN5bW5hbWU+CisJIAorCSA8bmFtZT4gSXMgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uCisJIDx0eXBlPiBpcyB0aGUgcmV0dXJuIHR5cGUgKG9ubHkgdGhlIG51bWJlciBhcyBkZWZpbmVkIGFib3ZlLCBpZS4KKwkgICAgICAgIGlmIGludCBpcyB0MSwgdGhlbiB0aGlzIGlzIDEpLgorCSA8bGluZT4gVGhlIGxpbmUgaW4gdGhlIHNvdXJjZQorCSA8c3ltbmFtZT4gVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBhcyBpdCBhcHBlYXJzIGluIHRoZSBvYmplY3QgZmlsZS4KKworCSBSaWdodCBub3csIGFsbCBmdW5jdGlvbnMgcmV0dXJuIHZvaWQuCisJICovCisKKyAgICAgIGZwcmludGYgKGYsICIuc3RhYnMgXCIlczpGIiwgdi0+aWRlbnRpZmllcik7CisgICAgICBkZWJ1Z19wcmludF9zdGFiX3R5cGUgKGYsIHYtPnZ0eXAtPm5leHQpOworICAgICAgZnByaW50ZiAoZiwgIlwiLCVkLDAsJWQsJXMlc1xuIiwgTl9GVU4sIGZsaW5lLCBpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgCisgICAgICBwPXYtPnZ0eXAtPmV4YWN0OworICAgICAgZm9yIChpPTA7IGk8cC0+Y291bnQ7IGkrKykKKwl7CisJICBpZigoKnAtPnNsKVtpXS5zdHlwLT5mbGFncz09Vk9JRCkgYnJlYWs7CisJICBmcHJpbnRmIChmLCAiLnN0YWJzIFwiJXM6cCIsICgqcC0+c2wpW2ldLmlkZW50aWZpZXIpOworCSAgZGVidWdfcHJpbnRfc3RhYl90eXBlIChmLCAoKnAtPnNsKVtpXS5zdHlwKTsKKwkgIC8qIFRPRE8gaSo0KzQgaXMgYSBjcnVkZSBtZXRob2QgdG8gZmluZCB0aGUgb2Zmc2V0IG9mIGEgcGFyYW1ldGVyIG9uCisJICAgICB0aGUgc3RhY2sgKi8KKwkgIGZwcmludGYgKGYsICJcIiwlZCwwLDAsJWRcbiIsIE5fUFNZTSwgaSo0KzQpOworCX0KKyAgICB9CisKKyAgICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pIGZwcmludGYoZiwiXHQuZ2xvYmxcdCVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgZnByaW50ZihmLCIlcyVzOlxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKworICAgIC8qQURBKi8KKyAgICBkZWJ1Z19vZmZzZXRfZnVuYz12LT5pZGVudGlmaWVyOworCisgICAgZm9yKHB1c2hlZHNpemU9MCxpPTE7aTxzcDtpKyspeworCWlmKHJlZ3VzZWRbaV0mJiFyZWdzY3JhdGNoW2ldKXsKKwkgICAgZnByaW50ZihmLCJcdHB1c2hsXHQlc1xuIixyZWduYW1lc1tpXSk7CisJICAgIHB1c2hlZHNpemUrPTQ7CisJfQorICAgIH0KKworICAgIGlmKG9mZnNldCkgZnByaW50ZihmLCJcdHN1YmxcdCQlbGQsJSVlc3BcbiIsb2Zmc2V0KTsKKyAgICBpZihnX2ZsYWdzWzddJlVTRURGTEFHKSBmcHJpbnRmKGYsIlx0bW92bFx0JXMsJXNcbiIscmVnbmFtZXNbc3BdLHJlZ25hbWVzWzddKTsKKyAgICBpZihnX2ZsYWdzWzhdJlVTRURGTEFHKXsKKyAgICAgIC8qIFRlbGwgR0RCIHRoYXQgdGhlIGNvZGUgb2YgdGhlIGZ1bmN0aW9uIHN0YXJ0cyBoZXJlICovCisgICAgICBlbWl0ZGVidWdsaW5lIChmLGZsaW5lKTsKKyAgICAgIGxvY2FsX2RlYnVnX2Z1bmNfY291bnQgKys7CisgICAgICBmcHJpbnRmIChmLCAiJXNCQiVkOlxuIiwgbGFicHJlZml4LCBsb2NhbF9kZWJ1Z19mdW5jX2NvdW50KTsKKyAgICB9Cit9CitzdGF0aWMgdm9pZCBmdW5jdGlvbl9ib3R0b20oRklMRSAqZixzdHJ1Y3QgVmFyICp2LGxvbmcgb2Zmc2V0KQorLyogIGVyemV1Z3QgRnVua3Rpb25zZW5kZQkJCSovCit7CisgICAgaW50IGk7CisgICAgZm9yZGVyKGYpOworCisgICAgaWYoZ19mbGFnc1s4XSZVU0VERkxBRyl7CisgICAgICBlbWl0ZGVidWdsaW5lIChmLGZsaW5lKTsKKyAgICAgIGZwcmludGYgKGYsICIlc0JFJWQ6XG4iLCBsYWJwcmVmaXgsIGxvY2FsX2RlYnVnX2Z1bmNfY291bnQpOworICAgIH0KKworICAgIGlmKG9mZnNldCkgZnByaW50ZihmLCJcdGFkZGxcdCQlbGQsJSVlc3BcbiIsb2Zmc2V0KTsKKyAgICBmb3IoaT1zcC0xO2k+MDtpLS0peworCWlmKHJlZ3VzZWRbaV0mJiFyZWdzY3JhdGNoW2ldKXsKKwkgICAgZnByaW50ZihmLCJcdHBvcGxcdCVzXG4iLHJlZ25hbWVzW2ldKTsKKwl9CisgICAgfQorICAgIGZwcmludGYoZiwiXHRyZXRcbiIpOworICAgIAorICAgIGlmKGdfZmxhZ3NbOF0mVVNFREZMQUcpeworICAgICAgZnByaW50ZiAoZiwgIiVzZmUlZDpcblx0LnNpemVcdCVzLCVzZmUlZC0lcyVzXG4iLCBsYWJwcmVmaXgsIGxvY2FsX2RlYnVnX2Z1bmNfY291bnQsIHYtPmlkZW50aWZpZXIsIGxhYnByZWZpeCwgbG9jYWxfZGVidWdfZnVuY19jb3VudCwgaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgICAvKiBUZWxsIEdEQiB0aGUgcmVhbCBzaXplIG9mIHRoZSBmdW5jdGlvbiAqLworICAgICAgZnByaW50ZiAoZiwgIi5zdGFibiAxOTIsMCwwLCVzQkIlZC0lcyVzXG4iLGxhYnByZWZpeCxsb2NhbF9kZWJ1Z19mdW5jX2NvdW50LCBpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICAgIGZwcmludGYgKGYsICIuc3RhYm4gMjI0LDAsMCwlc0JFJWQtJXMlc1xuIiwgbGFicHJlZml4LCBsb2NhbF9kZWJ1Z19mdW5jX2NvdW50LCBpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICB9Cit9CitzdGF0aWMgaW50IGlzX2NvbnN0KHN0cnVjdCBUeXAgKnQpCisvKiAgVGVzdHMgaWYgYSB0eXBlIGNhbiBiZSBwbGFjZWQgaW4gdGhlIGNvZGUtc2VjdGlvbi4JKi8KK3sKKyAgICBpZighKHQtPmZsYWdzJihDT05TVHxTVFJJTkdDT05TVCkpKXsKKwlkb3sKKwkgICAgaWYodC0+ZmxhZ3MmKENPTlNUfFNUUklOR0NPTlNUKSkgcmV0dXJuKDEpOworCSAgICBpZigodC0+ZmxhZ3MmTlEpIT1BUlJBWSkgcmV0dXJuKDApOworCSAgICB0PXQtPm5leHQ7CisJfXdoaWxlKDEpOworICAgIH1lbHNlIHJldHVybigxKTsKK30KK3N0YXRpYyBpbnQgY29tcGFyZV9vYmplY3RzKHN0cnVjdCBvYmogKm8xLHN0cnVjdCBvYmogKm8yKQoreworICAgIGlmKG8xLT5mbGFncz09bzItPmZsYWdzJiZvMS0+YW09PW8yLT5hbSl7CisJaWYoIShvMS0+ZmxhZ3MmVkFSKXx8KG8xLT52PT1vMi0+diYmemxlcXRvKG8xLT52YWwudmxvbmcsbzItPnZhbC52bG9uZykpKXsKKwkgICAgaWYoIShvMS0+ZmxhZ3MmUkVHKXx8bzEtPnJlZz09bzItPnJlZyl7CisJCXJldHVybigxKTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgcmV0dXJuKDApOworfQorc3RhdGljIGludCBnZXRfcmVnKEZJTEUgKmYsc3RydWN0IElDICpwKQoreworICAgIGludCBpOworICAgIC8qCUlmIHdlIGNhbiB1c2UgYSByZWdpc3RlciB3aGljaCB3YXMgYWxyZWFkeSB1c2VkIGJ5IHRoZSBjb21waWxlciAqLworICAgIC8qCW9yIGl0IGlzIGEgc3JhdGNoIHJlZ2lzdGVyIHRoZW4gd2UgY2FuIHVzZSBpdCB3aXRob3V0IHByb2JsZW1zLiAqLworICAgIGZvcihpPTE7aTw9ODtpKyspeworCWlmKCFyZWdzW2ldJiYocmVndXNlZFtpXXx8cmVnc2NyYXRjaFtpXSkpeworCSAgICByZWdzW2ldPTI7CisJICAgIHJldHVybihpKTsKKwl9CisgICAgfQorICAgIC8qCU90aGVyd2lzZSB3ZSBoYXZlIHRvIHNhdmUgdGhpcyByZWdpc3Rlci4JCQkqLworICAgIC8qCVdlIG1heSBub3QgdXNlIGEgcmVnaXN0ZXIgd2hpY2ggaXMgdXNlZCBpbiB0aGlzIElDLgkJKi8KKyAgICBmb3IoaT0xO2k8PTg7aSsrKXsKKwlpZihyZWdzW2ldPDIKKwkgICAgJiYoIShwLT5xMS5mbGFncyZSRUcpfHxwLT5xMS5yZWchPWkpCisJICAgICYmKCEocC0+cTIuZmxhZ3MmUkVHKXx8cC0+cTIucmVnIT1pKQorCSAgICAmJighKHAtPnouZmxhZ3MmUkVHKXx8cC0+ei5yZWchPWkpICl7CisKKwkgICAgZnByaW50ZihmLCJcdHB1c2hsXHQlc1xuIixyZWduYW1lc1tpXSk7CisJICAgIC8qCU1hcmsgcmVnaXN0ZXIgYXMgcHVzaGVkICh0YWtpbmcgY2FyZSBvZiB0aGUgb3JkZXIpLiAqLworCSAgICBwdXNob3JkZXI8PD0xOyByZWdzW2ldfD1wdXNob3JkZXI7CisJICAgIHN0YWNrb2Zmc2V0LT00OworCSAgICByZXR1cm4oaSk7CisJfQorICAgIH0KKyAgICBpZXJyb3IoMCk7Cit9CitzdGF0aWMgdm9pZCBtb3ZlKEZJTEUgKmYsc3RydWN0IG9iaiAqcSxpbnQgcXIsc3RydWN0IG9iaiAqeixpbnQgenIsaW50IHQpCisvKiAgR2VuZXJhdGVzIGNvZGUgdG8gbW92ZSBvYmplY3QgcSAob3IgcmVnaXN0ZXIgcXIpIGludG8gb2JqZWN0IHogKG9yICAqLworLyogIHJlZ2lzdGVyIHpyKS4JCQkJCQkJKi8KK3sKKyAgICBpZihxJiYocS0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRykgcXI9cS0+cmVnOworICAgIGlmKHomJih6LT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKSB6cj16LT5yZWc7CisgICAgaWYocXImJnpyKXsKKwlpZihxciE9enIpCisJICAgIGZwcmludGYoZiwiXHRtb3ZsXHQlcywlc1xuIixyZWduYW1lc1txcl0scmVnbmFtZXNbenJdKTsKKwlyZXR1cm47CisgICAgfQorICAgIGlmKHpyJiYocS0+ZmxhZ3MmS09OU1QpKXsKKwlldmFsX2NvbnN0KCZxLT52YWwsdCk7CisJaWYoemxlcXRvKHZsb25nLGwyemwoMEwpKSYmenVsZXF0byh2dWxvbmcsdWwyenVsKDBVTCkpJiZ6ZGVxdG8odmRvdWJsZSxkMnpkKDAuMCkpKXsKKwkgICAgZnByaW50ZihmLCJcdHhvcmxcdCVzLCVzXG4iLHJlZ25hbWVzW3pyXSxyZWduYW1lc1t6cl0pOworCSAgICByZXR1cm47CisJfQorICAgIH0KKyAgICBmcHJpbnRmKGYsIlx0bW92JWNcdCIseF90W3QmTlFdKTsKKyAgICBpZihxcikgZnByaW50ZihmLCIlcyIscmVnbmFtZXNbcXJdKTsgZWxzZSBwcm9iajIoZixxLHQpOworICAgIGZwcmludGYoZiwiLCIpOworICAgIGlmKHpyKSBmcHJpbnRmKGYsIiVzIixyZWduYW1lc1t6cl0pOyBlbHNlIHByb2JqMihmLHosdCk7CisgICAgZnByaW50ZihmLCJcbiIpOworfQorc3RhdGljIGxvbmcgcG9mMih6dWxvbmcgeCkKKy8qICBZaWVsZHMgbG9nMih4KSsxIG9kZXIgMC4gKi8KK3sKKyAgICB6dWxvbmcgcDtpbnQgbG49MTsKKyAgICBwPXVsMnp1bCgxTCk7CisgICAgd2hpbGUoenVsbGVxKHAseCkpeworCWlmKHp1bGVxdG8oeCxwKSkgcmV0dXJuKGxuKTsKKwlsbisrO3A9enVsYWRkKHAscCk7CisgICAgfQorICAgIHJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgRW5kIG9mIHByaXZhdGUgZmF0YSBhbmQgZnVuY3Rpb25zLgkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW50IGluaXRfY2codm9pZCkKKy8qICBEb2VzIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbnMgZm9yIHRoZSBjb2RlLWdlbmVyYXRvci4gR2V0cyBjYWxsZWQJKi8KKy8qICBvbmNlIGF0IHRoZSBiZWdpbm5pbmcgYW5kIHNob3VsZCByZXR1cm4gMCBpbiBjYXNlIG9mIHByb2JsZW1zLgkqLworeworICAgIGludCBpOworCisgICAgLyoJSW5pdGlhbGl6ZSBzb21lIHZhbHVlcyB3aGljaCBjYW5ub3QgYmUgc3RhdGljYWxseSBpbml0aWFsaXplZAkqLworICAgIC8qCWJlY2F1c2UgdGhleSBhcmUgc3RvcmVkIGluIHRoZSB0YXJnZXQncyBhcml0aG1ldGljLiAgICAgICAgICAgICAqLworICAgIG1heGFsaWduPWwyemwoNEwpOworICAgIGNoYXJfYml0PWwyemwoOEwpOworICAgIGlmKGdfZmxhZ3NbNl0mVVNFREZMQUcpeworCWZvcihpPVNIT1JUO2k8MTY7aSsrKSBtYWxpZ25baV09NDsKKyAgICB9CisgICAgZm9yKGk9MDtpPDE2O2krKyl7CisJc2l6ZXRhYltpXT1sMnpsKG1zaXpldGFiW2ldKTsKKwlhbGlnbltpXT1sMnpsKG1hbGlnbltpXSk7CisgICAgfQorICAgIGZvcihpPTE7aTw9IDg7aSsrKSByZWdzaXplW2ldPWwyemwoNEwpOworICAgIGZvcihpPTk7aTw9MTY7aSsrKSByZWdzaXplW2ldPWwyemwoOEwpOworCisgICAgLyoJSW5pdGlhbGl6ZSB0aGUgbWluL21heC1zZXR0aW5ncy4gTm90ZSB0aGF0IHRoZSB0eXBlcyBvZiB0aGUJKi8KKyAgICAvKglob3N0IHN5c3RlbSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIHRhcmdldCBzeXN0ZW0gYW5kIHlvdSBtYXkgKi8KKyAgICAvKglvbmx5IHVzZSB0aGUgc21hbGxlc3QgbWF4aW11bSB2YWx1ZXMgQU5TSSBndWFyYW50ZWVzIGlmIHlvdQkqLworICAgIC8qCXdhbnQgdG8gYmUgcG9ydGFibGUuCQkJCQkJKi8KKyAgICAvKglUaGF0J3MgdGhlIHJlYXNvbiBmb3IgdGhlIHN1YnRyYWN0aW9uIGluIHRfbWluW0lOVF0uIExvbmcgY291bGQgKi8KKyAgICAvKgliZSB1bmFibGUgdG8gcmVwcmVzZW50IC0yMTQ3NDgzNjQ4IG9uIHRoZSBob3N0IHN5c3RlbS4JCSovCisgICAgdF9taW5bVU5TSUdORUR8Q0hBUl09dF9taW5bVU5TSUdORUR8U0hPUlRdPXRfbWluW1VOU0lHTkVEfElOVF09dF9taW5bVU5TSUdORUR8TE9OR109bDJ6bCgwTCk7CisgICAgdF9taW5bQ0hBUl09bDJ6bCgtMTI4TCk7CisgICAgdF9taW5bU0hPUlRdPWwyemwoLTMyNzY4TCk7CisgICAgdF9taW5bTE9OR109emxzdWIobDJ6bCgtMjE0NzQ4MzY0N0wpLGwyemwoMUwpKTsKKyAgICB0X21pbltJTlRdPXRfbWluW0xPTkddOworICAgIHRfbWF4W0NIQVJdPXVsMnp1bCgxMjdMKTsKKyAgICB0X21heFtTSE9SVF09dWwyenVsKDMyNzY3VUwpOworICAgIHRfbWF4W0xPTkddPXVsMnp1bCgyMTQ3NDgzNjQ3VUwpOworICAgIHRfbWF4W0lOVF09dF9tYXhbTE9OR107CisgICAgdF9tYXhbVU5TSUdORUR8Q0hBUl09dWwyenVsKDI1NVVMKTsKKyAgICB0X21heFtVTlNJR05FRHxTSE9SVF09dWwyenVsKDY1NTM1VUwpOworICAgIHRfbWF4W1VOU0lHTkVEfExPTkddPXVsMnp1bCg0Mjk0OTY3Mjk1VUwpOworICAgIHRfbWF4W1VOU0lHTkVEfElOVF09dF9tYXhbVU5TSUdORUR8TE9OR107CisgICAgLyoJUmVzZXJ2ZSBhIGZldyByZWdpc3RlcnMgZm9yIHVzZSBieSB0aGUgY29kZS1nZW5lcmF0b3IuCSAgICAqLworICAgIC8qCVdlIG9ubHkgcmVzZXJ2ZSB0aGUgc3RhY2stcG9pbnRlciBoZXJlLiAJCSAgICAqLworICAgIHJlZ3NhW3NwXT0xOworICAgIC8qICBJZiB3ZSBhcmUgdG8gdXNlIGEgZnJhbWVwb2ludGVyIGFsc28gcmVzZXJ2ZSAlZWJwLiAgICAgICAgICAqLworICAgIGlmKGdfZmxhZ3NbN10mVVNFREZMQUcpIHJlZ3NhWzddPTE7CisgICAgLyoJV2UgbmVlZCBhdCBsZWFzdCBvbmUgZnJlZSBzbG90IGluIHRoZSBmbGFvdGluZyBwb2ludCBzdGFjayAgKi8KKyAgICByZWdzYVsxNl09MTtyZWdzY3JhdGNoWzE2XT0wOworICAgIC8qCVVzZSBsJWQgYXMgbGFiZWxzIGFuZCBfJXMgYXMgaWRlbnRpZmllcnMgYnkgZGVmYXVsdC4gSWYgICAgICovCisgICAgLyoJLWVsZiBpcyBzcGVjaWZpZWQgd2UgdXNlIC5sJWQgYW5kICVzIGluc3RlYWQuCQkgICAgKi8KKyAgICBpZihnX2ZsYWdzWzVdJlVTRURGTEFHKSB7bGFicHJlZml4PSIuTCI7aWRwcmVmaXg9IiI7fQorICAgIHJldHVybigxKTsKK30KKworaW50IGZyZXR1cm4oc3RydWN0IFR5cCAqdCkKKy8qICBSZXR1cm5zIHRoZSByZWdpc3RlciBpbiB3aGljaCB2YXJpYWJsZXMgb2YgdHlwZSB0IGFyZSByZXR1cm5lZC4gKi8KKy8qICBJZiB0aGUgdmFsdWUgY2Fubm90IGJlIHJldHVybmVkIGluIGEgcmVnaXN0ZXIgcmV0dXJucyAwLgkgICAgKi8KK3sKKyAgICBpZigodC0+ZmxhZ3MmTlEpPT1GTE9BVHx8KHQtPmZsYWdzJk5RKT09RE9VQkxFKSByZXR1cm4gOTsKKyAgICBpZigodC0+ZmxhZ3MmTlEpPD1QT0lOVEVSKSByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IHJlZ29rKGludCByLGludCB0LGludCBtb2RlKQorLyogIFJldHVybnMgMCBpZiByZWdpc3RlciByIGNhbm5vdCBzdG9yZSB2YXJpYWJsZXMgb2YJKi8KKy8qICB0eXBlIHQuIElmIHQ9PVBPSU5URVIgYW5kIG1vZGUhPTAgdGhlbiBpdCByZXR1cm5zCSovCisvKiAgbm9uLXplcm8gb25seSBpZiB0aGUgcmVnaXN0ZXIgY2FuIHN0b3JlIGEgcG9pbnRlcgkqLworLyogIGFuZCBkZXJlZmVyZW5jZSBhIHBvaW50ZXIgdG8gbW9kZS4JCQkqLworeworICAgIGlmKHI9PTApIHJldHVybigwKTsKKyAgICB0Jj1OUTsKKyAgICBpZihyPjgpeworCWlmKHQ9PUZMT0FUfHx0PT1ET1VCTEUpIHJldHVybigxKTsKKwkgICAgZWxzZQkJcmV0dXJuKDApOworICAgIH0KKyAgICBpZih0PT1DSEFSJiYocj09c2l8fHI9PWRpfHxyPT1icCkpIHJldHVybigwKTsKKyAgICBpZih0PD1MT05HKSByZXR1cm4oMSk7CisgICAgaWYodD09UE9JTlRFUikgcmV0dXJuKDEpOworICAgIHJldHVybigwKTsKK30KKworaW50IGRhbmdlcm91c19JQyhzdHJ1Y3QgSUMgKnApCisvKiAgUmV0dXJucyB6ZXJvIGlmIHRoZSBJQyBwIGNhbiBiZSBzYWZlbHkgZXhlY3V0ZWQJKi8KKy8qICB3aXRob3V0IGRhbmdlciBvZiBleGNlcHRpb25zIG9yIHNpbWlsYXIgdGhpbmdzLgkqLworLyogIHZiY2MgbWF5IGdlbmVyYXRlIGNvZGUgaW4gd2hpY2ggbm9uLWRhbmdlcm91cyBJQ3MJKi8KKy8qICBhcmUgc29tZXRpbWVzIGV4ZWN1dGVkIGFsdGhvdWdoIGNvbnRyb2wtZmxvdyBtYXkJKi8KKy8qICBuZXZlciByZWFjaCB0aGVtIChtYWlubHkgd2hlbiBtb3ZpbmcgY29tcHV0YXRpb25zICAgKi8KKy8qICBvdXQgb2YgbG9vcHMpLgkJCQkJKi8KKy8qICBUeXBpY2FsIElDcyB0aGF0IGdlbmVyYXRlIGV4Y2VwdGlvbnMgb24gc29tZQkqLworLyogIG1hY2hpbmVzIGFyZToJCQkJCSovCisvKgktIGFjY2Vzc2VzIHZpYSBwb2ludGVycyAJCQkqLworLyoJLSBkaXZpc2lvbi9tb2R1bG8JCQkJKi8KKy8qCS0gb3ZlcmZsb3cgb24gc2lnbmVkIGludGVnZXIvZmxvYXRzCQkqLworeworICAgIGludCBjPXAtPmNvZGU7CisgICAgaWYoKHAtPnExLmZsYWdzJkRSRUZPQkopfHwocC0+cTIuZmxhZ3MmRFJFRk9CSil8fChwLT56LmZsYWdzJkRSRUZPQkopKQorCXJldHVybigwKTsKKyAgICBpZigoYz09RElWfHxjPT1NT0QpJiYhKHAtPnEyLmZsYWdzJktPTlNUKSkKKwlyZXR1cm4oMSk7CisgICAgcmV0dXJuKDApOworfQorCitpbnQgbXVzdF9jb252ZXJ0KG5wIHAsaW50IHQpCisvKiAgUmV0dXJucyB6ZXJvIGlmIGNvZGUgZm9yIGNvbnZlcnRpbmcgbnAgdG8gdHlwZSB0CSovCisvKiAgY2FuIGJlIG9taXR0ZWQuCQkJCQkqLworLyogIEluIHRoaXMgZ2VuZXJpYyAzMmJpdCBSSVNDIGNwdSBwb2ludGVycyBhbmQgMzJiaXQJKi8KKy8qICBpbnRlZ2VycyBoYXZlIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uIGFuZCBjYW4gdXNlCSovCisvKiAgdGhlIHNhbWUgcmVnaXN0ZXJzLiAJCQkJKi8KK3sKKyAgICBpbnQgbz1wLT5udHlwLT5mbGFncyxvcD1vJk5RLHRwPXQmTlE7CisgICAgaWYodHA9PVBPSU5URVImJm9wPT1QT0lOVEVSKSByZXR1cm4oMCk7CisgICAgaWYoKHQmVU5TSUdORUQpJiYobyZVTlNJR05FRCkmJnpsZXF0byhzaXpldGFiW3RwXSxzaXpldGFiW29wXSkpIHJldHVybigwKTsKKyAgICBpZigodHA9PUlOVCYmb3A9PUxPTkcpfHwodHA9PUxPTkcmJm9wPT1JTlQpKSByZXR1cm4oMCk7CisKKyAgICByZXR1cm4oMSk7Cit9CisKK3ZvaWQgZ2VuX2RzKEZJTEUgKmYsemxvbmcgc2l6ZSxzdHJ1Y3QgVHlwICp0KQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSA8c2l6ZT4gYnl0ZXMgb2Ygc3RvcmFnZSAqLworLyogIGluaXRpYWxpemVkIHdpdGggemVyby4JCQkJKi8KK3sKKyAgdGl0bGUoZik7CisgIGlmKG5ld29iaikgZnByaW50ZihmLCIlbGRcbiIsemwybChzaXplKSk7CisgIGVsc2UgZnByaW50ZihmLCJcdC5zcGFjZVx0JWxkXG4iLHpsMmwoc2l6ZSkpOworICBuZXdvYmo9MDsKK30KKwordm9pZCBnZW5fYWxpZ24oRklMRSAqZix6bG9uZyBhbGlnbikKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBtYWtlIHN1cmUgdGhlIG5leHQgZGF0YSBpcwkqLworLyogIGFsaWduZWQgdG8gbXVsdGlwbGVzIG9mIDxhbGlnbj4gYnl0ZXMuCQkqLworeworICB0aXRsZShmKTsKKyAgaWYoIXpsbGVxKGFsaWduLGwyemwoMUwpKSkgZnByaW50ZihmLCJcdC5hbGlnblx0MlxuIik7Cit9CisKK3ZvaWQgZ2VuX3Zhcl9oZWFkKEZJTEUgKmYsc3RydWN0IFZhciAqdikKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjcmVhdGUgdGhlIGhlYWQgb2YgYSB2YXJpYWJsZQkqLworLyogIGRlZmluaXRpb24sIGkuZS4gdGhlIGxhYmVsIGFuZCBpbmZvcm1hdGlvbiBmb3IJKi8KKy8qICBsaW5rYWdlIGV0Yy4JCQkJCSovCit7CisgIGludCBjb25zdGZsYWc7CisgIHRpdGxlKGYpOworICBpZih2LT5jbGlzdCkgY29uc3RmbGFnPWlzX2NvbnN0KHYtPnZ0eXApOworICBpZih2LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpeworCWlmKCh2LT52dHlwLT5mbGFncyZOUSk9PUZVTktUKSByZXR1cm47CisJaWYodi0+Y2xpc3QmJighY29uc3RmbGFnfHwoZ19mbGFnc1szXSZVU0VERkxBRykpJiZzZWN0aW9uIT1EQVRBKXtmcHJpbnRmKGYsZGF0YW5hbWUpO3NlY3Rpb249REFUQTt9CisJaWYodi0+Y2xpc3QmJmNvbnN0ZmxhZyYmIShnX2ZsYWdzWzNdJlVTRURGTEFHKSYmc2VjdGlvbiE9Q09ERSl7ZnByaW50ZihmLGNvZGVuYW1lKTtzZWN0aW9uPUNPREU7fQorCWlmKCF2LT5jbGlzdCYmc2VjdGlvbiE9QlNTKXtmcHJpbnRmKGYsYnNzbmFtZSk7c2VjdGlvbj1CU1M7fQorCWlmKHNlY3Rpb24hPUJTUykgZnByaW50ZihmLCJcdC5hbGlnblx0MlxuJXMlbGQ6XG4iLGxhYnByZWZpeCx6bDJsKHYtPm9mZnNldCkpOworCSAgICBlbHNlIGZwcmludGYoZiwiXHQubGNvbW1cdCVzJWxkLCIsbGFicHJlZml4LHpsMmwodi0+b2Zmc2V0KSk7CisJbmV3b2JqPTE7CisgICAgfQorICAgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisJZnByaW50ZihmLCJcdC5nbG9ibFx0JXMlc1xuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKwlpZih2LT5mbGFncyYoREVGSU5FRHxURU5UQVRJVkUpKXsKKwkgICAgaWYodi0+Y2xpc3QmJighY29uc3RmbGFnfHwoZ19mbGFnc1szXSZVU0VERkxBRykpJiZzZWN0aW9uIT1EQVRBKXtmcHJpbnRmKGYsZGF0YW5hbWUpO3NlY3Rpb249REFUQTt9CisJICAgIGlmKHYtPmNsaXN0JiZjb25zdGZsYWcmJiEoZ19mbGFnc1szXSZVU0VERkxBRykmJnNlY3Rpb24hPUNPREUpe2ZwcmludGYoZixjb2RlbmFtZSk7c2VjdGlvbj1DT0RFO30KKwkgICAgaWYoIXYtPmNsaXN0JiZzZWN0aW9uIT1CU1Mpe2ZwcmludGYoZixic3NuYW1lKTtzZWN0aW9uPUJTUzt9CisJICAgIGlmKHNlY3Rpb24hPUJTUykgZnByaW50ZihmLCJcdC5hbGlnblx0MlxuJXMlczpcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisJCWVsc2UgZnByaW50ZihmLCJcdC5jb21tXHQlcyVzLCIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisJICAgIG5ld29iaj0xOworCX0KKyAgICB9Cit9CisKK3ZvaWQgZ2VuX2RjKEZJTEUgKmYsaW50IHQsc3RydWN0IGNvbnN0X2xpc3QgKnApCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIHN0YXRpYyBzdG9yYWdlCQkqLworLyogIGluaXRpYWxpemVkIHdpdGggY29uc3QtbGlzdCBwLgkJCSovCit7CisgICAgdGl0bGUoZik7CisgICAgZnByaW50ZihmLCJcdC4lc1x0IixkY3RbdCZOUV0pOworICAgIGlmKCFwLT50cmVlKXsKKwlpZigodCZOUSk9PUZMT0FUfHwodCZOUSk9PURPVUJMRSl7CisJLyogIGF1Y2ggd2llZGVyIG5pY2h0IHNlaHIgc2Nob2VuIHVuZCBJRUVFIG5vZXRpZyAgICovCisJICAgIHVuc2lnbmVkIGNoYXIgKmlwOworCSAgICBpcD0odW5zaWduZWQgY2hhciAqKSZwLT52YWwudmRvdWJsZTsKKwkgICAgZnByaW50ZihmLCIweCUwMnglMDJ4JTAyeCUwMngiLGlwWzNdLGlwWzJdLGlwWzFdLGlwWzBdKTsKKwkgICAgaWYoKHQmTlEpPT1ET1VCTEUpeworCQlmcHJpbnRmKGYsIiwweCUwMnglMDJ4JTAyeCUwMngiLGlwWzddLGlwWzZdLGlwWzVdLGlwWzRdKTsKKwkgICAgfQorCX1lbHNleworCSAgICBwcmludHZhbChmLCZwLT52YWwsdCZOVSwwKTsKKwl9CisgICAgfWVsc2V7CisJaW50IG09cC0+dHJlZS0+by5mbGFnczsKKwlwLT50cmVlLT5vLmZsYWdzJj1+VkFSQURSOworCXByb2JqMihmLCZwLT50cmVlLT5vLHQmTlUpOworCXAtPnRyZWUtPm8uZmxhZ3M9bTsKKyAgICB9CisgICAgZnByaW50ZihmLCJcbiIpO25ld29iaj0wOworfQorCisvKiAgVGhlIG1haW4gY29kZS1nZW5lcmF0aW9uIHJvdXRpbmUuCQkJKi8KKy8qICBmIGlzIHRoZSBzdHJlYW0gdGhlIGNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8uCSovCisvKiAgcCBpcyBhIHBvaW50ZXIgdG8gYSBkb3VibHkgbGlua2VkIGxpc3Qgb2YgSUNzCSovCisvKiAgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gYm9keSB0byBnZW5lcmF0ZSBjb2RlIGZvci4JKi8KKy8qICB2IGlzIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24uCQkJKi8KKy8qICBvZmZzZXQgaXMgdGhlIHNpemUgb2YgdGhlIHN0YWNrZnJhbWUgdGhlIGZ1bmN0aW9uCSovCisvKiAgbmVlZHMgZm9yIGxvY2FsIHZhcmlhYmxlcy4JCQkJKi8KK3ZvaWQgZ2VuX2NvZGUoRklMRSAqZixzdHJ1Y3QgSUMgKnAsc3RydWN0IFZhciAqdix6bG9uZyBvZmZzZXQpCit7CisgICAgaW50IGMsdCxsYXN0Y29tcD0wLHJlZzsKKyAgICBpbnQgbGFzdGxpbmU9LTE7CisKKyAgICBpZihERUJVRyYxKSBwcmludGYoImdlbl9jb2RlKClcbiIpOworICAgIGZvcihjPTE7Yzw9MTU7YysrKSByZWdzW2NdPXJlZ3NhW2NdOworICAgIHJlZ3NbMTZdPTA7CisgICAgbG9mZj0oKHpsMmwob2Zmc2V0KSsxKS8yKSoyOworICAgIHRpdGxlKGYpOworICAgIGZ1bmN0aW9uX3RvcChmLHYsbG9mZik7CisgICAgc3RhY2tvZmZzZXQ9bm90cG9wcGVkPWRvbnRwb3A9MDsKKyAgICBmaW5pdCgpOworICAgIGZvcig7cDtwcihmLHApLHA9cC0+bmV4dCl7CisJYz1wLT5jb2RlO3Q9cC0+dHlwZjsKKwlpZihjPT1OT1ApIGNvbnRpbnVlOworCisvKkFEQSovCitpZiAobGFzdGxpbmUgIT0gcC0+bGluZSkKK3sKKyAgICBlbWl0ZGVidWdsaW5lKGYscC0+bGluZSk7CisgICAgbGFzdGxpbmUgPSBwLT5saW5lOworfQorCisJaWYoYz09U1VCUEZQKSBjPVNVQjsKKwlpZihjPT1TVUJJRlApIGM9U1VCOworCWlmKGM9PUFEREkyUCkgYz1BREQ7CisJaWYoYz09QUxMT0NSRUcpeworCSAgICByZWdzW3AtPnExLnJlZ109MTsKKwkgICAgY29udGludWU7CisJfQorCWlmKGM9PUZSRUVSRUcpeworCSAgICBpZihwLT5xMS5yZWc+PTkpeworCQlmb3IoYz0wO2M8ODtjKyspCisJCSAgICBpZihmc3RbY109PXAtPnExLnJlZykgZnN0W2NdPTA7CisJICAgIH0KKwkgICAgcmVnc1twLT5xMS5yZWddPTA7CisJICAgIGNvbnRpbnVlOworCX0KKwlpZihub3Rwb3BwZWQmJiFkb250cG9wKXsKKwkgICAgaW50IGZsYWc9MDsKKwkgICAgaWYoYz09TEFCRUx8fGM9PUNPTVBBUkV8fGM9PVRFU1R8fGM9PUJSQSl7CisJCWZwcmludGYoZiwiXHRhZGRsXHQkJWxkLCUlZXNwXG4iLG5vdHBvcHBlZCk7CisJCXN0YWNrb2Zmc2V0Kz1ub3Rwb3BwZWQ7bm90cG9wcGVkPTA7CisJICAgIH0KKwl9CisJaWYoYz09TEFCRUwpIHtmb3JkZXIoZik7ZnByaW50ZihmLCIlcyVkOlxuIixsYWJwcmVmaXgsdCk7Y29udGludWU7fQorCWlmKGM+PUJFUSYmYzw9QlJBKXsKKwkgICAgZm9yZGVyKGYpOworCSAgICBpZihsYXN0Y29tcCZVTlNJR05FRCkgZnByaW50ZihmLCJcdGolc1x0JXMlZFxuIixjY3VbYy1CRVFdLGxhYnByZWZpeCx0KTsKKwkJZWxzZQkJICBmcHJpbnRmKGYsIlx0aiVzXHQlcyVkXG4iLGNjc1tjLUJFUV0sbGFicHJlZml4LHQpOworCSAgICBjb250aW51ZTsKKwl9CisJaWYoYz09TU9WRVRPUkVHKXsKKwkgICAgaWYocC0+ei5yZWc+OCl7CisJCWZvcihjPTA7Yzw4O2MrKyl7CisJCSAgICBpZihmc3RbY109PXAtPnoucmVnKSBmc3RbY109MDsKKwkJfQorCQlmbG9hZChmLCZwLT5xMSxET1VCTEUpOworCQlmc3RbMF09cC0+ei5yZWc7CisJCWNvbnRpbnVlOworCSAgICB9CisJICAgIG1vdmUoZiwmcC0+cTEsMCwwLHAtPnoucmVnLExPTkcpOworCSAgICBjb250aW51ZTsKKwl9CisJaWYoYz09TU9WRUZST01SRUcpeworCSAgICBpZihwLT5xMS5yZWc+OCl7CisJCWlmKGZzdFswXSE9cC0+cTEucmVnKXsKKwkJICAgIGZvcihjPTAscmVnPS0xO2M8ODtjKyspeworCQkJaWYoZnN0W2NdPT1wLT5xMS5yZWcpIHJlZz1jOworCQkgICAgfQorCQkgICAgaWYocmVnPDApIGllcnJvcigwKTsKKwkJICAgIGZ4Y2goZixyZWcpOworCQl9CisJCWZwcmludGYoZiwiXHRmc3RwbFx0Iik7cHJvYmoyKGYsJnAtPnosRE9VQkxFKTsKKwkJZnByaW50ZihmLCJcbiIpO2Zwb3AoKTsKKwkJY29udGludWU7CisJICAgIH0KKwkgICAgbW92ZShmLDAscC0+cTEucmVnLCZwLT56LDAsTE9ORyk7CisJICAgIGNvbnRpbnVlOworCX0KKwlpZigocC0+cTEuZmxhZ3MmKERSRUZPQkp8UkVHKSk9PURSRUZPQkopeworCSAgICByZWc9Z2V0X3JlZyhmLHApOworCSAgICBtb3ZlKGYsJnAtPnExLDAsMCxyZWcsTE9ORyk7CisJICAgIHAtPnExLmZsYWdzfD1SRUc7cC0+cTEucmVnPXJlZzsKKwl9CisJaWYoKHAtPnEyLmZsYWdzJihEUkVGT0JKfFJFRykpPT1EUkVGT0JKKXsKKwkgICAgcmVnPWdldF9yZWcoZixwKTsKKwkgICAgbW92ZShmLCZwLT5xMiwwLDAscmVnLExPTkcpOworCSAgICBwLT5xMi5mbGFnc3w9UkVHO3AtPnEyLnJlZz1yZWc7CisJfQorCWlmKChwLT56LmZsYWdzJihEUkVGT0JKfFJFRykpPT1EUkVGT0JKKXsKKwkgICAgcmVnPWdldF9yZWcoZixwKTsKKwkgICAgbW92ZShmLCZwLT56LDAsMCxyZWcsTE9ORyk7CisJICAgIHAtPnouZmxhZ3N8PVJFRztwLT56LnJlZz1yZWc7CisJfQorCWlmKGM+PUNPTlZDSEFSJiZjPD1DT05WVUxPTkcpeworCSAgICBpbnQgdG87CisJICAgIGlmKGM9PUNPTlZDSEFSKSB0bz1DSEFSOworCSAgICBpZihjPT1DT05WVUNIQVIpIHRvPShVTlNJR05FRHxDSEFSKTsKKwkgICAgaWYoYz09Q09OVlNIT1JUKSB0bz1TSE9SVDsKKwkgICAgaWYoYz09Q09OVlVTSE9SVCkgdG89KFVOU0lHTkVEfFNIT1JUKTsKKwkgICAgaWYoYz09Q09OVklOVCkgdG89SU5UOworCSAgICBpZihjPT1DT05WVUlOVCkgdG89KFVOU0lHTkVEfElOVCk7CisJICAgIGlmKGM9PUNPTlZMT05HKSB0bz1JTlQ7CisJICAgIGlmKGM9PUNPTlZVTE9ORykgdG89KFVOU0lHTkVEfElOVCk7CisJICAgIGlmKGM9PUNPTlZGTE9BVCkgdG89RkxPQVQ7CisJICAgIGlmKGM9PUNPTlZET1VCTEUpIHRvPURPVUJMRTsKKwkgICAgaWYoYz09Q09OVlBPSU5URVIpIHRvPShVTlNJR05FRHxJTlQpOworCSAgICBpZigodCZOVSk9PUxPTkcpIHQ9SU5UOworCSAgICBpZigodCZOVSk9PShVTlNJR05FRHxMT05HKXx8KHQmTlUpPT1QT0lOVEVSKSB0PShVTlNJR05FRHxJTlQpOworCSAgICBpZigodG8mTlEpPD1JTlQmJih0Jk5RKTw9SU5UKXsKKwkJaWYoaXNyZWcoeikpIHJlZz1wLT56LnJlZzsKKwkJZWxzZSBpZihpc3JlZyhxMSkpIHJlZz1wLT5xMS5yZWc7CisJCWVsc2UgcmVnPWdldF9yZWcoZixwKTsKKwkJaWYoKHRvJk5RKTw9U0hPUlQpeworCQkgICAgZnByaW50ZihmLCJcdG1vdiVjJWNsXHQiLCh0byZVTlNJR05FRCk/J3onOidzJyx4X3RbdG8mTlFdKTsKKwkJICAgIGlmKGlzcmVnKHExKSl7CisJCQlpZigodG8mTlEpPT1TSE9SVCl7CisJCQkgICAgZnByaW50ZihmLCIlJSVzIixyZWduYW1lc1twLT5xMS5yZWddKzIpOworCQkJfWVsc2V7CisJCQkgICAgZnByaW50ZihmLCIlJSVjbCIscmVnbmFtZXNbcC0+cTEucmVnXVsyXSk7CisJCQl9CisJCSAgICB9ZWxzZSBwcm9iajIoZiwmcC0+cTEsdG8pOworCQkgICAgZnByaW50ZihmLCIsJXNcbiIscmVnbmFtZXNbcmVnXSk7CisJCX1lbHNleworCQkgICAgbW92ZShmLCZwLT5xMSwwLDAscmVnLHRvKTsKKwkJfQorCQltb3ZlKGYsMCxyZWcsJnAtPnosMCx0KTsKKwkJY29udGludWU7CisJICAgIH0KKwkgICAgaWYoKHQmTlEpPT1GTE9BVHx8KHQmTlEpPT1ET1VCTEUpeworCQlpZigodG8mTlEpPT1GTE9BVHx8KHRvJk5RKT09RE9VQkxFKXsKKwkJICAgIGlmKGlzcmVnKHExKSYmZnN0WzBdPT1wLT5xMS5yZWcpeworCQkJaWYoaXNyZWcoeikpeworCQkJICAgIGlmKHAtPnoucmVnPT1mc3RbMF0pIGNvbnRpbnVlOworCQkJICAgIGZvcihyZWc9MCxjPTc7Yz49MDtjLS0peworCQkJCWlmKGZzdFtjXT09cC0+ei5yZWcpe3JlZz1jO2JyZWFrO30KKwkJCQlpZihmc3RbY108MCkgcmVnPWM7CisJCQkgICAgfQorCQkJICAgIGZzdFtyZWddPXAtPnoucmVnOworCQkJfQorCQkJZnByaW50ZihmLCJcdGZzdCVjXHQiLHhfdFt0Jk5RXSk7CisJCQlwcm9iajIoZiwmcC0+eix0KTtmcHJpbnRmKGYsIlxuIik7CisJCQljb250aW51ZTsKKwkJICAgIH0KKwkJICAgIGZsb2FkKGYsJnAtPnExLHRvKTsKKwkJICAgIGZzdG9yZShmLCZwLT56LHQpOworCQkgICAgY29udGludWU7CisJCX0KKwkJaWYoKHRvJk5RKTw9U0hPUlQpeworCQkgICAgaWYoaXNyZWcocTEpKXsKKwkJCXJlZz1wLT5xMS5yZWc7CisJCQlpZih0byZVTlNJR05FRCl7CisJCQkgICAgZnByaW50ZihmLCJcdGFuZGxcdCQlbGQsJXNcbiIsKHRvJk5RKT09Q0hBUj8yNTVMOjY1NTM1TCxyZWduYW1lc1tyZWddKTsKKwkJCX1lbHNleworLyoJCQkgICAgICBmcHJpbnRmKGYsIlx0YyVjdGxcdCVzXG4iLHhfdFt0byZOUV0scmVnbmFtZXNbcmVnXSk7Ki8KKwkJCSAgICBpZigodG8mTlEpPT1TSE9SVCl7CisJCQkJZnByaW50ZihmLCJcdG1vdnN3bFx0JSUlcywlc1xuIixyZWduYW1lc1tyZWddKzIscmVnbmFtZXNbcmVnXSk7CisJCQkgICAgfWVsc2V7CisJCQkJZnByaW50ZihmLCJcdG1vdnNibFx0JSUlY2wsJXNcbiIscmVnbmFtZXNbcmVnXVsyXSxyZWduYW1lc1tyZWddKTsKKwkJCSAgICB9CisJCQl9CisJCSAgICB9ZWxzZXsKKwkJCXJlZz1nZXRfcmVnKGYscCk7CisJCQlpZih0byZVTlNJR05FRCl7CisJCQkgICAgZnByaW50ZihmLCJcdG1vdnolY2xcdCIseF90W3RvJk5RXSk7CisJCQl9ZWxzZXsKKwkJCSAgICBmcHJpbnRmKGYsIlx0bW92cyVjbFx0Iix4X3RbdG8mTlFdKTsKKwkJCX0KKwkJCXByb2JqMihmLCZwLT5xMSx0byk7ZnByaW50ZihmLCIsJXNcbiIscmVnbmFtZXNbcmVnXSk7CisJCSAgICB9CisJCSAgICBmcHJpbnRmKGYsIlx0cHVzaGxcdCVzXG4iLHJlZ25hbWVzW3JlZ10pOworCQkgICAgZnByaW50ZihmLCJcdGZpbGRsXHQoJXMpXG5cdGFkZGxcdCQ0LCVzXG4iLHJlZ25hbWVzW3NwXSxyZWduYW1lc1tzcF0pOworCQl9ZWxzZXsKKwkJICAgIGlmKHRvJlVOU0lHTkVEKXsKKwkJCWZwcmludGYoZiwiXHRwdXNobFx0JDBcblx0cHVzaGxcdCIpO3N0YWNrb2Zmc2V0LT00OworCQkJcHJvYmoyKGYsJnAtPnExLHRvKTsKKwkJCWZwcmludGYoZiwiXG5cdGZpbGRxXHQoJXMpXG5cdGFkZGxcdCQ4LCVzXG4iLHJlZ25hbWVzW3NwXSxyZWduYW1lc1tzcF0pOworCQkJc3RhY2tvZmZzZXQrPTQ7CisJCSAgICB9ZWxzZXsKKwkJCWlmKGlzcmVnKHExKSl7CisJCQkgICAgZnByaW50ZihmLCJcdHB1c2hsXHQlc1xuXHRmaWxkbFx0KCVzKVxuXHRhZGRsXHQkNCwlc1xuIixyZWduYW1lc1twLT5xMS5yZWddLHJlZ25hbWVzW3NwXSxyZWduYW1lc1tzcF0pOworCQkJfWVsc2V7CisJCQkgICAgZnByaW50ZihmLCJcdGZpbGRsXHQiKTtwcm9iajIoZiwmcC0+cTEsdCk7CisJCQkgICAgZnByaW50ZihmLCJcbiIpOworCQkJfQorCQkgICAgfQorCQl9CisJCWZwdXNoKGYpOworCQlmc3RvcmUoZiwmcC0+eix0KTsKKwkJY29udGludWU7CisJICAgIH0KKwkgICAgaWYoKHRvJk5RKT09RkxPQVR8fCh0byZOUSk9PURPVUJMRSl7CisJCWlmKGlzcmVnKHExKSYmZnN0WzBdPT1wLT5xMS5yZWcpeworCQkgICAgaWYoKHQmTlEpPT1DSEFSKXsKKwkJCWlmKGlzcmVnKHopKSByZWc9cC0+ei5yZWc7IGVsc2UgcmVnPWdldF9yZWcoZixwKTsKKwkJCWZwcmludGYoZiwiXHRzdWJsXHQkNCwlc1xuXHRmaXN0bFx0KCVzKVxuXHRtb3ZzYmxcdCglcyksJXNcblx0YWRkbFx0JDQsJXNcbiIscmVnbmFtZXNbc3BdLHJlZ25hbWVzW3NwXSxyZWduYW1lc1tzcF0scmVnbmFtZXNbcmVnXSxyZWduYW1lc1tzcF0pOworCQkJbW92ZShmLDAscmVnLCZwLT56LDAsdCk7CisJCSAgICB9ZWxzZXsKKwkJICAgICAgaWYoaXNyZWcoeikpeworCQkJZnByaW50ZihmLCJcdHN1YmxcdCQ0LCVzXG5cdGZpc3RsXHQoJXMpXG5cdG1vdiVjXHQoJXMpLCIscmVnbmFtZXNbc3BdLHJlZ25hbWVzW3NwXSx4X3RbdCZOUV0scmVnbmFtZXNbc3BdKTsKKwkJCXN0YWNrb2Zmc2V0LT00OworCQkJcHJvYmoyKGYsJnAtPnosdCk7ZnByaW50ZihmLCJcblx0YWRkbFx0JDQsJXNcbiIscmVnbmFtZXNbc3BdKTsKKwkJCXN0YWNrb2Zmc2V0Kz00OworCQkgICAgICB9ZWxzZXsKKwkJCWZwcmludGYoZiwiXHRmaXN0JWNcdCIseF90W3QmTlFdKTsKKwkJCXByb2JqMihmLCZwLT56LHQpO2ZwcmludGYoZiwiXG4iKTsKKwkJICAgICAgfQorCQkgICAgfQorCQl9ZWxzZXsKKwkJICAgIGZsb2FkKGYsJnAtPnExLHRvKTsKKwkJICAgIGlmKCh0Jk5RKT09Q0hBUil7CisJCQlpZihpc3JlZyh6KSkgcmVnPXAtPnoucmVnOyBlbHNlIHJlZz1nZXRfcmVnKGYscCk7CisJCQlmcHJpbnRmKGYsIlx0c3VibFx0JDQsJXNcblx0ZmlzdHBsXHQoJXMpXG5cdG1vdnNibFx0KCVzKSwlc1xuXHRhZGRsXHQkNCwlc1xuIixyZWduYW1lc1tzcF0scmVnbmFtZXNbc3BdLHJlZ25hbWVzW3NwXSxyZWduYW1lc1tyZWddLHJlZ25hbWVzW3NwXSk7CisJCQlmcG9wKCk7IG1vdmUoZiwwLHJlZywmcC0+eiwwLHQpOworCQkgICAgfWVsc2V7CisJCSAgICAgIGlmKGlzcmVnKHopKXsKKwkJCWZwcmludGYoZiwiXHRzdWJsXHQkNCwlc1xuXHRmaXN0cGxcdCglcylcblx0bW92JWNcdCglcyksIixyZWduYW1lc1tzcF0scmVnbmFtZXNbc3BdLHhfdFt0Jk5RXSxyZWduYW1lc1tzcF0pOworCQkJc3RhY2tvZmZzZXQtPTQ7CisJCQlwcm9iajIoZiwmcC0+eix0KTtmcHJpbnRmKGYsIlxuXHRhZGRsXHQkNCwlc1xuIixyZWduYW1lc1tzcF0pOworCQkJc3RhY2tvZmZzZXQrPTQ7ZnBvcCgpOworCQkgICAgICB9ZWxzZXsKKwkJCWZwcmludGYoZiwiXHRmaXN0cCVjXHQiLHhfdFt0Jk5RXSk7CisJCQlwcm9iajIoZiwmcC0+eix0KTtmcHJpbnRmKGYsIlxuIik7ZnBvcCgpOworCQkgICAgICB9CisJCSAgICB9CisJCX0KKwkJY29udGludWU7CisJICAgIH0KKwkgICAgaWVycm9yKDApOworCX0KKwlpZihjPT1NSU5VU3x8Yz09S09NUExFTUVOVCl7CisJICAgIGNoYXIgKnM7CisJICAgIGlmKCh0Jk5RKT09RkxPQVR8fCh0Jk5RKT09RE9VQkxFKXsKKwkJaWYoaXNyZWcoeikmJnAtPnoucmVnPT05JiZpc3JlZyhxMSkmJnAtPnExLnJlZz09OSl7CisJCSAgICBmcHJpbnRmKGYsIlx0ZmNoc1xuIik7CisJCSAgICBjb250aW51ZTsKKwkJfQorCQlmbG9hZChmLCZwLT5xMSx0KTsKKwkJZnByaW50ZihmLCJcdGZjaHNcbiIpOworCQlmcHJpbnRmKGYsIlx0ZnN0cCVjXHQiLHhfdFt0Jk5RXSk7CisJCXByb2JqMihmLCZwLT56LHQpO2ZwcmludGYoZiwiXG4iKTsKKwkJZnBvcCgpOworCQljb250aW51ZTsKKwkgICAgfQorCSAgICBpZihjPT1NSU5VUykgcz0ibmVnIjsgZWxzZSBzPSJub3QiOworCSAgICBpZihjb21wYXJlX29iamVjdHMoJnAtPnExLCZwLT5xMikpeworCQlmcHJpbnRmKGYsIlx0JXMlY1x0IixzLHhfdFt0Jk5RXSk7CisJCXByb2JqMihmLCZwLT56LHQpO2ZwcmludGYoZiwiXG4iKTsKKwkJY29udGludWU7CisJICAgIH0KKwkgICAgaWYoaXNyZWcoeikpIHJlZz1wLT56LnJlZzsgZWxzZSByZWc9Z2V0X3JlZyhmLHApOworCSAgICBtb3ZlKGYsJnAtPnExLDAsMCxyZWcsdCk7CisJICAgIGZwcmludGYoZiwiXHQlcyVjXHQlc1xuIixzLHhfdFt0Jk5RXSxyZWduYW1lc1tyZWddKTsKKwkgICAgbW92ZShmLDAscmVnLCZwLT56LDAsdCk7CisJICAgIGNvbnRpbnVlOworCX0KKwlpZihjPT1TRVRSRVRVUk4peworCSAgICBpZihwLT56LnJlZyl7CisJCWlmKHAtPnoucmVnPT05KXsKKwkJICAgIGlmKCFpc3JlZyhxMSl8fGZzdFswXSE9cC0+cTEucmVnKQorCQkJZmxvYWQoZiwmcC0+cTEsdCk7CisJCX1lbHNleworCQkgICAgbW92ZShmLCZwLT5xMSwwLDAscC0+ei5yZWcsdCk7CisJCX0KKwkgICAgfQorCSAgICBjb250aW51ZTsKKwl9CisJaWYoYz09R0VUUkVUVVJOKXsKKwkgICAgaWYocC0+cTEucmVnKXsKKwkJaWYocC0+cTEucmVnPT05KXsKKwkJICAgIGlmKCFpc3JlZyh6KXx8ZnN0WzBdIT1wLT56LnJlZykKKwkJCWZzdG9yZShmLCZwLT56LHQpOworCQl9ZWxzZXsKKwkJICAgIG1vdmUoZiwwLHAtPnExLnJlZywmcC0+eiwwLHQpOworCQl9CisJICAgIH0KKwkgICAgY29udGludWU7CisJfQorCWlmKGM9PUNBTEwpeworCSAgICBpbnQgcmVnOworCSAgICBpZihwLT5xMS5mbGFncyZEUkVGT0JKKXsKKwkJaWYoIShwLT5xMS5mbGFncyZSRUcpKSBpZXJyb3IoMCk7CisJCWZwcmludGYoZiwiXHRjYWxsXHQqJXNcbiIscmVnbmFtZXNbcC0+cTEucmVnXSk7CisJICAgIH1lbHNleworCQlmcHJpbnRmKGYsIlx0Y2FsbFx0Iik7cHJvYmoyKGYsJnAtPnExLHQpOworCQlmcHJpbnRmKGYsIlxuIik7CisJICAgIH0KKwkgICAgaWYoIXpsZXF0byhsMnpsKDBMKSxwLT5xMi52YWwudmxvbmcpKXsKKwkJbm90cG9wcGVkKz16bDJsKHAtPnEyLnZhbC52bG9uZyk7CisJCWRvbnRwb3AtPXpsMmwocC0+cTIudmFsLnZsb25nKTsKKwkJaWYoIShnX2ZsYWdzWzJdJlVTRURGTEFHKSYmc3RhY2tvZmZzZXQ9PS1ub3Rwb3BwZWQpeworCQkvKiAgRW50ZmVybmVuIGRlciBQYXJhbWV0ZXIgdmVyem9lZ2VybgkqLworCQl9ZWxzZXsKKwkJICAgIGZwcmludGYoZiwiXHRhZGRsXHQkJWxkLCUlZXNwXG4iLHpsMmwocC0+cTIudmFsLnZsb25nKSk7CisJCSAgICBzdGFja29mZnNldCs9emwybChwLT5xMi52YWwudmxvbmcpOworCQkgICAgbm90cG9wcGVkLT16bDJsKHAtPnEyLnZhbC52bG9uZyk7CisJCX0KKwkgICAgfQorCSAgICBjb250aW51ZTsKKwl9CisJaWYoYz09QVNTSUdOfHxjPT1QVVNIKXsKKwkgICAgaWYoYz09UFVTSCkgZG9udHBvcCs9emwybChwLT5xMi52YWwudmxvbmcpOworCSAgICBpZigodCZOUSk9PUZMT0FUfHwodCZOUSk9PURPVUJMRSl7CisJCWlmKGM9PUFTU0lHTil7CisJCSAgICBwcmZzdChmLCJmYXNzaWduIik7CisJCSAgICBmbG9hZChmLCZwLT5xMSx0KTsKKwkJICAgIGZzdG9yZShmLCZwLT56LHQpOworCQkgICAgY29udGludWU7CisJCX1lbHNlIGlmKGlzcmVnKHExKSl7CisJCSAgICBwcmZzdChmLCJmcHVzaCIpOworCQkgICAgZnByaW50ZihmLCJcdHN1YmxcdCQlbGQsJXNcbiIsemwybChzaXpldGFiW3QmTlFdKSxyZWduYW1lc1tzcF0pOworCQkgICAgc3RhY2tvZmZzZXQtPXpsMmwoc2l6ZXRhYlt0Jk5RXSk7CisJCSAgICBpZihmc3RbMF09PXAtPnExLnJlZyl7CisJCQlmcHJpbnRmKGYsIlx0ZnN0JWNcdCglcylcbiIseF90W3QmTlFdLHJlZ25hbWVzW3NwXSk7CisJCSAgICB9ZWxzZXsKKwkJCWZsb2FkKGYsJnAtPnExLHQpOworCQkJZnByaW50ZihmLCJcdGZzdHAlY1x0KCVzKVxuIix4X3RbdCZOUV0scmVnbmFtZXNbc3BdKTsKKwkJCWZwb3AoKTsKKwkJICAgIH0KKwkJICAgIGNvbnRpbnVlOworCQl9CisJICAgIH0KKwkgICAgaWYoKHQmTlEpPlBPSU5URVJ8fCF6bGVxdG8ocC0+cTIudmFsLnZsb25nLHNpemV0YWJbdCZOUV0pfHwhemxsZXEocC0+cTIudmFsLnZsb25nLGwyemwoNEwpKSl7CisJCWludCBtZGk9ZGksbXNpPXNpLG09MDtsb25nIGw7CisJCWw9emwybChwLT5xMi52YWwudmxvbmcpOworCQlpZihyZWdzW2N4XSl7bXw9MTtpZighY3hsKWN4bD0rK2xhYmVsO2ZwcmludGYoZiwiXHRtb3ZsXHQlcywlcyVkXG4iLHJlZ25hbWVzW2N4XSxsYWJwcmVmaXgsY3hsKTt9CisJCWlmKHJlZ3NbbXNpXXx8IXJlZ3VzZWRbbXNpXSl7bXw9MjtpZighc2lsKXNpbD0rK2xhYmVsO2ZwcmludGYoZiwiXHRtb3ZsXHQlcywlcyVkXG4iLHJlZ25hbWVzW21zaV0sbGFicHJlZml4LHNpbCk7fQorCQlpZihyZWdzW21kaV18fCFyZWd1c2VkW21kaV0pe218PTQ7aWYoIWRpbClkaWw9KytsYWJlbDtmcHJpbnRmKGYsIlx0bW92bFx0JXMsJXMlZFxuIixyZWduYW1lc1ttZGldLGxhYnByZWZpeCxkaWwpO30KKwkJaWYoKHAtPnouZmxhZ3MmUkVHKSYmcC0+ei5yZWc9PW1zaSYmKHAtPnExLmZsYWdzJlJFRykmJnAtPnExLnJlZz09bWRpKXsKKwkJICAgIG1zaT1kaTttZGk9c2k7CisJCSAgICBtfD04OworCQl9CisJCWlmKCEocC0+ei5mbGFncyZSRUcpfHxwLT56LnJlZyE9bXNpKXsKKwkJICAgIGZwcmludGYoZiwiXHRsZWFsXHQiKTtwcm9iajIoZiwmcC0+cTEsdCk7CisJCSAgICBmcHJpbnRmKGYsIiwlc1xuIixyZWduYW1lc1ttc2ldKTsKKwkJfQorCQlpZihjPT1QVVNIKXsKKwkJICAgIGZwcmludGYoZiwiXHRzdWJsXHQkJWxkLCVzXG5cdG1vdmxcdCVzLCVzXG4iLGwscmVnbmFtZXNbc3BdLHJlZ25hbWVzW3NwXSxyZWduYW1lc1ttZGldKTsKKwkJICAgIHN0YWNrb2Zmc2V0LT1sOworCQl9ZWxzZXsKKwkJICAgIGZwcmludGYoZiwiXHRsZWFsXHQiKTtwcm9iajIoZiwmcC0+eix0KTsKKwkJICAgIGZwcmludGYoZiwiLCVzXG4iLHJlZ25hbWVzW21kaV0pOworCQl9CisJCWlmKChwLT56LmZsYWdzJlJFRykmJnAtPnoucmVnPT1tc2kpeworCQkgICAgZnByaW50ZihmLCJcdGxlYWxcdCIpO3Byb2JqMihmLCZwLT5xMSx0KTsKKwkJICAgIGZwcmludGYoZiwiLCVzXG4iLHJlZ25hbWVzW21zaV0pOworCQl9CisJCWlmKG0mOCl7CisJCSAgICBtc2k9c2k7bWRpPWRpOworCQkgICAgZnByaW50ZihmLCJcdHhjaFx0JXMsJXNcbiIscmVnbmFtZXNbbXNpXSxyZWduYW1lc1ttZGldKTsKKwkJfQorCQlpZigodCZOUSk9PUFSUkFZfHwodCZOUSk9PUNIQVJ8fGw8NCl7CisJCSAgICBmcHJpbnRmKGYsIlx0bW92bFx0JCVsZCwlc1xuXHRyZXBcblx0bW92c2JcbiIsbCxyZWduYW1lc1tjeF0pOworCQl9ZWxzZXsKKwkJICAgIGlmKGw+PTgpCisJCQlmcHJpbnRmKGYsIlx0bW92bFx0JCVsZCwlc1xuXHRyZXBcbiIsbC80LHJlZ25hbWVzW2N4XSk7CisJCSAgICBmcHJpbnRmKGYsIlx0bW92c2xcbiIpOworCQkgICAgaWYobCUyKSBmcHJpbnRmKGYsIlx0bW92c3dcbiIpOworCQkgICAgaWYobCUxKSBmcHJpbnRmKGYsIlx0bW92c2JcbiIpOworCQl9CisJCWlmKG0mNCkgZnByaW50ZihmLCJcdG1vdmxcdCVzJWQsJXNcbiIsbGFicHJlZml4LGRpbCxyZWduYW1lc1ttZGldKTsKKwkJaWYobSYyKSBmcHJpbnRmKGYsIlx0bW92bFx0JXMlZCwlc1xuIixsYWJwcmVmaXgsc2lsLHJlZ25hbWVzW21zaV0pOworCQlpZihtJjEpIGZwcmludGYoZiwiXHRtb3ZsXHQlcyVkLCVzXG4iLGxhYnByZWZpeCxjeGwscmVnbmFtZXNbY3hdKTsKKwkJY29udGludWU7CisJICAgIH0KKwkgICAgaWYodD09RkxPQVQpIHQ9TE9ORzsKKwkgICAgaWYoYz09UFVTSCl7CisJCWZwcmludGYoZiwiXHRwdXNoJWNcdCIseF90W3QmTlFdKTsKKwkJcHJvYmoyKGYsJnAtPnExLHQpO2ZwcmludGYoZiwiXG4iKTsKKwkJc3RhY2tvZmZzZXQtPXpsMmwocC0+cTIudmFsLnZsb25nKTsKKwkJY29udGludWU7CisJICAgIH0KKwkgICAgaWYoYz09QVNTSUdOKXsKKwkJaWYocC0+cTEuZmxhZ3MmS09OU1QpeworCQkgICAgbW92ZShmLCZwLT5xMSwwLCZwLT56LDAsdCk7CisJCSAgICBjb250aW51ZTsKKwkJfQorCQlpZihpc3JlZyh6KSkgcmVnPXAtPnoucmVnOworCQllbHNlIGlmKGlzcmVnKHExKSkgcmVnPXAtPnExLnJlZzsKKwkJZWxzZSByZWc9Z2V0X3JlZyhmLHApOworCQltb3ZlKGYsJnAtPnExLDAsMCxyZWcsdCk7CisJCW1vdmUoZiwwLHJlZywmcC0+eiwwLHQpOworCQljb250aW51ZTsKKwkgICAgfQorCSAgICBpZXJyb3IoMCk7CisJfQorCWlmKGM9PUFERFJFU1MpeworCSAgICBpZihpc3JlZyh6KSkgcmVnPXAtPnoucmVnOyBlbHNlIHJlZz1nZXRfcmVnKGYscCk7CisJICAgIGZwcmludGYoZiwiXHRsZWFsXHQiKTtwcm9iajIoZiwmcC0+cTEsdCk7CisJICAgIGZwcmludGYoZiwiLCVzXG4iLHJlZ25hbWVzW3JlZ10pOworCSAgICBtb3ZlKGYsMCxyZWcsJnAtPnosMCxQT0lOVEVSKTsKKwkgICAgY29udGludWU7CisJfQorCWlmKGM9PVRFU1QpeworCSAgICBsYXN0Y29tcD10OworCSAgICBpZigodCZOUSk9PUZMT0FUfHwodCZOUSk9PURPVUJMRSl7CisJCWlmKGlzcmVnKHExKSYmZnN0WzBdPT1wLT5xMS5yZWcpeworCQkgICAgZnByaW50ZihmLCJcdGZ0c3RcbiIpO2xhc3Rjb21wfD1VTlNJR05FRDsKKwkJICAgIGNvbnRpbnVlOworCQl9ZWxzZXsKKwkJICAgIHAtPmNvZGU9Yz1DT01QQVJFOworCQkgICAgcC0+cTIuZmxhZ3M9S09OU1Q7CisJCSAgICBwLT5xMi52YWwudmRvdWJsZT1kMnpkKDAuMCk7CisJCSAgICBpZigodCZOUSk9PUZMT0FUKSBwLT5xMi52YWwudmZsb2F0PXpkMnpmKHAtPnEyLnZhbC52ZG91YmxlKTsKKwkJICAgIC8qCWZhbGwgdGhyb3VnaCB0byBDT01QQVJFICovCisJCX0KKwkgICAgfWVsc2V7CisJCWZwcmludGYoZiwiXHRjbXAlY1x0JDAsIix4X3RbdCZOUV0pOworCQlwcm9iajIoZiwmcC0+cTEsdCk7ZnByaW50ZihmLCJcbiIpOworCQljb250aW51ZTsKKwkgICAgfQorCX0KKwlpZihjPT1DT01QQVJFKXsKKwkgICAgbGFzdGNvbXA9dDsKKwkgICAgaWYoaXNyZWcocTIpfHwocC0+cTEuZmxhZ3MmS09OU1QpKXsKKwkJc3RydWN0IElDICpiPXAtPm5leHQ7CisJCXN0cnVjdCBvYmogbzsKKwkJbz1wLT5xMTtwLT5xMT1wLT5xMjtwLT5xMj1vOworCQl3aGlsZShiJiZiLT5jb2RlPT1GUkVFUkVHKSBiPWItPm5leHQ7CisJCWlmKCFiKSBpZXJyb3IoMCk7CisJCWlmKGItPmNvZGU9PUJMVCkgYi0+Y29kZT1CR1Q7CisJCWVsc2UgaWYoYi0+Y29kZT09QkxFKSBiLT5jb2RlPUJHRTsKKwkJZWxzZSBpZihiLT5jb2RlPT1CR1QpIGItPmNvZGU9QkxUOworCQllbHNlIGlmKGItPmNvZGU9PUJHRSkgYi0+Y29kZT1CTEU7CisJICAgIH0KKwkgICAgaWYoKHQmTlEpPT1GTE9BVHx8KHQmTlEpPT1ET1VCTEUpeworCQlwcmZzdChmLCJmY29tcCIpOworCQlpZihpc3JlZyhxMSkmJnAtPnExLnJlZz09ZnN0WzBdKXsKKwkJICAgIGZwcmludGYoZiwiXHRmY29tJWNcdCIseF90W3QmTlFdKTsKKwkJICAgIHByb2JqMihmLCZwLT5xMix0KTtmcHJpbnRmKGYsIlxuIik7CisJCX1lbHNleworCQkgICAgZmxvYWQoZiwmcC0+cTEsdCk7CisJCSAgICBmcHJpbnRmKGYsIlx0ZmNvbXAlY1x0Iix4X3RbdCZOUV0pOworCQkgICAgcHJvYmoyKGYsJnAtPnEyLHQpO2ZwcmludGYoZiwiXG4iKTsKKwkJICAgIGZwb3AoKTsKKwkJfQorCQlmcHJpbnRmKGYsIlx0ZnN0c3dcblx0c2FoZlxuIik7CisJCWxhc3Rjb21wfD1VTlNJR05FRDsKKwkJY29udGludWU7CisJICAgIH0KKwkgICAgaWYoIWlzcmVnKHExKSl7CisJCWlmKCFpc3JlZyhxMikpeworCQkgICAgcmVnPWdldF9yZWcoZixwKTsKKwkJICAgIG1vdmUoZiwmcC0+cTEsMCwwLHJlZyx0KTsKKwkJICAgIHAtPnExLmZsYWdzPVJFRzsKKwkJICAgIHAtPnExLnJlZz1yZWc7CisJCX0KKwkgICAgfQorCSAgICBmcHJpbnRmKGYsIlx0Y21wJWNcdCIseF90W3QmTlFdKTsKKwkgICAgcHJvYmoyKGYsJnAtPnEyLHQpO2ZwcmludGYoZiwiLCIpOworCSAgICBwcm9iajIoZiwmcC0+cTEsdCk7ZnByaW50ZihmLCJcbiIpOworCSAgICBjb250aW51ZTsKKwl9CisJaWYoKHQmTlEpPT1GTE9BVHx8KHQmTlEpPT1ET1VCTEUpeworCSAgICBjaGFyIHNbMl07CisJICAgIHByZnN0KGYsImZtYXRoIik7CisJICAgIGlmKGlzcmVnKHEyKSkgc1swXT0wOyBlbHNlIHtzWzBdPXhfdFt0Jk5RXTtzWzFdPTA7fQorCSAgICBpZihpc3JlZyh6KSYmaXNyZWcocTEpJiZwLT5xMS5yZWc9PWZzdFswXSYmcC0+ei5yZWc9PWZzdFswXSl7CisJCWZwcmludGYoZiwiXHQlcyVzXHQiLGZhcml0aG1ldGljc1tjLUxTSElGVF0scyk7CisJCXByb2JqMihmLCZwLT5xMix0KTsgZnByaW50ZihmLCJcbiIpO2NvbnRpbnVlOworCSAgICB9CisJICAgIGZsb2FkKGYsJnAtPnExLHQpOworCSAgICBmcHJpbnRmKGYsIlx0JXMlc1x0IixmYXJpdGhtZXRpY3NbYy1MU0hJRlRdLHMpOworCSAgICBwcm9iajIoZiwmcC0+cTIsdCk7IGZwcmludGYoZiwiXG4iKTsKKwkgICAgZnN0b3JlKGYsJnAtPnosdCk7IGNvbnRpbnVlOworCX0KKwlpZigoYz09TVVMVHx8Yz09RElWfHwoYz09TU9EJiYocC0+dHlwZiZVTlNJR05FRCkpKSYmKHAtPnEyLmZsYWdzJktPTlNUKSl7CisJICAgIGxvbmcgbG47CisJICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCx0KTsKKwkgICAgaWYoemxsZXEobDJ6bCgwTCksdmxvbmcpJiZ6dWxsZXEodWwyenVsKDBVTCksdnVsb25nKSl7CisJCWlmKGxuPXBvZjIodnVsb25nKSl7CisJCSAgICBpZihjPT1NT0QpeworCQkJdmxvbmc9emxzdWIodmxvbmcsbDJ6bCgxTCkpOworCQkJcC0+Y29kZT1BTkQ7CisJCSAgICB9ZWxzZXsKKwkJCXZsb25nPWwyemwobG4tMSk7CisJCQlpZihjPT1ESVYpIHAtPmNvZGU9UlNISUZUOyBlbHNlIHAtPmNvZGU9TFNISUZUOworCQkgICAgfQorCQkgICAgYz1wLT5jb2RlOworCQkgICAgaWYoKHQmTlUpPT1DSEFSKSBwLT5xMi52YWwudmNoYXI9emwyemModmxvbmcpOworCQkgICAgaWYoKHQmTlUpPT1TSE9SVCkgcC0+cTIudmFsLnZzaG9ydD16bDJ6cyh2bG9uZyk7CisJCSAgICBpZigodCZOVSk9PUlOVCkgcC0+cTIudmFsLnZpbnQ9emwyemkodmxvbmcpOworCQkgICAgaWYoKHQmTlUpPT1MT05HKSBwLT5xMi52YWwudmxvbmc9dmxvbmc7CisJCSAgICB2dWxvbmc9emwyenVsKHZsb25nKTsKKwkJICAgIGlmKCh0Jk5VKT09KFVOU0lHTkVEfENIQVIpKSBwLT5xMi52YWwudnVjaGFyPXp1bDJ6dWModnVsb25nKTsKKwkJICAgIGlmKCh0Jk5VKT09KFVOU0lHTkVEfFNIT1JUKSkgcC0+cTIudmFsLnZ1c2hvcnQ9enVsMnp1cyh2dWxvbmcpOworCQkgICAgaWYoKHQmTlUpPT0oVU5TSUdORUR8SU5UKSkgIHAtPnEyLnZhbC52dWludD16dWwyenVpKHZ1bG9uZyk7CisJCSAgICBpZigodCZOVSk9PShVTlNJR05FRHxMT05HKSkgcC0+cTIudmFsLnZ1bG9uZz12dWxvbmc7CisJCX0KKwkgICAgfQorCX0KKwlpZihjPT1NT0R8fGM9PURJVil7CisJICAgIGludCBtPTA7CisJICAgIGlmKHJlZ3NbYXhdJiYoIWlzcmVnKHopfHxwLT56LnJlZyE9YXgpKXsKKwkJZnByaW50ZihmLCJcdHB1c2hsXHQlc1xuIixyZWduYW1lc1theF0pOworCQlzdGFja29mZnNldC09NDttfD0xOworCSAgICB9CisJICAgIGlmKHJlZ3NbZHhdJiYoIWlzcmVnKHopfHxwLT56LnJlZyE9ZHgpKXsKKwkJZnByaW50ZihmLCJcdHB1c2hsXHQlc1xuIixyZWduYW1lc1tkeF0pOworCQlzdGFja29mZnNldC09NDttfD0yOworCSAgICB9CisJICAgIGlmKChwLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmKHAtPnEyLnJlZz09YXh8fHAtPnEyLnJlZz09ZHgpKXsKKwkJbW92ZShmLCZwLT5xMiwwLDAsZHgsdCk7CisJCWZwcmludGYoZiwiXHRwdXNobFx0JXNcbiIscmVnbmFtZXNbZHhdKTsKKwkJbXw9ODtzdGFja29mZnNldC09NDsKKwkgICAgfQorCSAgICBtb3ZlKGYsJnAtPnExLDAsMCxheCx0KTsKKwkgICAgaWYocC0+cTIuZmxhZ3MmS09OU1QpeworCQlmcHJpbnRmKGYsIlx0cHVzaCVjXHQiLHhfdFt0Jk5RXSk7cHJvYmoyKGYsJnAtPnEyLHQpOworCQlmcHJpbnRmKGYsIlxuIik7bXw9NDtzdGFja29mZnNldC09NDsKKwkgICAgfQorCSAgICBpZih0JlVOU0lHTkVEKSBmcHJpbnRmKGYsIlx0eG9ybFx0JXMsJXNcblx0ZGl2bFx0IixyZWduYW1lc1tkeF0scmVnbmFtZXNbZHhdKTsKKwkJZWxzZQkgICBmcHJpbnRmKGYsIlx0Y2x0ZFxuXHRpZGl2bFx0Iik7CisJICAgIGlmKChtJjEyKXx8KGlzcmVnKHEyKSYmcC0+cTIucmVnPT1keCkpeworCQlmcHJpbnRmKGYsIiglcykiLHJlZ25hbWVzW3NwXSk7CisJICAgIH1lbHNlIGlmKGlzcmVnKHEyKSYmcC0+cTIucmVnPT1heCl7CisJCWZwcmludGYoZiwiJXMoJXMpIiwobSYyKT8iNCI6IiIscmVnbmFtZXNbc3BdKTsKKwkgICAgfWVsc2V7CisJCXByb2JqMihmLCZwLT5xMix0KTsKKwkgICAgfQorCSAgICBmcHJpbnRmKGYsIlxuIik7CisJICAgIGlmKGM9PURJVikgbW92ZShmLDAsYXgsJnAtPnosMCx0KTsKKwkJZWxzZSAgIG1vdmUoZiwwLGR4LCZwLT56LDAsdCk7CisJICAgIGlmKG0mNCl7IGZwcmludGYoZiwiXHRhZGRsXHQkJWxkLCVzXG4iLHpsMmwoc2l6ZXRhYlt0Jk5RXSkscmVnbmFtZXNbc3BdKTtzdGFja29mZnNldCs9NDt9CisJICAgIGlmKG0mOCl7IGZwcmludGYoZiwiXHRwb3BsXHQlc1xuIixyZWduYW1lc1tkeF0pO3N0YWNrb2Zmc2V0Kz00O30KKwkgICAgaWYobSYyKXsgZnByaW50ZihmLCJcdHBvcGxcdCVzXG4iLHJlZ25hbWVzW2R4XSk7c3RhY2tvZmZzZXQrPTQ7fQorCSAgICBpZihtJjEpeyBmcHJpbnRmKGYsIlx0cG9wbFx0JXNcbiIscmVnbmFtZXNbYXhdKTtzdGFja29mZnNldCs9NDt9CisJICAgIGNvbnRpbnVlOworCX0KKwlpZighKHAtPnEyLmZsYWdzJktPTlNUKSYmKGM9PUxTSElGVHx8Yz09UlNISUZUKSl7CisJICAgIGNoYXIgKnM9YXJpdGhtZXRpY3NbYy1MU0hJRlRdOworCSAgICBpbnQgZmw9MDsKKwkgICAgaWYoYz09UlNISUZUJiYodCZVTlNJR05FRCkpIHM9InNociI7CisJICAgIGlmKCgocC0+cTEuZmxhZ3MmUkVHKSYmcC0+cTEucmVnPT1jeCl8fCgocC0+ei5mbGFncyZSRUcpJiZwLT56LnJlZz09Y3gpCisJICAgICAgIHx8KCFjb21wYXJlX29iamVjdHMoJnAtPnExLCZwLT56KSYmIWlzcmVnKHExKSkpeworCQlyZWc9Z2V0X3JlZyhmLHApOworCQltb3ZlKGYsJnAtPnExLDAsMCxyZWcsdCk7CisJCW1vdmUoZiwmcC0+cTIsMCwwLGN4LHQpOworCQlmcHJpbnRmKGYsIlx0JXMlY1x0JSVjbCwlc1xuIixzLHhfdFt0Jk5RXSxyZWduYW1lc1tyZWddKTsKKwkJbW92ZShmLDAscmVnLCZwLT56LDAsdCk7CisJCWNvbnRpbnVlOworCSAgICB9ZWxzZXsKKwkJaWYoIWlzcmVnKHEyKXx8cC0+cTIucmVnIT1jeCl7CisJCSAgICBpZihyZWdzW2N4XSl7ZnByaW50ZihmLCJcdHB1c2hsXHQlc1xuIixyZWduYW1lc1tjeF0pO2ZsPTE7fQorCQkgICAgbW92ZShmLCZwLT5xMiwwLDAsY3gsdCk7CisJCX0KKwkJaWYoY29tcGFyZV9vYmplY3RzKCZwLT5xMSwmcC0+eikpeworCQkgICAgZnByaW50ZihmLCJcdCVzJWNcdCUlY2wsIixzLHhfdFt0Jk5RXSk7CisJCSAgICBwcm9iajIoZiwmcC0+eix0KTtmcHJpbnRmKGYsIlxuIik7CisJCX1lbHNleworCQkgICAgbW92ZShmLDAscC0+cTEucmVnLCZwLT56LDAsdCk7CisJCSAgICBmcHJpbnRmKGYsIlx0JXMlY1x0JSVjbCwiLHMseF90W3QmTlFdKTsKKwkJICAgIHByb2JqMihmLCZwLT56LHQpO2ZwcmludGYoZiwiXG4iKTsKKwkJfQorCQlpZihmbCkgZnByaW50ZihmLCJcdHBvcGxcdCVzXG4iLHJlZ25hbWVzW2N4XSk7CisJCWNvbnRpbnVlOworCSAgICB9CisJfQorCWlmKChjPj1MU0hJRlQmJmM8PU1PRCl8fChjPj1PUiYmYzw9QU5EKSl7CisJICAgIGNoYXIgKnM7CisJICAgIGlmKGM+PU9SJiZjPD1BTkQpIHM9bG9naWNhbHNbYy1PUl07CisJCWVsc2Ugcz1hcml0aG1ldGljc1tjLUxTSElGVF07CisJICAgIGlmKGM9PVJTSElGVCYmKHQmVU5TSUdORUQpKSBzPSJzaHIiOworCSAgICBpZihjIT1NVUxUJiZjb21wYXJlX29iamVjdHMoJnAtPnExLCZwLT56KSl7CisJCWlmKGlzcmVnKHopfHxpc3JlZyhxMSl8fChwLT5xMi5mbGFncyZLT05TVCkpeworCQkgICAgaWYoKHAtPnEyLmZsYWdzJktPTlNUKSYmKGM9PUFERHx8Yz09U1VCKSl7CisJCQlldmFsX2NvbnN0KCZwLT5xMi52YWwsdCk7CisJCQlpZih6bGVxdG8odmxvbmcsbDJ6bCgxTCkpJiZ6dWxlcXRvKHZ1bG9uZyx1bDJ6dWwoMVVMKSkmJnpkZXF0byh2ZG91YmxlLGQyemQoMS4wKSkpeworCQkJICAgIGlmKGM9PUFERCkgcz0iaW5jIjsgZWxzZSBzPSJkZWMiOworCQkJICAgIGZwcmludGYoZiwiXHQlcyVjXHQiLHMseF90W3QmTlFdKTsKKwkJCSAgICBwcm9iajIoZiwmcC0+eix0KTtmcHJpbnRmKGYsIlxuIik7CisJCQkgICAgY29udGludWU7CisJCQl9CisJCSAgICB9CisJCSAgICBmcHJpbnRmKGYsIlx0JXMlY1x0IixzLHhfdFt0Jk5RXSk7CisJCSAgICBwcm9iajIoZiwmcC0+cTIsdCk7ZnByaW50ZihmLCIsIik7CisJCSAgICBwcm9iajIoZiwmcC0+eix0KTtmcHJpbnRmKGYsIlxuIik7CisJCSAgICBjb250aW51ZTsKKwkJfWVsc2V7CisJCSAgICBpZihpc3JlZyhxMikpIHJlZz1wLT5xMi5yZWc7IGVsc2UgcmVnPWdldF9yZWcoZixwKTsKKwkJICAgIG1vdmUoZiwmcC0+cTIsMCwwLHJlZyx0KTsKKwkJICAgIGZwcmludGYoZiwiXHQlcyVjXHQlcyIscyx4X3RbdCZOUV0scmVnbmFtZXNbcmVnXSk7CisJCSAgICBmcHJpbnRmKGYsIiwiKTsgcHJvYmoyKGYsJnAtPnosdCk7ZnByaW50ZihmLCJcbiIpOworCQkgICAgY29udGludWU7CisJCX0KKwkgICAgfQorCSAgICBpZihpc3JlZyh6KSkgcmVnPXAtPnoucmVnOyBlbHNlIHJlZz1nZXRfcmVnKGYscCk7CisJICAgIG1vdmUoZiwmcC0+cTEsMCwwLHJlZyx0KTsKKwkgICAgaWYoKHAtPnEyLmZsYWdzJktPTlNUKSYmKGM9PUFERHx8Yz09U1VCKSl7CisJCWV2YWxfY29uc3QoJnAtPnEyLnZhbCx0KTsKKwkJaWYoemxlcXRvKHZsb25nLGwyemwoMUwpKSYmenVsZXF0byh2dWxvbmcsdWwyenVsKDFVTCkpJiZ6ZGVxdG8odmRvdWJsZSxkMnpkKDEuMCkpKXsKKwkJICAgIGlmKGM9PUFERCkgcz0iaW5jIjsgZWxzZSBzPSJkZWMiOworCQkgICAgZnByaW50ZihmLCJcdCVzJWNcdCVzXG4iLHMseF90W3QmTlFdLHJlZ25hbWVzW3JlZ10pOworCQl9ZWxzZXsKKwkJICAgIGZwcmludGYoZiwiXHQlcyVjXHQiLHMseF90W3QmTlFdKTsKKwkJICAgIHByb2JqMihmLCZwLT5xMix0KTtmcHJpbnRmKGYsIiwlc1xuIixyZWduYW1lc1tyZWddKTsKKwkJfQorCSAgICB9ZWxzZXsKKwkJZnByaW50ZihmLCJcdCVzJWNcdCIscyx4X3RbdCZOUV0pOworCQlwcm9iajIoZiwmcC0+cTIsdCk7ZnByaW50ZihmLCIsJXNcbiIscmVnbmFtZXNbcmVnXSk7CisJICAgIH0KKwkgICAgbW92ZShmLDAscmVnLCZwLT56LDAsdCk7CisJICAgIGNvbnRpbnVlOworCX0KKwlpZXJyb3IoMCk7CisgICAgfQorICAgIGlmKG5vdHBvcHBlZCl7CisJZnByaW50ZihmLCJcdGFkZGxcdCQlbGQsJSVlc3BcbiIsbm90cG9wcGVkKTsKKwlzdGFja29mZnNldCs9bm90cG9wcGVkO25vdHBvcHBlZD0wOworICAgIH0KKyAgICBmdW5jdGlvbl9ib3R0b20oZix2LGxvZmYpOworfQorCitpbnQgc2hvcnRjdXQoaW50IGNvZGUsaW50IHR5cCkKK3sKKyAgICByZXR1cm4oMCk7Cit9CisKK3ZvaWQgY2xlYW51cF9jZyhGSUxFICpmKQoreworICAgIHN0cnVjdCBmcGNvbnN0bGlzdCAqcDsKKyAgICB1bnNpZ25lZCBjaGFyICppcDsKKworICAgIHRpdGxlKGYpOworICAgIHdoaWxlKHA9Zmlyc3RmcGMpeworCWlmKGYpeworCSAgICBpZihzZWN0aW9uIT1DT0RFKXtmcHJpbnRmKGYsY29kZW5hbWUpO3NlY3Rpb249Q09ERTt9CisJICAgIGZwcmludGYoZiwiJXMlZDpcblx0LmxvbmdcdCIsbGFicHJlZml4LHAtPmxhYmVsKTsKKwkgICAgaXA9KHVuc2lnbmVkIGNoYXIgKikmcC0+dmFsLnZkb3VibGU7CisJICAgIGZwcmludGYoZiwiMHglMDJ4JTAyeCUwMnglMDJ4IixpcFszXSxpcFsyXSxpcFsxXSxpcFswXSk7CisJICAgIGlmKChwLT50eXAmTlEpPT1ET1VCTEUpeworCQlmcHJpbnRmKGYsIiwweCUwMnglMDJ4JTAyeCUwMngiLGlwWzddLGlwWzZdLGlwWzVdLGlwWzRdKTsKKwkgICAgfQorCSAgICBmcHJpbnRmKGYsIlxuIik7CisJfQorCWZpcnN0ZnBjPXAtPm5leHQ7CisJZnJlZShwKTsKKyAgICB9CisgICAgaWYoZil7CisJaWYoc2VjdGlvbiE9QlNTKXtmcHJpbnRmKGYsYnNzbmFtZSk7c2VjdGlvbj1CU1M7fQorCWlmKGN4bCkgZnByaW50ZihmLCJcdC5sY29tbVx0JXMlZCw0XG4iLGxhYnByZWZpeCxjeGwpOworCWlmKHNpbCkgZnByaW50ZihmLCJcdC5sY29tbVx0JXMlZCw0XG4iLGxhYnByZWZpeCxzaWwpOworCWlmKGRpbCkgZnByaW50ZihmLCJcdC5sY29tbVx0JXMlZCw0XG4iLGxhYnByZWZpeCxkaWwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21hY2hpbmVzL2JpMzg2L21hY2hpbmUuZHQgYi9tYWNoaW5lcy9iaTM4Ni9tYWNoaW5lLmR0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk0NDUxYTQKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9iaTM4Ni9tYWNoaW5lLmR0CkBAIC0wLDAgKzEsMTMgQEAKK1M4QlMKK1M4QlUKK1MxNkJTQkUgUzE2QlNMRQorUzE2QlVCRSBTMTZCVUxFCitTMzJCU0JFIFMzMkJTTEUKK1MzMkJVQkUgUzMyQlVMRQorUzMyQlNCRSBTMzJCU0xFCitTMzJCVUJFIFMzMkJVTEUKK1MzMkJJRUVFQkUKK1M2NEJJRUVFQkUKK1MzMkJVQkUgUzMyQlVMRQorCisKZGlmZiAtLWdpdCBhL21hY2hpbmVzL2JpMzg2L21hY2hpbmUuaCBiL21hY2hpbmVzL2JpMzg2L21hY2hpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41OTcwYWMxCi0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvYmkzODYvbWFjaGluZS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qICBFeGFtcGxlIG9mIGEgY29kZS1nZW5lcmF0b3IgZm9yIGFuIEludGVsIDM4NiBvciBoaWdoZXIuICAgICAgICAgKi8KKworI2luY2x1ZGUgImR0LmgiCisKKyNkZWZpbmUgQkVJMzg2CisKKy8qICBUaGlzIHN0cnVjdCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgbWFjaGluZS1zcGVjaWZpYyAgICAgICAgICAgKi8KKy8qICBhZGRyZXNzaW5nLW1vZGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3QgdXNlZCBpbiB0aGlzIGNvZGUtZ2VuZXJyYXRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0cnVjdCBBZGRyZXNzaW5nTW9kZXsKKyAgICBpbnQgbmV2ZXJfdXNlZDsKK307CisKKy8qICBUaGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUuICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFYUiAxNgorCisvKiAgTnVtYmVyIG9mIGNvbW1hbmRsaW5lLW9wdGlvbnMgdGhlIGNvZGUtZ2VuZXJhdG9yIGFjY2VwdHMuICAgICAgICovCisjZGVmaW5lIE1BWEdGIDEwCisKKy8qICBJZiB0aGlzIGlzIHNldCB0byB6ZXJvIHZiY2Mgd2lsbCBub3QgZ2VuZXJhdGUgSUNzIHdoZXJlIHRoZSAgICAgKi8KKy8qICB0YXJnZXQgb3BlcmFuZCBpcyB0aGUgc2FtZSBhcyB0aGUgMm5kIHNvdXJjZSBvcGVyYW5kLiAgICAgICAgICAgKi8KKy8qICBUaGlzIGNhbiBzb21ldGltZXMgc2ltcGxpZnkgdGhlIGNvZGUtZ2VuZXJhdG9yLCBidXQgdXN1YWxseSAgICAgKi8KKy8qICB0aGUgY29kZSBpcyBiZXR0ZXIgaWYgdGhlIGNvZGUtZ2VuZXJhdG9yIGFsbG93cyBpdC4gICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNFUTJBU1ogMAorCisvKiAgVGhpcyBzcGVjaWZpZXMgdGhlIHNtYWxsZXN0IGludGVnZXIgdHlwZSB0aGF0IGNhbiBiZSBhZGRlZCB0byBhICovCisvKiAgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JTkFEREkyUCBJTlQKKworLyogIElmIHRoZSBieXRlcyBvZiBhbiBpbnRlZ2VyIGFyZSBvcmRlcmVkIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSAgICAqLworLyogIGJ5dGUgZmlyc3QgYW5kIHRoZW4gZGVjcmVhc2luZyBzZXQgQklHRU5ESUFOIHRvIDEuICAgICAgICAgICAgICAqLworI2lmZGVmIEJFSTM4NgorI2RlZmluZSBCSUdFTkRJQU4gMQorI2Vsc2UKKyNkZWZpbmUgQklHRU5ESUFOIDAKKyNlbmRpZgorCisvKiAgSWYgdGhlIGJ5dGVzIG9mIGFuIGludGVnZXIgYXJlIG9yZGVyZWQgbGVzdCBzaWduaWZpY2FudCBieXRlICAgICovCisvKiAgYnl0ZSBmaXJzdCBhbmQgdGhlbiBpbmNyZWFzaW5nIHNldCBMSVRUTEVFTkRJQU4gdG8gMS4gICAgICAgICAgICovCisjaWZkZWYgQkVJMzg2CisjZGVmaW5lIExJVFRMRUVORElBTiAwCisjZWxzZQorI2RlZmluZSBMSVRUTEVFTkRJQU4gMQorI2VuZGlmCisKKy8qICBOb3RlIHRoYXQgQklHRU5ESUFOIGFuZCBMSVRUTEVFTkRJQU4gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gICAgKi8KKworLyogIElmIHN3aXRjaC1zdGF0ZW1lbnRzIHNob3VsZCBiZSBnZW5lcmF0ZWQgYXMgYSBzZXF1ZW5jZSBvZiAgICAgICAqLworLyogIFNVQixUU1QsQkVRIElDcyByYXRoZXIgdGhhbiBDT01QQVJFLEJFUSBJQ3Mgc2V0IHRoaXMgdG8gMS4gICAgICAqLworLyogIFRoaXMgY2FuIHlpZWxkIGJldHRlciBjb2RlIG9uIHNvbWUgbWFjaGluZXMuICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTV0lUQ0hTVUJTIDAKKworLyogIEluIG9wdGltaXppbmcgY29tcGlsYXRpb24gY2VydGFpbiBsaWJyYXJ5IG1lbWNweS9zdHJjcHktY2FsbHMgICAqLworLyogIHdpdGggbGVuZ3RoIGtub3duIGF0IGNvbXBpbGUtdGltZSB3aWxsIGJlIGlubGluZWQgdXNpbmcgYW4gICAgICAqLworLyogIEFTU0lHTi1JQyBpZiB0aGUgc2l6ZSBpcyBsZXNzIG9yIGVxdWFsIHRvIElOTElORU1FTUNQWS4gICAgICAgICAqLworLyogIFRoZSB0eXBlIHVzZWQgZm9yIHRoZSBBU1NJR04tSUMgd2lsbCBiZSBVTlNJR05FRHxDSEFSLiAgICAgICAgICAqLworI2RlZmluZSBJTkxJTkVNRU1DUFkgMTAyNAorCisKZGlmZiAtLWdpdCBhL21hY2hpbmVzL2MxNngvbWFjaGluZS5jIGIvbWFjaGluZXMvYzE2eC9tYWNoaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjgwZmQxMAotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL2MxNngvbWFjaGluZS5jCkBAIC0wLDAgKzEsMzcyOCBAQAorLyogIENvZGUgZ2VuZXJhdG9yIGZvciBTQUIgYzE2eCBtaWNyb2NvbnRyb2xsZXJzLiAgICAgICAgICAgICAgICovCisKKyNpbmNsdWRlICJzdXBwLmgiCisKK3N0YXRpYyBjaGFyIEZJTEVfW109X19GSUxFX187CisvKiAgUHVibGljIGRhdGEgdGhhdCBNVVNUIGJlIHRoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogTmFtZSBhbmQgY29weXJpZ2h0LiAqLworY2hhciBjZ19jb3B5cmlnaHRbXT0idmJjYyBjb2RlLWdlbmVyYXRvciBmb3IgYzE2eCBWMC4zIChjKSBpbiAxOTk4LTIwMDUgYnkgVm9sa2VyIEJhcnRoZWxtYW5uIjsKKworLyogIENvbW1hbmRsaW5lLWZsYWdzIHRoZSBjb2RlLWdlbmVyYXRvciBhY2NlcHRzICAgICAgICAgICAgICAgICovCitpbnQgZ19mbGFnc1tNQVhHRl09e1ZBTEZMQUcsMCwwLDAsCisgICAgICAgICAgICAgICAgICAgIDAsMCwwLDAsCisgICAgICAgICAgICAgICAgICAgIDB9OworY2hhciAqZ19mbGFnc19uYW1lW01BWEdGXT17ImNwdSIsImludDMyIiwibm8tZGVsYXllZC1wb3BwaW5nIiwiY29uc3QtaW4tZGF0YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVyZ2UtY29uc3RhbnRzIiwibm8tcGVlcGhvbGUiLCJtdGlueSIsIm1sYXJnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWh1Z2UiLCJ0YXNraW5nIn07Cit1bmlvbiBwcGkgZ19mbGFnc192YWxbTUFYR0ZdOworCisvKiBUeXBlbmFtZXMgKG5lZWRlZCBiZWNhdXNlIG9mIEhBVkVfRVhUX1RZUEVTKS4gKi8KK2NoYXIgKnR5cG5hbWVbXT17InN0cmFuZ2UiLCJiaXQiLCJjaGFyIiwic2hvcnQiLCJpbnQiLCJsb25nIiwibG9uZyBsb25nIiwKKwkJICJmbG9hdCIsImRvdWJsZSIsImxvbmcgZG91YmxlIiwidm9pZCIsCisgICAgICAgICAgICAgICAgICJuZWFyLXBvaW50ZXIiLCJmYXItcG9pbnRlciIsImh1Z2UtcG9pbnRlciIsCisJCSAiYXJyYXkiLCJzdHJ1Y3QiLCJ1bmlvbiIsImVudW0iLCJmdW5jdGlvbiJ9OworCisvKiAgQWxpZ25tZW50LXJlcXVpcmVtZW50cyBmb3IgYWxsIHR5cGVzIGluIGJ5dGVzLiAgICAgICAgICAgICAgKi8KK3ptYXggYWxpZ25bTUFYX1RZUEUrMV07CisKKy8qICBBbGlnbm1lbnQgdGhhdCBpcyBzdWZmaWNpZW50IGZvciBldmVyeSBvYmplY3QuICAgICAgICAgICAgICAqLworem1heCBtYXhhbGlnbjsKKworLyogIENIQVJfQklUIG9mIHRoZSB0YXJnZXQgbWFjaGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IGNoYXJfYml0OworCisvKiAgU2l6ZXMgb2YgYWxsIGVsZW1lbnRhcnkgdHlwZXMgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggc2l6ZXRhYltNQVhfVFlQRSsxXTsKKworLyogIE1pbmltdW0gYW5kIE1heGltdW0gdmFsdWVzIGVhY2ggdHlwZSBjYW4gaGF2ZS4gICAgICAgICAgICAgICovCisvKiAgTXVzdCBiZSBpbml0aWFsaXplZCBpbiBpbml0X2NnKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggdF9taW5bTUFYX1RZUEUrMV07Cit6dW1heCB0X21heFtNQVhfVFlQRSsxXTsKK3p1bWF4IHR1X21heFtNQVhfVFlQRSsxXTsKKworLyogIE5hbWVzIG9mIGFsbCByZWdpc3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitjaGFyICpyZWduYW1lc1tdPXsibm9yZWciLCJSMCIsIlIxIiwiUjIiLCJSMyIsIlI0IiwiUjUiLCJSNiIsIlI3IiwKKwkJICAiUjgiLCJSOSIsIlIxMCIsIlIxMSIsIlIxMiIsIlIxMyIsIlIxNCIsIlIxNSIsCisJCSAgIlI2L1I3IiwiUjcvUjgiLCJSOC9SOSIsIlI0L1I1IiwKKwkJICAiUjE0L1IxNSIsIlIxMy9SMTQiLCJSMTIvUjEzIiwKKwkJICAiUjMvUjQiLCJSMi9SMyIsCisJCSAgIk1BWFIrMSIsIk1BWFIrMiIsIlpFUk9TIiwiT05FUyJ9OworCisvKiAgVGhlIFNpemUgb2YgZWFjaCByZWdpc3RlciBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggcmVnc2l6ZVtNQVhSKzFdOworCisvKiAgVHlwZSB3aGljaCBjYW4gc3RvcmUgZWFjaCByZWdpc3Rlci4gKi8KK3N0cnVjdCBUeXAgKnJlZ3R5cGVbTUFYUisxXTsKKworLyogIHJlZ3NhW3JlZ10hPTAgaWYgYSBjZXJ0YWluIHJlZ2lzdGVyIGlzIGFsbG9jYXRlZCBhbmQgc2hvdWxkICovCisvKiAgbm90IGJlIHVzZWQgYnkgdGhlIGNvbXBpbGVyIHBhc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2ludCByZWdzYVtNQVhSKzFdOworCisvKiAgU3BlY2lmaWVzIHdoaWNoIHJlZ2lzdGVycyBtYXkgYmUgc2NyYXRjaGVkIGJ5IGZ1bmN0aW9ucy4gICAgKi8KK2ludCByZWdzY3JhdGNoW01BWFIrMV09ezAsMSwxLDEsMSwxLDEsMCwwLDAsMCwxLDEsMSwxLDEsMSwwLDAsMCwxLDEsMSwxLDEsMX07CisKK2ludCByZWdfcHJpb1tNQVhSKzFdPXswLDAsMCwwLDAsMiwzLDEsMSwxLDEsMCwwLDQsNSw2LDcsMSwxLDEsMiw2LDUsNCwwLDB9OworCitzdHJ1Y3QgcmVnX2hhbmRsZSBlbXB0eV9yZWdfaGFuZGxlPXswfTsKKworLyogTmFtZXMgb2YgdGFyZ2V0LXNwZWNpZmljIHZhcmlhYmxlIGF0dHJpYnV0ZXMuICAgICAgICAgICAgICAgICovCitjaGFyICpnX2F0dHJfbmFtZVtdPXsiX19pbnRlcnJ1cHQiLCJfX2RwcDAiLCJfX2RwcDEiLCJfX2RwcDIiLCJfX2RwcDMiLDB9OworI2RlZmluZSBJTlRFUlJVUFQgMQorI2RlZmluZSBEUFAwIDIKKyNkZWZpbmUgRFBQMSA0CisjZGVmaW5lIERQUDIgOAorI2RlZmluZSBEUFAzIDE2CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgU29tZSBwcml2YXRlIGRhdGEgYW5kIGZ1bmN0aW9ucy4gICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY2hhciAqYnJlZ25hbWVzW109eyJub2JyZWciLCJSTDAiLCJSTDEiLCJSTDIiLCJSTDMiLCJSTDQiLCJSTDUiLCJSTDYiLCJSTDciLAorICJlOCIsImU5IiwiZTEwIiwiZTExIiwiZTEyIiwiZTEzIiwiZTE0IiwiZTE1IiwiZTE2IiwKKyAiZTE3IiwiZTE4IiwiZTE5IiwiZTIwIiwiZTIxIiwiZTIyIgorfTsKKworc3RhdGljIGxvbmcgbWFsaWduW01BWF9UWVBFKzFdPSAgezEsMSwxLDIsMiwyLDIsMiwyLDIsMSwyLDIsMiwxLDEsMSwyLDF9Oworc3RhdGljIGxvbmcgbXNpemV0YWJbTUFYX1RZUEUrMV09ezAsMSwxLDIsMiw0LDgsNCw4LDgsMCwyLDQsNCwwLDAsMCwyLDB9OworCitzdHJ1Y3QgVHlwIGl0eXA9e1NIT1JUfSxsdHlwPXtMT05HfTsKKworI2RlZmluZSBJTlQzMiAoZ19mbGFnc1sxXSZVU0VERkxBRykKKyNkZWZpbmUgVElOWSAoZ19mbGFnc1s2XSZVU0VERkxBRykKKyNkZWZpbmUgTEFSR0UgKGdfZmxhZ3NbN10mVVNFREZMQUcpCisjZGVmaW5lIEhVR0UgKGdfZmxhZ3NbOF0mVVNFREZMQUcpCisjZGVmaW5lIFRBU0tJTkcgKGdfZmxhZ3NbOV0mVVNFREZMQUcpCisKKworI2RlZmluZSBOREFUQSAwCisjZGVmaW5lIE5CU1MgMQorI2RlZmluZSBOQ0RBVEEgMgorI2RlZmluZSBGREFUQSAzCisjZGVmaW5lIEZCU1MgNAorI2RlZmluZSBGQ0RBVEEgNQorI2RlZmluZSBIREFUQSA2CisjZGVmaW5lIEhCU1MgNworI2RlZmluZSBIQ0RBVEEgOAorI2RlZmluZSBDT0RFIDkKKyNkZWZpbmUgU1BFQ0lBTCAxMAorI2RlZmluZSBCSVRTIDExCisKKyNkZWZpbmUgU0VHIHIyCisjZGVmaW5lIFNPRiByMQorCisjZGVmaW5lIE1UTVAxIE1BWFIrMQorI2RlZmluZSBNVE1QMiBNQVhSKzIKKyNkZWZpbmUgWkVST1MgTUFYUiszCisjZGVmaW5lIE9ORVMgIE1BWFIrNAorCitzdGF0aWMgaW50IHNlY3Rpb249LTEsbmV3b2JqLHNjbnQ7CitzdGF0aWMgY2hhciAqY29kZW5hbWU9IlNDT0RFXHRTRUNUSU9OIENPREUgV09SRCBQVUJMSUMgJ0NQUk9HUkFNJ1xuIiwqZWNvZGU9IlNDT0RFXHRlbmRzXG4iLAorICAgICAgICAgICAgKm5kYXRhbmFtZT0iTkRBVEFcdFNFQ1RJT04gTERBVCBXT1JEIFBVQkxJQ1xuIiwqZW5kYXRhPSJOREFUQVx0ZW5kc1xuIiwKKyAgICAgICAgICAgICpmZGF0YW5hbWU9IkZEQVRBXHRTRUNUSU9OIExEQVQgV09SRCBQVUJMSUNcbiIsKmVmZGF0YT0iRkRBVEFcdGVuZHNcbiIsCisgICAgICAgICAgICAqaGRhdGFuYW1lPSJIREFUQVx0U0VDVElPTiBMREFUIFdPUkQgUFVCTElDXG4iLCplaGRhdGE9IkhEQVRBXHRlbmRzXG4iLAorICAgICAgICAgICAgKm5ic3NuYW1lPSJOQlNTXHRTRUNUSU9OIExEQVQgV09SRCBQVUJMSUNcbiIsKmVuYnNzPSJOQlNTXHRlbmRzXG4iLAorICAgICAgICAgICAgKmZic3NuYW1lPSJGQlNTXHRTRUNUSU9OIExEQVQgV09SRCBQVUJMSUNcbiIsKmVmYnNzPSJGQlNTXHRlbmRzXG4iLAorICAgICAgICAgICAgKmhic3NuYW1lPSJIQlNTXHRTRUNUSU9OIExEQVQgV09SRCBQVUJMSUNcbiIsKmVoYnNzPSJIQlNTXHRlbmRzXG4iLAorICAgICAgICAgICAgKm5jZGF0YW5hbWU9Ik5DREFUQVx0U0VDVElPTiBMREFUIFdPUkQgUFVCTElDXG4iLCplbmNkYXRhPSJOQ0RBVEFcdGVuZHNcbiIsCisgICAgICAgICAgICAqZmNkYXRhbmFtZT0iRkNEQVRBXHRTRUNUSU9OIExEQVQgV09SRCBQVUJMSUNcbiIsKmVmY2RhdGE9IkZDREFUQVx0ZW5kc1xuIiwKKyAgICAgICAgICAgICpoY2RhdGFuYW1lPSJIQ0RBVEFcdFNFQ1RJT04gTERBVCBXT1JEIFBVQkxJQ1xuIiwqZWhjZGF0YT0iSENEQVRBXHRlbmRzXG4iLAorCisgICAgICAgICAgICAqYml0c25hbWU9IkJJVFNcdFNFQ1RJT04gQklUIEJJVCBQVUJMSUMgJ0NCSVRTJ1xuIiwqZWJpdHM9IkJJVFNcdGVuZHNcbiI7CisKK3N0YXRpYyBjaGFyICpldmVuPSJcdGV2ZW5cbiIsKnB1YmxpYz0icHVibGljIiwqY29tbWVudD0iOyAiOworCisjZGVmaW5lIElNTV9JTkQgIDEKKyNkZWZpbmUgVkFSX0lORCAgMgorI2RlZmluZSBQT1NUX0lOQyAzCisjZGVmaW5lIFBSRV9ERUMgIDQKKworc3RhdGljIGNoYXIgc2VjX2VuZFszMl07CisvKiAodXNlcilzdGFjay1wb2ludGVyLCBwb2ludGVyLXRtcCwgaW50LXRtcDsgcmVzZXJ2ZWQgZm9yIGNvbXBpbGVyICovCitzdGF0aWMgY29uc3QgaW50IHNwPTEsdHA9Mix0aT0xMSx0aTI9MTIscjQ9NSxyNT02LHI0cjU9MjA7CitzdGF0aWMgaW50IHRtcDEsdG1wMix0bXAzLHRtcDQ7CitzdGF0aWMgdm9pZCBwcihGSUxFICosc3RydWN0IElDICopOworc3RhdGljIHZvaWQgZnVuY3Rpb25fdG9wKEZJTEUgKixzdHJ1Y3QgVmFyICosbG9uZyk7CitzdGF0aWMgdm9pZCBmdW5jdGlvbl9ib3R0b20oRklMRSAqZixzdHJ1Y3QgVmFyICosbG9uZyk7CitzdGF0aWMgaW50IHNjcmF0Y2hyZWcoaW50LHN0cnVjdCBJQyAqKTsKK3N0YXRpYyBzdHJ1Y3QgVmFyIG52YXIsZnZhcjsKKworc3RhdGljIGNoYXIgKm1hcnJheVtdPXswLAorICAgICAgICAgICAgICAgICAgICAgICAiX19mYXI9X19hdHRyKFwiZmFyXCIpIiwKKwkJICAgICAgICJfX25lYXI9X19hdHRyKFwibmVhclwiKSIsCisJCSAgICAgICAiX19odWdlPV9fYXR0cihcImh1Z2VcIikiLAorCQkgICAgICAgIl9fYml0PV9fYXR0cihcImJpdFwiKSB1bnNpZ25lZCBjaGFyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgLyoiX19zZWN0aW9uKHgpPV9fdmF0dHIoXCJzZWN0aW9uKFwieFwiKVwiKSIsKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIl9fc2VjdGlvbih4LHkpPV9fdmF0dHIoXCJzZWN0aW9uKFwiI3hcIixcIiN5XCIpXCIpIiwKKwkJICAgICAgICJfX3JiYW5rKHgpPV9fdmF0dHIoXCJyYmFuayhcIl9fc3RyKHgpXCIpXCIpIiwKKwkJICAgICAgICJfX2ludGVycnVwdCh4KT1fX2ludGVycnVwdCBfX3ZhdHRyKFwiaXZlYyhcIl9fc3RyKHgpXCIpXCIpIiwKKwkJICAgICAgICJfX3N5c3N0YWNrKHgpPV9fc3RhY2syKHgpIiwKKwkJICAgICAgICJfX3VzcnN0YWNrKHgpPV9fc3RhY2soeCkiLAorCQkgICAgICAgIl9fQzE2WF9fIiwKKwkJICAgICAgICJfX0MxNjdfXyIsCisJCSAgICAgICAiX19TVDEwX18iLAorCQkgICAgICAgIl9fc2ZyKHgpPV9fdmF0dHIoXCJzZnIoXCJfX3N0cih4KVwiKVwiKSBleHRlcm4iLAorCQkgICAgICAgIl9fc2ZyYml0KHgseSk9X192YXR0cihcInNmcmJpdChcIl9fc3RyKHgpXCIsXCJfX3N0cih5KVwiKVwiKSBleHRlcm4iLAorCQkgICAgICAgIl9fZXNmcih4KT1fX3ZhdHRyKFwic2ZyZShcIl9fc3RyKHgpXCIpXCIpIGV4dGVybiIsCisJCSAgICAgICAiX19lc2ZyYml0KHgseSk9X192YXR0cihcInNmcmJpdGUoXCJfX3N0cih4KVwiLFwiX19zdHIoeSlcIilcIikgZXh0ZXJuIiwKKwkJICAgICAgICJfX1NJWkVfVF9JTlQ9MSIsCisJCSAgICAgICAiX19zdHIoeCk9I3giLAorCQkgICAgICAgMH07CisKKyNkZWZpbmUgaXNyZWcoeCkgKChwLT54LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpCisjZGVmaW5lIGlzY29uc3QoeCkgKChwLT54LmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKQorI2RlZmluZSBpc3NmcnYodikgKHYtPnZhdHRyJiZzdHJzdHIodi0+dmF0dHIsInNmcigiKSkKKyNkZWZpbmUgaXNzZnJiaXR2KHYpICh2LT52YXR0ciYmc3Ryc3RyKHYtPnZhdHRyLCJzZnJiaXQoIikpCisjZGVmaW5lIGlzZXNmcnYodikgKHYtPnZhdHRyJiZzdHJzdHIodi0+dmF0dHIsInNmcmUoIikpCisjZGVmaW5lIGlzZXNmcmJpdHYodikgKHYtPnZhdHRyJiZzdHJzdHIodi0+dmF0dHIsInNmcmJpdGUoIikpCisjZGVmaW5lIGlzc2ZyKHgpICgocC0+eC5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiZpc3NmcnYocC0+eC52KSkKKyNkZWZpbmUgaXNzZnJiaXQoeCkgKChwLT54LmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJmlzc2ZyYml0dihwLT54LnYpKQorI2RlZmluZSBpc2VzZnIoeCkgKChwLT54LmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJmlzZXNmcnYocC0+eC52KSkKKyNkZWZpbmUgaXNlc2ZyYml0KHgpICgocC0+eC5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiZpc2VzZnJiaXR2KHAtPngudikpCisKK3N0YXRpYyBsb25nIGxvZmYsc3lzc3RhY2tvZmZzZXQsdXNyc3RhY2tvZmZzZXQsbm90cG9wcGVkLGRvbnRwb3AsCisgIHVzcm1heHB1c2hlZCxzeXNtYXhwdXNoZWQsc3lzc3RhY2ssdXNyc3RhY2s7CisKK3N0YXRpYyBjaGFyICp4X3RbXT17Ij8iLCIiLCJiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIn07CitzdGF0aWMgY2hhciAqY2NzW109eyJ6IiwibnoiLCJsdCIsImdlIiwibGUiLCJndCJ9Oworc3RhdGljIGNoYXIgKmxvZ2ljYWxzW109eyJvciIsInhvciIsImFuZCJ9Oworc3RhdGljIGNoYXIgKmFyaXRobWV0aWNzW109eyJzaGwiLCJzaHIiLCJhZGQiLCJzdWIiLCJtdWwiLCJkaXYiLCJtb2QifTsKK3N0YXRpYyBjaGFyICpkY3RbXT17IiIsImRiaXQiLCJkYiIsImR3IiwiZHciLCJkdyIsImR3IiwiZHciLCJkdyIsImR3IiwKKwkJICAgICIodm9pZCkiLCJkdyIsImRzcHRyIiwiZHNwdHIifTsKK3N0YXRpYyBjaGFyICp2ZGN0W109eyIiLCIuYml0IiwiLmJ5dGUiLCIuc2hvcnQiLCIuc2hvcnQiLCIuc2hvcnQiLCIuc2hvcnQiLCIuc2hvcnQiLCIuc2hvcnQiLCIuc2hvcnQiLAorCQkgICAgIih2b2lkKSIsIi5zaG9ydCIsIi5sb25nIiwiLmxvbmcifTsKK3N0YXRpYyBpbnQgcHVzaGVkc2l6ZSxwdXNob3JkZXI9MjsKK3N0YXRpYyBjaGFyICppZHByZWZpeD0iXyIsKmxhYnByZWZpeD0ibCI7CitzdGF0aWMgaW50IHRpMl91c2VkOworc3RhdGljIHN0cnVjdCBycGFpciBxcDsKK3N0YXRpYyBpbnQgZXhpdF9sYWJlbCxoYXZlX2ZyYW1lLHN0YWNrY2hlY2tsYWJlbCxzdGFja192YWxpZDsKK3N0YXRpYyBjaGFyICpyZXQsKmNhbGwsKmp1bXA7CitzdGF0aWMgaW50IGZyYW1lX3VzZWQ7CisKK3N0YXRpYyBjaGFyICpkcHBwcmVmaXg9Il9fX0RQUF8iOworc3RhdGljIGludCByb21kcHA9MCxyYW1kcHA9MTsKKworI2RlZmluZSBTVFJfTkVBUiAibmVhciIKKyNkZWZpbmUgU1RSX0ZBUiAiZmFyIgorI2RlZmluZSBTVFJfSFVHRSAiaHVnZSIKKyNkZWZpbmUgU1RSX0JBRERSICJiYWRkciIKKworI2RlZmluZSBJU05VTEwoKSAoem1lcXRvKHZtYXgsbDJ6bSgwTCkpJiZ6dW1lcXRvKHZ1bWF4LHVsMnp1bSgwVUwpKSYmemxkZXF0byh2bGRvdWJsZSxkMnpsZCgwLjApKSkKKyNkZWZpbmUgSVNMV09SRCh0KSAoKHQmTlEpPT1MT05HfHwodCZOUSk9PUZQT0lOVEVSfHwodCZOUSk9PUhQT0lOVEVSfHwodCZOUSk9PUZMT0FUKQorI2RlZmluZSBJU0hXT1JEKHQpICgodCZOUSk9PUlOVHx8KHQmTlEpPT1TSE9SVHx8KHQmTlEpPT1OUE9JTlRFUikKKyNkZWZpbmUgSVNTVEFUSUModikgKCh2KS0+c3RvcmFnZV9jbGFzcz09RVhURVJOfHwodiktPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQykKKyNkZWZpbmUgSVNCQUREUih2KSAoKHYpLT52dHlwLT5hdHRyJiZzdHJzdHIoU1RSX0JBRERSLCh2KS0+dnR5cC0+YXR0cikpCisKK3N0YXRpYyBpbnQgZHBwdXNlKHN0cnVjdCBWYXIgKnYsaW50IHNlY3Rpb24pCit7CisgIGlmKHYtPnRhdHRyJkRQUDApIHJldHVybiAwOworICBpZih2LT50YXR0ciZEUFAxKSByZXR1cm4gMTsKKyAgaWYodi0+dGF0dHImRFBQMikgcmV0dXJuIDI7CisgIGlmKHYtPnRhdHRyJkRQUDMpIHJldHVybiAzOworICBpZihzZWN0aW9uPT1OQ0RBVEEpIHJldHVybiByb21kcHA7CisgIGlmKHNlY3Rpb249PU5EQVRBfHxzZWN0aW9uPT1OQlNTKSByZXR1cm4gcmFtZHBwOworICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgSVNGQVIoc3RydWN0IFZhciAqdikKK3sKKyAgc3RydWN0IFR5cCAqdnQ7CisgIGlmKHY9PSZudmFyKSByZXR1cm4gMDsKKyAgaWYodj09JmZ2YXIpIHJldHVybiAxOworICBpZihpc3NmcnYodil8fGlzZXNmcnYodil8fGlzc2ZyYml0dih2KXx8aXNlc2ZyYml0dih2KSkKKyAgICByZXR1cm4gMDsKKyAgdnQ9di0+dnR5cDsKKyAgd2hpbGUoSVNBUlJBWSh2dC0+ZmxhZ3MpKSB2dD12dC0+bmV4dDsKKyAgaWYodnQtPmF0dHImJnN0cnN0cihTVFJfTkVBUix2dC0+YXR0cikpCisgICAgcmV0dXJuIDA7CisgIGlmKEhVR0V8fExBUkdFKQorICAgIHJldHVybiAxOworICBpZih2dC0+YXR0ciYmKHN0cnN0cihTVFJfRkFSLHZ0LT5hdHRyKXx8c3Ryc3RyKFNUUl9IVUdFLHZ0LT5hdHRyKSkpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNwZWNpYWxfc2VjdGlvbihGSUxFICpmLHN0cnVjdCBWYXIgKnYpCit7CisgIGNoYXIgKnNlYywqZTsKKyAgaWYoIXYtPnZhdHRyKSByZXR1cm4gMDsKKyAgc2VjPXN0cnN0cih2LT52YXR0ciwic2VjdGlvbigiKTsKKyAgaWYoIXNlYykgcmV0dXJuIDA7CisgIHNlYys9c3RybGVuKCJzZWN0aW9uKCIpOworICBpZihmJiZUQVNLSU5HKXsKKyAgICBlbWl0KGYsc2VjX2VuZCk7CisgICAgZT1zZWNfZW5kOworICAgIHdoaWxlKCpzZWMmJipzZWMhPScpJykgeworICAgICAgKmUrKz0qc2VjOworICAgICAgZW1pdF9jaGFyKGYsKnNlYysrKTsKKyAgICB9CisgICAgKmU9MDsKKyAgICBzdHJjYXQoc2VjX2VuZCwiXHRlbmRzXG4iKTsKKyAgICBlbWl0KGYsIlx0U0VDVElPTiBMREFUIFdPUkQgUFVCTElDXG4iKTsKKyAgfWVsc2V7CisgICAgZW1pdChmLCJcdC5zZWN0aW9uXHQiKTsKKyAgICB3aGlsZSgqc2VjJiYqc2VjIT0nKScpIGVtaXRfY2hhcihmLCpzZWMrKyk7CisgICAgZW1pdChmLCJcbiIpOworICB9CisgIGlmKGYpIHNlY3Rpb249U1BFQ0lBTDsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnBjb25zdGxpc3QgeworICAgIHN0cnVjdCBmcGNvbnN0bGlzdCAqbmV4dDsKKyAgICBpbnQgbGFiZWwsdHlwOworICAgIHVuaW9uIGF0eXBzIHZhbDsKK30gKmZpcnN0ZnBjOworCitzdGF0aWMgaW50IGFkZGZwY29uc3Qoc3RydWN0IG9iaiAqbyxpbnQgdCkKK3sKKyAgc3RydWN0IGZwY29uc3RsaXN0ICpwPWZpcnN0ZnBjOworICB0Jj1OUTsKKyAgaWYoZ19mbGFnc1s0XSZVU0VERkxBRyl7CisgICAgZm9yKHA9Zmlyc3RmcGM7cDtwPXAtPm5leHQpeworICAgICAgaWYodD09cC0+dHlwKXsKKwlldmFsX2NvbnN0KCZwLT52YWwsdCk7CisJaWYodD09RkxPQVQmJnpsZGVxdG8odmxkb3VibGUsemYyemxkKG8tPnZhbC52ZmxvYXQpKSkgcmV0dXJuIHAtPmxhYmVsOworCWlmKHQ9PURPVUJMRSYmemxkZXF0byh2bGRvdWJsZSx6ZDJ6bGQoby0+dmFsLnZkb3VibGUpKSkgcmV0dXJuIHAtPmxhYmVsOworCWlmKHQ9PUxET1VCTEUmJnpsZGVxdG8odmxkb3VibGUsby0+dmFsLnZsZG91YmxlKSkgcmV0dXJuIHAtPmxhYmVsOworICAgICAgfQorICAgIH0KKyAgfQorICBwPW15bWFsbG9jKHNpemVvZihzdHJ1Y3QgZnBjb25zdGxpc3QpKTsKKyAgcC0+bmV4dD1maXJzdGZwYzsKKyAgcC0+bGFiZWw9KytsYWJlbDsKKyAgcC0+dHlwPXQ7CisgIHAtPnZhbD1vLT52YWw7CisgIGZpcnN0ZnBjPXA7CisgIHJldHVybiBwLT5sYWJlbDsKK30KK3N0YXRpYyB2b2lkIGNhbGxlZV9wdXNoKGxvbmcgdXNyLGxvbmcgc3lzKQoreworICBpZih1c3ItdXNyc3RhY2tvZmZzZXQ+dXNyc3RhY2spCisgICAgdXNyc3RhY2s9dXNyLXVzcnN0YWNrb2Zmc2V0OworICBpZihzeXMtc3lzc3RhY2tvZmZzZXQ+c3lzc3RhY2spCisgICAgc3lzc3RhY2s9c3lzLXN5c3N0YWNrb2Zmc2V0OworfQorc3RhdGljIHZvaWQgcHVzaChsb25nIHVzcixsb25nIHN5cykKK3sKKyAgdXNyc3RhY2tvZmZzZXQtPXVzcjsKKyAgaWYodXNyc3RhY2tvZmZzZXQ8dXNybWF4cHVzaGVkKSAKKyAgICB1c3JtYXhwdXNoZWQ9dXNyc3RhY2tvZmZzZXQ7CisgIGlmKC11c3JtYXhwdXNoZWQ+dXNyc3RhY2spIHVzcnN0YWNrPS11c3JtYXhwdXNoZWQ7CisgIHN5c3N0YWNrb2Zmc2V0LT1zeXM7CisgIGlmKHN5c3N0YWNrb2Zmc2V0PHN5c21heHB1c2hlZCkgCisgICAgc3lzbWF4cHVzaGVkPXN5c3N0YWNrb2Zmc2V0OworICBpZigtc3lzbWF4cHVzaGVkPnN5c3N0YWNrKSBzeXNzdGFjaz0tc3lzbWF4cHVzaGVkOworfQorc3RhdGljIHZvaWQgcG9wKGxvbmcgdXNyLGxvbmcgc3lzKQoreworICB1c3JzdGFja29mZnNldCs9dXNyOworICBzeXNzdGFja29mZnNldCs9c3lzOworfQoraW50IHBvaW50ZXJfdHlwZShzdHJ1Y3QgVHlwICpwKQoreworICBzdHJ1Y3QgVHlwICptZXJrPXA7CisgIGlmKCFwKSBpZXJyb3IoMCk7CisgIHdoaWxlKElTQVJSQVkocC0+ZmxhZ3MpfHxJU0ZVTkMocC0+ZmxhZ3MpKSBwPXAtPm5leHQ7CisgIGlmKHAtPmF0dHIpeworICAgIGlmKHN0cnN0cihwLT5hdHRyLFNUUl9IVUdFKSkgcmV0dXJuIEhQT0lOVEVSOworICAgIGlmKHN0cnN0cihwLT5hdHRyLFNUUl9GQVIpKSByZXR1cm4gRlBPSU5URVI7CisgICAgaWYoc3Ryc3RyKHAtPmF0dHIsU1RSX05FQVIpKSByZXR1cm4gTlBPSU5URVI7CisgIH0KKyAgaWYoKG1lcmstPmZsYWdzJk5RKT09RlVOS1QpeworICAgIGlmKFRJTlkpCisgICAgICByZXR1cm4gTlBPSU5URVI7CisgICAgZWxzZQorICAgICAgcmV0dXJuIEhQT0lOVEVSOworICB9CisgIGlmKExBUkdFKQorICAgIHJldHVybiBGUE9JTlRFUjsKKyAgZWxzZSBpZihIVUdFKQorICAgIHJldHVybiBIUE9JTlRFUjsKKyAgZWxzZQorICAgIHJldHVybiBOUE9JTlRFUjsKK30KK3N0YXRpYyBsb25nIHZvZmYoc3RydWN0IG9iaiAqcCkKK3sKKyAgaWYocC0+di0+b2Zmc2V0PDApCisgICAgcmV0dXJuIGxvZmYtem0ybChwLT52LT5vZmZzZXQpK3ptMmwocC0+dmFsLnZtYXgpLXVzcnN0YWNrb2Zmc2V0K3B1c2hlZHNpemUtMjsKKyAgcmV0dXJuIHptMmwocC0+di0+b2Zmc2V0KSt6bTJsKHAtPnZhbC52bWF4KS11c3JzdGFja29mZnNldDsKK30KK3N0YXRpYyBpbnQgYWxpZ25tZW50KHN0cnVjdCBvYmogKm8pCit7CisgIGlmKG8tPmZsYWdzJkRSRUZPQkopIHJldHVybiAxOworICBpZighKG8tPmZsYWdzJlZBUikpIGllcnJvcigwKTsKKyAgaWYoSVNTVEFUSUMoby0+dikpIHJldHVybiB6bTJsKG8tPnZhbC52bWF4KSYxOworICByZXR1cm4gdm9mZihvKSYxOworfQorCitzdGF0aWMgaW50IGlzc2VnOworCitzdGF0aWMgdm9pZCBlbWl0X29iaihGSUxFICpmLHN0cnVjdCBvYmogKnAsaW50IHQpCisvKiAgR2lidCBPYmpla3QgYXVmIEJpbGRzY2hpcm0gYXVzICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGlmKHAtPmFtKXsKKyAgICBzdGF0aWMgc3RydWN0IHJwYWlyIGJwOworICAgIGludCBiYXNlOworICAgIGlmKHJlZ19wYWlyKHAtPmFtLT5iYXNlLCZicCkpCisgICAgICBiYXNlPWJwLlNPRjsKKyAgICBlbHNlCisgICAgICBiYXNlPXAtPmFtLT5iYXNlOworICAgIGlmKHAtPmFtLT5mbGFncz09UE9TVF9JTkMpeworICAgICAgZW1pdChmLCJbJXMrXSIscmVnbmFtZXNbYmFzZV0pOworICAgICAgcmV0dXJuOworICAgIH1lbHNlIGlmKHAtPmFtLT5mbGFncz09UFJFX0RFQyl7CisgICAgICBlbWl0KGYsIlstJXNdIixyZWduYW1lc1tiYXNlXSk7CisgICAgICByZXR1cm47CisgICAgfWVsc2V7CisgICAgICBlbWl0KGYsIlslcysjJWxkIixyZWduYW1lc1tiYXNlXSxwLT5hbS0+b2Zmc2V0KTsKKyAgICAgIGlmKHAtPmFtLT52KXsKKwlpZihwLT5hbS0+di0+c3RvcmFnZV9jbGFzcz09U1RBVElDKQorCSAgZW1pdChmLCIrJXMlbGQiLGxhYnByZWZpeCx6bTJsKHAtPmFtLT52LT5vZmZzZXQpKTsKKwllbHNlCisJICBlbWl0KGYsIislcyVzIixpZHByZWZpeCxwLT5hbS0+di0+aWRlbnRpZmllcik7CisgICAgICB9CisgICAgICBlbWl0KGYsIl0iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgaWYoKHAtPmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PShLT05TVHxEUkVGT0JKKSl7CisgICAgZW1pdHZhbChmLCZwLT52YWwscC0+ZHR5cCZOVSk7CisgICAgcmV0dXJuOworICB9CisgIGlmKChwLT5mbGFncyYoRFJFRk9CSnxSRUcpKT09KERSRUZPQkp8UkVHKSkgZW1pdChmLCJbIik7CisgIGlmKHAtPmZsYWdzJlZBUkFEUikgZW1pdChmLCIjIik7CisgIGlmKChwLT5mbGFncyYoVkFSfFJFRykpPT1WQVIpeworICAgIGlmKHAtPnY9PSZudmFyfHxwLT52PT0mZnZhcil7CisgICAgICBpZihwLT52PT0mZnZhcikgZW1pdChmLCJTT0YgIik7CisgICAgICBlbWl0dmFsKGYsJnAtPnZhbCxwLT5kdHlwJk5VKTsKKyAgICAgIHJldHVybjsKKyAgICB9ZWxzZSBpZihpc3NmcnYocC0+dil8fGlzZXNmcnYocC0+dil8fGlzc2ZyYml0dihwLT52KXx8aXNlc2ZyYml0dihwLT52KSl7CisgICAgICBlbWl0KGYsIiVzIixwLT52LT5pZGVudGlmaWVyKTsKKyAgICB9ZWxzZSBpZihwLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CisgICAgICBpZih2b2ZmKHApKQorCWVtaXQoZiwiWyVzKyMlbGRdIixyZWduYW1lc1tzcF0sdm9mZihwKSk7CisgICAgICBlbHNlIGVtaXQoZiwiWyVzXSIscmVnbmFtZXNbc3BdKTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKCFpc3NlZyYmIUlTRlVOQyhwLT52LT52dHlwLT5mbGFncykpeworICAgICAgICBpZihJU0ZBUihwLT52KSkgCisgICAgICAgICAgZW1pdChmLCJTT0YgIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBlbWl0KGYsIkRQUFg6Iik7CisgICAgICB9CisgICAgICBpc3NlZz0wOworICAgICAgaWYoIXptZXF0byhsMnptKDBMKSxwLT52YWwudm1heCkpe2VtaXR2YWwoZiwmcC0+dmFsLExPTkcpO2VtaXQoZiwiKyIpO30KKyAgICAgIGlmKHAtPnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQyl7CisJZW1pdChmLCIlcyVsZCIsbGFicHJlZml4LHptMmwocC0+di0+b2Zmc2V0KSk7CisgICAgICB9ZWxzZXsKKwllbWl0KGYsIiVzJXMiLGlkcHJlZml4LHAtPnYtPmlkZW50aWZpZXIpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihwLT5mbGFncyZSRUcpeworICAgIGlmKHAtPnJlZz09TVRNUDF8fHAtPnJlZz09TVRNUDIpeworICAgICAgaWYoIXJlZ19wYWlyKHAtPnJlZywmcnApKSBpZXJyb3IoMCk7CisgICAgICBlbWl0KGYsIiVzIixyZWduYW1lc1tycC5TT0ZdKTsKKyAgICB9ZWxzZXsKKyAgICAgIGVtaXQoZiwiJXMiLHJlZ25hbWVzW3AtPnJlZ10pOworICAgICAgaWYoKHQmTlEpPT1CSVQpIGVtaXQoZiwiLjAiKTsKKyAgICB9CisgIH0KKyAgLyogc29tZXRpbWVzIHdlIGp1c3Qgb3IgYSBSRUcgaW50byBhIEtPTlNUICovCisgIGlmKChwLT5mbGFncyYoS09OU1R8UkVHKSk9PUtPTlNUKXsKKyAgICBpZihJU0ZMT0FUKHQpKXsKKyAgICAgIGVtaXQoZiwiJXMlZCIsbGFicHJlZml4LGFkZGZwY29uc3QocCx0KSk7CisgICAgfWVsc2V7CisgICAgICBlbWl0KGYsIiMiKTtlbWl0dmFsKGYsJnAtPnZhbCx0Jk5VKTsKKyAgICB9CisgIH0KKyAgaWYoKHAtPmZsYWdzJihEUkVGT0JKfFJFRykpPT0oRFJFRk9CSnxSRUcpKSBlbWl0KGYsIl0iKTsKK30KKworc3RhdGljIHZvaWQgcHIoRklMRSAqZixzdHJ1Y3QgSUMgKnApCit7Cit9CitzdGF0aWMgaW50IHN3aXRjaGVkX2Jhbms7CitzdGF0aWMgdm9pZCBmdW5jdGlvbl90b3AoRklMRSAqZixzdHJ1Y3QgVmFyICp2LGxvbmcgb2Zmc2V0KQorLyogIGVyemV1Z3QgRnVua3Rpb25za29wZiAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGk7Y2hhciAqdG1wOworICBzdGF0aWMgaW50IHdyb3RlX2hlYWRlcjsKKyAgaWYoZiYmIXdyb3RlX2hlYWRlcil7CisgICAgd3JvdGVfaGVhZGVyPTE7CisgICAgaWYoIVRBU0tJTkcpeworICAgICAgZW1pdChmLCJcdC5zZnJcdFpFUk9TLDB4ZmUsMHg4ZVxuIik7CisgICAgICBlbWl0KGYsIlx0LnNmclx0T05FUywweGZlLDB4OGZcbiIpOworICAgICAgZW1pdChmLCJcdC5zZnJcdENQLDB4ZmUsMHgwOFxuIik7CisgICAgICBlbWl0KGYsIlx0LnNmclx0TURILDB4ZmUsMHgwNlxuIik7CisgICAgICBlbWl0KGYsIlx0LnNmclx0TURMLDB4ZmUsMHgwN1xuIik7CisgICAgICBlbWl0KGYsIlx0LnNmclx0UFNXLDB4ZmUsMHg4OFxuIik7CisgICAgfQorICB9CisgIGhhdmVfZnJhbWU9MDtzdGFja192YWxpZD0xOworICBwdXNoZWRzaXplPTA7CisgIGlmKHYtPnZhdHRyJiYodG1wPXN0cnN0cih2LT52YXR0ciwiaXZlYygiKSkpeworICAgIGludCB2ZWM7Y2hhciBjO2ludCByYzsKKyAgICByYz1zc2NhbmYodG1wKzUsIiVpJWMiLCZ2ZWMsJmMpOworICAgIGlmKHJjIT0yfHxjIT0nKScpIGVycm9yKDMyNCwiaWxsZWdhbCB2ZWN0b3IgbnVtYmVyIik7CisgICAgZW1pdChmLCJcdC5zZWN0aW9uXHRcIi5pdmVjJWRcIixcImF4clwiXG4iLHZlYyk7CisgICAgZW1pdChmLCJcdC5nbG9iYWxcdGl2ZWMlZFxuaXZlYyVkOlxuIix2ZWMsdmVjKTsKKyAgICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pCisgICAgICBlbWl0KGYsIlx0am1wc1x0JXMlc1xuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICBlbHNlCisgICAgICBlbWl0KGYsIlx0am1wc1x0JXMlbGRcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgc2VjdGlvbj0tMTsKKyAgfQorICBpZighc3BlY2lhbF9zZWN0aW9uKGYsdikmJnNlY3Rpb24hPUNPREUpeworICAgIGlmKGYmJlRBU0tJTkcpeworICAgICAgZW1pdChmLHNlY19lbmQpO2VtaXQoZixjb2RlbmFtZSk7CisgICAgICBzZWN0aW9uPUNPREU7CisgICAgICBzdHJjcHkoc2VjX2VuZCxlY29kZSk7CisgICAgfWVsc2UKKyAgICAgIGVtaXQoZixjb2RlbmFtZSk7CisgIH0KKyAgaWYoVEFTS0lORyl7CisgICAgaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKKyAgICAgIGlmKCh2LT5mbGFncyYoSU5MSU5FRlVOQ3xJTkxJTkVFWFQpKSE9SU5MSU5FRlVOQykKKwllbWl0KGYsIlx0cHVibGljXHQlcyVzXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgICAgaWYoVElOWSkKKwllbWl0KGYsIiVzJXNcdHByb2NcdG5lYXJcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgICBlbHNlCisJZW1pdChmLCIlcyVzXHRwcm9jXHRmYXJcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgfWVsc2V7CisgICAgICBpZihUSU5ZKQorCWVtaXQoZiwiJXMlbGRcdHByb2NcdG5lYXJcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgICBlbHNlCisJZW1pdChmLCIlcyVsZFx0cHJvY1x0ZmFyXG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICAgIH0KKyAgfWVsc2V7CisgICAgaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKKyAgICAgIGlmKCh2LT5mbGFncyYoSU5MSU5FRlVOQ3xJTkxJTkVFWFQpKSE9SU5MSU5FRlVOQykKKwllbWl0KGYsIlx0Lmdsb2JhbFx0JXMlc1xuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICAgIGVtaXQoZiwiXHQuYWxpZ25cdDFcbiVzJXM6XG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOyAKKyAgICB9ZWxzZXsKKyAgICAgIGVtaXQoZiwiXHQuYWxpZ25cdDFcbiVzJWxkOlxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsgIAorICAgIH0KKyAgfQorICBpZih2LT52YXR0ciYmKHRtcD1zdHJzdHIodi0+dmF0dHIsInJiYW5rKCIpKSl7CisgICAgY2hhciAqcDsKKyAgICB0bXArPXN0cmxlbigicmJhbmsoIik7CisgICAgZW1pdChmLCJcdG1vdlx0JXMiLGlkcHJlZml4KTsKKyAgICBmb3IocD10bXA7KnAmJipwIT0nKSc7cCsrKSBlbWl0X2NoYXIoZiwqcCk7CisgICAgZW1pdChmLCIsJXNcbiIscmVnbmFtZXNbc3BdKTsKKyAgICBlbWl0KGYsIlx0c2N4dFx0Q1AsIyVzIixpZHByZWZpeCk7CisgICAgZm9yKHA9dG1wOypwJiYqcCE9JyknO3ArKykgZW1pdF9jaGFyKGYsKnApOworICAgIGVtaXQoZiwiXG4iKTsKKyAgICBzd2l0Y2hlZF9iYW5rPTE7CisgIH1lbHNlCisgICAgc3dpdGNoZWRfYmFuaz0wOworICBpZih2LT50YXR0ciZJTlRFUlJVUFQpeworICAgIC8qRklYTUU/Ki8KKyAgICBlbWl0KGYsIlx0cHVzaFx0TURMXG4iKTsKKyAgICBlbWl0KGYsIlx0cHVzaFx0TURIXG4iKTsKKyAgfQorICBpZihzdGFja19jaGVjayl7CisgICAgc3RhY2tjaGVja2xhYmVsPSsrbGFiZWw7CisgICAgQlNFVChyZWdzX21vZGlmaWVkLHRwKTsKKyAgICBlbWl0KGYsIlx0bW92XHQlcywjJXMlZFxuIixyZWduYW1lc1t0cF0sbGFicHJlZml4LHN0YWNrY2hlY2tsYWJlbCk7CisgICAgZW1pdChmLCJcdCVzXHQlc19fc3RhY2tfY2hlY2tcbiIsY2FsbCxpZHByZWZpeCk7LypGSVhNRTp1c3JzdGFjayovCisgIH0KKyAgZm9yKGk9MTtpPD0xNjtpKyspeworICAgIGlmKHJlZ3VzZWRbaV0mJiFyZWdzY3JhdGNoW2ldJiYhcmVnc2FbaV0peworICAgICAgZW1pdChmLCJcdG1vdlx0Wy0lc10sJXNcbiIscmVnbmFtZXNbc3BdLHJlZ25hbWVzW2ldKTsKKyAgICAgIHB1c2goMiwwKTsKKyAgICAgIGhhdmVfZnJhbWU9MTtwdXNoZWRzaXplKz0yOworICAgIH0KKyAgfQorICBpZihvZmZzZXQpeworICAgIGVtaXQoZiwiXHRzdWJcdCVzLCMlbGRcbiIscmVnbmFtZXNbc3BdLG9mZnNldCk7CisgICAgaGF2ZV9mcmFtZT0xOworICB9Cit9CitzdGF0aWMgdm9pZCBmdW5jdGlvbl9ib3R0b20oRklMRSAqZixzdHJ1Y3QgVmFyICp2LGxvbmcgb2Zmc2V0KQorLyogIGVyemV1Z3QgRnVua3Rpb25zZW5kZSAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGk7CisgIGlmKG9mZnNldCkgZW1pdChmLCJcdGFkZFx0JXMsIyVsZFxuIixyZWduYW1lc1tzcF0sb2Zmc2V0KTsKKyAgZm9yKGk9MTY7aT4wO2ktLSl7CisgICAgaWYocmVndXNlZFtpXSYmIXJlZ3NjcmF0Y2hbaV0mJiFyZWdzYVtpXSl7CisgICAgICBlbWl0KGYsIlx0bW92XHQlcyxbJXMrXVxuIixyZWduYW1lc1tpXSxyZWduYW1lc1tzcF0pOworICAgICAgcG9wKDIsMCk7CisgICAgfQorICB9CisgIGlmKHYtPnRhdHRyJklOVEVSUlVQVCl7CisgICAgZW1pdChmLCJcdHBvcFx0TURIXG4iKTsKKyAgICBlbWl0KGYsIlx0cG9wXHRNRExcbiIpOworICB9CisgIGlmKHN3aXRjaGVkX2JhbmspCisgICAgZW1pdChmLCJcdHBvcFx0Q1BcbiIpOworICBpZihyZXQpIGVtaXQoZiwiXHQlc1xuIixyZXQpOworICBpZihUQVNLSU5HKXsKKyAgICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4peworICAgICAgZW1pdChmLCIlcyVzXHRlbmRwXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgICAgaWYoIXN0cmNtcCgibWFpbiIsdi0+aWRlbnRpZmllcikpIGVtaXQoZiwiXHRleHRlcm5cdF9fQ1NUQVJUOmZhclxuIik7CisgICAgfWVsc2UKKyAgICAgIGVtaXQoZiwiJXMlbGRcdGVuZHBcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgIH1lbHNleworICAgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisgICAgICBlbWl0KGYsIlx0LnR5cGVcdCVzJXMsQGZ1bmN0aW9uXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgICAgZW1pdChmLCJcdC5zaXplXHQlcyVzLCQtJXMlc1xuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgIH1lbHNleworICAgICAgZW1pdChmLCJcdC50eXBlXHQlcyVsZCxAZnVuY3Rpb25cbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgICBlbWl0KGYsIlx0LnNpemVcdCVzJWxkLCQtJXMlbGRcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSxsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKyAgICB9CisgIH0KKyAgaWYoc3RhY2tfY2hlY2spCisgICAgZW1pdChmLCIlcyVkXHRlcXVcdCVsZFxuIixsYWJwcmVmaXgsc3RhY2tjaGVja2xhYmVsLG9mZnNldCtwdXNoZWRzaXplLXVzcm1heHB1c2hlZCk7CisgIGlmKHN0YWNrX3ZhbGlkKXsKKyAgICBsb25nIHVzdGFjaz11c3JzdGFjaytvZmZzZXQrcHVzaGVkc2l6ZSxzc3RhY2s9c3lzc3RhY2s7CisgICAgaWYoIXYtPmZpKSB2LT5maT1uZXdfZmkoKTsKKyAgICBpZih2LT5maS0+ZmxhZ3MmQUxMX1NUQUNLKXsKKyAgICAgIGlmKHYtPmZpLT5zdGFjazEhPXVzdGFjaykKKyAgICAgICAgaWYoZikgZXJyb3IoMzE5LCJ1c2VyLSIsdXN0YWNrLHYtPmZpLT5zdGFjazEpOworICAgICAgaWYodi0+ZmktPnN0YWNrMiE9c3N0YWNrKQorICAgICAgICBpZihmKSBlcnJvcigzMTksInN5c3RlbS0iLHNzdGFjayx2LT5maS0+c3RhY2syKTsKKyAgICB9ZWxzZXsKKyAgICAgIHYtPmZpLT5mbGFnc3w9QUxMX1NUQUNLOworICAgICAgdi0+ZmktPnN0YWNrMT11c3RhY2s7CisgICAgICB2LT5maS0+c3RhY2syPXNzdGFjazsKKyAgICB9CisjaWYgMAorICAgIGVtaXQoZiwiJXMgdXNyc3RhY2tzaXplPSVsZFxuIixjb21tZW50LHptMmwodi0+ZmktPnN0YWNrMSkpOworICAgIGVtaXQoZiwiJXMgc3lzc3RhY2tzaXplPSVsZFxuIixjb21tZW50LHptMmwodi0+ZmktPnN0YWNrMikpOworI2VuZGlmCisgICAgaWYoVEFTS0lORyl7CisgICAgfWVsc2V7CisgICAgICBlbWl0KGYsIlx0LmVxdVx0JXNfX3VzdGFja18lcywlbGRcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcix6bTJsKHYtPmZpLT5zdGFjazEpKTsKKyAgICAgIGVtaXQoZiwiXHQuZXF1XHQlc19fc3N0YWNrXyVzLCVsZFxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyLHptMmwodi0+ZmktPnN0YWNrMikpOworICAgIH0KKyAgfQorfQorc3RhdGljIGludCBjb21wYXJlX29iamVjdHMoc3RydWN0IG9iaiAqbzEsc3RydWN0IG9iaiAqbzIpCit7CisgIGlmKG8xLT5mbGFncz09bzItPmZsYWdzJiZvMS0+YW09PW8yLT5hbSl7CisgICAgaWYoIShvMS0+ZmxhZ3MmVkFSKXx8KG8xLT52PT1vMi0+diYmem1lcXRvKG8xLT52YWwudm1heCxvMi0+dmFsLnZtYXgpKSl7CisgICAgICBpZighKG8xLT5mbGFncyZSRUcpfHxvMS0+cmVnPT1vMi0+cmVnKXsKKwlyZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisjZGVmaW5lIEVYVF9JQ19DTVBJQSAxCisjZGVmaW5lIEVYVF9JQ19CVFNUICAyCisjZGVmaW5lIEVYVF9JQ19DTVBJQiAzCitzdGF0aWMgdm9pZCBjbGVhcl9leHRfaWMoc3RydWN0IGV4dF9pYyAqcCkKK3sKKyAgcC0+ZmxhZ3M9MDsKKyAgcC0+cj0wOworICBwLT5vZmZzZXQ9MDsKK30KK3N0YXRpYyBsb25nIHBvZjIoenVtYXggeCkKKy8qICBZaWVsZHMgbG9nMih4KSsxIG9kZXIgMC4gKi8KK3sKKyAgenVtYXggcDtpbnQgbG49MTsKKyAgcD11bDJ6dW0oMUwpOworICB3aGlsZShsbjw9MzImJnp1bWxlcShwLHgpKXsKKyAgICBpZih6dW1lcXRvKHgscCkpIHJldHVybiBsbjsKKyAgICBsbisrO3A9enVtYWRkKHAscCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CitzdGF0aWMgdm9pZCBwZWVwaG9sZShzdHJ1Y3QgSUMgKnApCit7CisgIGludCBjLGMyLHIsdDtzdHJ1Y3QgSUMgKnAyOworICBzdHJ1Y3QgQWRkcmVzc2luZ01vZGUgKmFtOworICBmcmFtZV91c2VkPTA7CisgIGZvcig7cDtwPXAtPm5leHQpeworICAgIGM9cC0+Y29kZTsKKyAgICBpZighZnJhbWVfdXNlZCl7CisgICAgICBpZigocC0+cTEuZmxhZ3MmKFJFR3xWQVIpKT09VkFSJiYhSVNTVEFUSUMocC0+cTEudikpIGZyYW1lX3VzZWQ9MTsKKyAgICAgIGlmKChwLT5xMi5mbGFncyYoUkVHfFZBUikpPT1WQVImJiFJU1NUQVRJQyhwLT5xMi52KSkgZnJhbWVfdXNlZD0xOworICAgICAgaWYoKHAtPnouZmxhZ3MmKFJFR3xWQVIpKT09VkFSJiYhSVNTVEFUSUMocC0+ei52KSkgZnJhbWVfdXNlZD0xOworICAgIH0KKyAgICAvKiBsZXR6dGVzIExhYmVsIG1lcmtlbiAqLworICAgIGlmKGMhPUZSRUVSRUcmJmMhPUFMTE9DUkVHJiYoYyE9U0VUUkVUVVJOfHwhaXNyZWcocTEpfHxwLT5xMS5yZWchPXAtPnoucmVnKSkgZXhpdF9sYWJlbD0wOworICAgIGlmKGM9PUxBQkVMKSBleGl0X2xhYmVsPXAtPnR5cGY7CisgICAgLyogYW5kIHgsI2NvbnN0O2JuZS9iZXEgKi8KKyAgICBpZihjPT1BTkQmJmlzY29uc3QocTIpJiZpc3JlZyh6KSYmIUlTTFdPUkQoenR5cChwKSkpeworICAgICAgbG9uZyBiaXQ7CisgICAgICBldmFsX2NvbnN0KCZwLT5xMi52YWwscC0+dHlwZik7CisgICAgICBpZihiaXQ9cG9mMih2dW1heCkpeworCXN0cnVjdCBJQyAqY21wPTA7aW50IGZyPTA7CisJZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpeworCSAgYzI9cDItPmNvZGU7CisJICBpZihjMj09VEVTVCl7CisJICAgIGlmKChwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09cC0+ei5yZWcpeworCSAgICAgIGNtcD1wMjtjb250aW51ZTsKKwkgICAgfQorCSAgfQorCSAgaWYoYzI9PUNPTVBBUkUmJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09cC0+ei5yZWcmJihwMi0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworCSAgICBldmFsX2NvbnN0KCZwMi0+cTIudmFsLHAyLT50eXBmKTsKKwkgICAgaWYoSVNOVUxMKCkpeworCSAgICAgIGNtcD1wMjtjb250aW51ZTsKKwkgICAgfQorCSAgICBicmVhazsKKwkgIH0KKwkgIGlmKGMyPT1GUkVFUkVHJiZwMi0+cTEucmVnPT1wLT56LnJlZykge2ZyKys7Y29udGludWU7fQorCSAgaWYoKGMyPT1CTkV8fGMyPT1CRVEpJiZjbXAmJmZyPT0xKXsKKwkgICAgcC0+ZXh0LmZsYWdzPUVYVF9JQ19CVFNUOworCSAgICBwMi0+ZXh0LmZsYWdzPUVYVF9JQ19CVFNUOworCSAgICBwMi0+ZXh0Lm9mZnNldD1iaXQtMTsKKwkgICAgY21wLT5jb2RlPU5PUDsKKwkgICAgY21wLT5xMS5mbGFncz1jbXAtPnEyLmZsYWdzPWNtcC0+ei5mbGFncz0wOworCSAgICBicmVhazsKKwkgIH0KKwkgIGlmKCgocDItPnExLmZsYWdzJlJFRykmJnAyLT5xMS5yZWc9PXAtPnoucmVnKXx8KChwMi0+cTIuZmxhZ3MmUkVHKSYmcDItPnEyLnJlZz09cC0+ei5yZWcpfHwoKHAyLT56LmZsYWdzJlJFRykmJnAyLT56LnJlZz09cC0+ei5yZWcpKSBicmVhazsKKwkgIGlmKGMyPT1DQUxMfHxjMj09TEFCRUx8fChjMj49QkVRJiZjMjw9QlJBKSkgYnJlYWs7CisJfQorICAgICAgfQorICAgIH0KKyAgICAvKiBbUngrXSBpbiBxMSAqLworICAgIGlmKCFwLT5xMS5hbSYmKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopKXsKKyAgICAgIHI9cC0+cTEucmVnOyB0PXExdHlwKHApOworICAgICAgaWYoKCEocC0+cTIuZmxhZ3MmUkVHKXx8cC0+cTIucmVnIT1yKSYmKCEocC0+ei5mbGFncyZSRUcpfHxwLT56LnJlZyE9cikpeworCWZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKwkgIGMyPXAyLT5jb2RlOworCSAgaWYoKGMyPT1BRER8fChjMj09QURESTJQJiYocDItPnR5cGYyJk5RKSE9SFBPSU5URVIpKSYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09ciYmcDItPnoucmVnPT1yJiYocDItPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKwkgICAgZXZhbF9jb25zdCgmcDItPnEyLnZhbCxwMi0+dHlwZjIpOworCSAgICBpZigoem1lcXRvKHZtYXgsbDJ6bSgxTCkpJiYodCZOUSk9PUNIQVIpfHwoem1lcXRvKHZtYXgsbDJ6bSgyTCkpJiZJU0hXT1JEKHQpKSl7CisJICAgICAgcDItPmNvZGU9Tk9QOworCSAgICAgIHAyLT5xMS5mbGFncz1wMi0+cTIuZmxhZ3M9cDItPnouZmxhZ3M9MDsKKwkgICAgICBwLT5xMS5hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CisJICAgICAgcC0+cTEuYW0tPmZsYWdzPVBPU1RfSU5DOworCSAgICAgIHAtPnExLmFtLT5iYXNlPXI7CisJICAgIH1lbHNlIGJyZWFrOworCSAgfQorCSAgaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKKwkgIGlmKCgocDItPnExLmZsYWdzJlJFRykmJnAyLT5xMS5yZWc9PXIpfHwoKHAyLT5xMi5mbGFncyZSRUcpJiZwMi0+cTIucmVnPT1yKXx8KChwMi0+ei5mbGFncyZSRUcpJiZwMi0+ei5yZWc9PXIpKSBicmVhazsKKwl9CisgICAgICB9CisgICAgfQorICAgIC8qIFtSeCtdIGluIHEyICovCisgICAgaWYoIXAtPnEyLmFtJiYocC0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikpeworICAgICAgcj1wLT5xMi5yZWc7IHQ9cTJ0eXAocCk7CisgICAgICBpZigoIShwLT5xMS5mbGFncyZSRUcpfHxwLT5xMS5yZWchPXIpJiYoIShwLT56LmZsYWdzJlJFRyl8fHAtPnoucmVnIT1yKSl7CisJZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpeworICAgICAgICAgIGMyPXAyLT5jb2RlOworCSAgaWYoKGMyPT1BRER8fChjMj09QURESTJQJiYocDItPnR5cGYyJk5RKSE9SFBPSU5URVIpKSYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09ciYmcDItPnoucmVnPT1yJiYocDItPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKwkgICAgZXZhbF9jb25zdCgmcDItPnEyLnZhbCxwMi0+dHlwZjIpOworCSAgICBpZigoem1lcXRvKHZtYXgsbDJ6bSgxTCkpJiYodCZOUSk9PUNIQVIpfHwoem1lcXRvKHZtYXgsbDJ6bSgyTCkpJiZJU0hXT1JEKHQpKSl7CisJICAgICAgcDItPmNvZGU9Tk9QOworCSAgICAgIHAyLT5xMS5mbGFncz1wMi0+cTIuZmxhZ3M9cDItPnouZmxhZ3M9MDsKKwkgICAgICBwLT5xMi5hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CisJICAgICAgcC0+cTIuYW0tPmZsYWdzPVBPU1RfSU5DOworCSAgICAgIHAtPnEyLmFtLT5iYXNlPXI7CisJICAgIH1lbHNlIGJyZWFrOworCSAgfQorCSAgaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKKwkgIGlmKCgocDItPnExLmZsYWdzJlJFRykmJnAyLT5xMS5yZWc9PXIpfHwoKHAyLT5xMi5mbGFncyZSRUcpJiZwMi0+cTIucmVnPT1yKXx8KChwMi0+ei5mbGFncyZSRUcpJiZwMi0+ei5yZWc9PXIpKSBicmVhazsKKwl9CisgICAgICB9CisgICAgfQorICAgIC8qIG1vdmUgeC0+dDsgYWRkL3N1YiB4LCMxLy0xLzIvLTItPiB4OyB0ZXN0L2NtcCB0LCMwOyBmcmVlcmVnIHQgPT4gY21waWQxMiAqLworICAgIGlmKGM9PUFTU0lHTiYmaXNyZWcocTEpJiZpc3JlZyh6KSYmSVNIV09SRChwLT50eXBmKSl7CisgICAgICBwMj1wLT5uZXh0O2lmKHAyKSBjMj1wMi0+Y29kZTsKKyAgICAgIGlmKHAyJiYoYzI9PUFERHx8YzI9PVNVQnx8YzI9PUFEREkyUHx8YzI9PVNVQklGUCkmJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMS5yZWc9PXAtPnExLnJlZyYmcDItPnoucmVnPT1wMi0+cTEucmVnJiYocDItPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUJiZJU0hXT1JEKHAyLT50eXBmKSl7CisJbG9uZyBsOworCWV2YWxfY29uc3QoJnAyLT5xMi52YWwscDItPnR5cGYpOworCWw9em0ybCh2bWF4KTsKKwlpZigobD09MXx8bD09Mnx8bD09LTF8fGw9PS0yKSYmcDItPm5leHQpeworCSAgc3RydWN0IElDICpwMz1wMi0+bmV4dDsKKwkgIGlmKChwMy0+Y29kZT09VEVTVHx8KHAzLT5jb2RlPT1DT01QQVJFJiYocDMtPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKSkmJihwMy0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDMtPnExLnJlZz09cC0+ei5yZWcmJnNjcmF0Y2hyZWcocC0+ei5yZWcscDMpJiZJU0hXT1JEKHAzLT50eXBmKSl7CisJICAgIGlmKGMyPT1TVUJ8fGMyPT1TVUJJRlApIGw9LWw7CisJICAgIHAzLT5xMT1wLT5xMTsKKwkgICAgcC0+Y29kZT1jPU5PUDsKKwkgICAgcC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworCSAgICBwMi0+Y29kZT1OT1A7CisJICAgIHAyLT5xMS5mbGFncz1wMi0+cTIuZmxhZ3M9cDItPnouZmxhZ3M9MDsKKwkgICAgcDMtPmV4dC5mbGFncz1FWFRfSUNfQ01QSUI7CisJICAgIHAzLT5leHQub2Zmc2V0PWw7CisJICAgIHAzLT5leHQucj1wLT5xMS5yZWc7CisJICB9CisJfQorICAgICAgfQorICAgIH0KKyAgICAvKiBhZGQvc3ViIHgsIzEvMi8tMS8tMiAtPng7IGNtcCB4LCNjID0+IGNtcGlkMTIgeCwjYystMTIgKi8KKyAgICBpZigoYz09QUREfHxjPT1TVUJ8fGM9PUFEREkyUHx8Yz09U1VCSUZQKSYmaXNyZWcocTEpJiZpc3JlZyh6KSYmcC0+cTEucmVnPT1wLT56LnJlZyYmaXNjb25zdChxMikmJklTSFdPUkQocC0+dHlwZikmJiFyZWdfcGFpcihwLT5xMS5yZWcsJnJwKSl7CisgICAgICBldmFsX2NvbnN0KCZwLT5xMi52YWwscC0+dHlwZik7CisgICAgICBpZih6bWVxdG8odm1heCxsMnptKC0xTCkpfHx6bWVxdG8odm1heCxsMnptKC0yTCkpfHx6bWVxdG8odm1heCxsMnptKDFMKSl8fHptZXF0byh2bWF4LGwyem0oMkwpKSl7CisJbG9uZyBsPXptMmwodm1heCk7CisJaWYoYz09U1VCfHxjPT1TVUJJRlApIGw9LWw7CisJcj1wLT5xMS5yZWc7CisJZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpeworCSAgYzI9cDItPmNvZGU7CisJICBpZigocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMS5yZWc9PXImJihjMj09VEVTVHx8KGMyPT1DT01QQVJFJiYocDItPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKSkmJklTSFdPUkQocDItPnR5cGYpKXsKKwkgICAgdW5zaWduZWQgbG9uZyB1bDsKKwkgICAgZXZhbF9jb25zdCgmcDItPnEyLnZhbCxxMnR5cChwMikpOworCSAgICB1bD16dW0ydWwodnVtYXgpOworCSAgICBpZih1bDw2NTUzNCl7CisJICAgICAgcDItPmV4dC5mbGFncz1FWFRfSUNfQ01QSUE7CisJICAgICAgcDItPmV4dC5vZmZzZXQ9bDsKKwkgICAgICBwMi0+ZXh0LnI9cjsKKwkgICAgICBwLT5jb2RlPWM9Tk9QOworCSAgICAgIHAtPnExLmZsYWdzPXAtPnEyLmZsYWdzPXAtPnouZmxhZ3M9MDsKKwkgICAgfQorCSAgICBicmVhazsKKworCSAgfQorCSAgaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKKwkgIGlmKChwMi0+cTEuZmxhZ3MmUkVHKSYmcDItPnExLnJlZz09cikgYnJlYWs7CisJICBpZigocDItPnEyLmZsYWdzJlJFRykmJnAyLT5xMi5yZWc9PXIpIGJyZWFrOworCSAgaWYoKHAyLT56LmZsYWdzJlJFRykmJnAyLT56LnJlZz09cikgYnJlYWs7CisJfQorICAgICAgfQorICAgIH0KKyAgICAvKiBbUngrI2NvbnN0XSAqLworICAgIGlmKChjPT1BRERJMlB8fGM9PVNVQklGUCkmJigocC0+dHlwZjImTlEpPT1OUE9JTlRFUnx8KHAtPnR5cGYyJk5RKT09RlBPSU5URVIpJiZpc3JlZyh6KSYmKChwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVHx8KHAtPnExLmZsYWdzJlZBUkFEUikpKXsKKyAgICAgIGludCBiYXNlO3ptYXggb2Y7c3RydWN0IG9iaiAqbztzdHJ1Y3QgVmFyICp2OworICAgICAgaWYocC0+cTEuZmxhZ3MmVkFSQURSKXsKKwl2PXAtPnExLnY7CisJb2Y9cC0+cTEudmFsLnZtYXg7CisJcj1wLT56LnJlZzsKKwlpZihpc3JlZyhxMikpIGJhc2U9cC0+cTIucmVnOyBlbHNlIGJhc2U9cjsKKyAgICAgIH1lbHNleworCWV2YWxfY29uc3QoJnAtPnEyLnZhbCxwLT50eXBmKTsKKwlpZihjPT1TVUJJRlApIG9mPXptc3ViKGwyem0oMEwpLHZtYXgpOyBlbHNlIG9mPXZtYXg7CisJdj0wOworCXI9cC0+ei5yZWc7CisJaWYoaXNyZWcocTEpKSBiYXNlPXAtPnExLnJlZzsgZWxzZSBiYXNlPXI7CisgICAgICB9CisgICAgICBvPTA7CisgICAgICBmb3IocDI9cC0+bmV4dDtwMjtwMj1wMi0+bmV4dCl7CisJYzI9cDItPmNvZGU7CisJaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKKwlpZihjMiE9RlJFRVJFRyYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1yKSBicmVhazsKKwlpZihjMiE9RlJFRVJFRyYmKHAyLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTIucmVnPT1yKSBicmVhazsKKwlpZihjMiE9Q0FMTCYmKGMyPExBQkVMfHxjMj5CUkEpLyomJmMyIT1BRERSRVNTKi8peworCSAgaWYoIXAyLT5xMS5hbSYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnExLnJlZz09cil7CisJICAgIGlmKG8pIGJyZWFrOworCSAgICBvPSZwMi0+cTE7CisJICB9CisJICBpZighcDItPnEyLmFtJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTIucmVnPT1yKXsKKwkgICAgaWYobykgYnJlYWs7CisJICAgIG89JnAyLT5xMjsKKwkgIH0KKwkgIGlmKCFwMi0+ei5hbSYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+ei5yZWc9PXIpeworCSAgICBpZihvKSBicmVhazsKKwkgICAgbz0mcDItPno7CisJICB9CisJfQorCWlmKGMyPT1GUkVFUkVHfHwocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisJICBpbnQgbTsKKwkgIGlmKGMyPT1GUkVFUkVHKSAKKwkgICAgbT1wMi0+cTEucmVnOworCSAgZWxzZQorCSAgICBtPXAyLT56LnJlZzsKKwkgIGlmKG09PXIpeworCSAgICBpZihvKXsKKwkgICAgICBvLT5hbT1hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CisJICAgICAgYW0tPmZsYWdzPUlNTV9JTkQ7CisJICAgICAgYW0tPmJhc2U9YmFzZTsKKwkgICAgICBhbS0+b2Zmc2V0PXptMmwob2YpOworCSAgICAgIGFtLT52PXY7CisJICAgICAgaWYoIXYpeworCQlpZihpc3JlZyhxMSkpeworCQkgIHAtPmNvZGU9Yz1OT1A7cC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworCQl9ZWxzZXsKKwkJICBwLT5jb2RlPWM9QVNTSUdOO3AtPnEyLmZsYWdzPTA7CisJCSAgcC0+dHlwZj1wLT50eXBmMjtwLT5xMi52YWwudm1heD1zaXpldGFiW3AtPnR5cGYyJk5RXTsKKwkJfQorCSAgICAgIH1lbHNleworCQlpZihpc3JlZyhxMikpeworCQkgIHAtPmNvZGU9Yz1OT1A7cC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworCQl9ZWxzZXsKKwkJICBwLT5jb2RlPWM9QVNTSUdOO3AtPnExPXAtPnEyO3AtPnEyLmZsYWdzPTA7CisJCSAgcC0+cTIudmFsLnZtYXg9c2l6ZXRhYltwLT50eXBmJk5RXTsKKwkJfQorCSAgICAgIH0KKwkgICAgfQorCSAgICBicmVhazsKKwkgIH0KKwkgIGlmKC8qZ2V0X3JlZyEhIGMyIT1GUkVFUkVHJiYqL209PWJhc2UpIGJyZWFrOworCSAgY29udGludWU7CisJfQorICAgICAgfQorICAgIH0gICAgICAKKyAgfQorfQorCitzdGF0aWMgc3RydWN0IG9iaiAqY2FtKGludCBmbGFncyxpbnQgYmFzZSxsb25nIG9mZnNldCxzdHJ1Y3QgVmFyICp2KQorLyogIEluaXRpYWxpemVzIGFuIGFkZHJlc3NpbmctbW9kZSBzdHJ1Y3R1cmUgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvICAgKi8KKy8qICB0aGF0IG9iamVjdC4gV2lsbCBub3Qgc3Vydml2ZSBhIHNlY29uZCBjYWxsISAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIHN0YXRpYyBzdHJ1Y3Qgb2JqIG9iajsKKyAgc3RhdGljIHN0cnVjdCBBZGRyZXNzaW5nTW9kZSBhbTsKKyAgb2JqLmFtPSZhbTsKKyAgYW0uZmxhZ3M9ZmxhZ3M7CisgIGFtLmJhc2U9YmFzZTsKKyAgYW0ub2Zmc2V0PW9mZnNldDsKKyAgYW0udj12OworICByZXR1cm4gJm9iajsKK30KKy8qIHByaW50cyBsYWJlbCB0eXBlcyB1c2VkIGJ5IHRhc2tpbmcgYXNzZW1ibGVyICovCitzdGF0aWMgdm9pZCBlbWl0X2xhYmVsX3R5cGUoRklMRSAqZixzdHJ1Y3QgVmFyICp2KQoreworICBpZihUQVNLSU5HKXsKKyAgICBpZihJU0ZVTkModi0+dnR5cC0+ZmxhZ3MpKXsKKyAgICAgIGlmKFRJTlkpCisJZW1pdChmLCJuZWFyIik7CisgICAgICBlbHNlCisJZW1pdChmLCJmYXIiKTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKCh2LT52dHlwLT5mbGFncyZOUSk9PUJJVCkKKwllbWl0KGYsImJpdCIpOworICAgICAgZWxzZSBpZigodi0+dnR5cC0+ZmxhZ3MmTlEpPT1DSEFSKQorCWVtaXQoZiwiYnl0ZSIpOworICAgICAgZWxzZQorCWVtaXQoZiwid29yZCIpOworICAgIH0KKyAgfQorfQorc3RhdGljIHZvaWQgbW92ZShGSUxFICpmLHN0cnVjdCBvYmogKnEsaW50IHFyLHN0cnVjdCBvYmogKnosaW50IHpyLGludCB0KQorLyogIEdlbmVyYXRlcyBjb2RlIHRvIG1vdmUgb2JqZWN0IHEgKG9yIHJlZ2lzdGVyIHFyKSBpbnRvIG9iamVjdCB6IChvciAgKi8KKy8qICByZWdpc3RlciB6cikuIE9uZSBtdXN0IGJlIGEgcmVnaXN0ZXIgYW5kIERSRUZPQkogb25seSBhbGxvd2VkIHdpdGggICovCisvKiAgcmVnaXN0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBsb25nIGw9MDsKKyAgdCY9TlE7CisgIGlmKHEmJihxLT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKSBxcj1xLT5yZWc7CisgIGlmKHomJih6LT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKSB6cj16LT5yZWc7CisgIGlmKHFyJiZxcj09enIpIHJldHVybjsKKyAgaWYoKHQmTlEpPT1CSVQpeworICAgIGlmKCF6ciYmKCh6LT5mbGFncyYoVkFSfFJFR3xEUkVGT0JKfFZBUkFEUikpIT1WQVJ8fCFJU1NUQVRJQyh6LT52KSkpIGllcnJvcigwKTsKKyAgICBpZihxJiYocS0+ZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworICAgICAgaWYoeiYmKHotPmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJmlzZXNmcmJpdHYoei0+dikpCisJZW1pdChmLCJcdGV4dHJcdCMxXG4iKTsKKyAgICAgIGV2YWxfY29uc3QoJnEtPnZhbCxCSVQpOworICAgICAgaWYoem1lcXRvKHZtYXgsbDJ6bSgwTCkpKQorCWVtaXQoZiwiXHRiY2xyXHQiKTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIlx0YnNldFx0Iik7CisgICAgICBpZih6cikgZW1pdChmLCIlcy4wIixyZWduYW1lc1t6cl0pOyBlbHNlIGVtaXRfb2JqKGYseix0KTsKKyAgICAgIGVtaXQoZiwiXG4iKTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKCFxciYmKChxLT5mbGFncyYoVkFSfFJFR3xEUkVGT0JKfFZBUkFEUikpIT1WQVJ8fCFJU1NUQVRJQyhxLT52KSkpIGllcnJvcigwKTsKKyAgICAgIGlmKChxLT5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiZpc2VzZnJiaXR2KHEtPnYpKXsKKwlpZighenImJigoei0+ZmxhZ3MmKFZBUnxEUkVGT0JKKSkhPVZBUnx8IWlzZXNmcmJpdHYoei0+dikpKXsKKwkgIGVtaXQoZiwiXHRleHRyXHQjMVxuIik7CisJICBlbWl0KGYsIlx0Ym1vdlx0JXMuMCwiLHJlZ25hbWVzW3RpXSk7CisJICBpZihxcikgZW1pdChmLCIlcy4wIixyZWduYW1lc1txcl0pOyBlbHNlIGVtaXRfb2JqKGYscSx0KTsKKwkgIGVtaXQoZiwiXG4iKTsKKwkgIGVtaXQoZiwiXHRibW92XHQiKTsKKwkgIGlmKHpyKSBlbWl0KGYsIiVzLjAiLHJlZ25hbWVzW3pyXSk7IGVsc2UgZW1pdF9vYmooZix6LHQpOworCSAgZW1pdChmLCIsJXMuMFxuIixyZWduYW1lc1t0aV0pOworCSAgcmV0dXJuOworCX1lbHNlCisJICBlbWl0KGYsIlx0ZXh0clx0IzFcbiIpOworICAgICAgfWVsc2UgaWYoeiYmKHotPmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJmlzZXNmcmJpdHYoei0+dikpeworCWlmKCFxcil7CisJICBlbWl0KGYsIlx0Ym1vdlx0JXMuMCwiLHJlZ25hbWVzW3RpXSk7CisJICBpZihxcikgZW1pdChmLCIlcy4wIixyZWduYW1lc1txcl0pOyBlbHNlIGVtaXRfb2JqKGYscSx0KTsKKwkgIGVtaXQoZiwiXG4iKTsKKwkgIGVtaXQoZiwiXHRleHRyXHQjMVxuIik7CisJICBlbWl0KGYsIlx0Ym1vdlx0Iik7ZW1pdF9vYmooZix6LHQpOworCSAgZW1pdChmLCIsJXMuMFxuIixyZWduYW1lc1t0aV0pOworCSAgcmV0dXJuOworCX1lbHNlCisJICBlbWl0KGYsIlx0ZXh0clx0IzFcbiIpOworICAgICAgfQorICAgICAgZW1pdChmLCJcdGJtb3ZcdCIpOworICAgICAgaWYoenIpIGVtaXQoZiwiJXMuMCIscmVnbmFtZXNbenJdKTsgZWxzZSBlbWl0X29iaihmLHosdCk7CisgICAgICBlbWl0KGYsIiwiKTsKKyAgICAgIGlmKHFyKSBlbWl0KGYsIiVzLjAiLHJlZ25hbWVzW3FyXSk7IGVsc2UgZW1pdF9vYmooZixxLHQpOworICAgICAgZW1pdChmLCJcbiIpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYocSl7CisgICAgaWYoIXpyKSBpZXJyb3IoMCk7CisgICAgaWYocS0+YW0mJnJlZ19wYWlyKHEtPmFtLT5iYXNlLCZycCkpeworICAgICAgbD1ycC5TT0Y7CisgICAgICBpZih6cj4xNikKKwllbWl0KGYsIlx0ZXh0c1x0JXMsIzJcbiIscmVnbmFtZXNbcnAuU0VHXSk7CisgICAgICBlbHNlCisJZW1pdChmLCJcdGV4dHNcdCVzLCMxXG4iLHJlZ25hbWVzW3JwLlNFR10pOworICAgIH1lbHNlIGlmKChxLT5mbGFncyZEUkVGT0JKKSYmcmVnX3BhaXIocS0+cmVnLCZycCkpeworICAgICAgbD1ycC5TT0Y7CisgICAgICBpZih6cj4xNikKKwllbWl0KGYsIlx0ZXh0c1x0JXMsIzJcbiIscmVnbmFtZXNbcnAuU0VHXSk7CisgICAgICBlbHNlCisJZW1pdChmLCJcdGV4dHNcdCVzLCMxXG4iLHJlZ25hbWVzW3JwLlNFR10pOworICAgIH1lbHNlIGlmKChxLT5mbGFncyYoVkFSfFJFR3xWQVJBRFIpKT09VkFSJiZJU1NUQVRJQyhxLT52KSYmSVNGQVIocS0+dikpeworICAgICAgZW1pdChmLCJcdGV4dHNcdCNTRUcgIik7CisgICAgICBpc3NlZz0xO2VtaXRfb2JqKGYscSxJTlQpOworICAgICAgaWYoenI+MTYpCisJZW1pdChmLCIsIzJcbiIpOworICAgICAgZWxzZQorCWVtaXQoZiwiLCMxXG4iKTsKKyAgICB9CisgICAgaWYocmVnX3BhaXIoenIsJnJwKSl7CisgICAgICBpZihxLT5hbSl7CisJZW1pdChmLCJcdG1vdlx0JXMsIixyZWduYW1lc1tycC5yMV0pOworCWVtaXRfb2JqKGYscSx0KTtlbWl0KGYsIlxuIik7CisJcS0+YW0tPm9mZnNldCs9MjsKKwllbWl0KGYsIlx0bW92XHQlcywiLHJlZ25hbWVzW3JwLnIyXSk7CisJZW1pdF9vYmooZixxLHQpO2VtaXQoZiwiXG4iKTsKKwlxLT5hbS0+b2Zmc2V0LT0yOworCXJldHVybjsKKyAgICAgIH1lbHNlIGlmKHEtPmZsYWdzJkRSRUZPQkopeworCWludCB0bXA9MDsKKwlpZighKHEtPmZsYWdzJlJFRykpIGllcnJvcigwKTsKKwlpZighbCkgbD1xLT5yZWc7CisJaWYobD09cnAucjEpeworCSAgdG1wPXJwLnIxOworCSAgLypGSVhNRTogdHAgaGllciBpbW1lciBmcmVpPyAqLworCSAgQlNFVChyZWdzX21vZGlmaWVkLHRwKTsKKwkgIHJwLnIxPXRwOworCX0KKwkvKkZJWE1FOiB0ZXN0IGF1ZiBzY3JhdGNocmVnKi8KKwlpZihxLT5yZWc+TUFYUil7CisJICBlbWl0KGYsIlx0bW92XHQlcyxbJXMrXVxuIixyZWduYW1lc1tycC5yMV0scmVnbmFtZXNbbF0pOworCSAgZW1pdChmLCJcdG1vdlx0JXMsWyVzXVxuIixyZWduYW1lc1tycC5yMl0scmVnbmFtZXNbbF0pOworCX1lbHNleworCSAgZW1pdChmLCJcdG1vdlx0JXMsWyVzXVxuIixyZWduYW1lc1tycC5yMV0scmVnbmFtZXNbbF0pOworCSAgZW1pdChmLCJcdG1vdlx0JXMsWyVzKyMyXVxuIixyZWduYW1lc1tycC5yMl0scmVnbmFtZXNbbF0pOworCX0KKwlpZih0bXApIGVtaXQoZiwiXHRtb3ZcdCVzLCVzXG4iLHJlZ25hbWVzW3RtcF0scmVnbmFtZXNbcnAucjFdKTsKKwlyZXR1cm47CisgICAgICB9ZWxzZSBpZihxLT5mbGFncyZWQVJBRFIpeworCXEtPmZsYWdzJj1+VkFSQURSOworCWVtaXQoZiwiXHRtb3ZcdCVzLCMiLHJlZ25hbWVzW3JwLnIxXSk7ZW1pdF9vYmooZixxLHQpO2VtaXQoZiwiXG4iKTsKKwllbWl0KGYsIlx0bW92XHQlcywjU0VHICIscmVnbmFtZXNbcnAucjJdKTtpc3NlZz0xO2VtaXRfb2JqKGYscSx0KTtlbWl0KGYsIlxuIik7CisJcS0+ZmxhZ3N8PVZBUkFEUjsKKwlyZXR1cm47CisgICAgICB9ZWxzZSBpZigocS0+ZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworCWxvbmcgbDI7CisJaWYoSVNGTE9BVCh0KSkgaWVycm9yKDApOworCWV2YWxfY29uc3QoJnEtPnZhbCx0KTsKKwlsPXptMnpsKHptYW5kKHZtYXgsbDJ6bSg2NTUzNUwpKSk7CisJZW1pdChmLCJcdG1vdlx0JXMsIyVsZFxuIixyZWduYW1lc1tycC5yMV0sbCk7CisJbDI9em0ybCh6bXJzaGlmdCh2bWF4LGwyem0oMTZMKSkpOworCWlmKGwyPT1sKSBlbWl0KGYsIlx0bW92XHQlcywlc1xuIixyZWduYW1lc1tycC5yMl0scmVnbmFtZXNbcnAucjFdKTsKKwllbHNlIGVtaXQoZiwiXHRtb3ZcdCVzLCMlbGRcbiIscmVnbmFtZXNbcnAucjJdLGwyKTsKKwlyZXR1cm47CisgICAgICB9ZWxzZSBpZihxcil7CisJaWYoIXJlZ19wYWlyKHFyLCZxcCkpIGllcnJvcigwKTsKKwllbWl0KGYsIlx0bW92XHQlcywlc1xuIixyZWduYW1lc1tycC5yMV0scmVnbmFtZXNbcXAucjFdKTsKKwllbWl0KGYsIlx0bW92XHQlcywlc1xuIixyZWduYW1lc1tycC5yMl0scmVnbmFtZXNbcXAucjJdKTsKKwlyZXR1cm47CisgICAgICB9ZWxzZXsKKwlpZighKHEtPmZsYWdzJlZBUikpIGllcnJvcigwKTsKKwlpZihxLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxxLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CisJICBsPXZvZmYocSk7CisJICBpZihsKQorCSAgICBlbWl0KGYsIlx0bW92XHQlcyxbJXMrIyVsZF1cbiIscmVnbmFtZXNbcnAucjFdLHJlZ25hbWVzW3NwXSxsKTsKKwkgIGVsc2UKKwkgICAgZW1pdChmLCJcdG1vdlx0JXMsWyVzXVxuIixyZWduYW1lc1tycC5yMV0scmVnbmFtZXNbc3BdKTsKKwkgIGVtaXQoZiwiXHRtb3ZcdCVzLFslcysjJWxkXVxuIixyZWduYW1lc1tycC5yMl0scmVnbmFtZXNbc3BdLGwrMik7CisJICByZXR1cm47CisJfWVsc2V7CisJICBlbWl0KGYsIlx0bW92XHQlcywiLHJlZ25hbWVzW3JwLnIxXSk7ZW1pdF9vYmooZixxLHQpO2VtaXQoZiwiXG4iKTsKKwkgIGVtaXQoZiwiXHRtb3ZcdCVzLCIscmVnbmFtZXNbcnAucjJdKTtlbWl0X29iaihmLHEsdCk7ZW1pdChmLCIrMlxuIik7CisJICByZXR1cm47CisJfQorICAgICAgfQorICAgICAgaWVycm9yKDApOworICAgIH1lbHNleworICAgICAgZW1pdChmLCJcdG1vdiVzXHQlcywiLHhfdFt0Jk5RXSwodD09Q0hBUj9icmVnbmFtZXNbenJdOnJlZ25hbWVzW3pyXSkpOworICAgICAgaWYocXImJnQ9PUNIQVIpCisJZW1pdChmLCIlcyIsYnJlZ25hbWVzW3FyXSk7IAorICAgICAgZWxzZSBpZighcS0+YW0mJihxLT5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcmVnX3BhaXIocS0+cmVnLCZycCkpCisJZW1pdChmLCJbJXNdIixyZWduYW1lc1tycC5TT0ZdKTsKKyAgICAgIGVsc2UKKwllbWl0X29iaihmLHEsdCk7CisgICAgICBlbWl0KGYsIlxuIik7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGlmKHopeworICAgIGlmKCFxcikgaWVycm9yKDApOworICAgIGlmKHotPmFtJiZyZWdfcGFpcih6LT5hbS0+YmFzZSwmcnApKXsKKyAgICAgIGw9cnAuU09GOworICAgICAgaWYocXI+MTYpCisJZW1pdChmLCJcdGV4dHNcdCVzLCMyXG4iLHJlZ25hbWVzW3JwLlNFR10pOworICAgICAgZWxzZQorCWVtaXQoZiwiXHRleHRzXHQlcywjMVxuIixyZWduYW1lc1tycC5TRUddKTsgICAgICAKKyAgICB9ZWxzZSBpZigoei0+ZmxhZ3MmRFJFRk9CSikmJnJlZ19wYWlyKHotPnJlZywmcnApKXsKKyAgICAgIGw9cnAuU09GOworICAgICAgaWYocXI+MTYpCisJZW1pdChmLCJcdGV4dHNcdCVzLCMyXG4iLHJlZ25hbWVzW3JwLlNFR10pOworICAgICAgZWxzZQorCWVtaXQoZiwiXHRleHRzXHQlcywjMVxuIixyZWduYW1lc1tycC5TRUddKTsKKyAgICB9ZWxzZSBpZigoei0+ZmxhZ3MmKFZBUnxSRUd8VkFSQURSKSk9PVZBUiYmSVNTVEFUSUMoei0+dikmJklTRkFSKHotPnYpKXsKKyAgICAgIGVtaXQoZiwiXHRleHRzXHQjU0VHICIpOworICAgICAgaXNzZWc9MTtlbWl0X29iaihmLHosSU5UKTsKKyAgICAgIGlmKHFyPjE2KQorCWVtaXQoZiwiLCMyXG4iKTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIiwjMVxuIik7CisgICAgfQorICAgIGlmKHJlZ19wYWlyKHFyLCZycCkpeworICAgICAgaWYoei0+YW0peworCWVtaXQoZiwiXHRtb3ZcdCIpO2VtaXRfb2JqKGYseix0KTtlbWl0KGYsIiwlc1xuIixyZWduYW1lc1tycC5yMV0pOworCXotPmFtLT5vZmZzZXQrPTI7CisJZW1pdChmLCJcdG1vdlx0Iik7ZW1pdF9vYmooZix6LHQpO2VtaXQoZiwiLCVzXG4iLHJlZ25hbWVzW3JwLnIyXSk7CisJei0+YW0tPm9mZnNldC09MjsKKwlyZXR1cm47CisgICAgICB9ZWxzZSBpZih6LT5mbGFncyZEUkVGT0JKKXsKKwlpZighKHotPmZsYWdzJlJFRykpIGllcnJvcigwKTsKKwlpZighbCkgbD16LT5yZWc7CisJLypGSVhNRTogdGVzdCBhdWYgc2NyYXRjaHJlZyBzdGF0dCA+TUFYUiovCisJaWYoei0+cmVnPk1BWFImJmwhPXJwLnIyKXsKKwkgIGVtaXQoZiwiXHRtb3ZcdFslcytdLCVzXG4iLHJlZ25hbWVzW2xdLHJlZ25hbWVzW3JwLnIxXSk7CisJICBlbWl0KGYsIlx0bW92XHRbJXNdLCVzXG4iLHJlZ25hbWVzW2xdLHJlZ25hbWVzW3JwLnIyXSk7CisJfWVsc2V7CisJICBlbWl0KGYsIlx0bW92XHRbJXNdLCVzXG4iLHJlZ25hbWVzW2xdLHJlZ25hbWVzW3JwLnIxXSk7CisJICBlbWl0KGYsIlx0bW92XHRbJXMrIzJdLCVzXG4iLHJlZ25hbWVzW2xdLHJlZ25hbWVzW3JwLnIyXSk7CisJfQorCXJldHVybjsKKyAgICAgIH1lbHNlIGlmKHpyKXsKKwlpZighcmVnX3BhaXIoenIsJnFwKSkgaWVycm9yKDApOworCWVtaXQoZiwiXHRtb3ZcdCVzLCVzXG4iLHJlZ25hbWVzW3FwLnIxXSxyZWduYW1lc1tycC5yMV0pOworCWVtaXQoZiwiXHRtb3ZcdCVzLCVzXG4iLHJlZ25hbWVzW3FwLnIyXSxyZWduYW1lc1tycC5yMl0pOworCXJldHVybjsKKyAgICAgIH1lbHNleworCWlmKCEoei0+ZmxhZ3MmVkFSKSkgaWVycm9yKDApOworCWlmKHotPnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHotPnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKXsKKwkgIGw9dm9mZih6KTsKKwkgIGlmKGwpCisJICAgIGVtaXQoZiwiXHRtb3ZcdFslcysjJWxkXSwlc1xuIixyZWduYW1lc1tzcF0sbCxyZWduYW1lc1tycC5yMV0pOworCSAgZWxzZQorCSAgICBlbWl0KGYsIlx0bW92XHRbJXNdLCVzXG4iLHJlZ25hbWVzW3NwXSxyZWduYW1lc1tycC5yMV0pOworCSAgZW1pdChmLCJcdG1vdlx0WyVzKyMlbGRdLCVzXG4iLHJlZ25hbWVzW3NwXSxsKzIscmVnbmFtZXNbcnAucjJdKTsKKwkgIHJldHVybjsKKwl9ZWxzZXsKKwkgIGVtaXQoZiwiXHRtb3ZcdCIpO2VtaXRfb2JqKGYseix0KTtlbWl0KGYsIiwlc1xuIixyZWduYW1lc1tycC5yMV0pOworCSAgZW1pdChmLCJcdG1vdlx0Iik7ZW1pdF9vYmooZix6LHQpO2VtaXQoZiwiKzIsJXNcbiIscmVnbmFtZXNbcnAucjJdKTsKKwkgIHJldHVybjsKKwl9CisgICAgICB9CisgICAgICBpZXJyb3IoMCk7CisgICAgfWVsc2V7CisgICAgICBlbWl0KGYsIlx0bW92JXNcdCIseF90W3QmTlFdKTsKKyAgICAgIGlmKCF6LT5hbSYmKHotPmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZyZWdfcGFpcih6LT5yZWcsJnJwKSkKKwllbWl0KGYsIlslc10iLHJlZ25hbWVzW3JwLlNPRl0pOworICAgICAgZWxzZSBpZih6ciYmdD09Q0hBUikKKwllbWl0KGYsIiVzIixicmVnbmFtZXNbenJdKTsKKyAgICAgIGVsc2UKKwllbWl0X29iaihmLHosdCk7CisgICAgICBlbWl0KGYsIiwlc1xuIiwoKHQ9PUNIQVIpP2JyZWduYW1lc1txcl06cmVnbmFtZXNbcXJdKSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIC8qcmVnLT5yZWcqLworICBpZih0PT1DSEFSKXsKKyAgICBlbWl0KGYsIlx0bW92Ylx0JXMsJXNcbiIsYnJlZ25hbWVzW3pyXSxicmVnbmFtZXNbcXJdKTsKKyAgfWVsc2UgaWYoSVNMV09SRCh0KSl7CisgICAgaWYoIXJlZ19wYWlyKHFyLCZxcCkpIGllcnJvcigwKTsKKyAgICBpZighcmVnX3BhaXIoenIsJnJwKSkgaWVycm9yKDApOworICAgIGVtaXQoZiwiXHRtb3ZcdCVzLCVzXG4iLHJlZ25hbWVzW3JwLnIxXSxyZWduYW1lc1txcC5yMV0pOworICAgIGVtaXQoZiwiXHRtb3ZcdCVzLCVzXG4iLHJlZ25hbWVzW3JwLnIyXSxyZWduYW1lc1txcC5yMl0pOworICB9ZWxzZXsKKyAgICBlbWl0KGYsIlx0bW92XHQlcywlc1xuIixyZWduYW1lc1t6cl0scmVnbmFtZXNbcXJdKTsKKyAgfQorfQorCitzdGF0aWMgaW50IGdldF9yZWcoRklMRSAqZixzdHJ1Y3QgSUMgKnApCit7CisgIGludCBpOworICBmb3IoaT0xO2k8PTE2O2krKyl7CisgICAgaWYoIXJlZ3NbaV0mJnJlZ3NjcmF0Y2hbaV0peworICAgICAgQlNFVChyZWdzX21vZGlmaWVkLGkpOworICAgICAgcmV0dXJuIGk7CisgICAgfQorICB9CisgIGllcnJvcigwKTsKK30KKworc3RhdGljIHZvaWQgc2F2ZV9yZXN1bHQoRklMRSAqZixpbnQgcixzdHJ1Y3QgSUMgKnAsaW50IHQpCisvKiAgU2F2ZXMgcmVzdWx0IGluIHJlZ2lzdGVyIHIgdG8gb2JqZWN0IG8uIE1heSB1c2UgdHAgb3IgdGkuICovIAoreworICBpZigocC0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09RFJFRk9CSil7CisgICAgQlNFVChyZWdzX21vZGlmaWVkLHRwKTsKKyAgICBpZihJU0xXT1JEKHAtPnouZHR5cCkpeworICAgICAgaWYoIXRpMl91c2VkKSB0bXA0PXRpMjsgZWxzZSB0bXA0PWdldF9yZWcoZixwKTsKKyAgICAgIEJTRVQocmVnc19tb2RpZmllZCx0bXAzKTsKKyAgICAgIHRtcDM9dHA7CisgICAgICBwLT56LmZsYWdzJj1+RFJFRk9CSjsKKyAgICAgIG1vdmUoZiwmcC0+eiwwLDAsTVRNUDIsRlBPSU5URVIpOworICAgICAgcC0+ei5mbGFncz0oRFJFRk9CSnxSRUcpOworICAgICAgcC0+ei5yZWc9TVRNUDI7CisgICAgfWVsc2UgaWYoIShwLT56LmZsYWdzJktPTlNUKSl7CisgICAgICBpbnQgdG1wPShyPT10cCk/dGk6dHA7CisgICAgICBCU0VUKHJlZ3NfbW9kaWZpZWQsdG1wKTsKKyAgICAgIHAtPnouZmxhZ3MmPX5EUkVGT0JKOworICAgICAgbW92ZShmLCZwLT56LDAsMCx0bXAsTlBPSU5URVIpOworICAgICAgcC0+ei5mbGFncz0oRFJFRk9CSnxSRUcpOworICAgICAgcC0+ei5yZWc9dG1wOworICAgIH0KKyAgfQorICBtb3ZlKGYsMCxyLCZwLT56LDAsdCk7Cit9CisKK3N0YXRpYyBpbnQgc2NyYXRjaHJlZyhpbnQgcixzdHJ1Y3QgSUMgKnApCit7CisgIGludCBjOworICBpZihyPT10cHx8cj09dGl8fHI9PXRpMnx8cj09TVRNUDF8fHI9PU1UTVAyKQorICAgIHJldHVybiAxOworICB3aGlsZSgxKXsKKyAgICBwPXAtPm5leHQ7CisgICAgaWYoIXB8fCgoYz1wLT5jb2RlKT09RlJFRVJFRyYmcC0+cTEucmVnPT1yKSkgcmV0dXJuIDE7CisgICAgaWYoYz09Q0FMTHx8KGM+PUJFUSYmYzw9QlJBKSkgcmV0dXJuIDA7CisgICAgaWYoKHAtPnExLmZsYWdzJlJFRykmJnAtPnExLnJlZz09cikgcmV0dXJuIDA7CisgICAgaWYoKHAtPnEyLmZsYWdzJlJFRykmJnAtPnEyLnJlZz09cikgcmV0dXJuIDA7CisgICAgaWYoKHAtPnouZmxhZ3MmUkVHKSYmcC0+ei5yZWc9PXIpIHJldHVybiAwOworICB9Cit9CisKK3N0YXRpYyBjaGFyICpsb25nY21kKGNoYXIgKnMpCit7CisgIGlmKCFzdHJjbXAocywiYWRkIikpIHJldHVybiAiYWRkYyI7CisgIGlmKCFzdHJjbXAocywic3ViIikpIHJldHVybiAic3ViYyI7CisgIC8qRklYTUUqLworICByZXR1cm4gczsKK30KKworLyogcGVyZm9ybSBsb25nIGFyaXRobWV0aWMgdXNpbmcgbGlicmFyeSBmdW5jdGlvbnMgKi8KKy8qIHRoZSBmdW5jdGlvbnMgdGFrZSBhcmd1bWVudHMgaW4gcjQvcjUgYW5kIHIxMC9yMTEgKi8KKy8qIGdpdmluZyB0aGUgcmVzdWx0IGluIHI0L3I1ICovCisvKiByZXR1cm5zICwgaWYgdGhlIG9wZXJhdGlvbiB3YXMgcGVyZm9ybWVkLCAwIGlmICovCisvKiB0aGUgSUMgc2hvdWxkIGJlIGhhbmRsZWQgYnkgaW5saW5lLWNvZGUgKi8KK3N0YXRpYyBpbnQgbGliX2xhcml0aChGSUxFICpmLHN0cnVjdCBJQyAqcCkKK3sKKyAgaW50IHI0cCxyNXAsYz1wLT5jb2RlLHQ9enR5cChwKTtjaGFyICpzOworICBpZihyZWdzW3I0XSYmKCFpc3JlZyh6KXx8cC0+ei5yZWc9PXI0cjUpKXsKKyAgICBlbWl0KGYsIlx0bW92XHRbLSVzXSwlc1xuIixyZWduYW1lc1tzcF0scmVnbmFtZXNbcjRdKTsKKyAgICBwdXNoKDIsMCk7CisgICAgcjRwPTE7CisgIH1lbHNlCisgICAgcjRwPTA7CisgIGlmKHJlZ3NbcjVdJiYoIWlzcmVnKHopfHxwLT56LnJlZz09cjRyNSkpeworICAgIGVtaXQoZiwiXHRtb3ZcdFstJXNdLCVzXG4iLHJlZ25hbWVzW3NwXSxyZWduYW1lc1tyNV0pOworICAgIHB1c2goMiwwKTsKKyAgICByNXA9MTsKKyAgfWVsc2UKKyAgICByNXA9MDsKKyAgaWYoIXAtPnExLmFtJiYocC0+cTEuZmxhZ3MmRFJFRk9CSikpeworICAgIGlmKCEocC0+cTEuZmxhZ3MmKFJFRykpKXsKKyAgICAgIGlmKElTTFdPUkQocC0+cTEuZHR5cCkpeworCXRtcDM9dGkyO3RtcDQ9dGk7dGkyX3VzZWQ9MTsKKwlCU0VUKHJlZ3NfbW9kaWZpZWQsdGkpOworCUJTRVQocmVnc19tb2RpZmllZCx0aTIpOworCXAtPnExLmZsYWdzJj1+RFJFRk9CSjsKKwltb3ZlKGYsJnAtPnExLDAsMCxNVE1QMixGUE9JTlRFUik7CisJcC0+cTEucmVnPU1UTVAyOworCXAtPnExLmZsYWdzPShSRUd8RFJFRk9CSik7CisgICAgICB9ZWxzZSBpZighKHAtPnExLmZsYWdzJktPTlNUKSl7CisJQlNFVChyZWdzX21vZGlmaWVkLHRpKTsKKwlwLT5xMS5mbGFncyY9fkRSRUZPQko7CisJbW92ZShmLCZwLT5xMSwwLDAsdGksTlBPSU5URVIpOworCXAtPnExLnJlZz10aTsKKwlwLT5xMS5mbGFncz0oUkVHfERSRUZPQkopOworICAgICAgfQorICAgIH0KKyAgfQorICBCU0VUKHJlZ3NfbW9kaWZpZWQscjRyNSk7CisgIG1vdmUoZiwmcC0+cTEsMCwwLHI0cjUscTF0eXAocCkpOworICBpZighcC0+cTIuYW0mJihwLT5xMi5mbGFncyZEUkVGT0JKKSl7CisgICAgaWYoIShwLT5xMi5mbGFncyYoUkVHKSkpeworICAgICAgaWYoSVNMV09SRChwLT5xMi5kdHlwKSl7CisJQlNFVChyZWdzX21vZGlmaWVkLHRpKTsgCisJQlNFVChyZWdzX21vZGlmaWVkLHRpMik7CisJdG1wMz10aTI7dG1wND10aTt0aTJfdXNlZD0xOworCXAtPnEyLmZsYWdzJj1+RFJFRk9CSjsKKwltb3ZlKGYsJnAtPnEyLDAsMCxNVE1QMixGUE9JTlRFUik7CisJcC0+cTIucmVnPU1UTVAyOworCXAtPnEyLmZsYWdzPShSRUd8RFJFRk9CSik7CisgICAgICB9ZWxzZSBpZighKHAtPnEyLmZsYWdzJktPTlNUKSl7CisJQlNFVChyZWdzX21vZGlmaWVkLHRpKTsKKwlwLT5xMi5mbGFncyY9fkRSRUZPQko7CisJbW92ZShmLCZwLT5xMiwwLDAsdGksTlBPSU5URVIpOworCXAtPnEyLnJlZz10aTsKKwlwLT5xMi5mbGFncz0oUkVHfERSRUZPQkopOworICAgICAgfQorICAgIH0KKyAgfSAgCisgIC8qIHRpL3RpMiBtdXN0IGJlIHIxMC9yMTEgKi8KKyAgdG1wMz10aTt0bXA0PXRpMjt0aTJfdXNlZD0xOworICBCU0VUKHJlZ3NfbW9kaWZpZWQsdGkpOyAKKyAgQlNFVChyZWdzX21vZGlmaWVkLHRpMik7CisgIG1vdmUoZiwmcC0+cTIsMCwwLE1UTVAyLHEydHlwKHApKTsKKyAgaWYoYz09TVVMVCkKKyAgICBzPSJfbXVsIjsKKyAgZWxzZSBpZihjPT1ESVYmJih0JlVOU0lHTkVEKSkKKyAgICBzPSJfdWRpbCI7CisgIGVsc2UgaWYoYz09RElWJiYhKHQmVU5TSUdORUQpKQorICAgIHM9Il9zZGlsIjsKKyAgZWxzZSBpZihjPT1NT0QmJih0JlVOU0lHTkVEKSkKKyAgICBzPSJfdW1vbCI7CisgIGVsc2UgaWYoYz09TU9EJiYhKHQmVU5TSUdORUQpKQorICAgIHM9Il9zbW9sIjsKKyAgZWxzZQorICAgIGllcnJvcigwKTsKKyAgaWYoVEFTS0lORyl7CisgICAgZW1pdChmLCJcdGV4dGVyblx0JXMlczolc1xuIixpZHByZWZpeCxzLFRJTlk/Im5lYXIiOiJmYXIiKTsKKyAgICBlbWl0KGYsIlx0JXNcdCVzJXNcbiIsY2FsbCxpZHByZWZpeCxzKTsKKyAgfQorICBzYXZlX3Jlc3VsdChmLHI0cjUscCx6dHlwKHApKTsKKyAgaWYocjVwKXsKKyAgICBlbWl0KGYsIlx0bW92XHQlcyxbJXMrXVxuIixyZWduYW1lc1tyNV0scmVnbmFtZXNbc3BdKTsKKyAgICBwb3AoMiwwKTsKKyAgfQorICBpZihyNHApeworICAgIGVtaXQoZiwiXHRtb3ZcdCVzLFslcytdXG4iLHJlZ25hbWVzW3I0XSxyZWduYW1lc1tzcF0pOworICAgIHBvcCgyLDApOworICB9ICAKKyAgcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIEVuZCBvZiBwcml2YXRlIGZhdGEgYW5kIGZ1bmN0aW9ucy4gICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IGVtaXRfcGVlcGhvbGUodm9pZCkKK3sKKyAgaW50IGVudHJpZXMsaTtsb25nIHgseSx6OworICBjaGFyICphc21saW5lW0VNSVRfQlVGX0RFUFRIXTsKKyAgaT1lbWl0X2w7CisgIGlmKGVtaXRfZj09MCkKKyAgICBlbnRyaWVzPWktZW1pdF9mKzE7CisgIGVsc2UKKyAgICBlbnRyaWVzPUVNSVRfQlVGX0RFUFRIOworICBhc21saW5lWzBdPWVtaXRfYnVmZmVyW2ldOworICBpZihlbnRyaWVzPj0xKXsKKyAgICBpZihzc2NhbmYoYXNtbGluZVswXSwiXHRzaGxcdFIlbGQsIyVsZFxuIiwmeCwmeSk9PTImJih5PDB8fHk+MTUpKXsKKyAgICAgIHNwcmludGYoYXNtbGluZVswXSwiXHRtb3ZcdFIlbGQsIzBcbiIseCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYoc3NjYW5mKGFzbWxpbmVbMF0sIlx0c2hyXHRSJWxkLCMlbGRcbiIsJngsJnkpPT0yJiYoeTwwfHx5PjE1KSl7CisgICAgICBzcHJpbnRmKGFzbWxpbmVbMF0sIlx0bW92XHRSJWxkLCMwXG4iLHgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIGlmKGVudHJpZXM+PTIpeworICAgIGktLTsKKyAgICBpZihpPDApIGk9RU1JVF9CVUZfREVQVEgtMTsKKyAgICBhc21saW5lWzFdPWVtaXRfYnVmZmVyW2ldOworICAgIGlmKHNzY2FuZihhc21saW5lWzBdLCJcdGFkZFx0UjAsIyVsZCIsJngpPT0xJiZzc2NhbmYoYXNtbGluZVsxXSwiXHRhZGRcdFIwLCMlbGQiLCZ5KT09MSl7CisgICAgICBzcHJpbnRmKGFzbWxpbmVbMV0sIlx0YWRkXHRSMCwjJWxkXG4iLHgreSk7CisgICAgICByZW1vdmVfYXNtKCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYoc3NjYW5mKGFzbWxpbmVbMV0sIlx0bW92XHRSMTEsIyVsZCIsJngpPT0xJiZzc2NhbmYoYXNtbGluZVswXSwiXHRleHRzXHRSMTEsIyVsZCIsJnkpPT0xKXsKKyAgICAgIHNwcmludGYoYXNtbGluZVsxXSwiXHRleHRzXHQjJWxkLCMlbGRcbiIseCx5KTsKKyAgICAgIHJlbW92ZV9hc20oKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorICBpZihlbnRyaWVzPj0zKXsKKyAgICBpLS07CisgICAgaWYoaTwwKSBpPUVNSVRfQlVGX0RFUFRILTE7CisgICAgYXNtbGluZVsyXT1lbWl0X2J1ZmZlcltpXTsKKyAgICBpZihzc2NhbmYoYXNtbGluZVsyXSwiXHRtb3ZcdFIxLCMlbGQiLCZ4KT09MSYmc3NjYW5mKGFzbWxpbmVbMV0sIlx0ZXh0c1x0IyVsZCwjMSIsJnkpPT0xJiZzc2NhbmYoYXNtbGluZVswXSwiXHRtb3ZcdFtSMV0sUiVsZCIsJnopPT0xKXsKKyAgICAgIHN0cmNweShhc21saW5lWzJdLGFzbWxpbmVbMV0pOworICAgICAgc3ByaW50Zihhc21saW5lWzFdLCJcdG1vdlx0JWxkLFIlbGRcbiIseCx6KTsKKyAgICAgIHJlbW92ZV9hc20oKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IGluaXRfY2codm9pZCkKKy8qICBEb2VzIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbnMgZm9yIHRoZSBjb2RlLWdlbmVyYXRvci4gR2V0cyBjYWxsZWQgICovCisvKiAgb25jZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCBzaG91bGQgcmV0dXJuIDAgaW4gY2FzZSBvZiBwcm9ibGVtcy4gICAgICAqLworeworICBpbnQgaTsKKyAgLyogIEluaXRpYWxpemUgc29tZSB2YWx1ZXMgd2hpY2ggY2Fubm90IGJlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgICAqLworICAvKiAgYmVjYXVzZSB0aGV5IGFyZSBzdG9yZWQgaW4gdGhlIHRhcmdldCdzIGFyaXRobWV0aWMuICAgICAgICAgICAgICovCisgIG1heGFsaWduPWwyem0oMkwpOworICBjaGFyX2JpdD1sMnptKDhMKTsKKyAgZm9yKGk9MDtpPD1NQVhfVFlQRTtpKyspeworICAgIHNpemV0YWJbaV09bDJ6bShtc2l6ZXRhYltpXSk7CisgICAgYWxpZ25baV09bDJ6bShtYWxpZ25baV0pOworICB9CisgIGZvcihpPTE7aTw9TUFYUjtpKyspeworICAgIGlmKGk8PTE2KXsKKyAgICAgIHJlZ3NpemVbaV09bDJ6bSgyTCk7cmVndHlwZVtpXT0maXR5cDsKKyAgICB9ZWxzZXsKKyAgICAgIHJlZ3NpemVbaV09bDJ6bSg0TCk7cmVndHlwZVtpXT0mbHR5cDsKKyAgICB9CisgIH0JCisgIAorICAvKiAgSW5pdGlhbGl6ZSB0aGUgbWluL21heC1zZXR0aW5ncy4gTm90ZSB0aGF0IHRoZSB0eXBlcyBvZiB0aGUgICAgICovCisgIC8qICBob3N0IHN5c3RlbSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIHRhcmdldCBzeXN0ZW0gYW5kIHlvdSBtYXkgKi8KKyAgLyogIG9ubHkgdXNlIHRoZSBzbWFsbGVzdCBtYXhpbXVtIHZhbHVlcyBBTlNJIGd1YXJhbnRlZXMgaWYgeW91ICAgICAqLworICAvKiAgd2FudCB0byBiZSBwb3J0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBUaGF0J3MgdGhlIHJlYXNvbiBmb3IgdGhlIHN1YnRyYWN0aW9uIGluIHRfbWluW0lOVF0uIExvbmcgY291bGQgKi8KKyAgLyogIGJlIHVuYWJsZSB0byByZXByZXNlbnQgLTIxNDc0ODM2NDggb24gdGhlIGhvc3Qgc3lzdGVtLiAgICAgICAgICAqLworICB0X21pbltDSEFSXT1sMnptKC0xMjhMKTsKKyAgdF9taW5bU0hPUlRdPWwyem0oLTMyNzY4TCk7CisgIHRfbWluW0lOVF09dF9taW5bU0hPUlRdOworICB0X21pbltMT05HXT16bXN1YihsMnptKC0yMTQ3NDgzNjQ3TCksbDJ6bSgxTCkpOworICB0X21pbltMTE9OR109em1sc2hpZnQobDJ6bSgxTCksbDJ6bSg2M0wpKTsKKyAgdF9taW5bTUFYSU5UXT10X21pbihMTE9ORyk7CisgIHRfbWF4W0NIQVJdPXVsMnp1bSgxMjdMKTsKKyAgdF9tYXhbU0hPUlRdPXVsMnp1bSgzMjc2N1VMKTsKKyAgdF9tYXhbSU5UXT10X21heFtTSE9SVF07CisgIHRfbWF4W0xPTkddPXVsMnp1bSgyMTQ3NDgzNjQ3VUwpOworICB0X21heFtMTE9OR109enVtcnNoaWZ0KHp1bWtvbXBsKHVsMnp1bSgwVUwpKSx1bDJ6dW0oMVVMKSk7CisgIHRfbWF4W01BWElOVF09dF9tYXgoTExPTkcpOworICB0dV9tYXhbQ0hBUl09dWwyenVtKDI1NVVMKTsKKyAgdHVfbWF4W1NIT1JUXT11bDJ6dW0oNjU1MzVVTCk7CisgIHR1X21heFtJTlRdPXR1X21heFtTSE9SVF07CisgIHR1X21heFtMT05HXT11bDJ6dW0oNDI5NDk2NzI5NVVMKTsKKyAgdHVfbWF4W0xMT05HXT16dW1rb21wbCh1bDJ6dW0oMFVMKSk7CisgIHR1X21heFtNQVhJTlRdPXRfbWF4KFVOU0lHTkVEfExMT05HKTsKKworICAvKiAgUmVzZXJ2ZSBhIGZldyByZWdpc3RlcnMgZm9yIHVzZSBieSB0aGUgY29kZS1nZW5lcmF0b3IuICAgICAgKi8KKyAgcmVnc2Fbc3BdPXJlZ3NhW3RwXT1yZWdzYVt0aV09cmVnc2FbdGkyXT0xOworICByZWdzY3JhdGNoW3NwXT1yZWdzY3JhdGNoW3RwXT1yZWdzY3JhdGNoW3RpXT1yZWdzY3JhdGNoW3RpMl09MDsKKyAgdGFyZ2V0X21hY3Jvcz1tYXJyYXk7CisgIGlmKFRJTlkpIG1hcnJheVswXT0iX19USU5ZX18iOworICBlbHNlIGlmKExBUkdFKSBtYXJyYXlbMF09Il9fTEFSR0VfXyI7CisgIGVsc2UgaWYoSFVHRSkgbWFycmF5WzBdPSJfX0hVR0VfXyI7CisgIGVsc2UgbWFycmF5WzBdPSJfX01FRElVTV9fIjsKKworICBpZighVEFTS0lORyl7CisgICAgY29kZW5hbWU9Ilx0LnNlY3Rpb25cdC50ZXh0LFwiY2FyeDFcIlxuIjsKKyAgICBuZGF0YW5hbWU9Ilx0LnNlY3Rpb25cdC5uZGF0YSxcImRhcncxXCJcbiI7CisgICAgZmRhdGFuYW1lPSJcdC5zZWN0aW9uXHQuZmRhdGEsXCJkYXJ3MVwiXG4iOworICAgIGhkYXRhbmFtZT0iXHQuc2VjdGlvblx0LmhkYXRhLFwiZGFydzFcIlxuIjsKKyAgICBuYnNzbmFtZT0iXHQuc2VjdGlvblx0Lm5ic3MsXCJ1YXJ3MVwiXG4iOworICAgIGZic3NuYW1lPSJcdC5zZWN0aW9uXHQuZmJzcyxcInVhcncxXCJcbiI7CisgICAgaGJzc25hbWU9Ilx0LnNlY3Rpb25cdC5oYnNzLFwidWFydzFcIlxuIjsKKyAgICBuY2RhdGFuYW1lPSJcdC5zZWN0aW9uXHQubmNkYXRhLFwiZGFyMVwiXG4iOworICAgIGZjZGF0YW5hbWU9Ilx0LnNlY3Rpb25cdC5mY2RhdGEsXCJkYXIxXCJcbiI7CisgICAgaGNkYXRhbmFtZT0iXHQuc2VjdGlvblx0LmhjZGF0YSxcImRhcjFcIlxuIjsKKyAgICBiaXRzbmFtZT0iXHQuc2VjdGlvblx0LmJpdHMsXCJkYXJ3MFwiXG4iOworICAgIGV2ZW49Ilx0LmFsaWduXHQxXG4iOworICAgIHB1YmxpYz0iLmdsb2JhbCI7CisgICAgY29tbWVudD0iOyAiOworICB9CisKKyAgbnZhci5zdG9yYWdlX2NsYXNzPVNUQVRJQzsKKyAgZnZhci5zdG9yYWdlX2NsYXNzPVNUQVRJQzsKKworCisgIC8qIFRPRE86IHNldCBhcmd1bWVudCByZWdpc3RlcnMgKi8KKyAgZGVjbGFyZV9idWlsdGluKCJfX211bGludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2FkZGludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3N1YmludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2FuZGludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX29yaW50NjQiLExMT05HLExMT05HLDAsTExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZW9yaW50NjQiLExMT05HLExMT05HLDAsTExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbmVnaW50NjQiLExMT05HLExMT05HLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19sc2xpbnQ2NCIsTExPTkcsTExPTkcsMCxJTlQsMCwxLDApOworCisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZzaW50NjQiLExMT05HLExMT05HLDAsTExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2dWludDY0IixVTlNJR05FRHxMTE9ORyxVTlNJR05FRHxMTE9ORywwLFVOU0lHTkVEfExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZHNpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19tb2R1aW50NjQiLFVOU0lHTkVEfExMT05HLFVOU0lHTkVEfExMT05HLDAsVU5TSUdORUR8TExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbHNyc2ludDY0IixMTE9ORyxMTE9ORywwLElOVCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19sc3J1aW50NjQiLFVOU0lHTkVEfExMT05HLFVOU0lHTkVEfExMT05HLDAsSU5ULDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2NtcHNpbnQ2NCIsSU5ULExMT05HLDAsTExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fY21wdWludDY0IixJTlQsVU5TSUdORUR8TExPTkcsMCxVTlNJR05FRHxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19zaW50NjR0b2ZsdDMyIixGTE9BVCxMTE9ORywwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fdWludDY0dG9mbHQzMiIsRkxPQVQsVU5TSUdORUR8TExPTkcsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3NpbnQ2NHRvZmx0NjQiLERPVUJMRSxMTE9ORywwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fdWludDY0dG9mbHQ2NCIsRE9VQkxFLFVOU0lHTkVEfExMT05HLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvc2ludDY0IixMTE9ORyxGTE9BVCwwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0MzJ0b3VpbnQ2NCIsVU5TSUdORUR8TExPTkcsRkxPQVQsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDY0dG9zaW50NjQiLExMT05HLERPVUJMRSwwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b3VpbnQ2NCIsVU5TSUdORUR8TExPTkcsRE9VQkxFLDAsMCwwLDEsMCk7CisKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDMydG9mbHQ2NCIsRE9VQkxFLEZMT0FULDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQ2NHRvZmx0MzIiLEZMT0FULERPVUJMRSwwLDAsMCwxLDApOworCisKKyAgZGVjbGFyZV9idWlsdGluKCJfX2FkZGZsdDMyIixGTE9BVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3N1YmZsdDMyIixGTE9BVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX211bGZsdDMyIixGTE9BVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2RpdmZsdDMyIixGTE9BVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX25lZ2ZsdDMyIixGTE9BVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2NtcGZsdDMyIixJTlQsRkxPQVQsMCxGTE9BVCwwLDEsMCk7CisKKyAgZGVjbGFyZV9idWlsdGluKCJfX2FkZGZsdDY0IixET1VCTEUsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3N1YmZsdDY0IixET1VCTEUsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX211bGZsdDY0IixET1VCTEUsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2RpdmZsdDY0IixET1VCTEUsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX25lZ2ZsdDY0IixET1VCTEUsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2NtcGZsdDY0IixJTlQsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKworICByZXR1cm4gMTsKK30KKworaW50IGZyZXR1cm4oc3RydWN0IFR5cCAqdCkKKy8qICBSZXR1cm5zIHRoZSByZWdpc3RlciBpbiB3aGljaCB2YXJpYWJsZXMgb2YgdHlwZSB0IGFyZSByZXR1cm5lZC4gKi8KKy8qICBJZiB0aGUgdmFsdWUgY2Fubm90IGJlIHJldHVybmVkIGluIGEgcmVnaXN0ZXIgcmV0dXJucyAwLiAgICAgICAgKi8KK3sKKyAgaW50IGY9dC0+ZmxhZ3MmTlE7CisgIGlmKGY9PUxMT05HfHxmPT1ET1VCTEV8fGY9PUxET1VCTEUpCisgICAgcmV0dXJuIDA7CisgIGlmKElTU0NBTEFSKGYpKXsKKyAgICBpZihmPT1MT05HfHxmPT1GUE9JTlRFUnx8Zj09SFBPSU5URVIpCisgICAgICByZXR1cm4gMjA7CisgICAgZWxzZQorICAgICAgcmV0dXJuIDU7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCByZWdvayhpbnQgcixpbnQgdCxpbnQgbW9kZSkKKy8qICBSZXR1cm5zIDAgaWYgcmVnaXN0ZXIgciBjYW5ub3Qgc3RvcmUgdmFyaWFibGVzIG9mICAgKi8KKy8qICB0eXBlIHQuIElmIHQ9PVBPSU5URVIgYW5kIG1vZGUhPTAgdGhlbiBpdCByZXR1cm5zICAgKi8KKy8qICBub24temVybyBvbmx5IGlmIHRoZSByZWdpc3RlciBjYW4gc3RvcmUgYSBwb2ludGVyICAgKi8KKy8qICBhbmQgZGVyZWZlcmVuY2UgYSBwb2ludGVyIHRvIG1vZGUuICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgdCY9TlE7CisgIGlmKHI9PTApIHJldHVybigwKTsKKyAgaWYobW9kZT4wJiYhSVNQT0lOVEVSKHQpKSByZXR1cm4gMDsKKyAgaWYodD09TlBPSU5URVImJm1vZGU+MCl7CisgICAgaWYocjw9NCkgcmV0dXJuIDE7IGVsc2UgcmV0dXJuIDA7CisgIH0KKyAgaWYodDw9Q0hBUiYmcj44KSByZXR1cm4gMDsKKyAgaWYoKHQ8TE9OR3x8dD09TlBPSU5URVIpJiZyPD0xNikgcmV0dXJuIDE7CisgIGlmKHQ9PUxPTkd8fHQ9PUZMT0FUfHx0PT1GUE9JTlRFUnx8dD09SFBPSU5URVIpeworICAgIGlmKHI+MTYpIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCitpbnQgcmVnX3BhaXIoaW50IHIsc3RydWN0IHJwYWlyICpwKQorLyogUmV0dXJucyAwIGlmIHRoZSByZWdpc3RlciBpcyBubyByZWdpc3RlciBwYWlyLiBJZiByICAqLworLyogaXMgYSByZWdpc3RlciBwYWlyIG5vbi16ZXJvIHdpbGwgYmUgcmV0dXJuZWQgYW5kIHRoZSAqLworLyogc3RydWN0dXJlIHBvaW50ZWQgdG8gcCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSB0d28gICAqLworLyogZWxlbWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpZihyPD0xNikgcmV0dXJuIDA7CisgIGlmKHApeworICAgIHN3aXRjaChyKXsKKyAgICBjYXNlIDE3OiBwLT5yMT03O3AtPnIyPTg7YnJlYWs7CisgICAgY2FzZSAxODogcC0+cjE9ODtwLT5yMj05O2JyZWFrOworICAgIGNhc2UgMTk6IHAtPnIxPTk7cC0+cjI9MTA7YnJlYWs7CisgICAgY2FzZSAyMDogcC0+cjE9NTtwLT5yMj02O2JyZWFrOworICAgIGNhc2UgMjE6IHAtPnIxPTE1O3AtPnIyPTE2O2JyZWFrOworICAgIGNhc2UgMjI6IHAtPnIxPTE0O3AtPnIyPTE1O2JyZWFrOworICAgIGNhc2UgMjM6IHAtPnIxPTEzO3AtPnIyPTE0O2JyZWFrOworICAgIGNhc2UgMjQ6IHAtPnIxPTQ7cC0+cjI9NTticmVhazsKKyAgICBjYXNlIDI1OiBwLT5yMT0zO3AtPnIyPTQ7YnJlYWs7CisJCisgICAgLyogcHNldWRvcyAqLworICAgIGNhc2UgTVRNUDE6IHAtPnIxPXRtcDE7cC0+cjI9dG1wMjticmVhazsKKyAgICBjYXNlIE1UTVAyOiBwLT5yMT10bXAzO3AtPnIyPXRtcDQ7YnJlYWs7CisgICAgY2FzZSBaRVJPUzogcmV0dXJuIDA7CisgICAgY2FzZSBPTkVTOiByZXR1cm4gMDsKKyAgICBkZWZhdWx0OiBpZXJyb3IoMCk7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitpbnQgY29zdF9zYXZpbmdzKHN0cnVjdCBJQyAqcCxpbnQgcixzdHJ1Y3Qgb2JqICpvKQoreworICBpbnQgYz1wLT5jb2RlOworICBpZigoby0+ZmxhZ3MmRFJFRk9CSikpeworICAgIGlmKG8tPmZsYWdzJlZLT05TVCkgcmV0dXJuIDE7CisgICAgaWYocjw9NCYmcC0+cTIuZmxhZ3MmJm8hPSZwLT56KQorICAgICAgcmV0dXJuIDY7CisgICAgZWxzZQorICAgICAgcmV0dXJuIDQ7CisgIH1lbHNlIGlmKG8tPmZsYWdzJlZLT05TVCl7CisgICAgc3RydWN0IG9iaiAqY289Jm8tPnYtPmNvYmo7CisgICAgaWYoKHAtPmNvZGU9PUFTU0lHTiYmKHAtPnouZmxhZ3MmRFJFRk9CSikpfHxwLT5jb2RlPT1QVVNIKQorICAgICAgcmV0dXJuIDQ7CisgICAgaWYoY28tPmZsYWdzJlZBUkFEUikKKyAgICAgIHJldHVybiA0OworICAgIGlmKG89PSZwLT5xMSkKKyAgICAgIGV2YWxfY29uc3QoJmNvLT52YWwscTF0eXAocCkpOworICAgIGVsc2UKKyAgICAgIGV2YWxfY29uc3QoJmNvLT52YWwscTJ0eXAocCkpOworICAgIC8qRklYTUUqLworICAgIHJldHVybiAwOworICB9ZWxzZSBpZihjPT1HRVRSRVRVUk4mJnAtPnExLnJlZz09cil7CisgICAgcmV0dXJuIDQ7CisgIH1lbHNlIGlmKGM9PVNFVFJFVFVSTiYmcC0+ei5yZWc9PXIpeworICAgIHJldHVybiA0OworICB9ZWxzZSBpZihjPT1DT05WRVJUJiYoKHAtPnR5cGYmTlEpPT1DSEFSfHwocC0+dHlwZjImTlEpPT1DSEFSKSYmcmVnb2socixDSEFSLDApKXsKKyAgICByZXR1cm4gMzsKKyAgfQorICByZXR1cm4gMjsKK30KKworaW50IGRhbmdlcm91c19JQyhzdHJ1Y3QgSUMgKnApCisvKiAgUmV0dXJucyB6ZXJvIGlmIHRoZSBJQyBwIGNhbiBiZSBzYWZlbHkgZXhlY3V0ZWQgICAgICovCisvKiAgd2l0aG91dCBkYW5nZXIgb2YgZXhjZXB0aW9ucyBvciBzaW1pbGFyIHRoaW5ncy4gICAgICovCisvKiAgdmJjYyBtYXkgZ2VuZXJhdGUgY29kZSBpbiB3aGljaCBub24tZGFuZ2Vyb3VzIElDcyAgICovCisvKiAgYXJlIHNvbWV0aW1lcyBleGVjdXRlZCBhbHRob3VnaCBjb250cm9sLWZsb3cgbWF5ICAgICovCisvKiAgbmV2ZXIgcmVhY2ggdGhlbSAobWFpbmx5IHdoZW4gbW92aW5nIGNvbXB1dGF0aW9ucyAgICovCisvKiAgb3V0IG9mIGxvb3BzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVHlwaWNhbCBJQ3MgdGhhdCBnZW5lcmF0ZSBleGNlcHRpb25zIG9uIHNvbWUgICAgICAgICovCisvKiAgbWFjaGluZXMgYXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gYWNjZXNzZXMgdmlhIHBvaW50ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gZGl2aXNpb24vbW9kdWxvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gb3ZlcmZsb3cgb24gc2lnbmVkIGludGVnZXIvZmxvYXRzICAgICAgICAgICAgICovCit7CisgIGludCBjPXAtPmNvZGU7CisgIGlmKChwLT5xMS5mbGFncyZEUkVGT0JKKXx8KHAtPnEyLmZsYWdzJkRSRUZPQkopfHwocC0+ei5mbGFncyZEUkVGT0JKKSkKKyAgICByZXR1cm4gMTsKKyAgaWYoKGM9PURJVnx8Yz09TU9EKSYmIWlzY29uc3QocTIpKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworaW50IG11c3RfY29udmVydChpbnQgbyxpbnQgdCxpbnQgY29uc3RfZXhwcikKKy8qICBSZXR1cm5zIHplcm8gaWYgY29kZSBmb3IgY29udmVydGluZyBucCB0byB0eXBlIHQgICAgKi8KKy8qICBjYW4gYmUgb21pdHRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbiB0aGlzIGdlbmVyaWMgMzJiaXQgUklTQyBjcHUgcG9pbnRlcnMgYW5kIDMyYml0ICAgKi8KKy8qICBpbnRlZ2VycyBoYXZlIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uIGFuZCBjYW4gdXNlICAgKi8KKy8qICB0aGUgc2FtZSByZWdpc3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IG9wPW8mTlEsdHA9dCZOUTsKKyAgaWYob3A9PXRwKSByZXR1cm4gMDsKKyAgaWYoSVNIV09SRChvcCkmJklTSFdPUkQodHApKSByZXR1cm4gMDsKKyAgaWYoSVNGTE9BVChvcCl8fElTRkxPQVQodHApKSByZXR1cm4gMTsKKyAgaWYoSVNMV09SRChvcCkmJklTTFdPUkQodHApKSByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgZ2VuX2RzKEZJTEUgKmYsem1heCBzaXplLHN0cnVjdCBUeXAgKnQpCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIDxzaXplPiBieXRlcyBvZiBzdG9yYWdlICovCisvKiAgaW5pdGlhbGl6ZWQgd2l0aCB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisjaWYgMAorICBlbWl0KGYsIlx0ZHNcdCVsZFxuIix6bTJsKHNpemUpKTsKKyNlbmRpZgorICAvKkZJWE1FOiB3ZSBjdXJyZW50bHkgZG8gbm90IHVzZSBkcyBiZWNhdXNlIG9mIGluaXRpYWxpemF0aW9uICovCisgIGxvbmcgbD16bTJsKHNpemUpOworICBpZihUQVNLSU5HKXsKKyAgICBpZih0JiYodC0+ZmxhZ3MmTlEpPT1CSVQpeworICAgICAgZW1pdChmLCJcdGRiaXRcbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKkZJWE1FOmFsaWdubWVudCB3aGlsZShzaXplPj00KSB7ZW1pdChmLCJcdGRkd1x0MFxuIik7c2l6ZS09NDt9Ki8KKyAgICB3aGlsZShzaXplLS0pIGVtaXQoZiwiXHRkYlx0MFxuIik7CisgIH1lbHNleworICAgIGlmKG5ld29iaiYmc2VjdGlvbiE9U1BFQ0lBTCkKKyAgICAgIGVtaXQoZiwiJWxkXG4iLHptMmwoc2l6ZSkpOworICAgIGVsc2UKKyAgICAgIGVtaXQoZiwiXHQuc3BhY2VcdCVsZFxuIix6bTJsKHNpemUpKTsKKyAgICBuZXdvYmo9MDsgCisgIH0KK30KKwordm9pZCBnZW5fYWxpZ24oRklMRSAqZix6bWF4IGFsaWduKQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIG1ha2Ugc3VyZSB0aGUgbmV4dCBkYXRhIGlzICAgICAqLworLyogIGFsaWduZWQgdG8gbXVsdGlwbGVzIG9mIDxhbGlnbj4gYnl0ZXMuICAgICAgICAgICAgICAqLworeworICBpZihzZWN0aW9uIT1CSVRTJiYhem1sZXEoYWxpZ24sbDJ6bSgxTCkpKQorICAgIGVtaXQoZixldmVuKTsKK30KK3N0YXRpYyB2b2lkIG5ld19zZWN0aW9uKEZJTEUgKmYsaW50IG5zZWMpCit7CisgIGlmKCFmfHxzZWN0aW9uPT1uc2VjKSByZXR1cm47CisgIGlmKFRBU0tJTkcpCisgICAgZW1pdChmLHNlY19lbmQpOworICBzZWN0aW9uPW5zZWM7CisgIGlmKG5zZWM9PUhEQVRBKXsKKyAgICBlbWl0KGYsaGRhdGFuYW1lKTsKKyAgICBzdHJjcHkoc2VjX2VuZCxlaGRhdGEpOworICB9ZWxzZSBpZihuc2VjPT1GREFUQSl7CisgICAgZW1pdChmLGZkYXRhbmFtZSk7CisgICAgc3RyY3B5KHNlY19lbmQsZWZkYXRhKTsKKyAgfWVsc2UgaWYobnNlYz09TkRBVEEpeworICAgIGVtaXQoZixuZGF0YW5hbWUpOworICAgIHN0cmNweShzZWNfZW5kLGVuZGF0YSk7CisgIH1lbHNlIGlmKG5zZWM9PUhDREFUQSl7CisgICAgZW1pdChmLGhjZGF0YW5hbWUpOworICAgIHN0cmNweShzZWNfZW5kLGVoY2RhdGEpOworICB9ZWxzZSBpZihuc2VjPT1GQ0RBVEEpeworICAgIGVtaXQoZixmY2RhdGFuYW1lKTsKKyAgICBzdHJjcHkoc2VjX2VuZCxlZmNkYXRhKTsKKyAgfWVsc2UgaWYobnNlYz09TkNEQVRBKXsKKyAgICBlbWl0KGYsbmNkYXRhbmFtZSk7CisgICAgc3RyY3B5KHNlY19lbmQsZW5jZGF0YSk7CisgIH1lbHNlIGlmKG5zZWM9PUhCU1MpeworICAgIGVtaXQoZixoYnNzbmFtZSk7CisgICAgc3RyY3B5KHNlY19lbmQsZWhic3MpOworICB9ZWxzZSBpZihuc2VjPT1GQlNTKXsKKyAgICBlbWl0KGYsZmJzc25hbWUpOworICAgIHN0cmNweShzZWNfZW5kLGVmYnNzKTsKKyAgfWVsc2UgaWYobnNlYz09TkJTUyl7CisgICAgZW1pdChmLG5ic3NuYW1lKTsKKyAgICBzdHJjcHkoc2VjX2VuZCxlbmJzcyk7CisgIH1lbHNlIGlmKG5zZWM9PUJJVFMpeworICAgIGVtaXQoZixiaXRzbmFtZSk7CisgICAgc3RyY3B5KHNlY19lbmQsZWJpdHMpOworICB9Cit9Cit2b2lkIGdlbl92YXJfaGVhZChGSUxFICpmLHN0cnVjdCBWYXIgKnYpCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIHRoZSBoZWFkIG9mIGEgdmFyaWFibGUgICovCisvKiAgZGVmaW5pdGlvbiwgaS5lLiB0aGUgbGFiZWwgYW5kIGluZm9ybWF0aW9uIGZvciAgICAgICovCisvKiAgbGlua2FnZSBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBjb25zdGZsYWc7CisgIGNoYXIgKmF0dHI7c3RydWN0IFR5cCAqdHY7CisgIHR2PXYtPnZ0eXA7CisgIHdoaWxlKHR2LT5mbGFncz09QVJSQVkpIHR2PXR2LT5uZXh0OworICBhdHRyPXR2LT5hdHRyOworICBpZih2LT5jbGlzdCkgY29uc3RmbGFnPWlzX2NvbnN0KHYtPnZ0eXApOworICBpZih2LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpeworICAgIGlmKElTRlVOQyh2LT52dHlwLT5mbGFncykpIHJldHVybjsKKyAgICBpZighVEFTS0lORyl7CisgICAgICBlbWl0KGYsIlx0LnR5cGVcdCVzJWxkLEBvYmplY3RcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgICBlbWl0KGYsIlx0LnNpemVcdCVzJWxkLCVsZFxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpLHptMmwoc3pvZih2LT52dHlwKSkpOworICAgIH0KKyAgICBpZighc3BlY2lhbF9zZWN0aW9uKGYsdikpeworICAgICAgaWYoKHYtPnZ0eXAtPmZsYWdzJk5RKT09QklUKXsKKwluZXdfc2VjdGlvbihmLEJJVFMpOworICAgICAgfWVsc2V7CisJaWYodi0+Y2xpc3QmJighY29uc3RmbGFnfHwoZ19mbGFnc1szXSZVU0VERkxBRykpKXsKKwkgIGlmKGF0dHImJnN0cnN0cihhdHRyLFNUUl9IVUdFKSkKKwkgICAgbmV3X3NlY3Rpb24oZixIREFUQSk7CisJICBlbHNlIGlmKGF0dHImJnN0cnN0cihhdHRyLFNUUl9GQVIpKQorCSAgICBuZXdfc2VjdGlvbihmLEZEQVRBKTsKKwkgIGVsc2UgaWYoYXR0ciYmc3Ryc3RyKGF0dHIsU1RSX05FQVIpKQorCSAgICBuZXdfc2VjdGlvbihmLE5EQVRBKTsKKwkgIGVsc2V7CisJICAgIGlmKEhVR0UpCisJICAgICAgbmV3X3NlY3Rpb24oZixIREFUQSk7CisJICAgIGVsc2UgaWYoTEFSR0UpCisJICAgICAgbmV3X3NlY3Rpb24oZixGREFUQSk7CisJICAgIGVsc2UKKwkgICAgICBuZXdfc2VjdGlvbihmLE5EQVRBKTsKKwkgIH0KKwl9CisJaWYodi0+Y2xpc3QmJmNvbnN0ZmxhZyYmIShnX2ZsYWdzWzNdJlVTRURGTEFHKSl7CisJICBpZihhdHRyJiZzdHJzdHIoYXR0cixTVFJfSFVHRSkpCisJICAgIG5ld19zZWN0aW9uKGYsSENEQVRBKTsKKwkgIGVsc2UgaWYoYXR0ciYmc3Ryc3RyKGF0dHIsU1RSX0ZBUikpCisJICAgIG5ld19zZWN0aW9uKGYsRkNEQVRBKTsKKwkgIGVsc2UgaWYoYXR0ciYmc3Ryc3RyKGF0dHIsU1RSX05FQVIpKQorCSAgICBuZXdfc2VjdGlvbihmLE5DREFUQSk7CisJICBlbHNleworCSAgICBpZihIVUdFKQorCSAgICAgIG5ld19zZWN0aW9uKGYsSENEQVRBKTsKKwkgICAgZWxzZSBpZihMQVJHRSkKKwkgICAgICBuZXdfc2VjdGlvbihmLEZDREFUQSk7CisJICAgIGVsc2UKKwkgICAgICBuZXdfc2VjdGlvbihmLE5DREFUQSk7CisJICB9CisJfQorCWlmKCF2LT5jbGlzdCl7CisJICBpZihhdHRyJiZzdHJzdHIoYXR0cixTVFJfSFVHRSkpCisJICAgIG5ld19zZWN0aW9uKGYsSEJTUyk7CisJICBlbHNlIGlmKGF0dHImJnN0cnN0cihhdHRyLFNUUl9GQVIpKQorCSAgICBuZXdfc2VjdGlvbihmLEZCU1MpOworCSAgZWxzZSBpZihhdHRyJiZzdHJzdHIoYXR0cixTVFJfTkVBUikpCisJICAgIG5ld19zZWN0aW9uKGYsTkJTUyk7CisJICBlbHNleworCSAgICBpZihIVUdFKQorCSAgICAgIG5ld19zZWN0aW9uKGYsSEJTUyk7CisJICAgIGVsc2UgaWYoTEFSR0UpCisJICAgICAgbmV3X3NlY3Rpb24oZixGQlNTKTsKKwkgICAgZWxzZQorCSAgICAgIG5ld19zZWN0aW9uKGYsTkJTUyk7CisJICB9CisJfQorICAgICAgfQorICAgIH0KKyAgICBnZW5fYWxpZ24oZixmYWxpZ24odi0+dnR5cCkpOworICAgIGlmKFRBU0tJTkcpeworICAgICAgZW1pdChmLCIlcyVsZFx0bGFiZWxcdCIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgICBlbWl0X2xhYmVsX3R5cGUoZix2KTsKKyAgICAgIGVtaXQoZiwiXG4iKTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKGRwcHVzZSh2LHNlY3Rpb24pPj0wKQorICAgICAgICBlbWl0KGYsIlx0LnNldFx0JXMlcyVsZCwlZFxuIixkcHBwcmVmaXgsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSxkcHB1c2UodixzZWN0aW9uKSk7CisgICAgICBlbWl0KGYsIiVzJWxkOlxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKyAgICB9CisgIH0KKyAgaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKKyAgICBpZih2LT5mbGFncyYoREVGSU5FRHxURU5UQVRJVkUpKXsKKyAgICAgIGlmKCFUQVNLSU5HKXsKKwllbWl0KGYsIlx0LnR5cGVcdCVzJXMsQG9iamVjdFxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKwllbWl0KGYsIlx0LnNpemVcdCVzJXMsJWxkXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIsem0ybChzem9mKHYtPnZ0eXApKSk7CisgICAgICB9CisgICAgICBlbWl0KGYsIlx0JXNcdCVzJXNcbiIscHVibGljLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgICAgaWYoIXNwZWNpYWxfc2VjdGlvbihmLHYpKXsKKwlpZigodi0+dnR5cC0+ZmxhZ3MmTlEpPT1CSVQpeworCSAgaWYoZiYmc2VjdGlvbiE9QklUUyl7CisJICAgIGlmKFRBU0tJTkcpCisJICAgICAgZW1pdChmLHNlY19lbmQpOworCSAgICBzdHJjcHkoc2VjX2VuZCxlYml0cyk7CisJICAgIGVtaXQoZixiaXRzbmFtZSk7CisJICAgIHNlY3Rpb249QklUUzsJICAKKwkgIH0KKwl9ZWxzZXsKKwkgIGlmKHYtPmNsaXN0JiYoIWNvbnN0ZmxhZ3x8KGdfZmxhZ3NbM10mVVNFREZMQUcpKSl7CisJICAgIGlmKGF0dHImJnN0cnN0cihhdHRyLFNUUl9IVUdFKSkKKwkgICAgICBuZXdfc2VjdGlvbihmLEhEQVRBKTsKKwkgICAgZWxzZSBpZihhdHRyJiZzdHJzdHIoYXR0cixTVFJfRkFSKSkKKwkgICAgICBuZXdfc2VjdGlvbihmLEZEQVRBKTsKKwkgICAgZWxzZSBpZihhdHRyJiZzdHJzdHIoYXR0cixTVFJfTkVBUikpCisJICAgICAgbmV3X3NlY3Rpb24oZixOREFUQSk7CisJICAgIGVsc2V7CisJICAgICAgaWYoSFVHRSkKKwkJbmV3X3NlY3Rpb24oZixIREFUQSk7CisJICAgICAgZWxzZSBpZihMQVJHRSkKKwkJbmV3X3NlY3Rpb24oZixGREFUQSk7CisJICAgICAgZWxzZQorCQluZXdfc2VjdGlvbihmLE5EQVRBKTsKKwkgICAgfQorCSAgfQorCSAgaWYodi0+Y2xpc3QmJmNvbnN0ZmxhZyYmIShnX2ZsYWdzWzNdJlVTRURGTEFHKSl7CisJICAgIGlmKGF0dHImJnN0cnN0cihhdHRyLFNUUl9IVUdFKSkKKwkgICAgICBuZXdfc2VjdGlvbihmLEhDREFUQSk7CisJICAgIGVsc2UgaWYoYXR0ciYmc3Ryc3RyKGF0dHIsU1RSX0ZBUikpCisJICAgICAgbmV3X3NlY3Rpb24oZixGQ0RBVEEpOworCSAgICBlbHNlIGlmKGF0dHImJnN0cnN0cihhdHRyLFNUUl9ORUFSKSkKKwkgICAgICBuZXdfc2VjdGlvbihmLE5DREFUQSk7CisJICAgIGVsc2V7CisJICAgICAgaWYoSFVHRSkKKwkJbmV3X3NlY3Rpb24oZixIQ0RBVEEpOworCSAgICAgIGVsc2UgaWYoTEFSR0UpCisJCW5ld19zZWN0aW9uKGYsRkNEQVRBKTsKKwkgICAgICBlbHNlCisJCW5ld19zZWN0aW9uKGYsTkNEQVRBKTsKKwkgICAgfQorCSAgfQorCSAgaWYoIXYtPmNsaXN0KXsKKwkgICAgaWYoYXR0ciYmc3Ryc3RyKGF0dHIsU1RSX0hVR0UpKQorCSAgICAgIG5ld19zZWN0aW9uKGYsSEJTUyk7CisJICAgIGVsc2UgaWYoYXR0ciYmc3Ryc3RyKGF0dHIsU1RSX0ZBUikpCisJICAgICAgbmV3X3NlY3Rpb24oZixGQlNTKTsKKwkgICAgZWxzZSBpZihhdHRyJiZzdHJzdHIoYXR0cixTVFJfTkVBUikpCisJICAgICAgbmV3X3NlY3Rpb24oZixOQlNTKTsKKwkgICAgZWxzZXsKKwkgICAgICBpZihIVUdFKQorCQluZXdfc2VjdGlvbihmLEhCU1MpOworCSAgICAgIGVsc2UgaWYoTEFSR0UpCisJCW5ld19zZWN0aW9uKGYsRkJTUyk7CisJICAgICAgZWxzZQorCQluZXdfc2VjdGlvbihmLE5CU1MpOworCSAgICB9CisJICB9CisJfQorICAgICAgfQorICAgICAgZ2VuX2FsaWduKGYsZmFsaWduKHYtPnZ0eXApKTsKKyAgICAgIGlmKFRBU0tJTkcpeworCWVtaXQoZiwiJXMlc1x0bGFiZWxcdCIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisJZW1pdF9sYWJlbF90eXBlKGYsdik7CisJZW1pdChmLCJcbiIpOworICAgICAgfWVsc2V7CisgICAgICAgIGlmKGRwcHVzZSh2LHNlY3Rpb24pPj0wKXsKKyAgICAgICAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXMlcyVzXG4iLGRwcHByZWZpeCxpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICAgICAgICBlbWl0KGYsIlx0LnNldFx0JXMlcyVzLCVkXG4iLGRwcHByZWZpeCxpZHByZWZpeCx2LT5pZGVudGlmaWVyLGRwcHVzZSh2LHNlY3Rpb24pKTsKKyAgICAgICAgfQorCWVtaXQoZiwiJXMlczpcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgICB9CisgICAgfWVsc2UgaWYoc3RyY21wKHYtPmlkZW50aWZpZXIsIl9fdmFfc3RhcnQiKSYmIWlzc2Zydih2KSYmIWlzZXNmcnYodikmJiFpc3NmcmJpdHYodikmJiFpc2VzZnJiaXR2KHYpKXsKKyAgICAgIGlmKFRBU0tJTkcpeworCWVtaXQoZiwiXHRleHRlcm5cdCVzJXM6IixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKwllbWl0X2xhYmVsX3R5cGUoZix2KTsKKwllbWl0KGYsIlxuIik7CisgICAgICB9ZWxzZXsKKwllbWl0KGYsIlx0Lmdsb2JhbFx0JXMlc1xuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBnZW5fZGMoRklMRSAqZixpbnQgdCxzdHJ1Y3QgY29uc3RfbGlzdCAqcCkKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjcmVhdGUgc3RhdGljIHN0b3JhZ2UgICAgICAgICAgKi8KKy8qICBpbml0aWFsaXplZCB3aXRoIGNvbnN0LWxpc3QgcC4gICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYoSVNQT0lOVEVSKHQpKXsKKyAgICBpZihwLT50cmVlKQorICAgICAgZW1pdChmLCJcdCVzXHQiLFRBU0tJTkc/ZGN0W3QmTlFdOnZkY3RbdCZOUV0pOyAKKyAgICBpZihJU0xXT1JEKHQpKQorICAgICAgdD1VTlNJR05FRHxMT05HOworICAgIGVsc2UKKyAgICAgIHQ9VU5TSUdORUR8U0hPUlQ7CisgICAgaWYoIXAtPnRyZWUpCisgICAgICBlbWl0KGYsIlx0JXNcdCIsVEFTS0lORz9kY3RbdCZOUV06dmRjdFt0Jk5RXSk7CisgIH1lbHNleworICAgIGVtaXQoZiwiXHQlc1x0IixUQVNLSU5HP2RjdFt0Jk5RXTp2ZGN0W3QmTlFdKTsKKyAgfQorICBpZighcC0+dHJlZSl7CisgICAgaWYoSVNGTE9BVCh0KSl7CisgICAgICAvKiAgYXVjaCB3aWVkZXIgbmljaHQgc2VociBzY2hvZW4gdW5kIElFRUUgbm9ldGlnICAgKi8KKyAgICAgIHVuc2lnbmVkIGNoYXIgKmlwOworCisgICAgICBpcD0odW5zaWduZWQgY2hhciAqKSZwLT52YWwudmRvdWJsZTsKKyAgICAgIGVtaXQoZiwiMHglMDJ4JTAyeCUwMnglMDJ4IixpcFszXSxpcFsyXSxpcFsxXSxpcFswXSk7CisgICAgICBpZigodCZOUSk9PURPVUJMRXx8KHQmTlEpPT1MRE9VQkxFKXsKKwllbWl0KGYsIiwweCUwMnglMDJ4JTAyeCUwMngiLGlwWzddLGlwWzZdLGlwWzVdLGlwWzRdKTsKKyAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgIGlmKElTTFdPUkQodCkpeworCWxvbmcgbDsKKwlldmFsX2NvbnN0KCZwLT52YWwsdCk7CisJbD16bTJsKHptYW5kKHAtPnZhbC52bWF4LGwyem0oNjU1MzVMKSkpOworCWVtaXQoZiwiJWxkIixsKTsKKwlsPXptMmwoem1hbmQoem1yc2hpZnQocC0+dmFsLnZtYXgsbDJ6bSgxNkwpKSxsMnptKDY1NTM1TCkpKTsKKwllbWl0KGYsIiwlbGQiLGwpOworICAgICAgfWVsc2UgaWYoKHQmTlEpIT1CSVQpCisJLypGSVhNRTogaW5pdGlhbGl6YXRpb24gb2YgYml0cyBpbXBvc3NpYmxlICovCisJZW1pdHZhbChmLCZwLT52YWwsKHQmTlUpfFVOU0lHTkVEKTsKKyAgICB9CisgIH1lbHNleworICAgIGludCBtPXAtPnRyZWUtPm8uZmxhZ3M7CisgICAgcC0+dHJlZS0+by5mbGFncyY9flZBUkFEUjsKKyAgICBlbWl0X29iaihmLCZwLT50cmVlLT5vLHQmTlUpOworICAgIHAtPnRyZWUtPm8uZmxhZ3M9bTsKKyAgfQorICBlbWl0KGYsIlxuIik7Cit9CisKKy8qICBUaGUgbWFpbiBjb2RlLWdlbmVyYXRpb24gcm91dGluZS4gICAgICAgICAgICAgICAgICAgKi8KKy8qICBmIGlzIHRoZSBzdHJlYW0gdGhlIGNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8uICAgICAgKi8KKy8qICBwIGlzIGEgcG9pbnRlciB0byBhIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBJQ3MgICAgICAgKi8KKy8qICBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBib2R5IHRvIGdlbmVyYXRlIGNvZGUgZm9yLiAgKi8KKy8qICB2IGlzIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBvZmZzZXQgaXMgdGhlIHNpemUgb2YgdGhlIHN0YWNrZnJhbWUgdGhlIGZ1bmN0aW9uICAgKi8KKy8qICBuZWVkcyBmb3IgbG9jYWwgdmFyaWFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ZvaWQgZ2VuX2NvZGUoRklMRSAqZixzdHJ1Y3QgSUMgKnAsc3RydWN0IFZhciAqdix6bWF4IG9mZnNldCkKK3sKKyAgaW50IGMsdCxsYXN0Y29tcD0wLHJlZyxzaG9ydF9hZGQsYml0X3JldmVyc2UsbmVlZF9yZXR1cm49MDsKKyAgc3RydWN0IG9iaiAqYml0X29iajtjaGFyICpiaXRfcmVnOworICBzdGF0aWMgaW50IGlkb25lOworICBzdHJ1Y3Qgb2JqIG8sKmNjPTA7aW50IGNjX3Q7CisgIHN0cnVjdCBJQyAqcDI7CisgIGlmKFRJTlkpeworICAgIHJldD0icmV0IjsKKyAgICBjYWxsPSJjYWxsYVx0Y2NfdWMsIjsKKyAgICBqdW1wPSJqbXBhXHRjY191YywiOworICB9ZWxzZXsKKyAgICByZXQ9InJldHMiOworICAgIGNhbGw9ImNhbGxzIjsKKyAgICBqdW1wPSJqbXBzXHQiOworICB9CisgIGlmKHYtPnRhdHRyJklOVEVSUlVQVCkKKyAgICByZXQ9InJldGkiOworICBpZihERUJVRyYxKSBwcmludGYoImdlbl9jb2RlKClcbiIpOworICBpZighdi0+ZmkpIHYtPmZpPW5ld19maSgpOworICB2LT5maS0+ZmxhZ3N8PUFMTF9SRUdTOworICBpZihmJiZUQVNLSU5HJiYhaWRvbmUpeworICAgIGVtaXQoZiwiJEVYVEVORFxuIik7CisgICAgZW1pdChmLCIkTU9ERUwoU01BTEwpXG4iKTsKKyAgICBpZG9uZT0xOworICB9CisgIGZvcihwMj1wO3AyO3AyPXAyLT5uZXh0KSBjbGVhcl9leHRfaWMoJnAyLT5leHQpOworICBpZighKGdfZmxhZ3NbNV0mVVNFREZMQUcpKXsKKyAgICBwZWVwaG9sZShwKTsKKyAgICBpZighZnJhbWVfdXNlZCkgb2Zmc2V0PWwyem0oMEwpOworICB9CisgIGZvcihjPTE7Yzw9MTU7YysrKSByZWdzW2NdPXJlZ3NhW2NdOworICByZWdzWzE2XT0wOworICBmb3IoYz0xO2M8PU1BWFI7YysrKXsKKyAgICBpZihyZWdzY3JhdGNoW2NdJiYocmVnc2FbY118fHJlZ3VzZWRbY10pKXsKKyAgICAgIEJTRVQocmVnc19tb2RpZmllZCxjKTsKKyAgICB9CisgIH0KKyAgbG9mZj0oKHptMmwob2Zmc2V0KSsxKS8yKSoyOworICBmdW5jdGlvbl90b3AoZix2LGxvZmYpOworICB1c3JzdGFja29mZnNldD1zeXNzdGFja29mZnNldD1ub3Rwb3BwZWQ9ZG9udHBvcD11c3JtYXhwdXNoZWQ9c3lzbWF4cHVzaGVkPTA7CisgIHN5c3N0YWNrPXVzcnN0YWNrPTA7CisgIGZvcig7cDtwcihmLHApLHA9cC0+bmV4dCl7CisgICAgaWYoKHAtPnExLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PShLT05TVHxEUkVGT0JKKSl7CisgICAgICBwLT5xMS5mbGFncz1WQVI7CisgICAgICBwLT5xMS52PUlTTFdPUkQocC0+cTEuZHR5cCk/JmZ2YXI6Jm52YXI7CisgICAgfQorICAgIGlmKChwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT0oS09OU1R8RFJFRk9CSikpeworICAgICAgcC0+cTIuZmxhZ3M9VkFSOworICAgICAgcC0+cTIudj1JU0xXT1JEKHAtPnEyLmR0eXApPyZmdmFyOiZudmFyOworICAgIH0KKyAgICBpZigocC0+ei5mbGFncyYoS09OU1R8RFJFRk9CSikpPT0oS09OU1R8RFJFRk9CSikpeworICAgICAgcC0+ei5mbGFncz1WQVI7CisgICAgICBwLT56LnY9SVNMV09SRChwLT56LmR0eXApPyZmdmFyOiZudmFyOworICAgIH0KKyAgICBpZighVEFTS0lORyl7CisgICAgICBpbnQgcm4scmI7Y2hhciAqcnM7CisgICAgICBpZihpc3NmcihxMSkpeworCXJzPXN0cnN0cihwLT5xMS52LT52YXR0ciwic2ZyKCIpOworCXNzY2FuZihycys0LCIlaSIsJnJuKTsKKwlpZihybjw9MjU1KSBybj0weGZlMDArMipybjsKKwllbWl0KGYsIlx0LnNmclx0JXMsJWRcbiIscC0+cTEudi0+aWRlbnRpZmllcixybik7CisgICAgICB9CisgICAgICBpZihpc3NmcihxMikpeworCXJzPXN0cnN0cihwLT5xMi52LT52YXR0ciwic2ZyKCIpOworCXNzY2FuZihycys0LCIlaSIsJnJuKTsKKwlpZihybjw9MjU1KSBybj0weGZlMDArMipybjsKKwllbWl0KGYsIlx0LnNmclx0JXMsJWRcbiIscC0+cTIudi0+aWRlbnRpZmllcixybik7CisgICAgICB9CisgICAgICBpZihpc3Nmcih6KSl7CisJcnM9c3Ryc3RyKHAtPnoudi0+dmF0dHIsInNmcigiKTsKKwlzc2NhbmYocnMrNCwiJWkiLCZybik7CisJaWYocm48PTI1NSkgcm49MHhmZTAwKzIqcm47CisJZW1pdChmLCJcdC5zZnJcdCVzLCVkXG4iLHAtPnoudi0+aWRlbnRpZmllcixybik7CisgICAgICB9CisgICAgICBpZihpc3NmcmJpdChxMSkpeworCXJzPXN0cnN0cihwLT5xMS52LT52YXR0ciwic2ZyYml0KCIpOworCXNzY2FuZihycys3LCIlaSwlaSIsJnJuLCZyYik7CisJaWYocm48PTI1NSkgcm49MHhmZTAwKzIqcm47CisJZW1pdChmLCJcdC5zZnJcdCVzLCVkLCVkXG4iLHAtPnExLnYtPmlkZW50aWZpZXIscm4scmIpOworICAgICAgfQorICAgICAgaWYoaXNzZnJiaXQocTIpKXsKKwlycz1zdHJzdHIocC0+cTIudi0+dmF0dHIsInNmcmJpdCgiKTsKKwlzc2NhbmYocnMrNywiJWksJWkiLCZybiwmcmIpOworCWlmKHJuPD0yNTUpIHJuPTB4ZmUwMCsyKnJuOworCWVtaXQoZiwiXHQuc2ZyXHQlcywlZCwlZFxuIixwLT5xMi52LT5pZGVudGlmaWVyLHJuLHJiKTsKKyAgICAgIH0KKyAgICAgIGlmKGlzc2ZyYml0KHopKXsKKwlycz1zdHJzdHIocC0+ei52LT52YXR0ciwic2ZyYml0KCIpOworCXNzY2FuZihycys3LCIlaSwlaSIsJnJuLCZyYik7CisJaWYocm48PTI1NSkgcm49MHhmZTAwKzIqcm47CisJZW1pdChmLCJcdC5zZnJcdCVzLCVkLCVkXG4iLHAtPnoudi0+aWRlbnRpZmllcixybixyYik7CisgICAgICB9CisgICAgICBpZihpc2VzZnIocTEpKXsKKwlycz1zdHJzdHIocC0+cTEudi0+dmF0dHIsInNmcmUoIik7CisJc3NjYW5mKHJzKzUsIiVpIiwmcm4pOworCWlmKHJuPD0yNTUpIHJuPTB4ZjAwMCsyKnJuOworCWVtaXQoZiwiXHQuZXF1XHQlcywlZFxuIixwLT5xMS52LT5pZGVudGlmaWVyLHJuKTsKKyAgICAgIH0KKyAgICAgIGlmKGlzZXNmcihxMikpeworCXJzPXN0cnN0cihwLT5xMi52LT52YXR0ciwic2ZyZSgiKTsKKwlzc2NhbmYocnMrNSwiJWkiLCZybik7CisJaWYocm48PTI1NSkgcm49MHhmMDAwKzIqcm47CisJZW1pdChmLCJcdC5lcXVcdCVzLCVkXG4iLHAtPnEyLnYtPmlkZW50aWZpZXIscm4pOworICAgICAgfQorICAgICAgaWYoaXNlc2ZyKHopKXsKKwlycz1zdHJzdHIocC0+ei52LT52YXR0ciwic2ZyZSgiKTsKKwlzc2NhbmYocnMrNSwiJWkiLCZybik7CisJaWYocm48PTI1NSkgcm49MHhmMDAwKzIqcm47CisJZW1pdChmLCJcdC5lcXVcdCVzLCVkXG4iLHAtPnoudi0+aWRlbnRpZmllcixybik7CisgICAgICB9CisgICAgICBpZihpc2VzZnJiaXQocTEpKXsKKwlycz1zdHJzdHIocC0+cTEudi0+dmF0dHIsInNmcmJpdGUoIik7CisJc3NjYW5mKHJzKzgsIiVpLCVpIiwmcm4sJnJiKTsKKwlpZihybjw9MjU1KSBybj0weGYwMDArMipybjsKKwllbWl0KGYsIlx0LnNmclx0JXMsJWQsJWRcbiIscC0+cTEudi0+aWRlbnRpZmllcixybixyYik7CisgICAgICB9CisgICAgICBpZihpc2VzZnJiaXQocTIpKXsKKwlycz1zdHJzdHIocC0+cTIudi0+dmF0dHIsInNmcmJpdGUoIik7CisJc3NjYW5mKHJzKzgsIiVpLCVpIiwmcm4sJnJiKTsKKwlpZihybjw9MjU1KSBybj0weGYwMDArMipybjsKKwllbWl0KGYsIlx0LnNmclx0JXMsJWQsJWRcbiIscC0+cTIudi0+aWRlbnRpZmllcixybixyYik7CisgICAgICB9CisgICAgICBpZihpc2VzZnJiaXQoeikpeworCXJzPXN0cnN0cihwLT56LnYtPnZhdHRyLCJzZnJiaXRlKCIpOworCXNzY2FuZihycys4LCIlaSwlaSIsJnJuLCZyYik7CisJaWYocm48PTI1NSkgcm49MHhmMDAwKzIqcm47CisJZW1pdChmLCJcdC5zZnJcdCVzLCVkLCVkXG4iLHAtPnoudi0+aWRlbnRpZmllcixybixyYik7CisgICAgICB9ICAgICAgCisgICAgfQorCisgICAgYz1wLT5jb2RlO3Q9cC0+dHlwZjsKKyAgICB0aTJfdXNlZD0wOyBzaG9ydF9hZGQ9MDsKKyAgICBpZihjPT1OT1ApIGNvbnRpbnVlOworICAgIGlmKGM9PUFMTE9DUkVHKXsKKyAgICAgIHJlZ3NbcC0+cTEucmVnXT0xOworICAgICAgaWYocmVnX3BhaXIocC0+cTEucmVnLCZycCkpIHJlZ3NbcnAucjFdPXJlZ3NbcnAucjJdPTE7CisgICAgICBCU0VUKHJlZ3NfbW9kaWZpZWQscC0+cTEucmVnKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1GUkVFUkVHKXsKKyAgICAgIHJlZ3NbcC0+cTEucmVnXT0wOworICAgICAgaWYocmVnX3BhaXIocC0+cTEucmVnLCZycCkpIHJlZ3NbcnAucjFdPXJlZ3NbcnAucjJdPTA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYobm90cG9wcGVkJiYhZG9udHBvcCl7CisgICAgICBpbnQgZmxhZz0wOworICAgICAgaWYoYz09TEFCRUx8fGM9PUNPTVBBUkV8fGM9PVRFU1R8fGM9PUJSQSl7CisJZW1pdChmLCJcdGFkZFx0JXMsIyVsZFxuIixyZWduYW1lc1tzcF0sbm90cG9wcGVkKTsKKwlwb3Aobm90cG9wcGVkLDApO25vdHBvcHBlZD0wO2NjPTA7CisgICAgICB9CisgICAgfQorICAgIGlmKGM9PUxBQkVMKSB7Y2M9MDtlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCx0KTtjb250aW51ZTt9CisgICAgaWYoYz49QkVRJiZjPD1CR1QmJnQ9PWV4aXRfbGFiZWwpIG5lZWRfcmV0dXJuPTE7CisgICAgaWYoYz09QlJBKXsKKyAgICAgIGlmKHAtPnR5cGY9PWV4aXRfbGFiZWwmJiFoYXZlX2ZyYW1lKXsKKwllbWl0KGYsIlx0JXNcbiIscmV0KTsKKyAgICAgIH1lbHNleworCWlmKHQ9PWV4aXRfbGFiZWwpIG5lZWRfcmV0dXJuPTE7CisJZW1pdChmLCJcdGptcHJcdGNjX3VjLCVzJWRcbiIsbGFicHJlZml4LHQpOworICAgICAgfQorICAgICAgY2M9MDtjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09QkVRfHxjPT1CTkUpeworICAgICAgaWYocC0+ZXh0LmZsYWdzPT1FWFRfSUNfQlRTVCl7CisJaWYoYml0X3JlZyl7CisJICBlbWl0KGYsIlx0aiVzYlx0JXMuJWxkLCVzJWRcbiIsKGM9PUJFUSk/Im4iOiIiLGJpdF9yZWcscC0+ZXh0Lm9mZnNldCxsYWJwcmVmaXgsdCk7CisJfWVsc2V7CisJICBpZighYml0X29iaikgaWVycm9yKDApOworCSAgZW1pdChmLCJcdGolc2JcdCIsKGM9PUJFUSk/Im4iOiIiKTsKKwkgIGVtaXRfb2JqKGYsYml0X29iaix0KTtlbWl0KGYsIi4lbGQsJXMlZFxuIixwLT5leHQub2Zmc2V0LGxhYnByZWZpeCx0KTsKKwl9CisgICAgICB9ZWxzZSBpZihsYXN0Y29tcD09QklUKXsKKwlpZihjPT1CRVEpIGJpdF9yZXZlcnNlPTEtYml0X3JldmVyc2U7CisJZW1pdChmLCJcdGolc2JcdCIsKGJpdF9yZXZlcnNlPT0xKT8ibiI6IiIpOworCWlmKGJpdF9vYmopCisJICBlbWl0X29iaihmLGJpdF9vYmosdCk7CisJZWxzZQorCSAgZW1pdChmLCIlcyIsYml0X3JlZyk7CisJZW1pdChmLCIsJXMlZFxuIixsYWJwcmVmaXgsdCk7CisgICAgICB9ZWxzZQorCWVtaXQoZiwiXHRqbXByXHRjY18lcywlcyVkXG4iLGNjc1tjLUJFUV0sbGFicHJlZml4LHQpOworICAgICAgY2M9MDtjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz5CTkUmJmM8QlJBKXsgICAgICAKKyAgICAgIGlmKHAtPmV4dC5mbGFncz09RVhUX0lDX0JUU1R8fGxhc3Rjb21wPT1CSVQpIGllcnJvcigwKTsKKyAgICAgIGlmKGxhc3Rjb21wJlVOU0lHTkVEKSBlbWl0KGYsIlx0am1wclx0Y2NfdSVzLCVzJWRcbiIsY2NzW2MtQkVRXSxsYWJwcmVmaXgsdCk7CisgICAgICBlbHNlICAgICAgICAgICAgICBlbWl0KGYsIlx0am1wclx0Y2NfcyVzLCVzJWRcbiIsY2NzW2MtQkVRXSxsYWJwcmVmaXgsdCk7CisgICAgICBjYz0wO2NvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1NT1ZFVE9SRUcpeworICAgICAgbW92ZShmLCZwLT5xMSwwLDAscC0+ei5yZWcsU0hPUlQpOworICAgICAgY2M9JnAtPnExO2NjX3Q9U0hPUlQ7Y29udGludWU7CisgICAgfQorICAgIGlmKGM9PU1PVkVGUk9NUkVHKXsKKyAgICAgIG1vdmUoZiwwLHAtPnExLnJlZywmcC0+eiwwLFNIT1JUKTsKKyAgICAgIGNjPSZwLT56O2NjX3Q9U0hPUlQ7Y29udGludWU7CisgICAgfQorICAgIAorICAgIGlmKCh0Jk5RKT09RE9VQkxFKSB7cHJpYzIoc3Rkb3V0LHApO2llcnJvcigwKTt9CisgICAgaWYoKHQmTlEpPT1CSVQpeworICAgICAgY2M9MDsKKyAgICAgIGlmKGM9PUFTU0lHTil7CisJaWYoIWlzcmVnKHopJiYoKHAtPnouZmxhZ3MmKFZBUnxSRUd8RFJFRk9CSnxWQVJBRFIpKSE9VkFSfHwhSVNTVEFUSUMocC0+ei52KSkpIGllcnJvcigwKTsKKwltb3ZlKGYsJnAtPnExLDAsJnAtPnosMCx0KTsKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PUNPTVBBUkUpeworCWlmKCFpc2NvbnN0KHEyKSl7CisJICBpZighaXNyZWcocTIpJiYoKHAtPnEyLmZsYWdzJihWQVJ8UkVHfERSRUZPQkp8VkFSQURSKSkhPVZBUnx8IUlTU1RBVElDKHAtPnEyLnYpKSkgaWVycm9yKDApOworCSAgYml0X3JlZz0iUFNXLjEiO2JpdF9vYmo9MDtsYXN0Y29tcD1CSVQ7Yml0X3JldmVyc2U9MTsKKwkgIGlmKGlzZXNmcmJpdChxMSkpeworCSAgICBpZighaXNlc2ZyYml0KHEyKSYmIWlzcmVnKHEyKSl7CisJICAgICAgbW92ZShmLCZwLT5xMSwwLDAsdGksdCk7CisJICAgICAgZW1pdChmLCJcdGJjbXBcdCVzLjAsIixyZWduYW1lc1t0aV0pOworCSAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHQpO2VtaXQoZiwiXG4iKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfWVsc2UKKwkgICAgICBlbWl0KGYsIlx0ZXh0clx0IzFcbiIpOworCSAgfWVsc2UgaWYoaXNlc2ZyYml0KHEyKSl7CisJICAgIGlmKCFpc3JlZyhxMSkpeworCSAgICAgIG1vdmUoZiwmcC0+cTIsMCwwLHRpLHQpOworCSAgICAgIGVtaXQoZiwiXHRiY21wXHQiKTsKKwkgICAgICBlbWl0X29iaihmLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIiwlcy4wXG4iLHJlZ25hbWVzW3RpXSk7CisJICAgICAgY29udGludWU7CisJICAgIH1lbHNlCisJICAgICAgZW1pdChmLCJcdGV4dHJcdCMxXG4iKTsKKwkgIH0KKwkgIGVtaXQoZiwiXHRiY21wXHQiKTtlbWl0X29iaihmLCZwLT5xMSx0KTsKKwkgIGVtaXQoZiwiLCIpO2VtaXRfb2JqKGYsJnAtPnEyLHQpO2VtaXQoZiwiXG4iKTsKKwl9ZWxzZXsKKwkgIGJpdF9yZWc9MDtiaXRfb2JqPSZwLT5xMTtsYXN0Y29tcD1CSVQ7CisJICBldmFsX2NvbnN0KCZwLT5xMi52YWwsdCk7CisJICBpZihJU05VTEwoKSkKKwkgICAgYml0X3JldmVyc2U9MDsKKwkgIGVsc2UKKwkgICAgYml0X3JldmVyc2U9MTsKKwkgIGlmKGlzZXNmcmJpdChxMSkpIGVtaXQoZiwiXHRleHRyXHQjMVxuIik7CisJfQorCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoYz09VEVTVCl7CisJYml0X3JlZz0wO2JpdF9vYmo9JnAtPnExO2JpdF9yZXZlcnNlPTA7bGFzdGNvbXA9QklUOworCWlmKGlzZXNmcmJpdChxMSkpIGVtaXQoZiwiXHRleHRyXHQjMVxuIik7CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZihjPT1BTkR8fGM9PU9SfHxjPT1YT1IpeworCWNoYXIgKnM7CisJaWYoY29tcGFyZV9vYmplY3RzKCZwLT56LCZwLT5xMikpeworCSAgc3RydWN0IG9iaiBtOworCSAgbT1wLT5xMTtwLT5xMT1wLT5xMjtwLT5xMj1tOworCX0KKwlpZighY29tcGFyZV9vYmplY3RzKCZwLT5xMSwmcC0+eikpCisJICBtb3ZlKGYsJnAtPnExLDAsJnAtPnosMCx0KTsKKwkvKkZJWE1FOiBjb25zdCwgZXNmciBldGMuICovCisJaWYoYz09QU5EKSBzPSJiYW5kIjsKKwllbHNlIGlmKGM9PU9SKSBzPSJib3IiOworCWVsc2Ugcz0iYnhvciI7CisJaWYoaXNlc2ZyYml0KHEyKSYmIWlzZXNmcmJpdCh6KSYmIWlzcmVnKHopKXsKKwkgIG1vdmUoZiwmcC0+cTIsMCwwLHRpLHQpOworCSAgZW1pdChmLCJcdCVzXHQiLHMpOworCSAgZW1pdF9vYmooZiwmcC0+eix0KTsKKwkgIGVtaXQoZiwiLCVzLjBcbiIscmVnbmFtZXNbdGldKTsKKwl9ZWxzZSBpZihpc2VzZnJiaXQoeikmJiFpc2VzZnJiaXQocTIpJiYhaXNyZWcocTIpKXsKKwkgIG1vdmUoZiwmcC0+cTIsMCwwLHRpLHQpOworCSAgZW1pdChmLCJcdGV4dHJcdCMxXG4iKTsKKwkgIGVtaXQoZiwiXHQlc1x0IixzKTsKKwkgIGVtaXRfb2JqKGYsJnAtPnosdCk7CisJICBlbWl0KGYsIiwlcy4wXG4iLHJlZ25hbWVzW3RpXSk7CisJfWVsc2V7CisJICBpZihpc2VzZnJiaXQoeikpIGVtaXQoZiwiXHRleHRyXHQjMVxuIik7CisJICBlbWl0KGYsIlx0JXNcdCIscyk7CisJICBlbWl0X29iaihmLCZwLT56LHQpO2VtaXQoZiwiLCIpOworCSAgZW1pdF9vYmooZiwmcC0+cTIsdCk7ZW1pdChmLCJcbiIpOworCX0KKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKGMhPUNPTlZFUlQpIGllcnJvcigwKTsKKyAgICB9CisKKyAgICBpZihjPT1URVNUKXsKKyAgICAgIGxhc3Rjb21wPXQ7CisgICAgICBpZihwLT5leHQuZmxhZ3M9PUVYVF9JQ19DTVBJQSl7CisJaWYocC0+ZXh0Lm9mZnNldDwwKQorCSAgZW1pdChmLCJcdHN1Ylx0JXMsIyVsZFxuIixyZWduYW1lc1twLT5leHQucl0sLXAtPmV4dC5vZmZzZXQpOworCWVsc2UKKwkgIGVtaXQoZiwiXHRhZGRcdCVzLCMlbGRcbiIscmVnbmFtZXNbcC0+ZXh0LnJdLHAtPmV4dC5vZmZzZXQpOworCWNjPTA7Y29udGludWU7CisgICAgICB9CisgICAgICBpZihwLT5leHQuZmxhZ3M9PUVYVF9JQ19DTVBJQil7CisJaWYocC0+ZXh0Lm9mZnNldDwwKQorCSAgZW1pdChmLCJcdGNtcGQlbGRcdCVzLCMwXG4iLC1wLT5leHQub2Zmc2V0LHJlZ25hbWVzW3AtPmV4dC5yXSk7CisJZWxzZQorCSAgZW1pdChmLCJcdGNtcGklbGRcdCVzLCMwXG4iLHAtPmV4dC5vZmZzZXQscmVnbmFtZXNbcC0+ZXh0LnJdKTsKKwljYz0wO2NvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoY2MmJihjY190Jk5VKT09KHQmTlUpJiZjb21wYXJlX29iamVjdHMoY2MsJnAtPnExKSl7CisJY29udGludWU7CisgICAgICB9CisgICAgICBwLT5jb2RlPWM9Q09NUEFSRTsKKyAgICAgIGd2YWwudm1heD1sMnptKDBMKTsKKyAgICAgIHAtPnEyLmZsYWdzPUtPTlNUOworICAgICAgZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworICAgICAgaW5zZXJ0X2NvbnN0KCZwLT5xMi52YWwsdCk7CisgICAgfSAKKyAgICBpZihjPT1DT01QQVJFJiZpc2NvbnN0KHExKSl7CisgICAgICBzdHJ1Y3QgSUMgKnAyOworICAgICAgbz1wLT5xMTtwLT5xMT1wLT5xMjtwLT5xMj1vOworICAgICAgcDI9cC0+bmV4dDsKKyAgICAgIHdoaWxlKHAyJiZwMi0+Y29kZT09RlJFRVJFRykgcDI9cDItPm5leHQ7CisgICAgICBpZighcDJ8fHAyLT5jb2RlPEJFUXx8cDItPmNvZGU+QkdUKSBpZXJyb3IoMCk7CisgICAgICBpZihwMi0+Y29kZT09QkxUKSBwMi0+Y29kZT1CR1Q7CisgICAgICBlbHNlIGlmKHAyLT5jb2RlPT1CR1QpIHAyLT5jb2RlPUJMVDsKKyAgICAgIGVsc2UgaWYocDItPmNvZGU9PUJMRSkgcDItPmNvZGU9QkdFOworICAgICAgZWxzZSBpZihwMi0+Y29kZT09QkdFKSBwMi0+Y29kZT1CTEU7CisgICAgfQorICAgIGlmKGM9PUNPTVBBUkUmJnAtPmV4dC5mbGFncz09RVhUX0lDX0NNUElBKXsKKyAgICAgIGxvbmcgbDsKKyAgICAgIGlmKCFpc2NvbnN0KHEyKSkgaWVycm9yKDApOworICAgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHQpOworICAgICAgbD16bTJsKHZtYXgpOworICAgICAgaWYocC0+ZXh0Lm9mZnNldDwwKQorCWVtaXQoZiwiXHRjbXBkJWxkXHQlcywjJWxkXG4iLC1wLT5leHQub2Zmc2V0LHJlZ25hbWVzW3AtPmV4dC5yXSxsLXAtPmV4dC5vZmZzZXQpOworICAgICAgZWxzZQorCWVtaXQoZiwiXHRjbXBpJWxkXHQlcywjJWxkXG4iLHAtPmV4dC5vZmZzZXQscmVnbmFtZXNbcC0+ZXh0LnJdLGwtcC0+ZXh0Lm9mZnNldCk7CisgICAgICBjYz0wO2xhc3Rjb21wPXQ7Y29udGludWU7CisgICAgfQorICAgIGlmKGM9PUNPTVBBUkUmJnAtPmV4dC5mbGFncz09RVhUX0lDX0NNUElCKXsKK3ByaWMyKHN0ZG91dCxwKTsKKyAgICAgIGlmKHAtPmV4dC5vZmZzZXQ8MCkKKwllbWl0KGYsIlx0Y21wZCVsZFx0JXMsIiwtcC0+ZXh0Lm9mZnNldCxyZWduYW1lc1twLT5leHQucl0pOworICAgICAgZWxzZQorCWVtaXQoZiwiXHRjbXBpJWxkXHQlcywiLHAtPmV4dC5vZmZzZXQscmVnbmFtZXNbcC0+ZXh0LnJdKTsKKyAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHQpO2VtaXQoZiwiXG4iKTsKKyAgICAgIGNjPTA7bGFzdGNvbXA9dDtjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09Q09NUEFSRSYmaXNjb25zdChxMikpeworICAgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHQpOworICAgICAgaWYoSVNOVUxMKCkpeworCWlmKGNjJiYoY2NfdCZOVSk9PSh0Jk5VKSYmY29tcGFyZV9vYmplY3RzKGNjLCZwLT5xMSkpeworCSAgbGFzdGNvbXA9dDtjb250aW51ZTsKKwl9CisgICAgICB9CisgICAgfQorCisgICAgaWYoYz09U1VCUEZQKXsKKyAgICAgIHAtPmNvZGU9Yz1TVUI7CisgICAgICBpZigocC0+dHlwZjImTlEpPT1OUE9JTlRFUikgcC0+dHlwZj10PUlOVDsKKyAgICAgIGVsc2UgaWYoKHAtPnR5cGYyJk5RKT09SFBPSU5URVIpIHAtPnR5cGY9dD1MT05HOworICAgICAgZWxzZSBpZXJyb3IoMCk7CisgICAgICBpZigocC0+dHlwZjImTlEpPT1OUE9JTlRFUil7CisJY2M9JnAtPno7Y2NfdD1OUE9JTlRFUjsKKyAgICAgIH1lbHNleworCWNjPTA7CisgICAgICB9CisgICAgfQorCisgICAgaWYoYz09QURESTJQfHxjPT1TVUJJRlApeworICAgICAgLyppZihjPT1BRERJMlApIHAtPmNvZGU9Yz1BREQ7IGVsc2UgcC0+Y29kZT1jPVNVQjsqLworICAgICAgaWYoKHAtPnR5cGYyJk5RKSE9SFBPSU5URVIpeworCXAtPnR5cGY9dD0oVU5TSUdORUR8U0hPUlQpOworCXNob3J0X2FkZD0yOworCWlmKGlzcmVnKHEyKSYmcmVnX3BhaXIocC0+cTIucmVnLCZycCkpeworCSAgLypGSVhNRTp3YXJuaW5nKi8KKwkgIHAtPnEyLnJlZz1ycC5yMTsKKwl9CisgICAgICB9ZWxzZSBpZihJU0hXT1JEKHQpKXsKKwlwLT50eXBmPXQ9KFVOU0lHTkVEfExPTkcpOworCXNob3J0X2FkZD0xOworICAgICAgfQorICAgICAgaWYoKHAtPnR5cGYyJk5RKT09TlBPSU5URVIpeworCWNjPSZwLT56O2NjX3Q9TlBPSU5URVI7CisgICAgICB9ZWxzZXsKKwljYz0wOworICAgICAgfSAgICAgIAorICAgIH0KKyAgICAvKiB0cnkgdG8gYXZvaWQgej09cTIgKi8KKyAgICBpZigoYz09QUREfHxjPT1BTkR8fGM9PU9SfHxjPT1YT1J8fChjPT1BRERJMlAmJiFzaG9ydF9hZGQpKSYmY29tcGFyZV9vYmplY3RzKCZwLT5xMiwmcC0+eikpeworICAgICAgbz1wLT5xMTtwLT5xMT1wLT5xMjtwLT5xMj1vOworICAgIH0gICAgCisgICAgLyogRFJFRk9CSnMgbmFjaCBxMiwgdW0gZXZ0bC4gb3AgcmVnLFtyaV0genUgbnV0emVuICovCisgICAgaWYoYz09QUREfHxjPT1NVUxUfHxjPT1PUnx8Yz09QU5EfHxjPT1YT1IpeworICAgICAgaWYoaXNyZWcocTIpJiZzY3JhdGNocmVnKHAtPnEyLnJlZyxwKSl7CisJbz1wLT5xMTtwLT5xMT1wLT5xMjtwLT5xMj1vOworICAgICAgfQorICAgICAgaWYoKHAtPnExLmZsYWdzJkRSRUZPQkopJiYoIShwLT5xMS5mbGFncyZSRUcpfHxwLT5xMS5yZWc8PTQpJiYoIXAtPnExLmFtfHxwLT5xMS5hbS0+ZmxhZ3MhPUlNTV9JTkQpKXsKKwlpZighKChwLT5xMi5mbGFncyZEUkVGT0JKKSYmKCFwLT5xMi5hbXx8cC0+cTIuYW0tPmZsYWdzIT1JTU1fSU5EKSkpeworCSAgc3RydWN0IG9iaiBvOworCSAgbz1wLT5xMTtwLT5xMT1wLT5xMjtwLT5xMj1vOworCX0KKyAgICAgIH0KKyAgICB9CisgICAgLypGSVhNRTogSUNzIG1pdCBtZWhyZXJlbiBUeXBlbiovCisgICAgaWYoc3dpdGNoX0lDKHApJiZpc3JlZyh6KSl7CisgICAgICByZWc9cC0+ei5yZWc7CisgICAgfWVsc2UgaWYoaXNyZWcocTEpJiYoIUlTTFdPUkQodCl8fHJlZ19wYWlyKHAtPnExLnJlZywmcnApKSYmKHNjcmF0Y2hyZWcocC0+cTEucmVnLHApfHwoaXNyZWcoeikmJnAtPnoucmVnPT1wLT5xMS5yZWcpfHwoIUlTTFdPUkQodCkmJmM9PUNPTVBBUkUpKSl7CisgICAgICByZWc9cC0+cTEucmVnOworICAgIH1lbHNleworICAgICAgaWYoSVNMV09SRCh6dHlwKHApKSl7CisJdG1wMT10aTt0bXAyPXRpMjt0aTJfdXNlZD0xOworCUJTRVQocmVnc19tb2RpZmllZCx0aSk7CisJQlNFVChyZWdzX21vZGlmaWVkLHRpMik7CisJcmVnPU1UTVAxOworICAgICAgfWVsc2V7CisJaWYoKHQmTlEpPT1DSEFSKXsKKwkgIEJTRVQocmVnc19tb2RpZmllZCx0cCk7CisJICByZWc9dHA7CisJfWVsc2V7CisJICBCU0VUKHJlZ3NfbW9kaWZpZWQsdGkpOworCSAgcmVnPXRpOworCX0KKyAgICAgIH0KKyAgICB9CisgICAgLyogb3AgcmVnLG1lbS9jb25zdCAqLworICAgIGlmKGlzc2ZyKHopJiYoYz09QUREfHxjPT1TVUJ8fGM9PUFORHx8Yz09T1J8fGM9PVhPUnx8Yz09QURESTJQKSYmKGNvbXBhcmVfb2JqZWN0cygmcC0+cTEsJnAtPnopfHwoKGMhPVNVQiYmYyE9U1VCSUZQKSYmY29tcGFyZV9vYmplY3RzKCZwLT5xMiwmcC0+eikpKSl7CisgICAgICBjaGFyICpzOworICAgICAgaWYoIWNvbXBhcmVfb2JqZWN0cygmcC0+cTEsJnAtPnopKXtvPXAtPnExO3AtPnExPXAtPnEyO3AtPnEyPW87fQorICAgICAgaWYoKHAtPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUfHwoKHAtPnEyLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJklTU1RBVElDKHAtPnEyLnYpKSl7CisJaWYoYz49T1ImJmM8PUFORCl7CisJICBzPWxvZ2ljYWxzW2MtT1JdOworCX1lbHNleworCSAgaWYoYz09QURESTJQKQorCSAgICBzPWFyaXRobWV0aWNzW0FERC1MU0hJRlRdOworCSAgZWxzZSBpZihjPT1TVUJJRlApCisJICAgIHM9YXJpdGhtZXRpY3NbU1VCLUxTSElGVF07CisJICBlbHNlCisJICAgIHM9YXJpdGhtZXRpY3NbYy1MU0hJRlRdOworCX0KKwlpZigocC0+cTIuZmxhZ3MmVkFSKSYmSVNGQVIocC0+cTIudikpeworCSAgZW1pdChmLCJcdGV4dHNcdCNTRUcgIik7aXNzZWc9MTtlbWl0X29iaihmLCZwLT5xMix0KTtlbWl0KGYsIiwjMVxuIik7CisJfQorCWVtaXQoZiwiXHQlcyVzXHQiLHMsKHQmTlEpPT1DSEFSPyJiIjoiIik7CisJZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJZW1pdChmLCIsIik7CisJZW1pdF9vYmooZiwmcC0+cTIsdCk7CisJZW1pdChmLCJcbiIpOworCWNjPSZwLT56O2NjX3Q9dDsKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogb3AgbWVtLHJlZyAqLworICAgIGlmKChjPT1BRER8fGM9PVNVQnx8Yz09QU5EfHxjPT1PUnx8Yz09WE9SfHxjPT1BRERJMlApJiYoY29tcGFyZV9vYmplY3RzKCZwLT5xMSwmcC0+eil8fCgoYyE9U1VCJiZjIT1TVUJJRlApJiZjb21wYXJlX29iamVjdHMoJnAtPnEyLCZwLT56KSkpJiYocC0+ei5mbGFncyYoVkFSfFZBUkFEUnxEUkVGT0JKfFJFRykpPT1WQVImJklTU1RBVElDKHAtPnoudikpeworICAgICAgY2hhciAqczsKKyAgICAgIGlmKCFjb21wYXJlX29iamVjdHMoJnAtPnExLCZwLT56KSl7bz1wLT5xMTtwLT5xMT1wLT5xMjtwLT5xMj1vO30KKyAgICAgIGNjPSZwLT56O2NjX3Q9dDsKKyAgICAgIGlmKGlzcmVnKHEyKSl7CisJcmVnPXAtPnEyLnJlZzsKKyAgICAgIH1lbHNlIGlmKGlzc2ZyKHEyKSl7CisJcmVnPTA7CisgICAgICB9ZWxzZSBpZihpc2NvbnN0KHEyKSl7CisJZXZhbF9jb25zdCgmcC0+cTIudmFsLHQpOworCWlmKElTTFdPUkQodCkpeworCSAgdW5zaWduZWQgbG9uZyB1bDsKKwkgIHJlZz1NVE1QMTsKKwkgIGlmKChjPT1BRER8fGM9PVNVQnx8Yz09QURESTJQfHxjPT1TVUJJRlApJiZ6dW1lcXRvKHZ1bWF4LHVsMnp1bSgxVUwpKSl7CisJICAgIGlmKGM9PUFERCkgYz1TVUI7CisJICAgIGVsc2UgaWYoYz09U1VCKSBjPUFERDsKKwkgICAgZWxzZSBpZihjPT1BRERJMlApIGM9U1VCSUZQOworCSAgICBlbHNlIGM9QURESTJQOworCSAgICB0bXAxPU9ORVM7dG1wMj1PTkVTOworCSAgfWVsc2V7CisJICAgIHVsPXp1bTJ1bCh6dW1hbmQodnVtYXgsdWwyenVtKDY1NTM1VUwpKSk7CisJICAgIGlmKHVsPT0wKSB0bXAxPVpFUk9TOworCSAgICBlbHNlIGlmKHVsPT0weGZmZmYpIHRtcDE9T05FUzsKKwkgICAgZWxzZXsKKwkgICAgICBCU0VUKHJlZ3NfbW9kaWZpZWQsdGkpOworCSAgICAgIHRtcDE9dGk7CisJICAgICAgZW1pdChmLCJcdG1vdlx0JXMsIyVsdVxuIixyZWduYW1lc1t0aV0sdWwpOworCSAgICB9CisJICAgIHVsPXp1bTJ1bCh6dW1hbmQoenVtcnNoaWZ0KHZ1bWF4LHVsMnp1bSgxNlVMKSksdWwyenVtKDY1NTM1VUwpKSk7CisJICAgIGlmKHVsPT0wKSB0bXAyPVpFUk9TOworCSAgICBlbHNlIGlmKHVsPT0weGZmZmYpIHRtcDI9T05FUzsKKwkgICAgZWxzZXsKKwkgICAgICBCU0VUKHJlZ3NfbW9kaWZpZWQsdGkyKTsKKwkgICAgICB0bXAyPXRpMjsKKwkgICAgICBlbWl0KGYsIlx0bW92XHQlcywjJWx1XG4iLHJlZ25hbWVzW3RpMl0sdWwpOworCSAgICB9CisJICB9CisJfWVsc2V7CisJICBsb25nIGw7CisJICBpZihjPT1PUiYmKGw9cG9mMih2dW1heCkpJiZJU0JBRERSKHAtPnoudikpeworCSAgICBlbWl0KGYsIlx0YnNldFx0Iik7ZW1pdF9vYmooZiwmcC0+eix0KTsKKwkgICAgZW1pdChmLCIuJWxkXG4iLGwtMSk7CisJICAgIGNjPTA7Y29udGludWU7CisJICB9ZWxzZSBpZihjPT1BTkQmJihsPXBvZjIoenVta29tcGwodnVtYXgpKSkmJklTQkFERFIocC0+ei52KSl7CisJICAgIGVtaXQoZiwiXHRiY2xyXHQiKTtlbWl0X29iaihmLCZwLT56LHQpOworCSAgICBlbWl0KGYsIi4lbGRcbiIsbC0xKTsKKwkgICAgY2M9MDtjb250aW51ZTsKKwkgIH1lbHNlIGlmKChjPT1BRER8fGM9PVNVQnx8Yz09QURESTJQfHxjPT1TVUJJRlApJiZ6dW1lcXRvKHZ1bWF4LHVsMnp1bSgxVUwpKSl7CisJICAgIGlmKGM9PUFERCkgYz1TVUI7IAorCSAgICBlbHNlIGlmKGM9PVNVQikgYz1BREQ7CisJICAgIGVsc2UgaWYoYz09QURESTJQKSBjPVNVQklGUDsKKwkgICAgZWxzZSBjPUFEREkyUDsKKwkgICAgcmVnPU9ORVM7CisJICB9ZWxzZXsKKwkgICAgaWYoenVtZXF0byh2dW1heCx1bDJ6dW0oMFVMKSkpIHJlZz1aRVJPUzsKKwkgICAgZWxzZSBpZih6dW1lcXRvKHZ1bWF4LHVsMnp1bSgweGZmZmZVTCkpKSByZWc9T05FUzsKKwkgICAgZWxzZXsKKwkgICAgICBCU0VUKHJlZ3NfbW9kaWZpZWQsdHApOworCSAgICAgIHJlZz10cDsKKwkgICAgICBtb3ZlKGYsJnAtPnEyLDAsMCxyZWcsdCk7CisJICAgIH0KKwkgIH0KKwl9CisgICAgICB9ZWxzZXsKKwkvKkZJWE1FOm9uZXMvemVyb3MgbnV0emVuKi8KKwlpZihJU0xXT1JEKHQpKXsKKwkgIHRtcDE9dGk7dG1wMj10aTI7CisJICBCU0VUKHJlZ3NfbW9kaWZpZWQsdGkpOworCSAgQlNFVChyZWdzX21vZGlmaWVkLHRpMik7CisJICByZWc9TVRNUDE7CisJfWVsc2V7CisJICBCU0VUKHJlZ3NfbW9kaWZpZWQsdHApOworCSAgcmVnPXRwOworCX0KKwlpZigocC0+cTIuZmxhZ3MmKERSRUZPQkp8UkVHKSk9PURSRUZPQkopeworCSAgaWYoSVNMV09SRChwLT5xMi5kdHlwKSl7CisJICAgIHRtcDM9dGkyO3RtcDQ9dGk7CisJICAgIEJTRVQocmVnc19tb2RpZmllZCx0aSk7CisJICAgIEJTRVQocmVnc19tb2RpZmllZCx0aTIpOworCSAgICBwLT5xMi5mbGFncyY9fkRSRUZPQko7CisJICAgIG1vdmUoZiwmcC0+cTIsMCwwLE1UTVAyLEhQT0lOVEVSKTsKKwkgICAgcC0+cTIuZmxhZ3M9KFJFR3xEUkVGT0JKKTtwLT5xMi5yZWc9TVRNUDI7CisJICB9ZWxzZSBpZighKHAtPnEyLmZsYWdzJktPTlNUKSl7CisJICAgIEJTRVQocmVnc19tb2RpZmllZCx0aSk7CisJICAgIG1vdmUoZiwmcC0+cTIsMCwwLHRpLE5QT0lOVEVSKTsKKwkgICAgcC0+cTIuZmxhZ3M9UkVHO3AtPnEyLnJlZz10aTsKKwkgIH0KKwl9CisJbW92ZShmLCZwLT5xMiwwLDAscmVnLHQpOworICAgICAgfQorICAgICAgaWYoYz49T1ImJmM8PUFORCl7CisJcz1sb2dpY2Fsc1tjLU9SXTsKKyAgICAgIH1lbHNleworCWlmKGM9PUFEREkyUCkKKwkgIHM9YXJpdGhtZXRpY3NbQURELUxTSElGVF07CisJZWxzZSBpZihjPT1TVUJJRlApCisJICBzPWFyaXRobWV0aWNzW1NVQi1MU0hJRlRdOworCWVsc2UKKwkgIHM9YXJpdGhtZXRpY3NbYy1MU0hJRlRdOworICAgICAgfQorICAgICAgaWYocmVnJiZyZWdfcGFpcihyZWcsJnJwKSl7CisJaWYoSVNGQVIocC0+ei52KSl7CisJICBlbWl0KGYsIlx0ZXh0c1x0I1NFRyAiKTtpc3NlZz0xO2VtaXRfb2JqKGYsJnAtPnosdCk7ZW1pdChmLCIsIzJcbiIpOworCX0KKwllbWl0KGYsIlx0JXNcdCIscyk7CisJZW1pdF9vYmooZiwmcC0+cTEsdCk7ZW1pdChmLCIsJXNcbiIscmVnbmFtZXNbcnAucjFdKTsKKwlzPWxvbmdjbWQocyk7CisJcC0+cTEudmFsLnZtYXg9em1hZGQocC0+cTEudmFsLnZtYXgsbDJ6bSgyTCkpOworCWVtaXQoZiwiXHQlc1x0IixzKTsKKwllbWl0X29iaihmLCZwLT5xMSx0KTtlbWl0KGYsIiwlc1xuIixyZWduYW1lc1tycC5yMl0pOworCXAtPnExLnZhbC52bWF4PXptc3ViKHAtPnExLnZhbC52bWF4LGwyem0oMkwpKTsKKyAgICAgIH1lbHNleworCWlmKElTRkFSKHAtPnoudikpeworCSAgZW1pdChmLCJcdGV4dHNcdCNTRUcgIik7aXNzZWc9MTtlbWl0X29iaihmLCZwLT56LHQpO2VtaXQoZiwiLCMxXG4iKTsKKwl9CisJZW1pdChmLCJcdCVzJXNcdCIscywodCZOUSk9PUNIQVI/ImIiOiIiKTsKKwllbWl0X29iaihmLCZwLT5xMSx0KTsKKwlpZihyZWcpCisJICBlbWl0KGYsIiwlc1xuIiwoKHQmTlEpPT1DSEFSJiZyZWc8PU1BWFIpP2JyZWduYW1lc1tyZWddOnJlZ25hbWVzW3JlZ10pOworCWVsc2V7CisJICBlbWl0KGYsIiwiKTsKKwkgIGVtaXRfb2JqKGYsJnAtPnEyLHQpOworCSAgZW1pdChmLCJcbiIpOworCX0KKyAgICAgIH0KKyAgICAgIGNjPSZwLT56O2NjX3Q9dDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihwLT5leHQuZmxhZ3M9PUVYVF9JQ19CVFNUKXsKKyAgICAgIGlmKGlzcmVnKHExKSl7Yml0X3JlZz1yZWduYW1lc1twLT5xMS5yZWddO2NvbnRpbnVlO30KKyAgICAgIGlmKChwLT5xMS5mbGFncyYoVkFSfFZBUkFEUnxEUkVGT0JKfFJFRykpPT1WQVImJklTU1RBVElDKHAtPnExLnYpJiZJU0JBRERSKHAtPnExLnYpKXsKKwliaXRfcmVnPTA7Yml0X29iaj0mcC0+cTE7CisJY29udGludWU7CisgICAgICB9CisgICAgfQorCisgICAgaWYoKGM9PU1VTFR8fCgoYz09RElWfHxjPT1NT0QpJiYocC0+dHlwZiZVTlNJR05FRCkpKSYmaXNjb25zdChxMikpeworICAgICAgbG9uZyBsbjsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCx0KTsKKyAgICAgIGlmKHptbGVxKGwyem0oMEwpLHZtYXgpJiZ6dW1sZXEodWwyenVtKDBVTCksdnVtYXgpKXsKKwlpZihsbj1wb2YyKHZ1bWF4KSl7CisJICBpZihjPT1NT0QpeworCSAgICB2bWF4PXptc3ViKHZtYXgsbDJ6bSgxTCkpOworCSAgICBwLT5jb2RlPUFORDsKKwkgIH1lbHNleworCSAgICB2bWF4PWwyem0obG4tMSk7CisJICAgIGlmKGM9PURJVikgcC0+Y29kZT1SU0hJRlQ7IGVsc2UgcC0+Y29kZT1MU0hJRlQ7CisJICB9CisJICBjPXAtPmNvZGU7CisJICBndmFsLnZtYXg9dm1heDsKKwkgIGV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKKwkgIGlmKGM9PUFORCl7CisJICAgIGluc2VydF9jb25zdCgmcC0+cTIudmFsLHQpOworCSAgfWVsc2V7CisJICAgIGluc2VydF9jb25zdCgmcC0+cTIudmFsLElOVCk7CisJICAgIHAtPnR5cGYyPUlOVDsKKwkgIH0KKwl9CisgICAgICB9CisgICAgfQorICAgIGlmKElTTFdPUkQodCkmJihjPT1NVUxUfHxjPT1ESVZ8fGM9PU1PRCkpeworICAgICAgaWYobGliX2xhcml0aChmLHApKSBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZighcC0+cTEuYW0mJihwLT5xMS5mbGFncyZEUkVGT0JKKSl7CisgICAgICBpZighKHAtPnExLmZsYWdzJihSRUcpKSl7CisJaWYoSVNMV09SRChwLT5xMS5kdHlwKSl7CisJICB0bXAzPXRpMjt0bXA0PXRpO3RpMl91c2VkPTE7CisJICBCU0VUKHJlZ3NfbW9kaWZpZWQsdGkpOworCSAgQlNFVChyZWdzX21vZGlmaWVkLHRpMik7CisJICBwLT5xMS5mbGFncyY9fkRSRUZPQko7CisJICBtb3ZlKGYsJnAtPnExLDAsMCxNVE1QMixGUE9JTlRFUik7CisJICBwLT5xMS5yZWc9TVRNUDI7CisJICBwLT5xMS5mbGFncz0oUkVHfERSRUZPQkopOworCX1lbHNlIGlmKCEocC0+cTEuZmxhZ3MmS09OU1QpKXsKKwkgIEJTRVQocmVnc19tb2RpZmllZCx0aSk7CisJICBwLT5xMS5mbGFncyY9fkRSRUZPQko7CisJICBtb3ZlKGYsJnAtPnExLDAsMCx0aSxOUE9JTlRFUik7CisJICBwLT5xMS5yZWc9dGk7CisJICBwLT5xMS5mbGFncz0oUkVHfERSRUZPQkopOworCX0KKyAgICAgIH0KKyAgICAgIGlmKHAtPnEyLmZsYWdzKXsKKwltb3ZlKGYsJnAtPnExLDAsMCxyZWcscTJ0eXAocCkpOy8qRklYTUUqLworCWlmKCghaXNyZWcocTEpfHxwLT5xMS5yZWchPXJlZykmJmM9PUNPTVBBUkUmJiFJU0xXT1JEKHQpJiZpc2NvbnN0KHEyKSl7CisJICAvKiBhdm9pZCBjbXAsIGlmIG5vdCBuZWVkZWQgKi8KKwkgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCx0KTsKKwkgIGlmKElTTlVMTCgpKXsKKwkgICAgbGFzdGNvbXA9dDtjb250aW51ZTsKKwkgIH0KKwl9CisgICAgICB9CisgICAgfWVsc2V7CisgICAgICBpZihwLT5xMi5mbGFncyl7CisJbW92ZShmLCZwLT5xMSwwLDAscmVnLHExdHlwKHApKTsvKkZJWE1FKi8KKwlpZigoIWlzcmVnKHExKXx8cC0+cTEucmVnIT1yZWcpJiZjPT1DT01QQVJFJiYhSVNMV09SRCh0KSYmaXNjb25zdChxMikpeworCSAgLyogYXZvaWQgY21wLCBpZiBub3QgbmVlZGVkICovCisJICBldmFsX2NvbnN0KCZwLT5xMi52YWwsdCk7CisJICBpZihJU05VTEwoKSl7CisJICAgIGxhc3Rjb21wPXQ7Y29udGludWU7CisJICB9CisJfQorICAgICAgfQorICAgIH0KKyAgICBpZihwLT5leHQuZmxhZ3M9PUVYVF9JQ19CVFNUKXsgYml0X3JlZz1yZWduYW1lc1tyZWddO2NvbnRpbnVlO30KKyAgICBpZighcC0+cTIuYW0mJihwLT5xMi5mbGFncyZEUkVGT0JKKSl7CisgICAgICBpZighKHAtPnEyLmZsYWdzJihSRUcpKXx8cC0+cTIucmVnPjQpeworCWlmKElTTFdPUkQocC0+cTIuZHR5cCkpeworCSAgaWYodGkyX3VzZWQpIHRtcDQ9Z2V0X3JlZyhmLHApOyBlbHNlIHRtcDQ9dGkyOworCSAgdG1wMz10cDsKKwkgIEJTRVQocmVnc19tb2RpZmllZCx0bXAzKTsKKwkgIEJTRVQocmVnc19tb2RpZmllZCx0bXA0KTsKKwkgIHAtPnEyLmZsYWdzJj1+RFJFRk9CSjsKKwkgIG1vdmUoZiwmcC0+cTIsMCwwLE1UTVAyLEZQT0lOVEVSKTsKKwkgIHAtPnEyLnJlZz1NVE1QMjsKKwkgIHAtPnEyLmZsYWdzPShSRUd8RFJFRk9CSik7CisJfWVsc2UgaWYoIShwLT5xMi5mbGFncyZLT05TVCkpeworCSAgQlNFVChyZWdzX21vZGlmaWVkLHRwKTsKKwkgIHAtPnEyLmZsYWdzJj1+RFJFRk9CSjsKKwkgIG1vdmUoZiwmcC0+cTIsMCwwLHRwLE5QT0lOVEVSKTsKKwkgIHAtPnEyLmZsYWdzPShSRUd8RFJFRk9CSik7CisJICBwLT5xMi5yZWc9dHA7CisJfQorICAgICAgfQorICAgIH0KKyAgICBpZihjPT1DT05WRVJUJiYhbXVzdF9jb252ZXJ0KHAtPnR5cGYscC0+dHlwZjIsMCkpeworICAgICAgcC0+Y29kZT1jPUFTU0lHTjsKKyAgICAgIHAtPnEyLnZhbC52bWF4PXNpemV0YWJbcC0+dHlwZiZOUV07CisgICAgfQorCisgICAgaWYoYz09Q09OVkVSVCl7CisgICAgICBpbnQgdG89cC0+dHlwZjImTlU7CisgICAgICBpZih0bz09SU5UKSB0bz1TSE9SVDsKKyAgICAgIGlmKHRvPT0oVU5TSUdORUR8SU5UKXx8dG89PU5QT0lOVEVSKSB0bz0oVU5TSUdORUR8U0hPUlQpOworICAgICAgaWYodG89PUZQT0lOVEVSfHx0bz09SFBPSU5URVIpIHRvPShVTlNJR05FRHxMT05HKTsKKyAgICAgIGlmKCh0Jk5VKT09SU5UKSB0PVNIT1JUOworICAgICAgaWYoKHQmTlUpPT0oVU5TSUdORUR8SU5UKXx8KHQmTlUpPT1OUE9JTlRFUikgdD0oVU5TSUdORUR8U0hPUlQpOworICAgICAgaWYoKHQmTlEpPT1GUE9JTlRFUnx8KHQmTlEpPT1IUE9JTlRFUikgdD0oVU5TSUdORUR8TE9ORyk7CisgICAgICBpZigodG8mTlEpPD1MT05HJiYodCZOUSk8PUxPTkcpeworCWlmKCh0byZOUSk8PSh0Jk5RKSl7CisJICBpZigodG8mTlEpPT0odCZOUSkpIGllcnJvcigwKTsKKwkgIGlmKCh0byZOUSk9PUJJVCl7CisJICAgIGNjPTA7CisJICAgIGlmKChwLT5xMS5mbGFncyYoVkFSfFJFR3xEUkVGT0JKfFZBUkFEUikpIT1WQVJ8fCFJU1NUQVRJQyhwLT5xMS52KSkgaWVycm9yKDApOworCSAgICBpZihyZWdfcGFpcihyZWcsJnJwKSl7CisJICAgICAgZW1pdChmLCJcdG1vdlx0JXMsIzBcbiIscmVnbmFtZXNbcnAucjFdKTsKKwkgICAgICBlbWl0KGYsIlx0bW92XHQlcywjMFxuIixyZWduYW1lc1tycC5yMl0pOworCSAgICAgIGVtaXQoZiwiXHRibW92XHQlcy4wLCIscmVnbmFtZXNbcnAucjFdKTsKKwkgICAgICBlbWl0X29iaihmLCZwLT5xMSx0KTtlbWl0KGYsIlxuIik7CisJICAgIH1lbHNleworCSAgICAgIGVtaXQoZiwiXHRtb3ZcdCVzLCMwXG4iLHJlZ25hbWVzW3JlZ10pOworCSAgICAgIGVtaXQoZiwiXHRibW92XHQlcy4wLCIscmVnbmFtZXNbcmVnXSk7CisJICAgIH0KKwkgICAgZW1pdF9vYmooZiwmcC0+cTEsdCk7ZW1pdChmLCJcbiIpOworCSAgICBzYXZlX3Jlc3VsdChmLHJlZyxwLHQpOworCSAgICBjb250aW51ZTsKKwkgIH0KKwkgIGlmKChwLT5xMS5mbGFncyYoVkFSfFJFR3xWQVJBRFIpKT09VkFSJiZJU1NUQVRJQyhwLT5xMS52KSYmSVNGQVIocC0+cTEudikpeworCSAgICBlbWl0KGYsIlx0ZXh0c1x0I1NFRyAiKTtpc3NlZz0xO2VtaXRfb2JqKGYsJnAtPnExLHQpOworCSAgICBlbWl0KGYsIiwjMVxuIik7CisJICB9CisJICBxcC5TRUc9MDsKKwkgIGlmKCFwLT5xMS5hbSYmKHAtPnExLmZsYWdzJkRSRUZPQkopJiZyZWdfcGFpcihwLT5xMS5yZWcsJnFwKSkKKwkgICAgZW1pdChmLCJcdGV4dHNcdCVzLCMxXG4iLHJlZ25hbWVzW3FwLlNFR10pOworCSAgaWYocC0+cTEuYW0mJnJlZ19wYWlyKHAtPnExLmFtLT5iYXNlLCZxcCkpCisJICAgIGVtaXQoZiwiXHRleHRzXHQlcywjMVxuIixyZWduYW1lc1txcC5TRUddKTsKKwkgIGlmKHJlZ19wYWlyKHJlZywmcnApKXsKKwkgICAgY2M9MDsKKwkgICAgaWYoKHRvJk5RKT09Q0hBUil7CisJICAgICAgaWYoaXNyZWcocTEpfHwoKHAtPnExLmZsYWdzJihWQVJ8VkFSQURSfERSRUZPQkopKT09VkFSJiZJU1NUQVRJQyhwLT5xMS52KSkpeworCQllbWl0KGYsIlx0bW92YiVjXHQlcywiLCh0byZVTlNJR05FRCk/J3onOidzJyxyZWduYW1lc1tycC5yMV0pOworCQlpZigodG8mTlEpPT1DSEFSJiZpc3JlZyhxMSkpIGVtaXQoZiwiJXMiLGJyZWduYW1lc1twLT5xMS5yZWddKTsKKwkJZWxzZSBpZihxcC5TRUcpIGVtaXQoZiwiWyVzXSIscmVnbmFtZXNbcXAuU09GXSk7CisJCWVsc2UgZW1pdF9vYmooZiwmcC0+cTEsdG8pOworCQllbWl0KGYsIlxuIik7CisJICAgICAgfWVsc2V7CisJCUJTRVQocmVnc19tb2RpZmllZCx0cCk7CisJCWVtaXQoZiwiXHRtb3ZiXHQlcywiLGJyZWduYW1lc1t0cF0pOworCQlpZihpc3JlZyhxMSkpIGVtaXQoZiwiJXMiLGJyZWduYW1lc1twLT5xMS5yZWddKTsKKwkJZWxzZSBpZighcC0+cTEuYW0mJnFwLlNFRykgZW1pdChmLCJbJXNdIixyZWduYW1lc1txcC5TT0ZdKTsKKwkJZWxzZSBlbWl0X29iaihmLCZwLT5xMSx0byk7CisJCWVtaXQoZiwiXG4iKTsKKwkJZW1pdChmLCJcdG1vdmIlY1x0JXMsJXNcbiIsKHRvJlVOU0lHTkVEKT8neic6J3MnLHJlZ25hbWVzW3JwLnIxXSxicmVnbmFtZXNbdHBdKTsKKwkgICAgICB9CisJICAgIH1lbHNleworCSAgICAgIGVtaXQoZiwiXHRtb3ZcdCVzLCIscmVnbmFtZXNbcnAucjFdKTsKKwkgICAgICBpZihxcC5TRUcpIGVtaXQoZiwiWyVzXSIscmVnbmFtZXNbcXAuU09GXSk7CisJICAgICAgZWxzZSBlbWl0X29iaihmLCZwLT5xMSx0byk7CisJICAgICAgZW1pdChmLCJcbiIpOworCSAgICB9CisJICAgIGlmKHRvJlVOU0lHTkVEKQorCSAgICAgIGVtaXQoZiwiXHRtb3ZcdCVzLCMwXG4iLHJlZ25hbWVzW3JwLnIyXSk7CisJICAgIGVsc2UKKwkgICAgICBlbWl0KGYsIlx0bW92XHQlcywlc1xuXHRhc2hyXHQlcywjMTVcbiIscmVnbmFtZXNbcnAucjJdLHJlZ25hbWVzW3JwLnIxXSxyZWduYW1lc1tycC5yMl0pOworCisJICB9ZWxzZXsKKwkgICAgY2M9JnAtPno7Y2NfdD10OworCSAgICBpZihpc3JlZyhxMSl8fCgocC0+cTEuZmxhZ3MmKFZBUnxWQVJBRFJ8RFJFRk9CSikpPT1WQVImJklTU1RBVElDKHAtPnExLnYpKSl7CisJICAgICAgZW1pdChmLCJcdG1vdmIlY1x0JXMsIiwodG8mVU5TSUdORUQpPyd6JzoncycscmVnbmFtZXNbcmVnXSk7CisJICAgICAgaWYoKHRvJk5RKT09Q0hBUiYmaXNyZWcocTEpKSBlbWl0KGYsIiVzIixicmVnbmFtZXNbcC0+cTEucmVnXSk7CisJICAgICAgZWxzZSBpZihxcC5TRUcpIGVtaXQoZiwiWyVzXSIscmVnbmFtZXNbcXAuU09GXSk7CisJICAgICAgZWxzZSBlbWl0X29iaihmLCZwLT5xMSx0byk7CisJICAgICAgZW1pdChmLCJcbiIpOworCSAgICB9ZWxzZXsKKwkgICAgICBCU0VUKHJlZ3NfbW9kaWZpZWQsdHApOworCSAgICAgIGVtaXQoZiwiXHRtb3ZiXHQlcywiLGJyZWduYW1lc1t0cF0pOworCSAgICAgIGlmKGlzcmVnKHExKSkgZW1pdChmLCIlcyIsYnJlZ25hbWVzW3AtPnExLnJlZ10pOworCSAgICAgIGVsc2UgaWYoIXAtPnExLmFtJiZxcC5TRUcpIGVtaXQoZiwiWyVzXSIscmVnbmFtZXNbcXAuU09GXSk7CisJICAgICAgZWxzZSBlbWl0X29iaihmLCZwLT5xMSx0byk7CisJICAgICAgZW1pdChmLCJcbiIpOworCSAgICAgIGVtaXQoZiwiXHRtb3ZiJWNcdCVzLCVzXG4iLCh0byZVTlNJR05FRCk/J3onOidzJyxyZWduYW1lc1tyZWddLGJyZWduYW1lc1t0cF0pOworCSAgICB9CSAgICAKKwkgIH0KKwkgIHNhdmVfcmVzdWx0KGYscmVnLHAsdCk7CisJICBjb250aW51ZTsKKwl9ZWxzZXsKKwkgIGlmKCh0Jk5RKT09QklUKXsKKwkgICAgaWYoIWlzcmVnKHopJiYoKHAtPnouZmxhZ3MmKFZBUnxSRUd8RFJFRk9CSnxWQVJBRFIpKSE9VkFSfHwhSVNTVEFUSUMocC0+ei52KSkpIGllcnJvcigwKTsKKwkgICAgaWYoaXNyZWcocTEpKXsKKwkgICAgICByZWc9cC0+cTEucmVnOworCSAgICB9ZWxzZXsKKwkgICAgICBpZihJU0xXT1JEKHRvKSl7CisJCXRtcDE9dGk7dG1wMj10aTI7CisJCUJTRVQocmVnc19tb2RpZmllZCx0aSk7CisJCUJTRVQocmVnc19tb2RpZmllZCx0aTIpOworCQlyZWc9TVRNUDE7CisJICAgICAgfQorCSAgICB9CisJICAgIG1vdmUoZiwmcC0+cTEsMCwwLHJlZyx0byk7CisJICAgIGlmKHJlZ19wYWlyKHJlZywmcnApKXsKKwkgICAgICBpZihpc3JlZyhxMSkmJiFzY3JhdGNocmVnKHJlZyxwKSl7CisJCUJTRVQocmVnc19tb2RpZmllZCx0aSk7CisJCWVtaXQoZiwiXHRtb3ZcdCVzLCVzXG4iLHJlZ25hbWVzW3RpXSxyZWduYW1lc1tycC5yMV0pOworCQllbWl0KGYsIlx0b3JcdCVzLCVzXG4iLHJlZ25hbWVzW3RpXSxyZWduYW1lc1tycC5yMl0pOworCSAgICAgIH1lbHNlCisJCWVtaXQoZiwiXHRvclx0JXMsJXNcbiIscmVnbmFtZXNbcnAucjFdLHJlZ25hbWVzW3JwLnIyXSk7CisJICAgIH1lbHNleworCSAgICAgIGlmKGlzcmVnKHExKSkgZW1pdChmLCJcdGNtcCVzXHQlcywjMFxuIiwodG8mTlEpPT1DSEFSPyJiIjoiIiwodG8mTlEpPT1DSEFSP2JyZWduYW1lc1tyZWddOnJlZ25hbWVzW3JlZ10pOworCSAgICB9CisJICAgIGVtaXQoZiwiXHRibW92blx0Iik7CisJICAgIGlmKGlzZXNmcmJpdCh6KSkKKwkgICAgICBlbWl0KGYsIiVzLjAiLHJlZ25hbWVzW3RpXSk7CisJICAgIGVsc2UKKwkgICAgICBlbWl0X29iaihmLCZwLT56LHQpOworCSAgICBlbWl0KGYsIixQU1cuM1xuIik7CisJICAgIGlmKGlzZXNmcmJpdCh6KSl7CisJICAgICAgZW1pdChmLCJcdGV4dHJcdCMxXG4iKTsKKwkgICAgICBlbWl0KGYsIlx0Ym1vdlx0Iik7CisJICAgICAgZW1pdF9vYmooZiwmcC0+eix0KTsKKwkgICAgICBlbWl0KGYsIiwlcy4wXG4iLHJlZ25hbWVzW3RpXSk7CisJICAgIH0KKwkgICAgY2M9MDtjb250aW51ZTsKKwkgIH0KKwkgIGNjPSZwLT56O2NjX3Q9dDsKKwkgIGlmKElTTFdPUkQodG8pKXsKKwkgICAgaWYoaXNyZWcocTEpKSB7cmVnX3BhaXIocC0+cTEucmVnLCZycCk7cC0+cTEucmVnPXJwLnIxO30KKwkgICAgdG89U0hPUlQ7CisJICB9CisJICBpZihpc3JlZyhxMSkmJnJlZ29rKHAtPnExLnJlZyx0LDApKSByZWc9cC0+cTEucmVnOworCSAgaWYoaXNyZWcoeikpIHJlZz1wLT56LnJlZzsKKwkgIGlmKCFyZWdvayhyZWcsdCwwKSl7CisJICAgIHJlZz10cDsKKwkgICAgQlNFVChyZWdzX21vZGlmaWVkLHRwKTsKKwkgIH0KKwkgIG1vdmUoZiwmcC0+cTEsMCwwLHJlZyx0byk7CisJICBzYXZlX3Jlc3VsdChmLHJlZyxwLHQpOworCX0KKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGllcnJvcigwKTsKKyAgICB9CisgICAgaWYoYz09TUlOVVN8fGM9PUtPTVBMRU1FTlQpeworICAgICAgbW92ZShmLCZwLT5xMSwwLDAscmVnLHQpOworICAgICAgaWYocmVnX3BhaXIocmVnLCZycCkpeworCWVtaXQoZiwiXHQlc1x0JXNcbiIsKGM9PU1JTlVTPyJuZWciOiJjcGwiKSxyZWduYW1lc1tycC5yMV0pOworCWlmKGM9PU1JTlVTKSBlbWl0KGYsIlx0YWRkY1x0JXMsIzBcbiIscmVnbmFtZXNbcnAucjJdKTsKKwllbWl0KGYsIlx0JXNcdCVzXG4iLChjPT1NSU5VUz8ibmVnIjoiY3BsIikscmVnbmFtZXNbcnAucjJdKTsKKwljYz0wOworICAgICAgfWVsc2V7CisJZW1pdChmLCJcdCVzJXNcdCVzXG4iLChjPT1NSU5VUz8ibmVnIjoiY3BsIikseF90W3QmTlFdLHJlZ25hbWVzW3JlZ10pOworCWNjPSZwLT56O2NjX3Q9dDsKKyAgICAgIH0KKyAgICAgIHNhdmVfcmVzdWx0KGYscmVnLHAsdCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09U0VUUkVUVVJOKXsKKyAgICAgIGlmKHAtPnoucmVnKXsKKwltb3ZlKGYsJnAtPnExLDAsMCxwLT56LnJlZyx0KTsKKwlCU0VUKHJlZ3NfbW9kaWZpZWQscC0+ei5yZWcpOworICAgICAgfQorICAgICAgY2M9MDsgLyogcHJvYmFibHkgbm90IG5lZWRlZCAqLworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PUdFVFJFVFVSTil7CisgICAgICBpZihwLT5xMS5yZWcpeworCWlmKCFpc3JlZyh6KXx8cC0+ei5yZWchPXAtPnExLnJlZyl7IGNjPSZwLT56O2NjX3Q9dDt9CisJc2F2ZV9yZXN1bHQoZixwLT5xMS5yZWcscCx0KTsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1DQUxMKXsKKyAgICAgIGludCByZWcsam1wPTA7bG9uZyBjc3N0YWNrPTAsY3VzdGFjaz0wOworICAgICAgY2M9MDsKKyAgICAgIGlmKChwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiYhc3RyY21wKCJfX3ZhX3N0YXJ0IixwLT5xMS52LT5pZGVudGlmaWVyKSl7CisJbG9uZyB2YV9vZmY9bG9mZi11c3JzdGFja29mZnNldCtwdXNoZWRzaXplK3ptMmwodmFfb2Zmc2V0KHYpKTsKKwllbWl0KGYsIlx0bW92XHQlcywlc1xuIixyZWduYW1lc1tyNF0scmVnbmFtZXNbc3BdKTsKKwlpZih2YV9vZmYpCisJICBlbWl0KGYsIlx0YWRkXHQlcywjJWxkXG4iLHJlZ25hbWVzW3I0XSx2YV9vZmYpOworCUJTRVQocmVnc19tb2RpZmllZCxyNCk7CisJaWYoTEFSR0V8fEhVR0UpeworCSAgZW1pdChmLCJcdG1vdlx0JXMsIzBcbiIscmVnbmFtZXNbcjVdKTsKKwkgIEJTRVQocmVnc19tb2RpZmllZCxyNSk7CisJfQorCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoc3RhY2tfdmFsaWQpeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaWYocC0+Y2FsbF9jbnQ8PTApeworICAgICAgICAgIGVycl9pYz1wO2lmKGYpIGVycm9yKDMyMCk7CisgICAgICAgICAgc3RhY2tfdmFsaWQ9MDsKKyAgICAgICAgfQorICAgICAgICBmb3IoaT0wO3N0YWNrX3ZhbGlkJiZpPHAtPmNhbGxfY250O2krKyl7CisgICAgICAgICAgaWYocC0+Y2FsbF9saXN0W2ldLnYtPmZpJiYocC0+Y2FsbF9saXN0W2ldLnYtPmZpLT5mbGFncyZBTExfU1RBQ0spKXsKKwkgICAgaWYocC0+Y2FsbF9saXN0W2ldLnYtPmZpLT5zdGFjazE+Y3VzdGFjaykgY3VzdGFjaz1wLT5jYWxsX2xpc3RbaV0udi0+ZmktPnN0YWNrMTsKKwkgICAgaWYocC0+Y2FsbF9saXN0W2ldLnYtPmZpLT5zdGFjazI+Y3NzdGFjaykgY3NzdGFjaz1wLT5jYWxsX2xpc3RbaV0udi0+ZmktPnN0YWNrMjsKKyAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGVycl9pYz1wO2lmKGYpIGVycm9yKDMxNyxwLT5jYWxsX2xpc3RbaV0udi0+aWRlbnRpZmllcik7CisgICAgICAgICAgICBzdGFja192YWxpZD0wOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYoIWNhbGNfcmVncyhwLGYhPTApJiZ2LT5maSkgdi0+ZmktPmZsYWdzJj1+QUxMX1JFR1M7CisgICAgICBpZigocC0+cTEuZmxhZ3MmVkFSKSYmcC0+cTEudi0+ZmkmJnAtPnExLnYtPmZpLT5pbmxpbmVfYXNtKXsKKwllbWl0X2lubGluZV9hc20oZixwLT5xMS52LT5maS0+aW5saW5lX2FzbSk7CisJY2FsbGVlX3B1c2goY3VzdGFjayxjc3N0YWNrKTsKKyAgICAgIH1lbHNleworCWlmKHVzcnN0YWNrb2Zmc2V0PT0wJiYhaGF2ZV9mcmFtZSYmISh2LT50YXR0ciZJTlRFUlJVUFQpKXsKKwkgIHN0cnVjdCBJQyAqcDI7CisJICBqbXA9MTsKKwkgIGZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKwkgICAgaWYocDItPmNvZGUhPUZSRUVSRUcmJnAyLT5jb2RlIT1BTExPQ1JFRyYmcDItPmNvZGUhPUxBQkVMJiYKKwkgICAgICAgKHAyLT5jb2RlIT1HRVRSRVRVUk58fChwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKSE9UkVHfHxwMi0+cTEucmVnIT1wMi0+ei5yZWcpJiYKKwkgICAgICAgKHAyLT5jb2RlIT1TRVRSRVRVUk58fChwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSkhPVJFR3x8cDItPnExLnJlZyE9cDItPnoucmVnKSl7CisJICAgICAgam1wPTA7YnJlYWs7CisJICAgIH0KKwkgIH0KKwl9CisJaWYocC0+cTEuZmxhZ3MmRFJFRk9CSil7CisJICBpbnQgY2xhYmVsPSsrbGFiZWw7CisJICBpZihJU0xXT1JEKHAtPnExLmR0eXApKXsKKwkgICAgaW50IHRtcDsKKwkgICAgaWYoIXRpMl91c2VkKSB0bXA9dGkyOyBlbHNlIHRtcD10cDsKKwkgICAgQlNFVChyZWdzX21vZGlmaWVkLHRtcCk7CisJICAgIGVtaXQoZiwiXHRtb3ZcdCVzLCNTRUcgJXMlZFxuIixyZWduYW1lc1t0bXBdLGxhYnByZWZpeCxjbGFiZWwpOworCSAgICBlbWl0KGYsIlx0cHVzaFx0JXNcbiIscmVnbmFtZXNbdG1wXSk7CisJICAgIGVtaXQoZiwiXHRtb3ZcdCVzLCNTT0YgJXMlZFxuIixyZWduYW1lc1t0bXBdLGxhYnByZWZpeCxjbGFiZWwpOworCSAgICBlbWl0KGYsIlx0cHVzaFx0JXNcbiIscmVnbmFtZXNbdG1wXSk7CisJICAgIHB1c2goMCw0KTsKKwkgIH0KKwkgIGlmKCEocC0+cTEuZmxhZ3MmUkVHKSkgaWVycm9yKDApOworCSAgcmVnPXAtPnExLnJlZzsKKwkgIHAtPnExLmZsYWdzJj1+RFJFRk9CSjsKKwkgIGlmKCFJU0xXT1JEKHAtPnExLmR0eXApKXsKKwkgICAgZW1pdChmLCJcdGNhbGxpXHRjY191YyxbJXNdXG4iLHJlZ25hbWVzW3JlZ10pOworCSAgICBwdXNoKDAsMik7CisJICAgIGNhbGxlZV9wdXNoKGN1c3RhY2ssY3NzdGFjayk7CisJICAgIHBvcCgwLDIpOworCSAgfWVsc2V7CisJICAgIGlmKCFyZWdfcGFpcihyZWcsJnJwKSkgaWVycm9yKDApOworCSAgICBlbWl0KGYsIlx0cHVzaFx0JXNcbiIscmVnbmFtZXNbcnAucjJdKTsKKwkgICAgZW1pdChmLCJcdHB1c2hcdCVzXG4iLHJlZ25hbWVzW3JwLnIxXSk7CisJICAgIHB1c2goMCw0KTsKKwkgICAgY2FsbGVlX3B1c2goY3VzdGFjayxjc3N0YWNrKTsKKwkgICAgZW1pdChmLCJcdHJldHNcbiIpOworCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxjbGFiZWwpOworCSAgICBwb3AoMCw4KTsKKwkgIH0KKwl9ZWxzZXsKKwkgIGlmKGptcCl7CisJICAgIGVtaXQoZiwiXHQlcyIsanVtcCk7CisJICAgIGlmKCFuZWVkX3JldHVybikgcmV0PVRBU0tJTkc/InJldHYiOiIiOworCSAgICBjYWxsZWVfcHVzaChjdXN0YWNrLGNzc3RhY2spOworCSAgfWVsc2V7CisJICAgIGVtaXQoZiwiXHQlc1x0IixjYWxsKTsKKwkgICAgaWYoVElOWSkKKwkgICAgICBwdXNoKDAsMik7CisJICAgIGVsc2UKKwkgICAgICBwdXNoKDAsNCk7CisJICAgIGNhbGxlZV9wdXNoKGN1c3RhY2ssY3NzdGFjayk7CisJICAgIGlmKFRJTlkpCisJICAgICAgcG9wKDAsMik7CisJICAgIGVsc2UKKwkgICAgICBwb3AoMCw0KTsKKwkgIH0KKwkgIGVtaXRfb2JqKGYsJnAtPnExLHQpOworCSAgZW1pdChmLCJcbiIpOworCX0KKyAgICAgIH0KKyAgICAgIGlmKCF6bWVxdG8obDJ6bSgwTCkscC0+cTIudmFsLnZtYXgpKXsKKwlub3Rwb3BwZWQrPXptMmwocC0+cTIudmFsLnZtYXgpOworCWRvbnRwb3AtPXptMmwocC0+cTIudmFsLnZtYXgpOworCWlmKCEoZ19mbGFnc1syXSZVU0VERkxBRykmJnVzcnN0YWNrb2Zmc2V0PT0tbm90cG9wcGVkKXsKKwkgIC8qICBFbnRmZXJuZW4gZGVyIFBhcmFtZXRlciB2ZXJ6b2VnZXJuICAqLworCX1lbHNleworCSAgZW1pdChmLCJcdGFkZFx0JXMsIyVsZFxuIixyZWduYW1lc1tzcF0sem0ybChwLT5xMi52YWwudm1heCkpOworCSAgcG9wKHptMmwocC0+cTIudmFsLnZtYXgpLDApOworCSAgbm90cG9wcGVkLT16bTJsKHAtPnEyLnZhbC52bWF4KTtjYz0wOworCX0KKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1BU1NJR058fGM9PVBVU0gpeworICAgICAgaWYoYz09UFVTSCkgZG9udHBvcCs9em0ybChwLT5xMi52YWwudm1heCk7CisgICAgICBpZighSVNTQ0FMQVIodCl8fCF6bWVxdG8ocC0+cTIudmFsLnZtYXgsc2l6ZXRhYlt0Jk5RXSl8fCF6bWxlcShwLT5xMi52YWwudm1heCxsMnptKDRMKSkpeworCWludCBhbHEsYWx6LHJxLHJ6O3Vuc2lnbmVkIGxvbmcgc2l6ZTsKKwljYz0wOworCXNpemU9em0ybChwLT5xMi52YWwudm1heCk7CisJLypGSVhNRTogY2hlY2sgZm9yIChzKWh1Z2UgKi8KKwlpZihtYWxpZ25bdCZOUV09PTEpeworCSAgYWxxPWFsaWdubWVudCgmcC0+cTEpOworCSAgYWx6PWFsaWdubWVudCgmcC0+eik7CisJfWVsc2V7CisJICBhbHE9YWx6PTA7CisJfQorCWlmKHNpemU9PTF8fChzaXplPT0yJiZhbHE9PTAmJmFsej09MCkpeworCSAgaWYoYz09UFVTSCYmem0ybChwLT56LnZhbC52bWF4KT09MSl7CisJICAgIGVtaXQoZiwiXHRzdWJcdCVzLCMxXG4iLHJlZ25hbWVzW3NwXSk7CisJICAgIHB1c2goMSwwKTtzaXplPTE7CisJICB9CisJICBCU0VUKHJlZ3NfbW9kaWZpZWQsdHApOworCSAgbW92ZShmLCZwLT5xMSwwLDAsdHAsc2l6ZT09MT9DSEFSOlNIT1JUKTsKKwkgIGlmKGM9PVBVU0gpeworCSAgICBlbWl0KGYsIlx0bW92XHRbLSVzXSwlc1xuIixyZWduYW1lc1tzcF0scmVnbmFtZXNbdHBdKTsKKwkgICAgcHVzaChzaXplLDApOworCSAgfWVsc2UKKwkgICAgc2F2ZV9yZXN1bHQoZix0cCxwLHNpemU9PTE/Q0hBUjpTSE9SVCk7CisJICBjb250aW51ZTsKKwl9CisJaWYoc2l6ZT09NCYmYWxxPT0wJiZhbHo9PTApeworCSAgdG1wMT10aTt0bXAyPXRpMjsKKwkgIEJTRVQocmVnc19tb2RpZmllZCx0aSk7CisJICBCU0VUKHJlZ3NfbW9kaWZpZWQsdGkyKTsKKwkgIG1vdmUoZiwmcC0+cTEsMCwwLE1UTVAxLExPTkcpOworCSAgaWYoYz09UFVTSCl7CisJICAgIGVtaXQoZiwiXHRtb3ZcdFstJXNdLCVzXG4iLHJlZ25hbWVzW3NwXSxyZWduYW1lc1t0bXAyXSk7CisJICAgIGVtaXQoZiwiXHRtb3ZcdFstJXNdLCVzXG4iLHJlZ25hbWVzW3NwXSxyZWduYW1lc1t0bXAxXSk7CisJICAgIHB1c2goNCwwKTsKKwkgIH1lbHNlCisJICAgIHNhdmVfcmVzdWx0KGYsTVRNUDEscCxMT05HKTsKKwkgIGNvbnRpbnVlOworCX0KKwlpZihwLT5xMS5hbSl7CisJICBpZihwLT5xMS5hbS0+ZmxhZ3MhPUlNTV9JTkQpIGllcnJvcigwKTsKKwkgIGlmKCFzY3JhdGNocmVnKHAtPnExLmFtLT5iYXNlLHApKXsKKwkgICAgQlNFVChyZWdzX21vZGlmaWVkLHRpKTsKKwkgICAgZW1pdChmLCJcdG1vdlx0JXMsJXNcbiIscmVnbmFtZXNbdGldLHJlZ25hbWVzW3AtPnExLmFtLT5iYXNlXSk7CisJICAgIHJxPXRpOworCSAgfWVsc2UKKwkgICAgcnE9cC0+cTEuYW0tPmJhc2U7CisJICBlbWl0KGYsIlx0YWRkXHQlcywjJWxkIixyZWduYW1lc1tycV0scC0+cTEuYW0tPm9mZnNldCk7CisJICBpZihwLT5xMS5hbS0+dil7CisJICAgIGlmKHAtPnExLmFtLT52LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pCisJICAgICAgZW1pdChmLCIrJXMlc1xuIixpZHByZWZpeCxwLT5xMS5hbS0+di0+aWRlbnRpZmllcik7CisKKwkgICAgZWxzZQorCSAgICAgIGVtaXQoZiwiKyVzJWxkXG4iLGxhYnByZWZpeCx6bTJsKHAtPnExLmFtLT52LT5vZmZzZXQpKTsKKwkgIH0KKwkgIGVtaXQoZiwiXG4iKTsKKwl9ZWxzZSBpZihwLT5xMS5mbGFncyZSRUcpeworCSAgaWYoc2NyYXRjaHJlZyhwLT5xMS5yZWcscCkpeworCSAgICBycT1wLT5xMS5yZWc7CisJICB9ZWxzZXsKKwkgICAgQlNFVChyZWdzX21vZGlmaWVkLHRpKTsKKwkgICAgZW1pdChmLCJcdG1vdlx0JXMsJXNcbiIscmVnbmFtZXNbdGldLHJlZ25hbWVzW3AtPnExLnJlZ10pOworCSAgICBycT10aTsKKwkgIH0KKwl9ZWxzZSBpZigocC0+cTEuZmxhZ3MmVkFSKSYmSVNTVEFUSUMocC0+cTEudikpeworCSAgaW50IG09cC0+cTEuZmxhZ3M7CisJICBycT10aTsKKwkgIEJTRVQocmVnc19tb2RpZmllZCx0aSk7CisJICBpZihwLT5xMS5mbGFncyZEUkVGT0JKKQorCSAgICBwLT5xMS5mbGFncyY9fkRSRUZPQko7CisJICBlbHNlCisJICAgIHAtPnExLmZsYWdzfD1WQVJBRFI7CisJICBtb3ZlKGYsJnAtPnExLDAsMCx0aSxOUE9JTlRFUik7CisJICBwLT5xMS5mbGFncyY9flZBUkFEUjsKKwl9ZWxzZXsKKwkgIEJTRVQocmVnc19tb2RpZmllZCx0aSk7CisJICBycT10aTsKKwkgIGVtaXQoZiwiXHRtb3ZcdCVzLCVzXG4iLHJlZ25hbWVzW3RpXSxyZWduYW1lc1tzcF0pOworCSAgaWYodm9mZigmcC0+cTEpKQorCSAgICBlbWl0KGYsIlx0YWRkXHQlcywjJWxkXG4iLHJlZ25hbWVzW3RpXSx2b2ZmKCZwLT5xMSkpOworCX0KKwlpZighcC0+ei5mbGFncyl7CisJICAvKiBQVVNIICovCisJICBlbWl0KGYsIlx0c3ViXHQlcywjJWx1XG4iLHJlZ25hbWVzW3NwXSxzaXplKTsKKwkgIGVtaXQoZiwiXHRtb3ZcdCVzLCVzXG4iLHJlZ25hbWVzW3RpMl0scmVnbmFtZXNbc3BdKTsKKwkgIHJ6PXRpMjsKKwkgIHB1c2goc2l6ZSwwKTsKKwkgIEJTRVQocmVnc19tb2RpZmllZCx0aTIpOworCX1lbHNlIGlmKHAtPnouYW0peworCSAgaWYocC0+ei5hbS0+ZmxhZ3MhPUlNTV9JTkQpIGllcnJvcigwKTsKKwkgIGlmKCFzY3JhdGNocmVnKHAtPnouYW0tPmJhc2UscCkpeworCSAgICBCU0VUKHJlZ3NfbW9kaWZpZWQsdGkyKTsKKwkgICAgZW1pdChmLCJcdG1vdlx0JXMsJXNcbiIscmVnbmFtZXNbdGkyXSxyZWduYW1lc1twLT56LmFtLT5iYXNlXSk7CisJICAgIHJ6PXRpMjsKKwkgIH1lbHNlCisJICAgIHJ6PXAtPnouYW0tPmJhc2U7CisJICBlbWl0KGYsIlx0YWRkXHQlcywjJWxkIixyZWduYW1lc1tyel0scC0+ei5hbS0+b2Zmc2V0KTsKKwkgIGlmKHAtPnouYW0tPnYpeworCSAgICBpZihwLT56LmFtLT52LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pCisJICAgICAgZW1pdChmLCIrJXMlcyIsaWRwcmVmaXgscC0+ei5hbS0+di0+aWRlbnRpZmllcik7CisJICAgIGVsc2UKKwkgICAgICBlbWl0KGYsIiUrcyVsZCIsbGFicHJlZml4LHptMmwocC0+ei5hbS0+di0+b2Zmc2V0KSk7CisKKwkgIH0KKwkgIGVtaXQoZiwiXG4iKTsKKwl9ZWxzZSBpZihwLT56LmZsYWdzJlJFRyl7CisJICBpZihzY3JhdGNocmVnKHAtPnoucmVnLHApKXsKKwkgICAgcno9cC0+ei5yZWc7CisJICB9ZWxzZXsKKwkgICAgQlNFVChyZWdzX21vZGlmaWVkLHRpMik7CisJICAgIGVtaXQoZiwiXHRtb3ZcdCVzLCVzXG4iLHJlZ25hbWVzW3RpMl0scmVnbmFtZXNbcC0+ei5yZWddKTsKKwkgICAgcno9dGkyOworCSAgfQorCX1lbHNlIGlmKElTU1RBVElDKHAtPnoudikpeworCSAgaW50IG09cC0+ei5mbGFnczsKKwkgIHJ6PXRpMjsKKwkgIEJTRVQocmVnc19tb2RpZmllZCx0aTIpOworCSAgaWYocC0+ei5mbGFncyZEUkVGT0JKKQorCSAgICBwLT56LmZsYWdzJj1+RFJFRk9CSjsKKwkgIGVsc2UKKwkgICAgcC0+ei5mbGFnc3w9VkFSQURSOworCSAgbW92ZShmLCZwLT56LDAsMCx0aTIsTlBPSU5URVIpOworCSAgcC0+ei5mbGFncz1tOworCX1lbHNleworCSAgQlNFVChyZWdzX21vZGlmaWVkLHRpMik7CisJICByej10aTI7CisJICBlbWl0KGYsIlx0bW92XHQlcywlc1xuIixyZWduYW1lc1t0aTJdLHJlZ25hbWVzW3NwXSk7CisJICBpZih2b2ZmKCZwLT56KSkKKwkgICAgZW1pdChmLCJcdGFkZFx0JXMsIyVsZFxuIixyZWduYW1lc1t0aTJdLHZvZmYoJnAtPnopKTsKKwl9CQorCWlmKGFscT09MCYmYWx6PT0wKXsKKwkgIGlmKG9wdHNwZWVkKXsKKwkgICAgaWYoKHNpemUvOCk+MSl7IAorCSAgICAgIEJTRVQocmVnc19tb2RpZmllZCx0cCk7CisJICAgICAgZW1pdChmLCJcdG1vdlx0JXMsIyVsdVxuIixyZWduYW1lc1t0cF0sc2l6ZS84KTsKKwkgICAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgICAgfQorCSAgICBpZihzaXplPj04KXsKKwkgICAgICBlbWl0KGYsIlx0bW92XHRbJXNdLFslcytdXG4iLHJlZ25hbWVzW3J6XSxyZWduYW1lc1tycV0pOworCSAgICAgIGVtaXQoZiwiXHRhZGRcdCVzLCMyXG4iLHJlZ25hbWVzW3J6XSk7CisJICAgICAgZW1pdChmLCJcdG1vdlx0WyVzXSxbJXMrXVxuIixyZWduYW1lc1tyel0scmVnbmFtZXNbcnFdKTsKKwkgICAgICBlbWl0KGYsIlx0YWRkXHQlcywjMlxuIixyZWduYW1lc1tyel0pOwkgICAgCisJICAgICAgZW1pdChmLCJcdG1vdlx0WyVzXSxbJXMrXVxuIixyZWduYW1lc1tyel0scmVnbmFtZXNbcnFdKTsKKwkgICAgICBlbWl0KGYsIlx0YWRkXHQlcywjMlxuIixyZWduYW1lc1tyel0pOworCSAgICAgIGVtaXQoZiwiXHRtb3ZcdFslc10sWyVzK11cbiIscmVnbmFtZXNbcnpdLHJlZ25hbWVzW3JxXSk7CisJICAgICAgZW1pdChmLCJcdGFkZFx0JXMsIzJcbiIscmVnbmFtZXNbcnpdKTsJICAgIAorCSAgICB9CisJICAgIGlmKChzaXplLzgpPjEpeworCSAgICAgIGVtaXQoZiwiXHRzdWJcdCVzLCMxXG4iLHJlZ25hbWVzW3RwXSk7CisJICAgICAgZW1pdChmLCJcdGptcHJcdGNjX256LCVzJWRcbiIsbGFicHJlZml4LGxhYmVsKTsJICAgICAgCisJICAgIH0KKwkgICAgc2l6ZSY9NzsKKwkgICAgaWYoc2l6ZT49NCl7CisJICAgICAgZW1pdChmLCJcdG1vdlx0WyVzXSxbJXMrXVxuIixyZWduYW1lc1tyel0scmVnbmFtZXNbcnFdKTsKKwkgICAgICBlbWl0KGYsIlx0YWRkXHQlcywjMlxuIixyZWduYW1lc1tyel0pOworCSAgICAgIGVtaXQoZiwiXHRtb3ZcdFslc10sWyVzK11cbiIscmVnbmFtZXNbcnpdLHJlZ25hbWVzW3JxXSk7CisJICAgICAgaWYoc2l6ZT40KSBlbWl0KGYsIlx0YWRkXHQlcywjMlxuIixyZWduYW1lc1tyel0pOwkgICAgICAKKwkgICAgfQorCSAgICBzaXplJj0zOworCSAgICBpZihzaXplPj0yKXsKKwkgICAgICBlbWl0KGYsIlx0bW92XHRbJXNdLFslcytdXG4iLHJlZ25hbWVzW3J6XSxyZWduYW1lc1tycV0pOworCSAgICAgIGlmKHNpemU+MikgZW1pdChmLCJcdGFkZFx0JXMsIzJcbiIscmVnbmFtZXNbcnpdKTsKKwkgICAgfQkgICAgICAKKwkgICAgaWYoc2l6ZSYxKQorCSAgICAgIGlmKHNpemUmMSkgZW1pdChmLCJcdG1vdmJcdFslc10sWyVzXVxuIixyZWduYW1lc1tyel0scmVnbmFtZXNbcnFdKTsKKwkgIH1lbHNleworCSAgICBCU0VUKHJlZ3NfbW9kaWZpZWQsdHApOworCSAgICBlbWl0KGYsIlx0bW92XHQlcywjJWx1XG4iLHJlZ25hbWVzW3RwXSxzaXplLzIpOworCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgICAgZW1pdChmLCJcdG1vdlx0WyVzXSxbJXMrXVxuIixyZWduYW1lc1tyel0scmVnbmFtZXNbcnFdKTsKKwkgICAgZW1pdChmLCJcdGFkZFx0JXMsIzJcbiIscmVnbmFtZXNbcnpdKTsKKwkgICAgZW1pdChmLCJcdHN1Ylx0JXMsIzFcbiIscmVnbmFtZXNbdHBdKTsKKwkgICAgZW1pdChmLCJcdGptcHJcdGNjX256LCVzJWRcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgICAgaWYoc2l6ZSYxKSBlbWl0KGYsIlx0bW92Ylx0WyVzXSxbJXNdXG4iLHJlZ25hbWVzW3J6XSxyZWduYW1lc1tycV0pOworCSAgfQorCX1lbHNleworCSAgQlNFVChyZWdzX21vZGlmaWVkLHRwKTsKKwkgIGVtaXQoZiwiXHRtb3ZcdCVzLCMlbHVcbiIscmVnbmFtZXNbdHBdLHNpemUpOworCSAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICBlbWl0KGYsIlx0bW92Ylx0WyVzXSxbJXMrXVxuIixyZWduYW1lc1tyel0scmVnbmFtZXNbcnFdKTsKKwkgIGVtaXQoZiwiXHRhZGRcdCVzLCMxXG4iLHJlZ25hbWVzW3J6XSk7CisJICBlbWl0KGYsIlx0c3ViXHQlcywjMVxuIixyZWduYW1lc1t0cF0pOworCSAgZW1pdChmLCJcdGptcHJcdGNjX256LCVzJWRcbiIsbGFicHJlZml4LGxhYmVsKTsKKwl9CisJY29udGludWU7CisgICAgICB9CisgICAgICAvKiBtb3YgW3J4XSxbcnldIDsgbW92IFtyeCtdLFtyeV0gOyBtb3YgW3J4XSxbcnkrXSAqLworICAgICAgaWYoIUlTTFdPUkQodCkmJihwLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmKHAtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJighcC0+ei5hbXx8cC0+ei5hbS0+ZmxhZ3M9PVBPU1RfSU5DKSYmKCFwLT5xMS5hbXx8cC0+cTEuYW0tPmZsYWdzPT1QT1NUX0lOQykmJiFyZWdfcGFpcihwLT5xMS5yZWcsJnJwKSYmIXJlZ19wYWlyKHAtPnoucmVnLCZycCkpeworCWVtaXQoZiwiXHRtb3Ylc1x0IiwodCZOUSk9PUNIQVI/ImIiOiIiKTsKKwllbWl0X29iaihmLCZwLT56LHQpO2VtaXQoZiwiLCIpOworCWVtaXRfb2JqKGYsJnAtPnExLHQpO2VtaXQoZiwiXG4iKTsKKwljYz0mcC0+ejtjY190PXQ7Y29udGludWU7CisgICAgICB9CisgICAgICAvKiBtb3YgbWVtLFtyeF0vcmVnICovCisgICAgICBpZighSVNMV09SRCh0KSYmKGlzc2ZyKHExKXx8KHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopKSYmKHAtPnouZmxhZ3MmKFJFR3xEUkVGT0JKfFZBUikpPT1WQVImJiFwLT5xMS5hbSYmKHAtPnoudi0+c3RvcmFnZV9jbGFzcz09U1RBVElDfHxwLT56LnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTikpeworCWVtaXQoZiwiXHRtb3Ylc1x0IiwodCZOUSk9PUNIQVI/ImIiOiIiKTsKKwllbWl0X29iaihmLCZwLT56LHQpO2VtaXQoZiwiLCIpOworCWVtaXRfb2JqKGYsJnAtPnExLHQpO2VtaXQoZiwiXG4iKTsKKwljYz0mcC0+ejtjY190PXQ7Y29udGludWU7CisgICAgICB9IAorICAgICAgLyogbW92IFtyeF0vcmVnLG1lbSAqLworICAgICAgaWYoIUlTTFdPUkQodCkmJihpc3Nmcih6KXx8KHAtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikpJiYocC0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKfFZBUikpPT1WQVImJiFwLT56LmFtJiYocC0+cTEudi0+c3RvcmFnZV9jbGFzcz09U1RBVElDfHxwLT5xMS52LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pKXsKKwllbWl0KGYsIlx0bW92JXNcdCIsKHQmTlEpPT1DSEFSPyJiIjoiIik7CisJZW1pdF9vYmooZiwmcC0+eix0KTtlbWl0KGYsIiwiKTsKKwllbWl0X29iaihmLCZwLT5xMSx0KTtlbWl0KGYsIlxuIik7CisJY2M9JnAtPno7Y2NfdD10O2NvbnRpbnVlOworICAgICAgfSAgICAgCisgICAgICAvKiBtb3YgcmVnLG9wICovCisgICAgICBpZihpc3Nmcih6KSYmKHAtPnExLmZsYWdzJktPTlNUKSl7CisJZW1pdChmLCJcdG1vdiVzXHQiLCh0Jk5RKT09Q0hBUj8iYiI6IiIpOworCWVtaXRfb2JqKGYsJnAtPnosdCk7ZW1pdChmLCIsIik7CisJZW1pdF9vYmooZiwmcC0+cTEsdCk7ZW1pdChmLCJcbiIpOworCWNjPSZwLT56O2NjX3Q9dDtjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYoaXNyZWcocTEpKXsKKwlyZWc9cC0+cTEucmVnOworICAgICAgfWVsc2UgaWYoaXNyZWcoeikpeworCXJlZz1wLT56LnJlZzsKKyAgICAgIH1lbHNleworCUJTRVQocmVnc19tb2RpZmllZCx0aSk7CisJaWYoSVNMV09SRCh0KSl7CisJICBCU0VUKHJlZ3NfbW9kaWZpZWQsdGkyKTsKKwkgIHRtcDE9dGk7dG1wMj10aTI7CisJICByZWc9TVRNUDE7CisJfWVsc2UKKwkgIHJlZz10aTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PVBVU0gpeworCW1vdmUoZiwmcC0+cTEsMCwwLHJlZyx0KTsKKwlpZihyZWdfcGFpcihyZWcsJnJwKSl7CisJICBlbWl0KGYsIlx0bW92XHRbLSVzXSwlc1xuIixyZWduYW1lc1tzcF0scmVnbmFtZXNbcnAucjJdKTsKKwkgIGVtaXQoZiwiXHRtb3ZcdFstJXNdLCVzXG4iLHJlZ25hbWVzW3NwXSxyZWduYW1lc1tycC5yMV0pOworCSAgY2M9MDsKKwl9ZWxzZXsKKwkgIGVtaXQoZiwiXHRtb3Ylc1x0Wy0lc10sJXNcbiIseF90W3QmTlFdLHJlZ25hbWVzW3NwXSxyZWduYW1lc1tyZWddKTsKKwkgIGNjPSZwLT5xMTtjY190PXQ7CisJfQorCXB1c2goem0ybChwLT56LnZhbC52bWF4KSwwKTsKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PUFTU0lHTil7CisJaWYoKHAtPnouZmxhZ3MmKFZBUnxSRUd8RFJFRk9CSikpPT1WQVImJklTU1RBVElDKHAtPnoudikmJmlzY29uc3QocTEpKXsKKwkgIC8qRklYTUU6IGxvbmcgdW5kIG9uZXMgKi8KKwkgIGV2YWxfY29uc3QoJnAtPnExLnZhbCx0KTsKKwkgIGlmKElTTlVMTCgpJiYhSVNMV09SRCh0KSl7CisJICAgIGVtaXQoZiwiXHRtb3Ylc1x0IiwodCZOUSk9PUNIQVI/ImIiOiIiKTtlbWl0X29iaihmLCZwLT56LHQpOworCSAgICBlbWl0KGYsIixaRVJPU1xuIik7CisJICAgIGNjPSZwLT56O2NjX3Q9dDtjb250aW51ZTsKKwkgIH0KKwl9CisJaWYoKHQmTlEpPT1DSEFSJiYhcmVnb2socmVnLENIQVIsMCkpeworCSAgcmVnPXRwOworCSAgQlNFVChyZWdzX21vZGlmaWVkLHRwKTsKKwl9CisJbW92ZShmLCZwLT5xMSwwLDAscmVnLHQpOworCXNhdmVfcmVzdWx0KGYscmVnLHAsdCk7CisJaWYoSVNMV09SRCh0KSl7CisJICBjYz0wOworCX1lbHNleworCSAgY2M9JnAtPno7Y2NfdD10OworCX0KKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGllcnJvcigwKTsKKyAgICB9CisgICAgaWYoYz09QUREUkVTUyl7CisgICAgICBpZihyZWdfcGFpcihyZWcsJnJwKSl7CisJZW1pdChmLCJcdG1vdlx0JXMsJXNcbiIscmVnbmFtZXNbcnAucjFdLHJlZ25hbWVzW3NwXSk7CisJZW1pdChmLCJcdG1vdlx0JXMsIzBcbiIscmVnbmFtZXNbcnAucjJdKTsKKwlpZih2b2ZmKCZwLT5xMSkpCisJICBlbWl0KGYsIlx0YWRkXHQlcywjJWxkXG4iLHJlZ25hbWVzW3JwLnIxXSx2b2ZmKCZwLT5xMSkmMHhmZmZmKTsKKyAgICAgIH1lbHNleworCWVtaXQoZiwiXHRtb3ZcdCVzLCVzXG4iLHJlZ25hbWVzW3JlZ10scmVnbmFtZXNbc3BdKTsKKwlpZih2b2ZmKCZwLT5xMSkpIGVtaXQoZiwiXHRhZGRcdCVzLCMlbGRcbiIscmVnbmFtZXNbcmVnXSx2b2ZmKCZwLT5xMSkpOworICAgICAgfQorICAgICAgc2F2ZV9yZXN1bHQoZixyZWcscCxwLT50eXBmMik7CisgICAgICBjYz0wOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYoYz09TU9EfHxjPT1ESVYpeworICAgICAgaWYoSVNMV09SRCh0KSkgaWVycm9yKDApOworICAgICAgLypGSVhNRTpzdWJvcHRpbWFsKi8KKyAgICAgIGVtaXQoZiwiXHRtb3ZcdE1ETCwlc1xuIixyZWduYW1lc1tyZWddKTsKKyAgICAgIG1vdmUoZiwmcC0+cTIsMCwwLHJlZyx0KTsKKyAgICAgIGVtaXQoZiwiXHRkaXYlc1x0JXNcbiIsKHQmVU5TSUdORUQpPyJ1IjoiIixyZWduYW1lc1tyZWddKTsKKyAgICAgIGlmKGM9PU1PRCkgCisJZW1pdChmLCJcdG1vdlx0JXMsTURIXG4iLHJlZ25hbWVzW3JlZ10pOworICAgICAgZWxzZQorCWVtaXQoZiwiXHRtb3ZcdCVzLE1ETFxuIixyZWduYW1lc1tyZWddKTsKKyAgICAgIHNhdmVfcmVzdWx0KGYscmVnLHAsdCk7CisgICAgICBjYz0mcC0+ejtjY190PXQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoKGM+PUxTSElGVCYmYzw9TU9EKXx8KGM+PU9SJiZjPD1BTkQpfHxjPT1DT01QQVJFfHxjPT1BRERJMlB8fGM9PVNVQklGUCl7CisgICAgICBjaGFyICpzOworICAgICAgLypGSVhNRTogbmljaHQgaW1tZXIgYmVzc2VyKi8KKy8qIHJmaTogYmV0dGVyIHBlcmZvcm1lZCBpbiBMU0hJRlQgY29kZSBnZW5lcmF0aW9uCisgICAgICBpZihJU0xXT1JEKHQpJiZjPT1MU0hJRlQmJmlzY29uc3QocTIpKXsKKwlldmFsX2NvbnN0KCZwLT5xMi52YWwsdCk7CisJaWYoem0ybCh2bWF4KT09MSYmIXAtPnExLmFtKXsKKwkgIHAtPmNvZGU9Yz1BREQ7CisJICBwLT5xMj1wLT5xMTsKKwl9CisgICAgICB9CisqLworICAgICAgaWYoSVNMV09SRCh0KSYmYz09TVVMVCkgaWVycm9yKDApOworICAgICAgaWYoSVNMV09SRCh0KSYmKGM9PUxTSElGVHx8Yz09UlNISUZUKSl7CisvKiByZmk6IHdlIG5vdyBoYW5kbGUgY29uc3RhbnQgdmFsdWUgZ3JlYXRlciB0aGFuIDE2IGluIGNvbnN0IHNoaWZ0IGdlbmVyYXRpb24KKwlpZihpc2NvbnN0KHEyKSkJCisJICBldmFsX2NvbnN0KCZwLT5xMi52YWwscTJ0eXAocCkpOworCWlmKCFpc2NvbnN0KHEyKXx8em1sZXEobDJ6bSgxNkwpLHZtYXgpKXsKKyovCisJaWYoIWlzY29uc3QocTIpKXsKKwkgIGludCBjbnQsbGFiMSxsYWIyOworCSAgaWYoaXNyZWcocTIpJiZzY3JhdGNocmVnKHAtPnEyLnJlZyxwKSl7CisJICAgIGNudD1wLT5xMi5yZWc7CisJICB9ZWxzZXsKKwkgICAgQlNFVChyZWdzX21vZGlmaWVkLHRwKTsKKwkgICAgY250PXRwOworCSAgICBpZihpc3JlZyhxMikmJnJlZ19wYWlyKHAtPnEyLnJlZywmcnApKQorCSAgICAgIG1vdmUoZiwwLHJwLnIxLDAsdHAsSU5UKTsKKwkgICAgZWxzZQorCSAgICAgIG1vdmUoZiwmcC0+cTIsMCwwLHRwLElOVCk7CisJICB9CisJICBpZihyZWdfcGFpcihjbnQsJnJwKSkKKwkgICAgY250PXJwLnIxOworCSAgLyptb3ZlKGYsJnAtPnExLDAsMCxyZWcsenR5cChwKSk7Ki8KKwkgIGxhYjE9KytsYWJlbDtsYWIyPSsrbGFiZWw7CisJICBpZighcmVnX3BhaXIocmVnLCZycCkpIGllcnJvcigwKTsKKwkgIGlmKGM9PUxTSElGVCl7CisJICAgIGVtaXQoZiwiXHRqbXByXHRjY191YywlcyVkXG4iLGxhYnByZWZpeCxsYWIyKTsKKwkgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiMSk7CisJICAgIGVtaXQoZiwiXHRhZGRcdCVzLCVzXG4iLHJlZ25hbWVzW3JwLnIxXSxyZWduYW1lc1tycC5yMV0pOworCSAgICBlbWl0KGYsIlx0YWRkY1x0JXMsJXNcbiIscmVnbmFtZXNbcnAucjJdLHJlZ25hbWVzW3JwLnIyXSk7CisJICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYjIpOworLyogcmZpOiBmaXggb2ZmIGJ5IG9uZSBhbmQgaGFuZGxlIG5lZ2F0aXZlIHNoaWZ0IHZhbHVlCisJCWVtaXQoZiwiXHRzdWJcdCVzLCMxXG4iLHJlZ25hbWVzW2NudF0pOworCSAgICBlbWl0KGYsIlx0am1wclx0Y2NfbmUsJXMlZFxuIixsYWJwcmVmaXgsbGFiMSk7CisqLworCSAgICBlbWl0KGYsIlx0Y21wZDFcdCVzLCMxXG4iLHJlZ25hbWVzW2NudF0pOworCSAgICBlbWl0KGYsIlx0am1wclx0Y2Nfc2dlLCVzJWRcbiIsbGFicHJlZml4LGxhYjEpOworCSAgfWVsc2V7CisJICAgIGVtaXQoZiwiXHRqbXByXHRjY191YywlcyVkXG4iLGxhYnByZWZpeCxsYWIyKTsKKwkgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiMSk7CisJCWVtaXQoZiwiXHRzaHJcdCVzLCMxXG4iLHJlZ25hbWVzW3JwLnIxXSk7CisJICAgIGVtaXQoZiwiXHRibW92XHQlcy4xNSwlcy4wXG4iLHJlZ25hbWVzW3JwLnIxXSxyZWduYW1lc1tycC5yMl0pOworLyogcmZpOiB1c2UgYXNociBmb3Igc2lnbmVkIHNoaWZ0CisJCWVtaXQoZiwiXHRzaHJcdCVzLCMxXG4iLHJlZ25hbWVzW3JwLnIyXSk7CisqLworCSAgICBlbWl0KGYsIlx0JXNzaHJcdCVzLCMxXG4iLCh0JlVOU0lHTkVEKT8iIjoiYSIscmVnbmFtZXNbcnAucjJdKTsKKwkgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiMik7CisvKiByZmk6IGZpeCBvZmYgYnkgb25lIGFuZCBoYW5kbGUgbmVnYXRpdmUgc2hpZnQgdmFsdWUKKwkJZW1pdChmLCJcdHN1Ylx0JXMsIzFcbiIscmVnbmFtZXNbY250XSk7CisJICAgIGVtaXQoZiwiXHRqbXByXHRjY19uZSwlcyVkXG4iLGxhYnByZWZpeCxsYWIxKTsKKyovCisJICAgIGVtaXQoZiwiXHRjbXBkMVx0JXMsIzFcbiIscmVnbmFtZXNbY250XSk7CisJICAgIGVtaXQoZiwiXHRqbXByXHRjY19zZ2UsJXMlZFxuIixsYWJwcmVmaXgsbGFiMSk7CisJICB9CisJICBzYXZlX3Jlc3VsdChmLHJlZyxwLHp0eXAocCkpOworCSAgY29udGludWU7CisJfQorICAgICAgfQorICAgICAgaWYoYz49T1ImJmM8PUFORCl7CisJcz1sb2dpY2Fsc1tjLU9SXTsKKyAgICAgIH1lbHNleworCWlmKGM9PUFEREkyUCkKKwkgIHM9YXJpdGhtZXRpY3NbQURELUxTSElGVF07CisJZWxzZSBpZihjPT1TVUJJRlApCisJICBzPWFyaXRobWV0aWNzW1NVQi1MU0hJRlRdOworCWVsc2UKKwkgIHM9YXJpdGhtZXRpY3NbYy1MU0hJRlRdOworICAgICAgfQorICAgICAgaWYoYz09UlNISUZUJiYhKHQmVU5TSUdORUQpKSBzPSJhc2hyIjsKKyAgICAgIGlmKGM9PUNPTVBBUkUpeworCWxhc3Rjb21wPXQ7CisJaWYoSVNMV09SRCh0KSkgcz0ic3ViIjsgZWxzZSBzPSJjbXAiOworICAgICAgfQorICAgICAgaWYoKGM9PU1VTFQmJiFpc3JlZyhxMikpKXsKKwlCU0VUKHJlZ3NfbW9kaWZpZWQsdHApOworCW1vdmUoZiwmcC0+cTIsMCwwLHRwLHQpOworCXAtPnEyLmZsYWdzPVJFRzsKKwlwLT5xMi5yZWc9dHA7CisgICAgICB9CisgICAgICBpZigoYz09TFNISUZUfHxjPT1SU0hJRlQpJiYhaXNjb25zdChxMikmJiFpc3JlZyhxMikpeworCUJTRVQocmVnc19tb2RpZmllZCx0cCk7CisJbW92ZShmLCZwLT5xMiwwLDAsdHAsdCk7CisJcC0+cTIuZmxhZ3M9UkVHOworCXAtPnEyLnJlZz10cDsKKyAgICAgIH0KKyAgICAgIGlmKGlzcmVnKHEyKSl7CisJaWYocmVnX3BhaXIocmVnLCZycCkpeworCSAgaWYoIXJlZ19wYWlyKHAtPnEyLnJlZywmcXApKSBxcC5yMT1wLT5xMi5yZWc7CisJICBlbWl0KGYsIlx0JXNcdCVzLCVzXG4iLHMscmVnbmFtZXNbcnAucjFdLHJlZ25hbWVzW3FwLnIxXSk7CisJICBzPWxvbmdjbWQocyk7CisJICBpZighc2hvcnRfYWRkKSBlbWl0KGYsIlx0JXNcdCVzLCVzXG4iLHMscmVnbmFtZXNbcnAucjJdLHJlZ25hbWVzW3FwLnIyXSk7CisJfWVsc2V7CisJICBlbWl0KGYsIlx0JXMlc1x0JXMsJXNcbiIscyx4X3RbdCZOUV0sKHQmTlEpPT1DSEFSP2JyZWduYW1lc1tyZWddOnJlZ25hbWVzW3JlZ10sKHQmTlEpPT1DSEFSP2JyZWduYW1lc1twLT5xMi5yZWddOnJlZ25hbWVzW3AtPnEyLnJlZ10pOworCX0JICAgIAorICAgICAgfWVsc2UgaWYocC0+cTIuYW0peworCWlmKHJlZ19wYWlyKHAtPnEyLmFtLT5iYXNlLCZycCkpeworCSAgaW50IHNlZz1ycC5TRUc7CisJICBpZighc2hvcnRfYWRkJiZyZWdfcGFpcihyZWcsJnJwKSkKKwkgICAgZW1pdChmLCJcdGV4dHNcdCVzLCMzXG4iLHJlZ25hbWVzW3NlZ10pOworCSAgZWxzZQorCSAgICBlbWl0KGYsIlx0ZXh0c1x0JXMsIzFcbiIscmVnbmFtZXNbc2VnXSk7CisJfQorCWlmKHJlZ19wYWlyKHJlZywmcnApKXsKKwkgIEJTRVQocmVnc19tb2RpZmllZCx0cCk7CisJICBlbWl0KGYsIlx0bW92XHQlcywiLHJlZ25hbWVzW3RwXSk7ZW1pdF9vYmooZiwmcC0+cTIsdCk7ZW1pdChmLCJcbiIpOworCSAgZW1pdChmLCJcdCVzXHQlcywlc1xuIixzLHJlZ25hbWVzW3JwLnIxXSxyZWduYW1lc1t0cF0pOworCSAgcz1sb25nY21kKHMpOworCSAgaWYoIXNob3J0X2FkZCl7CisJICAgIHAtPnEyLmFtLT5vZmZzZXQrPTI7CisJICAgIGVtaXQoZiwiXHRtb3ZcdCVzLCIscmVnbmFtZXNbdHBdKTtlbWl0X29iaihmLCZwLT5xMix0KTtlbWl0KGYsIlxuIik7CisJICAgIGVtaXQoZiwiXHQlc1x0JXMsJXNcbiIscyxyZWduYW1lc1tycC5yMl0scmVnbmFtZXNbdHBdKTsKKwkgICAgcC0+cTIuYW0tPm9mZnNldC09MjsKKwkgIH0KKwl9ZWxzZXsKKwkgIGlmKHAtPnEyLmFtLT5mbGFncz09UE9TVF9JTkMmJnAtPnEyLmFtLT5iYXNlPD00KXsKKwkgICAgZW1pdChmLCJcdCVzJXNcdCVzLCIscyx4X3RbdCZOUV0sKHQmTlEpPT1DSEFSP2JyZWduYW1lc1tyZWddOnJlZ25hbWVzW3JlZ10pOworCSAgICBlbWl0X29iaihmLCZwLT5xMix0KTtlbWl0KGYsIlxuIik7CisJICB9ZWxzZXsKKwkgICAgQlNFVChyZWdzX21vZGlmaWVkLHRwKTsKKwkgICAgZW1pdChmLCJcdG1vdiVzXHQlcywiLHhfdFt0Jk5RXSwodCZOUSk9PUNIQVI/YnJlZ25hbWVzW3RwXTpyZWduYW1lc1t0cF0pOworCSAgICBlbWl0X29iaihmLCZwLT5xMix0KTtlbWl0KGYsIlxuIik7CisJICAgIGVtaXQoZiwiXHQlcyVzXHQlcywlc1xuIixzLHhfdFt0Jk5RXSwodCZOUSk9PUNIQVI/YnJlZ25hbWVzW3JlZ106cmVnbmFtZXNbcmVnXSwodCZOUSk9PUNIQVI/YnJlZ25hbWVzW3RwXTpyZWduYW1lc1t0cF0pOworCSAgfQorCX0KKyAgICAgIH1lbHNlIGlmKChwLT5xMi5mbGFncyYoVkFSfFZBUkFEUnxSRUcpKT09VkFSJiZJU1NUQVRJQyhwLT5xMi52KSl7CisJaWYoSVNGQVIocC0+cTIudikpeworCSAgZW1pdChmLCJcdGV4dHNcdCNTRUcgIik7aXNzZWc9MTtlbWl0X29iaihmLCZwLT5xMix0KTsKKwkgIGVtaXQoZiwiLCMlZFxuIiwocmVnX3BhaXIocmVnLCZycCk/MjoxKSk7CisJfQorCWlmKHJlZ19wYWlyKHJlZywmcnApKXsKKwkgIGVtaXQoZiwiXHQlc1x0JXMsIixzLHJlZ25hbWVzW3JwLnIxXSk7CisJICBlbWl0X29iaihmLCZwLT5xMix0KTtlbWl0KGYsIlxuIik7CisJICBzPWxvbmdjbWQocyk7CisJICBpZighc2hvcnRfYWRkKXsKKwkgICAgZW1pdChmLCJcdCVzXHQlcywiLHMscmVnbmFtZXNbcnAucjJdKTsKKwkgICAgZW1pdF9vYmooZiwmcC0+cTIsdCk7ZW1pdChmLCIrMlxuIik7CisJICB9CisJfWVsc2V7CisJICBlbWl0KGYsIlx0JXMlc1x0JXMsIixzLHhfdFt0Jk5RXSwodCZOUSk9PUNIQVI/YnJlZ25hbWVzW3JlZ106cmVnbmFtZXNbcmVnXSk7CisJICBlbWl0X29iaihmLCZwLT5xMix0KTtlbWl0KGYsIlxuIik7CisJfQorICAgICAgfWVsc2UgaWYoaXNjb25zdChxMikpeworCWlmKElTRkxPQVQodCkpIGllcnJvcigwKTsKKwlpZihyZWdfcGFpcihyZWcsJnJwKSl7CisJICBsb25nIGw7CisvKiByZmk6IHNoaWZ0IGNvbnN0YW50IG11c3QgYmUgZXZhbHVhdGVkIGFjY29yZGluZyB0byBvd24gdHlwZQorCSAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHQpOworKi8KKwkgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxxMnR5cChwKSk7CisJICBpZihjPT1SU0hJRlQpeworCSAgICBsPXptMmwodm1heCk7CisvKiByZmk6IG5ldyBnZW5lcmF0aW9uIGZvciBjb25zdGFudCByaWdodCBzaGlmdCAqLworCQlpZiggbCA8IDApIHsKKwkJLyogVE9ETzogd2Ugc2hvdWxkIHJhaXNlIGEgd2FybmluZyAqLworCQkvKiBJbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQ6IG5lZ2F0aXZlIHNoaWZ0IGlzIHNhbWUgYXMgbnVsbCBzaGlmdCAqLworCQkvKiBhdm9pZCBzaGlmdCBnZW5lcmF0aW9uICovCisJCX0gZWxzZSBpZiggbCA+IDMxKSB7CisJCS8qIFRPRE86IHdlIHNob3VsZCByYWlzZSBhIHdhcm5pbmcgKi8KKwkJLyogSW1wbGVtZW50YXRpb24gZGVwZW5kZW50OiBzYW1lIGJlaGF2aW91ciBhcyBub24gY29uc3Qgc2hpZnQgKi8KKwkJCWlmKCB0ICYgVU5TSUdORUQpCisJCQkJZW1pdChmLCJcdG1vdlx0JXMsIzBcbiIscmVnbmFtZXNbcnAucjJdKTsKKwkJCWVsc2UKKwkgICAgCQllbWl0KGYsIlx0JXNcdCVzLCMxNVxuIixzLHJlZ25hbWVzW3JwLnIyXSk7CisKKwkJICAgCWVtaXQoZiwiXHRtb3ZcdCVzLCVzXG4iLHJlZ25hbWVzW3JwLnIxXSxyZWduYW1lc1tycC5yMl0pOworCQl9IGVsc2UgaWYoIGwgPiAxNSkgeworCSAgICAJZW1pdChmLCJcdG1vdlx0JXMsJXNcbiIscmVnbmFtZXNbcnAucjFdLHJlZ25hbWVzW3JwLnIyXSk7CisJCQlpZiggdCAmIFVOU0lHTkVEKQorCQkJCWVtaXQoZiwiXHRtb3ZcdCVzLCMwXG4iLHJlZ25hbWVzW3JwLnIyXSk7CisJCQllbHNlCisJICAgIAkJZW1pdChmLCJcdCVzXHQlcywjMTVcbiIscyxyZWduYW1lc1tycC5yMl0pOworCisJCQlsIC09IDE2IDsKKwkJCWlmKCBsID4gMCkKKwkgICAgCQllbWl0KGYsIlx0JXNcdCVzLCMlbGRcbiIscyxyZWduYW1lc1tycC5yMV0sbCk7CisJCX0gZWxzZSBpZiggbCA9PSAwKSB7CisJCS8qIGF2b2lkIHNoaWZ0IGdlbmVyYXRpb24gKi8KKwkJfSBlbHNlIGlmKCBsID09IDEpIHsKKwkJCWVtaXQoZiwiXHRzaHJcdCVzLCMxXG4iLHJlZ25hbWVzW3JwLnIxXSk7CisJICAgIAllbWl0KGYsIlx0Ym1vdlx0JXMuMTUsJXMuMFxuIixyZWduYW1lc1tycC5yMV0scmVnbmFtZXNbcnAucjJdKTsKKwkgICAgCWVtaXQoZiwiXHQlc1x0JXMsIzFcbiIscyxyZWduYW1lc1tycC5yMl0pOworCQl9IGVsc2UgeworLyogcmZpOiB3YXJuaW5nIHNob3VsZCBiZSByYWlzZWQgaW4gY29ycmVzcG9uZGluZyBjYXNlIChzZWUgVE9ETyBhYm92ZSkKKwkgICAgaWYobDwxfHxsPjE1KSBpZXJyb3IoMCk7CisqLworCSAgICBCU0VUKHJlZ3NfbW9kaWZpZWQsdHApOworCSAgICBlbWl0KGYsIlx0bW92XHQlcywlc1xuIixyZWduYW1lc1t0cF0scmVnbmFtZXNbcnAucjJdKTsKKwkgICAgZW1pdChmLCJcdHNoclx0JXMsIyVsZFxuIixyZWduYW1lc1tycC5yMV0sbCk7CisJICAgIGVtaXQoZiwiXHQlc1x0JXMsIyVsZFxuIixzLHJlZ25hbWVzW3JwLnIyXSxsKTsKKwkgICAgZW1pdChmLCJcdHNobFx0JXMsIyVsZFxuIixyZWduYW1lc1t0cF0sMTYtbCk7CisJICAgIGVtaXQoZiwiXHRvclx0JXMsJXNcbiIscmVnbmFtZXNbcnAucjFdLHJlZ25hbWVzW3RwXSk7CisJCX0KKwkgIH1lbHNlIGlmKGM9PUxTSElGVCl7CisJICAgIGw9em0ybCh2bWF4KTsKKy8qIHJmaTogbmV3IGdlbmVyYXRpb24gZm9yIGNvbnN0YW50IGxlZnQgc2hpZnQgKi8KKwkJaWYoIGwgPCAwKSB7CisJCS8qIFRPRE86IHdlIHNob3VsZCByYWlzZSBhIHdhcm5pbmcgKi8KKwkJLyogSW1wbGVtZW50YXRpb24gZGVwZW5kZW50OiBuZWdhdGl2ZSBzaGlmdCBpcyBzYW1lIGFzIG51bGwgc2hpZnQgKi8KKwkJLyogYXZvaWQgc2hpZnQgZ2VuZXJhdGlvbiAqLworCQl9IGVsc2UgaWYoIGwgPiAzMSkgeworCQkvKiBUT0RPOiB3ZSBzaG91bGQgcmFpc2UgYSB3YXJuaW5nICovCisJCS8qIEltcGxlbWVudGF0aW9uIGRlcGVuZGVudDogc2FtZSBiZWhhdmlvdXIgYXMgbm9uIGNvbnN0IHNoaWZ0ICovCisJCQllbWl0KGYsIlx0bW92XHQlcywjMFxuIixyZWduYW1lc1tycC5yMV0pOworCQkgICAJZW1pdChmLCJcdG1vdlx0JXMsJXNcbiIscmVnbmFtZXNbcnAucjJdLHJlZ25hbWVzW3JwLnIxXSk7CisJCX0gZWxzZSBpZiggbCA+IDE1KSB7CisJICAgCQllbWl0KGYsIlx0bW92XHQlcywlc1xuIixyZWduYW1lc1tycC5yMl0scmVnbmFtZXNbcnAucjFdKTsKKwkgICAJCWVtaXQoZiwiXHRtb3ZcdCVzLCMwXG4iLHJlZ25hbWVzW3JwLnIxXSk7CisJCQlsIC09IDE2IDsKKwkJCWlmKCBsID4gMCkKKwkgICAgICAJCWVtaXQoZiwiXHRzaGxcdCVzLCMlbGRcbiIscmVnbmFtZXNbcnAucjJdLGwpOworCQl9IGVsc2UgaWYoIGwgPT0gMCkgeworCQkvKiBhdm9pZCBzaGlmdCBnZW5lcmF0aW9uICovCisJCX0gZWxzZSBpZiggbCA9PSAxKSB7CisJICAgICAgZW1pdChmLCJcdGFkZFx0JXMsJXNcbiIscmVnbmFtZXNbcnAucjFdLHJlZ25hbWVzW3JwLnIxXSk7CisJICAgICAgZW1pdChmLCJcdGFkZGNcdCVzLCVzXG4iLHJlZ25hbWVzW3JwLnIyXSxyZWduYW1lc1tycC5yMl0pOworCQl9IGVsc2UKKy8qIHJmaTogd2FybmluZyBzaG91bGQgYmUgcmFpc2VkIGluIGNvcnJlc3BvbmRpbmcgY2FzZSAoc2VlIFRPRE8gYWJvdmUpCisJICAgIGlmKGw8MXx8bD4xNSkgaWVycm9yKDApOworKi8KKwkgICAgaWYobD09Mil7CisJICAgICAgZW1pdChmLCJcdGFkZFx0JXMsJXNcbiIscmVnbmFtZXNbcnAucjFdLHJlZ25hbWVzW3JwLnIxXSk7CisJICAgICAgZW1pdChmLCJcdGFkZGNcdCVzLCVzXG4iLHJlZ25hbWVzW3JwLnIyXSxyZWduYW1lc1tycC5yMl0pOworCSAgICAgIGVtaXQoZiwiXHRhZGRcdCVzLCVzXG4iLHJlZ25hbWVzW3JwLnIxXSxyZWduYW1lc1tycC5yMV0pOworCSAgICAgIGVtaXQoZiwiXHRhZGRjXHQlcywlc1xuIixyZWduYW1lc1tycC5yMl0scmVnbmFtZXNbcnAucjJdKTsKKwkgICAgfWVsc2V7CisJICAgICAgQlNFVChyZWdzX21vZGlmaWVkLHRwKTsKKwkgICAgICBlbWl0KGYsIlx0bW92XHQlcywlc1xuIixyZWduYW1lc1t0cF0scmVnbmFtZXNbcnAucjFdKTsKKwkgICAgICBlbWl0KGYsIlx0c2hsXHQlcywjJWxkXG4iLHJlZ25hbWVzW3JwLnIxXSxsKTsKKwkgICAgICBlbWl0KGYsIlx0c2hsXHQlcywjJWxkXG4iLHJlZ25hbWVzW3JwLnIyXSxsKTsKKwkgICAgICBlbWl0KGYsIlx0c2hyXHQlcywjJWxkXG4iLHJlZ25hbWVzW3RwXSwxNi1sKTsKKwkgICAgICBlbWl0KGYsIlx0b3JcdCVzLCVzXG4iLHJlZ25hbWVzW3JwLnIyXSxyZWduYW1lc1t0cF0pOworCSAgICB9CisJICB9ZWxzZXsKKwkgICAgbD16bTJsKHptYW5kKHZtYXgsbDJ6bSg2NTUzNUwpKSk7CisJICAgIGVtaXQoZiwiXHQlc1x0JXMsIyVsZFxuIixzLHJlZ25hbWVzW3JwLnIxXSxsKTsKKwkgICAgbD16bTJsKHptcnNoaWZ0KHZtYXgsbDJ6bSgxNkwpKSk7CisJICAgIHM9bG9uZ2NtZChzKTsKKwkgICAgaWYoIXNob3J0X2FkZCkgZW1pdChmLCJcdCVzXHQlcywjJWxkXG4iLHMscmVnbmFtZXNbcnAucjJdLGwpOworCSAgfQorCX1lbHNleworCSAgZW1pdChmLCJcdCVzJXNcdCVzLCIscyx4X3RbdCZOUV0sKHQmTlEpPT1DSEFSP2JyZWduYW1lc1tyZWddOnJlZ25hbWVzW3JlZ10pOworCSAgZW1pdF9vYmooZiwmcC0+cTIsdCk7ZW1pdChmLCJcbiIpOworCX0KKyAgICAgIH1lbHNlIGlmKHAtPnEyLmZsYWdzJlZBUkFEUil7CisJcC0+cTIuZmxhZ3MmPX5WQVJBRFI7CisJaWYocmVnX3BhaXIocmVnLCZycCkpeworCSAgZW1pdChmLCJcdCVzXHQlcywjU09GICIscyxyZWduYW1lc1tycC5yMV0pO2VtaXRfb2JqKGYsJnAtPnEyLHQpO2VtaXQoZiwiXG4iKTsKKwkgIHM9bG9uZ2NtZChzKTsKKwkgIGlmKCFzaG9ydF9hZGQpCisJICAgIGVtaXQoZiwiXHQlc1x0JXMsI1NFRyAiLHMscmVnbmFtZXNbcnAucjJdKTtpc3NlZz0xO2VtaXRfb2JqKGYsJnAtPnEyLHQpO2VtaXQoZiwiXG4iKTsKKwl9ZWxzZXsKKwkgIGVtaXQoZiwiXHQlc1x0JXMsIyIscyxyZWduYW1lc1tyZWddKTtlbWl0X29iaihmLCZwLT5xMix0KTtlbWl0KGYsIlxuIik7CisJfQorCXAtPnEyLmZsYWdzfD1WQVJBRFI7CisgICAgICB9ZWxzZSBpZihwLT5xMi5mbGFncyZEUkVGT0JKKXsKKwlpbnQgc2VnPTAsc29mPTA7CisgICAgICAgIC8qCWlmKCEocC0+cTIuZmxhZ3MmUkVHKSkgaWVycm9yKDApOyovCisJaWYocmVnX3BhaXIocC0+cTIucmVnLCZycCkpeworCSAgc2VnPXJwLlNFRztzb2Y9cnAuU09GOworCSAgaWYoIXNob3J0X2FkZCYmcmVnX3BhaXIocmVnLCZycCkpeworCSAgICBlbWl0KGYsIlx0ZXh0c1x0JXMsIzJcbiIscmVnbmFtZXNbc2VnXSk7CisJICB9ZWxzZQorCSAgICBlbWl0KGYsIlx0ZXh0c1x0JXMsIzFcbiIscmVnbmFtZXNbc2VnXSk7CisJfQorCWlmKHJlZ19wYWlyKHJlZywmcnApKXsKKwkgIGlmKHNjcmF0Y2hyZWcocC0+cTIucmVnLHApKXsKKwkgICAgZW1pdChmLCJcdCVzXHQlcyxbJXMrXVxuIixzLHJlZ25hbWVzW3JwLnIxXSxyZWduYW1lc1tzb2Y/c29mOnAtPnEyLnJlZ10pOworCSAgICBzPWxvbmdjbWQocyk7CisJICAgIGlmKCFzaG9ydF9hZGQpIGVtaXQoZiwiXHQlc1x0JXMsWyVzXVxuIixzLHJlZ25hbWVzW3JwLnIyXSxyZWduYW1lc1tzb2Y/c29mOnAtPnEyLnJlZ10pOworCSAgfWVsc2V7CisJICAgIGVtaXQoZiwiXHQlc1x0JXMsWyVzXVxuIixzLHJlZ25hbWVzW3JwLnIxXSxyZWduYW1lc1tzb2Y/c29mOnAtPnEyLnJlZ10pOworCSAgICBzPWxvbmdjbWQocyk7CisJICAgIGlmKCFzaG9ydF9hZGQpeworCSAgICAgIEJTRVQocmVnc19tb2RpZmllZCx0cCk7CisJICAgICAgZW1pdChmLCJcdG1vdlx0JXMsWyVzKyMyXVxuIixyZWduYW1lc1t0cF0scmVnbmFtZXNbc29mP3NvZjpwLT5xMi5yZWddKTsKKwkgICAgICBlbWl0KGYsIlx0JXNcdCVzLCVzXG4iLHMscmVnbmFtZXNbcnAucjJdLHJlZ25hbWVzW3RwXSk7CisJICAgIH0KKwkgIH0KKwl9ZWxzZXsKKwkgIGVtaXQoZiwiXHQlcyVzXHQlcywiLHMseF90W3QmTlFdLCh0Jk5RKT09Q0hBUj9icmVnbmFtZXNbcmVnXTpyZWduYW1lc1tyZWddKTsKKwkgIGVtaXRfb2JqKGYsJnAtPnEyLHQpO2VtaXQoZiwiXG4iKTsKKwl9CisgICAgICB9ZWxzZSBpZigocC0+cTIuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmKHAtPnEyLnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHAtPnEyLnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKSl7CisJbG9uZyBsPXZvZmYoJnAtPnEyKTsKKwlpZihyZWdfcGFpcihyZWcsJnJwKSl7CisJICBpZihsKXsKKwkgICAgQlNFVChyZWdzX21vZGlmaWVkLHRwKTsKKwkgICAgZW1pdChmLCJcdG1vdlx0JXMsWyVzKyMlbGRdXG4iLHJlZ25hbWVzW3RwXSxyZWduYW1lc1tzcF0sbCk7CisJICAgIGVtaXQoZiwiXHQlc1x0JXMsJXNcbiIscyxyZWduYW1lc1tycC5yMV0scmVnbmFtZXNbdHBdKTsKKwkgIH1lbHNlCisJICAgIGVtaXQoZiwiXHQlc1x0JXMsWyVzXVxuIixzLHJlZ25hbWVzW3JwLnIxXSxyZWduYW1lc1tzcF0pOworCSAgcz1sb25nY21kKHMpOworCSAgaWYoIXNob3J0X2FkZCl7CisJICAgIEJTRVQocmVnc19tb2RpZmllZCx0cCk7CisJICAgIGVtaXQoZiwiXHRtb3ZcdCVzLFslcysjJWxkXVxuIixyZWduYW1lc1t0cF0scmVnbmFtZXNbc3BdLGwrMik7CisJICAgIGVtaXQoZiwiXHQlc1x0JXMsJXNcbiIscyxyZWduYW1lc1tycC5yMl0scmVnbmFtZXNbdHBdKTsKKwkgIH0KKwl9ZWxzZXsKKwkgIGlmKGwpeworCSAgICBCU0VUKHJlZ3NfbW9kaWZpZWQsdHApOworCSAgICBlbWl0KGYsIlx0bW92JXNcdCVzLFslcysjJWxkXVxuIix4X3RbdCZOUV0sKHQmTlEpPT1DSEFSP2JyZWduYW1lc1t0cF06cmVnbmFtZXNbdHBdLHJlZ25hbWVzW3NwXSxsKTsKKwkgICAgZW1pdChmLCJcdCVzJXNcdCVzLCVzXG4iLHMseF90W3QmTlFdLCh0Jk5RKT09Q0hBUj9icmVnbmFtZXNbcmVnXTpyZWduYW1lc1tyZWddLCh0Jk5RKT09Q0hBUj9icmVnbmFtZXNbdHBdOnJlZ25hbWVzW3RwXSk7CisJICB9ZWxzZQorCSAgICBlbWl0KGYsIlx0JXMlc1x0JXMsWyVzXVxuIixzLHhfdFt0Jk5RXSwodCZOUSk9PUNIQVI/YnJlZ25hbWVzW3JlZ106cmVnbmFtZXNbcmVnXSxyZWduYW1lc1tzcF0pOworCX0KKyAgICAgIH1lbHNlCisJaWVycm9yKDApOworICAgICAgaWYoYz09TVVMVCkgZW1pdChmLCJcdG1vdlx0JXMsTURMXG4iLHJlZ25hbWVzW3JlZ10pOworICAgICAgLypGSVhNRTpzaWduZWQqLworICAgICAgaWYoc2hvcnRfYWRkPT0xKSBlbWl0KGYsIlx0JXNcdCVzLCMwXG4iLHMscmVnbmFtZXNbcnAucjJdKTsKKyAgICAgIGlmKGMhPUNPTVBBUkUpIHNhdmVfcmVzdWx0KGYscmVnLHAsdCk7CisgICAgICBpZighSVNMV09SRCh0KXx8KChjPT1BRER8fGM9PVNVQnx8Yz09QURESTJQfHxjPT1TVUJJRlApJiYhc2hvcnRfYWRkKSl7CisJY2M9JnAtPno7Y2NfdD10OworICAgICAgfWVsc2UKKwljYz0wOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGllcnJvcigwKTsKKyAgfQorICBpZihub3Rwb3BwZWQpeworICAgIGVtaXQoZiwiXHRhZGRcdCVzLCMlbGRcbiIscmVnbmFtZXNbc3BdLG5vdHBvcHBlZCk7CisgICAgcG9wKG5vdHBvcHBlZCwwKTtub3Rwb3BwZWQ9MDsKKyAgfQorICBmdW5jdGlvbl9ib3R0b20oZix2LGxvZmYpOworfQorCitpbnQgc2hvcnRjdXQoaW50IGMsaW50IHQpCit7CisgIGlmKGM9PUNPTVBBUkV8fGM9PUFORHx8Yz09T1J8fGM9PVhPUikgcmV0dXJuIDE7CisgIGlmKCh0Jk5RKSE9QklUJiYoYz09QUREfHxjPT1TVUIpKSByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9jZyhGSUxFICpmKQoreworICBzdHJ1Y3QgZnBjb25zdGxpc3QgKnA7CisgIHVuc2lnbmVkIGNoYXIgKmlwOworICBpZihmJiZzdGFja19jaGVjayl7CisgICAgZW1pdChmLCJcdCVzXHQlc19fc3RhY2tfY2hlY2tcbiIscHVibGljLGlkcHJlZml4KTsKKyAgfQorICB3aGlsZShwPWZpcnN0ZnBjKXsKKyAgICBpZihmKXsKKyAgICAgIG5ld19zZWN0aW9uKGYsTkRBVEEpOworICAgICAgZW1pdChmLGV2ZW4pOworICAgICAgZW1pdChmLCIlcyVkOlxuXHQlc1x0IixsYWJwcmVmaXgscC0+bGFiZWwsVEFTS0lORz9kY3RbU0hPUlRdOnZkY3RbU0hPUlRdKTsKKyAgICAgIGlwPSh1bnNpZ25lZCBjaGFyICopJnAtPnZhbC52ZG91YmxlOworICAgICAgZW1pdChmLCIweCUwMnglMDJ4JTAyeCUwMngiLGlwWzNdLGlwWzJdLGlwWzFdLGlwWzBdKTsKKyAgICAgIGlmKChwLT50eXAmTlEpPT1ET1VCTEV8fChwLT50eXAmTlEpPT1MRE9VQkxFKXsKKwllbWl0KGYsIiwweCUwMnglMDJ4JTAyeCUwMngiLGlwWzddLGlwWzZdLGlwWzVdLGlwWzRdKTsKKyAgICAgIH0KKyAgICAgIGVtaXQoZiwiXG4iKTsKKyAgICB9CisgICAgZmlyc3RmcGM9cC0+bmV4dDsKKyAgICBmcmVlKHApOworICB9CisgIGlmKGYmJlRBU0tJTkcpIGVtaXQoZiwiJXNcdFJFR0RFRiBSMC1SMTVcblx0ZW5kXG4iLHNlY19lbmQpOworfQorCitpbnQgcmVnX3Bhcm0oc3RydWN0IHJlZ19oYW5kbGUgKnAsc3RydWN0IFR5cCAqdCxpbnQgbW9kZSxzdHJ1Y3QgVHlwICpma3QpCit7CisgIGludCBmPXQtPmZsYWdzJk5ROworICBpZighSVNTQ0FMQVIoZikpIHJldHVybiAwOworICBpZihwLT5ncHI+M3x8bW9kZSkgcmV0dXJuIDA7CisgIGlmKGY9PUxMT05HfHxmPT1ET1VCTEV8fGY9PUxET1VCTEUpCisgICAgcmV0dXJuIDA7CisgIGVsc2UgaWYoZj09TE9OR3x8Zj09RlBPSU5URVJ8fGY9PUhQT0lOVEVSKXsKKyAgICBpZihwLT5ncHI9PTApIHtwLT5ncHI9MjtyZXR1cm4gMjM7fQorICAgIGlmKHAtPmdwcj09MSkge3AtPmdwcj0zO3JldHVybiAyMjt9CisgICAgaWYocC0+Z3ByPT0yKSB7cC0+Z3ByPTQ7cmV0dXJuIDIxO30KKyAgICByZXR1cm4gMDsKKyAgfWVsc2UKKyAgICByZXR1cm4gMTMrcC0+Z3ByKys7Cit9CisKK3ZvaWQgaW5zZXJ0X2NvbnN0KHVuaW9uIGF0eXBzICpwLGludCB0KQorLyogIFRyYWVndCBLb25zdGFudGUgaW4gZW50cHJlY2hlbmRlcyBGZWxkIGVpbi4gICAgICAgKi8KK3sKKyAgaWYoIXApIGllcnJvcigwKTsKKy8qICAqcCA9ICh1bmlvbiBhdHlwcykgMCA7IC8qIHJmaTogY2xlYXIgdW51c2VkIGJpdHMgKi8KKyAgdCY9TlU7CisgIGlmKHQ9PUJJVCkge2lmKHptZXF0byh6YzJ6bSh2Y2hhciksbDJ6bSgwTCkpKSBwLT52Y2hhcj16bTJ6YyhsMnptKDBMKSk7IGVsc2UgcC0+dmNoYXI9em0yemMobDJ6bSgxTCkpO3JldHVybjt9CisgIGlmKHQ9PUNIQVIpIHtwLT52Y2hhcj12Y2hhcjtyZXR1cm47fQorICBpZih0PT1TSE9SVCkge3AtPnZzaG9ydD12c2hvcnQ7cmV0dXJuO30KKyAgaWYodD09SU5UKSB7cC0+dmludD12aW50O3JldHVybjt9CisgIGlmKHQ9PUxPTkcpIHtwLT52bG9uZz12bG9uZztyZXR1cm47fQorICBpZih0PT1MTE9ORykge3AtPnZsbG9uZz12bGxvbmc7cmV0dXJuO30KKyAgaWYodD09TUFYSU5UKSB7cC0+dm1heD12bWF4O3JldHVybjt9CisgIGlmKHQ9PShVTlNJR05FRHxCSVQpKSB7aWYoenVtZXF0byh6dWMyenVtKHZ1Y2hhciksdWwyenVtKDBVTCkpKSBwLT52dWNoYXI9enVtMnp1Yyh1bDJ6dW0oMFVMKSk7IGVsc2UgcC0+dnVjaGFyPXp1bTJ6dWModWwyenVtKDFVTCkpO3JldHVybjt9ICAKKyAgaWYodD09KFVOU0lHTkVEfENIQVIpKSB7cC0+dnVjaGFyPXZ1Y2hhcjtyZXR1cm47fQorICBpZih0PT0oVU5TSUdORUR8U0hPUlQpKSB7cC0+dnVzaG9ydD12dXNob3J0O3JldHVybjt9CisgIGlmKHQ9PShVTlNJR05FRHxJTlQpKSB7cC0+dnVpbnQ9dnVpbnQ7cmV0dXJuO30KKyAgaWYodD09KFVOU0lHTkVEfExPTkcpKSB7cC0+dnVsb25nPXZ1bG9uZztyZXR1cm47fQorICBpZih0PT0oVU5TSUdORUR8TExPTkcpKSB7cC0+dnVsbG9uZz12dWxsb25nO3JldHVybjt9CisgIGlmKHQ9PShVTlNJR05FRHxNQVhJTlQpKSB7cC0+dnVtYXg9dnVtYXg7cmV0dXJuO30KKyAgaWYodD09RkxPQVQpIHtwLT52ZmxvYXQ9dmZsb2F0O3JldHVybjt9CisgIGlmKHQ9PURPVUJMRSkge3AtPnZkb3VibGU9dmRvdWJsZTtyZXR1cm47fQorICBpZih0PT1MRE9VQkxFKSB7cC0+dmxkb3VibGU9dmxkb3VibGU7cmV0dXJuO30KKyAgaWYodD09TlBPSU5URVIpIHtwLT52dWludD12dWludDtyZXR1cm47fQorICBpZih0PT1GUE9JTlRFUnx8dD09SFBPSU5URVIpIHtwLT52dWxvbmc9dnVsb25nO3JldHVybjt9Cit9Cit2b2lkIGV2YWxfY29uc3QodW5pb24gYXR5cHMgKnAsaW50IHQpCisvKiAgV2Vpc3QgYmVzdGltbXRlbiBnbG9iYWxlbiBWYXJpYWJsZW4gV2VydCBlaW5lciBDRVhQUiB6dS4gICAgICAgKi8KK3sKKyAgaW50IGY9dCZOUTsKKyAgaWYoIXApIGllcnJvcigwKTsKKyAgaWYoZj09TUFYSU5UfHwoZj49QklUJiZmPD1MTE9ORykpeworICAgIGlmKCEodCZVTlNJR05FRCkpeworICAgICAgaWYoZj09QklUKXsKKwlpZih6bWVxdG8oemMyem0ocC0+dmNoYXIpLGwyem0oMEwpKSkgdm1heD1sMnptKDBMKTsgZWxzZSB2bWF4PWwyem0oMUwpOworICAgICAgfWVsc2UgaWYoZj09Q0hBUikgdm1heD16YzJ6bShwLT52Y2hhcik7CisgICAgICBlbHNlIGlmKGY9PVNIT1JUKXZtYXg9enMyem0ocC0+dnNob3J0KTsKKyAgICAgIGVsc2UgaWYoZj09SU5UKSAgdm1heD16aTJ6bShwLT52aW50KTsKKyAgICAgIGVsc2UgaWYoZj09TE9ORykgdm1heD16bDJ6bShwLT52bG9uZyk7CisgICAgICBlbHNlIGlmKGY9PUxMT05HKSB2bWF4PXpsbDJ6bShwLT52bGxvbmcpOworICAgICAgZWxzZSBpZihmPT1NQVhJTlQpIHZtYXg9cC0+dm1heDsKKyAgICAgIGVsc2UgaWVycm9yKDApOworICAgICAgdnVtYXg9em0yenVtKHZtYXgpOworICAgICAgdmxkb3VibGU9em0yemxkKHZtYXgpOworICAgIH1lbHNleworICAgICAgaWYoZj09QklUKXsKKwlpZih6dW1lcXRvKHp1YzJ6dW0ocC0+dnVjaGFyKSx1bDJ6dW0oMFVMKSkpIHZ1bWF4PXVsMnp1bSgwVUwpOyBlbHNlIHZ1bWF4PXVsMnp1bSgxVUwpOworICAgICAgfWVsc2UgaWYoZj09Q0hBUikgdnVtYXg9enVjMnp1bShwLT52dWNoYXIpOworICAgICAgZWxzZSBpZihmPT1TSE9SVCl2dW1heD16dXMyenVtKHAtPnZ1c2hvcnQpOworICAgICAgZWxzZSBpZihmPT1JTlQpICB2dW1heD16dWkyenVtKHAtPnZ1aW50KTsKKyAgICAgIGVsc2UgaWYoZj09TE9ORykgdnVtYXg9enVsMnp1bShwLT52dWxvbmcpOworICAgICAgZWxzZSBpZihmPT1MTE9ORykgdnVtYXg9enVsbDJ6dW0ocC0+dnVsbG9uZyk7CisgICAgICBlbHNlIGlmKGY9PU1BWElOVCkgdnVtYXg9cC0+dnVtYXg7CisgICAgICBlbHNlIGllcnJvcigwKTsKKyAgICAgIHZtYXg9enVtMnptKHZ1bWF4KTsKKyAgICAgIHZsZG91YmxlPXp1bTJ6bGQodnVtYXgpOworICAgIH0KKyAgfWVsc2V7CisgICAgaWYoSVNQT0lOVEVSKGYpKXsKKyAgICAgIGlmKGY9PU5QT0lOVEVSKQorCXZ1bWF4PXp1aTJ6dW0ocC0+dnVpbnQpOworICAgICAgZWxzZQorCXZ1bWF4PXp1bDJ6dW0ocC0+dnVsb25nKTsKKyAgICAgIHZtYXg9enVtMnptKHZ1bWF4KTt2bGRvdWJsZT16dW0yemxkKHZ1bWF4KTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKGY9PUZMT0FUKSB2bGRvdWJsZT16ZjJ6bGQocC0+dmZsb2F0KTsKKyAgICAgIGVsc2UgaWYoZj09RE9VQkxFKSB2bGRvdWJsZT16ZDJ6bGQocC0+dmRvdWJsZSk7CisgICAgICBlbHNlIHZsZG91YmxlPXAtPnZsZG91YmxlOworICAgICAgdm1heD16bGQyem0odmxkb3VibGUpOworICAgICAgdnVtYXg9emxkMnp1bSh2bGRvdWJsZSk7CisgICAgfQorICB9CisgIHZmbG9hdD16bGQyemYodmxkb3VibGUpOworICB2ZG91YmxlPXpsZDJ6ZCh2bGRvdWJsZSk7CisgIHZ1Y2hhcj16dW0yenVjKHZ1bWF4KTsKKyAgdnVzaG9ydD16dW0yenVzKHZ1bWF4KTsKKyAgdnVpbnQ9enVtMnp1aSh2dW1heCk7CisgIHZ1bG9uZz16dW0yenVsKHZ1bWF4KTsKKyAgdnVsbG9uZz16dW0yenVsbCh2dW1heCk7CisgIHZjaGFyPXptMnpjKHZtYXgpOworICB2c2hvcnQ9em0yenModm1heCk7CisgIHZpbnQ9em0yemkodm1heCk7CisgIHZsb25nPXptMnpsKHZtYXgpOworICB2bGxvbmc9em0yemxsKHZtYXgpOworfQordm9pZCBwcmludHZhbChGSUxFICpmLHVuaW9uIGF0eXBzICpwLGludCB0KQorLyogIEdpYnQgYXR5cHMgYXVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICB0Jj1OVTsKKyAgaWYodD09QklUKXtmcHJpbnRmKGYsIkIiKTt2bWF4PXpjMnptKHAtPnZjaGFyKTtmcHJpbnRmKGYsIiVkIiwhem1lcXRvKHZtYXgsbDJ6bSgwTCkpKTt9CisgIGlmKHQ9PShVTlNJR05FRHxCSVQpKXtmcHJpbnRmKGYsIlVCIik7dnVtYXg9enVjMnp1bShwLT52dWNoYXIpO2ZwcmludGYoZiwiJWQiLCF6dW1lcXRvKHZtYXgsdWwyenVtKDBVTCkpKTt9CisgIGlmKHQ9PUNIQVIpe2ZwcmludGYoZiwiQyIpO3ZtYXg9emMyem0ocC0+dmNoYXIpO3ByaW50em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxDSEFSKSl7ZnByaW50ZihmLCJVQyIpO3Z1bWF4PXp1YzJ6dW0ocC0+dnVjaGFyKTtwcmludHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PVNIT1JUKXtmcHJpbnRmKGYsIlMiKTt2bWF4PXpzMnptKHAtPnZzaG9ydCk7cHJpbnR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfFNIT1JUKSl7ZnByaW50ZihmLCJVUyIpO3Z1bWF4PXp1czJ6dW0ocC0+dnVzaG9ydCk7cHJpbnR6dW0oZix2dW1heCk7fQorICBpZih0PT1GTE9BVCl7ZnByaW50ZihmLCJGIik7dmxkb3VibGU9emYyemxkKHAtPnZmbG9hdCk7cHJpbnR6bGQoZix2bGRvdWJsZSk7fQorICBpZih0PT1ET1VCTEUpe2ZwcmludGYoZiwiRCIpO3ZsZG91YmxlPXpkMnpsZChwLT52ZG91YmxlKTtwcmludHpsZChmLHZsZG91YmxlKTt9CisgIGlmKHQ9PUxET1VCTEUpe2ZwcmludGYoZiwiTEQiKTtwcmludHpsZChmLHAtPnZsZG91YmxlKTt9CisgIGlmKHQ9PUlOVCl7ZnByaW50ZihmLCJJIik7dm1heD16aTJ6bShwLT52aW50KTtwcmludHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8SU5UKXx8dD09TlBPSU5URVIpe2ZwcmludGYoZiwiVUkiKTt2dW1heD16dWkyenVtKHAtPnZ1aW50KTtwcmludHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUxPTkcpe2ZwcmludGYoZiwiTCIpO3ZtYXg9emwyem0ocC0+dmxvbmcpO3ByaW50em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxMT05HKXx8dD09RlBPSU5URVJ8fHQ9PUhQT0lOVEVSKXtmcHJpbnRmKGYsIlVMIik7dnVtYXg9enVsMnp1bShwLT52dWxvbmcpO3ByaW50enVtKGYsdnVtYXgpO30KKyAgaWYodD09TExPTkcpe2ZwcmludGYoZiwiTEwiKTt2bWF4PXpsbDJ6bShwLT52bGxvbmcpO3ByaW50em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxMTE9ORykpe2ZwcmludGYoZiwiVUxMIik7dnVtYXg9enVsbDJ6dW0ocC0+dnVsbG9uZyk7cHJpbnR6dW0oZix2dW1heCk7fQorICBpZih0PT1NQVhJTlQpIHByaW50em0oZixwLT52bWF4KTsKKyAgaWYodD09KFVOU0lHTkVEfE1BWElOVCkpIHByaW50enVtKGYscC0+dnVtYXgpOworfQordm9pZCBlbWl0dmFsKEZJTEUgKmYsdW5pb24gYXR5cHMgKnAsaW50IHQpCisvKiAgR2lidCBhdHlwcyBhdXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIHQmPU5VOworICBpZih0PT1CSVQpe3ZtYXg9emMyem0ocC0+dmNoYXIpO2VtaXQoZiwiJWQiLCF6bWVxdG8odm1heCxsMnptKDBMKSkpO30KKyAgaWYodD09KFVOU0lHTkVEfEJJVCkpe3Z1bWF4PXp1YzJ6dW0ocC0+dnVjaGFyKTtlbWl0KGYsIiVkIiwhenVtZXF0byh2dW1heCx1bDJ6dW0oMFVMKSkpO30KKyAgaWYodD09Q0hBUil7dm1heD16YzJ6bShwLT52Y2hhcik7ZW1pdHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8Q0hBUikpe3Z1bWF4PXp1YzJ6dW0ocC0+dnVjaGFyKTtlbWl0enVtKGYsdnVtYXgpO30KKyAgaWYodD09U0hPUlQpe3ZtYXg9enMyem0ocC0+dnNob3J0KTtlbWl0em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxTSE9SVCkpe3Z1bWF4PXp1czJ6dW0ocC0+dnVzaG9ydCk7ZW1pdHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUZMT0FUKXt2bGRvdWJsZT16ZjJ6bGQocC0+dmZsb2F0KTtlbWl0emxkKGYsdmxkb3VibGUpO30KKyAgaWYodD09RE9VQkxFKXt2bGRvdWJsZT16ZDJ6bGQocC0+dmRvdWJsZSk7ZW1pdHpsZChmLHZsZG91YmxlKTt9CisgIGlmKHQ9PUxET1VCTEUpe2VtaXR6bGQoZixwLT52bGRvdWJsZSk7fQorICBpZih0PT1JTlQpe3ZtYXg9emkyem0ocC0+dmludCk7ZW1pdHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8SU5UKXx8dD09TlBPSU5URVIpe3Z1bWF4PXp1aTJ6dW0ocC0+dnVpbnQpO2VtaXR6dW0oZix2dW1heCk7fQorICBpZih0PT1MT05HKXt2bWF4PXpsMnptKHAtPnZsb25nKTtlbWl0em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxMT05HKXx8dD09RlBPSU5URVJ8fHQ9PUhQT0lOVEVSKXt2dW1heD16dWwyenVtKHAtPnZ1bG9uZyk7ZW1pdHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUxMT05HKXt2bWF4PXpsbDJ6bShwLT52bGxvbmcpO2VtaXR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfExMT05HKSl7dnVtYXg9enVsbDJ6dW0ocC0+dnVsbG9uZyk7ZW1pdHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PU1BWElOVCkgZW1pdHptKGYscC0+dm1heCk7CisgIGlmKHQ9PShVTlNJR05FRHxNQVhJTlQpKSBlbWl0enVtKGYscC0+dnVtYXgpOworfQordm9pZCBjb252X3R5cChzdHJ1Y3QgVHlwICpwKQorLyogRXJ6ZXVndCBleHRlbmRlZCB0eXBlcyBpbiBlaW5lbSBUeXAuICovCit7CisgIGNoYXIgKmF0dHI7CisgIHdoaWxlKHApeworICAgIGlmKElTUE9JTlRFUihwLT5mbGFncykpeworICAgICAgcC0+ZmxhZ3M9KChwLT5mbGFncyZ+TlUpfFBPSU5URVJfVFlQRShwLT5uZXh0KSk7CisgICAgICBpZihhdHRyPXAtPm5leHQtPmF0dHIpeworCWlmKHN0cnN0cihhdHRyLFNUUl9ORUFSKSkKKwkgIHAtPmZsYWdzPSgocC0+ZmxhZ3Mmfk5VKXxOUE9JTlRFUik7CisJaWYoc3Ryc3RyKGF0dHIsU1RSX0ZBUikpCisJICBwLT5mbGFncz0oKHAtPmZsYWdzJn5OVSl8RlBPSU5URVIpOworCWlmKHN0cnN0cihhdHRyLFNUUl9IVUdFKSkKKwkgIHAtPmZsYWdzPSgocC0+ZmxhZ3Mmfk5VKXxIUE9JTlRFUik7CisgICAgICB9CisgICAgfQorICAgIGlmKElTSU5UKHAtPmZsYWdzKSYmKGF0dHI9cC0+YXR0cikmJnN0cnN0cihhdHRyLCJiaXQiKSkKKyAgICAgIHAtPmZsYWdzPSgocC0+ZmxhZ3Mmfk5VKXxCSVQpOworICAgIHA9cC0+bmV4dDsKKyAgfQorfQorCit2b2lkIGluaXRfZGIoRklMRSAqZikKK3sKK30KKwordm9pZCBjbGVhbnVwX2RiKEZJTEUgKmYpCit7Cit9CisKK2NoYXIgKnVzZV9saWJjYWxsKGludCBjLGludCB0LGludCB0MikKK3sKKyAgc3RhdGljIGNoYXIgZm5hbWVbMTZdOworICBjaGFyICpyZXQ9MCwqdHQ7CisKKyAgaWYoYz09Q09NUEFSRSl7CisgICAgaWYoKHQmTlEpPT1MTE9OR3x8SVNGTE9BVCh0KSl7CisgICAgICBzcHJpbnRmKGZuYW1lLCJfX2NtcCVzJXMlbGQiLCh0JlVOU0lHTkVEKT8idSI6InMiLElTRkxPQVQodCk/ImZsdCI6ImludCIsem0ybChzaXpldGFiW3QmTlFdKSo4KTsKKyAgICAgIHJldD1mbmFtZTsKKyAgICB9CisgIH1lbHNleworICAgIHQmPU5VOworICAgIHQyJj1OVTsKKyAgICBpZih0PT1MRE9VQkxFKSB0PURPVUJMRTsKKyAgICBpZih0Mj09TERPVUJMRSkgdDI9RE9VQkxFOworICAgIGlmKGM9PUNPTlZFUlQpeworICAgICAgaWYodD09dDIpIHJldHVybiAwOworICAgICAgaWYodD09RkxPQVQmJnQyPT1ET1VCTEUpIHJldHVybiAiX19mbHQ2NHRvZmx0MzIiOworICAgICAgaWYodD09RE9VQkxFJiZ0Mj09RkxPQVQpIHJldHVybiAiX19mbHQzMnRvZmx0NjQiOworCisgICAgICBpZihJU0ZMT0FUKHQpKXsKKyAgICAgICAgc3ByaW50ZihmbmFtZSwiX18lY2ludCVsZHRvZmx0JWQiLCh0MiZVTlNJR05FRCk/J3UnOidzJyx6bTJsKHNpemV0YWJbdDImTlFdKSo4LCh0PT1GTE9BVCk/MzI6NjQpOworICAgICAgICByZXQ9Zm5hbWU7CisgICAgICB9CisgICAgICBpZihJU0ZMT0FUKHQyKSYmKHQmTlUpPT1MTE9ORyl7CisgICAgICAgIHNwcmludGYoZm5hbWUsIl9fZmx0JWR0byVjaW50JWxkIiwoKHQyJk5VKT09RkxPQVQpPzMyOjY0LCh0JlVOU0lHTkVEKT8ndSc6J3MnLHptMmwoc2l6ZXRhYlt0Jk5RXSkqOCk7CisgICAgICAgIHJldD1mbmFtZTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoKHQmTlEpPT1MTE9OR3x8SVNGTE9BVCh0KSl7CisgICAgICBpZigoYz49TFNISUZUJiZjPD1NT0QpfHwoYz49T1ImJmM8PUFORCl8fGM9PUtPTVBMRU1FTlR8fGM9PU1JTlVTKXsKKwlpZih0PT0oVU5TSUdORUR8TExPTkcpJiYoYz09RElWfHxjPT1NT0R8fGM9PVJTSElGVCkpeworCSAgc3ByaW50ZihmbmFtZSwiX18lc3VpbnQ2NCIsZW5hbWVbY10pOworCSAgcmV0PWZuYW1lOworCX1lbHNlIGlmKCh0Jk5RKT09TExPTkcpeworICAgICAgICAgIHNwcmludGYoZm5hbWUsIl9fJXNpbnQ2NCIsZW5hbWVbY10pOworICAgICAgICAgIHJldD1mbmFtZTsKKyAgICAgICAgfWVsc2V7CisJICBzcHJpbnRmKGZuYW1lLCJfXyVzJXMlcyVsZCIsZW5hbWVbY10sKHQmVU5TSUdORUQpPyJ1IjoiIixJU0ZMT0FUKHQpPyJmbHQiOiJpbnQiLHptMmwoc2l6ZXRhYlt0Jk5RXSkqOCk7CisgICAgICAgICAgcmV0PWZuYW1lOworCX0KKyAgICAgIH0KKyAgICB9CisgIH0KKworCisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9tYWNoaW5lcy9jMTZ4L21hY2hpbmUuZHQgYi9tYWNoaW5lcy9jMTZ4L21hY2hpbmUuZHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWFiMzhjOQotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL2MxNngvbWFjaGluZS5kdApAQCAtMCwwICsxLDE2IEBACitTOEJTCitTOEJVCitTMTZCU0xFIFMxNkJTQkUKK1MxNkJVTEUgUzE2QlVCRQorUzE2QlNMRSBTMTZCU0JFCitTMTZCVUxFIFMxNkJVQkUKK1MzMkJTTEUgUzMyQlNCRQorUzMyQlVMRSBTMzJCVUJFCitTNjRCU0xFIFM2NEJTQkUKK1M2NEJVTEUgUzY0QlVCRQorUzMyQklFRUVMRQorUzY0QklFRUVMRQorUzY0QklFRUVMRQorUzE2QlVMRSBTMTZCVUJFCisKKwpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvYzE2eC9tYWNoaW5lLmggYi9tYWNoaW5lcy9jMTZ4L21hY2hpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZTZkYmRkCi0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvYzE2eC9tYWNoaW5lLmgKQEAgLTAsMCArMSwxODQgQEAKKy8qICBFeGFtcGxlIG9mIGEgY29kZS1nZW5lcmF0b3IgZm9yIFNBQiBjMTZ4IDE2Yml0IG1pY3JvY29udHJvbGxlcnMuKi8KKworI2luY2x1ZGUgImR0LmgiCisKKy8qIFdlIGhhdmUgZXh0ZW5kZWQgdHlwZXMhIFdoYXQgd2UgaGF2ZSB0byBkbyB0byBzdXBwb3J0IHRoZW06ICAgICAgKi8KKy8qIC0gI2RlZmluZSBIQVZFX0VYVF9UWVBFUworICAgLSAjdW5kZWYgYWxsIHN0YW5kYXJkIHR5cGVzCisgICAtICNkZWZpbmUgYWxsIHN0YW5kYXJkIHR5cGVzIHBsdXMgbmV3IHR5cGVzCisgICAtIHdyaXRlIGV2YWxfY29uc3QgYW5kIGluc2VydF9jb25zdAorICAgLSB3cml0ZSB0eXBlZGVmcyBmb3Igem1heCBhbmQgenVtYXgKKyAgIC0gd3JpdGUgdHlwbmFtZVtdCisgICAtIHdyaXRlIGNvbnZfdHlwKCkKKyAgIC0gb3B0aW9uYWxseSAjZGVmaW5lIElTUE9JTlRFUiwgSVNBUklUSCwgSVNJTlQgZXRjLgorICAgLSBvcHRpb25hbGx5ICNkZWZpbmUgSEFWRV9UR1RfUFJJTlRWQUwgYW5kIHdyaXRlIHByaW50dmFsCisgICAtIG9wdGlvbmFsbHkgI2RlZmluZSBQT0lOVEVSX1RZUEUKKyAgIC0gb3B0aW9uYWxseSAjZGVmaW5lIEhBVkVfVEdUX0ZBTElHTiBhbmQgd3JpdGUgZmFsaWduCisgICAtIG9wdGlvbmFsbHkgI2RlZmluZSBIQVZFX1RHVF9TWk9GIGFuZCB3cml0ZSBzem9mCisgICAtIG9wdGlvbmFsbHkgYWRkIGZ1bmN0aW9ucyBmb3IgYXR0cmlidXRlLWhhbmRsaW5nCisqLworI2RlZmluZSBIQVZFX0VYVF9UWVBFUyAxCisKKyNkZWZpbmUgSEFWRV9UR1RfUFJJTlRWQUwKKworI3VuZGVmIENIQVIKKyN1bmRlZiBTSE9SVAorI3VuZGVmIElOVAorI3VuZGVmIExPTkcKKyN1bmRlZiBMTE9ORworI3VuZGVmIEZMT0FUCisjdW5kZWYgRE9VQkxFCisjdW5kZWYgTERPVUJMRQorI3VuZGVmIFZPSUQKKyN1bmRlZiBQT0lOVEVSCisjdW5kZWYgQVJSQVkKKyN1bmRlZiBTVFJVQ1QKKyN1bmRlZiBVTklPTgorI3VuZGVmIEVOVU0KKyN1bmRlZiBGVU5LVAorI3VuZGVmIEJPT0wKKyN1bmRlZiBNQVhJTlQKKyN1bmRlZiBNQVhfVFlQRQorCisjZGVmaW5lIEJJVCAxCisjZGVmaW5lIENIQVIgMgorI2RlZmluZSBTSE9SVCAzCisjZGVmaW5lIElOVCA0CisjZGVmaW5lIExPTkcgNQorI2RlZmluZSBMTE9ORyA2CisjZGVmaW5lIEZMT0FUIDcKKyNkZWZpbmUgRE9VQkxFIDgKKyNkZWZpbmUgTERPVUJMRSA5CisjZGVmaW5lIFZPSUQgMTAKKyNkZWZpbmUgTlBPSU5URVIgMTEKKyNkZWZpbmUgRlBPSU5URVIgMTIKKyNkZWZpbmUgSFBPSU5URVIgMTMKKyNkZWZpbmUgQVJSQVkgMTQKKyNkZWZpbmUgU1RSVUNUIDE1CisjZGVmaW5lIFVOSU9OIDE2CisjZGVmaW5lIEVOVU0gMTcKKyNkZWZpbmUgRlVOS1QgMTgKKyNkZWZpbmUgQk9PTCAxOQorCisjZGVmaW5lIE1BWElOVCAyMAorCisjZGVmaW5lIE1BWF9UWVBFIE1BWElOVAorCisjZGVmaW5lIFBPSU5URVJfVFlQRSh4KSBwb2ludGVyX3R5cGUoeCkKK2V4dGVybiBpbnQgcG9pbnRlcl90eXBlKCk7CisjZGVmaW5lIElTUE9JTlRFUih4KSAoKHgmTlEpPj1OUE9JTlRFUiYmKHgmTlEpPD1IUE9JTlRFUikKKyNkZWZpbmUgSVNTQ0FMQVIoeCkgKCh4Jk5RKT49QklUJiYoeCZOUSk8PUhQT0lOVEVSKQorI2RlZmluZSBJU0lOVCh4KSAoKHgmTlEpPj1CSVQmJih4Jk5RKTw9TExPTkcpCisjZGVmaW5lIFBUUkRJRkZfVCh4KSAoKHgpPT1IUE9JTlRFUj9MT05HOklOVCkKKwordHlwZWRlZiB6bGxvbmcgem1heDsKK3R5cGVkZWYgenVsbG9uZyB6dW1heDsKKwordW5pb24gYXR5cHN7CisgIHpjaGFyIHZjaGFyOworICB6dWNoYXIgdnVjaGFyOworICB6c2hvcnQgdnNob3J0OworICB6dXNob3J0IHZ1c2hvcnQ7CisgIHppbnQgdmludDsKKyAgenVpbnQgdnVpbnQ7CisgIHpsb25nIHZsb25nOworICB6dWxvbmcgdnVsb25nOworICB6bGxvbmcgdmxsb25nOworICB6dWxsb25nIHZ1bGxvbmc7CisgIHptYXggdm1heDsKKyAgenVtYXggdnVtYXg7CisgIHpmbG9hdCB2ZmxvYXQ7CisgIHpkb3VibGUgdmRvdWJsZTsKKyAgemxkb3VibGUgdmxkb3VibGU7Cit9OworCisvKiAgVGhpcyBzdHJ1Y3QgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IG1hY2hpbmUtc3BlY2lmaWMgICAgICAgICAgICovCisvKiAgYWRkcmVzc2luZy1tb2Rlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTm90IHVzZWQgaW4gdGhpcyBjb2RlLWdlbmVycmF0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdHJ1Y3QgQWRkcmVzc2luZ01vZGV7CisgICAgaW50IGZsYWdzOworICAgIGludCBiYXNlOworICAgIGxvbmcgb2Zmc2V0OworICAgIHN0cnVjdCBWYXIgKnY7Cit9OworCisvKiBUaGlzIHR5cGUgd2lsbCBiZSBhZGRlZCB0byBldmVyeSBJQy4gQ2FuIGJlIHVzZWQgYnkgdGhlIGNnLiAgICAgICovCisjZGVmaW5lIEhBVkVfRVhUX0lDIDEKK3N0cnVjdCBleHRfaWMgeworICBpbnQgZmxhZ3M7CisgIGludCByOworICBsb25nIG9mZnNldDsKK307CisKKy8qICBUaGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUuICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFYUiAyNQorCisvKiAgTnVtYmVyIG9mIGNvbW1hbmRsaW5lLW9wdGlvbnMgdGhlIGNvZGUtZ2VuZXJhdG9yIGFjY2VwdHMuICAgICAgICovCisjZGVmaW5lIE1BWEdGIDEwCisKKy8qICBJZiB0aGlzIGlzIHNldCB0byB6ZXJvIHZiY2Mgd2lsbCBub3QgZ2VuZXJhdGUgSUNzIHdoZXJlIHRoZSAgICAgKi8KKy8qICB0YXJnZXQgb3BlcmFuZCBpcyB0aGUgc2FtZSBhcyB0aGUgMm5kIHNvdXJjZSBvcGVyYW5kLiAgICAgICAgICAgKi8KKy8qICBUaGlzIGNhbiBzb21ldGltZXMgc2ltcGxpZnkgdGhlIGNvZGUtZ2VuZXJhdG9yLCBidXQgdXN1YWxseSAgICAgKi8KKy8qICB0aGUgY29kZSBpcyBiZXR0ZXIgaWYgdGhlIGNvZGUtZ2VuZXJhdG9yIGFsbG93cyBpdC4gICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNFUTJBU1ogMQorCisvKiAgVGhpcyBzcGVjaWZpZXMgdGhlIHNtYWxsZXN0IGludGVnZXIgdHlwZSB0aGF0IGNhbiBiZSBhZGRlZCB0byBhICovCisvKiAgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JTkFEREkyUCBJTlQKKworLyogIElmIHRoZSBieXRlcyBvZiBhbiBpbnRlZ2VyIGFyZSBvcmRlcmVkIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSAgICAqLworLyogIGJ5dGUgZmlyc3QgYW5kIHRoZW4gZGVjcmVhc2luZyBzZXQgQklHRU5ESUFOIHRvIDEuICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdFTkRJQU4gMAorCisvKiAgSWYgdGhlIGJ5dGVzIG9mIGFuIGludGVnZXIgYXJlIG9yZGVyZWQgbGVzdCBzaWduaWZpY2FudCBieXRlICAgICovCisvKiAgYnl0ZSBmaXJzdCBhbmQgdGhlbiBpbmNyZWFzaW5nIHNldCBMSVRUTEVFTkRJQU4gdG8gMS4gICAgICAgICAgICovCisjZGVmaW5lIExJVFRMRUVORElBTiAxCisKKy8qICBOb3RlIHRoYXQgQklHRU5ESUFOIGFuZCBMSVRUTEVFTkRJQU4gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gICAgKi8KKworLyogIElmIHN3aXRjaC1zdGF0ZW1lbnRzIHNob3VsZCBiZSBnZW5lcmF0ZWQgYXMgYSBzZXF1ZW5jZSBvZiAgICAgICAqLworLyogIFNVQixUU1QsQkVRIElDcyByYXRoZXIgdGhhbiBDT01QQVJFLEJFUSBJQ3Mgc2V0IHRoaXMgdG8gMS4gICAgICAqLworLyogIFRoaXMgY2FuIHlpZWxkIGJldHRlciBjb2RlIG9uIHNvbWUgbWFjaGluZXMuICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTV0lUQ0hTVUJTIDAKKworLyogIEluIG9wdGltaXppbmcgY29tcGlsYXRpb24gY2VydGFpbiBsaWJyYXJ5IG1lbWNweS9zdHJjcHktY2FsbHMgICAqLworLyogIHdpdGggbGVuZ3RoIGtub3duIGF0IGNvbXBpbGUtdGltZSB3aWxsIGJlIGlubGluZWQgdXNpbmcgYW4gICAgICAqLworLyogIEFTU0lHTi1JQyBpZiB0aGUgc2l6ZSBpcyBsZXNzIG9yIGVxdWFsIHRvIElOTElORU1FTUNQWS4gICAgICAgICAqLworLyogIFRoZSB0eXBlIHVzZWQgZm9yIHRoZSBBU1NJR04tSUMgd2lsbCBiZSBVTlNJR05FRHxDSEFSLiAgICAgICAgICAqLworI2RlZmluZSBJTkxJTkVNRU1DUFkgMTAyNAorCisjZGVmaW5lIEhBVkVfUkVHUEFSTVMgMQorCitzdHJ1Y3QgcmVnX2hhbmRsZSB7CisgIGludCBncHI7Cit9OworCisvKiAgV2UgdXNlIHVuc2lnbmVkIGludCBhcyBzaXplX3QgcmF0aGVyIHRoYW4gdW5zaWduZWQgbG9uZyB3aGljaCAgICovCisvKiAgaXMgdGhlIGRlZmF1bHQgc2V0dGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBVkVfSU5UX1NJWkVUIDEKKworLyogIFdlIGhhdmUgcmVnaXN0ZXIgcGFpcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQVZFX1JFR1BBSVJTIDEKKworLyogIFdlIGtlZXAgdHJhY2sgb2YgYWxsIHJlZ2lzdGVycyBtb2RpZmllZCBieSBhIGZ1bmN0aW9uLiAgICAgICAgICAqLworI2RlZmluZSBIQVZFX1JFR1NfTU9ESUZJRUQgMQorCisjZGVmaW5lIEhBVkVfVEFSR0VUX1JBTExPQyAxCisjZGVmaW5lIGNvc3RfbG9hZF9yZWcocix2KSA0CisjZGVmaW5lIGNvc3Rfc2F2ZV9yZWcocix2KSA0CisjZGVmaW5lIGNvc3RfbW92ZV9yZWcoaSxqKSAyCisjZGVmaW5lIGNvc3RfcHVzaHBvcF9yZWcocikgMgorCisvKiBzaXplIG9mIGJ1ZmZlciBmb3IgYXNtLW91dHB1dCAqLworI2RlZmluZSBFTUlUX0JVRl9MRU4gMTAyNCAvKiBzaG91bGQgYmUgZW5vdWdoICovCisvKiBudW1iZXIgb2YgYXNtLW91dHB1dCBsaW5lcyBidWZmZXJlZCAqLworI2RlZmluZSBFTUlUX0JVRl9ERVBUSCA0CisKKy8qICBXZSBoYXZlIGFzbV9wZWVwaG9sZSB0byBvcHRpbWl6ZSBhc3NlbWJseS1vdXRwdXQgKi8KKyNkZWZpbmUgSEFWRV9UQVJHRVRfUEVFUEhPTEUgMQorCisvKiAgV2UgaGF2ZSBzb21lIHRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZSBhdHRyaWJ1dGVzLiAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBVkVfVEFSR0VUX0FUVFJJQlVURVMgMQorCisvKiBXZSB1c2UgYnVpbHRpbiBsaWJjYWxscyBmb3Igc29tZSBvcGVyYXRpb25zICovCisjZGVmaW5lIEhBVkVfTElCQ0FMTFMgMQpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvZHYvbWFjaGluZS5jIGIvbWFjaGluZXMvZHYvbWFjaGluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI2NGQ2NzcKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9kdi9tYWNoaW5lLmMKQEAgLTAsMCArMSwxMTEyIEBACisvKgorICAgIERhbHZpayBiYWNrZW5kIGZvciB2YmNjCisqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyNpbmNsdWRlICJzdXBwLmgiCisKK3N0YXRpYyBjaGFyIEZJTEVfW109X19GSUxFX187CisKKy8qICBQdWJsaWMgZGF0YSB0aGF0IE1VU1QgYmUgdGhlcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBOYW1lIGFuZCBjb3B5cmlnaHQuICovCitjaGFyIGNnX2NvcHlyaWdodFtdPSJ2YmNjIGRhbHZpayBjb2RlLWdlbmVyYXRvciBWMC4xIChjKSBpbiAyMDEyIGJ5IFZvbGtlciBCYXJ0aGVsbWFubiI7CisKKy8qICBDb21tYW5kbGluZS1mbGFncyB0aGUgY29kZS1nZW5lcmF0b3IgYWNjZXB0czoKKyAgICAwOiBqdXN0IGEgZmxhZworICAgIFZBTEZMQUc6IGEgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQKKyAgICBTVFJJTkdGTEFHOiBhIHN0cmluZyBjYW4gYmUgc3BlY2lmaWVkCisgICAgRlVOQ0ZMQUc6IGEgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKKyAgICBhcGFydCBmcm9tIEZVTkNGTEFHLCBhbGwgb3RoZXIgdmVyc2lvbnMgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIG9uY2UgKi8KK2ludCBnX2ZsYWdzW01BWEdGXT17MCwwLAorCQkgICAgVkFMRkxBRyxWQUxGTEFHLFZBTEZMQUcsCisJCSAgICAwLDAsCisJCSAgICBWQUxGTEFHLFZBTEZMQUcsMH07CisKKy8qIHRoZSBmbGFnLW5hbWUsIGRvIG5vdCB1c2UgbmFtZXMgYmVnaW5uaW5nIHdpdGggbCwgTCwgSSwgRCBvciBVLCBiZWNhdXNlCisgICB0aGV5IGNvbGxpZGUgd2l0aCB0aGUgZnJvbnRlbmQgKi8KK2NoYXIgKmdfZmxhZ3NfbmFtZVtNQVhHRl09eyJ0aHJlZS1hZGRyIiwibG9hZC1zdG9yZSIsCisJCQkgICAidm9sYXRpbGUtZ3BycyIsInZvbGF0aWxlLWZwcnMiLCJ2b2xhdGlsZS1jY3JzIiwKKwkJCSAgICJpbW0taW5kIiwiZ3ByLWluZCIsCisJCQkgICAiZ3ByLWFyZ3MiLCJmcHItYXJncyIsInVzZS1jb21tb25zIn07CisKKy8qIHRoZSByZXN1bHRzIG9mIHBhcnNpbmcgdGhlIGNvbW1hbmQtbGluZS1mbGFncyB3aWxsIGJlIHN0b3JlZCBoZXJlICovCit1bmlvbiBwcGkgZ19mbGFnc192YWxbTUFYR0ZdOworCisvKiAgQWxpZ25tZW50LXJlcXVpcmVtZW50cyBmb3IgYWxsIHR5cGVzIGluIGJ5dGVzLiAgICAgICAgICAgICAgKi8KK3ptYXggYWxpZ25bTUFYX1RZUEUrMV07CisKKy8qICBBbGlnbm1lbnQgdGhhdCBpcyBzdWZmaWNpZW50IGZvciBldmVyeSBvYmplY3QuICAgICAgICAgICAgICAqLworem1heCBtYXhhbGlnbjsKKworLyogIENIQVJfQklUIGZvciB0aGUgdGFyZ2V0IG1hY2hpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IGNoYXJfYml0OworCisvKiAgc2l6ZXMgb2YgdGhlIGJhc2ljIHR5cGVzIChpbiBieXRlcykgKi8KK3ptYXggc2l6ZXRhYltNQVhfVFlQRSsxXTsKKworLyogIE1pbmltdW0gYW5kIE1heGltdW0gdmFsdWVzIGVhY2ggdHlwZSBjYW4gaGF2ZS4gICAgICAgICAgICAgICovCisvKiAgTXVzdCBiZSBpbml0aWFsaXplZCBpbiBpbml0X2NnKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggdF9taW5bTUFYX1RZUEUrMV07Cit6dW1heCB0X21heFtNQVhfVFlQRSsxXTsKK3p1bWF4IHR1X21heFtNQVhfVFlQRSsxXTsKKworLyogIE5hbWVzIG9mIGFsbCByZWdpc3RlcnMuIHdpbGwgYmUgaW5pdGlhbGl6ZWQgaW4gaW5pdF9jZygpLAorICAgIHJlZ2lzdGVyIG51bWJlciAwIGlzIGludmFsaWQsIHZhbGlkIHJlZ2lzdGVycyBzdGFydCBhdCAxICovCitjaGFyICpyZWduYW1lc1tNQVhSKzFdOworCisvKiAgVGhlIFNpemUgb2YgZWFjaCByZWdpc3RlciBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggcmVnc2l6ZVtNQVhSKzFdOworCisvKiAgYSB0eXBlIHdoaWNoIGNhbiBzdG9yZSBlYWNoIHJlZ2lzdGVyLiAqLworc3RydWN0IFR5cCAqcmVndHlwZVtNQVhSKzFdOworCisvKiAgcmVnc2FbcmVnXSE9MCBpZiBhIGNlcnRhaW4gcmVnaXN0ZXIgaXMgYWxsb2NhdGVkIGFuZCBzaG91bGQgKi8KKy8qICBub3QgYmUgdXNlZCBieSB0aGUgY29tcGlsZXIgcGFzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworaW50IHJlZ3NhW01BWFIrMV07CisKKy8qICBTcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXJzIG1heSBiZSBzY3JhdGNoZWQgYnkgZnVuY3Rpb25zLiAgICAqLworaW50IHJlZ3NjcmF0Y2hbTUFYUisxXTsKKworLyogc3BlY2lmaWVzIHRoZSBwcmlvcml0eSBmb3IgdGhlIHJlZ2lzdGVyLWFsbG9jYXRvciwgaWYgdGhlIHNhbWUKKyAgIGVzdGltYXRlZCBjb3N0LXNhdmluZyBjYW4gYmUgb2J0YWluZWQgYnkgc2V2ZXJhbCByZWdpc3RlcnMsIHRoZQorICAgb25lIHdpdGggdGhlIGhpZ2hlc3QgcHJpb3JpdHkgd2lsbCBiZSB1c2VkICovCitpbnQgcmVnX3ByaW9bTUFYUisxXTsKKworLyogYW4gZW1wdHkgcmVnLWhhbmRsZSByZXByZXNlbnRpbmcgaW5pdGlhbCBzdGF0ZSAqLworc3RydWN0IHJlZ19oYW5kbGUgZW1wdHlfcmVnX2hhbmRsZT17MCwwfTsKKworLyogTmFtZXMgb2YgdGFyZ2V0LXNwZWNpZmljIHZhcmlhYmxlIGF0dHJpYnV0ZXMuICAgICAgICAgICAgICAgICovCitjaGFyICpnX2F0dHJfbmFtZVtdPXsiX19pbnRlcnJ1cHQiLDB9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFByaXZhdGUgZGF0YSBhbmQgZnVuY3Rpb25zLiAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUSFJFRV9BRERSIChnX2ZsYWdzWzBdJlVTRURGTEFHKQorI2RlZmluZSBMT0FEX1NUT1JFIChnX2ZsYWdzWzFdJlVTRURGTEFHKQorI2RlZmluZSBWT0xfR1BSUyAgICgoZ19mbGFnc1syXSZVU0VERkxBRyk/Z19mbGFnc192YWxbMl0ubDpOVU1fR1BSUy8yKQorI2RlZmluZSBWT0xfRlBSUyAgICgoZ19mbGFnc1szXSZVU0VERkxBRyk/Z19mbGFnc192YWxbM10ubDpOVU1fRlBSUy8yKQorI2RlZmluZSBWT0xfQ0NSUyAgICgoZ19mbGFnc1s0XSZVU0VERkxBRyk/Z19mbGFnc192YWxbNF0ubDpOVU1fQ0NSUy8yKQorI2RlZmluZSBJTU1fSU5EICAgICgoZ19mbGFnc1s1XSZVU0VERkxBRyk/MTowKQorI2RlZmluZSBHUFJfSU5EICAgICgoZ19mbGFnc1s2XSZVU0VERkxBRyk/MjowKQorI2RlZmluZSBHUFJfQVJHUyAgICgoZ19mbGFnc1s3XSZVU0VERkxBRyk/Z19mbGFnc192YWxbN10ubDowKQorI2RlZmluZSBGUFJfQVJHUyAgICgoZ19mbGFnc1s4XSZVU0VERkxBRyk/Z19mbGFnc192YWxbOF0ubDowKQorI2RlZmluZSBVU0VfQ09NTU9OUyAoZ19mbGFnc1s5XSZVU0VERkxBRykKKworCisjaWZkZWYgRFZfQllURTgKKy8qIGFsaWdubWVudCBvZiBiYXNpYyBkYXRhLXR5cGVzLCB1c2VkIHRvIGluaXRpYWxpemUgYWxpZ25bXSAqLworc3RhdGljIGxvbmcgbWFsaWduW01BWF9UWVBFKzFdPSAgezEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDF9OworLyogc2l6ZXMgb2YgYmFzaWMgZGF0YS10eXBlcywgdXNlZCB0byBpbml0aWFsaXplIHNpemV0YWJbXSAqLworc3RhdGljIGxvbmcgbXNpemV0YWJbTUFYX1RZUEUrMV09ezEsMSwyLDQsNCw4LDQsOCw4LDAsOCwwLDAsMCw0LDB9OworI2Vsc2UKKy8qIGFsaWdubWVudCBvZiBiYXNpYyBkYXRhLXR5cGVzLCB1c2VkIHRvIGluaXRpYWxpemUgYWxpZ25bXSAqLworc3RhdGljIGxvbmcgbWFsaWduW01BWF9UWVBFKzFdPSAgezEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDF9OworLyogc2l6ZXMgb2YgYmFzaWMgZGF0YS10eXBlcywgdXNlZCB0byBpbml0aWFsaXplIHNpemV0YWJbXSAqLworc3RhdGljIGxvbmcgbXNpemV0YWJbTUFYX1RZUEUrMV09ezEsMSwxLDEsMSwyLDEsMiwyLDAsMiwwLDAsMCwxLDB9OworI2VuZGlmCisKKy8qIHVzZWQgdG8gaW5pdGlhbGl6ZSByZWd0eXBbXSAqLworc3RhdGljIHN0cnVjdCBUeXAgbHR5cD17TE9OR30sbGRibD17RE9VQkxFfSxsY2hhcj17Q0hBUn07CisKKy8qIG1hY3JvcyBkZWZpbmVkIGJ5IHRoZSBiYWNrZW5kICovCitzdGF0aWMgY2hhciAqbWFycmF5W109eyJfX3NlY3Rpb24oeCk9X192YXR0cihcInNlY3Rpb24oXCIjeFwiKVwiKSIsCisJCSAgICAgICAiX19HRU5FUklDX18iLAorCQkgICAgICAgMH07CisKKy8qIHNwZWNpYWwgcmVnaXN0ZXJzICovCitzdGF0aWMgaW50IHNwOyAgICAgICAgICAgICAgICAgICAgIC8qICBTdGFja3BvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIGludCB0MSx0Mix0MzsgICAgICAgICAgICAgICAvKiAgdGVtcG9yYXJ5IGdwcnMgKi8KK3N0YXRpYyBpbnQgZjEsZjIsZjM7ICAgICAgICAgICAgICAgLyogIHRlbXBvcmFyeSBmcHJzICovCisKKyNkZWZpbmUgZHQodCkgKCgodCkmVU5TSUdORUQpP3VkdFsodCkmTlFdOnNkdFsodCkmTlFdKQorc3RhdGljIGNoYXIgKnNkdFtNQVhfVFlQRSsxXT17Ij8/IiwiYyIsInMiLCJpIiwibCIsImxsIiwiZiIsImQiLCJsZCIsInYiLCJwIn07CitzdGF0aWMgY2hhciAqdWR0W01BWF9UWVBFKzFdPXsiPz8iLCJ1YyIsInVzIiwidWkiLCJ1bCIsInVsbCIsImYiLCJkIiwibGQiLCJ2IiwicCJ9OworCisvKiBzZWN0aW9ucyAqLworI2RlZmluZSBEQVRBIDAKKyNkZWZpbmUgQlNTIDEKKyNkZWZpbmUgQ09ERSAyCisjZGVmaW5lIFJPREFUQSAzCisjZGVmaW5lIFNQRUNJQUwgNAorCitzdGF0aWMgbG9uZyBzdGFjazsKK3N0YXRpYyBpbnQgc3RhY2tfdmFsaWQ7CitzdGF0aWMgaW50IHNlY3Rpb249LTEsbmV3b2JqOworc3RhdGljIGNoYXIgKmNvZGVuYW1lPSJcdC50ZXh0XG4iLAorICAqZGF0YW5hbWU9Ilx0LmRhdGFcbiIsCisgICpic3NuYW1lPSIiLAorICAqcm9kYXRhbmFtZT0iXHQuc2VjdGlvblx0LnJvZGF0YVxuIjsKKworLyogbGFiZWwgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24gKGlmIGFueSkgKi8KK3N0YXRpYyBpbnQgZXhpdF9sYWJlbDsKKworLyogYXNzZW1ibHktcHJlZml4ZXMgZm9yIGxhYmVscyBhbmQgZXh0ZXJuYWwgaWRlbnRpZmllcnMgKi8KK3N0YXRpYyBjaGFyICpsYWJwcmVmaXg9IjoiLCppZHByZWZpeD0iIjsKKworI2lmIEZJWEVEX1NQCisvKiB2YXJpYWJsZXMgdG8gY2FsY3VsYXRlIHRoZSBzaXplIGFuZCBwYXJ0aXRpb25pbmcgb2YgdGhlIHN0YWNrLWZyYW1lCisgICBpbiB0aGUgY2FzZSBvZiBGSVhFRF9TUCAqLworc3RhdGljIGxvbmcgZnJhbWVvZmZzZXQscHVzaGVkLG1heHB1c2hlZCxmcmFtZXNpemU7CisjZWxzZQorLyogdmFyaWFibGVzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc3RhY2stb2Zmc2V0IGluIHRoZSBjYXNlIG9mCisgICBhIG1vdmluZyBzdGFjay1wb2ludGVyICovCitzdGF0aWMgbG9uZyBub3Rwb3BwZWQsZG9udHBvcCxzdGFja29mZnNldCxtYXhwdXNoZWQ7CisjZW5kaWYKKworc3RhdGljIGxvbmcgbG9jYWxzaXplLHJzYXZlc2l6ZSxhcmdzaXplOworCitzdGF0aWMgdm9pZCBlbWl0X29iaihGSUxFICpmLHN0cnVjdCBvYmogKnAsaW50IHQpOworCitzdGF0aWMgbG9uZyByZWFsX29mZnNldChzdHJ1Y3Qgb2JqICpvKQoreworICBsb25nIG9mZj16bTJsKG8tPnYtPm9mZnNldCk7CisgIGlmKG9mZjwwKXsKKyAgICAvKiBmdW5jdGlvbiBwYXJhbWV0ZXIgKi8KKyAgICBpZXJyb3IoMCk7CisgIH0KKworICBvZmYrPXptMmwoby0+dmFsLnZtYXgpOworICByZXR1cm4gb2ZmOworfQorCisvKiAgSW5pdGlhbGl6ZXMgYW4gYWRkcmVzc2luZy1tb2RlIHN0cnVjdHVyZSBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8KKyAgICB0aGF0IG9iamVjdC4gV2lsbCBub3Qgc3Vydml2ZSBhIHNlY29uZCBjYWxsISAqLworc3RhdGljIHN0cnVjdCBvYmogKmNhbShpbnQgZmxhZ3MsaW50IGJhc2UsbG9uZyBvZmZzZXQpCit7CisgIHN0YXRpYyBzdHJ1Y3Qgb2JqIG9iajsKKyAgc3RhdGljIHN0cnVjdCBBZGRyZXNzaW5nTW9kZSBhbTsKKyAgb2JqLmFtPSZhbTsKKyAgYW0uZmxhZ3M9ZmxhZ3M7CisgIGFtLmJhc2U9YmFzZTsKKyAgYW0ub2Zmc2V0PW9mZnNldDsKKyAgcmV0dXJuICZvYmo7Cit9CisKKy8qIGNoYW5nZXMgdG8gYSBzcGVjaWFsIHNlY3Rpb24sIHVzZWQgZm9yIF9fc2VjdGlvbigpICovCitzdGF0aWMgaW50IHNwZWNpYWxfc2VjdGlvbihGSUxFICpmLHN0cnVjdCBWYXIgKnYpCit7CisgIGNoYXIgKnNlYzsKKyAgaWYoIXYtPnZhdHRyKSByZXR1cm4gMDsKKyAgc2VjPXN0cnN0cih2LT52YXR0ciwic2VjdGlvbigiKTsKKyAgaWYoIXNlYykgcmV0dXJuIDA7CisgIHNlYys9c3RybGVuKCJzZWN0aW9uKCIpOworICBlbWl0KGYsIlx0LnNlY3Rpb25cdCIpOworICB3aGlsZSgqc2VjJiYqc2VjIT0nKScpIGVtaXRfY2hhcihmLCpzZWMrKyk7CisgIGVtaXQoZiwiXG4iKTsKKyAgaWYoZikgc2VjdGlvbj1TUEVDSUFMOworICByZXR1cm4gMTsKK30KKworLyogZ2VuZXJhdGUgY29kZSB0byBsb2FkIHRoZSBhZGRyZXNzIG9mIGEgdmFyaWFibGUgaW50byByZWdpc3RlciByICovCitzdGF0aWMgdm9pZCBsb2FkX2FkZHJlc3MoRklMRSAqZixpbnQgcixzdHJ1Y3Qgb2JqICpvLGludCB0eXBlKQorLyogIEdlbmVyYXRlcyBjb2RlIHRvIGxvYWQgdGhlIGFkZHJlc3Mgb2YgYSB2YXJpYWJsZSBpbnRvIHJlZ2lzdGVyIHIuICAgKi8KK3sKKyAgaWYoIShvLT5mbGFncyZWQVIpKSBpZXJyb3IoMCk7CisgIGlmKCFyZWdfcGFpcihyLCZycCkpIGllcnJvcigwKTsKKworICBpZihvLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CisgICAgbG9uZyBvZmY9cmVhbF9vZmZzZXQobyk7CisgICAgZW1pdChmLCJcdG1vdmUtaW50XHQlcywlc1xuIixtcmVnbmFtZXNbcnAucjJdLG1yZWduYW1lc1tmcF0pOworICAgIGVtaXQoZiwiXHRjb25zdC1pbnRcdCVzLCVsZFxuIixtcmVnbmFtZXNbcnAucjFdLGxvZmYpOworICB9ZWxzZXsKKyAgICBlbWl0KGYsIlx0Y29uc3QtaW50XHQlcywlc1xuIixtcmVnbmFtZXNbcnAucjJdLGdwKTsKKyAgICBlbWl0KGYsIlx0Y29uc3QtaW50XHQlcywiLG1yZWduYW1lc1tycC5yMV0pOworICAgIGVtaXRfb2JqKGYsbyx0eXBlKTsKKyAgICBlbWl0KGYsIlxuIik7CisgIH0KK30KKy8qIEdlbmVyYXRlcyBjb2RlIHRvIGxvYWQgYSBtZW1vcnkgb2JqZWN0IGludG8gcmVnaXN0ZXIgci4gdG1wIGlzIGEKKyAgIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciB3aGljaCBtYXkgYmUgdXNlZC4gdG1wIGNhbiBiZSByLiAqLworc3RhdGljIHZvaWQgbG9hZF9yZWcoRklMRSAqZixpbnQgcixzdHJ1Y3Qgb2JqICpvLGludCB0eXBlKQoreworICB0eXBlJj1OVTsKKyAgaWYoby0+ZmxhZ3MmVkFSQURSKXsKKyAgICBsb2FkX2FkZHJlc3MoZixyLG8sUE9JTlRFUik7CisgIH1lbHNleworICAgIGlmKChvLT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZvLT5yZWc9PXIpCisgICAgICByZXR1cm47CisjaWZkZWYgRFZfQllURTgKKyAgICBpZXJyb3IoMCk7CisjZWxzZQorICAgIGllcnJvcigwKTsKKyNlbmRpZgorICB9Cit9CisKKy8qICBHZW5lcmF0ZXMgY29kZSB0byBzdG9yZSByZWdpc3RlciByIGludG8gbWVtb3J5IG9iamVjdCBvLiAqLworc3RhdGljIHZvaWQgc3RvcmVfcmVnKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdHlwZSkKK3sKKyAgdHlwZSY9TlE7CisgIGVtaXQoZiwiXHRtb3YuJXNcdCIsZHQodHlwZSkpOworICBlbWl0X29iaihmLG8sdHlwZSk7CisgIGVtaXQoZiwiLCVzXG4iLHJlZ25hbWVzW3JdKTsKK30KKworLyogIFlpZWxkcyBsb2cyKHgpKzEgb3IgMC4gKi8KK3N0YXRpYyBsb25nIHBvZjIoenVtYXggeCkKK3sKKyAgenVtYXggcDtpbnQgbG49MTsKKyAgcD11bDJ6dW0oMUwpOworICB3aGlsZShsbjw9MzImJnp1bWxlcShwLHgpKXsKKyAgICBpZih6dW1lcXRvKHgscCkpIHJldHVybiBsbjsKKyAgICBsbisrO3A9enVtYWRkKHAscCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgSUMgKnByZWxvYWQoRklMRSAqLHN0cnVjdCBJQyAqKTsKKworc3RhdGljIHZvaWQgZnVuY3Rpb25fdG9wKEZJTEUgKixzdHJ1Y3QgVmFyICosbG9uZyk7CitzdGF0aWMgdm9pZCBmdW5jdGlvbl9ib3R0b20oRklMRSAqZixzdHJ1Y3QgVmFyICosbG9uZyk7CisKKyNkZWZpbmUgaXNyZWcoeCkgKChwLT54LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpCisjZGVmaW5lIGlzY29uc3QoeCkgKChwLT54LmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKQorCitzdGF0aWMgaW50IHExcmVnLHEycmVnLHpyZWc7CisKK3N0YXRpYyBjaGFyICpjY3NbXT17ImVxIiwibmUiLCJsdCIsImdlIiwibGUiLCJndCIsIiJ9Oworc3RhdGljIGNoYXIgKmxvZ2ljYWxzW109eyJvciIsInhvciIsImFuZCJ9Oworc3RhdGljIGNoYXIgKmFyaXRobWV0aWNzW109eyJzbHciLCJzcnciLCJhZGQiLCJzdWIiLCJtdWxsdyIsImRpdnciLCJtb2QifTsKKworLyogRG9lcyBzb21lIHByZS1wcm9jZXNzaW5nIGxpa2UgZmV0Y2hpbmcgb3BlcmFuZHMgZnJvbSBtZW1vcnkgdG8KKyAgIHJlZ2lzdGVycyBldGMuICovCitzdGF0aWMgc3RydWN0IElDICpwcmVsb2FkKEZJTEUgKmYsc3RydWN0IElDICpwKQoreworICBpbnQgcjsKKworICBpZihpc3JlZyhxMSkpCisgICAgcTFyZWc9cC0+cTEucmVnOworICBlbHNlCisgICAgcTFyZWc9MDsKKworICBpZihpc3JlZyhxMikpCisgICAgcTJyZWc9cC0+cTIucmVnOworICBlbHNlCisgICAgcTJyZWc9MDsKKworICBpZihpc3JlZyh6KSl7CisgICAgenJlZz1wLT56LnJlZzsKKyAgfWVsc2V7CisgICAgaWYoSVNGTE9BVCh6dHlwKHApKSkKKyAgICAgIHpyZWc9ZjE7CisgICAgZWxzZQorICAgICAgenJlZz10MTsKKyAgfQorICAKKyAgaWYoKHAtPnExLmZsYWdzJihEUkVGT0JKfFJFRykpPT1EUkVGT0JKJiYhcC0+cTEuYW0peworICAgIHAtPnExLmZsYWdzJj1+RFJFRk9CSjsKKyAgICBsb2FkX3JlZyhmLHQxLCZwLT5xMSxxMXR5cChwKSk7CisgICAgcC0+cTEucmVnPXQxOworICAgIHAtPnExLmZsYWdzfD0oUkVHfERSRUZPQkopOworICB9CisgIGlmKHAtPnExLmZsYWdzJiZMT0FEX1NUT1JFJiYhaXNyZWcocTEpKXsKKyAgICBpZihJU0ZMT0FUKHExdHlwKHApKSkKKyAgICAgIHExcmVnPWYxOworICAgIGVsc2UKKyAgICAgIHExcmVnPXQxOworICAgIGxvYWRfcmVnKGYscTFyZWcsJnAtPnExLHExdHlwKHApKTsKKyAgICBwLT5xMS5yZWc9cTFyZWc7CisgICAgcC0+cTEuZmxhZ3M9UkVHOworICB9CisKKyAgaWYoKHAtPnEyLmZsYWdzJihEUkVGT0JKfFJFRykpPT1EUkVGT0JKJiYhcC0+cTIuYW0peworICAgIHAtPnEyLmZsYWdzJj1+RFJFRk9CSjsKKyAgICBsb2FkX3JlZyhmLHQxLCZwLT5xMixxMnR5cChwKSk7CisgICAgcC0+cTIucmVnPXQxOworICAgIHAtPnEyLmZsYWdzfD0oUkVHfERSRUZPQkopOworICB9CisgIGlmKHAtPnEyLmZsYWdzJiZMT0FEX1NUT1JFJiYhaXNyZWcocTIpKXsKKyAgICBpZihJU0ZMT0FUKHEydHlwKHApKSkKKyAgICAgIHEycmVnPWYyOworICAgIGVsc2UKKyAgICAgIHEycmVnPXQyOworICAgIGxvYWRfcmVnKGYscTJyZWcsJnAtPnEyLHEydHlwKHApKTsKKyAgICBwLT5xMi5yZWc9cTJyZWc7CisgICAgcC0+cTIuZmxhZ3M9UkVHOworICB9CisgIHJldHVybiBwOworfQorCisvKiBzYXZlIHRoZSByZXN1bHQgKGluIHpyZWcpIGludG8gcC0+eiAqLwordm9pZCBzYXZlX3Jlc3VsdChGSUxFICpmLHN0cnVjdCBJQyAqcCkKK3sKKyAgaWYoKHAtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PURSRUZPQkomJiFwLT56LmFtKXsKKyAgICBwLT56LmZsYWdzJj1+RFJFRk9CSjsKKyAgICBsb2FkX3JlZyhmLHQyLCZwLT56LFBPSU5URVIpOworICAgIHAtPnoucmVnPXQyOworICAgIHAtPnouZmxhZ3N8PShSRUd8RFJFRk9CSik7CisgIH0KKyAgaWYoaXNyZWcoeikpeworICAgIGlmKHAtPnoucmVnIT16cmVnKQorICAgICAgZW1pdChmLCJcdG1vdi4lc1x0JXMsJXNcbiIsZHQoenR5cChwKSkscmVnbmFtZXNbcC0+ei5yZWddLHJlZ25hbWVzW3pyZWddKTsKKyAgfWVsc2V7CisgICAgc3RvcmVfcmVnKGYsenJlZywmcC0+eix6dHlwKHApKTsKKyAgfQorfQorCisvKiBwcmludHMgYW4gb2JqZWN0ICovCitzdGF0aWMgdm9pZCBlbWl0X29iaihGSUxFICpmLHN0cnVjdCBvYmogKnAsaW50IHQpCit7CisgIGlmKHAtPmFtKXsKKyAgICBpZXJyb3IoMCk7CisgIH0KKyAgaWYoKHAtPmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PShLT05TVHxEUkVGT0JKKSl7CisgICAgZW1pdHZhbChmLCZwLT52YWwscC0+ZHR5cCZOVSk7CisgICAgcmV0dXJuOworICB9CisgIGlmKHAtPmZsYWdzJkRSRUZPQkopIGllcnJvcigwKTsKKyAgaWYocC0+ZmxhZ3MmUkVHKXsKKyAgICBlbWl0KGYsIiVzIixyZWduYW1lc1twLT5yZWddKTsKKyAgfWVsc2UgaWYocC0+ZmxhZ3MmVkFSKSB7CisgICAgaWYocC0+di0+c3RvcmFnZV9jbGFzcz09QVVUT3x8cC0+di0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpCisgICAgICBpZXJyb3IoMCk7CisgICAgICBlbWl0KGYsIiVsZCglcykiLHJlYWxfb2Zmc2V0KHApLHJlZ25hbWVzW3NwXSk7CisgICAgZWxzZXsKKyAgICAgIGlmKCF6bWVxdG8obDJ6bSgwTCkscC0+dmFsLnZtYXgpKXtlbWl0dmFsKGYsJnAtPnZhbCxMT05HKTtlbWl0KGYsIisiKTt9CisgICAgICBpZihwLT52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpeworICAgICAgICBlbWl0KGYsIiVzJWxkIixsYWJwcmVmaXgsem0ybChwLT52LT5vZmZzZXQpKTsKKyAgICAgIH1lbHNleworICAgICAgICBlbWl0KGYsIiVzJXMiLGlkcHJlZml4LHAtPnYtPmlkZW50aWZpZXIpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihwLT5mbGFncyZLT05TVCl7CisgICAgZW1pdHZhbChmLCZwLT52YWwsdCZOVSk7CisgIH0KKyAgLyppZihwLT5mbGFncyZEUkVGT0JKKSBlbWl0KGYsIikiKTsqLworfQorCisvKiAgVGVzdCBpZiB0aGVyZSBpcyBhIHNlcXVlbmNlIG9mIEZSRUVSRUdzIGNvbnRhaW5pbmcgRlJFRVJFRyByZWcuCisgICAgVXNlZCBieSBwZWVwaG9sZS4gKi8KK3N0YXRpYyBpbnQgZXhpc3RzX2ZyZWVyZWcoc3RydWN0IElDICpwLGludCByZWcpCit7CisgIHdoaWxlKHAmJihwLT5jb2RlPT1GUkVFUkVHfHxwLT5jb2RlPT1BTExPQ1JFRykpeworICAgIGlmKHAtPmNvZGU9PUZSRUVSRUcmJnAtPnExLnJlZz09cmVnKSByZXR1cm4gMTsKKyAgICBwPXAtPm5leHQ7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIHNlYXJjaCBmb3IgcG9zc2libGUgYWRkcmVzc2luZy1tb2RlcyAqLworc3RhdGljIHZvaWQgcGVlcGhvbGUoc3RydWN0IElDICpwKQoreworICBpbnQgYyxjMixyO3N0cnVjdCBJQyAqcDI7c3RydWN0IEFkZHJlc3NpbmdNb2RlICphbTsKKworICByZXR1cm47CisKKyAgZm9yKDtwO3A9cC0+bmV4dCl7CisgICAgYz1wLT5jb2RlOworICAgIGlmKGMhPUZSRUVSRUcmJmMhPUFMTE9DUkVHJiYoYyE9U0VUUkVUVVJOfHwhaXNyZWcocTEpfHxwLT5xMS5yZWchPXAtPnoucmVnKSkgZXhpdF9sYWJlbD0wOworICAgIGlmKGM9PUxBQkVMKSBleGl0X2xhYmVsPXAtPnR5cGY7CisKKyAgICAvKiBUcnkgY29uc3QocmVnKSAqLworICAgIGlmKElNTV9JTkQmJihjPT1BRERJMlB8fGM9PVNVQklGUCkmJmlzcmVnKHopJiYocC0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworICAgICAgaW50IGJhc2U7em1heCBvZjtzdHJ1Y3Qgb2JqICpvOworICAgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHAtPnR5cGYpOworICAgICAgaWYoYz09U1VCSUZQKSBvZj16bXN1YihsMnptKDBMKSx2bWF4KTsgZWxzZSBvZj12bWF4OworICAgICAgaWYoMS8qem1sZXEobDJ6bSgtMzI3NjhMKSx2bWF4KSYmem1sZXEodm1heCxsMnptKDMyNzY3TCkpKi8peworCXI9cC0+ei5yZWc7CisJaWYoaXNyZWcocTEpKSBiYXNlPXAtPnExLnJlZzsgZWxzZSBiYXNlPXI7CisJbz0wOworCWZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKwkgIGMyPXAyLT5jb2RlOworCSAgaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKKwkgIGlmKGMyIT1GUkVFUkVHJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMS5yZWc9PXIpIGJyZWFrOworCSAgaWYoYzIhPUZSRUVSRUcmJihwMi0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnEyLnJlZz09cikgYnJlYWs7CisJICBpZihjMiE9Q0FMTCYmKGMyPExBQkVMfHxjMj5CUkEpLyomJmMyIT1BRERSRVNTKi8peworCSAgICBpZighcDItPnExLmFtJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTEucmVnPT1yKXsKKwkgICAgICBpZihvKSBicmVhazsKKwkgICAgICBvPSZwMi0+cTE7CisJICAgIH0KKwkgICAgaWYoIXAyLT5xMi5hbSYmKHAyLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnEyLnJlZz09cil7CisJICAgICAgaWYobykgYnJlYWs7CisJICAgICAgbz0mcDItPnEyOworCSAgICB9CisJICAgIGlmKCFwMi0+ei5hbSYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+ei5yZWc9PXIpeworCSAgICAgIGlmKG8pIGJyZWFrOworCSAgICAgIG89JnAyLT56OworCSAgICB9CisJICB9CisJICBpZihjMj09RlJFRVJFR3x8KHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpeworCSAgICBpbnQgbTsKKwkgICAgaWYoYzI9PUZSRUVSRUcpCisJICAgICAgbT1wMi0+cTEucmVnOworCSAgICBlbHNlCisJICAgICAgbT1wMi0+ei5yZWc7CisJICAgIGlmKG09PXIpeworCSAgICAgIGlmKG8peworCQlvLT5hbT1hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CisJCWFtLT5mbGFncz1JTU1fSU5EOworCQlhbS0+YmFzZT1iYXNlOworCQlhbS0+b2Zmc2V0PXptMmwob2YpOworCQlpZihpc3JlZyhxMSkpeworCQkgIHAtPmNvZGU9Yz1OT1A7cC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworCQl9ZWxzZXsKKwkJICBwLT5jb2RlPWM9QVNTSUdOO3AtPnEyLmZsYWdzPTA7CisJCSAgcC0+dHlwZj1wLT50eXBmMjtwLT5xMi52YWwudm1heD1zaXpldGFiW3AtPnR5cGYyJk5RXTsKKwkJfQorCSAgICAgIH0KKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgICBpZihjMiE9RlJFRVJFRyYmbT09YmFzZSkgYnJlYWs7CisJICAgIGNvbnRpbnVlOworCSAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8qIFRyeSByZWcscmVnICovCisgICAgaWYoR1BSX0lORCYmYz09QURESTJQJiZpc3JlZyhxMikmJmlzcmVnKHopJiYoaXNyZWcocTEpfHxwLT5xMi5yZWchPXAtPnoucmVnKSl7CisgICAgICBpbnQgYmFzZSxpZHg7c3RydWN0IG9iaiAqbzsKKyAgICAgIHI9cC0+ei5yZWc7aWR4PXAtPnEyLnJlZzsKKyAgICAgIGlmKGlzcmVnKHExKSkgYmFzZT1wLT5xMS5yZWc7IGVsc2UgYmFzZT1yOworICAgICAgbz0wOworICAgICAgZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpeworICAgICAgICBjMj1wMi0+Y29kZTsKKyAgICAgICAgaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKKyAgICAgICAgaWYoYzIhPUZSRUVSRUcmJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09cikgYnJlYWs7CisgICAgICAgIGlmKGMyIT1GUkVFUkVHJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMi5yZWc9PXIpIGJyZWFrOworICAgICAgICBpZigocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnoucmVnPT1pZHgmJmlkeCE9cikgYnJlYWs7CisJCisgICAgICAgIGlmKGMyIT1DQUxMJiYoYzI8TEFCRUx8fGMyPkJSQSkvKiYmYzIhPUFERFJFU1MqLyl7CisgICAgICAgICAgaWYoIXAyLT5xMS5hbSYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnExLnJlZz09cil7CisgICAgICAgICAgICBpZihvfHwocTF0eXAocDIpJk5RKT09TExPTkcpIGJyZWFrOworICAgICAgICAgICAgbz0mcDItPnExOworICAgICAgICAgIH0KKyAgICAgICAgICBpZighcDItPnEyLmFtJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTIucmVnPT1yKXsKKyAgICAgICAgICAgIGlmKG98fChxMnR5cChwMikmTlEpPT1MTE9ORykgYnJlYWs7CisgICAgICAgICAgICBvPSZwMi0+cTI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKCFwMi0+ei5hbSYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+ei5yZWc9PXIpeworICAgICAgICAgICAgaWYob3x8KHp0eXAocDIpJk5RKT09TExPTkcpIGJyZWFrOworICAgICAgICAgICAgbz0mcDItPno7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKGMyPT1GUkVFUkVHfHwocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgICAgICAgaW50IG07CisgICAgICAgICAgaWYoYzI9PUZSRUVSRUcpCisgICAgICAgICAgICBtPXAyLT5xMS5yZWc7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbT1wMi0+ei5yZWc7CisgICAgICAgICAgaWYobT09cil7CisgICAgICAgICAgICBpZihvKXsKKyAgICAgICAgICAgICAgby0+YW09YW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworICAgICAgICAgICAgICBhbS0+ZmxhZ3M9R1BSX0lORDsKKyAgICAgICAgICAgICAgYW0tPmJhc2U9YmFzZTsKKyAgICAgICAgICAgICAgYW0tPm9mZnNldD1pZHg7CisJICAgICAgaWYoaXNyZWcocTEpKXsKKwkJcC0+Y29kZT1jPU5PUDtwLT5xMS5mbGFncz1wLT5xMi5mbGFncz1wLT56LmZsYWdzPTA7CisJICAgICAgfWVsc2V7CisJCXAtPmNvZGU9Yz1BU1NJR047cC0+cTIuZmxhZ3M9MDsKKwkJcC0+dHlwZj1wLT50eXBmMjtwLT5xMi52YWwudm1heD1zaXpldGFiW3AtPnR5cGYyJk5RXTsKKwkgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYoYzIhPUZSRUVSRUcmJm09PWJhc2UpIGJyZWFrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qIGdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gZW50cnkgY29kZSAqLworc3RhdGljIHZvaWQgZnVuY3Rpb25fdG9wKEZJTEUgKmYsc3RydWN0IFZhciAqdixsb25nIG9mZnNldCkKK3sKKyAgcnNhdmVzaXplPTA7CisgIGlmKCFzcGVjaWFsX3NlY3Rpb24oZix2KSYmc2VjdGlvbiE9Q09ERSl7ZW1pdChmLGNvZGVuYW1lKTtpZihmKSBzZWN0aW9uPUNPREU7fSAKKyAgaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKKyAgICBpZigodi0+ZmxhZ3MmKElOTElORUZVTkN8SU5MSU5FRVhUKSkhPUlOTElORUZVTkMpCisgICAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXMlc1xuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICBlbWl0KGYsIiVzJXM6XG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICB9ZWxzZQorICAgIGVtaXQoZiwiJXMlbGQ6XG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworfQorLyogZ2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBleGl0IGNvZGUgKi8KK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX2JvdHRvbShGSUxFICpmLHN0cnVjdCBWYXIgKnYsbG9uZyBvZmZzZXQpCit7CisgIGVtaXQoZixyZXQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBFbmQgb2YgcHJpdmF0ZSBkYXRhIGFuZCBmdW5jdGlvbnMuICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICBEb2VzIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbnMgZm9yIHRoZSBjb2RlLWdlbmVyYXRvci4gR2V0cyBjYWxsZWQgICovCisvKiAgb25jZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCBzaG91bGQgcmV0dXJuIDAgaW4gY2FzZSBvZiBwcm9ibGVtcy4gICAgICAqLworaW50IGluaXRfY2codm9pZCkKK3sKKyAgaW50IGk7CisgIC8qICBJbml0aWFsaXplIHNvbWUgdmFsdWVzIHdoaWNoIGNhbm5vdCBiZSBzdGF0aWNhbGx5IGluaXRpYWxpemVkICAgKi8KKyAgLyogIGJlY2F1c2UgdGhleSBhcmUgc3RvcmVkIGluIHRoZSB0YXJnZXQncyBhcml0aG1ldGljLiAgICAgICAgICAgICAqLworICBtYXhhbGlnbj1sMnptKDhMKTsKKyAgY2hhcl9iaXQ9bDJ6bSg4TCk7CisgIHN0YWNrYWxpZ249bDJ6bSg0KTsKKworICBmb3IoaT0wO2k8PU1BWF9UWVBFO2krKyl7CisgICAgc2l6ZXRhYltpXT1sMnptKG1zaXpldGFiW2ldKTsKKyAgICBhbGlnbltpXT1sMnptKG1hbGlnbltpXSk7CisgIH0KKworICByZWduYW1lc1swXT0ibm9yZWciOworICBmb3IoaT0xO2k8PUdQUlM7aSsrKXsKKyAgICByZWduYW1lc1tpXT1teW1hbGxvYygxMCk7CisgICAgc3ByaW50ZihyZWduYW1lc1tpXSwidiVkIixpLTEpOworI2lmZGVmIERWX0JZVEU4CisgICAgcmVnc2l6ZVtpXT1sMnptKDRMKTsKKyNlbHNlCisgICAgcmVnc2l6ZVtpXT1sMnptKDFMKTsKKyNlbmRpZgorICAgIHJlZ3R5cGVbaV09Jmx0eXA7CisgIH0KKyAgZm9yKGk9R1BSUysxO2k8PUdQUlMrUEFJUlMrMTtpKyspeworICAgIHJlZ25hbWVzW2ldPW15bWFsbG9jKDEwKTsKKyAgICBzcHJpbnRmKHJlZ25hbWVzW2ldLCJ2JWQvdiVkIixpLUdQUlMtMSxpLUdQUlMpOworI2lmZGVmIERWX0JZVEU4CisgICAgcmVnc2l6ZVtpXT1sMnptKDhMKTsKKyNlbHNlCisgICAgcmVnc2l6ZVtpXT1sMnptKDJMKTsKKyNlbmRpZgorICAgIHJlZ3R5cGVbaV09Jmxsb25nOworICB9CisKKyAgLyogIFVzZSBtdWx0aXBsZSBjY3MuICAgKi8KKyAgbXVsdGlwbGVfY2NzPTA7CisKKyAgLyogIEluaXRpYWxpemUgdGhlIG1pbi9tYXgtc2V0dGluZ3MuIE5vdGUgdGhhdCB0aGUgdHlwZXMgb2YgdGhlICAgICAqLworICAvKiAgaG9zdCBzeXN0ZW0gbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSB0YXJnZXQgc3lzdGVtIGFuZCB5b3UgbWF5ICovCisgIC8qICBvbmx5IHVzZSB0aGUgc21hbGxlc3QgbWF4aW11bSB2YWx1ZXMgQU5TSSBndWFyYW50ZWVzIGlmIHlvdSAgICAgKi8KKyAgLyogIHdhbnQgdG8gYmUgcG9ydGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgVGhhdCdzIHRoZSByZWFzb24gZm9yIHRoZSBzdWJ0cmFjdGlvbiBpbiB0X21pbltJTlRdLiBMb25nIGNvdWxkICovCisgIC8qICBiZSB1bmFibGUgdG8gcmVwcmVzZW50IC0yMTQ3NDgzNjQ4IG9uIHRoZSBob3N0IHN5c3RlbS4gICAgICAgICAgKi8KKyNpZmRlZiBEVl9CWVRFOAorICB0X21pbltDSEFSXT1sMnptKC0xMjhMKTsKKyAgdF9taW5bU0hPUlRdPWwyem0oLTMyNzY4TCk7CisgIHRfbWF4W0NIQVJdPXVsMnp1bSgxMjdMKTsKKyAgdF9tYXhbU0hPUlRdPXVsMnp1bSgzMjc2N1VMKTsKKyAgdHVfbWF4W0NIQVJdPXVsMnp1bSgyNTVVTCk7CisgIHR1X21heFtTSE9SVF09dWwyenVtKDY1NTM1VUwpOworI2Vsc2UKKyAgdF9taW5bQ0hBUl09dF9taW5bU0hPUlRdPXptc3ViKGwyem0oLTIxNDc0ODM2NDdMKSxsMnptKDFMKSk7CisgIHRfbWF4W0NIQVJdPXRfbWF4W1NIT1JUXT11bDJ6dW0oMjE0NzQ4MzY0N1VMKTsKKyAgdHVfbWF4W0NIQVJdPXR1X21heFtTSE9SVF09dWwyenVtKDQyOTQ5NjcyOTVVTCk7CisjZW5kaWYKKyAgdF9taW5bSU5UXT16bXN1YihsMnptKC0yMTQ3NDgzNjQ3TCksbDJ6bSgxTCkpOworICB0X21pbltMT05HXT10X21pbihJTlQpOworICB0X21pbltMTE9OR109em1sc2hpZnQobDJ6bSgxTCksbDJ6bSg2M0wpKTsKKyAgdF9taW5bTUFYSU5UXT10X21pbihMTE9ORyk7CisgIHRfbWF4W0NIQVJdPXVsMnp1bSgxMjdMKTsKKyAgdF9tYXhbU0hPUlRdPXVsMnp1bSgzMjc2N1VMKTsKKyAgdF9tYXhbSU5UXT11bDJ6dW0oMjE0NzQ4MzY0N1VMKTsKKyAgdF9tYXhbTE9OR109dF9tYXgoSU5UKTsKKyAgdF9tYXhbTExPTkddPXp1bXJzaGlmdCh6dW1rb21wbCh1bDJ6dW0oMFVMKSksdWwyenVtKDFVTCkpOworICB0X21heFtNQVhJTlRdPXRfbWF4KExMT05HKTsKKyAgdHVfbWF4W0lOVF09dWwyenVtKDQyOTQ5NjcyOTVVTCk7CisgIHR1X21heFtMT05HXT10X21heChVTlNJR05FRHxJTlQpOworICB0dV9tYXhbTExPTkddPXp1bWtvbXBsKHVsMnp1bSgwVUwpKTsKKyAgdHVfbWF4W01BWElOVF09dF9tYXgoVU5TSUdORUR8TExPTkcpOworICAKKyAgLyogIFJlc2VydmUgYSBmZXcgcmVnaXN0ZXJzIGZvciB1c2UgYnkgdGhlIGNvZGUtZ2VuZXJhdG9yLiAgICAgICovCisgIC8qICBUaGlzIGlzIG5vdCBvcHRpbWFsIGJ1dCBzaW1wbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzcD1GSVJTVF9HUFI7CisgIHQxPUZJUlNUX0dQUisxOworICB0Mj1GSVJTVF9HUFIrMjsKKyAgZjE9RklSU1RfRlBSOworICBmMj1GSVJTVF9GUFIrMTsKKyAgcmVnc2FbdDFdPXJlZ3NhW3QyXT0xOworICByZWdzYVtmMV09cmVnc2FbZjJdPTE7CisgIHJlZ3NhW3NwXT0xOworICByZWdzY3JhdGNoW3QxXT1yZWdzY3JhdGNoW3QyXT0wOworICByZWdzY3JhdGNoW2YxXT1yZWdzY3JhdGNoW2YyXT0wOworICByZWdzY3JhdGNoW3NwXT0wOworCisgIGZvcihpPUZJUlNUX0dQUjtpPD1MQVNUX0dQUi1WT0xfR1BSUztpKyspCisgICAgcmVnc2NyYXRjaFtpXT0xOworICBmb3IoaT1GSVJTVF9GUFI7aTw9TEFTVF9GUFItVk9MX0ZQUlM7aSsrKQorICAgIHJlZ3NjcmF0Y2hbaV09MTsKKyAgZm9yKGk9RklSU1RfQ0NSO2k8PUxBU1RfQ0NSLVZPTF9DQ1JTO2krKykKKyAgICByZWdzY3JhdGNoW2ldPTE7CisKKyAgdGFyZ2V0X21hY3Jvcz1tYXJyYXk7CisKKworICByZXR1cm4gMTsKK30KKwordm9pZCBpbml0X2RiKEZJTEUgKmYpCit7Cit9CisKK2ludCBmcmV0dXJuKHN0cnVjdCBUeXAgKnQpCisvKiAgUmV0dXJucyB0aGUgcmVnaXN0ZXIgaW4gd2hpY2ggdmFyaWFibGVzIG9mIHR5cGUgdCBhcmUgcmV0dXJuZWQuICovCisvKiAgSWYgdGhlIHZhbHVlIGNhbm5vdCBiZSByZXR1cm5lZCBpbiBhIHJlZ2lzdGVyIHJldHVybnMgMC4gICAgICAgICovCisvKiAgQSBwb2ludGVyIE1VU1QgYmUgcmV0dXJuZWQgaW4gYSByZWdpc3Rlci4gVGhlIGNvZGUtZ2VuZXJhdG9yICAgICovCisvKiAgaGFzIHRvIHNpbXVsYXRlIGEgcHNldWRvIHJlZ2lzdGVyIGlmIG5lY2Vzc2FyeS4gICAgICAgICAgICAgICAgICovCit7CisgIGlmKElTRkxPQVQodC0+ZmxhZ3MpKSAKKyAgICByZXR1cm4gRklSU1RfRlBSKzI7CisgIGlmKElTU1RSVUNUKHQtPmZsYWdzKXx8SVNVTklPTih0LT5mbGFncykpIAorICAgIHJldHVybiAwOworICBpZih6bWxlcShzem9mKHQpLGwyem0oNEwpKSkgCisgICAgcmV0dXJuIEZJUlNUX0dQUiszOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCByZWdfcGFpcihpbnQgcixzdHJ1Y3QgcnBhaXIgKnApCisvKiBSZXR1cm5zIDAgaWYgdGhlIHJlZ2lzdGVyIGlzIG5vIHJlZ2lzdGVyIHBhaXIuIElmIHIgICovCisvKiBpcyBhIHJlZ2lzdGVyIHBhaXIgbm9uLXplcm8gd2lsbCBiZSByZXR1cm5lZCBhbmQgdGhlICovCisvKiBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBwIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHR3byAgICovCisvKiBlbGVtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIHJldHVybiAwOworfQorCisvKiBlc3RpbWF0ZSB0aGUgY29zdC1zYXZpbmcgaWYgb2JqZWN0IG8gZnJvbSBJQyBwIGlzIHBsYWNlZCBpbgorICAgcmVnaXN0ZXIgciAqLworaW50IGNvc3Rfc2F2aW5ncyhzdHJ1Y3QgSUMgKnAsaW50IHIsc3RydWN0IG9iaiAqbykKK3sKKyAgaW50IGM9cC0+Y29kZTsKKyAgaWYoby0+ZmxhZ3MmVktPTlNUKXsKKyAgICBpZighTE9BRF9TVE9SRSkKKyAgICAgIHJldHVybiAwOworICAgIGlmKG89PSZwLT5xMSYmcC0+Y29kZT09QVNTSUdOJiYocC0+ei5mbGFncyZEUkVGT0JKKSkKKyAgICAgIHJldHVybiA0OworICAgIGVsc2UKKyAgICAgIHJldHVybiAyOworICB9CisgIGlmKG8tPmZsYWdzJkRSRUZPQkopCisgICAgcmV0dXJuIDQ7CisgIGlmKGM9PVNFVFJFVFVSTiYmcj09cC0+ei5yZWcmJiEoby0+ZmxhZ3MmRFJFRk9CSikpIHJldHVybiAzOworICBpZihjPT1HRVRSRVRVUk4mJnI9PXAtPnExLnJlZyYmIShvLT5mbGFncyZEUkVGT0JKKSkgcmV0dXJuIDM7CisgIHJldHVybiAyOworfQorCitpbnQgcmVnb2soaW50IHIsaW50IHQsaW50IG1vZGUpCisvKiAgUmV0dXJucyAwIGlmIHJlZ2lzdGVyIHIgY2Fubm90IHN0b3JlIHZhcmlhYmxlcyBvZiAgICovCisvKiAgdHlwZSB0LiBJZiB0PT1QT0lOVEVSIGFuZCBtb2RlIT0wIHRoZW4gaXQgcmV0dXJucyAgICovCisvKiAgbm9uLXplcm8gb25seSBpZiB0aGUgcmVnaXN0ZXIgY2FuIHN0b3JlIGEgcG9pbnRlciAgICovCisvKiAgYW5kIGRlcmVmZXJlbmNlIGEgcG9pbnRlciB0byBtb2RlLiAgICAgICAgICAgICAgICAgICovCit7CisgIGlmKHI9PTApCisgICAgcmV0dXJuIDA7CisgIHQmPU5ROworICBpZih0PT0wJiZyPj1GSVJTVF9DQ1ImJnI8PUxBU1RfQ0NSKQorICAgIHJldHVybiAxOworICBpZihJU0ZMT0FUKHQpJiZyPj1GSVJTVF9GUFImJnI8PUxBU1RfRlBSKQorICAgIHJldHVybiAxOworICBpZih0PT1QT0lOVEVSJiZyPj1GSVJTVF9HUFImJnI8PUxBU1RfR1BSKQorICAgIHJldHVybiAxOworICBpZih0Pj1DSEFSJiZ0PD1MT05HJiZyPj1GSVJTVF9HUFImJnI8PUxBU1RfR1BSKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworaW50IGRhbmdlcm91c19JQyhzdHJ1Y3QgSUMgKnApCisvKiAgUmV0dXJucyB6ZXJvIGlmIHRoZSBJQyBwIGNhbiBiZSBzYWZlbHkgZXhlY3V0ZWQgICAgICovCisvKiAgd2l0aG91dCBkYW5nZXIgb2YgZXhjZXB0aW9ucyBvciBzaW1pbGFyIHRoaW5ncy4gICAgICovCisvKiAgdmJjYyBtYXkgZ2VuZXJhdGUgY29kZSBpbiB3aGljaCBub24tZGFuZ2Vyb3VzIElDcyAgICovCisvKiAgYXJlIHNvbWV0aW1lcyBleGVjdXRlZCBhbHRob3VnaCBjb250cm9sLWZsb3cgbWF5ICAgICovCisvKiAgbmV2ZXIgcmVhY2ggdGhlbSAobWFpbmx5IHdoZW4gbW92aW5nIGNvbXB1dGF0aW9ucyAgICovCisvKiAgb3V0IG9mIGxvb3BzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVHlwaWNhbCBJQ3MgdGhhdCBnZW5lcmF0ZSBleGNlcHRpb25zIG9uIHNvbWUgICAgICAgICovCisvKiAgbWFjaGluZXMgYXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gYWNjZXNzZXMgdmlhIHBvaW50ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gZGl2aXNpb24vbW9kdWxvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gb3ZlcmZsb3cgb24gc2lnbmVkIGludGVnZXIvZmxvYXRzICAgICAgICAgICAgICovCit7CisgIGludCBjPXAtPmNvZGU7CisgIGlmKChwLT5xMS5mbGFncyZEUkVGT0JKKXx8KHAtPnEyLmZsYWdzJkRSRUZPQkopfHwocC0+ei5mbGFncyZEUkVGT0JKKSkKKyAgICByZXR1cm4gMTsKKyAgaWYoKGM9PURJVnx8Yz09TU9EKSYmIWlzY29uc3QocTIpKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworaW50IG11c3RfY29udmVydChpbnQgbyxpbnQgdCxpbnQgY29uc3RfZXhwcikKKy8qICBSZXR1cm5zIHplcm8gaWYgY29kZSBmb3IgY29udmVydGluZyBucCB0byB0eXBlIHQgICAgKi8KKy8qICBjYW4gYmUgb21pdHRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBPbiB0aGUgUG93ZXJQQyBjcHUgcG9pbnRlcnMgYW5kIDMyYml0ICAgICAgICAgICAgICAgKi8KKy8qICBpbnRlZ2VycyBoYXZlIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uIGFuZCBjYW4gdXNlICAgKi8KKy8qICB0aGUgc2FtZSByZWdpc3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IG9wPW8mTlEsdHA9dCZOUTsKKyAgaWYoKG9wPT1JTlR8fG9wPT1MT05HfHxvcD09UE9JTlRFUikmJih0cD09SU5UfHx0cD09TE9OR3x8dHA9PVBPSU5URVIpKQorICAgIHJldHVybiAwOworICBpZihvcD09RE9VQkxFJiZ0cD09TERPVUJMRSkgcmV0dXJuIDA7CisgIGlmKG9wPT1MRE9VQkxFJiZ0cD09RE9VQkxFKSByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgZ2VuX2RzKEZJTEUgKmYsem1heCBzaXplLHN0cnVjdCBUeXAgKnQpCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIDxzaXplPiBieXRlcyBvZiBzdG9yYWdlICovCisvKiAgaW5pdGlhbGl6ZWQgd2l0aCB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGlmKG5ld29iaiYmc2VjdGlvbiE9U1BFQ0lBTCkKKyAgICBlbWl0KGYsIiVsZFxuIix6bTJsKHNpemUpKTsKKyAgZWxzZQorICAgIGVtaXQoZiwiXHQuc3BhY2VcdCVsZFxuIix6bTJsKHNpemUpKTsKKyAgbmV3b2JqPTA7Cit9CisKK3ZvaWQgZ2VuX2FsaWduKEZJTEUgKmYsem1heCBhbGlnbikKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBtYWtlIHN1cmUgdGhlIG5leHQgZGF0YSBpcyAgICAgKi8KKy8qICBhbGlnbmVkIHRvIG11bHRpcGxlcyBvZiA8YWxpZ24+IGJ5dGVzLiAgICAgICAgICAgICAgKi8KK3sKKyAgaWYoem0ybChhbGlnbik+MSkgZW1pdChmLCJcdC5hbGlnblx0MlxuIik7Cit9CisKK3ZvaWQgZ2VuX3Zhcl9oZWFkKEZJTEUgKmYsc3RydWN0IFZhciAqdikKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjcmVhdGUgdGhlIGhlYWQgb2YgYSB2YXJpYWJsZSAgKi8KKy8qICBkZWZpbml0aW9uLCBpLmUuIHRoZSBsYWJlbCBhbmQgaW5mb3JtYXRpb24gZm9yICAgICAgKi8KKy8qICBsaW5rYWdlIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGNvbnN0ZmxhZztjaGFyICpzZWM7CisgIGlmKHYtPmNsaXN0KSBjb25zdGZsYWc9aXNfY29uc3Qodi0+dnR5cCk7CisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQyl7CisgICAgaWYoSVNGVU5DKHYtPnZ0eXAtPmZsYWdzKSkgcmV0dXJuOworICAgIGlmKCFzcGVjaWFsX3NlY3Rpb24oZix2KSl7CisgICAgICBpZih2LT5jbGlzdCYmKCFjb25zdGZsYWd8fChnX2ZsYWdzWzJdJlVTRURGTEFHKSkmJnNlY3Rpb24hPURBVEEpe2VtaXQoZixkYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1EQVRBO30KKyAgICAgIGlmKHYtPmNsaXN0JiZjb25zdGZsYWcmJiEoZ19mbGFnc1syXSZVU0VERkxBRykmJnNlY3Rpb24hPVJPREFUQSl7ZW1pdChmLHJvZGF0YW5hbWUpO2lmKGYpIHNlY3Rpb249Uk9EQVRBO30KKyAgICAgIGlmKCF2LT5jbGlzdCYmc2VjdGlvbiE9QlNTKXtlbWl0KGYsYnNzbmFtZSk7aWYoZikgc2VjdGlvbj1CU1M7fQorICAgIH0KKyAgICBpZih2LT5jbGlzdHx8c2VjdGlvbj09U1BFQ0lBTCl7CisgICAgICBnZW5fYWxpZ24oZixmYWxpZ24odi0+dnR5cCkpOworICAgICAgZW1pdChmLCIlcyVsZDpcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgfWVsc2UKKyAgICAgIGVtaXQoZiwiXHQubGNvbW1cdCVzJWxkLCIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgbmV3b2JqPTE7CisgIH0KKyAgaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKKyAgICBlbWl0KGYsIlx0Lmdsb2JsXHQlcyVzXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgIGlmKHYtPmZsYWdzJihERUZJTkVEfFRFTlRBVElWRSkpeworICAgICAgaWYoIXNwZWNpYWxfc2VjdGlvbihmLHYpKXsKKwlpZih2LT5jbGlzdCYmKCFjb25zdGZsYWd8fChnX2ZsYWdzWzJdJlVTRURGTEFHKSkmJnNlY3Rpb24hPURBVEEpe2VtaXQoZixkYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1EQVRBO30KKwlpZih2LT5jbGlzdCYmY29uc3RmbGFnJiYhKGdfZmxhZ3NbMl0mVVNFREZMQUcpJiZzZWN0aW9uIT1ST0RBVEEpe2VtaXQoZixyb2RhdGFuYW1lKTtpZihmKSBzZWN0aW9uPVJPREFUQTt9CisJaWYoIXYtPmNsaXN0JiZzZWN0aW9uIT1CU1Mpe2VtaXQoZixic3NuYW1lKTtpZihmKSBzZWN0aW9uPUJTUzt9CisgICAgICB9CisgICAgICBpZih2LT5jbGlzdHx8c2VjdGlvbj09U1BFQ0lBTCl7CisJZ2VuX2FsaWduKGYsZmFsaWduKHYtPnZ0eXApKTsKKyAgICAgICAgZW1pdChmLCIlcyVzOlxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICAgIH1lbHNlCisgICAgICAgIGVtaXQoZiwiXHQuZ2xvYmFsXHQlcyVzXG5cdC4lc2NvbW1cdCVzJXMsIixpZHByZWZpeCx2LT5pZGVudGlmaWVyLChVU0VfQ09NTU9OUz8iIjoibCIpLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgICAgbmV3b2JqPTE7CisgICAgfQorICB9Cit9CisKK3ZvaWQgZ2VuX2RjKEZJTEUgKmYsaW50IHQsc3RydWN0IGNvbnN0X2xpc3QgKnApCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIHN0YXRpYyBzdG9yYWdlICAgICAgICAgICovCisvKiAgaW5pdGlhbGl6ZWQgd2l0aCBjb25zdC1saXN0IHAuICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGVtaXQoZiwiXHRkYy4lc1x0IixkdCh0Jk5RKSk7CisgIGlmKCFwLT50cmVlKXsKKyAgICBpZihJU0ZMT0FUKHQpKXsKKyAgICAgIC8qICBhdWNoIHdpZWRlciBuaWNodCBzZWhyIHNjaG9lbiB1bmQgSUVFRSBub2V0aWcgICAqLworICAgICAgdW5zaWduZWQgY2hhciAqaXA7CisgICAgICBpcD0odW5zaWduZWQgY2hhciAqKSZwLT52YWwudmRvdWJsZTsKKyAgICAgIGVtaXQoZiwiMHglMDJ4JTAyeCUwMnglMDJ4IixpcFswXSxpcFsxXSxpcFsyXSxpcFszXSk7CisgICAgICBpZigodCZOUSkhPUZMT0FUKXsKKwllbWl0KGYsIiwweCUwMnglMDJ4JTAyeCUwMngiLGlwWzRdLGlwWzVdLGlwWzZdLGlwWzddKTsKKyAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgIGVtaXR2YWwoZiwmcC0+dmFsLHQmTlUpOworICAgIH0KKyAgfWVsc2V7CisgICAgZW1pdF9vYmooZiwmcC0+dHJlZS0+byx0Jk5VKTsKKyAgfQorICBlbWl0KGYsIlxuIik7bmV3b2JqPTA7Cit9CisKKworLyogIFRoZSBtYWluIGNvZGUtZ2VuZXJhdGlvbiByb3V0aW5lLiAgICAgICAgICAgICAgICAgICAqLworLyogIGYgaXMgdGhlIHN0cmVhbSB0aGUgY29kZSBzaG91bGQgYmUgd3JpdHRlbiB0by4gICAgICAqLworLyogIHAgaXMgYSBwb2ludGVyIHRvIGEgZG91Ymx5IGxpbmtlZCBsaXN0IG9mIElDcyAgICAgICAqLworLyogIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIGJvZHkgdG8gZ2VuZXJhdGUgY29kZSBmb3IuICAqLworLyogIHYgaXMgYSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAqLworLyogIG9mZnNldCBpcyB0aGUgc2l6ZSBvZiB0aGUgc3RhY2tmcmFtZSB0aGUgZnVuY3Rpb24gICAqLworLyogIG5lZWRzIGZvciBsb2NhbCB2YXJpYWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCit2b2lkIGdlbl9jb2RlKEZJTEUgKmYsc3RydWN0IElDICpwLHN0cnVjdCBWYXIgKnYsem1heCBvZmZzZXQpCisvKiAgVGhlIG1haW4gY29kZS1nZW5lcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgYyx0LGk7CisgIHN0cnVjdCBJQyAqbTsKKyAgYXJnc2l6ZT0wOworICBpZihERUJVRyYxKSBwcmludGYoImdlbl9jb2RlKClcbiIpOworICBmb3IoYz0xO2M8PU1BWFI7YysrKSByZWdzW2NdPXJlZ3NhW2NdOworICBtYXhwdXNoZWQ9MDsKKworICAvKkZJWE1FKi8KKyAgcmV0PSJcdHJ0c1xuIjsKKworICBmb3IobT1wO207bT1tLT5uZXh0KXsKKyAgICBjPW0tPmNvZGU7dD1tLT50eXBmJk5VOworICAgIGlmKGM9PUFMTE9DUkVHKSB7cmVnc1ttLT5xMS5yZWddPTE7Y29udGludWU7fQorICAgIGlmKGM9PUZSRUVSRUcpIHtyZWdzW20tPnExLnJlZ109MDtjb250aW51ZTt9CisKKyAgICAvKiBjb252ZXJ0IE1VTFQvRElWL01PRCB3aXRoIHBvd2VycyBvZiB0d28gKi8KKyAgICBpZigodCZOUSk8PUxPTkcmJihtLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCYmKHQmTlEpPD1MT05HJiYoYz09TVVMVHx8KChjPT1ESVZ8fGM9PU1PRCkmJih0JlVOU0lHTkVEKSkpKXsKKyAgICAgIGV2YWxfY29uc3QoJm0tPnEyLnZhbCx0KTsKKyAgICAgIGk9cG9mMih2bWF4KTsKKyAgICAgIGlmKGkpeworICAgICAgICBpZihjPT1NT0QpeworICAgICAgICAgIHZtYXg9em1zdWIodm1heCxsMnptKDFMKSk7CisgICAgICAgICAgbS0+Y29kZT1BTkQ7CisgICAgICAgIH1lbHNleworICAgICAgICAgIHZtYXg9bDJ6bShpLTEpOworICAgICAgICAgIGlmKGM9PURJVikgbS0+Y29kZT1SU0hJRlQ7IGVsc2UgbS0+Y29kZT1MU0hJRlQ7CisgICAgICAgIH0KKyAgICAgICAgYz1tLT5jb2RlOworCWd2YWwudm1heD12bWF4OworCWV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKKwlpZihjPT1BTkQpeworCSAgaW5zZXJ0X2NvbnN0KCZtLT5xMi52YWwsdCk7CisJfWVsc2V7CisJICBpbnNlcnRfY29uc3QoJm0tPnEyLnZhbCxJTlQpOworCSAgcC0+dHlwZjI9SU5UOworCX0KKyAgICAgIH0KKyAgICB9CisjaWYgRklYRURfU1AKKyAgICBpZihjPT1DQUxMJiZhcmdzaXplPHptMmwobS0+cTIudmFsLnZtYXgpKSBhcmdzaXplPXptMmwobS0+cTIudmFsLnZtYXgpOworI2VuZGlmCisgIH0KKyAgcGVlcGhvbGUocCk7CisKKyAgZm9yKGM9MTtjPD1NQVhSO2MrKyl7CisgICAgaWYocmVnc2FbY118fHJlZ3VzZWRbY10peworICAgICAgQlNFVChyZWdzX21vZGlmaWVkLGMpOworICAgIH0KKyAgfQorCisgIGxvY2Fsc2l6ZT0oem0ybChvZmZzZXQpKzMpLzQqNDsKKyNpZiBGSVhFRF9TUAorICAvKkZJWE1FOiBhZGp1c3QgbG9jYWxzaXplIHRvIGdldCBhbiBhbGlnbmVkIHN0YWNrLWZyYW1lICovCisjZW5kaWYKKworICBmdW5jdGlvbl90b3AoZix2LGxvY2Fsc2l6ZSk7CisKKyNpZiBGSVhFRF9TUAorICBwdXNoZWQ9MDsKKyNlbmRpZgorCisgIGZvcig7cDtwPXAtPm5leHQpeworICAgIGM9cC0+Y29kZTt0PXAtPnR5cGY7CisgICAgaWYoYz09Tk9QKSB7cC0+ei5mbGFncz0wO2NvbnRpbnVlO30KKyAgICBpZihjPT1BTExPQ1JFRykge3JlZ3NbcC0+cTEucmVnXT0xO2NvbnRpbnVlO30KKyAgICBpZihjPT1GUkVFUkVHKSB7cmVnc1twLT5xMS5yZWddPTA7Y29udGludWU7fQorICAgIGlmKGM9PUxBQkVMKSB7ZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsdCk7Y29udGludWU7fQorICAgIGlmKGM9PUJSQSl7CisgICAgICBpZigwLyp0PT1leGl0X2xhYmVsJiZmcmFtZXNpemU9PTAqLykKKwllbWl0KGYscmV0KTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIlx0Ylx0JXMlZFxuIixsYWJwcmVmaXgsdCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz49QkVRJiZjPEJSQSl7CisgICAgICBlbWl0KGYsIlx0YiVzXHQiLGNjc1tjLUJFUV0pOworICAgICAgaWYoaXNyZWcocTEpKXsKKwllbWl0X29iaihmLCZwLT5xMSwwKTsKKwllbWl0KGYsIiwiKTsKKyAgICAgIH0KKyAgICAgIGVtaXQoZiwiJXMlZFxuIixsYWJwcmVmaXgsdCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09TU9WRVRPUkVHKXsKKyAgICAgIGxvYWRfcmVnKGYscC0+ei5yZWcsJnAtPnExLHJlZ3R5cGVbcC0+ei5yZWddLT5mbGFncyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09TU9WRUZST01SRUcpeworICAgICAgc3RvcmVfcmVnKGYscC0+ei5yZWcsJnAtPnExLHJlZ3R5cGVbcC0+ei5yZWddLT5mbGFncyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoKGM9PUFTU0lHTnx8Yz09UFVTSCkmJigodCZOUSk+UE9JTlRFUnx8KCh0Jk5RKT09Q0hBUiYmem0ybChwLT5xMi52YWwudm1heCkhPTEpKSl7CisgICAgICBpZXJyb3IoMCk7CisgICAgfQorICAgIHA9cHJlbG9hZChmLHApOworICAgIGM9cC0+Y29kZTsKKyAgICBpZihjPT1TVUJQRlApIGM9U1VCOworICAgIGlmKGM9PUFEREkyUCkgYz1BREQ7CisgICAgaWYoYz09U1VCSUZQKSBjPVNVQjsKKyAgICBpZihjPT1DT05WRVJUKXsKKyAgICAgIGlmKElTRkxPQVQocTF0eXAocCkpfHxJU0ZMT0FUKHp0eXAocCkpKSBpZXJyb3IoMCk7CisgICAgICBpZihzaXpldGFiW3ExdHlwKHApJk5RXTxzaXpldGFiW3p0eXAocCkmTlFdKXsKKwlpZihxMXR5cChwKSZVTlNJR05FRCkKKwkgIGVtaXQoZiwiXHR6ZXh0LiVzXHQlc1xuIixkdChxMXR5cChwKSkscmVnbmFtZXNbenJlZ10pOworCWVsc2UKKwkgIGVtaXQoZiwiXHRzZXh0LiVzXHQlc1xuIixkdChxMXR5cChwKSkscmVnbmFtZXNbenJlZ10pOworICAgICAgfQorICAgICAgc2F2ZV9yZXN1bHQoZixwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1LT01QTEVNRU5UKXsKKyAgICAgIGxvYWRfcmVnKGYsenJlZywmcC0+cTEsdCk7CisgICAgICBlbWl0KGYsIlx0Y3BsLiVzXHQlc1xuIixkdCh0KSxyZWduYW1lc1t6cmVnXSk7CisgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PVNFVFJFVFVSTil7CisgICAgICBsb2FkX3JlZyhmLHAtPnoucmVnLCZwLT5xMSx0KTsKKyAgICAgIEJTRVQocmVnc19tb2RpZmllZCxwLT56LnJlZyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09R0VUUkVUVVJOKXsKKyAgICAgIGlmKHAtPnExLnJlZyl7CisgICAgICAgIHpyZWc9cC0+cTEucmVnOworCXNhdmVfcmVzdWx0KGYscCk7CisgICAgICB9ZWxzZQorICAgICAgICBwLT56LmZsYWdzPTA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09Q0FMTCl7CisgICAgICBpbnQgcmVnOworICAgICAgLypGSVhNRSovCisjaWYgMCAgICAgIAorICAgICAgaWYoc3RhY2tfdmFsaWQmJihwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiZwLT5xMS52LT5maSYmKHAtPnExLnYtPmZpLT5mbGFncyZBTExfU1RBQ0spKXsKKwlpZihmcmFtZXNpemUrenVtMnVsKHAtPnExLnYtPmZpLT5zdGFjazEpPnN0YWNrKQorCSAgc3RhY2s9ZnJhbWVzaXplK3p1bTJ1bChwLT5xMS52LT5maS0+c3RhY2sxKTsKKyAgICAgIH1lbHNlCisJc3RhY2tfdmFsaWQ9MDsKKyNlbmRpZgorICAgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJnAtPnExLnYtPmZpJiZwLT5xMS52LT5maS0+aW5saW5lX2FzbSl7CisgICAgICAgIGVtaXRfaW5saW5lX2FzbShmLHAtPnExLnYtPmZpLT5pbmxpbmVfYXNtKTsKKyAgICAgIH1lbHNleworCWVtaXQoZiwiXHRjYWxsXHQiKTsKKwllbWl0X29iaihmLCZwLT5xMSx0KTsKKwllbWl0KGYsIlxuIik7CisgICAgICB9CisgICAgICAvKkZJWE1FKi8KKyNpZiBGSVhFRF9TUAorICAgICAgcHVzaGVkLT16bTJsKHAtPnEyLnZhbC52bWF4KTsKKyNlbmRpZgorICAgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJnAtPnExLnYtPmZpJiYocC0+cTEudi0+ZmktPmZsYWdzJkFMTF9SRUdTKSl7CisJYnZ1bml0ZShyZWdzX21vZGlmaWVkLHAtPnExLnYtPmZpLT5yZWdzX21vZGlmaWVkLFJTSVpFKTsKKyAgICAgIH1lbHNleworCWludCBpOworCWZvcihpPTE7aTw9TUFYUjtpKyspeworCSAgaWYocmVnc2NyYXRjaFtpXSkgQlNFVChyZWdzX21vZGlmaWVkLGkpOworCX0KKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1BU1NJR058fGM9PVBVU0gpeworICAgICAgaWYodD09MCkgaWVycm9yKDApOworICAgICAgaWYoYz09UFVTSCl7CisjaWYgRklYRURfU1AKKwllbWl0KGYsIlx0bW92LiVzXHQlbGQoJXMpLCIsZHQodCkscHVzaGVkLHJlZ25hbWVzW3NwXSk7CisJZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJZW1pdChmLCJcbiIpOworCXB1c2hlZCs9em0ybChwLT5xMi52YWwudm1heCk7CisjZWxzZQorCWVtaXQoZiwiXHRwdXNoLiVzXHQiLGR0KHQpKTsKKwllbWl0X29iaihmLCZwLT5xMSx0KTsKKwllbWl0KGYsIlxuIik7CisJcHVzaCh6bTJsKHAtPnEyLnZhbC52bWF4KSk7CisjZW5kaWYKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PUFTU0lHTil7CisJbG9hZF9yZWcoZix6cmVnLCZwLT5xMSx0KTsKKwlzYXZlX3Jlc3VsdChmLHApOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PUFERFJFU1MpeworICAgICAgbG9hZF9hZGRyZXNzKGYsenJlZywmcC0+cTEsUE9JTlRFUik7CisgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PU1JTlVTKXsKKyAgICAgIGxvYWRfcmVnKGYsenJlZywmcC0+cTEsdCk7CisgICAgICBlbWl0KGYsIlx0bmVnLiVzXHQlc1xuIixkdCh0KSxyZWduYW1lc1t6cmVnXSk7CisgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PVRFU1QpeworICAgICAgZW1pdChmLCJcdHRzdC4lc1x0IixkdCh0KSk7CisgICAgICBpZihtdWx0aXBsZV9jY3MpCisJZW1pdChmLCIlcywiLHJlZ25hbWVzW3pyZWddKTsKKyAgICAgIGVtaXRfb2JqKGYsJnAtPnExLHQpOworICAgICAgZW1pdChmLCJcbiIpOworICAgICAgaWYobXVsdGlwbGVfY2NzKQorCXNhdmVfcmVzdWx0KGYscCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09Q09NUEFSRSl7CisgICAgICBlbWl0KGYsIlx0Y21wLiVzXHQiLGR0KHQpKTsKKyAgICAgIGlmKG11bHRpcGxlX2NjcykKKwllbWl0KGYsIiVzLCIscmVnbmFtZXNbenJlZ10pOworICAgICAgZW1pdF9vYmooZiwmcC0+cTEsdCk7CisgICAgICBlbWl0KGYsIiwiKTsKKyAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHQpOworICAgICAgZW1pdChmLCJcbiIpOworICAgICAgaWYobXVsdGlwbGVfY2NzKQorCXNhdmVfcmVzdWx0KGYscCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoKGM+PU9SJiZjPD1BTkQpfHwoYz49TFNISUZUJiZjPD1NT0QpKXsKKyAgICAgIGlmKCFUSFJFRV9BRERSKQorCWxvYWRfcmVnKGYsenJlZywmcC0+cTEsdCk7CisgICAgICBpZihjPj1PUiYmYzw9QU5EKQorCWVtaXQoZiwiXHQlcy4lc1x0JXMsIixsb2dpY2Fsc1tjLU9SXSxkdCh0KSxyZWduYW1lc1t6cmVnXSk7CisgICAgICBlbHNlCisJZW1pdChmLCJcdCVzLiVzXHQlcywiLGFyaXRobWV0aWNzW2MtTFNISUZUXSxkdCh0KSxyZWduYW1lc1t6cmVnXSk7CisgICAgICBpZihUSFJFRV9BRERSKXsKKwllbWl0X29iaihmLCZwLT5xMSx0KTsKKwllbWl0KGYsIiwiKTsKKyAgICAgIH0KKyAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHQpOworICAgICAgZW1pdChmLCJcbiIpOworICAgICAgc2F2ZV9yZXN1bHQoZixwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBwcmljMihzdGRvdXQscCk7CisgICAgaWVycm9yKDApOworICB9CisgIGZ1bmN0aW9uX2JvdHRvbShmLHYsbG9jYWxzaXplKTsKKyAgaWYoc3RhY2tfdmFsaWQpeworICAgIGlmKCF2LT5maSkgdi0+Zmk9bmV3X2ZpKCk7CisgICAgdi0+ZmktPmZsYWdzfD1BTExfU1RBQ0s7CisgICAgdi0+ZmktPnN0YWNrMT1zdGFjazsKKyAgfQorICBlbWl0KGYsIiMgc3RhY2tzaXplPSVsdSVzXG4iLHp1bTJ1bChzdGFjayksc3RhY2tfdmFsaWQ/IiI6Iis/PyIpOworfQorCitpbnQgc2hvcnRjdXQoaW50IGNvZGUsaW50IHR5cCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK2ludCByZWdfcGFybShzdHJ1Y3QgcmVnX2hhbmRsZSAqbSwgc3RydWN0IFR5cCAqdCxpbnQgdmFyYXJnLHN0cnVjdCBUeXAgKmQpCit7CisgIGludCBmOworICBmPXQtPmZsYWdzJk5ROworICBpZihmPD1MT05HfHxmPT1QT0lOVEVSKXsKKyAgICBpZihtLT5ncmVncz49R1BSX0FSR1MpCisgICAgICByZXR1cm4gMDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gRklSU1RfR1BSKzMrbS0+Z3JlZ3MrKzsKKyAgfQorICBpZihJU0ZMT0FUKGYpKXsKKyAgICBpZihtLT5mcmVncz49RlBSX0FSR1MpCisgICAgICByZXR1cm4gMDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gRklSU1RfRlBSKzIrbS0+ZnJlZ3MrKzsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IGhhbmRsZV9wcmFnbWEoY29uc3QgY2hhciAqcykKK3sKK30KK3ZvaWQgY2xlYW51cF9jZyhGSUxFICpmKQoreworfQordm9pZCBjbGVhbnVwX2RiKEZJTEUgKmYpCit7CisgIGlmKGYpIHNlY3Rpb249LTE7Cit9CisKZGlmZiAtLWdpdCBhL21hY2hpbmVzL2R2L21hY2hpbmUuZHQgYi9tYWNoaW5lcy9kdi9tYWNoaW5lLmR0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZhNzlkYmEKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9kdi9tYWNoaW5lLmR0CkBAIC0wLDAgKzEsMTYgQEAKK1MzMkJTTEUKK1MzMkJVTEUKK1MzMkJTTEUgUzMyQlNCRQorUzMyQlVMRSBTMzJCVUJFCitTMzJCU0xFIFMzMkJTQkUKK1MzMkJVTEUgUzMyQlVCRQorUzMyQlNMRSBTMzJCU0JFCitTMzJCVUxFIFMzMkJVQkUKK1M2NEJTTEUgUzY0QlNCRQorUzY0QlVMRSBTNjRCVUJFCitTMzJCSUVFRUxFCitTNjRCSUVFRUxFCitTNjRCSUVFRUxFCitTNjRCVUxFIFM2NEJVQkUKKworCmRpZmYgLS1naXQgYS9tYWNoaW5lcy9kdi9tYWNoaW5lLmggYi9tYWNoaW5lcy9kdi9tYWNoaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2M0OTM3MQotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL2R2L21hY2hpbmUuaApAQCAtMCwwICsxLDEyNyBAQAorLyogIAorICAgIERhbHZpayBiYWNrZW5kIGZvciB2YmNjCisqLworCisjaW5jbHVkZSAiZHQuaCIKKworLyogIFRoaXMgc3RydWN0IGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBtYWNoaW5lLXNwZWNpZmljICAgICAgICAgICAqLworLyogIGFkZHJlc3NpbmctbW9kZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEN1cnJlbnRseSBwb3NzaWJsZSBhcmUgKGNvbnN0LGdwcikgYW5kIChncHIsZ3ByKSAgICAgICAgICAgICAgICAqLworc3RydWN0IEFkZHJlc3NpbmdNb2RleworICAgIGludCBmbGFnczsKKyAgICBpbnQgYmFzZTsKKyAgICBsb25nIG9mZnNldDsKK307CisKKy8qICBUaGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUuICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1BSUyAyNTYKKyNkZWZpbmUgUEFJUlMgKEdQUlMvMikKKyNkZWZpbmUgTUFYUiAoR1BSUyArIFBBSVJTKQorCisvKiAgTnVtYmVyIG9mIGNvbW1hbmRsaW5lLW9wdGlvbnMgdGhlIGNvZGUtZ2VuZXJhdG9yIGFjY2VwdHMuICAgICAgICovCisjZGVmaW5lIE1BWEdGIDIwCisKKy8qICBJZiB0aGlzIGlzIHNldCB0byB6ZXJvIHZiY2Mgd2lsbCBub3QgZ2VuZXJhdGUgSUNzIHdoZXJlIHRoZSAgICAgKi8KKy8qICB0YXJnZXQgb3BlcmFuZCBpcyB0aGUgc2FtZSBhcyB0aGUgMm5kIHNvdXJjZSBvcGVyYW5kLiAgICAgICAgICAgKi8KKy8qICBUaGlzIGNhbiBzb21ldGltZXMgc2ltcGxpZnkgdGhlIGNvZGUtZ2VuZXJhdG9yLCBidXQgdXN1YWxseSAgICAgKi8KKy8qICB0aGUgY29kZSBpcyBiZXR0ZXIgaWYgdGhlIGNvZGUtZ2VuZXJhdG9yIGFsbG93cyBpdC4gICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNFUTJBU1ogMQorCisvKiAgVGhpcyBzcGVjaWZpZXMgdGhlIHNtYWxsZXN0IGludGVnZXIgdHlwZSB0aGF0IGNhbiBiZSBhZGRlZCB0byBhICovCisvKiAgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZuZGVmIERWX0JZVEU4CisjZGVmaW5lIE1JTkFEREkyUCBDSEFSCisjZWxzZQorI2RlZmluZSBNSU5BRERJMlAgSU5UCisjZW5kaWYKKworLyogIElmIHRoZSBieXRlcyBvZiBhbiBpbnRlZ2VyIGFyZSBvcmRlcmVkIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSAgICAqLworLyogIGJ5dGUgZmlyc3QgYW5kIHRoZW4gZGVjcmVhc2luZyBzZXQgQklHRU5ESUFOIHRvIDEuICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdFTkRJQU4gMAorCisvKiAgSWYgdGhlIGJ5dGVzIG9mIGFuIGludGVnZXIgYXJlIG9yZGVyZWQgbGVzdCBzaWduaWZpY2FudCBieXRlICAgICovCisvKiAgYnl0ZSBmaXJzdCBhbmQgdGhlbiBpbmNyZWFzaW5nIHNldCBMSVRUTEVFTkRJQU4gdG8gMS4gICAgICAgICAgICovCisjZGVmaW5lIExJVFRMRUVORElBTiAxCisKKy8qICBOb3RlIHRoYXQgQklHRU5ESUFOIGFuZCBMSVRUTEVFTkRJQU4gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gICAgKi8KKworLyogIElmIHN3aXRjaC1zdGF0ZW1lbnRzIHNob3VsZCBiZSBnZW5lcmF0ZWQgYXMgYSBzZXF1ZW5jZSBvZiAgICAgICAqLworLyogIFNVQixUU1QsQkVRIElDcyByYXRoZXIgdGhhbiBDT01QQVJFLEJFUSBJQ3Mgc2V0IHRoaXMgdG8gMS4gICAgICAqLworLyogIFRoaXMgY2FuIHlpZWxkIGJldHRlciBjb2RlIG9uIHNvbWUgbWFjaGluZXMuICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTV0lUQ0hTVUJTIDAKKworLyogIEluIG9wdGltaXppbmcgY29tcGlsYXRpb24gY2VydGFpbiBsaWJyYXJ5IG1lbWNweS9zdHJjcHktY2FsbHMgICAqLworLyogIHdpdGggbGVuZ3RoIGtub3duIGF0IGNvbXBpbGUtdGltZSB3aWxsIGJlIGlubGluZWQgdXNpbmcgYW4gICAgICAqLworLyogIEFTU0lHTi1JQyBpZiB0aGUgc2l6ZSBpcyBsZXNzIG9yIGVxdWFsIHRvIElOTElORU1FTUNQWS4gICAgICAgICAqLworLyogIFRoZSB0eXBlIHVzZWQgZm9yIHRoZSBBU1NJR04tSUMgd2lsbCBiZSBVTlNJR05FRHxDSEFSLiAgICAgICAgICAqLworI2RlZmluZSBJTkxJTkVNRU1DUFkgMTAyNAorCisvKiAgUGFyYW1ldGVycyBhcmUgc29tZXRpbWVzIHBhc3NlZCBpbiByZWdpc3RlcnMgd2l0aG91dCBfX3JlZy4gICAgICovCisjZGVmaW5lIEhBVkVfUkVHUEFSTVMgMQorCisvKiAgUGFyYW1ldGVycyBvbiB0aGUgc3RhY2sgc2hvdWxkIGJlIHB1c2hlZCBpbiBvcmRlciByYXRoZXIgdGhhbiAgICovCisvKiAgaW4gcmV2ZXJzZSBvcmRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9SREVSRURfUFVTSCBGSVhFRF9TUAorCisvKiAgU3RydWN0dXJlIGZvciByZWdfcGFybSgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdHJ1Y3QgcmVnX2hhbmRsZXsKKyAgICB1bnNpZ25lZCBsb25nIHJlZ3M7Cit9OworCisvKiAgV2UgaGF2ZSBzb21lIHRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZSBhdHRyaWJ1dGVzLiAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBVkVfVEFSR0VUX0FUVFJJQlVURVMKKworLyogV2UgaGF2ZSB0YXJnZXQtc3BlY2lmaWMgcHJhZ21hcyAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9QUkFHTUFTCisKKy8qICBXZSBrZWVwIHRyYWNrIG9mIGFsbCByZWdpc3RlcnMgbW9kaWZpZWQgYnkgYSBmdW5jdGlvbi4gICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9SRUdTX01PRElGSUVEIDEKKworLyogV2UgaGF2ZSBhIGltcGxlbWVudCBvdXIgb3duIGNvc3QtZnVuY3Rpb25zIHRvIGFkYXB0IAorICAgcmVnaXN0ZXItYWxsb2NhdGlvbiAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9SQUxMT0MgMQorI2RlZmluZSBjb3N0X21vdmVfcmVnKHgseSkgMQorI2RlZmluZSBjb3N0X2xvYWRfcmVnKHgseSkgMgorI2RlZmluZSBjb3N0X3NhdmVfcmVnKHgseSkgMgorI2RlZmluZSBjb3N0X3B1c2hwb3BfcmVnKHgpIDMKKworLyogc2l6ZSBvZiBidWZmZXIgZm9yIGFzbS1vdXRwdXQsIHRoaXMgY2FuIGJlIHVzZWQgdG8gZG8KKyAgIHBlZXBob2xlLW9wdGltaXphdGlvbnMgb2YgdGhlIGdlbmVyYXRlZCBhc3NlbWJseS1vdXRwdXQgKi8KKyNkZWZpbmUgRU1JVF9CVUZfTEVOIDEwMjQgLyogc2hvdWxkIGJlIGVub3VnaCAqLworLyogbnVtYmVyIG9mIGFzbS1vdXRwdXQgbGluZXMgYnVmZmVyZWQgKi8KKyNkZWZpbmUgRU1JVF9CVUZfREVQVEggNAorCisvKiAgV2UgaGF2ZSBubyBhc21fcGVlcGhvbGUgdG8gb3B0aW1pemUgYXNzZW1ibHktb3V0cHV0ICovCisjZGVmaW5lIEhBVkVfVEFSR0VUX1BFRVBIT0xFIDAKKworLyogd2UgZG8gbm90IGhhdmUgYSBtYXJrX2VmZl9pY3MgZnVuY3Rpb24sIHRoaXMgaXMgdXNlZCB0byBwcmV2ZW50CisgICBvcHRpbWl6YXRpb25zIG9uIGNvZGUgd2hpY2ggY2FuIGFscmVhZHkgYmUgaW1wbGVtZW50ZWQgYnkgZWZmaWNpZW50CisgICBhc3NlbWJseSAqLworI3VuZGVmIEhBVkVfVEFSR0VUX0VGRl9JQworCisvKiB3ZSBvbmx5IG5lZWQgdGhlIHN0YW5kYXJkIGRhdGEgdHlwZXMgKG5vIGJpdC10eXBlcywgZGlmZmVyZW50IHBvaW50ZXJzCisgICBldGMuKSAqLworI3VuZGVmIEhBVkVfRVhUX1RZUEVTCisjdW5kZWYgSEFWRV9UR1RfUFJJTlRWQUwKKworLyogd2UgZG8gbm90IG5lZWQgZXh0cmEgZWxlbWVudHMgaW4gdGhlIElDICovCisjdW5kZWYgSEFWRV9FWFRfSUMKKworLyogd2UgZG8gbm90IHVzZSB1bnNpZ25lZCBpbnQgYXMgc2l6ZV90IChidXQgdW5zaWduZWQgbG9uZywgdGhlIGRlZmF1bHQpICovCisjdW5kZWYgSEFWRV9JTlRfU0laRVQKKworLyogd2UgbmVlZCByZWdpc3Rlci1wYWlycyAqLworIyNkZWZpbmUgSEFWRV9SRUdQQUlSUworCisKKy8qIGRvIG5vdCBjcmVhdGUgQ09OVkVSVCBJQ3MgZnJvbSBpbnRlZ2VycyBzbWFsbGVyIHRoYW4gaW50IHRvIGZsb2F0cyAqLworI2RlZmluZSBNSU5fSU5UX1RPX0ZMT0FUX1RZUEUgSU5UCisKKy8qIGRvIG5vdCBjcmVhdGUgQ09OVkVSVCBJQ3MgZnJvbSBmbG9hdHMgdG8gaW50cyBzbWFsbGVyIHRoYW4gaW50ICovCisjZGVmaW5lIE1JTl9GTE9BVF9UT19JTlRfVFlQRSBJTlQKKworLyogZG8gbm90IGNyZWF0ZSBDT05WRVJUX0lDcyBmcm9tIGZsb2F0cyB0byB1bnNpZ25lZCBpbnRlZ2VycyAqLworI2RlZmluZSBBVk9JRF9GTE9BVF9UT19VTlNJR05FRCAxCisKKy8qIGRvIG5vdCBjcmVhdGUgQ09OVkVSVF9JQ3MgZnJvbSB1bnNpZ25lZCBpbnRlZ2VycyB0byBmbG9hdHMgKi8KKyNkZWZpbmUgQVZPSURfVU5TSUdORURfVE9fRkxPQVQgMQpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvZmFsY28xNi9tYWNoaW5lLmMgYi9tYWNoaW5lcy9mYWxjbzE2L21hY2hpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MWFkYTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvZmFsY28xNi9tYWNoaW5lLmMKQEAgLTAsMCArMSwyNDcwIEBACisvKiAKKyAgIEZBTENPMTYgdjMKKyovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworLyogVE8gRE8KKworLSBJZiBhIEZSRUVSRUcgZm9sbG93cyBhbiBJQyBmb3IgUTEsIHRoZSByZWdpc3RlciBjYW4gYmUgdXNlZCBhcyB0ZW1wb3JhcnkuCitlLmcgaWYgd2UgZ2V0IGEgPSBSMCArIGMsIGFuZCB0aGVyZSdzIGEgRlJFRVJFRyBSMCBmb2xsb3dpbmcgdGhlIElDLCB3ZSBjYW4gZ2VuZXJhdGUKK2FkZCByMCwgW2NdCittb3YgW2FdLCByMAoraW5zdGVhZCBvZgorbW92IHIxLCByMAorYWRkIHIxLCBbY10KK21vdiBbYV0sIHIxCisKKy0tIGZsb2F0aW5nIHBvaW50IGNhcGFiaWxpdHkgbXVzdCBhbHNvIGJlIGltcGxlbWVudGVkCisKKy0gZGF0YSBhbGlnbmVtZW50IGRvZXNuJ3Qgd29yaywgZzEgc2hvdWxkIGJlIGFsaWduZWQgYmVsb3cuCistLSBJcyB0aGlzIHN1cHBvc2VkIHRvIGJlIGhhbmRsZWQgYnkgdGhlIGFzc2VtYmxlcj8KK2NoYXIgZ2xvYmFsID0gNDsKK2ludCBnMSA9IDU7CisKKy0tIGNvbmRpdGlvbmFsIGJyYW5jaGluZyBmb3IgTE9ORyB3b3JrcywgYnV0IHRlbXBvcmFyeSByZWdpc3RlciBoYW5kbGluZyBpcyBub3QgaWRlYWwuCisgICBSZWdpc3RlciBhcmUgbG9hZGVkIG1vcmUgdGhhbiByZXF1aXJlZC4KKworLS0gaW5saW5lIG9wdGltaXphdGlvbiBtdXN0IGJlIGRvbmUsIGUuZyBzaGlmdCBieSBjb25zdCwgbXVsL2RpdiBieSAyCisKKy0tIGNhbGwgcHRyIG5vdCBpbXBsZW1lbnRlZC4KKworLS0gcmVnaXN0ZXIgcGFyYW1ldGVyIHBhc3NpbmcKKworLS0gMWFyZyBvcGVyYXRpb24gYXJlIGN1cnJlbnRseSBvbmx5IHVzaW5nIHJlZyBhcmd1bWVudHMKKworLS0gY291bGQgdGFrZSBhZHZhbnRhZ2Ugb2YgW3JlZytvZnNdIGFkZHJlc3NpbmcgbW9kZSBieSBjb21iaW5pbmcgSUMKKworLS0gSVJRcyBzaG91bGQgb25seSBzYXZlIHJlZ2lzdGVycyB3aGljaCBhcmUgYWN0dWFsbHkgdXNlZCwgaW4gY2FzZSBvZiBmdW5jdGlvbiBjYWxsIGFsbCByZWdzIG11c3QgYmUgc2F2ZWQKKy0tIGltcGxlbWVudCAibmFrZWQiIGtleXdvcmQgZm9yIFJUT1MgdXNlLgorCistLSByaWdodCBub3cgbGliX21vdiBpcyBkb25lIGJ5IG1lc3Npbmcgd2l0aCB0aGUgSUMgb3BlcmFuZHMgY2hhbmdpbmcgdGhlbSBpbnRvIHBvaW50ZXJzLiBJdCBpcyBwcm9iYWJseSBiZXR0ZXIgdG8KKyAgIHVzZSBwdHJfcHVzaCBpbnN0ZWFkIG9mIG1lc3NpZ24gYXJvdW5kIHdpdGggdmFsX3B1c2guCisKKy0tIG11c3QgdXBkYXRlIGFyZ19wdXNoIHRvIHN1cHBvcnQgZG91YmxlLCBsb25nIGxvbmcgYW5kIHN1Y2gsIG5vdCB1c2luZyBtb3JlIHRlbXBlcmFyeSByZWdpc3RlcnMKKworLS0gY29tcGFyZSB3aXRoIEtPTlNUIG5vdCBjb3JyZWN0IHdoZW4gS09OU1QgPSBtYXhpbnQKKworKi8KKworI2luY2x1ZGUgInN1cHAuaCIKKyNpbmNsdWRlICJ2YmMuaCIKKworLy9zdGF0aWMgY2hhciBGSUxFX1tdPV9fRklMRV9fOworCisvKiAgUHVibGljIGRhdGEgdGhhdCBNVVNUIGJlIHRoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogTmFtZSBhbmQgY29weXJpZ2h0LiAqLworY2hhciBjZ19jb3B5cmlnaHRbXT0iZmFsY28xNl92MyBjb2RlIGdlbmVyYXRvciB2MC4xIGJ5IERhbmllbCBTY2hvY2giOworCisvLyBjb21tYW5kIGxpbmUKKy8vLS0tLS0tLS0tLS0tLS0KKy8qICBDb21tYW5kbGluZS1mbGFncyB0aGUgY29kZS1nZW5lcmF0b3IgYWNjZXB0czoKKyAgICAwOiBqdXN0IGEgZmxhZworICAgIFZBTEZMQUc6IGEgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQKKyAgICBTVFJJTkdGTEFHOiBhIHN0cmluZyBjYW4gYmUgc3BlY2lmaWVkCisgICAgRlVOQ0ZMQUc6IGEgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKKyAgICBhcGFydCBmcm9tIEZVTkNGTEFHLCBhbGwgb3RoZXIgdmVyc2lvbnMgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIG9uY2UgKi8KK2ludCBnX2ZsYWdzW01BWEdGXSA9IHtWQUxGTEFHLCBWQUxGTEFHLCBWQUxGTEFHfTsKKworLyogdGhlIGZsYWctbmFtZSwgZG8gbm90IHVzZSBuYW1lcyBiZWdpbm5pbmcgd2l0aCBsLCBMLCBJLCBEIG9yIFUsIGJlY2F1c2UKKyAgIHRoZXkgY29sbGlkZSB3aXRoIHRoZSBmcm9udGVuZCAqLworY2hhciAqZ19mbGFnc19uYW1lW01BWEdGXT17InJlZ3MiLCAicnNhdmUiLCAicnRtcCJ9OworLyogRGVzY3JpcHRpb24gb2YgY29tbWFuZCBsaW5lIG9wdGlvbnM6CityZWdzPTx2YWw+CitERUZBVUxUID0gNgorU3BlY2lmeSB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVycyB0byB1c2UuIE11c3QgYmUgPj0zIGFuZCA8PSAxNC4KK1RoZSB2YWx1ZSBzaG91bGQgbWF0Y2ggdGhlIGFjdHVhbCBDUFUgaW1wbGVtZW50YXRpb24sIHRoZSBkZWZhdWx0IGlzIDYuCitWYWx1ZXMgPCA2IGRvbid0IG1ha2UgbXVjaCBwcmFjdGljYWwgc2Vuc2Ugc2luY2UgdGhlcmUgd29uJ3QgYmUKK2Vub3VnaCByZWdpc3RlcnMgYXZhaWxhYmxlIGZvciBlZmZpY2llbnQgY29kZSBnZW5lcmF0aW9uLgorCityc2F2ZT08dmFsPgorREVGQVVMVCA9IGF1dG9tYXRpYworMCA8PSB2YWwgPD0gcmVncy1ydG1wCitTcGVjaWZ5IHRoZSBudW1iZXIgb2Ygbm9uLXNjcmF0Y2ggcmVnaXN0ZXJzIHRvIHVzZS4KK05vbi1zY3JhdGNoIHJlZ2lzdGVycyBhcmUgcmVnaXN0ZXJzIHRoYXQgYXJlIHNhdmVkIGFjcm9zcworZnVuY3Rpb24gY2FsbHMuIFRoZXkgYXJlIHVzZWQgZm9yIGVmZmljaWVudCByZWdpc3RlcgordmFyaWFibGUgaW1wbGVtZW50YXRpb24uCisKK3J0bXA9PHZhbD4KK0RFRkFVTFQgPSAwCiswIDw9IHZhbCA8PSAzCitTcGVjaWZ5IHRoZSBudW1iZXIgb2YgdGVtcG9yYXJ5IHJlZ2lzdGVycyB0byByZXNlcnZlLgorVGVtcG9yYXJ5IHJlZ2lzdGVycyBhcmUgdXNlZCBieSB0aGUgY29kZSBnZW5lcmF0b3IuCitJbiBzaXR1YXRpb24gd2hlcmUgdGhlcmUgaXMgbm8gZnJlZSByZWdpc3RlciBpcyBhdmFpbGFibGUKK2EgcmVnaXN0ZXIgbXVzdCBiZSBzYXZlZCBhbmQgcmVzdG9yZWQuCisKKy8qIHRoZSByZXN1bHRzIG9mIHBhcnNpbmcgdGhlIGNvbW1hbmQtbGluZS1mbGFncyB3aWxsIGJlIHN0b3JlZCBoZXJlICovCit1bmlvbiBwcGkgZ19mbGFnc192YWxbTUFYR0ZdOworCisKKworLy8gZGF0YSB0eXBlcworLy89PT09PT09PT09PT09PT09PT09PT09CisKKy8qICBDSEFSX0JJVCBmb3IgdGhlIHRhcmdldCBtYWNoaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworem1heCBjaGFyX2JpdDsKKworLyogVHlwZW5hbWVzIChuZWVkZWQgYmVjYXVzZSBvZiBIQVZFX0VYVF9UWVBFUykuICovCitjaGFyICp0eXBuYW1lW01BWF9UWVBFKzFdOworCisvKiAgQWxpZ25tZW50LXJlcXVpcmVtZW50cyBmb3IgYWxsIHR5cGVzIGluIGJ5dGVzLiAgICAgICAgICAgICAgKi8KK3ptYXggYWxpZ25bTUFYX1RZUEUrMV07CisKKy8qICBBbGlnbm1lbnQgdGhhdCBpcyBzdWZmaWNpZW50IGZvciBldmVyeSBvYmplY3QuICAgICAgICAgICAgICAqLworem1heCBtYXhhbGlnbjsKKworLyogIHNpemVzIG9mIHRoZSBiYXNpYyB0eXBlcyAoaW4gYnl0ZXMpICovCit6bWF4IHNpemV0YWJbTUFYX1RZUEUrMV07CisKKy8qICBNaW5pbXVtIGFuZCBNYXhpbXVtIHZhbHVlcyBlYWNoIHR5cGUgY2FuIGhhdmUuICAgICAgICAgICAgICAqLworLyogIE11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gaW5pdF9jZygpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IHRfbWluW01BWF9UWVBFKzFdOworenVtYXggdF9tYXhbTUFYX1RZUEUrMV07Cit6dW1heCB0dV9tYXhbTUFYX1RZUEUrMV07CisKKy8vIHJlZ2lzdGVycworLy89PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKiAgTmFtZXMgb2YgYWxsIHJlZ2lzdGVycy4gd2lsbCBiZSBpbml0aWFsaXplZCBpbiBpbml0X2NnKCksCisgICAgcmVnaXN0ZXIgbnVtYmVyIDAgaXMgaW52YWxpZCwgdmFsaWQgcmVnaXN0ZXJzIHN0YXJ0IGF0IDEgKi8KK2NoYXIgKnJlZ25hbWVzW01BWFIrMV07CisKKy8qICBUaGUgU2l6ZSBvZiBlYWNoIHJlZ2lzdGVyIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworem1heCByZWdzaXplW01BWFIrMV07CisKKy8qICBTcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXJzIG1heSBiZSBzY3JhdGNoZWQgYnkgZnVuY3Rpb25zLiAgICAqLworaW50IHJlZ3NjcmF0Y2hbTUFYUisxXTsKKworLyogIHJlZ3NhW3JlZ10hPTAgaWYgYSBjZXJ0YWluIHJlZ2lzdGVyIGlzIGFsbG9jYXRlZCBhbmQgc2hvdWxkICovCisvKiAgbm90IGJlIHVzZWQgYnkgdGhlIGNvbXBpbGVyIHBhc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2ludCByZWdzYVtNQVhSKzFdOworCisvKiBzcGVjaWZpZXMgdGhlIHByaW9yaXR5IGZvciB0aGUgcmVnaXN0ZXItYWxsb2NhdG9yLCBpZiB0aGUgc2FtZQorICAgZXN0aW1hdGVkIGNvc3Qtc2F2aW5nIGNhbiBiZSBvYnRhaW5lZCBieSBzZXZlcmFsIHJlZ2lzdGVycywgdGhlCisgICBvbmUgd2l0aCB0aGUgaGlnaGVzdCBwcmlvcml0eSB3aWxsIGJlIHVzZWQgKi8KK2ludCByZWdfcHJpb1tNQVhSKzFdOworCisvKiAgYSB0eXBlIHdoaWNoIGNhbiBzdG9yZSBlYWNoIHJlZ2lzdGVyLiAqLworc3RydWN0IFR5cCAqcmVndHlwZVtNQVhSKzFdOworCisvKiBhbiBlbXB0eSByZWctaGFuZGxlIHJlcHJlc2VudGluZyBpbml0aWFsIHN0YXRlICovCitzdHJ1Y3QgcmVnX2hhbmRsZQllbXB0eV9yZWdfaGFuZGxlID0gezAsIDB9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFByaXZhdGUgZGF0YSBhbmQgZnVuY3Rpb25zLiAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJU0NPTVBPU0lURSh0KQkoSVNBUlJBWSh0KSB8fCBJU1NUUlVDVCh0KSB8fCBJU1VOSU9OKHQpKQorCisvLyBudW1iZXIgb2YgcmVnaXN0ZXJzIHRvIHVzZSwgdGhpcyBjYW4gYmUgYSBueSB2YWx1ZSBmcm9tIDMgdG8gMTQuCisvLyBBIHZhbHVlIDwgNiBpcyBub3QgcmVjb21tZW5kZWQgYXMgaXQgZG9lcyBub3QgbGVhdmUgYW55IHJlZ2lzdGVycyBmb3IKKy8vIGVmZmljaWVudCBjb2RlIGdlbmVyYXRpb24uCisvLyBUaGUgZGVmYXVsdCBpcyA2LgoraW50IG5yZWdzOworCisvLyByZWdpc3RlciBuYW1lcworI2RlZmluZSBSRUdfRkxBR1MJMQorI2RlZmluZSBSRUdfU1AJCTIKKyNkZWZpbmUgUkVHX1IwCQkzCisjZGVmaW5lIFJFR19SMQkJNAorI2RlZmluZSBSRUdfUjIJCTUKKyNkZWZpbmUgUkVHX1IzCQk2CisjZGVmaW5lIFJFR19SNAkJNworI2RlZmluZSBSRUdfUjUJCTgKKyNkZWZpbmUgUkVHX1I2CQk5CisjZGVmaW5lIFJFR19SNwkJMTAKKyNkZWZpbmUgUkVHX1I4CQkxMQorI2RlZmluZSBSRUdfUjkJCTEyCisjZGVmaW5lIFJFR19SMTAJCTEzCisjZGVmaW5lIFJFR19SMTEJCTE0CisjZGVmaW5lIFJFR19SMTIJCTE1CisjZGVmaW5lIFJFR19SMTMJCTE2CisKKy8vIHJlZ2lzdGVyIHVzYWdlIHRyYWNraW5nIHN5c3RlbQorLy8gQWxsb2NhdGVkIGJ5IEFMTE9DRUcgSUMKKyNkZWZpbmUgVFJBQ0tfQUxMT0NSRUcJMQorLy8gdXNlZCBieSBJQywgbm90IGF2YWlsYWJsZSBhcyB0ZW1wb3JhcnkKKyNkZWZpbmUgVFJBQ0tfSUMJCTIKKy8vIGFsbG9jYXRlZCBhcyB0ZW1wb3JhcnkgYnkgdHJhY2tlcgorI2RlZmluZSBUUkFDS19UTVAJCTQKKy8vIHNhdmVkIAorI2RlZmluZSBUUkFDS19TQVZFRAkJOAorLy8gbm90IHVzYWJsZSBhcyBpbmRpY2F0ZWQgYnkgQ1BVIHJlZ2lzdGVyIGxheW91dAorI2RlZmluZSBUUkFDS19PRkZMSU1JVFMJCTE2CisvLyBkZWRpY2F0ZWQgdGVtcG9yYXJ5IHJlZ2lzdGVyCisjZGVmaW5lIFRSQUNLX0RFRElDQVRFRAkJMzIKKy8vIGJpdHMgaW5kaWNhdGluZyByZWdpc3RlciBpcyB1c2VkIGFuZCBjYW5ub3QgYmUgdXNlZCBubyBtYXR0ZXIgd2hhdAorI2RlZmluZSBUUkFDS19OT0dPCQkoVFJBQ0tfSUMgfCBUUkFDS19UTVAgfCBUUkFDS19PRkZMSU1JVFMpCitpbnQgdHJhY2tfc3RhdHVzW01BWFIrMV07CisKKy8vIFdlIHByb3ZpZGUgMyBzbG90cyBmb3IgdGVtcG9yYXJ5IHJlZ2lzdGVycy4KKy8vIEluIGhlcmUgd2Uga2VlcCB0cmFjayBpZiB3aGljaCBzbG90IGNvbnRhaW5zIHdoaWNoIHJlZ2lzdGVyLgorI2RlZmluZSBUUkFDS19TTE9UUwkJMworaW50IHRyYWNrX3Nsb3RbVFJBQ0tfU0xPVFNdOworCisvKiB1c2VkIHRvIGluaXRpYWxpemUgcmVndHlwW10gKi8KK3N0YXRpYyBzdHJ1Y3QgVHlwIGx0eXAgPSB7IElOVCB9OworCisvKiBtYWNyb3MgZGVmaW5lZCBieSB0aGUgYmFja2VuZCAqLworLy8gZXh0ZW5kZWQgZGF0YSB0eXBlcyBhdHRyaWJ1dGUgc3RyaW5ncworI2RlZmluZSBFWFREQVRBX0lOVEVSUlVQVAkiaW50ZXJydXB0IgorCitzdGF0aWMgY2hhciAJCSptYXJyYXlbXSA9IHsKKyAgICJfX0ZBTENPMTZfXyIsCisgICAiX19pbnRlcnJ1cHQoeCk9X192YXR0cihcImludGVycnVwdChcIiN4XCIpXCIpIiwKKyAgIDAKK307CisKKy8qIHNlY3Rpb25zICovCisjZGVmaW5lIFNFQ19URVhUCTAJCS8vIGNvZGUKKyNkZWZpbmUgU0VDX1JPREFUQQkxCQkvLyBjb25zdGFudCBkYXRhCisjZGVmaW5lIFNFQ19EQVRBCTIJCS8vIGluaXRpYWxpemVkIGRhdGEKKyNkZWZpbmUgU0VDX0JTUwkJMwkJLy8gZGF0YSBpbml0aWFsaXplZCB0byAwCisjZGVmaW5lIFNFQ19WRUNUT1IJNAkJLy8gaXJxIHZlY3RvcnMKK3N0YXRpYyBpbnQJCXNlY3Rpb24gPSAtMTsKK3N0YXRpYyBjaGFyIAkJKnNlY190ZXh0bmFtZSA9ICJjb2RlIiwKKyAgCQkJKnNlY19yb2RhdGFuYW1lID0gImNvbnN0IiwKKyAgCQkJKnNlY19kYXRhbmFtZSA9ICJpZGF0YSIsCisgIAkJCSpzZWNfYnNzbmFtZSA9ICJ6ZGF0YSIsCisgIAkJCSpzZWNfdmVjdG9ybmFtZSA9ICJ2ZWN0b3IiOworCisvKiBhc3NlbWJseS1wcmVmaXhlcyBmb3IgbGFiZWxzIGFuZCBleHRlcm5hbCBpZGVudGlmaWVycyAqLworc3RhdGljIGNoYXIgCQkqbGFiZWxfcHJlZml4ID0gInAiOworc3RhdGljIGNoYXIJCSppZGVudF9wcmVmaXggPSAiXyI7CitzdGF0aWMgaW50CQkJbGFiZWxfY291bnQ7CisKKworLy8gYXNzZW1seSBkYXRhIHN0b3JhZ2Ugc3RyaW5ncworc3RhdGljIGNoYXIgCQkqZGN0W10gPSB7IiIsICJkYiIsICJkdyIsICJkdyIsICJkZCIsICJkZCIsICJkZCIsICJkZCIsICJkZCJ9OworCisKK3N0YXRpYyBsb25nCQlsb2ZmOworc3RhdGljIGxvbmcJCXN0YWNrb2Zmc2V0Oworc3RhdGljIGludAkJbmV3b2JqOworCisKK3N0YXRpYyBsb25nIHBvZjIoenVtYXggeCkKKy8qICBZaWVsZHMgbG9nMih4KSsxIG9kZXIgMC4gKi8KK3sKKyAgIHp1bWF4CXA7CisgICBpbnQJCWxuID0gMTsKKyAgICAKKyAgIHAgPSB1bDJ6dW0oMVVMKTsKKyAgIHdoaWxlIChsbiA8PSAzMiAmJiB6dW1sZXEocCwgeCkpIHsKKyAgICAgIGlmICh6dW1lcXRvKHgsIHApKSByZXR1cm4gbG47CisgICAgICBsbisrOyBwID0genVtYWRkKHAsIHApOworICAgfQorICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIGNvbnN0X2dldChzdHJ1Y3Qgb2JqICp4LCBpbnQgdHlwLCBpbnQgbikKK3sKKyAgIGxvbmcJICAgICAgIHJldDsKKyAgIAorICAgZXZhbF9jb25zdCgmeC0+dmFsLCB0eXApOworICAgcmV0ID0gKHZtYXggPj4gKG4gKiBjaGFyX2JpdCkpICYgMHhmZmZmOworICAgCisgICByZXR1cm4gcmV0OworfSAgIAorCitzdGF0aWMgbG9uZyBvZnNfZ2V0KHN0cnVjdCBvYmogKngpCit7CisgICBsb25nCSAgICByZXQ7CisgICAKKyAgIHJldCA9IDA7CisgICBpZiAoeC0+ZmxhZ3MgJiBWQVIpIHsKKyAgICAgIGlmICh4LT52LT5vZmZzZXQgPCAwKSB7CisgICAgICAgICByZXQgPSAobG9uZykobG9mZi0oeC0+di0+b2Zmc2V0KzIpKyh4LT52YWwudm1heCkpLXN0YWNrb2Zmc2V0KzI7CisgICAgICB9IGVsc2UgeworICAgICAgICAgcmV0ID0gKGxvbmcpKCh4LT52LT5vZmZzZXQpKyh4LT52YWwudm1heCktc3RhY2tvZmZzZXQpOworICAgICAgfQorICAgfSAgCisgICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkIGVtaXRfb2JqZWN0KEZJTEUgKmYsIHN0cnVjdCBvYmogKngsIGludCBuLCBpbnQgdHlwKQoreworICAgbG9uZwkJb2ZzOworCisvLyBjYWxjdWxhdGUgb2Zmc2V0IGludG8gc3RhY2sKKyAgIG9mcyA9IG9mc19nZXQoeCk7CisKKy8vIGFjY2VzcyBtb2RlCisgICBldmFsX2NvbnN0KCZ4LT52YWwsIHR5cCk7CisKKyAgIGlmICh4LT5mbGFncyAmIFJFRykgeworICAgICAgaWYgKHgtPmZsYWdzICYgRFJFRk9CSikgeworLy8gcmVnaXN0ZXIgcG9pbnRlciAnW3JlZytvZnNdJworICAgICAgICAgZW1pdChmLCAiWyVzKyVsZF0iLCByZWduYW1lc1t4LT5yZWddLCBuKTsKKyAgICAgIH0gZWxzZSB7CisvLyByZWdpc3RlciAncmVnJworICAgICAgICAgZW1pdChmLCAiJXMiLCByZWduYW1lc1t4LT5yZWddKTsKKyAgICAgIH0KKyAgIH0gZWxzZSBpZiAoeC0+ZmxhZ3MgJiBLT05TVCkgeworICAgICAgaWYgKHgtPmZsYWdzICYgVkFSQURSKSB7CisvLyBUaGlzIGlzIHRoZSBzcGVjaWFsIGNhc2UgZm9yIHdoaWNoIHRoZSBhZGRyZXNzIG9mIGEgY29uc3RhbnQgbXVzdCBiZSBnZW5lcmF0ZWQuCisvLyBLT05TVHwgVkFSQURSIGlzIG5ldmVyIGdlbmVyYXRlZCBieSB0aGUgZnJvbnQtZW5kLCBidXQgaXQncyBhIG1vZGlmaWVkCisvLyBvYmplY3QgYnkgdGhlIGJhY2stZW5kLiBUaGUgYWRkcmVzcyBvZiBhIGNvbnN0YW50IGlzIHVzZWQgZm9yIEZMT0FUL0RPVUJMRQorLy8gbGlicmFyeSBjYWxsIG9wZXJhdGlvbnMgaW52b2x2aW5nIGEgY29uc3RhbnQuIEFuIGFkZHJlc3MgdG8gYSBjb25zdGFudCBpcyBnZW5lcmF0ZWQgYnkKKy8vIHBsYWNpbmcgdGhlIGNvbnN0YW50IGludG8gc2VjdGlvbiBTRUNfUk9EQVRBIGFuZCBnZW5lcmF0aW5nIGEgcG9pbnRlciB0bworLy8gdGhlIG9iamVjdC4KKy8vIE5PVCBDT01QTEVURSwgbXVzdCBoYXZlIHNvbWUga2luZCBvZiBrb25zdCBjb3VudGVyLgorLy8gMXN0IG5qZWN0IGtvbnN0IGludG8gUk9NIHNlY3Rpb24gICAgICAgICAKKyAgICAgICAgIGVtaXQoZiwgIl9fS09OU1RfIik7CisgICAgICB9IGVsc2UgaWYgKHgtPmZsYWdzICYgRFJFRk9CSikgeworLy8gY29uc3RhbnQgYWRkcmVzcywgZS5nLiBtb3YgWzEyM10sIHIwCisgICAgICAgICBlbWl0KGYsICJbJWxkXSIsIGNvbnN0X2dldCh4LCB0eXAsIG4pKTsgICAgICAKKyAgICAgIH0gZWxzZSB7CisvLyByZWd1bGFyIEtPTlNUIHZhbHVlCisgICAgICAgICBlbWl0KGYsICIlbGQiLCBjb25zdF9nZXQoeCwgdHlwLCBuKSk7CisgICAgICB9CisgICB9IGVsc2UgaWYgKHgtPmZsYWdzICYgVkFSKSB7CisvLyBSRUdVTEFSIFZBUklBQkxFIEFDQ0VTUyAgICAgIAorICAgICAgaWYgKGlzYXV0byh4LT52LT5zdG9yYWdlX2NsYXNzKSkgeworICAgICAgICAgaWYgKHgtPmZsYWdzICYgVkFSQURSKSB7CisvLyB0aGlzIGlzIGEgc3BlY2lhbCBjYXNlIG5vdCBnZW5lcmF0ZWQgYnkgdGhlIGZyb250LWVuZCwgaXQncyBhIG1vZGlmaWVkIG9iamVjdAorLy8gYnkgdGhlIGJhY2sgZW5kIG5lZWRpbmcgdG8gZ2VuZXJhdGUgdGhlIGFkZHJlc3Mgb2YgYSBhdXRvIHZhcmlhYmxlLgorLy8gVGhpcyBpcyB1c2VkIGJ5ICdwdHJfcHVzaCcuIFdoYXQgZXZlbnR1YWxseSBtdXN0IGJlIGdlbmVyYXRlZCBpcworLy8gbW92IHJlZywgc3AKKy8vIGFkZCByZWcsIG9mcytuCisvLyBTaW5jZSB0aGlzIGlzIHRoZSBlbWl0X29iamVjdCBmdW5jdGlvbiB3ZSBvbmx5IGdlbmVyYXRlIHNwIGhlcmUsIHRoZQorLy8gYWRkIHJlZywgb2ZzK24gbXVzdCBiZSBnZW5lcmF0ZWQgYnkgdGhlIGNhbGxlZS4KKyAgICAgICAgICAgIGVtaXQoZiwgInNwIik7CisgICAgICAgICB9IGVsc2UgeworLy8gc3RhY2sgYmFzZWQgdmFsdWUgJ1tzcCtvZnNdJyAgICAgIAorICAgICAgICAgICAgZW1pdChmLCAiW3NwKyVsZF0iLCAobG9uZylvZnMgKyBuKTsKKyAgICAgICAgIH0gCisgICAgICB9IGVsc2UgaWYgKGlzZXh0ZXJuKHgtPnYtPnN0b3JhZ2VfY2xhc3MpKSB7CisgICAgICAgICBpZiAoeC0+ZmxhZ3MgJiBWQVJBRFIpIHsKKy8vIGFkZHJlc3Mgb2YgZ2xvYmFsIHZhcmlhYmxlCisgICAgICAgICAgICBlbWl0KGYsICIlcyVzKyVsZCIsIGlkZW50X3ByZWZpeCwgKGxvbmcpeC0+di0+aWRlbnRpZmllciwgKGxvbmcpeC0+dmFsLnZtYXggKyBuKTsKKyAgICAgICAgIH0gZWxzZSB7CisvLyB2YWx1ZSBvZiBnbG9iYWwgJ1tpZGVudCtvZnNdJyAgICAgICAgCisgICAgICAgICAgICBlbWl0KGYsICJbJXMlcyslbGRdIiwgaWRlbnRfcHJlZml4LCAobG9uZyl4LT52LT5pZGVudGlmaWVyLCAobG9uZyl4LT52YWwudm1heCArIG4pOworICAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChpc3N0YXRpYyh4LT52LT5zdG9yYWdlX2NsYXNzKSkgeworICAgICAgICAgaWYgKHgtPmZsYWdzICYgVkFSQURSKSB7CisvLyBhZGRyZXNzIG9mIHN0YXRpYyB2YXJpYWJsZSAgICAgICAgIAorICAgICAgICAgICAgZW1pdChmLCAiJXMlbGQrJWxkIiwgbGFiZWxfcHJlZml4LCAobG9uZyl4LT52LT5vZmZzZXQsIChsb25nKXgtPnZhbC52bWF4ICsgbik7CisgICAgICAgICB9IGVsc2UgeworLy8gdmFsdWUgb2Ygc3RhdGljIHZhcmlhYmxlICAgICAgICAgCisgICAgICAgICAgICBlbWl0KGYsICJbJXMlbGQrJWxkXSIsIGxhYmVsX3ByZWZpeCwgKGxvbmcpeC0+di0+b2Zmc2V0LCAobG9uZyl4LT52YWwudm1heCArIG4pOworICAgICAgICAgfQorICAgICAgfSBlbHNlIHRlcnJvcigiLS0gZW1pdF9vYmplY3Q6IHVuZXhwZWN0ZWQgc3RvcmFnZSBjbGFzcyIpOworICAgfSBlbHNlIHsgICAKKyAgICAgIHRlcnJvcigiLS0gZW1pdF9vYmplY3Q6IHVuZXhwZWN0ZWQgYWNjZXNzIG1vZGUiKTsKKyAgIH0gIAorfQorCisvKgorTG9hZCBhIHRlbXBvcmFyeSBwdHIgcmVnaXN0ZXIgdG8gYmUgdXNlZCBieSB0aGUgbWFpbiBlbWl0X2xvYWQKK2Z1bmN0aW9uLgorcmV0dXJucyAxLCBpZiBjb2RlIHdhcyBnZW5lcmF0ZWQgdG8gbG9hZCB0aGUgcG9pbnRlci4KK3JldHVybnMgMCwgaWYgbm8gY29kZSB3YXMgbmVjZXNzYXJ5IHNpbmNlIG5vIHRlbXBvcmFyeSBwdHIgaXMgcmVxdWlyZWQuCisqLworc3RhdGljIGludCBlbWl0X3RtcHB0cihGSUxFICpmLCBzdHJ1Y3Qgb2JqICp4LCBpbnQgbikKK3sKKyAgIHN0cnVjdCBBZGRyZXNzaW5nTW9kZSAqYW07CisgICBjaGFyCQkqcmVncHRyX25hbWU7CisgICBpbnQJCXJldDsKKworICAgcmV0ID0gMDsKKyAgIGFtID0geC0+YW07CisgICBpZiAoYW0gJiYgYW0tPnJlZ3B0cikgeworICAgICAgcmV0ID0gMTsKKyAgICAgIHJlZ3B0cl9uYW1lID0gIHJlZ25hbWVzW3gtPmFtLT5yZWdwdHJdOyAgICAgICAgIAorICAgICAgaWYgKG4gPT0gMCkgeworCSBlbWl0KGYsICJcdG1vdlx0JXMsICIsIHJlZ3B0cl9uYW1lKTsKKyAgICAgICAgIGVtaXRfb2JqZWN0KGYsIHgsIDAsIFBPSU5URVIpOworCSBlbWl0KGYsICJcbiIpOworICAgICAgfSBlbHNlIHsKKwkgIC8vICBlbWl0KGYsICJcdGFkZFx0JXMsICVkXG4iLCByZWdwdHJfbmFtZSwgbik7CisgICAgICB9ICAgIAorICAgfQorICAgcmV0dXJuIHJldDsKK30KKworCisvLyBHZW5lcmF0ZSBjb2RlIHRvIHBlcmZvcm0gYSBnaXZlbiBvcGVyYXRpb24uCisvLyBUaGUgY29kZSBnZW5lcmF0ZWQgaXM6CisvLyAgICBvcCAgdCwgcworLy8gdHlwID0gb3BlcmFuZCB0eXBlIChlLmcgQ0hBUiwgUE9JTlRFUiwgSU5UIC4uLikKKy8vIG4gICA9IHRoZSBvZmZzZXQgd2hlbiBkZWFsaW5nIHdpdGggbXVsdGktd29ybGQgb2JqZWN0cyAoZS5nIGxvbmcsIGZsb2F0KQorLy8gRUlUSEVSIHQgT1IgcyBNVVNUIEJFIEEgUkVHSVNURVIhCisvLyBGb3IgdGhlIG5vbi1yZWdpc3RlciBvcGVyYW5kLCB0ZW1wb3JhcmllcyBhcmUgdXNlZCBhbmQgbG9hZGVkCisvLyBhY2NvcmRpbmcgdG8gYW0tZGF0YS4KK3N0YXRpYyB2b2lkIGVtaXRfb3AoRklMRSAqZiwgc3RydWN0IG9iaiAqdCwgc3RydWN0IG9iaiAqcywgaW50IHR5cCwgaW50IG4sIGNoYXIgKm9wKQoreworICAgbG9uZwkJb2ZzOworICAgY2hhcgkJKm1vZGU7CisKKy8vIGNhbGN1bGF0ZSBvZmZzZXQgaW50byBzdGFjaworICAgb2ZzID0gb2ZzX2dldCh0KTsKKworLy8gZGV0ZXJtaW5lIGFjY2VzcyBtb2RlICg4LWJpdCBvciAxNi1iaXQgaW5zdHJ1Y3Rpb24pCisgICBtb2RlID0gIiI7CisgICBpZiAoc2l6ZXRhYlt0eXAmTlFdID09IDEpIG1vZGUgPSAiLjgiOworCisgICBpZiAoZW1pdF90bXBwdHIoZiwgcywgbikpIHsKKy8vIHdlIHVzZSBhIHRlbXBvcmFyeSBwb2ludGVyIGFuZCBpdCdzIGxvYWRlZCBpbiByZWdpc3RlciBzLT5hbS0+cmVncHRyCisvLyBOb3cgd2UgaGF2ZSB0byBnZW5lcmF0ZSB0aGUgY29kZSB0byBsb2FkIHRoZSBkYXRhIHVzaW5nIHRoZSB0ZW1wb3JhcnkgcG9pbnRlci4gICAgICAKKyAgICAgIGVtaXQoZiwgIlx0JXMlc1x0JXMsIFslcyslZF1cbiIsIG9wLCBtb2RlLCByZWduYW1lc1t0LT5yZWddLCByZWduYW1lc1tzLT5hbS0+cmVncHRyXSwgbik7ICAgICAgCisgICB9IGVsc2UgaWYgKGVtaXRfdG1wcHRyKGYsIHQsIG4pKSB7CisvLyBnZXQgdmFsdWUgaW50byB0YXJnZXQgcmVnaXN0ZXIKKyAgICAgIGVtaXQoZiwgIlx0JXMlc1x0WyVzKyVkXSwgJXNcbiIsIG9wLCBtb2RlLCByZWduYW1lc1t0LT5hbS0+cmVncHRyXSwgbiwgcmVnbmFtZXNbcy0+cmVnXSk7ICAgICAgCisgICB9IGVsc2UgeworICAgICAgZW1pdChmLCAiXHQlcyVzXHQiLCBvcCwgbW9kZSk7CisgICAgICBlbWl0X29iamVjdChmLCB0LCBuLCB0eXApOworICAgICAgZW1pdChmLCAiLCAiKTsKKyAgICAgIGVtaXRfb2JqZWN0KGYsIHMsIG4sIHR5cCk7CisgICAgICBlbWl0KGYsICJcbiIpOworICAgfSAgICAgIAorfQorCisvLyBHZW5lcmF0ZSByZWdpc3RlciBsb2FkaW5nIGNvZGUgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisvLyAgICBvcCAgcmVnLCB4CisvLyBNZWFuaW5nIGl0IGlzIGFsd2F5cyBjb2RlIGdlbmVyYXRlZCwgd2hpY2ggbG9hZHMgaW50byBhIHJlZ2lzdGVyLgorLy8gdHlwID0gb3BlcmFuZCB0eXBlIChlLmcgQ0hBUiwgUE9JTlRFUiwgSU5UIC4uLikKKy8vIG4gICA9IHRoZSBvZmZzZXQgd2hlbiBkZWFsaW5nIHdpdGggbXVsdGktd29ybGQgb2JqZWN0cyAoZS5nIGxvbmcsIGZsb2F0KQorc3RhdGljIHZvaWQgZW1pdF9sb2FkKEZJTEUgKmYsIGludCByZWcsIHN0cnVjdCBvYmogKnMsIGludCB0eXAsIGludCBuLCBjaGFyICpvcCkKK3sKKyAgIHN0cnVjdCBvYmoJKng7CisgICBpbnQJCW9mczsKKworLy8gaWYgdGFyZ2V0IHJlZ2lzdGVyIGlzIGJsYW5rLCB3ZSBxdWl0CisgICBpZiAocmVnID09IDApIHJldHVybjsKKworICAgeCA9IG15bWFsbG9jKHNpemVvZihzdHJ1Y3Qgb2JqKSk7CisKKy8vIGJ1aWxkIGEgdGFyZ2V0IHJlZ2lzdGVyIG9iamVjdAorICAgeC0+ZmxhZ3MgPSBSRUc7CisgICB4LT5yZWcgPSByZWc7CisgICB4LT5kdHlwID0gMDsKKyAgIHgtPnYgPSAwOworICAgeC0+YW0gPSAwOworCisvLyBnZW5lcmF0ZSBvcGVyYXRpb24KKyAgIGVtaXRfb3AoZiwgeCwgcywgdHlwLCBuLCBvcCk7CisvLyB3ZSBoYXZlIHRvIHRha2UgY2FyZSBvZiB0aGUgc3BlaWNhbCBjYXNlIG9mIGFkZHJlc3Mgb2YgYXV0byB2YXJpYWJsZQorICAgaWYgKChzLT5mbGFncyAmIChWQVJ8VkFSQURSKSkgPT0gKFZBUnxWQVJBRFIpKSB7CisgICAgICBpZiAoaXNhdXRvKHMtPnYtPnN0b3JhZ2VfY2xhc3MpKSB7CisvLyBjYWxjdWxhdGUgb2Zmc2V0IGludG8gc3RhY2sKKyAgICAgICAgIG9mcyA9IG9mc19nZXQocykgKyBuOworICAgICAgICAgaWYgKG9mcykgeyAgICAgICAKKwkgZW1pdChmLCAiXHRhZGRcdCVzLCAlZFxuIiwgcmVnbmFtZXNbcmVnXSwgb2ZzKTsKKyAgICAgICAgIH0gCisgICAgICB9CisgICB9CisKKyAgIG15ZnJlZSh4KTsKK30KKyAKKy8vIEdlbmVyYXRlIHRoZSBmb2xsb3dpbmcgY29kZToKKy8vICAgIG1vdiB0LCByZWcKKy8vIHR5cCA9IG9wZXJhbmQgdHlwZSAoZS5nIENIQVIsIFBPSU5URVIsIElOVCAuLi4pCisvLyBuICAgPSB0aGUgb2Zmc2V0IHdoZW4gZGVhbGluZyB3aXRoIG11bHRpLXdvcmxkIG9iamVjdHMgKGUuZyBsb25nLCBmbG9hdCkKK3N0YXRpYyB2b2lkIGVtaXRfc3RvcmUoRklMRSAqZiwgc3RydWN0IG9iaiAqdCwgaW50IHJlZywgaW50IHR5cCwgaW50IG4pCit7CisgICBzdHJ1Y3Qgb2JqCSp4OworCisvLyBpZiBzb3VyY2UgcmVnaXN0ZXIgaXMgYmxhbmssIHdlIHF1aXQKKyAgIGlmIChyZWcgPT0gMCkgcmV0dXJuOworCisgICB4ID0gbXltYWxsb2Moc2l6ZW9mKHN0cnVjdCBvYmopKTsKKworLy8gYnVpbGQgYSBzb3VyY2UgcmVnaXN0ZXIgb2JqZWN0CisgICB4LT5mbGFncyA9IFJFRzsKKyAgIHgtPnJlZyA9IHJlZzsKKyAgIHgtPmR0eXAgPSAwOworICAgeC0+diA9IDA7CisgICB4LT5hbSA9IDA7CisKKy8vIGdlbmVyYXRlIG9wZXJhdGlvbgorICAgZW1pdF9vcChmLCB0LCB4LCB0eXAsIG4sICJtb3YiKTsKKworICAgbXlmcmVlKHgpOworfQorCit2b2lkIGFtX2FsbG9jKHN0cnVjdCBvYmogKngpCit7CisvLyBpZiBubyBvYmplY3QsIHJldHVybgorICAgaWYgKHggPT0gMCkgcmV0dXJuOworLy8gaWYgYWxyZWFkeSBhbGxvY2F0ZWQsIHJldHVybgorICAgaWYgKHgtPmFtKSByZXR1cm47CisKKyAgIHgtPmFtID0gbXltYWxsb2Moc2l6ZW9mKHN0cnVjdCBBZGRyZXNzaW5nTW9kZSkpOworICAgeC0+YW0tPnJlZ3B0ciA9IDA7CisgICB4LT5hbS0+cmVndmFsWzBdID0gMDsKKyAgIHgtPmFtLT5yZWd2YWxbMV0gPSAwOworfQorCisvLyBDb21wYXJlIGlmIDIgb2JqZWN0cyBhcmUgdGhlIHNhbWUuCitpbnQgb2JqX2VxKHN0cnVjdCBvYmogKngxLCBzdHJ1Y3Qgb2JqICp4MikKK3sKKyAgIGludAkJcmV0OworCisvLyB3ZSBhc3N1bWUgdGhlIG9iamVjdHMgYXJlIGVxdWFsIHRvIHN0YXJ0IHdpdGgKKyAgIHJldCA9IDE7CisKKyAgIGlmICh4MT09MCB8fCB4Mj09MCkgeworICAgICAgcmV0ID0gMDsKKyAgIH0gZWxzZSB7CisgICAgICBpZiAoeDEtPmZsYWdzICE9IHgyLT5mbGFncykgcmV0ID0gMDsKKyAgICAgIGlmICh4MS0+cmVnICE9IHgyLT5yZWcpIHJldCA9IDA7CisgICB9CisKKyAgIHJldHVybiByZXQ7Cit9CisKKy8qCitJbml0aWFsaXplIHJlZ2lzdGVyIHRyYWNraW5nIHN5c3RlbS4KK1RoZSB0cmFja2luZyBzeXN0ZW1pcyBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hhdCByZWdpc3RlciBpcyB1c2VkIGFuZCBob2xkcword2hhdCBhdCBhbnkgZ2l2ZW4gdGltZS4gRGVwZW5kaW5nIG9uIGF2YWlsYWJpbGl0eSwgdGVtcG9yYXJ5IHJlZ2lzdGVycyBjYW4gYmUKK2FsbG9jYXRlZCB3aXRoIGJlc3QgZWZmaWNpZW5jeS4KKyovCitzdGF0aWMgdm9pZCB0cmFja19pbml0KHZvaWQpCit7CisgICBpbnQJCWk7CisKKy8vIHByZS1maWxsCisgICBmb3IoaSA9IDE7IGkgPD0gTUFYUjsgaSsrKSB7CisvLyBjbGVhciBhbGwgdW5uZWNlc3NhcnkgYml0cworICAgICAgdHJhY2tfc3RhdHVzW2ldICY9IChUUkFDS19PRkZMSU1JVFMgfCBUUkFDS19ERURJQ0FURUQpOworICAgfQorCisvLyBhbGwgc2xvdHMgYXJlIGVtcHR5IGF0IHRoZSBiZWdpbm5pbmcuCisgICBmb3IgKGkgPSAwOyBpIDwgVFJBQ0tfU0xPVFM7IGkrKykgeworLy8gaW5kaWNhdGUgc2xvdCBpcyBub3QgdXNlZCAgICAgIAorICAgICB0cmFja19zbG90W2ldID0gMDsKKyAgIH0KK30KKworCisvLyBNYXJrIGFueSByZWdpc3RlciB1c2VkIGJ5IHRoZSBJQworc3RhdGljIHZvaWQgdHJhY2tfb2JqX2NsYWltKHN0cnVjdCBvYmogKngpCit7CisvLyBhbmFseXplIG9iamVjdCBhbmQgZmxhZyBhbHJlYWR5IHVzZWQgcmVnaXN0ZXJzIGFzICduby1nbycKKyAgIGlmICh4ICYmICh4LT5mbGFncyAmIFJFRykpIHsKKyAgICAgIHRyYWNrX3N0YXR1c1t4LT5yZWddIHw9IFRSQUNLX0lDOworICAgfQorfQorCisvKiAKK0FsbG9jYXRlIHRoZSByZXF1aXJlZCB0ZW1wb3JhcnkgcmVnaXN0ZXJzCit0byBiZSBhYmxlIHRvIGdlbmVyYXRlIGNvZGUgZm9yIHRoZSBnaXZlbiBJQy4KK0VhY2ggb3BlcmFuZCBnZXRzIGFuICdhbScgZGF0YXN0cnVjdHVyZSwgd2hpY2gKK2lzIGZpbGxlZCB3aXRoIHRoZSB0ZW1wb3JhcnkgcmVnaXN0ZXJzIHRvIHVzZS4KKworQW5kIGl0IHdvcmtzIGxpa2UgdGhpcworeiAgID0gICBxMSA8b3A+IHEyCitwdHIgICAgIHB0ciAgICAgcHRyCit2YWwgICAgIHZhbAorCitUaGVyZSdzIG9ubHkgb25lIHB0ciB0aGF0IHNhdGlzZmllcyBhbGwgdGhyZWUgb3BlcmFuZC4KK1RoZXJlJ3Mgb25seSBvbmUgdmFsIHRoYXQgaXMgdXNlZCBmb3IgYm90aCBxMSBhbmQgei4KKworU28gZm9yIGV4YW1wbGUgaW4gaWYgd2UgaGF2ZSBxMShwdHIsIHZhbCkgdGhhdCBtZWFuczoKK1VzZSByZWdpc3RlciBwdHIgdG8gZ2V0IHExIGludG8gcmVnaXN0ZXIgdmFsLgorCitPciBmb3IgeihwdHIsIHZhbCk6IFVzZSByZWdpc3RlciBwdHIgdG8gc3RvcmUgcmVnaXN0ZXIgdmFsCit0byB0aGUgdGFyZ2V0IGxvY2F0aW9uLgorKi8KKworCisvKgorMC4gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gZnJlZSBwcmV2aW91c2x5IGFsbG9jYXRlZCB0ZW1wcworYS4gd2UgZG8gdGhpcyBpZiB3ZSBnb3QgYSBicmFuY2ggb3IgaWYgdGhlIGN1cnJlbnQgSUMgdXNlcyBhbnkgdGVtcCByZWcKKzEuIGRldGVybWluZSBob3cgbWFueSB0ZW1wb3JhcmllcyB3ZSBuZWVkCisyLiBjaGVjayBpZiB3ZSBjYW4gcmV1c2UgcHJldmlvdXNseSByZXNlcnZlZCB0ZW1wcworMy4gcmVzZXJ2ZSB0ZW1wcyBpZiBuZWNlc3NhcnkgKGFuZCBtYWtlIGl0IHNtYXJ0LCBwaWNrIHRoZSBvbmVzIHRoYXQgYXJlIG5vdCB1c2VkIGluIHRoZSBuZXh0IElDKQorKi8KKworc3RhdGljIGludCB0cmFja19hbGxvYyhGSUxFICpmKQoreworICAgaW50CQlyZWc7CisgICBpbnQJCWk7CisgICBpbnQJCXNhdmU7CisKKyAgIHJlZyA9IDA7CisgICBzYXZlID0gMDsKKy8vIHRyeSB0byBmaW5kIGEgcmVnaXN0ZXIKKy8vIElmIHdlIGNhbid0IGZpbmQgb25lLCB0aGVyZSdzIHNvbWUgc2VyaW91cyBpc3N1ZS4KKyAgIGZvciAoaSA9IDE7IGkgPCBNQVhSKzE7IGkrKykgeworICAgICAgaWYgKCh0cmFja19zdGF0dXNbaV0gJiAoVFJBQ0tfTk9HT3xUUkFDS19BTExPQ1JFR3xUUkFDS19TQVZFRCkpID09IFRSQUNLX0FMTE9DUkVHKSB7CisvLyBmb3VuZCBhIHJlZ2lzdGVyLCBidXQgaXQgbXVzdCBiZSBzYXZlZCwga2VlcCBsb29raW5nIG1heWJlCisvLyB3ZSBmaW5kIGEgYmV0dGVyIG9uZSwgb25seSB1c2UgdGhpcyBpZiB3ZSBoYXZlbid0IGZvdW5kIGFueXRoaW5nIHVzZWZ1bCB5ZXQKKyAgICAgICAgIGlmIChyZWcgPT0gMCkgeworICAgICAgICAgICAgcmVnID0gaTsKKyAgICAgICAgICAgIHNhdmUgPSAxOworICAgICAgICAgfSAgCisgICAgICB9IGVsc2UgaWYgKCh0cmFja19zdGF0dXNbaV0gJiAoVFJBQ0tfTk9HT3xUUkFDS19BTExPQ1JFR3xUUkFDS19TQVZFRCkpID09IChUUkFDS19BTExPQ1JFR3xUUkFDS19TQVZFRCkpIHsKKy8vIGZvdW5kIGEgcmVnaXN0ZXIsIGl0J3MgaW4gdXNlIGJ5IEFMTE9DUkVHLCBidXQgaXQgaGFzIGFscmVhZHkgYmVlbiBzYXZlZAorLy8gV2UgdXNlIGl0IGFuZCBxdWl0LgorICAgICAgICAgcmVnID0gaTsKKwkgc2F2ZSA9IDA7CisJIGJyZWFrOworICAgICAgfSBlbHNlIGlmICgodHJhY2tfc3RhdHVzW2ldICYgKFRSQUNLX05PR098VFJBQ0tfQUxMT0NSRUd8VFJBQ0tfU0FWRUR8VFJBQ0tfREVESUNBVEVEKSkgPT0gMCkgeworLy8gZm91bmQgYW4gdW5hbGxvY2F0ZWQgcmVnaXN0ZXIgd2hpY2ggaXMgbm90IGEgZGVkaWNhdGVkIHRlbXAsIHdlIHVzZSBpdAorICAgICAgICAgcmVnID0gaTsKKwkgc2F2ZSA9IDA7CisJIGJyZWFrOworICAgICAgfSBlbHNlIGlmICgodHJhY2tfc3RhdHVzW2ldICYgKFRSQUNLX05PR098VFJBQ0tfREVESUNBVEVEKSkgPT0gVFJBQ0tfREVESUNBVEVEKSB7CisvLyBmb3VuZCBhIGRlZGljYXRlZCB0ZW1wb3JhcnksIHdlIGNvdWxkIHVzZSBpdCwgYnV0IHdlIHRyeSB0byBmaW5kIGEgYmV0dGVyIG9uZQorICAgICAgICAgcmVnID0gaTsKKwkgc2F2ZSA9IDA7CisgICAgICB9CisgICB9CisgICBpZiAocmVnID09IDApIHRlcnJvcigiLS0gdHJhY2tfYWxsb2M6IGNhbid0IGZpbmQgdGVtcG9yYXJ5IHJlZ2lzdGVyIik7CisKKy8vIGZsYWcgcmVnaXN0ZXIgYXMgdGFrZW4KKyAgIHRyYWNrX3N0YXR1c1tyZWddIHw9IFRSQUNLX1RNUDsKKyAgIGVtaXQoZiwgIjsgYWxsb2NhdGUgdGVtcG9yYXJ5OiAlc1xuIiwgcmVnbmFtZXNbcmVnXSk7CisgICBpZiAoc2F2ZSkgeworICAgICAgdHJhY2tfc3RhdHVzW3JlZ10gfD0gVFJBQ0tfU0FWRUQ7CisvLyBmaW5kIGFuIHVudXNlZCBzdG9yYWdlIHNsb3QKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBUUkFDS19TTE9UUzsgaSsrKSB7CisgICAgICAgICBpZiAoIXRyYWNrX3Nsb3RbaV0pIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGkgPj0gVFJBQ0tfU0xPVFMpIHRlcnJvcigiLS10cmFja19hbGxvYzogb3V0IG9mIHN0b3JhZ2Ugc2xvdHMiKTsKKyAgICAgIHRyYWNrX3Nsb3RbaV0gPSByZWc7ICAgICAgCisgICAgICBlbWl0KGYsICJcdG1vdlx0W19UU0xPVCslZF0sICVzXG4iLCBpKjIsIHJlZ25hbWVzW3JlZ10pOworICAgfQorCisgICByZXR1cm4gcmVnOworfQorCisKKy8qCitUZW1wb3JhcnkgcmVnaXN0ZXIgdHJhY2tpbmcgYW5kIGFzc2lnbmVtZW50LgorKi8KKy8qCitDaGVjayBpZiBhY2Nlc3MgdG8gb2JqZWN0IHggcmVxdWlyZXMgdGVtcG9yYXJ5IHJlZ2lzdGVycy4KK0FsbG9jYXRlIGFsbCByZXF1aXJlZCB0ZW1wb3JhcnkgcmVnaXN0ZXJzLgorKi8KK3N0YXRpYyB2b2lkIHRyYWNrX29iaihGSUxFICpmLCBzdHJ1Y3Qgb2JqICp4LCBpbnQgdHlwKQoreworICAgaW50CQlpOworICAgaW50CQlyZWcsIHJlZzI7CisgICBpbnQJCW5lZWRfdG1wdmFsOworICAgaW50CQlzaXplOworCisKKy8vIG9iamVjdCBtdXN0IGhhdmUgJ2FtJyBzdHJ1Y3R1cmUuCisgICBhbV9hbGxvYyh4KTsKKworLy8gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gZnJlZSBwcmV2aW91c2x5IGFsbG9jYXRlZCB0ZW1wb3JhcmllcworLy8gY2xhaW0gcmVnaXN0ZXJzIHVzZWQgYnkgb2JqZWN0ICAKKyAgIHRyYWNrX29ial9jbGFpbSh4KTsKKy8vIHNlZSBpZiBvbmUgb2YgdGhlbSB3YXMgYWxsb2NhdGVkLCBhbmQgZnJlZSBpdCBpZiBuZWNlc3NhcnkKKyAgIGZvciAoaSA9IDA7IGkgPCBUUkFDS19TTE9UUzsgaSsrKSB7CisgICAgICByZWcgPSB0cmFja19zbG90W2ldOworICAgICAgaWYgKCh0cmFja19zdGF0dXNbcmVnXSAmIChUUkFDS19JQ3xUUkFDS19TQVZFRCkpID09IChUUkFDS19JQ3xUUkFDS19TQVZFRCkpIHsKKyAgICAgICAgIHRyYWNrX3N0YXR1c1tyZWddICY9IH5UUkFDS19TQVZFRDsKKyAgICAgICAgIHRyYWNrX3Nsb3RbaV0gPSAwOworICAgICAgICAgZW1pdChmLCAiOyByZXN0b3JlIHRlbXBvcmFyeVxuIik7CisgICAgICAgICBlbWl0KGYsICJcdG1vdlx0JXMsIFtfVFNMT1QrJWRdXG4iLCByZWduYW1lc1tyZWddLCBpKjIpOworICAgICAgfQorICAgfQorCisvLyBkZXRlcm1pbmUgaG93IG1hbnkgdGVtcG9yYXJ5IHJlZ2lzdGVycyB3ZSBuZWVkCisgICBuZWVkX3RtcHZhbCA9IDE7CisgICBpZiAoeCAmJiAoeC0+ZmxhZ3MgJiAoUkVHfERSRUZPQkopKSA9PSBSRUcpIG5lZWRfdG1wdmFsID0gMDsKKworICAgaWYgKG5lZWRfdG1wdmFsKSB7CisvLyB3ZSBuZWVkIHRlbXBvcmFyeSB2YWx1ZSByZWdpc3RlciwgYWxsb2NhdGUgb25lCisgICAgICByZWcgPSB0cmFja19hbGxvYyhmKTsgICAgCisvLyBJbiBjYXNlIHRoaXMgaXMgYSAzMi1iaXQgb3BlcmFuZCB3ZSBuZWVkIDIgdGVtcG9yYXJpZXMKKyAgICAgIHNpemUgPSBzaXpldGFiW3R5cCZOUV07ICAgICAKKyAgICAgIHJlZzIgPSAwOworICAgICAgaWYgKHNpemUgPT0gNCkgeworICAgICAgICAgcmVnMiA9IHRyYWNrX2FsbG9jKGYpOworICAgICAgfQorICAgICAgeC0+YW0tPnJlZ3ZhbFswXSA9IHJlZzsKKyAgICAgIHgtPmFtLT5yZWd2YWxbMV0gPSByZWcyOworICAgfQorCisvLyBuZXh0IHN0ZXAgaXMgdG8gY2hlY2sgaWYgcG9pbnRlciBtZW1vcnkgYWNjZXNzIHJlcXVpcmVzIGEgcmVnaXN0ZXIKKyAgIGlmICh4ICYmICh4LT5mbGFncyAmIChEUkVGT0JKIHwgVkFSIHwgUkVHKSkgPT0gKERSRUZPQkogfCBWQVIpKSB7CisgICAgICByZWcgPSB0cmFja19hbGxvYyhmKTsKKyAgICAgIHgtPmFtLT5yZWdwdHIgPSByZWc7CisgICB9Cit9CisKKy8qCitDaGVjayB0aGUgSUMgZm9yIHRlbXBvcmFyeSByZWdpc3RlciByZXF1aXJlbWVudHMuCitBbGxvY2F0ZSBhbGwgcmVxdWlyZWQgdGVtcG9yYXJpZXMgYW5kIHNhdmUgdGhlbSBpZiByZXF1aXJlZC4KKyovCitzdGF0aWMgdm9pZCB0cmFja19pYyhGSUxFICpmLCBzdHJ1Y3QgSUMgKnApIAoreworICAgc3RydWN0IG9iagkqejsKKyAgIHN0cnVjdCBvYmoJKnExOworICAgc3RydWN0IG9iagkqcTI7CisgICBpbnQJCWk7CisgICBpbnQJCXJlZywgcmVnMjsKKyAgIGludAkJbmVlZF90bXB2YWw7CisgICBpbnQJCXNpemU7CisgICBpbnQJCWNvZGU7CisKKy8vIGdldCBvYmplY3RzCisgICB6ID0gJnAtPno7CisgICBxMSA9ICZwLT5xMTsKKyAgIHEyID0gJnAtPnEyOworCisvLyBnZXQgaW5zdHJ1Y3Rpb24gY29kZQorICAgY29kZSA9IHAtPmNvZGU7CisKKy8vIGVhY2ggb2JqZWN0IG11c3QgaGF2ZSAnYW0nIHN0cnVjdHVyZS4KKyAgIGFtX2FsbG9jKHopOworICAgYW1fYWxsb2MocTEpOworICAgYW1fYWxsb2MocTIpOworCisKKy8vIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIGZyZWUgcHJldmlvdXNseSBhbGxvY2F0ZWQgdGVtcG9yYXJpZXMKKy8vIGNsYWltIHJlZ2lzdGVycyB1c2VkIGJ5IElDICAgCisgICB0cmFja19vYmpfY2xhaW0oeik7CisgICB0cmFja19vYmpfY2xhaW0ocTEpOworICAgdHJhY2tfb2JqX2NsYWltKHEyKTsKKworLy8gc2VlIGlmIG9uZSBvZiB0aGVtIHdhcyBhbGxvY2F0ZWQsIGFuZCBmcmVlIGl0IGlmIG5lY2Vzc2FyeQorICAgZm9yIChpID0gMDsgaSA8IFRSQUNLX1NMT1RTOyBpKyspIHsKKyAgICAgIHJlZyA9IHRyYWNrX3Nsb3RbaV07CisgICAgICBpZiAoKHRyYWNrX3N0YXR1c1tyZWddICYgKFRSQUNLX0lDfFRSQUNLX1NBVkVEKSkgPT0gKFRSQUNLX0lDfFRSQUNLX1NBVkVEKSkgeworICAgICAgICAgdHJhY2tfc3RhdHVzW3JlZ10gJj0gflRSQUNLX1NBVkVEOworCSB0cmFja19zbG90W2ldID0gMDsKKwkgZW1pdChmLCAiOyByZXN0b3JlIHRlbXBvcmFyeVxuIik7CisJIGVtaXQoZiwgIlx0bW92XHQlcywgW19UU0xPVCslZF1cbiIsIHJlZ25hbWVzW3JlZ10sIGkqMik7CisgICAgICB9CisgICB9CisKKy8vIGRldGVybWluZSBob3cgbWFueSB0ZW1wb3JhcnkgcmVnaXN0ZXJzIHdlIG5lZWQKKyAgIG5lZWRfdG1wdmFsID0gMTsKKyAgIGlmICh6ICYmICh6LT5mbGFncyAmIChSRUd8RFJFRk9CSikpID09IFJFRykgbmVlZF90bXB2YWwgPSAwOworICAgaWYgKHExICYmIChxMS0+ZmxhZ3MgJiAoUkVHfERSRUZPQkopKSA9PSBSRUcpIG5lZWRfdG1wdmFsID0gMDsKKyAgIGlmIChxMiAmJiAocTItPmZsYWdzICYgKFJFR3xEUkVGT0JKKSkgPT0gUkVHKSBuZWVkX3RtcHZhbCA9IDA7CisKKy8vIGlmIHRhcmdldCBaIGlzIE5PVCB0aGUgc2FtZSBhcyBRMSB3ZSB3aWxsIGFsd2F5cyBuZWVkIGEgdGVtcG9yYXJ5ICAgCisgICBpZiAoY29kZSA9PSBBU1NJR04gfHwgY29kZSA9PSBDT05WRVJUKSB7CisgICAgICA7CisgICB9IGVsc2UgaWYgKGNvZGUgPT0gQ09NUEFSRSkgeworLy8gaW4gY2FzZSBvZiBDT01QQVJFIHdlIG5lZWQgYSB0ZW1wb3JhcnkgaWYgUTEgPT0gS09OU1QKKyAgICAgIGlmIChxMSAmJiAocTEtPmZsYWdzICYgS09OU1QpID09IEtPTlNUKSBuZWVkX3RtcHZhbCA9IDE7CisgICB9IGVsc2UgeworICAgICAgaWYgKCFvYmpfZXEoeiwgcTEpKSB7CisgICAgICAgICBuZWVkX3RtcHZhbCA9IDE7CisgICAgICB9CisgICB9CisKKyAgIGlmIChuZWVkX3RtcHZhbCkgeworICAgICAgcmVnID0gMDsKKy8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgdGFyZ2V0IHJlZ2lzdGVyIGFzIHRlbXBvcmFyeQorLy8gV2UgY2FuIGRvIHNvIGlmIFEyIGlzIG5vdCB0aGUgc2FtZSBhcyBaICAgICAgCisgICAgICBpZiAoeikgeyAgIAorICAgICAgICAgaWYgKCgoei0+ZmxhZ3MgJiAoUkVHfERSRUZPQkopKSA9PSBSRUcpICYmICFvYmpfZXEoeiwgcTIpKSB7CisgICAgICAgICAgICByZWcgPSB6LT5yZWc7CisJICAgIHRyYWNrX3N0YXR1c1tyZWddIHw9IFRSQUNLX1RNUDsKKyAgICAgICAgIH0gZWxzZSB7CisvLyB3ZSBuZWVkIHRlbXBvcmFyeSB2YWx1ZSByZWdpc3RlciwgYWxsb2NhdGUgb25lCisgICAgICAgICAgICByZWcgPSB0cmFja19hbGxvYyhmKTsKKyAgICAgICAgIH0KKy8vIEluIGNhc2UgdGhpcyBpcyBhIDMyLWJpdCBvcGVyYW5kIHdlIG5lZWQgMiB0ZW1wb3JhcmllcworICAgICAgICAgc2l6ZSA9IHNpemV0YWJbenR5cChwKSZOUV07ICAgICAKKyAgICAgICAgIHJlZzIgPSAwOworICAgICAgICAgaWYgKHNpemUgPj0gNCkgeworICAgICAgICAgICAgcmVnMiA9IHRyYWNrX2FsbG9jKGYpOworICAgICAgICAgfQorICAgICAgICAgei0+YW0tPnJlZ3ZhbFswXSA9IHJlZzsKKyAgICAgICAgIHotPmFtLT5yZWd2YWxbMV0gPSByZWcyOworICAgICAgfQorLy8gUTEgbmVlZCB0aGUgc2FtZSB0ZW1wIGFzIFosIGJ1dCBtYXliZSBvbmx5IDE2LWJpdAorICAgICAgaWYgKHExKSB7CisgICAgICAgICBpZiAoIXJlZykgeworCSAgICByZWcgPSB0cmFja19hbGxvYyhmKTsKKyAgICAgICAgIH0KKyAgICAgICAgIHExLT5hbS0+cmVndmFsWzBdID0gcmVnOworICAgICAgICAgaWYgKHNpemV0YWJbcTF0eXAocCkmTlFdIDw9IDIpIHsKKyAgICAgICAgICAgIHJlZzIgPSAwOworICAgICAgICAgfQorICAgICAgICBxMS0+YW0tPnJlZ3ZhbFsxXSA9IHJlZzI7CisgICAgICB9CisgICB9CisKKy8vIG5leHQgc3RlcCBpcyB0byBjaGVjayBpZiBwb2ludGVyIG1lbW9yeSBhY2Nlc3MgcmVxdWlyZXMgYSByZWdpc3RlcgorICAgcmVnID0gMDsgCisgICBpZiAoeiAmJiAoei0+ZmxhZ3MgJiAoRFJFRk9CSiB8IFZBUiB8IFJFRykpID09IChEUkVGT0JKIHwgVkFSKSkgeworICAgICAgaWYgKCFyZWcpIHJlZyA9IHRyYWNrX2FsbG9jKGYpOworICAgICAgei0+YW0tPnJlZ3B0ciA9IHJlZzsKKyAgIH0gCisgICBpZiAocTEgJiYgKHExLT5mbGFncyAmIChEUkVGT0JKIHwgVkFSIHwgUkVHKSkgPT0gKERSRUZPQkogfCBWQVIpKSB7CisgICAgICBpZiAoIXJlZykgcmVnID0gdHJhY2tfYWxsb2MoZik7CisgICAgICBxMS0+YW0tPnJlZ3B0ciA9IHJlZzsKKyAgIH0gCisgICBpZiAocTIgJiYgKHEyLT5mbGFncyAmIChEUkVGT0JKIHwgVkFSIHwgUkVHKSkgPT0gKERSRUZPQkogfCBWQVIpKSB7CisgICAgICBpZiAoIXJlZykgcmVnID0gdHJhY2tfYWxsb2MoZik7CisgICAgICBxMi0+YW0tPnJlZ3B0ciA9IHJlZzsKKyAgIH0KKworfQorCitzdGF0aWMgdm9pZCB0cmFja19yZWxlYXNlKHZvaWQpCit7CisgICBpbnQJCWk7CisKKyAgIGZvciAoaSA9IDE7IGkgPD0gTUFYUjsgaSsrKSB7CisgICAgICB0cmFja19zdGF0dXNbaV0gJj0gfihUUkFDS19UTVB8VFJBQ0tfSUMpOworICAgfQorfQorCisvKgorUmVzdG9yZXMgYWxsIHNhdmVkIHRlbXBvcmFyeSByZWdpc3RlcnMuCitUaGlzIG11c3QgYmUgZXhlY3V0ZWQgYmVmb3JlIGFueSBicmFuY2gsIGNhbGwKK29yIGZ1bmN0aW9uIGV4aXQuCisqLworc3RhdGljIHZvaWQgdHJhY2tfcmVzdG9yZShGSUxFICpmKQoreworICAgaW50CQlpOworCisgICB0cmFja19yZWxlYXNlKCk7CisgICBmb3IgKGkgPSAwOyBpIDwgVFJBQ0tfU0xPVFM7IGkrKykgeworICAgICAgaWYgKHRyYWNrX3Nsb3RbaV0pIHsKKyAgICAgICAgIHRyYWNrX3N0YXR1c1t0cmFja19zbG90W2ldXSAmPSB+KFRSQUNLX1NBVkVEKTsKKwkgZW1pdChmLCAiXHRtb3ZcdCVzLCBbX1RTTE9UKyVkXVxuIiwgcmVnbmFtZXNbdHJhY2tfc2xvdFtpXV0sIGkqMik7CisJIHRyYWNrX3Nsb3RbaV0gPSAwOworICAgICAgfQorICAgfQorfQorLy8gc2FtZSBhcyBhYm92ZSwgYnV0IGRvbid0IGNsZWFyIFRSQUNLX1NBVkVEIGFuZCBkb24ndCByZWxlYXNlIHRoZSB0ZW1wcy4KKy8vIFRoaXMgaXMgdXNlZCBpbiBicmFuY2ggaW5zdHJ1Y3Rpb25zLgorc3RhdGljIHZvaWQgdHJhY2tfcmVzdG9yZTIoRklMRSAqZikKK3sKKyAgIGludAkJaTsKKworICAgZm9yIChpID0gMDsgaSA8IFRSQUNLX1NMT1RTOyBpKyspIHsKKyAgICAgIGlmICh0cmFja19zbG90W2ldKSB7CisJIGVtaXQoZiwgIlx0bW92XHQlcywgW19UU0xPVCslZF1cbiIsIHJlZ25hbWVzW3RyYWNrX3Nsb3RbaV1dLCBpKjIpOworICAgICAgfQorICAgfQorfQorCisKKworLyogZ2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBlbnRyeSBjb2RlICovCitzdGF0aWMgdm9pZCBjZF9mdW5jdGlvbl9lbnRyeShGSUxFICpmLCBzdHJ1Y3QgVmFyICp2LCBsb25nIG9mZnNldCkKK3sKKyAgIGludAkJaTsKKworICAgaWYgKHNlY3Rpb24gIT0gU0VDX1RFWFQpIHsKKyAgICAgIGVtaXQoZiwgIlxuXHRzZWN0aW9uXHQlc1xuIiwgc2VjX3RleHRuYW1lKTsKKyAgICAgIHNlY3Rpb24gPSBTRUNfVEVYVDsKKyAgIH0KKworICAgaWYgKHYtPnN0b3JhZ2VfY2xhc3MgPT0gRVhURVJOKSBlbWl0KGYsIlx0cHVibGljXHQlcyVzXG4iLCBpZGVudF9wcmVmaXgsIHYtPmlkZW50aWZpZXIpOworICAgZW1pdChmLCIlcyVzOlxuIiwgaWRlbnRfcHJlZml4LHYtPmlkZW50aWZpZXIpOworCisgICBpZiAodi0+dmF0dHIgJiYgc3Ryc3RyKHYtPnZhdHRyLCBFWFREQVRBX0lOVEVSUlVQVCkpIHsgICAgIAorLy8gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZQorICAgICAgZW1pdChmLCAiXHRwdXNoXHRmbGFnc1xuIik7CisgICAgICBmb3IgKGkgPSBSRUdfUjA7IGkgPCBSRUdfUjArbnJlZ3M7IGkrKykgeworICAgICAgICAgZW1pdChmLCAiXHRwdXNoXHQlc1xuIiwgcmVnbmFtZXNbaV0pOworICAgICAgfQorICAgfSAgIAorICAgICAgICAgICAgCisvLyBhbGxvY2F0ZSByZXF1aXJlZCBzdGFjaworICAgaWYgKG9mZnNldCA+IDApIGVtaXQoZiwiXHRzdWJcdHNwLCAlbGRcbiIsIG9mZnNldCk7CisKKy8vIHN0b3JlIG5vbi1zY3JhdGNoIHJlZ2lzdGVyIHVzZWQgaW4gZnVuY3Rpb24KKyAgIGZvciAoaSA9IDE7IGkgPD0gTUFYUjsgaSsrKSB7CisgICAgICBpZiAoIXJlZ3NhW2ldICYmICFyZWdzY3JhdGNoW2ldICYmIHJlZ3VzZWRbaV0pIHsKKyAgICAgICAgIGVtaXQoZiwgIlx0cHVzaFx0JXNcbiIsIHJlZ25hbWVzW2ldKTsKKy8vIGFkanVzdCBzdGFjayBvZmZzZXQKKyAgICAgICAgIHN0YWNrb2Zmc2V0IC09IDI7CisgICAgICB9CisgICB9Cit9CisKKy8qIGdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gZXhpdCBjb2RlICovCitzdGF0aWMgdm9pZCBjZ19mdW5jdGlvbl9leGl0KEZJTEUgKmYsIHN0cnVjdCBWYXIgKnYsIGxvbmcgb2Zmc2V0KQoreworICAgaW50CQlpOworCisvLyByZXN0b3JlIGFueSBzYXZlZCB0ZW1wb3JhcnkgcmVnaXN0ZXJzCisvLyBJIGRvbid0IHRoaW5rIHRoaXMgaXMgbmVjZXNzYXJ5IGFzIGxvbmcgYXMgd2UgZG9uJ3QgaGF2ZSBnbG9iYWwgcmVnaXN0ZXIgdmFyaWFibGVzLgorLy8gV2hhdCBkb2VzIHZiY2MgZG8/IEdsb2JhbCByZWdzPworICAgdHJhY2tfcmVzdG9yZShmKTsKKworLy8gcmVzdG9yZSBub24tc2NyYXRjaCByZWdpc3RlciB1c2VkIGluIGZ1bmN0aW9uCisgICBmb3IgKGkgPSBNQVhSOyBpID49IDE7IGktLSkgeworICAgICAgaWYgKCFyZWdzYVtpXSAmJiAhcmVnc2NyYXRjaFtpXSAmJiByZWd1c2VkW2ldKSB7CisgICAgICAgICBlbWl0KGYsICJcdHBvcFx0JXNcbiIsIHJlZ25hbWVzW2ldKTsKKyAgICAgICAgIHN0YWNrb2Zmc2V0ICs9IDI7CisgICAgICB9CisgICB9CisKKyAgIGlmIChvZmZzZXQgPiAwKSB7CisgICAgICBlbWl0KGYsIlx0YWRkXHRzcCwgJWxkXG4iLCBvZmZzZXQpOworICAgfQorICAgCisgICBpZiAodi0+dmF0dHIgJiYgc3Ryc3RyKHYtPnZhdHRyLCBFWFREQVRBX0lOVEVSUlVQVCkpIHsKKy8vIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUKKyAgICAgIGZvciAoaSA9IFJFR19SMCtucmVncy0xOyBpID49IFJFR19SMDsgaS0tKSB7CisgICAgICAgICBlbWl0KGYsICJcdHBvcFx0JXNcbiIsIHJlZ25hbWVzW2ldKTsKKyAgICAgIH0KKyAgICAgIGVtaXQoZiwgIlx0cG9wXHRmbGFnc1xuIik7CisgICAgICBlbWl0KGYsICJcdGlyZXRcblxuIik7CisgICB9IGVsc2UgeyAgIAorICAgICAgZW1pdChmLCAiXHRyZXRcblxuIik7CisgICB9Cit9CisKKy8qIAorc29tZSBibHVycDoKK1RoZXJlJ3MgYW4gSUMsIHdoaWNoIGNvbnRhaW5zIGEgdGFyZ2V0KHopLCBhbmQgMiBzb3VyY2VzKHExIGFuZCBxMikuCitNYWNyb3MgenR5cCwgcTF0eXAgYW5kIHEydHlwIHJldHVybiB0aGUgdHlwZSBvZiB0aGUgb3BlcmFuZHMKK2UuZy4gKGNoYXIsIGludCwgc2hvcnQsIGRvdWJsZSwgc3RydWN0LCBhcnJheS4uLi4pLgorQWxzbyBjb250YWlucyB0aGUgcXVhbGlmaWVycyBVTlNJR05FRCwgQ09OU1QKK01vc3Qgb2YgdGhlIHRpbWUgaXQncyB0aGUgc2FtZSBmb3IgYWxsIG9wZXJhbmRzLiBFeGNlcHRpb25zIGFyZQorQ09OVkVSVCBvciBhZGRpbmcgaW50IHRvIHBvaW50ZXIuCitVc2luZyBOVSBhbmQgTlEgd2lsbCByZW1vdmUgcXVhbGlmaWVycyBhbmQgb25seSBsZWF2ZSBiYXNlIHR5cGUuCisKK09mIGludGVyZXN0IGFyZToKK0lTUE9JTlRFUiwgSVNJTlQsIElTRkxPQVQsIElTRlVOQywgSVNTVFJVQ1QsIElTVU5JT04sIElTQVJSQVksCitJU1NDQUxBUiwgSVNBUklUSAorCitFYWNoIG9wZXJhbmQgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorS09OU1QJCQljb25zdGFudCBudW1iZXIKK0tPTlNUfERSRUZPQkoJCWFic29sdXRlIHBvaW50ZXIKK1JFRwkJCXJlZ2lzdGVyCitWQVIJCQl2YXJpYWJsZSAoY2FuIGJlIGF1dG8sIHJlZ2lzdGVyLCBzdGF0aWMsIGV4dGVybikKK1ZBUnxSRUcJCQlhIHZhcmlhYmxlIHdoaWNoIHdhcyBwdXQgaW4gYSByZWdpc3RlcgorUkVHfERSRUZPQkoJCWluZGlyZWN0IFtyZWddCitWQVJ8RFJFRk9CSgkJaW5kaXJlY3QgW3Zhcl0KK1ZBUnxSRUd8RFJFRk9CSgkJaW5kaXJlY3QgW3JlZ10sIHdoZXJlIHRoZSByZWdpc3RlciBpcyBhIHZhcmlhYmxlCitWQVJ8VkFSQURSCQlhZGRyZXNzIG9mIGEgdmFyaWFibGUKKworVGVtcG9yYXJpZXMgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciBkb24ndCBoYXZlIHRoZSBWQVIgZmxhZyBzZXQuCitJdCBpcyBvbmx5IGEgVkFSIGlmIGl0IGlzIHNvIGluIHRoZSBzb3VyY2UgY29kZS4KKworRWFjaCB2YXJpYWJsZSB0aGVuIGhhcyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIHN0b3JhZ2UgY2xhc3MsCitzbyBlYWNoIFZBUiBpcyBvbiBvZiB0aGUgZm9sbG93aW5nOgorQVVUTworUkVHSVNURVIKK1NUQVRJQworRVhURVJOCisKK01hY3JvcyBvZiBpbnRlcmVzdDoKK2lzYXV0bywgaXNleHRlcm4sIGlzc3RhdGljLgorCisqLworLyogdmFsX3B1c2gKK1B1c2hpbmcgdGhlIHZhbHVlIG9mIHRoZSBvYmplY3Qgb250byB0aGUgc3RhY2suCisqLworc3RhdGljIHZvaWQgdmFsX3B1c2goRklMRSAqZiwgc3RydWN0IG9iaiAqeCwgaW50IHR5cCkKK3sKKy8vIGhhbmRsZSByZXF1aXJlZCB0ZW1wb3JhcmllcwkgICAKKyAgIHRyYWNrX29iaihmLCB4LCB0eXApOyAKKworICAgZW1pdChmLCAiOyBwdXNoIHZhbFxuIik7CisgICAKKy8vIExvYWQgUTEgaW50byB0ZW1wb3JhcnkgcmVnaXN0ZXIgdmFsIGlmIG5lY2Vzc2FyeS4KKy8vIEF1dG9tYXRpY2FsbHkgdXNlIHRlbXBvcmFyeSB4LT5hbS0+cmVncHRyIGlmIG5lY2Vzc2FyeS4KKyAgIGVtaXRfbG9hZChmLCB4LT5hbS0+cmVndmFsWzBdLCB4LCB0eXAsIDAsICJtb3YiKTsKKyAgIGVtaXRfbG9hZChmLCB4LT5hbS0+cmVndmFsWzFdLCB4LCB0eXAsIDIsICJtb3YiKTsKKworLy8gZW1pdCBvcGVyYXRpb24KKyAgaWYgKHgtPmFtLT5yZWd2YWxbMV0pIHsKKyAgICAgIGVtaXQoZiwgIlx0cHVzaFx0JXNcbiIsIHJlZ25hbWVzW3gtPmFtLT5yZWd2YWxbMV1dKTsKKyAgICAgIHN0YWNrb2Zmc2V0IC09IDI7CisgICB9CisgICBpZiAoeC0+YW0tPnJlZ3ZhbFswXSkgeworLy8gb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBvbiB0ZW1wb3JhcmllcworICAgICAgZW1pdChmLCAiXHRwdXNoXHQlc1xuIiwgcmVnbmFtZXNbeC0+YW0tPnJlZ3ZhbFswXV0pOworICAgICAgc3RhY2tvZmZzZXQgLT0gMjsKKyAgICB9IGVsc2UgeworLy8gb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBkaXJlY3RseSBvbiB0YXJnZXQgKHogPT0gcTEgZm9yIHRoaXMgdG8gd29yaykKKyAgICAgIGVtaXQoZiwgIlx0cHVzaFx0JXNcbiIsIHJlZ25hbWVzW3gtPnJlZ10pOworICAgICAgc3RhY2tvZmZzZXQgLT0gMjsKKyAgIH0KKworLy8gcmVsZWFzZSB0ZW1wb3JhcmllcworICAgdHJhY2tfcmVsZWFzZSgpOworfQorLyogcHRyX3B1c2gKK1B1c2hpbmcgdGhlIHB0ciB0byB0aGUgb2JqZWN0IG9udG8gdGhlIHN0YWNrLgorSW4gY2FzZSB0aGUgb2JqZWN0IGlzIGEgS09OU1QsIGEgY29weSBvZiB0aGUgS09OU1QgaXMgbWFkZQoraW4gcm9tc2VjdGlvbiBhbmQgYSBwb2ludGVyIHRvIHRoZSBjb25zdGFudCBpcyBwdXNoZWQuCitXQVJOSU5HIFdBUk5JTkcgV0FSTklORworVGhpcyBmdW5jdGlvbiBNT0RJRklFUyB0aGUgb2JqZWN0ICp4LgorKi8KK3N0YXRpYyB2b2lkIHB0cl9wdXNoKEZJTEUgKmYsIHN0cnVjdCBvYmogKngpCit7CisvLyBoYW5kbGUgcmVxdWlyZWQgdGVtcG9yYXJpZXMJICAgCisgICB0cmFja19vYmooZiwgeCwgUE9JTlRFUik7IAorCisgICBlbWl0KGYsICI7IHB1c2ggcHRyIHRvIG9iamVjdFxuIik7CisgICAKKy8vIG1vZGlmeSB0aGUgSUMgc3VjaCB0aGF0IHdlIGNhbiBnZW5lcmF0ZSBjb2RlIGZyb20gaXQKKworLy8gd2hhdCB3ZSBzaG91bGQgZG8gaGVyZSBpczogaWYgRFJFRk9CSiBpcyBzZXQsIGNsZWFyIGl0LiBJZiBEUkVGT0JKIGlzIG5vdCBzZXQsIHNldCBWQVJBRFIuCisgICAgICBpZiAoeC0+ZmxhZ3MgJiBEUkVGT0JKKSB7CisgICAgICAgICB4LT5mbGFncyAmPSB+RFJFRk9CSjsKKyAgICAgfSBlbHNlIHsgICAgCisJIHgtPmZsYWdzIHw9IFZBUkFEUjsKKyAgICAgIH0KKyAgICAgIHgtPmR0eXAgPSBQT0lOVEVSOworCisvLyBMb2FkIG9iamVjdCBpbnRvIHRlbXBvcmFyeSByZWdpc3RlciB2YWwgaWYgbmVjZXNzYXJ5LgorLy8gQXV0b21hdGljYWxseSB1c2UgdGVtcG9yYXJ5IHgtPmFtLT5yZWdwdHIgaWYgbmVjZXNzYXJ5LgorICAgZW1pdF9sb2FkKGYsIHgtPmFtLT5yZWd2YWxbMF0sIHgsIFBPSU5URVIsIDAsICJtb3YiKTsKKworLy8gZW1pdCBvcGVyYXRpb24KKyAgIGlmICh4LT5hbS0+cmVndmFsWzBdKSB7CisvLyBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIG9uIHRlbXBvcmFyaWVzCisgICAgICBlbWl0KGYsICJcdHB1c2hcdCVzXG4iLCByZWduYW1lc1t4LT5hbS0+cmVndmFsWzBdXSk7CisgICAgICBzdGFja29mZnNldCAtPSAyOworICAgIH0gZWxzZSB7CisvLyBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGRpcmVjdGx5IG9uIHRhcmdldCAoeiA9PSBxMSBmb3IgdGhpcyB0byB3b3JrKQorICAgICAgZW1pdChmLCAiXHRwdXNoXHQlc1xuIiwgcmVnbmFtZXNbeC0+cmVnXSk7CisgICAgICBzdGFja29mZnNldCAtPSAyOworICAgfQorCisvLyByZWxlYXNlIHRlbXBvcmFyaWVzCisgICB0cmFja19yZWxlYXNlKCk7Cit9CisKKy8qCitHZXQgdGhlIG9iamVjdCBmcm9tIHRoZSBzdGFjay4gSXQgaXMgYXNzdW1lZCB0aGUgb2JqZWN0IGlzCitsb2NhdGVkIGF0IFtzcF0uIEl0IGlzIHN1YnNlcXVlbnRseSB0cmFuc2ZlcmVkIHRvIHgKK1tzcF0gLS0+IHgKK1RoaXMgZnVuY3Rpb24gY2FuIGJlIGltcGxlbWVudGVkIGVpdGhlciB1c2luZyAncG9wJyBvciB1c2luZyAnW3NwK3h4XScuCitFaXRoZXIgb25lIGhhcyBhZHZhbnRhZ2Ugb3IgZGlzYWR2YW50YWdlLCBhbHNvIGRlcGVuZGluZyBvbiBDUFUKK2ltcGxlbWVudGF0aW9uLgorKi8KK3ZvaWQgdmFsX3BvcChGSUxFICpmLCBzdHJ1Y3Qgb2JqICp4LCBpbnQgdHlwKQoreworICAgZW1pdChmLCAiOyBwb3AgdmFsXG4iKTsKKworLy8gaGFuZGxlIHJlcXVpcmVkIHRlbXBvcmFyaWVzCSAgIAorICAgdHJhY2tfb2JqKGYsIHgsIHR5cCk7IAorICAgCisvLyBMb2FkIFtzcF0gdmFsdWUgaW50byB0ZW1wb3JhcnkgcmVnaXN0ZXIgdmFsIGlmIG5lY2Vzc2FyeS4KKyAgIGlmICh4LT5hbS0+cmVndmFsWzBdKSB7CisvLyBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIG9uIHRlbXBvcmFyaWVzCisgICAgICBlbWl0KGYsICJcdHBvcFx0JXNcbiIsIHJlZ25hbWVzW3gtPmFtLT5yZWd2YWxbMF1dKTsKKyAgICAgIHN0YWNrb2Zmc2V0ICs9IDI7CisgICAgICBpZiAoeC0+YW0tPnJlZ3ZhbFsxXSkgeworICAgICAgICAgZW1pdChmLCAiXHRwb3BcdCVzXG4iLCByZWduYW1lc1t4LT5hbS0+cmVndmFsWzFdXSk7CisgICAgICAgICBzdGFja29mZnNldCArPSAyOworICAgICAgfQorICAgfSBlbHNlIHsKKy8vIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgZGlyZWN0bHkgb24gdGFyZ2V0ICh6ID09IHExIGZvciB0aGlzIHRvIHdvcmspCisgICAgICBlbWl0KGYsICJcdHBvcFx0JXNcbiIsIHJlZ25hbWVzW3gtPnJlZ10pOworICAgICAgc3RhY2tvZmZzZXQgKz0gMjsKKyAgIH0KKworLy8gc3RvcmUgdG8gdGFyZ2V0CisgICBlbWl0X3N0b3JlKGYsIHgsIHgtPmFtLT5yZWd2YWxbMF0sIHR5cCwgMCk7CisgICBlbWl0X3N0b3JlKGYsIHgsIHgtPmFtLT5yZWd2YWxbMV0sIHR5cCwgMik7CisKKy8vIHJlbGVhc2UgdGVtcG9yYXJpZXMKKyAgIHRyYWNrX3JlbGVhc2UoKTsKK30KKworLyoKK0xpYnJhcnkgY2FsbCBmb3IgQUxVIGZ1bmN0aW9ucy4KKyovCitzdGF0aWMgdm9pZCBsaWJfYWx1KEZJTEUgKmYsIHN0cnVjdCBJQyAqcCwgY2hhciAqY2FsbCkKK3sKKyAgIGNoYXIJCSptb2RpZmllcjsKKyAgIGNoYXIJCSpkdHlwZTsKKyAgIGludAkJc2l6ZTsKKworICAgLy8gZG8gc29tZSBjaGVja2luZyBmaXJzdAorICAgaWYgKHExdHlwKHApICE9IHEydHlwKHApKSB0ZXJyb3IoIi0tbGliX2FsdTogdHlwZSBtaXNtYXRjaCIpOworCisgICBtb2RpZmllciA9ICJTIjsKKyAgIGlmIChxMXR5cChwKSAmIFVOU0lHTkVEKSB7CisgICAgICBtb2RpZmllciA9ICJVIjsKKyAgIH0KKworICAgc3dpdGNoIChxMXR5cChwKSkgeworICAgICAgY2FzZSBDSEFSOiAKKyAgICAgICAgIGR0eXBlID0gIkk4IjsgYnJlYWs7CisgICAgICBjYXNlIFNIT1JUOgorICAgICAgY2FzZSBJTlQ6CisgICAgICAgICBkdHlwZSA9ICJJMTYiOyBicmVhazsKKyAgICAgIGNhc2UgTE9ORzoKKyAgICAgICAgIGR0eXBlID0gIkkzMiI7IGJyZWFrOworICAgICAgY2FzZSBGTE9BVDoKKyAgICAgICAgIGR0eXBlID0gIkYzMiI7IGJyZWFrOworICAgICAgY2FzZSBET1VCTEU6CisgICAgICAgICBkdHlwZSA9ICJGNjQiOyBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBkdHlwZSA9ICIiOyBicmVhazsKKyAgICAgICAgIHRlcnJvcigiLS1saWJfYWx1OiBkYXRhIHR5cGUgbm90IHN1cHBvcnRlZCIpOworCSBicmVhazsKKyAgIH0KKy8vIGhhbmRsZSByZXF1aXJlZCB0ZW1wb3JhcmllcworLy8gdGVtcG9yYXJ5IGFsbG9jYXRpb24gaXMgaGFuZGxlZCBpbiB2YWxfcHVzaCBpbnN0ZWFkLgorLy8gVGhlIGlkZWEgaGVyZSBpcyB0byBhbGxvY2F0ZSBhbGwgcmVxdWlyZWQgdGVtcG9yYXJpZXMgbm93LAorLy8gc3VjaCB0aGF0IHRoZSByZXR1cm4gdmFsdWUgY2FuIGJlIGVhc2lseSBncmFiYmVkLgorLy8gVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93IGR1ZSB0byBjb21wbGljYXRpb25zLgorLy8gICB0cmFja19pYyhmLCBwKTsKKworLy8gcHVzaCB0aGUgc3BhY2Vob2xkZXIgZm9yIHRoZSByZXN1bHQKKyAgIHNpemUgPSBzaXpldGFiW3p0eXAocCkmTlFdOworICAgaWYgKHNpemUgPD0gMikgeworLy8gc3RhY2sgaXMgMi1ieXRlIG1pbmltdW0KKyAgIGlmIChzaXplIDwgMikgc2l6ZSA9IDI7CisgICBlbWl0KGYsICJcdHN1Ylx0c3AsICVkXG4iLCBzaXplKTsKKyAgIHN0YWNrb2Zmc2V0IC09IHNpemU7CisvLyBQdXNoIGFsbCBhcmd1bWVudHMKKyAgIHZhbF9wdXNoKGYsICZwLT5xMiwgcTJ0eXAocCkpOworICAgdmFsX3B1c2goZiwgJnAtPnExLCBxMXR5cChwKSk7CisgICB9IGVsc2UgeworICAgICAgcHRyX3B1c2goZiwgJnAtPnEyKTsKKyAgICAgIHB0cl9wdXNoKGYsICZwLT5xMSk7CisgICB9CisgICB0cmFja19yZXN0b3JlKGYpOworLy8gZW1pdCBjYWxsIHRvIGxpYnJhcnkgZnVuY3Rpb24KKyAgIGVtaXQoZiwgIlx0Y2FsbFx0XyVzXyVzJXNcbiIsIGNhbGwsIG1vZGlmaWVyLCBkdHlwZSk7CisKKy8vIHJlc3RvcmUgc3RhY2sgc3RhdGUKKy8vIHVzZSAyKnNpemUgaW4gY2FzZSAndmFsX3BvcCcgYWN0dWFsbHkgcG9wcywKKy8vIHVzZSAzKnNpemUgaW4gY2FzZSAndmFsX3BvcCB1c2VzIFtzcCt4eF0KKyAgICBlbWl0KGYsICJcdGFkZFx0c3AsICVkXG4iLCAoaW50KTIqc2l6ZSk7CisgICAgc3RhY2tvZmZzZXQgKz0gMipzaXplOworCisvLyBsYXN0IHN0ZXAgaXMgdG8gZ3JhYiB0aGUgcmV0dXJuIHZhbHVlCisvLyBSZXR1cm4gdmFsdWUgaXMgYXQgW3NwXS4KKyAgIHZhbF9wb3AoZiwgJnAtPnosIHp0eXAocCkpOworCit9IAorCisKKy8qCitMaWJyYXJ5IGNhbGwgZm9yIG1lbXByeSBjb3B5IGZ1bmN0aW9ucy4KKyovCitzdGF0aWMgdm9pZCBsaWJfbW92KEZJTEUgKmYsIHN0cnVjdCBJQyAqcCkKK3sKKworLy8gbW9kaWZ5IHRoZSBJQyBzdWNoIHRoYXQgd2UgY2FuIGdlbmVyYXRlIGNvZGUgZnJvbSBpdCAgICAgIAorICAgcC0+cTIuZmxhZ3MgPSBLT05TVDsKKworLy8gUHVzaCBRMiAobnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkpCisgICBlbWl0KGYsICI7IHB1c2ggYXJyYXkgc2l6ZVxuIik7CisgICB2YWxfcHVzaChmLCAmcC0+cTIsIElOVCk7CisvLyBQdXNoIHBvaW50ZXIgdG8gUTEgKHNvdXJjZSkKKyAgIGVtaXQoZiwgIjsgcHVzaCBzb3VyY2UgcG9pbnRlclxuIik7CisgICBwdHJfcHVzaChmLCAmcC0+cTEpOworLy8gcHVzaCBwb2ludGVyIHRvIHRhcmdldCAoWikKKyAgIGVtaXQoZiwgIjsgcHVzaCB0YXJnZXQgcG9pbnRlclxuIik7CisgICBwdHJfcHVzaChmLCAmcC0+eik7CisKKyAgIHRyYWNrX3Jlc3RvcmUoZik7CisvLyBlbWl0IGNhbGwgdG8gbGlicmFyeSBmdW5jdGlvbgorICAgZW1pdChmLCAiXHRjYWxsXHRfTU9WXG4iKTsKKworLy8gc3RhY2sgY2xlYW51cCwgd2Ugc2hvdWxkIHVzZSBjYWxsZWUgY2xlYW4tdXAKKyAgICBlbWl0KGYsICJcdGFkZFx0c3AsICVkXG4iLCAoaW50KTYpOworICAgIHN0YWNrb2Zmc2V0ICs9IDY7Cit9IAorLyoKKworKi8KK3N0YXRpYyB2b2lkIGNnX2Fzc2lnbihGSUxFICpmLCBzdHJ1Y3QgSUMgKnApCit7CisgICBzdHJ1Y3Qgb2JqCSp4OworICAgaW50CQl0eXA7CisgICBpbnQJCXNpemU7CisKKy8vIGFueSBzdHJ1Y3Qgb3IgYXJyYXkgZ29lcyB0byBsaWJyYXJ5IGZ1bmN0aW9uCisvLyBhbnl0aGluZyA+IDQgYnl0ZXMgZ29lcyB0byBsaWJyYXJ5CisvLyBzaXplIGlzIG9ubHkgcG9zc2libGUgd2l0aCBBU1NJR04sIG5vdCBDT05WRVJULgorICAgaWYgKHAtPmNvZGUgPT0gQVNTSUdOKSB7CisgICAgICBzaXplID0gb3BzaXplKHApOworICAgICAgaWYgKHNpemUgPiA0IHx8IElTQ09NUE9TSVRFKHp0eXAocCkpKSB7CisKKyAgICAgICAgIGxpYl9tb3YoZiwgcCk7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisgICB9CisKKy8vIGhhbmRsZSByZXF1aXJlZCB0ZW1wb3JhcmllcyAgIAorICAgdHJhY2tfaWMoZiwgcCk7CisKKyAgIC8vIFdlIGFsc28gZ2V0IGhlcmUgZm9yIENPTlZFUlQsIHNvIHRlc3QgZG9uJ3Qgd29yay4KKyAgLy8gaWYgKHExdHlwKHApICE9IHp0eXAocCkpIHRlcnJvcigwKTsKKyAgIGVtaXQoZiwgIjsgbW92XG4iKTsKKworLy8gZW1pdCBvcGVyYXRpb24KKyAgIHR5cCA9IHExdHlwKHApOworICAgeCA9ICZwLT5xMTsKKyAgIGlmICh4LT5hbS0+cmVndmFsWzBdKSB7CisvLyBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIG9uIHRlbXBvcmFyaWVzCisgICAgICBlbWl0X2xvYWQoZiwgeC0+YW0tPnJlZ3ZhbFswXSwgeCwgdHlwLCAwLCAibW92Iik7CisgICAgICBlbWl0X2xvYWQoZiwgeC0+YW0tPnJlZ3ZhbFsxXSwgeCwgdHlwLCAyLCAibW92Iik7CisgICB9IGVsc2UgeworLy8gb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBkaXJlY3RseSwgbm8gdGVtcG9yYXJpZXMgaW52b2x2ZWQKKyAgICAgIGVtaXRfb3AoZiwgJnAtPnosIHgsIHR5cCwgMCwgIm1vdiIpOworICAgfQorCisvLyBjaGVjayBpZiB0aGlzIGlzIGEgQ09OVkVSVCBvcGVyYXRpb24gYW5kIGluamVjdCBzaWduIGV4dGVuc2lvbgorLy8gaWYgbmVjZXNzYXJ5LgorICAgaWYgKHAtPmNvZGUgPT0gQ09OVkVSVCkgeworLy8gaWYgUTEgaXMgQ0hBUiB3ZSBuZWVkIHRvIGJsb3cgaXQgdXAgdG8gSU5UICAgICAgCisgICAgICBpZiAoc2l6ZXRhYltxMXR5cChwKSAmIE5RXSA9PSAxKSB7CisgICAgICAgICBpZiAodHlwICYgVU5TSUdORUQpIHsKKy8vIGNsZWFyIGhpZ2ggYnl0ZSAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHAtPnouYW0tPnJlZ3ZhbFswXSkgeworCSAgICAgICBlbWl0KGYsICJcdGFuZFx0JXMsIDB4ZmZcbiIsIHJlZ25hbWVzW3AtPnouYW0tPnJlZ3ZhbFswXV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKwkgICAgICAgZW1pdChmLCAiXHRhbmRcdCVzLCAweGZmXG4iLCByZWduYW1lc1twLT56LnJlZ10pOworCSAgICB9CisgICAgICAgICB9IGVsc2UgeworLy8gU1hUIGhpZ2ggYnl0ZQorICAgICAgICAgICAgaWYgKHAtPnouYW0tPnJlZ3ZhbFswXSkgeworICAgICAgICAgICAgICAgZW1pdChmLCAiXHRzeHQuOFx0JXNcbiIsIHJlZ25hbWVzW3AtPnouYW0tPnJlZ3ZhbFswXV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKwkgICAgICAgZW1pdChmLCAiXHRzeHQuOFx0JXNcbiIsIHJlZ25hbWVzW3AtPnoucmVnXSk7CisJICAgIH0KKwkgfQorICAgICAgfSAgICAgICAgIAorLy8gaWYgWiBpcyBMT05HIHdlIG5lZWQgdG8gYmxvdyBpdCB1cCBmcm9tIElOVCB0byBMT05HICAgICAgCisgICAgICBpZiAoc2l6ZXRhYlt6dHlwKHApICYgTlFdID09IDQpIHsgICAgICAKKyAgICAgICAgIGlmICh0eXAgJiBVTlNJR05FRCkgeworICAgICAgICAgICAgZW1pdChmLCAiXHRtb3ZcdCVzLCAwXG4iLCByZWduYW1lc1twLT56LmFtLT5yZWd2YWxbMV1dKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbWl0KGYsICJcdG1vdlx0JXMsICVzXG4iLCByZWduYW1lc1twLT56LmFtLT5yZWd2YWxbMV1dLCByZWduYW1lc1twLT56LmFtLT5yZWd2YWxbMF1dKTsKKyAgICAgICAgICAgIGVtaXQoZiwgIlx0c3h0XHQlc1xuIiwgcmVnbmFtZXNbcC0+ei5hbS0+cmVndmFsWzFdXSk7CisgICAgICAgICB9IAorICAgICAgfQorICAgfQorLy8gZW1pdCBzdG9yZSBpZiBuZWNlc3NhcnkKKyAgIHR5cCA9IHp0eXAocCk7CisgICB4ID0gJnAtPno7CisgICBlbWl0X3N0b3JlKGYsIHgsIHgtPmFtLT5yZWd2YWxbMF0sIHR5cCwgMCk7CisgICBlbWl0X3N0b3JlKGYsIHgsIHgtPmFtLT5yZWd2YWxbMV0sIHR5cCwgMik7CisKKy8vIHJlbGVhc2UgdGVtcG9yYXJpZXMKKyAgIHRyYWNrX3JlbGVhc2UoKTsKK30gICAKKworCitzdGF0aWMgdm9pZCBjZ19wdXNoKEZJTEUgKmYsIHN0cnVjdCBJQyAqcCkKK3sKKyAgIGludAkJc2l6ZTsKKworLy8gYW55IG9iamVjdCBsYXJnZXIgdGhhbiA0IGJ5dGVzIGdvZXMgdG8gYSBsaWJyYXJ5IGZ1bmN0aW9uCisgICBzaXplID0gb3BzaXplKHApOyAvLyBtaWdodCBuZWVkIHRvIHVzZSBwdXNoc2l6ZSBoZXJlIGluc3RlYWQgb2Ygb3BzaXplPworICAgaWYgKHNpemUgPiA0IHx8IElTQ09NUE9TSVRFKHExdHlwKHApKSkgeworLy8gYWxsb2NhdGUgcmVxdWlyZWQgc3RhY2sKKyAgICAgIGVtaXQoZiwgIlx0c3ViXHRzcCwgJWRcbiIsIHNpemUpOworICAgICAgc3RhY2tvZmZzZXQgLT0gc2l6ZTsKKworLy8gUHVzaCBaIChudW1iZXIgb2YgYnl0ZXMgdG8gcHVzaCkKKyAgICAgIGVtaXQoZiwgIjsgcHVzaCBhcnJheSBzaXplXG4iKTsKKy8vIG1vZGlmeSB6IHN1Y2ggdGhhdCBpdCBiZWNvbWVzIGEgS09OU1QgICAgICAKKyAgICAgIHAtPnouZmxhZ3MgPSBLT05TVDsKKyAgICAgIHZhbF9wdXNoKGYsICZwLT56LCBJTlQpOworLy8gUHVzaCBwb2ludGVyIHRvIFExIChzb3VyY2UpCisgICAgICBlbWl0KGYsICI7IHB1c2ggc291cmNlIHBvaW50ZXJcbiIpOworICAgICAgcHRyX3B1c2goZiwgJnAtPnExKTsKKworLy8gZW1pdCBjYWxsIHRvIGxpYnJhcnkgZnVuY3Rpb24KKyAgICAgIGVtaXQoZiwgIlx0Y2FsbFx0X1BVU0hcbiIpOworCisvLyBzdGFjayBjbGVhbnVwLCB3ZSBzaG91bGQgdXNlIGNhbGxlZSBjbGVhbi11cAorICAgICAgZW1pdChmLCAiXHRhZGRcdHNwLCAlZFxuIiwgKGludCk0KTsKKyAgICAgIHN0YWNrb2Zmc2V0ICs9IDQ7CisgICAgICByZXR1cm47CisgICB9CisvLyBoYW5kbGUgcmVxdWlyZWQgdGVtcG9yYXJpZXMgb2YgMW9wIGluc3RydWN0aW9ucwkgICAKKyAgLy8gdHJhY2tfcHVzaChmLCBwKTsgLy8gdGhpcyBtdXN0IGdvLCBuZWVkcyB0byBiZSBwYXJ0IG9mIHZhbF9wdXNoCisKKyAgIHZhbF9wdXNoKGYsICZwLT5xMSwgcTF0eXAocCkpOworCit9IAorCitzdGF0aWMgdm9pZCBjZ19jYWxsKEZJTEUgKmYsIHN0cnVjdCBJQyAqcCkgCit7CisgICBsb25nCQlzaXplID0gcHVzaGVkYXJnc2l6ZShwKTsKKyAgIGxvbmcJCW9mczsKKyAgIAorLy8gY2FsY3VsYXRlIG9mZnNldCBpbnRvIHN0YWNrCisgICBvZnMgPSBvZnNfZ2V0KCZwLT5xMSk7CisgICAKKyAgIGVtaXQoZiwgIjsgY2FsbFxuIik7CisgIAorLy8gcmVzdG9yZSBhbnkgdGVtcG9yYXJpZXMKKyAgIHRyYWNrX3Jlc3RvcmUoZik7CisKKyAgIGlmICgocC0+cTEuZmxhZ3MgJiAoVkFSfERSRUZPQkopKSA9PSBWQVIpIHsKKy8vIGNhbGwgdG8gbGFiZWwgICAgICAKKyAgICAgIGVtaXQoZiwgIlx0Y2FsbFx0JXMlc1xuIiwgaWRlbnRfcHJlZml4LCBwLT5xMS52LT5pZGVudGlmaWVyKTsKKyAgIH0gZWxzZSBpZiAoKHAtPnExLmZsYWdzICYgKFZBUnxEUkVGT0JKKSkgPT0gKFZBUnxEUkVGT0JKKSAmJiBwLT5xMS5kdHlwID09IFBPSU5URVIpIHsKKyAgICAgIHRlcnJvcigiLS0gY2FsbDogIHBvaW50ZXIgYXJndW1lbnQgbm90IHlldCBzdXBwb3J0ZWQiKTsKKyAgIH0gZWxzZSB0ZXJyb3IoIi0tIGNhbGw6IHVuZXhwZWN0ZWQgY2FsbCBtb2RlXG4iKTsgICAKKyAgIGlmIChzaXplID4gMCkgeworICAgICAgZW1pdChmLCJcdGFkZFx0c3AsICVsZFxuIiwgc2l6ZSk7CisgICAgICBzdGFja29mZnNldCArPSBzaXplOworICAgfSAgICAKK30KKworCitzdGF0aWMgdm9pZCBjZ19hbHUoRklMRSAqZiwgc3RydWN0IElDICpwKQoreworICAgc3RydWN0IG9iagkqeDsKKyAgIGludAkJdHlwOworICAgaW50CQljOworICAgY2hhcgkJKmluc3RyMSwgKmluc3RyMjsKKworICAgYyA9IHAtPmNvZGU7CisgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgQUREOiBpbnN0cjEgPSAiYWRkIjsgaW5zdHIyID0gImFkZGMiOyBicmVhazsKKyAgICAgIGNhc2UgU1VCOiBpbnN0cjEgPSAic3ViIjsgaW5zdHIyID0gInN1YmMiOyBicmVhazsKKyAgICAgIGNhc2UgQURESTJQOiBpbnN0cjEgPSAiYWRkIjsgaW5zdHIyID0gImFkZGMiOyBicmVhazsKKyAgICAgIGNhc2UgU1VCSUZQOiBpbnN0cjEgPSAic3ViIjsgaW5zdHIyID0gInN1YmMiOyBicmVhazsKKyAgICAgIGNhc2UgT1I6IGluc3RyMSA9IGluc3RyMiA9ICJvciI7IGJyZWFrOworICAgICAgY2FzZSBBTkQ6IGluc3RyMSA9IGluc3RyMiA9ICJhbmQiOyBicmVhazsKKyAgICAgIGNhc2UgWE9SOiBpbnN0cjEgPSBpbnN0cjIgPSAieG9yIjsgYnJlYWs7CisgICAgICBkZWZhdWx0OiBpbnN0cjEgPSAieHh4IjsgYnJlYWs7CisgICB9OyAgIAorICAgICAgCisgICBlbWl0KGYsICI7ICVzXG4iLCBpbnN0cjEpOworCisgICAvLyBnZXQgdHlwZSBvZiBhcmd1bWVudAorICAgdHlwID0genR5cChwKTsgICAKKworLy8gdHJ5IHRvIGdldCB6IGFuZCBxMSB0aGUgc2FtZSwgaWYgcG9zc2libGUKKyAgIHN3aXRjaF9JQyhwKTsgCisvLyBoYW5kbGUgcmVxdWlyZWQgdGVtcG9yYXJpZXMgb2YgMm9wIGluc3RydWN0aW9ucwkgIAorICAgdHJhY2tfaWMoZiwgcCk7CisKKworICAgaWYgKCFJU0lOVCh0eXApICYmICFJU1BPSU5URVIodHlwKSkgdGVycm9yKCItLSBhZGRzdWI6IHVuZXhwZWN0ZWQgb3BlcmFuZHMiKTsKKyAKKy8vIExvYWQgUTEgaW50byB0ZW1wb3JhcnkgcmVnaXN0ZXIgdmFsIGlmIG5lY2Vzc2FyeS4KKy8vIEF1dG9tYXRpY2FsbHkgdXNlIHRlbXBvcmFyeSB4LT5hbS0+cmVncHRyIGlmIG5lY2Vzc2FyeS4KKyAgIHggPSAmcC0+cTE7CisgICBlbWl0X2xvYWQoZiwgeC0+YW0tPnJlZ3ZhbFswXSwgeCwgdHlwLCAwLCAibW92Iik7CisgICBlbWl0X2xvYWQoZiwgeC0+YW0tPnJlZ3ZhbFsxXSwgeCwgdHlwLCAyLCAibW92Iik7CisKKy8vIGVtaXQgb3BlcmF0aW9uCisgICB4ID0gJnAtPno7CisgICBpZiAoeC0+YW0tPnJlZ3ZhbFswXSkgeworLy8gb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBvbiB0ZW1wb3JhcmllcworICAgICAgZW1pdF9sb2FkKGYsIHgtPmFtLT5yZWd2YWxbMF0sICZwLT5xMiwgdHlwLCAwLCBpbnN0cjEpOworICAgICAgZW1pdF9sb2FkKGYsIHgtPmFtLT5yZWd2YWxbMV0sICZwLT5xMiwgdHlwLCAyLCBpbnN0cjIpOworICAgfSBlbHNlIHsKKy8vIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgZGlyZWN0bHkgb24gdGFyZ2V0ICh6ID09IHExIGZvciB0aGlzIHRvIHdvcmspCisgICAgICBlbWl0X29wKGYsIHgsICZwLT5xMiwgdHlwLCAwLCBpbnN0cjEpOworICAgfQorCisvLyBlbWl0IHN0b3JlIGlmIG5lY2Vzc2FyeQorICAgeCA9ICZwLT56OworICAgaWYgKHgtPmFtLT5yZWd2YWxbMF0pIHsKKyAgICAgIGlmICgoKHgtPmZsYWdzICYgKFJFR3xEUkVGT0JKKSkgIT0gUkVHKSAmJiB4LT5yZWcgIT0geC0+YW0tPnJlZ3ZhbFswXSkgeyAKKy8vIG9ubHkgd3JpdGUgc3RvcmUgaWYgdGFyZ2V0IGlzIG5vdCBhIHJlZ2lzdGVyIG9yIGluIGNhc2UgaXQgaXMgYSByZWdpc3RlciBpdAorLy8gaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBzb3VyY2UuCisgICAgICAgICBlbWl0X3N0b3JlKGYsIHgsIHgtPmFtLT5yZWd2YWxbMF0sIHR5cCwgMCk7CisgICAgICAgICBlbWl0X3N0b3JlKGYsIHgsIHgtPmFtLT5yZWd2YWxbMV0sIHR5cCwgMik7CisgICAgICB9CisgICB9CisvLyByZWxlYXNlIHRlbXBvcmFyaWVzCisgICB0cmFja19yZWxlYXNlKCk7Cit9ICAgICAgICAgICAgICAgICAgIAkgCisKKworc3RhdGljIHZvaWQgY2dfbHNoaWZ0KEZJTEUgKmYsIHN0cnVjdCBJQyAqcCkKK3sKKy8vIEZpcnN0IHdlIGNoZWNrIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnQtY3V0IGFuZCBkb24ndCBuZWVkIHRvCisvLyBjYWxsIHRoZSBsaWJyYXJ5LgorLy8gW25vdCBkb25lXQorCisgICBsaWJfYWx1KGYsIHAsICJTSEwiKTsKK30gIAorICAgICAgCitzdGF0aWMgdm9pZCBjZ19yc2hpZnQoRklMRSAqZiwgc3RydWN0IElDICpwKQoreworLy8gRmlyc3Qgd2UgY2hlY2sgaWYgd2UgY2FuIHRha2UgYSBzaG9ydC1jdXQgYW5kIGRvbid0IG5lZWQgdG8KKy8vIGNhbGwgdGhlIGxpYnJhcnkuCisvLyBbbm90IGRvbmVdCisKKyAgIGxpYl9hbHUoZiwgcCwgIlNIUiIpOworfSAgICAgICAgCisgICAgICAgIAorCitzdGF0aWMgdm9pZCBjZ19tdWx0KEZJTEUgKmYsIHN0cnVjdCBJQyAqcCkKK3sKKy8vIEZpcnN0IHdlIGNoZWNrIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnQtY3V0IGFuZCBkb24ndCBuZWVkIHRvCisvLyBjYWxsIHRoZSBsaWJyYXJ5LgorLy8gW25vdCBkb25lXQorCisgICBsaWJfYWx1KGYsIHAsICJNVUwiKTsKK30gICAgICAgIAorCitzdGF0aWMgdm9pZCBjZ19kaXYoRklMRSAqZiwgc3RydWN0IElDICpwKQoreworLy8gRmlyc3Qgd2UgY2hlY2sgaWYgd2UgY2FuIHRha2UgYSBzaG9ydC1jdXQgYW5kIGRvbid0IG5lZWQgdG8KKy8vIGNhbGwgdGhlIGxpYnJhcnkuCisvLyBbbm90IGRvbmVdCisKKyAgIGxpYl9hbHUoZiwgcCwgIkRJViIpOworfSAgICAgICAgCisKK3N0YXRpYyB2b2lkIGNnX21vZChGSUxFICpmLCBzdHJ1Y3QgSUMgKnApCit7CisvLyBGaXJzdCB3ZSBjaGVjayBpZiB3ZSBjYW4gdGFrZSBhIHNob3J0LWN1dCBhbmQgZG9uJ3QgbmVlZCB0bworLy8gY2FsbCB0aGUgbGlicmFyeS4KKy8vIFtub3QgZG9uZV0KKworICAgbGliX2FsdShmLCBwLCAiTU9EIik7Cit9IAorLyoKK21vZGlmeSBJQyBzdWNoIHRoYXQgd2UgZ2V0Cit6ID0gcTEgeG9yIDB4ZmZmZgorKi8KK3N0YXRpYyB2b2lkIGNnX2tvbXBsZW1lbnQoRklMRSAqZiwgc3RydWN0IElDICpwKQoreworICAgc3RydWN0IG9iagkqeDsKKworICAgZW1pdChmLCAiOyBrb21wbGVtZW50XG4iKTsKKworICAgcC0+Y29kZSA9IFhPUjsKKworLy8gY2hhbmdlIHEyIHRvIGNvbnN0IDAKKyAgIHggPSAmcC0+cTI7CisgICB4LT5mbGFncyA9IEtPTlNUOworICAgeC0+cmVnID0gMDsKKyAgIHgtPmR0eXAgPSAwOworLy8gaW5zZXJ0IDB4ZmZmZgorICAgZ3ZhbC52bWF4ID0gLTE7CisgICBldmFsX2NvbnN0KCZndmFsLCBNQVhJTlQpOworICAgaW5zZXJ0X2NvbnN0KCZ4LT52YWwsIHp0eXAocCkpOworCisvLyB0cmFuc2ZlciB0byBhbHUKKyAgIGNnX2FsdShmLCBwKTsKK30gICAgCisKKy8qCittb2RpZnkgSUMgc3VjaCB0aGF0IHdlIGdldAoreiA9IDAgLSBxMQorKi8KK3N0YXRpYyB2b2lkIGNnX21pbnVzKEZJTEUgKmYsIHN0cnVjdCBJQyAqcCkKK3sKKyAgIHN0cnVjdCBvYmoJKng7CisKKyAgIGVtaXQoZiwgIjsgbWludXNcbiIpOworCisgICBwLT5jb2RlID0gU1VCOworICAgcC0+cTIgPSBwLT5xMTsKKworLy8gY2hhbmdlIHExIHRvIGNvbnN0IDAKKyAgIHggPSAmcC0+cTE7CisgICB4LT5mbGFncyA9IEtPTlNUOworICAgeC0+cmVnID0gMDsKKyAgIHgtPmR0eXAgPSAwOworLy8gaXMgdGhpcyB0aGUgcmlnaHQgd2F5IG9mIGdlbmVyYXRpbmcgYSBjb25zdGFudD8KKyAgIGd2YWwudm1heCA9IDA7CisgICBldmFsX2NvbnN0KCZndmFsLCBNQVhJTlQpOworICAgaW5zZXJ0X2NvbnN0KCZ4LT52YWwsIHp0eXAocCkpOworCisvLyB0cmFuc2ZlciB0byBhbHUKKyAgIGNnX2FsdShmLCBwKTsKKworfSAgICAKKworc3RhdGljIHZvaWQgY2dfYWRkcmVzcyhGSUxFICpmLCBzdHJ1Y3QgSUMgKnApCit7CisgICBzdHJ1Y3Qgb2JqCSp4OworICAgaW50CQl0eXA7CisgICBsb25nCQlvZnM7CisgICBpbnQJCXJlZzsKKyAgIAorLy8gY2FsY3VsYXRlIG9mZnNldCBpbnRvIHN0YWNrCisgICBvZnMgPSBvZnNfZ2V0KCZwLT5xMSk7CisKKy8vIGhhbmRsZSByZXF1aXJlZCB0ZW1wb3JhcmllcyBvZiAxb3AgaW5zdHJ1Y3Rpb25zCSAgIAorICAgdHJhY2tfaWMoZiwgcCk7CisKKyAgIGVtaXQoZiwgIjsgYWRkcmVzc1xuIik7CisgICAKKy8vIGVtaXQgb3BlcmF0aW9uCisgICB0eXAgPSB6dHlwKHApOworICAgeCA9ICZwLT56OworICAgcmVnID0geC0+cmVnOworICAgaWYgKHgtPmFtLT5yZWd2YWxbMF0pIHsKKyAgICAgIHJlZyA9IHgtPmFtLT5yZWd2YWxbMF07CisgICB9CisvLyBlbWl0IG9wZXJhdGlvbgorICAgZW1pdChmLCAiXHRtb3ZcdCVzLCBzcFxuIiwgcmVnbmFtZXNbcmVnXSk7CisgICBpZiAob2ZzICE9IDApIGVtaXQoZiwgIlx0YWRkXHQlcywgJWxkXG4iLCByZWduYW1lc1tyZWddLCBvZnMpOworCisvLyBlbWl0IHN0b3JlIGlmIG5lY2Vzc2FyeQorICAgdHlwID0genR5cChwKTsKKyAgIHggPSAmcC0+ejsKKyAgIGlmICh4LT5hbS0+cmVndmFsWzBdKSB7CisgICAgICBpZiAoKHgtPmZsYWdzICYgKFJFR3xEUkVGT0JKKSkgIT0gUkVHKSB7IAorLy8gb25seSB3cml0ZSBzdG9yZSBpZiB0YXJnZXQgaXMgbm90IGEgcmVnaXN0ZXIgCisgICAgICAgICBlbWl0X3N0b3JlKGYsIHgsIHgtPmFtLT5yZWd2YWxbMF0sIHR5cCwgMCk7CisgICAgICB9CisgICB9CisvLyByZWxlYXNlIHRlbXBvcmFyaWVzCisgICB0cmFja19yZWxlYXNlKCk7Cit9CisKKy8qCittb2RpZnkgSUMgc3VjaCB0aGF0IHdlIGdldAorQ09NUEFSRSBxMSwgMAorKi8KK3N0YXRpYyB2b2lkIGNnX3Rlc3QoRklMRSAqZiwgc3RydWN0IElDICpwKQoreworICAgc3RydWN0IG9iagkqeDsKKworICAgZW1pdChmLCAiOyB0ZXN0XG4iKTsKKworICAgcC0+Y29kZSA9IENPTVBBUkU7CisKKy8vIGNoYW5nZSBxMiB0byBjb25zdCAwCisgICB4ID0gJnAtPnEyOworICAgeC0+ZmxhZ3MgPSBLT05TVDsKKyAgIHgtPnJlZyA9IDA7CisgICB4LT5kdHlwID0gMDsKKy8vIGluc2VydCAwCisgICBndmFsLnZtYXggPSAwOworICAgZXZhbF9jb25zdCgmZ3ZhbCwgTUFYSU5UKTsKKyAgIGluc2VydF9jb25zdCgmeC0+dmFsLCB6dHlwKHApKTsKKworfSAgCisKKy8qCitTd2FwIG9wZXJhbmRzIHExIDwtPiBxMiBvZiBhbiBJQy4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBicmFuY2ggSUMKK3RvIG1hcCB0aGUgb3BlcmF0aW9uIHRvIHRoZSBhdmFpbGFibGUgY29tYXByaXNvbnMuCisqLworc3RhdGljIHZvaWQgc3dhcF9vcGVyYW5kcyhzdHJ1Y3QgSUMgKnApCit7CisgICBzdHJ1Y3Qgb2JqIHk7CisgICB5ID0gcC0+cTE7CisgICBwLT5xMSA9IHAtPnEyOworICAgcC0+cTIgPSB5OworfQorCitzdGF0aWMgdm9pZCBjZ19icmFuY2hfbW9kaWZ5KHN0cnVjdCBJQyAqY21wLCBzdHJ1Y3QgSUMgKnApCit7CisgICBpbnQJCWM7CisgICBpbnQJCXEyX2luYzsKKyAgIGludAkJc3dhcDsKKyAgIGludAkJcTJfa29uc3Q7ICAKKworICAgCisvLyBncmFiIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24KKyAgIGMgPSBwLT5jb2RlOworICAgCisvKgorSW4gY2FzZSBRMSA9PSBLT05TVCB3ZSBuZWVkIHRvIHN3YXAgb3BlcmFuZHMsIGhvd2V2ZXIKK3RoaXMgb25seSBtYWtlcyBhIGRpZmZlcmVuY2UgaW4gY2FzZSBRMiA9PSBSRUcuCitUaGlzIHdob2xlIGxvZ2ljIGhlcmUgbWlnaHQgbm90IGJlIG5lY2Vzc2FyeSBpZiB0aGUgZnJvbnQtZW5kCithbHdheXMgcHV0cyBLT05TVCBpbiBRMi4gVGVzdCBzZWVtIHRvIGNvbmZpcm0gdGhpcywgaG93ZXZlciBmb3IKK3RoZSB0aW1lIGJlaW5nIHdlIGxlYXZlIHRoZSBjb2RlIGluLgorKi8KKyAgIGlmICgoKGNtcC0+cTEuZmxhZ3MgJiAoS09OU1R8RFJFRk9CSikpID09IEtPTlNUKSAmJiAoKGNtcC0+cTIuZmxhZ3MgJiAoUkVHfERSRUZPQkopKSA9PSBSRUcpKSB7CisvLyBzd2FwIG9wZXJhbmRzICAgICAgCisgICAgICBzd2FwX29wZXJhbmRzKGNtcCk7CisvLyBtb2RpZnkgYnJhbmNoIGNvbmRpdGlvbiB0byBtYXRjaCBvcGVyYW5kIHN3YXAKKyAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgY2FzZSBCTFQ6IGMgPSBCR1Q7IGJyZWFrOworICAgICAgICAgY2FzZSBCR0U6IGMgPSBCTEU7IGJyZWFrOworICAgICAgICAgY2FzZSBCTEU6IGMgPSBCR0U7IGJyZWFrOworICAgICAgICAgY2FzZSBCR1Q6IGMgPSBCTFQ7IGJyZWFrOworICAgICAgfQorICAgfQorCisvLyBDaGVjayBpZiBRMiBpcyBhIEtPTlNULiBJZiBpdCBpcyB3ZSBzaG91bGRuJ3Qgc3dhcCBvcGVyYW5kcy4KKyAgIHEyX2tvbnN0ID0gMDsKKyAgIGlmICgoY21wLT5xMi5mbGFncyAmIChLT05TVHxEUkVGT0JKKSkgPT0gS09OU1QpIHsKKyAgICAgIHEyX2tvbnN0ID0gMTsKKyAgIH0KKworLy8gaW5pdGlhbGl6ZSBtb2RpZmljYXRpb24gZmFsZ3MKKyAgIHN3YXAgPSAwOworICAgcTJfaW5jID0gMDsKKworLy8gZGVjb2RlIGp1bXAgYW5kIGRlY2lkZSB3aGF0IG1vZGlmaWNhdGlvbnMgbXVzdCBiZSB1bmRlcnRha2VuLgorICAgc3dpdGNoIChjKSB7CisvLyBlcXVhbCA9PSwgZ2VuZXJhdGUgJ2plJworICAgICAgY2FzZSBCRVE6IGJyZWFrOworLy8gbm90IGVxdWFsICE9LCBnZW5lcmF0ZSAnam5lJyAgICAgIAorICAgICAgY2FzZSBCTkU6IGJyZWFrOworLy8gbGVzcyB0aGFuICc8JworICAgICAgY2FzZSBCTFQ6IGJyZWFrOworLy8gZ3JlYXRlciBlcXVhbCAnPj0nICAgICAgCisgICAgICBjYXNlIEJHRTogYnJlYWs7CisvLyBsZXNzIGVxdWFsICc8PScgCisvLyBUaGlzIG11c3QgYmUgY2hhbmdlZCBpbnRvIEJMVCBvciBCR0UgICAgIAorICAgICAgY2FzZSBCTEU6CisJIGlmIChxMl9rb25zdCkgeworLy8gUTIgaXMgS09OU1QsIGNhbid0IHN3YXAgb3BlcmFuZHMgYnV0IG11c3QgbW9kaWZ5IHRoZSBjb25zdGFudAorCSAgICBjID0gQkxUOworCSAgICBxMl9pbmMgPSAxOworCSB9IGVsc2UgeworLy8gbXVzdCBzd2FwIG9wZXJhbmRzIHRvIG1hcCB0byBhdmFpbGFibGUgY29tcGFyaXNvbiBpbnN0cnVjdGlvbnMKKyAgICAgICAgICAgIGMgPSBCR0U7CisJICAgIHN3YXAgPSAxOworCSB9ICAgCisJIGJyZWFrOworLy8gZ3JlYXRlciB0aGFuICc+JworICAgICAgY2FzZSBCR1Q6CisJIGlmIChxMl9rb25zdCkgeworLy8gUTIgaXMgS09OU1QsIGNhbid0IHN3YXAgb3BlcmFuZHMgYnV0IG11c3QgbW9kaWZ5IHRoZSBjb25zdGFudAorCSAgICBjID0gQkdFOworCSAgICBxMl9pbmMgPSAxOworCSB9IGVsc2UgeworLy8gbXVzdCBzd2FwIG9wZXJhbmRzIHRvIG1hcCB0byBhdmFpbGFibGUgY29tcGFyaXNvbiBpbnN0cnVjdGlvbnMKKyAgICAgICAgICAgIGMgPSBCTFQ7CisJICAgIHN3YXAgPSAxOworCSB9ICAgCisJIGJyZWFrOworICAgfQorCisvKiAKK01PRElGWSBJQyBpZiBuZWNjZXNzYXJ5LgorTW9kaWZpY2F0aW9uIGxvb2tzIGxpa2UgdGhpczoKK0lmIHEyX2luYyA9PSAxLCB3ZSBpbmNyZW1lbnQgS09OU1QgcTIgYnkgMS4KK0lmIHN3YXAgPT0gMSwgd2Ugc3dhcCBvcGVyYW5kcy4KK0VpdGhlciB3YXksIHdlIHJlcGxhY2UgdGhlICBleGlzaXRpbmcgY29uZGl0aW9uIGNvZGUgd2l0aCB0aGUgbmV3IG9uZS4KKyovCisgICBpZiAoc3dhcCkgc3dhcF9vcGVyYW5kcyhjbXApOworICAgaWYgKHEyX2luYykgeworLy8gcGFydGlhbCBjb25zdGFudAorICAgICAgc3RydWN0IG9iaiAqeDsgCisvLyBpbmNyZW1lbnQgUTIKKyAgICAgIHggPSAmY21wLT5xMjsKKy8vIG5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIHdheSBJJ20gc3VwcG9zZWQgdG8gZG8gdGhpcworICAgICAgZXZhbF9jb25zdCgmeC0+dmFsLCBxMnR5cChjbXApKTsKKyAgICAgIGd2YWwudm1heCA9IHptYWRkKHZtYXgsIDEpOworICAgICAgZXZhbF9jb25zdCgmZ3ZhbCwgTUFYSU5UKTsKKyAgICAgIGluc2VydF9jb25zdCgmeC0+dmFsLCBxMnR5cChjbXApKTsKKyAgIH0KKy8vIGluc2VydCBuZXcgY29uZGl0aW9uIGNvZGUKKyAgIHAtPmNvZGUgPSBjOworfQorCisvL3N0YXRpYyB2b2lkIGNnX2JyYW5jaAorCitzdGF0aWMgdm9pZCBjZ19icmFuY2goRklMRSAqZiwgc3RydWN0IElDICpwKQoreworICAgc3RydWN0IElDCSpjbXA7CisgICBpbnQJCWM7CisvLyBzaXplIGluIGJ5dGVzICAgCisgICBsb25nCQlzaXplOworICAgaW50CQl0eXA7CisgICBjaGFyCQkqc2lnbjsKKy8vIGp1bXAgdGFyZ2V0CisvLyBUaGUgdGFyZ2V0IGluIGNhc2UgdGhlIGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQKKyAgIGxvbmcJCXRhcmdldF90cnVlOworLy8gdGhlIHRhcmdldCBpbiBjYXNlIHRoZSBjb25kaXRpb24gaXMgdmlvbGF0ZWQKKyAgIGxvbmcJCXRhcmdldF9mYWxzZTsgCisvLyBwYXJ0aWFsIGNvbnN0YW50CisgICBzdHJ1Y3Qgb2JqCSp4OyAKKyAgIAorICAgICAgCisgICBpZiAocTF0eXAocCkgIT0gcTJ0eXAocCkpIHRlcnJvcigwKTsKKyAKKyAgIGVtaXQoZiwgIjsgY29tcGFyZVxuIik7CisgICAKKworLy8gdHJ5IHRvIGZpbmQgY29tcGFyZSBJQworICAgY21wID0gcC0+cHJldjsKKyAgIHdoaWxlIChjbXAgJiYgY21wLT5jb2RlID09IEZSRUVSRUcpIGNtcCA9IGNtcC0+cHJldjsKKyAgIGlmICghY21wIHx8IChjbXAtPmNvZGUgIT0gQ09NUEFSRSAmJiBjbXAtPmNvZGUgIT0gVEVTVCkpIHRlcnJvcigiLS0gY2dfYnJhbmNoOiBjb21wYXJlIG5vdCBmb3VuZCIpOyAgIAorCisgICB0eXAgPSBxMXR5cChjbXApOworICAgc2l6ZSA9IHNpemV0YWJbdHlwJk5RXTsKKworICAgaWYgKCFJU0lOVCh0eXApKSB0ZXJyb3IoIi0tIGNnX2JyYW5jaDogdW5leHBlY3RlZCBvYmplY3QgdHlwZSIpOworICAgCisvLyBnZXQganVtcCB0YXJnZXQKKyAgIHRhcmdldF90cnVlID0gKGxvbmcpcC0+dHlwZjsKKyAgIHRhcmdldF9mYWxzZSA9IGxhYmVsX2NvdW50Kys7CisKKyAgIGNnX2JyYW5jaF9tb2RpZnkoY21wLCBwKTsKKworLy8gZ3JhYiB0aGUgYnJhbmNoIGluc3RydWN0aW9uCisgICBjID0gcC0+Y29kZTsKKworLy8gZGV0ZXJtaW5lIHNpZ24vdW5zaWduZWQgbW9kaWZpZXIKKyAgIHNpZ24gPSAicyI7CisgICBpZiAodHlwICYgVU5TSUdORUQpIHsKKyAgICAgIHNpZ24gPSAidSI7CisgICB9CisKKy8vIDEuIHN0ZXAgd2UgYWxsY29hdGUgbmVjZXNzYXkgdGVtcG9yYXJpZXMJICAKKyAgIHRyYWNrX2ljKGYsIGNtcCk7CisKKy8vIFdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggZGlmZmVyZW50IG9wZXJhbmQgc2l6ZXMKKyAgIGlmIChzaXplIDw9IDIpIHsKKy8vIEZpcnN0IGNhc2UgdGFrZXMgY2FyZSBvZiBDSEFSIGFuZCBJTlQvU0hPUlQKKyAgICAgIHggPSAmY21wLT5xMTsKKyAgICAgIGVtaXRfbG9hZChmLCB4LT5hbS0+cmVndmFsWzBdLCB4LCB0eXAsIDAsICJtb3YiKTsKKy8vIGVtaXQgb3BlcmF0aW9uCisgICAgICBpZiAoeC0+YW0tPnJlZ3ZhbFswXSkgeworLy8gb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBvbiB0ZW1wb3JhcmllcworICAgICAgICAgZW1pdF9sb2FkKGYsIHgtPmFtLT5yZWd2YWxbMF0sICZjbXAtPnEyLCB0eXAsIDAsICJjbXAiKTsKKyAgICAgIH0gZWxzZSB7CisvLyBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGRpcmVjdGx5IG9uIHRhcmdldCAoeiA9PSBxMSBmb3IgdGhpcyB0byB3b3JrKQorICAgICAgICAgZW1pdF9vcChmLCB4LCAmY21wLT5xMiwgdHlwLCAwLCAiY21wIik7CisgICAgICB9CisvLyBtdXN0IHJlc3RvcmUgdGVtcG9yYXJpZXMgaGVyZSwKKyAgICAgIHRyYWNrX3Jlc3RvcmUoZik7CisKKyAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgY2FzZSBCTFQ6CisgICAgICAgICAgICBlbWl0KGYsICJcdGolc2xcdCVzJWxkXG4iLCBzaWduLCBsYWJlbF9wcmVmaXgsIHRhcmdldF90cnVlKTsKKwkgICAgYnJlYWs7CisgICAgICAgICBjYXNlIEJHRToKKyAgICAgICAgICAgIGVtaXQoZiwgIlx0aiVzZ2VcdCVzJWxkXG4iLCBzaWduLCBsYWJlbF9wcmVmaXgsIHRhcmdldF90cnVlKTsKKwkgICAgYnJlYWs7CisgICAgICAgICBjYXNlIEJFUToKKyAgICAgICAgICAgIGVtaXQoZiwgIlx0amVcdCVzJWxkXG4iLCBsYWJlbF9wcmVmaXgsIHRhcmdldF90cnVlKTsKKwkgICAgYnJlYWs7CisgICAgICAgICBjYXNlIEJORToKKyAgICAgICAgICAgIGVtaXQoZiwgIlx0am5lXHQlcyVsZFxuIiwgbGFiZWxfcHJlZml4LCB0YXJnZXRfdHJ1ZSk7CisJICAgIGJyZWFrOworICAgICAgfQorCisgICB9IGVsc2UgaWYgKHNpemUgPT0gNCkgeworLy8gTE9ORworICAgICAgeCA9ICZjbXAtPnExOworICAgICAgZW1pdF9sb2FkKGYsIHgtPmFtLT5yZWd2YWxbMF0sIHgsIHR5cCwgMCwgIm1vdiIpOworICAgICAgZW1pdF9sb2FkKGYsIHgtPmFtLT5yZWd2YWxbMV0sIHgsIHR5cCwgMiwgIm1vdiIpOworLy8gZW1pdCBvcGVyYXRpb24KKyAgICAgIGlmICh4LT5hbS0+cmVndmFsWzFdKSB7CisvLyBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIG9uIHRlbXBvcmFyaWVzCisgICAgICAgICBlbWl0X2xvYWQoZiwgeC0+YW0tPnJlZ3ZhbFsxXSwgJmNtcC0+cTIsIHR5cCwgMiwgImNtcCIpOworICAgICAgfSBlbHNlIHsKKy8vIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgZGlyZWN0bHkgb24gdGFyZ2V0ICh6ID09IHExIGZvciB0aGlzIHRvIHdvcmspCisgICAgICAgICBlbWl0X29wKGYsIHgsICZjbXAtPnEyLCB0eXAsIDIsICJjbXAiKTsKKyAgICAgIH0KKy8vIG11c3QgcmVzdG9yZSB0ZW1wb3JhcmllcyBoZXJlLAorICAgICAgdHJhY2tfcmVzdG9yZTIoZik7Ly8gKGJ1dCBkb24ndCByZWxlYXNlKQorICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICBjYXNlIEJMVDoKKyAgICAgICAgICAgIGVtaXQoZiwgIlx0aiVzbFx0JXMlbGRcbiIsIHNpZ24sIGxhYmVsX3ByZWZpeCwgdGFyZ2V0X3RydWUpOworICAgICAgICAgICAgZW1pdChmLCAiXHRqbmVcdCVzbiVsZFxuIiwgbGFiZWxfcHJlZml4LCB0YXJnZXRfZmFsc2UpOworCSAgICBicmVhazsKKyAgICAgICAgIGNhc2UgQkdFOgorICAgICAgICAgICAgZW1pdChmLCAiXHRqJXNsXHQlc24lbGRcbiIsIHNpZ24sIGxhYmVsX3ByZWZpeCwgdGFyZ2V0X2ZhbHNlKTsKKyAgICAgICAgICAgIGVtaXQoZiwgIlx0am5lXHQlcyVsZFxuIiwgbGFiZWxfcHJlZml4LCB0YXJnZXRfdHJ1ZSk7CisJICAgIGJyZWFrOworICAgICAgICAgY2FzZSBCRVE6CisgICAgICAgICAgICBlbWl0KGYsICJcdGpuZVx0JXNuJWxkXG4iLCBsYWJlbF9wcmVmaXgsIHRhcmdldF9mYWxzZSk7CisJICAgIGJyZWFrOworICAgICAgICAgY2FzZSBCTkU6CisgICAgICAgICAgICBlbWl0KGYsICJcdGpuZVx0JXNuJWxkXG4iLCBsYWJlbF9wcmVmaXgsIHRhcmdldF90cnVlKTsKKwkgICAgYnJlYWs7CisgICAgICB9CisvLyBoZXJlIHdlIGhhdmUgdG8gcmVhbGxvY2F0ZSB0ZW1wb3JhcnkuIEhPV0VWRVIgaWYgZG9uZSBjbGV2ZXJseSB3ZSBkb24ndCBoYXZlCisvLyB0byByZWxvYWQgaXQsIEkgaGF2ZSB0byB0aGluayBhYm91dCB0aGUgd2hvbGUgdGhpbmcgYSBsaXR0ZSBiaXQuCisgIC8vIChyZWxvYWQgd2hhdCBpcyBuZWVkZWQsIHVzZSBzYW1lIHRlbXBzIGFzIGFib3ZlKQorIGVtaXRfbG9hZChmLCB4LT5hbS0+cmVndmFsWzBdLCB4LCB0eXAsIDAsICJtb3YiKTsKKworICAgICAgLy8gZW1pdCBvcGVyYXRpb24KKyAgICAgIGlmICh4LT5hbS0+cmVndmFsWzBdKSB7CisvLyBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIG9uIHRlbXBvcmFyaWVzCisgICAgICAgICBlbWl0X2xvYWQoZiwgeC0+YW0tPnJlZ3ZhbFswXSwgJmNtcC0+cTIsIHR5cCwgMCwgImNtcCIpOworICAgICAgfSBlbHNlIHsKKy8vIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgZGlyZWN0bHkgb24gdGFyZ2V0ICh6ID09IHExIGZvciB0aGlzIHRvIHdvcmspCisgICAgICAgICBlbWl0X29wKGYsIHgsICZjbXAtPnEyLCB0eXAsIDAsICJjbXAiKTsKKyAgICAgIH0KKyAgICAgIHRyYWNrX3Jlc3RvcmUoZik7IAorICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgIGNhc2UgQkxUOgorICAgICAgICAgICAgZW1pdChmLCAiXHRqdWdlXHQlcyVsZFxuIiwgbGFiZWxfcHJlZml4LCB0YXJnZXRfdHJ1ZSk7CisJICAgIGJyZWFrOworICAgICAgICAgY2FzZSBCR0U6CisgICAgICAgICAgICBlbWl0KGYsICJcdGp1bFx0JXMlbGRcbiIsIGxhYmVsX3ByZWZpeCwgdGFyZ2V0X3RydWUpOworCSAgICBicmVhazsKKyAgICAgICAgIGNhc2UgQkVROgorICAgICAgICAgICAgZW1pdChmLCAiXHRqZVx0JXMlbGRcbiIsIGxhYmVsX3ByZWZpeCwgdGFyZ2V0X3RydWUpOworCSAgICBicmVhazsKKyAgICAgICAgIGNhc2UgQk5FOgorICAgICAgICAgICAgZW1pdChmLCAiXHRqbmVcdCVzJWxkXG4iLCBsYWJlbF9wcmVmaXgsIHRhcmdldF90cnVlKTsKKwkgICAgYnJlYWs7CisgICAgICB9CisgICAgICAgICAgICAgIAorICAgICAgCisgICB9IGVsc2UgeworICAgICAgdGVycm9yKCJicmFuY2ggc2l6ZSBub3Qgc3VwcG9ydGVkIik7CisgICB9CisKKy8vIGVtaXQgIm5vdCB0YWtlbiIgbGFiZWwKKyAgIGVtaXQoZiwgIiVzbiVsZDpcbiIsIGxhYmVsX3ByZWZpeCwgdGFyZ2V0X2ZhbHNlKTsKKworLy8gcmVsZWFzZSB0ZW1wb3JhcmllcworICAgdHJhY2tfcmVsZWFzZSgpOworfQorCitzdGF0aWMgdm9pZCBjZ19zZXRyZXR1cm4oRklMRSAqZiwgc3RydWN0IElDICpwKQoreworICAgZW1pdChmLCAiOyBzZXQgcmV0dXJuXG4iKTsKKyAgIAorICAgaWYgKHNpemV0YWJbenR5cChwKSZOUV0gPiByZWdzaXplW3AtPnoucmVnXSkgdGVycm9yKCItLSBjZ19zZXRyZXR1cm46IHNpemUgbWlzbWF0Y2giKTsKKyAgIGVtaXRfbG9hZChmLCBSRUdfUjAsICZwLT5xMSwgcTF0eXAocCksIDAsICJtb3YiKTsKK30KKworc3RhdGljIHZvaWQgY2dfZ2V0cmV0dXJuKEZJTEUgKmYsIHN0cnVjdCBJQyAqcCkKK3sKKyAgIGVtaXQoZiwgIjsgZ2V0IHJldHVyblxuIik7CisgICAKKyAgIGlmIChwLT5xMS5yZWcpIHsKKyAgICAgIGVtaXRfc3RvcmUoZiwgJnAtPnosIHAtPnExLnJlZywgenR5cChwKSwgMCk7CisgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNnX21vdmVmcm9tcmVnKEZJTEUgKmYsIHN0cnVjdCBJQyAqcCkKK3sKKyAgIGVtaXRfc3RvcmUoZiwgJnAtPnosIHAtPnExLnJlZywgenR5cChwKSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGNnX21vdmV0b3JlZyhGSUxFICpmLCBzdHJ1Y3QgSUMgKnApCit7CisgICBlbWl0X2xvYWQoZiwgcC0+ei5yZWcsICZwLT5xMSwgenR5cChwKSwgMCwgIm1vdiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBFbmQgb2YgcHJpdmF0ZSBkYXRhIGFuZCBmdW5jdGlvbnMuICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICBEb2VzIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbnMgZm9yIHRoZSBjb2RlLWdlbmVyYXRvci4gR2V0cyBjYWxsZWQgICovCisvKiAgb25jZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCBzaG91bGQgcmV0dXJuIDAgaW4gY2FzZSBvZiBwcm9ibGVtcy4gICAgICAqLworaW50IGluaXRfY2codm9pZCkKK3sKKyAgIGludAkJaTsKKyAgIGludAkJbnJlZ3M7CisgICBpbnQJCXJ0bXA7CisgICBpbnQJCXJzYXZlOworICAgCisvKiAgSW5pdGlhbGl6ZSBzb21lIHZhbHVlcyB3aGljaCBjYW5ub3QgYmUgc3RhdGljYWxseSBpbml0aWFsaXplZCAgICovCisgLyogIGJlY2F1c2UgdGhleSBhcmUgc3RvcmVkIGluIHRoZSB0YXJnZXQncyBhcml0aG1ldGljLiAgICAgICAgICAgICAqLworICAgbWF4YWxpZ24gPSBsMnptKDJMKTsKKyAgIGNoYXJfYml0ID0gbDJ6bSg4TCk7CisKKyAgIHNpemV0YWJbMF0gPSAxOyB0eXBuYW1lWzBdID0gInN0cmFuZ2UiOyBhbGlnblswXSA9IDE7CisgICBzaXpldGFiW0NIQVJdID0gMTsgdHlwbmFtZVtDSEFSXSA9ICJjaGFyIjsgYWxpZ25bQ0hBUl0gPSAxOworICAgc2l6ZXRhYltTSE9SVF0gPSAyOyB0eXBuYW1lW1NIT1JUXSA9ICJzaG9ydCI7IGFsaWduW1NIT1JUXSA9IDI7CisgICBzaXpldGFiW0lOVF0gPSAyOyB0eXBuYW1lW0lOVF0gPSAiaW50IjsgYWxpZ25bSU5UXSA9IDI7CisgICBzaXpldGFiW0xPTkddID0gNDsgdHlwbmFtZVtMT05HXSA9ICJsb25nIjsgYWxpZ25bTE9OR10gPSAyOworICAgc2l6ZXRhYltMTE9OR10gPSA4OyB0eXBuYW1lW0xMT05HXSA9ICJsb25nIGxvbmciOyBhbGlnbltMTE9OR10gPSAyOworICAgc2l6ZXRhYltGTE9BVF0gPSA0OyB0eXBuYW1lW0ZMT0FUXSA9ICJmbG9hdCI7IGFsaWduW0ZMT0FUXSA9IDI7CisgICBzaXpldGFiW0RPVUJMRV0gPSA4OyB0eXBuYW1lW0RPVUJMRV0gPSAiZG91YmxlIjsgYWxpZ25bRE9VQkxFXSA9IDI7CisgICBzaXpldGFiW0xET1VCTEVdID0gODsgdHlwbmFtZVtMRE9VQkxFXSA9ICJsb25nIGRvdWJsZSI7IGFsaWduW0xET1VCTEVdID0gMjsKKyAgIHNpemV0YWJbVk9JRF0gPSAwOyB0eXBuYW1lW1ZPSURdID0gInZvaWQiOyBhbGlnbltWT0lEXSA9IDE7CisgICBzaXpldGFiW1BPSU5URVJdID0gMjsgdHlwbmFtZVtQT0lOVEVSXSA9ICJwb2ludGVyIjsgYWxpZ25bUE9JTlRFUl0gPSAyOworICAgc2l6ZXRhYltBUlJBWV0gPSAwOyB0eXBuYW1lW0FSUkFZXSA9ICJhcnJheSI7IGFsaWduW0FSUkFZXSA9IDE7CisgICBzaXpldGFiW1NUUlVDVF0gPSAwOyB0eXBuYW1lW1NUUlVDVF0gPSAic3RydWN0IjsgYWxpZ25bU1RSVUNUXSA9IDE7CisgICBzaXpldGFiW1VOSU9OXSA9IDA7IHR5cG5hbWVbVU5JT05dID0gInVuaW9uIjsgYWxpZ25bVU5JT05dID0gMTsKKyAgIHNpemV0YWJbRU5VTV0gPSAyOyB0eXBuYW1lW0VOVU1dID0gImVudW0iOyBhbGlnbltFTlVNXSA9IDI7CisgICBzaXpldGFiW0ZVTktUXSA9IDA7IHR5cG5hbWVbRlVOS1RdID0gImZ1bmN0aW9uIjsgYWxpZ25bRlVOS1RdID0gMTsKKyAgIHNpemV0YWJbTUFYSU5UXSA9IDA7CisKKy8vIGZpbGwgaW4gdGhlIGRlZmF1bHQgcmVnaXN0ZXIgZGVzY3JpcHRpb24KKyAgIHJlZ25hbWVzWzBdID0gIm5vcmVnIjsKKyAgIHJlZ25hbWVzW1JFR19SMF0gPSAicjAiOworICAgcmVnbmFtZXNbUkVHX1IxXSA9ICJyMSI7CisgICByZWduYW1lc1tSRUdfUjJdID0gInIyIjsKKyAgIHJlZ25hbWVzW1JFR19SM10gPSAicjMiOworICAgcmVnbmFtZXNbUkVHX1I0XSA9ICJyNCI7ICAgCisgICByZWduYW1lc1tSRUdfUjVdID0gInI1IjsKKyAgIHJlZ25hbWVzW1JFR19SNl0gPSAicjYiOworICAgcmVnbmFtZXNbUkVHX1I3XSA9ICJyNyI7CisgICByZWduYW1lc1tSRUdfUjhdID0gInI4IjsKKyAgIHJlZ25hbWVzW1JFR19SOV0gPSAicjkiOworICAgcmVnbmFtZXNbUkVHX1IxMF0gPSAicjEwIjsKKyAgIHJlZ25hbWVzW1JFR19SMTFdID0gInIxMSI7CisgICByZWduYW1lc1tSRUdfUjEyXSA9ICJyMTIiOworICAgcmVnbmFtZXNbUkVHX1IxM10gPSAicjEzIjsKKworICAgZm9yIChpID0gMTsgaSA8IE1BWFIrMTsgaSsrKSB7CisgICAgICByZWdzaXplW2ldID0gbDJ6bSgyTCk7CisgICAgICByZWd0eXBlW2ldID0gJmx0eXA7CisgICAgICByZWdzY3JhdGNoW2ldID0gMTsKKyAgICAgIHJlZ3NhW2ldID0gMDsKKyAgICAgIHJlZ19wcmlvW2ldID0gMTsKKy8vIHByaXZhdGUgcmVnaXN0ZXIgdHJhY2tpbmcgc3lzdGVtCisvLyBJbmRpY2F0ZSByZWdpc3RlciBpcyBhdmFpbGFibGUgYXMgdGVtcG9yYXJ5LgorICAgICAgdHJhY2tfc3RhdHVzW2ldID0gMDsKKyAgIH0KKworLy8gZGVmYXVsdCBudW1iZXJzIG9mIHJlZ2lzdGVycyB0byB1c2UKKyAgIG5yZWdzID0gNjsKKy8vIGNoZWNrIGNvbW1hbmQgbGluZSBmbGFncyBmb3IgbnVtYmVyIG9mIHJlZ2lzdGVycworICAgaWYgKGdfZmxhZ3NbMF0gJiBVU0VERkxBRykgeworICAgICAgbnJlZ3MgPSBnX2ZsYWdzX3ZhbFswXS5sOworICAgfQorICAgaWYgKG5yZWdzIDwgMykgbnJlZ3MgPSAzOworICAgaWYgKG5yZWdzID4gMTQpIG5yZWdzID0gMTQ7ICAKKy8vIGxpbWl0IGF2YWlsYWJsZSByZWdpc3RlcnMgdG8gJ25yZWdzJworICAgZm9yIChpID0gUkVHX1IwK25yZWdzOyBpIDw9IFJFR19SMTM7IGkrKykgeworICAgICAgcmVnc2FbaV0gPSAxOworICAgICAgcmVnc2NyYXRjaFtpXSA9IDA7CisgICAgICB0cmFja19zdGF0dXNbaV0gfD0gVFJBQ0tfT0ZGTElNSVRTOworICAgfQorCisvLyBnZXQgdGhlIG51bWJlciBvZiB0ZW1wb3JhcnkgcmVnaXN0ZXJzIHRvIHJlc2VydmUKKyAgIGlmIChnX2ZsYWdzWzJdICYgVVNFREZMQUcpIHsKKyAgICAgIHJ0bXAgPSBnX2ZsYWdzX3ZhbFsxXS5sOworICAgfSBlbHNlIHsKKyAgICAgIHJ0bXAgPSAwOworICAgICAgaWYgKG5yZWdzID49IDYpIHJ0bXAgPSAxOworICAgICAgaWYgKG5yZWdzID49IDkpIHJ0bXAgPSAyOworICAgICAgaWYgKG5yZWdzID49IDEyKSBydG1wID0gMzsKKyAgIH0KKyAgIGlmIChydG1wIDwgMCkgcnRtcCA9IDA7CisgICBpZiAocnRtcCA+IDMpIHJ0bXAgPSAzOworCisvLyByZW1vdmUgdGVtcG9yYXJ5IHJlZ2lzdGVycyBmcm9tIGNvZGUgZ2VuZXJhdG9yIHBvb2wgKG9uIHRoZSB0b3Agc2lkZSkKKyAgIGZvciAoaSA9IG5yZWdzLXJ0bXA7IGkgPCBucmVnczsgaSsrKSB7CisgICAgICByZWdzYVtSRUdfUjAraV0gPSAxOworICAgICAgcmVnc2NyYXRjaFtSRUdfUjAraV0gPSAwOworLy8gaW5kaWNhdGUgdG8gdHJhY2tlZCB0aGF0IHRoaXMgaXMgYSBkZWRpY2F0ZWQgdGVtcG9yYXJ5IHJlZ2lzdGVyCisgICAgICB0cmFja19zdGF0dXNbUkVHX1IwK2ldIHw9IFRSQUNLX0RFRElDQVRFRDsKKyAgIH0KKworLy8gZ2V0IG51bWJlcnMgb2YgcmVnaXN0ZXJzIHRvIHNhdmUgYWNyb3NzIGZ1bmN0aW9uIGNhbGxzCisgICBpZiAoZ19mbGFnc1sxXSAmIFVTRURGTEFHKSB7CisgICAgICByc2F2ZSA9IGdfZmxhZ3NfdmFsWzFdLmw7CisgICB9IGVsc2UgeworICAgICAgcnNhdmUgPSAwOworLy8gYXV0b21hdGljYWxseSBzZWxlY3QgCisgICAgICBpZiAobnJlZ3MgPj0gNikgcnNhdmUgPSAyOworICAgICAgaWYgKG5yZWdzID49IDEwKSByc2F2ZSA9IDQ7CisgICB9CisgICBpZiAocnNhdmUgPCAwKSByc2F2ZSA9IDA7CisgICBpZiAocnNhdmUgPiBucmVncy1ydG1wKSByc2F2ZSA9IG5yZWdzLXJ0bXA7CisKKyAgIGZvciAoaSA9IDA7IGkgPCByc2F2ZTsgaSsrKSB7CisgICAgICByZWdzY3JhdGNoW1JFR19SMCtucmVncy1ydG1wLXJzYXZlK2ldID0gMDsKKyAgIH0KKyAgIAorLy8gU1AgaXMgc3BlY2lhbAorICAgcmVnbmFtZXNbUkVHX1NQXSA9ICJzcCI7CisgICByZWdzY3JhdGNoW1JFR19TUF0gPSAwOworICAgcmVnc2FbUkVHX1NQXSA9IDE7CisgICB0cmFja19zdGF0dXNbUkVHX1NQXSB8PSBUUkFDS19PRkZMSU1JVFM7CisvLyBhbmQgRkxBR1MgaXMgc3BlY2lhbAorICAgcmVnbmFtZXNbUkVHX0ZMQUdTXSA9ICJmbGFncyI7CisgICByZWdzY3JhdGNoW1JFR19GTEFHU10gPSAwOworICAgcmVnc2FbUkVHX0ZMQUdTXSA9IDE7CisgICB0cmFja19zdGF0dXNbUkVHX0ZMQUdTXSB8PSBUUkFDS19PRkZMSU1JVFM7CisKKy8vIHByaW50IHNvbWUgc3RhdHVzIHRvIHRoZSBzY3JlZW4KKyAgIHByaW50ZigiRmFsY28xNiBDUFUgaW5mb3JtYXRpb25cbiIpOworICAgcHJpbnRmKCIgICBHUCByZWdpc3RlcnM6ICVkXG4iLCBucmVncyk7CisgICBwcmludGYoIiAgIHRlbXBvcmFyaWVzOiAgJWRcbiIsIHJ0bXApOworICAgcHJpbnRmKCIgICBzYXZlczogICAgICAgICVkXG4iLCByc2F2ZSk7CisKKworCisgIC8qICBEb24ndCB1c2UgbXVsdGlwbGUgY2NzLiAgICovCisgIG11bHRpcGxlX2NjcyA9IDA7CisKKyAgLyogIEluaXRpYWxpemUgdGhlIG1pbi9tYXgtc2V0dGluZ3MuIE5vdGUgdGhhdCB0aGUgdHlwZXMgb2YgdGhlICAgICAqLworICAvKiAgaG9zdCBzeXN0ZW0gbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSB0YXJnZXQgc3lzdGVtIGFuZCB5b3UgbWF5ICovCisgIC8qICBvbmx5IHVzZSB0aGUgc21hbGxlc3QgbWF4aW11bSB2YWx1ZXMgQU5TSSBndWFyYW50ZWVzIGlmIHlvdSAgICAgKi8KKyAgLyogIHdhbnQgdG8gYmUgcG9ydGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgVGhhdCdzIHRoZSByZWFzb24gZm9yIHRoZSBzdWJ0cmFjdGlvbiBpbiB0X21pbltJTlRdLiBMb25nIGNvdWxkICovCisgIC8qICBiZSB1bmFibGUgdG8gcmVwcmVzZW50IC0yMTQ3NDgzNjQ4IG9uIHRoZSBob3N0IHN5c3RlbS4gICAgICAgICAgKi8KKyAgdF9taW5bQ0hBUl09bDJ6bSgtMTI4TCk7CisgIHRfbWluW1NIT1JUXT1sMnptKC0zMjc2OEwpOworICB0X21pbltJTlRdPXRfbWluKFNIT1JUKTsKKyAgdF9taW5bTE9OR109em1zdWIobDJ6bSgtMjE0NzQ4MzY0N0wpLGwyem0oMUwpKTsKKyAgdF9taW5bTExPTkddPXptbHNoaWZ0KGwyem0oMUwpLGwyem0oNjNMKSk7CisgIHRfbWluW01BWElOVF09dF9taW4oTExPTkcpOworICAKKyAgdF9tYXhbQ0hBUl09dWwyenVtKDEyN0wpOworICB0X21heFtTSE9SVF09dWwyenVtKDMyNzY3VUwpOworICB0X21heFtJTlRdPXRfbWF4KFNIT1JUKTsKKyAgdF9tYXhbTE9OR109dWwyenVtKDIxNDc0ODM2NDdVTCk7CisgIHRfbWF4W0xMT05HXT16dW1yc2hpZnQoenVta29tcGwodWwyenVtKDBVTCkpLHVsMnp1bSgxVUwpKTsKKyAgdF9tYXhbTUFYSU5UXT10X21heChMTE9ORyk7CisgIAorICB0dV9tYXhbQ0hBUl09dWwyenVtKDI1NVVMKTsKKyAgdHVfbWF4W1NIT1JUXT11bDJ6dW0oNjU1MzVVTCk7CisgIHR1X21heFtJTlRdPXRfbWF4KFVOU0lHTkVEfFNIT1JUKTsKKyAgdHVfbWF4W0xPTkddPXVsMnp1bSg0Mjk0OTY3Mjk1VUwpOworICB0dV9tYXhbTExPTkddPXp1bWtvbXBsKHVsMnp1bSgwVUwpKTsKKyAgdHVfbWF4W01BWElOVF09dF9tYXgoVU5TSUdORUR8TExPTkcpOworICAKKworICB0YXJnZXRfbWFjcm9zPW1hcnJheTsKKworLy8gbG9jYWwgbGFiZWwgY291bnRlcgorICBsYWJlbF9jb3VudCA9IDA7CisKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgaW5pdF9kYihGSUxFICpmKQoreworfQorCitpbnQgZnJldHVybihzdHJ1Y3QgVHlwICp0KQorLyogIFJldHVybnMgdGhlIHJlZ2lzdGVyIGluIHdoaWNoIHZhcmlhYmxlcyBvZiB0eXBlIHQgYXJlIHJldHVybmVkLiAqLworLyogIElmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgcmV0dXJuZWQgaW4gYSByZWdpc3RlciByZXR1cm5zIDAuICAgICAgICAqLworLyogIEEgcG9pbnRlciBNVVNUIGJlIHJldHVybmVkIGluIGEgcmVnaXN0ZXIuIFRoZSBjb2RlLWdlbmVyYXRvciAgICAqLworLyogIGhhcyB0byBzaW11bGF0ZSBhIHBzZXVkbyByZWdpc3RlciBpZiBuZWNlc3NhcnkuICAgICAgICAgICAgICAgICAqLworeworICAgaW50CSAgICAgICByZXQ7CisgICBpbnQJICAgICAgIHA7CisgICAKKyAgIHJldCA9IDA7CisgICBwID0gdC0+ZmxhZ3MgJiBOUTsKKyAgIAorICAgaWYgKHNpemV0YWJbcF0gPD0gcmVnc2l6ZVtSRUdfUjBdKSByZXQgPSBSRUdfUjA7CisgIAorICAgcmV0dXJuIHJldDsKK30KKworaW50IHJlZ19wYWlyKGludCByLCBzdHJ1Y3QgcnBhaXIgKnApCisvKiBSZXR1cm5zIDAgaWYgdGhlIHJlZ2lzdGVyIGlzIG5vIHJlZ2lzdGVyIHBhaXIuIElmIHIgICovCisvKiBpcyBhIHJlZ2lzdGVyIHBhaXIgbm9uLXplcm8gd2lsbCBiZSByZXR1cm5lZCBhbmQgdGhlICovCisvKiBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBwIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHR3byAgICovCisvKiBlbGVtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIHJldHVybiAwOworfQorCisKK2ludCByZWdvayhpbnQgciwgaW50IHQsIGludCBtb2RlKQorLyogIFJldHVybnMgMCBpZiByZWdpc3RlciByIGNhbm5vdCBzdG9yZSB2YXJpYWJsZXMgb2YgICAqLworLyogIHR5cGUgdC4gSWYgdD09UE9JTlRFUiBhbmQgbW9kZSE9MCB0aGVuIGl0IHJldHVybnMgICAqLworLyogIG5vbi16ZXJvIG9ubHkgaWYgdGhlIHJlZ2lzdGVyIGNhbiBzdG9yZSBhIHBvaW50ZXIgICAqLworLyogIGFuZCBkZXJlZmVyZW5jZSBhIHBvaW50ZXIgdG8gbW9kZS4gICAgICAgICAgICAgICAgICAqLworeworLy8gc2ltcGxlIHBhcmFtdGVyZSBjaGVjayAgIAorICAgaWYociA9PSAwKSByZXR1cm4gMDsKKworLy8gaWYgZmxvYXRpbmcgcG9pbnQsIHdlIGRvbid0IGtlZXAgdGhlbSBpbiByZWdpc3RlcnMgYXQgYWxsCisgICBpZiAoSVNGTE9BVCh0KSkgcmV0dXJuIDA7CisKKy8vIE11c3QgYmUgaW50ZWdlciBvciBwb2ludGVyLCBrZWVwIHRoZW0gaW4gcmVnaXN0ZXIgaWYgcG9zc2libGUuIAorICAgdCAmPSBOUTsKKyAgIGlmIChzaXpldGFiW3RdIDw9IHJlZ3NpemVbcl0pIHJldHVybiAxOworICAgCisgICByZXR1cm4gMDsKK30KKworaW50IGRhbmdlcm91c19JQyhzdHJ1Y3QgSUMgKnApCisvKiAgUmV0dXJucyB6ZXJvIGlmIHRoZSBJQyBwIGNhbiBiZSBzYWZlbHkgZXhlY3V0ZWQgICAgICovCisvKiAgd2l0aG91dCBkYW5nZXIgb2YgZXhjZXB0aW9ucyBvciBzaW1pbGFyIHRoaW5ncy4gICAgICovCisvKiAgdmJjYyBtYXkgZ2VuZXJhdGUgY29kZSBpbiB3aGljaCBub24tZGFuZ2Vyb3VzIElDcyAgICovCisvKiAgYXJlIHNvbWV0aW1lcyBleGVjdXRlZCBhbHRob3VnaCBjb250cm9sLWZsb3cgbWF5ICAgICovCisvKiAgbmV2ZXIgcmVhY2ggdGhlbSAobWFpbmx5IHdoZW4gbW92aW5nIGNvbXB1dGF0aW9ucyAgICovCisvKiAgb3V0IG9mIGxvb3BzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVHlwaWNhbCBJQ3MgdGhhdCBnZW5lcmF0ZSBleGNlcHRpb25zIG9uIHNvbWUgICAgICAgICovCisvKiAgbWFjaGluZXMgYXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gYWNjZXNzZXMgdmlhIHBvaW50ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gZGl2aXNpb24vbW9kdWxvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gb3ZlcmZsb3cgb24gc2lnbmVkIGludGVnZXIvZmxvYXRzICAgICAgICAgICAgICovCit7CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBtdXN0X2NvbnZlcnQoaW50IHNyYywgaW50IGRzdCwgaW50IGNvbnN0X2V4cHIpCit7CisgICBpbnQJCXNyY3AgPSBzcmMgJiBOUTsKKyAgIGludAkJZHN0cCA9IGRzdCAmIE5ROworCisgICBpZiAoSVNJTlQoc3JjKSAmJiBJU0lOVChkc3QpKSB7CisgICAgICBpZiAoc2l6ZXRhYltzcmNwXSA+PSBzaXpldGFiW2RzdHBdKSByZXR1cm4gMDsKKyAgICAgLy8gaWYgKHNpemV0YWJbc3JjcF0gPT0gMSAmJiBzaXpldGFiW2RzdHBdID09IDIpIHJldHVybiAwOyAgICAgICAgCisgICB9IGVsc2UgaWYgKElTSU5UKHNyYykgJiYgSVNQT0lOVEVSKGRzdCkpIHsKKyAgICAgIGlmIChzaXpldGFiW3NyY3BdID49IHNpemV0YWJbZHN0cF0pIHJldHVybiAwOworICAgICAvLyBpZiAoc2l6ZXRhYltzcmNwXSA9PSAxICYmIHNpemV0YWJbZHN0cF0gPT0gMikgcmV0dXJuIDA7ICAgICAgICAKKyAgIH0gZWxzZSBpZiAoSVNQT0lOVEVSKHNyYykgJiYgSVNJTlQoZHN0KSkgeworICAgICAgaWYgKHNpemV0YWJbc3JjcF0gPj0gc2l6ZXRhYltkc3RwXSkgcmV0dXJuIDA7CisgICAgLy8gIGlmIChzaXpldGFiW3NyY3BdID09IDEgJiYgc2l6ZXRhYltkc3RwXSA9PSAyKSByZXR1cm4gMDsgICAgICAgIAorICAgfSAKKyAgIAorLy8gbm8gY29udmVyc2lvbiB3aGVuIHNyYyBhbmQgZHN0IGFyZSBzYW1lIHR5cGUgICAKKyAgIGlmIChzcmMgPT0gZHN0KSByZXR1cm4gMDsKKworICAgCisgICByZXR1cm4gMTsKK30KKworLyogUmV0dXJuIG5hbWUgb2YgbGlicmFyeSBmdW5jdGlvbiwgaWYgdGhpcyBub2RlIHNob3VsZCBiZQorICAgaW1wbGVtZW50ZWQgdmlhIGxpYmNhbGwuICovCitjaGFyICp1c2VfbGliY2FsbChucCBwKQoreworCisvKgorICAgZm9sbG93aW5nIG9wZXJhdGlvbnMgZ28gaW50byBsaWJyYXJ5CisKK04gLSBuYXRpdmUKK0wgLSBsaWJyYXJ5IGNhbGwgKHNvbWUgcGFyYW10ZXJzIGFyZSBpbXBsZW1lbnRlZCBuYXRpdmUpCitBIC0gbGlicmFyeSBjYWxsIChhbGwgdGhlIHRpbWUpCitYIC0gbm90IHN1cHBvcnRlZAorLSAtIG5vdCB2YWxpZCAobm90IGdlbmVyYXRlZCBieSBmcm9udC1lbmQpCis/IC0gd2hhdCB0byBkbz8KKworICAgICAgICAgICAgQ0hBUiAgU0hPUlQvSU5UICBMT05HICBMTE9ORyAgRkxPQVQgIERPVUJMRSAgTERPVUJMRQorCitDTVAgICAgICAgICAgTiAgICAgICAgTiAgICAgICAgTiAgICAgWCAgICAgID8gICAgICBYICAgICAgIFgKK09SICAgICAgICAgICBOICAgICAgICBOICAgICAgICBOICAgICBYICAgICAgLSAgICAgIC0gICAgICAgLQorWE9SICAgICAgICAgIE4gICAgICAgIE4gICAgICAgIE4gICAgIFggICAgICAtICAgICAgLSAgICAgICAtCitBTkQgICAgICAgICAgTiAgICAgICAgTiAgICAgICAgTiAgICAgWCAgICAgIC0gICAgICAtICAgICAgIC0KK0xTSElGVCAgICAgICBMICAgICAgICBMICAgICAgICBMICAgICBYICAgICAgLSAgICAgIC0gICAgICAgLQorUlNISUZUICAgICAgIEwgICAgICAgIEwgICAgICAgIEwgICAgIFggICAgICAtICAgICAgLSAgICAgICAtCitBREQgICAgICAgICAgTiAgICAgICAgTiAgICAgICAgTiAgICAgWCAgICAgIEEgICAgICBYICAgICAgIFgKK1NVQiAgICAgICAgICBOICAgICAgICBOICAgICAgICBOICAgICBYICAgICAgQSAgICAgIFggICAgICAgWAorTVVMVCAgICAgICAgIEwgICAgICAgIEwgICAgICAgIEwgICAgIFggICAgICBBICAgICAgWCAgICAgICBYCitESVYgICAgICAgICAgTCAgICAgICAgTCAgICAgICAgTCAgICAgWCAgICAgIEEgICAgICBYICAgICAgIFgKK01PRCAgICAgICAgICBMICAgICAgICBMICAgICAgICBMICAgICBYICAgICAgQSAgICAgIFggICAgICAgWAorKi8KKworICAgc3RhdGljIGNoYXIJZm5hbWVbMTZdOworICAgY2hhcgkJKnJldDsKKyAgIGludAkJZjsKKyAgIGNoYXIJCSpzaWduOworICAgY2hhcgkJKmR0eXBlOworICAgaW50CQljb2RlOworCisgICBpZihwLT5mbGFncz49RVFVQUwmJnAtPmZsYWdzPD1HUkVBVEVSRVEpeworICAgZXh0ZXJuIHN0cnVjdCBUeXAgKmFyaXRoX3R5cCgpOworICAgIHN0cnVjdCBUeXAgKnQ9YXJpdGhfdHlwKHAtPmxlZnQtPm50eXAscC0+cmlnaHQtPm50eXApOworICAgIGY9dC0+ZmxhZ3MmTlU7CisgICAgZnJlZXR5cCh0KTsKKyAgICBpZigoZiZOUSk9PUxMT05HKXsKKyAgICAgIHNwcmludGYoZm5hbWUsIl9fY21wJXMlc2xsIixlbmFtZVtwLT5mbGFnc10sKGYmVU5TSUdORUQpJiZwLT5mbGFncyE9RVFVQUwmJnAtPmZsYWdzIT1JTkVRVUFMPyJ1IjoiIik7CisgICAgICByZXQ9Zm5hbWU7CisgICAgfWVsc2UgaWYoKGYmTlEpPT1GTE9BVCl7CisgICAgICBzcHJpbnRmKGZuYW1lLCJfX2NtcCVzJXNmIixlbmFtZVtwLT5mbGFnc10sKGYmVU5TSUdORUQpJiZwLT5mbGFncyE9RVFVQUwmJnAtPmZsYWdzIT1JTkVRVUFMPyJ1IjoiIik7CisgICAgICByZXQ9Zm5hbWU7CisgICAgfWVsc2UgaWYoKGYmTlEpPT1ET1VCTEV8fChmJk5RKT09TERPVUJMRSl7CisgICAgICBzcHJpbnRmKGZuYW1lLCJfX2NtcCVzJXNkIixlbmFtZVtwLT5mbGFnc10sKGYmVU5TSUdORUQpJiZwLT5mbGFncyE9RVFVQUwmJnAtPmZsYWdzIT1JTkVRVUFMPyJ1IjoiIik7CisgICAgICByZXQ9Zm5hbWU7CisgICAgfQorICAgfWVsc2V7CisvLyBnZXQgY29kZSBvZiBvcGVyYXRpb24KKyAgICAgIGNvZGUgPSBwLT5mbGFnczsKKy8vIGdldCBkYXRhIHR5cGUKKyAgICAgIGYgPSBwLT5udHlwLT5mbGFncyAmIE5VOworCisgICAgICBzaWduID0gInMiOworICAgICAgaWYgKGYgJiBVTlNJR05FRCkgeworICAgICAgICAgc2lnbiA9ICJ1IjsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChmICYgTlEpIHsKKyAgICAgICAgIGNhc2UgQ0hBUjogZHR5cGUgPSAiaTgiOyBicmVhazsKKyAgICAgICAgIGNhc2UgU0hPUlQ6CisgICAgICAgICBjYXNlIElOVDogZHR5cGUgPSAiaTE2IjsgYnJlYWs7CisgICAgICAgICBjYXNlIExPTkc6IGR0eXBlID0gImkzMiI7IGJyZWFrOworICAgICAgICAgY2FzZSBGTE9BVDogZHR5cGUgPSAiZjMyIjsgYnJlYWs7CisgICAgICAgICBjYXNlIERPVUJMRTogZHR5cGUgPSAiZjY0IjsgYnJlYWs7CisgICAgICAgICBkZWZhdWx0OiBkdHlwZSA9ICIiOyBicmVhazsKKyAgICAgICAgICAgIHRlcnJvcigiLS11c2VfbGliY2FsbDogZGF0YSB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKKwkgICAgYnJlYWs7CisgICAgICB9CisvLyBkZWZhdWx0IGlzIG5vIGZ1bmN0aW9uCisgICAgICByZXQgPSAwOworICAgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgICBjYXNlIExTSElGVDogc3ByaW50ZihmbmFtZSwgIl9fc2hsXyVzJXMiLCBzaWduLCBkdHlwZSk7IHJldCA9IGZuYW1lOyBicmVhazsKKyAgICAgICAgIGNhc2UgUlNISUZUOiBzcHJpbnRmKGZuYW1lLCAiX19zaHJfJXMlcyIsIHNpZ24sIGR0eXBlKTsgcmV0ID0gZm5hbWU7IGJyZWFrOworICAgICAgICAgY2FzZSBBREQ6CisJICAgIGlmIChJU0ZMT0FUKGYpKSB7IHNwcmludGYoZm5hbWUsICJfX2FkZF8lcyIsIGR0eXBlKTsgcmV0ID0gZm5hbWU7IH0KKwkgICAgYnJlYWs7CisJIGNhc2UgU1VCOgorCSAgICBpZiAoSVNGTE9BVChmKSkgeyBzcHJpbnRmKGZuYW1lLCAiX19zdWJfJXMiLCBkdHlwZSk7IHJldCA9IGZuYW1lOyB9CisJICAgIGJyZWFrOworCSBjYXNlIE1JTlVTOgorCSAgICBpZiAoSVNGTE9BVChmKSkgeyBzcHJpbnRmKGZuYW1lLCAiX19uZWdfJXMiLCBkdHlwZSk7IHJldCA9IGZuYW1lOyB9CisJICAgIGJyZWFrOworCSBjYXNlIE1VTFQ6IHNwcmludGYoZm5hbWUsICJfX211bF8lcyVzIiwgc2lnbiwgZHR5cGUpOyByZXQgPSBmbmFtZTsgYnJlYWs7CisJIGNhc2UgRElWOgorCSAgICBzcHJpbnRmKGZuYW1lLCAiX19kaXZfJXMlcyIsIHNpZ24sIGR0eXBlKTsgcmV0ID0gZm5hbWU7CisJICAgIGJyZWFrOworCSBjYXNlIE1PRDoKKwkgICAgc3ByaW50ZihmbmFtZSwgIl9fbW9kXyVzJXMiLCBzaWduLCBkdHlwZSk7IHJldCA9IGZuYW1lOworCSAgICBicmVhazsKKyAgICAgIH0KKyAgIH0KKyAgCisgICBpZihyZXQpeworLyogZGVjbGFyZSBmdW5jdGlvbiBpZiBuZWNlc3NhcnkgKi8KKyAgICAgIHN0cnVjdCBzdHJ1Y3RfZGVjbGFyYXRpb24gKnNkO3N0cnVjdCBUeXAgKnQ7CisgICAgICBpZighZmluZF9leHRfdmFyKHJldCkpeworICAgICAgICAgc2QgPSBteW1hbGxvYyhzaXplb2YoKnNkKSk7CisgICAgICAgICBzZC0+Y291bnQgPSAwOworICAgICAgICAgdCA9IG5ld190eXAoKTsKKyAgICAgICAgIHQtPmZsYWdzID0gRlVOS1Q7CisgICAgICAgICB0LT5leGFjdCA9IGFkZF9zZChzZCwgRlVOS1QpOworICAgICAgICAgdC0+bmV4dCA9IGNsb25lX3R5cChwLT5udHlwKTsKKyAgICAgICAgIGFkZF92YXIocmV0LCB0LCBFWFRFUk4sIDApOworICAgICAgfQorICAgfQorICAgcmV0dXJuIHJldDsKK30KKworCisKK3ZvaWQgZ2VuX2RzKEZJTEUgKmYsIHptYXggc2l6ZSwgc3RydWN0IFR5cCAqdCkKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjcmVhdGUgPHNpemU+IGJ5dGVzIG9mIHN0b3JhZ2UgKi8KKy8qICBpbml0aWFsaXplZCB3aXRoIHplcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgIGlmIChuZXdvYmopIHsKKyAgICAgIGVtaXQoZiwgIlx0ZGJcdGR1cCglbGQsIDApXG4iLCB6bTJsKHNpemUpKTsKKyAgIH0gZWxzZSB7CisgICAgICBlbWl0IChmLCAiLS0gc29tZWh0aW5nJ3Mgd3JvbmdcbiIpOworICAgfSAgICAgCisgICBuZXdvYmogPSAwOworfQorCit2b2lkIGdlbl9hbGlnbihGSUxFICpmLCB6bWF4IGFsaWduKQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIG1ha2Ugc3VyZSB0aGUgbmV4dCBkYXRhIGlzICAgICAqLworLyogIGFsaWduZWQgdG8gbXVsdGlwbGVzIG9mIDxhbGlnbj4gYnl0ZXMuICAgICAgICAgICAgICAqLworeworICAgaW50IHA7CisgICBwID0gcDsgCit9CisKK3ZvaWQgZ2VuX3Zhcl9oZWFkKEZJTEUgKmYsIHN0cnVjdCBWYXIgKnYpCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIHRoZSBoZWFkIG9mIGEgdmFyaWFibGUgICovCisvKiAgZGVmaW5pdGlvbiwgaS5lLiB0aGUgbGFiZWwgYW5kIGluZm9ybWF0aW9uIGZvciAgICAgICovCisvKiAgbGlua2FnZSBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgICBpbnQJCWNvbnN0ZmxhZzsKKworICAgaWYgKHYtPmNsaXN0KSBjb25zdGZsYWcgPSBpc19jb25zdCh2LT52dHlwKTsKKyAgIGlmICh2LT5zdG9yYWdlX2NsYXNzID09IFNUQVRJQykgeworICAgICAgaWYgKCh2LT52dHlwLT5mbGFncyZOUSkgPT0gRlVOS1QpIHJldHVybjsKKyAgICAgIGlmICh2LT5jbGlzdCAmJiAoIWNvbnN0ZmxhZykgJiYgc2VjdGlvbiAhPSBTRUNfREFUQSkgeworICAgICAgICAgZW1pdChmLCAiXG5cdHNlY3Rpb25cdCVzXG4iLCBzZWNfZGF0YW5hbWUpOworICAgICAgICAgaWYgKGYpIHNlY3Rpb24gPSBTRUNfREFUQTsKKyAgICAgIH0KKyAgICAgIGlmICh2LT5jbGlzdCAmJiBjb25zdGZsYWcgJiYgc2VjdGlvbiAhPSBTRUNfUk9EQVRBKSB7CisgICAgICAgICBlbWl0KGYsICJcblx0c2VjdGlvblx0JXNcbiIsIHNlY19yb2RhdGFuYW1lKTsKKyAgICAgICAgIGlmIChmKSBzZWN0aW9uID0gU0VDX1JPREFUQTsKKyAgICAgIH0KKyAgICAgIGlmICghdi0+Y2xpc3QgJiYgc2VjdGlvbiAhPSBTRUNfQlNTKSB7CisgICAgICAgICBlbWl0KGYsICJcblx0c2VjdGlvblx0JXNcbiIsIHNlY19ic3NuYW1lKTsKKyAgICAgICAgIGlmIChmKSBzZWN0aW9uID0gU0VDX0JTUzsKKyAgICAgIH0KKyAgICAgIGVtaXQoZiwgIiVzJWxkOiIsIGxhYmVsX3ByZWZpeCwgem0ybCh2LT5vZmZzZXQpKTsKKworICAgICAgbmV3b2JqID0gMTsKKyAgIH0KKyAgIGlmICh2LT5zdG9yYWdlX2NsYXNzID09IEVYVEVSTikgeworICAgICAgaWYgKHYtPmZsYWdzICYgKERFRklORUR8VEVOVEFUSVZFKSkgeworICAgICAgICAgaWYgKHYtPmNsaXN0ICYmICghY29uc3RmbGFnKSAmJiBzZWN0aW9uICE9IFNFQ19EQVRBKSB7CisgICAgICAgICAgICBlbWl0KGYsICJcblx0c2VjdGlvblx0JXNcbiIsIHNlY19kYXRhbmFtZSk7CisgICAgICAgICAgICBpZiAoZikgc2VjdGlvbj1TRUNfREFUQTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICh2LT5jbGlzdCAmJiBjb25zdGZsYWcgJiYgc2VjdGlvbiAhPSBTRUNfUk9EQVRBKSB7CisgICAgICAgICAgICBlbWl0KGYsICJcblx0c2VjdGlvblx0JXNcbiIsIHNlY19yb2RhdGFuYW1lKTsgCisgICAgICAgICAgICBpZihmKSBzZWN0aW9uID0gU0VDX1JPREFUQTsKKyAgICAgICAgIH0KKyAgICAgICAgIGlmICghdi0+Y2xpc3QgJiYgc2VjdGlvbiAhPSBTRUNfQlNTKSB7CisgICAgICAgICAgICBlbWl0KGYsICJcblx0c2VjdGlvblx0JXNcbiIsIHNlY19ic3NuYW1lKTsKKyAgICAgICAgICAgIGlmIChmKSBzZWN0aW9uID0gU0VDX0JTUzsKKyAgICAgICAgIH0KKyAgICAgICAgIGVtaXQoZiwgIlx0cHVibGljXHQlcyVzXG4iLCBpZGVudF9wcmVmaXgsIHYtPmlkZW50aWZpZXIpOworICAgICAgICAgZW1pdChmLCAiJXMlczoiLCBpZGVudF9wcmVmaXgsIHYtPmlkZW50aWZpZXIpOworICAgICAgICAgbmV3b2JqID0gMTsKKyAgICAgIH0KKyAgIH0KK30KKwordm9pZCBnZW5fZGMoRklMRSAqZiwgaW50IHQsIHN0cnVjdCBjb25zdF9saXN0ICpwKQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSBzdGF0aWMgc3RvcmFnZSAgICAgICAgICAqLworLyogIGluaXRpYWxpemVkIHdpdGggY29uc3QtbGlzdCBwLiAgICAgICAgICAgICAgICAgICAgICAqLworeworICAgZW1pdChmLCAiXHQlc1x0IiwgZGN0W3QmTlFdKTsKKyAgIGlmICghcC0+dHJlZSkgeworICAgICAgaWYgKCh0Jk5RKSA9PSBGTE9BVCB8fCAodCZOUSkgPT0gRE9VQkxFKSB7CisgICAgICAgICBlbWl0KGYsICItLSBmbG9hdGluZyBwb2ludCBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgIH0gZWxzZSB7CisJIGVtaXR2YWwoZiwgJnAtPnZhbCwgdCZOVSk7CisgICAgICB9CisgICB9IGVsc2UgeworICAgICAgICAgZW1pdChmLCAiLS0gZ2VuX2RjOiB3aGF0IHRoZSBoZWxsXG4iKTsKKyAgIH0KKyAgIGVtaXQoZiwgIlxuIik7CisgICBuZXdvYmogPSAwOworfQorCisKKy8qICBUaGUgbWFpbiBjb2RlLWdlbmVyYXRpb24gcm91dGluZS4gICAgICAgICAgICAgICAgICAgKi8KKy8qICBmIGlzIHRoZSBzdHJlYW0gdGhlIGNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8uICAgICAgKi8KKy8qICBwIGlzIGEgcG9pbnRlciB0byBhIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBJQ3MgICAgICAgKi8KKy8qICBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBib2R5IHRvIGdlbmVyYXRlIGNvZGUgZm9yLiAgKi8KKy8qICB2IGlzIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBvZmZzZXQgaXMgdGhlIHNpemUgb2YgdGhlIHN0YWNrZnJhbWUgdGhlIGZ1bmN0aW9uICAgKi8KKy8qICBuZWVkcyBmb3IgbG9jYWwgdmFyaWFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwordm9pZCBnZW5fY29kZShGSUxFICpmLCBzdHJ1Y3QgSUMgKnAsIHN0cnVjdCBWYXIgKnYsIHptYXggb2Zmc2V0KQorLyogIFRoZSBtYWluIGNvZGUtZ2VuZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgIHN0cnVjdCBJQwkqaGVhZDsKKyAgIGludAkJYzsKKyAgCisgICBpZiAoREVCVUcmMSkgcHJpbnRmKCJnZW5fY29kZSgpXG4iKTsKKyAgIAorICAgbG9mZiA9ICgoem0ybChvZmZzZXQpICsgMSkgLyAyKSAqIDI7CisgICBzdGFja29mZnNldCA9IDA7CisgICBjZF9mdW5jdGlvbl9lbnRyeShmLCB2LCBsb2ZmKTsKKyAgIAorLy8gaW5pdGlhbGl6ZSB0ZW1wb3JhcnkgcmVnaXN0ZXIgdHJhY2tpbmcKKyAgIHRyYWNrX2luaXQoKTsKKworICAgaGVhZCA9IHA7CisgICBmb3IoOyBwOyBwID0gcC0+bmV4dCl7CisvLyBwcmludDogdGhpcyBkb2Vzbid0IHdvcmsgcmlnaHQsIGR1ZSB0byBlbWl0IGJ1ZmZlcgorICAgcHJpbnRpYyhmLCBwKTsKKyAgIGVtaXQoZiwgIjsgc3RhY2tvZmZzZXQ6ICVkXG4iLCBzdGFja29mZnNldCk7CisKKy8vIGdldCBvcGVyYXRpb24gY29kZSAgICAgIAorICAgICAgYyA9IHAtPmNvZGU7CisgICAgICAKKyAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgY2FzZSBOT1A6IAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgIGNhc2UgQVNTSUdOOgorCSBjYXNlIENPTlZFUlQ6CisgICAgICAgICAgICBjZ19hc3NpZ24oZiwgcCk7CisgICAgICAgICAgICBicmVhazsgCisgICAgICAgICAKKyAgICAgICAgIGNhc2UgTFNISUZUOgorICAgICAgICAgICAgY2dfbHNoaWZ0KGYsIHApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIFJTSElGVDoKKyAgICAgICAgICAgIGNnX3JzaGlmdChmLCBwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgICBjYXNlIEFERDoKKyAgICAgICAgIGNhc2UgQURESTJQOgorICAgICAgICAgY2FzZSBTVUI6CisgICAgICAgICBjYXNlIFNVQklGUDoKKyAgICAgICAgIGNhc2UgT1I6CisgICAgICAgICBjYXNlIFhPUjoKKyAgICAgICAgIGNhc2UgQU5EOgorICAgICAgICAgICAgY2dfYWx1KGYsIHApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAKKyAgICAgICAgIGNhc2UgTVVMVDoKKyAgICAgICAgICAgIGNnX211bHQoZiwgcCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSBESVY6CisgICAgICAgICAgICBjZ19kaXYoZiwgcCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSBNT0Q6CisgICAgICAgICAgICBjZ19tb2QoZiwgcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIAorICAgICAgICAgY2FzZSBLT01QTEVNRU5UOgorICAgICAgICAgICAgY2dfa29tcGxlbWVudChmLCBwKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIE1JTlVTOgorICAgICAgICAgICAgY2dfbWludXMoZiwgcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICAgY2FzZSBBRERSRVNTOgorICAgICAgICAgICAgY2dfYWRkcmVzcyhmLCBwKTsKKyAgICAgICAgICAgIGJyZWFrOyAgIAorICAgICAgICAgICAgCisgICAgICAgICBjYXNlIFRFU1Q6CisvLyBjaGFuZ2UgVEVTVCBpbnRvIENPTVBBUkUKKyAgICAgICAgICAgIGNnX3Rlc3QoZiwgcCk7CisgICAgICAgICAgICBicmVhazsKKwkgCisgICAgICAgICBjYXNlIENPTVBBUkU6CisvLyBUaGlzIGlzIGhhbmRsZWQgYnkgdGhlIGJyYW5jaCBJQy4gTm90aGluZyB0byBkbyBoZXJlLgorICAgICAgICAgICAgYnJlYWs7ICAgICAKKyAgICAgICAgICAgICAgIAorICAgICAgICAgY2FzZSBMQUJFTDoKKy8vIG11c3QgcmVzdG9yZSBhbGwgdGVtcG9yYXJpZXMgYmVmb3JlIGFueSBsYWJlbAorLy8gVGhpcyBpcyBub3QgZ29vZCwgYXMgdmJjYyBzZWVtcyB0byBiZSBnZW5lcmF0aW5nIG1vcmUgbGFiZWxzIHRoYW4gbmVjZXNzYXR5LAorLy8gcHJldHR5IG11Y2ggZGVmZWF0aW5nIG91ciBjbGV2ZXIgc3lzdGVtLiBXZSBtdXN0IGRvIHNvbWUgbW9yZSBwcm9jZXNzaW5nIGhlcmUuCisgICAgICAgICAgICB0cmFja19yZXN0b3JlKGYpOworICAgICAgICAgICAgZW1pdChmLCAiJXMlbGQ6XG4iLCBsYWJlbF9wcmVmaXgsIChsb25nKXAtPnR5cGYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgIGNhc2UgQkVROgorICAgICAgICAgY2FzZSBCTkU6CisgICAgICAgICBjYXNlIEJMVDoKKyAgICAgICAgIGNhc2UgQkdFOgorICAgICAgICAgY2FzZSBCTEU6CisgICAgICAgICBjYXNlIEJHVDoKKyAgICAgICAgICAgIGNnX2JyYW5jaChmLCBwKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgIAorICAgICAgICAgY2FzZSBCUkE6CisvLyByZXN0b3JlIHRlbXBvcmFyaWVzCisgICAgICAgICAgICB0cmFja19yZXN0b3JlKGYpOworICAgICAgICAgICAgZW1pdChmLCAiXHRqbXBcdCVzJWxkXG4iLCBsYWJlbF9wcmVmaXgsIChsb25nKXAtPnR5cGYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAKKyAgICAgICAgIGNhc2UgUFVTSDoKKyAgICAgICAgICAgIGNnX3B1c2goZiwgcCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgY2FzZSBDQUxMOgorICAgICAgICAgICAgY2dfY2FsbChmLCBwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgICBjYXNlIFNFVFJFVFVSTjoKKyAgICAgICAgICAgIGNnX3NldHJldHVybihmLCBwKTsKKyAgICAgICAgICAgIGJyZWFrOyAgIAorCisgICAgICAgICBjYXNlIEdFVFJFVFVSTjoKKyAgICAgICAgICAgIGNnX2dldHJldHVybihmLCBwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgICBjYXNlIEFMTE9DUkVHOgorLy8gcmVnaXN0ZXIgaXMgYmVpbmcgdXNlZCwgaW5kaWNhdGUgaXQgY2FuIG9ubHkgYmUgdXNlZCBpZiBzYXZlZAorICAgICAgICAgICAgdHJhY2tfc3RhdHVzW3AtPnExLnJlZ10gfD0gVFJBQ0tfQUxMT0NSRUc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICAgY2FzZSBGUkVFUkVHOgorLy8gcmVnaXN0ZXIgaXMgYWdhaW4gZnJlZQorICAgICAgICAgICAgdHJhY2tfc3RhdHVzW3AtPnExLnJlZ10gJj0gfihUUkFDS19BTExPQ1JFRyk7CisgICAgICAgICAgICBicmVhazsgCisgICAgICAgIAorICAgICAgICAgY2FzZSBNT1ZFRlJPTVJFRzoKKyAgICAgICAgICAgIGNnX21vdmVmcm9tcmVnKGYsIHApOyAgICAgICAKKwkgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgIGNhc2UgTU9WRVRPUkVHOgorCSAgICBjZ19tb3ZldG9yZWcoZiwgcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZW1pdChmLCAidW5oYW5kbGVkIElDXG4iKTsKKyAgICAgIH0KKyAgICAgIGVtaXQoZiwgIlxuIik7ICAgCisgICB9ICAgCisgICBjZ19mdW5jdGlvbl9leGl0KGYsIHYsIGxvZmYpOworCit9CisKK2ludCBzaG9ydGN1dChpbnQgY29kZSwgaW50IHR5cCkKK3sKKyAgIGlmIChzaXpldGFiW3R5cCZOUV0gPiAyKSByZXR1cm4gMDsKKyAgIHJldHVybiAxOworfQorCisKK3ZvaWQgY2xlYW51cF9jZyhGSUxFICpmKQoreworfQordm9pZCBjbGVhbnVwX2RiKEZJTEUgKmYpCit7CisKK30KZGlmZiAtLWdpdCBhL21hY2hpbmVzL2ZhbGNvMTYvbWFjaGluZS5kdCBiL21hY2hpbmVzL2ZhbGNvMTYvbWFjaGluZS5kdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYWIzOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvZmFsY28xNi9tYWNoaW5lLmR0CkBAIC0wLDAgKzEsMTYgQEAKK1M4QlMKK1M4QlUKK1MxNkJTTEUgUzE2QlNCRQorUzE2QlVMRSBTMTZCVUJFCitTMTZCU0xFIFMxNkJTQkUKK1MxNkJVTEUgUzE2QlVCRQorUzMyQlNMRSBTMzJCU0JFCitTMzJCVUxFIFMzMkJVQkUKK1M2NEJTTEUgUzY0QlNCRQorUzY0QlVMRSBTNjRCVUJFCitTMzJCSUVFRUxFCitTNjRCSUVFRUxFCitTNjRCSUVFRUxFCitTMTZCVUxFIFMxNkJVQkUKKworCmRpZmYgLS1naXQgYS9tYWNoaW5lcy9mYWxjbzE2L21hY2hpbmUuaCBiL21hY2hpbmVzL2ZhbGNvMTYvbWFjaGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJkZWJjNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9mYWxjbzE2L21hY2hpbmUuaApAQCAtMCwwICsxLDE0MiBAQAorLyogCisgICBGQUxDTzE2IHYzCisqLworCisvKiNpbmNsdWRlICJzdXBwLmgiKi8KKyNpbmNsdWRlICJkdC5oIgorCisKKy8qICBUaGlzIHN0cnVjdCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgbWFjaGluZS1zcGVjaWZpYyAgICAgICAgICAgKi8KKy8qICBhZGRyZXNzaW5nLW1vZGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0cnVjdCBBZGRyZXNzaW5nTW9kZSB7CisvLyByZWdpc3RlciB0byBiZSB1c2VkIGFzIHRlbXBvcmFyeSBwb2ludGVyICAgCisgICBpbnQJCQlyZWdwdHI7CisvLyByZWdpc3RlciB0byBiZSB1c2VkIGFzIHRlbXBvcmFyeSB2YWx1ZQorLy8gV2Ugc3VwcG9ydCBsb25nIGFuZCBmbG9hdCBhbmQgdGhlcmZvcmUgbmVlZCBwb3RlbnRpYWxseSAyIHJlZ2lzdGVycyAgIAorICAgaW50CQkJcmVndmFsWzJdOworfTsKKworLyogIFRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIG9mIHRoZSB0YXJnZXQgbWFjaGluZS4gICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQVhSCQkxNgorCisvKiAgTnVtYmVyIG9mIGNvbW1hbmRsaW5lLW9wdGlvbnMgdGhlIGNvZGUtZ2VuZXJhdG9yIGFjY2VwdHMuICAgICAgICovCisjZGVmaW5lIE1BWEdGCQkzCisKKy8qICBJZiB0aGlzIGlzIHNldCB0byB6ZXJvIHZiY2Mgd2lsbCBub3QgZ2VuZXJhdGUgSUNzIHdoZXJlIHRoZSAgICAgKi8KKy8qICB0YXJnZXQgb3BlcmFuZCBpcyB0aGUgc2FtZSBhcyB0aGUgMm5kIHNvdXJjZSBvcGVyYW5kLiAgICAgICAgICAgKi8KKy8qICBUaGlzIGNhbiBzb21ldGltZXMgc2ltcGxpZnkgdGhlIGNvZGUtZ2VuZXJhdG9yLCBidXQgdXN1YWxseSAgICAgKi8KKy8qICB0aGUgY29kZSBpcyBiZXR0ZXIgaWYgdGhlIGNvZGUtZ2VuZXJhdG9yIGFsbG93cyBpdC4gICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNFUTJBU1ogMQorCisvKiAgVGhpcyBzcGVjaWZpZXMgdGhlIHNtYWxsZXN0IGludGVnZXIgdHlwZSB0aGF0IGNhbiBiZSBhZGRlZCB0byBhICovCisvKiAgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JTkFEREkyUCBJTlQKKworLyogIElmIHRoZSBieXRlcyBvZiBhbiBpbnRlZ2VyIGFyZSBvcmRlcmVkIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSAgICAqLworLyogIGJ5dGUgZmlyc3QgYW5kIHRoZW4gZGVjcmVhc2luZyBzZXQgQklHRU5ESUFOIHRvIDEuICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdFTkRJQU4gMAorCisvKiAgSWYgdGhlIGJ5dGVzIG9mIGFuIGludGVnZXIgYXJlIG9yZGVyZWQgbGVzdCBzaWduaWZpY2FudCBieXRlICAgICovCisvKiAgYnl0ZSBmaXJzdCBhbmQgdGhlbiBpbmNyZWFzaW5nIHNldCBMSVRUTEVFTkRJQU4gdG8gMS4gICAgICAgICAgICovCisjZGVmaW5lIExJVFRMRUVORElBTiAxCisKKy8qICBOb3RlIHRoYXQgQklHRU5ESUFOIGFuZCBMSVRUTEVFTkRJQU4gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gICAgKi8KKworLyogIElmIHN3aXRjaC1zdGF0ZW1lbnRzIHNob3VsZCBiZSBnZW5lcmF0ZWQgYXMgYSBzZXF1ZW5jZSBvZiAgICAgICAqLworLyogIFNVQixUU1QsQkVRIElDcyByYXRoZXIgdGhhbiBDT01QQVJFLEJFUSBJQ3Mgc2V0IHRoaXMgdG8gMS4gICAgICAqLworLyogIFRoaXMgY2FuIHlpZWxkIGJldHRlciBjb2RlIG9uIHNvbWUgbWFjaGluZXMuICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTV0lUQ0hTVUJTIDAKKworLyogIEluIG9wdGltaXppbmcgY29tcGlsYXRpb24gY2VydGFpbiBsaWJyYXJ5IG1lbWNweS9zdHJjcHktY2FsbHMgICAqLworLyogIHdpdGggbGVuZ3RoIGtub3duIGF0IGNvbXBpbGUtdGltZSB3aWxsIGJlIGlubGluZWQgdXNpbmcgYW4gICAgICAqLworLyogIEFTU0lHTi1JQyBpZiB0aGUgc2l6ZSBpcyBsZXNzIG9yIGVxdWFsIHRvIElOTElORU1FTUNQWS4gICAgICAgICAqLworLyogIFRoZSB0eXBlIHVzZWQgZm9yIHRoZSBBU1NJR04tSUMgd2lsbCBiZSBVTlNJR05FRHxDSEFSLiAgICAgICAgICAqLworI2RlZmluZSBJTkxJTkVNRU1DUFkgNAorCisvKiAgUGFyYW1ldGVyIHB1c2ggb3JkZXIgKi8KKyN1bmRlZiBPUkRFUkVEX1BVU0gKKworLyogIFBhcmFtZXRlcnMgYXJlIHNvbWV0aW1lcyBwYXNzZWQgaW4gcmVnaXN0ZXJzIHdpdGhvdXQgX19yZWcuICAgICAqLworLy8jZGVmaW5lIEhBVkVfUkVHUEFSTVMgMQorI3VuZGVmIEhBVkVfUkVHUEFSTVMKKworLyogdXNlIGxpYnJhcnkgY2FsbHMgZm9yIHNvbWUgYmFzaWMgSUNzICovCisjZGVmaW5lIEhBVkVfTElCQ0FMTFMgMQorCisvKiAgU3RydWN0dXJlIGZvciByZWdfcGFybSgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdHJ1Y3QgcmVnX2hhbmRsZXsKKyAgICB1bnNpZ25lZCBsb25nIGdyZWdzOworICAgIHVuc2lnbmVkIGxvbmcgZnJlZ3M7Cit9OworCisKKy8qIHdlIGRvIG5vdCBuZWVkIHJlZ2lzdGVyLXBhaXJzICovCisjdW5kZWYgSEFWRV9SRUdQQUlSUworCisvKiBzZWxlY3Qgc2l6ZV90LiB1bnNpZ25lZCBpbnQgb3IgdW5zaWduZWQgbG9uZywgdGhlIGRlZmF1bHQgKi8KKyN1bmRlZiBIQVZFX0lOVF9TSVpFVAorCisvKiBzaXplIG9mIGJ1ZmZlciBmb3IgYXNtLW91dHB1dCwgdGhpcyBjYW4gYmUgdXNlZCB0byBkbworICAgcGVlcGhvbGUtb3B0aW1pemF0aW9ucyBvZiB0aGUgZ2VuZXJhdGVkIGFzc2VtYmx5LW91dHB1dCAqLworI2RlZmluZSBFTUlUX0JVRl9MRU4gMTAyNCAvKiBzaG91bGQgYmUgZW5vdWdoICovCisvKiBudW1iZXIgb2YgYXNtLW91dHB1dCBsaW5lcyBidWZmZXJlZCAqLworI2RlZmluZSBFTUlUX0JVRl9ERVBUSCAxCisKKy8qICBXZSBoYXZlIG5vIGFzbV9wZWVwaG9sZSB0byBvcHRpbWl6ZSBhc3NlbWJseS1vdXRwdXQgKi8KKyNkZWZpbmUgSEFWRV9UQVJHRVRfUEVFUEhPTEUgMAorCisKKy8qICBXZSBoYXZlIHNvbWUgdGFyZ2V0LXNwZWNpZmljIHZhcmlhYmxlIGF0dHJpYnV0ZXMuICAgICAgICAgICAgICAgKi8KKyN1bmRlZiBIQVZFX1RBUkdFVF9BVFRSSUJVVEVTCisKKy8qIFdlIGhhdmUgdGFyZ2V0LXNwZWNpZmljIHByYWdtYXMgKi8KKyN1bmRlZiBIQVZFX1RBUkdFVF9QUkFHTUFTCisKKy8qICBXZSBrZWVwIHRyYWNrIG9mIGFsbCByZWdpc3RlcnMgbW9kaWZpZWQgYnkgYSBmdW5jdGlvbi4gICAgICAgICAgKi8KKyN1bmRlZiBIQVZFX1JFR1NfTU9ESUZJRUQKKworLyogV2UgaGF2ZSBhIGltcGxlbWVudCBvdXIgb3duIGNvc3QtZnVuY3Rpb25zIHRvIGFkYXB0IAorICAgcmVnaXN0ZXItYWxsb2NhdGlvbiAqLworI3VuZGVmIEhBVkVfVEFSR0VUX1JBTExPQworCisKKy8qIHdlIGRvIG5vdCBoYXZlIGEgbWFya19lZmZfaWNzIGZ1bmN0aW9uLCB0aGlzIGlzIHVzZWQgdG8gcHJldmVudAorICAgb3B0aW1pemF0aW9ucyBvbiBjb2RlIHdoaWNoIGNhbiBhbHJlYWR5IGJlIGltcGxlbWVudGVkIGJ5IGVmZmljaWVudAorICAgYXNzZW1ibHkgKi8KKyN1bmRlZiBIQVZFX1RBUkdFVF9FRkZfSUMKKworLyogd2UgZG8gbmVlZCBleHRyYSBlbGVtZW50cyBpbiB0aGUgSUMgKi8KKyNkZWZpbmUgSEFWRV9FWFRfSUMgMQorc3RydWN0IFJlZ3RtcCB7CisvLyByZWdpc3RlciBudW1iZXIgICAKKyAgIGludAkJcmVnOworLy8gbXVzdCBiZSBzYXZlZCBiZWZvcmUgdXNlZD8KKyAgIGludAkJc2F2ZTsKK307CisjZGVmaW5lIE1BWF9UTVBSRUcJCTMKK3N0cnVjdCBleHRfaWMgeworLy8gdGVtcG9yYXJ5IHB0ciByZWdpc3RlciB0byB1c2Ugd2l0aCB0aGlzIElDCisgICBzdHJ1Y3QgUmVndG1wCXJlZ190bXBbTUFYX1RNUFJFR107Cit9OworCisvKiBXZSBoYXZlIGV4dGVuZGVkIHR5cGVzISBXaGF0IHdlIGhhdmUgdG8gZG8gdG8gc3VwcG9ydCB0aGVtOiAgICAgICovCisvKiAtICNkZWZpbmUgSEFWRV9FWFRfVFlQRVMKKyAgIC0gI3VuZGVmIGFsbCBzdGFuZGFyZCB0eXBlcworICAgLSAjZGVmaW5lIGFsbCBzdGFuZGFyZCB0eXBlcyBwbHVzIG5ldyB0eXBlcworICAgLSB3cml0ZSBldmFsX2NvbnN0IGFuZCBpbnNlcnRfY29uc3QKKyAgIC0gd3JpdGUgdHlwZWRlZnMgZm9yIHptYXggYW5kIHp1bWF4CisgICAtIGRlZmluZSBhdHlwcyB1bmlvbgorICAgLSB3cml0ZSB0eXBuYW1lW10KKyAgIC0gd3JpdGUgY29udl90eXAoKQorICAgLSBvcHRpb25hbGx5ICNkZWZpbmUgSVNQT0lOVEVSLCBJU0FSSVRILCBJU0lOVCBldGMuCisgICAtIG9wdGlvbmFsbHkgI2RlZmluZSBIQVZFX1RHVF9QUklOVFZBTCBhbmQgd3JpdGUgcHJpbnR2YWwKKyAgIC0gb3B0aW9uYWxseSAjZGVmaW5lIFBPSU5URVJfVFlQRQorICAgLSBvcHRpb25hbGx5ICNkZWZpbmUgSEFWRV9UR1RfRkFMSUdOIGFuZCB3cml0ZSBmYWxpZ24KKyAgIC0gb3B0aW9uYWxseSAjZGVmaW5lIEhBVkVfVEdUX1NaT0YgYW5kIHdyaXRlIHN6b2YKKyAgIC0gb3B0aW9uYWxseSBhZGQgZnVuY3Rpb25zIGZvciBhdHRyaWJ1dGUtaGFuZGxpbmcKKyovCisjdW5kZWYgSEFWRV9UR1RfUFJJTlRWQUwKKyN1bmRlZiBIQVZFX0VYVF9UWVBFUworCisKKwpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvZmlyZTE2L21hY2hpbmUuYyBiL21hY2hpbmVzL2ZpcmUxNi9tYWNoaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzOGMxMQotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL2ZpcmUxNi9tYWNoaW5lLmMKQEAgLTAsMCArMSwyMjgwIEBACisvKgorICogQmFja2VuZCBmb3IgdGhlIEZpcmUxNiBpQ0U0MCBTb2Z0Q29yZQorICogKGMpIDIwMTkgYnkgU3lsdmFpbiBNdW5hdXQKKyAqLworCisjZGVmaW5lIERCRworCisjaW5jbHVkZSAic3VwcC5oIgorCitzdGF0aWMgY2hhciBGSUxFX1tdPV9fRklMRV9fOworLyogIFB1YmxpYyBkYXRhIHRoYXQgTVVTVCBiZSB0aGVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIE5hbWUgYW5kIGNvcHlyaWdodC4gKi8KK2NoYXIgY2dfY29weXJpZ2h0W109InZiY2MgY29kZS1nZW5lcmF0b3IgZm9yIGZpcmUxNiB2MC4xIChjKSAyMDE5IGJ5IFN5bHZhaW4gTXVuYXV0IjsKKworLyogIENvbW1hbmRsaW5lLWZsYWdzIHRoZSBjb2RlLWdlbmVyYXRvciBhY2NlcHRzICAgICAgICAgICAgICAgICovCitjaGFyICpnX2ZsYWdzX25hbWVbTUFYR0ZdPXsidGlueS1kbWVtIiwgInRpbnktcG1lbSJ9OworaW50IGdfZmxhZ3NbTUFYR0ZdPXswLCAwfTsKK3VuaW9uIHBwaSBnX2ZsYWdzX3ZhbFtNQVhHRl07CisKKy8qICBFeHRlbmRlZCB0eXBlIG5hbWVzICovCitjaGFyICp0eXBuYW1lW109eyJuL2EiLCAiY2hhciIsInNob3J0IiwiaW50IiwibG9uZyIsImxvbmcgbG9uZyIsCisgICAgICAgICAgICAgICAgICJmbG9hdCIsImRvdWJsZSIsImxvbmcgZG91YmxlIiwidm9pZCIsCisgICAgICAgICAgICAgICAgICJkbWVtLXBvaW50ZXIiLCJwbWVtLXBvaW50ZXIiLAorICAgICAgICAgICAgICAgICAiYXJyYXkiLCJzdHJ1Y3QiLCJ1bmlvbiIsImVudW0iLCJmdW5jdGlvbiJ9OworCisvKiAgQWxpZ25tZW50LXJlcXVpcmVtZW50cyBmb3IgYWxsIHR5cGVzIGluIGJ5dGVzLiAgICAgICAgICAgICAgKi8KK3ptYXggYWxpZ25bTUFYX1RZUEUrMV07CisKKy8qICBBbGlnbm1lbnQgdGhhdCBpcyBzdWZmaWNpZW50IGZvciBldmVyeSBvYmplY3QuICAgICAgICAgICAgICAqLworem1heCBtYXhhbGlnbjsKKworLyogIENIQVJfQklUIGZvciB0aGUgdGFyZ2V0IG1hY2hpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IGNoYXJfYml0OworCisvKiAgc2l6ZXMgb2YgdGhlIGJhc2ljIHR5cGVzIChpbiBieXRlcykgKi8KK3ptYXggc2l6ZXRhYltNQVhfVFlQRSsxXTsKKworLyogIE1pbmltdW0gYW5kIE1heGltdW0gdmFsdWVzIGVhY2ggdHlwZSBjYW4gaGF2ZS4gICAgICAgICAgICAgICovCisvKiAgTXVzdCBiZSBpbml0aWFsaXplZCBpbiBpbml0X2NnKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggdF9taW5bTUFYX1RZUEUrMV07Cit6dW1heCB0X21heFtNQVhfVFlQRSsxXTsKK3p1bWF4IHR1X21heFtNQVhfVFlQRSsxXTsKKworLyogIE5hbWVzIG9mIGFsbCByZWdpc3RlcnMuIHdpbGwgYmUgaW5pdGlhbGl6ZWQgaW4gaW5pdF9jZygpLAorICAgIHJlZ2lzdGVyIG51bWJlciAwIGlzIGludmFsaWQsIHZhbGlkIHJlZ2lzdGVycyBzdGFydCBhdCAxICovCitjaGFyICpyZWduYW1lc1tNQVhSKzFdOworCisvKiAgVGhlIFNpemUgb2YgZWFjaCByZWdpc3RlciBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggcmVnc2l6ZVtNQVhSKzFdOworCisvKiAgYSB0eXBlIHdoaWNoIGNhbiBzdG9yZSBlYWNoIHJlZ2lzdGVyLiAqLworc3RydWN0IFR5cCAqcmVndHlwZVtNQVhSKzFdOworCisvKiAgcmVnc2FbcmVnXSE9MCBpZiBhIGNlcnRhaW4gcmVnaXN0ZXIgaXMgYWxsb2NhdGVkIGFuZCBzaG91bGQgKi8KKy8qICBub3QgYmUgdXNlZCBieSB0aGUgY29tcGlsZXIgcGFzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworaW50IHJlZ3NhW01BWFIrMV07CisKKy8qICBTcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXJzIG1heSBiZSBzY3JhdGNoZWQgYnkgZnVuY3Rpb25zLiAgICAqLworaW50IHJlZ3NjcmF0Y2hbTUFYUisxXTsKKworLyogc3BlY2lmaWVzIHRoZSBwcmlvcml0eSBmb3IgdGhlIHJlZ2lzdGVyLWFsbG9jYXRvciwgaWYgdGhlIHNhbWUKKyAgIGVzdGltYXRlZCBjb3N0LXNhdmluZyBjYW4gYmUgb2J0YWluZWQgYnkgc2V2ZXJhbCByZWdpc3RlcnMsIHRoZQorICAgb25lIHdpdGggdGhlIGhpZ2hlc3QgcHJpb3JpdHkgd2lsbCBiZSB1c2VkICovCitpbnQgcmVnX3ByaW9bTUFYUisxXTsKKworLyogYW4gZW1wdHkgcmVnLWhhbmRsZSByZXByZXNlbnRpbmcgaW5pdGlhbCBzdGF0ZSAqLworc3RydWN0IHJlZ19oYW5kbGUgZW1wdHlfcmVnX2hhbmRsZT17MH07CisKKy8qIE5hbWVzIG9mIHRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZSBhdHRyaWJ1dGVzLiAgICAgICAgICAgICAgICAqLworY2hhciAqZ19hdHRyX25hbWVbXT17MH07CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgUHJpdmF0ZSBkYXRhIGFuZCBmdW5jdGlvbnMuICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBhbGlnbm1lbnQgb2YgYmFzaWMgZGF0YS10eXBlcywgdXNlZCB0byBpbml0aWFsaXplIGFsaWduW10gKi8KK3N0YXRpYyBsb25nIG1hbGlnbltNQVhfVFlQRSsxXSAgID0gezAsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDF9OworLyogc2l6ZXMgb2YgYmFzaWMgZGF0YS10eXBlcywgdXNlZCB0byBpbml0aWFsaXplIHNpemV0YWJbXSAqLworc3RhdGljIGxvbmcgbXNpemV0YWJbTUFYX1RZUEUrMV0gPSB7MCwxLDEsMSwyLDQsMiw0LDQsMSwxLDEsMSwxLDEsMSwxLDEsMX07CisKKy8qIE1hY3JvcyAqLworc3RhdGljIGNoYXIgKm1hcnJheVtdID0geworCSJfX3BtZW09X19hdHRyKFwicG1lbVwiKSIsCisJMAorfTsKKworLyogUmVnaXN0ZXIgdHlwZXMgKi8KK3N0cnVjdCBUeXAgaXR5cD17U0hPUlR9LCBsdHlwPXtMT05HfTsKKworLyogUmVnaXN0ZXJzIG51bSAqLworZW51bSB7CisJUl9OT05FID0gMCwKKwlSX1IwLCBSX1IxLCBSX1IyLCBSX1IzLCBSX1I0LCBSX1I1LCBSX1I2LCBSX1I3LAorCVJfUjgsIFJfUjksIFJfUkEsIFJfUkIsIFJfUkMsIFJfUkQsIFJfUkUsIFJfUkYsCisJUl9TMCwgUl9TMSwgUl9TMiwgUl9TMywgUl9TNCwgUl9TNSwgUl9TNiwgUl9TNywKKwlSX1M4LCBSX1M5LCBSX1NBLCBSX1NCLCBSX1NDLCBSX1NELCBSX1NFLCBSX1NGLAorCVJfUjBQLCBSX1IyUCwgUl9SNFAsIFJfUjZQLCBSX1I4X1AsIFJfUkFQLCBSX1JDUCwgUl9SRVAsCisJUl9TMFAsIFJfUzJQLCBSX1M0UCwgUl9TNlAsIFJfUzhfUCwgUl9TQVAsIFJfU0NQLCBSX1NFUCwKKwlSX0EsIFJfWCwgUl9ZLCBSX0kKK307CisKKyNkZWZpbmUgaXNncHIocikgKChyKSA+PSBSX1IwICYmIChyKSA8PSBSX1NFUCkKKworLyogSWRlbnRpZmllciBwcmVmaXhlcyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmlkcHJlZml4PSJfIiwgKmxhYnByZWZpeD0ibCI7CisKKyNkZWZpbmUgaXNyZWcoeCkgKCgoeCktPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpCisjZGVmaW5lIGlzY29uc3QoeCkgKCgoeCktPmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKQorCisjZGVmaW5lIElTVFNIT1JUKHQpICgoKHQpJk5RKT09Q0hBUiB8fCAoKHQpJk5RKT09U0hPUlQgfHwgKCh0KSZOUSk9PUlOVCB8fCAoKHQpJk5RKT09RFBPSU5URVIgfHwgKCh0KSZOUSk9PVBQT0lOVEVSKQorI2RlZmluZSBJU1RMT05HKHQpICAoKCh0KSZOUSk9PUxPTkcgfHwgKCh0KSZOUSk9PUZMT0FUKQorCisjZGVmaW5lIFNUUl9QTUVNICJwbWVtIgorCisjZGVmaW5lIFRJTllfRE1FTSAoZ19mbGFnc1swXSAmIFVTRURGTEFHKQorI2RlZmluZSBUSU5ZX1BNRU0gKGdfZmxhZ3NbMV0gJiBVU0VERkxBRykKKyNkZWZpbmUgVElOWV9JTU0oaSkgKCAoKChpKSAmIDB4ZmYwMCkgPT0gMHhmZjAwKSB8fCAoKChpKSAmIDB4ZmYwMCkgPT0gMHgwMDAwKSApCisKK3N0YXRpYyBjaGFyICpzeW1fbmFtZShzdHJ1Y3QgVmFyICp2YXIpCit7CisJc3RhdGljIGNoYXIgc3ltWzEyOF07CS8qIGZpeG1lID8gKi8KKworCWlmIChpc3N0YXRpYyh2YXItPnN0b3JhZ2VfY2xhc3MpKQorCQlzbnByaW50ZihzeW0sIHNpemVvZihzeW0pLTEsICIlcyVsZCIsIGxhYnByZWZpeCwgem0ybCh2YXItPm9mZnNldCkpOworCWVsc2UKKwkJc25wcmludGYoc3ltLCBzaXplb2Yoc3ltKS0xLCAiJXMlcyIsIGlkcHJlZml4LCB2YXItPmlkZW50aWZpZXIpOworCisJcmV0dXJuIHN5bTsKK30KKworc3RhdGljIGxvbmcgY29uc3QybG9uZyhzdHJ1Y3Qgb2JqICpvLCBpbnQgZHR5cCkKK3sKKwlpZiAoIShvLT5mbGFncyAmIEtPTlNUKSkKKwkJaWVycm9yKDApOworCWV2YWxfY29uc3QoJm8tPnZhbCwgZHR5cCk7CisJcmV0dXJuIHptMmwodm1heCk7Cit9CisKK3N0cnVjdCBnY19zdGF0ZQoreworCUZJTEUgKmY7CisKKwlpbnQgcmVnX2J1c3lbTUFYUisxXTsJLyogVHJhY2sgdXNlZCByZWdpc3RlcnMgKi8KKworCWludCBvcF9zYXZlOwkJLyogU2F2ZWQgcmVnaXN0ZXIgdG8gcmVzdG9yZSBiZWZvcmUgb3AgZW5kICovCisJbG9uZyB2YWxfcnY7CQkvKiBSZXR1cm4gVmFsdWUgaW1tZWRpYXRlIChtdXN0IGJlIHNtYWxsIGVub3VnaCkgKi8KKwlpbnQgcmVnX3J2OwkJLyogUmV0dXJuIFZhbHVlIHJlZ2lzdGVyLCAwPW5vbmUgKi8KKwlpbnQgcmVnX2x3OwkJLyogUmVnaXN0ZXIgd3JpdHRlbiBpbiB0aGUgbGFzdCBlbWl0dGVkIG9wIGNvZGUgKi8KKworCWludCBzX2FyZ3NpemU7CisJaW50IHNfbG9jYWxzaXplOworCWludCBzX3NhdmVzaXplOworCisJaW50IGNtcF9zaWduZWQ7CQkvKiBMYXN0IGNvbXBhcmlzb24gd2FzIHNpZ25lZCAqLworCWludCBjbXBfY3VyX3o7CQkvKiBDdXJyZW50IHN0YXRlIG9mIHogZmxhZyAqLworfTsKKworc3RhdGljIGludAorX2djX2ZpbmRfcmVnKHN0cnVjdCBnY19zdGF0ZSAqZ2MsIGludCBwYWlyKQoreworCWludCBtaW4sIG1heCwgcjsKKworCW1pbiA9IHBhaXIgPyBSX1IwUCA6IFJfUjA7CisJbWF4ID0gcGFpciA/IFJfU0VQIDogUl9TRjsKKworCS8qIFRyeSBmb3IgYSBzY3JhdGNoIHJlZyBmaXJzdCAqLworCWZvciAocj1taW47IHI8PW1heDsgcisrKQorCQlpZiAoIWdjLT5yZWdfYnVzeVtyXSAmJiAhcmVnc2Fbcl0gJiYgcmVnc2NyYXRjaFtyXSkKKwkJCXJldHVybiByOworCisJLyogT2sgLi4uIGFueXRoaW5nIHdpbGwgZG8gKi8KKwlmb3IgKHI9bWluOyByPD1tYXg7IHIrKykKKwkJaWYgKCFnYy0+cmVnX2J1c3lbcl0gJiYgIXJlZ3NhW3JdKQorCQkJcmV0dXJuIHI7CisKKwkvKiBOb3RoaW5nIDovICovCisJcmV0dXJuIDA7Cit9CisKKworLyogU3RhY2sgbGF5b3V0OiAoZ3Jvd3MgdG93YXJkIDApCisgKgorICogICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSwKKyAqICAgWSAgIHwgKG5leHQgYXZhaWxhYmxlIHdvcmQpICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA8LSBZIHBvaW50ZXIKKyAqICAgICAgIHwgYXJndW1lbnRzIHRvIGNhbGxlZCBmdW5jdGlvbnMgW3NpemU9c19hcmdzaXplXSB8CisgKiAgICAgICB8IGxvY2FsIHZhcmlhYmxlcyBbc2l6ZT1zX2xvY2Fsc2l6ZV0gICAgICAgICAgICAgfAorICogICAgICAgfCBzYXZlZCByZWdpc3RlciBbc2l6ZT1zX3NhdmVzaXplXSAgICAgICAgICAgICAgIHwKKyAqICAgICAgIHwgcmV0dXJuLWFkZHJlc3Mgc2F2ZSBbc2l6ZT0xXSAgICAgICAgICAgICAgICAgICB8CisgKiAgIFkrTiB8IGFyZ3VtZW50cyB0byB0aGlzIGZ1bmN0aW9uIFtzaXplPT9dICAgICAgICAgICAgfAorICogICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKKyAqLworc3RhdGljIGxvbmcKK19nY19yZWFsX29mZnNldChzdHJ1Y3QgZ2Nfc3RhdGUgKmdjLCBzdHJ1Y3QgVmFyICp2LCBsb25nIGFkZF9vZmZzZXQpCit7CisJbG9uZyBvZmYgPSB6bTJsKHYtPm9mZnNldCk7CisKKwlpZiAob2ZmIDwgMCkgeworCQkvKiBmdW5jdGlvbiBwYXJhbWV0ZXIgKi8KKwkJb2ZmID0gZ2MtPnNfbG9jYWxzaXplICsgZ2MtPnNfc2F2ZXNpemUgKyAxIC0gKG9mZiArIHptMmwobWF4YWxpZ24pKTsKKwl9CisKKwlvZmYgKz0gZ2MtPnNfYXJnc2l6ZTsKKwlvZmYgKz0gYWRkX29mZnNldDsKKwlvZmYgKz0gMTsgLyogQmVjYXVzZSB3ZSBwb2ludCB0byB0aGUgbmV4dCBhdmFpbGFibGUgd29yZCAqLworCisJcmV0dXJuIG9mZjsKK30KKworI2RlZmluZSBfZ2NfZW1pdChnYywgLi4uKSBkbyB7CQlcCisJKGdjKS0+cmVnX2x3ID0gMDsJCVwKKwllbWl0KChnYyktPmYsICBfX1ZBX0FSR1NfXyApOwlcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZAorX2djX2VtaXRfbm9wKHN0cnVjdCBnY19zdGF0ZSAqZ2MpCit7CisJZ2MtPnJlZ19sdyA9IDA7CisJZ2MtPmNtcF9jdXJfeiA9IDA7CisJZW1pdChnYy0+ZiwgIlx0bm9wXG4iICk7Cit9CisKKy8qIEVtaXQgYSBJTU0gb3Bjb2RlIHByZWZpeCBpZiB0aGUgY29uc3RhbnQgcmVxdWlyZXMgaXQgKi8KK3N0YXRpYyBsb25nCitfZ2NfZW1pdF9pbW0oc3RydWN0IGdjX3N0YXRlICpnYywgbG9uZyB2KQoreworCXYgPSB2ICYgMHhmZmZmOworCisJaWYgKCh2ICYgMHhmZjAwKSA9PSAwKSB7CisJCXJldHVybiB2OworCX0gZWxzZSBpZiAoKHYgJiAweGZmMDApID09IDB4ZmYwMCkgeworCQlyZXR1cm4gLSAoKHYgXiAweGZmZmYpICsgMSk7CisJfSBlbHNlIHsKKwkJZ2MtPnJlZ19sdyA9IDA7CisJCWVtaXQoZ2MtPmYsICJcdGltbVx0JCVkXG4iLCAodiA+PiA4KSAmIDB4ZmYpOworCQlyZXR1cm4gdiAmIDB4ZmY7CisJfQorfQorCisvKiBFbWl0IG1vdnMgYmV0d2VlbiBhbnkgcmVnaXN0ZXIgcGFpcnMgYW5kIGFueSBzaW5nbGUgR1BSICYgQSAqLworc3RhdGljIHZvaWQKK19nY19lbWl0X21vdihzdHJ1Y3QgZ2Nfc3RhdGUgKmdjLCBpbnQgZHN0LCBpbnQgc3JjKQoreworCWlmIChzcmMgPT0gZHN0KQorCQlyZXR1cm47CisKKwlpZiAoKHNyYyA9PSBnYy0+cmVnX2x3KSAmJiBpc2dwcihzcmMpKQorCQllbWl0KGdjLT5mLCAiXHRub3BcbiIpOworCisJZW1pdChnYy0+ZiwgIlx0bW92XHQlcywgJXNcbiIsIHJlZ25hbWVzW2RzdF0sIHJlZ25hbWVzW3NyY10pOworCisJQlNFVChyZWdzX21vZGlmaWVkLCBkc3QpOworCisJZ2MtPnJlZ19sdyA9IGlzZ3ByKGRzdCkgPyBkc3QgOiAwOworfQorCisvKiBFbWl0IG9wY29kZSBhbmQgY2hlY2tzIGZvciBkZXBlbmNpZXMgKi8KK3N0YXRpYyB2b2lkCitfZ2NfZW1pdF9hbHUoc3RydWN0IGdjX3N0YXRlICpnYywgY29uc3QgY2hhciAqb3Bjb2RlLAorICAgICAgICAgICAgIGludCBkc3QsIGludCBzcmMxLCBpbnQgc3JjMiwgbG9uZyBpbW0pCit7CisJaW50IGRlcDEgPSAoc3JjMSA9PSBnYy0+cmVnX2x3KSAmJiBpc2dwcihzcmMxKTsKKwlpbnQgZGVwMiA9IChzcmMyID09IGdjLT5yZWdfbHcpICYmIGlzZ3ByKHNyYzIpOworCWNoYXIgZHN0X3N0clsxNl0sICpvcDFfc3RyLCBvcDJfc3RyWzE2XSwgaW1tX3N0clsxNl07CisKKwlpZiAoKGRlcDEgfHwgZGVwMikgJiYgKHNyYzEgIT0gUl9JKSAmJiAoc3JjMiAhPSBSX0kpKQorCQllbWl0KGdjLT5mLCAiXHRub3BcbiIpOworCisJaWYgKChzcmMxID09IFJfSSkgfHwgKHNyYzIgPT0gUl9JKSkgeworCQlpbW0gPSBfZ2NfZW1pdF9pbW0oZ2MsIGltbSk7CisJCWlmICgoZHN0ICYmIChkc3QgIT0gUl9BKSkgfHwKKwkJICAgICgoc3JjMSAhPSBSX0kpICYmIChzcmMxICE9IFJfQSkpIHx8CisJCSAgICAoKHNyYzIgIT0gUl9JKSAmJiAoc3JjMiAhPSBSX0EpKSkgeworCQkJZW1pdChnYy0+ZiwgIlx0aW1tXHQkJWRcbiIsIGltbSk7CisJCQlzbnByaW50ZihpbW1fc3RyLCBzaXplb2YoaW1tX3N0ciktMSwgIiVzIiwgcmVnbmFtZXNbUl9JXSk7CisJCX0gZWxzZSB7CisJCQlzbnByaW50ZihpbW1fc3RyLCBzaXplb2YoaW1tX3N0ciktMSwgIiQlbGQiLCBpbW0pOworCQl9CisJfQorCisJZHN0X3N0clswXSA9IG9wMl9zdHJbMF0gPSAwOworCW9wMV9zdHIgPSAoc3JjMSAhPSBSX0kpID8gcmVnbmFtZXNbc3JjMV0gOiBpbW1fc3RyOworCWlmIChkc3QpICBzbnByaW50Zihkc3Rfc3RyLCBzaXplb2YoZHN0X3N0ciktMSwgIiVzLCAiLCByZWduYW1lc1tkc3RdKTsKKwlpZiAoc3JjMikgc25wcmludGYob3AyX3N0ciwgc2l6ZW9mKG9wMl9zdHIpLTEsICIsICVzIiwgKHNyYzIgIT0gUl9JKSA/IHJlZ25hbWVzW3NyYzJdIDogaW1tX3N0cik7CisKKwllbWl0KGdjLT5mLCAiXHQlc1x0JXMlcyVzXG4iLCBvcGNvZGUsIGRzdF9zdHIsIG9wMV9zdHIsIG9wMl9zdHIpOworCisJQlNFVChyZWdzX21vZGlmaWVkLCBkc3QpOworCisJZ2MtPnJlZ19sdyA9IGlzZ3ByKGRzdCkgPyBkc3QgOiAwOworCWdjLT5jbXBfY3VyX3ogPSBnYy0+cmVnX2x3OworfQorCitzdGF0aWMgdm9pZAorX2djX21vdmVfZ3ByKHN0cnVjdCBnY19zdGF0ZSAqZ2MsIGludCBkc3QsIGludCBzcmMpCit7CisJc3RydWN0IHJwYWlyIHJwX3NyYywgcnBfZHN0OworCWludCBpcF9zcmMsIGlwX2RzdDsKKworCWlmIChzcmMgPT0gZHN0KQorCQlyZXR1cm47CisKKwlpcF9kc3QgPSByZWdfcGFpcihkc3QsICZycF9kc3QpOworCWlwX3NyYyA9IHJlZ19wYWlyKHNyYywgJnJwX3NyYyk7CisJaWYgKChyZWdzaXplW2RzdF0gIT0gcmVnc2l6ZVtzcmNdKSB8fCAoaXBfZHN0ICE9IGlwX3NyYykpCisJCWllcnJvcigwKTsJLyogU2hvdWxkbid0IGhhcHBlbiAqLworCisJaWYgKGlwX2RzdCkgeworCQlpZiAoZ2MtPnJlZ19sdyA9PSBycF9zcmMucjEpIHsKKwkJCV9nY19lbWl0X21vdihnYywgUl9BLCBycF9zcmMucjIpOworCQkJX2djX2VtaXRfbW92KGdjLCBycF9kc3QucjIsIFJfQSk7CisJCQlfZ2NfZW1pdF9tb3YoZ2MsIFJfQSwgcnBfc3JjLnIxKTsKKwkJCV9nY19lbWl0X21vdihnYywgcnBfZHN0LnIxLCBSX0EpOworCQl9IGVsc2UgeworCQkJX2djX2VtaXRfbW92KGdjLCBSX0EsIHJwX3NyYy5yMSk7CisJCQlfZ2NfZW1pdF9tb3YoZ2MsIHJwX2RzdC5yMSwgUl9BKTsKKwkJCV9nY19lbWl0X21vdihnYywgUl9BLCBycF9zcmMucjIpOworCQkJX2djX2VtaXRfbW92KGdjLCBycF9kc3QucjIsIFJfQSk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBfZ2NfZW1pdF9tb3Ygd2lsbCBoYW5kbGUgaWYgc3JjIG9yIGRzdCBpcyBSX0EgKi8KKwkJX2djX2VtaXRfbW92KGdjLCBSX0EsIHNyYyk7CisJCV9nY19lbWl0X21vdihnYywgZHN0LCBSX0EpOworCX0KK30KKworc3RhdGljIHZvaWQKK19nY19zdG9yZV90b19tZW0oc3RydWN0IGdjX3N0YXRlICpnYywgaW50IHZhbF9yZWcsIGludCBkdHlwLAorICAgICAgICAgICAgICAgICBsb25nIHB0cl9jb25zdCwgaW50IHB0cl9yZWcsIHN0cnVjdCBWYXIgKnZhcikKK3sKKwlzdHJ1Y3QgcnBhaXIgcnA7CisJY2hhciAqb3Bjb2RlOworCWludCB0aW55OworCWludCBpc19wYWlyOworCisJaWYgKGR0eXAgPT0gRFBPSU5URVIpIHsKKwkJb3Bjb2RlID0gInN0ZCI7CisJCXRpbnkgPSBUSU5ZX0RNRU07CisJfSBlbHNlIGlmIChkdHlwID09IFBQT0lOVEVSKSB7CisJCW9wY29kZSA9ICJzdHAiOworCQl0aW55ID0gVElOWV9QTUVNOworCX0gZWxzZSB7CisJCWllcnJvcigwKTsKKwl9CisKKwlpc19wYWlyID0gcmVnX3BhaXIodmFsX3JlZywgJnJwKTsKKworCWlmICh2YXIpCisJeworCQkvKiBWYXJpYWJsZSAqLworCQlpZiAoaXNhdXRvKHZhci0+c3RvcmFnZV9jbGFzcykpIHsKKwkJCS8qIFN0YWNrIHZhcmlhYmxlIGFsd2F5cyBpbiBkYXRhIG1lbSAqLworCQkJaWYgKGR0eXAgIT0gRFBPSU5URVIpCisJCQkJaWVycm9yKDEpOworCisJCQlsb25nIHNwX29mZnNldCA9IF9nY19yZWFsX29mZnNldChnYywgdmFyLCBwdHJfY29uc3QpOworCisJCQlpZiAoc3Bfb2Zmc2V0IDw9IDE1KSB7CisJCQkJLyogT2Zmc2V0IGlzIHNtYWxsIGVub3VnaCBmb3IgaW5kZXhlZCBZIGFjY2VzcyAqLworCQkJCWlmIChpc19wYWlyKSB7CisJCQkJCS8qIDMyIGJpdCAqLworCQkJCQlfZ2NfZW1pdF9tb3YoZ2MsIFJfQSwgcnAucjEpOworCQkJCQlfZ2NfZW1pdChnYywgIlx0JXNcdEEsIFtZKyssICQlZF1cbiIsIG9wY29kZSwgc3Bfb2Zmc2V0KTsKKwkJCQkJX2djX2VtaXRfbW92KGdjLCBSX0EsIHJwLnIyKTsKKwkJCQkJX2djX2VtaXQoZ2MsICJcdCVzXHRBLCBbWS0tLCAkJWRdXG4iLCBvcGNvZGUsIHNwX29mZnNldCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogMTYgYml0ICovCisJCQkJCV9nY19lbWl0X21vdihnYywgUl9BLCB2YWxfcmVnKTsKKwkJCQkJX2djX2VtaXQoZ2MsICJcdCVzXHRBLCBbWSwgJCVkXVxuIiwgb3Bjb2RlLCBzcF9vZmZzZXQpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogT2Zmc2V0IGlzIHRvbyBsYXJnZSAuLi4gbG9hZCBhZGRyZXNzIGluIEEgYW5kIGZhbGwgYmFjayB0byBjb2RlIGJlbG93ICovCisJCQkJX2djX2VtaXQoZ2MsICJcdG1vdlx0QSwgWVxuIik7CisJCQkJX2djX2VtaXQoZ2MsICJcdGFkZCBBLCBBLCAkJWRcbiIsIHNwX29mZnNldCk7CisJCQkJcHRyX3JlZyA9IFJfQTsKKwkJCX0KKwkJfSBlbHNlIGlmIChpc2V4dGVybih2YXItPnN0b3JhZ2VfY2xhc3MpIHx8IGlzc3RhdGljKHZhci0+c3RvcmFnZV9jbGFzcykpIHsKKwkJCS8qIFN5bWJvbCBuYW1lICovCisJCQljaGFyICpzeW0gPSBzeW1fbmFtZSh2YXIpOworCisJCQkvKiBNYWtlIGFjY2VzcyB1c2luZyBhYnNvbHV0ZSBpbW1lZGlhdGUgYWRkcmVzc2luZyAqLworCQkJaWYgKHJlZ19wYWlyKHZhbF9yZWcsICZycCkpIHsKKwkJCQkvKiAzMiBiaXQgKi8KKwkJCQlfZ2NfZW1pdF9tb3YoZ2MsIFJfQSwgcnAucjEpOworCQkJCWlmICghdGlueSkgX2djX2VtaXQoZ2MsICJcdGltbVx0JChoaSglcyslZCkpXG4iLCBzeW0sIHB0cl9jb25zdCk7CisJCQkJX2djX2VtaXQoZ2MsICJcdCVzXHRBLCBbJChsbyglcyslZCkpXVxuIiwgb3Bjb2RlLCBzeW0sIHB0cl9jb25zdCk7CisJCQkJX2djX2VtaXRfbW92KGdjLCBSX0EsIHJwLnIyKTsKKwkJCQlpZiAoIXRpbnkpIF9nY19lbWl0KGdjLCAiXHRpbW1cdCQoaGkoJXMrJWQpKVxuIiwgc3ltLCBwdHJfY29uc3QrMSk7CisJCQkJX2djX2VtaXQoZ2MsICJcdCVzXHRBLCBbJChsbyglcyslZCkpXVxuIiwgb3Bjb2RlLCBzeW0sIHB0cl9jb25zdCsxKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogMTYgYml0ICovCisJCQkJX2djX2VtaXRfbW92KGdjLCBSX0EsIHZhbF9yZWcpOworCQkJCWlmICghdGlueSkgX2djX2VtaXQoZ2MsICJcdGltbVx0JChoaSglcyslZCkpXG4iLCBzeW0sIHB0cl9jb25zdCk7CisJCQkJX2djX2VtaXQoZ2MsICJcdCVzXHRBLCBbJChsbyglcyslZCkpXVxuIiwgb3Bjb2RlLCBzeW0sIHB0cl9jb25zdCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZXJyb3IoMCk7CisJCX0KKwl9CisKKwlpZiAocHRyX3JlZykKKwl7CisJCS8qIFJlZ2lzdGVyIHBvaW50ZXIgKi8KKwkJX2djX2VtaXRfbW92KGdjLCBSX0EsIHB0cl9yZWcpOworCQlfZ2NfZW1pdF9tb3YoZ2MsIFJfWCwgUl9BKTsKKworCQlpZiAoaXNfcGFpcikgeworCQkJLyogMzIgYml0ICovCisJCQlfZ2NfZW1pdF9tb3YoZ2MsIFJfQSwgcnAucjEpOworCQkJX2djX2VtaXQoZ2MsICJcdCVzXHRBLCBbWCsrXVxuIiwgb3Bjb2RlKTsKKwkJCV9nY19lbWl0X21vdihnYywgUl9BLCBycC5yMik7CisJCQlfZ2NfZW1pdChnYywgIlx0JXNcdEEsIFtYLS1dXG4iLCBvcGNvZGUpOworCQl9IGVsc2UgeworCQkJLyogMTYgYml0ICovCisJCQlfZ2NfZW1pdF9tb3YoZ2MsIFJfQSwgdmFsX3JlZyk7CisJCQlfZ2NfZW1pdChnYywgIlx0JXNcdEEsIFtYXVxuIiwgb3Bjb2RlKTsKKwkJfQorCX0KKworCWlmICghcHRyX3JlZyAmJiAhdmFyKQorCXsKKwkJLyogQ29uc3RhbnQgaW1tZWRpYXRlIHBvaW50ZXIgKi8KKwkJaWYgKGlzX3BhaXIpIHsKKwkJCS8qIDMyIGJpdCBhY2Nlc3MgKi8KKwkJCV9nY19lbWl0X21vdihnYywgUl9BLCBycC5yMSk7CisJCQlfZ2NfZW1pdChnYywgIlx0JXNcdEEsIFskJWRdXG4iLCBvcGNvZGUsCisJCQkJdGlueSA/IChwdHJfY29uc3QrMCkgOiBfZ2NfZW1pdF9pbW0oZ2MsIHB0cl9jb25zdCswKSk7CisJCQlfZ2NfZW1pdF9tb3YoZ2MsIFJfQSwgcnAucjIpOworCQkJX2djX2VtaXQoZ2MsICJcdCVzXHRBLCBbJCVkXVxuIiwgb3Bjb2RlLAorCQkJCXRpbnkgPyAocHRyX2NvbnN0KzEpIDogX2djX2VtaXRfaW1tKGdjLCBwdHJfY29uc3QrMSkpOworCQl9IGVsc2UgeworCQkJLyogMTYgYml0IGFjY2VzcyAqLworCQkJX2djX2VtaXRfbW92KGdjLCBSX0EsIHZhbF9yZWcpOworCQkJX2djX2VtaXQoZ2MsICJcdCVzXHRBLCBbJCVkXVxuIiwgb3Bjb2RlLAorCQkJCXRpbnkgPyBwdHJfY29uc3QgOiBfZ2NfZW1pdF9pbW0oZ2MsIHB0cl9jb25zdCkpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorX2djX2xvYWRfZnJvbV9tZW0oc3RydWN0IGdjX3N0YXRlICpnYywgaW50IHZhbF9yZWcsIGludCBkdHlwLAorICAgICAgICAgICAgICAgICBsb25nIHB0cl9jb25zdCwgaW50IHB0cl9yZWcsIHN0cnVjdCBWYXIgKnZhcikKK3sKKwlzdHJ1Y3QgcnBhaXIgcnA7CisJY2hhciAqb3Bjb2RlOworCWludCB0aW55OworCWludCBpc19wYWlyOworCisJaWYgKGR0eXAgPT0gRFBPSU5URVIpIHsKKwkJb3Bjb2RlID0gImxkZCI7CisJCXRpbnkgPSBUSU5ZX0RNRU07CisJfSBlbHNlIGlmIChkdHlwID09IFBQT0lOVEVSKSB7CisJCW9wY29kZSA9ICJsZHAiOworCQl0aW55ID0gVElOWV9QTUVNOworCX0gZWxzZSB7CisJCWllcnJvcigwKTsKKwl9CisKKwlpc19wYWlyID0gcmVnX3BhaXIodmFsX3JlZywgJnJwKTsKKworCWlmICh2YXIpCisJeworCQkvKiBWYXJpYWJsZSAqLworCQlpZiAoaXNhdXRvKHZhci0+c3RvcmFnZV9jbGFzcykpIHsKKwkJCS8qIFN0YWNrIHZhcmlhYmxlIGFsd2F5cyBpbiBkYXRhIG1lbSAqLworCQkJaWYgKGR0eXAgIT0gRFBPSU5URVIpCisJCQkJaWVycm9yKDEpOworCisJCQlsb25nIHNwX29mZnNldCA9IF9nY19yZWFsX29mZnNldChnYywgdmFyLCBwdHJfY29uc3QpOworCisJCQlpZiAoc3Bfb2Zmc2V0IDw9IDE1KSB7CisJCQkJLyogT2Zmc2V0IGlzIHNtYWxsIGVub3VnaCBmb3IgaW5kZXhlZCBZIGFjY2VzcyAqLworCQkJCWlmIChpc19wYWlyKSB7CisJCQkJCS8qIDMyIGJpdCAqLworCQkJCQlfZ2NfZW1pdChnYywgIlx0JXNcdEEsIFtZKyssICQlZF1cbiIsIG9wY29kZSwgc3Bfb2Zmc2V0KTsKKwkJCQkJX2djX2VtaXRfbW92KGdjLCBycC5yMSwgUl9BKTsKKwkJCQkJX2djX2VtaXQoZ2MsICJcdCVzXHRBLCBbWS0tLCAkJWRdXG4iLCBvcGNvZGUsIHNwX29mZnNldCk7CisJCQkJCV9nY19lbWl0X21vdihnYywgcnAucjIsIFJfQSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogMTYgYml0ICovCisJCQkJCV9nY19lbWl0KGdjLCAiXHQlc1x0QSwgW1ksICQlZF1cbiIsIG9wY29kZSwgc3Bfb2Zmc2V0KTsKKwkJCQkJX2djX2VtaXRfbW92KGdjLCB2YWxfcmVnLCBSX0EpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogT2Zmc2V0IGlzIHRvbyBsYXJnZSAuLi4gbG9hZCBhZGRyZXNzIGluIEEgYW5kIGZhbGwgYmFjayB0byBjb2RlIGJlbG93ICovCisJCQkJX2djX2VtaXQoZ2MsICJcdG1vdlx0QSwgWVxuIik7CisJCQkJX2djX2VtaXQoZ2MsICJcdGFkZCBBLCBBLCAkJWRcbiIsIHNwX29mZnNldCk7CisJCQkJcHRyX3JlZyA9IFJfQTsKKwkJCX0KKwkJfSBlbHNlIGlmIChpc2V4dGVybih2YXItPnN0b3JhZ2VfY2xhc3MpIHx8IGlzc3RhdGljKHZhci0+c3RvcmFnZV9jbGFzcykpIHsKKwkJCS8qIFN5bWJvbCBuYW1lICovCisJCQljaGFyICpzeW0gPSBzeW1fbmFtZSh2YXIpOworCisJCQkvKiBNYWtlIGFjY2VzcyB1c2luZyBhYnNvbHV0ZSBpbW1lZGlhdGUgYWRkcmVzc2luZyAqLworCQkJaWYgKGlzX3BhaXIpIHsKKwkJCQkvKiAzMiBiaXQgKi8KKwkJCQlpZiAoIXRpbnkpIF9nY19lbWl0KGdjLCAiXHRpbW1cdCQoaGkoJXMrJWQpKVxuIiwgc3ltLCBwdHJfY29uc3QpOworCQkJCV9nY19lbWl0KGdjLCAiXHQlc1x0QSwgWyQobG8oJXMrJWQpKV1cbiIsIG9wY29kZSwgc3ltLCBwdHJfY29uc3QpOworCQkJCWlmIChkdHlwID09IFBQT0lOVEVSKSBfZ2NfZW1pdF9ub3AoZ2MpOworCQkJCV9nY19lbWl0X21vdihnYywgcnAucjEsIFJfQSk7CisJCQkJaWYgKCF0aW55KSBfZ2NfZW1pdChnYywgIlx0aW1tXHQkKGhpKCVzKyVkKSlcbiIsIHN5bSwgcHRyX2NvbnN0KzEpOworCQkJCV9nY19lbWl0KGdjLCAiXHQlc1x0QSwgWyQobG8oJXMrJWQpKV1cbiIsIG9wY29kZSwgc3ltLCBwdHJfY29uc3QrMSk7CisJCQkJaWYgKGR0eXAgPT0gUFBPSU5URVIpIF9nY19lbWl0X25vcChnYyk7CisJCQkJX2djX2VtaXRfbW92KGdjLCBycC5yMiwgUl9BKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogMTYgYml0ICovCisJCQkJaWYgKCF0aW55KSBfZ2NfZW1pdChnYywgIlx0aW1tXHQkKGhpKCVzKyVkKSlcbiIsIHN5bSwgcHRyX2NvbnN0KTsKKwkJCQlfZ2NfZW1pdChnYywgIlx0JXNcdEEsIFskKGxvKCVzKyVkKSldXG4iLCBvcGNvZGUsIHN5bSwgcHRyX2NvbnN0KTsKKwkJCQlpZiAoZHR5cCA9PSBQUE9JTlRFUikgX2djX2VtaXRfbm9wKGdjKTsKKwkJCQlfZ2NfZW1pdF9tb3YoZ2MsIHZhbF9yZWcsIFJfQSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZXJyb3IoMCk7CisJCX0KKwl9CisKKwlpZiAocHRyX3JlZykKKwl7CisJCS8qIFJlZ2lzdGVyIHBvaW50ZXIgKi8KKwkJX2djX2VtaXRfbW92KGdjLCBSX0EsIHB0cl9yZWcpOworCQlfZ2NfZW1pdF9tb3YoZ2MsIFJfWCwgUl9BKTsKKworCQlpZiAoaXNfcGFpcikgeworCQkJLyogMzIgYml0IGFjY2VzcyAqLworCQkJX2djX2VtaXQoZ2MsICJcdCVzXHRBLCBbWCsrXVxuIiwgb3Bjb2RlKTsKKwkJCWlmIChkdHlwID09IFBQT0lOVEVSKSBfZ2NfZW1pdF9ub3AoZ2MpOworCQkJX2djX2VtaXRfbW92KGdjLCBycC5yMSwgUl9BKTsKKwkJCV9nY19lbWl0KGdjLCAiXHQlc1x0QSwgW1gtLV1cbiIsIG9wY29kZSk7CisJCQlpZiAoZHR5cCA9PSBQUE9JTlRFUikgX2djX2VtaXRfbm9wKGdjKTsKKwkJCV9nY19lbWl0X21vdihnYywgcnAucjIsIFJfQSk7CisJCX0gZWxzZSB7CisJCQkvKiAxNiBiaXQgYWNjZXNzICovCisJCQlfZ2NfZW1pdChnYywgIlx0JXNcdEEsIFtYXVxuIiwgb3Bjb2RlKTsKKwkJCWlmIChkdHlwID09IFBQT0lOVEVSKSBfZ2NfZW1pdF9ub3AoZ2MpOworCQkJX2djX2VtaXRfbW92KGdjLCB2YWxfcmVnLCBSX0EpOworCQl9CisJfQorCisJaWYgKCFwdHJfcmVnICYmICF2YXIpCisJeworCQkvKiBDb25zdGFudCBpbW1lZGlhdGUgcG9pbnRlciAqLworCQlpZiAoaXNfcGFpcikgeworCQkJLyogMzIgYml0IGFjY2VzcyAqLworCQkJX2djX2VtaXQoZ2MsICJcdCVzXHRBLCBbJCVkXVxuIiwgb3Bjb2RlLAorCQkJCXRpbnkgPyAocHRyX2NvbnN0KzApIDogX2djX2VtaXRfaW1tKGdjLCBwdHJfY29uc3QrMCkpOworCQkJaWYgKGR0eXAgPT0gUFBPSU5URVIpIF9nY19lbWl0X25vcChnYyk7CisJCQlfZ2NfZW1pdF9tb3YoZ2MsIHJwLnIxLCBSX0EpOworCQkJX2djX2VtaXQoZ2MsICJcdCVzXHRBLCBbJCVkXVxuIiwgb3Bjb2RlLAorCQkJCXRpbnkgPyAocHRyX2NvbnN0KzEpIDogX2djX2VtaXRfaW1tKGdjLCBwdHJfY29uc3QrMSkpOworCQkJaWYgKGR0eXAgPT0gUFBPSU5URVIpIF9nY19lbWl0X25vcChnYyk7CisJCQlfZ2NfZW1pdF9tb3YoZ2MscnAucjIsIFJfQSk7CisJCX0gZWxzZSB7CisJCQkvKiAxNiBiaXQgYWNjZXNzICovCisJCQlfZ2NfZW1pdChnYywgIlx0JXNcdEEsIFskJWRdXG4iLCBvcGNvZGUsCisJCQkJdGlueSA/IHB0cl9jb25zdCA6IF9nY19lbWl0X2ltbShnYywgcHRyX2NvbnN0KSk7CisJCQlpZiAoZHR5cCA9PSBQUE9JTlRFUikgX2djX2VtaXRfbm9wKGdjKTsKKwkJCV9nY19lbWl0X21vdihnYywgdmFsX3JlZywgUl9BKTsKKwkJfQorCX0KK30KKworLyogU2VsZWN0cyBhIHJlZ2lzdGVyIGZvciB0aGUgcmVzdWx0IHRvIGJlIGNvbXB1dGVkIGluICovCitzdGF0aWMgaW50CitfZ2Nfc3RvcmVfc2VsKHN0cnVjdCBJQyAqcCkKK3sKKwlpbnQgdDsKKworCS8qIFJlZ2lzdGVyIGRlc3RpbmF0aW9uID8gKi8KKwlpZiAoaXNyZWcoJnAtPnopKQorCQlyZXR1cm4gcC0+ei5yZWc7CisKKwkvKiBJZiBub3QsIHVzZSB0aGUgc2NyYXRjaCByZWdpc3RlcnMgYXMgdGVtcG9yYXJpZXMgKi8KKwkvKiAoaWRlYWxseSB3ZSBzaG91bGQgZmluZCBzb21lIGZyZWUgc2NyYXRjaCBvbmVzIGFuZCB1c2UgdGhhdAorCSAqICBpbnN0ZWFkIG9mIGhhdmluZyAncmVzZXJ2ZWQnIG9uZXMgLi4uKSAqLworCXQgPSB6dHlwKHApICYgTlE7CisJaWYgKElTU0NBTEFSKHQpICYmIChtc2l6ZXRhYlt0XSA9PSAxKSkKKwkJcmV0dXJuIFJfUkY7CisJaWYgKElTU0NBTEFSKHQpICYmIChtc2l6ZXRhYlt0XSA9PSAyKSkKKwkJcmV0dXJuIFJfUkVQOworCisJLyogQ291bGRuJ3QgZmluZCBhIGZpdCA/ICovCisJaWVycm9yKDApOworfQorCitzdGF0aWMgdm9pZAorX2djX29wX3ByZShzdHJ1Y3QgZ2Nfc3RhdGUgKmdjLCBzdHJ1Y3QgSUMgKnAsIGludCBuX29wLAorICAgICAgICAgICBpbnQgKnJfeiwgaW50ICpyX3ExLCBpbnQgKnJfcTIsIGxvbmcgKmspCit7CisJaW50IGlzMzJiOworCWludCB0ID0gcTF0eXAocCkgJiBOUTsKKwlpbnQgejsKKworCS8qIEluaXQgKi8KKwlnYy0+b3Bfc2F2ZSA9IDA7CisKKwkvKiBUeXBlICovCisJaWYgKElTU0NBTEFSKHQpICYmIChtc2l6ZXRhYlt0XSA9PSAxKSkKKwkJaXMzMmIgPSAwOworCWVsc2UgaWYgKElTU0NBTEFSKHQpICYmIChtc2l6ZXRhYlt0XSA9PSAyKSkKKwkJaXMzMmIgPSAxOworCWVsc2UKKwkJaWVycm9yKDApOworCisJLyogV2hlcmUgdG8gcGxhY2UgdGhlIGRlc3RpbmF0aW9uID8gKi8KKwlpZiAocl96ICYmIGlzcmVnKCZwLT56KSkKKwkJeiA9IHAtPnoucmVnOworCWVsc2UKKwkJeiA9IGlzMzJiID8gUl9SRVAgOiBSX1JGOwkvKiBSX0EgaXMgbmVlZGVkIGZvciB0aGUgc3RvcmVfb3AgKi8KKworCWlmIChyX3opICpyX3ogPSB6OworCisJLyogV2hlcmUgY2FuIHdlIGxvYWQgcTEgPyAqLworCWlmIChpc3JlZygmcC0+cTEpKQorCQkqcl9xMSA9IHAtPnExLnJlZzsKKwllbHNlIGlmIChpc2NvbnN0KCZwLT5xMSkpIHsKKwkJKnJfcTEgPSBSX0k7CisJCSprID0gY29uc3QybG9uZygmcC0+cTEsIHExdHlwKHApKTsKKwl9IGVsc2UgeworCQlpZiAoaXNyZWcoJnAtPnEyKSB8fCBpc2NvbnN0KCZwLT5xMikgfHwgKG5fb3AgPCAyKSkKKwkJCSpyX3ExID0gUl9BOworCQllbHNlCisJCQkqcl9xMSA9IHo7CisJfQorCisJLyogcTIgPyAqLworCWlmIChuX29wICE9IDIpCisJCXJldHVybjsKKworCWlmIChpc3JlZygmcC0+cTIpKQorCQkqcl9xMiA9IHAtPnEyLnJlZzsKKwllbHNlIGlmIChpc2NvbnN0KCZwLT5xMikpIHsKKwkJKnJfcTIgPSBSX0k7CisJCSprID0gY29uc3QybG9uZygmcC0+cTIsIHEydHlwKHApKTsKKwl9IGVsc2UgaWYgKCpyX3ExICE9IHopIHsKKwkJKnJfcTIgPSB6OworCX0gZWxzZSBpZiAoIWlzMzJiKSB7CisJCSpyX3EyID0gKCpyX3ExID09IFJfQSkgPyBSX1JFIDogUl9BOworCX0gZWxzZSBpZiAoeiAhPSBSX1JFUCkgeworCQkqcl9xMiA9IFJfUkVQOworCX0gZWxzZSB7CisJCS8qIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBub3doZXJlIHNhZmUgdG8gbG9hZCBhIDMyYiBxMiA6LyAqLworCQkqcl9xMiA9IF9nY19maW5kX3JlZyhnYywgMSk7CisJCWlmICghKnJfcTIpCisJCQkqcl9xMiA9IFJfUkNQOworCQlnYy0+b3Bfc2F2ZSA9ICFyZWdzY3JhdGNoWypyX3EyXSA/ICpyX3EyIDogMDsKKwl9CisKKwlpZiAoZ2MtPm9wX3NhdmUpIHsKKwkJc3RydWN0IHJwYWlyIHJwOworCQlyZWdfcGFpcihnYy0+b3Bfc2F2ZSwgJnJwKTsKKwkJX2djX2VtaXRfbW92KGdjLCBSX0EsIHJwLnIxKTsKKwkJX2djX2VtaXQoZ2MsICJcdHN0ZFx0QSwgW1ktLV1cbiIpOworCQlfZ2NfZW1pdF9tb3YoZ2MsIFJfQSwgcnAucjIpOworCQlfZ2NfZW1pdChnYywgIlx0c3RkXHRBLCBbWS0tXVxuIik7CisJfQorfQorCitzdGF0aWMgdm9pZAorX2djX29wX3Bvc3Qoc3RydWN0IGdjX3N0YXRlICpnYywgc3RydWN0IElDICpwKQoreworCWlmIChnYy0+b3Bfc2F2ZSkgeworCQlzdHJ1Y3QgcnBhaXIgcnA7CisJCXJlZ19wYWlyKGdjLT5vcF9zYXZlLCAmcnApOworCQlfZ2NfZW1pdChnYywgIlx0bGRkXHRBLCBbWSsrLCAkMV1cbiIpOworCQlfZ2NfZW1pdF9tb3YoZ2MsIHJwLnIyLCBSX0EpOworCQlfZ2NfZW1pdChnYywgIlx0bGRkXHRBLCBbWSsrLCAkMV1cbiIpOworCQlfZ2NfZW1pdF9tb3YoZ2MsIHJwLnIxLCBSX0EpOworCX0KKworCWdjLT5vcF9zYXZlID0gMDsKK30KKworLyogTG9hZCBhbiBvYmplY3QgaW50byBhIHJlZ2lzdGVyICovCitzdGF0aWMgdm9pZAorX2djX2xvYWRfb3Aoc3RydWN0IGdjX3N0YXRlICpnYywgc3RydWN0IG9iaiAqcSwgaW50IGRzdCwgaW50IHR5cGYpCit7CisJc3RydWN0IHJwYWlyIHJwOworCisJLyogU291cmNlIGFscmVhZHkgaW4gcmVnaXN0ZXIgPyAqLworCWlmIChpc3JlZyhxKSkKKwl7CisJCV9nY19tb3ZlX2dwcihnYywgZHN0LCBxLT5yZWcpOworCQlyZXR1cm47CisJfQorCisJLyogSXMgdGhpcyBhIGRlcmVmZXJlbmNlID8gKi8KKwlpZiAocS0+ZmxhZ3MgJiBEUkVGT0JKKQorCXsKKwkJbG9uZyBwdHJfaW1tID0gMDsKKwkJaW50IHB0cl9yZWcgPSAwOworCisJCWlmIChxLT5mbGFncyAmIEtPTlNUKSB7CisJCQkvKiBDb25zdGFudCBhZGRyZXNzIGxvYWQgKi8KKwkJCXB0cl9pbW0gPSBjb25zdDJsb25nKHEsIHBvaW50ZXJfdHlwZShxLT52LT52dHlwKSk7CisJCX0gZWxzZSBpZiAocS0+ZmxhZ3MgJiBSRUcpIHsKKwkJCS8qIERlcmVmZXJlbmNlIHZhbHVlIGluIHJlZ2lzdGVyICovCisJCQlwdHJfcmVnID0gcS0+cmVnOworCQl9IGVsc2UgeworCQkJLyogTG9hZCB2YXJpYWJsZSBjb250ZW50ICovCisJCQlwdHJfcmVnID0gUl9BOworCQkJX2djX2xvYWRfZnJvbV9tZW0oZ2MsIFJfQSwgcG9pbnRlcl90eXBlKHEtPnYtPnZ0eXApLCB6bTJsKHpsMnptKHEtPnZhbC52bG9uZykpLCAwLCBxLT52KTsKKwkJfQorCisJCS8qIEV4ZWN1dGUgZGVyZWZlcmVuY2UgKi8KKwkJX2djX2xvYWRfZnJvbV9tZW0oZ2MsIGRzdCwgcS0+ZHR5cCwgcHRyX2ltbSwgcHRyX3JlZywgTlVMTCk7CisJfQorCWVsc2UKKwl7CisJCWlmIChxLT5mbGFncyAmIEtPTlNUKSB7CisJCQkvKiBDb25zdGFudCBsb2FkICovCisJCQlsb25nIGsgPSBjb25zdDJsb25nKHEsIHR5cGYpOworCisJCQlpZiAocmVnX3BhaXIoZHN0LCAmcnApKSB7CisJCQkJLyogMzIgYml0ICovCisJCQkJbG9uZyB2ID0gayAmIDB4ZmZmZjsKKwkJCQl2ID0gX2djX2VtaXRfaW1tKGdjLCB2KTsKKwkJCQlfZ2NfZW1pdChnYywgIlx0bW92XHRBLCAkJWRcbiIsIHYpOworCQkJCV9nY19lbWl0X21vdihnYywgcnAucjEsIFJfQSk7CisJCQkJdiA9IChrID4+IDE2KSAmIDB4ZmZmZjsKKwkJCQl2ID0gX2djX2VtaXRfaW1tKGdjLCB2KTsKKwkJCQlfZ2NfZW1pdChnYywgIlx0bW92XHRBLCAkJWRcbiIsIHYpOworCQkJCV9nY19lbWl0X21vdihnYywgcnAucjIsIFJfQSk7CisJCQl9IGVsc2UgeworCQkJCS8qIDE2IGJpdCAqLworCQkJCWsgPSBfZ2NfZW1pdF9pbW0oZ2MsIGspOworCQkJCV9nY19lbWl0KGdjLCAiXHRtb3ZcdEEsICQlZFxuIiwgayk7CisJCQkJX2djX2VtaXRfbW92KGdjLCBkc3QsIFJfQSk7CisJCQl9CisJCX0gZWxzZSBpZiAocS0+ZmxhZ3MgJiBWQVJBRFIpIHsKKwkJCS8qIFZhcmlhYmxlIGFkZHJlc3MgbG9hZCAqLworCQkJaW50IHRpbnkgPSAocG9pbnRlcl90eXBlKHEtPnYtPnZ0eXApID09IERQT0lOVEVSKSA/IFRJTllfRE1FTSA6IFRJTllfUE1FTTsKKwkJCWxvbmcgb2ZzID0gem0ybCh6bDJ6bShxLT52YWwudmxvbmcpKTsKKwkJCWNoYXIgKnN5bSA9IHN5bV9uYW1lKHEtPnYpOworCisJCQlpZiAoIXRpbnkpIF9nY19lbWl0KGdjLCAiXHRpbW1cdCQoaGkoJXMrJWQpKVxuIiwgc3ltLCBvZnMpOworCQkJX2djX2VtaXQoZ2MsICJcdG1vdlx0QSwgWyQobG8oJXMrJWQpKV1cbiIsIHN5bSwgb2ZzKTsKKwkJCV9nY19lbWl0X21vdihnYywgZHN0LCBSX0EpOworCQl9IGVsc2UgaWYgKCEocS0+ZmxhZ3MgJiBSRUcpKSB7CisJCQkvKiBWYXJpYWJsZSBsb2FkICovCisJCQlfZ2NfbG9hZF9mcm9tX21lbShnYywgZHN0LCBwb2ludGVyX3R5cGUocS0+di0+dnR5cCksIHptMmwoemwyem0ocS0+dmFsLnZsb25nKSksIDAsIHEtPnYpOworCQl9CisJfQorfQorCisvKiBTdG9yZSBhIHJlZ2lzdGVyIGludG8gaXRzIGZpbmFsIGRlc3RpbmF0aW9uICovCitzdGF0aWMgdm9pZAorX2djX3N0b3JlX29wKHN0cnVjdCBnY19zdGF0ZSAqZ2MsIHN0cnVjdCBvYmogKnosIGludCBzcmMsIGludCB0eXBmKQoreworCXN0cnVjdCBycGFpciBycDsKKwlpbnQgcmVnOworCisJLyogUmVnaXN0ZXIgZGVzdGluYXRpb24gPyAqLworCWlmIChpc3JlZyh6KSkKKwl7CisJCV9nY19tb3ZlX2dwcihnYywgei0+cmVnLCBzcmMpOworCQlyZXR1cm47CisJfQorCisJLyogSXMgdGhpcyBhIGRlcmVmZXJlbmNlID8gKi8KKwlpZiAoei0+ZmxhZ3MgJiBEUkVGT0JKKQorCXsKKwkJbG9uZyBwdHJfaW1tID0gMDsKKwkJaW50IHB0cl9yZWcgPSAwOworCisJCWlmICh6LT5mbGFncyAmIEtPTlNUKSB7CisJCQkvKiBDb25zdGFudCBhZGRyZXNzIGxvYWQgKi8KKwkJCXB0cl9pbW0gPSBjb25zdDJsb25nKHosIHBvaW50ZXJfdHlwZSh6LT52LT52dHlwKSk7CisJCX0gZWxzZSBpZiAoei0+ZmxhZ3MgJiBSRUcpIHsKKwkJCS8qIERlcmVmZXJlbmNlIHZhbHVlIGluIHJlZ2lzdGVyICovCisJCQlwdHJfcmVnID0gei0+cmVnOworCQl9IGVsc2UgeworCQkJLyogTG9hZCB2YXJpYWJsZSBjb250ZW50ICovCisJCQlwdHJfcmVnID0gUl9BOworCQkJX2djX2xvYWRfZnJvbV9tZW0oZ2MsIFJfQSwgcG9pbnRlcl90eXBlKHotPnYtPnZ0eXApLCB6bTJsKHpsMnptKHotPnZhbC52bG9uZykpLCAwLCB6LT52KTsKKwkJfQorCisJCS8qIEV4ZWN1dGUgZGVyZWZlcmVuY2UgKi8KKwkJX2djX3N0b3JlX3RvX21lbShnYywgc3JjLCB6LT5kdHlwLCBwdHJfaW1tLCBwdHJfcmVnLCBOVUxMKTsKKwl9CisJZWxzZSBpZiAoei0+ZmxhZ3MgJiBWQVIpCisJeworCQkvKiBWYXJpYWJsZSBzdG9yZSAqLworCQlfZ2Nfc3RvcmVfdG9fbWVtKGdjLCBzcmMsIHBvaW50ZXJfdHlwZSh6LT52LT52dHlwKSwgem0ybCh6bDJ6bSh6LT52YWwudmxvbmcpKSwgMCwgei0+dik7CisJfQorCWVsc2UKKwl7CisJCS8qIGh1aCA/ICovCisJCWllcnJvcigwKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQKK2djX2Z1bmNfYmVnaW4oc3RydWN0IGdjX3N0YXRlICpnYywKKyAgICAgICAgICAgICAgRklMRSAqZiwgc3RydWN0IElDICpwLCBzdHJ1Y3QgVmFyICp2LCB6bWF4IG9mZnNldCkKK3sKKwlpbnQgaTsKKworCS8qIFJlc2V0IHN0YXRlICovCisJbWVtc2V0KGdjLCAweDAwLCBzaXplb2Yoc3RydWN0IGdjX3N0YXRlKSk7CisKKwlnYy0+ZiA9IGY7CisKKwkvKiBJbml0IHJlZ2lzdGVyIHVzYWdlICovCisJZm9yIChpPTE7IGk8PU1BWFI7IGkrKykKKwkJZ2MtPnJlZ19idXN5W2ldID0gcmVnc2FbaV07CisKKwkvKiBTZWN0aW9uIGFuZCBzeW1ib2wgc2V0dXAgKi8KKwlpZiAoaXNleHRlcm4odi0+c3RvcmFnZV9jbGFzcykpCisJCWVtaXQoZiwgIlx0LnRleHRcbiVzJXM6XG4iLCBpZHByZWZpeCwgdi0+aWRlbnRpZmllcik7CisJZWxzZQorCQllbWl0KGYsICJcdC50ZXh0XG4lcyVkOlxuIiwgbGFicHJlZml4LCB6bTJsKHYtPm9mZnNldCkpOworCisJLyogRGVidWcgKi8KKyNpZmRlZiBEQkcKKwllbWl0KGdjLT5mLCAiXHQ7IEZ1bmN0aW9uIHByb2xvZ3VlXG4iKTsKKyNlbmRpZgorCisJLyogRnVuY3Rpb24gcHJvbG9ndWUgKi8KKwkJLyogU2F2ZSByZXR1cm4gYWRkcmVzcyAqLworCWVtaXQoZiwgIlx0bW92XHRBLCBYXG4iKTsKKwllbWl0KGYsICJcdHN0ZFx0QSwgW1ktLV1cbiIpOworCisJCS8qIFNhdmUgYWxsIHJlZ2lzdGVycyBuZWVkIHNhdmluZyAqLworCWZvciAoaT0xOyBpPD1NQVhSOyBpKyspIHsKKwkJaWYgKHJlZ3VzZWRbaV0gJiYgIXJlZ3NjcmF0Y2hbaV0gJiYgIXJlZ3NhW2ldKQorCQl7CisJCQlzdHJ1Y3QgcnBhaXIgcnA7CisJCQlpZiAocmVnX3BhaXIoaSwgJnJwKSkgeworCQkJCWlmICghcmVndXNlZFtycC5yMV0pIHsKKwkJCQkJZW1pdChmLCAiXHRtb3ZcdEEsICVzXG4iLCByZWduYW1lc1tycC5yMV0pOworCQkJCQllbWl0KGYsICJcdHN0ZFx0QSwgW1ktLV1cbiIpOworCQkJCQlnYy0+c19zYXZlc2l6ZSArPSAxOworCQkJCX0KKwkJCQlpZiAoIXJlZ3VzZWRbcnAucjJdKSB7CisJCQkJCWVtaXQoZiwgIlx0bW92XHRBLCAlc1xuIiwgcmVnbmFtZXNbcnAucjJdKTsKKwkJCQkJZW1pdChmLCAiXHRzdGRcdEEsIFtZLS1dXG4iKTsKKwkJCQkJZ2MtPnNfc2F2ZXNpemUgKz0gMTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWVtaXQoZiwgIlx0bW92XHRBLCAlc1xuIiwgcmVnbmFtZXNbaV0pOworCQkJCWVtaXQoZiwgIlx0c3RkXHRBLCBbWS0tXVxuIik7CisJCQkJZ2MtPnNfc2F2ZXNpemUgKz0gMTsKKwkJCX0KKwkJfQorCX0KKworCQkvKiBBZGp1c3QgU1AgZm9yIGxvY2FsIHZhcmlhYmxlcyAqLworCWdjLT5zX2xvY2Fsc2l6ZSA9IHptMmwob2Zmc2V0KTsKKworCWlmIChnYy0+c19sb2NhbHNpemUgPD0gMikgeworCQlmb3IgKGk9MDsgaTxnYy0+c19sb2NhbHNpemU7IGkrKykKKwkJCWVtaXQoZiwgIlx0bGRkXHRBLCBbWS0tXVxuIik7CS8qIFVzZWxlc3Mgb3AgKi8KKwl9IGVsc2UgeworCQllbWl0KGYsICJcdG1vdlx0QSwgWVxuIik7CisJCWVtaXQoZiwgIlx0YWRkXHRBLCBBLCAkJWRcbiIsIC1nYy0+c19sb2NhbHNpemUpOworCQllbWl0KGYsICJcdG1vdlx0WSwgQVxuIik7CisJfQorCisJLyogTW9kaWZpZWRzIHJlZ3MgaW4gYWxsIGNhc2VzICovCisJQlNFVChyZWdzX21vZGlmaWVkLCBSX0EpOworCUJTRVQocmVnc19tb2RpZmllZCwgUl9YKTsKKwlCU0VUKHJlZ3NfbW9kaWZpZWQsIFJfWSk7Cit9CisKK3N0YXRpYyB2b2lkCitnY19mdW5jX2VuZChzdHJ1Y3QgZ2Nfc3RhdGUgKmdjLAorICAgICAgICAgICAgRklMRSAqZiwgc3RydWN0IElDICpwLCBzdHJ1Y3QgVmFyICp2LCB6bWF4IG9mZnNldCkKK3sKKwlpbnQgaTsKKworCS8qIERlYnVnICovCisjaWZkZWYgREJHCisJZW1pdChnYy0+ZiwgIlxuXHQ7IEZ1bmN0aW9uIGVwaWxvZ3VlXG4iKTsKKyNlbmRpZgorCisJLyogRnVuY3Rpb24gZXBpbG9ndWUgKi8KKwkJLyogUmUtYWRqdXN0IFNQICovCisJaWYgKGdjLT5zX2xvY2Fsc2l6ZSA8PSAyKSB7CisJCWZvciAoaT0wOyBpPGdjLT5zX2xvY2Fsc2l6ZTsgaSsrKQorCQkJZW1pdChmLCAiXHRsZGRcdEEsIFtZKytdXG4iKTsJLyogVXNlbGVzcyBvcCAqLworCX0gZWxzZSB7CisJCWVtaXQoZiwgIlx0bW92XHRBLCBZXG4iKTsKKwkJZW1pdChmLCAiXHRhZGRcdEEsIEEsICQlZFxuIiwgZ2MtPnNfbG9jYWxzaXplKTsKKwkJZW1pdChmLCAiXHRtb3ZcdFksIEFcbiIpOworCX0KKworCQkvKiBSZXN0b3JlIHNhdmVkIHJlZ2lzdGVycyAqLworCWZvciAoaT1NQVhSOyBpPj0xOyBpLS0pIHsKKwkJaWYgKHJlZ3VzZWRbaV0gJiYgIXJlZ3NjcmF0Y2hbaV0gJiYgIXJlZ3NhW2ldKQorCQl7CisJCQlzdHJ1Y3QgcnBhaXIgcnA7CisJCQlpZiAocmVnX3BhaXIoaSwgJnJwKSkgeworCQkJCWlmICghcmVndXNlZFtycC5yMl0pIHsKKwkJCQkJZW1pdChmLCAiXHRsZGRcdEEsIFtZKyssICQxXVxuIik7CisJCQkJCWVtaXQoZiwgIlx0bW92XHQlcywgQVxuIiwgcmVnbmFtZXNbcnAucjJdKTsKKwkJCQl9CisJCQkJaWYgKCFyZWd1c2VkW3JwLnIxXSkgeworCQkJCQllbWl0KGYsICJcdGxkZFx0QSwgW1krKywgJDFdXG4iKTsKKwkJCQkJZW1pdChmLCAiXHRtb3ZcdCVzLCBBXG4iLCByZWduYW1lc1tycC5yMV0pOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZW1pdChmLCAiXHRsZGRcdEEsIFtZKyssICQxXVxuIik7CisJCQkJZW1pdChmLCAiXHRtb3ZcdCVzLCBBXG4iLCByZWduYW1lc1tpXSk7CisJCQl9CisJCX0KKwl9CisKKwkJLyogUmV0dXJuIGFkZHJlc3MgKi8KKwllbWl0KGYsICJcdGxkZFx0QSwgW1krKywgJDFdXG4iKTsKKwllbWl0KGYsICJcdG1vdlx0WCwgQVxuIik7CisKKwkJLyogUmV0dXJuIHZhbHVlICovCisJZW1pdChmLCAiXHRiYXhcbiIpOworCWlmIChnYy0+cmVnX3J2KQorCQllbWl0KGYsICJcdG1vdlx0QSwgJXNcbiIsIHJlZ25hbWVzW2djLT5yZWdfcnZdKTsKKwllbHNlCisJCWVtaXQoZiwgIlx0bW92XHRBLCAkJWRcbiIsIGdjLT52YWxfcnYpOworCisJLyogQml0IG9mIHNwYWNpbmcgKi8KKwllbWl0KGdjLT5mLCAiXG5cbiIpOworfQorCitzdGF0aWMgdm9pZAorZ2NfZnVuY19hc3NpZ24oc3RydWN0IGdjX3N0YXRlICpnYywgc3RydWN0IElDICpub2RlKQoreworCS8qIEZJWE1FOiBPbmx5IHdvcmtzIGZvciBzaXplPTEgfCBzaXplPTIgLi4uICovCisJaW50IHZfcmVnOworCisJaWYgKGlzcmVnKCZub2RlLT5xMSkpIHsKKwkJdl9yZWcgPSBub2RlLT5xMS5yZWc7CisJfSBlbHNlIHsKKwkJdl9yZWcgPSBfZ2Nfc3RvcmVfc2VsKG5vZGUpOworCQlfZ2NfbG9hZF9vcChnYywgJm5vZGUtPnExLCB2X3JlZywgcTF0eXAobm9kZSkpOworCX0KKworCV9nY19zdG9yZV9vcChnYywgJm5vZGUtPnosIHZfcmVnLCB6dHlwKG5vZGUpKTsKK30KKworc3RhdGljIHZvaWQKK2djX2Z1bmNfY29udmVydChzdHJ1Y3QgZ2Nfc3RhdGUgKmdjLCBzdHJ1Y3QgSUMgKm5vZGUpCit7CisJc3RydWN0IHJwYWlyIHJwOworCWludCBxdCA9IHExdHlwKG5vZGUpICYgTlE7CisJaW50IHp0ID0genR5cChub2RlKSAgJiBOUTsKKwlpbnQgc2V4dCA9ICEocTF0eXAobm9kZSkgJiBVTlNJR05FRCk7CisJaW50IHZfcmVnOworCisJaWYgKCh6dCA9PSBMT05HKSAmJiAocXQgPj0gQ0hBUikgJiYgKHF0IDw9IElOVCkpIHsKKwkJLyogQ29udmVydCBmcm9tIHNob3J0IHRvIGxvbmcgKi8KKwkJdl9yZWcgPSBfZ2Nfc3RvcmVfc2VsKG5vZGUpOworCisJCWlmICghcmVnX3BhaXIodl9yZWcsICZycCkpCisJCQlpZXJyb3IoMCk7CisKKwkJX2djX2xvYWRfb3AoZ2MsICZub2RlLT5xMSwgcnAucjEsIHExdHlwKG5vZGUpKTsKKworCQlpZiAoc2V4dCkgeworCQkJX2djX2VtaXRfYWx1KGdjLCAicm9sIiwgUl9BLCBycC5yMSwgMCwgMCk7CisJCQlfZ2NfZW1pdF9hbHUoZ2MsICJhbmQiLCBSX0EsIFJfQSwgUl9JLCAxKTsKKwkJCV9nY19lbWl0X2FsdShnYywgInN1YiIsIFJfQSwgUl9BLCBSX0ksIDApOworCQkJX2djX2VtaXRfbW92KGdjLCBycC5yMiwgUl9BKTsKKwkJfSBlbHNlIHsKKwkJCV9nY19lbWl0KGdjLCAiXHRtb3ZcdEEsICQwXG4iKTsKKwkJCV9nY19lbWl0X21vdihnYywgcnAucjIsIFJfQSk7CisJCX0KKwl9IGVsc2UgaWYgKCh6dCA+PSBDSEFSKSAmJiAoenQgPD0gSU5UKSAmJiAocXQgPT0gTE9ORykpIHsKKwkJLyogQ29udmVydCBmcm9tIGxvbmcgdG8gc2hvcnQgKi8KKwkJaWYgKGlzcmVnKCZub2RlLT5xMSkpIHsKKwkJCS8qIExvbmcgYWxyZWFkeSBpbiByZWdpc3Rlciwgc28gZ2V0IHRoZSBMU0IgZnJvbSBwYWlyIGFuZCBkbyBzdG9yZSAqLworCQkJaWYgKCFyZWdfcGFpcihub2RlLT5xMS5yZWcsICZycCkpCisJCQkJaWVycm9yKDApOworCisJCQl2X3JlZyA9IHJwLnIxOworCQl9IGVsc2UgeworCQkJLyogUGVyZm9ybSBhIGxvYWQgYXMgaWYgaXQgd2FzIGEgc2hvcnQuIEJlY2F1c2Ugb2YgTGl0dGxlLUVuZGlhbiwgaXQgd29ya3MgKi8KKwkJCXZfcmVnID0gX2djX3N0b3JlX3NlbChub2RlKTsKKwkJCV9nY19sb2FkX29wKGdjLCAmbm9kZS0+cTEsIHZfcmVnLCBxMXR5cChub2RlKSk7CisJCX0KKwl9IGVsc2UgaWYgKElTUE9JTlRFUih6dCkgJiYgSVNQT0lOVEVSKHF0KSkgeworCQkvKiBObyB3YXkgdG8gY29udmVydCBiZXR3ZWVuIHBvaW50ZXIgdHlwZXMgdG8gZGlmZmVyZW50IHNwYWNlcyAuLi4gKi8KKwkJaWVycm9yKDEpOworCX0gZWxzZSB7CisJCS8qIFNob3VsZG4ndCBoYXBwZW4sIGFsbCBvdGhlciBjb252ZXJzaW9ucyBhcmUgbGliX2NhbGwgKi8KKwkJaWVycm9yKDApOworCX0KKworCV9nY19zdG9yZV9vcChnYywgJm5vZGUtPnosIHZfcmVnLCB6dHlwKG5vZGUpKTsKK30KKworc3RhdGljIHZvaWQKK2djX2Z1bmNfYWx1XzJvcChzdHJ1Y3QgZ2Nfc3RhdGUgKmdjLCBzdHJ1Y3QgSUMgKm5vZGUpCit7CisJY29uc3QgY2hhciAqb3Bjb2RlLCAqb3Bjb2RlMjsKKwlzdHJ1Y3QgcnBhaXIgcnB6LCBycDEsIHJwMjsKKwlpbnQgcmVneiwgcmVnMSwgcmVnMiwgcmVndDsKKwlsb25nIGs7CisJaW50IGlzMzJiLCBpc3N1YiwgaXNhZGQ7CisKKwlpczMyYiA9IElTVExPTkcoenR5cChub2RlKSk7CisJaXNhZGQgPSAobm9kZS0+Y29kZSA9PSBBREQpIHx8IChub2RlLT5jb2RlID09IEFEREkyUCk7CisJaXNzdWIgPSAobm9kZS0+Y29kZSA9PSBTVUIpIHx8IChub2RlLT5jb2RlID09IFNVQklGUCkgfHwgKG5vZGUtPmNvZGUgPT0gU1VCUEZQKTsKKworCS8qIExvYWQgb3BlcmFuZHMgKi8KKwlfZ2Nfb3BfcHJlKGdjLCBub2RlLCAyLCAmcmVneiwgJnJlZzEsICZyZWcyLCAmayk7CisKKwlpZiAoIWlzcmVnKCZub2RlLT5xMSkgJiYgIWlzY29uc3QoJm5vZGUtPnExKSkKKwkJX2djX2xvYWRfb3AoZ2MsICZub2RlLT5xMSwgcmVnMSwgcTF0eXAobm9kZSkpOworCisJaWYgKCFpc3JlZygmbm9kZS0+cTIpICYmICFpc2NvbnN0KCZub2RlLT5xMikpCisJCV9nY19sb2FkX29wKGdjLCAmbm9kZS0+cTIsIHJlZzIsIHEydHlwKG5vZGUpKTsKKworCS8qIFdlIGNhbiBvbmx5IGhhdmUgaW1tZWRpYXRlIGluIHJlZzIuIEFsc28gJ3N1YicgaXMgc3dhcHBlZCB2cyBodyAqLworCWlmIChpc3N1YikgeworCQlpZiAocmVnMiA9PSBSX0kpIHsKKwkJCW5vZGUtPmNvZGUgPSBBREQ7CisJCQlrID0gLWs7CisJCX0gZWxzZSB7CisJCQlyZWd0ID0gcmVnMTsKKwkJCXJlZzEgPSByZWcyOworCQkJcmVnMiA9IHJlZ3Q7CisJCX0KKwl9IGVsc2UgaWYgKHJlZzEgPT0gUl9JKSB7CisJCXJlZ3QgPSByZWcxOworCQlyZWcxID0gcmVnMjsKKwkJcmVnMiA9IHJlZ3Q7CisJfQorCisJLyogU29sdmUgcmVnLXBhaXJzICovCisJcmVnX3BhaXIocmVneiwgJnJweik7CisJcmVnX3BhaXIocmVnMSwgJnJwMSk7CisJcmVnX3BhaXIocmVnMiwgJnJwMik7CisKKwlpZiAocmVnMiA9PSBSX0kpCisJCXJwMi5yMSA9IHJwMi5yMiA9IFJfSTsKKworCS8qIFNlbGVjdCBvcGNvZGUgKi8KKwlzd2l0Y2ggKG5vZGUtPmNvZGUpIHsKKwljYXNlIE9SOiAgb3Bjb2RlID0gIm9yIjsgIG9wY29kZTIgPSAib3IiOyAgIGJyZWFrOworCWNhc2UgWE9SOiBvcGNvZGUgPSAieG9yIjsgb3Bjb2RlMiA9ICJ4b3IiOyAgIGJyZWFrOworCWNhc2UgQU5EOiBvcGNvZGUgPSAiYW5kIjsgb3Bjb2RlMiA9ICJhbmQiOyAgIGJyZWFrOworCWNhc2UgQUREOiBvcGNvZGUgPSAiYWRkIjsgb3Bjb2RlMiA9ICJhZGRjeSI7IGJyZWFrOworCWNhc2UgU1VCOiBvcGNvZGUgPSAic3ViIjsgb3Bjb2RlMiA9ICJzdWJjeSI7IGJyZWFrOworCWNhc2UgQURESTJQOiBvcGNvZGUgPSAiYWRkIjsgb3Bjb2RlMiA9IE5VTEw7IGJyZWFrOworCWNhc2UgU1VCSUZQOiBvcGNvZGUgPSAic3ViIjsgb3Bjb2RlMiA9IE5VTEw7IGJyZWFrOworCWNhc2UgU1VCUEZQOiBvcGNvZGUgPSAic3ViIjsgb3Bjb2RlMiA9IE5VTEw7IGJyZWFrOworCWRlZmF1bHQ6IGllcnJvcigwKTsKKwl9CisKKwkvKiBEbyB0aGUgb3BlcmF0aW9uICovCisJaWYgKGlzMzJiKSB7CisJCWlmIChyZWd6ID09IHJlZzEpIHsKKwkJCWlmIChyZWcyID09IFJfSSkgeworCQkJCS8qIDEgc2luZ2xlIEdQUiAocmVnMSA9PSByZWd6KSBhbmQgb25lIGltbWVkaWF0ZSAqLworCQkJCV9nY19lbWl0X2FsdShnYywgb3Bjb2RlLCAgcnB6LnIxLCBycDEucjEsIFJfSSwgayAmIDB4ZmZmZik7CisJCQkJX2djX2VtaXRfYWx1KGdjLCBvcGNvZGUyLCBycHoucjIsIHJwMS5yMiwgUl9JLCAoayA+PiAxNikgJiAweGZmZmYpOworCQkJfSBlbHNlIHsKKwkJCQkvKiAyIGRpZmZlcmVudCBHUFJzLCByZWcxID09IHJlZ3ogKi8KKwkJCQlfZ2NfZW1pdF9tb3YoZ2MsIFJfQSwgcnAyLnIxKTsKKwkJCQlfZ2NfZW1pdF9hbHUoZ2MsIG9wY29kZSwgIHJwei5yMSwgcnAxLnIxLCBSX0EsIDApOworCQkJCV9nY19lbWl0X21vdihnYywgUl9BLCBycDIucjIpOworCQkJCV9nY19lbWl0X2FsdShnYywgb3Bjb2RlMiwgcnB6LnIyLCBycDEucjIsIFJfQSwgMCk7CisJCQl9CisJCX0gZWxzZSBpZiAocmVneiA9PSByZWcyKSB7CisJCQkvKiAyIGRpZmZlcmVudCBHUFJzLCByZWcyID09IHJlZ3ogKi8KKwkJCV9nY19lbWl0X21vdihnYywgUl9BLCBycDEucjEpOworCQkJX2djX2VtaXRfYWx1KGdjLCBvcGNvZGUsICBycHoucjEsIFJfQSwgcnAyLnIxLCAwKTsKKwkJCV9nY19lbWl0X21vdihnYywgUl9BLCBycDEucjIpOworCQkJX2djX2VtaXRfYWx1KGdjLCBvcGNvZGUyLCBycHoucjIsIFJfQSwgcnAyLnIyLCAwKTsKKwkJfSBlbHNlIGlmIChyZWcyID09IFJfSSkgeworCQkJLyogMiBkaWZmZXJlbnQgR1BScyBhbmQgb25lIGltbWVkaWF0ZSAqLworCQkJX2djX2VtaXRfbW92KGdjLCBSX0EsIHJwMS5yMSk7CisJCQlfZ2NfZW1pdF9hbHUoZ2MsIG9wY29kZSwgIHJwei5yMSwgUl9BLCBycDIucjEsIGsgJiAweGZmZmYpOworCQkJX2djX2VtaXRfbW92KGdjLCBSX0EsIHJwMS5yMik7CisJCQlfZ2NfZW1pdF9hbHUoZ2MsIG9wY29kZTIsIHJwei5yMiwgUl9BLCBycDIucjIsIChrID4+IDE2KSAmIDB4ZmZmZik7CisJCX0gZWxzZSB7CisJCQkvKiAzIGRpZmZlcmVudCBHUFJzIHBhaXIgKi8KKwkJCV9nY19lbWl0X21vdihnYywgUl9BLCBycDEucjEpOworCQkJX2djX2VtaXRfYWx1KGdjLCBvcGNvZGUsICBSX0EsIFJfQSwgcnAyLnIxLCAwKTsKKwkJCV9nY19lbWl0X21vdihnYywgcnB6LnIxLCBSX0EpOworCQkJX2djX2VtaXRfbW92KGdjLCBSX0EsIHJwMS5yMik7CisJCQlfZ2NfZW1pdF9hbHUoZ2MsIG9wY29kZTIsIFJfQSwgUl9BLCBycDIucjIsIDApOworCQkJX2djX2VtaXRfbW92KGdjLCBycHoucjIsIFJfQSk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBDb3VudCBHUFJzICovCisJCWludCBuZ3ByID0gaXNncHIocmVneikgKyBpc2dwcihyZWcxKSArIGlzZ3ByKHJlZzIpOworCisJCS8qIERldGVjdCBJTkMgLyBERUMgKi8KKwkJaWYgKChyZWcyID09IFJfSSkgJiYgKChrID09IDEpIHx8IChrID09IC0xKSkgJiYgKGlzYWRkIHx8IGlzc3ViKSkKKwkJeworCQkJb3Bjb2RlID0gKChrID09IC0xKSBeIChub2RlLT5jb2RlID09IFNVQikpID8gImRlYyIgOiAiaW5jIjsKKworCQkJaWYgKChyZWd6ID09IHJlZzEpIHx8IChyZWd6ID09IFJfQSkgfHwgKHJlZzEgPT0gUl9BKSkgeworCQkJCV9nY19lbWl0X2FsdShnYywgb3Bjb2RlLCByZWd6LCByZWcxLCAwLCAwKTsKKwkJCX0gZWxzZSB7CisJCQkJX2djX2VtaXRfYWx1KGdjLCBvcGNvZGUsIFJfQSwgcmVnMSwgMCwgMCk7CisJCQkJX2djX2VtaXRfbW92KGdjLCByZWd6LCBSX0EpOworCQkJfQorCQl9CisKKwkJLyogQ2xhc3NpYyBBTFUgKi8KKwkJZWxzZSBpZiAobmdwciA8IDIpIHsKKwkJCV9nY19lbWl0X2FsdShnYywgb3Bjb2RlLCByZWd6LCByZWcxLCByZWcyLCBrKTsKKwkJfSBlbHNlIGlmIChuZ3ByID09IDIpIHsKKwkJCWlmIChyZWd6ID09IFJfQSkgeworCQkJCV9nY19lbWl0X21vdihnYywgUl9BLCByZWcxKTsKKwkJCQlfZ2NfZW1pdF9hbHUoZ2MsIG9wY29kZSwgUl9BLCBSX0EsIHJlZzIsIGspOworCQkJfSBlbHNlIGlmICgocmVneiA9PSByZWcxKSB8fCAocmVneiA9PSByZWcyKSkgeworCQkJCV9nY19lbWl0X2FsdShnYywgb3Bjb2RlLCByZWd6LCByZWcxLCByZWcyLCBrKTsKKwkJCX0gZWxzZSB7CisJCQkJX2djX2VtaXRfYWx1KGdjLCBvcGNvZGUsIFJfQSwgcmVnMSwgcmVnMiwgayk7CisJCQkJX2djX2VtaXRfbW92KGdjLCByZWd6LCBSX0EpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHJlZ3ogPT0gcmVnMSkgeworCQkJCV9nY19lbWl0X21vdihnYywgUl9BLCByZWcyKTsKKwkJCQlfZ2NfZW1pdF9hbHUoZ2MsIG9wY29kZSwgcmVneiwgcmVneiwgUl9BLCAwKTsKKwkJCX0gZWxzZSBpZiAocmVneiA9PSByZWcyKSB7CisJCQkJX2djX2VtaXRfbW92KGdjLCBSX0EsIHJlZzEpOworCQkJCV9nY19lbWl0X2FsdShnYywgb3Bjb2RlLCByZWd6LCByZWd6LCBSX0EsIDApOworCQkJfSBlbHNlIHsKKwkJCQlfZ2NfZW1pdF9tb3YoZ2MsIFJfQSwgcmVnMSk7CisJCQkJX2djX2VtaXRfYWx1KGdjLCBvcGNvZGUsIFJfQSwgUl9BLCByZWcyLCAwKTsKKwkJCQlfZ2NfZW1pdF9tb3YoZ2MsIHJlZ3osIFJfQSk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBTdG9yZSByZXN1bHQgKi8KKwlfZ2Nfc3RvcmVfb3AoZ2MsICZub2RlLT56LCByZWd6LCB6dHlwKG5vZGUpKTsKKworCS8qIEFsbG93ICd0ZXN0JyBvcHRpbWl6YXRpb24gKi8KKwlnYy0+Y21wX2N1cl96ID0gcmVnejsKKworCS8qIENsZWFuIHVwICovCisJX2djX29wX3Bvc3QoZ2MsIG5vZGUpOworfQorCitzdGF0aWMgdm9pZAorZ2NfZnVuY19ub3Qoc3RydWN0IGdjX3N0YXRlICpnYywgc3RydWN0IElDICpub2RlKQoreworCXN0cnVjdCBycGFpciBycDsKKwlpbnQgbF9yZWcsIHpfcmVnLCBpczMyYjsKKworCXpfcmVnID0gX2djX3N0b3JlX3NlbChub2RlKTsKKwlpczMyYiA9IHJlZ19wYWlyKHpfcmVnLCAmcnApOworCWxfcmVnID0gKGlzMzJiIHx8IChpc3JlZygmbm9kZS0+cTEpICYmIChub2RlLT5xMS5yZWcgIT0gel9yZWcpKSkgPyB6X3JlZyA6IFJfQTsKKworCV9nY19sb2FkX29wKGdjLCAmbm9kZS0+cTEsIGxfcmVnLCBxMXR5cChub2RlKSk7CisKKwlpZiAoaXMzMmIpIHsKKwkJX2djX2VtaXQoZ2MsICJcdG1vdlx0QSwgJDB4ZmZmZlxuIik7CisJCV9nY19lbWl0X2FsdShnYywgInhvciIsIHJwLnIxLCBycC5yMSwgUl9BLCAwKTsKKwkJX2djX2VtaXRfYWx1KGdjLCAieG9yIiwgcnAucjIsIHJwLnIyLCBSX0EsIDApOworCX0gZWxzZSB7CisJCV9nY19lbWl0X2FsdShnYywgInhvciIsIHpfcmVnLCBsX3JlZywgUl9JLCAweGZmZmYpOworCX0KKworCV9nY19zdG9yZV9vcChnYywgJm5vZGUtPnosIHpfcmVnLCB6dHlwKG5vZGUpKTsKK30KKworc3RhdGljIHZvaWQKK2djX2Z1bmNfbmVnKHN0cnVjdCBnY19zdGF0ZSAqZ2MsIHN0cnVjdCBJQyAqbm9kZSkKK3sKKwlzdHJ1Y3QgcnBhaXIgcnA7CisJaW50IGxfcmVnLCB6X3JlZywgaXMzMmI7CisKKwl6X3JlZyA9IF9nY19zdG9yZV9zZWwobm9kZSk7CisJaXMzMmIgPSByZWdfcGFpcih6X3JlZywgJnJwKTsKKwlsX3JlZyA9IChpczMyYiB8fCAoaXNyZWcoJm5vZGUtPnExKSAmJiAobm9kZS0+cTEucmVnICE9IHpfcmVnKSkpID8gel9yZWcgOiBSX0E7CisKKwlfZ2NfbG9hZF9vcChnYywgJm5vZGUtPnExLCBsX3JlZywgcTF0eXAobm9kZSkpOworCisJaWYgKGlzMzJiKSB7CisJCV9nY19lbWl0KGdjLCAiXHRtb3ZcdEEsICQwXG4iKTsKKwkJX2djX2VtaXRfYWx1KGdjLCAic3ViIiwgIHJwLnIxLCBycC5yMSwgUl9BLCAwKTsKKwkJX2djX2VtaXRfYWx1KGdjLCAic3ViY3kiLCBycC5yMiwgcnAucjIsIFJfQSwgMCk7CisJfSBlbHNlIHsKKwkJX2djX2VtaXRfYWx1KGdjLCAic3ViIiwgel9yZWcsIGxfcmVnLCBSX0ksIDApOworCX0KKworCV9nY19zdG9yZV9vcChnYywgJm5vZGUtPnosIHpfcmVnLCB6dHlwKG5vZGUpKTsKK30KKworc3RhdGljIHZvaWQKK2djX2Z1bmNfc2hpZnQoc3RydWN0IGdjX3N0YXRlICpnYywgc3RydWN0IElDICpub2RlKQoreworCS8qIEZJWE1FICovCit9CisKK3N0YXRpYyB2b2lkCitnY19mdW5jX2FsbG9jcmVnKHN0cnVjdCBnY19zdGF0ZSAqZ2MsIHN0cnVjdCBJQyAqbm9kZSkKK3sKKwlzdHJ1Y3QgcnBhaXIgcnA7CisJaW50IHJlZyA9IG5vZGUtPnExLnJlZzsKKworCWlmIChyZWdfcGFpcihyZWcsICZycCkpIHsKKwkJZ2MtPnJlZ19idXN5W3JwLnIxXSA9IDE7CisJCWdjLT5yZWdfYnVzeVtycC5yMl0gPSAxOworCX0KKwlnYy0+cmVnX2J1c3lbcmVnXSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkCitnY19mdW5jX2ZyZWVyZWcoc3RydWN0IGdjX3N0YXRlICpnYywgc3RydWN0IElDICpub2RlKQoreworCWludCByZWcgPSBub2RlLT5xMS5yZWc7CisJaWYgKHJlZ3NhW3JlZ10pCisJCXJldHVybjsKKworCWlmIChyZWdfcGFpcihyZWcsICZycCkpIHsKKwkJZ2MtPnJlZ19idXN5W3JwLnIxXSA9IDA7CisJCWdjLT5yZWdfYnVzeVtycC5yMl0gPSAwOworCX0KKwlnYy0+cmVnX2J1c3lbcmVnXSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitnY19mdW5jX2NtcF90ZXN0KHN0cnVjdCBnY19zdGF0ZSAqZ2MsIHN0cnVjdCBJQyAqbm9kZSkKK3sKKwlzdHJ1Y3QgcnBhaXIgcnAxLCBycDI7CisJaW50IHJlZzEsIHJlZzI7CisJbG9uZyBrOworCWludCBpc3Rlc3QsIGlzMzJiOworCisJaXN0ZXN0ID0gKG5vZGUtPmNvZGUgPT0gVEVTVCk7CisJaXMzMmIgPSBJU1RMT05HKHExdHlwKG5vZGUpKTsKKworCS8qIENhbiB0aGlzIGJlIG9wdGltaXplZCBvdXQgPyAqLworCWlmIChpc3Rlc3QgJiYgaXNyZWcoJm5vZGUtPnExKSAmJiAobm9kZS0+cTEucmVnID09IGdjLT5jbXBfY3VyX3opKQorCQlyZXR1cm47CisKKwkvKiBMb2FkIG9wZXJhbmRzICovCisJX2djX29wX3ByZShnYywgbm9kZSwgaXN0ZXN0PzE6MiwgTlVMTCwgJnJlZzEsICZyZWcyLCAmayk7CisKKwlpZiAoIWlzcmVnKCZub2RlLT5xMSkgJiYgIWlzY29uc3QoJm5vZGUtPnExKSkKKwkJX2djX2xvYWRfb3AoZ2MsICZub2RlLT5xMSwgcmVnMSwgcTF0eXAobm9kZSkpOworCisJaWYgKCFpc3Rlc3QgJiYgIWlzcmVnKCZub2RlLT5xMikgJiYgIWlzY29uc3QoJm5vZGUtPnEyKSkKKwkJX2djX2xvYWRfb3AoZ2MsICZub2RlLT5xMiwgcmVnMiwgcTJ0eXAobm9kZSkpOworCisJcmVnX3BhaXIocmVnMSwgJnJwMSk7CisJcmVnX3BhaXIocmVnMiwgJnJwMik7CisKKwlpZiAocmVnMiA9PSBSX0kpCisJCXJwMi5yMSA9IHJwMi5yMiA9IFJfSTsKKworCS8qIERvIHRoZSBjb21wYXJlICovCisJaWYgKGlzMzJiKSB7CisJCS8qIDMyYiBjb21wYXJlICovCisJCWlmIChpc3Rlc3QpIHsKKwkJCV9nY19lbWl0X21vdihnYywgUl9BLCBycDEucjIpOworCQkJX2djX2VtaXRfYWx1KGdjLCAib3IiLCBSX0EsIFJfQSwgcnAxLnIxLCAwKTsKKwkJfSBlbHNlIHsKKwkJCV9nY19lbWl0X21vdihnYywgUl9BLCBycDEucjEpOworCQkJX2djX2VtaXRfYWx1KGdjLCAic3ViIiwgUl9BLCBSX0EsIHJwMi5yMSwgayAmIDB4ZmZmZik7CisJCQlfZ2NfZW1pdF9tb3YoZ2MsIFJfQSwgcnAxLnIyKTsKKwkJCV9nY19lbWl0X2FsdShnYywgInN1YmN5IiwgUl9BLCBSX0EsIHJwMi5yMiwgKGsgPj4gMTYpICYgMHhmZmZmKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIDE2YiBjb21wYXJlICovCisJCWlmIChub2RlLT5jb2RlID09IFRFU1QpIHsKKwkJCV9nY19lbWl0X2FsdShnYywgInRlc3QiLCAwLCByZWcxLCBSX0ksIDB4ZmZmZik7CisJCX0gZWxzZSB7CisJCQlfZ2NfZW1pdF9hbHUoZ2MsICJjbXAiLCAwLCByZWcxLCByZWcyLCBrKTsKKwkJfQorCX0KKworCS8qIENsZWFuIHVwICovCisJX2djX29wX3Bvc3QoZ2MsIG5vZGUpOworfQorCitzdGF0aWMgdm9pZAorZ2NfZnVuY19icmFuY2goc3RydWN0IGdjX3N0YXRlICpnYywgc3RydWN0IElDICpub2RlKQoreworCWNvbnN0IGNoYXIgKmNjLCAqZWNjOworCWNoYXIgbGFiZWxbMTZdOworCisJLyogSWYgcTEgZXhpc3RzLCBpdCdzIHRoZSByZXN1bHQgb2YgYW4gbGliX2NhbGwgY29tcGFyZSAqLworCWlmIChub2RlLT5xMS5mbGFncykgeworCQlpbnQgcjsKKwkJaWYgKGlzcmVnKCZub2RlLT5xMSkpIHsKKwkJCXIgPSBub2RlLT5xMS5yZWc7CisJCX0gZWxzZSB7CisJCQlfZ2NfbG9hZF9vcChnYywgJm5vZGUtPnExLCBSX0EsIHExdHlwKG5vZGUpKTsKKwkJCXIgPSBSX0E7CisJCX0KKwkJX2djX2VtaXRfYWx1KGdjLCAiY21wIiwgMCwgciwgLTEsIDApOworCQlnYy0+Y21wX3NpZ25lZCA9IDE7CisJfQorCisJLyogU2VsZWN0IGNvbmRpdGlvbiBjb2RlICovCisJc3dpdGNoIChub2RlLT5jb2RlKSB7CisJCWNhc2UgQlJBOiBlY2MgPSBOVUxMOyBjYyA9ICIiOyBicmVhazsKKwkJY2FzZSBCRVE6IGVjYyA9IE5VTEw7IGNjID0gIi56IjsgYnJlYWs7CisJCWNhc2UgQk5FOiBlY2MgPSBOVUxMOyBjYyA9ICIubnoiOyBicmVhazsKKwkJY2FzZSBCTFQ6IGVjYyA9IGdjLT5jbXBfc2lnbmVkID8gImd0IiA6ICJoaSI7IGNjID0gIi56IjsgYnJlYWs7CisJCWNhc2UgQkdFOiBlY2MgPSBnYy0+Y21wX3NpZ25lZCA/ICJndCIgOiAiaGkiOyBjYyA9ICIubnoiOyBicmVhazsKKwkJY2FzZSBCTEU6IGVjYyA9IGdjLT5jbXBfc2lnbmVkID8gImdlIiA6ICJocyI7IGNjID0gIi56IjsgYnJlYWs7CisJCWNhc2UgQkdUOiBlY2MgPSBnYy0+Y21wX3NpZ25lZCA/ICJnZSIgOiAiaHMiOyBjYyA9ICIubnoiOyBicmVhazsKKwkJZGVmYXVsdDogaWVycm9yKDApOworCX0KKworCWlmIChlY2MpCisJCV9nY19lbWl0KGdjLCAiXHRjY1x0JXNcbiIsIGVjYyk7CisKKwlzbnByaW50ZihsYWJlbCwgc2l6ZW9mKGxhYmVsKS0xLCAiJXMlZCIsIGxhYnByZWZpeCwgbm9kZS0+dHlwZik7CisJX2djX2VtaXQoZ2MsICJcdGltbVx0JGhpKCVzKVxuIiwgbGFiZWwpOworCV9nY19lbWl0KGdjLCAiXHRiYSVzXHQkbG8oJXMpXG4iLCBjYywgbGFiZWwpOworCV9nY19lbWl0X25vcChnYyk7Cit9CisKK3N0YXRpYyB2b2lkCitnY19mdW5jX2xhYmVsKHN0cnVjdCBnY19zdGF0ZSAqZ2MsIHN0cnVjdCBJQyAqbm9kZSkKK3sKKwlfZ2NfZW1pdChnYywgIiVzJWQ6XG4iLCBsYWJwcmVmaXgsIG5vZGUtPnR5cGYpOworfQorCitzdGF0aWMgdm9pZAorZ2NfZnVuY19jYWxsKHN0cnVjdCBnY19zdGF0ZSAqZ2MsIHN0cnVjdCBJQyAqbm9kZSkKK3sKKwlpZiAoKG5vZGUtPnExLmZsYWdzICYgKFZBUiB8IERSRUZPQkopKSA9PSBWQVIgJiYKKwkgICAgIG5vZGUtPnExLnYtPmZpICYmIG5vZGUtPnExLnYtPmZpLT5pbmxpbmVfYXNtKQorCXsKKwkJZW1pdF9pbmxpbmVfYXNtKGdjLT5mLCBub2RlLT5xMS52LT5maS0+aW5saW5lX2FzbSk7CisJfQorCWVsc2UgaWYgKG5vZGUtPnExLmZsYWdzICYgRFJFRk9CSikKKwl7CisJCS8qIEZ1bmN0aW9uIHBvaW50ZXIgKi8KKwkJaWYgKG5vZGUtPnExLmR0eXAgIT0gUFBPSU5URVIpCisJCQlpZXJyb3IoMSk7CisKKwkJaWYgKG5vZGUtPnExLmZsYWdzICYgS09OU1QpIHsKKwkJCS8qIENvbnN0YW50LCBkbyBpbW1lZGlhdGUganVtcCAqLworCQkJbG9uZyBrID0gY29uc3QybG9uZygmbm9kZS0+cTEsIG5vZGUtPnExLmR0eXApOworCQkJayA9IF9nY19lbWl0X2ltbShnYywgayk7CisJCQlfZ2NfZW1pdChnYywgIlx0YmFsXHQkJWRcbiIsIGspOworCQl9IGVsc2UgeworCQkJLyogTG9hZCB2YXJpYWJsZSBpbnRvIEEgKi8KKwkJCWlmIChub2RlLT5xMS5mbGFncyAmIFJFRykKKwkJCQlfZ2NfZW1pdF9tb3YoZ2MsIFJfQSwgbm9kZS0+cTEucmVnKTsKKwkJCWVsc2UKKwkJCQlfZ2NfbG9hZF9mcm9tX21lbShnYywgUl9BLCBwb2ludGVyX3R5cGUobm9kZS0+cTEudi0+dnR5cCksIHptMmwoemwyem0obm9kZS0+cTEudmFsLnZsb25nKSksIDAsIG5vZGUtPnExLnYpOworCisJCQkvKiBEbyB0aGUganVtcCAqLworCQkJX2djX2VtaXRfbW92KGdjLCBSX1gsIFJfQSk7CisJCQlfZ2NfZW1pdChnYywgIlx0YmFseFx0WFxuIik7CisJCX0KKworCQlfZ2NfZW1pdF9ub3AoZ2MpOworCX0KKwllbHNlCisJeworCQljaGFyICpzeW0gPSBzeW1fbmFtZShub2RlLT5xMS52KTsKKworCQlpZiAoIVRJTllfUE1FTSkgX2djX2VtaXQoZ2MsICJcdGltbVx0JChoaSglcykpXG4iLCBzeW0pOworCQlfZ2NfZW1pdChnYywgIlx0YmFsXHQkKGxvKCVzKSlcbiIsIHN5bSk7CisKKwkJX2djX2VtaXRfbm9wKGdjKTsKKwl9CisKKwkvKiBGSVhNRTogZml4dXAgc3RhY2sgcG9pbnRlciBhZnRlciB0aGUgY2FsbCA/IT8gKi8KK30KKworc3RhdGljIHZvaWQKK2djX2Z1bmNfcHVzaChzdHJ1Y3QgZ2Nfc3RhdGUgKmdjLCBzdHJ1Y3QgSUMgKm5vZGUpCit7CisJLyogRklYTUUgKi8KK30KKworc3RhdGljIHZvaWQKK2djX2Z1bmNfZ2V0cmV0dXJuKHN0cnVjdCBnY19zdGF0ZSAqZ2MsIHN0cnVjdCBJQyAqbm9kZSkKK3sKKwlpbnQgZHN0X3JlZzsKKworCS8qIElzIGl0IHJlbGV2YW50IGF0IGFsbCA/ICovCisJaWYgKCFub2RlLT5xMS5yZWcpIHsKKwkJaWVycm9yKDApOworCQlyZXR1cm47CisJfQorCisJLyogSXMgdGhlIHRhcmdldCBhIHJlZ2lzdGVyID8gKi8KKwlpZiAoaXNyZWcoJm5vZGUtPnopKQorCXsKKwkJLyogWWVzLCBuZWVkIG1vdmUgKi8KKwkJX2djX21vdmVfZ3ByKGdjLCBub2RlLT56LnJlZywgbm9kZS0+cTEucmVnKTsKKwl9IGVsc2UgeworCQkvKiBOb3BlLCBub3Qgc3VwcG9ydGVkICovCisJCWllcnJvcigwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitnY19mdW5jX3NldHJldHVybihzdHJ1Y3QgZ2Nfc3RhdGUgKmdjLCBzdHJ1Y3QgSUMgKm5vZGUpCit7CisJaW50IHNyY19yZWc7CisKKwkvKiBJcyBpdCByZWxldmFudCBhdCBhbGwgPyAqLworCWlmICghbm9kZS0+ei5yZWcpIHsKKwkJaWVycm9yKDApOworCQlyZXR1cm47CisJfQorCisJLyogU3BlY2lhbCBjYXNlIGZvciBzbWFsbCBjb25zdGFudHMgKi8KKwlpZiAoKG5vZGUtPnoucmVnID09IFJfQSkgJiYgaXNjb25zdCgmbm9kZS0+cTEpKSB7CisJCWdjLT52YWxfcnYgPSBjb25zdDJsb25nKCZub2RlLT5xMSwgcTF0eXAobm9kZSkpOworCQlyZXR1cm47CisJfQorCisJLyogTG9hZCB2YWx1ZSBpbnRvIHJlZ2lzdGVyICovCisJc3JjX3JlZyA9IG5vZGUtPnoucmVnOworCV9nY19sb2FkX29wKGdjLCAmbm9kZS0+cTEsIHNyY19yZWcsIHExdHlwKG5vZGUpKTsKKworCS8qIElmIHRoZSB0YXJnZXQgaXMgUl9BLCB3ZSBuZWVkIHRvIGRlZmVyICovCisJaWYgKG5vZGUtPnoucmVnID09IFJfQSkgeworCQlpZiAoKHJlZ3NjcmF0Y2hbc3JjX3JlZ10gfHwgcmVnc2Fbc3JjX3JlZ10pICYmIChzcmNfcmVnICE9IFJfQSkpIHsKKwkJCWdjLT5yZWdfcnYgPSBzcmNfcmVnOworCQl9IGVsc2UgeworCQkJX2djX2VtaXRfbW92KGdjLCBSX0EsIHNyY19yZWcpOworCQkJX2djX2VtaXRfbW92KGdjLCBSX1IwLCBSX0EpOworCQkJZ2MtPnJlZ19ydiA9IFJfUjA7CisJCQlnYy0+cmVnX2x3ID0gUl9SMDsKKwkJCUJTRVQocmVnc19tb2RpZmllZCwgUl9SMCk7CisJCX0KKwl9IGVsc2UgeworCQlfZ2NfbW92ZV9ncHIoZ2MsIG5vZGUtPnoucmVnLCBzcmNfcmVnKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitnY19mdW5jX21vdmVmcm9tcmVnKHN0cnVjdCBnY19zdGF0ZSAqZ2MsIHN0cnVjdCBJQyAqbm9kZSkKK3sKKwlfZ2Nfc3RvcmVfb3AoZ2MsICZub2RlLT56LCBub2RlLT5xMS5yZWcsIHp0eXAobm9kZSkpOworfQorCitzdGF0aWMgdm9pZAorZ2NfZnVuY19tb3ZldG9yZWcoc3RydWN0IGdjX3N0YXRlICpnYywgc3RydWN0IElDICpub2RlKQoreworCV9nY19sb2FkX29wKGdjLCAmbm9kZS0+cTEsIG5vZGUtPnoucmVnLCBxMXR5cChub2RlKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnY19mdW5jX2FkZHJlc3Moc3RydWN0IGdjX3N0YXRlICpnYywgc3RydWN0IElDICpub2RlKQoreworCWxvbmcgc3Bfb2Zmc2V0OworCisJLyogcTEgaXMgYWx3YXlzIGFuICdhdXRvJyAoc3RhY2sgb2JqZWN0KSAqLworCWlmICh6dHlwKG5vZGUpICE9IERQT0lOVEVSKQorCQlpZXJyb3IoMSk7CisKKwlpZiAoIWlzYXV0byhub2RlLT5xMS52LT5zdG9yYWdlX2NsYXNzKSkKKwkJaWVycm9yKDApOworCisJLyogQ29tcHV0ZSByZWFsIG9mZnNldCAqLworCXNwX29mZnNldCA9IF9nY19yZWFsX29mZnNldChnYywgbm9kZS0+cTEudiwgem0ybCh6bDJ6bShub2RlLT5xMS52YWwudmxvbmcpKSk7CisKKwlfZ2NfZW1pdF9tb3YoZ2MsIFJfQSwgUl9ZKTsKKwlfZ2NfZW1pdF9hbHUoZ2MsICJhZGQiLCBSX0EsIFJfQSwgUl9JLCBzcF9vZmZzZXQpOworCisJLyogU3RvcmUgaXQgd2hlcmUgd2Ugd2VyZSBhc2tlZCAqLworCV9nY19zdG9yZV9vcChnYywgJm5vZGUtPnosIFJfQSwgenR5cChub2RlKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnY19mdW5jX2ljKHN0cnVjdCBnY19zdGF0ZSAqZ2MsIHN0cnVjdCBJQyAqbm9kZSkKK3sKKwkvKiBJZiBub3AsIGFib3J0IGVhcmx5ICovCisJaWYgKG5vZGUtPmNvZGUgPT0gTk9QKQorCQlyZXR1cm47CisKKwkvKiBVbi1uZWVkZWQgY29udmVydHMgKi8KKwlpZiAobm9kZS0+Y29kZSA9PSBDT05WRVJUICYmICFtdXN0X2NvbnZlcnQobm9kZS0+dHlwZixub2RlLT50eXBmMiwwKSkgeworCQlub2RlLT5jb2RlID0gQVNTSUdOOworCQlub2RlLT5xMi52YWwudm1heCA9IHNpemV0YWJbbm9kZS0+dHlwZiZOUV07CisJfQorCisJLyogRGVidWcgKi8KKyNpZmRlZiBEQkcKKwllbWl0KGdjLT5mLCAiXG5cdDsgJXNcbiIsIGVuYW1lW25vZGUtPmNvZGVdKTsKKyNlbmRpZgorCisJLyogTWFpbiBkaXNwYXRjaCAqLworI2RlZmluZSBHQ19PUChjLG4pIGNhc2UgYzogZ2NfZnVuY18gIyMgbiAoZ2MsIG5vZGUpOyBicmVhazsKKworCXN3aXRjaCAobm9kZS0+Y29kZSkKKwl7CisJR0NfT1AoQVNTSUdOLAkJYXNzaWduKQorCUdDX09QKENPTlZFUlQsCQljb252ZXJ0KQorCUdDX09QKE9SLAkJYWx1XzJvcCkKKwlHQ19PUChYT1IsCQlhbHVfMm9wKQorCUdDX09QKEFORCwJCWFsdV8yb3ApCisJR0NfT1AoQURELAkJYWx1XzJvcCkKKwlHQ19PUChTVUIsCQlhbHVfMm9wKQorCUdDX09QKEtPTVBMRU1FTlQsCW5vdCkKKwlHQ19PUChNSU5VUywJCW5lZykKKwlHQ19PUChMU0hJRlQsCQlzaGlmdCkKKwlHQ19PUChSU0hJRlQsCQlzaGlmdCkKKwlHQ19PUChBTExPQ1JFRywgCWFsbG9jcmVnKQorCUdDX09QKEZSRUVSRUcsCQlmcmVlcmVnKQorCUdDX09QKENPTVBBUkUsCQljbXBfdGVzdCkKKwlHQ19PUChURVNULAkJY21wX3Rlc3QpCisJR0NfT1AoQkVRIC4uLiBCUkEsCWJyYW5jaCkKKwlHQ19PUChMQUJFTCwJCWxhYmVsKQorCUdDX09QKENBTEwsCQljYWxsKQorCUdDX09QKFBVU0gsCQlwdXNoKQorCUdDX09QKEdFVFJFVFVSTiwJZ2V0cmV0dXJuKQorCUdDX09QKFNFVFJFVFVSTiwJc2V0cmV0dXJuKQorCUdDX09QKE1PVkVGUk9NUkVHLAltb3ZlZnJvbXJlZykKKwlHQ19PUChNT1ZFVE9SRUcsCW1vdmV0b3JlZykKKwlHQ19PUChBRERSRVNTLAkJYWRkcmVzcykKKwlHQ19PUChBRERJMlAsCQlhbHVfMm9wKQorCUdDX09QKFNVQklGUCwJCWFsdV8yb3ApCisJR0NfT1AoU1VCUEZQLAkJYWx1XzJvcCkKKworCQkvKiBUaG9zZSBhcmUgYWx3YXlzIGhhbmRsZWQgd2l0aCBsaWJjYWxsICovCisJY2FzZSBNVUxUOgorCWNhc2UgRElWOgorCWNhc2UgTU9EOgorCWRlZmF1bHQ6CisJCWJyZWFrOy8vaWVycm9yKDApOworCX0KKworI3VuZGVmIEdDX09QCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgRW5kIG9mIHByaXZhdGUgZmF0YSBhbmQgZnVuY3Rpb25zLiAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAgRG9lcyBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb25zIGZvciB0aGUgY29kZS1nZW5lcmF0b3IuIEdldHMgY2FsbGVkICAqLworLyogIG9uY2UgYXQgdGhlIGJlZ2lubmluZyBhbmQgc2hvdWxkIHJldHVybiAwIGluIGNhc2Ugb2YgcHJvYmxlbXMuICAgICAgKi8KK2ludCBpbml0X2NnKHZvaWQpCit7CisJaW50IGksIGo7CisKKwkvKiBNYWNyb3MgKi8KKwl0YXJnZXRfbWFjcm9zID0gbWFycmF5OworCisJLyogQWxpZ25lbWVudCAvIHNpemUgZm9yIHR5cGVzICovCisJc3RhY2thbGlnbiA9IGwyem0oMUwpOworCW1heGFsaWduICAgPSBsMnptKDFMKTsKKwljaGFyX2JpdCAgID0gbDJ6bSgxNkwpOworCisJZm9yIChpPTA7IGk8PU1BWF9UWVBFOyBpKyspIHsKKwkJc2l6ZXRhYltpXT1sMnptKG1zaXpldGFiW2ldKTsKKwkJYWxpZ25baV09bDJ6bShtYWxpZ25baV0pOworCX0KKworCS8qIFJlZ2lzdGVycyAqLworCXJlZ25hbWVzWzBdID0gIm5vcmVnIjsKKworCQkvKiBEZWZhdWx0cyAqLworCW1lbXNldChyZWdzY3JhdGNoLCAweDAwLCBzaXplb2YocmVnc2NyYXRjaCkpOworCW1lbXNldChyZWdzYSwgICAgICAweDAwLCBzaXplb2YocmVnc2EpKTsKKwltZW1zZXQocmVnX3ByaW8sICAgMHgwMCwgc2l6ZW9mKHJlZ19wcmlvKSk7CisKKwkJLyogR1BScyByWDogIDEtMTYgKi8KKwlmb3IgKGk9MDsgaTwxNjsgaSsrKQorCXsKKwkJaiA9IFJfUjAgKyBpOworCQlyZWduYW1lc1tqXSA9IG15bWFsbG9jKDMpOworCQlzcHJpbnRmKHJlZ25hbWVzW2pdLCAiciV4IiwgaSk7CisJCXJlZ3NpemVbal0gPSBsMnptKDFMKTsKKwkJcmVndHlwZVtqXSA9ICZpdHlwOworCX0KKworCQkvKiBHUFJzIHNYOiAxNy0zMiAqLworCWZvciAoaT0wOyBpPDE2OyBpKyspCisJeworCQlqID0gUl9TMCArIGk7CisJCXJlZ25hbWVzW2pdID0gbXltYWxsb2MoMyk7CisJCXNwcmludGYocmVnbmFtZXNbal0sICJzJXgiLCBpKTsKKwkJcmVnc2l6ZVtqXSA9IGwyem0oMUwpOworCQlyZWd0eXBlW2pdID0gJml0eXA7CisJfQorCisJCS8qIEdQUnMgcGFpciByWHA6IDMzLTQwICovCisJZm9yIChpPTA7IGk8ODsgaSsrKQorCXsKKwkJaiA9IFJfUjBQICsgaTsKKwkJcmVnbmFtZXNbal0gPSBteW1hbGxvYygzKTsKKwkJc3ByaW50ZihyZWduYW1lc1tqXSwgInIleHAiLCAyKmkpOworCQlyZWdzaXplW2pdID0gbDJ6bSgyTCk7CisJCXJlZ3R5cGVbal0gPSAmbHR5cDsKKwl9CisKKwkJLyogR1BScyBwYWlyIHNYcDogNDEtNDggKi8KKwlmb3IgKGk9MDsgaTw4OyBpKyspCisJeworCQlqID0gUl9TMFAgKyBpOworCQlyZWduYW1lc1tqXSA9IG15bWFsbG9jKDMpOworCQlzcHJpbnRmKHJlZ25hbWVzW2pdLCAicyV4cCIsIDIqaSk7CisJCXJlZ3NpemVbal0gPSBsMnptKDJMKTsKKwkJcmVndHlwZVtqXSA9ICZsdHlwOworCX0KKworCQkvKiBVc2UgdGhlIGZpcnN0IDggcmVnaXN0ZXJzIGFzIHNjcmF0Y2gKKwkJICogcmVnaXN0ZXJzICovCisJZm9yIChpPTA7IGk8ODsgaSsrKSB7CisJCXJlZ3NjcmF0Y2hbUl9SMCArIGldID0gMTsKKwkJcmVnc2NyYXRjaFtSX1MwICsgaV0gPSAxOworCX0KKworCWZvciAoaT0wOyBpPDQ7IGkrKykgeworCQlyZWdzY3JhdGNoW1JfUjBQICsgaV0gPSAxOworCQlyZWdzY3JhdGNoW1JfUzBQICsgaV0gPSAxOworCX0KKworCQkvKiBDb2RlIGdlbiBpbnRlcm5hbGx5IHVzZXMgcmUvcmYgcGFpciAqLworCXJlZ3NhW1JfUkVdID0gcmVnc2FbUl9SRl0gPSByZWdzYVtSX1JFUF0gPSAxOworCisJCS8qIFByaW9yaXR5ICovCisJLyogRklYTUU6IFRPRE8gKi8KKworCQkvKiBTUFJzOiA0OS01MSAqLworCXJlZ25hbWVzW1JfQV0gPSAiQSI7CisJcmVnc2l6ZVtSX0FdICA9IGwyem0oMUwpOworCXJlZ3R5cGVbUl9BXSAgPSAmaXR5cDsKKwlyZWdzYVtSX0FdICAgID0gMTsJCS8qIFNwZWNpYWwsIHVzZWQgYnkgY29kZWdlbiAqLworCisJcmVnbmFtZXNbUl9YXSA9ICJYIjsKKwlyZWdzaXplW1JfWF0gID0gbDJ6bSgxTCk7CisJcmVndHlwZVtSX1hdICA9ICZpdHlwOworCXJlZ3NhW1JfWF0gICAgPSAxOwkJLyogTGluayBSZWdpc3RlciAqLworCisJcmVnbmFtZXNbUl9ZXSA9ICJZIjsKKwlyZWdzaXplW1JfWV0gID0gbDJ6bSgxTCk7CisJcmVndHlwZVtSX1ldICA9ICZpdHlwOworCXJlZ3NhW1JfWV0gICAgPSAxOwkJLyogVXNlZCBhcyBTdGFjayBwb2ludGVyICovCisKKwlyZWduYW1lc1tSX0ldID0gIkkiOworCXJlZ3NpemVbUl9JXSAgPSBsMnptKDFMKTsKKwlyZWd0eXBlW1JfSV0gID0gJml0eXA7CisJcmVnc2FbUl9JXSAgICA9IDE7CQkvKiBWaXJ0dWFsIEltbWVkaWF0ZSByZWdpc3RlciAqLworCisJLyogIEluaXRpYWxpemUgdGhlIG1pbi9tYXgtc2V0dGluZ3MuIE5vdGUgdGhhdCB0aGUgdHlwZXMgb2YgdGhlICAgICAqLworCS8qICBob3N0IHN5c3RlbSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIHRhcmdldCBzeXN0ZW0gYW5kIHlvdSBtYXkgKi8KKwkvKiAgb25seSB1c2UgdGhlIHNtYWxsZXN0IG1heGltdW0gdmFsdWVzIEFOU0kgZ3VhcmFudGVlcyBpZiB5b3UgICAgICovCisJLyogIHdhbnQgdG8gYmUgcG9ydGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qICBUaGF0J3MgdGhlIHJlYXNvbiBmb3IgdGhlIHN1YnRyYWN0aW9uIGluIHRfbWluW0lOVF0uIExvbmcgY291bGQgKi8KKwkvKiAgYmUgdW5hYmxlIHRvIHJlcHJlc2VudCAtMjE0NzQ4MzY0OCBvbiB0aGUgaG9zdCBzeXN0ZW0uICAgICAgICAgICovCisJdF9taW5bQ0hBUl09bDJ6bSgtMzI3NjhMKTsKKwl0X21pbltTSE9SVF09bDJ6bSgtMzI3NjhMKTsKKwl0X21pbltJTlRdPXRfbWluW1NIT1JUXTsKKwl0X21pbltMT05HXT16bXN1YihsMnptKC0yMTQ3NDgzNjQ3TCksbDJ6bSgxTCkpOworCXRfbWluW0xMT05HXT16bWxzaGlmdChsMnptKDFMKSxsMnptKDYzTCkpOworCXRfbWluW01BWElOVF09dF9taW4oTExPTkcpOworCXRfbWF4W0NIQVJdPXVsMnp1bSgzMjc2N1VMKTsKKwl0X21heFtTSE9SVF09dWwyenVtKDMyNzY3VUwpOworCXRfbWF4W0lOVF09dF9tYXhbU0hPUlRdOworCXRfbWF4W0xPTkddPXVsMnp1bSgyMTQ3NDgzNjQ3VUwpOworCXRfbWF4W0xMT05HXT16dW1yc2hpZnQoenVta29tcGwodWwyenVtKDBVTCkpLHVsMnp1bSgxVUwpKTsKKwl0X21heFtNQVhJTlRdPXRfbWF4KExMT05HKTsKKwl0dV9tYXhbQ0hBUl09dWwyenVtKDY1NTM1VUwpOworCXR1X21heFtTSE9SVF09dWwyenVtKDY1NTM1VUwpOworCXR1X21heFtJTlRdPXR1X21heFtTSE9SVF07CisJdHVfbWF4W0xPTkddPXVsMnp1bSg0Mjk0OTY3Mjk1VUwpOworCXR1X21heFtMTE9OR109enVta29tcGwodWwyenVtKDBVTCkpOworCXR1X21heFtNQVhJTlRdPXRfbWF4KFVOU0lHTkVEfExMT05HKTsKKworCS8qIEJ1aWx0LWlucyAqLworI2RlZmluZSBVSU5UCShVTlNJR05FRHxJTlQpCisjZGVmaW5lIFVMT05HCShVTlNJR05FRHxMT05HKQorI2RlZmluZSBVTExPTkcJKFVOU0lHTkVEfExMT05HKQorCisJCS8qIDE2IGJpdCBvcHM6IGxzbC9sc3IgKyBtdWwvZGl2L21vZCBkb25lIGluIGxpYmNhbGwgKi8KKwlkZWNsYXJlX2J1aWx0aW4oIl9fbHNsaW50MTYiLCAgSU5ULCAgSU5ULCAgUl9SMCwgSU5ULCAgUl9SMSwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX2xzcmludDE2IiwgIElOVCwgIElOVCwgIFJfUjAsIElOVCwgIFJfUjEsIDEsIDApOworCWRlY2xhcmVfYnVpbHRpbigiX19sc3J1aW50MTYiLCBVSU5ULCBVSU5ULCBSX1IwLCBJTlQsICBSX1IxLCAxLCAwKTsKKworCWRlY2xhcmVfYnVpbHRpbigiX19tdWxpbnQxNiIsICBJTlQsICBJTlQsICBSX1IwLCBJTlQsICBSX1IxLCAxLCAwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fZGl2aW50MTYiLCAgSU5ULCAgSU5ULCAgUl9SMCwgSU5ULCAgUl9SMSwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX2RpdnVpbnQxNiIsIFVJTlQsIFVJTlQsIFJfUjAsIFVJTlQsIFJfUjEsIDEsIDApOworCWRlY2xhcmVfYnVpbHRpbigiX19tb2RpbnQxNiIsICBJTlQsICBJTlQsICBSX1IwLCBJTlQsICBSX1IxLCAxLCAwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fbW9kdWludDE2IiwgVUlOVCwgVUlOVCwgUl9SMCwgVUlOVCwgUl9SMSwgMSwgMCk7CisKKwkJLyogMzIgYml0IG9wczogbHNsL2xzciArIG11bC9kaXYvbW9kIGRvbmUgaW4gbGliY2FsbCAqLworCWRlY2xhcmVfYnVpbHRpbigiX19sc2xpbnQzMiIsICBMT05HLCAgTE9ORywgIFJfUjBQLCBJTlQsICAgUl9SMiwgIDEsIDApOworCWRlY2xhcmVfYnVpbHRpbigiX19sc3JpbnQzMiIsICBMT05HLCAgTE9ORywgIFJfUjBQLCBJTlQsICAgUl9SMiwgIDEsIDApOworCWRlY2xhcmVfYnVpbHRpbigiX19sc3J1aW50MzIiLCBVTE9ORywgVUxPTkcsIFJfUjBQLCBJTlQsICAgUl9SMiwgIDEsIDApOworCisJZGVjbGFyZV9idWlsdGluKCJfX211bGludDMyIiwgIExPTkcsICBMT05HLCAgUl9SMFAsIExPTkcsICBSX1IyUCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX2RpdmludDMyIiwgIExPTkcsICBMT05HLCAgUl9SMFAsIExPTkcsICBSX1IyUCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX2RpdnVpbnQzMiIsIFVMT05HLCBVTE9ORywgUl9SMFAsIFVMT05HLCBSX1IyUCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX21vZGludDMyIiwgIExPTkcsICBMT05HLCAgUl9SMFAsIExPTkcsICBSX1IyUCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX21vZHVpbnQzMiIsIFVMT05HLCBVTE9ORywgUl9SMFAsIFVMT05HLCBSX1IyUCwgMSwgMCk7CisKKwkJLyogNjQgYml0cyBvcHM6IGV2ZXJ5dGhpbmcgZG9uZSBpbiBsaWJjYWxsICovCisJZGVjbGFyZV9idWlsdGluKCJfX29yaW50NjQiLCAgIExMT05HLCAgTExPTkcsIDAsICBMTE9ORywgIDAsIDEsIDApOworCWRlY2xhcmVfYnVpbHRpbigiX19lb3JpbnQ2NCIsICBMTE9ORywgIExMT05HLCAwLCAgTExPTkcsICAwLCAxLCAwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fYW5kaW50NjQiLCAgTExPTkcsICBMTE9ORywgMCwgIExMT05HLCAgMCwgMSwgMCk7CisKKwlkZWNsYXJlX2J1aWx0aW4oIl9fbHNsaW50NjQiLCAgTExPTkcsICBMTE9ORywgIDAsIElOVCwgICAgMCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX2xzcmludDY0IiwgIExMT05HLCAgTExPTkcsICAwLCBJTlQsICAgIDAsIDEsIDApOworCWRlY2xhcmVfYnVpbHRpbigiX19sc3J1aW50NjQiLCBVTExPTkcsIFVMTE9ORywgMCwgSU5ULCAgICAwLCAxLCAwKTsKKworCWRlY2xhcmVfYnVpbHRpbigiX19hZGRpbnQ2NCIsICBMTE9ORywgIExMT05HLCAwLCAgTExPTkcsICAwLCAxLCAwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fc3ViaW50NjQiLCAgTExPTkcsICBMTE9ORywgMCwgIExMT05HLCAgMCwgMSwgMCk7CisKKwlkZWNsYXJlX2J1aWx0aW4oIl9fbXVsaW50NjQiLCAgTExPTkcsICBMTE9ORywgIDAsIExMT05HLCAgMCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX2RpdmludDY0IiwgIExMT05HLCAgTExPTkcsICAwLCBMTE9ORywgIDAsIDEsIDApOworCWRlY2xhcmVfYnVpbHRpbigiX19kaXZ1aW50NjQiLCBVTExPTkcsIFVMTE9ORywgMCwgVUxMT05HLCAwLCAxLCAwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fbW9kaW50NjQiLCAgTExPTkcsICBMTE9ORywgIDAsIExMT05HLCAgMCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX21vZHVpbnQ2NCIsIFVMTE9ORywgVUxMT05HLCAwLCBVTExPTkcsIDAsIDEsIDApOworCisJZGVjbGFyZV9idWlsdGluKCJfX25lZ2ludDY0IiwgIExMT05HLCAgTExPTkcsICAwLCAwLCAgICAgIDAsIDEsIDApOworCWRlY2xhcmVfYnVpbHRpbigiX19ub3RpbnQ2NCIsICBMTE9ORywgIExMT05HLCAgMCwgMCwgICAgICAwLCAxLCAwKTsKKworCWRlY2xhcmVfYnVpbHRpbigiX19jbXBpbnQ2NCIsICBJTlQsICAgIExMT05HLCAgMCwgTExPTkcsICAwLCAxLCAwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fY21wdWludDY0IiwgSU5ULCAgICBVTExPTkcsIDAsIFVMTE9ORywgMCwgMSwgMCk7CisKKwkJLyogNjQgYml0cyBjb252ZXJzaW9ucyAqLworCWRlY2xhcmVfYnVpbHRpbigiX191aW50NjR0b3VpbnQxNiIsIFVMTE9ORywgIFVJTlQsIFJfUjAsICAwLCAwLCAxLCAwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fdWludDY0dG9zaW50MTYiLCBVTExPTkcsICAgSU5ULCBSX1IwLCAgMCwgMCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX3VpbnQ2NHRvdWludDMyIiwgVUxMT05HLCBVTE9ORywgUl9SMFAsIDAsIDAsIDEsIDApOworCWRlY2xhcmVfYnVpbHRpbigiX191aW50NjR0b3NpbnQzMiIsIFVMTE9ORywgIExPTkcsIFJfUjBQLCAwLCAwLCAxLCAwKTsKKworCWRlY2xhcmVfYnVpbHRpbigiX19zaW50NjR0b3VpbnQxNiIsICBMTE9ORywgIFVJTlQsIFJfUjAsICAwLCAwLCAxLCAwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDY0dG9zaW50MTYiLCAgTExPTkcsICAgSU5ULCBSX1IwLCAgMCwgMCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX3NpbnQ2NHRvdWludDMyIiwgIExMT05HLCBVTE9ORywgUl9SMFAsIDAsIDAsIDEsIDApOworCWRlY2xhcmVfYnVpbHRpbigiX19zaW50NjR0b3NpbnQzMiIsICBMTE9ORywgIExPTkcsIFJfUjBQLCAwLCAwLCAxLCAwKTsKKworCWRlY2xhcmVfYnVpbHRpbigiX191aW50MTZ0b3VpbnQ2NCIsICBVSU5ULCBVTExPTkcsIDAsIDAsIDAsIDEsIDApOworCWRlY2xhcmVfYnVpbHRpbigiX19zaW50MTZ0b3VpbnQ2NCIsICAgSU5ULCBVTExPTkcsIDAsIDAsIDAsIDEsIDApOworCWRlY2xhcmVfYnVpbHRpbigiX191aW50MzJ0b3VpbnQ2NCIsIFVMT05HLCBVTExPTkcsIDAsIDAsIDAsIDEsIDApOworCWRlY2xhcmVfYnVpbHRpbigiX19zaW50MzJ0b3VpbnQ2NCIsICBMT05HLCBVTExPTkcsIDAsIDAsIDAsIDEsIDApOworCisJZGVjbGFyZV9idWlsdGluKCJfX3VpbnQxNnRvc2ludDY0IiwgIFVJTlQsICBMTE9ORywgMCwgMCwgMCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX3NpbnQxNnRvc2ludDY0IiwgICBJTlQsICBMTE9ORywgMCwgMCwgMCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX3VpbnQzMnRvc2ludDY0IiwgVUxPTkcsICBMTE9ORywgMCwgMCwgMCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX3NpbnQzMnRvc2ludDY0IiwgIExPTkcsICBMTE9ORywgMCwgMCwgMCwgMSwgMCk7CisKKwkJLyogRmxvYXQgLyBJbnQgY29udmVyc2lvbnMgKi8KKwkJCS8qIGludDE2ICovCisJZGVjbGFyZV9idWlsdGluKCJfX3NpbnQxNnRvZmx0MzIiLCBGTE9BVCwgIElOVCwgIFJfUjAsICAwLCAwLCAxLCAwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fdWludDE2dG9mbHQzMiIsIEZMT0FULCAgVUlOVCwgUl9SMCwgIDAsIDAsIDEsIDApOworCWRlY2xhcmVfYnVpbHRpbigiX19zaW50MTZ0b2ZsdDY0IiwgRE9VQkxFLCBJTlQsICBSX1IwLCAgMCwgMCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX3VpbnQxNnRvZmx0NjQiLCBET1VCTEUsIFVJTlQsIFJfUjAsICAwLCAwLCAxLCAwKTsKKworCWRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvc2ludDE2IiwgSU5ULCAgRkxPQVQsICBSX1IwUCwgMCwgMCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX2ZsdDMydG91aW50MTYiLCBVSU5ULCBGTE9BVCwgIFJfUjBQLCAwLCAwLCAxLCAwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b3NpbnQxNiIsIElOVCwgIERPVUJMRSwgMCwgICAgIDAsIDAsIDEsIDApOworCWRlY2xhcmVfYnVpbHRpbigiX19mbHQ2NHRvdWludDE2IiwgVUlOVCwgRE9VQkxFLCAwLCAgICAgMCwgMCwgMSwgMCk7CisKKwkJCS8qIGludDMyICovCisJZGVjbGFyZV9idWlsdGluKCJfX3NpbnQzMnRvZmx0MzIiLCBGTE9BVCwgIExPTkcsICBSX1IwUCwgMCwgMCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX3VpbnQzMnRvZmx0MzIiLCBGTE9BVCwgIFVMT05HLCBSX1IwUCwgMCwgMCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX3NpbnQzMnRvZmx0NjQiLCBET1VCTEUsIExPTkcsICBSX1IwUCwgMCwgMCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX3VpbnQzMnRvZmx0NjQiLCBET1VCTEUsIFVMT05HLCBSX1IwUCwgMCwgMCwgMSwgMCk7CisKKwlkZWNsYXJlX2J1aWx0aW4oIl9fZmx0MzJ0b3NpbnQzMiIsIExPTkcsICBGTE9BVCwgIFJfUjBQLCAwLCAwLCAxLCAwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fZmx0MzJ0b3VpbnQzMiIsIFVMT05HLCBGTE9BVCwgIFJfUjBQLCAwLCAwLCAxLCAwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b3NpbnQzMiIsIExPTkcsICBET1VCTEUsIDAsICAgICAwLCAwLCAxLCAwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b3VpbnQzMiIsIFVMT05HLCBET1VCTEUsIDAsICAgICAwLCAwLCAxLCAwKTsKKworCQkJLyogaW50NjQgKi8KKwlkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDY0dG9mbHQzMiIsIEZMT0FULCAgTExPTkcsICAwLCAwLCAwLCAxLCAwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fdWludDY0dG9mbHQzMiIsIEZMT0FULCAgVUxMT05HLCAwLCAwLCAwLCAxLCAwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDY0dG9mbHQ2NCIsIERPVUJMRSwgTExPTkcsICAwLCAwLCAwLCAxLCAwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fdWludDY0dG9mbHQ2NCIsIERPVUJMRSwgVUxMT05HLCAwLCAwLCAwLCAxLCAwKTsKKworCWRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvc2ludDY0IiwgTExPTkcsICBGTE9BVCwgIDAsIDAsIDAsIDEsIDApOworCWRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvdWludDY0IiwgVUxMT05HLCBGTE9BVCwgIDAsIDAsIDAsIDEsIDApOworCWRlY2xhcmVfYnVpbHRpbigiX19mbHQ2NHRvc2ludDY0IiwgTExPTkcsICBET1VCTEUsIDAsIDAsIDAsIDEsIDApOworCWRlY2xhcmVfYnVpbHRpbigiX19mbHQ2NHRvdWludDY0IiwgVUxMT05HLCBET1VCTEUsIDAsIDAsIDAsIDEsIDApOworCisJCS8qIEludGVyLUZsb2F0IGNvbnZlcnNpb25zICovCisJZGVjbGFyZV9idWlsdGluKCJfX2ZsdDMydG9mbHQ2NCIsIERPVUJMRSwgRkxPQVQsICAwLCAwLCAwLCAxLCAwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b2ZsdDMyIiwgRkxPQVQsICBET1VCTEUsIDAsIDAsIDAsIDEsIDApOworCisJCS8qIEZsb2F0aW5nIHBvaW50IG1hdGggKi8KKwkJCS8qIGZsb2F0ICovCisJZGVjbGFyZV9idWlsdGluKCJfX2FkZGZsdDMyIiwgRkxPQVQsIEZMT0FULCBSX1IwUCwgRkxPQVQsIFJfUjJQLCAxLCAwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fc3ViZmx0MzIiLCBGTE9BVCwgRkxPQVQsIFJfUjBQLCBGTE9BVCwgUl9SMlAsIDEsIDApOworCWRlY2xhcmVfYnVpbHRpbigiX19tdWxmbHQzMiIsIEZMT0FULCBGTE9BVCwgUl9SMFAsIEZMT0FULCBSX1IyUCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX2RpdmZsdDMyIiwgRkxPQVQsIEZMT0FULCBSX1IwUCwgRkxPQVQsIFJfUjJQLCAxLCAwKTsKKwlkZWNsYXJlX2J1aWx0aW4oIl9fbmVnZmx0MzIiLCBGTE9BVCwgRkxPQVQsIFJfUjBQLCBGTE9BVCwgUl9SMlAsIDEsIDApOworCisJZGVjbGFyZV9idWlsdGluKCJfX2NtcGZsdDMyIiwgSU5ULCAgIEZMT0FULCBSX1IwUCwgRkxPQVQsIFJfUjJQLCAxLCAwKTsKKworCQkJLyogZG91YmxlICovCisJZGVjbGFyZV9idWlsdGluKCJfX2FkZGZsdDY0IiwgRE9VQkxFLCBET1VCTEUsIDAsIERPVUJMRSwgMCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX3N1YmZsdDY0IiwgRE9VQkxFLCBET1VCTEUsIDAsIERPVUJMRSwgMCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX211bGZsdDY0IiwgRE9VQkxFLCBET1VCTEUsIDAsIERPVUJMRSwgMCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX2RpdmZsdDY0IiwgRE9VQkxFLCBET1VCTEUsIDAsIERPVUJMRSwgMCwgMSwgMCk7CisJZGVjbGFyZV9idWlsdGluKCJfX25lZ2ZsdDY0IiwgRE9VQkxFLCBET1VCTEUsIDAsIERPVUJMRSwgMCwgMSwgMCk7CisKKwlkZWNsYXJlX2J1aWx0aW4oIl9fY21wZmx0NjQiLCBJTlQsICAgIERPVUJMRSwgMCwgRE9VQkxFLCAwLCAxLCAwKTsKKworI3VuZGVmIFVJTlQKKyN1bmRlZiBVTE9ORworI3VuZGVmIFVMTE9ORworCisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgY2xlYW51cF9jZyhGSUxFICpmKQoreworCS8qIE5vdGhpbmcgdG8gZG8gKi8KK30KKworLyogIFJldHVybnMgdGhlIHJlZ2lzdGVyIGluIHdoaWNoIHZhcmlhYmxlcyBvZiB0eXBlIHQgYXJlIHJldHVybmVkLiAqLworLyogIElmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgcmV0dXJuZWQgaW4gYSByZWdpc3RlciByZXR1cm5zIDAuICAgICAgICAqLworaW50IGZyZXR1cm4oc3RydWN0IFR5cCAqdCkKK3sKKwlpbnQgZiA9IHQtPmZsYWdzICYgTlE7CisKKwkvKiBBbnkgc2NhbGFyIHRoYXQgZml0cyBpbiAxNiBiaXRzIHVzZXMgQSBhcyByZXR1cm4gcmVnaXN0ZXIgKi8KKwlpZiAoSVNTQ0FMQVIoZikgJiYgKG1zaXpldGFiW2ZdID09IDEpKQorCQlyZXR1cm4gUl9BOworCisJLyogQW55IHNjYWxhciB0aGF0IGZpdHMgaW4gMzIgYml0cyB1c2VkIFIwL1IxIGFzIHJldHVybiByZWdpc3RlciAqLworCWlmIChJU1NDQUxBUihmKSAmJiAobXNpemV0YWJbZl0gPT0gMikpCisJCXJldHVybiBSX1IwUDsKK30KKworLyogIFJldHVybnMgMCBpZiByZWdpc3RlciByIGNhbm5vdCBzdG9yZSB2YXJpYWJsZXMgb2YgICAqLworLyogIHR5cGUgdC4gSWYgdD09UE9JTlRFUiBhbmQgbW9kZSE9MCB0aGVuIGl0IHJldHVybnMgICAqLworLyogIG5vbi16ZXJvIG9ubHkgaWYgdGhlIHJlZ2lzdGVyIGNhbiBzdG9yZSBhIHBvaW50ZXIgICAqLworLyogIGFuZCBkZXJlZmVyZW5jZSBhIHBvaW50ZXIgdG8gbW9kZS4gICAgICAgICAgICAgICAgICAqLworaW50IHJlZ29rKGludCByLCBpbnQgdCwgaW50IG1vZGUpCit7CisJaWYgKHIgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoSVNUU0hPUlQodCkpIHsKKwkJaWYgKHIgPj0gUl9SMCAmJiByIDw9IFJfUkYpCisJCQlyZXR1cm4gMTsKKwkJaWYgKHIgPj0gUl9TMCAmJiByIDw9IFJfU0YpCisJCQlyZXR1cm4gMTsKKwkJaWYgKHIgPT0gUl9BIHx8IHIgPT0gUl9YIHx8IHIgPT0gUl9ZKQorCQkJcmV0dXJuIDE7CisJfQorCisJaWYgKElTVExPTkcodCkpIHsKKwkJaWYgKHIgPj0gUl9SMFAgJiYgciA8PSBSX1JFUCkKKwkJCXJldHVybiAxOworCQlpZiAociA+PSBSX1MwUCAmJiByIDw9IFJfU0VQKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBkYW5nZXJvdXNfSUMoc3RydWN0IElDICpwKQoreworCS8qIE9ubHkgbWVtb3J5IGFjY2Vzc2VzIGFyZSAnZGFuZ2Vyb3VzJyAqLworCWludCBjPXAtPmNvZGU7CisJaWYoKHAtPnExLmZsYWdzJkRSRUZPQkopfHwocC0+cTIuZmxhZ3MmRFJFRk9CSil8fChwLT56LmZsYWdzJkRSRUZPQkopKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyogIFJldHVybnMgemVybyBpZiBjb2RlIGZvciBjb252ZXJ0aW5nIG5wIHRvIHR5cGUgdCAgICAqLworLyogIGNhbiBiZSBvbWl0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworaW50IG11c3RfY29udmVydChpbnQgbyxpbnQgdCwgaW50IGNvbnN0X2V4cHIpCit7CisJaW50IG9wPW8mTlEsdHA9dCZOUTsKKworCWlmIChvcD09dHApIHJldHVybiAwOworCisJaWYgKElTUE9JTlRFUihvcCkgJiYgSVNQT0lOVEVSKHRwKSkKKwkJcmV0dXJuIDE7IC8qIE5vIGNvbnZlcnNpb24gYWN0dWFsbHkgcG9zc2libGUgYmV0d2VlbiBwb2ludGVyIHR5cGVzICEgKi8KKworCWlmIChJU1RTSE9SVChvcCkgJiYgSVNUU0hPUlQodHApKQorCQlyZXR1cm4gMDsgLyogQWxsICdzaG9ydCcgdHlwZXMgYXJlIGNvbXBhdGlibGUgKi8KKworCXJldHVybiAxOworfQorCitpbnQgc2hvcnRjdXQoaW50IGNvZGUsIGludCB0KQoreworCXQgJj0gTlE7CisJaWYgKHQgPT0gQ0hBUiB8fCB0ID09IFNIT1JUIHx8IHQgPT0gSU5UKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBnZW5fY29kZShGSUxFICpmLCBzdHJ1Y3QgSUMgKnAsIHN0cnVjdCBWYXIgKnYsIHptYXggb2Zmc2V0KQoreworCXN0cnVjdCBnY19zdGF0ZSBnYzsKKwlzdHJ1Y3QgSUMgKm5vZGU7CisKKwlnY19mdW5jX2JlZ2luKCZnYywgZiwgcCwgdiwgb2Zmc2V0KTsKKwlmb3IgKG5vZGU9cDsgbm9kZTsgbm9kZT1ub2RlLT5uZXh0KQorCQlnY19mdW5jX2ljKCZnYywgbm9kZSk7CisJZ2NfZnVuY19lbmQoJmdjLCBmLCBwLCB2LCBvZmZzZXQpOworfQorCit2b2lkIGdlbl9kcyhGSUxFICpmLCB6bWF4IHNpemUsIHN0cnVjdCBUeXAgKnQpCit7CisJbG9uZyBzID0gem0ybChzaXplKTsKKwllbWl0KGYsICJcdC5zcGFjZSAlbGRcbiIsIHMpOworfQorCit2b2lkIGdlbl9hbGlnbihGSUxFICpmLCB6bWF4IGFsaWduKQoreworCWxvbmcgYSA9IHptMmwoYWxpZ24pOworCisJaWYgKGEgPiAxKQorCQllbWl0KGYsICJcdC5hbGlnbiAlbGRcbiIsIGEpOworfQorCit2b2lkIGdlbl92YXJfaGVhZChGSUxFICpmLCBzdHJ1Y3QgVmFyICp2KQoreworCWNvbnN0IGNoYXIqc2VjdGlvbl9uYW1lc1tdID0geyAvKiBiaXQgMjogcG1lbSwgYml0IDE6IGluaXQsIGJpdCAwOiBjb25zdCAqLworCQkiYnNzIiwgTlVMTCwgImRhdGEiLCAicm9kYXRhIiwKKwkJInBtZW1fYnNzIiwgTlVMTCwgInBtZW1fZGF0YSIsICJwbWVtX3JvZGF0YSIsCisJfTsKKwlpbnQgc2VjdGlvbl90eXBlOworCXN0cnVjdCBUeXAgKnR2OworCWNoYXIgKmF0dHI7CisKKwl0diA9IHYtPnZ0eXA7CisJd2hpbGUgKHR2LT5mbGFncz09QVJSQVkpCisJCXR2ID0gdHYtPm5leHQ7CisJYXR0ciA9IHR2LT5hdHRyOworCisJaWYgKGlzc3RhdGljKHYtPnN0b3JhZ2VfY2xhc3MpIHx8IGlzZXh0ZXJuKHYtPnN0b3JhZ2VfY2xhc3MpKQorCXsKKwkJLyogU2VsZWN0IHNlY3Rpb24gKi8KKwkJc2VjdGlvbl90eXBlICA9IChhdHRyICYmIHN0cnN0cihhdHRyLCBTVFJfUE1FTSkpID8gNCA6IDA7CisJCXNlY3Rpb25fdHlwZSB8PSB2LT5jbGlzdCA/IDIgOiAwOworCQlzZWN0aW9uX3R5cGUgfD0gKHYtPmNsaXN0ICYmIGlzX2NvbnN0KHYtPnZ0eXApKSA/IDEgOiAwOworCisJCWVtaXQoZiwgIlx0LnNlY3Rpb24gJXNcbiIsIHNlY3Rpb25fbmFtZXNbc2VjdGlvbl90eXBlXSk7CisKKwkJLyogU3ltYm9sIG5hbWUgKi8KKwkJaWYgKGlzc3RhdGljKHYtPnN0b3JhZ2VfY2xhc3MpKQorCQkJZW1pdChmLCAiJXMlbGQ6XG4iLCBsYWJwcmVmaXgsIHptMmwodi0+b2Zmc2V0KSk7CisJCWVsc2UKKwkJCWVtaXQoZiwgIiVzJXM6XG4iLCBpZHByZWZpeCwgdi0+aWRlbnRpZmllcik7CisKKwkJLyogRklYTUU6IGV4cG9ydCBnbG9iYWwgc3ltYm9scyAqLworCX0KKwllbHNlCisJeworCQlpZXJyb3IoMCk7CisJfQorfQorCit2b2lkIGdlbl9kYyhGSUxFICpmLCBpbnQgdCwgc3RydWN0IGNvbnN0X2xpc3QgKnApCit7CisJY29uc3QgY2hhciAqZGN0W10gPSB7ICIiLCAiYnl0ZSIsICJzaG9ydCIsICAic2hvcnQiLCAibG9uZyIsICJsb25nIiwgImxvbmciLCAibG9uZyIgfTsKKwlpbnQgdGI7CisKKwlpZiAoSVNQT0lOVEVSKHQpKQorCQl0ID0gVU5TSUdORUR8U0hPUlQ7CisJdGIgPSB0ICYgTlE7CisKKwlpZiAodGIgPiBMRE9VQkxFKQorCQlpZXJyb3IoMCk7CisKKwllbWl0KGYsICJcdC4lc1x0IiwgZGN0W3QmTlFdKTsKKworCWlmICghcC0+dHJlZSkKKwl7CisJCWlmIChJU0ZMT0FUKHRiKSkgeworCQkJdW5zaWduZWQgY2hhciAqaXA7CisJCQllbWl0KGYsIjB4JTAyeCUwMnglMDJ4JTAyeCIsaXBbMF0saXBbMV0saXBbMl0saXBbM10pOworCQkJaWYodGIgIT0gRkxPQVQpeworCQkJCWVtaXQoZiwiLDB4JTAyeCUwMnglMDJ4JTAyeCIsaXBbNF0saXBbNV0saXBbNl0saXBbN10pOworCQkJfQorCQl9IGVsc2UgaWYgKHRiID09IExMT05HKSB7CisJCQkvKiBJbml0ICovCisJCQl6dW1heCB0bXA7CisJCQlldmFsX2NvbnN0KCZwLT52YWwsdCk7CisJCQl0bXAgPSB2dW1heDsKKworCQkJLyogTG93ZXIgMzJiICovCisJCQl2dW1heCA9IHp1bWFuZCh0bXAsdWwyenVtKDB4ZmZmZmZmZmYpKTsKKwkJCWd2YWwudnVsb25nID0genVtMnp1bCh2dW1heCk7CisJCQllbWl0dmFsKGYsICZndmFsLCBVTlNJR05FRHxMT05HKTsKKworCQkJZW1pdChmLCAiLCIpOworCisJCQkvKiBVcHBlciAzMmIgKi8KKwkJCXZ1bWF4ID0genVtYW5kKHp1bXJzaGlmdCh2dW1heCx1bDJ6dW0oMzJVTCkpLHVsMnp1bSgweGZmZmZmZmZmKSk7CisJCQlndmFsLnZ1bG9uZyA9IHp1bTJ6dWwodnVtYXgpOworCQkJZW1pdHZhbChmLCAmZ3ZhbCwgVU5TSUdORUR8TE9ORyk7CisJCX0gZWxzZSB7CisJCQllbWl0dmFsKGYsICZwLT52YWwsICh0Jk5VKXxVTlNJR05FRCk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYgKChwLT50cmVlLT5vLmZsYWdzICYgKFZBUiB8IFZBUkFEUikpID09IChWQVIgfCBWQVJBRFIpKSB7CisJCQllbWl0KGYsICIlcyIsIHN5bV9uYW1lKHAtPnRyZWUtPm8udikpOworCQl9IGVsc2UgeworCQkJLyogTm90IHN1cHBvcnRlZCAuLi4gbm8gaWRlYSB3aGF0IHRvIGRvIGhlcmUgKi8KKwkJCWllcnJvcigwKTsKKwkJfQorCX0KKworCWVtaXQoZiwiXG4iKTsKK30KKwordm9pZCBpbml0X2RiKEZJTEUgKmYpCit7CisJLyogbm90IHN1cHBvcnRlZCAqLworfQorCit2b2lkIGNsZWFudXBfZGIoRklMRSAqZikKK3sKKwkvKiBub3Qgc3VwcG9ydGVkICovCit9CisKKy8qIFJldHVybiBuYW1lIG9mIGxpYnJhcnkgZnVuY3Rpb24sIGlmIHRoaXMgbm9kZSBzaG91bGQgYmUKKyAgIGltcGxlbWVudGVkIHZpYSBsaWJjYWxsLiAqLworY2hhciAqdXNlX2xpYmNhbGwoaW50IGMsaW50IHQsaW50IHQyKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpuYW1lc1tdID0geyAibmEiLCAiaW50MTYiLCAiaW50MTYiLCAiaW50MTYiLCAiaW50MzIiLCAiaW50NjQiLCAiZmx0MzIiLCAiZmx0NjQiIH07CisJc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJCWludCBjb2RlOworCQlpbnQgdXNlX3NpZ247CisJCWludCB0eXBlczsKKwl9IGxpYl9vcHNbXSA9IHsKKyNkZWZpbmUgVEIoeCkgKDEgPDwgKHgpKQorCQl7IE9SLCAgICAgIDAsIFRCKExMT05HKSB9LAorCQl7IFhPUiwgICAgIDAsIFRCKExMT05HKSB9LAorCQl7IEFORCwgICAgIDAsIFRCKExMT05HKSB9LAorCQl7IExTSElGVCwgIDAsIFRCKERPVUJMRSkgfCBUQihGTE9BVCkgfCBUQihMTE9ORykgfCBUQihMT05HKSB8IFRCKElOVCkgfCBUQihTSE9SVCkgfCBUQihDSEFSKSB9LAorCQl7IFJTSElGVCwgIDEsIFRCKERPVUJMRSkgfCBUQihGTE9BVCkgfCBUQihMTE9ORykgfCBUQihMT05HKSB8IFRCKElOVCkgfCBUQihTSE9SVCkgfCBUQihDSEFSKSB9LAorCQl7IEFERCwgICAgIDAsIFRCKERPVUJMRSkgfCBUQihGTE9BVCkgfCBUQihMTE9ORykgfSwKKwkJeyBTVUIsICAgICAwLCBUQihET1VCTEUpIHwgVEIoRkxPQVQpIHwgVEIoTExPTkcpIH0sCisJCXsgTVVMVCwgICAgMCwgVEIoRE9VQkxFKSB8IFRCKEZMT0FUKSB8IFRCKExMT05HKSB8IFRCKExPTkcpIHwgVEIoSU5UKSB8IFRCKFNIT1JUKSB8IFRCKENIQVIpIH0sCisJCXsgRElWLCAgICAgMSwgVEIoRE9VQkxFKSB8IFRCKEZMT0FUKSB8IFRCKExMT05HKSB8IFRCKExPTkcpIHwgVEIoSU5UKSB8IFRCKFNIT1JUKSB8IFRCKENIQVIpIH0sCisJCXsgTU9ELCAgICAgMSwgVEIoRE9VQkxFKSB8IFRCKEZMT0FUKSB8IFRCKExMT05HKSB8IFRCKExPTkcpIHwgVEIoSU5UKSB8IFRCKFNIT1JUKSB8IFRCKENIQVIpIH0sCisJCXsgQ09NUEFSRSwgMSwgVEIoRE9VQkxFKSB8IFRCKEZMT0FUKSB8IFRCKExMT05HKSB9LAorCQl7IC0xIH0KKwl9OworI3VuZGVmIFRCCisJc3RhdGljIGNoYXIgZm5hbWVbMjBdOworCWNvbnN0IGNoYXIgKm4sICpuMiwgKnMsICpzMjsKKwlpbnQgaTsKKworCS8qIFdlIGRvbid0IHJlYWxseSBzdXBwb3J0IGxvbmcgZG91YmxlcyAqLworCWlmICh0PT1MRE9VQkxFKSAgdD1ET1VCTEU7CisJaWYgKHQyPT1MRE9VQkxFKSB0Mj1ET1VCTEU7CisKKwkvKiBTYWZldHkgKi8KKwlpZiAoKCh0Jk5RKSA8IENIQVIpIHx8ICgodCZOUSkgPiBET1VCTEUpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKHQyJk5RKSA+IERPVUJMRSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBHZXQgbmFtZSBzdHJpbmcgZm9yIHQvdDIgYW5kIHNpZ24gY2hhciAqLworCW4gID0gbmFtZXNbdCAgJiBOUV07IHMgID0gSVNGTE9BVCh0KSAgPyAiIiA6ICgodCAgJiBVTlNJR05FRCkgPyAidSIgOiAicyIpOworCW4yID0gbmFtZXNbdDIgJiBOUV07IHMyID0gSVNGTE9BVCh0MikgPyAiIiA6ICgodDIgJiBVTlNJR05FRCkgPyAidSIgOiAicyIpOworCisJLyogQ29udmVyc2lvbnMgKi8KKwlpZiAoYyA9PSBDT05WRVJUKQorCXsKKwkJLyogQnVpbGQgbmFtZSAqLworCQlzbnByaW50ZihmbmFtZSwgc2l6ZW9mKGZuYW1lKS0xLCAiX18lcyVzdG8lcyVzIiwgcywgbiwgczIsIG4yKTsKKworCQkvKiBBbGwgY29udmVyc2lvbiB3aXRoIGZsb2F0IGFyZSBsaWJyYXJ5ICovCisJCWlmIChJU0ZMT0FUKHQpIHx8IElTRkxPQVQodDIpKQorCQkJcmV0dXJuIGZuYW1lOworCisJCS8qIE5vIG1hdGNoICovCisJCXJldHVybiBOVUxMOworCX0KKworCS8qIFNjYW4gZm9yIHN1cHBvcnRlZCBvcGVyYXRpb25zICovCisJZm9yIChpPTA7IGxpYl9vcHNbaV0uY29kZSA+IDA7IGkrKykKKwl7CisJCS8qIE1hdGNoIG9wICovCisJCWlmIChsaWJfb3BzW2ldLmNvZGUgIT0gYykKKwkJCWNvbnRpbnVlOworCisJCS8qIFN1cHBvcnRlZCB0eXBlID8gKi8KKwkJaWYgKChsaWJfb3BzW2ldLnR5cGVzICYgKDEgPDwgKHQmTlEpKSkgPT0gMCkKKwkJCXJldHVybiBOVUxMOworCisJCS8qIEJ1aWxkIG5hbWUgKi8KKwkJaWYgKGxpYl9vcHNbaV0udXNlX3NpZ24pCisJCQlzbnByaW50ZihmbmFtZSwgc2l6ZW9mKGZuYW1lKS0xLCAiX18lcyVzJXMiLCBlbmFtZVtjXSwgcywgbik7CisJCWVsc2UKKwkJCXNucHJpbnRmKGZuYW1lLCBzaXplb2YoZm5hbWUpLTEsICJfXyVzJXMiLCBlbmFtZVtjXSwgbik7CisKKwkJcmV0dXJuIGZuYW1lOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiBSZXR1cm5zIDAgaWYgdGhlIHJlZ2lzdGVyIGlzIG5vIHJlZ2lzdGVyIHBhaXIuIElmIHIgICovCisvKiBpcyBhIHJlZ2lzdGVyIHBhaXIgbm9uLXplcm8gd2lsbCBiZSByZXR1cm5lZCBhbmQgdGhlICovCisvKiBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBwIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHR3byAgICovCisvKiBlbGVtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitpbnQgcmVnX3BhaXIoaW50IHIsc3RydWN0IHJwYWlyICpwKQoreworCWlmICgociA+PSBSX1IwUCkgJiYgKHIgPD0gUl9SRVApKQorCXsKKwkJcC0+cjEgPSBSX1IwICsgMiAqIChyIC0gIFJfUjBQKTsKKwkJcC0+cjIgPSBSX1IxICsgMiAqIChyIC0gIFJfUjBQKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKChyID49IFJfUzBQKSAmJiAociA8PSBSX1NFUCkpCisJeworCQlwLT5yMSA9IFJfUzAgKyAyICogKHIgLSAgUl9TMFApOworCQlwLT5yMiA9IFJfUzEgKyAyICogKHIgLSAgUl9TMFApOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJlZ19wYXJtKHN0cnVjdCByZWdfaGFuZGxlICpwLCBzdHJ1Y3QgVHlwICp0LGludCB2YXJhcmcsc3RydWN0IFR5cCAqZCkKK3sKKwlpbnQgZiA9IHQtPmZsYWdzICYgTlE7CisKKwkvKiBFeGNsdXNpb25zICovCisJaWYgKCFJU1NDQUxBUihmKSkgcmV0dXJuIDA7CisJaWYgKHAtPmdwciA+PSA0IHx8IHZhcmFyZykgcmV0dXJuIDA7CisJaWYgKGY9PUxMT05HIHx8IGY9PURPVUJMRSB8fCBmPT1MRE9VQkxFKSByZXR1cm4gMDsKKworCS8qIFBhaXJzIChwb3NzaWJseSAnbG9vc2luZycgb25lIHJlZyBpZiBtaXNhbGlnbmVkKSAqLworCWlmIChmPT1MT05HIHx8IGY9PUZMT0FUKSB7CisJCXAtPmdwciArPSAocC0+Z3ByICYgMSk7CS8qIGFsaWduICovCisJCWlmIChwLT5ncHIgPj0gNCkKKwkJCXJldHVybiAwOworCQlwLT5ncHIgKz0gMjsKKwkJcmV0dXJuIFJfUjBQICsgKHAtPmdwciAvIDIpIC0gMTsKKwl9CisKKwkvKiBOb3JtYWwgKi8KKwlyZXR1cm4gUl9SMCArIHAtPmdwcisrOworfQorCitpbnQgcG9pbnRlcl90eXBlKHN0cnVjdCBUeXAgKnApCit7CisJd2hpbGUgKElTQVJSQVkocC0+ZmxhZ3MpKQorCQlwPXAtPm5leHQ7CisJaWYgKElTRlVOQyhwLT5mbGFncykpCisJCXJldHVybiBQUE9JTlRFUjsKKwlpZiAocC0+YXR0ciAmJiBzdHJzdHIocC0+YXR0ciwgU1RSX1BNRU0pKQorCQlyZXR1cm4gUFBPSU5URVI7CisJcmV0dXJuIERQT0lOVEVSOworfQorCit2b2lkIGNvbnZfdHlwKHN0cnVjdCBUeXAgKnApCit7CisJY2hhciAqYXR0cjsKKwl3aGlsZShwKSB7CisJCWlmIChJU1BPSU5URVIocC0+ZmxhZ3MpKSB7CisJCQlwLT5mbGFncyA9ICgocC0+ZmxhZ3Mmfk5VKXxQT0lOVEVSX1RZUEUocC0+bmV4dCkpOworCQkJaWYoYXR0cj1wLT5uZXh0LT5hdHRyKXsKKwkJCQlpZihzdHJzdHIoYXR0cixTVFJfUE1FTSkpCisJCQkJCXAtPmZsYWdzPSgocC0+ZmxhZ3Mmfk5VKXxQUE9JTlRFUik7CisJCQl9CisJCX0KKwkJcD1wLT5uZXh0OworCX0KK30KKworLyogQmVsb3cgaXMgbW9zdGx5IGNvcGllZCBmcm9tIHN1cHAuYyAqLwordm9pZCBwcmludHZhbChGSUxFICpmLHVuaW9uIGF0eXBzICpwLGludCB0KQoreworCXQmPU5VOworCWlmKHQ9PUNIQVIpe2ZwcmludGYoZiwiQyIpO3ZtYXg9emMyem0ocC0+dmNoYXIpO3ByaW50em0oZix2bWF4KTt9CisJaWYodD09KFVOU0lHTkVEfENIQVIpKXtmcHJpbnRmKGYsIlVDIik7dnVtYXg9enVjMnp1bShwLT52dWNoYXIpO3ByaW50enVtKGYsdnVtYXgpO30KKwlpZih0PT1TSE9SVCl7ZnByaW50ZihmLCJTIik7dm1heD16czJ6bShwLT52c2hvcnQpO3ByaW50em0oZix2bWF4KTt9CisJaWYodD09KFVOU0lHTkVEfFNIT1JUKSl7ZnByaW50ZihmLCJVUyIpO3Z1bWF4PXp1czJ6dW0ocC0+dnVzaG9ydCk7cHJpbnR6dW0oZix2dW1heCk7fQorCWlmKHQ9PUZMT0FUKXtmcHJpbnRmKGYsIkYiKTt2bGRvdWJsZT16ZjJ6bGQocC0+dmZsb2F0KTtwcmludHpsZChmLHZsZG91YmxlKTt9CisJaWYodD09RE9VQkxFKXtmcHJpbnRmKGYsIkQiKTt2bGRvdWJsZT16ZDJ6bGQocC0+dmRvdWJsZSk7cHJpbnR6bGQoZix2bGRvdWJsZSk7fQorCWlmKHQ9PUxET1VCTEUpe2ZwcmludGYoZiwiTEQiKTtwcmludHpsZChmLHAtPnZsZG91YmxlKTt9CisJaWYodD09SU5UKXtmcHJpbnRmKGYsIkkiKTt2bWF4PXppMnptKHAtPnZpbnQpO3ByaW50em0oZix2bWF4KTt9CisJaWYodD09KFVOU0lHTkVEfElOVCkpe2ZwcmludGYoZiwiVUkiKTt2dW1heD16dWkyenVtKHAtPnZ1aW50KTtwcmludHp1bShmLHZ1bWF4KTt9CisJaWYodD09TE9ORyl7ZnByaW50ZihmLCJMIik7dm1heD16bDJ6bShwLT52bG9uZyk7cHJpbnR6bShmLHZtYXgpO30KKwlpZih0PT0oVU5TSUdORUR8TE9ORykpe2ZwcmludGYoZiwiVUwiKTt2dW1heD16dWwyenVtKHAtPnZ1bG9uZyk7cHJpbnR6dW0oZix2dW1heCk7fQorCWlmKHQ9PUxMT05HKXtmcHJpbnRmKGYsIkxMIik7dm1heD16bGwyem0ocC0+dmxsb25nKTtwcmludHptKGYsdm1heCk7fQorCWlmKHQ9PShVTlNJR05FRHxMTE9ORykpe2ZwcmludGYoZiwiVUxMIik7dnVtYXg9enVsbDJ6dW0ocC0+dnVsbG9uZyk7cHJpbnR6dW0oZix2dW1heCk7fQorCWlmKHQ9PU1BWElOVCl7ZnByaW50ZihmLCJNIik7cHJpbnR6bShmLHAtPnZtYXgpO30KKwlpZih0PT0oVU5TSUdORUR8TUFYSU5UKSl7ZnByaW50ZihmLCJVTSIpO3ByaW50enVtKGYscC0+dnVtYXgpO30KKwlpZih0PT1EUE9JTlRFUil7ZnByaW50ZihmLCJQZCIpO3Z1bWF4PXp1bDJ6dW0ocC0+dnVzaG9ydCk7cHJpbnR6dW0oZix2dW1heCk7fQorCWlmKHQ9PVBQT0lOVEVSKXtmcHJpbnRmKGYsIlBwIik7dnVtYXg9enVsMnp1bShwLT52dXNob3J0KTtwcmludHp1bShmLHZ1bWF4KTt9Cit9CisKK3ZvaWQgZW1pdHZhbChGSUxFICpmLHVuaW9uIGF0eXBzICpwLGludCB0KQoreworCXQmPU5VOworCWlmKHQ9PUNIQVIpe3ZtYXg9emMyem0ocC0+dmNoYXIpO2VtaXR6bShmLHZtYXgpO30KKwlpZih0PT0oVU5TSUdORUR8Q0hBUikpe3Z1bWF4PXp1YzJ6dW0ocC0+dnVjaGFyKTtlbWl0enVtKGYsdnVtYXgpO30KKwlpZih0PT1TSE9SVCl7dm1heD16czJ6bShwLT52c2hvcnQpO2VtaXR6bShmLHZtYXgpO30KKwlpZih0PT0oVU5TSUdORUR8U0hPUlQpKXt2dW1heD16dXMyenVtKHAtPnZ1c2hvcnQpO2VtaXR6dW0oZix2dW1heCk7fQorCWlmKHQ9PUZMT0FUKXt2bGRvdWJsZT16ZjJ6bGQocC0+dmZsb2F0KTtlbWl0emxkKGYsdmxkb3VibGUpO30KKwlpZih0PT1ET1VCTEUpe3ZsZG91YmxlPXpkMnpsZChwLT52ZG91YmxlKTtlbWl0emxkKGYsdmxkb3VibGUpO30KKwlpZih0PT1MRE9VQkxFKXtlbWl0emxkKGYscC0+dmxkb3VibGUpO30KKwlpZih0PT1JTlQpe3ZtYXg9emkyem0ocC0+dmludCk7ZW1pdHptKGYsdm1heCk7fQorCWlmKHQ9PShVTlNJR05FRHxJTlQpKXt2dW1heD16dWkyenVtKHAtPnZ1aW50KTtlbWl0enVtKGYsdnVtYXgpO30KKwlpZih0PT1MT05HKXt2bWF4PXpsMnptKHAtPnZsb25nKTtlbWl0em0oZix2bWF4KTt9CisJaWYodD09KFVOU0lHTkVEfExPTkcpKXt2dW1heD16dWwyenVtKHAtPnZ1bG9uZyk7ZW1pdHp1bShmLHZ1bWF4KTt9CisJaWYodD09TExPTkcpe3ZtYXg9emxsMnptKHAtPnZsbG9uZyk7ZW1pdHptKGYsdm1heCk7fQorCWlmKHQ9PShVTlNJR05FRHxMTE9ORykpe3Z1bWF4PXp1bGwyenVtKHAtPnZ1bGxvbmcpO2VtaXR6dW0oZix2dW1heCk7fQorCWlmKHQ9PU1BWElOVCl7ZW1pdHptKGYscC0+dm1heCk7fQorCWlmKHQ9PShVTlNJR05FRHxNQVhJTlQpKXtlbWl0enVtKGYscC0+dnVtYXgpO30KKwlpZih0PT1EUE9JTlRFUil7dnVtYXg9enVzMnp1bShwLT52dXNob3J0KTtlbWl0enVtKGYsdnVtYXgpO30KKwlpZih0PT1QUE9JTlRFUil7dnVtYXg9enVzMnp1bShwLT52dXNob3J0KTtlbWl0enVtKGYsdnVtYXgpO30KK30KKwordm9pZCBpbnNlcnRfY29uc3QodW5pb24gYXR5cHMgKnAsaW50IHQpCit7CisJaWYoIXApIGllcnJvcigwKTsKKwl0Jj1OVTsKKwlpZih0PT1DSEFSKSB7cC0+dmNoYXI9dmNoYXI7cmV0dXJuO30KKwlpZih0PT1TSE9SVCkge3AtPnZzaG9ydD12c2hvcnQ7cmV0dXJuO30KKwlpZih0PT1JTlQpIHtwLT52aW50PXZpbnQ7cmV0dXJuO30KKwlpZih0PT1MT05HKSB7cC0+dmxvbmc9dmxvbmc7cmV0dXJuO30KKwlpZih0PT1MTE9ORykge3AtPnZsbG9uZz12bGxvbmc7cmV0dXJuO30KKwlpZih0PT1NQVhJTlQpIHtwLT52bWF4PXZtYXg7cmV0dXJuO30KKwlpZih0PT0oVU5TSUdORUR8Q0hBUikpIHtwLT52dWNoYXI9dnVjaGFyO3JldHVybjt9CisJaWYodD09KFVOU0lHTkVEfFNIT1JUKSkge3AtPnZ1c2hvcnQ9dnVzaG9ydDtyZXR1cm47fQorCWlmKHQ9PShVTlNJR05FRHxJTlQpKSB7cC0+dnVpbnQ9dnVpbnQ7cmV0dXJuO30KKwlpZih0PT0oVU5TSUdORUR8TE9ORykpIHtwLT52dWxvbmc9dnVsb25nO3JldHVybjt9CisJaWYodD09KFVOU0lHTkVEfExMT05HKSkge3AtPnZ1bGxvbmc9dnVsbG9uZztyZXR1cm47fQorCWlmKHQ9PShVTlNJR05FRHxNQVhJTlQpKSB7cC0+dnVtYXg9dnVtYXg7cmV0dXJuO30KKwlpZih0PT1GTE9BVCkge3AtPnZmbG9hdD12ZmxvYXQ7cmV0dXJuO30KKwlpZih0PT1ET1VCTEUpIHtwLT52ZG91YmxlPXZkb3VibGU7cmV0dXJuO30KKwlpZih0PT1MRE9VQkxFKSB7cC0+dmxkb3VibGU9dmxkb3VibGU7cmV0dXJuO30KKwlpZih0PT1EUE9JTlRFUikge3AtPnZ1c2hvcnQ9dnVzaG9ydDtyZXR1cm47fQorCWlmKHQ9PVBQT0lOVEVSKSB7cC0+dnVzaG9ydD12dXNob3J0O3JldHVybjt9Cit9CisKK3ZvaWQgZXZhbF9jb25zdCh1bmlvbiBhdHlwcyAqcCxpbnQgdCkKK3sKKwlpbnQgZj10Jk5ROworCWlmKCFwKSBpZXJyb3IoMCk7CisJaWYoZj09TUFYSU5UfHwoZj49Q0hBUiYmZjw9TExPTkcpKXsKKwkJaWYoISh0JlVOU0lHTkVEKSl7CisJCQlpZihmPT1DSEFSKSB2bWF4PXpjMnptKHAtPnZjaGFyKTsKKwkJCWVsc2UgaWYoZj09U0hPUlQpdm1heD16czJ6bShwLT52c2hvcnQpOworCQkJZWxzZSBpZihmPT1JTlQpICB2bWF4PXppMnptKHAtPnZpbnQpOworCQkJZWxzZSBpZihmPT1MT05HKSB2bWF4PXpsMnptKHAtPnZsb25nKTsKKwkJCWVsc2UgaWYoZj09TExPTkcpIHZtYXg9emxsMnptKHAtPnZsbG9uZyk7CisJCQllbHNlIGlmKGY9PU1BWElOVCkgdm1heD1wLT52bWF4OworCQkJZWxzZSBpZXJyb3IoMCk7CisJCQl2dW1heD16bTJ6dW0odm1heCk7CisJCQl2bGRvdWJsZT16bTJ6bGQodm1heCk7CisJCX1lbHNleworCQkJaWYoZj09Q0hBUikgdnVtYXg9enVjMnp1bShwLT52dWNoYXIpOworCQkJZWxzZSBpZihmPT1TSE9SVCl2dW1heD16dXMyenVtKHAtPnZ1c2hvcnQpOworCQkJZWxzZSBpZihmPT1JTlQpICB2dW1heD16dWkyenVtKHAtPnZ1aW50KTsKKwkJCWVsc2UgaWYoZj09TE9ORykgdnVtYXg9enVsMnp1bShwLT52dWxvbmcpOworCQkJZWxzZSBpZihmPT1MTE9ORykgdnVtYXg9enVsbDJ6dW0ocC0+dnVsbG9uZyk7CisJCQllbHNlIGlmKGY9PU1BWElOVCkgdnVtYXg9cC0+dnVtYXg7CisJCQllbHNlIGllcnJvcigwKTsKKwkJCXZtYXg9enVtMnptKHZ1bWF4KTsKKwkJCXZsZG91YmxlPXp1bTJ6bGQodnVtYXgpOworCQl9CisJfWVsc2V7CisJCWlmKElTUE9JTlRFUihmKSl7CisJCQl2dW1heD16dXMyenVtKHAtPnZ1c2hvcnQpOworCQkJdm1heD16dW0yem0odnVtYXgpO3ZsZG91YmxlPXp1bTJ6bGQodnVtYXgpOworCQl9ZWxzZXsKKwkJCWlmKGY9PUZMT0FUKSB2bGRvdWJsZT16ZjJ6bGQocC0+dmZsb2F0KTsKKwkJCWVsc2UgaWYoZj09RE9VQkxFKSB2bGRvdWJsZT16ZDJ6bGQocC0+dmRvdWJsZSk7CisJCQllbHNlIHZsZG91YmxlPXAtPnZsZG91YmxlOworCQkJdm1heD16bGQyem0odmxkb3VibGUpOworCQkJdnVtYXg9emxkMnp1bSh2bGRvdWJsZSk7CisJCX0KKwl9CisJdmZsb2F0PXpsZDJ6Zih2bGRvdWJsZSk7CisJdmRvdWJsZT16bGQyemQodmxkb3VibGUpOworCXZ1Y2hhcj16dW0yenVjKHZ1bWF4KTsKKwl2dXNob3J0PXp1bTJ6dXModnVtYXgpOworCXZ1aW50PXp1bTJ6dWkodnVtYXgpOworCXZ1bG9uZz16dW0yenVsKHZ1bWF4KTsKKwl2dWxsb25nPXp1bTJ6dWxsKHZ1bWF4KTsKKwl2Y2hhcj16bTJ6Yyh2bWF4KTsKKwl2c2hvcnQ9em0yenModm1heCk7CisJdmludD16bTJ6aSh2bWF4KTsKKwl2bG9uZz16bTJ6bCh2bWF4KTsKKwl2bGxvbmc9em0yemxsKHZtYXgpOworfQpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvZmlyZTE2L21hY2hpbmUuZHQgYi9tYWNoaW5lcy9maXJlMTYvbWFjaGluZS5kdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTYwNjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvZmlyZTE2L21hY2hpbmUuZHQKQEAgLTAsMCArMSwxNiBAQAorUzE2QlNMRSBTMTZCU0JFCitTMTZCVUxFIFMxNkJVQkUKK1MxNkJTTEUgUzE2QlNCRQorUzE2QlVMRSBTMTZCVUJFCitTMTZCU0xFIFMxNkJTQkUKK1MxNkJVTEUgUzE2QlVCRQorUzMyQlNMRSBTMzJCU0JFCitTMzJCVUxFIFMzMkJVQkUKK1M2NEJTTEUgUzY0QlNCRQorUzY0QlVMRSBTNjRCVUJFCitTMzJCSUVFRUxFCitTNjRCSUVFRUxFCitTNjRCSUVFRUxFCitTMTZCVUxFIFMxNkJVQkUKKworCmRpZmYgLS1naXQgYS9tYWNoaW5lcy9maXJlMTYvbWFjaGluZS5oIGIvbWFjaGluZXMvZmlyZTE2L21hY2hpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzIzMzIxCi0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvZmlyZTE2L21hY2hpbmUuaApAQCAtMCwwICsxLDE4OSBAQAorLyogCisgKiBCYWNrZW5kIGZvciB0aGUgRmlyZTE2IGlDRTQwIFNvZnRDb3JlCisgKiAoYykgMjAxOSBieSBTeWx2YWluIE11bmF1dAorICovCisKKyNpbmNsdWRlICJkdC5oIgorCisKKy8qICBUaGlzIHN0cnVjdCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgbWFjaGluZS1zcGVjaWZpYyAgICAgICAgICAgKi8KKy8qICBhZGRyZXNzaW5nLW1vZGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0cnVjdCBBZGRyZXNzaW5nTW9kZSB7CisJaW50IG5vdF91c2VkX3lldDsJLy8gRklYTUUKK307CisKKy8qICBUaGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUuICAgICAgICAgICAgICAgICAgKi8KKwkvKiAtIDE2IHJOIEdQUiArIDggcGFpcnMKKwkgKiAtIDE2IHNOIEdQUiArIDggcGFpcnMKKwkgKiAtIEEsIFgsIFksIEkKKwkgKi8KKyNkZWZpbmUgTUFYUiA1MgorCisvKiAgTnVtYmVyIG9mIGNvbW1hbmRsaW5lLW9wdGlvbnMgdGhlIGNvZGUtZ2VuZXJhdG9yIGFjY2VwdHMuICAgICAgICovCisjZGVmaW5lIE1BWEdGIDIwCisKKy8qICBJZiB0aGlzIGlzIHNldCB0byB6ZXJvIHZiY2Mgd2lsbCBub3QgZ2VuZXJhdGUgSUNzIHdoZXJlIHRoZSAgICAgKi8KKy8qICB0YXJnZXQgb3BlcmFuZCBpcyB0aGUgc2FtZSBhcyB0aGUgMm5kIHNvdXJjZSBvcGVyYW5kLiAgICAgICAgICAgKi8KKy8qICBUaGlzIGNhbiBzb21ldGltZXMgc2ltcGxpZnkgdGhlIGNvZGUtZ2VuZXJhdG9yLCBidXQgdXN1YWxseSAgICAgKi8KKy8qICB0aGUgY29kZSBpcyBiZXR0ZXIgaWYgdGhlIGNvZGUtZ2VuZXJhdG9yIGFsbG93cyBpdC4gICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNFUTJBU1ogMQorCisvKiAgVGhpcyBzcGVjaWZpZXMgdGhlIHNtYWxsZXN0IGludGVnZXIgdHlwZSB0aGF0IGNhbiBiZSBhZGRlZCB0byBhICovCisvKiAgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JTkFEREkyUCBDSEFSCisKKy8qICBUaGlzIHNwZWNpZmllcyB0aGUgc21hbGxlc3QgaW50ZWdlciB0eXBlIHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgKi8KKy8qICBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFYQURESTJQIElOVAorCisvKiAgSWYgdGhlIGJ5dGVzIG9mIGFuIGludGVnZXIgYXJlIG9yZGVyZWQgbW9zdCBzaWduaWZpY2FudCBieXRlICAgICovCisvKiAgYnl0ZSBmaXJzdCBhbmQgdGhlbiBkZWNyZWFzaW5nIHNldCBCSUdFTkRJQU4gdG8gMS4gICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR0VORElBTiAwCisKKy8qICBJZiB0aGUgYnl0ZXMgb2YgYW4gaW50ZWdlciBhcmUgb3JkZXJlZCBsZXN0IHNpZ25pZmljYW50IGJ5dGUgICAgKi8KKy8qICBieXRlIGZpcnN0IGFuZCB0aGVuIGluY3JlYXNpbmcgc2V0IExJVFRMRUVORElBTiB0byAxLiAgICAgICAgICAgKi8KKyNkZWZpbmUgTElUVExFRU5ESUFOIDEKKworLyogIE5vdGUgdGhhdCBCSUdFTkRJQU4gYW5kIExJVFRMRUVORElBTiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAgICAqLworCisvKiAgSWYgc3dpdGNoLXN0YXRlbWVudHMgc2hvdWxkIGJlIGdlbmVyYXRlZCBhcyBhIHNlcXVlbmNlIG9mICAgICAgICovCisvKiAgU1VCLFRTVCxCRVEgSUNzIHJhdGhlciB0aGFuIENPTVBBUkUsQkVRIElDcyBzZXQgdGhpcyB0byAxLiAgICAgICovCisvKiAgVGhpcyBjYW4geWllbGQgYmV0dGVyIGNvZGUgb24gc29tZSBtYWNoaW5lcy4gICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNXSVRDSFNVQlMgMAorCisvKiAgSW4gb3B0aW1pemluZyBjb21waWxhdGlvbiBjZXJ0YWluIGxpYnJhcnkgbWVtY3B5L3N0cmNweS1jYWxscyAgICovCisvKiAgd2l0aCBsZW5ndGgga25vd24gYXQgY29tcGlsZS10aW1lIHdpbGwgYmUgaW5saW5lZCB1c2luZyBhbiAgICAgICovCisvKiAgQVNTSUdOLUlDIGlmIHRoZSBzaXplIGlzIGxlc3Mgb3IgZXF1YWwgdG8gSU5MSU5FTUVNQ1BZLiAgICAgICAgICovCisvKiAgVGhlIHR5cGUgdXNlZCBmb3IgdGhlIEFTU0lHTi1JQyB3aWxsIGJlIFVOU0lHTkVEfENIQVIuICAgICAgICAgICovCisjZGVmaW5lIElOTElORU1FTUNQWSAxNgorCisvKiAgUGFyYW1ldGVycyBhcmUgc29tZXRpbWVzIHBhc3NlZCBpbiByZWdpc3RlcnMgd2l0aG91dCBfX3JlZy4gICAgICovCisjZGVmaW5lIEhBVkVfUkVHUEFSTVMgMQorCisvKiAgU3RydWN0dXJlIGZvciByZWdfcGFybSgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdHJ1Y3QgcmVnX2hhbmRsZXsKKyAgICB1bnNpZ25lZCBsb25nIGdwcjsKK307CisKKy8qICBXZSBoYXZlIHJlZ2lzdGVyIHBhaXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9SRUdQQUlSUyAxCisKKy8qICBXZSB1c2UgdW5zaWduZWQgaW50IGFzIHNpemVfdCByYXRoZXIgdGhhbiB1bnNpZ25lZCBsb25nIHdoaWNoICAgKi8KKy8qICBpcyB0aGUgZGVmYXVsdCBzZXR0aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9JTlRfU0laRVQgMQorCisvKiAgV2UgaGF2ZSBhc21fcGVlcGhvbGUgdG8gb3B0aW1pemUgYXNzZW1ibHktb3V0cHV0ICovCisjZGVmaW5lIEhBVkVfVEFSR0VUX1BFRVBIT0xFIDAJLyogRklYTUU6IG5vdCB5ZXQgKi8KKworLyogIFdlIGhhdmUgc29tZSB0YXJnZXQtc3BlY2lmaWMgdmFyaWFibGUgYXR0cmlidXRlcy4gICAgICAgICAgICAgICAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9BVFRSSUJVVEVTIDEKKworLyogV2UgZG8gbm90IGhhdmUgdGFyZ2V0LXNwZWNpZmljIHByYWdtYXMgKi8KKyN1bmRlZiBIQVZFX1RBUkdFVF9QUkFHTUFTCisKKy8qICBXZSBrZWVwIHRyYWNrIG9mIGFsbCByZWdpc3RlcnMgbW9kaWZpZWQgYnkgYSBmdW5jdGlvbi4gICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9SRUdTX01PRElGSUVEIDEKKworLyogV2UgaGF2ZSBhIGltcGxlbWVudCBvdXIgb3duIGNvc3QtZnVuY3Rpb25zIHRvIGFkYXB0CisgICByZWdpc3Rlci1hbGxvY2F0aW9uICovCisjaWYgMCAvKiBGSVhNRSAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9SQUxMT0MgMQorI2RlZmluZSBjb3N0X21vdmVfcmVnKHgseSkgIFhYWAorI2RlZmluZSBjb3N0X2xvYWRfcmVnKHgseSkgIFhYWAorI2RlZmluZSBjb3N0X3NhdmVfcmVnKHgseSkgIFhYWAorI2RlZmluZSBjb3N0X3B1c2hwb3BfcmVnKHgpIFhYWAorI2VuZGlmCisKKy8qIHdlIGRvIG5vdCBoYXZlIGEgbWFya19lZmZfaWNzIGZ1bmN0aW9uLCB0aGlzIGlzIHVzZWQgdG8gcHJldmVudAorICAgb3B0aW1pemF0aW9ucyBvbiBjb2RlIHdoaWNoIGNhbiBhbHJlYWR5IGJlIGltcGxlbWVudGVkIGJ5IGVmZmljaWVudAorICAgYXNzZW1ibHkgKi8KKyN1bmRlZiBIQVZFX1RBUkdFVF9FRkZfSUMKKworLyogd2UgZG8gbm90IG5lZWQgZXh0cmEgZWxlbWVudHMgaW4gdGhlIElDICovCisjdW5kZWYgSEFWRV9FWFRfSUMKKworLyogd2UgbmVlZCBleHRlbmRlZCB0eXBlcyAoZm9yIHBtZW0vZG1lbSBwb2ludGVycykgKi8KKyNkZWZpbmUgSEFWRV9FWFRfVFlQRVMgMQorCisjdW5kZWYgQ0hBUgorI3VuZGVmIFNIT1JUCisjdW5kZWYgSU5UCisjdW5kZWYgTE9ORworI3VuZGVmIExMT05HCisjdW5kZWYgRkxPQVQKKyN1bmRlZiBET1VCTEUKKyN1bmRlZiBMRE9VQkxFCisjdW5kZWYgVk9JRAorI3VuZGVmIFBPSU5URVIKKyN1bmRlZiBBUlJBWQorI3VuZGVmIFNUUlVDVAorI3VuZGVmIFVOSU9OCisjdW5kZWYgRU5VTQorI3VuZGVmIEZVTktUCisjdW5kZWYgQk9PTAorI3VuZGVmIE1BWElOVAorI3VuZGVmIE1BWF9UWVBFCisKKyNkZWZpbmUgQ0hBUiAxCisjZGVmaW5lIFNIT1JUIDIKKyNkZWZpbmUgSU5UIDMKKyNkZWZpbmUgTE9ORyA0CisjZGVmaW5lIExMT05HIDUKKyNkZWZpbmUgRkxPQVQgNgorI2RlZmluZSBET1VCTEUgNworI2RlZmluZSBMRE9VQkxFIDgKKyNkZWZpbmUgVk9JRCA5CisjZGVmaW5lIERQT0lOVEVSIDEwCisjZGVmaW5lIFBQT0lOVEVSIDExCisjZGVmaW5lIEFSUkFZIDEyCisjZGVmaW5lIFNUUlVDVCAxMworI2RlZmluZSBVTklPTiAxNAorI2RlZmluZSBFTlVNIDE1CisjZGVmaW5lIEZVTktUIDE2CisjZGVmaW5lIEJPT0wgMTcKKyNkZWZpbmUgTUFYSU5UIDE4CisjZGVmaW5lIE1BWF9UWVBFIE1BWElOVAorCisjZGVmaW5lIFBPSU5URVJfVFlQRSh4KSBwb2ludGVyX3R5cGUoeCkKK2V4dGVybiBpbnQgcG9pbnRlcl90eXBlKCk7CisjZGVmaW5lIElTUE9JTlRFUih4KSAoKHgmTlEpPj1EUE9JTlRFUiYmKHgmTlEpPD1QUE9JTlRFUikKKyNkZWZpbmUgSVNTQ0FMQVIoeCkgKCh4Jk5RKT49Q0hBUiYmKHgmTlEpPD1QUE9JTlRFUikKKyNkZWZpbmUgSVNJTlQoeCkgKCh4Jk5RKT49Q0hBUiYmKHgmTlEpPD1MTE9ORykKKyNkZWZpbmUgUFRSRElGRl9UKHgpIChJTlQpCisKK3R5cGVkZWYgemxsb25nIHptYXg7Cit0eXBlZGVmIHp1bGxvbmcgenVtYXg7CisKK3VuaW9uIGF0eXBzeworICB6Y2hhciB2Y2hhcjsKKyAgenVjaGFyIHZ1Y2hhcjsKKyAgenNob3J0IHZzaG9ydDsKKyAgenVzaG9ydCB2dXNob3J0OworICB6aW50IHZpbnQ7CisgIHp1aW50IHZ1aW50OworICB6bG9uZyB2bG9uZzsKKyAgenVsb25nIHZ1bG9uZzsKKyAgemxsb25nIHZsbG9uZzsKKyAgenVsbG9uZyB2dWxsb25nOworICB6bWF4IHZtYXg7CisgIHp1bWF4IHZ1bWF4OworICB6ZmxvYXQgdmZsb2F0OworICB6ZG91YmxlIHZkb3VibGU7CisgIHpsZG91YmxlIHZsZG91YmxlOworfTsKKworCisvKiB3ZSBuZWVkIG91ciBvd24gcHJpbnR2YWwgKi8KKyNkZWZpbmUgSEFWRV9UR1RfUFJJTlRWQUwgMQorCisvKiB3ZSB3YW50IHRvIHJlcGxhY2Ugc29tZSBJQ3Mgd2l0aCBsaWJjYWxscyAqLworI2RlZmluZSBIQVZFX0xJQkNBTExTIDEKKworLyogd2UgbXVjaCBwcmVmZXIgQk5FICovCisjZGVmaW5lIEhBVkVfV0FOVEJORSAxCisKKy8qIHNpemUgb2YgYnVmZmVyIGZvciBhc20tb3V0cHV0ICovCisjZGVmaW5lIEVNSVRfQlVGX0xFTiAxMDI0IC8qIHNob3VsZCBiZSBlbm91Z2ggKi8KKworLyogbnVtYmVyIG9mIGFzbS1vdXRwdXQgbGluZXMgYnVmZmVyZWQgKi8KKyNkZWZpbmUgRU1JVF9CVUZfREVQVEggNApkaWZmIC0tZ2l0IGEvbWFjaGluZXMvZ2VuZXJpYy9tYWNoaW5lLmMgYi9tYWNoaW5lcy9nZW5lcmljL21hY2hpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mN2I4NmFjCi0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvZ2VuZXJpYy9tYWNoaW5lLmMKQEAgLTAsMCArMSwxMTY2IEBACisvKiAgRXhhbXBsZSBiYWNrZW5kIGZvciB2YmNjLCBpdCBtb2RlbHMgYSBnZW5lcmljIDMyYml0IFJJU0Mgb3IgQ0lTQworICAgIENQVS4KKyAKKyAgICBDb25maWd1cmFibGUgYXQgYnVpbGQtdGltZSBhcmU6CisgICAgLSBudW1iZXIgb2YgKDMyYml0KSBnZW5lcmFsLXB1cnBvc2UtcmVnaXN0ZXJzCisgICAgLSBudW1iZXIgb2YgKDY0Yml0KSBmbG9hdGluZy1wb2ludC1yZWdpc3RlcnMKKyAgICAtIG51bWJlciBvZiAoOGJpdCkgY29uZGl0aW9uLWNvZGUtcmVnaXN0ZXJzCisgICAgLSBtZWNoYW5pc20gZm9yIHN0YWNrLWFyZ3VtZW50cyAobW92aW5nIG90IGZpeGVkIHNwKQorIAorICAgIEl0IGFsbG93cyB0byBzZWxlY3QgYXMgcnVuLXRpbWUtb3B0aW9uczoKKyAgICAtIHR3by0gb3IgdGhyZWUtYWRkcmVzcyBjb2RlCisgICAgLSBtZW1vcnkgb3BlcmFuZHMgb3IgbG9hZC1zdG9yZS1hcmNoaXRlY3R1cmUKKyAgICAtIG51bWJlciBvZiByZWdpc3Rlci1hcmd1bWVudHMKKyAgICAtIG51bWJlciBvZiBjYWxsZXItc2F2ZS1yZWdpc3RlcnMKKyovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworI2luY2x1ZGUgInN1cHAuaCIKKworc3RhdGljIGNoYXIgRklMRV9bXT1fX0ZJTEVfXzsKKworLyogIFB1YmxpYyBkYXRhIHRoYXQgTVVTVCBiZSB0aGVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIE5hbWUgYW5kIGNvcHlyaWdodC4gKi8KK2NoYXIgY2dfY29weXJpZ2h0W109InZiY2MgZ2VuZXJpYyBjb2RlLWdlbmVyYXRvciBWMC4xYiAoYykgaW4gMjAwMSBieSBWb2xrZXIgQmFydGhlbG1hbm4iOworCisvKiAgQ29tbWFuZGxpbmUtZmxhZ3MgdGhlIGNvZGUtZ2VuZXJhdG9yIGFjY2VwdHM6CisgICAgMDoganVzdCBhIGZsYWcKKyAgICBWQUxGTEFHOiBhIHZhbHVlIG11c3QgYmUgc3BlY2lmaWVkCisgICAgU1RSSU5HRkxBRzogYSBzdHJpbmcgY2FuIGJlIHNwZWNpZmllZAorICAgIEZVTkNGTEFHOiBhIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCisgICAgYXBhcnQgZnJvbSBGVU5DRkxBRywgYWxsIG90aGVyIHZlcnNpb25zIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBvbmNlICovCitpbnQgZ19mbGFnc1tNQVhHRl09ezAsMCwKKwkJICAgIFZBTEZMQUcsVkFMRkxBRyxWQUxGTEFHLAorCQkgICAgMCwwLAorCQkgICAgVkFMRkxBRyxWQUxGTEFHLDB9OworCisvKiB0aGUgZmxhZy1uYW1lLCBkbyBub3QgdXNlIG5hbWVzIGJlZ2lubmluZyB3aXRoIGwsIEwsIEksIEQgb3IgVSwgYmVjYXVzZQorICAgdGhleSBjb2xsaWRlIHdpdGggdGhlIGZyb250ZW5kICovCitjaGFyICpnX2ZsYWdzX25hbWVbTUFYR0ZdPXsidGhyZWUtYWRkciIsImxvYWQtc3RvcmUiLAorCQkJICAgInZvbGF0aWxlLWdwcnMiLCJ2b2xhdGlsZS1mcHJzIiwidm9sYXRpbGUtY2NycyIsCisJCQkgICAiaW1tLWluZCIsImdwci1pbmQiLAorCQkJICAgImdwci1hcmdzIiwiZnByLWFyZ3MiLCJ1c2UtY29tbW9ucyJ9OworCisvKiB0aGUgcmVzdWx0cyBvZiBwYXJzaW5nIHRoZSBjb21tYW5kLWxpbmUtZmxhZ3Mgd2lsbCBiZSBzdG9yZWQgaGVyZSAqLwordW5pb24gcHBpIGdfZmxhZ3NfdmFsW01BWEdGXTsKKworLyogIEFsaWdubWVudC1yZXF1aXJlbWVudHMgZm9yIGFsbCB0eXBlcyBpbiBieXRlcy4gICAgICAgICAgICAgICovCit6bWF4IGFsaWduW01BWF9UWVBFKzFdOworCisvKiAgQWxpZ25tZW50IHRoYXQgaXMgc3VmZmljaWVudCBmb3IgZXZlcnkgb2JqZWN0LiAgICAgICAgICAgICAgKi8KK3ptYXggbWF4YWxpZ247CisKKy8qICBDSEFSX0JJVCBmb3IgdGhlIHRhcmdldCBtYWNoaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworem1heCBjaGFyX2JpdDsKKworLyogIHNpemVzIG9mIHRoZSBiYXNpYyB0eXBlcyAoaW4gYnl0ZXMpICovCit6bWF4IHNpemV0YWJbTUFYX1RZUEUrMV07CisKKy8qICBNaW5pbXVtIGFuZCBNYXhpbXVtIHZhbHVlcyBlYWNoIHR5cGUgY2FuIGhhdmUuICAgICAgICAgICAgICAqLworLyogIE11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gaW5pdF9jZygpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IHRfbWluW01BWF9UWVBFKzFdOworenVtYXggdF9tYXhbTUFYX1RZUEUrMV07Cit6dW1heCB0dV9tYXhbTUFYX1RZUEUrMV07CisKKy8qICBOYW1lcyBvZiBhbGwgcmVnaXN0ZXJzLiB3aWxsIGJlIGluaXRpYWxpemVkIGluIGluaXRfY2coKSwKKyAgICByZWdpc3RlciBudW1iZXIgMCBpcyBpbnZhbGlkLCB2YWxpZCByZWdpc3RlcnMgc3RhcnQgYXQgMSAqLworY2hhciAqcmVnbmFtZXNbTUFYUisxXTsKKworLyogIFRoZSBTaXplIG9mIGVhY2ggcmVnaXN0ZXIgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IHJlZ3NpemVbTUFYUisxXTsKKworLyogIGEgdHlwZSB3aGljaCBjYW4gc3RvcmUgZWFjaCByZWdpc3Rlci4gKi8KK3N0cnVjdCBUeXAgKnJlZ3R5cGVbTUFYUisxXTsKKworLyogIHJlZ3NhW3JlZ10hPTAgaWYgYSBjZXJ0YWluIHJlZ2lzdGVyIGlzIGFsbG9jYXRlZCBhbmQgc2hvdWxkICovCisvKiAgbm90IGJlIHVzZWQgYnkgdGhlIGNvbXBpbGVyIHBhc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2ludCByZWdzYVtNQVhSKzFdOworCisvKiAgU3BlY2lmaWVzIHdoaWNoIHJlZ2lzdGVycyBtYXkgYmUgc2NyYXRjaGVkIGJ5IGZ1bmN0aW9ucy4gICAgKi8KK2ludCByZWdzY3JhdGNoW01BWFIrMV07CisKKy8qIHNwZWNpZmllcyB0aGUgcHJpb3JpdHkgZm9yIHRoZSByZWdpc3Rlci1hbGxvY2F0b3IsIGlmIHRoZSBzYW1lCisgICBlc3RpbWF0ZWQgY29zdC1zYXZpbmcgY2FuIGJlIG9idGFpbmVkIGJ5IHNldmVyYWwgcmVnaXN0ZXJzLCB0aGUKKyAgIG9uZSB3aXRoIHRoZSBoaWdoZXN0IHByaW9yaXR5IHdpbGwgYmUgdXNlZCAqLworaW50IHJlZ19wcmlvW01BWFIrMV07CisKKy8qIGFuIGVtcHR5IHJlZy1oYW5kbGUgcmVwcmVzZW50aW5nIGluaXRpYWwgc3RhdGUgKi8KK3N0cnVjdCByZWdfaGFuZGxlIGVtcHR5X3JlZ19oYW5kbGU9ezAsMH07CisKKy8qIE5hbWVzIG9mIHRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZSBhdHRyaWJ1dGVzLiAgICAgICAgICAgICAgICAqLworY2hhciAqZ19hdHRyX25hbWVbXT17Il9faW50ZXJydXB0IiwwfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBQcml2YXRlIGRhdGEgYW5kIGZ1bmN0aW9ucy4gICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVEhSRUVfQUREUiAoZ19mbGFnc1swXSZVU0VERkxBRykKKyNkZWZpbmUgTE9BRF9TVE9SRSAoZ19mbGFnc1sxXSZVU0VERkxBRykKKyNkZWZpbmUgVk9MX0dQUlMgICAoKGdfZmxhZ3NbMl0mVVNFREZMQUcpP2dfZmxhZ3NfdmFsWzJdLmw6TlVNX0dQUlMvMikKKyNkZWZpbmUgVk9MX0ZQUlMgICAoKGdfZmxhZ3NbM10mVVNFREZMQUcpP2dfZmxhZ3NfdmFsWzNdLmw6TlVNX0ZQUlMvMikKKyNkZWZpbmUgVk9MX0NDUlMgICAoKGdfZmxhZ3NbNF0mVVNFREZMQUcpP2dfZmxhZ3NfdmFsWzRdLmw6TlVNX0NDUlMvMikKKyNkZWZpbmUgSU1NX0lORCAgICAoKGdfZmxhZ3NbNV0mVVNFREZMQUcpPzE6MCkKKyNkZWZpbmUgR1BSX0lORCAgICAoKGdfZmxhZ3NbNl0mVVNFREZMQUcpPzI6MCkKKyNkZWZpbmUgR1BSX0FSR1MgICAoKGdfZmxhZ3NbN10mVVNFREZMQUcpP2dfZmxhZ3NfdmFsWzddLmw6MCkKKyNkZWZpbmUgRlBSX0FSR1MgICAoKGdfZmxhZ3NbOF0mVVNFREZMQUcpP2dfZmxhZ3NfdmFsWzhdLmw6MCkKKyNkZWZpbmUgVVNFX0NPTU1PTlMgKGdfZmxhZ3NbOV0mVVNFREZMQUcpCisKKworLyogYWxpZ25tZW50IG9mIGJhc2ljIGRhdGEtdHlwZXMsIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbGlnbltdICovCitzdGF0aWMgbG9uZyBtYWxpZ25bTUFYX1RZUEUrMV09ICB7MSwxLDIsNCw0LDQsNCw4LDgsMSw0LDEsMSwxLDQsMX07CisvKiBzaXplcyBvZiBiYXNpYyBkYXRhLXR5cGVzLCB1c2VkIHRvIGluaXRpYWxpemUgc2l6ZXRhYltdICovCitzdGF0aWMgbG9uZyBtc2l6ZXRhYltNQVhfVFlQRSsxXT17MSwxLDIsNCw0LDgsNCw4LDgsMCw0LDAsMCwwLDQsMH07CisKKy8qIHVzZWQgdG8gaW5pdGlhbGl6ZSByZWd0eXBbXSAqLworc3RhdGljIHN0cnVjdCBUeXAgbHR5cD17TE9OR30sbGRibD17RE9VQkxFfSxsY2hhcj17Q0hBUn07CisKKy8qIG1hY3JvcyBkZWZpbmVkIGJ5IHRoZSBiYWNrZW5kICovCitzdGF0aWMgY2hhciAqbWFycmF5W109eyJfX3NlY3Rpb24oeCk9X192YXR0cihcInNlY3Rpb24oXCIjeFwiKVwiKSIsCisJCSAgICAgICAiX19HRU5FUklDX18iLAorCQkgICAgICAgMH07CisKKy8qIHNwZWNpYWwgcmVnaXN0ZXJzICovCitzdGF0aWMgaW50IHNwOyAgICAgICAgICAgICAgICAgICAgIC8qICBTdGFja3BvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIGludCB0MSx0Mix0MzsgICAgICAgICAgICAgICAvKiAgdGVtcG9yYXJ5IGdwcnMgKi8KK3N0YXRpYyBpbnQgZjEsZjIsZjM7ICAgICAgICAgICAgICAgLyogIHRlbXBvcmFyeSBmcHJzICovCisKKyNkZWZpbmUgZHQodCkgKCgodCkmVU5TSUdORUQpP3VkdFsodCkmTlFdOnNkdFsodCkmTlFdKQorc3RhdGljIGNoYXIgKnNkdFtNQVhfVFlQRSsxXT17Ij8/IiwiYyIsInMiLCJpIiwibCIsImxsIiwiZiIsImQiLCJsZCIsInYiLCJwIn07CitzdGF0aWMgY2hhciAqdWR0W01BWF9UWVBFKzFdPXsiPz8iLCJ1YyIsInVzIiwidWkiLCJ1bCIsInVsbCIsImYiLCJkIiwibGQiLCJ2IiwicCJ9OworCisvKiBzZWN0aW9ucyAqLworI2RlZmluZSBEQVRBIDAKKyNkZWZpbmUgQlNTIDEKKyNkZWZpbmUgQ09ERSAyCisjZGVmaW5lIFJPREFUQSAzCisjZGVmaW5lIFNQRUNJQUwgNAorCitzdGF0aWMgbG9uZyBzdGFjazsKK3N0YXRpYyBpbnQgc3RhY2tfdmFsaWQ7CitzdGF0aWMgaW50IHNlY3Rpb249LTEsbmV3b2JqOworc3RhdGljIGNoYXIgKmNvZGVuYW1lPSJcdC50ZXh0XG4iLAorICAqZGF0YW5hbWU9Ilx0LmRhdGFcbiIsCisgICpic3NuYW1lPSIiLAorICAqcm9kYXRhbmFtZT0iXHQuc2VjdGlvblx0LnJvZGF0YVxuIjsKKworLyogcmV0dXJuLWluc3RydWN0aW9uICovCitzdGF0aWMgY2hhciAqcmV0OworCisvKiBsYWJlbCBhdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiAoaWYgYW55KSAqLworc3RhdGljIGludCBleGl0X2xhYmVsOworCisvKiBhc3NlbWJseS1wcmVmaXhlcyBmb3IgbGFiZWxzIGFuZCBleHRlcm5hbCBpZGVudGlmaWVycyAqLworc3RhdGljIGNoYXIgKmxhYnByZWZpeD0ibCIsKmlkcHJlZml4PSJfIjsKKworI2lmIEZJWEVEX1NQCisvKiB2YXJpYWJsZXMgdG8gY2FsY3VsYXRlIHRoZSBzaXplIGFuZCBwYXJ0aXRpb25pbmcgb2YgdGhlIHN0YWNrLWZyYW1lCisgICBpbiB0aGUgY2FzZSBvZiBGSVhFRF9TUCAqLworc3RhdGljIGxvbmcgZnJhbWVvZmZzZXQscHVzaGVkLG1heHB1c2hlZCxmcmFtZXNpemU7CisjZWxzZQorLyogdmFyaWFibGVzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc3RhY2stb2Zmc2V0IGluIHRoZSBjYXNlIG9mCisgICBhIG1vdmluZyBzdGFjay1wb2ludGVyICovCitzdGF0aWMgbG9uZyBub3Rwb3BwZWQsZG9udHBvcCxzdGFja29mZnNldCxtYXhwdXNoZWQ7CisjZW5kaWYKKworc3RhdGljIGxvbmcgbG9jYWxzaXplLHJzYXZlc2l6ZSxhcmdzaXplOworCitzdGF0aWMgdm9pZCBlbWl0X29iaihGSUxFICpmLHN0cnVjdCBvYmogKnAsaW50IHQpOworCisvKiBjYWxjdWxhdGUgdGhlIGFjdHVhbCBjdXJyZW50IG9mZnNldCBvZiBhbiBvYmplY3QgcmVsYXRpdiB0byB0aGUKKyAgIHN0YWNrLXBvaW50ZXI7IHdlIHVzZSBhIGxheW91dCBsaWtlIHRoaXM6CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHwgYXJndW1lbnRzIHRvIHRoaXMgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgfAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB8IHJldHVybi1hZGRyZXNzIFtzaXplPTRdICAgICAgICAgICAgICAgICAgICAgIHwKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCBjYWxsZXItc2F2ZSByZWdpc3RlcnMgW3NpemU9cnNhdmVzaXplXSAgICAgICB8CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHwgbG9jYWwgdmFyaWFibGVzIFtzaXplPWxvY2Fsc2l6ZV0gICAgICAgICAgICAgfAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB8IGFyZ3VtZW50cyB0byBjYWxsZWQgZnVuY3Rpb25zIFtzaXplPWFyZ3NpemVdIHwKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgQWxsIHNpemVzIHdpbGwgYmUgYWxpZ25lZCBhcyBuZWNlc3NhcnkuCisgICBJbiB0aGUgY2FzZSBvZiBGSVhFRF9TUCwgdGhlIHN0YWNrLXBvaW50ZXIgd2lsbCBiZSBhZGp1c3RlZCBhdAorICAgZnVuY3Rpb24tZW50cnkgdG8gbGVhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgYXJndW1lbnRzIGFuZCBoYXZlIGl0CisgICBhbGlnbmVkIHRvIDE2IGJ5dGVzLiBUaGVyZWZvcmUsIHdoZW4gY2FsbGluZyBhIGZ1bmN0aW9uLCB0aGUKKyAgIHN0YWNrLXBvaW50ZXIgaXMgYWx3YXlzIGFsaWduZWQgdG8gMTYgYnl0ZXMuCisgICBGb3IgYSBtb3Zpbmcgc3RhY2stcG9pbnRlciwgdGhlIHN0YWNrLXBvaW50ZXIgd2lsbCB1c3VhbGx5IHBvaW50CisgICB0byB0aGUgYm90dG9tIG9mIHRoZSBhcmVhIGZvciBsb2NhbCB2YXJpYWJsZXMsIGJ1dCB3aWxsIG1vdmUgd2hpbGUKKyAgIGFyZ3VtZW50cyBhcmUgcHV0IG9uIHRoZSBzdGFjay4KKworICAgVGhpcyBpcyBqdXN0IGFuIGV4YW1wbGUgbGF5b3V0LiBPdGhlciBsYXlvdXRzIGFyZSBhbHNvIHBvc3NpYmxlLgorKi8KKworc3RhdGljIGxvbmcgcmVhbF9vZmZzZXQoc3RydWN0IG9iaiAqbykKK3sKKyAgbG9uZyBvZmY9em0ybChvLT52LT5vZmZzZXQpOworICBpZihvZmY8MCl7CisgICAgLyogZnVuY3Rpb24gcGFyYW1ldGVyICovCisgICAgb2ZmPWxvY2Fsc2l6ZStyc2F2ZXNpemUrNC1vZmYtem0ybChtYXhhbGlnbik7CisgIH0KKworI2lmIEZJWEVEX1NQCisgIG9mZis9YXJnc2l6ZTsKKyNlbHNlCisgIG9mZis9c3RhY2tvZmZzZXQ7CisjZW5kaWYKKyAgb2ZmKz16bTJsKG8tPnZhbC52bWF4KTsKKyAgcmV0dXJuIG9mZjsKK30KKworLyogIEluaXRpYWxpemVzIGFuIGFkZHJlc3NpbmctbW9kZSBzdHJ1Y3R1cmUgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvCisgICAgdGhhdCBvYmplY3QuIFdpbGwgbm90IHN1cnZpdmUgYSBzZWNvbmQgY2FsbCEgKi8KK3N0YXRpYyBzdHJ1Y3Qgb2JqICpjYW0oaW50IGZsYWdzLGludCBiYXNlLGxvbmcgb2Zmc2V0KQoreworICBzdGF0aWMgc3RydWN0IG9iaiBvYmo7CisgIHN0YXRpYyBzdHJ1Y3QgQWRkcmVzc2luZ01vZGUgYW07CisgIG9iai5hbT0mYW07CisgIGFtLmZsYWdzPWZsYWdzOworICBhbS5iYXNlPWJhc2U7CisgIGFtLm9mZnNldD1vZmZzZXQ7CisgIHJldHVybiAmb2JqOworfQorCisvKiBjaGFuZ2VzIHRvIGEgc3BlY2lhbCBzZWN0aW9uLCB1c2VkIGZvciBfX3NlY3Rpb24oKSAqLworc3RhdGljIGludCBzcGVjaWFsX3NlY3Rpb24oRklMRSAqZixzdHJ1Y3QgVmFyICp2KQoreworICBjaGFyICpzZWM7CisgIGlmKCF2LT52YXR0cikgcmV0dXJuIDA7CisgIHNlYz1zdHJzdHIodi0+dmF0dHIsInNlY3Rpb24oIik7CisgIGlmKCFzZWMpIHJldHVybiAwOworICBzZWMrPXN0cmxlbigic2VjdGlvbigiKTsKKyAgZW1pdChmLCJcdC5zZWN0aW9uXHQiKTsKKyAgd2hpbGUoKnNlYyYmKnNlYyE9JyknKSBlbWl0X2NoYXIoZiwqc2VjKyspOworICBlbWl0KGYsIlxuIik7CisgIGlmKGYpIHNlY3Rpb249U1BFQ0lBTDsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIGdlbmVyYXRlIGNvZGUgdG8gbG9hZCB0aGUgYWRkcmVzcyBvZiBhIHZhcmlhYmxlIGludG8gcmVnaXN0ZXIgciAqLworc3RhdGljIHZvaWQgbG9hZF9hZGRyZXNzKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdHlwZSkKKy8qICBHZW5lcmF0ZXMgY29kZSB0byBsb2FkIHRoZSBhZGRyZXNzIG9mIGEgdmFyaWFibGUgaW50byByZWdpc3RlciByLiAgICovCit7CisgIGlmKCEoby0+ZmxhZ3MmVkFSKSkgaWVycm9yKDApOworICBpZihvLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CisgICAgbG9uZyBvZmY9cmVhbF9vZmZzZXQobyk7CisgICAgaWYoVEhSRUVfQUREUil7CisgICAgICBlbWl0KGYsIlx0YWRkLiVzXHQlcywlcywlbGRcbiIsZHQoUE9JTlRFUikscmVnbmFtZXNbcl0scmVnbmFtZXNbc3BdLG9mZik7CisgICAgfWVsc2V7CisgICAgICBlbWl0KGYsIlx0bW92LiVzXHQlcywlc1xuIixkdChQT0lOVEVSKSxyZWduYW1lc1tyXSxyZWduYW1lc1tzcF0pOworICAgICAgaWYob2ZmKQorCWVtaXQoZiwiXHRhZGQuJXNcdCVzLCVsZFxuIixkdChQT0lOVEVSKSxyZWduYW1lc1tyXSxvZmYpOworICAgIH0KKyAgfWVsc2V7CisgICAgZW1pdChmLCJcdG1vdi4lc1x0JXMsIixkdChQT0lOVEVSKSxyZWduYW1lc1tyXSk7CisgICAgZW1pdF9vYmooZixvLHR5cGUpOworICAgIGVtaXQoZiwiXG4iKTsKKyAgfQorfQorLyogR2VuZXJhdGVzIGNvZGUgdG8gbG9hZCBhIG1lbW9yeSBvYmplY3QgaW50byByZWdpc3RlciByLiB0bXAgaXMgYQorICAgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIHdoaWNoIG1heSBiZSB1c2VkLiB0bXAgY2FuIGJlIHIuICovCitzdGF0aWMgdm9pZCBsb2FkX3JlZyhGSUxFICpmLGludCByLHN0cnVjdCBvYmogKm8saW50IHR5cGUpCit7CisgIHR5cGUmPU5VOworICBpZihvLT5mbGFncyZWQVJBRFIpeworICAgIGxvYWRfYWRkcmVzcyhmLHIsbyxQT0lOVEVSKTsKKyAgfWVsc2V7CisgICAgaWYoKG8tPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJm8tPnJlZz09cikKKyAgICAgIHJldHVybjsKKyAgICBlbWl0KGYsIlx0bW92LiVzXHQlcywiLGR0KHR5cGUpLHJlZ25hbWVzW3JdKTsKKyAgICBlbWl0X29iaihmLG8sdHlwZSk7CisgICAgZW1pdChmLCJcbiIpOworICB9Cit9CisKKy8qICBHZW5lcmF0ZXMgY29kZSB0byBzdG9yZSByZWdpc3RlciByIGludG8gbWVtb3J5IG9iamVjdCBvLiAqLworc3RhdGljIHZvaWQgc3RvcmVfcmVnKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdHlwZSkKK3sKKyAgdHlwZSY9TlE7CisgIGVtaXQoZiwiXHRtb3YuJXNcdCIsZHQodHlwZSkpOworICBlbWl0X29iaihmLG8sdHlwZSk7CisgIGVtaXQoZiwiLCVzXG4iLHJlZ25hbWVzW3JdKTsKK30KKworLyogIFlpZWxkcyBsb2cyKHgpKzEgb3IgMC4gKi8KK3N0YXRpYyBsb25nIHBvZjIoenVtYXggeCkKK3sKKyAgenVtYXggcDtpbnQgbG49MTsKKyAgcD11bDJ6dW0oMUwpOworICB3aGlsZShsbjw9MzImJnp1bWxlcShwLHgpKXsKKyAgICBpZih6dW1lcXRvKHgscCkpIHJldHVybiBsbjsKKyAgICBsbisrO3A9enVtYWRkKHAscCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgSUMgKnByZWxvYWQoRklMRSAqLHN0cnVjdCBJQyAqKTsKKworc3RhdGljIHZvaWQgZnVuY3Rpb25fdG9wKEZJTEUgKixzdHJ1Y3QgVmFyICosbG9uZyk7CitzdGF0aWMgdm9pZCBmdW5jdGlvbl9ib3R0b20oRklMRSAqZixzdHJ1Y3QgVmFyICosbG9uZyk7CisKKyNkZWZpbmUgaXNyZWcoeCkgKChwLT54LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpCisjZGVmaW5lIGlzY29uc3QoeCkgKChwLT54LmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKQorCitzdGF0aWMgaW50IHExcmVnLHEycmVnLHpyZWc7CisKK3N0YXRpYyBjaGFyICpjY3NbXT17ImVxIiwibmUiLCJsdCIsImdlIiwibGUiLCJndCIsIiJ9Oworc3RhdGljIGNoYXIgKmxvZ2ljYWxzW109eyJvciIsInhvciIsImFuZCJ9Oworc3RhdGljIGNoYXIgKmFyaXRobWV0aWNzW109eyJzbHciLCJzcnciLCJhZGQiLCJzdWIiLCJtdWxsdyIsImRpdnciLCJtb2QifTsKKworLyogY29tcGFyZSBpZiB0d28gb2JqZWN0cyBhcmUgdGhlIHNhbWUgKi8KK3N0YXRpYyBpbnQgY29tcGFyZV9vYmplY3RzKHN0cnVjdCBvYmogKm8xLHN0cnVjdCBvYmogKm8yKQoreworICBpZigobzEtPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJihvMi0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmbzEtPnJlZz09bzItPnJlZykKKyAgICByZXR1cm4gMTsKKyAgaWYobzEtPmZsYWdzPT1vMi0+ZmxhZ3MmJm8xLT5hbT09bzItPmFtKXsKKyAgICBpZighKG8xLT5mbGFncyZWQVIpfHwobzEtPnY9PW8yLT52JiZ6bWVxdG8obzEtPnZhbC52bWF4LG8yLT52YWwudm1heCkpKXsKKyAgICAgIGlmKCEobzEtPmZsYWdzJlJFRyl8fG8xLT5yZWc9PW8yLT5yZWcpeworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIERvZXMgc29tZSBwcmUtcHJvY2Vzc2luZyBsaWtlIGZldGNoaW5nIG9wZXJhbmRzIGZyb20gbWVtb3J5IHRvCisgICByZWdpc3RlcnMgZXRjLiAqLworc3RhdGljIHN0cnVjdCBJQyAqcHJlbG9hZChGSUxFICpmLHN0cnVjdCBJQyAqcCkKK3sKKyAgaW50IHI7CisKKyAgaWYoaXNyZWcocTEpKQorICAgIHExcmVnPXAtPnExLnJlZzsKKyAgZWxzZQorICAgIHExcmVnPTA7CisKKyAgaWYoaXNyZWcocTIpKQorICAgIHEycmVnPXAtPnEyLnJlZzsKKyAgZWxzZQorICAgIHEycmVnPTA7CisKKyAgaWYoaXNyZWcoeikmJihUSFJFRV9BRERSfHwhY29tcGFyZV9vYmplY3RzKCZwLT5xMiwmcC0+eikpKXsKKyAgICB6cmVnPXAtPnoucmVnOworICB9ZWxzZXsKKyAgICBpZihJU0ZMT0FUKHp0eXAocCkpKQorICAgICAgenJlZz1mMTsKKyAgICBlbHNlCisgICAgICB6cmVnPXQxOworICB9CisgIAorICBpZigocC0+cTEuZmxhZ3MmKERSRUZPQkp8UkVHKSk9PURSRUZPQkomJiFwLT5xMS5hbSl7CisgICAgcC0+cTEuZmxhZ3MmPX5EUkVGT0JKOworICAgIGxvYWRfcmVnKGYsdDEsJnAtPnExLHExdHlwKHApKTsKKyAgICBwLT5xMS5yZWc9dDE7CisgICAgcC0+cTEuZmxhZ3N8PShSRUd8RFJFRk9CSik7CisgIH0KKyAgaWYocC0+cTEuZmxhZ3MmJkxPQURfU1RPUkUmJiFpc3JlZyhxMSkpeworICAgIGlmKHAtPmNvZGU9PUFTU0lHTiYmaXNyZWcoeikpCisgICAgICBxMXJlZz1wLT56LnJlZzsKKyAgICBlbHNlIGlmKElTRkxPQVQocTF0eXAocCkpKQorICAgICAgcTFyZWc9ZjE7CisgICAgZWxzZQorICAgICAgcTFyZWc9dDE7CisgICAgbG9hZF9yZWcoZixxMXJlZywmcC0+cTEscTF0eXAocCkpOworICAgIHAtPnExLnJlZz1xMXJlZzsKKyAgICBwLT5xMS5mbGFncz1SRUc7CisgIH0KKworICBpZigocC0+cTIuZmxhZ3MmKERSRUZPQkp8UkVHKSk9PURSRUZPQkomJiFwLT5xMi5hbSl7CisgICAgcC0+cTIuZmxhZ3MmPX5EUkVGT0JKOworICAgIGxvYWRfcmVnKGYsdDEsJnAtPnEyLHEydHlwKHApKTsKKyAgICBwLT5xMi5yZWc9dDE7CisgICAgcC0+cTIuZmxhZ3N8PShSRUd8RFJFRk9CSik7CisgIH0KKyAgaWYocC0+cTIuZmxhZ3MmJkxPQURfU1RPUkUmJiFpc3JlZyhxMikpeworICAgIGlmKElTRkxPQVQocTJ0eXAocCkpKQorICAgICAgcTJyZWc9ZjI7CisgICAgZWxzZQorICAgICAgcTJyZWc9dDI7CisgICAgbG9hZF9yZWcoZixxMnJlZywmcC0+cTIscTJ0eXAocCkpOworICAgIHAtPnEyLnJlZz1xMnJlZzsKKyAgICBwLT5xMi5mbGFncz1SRUc7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisKKy8qIHNhdmUgdGhlIHJlc3VsdCAoaW4genJlZykgaW50byBwLT56ICovCit2b2lkIHNhdmVfcmVzdWx0KEZJTEUgKmYsc3RydWN0IElDICpwKQoreworICBpZigocC0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09RFJFRk9CSiYmIXAtPnouYW0peworICAgIHAtPnouZmxhZ3MmPX5EUkVGT0JKOworICAgIGxvYWRfcmVnKGYsdDIsJnAtPnosUE9JTlRFUik7CisgICAgcC0+ei5yZWc9dDI7CisgICAgcC0+ei5mbGFnc3w9KFJFR3xEUkVGT0JKKTsKKyAgfQorICBpZihpc3JlZyh6KSl7CisgICAgaWYocC0+ei5yZWchPXpyZWcpCisgICAgICBlbWl0KGYsIlx0bW92LiVzXHQlcywlc1xuIixkdCh6dHlwKHApKSxyZWduYW1lc1twLT56LnJlZ10scmVnbmFtZXNbenJlZ10pOworICB9ZWxzZXsKKyAgICBzdG9yZV9yZWcoZix6cmVnLCZwLT56LHp0eXAocCkpOworICB9Cit9CisKKy8qIHByaW50cyBhbiBvYmplY3QgKi8KK3N0YXRpYyB2b2lkIGVtaXRfb2JqKEZJTEUgKmYsc3RydWN0IG9iaiAqcCxpbnQgdCkKK3sKKyAgaWYocC0+YW0peworICAgIGlmKHAtPmFtLT5mbGFncyZHUFJfSU5EKSBlbWl0KGYsIiglcywlcykiLHJlZ25hbWVzW3AtPmFtLT5vZmZzZXRdLHJlZ25hbWVzW3AtPmFtLT5iYXNlXSk7CisgICAgaWYocC0+YW0tPmZsYWdzJklNTV9JTkQpIGVtaXQoZiwiKCVsZCwlcykiLHAtPmFtLT5vZmZzZXQscmVnbmFtZXNbcC0+YW0tPmJhc2VdKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYoKHAtPmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PShLT05TVHxEUkVGT0JKKSl7CisgICAgZW1pdHZhbChmLCZwLT52YWwscC0+ZHR5cCZOVSk7CisgICAgcmV0dXJuOworICB9CisgIGlmKHAtPmZsYWdzJkRSRUZPQkopIGVtaXQoZiwiKCIpOworICBpZihwLT5mbGFncyZSRUcpeworICAgIGVtaXQoZiwiJXMiLHJlZ25hbWVzW3AtPnJlZ10pOworICB9ZWxzZSBpZihwLT5mbGFncyZWQVIpIHsKKyAgICBpZihwLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikKKyAgICAgIGVtaXQoZiwiJWxkKCVzKSIscmVhbF9vZmZzZXQocCkscmVnbmFtZXNbc3BdKTsKKyAgICBlbHNleworICAgICAgaWYoIXptZXF0byhsMnptKDBMKSxwLT52YWwudm1heCkpe2VtaXR2YWwoZiwmcC0+dmFsLExPTkcpO2VtaXQoZiwiKyIpO30KKyAgICAgIGlmKHAtPnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQyl7CisgICAgICAgIGVtaXQoZiwiJXMlbGQiLGxhYnByZWZpeCx6bTJsKHAtPnYtPm9mZnNldCkpOworICAgICAgfWVsc2V7CisgICAgICAgIGVtaXQoZiwiJXMlcyIsaWRwcmVmaXgscC0+di0+aWRlbnRpZmllcik7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKHAtPmZsYWdzJktPTlNUKXsKKyAgICBlbWl0dmFsKGYsJnAtPnZhbCx0Jk5VKTsKKyAgfQorICBpZihwLT5mbGFncyZEUkVGT0JKKSBlbWl0KGYsIikiKTsKK30KKworLyogIFRlc3QgaWYgdGhlcmUgaXMgYSBzZXF1ZW5jZSBvZiBGUkVFUkVHcyBjb250YWluaW5nIEZSRUVSRUcgcmVnLgorICAgIFVzZWQgYnkgcGVlcGhvbGUuICovCitzdGF0aWMgaW50IGV4aXN0c19mcmVlcmVnKHN0cnVjdCBJQyAqcCxpbnQgcmVnKQoreworICB3aGlsZShwJiYocC0+Y29kZT09RlJFRVJFR3x8cC0+Y29kZT09QUxMT0NSRUcpKXsKKyAgICBpZihwLT5jb2RlPT1GUkVFUkVHJiZwLT5xMS5yZWc9PXJlZykgcmV0dXJuIDE7CisgICAgcD1wLT5uZXh0OworICB9CisgIHJldHVybiAwOworfQorCisvKiBzZWFyY2ggZm9yIHBvc3NpYmxlIGFkZHJlc3NpbmctbW9kZXMgKi8KK3N0YXRpYyB2b2lkIHBlZXBob2xlKHN0cnVjdCBJQyAqcCkKK3sKKyAgaW50IGMsYzIscjtzdHJ1Y3QgSUMgKnAyO3N0cnVjdCBBZGRyZXNzaW5nTW9kZSAqYW07CisKKyAgZm9yKDtwO3A9cC0+bmV4dCl7CisgICAgYz1wLT5jb2RlOworICAgIGlmKGMhPUZSRUVSRUcmJmMhPUFMTE9DUkVHJiYoYyE9U0VUUkVUVVJOfHwhaXNyZWcocTEpfHxwLT5xMS5yZWchPXAtPnoucmVnKSkgZXhpdF9sYWJlbD0wOworICAgIGlmKGM9PUxBQkVMKSBleGl0X2xhYmVsPXAtPnR5cGY7CisKKyAgICAvKiBUcnkgY29uc3QocmVnKSAqLworICAgIGlmKElNTV9JTkQmJihjPT1BRERJMlB8fGM9PVNVQklGUCkmJmlzcmVnKHopJiYocC0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworICAgICAgaW50IGJhc2U7em1heCBvZjtzdHJ1Y3Qgb2JqICpvOworICAgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHAtPnR5cGYpOworICAgICAgaWYoYz09U1VCSUZQKSBvZj16bXN1YihsMnptKDBMKSx2bWF4KTsgZWxzZSBvZj12bWF4OworICAgICAgaWYoMS8qem1sZXEobDJ6bSgtMzI3NjhMKSx2bWF4KSYmem1sZXEodm1heCxsMnptKDMyNzY3TCkpKi8peworCXI9cC0+ei5yZWc7CisJaWYoaXNyZWcocTEpKSBiYXNlPXAtPnExLnJlZzsgZWxzZSBiYXNlPXI7CisJbz0wOworCWZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKwkgIGMyPXAyLT5jb2RlOworCSAgaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKKwkgIGlmKGMyIT1GUkVFUkVHJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMS5yZWc9PXIpIGJyZWFrOworCSAgaWYoYzIhPUZSRUVSRUcmJihwMi0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnEyLnJlZz09cikgYnJlYWs7CisJICBpZihjMiE9Q0FMTCYmKGMyPExBQkVMfHxjMj5CUkEpLyomJmMyIT1BRERSRVNTKi8peworCSAgICBpZighcDItPnExLmFtJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTEucmVnPT1yKXsKKwkgICAgICBpZihvKSBicmVhazsKKwkgICAgICBvPSZwMi0+cTE7CisJICAgIH0KKwkgICAgaWYoIXAyLT5xMi5hbSYmKHAyLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnEyLnJlZz09cil7CisJICAgICAgaWYobykgYnJlYWs7CisJICAgICAgbz0mcDItPnEyOworCSAgICB9CisJICAgIGlmKCFwMi0+ei5hbSYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+ei5yZWc9PXIpeworCSAgICAgIGlmKG8pIGJyZWFrOworCSAgICAgIG89JnAyLT56OworCSAgICB9CisJICB9CisJICBpZihjMj09RlJFRVJFR3x8KHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpeworCSAgICBpbnQgbTsKKwkgICAgaWYoYzI9PUZSRUVSRUcpCisJICAgICAgbT1wMi0+cTEucmVnOworCSAgICBlbHNlCisJICAgICAgbT1wMi0+ei5yZWc7CisJICAgIGlmKG09PXIpeworCSAgICAgIGlmKG8peworCQlvLT5hbT1hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CisJCWFtLT5mbGFncz1JTU1fSU5EOworCQlhbS0+YmFzZT1iYXNlOworCQlhbS0+b2Zmc2V0PXptMmwob2YpOworCQlpZihpc3JlZyhxMSkpeworCQkgIHAtPmNvZGU9Yz1OT1A7cC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworCQl9ZWxzZXsKKwkJICBwLT5jb2RlPWM9QVNTSUdOO3AtPnEyLmZsYWdzPTA7CisJCSAgcC0+dHlwZj1wLT50eXBmMjtwLT5xMi52YWwudm1heD1zaXpldGFiW3AtPnR5cGYyJk5RXTsKKwkJfQorCSAgICAgIH0KKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgICBpZihjMiE9RlJFRVJFRyYmbT09YmFzZSkgYnJlYWs7CisJICAgIGNvbnRpbnVlOworCSAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8qIFRyeSByZWcscmVnICovCisgICAgaWYoR1BSX0lORCYmYz09QURESTJQJiZpc3JlZyhxMikmJmlzcmVnKHopJiYoaXNyZWcocTEpfHxwLT5xMi5yZWchPXAtPnoucmVnKSl7CisgICAgICBpbnQgYmFzZSxpZHg7c3RydWN0IG9iaiAqbzsKKyAgICAgIHI9cC0+ei5yZWc7aWR4PXAtPnEyLnJlZzsKKyAgICAgIGlmKGlzcmVnKHExKSkgYmFzZT1wLT5xMS5yZWc7IGVsc2UgYmFzZT1yOworICAgICAgbz0wOworICAgICAgZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpeworICAgICAgICBjMj1wMi0+Y29kZTsKKyAgICAgICAgaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKKyAgICAgICAgaWYoYzIhPUZSRUVSRUcmJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09cikgYnJlYWs7CisgICAgICAgIGlmKGMyIT1GUkVFUkVHJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMi5yZWc9PXIpIGJyZWFrOworICAgICAgICBpZigocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnoucmVnPT1pZHgmJmlkeCE9cikgYnJlYWs7CisJCisgICAgICAgIGlmKGMyIT1DQUxMJiYoYzI8TEFCRUx8fGMyPkJSQSkvKiYmYzIhPUFERFJFU1MqLyl7CisgICAgICAgICAgaWYoIXAyLT5xMS5hbSYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnExLnJlZz09cil7CisgICAgICAgICAgICBpZihvfHwocTF0eXAocDIpJk5RKT09TExPTkcpIGJyZWFrOworICAgICAgICAgICAgbz0mcDItPnExOworICAgICAgICAgIH0KKyAgICAgICAgICBpZighcDItPnEyLmFtJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTIucmVnPT1yKXsKKyAgICAgICAgICAgIGlmKG98fChxMnR5cChwMikmTlEpPT1MTE9ORykgYnJlYWs7CisgICAgICAgICAgICBvPSZwMi0+cTI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKCFwMi0+ei5hbSYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+ei5yZWc9PXIpeworICAgICAgICAgICAgaWYob3x8KHp0eXAocDIpJk5RKT09TExPTkcpIGJyZWFrOworICAgICAgICAgICAgbz0mcDItPno7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKGMyPT1GUkVFUkVHfHwocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgICAgICAgaW50IG07CisgICAgICAgICAgaWYoYzI9PUZSRUVSRUcpCisgICAgICAgICAgICBtPXAyLT5xMS5yZWc7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbT1wMi0+ei5yZWc7CisgICAgICAgICAgaWYobT09cil7CisgICAgICAgICAgICBpZihvKXsKKyAgICAgICAgICAgICAgby0+YW09YW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworICAgICAgICAgICAgICBhbS0+ZmxhZ3M9R1BSX0lORDsKKyAgICAgICAgICAgICAgYW0tPmJhc2U9YmFzZTsKKyAgICAgICAgICAgICAgYW0tPm9mZnNldD1pZHg7CisJICAgICAgaWYoaXNyZWcocTEpKXsKKwkJcC0+Y29kZT1jPU5PUDtwLT5xMS5mbGFncz1wLT5xMi5mbGFncz1wLT56LmZsYWdzPTA7CisJICAgICAgfWVsc2V7CisJCXAtPmNvZGU9Yz1BU1NJR047cC0+cTIuZmxhZ3M9MDsKKwkJcC0+dHlwZj1wLT50eXBmMjtwLT5xMi52YWwudm1heD1zaXpldGFiW3AtPnR5cGYyJk5RXTsKKwkgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYoYzIhPUZSRUVSRUcmJm09PWJhc2UpIGJyZWFrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8qIGdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gZW50cnkgY29kZSAqLworc3RhdGljIHZvaWQgZnVuY3Rpb25fdG9wKEZJTEUgKmYsc3RydWN0IFZhciAqdixsb25nIG9mZnNldCkKK3sKKyAgcnNhdmVzaXplPTA7CisgIGlmKCFzcGVjaWFsX3NlY3Rpb24oZix2KSYmc2VjdGlvbiE9Q09ERSl7ZW1pdChmLGNvZGVuYW1lKTtpZihmKSBzZWN0aW9uPUNPREU7fSAKKyAgaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKKyAgICBpZigodi0+ZmxhZ3MmKElOTElORUZVTkN8SU5MSU5FRVhUKSkhPUlOTElORUZVTkMpCisgICAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXMlc1xuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICBlbWl0KGYsIiVzJXM6XG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICB9ZWxzZQorICAgIGVtaXQoZiwiJXMlbGQ6XG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworfQorLyogZ2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBleGl0IGNvZGUgKi8KK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX2JvdHRvbShGSUxFICpmLHN0cnVjdCBWYXIgKnYsbG9uZyBvZmZzZXQpCit7CisgIGVtaXQoZixyZXQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBFbmQgb2YgcHJpdmF0ZSBkYXRhIGFuZCBmdW5jdGlvbnMuICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICBEb2VzIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbnMgZm9yIHRoZSBjb2RlLWdlbmVyYXRvci4gR2V0cyBjYWxsZWQgICovCisvKiAgb25jZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCBzaG91bGQgcmV0dXJuIDAgaW4gY2FzZSBvZiBwcm9ibGVtcy4gICAgICAqLworaW50IGluaXRfY2codm9pZCkKK3sKKyAgaW50IGk7CisgIC8qICBJbml0aWFsaXplIHNvbWUgdmFsdWVzIHdoaWNoIGNhbm5vdCBiZSBzdGF0aWNhbGx5IGluaXRpYWxpemVkICAgKi8KKyAgLyogIGJlY2F1c2UgdGhleSBhcmUgc3RvcmVkIGluIHRoZSB0YXJnZXQncyBhcml0aG1ldGljLiAgICAgICAgICAgICAqLworICBtYXhhbGlnbj1sMnptKDhMKTsKKyAgY2hhcl9iaXQ9bDJ6bSg4TCk7CisgIHN0YWNrYWxpZ249bDJ6bSg0KTsKKworICBmb3IoaT0wO2k8PU1BWF9UWVBFO2krKyl7CisgICAgc2l6ZXRhYltpXT1sMnptKG1zaXpldGFiW2ldKTsKKyAgICBhbGlnbltpXT1sMnptKG1hbGlnbltpXSk7CisgIH0KKworICByZWduYW1lc1swXT0ibm9yZWciOworICBmb3IoaT1GSVJTVF9HUFI7aTw9TEFTVF9HUFI7aSsrKXsKKyAgICByZWduYW1lc1tpXT1teW1hbGxvYygxMCk7CisgICAgc3ByaW50ZihyZWduYW1lc1tpXSwiZ3ByJWQiLGktRklSU1RfR1BSKTsKKyAgICByZWdzaXplW2ldPWwyem0oNEwpOworICAgIHJlZ3R5cGVbaV09Jmx0eXA7CisgIH0KKyAgZm9yKGk9RklSU1RfRlBSO2k8PUxBU1RfRlBSO2krKyl7CisgICAgcmVnbmFtZXNbaV09bXltYWxsb2MoMTApOworICAgIHNwcmludGYocmVnbmFtZXNbaV0sImZwciVkIixpLUZJUlNUX0ZQUik7CisgICAgcmVnc2l6ZVtpXT1sMnptKDhMKTsKKyAgICByZWd0eXBlW2ldPSZsZGJsOworICB9CisgIGZvcihpPUZJUlNUX0NDUjtpPD1MQVNUX0NDUjtpKyspeworICAgIHJlZ25hbWVzW2ldPW15bWFsbG9jKDEwKTsKKyAgICBzcHJpbnRmKHJlZ25hbWVzW2ldLCJjY3IlZCIsaS1GSVJTVF9DQ1IpOworICAgIHJlZ3NpemVbaV09bDJ6bSgxTCk7CisgICAgcmVndHlwZVtpXT0mbGNoYXI7CisgIH0KKworICAvKiAgVXNlIG11bHRpcGxlIGNjcy4gICAqLworICBtdWx0aXBsZV9jY3M9MDsKKworICAvKiAgSW5pdGlhbGl6ZSB0aGUgbWluL21heC1zZXR0aW5ncy4gTm90ZSB0aGF0IHRoZSB0eXBlcyBvZiB0aGUgICAgICovCisgIC8qICBob3N0IHN5c3RlbSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIHRhcmdldCBzeXN0ZW0gYW5kIHlvdSBtYXkgKi8KKyAgLyogIG9ubHkgdXNlIHRoZSBzbWFsbGVzdCBtYXhpbXVtIHZhbHVlcyBBTlNJIGd1YXJhbnRlZXMgaWYgeW91ICAgICAqLworICAvKiAgd2FudCB0byBiZSBwb3J0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBUaGF0J3MgdGhlIHJlYXNvbiBmb3IgdGhlIHN1YnRyYWN0aW9uIGluIHRfbWluW0lOVF0uIExvbmcgY291bGQgKi8KKyAgLyogIGJlIHVuYWJsZSB0byByZXByZXNlbnQgLTIxNDc0ODM2NDggb24gdGhlIGhvc3Qgc3lzdGVtLiAgICAgICAgICAqLworICB0X21pbltDSEFSXT1sMnptKC0xMjhMKTsKKyAgdF9taW5bU0hPUlRdPWwyem0oLTMyNzY4TCk7CisgIHRfbWluW0lOVF09em1zdWIobDJ6bSgtMjE0NzQ4MzY0N0wpLGwyem0oMUwpKTsKKyAgdF9taW5bTE9OR109dF9taW4oSU5UKTsKKyAgdF9taW5bTExPTkddPXptbHNoaWZ0KGwyem0oMUwpLGwyem0oNjNMKSk7CisgIHRfbWluW01BWElOVF09dF9taW4oTExPTkcpOworICB0X21heFtDSEFSXT11bDJ6dW0oMTI3TCk7CisgIHRfbWF4W1NIT1JUXT11bDJ6dW0oMzI3NjdVTCk7CisgIHRfbWF4W0lOVF09dWwyenVtKDIxNDc0ODM2NDdVTCk7CisgIHRfbWF4W0xPTkddPXRfbWF4KElOVCk7CisgIHRfbWF4W0xMT05HXT16dW1yc2hpZnQoenVta29tcGwodWwyenVtKDBVTCkpLHVsMnp1bSgxVUwpKTsKKyAgdF9tYXhbTUFYSU5UXT10X21heChMTE9ORyk7CisgIHR1X21heFtDSEFSXT11bDJ6dW0oMjU1VUwpOworICB0dV9tYXhbU0hPUlRdPXVsMnp1bSg2NTUzNVVMKTsKKyAgdHVfbWF4W0lOVF09dWwyenVtKDQyOTQ5NjcyOTVVTCk7CisgIHR1X21heFtMT05HXT10X21heChVTlNJR05FRHxJTlQpOworICB0dV9tYXhbTExPTkddPXp1bWtvbXBsKHVsMnp1bSgwVUwpKTsKKyAgdHVfbWF4W01BWElOVF09dF9tYXgoVU5TSUdORUR8TExPTkcpOworICAKKyAgLyogIFJlc2VydmUgYSBmZXcgcmVnaXN0ZXJzIGZvciB1c2UgYnkgdGhlIGNvZGUtZ2VuZXJhdG9yLiAgICAgICovCisgIC8qICBUaGlzIGlzIG5vdCBvcHRpbWFsIGJ1dCBzaW1wbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzcD1GSVJTVF9HUFI7CisgIHQxPUZJUlNUX0dQUisxOworICB0Mj1GSVJTVF9HUFIrMjsKKyAgZjE9RklSU1RfRlBSOworICBmMj1GSVJTVF9GUFIrMTsKKyAgcmVnc2FbdDFdPXJlZ3NhW3QyXT0xOworICByZWdzYVtmMV09cmVnc2FbZjJdPTE7CisgIHJlZ3NhW3NwXT0xOworICByZWdzY3JhdGNoW3QxXT1yZWdzY3JhdGNoW3QyXT0wOworICByZWdzY3JhdGNoW2YxXT1yZWdzY3JhdGNoW2YyXT0wOworICByZWdzY3JhdGNoW3NwXT0wOworCisgIGZvcihpPUZJUlNUX0dQUjtpPD1MQVNUX0dQUi1WT0xfR1BSUztpKyspCisgICAgcmVnc2NyYXRjaFtpXT0xOworICBmb3IoaT1GSVJTVF9GUFI7aTw9TEFTVF9GUFItVk9MX0ZQUlM7aSsrKQorICAgIHJlZ3NjcmF0Y2hbaV09MTsKKyAgZm9yKGk9RklSU1RfQ0NSO2k8PUxBU1RfQ0NSLVZPTF9DQ1JTO2krKykKKyAgICByZWdzY3JhdGNoW2ldPTE7CisKKyAgdGFyZ2V0X21hY3Jvcz1tYXJyYXk7CisKKworICByZXR1cm4gMTsKK30KKwordm9pZCBpbml0X2RiKEZJTEUgKmYpCit7Cit9CisKK2ludCBmcmV0dXJuKHN0cnVjdCBUeXAgKnQpCisvKiAgUmV0dXJucyB0aGUgcmVnaXN0ZXIgaW4gd2hpY2ggdmFyaWFibGVzIG9mIHR5cGUgdCBhcmUgcmV0dXJuZWQuICovCisvKiAgSWYgdGhlIHZhbHVlIGNhbm5vdCBiZSByZXR1cm5lZCBpbiBhIHJlZ2lzdGVyIHJldHVybnMgMC4gICAgICAgICovCisvKiAgQSBwb2ludGVyIE1VU1QgYmUgcmV0dXJuZWQgaW4gYSByZWdpc3Rlci4gVGhlIGNvZGUtZ2VuZXJhdG9yICAgICovCisvKiAgaGFzIHRvIHNpbXVsYXRlIGEgcHNldWRvIHJlZ2lzdGVyIGlmIG5lY2Vzc2FyeS4gICAgICAgICAgICAgICAgICovCit7CisgIGlmKElTRkxPQVQodC0+ZmxhZ3MpKSAKKyAgICByZXR1cm4gRklSU1RfRlBSKzI7CisgIGlmKElTU1RSVUNUKHQtPmZsYWdzKXx8SVNVTklPTih0LT5mbGFncykpIAorICAgIHJldHVybiAwOworICBpZih6bWxlcShzem9mKHQpLGwyem0oNEwpKSkgCisgICAgcmV0dXJuIEZJUlNUX0dQUiszOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCByZWdfcGFpcihpbnQgcixzdHJ1Y3QgcnBhaXIgKnApCisvKiBSZXR1cm5zIDAgaWYgdGhlIHJlZ2lzdGVyIGlzIG5vIHJlZ2lzdGVyIHBhaXIuIElmIHIgICovCisvKiBpcyBhIHJlZ2lzdGVyIHBhaXIgbm9uLXplcm8gd2lsbCBiZSByZXR1cm5lZCBhbmQgdGhlICovCisvKiBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBwIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHR3byAgICovCisvKiBlbGVtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIHJldHVybiAwOworfQorCisvKiBlc3RpbWF0ZSB0aGUgY29zdC1zYXZpbmcgaWYgb2JqZWN0IG8gZnJvbSBJQyBwIGlzIHBsYWNlZCBpbgorICAgcmVnaXN0ZXIgciAqLworaW50IGNvc3Rfc2F2aW5ncyhzdHJ1Y3QgSUMgKnAsaW50IHIsc3RydWN0IG9iaiAqbykKK3sKKyAgaW50IGM9cC0+Y29kZTsKKyAgaWYoby0+ZmxhZ3MmVktPTlNUKXsKKyAgICBpZighTE9BRF9TVE9SRSkKKyAgICAgIHJldHVybiAwOworICAgIGlmKG89PSZwLT5xMSYmcC0+Y29kZT09QVNTSUdOJiYocC0+ei5mbGFncyZEUkVGT0JKKSkKKyAgICAgIHJldHVybiA0OworICAgIGVsc2UKKyAgICAgIHJldHVybiAyOworICB9CisgIGlmKG8tPmZsYWdzJkRSRUZPQkopCisgICAgcmV0dXJuIDQ7CisgIGlmKGM9PVNFVFJFVFVSTiYmcj09cC0+ei5yZWcmJiEoby0+ZmxhZ3MmRFJFRk9CSikpIHJldHVybiAzOworICBpZihjPT1HRVRSRVRVUk4mJnI9PXAtPnExLnJlZyYmIShvLT5mbGFncyZEUkVGT0JKKSkgcmV0dXJuIDM7CisgIHJldHVybiAyOworfQorCitpbnQgcmVnb2soaW50IHIsaW50IHQsaW50IG1vZGUpCisvKiAgUmV0dXJucyAwIGlmIHJlZ2lzdGVyIHIgY2Fubm90IHN0b3JlIHZhcmlhYmxlcyBvZiAgICovCisvKiAgdHlwZSB0LiBJZiB0PT1QT0lOVEVSIGFuZCBtb2RlIT0wIHRoZW4gaXQgcmV0dXJucyAgICovCisvKiAgbm9uLXplcm8gb25seSBpZiB0aGUgcmVnaXN0ZXIgY2FuIHN0b3JlIGEgcG9pbnRlciAgICovCisvKiAgYW5kIGRlcmVmZXJlbmNlIGEgcG9pbnRlciB0byBtb2RlLiAgICAgICAgICAgICAgICAgICovCit7CisgIGlmKHI9PTApCisgICAgcmV0dXJuIDA7CisgIHQmPU5ROworICBpZih0PT0wJiZyPj1GSVJTVF9DQ1ImJnI8PUxBU1RfQ0NSKQorICAgIHJldHVybiAxOworICBpZihJU0ZMT0FUKHQpJiZyPj1GSVJTVF9GUFImJnI8PUxBU1RfRlBSKQorICAgIHJldHVybiAxOworICBpZih0PT1QT0lOVEVSJiZyPj1GSVJTVF9HUFImJnI8PUxBU1RfR1BSKQorICAgIHJldHVybiAxOworICBpZih0Pj1DSEFSJiZ0PD1MT05HJiZyPj1GSVJTVF9HUFImJnI8PUxBU1RfR1BSKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworaW50IGRhbmdlcm91c19JQyhzdHJ1Y3QgSUMgKnApCisvKiAgUmV0dXJucyB6ZXJvIGlmIHRoZSBJQyBwIGNhbiBiZSBzYWZlbHkgZXhlY3V0ZWQgICAgICovCisvKiAgd2l0aG91dCBkYW5nZXIgb2YgZXhjZXB0aW9ucyBvciBzaW1pbGFyIHRoaW5ncy4gICAgICovCisvKiAgdmJjYyBtYXkgZ2VuZXJhdGUgY29kZSBpbiB3aGljaCBub24tZGFuZ2Vyb3VzIElDcyAgICovCisvKiAgYXJlIHNvbWV0aW1lcyBleGVjdXRlZCBhbHRob3VnaCBjb250cm9sLWZsb3cgbWF5ICAgICovCisvKiAgbmV2ZXIgcmVhY2ggdGhlbSAobWFpbmx5IHdoZW4gbW92aW5nIGNvbXB1dGF0aW9ucyAgICovCisvKiAgb3V0IG9mIGxvb3BzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVHlwaWNhbCBJQ3MgdGhhdCBnZW5lcmF0ZSBleGNlcHRpb25zIG9uIHNvbWUgICAgICAgICovCisvKiAgbWFjaGluZXMgYXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gYWNjZXNzZXMgdmlhIHBvaW50ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gZGl2aXNpb24vbW9kdWxvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gb3ZlcmZsb3cgb24gc2lnbmVkIGludGVnZXIvZmxvYXRzICAgICAgICAgICAgICovCit7CisgIGludCBjPXAtPmNvZGU7CisgIGlmKChwLT5xMS5mbGFncyZEUkVGT0JKKXx8KHAtPnEyLmZsYWdzJkRSRUZPQkopfHwocC0+ei5mbGFncyZEUkVGT0JKKSkKKyAgICByZXR1cm4gMTsKKyAgaWYoKGM9PURJVnx8Yz09TU9EKSYmIWlzY29uc3QocTIpKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworaW50IG11c3RfY29udmVydChpbnQgbyxpbnQgdCxpbnQgY29uc3RfZXhwcikKKy8qICBSZXR1cm5zIHplcm8gaWYgY29kZSBmb3IgY29udmVydGluZyBucCB0byB0eXBlIHQgICAgKi8KKy8qICBjYW4gYmUgb21pdHRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBPbiB0aGUgUG93ZXJQQyBjcHUgcG9pbnRlcnMgYW5kIDMyYml0ICAgICAgICAgICAgICAgKi8KKy8qICBpbnRlZ2VycyBoYXZlIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uIGFuZCBjYW4gdXNlICAgKi8KKy8qICB0aGUgc2FtZSByZWdpc3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IG9wPW8mTlEsdHA9dCZOUTsKKyAgaWYoKG9wPT1JTlR8fG9wPT1MT05HfHxvcD09UE9JTlRFUikmJih0cD09SU5UfHx0cD09TE9OR3x8dHA9PVBPSU5URVIpKQorICAgIHJldHVybiAwOworICBpZihvcD09RE9VQkxFJiZ0cD09TERPVUJMRSkgcmV0dXJuIDA7CisgIGlmKG9wPT1MRE9VQkxFJiZ0cD09RE9VQkxFKSByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgZ2VuX2RzKEZJTEUgKmYsem1heCBzaXplLHN0cnVjdCBUeXAgKnQpCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIDxzaXplPiBieXRlcyBvZiBzdG9yYWdlICovCisvKiAgaW5pdGlhbGl6ZWQgd2l0aCB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGlmKG5ld29iaiYmc2VjdGlvbiE9U1BFQ0lBTCkKKyAgICBlbWl0KGYsIiVsZFxuIix6bTJsKHNpemUpKTsKKyAgZWxzZQorICAgIGVtaXQoZiwiXHQuc3BhY2VcdCVsZFxuIix6bTJsKHNpemUpKTsKKyAgbmV3b2JqPTA7Cit9CisKK3ZvaWQgZ2VuX2FsaWduKEZJTEUgKmYsem1heCBhbGlnbikKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBtYWtlIHN1cmUgdGhlIG5leHQgZGF0YSBpcyAgICAgKi8KKy8qICBhbGlnbmVkIHRvIG11bHRpcGxlcyBvZiA8YWxpZ24+IGJ5dGVzLiAgICAgICAgICAgICAgKi8KK3sKKyAgaWYoem0ybChhbGlnbik+MSkgZW1pdChmLCJcdC5hbGlnblx0MlxuIik7Cit9CisKK3ZvaWQgZ2VuX3Zhcl9oZWFkKEZJTEUgKmYsc3RydWN0IFZhciAqdikKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjcmVhdGUgdGhlIGhlYWQgb2YgYSB2YXJpYWJsZSAgKi8KKy8qICBkZWZpbml0aW9uLCBpLmUuIHRoZSBsYWJlbCBhbmQgaW5mb3JtYXRpb24gZm9yICAgICAgKi8KKy8qICBsaW5rYWdlIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGNvbnN0ZmxhZztjaGFyICpzZWM7CisgIGlmKHYtPmNsaXN0KSBjb25zdGZsYWc9aXNfY29uc3Qodi0+dnR5cCk7CisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQyl7CisgICAgaWYoSVNGVU5DKHYtPnZ0eXAtPmZsYWdzKSkgcmV0dXJuOworICAgIGlmKCFzcGVjaWFsX3NlY3Rpb24oZix2KSl7CisgICAgICBpZih2LT5jbGlzdCYmKCFjb25zdGZsYWd8fChnX2ZsYWdzWzJdJlVTRURGTEFHKSkmJnNlY3Rpb24hPURBVEEpe2VtaXQoZixkYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1EQVRBO30KKyAgICAgIGlmKHYtPmNsaXN0JiZjb25zdGZsYWcmJiEoZ19mbGFnc1syXSZVU0VERkxBRykmJnNlY3Rpb24hPVJPREFUQSl7ZW1pdChmLHJvZGF0YW5hbWUpO2lmKGYpIHNlY3Rpb249Uk9EQVRBO30KKyAgICAgIGlmKCF2LT5jbGlzdCYmc2VjdGlvbiE9QlNTKXtlbWl0KGYsYnNzbmFtZSk7aWYoZikgc2VjdGlvbj1CU1M7fQorICAgIH0KKyAgICBpZih2LT5jbGlzdHx8c2VjdGlvbj09U1BFQ0lBTCl7CisgICAgICBnZW5fYWxpZ24oZixmYWxpZ24odi0+dnR5cCkpOworICAgICAgZW1pdChmLCIlcyVsZDpcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgfWVsc2UKKyAgICAgIGVtaXQoZiwiXHQubGNvbW1cdCVzJWxkLCIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgbmV3b2JqPTE7CisgIH0KKyAgaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKKyAgICBlbWl0KGYsIlx0Lmdsb2JsXHQlcyVzXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgIGlmKHYtPmZsYWdzJihERUZJTkVEfFRFTlRBVElWRSkpeworICAgICAgaWYoIXNwZWNpYWxfc2VjdGlvbihmLHYpKXsKKwlpZih2LT5jbGlzdCYmKCFjb25zdGZsYWd8fChnX2ZsYWdzWzJdJlVTRURGTEFHKSkmJnNlY3Rpb24hPURBVEEpe2VtaXQoZixkYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1EQVRBO30KKwlpZih2LT5jbGlzdCYmY29uc3RmbGFnJiYhKGdfZmxhZ3NbMl0mVVNFREZMQUcpJiZzZWN0aW9uIT1ST0RBVEEpe2VtaXQoZixyb2RhdGFuYW1lKTtpZihmKSBzZWN0aW9uPVJPREFUQTt9CisJaWYoIXYtPmNsaXN0JiZzZWN0aW9uIT1CU1Mpe2VtaXQoZixic3NuYW1lKTtpZihmKSBzZWN0aW9uPUJTUzt9CisgICAgICB9CisgICAgICBpZih2LT5jbGlzdHx8c2VjdGlvbj09U1BFQ0lBTCl7CisJZ2VuX2FsaWduKGYsZmFsaWduKHYtPnZ0eXApKTsKKyAgICAgICAgZW1pdChmLCIlcyVzOlxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICAgIH1lbHNlCisgICAgICAgIGVtaXQoZiwiXHQuZ2xvYmFsXHQlcyVzXG5cdC4lc2NvbW1cdCVzJXMsIixpZHByZWZpeCx2LT5pZGVudGlmaWVyLChVU0VfQ09NTU9OUz8iIjoibCIpLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgICAgbmV3b2JqPTE7CisgICAgfQorICB9Cit9CisKK3ZvaWQgZ2VuX2RjKEZJTEUgKmYsaW50IHQsc3RydWN0IGNvbnN0X2xpc3QgKnApCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIHN0YXRpYyBzdG9yYWdlICAgICAgICAgICovCisvKiAgaW5pdGlhbGl6ZWQgd2l0aCBjb25zdC1saXN0IHAuICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGVtaXQoZiwiXHRkYy4lc1x0IixkdCh0Jk5RKSk7CisgIGlmKCFwLT50cmVlKXsKKyAgICBpZihJU0ZMT0FUKHQpKXsKKyAgICAgIC8qICBhdWNoIHdpZWRlciBuaWNodCBzZWhyIHNjaG9lbiB1bmQgSUVFRSBub2V0aWcgICAqLworICAgICAgdW5zaWduZWQgY2hhciAqaXA7CisgICAgICBpcD0odW5zaWduZWQgY2hhciAqKSZwLT52YWwudmRvdWJsZTsKKyAgICAgIGVtaXQoZiwiMHglMDJ4JTAyeCUwMnglMDJ4IixpcFswXSxpcFsxXSxpcFsyXSxpcFszXSk7CisgICAgICBpZigodCZOUSkhPUZMT0FUKXsKKwllbWl0KGYsIiwweCUwMnglMDJ4JTAyeCUwMngiLGlwWzRdLGlwWzVdLGlwWzZdLGlwWzddKTsKKyAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgIGVtaXR2YWwoZiwmcC0+dmFsLHQmTlUpOworICAgIH0KKyAgfWVsc2V7CisgICAgZW1pdF9vYmooZiwmcC0+dHJlZS0+byx0Jk5VKTsKKyAgfQorICBlbWl0KGYsIlxuIik7bmV3b2JqPTA7Cit9CisKKworLyogIFRoZSBtYWluIGNvZGUtZ2VuZXJhdGlvbiByb3V0aW5lLiAgICAgICAgICAgICAgICAgICAqLworLyogIGYgaXMgdGhlIHN0cmVhbSB0aGUgY29kZSBzaG91bGQgYmUgd3JpdHRlbiB0by4gICAgICAqLworLyogIHAgaXMgYSBwb2ludGVyIHRvIGEgZG91Ymx5IGxpbmtlZCBsaXN0IG9mIElDcyAgICAgICAqLworLyogIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIGJvZHkgdG8gZ2VuZXJhdGUgY29kZSBmb3IuICAqLworLyogIHYgaXMgYSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAqLworLyogIG9mZnNldCBpcyB0aGUgc2l6ZSBvZiB0aGUgc3RhY2tmcmFtZSB0aGUgZnVuY3Rpb24gICAqLworLyogIG5lZWRzIGZvciBsb2NhbCB2YXJpYWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCit2b2lkIGdlbl9jb2RlKEZJTEUgKmYsc3RydWN0IElDICpwLHN0cnVjdCBWYXIgKnYsem1heCBvZmZzZXQpCisvKiAgVGhlIG1haW4gY29kZS1nZW5lcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgYyx0LGk7CisgIHN0cnVjdCBJQyAqbTsKKyAgYXJnc2l6ZT0wOworICBpZihERUJVRyYxKSBwcmludGYoImdlbl9jb2RlKClcbiIpOworICBmb3IoYz0xO2M8PU1BWFI7YysrKSByZWdzW2NdPXJlZ3NhW2NdOworICBtYXhwdXNoZWQ9MDsKKworICAvKkZJWE1FKi8KKyAgcmV0PSJcdHJ0c1xuIjsKKworICBmb3IobT1wO207bT1tLT5uZXh0KXsKKyAgICBjPW0tPmNvZGU7dD1tLT50eXBmJk5VOworICAgIGlmKGM9PUFMTE9DUkVHKSB7cmVnc1ttLT5xMS5yZWddPTE7Y29udGludWU7fQorICAgIGlmKGM9PUZSRUVSRUcpIHtyZWdzW20tPnExLnJlZ109MDtjb250aW51ZTt9CisKKyAgICAvKiBjb252ZXJ0IE1VTFQvRElWL01PRCB3aXRoIHBvd2VycyBvZiB0d28gKi8KKyAgICBpZigodCZOUSk8PUxPTkcmJihtLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCYmKHQmTlEpPD1MT05HJiYoYz09TVVMVHx8KChjPT1ESVZ8fGM9PU1PRCkmJih0JlVOU0lHTkVEKSkpKXsKKyAgICAgIGV2YWxfY29uc3QoJm0tPnEyLnZhbCx0KTsKKyAgICAgIGk9cG9mMih2bWF4KTsKKyAgICAgIGlmKGkpeworICAgICAgICBpZihjPT1NT0QpeworICAgICAgICAgIHZtYXg9em1zdWIodm1heCxsMnptKDFMKSk7CisgICAgICAgICAgbS0+Y29kZT1BTkQ7CisgICAgICAgIH1lbHNleworICAgICAgICAgIHZtYXg9bDJ6bShpLTEpOworICAgICAgICAgIGlmKGM9PURJVikgbS0+Y29kZT1SU0hJRlQ7IGVsc2UgbS0+Y29kZT1MU0hJRlQ7CisgICAgICAgIH0KKyAgICAgICAgYz1tLT5jb2RlOworCWd2YWwudm1heD12bWF4OworCWV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKKwlpZihjPT1BTkQpeworCSAgaW5zZXJ0X2NvbnN0KCZtLT5xMi52YWwsdCk7CisJfWVsc2V7CisJICBpbnNlcnRfY29uc3QoJm0tPnEyLnZhbCxJTlQpOworCSAgcC0+dHlwZjI9SU5UOworCX0KKyAgICAgIH0KKyAgICB9CisjaWYgRklYRURfU1AKKyAgICBpZihjPT1DQUxMJiZhcmdzaXplPHptMmwobS0+cTIudmFsLnZtYXgpKSBhcmdzaXplPXptMmwobS0+cTIudmFsLnZtYXgpOworI2VuZGlmCisgIH0KKyAgcGVlcGhvbGUocCk7CisKKyAgZm9yKGM9MTtjPD1NQVhSO2MrKyl7CisgICAgaWYocmVnc2FbY118fHJlZ3VzZWRbY10peworICAgICAgQlNFVChyZWdzX21vZGlmaWVkLGMpOworICAgIH0KKyAgfQorCisgIGxvY2Fsc2l6ZT0oem0ybChvZmZzZXQpKzMpLzQqNDsKKyNpZiBGSVhFRF9TUAorICAvKkZJWE1FOiBhZGp1c3QgbG9jYWxzaXplIHRvIGdldCBhbiBhbGlnbmVkIHN0YWNrLWZyYW1lICovCisjZW5kaWYKKworICBmdW5jdGlvbl90b3AoZix2LGxvY2Fsc2l6ZSk7CisKKyNpZiBGSVhFRF9TUAorICBwdXNoZWQ9MDsKKyNlbmRpZgorCisgIGZvcig7cDtwPXAtPm5leHQpeworICAgIGM9cC0+Y29kZTt0PXAtPnR5cGY7CisgICAgaWYoYz09Tk9QKSB7cC0+ei5mbGFncz0wO2NvbnRpbnVlO30KKyAgICBpZihjPT1BTExPQ1JFRykge3JlZ3NbcC0+cTEucmVnXT0xO2NvbnRpbnVlO30KKyAgICBpZihjPT1GUkVFUkVHKSB7cmVnc1twLT5xMS5yZWddPTA7Y29udGludWU7fQorICAgIGlmKGM9PUxBQkVMKSB7ZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsdCk7Y29udGludWU7fQorICAgIGlmKGM9PUJSQSl7CisgICAgICBpZigwLyp0PT1leGl0X2xhYmVsJiZmcmFtZXNpemU9PTAqLykKKwllbWl0KGYscmV0KTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIlx0Ylx0JXMlZFxuIixsYWJwcmVmaXgsdCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz49QkVRJiZjPEJSQSl7CisgICAgICBlbWl0KGYsIlx0YiVzXHQiLGNjc1tjLUJFUV0pOworICAgICAgaWYoaXNyZWcocTEpKXsKKwllbWl0X29iaihmLCZwLT5xMSwwKTsKKwllbWl0KGYsIiwiKTsKKyAgICAgIH0KKyAgICAgIGVtaXQoZiwiJXMlZFxuIixsYWJwcmVmaXgsdCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09TU9WRVRPUkVHKXsKKyAgICAgIGxvYWRfcmVnKGYscC0+ei5yZWcsJnAtPnExLHJlZ3R5cGVbcC0+ei5yZWddLT5mbGFncyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09TU9WRUZST01SRUcpeworICAgICAgc3RvcmVfcmVnKGYscC0+ei5yZWcsJnAtPnExLHJlZ3R5cGVbcC0+ei5yZWddLT5mbGFncyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoKGM9PUFTU0lHTnx8Yz09UFVTSCkmJigodCZOUSk+UE9JTlRFUnx8KCh0Jk5RKT09Q0hBUiYmem0ybChwLT5xMi52YWwudm1heCkhPTEpKSl7CisgICAgICBpZXJyb3IoMCk7CisgICAgfQorICAgIC8qIHN3aXRjaCBjb21tdXRhdGl2ZSBvcGVyYW5kcyBpZiBzdWl0YWJsZSAqLworICAgIGlmKGM9PUFERHx8Yz09TVVMVHx8Yz09QU5EfHxjPT1YT1J8fGM9PU9SKXsKKyAgICAgIGlmKGNvbXBhcmVfb2JqZWN0cygmcC0+cTIsJnAtPnopKXsKKwlzdHJ1Y3Qgb2JqIHRtcDsKKwl0bXA9cC0+cTE7CisJcC0+cTE9cC0+cTI7CisJcC0+cTI9dG1wOworICAgICAgfQorICAgIH0KKworICAgIHA9cHJlbG9hZChmLHApOworICAgIGM9cC0+Y29kZTsKKyAgICBpZihjPT1TVUJQRlApIGM9U1VCOworICAgIGlmKGM9PUFEREkyUCkgYz1BREQ7CisgICAgaWYoYz09U1VCSUZQKSBjPVNVQjsKKyAgICBpZihjPT1DT05WRVJUKXsKKyAgICAgIGlmKElTRkxPQVQocTF0eXAocCkpfHxJU0ZMT0FUKHp0eXAocCkpKSBpZXJyb3IoMCk7CisgICAgICBpZihzaXpldGFiW3ExdHlwKHApJk5RXTxzaXpldGFiW3p0eXAocCkmTlFdKXsKKwlpZihxMXR5cChwKSZVTlNJR05FRCkKKwkgIGVtaXQoZiwiXHR6ZXh0LiVzXHQlc1xuIixkdChxMXR5cChwKSkscmVnbmFtZXNbenJlZ10pOworCWVsc2UKKwkgIGVtaXQoZiwiXHRzZXh0LiVzXHQlc1xuIixkdChxMXR5cChwKSkscmVnbmFtZXNbenJlZ10pOworICAgICAgfQorICAgICAgc2F2ZV9yZXN1bHQoZixwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1LT01QTEVNRU5UKXsKKyAgICAgIGxvYWRfcmVnKGYsenJlZywmcC0+cTEsdCk7CisgICAgICBlbWl0KGYsIlx0Y3BsLiVzXHQlc1xuIixkdCh0KSxyZWduYW1lc1t6cmVnXSk7CisgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PVNFVFJFVFVSTil7CisgICAgICBsb2FkX3JlZyhmLHAtPnoucmVnLCZwLT5xMSx0KTsKKyAgICAgIEJTRVQocmVnc19tb2RpZmllZCxwLT56LnJlZyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09R0VUUkVUVVJOKXsKKyAgICAgIGlmKHAtPnExLnJlZyl7CisgICAgICAgIHpyZWc9cC0+cTEucmVnOworCXNhdmVfcmVzdWx0KGYscCk7CisgICAgICB9ZWxzZQorICAgICAgICBwLT56LmZsYWdzPTA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09Q0FMTCl7CisgICAgICBpbnQgcmVnOworICAgICAgLypGSVhNRSovCisjaWYgMCAgICAgIAorICAgICAgaWYoc3RhY2tfdmFsaWQmJihwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiZwLT5xMS52LT5maSYmKHAtPnExLnYtPmZpLT5mbGFncyZBTExfU1RBQ0spKXsKKwlpZihmcmFtZXNpemUrenVtMnVsKHAtPnExLnYtPmZpLT5zdGFjazEpPnN0YWNrKQorCSAgc3RhY2s9ZnJhbWVzaXplK3p1bTJ1bChwLT5xMS52LT5maS0+c3RhY2sxKTsKKyAgICAgIH1lbHNlCisJc3RhY2tfdmFsaWQ9MDsKKyNlbmRpZgorICAgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJnAtPnExLnYtPmZpJiZwLT5xMS52LT5maS0+aW5saW5lX2FzbSl7CisgICAgICAgIGVtaXRfaW5saW5lX2FzbShmLHAtPnExLnYtPmZpLT5pbmxpbmVfYXNtKTsKKyAgICAgIH1lbHNleworCWVtaXQoZiwiXHRjYWxsXHQiKTsKKwllbWl0X29iaihmLCZwLT5xMSx0KTsKKwllbWl0KGYsIlxuIik7CisgICAgICB9CisgICAgICAvKkZJWE1FKi8KKyNpZiBGSVhFRF9TUAorICAgICAgcHVzaGVkLT16bTJsKHAtPnEyLnZhbC52bWF4KTsKKyNlbmRpZgorICAgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJnAtPnExLnYtPmZpJiYocC0+cTEudi0+ZmktPmZsYWdzJkFMTF9SRUdTKSl7CisJYnZ1bml0ZShyZWdzX21vZGlmaWVkLHAtPnExLnYtPmZpLT5yZWdzX21vZGlmaWVkLFJTSVpFKTsKKyAgICAgIH1lbHNleworCWludCBpOworCWZvcihpPTE7aTw9TUFYUjtpKyspeworCSAgaWYocmVnc2NyYXRjaFtpXSkgQlNFVChyZWdzX21vZGlmaWVkLGkpOworCX0KKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1BU1NJR058fGM9PVBVU0gpeworICAgICAgaWYodD09MCkgaWVycm9yKDApOworICAgICAgaWYoYz09UFVTSCl7CisjaWYgRklYRURfU1AKKwllbWl0KGYsIlx0bW92LiVzXHQlbGQoJXMpLCIsZHQodCkscHVzaGVkLHJlZ25hbWVzW3NwXSk7CisJZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJZW1pdChmLCJcbiIpOworCXB1c2hlZCs9em0ybChwLT5xMi52YWwudm1heCk7CisjZWxzZQorCWVtaXQoZiwiXHRwdXNoLiVzXHQiLGR0KHQpKTsKKwllbWl0X29iaihmLCZwLT5xMSx0KTsKKwllbWl0KGYsIlxuIik7CisJcHVzaCh6bTJsKHAtPnEyLnZhbC52bWF4KSk7CisjZW5kaWYKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PUFTU0lHTil7CisJbG9hZF9yZWcoZix6cmVnLCZwLT5xMSx0KTsKKwlzYXZlX3Jlc3VsdChmLHApOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PUFERFJFU1MpeworICAgICAgbG9hZF9hZGRyZXNzKGYsenJlZywmcC0+cTEsUE9JTlRFUik7CisgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PU1JTlVTKXsKKyAgICAgIGxvYWRfcmVnKGYsenJlZywmcC0+cTEsdCk7CisgICAgICBlbWl0KGYsIlx0bmVnLiVzXHQlc1xuIixkdCh0KSxyZWduYW1lc1t6cmVnXSk7CisgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PVRFU1QpeworICAgICAgZW1pdChmLCJcdHRzdC4lc1x0IixkdCh0KSk7CisgICAgICBpZihtdWx0aXBsZV9jY3MpCisJZW1pdChmLCIlcywiLHJlZ25hbWVzW3pyZWddKTsKKyAgICAgIGVtaXRfb2JqKGYsJnAtPnExLHQpOworICAgICAgZW1pdChmLCJcbiIpOworICAgICAgaWYobXVsdGlwbGVfY2NzKQorCXNhdmVfcmVzdWx0KGYscCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09Q09NUEFSRSl7CisgICAgICBlbWl0KGYsIlx0Y21wLiVzXHQiLGR0KHQpKTsKKyAgICAgIGlmKG11bHRpcGxlX2NjcykKKwllbWl0KGYsIiVzLCIscmVnbmFtZXNbenJlZ10pOworICAgICAgZW1pdF9vYmooZiwmcC0+cTEsdCk7CisgICAgICBlbWl0KGYsIiwiKTsKKyAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHQpOworICAgICAgZW1pdChmLCJcbiIpOworICAgICAgaWYobXVsdGlwbGVfY2NzKQorCXNhdmVfcmVzdWx0KGYscCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoKGM+PU9SJiZjPD1BTkQpfHwoYz49TFNISUZUJiZjPD1NT0QpKXsKKyAgICAgIGlmKCFUSFJFRV9BRERSKQorCWxvYWRfcmVnKGYsenJlZywmcC0+cTEsdCk7CisgICAgICBpZihjPj1PUiYmYzw9QU5EKQorCWVtaXQoZiwiXHQlcy4lc1x0JXMsIixsb2dpY2Fsc1tjLU9SXSxkdCh0KSxyZWduYW1lc1t6cmVnXSk7CisgICAgICBlbHNlCisJZW1pdChmLCJcdCVzLiVzXHQlcywiLGFyaXRobWV0aWNzW2MtTFNISUZUXSxkdCh0KSxyZWduYW1lc1t6cmVnXSk7CisgICAgICBpZihUSFJFRV9BRERSKXsKKwllbWl0X29iaihmLCZwLT5xMSx0KTsKKwllbWl0KGYsIiwiKTsKKyAgICAgIH0KKyAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHQpOworICAgICAgZW1pdChmLCJcbiIpOworICAgICAgc2F2ZV9yZXN1bHQoZixwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBwcmljMihzdGRvdXQscCk7CisgICAgaWVycm9yKDApOworICB9CisgIGZ1bmN0aW9uX2JvdHRvbShmLHYsbG9jYWxzaXplKTsKKyAgaWYoc3RhY2tfdmFsaWQpeworICAgIGlmKCF2LT5maSkgdi0+Zmk9bmV3X2ZpKCk7CisgICAgdi0+ZmktPmZsYWdzfD1BTExfU1RBQ0s7CisgICAgdi0+ZmktPnN0YWNrMT1zdGFjazsKKyAgfQorICBlbWl0KGYsIiMgc3RhY2tzaXplPSVsdSVzXG4iLHp1bTJ1bChzdGFjayksc3RhY2tfdmFsaWQ/IiI6Iis/PyIpOworfQorCitpbnQgc2hvcnRjdXQoaW50IGNvZGUsaW50IHR5cCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK2ludCByZWdfcGFybShzdHJ1Y3QgcmVnX2hhbmRsZSAqbSwgc3RydWN0IFR5cCAqdCxpbnQgdmFyYXJnLHN0cnVjdCBUeXAgKmQpCit7CisgIGludCBmOworICBmPXQtPmZsYWdzJk5ROworICBpZihmPD1MT05HfHxmPT1QT0lOVEVSKXsKKyAgICBpZihtLT5ncmVncz49R1BSX0FSR1MpCisgICAgICByZXR1cm4gMDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gRklSU1RfR1BSKzMrbS0+Z3JlZ3MrKzsKKyAgfQorICBpZihJU0ZMT0FUKGYpKXsKKyAgICBpZihtLT5mcmVncz49RlBSX0FSR1MpCisgICAgICByZXR1cm4gMDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gRklSU1RfRlBSKzIrbS0+ZnJlZ3MrKzsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IGhhbmRsZV9wcmFnbWEoY29uc3QgY2hhciAqcykKK3sKK30KK3ZvaWQgY2xlYW51cF9jZyhGSUxFICpmKQoreworfQordm9pZCBjbGVhbnVwX2RiKEZJTEUgKmYpCit7CisgIGlmKGYpIHNlY3Rpb249LTE7Cit9CisKZGlmZiAtLWdpdCBhL21hY2hpbmVzL2dlbmVyaWMvbWFjaGluZS5kdCBiL21hY2hpbmVzL2dlbmVyaWMvbWFjaGluZS5kdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MjZjOGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvZ2VuZXJpYy9tYWNoaW5lLmR0CkBAIC0wLDAgKzEsMTYgQEAKK1M4QlMKK1M4QlUKK1MxNkJTQkUgUzE2QlNMRQorUzE2QlVCRSBTMTZCVUxFCitTMzJCU0JFIFMzMkJTTEUKK1MzMkJVQkUgUzMyQlVMRQorUzMyQlNCRSBTMzJCU0xFCitTMzJCVUJFIFMzMkJVTEUKK1M2NEJTQkUgUzY0QlNMRQorUzY0QlVCRSBTNjRCVUxFCitTMzJCSUVFRUJFCitTNjRCSUVFRUJFCitTNjRCSUVFRUJFCitTMzJCVUJFIFMzMkJVTEUKKworCmRpZmYgLS1naXQgYS9tYWNoaW5lcy9nZW5lcmljL21hY2hpbmUuaCBiL21hY2hpbmVzL2dlbmVyaWMvbWFjaGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjExOGE0ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9nZW5lcmljL21hY2hpbmUuaApAQCAtMCwwICsxLDE1MSBAQAorLyogIEV4YW1wbGUgYmFja2VuZCBmb3IgdmJjYywgaXQgbW9kZWxzIGEgZ2VuZXJpYyAzMmJpdCBSSVNDIG9yIENJU0MKKyAgICBDUFUuCisKKyAgICBDb25maWd1cmFibGUgYXQgYnVpbGQtdGltZSBhcmU6CisgICAgLSBudW1iZXIgb2YgKDMyYml0KSBnZW5lcmFsLXB1cnBvc2UtcmVnaXN0ZXJzCisgICAgLSBudW1iZXIgb2YgKDY0Yml0KSBmbG9hdGluZy1wb2ludC1yZWdpc3RlcnMKKyAgICAtIG51bWJlciBvZiAoOGJpdCkgY29uZGl0aW9uLWNvZGUtcmVnaXN0ZXJzCisgICAgLSBtZWNoYW5pc20gZm9yIHN0YWNrLWFyZ3VtZW50cyAobW92aW5nIG90IGZpeGVkIHNwKQorCisgICAgSXQgYWxsb3dzIHRvIHNlbGVjdCBhcyBydW4tdGltZS1vcHRpb25zOgorICAgIC0gdHdvLSBvciB0aHJlZS1hZGRyZXNzIGNvZGUKKyAgICAtIG1lbW9yeSBvcGVyYW5kcyBvciBsb2FkLXN0b3JlLWFyY2hpdGVjdHVyZQorICAgIC0gbnVtYmVyIG9mIHJlZ2lzdGVyLWFyZ3VtZW50cworICAgIC0gbnVtYmVyIG9mIGNhbGxlci1zYXZlLXJlZ2lzdGVycworKi8KKworLyogYnVpbC10aW1lIGNvbmZpZ3VyYWJsZSBvcHRpb25zOiAqLworI2RlZmluZSBOVU1fR1BSUyAzMgorI2RlZmluZSBOVU1fRlBSUyAzMgorI2RlZmluZSBOVU1fQ0NSUyA4CisjZGVmaW5lIEZJWEVEX1NQIDEKKworI2luY2x1ZGUgImR0LmgiCisKKy8qIGludGVybmFsbHkgdXNlZCBieSB0aGUgYmFja2VuZCAqLworI2RlZmluZSBGSVJTVF9HUFIgMQorI2RlZmluZSBMQVNUX0dQUiAoRklSU1RfR1BSK05VTV9HUFJTLTEpCisjZGVmaW5lIEZJUlNUX0ZQUiAoTEFTVF9HUFIrMSkKKyNkZWZpbmUgTEFTVF9GUFIgKEZJUlNUX0ZQUitOVU1fRlBSUy0xKQorI2RlZmluZSBGSVJTVF9DQ1IgKExBU1RfRlBSKzEpCisjZGVmaW5lIExBU1RfQ0NSIChGSVJTVF9DQ1IrTlVNX0NDUlMtMSkKKworLyogIFRoaXMgc3RydWN0IGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBtYWNoaW5lLXNwZWNpZmljICAgICAgICAgICAqLworLyogIGFkZHJlc3NpbmctbW9kZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEN1cnJlbnRseSBwb3NzaWJsZSBhcmUgKGNvbnN0LGdwcikgYW5kIChncHIsZ3ByKSAgICAgICAgICAgICAgICAqLworc3RydWN0IEFkZHJlc3NpbmdNb2RleworICAgIGludCBmbGFnczsKKyAgICBpbnQgYmFzZTsKKyAgICBsb25nIG9mZnNldDsKK307CisKKy8qICBUaGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUuICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFYUiBOVU1fR1BSUytOVU1fRlBSUytOVU1fQ0NSUworCisvKiAgTnVtYmVyIG9mIGNvbW1hbmRsaW5lLW9wdGlvbnMgdGhlIGNvZGUtZ2VuZXJhdG9yIGFjY2VwdHMuICAgICAgICovCisjZGVmaW5lIE1BWEdGIDIwCisKKy8qICBJZiB0aGlzIGlzIHNldCB0byB6ZXJvIHZiY2Mgd2lsbCBub3QgZ2VuZXJhdGUgSUNzIHdoZXJlIHRoZSAgICAgKi8KKy8qICB0YXJnZXQgb3BlcmFuZCBpcyB0aGUgc2FtZSBhcyB0aGUgMm5kIHNvdXJjZSBvcGVyYW5kLiAgICAgICAgICAgKi8KKy8qICBUaGlzIGNhbiBzb21ldGltZXMgc2ltcGxpZnkgdGhlIGNvZGUtZ2VuZXJhdG9yLCBidXQgdXN1YWxseSAgICAgKi8KKy8qICB0aGUgY29kZSBpcyBiZXR0ZXIgaWYgdGhlIGNvZGUtZ2VuZXJhdG9yIGFsbG93cyBpdC4gICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNFUTJBU1ogMQorCisvKiAgVGhpcyBzcGVjaWZpZXMgdGhlIHNtYWxsZXN0IGludGVnZXIgdHlwZSB0aGF0IGNhbiBiZSBhZGRlZCB0byBhICovCisvKiAgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JTkFEREkyUCBJTlQKKworLyogIElmIHRoZSBieXRlcyBvZiBhbiBpbnRlZ2VyIGFyZSBvcmRlcmVkIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSAgICAqLworLyogIGJ5dGUgZmlyc3QgYW5kIHRoZW4gZGVjcmVhc2luZyBzZXQgQklHRU5ESUFOIHRvIDEuICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdFTkRJQU4gMQorCisvKiAgSWYgdGhlIGJ5dGVzIG9mIGFuIGludGVnZXIgYXJlIG9yZGVyZWQgbGVzdCBzaWduaWZpY2FudCBieXRlICAgICovCisvKiAgYnl0ZSBmaXJzdCBhbmQgdGhlbiBpbmNyZWFzaW5nIHNldCBMSVRUTEVFTkRJQU4gdG8gMS4gICAgICAgICAgICovCisjZGVmaW5lIExJVFRMRUVORElBTiAwCisKKy8qICBOb3RlIHRoYXQgQklHRU5ESUFOIGFuZCBMSVRUTEVFTkRJQU4gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gICAgKi8KKworLyogIElmIHN3aXRjaC1zdGF0ZW1lbnRzIHNob3VsZCBiZSBnZW5lcmF0ZWQgYXMgYSBzZXF1ZW5jZSBvZiAgICAgICAqLworLyogIFNVQixUU1QsQkVRIElDcyByYXRoZXIgdGhhbiBDT01QQVJFLEJFUSBJQ3Mgc2V0IHRoaXMgdG8gMS4gICAgICAqLworLyogIFRoaXMgY2FuIHlpZWxkIGJldHRlciBjb2RlIG9uIHNvbWUgbWFjaGluZXMuICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTV0lUQ0hTVUJTIDAKKworLyogIEluIG9wdGltaXppbmcgY29tcGlsYXRpb24gY2VydGFpbiBsaWJyYXJ5IG1lbWNweS9zdHJjcHktY2FsbHMgICAqLworLyogIHdpdGggbGVuZ3RoIGtub3duIGF0IGNvbXBpbGUtdGltZSB3aWxsIGJlIGlubGluZWQgdXNpbmcgYW4gICAgICAqLworLyogIEFTU0lHTi1JQyBpZiB0aGUgc2l6ZSBpcyBsZXNzIG9yIGVxdWFsIHRvIElOTElORU1FTUNQWS4gICAgICAgICAqLworLyogIFRoZSB0eXBlIHVzZWQgZm9yIHRoZSBBU1NJR04tSUMgd2lsbCBiZSBVTlNJR05FRHxDSEFSLiAgICAgICAgICAqLworI2RlZmluZSBJTkxJTkVNRU1DUFkgMTAyNAorCisvKiAgUGFyYW1ldGVycyBhcmUgc29tZXRpbWVzIHBhc3NlZCBpbiByZWdpc3RlcnMgd2l0aG91dCBfX3JlZy4gICAgICovCisjZGVmaW5lIEhBVkVfUkVHUEFSTVMgMQorCisvKiAgUGFyYW1ldGVycyBvbiB0aGUgc3RhY2sgc2hvdWxkIGJlIHB1c2hlZCBpbiBvcmRlciByYXRoZXIgdGhhbiAgICovCisvKiAgaW4gcmV2ZXJzZSBvcmRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9SREVSRURfUFVTSCBGSVhFRF9TUAorCisvKiAgU3RydWN0dXJlIGZvciByZWdfcGFybSgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdHJ1Y3QgcmVnX2hhbmRsZXsKKyAgICB1bnNpZ25lZCBsb25nIGdyZWdzOworICAgIHVuc2lnbmVkIGxvbmcgZnJlZ3M7Cit9OworCisvKiAgV2UgaGF2ZSBzb21lIHRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZSBhdHRyaWJ1dGVzLiAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBVkVfVEFSR0VUX0FUVFJJQlVURVMKKworLyogV2UgaGF2ZSB0YXJnZXQtc3BlY2lmaWMgcHJhZ21hcyAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9QUkFHTUFTCisKKy8qICBXZSBrZWVwIHRyYWNrIG9mIGFsbCByZWdpc3RlcnMgbW9kaWZpZWQgYnkgYSBmdW5jdGlvbi4gICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9SRUdTX01PRElGSUVEIDEKKworLyogV2UgaGF2ZSBhIGltcGxlbWVudCBvdXIgb3duIGNvc3QtZnVuY3Rpb25zIHRvIGFkYXB0IAorICAgcmVnaXN0ZXItYWxsb2NhdGlvbiAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9SQUxMT0MgMQorI2RlZmluZSBjb3N0X21vdmVfcmVnKHgseSkgMQorI2RlZmluZSBjb3N0X2xvYWRfcmVnKHgseSkgMgorI2RlZmluZSBjb3N0X3NhdmVfcmVnKHgseSkgMgorI2RlZmluZSBjb3N0X3B1c2hwb3BfcmVnKHgpIDMKKworLyogc2l6ZSBvZiBidWZmZXIgZm9yIGFzbS1vdXRwdXQsIHRoaXMgY2FuIGJlIHVzZWQgdG8gZG8KKyAgIHBlZXBob2xlLW9wdGltaXphdGlvbnMgb2YgdGhlIGdlbmVyYXRlZCBhc3NlbWJseS1vdXRwdXQgKi8KKyNkZWZpbmUgRU1JVF9CVUZfTEVOIDEwMjQgLyogc2hvdWxkIGJlIGVub3VnaCAqLworLyogbnVtYmVyIG9mIGFzbS1vdXRwdXQgbGluZXMgYnVmZmVyZWQgKi8KKyNkZWZpbmUgRU1JVF9CVUZfREVQVEggNAorCisvKiAgV2UgaGF2ZSBubyBhc21fcGVlcGhvbGUgdG8gb3B0aW1pemUgYXNzZW1ibHktb3V0cHV0ICovCisjZGVmaW5lIEhBVkVfVEFSR0VUX1BFRVBIT0xFIDAKKworLyogd2UgZG8gbm90IGhhdmUgYSBtYXJrX2VmZl9pY3MgZnVuY3Rpb24sIHRoaXMgaXMgdXNlZCB0byBwcmV2ZW50CisgICBvcHRpbWl6YXRpb25zIG9uIGNvZGUgd2hpY2ggY2FuIGFscmVhZHkgYmUgaW1wbGVtZW50ZWQgYnkgZWZmaWNpZW50CisgICBhc3NlbWJseSAqLworI3VuZGVmIEhBVkVfVEFSR0VUX0VGRl9JQworCisvKiB3ZSBvbmx5IG5lZWQgdGhlIHN0YW5kYXJkIGRhdGEgdHlwZXMgKG5vIGJpdC10eXBlcywgZGlmZmVyZW50IHBvaW50ZXJzCisgICBldGMuKSAqLworI3VuZGVmIEhBVkVfRVhUX1RZUEVTCisjdW5kZWYgSEFWRV9UR1RfUFJJTlRWQUwKKworLyogd2UgZG8gbm90IG5lZWQgZXh0cmEgZWxlbWVudHMgaW4gdGhlIElDICovCisjdW5kZWYgSEFWRV9FWFRfSUMKKworLyogd2UgZG8gbm90IHVzZSB1bnNpZ25lZCBpbnQgYXMgc2l6ZV90IChidXQgdW5zaWduZWQgbG9uZywgdGhlIGRlZmF1bHQpICovCisjZGVmaW5lIEhBVkVfSU5UX1NJWkVUIDEKKworLyogd2UgZG8gbm90IG5lZWQgcmVnaXN0ZXItcGFpcnMgKi8KKyN1bmRlZiBIQVZFX1JFR1BBSVJTCisKKworLyogZG8gbm90IGNyZWF0ZSBDT05WRVJUIElDcyBmcm9tIGludGVnZXJzIHNtYWxsZXIgdGhhbiBpbnQgdG8gZmxvYXRzICovCisjZGVmaW5lIE1JTl9JTlRfVE9fRkxPQVRfVFlQRSBJTlQKKworLyogZG8gbm90IGNyZWF0ZSBDT05WRVJUIElDcyBmcm9tIGZsb2F0cyB0byBpbnRzIHNtYWxsZXIgdGhhbiBpbnQgKi8KKyNkZWZpbmUgTUlOX0ZMT0FUX1RPX0lOVF9UWVBFIElOVAorCisvKiBkbyBub3QgY3JlYXRlIENPTlZFUlRfSUNzIGZyb20gZmxvYXRzIHRvIHVuc2lnbmVkIGludGVnZXJzICovCisjZGVmaW5lIEFWT0lEX0ZMT0FUX1RPX1VOU0lHTkVEIDEKKworLyogZG8gbm90IGNyZWF0ZSBDT05WRVJUX0lDcyBmcm9tIHVuc2lnbmVkIGludGVnZXJzIHRvIGZsb2F0cyAqLworI2RlZmluZSBBVk9JRF9VTlNJR05FRF9UT19GTE9BVCAxCisKKy8qIGNvbnZlcnQgbXVsdGlwbGljYXRpb25zL2RpdmlzaW9uIGJ5IHBvd2VycyBvZiB0d28gdG8gc2hpZnRzICovCisjZGVmaW5lIEhBVkVfUE9GMk9QVCAxCmRpZmYgLS1naXQgYS9tYWNoaW5lcy9oYzEyL21hY2hpbmUuYyBiL21hY2hpbmVzL2hjMTIvbWFjaGluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM2YmMyMzcKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9oYzEyL21hY2hpbmUuYwpAQCAtMCwwICsxLDM4NzIgQEAKKy8qICBDb2RlIGdlbmVyYXRvciBmb3IgTW90b3JvbGEgNjhoYzEyIG1pY3JvY29udHJvbGxlcnMuICAgICAgICAgICAgICAgKi8KKworLypUT0RPOgorICByZWdzX21vZGlmaWVkIGJlaSBzdHJ1Y3QtY29weQorICBzYXZpbmdzIHZlcmZlaW5lcm4KKyAgNC1CeXRlIENvcHkKKyAgW3N0YXRpY10gdGVzdGVuCisgIHBlZXBob2xlLVBhc3MgdW0gQUxMT0NSRUdzIHp1IGVudGZlcm5lbgorICBBQ0NfSU5EIChBY2h0dW5nPykKKyAgc3RydWN0LWNvcHkgUHJvYmxlbWbkbGxlCisgIGJhbmtlZAorICBiaXQKKyAgbG9uZyBsb25nLCBmbG9hdCwgZG91YmxlLCBsb25nIGRvdWJsZQorCisqLworCisjaW5jbHVkZSAic3VwcC5oIgorI2luY2x1ZGUgInZiYy5oIiAvKiBuaWNodCBzY2hvZW4sIGFiZXIgLi4uICovCisKK3N0YXRpYyBjaGFyIEZJTEVfW109X19GSUxFX187CisKKyNpbmNsdWRlICJkd2FyZjIuYyIKKworLyogIFB1YmxpYyBkYXRhIHRoYXQgTVVTVCBiZSB0aGVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIE5hbWUgYW5kIGNvcHlyaWdodC4gKi8KK2NoYXIgY2dfY29weXJpZ2h0W109InZiY2MgY29kZS1nZW5lcmF0b3IgZm9yIDY4MDkvNjgwMy82OGhjMTIgVjEuMCAoYykgaW4gMjAwMC0yMDIxIGJ5IFZvbGtlciBCYXJ0aGVsbWFubiI7CisKKy8qICBDb21tYW5kbGluZS1mbGFncyB0aGUgY29kZS1nZW5lcmF0b3IgYWNjZXB0cyAgICAgICAgICAgICAgICAqLworaW50IGdfZmxhZ3NbTUFYR0ZdPXtWQUxGTEFHLFZBTEZMQUcsMCwwLAorICAgICAgICAgICAgICAgICAgICAwLDAsMCwwLAorCQkgICAgMCwwfTsKK2NoYXIgKmdfZmxhZ3NfbmFtZVtNQVhHRl09eyJjcHUiLCJmcHUiLCJuby1kZWxheWVkLXBvcHBpbmciLCJjb25zdC1pbi1kYXRhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXJnZS1jb25zdGFudHMiLCJuby1wZWVwaG9sZSIsIm1lbS1jc2UiLCJhY2MtZ2xvYiIsCisJCQkgICAicGNyZWwiLCJkcmVsIiwibm8tY2hhci1hZGRpMnAiLCJub2R4Iiwibm91IiwiZG91YmxlNjQifTsKK3VuaW9uIHBwaSBnX2ZsYWdzX3ZhbFtNQVhHRl07CisKKy8qIFR5cGVuYW1lcyAobmVlZGVkIGJlY2F1c2Ugb2YgSEFWRV9FWFRfVFlQRVMpLiAqLworY2hhciAqdHlwbmFtZVtdPXsic3RyYW5nZSIsImJpdCIsImNoYXIiLCJzaG9ydCIsImludCIsImxvbmciLCJsb25nIGxvbmciLAorCQkgImZsb2F0IiwiZG91YmxlIiwibG9uZyBkb3VibGUiLCJ2b2lkIiwKKyAgICAgICAgICAgICAgICAgIm5lYXItcG9pbnRlciIsImZhci1wb2ludGVyIiwiaHVnZS1wb2ludGVyIiwKKwkJICJhcnJheSIsInN0cnVjdCIsInVuaW9uIiwiZW51bSIsImZ1bmN0aW9uIn07CisKKy8qICBBbGlnbm1lbnQtcmVxdWlyZW1lbnRzIGZvciBhbGwgdHlwZXMgaW4gYnl0ZXMuICAgICAgICAgICAgICAqLworem1heCBhbGlnbltNQVhfVFlQRSsxXTsKKworLyogIEFsaWdubWVudCB0aGF0IGlzIHN1ZmZpY2llbnQgZm9yIGV2ZXJ5IG9iamVjdC4gICAgICAgICAgICAgICovCit6bWF4IG1heGFsaWduOworCisvKiAgQ0hBUl9CSVQgb2YgdGhlIHRhcmdldCBtYWNoaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggY2hhcl9iaXQ7CisKKy8qICBTaXplcyBvZiBhbGwgZWxlbWVudGFyeSB0eXBlcyBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAqLworem1heCBzaXpldGFiW01BWF9UWVBFKzFdOworCisvKiAgTWluaW11bSBhbmQgTWF4aW11bSB2YWx1ZXMgZWFjaCB0eXBlIGNhbiBoYXZlLiAgICAgICAgICAgICAgKi8KKy8qICBNdXN0IGJlIGluaXRpYWxpemVkIGluIGluaXRfY2coKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworem1heCB0X21pbltNQVhfVFlQRSsxXTsKK3p1bWF4IHRfbWF4W01BWF9UWVBFKzFdOworenVtYXggdHVfbWF4W01BWF9UWVBFKzFdOworCisvKiAgTmFtZXMgb2YgYWxsIHJlZ2lzdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2NoYXIgKnJlZ25hbWVzW109eyJub3JlZyIsImQiLCJ4IiwieSIsInNwIiwidSIsImQveCJ9OworCisvKiAgVGhlIFNpemUgb2YgZWFjaCByZWdpc3RlciBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggcmVnc2l6ZVtNQVhSKzFdOworCisvKiAgVHlwZSB3aGljaCBjYW4gc3RvcmUgZWFjaCByZWdpc3Rlci4gKi8KK3N0cnVjdCBUeXAgKnJlZ3R5cGVbTUFYUisxXTsKKworLyogIHJlZ3NhW3JlZ10hPTAgaWYgYSBjZXJ0YWluIHJlZ2lzdGVyIGlzIGFsbG9jYXRlZCBhbmQgc2hvdWxkICovCisvKiAgbm90IGJlIHVzZWQgYnkgdGhlIGNvbXBpbGVyIHBhc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2ludCByZWdzYVtNQVhSKzFdOworCisvKiAgU3BlY2lmaWVzIHdoaWNoIHJlZ2lzdGVycyBtYXkgYmUgc2NyYXRjaGVkIGJ5IGZ1bmN0aW9ucy4gICAgKi8KK2ludCByZWdzY3JhdGNoW01BWFIrMV09ezAsMSwxLDAsMSwwLDF9OworCitpbnQgcmVnX3ByaW9bTUFYUisxXT17MCwwLDEsMSwwLDAsMX07CisKK3N0cnVjdCByZWdfaGFuZGxlIGVtcHR5X3JlZ19oYW5kbGU9ezB9OworCisvKiBOYW1lcyBvZiB0YXJnZXQtc3BlY2lmaWMgdmFyaWFibGUgYXR0cmlidXRlcy4gICAgICAgICAgICAgICAgKi8KK2NoYXIgKmdfYXR0cl9uYW1lW109eyJfX2ludGVycnVwdCIsIl9fZHBhZ2UiLDB9OworI2RlZmluZSBJTlRFUlJVUFQgMQorI2RlZmluZSBEUEFHRSAgICAgMgorCitpbnQgTUlOQURESTJQPUNIQVI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFNvbWUgcHJpdmF0ZSBkYXRhIGFuZCBmdW5jdGlvbnMuICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGxvbmcgbWFsaWduW01BWF9UWVBFKzFdPSAgezEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDF9Oworc3RhdGljIGxvbmcgbXNpemV0YWJbTUFYX1RZUEUrMV09ezAsMSwxLDIsMiw0LDQsNCw0LDQsMCwyLDQsNCwwLDAsMCwyLDB9OworCitzdHJ1Y3QgVHlwIGl0eXA9e1NIT1JUfSxsdHlwPXtMT05HfTsKKworI2RlZmluZSBEQVRBIDAKKyNkZWZpbmUgQlNTIDEKKyNkZWZpbmUgQ09ERSAyCisjZGVmaW5lIFJPREFUQSAzCisjZGVmaW5lIFNQRUNJQUwgNAorCitzdGF0aWMgaW50IHNlY3Rpb249LTEsbmV3b2JqLHNjbnQscHVzaGVkX2FjYzsKK3N0YXRpYyBjaGFyICpjb2RlbmFtZT0iXHQudGV4dFxuIiwKKyAgICAgICAgICAgICpkYXRhbmFtZT0iXHQuZGF0YVxuIiwKKyAgICAgICAgICAgICpic3NuYW1lPSJcdC5zZWN0aW9uXHQuYnNzXG4iLAorICAgICAgICAgICAgKnJvZGF0YW5hbWU9Ilx0LnNlY3Rpb25cdC5yb2RhdGFcbiI7CisKKyNkZWZpbmUgSU1NX0lORCAgMQorI2RlZmluZSBWQVJfSU5EICAyCisjZGVmaW5lIFBPU1RfSU5DIDMKKyNkZWZpbmUgUE9TVF9ERUMgNAorI2RlZmluZSBQUkVfSU5DICA1CisjZGVmaW5lIFBSRV9ERUMgIDYKKyNkZWZpbmUgQUNDX0lORCAgNworI2RlZmluZSBLT05TVElOQyA4CisKKy8qICh1c2VyKXN0YWNrLXBvaW50ZXIsIHBvaW50ZXItdG1wLCBpbnQtdG1wOyByZXNlcnZlZCBmb3IgY29tcGlsZXIgKi8KK3N0YXRpYyBpbnQgYWNjPTEsaXg9MixpeT0zLHNwPTQsaXU9NSxkeD02Oworc3RhdGljIHZvaWQgcHIoRklMRSAqLHN0cnVjdCBJQyAqKTsKK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX3RvcChGSUxFICosc3RydWN0IFZhciAqLGxvbmcpOworc3RhdGljIHZvaWQgZnVuY3Rpb25fYm90dG9tKEZJTEUgKmYsc3RydWN0IFZhciAqLGxvbmcpOworCitzdGF0aWMgY2hhciAqbWFycmF5W109eyJfX3NlY3Rpb24oeCx5KT1fX3ZhdHRyKFwic2VjdGlvbihcIiN4XCIsXCIjeVwiKVwiKSIsCisJCSAgICAgICAiX19IQzEyX18iLAorCQkgICAgICAgIl9fU0laRV9UX0lOVD0xIiwKKwkJICAgICAgICJfX2RpcmVjdD1fX3ZhdHRyKFwic2VjdGlvbihcXFwiZHBhZ2VcXFwiKVwiKSIsCisJCSAgICAgICAwfTsKKworI2RlZmluZSBpc3JlZyh4KSAoKHAtPnguZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRykKKyNkZWZpbmUgaXNjb25zdCh4KSAoKHAtPnguZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpCisKK3N0YXRpYyBsb25nIGxvZmYscm9mZixzdGFja29mZnNldCxub3Rwb3BwZWQsZG9udHBvcCxtYXhwdXNoZWQsc3RhY2s7CisKK3N0YXRpYyBjaGFyICp4X3RbXT17Ij8iLCIiLCJiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIn07CitzdGF0aWMgY2hhciAqY2NzW109eyJlcSIsIm5lIiwibHQiLCJnZSIsImxlIiwiZ3QifTsKK3N0YXRpYyBjaGFyICp1Y2NzW109eyJlcSIsIm5lIiwibG8iLCJocyIsImxzIiwiaGkifTsKK3N0YXRpYyBjaGFyICpsb2dpY2Fsc1tdPXsib3JhIiwiZW9yIiwiYW5kIn07CitzdGF0aWMgY2hhciAqZGN0W109eyIiLCIuYml0IiwiLmJ5dGUiLCIuMmJ5dGUiLCIuMmJ5dGUiLCIuNGJ5dGUiLCIuOGJ5dGUiLCIuNGJ5dGUiLCIuNGJ5dGUiLCIuNGJ5dGUiLAorCQkgICAgIih2b2lkKSIsIi4yYnl0ZSIsIi4zNGJ5dGUiLCIuMzRieXRlIn07CitzdGF0aWMgY2hhciAqaWRwcmVmaXg9IiIsKmxhYnByZWZpeD0iLmwiOworc3RhdGljIGludCBleGl0X2xhYmVsLGhhdmVfZnJhbWU7CitzdGF0aWMgY2hhciAqcmV0Oworc3RhdGljIGludCBzdGFja2NoZWNrbGFiZWw7CitzdGF0aWMgaW50IGZyYW1lX3VzZWQsc3RhY2tfdmFsaWQ7CitzdGF0aWMgaW50IENQVT02ODEyOworc3RhdGljIGludCBwY3JlbCxkcmVsOworc3RhdGljIGludCBza2lwX3JlbDsKK3N0YXRpYyBjaGFyICpqc3JpbnN0PSJqc3IiOworc3RhdGljIGNoYXIgKmptcGluc3Q9ImptcCI7CitzdGF0aWMgaW50IG5vZHgsbm91OworaW50IHN3aXRjaHN1YnM7CisKK3N0YXRpYyBpbnQgY2NfdDsKK3N0YXRpYyBzdHJ1Y3Qgb2JqICpjYzsKKworc3RhdGljIHN0cnVjdCBvYmogbW9iajsKKworI2RlZmluZSBTVFJfTkVBUiAibmVhciIKKyNkZWZpbmUgU1RSX0ZBUiAiZmFyIgorI2RlZmluZSBTVFJfSFVHRSAiaHVnZSIKKyNkZWZpbmUgU1RSX0JBRERSICJiYWRkciIKKworI2RlZmluZSBJU05VTEwoKSAoem1lcXRvKHZtYXgsbDJ6bSgwTCkpJiZ6dW1lcXRvKHZ1bWF4LHVsMnp1bSgwVUwpKSYmemxkZXF0byh2bGRvdWJsZSxkMnpsZCgwLjApKSkKKyNkZWZpbmUgSVNMV09SRCh0KSAoKHQmTlEpPT1MT05HfHwodCZOUSk9PUZQT0lOVEVSfHwodCZOUSk9PUhQT0lOVEVSfHxJU0ZMT0FUKHQmTlEpKQorI2RlZmluZSBJU0hXT1JEKHQpICgodCZOUSk9PUlOVHx8KHQmTlEpPT1TSE9SVHx8KHQmTlEpPT1OUE9JTlRFUikKKyNkZWZpbmUgSVNDSFdPUkQodCkgKCh0Jk5RKT09Q0hBUnx8SVNIV09SRCh0KSkKKyNkZWZpbmUgSVNDSEFSKHQpICgodCZOUSk9PUNIQVIpCisjZGVmaW5lIElTU1RBVElDKHYpICgodiktPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTnx8KHYpLT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpCisjZGVmaW5lIElTQkFERFIodikgKCh2KS0+dnR5cC0+YXR0ciYmc3Ryc3RyKFNUUl9CQUREUiwodiktPnZ0eXAtPmF0dHIpKQorLypGSVhNRSovCisjZGVmaW5lIElTRkFSKHYpICgodiktPnZ0eXAtPmF0dHImJihzdHJzdHIoU1RSX0ZBUiwodiktPnZ0eXAtPmF0dHIpfHxzdHJzdHIoU1RSX0hVR0UsKHYpLT52dHlwLT5hdHRyKSkpCisKKyNkZWZpbmUgSVNBQ0MoeCkgKCh4KT09YWNjKQorI2RlZmluZSBJU1goeCkgKCh4KT09aXgpCisjZGVmaW5lIElTWSh4KSAoKHgpPT1peSkKKyNkZWZpbmUgSVNVKHgpICgoeCk9PWl1KQorI2RlZmluZSBJU0lEWCh4KSAoSVNYKHgpfHxJU1koeCl8fChJU1UoeCkmJkNQVSE9NjgxMikpCisjZGVmaW5lIElTUkFDQyh4KSAoaXNyZWcoeCkmJklTQUNDKHAtPngucmVnKSkKKyNkZWZpbmUgSVNSWCh4KSAoaXNyZWcoeCkmJklTWChwLT54LnJlZykpCisjZGVmaW5lIElTUlkoeCkgKGlzcmVnKHgpJiZJU1kocC0+eC5yZWcpKQorI2RlZmluZSBJU1JVKHgpIChpc3JlZyh4KSYmSVNVKHAtPngucmVnKSkKKyNkZWZpbmUgSVNSSURYKHgpIChpc3JlZyh4KSYmSVNJRFgocC0+eC5yZWcpKQorCisjZGVmaW5lIENQVU9QVCAoKGdfZmxhZ3NbMF0mVVNFREZMQUcpP2dfZmxhZ3NfdmFsWzBdLmw6NjgxMikKKworI2RlZmluZSBTUFVTSCh4KSAoQ1BVPT02ODEyPyJcdHBzaCIgeCAiXG4iOiJcdHBzaHNcdCIgeCAiXG4iKQorI2RlZmluZSBTUFVTSEQgICAoQ1BVPT02ODEyPyJcdHBzaGRcbiI6Ilx0cHNoc1x0YixhXG4iKQorI2RlZmluZSBTUFVMTCh4KSAoQ1BVPT02ODEyPyJcdHB1bCIgeCAiXG4iOiJcdHB1bHNcdCIgeCAiXG4iKQorI2RlZmluZSBTUFVMTEQgICAoQ1BVPT02ODEyPyJcdHB1bGRcbiI6Ilx0cHVsc1x0YSxiXG4iKQorI2RlZmluZSBTQ01QKHgpICAoQ1BVPT02ODEyPyJcdGNwIiB4ICJcdCI6Ilx0Y21wIiB4ICJcdCIpCisjZGVmaW5lIFNFWCAgICAgIChDUFU9PTY4MTI/Ilx0c2V4XHRiLGRcbiI6Ilx0c2V4XG4iKQorI2RlZmluZSBFWFRFTkQodCkgKCgodCkmVU5TSUdORUQpPyJcdGNscmFcbiI6U0VYKQorCisjZGVmaW5lIFNHTjE2KHgpICh6bTJsKHppMnptKHptMnppKGwyem0oKGxvbmcpKHgpKSkpKSkKKworZW51bSBwZWVwZiB7IE5FRURTQU1FID0gMSwgUkVNT1ZFMVNUID0gMiwgQUxMT1dTRlggPSA0fTsKK3N0cnVjdCBwZWVwcyB7Y2hhciAqczEsKnMyLCpyO2VudW0gcGVlcGYgZmxhZ3M7fTsKKworc3RhdGljIGludCBjaGVja19zZngoY2hhciAqcykKK3sKKyAgaWYoISpzKSByZXR1cm4gMDsKKyAgcys9c3RybGVuKHMpLTE7CisgIGlmKCpzPT0nKyd8fCpzPT0nLScpIHJldHVybiAxOworICBpZigqcyE9J3MnJiYqcyE9J3gnJiYqcyE9J3knJiYqcyE9J3UnKSByZXR1cm4gMDsKKyAgcy0tOworICBpZigqcyE9JywnKSByZXR1cm4gMDsKKyAgcy0tOworICBpZigqcz09JysnfHwqcz09Jy0nKSByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0c3pmbGFnKGNoYXIgKm9wLGNoYXIgcikKK3sKKyAgc3RhdGljIGNoYXIgKnpiW109eyJhZGNiIiwiYWRkYiIsImFuZGIiLCJhc2xiIiwiYXNyYiIsImNscmIiLCJjb21iIiwiZGVjYiIsImVvcmIiLCJpbmNiIiwKKwkJImxkYWIiLCJsZGIiLCJsc2xiIiwibHNyYiIsIm5lZ2IiLCJvcmIiLCJvcmFiIiwicm9sYiIsInJvcmIiLCJzYmNiIiwKKwkJInN0YiIsInN0YWIiLCJzdWJiIiwidHN0YiJ9OworICBzdGF0aWMgY2hhciAqemRbXT17ImFkZGQiLCJsZGQiLCJzZXgiLCJzdGQiLCJzdWJkIn07CisKKyAgaW50IGk7CisKKyAgaWYocj09J2InKXsKKyAgICBmb3IoaT0wO2k8c2l6ZW9mKHpiKS9zaXplb2YoKnpiKTtpKyspCisgICAgICBpZighc3RyY21wKG9wLHpiW2ldKSkKKwlyZXR1cm4gMTsKKyAgfQorICBpZihyPT0nZCcpeworICAgIGZvcihpPTA7aTxzaXplb2YoemQpL3NpemVvZigqemQpO2krKykKKyAgICAgIGlmKCFzdHJjbXAob3AsemRbaV0pKQorCXJldHVybiAxOworICB9CisgIGlmKHI9PSd4JyYmKCFzdHJjbXAob3AsImxlYXgiKXx8IXN0cmNtcChvcCwibGR4IikpKSByZXR1cm4gMTsKKyAgaWYocj09J3knJiYoIXN0cmNtcChvcCwibGVheSIpfHwhc3RyY21wKG9wLCJsZHkiKSkpIHJldHVybiAxOworICBpZihDUFU9PTY4MTIpeworICAgIGlmKHI9PSd4JyYmKCFzdHJjbXAob3AsImRleCIpfHwhc3RyY21wKG9wLCJpbngiKSkpIHJldHVybiAxOworICAgIGlmKHI9PSd5JyYmKCFzdHJjbXAob3AsImRleSIpfHwhc3RyY21wKG9wLCJpbnkiKSkpIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCitpbnQgZW1pdF9wZWVwaG9sZSh2b2lkKQoreworICBpbnQgZW50cmllcyxpLGosdjEsdjI7CisgIGNoYXIgKmFzbWxpbmVbRU1JVF9CVUZfREVQVEhdOworICBjaGFyIGJ1ZjFbMTAyNF0sYnVmMlsxMDI0XTsKKyAgY2hhciBvcDFbOF0sb3AyWzhdOworCisKKyAgLyogVE9ETzogYWRhcHQgYmV0dGVyICovCisgIHN0YXRpYyBzdHJ1Y3QgcGVlcHMgZWxpbVtdPXsKKyAgICAibGRhIiwic3RhIiwwLE5FRURTQU1FLAorICAgICJsZGIiLCJzdGIiLDAsTkVFRFNBTUUsCisgICAgImxkYWEiLCJzdGFhIiwwLE5FRURTQU1FLAorICAgICJsZGFiIiwic3RhYiIsMCxORUVEU0FNRSwKKyAgICAibGRkIiwic3RkIiwwLE5FRURTQU1FLAorICAgICJsZHgiLCJzdHgiLDAsTkVFRFNBTUUsCisgICAgImxkeSIsInN0eSIsMCxORUVEU0FNRSwKKyAgICAibGR1Iiwic3R1IiwwLE5FRURTQU1FLAorICAgICJzdGEiLCJzdGEiLDAsTkVFRFNBTUUsCisgICAgInN0YiIsInN0YiIsMCxORUVEU0FNRSwKKyAgICAic3RhYSIsInN0YWEiLDAsTkVFRFNBTUUsCisgICAgInN0YWIiLCJzdGFiIiwwLE5FRURTQU1FLAorICAgICJzdGQiLCJzdGQiLDAsTkVFRFNBTUUsCisgICAgInN0eCIsInN0eCIsMCxORUVEU0FNRSwKKyAgICAic3R5Iiwic3R5IiwwLE5FRURTQU1FLAorICAgICJzdHUiLCJzdHUiLDAsTkVFRFNBTUUsCisgICAgInN0YSIsImxkYSIsMCxORUVEU0FNRSwKKyAgICAic3RiIiwibGRiIiwwLE5FRURTQU1FLAorICAgICJzdGFhIiwibGRhYSIsMCxORUVEU0FNRSwKKyAgICAic3RhYiIsImxkYWIiLDAsTkVFRFNBTUUsCisgICAgInN0ZCIsImxkZCIsMCxORUVEU0FNRSwKKyAgICAic3R4IiwibGR4IiwwLE5FRURTQU1FLAorICAgICJzdHkiLCJsZHkiLDAsTkVFRFNBTUUsCisgICAgInN0dSIsImxkdSIsMCxORUVEU0FNRSwKKyNpZiAwCisgICAgImxkYSIsImxkYSIsMCxSRU1PVkUxU1QsCisgICAgImxkYWEiLCJsZGFhIiwwLFJFTU9WRTFTVCwKKyAgICAibGRhYiIsImxkYWIiLDAsUkVNT1ZFMVNULAorICAgICJsZGIiLCJsZGIiLDAsUkVNT1ZFMVNULAorICAgICJsZGQiLCJsZGQiLDAsUkVNT1ZFMVNULAorICAgICJsZHgiLCJsZHgiLDAsUkVNT1ZFMVNULAorICAgICJsZHkiLCJsZHkiLDAsUkVNT1ZFMVNULAorICAgICJsZHUiLCJsZHUiLDAsUkVNT1ZFMVNULAorICAgICJsZGEiLCJwbGEiLDAsUkVNT1ZFMVNULAorICAgICJsZGEiLCJ0eGEiLDAsUkVNT1ZFMVNULAorICAgICJsZGEiLCJ0eWEiLDAsUkVNT1ZFMVNULAorICAgICJsZHgiLCJ0YXgiLDAsUkVNT1ZFMVNULAorICAgICJsZHkiLCJ0YXkiLDAsUkVNT1ZFMVNULAorICAgICJ0YXkiLCJsZHkiLDAsUkVNT1ZFMVNULAorICAgICJ0YXgiLCJsZHgiLDAsUkVNT1ZFMVNULAorICAgICJ0eGEiLCJsZGEiLDAsUkVNT1ZFMVNULAorICAgICJ0eWEiLCJsZGEiLDAsUkVNT1ZFMVNULAorI2VuZGlmCisgIH07CisKKworICBpPWVtaXRfbDsKKyAgaWYoZW1pdF9mPT0wKQorICAgIGVudHJpZXM9aS1lbWl0X2YrMTsKKyAgZWxzZQorICAgIGVudHJpZXM9RU1JVF9CVUZfREVQVEg7CisgIGFzbWxpbmVbMF09ZW1pdF9idWZmZXJbaV07CisgIGlmKHNzY2FuZihhc21saW5lWzBdLCIgJTZzICU5OTlzIixvcDEsYnVmMSk9PTImJiFzdHJjbXAob3AxLCJjbXBiIikmJiFzdHJjbXAoYnVmMSwiIzAiKSkKKyAgICBzdHJjcHkoYXNtbGluZVswXSwiXHR0c3RiXG4iKTsKKyAgaWYoc3NjYW5mKGFzbWxpbmVbMF0sIiAlNnMgJTk5OXMiLG9wMSxidWYxKT09MiYmIXN0cmNtcChvcDEsImNtcGQiKSYmIXN0cmNtcChidWYxLCIjMCIpKQorICAgIHN0cmNweShhc21saW5lWzBdLCJcdHN1YmRcdCMwXG4iKTsKKworICBpZihlbnRyaWVzPj0yKXsKKyAgICBpLS07CisgICAgaWYoaTwwKSBpPUVNSVRfQlVGX0RFUFRILTE7CisgICAgYXNtbGluZVsxXT1lbWl0X2J1ZmZlcltpXTsKKworICAgIGZvcihqPTA7ajxzaXplb2YoZWxpbSkvc2l6ZW9mKGVsaW1bMF0pO2orKyl7CisgICAgICBpZihlbGltW2pdLmZsYWdzJk5FRURTQU1FKXsKKwlpZihzc2NhbmYoYXNtbGluZVswXSwiICU2cyAlOTk5cyIsb3AyLGJ1ZjIpPT0yJiYKKwkgICBzc2NhbmYoYXNtbGluZVsxXSwiICU2cyAlOTk5cyIsb3AxLGJ1ZjEpPT0yJiYKKwkgICAhc3RyY21wKG9wMSxlbGltW2pdLnMxKSYmIXN0cmNtcChvcDIsZWxpbVtqXS5zMikmJgorCSAgICFzdHJjbXAoYnVmMSxidWYyKSl7CisJICBpZighY2hlY2tfc2Z4KGJ1ZjEpJiYhY2hlY2tfc2Z4KGJ1ZjIpKXsKKwkgICAgaWYoZWxpbVtqXS5yKXsKKwkgICAgICBzdHJjcHkoYXNtbGluZVswXSxlbGltW2pdLnIpOworCSAgICB9ZWxzZXsKKwkgICAgICBpZihlbGltW2pdLmZsYWdzJlJFTU9WRTFTVCkKKwkJc3RyY3B5KGFzbWxpbmVbMV0sYXNtbGluZVswXSk7CisJICAgICAgcmVtb3ZlX2FzbSgpOworCSAgICB9CisJICAgIHJldHVybiAxOworCSAgfQorCX0KKyAgICAgIH1lbHNleworCSpidWYxPTA7KmJ1ZjI9MDsKKwlpZihzc2NhbmYoYXNtbGluZVsxXSwiICU2cyAlOTk5cyIsb3AxLGJ1ZjEpPj0xJiYKKwkgICBzc2NhbmYoYXNtbGluZVswXSwiICU2cyAlOTk5cyIsb3AyLGJ1ZjIpPj0xJiYKKwkgICAhc3RyY21wKG9wMSxlbGltW2pdLnMxKSYmIXN0cmNtcChvcDIsZWxpbVtqXS5zMikpeworCSAgaWYoKGVsaW1bal0uZmxhZ3MmQUxMT1dTRlgpfHwoIWNoZWNrX3NmeChidWYxKSYmIWNoZWNrX3NmeChidWYyKSkpeworCSAgICBpZihlbGltW2pdLmZsYWdzJlJFTU9WRTFTVCkKKwkgICAgICBzdHJjcHkoYXNtbGluZVsxXSxhc21saW5lWzBdKTsKKwkgICAgcmVtb3ZlX2FzbSgpOworCSAgICByZXR1cm4gMTsKKwkgIH0KKwl9CisgICAgICB9CisgICAgfQorCisgICAgaWYoIXN0cmNtcChhc21saW5lWzBdLCJcdHJ0c1xuIikmJnNzY2FuZihhc21saW5lWzFdLCIgJTZzICU5OTlzIixvcDEsYnVmMSk9PTImJiFzdHJjbXAob3AxLCJwdWxzIikpeworICAgICAgc3ByaW50Zihhc21saW5lWzFdK3N0cmxlbihhc21saW5lWzFdKS0xLCIscGNcbiIpOworICAgICAgcmVtb3ZlX2FzbSgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYoIXN0cmNtcChhc21saW5lWzBdLCJcdHN0Ylx0MCxzXG4iKSYmIXN0cmNtcChhc21saW5lWzFdLCJcdGxlYXNcdC0xLHNcbiIpKXsKKyAgICAgIHN0cmNweShhc21saW5lWzFdLCJcdHBzaHNcdGJcbiIpOworICAgICAgcmVtb3ZlX2FzbSgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYoIXN0cmNtcChhc21saW5lWzBdLCJcdHN0ZFx0MCxzXG4iKSYmIXN0cmNtcChhc21saW5lWzFdLCJcdGxlYXNcdC0yLHNcbiIpKXsKKyAgICAgIHN0cmNweShhc21saW5lWzFdLCJcdHBzaHNcdGIsYVxuIik7CisgICAgICByZW1vdmVfYXNtKCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZighc3RyY21wKGFzbWxpbmVbMF0sIlx0bGRiXHQwLHNcbiIpJiYhc3RyY21wKGFzbWxpbmVbMV0sIlx0cHNoc1x0YlxuIikpeworICAgICAgcmVtb3ZlX2FzbSgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYoIXN0cmNtcChhc21saW5lWzBdLCJcdGxkZFx0MCxzXG4iKSYmIXN0cmNtcChhc21saW5lWzFdLCJcdHBzaHNcdGIsYVxuIikpeworICAgICAgcmVtb3ZlX2FzbSgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYoIXN0cmNtcChhc21saW5lWzBdLCJcdHBzaHNcdGIsYVxuIikmJiFzdHJjbXAoYXNtbGluZVsxXSwiXHRwdWxzXHRhLGJcbiIpKXsKKyAgICAgIHN0cmNweShhc21saW5lWzFdLCJcdGxkZFx0MCxzXG4iKTsKKyAgICAgIHJlbW92ZV9hc20oKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmKHNzY2FuZihhc21saW5lWzFdLCIgbGRkICU5OTlzIixvcDEpPj0xJiZzc2NhbmYoYXNtbGluZVswXSwiIGxkZCAlOTk5cyIsb3AyKT49MSl7CisgICAgICBpZighKChvcDJbMF09PSdhJ3x8b3AyWzBdPT0nYid8fG9wMlswXT09J2QnKSYmb3AyWzFdPT0nLCcpKXsKKwlzdHJjcHkoYXNtbGluZVsxXSxhc21saW5lWzBdKTsKKwlyZW1vdmVfYXNtKCk7CisJcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorCisgICAgaWYoIXN0cmNtcChhc21saW5lWzBdLCJcdHRmclx0eCxkXG4iKSYmIXN0cmNtcChhc21saW5lWzFdLCJcdHRmclx0ZCx4XG4iKSl7CisgICAgICByZW1vdmVfYXNtKCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYoIXN0cmNtcChhc21saW5lWzBdLCJcdHRmclx0eSxkXG4iKSYmIXN0cmNtcChhc21saW5lWzFdLCJcdHRmclx0ZCx5XG4iKSl7CisgICAgICByZW1vdmVfYXNtKCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYoIXN0cmNtcChhc21saW5lWzBdLCJcdHN0ZFx0MCxzcFxuIikmJiFzdHJjbXAoYXNtbGluZVsxXSwiXHRwc2hkXG4iKSl7CisgICAgICByZW1vdmVfYXNtKCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYoIXN0cmNtcChhc21saW5lWzBdLCJcdGxkZFx0MCxzcFxuIikmJiFzdHJjbXAoYXNtbGluZVsxXSwiXHRwc2hkXG4iKSl7CisgICAgICByZW1vdmVfYXNtKCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZihzc2NhbmYoYXNtbGluZVswXSwiIGxlYXMgJWQscyIsJnYxKT09MSYmc3NjYW5mKGFzbWxpbmVbMV0sIiBsZWFzICVkLHMiLCZ2Mik9PTEpeworICAgICAgc3ByaW50Zihhc21saW5lWzFdLCJcdGxlYXNcdCVsZCxzXG4iLFNHTjE2KHYxK3YyKSk7CisgICAgICByZW1vdmVfYXNtKCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZihDUFUhPTY4MTImJnNzY2FuZihhc21saW5lWzBdLCIgdGZyICVjLCVjIixidWYxLGJ1ZjIpPT0yKXsKKyAgICAgIGlmKCgqYnVmMT09J3gnfHwqYnVmMT09J3knfHwqYnVmMT09J3UnfHwqYnVmMT09J3MnKSYmCisJICgqYnVmMj09J3gnfHwqYnVmMj09J3knfHwqYnVmMj09J3UnfHwqYnVmMj09J3MnKSl7CisJc3ByaW50Zihhc21saW5lWzBdLCJcdGxlYSVjXHQsJWNcbiIsKmJ1ZjIsKmJ1ZjEpOworICAgICAgfQorICAgIH0KKyAgICBpZihDUFU9PTY4MTImJighc3RyY21wKGFzbWxpbmVbMV0sIlx0ZGV4XG4iKXx8IXN0cmNtcChhc21saW5lWzFdLCJcdGRleVxuIil8fCFzdHJjbXAoYXNtbGluZVsxXSwiXHRzdWJkXHQjMVxuIikpJiYKKyAgICAgICAoIXN0cm5jbXAoYXNtbGluZVswXSwiXHRibmVcdCIsNSl8fCFzdHJuY21wKGFzbWxpbmVbMF0sIlx0YmVxXHQiLDUpKSl7CisgICAgICBjaGFyIHI9YXNtbGluZVsxXVszXTsKKyAgICAgIGlmKHI9PSdiJykgcj0nZCc7CisgICAgICBzdHJjcHkoYXNtbGluZVsxXSwiXHRkIik7CisgICAgICBzdHJuY3B5KGFzbWxpbmVbMV0rMixhc21saW5lWzBdKzEsNCk7CisgICAgICBhc21saW5lWzFdWzZdPXI7YXNtbGluZVsxXVs3XT0nLCc7CisgICAgICBzdHJjcHkoYXNtbGluZVsxXSs4LGFzbWxpbmVbMF0rNSk7CisgICAgICByZW1vdmVfYXNtKCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYoQ1BVPT02ODEyJiYoIXN0cmNtcChhc21saW5lWzFdLCJcdGlueFxuIil8fCFzdHJjbXAoYXNtbGluZVsxXSwiXHRpbnlcbiIpfHwhc3RyY21wKGFzbWxpbmVbMV0sIlx0YWRkZFx0IzFcbiIpKSYmCisgICAgICAgKCFzdHJuY21wKGFzbWxpbmVbMF0sIlx0Ym5lXHQiLDUpfHwhc3RybmNtcChhc21saW5lWzBdLCJcdGJlcVx0Iiw1KSkpeworICAgICAgY2hhciByPWFzbWxpbmVbMV1bM107CisgICAgICBzdHJjcHkoYXNtbGluZVsxXSwiXHRpIik7CisgICAgICBzdHJuY3B5KGFzbWxpbmVbMV0rMixhc21saW5lWzBdKzEsNCk7CisgICAgICBhc21saW5lWzFdWzZdPXI7YXNtbGluZVsxXVs3XT0nLCc7CisgICAgICBzdHJjcHkoYXNtbGluZVsxXSs4LGFzbWxpbmVbMF0rNSk7CisgICAgICByZW1vdmVfYXNtKCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgaWYoZW50cmllcz49Myl7CisgICAgaS0tOworICAgIGlmKGk8MCkgaT1FTUlUX0JVRl9ERVBUSC0xOworICAgIGFzbWxpbmVbMl09ZW1pdF9idWZmZXJbaV07CisgICAgaWYoc3NjYW5mKGFzbWxpbmVbMF0sIiAlNnMgJTk5OXMiLG9wMSxidWYxKT09Mil7CisgICAgICBpZighc3RyY21wKG9wMSwiYmVxIil8fCFzdHJjbXAob3AxLCJibmUiKSl7CisJaWYoIXN0cmNtcChhc21saW5lWzFdLCJcdHRzdGJcbiIpfHwhc3RyY21wKGFzbWxpbmVbMV0sIlx0Y3BiXHQjMFxuIikpeworCSAgaWYoc3NjYW5mKGFzbWxpbmVbMl0sIiAlNnMgJTk5OXMiLG9wMixidWYyKT49MSYmCisJICAgICBzZXRzemZsYWcob3AyLCdiJykpeworCSAgICBzdHJjcHkoYXNtbGluZVsxXSxhc21saW5lWzBdKTsKKwkgICAgcmVtb3ZlX2FzbSgpOworCSAgICByZXR1cm4gMTsKKwkgIH0KKwl9CisJaWYoc3NjYW5mKGFzbWxpbmVbMV0sIiAlNnMgJTk5OXMiLG9wMixidWYyKT09MiYmCisJICAgKCFzdHJjbXAob3AyLCJzdWJkIil8fCFzdHJjbXAob3AyLCJjcGQiKSkmJiFzdHJjbXAoYnVmMiwiIzAiKSl7CisJICBpZihzc2NhbmYoYXNtbGluZVsyXSwiICU2cyAlOTk5cyIsb3AyLGJ1ZjIpPj0xJiYKKwkgICAgIHNldHN6ZmxhZyhvcDIsJ2QnKSl7CisJICAgIHN0cmNweShhc21saW5lWzFdLGFzbWxpbmVbMF0pOworCSAgICByZW1vdmVfYXNtKCk7CisJICAgIHJldHVybiAxOworCSAgfQorCX0KKwlpZihzc2NhbmYoYXNtbGluZVsxXSwiICU2cyAlOTk5cyIsb3AyLGJ1ZjIpPT0yJiYKKwkgICAhc3RyY21wKG9wMiwoQ1BVPT02ODEyKT8iY3B4IjoiY21weCIpJiYhc3RyY21wKGJ1ZjIsIiMwIikpeworCSAgaWYoc3NjYW5mKGFzbWxpbmVbMl0sIiAlNnMgJTk5OXMiLG9wMixidWYyKT49MSYmCisJICAgICBzZXRzemZsYWcob3AyLCd4JykpeworCSAgICBzdHJjcHkoYXNtbGluZVsxXSxhc21saW5lWzBdKTsKKwkgICAgcmVtb3ZlX2FzbSgpOworCSAgICByZXR1cm4gMTsKKwkgIH0KKwl9CisJaWYoc3NjYW5mKGFzbWxpbmVbMV0sIiAlNnMgJTk5OXMiLG9wMixidWYyKT09MiYmCisJICAgIXN0cmNtcChvcDIsKENQVT09NjgxMik/ImNweSI6ImNtcHkiKSYmIXN0cmNtcChidWYyLCIjMCIpKXsKKwkgIGlmKHNzY2FuZihhc21saW5lWzJdLCIgJTZzICU5OTlzIixvcDIsYnVmMik+PTEmJgorCSAgICAgc2V0c3pmbGFnKG9wMiwneScpKXsKKwkgICAgc3RyY3B5KGFzbWxpbmVbMV0sYXNtbGluZVswXSk7CisJICAgIHJlbW92ZV9hc20oKTsKKwkgICAgcmV0dXJuIDE7CisJICB9CisJfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcGVjaWFsX3NlY3Rpb24oRklMRSAqZixzdHJ1Y3QgVmFyICp2KQoreworICBjaGFyICpzZWM7CisgIGlmKHYtPnRhdHRyJkRQQUdFKXsKKyAgICBlbWl0KGYsIlx0LnNlY3Rpb25cdC5kcGFnZVxuIik7CisgIH1lbHNleworICAgIGlmKCF2LT52YXR0cikgcmV0dXJuIDA7CisgICAgc2VjPXN0cnN0cih2LT52YXR0ciwic2VjdGlvbigiKTsKKyAgICBpZighc2VjKSByZXR1cm4gMDsKKyAgICBzZWMrPXN0cmxlbigic2VjdGlvbigiKTsKKyAgICBlbWl0KGYsIlx0LnNlY3Rpb25cdCIpOworICAgIHdoaWxlKCpzZWMmJipzZWMhPScpJykgZW1pdF9jaGFyKGYsKnNlYysrKTsKKyAgICBlbWl0KGYsIlxuIik7CisgIH0KKyAgaWYoZikgc2VjdGlvbj1TUEVDSUFMOworICByZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBmcGNvbnN0bGlzdCB7CisgICAgc3RydWN0IGZwY29uc3RsaXN0ICpuZXh0OworICAgIGludCBsYWJlbCx0eXA7CisgICAgdW5pb24gYXR5cHMgdmFsOworfSAqZmlyc3RmcGM7CisKK3N0YXRpYyBpbnQgYWRkZnBjb25zdChzdHJ1Y3Qgb2JqICpvLGludCB0KQoreworICBzdHJ1Y3QgZnBjb25zdGxpc3QgKnA9Zmlyc3RmcGM7CisgIHQmPU5ROworICBpZihnX2ZsYWdzWzRdJlVTRURGTEFHKXsKKyAgICBmb3IocD1maXJzdGZwYztwO3A9cC0+bmV4dCl7CisgICAgICBpZih0PT1wLT50eXApeworCWV2YWxfY29uc3QoJnAtPnZhbCx0KTsKKwlpZih0PT1GTE9BVCYmemxkZXF0byh2bGRvdWJsZSx6ZjJ6bGQoby0+dmFsLnZmbG9hdCkpKSByZXR1cm4gcC0+bGFiZWw7CisJaWYodD09RE9VQkxFJiZ6bGRlcXRvKHZsZG91YmxlLHpkMnpsZChvLT52YWwudmRvdWJsZSkpKSByZXR1cm4gcC0+bGFiZWw7CisJaWYodD09TERPVUJMRSYmemxkZXF0byh2bGRvdWJsZSxvLT52YWwudmxkb3VibGUpKSByZXR1cm4gcC0+bGFiZWw7CisgICAgICB9CisgICAgfQorICB9CisgIHA9bXltYWxsb2Moc2l6ZW9mKHN0cnVjdCBmcGNvbnN0bGlzdCkpOworICBwLT5uZXh0PWZpcnN0ZnBjOworICBwLT5sYWJlbD0rK2xhYmVsOworICBwLT50eXA9dDsKKyAgcC0+dmFsPW8tPnZhbDsKKyAgZmlyc3RmcGM9cDsKKyAgcmV0dXJuIHAtPmxhYmVsOworfQorCitpbnQgcG9pbnRlcl90eXBlKHN0cnVjdCBUeXAgKnApCit7CisgIGlmKCFwKSBpZXJyb3IoMCk7CisgIHdoaWxlKChwLT5mbGFncyZOUSk9PUFSUkFZKSBwPXAtPm5leHQ7CisgIGlmKChwLT5mbGFncyZOUSk9PUZVTktUKSByZXR1cm4gTlBPSU5URVI7IC8qRklYTUU6IGJhbmtlZCovCisgIGlmKHAtPmF0dHIpeworICAgIGlmKHN0cnN0cihwLT5hdHRyLFNUUl9IVUdFKSkgcmV0dXJuIEhQT0lOVEVSOworICAgIGlmKHN0cnN0cihwLT5hdHRyLFNUUl9GQVIpKSByZXR1cm4gRlBPSU5URVI7CisgICAgaWYoc3Ryc3RyKHAtPmF0dHIsU1RSX05FQVIpKSByZXR1cm4gTlBPSU5URVI7CisgIH0KKyAgLypGSVhNRSovCisgIHJldHVybiBOUE9JTlRFUjsKK30KK3N0YXRpYyBsb25nIHZvZmYoc3RydWN0IG9iaiAqcCkKK3sKKyAgaWYoem0ybChwLT52LT5vZmZzZXQpPDApIAorICAgIHJldHVybiBsb2ZmLXptMmwocC0+di0+b2Zmc2V0KSt6bTJsKHAtPnZhbC52bWF4KS1zdGFja29mZnNldCsxOworICBlbHNlCisgICAgcmV0dXJuIHptMmwocC0+di0+b2Zmc2V0KSt6bTJsKHAtPnZhbC52bWF4KS1zdGFja29mZnNldDsKK30KKworc3RhdGljIHZvaWQgZW1pdF9vYmooRklMRSAqZixzdHJ1Y3Qgb2JqICpwLGludCB0KQorLyogIEdpYnQgT2JqZWt0IGF1ZiBCaWxkc2NoaXJtIGF1cyAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpZihwLT5hbSl7CisgICAgaW50IGZsYWdzPXAtPmFtLT5mbGFnczsKKyAgICBpZihmbGFncz09QUNDX0lORCl7CisgICAgICBlbWl0KGYsIiVzLCVzIixyZWduYW1lc1thY2NdLHJlZ25hbWVzW3AtPmFtLT5iYXNlXSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKGZsYWdzPT1LT05TVElOQyl7CisgICAgICBldmFsX2NvbnN0KCZwLT52YWwscC0+YW0tPmJhc2UpOworICAgICAgaWYoSVNGTE9BVChwLT5hbS0+YmFzZSkpeworCXVuc2lnbmVkIGNoYXIgKm09KHVuc2lnbmVkIGNoYXIgKikmcC0+dmFsLnZmbG9hdDsKKwlpZih6bTJsKHAtPmFtLT5vZmZzZXQpPT0yKQorCSAgZW1pdChmLCIjMHglMDJ4JTAyeCIsbVsyXSxtWzNdKTsKKwllbHNlCisJICBlbWl0KGYsIiMweCUwMnglMDJ4IixtWzBdLG1bMV0pOworCXJldHVybjsKKyAgICAgIH1lbHNlIGlmKCh0Jk5RKT09Q0hBUil7CisJdnVtYXg9enVtcnNoaWZ0KHZ1bWF4LDI0LTgqcC0+YW0tPm9mZnNldCk7CisJdnVtYXg9enVtYW5kKHZ1bWF4LHVsMnp1bSgyNTVVTCkpOworICAgICAgfWVsc2V7CisJdnVtYXg9enVtcnNoaWZ0KHZ1bWF4LDE2LTgqcC0+YW0tPm9mZnNldCk7CisJdnVtYXg9enVtYW5kKHZ1bWF4LHVsMnp1bSgweEZGRkZVTCkpOworICAgICAgfQorICAgICAgZW1pdChmLCIjJWx1Iix6dW0ydWwodnVtYXgpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoZmxhZ3M8UE9TVF9JTkN8fGZsYWdzPlBSRV9ERUN8fENQVT09NjgxMikKKyAgICAgIGVtaXQoZiwiJWxkIixwLT5hbS0+b2Zmc2V0JjB4ZmZmZik7CisgICAgaWYocC0+YW0tPnYpeworICAgICAgaWYocC0+YW0tPnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQykKKwllbWl0KGYsIislcyVsZCIsbGFicHJlZml4LHptMmwocC0+YW0tPnYtPm9mZnNldCkpOworICAgICAgZWxzZQorCWVtaXQoZiwiKyglcyVzKSIsaWRwcmVmaXgscC0+YW0tPnYtPmlkZW50aWZpZXIpOworICAgIH0KKyAgICBlbWl0KGYsIiwiKTsKKyAgICBpZihmbGFncz09UFJFX0lOQyl7CisgICAgICBlbWl0KGYsIisiKTsKKyAgICAgIGlmKHAtPmFtLT5vZmZzZXQ9PTImJkNQVSE9NjgxMikgZW1pdChmLCIrIik7CisgICAgfWVsc2UgaWYoZmxhZ3M9PVBSRV9ERUMpeworICAgICAgZW1pdChmLCItIik7CisgICAgICBpZihwLT5hbS0+b2Zmc2V0PT0yJiZDUFUhPTY4MTIpIGVtaXQoZiwiLSIpOworICAgIH0KKyAgICBlbWl0KGYsIiVzIixyZWduYW1lc1twLT5hbS0+YmFzZV0pOworICAgIGlmKGZsYWdzPT1QT1NUX0lOQyl7CisgICAgICBlbWl0KGYsIisiKTsKKyAgICAgIGlmKHAtPmFtLT5vZmZzZXQ9PTImJkNQVSE9NjgxMikgZW1pdChmLCIrIik7CisgICAgfWVsc2UgaWYoZmxhZ3M9PVBPU1RfREVDKXsKKyAgICAgIGVtaXQoZiwiLSIpOworICAgICAgaWYocC0+YW0tPm9mZnNldD09MiYmQ1BVIT02ODEyKSBlbWl0KGYsIi0iKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGlmKChwLT5mbGFncyYoS09OU1R8RFJFRk9CSikpPT0oS09OU1R8RFJFRk9CSikpeworICAgIGVtaXR2YWwoZiwmcC0+dmFsLHAtPmR0eXAmTlUpOworICAgIHJldHVybjsKKyAgfQorICBpZihwLT5mbGFncyZWQVJBRFIpIGVtaXQoZiwiIyIpOworICBpZigocC0+ZmxhZ3MmKERSRUZPQkp8UkVHKSk9PShEUkVGT0JKfFJFRykpIGVtaXQoZiwiMCwiKTsKKyAgaWYoKHAtPmZsYWdzJihEUkVGT0JKfFJFRykpPT1EUkVGT0JKKSBlbWl0KGYsIlsiKTsKKyAgaWYoKHAtPmZsYWdzJihWQVJ8UkVHKSk9PVZBUil7CisgICAgaWYocC0+di0+c3RvcmFnZV9jbGFzcz09QVVUT3x8cC0+di0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpeworICAgICAgZW1pdChmLCIlbGQsJXMiLHZvZmYocCkscmVnbmFtZXNbc3BdKTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKCF6bWVxdG8obDJ6bSgwTCkscC0+dmFsLnZtYXgpKXsKKwllbWl0KGYsIiVsZCIsem0ybCh6aTJ6bSh6bTJ6aShwLT52YWwudm1heCkpKSk7CisJZW1pdChmLCIrIik7CisgICAgICB9CisgICAgICBpZihwLT52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpeworCWVtaXQoZiwiJXMlbGQiLGxhYnByZWZpeCx6bTJsKHAtPnYtPm9mZnNldCkpOworICAgICAgfWVsc2V7CisJZW1pdChmLCIoJXMlcykiLGlkcHJlZml4LHAtPnYtPmlkZW50aWZpZXIpOworICAgICAgfQorICAgICAgaWYocGNyZWwmJiEocC0+ZmxhZ3MmVkFSQURSKSYmSVNGVU5DKHAtPnYtPnZ0eXAtPmZsYWdzKSkKKwllbWl0KGYsIixwYyIpOworICAgICAgaWYoZHJlbCYmIShwLT5mbGFncyZWQVJBRFIpJiYhSVNGVU5DKHAtPnYtPnZ0eXAtPmZsYWdzKSl7CisJaWYoQ1BVPT02ODEyKSBpZXJyb3IoMCk7CisJZW1pdChmLCIsJXMiLHJlZ25hbWVzW2l1XSk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKHAtPmZsYWdzJlJFRyl7CisgICAgaWYoSVNBQ0MocC0+cmVnKSYmKHQmTlEpPT1DSEFSKQorICAgICAgZW1pdChmLCJiIik7CisgICAgZWxzZQorICAgICAgZW1pdChmLCIlcyIscmVnbmFtZXNbcC0+cmVnXSk7CisgIH0KKyAgaWYocC0+ZmxhZ3MmS09OU1QpeworICAgIGlmKElTRkxPQVQodCkpeworICAgICAgZW1pdChmLCIlcyVkIixsYWJwcmVmaXgsYWRkZnBjb25zdChwLHQpKTsKKyAgICB9ZWxzZXsKKyAgICAgIGVtaXQoZiwiIyIpO2VtaXR2YWwoZiwmcC0+dmFsLHQmTlUpOworICAgIH0KKyAgfQorICBpZigocC0+ZmxhZ3MmKERSRUZPQkp8UkVHKSk9PURSRUZPQkopeworICAgIGlmKHAtPnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTnx8cC0+di0+c3RvcmFnZV9jbGFzcz09U1RBVElDKXsKKyAgICAgIGlmKGlzX2NvbnN0KHAtPnYtPnZ0eXApKXsKKwlpZighcGNyZWwmJkNQVT09NjgxMikgZW1pdChmLCIscGMiKTsKKyAgICAgIH1lbHNleworCWlmKCFkcmVsJiZDUFU9PTY4MTIpIGVtaXQoZiwiLHBjIik7CisgICAgICB9CisgICAgfQorICAgIGVtaXQoZiwiXSIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGR3YXJmMl9wcmludF9mcmFtZV9sb2NhdGlvbihGSUxFICpmLHN0cnVjdCBWYXIgKnYpCit7CisgIC8qRklYTUU6IG5lZWRzIGEgbG9jYXRpb24gbGlzdCBhbmQgY29ycmVjdCByZWdpc3RlciB0cmFuc2xhdGlvbiAqLworICBzdHJ1Y3Qgb2JqIG87CisgIG8uZmxhZ3M9UkVHOworICBvLnJlZz1zcDsKKyAgby52YWwudm1heD1sMnptKDBMKTsKKyAgby52PTA7CisgIGR3YXJmMl9wcmludF9sb2NhdGlvbihmLCZvKTsKK30KK3N0YXRpYyBpbnQgZHdhcmYyX3JlZ251bWJlcihpbnQgcikKK3sKKyAgLypGSVhNRTogYWx3YXlzIHJldHVybnMgRCBhcyBhY2N1bXVsYXRvciwgZXZlbiBpZiBieXRlIHNpemUgKi8KKyAgc3RhdGljIGludCBkd2FyZl9yZWdzW01BWFIrMV09ey0xLDMsNyw4LDE1fTsKKyAgcmV0dXJuIGR3YXJmX3JlZ3Nbcl07Cit9CitzdGF0aWMgem1heCBkd2FyZjJfZmJvZmZzZXQoc3RydWN0IFZhciAqdikKK3sKKyAgLypGSVhNRSovCisgIGlmKCF2fHwodi0+c3RvcmFnZV9jbGFzcyE9QVVUTyYmdi0+c3RvcmFnZV9jbGFzcyE9UkVHSVNURVIpKSBpZXJyb3IoMCk7CisgIGlmKCF6bWxlcShsMnptKDBMKSx2LT5vZmZzZXQpKQorICAgIHJldHVybiBsMnptKChsb25nKShsb2ZmLXptMmwodi0+b2Zmc2V0KSkpOworICBlbHNlCisgICAgcmV0dXJuIHYtPm9mZnNldDsKK30gCisKKy8qIHRlc3Qgb3BlcmFuZCBmb3IgbW92IGluc3RydWN0aW9uICovCitzdGF0aWMgaW50IG1vdl9vcChzdHJ1Y3Qgb2JqICpvKQoreworICBsb25nIG9mZjsKKyAgaWYoQ1BVIT02ODEyKSByZXR1cm4gMDsKKyAgaWYoby0+YW0peworICAgIGludCBmPW8tPmFtLT5mbGFnczsKKyAgICBpZihmPT1QT1NUX0lOQ3x8Zj09UFJFX0lOQ3x8Zj09UE9TVF9ERUN8fGY9PVBSRV9ERUN8fGY9PUFDQ19JTkQpCisgICAgICByZXR1cm4gMTsKKyAgICBpZihmPT1JTU1fSU5EKXsKKyAgICAgIGlmKG8tPmFtLT52KSByZXR1cm4gMDsKKyAgICAgIG9mZj1vLT5hbS0+b2Zmc2V0OworICAgICAgaWYob2ZmPj0tMTYmJm9mZjw9MTUpCisJcmV0dXJuIDE7CisgICAgICBlbHNlCisJcmV0dXJuIDA7CisgICAgfQorICAgIGllcnJvcigwKTsKKyAgfQorICBpZihvLT5mbGFncyYoS09OU1R8VkFSQURSKSkgcmV0dXJuIDE7CisgIGlmKChvLT5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSkgcmV0dXJuIDE7CisgIGlmKChvLT5mbGFncyYoVkFSfFJFR3xEUkVGT0JKKSk9PVZBUil7CisgICAgaWYoby0+di0+c3RvcmFnZV9jbGFzcz09U1RBVElDfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pCisgICAgICByZXR1cm4gMTsKKyAgICBvZmY9dm9mZihvKTsKKyAgICBpZihvZmY+PS0xNiYmb2ZmPD0xNSkKKyAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAwOworfQorCisvKiBhZGQgYW4gb2Zmc2V0IHRvIGFuIG9iamVjdCBkZXNjcmliaW5nIGEgbWVtb3J5IGFkZHJlc3MgKi8KK3N0YXRpYyB2b2lkIGluY19hZGRyKHN0cnVjdCBvYmogKm8sbG9uZyB2YWwsaW50IHQpCit7CisgIGlmKG8tPmFtKXsKKyAgICBpbnQgZj1vLT5hbS0+ZmxhZ3M7CisgICAgaWYoZj09SU1NX0lORHx8Zj09S09OU1RJTkMpCisgICAgICBvLT5hbS0+b2Zmc2V0Kz12YWw7CisgICAgZWxzZSBpZihmPT1QT1NUX0lOQ3x8Zj09UE9TVF9ERUN8fGY9PVBSRV9JTkN8fGY9PVBSRV9ERUMpeworICAgICAgc3RydWN0IEFkZHJlc3NpbmdNb2RlICpvbGQ9by0+YW07CisgICAgICBvLT5hbT1teW1hbGxvYyhzaXplb2YoKm8tPmFtKSk7CisgICAgICBvLT5hbS0+ZmxhZ3M9SU1NX0lORDsKKyAgICAgIG8tPmFtLT5iYXNlPW9sZC0+YmFzZTsKKyAgICAgIG8tPmFtLT52PTA7CisgICAgICBpZihmPT1QT1NUX0RFQykgby0+YW0tPm9mZnNldD1vbGQtPm9mZnNldC12YWw7CisgICAgICBlbHNlIGlmKGY9PVBPU1RfSU5DKSBvLT5hbS0+b2Zmc2V0PS1vbGQtPm9mZnNldCt2YWw7CisgICAgICBlbHNlIGlmKGY9PVBSRV9ERUMpIG8tPmFtLT5vZmZzZXQ9dmFsOworICAgICAgZWxzZSBvLT5hbS0+b2Zmc2V0PS12YWw7CisgICAgfWVsc2UKKyAgICAgIGllcnJvcigwKTsKKyAgfWVsc2UgaWYoKG8tPmZsYWdzJihEUkVGT0JKfEtPTlNUKSk9PURSRUZPQkopeworICAgIHN0cnVjdCBBZGRyZXNzaW5nTW9kZSAqYW07CisgICAgby0+YW09YW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworICAgIGFtLT5mbGFncz1JTU1fSU5EOworICAgIGlmKCFvLT5yZWcpIGllcnJvcigwKTsKKyAgICBhbS0+YmFzZT1vLT5yZWc7CisgICAgYW0tPm9mZnNldD16bTJsKHZhbCk7CisgICAgYW0tPnY9MDsKKyAgfWVsc2UgaWYoKG8tPmZsYWdzJihEUkVGT0JKfEtPTlNUKSk9PUtPTlNUKXsKKyAgICBzdHJ1Y3QgQWRkcmVzc2luZ01vZGUgKmFtOworICAgIGlmKG8tPmFtKSBpZXJyb3IoMCk7CisgICAgby0+YW09YW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworICAgIGFtLT5mbGFncz1LT05TVElOQzsKKyAgICBhbS0+b2Zmc2V0PXptMmwodmFsKTsKKyAgICBhbS0+YmFzZT10OworICB9ZWxzZXsKKyAgICBvLT52YWwudm1heD16bWFkZChvLT52YWwudm1heCx2YWwpOworICB9Cit9CisKKy8qIHB1c2hlZCBvbiB0aGUgc3RhY2sgYnkgYSBjYWxsZWUsIG5vIHBvcCBuZWVkZWQgKi8KK3N0YXRpYyB2b2lkIGNhbGxlZV9wdXNoKGxvbmcgbCkKK3sKKyAgaWYobC1zdGFja29mZnNldD5zdGFjaykKKyAgICBzdGFjaz1sLXN0YWNrb2Zmc2V0OworfQorc3RhdGljIHZvaWQgcHVzaChsb25nIGwpCit7CisgIHN0YWNrb2Zmc2V0LT1sOworICBpZihzdGFja29mZnNldDxtYXhwdXNoZWQpIG1heHB1c2hlZD1zdGFja29mZnNldDsKKyAgaWYoLW1heHB1c2hlZD5zdGFjaykgc3RhY2s9LW1heHB1c2hlZDsKK30KK3N0YXRpYyB2b2lkIHBvcChsb25nIGwpCit7CisgIHN0YWNrb2Zmc2V0Kz1sOworfQorc3RhdGljIHZvaWQgZ2VuX3BvcChGSUxFICpmLGxvbmcgbCkKK3sKKyAgaWYobD09MCkgcmV0dXJuOworICBpZihsPT0xJiZDUFU9PTY4MTIpeworICAgIGVtaXQoZiwiXHRpbnNcbiIpOworI2lmIDAgLyogbWlnaHQgY2xvYmJlciByZXR1cm4gcmVnaXN0ZXIgKi8KKyAgfWVsc2UgaWYobD09MiYmIXJlZ3NbYWNjXSl7CisgICAgZW1pdChmLFNQVUxMRCk7CisgICAgQlNFVChyZWdzX21vZGlmaWVkLGFjYyk7CisgIH1lbHNlIGlmKGw9PTImJiFyZWdzW2l4XSl7CisgICAgZW1pdChmLFNQVUxMKCJ4IikpOworICAgIEJTRVQocmVnc19tb2RpZmllZCxpeCk7CisgIH1lbHNlIGlmKGw9PTImJiFyZWdzW2l5XSl7CisgICAgZW1pdChmLFNQVUxMKCJ5IikpOworICAgIEJTRVQocmVnc19tb2RpZmllZCxpeSk7CisjZW5kaWYKKyAgfWVsc2V7CisgICAgZW1pdChmLCJcdGxlYXNcdCV1LCVzXG4iLFNHTjE2KGwpLHJlZ25hbWVzW3NwXSk7CisgIH0KKyAgcG9wKGwpOworfQorc3RhdGljIHZvaWQgcHIoRklMRSAqZixzdHJ1Y3QgSUMgKnApCit7CisgIGludCByOworICBpZihwdXNoZWRfYWNjKXsKKyAgICBlbWl0KGYsU1BVTExEKTsKKyAgICBwb3AoMik7CisgICAgcHVzaGVkX2FjYz0wOworICB9CisgIGZvcihyPU1BWFI7cj49MTtyLS0peworICAgIGlmKHJlZ3Nbcl0mOCl7CisgICAgICBlbWl0KGYsIlx0JXMlc1xuIixDUFU9PTY4MTI/InB1bCI6InB1bHNcdCIscmVnbmFtZXNbcl0pOworICAgICAgcG9wKDIpOworICAgIH0KKyAgICByZWdzW3JdJj1+MTI7CisgIH0KK30KK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX3RvcChGSUxFICpmLHN0cnVjdCBWYXIgKnYsbG9uZyBvZmZzZXQpCisvKiAgZXJ6ZXVndCBGdW5rdGlvbnNrb3BmICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgaTsKKyAgZW1pdChmLCIjIG9mZnNldD0lbGRcbiIsb2Zmc2V0KTsKKyAgaGF2ZV9mcmFtZT0wO3N0YWNrX3ZhbGlkPTE7c3RhY2s9MDsKKyAgaWYoIXNwZWNpYWxfc2VjdGlvbihmLHYpJiZzZWN0aW9uIT1DT0RFKXtlbWl0KGYsY29kZW5hbWUpO2lmKGYpIHNlY3Rpb249Q09ERTt9CisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisgICAgaWYoKHYtPmZsYWdzJihJTkxJTkVGVU5DfElOTElORUVYVCkpIT1JTkxJTkVGVU5DKQorICAgICAgZW1pdChmLCJcdC5nbG9iYWxcdCVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgZW1pdChmLCIlcyVzOlxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgfWVsc2V7CisgICAgZW1pdChmLCIlcyVsZDpcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgIH0KKyAgcm9mZj0wOworICBmb3IoaT1NQVhSO2k+MDtpLS0peworICAgIGlmKHJlZ3VzZWRbaV0mJiFyZWdzY3JhdGNoW2ldJiYhcmVnc2FbaV0peworICAgICAgaGF2ZV9mcmFtZT0xOworICAgICAgbG9mZis9MjsKKyAgICAgIHJvZmYrPTI7CisgICAgICBpZihpPT1peSkgZW1pdChmLFNQVVNIKCJ5IikpOworICAgICAgZWxzZSBpZihpPT1pdSl7CisJaWYoQ1BVIT02ODEyJiZyZWd1c2VkW2l5XSl7CisJICBlbWl0KGYsIlx0cHNoc1x0dSx5XG4iKTsKKwkgIGxvZmYrPTI7cm9mZis9MjtpPWl5OworCX1lbHNlCisJICBlbWl0KGYsU1BVU0goInUiKSk7CisgICAgICB9ZWxzZQorCWllcnJvcigwKTsKKyAgICB9CisgIH0KKyAgaWYoc3RhY2tfY2hlY2speworICAgIHN0YWNrY2hlY2tsYWJlbD0rK2xhYmVsOworICAgIGVtaXQoZiwiXHRsZHlcdCMlcyVkXG4iLGxhYnByZWZpeCxzdGFja2NoZWNrbGFiZWwpOworICAgIC8qIEZJWE1FOiBiYW5rZWQgKi8KKyAgICBlbWl0KGYsIlx0JXNcdCVzX19zdGFja19jaGVja1xuIixqc3JpbnN0LGlkcHJlZml4KTsKKyAgfQorICBpZihvZmZzZXQpeworICAgIGlmKENQVT09NjgxMiYmb2Zmc2V0PT0xKQorICAgICAgZW1pdChmLFNQVVNIKCJiIikpOworICAgIGVsc2UgaWYoQ1BVPT02ODEyJiZvZmZzZXQ9PTIpCisgICAgICBlbWl0KGYsU1BVU0hEKTsKKyAgICBlbHNlCisgICAgICBlbWl0KGYsIlx0bGVhc1x0JWxkLCVzXG4iLFNHTjE2KC1vZmZzZXQpLHJlZ25hbWVzW3NwXSk7CisgICAgaGF2ZV9mcmFtZT0xOworICB9Cit9CitzdGF0aWMgdm9pZCBmdW5jdGlvbl9ib3R0b20oRklMRSAqZixzdHJ1Y3QgVmFyICp2LGxvbmcgb2Zmc2V0KQorLyogIGVyemV1Z3QgRnVua3Rpb25zZW5kZSAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGk7CisgIG9mZnNldC09cm9mZjsKKyAgaWYob2Zmc2V0KXsKKyAgICBpZihvZmZzZXQ9PTEmJkNQVT09NjgxMikKKyAgICAgIGVtaXQoZiwiXHRpbnNcbiIpOworICAgIGVsc2UgaWYob2Zmc2V0PT0yJiZDUFU9PTY4MTImJiF6bWVxdG8oc3pvZih2LT52dHlwLT5uZXh0KSxsMnptKDRMKSkpCisgICAgICBlbWl0KGYsU1BVTEwoIngiKSk7CisgICAgZWxzZSBpZihvZmZzZXQ9PTImJkNQVT09NjgxMiYmcmVndXNlZFtpeV0pCisgICAgICBlbWl0KGYsU1BVTEwoInkiKSk7CisgICAgZWxzZQorICAgICAgZW1pdChmLCJcdGxlYXNcdCVsZCwlc1xuIixTR04xNihvZmZzZXQpLHJlZ25hbWVzW3NwXSk7CisgIH0KKyAgZm9yKGk9MTtpPD1NQVhSO2krKyl7CisgICAgaWYocmVndXNlZFtpXSYmIXJlZ3NjcmF0Y2hbaV0mJiFyZWdzYVtpXSl7CisgICAgICBoYXZlX2ZyYW1lPTE7CisgICAgICBpZihpPT1peSl7CisJaWYoQ1BVIT02ODEyJiZyZWd1c2VkW2l1XSYmIXJlZ3NjcmF0Y2hbaXVdJiYhcmVnc2FbaXVdKXsKKwkgIGVtaXQoZiwiXHRwdWxzXHR1LHlcbiIpOworCSAgaT1pdTsKKwl9ZWxzZQorCSAgZW1pdChmLFNQVUxMKCJ5IikpOworICAgICAgfWVsc2UgaWYoaT09aXUpIGVtaXQoZixTUFVMTCgidSIpKTsKKyAgICAgIGVsc2UKKwlpZXJyb3IoMCk7CisgICAgfQorICB9CisgIGlmKHJldCkgZW1pdChmLCJcdCVzXG4iLHJldCk7CisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisgICAgZW1pdChmLCJcdC50eXBlXHQlcyVzLEBmdW5jdGlvblxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICBlbWl0KGYsIlx0LnNpemVcdCVzJXMsJC0lcyVzXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgIH1lbHNleworICAgIGVtaXQoZiwiXHQudHlwZVx0JXMlbGQsQGZ1bmN0aW9uXG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICAgIGVtaXQoZiwiXHQuc2l6ZVx0JXMlbGQsJC0lcyVsZFxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICB9CisgIGlmKHN0YWNrX2NoZWNrKQorICAgIGVtaXQoZiwiXHQuZXF1XHQlcyVkLCVsZFxuIixsYWJwcmVmaXgsc3RhY2tjaGVja2xhYmVsLG9mZnNldC1tYXhwdXNoZWQpOworICBpZihzdGFja192YWxpZCl7CisgICAgaWYoIXYtPmZpKSB2LT5maT1uZXdfZmkoKTsKKyAgICB2LT5maS0+ZmxhZ3N8PUFMTF9TVEFDSzsKKyAgICB2LT5maS0+c3RhY2sxPWwyem0oc3RhY2srb2Zmc2V0KTsKKyAgICBlbWl0KGYsIiMgc3RhY2tzaXplPSVsZFxuIixzdGFjaytvZmZzZXQpOworICAgIGVtaXQoZiwiXHQuZXF1XHQlc19fc3RhY2tfJXMsJWxkXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIsc3RhY2srb2Zmc2V0KTsKKyAgfQorfQorc3RhdGljIGludCBjb21wYXJlX29iamVjdHMoc3RydWN0IG9iaiAqbzEsc3RydWN0IG9iaiAqbzIpCit7CisgIGlmKG8xLT5mbGFncz09bzItPmZsYWdzJiZvMS0+YW09PW8yLT5hbSl7CisgICAgaWYoIShvMS0+ZmxhZ3MmVkFSKXx8KG8xLT52PT1vMi0+diYmem1lcXRvKG8xLT52YWwudm1heCxvMi0+dmFsLnZtYXgpKSl7CisgICAgICBpZighKG8xLT5mbGFncyZSRUcpfHxvMS0+cmVnPT1vMi0+cmVnKXsKKwlyZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qRklYTUUqLworc3RhdGljIHZvaWQgY2xlYXJfZXh0X2ljKHN0cnVjdCBleHRfaWMgKnApCit7CisgIHAtPmZsYWdzPTA7CisgIHAtPnI9MDsKKyAgcC0+b2Zmc2V0PTA7Cit9CitzdGF0aWMgbG9uZyBwb2YyKHp1bWF4IHgpCisvKiAgWWllbGRzIGxvZzIoeCkrMSBvZGVyIDAuICovCit7CisgIHp1bWF4IHA7aW50IGxuPTE7CisgIHA9dWwyenVtKDFMKTsKKyAgd2hpbGUobG48PTMyJiZ6dW1sZXEocCx4KSl7CisgICAgaWYoenVtZXF0byh4LHApKSByZXR1cm4gbG47CisgICAgbG4rKztwPXp1bWFkZChwLHApOworICB9CisgIHJldHVybiAwOworfQorc3RhdGljIHZvaWQgcGVlcGhvbGUoc3RydWN0IElDICpwKQoreworICBpbnQgYyxjMixyLHQ7c3RydWN0IElDICpwMjsKKyAgc3RydWN0IEFkZHJlc3NpbmdNb2RlICphbTsKKyAgem1heCBpbmNtaW4saW5jbWF4OworICBpZihDUFU9PTY4MTIpeworICAgIGluY21pbj1sMnptKC04TCk7CisgICAgaW5jbWF4PWwyem0oOEwpOworICB9ZWxzZXsKKyAgICBpbmNtaW49bDJ6bSgtMkwpOworICAgIGluY21heD1sMnptKDJMKTsKKyAgfQorICBmcmFtZV91c2VkPTA7CisgIGZvcig7cDtwPXAtPm5leHQpeworICAgIGM9cC0+Y29kZTsKKyAgICBpZighZnJhbWVfdXNlZCl7CisgICAgICBpZigocC0+cTEuZmxhZ3MmKFJFR3xWQVIpKT09VkFSJiYhSVNTVEFUSUMocC0+cTEudikpIGZyYW1lX3VzZWQ9MTsKKyAgICAgIGlmKChwLT5xMi5mbGFncyYoUkVHfFZBUikpPT1WQVImJiFJU1NUQVRJQyhwLT5xMi52KSkgZnJhbWVfdXNlZD0xOworICAgICAgaWYoKHAtPnouZmxhZ3MmKFJFR3xWQVIpKT09VkFSJiYhSVNTVEFUSUMocC0+ei52KSkgZnJhbWVfdXNlZD0xOworICAgIH0KKyAgICAvKiBsZXR6dGVzIExhYmVsIG1lcmtlbiAqLworICAgIGlmKGMhPUZSRUVSRUcmJmMhPUFMTE9DUkVHJiYoYyE9U0VUUkVUVVJOfHwhaXNyZWcocTEpfHxwLT5xMS5yZWchPXAtPnoucmVnKSkgZXhpdF9sYWJlbD0wOworICAgIGlmKGM9PUxBQkVMKSBleGl0X2xhYmVsPXAtPnR5cGY7CisjaWYgMAorICAgIC8qIGFuZCB4LCNjb25zdDtibmUvYmVxLCBGSVhNRSAqLworICAgIGlmKGM9PUFORCYmaXNjb25zdChxMikmJmlzcmVnKHopKXsKKyAgICAgIGxvbmcgYml0OworICAgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHAtPnR5cGYpOworICAgICAgaWYoYml0PXBvZjIodnVtYXgpKXsKKwlzdHJ1Y3QgSUMgKmNtcD0wO2ludCBmcj0wOworCWZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKwkgIGMyPXAyLT5jb2RlOworCSAgaWYoYzI9PVRFU1QpeworCSAgICBpZigocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMS5yZWc9PXAtPnoucmVnKXsKKwkgICAgICBjbXA9cDI7Y29udGludWU7CisJICAgIH0KKwkgIH0KKwkgIGlmKGMyPT1DT01QQVJFJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMS5yZWc9PXAtPnoucmVnJiYocDItPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKwkgICAgZXZhbF9jb25zdCgmcDItPnEyLnZhbCxwMi0+dHlwZik7CisJICAgIGlmKElTTlVMTCgpKXsKKwkgICAgICBjbXA9cDI7Y29udGludWU7CisJICAgIH0KKwkgICAgYnJlYWs7CisJICB9CisJICBpZihjMj09RlJFRVJFRyYmcDItPnExLnJlZz09cC0+ei5yZWcpIHtmcisrO2NvbnRpbnVlO30KKwkgIGlmKChjMj09Qk5FfHxjMj09QkVRKSYmY21wJiZmcj09MSl7CisJICAgIHAtPmV4dC5mbGFncz1FWFRfSUNfQlRTVDsKKwkgICAgcDItPmV4dC5mbGFncz1FWFRfSUNfQlRTVDsKKwkgICAgcDItPmV4dC5vZmZzZXQ9Yml0LTE7CisJICAgIGNtcC0+Y29kZT1OT1A7CisJICAgIGNtcC0+cTEuZmxhZ3M9Y21wLT5xMi5mbGFncz1jbXAtPnouZmxhZ3M9MDsKKwkgICAgYnJlYWs7CisJICB9CisJICBpZigoKHAyLT5xMS5mbGFncyZSRUcpJiZwMi0+cTEucmVnPT1wLT56LnJlZyl8fCgocDItPnEyLmZsYWdzJlJFRykmJnAyLT5xMi5yZWc9PXAtPnoucmVnKXx8KChwMi0+ei5mbGFncyZSRUcpJiZwMi0+ei5yZWc9PXAtPnoucmVnKSkgYnJlYWs7CisJICBpZihjMj09Q0FMTHx8YzI9PUxBQkVMfHwoYzI+PUJFUSYmYzI8PUJSQSkpIGJyZWFrOworCX0KKyAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICAvKiBUcnkgZCxpZHggKi8KKyAgICBpZihjPT1BRERJMlAmJklTUkFDQyhxMikmJklTUklEWCh6KSYmKElTUklEWChxMSl8fHAtPnEyLnJlZyE9cC0+ei5yZWcpKXsKKyAgICAgIGludCBiYXNlLGlkeDtzdHJ1Y3Qgb2JqICpvOworICAgICAgcj1wLT56LnJlZztpZHg9cC0+cTIucmVnOworICAgICAgaWYoaXNyZWcocTEpKSBiYXNlPXAtPnExLnJlZzsgZWxzZSBiYXNlPXI7CisgICAgICBvPTA7CisgICAgICBmb3IocDI9cC0+bmV4dDtwMjtwMj1wMi0+bmV4dCl7CisgICAgICAgIGMyPXAyLT5jb2RlOworICAgICAgICBpZihjMj09Q0FMTHx8YzI9PUxBQkVMfHwoYzI+PUJFUSYmYzI8PUJSQSkpIGJyZWFrOworICAgICAgICBpZihjMiE9RlJFRVJFRyYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1yKSBicmVhazsKKyAgICAgICAgaWYoYzIhPUZSRUVSRUcmJihwMi0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnEyLnJlZz09cikgYnJlYWs7CisgICAgICAgIGlmKChwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+ei5yZWc9PWlkeCYmaWR4IT1yKSBicmVhazsKKwkKKyAgICAgICAgaWYoYzIhPUNBTEwmJihjMjxMQUJFTHx8YzI+QlJBKS8qJiZjMiE9QUREUkVTUyovKXsKKyAgICAgICAgICBpZighcDItPnExLmFtJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTEucmVnPT1yKXsKKyAgICAgICAgICAgIGlmKG98fCFJU0NIV09SRChxMXR5cChwMikpKSBicmVhazsKKyAgICAgICAgICAgIG89JnAyLT5xMTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYoIXAyLT5xMi5hbSYmKHAyLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnEyLnJlZz09cil7CisJICAgIGJyZWFrOyAvKlRPRE86IGNoZWNrIHdoYXQgaXMgcG9zc2libGUgKi8KKyAgICAgICAgICAgIGlmKG98fCFJU0NIV09SRChxMnR5cChwMikpKSBicmVhazsKKyAgICAgICAgICAgIG89JnAyLT5xMjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYoIXAyLT56LmFtJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT56LnJlZz09cil7CisJICAgIGJyZWFrOyAvKlRPRE86IGNoZWNrIHdoYXQgaXMgcG9zc2libGUgKi8KKyAgICAgICAgICAgIGlmKG98fCFJU0NIV09SRCh6dHlwKHAyKSkpIGJyZWFrOworICAgICAgICAgICAgbz0mcDItPno7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKGMyPT1GUkVFUkVHfHwocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgICAgICAgaW50IG07CisgICAgICAgICAgaWYoYzI9PUZSRUVSRUcpCisgICAgICAgICAgICBtPXAyLT5xMS5yZWc7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbT1wMi0+ei5yZWc7CisgICAgICAgICAgaWYobT09cil7CisgICAgICAgICAgICBpZihvKXsKKyAgICAgICAgICAgICAgby0+YW09YW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworICAgICAgICAgICAgICBhbS0+ZmxhZ3M9QUNDX0lORDsKKyAgICAgICAgICAgICAgYW0tPmJhc2U9YmFzZTsKKwkgICAgICBpZihpZHghPWFjYykgaWVycm9yKDApOworICAgICAgICAgICAgICBhbS0+b2Zmc2V0PWlkeDsKKwkgICAgICBpZihpc3JlZyhxMSkpeworCQlwLT5jb2RlPWM9Tk9QO3AtPnExLmZsYWdzPXAtPnEyLmZsYWdzPXAtPnouZmxhZ3M9MDsKKwkgICAgICB9ZWxzZXsKKwkJcC0+Y29kZT1jPUFTU0lHTjtwLT5xMi5mbGFncz0wOworCQlwLT50eXBmPXAtPnR5cGYyO3AtPnEyLnZhbC52bWF4PXNpemV0YWJbcC0+dHlwZjImTlFdOworCSAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZihjMiE9RlJFRVJFRyYmbT09YmFzZSkgYnJlYWs7CisJICBjb250aW51ZTsKKwl9CisJLyogYmV0dGVyIG5vIGluc3RydWN0aW9ucyBiZXR3ZWVuLCBhY2N1IHVzZWQgdG9vIG11Y2ggKi8KKwlpZihjMiE9RlJFRVJFRyYmYzIhPUFMTE9DUkVHJiYhbykgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIC8qIFBPU1RfSU5DL0RFQyBpbiBxMSAqLworICAgIGlmKCFwLT5xMS5hbSYmKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopKXsKKyAgICAgIHI9cC0+cTEucmVnOyB0PXExdHlwKHApOworICAgICAgaWYoSVNDSFdPUkQodCkmJklTSURYKHIpJiYoIShwLT5xMi5mbGFncyZSRUcpfHxwLT5xMi5yZWchPXIpJiYoIShwLT56LmZsYWdzJlJFRyl8fHAtPnoucmVnIT1yKSl7CisJZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpeworCSAgYzI9cDItPmNvZGU7CisJICBpZigoYzI9PUFERHx8YzI9PUFEREkyUHx8KENQVT09NjgxMiYmKGMyPT1TVUJ8fGMyPT1TVUJJRlApKSkmJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMS5yZWc9PXImJnAyLT56LnJlZz09ciYmKHAyLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisJICAgIGV2YWxfY29uc3QoJnAyLT5xMi52YWwscDItPnR5cGYyKTsKKwkgICAgaWYoYzI9PVNVQnx8YzI9PVNVQklGUCkgdm1heD16bXN1YihsMnptKDBMKSx2bWF4KTsKKwkgICAgaWYoem1sZXEodm1heCxpbmNtYXgpJiZ6bWxlcShpbmNtaW4sdm1heCkpeworCSAgICAgIHAyLT5jb2RlPU5PUDsKKwkgICAgICBwMi0+cTEuZmxhZ3M9cDItPnEyLmZsYWdzPXAyLT56LmZsYWdzPTA7CisJICAgICAgcC0+cTEuYW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworCSAgICAgIHAtPnExLmFtLT5iYXNlPXI7CisJICAgICAgcC0+cTEuYW0tPnY9MDsKKwkgICAgICBpZih6bWxlcSh2bWF4LGwyem0oMEwpKSl7CisJCXAtPnExLmFtLT5mbGFncz1QT1NUX0RFQzsKKwkJcC0+cTEuYW0tPm9mZnNldD0tem0ybCh2bWF4KTsKKwkgICAgICB9ZWxzZXsKKwkJcC0+cTEuYW0tPmZsYWdzPVBPU1RfSU5DOworCQlwLT5xMS5hbS0+b2Zmc2V0PXptMmwodm1heCk7CisJICAgICAgfQorCSAgICB9ZWxzZSBicmVhazsKKwkgIH0KKwkgIGlmKGMyPT1DQUxMfHxjMj09TEFCRUx8fChjMj49QkVRJiZjMjw9QlJBKSkgYnJlYWs7CisJICBpZigoKHAyLT5xMS5mbGFncyZSRUcpJiZwMi0+cTEucmVnPT1yKXx8KChwMi0+cTIuZmxhZ3MmUkVHKSYmcDItPnEyLnJlZz09cil8fCgocDItPnouZmxhZ3MmUkVHKSYmcDItPnoucmVnPT1yKSkgYnJlYWs7CisJfQorICAgICAgfQorICAgIH0KKyAgICAvKiBQT1NUX0lOQy9ERUMgaW4gcTIgKi8KKyAgICBpZighcC0+cTIuYW0mJihwLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSl7CisgICAgICByPXAtPnEyLnJlZzsgdD1xMnR5cChwKTsKKyAgICAgIGlmKElTQ0hXT1JEKHQpJiZJU0lEWChyKSYmKCEocC0+cTEuZmxhZ3MmUkVHKXx8cC0+cTEucmVnIT1yKSYmKCEocC0+ei5mbGFncyZSRUcpfHxwLT56LnJlZyE9cikpeworCWZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKwkgIGMyPXAyLT5jb2RlOworCSAgaWYoKGMyPT1BRER8fGMyPT1BRERJMlB8fChDUFU9PTY4MTImJihjMj09U1VCfHxjMj09U1VCSUZQKSkpJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJihwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1yJiZwMi0+ei5yZWc9PXImJihwMi0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworCSAgICBldmFsX2NvbnN0KCZwMi0+cTIudmFsLHAyLT50eXBmMik7CisJICAgIGlmKGMyPT1TVUJ8fGMyPT1TVUJJRlApIHZtYXg9em1zdWIobDJ6bSgwTCksdm1heCk7CisJICAgIGlmKHptbGVxKHZtYXgsaW5jbWF4KSYmem1sZXEoaW5jbWluLHZtYXgpKXsKKwkgICAgICBwMi0+Y29kZT1OT1A7CisJICAgICAgcDItPnExLmZsYWdzPXAyLT5xMi5mbGFncz1wMi0+ei5mbGFncz0wOworCSAgICAgIHAtPnEyLmFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKKwkgICAgICBwLT5xMi5hbS0+YmFzZT1yOworCSAgICAgIHAtPnEyLmFtLT52PTA7CisJICAgICAgaWYoem1sZXEodm1heCxsMnptKDBMKSkpeworCQlwLT5xMi5hbS0+ZmxhZ3M9UE9TVF9ERUM7CisJCXAtPnEyLmFtLT5vZmZzZXQ9LXptMmwodm1heCk7CisJICAgICAgfWVsc2V7CisJCXAtPnEyLmFtLT5mbGFncz1QT1NUX0lOQzsKKwkJcC0+cTIuYW0tPm9mZnNldD16bTJsKHZtYXgpOworCSAgICAgIH0KKwkgICAgfWVsc2UgYnJlYWs7CisJICB9CisJICBpZihjMj09Q0FMTHx8YzI9PUxBQkVMfHwoYzI+PUJFUSYmYzI8PUJSQSkpIGJyZWFrOworCSAgaWYoKChwMi0+cTEuZmxhZ3MmUkVHKSYmcDItPnExLnJlZz09cil8fCgocDItPnEyLmZsYWdzJlJFRykmJnAyLT5xMi5yZWc9PXIpfHwoKHAyLT56LmZsYWdzJlJFRykmJnAyLT56LnJlZz09cikpIGJyZWFrOworCX0KKyAgICAgIH0KKyAgICB9CisgICAgLyogUE9TVF9JTkMvREVDIGluIHogKi8KKyAgICBpZighcC0+ei5hbSYmKHAtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikpeworICAgICAgcj1wLT56LnJlZzsgdD16dHlwKHApOworICAgICAgaWYoSVNDSFdPUkQodCkmJklTSURYKHIpJiYoIShwLT5xMS5mbGFncyZSRUcpfHxwLT5xMS5yZWchPXIpJiYoIShwLT5xMi5mbGFncyZSRUcpfHxwLT5xMi5yZWchPXIpKXsKKwlmb3IocDI9cC0+bmV4dDtwMjtwMj1wMi0+bmV4dCl7CisJICBjMj1wMi0+Y29kZTsKKwkgIGlmKChjMj09QUREfHxjMj09QURESTJQfHwoQ1BVPT02ODEyJiYoYzI9PVNVQnx8YzI9PVNVQklGUCkpKSYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09ciYmcDItPnoucmVnPT1yJiYocDItPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKwkgICAgZXZhbF9jb25zdCgmcDItPnEyLnZhbCxwMi0+dHlwZjIpOworCSAgICBpZihjMj09U1VCfHxjMj09U1VCSUZQKSB2bWF4PXptc3ViKGwyem0oMEwpLHZtYXgpOworCSAgICBpZih6bWxlcSh2bWF4LGluY21heCkmJnptbGVxKGluY21pbix2bWF4KSl7CisJICAgICAgcDItPmNvZGU9Tk9QOworCSAgICAgIHAyLT5xMS5mbGFncz1wMi0+cTIuZmxhZ3M9cDItPnouZmxhZ3M9MDsKKwkgICAgICBwLT56LmFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKKwkgICAgICBwLT56LmFtLT5iYXNlPXI7CisJICAgICAgcC0+ei5hbS0+dj0wOworCSAgICAgIGlmKHptbGVxKHZtYXgsbDJ6bSgwTCkpKXsKKwkJcC0+ei5hbS0+ZmxhZ3M9UE9TVF9ERUM7CisJCXAtPnouYW0tPm9mZnNldD0tem0ybCh2bWF4KTsKKwkgICAgICB9ZWxzZXsKKwkJcC0+ei5hbS0+ZmxhZ3M9UE9TVF9JTkM7CisJCXAtPnouYW0tPm9mZnNldD16bTJsKHZtYXgpOworCSAgICAgIH0KKwkgICAgfWVsc2UgYnJlYWs7CisJICB9CisJICBpZihjMj09Q0FMTHx8YzI9PUxBQkVMfHwoYzI+PUJFUSYmYzI8PUJSQSkpIGJyZWFrOworCSAgaWYoKChwMi0+cTEuZmxhZ3MmUkVHKSYmcDItPnExLnJlZz09cil8fCgocDItPnEyLmZsYWdzJlJFRykmJnAyLT5xMi5yZWc9PXIpfHwoKHAyLT56LmZsYWdzJlJFRykmJnAyLT56LnJlZz09cikpIGJyZWFrOworCX0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSLCNjICovCisgICAgaWYoKGM9PUFEREkyUHx8Yz09U1VCSUZQKSYmSVNIV09SRChwLT50eXBmKSYmKChwLT50eXBmMiZOUSk9PU5QT0lOVEVSfHwocC0+dHlwZjImTlEpPT1GUE9JTlRFUikmJmlzcmVnKHopJiYoKHAtPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUfHwoIWRyZWwmJihwLT5xMS5mbGFncyZWQVJBRFIpKSkpeworICAgICAgaW50IGJhc2U7em1heCBvZjtzdHJ1Y3Qgb2JqICpvO3N0cnVjdCBWYXIgKnY7CisgICAgICBpZihwLT5xMS5mbGFncyZWQVJBRFIpeworCXY9cC0+cTEudjsKKwlvZj1wLT5xMS52YWwudm1heDsKKwlyPXAtPnoucmVnOworCWlmKGlzcmVnKHEyKSYmSVNJRFgocC0+cTIucmVnKSkKKwkgIGJhc2U9cC0+cTIucmVnOworCWVsc2UKKwkgIGJhc2U9cjsKKyAgICAgIH1lbHNleworCWV2YWxfY29uc3QoJnAtPnEyLnZhbCxwLT50eXBmKTsKKwlpZihjPT1TVUJJRlApIG9mPXptc3ViKGwyem0oMEwpLHZtYXgpOyBlbHNlIG9mPXZtYXg7CisJdj0wOworCXI9cC0+ei5yZWc7CisJaWYoaXNyZWcocTEpJiZJU0lEWChwLT5xMS5yZWcpKSBiYXNlPXAtPnExLnJlZzsgZWxzZSBiYXNlPXI7CisgICAgICB9CisgICAgICBvPTA7CisgICAgICBmb3IocDI9cC0+bmV4dDtwMjtwMj1wMi0+bmV4dCl7CisJYzI9cDItPmNvZGU7CisJaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKKwlpZihjMiE9RlJFRVJFRyYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1yKSBicmVhazsKKwlpZihjMiE9RlJFRVJFRyYmKHAyLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTIucmVnPT1yKSBicmVhazsKKwlpZihjMiE9Q0FMTCYmKGMyPExBQkVMfHxjMj5CUkEpLyomJmMyIT1BRERSRVNTKi8peworCSAgaWYoIXAyLT5xMS5hbSYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnExLnJlZz09cil7CisJICAgIGlmKG98fCFJU0hXT1JEKHExdHlwKHAyKSkpIGJyZWFrOworCSAgICBvPSZwMi0+cTE7CisJICB9CisJICBpZighcDItPnEyLmFtJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTIucmVnPT1yKXsKKwkgICAgaWYob3x8IUlTSFdPUkQocTJ0eXAocDIpKSkgYnJlYWs7CisJICAgIG89JnAyLT5xMjsKKwkgIH0KKwkgIGlmKCFwMi0+ei5hbSYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+ei5yZWc9PXIpeworCSAgICBpZihvfHwhSVNIV09SRCh6dHlwKHAyKSkpIGJyZWFrOworCSAgICBvPSZwMi0+ejsKKwkgIH0KKwl9CisJaWYoYzI9PUZSRUVSRUd8fChwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKwkgIGludCBtOworCSAgaWYoYzI9PUZSRUVSRUcpIAorCSAgICBtPXAyLT5xMS5yZWc7CisJICBlbHNlCisJICAgIG09cDItPnoucmVnOworCSAgaWYobT09cil7CisJICAgIGlmKG8peworCSAgICAgIG8tPmFtPWFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKKwkgICAgICBhbS0+ZmxhZ3M9SU1NX0lORDsKKwkgICAgICBhbS0+YmFzZT1iYXNlOworCSAgICAgIGFtLT5vZmZzZXQ9em0ybChvZik7CisJICAgICAgYW0tPnY9djsKKwkgICAgICBpZighdil7CisJCWlmKGlzcmVnKHExKSYmSVNJRFgocC0+cTEucmVnKSl7CisJCSAgcC0+Y29kZT1jPU5PUDtwLT5xMS5mbGFncz1wLT5xMi5mbGFncz1wLT56LmZsYWdzPTA7CisJCX1lbHNleworCQkgIHAtPmNvZGU9Yz1BU1NJR047cC0+cTIuZmxhZ3M9MDsKKwkJICBwLT50eXBmPXAtPnR5cGYyO3AtPnEyLnZhbC52bWF4PXNpemV0YWJbcC0+dHlwZjImTlFdOworCQl9CisJICAgICAgfWVsc2V7CisJCWlmKGlzcmVnKHEyKSYmSVNJRFgocC0+cTIucmVnKSl7CisJCSAgcC0+Y29kZT1jPU5PUDtwLT5xMS5mbGFncz1wLT5xMi5mbGFncz1wLT56LmZsYWdzPTA7CisJCX1lbHNleworCQkgIHAtPmNvZGU9Yz1BU1NJR047cC0+cTE9cC0+cTI7cC0+cTIuZmxhZ3M9MDsKKwkJICBwLT5xMi52YWwudm1heD1zaXpldGFiW3AtPnR5cGYmTlFdOworCQl9CisJICAgICAgfQorCSAgICB9CisJICAgIGJyZWFrOworCSAgfQorCSAgaWYoLypnZXRfcmVnISEgYzIhPUZSRUVSRUcmJiovbT09YmFzZSkgYnJlYWs7CisJICBjb250aW51ZTsKKwl9CisgICAgICB9CisgICAgfSAgICAgIAorICB9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqICpjYW0oaW50IGZsYWdzLGludCBiYXNlLGxvbmcgb2Zmc2V0LHN0cnVjdCBWYXIgKnYpCisvKiAgSW5pdGlhbGl6ZXMgYW4gYWRkcmVzc2luZy1tb2RlIHN0cnVjdHVyZSBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gICAqLworLyogIHRoYXQgb2JqZWN0LiBXaWxsIG5vdCBzdXJ2aXZlIGEgc2Vjb25kIGNhbGwhICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgc3RhdGljIHN0cnVjdCBvYmogb2JqOworICBzdGF0aWMgc3RydWN0IEFkZHJlc3NpbmdNb2RlIGFtOworICBvYmouYW09JmFtOworICBhbS5mbGFncz1mbGFnczsKKyAgYW0uYmFzZT1iYXNlOworICBhbS5vZmZzZXQ9b2Zmc2V0OworICBhbS52PXY7CisgIHJldHVybiAmb2JqOworfQorCitzdGF0aWMgdm9pZCBnZXRfYWNjKEZJTEUgKmYsc3RydWN0IElDICpwKQoreworICBpZihyZWdzW2FjY10peworICAgIGlmKHAtPnEyLmFtKQorICAgICAgaWYocC0+cTIuYW0tPmZsYWdzPT1BQ0NfSU5EKSBpZXJyb3IoMCk7CisgICAgZWxzZQorICAgICAgaWYoKHAtPnEyLmZsYWdzJlJFRykmJklTQUNDKHAtPnEyLnJlZykpIGllcnJvcigwKTsKKyAgICBpZihwLT56LmFtKQorICAgICAgaWYocC0+ei5hbS0+ZmxhZ3M9PUFDQ19JTkQpIGllcnJvcigwKTsKKyAgICBlbHNlCisgICAgICBpZigocC0+ei5mbGFncyZSRUcpJiZJU0FDQyhwLT56LnJlZykpIGllcnJvcigwKTsKKyAgICBpZihyZWdzW2FjY10peworICAgICAgZW1pdChmLFNQVVNIRCk7CisgICAgICBwdXNoKDIpOworICAgICAgcHVzaGVkX2FjYz0xOworICAgIH0KKyAgfQorfQorc3RhdGljIGludCBnZXRfaWR4KEZJTEUgKmYsSUMgKnApCit7CisgIGludCByOworICBmb3Iocj0xO3I8PU1BWFI7cisrKXsKKyAgICBpZihJU0lEWChyKSl7CisgICAgICBpZighcmVnc1tyXSl7CisJcmVnc1tyXXw9NDsKKwlyZXR1cm4gcjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZm9yKHI9MTtyPD1NQVhSO3IrKyl7CisgICAgaWYoSVNJRFgocikpeworICAgICAgaWYoKCEocC0+cTEuZmxhZ3MmUkVHKXx8cC0+cTEucmVnIT1yKSYmCisJICghKHAtPnEyLmZsYWdzJlJFRyl8fHAtPnEyLnJlZyE9cikmJgorCSAoIShwLT56LmZsYWdzJlJFRyl8fHAtPnoucmVnIT1yKSl7CisJZW1pdChmLCJcdCVzJXNcbiIsQ1BVPT02ODEyPyJwc2giOiJwc2hzXHQiLHJlZ25hbWVzW3JdKTsKKwlyZWdzW3JdfD04OworCXB1c2goMik7CisJcmV0dXJuIHI7CisgICAgICB9CisgICAgfQorICB9CisgIGllcnJvcigwKTsKK30KK3N0YXRpYyBpbnQgZ2V0X3JlZyhGSUxFICpmLHN0cnVjdCBJQyAqcCxpbnQgdCkKK3sKKyAgaW50IHJlZzsKKyAgaWYoIXJlZ3NbYWNjXSkKKyAgICByZWc9YWNjOworICBlbHNlIGlmKElTSFdPUkQodCkmJiFyZWdzW2l4XSkKKyAgICByZWc9aXg7CisjaWYgMAorICBlbHNlIGlmKElTSFdPUkQodCkmJiFyZWdzW2l5XSkKKyAgICByZWc9aXk7CisjZW5kaWYKKyAgZWxzZXsKKyAgICBnZXRfYWNjKGYscCk7CisgICAgcmVnPWFjYzsKKyAgfQorICBCU0VUKHJlZ3NfbW9kaWZpZWQscmVnKTsKKyAgcmV0dXJuIHJlZzsKK30KK3N0YXRpYyB2b2lkIGxvYWRfcmVnKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdCkKK3sKKyAgaWYoIW8tPmFtKXsKKyAgICBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgICBpZihvLT5yZWc9PXIpIHJldHVybjsKKyAgICAgIGVtaXQoZiwiXHR0ZnJcdCVzLCVzXG4iLHJlZ25hbWVzW28tPnJlZ10scmVnbmFtZXNbcl0pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZihyPT1hY2MmJihvLT5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisgICAgICBldmFsX2NvbnN0KCZvLT52YWwsdCk7CisgICAgICBpZih6bWVxdG8odm1heCxsMnptKDBMKSkmJnp1bWVxdG8odnVtYXgsdWwyenVtKDBVTCkpKXsKKwlpZihDUFUhPTY4MTImJiFvcHRzaXplKQorCSAgZW1pdChmLCJcdGxkZFx0IzBcbiIpOworCWVsc2UKKwkgIGVtaXQoZiwiXHRjbHJhXG5cdGNscmJcbiIpOyAKKwljYz1vO2NjX3Q9dDsKKwlyZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisgIGlmKG8tPmZsYWdzJlZBUkFEUil7CisgICAgY2hhciAqYmFzZT0wOworICAgIGlmKHBjcmVsJiZJU0ZVTkMoby0+di0+dnR5cC0+ZmxhZ3MpKQorICAgICAgYmFzZT0icGMiOworICAgIGlmKGRyZWwmJiFJU0ZVTkMoby0+di0+dnR5cC0+ZmxhZ3MpKQorICAgICAgYmFzZT1yZWduYW1lc1tpdV07CisgICAgaWYoYmFzZSYmIXNraXBfcmVsKXsKKyAgICAgIGlmKElTQUNDKHIpKQorCWVtaXQoZiwiXHR0ZnJcdCVzLGRcbiIsYmFzZSk7CisgICAgICBpZihJU0lEWChyKSkKKwllbWl0KGYsIlx0bGVhJXNcdCIscmVnbmFtZXNbcl0pOworICAgICAgZWxzZXsKKwlpZigqYmFzZT09J3AnKSBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwllbWl0KGYsIlx0YWRkZFx0IyIpOworICAgICAgfQorICAgICAgZW1pdHptKGYsby0+dmFsLnZtYXgpOworICAgICAgZW1pdChmLCIrIik7CisgICAgICBpZihvLT52LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pCisJZW1pdChmLCIlcyVzIixpZHByZWZpeCxvLT52LT5pZGVudGlmaWVyKTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIiVzJWxkIixsYWJwcmVmaXgsem0ybChvLT52LT5vZmZzZXQpKTsKKyAgICAgIGlmKElTSURYKHIpKQorCWVtaXQoZiwiLCVzIixiYXNlKTsKKyAgICAgIGVsc2UgaWYoKmJhc2U9PSdwJykKKwllbWl0KGYsIi0lcyVkIixsYWJwcmVmaXgsbGFiZWwpOworICAgICAgZW1pdChmLCJcbiIpOworICAgICAgY2M9bztjY190PXQ7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHNraXBfcmVsPTA7CisgIH0KKyAgZW1pdChmLCJcdGxkJXNcdCIsKHI9PWFjYyYmKHQmTlEpPT1DSEFSKT8oQ1BVPT02ODEyPyJhYiI6ImIiKTpyZWduYW1lc1tyXSk7CisgIGVtaXRfb2JqKGYsbyx0KTtlbWl0KGYsIlxuIik7CisgIGNjPW87Y2NfdD10OworfQorc3RhdGljIHZvaWQgc3RvcmVfcmVnKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdCkKK3sKKyAgaWYoKG8tPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpeworICAgIGlmKG8tPnJlZz09cikgcmV0dXJuOworICAgIGVtaXQoZiwiXHR0ZnJcdCVzLCVzXG4iLHJlZ25hbWVzW3JdLHJlZ25hbWVzW28tPnJlZ10pOworICB9ZWxzZXsKKyAgICBpZihyPT1hY2MmJih0Jk5RKT09Q0hBUikKKyAgICAgIGVtaXQoZiwiXHRzdCVzXHQiLChDUFU9PTY4MTIpPyJhYiI6ImIiKTsKKyAgICBlbHNlCisgICAgICBlbWl0KGYsIlx0c3Qlc1x0IixyZWduYW1lc1tyXSk7CisgICAgZW1pdF9vYmooZixvLHQpO2VtaXQoZiwiXG4iKTsKKyAgICBjYz1vO2NjX3Q9dDsKKyAgfQorfQorc3RhdGljIHZvaWQgbG9hZF9hZGRyKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbykKK3sKKyAgaWYoby0+YW0peworICAgIGlmKG8tPmFtLT5mbGFncz09SU1NX0lORCl7CisgICAgICBpZihvLT5hbS0+YmFzZT09ciYmby0+YW0tPm9mZnNldD09MCYmIW8tPmFtLT52KSByZXR1cm47CisgICAgICBpZihJU0lEWChyKSl7CisJZW1pdChmLCJcdGxlYSVzXHQiLHJlZ25hbWVzW3JdKTsKKwllbWl0X29iaihmLG8sMCk7CisJZW1pdChmLCJcbiIpOworICAgICAgfWVsc2V7CisJaWYociE9YWNjKSBpZXJyb3IoMCk7CisJZW1pdChmLCJcdHRmclx0JXMsJXNcbiIscmVnbmFtZXNbby0+YW0tPmJhc2VdLHJlZ25hbWVzW3JdKTsKKwllbWl0KGYsIlx0YWRkZFx0IyVsZFxuIixvLT5hbS0+b2Zmc2V0KTsKKwlpZihvLT5hbS0+dil7CisJICBpZihvLT5hbS0+di0+c3RvcmFnZV9jbGFzcz09U1RBVElDKQorCSAgICBlbWl0KGYsIislcyVsZCIsbGFicHJlZml4LHptMmwoby0+YW0tPnYtPm9mZnNldCkpOworCSAgZWxzZQorCSAgICBlbWl0KGYsIislcyVzIixpZHByZWZpeCxvLT5hbS0+di0+aWRlbnRpZmllcik7CisJfQorCWVtaXQoZiwiXG4iKTsKKwljYz0wOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZXJyb3IoMCk7CisgIH0KKyAgaWYoby0+ZmxhZ3MmRFJFRk9CSil7CisgICAgby0+ZmxhZ3MmPX5EUkVGT0JKOworICAgIGxvYWRfcmVnKGYscixvLG8tPmR0eXApOworICAgIG8tPmZsYWdzfD1EUkVGT0JKOworICAgIHJldHVybjsKKyAgfQorICBpZigoby0+ZmxhZ3MmKFZBUnxWQVJBRFIpKT09VkFSKXsKKyAgICBpZihvLT52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUN8fG8tPnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisgICAgICBvLT5mbGFnc3w9VkFSQURSOworICAgICAgbG9hZF9yZWcoZixyLG8sUE9JTlRFUl9UWVBFKG8tPnYtPnZ0eXApKTsKKyAgICAgIG8tPmZsYWdzJj1+VkFSQURSOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZih2b2ZmKG8pPT0wKXsKKyAgICAgIGVtaXQoZiwiXHR0ZnJcdCVzLCVzXG4iLHJlZ25hbWVzW3NwXSxyZWduYW1lc1tyXSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKElTSURYKHIpKXsKKyAgICAgIGVtaXQoZiwiXHRsZWElc1x0IixyZWduYW1lc1tyXSk7CisgICAgICBlbWl0X29iaihmLG8sMCk7CisgICAgICBlbWl0KGYsIlxuIik7CisgICAgfWVsc2V7CisgICAgICBpZihyIT1hY2MpIGllcnJvcigwKTsKKyAgICAgIGVtaXQoZiwiXHR0ZnJcdCVzLCVzXG4iLHJlZ25hbWVzW3NwXSxyZWduYW1lc1tyXSk7CisgICAgICBlbWl0KGYsIlx0YWRkZFx0IyVsZFxuIix2b2ZmKG8pKTsKKyAgICAgIGNjPTA7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBpZXJyb3IoMCk7Cit9CisKK3N0YXRpYyBpbnQgc2NyYXRjaHJlZyhpbnQgcixzdHJ1Y3QgSUMgKnApCit7CisgIGludCBjOworICB3aGlsZSgxKXsKKyAgICBwPXAtPm5leHQ7CisgICAgaWYoIXB8fCgoYz1wLT5jb2RlKT09RlJFRVJFRyYmcC0+cTEucmVnPT1yKSkgcmV0dXJuIDE7CisgICAgaWYoYz09Q0FMTHx8KGM+PUJFUSYmYzw9QlJBKSkgcmV0dXJuIDA7CisgICAgaWYoKHAtPnExLmZsYWdzJlJFRykmJnAtPnExLnJlZz09cikgcmV0dXJuIDA7CisgICAgaWYoKHAtPnEyLmZsYWdzJlJFRykmJnAtPnEyLnJlZz09cikgcmV0dXJuIDA7CisgICAgaWYoKHAtPnouZmxhZ3MmUkVHKSYmcC0+ei5yZWc9PXIpIHJldHVybiAwOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIEVuZCBvZiBwcml2YXRlIGZhdGEgYW5kIGZ1bmN0aW9ucy4gICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitpbnQgaW5pdF9jZyh2b2lkKQorLyogIERvZXMgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9ucyBmb3IgdGhlIGNvZGUtZ2VuZXJhdG9yLiBHZXRzIGNhbGxlZCAgKi8KKy8qICBvbmNlIGF0IHRoZSBiZWdpbm5pbmcgYW5kIHNob3VsZCByZXR1cm4gMCBpbiBjYXNlIG9mIHByb2JsZW1zLiAgICAgICovCit7CisgIGludCBpOworCisgIENQVT1DUFVPUFQ7CisKKyAgaWYoZ19mbGFnc1sxM10mVVNFREZMQUcpeworICAgIG1zaXpldGFiW0RPVUJMRV09bXNpemV0YWJbTERPVUJMRV09ODsKKyAgICBkY3RbRE9VQkxFXT1kY3RbTERPVUJMRV09Ii44Ynl0ZSI7CisgIH0KKyAgCisKKyAgLyogIEluaXRpYWxpemUgc29tZSB2YWx1ZXMgd2hpY2ggY2Fubm90IGJlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgICAqLworICAvKiAgYmVjYXVzZSB0aGV5IGFyZSBzdG9yZWQgaW4gdGhlIHRhcmdldCdzIGFyaXRobWV0aWMuICAgICAgICAgICAgICovCisgIG1heGFsaWduPWwyem0oMUwpOworICBjaGFyX2JpdD1sMnptKDhMKTsKKyAgZm9yKGk9MDtpPD1NQVhfVFlQRTtpKyspeworICAgIHNpemV0YWJbaV09bDJ6bShtc2l6ZXRhYltpXSk7CisgICAgYWxpZ25baV09bDJ6bShtYWxpZ25baV0pOworICB9CisgIGZvcihpPTE7aTw9aXU7aSsrKXsKKyAgICByZWdzaXplW2ldPWwyem0oMkwpO3JlZ3R5cGVbaV09Jml0eXA7CisgIH0JCisgIHJlZ3NpemVbZHhdPWwyem0oNEwpO3JlZ3R5cGVbaV09Jmx0eXA7CisKKyAgLyogIEluaXRpYWxpemUgdGhlIG1pbi9tYXgtc2V0dGluZ3MuIE5vdGUgdGhhdCB0aGUgdHlwZXMgb2YgdGhlICAgICAqLworICAvKiAgaG9zdCBzeXN0ZW0gbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSB0YXJnZXQgc3lzdGVtIGFuZCB5b3UgbWF5ICovCisgIC8qICBvbmx5IHVzZSB0aGUgc21hbGxlc3QgbWF4aW11bSB2YWx1ZXMgQU5TSSBndWFyYW50ZWVzIGlmIHlvdSAgICAgKi8KKyAgLyogIHdhbnQgdG8gYmUgcG9ydGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgVGhhdCdzIHRoZSByZWFzb24gZm9yIHRoZSBzdWJ0cmFjdGlvbiBpbiB0X21pbltJTlRdLiBMb25nIGNvdWxkICovCisgIC8qICBiZSB1bmFibGUgdG8gcmVwcmVzZW50IC0yMTQ3NDgzNjQ4IG9uIHRoZSBob3N0IHN5c3RlbS4gICAgICAgICAgKi8KKyAgdF9taW5bQ0hBUl09bDJ6bSgtMTI4TCk7CisgIHRfbWluW1NIT1JUXT1sMnptKC0zMjc2OEwpOworICB0X21pbltJTlRdPXRfbWluW1NIT1JUXTsKKyAgdF9taW5bTE9OR109em1zdWIobDJ6bSgtMjE0NzQ4MzY0N0wpLGwyem0oMUwpKTsKKyAgdF9taW5bTExPTkddPXptbHNoaWZ0KGwyem0oMUwpLGwyem0oNjNMKSk7CisgIHRfbWluW01BWElOVF09dF9taW4oTExPTkcpOworICB0X21heFtDSEFSXT11bDJ6dW0oMTI3TCk7CisgIHRfbWF4W1NIT1JUXT11bDJ6dW0oMzI3NjdVTCk7CisgIHRfbWF4W0lOVF09dF9tYXhbU0hPUlRdOworICB0X21heFtMT05HXT11bDJ6dW0oMjE0NzQ4MzY0N1VMKTsKKyAgdF9tYXhbTExPTkddPXp1bXJzaGlmdCh6dW1rb21wbCh1bDJ6dW0oMFVMKSksdWwyenVtKDFVTCkpOworICB0X21heFtNQVhJTlRdPXRfbWF4KExMT05HKTsKKyAgdHVfbWF4W0NIQVJdPXVsMnp1bSgyNTVVTCk7CisgIHR1X21heFtTSE9SVF09dWwyenVtKDY1NTM1VUwpOworICB0dV9tYXhbSU5UXT10dV9tYXhbU0hPUlRdOworICB0dV9tYXhbTE9OR109dWwyenVtKDQyOTQ5NjcyOTVVTCk7CisgIHR1X21heFtMTE9OR109enVta29tcGwodWwyenVtKDBVTCkpOworICB0dV9tYXhbTUFYSU5UXT10X21heChVTlNJR05FRHxMTE9ORyk7CisKKyAgaWYoZ19mbGFnc1s5XSZVU0VERkxBRykgZHJlbD0xOworICBpZihnX2ZsYWdzWzEwXSZVU0VERkxBRykgTUlOQURESTJQPVNIT1JUOworICBpZihnX2ZsYWdzWzExXSZVU0VERkxBRykgbm9keD0xOworICBpZihnX2ZsYWdzWzEyXSZVU0VERkxBRykgbm91PTE7CisKKworICBpZihDUFU9PTY4MTIpIHN3aXRjaHN1YnM9MTsKKworICAvKiAgUmVzZXJ2ZSBhIGZldyByZWdpc3RlcnMgZm9yIHVzZSBieSB0aGUgY29kZS1nZW5lcmF0b3IuICAgICAgKi8KKyAgcmVnc2Fbc3BdPVJFR1NBX05FVkVSOworICByZWdzY3JhdGNoW3NwXT0wOworCisgIGlmKENQVT09NjgxMnx8ZHJlbHx8bm91KXsKKyAgICByZWdzYVtpdV09UkVHU0FfTkVWRVI7CisgICAgcmVnc2NyYXRjaFtpdV09MDsKKyAgfQorCisgIGlmKENQVSE9NjgxMil7CisgICAgcmVnbmFtZXNbc3BdPSJzIjsKKyAgICBsb2dpY2Fsc1swXT0ib3IiOworICB9CisKKyAgaWYoIShnX2ZsYWdzWzZdJlVTRURGTEFHKSl7CisgICAgZXh0ZXJuIGludCBzdGF0aWNfY3NlLGRyZWZfY3NlOworICAgIHN0YXRpY19jc2U9MDsKKyAgICBkcmVmX2NzZT0wOworICB9CisKKyAgaWYoIShnX2ZsYWdzWzddJlVTRURGTEFHKSl7CisgICAgcmVnc2FbYWNjXT1SRUdTQV9URU1QUzsKKyAgICByZWdzYVtkeF09UkVHU0FfVEVNUFM7CisgIH0KKworICBpZihnX2ZsYWdzWzhdJlVTRURGTEFHKXsKKyAgICBwY3JlbD0xOworICAgIGpzcmluc3Q9Imxic3IiOworICAgIGptcGluc3Q9ImxicmEiOworICAgIHJvZGF0YW5hbWU9Ilx0LmRhdGFcbiI7CisgIH0KKworICBpZihDUFU9PTY4MDkpCisgICAgbWFycmF5WzFdPSJfXzY4MDlfXyI7CisgIGlmKENQVT09NjMwOSkKKyAgICBtYXJyYXlbMV09Il9fNjMwOV9fIjsKKyAgaWYoQ1BVPT05KQorICAgIG1hcnJheVsxXT0iX19UVVJCTzlfXyI7CisgIHRhcmdldF9tYWNyb3M9bWFycmF5OworCisKKyAgaWYoQ1BVPT05fHxDUFU9PTY4MTIpeworICAgIGRlY2xhcmVfYnVpbHRpbigiX19tdWxpbnQxNiIsSU5ULElOVCxhY2MsSU5ULGl5LDEsbXlzdHJkdXAoIlx0ZW11bCIpKTsKKyAgICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2aW50MTYiLElOVCxJTlQsYWNjLElOVCxpeCwxLG15c3RyZHVwKCJcdGlkaXZzXG5cdHRmclx0eCxkIikpOworICAgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZ1aW50MTYiLFVOU0lHTkVEfElOVCxVTlNJR05FRHxJTlQsYWNjLFVOU0lHTkVEfElOVCxpeCwxLG15c3RyZHVwKCJcdGlkaXZcblx0dGZyXHR4LGQiKSk7CisgICAgZGVjbGFyZV9idWlsdGluKCJfX21vZGludDE2IixJTlQsSU5ULGFjYyxJTlQsaXgsMSxteXN0cmR1cCgiXHRpZGl2cyIpKTsKKyAgICBkZWNsYXJlX2J1aWx0aW4oIl9fbW9kdWludDE2IixVTlNJR05FRHxJTlQsVU5TSUdORUR8SU5ULGFjYyxVTlNJR05FRHxJTlQsaXgsMSxteXN0cmR1cCgiXHRpZGl2IikpOworICB9ZWxzZXsKKyAgICBkZWNsYXJlX2J1aWx0aW4oIl9fbXVsaW50MTYiLElOVCxJTlQsYWNjLElOVCwwLDEsMCk7CisgICAgZGVjbGFyZV9idWlsdGluKCJfX2RpdmludDE2IixJTlQsSU5ULGl4LElOVCxhY2MsMSwwKTsKKyAgICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2dWludDE2IixVTlNJR05FRHxJTlQsVU5TSUdORUR8SU5ULGl4LFVOU0lHTkVEfElOVCxhY2MsMSwwKTsKKyAgICBkZWNsYXJlX2J1aWx0aW4oIl9fbW9kaW50MTYiLElOVCxJTlQsaXgsSU5ULGFjYywxLDApOworICAgIGRlY2xhcmVfYnVpbHRpbigiX19tb2R1aW50MTYiLFVOU0lHTkVEfElOVCxVTlNJR05FRHxJTlQsaXgsVU5TSUdORUR8SU5ULGFjYywxLDApOworICB9CisKKyAgLyogVE9ETzogc2V0IGFyZ3VtZW50IHJlZ2lzdGVycyAqLworICBkZWNsYXJlX2J1aWx0aW4oIl9fbXVsaW50MzIiLExPTkcsTE9ORywwLExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fYWRkaW50MzIiLExPTkcsTE9ORywwLExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fc3ViaW50MzIiLExPTkcsTE9ORywwLExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fYW5kaW50MzIiLExPTkcsTE9ORywwLExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fb3JpbnQzMiIsTE9ORyxMT05HLDAsTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19lb3JpbnQzMiIsTE9ORyxMT05HLDAsTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19uZWdpbnQzMiIsTE9ORyxMT05HLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19sc2xpbnQzMiIsTE9ORyxMT05HLDAsSU5ULDAsMSwwKTsKKworICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2aW50MzIiLExPTkcsTE9ORywwLExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2dWludDMyIixVTlNJR05FRHxMT05HLFVOU0lHTkVEfExPTkcsMCxVTlNJR05FRHxMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZGludDMyIixMT05HLExPTkcsMCxMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZHVpbnQzMiIsVU5TSUdORUR8TE9ORyxVTlNJR05FRHxMT05HLDAsVU5TSUdORUR8TE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19sc3JzaW50MzIiLExPTkcsTE9ORywwLElOVCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19sc3J1aW50MzIiLFVOU0lHTkVEfExPTkcsVU5TSUdORUR8TE9ORywwLElOVCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19jbXBzaW50MzIiLElOVCxMT05HLDAsTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19jbXB1aW50MzIiLElOVCxVTlNJR05FRHxMT05HLDAsVU5TSUdORUR8TE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19zaW50MzJ0b2ZsdDMyIixGTE9BVCxMT05HLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX191aW50MzJ0b2ZsdDMyIixGTE9BVCxVTlNJR05FRHxMT05HLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19zaW50MzJ0b2ZsdDY0IixET1VCTEUsTE9ORywwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fdWludDMydG9mbHQ2NCIsRE9VQkxFLFVOU0lHTkVEfExPTkcsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDMydG9zaW50MzIiLExPTkcsRkxPQVQsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDMydG91aW50MzIiLFVOU0lHTkVEfExPTkcsRkxPQVQsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDY0dG9zaW50MzIiLExPTkcsRE9VQkxFLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQ2NHRvdWludDMyIixVTlNJR05FRHxMT05HLERPVUJMRSwwLDAsMCwxLDApOworCisgIGRlY2xhcmVfYnVpbHRpbigiX19zaW50MTZ0b2ZsdDMyIixGTE9BVCxJTlQsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3VpbnQxNnRvZmx0MzIiLEZMT0FULFVOU0lHTkVEfElOVCwwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDE2dG9mbHQ2NCIsRE9VQkxFLElOVCwwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fdWludDE2dG9mbHQ2NCIsRE9VQkxFLFVOU0lHTkVEfElOVCwwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0MzJ0b3NpbnQxNiIsSU5ULEZMT0FULDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvdWludDE2IixVTlNJR05FRHxJTlQsRkxPQVQsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDY0dG9zaW50MTYiLElOVCxET1VCTEUsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDY0dG91aW50MTYiLFVOU0lHTkVEfElOVCxET1VCTEUsMCwwLDAsMSwwKTsKKworICBkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDh0b2ZsdDMyIixGTE9BVCxDSEFSLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX191aW50OHRvZmx0MzIiLEZMT0FULFVOU0lHTkVEfENIQVIsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3NpbnQ4dG9mbHQ2NCIsRE9VQkxFLENIQVIsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3VpbnQ4dG9mbHQ2NCIsRE9VQkxFLFVOU0lHTkVEfENIQVIsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDMydG9zaW50OCIsQ0hBUixGTE9BVCwwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0MzJ0b3VpbnQ4IixVTlNJR05FRHxDSEFSLEZMT0FULDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQ2NHRvc2ludDgiLENIQVIsRE9VQkxFLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQ2NHRvdWludDgiLFVOU0lHTkVEfENIQVIsRE9VQkxFLDAsMCwwLDEsMCk7CisKKworCisgIGRlY2xhcmVfYnVpbHRpbigiX19tdWxpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19hZGRpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19zdWJpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19hbmRpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19vcmludDY0IiAsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19lb3JpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19uZWdpbnQ2NCIsTExPTkcsTExPTkcsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2xzbGludDY0IixMTE9ORyxMTE9ORywwLElOVCwwLDEsMCk7CisKKyAgZGVjbGFyZV9idWlsdGluKCJfX2RpdnNpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZ1aW50NjQiLFVOU0lHTkVEfExMT05HLFVOU0lHTkVEfExMT05HLDAsVU5TSUdORUR8TExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbW9kc2ludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZHVpbnQ2NCIsVU5TSUdORUR8TExPTkcsVU5TSUdORUR8TExPTkcsMCxVTlNJR05FRHxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19sc3JzaW50NjQiLExMT05HLExMT05HLDAsSU5ULDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2xzcnVpbnQ2NCIsVU5TSUdORUR8TExPTkcsVU5TSUdORUR8TExPTkcsMCxJTlQsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fY21wc2ludDY0IixJTlQsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19jbXB1aW50NjQiLElOVCxVTlNJR05FRHxMTE9ORywwLFVOU0lHTkVEfExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3NpbnQ2NHRvZmx0MzIiLEZMT0FULExMT05HLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX191aW50NjR0b2ZsdDMyIixGTE9BVCxVTlNJR05FRHxMTE9ORywwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDY0dG9mbHQ2NCIsRE9VQkxFLExMT05HLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX191aW50NjR0b2ZsdDY0IixET1VCTEUsVU5TSUdORUR8TExPTkcsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDMydG9zaW50NjQiLExMT05HLEZMT0FULDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvdWludDY0IixVTlNJR05FRHxMTE9ORyxGTE9BVCwwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b3NpbnQ2NCIsTExPTkcsRE9VQkxFLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQ2NHRvdWludDY0IixVTlNJR05FRHxMTE9ORyxET1VCTEUsMCwwLDAsMSwwKTsKKworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0MzJ0b2ZsdDY0IixET1VCTEUsRkxPQVQsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDY0dG9mbHQzMiIsRkxPQVQsRE9VQkxFLDAsMCwwLDEsMCk7CisKKworICBkZWNsYXJlX2J1aWx0aW4oIl9fYWRkZmx0MzIiLEZMT0FULEZMT0FULDAsRkxPQVQsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fc3ViZmx0MzIiLEZMT0FULEZMT0FULDAsRkxPQVQsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbXVsZmx0MzIiLEZMT0FULEZMT0FULDAsRkxPQVQsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2Zmx0MzIiLEZMT0FULEZMT0FULDAsRkxPQVQsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbmVnZmx0MzIiLEZMT0FULEZMT0FULDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19jbXBmbHQzMiIsQ0hBUixGTE9BVCwwLEZMT0FULDAsMSwwKTsKKworICBkZWNsYXJlX2J1aWx0aW4oIl9fYWRkZmx0MzIgIixET1VCTEUsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3N1YmZsdDMyICIsRE9VQkxFLERPVUJMRSwwLERPVUJMRSwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19tdWxmbHQzMiAiLERPVUJMRSxET1VCTEUsMCxET1VCTEUsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2Zmx0MzIgIixET1VCTEUsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX25lZ2ZsdDMyICIsRE9VQkxFLERPVUJMRSwwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fY21wZmx0MzIgIixDSEFSLERPVUJMRSwwLERPVUJMRSwwLDEsMCk7CisKKyAgZGVjbGFyZV9idWlsdGluKCJfX2FkZGZsdDY0ICIsRE9VQkxFLERPVUJMRSwwLERPVUJMRSwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19zdWJmbHQ2NCAiLERPVUJMRSxET1VCTEUsMCxET1VCTEUsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbXVsZmx0NjQgIixET1VCTEUsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2RpdmZsdDY0ICIsRE9VQkxFLERPVUJMRSwwLERPVUJMRSwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19uZWdmbHQ2NCAiLERPVUJMRSxET1VCTEUsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2NtcGZsdDY0ICIsQ0hBUixET1VCTEUsMCxET1VCTEUsMCwxLDApOworCisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBmcmV0dXJuKHN0cnVjdCBUeXAgKnQpCisvKiAgUmV0dXJucyB0aGUgcmVnaXN0ZXIgaW4gd2hpY2ggdmFyaWFibGVzIG9mIHR5cGUgdCBhcmUgcmV0dXJuZWQuICovCisvKiAgSWYgdGhlIHZhbHVlIGNhbm5vdCBiZSByZXR1cm5lZCBpbiBhIHJlZ2lzdGVyIHJldHVybnMgMC4gICAgICAgICovCit7CisgIGludCBmPXQtPmZsYWdzJk5ROworICBpZihJU1NDQUxBUihmKSl7CisgICAgaWYoSVNIV09SRChmKXx8Zj09Q0hBUikKKyAgICAgIHJldHVybiBhY2M7CisgICAgZWxzZSBpZihJU0xXT1JEKGYpKQorICAgICAgcmV0dXJuIGR4OworICB9CisgIHJldHVybiAwOworfQorCitpbnQgcmVnb2soaW50IHIsaW50IHQsaW50IG1vZGUpCisvKiAgUmV0dXJucyAwIGlmIHJlZ2lzdGVyIHIgY2Fubm90IHN0b3JlIHZhcmlhYmxlcyBvZiAgICovCisvKiAgdHlwZSB0LiBJZiB0PT1QT0lOVEVSIGFuZCBtb2RlIT0wIHRoZW4gaXQgcmV0dXJucyAgICovCisvKiAgbm9uLXplcm8gb25seSBpZiB0aGUgcmVnaXN0ZXIgY2FuIHN0b3JlIGEgcG9pbnRlciAgICovCisvKiAgYW5kIGRlcmVmZXJlbmNlIGEgcG9pbnRlciB0byBtb2RlLiAgICAgICAgICAgICAgICAgICovCit7CisgIGlmKCFJU1NDQUxBUih0KSkgcmV0dXJuIDA7CisgIGlmKHI9PWR4KXsKKyAgICBpZihJU0xXT1JEKHQpJiYob3B0ZmxhZ3MmMikmJiFub2R4KSByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZihtb2RlPT0tMSl7CisgICAgaWYoSVNIV09SRCh0KSkgcmV0dXJuIDE7CisgICAgaWYoKHQmTlEpPT1DSEFSJiZJU0FDQyhyKSkgcmV0dXJuIDE7CisgIH1lbHNleworICAgIGlmKElTSURYKHIpKXsKKyAgICAgIGlmKElTUE9JTlRFUih0KSYmSVNIV09SRCh0KSkKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgaWYoSVNBQ0MocikpeworICAgICAgaWYoKHQmTlEpPT1DSEFSKQorCXJldHVybiAxOworICAgICAgaWYoSVNJTlQodCkmJklTSFdPUkQodCkpCisJcmV0dXJuIDE7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitpbnQgcmVnX3BhaXIoaW50IHIsc3RydWN0IHJwYWlyICpwKQorLyogUmV0dXJucyAwIGlmIHRoZSByZWdpc3RlciBpcyBubyByZWdpc3RlciBwYWlyLiBJZiByICAqLworLyogaXMgYSByZWdpc3RlciBwYWlyIG5vbi16ZXJvIHdpbGwgYmUgcmV0dXJuZWQgYW5kIHRoZSAqLworLyogc3RydWN0dXJlIHBvaW50ZWQgdG8gcCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSB0d28gICAqLworLyogZWxlbWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpZihyPT1keCl7CisgICAgcC0+cjE9YWNjOworICAgIHAtPnIyPWl4OworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCitpbnQgY29zdF9zYXZpbmdzKHN0cnVjdCBJQyAqcCxpbnQgcixzdHJ1Y3Qgb2JqICpvKQoreworICAvKkZJWE1FKi8KKyAgaW50IGM9cC0+Y29kZTsKKyAgaWYocj09ZHgpeworICAgIGlmKGM9PUdFVFJFVFVSTnx8Yz09U0VUUkVUVVJOfHxjPT1QVVNIfHxjPT1BU1NJR04pIHJldHVybiA4OworICAgIHJldHVybiBJTlRfTUlOOworICB9CisgIGlmKG8tPmZsYWdzJlZLT05TVCl7CisgICAgc3RydWN0IG9iaiAqY289Jm8tPnYtPmNvYmo7CisgICAgaWYoby0+ZmxhZ3MmRFJFRk9CSikKKyAgICAgIHJldHVybiAwOworICAgIGlmKG89PSZwLT5xMSYmcC0+Y29kZT09QVNTSUdOJiYoKHAtPnouZmxhZ3MmRFJFRk9CSil8fHAtPnoudi0+c3RvcmFnZV9jbGFzcz09U1RBVElDfHxwLT56LnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTikpeworICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiAwOworICB9CisgIGlmKChvLT5mbGFncyZEUkVGT0JKKSl7CisgICAgaWYoIUlTSURYKHIpKSByZXR1cm4gSU5UX01JTjsKKyAgICBpZihwLT5xMi5mbGFncyYmbyE9JnAtPnopCisgICAgICByZXR1cm4gNjsKKyAgICBlbHNlCisgICAgICByZXR1cm4gNjsKKyAgfWVsc2UgaWYoYz09R0VUUkVUVVJOJiZwLT5xMS5yZWc9PXIpeworICAgIHJldHVybiA0OworICB9ZWxzZSBpZihjPT1TRVRSRVRVUk4mJnAtPnoucmVnPT1yKXsKKyAgICByZXR1cm4gNDsKKyAgfWVsc2UgaWYoYz09Q09OVkVSVCYmKChwLT50eXBmJk5RKT09Q0hBUnx8KHAtPnR5cGYyJk5RKT09Q0hBUikmJnJlZ29rKHIsQ0hBUiwwKSl7CisgICAgcmV0dXJuIDM7CisgIH0KKyAgaWYobz09JnAtPnomJnI9PWFjYyl7CisgICAgaWYoYz09U1VCfHxjPT1TVUJJRlB8fGM9PVNVQlBGUHx8Yz09QU5EfHxjPT1PUnx8Yz09WE9SKQorICAgICAgcmV0dXJuIDY7CisgICAgaWYoKGM9PUFERHx8Yz09QURESTJQKSYmIShwLT5xMS5mbGFncyYoS09OU1R8VktPTlNUKSkmJiEocC0+cTIuZmxhZ3MmKEtPTlNUfFZLT05TVCkpKQorICAgICAgcmV0dXJuIDQ7CisgICAgaWYoYz09TVVMVCkgcmV0dXJuIDU7CisgICAgaWYoYz09QVNTSUdOJiYocC0+cTEuZmxhZ3MmS09OU1QpKXsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnExLnZhbCxwLT50eXBmKTsKKyAgICAgIGlmKHptZXF0byh2bWF4LGwyem0oMEwpKSYmenVtZXF0byh2dW1heCx1bDJ6dW0oMFVMKSkpCisJcmV0dXJuIDM7CisgICAgfQorICB9CisjaWYgMQorICBpZigobz09JnAtPnEyLyp8fG89PSZwLT56Ki8pJiYhKG8tPmZsYWdzJkRSRUZPQkopJiYhSVNBQ0Moby0+cmVnKSYmKGM9PU1VTFR8fGM9PURJVnx8Yz09TU9EKSkKKyAgICByZXR1cm4gSU5UX01JTjsKKyNlbmRpZgorICBpZihjPT1DT01QQVJFfHxjPT1URVNUKXsKKyAgICBpZihyPT1peCkgcmV0dXJuIDM7CisgICAgaWYocj09aXkpIHJldHVybiAyOworICAgIGlmKHI9PWl1KSByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMjsKK30KKworaW50IGRhbmdlcm91c19JQyhzdHJ1Y3QgSUMgKnApCisvKiAgUmV0dXJucyB6ZXJvIGlmIHRoZSBJQyBwIGNhbiBiZSBzYWZlbHkgZXhlY3V0ZWQgICAgICovCisvKiAgd2l0aG91dCBkYW5nZXIgb2YgZXhjZXB0aW9ucyBvciBzaW1pbGFyIHRoaW5ncy4gICAgICovCisvKiAgdmJjYyBtYXkgZ2VuZXJhdGUgY29kZSBpbiB3aGljaCBub24tZGFuZ2Vyb3VzIElDcyAgICovCisvKiAgYXJlIHNvbWV0aW1lcyBleGVjdXRlZCBhbHRob3VnaCBjb250cm9sLWZsb3cgbWF5ICAgICovCisvKiAgbmV2ZXIgcmVhY2ggdGhlbSAobWFpbmx5IHdoZW4gbW92aW5nIGNvbXB1dGF0aW9ucyAgICovCisvKiAgb3V0IG9mIGxvb3BzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVHlwaWNhbCBJQ3MgdGhhdCBnZW5lcmF0ZSBleGNlcHRpb25zIG9uIHNvbWUgICAgICAgICovCisvKiAgbWFjaGluZXMgYXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gYWNjZXNzZXMgdmlhIHBvaW50ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gZGl2aXNpb24vbW9kdWxvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gb3ZlcmZsb3cgb24gc2lnbmVkIGludGVnZXIvZmxvYXRzICAgICAgICAgICAgICovCit7CisgIGludCBjPXAtPmNvZGU7CisgIGlmKChwLT5xMS5mbGFncyZEUkVGT0JKKXx8KHAtPnEyLmZsYWdzJkRSRUZPQkopfHwocC0+ei5mbGFncyZEUkVGT0JKKSkKKyAgICByZXR1cm4gMTsKKyAgaWYoKGM9PURJVnx8Yz09TU9EKSYmIWlzY29uc3QocTIpKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworLyogUmV0dXJuIG5hbWUgb2YgbGlicmFyeSBmdW5jdGlvbiwgaWYgdGhpcyBub2RlIHNob3VsZCBiZQorICAgaW1wbGVtZW50ZWQgdmlhIGxpYmNhbGwuICovCitjaGFyICp1c2VfbGliY2FsbChpbnQgYyxpbnQgdCxpbnQgdDIpCit7CisgIHN0YXRpYyBjaGFyIGZuYW1lWzE2XTsKKyAgY2hhciAqcmV0PTA7CisKKyAgaWYoYz09Q09NUEFSRSl7CisgICAgaWYoKHQmTlEpPT1MTE9ORyl7CisgICAgICBzcHJpbnRmKGZuYW1lLCJfX2NtcCVzaW50MzIiLCh0JlVOU0lHTkVEKT8idSI6InMiKTsKKyAgICAgIHJldD1mbmFtZTsKKyAgICB9CisgICAgaWYoSVNGTE9BVCh0KSl7CisgICAgICByZXR1cm4gKHQ9PUZMT0FUKT8iX19jbXBmbHQzMiI6Il9fY21wZmx0MzIgIjsKKyAgICAgIHJldD1mbmFtZTsKKyAgICB9CisKKyAgfWVsc2V7CisgICAgdCY9TlU7CisgICAgdDImPU5VOworICAgIGlmKHQ9PUxET1VCTEUpIHQ9RE9VQkxFOworICAgIGlmKHQyPT1MRE9VQkxFKSB0Mj1ET1VCTEU7CisgICAgaWYoYz09Q09OVkVSVCl7CisgICAgICBpZih0PT10MikgcmV0dXJuIDA7CisgICAgICBpZihJU0ZMT0FUKHQpJiZJU0ZMT0FUKHQyKSkgcmV0dXJuIDA7CisjaWYgMAorICAgICAgLyogY3VycmVudGx5IHN1cHBvcnQgb25seSAzMmJpdCBmbHQgKi8KKyAgICAgIGlmKHQ9PUZMT0FUJiZ0Mj09RE9VQkxFKSByZXR1cm4gIl9fZmx0NjR0b2ZsdDMyIjsKKyAgICAgIGlmKHQ9PURPVUJMRSYmdDI9PUZMT0FUKSByZXR1cm4gIl9fZmx0MzJ0b2ZsdDY0IjsKKyNlbmRpZgorICAgICAgaWYoSVNGTE9BVCh0KSl7CisgICAgICAgIHNwcmludGYoZm5hbWUsIl9fJWNpbnQlbGR0b2ZsdCVsZCIsKHQyJlVOU0lHTkVEKT8ndSc6J3MnLHptMmwoc2l6ZXRhYlt0MiZOUV0pKjgsem0ybChzaXpldGFiW3QmTlFdKSo4KTsKKyAgICAgICAgcmV0PWZuYW1lOworICAgICAgfQorICAgICAgaWYoSVNGTE9BVCh0MikpeworICAgICAgICBzcHJpbnRmKGZuYW1lLCJfX2ZsdCVsZHRvJWNpbnQlbGQiLHptMmwoc2l6ZXRhYlt0MiZOUV0pKjgsKHQmVU5TSUdORUQpPyd1Jzoncycsem0ybChzaXpldGFiW3QmTlFdKSo4KTsKKyAgICAgICAgcmV0PWZuYW1lOworICAgICAgfQorICAgIH0KKyAgICBpZigodCZOUSk9PUxMT05HfHxJU0ZMT0FUKHQpKXsKKyAgICAgIGlmKChjPj1MU0hJRlQmJmM8PU1PRCl8fChjPj1PUiYmYzw9QU5EKXx8Yz09S09NUExFTUVOVHx8Yz09TUlOVVMpeworCWlmKHQ9PShVTlNJR05FRHxMTE9ORykmJihjPT1ESVZ8fGM9PU1PRHx8Yz09UlNISUZUKSl7CisJICBzcHJpbnRmKGZuYW1lLCJfXyVzdWludDY0IixlbmFtZVtjXSk7CisJICByZXQ9Zm5hbWU7CisJfWVsc2UgaWYoKHQmTlEpPT1MTE9ORyl7CisgICAgICAgICAgc3ByaW50ZihmbmFtZSwiX18lc2ludDY0IixlbmFtZVtjXSk7CisgICAgICAgICAgcmV0PWZuYW1lOworCX1lbHNlIGlmKHQ9PShVTlNJR05FRHxMT05HKSYmKGM9PURJVnx8Yz09TU9EfHxjPT1SU0hJRlQpKXsKKwkgIHNwcmludGYoZm5hbWUsIl9fJXN1aW50MzIiLGVuYW1lW2NdKTsKKwkgIHJldD1mbmFtZTsKKwl9ZWxzZSBpZigodCZOUSk9PUxPTkcpeworICAgICAgICAgIHNwcmludGYoZm5hbWUsIl9fJXNpbnQzMiIsZW5hbWVbY10pOworICAgICAgICAgIHJldD1mbmFtZTsKKyAgICAgICAgfWVsc2V7CisJICBzcHJpbnRmKGZuYW1lLCJfXyVzJXMlcyVsZCVzIixlbmFtZVtjXSwoYyE9TVVMVCYmKHQmVU5TSUdORUQpKT8idSI6IiIsSVNGTE9BVCh0KT8iZmx0IjoiaW50Iix6bTJsKHNpemV0YWJbdCZOUV0pKjgsKHQmTlEpPj1ET1VCTEU/IiAiOiIiKTsKKyAgICAgICAgICByZXQ9Zm5hbWU7CisJfQorICAgICAgfQorICAgIH0KKyAgICBpZigoYz09TVVMVC8qJiYoQ1BVIT02ODEyfHwodCZOUSk9PUxPTkcpKi8pfHxjPT1ESVZ8fGM9PU1PRCl7CisgICAgICBzcHJpbnRmKGZuYW1lLCJfXyVzJXMlcyVsZCVzIixlbmFtZVtjXSwoYyE9TVVMVCYmKHQmVU5TSUdORUQpKT8idSI6IiIsSVNGTE9BVCh0KT8iZmx0IjoiaW50Iix6bTJsKHNpemV0YWJbdCZOUV0pKjgsKHQmTlEpPj1ET1VCTEU/IiAiOiIiKTsKKyAgICAgIHJldD1mbmFtZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisKKworaW50IG11c3RfY29udmVydChpbnQgbyxpbnQgdCxpbnQgY29uc3RfZXhwcikKKy8qICBSZXR1cm5zIHplcm8gaWYgY29kZSBmb3IgY29udmVydGluZyBucCB0byB0eXBlIHQgICAgKi8KKy8qICBjYW4gYmUgb21pdHRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IG9wPW8mTlEsdHA9dCZOUTsKKyAgaWYob3A9PXRwKSByZXR1cm4gMDsKKyAgaWYoSVNGTE9BVChvcCkpeworICAgIGlmKElTRkxPQVQodHApKSByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZihJU0ZMT0FUKHRwKSkgcmV0dXJuIDE7CisgIGlmKElTSFdPUkQob3ApJiZJU0hXT1JEKHRwKSkgcmV0dXJuIDA7CisgIGlmKElTRkxPQVQob3ApfHxJU0ZMT0FUKHRwKSkgcmV0dXJuIDE7CisgIGlmKElTTFdPUkQob3ApJiZJU0xXT1JEKHRwKSkgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCit2b2lkIGdlbl9kcyhGSUxFICpmLHptYXggc2l6ZSxzdHJ1Y3QgVHlwICp0KQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSA8c2l6ZT4gYnl0ZXMgb2Ygc3RvcmFnZSAqLworLyogIGluaXRpYWxpemVkIHdpdGggemVyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpZihuZXdvYmomJnNlY3Rpb24hPVNQRUNJQUwpCisgICAgZW1pdChmLCIlbGRcbiIsem0ybChzaXplKSk7CisgIGVsc2UKKyAgICBlbWl0KGYsIlx0LnNwYWNlXHQlbGRcbiIsem0ybChzaXplKSk7CisgIG5ld29iaj0wOyAgCit9CisKK3ZvaWQgZ2VuX2FsaWduKEZJTEUgKmYsem1heCBhbGlnbikKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBtYWtlIHN1cmUgdGhlIG5leHQgZGF0YSBpcyAgICAgKi8KKy8qICBhbGlnbmVkIHRvIG11bHRpcGxlcyBvZiA8YWxpZ24+IGJ5dGVzLiAgICAgICAgICAgICAgKi8KK3sKKyAgLyogbm90aGluZyB0byBkbyAqLworfQorCit2b2lkIGdlbl92YXJfaGVhZChGSUxFICpmLHN0cnVjdCBWYXIgKnYpCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIHRoZSBoZWFkIG9mIGEgdmFyaWFibGUgICovCisvKiAgZGVmaW5pdGlvbiwgaS5lLiB0aGUgbGFiZWwgYW5kIGluZm9ybWF0aW9uIGZvciAgICAgICovCisvKiAgbGlua2FnZSBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBjb25zdGZsYWc7CisgIGlmKHYtPmNsaXN0KSBjb25zdGZsYWc9aXNfY29uc3Qodi0+dnR5cCk7CisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQyl7CisgICAgaWYoSVNGVU5DKHYtPnZ0eXAtPmZsYWdzKSkgcmV0dXJuOworICAgIGlmKHYtPnRhdHRyJkRQQUdFKQorICAgICAgZW1pdChmLCJcdC5kaXJlY3RcdCVzJWxkXG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICAgIGlmKCFzcGVjaWFsX3NlY3Rpb24oZix2KSl7CisgICAgICBpZih2LT5jbGlzdCYmKCFjb25zdGZsYWd8fChnX2ZsYWdzWzNdJlVTRURGTEFHKSkmJnNlY3Rpb24hPURBVEEpeworCWVtaXQoZixkYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1EQVRBOworICAgICAgfQorICAgICAgaWYodi0+Y2xpc3QmJmNvbnN0ZmxhZyYmIShnX2ZsYWdzWzNdJlVTRURGTEFHKSYmc2VjdGlvbiE9Uk9EQVRBKXsKKwllbWl0KGYscm9kYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1ST0RBVEE7CisgICAgICB9CisgICAgICBpZighdi0+Y2xpc3QmJnNlY3Rpb24hPUJTUyl7CisJZW1pdChmLGJzc25hbWUpO2lmKGYpIHNlY3Rpb249QlNTOworICAgICAgfQorICAgIH0KKyAgICBlbWl0KGYsIlx0LnR5cGVcdCVzJWxkLEBvYmplY3RcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgZW1pdChmLCJcdC5zaXplXHQlcyVsZCwlbGRcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSx6bTJsKHN6b2Yodi0+dnR5cCkpKTsKKyAgICBpZih2LT5jbGlzdHx8c2VjdGlvbj09U1BFQ0lBTCkKKyAgICAgIGVtaXQoZiwiJXMlbGQ6XG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICAgIGVsc2UKKyAgICAgIGVtaXQoZiwiXHQubGNvbW1cdCVzJWxkLCIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgbmV3b2JqPTE7IAorICB9CisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisgICAgaWYodi0+ZmxhZ3MmKERFRklORUR8VEVOVEFUSVZFKSl7CisgICAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXMlc1xuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICAgIGlmKHYtPnRhdHRyJkRQQUdFKQorCWVtaXQoZiwiXHQuZGlyZWN0XHQlcyVzXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgICAgaWYoIXNwZWNpYWxfc2VjdGlvbihmLHYpKXsKKwlpZih2LT5jbGlzdCYmKCFjb25zdGZsYWd8fChnX2ZsYWdzWzNdJlVTRURGTEFHKSkmJnNlY3Rpb24hPURBVEEpeworCSAgZW1pdChmLGRhdGFuYW1lKTtpZihmKSBzZWN0aW9uPURBVEE7CisJfQorCWlmKHYtPmNsaXN0JiZjb25zdGZsYWcmJiEoZ19mbGFnc1szXSZVU0VERkxBRykmJnNlY3Rpb24hPVJPREFUQSl7CisJICBlbWl0KGYscm9kYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1ST0RBVEE7CisJfQorCWlmKCF2LT5jbGlzdCYmc2VjdGlvbiE9QlNTKXsKKwkgIGVtaXQoZixic3NuYW1lKTtpZihmKSBzZWN0aW9uPUJTUzsKKwl9CisgICAgICB9CisgICAgICBlbWl0KGYsIlx0LnR5cGVcdCVzJXMsQG9iamVjdFxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICAgIGVtaXQoZiwiXHQuc2l6ZVx0JXMlcywlbGRcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcix6bTJsKHN6b2Yodi0+dnR5cCkpKTsKKyAgICAgIGlmKHYtPmNsaXN0fHxzZWN0aW9uPT1TUEVDSUFMKQorICAgICAgICBlbWl0KGYsIiVzJXM6XG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgICAgZWxzZQorICAgICAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXMlc1xuXHQubGNvbW1cdCVzJXMsIixpZHByZWZpeCx2LT5pZGVudGlmaWVyLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgICAgbmV3b2JqPTE7ICAgCisgICAgfQorICB9Cit9CisKK3ZvaWQgZ2VuX2RjKEZJTEUgKmYsaW50IHQsc3RydWN0IGNvbnN0X2xpc3QgKnApCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIHN0YXRpYyBzdG9yYWdlICAgICAgICAgICovCisvKiAgaW5pdGlhbGl6ZWQgd2l0aCBjb25zdC1saXN0IHAuICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGVtaXQoZiwiXHQlc1x0IixkY3RbdCZOUV0pOworICBpZighcC0+dHJlZSl7CisgICAgaWYoSVNGTE9BVCh0KSl7CisgICAgICAvKiAgYXVjaCB3aWVkZXIgbmljaHQgc2VociBzY2hvZW4gdW5kIElFRUUgbm9ldGlnICAgKi8KKyAgICAgIHVuc2lnbmVkIGNoYXIgKmlwOworICAgICAgaXA9KHVuc2lnbmVkIGNoYXIgKikmcC0+dmFsLnZkb3VibGU7CisgICAgICBpZih6bTJsKHNpemV0YWJbdCZOUV0pPT04KXsKKwllbWl0KGYsIiwweCUwMnglMDJ4JTAyeCUwMngiLGlwWzRdLGlwWzVdLGlwWzZdLGlwWzddKTsKKyAgICAgIH0KKyAgICAgIGVtaXQoZiwiMHglMDJ4JTAyeCUwMnglMDJ4IixpcFswXSxpcFsxXSxpcFsyXSxpcFszXSk7CisgICAgfWVsc2V7CisgICAgICBlbWl0dmFsKGYsJnAtPnZhbCwodCZOVSl8VU5TSUdORUQpOworICAgIH0KKyAgfWVsc2V7CisgICAgaW50IG09cC0+dHJlZS0+by5mbGFncyxtZD1kcmVsLG1wPXBjcmVsOworICAgIHAtPnRyZWUtPm8uZmxhZ3MmPX5WQVJBRFI7CisgICAgZHJlbD0wO3BjcmVsPTA7CisgICAgZW1pdF9vYmooZiwmcC0+dHJlZS0+byx0Jk5VKTsKKyAgICBwLT50cmVlLT5vLmZsYWdzPW07CisgICAgZHJlbD1tZDtwY3JlbD1tcDsKKyAgfQorICBlbWl0KGYsIlxuIik7bmV3b2JqPTA7Cit9CisKKworc3RhdGljIHZvaWQgcHJlbG9hZChGSUxFICpmLElDICpwKQoreworICBpbnQgdCxyOworCisgIGlmKChwLT50eXBmJlZPTEFUSUxFKXx8KHAtPnR5cGYyJlZPTEFUSUxFKXx8CisgICAgICgocC0+cTEuZmxhZ3MmRFJFRk9CSikmJihwLT5xMS5kdHlwJihWT0xBVElMRXxQVk9MQVRJTEUpKSl8fAorICAgICAoKHAtPnEyLmZsYWdzJkRSRUZPQkopJiYocC0+cTIuZHR5cCYoVk9MQVRJTEV8UFZPTEFUSUxFKSkpfHwKKyAgICAgKChwLT56LmZsYWdzJkRSRUZPQkopJiYocC0+ei5kdHlwJihWT0xBVElMRXxQVk9MQVRJTEUpKSkpCisgICAgZW1pdChmLCI7IHZvbGF0aWxlIGJhcnJpZXJcbiIpOworCisgIHQ9cTF0eXAocCk7CisgIGlmKCFwLT5xMS5hbSYmKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSnxLT05TVCkpPT1EUkVGT0JKJiZJU0xXT1JEKHQpKXsKKyAgICByPWdldF9pZHgoZixwKTsKKyAgICBwLT5xMS5mbGFncyY9fkRSRUZPQko7CisgICAgbG9hZF9yZWcoZixyLCZwLT5xMSxJTlQpOworICAgIHAtPnExLmZsYWdzfD0oUkVHfERSRUZPQkopOworICAgIHAtPnExLnJlZz1yOworICB9CisgIHQ9cTJ0eXAocCk7CisgIGlmKCFwLT5xMi5hbSYmKHAtPnEyLmZsYWdzJihSRUd8RFJFRk9CSnxLT05TVCkpPT1EUkVGT0JKJiZJU0xXT1JEKHQpKXsKKyAgICByPWdldF9pZHgoZixwKTsKKyAgICBwLT5xMi5mbGFncyY9fkRSRUZPQko7CisgICAgbG9hZF9yZWcoZixyLCZwLT5xMixJTlQpOworICAgIHAtPnEyLmZsYWdzfD0oUkVHfERSRUZPQkopOworICAgIHAtPnEyLnJlZz1yOworICB9ZWxzZSBpZihpc3JlZyh6KSYmKCgocC0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAtPnEyLnJlZz09cC0+ei5yZWcpfHwocC0+cTIuYW0mJnAtPnEyLmFtLT5iYXNlPT1wLT56LnJlZykpKXsKKyAgICByPWdldF9pZHgoZixwKTsKKyAgICBwLT5xMi5mbGFncyY9fkRSRUZPQko7CisgICAgbG9hZF9yZWcoZixyLCZwLT5xMixJTlQpOworICAgIHAtPnEyLmZsYWdzfD0oUkVHfERSRUZPQkopOworICAgIHAtPnEyLnJlZz1yOworICB9CisgIHQ9enR5cChwKTsKKyAgaWYoIXAtPnouYW0mJihwLT56LmZsYWdzJihSRUd8RFJFRk9CSnxLT05TVCkpPT1EUkVGT0JKJiZJU0xXT1JEKHQpKXsKKyAgICByPWdldF9pZHgoZixwKTsKKyAgICBwLT56IC5mbGFncyY9fkRSRUZPQko7CisgICAgbG9hZF9yZWcoZixyLCZwLT56ICxJTlQpOworICAgIHAtPnogLmZsYWdzfD0oUkVHfERSRUZPQkopOworICAgIHAtPnogLnJlZz1yOworICB9Cit9CisKKy8qICBUaGUgbWFpbiBjb2RlLWdlbmVyYXRpb24gcm91dGluZS4gICAgICAgICAgICAgICAgICAgKi8KKy8qICBmIGlzIHRoZSBzdHJlYW0gdGhlIGNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8uICAgICAgKi8KKy8qICBwIGlzIGEgcG9pbnRlciB0byBhIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBJQ3MgICAgICAgKi8KKy8qICBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBib2R5IHRvIGdlbmVyYXRlIGNvZGUgZm9yLiAgKi8KKy8qICB2IGlzIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBvZmZzZXQgaXMgdGhlIHNpemUgb2YgdGhlIHN0YWNrZnJhbWUgdGhlIGZ1bmN0aW9uICAgKi8KKy8qICBuZWVkcyBmb3IgbG9jYWwgdmFyaWFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ZvaWQgZ2VuX2NvZGUoRklMRSAqZixzdHJ1Y3QgSUMgKmZwLHN0cnVjdCBWYXIgKnYsem1heCBvZmZzZXQpCit7CisgIGludCBjLHQsbGFzdGNvbXA9MCxyZWcsc2hvcnRfYWRkLGJpdF9yZXZlcnNlLG5lZWRfcmV0dXJuPTA7CisgIHN0cnVjdCBvYmogKmJpdF9vYmo7Y2hhciAqYml0X3JlZzsKKyAgc3RhdGljIGludCBpZG9uZTsKKyAgc3RydWN0IG9iaiBvOworICBJQyAqcCwqcDI7CisgIGlmKHYtPnRhdHRyJklOVEVSUlVQVCkKKyAgICByZXQ9InJ0aSI7CisgIGVsc2UKKyAgICByZXQ9InJ0cyI7IC8qRklYTUU6IGJhbmtlZCAqLworICBpZihERUJVRyYxKSBwcmludGYoImdlbl9jb2RlKClcbiIpOworICBmb3IocD1mcDtwO3A9cC0+bmV4dCkgY2xlYXJfZXh0X2ljKCZwLT5leHQpOworICBlbWl0KGYsIiNvZmYxPSVsZFxuIix6bTJsKG9mZnNldCkpOworICBpZighKGdfZmxhZ3NbNV0mVVNFREZMQUcpKXsKKyAgICBwZWVwaG9sZShmcCk7CisgICAgaWYoIWZyYW1lX3VzZWQpIG9mZnNldD1sMnptKDBMKTsKKyAgfQorICBmb3IoYz0xO2M8PU1BWFI7YysrKSByZWdzW2NdPShyZWdzYVtjXT09UkVHU0FfTkVWRVIpPzE6MDsKKyAgZm9yKGM9MTtjPD1NQVhSO2MrKyl7CisgICAgaWYoKHJlZ3NhW2NdPT1SRUdTQV9ORVZFUnx8cmVndXNlZFtjXSkpeworICAgICAgQlNFVChyZWdzX21vZGlmaWVkLGMpOworICAgIH0KKyAgfQorICB0PTA7CisgIGZvcihwPWZwO3A7cD1wLT5uZXh0KXsKKyAgICBjPXAtPmNvZGU7CisgICAgaWYoYz09QUxMT0NSRUcpeyByZWdzW3AtPnExLnJlZ109MTsgaWYocC0+cTEucmVnPT1keCkgcmVnc1thY2NdPXJlZ3NbaXhdPTE7fQorICAgIGlmKGM9PUZSRUVSRUcpeyByZWdzW3AtPnExLnJlZ109MDsgaWYocC0+cTEucmVnPT1keCkgcmVnc1thY2NdPXJlZ3NbaXhdPTA7fQorICAgIGlmKChjPT1MU0hJRlR8fGM9PVJTSElGVCkmJihwLT50eXBmJk5RKT49TE9ORykgcmVndXNlZFtpeV09MTsKKyAgICBpZihjPT1QVVNIJiYocC0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSkhPVJFRyl7CisgICAgICBpZih6bWVxdG8ocC0+cTIudmFsLnZtYXgsWjEpKXsKKwlpZihyZWdzW2FjY10pIHQ9KHQ+Mik/dDoyOworICAgICAgfWVsc2UgaWYoem1lcXRvKHAtPnEyLnZhbC52bWF4LGwyem0oMkwpKSl7CisJaWYocmVnc1thY2NdJiZyZWdzW2l4XSYmcmVnc1tpeV0mJihDUFU9PTY4MTJ8fHJlZ3NbaXVdKSkgdD0odD4yKT90OjI7CisgICAgICB9ZWxzZSBpZih6bWVxdG8ocC0+cTIudmFsLnZtYXgsbDJ6bSg0TCkpKXsKKwlpZihyZWdzW2FjY10pIHQ9KHQ+Mik/dDoyOworICAgICAgfWVsc2V7CisJLyogVE9ETzogZmluZXIgY2hlY2sgKi8KKwlpZihkcmVsfHwhcmVnc2FbaXVdKQorCSAgdD0odD44KT90Ojg7CisJZWxzZQorCSAgdD0odD42KT90OjY7CisgICAgICB9CisgICAgfQorICB9CisgIGVtaXQoZiwiI3RvZmY9JWRcbiIsdCk7CisgIGxvZmY9em0ybChvZmZzZXQpK3Q7CisgIGZ1bmN0aW9uX3RvcChmLHYsbG9mZik7CisgIHN0YWNrb2Zmc2V0PW5vdHBvcHBlZD1kb250cG9wPW1heHB1c2hlZD0wOworICBpZighdi0+ZmkpIHYtPmZpPW5ld19maSgpOworICB2LT5maS0+ZmxhZ3N8PUFMTF9SRUdTOworICBmb3IocD1mcDtwO3ByKGYscCkscD1wLT5uZXh0KXsKKyAgICBjPXAtPmNvZGU7dD1wLT50eXBmOworICAgIGlmKGRlYnVnX2luZm8pCisgICAgICBkd2FyZjJfbGluZV9pbmZvKGYscCk7IAorICAgIHNob3J0X2FkZD0wOworICAgIGlmKGM9PU5PUCkgY29udGludWU7CisgICAgaWYoYz09QUxMT0NSRUcpeworICAgICAgcmVnc1twLT5xMS5yZWddPTE7CisgICAgICBpZihwLT5xMS5yZWc9PWR4KSByZWdzW2FjY109cmVnc1tpeF09MTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1GUkVFUkVHKXsKKyAgICAgIHJlZ3NbcC0+cTEucmVnXT0wOworICAgICAgaWYocC0+cTEucmVnPT1keCkgcmVnc1thY2NdPXJlZ3NbaXhdPTA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYobm90cG9wcGVkJiYhZG9udHBvcCl7CisgICAgICBpbnQgZmxhZz0wOworICAgICAgaWYoYz09TEFCRUx8fGM9PUNPTVBBUkV8fGM9PVRFU1R8fChjPj1CRVEmJmM8PUJSQSkpeworCWdlbl9wb3AoZixub3Rwb3BwZWQpOworCW5vdHBvcHBlZD0wOworICAgICAgfQorICAgIH0KKyAgICBpZihjPT1MQUJFTCkge2NjPTA7ZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsdCk7Y29udGludWU7fQorICAgIGlmKGM+PUJFUSYmYzw9QkdUJiZ0PT1leGl0X2xhYmVsKSBuZWVkX3JldHVybj0xOworICAgIGlmKGM9PUJSQSl7CisgICAgICBpZihwLT50eXBmPT1leGl0X2xhYmVsJiYhaGF2ZV9mcmFtZSl7CisJZW1pdChmLCJcdCVzXG4iLHJldCk7CisgICAgICB9ZWxzZXsKKwlpZih0PT1leGl0X2xhYmVsKSBuZWVkX3JldHVybj0xOworCWVtaXQoZiwiXHRicmFcdCVzJWRcbiIsbGFicHJlZml4LHQpOworICAgICAgfQorICAgICAgY2M9MDtjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz49QkVRJiZjPEJSQSl7ICAgICAgCisgICAgICBpZigobGFzdGNvbXAmVU5TSUdORUQpfHxJU1BPSU5URVIobGFzdGNvbXApKQorICAgICAgICBlbWl0KGYsIlx0YiVzXHQlcyVkXG4iLHVjY3NbYy1CRVFdLGxhYnByZWZpeCx0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgZW1pdChmLCJcdGIlc1x0JXMlZFxuIixjY3NbYy1CRVFdLGxhYnByZWZpeCx0KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1NT1ZFVE9SRUcpeworICAgICAgbG9hZF9yZWcoZixwLT56LnJlZywmcC0+cTEsU0hPUlQpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PU1PVkVGUk9NUkVHKXsKKyAgICAgIHN0b3JlX3JlZyhmLHAtPnExLnJlZywmcC0+eixTSE9SVCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgLyppZihJU0ZMT0FUKHQpKSB7cHJpYzIoc3Rkb3V0LHApO2llcnJvcigwKTt9Ki8KKworICAgIGlmKCh0Jk5RKT09QklUKXsKKyAgICAgIGllcnJvcigwKTsKKyAgICB9CisKKyAgICBpZihjPT1DT05WRVJUJiZJU0xXT1JEKHQpJiZJU0lOVCh0KSYmSVNMV09SRChwLT50eXBmMikmJklTSU5UKHAtPnR5cGYyKSl7CisgICAgICBwLT5jb2RlPWM9QVNTSUdOOworICAgICAgcC0+cTIudmFsLnZtYXg9bDJ6bSg0TCk7CisgICAgfQorCisgICAgaWYoKHAtPnEyLmZsYWdzJlJFRykmJklTQUNDKHAtPnEyLnJlZykmJihjPT1BRER8fGM9PU1VTFR8fGM9PUFORHx8Yz09T1J8fGM9PVhPUikpeworICAgICAgb2JqIG89cC0+cTE7CisgICAgICBwLT5xMT1wLT5xMjsKKyAgICAgIHAtPnEyPW87CisgICAgfQorCisgICAgaWYoYz09VEVTVCl7CisgICAgICBsYXN0Y29tcD10OworICAgICAgcC0+Y29kZT1jPUNPTVBBUkU7CisgICAgICBndmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICBwLT5xMi5mbGFncz1LT05TVDsKKyAgICAgIGV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKKyAgICAgIGluc2VydF9jb25zdCgmcC0+cTIudmFsLHQpOworICAgIH0KKworICAgIGlmKGM9PVNVQlBGUCl7CisgICAgICBwLT5jb2RlPWM9U1VCOworICAgICAgcC0+dHlwZj10PShVTlNJR05FRHxJTlQpOworICAgIH0KKworCisKKyAgICBpZigoYz09QVNTSUdOfHxjPT1QVVNIKSYmem1lcXRvKHAtPnEyLnZhbC52bWF4LGwyem0oNEwpKSYmSVNJTlQodCkpCisgICAgICBwLT50eXBmPXQ9TE9ORzsKKworICAgIHByZWxvYWQoZixwKTsKKworICAgIGlmKGM9PUFEREkyUHx8Yz09U1VCSUZQKXsKKyAgICAgIGlmKChwLT50eXBmMiZOUSkhPUhQT0lOVEVSKXsKKwlpZihwLT5xMi5mbGFncyZLT05TVCl7CisJICBldmFsX2NvbnN0KCZwLT5xMi52YWwscC0+dHlwZik7CisJICBpbnNlcnRfY29uc3QoJnAtPnEyLnZhbCxwLT50eXBmMik7CisJICBwLT50eXBmPXQ9KFVOU0lHTkVEfFNIT1JUKTsKKwl9ZWxzZXsKKwkgIGlmKElTTFdPUkQodCkpIGluY19hZGRyKCZwLT5xMiwyLHQpOworCSAgaWYoKHQmTlEpPT1DSEFSKSBzaG9ydF9hZGQ9dDsKKwkgIHAtPnR5cGY9dD0oVU5TSUdORUR8U0hPUlQpOworCX0KKyAgICAgIH1lbHNlIGlmKElTSFdPUkQodCkpeworCWlmKCh0Jk5RKT09TExPTkcpIAorCSAgaW5jX2FkZHIoJnAtPnEyLDQsdCk7CisJZWxzZSBpZigodCZOUSkhPUxPTkcpIAorCSAgc2hvcnRfYWRkPXQ7CisJcC0+dHlwZj10PShVTlNJR05FRHxMT05HKTsKKyAgICAgIH0KKyAgICAgIHAtPmNvZGU9Yz0oYz09QURESTJQKT9BREQ6U1VCOworICAgIH0KKworICAgIGlmKGM9PUNPTVBBUkUmJklTTFdPUkQodCkpeworICAgICAgSUMgKmJyYW5jaD1wLT5uZXh0OworICAgICAgaW50IHI7CisgICAgICB3aGlsZShicmFuY2gmJmJyYW5jaC0+Y29kZT09RlJFRVJFRykgYnJhbmNoPWJyYW5jaC0+bmV4dDsKKyAgICAgIGlmKCFicmFuY2gpIGllcnJvcigwKTsKKyAgICAgIGM9YnJhbmNoLT5jb2RlOworICAgICAgaWYoYzxCRVF8fGM+QkdUKSBpZXJyb3IoMCk7CisgICAgICBpZighcmVnc1tpeF0pCisJcj1peDsKKyAgICAgIGVsc2UKKwlyPWdldF9yZWcoZixwLElOVCk7CisgICAgICAKKyAgICAgIGlmKGM9PUJFUXx8Yz09Qk5FKXsKKwlpbmNfYWRkcigmcC0+cTEsMCx0KTsKKwlpbmNfYWRkcigmcC0+cTIsMCx0KTsKKwlsb2FkX3JlZyhmLHIsJnAtPnExLElOVCk7CisJZW1pdChmLCJcdCVzJXNcdCIsQ1BVPT02ODEyPyJjcCI6ImNtcCIscmVnbmFtZXNbcl0pOworCWVtaXRfb2JqKGYsJnAtPnEyLElOVCk7CisJZW1pdChmLCJcbiIpOworCWlmKHB1c2hlZF9hY2MpIGVtaXQoZixTUFVMTEQpOworCWVtaXQoZiwiXHRibmVcdCVzJWRcbiIsbGFicHJlZml4LGM9PUJFUT8rK2xhYmVsOmJyYW5jaC0+dHlwZik7CisJaWYocHVzaGVkX2FjYykgZW1pdChmLFNQVVNIRCk7CisJaW5jX2FkZHIoJnAtPnExLDIsdCk7CisJaW5jX2FkZHIoJnAtPnEyLDIsdCk7CisJbG9hZF9yZWcoZixyLCZwLT5xMSxJTlQpOworCWVtaXQoZiwiXHQlcyVzXHQiLENQVT09NjgxMj8iY3AiOiJjbXAiLHJlZ25hbWVzW3JdKTsKKwllbWl0X29iaihmLCZwLT5xMixJTlQpOworCWVtaXQoZiwiXG4iKTsKKwlwcihmLHApOworCWlmKGM9PUJFUSl7CisJICBlbWl0KGYsIlx0YmVxXHQlcyVkXG4iLGxhYnByZWZpeCxicmFuY2gtPnR5cGYpOworCSAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwpOworCX1lbHNlCisJICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxicmFuY2gtPnR5cGYpOworICAgICAgfWVsc2V7CisJaW5jX2FkZHIoJnAtPnExLDAsdCk7CisJaW5jX2FkZHIoJnAtPnEyLDAsdCk7CisJbG9hZF9yZWcoZixyLCZwLT5xMSxJTlQpOworCWVtaXQoZiwiXHQlcyVzXHQiLENQVT09NjgxMj8iY3AiOiJjbXAiLHJlZ25hbWVzW3JdKTsKKwllbWl0X29iaihmLCZwLT5xMixJTlQpOworCWVtaXQoZiwiXG4iKTsKKwlsYWJlbCsrOworCWlmKHB1c2hlZF9hY2MpIGVtaXQoZixTUFVMTEQpOworCWlmKHQmVU5TSUdORUQpeworCSAgaWYoYz09QkxUfHxjPT1CR1QpCisJICAgIGVtaXQoZiwiXHRiJXNcdCVzJWRcbiIsKGM9PUJMVCk/ImxvIjoiaGkiLGxhYnByZWZpeCxicmFuY2gtPnR5cGYpOworCSAgZWxzZQorCSAgICBlbWl0KGYsIlx0YiVzXHQlcyVkXG4iLChjPT1CR0UpPyJsbyI6ImhpIixsYWJwcmVmaXgsbGFiZWwpOworCX1lbHNleworCSAgaWYoYz09QkxUfHxjPT1CR1QpCisJICAgIGVtaXQoZiwiXHRiJXNcdCVzJWRcbiIsKGM9PUJMVCk/Imx0IjoiZ3QiLGxhYnByZWZpeCxicmFuY2gtPnR5cGYpOworCSAgZWxzZQorCSAgICBlbWl0KGYsIlx0YiVzXHQlcyVkXG4iLChjPT1CR0UpPyJsdCI6Imd0IixsYWJwcmVmaXgsbGFiZWwpOworCX0KKwllbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCwoYz09QkxUfHxjPT1CR1QpP2xhYmVsOmJyYW5jaC0+dHlwZik7CisJaWYocHVzaGVkX2FjYykgZW1pdChmLFNQVVNIRCk7CisJaW5jX2FkZHIoJnAtPnExLDIsdCk7CisJaW5jX2FkZHIoJnAtPnEyLDIsdCk7CisJbG9hZF9yZWcoZixyLCZwLT5xMSxJTlQpOworCWVtaXQoZiwiXHQlcyVzXHQiLENQVT09NjgxMj8iY3AiOiJjbXAiLHJlZ25hbWVzW3JdKTsKKwllbWl0X29iaihmLCZwLT5xMixJTlQpOworCWVtaXQoZiwiXG4iKTsKKwlwcihmLHApOworCWVtaXQoZiwiXHRiJXNcdCVzJWRcbiIsdWNjc1tjLUJFUV0sbGFicHJlZml4LGJyYW5jaC0+dHlwZik7CisJZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwpOworICAgICAgfQorICAgICAgYnJhbmNoLT5jb2RlPU5PUDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmKElTTFdPUkQodCkmJihjPT1MU0hJRlR8fGM9PVJTSElGVCkpeworICAgICAgaW50IGNudD0tMTAwMCxpLHI9MDsKKyAgICAgIGludCBweD0wLHB5PTAscGE9MDsKKyAgICAgIGlmKGlzY29uc3QocTIpKXsKKwlldmFsX2NvbnN0KCZwLT5xMi52YWwscC0+dHlwZjIpOworCWNudD0oaW50KXptMmwodm1heCk7CisJaWYoY250PT0xJiZjb21wYXJlX29iamVjdHMoJnAtPnExLCZwLT56KSl7CisJICBpZihjPT1MU0hJRlQpCisJICAgIGVtaXQoZiwiXHRsc2xcdCIpOworCSAgZWxzZQorCSAgICBlbWl0KGYsIlx0JXNcdCIsKHQmVU5TSUdORUQpPyJsc3IiOiJhc3IiKTsKKwkgIGluY19hZGRyKCZwLT56LGM9PUxTSElGVD8zOjAsdCk7CisJICBlbWl0X29iaihmLCZwLT56LHQpOworCSAgZW1pdChmLCJcbiIpOworCSAgZW1pdChmLCJcdCVzXHQiLChjPT1MU0hJRlQpPyJyb2wiOiJyb3IiKTsKKwkgIGluY19hZGRyKCZwLT56LGM9PUxTSElGVD8tMToxLHQpOworCSAgZW1pdF9vYmooZiwmcC0+eix0KTsKKwkgIGVtaXQoZiwiXG4iKTsKKwkgIGVtaXQoZiwiXHQlc1x0IiwoYz09TFNISUZUKT8icm9sIjoicm9yIik7CisJICBpbmNfYWRkcigmcC0+eixjPT1MU0hJRlQ/LTE6MSx0KTsKKwkgIGVtaXRfb2JqKGYsJnAtPnosdCk7CisJICBlbWl0KGYsIlxuIik7CisJICBlbWl0KGYsIlx0JXNcdCIsKGM9PUxTSElGVCk/InJvbCI6InJvciIpOworCSAgaW5jX2FkZHIoJnAtPnosYz09TFNISUZUPy0xOjEsdCk7CisJICBlbWl0X29iaihmLCZwLT56LHQpOworCSAgZW1pdChmLCJcbiIpOworCSAgY29udGludWU7CisJfQorICAgICAgfQorICAgICAgaW5jX2FkZHIoJnAtPnExLDIsdCk7CisgICAgICBpbmNfYWRkcigmcC0+eiwyLHQpOworCisgICAgICBpZihJU1JBQ0MocTIpfHwocmVnc1thY2NdJiYhc2NyYXRjaHJlZyhhY2MscCkpKXsKKwllbWl0KGYsU1BVU0hEKTsKKwlwdXNoKDIpOworCXBhPTE7CisgICAgICB9CisKKyAgICAgIGlmKGNudDwwfHwob3B0c2l6ZSYmY250PjEpfHwoY250PjMmJiFvcHRzcGVlZCkpeworCWlmKHJlZ3NbaXhdJiYhc2NyYXRjaHJlZyhpeCxwKSkge3B4PTE7ZW1pdChmLFNQVVNIKCJ4IikpO3B1c2goMik7fQorCWlmKHJlZ3NbaXldJiYhc2NyYXRjaHJlZyhpeSxwKSkge3B5PTE7ZW1pdChmLFNQVVNIKCJ5IikpO3B1c2goMik7fQorICAgICAgfQorCisgICAgICBpZighY29tcGFyZV9vYmplY3RzKCZwLT5xMSwmcC0+eikpeworCWxvYWRfcmVnKGYsYWNjLCZwLT5xMSxJTlQpOworCXN0b3JlX3JlZyhmLGFjYywmcC0+eixJTlQpOworICAgICAgfQorICAgICAgaW5jX2FkZHIoJnAtPnExLC0yLHQpOworICAgICAgaW5jX2FkZHIoJnAtPnosLTIsdCk7CisgICAgICBsb2FkX3JlZyhmLGFjYywmcC0+cTEsSU5UKTsKKyAgICAgIGlmKGNudDwwfHwob3B0c2l6ZSYmY250PjEpfHwoY250PjMmJiFvcHRzcGVlZCkpeworCWlmKChwLT5xMi5mbGFncyZSRUcpJiZwLT5xMi5yZWc9PWl4KXsKKwkgIGlmKChwLT56LmZsYWdzJlJFRykmJnAtPnoucmVnPT1peSkgaWVycm9yKDApOworCX1lbHNlCisJICBsb2FkX2FkZHIoZixpeCwmcC0+eik7CisJaWYoSVNSQUNDKHEyKSl7CisJICBpZihzY3JhdGNocmVnKGFjYyxwKSYmKHB4K3B5PT0wKSl7CisJICAgIGVtaXQoZixTUFVMTCgieSIpKTsKKwkgICAgcG9wKDIpO3BhPTA7CisJICB9ZWxzZQorCSAgICBlbWl0KGYsIlx0bGR5XHQlZCwlc1xuIiwocHgrcHkpKjIscmVnbmFtZXNbc3BdKTsKKwl9ZWxzZQorCSAgbG9hZF9yZWcoZixpeSwmcC0+cTIscC0+dHlwZjIpOyAvKlRPRE86IHR5cGVzIT1JTlQ/PyAqLworCWlmKChwLT5xMi5mbGFncyZSRUcpJiZwLT5xMi5yZWc9PWl4KQorCSAgbG9hZF9hZGRyKGYsaXgsJnAtPnopOworCWlmKGM9PUxTSElGVCkKKwkgIGVtaXQoZiwiXHQlc1x0JXNfX2xzbGxcbiIsanNyaW5zdCxpZHByZWZpeCk7CisJZWxzZQorCSAgZW1pdChmLCJcdCVzXHQlc19fJXNcbiIsanNyaW5zdCxpZHByZWZpeCwodCZVTlNJR05FRCk/ImxzcmwiOiJhc3JsIik7CisJaWYocHkpIHtlbWl0KGYsU1BVTEwoInkiKSk7cG9wKDIpO30KKwlpZihweCkge2VtaXQoZixTUFVMTCgieCIpKTtwb3AoMik7fQorICAgICAgfWVsc2V7CisJaW5jX2FkZHIoJnAtPnosYz09TFNISUZUPzM6Mix0KTsKKwlmb3IoaT0wO2k8Y250O2krKyl7CisJICBpZihjPT1MU0hJRlQpeworCSAgICBlbWl0KGYsIlx0bHNsXHQiKTsKKwkgICAgZW1pdF9vYmooZiwmcC0+eixDSEFSKTsKKwkgICAgZW1pdChmLCJcbiIpOworCSAgICBpbmNfYWRkcigmcC0+eiwtMSx0KTsKKwkgICAgZW1pdChmLCJcdHJvbFx0Iik7CisJICAgIGVtaXRfb2JqKGYsJnAtPnosQ0hBUik7CisJICAgIGVtaXQoZiwiXG4iKTsKKwkgICAgaW5jX2FkZHIoJnAtPnosMSx0KTsKKwkgICAgZW1pdChmLCJcdHJvbGJcbiIpOworCSAgICBlbWl0KGYsIlx0cm9sYVxuIik7CisJICB9ZWxzZXsKKwkgICAgZW1pdChmLCJcdCVzXG4iLCh0JlVOU0lHTkVEKT8ibHNyYSI6ImFzcmEiKTsKKwkgICAgZW1pdChmLCJcdHJvcmJcbiIpOworCSAgICBlbWl0KGYsIlx0cm9yXHQiKTsKKwkgICAgZW1pdF9vYmooZiwmcC0+eixDSEFSKTsKKwkgICAgZW1pdChmLCJcbiIpOworCSAgICBpbmNfYWRkcigmcC0+eiwxLHQpOworCSAgICBlbWl0KGYsIlx0cm9yXHQiKTsKKwkgICAgZW1pdF9vYmooZiwmcC0+eixDSEFSKTsKKwkgICAgZW1pdChmLCJcbiIpOworCSAgICBpbmNfYWRkcigmcC0+eiwtMSx0KTsKKwkgIH0KKwl9CisJaW5jX2FkZHIoJnAtPnosYz09TFNISUZUPy0zOi0yLHQpOworCXN0b3JlX3JlZyhmLGFjYywmcC0+eixJTlQpOworICAgICAgfQorICAgICAgaWYocGEpIHtlbWl0KGYsU1BVTExEKTtwb3AoMik7fQorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYoSVNMV09SRCh0KSYmYyE9R0VUUkVUVVJOJiZjIT1TRVRSRVRVUk4mJmMhPUNPTVBBUkUmJmMhPUNPTlZFUlQmJmMhPUFERFJFU1MpeworICAgICAgaWYoYz09UFVTSCYmaXNyZWcocTEpJiZwLT5xMS5yZWc9PWR4KXsKKwlpZihDUFU9PTY4MTIpeworCSAgZW1pdChmLCJcdHBzaGRcbiIpOworCSAgZW1pdChmLCJcdHBzaHhcbiIpOworCX1lbHNleworCSAgLyplbWl0KGYsIlx0cHNoc1x0YSxiLHhcbiIpOyovCisJICBlbWl0KGYsIlx0cHNoc1x0YixhXG4iKTsKKwkgIGVtaXQoZiwiXHRwc2hzXHR4XG4iKTsKKwl9CisJZG9udHBvcCArPSA0OworCXB1c2goNCk7CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZihjPT1BU1NJR04mJmlzcmVnKHExKSYmcC0+cTEucmVnPT1keCl7CisJaW5jX2FkZHIoJnAtPnosMix0KTsKKwlzdG9yZV9yZWcoZixpeCwmcC0+eixJTlQpOworCWluY19hZGRyKCZwLT56LC0yLHQpOworCXN0b3JlX3JlZyhmLGFjYywmcC0+eixJTlQpOworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoYz09QVNTSUdOJiZpc3JlZyh6KSYmcC0+ei5yZWc9PWR4KXsKKwlpbmNfYWRkcigmcC0+cTEsMix0KTsKKwlsb2FkX3JlZyhmLGl4LCZwLT5xMSxJTlQpOworCWluY19hZGRyKCZwLT5xMSwtMix0KTsKKwlsb2FkX3JlZyhmLGFjYywmcC0+cTEsSU5UKTsKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PVBVU0gpeworCWlmKHJlZ3NbYWNjXSkgZW1pdChmLCJcdHN0ZFx0JWxkLCVzXG4iLGxvZmYtcm9mZi0yLXN0YWNrb2Zmc2V0LHJlZ25hbWVzW3NwXSk7CisgICAgICB9ZWxzZQorCWdldF9hY2MoZixwKTsKKyAgICAgIC8qVE9ETzogYWNjIGluIElDLCBjb25zdGFudHMgKi8KKyAgICAgIGluY19hZGRyKCZwLT5xMSwyLHQpOworICAgICAgaWYoYz09TUlOVVMpeworCWlmKENQVSE9NjgxMiYmIW9wdHNpemUpCisJICBlbWl0KGYsIlx0bGRkXHQjMFxuIik7CisJZWxzZQorCSAgZW1pdChmLCJcdGNscmFcblx0Y2xyYlxuIik7CisgICAgICB9ZWxzZQorCWxvYWRfcmVnKGYsYWNjLCZwLT5xMSxJTlQpOworICAgICAgaWYoYz09QUREfHxjPT1TVUIpeworCWluY19hZGRyKCZwLT5xMiwyLHQpOworCWVtaXQoZiwiXHQlc1x0IixjPT1BREQ/ImFkZGQiOiJzdWJkIik7CisJZW1pdF9vYmooZiwmcC0+cTIsSU5UKTsKKwllbWl0KGYsIlxuIik7CisgICAgICB9ZWxzZSBpZihjPT1BU1NJR058fGM9PVBVU0gpeworICAgICAgfWVsc2UgaWYoYz09TUlOVVMpeworCWVtaXQoZiwiXHRzdWJkXHQiKTsKKwllbWl0X29iaihmLCZwLT5xMSxJTlQpOworCWVtaXQoZiwiXG4iKTsKKyAgICAgIH1lbHNlIGlmKGM9PUtPTVBMRU1FTlQpeworCWVtaXQoZiwiXHRjb21hXG4iKTsKKwllbWl0KGYsIlx0Y29tYlxuIik7CisgICAgICB9ZWxzZXsKKwlpZihjPT1BTkQpCisJICBlbWl0KGYsIlx0YW5kYlx0Iik7CisJZWxzZSBpZihjPT1PUikKKwkgIGVtaXQoZiwiXHRvciVzYlx0IixDUFU9PTY4MTI/ImEiOiIiKTsKKwllbHNlIGlmKGM9PVhPUikKKwkgIGVtaXQoZiwiXHRlb3JiXHQiKTsKKwlpbmNfYWRkcigmcC0+cTIsMyx0KTsKKwllbWl0X29iaihmLCZwLT5xMixDSEFSKTsKKwllbWl0KGYsIlxuIik7CisJaWYoYz09QU5EKQorCSAgZW1pdChmLCJcdGFuZGFcdCIpOworCWVsc2UgaWYoYz09T1IpCisJICBlbWl0KGYsIlx0b3Ilc2FcdCIsQ1BVPT02ODEyPyJhIjoiIik7CisJZWxzZSBpZihjPT1YT1IpCisJICBlbWl0KGYsIlx0ZW9yYVx0Iik7CisJaW5jX2FkZHIoJnAtPnEyLC0xLHQpOworCWVtaXRfb2JqKGYsJnAtPnEyLENIQVIpOworCWVtaXQoZiwiXG4iKTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PVBVU0gpeworCWlmKENQVT09NjgxMikKKwkgIGVtaXQoZiwiXHRwc2hkXG4iKTsKKwllbHNlCisJICBlbWl0KGYsIlx0cHNoc1x0YixhXG4iKTsKKwlwdXNoKDIpO2RvbnRwb3ArPTI7CisgICAgICB9ZWxzZXsKKwlpbmNfYWRkcigmcC0+eiwyLHQpOworCXN0b3JlX3JlZyhmLGFjYywmcC0+eixJTlQpOworICAgICAgfQorICAgICAgaW5jX2FkZHIoJnAtPnExLC0yLHQpOworICAgICAgaWYoYz09TUlOVVMpCisJZW1pdChmLCJcdGxkZFx0IzBcbiIpOworICAgICAgZWxzZQorCWxvYWRfcmVnKGYsYWNjLCZwLT5xMSxJTlQpOworICAgICAgaWYoYz09QUREKQorCWVtaXQoZiwiXHRhZGNiXHQiKTsKKyAgICAgIGVsc2UgaWYoYz09U1VCKQorCWVtaXQoZiwiXHRzYmNiXHQiKTsKKyAgICAgIGVsc2UgaWYoYz09QU5EKQorCWVtaXQoZiwiXHRhbmRiXHQiKTsKKyAgICAgIGVsc2UgaWYoYz09T1IpCisJZW1pdChmLCJcdG9yJXNiXHQiLENQVT09NjgxMj8iYSI6IiIpOworICAgICAgZWxzZSBpZihjPT1YT1IpCisJZW1pdChmLCJcdGVvcmJcdCIpOworICAgICAgZWxzZSBpZihjPT1LT01QTEVNRU5UKQorCWVtaXQoZiwiXHRjb21iXG4iKTsKKyAgICAgIGVsc2UgaWYoYz09TUlOVVMpeworCWluY19hZGRyKCZwLT5xMSwxLHQpOworCWVtaXQoZiwiXHRzYmNiXHQiKTsKKwllbWl0X29iaihmLCZwLT5xMSxDSEFSKTsKKwllbWl0KGYsIlxuIik7CisgICAgICB9CisgICAgICBpZihwLT5xMi5mbGFncyl7CisJaW5jX2FkZHIoJnAtPnEyLC0xLHQpOworCWVtaXRfb2JqKGYsJnAtPnEyLENIQVIpOworCWVtaXQoZiwiXG4iKTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PUFERCkKKwllbWl0KGYsIlx0YWRjYVx0Iik7CisgICAgICBlbHNlIGlmKGM9PVNVQikKKwllbWl0KGYsIlx0c2JjYVx0Iik7CisgICAgICBlbHNlIGlmKGM9PUFORCkKKwllbWl0KGYsIlx0YW5kYVx0Iik7CisgICAgICBlbHNlIGlmKGM9PU9SKQorCWVtaXQoZiwiXHRvciVzYVx0IixDUFU9PTY4MTI/ImEiOiIiKTsKKyAgICAgIGVsc2UgaWYoYz09WE9SKQorCWVtaXQoZiwiXHRlb3JhXHQiKTsKKyAgICAgIGVsc2UgaWYoYz09S09NUExFTUVOVCkKKwllbWl0KGYsIlx0Y29tYVxuIik7CisgICAgICBlbHNlIGlmKGM9PU1JTlVTKXsKKwlpbmNfYWRkcigmcC0+cTEsLTEsdCk7CisJZW1pdChmLCJcdHNiY2FcdCIpOworCWVtaXRfb2JqKGYsJnAtPnExLENIQVIpOworCWVtaXQoZiwiXG4iKTsKKyAgICAgIH0KKyAgICAgIGlmKHAtPnEyLmZsYWdzKXsKKwlpbmNfYWRkcigmcC0+cTIsLTEsdCk7CisJZW1pdF9vYmooZiwmcC0+cTIsQ0hBUik7CisJZW1pdChmLCJcbiIpOworICAgICAgfQorICAgICAgaWYoYz09UFVTSCl7CisJaWYoQ1BVPT02ODEyKQorCSAgZW1pdChmLCJcdHBzaGRcbiIpOworCWVsc2UKKwkgIGVtaXQoZiwiXHRwc2hzXHRiLGFcbiIpOworCXB1c2goMik7ZG9udHBvcCs9MjsKKwlpZihyZWdzW2FjY10pIGVtaXQoZiwiXHRsZGRcdCVsZCwlc1xuIixsb2ZmLXJvZmYtMi1zdGFja29mZnNldCxyZWduYW1lc1tzcF0pOworICAgICAgfWVsc2V7CisJaW5jX2FkZHIoJnAtPnosLTIsdCk7CisJc3RvcmVfcmVnKGYsYWNjLCZwLT56LElOVCk7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAKKyAgICBpZihjPT1DT01QQVJFKXsKKyAgICAgIGludCB2YWRyOworICAgICAgaWYoZHJlbCYmKHAtPnExLmZsYWdzJlZBUkFEUikmJiFJU0ZVTkMocC0+cTEudi0+dnR5cC0+ZmxhZ3MpKSB2YWRyPTE7CisgICAgICBlbHNlIGlmKGRyZWwmJihwLT5xMi5mbGFncyZWQVJBRFIpJiYhSVNGVU5DKHAtPnEyLnYtPnZ0eXAtPmZsYWdzKSkgdmFkcj0yOworICAgICAgZWxzZSBpZihwY3JlbCYmKHAtPnExLmZsYWdzJlZBUkFEUikmJklTRlVOQyhwLT5xMS52LT52dHlwLT5mbGFncykpIHZhZHI9MTsKKyAgICAgIGVsc2UgaWYocGNyZWwmJihwLT5xMi5mbGFncyZWQVJBRFIpJiZJU0ZVTkMocC0+cTIudi0+dnR5cC0+ZmxhZ3MpKSB2YWRyPTI7CisgICAgICBlbHNlIHZhZHI9MDsKKyAgICAgIGlmKHZhZHIhPTEmJih2YWRyPT0yfHxpc2NvbnN0KHExKXx8SVNSQUNDKHEyKSkpeworCXN0cnVjdCBJQyAqcDI7CisJbz1wLT5xMTtwLT5xMT1wLT5xMjtwLT5xMj1vOworCXAyPXAtPm5leHQ7CisJd2hpbGUocDImJnAyLT5jb2RlPT1GUkVFUkVHKSBwMj1wMi0+bmV4dDsKKwlpZighcDJ8fHAyLT5jb2RlPEJFUXx8cDItPmNvZGU+QkdUKSBpZXJyb3IoMCk7CisJaWYocDItPmNvZGU9PUJMVCkgcDItPmNvZGU9QkdUOworCWVsc2UgaWYocDItPmNvZGU9PUJHVCkgcDItPmNvZGU9QkxUOworCWVsc2UgaWYocDItPmNvZGU9PUJMRSkgcDItPmNvZGU9QkdFOworCWVsc2UgaWYocDItPmNvZGU9PUJHRSkgcDItPmNvZGU9QkxFOworICAgICAgfQorICAgICAgLyogY2FzZSB3aXRoIHR3byByZWxhdGl2ZSBhZGRyZXNzZXMgKi8KKyAgICAgIGlmKGRyZWwmJihwLT5xMi5mbGFncyZWQVJBRFIpJiYhSVNGVU5DKHAtPnEyLnYtPnZ0eXAtPmZsYWdzKSkgc2tpcF9yZWw9MTsKKyAgICAgIGlmKHBjcmVsJiYocC0+cTIuZmxhZ3MmVkFSQURSKSYmSVNGVU5DKHAtPnEyLnYtPnZ0eXAtPmZsYWdzKSkgc2tpcF9yZWw9MTsKKyAgICB9CisjaWYgMAorICAgIC8qIFRPRE86IGZpeCBjYyAqLworICAgIGlmKGM9PUNPTVBBUkUmJmlzY29uc3QocTIpKXsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCx0KTsKKyAgICAgIGlmKElTTlVMTCgpKXsKKwlpZihjYyYmKGNjX3QmTlUpPT0odCZOVSkmJmNvbXBhcmVfb2JqZWN0cyhjYywmcC0+cTEpKXsKKwkgIGxhc3Rjb21wPXQ7Y29udGludWU7CisJfQorICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgaWYoIXNob3J0X2FkZCkKKyAgICAgIHN3aXRjaF9JQyhwKTsKKworICAgIGlmKGM9PUNPTlZFUlQpeworICAgICAgaW50IHRvPXAtPnR5cGYyJk5VOworICAgICAgaWYodG89PUlOVCkgdG89U0hPUlQ7CisgICAgICBpZih0bz09KFVOU0lHTkVEfElOVCl8fHRvPT1OUE9JTlRFUikgdG89KFVOU0lHTkVEfFNIT1JUKTsKKyAgICAgIGlmKHRvPT1GUE9JTlRFUnx8dG89PUhQT0lOVEVSKSB0bz0oVU5TSUdORUR8TE9ORyk7CisgICAgICBpZigodCZOVSk9PUlOVCkgdD1TSE9SVDsKKyAgICAgIGlmKCh0Jk5VKT09KFVOU0lHTkVEfElOVCl8fCh0Jk5VKT09TlBPSU5URVIpIHQ9KFVOU0lHTkVEfFNIT1JUKTsKKyAgICAgIGlmKCh0Jk5RKT09RlBPSU5URVJ8fCh0Jk5RKT09SFBPSU5URVIpIHQ9KFVOU0lHTkVEfExPTkcpOworICAgICAgLyppZigodCZOUSk+PUxPTkd8fCh0byZOUSk+PUxPTkcpIGllcnJvcigwKTsqLworICAgICAgaWYoKHRvJk5RKTw9TE9ORyYmKHQmTlEpPD1MT05HKXsKKwlpZigodG8mTlEpPCh0Jk5RKSl7CisJICBpZihJU0xXT1JEKHQpKXsKKwkgICAgZ2V0X2FjYyhmLHApOworCSAgICBsb2FkX3JlZyhmLGFjYywmcC0+cTEsdG8pOworCSAgICBpZigodG8mTlUpPT1DSEFSKQorCSAgICAgIGVtaXQoZixTRVgpOworCSAgICBlbHNlIGlmKCh0byZOVSk9PShVTlNJR05FRHxDSEFSKSkKKwkgICAgICBlbWl0KGYsIlx0Y2xyYVxuIik7CisJICAgIGluY19hZGRyKCZwLT56LDIsdCk7CisJICAgIHN0b3JlX3JlZyhmLGFjYywmcC0+eixJTlQpOworCSAgICBpbmNfYWRkcigmcC0+eiwtMix0KTsKKwkgICAgaWYodG8mVU5TSUdORUQpeworCSAgICAgIGVtaXQoZiwiXHRjbHJhXG5cdGNscmJcbiIpOworCSAgICB9ZWxzZXsKKwkgICAgICBpZihDUFU9PTY4MTIpCisJCWVtaXQoZiwiXHRleGdcdGEsYlxuIik7CisJICAgICAgZWxzZQorCQllbWl0KGYsIlx0dGZyXHRhLGJcbiIpOworCSAgICAgIGVtaXQoZixTRVgpOworCSAgICAgIGVtaXQoZiwiXHR0ZnJcdGEsYlxuIik7CisJICAgIH0KKwkgICAgc3RvcmVfcmVnKGYsYWNjLCZwLT56LElOVCk7CisJICAgIGNvbnRpbnVlOworCSAgfQorCSAgLyplbWl0KGYsIiNjb252IFJBQ0M9JWQsIHJlZ3M9JWQgc2NyYXRjaD0lZFxuIiwoaW50KUlTUkFDQyh6KSxyZWdzW2FjY10sc2NyYXRjaHJlZyhhY2MscCkpOyovCisJICBpZighSVNSQUNDKHopKQorCSAgICBnZXRfYWNjKGYscCk7CisJICBsb2FkX3JlZyhmLGFjYywmcC0+cTEsdG8pOworCSAgaWYodG8mVU5TSUdORUQpCisJICAgIGVtaXQoZiwiXHRjbHJhXG4iKTsKKwkgIGVsc2UKKwkgICAgZW1pdChmLFNFWCk7CisJICBzdG9yZV9yZWcoZixhY2MsJnAtPnosdCk7CisJICBjYz0mcC0+ejtjY190PXQ7CisJICBjb250aW51ZTsKKwl9ZWxzZSBpZigodG8mTlEpPih0Jk5RKSl7CisJICBpZighSVNSQUNDKHopJiYhSVNSQUNDKHExKSkKKwkgICAgZ2V0X2FjYyhmLHApOworCSAgaWYoSVNMV09SRCh0bykpCisJICAgIGluY19hZGRyKCZwLT5xMSwyLHRvKTsKKwkgIGxvYWRfcmVnKGYsYWNjLCZwLT5xMSx0byk7CisJICBzdG9yZV9yZWcoZixhY2MsJnAtPnosdCk7CisJICBjb250aW51ZTsKKwl9ZWxzZXsKKwkgIGM9QVNTSUdOOworCSAgcC0+cTIudmFsLnZtYXg9c2l6ZXRhYlt0Jk5RXTsKKwl9CisgICAgICB9CisgICAgfQorICAgIGlmKGM9PUtPTVBMRU1FTlQpeworICAgICAgY2M9MDsKKyAgICAgIGlmKGNvbXBhcmVfb2JqZWN0cygmcC0+cTEsJnAtPnopJiYhaXNyZWcocTEpJiYocC0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSkhPURSRUZPQkomJighcC0+cTEuYW18fHAtPnExLmFtLT5mbGFncyE9QUNDX0lORCkpeworCWVtaXQoZiwiXHRjb21cdCIpOworCWVtaXRfb2JqKGYsJnAtPnosdCk7CisJZW1pdChmLCJcbiIpOworCWlmKElTSFdPUkQodCkpeworCSAgbW9iaj1wLT56OworCSAgaW5jX2FkZHIoJm1vYmosMSx0KTsKKwkgIGVtaXQoZiwiXHRjb21cdCIpOworCSAgZW1pdF9vYmooZiwmbW9iaixJTlQpOworCSAgZW1pdChmLCJcbiIpOworCX0KKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKCghaXNyZWcoeil8fHAtPnoucmVnIT1hY2MpJiZyZWdzW2FjY10mJiFzY3JhdGNocmVnKGFjYyxwKSkKKwlnZXRfYWNjKGYscCk7CisgICAgICBsb2FkX3JlZyhmLGFjYywmcC0+cTEsdCk7CisgICAgICBlbWl0KGYsIlx0Y29tYVxuXHRjb21iXG4iKTsKKyAgICAgIHN0b3JlX3JlZyhmLGFjYywmcC0+eix0KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1NSU5VUyl7CisgICAgICBpZigoIWlzcmVnKHopfHxwLT56LnJlZyE9YWNjKSYmcmVnc1thY2NdJiYhc2NyYXRjaHJlZyhhY2MscCkpCisJZ2V0X2FjYyhmLHApOworICAgICAgaWYoaXNyZWcocTEpKXsKKwlsb2FkX3JlZyhmLGFjYywmcC0+cTEsdCk7CisJZW1pdChmLCJcdG5lZ2Fcblx0bmVnYlxuXHRzYmNhXHQjMFxuIik7CisgICAgICB9ZWxzZXsKKwlpZihDUFUhPTY4MTImJiFvcHRzaXplKQorCSAgZW1pdChmLCJcdGxkZFx0IzBcbiIpOworCWVsc2UKKwkgIGVtaXQoZiwiXHRjbHJhXG5cdGNscmJcbiIpOworCWVtaXQoZiwiXHRzdWJkXHQiKTsKKwllbWl0X29iaihmLCZwLT5xMSx0KTsKKwllbWl0KGYsIlxuIik7CisgICAgICB9CisgICAgICBjYz0mcC0+ejtjY190PXQ7CisgICAgICBzdG9yZV9yZWcoZixhY2MsJnAtPnosdCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09U0VUUkVUVVJOKXsKKyAgICAgIGlmKGlzcmVnKHExKSYmcC0+cTEucmVnPT1wLT56LnJlZykgY29udGludWU7CisgICAgICBpZihwLT56LnJlZyl7CisJaWYoSVNMV09SRCh0KSl7CisJICBpbmNfYWRkcigmcC0+cTEsMCx0KTsKKwkgIGxvYWRfcmVnKGYsaXgsJnAtPnExLElOVCk7CisJICBCU0VUKHJlZ3NfbW9kaWZpZWQsaXgpOworCSAgaW5jX2FkZHIoJnAtPnExLDIsdCk7CisJfQorCWxvYWRfcmVnKGYsYWNjLCZwLT5xMSx0KTsKKwlCU0VUKHJlZ3NfbW9kaWZpZWQsYWNjKTsKKworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PUdFVFJFVFVSTil7CisgICAgICBpZihpc3JlZyh6KSYmcC0+ei5yZWc9PXAtPnExLnJlZykgY29udGludWU7CisgICAgICBpZihwLT5xMS5yZWcpeworCWlmKElTTFdPUkQodCkpeworCSAgc3RvcmVfcmVnKGYsaXgsJnAtPnosSU5UKTsKKwkgIEJTRVQocmVnc19tb2RpZmllZCxpeCk7CisJICBpbmNfYWRkcigmcC0+eiwyLHQpOworCX0KKwlzdG9yZV9yZWcoZixhY2MsJnAtPnosKHQmTlEpPT1DSEFSP3Q6SU5UKTsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1DQUxMKXsKKyAgICAgIGludCByZWcsam1wPTA7CisgICAgICBjYz0wOworICAgICAgaWYoIWNhbGNfcmVncyhwLGYhPTApJiZ2LT5maSkgdi0+ZmktPmZsYWdzJj1+QUxMX1JFR1M7CisgICAgICBpZigocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmIXN0cmNtcCgiX192YV9zdGFydCIscC0+cTEudi0+aWRlbnRpZmllcikpeworCWxvbmcgb2Y9dmFfb2Zmc2V0KHYpK2xvZmYrMjsKKwllbWl0KGYsIlx0dGZyXHQlcyxkXG4iLHJlZ25hbWVzW3NwXSk7CisJaWYob2YpIGVtaXQoZiwiXHRhZGRkXHQjJWxkXG4iLG9mKTsKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKChwLT5xMS5mbGFncyZWQVIpJiZwLT5xMS52LT5maSYmcC0+cTEudi0+ZmktPmlubGluZV9hc20peworCWVtaXRfaW5saW5lX2FzbShmLHAtPnExLnYtPmZpLT5pbmxpbmVfYXNtKTsKKwlqbXA9MTsKKyAgICAgIH1lbHNleworCWlmKHN0YWNrb2Zmc2V0PT0wJiYhaGF2ZV9mcmFtZSYmIXN0cmNtcChyZXQsInJ0cyIpKXsKKwkgIHN0cnVjdCBJQyAqcDI7CisJICBqbXA9MTsKKwkgIGZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKwkgICAgaWYocDItPmNvZGUhPUZSRUVSRUcmJnAyLT5jb2RlIT1BTExPQ1JFRyYmcDItPmNvZGUhPUxBQkVMKXsKKwkgICAgICBqbXA9MDticmVhazsKKwkgICAgfQorCSAgfQorCX0KKwlpZihwLT5xMS5mbGFncyZEUkVGT0JKKXsKKwkgIC8qRklYTUU6IHRlc3QgdGhpcyovCisJICBpZihqbXApCisJICAgIGVtaXQoZiwiXHRqbXBcdCIpOworCSAgZWxzZQorCSAgICBlbWl0KGYsIlx0anNyXHQiKTsKKwkgIGVtaXRfb2JqKGYsJnAtPnExLHQpOworCSAgZW1pdChmLCJcbiIpOworCX1lbHNleworCSAgaWYoam1wKXsKKwkgICAgZW1pdChmLCJcdCVzXHQiLGptcGluc3QpOyAvKmVtaXQoZiwiXHRicmFcdCIpOyovCisJICAgIC8qaWYoIW5lZWRfcmV0dXJuKSByZXQ9MDsqLyAvKlRPRE86IHdvcmtzIHdpdGggb3B0aW1pemVyPyAqLworCSAgfWVsc2V7CisJICAgIGVtaXQoZiwiXHQlc1x0Iixqc3JpbnN0KTsgLyplbWl0KGYsIlx0YnNyXHQiKTsqLworCSAgfQorCSAgaWYocGNyZWwpeworCSAgICBwY3JlbD0wOworCSAgICBlbWl0X29iaihmLCZwLT5xMSx0KTsKKwkgICAgcGNyZWw9MTsKKwkgIH1lbHNlCisJICAgIGVtaXRfb2JqKGYsJnAtPnExLHQpOworCSAgZW1pdChmLCJcbiIpOworCX0KKyAgICAgIH0KKyAgICAgIGlmKHN0YWNrX3ZhbGlkKXsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGlmKHAtPmNhbGxfY250PD0wKXsKKyAgICAgICAgICBlcnJfaWM9cDtpZihmKSBlcnJvcigzMjApOworICAgICAgICAgIHN0YWNrX3ZhbGlkPTA7CisgICAgICAgIH0KKyAgICAgICAgZm9yKGk9MDtzdGFja192YWxpZCYmaTxwLT5jYWxsX2NudDtpKyspeworICAgICAgICAgIGlmKHAtPmNhbGxfbGlzdFtpXS52LT5maSYmKHAtPmNhbGxfbGlzdFtpXS52LT5maS0+ZmxhZ3MmQUxMX1NUQUNLKSl7CisJICAgIC8qRklYTUU6IHNpemUgb2YgcmV0dXJuIGFkZHIgZGVwZW5kcyBvbiBtb2RlICovCisJICAgIGlmKCFqbXApIHB1c2goMik7CisJICAgIGNhbGxlZV9wdXNoKHptMmwocC0+Y2FsbF9saXN0W2ldLnYtPmZpLT5zdGFjazEpKTsKKwkgICAgaWYoIWptcCkgcG9wKDIpOworICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgZXJyX2ljPXA7aWYoZikgZXJyb3IoMzE3LHAtPmNhbGxfbGlzdFtpXS52LT5pZGVudGlmaWVyKTsKKyAgICAgICAgICAgIHN0YWNrX3ZhbGlkPTA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZighem1lcXRvKGwyem0oMEwpLHAtPnEyLnZhbC52bWF4KSl7CisJbm90cG9wcGVkKz16bTJsKHAtPnEyLnZhbC52bWF4KTsKKwlkb250cG9wLT16bTJsKHAtPnEyLnZhbC52bWF4KTsKKwlpZighKGdfZmxhZ3NbMl0mVVNFREZMQUcpJiZzdGFja29mZnNldD09LW5vdHBvcHBlZCl7CisJICAvKiAgRW50ZmVybmVuIGRlciBQYXJhbWV0ZXIgdmVyem9lZ2VybiAgKi8KKwl9ZWxzZXsKKwkgIGdlbl9wb3AoZix6bTJsKHAtPnEyLnZhbC52bWF4KSk7CisJICBub3Rwb3BwZWQtPXptMmwocC0+cTIudmFsLnZtYXgpOworCX0KKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1BU1NJR058fGM9PVBVU0gpeworICAgICAgaWYoYz09UFVTSCkgZG9udHBvcCs9em0ybChwLT5xMi52YWwudm1heCk7CisgICAgICBpZighem1sZXEocC0+cTIudmFsLnZtYXgsbDJ6bSgyTCkpKXsKKwl1bnNpZ25lZCBsb25nIHNpemU7aW50IHFyPTAsenI9MCxjcj0wLHB4PTAscHk9MCxwdT0wLHBkPTAsbHE9MCxsej0wOworCXNpemU9em0ybChwLT5xMi52YWwudm1heCk7CisJaWYoYz09QVNTSUdOKXsKKwkgIGlmKCFwLT56LmFtJiYocC0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmSVNJRFgocC0+ei5yZWcpKXsKKwkgICAgenI9cC0+ei5yZWc7bHo9MTsKKwkgIH0KKwl9CisJaWYoIXAtPnExLmFtJiYocC0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJklTSURYKHAtPnExLnJlZykmJnAtPnExLnJlZyE9enIpeworCSAgcXI9cC0+cTEucmVnO2xxPTE7CisJfQorCWlmKCFxcil7CisJICBpZih6cj09aXgpIHFyPWl5OworCSAgZWxzZSBpZih6cj09aXl8fHpyPT1pdSkgcXI9aXg7CisJICBlbHNle3FyPWl4O3pyPWl5O30KKwl9ZWxzZSBpZighenIpeworCSAgaWYocXI9PWl4KSB6cj1peTsgZWxzZSB6cj1peDsKKwl9CisJaWYoQ1BVIT02ODEyKXsKKwkgIGlmKHFyIT1pdSYmenIhPWl1KSBjcj1pdTsKKwkgIGlmKHFyIT1peCYmenIhPWl4KSBjcj1peDsKKwkgIGlmKHFyIT1peSYmenIhPWl5KSBjcj1peTsKKwkgIGlmKCFjcikgaWVycm9yKDApOworCX0KKwlpZihjPT1QVVNIKXsKKwkgIGVtaXQoZiwiXHRsZWFzXHQlbGQsJXNcbiIsU0dOMTYoLXNpemUpLHJlZ25hbWVzW3NwXSk7CisJICBwdXNoKHNpemUpOworCX0KKwlpZihDUFUhPTY4MTImJihkcmVsfHwhcmVndXNlZFtpdV18fChyZWdzW2l1XSYmIXNjcmF0Y2hyZWcoaXUscCkpKSl7CisJICBpZihjPT1QVVNIKQorCSAgICBlbWl0KGYsIlx0c3R1XHQlbGQsJXNcbiIsbG9mZi1yb2ZmLTgtc3RhY2tvZmZzZXQscmVnbmFtZXNbc3BdKTsKKwkgIGVsc2V7CisJICAgIGVtaXQoZixTUFVTSCgidSIpKTsKKwkgICAgcHVzaCgyKTsKKwkgIH0KKwkgIHB1PTE7CisJfQorCWlmKCFyZWd1c2VkW2l5XXx8KHJlZ3NbaXldJiYhc2NyYXRjaHJlZyhpeSxwKSkpeworCSAgaWYoYz09UFVTSCkKKwkgICAgZW1pdChmLCJcdHN0eVx0JWxkLCVzXG4iLGxvZmYtcm9mZi00LXN0YWNrb2Zmc2V0LHJlZ25hbWVzW3NwXSk7CisJICBlbHNleworCSAgICBlbWl0KGYsU1BVU0goInkiKSk7CisJICAgIHB1c2goMik7CisJICB9CisJICBweT0xOworCX0KKwlpZihyZWdzW2l4XSYmIXNjcmF0Y2hyZWcoaXgscCkpeworCSAgaWYoYz09UFVTSCkKKwkgICAgZW1pdChmLCJcdHN0eFx0JWxkLCVzXG4iLGxvZmYtcm9mZi0yLXN0YWNrb2Zmc2V0LHJlZ25hbWVzW3NwXSk7CisJICBlbHNleworCSAgICBlbWl0KGYsU1BVU0goIngiKSk7CisJICAgIHB1c2goMik7CisJICB9CisJICBweD0xOworCX0KKwlpZighbHEpIGxvYWRfYWRkcihmLHFyLCZwLT5xMSk7CisJaWYoYz09UFVTSCkKKwkgIGVtaXQoZiwiXHR0ZnJcdCVzLCVzXG4iLHJlZ25hbWVzW3NwXSxyZWduYW1lc1t6cl0pOworCWVsc2UKKwkgIGlmKCFseikgbG9hZF9hZGRyKGYsenIsJnAtPnopOworCWlmKHNpemU8PTZ8fChzaXplPD0xNiYmIW9wdHNpemUpKXsKKwkgIGlmKENQVSE9NjgxMil7CisJICAgIGlmKCFzY3JhdGNocmVnKGFjYyxwKSl7CisJICAgICAgaWYoYz09UFVTSCkKKwkJZW1pdChmLCJcdHN0ZFx0JWxkLCVzXG4iLGxvZmYtcm9mZi02LXN0YWNrb2Zmc2V0LHJlZ25hbWVzW3NwXSk7CisJICAgICAgZWxzZXsKKwkJZW1pdChmLFNQVVNIRCk7CisJCXB1c2goMik7CisJICAgICAgfQorCSAgICAgIHBkPTI7CisJICAgIH0KKwkgIH0KKwkgIHdoaWxlKHNpemU+Mil7CisJICAgIGlmKENQVT09NjgxMikKKwkgICAgICBlbWl0KGYsIlx0bW92d1x0MiwlcyssMiwlcytcbiIscmVnbmFtZXNbcXJdLHJlZ25hbWVzW3pyXSk7CisJICAgIGVsc2UKKwkgICAgICBlbWl0KGYsIlx0bGRkXHQsJXMrK1xuXHRzdGRcdCwlcysrXG4iLHJlZ25hbWVzW3FyXSxyZWduYW1lc1t6cl0pOworCSAgICBzaXplLT0yOworCSAgfQorCSAgaWYoQ1BVPT02ODEyKQorCSAgICBlbWl0KGYsIlx0bW92JWNcdDAsJXMsMCwlc1xuIixzaXplPT0yPyd3JzonYicscmVnbmFtZXNbcXJdLHJlZ25hbWVzW3pyXSk7CisJICBlbHNlCisJICAgIGVtaXQoZiwiXHRsZCVjXHQsJXNcblx0c3QlY1x0LCVzXG4iLHNpemU9PTI/J2QnOidiJyxyZWduYW1lc1txcl0sc2l6ZT09Mj8nZCc6J2InLHJlZ25hbWVzW3pyXSk7CisJfWVsc2V7CisJICBpbnQgbD0rK2xhYmVsLGNudD0oaW50KShvcHRzaXplPyhDUFU9PTY4MTI/c2l6ZTooc2l6ZS8yKSk6c2l6ZS84KTsKKwkgIGlmKHJlZ3NbYWNjXSYmIXNjcmF0Y2hyZWcoYWNjLHApKXsKKwkgICAgaWYoYz09UFVTSCkKKwkgICAgICBlbWl0KGYsIlx0c3QlY1x0JWxkLCVzXG4iLChDUFUhPTY4MTImJmNudDw9MjU1KT8nYic6J2QnLGxvZmYtcm9mZi02LXN0YWNrb2Zmc2V0LHJlZ25hbWVzW3NwXSk7CisJICAgIGVsc2V7CisJICAgICAgaWYoQ1BVIT02ODEyJiZjbnQ8PTI1NSl7CisJCWVtaXQoZixTUFVTSCgiYiIpKTsKKwkJcHVzaCgxKTsKKwkgICAgICB9ZWxzZXsKKwkJZW1pdChmLFNQVVNIRCk7CisJCXB1c2goMik7CisJICAgICAgfQorCSAgICB9CisJICAgIHBkPShDUFUhPTY4MTImJmNudDw9MjU1KT8xOjI7CisJICB9CisJICBpZihDUFUhPTY4MTImJmNudDw9MjU1KQorCSAgICBlbWl0KGYsIlx0bGRiXHQjJWx1XG4iLGNudCk7CisJICBlbHNlCisJICAgIGVtaXQoZiwiXHRsZGRcdCMlbHVcbiIsY250KTsKKwkgIGNjPTA7CisjaWYgMAorCSAgaWYoQ1BVIT02ODEyJiYoKCFyZWdzYVtpdV0mJnJlZ3NbaXVdKXx8ZHJlbCkpeworCSAgICBpZihjPT1QVVNIKXsKKwkgICAgICBlbWl0KGYsIlx0c3R1XHQlbGQsJXNcbiIsbG9mZi1yb2ZmLTgtc3RhY2tvZmZzZXQscmVnbmFtZXNbc3BdKTsgCisJICAgIH1lbHNleworCSAgICAgIGVtaXQoZixTUFVTSCgidSIpKTtwdXNoKDIpOworCSAgICB9CisJICB9CisjZW5kaWYKKwkgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGwpOworCSAgaWYoQ1BVPT02ODEyKXsKKwkgICAgaWYob3B0c2l6ZSl7CisJICAgICAgZW1pdChmLCJcdG1vdmJcdDEsJXMrLDEsJXMrXG4iLHJlZ25hbWVzW3FyXSxyZWduYW1lc1t6cl0pOworCSAgICAgIHNpemU9MDsKKwkgICAgfWVsc2V7CisJICAgICAgZW1pdChmLCJcdG1vdndcdDIsJXMrLDIsJXMrXG4iLHJlZ25hbWVzW3FyXSxyZWduYW1lc1t6cl0pOworCSAgICAgIGVtaXQoZiwiXHRtb3Z3XHQyLCVzKywyLCVzK1xuIixyZWduYW1lc1txcl0scmVnbmFtZXNbenJdKTsKKwkgICAgICBlbWl0KGYsIlx0bW92d1x0MiwlcyssMiwlcytcbiIscmVnbmFtZXNbcXJdLHJlZ25hbWVzW3pyXSk7CisJICAgICAgZW1pdChmLCJcdG1vdndcdDIsJXMrLDIsJXMrXG4iLHJlZ25hbWVzW3FyXSxyZWduYW1lc1t6cl0pOworCSAgICAgIHNpemU9c2l6ZSY3OworCSAgICB9CisJICAgIGVtaXQoZiwiXHRkYm5lXHRkLCVzJWRcbiIsbGFicHJlZml4LGwpOworCSAgfWVsc2V7CisJICAgIGlmKG9wdHNpemUpeworCSAgICAgIGVtaXQoZiwiXHRsZCVzXHQsJXMrK1xuXHRzdCVzXHQsJXMrK1xuIixyZWduYW1lc1tjcl0scmVnbmFtZXNbcXJdLHJlZ25hbWVzW2NyXSxyZWduYW1lc1t6cl0pOworCSAgICAgIHNpemUmPTE7CisJICAgIH1lbHNleworCSAgICAgIGVtaXQoZiwiXHRsZCVzXHQsJXMrK1xuXHRzdCVzXHQsJXMrK1xuIixyZWduYW1lc1tjcl0scmVnbmFtZXNbcXJdLHJlZ25hbWVzW2NyXSxyZWduYW1lc1t6cl0pOworCSAgICAgIGVtaXQoZiwiXHRsZCVzXHQsJXMrK1xuXHRzdCVzXHQsJXMrK1xuIixyZWduYW1lc1tjcl0scmVnbmFtZXNbcXJdLHJlZ25hbWVzW2NyXSxyZWduYW1lc1t6cl0pOworCSAgICAgIGVtaXQoZiwiXHRsZCVzXHQsJXMrK1xuXHRzdCVzXHQsJXMrK1xuIixyZWduYW1lc1tjcl0scmVnbmFtZXNbcXJdLHJlZ25hbWVzW2NyXSxyZWduYW1lc1t6cl0pOworCSAgICAgIGVtaXQoZiwiXHRsZCVzXHQsJXMrK1xuXHRzdCVzXHQsJXMrK1xuIixyZWduYW1lc1tjcl0scmVnbmFtZXNbcXJdLHJlZ25hbWVzW2NyXSxyZWduYW1lc1t6cl0pOworCSAgICAgIHNpemUmPTc7CisJICAgIH0KKwkgICAgaWYoY250PD0yNTUpCisJICAgICAgZW1pdChmLCJcdGRlY2JcbiIpOworCSAgICBlbHNlCisJICAgICAgZW1pdChmLCJcdHN1YmRcdCMxXG4iKTsKKwkgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsbCk7CisJICB9CisjaWYgMAorCSAgaWYoQ1BVIT02ODEyJiYoKCFyZWdzYVtpdV0mJnJlZ3NbaXVdKXx8ZHJlbCkpeworCSAgICBpZihjPT1QVVNIKXsKKwkgICAgICBlbWl0KGYsIlx0bGR1XHQlbGQsJXNcbiIsbG9mZi1yb2ZmLTgtc3RhY2tvZmZzZXQscmVnbmFtZXNbc3BdKTsKKwkgICAgfWVsc2V7CisJICAgICAgZW1pdChmLFNQVUxMKCJ1IikpO3BvcCgyKTsKKwkgICAgfQorCSAgfQorI2VuZGlmCisJICB3aGlsZShzaXplPj0yKXsKKwkgICAgaWYoQ1BVPT02ODEyKQorCSAgICAgIGVtaXQoZiwiXHRtb3Z3XHQyLCVzKywyLCVzK1xuIixyZWduYW1lc1txcl0scmVnbmFtZXNbenJdKTsKKwkgICAgZWxzZQorCSAgICAgIGVtaXQoZiwiXHRsZGRcdCwlcysrXG5cdHN0ZFx0LCVzKytcbiIscmVnbmFtZXNbcXJdLHJlZ25hbWVzW3pyXSk7CisJICAgIHNpemUtPTI7CisJICB9CisJICBpZihzaXplKXsKKwkgICAgaWYoQ1BVPT02ODEyKQorCSAgICAgIGVtaXQoZiwiXHRtb3ZiXHQwLCVzLDAsJXNcbiIscmVnbmFtZXNbcXJdLHJlZ25hbWVzW3pyXSk7CisJICAgIGVsc2UKKwkgICAgICBlbWl0KGYsIlx0bGRiXHQsJXNcblx0c3RiXHQsJXNcbiIscmVnbmFtZXNbcXJdLHJlZ25hbWVzW3pyXSk7CisJICB9CisJfQorCWlmKHBkKXsKKwkgIGlmKGM9PVBVU0gpIAorCSAgICBlbWl0KGYsIlx0bGQlY1x0JWxkLCVzXG4iLChwZD09MSk/J2InOidkJyxsb2ZmLXJvZmYtNi1zdGFja29mZnNldCxyZWduYW1lc1tzcF0pOworCSAgZWxzZXsKKwkgICAgaWYocGQ9PTEpeworCSAgICAgIGVtaXQoZixTUFVMTCgiYiIpKTsKKwkgICAgICBwb3AoMSk7CisJICAgIH1lbHNleworCSAgICAgIGVtaXQoZixTUFVMTEQpOworCSAgICAgIHBvcCgyKTsKKwkgICAgfQorCSAgfQorCX0KKwlpZihweCl7CisJICBpZihjPT1QVVNIKSAKKwkgICAgZW1pdChmLCJcdGxkeFx0JWxkLCVzXG4iLGxvZmYtcm9mZi0yLXN0YWNrb2Zmc2V0LHJlZ25hbWVzW3NwXSk7CisJICBlbHNleworCSAgICBlbWl0KGYsU1BVTEwoIngiKSk7CisJICAgIHBvcCgyKTsKKwkgIH0KKwl9CisJaWYocHkpeworCSAgaWYoYz09UFVTSCkgCisJICAgIGVtaXQoZiwiXHRsZHlcdCVsZCwlc1xuIixsb2ZmLXJvZmYtNC1zdGFja29mZnNldCxyZWduYW1lc1tzcF0pOworCSAgZWxzZXsKKwkgICAgZW1pdChmLFNQVUxMKCJ5IikpOworCSAgICBwb3AoMik7CisJICB9CisJfQorCWlmKHB1KXsKKwkgIGlmKGM9PVBVU0gpIAorCSAgICBlbWl0KGYsIlx0bGR1XHQlbGQsJXNcbiIsbG9mZi1yb2ZmLTgtc3RhY2tvZmZzZXQscmVnbmFtZXNbc3BdKTsKKwkgIGVsc2V7CisJICAgIGVtaXQoZixTUFVMTCgidSIpKTsKKwkgICAgcG9wKDIpOworCSAgfQorCX0KKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKCFJU1NDQUxBUih0KSkgdD16bWVxdG8ocC0+cTIudmFsLnZtYXgsbDJ6bSgxTCkpP0NIQVI6SU5UOworICAgICAgaWYoKHQmTlEpPT1DSEFSJiYhem1lcXRvKHAtPnEyLnZhbC52bWF4LGwyem0oMUwpKSkgdD1JTlQ7CQorICAgICAgaWYobW92X29wKCZwLT5xMSkmJihjPT1QVVNIfHxtb3Zfb3AoJnAtPnopKSl7CisJZW1pdChmLCJcdG1vdiVjXHQiLElTSFdPUkQodCk/J3cnOidiJyk7CisJZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJaWYoYz09QVNTSUdOKXsKKwkgIGVtaXQoZiwiLCIpOworCSAgZW1pdF9vYmooZiwmcC0+eix0KTsKKwkgIGVtaXQoZiwiXG4iKTsKKwl9ZWxzZXsKKwkgIGVtaXQoZiwiLCVkLC0lc1xuIixJU0hXT1JEKHQpPzI6MSxyZWduYW1lc1tzcF0pOworCSAgcHVzaChJU0hXT1JEKHQpPzI6MSk7CisJfQorCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoKChyZWdzW2FjY10mJnJlZ3NbaXhdKXx8KHQmTlEpPT1DSEFSKSYmKHAtPnExLmZsYWdzJktPTlNUKSYmIWlzcmVnKHopKXsKKwlldmFsX2NvbnN0KCZwLT5xMS52YWwsdCk7CisJaWYoem1lcXRvKHZtYXgsbDJ6bSgwTCkpJiZ6dW1lcXRvKHZ1bWF4LHVsMnp1bSgwVUwpKSYmKChwLT56LmZsYWdzJihSRUd8RFJFRk9CSikpIT1EUkVGT0JKfHwodCZOUSk9PUNIQVIpJiYoIXAtPnouYW18fHAtPnouYW0tPmZsYWdzIT1BQ0NfSU5EfHwodCZOUSk9PUNIQVIpKXsKKwkgIGVtaXQoZiwiXHRjbHJcdCIpOworCSAgaWYoYz09QVNTSUdOKXsKKwkgICAgZW1pdF9vYmooZiwmcC0+eix0KTtlbWl0KGYsIlxuIik7CisJICB9ZWxzZXsKKwkgICAgZW1pdChmLENQVT09NjgxMj8iMSwtc3BcbiI6Iiwtc1xuIik7CisJICAgIHB1c2goMSk7CisJICB9CisJICBpZighSVNIV09SRCh0KSkgY29udGludWU7CisJICBlbWl0KGYsIlx0Y2xyXHQiKTsKKwkgIGlmKGM9PUFTU0lHTil7CisJICAgIG1vYmo9cC0+ejsKKwkgICAgaW5jX2FkZHIoJm1vYmosMSx0KTsKKwkgICAgZW1pdF9vYmooZiwmbW9iaix0KTtlbWl0KGYsIlxuIik7CisJICB9ZWxzZXsKKwkgICAgZW1pdChmLENQVT09NjgxMj8iMSwtc3BcbiI6Iiwtc1xuIik7CisJICAgIHB1c2goMSk7CisJICB9CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIH0KKyAgICAgIGlmKGM9PVBVU0gpeworCWludCBzdD0wOworCWlmKGlzcmVnKHExKSl7CisJICByZWc9cC0+cTEucmVnOworCX1lbHNleworCSAgaWYoKHQmTlEpPT1DSEFSfHwhcmVnc1thY2NdfHxzY3JhdGNocmVnKGFjYyxwKSkgcmVnPWFjYzsKKwkgIGVsc2UgaWYoIXJlZ3NbaXhdfHxzY3JhdGNocmVnKGl4LHApKSByZWc9aXg7CisJICBlbHNlIGlmKHJlZ3VzZWRbaXldJiYoIXJlZ3NbaXldfHxzY3JhdGNocmVnKGl5LHApKSkgcmVnPWl5OworCSAgZWxzZSBpZihyZWd1c2VkW2l1XSYmIWRyZWwmJkNQVSE9NjgxMiYmKCFyZWdzW2l1XXx8c2NyYXRjaHJlZyhpdSxwKSkpIHJlZz1pdTsKKwkgIGVsc2UgcmVnPWFjYzsKKwkgIGlmKHJlZ3NbcmVnXSYmIXNjcmF0Y2hyZWcocmVnLHApKXsKKwkgICAgc3Q9MTsKKwkgICAgZW1pdChmLCJcdHN0JXNcdCVsZCwlc1xuIixyZWduYW1lc1tyZWddLChsb25nKWxvZmYtcm9mZi0yLXN0YWNrb2Zmc2V0LHJlZ25hbWVzW3NwXSk7CisJICB9CisJICBsb2FkX3JlZyhmLHJlZywmcC0+cTEsdCk7CisJfQorCWlmKCh0Jk5RKT09Q0hBUikKKwkgIGVtaXQoZixTUFVTSCgiYiIpKTsKKwllbHNlIGlmKHJlZz09aXgpCisJICBlbWl0KGYsU1BVU0goIngiKSk7CisJZWxzZSBpZihyZWc9PWl5KQorCSAgZW1pdChmLFNQVVNIKCJ5IikpOworCWVsc2UgaWYocmVnPT1pdSkKKwkgIGVtaXQoZixTUFVTSCgidSIpKTsKKwllbHNlCisJICBlbWl0KGYsU1BVU0hEKTsKKwlwdXNoKHptMmwocC0+cTIudmFsLnZtYXgpKTsKKwlpZihzdCkKKwkgIGVtaXQoZiwiXHRsZCVzXHQlbGQsJXNcbiIscmVnbmFtZXNbcmVnXSwobG9uZylsb2ZmLXJvZmYtMi1zdGFja29mZnNldCxyZWduYW1lc1tzcF0pOworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoYz09QVNTSUdOKXsKKwlpZihpc3JlZyhxMSkmJmlzcmVnKHopKXsKKwkgIGlmKHAtPnExLnJlZyE9cC0+ei5yZWcpCisJICAgIGVtaXQoZiwiXHR0ZnJcdCVzLCVzXG4iLHJlZ25hbWVzW3AtPnExLnJlZ10scmVnbmFtZXNbcC0+ei5yZWddKTsKKwl9ZWxzZSBpZihpc3JlZyhxMSkpeworCSAgc3RvcmVfcmVnKGYscC0+cTEucmVnLCZwLT56LHQpOworCX1lbHNlIGlmKGlzcmVnKHopKXsKKwkgIGxvYWRfcmVnKGYscC0+ei5yZWcsJnAtPnExLHQpOworCX1lbHNleworCSAgcmVnPWdldF9yZWcoZixwLHQpOworCSAgbG9hZF9yZWcoZixyZWcsJnAtPnExLHQpOworCSAgc3RvcmVfcmVnKGYscmVnLCZwLT56LHQpOworCX0KKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGllcnJvcigwKTsKKyAgICB9CisgICAgaWYoYz09QUREUkVTUyl7CisgICAgICBpbnQgcHg9MDsKKyAgICAgIGlmKGlzcmVnKHopKXsKKwlyZWc9cC0+ei5yZWc7CisgICAgICB9ZWxzZSBpZighcmVnc1tpeF0peworCXJlZz1peDsKKyAgICAgIH1lbHNlIGlmKCFyZWdzW2l5XSl7CisJcmVnPWl5OworICAgICAgfWVsc2V7CisJLypGSVhNRTogdGVzdCBpZiB4IHVzZWQgaW4gcTEgKi8KKwlweD0xOworCWVtaXQoZixTUFVTSCgieCIpKTsKKwlyZWc9aXg7CisJcHVzaCgyKTsKKyAgICAgIH0KKyAgICAgIGxvYWRfYWRkcihmLHJlZywmcC0+cTEpOworICAgICAgaWYoIShwLT56LmZsYWdzJlJFRyl8fHAtPnoucmVnIT1yZWcpCisJc3RvcmVfcmVnKGYscmVnLCZwLT56LHAtPnR5cGYyKTsKKyAgICAgIGlmKHB4KXsKKwllbWl0KGYsU1BVTEwoIngiKSk7CisJcG9wKDIpOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYoKGM9PU1VTFR8fGM9PURJVnx8KGM9PU1PRCYmKHAtPnR5cGYmVU5TSUdORUQpKSkmJmlzY29uc3QocTIpKXsKKyAgICAgIGxvbmcgbG47CisgICAgICBldmFsX2NvbnN0KCZwLT5xMi52YWwsdCk7CisgICAgICBpZih6bWxlcShsMnptKDBMKSx2bWF4KSYmenVtbGVxKHVsMnp1bSgwVUwpLHZ1bWF4KSl7CisJaWYoKGxuPXBvZjIodnVtYXgpKSYmbG48NSl7CisJICBpZihjPT1NT0QpeworCSAgICB2bWF4PXptc3ViKHZtYXgsbDJ6bSgxTCkpOworCSAgICBjPXAtPmNvZGU9Yz1BTkQ7CisJICB9ZWxzZXsKKwkgICAgdm1heD1sMnptKGxuLTEpOworCSAgICBpZihjPT1ESVYpIHAtPmNvZGU9Yz1SU0hJRlQ7IGVsc2UgcC0+Y29kZT1jPUxTSElGVDsKKwkgIH0KKwkgIGM9cC0+Y29kZTsKKwkgIGd2YWwudm1heD12bWF4OworCSAgZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworCSAgaWYoYz09QU5EKXsKKwkgICAgaW5zZXJ0X2NvbnN0KCZwLT5xMi52YWwsdCk7CisJICB9ZWxzZXsKKwkgICAgaW5zZXJ0X2NvbnN0KCZwLT5xMi52YWwsdCk7CisJICAgIHAtPnR5cGYyPUlOVDsKKwkgIH0KKwl9CisgICAgICB9CisgICAgfQorICAgIGlmKGM9PU1PRHx8Yz09RElWKXsKKyAgICAgIGllcnJvcigwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworCisgICAgaWYoKGM9PUFERHx8Yz09U1VCKSYmKHAtPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUJiYocC0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSkhPVJFRyYmKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpIT1EUkVGT0JKJiYhcC0+cTEuYW0mJiFwLT56LmFtJiZjb21wYXJlX29iamVjdHMoJnAtPnExLCZwLT56KSl7CisgICAgICBldmFsX2NvbnN0KCZwLT5xMi52YWwsdCk7CisgICAgICBpZihjPT1TVUIpIHZtYXg9em1zdWIoWjAsdm1heCk7CisgICAgICBpZigodCZOUSk9PUNIQVImJnptZXF0byh2bWF4LFoxKSl7CisJZW1pdChmLCJcdGluY1x0Iik7CisJZW1pdF9vYmooZiwmcC0+eix0KTsKKwllbWl0KGYsIlxuIik7CisJY29udGludWU7CisgICAgICB9ZWxzZSBpZigodCZOUSk9PUNIQVImJnptZXF0byh2bWF4LGwyem0oLTFMKSkpeworCWVtaXQoZiwiXHRkZWNcdCIpOworCWVtaXRfb2JqKGYsJnAtPnosdCk7CisJZW1pdChmLCJcbiIpOworCWNvbnRpbnVlOworICAgICAgfWVsc2UgaWYoKCh0Jk5RKT09U0hPUlR8fCh0Jk5RKT09SU5UKSYmem1lcXRvKHZtYXgsbDJ6bSgxTCkpKXsKKwlpbmNfYWRkcigmcC0+eiwxLHQpOworCWVtaXQoZiwiXHRpbmNcdCIpOworCWVtaXRfb2JqKGYsJnAtPnosdCk7CisJZW1pdChmLCJcbiIpOworCWVtaXQoZiwiXHRibmVcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCWluY19hZGRyKCZwLT56LC0xLHQpOworCWVtaXQoZiwiXHRpbmNcdCIpOworCWVtaXRfb2JqKGYsJnAtPnosdCk7CisJZW1pdChmLCJcbiIpOworCWVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwljb250aW51ZTsKKyAgICAgIH1lbHNlIGlmKHJlZ3NbYWNjXSYmKCh0Jk5RKT09U0hPUlR8fCh0Jk5RKT09SU5UKSYmem1lcXRvKHZtYXgsbDJ6bSgtMUwpKSl7CisJaW5jX2FkZHIoJnAtPnosMSx0KTsKKwllbWl0KGYsIlx0dHN0XHQiKTsKKwllbWl0X29iaihmLCZwLT56LHQpOworCWVtaXQoZiwiXG4iKTsKKwllbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwlpbmNfYWRkcigmcC0+eiwtMSx0KTsKKwllbWl0KGYsIlx0ZGVjXHQiKTsKKwllbWl0X29iaihmLCZwLT56LHQpOworCWVtaXQoZiwiXG4iKTsKKwllbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJaW5jX2FkZHIoJnAtPnosMSx0KTsKKwllbWl0KGYsIlx0ZGVjXHQiKTsKKwllbWl0X29iaihmLCZwLT56LHQpOworCWVtaXQoZiwiXG4iKTsKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZigoYz49TFNISUZUJiZjPD1NT0QpfHxjPT1BRERJMlB8fGM9PVNVQklGUHx8Yz09U1VCUEZQfHwoYz49T1ImJmM8PUFORCl8fGM9PUNPTVBBUkUpeworICAgICAgY2hhciAqczsKKyAgICAgIC8qRklYTUU6IG5pY2h0IGltbWVyIGJlc3NlciovCisgICAgICBpZihJU0xXT1JEKHQpJiZjPT1MU0hJRlQmJmlzY29uc3QocTIpKXsKKwlldmFsX2NvbnN0KCZwLT5xMi52YWwsdCk7CisJaWYoem0ybCh2bWF4KT09MSl7CisJICBwLT5jb2RlPWM9QUREOworCSAgcC0+cTI9cC0+cTE7CisJfQorICAgICAgfQorICAgICAgaWYoKGM9PUFERHx8Yz09QURESTJQfHxjPT1NVUxUfHwoYz49T1ImJmM8PUFORCkpJiZpc3JlZyhxMikmJiFpc3JlZyhxMSkmJiFzaG9ydF9hZGQpeworCW89cC0+cTE7cC0+cTE9cC0+cTI7cC0+cTI9bzsKKyAgICAgIH0KKyAgICAgIGlmKChjPT1BRER8fGM9PU1VTFR8fChjPj1PUiYmYzw9QU5EKSkmJmlzcmVnKHEyKSYmcC0+cTIucmVnPT1hY2MmJiFzaG9ydF9hZGQpeworCW89cC0+cTE7cC0+cTE9cC0+cTI7cC0+cTI9bzsKKyAgICAgIH0KKyAgICAgIGlmKGM9PU1VTFR8fGM9PU1PRCl7CisJaWYoKCFpc3JlZyh6KXx8cC0+ei5yZWchPWFjYykmJnJlZ3NbYWNjXSYmIXNjcmF0Y2hyZWcoYWNjLHApKQorCSAgZ2V0X2FjYyhmLHApOworCXJlZz1hY2M7CisJLypGSVhNRTogeSBiencuIHgtUmVnaXN0ZXIqLworICAgICAgfWVsc2UgaWYoYz09TFNISUZUfHxjPT1SU0hJRlR8fGM9PUFORHx8Yz09T1J8fGM9PVhPUil7CisJaWYoKCFpc3JlZyh6KXx8cC0+ei5yZWchPWFjYykmJnJlZ3NbYWNjXSYmIXNjcmF0Y2hyZWcoYWNjLHApKQorCSAgZ2V0X2FjYyhmLHApOworCXJlZz1hY2M7CisgICAgICB9ZWxzZSBpZihjPT1ESVYpeworCXJlZz1peDsKKwlpZXJyb3IoMCk7CisgICAgICB9ZWxzZSBpZihpc3JlZyh6KSl7CisJcmVnPXAtPnoucmVnOworICAgICAgfWVsc2UgaWYoaXNyZWcocTEpJiYoYz09Q09NUEFSRXx8c2NyYXRjaHJlZyhwLT5xMS5yZWcscCkpKXsKKwlyZWc9cC0+cTEucmVnOworICAgICAgfWVsc2V7CisJaWYoYz09QUREfHxjPT1TVUJ8fGM9PUFEREkyUHx8Yz09U1VCSUZQfHxjPT1DT01QQVJFKXsKKwkgIGlmKElTUkFDQyhxMikpCisJICAgIHJlZz1hY2M7CisJICBlbHNlCisJICAgIHJlZz1nZXRfcmVnKGYscCx0KTsKKwl9ZWxzZXsKKwkgIGdldF9hY2MoZixwKTsKKwkgIHJlZz1hY2M7CisJfQorICAgICAgfQorICAgICAgaWYoYz09QUREfHxjPT1BRERJMlB8fGM9PVNVQnx8Yz09U1VCSUZQKXsKKwlpbnQgb3Bkb25lPTA7CisJaWYoaXNyZWcocTEpKXsKKwkgIGlmKElTSURYKHJlZykmJklTSURYKHAtPnExLnJlZykmJmlzY29uc3QocTIpKXsKKwkgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHNob3J0X2FkZD9zaG9ydF9hZGQ6cTJ0eXAocCkpOworCSAgICBpZihDUFU9PTY4MTImJnAtPnExLnJlZz09cmVnJiZ6bWVxdG8odm1heCxsMnptKDFMKSkmJnp1bWVxdG8odnVtYXgsdWwyenVtKDFVTCkpKXsKKwkgICAgICBlbWl0KGYsIlx0JXMlc1xuIixjPT1TVUI/ImRlIjoiaW4iLHJlZ25hbWVzW3JlZ10pOworCSAgICAgIC8qRklYTUU6IGNvbmRpdGlvbi1jb2RlcyBmb3IgYm5lL2JlcSBjb3VsZCBiZSB1c2VkICovCisJICAgIH1lbHNleworCSAgICAgIGVtaXQoZiwiXHRsZWElc1x0JWxkLCVzXG4iLHJlZ25hbWVzW3JlZ10sYz09U1VCP1NHTjE2KC16bTJsKHZtYXgpKTpTR04xNih6bTJsKHZtYXgpKSxyZWduYW1lc1twLT5xMS5yZWddKTsKKwkgICAgfQorCSAgICBvcGRvbmU9MTsKKwkgIH1lbHNlCWlmKChjPT1BRER8fGM9PUFEREkyUCkmJklTSURYKHJlZykmJklTSURYKHAtPnExLnJlZykmJklTUkFDQyhxMikpeworCSAgICBlbWl0KGYsIlx0bGVhJXNcdCVzLCVzXG4iLHJlZ25hbWVzW3JlZ10sKCh0Jk5RKT09Q0hBUnx8KHNob3J0X2FkZCZOUSk9PUNIQVIpPyJiIjoiZCIscmVnbmFtZXNbcC0+cTEucmVnXSk7CisJICAgIG9wZG9uZT0xOworCSAgfWVsc2UgaWYoKGM9PUFERHx8Yz09QURESTJQKSYmSVNJRFgocmVnKSYmSVNBQ0MocC0+cTEucmVnKSYmSVNSSURYKHEyKSl7CisJICAgIGVtaXQoZiwiXHRsZWElc1x0JXMsJXNcbiIscmVnbmFtZXNbcmVnXSwodCZOUSk9PUNIQVI/ImIiOiJkIixyZWduYW1lc1twLT5xMi5yZWddKTsKKwkgICAgb3Bkb25lPTE7CisJICB9ZWxzZSBpZigoYz09QUREfHxjPT1BRERJMlApJiZwLT5xMS5yZWc9PWFjYyYmSVNJRFgocmVnKSYmIXNob3J0X2FkZCl7CisJICAgIGxvYWRfcmVnKGYscmVnLCZwLT5xMix0KTsKKwkgICAgZW1pdChmLCJcdGxlYSVzXHQlcywlc1xuIixyZWduYW1lc1tyZWddLCh0Jk5RKT09Q0hBUj8iYiI6ImQiLHJlZ25hbWVzW3JlZ10pOworCSAgICBvcGRvbmU9MTsKKwkgIH1lbHNlIGlmKChjPT1BRER8fGM9PUFEREkyUCkmJnAtPnExLnJlZz09YWNjJiZJU0lEWChyZWcpJiYoc2hvcnRfYWRkJk5VKT09KFVOU0lHTkVEfENIQVIpJiZzY3JhdGNocmVnKGFjYyxwKSl7CisJICAgIGVtaXQoZiwiXHRhZGRiXHQiKTsKKwkgICAgZW1pdF9vYmooZiwmcC0+cTIsc2hvcnRfYWRkKTsKKwkgICAgZW1pdChmLCJcbiIpOworCSAgICBlbWl0KGYsIlx0YWRjYVx0IzBcbiIpOworCSAgICBlbWl0KGYsIlx0dGZyXHRkLHlcbiIpOworCSAgICBvcGRvbmU9MTsKKwkgIH1lbHNlIGlmKChjPT1BRER8fGM9PUFEREkyUCkmJklTQUNDKHAtPnExLnJlZykmJklTUkFDQyh6KSYmaXNyZWcocTIpJiZJU0lEWChwLT5xMi5yZWcpKXsKKwkgICAgaWYoIXNjcmF0Y2hyZWcocC0+cTIucmVnLHApKSBlbWl0KGYsIlx0ZXhnXHQlcywlc1xuIixyZWduYW1lc1thY2NdLHJlZ25hbWVzW3AtPnEyLnJlZ10pOworCSAgICBlbWl0KGYsIlx0bGVhJXNcdCVzLCVzXG4iLHJlZ25hbWVzW3AtPnEyLnJlZ10scmVnbmFtZXNbYWNjXSxyZWduYW1lc1twLT5xMi5yZWddKTsKKwkgICAgZW1pdChmLCJcdGV4Z1x0JXMsJXNcbiIscmVnbmFtZXNbYWNjXSxyZWduYW1lc1twLT5xMi5yZWddKTsKKwkgICAgb3Bkb25lPTE7CisJICB9ZWxzZQlpZihwLT5xMS5yZWchPXJlZyl7CisJICAgIGlmKGM9PUFERHx8Yz09QURESTJQfHwhSVNSQUNDKHEyKSkKKwkgICAgICBlbWl0KGYsIlx0dGZyXHQlcywlc1xuIixyZWduYW1lc1twLT5xMS5yZWddLHJlZ25hbWVzW3JlZ10pOworCSAgfQorCX1lbHNlIGlmKHNob3J0X2FkZCYmYz09U1VCJiZyZWc9PWFjYyYmIShzaG9ydF9hZGQmVU5TSUdORUQpKXsKKwkgIGxvYWRfcmVnKGYscmVnLCZwLT5xMixzaG9ydF9hZGQpOworCSAgZW1pdChmLCJcdGNscmFcbiIpOworCSAgZW1pdChmLCJcdG5lZ2JcbiIpOworCSAgZW1pdChmLCJcdHNiY2FcdCMwXG4iKTsKKwkgIGVtaXQoZiwiXHRhZGRkXHQiKTsKKwkgIGVtaXRfb2JqKGYsJnAtPnExLHQpOworCSAgZW1pdChmLCJcbiIpOworCSAgc3RvcmVfcmVnKGYscmVnLCZwLT56LHp0eXAocCkpOworCSAgY29udGludWU7CisJfWVsc2UgaWYoc2hvcnRfYWRkJiZjPT1BREQmJnJlZz09YWNjKXsKKwkgIGxvYWRfcmVnKGYscmVnLCZwLT5xMixzaG9ydF9hZGQpOworCSAgaWYoc2hvcnRfYWRkJlVOU0lHTkVEKQorCSAgICBlbWl0KGYsIlx0Y2xyYVxuIik7CisJICBlbHNlCisJICAgIGVtaXQoZixTRVgpOworCSAgZW1pdChmLCJcdGFkZGRcdCIpOworCSAgZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJICBlbWl0KGYsIlxuIik7CisJICBzdG9yZV9yZWcoZixyZWcsJnAtPnosenR5cChwKSk7CisJICBjb250aW51ZTsKKwl9ZWxzZXsKKwkgIGlmKCFJU1JBQ0MocTIpKQorCSAgICBsb2FkX3JlZyhmLHJlZywmcC0+cTEscTF0eXAocCkpOworCX0KKwlpZighb3Bkb25lKXsKKwkgIGlmKHJlZz09YWNjKXsKKwkgICAgaWYoSVNSQUNDKHEyKSl7CisJICAgICAgaWYoIUlTUkFDQyh6KSkgZ2V0X2FjYyhmLHApOworCSAgICAgIGlmKGM9PUFERHx8Yz09QURESTJQKXsKKwkJaWYoc2hvcnRfYWRkKXsKKwkJICBpZihzaG9ydF9hZGQmVU5TSUdORUQpCisJCSAgICBlbWl0KGYsIlx0Y2xyYVxuIik7CisJCSAgZWxzZQorCQkgICAgZW1pdChmLFNFWCk7CisJCSAgZW1pdChmLCJcdGFkZGRcdCIpOworCQkgIGVtaXRfb2JqKGYsJnAtPnExLHQpOworCQkgIGVtaXQoZiwiXG4iKTsKKwkJfWVsc2V7CisJCSAgaWYoQ1BVPT02ODEyKQorCQkgICAgZW1pdChmLCJcdGFzbGRcbiIpOyAvKiBvbmx5IGNhc2VzIHdpdGggcTE9cTI9YWNjIHNob3VsZCByZW1haW4gKi8KKwkJICBlbHNleworCQkgICAgZW1pdChmLCJcdGFzbGJcbiIpOworCQkgICAgaWYoKHQmTlEpIT1DSEFSKQorCQkgICAgICBlbWl0KGYsIlx0cm9sYVxuIik7CisJCSAgfQorCQl9CisJICAgICAgfWVsc2V7CisJCWlmKHNob3J0X2FkZCl7CisJCSAgaWYoc2hvcnRfYWRkJlVOU0lHTkVEKQorCQkgICAgZW1pdChmLCJcdGxkJXNhXHQjMjU1XG4iLChDUFU9PTY4MTIpPyJhIjoiIik7CisJCSAgZWxzZXsKKwkJICAgIGVtaXQoZixTRVgpOworCQkgICAgZW1pdChmLCJcdG5lZ2FcbiIpOworCQkgIH0KKwkJICBlbWl0KGYsIlx0bmVnYlxuXHRzYmNhXHQjMFxuIik7CisJCX1lbHNlIGlmKCh0Jk5RKSE9Q0hBUil7CisJCSAgZW1pdChmLCJcdG5lZ2Fcblx0bmVnYlxuXHRzYmNhXHQjMFxuIik7CisJCX1lbHNleworCQkgIGVtaXQoZiwiXHRuZWdiXG4iKTsKKwkJfQorCQkKKwkJaWYoSVNSSURYKHExKSl7CisJCSAgZW1pdChmLCJcdCVzJXNcbiIsQ1BVPT02ODEyPyJwc2giOiJwc2hzXHQiLHJlZ25hbWVzW3AtPnExLnJlZ10pOworCQkgIGVtaXQoZiwiXHRhZGRkXHQlc1xuIixDUFU9PTY4MTI/IjEscysiOiIscysrIik7CisJCX1lbHNleworCQkgIGVtaXQoZiwiXHRhZGRkXHQiKTsKKwkJICBlbWl0X29iaihmLCZwLT5xMSx0KTsKKwkJICBlbWl0KGYsIlxuIik7CisJCX0KKwkgICAgICB9CisJICAgIH1lbHNleworCSAgICAgIGlmKElTUklEWChxMikpeworCQlpZihDUFU9PTY4MTIpCisJCSAgZW1pdChmLCJcdHBzaCVzXG4iLHJlZ25hbWVzW3AtPnEyLnJlZ10pOworCQllbHNlCisJCSAgZW1pdChmLCJcdHBzaHNcdCVzXG4iLHJlZ25hbWVzW3AtPnEyLnJlZ10pOworCQlwdXNoKDIpO3BvcCgyKTsKKwkJaWYoQ1BVPT02ODEyKQorCQkgIGVtaXQoZiwiXHQlc2RcdDIsJXMrXG4iLChjPT1BRER8fGM9PUFEREkyUCk/ImFkZCI6InN1YiIscmVnbmFtZXNbc3BdKTsKKwkJZWxzZQorCQkgIGVtaXQoZiwiXHQlc2RcdCwlcysrXG4iLChjPT1BRER8fGM9PUFEREkyUCk/ImFkZCI6InN1YiIscmVnbmFtZXNbc3BdKTsKKwkgICAgICB9ZWxzZXsKKwkJZW1pdChmLCJcdCVzJXNcdCIsKGM9PUFERHx8Yz09QURESTJQKT8iYWRkIjoic3ViIiwoc2hvcnRfYWRkfHwodCZOUSk9PUNIQVIpPyJiIjoiZCIpOworCQllbWl0X29iaihmLCZwLT5xMixzaG9ydF9hZGQ/c2hvcnRfYWRkOnQpO2VtaXQoZiwiXG4iKTsKKwkJaWYoc2hvcnRfYWRkKXsKKwkJICBpZihzaG9ydF9hZGQmVU5TSUdORUQpCisJCSAgICBlbWl0KGYsIlx0JXNcdCMwXG4iLGM9PUFERD8iYWRjYSI6InNiY2EiKTsKKwkJICBlbHNlCisJCSAgICBpZXJyb3IoMCk7CisJCX0KKwkJaWYoZHJlbCYmKHAtPnEyLmZsYWdzJlZBUkFEUikpeworCQkgIGlmKENQVT09NjgxMikgaWVycm9yKDApOworCQkgIGVtaXQoZiwiXHRwc2hzXHQlc1xuIixyZWduYW1lc1tpdV0pO3B1c2goMik7CisJCSAgZW1pdChmLCJcdCVzZFx0LCVzKytcbiIsKGM9PUFERHx8Yz09QURESTJQKT8iYWRkIjoic3ViIixyZWduYW1lc1tzcF0pOworCQkgIHBvcCgyKTsKKwkJfQorCSAgICAgIH0KKwkgICAgfQorCSAgICBjYz0mcC0+ejtjY190PXQ7CisJICB9ZWxzZXsKKwkgICAgaWYoaXNjb25zdChxMikpeworCSAgICAgIGxvbmcgbDsKKwkgICAgICBldmFsX2NvbnN0KCZwLT5xMi52YWwsc2hvcnRfYWRkP3Nob3J0X2FkZDp0KTsKKwkgICAgICBsPXptMmwodm1heCk7CisJICAgICAgaWYoYz09U1VCKSBsPS1sOworCSAgICAgIC8qRklYTUU6IGNvbmRpdGlvbi1jb2RlcyBmb3IgYm5lL2JlcSBjb3VsZCBiZSB1c2VkICovCisJICAgICAgaWYobD09MSYmcmVnPT1peCYmQ1BVPT02ODEyKXsKKwkJZW1pdChmLCJcdGlueFxuIik7CisJICAgICAgfWVsc2UgaWYobD09MSYmcmVnPT1peSYmQ1BVPT02ODEyKXsKKwkJZW1pdChmLCJcdGlueVxuIik7CisJICAgICAgfWVsc2UgaWYobD09LTEmJnJlZz09aXgmJkNQVT09NjgxMil7CisJCWVtaXQoZiwiXHRkZXhcbiIpOworCSAgICAgIH1lbHNlIGlmKGw9PS0xJiZyZWc9PWl5JiZDUFU9PTY4MTIpeworCQllbWl0KGYsIlx0ZGV5XG4iKTsKKwkgICAgICB9ZWxzZXsKKwkJZW1pdChmLCJcdGxlYSVzXHQlbGQsJXNcbiIscmVnbmFtZXNbcmVnXSxTR04xNihsKSxyZWduYW1lc1tyZWddKTsKKwkgICAgICB9CisJICAgIH1lbHNleworCSAgICAgIGlmKGMhPUFERCYmYyE9QURESTJQKXsKKwkJaWYoIUlTUkFDQyhxMikpeworCQkgIGlmKCFzY3JhdGNocmVnKGFjYyxwKSkKKwkJICAgIGdldF9hY2MoZixwKTsKKwkJICBsb2FkX3JlZyhmLGFjYywmcC0+cTIsdCk7CisJCSAgaWYoKHQmTlEpIT1DSEFSKXsKKwkJICAgIGVtaXQoZiwiXHRuZWdhXG5cdG5lZ2Jcblx0c2JjYVx0IzBcbiIpOworCQkgIH1lbHNleworCQkgICAgZW1pdChmLCJcdG5lZ2JcbiIpOworCQkgIH0KKwkJICAvKmxvYWRfcmVnKGYscmVnLCZwLT5xMSx0KTsqLworCQl9ZWxzZXsKKwkJICBnZXRfYWNjKGYscCk7CisJCSAgbG9hZF9yZWcoZixyZWcsJnAtPnExLHQpOworCQkgIGlmKCh0Jk5RKT09Q0hBUikKKwkJICAgIGVtaXQoZiwiXHRuZWdiXG4iKTsKKwkJICBlbHNlCisJCSAgICBlbWl0KGYsIlx0bmVnYVxuXHRuZWdiXG5cdHNiY2FcdCMwXG4iKTsKKwkJfSAgCisJICAgICAgfWVsc2UgaWYoIUlTUkFDQyhxMikpeworCQlnZXRfYWNjKGYscCk7CisJCWlmKHNob3J0X2FkZCl7CisJCSAgbG9hZF9yZWcoZixhY2MsJnAtPnEyLHNob3J0X2FkZCk7CisJCSAgaWYoc2hvcnRfYWRkJlVOU0lHTkVEKXsKKwkJICAgIGlmKHJlZz09aXgpeworCQkgICAgICBlbWl0KGYsIlx0YWJ4XG4iKTsKKwkJICAgICAgc3RvcmVfcmVnKGYscmVnLCZwLT56LHp0eXAocCkpOworCQkgICAgICBjb250aW51ZTsKKwkJICAgIH1lbHNleworCQkgICAgICBlbWl0KGYsIlx0Y2xyYVxuIik7CisJCSAgICB9CisJCSAgfWVsc2UKKwkJICAgIHQ9Q0hBUjsKKwkJfWVsc2UKKwkJICBsb2FkX3JlZyhmLGFjYywmcC0+cTIsdCk7CisJICAgICAgfWVsc2V7CisJCWxvYWRfcmVnKGYscmVnLCZwLT5xMSx0KTsKKwkJaWYoc2hvcnRfYWRkJlVOU0lHTkVEKQorCQkgIGVtaXQoZiwiXHRjbHJhXG4iKTsKKwkJZW1pdChmLCJcdGxlYSVzXHQlcywlc1xuIixyZWduYW1lc1tyZWddLCgodCZOVSk9PUNIQVJ8fChzaG9ydF9hZGQmTlUpPT1DSEFSKT8iYiI6ImQiLHJlZ25hbWVzW3JlZ10pOworCQlzdG9yZV9yZWcoZixyZWcsJnAtPnosenR5cChwKSk7CisJCWNvbnRpbnVlOworCSAgICAgIH0KKwkgICAgICBlbWl0KGYsIlx0bGVhJXNcdCVzLCVzXG4iLHJlZ25hbWVzW3JlZ10sKHQmTlEpPT1DSEFSPyJiIjoiZCIscmVnbmFtZXNbcmVnXSk7CisJICAgIH0KKwkgIH0KKwl9CisJc3RvcmVfcmVnKGYscmVnLCZwLT56LHp0eXAocCkpOworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoYyE9TFNISUZUJiZjIT1SU0hJRlQpCisJbG9hZF9yZWcoZixyZWcsJnAtPnExLHQpOworICAgICAgaWYoYz09TVVMVCl7CisJaWYoQ1BVPT02ODEyKXsKKwkgIGludCBweT0wOworCSAgaWYocmVnIT1hY2MpIGllcnJvcihyZWcpOworCSAgaWYoIUlTUlkocTIpJiZyZWdzW2l5XSl7CisJICAgIGVtaXQoZiwiXHRwc2h5XG4iKTsKKwkgICAgcHVzaCgyKTsKKwkgICAgcHk9MTsKKwkgIH0KKwkgIGxvYWRfcmVnKGYsaXksJnAtPnEyLHQpOworCSAgZW1pdChmLCJcdGVtdWxcbiIpOworCSAgaWYocHkpeworCSAgICBlbWl0KGYsU1BVTEwoInkiKSk7CisJICAgIHBvcCgyKTsKKwkgIH0KKwkgIHN0b3JlX3JlZyhmLGFjYywmcC0+eix0KTsKKwkgIGNvbnRpbnVlOworCX1lbHNlCisJICBpZXJyb3IoMCk7CisgICAgICB9CisgICAgICBpZihjPT1MU0hJRlR8fGM9PVJTSElGVCl7CisJaWYoaXNjb25zdChxMikpeworCSAgaW50IGwsb2xkbDsKKwkgIGxvYWRfcmVnKGYsYWNjLCZwLT5xMSx0KTsKKwkgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCx0KTsKKwkgIG9sZGw9bD16bTJsKHZtYXgpOworCSAgaWYobD49MTYpeworCSAgICBpZihDUFUhPTY4MTImJiFvcHRzaXplKQorCSAgICAgIGVtaXQoZiwiXHRsZGRcdCMwXG4iKTsKKwkgICAgZWxzZQorCSAgICAgIGVtaXQoZiwiXHRjbHJhXG5cdGNscmJcbiIpOworCSAgICBsPTA7CisJICB9CisJICBpZihsPj04KXsKKwkgICAgaWYoYz09TFNISUZUKQorCSAgICAgIGVtaXQoZiwiXHQlc1xuXHRjbHJiXG4iLChDUFU9PTY4MTIpPyJ0YmEiOiJ0ZnJcdGIsYSIpOworCSAgICBlbHNleworCSAgICAgIGlmKHQmVU5TSUdORUQpCisJCWVtaXQoZiwiXHR0ZnJcdGEsYlxuXHRjbHJhXG4iKTsKKwkgICAgICBlbHNleworCQllbWl0KGYsIlx0dGZyXHRhLGJcbiIpOworCQllbWl0KGYsU0VYKTsKKwkgICAgICB9CisJICAgIH0KKwkgICAgbC09ODsKKwkgIH0KKwkgIHdoaWxlKGwtLSl7CisJICAgIGlmKGM9PVJTSElGVCl7CisJICAgICAgaWYodCZVTlNJR05FRCl7CisJCWlmKCh0Jk5RKT09Q0hBUikKKwkJICBlbWl0KGYsIlx0bHNyYlxuIik7CisJCWVsc2UKKwkJICBlbWl0KGYsQ1BVIT02ODEyPyJcdGxzcmFcblx0cm9yYlxuIjoiXHRsc3JkXG4iKTsKKwkgICAgICB9ZWxzZXsKKwkJaWYob2xkbD44fHwodCZOUSk9PUNIQVIpCisJCSAgZW1pdChmLCJcdGFzcmJcbiIpOworCQllbHNlCisJCSAgZW1pdChmLCJcdGFzcmFcblx0cm9yYlxuIik7CisJICAgICAgfQorCSAgICB9ZWxzZXsKKwkgICAgICBpZigodCZOUSk9PUNIQVIpCisJCWVtaXQoZiwiXHRhc2xiXG4iKTsKKwkgICAgICBlbHNlCisJCWVtaXQoZixDUFUhPTY4MTI/Ilx0YXNsYlxuXHRyb2xhXG4iOiJcdGFzbGRcbiIpOworCSAgICB9CisJICB9CisJfWVsc2V7CisJICBpbnQgcHg7Y2hhciAqczsKKwkgIGlmKHJlZ3NbaXhdJiYhc2NyYXRjaHJlZyhpeCxwKSYmKCFpc3JlZyh6KXx8cC0+ei5yZWchPWl4KSl7CisJICAgIGVtaXQoZixTUFVTSCgieCIpKTsKKwkgICAgcHVzaCgyKTtweD0xOworCSAgfWVsc2UKKwkgICAgcHg9MDsKKworCSAgLyogdGVsbCBpZiBYIG9yIEQgYXJlIHJlYWR5IGZvciBzaGlmdGluZyAqLworCSAgaW50IHhkb25lID0gMDsgCisJICBpbnQgZGRvbmUgPSAwOworCisJICAvKiBmcmVlIFggaWYgcTEgaXMgaW4gWCAqLworCSAgaWYgKElTUlgocTEpKSB7CisJICAgIGRkb25lID0gMTsKKwkgICAgaWYgKElTUkFDQyhxMikpIHsKKwkgICAgICB4ZG9uZSA9IDE7CisJICAgICAgaWYgKElTQ0hBUihwLT50eXBmMikpIGVtaXQoZiwgRVhURU5EKHAtPnR5cGYyKSk7CisJICAgICAgZW1pdChmLCAiXHRleGdcdHgsZFxuIik7CisJICAgIH0KKwkgICAgZWxzZSB7CisJICAgICAgZW1pdChmLCAiXHR0ZnJcdHgsZFxuIik7CisJICAgIH0KKwkgIH0KKwkgIC8qIGxvYWQgcTIgaW4gWCBpZiBub3QgZG9uZSB5ZXQgKi8KKwkgIGlmICgheGRvbmUpIHsKKwkgICAgaWYgKElTTFdPUkQocC0+dHlwZjIpKSB7CisJICAgICAgLyogcTIgaXMgMzJiaXQsIGl0IGlzIGluIG1lbW9yeSwgd2UgdGFrZSB0aGUgbG93ZXIgMTZiaXQgKi8KKwkgICAgICBpbmNfYWRkcigmcC0+cTIsIDIsIHAtPnR5cGYyKTsKKwkgICAgICBsb2FkX3JlZyhmLCBpeCwgJnAtPnEyLCBJTlQpOworCSAgICB9CisJICAgIGVsc2UgaWYgKElTSFdPUkQocC0+dHlwZjIpKSB7CisJICAgICAgLyogcTIgaXMgMTZiaXQsIGxvYWQgaXQgZGlyZWN0bHkgaW4gWCAqLworCSAgICAgIGxvYWRfcmVnKGYsIGl4LCAmcC0+cTIsIElOVCk7CisJICAgIH0KKwkgICAgZWxzZSB7CisJICAgICAgLyogcTIgaXMgOGJpdCwgd2UgbXVzdCBleHRlbmQgaXQgaW4gRCAqLworCSAgICAgIC8qIGlmIEQgaXMgYnVzeSB3aXRoIHExLCBzYXZlIHExIGluIFggKi8KKwkgICAgICBpZiAoZGRvbmUgfHwgSVNSQUNDKHExKSkgeworCQlpZiAoSVNDSEFSKHQpKSBlbWl0KGYsIEVYVEVORCh0KSk7CisJCWVtaXQoZiwgIlx0dGZyXHRkLHhcbiIpOworCQlsb2FkX3JlZyhmLCBhY2MsICZwLT5xMiwgQ0hBUik7CisJCWVtaXQoZiwgRVhURU5EKHAtPnR5cGYyKSk7CisJCWVtaXQoZiwgIlx0ZXhnXHR4LGRcbiIpOworCQlkZG9uZSA9IDE7CisJICAgICAgfQorCSAgICAgIGVsc2UgeworCQlsb2FkX3JlZyhmLCBhY2MsICZwLT5xMiwgQ0hBUik7CisJCWVtaXQoZiwgRVhURU5EKHAtPnR5cGYyKSk7CisJCWVtaXQoZiwgIlx0dGZyXHRkLHhcbiIpOworCSAgICAgIH0KKwkgICAgfQorCSAgfQorCSAgLyogbG9hZCBxMSBpbiBEIGlmIG5vdCBkb25lIHlldCAqLworCSAgaWYgKCFkZG9uZSkgeworCSAgICBsb2FkX3JlZyhmLCBhY2MsICZwLT5xMSwgdCk7CisJICAgIGlmIChJU0NIQVIodCkpIGVtaXQoZiwgRVhURU5EKHQpKTsKKwkgIH0KKworCisJICBpZihjPT1MU0hJRlQpIHM9ImxzbCI7CisJICBlbHNlIGlmKHQmVU5TSUdORUQpIHM9ImxzciI7CisJICBlbHNlIHM9ImFzciI7CisJICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXNfXyVzXG4iLGlkcHJlZml4LHMpOworCSAgZW1pdChmLCJcdCVzXHQlc19fJXNcbiIsanNyaW5zdCxpZHByZWZpeCxzKTsKKwkgIGlmKHB4KXsKKwkgICAgZW1pdChmLFNQVUxMKCJ4IikpOworCSAgICAvKmVtaXQoZiwiXHRwdWwlc1xuIixyZWduYW1lc1tpeF0pOyovCisJICAgIHBvcCgyKTsKKwkgIH0KKwl9CisJY2M9MDsKKwlzdG9yZV9yZWcoZixhY2MsJnAtPnosdCk7CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZihjPj1PUiYmYzw9QU5EKXsKKwlzPWxvZ2ljYWxzW2MtT1JdOworCWlmKHAtPnEyLmFtJiZwLT5xMi5hbS0+ZmxhZ3M9PUFDQ19JTkQpeworCSAgbW9iaj1wLT5xMTtwLT5xMT1wLT5xMjtwLT5xMj1tb2JqOworCX0KKwlpZihwLT5xMi5mbGFncyZLT05TVCl7CisJICB1bnNpZ25lZCBsb25nIGwsaDsKKwkgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCx0KTsKKwkgIGw9enVtMnVsKHZ1bWF4KTsKKwkgIGlmKCh0Jk5RKSE9Q0hBUil7CisJICAgIGg9KGw+PjgpJjI1NTsKKwkgICAgaWYoYz09QU5EJiZoPT0wKQorCSAgICAgIGVtaXQoZiwiXHRjbHJhXG4iKTsKKwkgICAgZWxzZSBpZihjPT1YT1ImJmg9PTI1NSkKKwkgICAgICBlbWl0KGYsIlx0Y29tYVxuIik7CisJICAgIGVsc2UgaWYoKGM9PUFORCYmaCE9MjU1KXx8KGM9PU9SJiZoIT0wKXx8KGM9PVhPUiYmaCE9MCkpCisJICAgICAgZW1pdChmLCJcdCVzYVx0IyVsdVxuIixzLGgpOworCSAgfQorCSAgaD1sJjI1NTsKKwkgIGlmKGM9PUFORCYmaD09MCkKKwkgICAgZW1pdChmLCJcdGNscmJcbiIpOworCSAgZWxzZSBpZihjPT1YT1ImJmg9PTI1NSkKKwkgICAgZW1pdChmLCJcdGNvbWJcbiIpOworCSAgZWxzZSBpZigoYz09QU5EJiZoIT0yNTUpfHwoYz09T1ImJmghPTApfHwoYz09WE9SJiZoIT0wKSkKKwkgICAgZW1pdChmLCJcdCVzYlx0IyVsdVxuIixzLGgpOworCX1lbHNleworCSAgaWYoaXNyZWcocTIpKXsKKwkgICAgaWYocC0+cTIucmVnPT1hY2MpeworCSAgICAgIGlmKGM9PVhPUil7CisJCWVtaXQoZiwiXHRjbHJiXG4iKTsKKwkJaWYoKHQmTlEpIT1DSEFSKSBlbWl0KGYsIlx0Y2xyYVxuIik7CisJICAgICAgfQorCSAgICB9ZWxzZXsKKwkgICAgICBpZigodCZOUSk9PUNIQVIpeworCQllbWl0KGYsU1BVU0goImEiKSk7CisJCXB1c2goMSk7CisJCWVtaXQoZiwiXHQlc2FcdCVzLCVzK1xuIixzLENQVT09NjgxMj8iMSI6IiIscmVnbmFtZXNbc3BdKTsKKwkJcG9wKDEpOworCSAgICAgIH1lbHNleworCQllbWl0KGYsIlx0JXMlc1xuIiwoQ1BVPT02ODEyKT8icHNoIjoicHNoc1x0IixyZWduYW1lc1twLT5xMi5yZWddKTsKKwkJcHVzaCgyKTsKKwkJZW1pdChmLCJcdCVzYVx0JXMsJXMrXG4iLHMsQ1BVPT02ODEyPyIxIjoiIixyZWduYW1lc1tzcF0pOworCQllbWl0KGYsIlx0JXNiXHQlcywlcytcbiIscyxDUFU9PTY4MTI/IjEiOiIiLHJlZ25hbWVzW3NwXSk7CisJCXBvcCgyKTsKKwkgICAgICB9CisJICAgIH0KKwkgIH1lbHNlIGlmKChwLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09RFJFRk9CSiYmKHQmTlEpIT1DSEFSKXsKKwkgICAgaW50IHhyPTA7CisJICAgIGlmKCFyZWdzW2l4XSkgeHI9aXg7CisJICAgIGVsc2UgaWYoIXJlZ3NbaXldKSB4cj1peTsKKwkgICAgZWxzZXsKKwkgICAgICB4cj1peDsKKwkgICAgICBlbWl0KGYsIlx0JXMlc1xuIiwoQ1BVPT02ODEyKT8icHNoIjoicHNoc1x0IixyZWduYW1lc1t4cl0pOworCSAgICAgIHB1c2goMik7CisKKwkgICAgfQorCSAgICBCU0VUKHJlZ3NfbW9kaWZpZWQseHIpOworCSAgICBsb2FkX2FkZHIoZix4ciwmcC0+cTIpOworCSAgICBpZigodCZOUSk9PUNIQVIpCisJICAgICAgZW1pdChmLCJcdCVzYlx0MCwlc1xuIixzLHJlZ25hbWVzW3hyXSk7CisJICAgIGVsc2V7CisJICAgICAgZW1pdChmLCJcdCVzYVx0MCwlc1xuIixzLHJlZ25hbWVzW3hyXSk7CisJICAgICAgZW1pdChmLCJcdCVzYlx0MSwlc1xuIixzLHJlZ25hbWVzW3hyXSk7CisJICAgIH0KKwkgICAgaWYocmVnc1tpeF0mJnhyPT1peCl7CisJICAgICAgZW1pdChmLFNQVUxMKCJ4IikpOworCSAgICAgIHBvcCgyKTsKKwkgICAgfQorCSAgfWVsc2V7CisJICAgIGVtaXQoZiwiXHQlc2JcdCIscyk7CisJICAgIGlmKCh0Jk5RKSE9Q0hBUikgaW5jX2FkZHIoJnAtPnEyLDEsdCk7CisJICAgIGVtaXRfb2JqKGYsJnAtPnEyLHQpOworCSAgICBlbWl0KGYsIlxuIik7CisJICAgIGlmKCh0Jk5RKSE9Q0hBUil7CisJICAgICAgaW5jX2FkZHIoJnAtPnEyLC0xLHQpOworCSAgICAgIGVtaXQoZiwiXHQlc2FcdCIscyk7CisJICAgICAgZW1pdF9vYmooZiwmcC0+cTIsdCk7CisJICAgICAgZW1pdChmLCJcbiIpOworCSAgICB9CisJICB9CisJfQorCWNjPTA7CisJc3RvcmVfcmVnKGYscmVnLCZwLT56LHQpOworCWNvbnRpbnVlOworICAgICAgfWVsc2UgaWYoYz09Q09NUEFSRSl7CisJbGFzdGNvbXA9dDsKKwlpZihpc3JlZyhxMikpeworCSAgZW1pdChmLCJcdCVzJXNcbiIsKENQVT09NjgxMik/InBzaCI6InBzaHNcdCIscmVnbmFtZXNbcC0+cTIucmVnXSk7CisJICBwdXNoKDIpOworCX0KKwlpZihyZWc9PWFjYyl7CisJICBpZigodCZOUSk9PUNIQVIpCisJICAgIGVtaXQoZiwiXHRjbXBiXHQiKTsKKwkgIGVsc2UKKwkgICAgZW1pdChmLFNDTVAoImQiKSk7CisJfWVsc2UgaWYocmVnPT1peCl7CisJICBlbWl0KGYsU0NNUCgieCIpKTsKKwl9ZWxzZSBpZihyZWc9PWl5KXsKKwkgIGVtaXQoZixTQ01QKCJ5IikpOworCX1lbHNlIGlmKHJlZz09aXUpeworCSAgZW1pdChmLFNDTVAoInUiKSk7CisJfWVsc2UKKwkgIGllcnJvcigwKTsKKwlpZihpc3JlZyhxMikpeworCSAgaWYoQ1BVPT02ODEyKQorCSAgICBlbWl0KGYsIjIsJXMrXG4iLHJlZ25hbWVzW3NwXSk7CisJICBlbHNlCisJICAgIGVtaXQoZiwiLCVzKytcbiIscmVnbmFtZXNbc3BdKTsKKwkgIHBvcCgyKTsKKwl9ZWxzZXsKKwkgIGVtaXRfb2JqKGYsJnAtPnEyLHQpO2VtaXQoZiwiXG4iKTsKKwl9CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZXJyb3IoMCk7CisgICAgfQorICAgIHByaWMyKHN0ZG91dCxwKTsKKyAgICBpZXJyb3IoMCk7CisgIH0KKyAgaWYobm90cG9wcGVkKXsKKyAgICBnZW5fcG9wKGYsbm90cG9wcGVkKTsKKyAgICBub3Rwb3BwZWQ9MDsKKyAgfQorICBmdW5jdGlvbl9ib3R0b20oZix2LGxvZmYpOworICBpZihkZWJ1Z19pbmZvKXsKKyAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKyAgICBkd2FyZjJfZnVuY3Rpb24oZix2LGxhYmVsKTsKKyAgICBpZihmKSBzZWN0aW9uPS0xOworICB9ICAgICAKK30KKworaW50IHNob3J0Y3V0KGludCBjLGludCB0KQoreworICBpZihjPT1DT01QQVJFfHxjPT1BRER8fGM9PVNVQnx8Yz09QU5EfHxjPT1PUnx8Yz09WE9SKSByZXR1cm4gMTsKKyAgaWYoKGM9PUxTSElGVHx8Yz09UlNISUZUKSYmSVNDSFdPUkQodCZOUSkpIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKwordm9pZCBjbGVhbnVwX2NnKEZJTEUgKmYpCit7CisgIHN0cnVjdCBmcGNvbnN0bGlzdCAqcDsKKyAgdW5zaWduZWQgY2hhciAqaXA7CisgIGlmKGYmJnN0YWNrX2NoZWNrKQorICAgIGVtaXQoZiwiXHQuZ2xvYmFsXHQlc19fc3RhY2tfY2hlY2tcbiIsaWRwcmVmaXgpOworICB3aGlsZShwPWZpcnN0ZnBjKXsKKyAgICBpZihmKXsKKyAgICAgIGlmKHNlY3Rpb24hPVJPREFUQSl7CisJZW1pdChmLHJvZGF0YW5hbWUpO2lmKGYpIHNlY3Rpb249Uk9EQVRBOworICAgICAgfQorICAgICAgZW1pdChmLCIlcyVkXG5cdCVzXHQiLGxhYnByZWZpeCxwLT5sYWJlbCxkY3RbTE9OR10pOworICAgICAgaXA9KHVuc2lnbmVkIGNoYXIgKikmcC0+dmFsLnZkb3VibGU7CisgICAgICBlbWl0KGYsIjB4JTAyeCUwMnglMDJ4JTAyeCIsaXBbMF0saXBbMV0saXBbMl0saXBbM10pOworICAgICAgaWYoKHAtPnR5cCZOUSk9PURPVUJMRXx8KHAtPnR5cCZOUSk9PUxET1VCTEUpeworCWVtaXQoZiwiLDB4JTAyeCUwMnglMDJ4JTAyeCIsaXBbNF0saXBbNV0saXBbNl0saXBbN10pOworICAgICAgfQorICAgICAgZW1pdChmLCJcbiIpOworICAgIH0KKyAgICBmaXJzdGZwYz1wLT5uZXh0OworICAgIGZyZWUocCk7CisgIH0KK30KKworaW50IHJlZ19wYXJtKHN0cnVjdCByZWdfaGFuZGxlICpwLHN0cnVjdCBUeXAgKnQsaW50IG1vZGUsc3RydWN0IFR5cCAqZmt0KQoreworICBpZihwLT5ncHIpIHJldHVybiAwOworICBpZihJU1NDQUxBUih0LT5mbGFncykmJiFJU0ZMT0FUKHQtPmZsYWdzKSYmIUlTTFdPUkQodC0+ZmxhZ3MpKXsKKyAgICBwLT5ncHI9MTsKKyAgICByZXR1cm4gYWNjOworICB9CisgIHJldHVybiAwOworfQorCit2b2lkIGluc2VydF9jb25zdCh1bmlvbiBhdHlwcyAqcCxpbnQgdCkKKy8qICBUcmFlZ3QgS29uc3RhbnRlIGluIGVudHByZWNoZW5kZXMgRmVsZCBlaW4uICAgICAgICovCit7CisgIGlmKCFwKSBpZXJyb3IoMCk7CisgIHQmPU5VOworICBpZih0PT1CSVQpIHtpZih6bWVxdG8oemMyem0odmNoYXIpLGwyem0oMEwpKSkgcC0+dmNoYXI9em0yemMobDJ6bSgwTCkpOyBlbHNlIHAtPnZjaGFyPXptMnpjKGwyem0oMUwpKTtyZXR1cm47fQorICBpZih0PT1DSEFSKSB7cC0+dmNoYXI9dmNoYXI7cmV0dXJuO30KKyAgaWYodD09U0hPUlQpIHtwLT52c2hvcnQ9dnNob3J0O3JldHVybjt9CisgIGlmKHQ9PUlOVCkge3AtPnZpbnQ9dmludDtyZXR1cm47fQorICBpZih0PT1MT05HKSB7cC0+dmxvbmc9dmxvbmc7cmV0dXJuO30KKyAgaWYodD09TExPTkcpIHtwLT52bGxvbmc9dmxsb25nO3JldHVybjt9CisgIGlmKHQ9PU1BWElOVCkge3AtPnZtYXg9dm1heDtyZXR1cm47fQorICBpZih0PT0oVU5TSUdORUR8QklUKSkge2lmKHp1bWVxdG8oenVjMnp1bSh2dWNoYXIpLHVsMnp1bSgwVUwpKSkgcC0+dnVjaGFyPXp1bTJ6dWModWwyenVtKDBVTCkpOyBlbHNlIHAtPnZ1Y2hhcj16dW0yenVjKHVsMnp1bSgxVUwpKTtyZXR1cm47fSAgCisgIGlmKHQ9PShVTlNJR05FRHxDSEFSKSkge3AtPnZ1Y2hhcj12dWNoYXI7cmV0dXJuO30KKyAgaWYodD09KFVOU0lHTkVEfFNIT1JUKSkge3AtPnZ1c2hvcnQ9dnVzaG9ydDtyZXR1cm47fQorICBpZih0PT0oVU5TSUdORUR8SU5UKSkge3AtPnZ1aW50PXZ1aW50O3JldHVybjt9CisgIGlmKHQ9PShVTlNJR05FRHxMT05HKSkge3AtPnZ1bG9uZz12dWxvbmc7cmV0dXJuO30KKyAgaWYodD09KFVOU0lHTkVEfExMT05HKSkge3AtPnZ1bGxvbmc9dnVsbG9uZztyZXR1cm47fQorICBpZih0PT0oVU5TSUdORUR8TUFYSU5UKSkge3AtPnZ1bWF4PXZ1bWF4O3JldHVybjt9CisgIGlmKHQ9PUZMT0FUKSB7cC0+dmZsb2F0PXZmbG9hdDtyZXR1cm47fQorICBpZih0PT1ET1VCTEUpIHtwLT52ZG91YmxlPXZkb3VibGU7cmV0dXJuO30KKyAgaWYodD09TERPVUJMRSkge3AtPnZsZG91YmxlPXZsZG91YmxlO3JldHVybjt9CisgIGlmKHQ9PU5QT0lOVEVSKSB7cC0+dnVpbnQ9dnVpbnQ7cmV0dXJuO30KKyAgaWYodD09RlBPSU5URVJ8fHQ9PUhQT0lOVEVSKSB7cC0+dnVsb25nPXZ1bG9uZztyZXR1cm47fQorfQordm9pZCBldmFsX2NvbnN0KHVuaW9uIGF0eXBzICpwLGludCB0KQorLyogIFdlaXN0IGJlc3RpbW10ZW4gZ2xvYmFsZW4gVmFyaWFibGVuIFdlcnQgZWluZXIgQ0VYUFIgenUuICAgICAgICovCit7CisgIGludCBmPXQmTlE7CisgIGlmKCFwKSBpZXJyb3IoMCk7CisgIGlmKGY9PU1BWElOVHx8KGY+PUJJVCYmZjw9TExPTkcpKXsKKyAgICBpZighKHQmVU5TSUdORUQpKXsKKyAgICAgIGlmKGY9PUJJVCl7CisJaWYoem1lcXRvKHpjMnptKHAtPnZjaGFyKSxsMnptKDBMKSkpIHZtYXg9bDJ6bSgwTCk7IGVsc2Ugdm1heD1sMnptKDFMKTsKKyAgICAgIH1lbHNlIGlmKGY9PUNIQVIpIHZtYXg9emMyem0ocC0+dmNoYXIpOworICAgICAgZWxzZSBpZihmPT1TSE9SVCl2bWF4PXpzMnptKHAtPnZzaG9ydCk7CisgICAgICBlbHNlIGlmKGY9PUlOVCkgIHZtYXg9emkyem0ocC0+dmludCk7CisgICAgICBlbHNlIGlmKGY9PUxPTkcpIHZtYXg9emwyem0ocC0+dmxvbmcpOworICAgICAgZWxzZSBpZihmPT1MTE9ORykgdm1heD16bGwyem0ocC0+dmxsb25nKTsKKyAgICAgIGVsc2UgaWYoZj09TUFYSU5UKSB2bWF4PXAtPnZtYXg7CisgICAgICBlbHNlIGllcnJvcigwKTsKKyAgICAgIHZ1bWF4PXptMnp1bSh2bWF4KTsKKyAgICAgIHZsZG91YmxlPXptMnpsZCh2bWF4KTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKGY9PUJJVCl7CisJaWYoenVtZXF0byh6dWMyenVtKHAtPnZ1Y2hhciksdWwyenVtKDBVTCkpKSB2dW1heD11bDJ6dW0oMFVMKTsgZWxzZSB2dW1heD11bDJ6dW0oMVVMKTsKKyAgICAgIH1lbHNlIGlmKGY9PUNIQVIpIHZ1bWF4PXp1YzJ6dW0ocC0+dnVjaGFyKTsKKyAgICAgIGVsc2UgaWYoZj09U0hPUlQpdnVtYXg9enVzMnp1bShwLT52dXNob3J0KTsKKyAgICAgIGVsc2UgaWYoZj09SU5UKSAgdnVtYXg9enVpMnp1bShwLT52dWludCk7CisgICAgICBlbHNlIGlmKGY9PUxPTkcpIHZ1bWF4PXp1bDJ6dW0ocC0+dnVsb25nKTsKKyAgICAgIGVsc2UgaWYoZj09TExPTkcpIHZ1bWF4PXp1bGwyenVtKHAtPnZ1bGxvbmcpOworICAgICAgZWxzZSBpZihmPT1NQVhJTlQpIHZ1bWF4PXAtPnZ1bWF4OworICAgICAgZWxzZSBpZXJyb3IoMCk7CisgICAgICB2bWF4PXp1bTJ6bSh2dW1heCk7CisgICAgICB2bGRvdWJsZT16dW0yemxkKHZ1bWF4KTsKKyAgICB9CisgIH1lbHNleworICAgIGlmKElTUE9JTlRFUihmKSl7CisgICAgICBpZihmPT1OUE9JTlRFUikKKwl2dW1heD16dWkyenVtKHAtPnZ1aW50KTsKKyAgICAgIGVsc2UKKwl2dW1heD16dWwyenVtKHAtPnZ1bG9uZyk7CisgICAgICB2bWF4PXp1bTJ6bSh2dW1heCk7dmxkb3VibGU9enVtMnpsZCh2dW1heCk7CisgICAgfWVsc2V7CisgICAgICBpZihmPT1GTE9BVCkgdmxkb3VibGU9emYyemxkKHAtPnZmbG9hdCk7CisgICAgICBlbHNlIGlmKGY9PURPVUJMRSkgdmxkb3VibGU9emQyemxkKHAtPnZkb3VibGUpOworICAgICAgZWxzZSB2bGRvdWJsZT1wLT52bGRvdWJsZTsKKyAgICAgIHZtYXg9emxkMnptKHZsZG91YmxlKTsKKyAgICAgIHZ1bWF4PXpsZDJ6dW0odmxkb3VibGUpOworICAgIH0KKyAgfQorICB2ZmxvYXQ9emxkMnpmKHZsZG91YmxlKTsKKyAgdmRvdWJsZT16bGQyemQodmxkb3VibGUpOworICB2dWNoYXI9enVtMnp1Yyh2dW1heCk7CisgIHZ1c2hvcnQ9enVtMnp1cyh2dW1heCk7CisgIHZ1aW50PXp1bTJ6dWkodnVtYXgpOworICB2dWxvbmc9enVtMnp1bCh2dW1heCk7CisgIHZ1bGxvbmc9enVtMnp1bGwodnVtYXgpOworICB2Y2hhcj16bTJ6Yyh2bWF4KTsKKyAgdnNob3J0PXptMnpzKHZtYXgpOworICB2aW50PXptMnppKHZtYXgpOworICB2bG9uZz16bTJ6bCh2bWF4KTsKKyAgdmxsb25nPXptMnpsbCh2bWF4KTsKK30KK3ZvaWQgcHJpbnR2YWwoRklMRSAqZix1bmlvbiBhdHlwcyAqcCxpbnQgdCkKKy8qICBHaWJ0IGF0eXBzIGF1cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgdCY9TlU7CisgIGlmKHQ9PUJJVCl7dm1heD16YzJ6bShwLT52Y2hhcik7ZnByaW50ZihmLCJCJWQiLCF6bWVxdG8odm1heCxsMnptKDBMKSkpO30KKyAgaWYodD09KFVOU0lHTkVEfEJJVCkpe3Z1bWF4PXp1YzJ6dW0ocC0+dnVjaGFyKTtmcHJpbnRmKGYsIlVCJWQiLCF6dW1lcXRvKHZtYXgsdWwyenVtKDBVTCkpKTt9CisgIGlmKHQ9PUNIQVIpe3ZtYXg9emMyem0ocC0+dmNoYXIpO3ByaW50em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxDSEFSKSl7ZnByaW50ZihmLCJVQyIpO3Z1bWF4PXp1YzJ6dW0ocC0+dnVjaGFyKTtwcmludHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PVNIT1JUKXtmcHJpbnRmKGYsIlMiKTt2bWF4PXpzMnptKHAtPnZzaG9ydCk7cHJpbnR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfFNIT1JUKSl7ZnByaW50ZihmLCJVUyIpO3Z1bWF4PXp1czJ6dW0ocC0+dnVzaG9ydCk7cHJpbnR6dW0oZix2dW1heCk7fQorICBpZih0PT1GTE9BVCl7ZnByaW50ZihmLCJGIik7dmxkb3VibGU9emYyemxkKHAtPnZmbG9hdCk7cHJpbnR6bGQoZix2bGRvdWJsZSk7fQorICBpZih0PT1ET1VCTEUpe2ZwcmludGYoZiwiRCIpO3ZsZG91YmxlPXpkMnpsZChwLT52ZG91YmxlKTtwcmludHpsZChmLHZsZG91YmxlKTt9CisgIGlmKHQ9PUxET1VCTEUpe2ZwcmludGYoZiwiTEQiKTtwcmludHpsZChmLHAtPnZsZG91YmxlKTt9CisgIGlmKHQ9PUlOVCl7ZnByaW50ZihmLCJJIik7dm1heD16aTJ6bShwLT52aW50KTtwcmludHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8SU5UKXx8dD09TlBPSU5URVIpe2ZwcmludGYoZiwiVUkiKTt2dW1heD16dWkyenVtKHAtPnZ1aW50KTtwcmludHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUxPTkcpe2ZwcmludGYoZiwiTCIpO3ZtYXg9emwyem0ocC0+dmxvbmcpO3ByaW50em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxMT05HKXx8dD09RlBPSU5URVJ8fHQ9PUhQT0lOVEVSKXtmcHJpbnRmKGYsIlVMIik7dnVtYXg9enVsMnp1bShwLT52dWxvbmcpO3ByaW50enVtKGYsdnVtYXgpO30KKyAgaWYodD09TExPTkcpe2ZwcmludGYoZiwiTEwiKTt2bWF4PXpsbDJ6bShwLT52bGxvbmcpO3ByaW50em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxMTE9ORykpe2ZwcmludGYoZiwiVUxMIik7dnVtYXg9enVsbDJ6dW0ocC0+dnVsbG9uZyk7cHJpbnR6dW0oZix2dW1heCk7fQorICBpZih0PT1NQVhJTlQpIHByaW50em0oZixwLT52bWF4KTsKKyAgaWYodD09KFVOU0lHTkVEfE1BWElOVCkpIHByaW50enVtKGYscC0+dnVtYXgpOworfSAKK3ZvaWQgZW1pdHZhbChGSUxFICpmLHVuaW9uIGF0eXBzICpwLGludCB0KQoreworICB0Jj1OVTsKKyAgaWYoKHQmTlEpPT1OUE9JTlRFUikgdD0oVU5TSUdORUR8SU5UKTsKKyAgaWYodD09QklUKXt2bWF4PXpjMnptKHAtPnZjaGFyKTtlbWl0KGYsIiVkIiwhem1lcXRvKHZtYXgsbDJ6bSgwTCkpKTt9CisgIGlmKHQ9PShVTlNJR05FRHxCSVQpKXt2dW1heD16dWMyenVtKHAtPnZ1Y2hhcik7ZW1pdChmLCIlZCIsIXp1bWVxdG8odm1heCx1bDJ6dW0oMFVMKSkpO30KKyAgaWYodD09Q0hBUil7dm1heD16YzJ6bShwLT52Y2hhcik7ZW1pdHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8Q0hBUikpe3Z1bWF4PXp1YzJ6dW0ocC0+dnVjaGFyKTtlbWl0enVtKGYsdnVtYXgpO30KKyAgaWYodD09U0hPUlQpe3ZtYXg9enMyem0ocC0+dnNob3J0KTtlbWl0em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxTSE9SVCkpe3Z1bWF4PXp1czJ6dW0ocC0+dnVzaG9ydCk7ZW1pdHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUZMT0FUKXt2bGRvdWJsZT16ZjJ6bGQocC0+dmZsb2F0KTtlbWl0emxkKGYsdmxkb3VibGUpO30KKyAgaWYodD09RE9VQkxFKXt2bGRvdWJsZT16ZDJ6bGQocC0+dmRvdWJsZSk7ZW1pdHpsZChmLHZsZG91YmxlKTt9CisgIGlmKHQ9PUxET1VCTEUpe2VtaXR6bGQoZixwLT52bGRvdWJsZSk7fQorICBpZih0PT1JTlQpe3ZtYXg9emkyem0ocC0+dmludCk7ZW1pdHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8SU5UKXx8dD09TlBPSU5URVIpe3Z1bWF4PXp1aTJ6dW0ocC0+dnVpbnQpO2VtaXR6dW0oZix2dW1heCk7fQorICBpZih0PT1MT05HKXt2bWF4PXpsMnptKHAtPnZsb25nKTtlbWl0em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxMT05HKXx8dD09RlBPSU5URVJ8fHQ9PUhQT0lOVEVSKXt2dW1heD16dWwyenVtKHAtPnZ1bG9uZyk7ZW1pdHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUxMT05HKXt2bWF4PXpsbDJ6bShwLT52bGxvbmcpO2VtaXR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfExMT05HKSl7dnVtYXg9enVsbDJ6dW0ocC0+dnVsbG9uZyk7ZW1pdHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PU1BWElOVCkgZW1pdHptKGYscC0+dm1heCk7CisgIGlmKHQ9PShVTlNJR05FRHxNQVhJTlQpKSBlbWl0enVtKGYscC0+dnVtYXgpOworfQorCit2b2lkIGNvbnZfdHlwKHN0cnVjdCBUeXAgKnApCisvKiBFcnpldWd0IGV4dGVuZGVkIHR5cGVzIGluIGVpbmVtIFR5cC4gKi8KK3sKKyAgY2hhciAqYXR0cjsKKyAgd2hpbGUocCl7CisgICAgaWYoSVNQT0lOVEVSKHAtPmZsYWdzKSl7CisgICAgICBwLT5mbGFncz0oKHAtPmZsYWdzJn5OVSl8UE9JTlRFUl9UWVBFKHAtPm5leHQpKTsKKyAgICAgIGlmKGF0dHI9cC0+bmV4dC0+YXR0cil7CisJaWYoc3Ryc3RyKGF0dHIsU1RSX05FQVIpKQorCSAgcC0+ZmxhZ3M9KChwLT5mbGFncyZ+TlUpfE5QT0lOVEVSKTsKKwlpZihzdHJzdHIoYXR0cixTVFJfRkFSKSkKKwkgIHAtPmZsYWdzPSgocC0+ZmxhZ3Mmfk5VKXxGUE9JTlRFUik7CisJaWYoc3Ryc3RyKGF0dHIsU1RSX0hVR0UpKQorCSAgcC0+ZmxhZ3M9KChwLT5mbGFncyZ+TlUpfEhQT0lOVEVSKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoSVNJTlQocC0+ZmxhZ3MpJiYoYXR0cj1wLT5hdHRyKSYmc3Ryc3RyKGF0dHIsImJpdCIpKQorICAgICAgcC0+ZmxhZ3M9KChwLT5mbGFncyZ+TlUpfEJJVCk7CisgICAgcD1wLT5uZXh0OworICB9Cit9CisKK3ZvaWQgaW5pdF9kYihGSUxFICpmKQoreworICBkd2FyZjJfc2V0dXAoc2l6ZXRhYltIUE9JTlRFUl0sIi5ieXRlIiwiLjJieXRlIiwiLjRieXRlIiwiLjRieXRlIixsYWJwcmVmaXgsaWRwcmVmaXgsIi5zZWN0aW9uIik7CisgIGR3YXJmMl9wcmludF9jb21wX3VuaXRfaGVhZGVyKGYpOworfQordm9pZCBjbGVhbnVwX2RiKEZJTEUgKmYpCit7CisgIGR3YXJmMl9jbGVhbnVwKGYpOworICBpZihmKSBzZWN0aW9uPS0xOworfSAKZGlmZiAtLWdpdCBhL21hY2hpbmVzL2hjMTIvbWFjaGluZS5kdCBiL21hY2hpbmVzL2hjMTIvbWFjaGluZS5kdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YzA5MGYxCi0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvaGMxMi9tYWNoaW5lLmR0CkBAIC0wLDAgKzEsMTYgQEAKK1M4QlMKK1M4QlUKK1MxNkJTQkUgUzE2QlNMRQorUzE2QlVCRSBTMTZCVUxFCitTMTZCU0JFIFMxNkJTTEUKK1MxNkJVQkUgUzE2QlVMRQorUzMyQlNCRSBTMzJCU0xFCitTMzJCVUJFIFMzMkJVTEUKK1M2NEJTQkUgUzY0QlNMRQorUzY0QlVCRSBTNjRCVUxFCitTMzJCSUVFRUJFCitTMzJCSUVFRUJFCitTMzJCSUVFRUJFCitTMTZCVWJFIFMxNkJVTEUKKworCmRpZmYgLS1naXQgYS9tYWNoaW5lcy9oYzEyL21hY2hpbmUuaCBiL21hY2hpbmVzL2hjMTIvbWFjaGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5NmU2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9oYzEyL21hY2hpbmUuaApAQCAtMCwwICsxLDE5MSBAQAorLyogIEV4YW1wbGUgb2YgYSBjb2RlLWdlbmVyYXRvciBmb3IgTW90b3JvbGEgNjhoYzEyIDE2Yml0IG1pY3JvY29udHJvbGxlcnMuKi8KKworI2luY2x1ZGUgImR0LmgiCisKKy8qIFdlIGhhdmUgZXh0ZW5kZWQgdHlwZXMhIFdoYXQgd2UgaGF2ZSB0byBkbyB0byBzdXBwb3J0IHRoZW06ICAgICAgKi8KKy8qIC0gI2RlZmluZSBIQVZFX0VYVF9UWVBFUworICAgLSAjdW5kZWYgYWxsIHN0YW5kYXJkIHR5cGVzCisgICAtICNkZWZpbmUgYWxsIHN0YW5kYXJkIHR5cGVzIHBsdXMgbmV3IHR5cGVzCisgICAtIHdyaXRlIGV2YWxfY29uc3QgYW5kIGluc2VydF9jb25zdAorICAgLSB3cml0ZSB0eXBlZGVmcyBmb3Igem1heCBhbmQgenVtYXgKKyAgIC0gd3JpdGUgdHlwbmFtZVtdCisgICAtIHdyaXRlIGNvbnZfdHlwKCkKKyAgIC0gb3B0aW9uYWxseSAjZGVmaW5lIElTUE9JTlRFUiwgSVNBUklUSCwgSVNJTlQgZXRjLgorICAgLSBvcHRpb25hbGx5ICNkZWZpbmUgSEFWRV9UR1RfUFJJTlRWQUwgYW5kIHdyaXRlIHByaW50dmFsCisgICAtIG9wdGlvbmFsbHkgI2RlZmluZSBQT0lOVEVSX1RZUEUKKyAgIC0gb3B0aW9uYWxseSAjZGVmaW5lIEhBVkVfVEdUX0ZBTElHTiBhbmQgd3JpdGUgZmFsaWduCisgICAtIG9wdGlvbmFsbHkgI2RlZmluZSBIQVZFX1RHVF9TWk9GIGFuZCB3cml0ZSBzem9mCisgICAtIG9wdGlvbmFsbHkgYWRkIGZ1bmN0aW9ucyBmb3IgYXR0cmlidXRlLWhhbmRsaW5nCisqLworI2RlZmluZSBIQVZFX0VYVF9UWVBFUyAxCisKKyNkZWZpbmUgSEFWRV9UR1RfUFJJTlRWQUwKKworI3VuZGVmIENIQVIKKyN1bmRlZiBTSE9SVAorI3VuZGVmIElOVAorI3VuZGVmIExPTkcKKyN1bmRlZiBMTE9ORworI3VuZGVmIEZMT0FUCisjdW5kZWYgRE9VQkxFCisjdW5kZWYgTERPVUJMRQorI3VuZGVmIFZPSUQKKyN1bmRlZiBQT0lOVEVSCisjdW5kZWYgQVJSQVkKKyN1bmRlZiBTVFJVQ1QKKyN1bmRlZiBVTklPTgorI3VuZGVmIEVOVU0KKyN1bmRlZiBGVU5LVAorI3VuZGVmIE1BWElOVAorI3VuZGVmIE1BWF9UWVBFCisKKyNkZWZpbmUgQklUIDEKKyNkZWZpbmUgQ0hBUiAyCisjZGVmaW5lIFNIT1JUIDMKKyNkZWZpbmUgSU5UIDQKKyNkZWZpbmUgTE9ORyA1CisjZGVmaW5lIExMT05HIDYKKyNkZWZpbmUgRkxPQVQgNworI2RlZmluZSBET1VCTEUgOAorI2RlZmluZSBMRE9VQkxFIDkKKyNkZWZpbmUgVk9JRCAxMAorI2RlZmluZSBOUE9JTlRFUiAxMQorI2RlZmluZSBGUE9JTlRFUiAxMgorI2RlZmluZSBIUE9JTlRFUiAxMworI2RlZmluZSBBUlJBWSAxNAorI2RlZmluZSBTVFJVQ1QgMTUKKyNkZWZpbmUgVU5JT04gMTYKKyNkZWZpbmUgRU5VTSAxNworI2RlZmluZSBGVU5LVCAxOAorCisjZGVmaW5lIE1BWElOVCAxOQorCisjZGVmaW5lIE1BWF9UWVBFIE1BWElOVAorCisjZGVmaW5lIFBPSU5URVJfVFlQRSh4KSBwb2ludGVyX3R5cGUoeCkKK2V4dGVybiBpbnQgcG9pbnRlcl90eXBlKCk7CisjZGVmaW5lIElTUE9JTlRFUih4KSAoKHgmTlEpPj1OUE9JTlRFUiYmKHgmTlEpPD1IUE9JTlRFUikKKyNkZWZpbmUgSVNTQ0FMQVIoeCkgKCh4Jk5RKT49QklUJiYoeCZOUSk8PUhQT0lOVEVSKQorI2RlZmluZSBJU0lOVCh4KSAoKHgmTlEpPj1CSVQmJih4Jk5RKTw9TExPTkcpCisjZGVmaW5lIFBUUkRJRkZfVCh4KSAoKHgpPT1IUE9JTlRFUj9MT05HOklOVCkKKwordHlwZWRlZiB6bGxvbmcgem1heDsKK3R5cGVkZWYgenVsbG9uZyB6dW1heDsKKwordW5pb24gYXR5cHN7CisgIHpjaGFyIHZjaGFyOworICB6dWNoYXIgdnVjaGFyOworICB6c2hvcnQgdnNob3J0OworICB6dXNob3J0IHZ1c2hvcnQ7CisgIHppbnQgdmludDsKKyAgenVpbnQgdnVpbnQ7CisgIHpsb25nIHZsb25nOworICB6dWxvbmcgdnVsb25nOworICB6bGxvbmcgdmxsb25nOworICB6dWxsb25nIHZ1bGxvbmc7CisgIHptYXggdm1heDsKKyAgenVtYXggdnVtYXg7CisgIHpmbG9hdCB2ZmxvYXQ7CisgIHpkb3VibGUgdmRvdWJsZTsKKyAgemxkb3VibGUgdmxkb3VibGU7Cit9OworCisvKiAgVGhpcyBzdHJ1Y3QgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IG1hY2hpbmUtc3BlY2lmaWMgICAgICAgICAgICovCisvKiAgYWRkcmVzc2luZy1tb2Rlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTm90IHVzZWQgaW4gdGhpcyBjb2RlLWdlbmVycmF0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdHJ1Y3QgQWRkcmVzc2luZ01vZGV7CisgICAgaW50IGZsYWdzOworICAgIGludCBiYXNlOworICAgIGxvbmcgb2Zmc2V0OworICAgIHN0cnVjdCBWYXIgKnY7Cit9OworCisvKiBUaGlzIHR5cGUgd2lsbCBiZSBhZGRlZCB0byBldmVyeSBJQy4gQ2FuIGJlIHVzZWQgYnkgdGhlIGNnLiAgICAgICovCisjZGVmaW5lIEhBVkVfRVhUX0lDIDEKK3N0cnVjdCBleHRfaWMgeworICBpbnQgZmxhZ3M7CisgIGludCByOworICBsb25nIG9mZnNldDsKK307CisKKy8qICBUaGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUuICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFYUiA2CisKKy8qICBOdW1iZXIgb2YgY29tbWFuZGxpbmUtb3B0aW9ucyB0aGUgY29kZS1nZW5lcmF0b3IgYWNjZXB0cy4gICAgICAgKi8KKyNkZWZpbmUgTUFYR0YgMjAKKworLyogIElmIHRoaXMgaXMgc2V0IHRvIHplcm8gdmJjYyB3aWxsIG5vdCBnZW5lcmF0ZSBJQ3Mgd2hlcmUgdGhlICAgICAqLworLyogIHRhcmdldCBvcGVyYW5kIGlzIHRoZSBzYW1lIGFzIHRoZSAybmQgc291cmNlIG9wZXJhbmQuICAgICAgICAgICAqLworLyogIFRoaXMgY2FuIHNvbWV0aW1lcyBzaW1wbGlmeSB0aGUgY29kZS1nZW5lcmF0b3IsIGJ1dCB1c3VhbGx5ICAgICAqLworLyogIHRoZSBjb2RlIGlzIGJldHRlciBpZiB0aGUgY29kZS1nZW5lcmF0b3IgYWxsb3dzIGl0LiAgICAgICAgICAgICAqLworI2RlZmluZSBVU0VRMkFTWiAxCisKKy8qICBUaGlzIHNwZWNpZmllcyB0aGUgc21hbGxlc3QgaW50ZWdlciB0eXBlIHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgKi8KKy8qICBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2V4dGVybiBpbnQgTUlOQURESTJQOworCisvKiAgSWYgdGhlIGJ5dGVzIG9mIGFuIGludGVnZXIgYXJlIG9yZGVyZWQgbW9zdCBzaWduaWZpY2FudCBieXRlICAgICovCisvKiAgYnl0ZSBmaXJzdCBhbmQgdGhlbiBkZWNyZWFzaW5nIHNldCBCSUdFTkRJQU4gdG8gMS4gICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR0VORElBTiAxCisKKy8qICBJZiB0aGUgYnl0ZXMgb2YgYW4gaW50ZWdlciBhcmUgb3JkZXJlZCBsZXN0IHNpZ25pZmljYW50IGJ5dGUgICAgKi8KKy8qICBieXRlIGZpcnN0IGFuZCB0aGVuIGluY3JlYXNpbmcgc2V0IExJVFRMRUVORElBTiB0byAxLiAgICAgICAgICAgKi8KKyNkZWZpbmUgTElUVExFRU5ESUFOIDAKKworLyogIE5vdGUgdGhhdCBCSUdFTkRJQU4gYW5kIExJVFRMRUVORElBTiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAgICAqLworCisvKiAgSWYgc3dpdGNoLXN0YXRlbWVudHMgc2hvdWxkIGJlIGdlbmVyYXRlZCBhcyBhIHNlcXVlbmNlIG9mICAgICAgICovCisvKiAgU1VCLFRTVCxCRVEgSUNzIHJhdGhlciB0aGFuIENPTVBBUkUsQkVRIElDcyBzZXQgdGhpcyB0byAxLiAgICAgICovCisvKiAgVGhpcyBjYW4geWllbGQgYmV0dGVyIGNvZGUgb24gc29tZSBtYWNoaW5lcy4gICAgICAgICAgICAgICAgICAgICovCitleHRlcm4gaW50IHN3aXRjaHN1YnM7CisjZGVmaW5lIFNXSVRDSFNVQlMgc3dpdGNoc3VicworCisvKiAgSW4gb3B0aW1pemluZyBjb21waWxhdGlvbiBjZXJ0YWluIGxpYnJhcnkgbWVtY3B5L3N0cmNweS1jYWxscyAgICovCisvKiAgd2l0aCBsZW5ndGgga25vd24gYXQgY29tcGlsZS10aW1lIHdpbGwgYmUgaW5saW5lZCB1c2luZyBhbiAgICAgICovCisvKiAgQVNTSUdOLUlDIGlmIHRoZSBzaXplIGlzIGxlc3Mgb3IgZXF1YWwgdG8gSU5MSU5FTUVNQ1BZLiAgICAgICAgICovCisvKiAgVGhlIHR5cGUgdXNlZCBmb3IgdGhlIEFTU0lHTi1JQyB3aWxsIGJlIFVOU0lHTkVEfENIQVIuICAgICAgICAgICovCisjZGVmaW5lIElOTElORU1FTUNQWSAxMDI0CisKKyNkZWZpbmUgSEFWRV9SRUdQQVJNUyAxCisKK3N0cnVjdCByZWdfaGFuZGxlIHsKKyAgaW50IGdwcjsKK307CisKKy8qICBXZSB1c2UgdW5zaWduZWQgaW50IGFzIHNpemVfdCByYXRoZXIgdGhhbiB1bnNpZ25lZCBsb25nIHdoaWNoICAgKi8KKy8qICBpcyB0aGUgZGVmYXVsdCBzZXR0aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9JTlRfU0laRVQgMQorCisvKiAgV2UgaGF2ZSByZWdpc3RlciBwYWlycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBVkVfUkVHUEFJUlMgMQorCisvKiAgV2Uga2VlcCB0cmFjayBvZiBhbGwgcmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IGEgZnVuY3Rpb24uICAgICAgICAgICovCisjZGVmaW5lIEhBVkVfUkVHU19NT0RJRklFRCAxCisKKyNkZWZpbmUgSEFWRV9UQVJHRVRfUkFMTE9DIDEKKyNkZWZpbmUgY29zdF9sb2FkX3JlZyhyLHYpIDQKKyNkZWZpbmUgY29zdF9zYXZlX3JlZyhyLHYpIDQKKyNkZWZpbmUgY29zdF9tb3ZlX3JlZyhpLGopIDIKKyNkZWZpbmUgY29zdF9wdXNocG9wX3JlZyhyKSAyCisKKy8qIHNpemUgb2YgYnVmZmVyIGZvciBhc20tb3V0cHV0ICovCisjZGVmaW5lIEVNSVRfQlVGX0xFTiAxMDI0IC8qIHNob3VsZCBiZSBlbm91Z2ggKi8KKy8qIG51bWJlciBvZiBhc20tb3V0cHV0IGxpbmVzIGJ1ZmZlcmVkICovCisjZGVmaW5lIEVNSVRfQlVGX0RFUFRIIDQKKworLyogIFdlIGhhdmUgYXNtX3BlZXBob2xlIHRvIG9wdGltaXplIGFzc2VtYmx5LW91dHB1dCAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9QRUVQSE9MRSAxCisKKy8qICBXZSBoYXZlIHNvbWUgdGFyZ2V0LXNwZWNpZmljIHZhcmlhYmxlIGF0dHJpYnV0ZXMuICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9UQVJHRVRfQVRUUklCVVRFUyAxCisKKy8qIFdlIHVzZSBidWlsdGluIGxpYmNhbGxzIGZvciBzb21lIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgSEFWRV9MSUJDQUxMUyAxCisKKy8qIFdlIHByZWZlciBCTkUgcmF0aGVyIHRoYW4gQkdULiAqLworI2RlZmluZSBIQVZFX1dBTlRCTkUgMQorCisjZGVmaW5lIEhBVkVfUE9GMk9QVCAxCisKKy8qIFVzZSBjaGFyIGZvciByZXR1cm4gb2YgY29tcGFyaXNvbiBsaWJjYWxscyAqLworI2RlZmluZSBMSUJDQUxMX0NNUFRZUEUgQ0hBUgpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvaTM4Ni9tYWNoaW5lLmMgYi9tYWNoaW5lcy9pMzg2L21hY2hpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OGM1NTNjCi0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvaTM4Ni9tYWNoaW5lLmMKQEAgLTAsMCArMSwyMDQ4IEBACisKKy8qICBDb2RlIGdlbmVyYXRvciBmb3IgSW50ZWwgODAzODYgb3IgaGlnaGVyLiAgICAgICAgICAgICAgICAgICAqLworCisjaW5jbHVkZSAic3VwcC5oIgorI2luY2x1ZGUgInZiYy5oIiAvKiBuaWNodCBzY2hvZW4sIGFiZXIgLi4uICovCisKK3N0YXRpYyBjaGFyIEZJTEVfW109X19GSUxFX187CisKKyNpbmNsdWRlICJkd2FyZjIuYyIKKworLyogIFB1YmxpYyBkYXRhIHRoYXQgTVVTVCBiZSB0aGVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIE5hbWUgYW5kIGNvcHlyaWdodC4gKi8KK2NoYXIgY2dfY29weXJpZ2h0W109InZiY2MgY29kZS1nZW5lcmF0b3IgZm9yIGkzODYgVjAuN2EgKGMpIGluIDE5OTYtMjAwNiBieSBWb2xrZXIgQmFydGhlbG1hbm4iOworCisvKiAgQ29tbWFuZGxpbmUtZmxhZ3MgdGhlIGNvZGUtZ2VuZXJhdG9yIGFjY2VwdHMgICAgICAgICAgICAgICAgKi8KK2ludCBnX2ZsYWdzW01BWEdGXT17VkFMRkxBRyxWQUxGTEFHLDAsMCwKKyAgICAgICAgICAgICAgICAgICAgMCwwLDAsMCwKKwkJICAgIDB9OworY2hhciAqZ19mbGFnc19uYW1lW01BWEdGXT17ImNwdSIsImZwdSIsIm5vLWRlbGF5ZWQtcG9wcGluZyIsImNvbnN0LWluLWRhdGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lcmdlLWNvbnN0YW50cyIsImVsZiIsImxvbmdhbGlnbiIsInNhZmUtZnAiLAorCQkJICAgInVzZS1mcmFtZXBvaW50ZXIifTsKK3VuaW9uIHBwaSBnX2ZsYWdzX3ZhbFtNQVhHRl07CisKKy8qIFR5cGVuYW1lcyAobmVlZGVkIGJlY2F1c2Ugb2YgSEFWRV9FWFRfVFlQRVMpLiAqLworY2hhciAqdHlwbmFtZVtdPXsic3RyYW5nZSIsImNoYXIiLCJzaG9ydCIsImJzaG9ydCIsImludCIsImJpbnQiLAorCQkgImxvbmciLCJibG9uZyIsImxvbmcgbG9uZyIsImJsb25nIGxvbmciLAorCQkgImZsb2F0IiwiYmZsb2F0IiwiZG91YmxlIiwiYmRvdWJsZSIsCisJCSAibG9uZyBkb3VibGUiLCJibG9uZyBkb3VibGUiLCJ2b2lkIiwKKyAgICAgICAgICAgICAgICAgInBvaW50ZXIiLCJicG9pbnRlciIsCisJCSAiYXJyYXkiLCJzdHJ1Y3QiLCJ1bmlvbiIsImVudW0iLCJmdW5jdGlvbiJ9OworCisvKiAgQWxpZ25tZW50LXJlcXVpcmVtZW50cyBmb3IgYWxsIHR5cGVzIGluIGJ5dGVzLiAgICAgICAgICAgICAgKi8KK3ptYXggYWxpZ25bTUFYX1RZUEUrMV07CisKKy8qICBBbGlnbm1lbnQgdGhhdCBpcyBzdWZmaWNpZW50IGZvciBldmVyeSBvYmplY3QuICAgICAgICAgICAgICAqLworem1heCBtYXhhbGlnbjsKKworLyogIENIQVJfQklUIG9mIHRoZSB0YXJnZXQgbWFjaGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IGNoYXJfYml0OworCisvKiAgU2l6ZXMgb2YgYWxsIGVsZW1lbnRhcnkgdHlwZXMgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggc2l6ZXRhYltNQVhfVFlQRSsxXTsKKworLyogIE1pbmltdW0gYW5kIE1heGltdW0gdmFsdWVzIGVhY2ggdHlwZSBjYW4gaGF2ZS4gICAgICAgICAgICAgICovCisvKiAgTXVzdCBiZSBpbml0aWFsaXplZCBpbiBpbml0X2NnKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggdF9taW5bTUFYX1RZUEUrMV07Cit6dW1heCB0X21heFtNQVhfVFlQRSsxXTsKK3p1bWF4IHR1X21heFtNQVhfVFlQRSsxXTsKKworLyogIE5hbWVzIG9mIGFsbCByZWdpc3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitjaGFyICpyZWduYW1lc1tNQVhSKzFdPXsibm9yZWciLCIlZWF4IiwiJWVjeCIsIiVlZHgiLCIlZWJ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVlc2kiLCIlZWRpIiwiJWVicCIsIiVlc3AiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXN0KDApIiwiJXN0KDEpIiwiJXN0KDIpIiwiJXN0KDMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzdCg0KSIsIiVzdCg1KSIsIiVzdCg2KSIsIiVzdCg3KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlZWF4LyVlZHgiLCIlZXNpLyVlZGkifTsKKworLyogIFRoZSBTaXplIG9mIGVhY2ggcmVnaXN0ZXIgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IHJlZ3NpemVbTUFYUisxXTsKKworLyogIFR5cGUgd2hpY2ggY2FuIHN0b3JlIGVhY2ggcmVnaXN0ZXIuICovCitzdHJ1Y3QgVHlwICpyZWd0eXBlW01BWFIrMV07CisKKy8qICByZWdzYVtyZWddIT0wIGlmIGEgY2VydGFpbiByZWdpc3RlciBpcyBhbGxvY2F0ZWQgYW5kIHNob3VsZCAqLworLyogIG5vdCBiZSB1c2VkIGJ5IHRoZSBjb21waWxlciBwYXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitpbnQgcmVnc2FbTUFYUisxXTsKKworLyogIFNwZWNpZmllcyB3aGljaCByZWdpc3RlcnMgbWF5IGJlIHNjcmF0Y2hlZCBieSBmdW5jdGlvbnMuICAgICovCitpbnQgcmVnc2NyYXRjaFtNQVhSKzFdPXswLDEsMSwxLDAsMCwwLDAsMCwxLDEsMSwxLDEsMSwxLDEsMSwwfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBTb21lIHByaXZhdGUgZGF0YSBhbmQgZnVuY3Rpb25zLiAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVVNFRlAgKGdfZmxhZ3NbOF0mVVNFREZMQUcpCisKK3N0YXRpYyBsb25nIG1hbGlnbltNQVhfVFlQRSsxXT0gIHsxLDEsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDEsMiwyLDEsMSwxLDIsMn07CitzdGF0aWMgbG9uZyBtc2l6ZXRhYltNQVhfVFlQRSsxXT17MCwxLDIsMiw0LDQsNCw0LDgsOCw0LDQsOCw4LDgsOCwwLDQsNCwwLDAsMCw0LDB9OworCisjZGVmaW5lIElTQkUoeCkgKCgoeCkmTlEpPT1CUE9JTlRFUnx8KCgoeCkmTlEpPj1CU0hPUlQmJigoeCkmTlEpPD1CTERPVUJMRSYmKCh4KSYxKSkpCisjZGVmaW5lIExFVFlQRSh4KSAoKHgpLTEpCisKK3N0cnVjdCBUeXAgbHR5cD17TE9OR30sbGRibD17RE9VQkxFfTsKKworI2RlZmluZSBEQVRBIDAKKyNkZWZpbmUgQlNTIDEKKyNkZWZpbmUgQ09ERSAyCisKK3N0YXRpYyBjaGFyICptYXJyYXlbXT17Il9fSTM4Nl9fIiwiX19YODZfXyIsCisJCSAgICAgICAiX19iaWdlbmRpYW49X19hdHRyKFwiYmlnZW5kaWFuXCIpIiwKKwkJICAgICAgICJfX2xpdHRsZWVuZGlhbj1fX2F0dHIoXCJsaXR0bGVlbmRpYW5cIikiLAorCQkgICAgICAgMH07CisKK3N0YXRpYyBpbnQgc2VjdGlvbj0tMSxuZXdvYmo7CitzdGF0aWMgY2hhciAqY29kZW5hbWU9Ilx0LnRleHRcbiIsKmRhdGFuYW1lPSJcdC5kYXRhXG4iLCpic3NuYW1lPSIiOworc3RhdGljIGNvbnN0IGludCBheD0xLGN4PTIsZHg9MyxieD00LHNpPTUsZGk9NixicD03LHNwPTgsYXhkeD0xNyxzaWRpPTE4Oworc3RhdGljIGNoYXIgeF90W109eyc/JywnYicsJ3cnLCd3JywnbCcsJ2wnLCdsJywnbCcsJz8nLCc/JywncycsJ3MnLCdsJywnbCcsJ2wnLCdsJywndicsJ2wnLCdsJywnYScsJ3MnLCd1JywnZScsJ2YnfTsKK3N0YXRpYyB2b2lkIHByKEZJTEUgKixzdHJ1Y3QgSUMgKik7CitzdGF0aWMgdm9pZCBmdW5jdGlvbl90b3AoRklMRSAqLHN0cnVjdCBWYXIgKixsb25nKTsKK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX2JvdHRvbShGSUxFICpmLHN0cnVjdCBWYXIgKixsb25nKTsKKworI2RlZmluZSBpc3JlZyh4KSAoKHAtPnguZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRykKKyNkZWZpbmUgaXNjb25zdCh4KSAoKHAtPnguZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpCisjZGVmaW5lIGlzdmFkZHIoeCkgKChwLT54LmZsYWdzJihWQVJBRFJ8RFJFRk9CSikpPT1WQVJBRFIpCisjZGVmaW5lIGlzdmNvbnN0KHgpIChpc2NvbnN0KHgpfHxpc3ZhZGRyKHgpKQorCitzdGF0aWMgbG9uZyBsb2ZmLHN0YWNrb2Zmc2V0LG5vdHBvcHBlZCxkb250cG9wLG1heHB1c2hlZCxzdGFjazsKKworc3RhdGljIGNoYXIgKmNjc1tdPXsieiIsIm56IiwibCIsImdlIiwibGUiLCJnIiwibXAifTsKK3N0YXRpYyBjaGFyICpjY3VbXT17InoiLCJueiIsImIiLCJhZSIsImJlIiwiYSIsIm1wIn07CitzdGF0aWMgY2hhciAqbG9naWNhbHNbXT17Im9yIiwieG9yIiwiYW5kIn07CitzdGF0aWMgY2hhciAqYXJpdGhtZXRpY3NbXT17InNhbCIsInNhciIsImFkZCIsInN1YiIsImltdWwiLCJkaXYiLCJtb2QifTsKK3N0YXRpYyBjaGFyICpmYXJpdGhtZXRpY3NbXT17ImY/IiwiZj8iLCJmYWRkIiwiZnN1YiIsImZtdWwiLCJmZGl2IiwiZnN1YnIiLCJmZGl2ciJ9Oworc3RhdGljIGNoYXIgKmRjdFtdPXsiIiwiYnl0ZSIsInNob3J0Iiwic2hvcnQiLCJsb25nIiwibG9uZyIsCisJCSAgICAibG9uZyIsImxvbmciLCJsb25nIiwibG9uZyIsImxvbmciLCJsb25nIiwibG9uZyIsImxvbmciLAorCQkgICAgImxvbmciLCJsb25nIiwibG9uZyIsImxvbmciLCJsb25nIiwibG9uZyJ9OworCitzdGF0aWMgaW50IHB1c2hlZHNpemUscHVzaG9yZGVyPTI7CitzdGF0aWMgaW50IGZzdFs4XTsKK3N0YXRpYyBpbnQgY3hsLGRpbCxzaWw7CitzdGF0aWMgY2hhciAqaWRwcmVmaXg9IiIsKmxhYnByZWZpeD0ibCI7CisKK3N0YXRpYyBzdHJ1Y3QgZnBjb25zdGxpc3QgeworICAgIHN0cnVjdCBmcGNvbnN0bGlzdCAqbmV4dDsKKyAgICBpbnQgbGFiZWwsdHlwOworICAgIHVuaW9uIGF0eXBzIHZhbDsKK30gKmZpcnN0ZnBjOworCitzdGF0aWMgaW50IGFkZGZwY29uc3Qoc3RydWN0IG9iaiAqbyxpbnQgdCkKK3sKKyAgc3RydWN0IGZwY29uc3RsaXN0ICpwPWZpcnN0ZnBjOworICB0Jj1OUTsKKyAgaWYoZ19mbGFnc1s0XSZVU0VERkxBRyl7CisgICAgZm9yKHA9Zmlyc3RmcGM7cDtwPXAtPm5leHQpeworICAgICAgaWYodD09cC0+dHlwKXsKKwlldmFsX2NvbnN0KCZwLT52YWwsdCk7CisJaWYodD09RkxPQVQmJnpsZGVxdG8odmxkb3VibGUsemYyemxkKG8tPnZhbC52ZmxvYXQpKSkgcmV0dXJuKHAtPmxhYmVsKTsKKwlpZih0PT1ET1VCTEUmJnpsZGVxdG8odmxkb3VibGUsemQyemxkKG8tPnZhbC52ZG91YmxlKSkpIHJldHVybihwLT5sYWJlbCk7CisJaWYodD09TERPVUJMRSYmemxkZXF0byh2bGRvdWJsZSxvLT52YWwudmxkb3VibGUpKSByZXR1cm4ocC0+bGFiZWwpOworICAgICAgfQorICAgIH0KKyAgfQorICBwPW15bWFsbG9jKHNpemVvZihzdHJ1Y3QgZnBjb25zdGxpc3QpKTsKKyAgcC0+bmV4dD1maXJzdGZwYzsKKyAgcC0+bGFiZWw9KytsYWJlbDsKKyAgcC0+dHlwPXQ7CisgIHAtPnZhbD1vLT52YWw7CisgIGZpcnN0ZnBjPXA7CisgIHJldHVybiBwLT5sYWJlbDsKK30KKy8qIHB1c2hlZCBvbiB0aGUgc3RhY2sgYnkgYSBjYWxsZWUsIG5vIHBvcCBuZWVkZWQgKi8KK3N0YXRpYyB2b2lkIGNhbGxlZV9wdXNoKGxvbmcgbCkKK3sKK30KK3N0YXRpYyB2b2lkIHB1c2gobG9uZyBsKQoreworICBzdGFja29mZnNldC09bDsKKyAgaWYoc3RhY2tvZmZzZXQ8bWF4cHVzaGVkKSBtYXhwdXNoZWQ9c3RhY2tvZmZzZXQ7Cit9CitzdGF0aWMgdm9pZCBwb3AobG9uZyBsKQoreworICBzdGFja29mZnNldCs9bDsKK30KKwordm9pZCB0aXRsZShGSUxFICpmKQoreworICBzdGF0aWMgaW50IGRvbmU7CisgIGV4dGVybiBjaGFyICppbm5hbWU7IC8qZ3JtcGYqLworICBpZighZG9uZSYmZil7CisgICAgZG9uZT0xOworICAgIGVtaXQoZiwiXHQuZmlsZVx0XCIlc1wiXG4iLGlubmFtZSk7CisgIH0KK30gCisKK3N0YXRpYyB2b2lkIGVtaXRfb2JqKEZJTEUgKmYsc3RydWN0IG9iaiAqcCxpbnQgdCkKKy8qICBHaWJ0IE9iamVrdCBhdWYgQmlsZHNjaGlybSBhdXMgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYoKHAtPmZsYWdzJihEUkVGT0JKfEtPTlNUKSk9PShEUkVGT0JKfEtPTlNUKSl7CisgICAgZW1pdHZhbChmLCZwLT52YWwscC0+ZHR5cCZOVSk7CisgICAgcmV0dXJuOworICB9CisgIGlmKChwLT5mbGFncyYoRFJFRk9CSnxSRUcpKT09KERSRUZPQkp8UkVHKSkgZW1pdChmLCIoIik7CisgIGlmKHAtPmZsYWdzJlZBUkFEUikgZW1pdChmLCIkIik7CisgIGlmKChwLT5mbGFncyZWQVIpJiYhKHAtPmZsYWdzJlJFRykpIHsKKyAgICBpZihwLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CisgICAgICBpZihVU0VGUHx8dmxhcyl7CisJaWYoIXptbGVxKGwyem0oMEwpLHAtPnYtPm9mZnNldCkpCisJICBlbWl0KGYsIiVsZCglcykiLChsb25nKSgtem0ybChwLT52LT5vZmZzZXQpK3ptMmwocC0+dmFsLnZtYXgpKSs0LHJlZ25hbWVzW2JwXSk7CisJZWxzZQorCSAgZW1pdChmLCIlbGQoJXMpIiwobG9uZykoem0ybChwLT52LT5vZmZzZXQpK3ptMmwocC0+dmFsLnZtYXgpKS1sb2ZmLXB1c2hlZHNpemUscmVnbmFtZXNbYnBdKTsKKyAgICAgIH1lbHNleworCWlmKCF6bWxlcShsMnptKDBMKSxwLT52LT5vZmZzZXQpKQorCSAgZW1pdChmLCIlbGQoJXMpIiwobG9uZykobG9mZi16bTJsKHAtPnYtPm9mZnNldCkrem0ybChwLT52YWwudm1heCkpLXN0YWNrb2Zmc2V0K3B1c2hlZHNpemUscmVnbmFtZXNbc3BdKTsKKwllbHNlCisJICBlbWl0KGYsIiVsZCglcykiLChsb25nKSh6bTJsKHAtPnYtPm9mZnNldCkrem0ybChwLT52YWwudm1heCktc3RhY2tvZmZzZXQpLHJlZ25hbWVzW3NwXSk7CisgICAgICB9CisgICAgfWVsc2V7CisgICAgICBpZighem1lcXRvKGwyem0oMEwpLHAtPnZhbC52bWF4KSl7ZW1pdHZhbChmLCZwLT52YWwsTE9ORyk7ZW1pdChmLCIrIik7fQorICAgICAgaWYocC0+di0+c3RvcmFnZV9jbGFzcz09U1RBVElDKXsKKyAgICAgICAgZW1pdChmLCIlcyVsZCIsbGFicHJlZml4LHptMmwocC0+di0+b2Zmc2V0KSk7CisgICAgICB9ZWxzZXsKKyAgICAgICAgZW1pdChmLCIlcyVzIixpZHByZWZpeCxwLT52LT5pZGVudGlmaWVyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYocC0+ZmxhZ3MmUkVHKXsKKyAgICBpZihwLT5yZWc+OCl7CisgICAgICBpbnQgaTsKKyAgICAgIGZvcihpPTA7aTw4O2krKyl7CisgICAgICAgIGlmKGZzdFtpXT09cC0+cmVnKQorICAgICAgICAgIGVtaXQoZiwiJXMiLHJlZ25hbWVzW2krOV0pOworICAgICAgfQorICAgIH1lbHNleworICAgICAgdCY9TlE7CisgICAgICBpZih0PT1DSEFSJiYhKHAtPmZsYWdzJkRSRUZPQkopKSBlbWl0KGYsIiUlJWNsIixyZWduYW1lc1twLT5yZWddWzJdKTsKKyAgICAgIGVsc2UgaWYodD09U0hPUlQmJiEocC0+ZmxhZ3MmRFJFRk9CSikpIGVtaXQoZiwiJSUlcyIscmVnbmFtZXNbcC0+cmVnXSsyKTsKKyAgICAgIGVsc2UgZW1pdChmLCIlcyIscmVnbmFtZXNbcC0+cmVnXSk7CisgICAgfQorICB9CisgIGlmKHAtPmZsYWdzJktPTlNUKXsKKyAgICBpZihJU0ZMT0FUKHQpKXsKKyAgICAgIGVtaXQoZiwiJXMlZCIsbGFicHJlZml4LGFkZGZwY29uc3QocCx0KSk7CisgICAgfWVsc2V7CisgICAgICBlbWl0KGYsIiQiKTtlbWl0dmFsKGYsJnAtPnZhbCx0Jk5VKTsKKyAgICB9CisgIH0KKyAgaWYoKHAtPmZsYWdzJihEUkVGT0JKfFJFRykpPT0oRFJFRk9CSnxSRUcpKSBlbWl0KGYsIikiKTsKK30KKworc3RhdGljIGNoYXIgKm1yZWduYW1lKGludCByLGludCB0KQoreworICBzdGF0aWMgY2hhciBzWzhdOworICB0Jj1OUTsKKyAgaWYodD09Q0hBUikgc3ByaW50ZihzLCIlJSVjbCIscmVnbmFtZXNbcl1bMl0pOworICBlbHNlIGlmKHQ9PVNIT1JUKSBzcHJpbnRmKHMsIiUlJXMiLHJlZ25hbWVzW3JdKzIpOworICBlbHNlIHNwcmludGYocywiJXMiLHJlZ25hbWVzW3JdKTsKKyAgcmV0dXJuIHM7Cit9CisKKworc3RhdGljIHZvaWQgZW1pdF9sd29yZChGSUxFICpmLHN0cnVjdCBvYmogKm8pCit7CisgIGlmKG8tPmZsYWdzJktPTlNUKXsKKyAgICBzdGF0aWMgc3RydWN0IG9iaiBjb2JqOworICAgIGNvYmouZmxhZ3M9S09OU1Q7CisgICAgZXZhbF9jb25zdCgmby0+dmFsLFVOU0lHTkVEfExMT05HKTsKKyAgICB2dW1heD16dW1hbmQodnVtYXgsdWwyenVtKDB4ZmZmZmZmZmYpKTsKKyAgICBjb2JqLnZhbC52dWxvbmc9enVtMnp1bCh2dW1heCk7CisgICAgZW1pdF9vYmooZiwmY29iaixVTlNJR05FRHxMT05HKTsKKyAgfWVsc2UgaWYoKG8tPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpeworICAgIGlmKCFyZWdfcGFpcihvLT5yZWcsJnJwKSkgaWVycm9yKDApOworICAgIGVtaXQoZiwiJXMiLHJlZ25hbWVzW3JwLnIxXSk7CisgIH1lbHNlCisgICAgZW1pdF9vYmooZixvLFVOU0lHTkVEfExPTkcpOworfQorCitzdGF0aWMgdm9pZCBlbWl0X2h3b3JkKEZJTEUgKmYsc3RydWN0IG9iaiAqbykKK3sKKyAgaWYoby0+ZmxhZ3MmS09OU1QpeworICAgIHN0YXRpYyBzdHJ1Y3Qgb2JqIGNvYmo7CisgICAgY29iai5mbGFncz1LT05TVDsKKyAgICBldmFsX2NvbnN0KCZvLT52YWwsVU5TSUdORUR8TExPTkcpOworICAgIHZ1bWF4PXp1bWFuZCh6dW1yc2hpZnQodnVtYXgsdWwyenVtKDMyVUwpKSx1bDJ6dW0oMHhmZmZmZmZmZikpOworICAgIGNvYmoudmFsLnZ1bG9uZz16dW0yenVsKHZ1bWF4KTsKKyAgICBlbWl0X29iaihmLCZjb2JqLFVOU0lHTkVEfExPTkcpOworICB9ZWxzZSBpZihvLT5mbGFncyZEUkVGT0JKKXsKKyAgICBpZighKG8tPmZsYWdzJlJFRykpIGllcnJvcigwKTsKKyAgICBlbWl0KGYsIjQoJXMpIixyZWduYW1lc1tvLT5yZWddKTsKKyAgfWVsc2UgaWYoby0+ZmxhZ3MmUkVHKXsKKyAgICBpZighcmVnX3BhaXIoby0+cmVnLCZycCkpIGllcnJvcigwKTsKKyAgICBlbWl0KGYsIiVzIixyZWduYW1lc1tycC5yMl0pOworICB9ZWxzZXsKKyAgICBvLT52YWwudm1heD16bWFkZChvLT52YWwudm1heCxsMnptKDRMKSk7CisgICAgZW1pdF9vYmooZixvLFVOU0lHTkVEfExPTkcpOworICAgIG8tPnZhbC52bWF4PXptc3ViKG8tPnZhbC52bWF4LGwyem0oNEwpKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBkd2FyZjJfcHJpbnRfZnJhbWVfbG9jYXRpb24oRklMRSAqZixzdHJ1Y3QgVmFyICp2KQoreworICAvKkZJWE1FOiBuZWVkcyBhIGxvY2F0aW9uIGxpc3QgYW5kIGNvcnJlY3QgcmVnaXN0ZXIgdHJhYnNsYXRpb24gKi8KKyAgc3RydWN0IG9iaiBvOworICBvLmZsYWdzPVJFRzsKKyAgaWYoVVNFRlB8fHZsYXMpCisgICAgby5yZWc9YnA7CisgIGVsc2UKKyAgICBvLnJlZz1zcDsKKyAgby52YWwudm1heD1sMnptKDBMKTsKKyAgby52PTA7CisgIGR3YXJmMl9wcmludF9sb2NhdGlvbihmLCZvKTsKK30KK3N0YXRpYyBpbnQgZHdhcmYyX3JlZ251bWJlcihpbnQgcikKK3sKKyAgc3RhdGljIGludCBkd2FyZl9yZWdzWzE3XT17LTEsMCwxLDIsMyw2LDcsNSw0LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzfTsKKyAgcmV0dXJuIGR3YXJmX3JlZ3Nbcl07Cit9CitzdGF0aWMgem1heCBkd2FyZjJfZmJvZmZzZXQoc3RydWN0IFZhciAqdikKK3sKKyAgaWYoIXZ8fCh2LT5zdG9yYWdlX2NsYXNzIT1BVVRPJiZ2LT5zdG9yYWdlX2NsYXNzIT1SRUdJU1RFUikpIGllcnJvcigwKTsKKyAgaWYoVVNFRlB8fHZsYXMpeworICAgIGlmKCF6bWxlcShsMnptKDBMKSx2LT5vZmZzZXQpKQorICAgICAgcmV0dXJuIGwyem0oKGxvbmcpKC16bTJsKHYtPm9mZnNldCkpKzQpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBsMnptKChsb25nKSh6bTJsKHYtPm9mZnNldCkpLWxvZmYtcHVzaGVkc2l6ZSk7CisgIH1lbHNleworICAgIGlmKCF6bWxlcShsMnptKDBMKSx2LT5vZmZzZXQpKQorICAgICAgcmV0dXJuIGwyem0oKGxvbmcpKGxvZmYtem0ybCh2LT5vZmZzZXQpKStwdXNoZWRzaXplKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gdi0+b2Zmc2V0OworICB9Cit9CitzdGF0aWMgdm9pZCBmeGNoKEZJTEUgKmYsaW50IGkpCit7CisgICAgaW50IG07CisgICAgZW1pdChmLCJcdGZ4Y2hcdCVzXG4iLHJlZ25hbWVzW2krOV0pOworICAgIG09ZnN0WzBdO2ZzdFswXT1mc3RbaV07ZnN0W2ldPW07Cit9CitzdGF0aWMgaW50IGZyZWVzdCh2b2lkKQoreworICAgIGludCBpOworICAgIGZvcihpPTA7aTw4O2krKyl7CisgICAgICAgIGlmKGZzdFtpXTwwKSByZXR1cm4gaTsKKyAgICB9CisgICAgZm9yKGk9MDtpPDg7aSsrKXsKKyAgICAgICAgaWYoZnN0W2ldPT0wKSByZXR1cm4gaTsKKyAgICB9CisgICAgaWVycm9yKDApOworfQorc3RhdGljIHZvaWQgZnB1c2goRklMRSAqZikKK3sKKyAgICBpbnQgaTsKKyAgICBpZihmc3RbN10+MCl7CisgICAgICAgIGk9ZnJlZXN0KCk7CisgICAgICAgIGlmKGZzdFtpXT09MCkgZW1pdChmLCJcdGZmcmVlXHQlc1xuIixyZWduYW1lc1tpKzldKTsKKyAgICAgICAgZnhjaChmLGkpO2Z4Y2goZiw3KTsKKyAgICB9CisgICAgZm9yKGk9NztpPjA7aS0tKQorICAgICAgICBmc3RbaV09ZnN0W2ktMV07CisgICAgZnN0WzBdPS0xOworfQorc3RhdGljIHZvaWQgZnBvcCh2b2lkKQoreworICAgIGludCBpOworLyogICAgaWYoZnN0WzBdPjAmJnJlZ3NbZnN0WzBdXSkgaWVycm9yKDApOyovCisgICAgZm9yKGk9MDtpPDc7aSsrKQorICAgICAgICBmc3RbaV09ZnN0W2krMV07CisgICAgZnN0WzddPS0xOworfQorc3RhdGljIHZvaWQgZmxvYWQoRklMRSAqZixzdHJ1Y3Qgb2JqICpvLGludCB0KQoreworICAgIGVtaXQoZiwiXHRmbGQiKTsKKyAgICBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRykgZW1pdChmLCJcdCIpOworICAgICAgICBlbHNlIGVtaXQoZiwiJWNcdCIseF90W3QmTlFdKTsKKyAgICBlbWl0X29iaihmLG8sdCk7ZW1pdChmLCJcbiIpOworICAgIGZwdXNoKGYpOworfQorc3RhdGljIHZvaWQgZnN0b3JlKEZJTEUgKmYsc3RydWN0IG9iaiAqbyxpbnQgdCkKK3sKKyAgICBpbnQgaTsKKyAgICBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgICAgIGZvcihpPTA7aTw4O2krKykKKyAgICAgICAgICAgIGlmKGZzdFtpXT09by0+cmVnKSBmc3RbaV09MDsKKyAgICAgICAgZnN0WzBdPW8tPnJlZzsKKyAgICB9ZWxzZXsKKyAgICAgICAgZW1pdChmLCJcdGZzdHAlY1x0Iix4X3RbdCZOUV0pO2VtaXRfb2JqKGYsbyx0KTsKKyAgICAgICAgZnBvcCgpO2VtaXQoZiwiXG4iKTsKKyAgICB9Cit9CitzdGF0aWMgdm9pZCBwcmZzdChGSUxFICpmLGNoYXIgKnMpCit7CisgICAgaW50IGk7CisgICAgaWYoREVCVUc9PTApIHJldHVybjsKKyAgICBlbWl0KGYsIiNcdCVzXHQiLHMpOworICAgIGZvcihpPTA7aTw4O2krKyl7CisgICAgICAgIGlmKGZzdFtpXT49MCl7CisgICAgICAgICAgICBpZihmc3RbaV09PTApIGVtaXQoZiwiKysrICIpOworICAgICAgICAgICAgICBlbHNlICAgICAgICBlbWl0KGYsIiVzICIscmVnbmFtZXNbZnN0W2ldXSszKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBlbWl0KGYsIi0tLSAiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbWl0KGYsIlxuIik7Cit9CitzdGF0aWMgdm9pZCBmaW5pdCh2b2lkKQoreworICAgIGludCBpOworICAgIGZvcihpPTA7aTw4O2krKyl7CisgICAgICAgIGlmKHJlZ3NbaSs5XSkKKyAgICAgICAgICAgIGZzdFtpXT1pKzk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZzdFtpXT0tMTsKKyAgICB9Cit9CitzdGF0aWMgdm9pZCBmb3JkZXIoRklMRSAqZikKK3sKKyAgICBpbnQgaSxtLHVub3JkZXJlZDsKKyAgICBwcmZzdChmLCJmb3JkZXIiKTsKKyAgICBmb3IoaT0wO2k8ODtpKyspeworICAgICAgICBpZihmc3RbaV09PTApe2VtaXQoZiwiXHRmZnJlZVx0JXNcbiIscmVnbmFtZXNbaSs5XSk7ZnN0W2ldPS0xO30KKyAgICB9CitvbG9vcDoKKyAgICB1bm9yZGVyZWQ9MDsKKyAgICBmb3IoaT0wO2k8ODtpKyspeworICAgICAgICBpZihmc3RbaV0+MCYmZnN0W2ldIT1pKzkmJnJlZ3NbZnN0W2ldXSl7dW5vcmRlcmVkPTE7YnJlYWs7fQorICAgIH0KKyAgICBpZighdW5vcmRlcmVkKSByZXR1cm47CisgICAgaWYoZnN0WzBdPj0wJiZyZWdzW2ZzdFswXV0peworICAgICAgICBpZihmc3RbMF0hPTkpeworICAgICAgICAgICAgZnhjaChmLGZzdFswXS05KTsKKyAgICAgICAgICAgIGdvdG8gb2xvb3A7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgZnhjaChmLGZyZWVzdCgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IoaT0xO2k8ODtpKyspeworICAgICAgICBpZihmc3RbaV0+PTAmJmZzdFtpXSE9aSs5JiZyZWdzW2ZzdFtpXV0mJmZzdFtpXSE9OSl7CisgICAgICAgICAgICBmeGNoKGYsaSk7CisgICAgICAgICAgICBnb3RvIG9sb29wOworICAgICAgICB9CisgICAgfQorICAgIGlmKHJlZ3NbOV0peworICAgICAgICBmb3IoaT0xO2k8ODtpKyspeworICAgICAgICAgICAgaWYoZnN0W2ldPT05KXsgZnhjaChmLGkpO3JldHVybjt9CisgICAgICAgIH0KKyAgICB9Cit9CitzdGF0aWMgdm9pZCBwcihGSUxFICpmLHN0cnVjdCBJQyAqcCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IoO3B1c2hvcmRlcj4yO3B1c2hvcmRlcj4+PTEpeworICAgICAgICBmb3IoaT0xO2k8PTg7aSsrKXsKKyAgICAgICAgICAgIGlmKHJlZ3NbaV0mcHVzaG9yZGVyKXsKKwkgICAgICBpZihwLT5jb2RlPT1QVVNIfHxwLT5jb2RlPT1DQUxMKXsKKwkJZW1pdChmLCJcdG1vdmxcdCVsZCglcyksJXNcbiIsbG9mZi00LXN0YWNrb2Zmc2V0LHJlZ25hbWVzW3NwXSxyZWduYW1lc1tpXSk7CisJICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgZW1pdChmLCJcdHBvcGxcdCVzXG4iLHJlZ25hbWVzW2ldKTsKKyAgICAgICAgICAgICAgICBwb3AoNCk7CisJICAgICAgfQorCSAgICAgIHJlZ3NbaV0mPX5wdXNob3JkZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yKGk9MTtpPD04O2krKykKKyAgICAgICAgaWYocmVnc1tpXSYyKSByZWdzW2ldJj1+MjsKK30KK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX3RvcChGSUxFICpmLHN0cnVjdCBWYXIgKnYsbG9uZyBvZmZzZXQpCisvKiAgZXJ6ZXVndCBGdW5rdGlvbnNrb3BmICAgICAgICAgICAgICAgICAgICAgICAqLworeworICAgIGludCBpOworICAgIGlmKHNlY3Rpb24hPUNPREUpe2VtaXQoZixjb2RlbmFtZSk7aWYoZikgc2VjdGlvbj1DT0RFO30KKyAgICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4peworICAgICAgaWYoKHYtPmZsYWdzJihJTkxJTkVGVU5DfElOTElORUVYVCkpIT1JTkxJTkVGVU5DKQorCWVtaXQoZiwiXHQuZ2xvYmxcdCVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgICBlbWl0KGYsIiVzJXM6XG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgIH1lbHNlCisgICAgICBlbWl0KGYsIiVzJWxkOlxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKyAgICBpZihVU0VGUHx8dmxhcykKKyAgICAgIGVtaXQoZiwiXHRwdXNobFx0JXNcblx0bW92bFx0JXMsJXNcbiIscmVnbmFtZXNbYnBdLHJlZ25hbWVzW3NwXSxyZWduYW1lc1ticF0pOworICAgIGZvcihwdXNoZWRzaXplPTAsaT0xO2k8c3A7aSsrKXsKKyAgICAgICAgaWYocmVndXNlZFtpXSYmIXJlZ3NjcmF0Y2hbaV0peworICAgICAgICAgICAgZW1pdChmLCJcdHB1c2hsXHQlc1xuIixyZWduYW1lc1tpXSk7CisgICAgICAgICAgICBwdXNoZWRzaXplKz00OworICAgICAgICB9CisgICAgfQorICAgIGlmKG9mZnNldCkgZW1pdChmLCJcdHN1YmxcdCQlbGQsJSVlc3BcbiIsb2Zmc2V0KTsKK30KK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX2JvdHRvbShGSUxFICpmLHN0cnVjdCBWYXIgKnYsbG9uZyBvZmZzZXQpCisvKiAgZXJ6ZXVndCBGdW5rdGlvbnNlbmRlICAgICAgICAgICAgICAgICAgICAgICAqLworeworICAgIGludCBpOworICAgIGZvcmRlcihmKTsKKyAgICBpZihvZmZzZXQpIGVtaXQoZiwiXHRhZGRsXHQkJWxkLCUlZXNwXG4iLG9mZnNldCk7CisgICAgZm9yKGk9c3AtMTtpPjA7aS0tKXsKKyAgICAgICAgaWYocmVndXNlZFtpXSYmIXJlZ3NjcmF0Y2hbaV0peworICAgICAgICAgICAgZW1pdChmLCJcdHBvcGxcdCVzXG4iLHJlZ25hbWVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZihVU0VGUHx8dmxhcykgZW1pdChmLCJcdHBvcGxcdCVzXG4iLHJlZ25hbWVzW2JwXSk7CisgICAgZW1pdChmLCJcdHJldFxuIik7CisgICAgaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKKyAgICAgIGVtaXQoZiwiXHQudHlwZVx0JXMlcyxAZnVuY3Rpb25cbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgICBlbWl0KGYsIlx0LnNpemVcdCVzJXMsLi0lcyVzXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgfWVsc2V7CisgICAgICBlbWl0KGYsIlx0LnR5cGVcdCVzJWxkLEBmdW5jdGlvblxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKyAgICAgIGVtaXQoZiwiXHQuc2l6ZVx0JXMlbGQsLi0lcyVsZFxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICAgIH0gICAgCit9CitzdGF0aWMgaW50IGNvbXBhcmVfb2JqZWN0cyhzdHJ1Y3Qgb2JqICpvMSxzdHJ1Y3Qgb2JqICpvMikKK3sKKyAgaWYobzEtPmZsYWdzPT1vMi0+ZmxhZ3MmJm8xLT5hbT09bzItPmFtKXsKKyAgICBpZighKG8xLT5mbGFncyZWQVIpfHwobzEtPnY9PW8yLT52JiZ6bWVxdG8obzEtPnZhbC52bWF4LG8yLT52YWwudm1heCkpKXsKKyAgICAgIGlmKCEobzEtPmZsYWdzJlJFRyl8fG8xLT5yZWc9PW8yLT5yZWcpeworCXJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgZ2V0X3JlZyhGSUxFICpmLHN0cnVjdCBJQyAqcCxpbnQgdHlwZSkKK3sKKyAgaW50IGk7CisgIC8qICBJZiB3ZSBjYW4gdXNlIGEgcmVnaXN0ZXIgd2hpY2ggd2FzIGFscmVhZHkgdXNlZCBieSB0aGUgY29tcGlsZXIgKi8KKyAgLyogIG9yIGl0IGlzIGEgc3JhdGNoIHJlZ2lzdGVyIHRoZW4gd2UgY2FuIHVzZSBpdCB3aXRob3V0IHByb2JsZW1zLiAqLworICBmb3IoaT0xO2k8PTg7aSsrKXsKKyAgICBpZighcmVnc1tpXSYmKHJlZ3VzZWRbaV18fHJlZ3NjcmF0Y2hbaV0pJiZyZWdvayhpLHR5cGUsMCkpeworICAgICAgcmVnc1tpXT0yOworICAgICAgQlNFVChyZWdzX21vZGlmaWVkLGkpOworICAgICAgcmV0dXJuKGkpOworICAgIH0KKyAgfQorICAvKiAgT3RoZXJ3aXNlIHdlIGhhdmUgdG8gc2F2ZSB0aGlzIHJlZ2lzdGVyLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBXZSBtYXkgbm90IHVzZSBhIHJlZ2lzdGVyIHdoaWNoIGlzIHVzZWQgaW4gdGhpcyBJQy4gICAgICAgICAgICAgKi8KKyAgZm9yKGk9MTtpPD04O2krKyl7CisgICAgaWYocmVnc1tpXTwyJiZyZWdvayhpLHR5cGUsMCkKKyAgICAgICAmJighKHAtPnExLmZsYWdzJlJFRyl8fHAtPnExLnJlZyE9aSkKKyAgICAgICAmJighKHAtPnEyLmZsYWdzJlJFRyl8fHAtPnEyLnJlZyE9aSkKKyAgICAgICAmJighKHAtPnouZmxhZ3MmUkVHKXx8cC0+ei5yZWchPWkpCisgICAgICAgJiYocC0+Y29kZSE9U0VUUkVUVVJOfHxwLT56LnJlZyE9aSkKKyAgICAgICAmJihwLT5jb2RlIT1HRVRSRVRVUk58fHAtPnExLnJlZyE9aSkgKXsKKyAgICAgIAorICAgICAgaWYocC0+Y29kZT09UFVTSHx8cC0+Y29kZT09Q0FMTCl7CisJZW1pdChmLCJcdG1vdmxcdCVzLCVsZCglcylcbiIscmVnbmFtZXNbaV0sbG9mZi00LXN0YWNrb2Zmc2V0LHJlZ25hbWVzW3NwXSk7CisgICAgICB9ZWxzZXsKKwllbWl0KGYsIlx0cHVzaGxcdCVzXG4iLHJlZ25hbWVzW2ldKTsKKwlwdXNoKDQpOworICAgICAgfQorICAgICAgLyogIE1hcmsgcmVnaXN0ZXIgYXMgcHVzaGVkICh0YWtpbmcgY2FyZSBvZiB0aGUgb3JkZXIpLiAqLworICAgICAgcHVzaG9yZGVyPDw9MTsgcmVnc1tpXXw9cHVzaG9yZGVyOworICAgICAgQlNFVChyZWdzX21vZGlmaWVkLGkpOworICAgICAgcmV0dXJuIGk7CisgICAgfQorICB9CisgIGllcnJvcigwKTsKK30KK3N0YXRpYyB2b2lkIG1vdmUoRklMRSAqZixzdHJ1Y3Qgb2JqICpxLGludCBxcixzdHJ1Y3Qgb2JqICp6LGludCB6cixpbnQgdCkKKy8qICBHZW5lcmF0ZXMgY29kZSB0byBtb3ZlIG9iamVjdCBxIChvciByZWdpc3RlciBxcikgaW50byBvYmplY3QgeiAob3IgICovCisvKiAgcmVnaXN0ZXIgenIpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICB0Jj1OUTsKKyAgaWYocSYmKHEtPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpIHFyPXEtPnJlZzsKKyAgaWYoeiYmKHotPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpIHpyPXotPnJlZzsKKyAgaWYoKHQmTlEpPT1MTE9ORyl7CisgICAgaWYocXImJnpyJiZxcj09enIpIHJldHVybjsKKyAgICBlbWl0KGYsIlx0bW92bFx0Iik7CisgICAgaWYocXIpeworICAgICAgaWYoIXJlZ19wYWlyKHFyLCZycCkpIGllcnJvcigwKTsKKyAgICAgIGVtaXQoZiwiJXMiLHJlZ25hbWVzW3JwLnIxXSk7CisgICAgfWVsc2UKKyAgICAgIGVtaXRfbHdvcmQoZixxKTsKKyAgICBlbWl0KGYsIiwiKTsKKyAgICBpZih6cil7CisgICAgICBpZighcmVnX3BhaXIoenIsJnJwKSkgaWVycm9yKDApOworICAgICAgZW1pdChmLCIlcyIscmVnbmFtZXNbcnAucjFdKTsKKyAgICB9ZWxzZQorICAgICAgZW1pdF9sd29yZChmLHopOworICAgIGVtaXQoZiwiXG4iKTsKKyAgICBlbWl0KGYsIlx0bW92bFx0Iik7CisgICAgaWYocXIpeworICAgICAgaWYoIXJlZ19wYWlyKHFyLCZycCkpIGllcnJvcigwKTsKKyAgICAgIGVtaXQoZiwiJXMiLHJlZ25hbWVzW3JwLnIyXSk7CisgICAgfWVsc2UKKyAgICAgIGVtaXRfaHdvcmQoZixxKTsKKyAgICBlbWl0KGYsIiwiKTsKKyAgICBpZih6cil7CisgICAgICBpZighcmVnX3BhaXIoenIsJnJwKSkgaWVycm9yKDApOworICAgICAgZW1pdChmLCIlcyIscmVnbmFtZXNbcnAucjJdKTsKKyAgICB9ZWxzZQorICAgICAgZW1pdF9od29yZChmLHopOworICAgIGVtaXQoZiwiXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYocXImJnpyKXsKKyAgICBpZihxciE9enIpCisgICAgICBlbWl0KGYsIlx0bW92bFx0JXMsJXNcbiIscmVnbmFtZXNbcXJdLHJlZ25hbWVzW3pyXSk7CisgICAgcmV0dXJuOworICB9CisgIGlmKHpyJiYocS0+ZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworICAgIGV2YWxfY29uc3QoJnEtPnZhbCx0KTsKKyAgICBpZih6bWVxdG8odm1heCxsMnptKDBMKSkmJnp1bWVxdG8odnVtYXgsdWwyenVtKDBVTCkpJiZ6bGRlcXRvKHZsZG91YmxlLGQyemxkKDAuMCkpKXsKKyAgICAgIGVtaXQoZiwiXHR4b3JsXHQlcywlc1xuIixyZWduYW1lc1t6cl0scmVnbmFtZXNbenJdKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgZW1pdChmLCJcdG1vdiVjXHQiLHhfdFt0Jk5RXSk7CisgIGlmKHFyKXsKKyAgICBlbWl0KGYsIiVzIixtcmVnbmFtZShxcix0KSk7CisgIH1lbHNlCisgICAgZW1pdF9vYmooZixxLHQpOworICBlbWl0KGYsIiwiKTsKKyAgaWYoenIpeworICAgIGVtaXQoZiwiJXMiLG1yZWduYW1lKHpyLHQpKTsKKyAgfWVsc2UKKyAgICBlbWl0X29iaihmLHosdCk7CisgIGVtaXQoZiwiXG4iKTsKK30KK3N0YXRpYyBsb25nIHBvZjIoenVtYXggeCkKKy8qICBZaWVsZHMgbG9nMih4KSsxIG9kZXIgMC4gKi8KK3sKKyAgICB6dW1heCBwO2ludCBsbj0xOworICAgIHA9dWwyenVtKDFVTCk7CisgICAgd2hpbGUobG48PTMyJiZ6dW1sZXEocCx4KSl7CisgICAgICAgIGlmKHp1bWVxdG8oeCxwKSkgcmV0dXJuIGxuOworICAgICAgICBsbisrO3A9enVtYWRkKHAscCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBFbmQgb2YgcHJpdmF0ZSBmYXRhIGFuZCBmdW5jdGlvbnMuICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW50IGluaXRfY2codm9pZCkKKy8qICBEb2VzIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbnMgZm9yIHRoZSBjb2RlLWdlbmVyYXRvci4gR2V0cyBjYWxsZWQgICovCisvKiAgb25jZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCBzaG91bGQgcmV0dXJuIDAgaW4gY2FzZSBvZiBwcm9ibGVtcy4gICAgICAqLworeworICBpbnQgaTsKKyAgLyogIEluaXRpYWxpemUgc29tZSB2YWx1ZXMgd2hpY2ggY2Fubm90IGJlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgICAqLworICAvKiAgYmVjYXVzZSB0aGV5IGFyZSBzdG9yZWQgaW4gdGhlIHRhcmdldCdzIGFyaXRobWV0aWMuICAgICAgICAgICAgICovCisgIG1heGFsaWduPWwyem0oNEwpOworICBjaGFyX2JpdD1sMnptKDhMKTsKKyAgaWYoZ19mbGFnc1s2XSZVU0VERkxBRyl7CisgICAgZm9yKGk9U0hPUlQ7aTw9TUFYX1RZUEU7aSsrKSBtYWxpZ25baV09NDsKKyAgfQorICBmb3IoaT0wO2k8PU1BWF9UWVBFO2krKyl7CisgICAgc2l6ZXRhYltpXT1sMnptKG1zaXpldGFiW2ldKTsKKyAgICBhbGlnbltpXT1sMnptKG1hbGlnbltpXSk7CisgIH0KKyAgZm9yKGk9MTtpPD0gODtpKyspIHtyZWdzaXplW2ldPWwyem0oNEwpO3JlZ3R5cGVbaV09Jmx0eXA7fQorICBmb3IoaT05O2k8PTE2O2krKykge3JlZ3NpemVbaV09bDJ6bSg4TCk7cmVndHlwZVtpXT0mbGRibDt9CisKKyAgLyogIEluaXRpYWxpemUgdGhlIG1pbi9tYXgtc2V0dGluZ3MuIE5vdGUgdGhhdCB0aGUgdHlwZXMgb2YgdGhlICAgICAqLworICAvKiAgaG9zdCBzeXN0ZW0gbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSB0YXJnZXQgc3lzdGVtIGFuZCB5b3UgbWF5ICovCisgIC8qICBvbmx5IHVzZSB0aGUgc21hbGxlc3QgbWF4aW11bSB2YWx1ZXMgQU5TSSBndWFyYW50ZWVzIGlmIHlvdSAgICAgKi8KKyAgLyogIHdhbnQgdG8gYmUgcG9ydGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgVGhhdCdzIHRoZSByZWFzb24gZm9yIHRoZSBzdWJ0cmFjdGlvbiBpbiB0X21pbltJTlRdLiBMb25nIGNvdWxkICovCisgIC8qICBiZSB1bmFibGUgdG8gcmVwcmVzZW50IC0yMTQ3NDgzNjQ4IG9uIHRoZSBob3N0IHN5c3RlbS4gICAgICAgICAgKi8KKyAgdF9taW5bQ0hBUl09bDJ6bSgtMTI4TCk7CisgIHRfbWluW1NIT1JUXT1sMnptKC0zMjc2OEwpOworICB0X21pbltJTlRdPXptc3ViKGwyem0oLTIxNDc0ODM2NDdMKSxsMnptKDFMKSk7CisgIHRfbWluW0xPTkddPXRfbWluKElOVCk7CisgIHRfbWluW0xMT05HXT16bWxzaGlmdChsMnptKDFMKSxsMnptKDYzTCkpOworICB0X21pbltNQVhJTlRdPXRfbWluKExMT05HKTsKKyAgdF9tYXhbQ0hBUl09dWwyenVtKDEyN0wpOworICB0X21heFtTSE9SVF09dWwyenVtKDMyNzY3VUwpOworICB0X21heFtJTlRdPXVsMnp1bSgyMTQ3NDgzNjQ3VUwpOworICB0X21heFtMT05HXT10X21heChJTlQpOworICB0X21heFtMTE9OR109enVtcnNoaWZ0KHp1bWtvbXBsKHVsMnp1bSgwVUwpKSx1bDJ6dW0oMVVMKSk7CisgIHRfbWF4W01BWElOVF09dF9tYXgoTExPTkcpOworICB0X21pbltCU0hPUlRdPWwyem0oLTMyNzY4TCk7CisgIHRfbWluW0JJTlRdPXptc3ViKGwyem0oLTIxNDc0ODM2NDdMKSxsMnptKDFMKSk7CisgIHRfbWluW0JMT05HXT10X21pbihJTlQpOworICB0X21pbltCTExPTkddPXptbHNoaWZ0KGwyem0oMUwpLGwyem0oNjNMKSk7CisgIHRfbWF4W0JTSE9SVF09dWwyenVtKDMyNzY3VUwpOworICB0X21heFtCSU5UXT11bDJ6dW0oMjE0NzQ4MzY0N1VMKTsKKyAgdF9tYXhbQkxPTkddPXRfbWF4KElOVCk7CisgIHRfbWF4W0JMTE9OR109enVtcnNoaWZ0KHp1bWtvbXBsKHVsMnp1bSgwVUwpKSx1bDJ6dW0oMVVMKSk7CisgIHR1X21heFtDSEFSXT11bDJ6dW0oMjU1VUwpOworICB0dV9tYXhbU0hPUlRdPXVsMnp1bSg2NTUzNVVMKTsKKyAgdHVfbWF4W0lOVF09dWwyenVtKDQyOTQ5NjcyOTVVTCk7CisgIHR1X21heFtMT05HXT10X21heChVTlNJR05FRHxJTlQpOworICB0dV9tYXhbTExPTkddPXp1bWtvbXBsKHVsMnp1bSgwVUwpKTsKKyAgdHVfbWF4W0JTSE9SVF09dWwyenVtKDY1NTM1VUwpOworICB0dV9tYXhbQklOVF09dWwyenVtKDQyOTQ5NjcyOTVVTCk7CisgIHR1X21heFtCTE9OR109dF9tYXgoVU5TSUdORUR8SU5UKTsKKyAgdHVfbWF4W0JMTE9OR109enVta29tcGwodWwyenVtKDBVTCkpOworICB0dV9tYXhbTUFYSU5UXT10X21heChVTlNJR05FRHxMTE9ORyk7CisKKyAgLyogIFJlc2VydmUgYSBmZXcgcmVnaXN0ZXJzIGZvciB1c2UgYnkgdGhlIGNvZGUtZ2VuZXJhdG9yLiAgICAgICovCisgIC8qICBXZSBvbmx5IHJlc2VydmUgdGhlIHN0YWNrLXBvaW50ZXIgaGVyZS4gICAgICAgICAgICAgICAgICAgICAqLworICByZWdzYVtzcF09MTsKKyAgaWYoVVNFRlApIHJlZ3NhW2JwXT1yZWdzY3JhdGNoW2JwXT0xOworICAvKiAgV2UgbmVlZCBhdCBsZWFzdCBvbmUgZnJlZSBzbG90IGluIHRoZSBmbGFvdGluZyBwb2ludCBzdGFjayAgKi8KKyAgcmVnc2FbMTZdPTE7cmVnc2NyYXRjaFsxNl09MDsKKyAgLyogIFVzZSBsJWQgYXMgbGFiZWxzIGFuZCBfJXMgYXMgaWRlbnRpZmllcnMgYnkgZGVmYXVsdC4gSWYgICAgICovCisgIC8qICAtZWxmIGlzIHNwZWNpZmllZCB3ZSB1c2UgLmwlZCBhbmQgJXMgaW5zdGVhZC4gICAgICAgICAgICAgICAqLworICBpZihnX2ZsYWdzWzVdJlVTRURGTEFHKSBsYWJwcmVmaXg9Ii5sIjsgZWxzZSBpZHByZWZpeD0iXyI7CisgIHRhcmdldF9tYWNyb3M9bWFycmF5OworCisgIGRlY2xhcmVfYnVpbHRpbigiX19tdWxsbCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19hZGRsbCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19zdWJsbCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19hbmRsbCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19vcmxsIixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2VvcmxsIixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX25lZ2xsIixMTE9ORyxMTE9ORywwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbm90bGwiLExMT05HLExMT05HLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19sc2xsbCIsTExPTkcsTExPTkcsMCxJTlQsMCwxLDApOworCisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZsbCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZ1bGwiLFVOU0lHTkVEfExMT05HLFVOU0lHTkVEfExMT05HLDAsVU5TSUdORUR8TExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbW9kbGwiLExMT05HLExMT05HLDAsTExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbW9kdWxsIixVTlNJR05FRHxMTE9ORyxVTlNJR05FRHxMTE9ORywwLFVOU0lHTkVEfExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2xzcmxsIixMTE9ORyxMTE9ORywwLElOVCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19sc3J1bGwiLFVOU0lHTkVEfExMT05HLFVOU0lHTkVEfExMT05HLDAsSU5ULDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2NtcGxsIixJTlQsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19jbXB1bGwiLElOVCxVTlNJR05FRHxMTE9ORywwLFVOU0lHTkVEfExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3NpbnQ2NHRvZmx0MzIiLEZMT0FULExMT05HLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX191aW50NjR0b2ZsdDMyIixGTE9BVCxVTlNJR05FRHxMTE9ORywwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDY0dG9mbHQ2NCIsRE9VQkxFLExMT05HLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX191aW50NjR0b2ZsdDY0IixET1VCTEUsVU5TSUdORUR8TExPTkcsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDMydG9zaW50NjQiLExMT05HLEZMT0FULDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvdWludDY0IixVTlNJR05FRHxMTE9ORyxGTE9BVCwwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b3NpbnQ2NCIsTExPTkcsRE9VQkxFLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQ2NHRvdWludDY0IixVTlNJR05FRHxMTE9ORyxET1VCTEUsMCwwLDAsMSwwKTsKKworICByZXR1cm4gMTsKK30KKworaW50IGZyZXR1cm4oc3RydWN0IFR5cCAqdCkKKy8qICBSZXR1cm5zIHRoZSByZWdpc3RlciBpbiB3aGljaCB2YXJpYWJsZXMgb2YgdHlwZSB0IGFyZSByZXR1cm5lZC4gKi8KKy8qICBJZiB0aGUgdmFsdWUgY2Fubm90IGJlIHJldHVybmVkIGluIGEgcmVnaXN0ZXIgcmV0dXJucyAwLiAgICAgICAgKi8KK3sKKyAgICBpZihJU0ZMT0FUKHQtPmZsYWdzKSkgcmV0dXJuIDk7CisgICAgaWYoKHQtPmZsYWdzJk5RKT09TExPTkcpIHJldHVybiBheGR4OworICAgIGlmKElTU0NBTEFSKHQtPmZsYWdzKSkgcmV0dXJuIGF4OworICAgIHJldHVybiAwOworfQorCitpbnQgcmVnX3BhaXIoaW50IHIsc3RydWN0IHJwYWlyICpwKQorLyogUmV0dXJucyAwIGlmIHRoZSByZWdpc3RlciBpcyBubyByZWdpc3RlciBwYWlyLiBJZiByICAqLworLyogaXMgYSByZWdpc3RlciBwYWlyIG5vbi16ZXJvIHdpbGwgYmUgcmV0dXJuZWQgYW5kIHRoZSAqLworLyogc3RydWN0dXJlIHBvaW50ZWQgdG8gcCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSB0d28gICAqLworLyogZWxlbWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpZihyPT1heGR4KXsKKyAgICBwLT5yMT1heDsKKyAgICBwLT5yMj1keDsKKyAgICByZXR1cm4gMTsKKyAgfWVsc2UgaWYocj09c2lkaSl7CisgICAgcC0+cjE9c2k7CisgICAgcC0+cjI9ZGk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCByZWdvayhpbnQgcixpbnQgdCxpbnQgbW9kZSkKKy8qICBSZXR1cm5zIDAgaWYgcmVnaXN0ZXIgciBjYW5ub3Qgc3RvcmUgdmFyaWFibGVzIG9mICAgKi8KKy8qICB0eXBlIHQuIElmIHQ9PVBPSU5URVIgYW5kIG1vZGUhPTAgdGhlbiBpdCByZXR1cm5zICAgKi8KKy8qICBub24temVybyBvbmx5IGlmIHRoZSByZWdpc3RlciBjYW4gc3RvcmUgYSBwb2ludGVyICAgKi8KKy8qICBhbmQgZGVyZWZlcmVuY2UgYSBwb2ludGVyIHRvIG1vZGUuICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgICBpZihyPT0wKSByZXR1cm4oMCk7CisgICAgdCY9TlE7CisgICAgaWYocj44JiZyPGF4ZHgpeworICAgICAgaWYoZ19mbGFnc1s3XSZVU0VERkxBRykgcmV0dXJuIDA7CisgICAgICBpZihJU0ZMT0FUKHQpKSByZXR1cm4gMTsKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZihyPT1heGR4fHxyPT1zaWRpKSAKKyAgICAgIHJldHVybiB0PT1MTE9ORzsKKyAgICBpZih0PT1DSEFSJiYocj09c2l8fHI9PWRpfHxyPT1icCkpIHJldHVybiAwOworICAgIGlmKHQ8PUJMT05HKSByZXR1cm4gMTsKKyAgICBpZihJU1BPSU5URVIodCkpIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCitpbnQgZGFuZ2Vyb3VzX0lDKHN0cnVjdCBJQyAqcCkKKy8qICBSZXR1cm5zIHplcm8gaWYgdGhlIElDIHAgY2FuIGJlIHNhZmVseSBleGVjdXRlZCAgICAgKi8KKy8qICB3aXRob3V0IGRhbmdlciBvZiBleGNlcHRpb25zIG9yIHNpbWlsYXIgdGhpbmdzLiAgICAgKi8KKy8qICB2YmNjIG1heSBnZW5lcmF0ZSBjb2RlIGluIHdoaWNoIG5vbi1kYW5nZXJvdXMgSUNzICAgKi8KKy8qICBhcmUgc29tZXRpbWVzIGV4ZWN1dGVkIGFsdGhvdWdoIGNvbnRyb2wtZmxvdyBtYXkgICAgKi8KKy8qICBuZXZlciByZWFjaCB0aGVtIChtYWlubHkgd2hlbiBtb3ZpbmcgY29tcHV0YXRpb25zICAgKi8KKy8qICBvdXQgb2YgbG9vcHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUeXBpY2FsIElDcyB0aGF0IGdlbmVyYXRlIGV4Y2VwdGlvbnMgb24gc29tZSAgICAgICAgKi8KKy8qICBtYWNoaW5lcyBhcmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBhY2Nlc3NlcyB2aWEgcG9pbnRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBkaXZpc2lvbi9tb2R1bG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBvdmVyZmxvdyBvbiBzaWduZWQgaW50ZWdlci9mbG9hdHMgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGM9cC0+Y29kZTsKKyAgaWYoKHAtPnExLmZsYWdzJkRSRUZPQkopfHwocC0+cTIuZmxhZ3MmRFJFRk9CSil8fChwLT56LmZsYWdzJkRSRUZPQkopKQorICAgIHJldHVybiAxOworICBpZigoYz09RElWfHxjPT1NT0QpJiYhaXNjb25zdChxMikpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitpbnQgbXVzdF9jb252ZXJ0KGludCBvLGludCB0LGludCBjb25zdF9leHByKQorLyogIFJldHVybnMgemVybyBpZiBjb2RlIGZvciBjb252ZXJ0aW5nIG5wIHRvIHR5cGUgdCAgICAqLworLyogIGNhbiBiZSBvbWl0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluIHRoaXMgZ2VuZXJpYyAzMmJpdCBSSVNDIGNwdSBwb2ludGVycyBhbmQgMzJiaXQgICAqLworLyogIGludGVnZXJzIGhhdmUgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gYW5kIGNhbiB1c2UgICAqLworLyogIHRoZSBzYW1lIHJlZ2lzdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgb3A9byZOUSx0cD10Jk5RLG9mLHRmOworICBvZj1JU0JFKG9wKTsKKyAgdGY9SVNCRSh0cCk7CisgIGlmKG9mIT10ZikgcmV0dXJuIDE7CisgIGlmKG9mKSBvcD1MRVRZUEUob3ApOworICBpZih0ZikgdHA9TEVUWVBFKHRwKTsKKyAgICAKKyAgaWYodHA9PVBPSU5URVImJm9wPT1QT0lOVEVSKSByZXR1cm4gMDsKKyAgaWYoKHQmVU5TSUdORUQpJiYobyZVTlNJR05FRCkmJnptZXF0byhzaXpldGFiW3RwXSxzaXpldGFiW29wXSkpIHJldHVybiAwOworICBpZigodHA9PUlOVCYmb3A9PUxPTkcpfHwodHA9PUxPTkcmJm9wPT1JTlQpKSByZXR1cm4gMDsKKyAgaWYob3A9PXRwKSByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIFJldHVybiBuYW1lIG9mIGxpYnJhcnkgZnVuY3Rpb24sIGlmIHRoaXMgbm9kZSBzaG91bGQgYmUKKyAgIGltcGxlbWVudGVkIHZpYSBsaWJjYWxsLiAqLworY2hhciAqdXNlX2xpYmNhbGwoaW50IGMsaW50IHQsaW50IHQyKQoreworICBzdGF0aWMgY2hhciBmbmFtZVsxNl07CisgIGNoYXIgKnJldD0wOworCisgIGlmKGM9PUNPTVBBUkUpeworICAgIGlmKCh0Jk5RKT09TExPTkcpeworICAgICAgc3ByaW50ZihmbmFtZSwiX19jbXAlc2xsIiwodCZVTlNJR05FRCk/InUiOiIiKTsKKyAgICAgIHJldD1mbmFtZTsKKyAgICB9CisgIH1lbHNleworICAgIHQmPU5VOworICAgIGlmKGM9PUNPTlZFUlQpeworICAgICAgaWYoSVNGTE9BVCh0KSYmKHQyJk5VKT09TExPTkcpeworCXNwcmludGYoZm5hbWUsIl9fJWNpbnQ2NHRvZmx0JWQiLCh0MiZVTlNJR05FRCk/J3UnOidzJywodD09RkxPQVQpPzMyOjY0KTsKKwlyZXQ9Zm5hbWU7CisgICAgICB9CisgICAgICBpZihJU0ZMT0FUKHQyKSYmKHQmTlUpPT1MTE9ORyl7CisJc3ByaW50ZihmbmFtZSwiX19mbHQlZHRvJWNpbnQ2NCIsKCh0MiZOVSk9PUZMT0FUKT8zMjo2NCwodCZVTlNJR05FRCk/J3UnOidzJyk7CisJcmV0PWZuYW1lOworICAgICAgfQorICAgIH0KKyAgICBpZigodCZOUSk9PUxMT05HKXsKKyAgICAgIGlmKChjPj1MU0hJRlQmJmM8PU1PRCl8fChjPj1PUiYmYzw9QU5EKXx8Yz09UE1VTFR8fChjPj1FUVVBTCYmYzw9R1JFQVRFUkVRKXx8Yz09S09NUExFTUVOVHx8Yz09TUlOVVMpeworCWlmKHQ9PShVTlNJR05FRHxMTE9ORykmJihjPT1ESVZ8fGM9PU1PRHx8Yz09UlNISUZUKSl7CisJICBzcHJpbnRmKGZuYW1lLCJfXyVzdWxsIixlbmFtZVtjXSk7CisJICByZXQ9Zm5hbWU7CisJfWVsc2UgaWYoKHQmTlEpPT1MTE9ORyl7CisJICBzcHJpbnRmKGZuYW1lLCJfXyVzbGwiLGVuYW1lW2NdKTsKKwkgIHJldD1mbmFtZTsKKwl9ZWxzZSBwcmludGYoInVuICVkXG4iLGMpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gcmV0OworfQorCit2b2lkIGdlbl9kcyhGSUxFICpmLHptYXggc2l6ZSxzdHJ1Y3QgVHlwICp0KQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSA8c2l6ZT4gYnl0ZXMgb2Ygc3RvcmFnZSAqLworLyogIGluaXRpYWxpemVkIHdpdGggemVyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICB0aXRsZShmKTsKKyAgaWYobmV3b2JqKSBlbWl0KGYsIiVsZFxuIix6bTJsKHNpemUpKTsKKyAgZWxzZSAgIGVtaXQoZiwiXHQuc3BhY2VcdCVsZFxuIix6bTJsKHNpemUpKTsKKyAgbmV3b2JqPTA7Cit9CisKK3ZvaWQgZ2VuX2FsaWduKEZJTEUgKmYsem1heCBhbGlnbikKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBtYWtlIHN1cmUgdGhlIG5leHQgZGF0YSBpcyAgICAgKi8KKy8qICBhbGlnbmVkIHRvIG11bHRpcGxlcyBvZiA8YWxpZ24+IGJ5dGVzLiAgICAgICAgICAgICAgKi8KK3sKKyAgdGl0bGUoZik7CisgIGlmKHptMmwoYWxpZ24pPjEpIGVtaXQoZiwiXHQuYWxpZ25cdDRcbiIpOworfQorCit2b2lkIGdlbl92YXJfaGVhZChGSUxFICpmLHN0cnVjdCBWYXIgKnYpCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIHRoZSBoZWFkIG9mIGEgdmFyaWFibGUgICovCisvKiAgZGVmaW5pdGlvbiwgaS5lLiB0aGUgbGFiZWwgYW5kIGluZm9ybWF0aW9uIGZvciAgICAgICovCisvKiAgbGlua2FnZSBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBjb25zdGZsYWc7CisgIHRpdGxlKGYpOworICBpZih2LT5jbGlzdCkgY29uc3RmbGFnPWlzX2NvbnN0KHYtPnZ0eXApOworICBpZih2LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpeworICAgIGlmKCh2LT52dHlwLT5mbGFncyZOUSk9PUZVTktUKSByZXR1cm47CisgICAgZW1pdChmLCJcdC50eXBlXHQlcyVsZCxAb2JqZWN0XG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICAgIGVtaXQoZiwiXHQuc2l6ZVx0JXMlbGQsJWxkXG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCksem0ybChzem9mKHYtPnZ0eXApKSk7CisgICAgaWYodi0+Y2xpc3QmJighY29uc3RmbGFnfHwoZ19mbGFnc1szXSZVU0VERkxBRykpJiZzZWN0aW9uIT1EQVRBKXtlbWl0KGYsZGF0YW5hbWUpO2lmKGYpIHNlY3Rpb249REFUQTt9CisgICAgaWYodi0+Y2xpc3QmJmNvbnN0ZmxhZyYmIShnX2ZsYWdzWzNdJlVTRURGTEFHKSYmc2VjdGlvbiE9Q09ERSl7ZW1pdChmLGNvZGVuYW1lKTtpZihmKSBzZWN0aW9uPUNPREU7fQorICAgIGlmKCF2LT5jbGlzdCYmc2VjdGlvbiE9QlNTKXtlbWl0KGYsYnNzbmFtZSk7aWYoZikgc2VjdGlvbj1CU1M7fQorICAgIGlmKHNlY3Rpb24hPUJTUykKKyAgICAgIGVtaXQoZiwiXHQuYWxpZ25cdDRcbiVzJWxkOlxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKyAgICBlbHNleworICAgICAgZW1pdChmLCJcdC5sY29tbVx0JXMlbGQsIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKyAgICAgIG5ld29iaj0xOworICAgIH0KKyAgfQorICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4peworICAgIGVtaXQoZiwiXHQuZ2xvYmxcdCVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgaWYodi0+ZmxhZ3MmKERFRklORUR8VEVOVEFUSVZFKSl7CisgICAgICBlbWl0KGYsIlx0LnR5cGVcdCVzJXMsQG9iamVjdFxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICAgIGVtaXQoZiwiXHQuc2l6ZVx0JXMlcywlbGRcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcix6bTJsKHN6b2Yodi0+dnR5cCkpKTsKKyAgICAgIGlmKHYtPmNsaXN0JiYoIWNvbnN0ZmxhZ3x8KGdfZmxhZ3NbM10mVVNFREZMQUcpKSYmc2VjdGlvbiE9REFUQSl7ZW1pdChmLGRhdGFuYW1lKTtpZihmKSBzZWN0aW9uPURBVEE7fQorICAgICAgaWYodi0+Y2xpc3QmJmNvbnN0ZmxhZyYmIShnX2ZsYWdzWzNdJlVTRURGTEFHKSYmc2VjdGlvbiE9Q09ERSl7ZW1pdChmLGNvZGVuYW1lKTtpZihmKSBzZWN0aW9uPUNPREU7fQorICAgICAgaWYoIXYtPmNsaXN0JiZzZWN0aW9uIT1CU1Mpe2VtaXQoZixic3NuYW1lKTtpZihmKSBzZWN0aW9uPUJTUzt9CisgICAgICBpZihzZWN0aW9uIT1CU1MpCisgICAgICAgIGVtaXQoZiwiXHQuYWxpZ25cdDRcbiVzJXM6XG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgICAgZWxzZXsKKyAgICAgICAgZW1pdChmLCJcdC5jb21tXHQlcyVzLCIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisJbmV3b2JqPTE7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgZ2VuX2RjKEZJTEUgKmYsaW50IHQsc3RydWN0IGNvbnN0X2xpc3QgKnApCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIHN0YXRpYyBzdG9yYWdlICAgICAgICAgICovCisvKiAgaW5pdGlhbGl6ZWQgd2l0aCBjb25zdC1saXN0IHAuICAgICAgICAgICAgICAgICAgICAgICovCit7CisgICAgdGl0bGUoZik7CisgICAgZW1pdChmLCJcdC4lc1x0IixkY3RbdCZOUV0pOworICAgIGlmKCFwLT50cmVlKXsKKyAgICAgICAgaWYoSVNGTE9BVCh0KSl7CisgICAgICAgIC8qICBhdWNoIHdpZWRlciBuaWNodCBzZWhyIHNjaG9lbiB1bmQgSUVFRSBub2V0aWcgICAqLworICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqaXA7CisgICAgICAgICAgICBpcD0odW5zaWduZWQgY2hhciAqKSZwLT52YWwudmRvdWJsZTsKKyAgICAgICAgICAgIGVtaXQoZiwiMHglMDJ4JTAyeCUwMnglMDJ4IixpcFszXSxpcFsyXSxpcFsxXSxpcFswXSk7CisgICAgICAgICAgICBpZigodCZOUSk9PURPVUJMRXx8KHQmTlEpPT1MRE9VQkxFKXsKKyAgICAgICAgICAgICAgICBlbWl0KGYsIiwweCUwMnglMDJ4JTAyeCUwMngiLGlwWzddLGlwWzZdLGlwWzVdLGlwWzRdKTsKKyAgICAgICAgICAgIH0KKwl9ZWxzZSBpZigodCZOUSk9PUxMT05HKXsKKwkgIHp1bWF4IHRtcDsKKwkgIGV2YWxfY29uc3QoJnAtPnZhbCx0KTsKKwkgIHRtcD12dW1heDsKKwkgIHZ1bWF4PXp1bWFuZCh2dW1heCx1bDJ6dW0oMHhmZmZmZmZmZikpOworCSAgZ3ZhbC52dWxvbmc9enVtMnp1bCh2dW1heCk7CisJICBlbWl0dmFsKGYsJmd2YWwsVU5TSUdORUR8TE9ORyk7CisJICBlbWl0KGYsIiwiKTsKKwkgIHZ1bWF4PXp1bWFuZCh6dW1yc2hpZnQodG1wLHVsMnp1bSgzMlVMKSksdWwyenVtKDB4ZmZmZmZmZmYpKTsKKwkgIGd2YWwudnVsb25nPXp1bTJ6dWwodnVtYXgpOworCSAgZW1pdHZhbChmLCZndmFsLFVOU0lHTkVEfExPTkcpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGVtaXR2YWwoZiwmcC0+dmFsLHQmTlUpOworICAgICAgICB9CisgICAgfWVsc2V7CisgICAgICAgIGludCBtPXAtPnRyZWUtPm8uZmxhZ3M7CisgICAgICAgIHAtPnRyZWUtPm8uZmxhZ3MmPX5WQVJBRFI7CisgICAgICAgIGVtaXRfb2JqKGYsJnAtPnRyZWUtPm8sdCZOVSk7CisgICAgICAgIHAtPnRyZWUtPm8uZmxhZ3M9bTsKKyAgICB9CisgICAgZW1pdChmLCJcbiIpO25ld29iaj0wOworfQorCisvKiAgVGhlIG1haW4gY29kZS1nZW5lcmF0aW9uIHJvdXRpbmUuICAgICAgICAgICAgICAgICAgICovCisvKiAgZiBpcyB0aGUgc3RyZWFtIHRoZSBjb2RlIHNob3VsZCBiZSB3cml0dGVuIHRvLiAgICAgICovCisvKiAgcCBpcyBhIHBvaW50ZXIgdG8gYSBkb3VibHkgbGlua2VkIGxpc3Qgb2YgSUNzICAgICAgICovCisvKiAgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gYm9keSB0byBnZW5lcmF0ZSBjb2RlIGZvci4gICovCisvKiAgdiBpcyBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb2Zmc2V0IGlzIHRoZSBzaXplIG9mIHRoZSBzdGFja2ZyYW1lIHRoZSBmdW5jdGlvbiAgICovCisvKiAgbmVlZHMgZm9yIGxvY2FsIHZhcmlhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCit2b2lkIGdlbl9jb2RlKEZJTEUgKmYsc3RydWN0IElDICpwLHN0cnVjdCBWYXIgKnYsem1heCBvZmZzZXQpCit7CisgICAgaW50IGMsdCxsYXN0Y29tcD0wLHJlZzsKKyAgICBzdHJ1Y3QgSUMgKm07CisgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJnZW5fY29kZSgpXG4iKTsKKyAgICBmb3IoYz0xO2M8PTE1O2MrKykgcmVnc1tjXT1yZWdzYVtjXTsKKyAgICByZWdzWzE2XT0wOworICAgIGZvcihjPTE7Yzw9TUFYUjtjKyspeworICAgICAgaWYocmVnc2FbY118fHJlZ3VzZWRbY10peworCUJTRVQocmVnc19tb2RpZmllZCxjKTsKKyAgICAgIH0KKyAgICB9CisgICAgdGl0bGUoZik7CisgICAgbG9mZj0oKHptMmwob2Zmc2V0KSszKS80KSo0OworICAgIGZvcihtPXA7bTttPW0tPm5leHQpeworICAgICAgLyogZG8gd2UgbmVlZCBhbm90aGVyIHN0YWNrLXNsb3Q/ICovCisgICAgICAvKiBjb3VsZCBkbyBhIG1vcmUgcHJlY2lzZSBjaGVjayAqLworICAgICAgaWYoKG0tPmNvZGU9PVBVU0gmJihtLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09RFJFRk9CSil8fAorCSAobS0+Y29kZT09Q0FMTCYmKG0tPnExLmZsYWdzJkRSRUZPQkopKXx8CisJIChtLT5jb2RlPT1DT05WRVJUJiYhSVNGTE9BVChtLT50eXBmKSYmSVNGTE9BVChtLT50eXBmMikpICl7CisJbG9mZis9NDsKKwlicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgZnVuY3Rpb25fdG9wKGYsdixsb2ZmKTsKKyAgICBzdGFja29mZnNldD1ub3Rwb3BwZWQ9ZG9udHBvcD0wOworICAgIGZpbml0KCk7CisgICAgZm9yKDtwO3ByKGYscCkscD1wLT5uZXh0KXsKKyAgICAgICAgYz1wLT5jb2RlO3Q9cC0+dHlwZjsKKwlpZihkZWJ1Z19pbmZvKQorCSAgZHdhcmYyX2xpbmVfaW5mbyhmLHApOworICAgICAgICBpZihjPT1OT1ApIGNvbnRpbnVlOworICAgICAgICBpZihjPT1TVUJQRlApIGM9U1VCOworICAgICAgICBpZihjPT1TVUJJRlApIGM9U1VCOworICAgICAgICBpZihjPT1BRERJMlApIGM9QUREOworICAgICAgICBpZihjPT1BTExPQ1JFRyl7CisgICAgICAgICAgICByZWdzW3AtPnExLnJlZ109MTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmKGM9PUZSRUVSRUcpeworICAgICAgICAgICAgaWYocC0+cTEucmVnPj05KXsKKyAgICAgICAgICAgICAgICBmb3IoYz0wO2M8ODtjKyspCisgICAgICAgICAgICAgICAgICAgIGlmKGZzdFtjXT09cC0+cTEucmVnKSBmc3RbY109MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlZ3NbcC0+cTEucmVnXT0wOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYobm90cG9wcGVkJiYhZG9udHBvcCl7CisJICBpZihjPT1MQUJFTHx8Yz09Q09NUEFSRXx8Yz09VEVTVHx8Yz09QlJBKXsKKwkgICAgZW1pdChmLCJcdGFkZGxcdCQlbGQsJSVlc3BcbiIsbm90cG9wcGVkKTsKKwkgICAgcG9wKG5vdHBvcHBlZCk7CisJICAgIG5vdHBvcHBlZD0wOworCSAgfQorICAgICAgICB9CisKKwlpZihjPT1DT01QQVJFJiZpc2NvbnN0KHEyKSYmKHQmTlEpIT1MTE9ORyl7CisJICBzdHJ1Y3QgY2FzZV90YWJsZSAqY3Q9Y2FsY19jYXNlX3RhYmxlKHAsSlVNUF9UQUJMRV9ERU5TSVRZKTsKKwkgIGlmKGN0JiZjdC0+bnVtPj1KVU1QX1RBQkxFX0xFTkdUSCl7CisJICAgIGludCByLGRlZmwsdGFibD0rK2xhYmVsOworCSAgICBsb25nIGw7dW5zaWduZWQgbG9uZyB1bDsKKwkgICAgLypGSVhNRTogd2UgZG8gbm90IGdlbmVyYXRlIGEganVtcC10YWJsZSBpZiB3ZSBkbyBub3QgaGF2ZSBhCisJICAgICAgZnJlZSByZWdpc3RlciAqLworCSAgICBmb3Iocj0xO3I8PTg7cisrKXsKKwkgICAgICBpZighcmVnc1tyXSYmcmVnc2NyYXRjaFtyXSkKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYocjw9OCl7CisJICAgICAgQlNFVChyZWdzX21vZGlmaWVkLHIpOworCSAgICAgIGlmKGN0LT5uZXh0X2ljLT5jb2RlPT1CUkEpCisJCWRlZmw9Y3QtPm5leHRfaWMtPnR5cGY7CisJICAgICAgZWxzZQorCQlkZWZsPSsrbGFiZWw7CisJICAgICAgaWYoKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1EUkVGT0JKKXsKKwkJcC0+cTEuZmxhZ3MmPX5EUkVGT0JKOworCQllbWl0KGYsIlx0bW92bFx0Iik7CisJCWVtaXRfb2JqKGYsJnAtPnExLFBPSU5URVIpOworCQllbWl0KGYsIiwlc1xuIixyZWduYW1lc1tyXSk7CisJCXAtPnExLmZsYWdzfD0oUkVHfERSRUZPQkopOworCQlwLT5xMS5yZWc9cjsKKwkgICAgICB9CisJICAgICAgZW1pdChmLCJcdG1vdmxcdCIpOworCSAgICAgIGVtaXRfb2JqKGYsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiLCVzXG4iLHJlZ25hbWVzW3JdKTsKKwkgICAgICBlbWl0KGYsIlx0c3VibFx0JCIpOworCSAgICAgIGlmKHQmVU5TSUdORUQpCisJCWVtaXR6dW0oZixjdC0+bWluLnZ1bWF4KTsKKwkgICAgICBlbHNlCisJCWVtaXR6bShmLGN0LT5taW4udm1heCk7CisJICAgICAgZW1pdChmLCIsJXNcbiIscmVnbmFtZXNbcl0pOworCSAgICAgIGVtaXQoZiwiXHRjbXBsXHQkIik7CisJICAgICAgZW1pdHp1bShmLGN0LT5kaWZmKTsKKwkgICAgICBlbWl0KGYsIiwlc1xuIixyZWduYW1lc1tyXSk7CisJICAgICAgZW1pdChmLCJcdGphXHQlcyVkXG4iLGxhYnByZWZpeCxkZWZsKTsKKwkgICAgICBlbWl0KGYsIlx0am1wXHQqJXMlZCgsJXMsNClcbiIsbGFicHJlZml4LHRhYmwscmVnbmFtZXNbcl0pOworCSAgICAgIGVtaXQoZiwiXHQuYWxpZ25cdDJcbiIpOworCSAgICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LHRhYmwpOworCSAgICAgIGVtaXRfanVtcF90YWJsZShmLGN0LCJcdC5sb25nXHQiLGxhYnByZWZpeCxkZWZsKTsKKwkgICAgICBpZihjdC0+bmV4dF9pYy0+Y29kZSE9QlJBKXsKKwkJZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsZGVmbCk7CisJCXA9Y3QtPm5leHRfaWMtPnByZXY7CisJICAgICAgfWVsc2UKKwkJcD1jdC0+bmV4dF9pYzsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgfQorCX0KKyAgICAgICAgaWYoYz09TEFCRUwpeworCSAgaWYodD5sYWJlbCkgaWVycm9yKDApOworCSAgZm9yZGVyKGYpOworCSAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsdCk7CisJICBjb250aW51ZTsKKwl9CisgICAgICAgIGlmKGM+PUJFUSYmYzw9QlJBKXsKKyAgICAgICAgICAgIGZvcmRlcihmKTsKKyAgICAgICAgICAgIGlmKGxhc3Rjb21wJlVOU0lHTkVEKSBlbWl0KGYsIlx0aiVzXHQlcyVkXG4iLGNjdVtjLUJFUV0sbGFicHJlZml4LHQpOworICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgIGVtaXQoZiwiXHRqJXNcdCVzJWRcbiIsY2NzW2MtQkVRXSxsYWJwcmVmaXgsdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZihjPT1NT1ZFVE9SRUcpeworICAgICAgICAgICAgaWYocC0+ei5yZWc+OCl7CisgICAgICAgICAgICAgICAgZm9yKGM9MDtjPDg7YysrKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoZnN0W2NdPT1wLT56LnJlZykgZnN0W2NdPTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZsb2FkKGYsJnAtPnExLERPVUJMRSk7CisgICAgICAgICAgICAgICAgZnN0WzBdPXAtPnoucmVnOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbW92ZShmLCZwLT5xMSwwLDAscC0+ei5yZWcsTE9ORyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZihjPT1NT1ZFRlJPTVJFRyl7CisgICAgICAgICAgICBpZihwLT5xMS5yZWc+OCl7CisgICAgICAgICAgICAgICAgaWYoZnN0WzBdIT1wLT5xMS5yZWcpeworICAgICAgICAgICAgICAgICAgICBmb3IoYz0wLHJlZz0tMTtjPDg7YysrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZzdFtjXT09cC0+cTEucmVnKSByZWc9YzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihyZWc8MCkgaWVycm9yKDApOworICAgICAgICAgICAgICAgICAgICBmeGNoKGYscmVnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZW1pdChmLCJcdGZzdHBsXHQiKTtlbWl0X29iaihmLCZwLT56LERPVUJMRSk7CisgICAgICAgICAgICAgICAgZW1pdChmLCJcbiIpO2Zwb3AoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1vdmUoZiwwLHAtPnExLnJlZywmcC0+eiwwLExPTkcpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYoKHAtPnExLmZsYWdzJihEUkVGT0JKfFJFR3xLT05TVCkpPT1EUkVGT0JKfHwoKHAtPnExLmZsYWdzJkRSRUZPQkopJiZJU0JFKHAtPnExLmR0eXApKSl7CisJICByZWc9Z2V0X3JlZyhmLHAsTE9ORyk7CisJICBtb3ZlKGYsJnAtPnExLDAsMCxyZWcsTE9ORyk7CisJICBwLT5xMS5mbGFnc3w9UkVHO3AtPnExLnJlZz1yZWc7CisJICBwLT5xMS5mbGFncyY9fktPTlNUOworCSAgaWYoSVNCRShwLT5xMS5kdHlwKSkKKwkgICAgZW1pdChmLCJcdGJzd2FwXHQlc1xuIixyZWduYW1lc1tyZWddKTsKKyAgICAgICAgfQorICAgICAgICBpZigocC0+cTIuZmxhZ3MmKERSRUZPQkp8UkVHfEtPTlNUKSk9PURSRUZPQkp8fCgocC0+cTIuZmxhZ3MmRFJFRk9CSikmJklTQkUocC0+cTIuZHR5cCkpKXsKKwkgIHJlZz1nZXRfcmVnKGYscCxMT05HKTsKKwkgIG1vdmUoZiwmcC0+cTIsMCwwLHJlZyxMT05HKTsKKwkgIHAtPnEyLmZsYWdzfD1SRUc7cC0+cTIucmVnPXJlZzsKKwkgIHAtPnEyLmZsYWdzJj1+S09OU1Q7CisJICBpZihJU0JFKHAtPnEyLmR0eXApKQorCSAgICBlbWl0KGYsIlx0YnN3YXBcdCVzXG4iLHJlZ25hbWVzW3JlZ10pOworICAgICAgICB9CisgICAgICAgIGlmKChwLT56LmZsYWdzJihEUkVGT0JKfFJFR3xLT05TVCkpPT1EUkVGT0JKfHwoKHAtPnouZmxhZ3MmRFJFRk9CSikmJklTQkUocC0+ei5kdHlwKSkpeworCSAgcmVnPWdldF9yZWcoZixwLExPTkcpOworCSAgLyogc2VociB1bnNjaG9lbiAqLworCSAgaWYoYz09R0VUUkVUVVJOJiZyZWc9PXAtPnExLnJlZykgcmVnPWdldF9yZWcoZixwLExPTkcpOworCSAgbW92ZShmLCZwLT56LDAsMCxyZWcsTE9ORyk7CisJICBwLT56LmZsYWdzfD1SRUc7cC0+ei5yZWc9cmVnOworCSAgcC0+ei5mbGFncyY9fktPTlNUOworCSAgaWYoSVNCRShwLT56LmR0eXApKQorCSAgICBlbWl0KGYsIlx0YnN3YXBcdCVzXG4iLHJlZ25hbWVzW3JlZ10pOworICAgICAgICB9CisJaWYoKHQmTlEpPT1MRE9VQkxFKSBwLT50eXBmPXQ9RE9VQkxFOworCWlmKGM9PUNPTlZFUlQmJih0Jk5RKT09TExPTkcmJihwLT50eXBmMiZOUSk9PUxMT05HKSBjPUFTU0lHTjsKKyAgICAgICAgaWYoYz09Q09OVkVSVCl7CisgICAgICAgICAgICBpbnQgdG89cC0+dHlwZjImTlU7CisJICAgIGlmKHRvPT1MRE9VQkxFKSB0bz1ET1VCTEU7CisgICAgICAgICAgICBpZigodCZOVSk9PUxPTkcpIHQ9SU5UOworICAgICAgICAgICAgaWYoKHQmTlUpPT0oVU5TSUdORUR8TE9ORyl8fCh0Jk5VKT09UE9JTlRFUikgdD0oVU5TSUdORUR8SU5UKTsKKyAgICAgICAgICAgIGlmKCh0byZOVSk9PUxPTkcpIHRvPUlOVDsKKyAgICAgICAgICAgIGlmKCh0byZOVSk9PShVTlNJR05FRHxMT05HKXx8KHRvJk5VKT09UE9JTlRFUikgdG89KFVOU0lHTkVEfElOVCk7CisJICAgIGlmKCh0byZOUSk9PUxMT05HKXsKKwkgICAgICBpbnQgdXNlcXJlZz0wOworCSAgICAgIGlmKGlzcmVnKHopKSAKKwkJcmVnPXAtPnoucmVnOworCSAgICAgIGVsc2UgaWYoaXNyZWcocTEpJiZyZWdfcGFpcihwLT5xMS5yZWcsJnJwKSYmcmVnb2socnAucjEsdCwwKSkKKwkJcmVnPXVzZXFyZWc9cnAucjE7CisJICAgICAgZWxzZQorCQlyZWc9Z2V0X3JlZyhmLHAsSU5UKTsKKwkgICAgICBpZighdXNlcXJlZyl7CisJCWVtaXQoZiwiXHRtb3ZsXHQiKTsKKwkJaWYoaXNyZWcocTEpKXsKKwkJICBpZighcmVnX3BhaXIocC0+cTEucmVnLCZycCkpIGllcnJvcigwKTsKKwkJICBlbWl0KGYsIiVzIixyZWduYW1lc1tycC5yMV0pOworCQl9ZWxzZXsKKwkJICBlbWl0X29iaihmLCZwLT5xMSxJTlQpOworCQl9CisJCWVtaXQoZiwiLCVzXG4iLHJlZ25hbWVzW3JlZ10pOworCSAgICAgIH0KKwkgICAgICBpZighaXNyZWcoeil8fHAtPnoucmVnIT1yZWcpCisJCW1vdmUoZiwwLHJlZywmcC0+eiwwLHQpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisgICAgICAgICAgICBpZigodG8mTlEpPD1JTlQmJih0Jk5RKTw9TExPTkcpeworCSAgICAgIGlmKGlzcmVnKHopKXsKKwkJcmVnPXAtPnoucmVnOworCQlpZihyZWdfcGFpcihyZWcsJnJwKSkgcmVnPXJwLnIxOworCSAgICAgIH1lbHNlIGlmKGlzcmVnKHExKSYmcmVnb2socC0+cTEucmVnLHQsMCkpCisJCXJlZz1wLT5xMS5yZWc7CisJICAgICAgZWxzZQorCQlyZWc9Z2V0X3JlZyhmLHAsKCh0byZOUSk9PUNIQVJ8fCh0Jk5RKT09Q0hBUik/Q0hBUjpMT05HKTsKKwkgICAgICBpZigodG8mTlEpPD1TSE9SVCl7CisJCWVtaXQoZiwiXHRtb3YlYyVjbFx0IiwodG8mVU5TSUdORUQpPyd6JzoncycseF90W3RvJk5RXSk7CisJCWVtaXRfb2JqKGYsJnAtPnExLHRvKTsKKwkJZW1pdChmLCIsJXNcbiIscmVnbmFtZXNbcmVnXSk7CisJICAgICAgfWVsc2V7CisJCW1vdmUoZiwmcC0+cTEsMCwwLHJlZyx0byk7CisJICAgICAgfQorCSAgICAgIGlmKCh0Jk5RKT09TExPTkcpeworCQlpZihpc3JlZyh6KSl7CisJCSAgaWYodG8mVU5TSUdORUQpCisJCSAgICBlbWl0KGYsIlx0eG9ybFx0JXMsJXNcbiIscmVnbmFtZXNbcnAucjJdLHJlZ25hbWVzW3JwLnIyXSk7CisJCSAgZWxzZXsKKwkJICAgIG1vdmUoZiwwLHJlZywwLHJwLnIyLElOVCk7CisJCSAgICBlbWl0KGYsIlx0c2FybFx0JDMxLCVzXG4iLHJlZ25hbWVzW3JwLnIyXSk7CisJCSAgfQorCQl9ZWxzZXsKKwkJICBtb3ZlKGYsMCxyZWcsJnAtPnosMCxJTlQpOworCQkgIGlmKHRvJlVOU0lHTkVEKXsKKwkJICAgIGVtaXQoZiwiXHRtb3ZsXHQkMCwiKTsKKwkJICAgIGVtaXRfaHdvcmQoZiwmcC0+eik7CisJCSAgICBlbWl0KGYsIlxuIik7CisJCSAgfWVsc2V7CisJCSAgICBlbWl0KGYsIlx0c2FybFx0JDMxLCVzXG4iLHJlZ25hbWVzW3JlZ10pOworCQkgICAgZW1pdChmLCJcdG1vdmxcdCVzLCIscmVnbmFtZXNbcmVnXSk7CisJCSAgICBlbWl0X2h3b3JkKGYsJnAtPnopOworCQkgICAgZW1pdChmLCJcbiIpOworCQkgIH0KKwkJfQorCSAgICAgIH1lbHNlCisJCW1vdmUoZiwwLHJlZywmcC0+eiwwLHQpOworCSAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoSVNGTE9BVCh0KSl7CisgICAgICAgICAgICAgICAgaWYoSVNGTE9BVCh0bykpeworICAgICAgICAgICAgICAgICAgICBpZihpc3JlZyhxMSkmJmZzdFswXT09cC0+cTEucmVnKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzcmVnKHopKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwLT56LnJlZz09ZnN0WzBdKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IocmVnPTAsYz03O2M+PTA7Yy0tKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZnN0W2NdPT1wLT56LnJlZyl7cmVnPWM7YnJlYWs7fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmc3RbY108MCkgcmVnPWM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzdFtyZWddPXAtPnoucmVnOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCJcdGZzdCVjXHQiLHhfdFt0Jk5RXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0X29iaihmLCZwLT56LHQpO2VtaXQoZiwiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZsb2FkKGYsJnAtPnExLHRvKTsKKyAgICAgICAgICAgICAgICAgICAgZnN0b3JlKGYsJnAtPnosdCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZigodG8mTlEpPD1TSE9SVCl7CisgICAgICAgICAgICAgICAgICAgIGlmKGlzcmVnKHExKSl7CisgICAgICAgICAgICAgICAgICAgICAgICByZWc9cC0+cTEucmVnOworICAgICAgICAgICAgICAgICAgICAgICAgaWYodG8mVU5TSUdORUQpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwiXHRhbmRsXHQkJWxkLCVzXG4iLCh0byZOUSk9PUNIQVI/MjU1TDo2NTUzNUwscmVnbmFtZXNbcmVnXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwiXHRjJWN0bFx0JXNcbiIseF90W3RvJk5RXSxyZWduYW1lc1tyZWddKTsqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCh0byZOUSk9PVNIT1JUKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCJcdG1vdnN3bFx0JSUlcywlc1xuIixyZWduYW1lc1tyZWddKzIscmVnbmFtZXNbcmVnXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwiXHRtb3ZzYmxcdCUlJWNsLCVzXG4iLHJlZ25hbWVzW3JlZ11bMl0scmVnbmFtZXNbcmVnXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZz1nZXRfcmVnKGYscCxMT05HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRvJlVOU0lHTkVEKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsIlx0bW92eiVjbFx0Iix4X3RbdG8mTlFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwiXHRtb3ZzJWNsXHQiLHhfdFt0byZOUV0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZW1pdF9vYmooZiwmcC0+cTEsdG8pO2VtaXQoZiwiLCVzXG4iLHJlZ25hbWVzW3JlZ10pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwiXHRwdXNobFx0JXNcbiIscmVnbmFtZXNbcmVnXSk7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwiXHRmaWxkbFx0KCVzKVxuXHRhZGRsXHQkNCwlc1xuIixyZWduYW1lc1tzcF0scmVnbmFtZXNbc3BdKTsKKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgaWYodG8mVU5TSUdORUQpeworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCJcdHB1c2hsXHQkMFxuXHRwdXNobFx0Iik7CisJCQlwdXNoKDQpOworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdF9vYmooZiwmcC0+cTEsdG8pOworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCJcblx0ZmlsZHFcdCglcylcblx0YWRkbFx0JDgsJXNcbiIscmVnbmFtZXNbc3BdLHJlZ25hbWVzW3NwXSk7CisJCQlwb3AoNCk7CisgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNyZWcocTEpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsIlx0cHVzaGxcdCVzXG5cdGZpbGRsXHQoJXMpXG5cdGFkZGxcdCQ0LCVzXG4iLHJlZ25hbWVzW3AtPnExLnJlZ10scmVnbmFtZXNbc3BdLHJlZ25hbWVzW3NwXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsIlx0ZmlsZGxcdCIpO2VtaXRfb2JqKGYsJnAtPnExLHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcHVzaChmKTsKKyAgICAgICAgICAgICAgICBmc3RvcmUoZiwmcC0+eix0KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKElTRkxPQVQodG8pKXsKKwkgICAgICBpbnQgY3dyOworCSAgICAgIGlmKGlzcmVnKHopJiZyZWdvayhwLT56LnJlZyxDSEFSLDApKQorCQljd3I9cC0+ei5yZWc7CisJICAgICAgZWxzZQorCQljd3I9Z2V0X3JlZyhmLHAsQ0hBUik7CisJICAgICAgZW1pdChmLCJcdGZuc3Rjd1x0JWQoJXMpXG4iLGxvZmYtNC1zdGFja29mZnNldCxyZWduYW1lc1tzcF0pOworCSAgICAgIGVtaXQoZiwiXHRtb3Z3XHQlZCglcyksJSUlc1xuIixsb2ZmLTQtc3RhY2tvZmZzZXQscmVnbmFtZXNbc3BdLHJlZ25hbWVzW2N3cl0rMik7CisJICAgICAgZW1pdChmLCJcdG1vdmJcdCQxMiwlJSVjaFxuIixyZWduYW1lc1tjd3JdWzJdKTsKKwkgICAgICBlbWl0KGYsIlx0bW92d1x0JSUlcywlZCglcylcbiIscmVnbmFtZXNbY3dyXSsyLGxvZmYtMi1zdGFja29mZnNldCxyZWduYW1lc1tzcF0pOworCSAgICAgIGVtaXQoZiwiXHRmbGRjd1x0JWQoJXMpXG4iLGxvZmYtMi1zdGFja29mZnNldCxyZWduYW1lc1tzcF0pOworCSAgICAgIGlmKGlzcmVnKHExKSYmZnN0WzBdPT1wLT5xMS5yZWcpeworCQlpZigodCZOUSk9PUNIQVIpeworCQkgIGlmKGlzcmVnKHopKSByZWc9cC0+ei5yZWc7IGVsc2UgcmVnPWdldF9yZWcoZixwLENIQVIpOworCQkgIGVtaXQoZiwiXHRzdWJsXHQkNCwlc1xuXHRmaXN0bFx0KCVzKVxuXHRtb3ZzYmxcdCglcyksJXNcblx0YWRkbFx0JDQsJXNcbiIscmVnbmFtZXNbc3BdLHJlZ25hbWVzW3NwXSxyZWduYW1lc1tzcF0scmVnbmFtZXNbcmVnXSxyZWduYW1lc1tzcF0pOworCQkgIG1vdmUoZiwwLHJlZywmcC0+eiwwLHQpOworCQl9ZWxzZXsKKwkJICBpZihpc3JlZyh6KSl7CisJCSAgICBlbWl0KGYsIlx0c3VibFx0JDQsJXNcblx0ZmlzdGxcdCglcylcblx0bW92JWNcdCglcyksIixyZWduYW1lc1tzcF0scmVnbmFtZXNbc3BdLHhfdFt0Jk5RXSxyZWduYW1lc1tzcF0pOworCQkgICAgcHVzaCg0KTsKKwkJICAgIGVtaXRfb2JqKGYsJnAtPnosdCk7ZW1pdChmLCJcblx0YWRkbFx0JDQsJXNcbiIscmVnbmFtZXNbc3BdKTsKKwkJICAgIHBvcCg0KTsKKwkJICB9ZWxzZXsKKwkJICAgIGVtaXQoZiwiXHRmaXN0JWNcdCIseF90W3QmTlFdKTsKKwkJICAgIGVtaXRfb2JqKGYsJnAtPnosdCk7ZW1pdChmLCJcbiIpOworCQkgIH0KKwkJfQorCSAgICAgIH1lbHNleworCQlmbG9hZChmLCZwLT5xMSx0byk7CisJCWlmKCh0Jk5RKT09Q0hBUil7CisJCSAgaWYoaXNyZWcoeikpIHJlZz1wLT56LnJlZzsgZWxzZSByZWc9Z2V0X3JlZyhmLHAsQ0hBUik7CisJCSAgZW1pdChmLCJcdHN1YmxcdCQ0LCVzXG5cdGZpc3RwbFx0KCVzKVxuXHRtb3ZzYmxcdCglcyksJXNcblx0YWRkbFx0JDQsJXNcbiIscmVnbmFtZXNbc3BdLHJlZ25hbWVzW3NwXSxyZWduYW1lc1tzcF0scmVnbmFtZXNbcmVnXSxyZWduYW1lc1tzcF0pOworCQkgIGZwb3AoKTsgbW92ZShmLDAscmVnLCZwLT56LDAsdCk7CisJCX1lbHNleworCQkgIGlmKGlzcmVnKHopKXsKKwkJICAgIGVtaXQoZiwiXHRzdWJsXHQkNCwlc1xuXHRmaXN0cGxcdCglcylcblx0bW92JWNcdCglcyksIixyZWduYW1lc1tzcF0scmVnbmFtZXNbc3BdLHhfdFt0Jk5RXSxyZWduYW1lc1tzcF0pOworCQkgICAgcHVzaCg0KTsKKwkJICAgIGVtaXRfb2JqKGYsJnAtPnosdCk7CisJCSAgICBlbWl0KGYsIlxuXHRhZGRsXHQkNCwlc1xuIixyZWduYW1lc1tzcF0pOworCQkgICAgcG9wKDQpOworCQkgICAgZnBvcCgpOworCQkgIH1lbHNleworCQkgICAgZW1pdChmLCJcdGZpc3RwJXNcdCIsKHQmTlEpPT1TSE9SVD8iIjoibCIpOworCQkgICAgZW1pdF9vYmooZiwmcC0+eix0KTtlbWl0KGYsIlxuIik7ZnBvcCgpOworCQkgIH0KKwkJfQorCSAgICAgIH0KKwkgICAgICBlbWl0KGYsIlx0ZmxkY3dcdCVkKCVzKVxuIixsb2ZmLTQtc3RhY2tvZmZzZXQscmVnbmFtZXNbc3BdKTsKKwkgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KK3ByaWMyKHN0ZG91dCxwKTsKKyAgICAgICAgICAgIGllcnJvcigwKTsKKyAgICAgICAgfQorICAgICAgICBpZihjPT1NSU5VU3x8Yz09S09NUExFTUVOVCl7CisgICAgICAgICAgICBjaGFyICpzOworICAgICAgICAgICAgaWYoSVNGTE9BVCh0KSl7CisgICAgICAgICAgICAgICAgaWYoaXNyZWcoeikmJnAtPnoucmVnPT05JiZpc3JlZyhxMSkmJnAtPnExLnJlZz09OSl7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwiXHRmY2hzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZsb2FkKGYsJnAtPnExLHQpOworICAgICAgICAgICAgICAgIGVtaXQoZiwiXHRmY2hzXG4iKTsKKyAgICAgICAgICAgICAgICBlbWl0KGYsIlx0ZnN0cCVjXHQiLHhfdFt0Jk5RXSk7CisgICAgICAgICAgICAgICAgZW1pdF9vYmooZiwmcC0+eix0KTtlbWl0KGYsIlxuIik7CisgICAgICAgICAgICAgICAgZnBvcCgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoYz09TUlOVVMpIHM9Im5lZyI7IGVsc2Ugcz0ibm90IjsKKyAgICAgICAgICAgIGlmKGNvbXBhcmVfb2JqZWN0cygmcC0+cTEsJnAtPnEyKSl7CisgICAgICAgICAgICAgICAgZW1pdChmLCJcdCVzJWNcdCIscyx4X3RbdCZOUV0pOworICAgICAgICAgICAgICAgIGVtaXRfb2JqKGYsJnAtPnosdCk7ZW1pdChmLCJcbiIpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoaXNyZWcoeikpIHJlZz1wLT56LnJlZzsgZWxzZSByZWc9Z2V0X3JlZyhmLHAsdCk7CisgICAgICAgICAgICBtb3ZlKGYsJnAtPnExLDAsMCxyZWcsdCk7CisgICAgICAgICAgICBlbWl0KGYsIlx0JXMlY1x0JXNcbiIscyx4X3RbdCZOUV0scmVnbmFtZXNbcmVnXSk7CisgICAgICAgICAgICBtb3ZlKGYsMCxyZWcsJnAtPnosMCx0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmKGM9PVNFVFJFVFVSTil7CisgICAgICAgICAgICBpZihwLT56LnJlZyl7CisgICAgICAgICAgICAgICAgaWYocC0+ei5yZWc9PTkpeworICAgICAgICAgICAgICAgICAgICBpZighaXNyZWcocTEpfHxmc3RbMF0hPXAtPnExLnJlZykKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2FkKGYsJnAtPnExLHQpOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBtb3ZlKGYsJnAtPnExLDAsMCxwLT56LnJlZyx0KTsKKyAgICAgICAgICAgICAgICB9CisJCUJTRVQocmVnc19tb2RpZmllZCxwLT56LnJlZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZihjPT1HRVRSRVRVUk4peworICAgICAgICAgICAgaWYocC0+cTEucmVnKXsKKyAgICAgICAgICAgICAgICBpZihwLT5xMS5yZWc9PTkpeworICAgICAgICAgICAgICAgICAgICBpZighaXNyZWcoeil8fGZzdFswXSE9cC0+ei5yZWcpCisgICAgICAgICAgICAgICAgICAgICAgICBmc3RvcmUoZiwmcC0+eix0KTsKKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgbW92ZShmLDAscC0+cTEucmVnLCZwLT56LDAsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYoYz09Q0FMTCl7CisgICAgICAgICAgICBpbnQgcmVnOworICAgICAgICAgICAgaWYoKHAtPnExLmZsYWdzJlZBUikmJnAtPnExLnYtPmZpJiZwLT5xMS52LT5maS0+aW5saW5lX2FzbSl7CisgICAgICAgICAgICAgIGVtaXRfaW5saW5lX2FzbShmLHAtPnExLnYtPmZpLT5pbmxpbmVfYXNtKTsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICBpZihwLT5xMS5mbGFncyZEUkVGT0JKKXsKKyAgICAgICAgICAgICAgICBpZighKHAtPnExLmZsYWdzJlJFRykpIGllcnJvcigwKTsKKyAgICAgICAgICAgICAgICBlbWl0KGYsIlx0Y2FsbFx0KiVzXG4iLHJlZ25hbWVzW3AtPnExLnJlZ10pOworICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBlbWl0KGYsIlx0Y2FsbFx0Iik7ZW1pdF9vYmooZiwmcC0+cTEsdCk7CisgICAgICAgICAgICAgICAgZW1pdChmLCJcbiIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZighem1lcXRvKGwyem0oMEwpLHAtPnEyLnZhbC52bWF4KSl7CisgICAgICAgICAgICAgIG5vdHBvcHBlZCs9em0ybChwLT5xMi52YWwudm1heCk7CisgICAgICAgICAgICAgIGRvbnRwb3AtPXptMmwocC0+cTIudmFsLnZtYXgpOworICAgICAgICAgICAgICBpZighKGdfZmxhZ3NbMl0mVVNFREZMQUcpJiYhdmxhcyYmc3RhY2tvZmZzZXQ9PS1ub3Rwb3BwZWQpeworICAgICAgICAgICAgICAgIC8qICBFbnRmZXJuZW4gZGVyIFBhcmFtZXRlciB2ZXJ6b2VnZXJuICAqLworICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBlbWl0KGYsIlx0YWRkbFx0JCVsZCwlJWVzcFxuIix6bTJsKHAtPnEyLnZhbC52bWF4KSk7CisgICAgICAgICAgICAgICAgcG9wKHptMmwocC0+cTIudmFsLnZtYXgpKTsKKyAgICAgICAgICAgICAgICBub3Rwb3BwZWQtPXptMmwocC0+cTIudmFsLnZtYXgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisJICAgIGlmKChwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiZwLT5xMS52LT5maSYmKHAtPnExLnYtPmZpLT5mbGFncyZBTExfUkVHUykpeworCSAgICAgIGJ2dW5pdGUocmVnc19tb2RpZmllZCxwLT5xMS52LT5maS0+cmVnc19tb2RpZmllZCxSU0laRSk7CisJICAgIH1lbHNleworCSAgICAgIGludCBpOworCSAgICAgIGZvcihpPTE7aTw9TUFYUjtpKyspeworCQlpZihyZWdzY3JhdGNoW2ldKSBCU0VUKHJlZ3NfbW9kaWZpZWQsaSk7CisJICAgICAgfQorCSAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZihjPT1BU1NJR058fGM9PVBVU0gpeworICAgICAgICAgICAgaWYoYz09UFVTSCkgZG9udHBvcCs9em0ybChwLT5xMi52YWwudm1heCk7CisgICAgICAgICAgICBpZihJU0ZMT0FUKHQpKXsKKyAgICAgICAgICAgICAgICBpZihjPT1BU1NJR04peworICAgICAgICAgICAgICAgICAgICBwcmZzdChmLCJmYXNzaWduIik7CisgICAgICAgICAgICAgICAgICAgIGZsb2FkKGYsJnAtPnExLHQpOworICAgICAgICAgICAgICAgICAgICBmc3RvcmUoZiwmcC0+eix0KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfWVsc2UgaWYoaXNyZWcocTEpKXsKKyAgICAgICAgICAgICAgICAgICAgcHJmc3QoZiwiZnB1c2giKTsKKyAgICAgICAgICAgICAgICAgICAgZW1pdChmLCJcdHN1YmxcdCQlbGQsJXNcbiIsem0ybChzaXpldGFiW3QmTlFdKSxyZWduYW1lc1tzcF0pOworICAgICAgICAgICAgICAgICAgICBwdXNoKHptMmwoc2l6ZXRhYlt0Jk5RXSkpOworICAgICAgICAgICAgICAgICAgICBpZihmc3RbMF09PXAtPnExLnJlZyl7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsIlx0ZnN0JWNcdCglcylcbiIseF90W3QmTlFdLHJlZ25hbWVzW3NwXSk7CisgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYWQoZiwmcC0+cTEsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsIlx0ZnN0cCVjXHQoJXMpXG4iLHhfdFt0Jk5RXSxyZWduYW1lc1tzcF0pOworICAgICAgICAgICAgICAgICAgICAgICAgZnBvcCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwkgICAgaWYoKHQmTlEpPT1MTE9ORyl7CisJICAgICAgaWYoYz09QVNTSUdOKXsKKwkJaWYoaXNjb25zdChxMSl8fGlzcmVnKHExKXx8aXNyZWcoeikpeworCQkgIG1vdmUoZiwmcC0+cTEsMCwmcC0+eiwwLHQpOworCQl9ZWxzZXsKKwkJICBpbnQgcj1nZXRfcmVnKGYscCxJTlQpOworCQkgIGVtaXQoZiwiXHRtb3ZsXHQiKTsKKwkJICBlbWl0X2x3b3JkKGYsJnAtPnExKTsKKwkJICBlbWl0KGYsIiwlc1xuIixyZWduYW1lc1tyXSk7CisJCSAgZW1pdChmLCJcdG1vdmxcdCVzLCIscmVnbmFtZXNbcl0pOworCQkgIGVtaXRfbHdvcmQoZiwmcC0+eik7CisJCSAgZW1pdChmLCJcbiIpOworCQkgIGVtaXQoZiwiXHRtb3ZsXHQiKTsKKwkJICBlbWl0X2h3b3JkKGYsJnAtPnExKTsKKwkJICBlbWl0KGYsIiwlc1xuIixyZWduYW1lc1tyXSk7CisJCSAgZW1pdChmLCJcdG1vdmxcdCVzLCIscmVnbmFtZXNbcl0pOworCQkgIGVtaXRfaHdvcmQoZiwmcC0+eik7CisJCSAgZW1pdChmLCJcbiIpOworCQl9CisJICAgICAgfWVsc2V7CisJCWVtaXQoZiwiXHRwdXNobFx0Iik7CisJCWVtaXRfaHdvcmQoZiwmcC0+cTEpOworCQllbWl0KGYsIlxuIik7CisJCXB1c2goNCk7CisJCWVtaXQoZiwiXHRwdXNobFx0Iik7CisJCWVtaXRfbHdvcmQoZiwmcC0+cTEpOworCQllbWl0KGYsIlxuIik7CisJCXB1c2goNCk7CisJICAgICAgfQorCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisgICAgICAgICAgICBpZighSVNTQ0FMQVIodCl8fCF6bWVxdG8ocC0+cTIudmFsLnZtYXgsc2l6ZXRhYlt0Jk5RXSl8fCF6bWxlcShwLT5xMi52YWwudm1heCxsMnptKDRMKSkpeworICAgICAgICAgICAgICAgIGludCBtZGk9ZGksbXNpPXNpLG09MDtsb25nIGw7CisgICAgICAgICAgICAgICAgbD16bTJsKHAtPnEyLnZhbC52bWF4KTsKKyAgICAgICAgICAgICAgICBpZihyZWdzW2N4XSl7bXw9MTtpZighY3hsKWN4bD0rK2xhYmVsO2VtaXQoZiwiXHRtb3ZsXHQlcywlcyVkXG4iLHJlZ25hbWVzW2N4XSxsYWJwcmVmaXgsY3hsKTt9CisgICAgICAgICAgICAgICAgaWYocmVnc1ttc2ldfHwhcmVndXNlZFttc2ldKXttfD0yO2lmKCFzaWwpc2lsPSsrbGFiZWw7ZW1pdChmLCJcdG1vdmxcdCVzLCVzJWRcbiIscmVnbmFtZXNbbXNpXSxsYWJwcmVmaXgsc2lsKTt9CisgICAgICAgICAgICAgICAgaWYocmVnc1ttZGldfHwhcmVndXNlZFttZGldKXttfD00O2lmKCFkaWwpZGlsPSsrbGFiZWw7ZW1pdChmLCJcdG1vdmxcdCVzLCVzJWRcbiIscmVnbmFtZXNbbWRpXSxsYWJwcmVmaXgsZGlsKTt9CisgICAgICAgICAgICAgICAgaWYoKHAtPnouZmxhZ3MmUkVHKSYmcC0+ei5yZWc9PW1zaSYmKHAtPnExLmZsYWdzJlJFRykmJnAtPnExLnJlZz09bWRpKXsKKyAgICAgICAgICAgICAgICAgICAgbXNpPWRpO21kaT1zaTsKKyAgICAgICAgICAgICAgICAgICAgbXw9ODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIShwLT56LmZsYWdzJlJFRyl8fHAtPnoucmVnIT1tc2kpeworICAgICAgICAgICAgICAgICAgICBlbWl0KGYsIlx0bGVhbFx0Iik7ZW1pdF9vYmooZiwmcC0+cTEsdCk7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwiLCVzXG4iLHJlZ25hbWVzW21zaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihjPT1QVVNIKXsKKyAgICAgICAgICAgICAgICAgICAgZW1pdChmLCJcdHN1YmxcdCQlbGQsJXNcblx0bW92bFx0JXMsJXNcbiIsbCxyZWduYW1lc1tzcF0scmVnbmFtZXNbc3BdLHJlZ25hbWVzW21kaV0pOworICAgICAgICAgICAgICAgICAgICBwdXNoKGwpOworCQkgICAgbD16bTJsKHAtPnoudmFsLnZtYXgpOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBlbWl0KGYsIlx0bGVhbFx0Iik7ZW1pdF9vYmooZiwmcC0+eix0KTsKKyAgICAgICAgICAgICAgICAgICAgZW1pdChmLCIsJXNcbiIscmVnbmFtZXNbbWRpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKChwLT56LmZsYWdzJlJFRykmJnAtPnoucmVnPT1tc2kpeworICAgICAgICAgICAgICAgICAgICBlbWl0KGYsIlx0bGVhbFx0Iik7ZW1pdF9vYmooZiwmcC0+cTEsdCk7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwiLCVzXG4iLHJlZ25hbWVzW21zaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihtJjgpeworICAgICAgICAgICAgICAgICAgICBtc2k9c2k7bWRpPWRpOworICAgICAgICAgICAgICAgICAgICBlbWl0KGYsIlx0eGNoZ1x0JXMsJXNcbiIscmVnbmFtZXNbbXNpXSxyZWduYW1lc1ttZGldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoKHQmTlEpPT1BUlJBWXx8KHQmTlEpPT1DSEFSfHxsPDQpeworICAgICAgICAgICAgICAgICAgICBlbWl0KGYsIlx0bW92bFx0JCVsZCwlc1xuXHRyZXBcblx0bW92c2JcbiIsbCxyZWduYW1lc1tjeF0pOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBpZihsPj04KQorICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCJcdG1vdmxcdCQlbGQsJXNcblx0cmVwXG4iLGwvNCxyZWduYW1lc1tjeF0pOworICAgICAgICAgICAgICAgICAgICBlbWl0KGYsIlx0bW92c2xcbiIpOworICAgICAgICAgICAgICAgICAgICBpZihsJjIpIGVtaXQoZiwiXHRtb3Zzd1xuIik7CisgICAgICAgICAgICAgICAgICAgIGlmKGwmMSkgZW1pdChmLCJcdG1vdnNiXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYobSY0KSBlbWl0KGYsIlx0bW92bFx0JXMlZCwlc1xuIixsYWJwcmVmaXgsZGlsLHJlZ25hbWVzW21kaV0pOworICAgICAgICAgICAgICAgIGlmKG0mMikgZW1pdChmLCJcdG1vdmxcdCVzJWQsJXNcbiIsbGFicHJlZml4LHNpbCxyZWduYW1lc1ttc2ldKTsKKyAgICAgICAgICAgICAgICBpZihtJjEpIGVtaXQoZiwiXHRtb3ZsXHQlcyVkLCVzXG4iLGxhYnByZWZpeCxjeGwscmVnbmFtZXNbY3hdKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGM9PVBVU0gpeworICAgICAgICAgICAgICAgIGVtaXQoZiwiXHRwdXNoJWNcdCIsKHQmTlEpPT1GTE9BVD94X3RbTE9OR106eF90W3QmTlFdKTsKKyAgICAgICAgICAgICAgICBlbWl0X29iaihmLCZwLT5xMSx0KTtlbWl0KGYsIlxuIik7CisgICAgICAgICAgICAgICAgcHVzaCh6bTJsKHAtPnEyLnZhbC52bWF4KSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihjPT1BU1NJR04peworICAgICAgICAgICAgICAgIGlmKGlzY29uc3QocTEpKXsKKyAgICAgICAgICAgICAgICAgICAgbW92ZShmLCZwLT5xMSwwLCZwLT56LDAsdCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihpc3JlZyh6KSkgcmVnPXAtPnoucmVnOworICAgICAgICAgICAgICAgIGVsc2UgaWYoaXNyZWcocTEpKSByZWc9cC0+cTEucmVnOworICAgICAgICAgICAgICAgIGVsc2UgcmVnPWdldF9yZWcoZixwLHQpOworICAgICAgICAgICAgICAgIG1vdmUoZiwmcC0+cTEsMCwwLHJlZyx0KTsKKyAgICAgICAgICAgICAgICBtb3ZlKGYsMCxyZWcsJnAtPnosMCx0KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGllcnJvcigwKTsKKyAgICAgICAgfQorICAgICAgICBpZihjPT1BRERSRVNTKXsKKyAgICAgICAgICAgIGlmKGlzcmVnKHopKSByZWc9cC0+ei5yZWc7IGVsc2UgcmVnPWdldF9yZWcoZixwLExPTkcpOworICAgICAgICAgICAgZW1pdChmLCJcdGxlYWxcdCIpO2VtaXRfb2JqKGYsJnAtPnExLHQpOworICAgICAgICAgICAgZW1pdChmLCIsJXNcbiIscmVnbmFtZXNbcmVnXSk7CisgICAgICAgICAgICBtb3ZlKGYsMCxyZWcsJnAtPnosMCxQT0lOVEVSKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmKGM9PVRFU1QpeworICAgICAgICAgICAgbGFzdGNvbXA9dDsKKyAgICAgICAgICAgIGlmKElTRkxPQVQodCkpeworICAgICAgICAgICAgICAgIGlmKGlzcmVnKHExKSYmZnN0WzBdPT1wLT5xMS5yZWcpeworICAgICAgICAgICAgICAgICAgICBlbWl0KGYsIlx0ZnRzdFxuIik7bGFzdGNvbXB8PVVOU0lHTkVEOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgcC0+Y29kZT1jPUNPTVBBUkU7CisgICAgICAgICAgICAgICAgICAgIHAtPnEyLmZsYWdzPUtPTlNUOworICAgICAgICAgICAgICAgICAgICBwLT5xMi52YWwudmxkb3VibGU9ZDJ6bGQoMC4wKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoKHQmTlEpPT1GTE9BVCkgcC0+cTIudmFsLnZmbG9hdD16bGQyemYocC0+cTIudmFsLnZsZG91YmxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoKHQmTlEpPT1ET1VCTEUpIHAtPnEyLnZhbC52ZG91YmxlPXpsZDJ6ZChwLT5xMi52YWwudmxkb3VibGUpOworCisgICAgICAgICAgICAgICAgICAgIC8qICBmYWxsIHRocm91Z2ggdG8gQ09NUEFSRSAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICBpZihpc3Zjb25zdChxMSkpeworICAgICAgICAgICAgICAgIHJlZz1nZXRfcmVnKGYscCx0KTsKKyAgICAgICAgICAgICAgICBtb3ZlKGYsJnAtPnExLDAsMCxyZWcsdCk7CisgICAgICAgICAgICAgICAgcC0+cTEuZmxhZ3M9UkVHOworICAgICAgICAgICAgICAgIHAtPnExLnJlZz1yZWc7CisgICAgICAgICAgICAgIH0KKwkgICAgICBpZigodCZOUSk9PUxMT05HKXsKKwkJcmVnPWdldF9yZWcoZixwLElOVCk7CisJCWlmKGlzcmVnKHExKSl7CisJCSAgaWYoIXJlZ19wYWlyKHAtPnExLnJlZywmcnApKSBpZXJyb3IoMCk7CisJCSAgbW92ZShmLDAscnAucjEsMCxyZWcsSU5UKTsKKwkJICBlbWl0KGYsIlx0b3JsXHQlcywlc1xuIixyZWduYW1lc1tycC5yMl0scmVnbmFtZXNbcmVnXSk7CisJCX1lbHNleworCQkgIG1vdmUoZiwmcC0+cTEsMCwwLHJlZyxJTlQpOworCQkgIGVtaXQoZiwiXHRvcmxcdCIpOworCQkgIGVtaXRfaHdvcmQoZiwmcC0+cTEpOworCQkgIGVtaXQoZiwiLCVzXG4iLHJlZ25hbWVzW3JlZ10pOworCQl9CisJCWNvbnRpbnVlOworCSAgICAgIH0KKwkgICAgICBpZihpc3JlZyhxMSkpeworCQllbWl0KGYsIlx0dGVzdCVjXHQiLHhfdFt0Jk5RXSk7CisgICAgICAgICAgICAgICAgZW1pdF9vYmooZiwmcC0+cTEsdCk7ZW1pdChmLCIsIik7CisgICAgICAgICAgICAgICAgZW1pdF9vYmooZiwmcC0+cTEsdCk7ZW1pdChmLCJcbiIpOworCSAgICAgIH1lbHNleworCQllbWl0KGYsIlx0Y21wJWNcdCQwLCIseF90W3QmTlFdKTsKKwkJZW1pdF9vYmooZiwmcC0+cTEsdCk7ZW1pdChmLCJcbiIpOworCSAgICAgIH0KKwkgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihjPT1DT01QQVJFKXsKKyAgICAgICAgICAgIGxhc3Rjb21wPXQ7CisgICAgICAgICAgICBpZihpc3JlZyhxMil8fGlzdmNvbnN0KHExKSl7CisgICAgICAgICAgICAgICAgc3RydWN0IElDICpiPXAtPm5leHQ7CisgICAgICAgICAgICAgICAgc3RydWN0IG9iaiBvOworICAgICAgICAgICAgICAgIG89cC0+cTE7cC0+cTE9cC0+cTI7cC0+cTI9bzsKKyAgICAgICAgICAgICAgICB3aGlsZShiJiZiLT5jb2RlPT1GUkVFUkVHKSBiPWItPm5leHQ7CisgICAgICAgICAgICAgICAgaWYoIWIpIGllcnJvcigwKTsKKyAgICAgICAgICAgICAgICBpZihiLT5jb2RlPT1CTFQpIGItPmNvZGU9QkdUOworICAgICAgICAgICAgICAgIGVsc2UgaWYoYi0+Y29kZT09QkxFKSBiLT5jb2RlPUJHRTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmKGItPmNvZGU9PUJHVCkgYi0+Y29kZT1CTFQ7CisgICAgICAgICAgICAgICAgZWxzZSBpZihiLT5jb2RlPT1CR0UpIGItPmNvZGU9QkxFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoSVNGTE9BVCh0KSl7CisgICAgICAgICAgICAgICAgcHJmc3QoZiwiZmNvbXAiKTsKKyAgICAgICAgICAgICAgICBpZihpc3JlZyhxMSkmJnAtPnExLnJlZz09ZnN0WzBdKXsKKyAgICAgICAgICAgICAgICAgICAgZW1pdChmLCJcdGZjb20lY1x0Iix4X3RbdCZOUV0pOworICAgICAgICAgICAgICAgICAgICBlbWl0X29iaihmLCZwLT5xMix0KTtlbWl0KGYsIlxuIik7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIGZsb2FkKGYsJnAtPnExLHQpOworICAgICAgICAgICAgICAgICAgICBlbWl0KGYsIlx0ZmNvbXAlY1x0Iix4X3RbdCZOUV0pOworICAgICAgICAgICAgICAgICAgICBlbWl0X29iaihmLCZwLT5xMix0KTtlbWl0KGYsIlxuIik7CisgICAgICAgICAgICAgICAgICAgIGZwb3AoKTsKKyAgICAgICAgICAgICAgICB9CisJCWlmKHJlZ3NbYXhdKSBlbWl0KGYsIlx0cHVzaGxcdCVzXG4iLHJlZ25hbWVzW2F4XSk7CisgICAgICAgICAgICAgICAgZW1pdChmLCJcdGZzdHN3XG5cdHNhaGZcbiIpOworCQlpZihyZWdzW2F4XSkgZW1pdChmLCJcdHBvcGxcdCVzXG4iLHJlZ25hbWVzW2F4XSk7CisgICAgICAgICAgICAgICAgbGFzdGNvbXB8PVVOU0lHTkVEOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIWlzcmVnKHExKSl7CisgICAgICAgICAgICAgICAgaWYoIWlzcmVnKHEyKSYmKCFpc3Zjb25zdChxMil8fGlzdmNvbnN0KHExKSkpeworICAgICAgICAgICAgICAgICAgICByZWc9Z2V0X3JlZyhmLHAsdCk7CisgICAgICAgICAgICAgICAgICAgIG1vdmUoZiwmcC0+cTEsMCwwLHJlZyx0KTsKKyAgICAgICAgICAgICAgICAgICAgcC0+cTEuZmxhZ3M9UkVHOworICAgICAgICAgICAgICAgICAgICBwLT5xMS5yZWc9cmVnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwkgICAgaWYoaXNyZWcocTEpJiZpc2NvbnN0KHEyKSl7CisJICAgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHQpOworCSAgICAgIGlmKHptZXF0byh2bWF4LGwyem0oMEwpKSl7CisJCWVtaXQoZiwiXHR0ZXN0JWNcdCIseF90W3QmTlFdKTsKKyAgICAgICAgICAgICAgICBlbWl0X29iaihmLCZwLT5xMSx0KTtlbWl0KGYsIiwiKTsKKyAgICAgICAgICAgICAgICBlbWl0X29iaihmLCZwLT5xMSx0KTtlbWl0KGYsIlxuIik7CisJCWNvbnRpbnVlOworCSAgICAgIH0KKwkgICAgfQorCSAgICBpZihpc3JlZyhxMikmJmlzY29uc3QocTEpKXsKKwkgICAgICBldmFsX2NvbnN0KCZwLT5xMS52YWwsdCk7CisJICAgICAgaWYoem1lcXRvKHZtYXgsbDJ6bSgwTCkpKXsKKwkJZW1pdChmLCJcdHRlc3QlY1x0Iix4X3RbdCZOUV0pOworICAgICAgICAgICAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHQpO2VtaXQoZiwiLCIpOworICAgICAgICAgICAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHQpO2VtaXQoZiwiXG4iKTsKKwkJY29udGludWU7CisJICAgICAgfQorCSAgICB9CisgICAgICAgICAgICBlbWl0KGYsIlx0Y21wJWNcdCIseF90W3QmTlFdKTsKKyAgICAgICAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHQpO2VtaXQoZiwiLCIpOworICAgICAgICAgICAgZW1pdF9vYmooZiwmcC0+cTEsdCk7ZW1pdChmLCJcbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYoSVNGTE9BVCh0KSl7CisgICAgICAgICAgICBjaGFyIHNbMl07CisgICAgICAgICAgICBwcmZzdChmLCJmbWF0aCIpOworICAgICAgICAgICAgaWYoaXNyZWcocTIpKSBzWzBdPTA7IGVsc2Uge3NbMF09eF90W3QmTlFdO3NbMV09MDt9CisgICAgICAgICAgICBpZihpc3JlZyh6KSYmaXNyZWcocTEpJiZwLT5xMS5yZWc9PWZzdFswXSYmcC0+ei5yZWc9PWZzdFswXSl7CisgICAgICAgICAgICAgICAgZW1pdChmLCJcdCVzJXNcdCIsZmFyaXRobWV0aWNzW2MtTFNISUZUXSxzKTsKKyAgICAgICAgICAgICAgICBlbWl0X29iaihmLCZwLT5xMix0KTsgZW1pdChmLCJcbiIpO2NvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmxvYWQoZiwmcC0+cTEsdCk7CisgICAgICAgICAgICBlbWl0KGYsIlx0JXMlc1x0IixmYXJpdGhtZXRpY3NbYy1MU0hJRlRdLHMpOworICAgICAgICAgICAgZW1pdF9vYmooZiwmcC0+cTIsdCk7IGVtaXQoZiwiXG4iKTsKKyAgICAgICAgICAgIGZzdG9yZShmLCZwLT56LHQpOyBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZigoYz09TVVMVHx8KChjPT1ESVZ8fGM9PU1PRCkmJihwLT50eXBmJlVOU0lHTkVEKSkpJiZpc2NvbnN0KHEyKSl7CisgICAgICAgICAgICBsb25nIGxuOworICAgICAgICAgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHQpOworICAgICAgICAgICAgaWYoem1sZXEobDJ6bSgwTCksdm1heCkmJnp1bWxlcSh1bDJ6dW0oMFVMKSx2dW1heCkpeworICAgICAgICAgICAgICAgIGlmKGxuPXBvZjIodnVtYXgpKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoYz09TU9EKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZtYXg9em1zdWIodm1heCxsMnptKDFMKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwLT5jb2RlPUFORDsKKyAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICB2bWF4PWwyem0obG4tMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT1ESVYpIHAtPmNvZGU9UlNISUZUOyBlbHNlIHAtPmNvZGU9TFNISUZUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGM9cC0+Y29kZTsKKwkJICAgIGd2YWwudm1heD12bWF4OworCQkgICAgZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworCQkgICAgaWYoYz09QU5EKXsKKwkJICAgICAgaW5zZXJ0X2NvbnN0KCZwLT5xMi52YWwsdCk7CisJCSAgICB9ZWxzZXsKKwkJICAgICAgaW5zZXJ0X2NvbnN0KCZwLT5xMi52YWwsSU5UKTsKKwkJICAgICAgcC0+dHlwZjI9SU5UOworCQkgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihjPT1NT0R8fGM9PURJVil7CisgICAgICAgICAgICBpbnQgbT0wOworCSAgICBCU0VUKHJlZ3NfbW9kaWZpZWQsZHgpOworCSAgICBCU0VUKHJlZ3NfbW9kaWZpZWQsYXgpOworICAgICAgICAgICAgaWYocmVnc1theF0mJighaXNyZWcoeil8fHAtPnoucmVnIT1heCkpeworICAgICAgICAgICAgICAgIGVtaXQoZiwiXHRwdXNobFx0JXNcbiIscmVnbmFtZXNbYXhdKTsKKwkJcHVzaCg0KTsKKwkJbXw9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGlzcmVnKHEyKSYmcC0+cTIucmVnPT1heCl7CisgICAgICAgICAgICAgICAgZW1pdChmLCJcdHB1c2hsXHQlc1xuIixyZWduYW1lc1theF0pOworCQlwdXNoKDQpOworCQltfD0xNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHJlZ3NbZHhdJiYoIWlzcmVnKHopfHxwLT56LnJlZyE9ZHgpKXsKKyAgICAgICAgICAgICAgICBlbWl0KGYsIlx0cHVzaGxcdCVzXG4iLHJlZ25hbWVzW2R4XSk7CisJCXB1c2goNCk7CisJCW18PTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZigocC0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJihwLT5xMi5yZWc9PWF4fHxwLT5xMi5yZWc9PWR4KSl7CisgICAgICAgICAgICAgICAgbW92ZShmLCZwLT5xMiwwLDAsZHgsdCk7CisgICAgICAgICAgICAgICAgZW1pdChmLCJcdHB1c2hsXHQlc1xuIixyZWduYW1lc1tkeF0pOworCQlwdXNoKDQpOworICAgICAgICAgICAgICAgIG18PTg7CisgICAgICAgICAgICB9CisJICAgIGlmKGlzcmVnKHExKSYmcC0+cTEucmVnPT1keCYmKG0mMTApPT0xMCkKKwkgICAgICBlbWl0KGYsIlx0bW92bFx0NCglcyksJXNcbiIscmVnbmFtZXNbc3BdLHJlZ25hbWVzW2F4XSk7CisJICAgIGVsc2UKKwkgICAgICBtb3ZlKGYsJnAtPnExLDAsMCxheCx0KTsKKyAgICAgICAgICAgIGlmKGlzY29uc3QocTIpKXsKKyAgICAgICAgICAgICAgICBlbWl0KGYsIlx0cHVzaCVjXHQiLHhfdFt0Jk5RXSk7ZW1pdF9vYmooZiwmcC0+cTIsdCk7CisgICAgICAgICAgICAgICAgZW1pdChmLCJcbiIpOworCQlwdXNoKDQpOworCQltfD00OworICAgICAgICAgICAgfQorCSAgICBpZihpc3JlZyhxMikmJnAtPnEyLnJlZz09ZHgpeworCSAgICAgIGVtaXQoZiwiXHRwdXNobFx0JXNcbiIscmVnbmFtZXNbZHhdKTsKKwkgICAgICBwdXNoKDQpOworCSAgICAgIG18PTQ7CisJICAgIH0KKyAgICAgICAgICAgIGlmKHQmVU5TSUdORUQpIGVtaXQoZiwiXHR4b3JsXHQlcywlc1xuXHRkaXZsXHQiLHJlZ25hbWVzW2R4XSxyZWduYW1lc1tkeF0pOworICAgICAgICAgICAgICAgIGVsc2UgICAgICAgZW1pdChmLCJcdGNsdGRcblx0aWRpdmxcdCIpOworICAgICAgICAgICAgaWYoKG0mMTIpfHwoaXNyZWcocTIpJiZwLT5xMi5yZWc9PWR4KSl7CisgICAgICAgICAgICAgICAgZW1pdChmLCIoJXMpIixyZWduYW1lc1tzcF0pOworICAgICAgICAgICAgfWVsc2UgaWYoaXNyZWcocTIpJiZwLT5xMi5yZWc9PWF4KXsKKyAgICAgICAgICAgICAgICBlbWl0KGYsIiVzKCVzKSIsKG0mMTApPyI0IjoiIixyZWduYW1lc1tzcF0pOworICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgZW1pdF9vYmooZiwmcC0+cTIsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbWl0KGYsIlxuIik7CisgICAgICAgICAgICBpZihjPT1ESVYpIG1vdmUoZiwwLGF4LCZwLT56LDAsdCk7CisgICAgICAgICAgICAgICAgZWxzZSAgIG1vdmUoZiwwLGR4LCZwLT56LDAsdCk7CisgICAgICAgICAgICBpZihtJjQpeyBlbWl0KGYsIlx0YWRkbFx0JCVsZCwlc1xuIix6bTJsKHNpemV0YWJbdCZOUV0pLHJlZ25hbWVzW3NwXSk7cG9wKDQpO30KKyAgICAgICAgICAgIGlmKG0mOCl7IGVtaXQoZiwiXHRwb3BsXHQlc1xuIixyZWduYW1lc1tkeF0pO3BvcCg0KTt9CisgICAgICAgICAgICBpZihtJjIpeyBlbWl0KGYsIlx0cG9wbFx0JXNcbiIscmVnbmFtZXNbZHhdKTtwb3AoNCk7fQorICAgICAgICAgICAgaWYobSYxKXsgZW1pdChmLCJcdHBvcGxcdCVzXG4iLHJlZ25hbWVzW2F4XSk7cG9wKDQpO30KKyAgICAgICAgICAgIGlmKG0mMTYpeyBlbWl0KGYsIlx0YWRkbFx0JCVsZCwlc1xuIix6bTJsKHNpemV0YWJbdCZOUV0pLHJlZ25hbWVzW3NwXSk7cG9wKDQpO30KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmKCFpc2NvbnN0KHEyKSYmKGM9PUxTSElGVHx8Yz09UlNISUZUKSl7CisgICAgICAgICAgICBjaGFyICpzPWFyaXRobWV0aWNzW2MtTFNISUZUXTsKKyAgICAgICAgICAgIGludCBmbD0wOworICAgICAgICAgICAgaWYoYz09UlNISUZUJiYodCZVTlNJR05FRCkpIHM9InNociI7CisgICAgICAgICAgICBpZigoKHAtPnExLmZsYWdzJlJFRykmJnAtPnExLnJlZz09Y3gpfHwoKHAtPnouZmxhZ3MmUkVHKSYmcC0+ei5yZWc9PWN4KQorICAgICAgICAgICAgICAgfHwoIWNvbXBhcmVfb2JqZWN0cygmcC0+cTEsJnAtPnopJiYhaXNyZWcocTEpKSl7CisgICAgICAgICAgICAgICAgZmw9cmVnc1tjeF07cmVnc1tjeF09MjsgLyogZG9uJ3Qgd2FudCBjeCAqLworICAgICAgICAgICAgICAgIHJlZz1nZXRfcmVnKGYscCx0KTsKKyAgICAgICAgICAgICAgICByZWdzW2N4XT1mbDsKKyAgICAgICAgICAgICAgICBpZihpc3JlZyh6KSYmcC0+ei5yZWc9PWN4KSBmbD0wOworICAgICAgICAgICAgICAgIGlmKGZsKXtlbWl0KGYsIlx0cHVzaGxcdCVzXG4iLHJlZ25hbWVzW2N4XSk7cHVzaCg0KTt9CisgICAgICAgICAgICAgICAgbW92ZShmLCZwLT5xMSwwLDAscmVnLHQpOworICAgICAgICAgICAgICAgIG1vdmUoZiwmcC0+cTIsMCwwLGN4LHQpOworICAgICAgICAgICAgICAgIGVtaXQoZiwiXHQlcyVjXHQlJWNsLCVzXG4iLHMseF90W3QmTlFdLG1yZWduYW1lKHJlZyx0KSk7CisgICAgICAgICAgICAgICAgbW92ZShmLDAscmVnLCZwLT56LDAsdCk7CisgICAgICAgICAgICAgICAgaWYoZmwpe2VtaXQoZiwiXHRwb3BsXHQlc1xuIixyZWduYW1lc1tjeF0pO3BvcCg0KTt9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBpZighaXNyZWcocTIpfHxwLT5xMi5yZWchPWN4KXsKKyAgICAgICAgICAgICAgICAgICAgaWYocmVnc1tjeF0pe2VtaXQoZiwiXHRwdXNobFx0JXNcbiIscmVnbmFtZXNbY3hdKTtwdXNoKDQpO2ZsPTE7fQorICAgICAgICAgICAgICAgICAgICBtb3ZlKGYsJnAtPnEyLDAsMCxjeCx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoY29tcGFyZV9vYmplY3RzKCZwLT5xMSwmcC0+eikpeworICAgICAgICAgICAgICAgICAgICBlbWl0KGYsIlx0JXMlY1x0JSVjbCwiLHMseF90W3QmTlFdKTsKKyAgICAgICAgICAgICAgICAgICAgZW1pdF9vYmooZiwmcC0+eix0KTtlbWl0KGYsIlxuIik7CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIG1vdmUoZiwwLHAtPnExLnJlZywmcC0+eiwwLHQpOworICAgICAgICAgICAgICAgICAgICBlbWl0KGYsIlx0JXMlY1x0JSVjbCwiLHMseF90W3QmTlFdKTsKKyAgICAgICAgICAgICAgICAgICAgZW1pdF9vYmooZiwmcC0+eix0KTtlbWl0KGYsIlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKGZsKSB7ZW1pdChmLCJcdHBvcGxcdCVzXG4iLHJlZ25hbWVzW2N4XSk7cG9wKDQpO30KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZigoYz49TFNISUZUJiZjPD1NT0QpfHwoYz49T1ImJmM8PUFORCkpeworICAgICAgICAgICAgY2hhciAqczsKKyAgICAgICAgICAgIGlmKGM+PU9SJiZjPD1BTkQpIHM9bG9naWNhbHNbYy1PUl07CisgICAgICAgICAgICAgICAgZWxzZSBzPWFyaXRobWV0aWNzW2MtTFNISUZUXTsKKyAgICAgICAgICAgIGlmKGM9PVJTSElGVCYmKHQmVU5TSUdORUQpKSBzPSJzaHIiOworICAgICAgICAgICAgaWYoYyE9TVVMVCYmY29tcGFyZV9vYmplY3RzKCZwLT5xMSwmcC0+eikpeworICAgICAgICAgICAgICAgIGlmKGlzcmVnKHopfHxpc3JlZyhxMSl8fGlzY29uc3QocTIpKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoaXNjb25zdChxMikmJihjPT1BRER8fGM9PVNVQikpeworICAgICAgICAgICAgICAgICAgICAgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoem1lcXRvKHZtYXgsbDJ6bSgxTCkpJiZ6dW1lcXRvKHZ1bWF4LHVsMnp1bSgxVUwpKSYmemxkZXF0byh2bGRvdWJsZSxkMnpsZCgxLjApKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09QUREKSBzPSJpbmMiOyBlbHNlIHM9ImRlYyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCJcdCVzJWNcdCIscyx4X3RbdCZOUV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRfb2JqKGYsJnAtPnosdCk7ZW1pdChmLCJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwiXHQlcyVjXHQiLHMseF90W3QmTlFdKTsKKyAgICAgICAgICAgICAgICAgICAgZW1pdF9vYmooZiwmcC0+cTIsdCk7ZW1pdChmLCIsIik7CisgICAgICAgICAgICAgICAgICAgIGVtaXRfb2JqKGYsJnAtPnosdCk7ZW1pdChmLCJcbiIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgaWYoaXNyZWcocTIpKSByZWc9cC0+cTIucmVnOyBlbHNlIHJlZz1nZXRfcmVnKGYscCx0KTsKKyAgICAgICAgICAgICAgICAgICAgbW92ZShmLCZwLT5xMiwwLDAscmVnLHQpOworICAgICAgICAgICAgICAgICAgICBlbWl0KGYsIlx0JXMlY1x0JXMiLHMseF90W3QmTlFdLG1yZWduYW1lKHJlZyx0KSk7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwiLCIpOyBlbWl0X29iaihmLCZwLT56LHQpO2VtaXQoZiwiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCSAgICBpZihjPT1BTkQmJmlzcmVnKHopKXsKKwkgICAgICAvKiBjYW4gd2UgdXNlIHRlc3QgaW5zdHJ1Y3Rpb24/ICovCisJICAgICAgc3RydWN0IElDICpwMj1wLT5uZXh0OworCSAgICAgIHdoaWxlKHAyLT5jb2RlPT1BTExPQ1JFR3x8cDItPmNvZGU9PUZSRUVSRUcpCisJCXAyPXAyLT5uZXh0OworCSAgICAgIGlmKHAyLT5jb2RlPT1URVNUJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMS5yZWc9PXAtPnoucmVnKXsKKwkJc3RydWN0IElDICpwMz1wMi0+bmV4dDsKKwkJd2hpbGUocDMtPmNvZGU9PUFMTE9DUkVHfHxwMy0+Y29kZT09RlJFRVJFRyl7CisJCSAgaWYocDMtPmNvZGU9PUZSRUVSRUcmJnAzLT5xMS5yZWc9PXAtPnoucmVnKQorCQkgICAgYnJlYWs7CisJCSAgcDM9cDMtPm5leHQ7CisJCX0KKwkJaWYocDMtPmNvZGU9PUZSRUVSRUcmJnAzLT5xMS5yZWc9PXAtPnoucmVnKXsKKwkJICAvKiB3ZSBjYW4gdXNlIHRlc3QgKi8KKwkJICBwMi0+Y29kZT1OT1A7CisJCSAgaWYobm90cG9wcGVkJiYhZG9udHBvcCl7CisJCSAgICBlbWl0KGYsIlx0YWRkbFx0JCVsZCwlJWVzcFxuIixub3Rwb3BwZWQpOworCQkgICAgcG9wKG5vdHBvcHBlZCk7CisJCSAgICBub3Rwb3BwZWQ9MDsKKwkJICB9CisJCSAgaWYoaXNjb25zdChxMSkpeworCQkgICAgc3RydWN0IG9iaiB0bXA9cC0+cTE7CisJCSAgICBwLT5xMT1wLT5xMjsKKwkJICAgIHAtPnEyPXRtcDsKKwkJICB9CisJCSAgaWYoIWlzcmVnKHExKSYmIWlzcmVnKHEyKSYmIWlzY29uc3QocTIpKXsKKwkJICAgIGludCByPWdldF9yZWcoZixwLHQpOworCQkgICAgbW92ZShmLCZwLT5xMSwwLDAscix0KTsKKwkJICAgIHAtPnExLmZsYWdzPVJFRzsKKwkJICAgIHAtPnExLnJlZz1yOworCQkgIH0KKwkJICBlbWl0KGYsIlx0dGVzdCVjXHQiLHhfdFt0Jk5RXSk7CisJCSAgZW1pdF9vYmooZiwmcC0+cTIsdCk7CisJCSAgZW1pdChmLCIsIik7CisJCSAgZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJCSAgZW1pdChmLCJcbiIpOworCQkgIGNvbnRpbnVlOworCQl9CisJICAgICAgfQorCSAgICB9CisJICAgICAgCisJICAgIGlmKGlzcmVnKHopJiYocC0+cTIuZmxhZ3MmUkVHKSYmcC0+cTIucmVnPT1wLT56LnJlZyl7CisJICAgICAgaWYoYz09QUREfHxjPT1BTkR8fGM9PU9SfHxjPT1YT1IpeworCQlzdHJ1Y3Qgb2JqIHRtcDsKKwkJdG1wPXAtPnExOworCQlwLT5xMT1wLT5xMjsKKwkJcC0+cTI9dG1wOworCSAgICAgIH0KKwkgICAgfQorICAgICAgICAgICAgaWYoaXNyZWcoeikmJighKHAtPnEyLmZsYWdzJlJFRyl8fHAtPnEyLnJlZyE9cC0+ei5yZWcpKSByZWc9cC0+ei5yZWc7IGVsc2UgcmVnPWdldF9yZWcoZixwLHQpOworICAgICAgICAgICAgbW92ZShmLCZwLT5xMSwwLDAscmVnLHQpOworICAgICAgICAgICAgaWYoaXNjb25zdChxMikmJihjPT1BRER8fGM9PVNVQikpeworICAgICAgICAgICAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCx0KTsKKyAgICAgICAgICAgICAgICBpZih6bWVxdG8odm1heCxsMnptKDFMKSkmJnp1bWVxdG8odnVtYXgsdWwyenVtKDFVTCkpJiZ6bGRlcXRvKHZsZG91YmxlLGQyemxkKDEuMCkpKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoYz09QUREKSBzPSJpbmMiOyBlbHNlIHM9ImRlYyI7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwiXHQlcyVjXHQlc1xuIixzLHhfdFt0Jk5RXSxtcmVnbmFtZShyZWcsdCkpOworICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICBlbWl0KGYsIlx0JXMlY1x0IixzLHhfdFt0Jk5RXSk7CisgICAgICAgICAgICAgICAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHQpO2VtaXQoZiwiLCVzXG4iLG1yZWduYW1lKHJlZyx0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgZW1pdChmLCJcdCVzJWNcdCIscyx4X3RbdCZOUV0pOworICAgICAgICAgICAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHQpO2VtaXQoZiwiLCVzXG4iLG1yZWduYW1lKHJlZyx0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtb3ZlKGYsMCxyZWcsJnAtPnosMCx0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGllcnJvcigwKTsKKyAgICB9CisgICAgaWYobm90cG9wcGVkKXsKKyAgICAgICAgZW1pdChmLCJcdGFkZGxcdCQlbGQsJSVlc3BcbiIsbm90cG9wcGVkKTsKKyAgICAgICAgcG9wKG5vdHBvcHBlZCk7bm90cG9wcGVkPTA7CisgICAgfQorICAgIGZ1bmN0aW9uX2JvdHRvbShmLHYsbG9mZik7CisgICAgaWYoZGVidWdfaW5mbyl7CisgICAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKyAgICAgIGR3YXJmMl9mdW5jdGlvbihmLHYsbGFiZWwpOworICAgICAgaWYoZikgc2VjdGlvbj0tMTsKKyAgICB9ICAgICAgICAgIAorfQorCitpbnQgc2hvcnRjdXQoaW50IGNvZGUsaW50IHR5cCkKK3sKKyAgcmV0dXJuKDApOworfQorCit2b2lkIGNsZWFudXBfY2coRklMRSAqZikKK3sKKyAgc3RydWN0IGZwY29uc3RsaXN0ICpwOworICB1bnNpZ25lZCBjaGFyICppcDsKKworICB0aXRsZShmKTsKKyAgd2hpbGUocD1maXJzdGZwYyl7CisgICAgaWYoZil7CisgICAgICBpZihzZWN0aW9uIT1DT0RFKXtlbWl0KGYsY29kZW5hbWUpO2lmKGYpIHNlY3Rpb249Q09ERTt9CisgICAgICBlbWl0KGYsIlx0LmFsaWduXHQ0XG4iKTsKKyAgICAgIGVtaXQoZiwiJXMlZDpcblx0LmxvbmdcdCIsbGFicHJlZml4LHAtPmxhYmVsKTsKKyAgICAgIGlwPSh1bnNpZ25lZCBjaGFyICopJnAtPnZhbC52ZG91YmxlOworICAgICAgZW1pdChmLCIweCUwMnglMDJ4JTAyeCUwMngiLGlwWzNdLGlwWzJdLGlwWzFdLGlwWzBdKTsKKyAgICAgIGlmKChwLT50eXAmTlEpPT1ET1VCTEV8fChwLT50eXAmTlEpPT1MRE9VQkxFKXsKKwllbWl0KGYsIiwweCUwMnglMDJ4JTAyeCUwMngiLGlwWzddLGlwWzZdLGlwWzVdLGlwWzRdKTsKKyAgICAgIH0KKyAgICAgIGVtaXQoZiwiXG4iKTsKKyAgICB9CisgICAgZmlyc3RmcGM9cC0+bmV4dDsKKyAgICBmcmVlKHApOworICB9CisgIGlmKGYpeworICAgIGlmKHNlY3Rpb24hPUJTUyl7ZW1pdChmLGJzc25hbWUpO2lmKGYpIHNlY3Rpb249QlNTO30KKyAgICBpZihjeGwpIGVtaXQoZiwiXHQubGNvbW1cdCVzJWQsNFxuIixsYWJwcmVmaXgsY3hsKTsKKyAgICBpZihzaWwpIGVtaXQoZiwiXHQubGNvbW1cdCVzJWQsNFxuIixsYWJwcmVmaXgsc2lsKTsKKyAgICBpZihkaWwpIGVtaXQoZiwiXHQubGNvbW1cdCVzJWQsNFxuIixsYWJwcmVmaXgsZGlsKTsKKyAgfQorfQordm9pZCBpbml0X2RiKEZJTEUgKmYpCit7CisgIGR3YXJmMl9zZXR1cChzaXpldGFiW1BPSU5URVJdLCIuYnl0ZSIsIi4yYnl0ZSIsIi40Ynl0ZSIsIi40Ynl0ZSIsbGFicHJlZml4LGlkcHJlZml4LCIuc2VjdGlvbiIpOworICBkd2FyZjJfcHJpbnRfY29tcF91bml0X2hlYWRlcihmKTsKK30KK3ZvaWQgY2xlYW51cF9kYihGSUxFICpmKQoreworICBkd2FyZjJfY2xlYW51cChmKTsKKyAgaWYoZikgc2VjdGlvbj0tMTsKK30KKworCit2b2lkIGluc2VydF9jb25zdCh1bmlvbiBhdHlwcyAqcCxpbnQgdCkKKy8qICBUcmFlZ3QgS29uc3RhbnRlIGluIGVudHByZWNoZW5kZXMgRmVsZCBlaW4uICAgICAgICovCit7CisgIGlmKCFwKSBpZXJyb3IoMCk7CisgIHQmPU5VOworICBpZihJU0JFKHQpKQorICAgIHQ9TEVUWVBFKHQpOworICBpZih0PT1DSEFSKSB7cC0+dmNoYXI9dmNoYXI7cmV0dXJuO30KKyAgaWYodD09U0hPUlQpIHtwLT52c2hvcnQ9dnNob3J0O3JldHVybjt9CisgIGlmKHQ9PUlOVCkge3AtPnZpbnQ9dmludDtyZXR1cm47fQorICBpZih0PT1MT05HKSB7cC0+dmxvbmc9dmxvbmc7cmV0dXJuO30KKyAgaWYodD09TExPTkcpIHtwLT52bGxvbmc9dmxsb25nO3JldHVybjt9CisgIGlmKHQ9PU1BWElOVCkge3AtPnZtYXg9dm1heDtyZXR1cm47fQorICBpZih0PT0oVU5TSUdORUR8Q0hBUikpIHtwLT52dWNoYXI9dnVjaGFyO3JldHVybjt9CisgIGlmKHQ9PShVTlNJR05FRHxTSE9SVCkpIHtwLT52dXNob3J0PXZ1c2hvcnQ7cmV0dXJuO30KKyAgaWYodD09KFVOU0lHTkVEfElOVCkpIHtwLT52dWludD12dWludDtyZXR1cm47fQorICBpZih0PT0oVU5TSUdORUR8TE9ORykpIHtwLT52dWxvbmc9dnVsb25nO3JldHVybjt9CisgIGlmKHQ9PShVTlNJR05FRHxMTE9ORykpIHtwLT52dWxsb25nPXZ1bGxvbmc7cmV0dXJuO30KKyAgaWYodD09KFVOU0lHTkVEfE1BWElOVCkpIHtwLT52dW1heD12dW1heDtyZXR1cm47fQorICBpZih0PT1GTE9BVCkge3AtPnZmbG9hdD12ZmxvYXQ7cmV0dXJuO30KKyAgaWYodD09RE9VQkxFKSB7cC0+dmRvdWJsZT12ZG91YmxlO3JldHVybjt9CisgIGlmKHQ9PUxET1VCTEUpIHtwLT52bGRvdWJsZT12bGRvdWJsZTtyZXR1cm47fQorICBpZih0PT1QT0lOVEVSKSB7cC0+dnVsb25nPXZ1bG9uZztyZXR1cm47fQorfQorCit2b2lkIGV2YWxfY29uc3QodW5pb24gYXR5cHMgKnAsaW50IHQpCisvKiAgV2Vpc3QgYmVzdGltbXRlbiBnbG9iYWxlbiBWYXJpYWJsZW4gV2VydCBlaW5lciBDRVhQUiB6dS4gICAgICAgKi8KK3sKKyAgaW50IGY9dCZOUTsKKyAgaWYoSVNCRShmKSkKKyAgICBmPUxFVFlQRShmKTsKKyAgaWYoIXApIGllcnJvcigwKTsKKyAgaWYoZj09TUFYSU5UfHwoZj49Q0hBUiYmZjw9TExPTkcpKXsKKyAgICBpZighKHQmVU5TSUdORUQpKXsKKyAgICAgIGlmKGY9PUNIQVIpIHZtYXg9emMyem0ocC0+dmNoYXIpOworICAgICAgZWxzZSBpZihmPT1TSE9SVCl2bWF4PXpzMnptKHAtPnZzaG9ydCk7CisgICAgICBlbHNlIGlmKGY9PUlOVCkgIHZtYXg9emkyem0ocC0+dmludCk7CisgICAgICBlbHNlIGlmKGY9PUxPTkcpIHZtYXg9emwyem0ocC0+dmxvbmcpOworICAgICAgZWxzZSBpZihmPT1MTE9ORykgdm1heD16bGwyem0ocC0+dmxsb25nKTsKKyAgICAgIGVsc2UgaWYoZj09TUFYSU5UKSB2bWF4PXAtPnZtYXg7CisgICAgICBlbHNlIGllcnJvcigwKTsKKyAgICAgIHZ1bWF4PXptMnp1bSh2bWF4KTsKKyAgICAgIHZsZG91YmxlPXptMnpsZCh2bWF4KTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKGY9PUNIQVIpIHZ1bWF4PXp1YzJ6dW0ocC0+dnVjaGFyKTsKKyAgICAgIGVsc2UgaWYoZj09U0hPUlQpdnVtYXg9enVzMnp1bShwLT52dXNob3J0KTsKKyAgICAgIGVsc2UgaWYoZj09SU5UKSAgdnVtYXg9enVpMnp1bShwLT52dWludCk7CisgICAgICBlbHNlIGlmKGY9PUxPTkcpIHZ1bWF4PXp1bDJ6dW0ocC0+dnVsb25nKTsKKyAgICAgIGVsc2UgaWYoZj09TExPTkcpIHZ1bWF4PXp1bGwyenVtKHAtPnZ1bGxvbmcpOworICAgICAgZWxzZSBpZihmPT1NQVhJTlQpIHZ1bWF4PXAtPnZ1bWF4OworICAgICAgZWxzZSBpZXJyb3IoMCk7CisgICAgICB2bWF4PXp1bTJ6bSh2dW1heCk7CisgICAgICB2bGRvdWJsZT16dW0yemxkKHZ1bWF4KTsKKyAgICB9CisgIH1lbHNleworICAgIGlmKElTUE9JTlRFUihmKSl7CisgICAgICB2dW1heD16dWwyenVtKHAtPnZ1bG9uZyk7CisgICAgICB2bWF4PXp1bTJ6bSh2dW1heCk7dmxkb3VibGU9enVtMnpsZCh2dW1heCk7CisgICAgfWVsc2V7CisgICAgICBpZihmPT1GTE9BVCkgdmxkb3VibGU9emYyemxkKHAtPnZmbG9hdCk7CisgICAgICBlbHNlIGlmKGY9PURPVUJMRSkgdmxkb3VibGU9emQyemxkKHAtPnZkb3VibGUpOworICAgICAgZWxzZSB2bGRvdWJsZT1wLT52bGRvdWJsZTsKKyAgICAgIHZtYXg9emxkMnptKHZsZG91YmxlKTsKKyAgICAgIHZ1bWF4PXpsZDJ6dW0odmxkb3VibGUpOworICAgIH0KKyAgfQorICB2ZmxvYXQ9emxkMnpmKHZsZG91YmxlKTsKKyAgdmRvdWJsZT16bGQyemQodmxkb3VibGUpOworICB2dWNoYXI9enVtMnp1Yyh2dW1heCk7CisgIHZ1c2hvcnQ9enVtMnp1cyh2dW1heCk7CisgIHZ1aW50PXp1bTJ6dWkodnVtYXgpOworICB2dWxvbmc9enVtMnp1bCh2dW1heCk7CisgIHZ1bGxvbmc9enVtMnp1bGwodnVtYXgpOworICB2Y2hhcj16bTJ6Yyh2bWF4KTsKKyAgdnNob3J0PXptMnpzKHZtYXgpOworICB2aW50PXptMnppKHZtYXgpOworICB2bG9uZz16bTJ6bCh2bWF4KTsKKyAgdmxsb25nPXptMnpsbCh2bWF4KTsgCit9Cit2b2lkIHByaW50dmFsKEZJTEUgKmYsdW5pb24gYXR5cHMgKnAsaW50IHQpCisvKiAgR2lidCBhdHlwcyBhdXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIHQmPU5VOworICBpZihJU0JFKHQpKXsKKyAgICBmcHJpbnRmKGYsIkIiKTsKKyAgICB0PUxFVFlQRSh0KTsKKyAgfQorICBpZih0PT1DSEFSKXtmcHJpbnRmKGYsIkMiKTt2bWF4PXpjMnptKHAtPnZjaGFyKTtwcmludHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8Q0hBUikpe2ZwcmludGYoZiwiVUMiKTt2dW1heD16dWMyenVtKHAtPnZ1Y2hhcik7cHJpbnR6dW0oZix2dW1heCk7fQorICBpZih0PT1TSE9SVCl7ZnByaW50ZihmLCJTIik7dm1heD16czJ6bShwLT52c2hvcnQpO3ByaW50em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxTSE9SVCkpe2ZwcmludGYoZiwiVVMiKTt2dW1heD16dXMyenVtKHAtPnZ1c2hvcnQpO3ByaW50enVtKGYsdnVtYXgpO30KKyAgaWYodD09RkxPQVQpe2ZwcmludGYoZiwiRiIpO3ZsZG91YmxlPXpmMnpsZChwLT52ZmxvYXQpO3ByaW50emxkKGYsdmxkb3VibGUpO30KKyAgaWYodD09RE9VQkxFKXtmcHJpbnRmKGYsIkQiKTt2bGRvdWJsZT16ZDJ6bGQocC0+dmRvdWJsZSk7cHJpbnR6bGQoZix2bGRvdWJsZSk7fQorICBpZih0PT1MRE9VQkxFKXtmcHJpbnRmKGYsIkxEIik7cHJpbnR6bGQoZixwLT52bGRvdWJsZSk7fQorICBpZih0PT1JTlQpe2ZwcmludGYoZiwiSSIpO3ZtYXg9emkyem0ocC0+dmludCk7cHJpbnR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfElOVCkpe2ZwcmludGYoZiwiVUkiKTt2dW1heD16dWkyenVtKHAtPnZ1aW50KTtwcmludHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUxPTkcpe2ZwcmludGYoZiwiTCIpO3ZtYXg9emwyem0ocC0+dmxvbmcpO3ByaW50em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxMT05HKSl7ZnByaW50ZihmLCJVTCIpO3Z1bWF4PXp1bDJ6dW0ocC0+dnVsb25nKTtwcmludHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUxMT05HKXtmcHJpbnRmKGYsIkxMIik7dm1heD16bGwyem0ocC0+dmxsb25nKTtwcmludHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8TExPTkcpKXtmcHJpbnRmKGYsIlVMTCIpO3Z1bWF4PXp1bGwyenVtKHAtPnZ1bGxvbmcpO3ByaW50enVtKGYsdnVtYXgpO30KKyAgaWYodD09TUFYSU5UKXtmcHJpbnRmKGYsIk0iKTtwcmludHptKGYscC0+dm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8TUFYSU5UKSl7ZnByaW50ZihmLCJVTSIpO3ByaW50enVtKGYscC0+dnVtYXgpO30KKyAgLypGSVhNRSovCisgIGlmKHQ9PVBPSU5URVIpe2ZwcmludGYoZiwiUCIpO3Z1bWF4PXp1bDJ6dW0ocC0+dnVsb25nKTtwcmludHp1bShmLHZ1bWF4KTt9Cit9Cit2b2lkIGVtaXR2YWwoRklMRSAqZix1bmlvbiBhdHlwcyAqcCxpbnQgdCkKKy8qICBHaWJ0IGF0eXBzIGF1cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgdCY9TlU7CisgIC8qRklYTUU/Ki8KKyAgaWYoSVNCRSh0KSkKKyAgICB0PUxFVFlQRSh0KTsKKyAgaWYodD09Q0hBUil7dm1heD16YzJ6bShwLT52Y2hhcik7ZW1pdHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8Q0hBUikpe3Z1bWF4PXp1YzJ6dW0ocC0+dnVjaGFyKTtlbWl0enVtKGYsdnVtYXgpO30KKyAgaWYodD09U0hPUlQpe3ZtYXg9enMyem0ocC0+dnNob3J0KTtlbWl0em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxTSE9SVCkpe3Z1bWF4PXp1czJ6dW0ocC0+dnVzaG9ydCk7ZW1pdHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUZMT0FUKXt2bGRvdWJsZT16ZjJ6bGQocC0+dmZsb2F0KTtlbWl0emxkKGYsdmxkb3VibGUpO30KKyAgaWYodD09RE9VQkxFKXt2bGRvdWJsZT16ZDJ6bGQocC0+dmRvdWJsZSk7ZW1pdHpsZChmLHZsZG91YmxlKTt9CisgIGlmKHQ9PUxET1VCTEUpe2VtaXR6bGQoZixwLT52bGRvdWJsZSk7fQorICBpZih0PT1JTlQpe3ZtYXg9emkyem0ocC0+dmludCk7ZW1pdHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8SU5UKSl7dnVtYXg9enVpMnp1bShwLT52dWludCk7ZW1pdHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUxPTkcpe3ZtYXg9emwyem0ocC0+dmxvbmcpO2VtaXR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfExPTkcpKXt2dW1heD16dWwyenVtKHAtPnZ1bG9uZyk7ZW1pdHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUxMT05HKXt2bWF4PXpsbDJ6bShwLT52bGxvbmcpO2VtaXR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfExMT05HKSl7dnVtYXg9enVsbDJ6dW0ocC0+dnVsbG9uZyk7ZW1pdHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PU1BWElOVCl7ZW1pdHptKGYscC0+dm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8TUFYSU5UKSl7ZW1pdHp1bShmLHAtPnZ1bWF4KTt9CisgIC8qRklYTUUqLworICBpZih0PT1QT0lOVEVSKXt2dW1heD16dWwyenVtKHAtPnZ1bG9uZyk7ZW1pdHp1bShmLHZ1bWF4KTt9Cit9IAorCit2b2lkIGNvbnZfdHlwKHN0cnVjdCBUeXAgKnApCisvKiBFcnpldWd0IGV4dGVuZGVkIHR5cGVzIGluIGVpbmVtIFR5cC4gKi8KK3sKKyAgY2hhciAqYXR0cjsKKyAgd2hpbGUocCl7CisgICAgaWYoSVNTQ0FMQVIocC0+ZmxhZ3MpJiYocC0+ZmxhZ3MmTlEpIT1DSEFSJiYoYXR0cj1wLT5hdHRyKSYmc3Ryc3RyKGF0dHIsImJpZ2VuZGlhbiIpKXsKKyAgICAgIGlmKCFJU0JFKHAtPmZsYWdzKSkKKwlwLT5mbGFncysrOworICAgIH0KKyAgICBpZihJU1NDQUxBUihwLT5mbGFncykmJihwLT5mbGFncyZOUSkhPUNIQVImJihhdHRyPXAtPmF0dHIpJiZzdHJzdHIoYXR0ciwibGl0dGxlZW5kaWFuIikpeworICAgICAgaWYoSVNCRShwLT5mbGFncykpCisJcC0+ZmxhZ3MtLTsKKyAgICB9CisgICAgcD1wLT5uZXh0OworICB9Cit9CmRpZmYgLS1naXQgYS9tYWNoaW5lcy9pMzg2L21hY2hpbmUuZHQgYi9tYWNoaW5lcy9pMzg2L21hY2hpbmUuZHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDdiMWJmYQotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL2kzODYvbWFjaGluZS5kdApAQCAtMCwwICsxLDE2IEBACitTOEJTCitTOEJVCitTMTZCU0xFIFMxNkJTQkUKK1MxNkJVTEUgUzE2QlVCRQorUzMyQlNMRSBTMzJCU0JFCitTMzJCVUxFIFMzMkJVQkUKK1MzMkJTTEUgUzMyQlNCRQorUzMyQlVMRSBTMzJCVUJFCitTNjRCU0xFIFM2NEJTQkUKK1M2NEJVTEUgUzY0QlVCRQorUzMyQklFRUVMRQorUzY0QklFRUVMRQorUzY0QklFRUVMRQorUzMyQlVMRSBTMzJCVUJFCisKKwpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvaTM4Ni9tYWNoaW5lLmggYi9tYWNoaW5lcy9pMzg2L21hY2hpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YzFhZWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvaTM4Ni9tYWNoaW5lLmgKQEAgLTAsMCArMSwxNzYgQEAKKy8qICBFeGFtcGxlIG9mIGEgY29kZS1nZW5lcmF0b3IgZm9yIGFuIEludGVsIDM4NiBvciBoaWdoZXIuICAgICAgICAgKi8KKworI2luY2x1ZGUgImR0LmgiCisKKy8qIFdlIGhhdmUgZXh0ZW5kZWQgdHlwZXMhIFdoYXQgd2UgaGF2ZSB0byBkbyB0byBzdXBwb3J0IHRoZW06ICAgICAgKi8KKy8qIC0gI2RlZmluZSBIQVZFX0VYVF9UWVBFUworICAgLSAjdW5kZWYgYWxsIHN0YW5kYXJkIHR5cGVzCisgICAtICNkZWZpbmUgYWxsIHN0YW5kYXJkIHR5cGVzIHBsdXMgbmV3IHR5cGVzCisgICAtIHdyaXRlIGV2YWxfY29uc3QgYW5kIGluc2VydF9jb25zdAorICAgLSB3cml0ZSB0eXBlZGVmcyBmb3Igem1heCBhbmQgenVtYXgKKyAgIC0gd3JpdGUgdHlwbmFtZVtdCisgICAtIHdyaXRlIGNvbnZfdHlwKCkKKyAgIC0gb3B0aW9uYWxseSAjZGVmaW5lIElTUE9JTlRFUiwgSVNBUklUSCwgSVNJTlQgZXRjLgorICAgLSBvcHRpb25hbGx5ICNkZWZpbmUgSEFWRV9UR1RfUFJJTlRWQUwgYW5kIHdyaXRlIHByaW50dmFsCisgICAtIG9wdGlvbmFsbHkgI2RlZmluZSBQT0lOVEVSX1RZUEUKKyAgIC0gb3B0aW9uYWxseSAjZGVmaW5lIEhBVkVfVEdUX0ZBTElHTiBhbmQgd3JpdGUgZmFsaWduCisgICAtIG9wdGlvbmFsbHkgI2RlZmluZSBIQVZFX1RHVF9TWk9GIGFuZCB3cml0ZSBzem9mCisgICAtIG9wdGlvbmFsbHkgYWRkIGZ1bmN0aW9ucyBmb3IgYXR0cmlidXRlLWhhbmRsaW5nCisqLworI2RlZmluZSBIQVZFX0VYVF9UWVBFUyAxCisKKyNkZWZpbmUgSEFWRV9UR1RfUFJJTlRWQUwKKworI3VuZGVmIENIQVIKKyN1bmRlZiBTSE9SVAorI3VuZGVmIElOVAorI3VuZGVmIExPTkcKKyN1bmRlZiBMTE9ORworI3VuZGVmIEZMT0FUCisjdW5kZWYgRE9VQkxFCisjdW5kZWYgTERPVUJMRQorI3VuZGVmIFZPSUQKKyN1bmRlZiBQT0lOVEVSCisjdW5kZWYgQVJSQVkKKyN1bmRlZiBTVFJVQ1QKKyN1bmRlZiBVTklPTgorI3VuZGVmIEVOVU0KKyN1bmRlZiBGVU5LVAorI3VuZGVmIE1BWElOVAorI3VuZGVmIE1BWF9UWVBFCisKKyNkZWZpbmUgQ0hBUiAxCisjZGVmaW5lIFNIT1JUIDIKKyNkZWZpbmUgQlNIT1JUIDMKKyNkZWZpbmUgSU5UIDQKKyNkZWZpbmUgQklOVCA1CisjZGVmaW5lIExPTkcgNgorI2RlZmluZSBCTE9ORyA3CisjZGVmaW5lIExMT05HIDgKKyNkZWZpbmUgQkxMT05HIDkKKyNkZWZpbmUgRkxPQVQgMTAKKyNkZWZpbmUgQkZMT0FUIDExCisjZGVmaW5lIERPVUJMRSAxMgorI2RlZmluZSBCRE9VQkxFIDEzCisjZGVmaW5lIExET1VCTEUgMTQKKyNkZWZpbmUgQkxET1VCTEUgMTUKKyNkZWZpbmUgVk9JRCAxNgorI2RlZmluZSBQT0lOVEVSIDE3CisjZGVmaW5lIEJQT0lOVEVSIDE4CisjZGVmaW5lIEFSUkFZIDE5CisjZGVmaW5lIFNUUlVDVCAyMAorI2RlZmluZSBVTklPTiAyMQorI2RlZmluZSBFTlVNIDIyCisjZGVmaW5lIEZVTktUIDIzCisgCisjZGVmaW5lIE1BWElOVCAyNCAvKiBzaG91bGQgbm90IGJlIGFjY2VzaWJsZSB0byBhcHBsaWNhdGlvbiAqLworIAorI2RlZmluZSBNQVhfVFlQRSBNQVhJTlQKKworI2RlZmluZSBJU1BPSU5URVIoeCkgKCh4Jk5RKT09UE9JTlRFUnx8KHgmTlEpPT1CUE9JTlRFUikKKyNkZWZpbmUgSVNTQ0FMQVIoeCkgKCh4Jk5RKT49Q0hBUiYmKHgmTlEpPD1CUE9JTlRFUikKKyNkZWZpbmUgSVNJTlQoeCkgKCh4Jk5RKT49Q0hBUiYmKHgmTlEpPD1CTExPTkcpCisKK3R5cGVkZWYgemxsb25nIHptYXg7Cit0eXBlZGVmIHp1bGxvbmcgenVtYXg7CisKK3VuaW9uIGF0eXBzeworICB6Y2hhciB2Y2hhcjsKKyAgenVjaGFyIHZ1Y2hhcjsKKyAgenNob3J0IHZzaG9ydDsKKyAgenVzaG9ydCB2dXNob3J0OworICB6aW50IHZpbnQ7CisgIHp1aW50IHZ1aW50OworICB6bG9uZyB2bG9uZzsKKyAgenVsb25nIHZ1bG9uZzsKKyAgemxsb25nIHZsbG9uZzsKKyAgenVsbG9uZyB2dWxsb25nOworICB6bWF4IHZtYXg7CisgIHp1bWF4IHZ1bWF4OworICB6ZmxvYXQgdmZsb2F0OworICB6ZG91YmxlIHZkb3VibGU7CisgIHpsZG91YmxlIHZsZG91YmxlOworfTsKKworLyogIFRoaXMgc3RydWN0IGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBtYWNoaW5lLXNwZWNpZmljICAgICAgICAgICAqLworLyogIGFkZHJlc3NpbmctbW9kZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5vdCB1c2VkIGluIHRoaXMgY29kZS1nZW5lcnJhdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RydWN0IEFkZHJlc3NpbmdNb2RleworICBpbnQgbW9kZTsKKyAgaW50IGJhc2U7CisgIGludCBpZHg7CisgIGludCBzY2FsOworICB6bWF4IG9mZnNldDsKKyAgc3RydWN0IFZhciAqdjsKK307CisKKy8qICBUaGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUuICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFYUiAxOAorCisvKiAgTnVtYmVyIG9mIGNvbW1hbmRsaW5lLW9wdGlvbnMgdGhlIGNvZGUtZ2VuZXJhdG9yIGFjY2VwdHMuICAgICAgICovCisjZGVmaW5lIE1BWEdGIDEwCisKKy8qICBJZiB0aGlzIGlzIHNldCB0byB6ZXJvIHZiY2Mgd2lsbCBub3QgZ2VuZXJhdGUgSUNzIHdoZXJlIHRoZSAgICAgKi8KKy8qICB0YXJnZXQgb3BlcmFuZCBpcyB0aGUgc2FtZSBhcyB0aGUgMm5kIHNvdXJjZSBvcGVyYW5kLiAgICAgICAgICAgKi8KKy8qICBUaGlzIGNhbiBzb21ldGltZXMgc2ltcGxpZnkgdGhlIGNvZGUtZ2VuZXJhdG9yLCBidXQgdXN1YWxseSAgICAgKi8KKy8qICB0aGUgY29kZSBpcyBiZXR0ZXIgaWYgdGhlIGNvZGUtZ2VuZXJhdG9yIGFsbG93cyBpdC4gICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNFUTJBU1ogMQorCisvKiAgVGhpcyBzcGVjaWZpZXMgdGhlIHNtYWxsZXN0IGludGVnZXIgdHlwZSB0aGF0IGNhbiBiZSBhZGRlZCB0byBhICovCisvKiAgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JTkFEREkyUCBJTlQKKyNkZWZpbmUgTUFYQURESTJQIExPTkcKKworLyogIElmIHRoZSBieXRlcyBvZiBhbiBpbnRlZ2VyIGFyZSBvcmRlcmVkIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSAgICAqLworLyogIGJ5dGUgZmlyc3QgYW5kIHRoZW4gZGVjcmVhc2luZyBzZXQgQklHRU5ESUFOIHRvIDEuICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdFTkRJQU4gMAorCisvKiAgSWYgdGhlIGJ5dGVzIG9mIGFuIGludGVnZXIgYXJlIG9yZGVyZWQgbGVzdCBzaWduaWZpY2FudCBieXRlICAgICovCisvKiAgYnl0ZSBmaXJzdCBhbmQgdGhlbiBpbmNyZWFzaW5nIHNldCBMSVRUTEVFTkRJQU4gdG8gMS4gICAgICAgICAgICovCisjZGVmaW5lIExJVFRMRUVORElBTiAxCisKKy8qICBOb3RlIHRoYXQgQklHRU5ESUFOIGFuZCBMSVRUTEVFTkRJQU4gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gICAgKi8KKworLyogIElmIHN3aXRjaC1zdGF0ZW1lbnRzIHNob3VsZCBiZSBnZW5lcmF0ZWQgYXMgYSBzZXF1ZW5jZSBvZiAgICAgICAqLworLyogIFNVQixUU1QsQkVRIElDcyByYXRoZXIgdGhhbiBDT01QQVJFLEJFUSBJQ3Mgc2V0IHRoaXMgdG8gMS4gICAgICAqLworLyogIFRoaXMgY2FuIHlpZWxkIGJldHRlciBjb2RlIG9uIHNvbWUgbWFjaGluZXMuICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTV0lUQ0hTVUJTIDAKKworLyogIEluIG9wdGltaXppbmcgY29tcGlsYXRpb24gY2VydGFpbiBsaWJyYXJ5IG1lbWNweS9zdHJjcHktY2FsbHMgICAqLworLyogIHdpdGggbGVuZ3RoIGtub3duIGF0IGNvbXBpbGUtdGltZSB3aWxsIGJlIGlubGluZWQgdXNpbmcgYW4gICAgICAqLworLyogIEFTU0lHTi1JQyBpZiB0aGUgc2l6ZSBpcyBsZXNzIG9yIGVxdWFsIHRvIElOTElORU1FTUNQWS4gICAgICAgICAqLworLyogIFRoZSB0eXBlIHVzZWQgZm9yIHRoZSBBU1NJR04tSUMgd2lsbCBiZSBVTlNJR05FRHxDSEFSLiAgICAgICAgICAqLworI2RlZmluZSBJTkxJTkVNRU1DUFkgMTAyNAorCisvKiAgV2Uga2VlcCB0cmFjayBvZiBhbGwgcmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IGEgZnVuY3Rpb24uICAgICAgICAgICovCisjZGVmaW5lIEhBVkVfUkVHU19NT0RJRklFRCAxCisKKy8qIHNpemUgb2YgYnVmZmVyIGZvciBhc20tb3V0cHV0ICovCisjZGVmaW5lIEVNSVRfQlVGX0xFTiAxMDI0IC8qIHNob3VsZCBiZSBlbm91Z2ggKi8KKy8qIG51bWJlciBvZiBhc20tb3V0cHV0IGxpbmVzIGJ1ZmZlcmVkICovCisjZGVmaW5lIEVNSVRfQlVGX0RFUFRIIDQKKworLyogIFdlIGhhdmUgbm8gYXNtX3BlZXBob2xlIHRvIG9wdGltaXplIGFzc2VtYmx5LW91dHB1dCAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9QRUVQSE9MRSAwCisKKyNkZWZpbmUgSlVNUF9UQUJMRV9ERU5TSVRZIDAuOAorI2RlZmluZSBKVU1QX1RBQkxFX0xFTkdUSCA0CisKKy8qIFdlIHVzZSBidWlsdGluIGxpYmNhbGxzIGZvciBzb21lIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgSEFWRV9MSUJDQUxMUyAxCisKKy8qIHN1cHBvcnQgZm9yIHZhcmlhYmxlLWxlbmd0aCBhcnJheXMgKi8KKyNkZWZpbmUgQUxMT0NWTEFfUkVHIDEKKyNkZWZpbmUgQUxMT0NWTEFfSU5MSU5FQVNNICJcdHN1YmxcdCVlYXgsJWVzcFxuXHRhbmRsXHQkLTUsJWVzcFxuXHRtb3ZsXHQlZXNwLCVlYXgiCisvKiBUT0RPOiBmaW5kIGEgYmV0dGVyIHNvbHV0aW9uIHNvbWUgdGltZSAqLworI2RlZmluZSBGUkVFVkxBX1JFRyAwCisjZGVmaW5lIEZSRUVWTEFfSU5MSU5FQVNNICJcdG1vdmxcdCglZXNwKSwlZXNwXG5cdHN1YmxcdCQ0LCVlc3AiCisjZGVmaW5lIE9MRFNQVkxBX0lOTElORUFTTSAiXHRtb3ZsXHQlZXNwLCVlYXgiCisjZGVmaW5lIEZQVkxBX1JFRyA3CisKKy8qIGRvIG5vdCBjcmVhdGUgQ09OVkVSVF9JQ3MgZnJvbSBmbG9hdHMgdG8gdW5zaWduZWQgaW50ZWdlcnMgKi8KKyNkZWZpbmUgQVZPSURfRkxPQVRfVE9fVU5TSUdORUQgMQorCisvKiBkbyBub3QgY3JlYXRlIENPTlZFUlRfSUNzIGZyb20gdW5zaWduZWQgaW50ZWdlcnMgdG8gZmxvYXRzICovCisjZGVmaW5lIEFWT0lEX1VOU0lHTkVEX1RPX0ZMT0FUIDEKKwpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvbTY1L2NvbXByZXNzLmMgYi9tYWNoaW5lcy9tNjUvY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWYwMzNkCi0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvbTY1L2NvbXByZXNzLmMKQEAgLTAsMCArMSwxMjMgQEAKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJ2Y3ByLmgiCisKKworY29uc3QgY2hhciB0Z19jb3B5cmlnaHRbXT0iNjUwMiBjb2RlIGNvbXByZXNzb3IgVjAuMSAoYykgMjAyMCBieSBWb2xrZXIgQmFydGhlbG1hbm4iOworCitjaGFyICppbnN0W109eworICAibGRhIiwibGR4Iiwic3RhIiwic3R4IiwibGR5Iiwic3R5IiwKKyAgImFkYyIsInNiYyIsImFuZCIsIm9yYSIsImVvciIsCisgICJibmUiLCJiZXEiLCJiY2MiLCJiY3MiLCJidnMiLCJidmMiLCJicGwiLCJibWkiLAorICAiY2xjIiwic2VjIiwKKyAgLyoicGxhIiwicGhhIiwqLworICAidHhhIiwidGF4IiwidHlhIiwidGF5IiwKKyAgImluYyIsImRlYyIsImRleCIsImlueCIsImlueSIsImRleSIsCisgIC8qInJ0cyIsInJ0aSIsKi8ianNyIiwiam1wIiwKKyAgImNtcCIsImNweCIsImNweSIsCisgICJhc2wiLCJsc3IiLCJyb3IiLCJyb2wiCit9OworCitpbnQgbWluc2F2ZT01OworCit2b2lkIHBhcnNlX2xpbmUoY2hhciAqcyxsaW5lICpwKQoreworICBpbnQgbCxpOworICBzdGF0aWMgaW50IHNlY29rPTA7CisgIGNoYXIgYnVmWzE2XSxidWYyWzE2XSwqZTsKKworICBpZihzc2NhbmYocywiICU4cyAlOHMiLGJ1ZixidWYyKT09MiYmIXN0cmNtcChidWYsInNlY3Rpb24iKSl7CisgICAgaWYoIXN0cmNtcChidWYyLCJ0ZXh0IikpCisgICAgICBzZWNvaz0xOworICAgIGVsc2UKKyAgICAgIHNlY29rPTA7CisgICAgcC0+ZmxhZ3M9QkFSUklFUjsKKyAgICByZXR1cm47CisgIH0KKworICBpZihzc2NhbmYocywibCVkOiIsJmwpPT0xKXsKKyAgICBwLT5mbGFnc3w9TEFCREVGOworICAgIHAtPmwxPWw7CisgICAgcC0+c2l6ZT0wOworICAgIGlmKCFzZWNvaykgcC0+ZmxhZ3N8PUJBUlJJRVI7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYoIXNlY29rKXsKKyAgICBwLT5mbGFnc3w9QkFSUklFUjsKKyAgICByZXR1cm47CisgIH0KKworICBpZighaXNzcGFjZSgqcykpeworICAgIHAtPmZsYWdzPUJBUlJJRVI7CisgICAgcmV0dXJuOworICB9CisgIHdoaWxlKGlzc3BhY2UoKnMpKQorICAgIHMrKzsKKyAgZm9yKGU9cztpc2FscGhhKCplKTtlKyspOworCisgIGZvcihpPTA7aTxzaXplb2YoaW5zdCkvc2l6ZW9mKGluc3RbMF0pO2krKyl7CisgICAgaWYoIXN0cm5jbXAocyxpbnN0W2ldLGUtcykpeworICAgICAgd2hpbGUoaXNzcGFjZSgqZSkpIGUrKzsKKyAgICAgIGlmKCplPT0wKXsKKwlwLT5zaXplPTE7CisJcmV0dXJuOworICAgICAgfQorICAgICAgcC0+c2l6ZT0yOworICAgICAgaWYoc3NjYW5mKGUsImwlZCIsJmwpPT0xKXsKKwlwLT5mbGFnc3w9TEFCVVNFOworCXAtPmwxPWw7CisgICAgICB9CisgICAgICBpZigqcz09J2InfHwhc3RybmNtcChzLCJqbXAiLDMpKXsKKwlwLT5mbGFnc3w9QlJBTkNIOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBwLT5mbGFncz1CQVJSSUVSOworfQorCitzdGF0aWMgaW50IG5sYWI7CisKKyNkZWZpbmUgU0VDVElPTiAiXHRzZWN0aW9uXHR0ZXh0XG4iCisKK3ZvaWQgYWRkX2hlYWRlcihsaW5lICphZnRlcikKK3sKKyAgbmxhYj1uZXdfbGFiZWwoKTsKKyAgbGluZSAqbmV3OworICBuZXc9bmV3X2xpbmUoKTsKKyAgbmV3LT5mbGFncz1MQUJERUY7CisgIG5ldy0+bDE9bmxhYjsKKyAgbmV3LT5jb2RlPW15bWFsbG9jKDE2KTsgLyogVE9ETyAqLworICBzcHJpbnRmKG5ldy0+Y29kZSwieCVkOlxuIixubGFiKTsKKyAgaW5zZXJ0X2xpbmUoYWZ0ZXIsbmV3KTsKKyAgbmV3PW5ld19saW5lKCk7CisgIG5ldy0+ZmxhZ3M9QkFSUklFUjsKKyAgbmV3LT5jb2RlPW15bWFsbG9jKHN0cmxlbihTRUNUSU9OKSsxKTsKKyAgc3RyY3B5KG5ldy0+Y29kZSxTRUNUSU9OKTsKKyAgaW5zZXJ0X2xpbmUoYWZ0ZXIsbmV3KTsKK30KKwordm9pZCBhZGRfcmV0KGxpbmUgKmFmdGVyKQoreworICBsaW5lICpuZXc9bmV3X2xpbmUoKTsKKyAgbmV3LT5zaXplPTE7CisgIG5ldy0+ZmxhZ3M9QkFSUklFUjsKKyAgbmV3LT5jb2RlPW15bWFsbG9jKDgpOyAvKlRPRE8qLworICBzdHJjcHkobmV3LT5jb2RlLCJcdHJ0c1xuIik7CisgIGluc2VydF9saW5lKGFmdGVyLG5ldyk7Cit9CisKK3ZvaWQgYWRkX2pzcihsaW5lICphZnRlcikKK3sKKyAgbGluZSAqbmV3PW5ld19saW5lKCk7CisgIG5ldy0+ZmxhZ3M9TEFCVVNFOworICBuZXctPnNpemU9MzsKKyAgbmV3LT5sMT1ubGFiOworICBuZXctPmNvZGU9bXltYWxsb2MoMjQpOyAvKiBUT0RPICovCisgIHNwcmludGYobmV3LT5jb2RlLCJcdGpzclx0eCVkXG4iLG5sYWIpOworICBpbnNlcnRfbGluZShhZnRlcixuZXcpOworfQpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvbTY1L21hY2hpbmUuYyBiL21hY2hpbmVzL202NS9tYWNoaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU4MTlmMQotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL202NS9tYWNoaW5lLmMKQEAgLTAsMCArMSw1MTYzIEBACisvKiAgTUVHQTY1IDQ1R1MwMiBiYWNrZW5kIGZvciB2YmNjCisgICAgKGMpIFZvbGtlciBCYXJ0aGVsbWFubiAyMDIwCisgICAgKGMpIFBhdWwgR2FyZG5lci1TdGVwaGVuIDIwMjAKKworKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisjaW5jbHVkZSAic3VwcC5oIgorI2luY2x1ZGUgInZiYy5oIgorCisjaW5jbHVkZSA8bWF0aC5oPgorCitzdGF0aWMgY2hhciBGSUxFX1tdPV9fRklMRV9fOworCisvKiAgUHVibGljIGRhdGEgdGhhdCBNVVNUIGJlIHRoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogTmFtZSBhbmQgY29weXJpZ2h0LiAqLworY2hhciBjZ19jb3B5cmlnaHRbXT0idmJjYyA0NUdTMDIgKE1FR0E2NSkgY29kZS1nZW5lcmF0b3IgVjAuMSAoYykgaW4gMjAyMCBieSBWb2xrZXIgQmFydGhlbG1hbm4sIFBhdWwgR2FyZG5lci1TdGVwaGVuIjsKKworLyogIENvbW1hbmRsaW5lLWZsYWdzIHRoZSBjb2RlLWdlbmVyYXRvciBhY2NlcHRzOgorICAgIDA6IGp1c3QgYSBmbGFnCisgICAgVkFMRkxBRzogYSB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZAorICAgIFNUUklOR0ZMQUc6IGEgc3RyaW5nIGNhbiBiZSBzcGVjaWZpZWQKKyAgICBGVU5DRkxBRzogYSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZAorICAgIGFwYXJ0IGZyb20gRlVOQ0ZMQUcsIGFsbCBvdGhlciB2ZXJzaW9ucyBjYW4gb25seSBiZSBzcGVjaWZpZWQgb25jZSAqLworaW50IGdfZmxhZ3NbTUFYR0ZdPXswLDAsCisJCSAgICBWQUxGTEFHLDAsMCwKKwkJICAgIDAsMCwKKwkJICAgIFZBTEZMQUcsVkFMRkxBRywwLDAsCisJCSAgICBWQUxGTEFHLDAsMCwwLAorCQkgICAgMCwwLDAsCisJCSAgICAwfTsKKworLyogdGhlIGZsYWctbmFtZSwgZG8gbm90IHVzZSBuYW1lcyBiZWdpbm5pbmcgd2l0aCBsLCBMLCBJLCBEIG9yIFUsIGJlY2F1c2UKKyAgIHRoZXkgY29sbGlkZSB3aXRoIHRoZSBmcm9udGVuZCAqLworY2hhciAqZ19mbGFnc19uYW1lW01BWEdGXT17InN0ZC1zeW50YXgiLCJuby1yYXgiLAorCQkJICAgInZvbGF0aWxlLXJlZ3MiLCJpZWVlIiwibm8tcGVlcGhvbGUiLAorCQkJICAgImNibWFzY2lpIiwic29mdHN0YWNrIiwKKwkJCSAgICJyZWctYXJncyIsImludC1hcmdzIiwibWFpbmFyZ3MiLCJuby1iYW5rLXZhcnMiLAorCQkJICAgImNvbW1vbi1iYW5rbnIiLCJidG1wLXpwYWdlIiwib2xkZnAiLCJsYXJnZSIsCisJCQkgICAiZ2xvYi1hY2MiLCJhdm9pZC1iYW5rLXN3aXRjaCIsIm1hbnVhbC1iYW5raW5nIiwKKwkJCSAgICJhdGFzY2lpIiwiNjVjMDIifTsKKworLyogdGhlIHJlc3VsdHMgb2YgcGFyc2luZyB0aGUgY29tbWFuZC1saW5lLWZsYWdzIHdpbGwgYmUgc3RvcmVkIGhlcmUgKi8KK3VuaW9uIHBwaSBnX2ZsYWdzX3ZhbFtNQVhHRl07CisKKy8qICBBbGlnbm1lbnQtcmVxdWlyZW1lbnRzIGZvciBhbGwgdHlwZXMgaW4gYnl0ZXMuICAgICAgICAgICAgICAqLworem1heCBhbGlnbltNQVhfVFlQRSsxXTsKKworLyogIEFsaWdubWVudCB0aGF0IGlzIHN1ZmZpY2llbnQgZm9yIGV2ZXJ5IG9iamVjdC4gICAgICAgICAgICAgICovCit6bWF4IG1heGFsaWduOworCisvKiAgQ0hBUl9CSVQgZm9yIHRoZSB0YXJnZXQgbWFjaGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggY2hhcl9iaXQ7CisKKy8qICBzaXplcyBvZiB0aGUgYmFzaWMgdHlwZXMgKGluIGJ5dGVzKSAqLworem1heCBzaXpldGFiW01BWF9UWVBFKzFdOworCisvKiAgTWluaW11bSBhbmQgTWF4aW11bSB2YWx1ZXMgZWFjaCB0eXBlIGNhbiBoYXZlLiAgICAgICAgICAgICAgKi8KKy8qICBNdXN0IGJlIGluaXRpYWxpemVkIGluIGluaXRfY2coKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworem1heCB0X21pbltNQVhfVFlQRSsxXTsKK3p1bWF4IHRfbWF4W01BWF9UWVBFKzFdOworenVtYXggdHVfbWF4W01BWF9UWVBFKzFdOworCisvKiAgTmFtZXMgb2YgYWxsIHJlZ2lzdGVycy4gd2lsbCBiZSBpbml0aWFsaXplZCBpbiBpbml0X2NnKCksCisgICAgcmVnaXN0ZXIgbnVtYmVyIDAgaXMgaW52YWxpZCwgdmFsaWQgcmVnaXN0ZXJzIHN0YXJ0IGF0IDEgKi8KK2NoYXIgKnJlZ25hbWVzW01BWFIrMV07CisKKy8qICBUaGUgU2l6ZSBvZiBlYWNoIHJlZ2lzdGVyIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworem1heCByZWdzaXplW01BWFIrMV07CisKKy8qICBhIHR5cGUgd2hpY2ggY2FuIHN0b3JlIGVhY2ggcmVnaXN0ZXIuICovCitzdHJ1Y3QgVHlwICpyZWd0eXBlW01BWFIrMV07CisKKy8qICByZWdzYVtyZWddIT0wIGlmIGEgY2VydGFpbiByZWdpc3RlciBpcyBhbGxvY2F0ZWQgYW5kIHNob3VsZCAqLworLyogIG5vdCBiZSB1c2VkIGJ5IHRoZSBjb21waWxlciBwYXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitpbnQgcmVnc2FbTUFYUisxXTsKKworLyogIFNwZWNpZmllcyB3aGljaCByZWdpc3RlcnMgbWF5IGJlIHNjcmF0Y2hlZCBieSBmdW5jdGlvbnMuICAgICovCitpbnQgcmVnc2NyYXRjaFtNQVhSKzFdOworCisvKiBzcGVjaWZpZXMgdGhlIHByaW9yaXR5IGZvciB0aGUgcmVnaXN0ZXItYWxsb2NhdG9yLCBpZiB0aGUgc2FtZQorICAgZXN0aW1hdGVkIGNvc3Qtc2F2aW5nIGNhbiBiZSBvYnRhaW5lZCBieSBzZXZlcmFsIHJlZ2lzdGVycywgdGhlCisgICBvbmUgd2l0aCB0aGUgaGlnaGVzdCBwcmlvcml0eSB3aWxsIGJlIHVzZWQgKi8KK2ludCByZWdfcHJpb1tNQVhSKzFdOworCisvKiBhbiBlbXB0eSByZWctaGFuZGxlIHJlcHJlc2VudGluZyBpbml0aWFsIHN0YXRlICovCitzdHJ1Y3QgcmVnX2hhbmRsZSBlbXB0eV9yZWdfaGFuZGxlPXswLDB9OworCisvKiBOYW1lcyBvZiB0YXJnZXQtc3BlY2lmaWMgdmFyaWFibGUgYXR0cmlidXRlcy4gICAgICAgICAgICAgICAgKi8KK2NoYXIgKmdfYXR0cl9uYW1lW109eyJfX2ludGVycnVwdCIsIl9fenBhZ2UiLCJfX25vY3ByIiwwfTsKKworI2RlZmluZSBJTlRFUlJVUFQgMQorI2RlZmluZSBaUEFHRSAyCisjZGVmaW5lIE5PQ09NUFJFU1MgNAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBQcml2YXRlIGRhdGEgYW5kIGZ1bmN0aW9ucy4gICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU1REU1lOVEFYICAoZ19mbGFnc1swXSZVU0VERkxBRykKKyNkZWZpbmUgTk9SQVggICAgICAoZ19mbGFnc1sxXSZVU0VERkxBRykKKyNkZWZpbmUgVk9MX0dQUlMgICAoKGdfZmxhZ3NbMl0mVVNFREZMQUcpP2dfZmxhZ3NfdmFsWzJdLmw6TlVNX0dQUlMvMikKKyNkZWZpbmUgSUVFRSAgICAgICAoZ19mbGFnc1szXSZVU0VERkxBRykKKyNkZWZpbmUgTk9QRUVQICAgICAoZ19mbGFnc1s0XSZVU0VERkxBRykKKyNkZWZpbmUgQ0JNQVNDSUkgICAoZ19mbGFnc1s1XSZVU0VERkxBRykKKyNkZWZpbmUgU09GVFNUQUNLICAoZ19mbGFnc1s2XSZVU0VERkxBRykKKyNkZWZpbmUgR1BSX0FSR1MgICAoKGdfZmxhZ3NbN10mVVNFREZMQUcpP2dfZmxhZ3NfdmFsWzddLmw6OCkKKyNkZWZpbmUgTUFJTkFSR1MgICAoZ19mbGFnc1s5XSZVU0VERkxBRykKKyNkZWZpbmUgTk9CQU5LVkFSUyAoZ19mbGFnc1sxMF0mVVNFREZMQUcpCisjZGVmaW5lIENPTU1PTkJBTksgKChnX2ZsYWdzWzExXSZVU0VERkxBRyk/Z19mbGFnc192YWxbMTFdLmw6MCkKKyNkZWZpbmUgQklHWlBBR0UgICAoZ19mbGFnc1sxMl0mVVNFREZMQUcpCisjZGVmaW5lIE9MREZQICAgICAgKGdfZmxhZ3NbMTNdJlVTRURGTEFHKQorI2RlZmluZSBMQVJHRSAgICAgIChnX2ZsYWdzWzE0XSZVU0VERkxBRykKKyNkZWZpbmUgR0xPQkFDQyAgICAoZ19mbGFnc1sxNV0mVVNFREZMQUcpCisjZGVmaW5lIE5PU1dJVENIICAgKGdfZmxhZ3NbMTZdJlVTRURGTEFHKQorI2RlZmluZSBOT0JBTktJTkcgIChnX2ZsYWdzWzE3XSZVU0VERkxBRykKKyNkZWZpbmUgQVRBU0NJSSAgICAoZ19mbGFnc1sxOF0mVVNFREZMQUcpCisjZGVmaW5lIEMwMiAgICAgICAgKGdfZmxhZ3NbMTldJlVTRURGTEFHKQorCisKKworI2RlZmluZSBTVFJfTkVBUiAibmVhciIKKyNkZWZpbmUgU1RSX0ZBUiAiZmFyIgorI2RlZmluZSBTVFJfSFVHRSAiaHVnZSIKKworI2RlZmluZSBQTEEgKC0xKQorI2RlZmluZSBKTVBJTkQgKC0yKQorCitzdGF0aWMgdm9pZCBmdW5jdGlvbl90b3AoRklMRSAqLHN0cnVjdCBWYXIgKixsb25nKTsKK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX2JvdHRvbShGSUxFICpmLHN0cnVjdCBWYXIgKixsb25nKTsKKworI2RlZmluZSBpc3JlZyh4KSAoKHAtPnguZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRykKKyNkZWZpbmUgaXNhY2MoeCkgKGlzcmVnKHgpJiYocC0+eC5yZWc9PXJhfHxwLT54LnJlZz09cmF4KSkKKyNkZWZpbmUgaXNjb25zdCh4KSAoKHAtPnguZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpCisKKyNkZWZpbmUgaXNwdHIocikgKChyKT49RklSU1RfUEFJUiYmKHIpPD1MQVNUX1BBSVIpCisKK3N0YXRpYyBpbnQgcTFyZWcscTJyZWcsenJlZzsKKworc3RhdGljIGNoYXIgKmNjc1tdPXsiZXEiLCJuZSIsImx0IiwiZ2UiLCJsZSIsImd0IiwiIn07CitzdGF0aWMgY2hhciAqbG9naWNhbHNbXT17Im9yYSIsImVvciIsImFuZCJ9Oworc3RhdGljIGNoYXIgKmFyaXRobWV0aWNzW109eyJzbHciLCJzcnciLCJhZGMiLCJzYmMiLCJtdWxsdyIsImRpdnciLCJtb2QifTsKKworLyogYWxpZ25tZW50IG9mIGJhc2ljIGRhdGEtdHlwZXMsIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbGlnbltdICovCitzdGF0aWMgbG9uZyBtYWxpZ25bTUFYX1RZUEUrMV09ICB7MSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDF9OworLyogc2l6ZXMgb2YgYmFzaWMgZGF0YS10eXBlcywgdXNlZCB0byBpbml0aWFsaXplIHNpemV0YWJbXSAqLworc3RhdGljIGxvbmcgbXNpemV0YWJbTUFYX1RZUEUrMV09ezEsMSwyLDIsNCw4LDQsNCw0LDAsMiwzLDMsMCwwLDAsMSwwfTsKK3N0YXRpYyBjaGFyICptcmVnbmFtZXNbTUFYUisxXTsKKworLyogVHlwZW5hbWVzIChuZWVkZWQgYmVjYXVzZSBvZiBIQVZFX0VYVF9UWVBFUykuICovCitjaGFyICp0eXBuYW1lW109eyJzdHJhbmdlIiwiY2hhciIsInNob3J0IiwiaW50IiwibG9uZyIsImxvbmcgbG9uZyIsCisgICAgICAgICAgICAgICAgICJmbG9hdCIsImRvdWJsZSIsImxvbmcgZG91YmxlIiwidm9pZCIsCisgICAgICAgICAgICAgICAgICJuZWFyLXBvaW50ZXIiLCJmYXItcG9pbnRlciIsImh1Z2UtcG9pbnRlciIsCisgICAgICAgICAgICAgICAgICJhcnJheSIsInN0cnVjdCIsInVuaW9uIiwiZW51bSIsImZ1bmN0aW9uIn07CisKKworLyogdXNlZCB0byBpbml0aWFsaXplIHJlZ3R5cFtdICovCitzdGF0aWMgc3RydWN0IFR5cCBpdHlwPXtJTlR9LGN0eXA9e0NIQVJ9LGZ0eXA9e0ZMT0FUfSxsbHR5cD17TExPTkd9OworCisvKiBtYWNyb3MgZGVmaW5lZCBieSB0aGUgYmFja2VuZCAqLworc3RhdGljIGNoYXIgKm1hcnJheVtdPXsiX19zZWN0aW9uKHgpPV9fdmF0dHIoXCJzZWN0aW9uKFwiI3hcIilcIikiLAorCQkgICAgICAgIl9fbTY1X18iLCAKKwkJICAgICAgICJfX1NJWkVfVF9JTlQiLAorCQkgICAgICAgIl9fYmFuayh4KT1fX3ZhdHRyKFwiYmFuayhcIiN4XCIpXCIpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIl9fZmFyPV9fYXR0cihcImZhclwiKSIsCisgICAgICAgICAgICAgICAgICAgICAgICJfX25lYXI9X19hdHRyKFwibmVhclwiKSIsCisgICAgICAgICAgICAgICAgICAgICAgICJfX2h1Z2U9X19hdHRyKFwiaHVnZVwiKSIsCisJCSAgICAgICAwfTsKKworLyogc3BlY2lhbCByZWdpc3RlcnMgKi8KK3N0YXRpYyBpbnQgcmE9MSwgcng9Miwgcnk9Mywgcno9NCwgc3AxPTUsc3AyPTYsc3A9NyxmcCxmcDEsZnAyOworc3RhdGljIGludCB0ND1MQVNUX0dQUix0Mz1MQVNUX0dQUi0xLHQyPUxBU1RfR1BSLTIsdDE9TEFTVF9HUFItMzsKK3N0YXRpYyBpbnQgcmF4PTg7CitzdGF0aWMgaW50IHJheHl6PTk7CitzdGF0aWMgaW50IHl2YWw7CisjZGVmaW5lIE5PVkFMIDEwMDAKKworc3RhdGljIGludCB0MSx0MixmMSxmMjsgLyp0T0RPOiByZW1vdmUqLworCitzdGF0aWMgaW50IHB1c2hlZGFjYyxwdXNoZWR4LG5vcGVlcCxjYm1hc2NpaSxhdGFzY2lpLGllZWU7CitzdGF0aWMgaW50IGMwMixub3k7CitzdGF0aWMgaW50IGhhc19pbmNfYT0xOyAgICAgICAgICAgICAgICAvLyBNRUdBNjUgaGFzIElOQyBBIC8gSU5BIGluc3RydWN0aW9uCitzdGF0aWMgaW50IGhhc196ZXJvX3JlZz0wOworc3RhdGljIGNoYXIgKmptcGluc3Q7CitzdGF0aWMgaW50IHBhc3M7CitzdGF0aWMgaW50IGxpYnNhdmU7CitzdGF0aWMgc3RydWN0IHJwYWlyIHJwMjsKK3N0YXRpYyBpbnQgY2Jhbms7CitzdGF0aWMgVmFyIGJhbmt2Oworc3RhdGljIGludCBiYW5rdm9mZnNldDsKK3N0YXRpYyBpbnQgYmFua2NudW07CitzdGF0aWMgb2JqIHpzdG9yZTsKK3N0YXRpYyBpbnQgenN0b3JlZmxhZzsKKworI2RlZmluZSBTRUNMRU4gMTI4CitjaGFyICp1c2Vfc2VjOworaW50IHVzZV9iYW5rPS0xOworCisjZGVmaW5lIGR0KHQpICgoKHQpJlVOU0lHTkVEKT91ZHRbKHQpJk5RXTpzZHRbKHQpJk5RXSkKK3N0YXRpYyBjaGFyICpzZHRbTUFYX1RZUEUrMV09eyI/PyIsImMiLCJzIiwiaSIsImwiLCJsbCIsImYiLCJkIiwibGQiLCJ2IiwicCJ9Oworc3RhdGljIGNoYXIgKnVkdFtNQVhfVFlQRSsxXT17Ij8/IiwidWMiLCJ1cyIsInVpIiwidWwiLCJ1bGwiLCJmIiwiZCIsImxkIiwidiIsInAifTsKKworLyogcGVyaGFwcyBwcm92aWRlIHZlcnNpb24gd2l0aCA4Yml0IGludD8gKi8KKyNkZWZpbmUgSVNDSEFSKHQpICgodCZOUSk9PUNIQVIpCisjZGVmaW5lIElTU0hPUlQodCkgKCh0Jk5RKT09U0hPUlR8fCh0Jk5RKT09SU5UfHwodCZOUSk9PVBPSU5URVIpCisjZGVmaW5lIElTRlBPSU5URVIodCkgKCh0Jk5RKT09RlBPSU5URVIpCisjZGVmaW5lIElTTE9ORyh0KSAoKHQmTlEpPT1MT05HKQorI2RlZmluZSBJU0xMT05HKHQpICgodCZOUSk9PUxMT05HKQorCisjZGVmaW5lIElTSURYKHIpIChyPT1yeHx8cj09cnopCisKKy8qIGFtICovCisjZGVmaW5lIElNTV9JTkQgMQorI2RlZmluZSBHUFJfSU5EIDIKKyNkZWZpbmUgQUJTX0lORCAzCisKKy8qIHNlY3Rpb25zICovCisjZGVmaW5lIERBVEEgMAorI2RlZmluZSBCU1MgMQorI2RlZmluZSBDT0RFIDIKKyNkZWZpbmUgUk9EQVRBIDMKKyNkZWZpbmUgU1BFQ0lBTCA0CisKK3N0YXRpYyBsb25nIHN0YWNrOworc3RhdGljIGludCBzdGFja192YWxpZDsKK3N0YXRpYyBpbnQgc2VjdGlvbj0tMSxuZXdvYmo7CitzdGF0aWMgY2hhciAqY29kZW5hbWU9Ilx0c2VjdGlvblx0dGV4dCIsCisgICpkYXRhbmFtZT0iXHRzZWN0aW9uXHRkYXRhIiwKKyAgKmJzc25hbWU9Ilx0c2VjdGlvblx0YnNzIiwKKyAgKnJvZGF0YW5hbWU9Ilx0c2VjdGlvblx0cm9kYXRhIjsKKworLyogcmV0dXJuLWluc3RydWN0aW9uICovCitzdGF0aWMgY2hhciAqcmV0OworCisvKiBsYWJlbCBhdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiAoaWYgYW55KSAqLworc3RhdGljIGludCBleGl0X2xhYmVsOworCisvKiBhc3NlbWJseS1wcmVmaXhlcyBmb3IgbGFiZWxzIGFuZCBleHRlcm5hbCBpZGVudGlmaWVycyAqLworc3RhdGljIGNoYXIgKmxhYnByZWZpeD0ibCIsKmlkcHJlZml4PSJfIjsKKworLyogdmFyaWFibGVzIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBhbmQgcGFydGl0aW9uaW5nIG9mIHRoZSBzdGFjay1mcmFtZQorICAgaW4gdGhlIGNhc2Ugb2YgRklYRURfU1AgKi8KK3N0YXRpYyBsb25nIGZyYW1lb2Zmc2V0LHB1c2hlZCxtYXhwdXNoZWQsZnJhbWVzaXplOworCitzdGF0aWMgbG9uZyBsb2NhbHNpemUscnNhdmVzaXplLHJzY250LGFyZ3NpemU7CisKK3N0YXRpYyB2b2lkIGVtaXRfb2JqKEZJTEUgKmYsc3RydWN0IG9iaiAqcCxpbnQgdCk7CisKKy8qIGNhbGN1bGF0ZSB0aGUgYWN0dWFsIGN1cnJlbnQgb2Zmc2V0IG9mIGFuIG9iamVjdCByZWxhdGl2IHRvIHRoZQorICAgc3RhY2stcG9pbnRlcjsgd2UgdXNlIGEgbGF5b3V0IGxpa2UgdGhpczoKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCBhcmd1bWVudHMgdG8gdGhpcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICB8CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHwgY2FsbGVyLXNhdmUgcmVnaXN0ZXJzIFtzaXplPXJzYXZlc2l6ZV0gICAgICAgfAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB8IGxvY2FsIHZhcmlhYmxlcyBbc2l6ZT1sb2NhbHNpemVdICAgICAgICAgICAgIHwKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCBhcmd1bWVudHMgdG8gY2FsbGVkIGZ1bmN0aW9ucyBbc2l6ZT1hcmdzaXplXSB8CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEFsbCBzaXplcyB3aWxsIGJlIGFsaWduZWQgYXMgbmVjZXNzYXJ5LgorICAgSW4gdGhlIGNhc2Ugb2YgRklYRURfU1AsIHRoZSBzdGFjay1wb2ludGVyIHdpbGwgYmUgYWRqdXN0ZWQgYXQKKyAgIGZ1bmN0aW9uLWVudHJ5IHRvIGxlYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhlIGFyZ3VtZW50cyBhbmQgaGF2ZSBpdAorICAgYWxpZ25lZCB0byAxNiBieXRlcy4gVGhlcmVmb3JlLCB3aGVuIGNhbGxpbmcgYSBmdW5jdGlvbiwgdGhlCisgICBzdGFjay1wb2ludGVyIGlzIGFsd2F5cyBhbGlnbmVkIHRvIDE2IGJ5dGVzLgorICAgRm9yIGEgbW92aW5nIHN0YWNrLXBvaW50ZXIsIHRoZSBzdGFjay1wb2ludGVyIHdpbGwgdXN1YWxseSBwb2ludAorICAgdG8gdGhlIGJvdHRvbSBvZiB0aGUgYXJlYSBmb3IgbG9jYWwgdmFyaWFibGVzLCBidXQgd2lsbCBtb3ZlIHdoaWxlCisgICBhcmd1bWVudHMgYXJlIHB1dCBvbiB0aGUgc3RhY2suCisKKyAgIFRoaXMgaXMganVzdCBhbiBleGFtcGxlIGxheW91dC4gT3RoZXIgbGF5b3V0cyBhcmUgYWxzbyBwb3NzaWJsZS4KKyovCisKK3N0YXRpYyBpbnQgYmFuayhWYXIgKnYpCit7CisgIGNoYXIgKnM9di0+dmF0dHI7CisgIGludCBuLHI7CisgIGlmKCFOT0JBTktJTkcmJnMmJihzPXN0cnN0cihzLCJiYW5rKCIpKSl7CisgICAgaWYoc3NjYW5mKHMrNSwiJWkiLCZuKT09MSkKKyAgICAgIHJldHVybiBuOworICB9CisgIHJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgZWJhbmsoRklMRSAqZixpbnQgYikKK3sKKyAgaWYoYj49MCkgZW1pdChmLCIlZCIsYik7CisgIGVtaXQoZiwiXG4iKTsKK30KKworc3RhdGljIGxvbmcgcmVhbF9vZmZzZXQoc3RydWN0IG9iaiAqbykKK3sKKyAgbG9uZyBvZmY9em0ybChvLT52LT5vZmZzZXQpOworICBpZihvZmY8MCl7CisgICAgLyogZnVuY3Rpb24gcGFyYW1ldGVyICovCisgICAgb2ZmPWxvY2Fsc2l6ZStyc2F2ZXNpemUtb2ZmLXptMmwobWF4YWxpZ24pOworICB9CisKKyAgb2ZmKz1hcmdzaXplOworICBvZmYrPXptMmwoby0+dmFsLnZtYXgpOworICByZXR1cm4gb2ZmOworfQorCisvKiAgSW5pdGlhbGl6ZXMgYW4gYWRkcmVzc2luZy1tb2RlIHN0cnVjdHVyZSBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8KKyAgICB0aGF0IG9iamVjdC4gV2lsbCBub3Qgc3Vydml2ZSBhIHNlY29uZCBjYWxsISAqLworc3RhdGljIHN0cnVjdCBvYmogKmNhbShpbnQgZmxhZ3MsaW50IGJhc2UsbG9uZyBvZmZzZXQpCit7CisgIHN0YXRpYyBzdHJ1Y3Qgb2JqIG9iajsKKyAgc3RhdGljIHN0cnVjdCBBZGRyZXNzaW5nTW9kZSBhbTsKKyAgb2JqLmFtPSZhbTsKKyAgYW0uZmxhZ3M9ZmxhZ3M7CisgIGFtLmJhc2U9YmFzZTsKKyAgYW0ub2Zmc2V0PW9mZnNldDsKKyAgcmV0dXJuICZvYmo7Cit9CisKKy8qIGNoYW5nZXMgdG8gYSBzcGVjaWFsIHNlY3Rpb24sIHVzZWQgZm9yIF9fc2VjdGlvbigpICovCitzdGF0aWMgaW50IHNwZWNpYWxfc2VjdGlvbihGSUxFICpmLHN0cnVjdCBWYXIgKnYpCit7CisgIGNoYXIgKnNlYzsKKyAgaWYodi0+dGF0dHImWlBBR0UpeworICAgIGVtaXQoZiwiXHRzZWN0aW9uXHR6cGFnZVxuIik7CisgIH1lbHNleworICAgIGlmKCF2LT52YXR0cikgcmV0dXJuIDA7CisgICAgc2VjPXN0cnN0cih2LT52YXR0ciwic2VjdGlvbigiKTsKKyAgICBpZighc2VjKSByZXR1cm4gMDsKKyAgICBzZWMrPXN0cmxlbigic2VjdGlvbigiKTsKKyAgICBlbWl0KGYsIlx0c2VjdGlvblx0Iik7CisgICAgd2hpbGUoKnNlYyYmKnNlYyE9JyknKSBlbWl0X2NoYXIoZiwqc2VjKyspOworICAgIGVtaXQoZiwiXG4iKTsKKyAgfQorICBpZihmKSBzZWN0aW9uPVNQRUNJQUw7CisgIHJldHVybiAxOworfQorCisKKworI2RlZmluZSBjaGtfY29sbCh4KSBkb3tpZigoeCk9PXJ8fCh4KT09cjF8fCh4KT09cjIpIHJldHVybiAwOwlcCisgICAgaWYocmVnX3BhaXIoKHgpLCZycCkmJihycC5yMT09cnx8cnAucjI9PXIpKSByZXR1cm4gMDt9d2hpbGUoMCkKKworc3RhdGljIGludCBzY3JhdGNoKElDICpwLGludCByKQoreworICBpbnQgcjEscjI7CisgIGlmKCFwKSByZXR1cm4gMTsKKyAgaWYocmVnX3BhaXIociwmcnApKXsKKyAgICByMT1ycC5yMTsKKyAgICByMj1ycC5yMjsKKyAgfWVsc2V7CisgICAgcjE9MDsKKyAgICByMj0wOworICB9CisgIGlmKGlzcmVnKHopJiZwLT56LnJlZz09cil7CisgICAgaWYoIShwLT5xMi5mbGFncyZSRUcpKQorICAgICAgcmV0dXJuIDE7CisgICAgaWYocC0+cTIucmVnPT1yfHxwLT5xMi5yZWc9PXIxfHxwLT5xMi5yZWc9PXIyKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYocmVnX3BhaXIocC0+cTIucmVnLCZycCkpCisgICAgICBpZihycC5yMT09cnx8cnAucjI9PXIpCisJcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgd2hpbGUocCl7CisgICAgaWYocC0+Y29kZT09TEFCRUx8fHAtPmNvZGU9PUNBTEwpCisgICAgICByZXR1cm4gMDsKKyAgICBpZihwLT5jb2RlPj1CRVEmJnAtPmNvZGU8PUJSQSkKKyAgICAgIHJldHVybiAwOworICAgIGlmKHAtPmNvZGU9PUZSRUVSRUd8fHAtPmNvZGU9PUFMTE9DUkVHKXsKKyAgICAgIGlmKHAtPnExLnJlZz09cikKKwlyZXR1cm4gMTsKKyAgICAgIGlmKHJlZ19wYWlyKHAtPnExLnJlZywmcnApJiYocnAucjE9PXJ8fHJwLnIyPT1yKSkKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgaWYocC0+cTEuYW0pIGNoa19jb2xsKHAtPnExLmFtLT5iYXNlKTsKKyAgICBpZihwLT5xMi5hbSkgY2hrX2NvbGwocC0+cTIuYW0tPmJhc2UpOworICAgIGlmKHAtPnouYW0pIGNoa19jb2xsKHAtPnouYW0tPmJhc2UpOworICAgIGlmKHAtPnExLmZsYWdzJlJFRykgY2hrX2NvbGwocC0+cTEucmVnKTsKKyAgICBpZihwLT5xMi5mbGFncyZSRUcpIGNoa19jb2xsKHAtPnEyLnJlZyk7CisgICAgaWYocC0+ei5mbGFncyZSRUcpeworICAgICAgaWYocC0+ei5mbGFncyZEUkVGT0JKKQorCWNoa19jb2xsKHAtPnoucmVnKTsKKyAgICAgIGVsc2V7CisJaWYocC0+ei5yZWc9PXIpCisJICByZXR1cm4gMTsKKwlpZihyZWdfcGFpcihwLT56LnJlZywmcnApJiYocnAucjE9PXJ8fHJwLnIyPT1yKSkKKwkgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKworICAgIHA9cC0+bmV4dDsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCByc2F2ZWN1cjsKK3N0YXRpYyBpbnQgaW5faXNyOworCitzdGF0aWMgaW50IGdldF9yZWcoRklMRSAqZixJQyAqcCxpbnQgdCkKK3sKKyAgaW50IHIscjEscjIscGFzcyxmbGFnOworCisgIGZvcihwYXNzPTA7cGFzczw1O3Bhc3MrKyl7CisgICAgZm9yKHI9TUFYUjtyPnNwO3ItLSl7CisgICAgICBpZihyZWdfcGFpcihyLCZycCkpeworCXIxPXJwLnIxOworCXIyPXJwLnIyOworICAgICAgfWVsc2V7CisJcjE9MDsKKwlyMj0wOworICAgICAgfQorICAgICAgaWYoKHBhc3M9PTB8fHBhc3M9PTMpJiYoIXJlZ3NjcmF0Y2hbcl18fGluX2lzcikpCisJY29udGludWU7CisgICAgICBpZihwYXNzPDMpeworCWlmKHJlZ3Nbcl0pIGNvbnRpbnVlOworCWlmKHIxJiYocmVnc1tyMV18fHJlZ3NbcjJdKSkgY29udGludWU7CisgICAgICB9CisgICAgICBpZihwYXNzPT0yJiYhKHJlZ3Nbcl0mNCkpCisJY29udGludWU7CisgICAgICBpZigocC0+cTEuZmxhZ3MmUkVHKSYmKHAtPnExLnJlZz09cnx8cC0+cTEucmVnPT1yMXx8cC0+cTEucmVnPT1yMikpIGNvbnRpbnVlOworICAgICAgaWYoKHAtPnEyLmZsYWdzJlJFRykmJihwLT5xMi5yZWc9PXJ8fHAtPnEyLnJlZz09cjF8fHAtPnEyLnJlZz09cjIpKSBjb250aW51ZTsKKyAgICAgIGlmKChwLT56LmZsYWdzJlJFRykmJihwLT56LnJlZz09cnx8cC0+ei5yZWc9PXIxfHxwLT56LnJlZz09cjIpKSBjb250aW51ZTsKKyAgICAgIGlmKHJlZ29rKHIsdCwxKSl7CisJZmxhZz04OworCWlmKHJlZ3Nbcl0peworCSAgZmxhZ3w9MjsKKwkgIGlmKHAtPmNvZGU9PUNPTVBBUkV8fHAtPmNvZGU9PVRFU1QpCisJICAgIGllcnJvcigwKTsKKwkgIGlmKHJlZ3NbcmFdKXsKKwkgICAgZW1pdChmLCJcdHRheVxuIik7CisJICAgIHl2YWw9Tk9WQUw7CisJICB9CisJICBpZihyMSl7CisJICAgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tyMV0pOworCSAgICBlbWl0KGYsIlx0cGhhXG4iKTsKKwkgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3IyXSk7CisJICAgIGVtaXQoZiwiXHRwaGFcbiIpOworCSAgfWVsc2V7CisJICAgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgIGVtaXQoZiwiXHRwaGFcbiIpOworCSAgfQorCSAgaWYocmVnc1tyYV0pCisJICAgIGVtaXQoZiwiXHR0eWFcbiIpOworCX0KKwlpZihyMSl7CisJICByZWdzW3IxXXw9ZmxhZzsKKwkgIHJlZ3NbcjJdfD1mbGFnOworCX0KKwlyZWdzW3JdfD1mbGFnOworCXJlZ3VzZWRbcl09MTsKKwlyZWd1c2VkW3IxXT0xOworCXJlZ3VzZWRbcjJdPTE7CisJcmV0dXJuIHI7CisgICAgICB9CisgICAgfQorICB9CisgIHByaWMyKHN0ZG91dCxwKTsKKyAgaWVycm9yKDApOworfQorCitzdGF0aWMgdm9pZCBnZXRfYWNjKEZJTEUgKmYsIElDICpwLGludCB0KQoreworICBpbnQgcjsKKyAgaWYoaXNhY2MoeikpIHJldHVybjsKKyAgdCY9TlE7CisgIGlmKElTQ0hBUih0KSl7CisgICAgaWYoMS8qIWlzcmVnKHExKXx8KHAtPnExLnJlZyE9cmEmJnAtPnExLnJlZyE9cmF4KSovKXsKKyAgICAgIGlmKChyZWdzW3JhXXx8cmVnc1tyYXhdKSYmIXNjcmF0Y2gocCxyYSkmJiFwdXNoZWRhY2MpeworCWlmKG9wdHNpemV8fChyZWdzW3QxXSYmcmVnc1t0Ml0mJnJlZ3NbdDNdJiZyZWdzW3Q0XSkpeworCSAgZW1pdChmLCJcdHBoYVxuIik7CisJICBwdXNoZWRhY2M9LTE7CisJfWVsc2V7CisJICByPWdldF9yZWcoZixwLENIQVIpOworCSAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgIHB1c2hlZGFjYz1yOworCX0KKyAgICAgIH0KKyAgICB9CisgIH1lbHNleworICAgIGlmKDEvKiFpc3JlZyhxMSl8fHAtPnExLnJlZyE9cmF4Ki8peworICAgICAgaWYoKHJlZ3NbcmFdfHxyZWdzW3JheF0pJiYoIXNjcmF0Y2gocCxyYSl8fCFzY3JhdGNoKHAscmF4KSkmJiFwdXNoZWRhY2MpeworCXI9Z2V0X3JlZyhmLHAsQ0hBUik7CisJZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwlwdXNoZWRhY2M9cjsKKyAgICAgIH0KKyAgICAgIGlmKChyZWdzW3J4XXx8cmVnc1tyYXhdKSYmIXNjcmF0Y2gocCxyYXgpJiYhcHVzaGVkeCl7CisJcj1nZXRfcmVnKGYscCxDSEFSKTsKKwllbWl0KGYsIlx0c3R4XHQlc1xuIixtcmVnbmFtZXNbcl0pOworCXB1c2hlZHg9cjsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIGludCBjbXBfZ2V0X2FjYyhGSUxFICpmLElDICpwLElDICpicmFuY2gpCit7CisgIGlmKCFyZWdzW3JhXSYmIXJlZ3NbcmF4XSkKKyAgICByZXR1cm4gMDsKKyAgaWYoYnJhbmNoPT0wJiZwdXNoZWRhY2MpCisgICAgcmV0dXJuIDA7CisgIGlmKGJyYW5jaCYmaXNyZWcocTEpJiYocC0+cTEucmVnPT1yYXx8cC0+cTEucmVnPT1yYXgpKQorICAgIGlmKGJyYW5jaC0+Y29kZT09QkVRfHxicmFuY2gtPmNvZGU9PUJORXx8KHAtPnR5cGYmVU5TSUdORUQpKQorICAgICAgcmV0dXJuIDA7CisgIGlmKHNjcmF0Y2gocCxyYSkpCisgICAgcmV0dXJuIDA7CisgIGlmKCFyZWdzW3J4XSYmIXJlZ3NbcmF4XSl7CisgICAgZW1pdChmLCJcdHRheFxuIik7CisgICAgcHVzaGVkYWNjPXJ4OworICB9CisgIGVtaXQoZiwiXHRwaGFcbiIpOworICBwdXNoZWRhY2M9LTE7CisgIHJldHVybiBwdXNoZWRhY2M7Cit9CisKK3N0YXRpYyB2b2lkIHJlbG9hZF9hY2Nfb3B0KEZJTEUgKmYsSUMgKnApCit7CisgIGlmKHB1c2hlZGFjYz09MCkgcmV0dXJuOworICBpZihwdXNoZWRhY2M+MCl7CisgICAgd2hpbGUocCl7CisgICAgICBpZihwLT5jb2RlIT1GUkVFUkVHKSBicmVhazsKKyAgICAgIGlmKHAtPnExLnJlZz09cmF8fHAtPnExLnJlZz09cmF4KXsKKwlwdXNoZWRhY2M9MDsKKwlyZXR1cm47CisgICAgICB9CisgICAgICBwPXAtPm5leHQ7CisgICAgfQorICB9CisgIGlmKHB1c2hlZGFjYz09LTEpCisgICAgZW1pdChmLCJcdHBsYVxuIik7CisgIGVsc2UgaWYocHVzaGVkYWNjPT1yeCkKKyAgICBlbWl0KGYsIlx0dHhhXG4iKTsKKyAgZWxzZSBpZihwdXNoZWRhY2M9PXJ5KQorICAgIGVtaXQoZiwiXHR0eWFcbiIpOworICBlbHNlIGlmKHB1c2hlZGFjYyl7CisgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3B1c2hlZGFjY10pOworICAgIHJlZ3NbcHVzaGVkYWNjXSY9fjg7CisgIH0KKyAgcHVzaGVkYWNjPTA7Cit9CisKK3N0YXRpYyB2b2lkIHJlbG9hZF9hY2MoRklMRSAqZikKK3sKKyAgcmVsb2FkX2FjY19vcHQoZiwwKTsKK30KKworc3RhdGljIHZvaWQgcHVzaChpbnQgaSkKK3sKKyAgcHVzaGVkLT1pOworICBpZihwdXNoZWQ8bWF4cHVzaGVkKQorICAgIG1heHB1c2hlZD1wdXNoZWQ7Cit9CisKK3N0YXRpYyB2b2lkIHBvcChpbnQgaSkKK3sKKyAgcHVzaGVkKz1pOworICBpZihwdXNoZWQ+MCkgaWVycm9yKDApOworfQorCitzdGF0aWMgaW50IGluZGlyZWN0KG9iaiAqbykKK3sKKyAgaWYoKG8tPmZsYWdzJihEUkVGT0JKfEtPTlNUKSk9PURSRUZPQkopCisgICAgcmV0dXJuIDE7CisgIGlmKChvLT5mbGFncyYoUkVHfFZBUikpIT1WQVIpeworICAgIGlmKG8tPnJlZz09cmF8fElTSURYKG8tPnJlZyl8fG8tPnJlZz09cmF4KQorICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYoby0+di0+c3RvcmFnZV9jbGFzcz09QVVUT3x8by0+di0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCit2b2lkIGNvbnZmbG9hdCh2b2lkKQoreworfSAgCisKK3ZvaWQgc2V0eShGSUxFICpmLGludCB2YWwpCit7CisgIGlmKHl2YWw9PXZhbCkKKyAgICByZXR1cm47CisgIGlmKHZhbC15dmFsPT0xKQorICAgIGVtaXQoZiwiXHRpbnlcbiIpOworICBlbHNlIGlmKHl2YWwtdmFsPT0xKQorICAgIGVtaXQoZiwiXHRkZXlcbiIpOworICBlbHNleworICAgIGVtaXQoZiwiXHRsZHlcdCMlZFxuIix2YWwpOworICAgIGlmKHZhbDwwfHx2YWw+MjU1KQorICAgICAgaWVycm9yKDApOworICB9CisgIHl2YWw9dmFsOworfQorCitzdGF0aWMgdm9pZCBjbnZfZnAodm9pZCkKK3sKKyAgZG91YmxlIGQsbWFudDsKKyAgaW50IGV4cDsKKyAgdW5zaWduZWQgbG9uZyB0OworCisgIGlmKGllZWUpeworICAgIHZmbG9hdD16bGQyemYodmxkb3VibGUpOworICAgIG1lbWNweSgodm9pZCopJnZtYXgsKHZvaWQqKSZ2ZmxvYXQsNCk7CisgIH1lbHNleworICAgIGQ9emxkMmQodmxkb3VibGUpOworICAgIG1hbnQ9ZnJleHAoZCwmZXhwKTsKKyAgICBleHA9KGV4cCsxMjcpJjI1NTsKKyAgICB0PSgodW5zaWduZWQgbG9uZykobWFudCo4Mzg4NjA4KSkmMHhmZmZmZmY7CisgICAgdHw9KChsb25nKWV4cCk8PDI0OworICAgIAorICAgIHQ9KCh0JjB4ZmYpPDwyNCl8KCh0JjB4ZmYwMCk8PDgpfCgodCYweGZmMDAwMCk+PjgpfCgodCYweGZmMDAwMDAwKT4+MjQpOworICAgIHZtYXg9bDJ6bSgobG9uZyl0KTsKKyAgICBpZihtYW50PT0wJiZkPT0wKSB2bWF4PVowOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfaWVlZShGSUxFICpmLHVuaW9uIGF0eXBzICpwLGludCB0KQoreworICB1bnNpZ25lZCBjaGFyICppcD0odW5zaWduZWQgY2hhciAqKSZwLT52ZG91YmxlOworICBlbWl0KGYsIjB4JTAyeCUwMngsMHglMDJ4JTAyeCIsaXBbMV0saXBbMF0saXBbM10saXBbMl0pOworICBpZih0PT1ET1VCTEV8fHQ9PUxET1VCTEUpCisgICAgZW1pdChmLCIsMHglMDJ4JTAyeCwweCUwMnglMDJ4IixpcFs1XSxpcFs0XSxpcFs3XSxpcFs2XSk7CisgIGVtaXQoZiwiXG4iKTsKK30KKworc3RhdGljIHZvaWQgZW1pdF9sb2J5dGUoRklMRSAqZixvYmogKm8saW50IHQpCit7CisgIGlmKG8tPmZsYWdzJktPTlNUKXsKKyAgICBpZihvLT5mbGFncyZEUkVGT0JKKXsKKyAgICAgIGV2YWxfY29uc3QoJm8tPnZhbCxvLT5kdHlwKTsKKyAgICAgICBlbWl0KGYsIiVkIix6bTJsKHZtYXgpKTsKKyAgICB9ZWxzZXsKKyAgICAgIGV2YWxfY29uc3QoJm8tPnZhbCx0KTsKKyAgICAgIGlmKElTRkxPQVQodCkpIGNudl9mcCgpOworICAgICAgZW1pdChmLCIjJWQiLHptMmwodm1heCkmMjU1KTsKKyAgICB9CisgIH1lbHNlIGlmKG8tPmZsYWdzJlZBUkFEUil7CisgICAgZW1pdChmLCIjPCgiKTsKKyAgICBlbWl0X29iaihmLG8sdCk7CisgICAgZW1pdChmLCIpIik7CisgIH1lbHNlIGlmKChvLT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKyAgICBpZighcmVnX3BhaXIoby0+cmVnLCZycCkpCisgICAgICBlbWl0KGYsIiVzIixtcmVnbmFtZXNbby0+cmVnXSk7CisgICAgZWxzZQorICAgICAgZW1pdChmLCIlcyIsbXJlZ25hbWVzW3JwLnIxXSk7CisgIH1lbHNleworICAgIGlmKGMwMiYmKG8tPmZsYWdzJihEUkVGT0JKfEtPTlNUKSk9PURSRUZPQkopIG5veT0xOworICAgIGVtaXRfb2JqKGYsbyx0KTsKKyAgICBub3k9MDsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBlbWl0X2hpYnl0ZShGSUxFICpmLG9iaiAqbyxpbnQgdCkKK3sKKyAgaWYoby0+ZmxhZ3MmS09OU1QpeworICAgIGlmKG8tPmZsYWdzJkRSRUZPQkopeworICAgICAgZXZhbF9jb25zdCgmby0+dmFsLG8tPmR0eXApOworICAgICAgZW1pdChmLCIlZCIsem0ybCh2bWF4KSsxKTsKKyAgICB9ZWxzZXsKKyAgICAgIGV2YWxfY29uc3QoJm8tPnZhbCx0KTsKKyAgICAgIGlmKElTRkxPQVQodCkpIGNudl9mcCgpOworICAgICAgZW1pdChmLCIjJWQiLCh6bTJsKHZtYXgpPj44KSYyNTUpOworICAgIH0KKyAgfWVsc2UgaWYoby0+ZmxhZ3MmVkFSQURSKXsKKyAgICBlbWl0KGYsIiM+KCIpOworICAgIGVtaXRfb2JqKGYsbyx0KTsKKyAgICBlbWl0KGYsIikiKTsKKyAgfWVsc2UgaWYoKG8tPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpeworICAgIGlmKG8tPnJlZz49RklSU1RfQklHJiZvLT5yZWc8PUxBU1RfQklHUCl7CisgICAgICBlbWl0KGYsIiVzKzEiLG1yZWduYW1lc1tvLT5yZWddKTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKCFyZWdfcGFpcihvLT5yZWcsJnJwKSkKKwlpZXJyb3IoMCk7CisgICAgICBlbWl0KGYsIiVzIixtcmVnbmFtZXNbcnAucjJdKTsKKyAgICB9CisgIH1lbHNleworICAgIGlmKG8tPmZsYWdzJlZBUkFEUikKKyAgICAgIGVtaXQoZiwiIyIpOworICAgIGlmKCEoby0+ZmxhZ3MmRFJFRk9CSikpCisgICAgICBvLT52YWwudm1heD16bWFkZChvLT52YWwudm1heCxaMSk7CisgICAgZW1pdF9vYmooZixvLHQpOworICAgIGlmKCEoby0+ZmxhZ3MmRFJFRk9CSikpCisgICAgICBvLT52YWwudm1heD16bXN1YihvLT52YWwudm1heCxaMSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgZW1pdF9ieXRlMyhGSUxFICpmLG9iaiAqbyxpbnQgdCkKK3sKKyAgaWYoby0+ZmxhZ3MmS09OU1QpeworICAgIGlmKG8tPmZsYWdzJkRSRUZPQkopeworICAgICAgZXZhbF9jb25zdCgmby0+dmFsLG8tPmR0eXApOworICAgICAgZW1pdChmLCIlZCIsem0ybCh2bWF4KSsyKTsKKyAgICB9ZWxzZXsKKyAgICAgIGV2YWxfY29uc3QoJm8tPnZhbCx0KTsKKyAgICAgIGlmKElTRkxPQVQodCkpIGNudl9mcCgpOworICAgICAgZW1pdChmLCIjJWQiLCh6bTJsKHZtYXgpPj4xNikmMjU1KTsKKyAgICB9CisgIH1lbHNlIGlmKChvLT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKyAgICBlbWl0KGYsIiVzKzIiLG1yZWduYW1lc1tvLT5yZWddKTsKKyAgfWVsc2UgaWYoby0+ZmxhZ3MmVkFSQURSKXsKKyAgICBlbWl0KGYsIiMlZCIsYmFuayhvLT52KSk7CisgIH1lbHNleworICAgIGlmKCEoby0+ZmxhZ3MmRFJFRk9CSikpCisgICAgICBvLT52YWwudm1heD16bWFkZChvLT52YWwudm1heCxsMnptKDJMKSk7CisgICAgZW1pdF9vYmooZixvLHQpOworICAgIGlmKCEoby0+ZmxhZ3MmRFJFRk9CSikpCisgICAgICBvLT52YWwudm1heD16bXN1YihvLT52YWwudm1heCxsMnptKDJMKSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgZW1pdF9ieXRlNChGSUxFICpmLG9iaiAqbyxpbnQgdCkKK3sKKyAgaWYoby0+ZmxhZ3MmS09OU1QpeworICAgIGlmKG8tPmZsYWdzJkRSRUZPQkopeworICAgICAgZXZhbF9jb25zdCgmby0+dmFsLG8tPmR0eXApOworICAgICAgZW1pdChmLCIlZCIsem0ybCh2bWF4KSszKTsKKyAgICB9ZWxzZXsKKyAgICAgIGV2YWxfY29uc3QoJm8tPnZhbCx0KTsKKyAgICAgIGlmKElTRkxPQVQodCkpIGNudl9mcCgpOworICAgICAgZW1pdChmLCIjJWQiLCh6bTJsKHZtYXgpPj4yNCkmMjU1KTsKKyAgICB9CisgIH1lbHNlIGlmKChvLT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKyAgICBlbWl0KGYsIiVzKzMiLG1yZWduYW1lc1tvLT5yZWddKTsKKyAgfWVsc2V7CisgICAgaWYoIShvLT5mbGFncyZEUkVGT0JKKSkKKyAgICAgIG8tPnZhbC52bWF4PXptYWRkKG8tPnZhbC52bWF4LGwyem0oM0wpKTsKKyAgICBlbWl0X29iaihmLG8sdCk7CisgICAgaWYoIShvLT5mbGFncyZEUkVGT0JKKSkKKyAgICAgIG8tPnZhbC52bWF4PXptc3ViKG8tPnZhbC52bWF4LGwyem0oM0wpKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBkb19sb2J5dGUoRklMRSAqZixjaGFyICpzLG9iaiAqbyxpbnQgdHlwZSkKK3sKKyAgaWYoby0+YW0peworICAgIGlmKG8tPmFtLT5mbGFncz09SU1NX0lORCkKKyAgICAgIHNldHkoZixvLT5hbS0+b2Zmc2V0KTsKKyAgICBlbHNlIGlmKG8tPmFtLT5mbGFncz09R1BSX0lORHx8by0+YW0tPmZsYWdzPT1BQlNfSU5EKXsKKyAgICAgIGlmKG8tPmFtLT5pZHg9PXJhKQorCWVtaXQoZiwiXHR0YXlcbiIpOworICAgICAgZWxzZXsKKwlpZihJU0lEWChvLT5hbS0+aWR4KSl7CisJICBpZihvLT5hbS0+ZmxhZ3M9PUdQUl9JTkQpeworCSAgICBlbWl0KGYsIlx0cGhhXG4iKTsKKwkgICAgZW1pdChmLCJcdHQlc2FcbiIsbXJlZ25hbWVzW28tPmFtLT5pZHhdKTsKKwkgICAgZW1pdChmLCJcdHRheVxuIik7CisJICAgIGVtaXQoZiwiXHRwbGFcbiIpOworCSAgfQorCX1lbHNlCisJICBlbWl0KGYsIlx0bGR5XHQlc1xuIixtcmVnbmFtZXNbby0+YW0tPmlkeF0pOworICAgICAgfQorICAgICAgeXZhbD1OT1ZBTDsKKyAgICB9ZWxzZQorICAgICAgaWVycm9yKDApOworICB9ZWxzZSBpZigoby0+ZmxhZ3MmKERSRUZPQkp8S09OU1QpKT09RFJFRk9CSil7CisgICAgaWYoIWMwMikgc2V0eShmLDApOworICB9ZWxzZSBpZigoby0+ZmxhZ3MmKFZBUnxSRUd8VkFSQURSKSk9PVZBUiYmKG8tPnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fG8tPnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKSl7CisgICAgc2V0eShmLChpbnQpcmVhbF9vZmZzZXQobykpOworICB9CisgIGVtaXQoZiwiXHQlc1x0IixzKTsKKyAgZW1pdF9sb2J5dGUoZixvLHR5cGUpOworICBlbWl0KGYsIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2hpYnl0ZShGSUxFICpmLGNoYXIgKnMsb2JqICpvLGludCB0eXBlKQoreworICBpbnQgYW1pPTA7CisgIGlmKG8tPmFtKXsKKyAgICBpZihvLT5hbS0+ZmxhZ3M9PUlNTV9JTkQpCisgICAgICBzZXR5KGYsby0+YW0tPm9mZnNldCsxKTsKKyAgICBlbHNlIGlmKG8tPmFtLT5mbGFncz09QUJTX0lORCl7CisgICAgICBpZihvLT5hbS0+b2Zmc2V0PT1yYSkKKwllbWl0KGYsIlx0dGF5XG4iKTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIlx0bGR5XHQlc1xuIixtcmVnbmFtZXNbby0+YW0tPmlkeF0pOworICAgICAgby0+YW0tPm9mZnNldCsrO2FtaT0xOworICAgICAgeXZhbD1OT1ZBTDsKKyAgICB9ZWxzZQorICAgICAgaWVycm9yKDApOworICB9ZWxzZSAgaWYoKG8tPmZsYWdzJihEUkVGT0JKfEtPTlNUKSk9PURSRUZPQkopeworICAgIHNldHkoZiwxKTsKKyAgfWVsc2UgaWYoKG8tPmZsYWdzJihWQVJ8UkVHfFZBUkFEUikpPT1WQVImJihvLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikpeworICAgIHNldHkoZiwoaW50KXJlYWxfb2Zmc2V0KG8pKzEpOworICB9CisgIGVtaXQoZiwiXHQlc1x0IixzKTsKKyAgZW1pdF9oaWJ5dGUoZixvLHR5cGUpOworICBlbWl0KGYsIlxuIik7CisgIGlmKGFtaSkgby0+YW0tPm9mZnNldC0tOworfQorCitzdGF0aWMgdm9pZCBkb19ieXRlMyhGSUxFICpmLGNoYXIgKnMsb2JqICpvLGludCB0eXBlKQoreworICBpbnQgYW1pPTA7CisgIGlmKG8tPmFtKXsKKyAgICBpZihvLT5hbS0+ZmxhZ3M9PUlNTV9JTkQpCisgICAgICBzZXR5KGYsby0+YW0tPm9mZnNldCsyKTsKKyAgICBlbHNlIGlmKG8tPmFtLT5mbGFncz09QUJTX0lORCl7CisgICAgICBpZihvLT5hbS0+b2Zmc2V0PT1yYSkKKwllbWl0KGYsIlx0dGF5XG4iKTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIlx0bGR5XHQlc1xuIixtcmVnbmFtZXNbby0+YW0tPmlkeF0pOworICAgICAgeXZhbD1OT1ZBTDsKKyAgICAgIG8tPmFtLT5vZmZzZXQrPTI7YW1pPTE7CisgICAgfWVsc2UKKyAgICAgIGllcnJvcigwKTsKKyAgfWVsc2UgIGlmKChvLT5mbGFncyYoRFJFRk9CSnxLT05TVCkpPT1EUkVGT0JKKXsKKyAgICBzZXR5KGYsMik7CisgIH1lbHNlIGlmKChvLT5mbGFncyYoVkFSfFJFR3xWQVJBRFIpKT09VkFSJiYoby0+di0+c3RvcmFnZV9jbGFzcz09QVVUT3x8by0+di0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpKXsKKyAgICBzZXR5KGYsKGludClyZWFsX29mZnNldChvKSsyKTsKKyAgfQorICBlbWl0KGYsIlx0JXNcdCIscyk7CisgIGVtaXRfYnl0ZTMoZixvLHR5cGUpOworICBlbWl0KGYsIlxuIik7CisgIGlmKGFtaSkgby0+YW0tPm9mZnNldC09MjsKK30KKworc3RhdGljIHZvaWQgZG9fYnl0ZTQoRklMRSAqZixjaGFyICpzLG9iaiAqbyxpbnQgdHlwZSkKK3sKKyAgaW50IGFtaT0wOworICBpZihvLT5hbSl7CisgICAgaWYoby0+YW0tPmZsYWdzPT1JTU1fSU5EKQorICAgICAgc2V0eShmLG8tPmFtLT5vZmZzZXQrMyk7CisgICAgZWxzZSBpZihvLT5hbS0+ZmxhZ3M9PUFCU19JTkQpeworICAgICAgaWYoby0+YW0tPm9mZnNldD09cmEpCisJZW1pdChmLCJcdHRheVxuIik7CisgICAgICBlbHNlCisJZW1pdChmLCJcdGxkeVx0JXNcbiIsbXJlZ25hbWVzW28tPmFtLT5pZHhdKTsKKyAgICAgIHl2YWw9Tk9WQUw7CisgICAgICBvLT5hbS0+b2Zmc2V0Kz0zO2FtaT0xOworICAgIH1lbHNlCisgICAgICBpZXJyb3IoMCk7CisgIH1lbHNlICBpZigoby0+ZmxhZ3MmKERSRUZPQkp8S09OU1QpKT09RFJFRk9CSil7CisgICAgc2V0eShmLDMpOworICB9ZWxzZSBpZigoby0+ZmxhZ3MmKFZBUnxSRUd8VkFSQURSKSk9PVZBUiYmKG8tPnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fG8tPnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKSl7CisgICAgc2V0eShmLChpbnQpcmVhbF9vZmZzZXQobykrMyk7CisgIH0KKyAgZW1pdChmLCJcdCVzXHQiLHMpOworICBlbWl0X2J5dGU0KGYsbyx0eXBlKTsKKyAgZW1pdChmLCJcbiIpOworICBpZihhbWkpIG8tPmFtLT5vZmZzZXQtPTM7Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfbG9ieXRlKEZJTEUgKmYsb2JqICpvLGludCB0KQoreworICBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgaWYoby0+cmVnPT1yYXx8by0+cmVnPT1yYXgpCisgICAgICByZXR1cm47CisgICAgaWYoby0+cmVnPT1yeCl7CisgICAgICBlbWl0KGYsIlx0dHhhXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgZG9fbG9ieXRlKGYsImxkYSIsbyx0KTsKK30KKworc3RhdGljIHZvaWQgbG9hZF9oaWJ5dGUoRklMRSAqZixvYmogKm8saW50IHQpCit7CisgIGlmKChvLT5mbGFncyZSRUcpJiYoby0+cmVnPT1yeHx8by0+cmVnPT1yYXgpKQorICAgIGVtaXQoZiwiXHR0eGFcbiIpOworICBlbHNlCisgICAgZG9faGlieXRlKGYsImxkYSIsbyx0KTsKK30KKworc3RhdGljIHZvaWQgc3RvcmVfbG9ieXRlKEZJTEUgKmYsb2JqICpvLGludCB0KQoreworICBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgaWYoby0+cmVnPT1yYXx8by0+cmVnPT1yYXgpCisgICAgICByZXR1cm47CisgICAgaWYoby0+cmVnPT1yeCl7CisgICAgICBlbWl0KGYsIlx0dGF4XG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgZG9fbG9ieXRlKGYsInN0YSIsbyx0KTsKK30KKworc3RhdGljIHZvaWQgc3RvcmVfaGlieXRlKEZJTEUgKmYsb2JqICpvLGludCB0KQoreworICBpZigoby0+ZmxhZ3MmUkVHKSYmKG8tPnJlZz09cnh8fG8tPnJlZz09cmF4KSkKKyAgICBlbWl0KGYsIlx0dGF4XG4iKTsKKyAgZWxzZQorICAgIGRvX2hpYnl0ZShmLCJzdGEiLG8sdCk7Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfYWNjKEZJTEUgKmYsb2JqICpvLGludCB0eXBlKQoreworICBpZigoby0+ZmxhZ3MmUkVHKSYmKG8tPnJlZz09cmF8fG8tPnJlZz09cmF4KSkKKyAgICByZXR1cm47CisgIGlmKCFJU0NIQVIodHlwZSkpeworICAgIGlmKGluZGlyZWN0KG8pKXsKKyAgICAgIGRvX2hpYnl0ZShmLCJsZGEiLG8sdHlwZSk7CisgICAgICBlbWl0KGYsIlx0dGF4XG4iKTsKKyAgICB9ZWxzZQorICAgICAgZG9faGlieXRlKGYsImxkeCIsbyx0eXBlKTsKKyAgfQorICBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmby0+cmVnPT1yeCkKKyAgICBlbWl0KGYsIlx0dHhhXG4iKTsKKyAgZWxzZQorICAgIGRvX2xvYnl0ZShmLCJsZGEiLG8sdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3JlX2FjYyhGSUxFICpmLG9iaiAqbyxpbnQgdHlwZSkKK3sKKyAgaWYoKG8tPmZsYWdzJihEUkVGT0JKfEtPTlNUKSk9PURSRUZPQkomJigoIShvLT5mbGFncyZSRUcpKXx8IWlzcHRyKG8tPnJlZykpKXsKKyAgICBpZXJyb3IoMCk7CisgIH0KKyAgaWYoKG8tPmZsYWdzJlJFRykmJihvLT5yZWc9PXJhfHxvLT5yZWc9PXJheCkpCisgICAgcmV0dXJuOworICBpZigoby0+ZmxhZ3MmUkVHKSYmby0+cmVnPT1yeCl7CisgICAgZW1pdChmLCJcdHRheFxuIik7CisgICAgcmV0dXJuOworICB9CisgIHN0b3JlX2xvYnl0ZShmLG8sdHlwZSk7CisgIGlmKCFJU0NIQVIodHlwZSkpeworICAgIGlmKGluZGlyZWN0KG8pKXsKKyAgICAgIC8qVE9ETzogc2F2ZSBhY2N1ICovCisgICAgICBlbWl0KGYsIlx0dHhhXG4iKTsKKyAgICAgIHN0b3JlX2hpYnl0ZShmLG8sdHlwZSk7CisgICAgfWVsc2UKKyAgICAgIGRvX2hpYnl0ZShmLCJzdHgiLG8sdHlwZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgbG9hZF9yZWcoRklMRSAqZixpbnQgcixzdHJ1Y3Qgb2JqICpvLGludCB0eXBlKQoreworICBzdGF0aWMgb2JqIHJvOworICBpZihJU0lEWChyKSYmIWluZGlyZWN0KG8pKXsKKyAgICBzdGF0aWMgY2hhciBsZHJbNF09ImxkciI7CisgICAgbGRyWzJdPW1yZWduYW1lc1tyXVswXTsKKyAgICBkb19sb2J5dGUoZixsZHIsbyx0eXBlKTsKKyAgICByZXR1cm47CisgIH0KKyAgcm8uZmxhZ3M9UkVHOworICByby5yZWc9cjsKKyAgbG9hZF9sb2J5dGUoZixvLHR5cGUpOworICBzdG9yZV9sb2J5dGUoZiwmcm8sdHlwZSk7CisgIGlmKCFJU0NIQVIodHlwZSkpeworICAgIGxvYWRfaGlieXRlKGYsbyx0eXBlKTsKKyAgICBzdG9yZV9oaWJ5dGUoZiwmcm8sdHlwZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgc3RvcmVfcmVnKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdHlwZSkKK3sKKyAgc3RhdGljIG9iaiBybzsKKyAgaWYoSVNJRFgocikpeworICAgIGlmKChvLT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKyAgICAgIGlmKG8tPnJlZz09cikKKwlyZXR1cm47CisgICAgICBpZihvLT5yZWc9PXJhKXsKKwllbWl0KGYsIlx0dCVzYVxuIixtcmVnbmFtZXNbcl0pOworCXJldHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoIWluZGlyZWN0KG8pKXsKKyAgICAgIHN0YXRpYyBjaGFyIHN0cls0XT0ic3RyIjsKKyAgICAgIHN0clsyXT1tcmVnbmFtZXNbcl1bMF07CisgICAgICBkb19sb2J5dGUoZixzdHIsbyx0eXBlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgcm8uZmxhZ3M9UkVHOworICByby5yZWc9cjsKKyAgaWYociE9cmEmJnIhPXJheCkKKyAgICBsb2FkX2FjYyhmLCZybyx0eXBlKTsKKyAgc3RvcmVfYWNjKGYsbyx0eXBlKTsKK30KKworc3RhdGljIHN0cnVjdCBmcGNvbnN0bGlzdCB7CisgIHN0cnVjdCBmcGNvbnN0bGlzdCAqbmV4dDsKKyAgaW50IGxhYmVsOworICBpbnQgdDsKKyAgdW5pb24gYXR5cHMgdmFsOworfSAqZmlyc3RmcGM7CisKK3N0YXRpYyBpbnQgYWRkZnBjb25zdChzdHJ1Y3Qgb2JqICpvLGludCB0KQoreworICBzdHJ1Y3QgZnBjb25zdGxpc3QgKnA9Zmlyc3RmcGM7CisgIHQmPU5ROworICBpZih0PT1MRE9VQkxFKSB0PURPVUJMRTsKKyAgZm9yKHA9Zmlyc3RmcGM7cDtwPXAtPm5leHQpeworICAgIGlmKHQ9PXAtPnQpeworICAgICAgZXZhbF9jb25zdCgmcC0+dmFsLHQpOworICAgICAgaWYodD09RkxPQVQmJnpsZGVxdG8odmxkb3VibGUsemYyemxkKG8tPnZhbC52ZmxvYXQpKSkgcmV0dXJuIHAtPmxhYmVsOworICAgICAgaWYodD09RE9VQkxFJiZ6bGRlcXRvKHZsZG91YmxlLHpkMnpsZChvLT52YWwudmRvdWJsZSkpKSByZXR1cm4gcC0+bGFiZWw7CisgICAgICBpZih0PT1MT05HJiZ6bWVxdG8odm1heCx6bDJ6bShvLT52YWwudmxvbmcpKSkgcmV0dXJuIHAtPmxhYmVsOworICAgICAgaWYodD09TExPTkcmJnptZXF0byh2bWF4LHpsbDJ6bShvLT52YWwudmxsb25nKSkpIHJldHVybiBwLT5sYWJlbDsKKyAgICB9CisgIH0KKyAgcD1teW1hbGxvYyhzaXplb2Yoc3RydWN0IGZwY29uc3RsaXN0KSk7CisgIHAtPm5leHQ9Zmlyc3RmcGM7CisgIHAtPnQ9dDsKKyAgcC0+bGFiZWw9KytsYWJlbDsKKyAgcC0+dmFsPW8tPnZhbDsKKyAgZmlyc3RmcGM9cDsKKyAgcmV0dXJuIHAtPmxhYmVsOworfQorCisvKiBnZW5lcmF0ZSBjb2RlIHRvIGxvYWQgdGhlIGFkZHJlc3Mgb2YgYSBsb2NhbCB2YXJpYWJsZSBpbnRvIHJlZ2lzdGVyIHIgKi8KK3N0YXRpYyB2b2lkIGxvYWRfbGFkZHIoRklMRSAqZixpbnQgcixzdHJ1Y3Qgb2JqICpvKQoreworICBsb25nIGw9cmVhbF9vZmZzZXQobyk7CisgIC8qIGFzc3VtZXMgYWNjIGlzIGF2YWlsYWJsZSAqLworICBpZighcmVnX3BhaXIociwmcnApKSBpZXJyb3IoMCk7CisgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tmcF0pOworICBpZihsIT0wKQorICAgIGVtaXQoZiwiXHRjbGNcbiIpOworICBpZihsJjI1NSkKKyAgICBlbWl0KGYsIlx0YWRjXHQjJWxkXG4iLGwmMjU1KTsKKyAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tmcDJdKTsKKyAgaWYobCE9MCkKKyAgICBlbWl0KGYsIlx0YWRjXHQjJWxkXG4iLChsPj44KSYyNTUpOworICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsKK30KKworLyogZ2VuZXJhdGUgY29kZSB0byBsb2FkIHRoZSBhZGRyZXNzIG9mIGEgdmFyaWFibGUgaW50byByZWdpc3RlciByICovCitzdGF0aWMgdm9pZCBsb2FkX2FkZHJlc3MoRklMRSAqZixpbnQgcixzdHJ1Y3Qgb2JqICpvLGludCB0KQoreworICBpZihvLT5mbGFncyZEUkVGT0JKKXsKKyAgICBvLT5mbGFncyY9fkRSRUZPQko7CisgICAgbG9hZF9yZWcoZixyLG8sUE9JTlRFUik7CisgICAgby0+ZmxhZ3N8PURSRUZPQko7CisgIH1lbHNlIGlmKChvLT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKyAgICBpZighcmVnX3BhaXIociwmcnApKSBpZXJyb3IoMCk7CisgICAgZW1pdChmLCJcdGxkYVx0Iz4lc1xuIixtcmVnbmFtZXNbby0+cmVnXSk7CisgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIyXSk7CisgICAgZW1pdChmLCJcdGxkYVx0Izwlc1xuIixtcmVnbmFtZXNbby0+cmVnXSk7CisgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7ICAgIAorICB9ZWxzZSBpZihvLT5mbGFncyZWQVIpeworICAgIGlmKG8tPnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fG8tPnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKXsKKyAgICAgIGxvYWRfbGFkZHIoZixyLG8pOworICAgIH1lbHNleworICAgICAgby0+ZmxhZ3N8PVZBUkFEUjsKKyAgICAgIGxvYWRfcmVnKGYscixvLFBPSU5URVIpOworICAgICAgby0+ZmxhZ3MmPX5WQVJBRFI7CisgICAgfQorICB9ZWxzZSBpZigoby0+ZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworICAgIGludCBsPWFkZGZwY29uc3Qobyx0KTsKKyAgICBpZighaWVlZSkgaWVycm9yKDApOworICAgIGlmKCFyZWdfcGFpcihyLCZycCkpIGllcnJvcigwKTsKKyAgICBlbWl0KGYsIlx0bGRhXHQjPiVzJWRcbiIsbGFicHJlZml4LGwpOworICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworICAgIGVtaXQoZiwiXHRsZGFcdCM8JXMlZFxuIixsYWJwcmVmaXgsbCk7CisgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7ICAgIAorICB9ZWxzZQorICAgIGllcnJvcigwKTsKK30KKworCisvKiAgWWllbGRzIGxvZzIoeCkrMSBvciAwLiAqLworc3RhdGljIGxvbmcgcG9mMih6dW1heCB4KQoreworICB6dW1heCBwO2ludCBsbj0xOworICBwPXVsMnp1bSgxTCk7CisgIHdoaWxlKGxuPD0zMiYmenVtbGVxKHAseCkpeworICAgIGlmKHp1bWVxdG8oeCxwKSkgcmV0dXJuIGxuOworICAgIGxuKys7cD16dW1hZGQocCxwKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW5jbWVtKEZJTEUgKmYsb2JqICpvLGludCB0LGludCBvcCxpbnQgeCkKK3sKKyAgaW50IGksaWR4PTA7CisgIGNoYXIgKnM7CisgIGlmKChvLT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZJU0lEWChvLT5yZWcpKXsKKyAgICBzdGF0aWMgY2hhciBidWZbNF09IiAgICI7CisgICAgaWR4PTE7cz1idWY7CisgICAgaWYob3A9PUFERCl7c1swXT0naSc7c1sxXT0nbic7fWVsc2V7c1swXT0nZCc7c1sxXT0nZSc7fQorICAgIHNbMl09bXJlZ25hbWVzW28tPnJlZ11bMF07CisgIH1lbHNlIGlmKG9wPT1BREQpCisgICAgcz0iaW5jIjsKKyAgZWxzZSBpZihvcD09U1VCKQorICAgIHM9ImRlYyI7CisgIGVsc2UgaWYob3A9PUxTSElGVCkKKyAgICBzPSJhc2wiOworICBlbHNlIGlmKG9wPT1SU0hJRlQmJih0JlVOU0lHTkVEKSkKKyAgICBzPSJjbGNcblx0cm9yIjsKKyAgZWxzZSBpZihvcD09UlNISUZUKXsKKyAgICBzPSJjbXBcdCMxMjhcblx0cm9yIjsKKyAgfWVsc2UKKyAgICBpZXJyb3IoMCk7CisgIGlmKElTQ0hBUih0KSl7CisgICAgZm9yKGk9MDtpPHg7aSsrKXsKKyAgICAgIGlmKGlkeCl7CisJZW1pdChmLCJcdCVzXG4iLHMpOworICAgICAgfWVsc2V7CisJZW1pdChmLCJcdCVzXHQiLHMpOworCWVtaXRfb2JqKGYsbyx0KTsKKwllbWl0KGYsIlxuIik7CisgICAgICB9CisgICAgfQorICB9ZWxzZXsKKyAgICBmb3IoaT0wO2k8eDtpKyspeworICAgICAgaWYob3A9PVNVQil7CisJLyogY2FsbGVyIG11cyBtYWtlIHN1cmUgYWNjdSBpcyBhdmFpbGFibGUgKi8KKwlsb2FkX2xvYnl0ZShmLG8sdCk7CisJZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJZW1pdChmLCJcdGRlY1x0Iik7CisJZW1pdF9oaWJ5dGUoZixvLHQpOworCWVtaXQoZiwiXG4iKTsKKwllbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJZW1pdChmLCJcdGRlY1x0Iik7CisJZW1pdF9sb2J5dGUoZixvLHQpOworCWVtaXQoZiwiXG4iKTsJCisgICAgICB9ZWxzZSBpZihvcD09QUREKXsKKwllbWl0KGYsIlx0JXNcdCIscyk7CisJZW1pdF9sb2J5dGUoZixvLHQpOworCWVtaXQoZiwiXG4iKTsKKwllbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwllbWl0KGYsIlx0JXNcdCIscyk7CisJZW1pdF9oaWJ5dGUoZixvLHQpOworCWVtaXQoZiwiXG4iKTsKKwllbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisgICAgICB9ZWxzZSBpZihvcD09TFNISUZUKXsKKwkvLyA0NTEwIC8gNDVHUzAyIGhhdmUgQVNXL1JPVyBvcGVyYXRpb25zCisJLy8gZm9yIGxlZnQtc2hpZnRpbmcgMTYtYml0IHZhbHVlcworCQorCWVtaXQoZiwiXHRhc3dcdCIpOworCWVtaXRfb2JqKGYsbyx0KTsKKwllbWl0KGYsIlxuIik7CisKKyAgICAgIH1lbHNlIGlmKG9wPT1SU0hJRlQmJih0JlVOU0lHTkVEKSl7CisJZW1pdChmLCJcdGNsY1xuIik7CisJZW1pdChmLCJcdHJvclx0Iik7CisJZW1pdF9oaWJ5dGUoZixvLHQpOworCWVtaXQoZiwiXG4iKTsKKwllbWl0KGYsIlx0cm9yXHQiKTsKKwllbWl0X2xvYnl0ZShmLG8sdCk7CisJZW1pdChmLCJcbiIpOworICAgICAgfWVsc2UgaWYob3A9PVJTSElGVCl7CisJbG9hZF9oaWJ5dGUoZixvLHQpOworCWVtaXQoZiwiXHRjbXBcdCMxMjhcbiIpOworCWVtaXQoZiwiXHRyb3JcdCIpOworCWVtaXRfaGlieXRlKGYsbyx0KTsKKwllbWl0KGYsIlxuIik7CisJZW1pdChmLCJcdHJvclx0Iik7CisJZW1pdF9sb2J5dGUoZixvLHQpOworCWVtaXQoZiwiXG4iKTsJCisgICAgICB9ZWxzZXsKKwlwcmludGYoIm9wPSVkXG4iLG9wKTsKKwlpZXJyb3IoMCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIHByZWxvYWRfb2JqKEZJTEUgKmYsSUMgKnAsb2JqICpvKQoreworICBpbnQgcjtsb25nIG9mOworCisgIGlmKChwLT50eXBmJlZPTEFUSUxFKXx8KHAtPnR5cGYyJlZPTEFUSUxFKXx8CisgICAgICgocC0+cTEuZmxhZ3MmRFJFRk9CSikmJihwLT5xMS5kdHlwJihWT0xBVElMRXxQVk9MQVRJTEUpKSl8fAorICAgICAoKHAtPnEyLmZsYWdzJkRSRUZPQkopJiYocC0+cTIuZHR5cCYoVk9MQVRJTEV8UFZPTEFUSUxFKSkpfHwKKyAgICAgKChwLT56LmZsYWdzJkRSRUZPQkopJiYocC0+ei5kdHlwJihWT0xBVElMRXxQVk9MQVRJTEUpKSkpCisgICAgZW1pdChmLCI7IHZvbGF0aWxlIGJhcnJpZXJcbiIpOworCisKKyAgaWYoKG8tPmZsYWdzJihWQVJ8UkVHKSk9PVZBUiYmKG8tPnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fG8tPnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKSYmKG9mPXJlYWxfb2Zmc2V0KG8pKSt6bTJsKHN6b2Yoby0+di0+dnR5cCkpPjI1NSl7CisgICAgcj1nZXRfcmVnKGYscCxQT0lOVEVSKTsKKyAgICBpZihvLT5mbGFncyZEUkVGT0JKKQorICAgICAgZ2V0X2FjYyhmLHAsSU5UKTsKKyAgICBlbHNlCisgICAgICBjbXBfZ2V0X2FjYyhmLHAsMCk7CisgICAgaWYoIXJlZ19wYWlyKHIsJnJwKSkgaWVycm9yKDApOworICAgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tmcDFdKTsKKyAgICBlbWl0KGYsIlx0Y2xjXG4iKTsKKyAgICBpZihvZiYweGZmKQorICAgICAgZW1pdChmLCJcdGFkY1x0IyVsZFxuIixvZiYweGZmKTsKKyAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAucjFdKTsKKyAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbZnAyXSk7CisgICAgaWYoMS8qb2YmMHhmZjAwKi8pCisgICAgICBlbWl0KGYsIlx0YWRjXHQjJWxkXG4iLChvZj4+OCkmMHhmZik7CisgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIyXSk7CisgICAgby0+ZmxhZ3N8PVJFRzsKKyAgICBvLT5yZWc9cjsKKyAgICBpZihvLT5mbGFncyZEUkVGT0JKKXsKKyAgICAgIGlmKCFjMDIpIHNldHkoZiwwKTsKKyAgICAgIGVtaXQoZiwiXHRsZGFcdCglcyklc1xuIixtcmVnbmFtZXNbcl0sYzAyPyIiOiIseSIpOworICAgICAgZW1pdChmLCJcdHR4YVxuIik7CisgICAgICBzZXR5KGYsMSk7CisgICAgICBlbWl0KGYsIlx0bGRhXHQoJXMpLHlcbiIsbXJlZ25hbWVzW3JdKTsKKyAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworICAgICAgZW1pdChmLCJcdHN0eFx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisgICAgfWVsc2V7CisgICAgICBvLT5mbGFnc3w9RFJFRk9CSjsKKyAgICAgIG8tPmR0eXA9UE9JTlRFUjsKKyAgICB9CisgIH0KKworICBpZigoby0+ZmxhZ3MmKERSRUZPQkp8S09OU1QpKT09RFJFRk9CSiYmKCEoby0+ZmxhZ3MmUkVHKXx8IWlzcHRyKG8tPnJlZykpJiYoIShvLT5mbGFncyZWQVIpfHwhKG8tPnYtPnRhdHRyJlpQQUdFKSkmJiFJU0ZQT0lOVEVSKG8tPmR0eXApKXsKKyAgICBjbXBfZ2V0X2FjYyhmLHAsMCk7CisgICAgcj1nZXRfcmVnKGYscCxQT0lOVEVSKTsKKyAgICBvLT5mbGFncyY9fkRSRUZPQko7CisgICAgbG9hZF9yZWcoZixyLG8sUE9JTlRFUik7CisgICAgby0+ZmxhZ3N8PVJFR3xEUkVGT0JKOworICAgIG8tPnJlZz1yOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGZhcl9jb3B5KEZJTEUgKmYsSUMgKnApCit7CisgIGludCBiO2xvbmcgbDsKKyAgZ2V0X2FjYyhmLHAsSU5UKTsKKyAgaWYocC0+Y29kZT09UFVTSCl7CisgICAgaWYoIXJlZ19wYWlyKExBU1RfUEFJUiwmcnApKSBpZXJyb3IoMCk7CisgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3NwXSk7CisgICAgaWYocHVzaGVkKSBlbWl0KGYsIlx0Y2xjXG4iKTsKKyAgICBpZihwdXNoZWQmMHhmZikgZW1pdChmLCJcdGFkY1x0IyVkXG4iLChwdXNoZWQmMHhmZikpOworICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMV0pOworICAgIGVtaXQoZiwiXHRsZGFcdCVzKzFcbiIsbXJlZ25hbWVzW3NwXSk7CisgICAgaWYocHVzaGVkKSBlbWl0KGYsIlx0YWRjXHQjJWRcbiIsKChwdXNoZWQ+PjgpJjB4ZmYpKTsKKyAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsKKyAgICBwdXNoZWQrPXptMmwocC0+cTIudmFsLnZtYXgpOworICAgIGVtaXQoZiwiXHRsZHhcdCMlZFxuIixiYW5rY251bSk7CisgIH1lbHNlIGlmKHAtPnouZmxhZ3MmRFJFRk9CSil7CisgICAgaWYoIXJlZ19wYWlyKExBU1RfUEFJUiwmcnApKSBpZXJyb3IoMCk7CisgICAgcC0+ei5mbGFncyY9fkRSRUZPQko7CisgICAgbG9hZF9sb2J5dGUoZiwmcC0+eixGUE9JTlRFUik7CisgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisgICAgbG9hZF9oaWJ5dGUoZiwmcC0+eixGUE9JTlRFUik7CisgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIyXSk7CisgICAgaWYoaW5kaXJlY3QoJnAtPnopKXsKKyAgICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnosRlBPSU5URVIpOworICAgICAgZW1pdChmLCJcdHRheFxuIik7CisgICAgfWVsc2UKKyAgICAgIGRvX2J5dGUzKGYsImxkeCIsJnAtPnosRlBPSU5URVIpOworICB9ZWxzZXsKKyAgICBsb2FkX2FkZHJlc3MoZixMQVNUX1BBSVIsJnAtPnosUE9JTlRFUik7CisgICAgYj1iYW5rKHAtPnoudik7CisgICAgZW1pdChmLCJcdGxkeFx0IyVkXG4iLGI+PTA/YjpiYW5rY251bSk7CisgIH0KKyAgaWYocC0+cTEuZmxhZ3MmRFJFRk9CSil7CisgICAgaWYoIXJlZ19wYWlyKExBU1RfUEFJUi0xLCZycCkpIGllcnJvcigwKTsKKyAgICBwLT5xMS5mbGFncyY9fkRSRUZPQko7CisgICAgbG9hZF9sb2J5dGUoZiwmcC0+cTEsRlBPSU5URVIpOworICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMV0pOworICAgIGxvYWRfaGlieXRlKGYsJnAtPnExLEZQT0lOVEVSKTsKKyAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsKKyAgICBpZihpbmRpcmVjdCgmcC0+cTEpKXsKKyAgICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLEZQT0lOVEVSKTsKKyAgICAgIGVtaXQoZiwiXHR0YXlcbiIpOworICAgIH1lbHNlCisgICAgICBkb19ieXRlMyhmLCJsZHkiLCZwLT5xMSxGUE9JTlRFUik7CisgIH1lbHNleworICAgIGxvYWRfYWRkcmVzcyhmLExBU1RfUEFJUi0xLCZwLT5xMSxQT0lOVEVSKTsKKyAgICBiPWJhbmsocC0+cTEudik7CisgICAgc2V0eShmLGI+PTA/YjpiYW5rY251bSk7CisgIH0KKyAgbD16bTJsKHAtPnEyLnZhbC52bWF4KTsKKyAgZW1pdChmLCJcdGxkYVx0IyVkXG4iLChsPj44KSYweGZmKTsKKyAgZW1pdChmLCJcdHN0YVx0JXNfX2Jhbmtjb3B5X2xlbisxXG4iLGlkcHJlZml4KTsKKyAgZW1pdChmLCJcdGxkYVx0IyVkXG4iLChsKSYweGZmKTsKKyAgZW1pdChmLCJcdHN0YVx0JXNfX2Jhbmtjb3B5X2xlblxuIixpZHByZWZpeCk7CisgIGVtaXQoZiwiXHRsZGFcdCMlZFxuIixjYmFuaz49MD9jYmFuazpiYW5rY251bSk7CisgIGVtaXQoZiwiXHRqc3JcdCVzX19iYW5rY29weVxuIixpZHByZWZpeCk7CisgIHl2YWw9Tk9WQUw7Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfZmFyKEZJTEUgKmYsSUMgKnAsb2JqICpvLGludCB0KQoreworICBpbnQgcHVzaGVkPTA7CisgIGlmKCEoby0+ZmxhZ3MmRFJFRk9CSikpIGllcnJvcigwKTsKKyAgby0+ZmxhZ3MmPX5EUkVGT0JKOworICB0Jj1OUTsKKyAgaWYoem1lcXRvKHNpemV0YWJbdF0sWjApKSByZXR1cm47CisgIC8qZ2V0X2FjYyhmLHAsSU5UKTsqLworICBpZihwdXNoZWRhY2M9PXQzfHxwdXNoZWRhY2M9PXQ0KSBpZXJyb3IoMCk7CisgIGlmKHB1c2hlZHg9PXQzfHxwdXNoZWR4PT10NCkgaWVycm9yKDApOworICBpZihyZWdzW3JhXXx8cmVnc1tyYXhdKXsKKyAgICBpZihpc2FjYyhxMSl8fGlzYWNjKHEyKXx8IWlzYWNjKHopKXsKKyAgICAgIHB1c2hlZD0xOworICAgICAgZW1pdChmLCJcdHBoYVxuIik7CisgICAgICBpZihyZWdzW3JheF0pIGVtaXQoZiwiXHR0eGFcblx0cGhhXG4iKTsKKyAgICB9CisgIH0KKyAgbG9hZF9yZWcoZixMQVNUX1BBSVIsbyxQT0lOVEVSKTsKKyAgaWYoIWluZGlyZWN0KG8pKQorICAgIGRvX2J5dGUzKGYsImxkeSIsbyxDSEFSKTsKKyAgZWxzZXsKKyAgICBkb19ieXRlMyhmLCJsZGEiLG8sQ0hBUik7CisgICAgZW1pdChmLCJcdHRheVxuIik7CisgIH0KKyAgZW1pdChmLCJcdGxkeFx0IyVkXG4iLGJhbmt2b2Zmc2V0KTsKKyAgZW1pdChmLCJcdGxkYVx0IyVkXG4iLGNiYW5rPj0wP2NiYW5rOmJhbmtjbnVtKTsKKyAgZW1pdChmLCJcdGpzclx0JXNfX2Jhbmtsb2FkJWRcbiIsaWRwcmVmaXgsKGludCl6bTJsKHNpemV0YWJbdF0pKTsKKyAgeXZhbD1OT1ZBTDsKKyAgby0+ZmxhZ3M9VkFSOworICBvLT52PSZiYW5rdjsKKyAgby0+dmFsLnZtYXg9bDJ6bSgobG9uZyliYW5rdm9mZnNldCk7CisgIGJhbmt2b2Zmc2V0Kz16bTJsKHNpemV0YWJbdF0pOworICBpZihwdXNoZWQpeworICAgIGlmKHJlZ3NbcmF4XSkgZW1pdChmLCJcdHBsYVxuXHR0YXhcbiIpOworICAgIGVtaXQoZiwiXHRwbGFcbiIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfYmFua2VkKEZJTEUgKmYsSUMgKnAsb2JqICpvLGludCB0KQoreworICBpbnQgcHVzaGVkPTAsbTsKKyAgaWYoby0+ZmxhZ3MmRFJFRk9CSikgdD1vLT5kdHlwOworICB0Jj1OUTsKKyAgaWYoem1lcXRvKHNpemV0YWJbdF0sWjApKSByZXR1cm47CisgIC8qZ2V0X2FjYyhmLHAsSU5UKTsqLworICBpZihwdXNoZWRhY2M9PXQzfHxwdXNoZWRhY2M9PXQ0KSBpZXJyb3IoMCk7CisgIGlmKHB1c2hlZHg9PXQzfHxwdXNoZWR4PT10NCkgaWVycm9yKDApOworICBpZihyZWdzW3JhXXx8cmVnc1tyYXhdKXsKKyAgICBpZihpc2FjYyhxMSl8fGlzYWNjKHEyKXx8IWlzYWNjKHopKXsKKyAgICAgIHB1c2hlZD0xOworICAgICAgZW1pdChmLCJcdHBoYVxuIik7CisgICAgICBpZihyZWdzW3JheF18fHJlZ3NbcnhdKSBlbWl0KGYsIlx0dHhhXG5cdHBoYVxuIik7CisgICAgfQorICB9CisgIG09by0+ZmxhZ3M7CisgIG8tPmZsYWdzJj1+RFJFRk9CSjsKKyAgbG9hZF9hZGRyZXNzKGYsTEFTVF9QQUlSLG8sUE9JTlRFUik7CisgIG8tPmZsYWdzPW07CisgIGVtaXQoZiwiXHRsZHhcdCMlZFxuIixiYW5rdm9mZnNldCk7CisgIGVtaXQoZiwiXHRsZGFcdCMlZFxuIixjYmFuaz49MD9jYmFuazpiYW5rY251bSk7CisgIHNldHkoZixiYW5rKG8tPnYpKTsKKyAgZW1pdChmLCJcdGpzclx0JXNfX2Jhbmtsb2FkJWRcbiIsaWRwcmVmaXgsKGludCl6bTJsKHNpemV0YWJbdF0pKTsKKyAgeXZhbD1OT1ZBTDsKKyAgby0+dj0mYmFua3Y7CisgIG8tPnZhbC52bWF4PWwyem0oKGxvbmcpYmFua3ZvZmZzZXQpOworICBiYW5rdm9mZnNldCs9em0ybChzaXpldGFiW3RdKTsKKyAgaWYocHVzaGVkKXsKKyAgICBpZihyZWdzW3JheF18fHJlZ3NbcnhdKSBlbWl0KGYsIlx0cGxhXG5cdHRheFxuIik7CisgICAgZW1pdChmLCJcdHBsYVxuIik7CisgIH0KK30KKworc3RhdGljIHZvaWQgcHJlbG9hZChGSUxFICpmLElDICpwKQoreworICBpbnQgcixtcmE9cmVnc1tyYV0sbXJheD1yZWdzW3JheF07CisgIGludCBicTE9LTEsYnEyPS0xLGJ6PS0xLHNiPS0xLHpidWY9MDsKKworICBpZihwLT5jb2RlPT1HRVRSRVRVUk4mJnAtPnExLnJlZz09cmEmJiFyZWdzW3JhXSkKKyAgICByZWdzW3JhXT0xOworCisgIGlmKHAtPmNvZGU9PUdFVFJFVFVSTiYmcC0+cTEucmVnPT1yYXgmJiFyZWdzW3JheF0pCisgICAgcmVnc1tyYXhdPTE7CisKKyAgYmFua3ZvZmZzZXQ9MDsKKworICBpZighTk9CQU5LVkFSUyl7CisgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8VkFSQURSKSk9PVZBUikgYnExPWJhbmsocC0+cTEudik7CisgICAgaWYoKHAtPnEyLmZsYWdzJihWQVJ8VkFSQURSKSk9PVZBUikgYnEyPWJhbmsocC0+cTIudik7CisgICAgaWYoKHAtPnouZmxhZ3MmKFZBUnxWQVJBRFIpKT09VkFSKSBiej1iYW5rKHAtPnoudik7CisKKyAgICBpZigocC0+cTEuZmxhZ3MmKFZBUnxWQVJBRFIpKT09KFZBUnxWQVJBRFIpKXsKKyAgICAgIHI9YmFuayhwLT5xMS52KTsKKyAgICAgIC8qaWYocj49MCYmciE9Y2JhbmspIGllcnJvcigwKTsqLworICAgIH0KKyAgICAKKyAgICBpZigocC0+Y29kZT09QVNTSUdOfHxwLT5jb2RlPT1QVVNIKSYmIXptbGVxKHAtPnEyLnZhbC52bWF4LGwyem0oNEwpKSl7CisgICAgICBpZihwLT5xMS5mbGFncyZEUkVGT0JKKSBwcmVsb2FkX29iaihmLHAsJnAtPnExKTsKKyAgICAgIGlmKHAtPnouZmxhZ3MmRFJFRk9CSikgcHJlbG9hZF9vYmooZixwLCZwLT56KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZihwLT5jb2RlIT1DQUxMKXsKKyAgICAgIC8qIFRPRE86IHNvbWUgb3B0aW1pemF0aW9ucyBwb3NzaWJsZSAqLworICAgICAgaWYoYnExPj0wJiZicTEhPWNiYW5rKXsKKwlpZihjYmFuazwwJiYhTk9TV0lUQ0gpCisJICBzYj1icTE7CisJZWxzZQorCSAgbG9hZF9iYW5rZWQoZixwLCZwLT5xMSxxMXR5cChwKSk7CisgICAgICB9CisgICAgICBpZihicTI+PTAmJmJxMiE9Y2JhbmspeworCWlmKChicTI9PXNifHwoY2Jhbms8MCYmc2I8MCkpJiYhTk9TV0lUQ0gpCisJICBzYj1icTI7CisJZWxzZQorCSAgbG9hZF9iYW5rZWQoZixwLCZwLT5xMixxMnR5cChwKSk7CisgICAgICB9CisgICAgICBpZihiej49MCYmYnohPWNiYW5rJiYocC0+ei5mbGFncyZEUkVGT0JKKSl7CisJaWYoKGJ6PT1zYnx8KGNiYW5rPDAmJnNiPDApKXx8IU5PU1dJVENIKQorCSAgc2I9Yno7CisJZWxzZQorCSAgbG9hZF9iYW5rZWQoZixwLCZwLT56LHp0eXAocCkpOworICAgICAgfQorICAgICAgCisgICAgICBpZihzYj49MCl7CisJaWYoTk9TV0lUQ0gpIGllcnJvcigwKTsKKwlzZXR5KGYsc2IpOworCWVtaXQoZiwiXHRqc3JcdCVzX19iYW5rc3dpdGNoXG4iLGlkcHJlZml4KTsKKwl5dmFsPU5PVkFMOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmKChwLT5xMS5mbGFncyZEUkVGT0JKKSYmSVNGUE9JTlRFUihwLT5xMS5kdHlwKSYmcC0+Y29kZSE9Q0FMTCkgbG9hZF9mYXIoZixwLCZwLT5xMSxxMXR5cChwKSk7CisgIGlmKChwLT5xMi5mbGFncyZEUkVGT0JKKSYmSVNGUE9JTlRFUihwLT5xMi5kdHlwKSkgbG9hZF9mYXIoZixwLCZwLT5xMixxMnR5cChwKSk7CisKKyAgaWYoaXNhY2MocTIpKXsKKyAgICBzdGF0aWMgb2JqIG87CisgICAgaW50IHQ9cTJ0eXAocCk7CisgICAgcj1nZXRfcmVnKGYscCx0KTsKKyAgICBvLmZsYWdzPVJFRzsKKyAgICBvLnJlZz1yOworICAgIHN0b3JlX2FjYyhmLCZvLHQpOworICAgIHAtPnEyLnJlZz1yOworICB9CisKKyAgaWYocC0+Y29kZSE9QUREUkVTUyl7CisgICAgcHJlbG9hZF9vYmooZixwLCZwLT5xMSk7CisgICAgaWYoKHAtPnExLmZsYWdzJihEUkVGT0JKfFZBUnxSRUcpKT09KERSRUZPQkp8VkFSfFJFRykmJgorICAgICAgIChwLT5xMi5mbGFncyYoRFJFRk9CSnxWQVJ8UkVHKSk9PShEUkVGT0JKfFZBUikmJgorICAgICAgIHAtPnExLnY9PXAtPnEyLnYpeworICAgICAgcC0+cTIuZmxhZ3N8PVJFRzsKKyAgICAgIHAtPnEyLnJlZz1wLT5xMS5yZWc7CisgICAgfQorICAgIGlmKChwLT5xMS5mbGFncyYoRFJFRk9CSnxWQVJ8UkVHKSk9PShEUkVGT0JKfFZBUnxSRUcpJiYKKyAgICAgICAocC0+ei5mbGFncyYoRFJFRk9CSnxWQVJ8UkVHKSk9PShEUkVGT0JKfFZBUikmJgorICAgICAgIHAtPnExLnY9PXAtPnoudil7CisgICAgICBwLT56LmZsYWdzfD1SRUc7CisgICAgICBwLT56LnJlZz1wLT5xMS5yZWc7CisgICAgfQorICB9CisKKyAgcHJlbG9hZF9vYmooZixwLCZwLT5xMik7CisgIGlmKChwLT5xMi5mbGFncyYoRFJFRk9CSnxWQVJ8UkVHKSk9PShEUkVGT0JKfFZBUnxSRUcpJiYKKyAgICAgKHAtPnouZmxhZ3MmKERSRUZPQkp8VkFSfFJFRykpPT0oRFJFRk9CSnxWQVIpJiYKKyAgICAgcC0+cTIudj09cC0+ei52KXsKKyAgICBwLT56LmZsYWdzfD1SRUc7CisgICAgcC0+ei5yZWc9cC0+cTEucmVnOworICB9CisKKworICBpZigocC0+ei5mbGFncyZEUkVGT0JKKSYmSVNGUE9JTlRFUihwLT56LmR0eXApKSB6YnVmPTE7CisgIGlmKChwLT56LmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVIpeworICAgIGJ6PWJhbmsocC0+ei52KTsKKyAgICBpZihiej49MCYmYnohPWNiYW5rKSB6YnVmPTE7CisgIH0KKyAgCisgIGlmKHpidWYmJiFOT0JBTktWQVJTKXsKKyAgICB6c3RvcmU9cC0+ejsKKyAgICBwLT56LmZsYWdzPVZBUjsKKyAgICBwLT56LnY9JmJhbmt2OworICAgIHAtPnoudmFsLnZtYXg9bDJ6bSgobG9uZyliYW5rdm9mZnNldCk7CisgICAgenN0b3JlZmxhZz0xOworICAgIC8qYmFua3ZvZmZzZXQrPXptMmwoc2l6ZXRhYltwLT50eXBmJk5RXSk7Ki8KKyAgfWVsc2V7CisgICAgcHJlbG9hZF9vYmooZixwLCZwLT56KTsKKworICAgIGlmKGlzcmVnKHopKXsKKyAgICAgIHI9MDsKKyAgICAgIGlmKHAtPnExLmFtJiZwLT5xMS5hbS0+YmFzZT09cC0+ei5yZWcpeworCXI9Z2V0X3JlZyhmLHAsUE9JTlRFUik7CisJY21wX2dldF9hY2MoZixwLDApOworCWlmKCFyZWdfcGFpcihwLT5xMS5hbS0+YmFzZSwmcnApKSBpZXJyb3IoMCk7CisJaWYoIXJlZ19wYWlyKHIsJnJwMikpIGllcnJvcigwKTsKKwllbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcnAucjFdKTsKKwllbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAyLnIxXSk7CisJZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIyXSk7CisJZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwMi5yMl0pOworCXAtPnExLmFtLT5iYXNlPXAtPnExLnJlZz1yOworICAgICAgfWVsc2UgaWYoKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwLT5xMS5yZWc9PXAtPnoucmVnKXsKKwlyPWdldF9yZWcoZixwLFBPSU5URVIpOworCWNtcF9nZXRfYWNjKGYscCwwKTsKKwlpZighcmVnX3BhaXIocC0+ei5yZWcsJnJwKSkgaWVycm9yKDApOworCWlmKCFyZWdfcGFpcihyLCZycDIpKSBpZXJyb3IoMCk7CisJZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisJZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwMi5yMV0pOworCWVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworCWVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycDIucjJdKTsKKwlwLT5xMS5yZWc9cjsKKyAgICAgIH0KKyAgICAgIGlmKHAtPnEyLmFtJiZwLT5xMi5hbS0+YmFzZT09cC0+ei5yZWcpeworCWlmKHI9PTApeworCSAgcj1nZXRfcmVnKGYscCxQT0lOVEVSKTsKKwkgIGNtcF9nZXRfYWNjKGYscCwwKTsKKwkgIGlmKCFyZWdfcGFpcihwLT5xMi5hbS0+YmFzZSwmcnApKSBpZXJyb3IoMCk7CisJICBpZighcmVnX3BhaXIociwmcnAyKSkgaWVycm9yKDApOworCSAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisJICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAyLnIxXSk7CisJICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsKKwkgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycDIucjJdKTsKKwl9CisJcC0+cTIuYW0tPmJhc2U9cC0+cTIucmVnPXI7CisgICAgICB9ZWxzZSBpZigocC0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAtPnEyLnJlZz09cC0+ei5yZWcpeworCWlmKHI9PTApeworCSAgcj1nZXRfcmVnKGYscCxQT0lOVEVSKTsKKwkgIGNtcF9nZXRfYWNjKGYscCwwKTsKKwkgIGlmKCFyZWdfcGFpcihwLT56LnJlZywmcnApKSBpZXJyb3IoMCk7CisJICBpZighcmVnX3BhaXIociwmcnAyKSkgaWVycm9yKDApOworCSAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisJICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAyLnIxXSk7CisJICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsKKwkgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycDIucjJdKTsKKwl9CisJcC0+cTIucmVnPXI7CisgICAgICB9CisgICAgfQorICAgIGlmKGlzYWNjKHopKXsKKyAgICAgIGlmKGlzYWNjKHEyKSl7CisJaWYocC0+cTIucmVnPT1yYXgpeworCSAgcj1nZXRfcmVnKGYscCxJTlQpOworCSAgaWYoIXJlZ19wYWlyKHIsJnJwKSkgaWVycm9yKDApOworCSAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisJICBlbWl0KGYsIlx0c3R4XHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsKKwl9ZWxzZXsKKwkgIHI9Z2V0X3JlZyhmLHAsQ0hBUik7CisJICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCX0KKwlwLT5xMi5yZWc9cjsKKwlpZihpc2FjYyhxMSkpCisJICBwLT5xMS5yZWc9cjsKKyAgICAgIH0KKyAgICB9CisgIH0gICAgIAorIAorICByZWxvYWRfYWNjKGYpOworCisgIHJlZ3NbcmFdPW1yYTsKKyAgcmVnc1tyYXhdPW1yYXg7Cit9CisKKworLyogY29tcGFyZSBpZiB0d28gb2JqZWN0cyBhcmUgdGhlIHNhbWUgKi8KK3N0YXRpYyBpbnQgY29tcGFyZV9vYmplY3RzKHN0cnVjdCBvYmogKm8xLHN0cnVjdCBvYmogKm8yKQoreworICBpZigobzEtPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJihvMi0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmbzEtPnJlZz09bzItPnJlZykKKyAgICByZXR1cm4gMTsKKyAgaWYobzEtPmZsYWdzPT1vMi0+ZmxhZ3MmJm8xLT5hbT09bzItPmFtKXsKKyAgICBpZighKG8xLT5mbGFncyZWQVIpfHwobzEtPnY9PW8yLT52JiZ6bWVxdG8obzEtPnZhbC52bWF4LG8yLT52YWwudm1heCkpKXsKKyAgICAgIGlmKCEobzEtPmZsYWdzJlJFRyl8fG8xLT5yZWc9PW8yLT5yZWcpeworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIHNhdmUgdGhlIHJlc3VsdCAoaW4genJlZykgaW50byBwLT56ICovCit2b2lkIHNhdmVfcmVzdWx0KEZJTEUgKmYsc3RydWN0IElDICpwKQoreworICBpZXJyb3IoMCk7Cit9CisKKy8qIHByaW50cyBhbiBvYmplY3QgKi8KK3N0YXRpYyB2b2lkIGVtaXRfb2JqKEZJTEUgKmYsc3RydWN0IG9iaiAqcCxpbnQgdCkKK3sKKyAgaWYocC0+YW0peworICAgIGlmKHAtPmFtLT5mbGFncz09SU1NX0lORCkKKyAgICAgIGVtaXQoZiwiKCVzKSx5IDthbSglbGQpIixtcmVnbmFtZXNbcC0+YW0tPmJhc2VdLHAtPmFtLT5vZmZzZXQpOworICAgIGVsc2UgaWYocC0+YW0tPmZsYWdzPT1HUFJfSU5EKQorICAgICAgZW1pdChmLCIoJXMpLHkgO2FtKCVzKSIsbXJlZ25hbWVzW3AtPmFtLT5iYXNlXSxtcmVnbmFtZXNbcC0+YW0tPmlkeF0pOworICAgIGVsc2UgaWYocC0+YW0tPmZsYWdzPT1BQlNfSU5EKXsKKyAgICAgIGVtaXQoZiwiJWxkIixwLT5hbS0+b2Zmc2V0KTsKKyAgICAgIGlmKHAtPmFtLT52KXsKKwlWYXIgKnY9cC0+YW0tPnY7CisJaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKQorCSAgZW1pdChmLCIrJXMlcyIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisJZWxzZQorCSAgZW1pdChmLCIrJXMlbGQiLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICAgICAgfQorICAgICAgaWYoSVNJRFgocC0+YW0tPmlkeCkpCisJZW1pdChmLCIsJXMgO2FtKCVzKSIsbXJlZ25hbWVzW3AtPmFtLT5pZHhdLG1yZWduYW1lc1twLT5hbS0+aWR4XSk7CisgICAgICBlbHNlCisJZW1pdChmLCIseSA7YW0oJXMpIixtcmVnbmFtZXNbcC0+YW0tPmlkeF0pOworICAgIH1lbHNlCisgICAgICBpZXJyb3IoMCk7CisgICAgcmV0dXJuOworICB9CisgIGlmKChwLT5mbGFncyYoS09OU1R8RFJFRk9CSikpPT0oS09OU1R8RFJFRk9CSikpeworICAgIGVtaXR2YWwoZiwmcC0+dmFsLHAtPmR0eXAmTlUpOworICAgIHJldHVybjsKKyAgfQorICBpZihwLT5mbGFncyZEUkVGT0JKKSBlbWl0KGYsIigiKTsKKyAgaWYocC0+ZmxhZ3MmUkVHKXsKKyAgICBlbWl0KGYsIiVzIixtcmVnbmFtZXNbcC0+cmVnXSk7CisgIH1lbHNlIGlmKHAtPmZsYWdzJlZBUikgeworICAgIGlmKHAtPnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHAtPnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKQorICAgICAgZW1pdChmLCIoJXMpLHkiLG1yZWduYW1lc1tmcF0pOworICAgIGVsc2V7CisgICAgICBpZighem1lcXRvKGwyem0oMEwpLHAtPnZhbC52bWF4KSl7ZW1pdHZhbChmLCZwLT52YWwsTUFYSU5UKTtlbWl0KGYsIisiKTt9CisgICAgICBpZihwLT52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpeworICAgICAgICBlbWl0KGYsIiVzJWxkIixsYWJwcmVmaXgsem0ybChwLT52LT5vZmZzZXQpKTsKKyAgICAgIH1lbHNleworICAgICAgICBlbWl0KGYsIiVzJXMiLGlkcHJlZml4LHAtPnYtPmlkZW50aWZpZXIpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihwLT5mbGFncyZLT05TVCl7CisgICAgaWYoLyppZWVlJiYoKHQmTlEpPT1ET1VCTEV8fCh0Jk5RKT09TERPVUJMRSkqL0lTRkxPQVQodCkpCisgICAgICBlbWl0KGYsIiVzJWQiLGxhYnByZWZpeCxhZGRmcGNvbnN0KHAsdCkpOworICAgIGVsc2UKKyAgICAgIGVtaXR2YWwoZiwmcC0+dmFsLHQmTlUpOworICB9CisgIGlmKHAtPmZsYWdzJkRSRUZPQkopIGVtaXQoZiwiKSVzIixub3k/IiI6Iix5Iik7Cit9CisKKy8qICBUZXN0IGlmIHRoZXJlIGlzIGEgc2VxdWVuY2Ugb2YgRlJFRVJFR3MgY29udGFpbmluZyBGUkVFUkVHIHJlZy4KKyAgICBVc2VkIGJ5IHBlZXBob2xlLiAqLworc3RhdGljIGludCBleGlzdHNfZnJlZXJlZyhzdHJ1Y3QgSUMgKnAsaW50IHJlZykKK3sKKyAgd2hpbGUocCYmKHAtPmNvZGU9PUZSRUVSRUd8fHAtPmNvZGU9PUFMTE9DUkVHKSl7CisgICAgaWYocC0+Y29kZT09RlJFRVJFRyYmcC0+cTEucmVnPT1yZWcpIHJldHVybiAxOworICAgIHA9cC0+bmV4dDsKKyAgfQorICByZXR1cm4gMDsKK30KKworY2hhciBhbW9kZV9idWZmWzgxOTJdOworY2hhciAqcmVuZGVyX2Ftb2RlKHN0cnVjdCBBZGRyZXNzaW5nTW9kZSAqYW0pCit7CisgIHJldHVybiAiKGFtb2RlOiBub3QgaW1wbGVtZW50ZWQpIjsKK30KKworY2hhciB2YWxfYnVmZls4MTkyXTsKK2NoYXIgKnJlbmRlcl92YWwodW5pb24gYXR5cHMgdmFsKQoreworICBzbnByaW50Zih2YWxfYnVmZiw4MTkyLCIodmFsOiAlMDJ4Li4uKSIsCisJICAgdmFsLnZ1Y2hhcik7CisgIHJldHVybiB2YWxfYnVmZjsKK30KKworY2hhciB2YXJfYnVmZls4MTkyXTsKK2NoYXIgKnJlbmRlcl92YXIoc3RydWN0IFZhciAqdikKK3sKKyAgaWYgKCF2KSByZXR1cm4gIjxudWxsPiI7CisgIHNucHJpbnRmKHZhcl9idWZmLDgxOTIsIih2YXIgaWQ9JXMpIix2LT5pZGVudGlmaWVyKTsKKyAgcmV0dXJuIHZhcl9idWZmOworfQorCitjaGFyIG9ial9idWZmWzgxOTJdOworY2hhciAqcmVuZGVyX29iaihzdHJ1Y3Qgb2JqIG8pCit7CisgIC8vIFhYWCBDYWxsaW5nIHJlbmRlcl92YXIoKSBjYW4gcmVzdWx0IGluIHNlZ2ZhdWx0cworICBzbnByaW50ZihvYmpfYnVmZiw4MTkyLCIoZmxhZ3M9JWQsIHJlZz0lZCwgZHR5cGU9JWQsIHZhcj0lcywgYW1vZGU9JXMsIHZhbD0lcykiLAorCSAgIG8uZmxhZ3Msby5yZWcsby5kdHlwLCJyZW5kZXJfdmFyKG8udikiLHJlbmRlcl9hbW9kZShvLmFtKSxyZW5kZXJfdmFsKG8udmFsKSk7CisgIHJldHVybiBvYmpfYnVmZjsKK30KKworLyogc2VhcmNoIGZvciBwb3NzaWJsZSBhZGRyZXNzaW5nLW1vZGVzICovCitzdGF0aWMgdm9pZCBwZWVwaG9sZShzdHJ1Y3QgSUMgKnApCit7CisgIGludCBjLGMyLHI7c3RydWN0IElDICpwMjtzdHJ1Y3QgQWRkcmVzc2luZ01vZGUgKmFtOworCisgIGZwcmludGYoc3RkZXJyLCJwZWVwaG9sZSgpIGNhbGxlZC5cbiIpOworCisgIC8qCisgICAgWFhYIFBHUyBUaGluZ3MgdG8gY29uc2lkZXIgYWRkaW5nIGhlcmU6CisgICAgMS4gUmVtb3ZhbCBvZiBkZWFkIGxvYWRzIHdoZW4gd2Uga25vdyBhIHJlZ2lzdGVyIGFscmVhZHkgaGFzIGxvYWRlZCB0aGUgdGFyZ2V0IHdlIHdhbnQuCisgICAgMi4gUmVtb3ZhbCBvZiBkZWFkIHN0b3JlcyB0byBsb2NhbCBzdGFjayB2YXJpYWJsZXMgdGhhdCBuZXZlciBnZXQgcmVhZCBiZWZvcmUgcmV0dXJuaW5nIGZyb20gYSBmdW5jdGlvbj8KKyAgICAzLiBSZW1vdmFsIG9mIFNQIGRlY3JlbWVudCBhbmQgaW5jcmVtZW50LCB3aGVuIG5vIHVzZSBvZiBsb2NhbCBzdGFjayBpcyBtYWRlLgorICAgIDQuIFByb21vdGluZyBzdGFjayB2YXJpYWJsZXMgdG8gZ2xvYmFsIHZhcmlhYmxlcyB3aGVyZSBpdCBzYXZlcyB0aW1lIGFuZC9vciBzcGFjZT8KKyAgICA1LiBVc2luZyBaIGFzIGEgdGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIgZm9yIGxvY2FsIHZhcmlhYmxlcywgd2hlcmUgaXQgZG9lc24ndCB1cHNldAorICAgICAgIG90aGVyIHRoaW5ncz8KKyAgKi8KKyAgICAKKyAgCisgIGZvcig7cDtwPXAtPm5leHQpeworICAgIGZwcmludGYoc3RkZXJyLCIgIEluc3RydWN0aW9uIEAgJXAgOiAiLHApOworICAgIGZwcmludGYoc3RkZXJyLCJjb2RlPSVkLCAiLHAtPmNvZGUpOworICAgIGZwcmludGYoc3RkZXJyLCJcbiAgICBxMT0lcywgIixyZW5kZXJfb2JqKHAtPnExKSk7CisgICAgZnByaW50ZihzdGRlcnIsIlxuICAgIHEyPSVzLCAiLHJlbmRlcl9vYmoocC0+cTIpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiXG4gICAgej0lcywgIixyZW5kZXJfb2JqKHAtPnopKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKyAgICAKKyAgICBjPXAtPmNvZGU7CisgICAgaWYoYyE9RlJFRVJFRyYmYyE9QUxMT0NSRUcmJihjIT1TRVRSRVRVUk58fCFpc3JlZyhxMSl8fHAtPnExLnJlZyE9cC0+ei5yZWcpKSBleGl0X2xhYmVsPTA7CisgICAgaWYoYz09TEFCRUwpIGV4aXRfbGFiZWw9cC0+dHlwZjsKKworICAgIC8qIFRyeSBjb25zdChyZWcpICovCisgICAgaWYoKGM9PUFEREkyUHx8Yz09U1VCSUZQKSYmaXNyZWcoeikmJihwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCYmIUlTRlBPSU5URVIocC0+dHlwZjIpKXsKKyAgICAgIGludCBiYXNlO3ptYXggb2Y7c3RydWN0IG9iaiAqbzsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxwLT50eXBmKTsKKyAgICAgIGlmKGM9PVNVQklGUCkgb2Y9em1zdWIobDJ6bSgwTCksdm1heCk7IGVsc2Ugb2Y9dm1heDsKKyAgICAgIGlmKHptbGVxKFowLG9mKSYmem1sZXEob2YsbDJ6bSgyNTVMKSkpeworCXI9cC0+ei5yZWc7CisJaWYoaXNyZWcocTEpJiZpc3B0cihwLT5xMS5yZWcpKSBiYXNlPXAtPnExLnJlZzsgZWxzZSBiYXNlPXI7CisJbz0wOworCWZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKwkgIGMyPXAyLT5jb2RlOworCSAgaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKKwkgIGlmKGMyIT1GUkVFUkVHJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMS5yZWc9PXIpIGJyZWFrOworCSAgaWYoYzIhPUZSRUVSRUcmJihwMi0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnEyLnJlZz09cikgYnJlYWs7CisJICBpZihjMiE9Q0FMTCYmKGMyPExBQkVMfHxjMj5CUkEpLyomJmMyIT1BRERSRVNTKi8peworCSAgICBpbnQgdCxtYzsKKwkgICAgaWYoKGMyPT1BU1NJR058YzI9PVBVU0gpJiYocDItPnR5cGYmTlEpPT1DSEFSJiYhem1lcXRvKHAyLT5xMi52YWwudm1heCxaMSkpCisJICAgICAgbWM9MTsKKwkgICAgZWxzZQorCSAgICAgIG1jPTA7CisJICAgIGlmKCFwMi0+cTEuYW0mJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT5xMS5yZWc9PXIpeworCSAgICAgIGlmKG98fG1jKSBicmVhazsKKwkgICAgICB0PXExdHlwKHAyKSZOUTsKKwkgICAgICBpZih0PlBPSU5URVJ8fElTRkxPQVQodCkpIGJyZWFrOworCSAgICAgIG89JnAyLT5xMTsKKwkgICAgfQorCSAgICBpZighcDItPnEyLmFtJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTIucmVnPT1yKXsKKwkgICAgICBpZihvfHxtYykgYnJlYWs7CisJICAgICAgdD1xMnR5cChwMikmTlE7CisJICAgICAgaWYodD5QT0lOVEVSfHxJU0ZMT0FUKHQpKSBicmVhazsKKwkgICAgICBvPSZwMi0+cTI7CisJICAgIH0KKwkgICAgaWYoIXAyLT56LmFtJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT56LnJlZz09cil7CisJICAgICAgaWYob3x8bWMpIGJyZWFrOworCSAgICAgIHQ9enR5cChwMikmTlE7CisJICAgICAgaWYodD5QT0lOVEVSfHxJU0ZMT0FUKHQpKSBicmVhazsKKwkgICAgICBvPSZwMi0+ejsKKwkgICAgfQorCSAgfQorCSAgaWYoYzI9PUZSRUVSRUd8fChwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKwkgICAgaW50IG07CisJICAgIGlmKGMyPT1GUkVFUkVHKQorCSAgICAgIG09cDItPnExLnJlZzsKKwkgICAgZWxzZXsKKwkgICAgICBtPXAyLT56LnJlZzsKKwkgICAgICBpZihvPT0mcC0+cTF8fG89PSZwLT5xMikgYnJlYWs7CisJICAgIH0KKwkgICAgaWYobT09cil7CisJICAgICAgaWYobyl7CisJCW8tPmFtPWFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKKwkJYW0tPmZsYWdzPUlNTV9JTkQ7CisJCWFtLT5iYXNlPWJhc2U7CisJCWFtLT5vZmZzZXQ9KGludCl6bTJsKG9mKTsKKwkJaWYoaXNyZWcocTEpJiZpc3B0cihwLT5xMS5yZWcpKXsKKwkJICBwLT5jb2RlPWM9Tk9QO3AtPnExLmZsYWdzPXAtPnEyLmZsYWdzPXAtPnouZmxhZ3M9MDsKKwkJfWVsc2V7CisJCSAgcC0+Y29kZT1jPUFTU0lHTjtwLT5xMi5mbGFncz0wOworCQkgIHAtPnR5cGY9cC0+dHlwZjI7cC0+cTIudmFsLnZtYXg9c2l6ZXRhYltwLT50eXBmMiZOUV07CisJCX0KKwkgICAgICB9CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgICAgaWYoYzIhPUZSRUVSRUcmJm09PWJhc2UpIGJyZWFrOworCSAgICBjb250aW51ZTsKKwkgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvKiBUcnkgcmVnLHJlZyAqLworICAgIGlmKGM9PUFEREkyUCYmKHAtPnR5cGYmTlUpPT0oVU5TSUdORUR8Q0hBUikmJiFJU0ZQT0lOVEVSKHAtPnR5cGYyKSYmaXNyZWcocTIpJiZwLT5xMi5yZWchPXJhJiZpc3JlZyh6KSYmKGlzcmVnKHExKXx8cC0+cTIucmVnIT1wLT56LnJlZykpeworICAgICAgaW50IGJhc2UsaWR4LGluZDtzdHJ1Y3Qgb2JqICpvOworICAgICAgcj1wLT56LnJlZztpZHg9cC0+cTIucmVnOworICAgICAgaWYoaXNyZWcocTEpKSBiYXNlPXAtPnExLnJlZzsgZWxzZSBiYXNlPXI7CisgICAgICBpZigocC0+cTEuZmxhZ3MmVkFSQURSKXx8KHAtPnExLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKQorCWluZD0wOworICAgICAgZWxzZQorCWluZD0xOworICAgICAgbz0wOworICAgICAgZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpeworICAgICAgICBjMj1wMi0+Y29kZTsKKyAgICAgICAgaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKKyAgICAgICAgaWYoYzIhPUZSRUVSRUcmJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09cikgYnJlYWs7CisgICAgICAgIGlmKGMyIT1GUkVFUkVHJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMi5yZWc9PXIpIGJyZWFrOworICAgICAgICBpZigocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnoucmVnPT1pZHgmJmlkeCE9cikgYnJlYWs7CisJCisgICAgICAgIGlmKGMyIT1DQUxMJiYoYzI8TEFCRUx8fGMyPkJSQSkvKiYmYzIhPUFERFJFU1MqLyl7CisgICAgICAgICAgaWYoIXAyLT5xMS5hbSYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnExLnJlZz09cil7CisgICAgICAgICAgICBpZihvfHwoaW5kJiYocTF0eXAocDIpJk5RKSE9Q0hBUikpIGJyZWFrOworICAgICAgICAgICAgbz0mcDItPnExOworICAgICAgICAgIH0KKyAgICAgICAgICBpZighcDItPnEyLmFtJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTIucmVnPT1yKXsKKyAgICAgICAgICAgIGlmKG98fChpbmQmJihxMnR5cChwMikmTlEpIT1DSEFSKSkgYnJlYWs7CisgICAgICAgICAgICBvPSZwMi0+cTI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKCFwMi0+ei5hbSYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+ei5yZWc9PXIpeworICAgICAgICAgICAgaWYob3x8KGluZCYmKHp0eXAocDIpJk5RKSE9Q0hBUikpIGJyZWFrOworICAgICAgICAgICAgbz0mcDItPno7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKGMyPT1GUkVFUkVHfHwocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgICAgICAgaW50IG07CisgICAgICAgICAgaWYoYzI9PUZSRUVSRUcpCisgICAgICAgICAgICBtPXAyLT5xMS5yZWc7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbT1wMi0+ei5yZWc7CisgICAgICAgICAgaWYobT09cil7CisgICAgICAgICAgICBpZihvKXsKKyAgICAgICAgICAgICAgby0+YW09YW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworCSAgICAgIGFtLT5pZHg9aWR4OworCSAgICAgIGlmKGluZCl7CisJCWFtLT5mbGFncz1HUFJfSU5EOworCQlhbS0+YmFzZT1iYXNlOworCQlpZihpc3JlZyhxMSkpeworCQkgIHAtPmNvZGU9Yz1OT1A7cC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworCQl9ZWxzZXsKKwkJICBwLT5jb2RlPWM9QVNTSUdOO3AtPnEyLmZsYWdzPTA7CisJCSAgcC0+dHlwZj1wLT50eXBmMjtwLT5xMi52YWwudm1heD1zaXpldGFiW3AtPnR5cGYyJk5RXTsKKwkJfQorCSAgICAgIH1lbHNleworCQlhbS0+ZmxhZ3M9QUJTX0lORDsKKwkJYW0tPmJhc2U9MDsKKwkJZXZhbF9jb25zdCgmcC0+cTEudmFsLE1BWElOVCk7CisJCWFtLT5vZmZzZXQ9em0ybCh2bWF4KTsKKwkJaWYocC0+cTEuZmxhZ3MmVkFSQURSKQorCQkgIGFtLT52PXAtPnExLnY7CisJCWVsc2UKKwkJICBhbS0+dj0wOworCQlwLT5jb2RlPWM9Tk9QO3AtPnExLmZsYWdzPXAtPnEyLmZsYWdzPXAtPnouZmxhZ3M9MDsKKwkgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYoYzIhPUZSRUVSRUcmJm09PWJhc2UpIGJyZWFrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIHByKEZJTEUgKmYsc3RydWN0IElDICpwKQoreworICBpbnQgcjsKKworICBpZih6c3RvcmVmbGFnKXsKKyAgICBpbnQgb2ZmOworICAgIGlmKHAtPnouZmxhZ3MhPVZBUnx8cC0+ei52IT0mYmFua3YpIGllcnJvcigwKTsKKyAgICBvZmY9KGludCl6bTJsKHAtPnoudmFsLnZtYXgpOworICAgIHAtPno9enN0b3JlOworICAgIGdldF9hY2MoZixwLElOVCk7CisgICAgaWYoenN0b3JlLmZsYWdzJkRSRUZPQkopeworICAgICAgaWYoIUlTRlBPSU5URVIoenN0b3JlLmR0eXApKSBpZXJyb3IoMCk7CisgICAgICB6c3RvcmUuZmxhZ3MmPX5EUkVGT0JKOworICAgICAgbG9hZF9yZWcoZixMQVNUX1BBSVIsJnpzdG9yZSxQT0lOVEVSKTsKKyAgICAgIGlmKGluZGlyZWN0KCZ6c3RvcmUpKXsKKwlkb19ieXRlMyhmLCJsZGEiLCZ6c3RvcmUsRlBPSU5URVIpOworCWVtaXQoZiwiXHR0YXlcbiIpOworICAgICAgfWVsc2UKKwlkb19ieXRlMyhmLCJsZHkiLCZ6c3RvcmUsRlBPSU5URVIpOworICAgICAgeXZhbD1OT1ZBTDsKKyAgICB9ZWxzZXsKKyAgICAgIGxvYWRfYWRkcmVzcyhmLExBU1RfUEFJUiwmenN0b3JlLHAtPnR5cGYpOworICAgICAgcj1iYW5rKHpzdG9yZS52KTsKKyAgICAgIHNldHkoZixyPj0wP3I6YmFua2NudW0pOworICAgIH0KKyAgICBlbWl0KGYsIlx0bGR4XHQjJWRcbiIsb2ZmKTsKKyAgICBlbWl0KGYsIlx0bGRhXHQjJWRcbiIsY2Jhbms+PTA/Y2Jhbms6YmFua2NudW0pOworICAgIGVtaXQoZiwiXHRqc3JcdCVzX19iYW5rc3RvcmUlZFxuIixpZHByZWZpeCwoaW50KXptMmwoc2l6ZXRhYltwLT50eXBmJk5RXSkpOworICAgIHl2YWw9Tk9WQUw7CisgICAgenN0b3JlZmxhZz0wOworICB9CisKKyAgZm9yKHI9MTtyPD1NQVhSO3IrKyl7CisgICAgaWYocmVnc1tyXSY4KQorICAgICAgcmVnc1tyXSY9fjg7CisgIH0KKyAgZm9yKHI9RklSU1RfR1BSO3I8PUxBU1RfR1BSO3IrKyl7CisgICAgaW50IHRhPTA7CisgICAgaWYocmVnc1tyXSYyKXsKKyAgICAgIGlmKHJlZ3NbcmFdJiYhcHVzaGVkYWNjKXsKKwllbWl0KGYsIlx0dGF5XG4iKTsKKwl5dmFsPU5PVkFMOworCXRhPTE7CisgICAgICB9CisgICAgICBlbWl0KGYsIlx0cGxhXG4iKTsKKyAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisgICAgICByZWdzW3JdJj1+MjsKKyAgICB9CisgICAgaWYodGEpCisgICAgICBlbWl0KGYsIlx0dHlhXG4iKTsKKyAgfQorICBpZihwdXNoZWR4KXsKKyAgICBlbWl0KGYsIlx0bGR4XHQlc1xuIixtcmVnbmFtZXNbcHVzaGVkeF0pOworICAgIHB1c2hlZHg9MDsKKyAgfQorCisgIHJlbG9hZF9hY2Nfb3B0KGYscC0+bmV4dCk7Cit9CisKK3N0cnVjdCBjbXBsaXN0IHtzdHJ1Y3QgY21wbGlzdCAqbmV4dDtpbnQgZnJvbSx0byxtb2RlO30gKmZpcnN0X2NtcGxpc3Q7CisKK3N0YXRpYyB2b2lkIGFkZF9jbXBsaXN0KGludCBmcm9tLCBpbnQgdG8sIGludCBtb2RlKQoreworICBzdHJ1Y3QgY21wbGlzdCAqbmV3OworICBuZXc9bXltYWxsb2Moc2l6ZW9mKCpuZXcpKTsKKyAgbmV3LT5uZXh0PWZpcnN0X2NtcGxpc3Q7CisgIG5ldy0+ZnJvbT1mcm9tOworICBuZXctPnRvPXRvOworICBuZXctPm1vZGU9bW9kZTsKKyAgZmlyc3RfY21wbGlzdD1uZXc7Cit9CisKK3N0YXRpYyB2b2lkIGluY3NwKEZJTEUgKmYsbG9uZyBvZikKK3sKKyAgaWYob2Y9PTApIHJldHVybjsKKyAgaWYob2Y9PTF8fG9mPT0tMSl7CisgICAgc3RhdGljIG9iaiBvOworICAgIG8uZmxhZ3M9UkVHOworICAgIG8ucmVnPXNwOworICAgIGlmKG9mPT0xKQorICAgICAgaW5jbWVtKGYsJm8sSU5ULEFERCwxKTsKKyAgICBlbHNlCisgICAgICBpbmNtZW0oZiwmbyxJTlQsU1VCLDEpOworICB9ZWxzZSBpZihvZj09MjU2KXsKKyAgICBlbWl0KGYsIlx0aW5jXHQlcysxXG4iLG1yZWduYW1lc1tzcF0pOworICB9ZWxzZSBpZihvZj09LTI1Nil7CisgICAgZW1pdChmLCJcdGRlY1x0JXMrMVxuIixtcmVnbmFtZXNbc3BdKTsKKyAgfWVsc2V7CisgICAgbG9uZyBhYnM7CisgICAgaWYob2Y+MCl7CisgICAgICBhYnM9b2Y7CisgICAgICBlbWl0KGYsIlx0Y2xjXG4iKTsKKyAgICB9ZWxzZXsKKyAgICAgIGFicz0tb2Y7CisgICAgICBlbWl0KGYsIlx0c2VjXG4iKTsKKyAgICB9CisgICAgaWYoYWJzJjI1NSl7CisgICAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbc3BdKTsKKyAgICAgIGlmKG9mPjApeworCWVtaXQoZiwiXHRhZGNcdCMlbGRcbiIsYWJzJjI1NSk7CisgICAgICB9ZWxzZXsKKwllbWl0KGYsIlx0c2JjXHQjJWxkXG4iLGFicyYyNTUpOworICAgICAgfQorICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3NwXSk7CisgICAgfQorICAgIGlmKChhYnMmMHhmZjAwKT09MCl7CisgICAgICBpZihvZj4wKXsKKwllbWl0KGYsIlx0YmNjXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwllbWl0KGYsIlx0aW5jXHQlcysxXG4iLG1yZWduYW1lc1tzcF0pOworCWVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKyAgICAgIH1lbHNleworCWVtaXQoZiwiXHRiY3NcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCWVtaXQoZiwiXHRkZWNcdCVzKzFcbiIsbXJlZ25hbWVzW3NwXSk7CisJZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwpOworICAgICAgfQkKKyAgICB9ZWxzZXsKKyAgICAgIGVtaXQoZiwiXHRsZGFcdCVzKzFcbiIsbXJlZ25hbWVzW3NwXSk7CisgICAgICBpZihvZj4wKQorCWVtaXQoZiwiXHRhZGNcdCMlbGRcbiIsKGFicz4+OCkmMjU1KTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIlx0c2JjXHQjJWxkXG4iLChhYnM+PjgpJjI1NSk7CisgICAgICBlbWl0KGYsIlx0c3RhXHQlcysxXG4iLG1yZWduYW1lc1tzcF0pOworICAgIH0KKyAgfQorfQorCisvKiBnZW5lcmF0ZXMgdGhlIGZ1bmN0aW9uIGVudHJ5IGNvZGUgKi8KK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX3RvcChGSUxFICpmLHN0cnVjdCBWYXIgKnYsbG9uZyBvZmZzZXQpCit7CisgIGludCBpLHIsb2Y7CisgIHJzYXZlc2l6ZT0wOworICBsaWJzYXZlPTE7CisgIAorICBpZighb3B0c2l6ZXx8KHYtPnRhdHRyJk5PQ09NUFJFU1MpKSBlbWl0KGYsIjt2Y3BybWluPTEwMDAwXG4iKTsKKyAgaWYodmxhcykgZW1pdChmLCJfX19mb1x0c2V0XHQlbGRcbiIsKGxvbmcpYXJnc2l6ZSk7CisgIHI9MDsKKyAgZm9yKGk9RklSU1RfR1BSO2k8PUxBU1RfR1BSO2krKyl7CisgICAgaWYoKHJlZ3VzZWRbaV0mJihpbl9pc3J8fCFyZWdzY3JhdGNoW2ldKSl8fChpbl9pc3ImJmZ1bmN0aW9uX2NhbGxzJiZyZWdzY3JhdGNoW2ldJiYhcmVnc2FbaV0pKXsKKyAgICAgIGlmKGkhPUxBU1RfR1BSLVZPTF9HUFJTKzEmJnI9PTApIGxpYnNhdmU9MDsKKyAgICAgIHJzYXZlc2l6ZSsrOworICAgICAgcj0xOworICAgIH1lbHNleworICAgICAgaWYoaT09TEFTVF9HUFItVk9MX0dQUlMrMSkgbGlic2F2ZT0wOworICAgICAgcj0wOworICAgIH0KKyAgfQorICByc2NudD1yc2F2ZXNpemU7CisgIGlmKHJzY250JiYhU09GVFNUQUNLKXsKKyAgICBpZihvcHRzcGVlZHx8cnNjbnQ8MikKKyAgICAgIHJzYXZlc2l6ZT0wOworICAgIGVsc2UgaWYoIW9wdHNpemUmJnJzY250PD01KQorICAgICAgcnNhdmVzaXplPTA7CisgIH0KKyAgCisgIGlmKCFzcGVjaWFsX3NlY3Rpb24oZix2KSl7ZW1pdChmLGNvZGVuYW1lKTtlYmFuayhmLGJhbmsodikpO2lmKGYpIHNlY3Rpb249Q09ERTt9IAorICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4peworICAgIGlmKCh2LT5mbGFncyYoSU5MSU5FRlVOQ3xJTkxJTkVFWFQpKSE9SU5MSU5FRlVOQykKKyAgICAgIGVtaXQoZiwiXHRnbG9iYWxcdCVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgZW1pdChmLCIlcyVzOlxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgfWVsc2UKKyAgICBlbWl0KGYsIiVzJWxkOlxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKyAgCisgIG9mZnNldD1sb2NhbHNpemUrYXJnc2l6ZStyc2F2ZXNpemU7CisgIAorICBpZihpbl9pc3IpeworICAgIGVtaXQoZiwiXHRwaGFcbiIpOworICAgIGVtaXQoZiwiXHRwaHhcbiIpOworICAgIGVtaXQoZiwiXHRwaHlcbiIpOworICAgIGVtaXQoZiwiXHRwaHpcbiIpOworICAgIGlmKG9mZnNldHx8ZnVuY3Rpb25fY2FsbHMpeworICAgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3NwXSk7CisgICAgICBlbWl0KGYsIlx0cGhhXG4iKTsKKyAgICAgIGVtaXQoZiwiXHRsZGFcdCVzKzFcbiIsbXJlZ25hbWVzW3NwXSk7CisgICAgICBlbWl0KGYsIlx0cGhhXG4iKTsKKyAgICAgIGVtaXQoZiwiXHRsZGFcdCM8KF9fX2lzcnN0YWNrLSVsZClcbiIsb2Zmc2V0KTsKKyAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tzcF0pOworICAgICAgZW1pdChmLCJcdGxkYVx0Iz4oX19faXNyc3RhY2stJWxkKVxuIixvZmZzZXQpOworICAgICAgZW1pdChmLCJcdHN0YVx0JXMrMVxuIixtcmVnbmFtZXNbc3BdKTsKKyAgICB9CisgIH0KKworICBpZihNQUlOQVJHUyYmdi0+c3RvcmFnZV9jbGFzcz09RVhURVJOJiYhc3RyY21wKHYtPmlkZW50aWZpZXIsIm1haW4iKSYmdi0+dnR5cC0+ZXhhY3QtPmNvdW50PjEpCisgICAgZW1pdChmLCJcdGpzclx0aW5pdG1haW5hcmdzXG4iKTsKKworICB5dmFsPU5PVkFMOworICBvZj1hcmdzaXplK2xvY2Fsc2l6ZTsKKworICBpZihyc2F2ZXNpemU+MCYmb2YrcnNhdmVzaXplPjI1NSl7CisgICAgb2Zmc2V0LT1yc2F2ZXNpemU7CisgICAgaW5jc3AoZiwtcnNhdmVzaXplKTsKKyAgICBvZj0wOworICB9ZWxzZXsKKyAgICBpbmNzcChmLC1vZmZzZXQpOworICAgIG9mZnNldD0wOworICB9CisKKworICBpZighbGlic2F2ZXx8cnNjbnQhPXJzYXZlc2l6ZXx8b3B0c3BlZWR8fHJzY250PD0xfHwocnNjbnQ8PTMmJighb3B0c2l6ZSkpKQorICAgIGxpYnNhdmU9MDsKKyAgCisgIGlmKGxpYnNhdmUpeworICAgIHNldHkoZixvZityc2F2ZXNpemUtMSk7CisgICAgZW1pdChmLCJcdGpzclx0JXNfX3JzYXZlJWxkXG4iLGlkcHJlZml4LHJzY250KTsKKyAgICB5dmFsPW9mOworICB9ZWxzZXsKKyAgICBmb3IoaT1GSVJTVF9HUFI7aTw9TEFTVF9HUFI7aSsrKXsKKyAgICAgIGlmKChyZWd1c2VkW2ldJiYoaW5faXNyfHwhcmVnc2NyYXRjaFtpXSkpfHwoaW5faXNyJiZmdW5jdGlvbl9jYWxscyYmcmVnc2NyYXRjaFtpXSYmIXJlZ3NhW2ldKSl7CisJaWYocnNjbnQhPXJzYXZlc2l6ZSl7CisJICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbaV0pOworCSAgZW1pdChmLCJcdHBoYVxuIik7CisJfWVsc2V7CisJICBzZXR5KGYsb2YrKyk7CisJICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbaV0pOworCSAgZW1pdChmLCJcdHN0YVx0KCVzKSx5XG4iLG1yZWduYW1lc1tzcF0pOworCX0KKyAgICAgIH0KKyAgICB9CisgIH0KKworCisKKyAgaW5jc3AoZiwtb2Zmc2V0KTsKKworICBpZih2bGFzKXsKKyAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbc3BdKTsKKyAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbZnBdKTsKKyAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbc3AyXSk7CisgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW2ZwMl0pOworICB9Cit9CisKKy8qIGdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gZXhpdCBjb2RlICovCitzdGF0aWMgdm9pZCBmdW5jdGlvbl9ib3R0b20oRklMRSAqZixzdHJ1Y3QgVmFyICp2LGxvbmcgb2Zmc2V0KQoreworICBpbnQgaSxvZixhcjsKKyAgc3RydWN0IGNtcGxpc3QgKnA7CisgIG9mZnNldD1sb2NhbHNpemUrYXJnc2l6ZStyc2F2ZXNpemU7CisgIG9mPWFyZ3NpemUrbG9jYWxzaXplOworCisgIGk9ZnJldHVybih2LT52dHlwLT5uZXh0KTsKKyAgaWYoaT09cmF8fGk9PXJheCkgYXI9MTsgZWxzZSBhcj0wOworCisgIGlmKHJzY250IT1yc2F2ZXNpemUpeworICAgIGlmKGFyJiYhcHVzaGVkYWNjKXsKKyAgICAgIHB1c2hlZGFjYz10NDsKKyAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1twdXNoZWRhY2NdKTsKKyAgICB9CisgICAgZm9yKGk9TEFTVF9HUFI7aT49RklSU1RfR1BSO2ktLSl7CisgICAgICBpZigocmVndXNlZFtpXSYmKGluX2lzcnx8IXJlZ3NjcmF0Y2hbaV0pKXx8KGluX2lzciYmZnVuY3Rpb25fY2FsbHMmJnJlZ3NjcmF0Y2hbaV0mJiFyZWdzYVtpXSkpeworCWVtaXQoZiwiXHRwbGFcbiIpOworCWVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tpXSk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKHJzYXZlc2l6ZT4wJiZvZityc2F2ZXNpemU+MjU1KXsKKyAgICBpZihvZiE9MSYmYXImJiFwdXNoZWRhY2MpeworICAgICAgcHVzaGVkYWNjPXQ0OworICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3B1c2hlZGFjY10pOworICAgIH0KKyAgICBpbmNzcChmLG9mKTsKKyAgICBvZmZzZXQtPW9mOworICAgIG9mPTA7CisgIH0KKyAgaWYocnNhdmVzaXplPjApeworICAgIGlmKGFyJiYhcHVzaGVkYWNjKXsKKyAgICAgIHB1c2hlZGFjYz10NDsKKyAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1twdXNoZWRhY2NdKTsKKyAgICB9CisgIH0KKyAgaWYocnNhdmVzaXplKXsKKyAgICBpZihsaWJzYXZlKXsKKyAgICAgIHNldHkoZixvZityc2F2ZXNpemUtMSk7CisgICAgICBlbWl0KGYsIlx0anNyXHQlc19fcmxvYWQlbGRcbiIsaWRwcmVmaXgscnNjbnQpOworICAgICAgeXZhbD1vZjsKKyAgICB9ZWxzZXsKKyAgICAgIGZvcihpPUZJUlNUX0dQUjtpPD1MQVNUX0dQUjtpKyspeworCWlmKChyZWd1c2VkW2ldJiYoaW5faXNyfHwhcmVnc2NyYXRjaFtpXSkpfHwoaW5faXNyJiZmdW5jdGlvbl9jYWxscyYmcmVnc2NyYXRjaFtpXSYmIXJlZ3NhW2ldKSl7CisJICBzZXR5KGYsb2YrKyk7CisJICBlbWl0KGYsIlx0bGRhXHQoJXMpLHlcbiIsbXJlZ25hbWVzW3NwXSk7CisJICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbaV0pOworCX0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoaW5faXNyKXsKKyAgICBpZihvZmZzZXR8fGZ1bmN0aW9uX2NhbGxzKXsKKyAgICAgIGVtaXQoZiwiXHRwbGFcbiIpOworICAgICAgZW1pdChmLCJcdHN0YVx0JXMrMVxuIixtcmVnbmFtZXNbc3BdKTsKKyAgICAgIGVtaXQoZiwiXHRwbGFcbiIpOworICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3NwXSk7CisgICAgfQorICB9ZWxzZSBpZihvZmZzZXQ9PTImJiFwdXNoZWRhY2MpeworICAgIGVtaXQoZiwiXHRpbmNcdCVzXG4iLG1yZWduYW1lc1tzcF0pOworICAgIGVtaXQoZiwiXHRiZXFcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworICAgIGVtaXQoZiwiXHRpbmNcdCVzXG4iLG1yZWduYW1lc1tzcF0pOworICAgIGVtaXQoZiwiXHRiZXFcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworICAgIHJlbG9hZF9hY2MoZik7CisgICAgZW1pdChmLHJldCk7CisgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwtMSk7CisgICAgZW1pdChmLCJcdGluY1x0JXNcbiIsbXJlZ25hbWVzW3NwXSk7CisgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwpOworICAgIGVtaXQoZiwiXHRpbmNcdCVzKzFcbiIsbXJlZ25hbWVzW3NwXSk7CisgIH1lbHNleworICAgIGlmKG9mZnNldCE9MCYmYXImJiFwdXNoZWRhY2MpeworICAgICAgcHVzaGVkYWNjPXQ0OworICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3B1c2hlZGFjY10pOworICAgIH0KKyAgICBpbmNzcChmLG9mZnNldCk7CisgIH0KKworICByZWxvYWRfYWNjKGYpOworCisgIGlmKGluX2lzcil7CisgICAgZW1pdChmLCJcdHBselxuIik7CisgICAgZW1pdChmLCJcdHBseVxuIik7CisgICAgZW1pdChmLCJcdHBseFxuIik7CisgICAgZW1pdChmLCJcdHBsYVxuIik7CisgIH0KKyAgZW1pdChmLHJldCk7CisKKyAgZm9yKHA9Zmlyc3RfY21wbGlzdDtwOyl7CisgICAgc3RydWN0IGNtcGxpc3QgKm07CisgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgscC0+ZnJvbSk7CisgICAgaWYocC0+bW9kZT09Sk1QSU5EKXsKKyAgICAgIC8qIGluZGlyZWN0IGNhbGwgKi8KKyAgICAgIGVtaXQoZiwiXHRqbXBcdCglcylcbiIsbXJlZ25hbWVzW3AtPnRvXSk7CisgICAgfWVsc2V7CisgICAgICBwdXNoZWRhY2M9cC0+bW9kZTsKKyAgICAgIHJlbG9hZF9hY2MoZik7CisgICAgICBlbWl0KGYsIlx0JXNcdCVzJWRcbiIsam1waW5zdCxsYWJwcmVmaXgscC0+dG8pOworICAgIH0KKyAgICBtPXA7CisgICAgcD1wLT5uZXh0OworICAgIGZyZWUobSk7CisgIH0KKyAgZmlyc3RfY21wbGlzdD0wOworICBwdXNoZWRhY2M9MDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgRW5kIG9mIHByaXZhdGUgZGF0YSBhbmQgZnVuY3Rpb25zLiAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAgRG9lcyBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb25zIGZvciB0aGUgY29kZS1nZW5lcmF0b3IuIEdldHMgY2FsbGVkICAqLworLyogIG9uY2UgYXQgdGhlIGJlZ2lubmluZyBhbmQgc2hvdWxkIHJldHVybiAwIGluIGNhc2Ugb2YgcHJvYmxlbXMuICAgICAgKi8KK2ludCBpbml0X2NnKHZvaWQpCit7CisgIGludCBpOworICAvKiAgSW5pdGlhbGl6ZSBzb21lIHZhbHVlcyB3aGljaCBjYW5ub3QgYmUgc3RhdGljYWxseSBpbml0aWFsaXplZCAgICovCisgIC8qICBiZWNhdXNlIHRoZXkgYXJlIHN0b3JlZCBpbiB0aGUgdGFyZ2V0J3MgYXJpdGhtZXRpYy4gICAgICAgICAgICAgKi8KKyAgbWF4YWxpZ249bDJ6bSgxTCk7CisgIGNoYXJfYml0PWwyem0oOEwpOworICBzdGFja2FsaWduPWwyem0oMSk7CisKKyAgaWYoSUVFRSl7CisgICAgaWVlZT0xOworICAgIG1zaXpldGFiW0RPVUJMRV09bXNpemV0YWJbTERPVUJMRV09bDJ6bSg4TCk7CisgIH0KKworCisgIG1yZWduYW1lc1swXT1yZWduYW1lc1swXT0ibm9yZWciOworICBmb3IoaT1GSVJTVF9HUFI7aTw9TEFTVF9HUFI7aSsrKXsKKyAgICByZWduYW1lc1tpXT1teW1hbGxvYygxMCk7CisgICAgc3ByaW50ZihyZWduYW1lc1tpXSwiciVkIixpLUZJUlNUX0dQUik7CisgICAgbXJlZ25hbWVzW2ldPXJlZ25hbWVzW2ldOworICAgIHJlZ3NpemVbaV09bDJ6bSgxTCk7CisgICAgcmVndHlwZVtpXT0mY3R5cDsKKyAgfQorICBmb3IoaT1GSVJTVF9QQUlSO2k8PUxBU1RfUEFJUjtpKyspeworICAgIGludCBzcj0oaS1GSVJTVF9QQUlSKSoyK0ZJUlNUX0dQUjsKKyAgICByZWduYW1lc1tpXT1teW1hbGxvYygxMCk7CisgICAgc3ByaW50ZihyZWduYW1lc1tpXSwiJXMvJXMiLG1yZWduYW1lc1tzcl0sbXJlZ25hbWVzW3NyKzFdKTsKKyAgICBtcmVnbmFtZXNbaV09cmVnbmFtZXNbc3JdOworICAgIHJlZ3NpemVbaV09bDJ6bSgyTCk7CisgICAgcmVndHlwZVtpXT0maXR5cDsKKyAgfQorICBmb3IoaT1GSVJTVF9CSUc7aTw9TEFTVF9CSUc7aSsrKXsKKyAgICByZWduYW1lc1tpXT1teW1hbGxvYygxMCk7CisgICAgc3ByaW50ZihyZWduYW1lc1tpXSwiYnRtcCVkIixpLUZJUlNUX0JJRyk7CisgICAgbXJlZ25hbWVzW2ldPXJlZ25hbWVzW2ldOworICAgIHJlZ3NpemVbaV09bXNpemV0YWJbRkxPQVRdOworICAgIHJlZ3R5cGVbaV09JmZ0eXA7CisgICAgcmVnc2FbaV09MDsKKyAgICByZWdzY3JhdGNoW2ldPTE7CisgIH0KKyAgZm9yKGk9RklSU1RfQklHUDtpPD1MQVNUX0JJR1A7aSsrKXsKKyAgICBpbnQgc3I9KGktRklSU1RfQklHUCkqMitGSVJTVF9CSUc7CisgICAgcmVnbmFtZXNbaV09bXltYWxsb2MoMjApOworICAgIHNwcmludGYocmVnbmFtZXNbaV0sIiVzLyVzIixtcmVnbmFtZXNbc3JdLG1yZWduYW1lc1tzcisxXSk7CisgICAgbXJlZ25hbWVzW2ldPXJlZ25hbWVzW3NyXTsKKyAgICByZWdzaXplW2ldPW1zaXpldGFiW0xMT05HXTsKKyAgICByZWd0eXBlW2ldPSZsbHR5cDsKKyAgICByZWdzYVtpXT0wOworICAgIHJlZ3NjcmF0Y2hbaV09MTsKKyAgfQorCisgIG1yZWduYW1lc1tyYV0gPSByZWduYW1lc1tyYV0gPSAiYSI7CisgIG1yZWduYW1lc1tyeF0gPSByZWduYW1lc1tyeF0gPSAieCI7CisgIG1yZWduYW1lc1tyeV0gPSByZWduYW1lc1tyeV0gPSAieSI7CisgIG1yZWduYW1lc1tyel0gPSByZWduYW1lc1tyel0gPSAieiI7CisgIHJlZ3NpemVbcmFdPXJlZ3NpemVbcnhdPXJlZ3NpemVbcnldPXJlZ3NpemVbcnpdPWwyem0oMUwpOworICByZWd0eXBlW3JhXT1yZWd0eXBlW3J4XT1yZWd0eXBlW3J5XT1yZWd0eXBlW3J6XT0mY3R5cDsKKyAgbXJlZ25hbWVzW3NwXT1yZWduYW1lc1tzcF0gPSAic3AiOworICBtcmVnbmFtZXNbc3AxXT1yZWduYW1lc1tzcDFdID0gInNwIjsKKyAgbXJlZ25hbWVzW3NwMl09cmVnbmFtZXNbc3AyXSA9ICJzcCsxIjsKKworICBtcmVnbmFtZXNbcmF4XT1yZWduYW1lc1tyYXhdID0gImF4IjsKKyAgcmVnc2l6ZVtyYXhdPXJlZ3NpemVbc3BdPWwyem0oMkwpOworICByZWd0eXBlW3JheF09cmVndHlwZVtzcF09Jml0eXA7CisKKyAgcmVnX3ByaW9bcmFdPXJlZ19wcmlvW3JheF09MTAwOworICByZWdfcHJpb1tyeF09NTA7CisgIHJlZ19wcmlvW3J6XT01MDsKKworICBtcmVnbmFtZXNbcmF4eXpdPXJlZ25hbWVzW3JheHl6XSA9ICJheHl6IjsKKyAgcmVnc2l6ZVtyYXh5el09bDJ6bSg0TCk7CisgIHJlZ3R5cGVbcmF4eXpdPSZmdHlwOworCisgIC8qICBVc2UgbXVsdGlwbGUgY2NzLiAgICovCisgIG11bHRpcGxlX2Njcz0wOworCisgIHNob3J0X3B1c2g9MTsKKworICBzdGF0aWNfY3NlPTA7CisKKyAgZHJlZl9jc2U9MTsKKworICAvKnByZWZlcl9zdGF0aWNzPTE7IFRPRE8gKi8KKworCisgIGlmKG9wdHNpemUpeworICAgIGNsaXN0X2NvcHlfc3RhY2s9MjsKKyAgICBjbGlzdF9jb3B5X3BvaW50ZXI9MjsKKyAgICBjbGlzdF9jb3B5X3N0YXRpYz0yOworICB9ZWxzZSBpZihvcHRzcGVlZCl7CisgICAgY2xpc3RfY29weV9zdGFjaz02NDsKKyAgICBjbGlzdF9jb3B5X3BvaW50ZXI9NjQ7CisgICAgY2xpc3RfY29weV9zdGF0aWM9NjQ7CisgIH1lbHNleworICAgIGNsaXN0X2NvcHlfc3RhY2s9ODsKKyAgICBjbGlzdF9jb3B5X3BvaW50ZXI9ODsKKyAgICBjbGlzdF9jb3B5X3N0YXRpYz04OworICB9CisKKyAgLyogIEluaXRpYWxpemUgdGhlIG1pbi9tYXgtc2V0dGluZ3MuIE5vdGUgdGhhdCB0aGUgdHlwZXMgb2YgdGhlICAgICAqLworICAvKiAgaG9zdCBzeXN0ZW0gbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSB0YXJnZXQgc3lzdGVtIGFuZCB5b3UgbWF5ICovCisgIC8qICBvbmx5IHVzZSB0aGUgc21hbGxlc3QgbWF4aW11bSB2YWx1ZXMgQU5TSSBndWFyYW50ZWVzIGlmIHlvdSAgICAgKi8KKyAgLyogIHdhbnQgdG8gYmUgcG9ydGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgVGhhdCdzIHRoZSByZWFzb24gZm9yIHRoZSBzdWJ0cmFjdGlvbiBpbiB0X21pbltJTlRdLiBMb25nIGNvdWxkICovCisgIC8qICBiZSB1bmFibGUgdG8gcmVwcmVzZW50IC0yMTQ3NDgzNjQ4IG9uIHRoZSBob3N0IHN5c3RlbS4gICAgICAgICAgKi8KKyAgdF9taW5bQ0hBUl09bDJ6bSgtMTI4TCk7CisgIHRfbWluW1NIT1JUXT1sMnptKC0zMjc2OEwpOworICB0X21pbltMT05HXT16bXN1YihsMnptKC0yMTQ3NDgzNjQ3TCksbDJ6bSgxTCkpOworICB0X21pbltJTlRdPXRfbWluKFNIT1JUKTsKKyAgdF9taW5bTExPTkddPXptbHNoaWZ0KGwyem0oMUwpLGwyem0oNjNMKSk7CisgIHRfbWluW01BWElOVF09dF9taW4oTExPTkcpOworICB0X21heFtDSEFSXT11bDJ6dW0oMTI3TCk7CisgIHRfbWF4W1NIT1JUXT11bDJ6dW0oMzI3NjdVTCk7CisgIHRfbWF4W0xPTkddPXVsMnp1bSgyMTQ3NDgzNjQ3VUwpOworICB0X21heFtJTlRdPXRfbWF4KFNIT1JUKTsKKyAgdF9tYXhbTExPTkddPXp1bXJzaGlmdCh6dW1rb21wbCh1bDJ6dW0oMFVMKSksdWwyenVtKDFVTCkpOworICB0X21heFtNQVhJTlRdPXRfbWF4KExMT05HKTsKKyAgdHVfbWF4W0NIQVJdPXVsMnp1bSgyNTVVTCk7CisgIHR1X21heFtTSE9SVF09dWwyenVtKDY1NTM1VUwpOworICB0dV9tYXhbTE9OR109dWwyenVtKDQyOTQ5NjcyOTVVTCk7CisgIHR1X21heFtJTlRdPXRfbWF4KFVOU0lHTkVEfFNIT1JUKTsKKyAgdHVfbWF4W0xMT05HXT16dW1rb21wbCh1bDJ6dW0oMFVMKSk7CisgIHR1X21heFtNQVhJTlRdPXRfbWF4KFVOU0lHTkVEfExMT05HKTsKKyAgCisgIC8qICBSZXNlcnZlIGEgZmV3IHJlZ2lzdGVycyBmb3IgdXNlIGJ5IHRoZSBjb2RlLWdlbmVyYXRvci4gICAgICAqLworICAvKiAgVGhpcyBpcyBub3Qgb3B0aW1hbCBidXQgc2ltcGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgcmVnc2FbcmF4eXpdPXJlZ3NhW3J5XT1yZWdzYVtzcF09cmVnc2Fbc3AxXT1yZWdzYVtzcDJdPVJFR1NBX05FVkVSOworICByZWdzYVt0MV09cmVnc2FbdDJdPXJlZ3NhW3QzXT1yZWdzYVt0NF09UkVHU0FfTkVWRVI7CisgIHJlZ3NjcmF0Y2hbcmFdPXJlZ3NjcmF0Y2hbcnhdPXJlZ3NjcmF0Y2hbcmF4XT0xOworICBpZighR0xPQkFDQykKKyAgICByZWdzYVtyYV09LypyZWdzYVtyeF09Ki9yZWdzYVtyYXhdPVJFR1NBX1RFTVBTOworICByZWdzY3JhdGNoW3NwXT1yZWdzY3JhdGNoW3NwMV09cmVnc2NyYXRjaFtzcDJdPXJlZ3NjcmF0Y2hbcnldPXJlZ3NjcmF0Y2hbcnpdPTA7CisgIHJlZ3NjcmF0Y2hbdDFdPXJlZ3NjcmF0Y2hbdDJdPXJlZ3NjcmF0Y2hbdDNdPXJlZ3NjcmF0Y2hbdDRdPTE7CisKKyAgZm9yKGk9RklSU1RfR1BSO2k8PUxBU1RfR1BSLVZPTF9HUFJTO2krKyl7CisgICAgcmVnc2NyYXRjaFtpXT0xOworICAgIGlmKGkmMSkKKyAgICAgIHJlZ3NjcmF0Y2hbRklSU1RfUEFJUisoaS1GSVJTVF9HUFIpLzJdPTE7CisgIH0KKworICB0YXJnZXRfbWFjcm9zPW1hcnJheTsKKworICBkZWNsYXJlX2J1aWx0aW4oIl9fbXVsaW50MTYiLElOVCxJTlQsRklSU1RfUEFJUixJTlQsRklSU1RfUEFJUisxLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19tdWx1aW50MTYiLFVOU0lHTkVEfElOVCxVTlNJR05FRHxJTlQsRklSU1RfUEFJUixVTlNJR05FRHxJTlQsRklSU1RfUEFJUisxLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZ1aW50MTYiLFVOU0lHTkVEfElOVCxVTlNJR05FRHxJTlQsRklSU1RfUEFJUixVTlNJR05FRHxJTlQsRklSU1RfUEFJUisxLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZpbnQxNiIsSU5ULElOVCxGSVJTVF9QQUlSLElOVCxGSVJTVF9QQUlSKzEsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZHVpbnQxNiIsVU5TSUdORUR8SU5ULFVOU0lHTkVEfElOVCxGSVJTVF9QQUlSLFVOU0lHTkVEfElOVCxGSVJTVF9QQUlSKzEsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZGludDE2IixJTlQsSU5ULEZJUlNUX1BBSVIsSU5ULEZJUlNUX1BBSVIrMSwxLDApOworCisgIGRlY2xhcmVfYnVpbHRpbigiX19tdWxpbnQzMiIsTE9ORyxMT05HLEZJUlNUX0JJRysxLExPTkcsRklSU1RfQklHKzIsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX211bHVpbnQzMiIsVU5TSUdORUR8TE9ORyxVTlNJR05FRHxMT05HLEZJUlNUX0JJRysxLFVOU0lHTkVEfExPTkcsRklSU1RfQklHKzIsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2RpdmludDMyIixMT05HLExPTkcsRklSU1RfQklHLExPTkcsRklSU1RfQklHKzEsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2RpdnVpbnQzMiIsVU5TSUdORUR8TE9ORyxVTlNJR05FRHxMT05HLEZJUlNUX0JJRyxVTlNJR05FRHxMT05HLEZJUlNUX0JJRysxLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19tb2RpbnQzMiIsTE9ORyxMT05HLEZJUlNUX0JJRyxMT05HLEZJUlNUX0JJRysxLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19tb2R1aW50MzIiLFVOU0lHTkVEfExPTkcsVU5TSUdORUR8TE9ORyxGSVJTVF9CSUcsVU5TSUdORUR8TE9ORyxGSVJTVF9CSUcrMSwxLDApOworCisgIGRlY2xhcmVfYnVpbHRpbigiX19tdWxpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19hZGRpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19zdWJpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19hbmRpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19vcmludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2VvcmludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX25lZ2ludDY0IixMTE9ORyxMTE9ORywwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbHNsaW50NjQiLExMT05HLExMT05HLDAsSU5ULDAsMSwwKTsKKworICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2aW50NjQiLExMT05HLExMT05HLDAsTExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2dWludDY0IixVTlNJR05FRHxMTE9ORyxVTlNJR05FRHxMTE9ORywwLFVOU0lHTkVEfExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZGludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZHVpbnQ2NCIsVU5TSUdORUR8TExPTkcsVU5TSUdORUR8TExPTkcsMCxVTlNJR05FRHxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19sc3JpbnQ2NCIsTExPTkcsTExPTkcsMCxJTlQsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbHNydWludDY0IixVTlNJR05FRHxMTE9ORyxVTlNJR05FRHxMTE9ORywwLElOVCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19jbXBzaW50NjQiLElOVCxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2NtcHVpbnQ2NCIsSU5ULFVOU0lHTkVEfExMT05HLDAsVU5TSUdORUR8TExPTkcsMCwxLDApOworCisgIGRlY2xhcmVfYnVpbHRpbigiX19zaW50MzJ0b2ZsdDMyIixGTE9BVCxMT05HLE9MREZQPzA6RklSU1RfQklHLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fdWludDMydG9mbHQzMiIsRkxPQVQsVU5TSUdORUR8TE9ORyxPTERGUD8wOkZJUlNUX0JJRywwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDMydG9zaW50MzIiLExPTkcsRkxPQVQsT0xERlA/MDpGSVJTVF9CSUcsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvdWludDMyIixVTlNJR05FRHxMT05HLEZMT0FULE9MREZQPzA6RklSU1RfQklHLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDE2dG9mbHQzMiIsRkxPQVQsSU5ULEZJUlNUX1BBSVIsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX191aW50MTZ0b2ZsdDMyIixGTE9BVCxVTlNJR05FRHxJTlQsRklSU1RfUEFJUiwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDMydG9zaW50MTYiLElOVCxGTE9BVCxPTERGUD8wOkZJUlNUX0JJRywwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDMydG91aW50MTYiLFVOU0lHTkVEfElOVCxGTE9BVCxPTERGUD8wOkZJUlNUX0JJRywwLDAsMSwwKTsKKworICBkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDMydG9mbHQ2NCIsRE9VQkxFLExPTkcsT0xERlA/MDpGSVJTVF9CSUcsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX191aW50MzJ0b2ZsdDY0IixET1VCTEUsVU5TSUdORUR8TE9ORyxPTERGUD8wOkZJUlNUX0JJRywwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDY0dG9zaW50MzIiLExPTkcsRE9VQkxFLE9MREZQPzA6RklSU1RfQklHUCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDY0dG91aW50MzIiLFVOU0lHTkVEfExPTkcsRE9VQkxFLE9MREZQPzA6RklSU1RfQklHUCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3NpbnQxNnRvZmx0NjQiLERPVUJMRSxJTlQsRklSU1RfUEFJUiwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3VpbnQxNnRvZmx0NjQiLERPVUJMRSxVTlNJR05FRHxJTlQsRklSU1RfUEFJUiwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDY0dG9zaW50MTYiLElOVCxET1VCTEUsT0xERlA/MDpGSVJTVF9CSUdQLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b3VpbnQxNiIsVU5TSUdORUR8SU5ULERPVUJMRSxPTERGUD8wOkZJUlNUX0JJR1AsMCwwLDEsMCk7CisKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDY0dG9mbHQzMiIsRkxPQVQsRE9VQkxFLE9MREZQPzA6RklSU1RfQklHUCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDMydG9mbHQ2NCIsRE9VQkxFLEZMT0FULE9MREZQPzA6RklSU1RfQklHLDAsMCwxLDApOworCisgIGRlY2xhcmVfYnVpbHRpbigiX19hZGRmbHQzMiIsRkxPQVQsRkxPQVQsT0xERlA/MDpGSVJTVF9CSUcrMSxGTE9BVCxPTERGUD8wOkZJUlNUX0JJRywxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fc3ViZmx0MzIiLEZMT0FULEZMT0FULE9MREZQPzA6RklSU1RfQklHKzEsRkxPQVQsT0xERlA/MDpGSVJTVF9CSUcsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX211bGZsdDMyIixGTE9BVCxGTE9BVCxPTERGUD8wOkZJUlNUX0JJRysxLEZMT0FULE9MREZQPzA6RklSU1RfQklHLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZmbHQzMiIsRkxPQVQsRkxPQVQsT0xERlA/MDpGSVJTVF9CSUcrMSxGTE9BVCxPTERGUD8wOkZJUlNUX0JJRywxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbmVnZmx0MzIiLEZMT0FULEZMT0FULE9MREZQPzA6RklSU1RfQklHLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fY21wc2ZsdDMyIixDSEFSLEZMT0FULE9MREZQPzA6RklSU1RfQklHKzEsRkxPQVQsT0xERlA/MDpGSVJTVF9CSUcsMSwwKTsKKworI2lmIDAKKyAgZm9yKGk9MTtpPE1BWFI7aSsrKXsKKyAgICBwcmludGYoIiUwMmQgJXMgc2NyYXRjaD0lZCAiLGkscmVnbmFtZXNbaV0scmVnc2NyYXRjaFtpXSk7CisgICAgaWYocmVnX3BhaXIoaSwmcnApKQorICAgICAgcHJpbnRmKCJwYWlyKCVzLCVzKSIscmVnbmFtZXNbcnAucjFdLHJlZ25hbWVzW3JwLnIyXSk7CisgICAgcHJpbnRmKCJcbiIpOworICB9CisjZW5kaWYKKworICBpZihOT1BFRVApIG5vcGVlcD0xOworICBpZihDQk1BU0NJSSkgY2JtYXNjaWk9MTsKKyAgaWYoQVRBU0NJSSkgYXRhc2NpaT0xOworICBpZihDMDIpeworICAgIGMwMj0xOworICAgIGhhc196ZXJvX3JlZz0xOworICAgIGhhc19pbmNfYT0xOworICAgIGptcGluc3Q9ImJyYSI7CisgIH1lbHNlCisgICAgam1waW5zdD0iam1wIjsKKworICBmb3IoaT0wO2k8PU1BWF9UWVBFO2krKyl7CisgICAgc2l6ZXRhYltpXT1sMnptKG1zaXpldGFiW2ldKTsKKyAgICBhbGlnbltpXT1sMnptKG1hbGlnbltpXSk7CisgIH0KKworICBiYW5rdi5zdG9yYWdlX2NsYXNzPUVYVEVSTjsKKyAgYmFua3YuaWRlbnRpZmllcj0iX19iYW5rdiI7CisgIGJhbmt2LnZ0eXA9bmV3X3R5cCgpOworICBiYW5rdi52dHlwLT5mbGFncz1DSEFSOworCisgIGJhbmtjbnVtPUNPTU1PTkJBTks7CisKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgaW5pdF9kYihGSUxFICpmKQoreworfQorCitpbnQgZnJldHVybihzdHJ1Y3QgVHlwICp0KQorLyogIFJldHVybnMgdGhlIHJlZ2lzdGVyIGluIHdoaWNoIHZhcmlhYmxlcyBvZiB0eXBlIHQgYXJlIHJldHVybmVkLiAqLworLyogIElmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgcmV0dXJuZWQgaW4gYSByZWdpc3RlciByZXR1cm5zIDAuICAgICAgICAqLworLyogIEEgcG9pbnRlciBNVVNUIGJlIHJldHVybmVkIGluIGEgcmVnaXN0ZXIuIFRoZSBjb2RlLWdlbmVyYXRvciAgICAqLworLyogIGhhcyB0byBzaW11bGF0ZSBhIHBzZXVkbyByZWdpc3RlciBpZiBuZWNlc3NhcnkuICAgICAgICAgICAgICAgICAqLworeworICBpbnQgdHlwPXQtPmZsYWdzJk5ROworICBpZihJU1NUUlVDVCh0eXApfHxJU1VOSU9OKHR5cCl8fHR5cD09Vk9JRCkgCisgICAgcmV0dXJuIDA7CisgIGlmKE9MREZQJiZJU0ZMT0FUKHR5cCkpIHJldHVybiBGSVJTVF9HUFI7CisgIGlmKHR5cD09TE9OR3x8dHlwPT1GTE9BVHx8SVNGUE9JTlRFUih0eXApfHwoIWllZWUmJih0eXA9PURPVUJMRXx8dHlwPT1MRE9VQkxFKSkpCisgICAgcmV0dXJuIEZJUlNUX0JJRzsKKyAgaWYodHlwPT1MTE9OR3x8KGllZWUmJih0eXA9PURPVUJMRXx8dHlwPT1MRE9VQkxFKSkpCisgICAgcmV0dXJuIEZJUlNUX0JJR1A7CisgIGlmKHptbGVxKHN6b2YodCksbDJ6bSgxTCkpKQorICAgIHJldHVybiByYTsKKyAgaWYoem1sZXEoc3pvZih0KSxsMnptKDJMKSkpIAorICAgIHJldHVybiByYXg7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworaW50IHJlZ19wYWlyKGludCByLHN0cnVjdCBycGFpciAqcCkKKy8qIFJldHVybnMgMCBpZiB0aGUgcmVnaXN0ZXIgaXMgbm8gcmVnaXN0ZXIgcGFpci4gSWYgciAgKi8KKy8qIGlzIGEgcmVnaXN0ZXIgcGFpciBub24temVybyB3aWxsIGJlIHJldHVybmVkIGFuZCB0aGUgKi8KKy8qIHN0cnVjdHVyZSBwb2ludGVkIHRvIHAgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgdHdvICAgKi8KKy8qIGVsZW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYocj49RklSU1RfUEFJUiYmcjw9TEFTVF9QQUlSKXsKKyAgICBwLT5yMT0oci1GSVJTVF9QQUlSKSoyK0ZJUlNUX0dQUjsKKyAgICBwLT5yMj1wLT5yMSsxOworICAgIHJldHVybiAxOworICB9ZWxzZSBpZihyPj1GSVJTVF9CSUdQJiZyPD1MQVNUX0JJR1ApeworICAgIHAtPnIxPShyLUZJUlNUX0JJR1ApKjIrRklSU1RfQklHOworICAgIHAtPnIyPXAtPnIxKzE7CisgICAgcmV0dXJuIDE7CisgIH1lbHNlIGlmKHI9PXJheCl7CisgICAgcC0+cjE9cmE7CisgICAgcC0+cjI9cng7CisgICAgcmV0dXJuIDE7CisgIH1lbHNlIGlmKHI9PXJheHl6KSB7CisgICAgLy8gVE9ETzogUEdTOiBIb3cgZG8gd2UgZGVjbGFyZSBhIHJlZyBwYWlyIHRoYXQgaXMgbWFkZSBvZiA0IHJlZ3MsIG5vdCAyPworICAgIHJldHVybiAwOworICB9ZWxzZSBpZihyPT1zcCl7CisgICAgcC0+cjE9c3AxOworICAgIHAtPnIyPXNwMjsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyogZXN0aW1hdGUgdGhlIGNvc3Qtc2F2aW5nIGlmIG9iamVjdCBvIGZyb20gSUMgcCBpcyBwbGFjZWQgaW4KKyAgIHJlZ2lzdGVyIHIgKi8KK2ludCBjb3N0X3NhdmluZ3Moc3RydWN0IElDICpwLGludCByLHN0cnVjdCBvYmogKm8pCit7CisgIGludCBjPXAtPmNvZGU7CisgIGlmKElTSURYKHIpKXsKKyAgICBpZihjPT1BRER8fGM9PVNVQnx8Yz09QURESTJQfHxjPT1TVUJJRlApeworICAgICAgaWYobz09JnAtPnEyJiZjIT1BRERJMlApIHJldHVybiAtMjsKKyAgICB9ZWxzZSBpZihjPT1BU1NJR04peworICAgICAgaWYobz09JnAtPnExJiZpbmRpcmVjdCgmcC0+eikpIHJldHVybiAxOworICAgICAgaWYobz09JnAtPnomJmluZGlyZWN0KCZwLT5xMSkpIHJldHVybiAxOworICAgIH1lbHNlIGlmKGM9PUNPTVBBUkUpeworICAgICAgLy9pZihvPT0mcC0+cTEmJmluZGlyZWN0KCZwLT5xMikpIHJldHVybiBJTlRfTUlOOworICAgICAgLy9pZihvPT0mcC0+cTImJmluZGlyZWN0KCZwLT5xMSkpIHJldHVybiBJTlRfTUlOOworICAgIH1lbHNlIGlmKGM9PVRFU1QpeworICAgIH1lbHNlIGlmKGM9PVNFVFJFVFVSTnx8Yz09R0VUUkVUVVJOKXsKKyAgICB9ZWxzZQorICAgICAgcmV0dXJuIElOVF9NSU47CisgIH0KKyAgLypUT0RPOiBhZGFwdCB0aGlzICovCisgIGlmKG8tPmZsYWdzJlZLT05TVCl7CisgICAgcmV0dXJuIDA7CisgICAgaWYobz09JnAtPnExJiZwLT5jb2RlPT1BU1NJR04mJihwLT56LmZsYWdzJkRSRUZPQkopKQorICAgICAgcmV0dXJuIDQ7CisgICAgZWxzZQorICAgICAgcmV0dXJuIDI7CisgIH0KKyAgaWYoby0+ZmxhZ3MmRFJFRk9CSil7CisgICAgaWYoaXNwdHIocikpCisgICAgICByZXR1cm4gNDsKKyAgICBpZihyPT1yYXgpCisgICAgICByZXR1cm4gSU5UX01JTjsKKyAgfQorICBpZihjPT1TRVRSRVRVUk4mJnI9PXAtPnoucmVnJiYhKG8tPmZsYWdzJkRSRUZPQkopKSByZXR1cm4gNjsKKyAgaWYoYz09R0VUUkVUVVJOJiZyPT1wLT5xMS5yZWcmJiEoby0+ZmxhZ3MmRFJFRk9CSikpIHJldHVybiA2OworICBpZihyPT1yYSkKKyAgICByZXR1cm4gNTsKKyAgaWYoSVNJRFgocikpCisgICAgcmV0dXJuIDQ7CisgIGlmKHI9PXJheCkKKyAgICByZXR1cm4gMjsKKyAgcmV0dXJuIDI7Cit9CisKK2ludCByZWdvayhpbnQgcixpbnQgdCxpbnQgbW9kZSkKKy8qICBSZXR1cm5zIDAgaWYgcmVnaXN0ZXIgciBjYW5ub3Qgc3RvcmUgdmFyaWFibGVzIG9mICAgKi8KKy8qICB0eXBlIHQuIElmIHQ9PVBPSU5URVIgYW5kIG1vZGUhPTAgdGhlbiBpdCByZXR1cm5zICAgKi8KKy8qICBub24temVybyBvbmx5IGlmIHRoZSByZWdpc3RlciBjYW4gc3RvcmUgYSBwb2ludGVyICAgKi8KKy8qICBhbmQgZGVyZWZlcmVuY2UgYSBwb2ludGVyIHRvIG1vZGUuICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYocj09MCkKKyAgICByZXR1cm4gMDsKKyAgaWYocj09cmF4JiZOT1JBWCkKKyAgICByZXR1cm4gMDsKKyAgdCY9TlE7CisgIGlmKElTQ0hBUih0KSkKKyAgICBpZihyPT1yYXx8KElTSURYKHIpJiYob3B0ZmxhZ3MmMikpfHwocj49RklSU1RfR1BSJiZyPD1MQVNUX0dQUikpCisgICAgICByZXR1cm4gMTsKKyAgaWYoSVNTSE9SVCh0KSl7CisgICAgaWYocj09cmF4KXsKKyAgICAgIGlmKHQ9PVBPSU5URVImJm1vZGU8MCkKKwlyZXR1cm4gMTsKKyAgICAgIGlmKHQhPVBPSU5URVIpCisJcmV0dXJuIDE7CisgICAgfQorICAgIGlmKHI+PUZJUlNUX1BBSVImJnI8PUxBU1RfUEFJUikKKyAgICAgIHJldHVybiAxOworICB9CisgIGlmKHI+PUZJUlNUX0JJRyYmcjw9TEFTVF9CSUcpeworICAgIGlmKHQ9PUxPTkd8fHQ9PUZMT0FUfHwoKHQ9PURPVUJMRXx8dD09TERPVUJMRSkmJiFpZWVlKSkKKyAgICAgIHJldHVybiAxOworICAgIGlmKHQ9PUZQT0lOVEVSKQorICAgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYocj49RklSU1RfQklHUCYmcjw9TEFTVF9CSUdQKXsKKyAgICBpZih0PT1MTE9OR3x8KCh0PT1ET1VCTEV8fHQ9PUxET1VCTEUpJiZpZWVlKSkKKyAgICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCitpbnQgZGFuZ2Vyb3VzX0lDKHN0cnVjdCBJQyAqcCkKKy8qICBSZXR1cm5zIHplcm8gaWYgdGhlIElDIHAgY2FuIGJlIHNhZmVseSBleGVjdXRlZCAgICAgKi8KKy8qICB3aXRob3V0IGRhbmdlciBvZiBleGNlcHRpb25zIG9yIHNpbWlsYXIgdGhpbmdzLiAgICAgKi8KKy8qICB2YmNjIG1heSBnZW5lcmF0ZSBjb2RlIGluIHdoaWNoIG5vbi1kYW5nZXJvdXMgSUNzICAgKi8KKy8qICBhcmUgc29tZXRpbWVzIGV4ZWN1dGVkIGFsdGhvdWdoIGNvbnRyb2wtZmxvdyBtYXkgICAgKi8KKy8qICBuZXZlciByZWFjaCB0aGVtIChtYWlubHkgd2hlbiBtb3ZpbmcgY29tcHV0YXRpb25zICAgKi8KKy8qICBvdXQgb2YgbG9vcHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUeXBpY2FsIElDcyB0aGF0IGdlbmVyYXRlIGV4Y2VwdGlvbnMgb24gc29tZSAgICAgICAgKi8KKy8qICBtYWNoaW5lcyBhcmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBhY2Nlc3NlcyB2aWEgcG9pbnRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBkaXZpc2lvbi9tb2R1bG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBvdmVyZmxvdyBvbiBzaWduZWQgaW50ZWdlci9mbG9hdHMgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGM9cC0+Y29kZTsKKyAgaWYoKHAtPnExLmZsYWdzJkRSRUZPQkopfHwocC0+cTIuZmxhZ3MmRFJFRk9CSil8fChwLT56LmZsYWdzJkRSRUZPQkopKQorICAgIHJldHVybiAxOworICBpZigoYz09RElWfHxjPT1NT0QpJiYhaXNjb25zdChxMikpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitpbnQgbXVzdF9jb252ZXJ0KGludCBvLGludCB0LGludCBjb25zdF9leHByKQorLyogIFJldHVybnMgemVybyBpZiBjb2RlIGZvciBjb252ZXJ0aW5nIG5wIHRvIHR5cGUgdCAgICAqLworLyogIGNhbiBiZSBvbWl0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE9uIHRoZSBQb3dlclBDIGNwdSBwb2ludGVycyBhbmQgMzJiaXQgICAgICAgICAgICAgICAqLworLyogIGludGVnZXJzIGhhdmUgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gYW5kIGNhbiB1c2UgICAqLworLyogIHRoZSBzYW1lIHJlZ2lzdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgb3A9byZOUSx0cD10Jk5ROworCisgIGlmKG9wPT10cCkgcmV0dXJuIDA7CisgIGlmKElTQ0hBUihvcCkmJklTQ0hBUih0cCkpIHJldHVybiAwOworICBpZihJU1NIT1JUKG9wKSYmSVNTSE9SVCh0cCkpIHJldHVybiAwOworICBpZighaWVlZSYmSVNGTE9BVChvcCkmJklTRkxPQVQodHApKSByZXR1cm4gMDsKKyAgaWYob3A9PURPVUJMRSYmdHA9PUxET1VCTEUpIHJldHVybiAwOworICBpZihvcD09TERPVUJMRSYmdHA9PURPVUJMRSkgcmV0dXJuIDA7CisKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgZ2VuX2RzKEZJTEUgKmYsem1heCBzaXplLHN0cnVjdCBUeXAgKnQpCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIDxzaXplPiBieXRlcyBvZiBzdG9yYWdlICovCisvKiAgaW5pdGlhbGl6ZWQgd2l0aCB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGlmKFNURFNZTlRBWCkKKyAgICBlbWl0KGYsIlx0c3BhY2VcdCVsZFxuIix6bTJsKHNpemUpKTsKKyAgZWxzZQorICAgIGVtaXQoZiwiXHRyZXNlcnZlXHQlbGRcbiIsem0ybChzaXplKSk7CisgIG5ld29iaj0wOworfQorCit2b2lkIGdlbl9hbGlnbihGSUxFICpmLHptYXggYWxpZ24pCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gbWFrZSBzdXJlIHRoZSBuZXh0IGRhdGEgaXMgICAgICovCisvKiAgYWxpZ25lZCB0byBtdWx0aXBsZXMgb2YgPGFsaWduPiBieXRlcy4gICAgICAgICAgICAgICovCit7CisgIGlmKHptMmwoYWxpZ24pPjEpIGVtaXQoZiwiXHRhbGlnbiAxXG4iKTsKK30KKwordm9pZCBnZW5fdmFyX2hlYWQoRklMRSAqZixzdHJ1Y3QgVmFyICp2KQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSB0aGUgaGVhZCBvZiBhIHZhcmlhYmxlICAqLworLyogIGRlZmluaXRpb24sIGkuZS4gdGhlIGxhYmVsIGFuZCBpbmZvcm1hdGlvbiBmb3IgICAgICAqLworLyogIGxpbmthZ2UgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgY29uc3RmbGFnLGI9YmFuayh2KTtjaGFyICpzZWM7CisgIGlmKHYtPmNsaXN0KSBjb25zdGZsYWc9aXNfY29uc3Qodi0+dnR5cCk7CisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQyl7CisgICAgaWYoSVNGVU5DKHYtPnZ0eXAtPmZsYWdzKSkgcmV0dXJuOworICAgIGlmKHYtPnRhdHRyJlpQQUdFKQorICAgICAgZW1pdChmLCJcdHpwYWdlXHQlcyVsZFxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKyAgICBpZighc3BlY2lhbF9zZWN0aW9uKGYsdikpeworICAgICAgaWYodi0+Y2xpc3QmJighY29uc3RmbGFnfHwoZ19mbGFnc1syXSZVU0VERkxBRykpKXtlbWl0KGYsZGF0YW5hbWUpO2ViYW5rKGYsYik7aWYoZikgc2VjdGlvbj1EQVRBO30KKyAgICAgIGlmKHYtPmNsaXN0JiZjb25zdGZsYWcmJiEoZ19mbGFnc1syXSZVU0VERkxBRykpe2VtaXQoZixyb2RhdGFuYW1lKTtlYmFuayhmLGIpO2lmKGYpIHNlY3Rpb249Uk9EQVRBO30KKyAgICAgIGlmKCF2LT5jbGlzdCl7ZW1pdChmLGJzc25hbWUpO2ViYW5rKGYsYik7aWYoZikgc2VjdGlvbj1CU1M7fQorICAgIH0KKyAgICBnZW5fYWxpZ24oZixmYWxpZ24odi0+dnR5cCkpOworICAgIGVtaXQoZiwiJXMlbGQ6XG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICAgIG5ld29iaj0xOworICB9CisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisgICAgZW1pdChmLCJcdGdsb2JhbFx0JXMlc1xuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICBpZih2LT50YXR0ciZaUEFHRSkKKyAgICAgIGVtaXQoZiwiXHR6cGFnZVx0JXMlc1xuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICBpZih2LT5mbGFncyYoREVGSU5FRHxURU5UQVRJVkUpKXsKKyAgICAgIGlmKCFzcGVjaWFsX3NlY3Rpb24oZix2KSl7CisJaWYodi0+Y2xpc3QmJighY29uc3RmbGFnfHwoZ19mbGFnc1syXSZVU0VERkxBRykpKXtlbWl0KGYsZGF0YW5hbWUpO2ViYW5rKGYsYik7aWYoZikgc2VjdGlvbj1EQVRBO30KKwlpZih2LT5jbGlzdCYmY29uc3RmbGFnJiYhKGdfZmxhZ3NbMl0mVVNFREZMQUcpKXtlbWl0KGYscm9kYXRhbmFtZSk7ZWJhbmsoZixiKTtpZihmKSBzZWN0aW9uPVJPREFUQTt9CisJaWYoIXYtPmNsaXN0KXtlbWl0KGYsYnNzbmFtZSk7ZWJhbmsoZixiKTtpZihmKSBzZWN0aW9uPUJTUzt9CisgICAgICB9CisKKyAgICAgIGdlbl9hbGlnbihmLGZhbGlnbih2LT52dHlwKSk7CisgICAgICBlbWl0KGYsIiVzJXM6XG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgICAgbmV3b2JqPTE7CisgICAgfQorICB9Cit9CisKK3ZvaWQgZ2VuX2RjKEZJTEUgKmYsaW50IHQsc3RydWN0IGNvbnN0X2xpc3QgKnApCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIHN0YXRpYyBzdG9yYWdlICAgICAgICAgICovCisvKiAgaW5pdGlhbGl6ZWQgd2l0aCBjb25zdC1saXN0IHAuICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGlmKElTQ0hBUih0KSkKKyAgICBlbWl0KGYsIlx0Ynl0ZVx0Iik7CisgIGVsc2UKKyAgICBlbWl0KGYsIlx0d29yZFx0Iik7CisgIGlmKCFwLT50cmVlKXsKKyAgICBpZihJU0xPTkcodCl8fElTRkxPQVQodCkpeworICAgICAgaWYoaWVlZSYmSVNGTE9BVCh0KSl7CisJZW1pdF9pZWVlKGYsJnAtPnZhbCx0Jk5RKTsKKyAgICAgIH1lbHNleworCWV2YWxfY29uc3QoJnAtPnZhbCx0Jk5VKTsKKwlpZihJU0ZMT0FUKHQpKSBjbnZfZnAoKTsKKwlndmFsLnZtYXg9em1hbmQodm1heCxsMnptKDB4ZmZmZkwpKTsKKwllbWl0dmFsKGYsJmd2YWwsTUFYSU5UKTsKKwllbWl0KGYsIiwiKTsKKwlndmFsLnZtYXg9em1hbmQoem1yc2hpZnQodm1heCxsMnptKDE2TCkpLGwyem0oMHhmZmZmTCkpOworCWVtaXR2YWwoZiwmZ3ZhbCxNQVhJTlQpOworICAgICAgfQorICAgIH1lbHNleworICAgICAgaWYoSVNGUE9JTlRFUih0KSl7CisJZXZhbF9jb25zdCgmcC0+dmFsLHQmTlUpOworCWVtaXQoZiwiJWxkXG4iLChsb25nKXptMmwodm1heCkmMHhmZmZmKTsKKwllbWl0KGYsIlx0Ynl0ZVx0JWRcbiIsKGludCkoKHptMmwodm1heCk+PjE2KSYweGZmKSk7CisgICAgICB9ZWxzZQorCWVtaXR2YWwoZiwmcC0+dmFsLHQmTlUpOworICAgIH0KKyAgfWVsc2V7CisgICAgZW1pdF9vYmooZiwmcC0+dHJlZS0+byx0Jk5VKTsKKyAgICBpZihJU0ZQT0lOVEVSKHQpKXsKKyAgICAgIGludCBiOworICAgICAgaWYoKHAtPnRyZWUtPm8uZmxhZ3MmKFZBUnxWQVJBRFIpKSE9KFZBUnxWQVJBRFIpKSBpZXJyb3IoMCk7CisgICAgICBiPWJhbmsocC0+dHJlZS0+by52KTsKKyAgICAgIGVtaXQoZiwiXG5cdGJ5dGVcdCVkIixiPj0wP2I6YmFua2NudW0pOworICAgIH0KKyAgfQorICBlbWl0KGYsIlxuIik7bmV3b2JqPTA7Cit9CisKKworLyogIFRoZSBtYWluIGNvZGUtZ2VuZXJhdGlvbiByb3V0aW5lLiAgICAgICAgICAgICAgICAgICAqLworLyogIGYgaXMgdGhlIHN0cmVhbSB0aGUgY29kZSBzaG91bGQgYmUgd3JpdHRlbiB0by4gICAgICAqLworLyogIHAgaXMgYSBwb2ludGVyIHRvIGEgZG91Ymx5IGxpbmtlZCBsaXN0IG9mIElDcyAgICAgICAqLworLyogIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIGJvZHkgdG8gZ2VuZXJhdGUgY29kZSBmb3IuICAqLworLyogIHYgaXMgYSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAqLworLyogIG9mZnNldCBpcyB0aGUgc2l6ZSBvZiB0aGUgc3RhY2tmcmFtZSB0aGUgZnVuY3Rpb24gICAqLworLyogIG5lZWRzIGZvciBsb2NhbCB2YXJpYWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCit2b2lkIGdlbl9jb2RlKEZJTEUgKmYsc3RydWN0IElDICpwLHN0cnVjdCBWYXIgKnYsem1heCBvZmZzZXQpCisvKiAgVGhlIG1haW4gY29kZS1nZW5lcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgYyx0LGk7CisgIHN0cnVjdCBJQyAqbWk7CisgIEZJTEUgKnJmPWY7CisgIHN0YXRpYyBjaGFyICpkYmdmaWxlOworICBzdGF0aWMgaW50IGRiZ2xpbmU7CisKKyAgaWYodmxhcyl7CisgICAgZnA9RlBWTEFfUkVHOworICAgIGlmKCFyZWdfcGFpcihmcCwmcnApKSBpZXJyb3IoMCk7CisgICAgZnAxPXJwLnIxOworICAgIGZwMj1ycC5yMjsKKyAgICByZWd1c2VkW2ZwXT1yZWd1c2VkW2ZwMV09cmVndXNlZFtmcDJdPTE7CisgICB9ZWxzZXsKKyAgICBmcD1zcDsKKyAgICBmcDE9c3AxOworICAgIGZwMj1zcDI7CisgIH0KKyAgYXJnc2l6ZT0wOworICBsb2NhbHNpemU9b2Zmc2V0OworICBpZihERUJVRyYxKSBwcmludGYoImdlbl9jb2RlKClcbiIpOworCisgIGNiYW5rPWJhbmsodik7CisKKyAgaWYoIXYtPmZpKSB2LT5maT1uZXdfZmkoKTsKKyAgdi0+ZmktPmZsYWdzfD1BTExfUkVHUzsKKworICBmb3IocGFzcz0wO3Bhc3M8MjtwYXNzKyspeworCisgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJwYXNzICVkXG4iLHBhc3MpOworCisgICAgaWYocGFzcz09MCl7CisgICAgICBmPTA7CisgICAgICBtaT1jbG9uZV9pYyhwKTsKKyAgICB9ZWxzZQorICAgICAgZj1yZjsKKworICAgIGZvcihjPTE7Yzw9TUFYUjtjKyspIHJlZ3NbY109MDsgLypyZWdzYVtjXTsqLworICAgIG1heHB1c2hlZD0wOworCisgICAgLypGSVhNRSovCisgICAgaWYodi0+dGF0dHImSU5URVJSVVBUKXsKKyAgICAgIHJldD0iXHRydGlcbiI7CisgICAgICBpbl9pc3I9MTsKKyAgICB9ZWxzZXsKKyAgICAgIHJldD0iXHRydHNcbiI7CisgICAgICBpbl9pc3I9MDsKKyAgICB9CisKKyAgICBpZighbm9wZWVwKSBwZWVwaG9sZShwYXNzPT0wP3A6bWkpOworCisgICAgZnVuY3Rpb25fdG9wKGYsdixsb2NhbHNpemUpOworCisgICAgcHVzaGVkPTA7CisKKyAgICB5dmFsPU5PVkFMOworCisgICAgZGJnZmlsZT0wOworICAgIGRiZ2xpbmU9MDsKKworICAgIGZvcihwPXBhc3M9PTA/cDptaTtwO3ByKGYscCkscD1wLT5uZXh0KXsKKworCisKKyAgICAgIGlmKERFQlVHJjEpIHByaWMyKHN0ZG91dCxwKTsKKworICAgICAgaWYoZGVidWdfaW5mbyl7CisJaWYocC0+ZmlsZSYmcC0+bGluZSl7CisJICBpZihwLT5maWxlIT1kYmdmaWxlfHxwLT5saW5lIT1kYmdsaW5lKXsKKwkgICAgZGJnZmlsZT1wLT5maWxlOworCSAgICBkYmdsaW5lPXAtPmxpbmU7CisJICAgIGVtaXQoZiwiOyAlZCBcIiVzXCJcbiIsZGJnbGluZSxkYmdmaWxlKTsKKwkgIH0KKwl9CisgICAgICB9CisKKyAgICAgIGM9cC0+Y29kZTt0PXAtPnR5cGY7CisKKyAgICAgIGlmKGM9PU5PUCkge3AtPnouZmxhZ3M9MDtjb250aW51ZTt9CisgICAgICBpZihjPT1BTExPQ1JFRyl7CisJcmVnc1twLT5xMS5yZWddPTE7CisJaWYocmVnX3BhaXIocC0+cTEucmVnLCZycCkpeworCSAgcmVnc1tycC5yMV09MTsKKwkgIHJlZ3NbcnAucjJdPTE7CisJfQorCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoYz09RlJFRVJFRyl7CisJcmVnc1twLT5xMS5yZWddPTA7CisJaWYocmVnX3BhaXIocC0+cTEucmVnLCZycCkpeworCSAgcmVnc1tycC5yMV09MDsKKwkgIHJlZ3NbcnAucjJdPTA7CisJfQorCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoYz09TEFCRUwpIHtlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCx0KTt5dmFsPU5PVkFMO2NvbnRpbnVlO30KKyAgICAgIGlmKGM9PUJSQSl7CisJeXZhbD1OT1ZBTDsKKwlpZih0PT1leGl0X2xhYmVsJiZsb2NhbHNpemUrYXJnc2l6ZStyc2F2ZXNpemUrcnNjbnQ9PTApCisJICBlbWl0KGYscmV0KTsKKwllbHNlCisJICBlbWl0KGYsIlx0JXNcdCVzJWRcbiIsam1waW5zdCxsYWJwcmVmaXgsdCk7CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZihjPj1CRVEmJmM8QlJBKXsKKwl5dmFsPU5PVkFMOworCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZihjPT1NT1ZFVE9SRUcpeworCXAtPmNvZGU9Yz1BU1NJR047CisJcC0+dHlwZj10PXJlZ3R5cGVbcC0+ei5yZWddLT5mbGFnczsKKwlwLT5xMi52YWwudm1heD1zaXpldGFiW3JlZ3R5cGVbcC0+ei5yZWddLT5mbGFnc107CisgICAgICB9CisgICAgICBpZihjPT1NT1ZFRlJPTVJFRyl7CisJcC0+Y29kZT1jPUFTU0lHTjsKKwlwLT50eXBmPXQ9cmVndHlwZVtwLT5xMS5yZWddLT5mbGFnczsKKwlwLT5xMi52YWwudm1heD1zaXpldGFiW3JlZ3R5cGVbcC0+cTEucmVnXS0+ZmxhZ3NdOworICAgICAgfQorICAgICAgaWYoYz09Q09OVkVSVCYmSVNDSEFSKHQpJiZJU0NIQVIocC0+dHlwZjIpKXsKKwlwLT5jb2RlPWM9QVNTSUdOOworCXAtPnEyLnZhbC52bWF4PXNpemV0YWJbQ0hBUl07CisgICAgICB9CisgICAgICBpZihjPT1DT05WRVJUJiZtc2l6ZXRhYlt0Jk5RXT09MyYmbXNpemV0YWJbcC0+dHlwZjImTlFdPT0zKXsKKwlwLT5jb2RlPWM9QVNTSUdOOworCXAtPnEyLnZhbC52bWF4PXNpemV0YWJbU0hPUlRdOworICAgICAgfQorICAgICAgaWYoYz09Q09OVkVSVCYmSVNTSE9SVCh0KSYmSVNTSE9SVChwLT50eXBmMikpeworCXAtPmNvZGU9Yz1BU1NJR047CisJcC0+cTIudmFsLnZtYXg9c2l6ZXRhYltTSE9SVF07CisgICAgICB9CisgICAgICBpZihjPT1DT05WRVJUJiZJU0xPTkcodCkmJklTTE9ORyhwLT50eXBmMikpeworCXAtPmNvZGU9Yz1BU1NJR047CisJcC0+cTIudmFsLnZtYXg9c2l6ZXRhYltMT05HXTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PUNPTlZFUlQmJklTTExPTkcodCkmJklTTExPTkcocC0+dHlwZjIpKXsKKwlwLT5jb2RlPWM9QVNTSUdOOworCXAtPnEyLnZhbC52bWF4PXNpemV0YWJbTExPTkddOworICAgICAgfQorICAgICAgaWYoYz09Q09OVkVSVCYmSVNGTE9BVCh0KSYmSVNGTE9BVChwLT50eXBmMikpeworCXAtPmNvZGU9Yz1BU1NJR047CisJcC0+cTIudmFsLnZtYXg9c2l6ZXRhYlt0Jk5RXTsKKyAgICAgIH0KKworCisgICAgICAvKiBzd2l0Y2ggY29tbXV0YXRpdmUgb3BlcmFuZHMgaWYgc3VpdGFibGUgKi8KKyAgICAgIGlmKGM9PUFERHx8Yz09TVVMVHx8Yz09QU5EfHxjPT1YT1J8fGM9PU9SfHwoYz09QURESTJQJiZJU1NIT1JUKHQpJiYhSVNGUE9JTlRFUihwLT50eXBmMikpKXsKKwlpZihjb21wYXJlX29iamVjdHMoJnAtPnEyLCZwLT56KXx8aXNhY2MocTIpKXsKKwkgIHN0cnVjdCBvYmogdG1wOworCSAgdG1wPXAtPnExOworCSAgcC0+cTE9cC0+cTI7CisJICBwLT5xMj10bXA7CisJfQorICAgICAgfQorCisgICAgICBpZihjPT1DT01QQVJFJiYocC0+cTEuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworCW9iaiB0bXA7CisJdG1wPXAtPnExOworCXAtPnExPXAtPnEyOworCXAtPnEyPXRtcDsKKyAgICAgIH0KKworICAgICAgYz1wLT5jb2RlOworICAgICAgaWYoYz09U1VCUEZQKSBjPVNVQjsKKyAgICAgIC8qaWYoYz09QURESTJQKSBjPUFERDsqLworICAgICAgLyppZihjPT1TVUJJRlApIGM9U1VCOyovCisKKworICAgICAgaWYoYz09TUlOVVMpeworCWlmKGlzYWNjKHExKSYmaXNhY2MoeikpeworICAgICAgICAgIGlmKElTQ0hBUih0KSl7CisgICAgICAgICAgICBlbWl0KGYsIlx0bmVnXG4iKTsKKyAgICAgICAgICB9ZWxzZXsKKwkgICAgZW1pdChmLCJcdGVvclx0IzI1NVxuIik7CisgICAgICAgICAgICBlbWl0KGYsIlx0Y2xjXG4iKTsKKyAgICAgICAgICAgIGVtaXQoZiwiXHRhZGNcdCMxXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYoIUlTQ0hBUih0KSl7CisgICAgICAgICAgICBlbWl0KGYsIlx0cGhhXG4iKTsKKyAgICAgICAgICAgIGVtaXQoZiwiXHR0eGFcbiIpOworICAgICAgICAgICAgZW1pdChmLCJcdGVvclx0IzI1NVxuIik7CisgICAgICAgICAgICBlbWl0KGYsIlx0YWRjXHQjMFxuIik7CisgICAgICAgICAgICBlbWl0KGYsIlx0dGF4XG4iKTsKKyAgICAgICAgICAgIGVtaXQoZiwiXHRwbGFcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCXAtPmNvZGU9Yz1TVUI7CisJcC0+cTI9cC0+cTE7CisJcC0+cTEuZmxhZ3M9S09OU1Q7CisJcC0+cTEuYW09MDsKKwlndmFsLnZtYXg9WjA7CisJZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworCWluc2VydF9jb25zdCgmcC0+cTEudmFsLHQpOworICAgICAgfQorCisgICAgICBwcmVsb2FkKGYscCk7CisKKyAgICAgIGlmKGM9PUNPTlZFUlQpeworCWludCB0bz1xMXR5cChwKSZOVTsKKwl0Jj1OVTsKKwlpZihJU0NIQVIodCkpeworCSAgZ2V0X2FjYyhmLHAsQ0hBUik7CisJICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0byk7CisJICBzdG9yZV9sb2J5dGUoZiwmcC0+eix0KTsKKwkgIGNvbnRpbnVlOworCX0KKwlpZihJU0xPTkcodG8pKXsKKwkgIGlmKCFpc2FjYyh6KSkKKwkgICAgZ2V0X2FjYyhmLHAsQ0hBUik7CisJICBpZih6bTJsKHNpemV0YWJbdCZOUV0pPT0zKXsKKwkgICAgZG9fYnl0ZTMoZiwibGRhIiwmcC0+cTEsdG8pOworCSAgICBkb19ieXRlMyhmLCJzdGEiLCZwLT56LHQpOworCSAgfQorCSAgaWYoem0ybChzaXpldGFiW3QmTlFdKT49Mil7CisJICAgIGxvYWRfaGlieXRlKGYsJnAtPnExLHRvKTsKKwkgICAgc3RvcmVfaGlieXRlKGYsJnAtPnosdCk7CisJICB9CisJICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0byk7CisJICBzdG9yZV9sb2J5dGUoZiwmcC0+eix0KTsKKwkgIGNvbnRpbnVlOworCX0KKwlpZihJU1NIT1JUKHRvKSl7CisJICBpZigodCZVTlNJR05FRCl8fElTRlBPSU5URVIodCkpCisJICAgIGdldF9hY2MoZixwLENIQVIpOworCSAgZWxzZQorCSAgICBnZXRfYWNjKGYscCxTSE9SVCk7CisJICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0byk7CisJICBzdG9yZV9sb2J5dGUoZiwmcC0+eix0KTsKKwkgIGxvYWRfaGlieXRlKGYsJnAtPnExLHRvKTsKKwkgIHN0b3JlX2hpYnl0ZShmLCZwLT56LHQpOworCSAgaWYoSVNGUE9JTlRFUih0KSl7CisJICAgIGludCBiPS0xOworCSAgICBpZigocC0+cTEuZmxhZ3MmKFZBUkFEUnxEUkVGT0JKKSk9PVZBUkFEUikgYj1iYW5rKHAtPnExLnYpOworCSAgICBlbWl0KGYsIlx0bGRhXHQjJWRcbiIsYj49MD9iOmJhbmtjbnVtKTsKKwkgICAgZG9fYnl0ZTMoZiwic3RhIiwmcC0+eix0KTsKKwkgICAgY29udGludWU7CisJICB9CisJICBpZih0byZVTlNJR05FRCl7CisJICAgIGlmKGhhc196ZXJvX3JlZyYmIWluZGlyZWN0KCZwLT56KSl7CisJICAgICAgLy8gNjVDMDIgWiBpcyBaZXJvLCBub3QgYSBjaGFuZ2VhYmxlIHJlZ2lzdGVyLCBzbyB3ZSBjYW4KKwkgICAgICAvLyB1c2UgaXQgdG8gY2xlYXIgdXBwZXIgYnl0ZXMuCisJICAgICAgLy8gVGhpcyBpcyBOT1QgdGhlIGNhc2Ugb24gNDUxMC9NNjUsIHdoZXJlIFogaXMgYW4gaW5kZXggcmVnaXN0ZXIKKwkgICAgICBkb19ieXRlMyhmLCJzdHoiLCZwLT56LHQpOworCSAgICAgIGRvX2J5dGU0KGYsInN0eiIsJnAtPnosdCk7CisJICAgIH1lbHNleworCSAgICAgIGVtaXQoZiwiXHRsZGFcdCMwXG4iKTsKKwkgICAgICBkb19ieXRlMyhmLCJzdGEiLCZwLT56LHQpOworCSAgICAgIGRvX2J5dGU0KGYsInN0YSIsJnAtPnosdCk7CisJICAgIH0KKwkgIH1lbHNleworCSAgICBlbWl0KGYsIlx0bGR4XHQjMFxuIik7CisJICAgIGVtaXQoZiwiXHRjbXBcdCMwXG4iKTsKKwkgICAgZW1pdChmLCJcdGJwbFx0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICAgIGVtaXQoZiwiXHRkZXhcbiIpOworCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgIGlmKGluZGlyZWN0KCZwLT56KSl7CisJICAgICAgZW1pdChmLCJcdHR4YVxuIik7CisJICAgICAgZG9fYnl0ZTMoZiwic3RhIiwmcC0+eix0KTsKKwkgICAgICBkb19ieXRlNChmLCJzdGEiLCZwLT56LHQpOworCSAgICB9ZWxzZXsKKwkgICAgICBkb19ieXRlMyhmLCJzdHgiLCZwLT56LHQpOworCSAgICAgIGRvX2J5dGU0KGYsInN0eCIsJnAtPnosdCk7CisJICAgIH0KKwkgIH0KKwkgIGNvbnRpbnVlOworCX0KKwlpZihJU0NIQVIodG8pKXsKKwkgIGlmKHRvJlVOU0lHTkVEKXsKKwkgICAgZ2V0X2FjYyhmLHAsQ0hBUik7CisJICAgIGlmKElTTE9ORyh0KSl7CisJICAgICAgbG9hZF9sb2J5dGUoZiwmcC0+cTEsdG8pOworCSAgICAgIHN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCSAgICAgIGlmKGhhc196ZXJvX3JlZyYmIWluZGlyZWN0KCZwLT56KSl7CisJCS8vIDY1QzAyIFogaXMgWmVybywgbm90IGEgY2hhbmdlYWJsZSByZWdpc3Rlciwgc28gd2UgY2FuCisJCS8vIHVzZSBpdCB0byBjbGVhciB1cHBlciBieXRlcy4KKwkJLy8gVGhpcyBpcyBOT1QgdGhlIGNhc2Ugb24gNDUxMC9NNjUsIHdoZXJlIFogaXMgYW4gaW5kZXggcmVnaXN0ZXIKKwkJZG9faGlieXRlKGYsInN0eiIsJnAtPnosdCk7CisJCWRvX2J5dGUzKGYsInN0eiIsJnAtPnosdCk7CisJCWlmKElTTE9ORyh0KSkKKwkJICBkb19ieXRlNChmLCJzdHoiLCZwLT56LHQpOworCSAgICAgIH1lbHNleworCQllbWl0KGYsIlx0bGRhXHQjMFxuIik7CisJCXN0b3JlX2hpYnl0ZShmLCZwLT56LHQpOworCQlkb19ieXRlMyhmLCJzdGEiLCZwLT56LHQpOworCQlpZihJU0xPTkcodCkpCisJCSAgZG9fYnl0ZTQoZiwic3RhIiwmcC0+eix0KTsKKwkgICAgICB9CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgICAgaWYoaXNhY2MoeikpCisJICAgICAgZW1pdChmLCJcdGxkeFx0IzBcbiIpOworCSAgICBlbHNlIGlmKGlzYWNjKHExKSl7CisJICAgICAgZW1pdChmLCJcdGxkeFx0IzBcbiIpOworCSAgICAgIHN0b3JlX2FjYyhmLCZwLT56LHQpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9ZWxzZXsKKwkgICAgICBpZihoYXNfemVyb19yZWcmJiFpbmRpcmVjdCgmcC0+eikpeworCQkvLyA2NUMwMiBaIGlzIFplcm8sIG5vdCBhIGNoYW5nZWFibGUgcmVnaXN0ZXIsIHNvIHdlIGNhbgorCQkvLyB1c2UgaXQgdG8gY2xlYXIgdXBwZXIgYnl0ZXMuCisJCS8vIFRoaXMgaXMgTk9UIHRoZSBjYXNlIG9uIDQ1MTAvTTY1LCB3aGVyZSBaIGlzIGFuIGluZGV4IHJlZ2lzdGVyCisJCWRvX2hpYnl0ZShmLCJzdHoiLCZwLT56LHQpOworCSAgICAgIH1lbHNleworCQllbWl0KGYsIlx0bGRhXHQjMFxuIik7CisJCXN0b3JlX2hpYnl0ZShmLCZwLT56LHQpOworCSAgICAgIH0KKwkgICAgfQorCSAgICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0byk7CisJICAgIHN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCSAgfWVsc2V7CisJICAgIGludCBsPSsrbGFiZWw7CisJICAgIGdldF9hY2MoZixwLFNIT1JUKTsKKwkgICAgZW1pdChmLCJcdGxkeFx0IzBcbiIpOworCSAgICBpZihpc3JlZyhxMSkmJnAtPnExLnJlZz09cmEpCisJICAgICAgZW1pdChmLCJcdGNtcFx0IzBcbiIpOworCSAgICBlbHNlCisJICAgICAgbG9hZF9sb2J5dGUoZiwmcC0+cTEsdG8pOworCSAgICBlbWl0KGYsIlx0YnBsXHQlcyVkXG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgIGVtaXQoZiwiXHRkZXhcbiIpOworCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgIHN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCSAgICBpZihpbmRpcmVjdCgmcC0+eikmJighaXNyZWcoeil8fHAtPnoucmVnIT1yYXgpKXsKKwkgICAgICBlbWl0KGYsIlx0dHhhXG4iKTsKKwkgICAgICBzdG9yZV9oaWJ5dGUoZiwmcC0+eix0KTsKKwkgICAgICBpZihJU0xPTkcodCkpeworCQlkb19ieXRlMyhmLCJzdGEiLCZwLT56LHQpOworCQlkb19ieXRlNChmLCJzdGEiLCZwLT56LHQpOworCSAgICAgIH0KKwkgICAgfWVsc2V7CisJICAgICAgaWYoIWlzcmVnKHopfHxwLT56LnJlZyE9cmF4KXsKKwkJZW1pdChmLCJcdHN0eFx0Iik7CisJCWVtaXRfaGlieXRlKGYsJnAtPnosdCk7CisJCWVtaXQoZiwiXG4iKTsKKwkgICAgICB9CisJICAgICAgaWYoSVNMT05HKHQpKXsKKwkJZG9fYnl0ZTMoZiwic3R4IiwmcC0+eix0KTsKKwkJZG9fYnl0ZTQoZiwic3R4IiwmcC0+eix0KTsKKwkgICAgICB9CisJICAgIH0KKwkgIH0KKwkgIGlmKElTRlBPSU5URVIodCkpeworCSAgICBlbWl0KGYsIlx0bGRhXHQjJWRcbiIsY2Jhbms+PTA/Y2Jhbms6YmFua2NudW0pOworCSAgICBkb19ieXRlMyhmLCJzdGEiLCZwLT56LHQpOworCSAgfQorCSAgY29udGludWU7CisJfQorCWlmKElTRlBPSU5URVIodG8pKXsKKwkgIGdldF9hY2MoZixwLENIQVIpOworCSAgaWYoem0ybChzaXpldGFiW3QmTlFdKT49Myl7CisJICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHRvKTsKKwkgICAgZG9fYnl0ZTMoZiwic3RhIiwmcC0+eix0KTsKKwkgIH0KKwkgIGlmKHptMmwoc2l6ZXRhYlt0Jk5RXSk+PTIpeworCSAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0byk7CisJICAgIHN0b3JlX2hpYnl0ZShmLCZwLT56LHQpOworCSAgfQorCSAgbG9hZF9sb2J5dGUoZiwmcC0+cTEsdG8pOworCSAgc3RvcmVfbG9ieXRlKGYsJnAtPnosdCk7CisKKwkgIGNvbnRpbnVlOworCX0KKwlpZXJyb3IoMCk7CisgICAgICB9CisKKyAgICAgIGlmKGM9PUtPTVBMRU1FTlQpeworCWdldF9hY2MoZixwLENIQVIpOworCWlmKElTQ0hBUih0KSl7CisJICBsb2FkX2FjYyhmLCZwLT5xMSx0KTsKKwkgIGVtaXQoZiwiXHRlb3JcdCMtMVxuIik7CisJICBzdG9yZV9hY2MoZiwmcC0+eix0KTsKKwl9ZWxzZXsKKwkgIGlmKGlzYWNjKHExKSkKKwkgICAgZW1pdChmLCJcdHBoYVxuIik7CisJICBpZihJU0xPTkcodCkpeworCSAgICBkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgZW1pdChmLCJcdGVvclx0Iy0xXG4iKTsKKwkgICAgZG9fYnl0ZTQoZiwic3RhIiwmcC0+eix0KTsKKwkgICAgZG9fYnl0ZTMoZiwibGRhIiwmcC0+cTEsdCk7CisJICAgIGVtaXQoZiwiXHRlb3JcdCMtMVxuIik7CisJICAgIGRvX2J5dGUzKGYsInN0YSIsJnAtPnosdCk7CisJICB9CisJICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgIGVtaXQoZiwiXHRlb3JcdCMtMVxuIik7CisJICBzdG9yZV9oaWJ5dGUoZiwmcC0+eix0KTsKKwkgIGlmKGlzYWNjKHExKSkKKwkgICAgZW1pdChmLCJcdHBsYVxuIik7CisJICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0KTsKKwkgIGVtaXQoZiwiXHRlb3JcdCMtMVxuIik7CisJICBzdG9yZV9sb2J5dGUoZiwmcC0+eix0KTsKKwl9CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZihjPT1TRVRSRVRVUk4peworCXQmPU5ROworCWlmKGlzcmVnKHExKSYmcC0+cTEucmVnPT1wLT56LnJlZykgY29udGludWU7CisJaWYodD09TE9OR3x8dD09TExPTkd8fElTRkxPQVQodCl8fElTRlBPSU5URVIodCkpeworCSAgbG9uZyBsPXptMmwocC0+cTIudmFsLnZtYXgpOworCSAgaW50IHpyPXAtPnoucmVnOworCSAgLy9nZXRfYWNjKGYscCx0KTsKKwkgIGlmKChvcHRzaXplfHxsPjQpJiYhSVNGUE9JTlRFUih0KSl7CisJICAgIGludCBpbmQ9aW5kaXJlY3QoJnAtPnExKTsKKwkgICAgaWYoaW5kKSBsb2FkX2FkZHJlc3MoZixMQVNUX1BBSVIsJnAtPnExLHQpOworCSAgICBCU0VUKHJlZ3VzZWQsdDMpOworCSAgICBCU0VUKHJlZ3VzZWQsdDQpOworCSAgICBzZXR5KGYsbC0xKTsKKwkgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICAgIGlmKGluZCkKKwkgICAgICBlbWl0KGYsIlx0bGRhXHQoJXMpLHlcbiIsbXJlZ25hbWVzW0xBU1RfUEFJUl0pOworCSAgICBlbHNleworCSAgICAgIGVtaXQoZiwiXHRsZGFcdCIpOworCSAgICAgIGlmKCFJU0ZMT0FUKHQpJiYocC0+cTEuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworCQllbWl0KGYsIiVzJWQiLGxhYnByZWZpeCxhZGRmcGNvbnN0KCZwLT5xMSx0KSk7CisJICAgICAgfWVsc2UKKwkJZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJICAgICAgZW1pdChmLCIseVxuIik7CisJICAgIH0KKwkgICAgZW1pdChmLCJcdHN0YVx0JXMseVxuIixtcmVnbmFtZXNbenJdKTsKKwkgICAgZW1pdChmLCJcdGRleVxuIik7CisJICAgIGVtaXQoZiwiXHRicGxcdCVzJWRcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgICAgeXZhbD0yNTU7CisJICB9ZWxzZXsKKwkgICAgaWYoKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopKXsKKwkgICAgICBpZihwLT5xMS5yZWc9PXpyKXsKKwkJaW50IHI9Z2V0X3JlZyhmLHAsUE9JTlRFUik7CisJCWlmKHI9PUZJUlNUX1BBSVJ8fHI9PUZJUlNUX1BBSVIrMSkKKwkJICBpZXJyb3IoMCk7CisJCWlmKCFyZWdfcGFpcihyLCZycDIpKSBpZXJyb3IoMCk7CisJCWVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1t6cl0pOworCQllbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAyLnIxXSk7CisJCWVtaXQoZiwiXHRsZGFcdCVzKzFcbiIsbXJlZ25hbWVzW3pyXSk7CisJCWVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycDIucjJdKTsKKwkJcC0+cTEucmVnPXI7CisJICAgICAgfQorCSAgICB9CisJICAgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbenJdKTsKKwkgICAgbG9hZF9oaWJ5dGUoZiwmcC0+cTEsdCk7CisJICAgIGVtaXQoZiwiXHRzdGFcdCVzKzFcbiIsbXJlZ25hbWVzW3pyXSk7CisJICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCSAgICBlbWl0KGYsIlx0c3RhXHQlcysyXG4iLG1yZWduYW1lc1t6cl0pOworCSAgICBpZighSVNGUE9JTlRFUih0KSl7CisJICAgICAgZG9fYnl0ZTQoZiwibGRhIiwmcC0+cTEsdCk7CisJICAgICAgZW1pdChmLCJcdHN0YVx0JXMrM1xuIixtcmVnbmFtZXNbenJdKTsKKwkgICAgfQorCSAgICAvKlRPRE86cmVndXNlZCBPTERGUCAqLworCSAgICByZWd1c2VkW3pyXT0xOworCSAgfQorCSAgY29udGludWU7CisJfQorCS8vZ2V0X2FjYyhmLHAsdCk7CisJbG9hZF9hY2MoZiwmcC0+cTEsdCk7CisJcmVndXNlZFtyYV09MTsKKwlyZWd1c2VkW3J4XT0xOworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoYz09R0VUUkVUVVJOKXsKKwl0Jj1OUTsKKwlpZihpc3JlZyh6KSYmcC0+cTEucmVnPT1wLT56LnJlZykgY29udGludWU7CisJaWYodD09TE9OR3x8dD09TExPTkd8fElTRkxPQVQodCl8fElTRlBPSU5URVIodCkpeworCSAgbG9uZyBsPXptMmwocC0+cTIudmFsLnZtYXgpOworCSAgaW50IHFyPXAtPnExLnJlZzsKKwkgIGlmKChvcHRzaXplfHxsPjQpJiYhSVNGUE9JTlRFUih0KSl7CisJICAgIGludCBpbmQ9aW5kaXJlY3QoJnAtPnopOworCSAgICBpZihpbmQpIGxvYWRfYWRkcmVzcyhmLExBU1RfUEFJUiwmcC0+eix0KTsKKwkgICAgQlNFVChyZWd1c2VkLHQzKTsKKwkgICAgQlNFVChyZWd1c2VkLHQ0KTsKKwkgICAgc2V0eShmLGwtMSk7CisJICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCSAgICBlbWl0KGYsIlx0bGRhXHQlcyx5XG4iLG1yZWduYW1lc1txcl0pOworCSAgICBpZihpbmQpCisJICAgICAgZW1pdChmLCJcdHN0YVx0KCVzKSx5XG4iLG1yZWduYW1lc1tMQVNUX1BBSVJdKTsKKwkgICAgZWxzZXsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQiKTsKKwkgICAgICBlbWl0X29iaihmLCZwLT56LHQpOworCSAgICAgIGVtaXQoZiwiLHlcbiIpOworCSAgICB9CisJICAgIGVtaXQoZiwiXHRkZXlcbiIpOworCSAgICBlbWl0KGYsIlx0YnBsXHQlcyVkXG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgIHl2YWw9MjU1OworCSAgfWVsc2V7CisJICAgIGlmKChwLT56LnJlZyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSl7CisJICAgICAgaWYocC0+ei5yZWc9PXFyKSBpZXJyb3IoMCk7CisJICAgIH0KKwkgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3FyXSk7CisJICAgIHN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCSAgICBlbWl0KGYsIlx0bGRhXHQlcysxXG4iLG1yZWduYW1lc1txcl0pOworCSAgICBzdG9yZV9oaWJ5dGUoZiwmcC0+eix0KTsKKwkgICAgZW1pdChmLCJcdGxkYVx0JXMrMlxuIixtcmVnbmFtZXNbcXJdKTsKKwkgICAgZG9fYnl0ZTMoZiwic3RhIiwmcC0+eix0KTsKKwkgICAgaWYoIUlTRlBPSU5URVIodCkpeworCSAgICAgIGVtaXQoZiwiXHRsZGFcdCVzKzNcbiIsbXJlZ25hbWVzW3FyXSk7CisJICAgICAgZG9fYnl0ZTQoZiwic3RhIiwmcC0+eix0KTsKKwkgICAgfQorCSAgfQorCSAgY29udGludWU7CisJfQorCWlmKHAtPnExLnJlZykKKwkgIHN0b3JlX2FjYyhmLCZwLT56LHQpOworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoYz09Q0FMTCl7CisJaW50IHJlZzsKKworCWlmKGFyZ3NpemU8em0ybChwLT5xMi52YWwudm1heCkpIGFyZ3NpemU9em0ybChwLT5xMi52YWwudm1heCk7CisKKwkvKkZJWE1FKi8KKyNpZiAwICAgICAgCisJaWYoc3RhY2tfdmFsaWQmJihwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiZwLT5xMS52LT5maSYmKHAtPnExLnYtPmZpLT5mbGFncyZBTExfU1RBQ0spKXsKKwkgIGlmKGZyYW1lc2l6ZSt6dW0ydWwocC0+cTEudi0+ZmktPnN0YWNrMSk+c3RhY2spCisJICAgIHN0YWNrPWZyYW1lc2l6ZSt6dW0ydWwocC0+cTEudi0+ZmktPnN0YWNrMSk7CisJfWVsc2UKKwkgIHN0YWNrX3ZhbGlkPTA7CisjZW5kaWYKKwlpZigocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmIXN0cmNtcCgiX192YV9zdGFydCIscC0+cTEudi0+aWRlbnRpZmllcikpeworCSAgbG9uZyBvZj12YV9vZmZzZXQodikrbG9jYWxzaXplK3JzYXZlc2l6ZSthcmdzaXplOworCSAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW2ZwXSk7CisJICBpZihvZil7CisJICAgIGVtaXQoZiwiXHRjbGNcbiIpOworCSAgICBpZihvZiYyNTUpCisJICAgICAgZW1pdChmLCJcdGFkY1x0IyVkXG4iLChvZiYyNTUpKTsKKwkgIH0KKwkgIGVtaXQoZiwiXHRsZHhcdCVzKzFcbiIsbXJlZ25hbWVzW2ZwXSk7CisJICBpZihvZiYweGZmMDApeworCSAgICBlbWl0KGYsIlx0cGhhXG4iKTsKKwkgICAgZW1pdChmLCJcdHR4YVxuIik7CisJICAgIGVtaXQoZiwiXHRhZGNcdCMlZFxuIiwob2Y+PjgpJjI1NSk7CisJICAgIGVtaXQoZiwiXHR0YXhcbiIpOworCSAgICBlbWl0KGYsIlx0cGxhXG4iKTsKKwkgIH1lbHNlIGlmKG9mKXsKKwkgICAgZW1pdChmLCJcdGJjY1x0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICAgIGVtaXQoZiwiXHRpbnhcbiIpOworCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICB9CisJICBjb250aW51ZTsKKwl9CisJaWYoKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJnAtPnExLnYtPmZpJiZwLT5xMS52LT5maS0+aW5saW5lX2FzbSl7CisJICBlbWl0KGYsIjtzdGFydGlubGluZVxuIik7CisJICBlbWl0X2lubGluZV9hc20oZixwLT5xMS52LT5maS0+aW5saW5lX2FzbSk7CisJICBlbWl0KGYsIjtlbmRpbmxpbmVcbiIpOworCX1lbHNlIGlmKHAtPnExLmZsYWdzJkRSRUZPQkopeworCSAgaWYoSVNGUE9JTlRFUihwLT5xMS5kdHlwKSl7CisJICAgIHAtPnExLmZsYWdzJj1+RFJFRk9CSjsKKwkgICAgbG9hZF9yZWcoZixMQVNUX1BBSVIsJnAtPnExLFBPSU5URVIpOworCSAgICBpZihpbmRpcmVjdCgmcC0+cTEpKXsKKwkgICAgICBkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSxGUE9JTlRFUik7CisJICAgICAgZW1pdChmLCJcdHRheVxuIik7CisJICAgIH1lbHNlCisJICAgICAgZG9fYnl0ZTMoZiwibGR5IiwmcC0+cTEsRlBPSU5URVIpOworCSAgICBlbWl0KGYsIlx0bGRhXHQjJWRcbiIsY2Jhbms+PTA/Y2Jhbms6YmFua2NudW0pOworCSAgICBlbWl0KGYsIlx0anNyXHQlc19fYmFua2pzclxuIixpZHByZWZpeCk7CisJICAgIHl2YWw9Tk9WQUw7CisJICB9ZWxzZXsKKwkgICAgaWYoIShwLT5xMS5mbGFncyZSRUcpKSBpZXJyb3IoMCk7CisJICAgIGVtaXQoZiwiXHRqc3JcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCSAgICB5dmFsPU5PVkFMOworCSAgICBhZGRfY21wbGlzdChsYWJlbCxwLT5xMS5yZWcsSk1QSU5EKTsKKwkgIH0KKwl9ZWxzZXsKKwkgIGludCB0YmFuaz0tMTsKKwkgIGlmKHAtPnExLmZsYWdzJlZBUikgdGJhbms9YmFuayhwLT5xMS52KTsKKwkgIGlmKHRiYW5rIT1jYmFuayYmdGJhbms+PTApeworCSAgICBpZihjYmFuaz49MCl7CisJICAgICAgbG9hZF9hZGRyZXNzKGYsTEFTVF9QQUlSLCZwLT5xMSx0KTsKKwkgICAgICBzZXR5KGYsdGJhbmspOworCSAgICAgIGVtaXQoZiwiXHRsZGFcdCMlZFxuIixjYmFuayk7CisJICAgICAgZW1pdChmLCJcdGpzclx0JXNfX2Jhbmtqc3JcbiIsaWRwcmVmaXgpOworCSAgICAgIHl2YWw9Tk9WQUw7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgICAgc2V0eShmLHRiYW5rKTsKKwkgICAgZW1pdChmLCJcdGpzclx0JXNfX2Jhbmtzd2l0Y2hcbiIsaWRwcmVmaXgpOworCSAgICB5dmFsPU5PVkFMOworCSAgfQorCSAgaWYoKHAtPnExLmZsYWdzJlZBUikmJiFzdHJjbXAocC0+cTEudi0+aWRlbnRpZmllciwiX2ZtZW1jcHkiKSkKKwkgICAgZW1pdChmLCJcdGxkYVx0IyVkXG4iLGNiYW5rPj0wP2NiYW5rOmJhbmtjbnVtKTsKKwkgIGVtaXQoZiwiXHRqc3JcdCIpOworCSAgZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJICBlbWl0KGYsIlxuIik7CisJfQorCXB1c2hlZC09em0ybChwLT5xMi52YWwudm1heCk7CisJaWYoIWNhbGNfcmVncyhwLGYhPTApJiZ2LT5maSkgdi0+ZmktPmZsYWdzJj1+QUxMX1JFR1M7CisJeXZhbD1OT1ZBTDsKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PUFTU0lHTnx8Yz09UFVTSCl7CisJaWYodD09MCkgaWVycm9yKDApOworCWlmKChwLT5xMS5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCYmKHQmTlEpPT1MTE9ORyl7CisJICBpbnQgaTsKKwkgIGV2YWxfY29uc3QoJnAtPnExLnZhbCx0KTsKKwkgIGZvcihpPTA7aTw4O2krKyl7CisJICAgIGVtaXQoZiwiXHRsZGFcdCMlZFxuIix6bTJsKHZtYXgpJjI1NSk7CisJICAgIHZtYXg9em1yc2hpZnQodm1heCxsMnptKDhMKSk7CisJICAgIGlmKGM9PVBVU0h8fChwLT56LmZsYWdzJkRSRUZPQkopKXsKKwkgICAgICBzZXR5KGYsaSsoKGM9PVBVU0gpP3B1c2hlZDowKSk7CisJICAgICAgZW1pdChmLCJcdHN0YVx0KCVzKSx5XG4iLChjPT1QVVNIKT9tcmVnbmFtZXNbc3BdOm1yZWduYW1lc1twLT56LnJlZ10pOworCSAgICB9ZWxzZXsKKwkgICAgICBwLT56LnZhbC52bWF4PXptYWRkKHAtPnoudmFsLnZtYXgsbDJ6bSgobG9uZylpKSk7CisJICAgICAgZW1pdChmLCJcdHN0YVx0Iik7CisJICAgICAgZW1pdF9sb2J5dGUoZiwmcC0+eix0KTsKKwkgICAgICBlbWl0KGYsIlxuIik7CisJICAgICAgcC0+ei52YWwudm1heD16bXN1YihwLT56LnZhbC52bWF4LGwyem0oKGxvbmcpaSkpOworCSAgICB9CisJICB9CisJICBpZihjPT1QVVNIKSBwdXNoZWQrPTg7CisJICBjb250aW51ZTsKKwl9ICAKKworCWlmKCF6bWxlcShwLT5xMi52YWwudm1heCxsMnptKDRMKSkpeworCSAgbG9uZyBsZW49em0ybChwLT5xMi52YWwudm1heCk7CisJICBpbnQgcjEscjIsbG9vcHMsbG9vcGxhYjsKKwkgIGlmKGxlbj4zMjc2NykgaWVycm9yKDApOworCSAgaWYoIU5PQkFOS1ZBUlMpeworCSAgICBpbnQgYnE9LTEsYno9LTEscz0tMTsKKwkgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVIpIGJxPWJhbmsocC0+cTEudik7CisJICAgIGlmKChwLT56LmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVIpIGJ6PWJhbmsocC0+ei52KTsKKwkgICAgaWYoKChwLT5xMS5mbGFncyZEUkVGT0JKKSYmSVNGUE9JTlRFUihwLT5xMS5kdHlwKSl8fAorCSAgICAgICAoKHAtPnouZmxhZ3MmRFJFRk9CSikmJklTRlBPSU5URVIocC0+ei5kdHlwKSkpeworCSAgICAgIGZhcl9jb3B5KGYscCk7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgICAgaWYoY2Jhbms8MCl7CisJICAgICAgaWYoYnE+PTAmJmJ6Pj0wKXsKKwkJaWYoYnEhPWJ6KXsKKwkJICBmYXJfY29weShmLHApOworCQkgIGNvbnRpbnVlOworCQl9CisJCXM9YnE7CisJICAgICAgfWVsc2V7CisJCWlmKGJxPj0wKSBzPWJxOworCQlpZihiej49MCkgcz1iejsKKwkgICAgICB9CisJICAgICAgaWYocz49MCl7CisJCXNldHkoZixzKTsKKwkJZW1pdChmLCJcdGpzclx0JXNfX2Jhbmtzd2l0Y2hcbiIsaWRwcmVmaXgpOworCQl5dmFsPU5PVkFMOworCSAgICAgIH0KKwkgICAgfWVsc2V7CisJICAgICAgaWYoKGJxPj0wJiZicSE9Y2JhbmspfHwoYno+PTAmJmJ6IT1jYmFuaykpeworCQlmYXJfY29weShmLHApOworCQljb250aW51ZTsKKwkgICAgICB9CisJICAgIH0KKwkgIH0KKwkgIGdldF9hY2MoZixwLENIQVIpOworCSAgaWYoKHAtPnExLmZsYWdzJihEUkVGT0JKfEtPTlNUKSk9PURSRUZPQkopeworCSAgICBpZihwLT5xMS5mbGFncyZSRUcpeworCSAgICAgIHIxPXAtPnExLnJlZzsKKwkgICAgICBpZighcmVnX3BhaXIocjEsJnJwKSkgaWVycm9yKDApOworCSAgICAgIGlmKGxlbj4xMjgpeworCQllbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcnAucjFdKTsKKwkJZW1pdChmLCJcdGNsY1xuIik7CisJCWlmKGxlbiYxMjgpCisJCSAgZW1pdChmLCJcdGFkY1x0IzEyOFxuIik7CisJCWVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMV0pOworCQlpZihsZW4+MjU1KXsKKwkJICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsKKwkJICBlbWl0KGYsIlx0YWRjXHQjJWxkXG4iLChsZW4+PjgpJjI1NSk7CisJCSAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIyXSk7CQorCQl9ZWxzZXsKKwkJICBlbWl0KGYsIlx0YmNjXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkJICBlbWl0KGYsIlx0aW5jXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsKKwkJICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJCX0KKwkgICAgICB9CisJICAgIH1lbHNlCisJICAgICAgaWVycm9yKDApOworCSAgfWVsc2UgaWYoIWluZGlyZWN0KCZwLT5xMSkmJmxlbjw9MTI4JiYocC0+cTEuZmxhZ3MmKERSRUZPQkp8S09OU1QpKSE9S09OU1QpeworCSAgICByMT0wOworCSAgfWVsc2V7CisJICAgIFZhciAqdj1wLT5xMS52OworCSAgICAvKmlmKChwLT5xMS5mbGFncyYoVkFSQURSfFZBUikpIT1WQVIpIGllcnJvcigwKTsqLworCSAgICByMT1nZXRfcmVnKGYscCxQT0lOVEVSKTsKKwkgICAgaWYobGVuPjEyOCkgcC0+cTEudmFsLnZtYXg9em1hZGQocC0+cTEudmFsLnZtYXgsbDJ6bShsZW4mMHhmZjgwKSk7CisJICAgIGxvYWRfYWRkcmVzcyhmLHIxLCZwLT5xMSx0KTsKKwkgICAgaWYobGVuPjEyOCkgcC0+cTEudmFsLnZtYXg9em1zdWIocC0+cTEudmFsLnZtYXgsbDJ6bShsZW4mMHhmZjgwKSk7CisJICB9CisJICBpZigocC0+ei5mbGFncyYoRFJFRk9CSnxLT05TVCkpPT1EUkVGT0JKKXsKKwkgICAgaWYocC0+ei5mbGFncyZSRUcpeworCSAgICAgIHIyPXAtPnoucmVnOworCSAgICAgIGlmKCFyZWdfcGFpcihyMiwmcnApKSBpZXJyb3IoMCk7CisJICAgICAgaWYobGVuPjEyOCl7CisJCWVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMV0pOworCQllbWl0KGYsIlx0Y2xjXG4iKTsKKwkJaWYobGVuJjEyOCkKKwkJICBlbWl0KGYsIlx0YWRjXHQjMTI4XG4iKTsKKwkJZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisJCWlmKGxlbj4yNTUpeworCQkgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworCQkgIGVtaXQoZiwiXHRhZGNcdCMlbGRcbiIsKGxlbj4+OCkmMjU1KTsKKwkJICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsJCisJCX1lbHNleworCQkgIGVtaXQoZiwiXHRiY2NcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCQkgIGVtaXQoZiwiXHRpbmNcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworCQkgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkJfQorCSAgICAgIH0KKwkgICAgfWVsc2UKKwkgICAgICBpZXJyb3IoMCk7CisJICB9ZWxzZSBpZihjPT1QVVNIKXsKKwkgICAgaWYobGVuPD0xMjgmJnB1c2hlZD09MCl7CisJICAgICAgcjI9c3A7CisJICAgIH1lbHNleworCSAgICAgIHIyPWdldF9yZWcoZixwLFBPSU5URVIpOworCSAgICAgIGlmKCFyZWdfcGFpcihyMiwmcnApKSBpZXJyb3IoMCk7CisJICAgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3NwXSk7CisJICAgICAgZW1pdChmLCJcdGNsY1xuIik7CisJICAgICAgaWYoKChwdXNoZWQrKGxlbiYxMjgpKSYyNTUpIT0wKQorCQllbWl0KGYsIlx0YWRjXHQjJWxkXG4iLChwdXNoZWQrKGxlbiYxMjgpKSYyNTUpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMV0pOworCSAgICAgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tzcDJdKTsKKwkgICAgICBlbWl0KGYsIlx0YWRjXHQjJWxkXG4iLCgocHVzaGVkK2xlbik+PjgpJjI1NSk7CisJICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIyXSk7CisJICAgIH0KKwkgIH1lbHNlIGlmKCFpbmRpcmVjdCgmcC0+eikmJmxlbjw9MTI4KXsKKwkgICAgcjI9MDsKKwkgIH1lbHNleworCSAgICBWYXIgKnY9cC0+ei52OworCSAgICByMj1nZXRfcmVnKGYscCxQT0lOVEVSKTsKKwkgICAgaWYobGVuPjEyOCkgcC0+ei52YWwudm1heD16bWFkZChwLT56LnZhbC52bWF4LGwyem0obGVuJjB4ZmY4MCkpOworCSAgICBsb2FkX2FkZHJlc3MoZixyMiwmcC0+eix0KTsKKwkgICAgaWYobGVuPjEyOCkgcC0+ei52YWwudm1heD16bXN1YihwLT56LnZhbC52bWF4LGwyem0obGVuJjB4ZmY4MCkpOworCSAgfQorCSAgaWYobGVuPjEyOCl7CisJICAgIGdldF9hY2MoZixwLFBPSU5URVIpOyAvKiBnZXQgeCAqLworCSAgICBlbWl0KGYsIlx0bGR4XHQjJWxkXG4iLCgobGVuPj43KSsxKSYyNTUpOworCSAgfQorCSAgc2V0eShmLChsZW4tMSkmMTI3KTsKKwkgIGlmKChvcHRzaXplJiZsZW4+NCl8fGxlbj44KXsKKwkgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbG9vcGxhYj0rK2xhYmVsKTsKKwkgICAgaWYob3B0c2l6ZSkKKwkgICAgICBsb29wcz0xOworCSAgICBlbHNleworCSAgICAgIGlmKChsZW4mMyk9PTApCisJCWxvb3BzPTQ7CisJICAgICAgZWxzZSBpZigobGVuJjEpPT0wKQorCQlsb29wcz0yOworCSAgICAgIGVsc2UKKwkJbG9vcHM9MTsKKwkgICAgfQorCSAgfWVsc2UKKwkgICAgbG9vcHM9bGVuOworCSAgaWYocjEmJiFyZWdfcGFpcihyMSwmcnApKSBpZXJyb3IoMCk7CisJICBpZihyMiYmIXJlZ19wYWlyKHIyLCZycDIpKSBpZXJyb3IoMCk7CisJICBmb3IoaT0wO2k8bG9vcHM7aSsrKXsKKwkgICAgaWYocjEpCisJICAgICAgZW1pdChmLCJcdGxkYVx0KCVzKSx5XG4iLG1yZWduYW1lc1tycC5yMV0pOworCSAgICBlbHNleworCSAgICAgIGVtaXQoZiwiXHRsZGFcdCIpOworCSAgICAgIGVtaXRfb2JqKGYsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiLHlcbiIpOworCSAgICB9CisJICAgIGlmKHIyKQorCSAgICAgIGVtaXQoZiwiXHRzdGFcdCglcykseVxuIixtcmVnbmFtZXNbcnAyLnIxXSk7CisJICAgIGVsc2V7CisJICAgICAgZW1pdChmLCJcdHN0YVx0Iik7CisJICAgICAgZW1pdF9vYmooZiwmcC0+eix0KTsKKwkgICAgICBlbWl0KGYsIix5XG4iKTsKKwkgICAgfQorCSAgICBlbWl0KGYsIlx0ZGV5XG4iKTsKKwkgIH0KKwkgIGlmKGxvb3BzIT1sZW4peworCSAgICBlbWl0KGYsIlx0YnBsXHQlcyVkXG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICB9CSAgCisJICBpZihsZW4+MTI4KXsKKwkgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisJICAgIGVtaXQoZiwiXHRzZWNcbiIpOworCSAgICBlbWl0KGYsIlx0c2JjXHQjMTI4XG4iKTsKKwkgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisJICAgIGVtaXQoZiwiXHRiY3NcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCSAgICBlbWl0KGYsIlx0ZGVjXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsKKwkgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwpOworCSAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcnAyLnIxXSk7CisJICAgIGVtaXQoZiwiXHRzZWNcbiIpOworCSAgICBlbWl0KGYsIlx0c2JjXHQjMTI4XG4iKTsKKwkgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwMi5yMV0pOworCSAgICBlbWl0KGYsIlx0YmNzXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgICAgZW1pdChmLCJcdGRlY1x0JXNcbiIsbXJlZ25hbWVzW3JwMi5yMl0pOworCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgIGVtaXQoZiwiXHRsZHlcdCMxMjdcbiIpOworCSAgICBlbWl0KGYsIlx0ZGV4XG4iKTsKKwkgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsbG9vcGxhYik7CisJICB9CisJICB5dmFsPU5PVkFMOworCSAgaWYoYz09UFVTSCkKKwkgICAgcHVzaGVkKz16bTJsKHAtPnEyLnZhbC52bWF4KTsKKwkgIGNvbnRpbnVlOworCX0KKwlpZihjPT1QVVNIKXsKKwkgIGdldF9hY2MoZixwLENIQVIpOworCSAgbG9hZF9sb2J5dGUoZiwmcC0+cTEsdCk7CisJICBpZihjMDImJnB1c2hlZD09MCl7CisJICAgIGVtaXQoZiwiXHRzdGFcdCglcylcbiIsbXJlZ25hbWVzW3NwXSk7CisJICB9ZWxzZXsKKwkgICAgc2V0eShmLHB1c2hlZCk7CisJICAgIGVtaXQoZiwiXHRzdGFcdCglcykseVxuIixtcmVnbmFtZXNbc3BdKTsKKwkgIH0KKwkgIGlmKCF6bWxlcShwLT5xMi52YWwudm1heCxaMSkpeworCSAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgc2V0eShmLHB1c2hlZCsxKTsKKwkgICAgZW1pdChmLCJcdHN0YVx0KCVzKSx5XG4iLG1yZWduYW1lc1tzcF0pOworCSAgfQorCSAgaWYoIXptbGVxKHAtPnEyLnZhbC52bWF4LGwyem0oMkwpKSl7CisJICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCSAgICBzZXR5KGYscHVzaGVkKzIpOworCSAgICBlbWl0KGYsIlx0c3RhXHQoJXMpLHlcbiIsbXJlZ25hbWVzW3NwXSk7CisJICB9CisJICBpZighem1sZXEocC0+cTIudmFsLnZtYXgsbDJ6bSgzTCkpKXsKKwkgICAgZG9fYnl0ZTQoZiwibGRhIiwmcC0+cTEsdCk7CisJICAgIHNldHkoZixwdXNoZWQrMyk7CisJICAgIGVtaXQoZiwiXHRzdGFcdCglcykseVxuIixtcmVnbmFtZXNbc3BdKTsKKwkgIH0KKworCSAgcHVzaGVkKz16bTJsKHAtPnEyLnZhbC52bWF4KTsKKwkgIGNvbnRpbnVlOworCX0KKwlpZihjPT1BU1NJR04peworCSAgaW50IGMybTt1bnNpZ25lZCBsb25nIHY7CisJICBpZihpc3JlZyhxMSkmJmlzcmVnKHopJiZwLT5xMS5yZWc9PXAtPnoucmVnKSBjb250aW51ZTsKKwkgIGlmKGlzYWNjKHExKSl7CisJICAgIGlmKHAtPnExLnJlZz09cmF4KSBnZXRfYWNjKGYscCxDSEFSKTsKKwkgICAgc3RvcmVfYWNjKGYsJnAtPnosdCk7CisJICAgIGNvbnRpbnVlOworCSAgfQorCSAgaWYoYzAyJiYhaW5kaXJlY3QoJnAtPnopJiYocC0+cTEuZmxhZ3MmKERSRUZPQkp8S09OU1QpKT09S09OU1QpeworCSAgICBldmFsX2NvbnN0KCZwLT5xMS52YWwsdCk7CisJICAgIGlmKElTRkxPQVQodCkpeworCSAgICAgIGNudl9mcCgpOworCSAgICAgIHY9enVtMnVsKHptMnp1bSh2bWF4KSk7CisJICAgIH1lbHNlCisJICAgICAgdj16dW0ydWwodnVtYXgpOworCSAgICBjMm09MTsKKwkgIH1lbHNlCisJICAgIGMybT0wOworCSAgaWYoIWMybXx8diE9MCkKKwkgICAgZ2V0X2FjYyhmLHAsQ0hBUik7CisJICBpZigwLypJU0NIQVIodCkqLyl7CisJICAgIGxvYWRfYWNjKGYsJnAtPnExLHQpOworCSAgICBzdG9yZV9hY2MoZiwmcC0+eix0KTsKKwkgIH1lbHNleworICAgICAgICAgICAgLy8gVE9ETzogUEdTOiBVc2UgQVhZWiBmb3IgMzItYml0IGNvcHkgaWYgYXBwcm9wcmlhdGUKKwkgICAgLy8gVE9HTzogUEdTOiBDb25zaWRlciB1c2luZyBBWFlaIGZvciBsb2FkLCBldmVuIGZvciAxNiBvciAyNC1iaXQgdmFsdWVzCisJICAgIGlmKCF6bWxlcShwLT5xMi52YWwudm1heCxsMnptKDNMKSkpeworCSAgICAgIGlmKGMybSYmKHYmMHhGRjAwMDAwMCk9PTApeworCQkvLyA2NUMwMiBaIGlzIFplcm8sIG5vdCBhIGNoYW5nZWFibGUgcmVnaXN0ZXIsIHNvIHdlIGNhbgorCQkvLyB1c2UgaXQgdG8gY2xlYXIgdXBwZXIgYnl0ZXMuCisJCS8vIFRoaXMgaXMgTk9UIHRoZSBjYXNlIG9uIDQ1MTAvTTY1LCB3aGVyZSBaIGlzIGFuIGluZGV4IHJlZ2lzdGVyCisJCWRvX2J5dGU0KGYsInN0eiIsJnAtPnosdCk7CisJICAgICAgfWVsc2V7CisJCWRvX2J5dGU0KGYsImxkYSIsJnAtPnExLHQpOworCQlkb19ieXRlNChmLCJzdGEiLCZwLT56LHQpOworCSAgICAgIH0KKwkgICAgfQorCSAgICBpZighem1sZXEocC0+cTIudmFsLnZtYXgsbDJ6bSgyTCkpKXsKKwkgICAgICBpZihjMm0mJih2JjB4RkYwMDAwKT09MCl7CisJCS8vIDY1QzAyIFogaXMgWmVybywgbm90IGEgY2hhbmdlYWJsZSByZWdpc3Rlciwgc28gd2UgY2FuCisJCS8vIHVzZSBpdCB0byBjbGVhciB1cHBlciBieXRlcy4KKwkJLy8gVGhpcyBpcyBOT1QgdGhlIGNhc2Ugb24gNDUxMC9NNjUsIHdoZXJlIFogaXMgYW4gaW5kZXggcmVnaXN0ZXIKKwkJZG9fYnl0ZTMoZiwic3R6IiwmcC0+eix0KTsKKwkgICAgICB9ZWxzZXsKKwkJZG9fYnl0ZTMoZiwibGRhIiwmcC0+cTEsdCk7CisJCWRvX2J5dGUzKGYsInN0YSIsJnAtPnosdCk7CisJICAgICAgfQorCSAgICB9CisJICAgIGlmKCF6bWxlcShwLT5xMi52YWwudm1heCxsMnptKDFMKSkpeworCSAgICAgIGlmKGMybSYmKHYmMHhGRjAwKT09MCl7CisJCS8vIDY1QzAyIFogaXMgWmVybywgbm90IGEgY2hhbmdlYWJsZSByZWdpc3Rlciwgc28gd2UgY2FuCisJCS8vIHVzZSBpdCB0byBjbGVhciB1cHBlciBieXRlcy4KKwkJLy8gVGhpcyBpcyBOT1QgdGhlIGNhc2Ugb24gNDUxMC9NNjUsIHdoZXJlIFogaXMgYW4gaW5kZXggcmVnaXN0ZXIKKwkJZG9faGlieXRlKGYsInN0eiIsJnAtPnosdCk7CisJICAgICAgfWVsc2V7CisJCWxvYWRfaGlieXRlKGYsJnAtPnExLHQpOworCQlzdG9yZV9oaWJ5dGUoZiwmcC0+eix0KTsKKwkgICAgICB9CisJICAgIH0KKwkgICAgaWYoYzJtJiYodiYweEZGKT09MCl7CisJICAgICAgLy8gNjVDMDIgWiBpcyBaZXJvLCBub3QgYSBjaGFuZ2VhYmxlIHJlZ2lzdGVyLCBzbyB3ZSBjYW4KKwkgICAgICAvLyB1c2UgaXQgdG8gY2xlYXIgdXBwZXIgYnl0ZXMuCisJICAgICAgLy8gVGhpcyBpcyBOT1QgdGhlIGNhc2Ugb24gNDUxMC9NNjUsIHdoZXJlIFogaXMgYW4gaW5kZXggcmVnaXN0ZXIKKwkgICAgICBkb19sb2J5dGUoZiwic3R6IiwmcC0+eix0KTsKKwkgICAgfWVsc2V7CisJICAgICAgaWYoaXNyZWcocTEpJiZJU0lEWChwLT5xMS5yZWcpKXsKKwkJc3RvcmVfcmVnKGYscC0+cTEucmVnLCZwLT56LENIQVIpOworCSAgICAgIH1lbHNlIGlmKGlzcmVnKHopJiZJU0lEWChwLT56LnJlZykpeworCQlsb2FkX3JlZyhmLHAtPnoucmVnLCZwLT5xMSx0KTsKKwkgICAgICB9ZWxzZXsKKwkJbG9hZF9sb2J5dGUoZiwmcC0+cTEsdCk7CisJCXN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCSAgICAgIH0KKwkgICAgfQorCSAgfQorCX0KKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PUFERFJFU1MpeworCWxvbmcgbz1yZWFsX29mZnNldCgmcC0+cTEpOworCWdldF9hY2MoZixwLENIQVIpOworCWVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tmcDFdKTsKKwlpZihvKXsKKwkgIGVtaXQoZiwiXHRjbGNcbiIpOworCSAgaWYoKG8mMjU1KSE9MCkKKwkgICAgZW1pdChmLCJcdGFkY1x0IyVsZFxuIixyZWFsX29mZnNldCgmcC0+cTEpJjI1NSk7CisJfQorCXN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCWlmKGlzYWNjKHopKSBlbWl0KGYsIlx0cGhhXG4iKTsKKwllbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbZnAyXSk7CisJaWYobyE9MCkKKwkgIGVtaXQoZiwiXHRhZGNcdCMlbGRcbiIscmVhbF9vZmZzZXQoJnAtPnExKT4+OCYyNTUpOworCXN0b3JlX2hpYnl0ZShmLCZwLT56LHQpOworCWlmKGlzYWNjKHopKSBlbWl0KGYsIlx0cGxhXG4iKTsKKwljb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYoYz09Q09NUEFSRXx8Yz09VEVTVCl7CisJSUMgKmJyYW5jaD1wLT5uZXh0OworCWludCBwYWNjPTAsYmMsYm91dDsKKwl3aGlsZShicmFuY2gpeworCSAgaWYoYnJhbmNoLT5jb2RlPj1CRVEmJmJyYW5jaC0+Y29kZTxCUkEpCisJICAgIGJyZWFrOworCSAgaWYoYnJhbmNoLT5jb2RlIT1GUkVFUkVHJiZicmFuY2gtPmNvZGUhPUFMTE9DUkVHJiZicmFuY2gtPmNvZGUhPU5PUCkKKwkgICAgaWVycm9yKDApOworCSAgYnJhbmNoPWJyYW5jaC0+bmV4dDsKKwl9CisJYmM9YnJhbmNoLT5jb2RlOworCWJvdXQ9YnJhbmNoLT50eXBmOworCWlmKGM9PVRFU1QpeworCSAgcC0+cTIuZmxhZ3M9S09OU1Q7CisJICBndmFsLnZtYXg9WjA7CisJICBldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CisJICBpbnNlcnRfY29uc3QoJnAtPnEyLnZhbCx0KTsKKwl9CisJaWYoKGJjPT1CTEV8fGJjPT1CR1QpJiYocC0+cTIuZmxhZ3MmKERSRUZPQkp8S09OU1QpKT09S09OU1QpeworCSAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHQpOworCSAgaWYoIXptZXF0byh2bWF4LGwyem0oMjU1TCkpKXsKKwkgICAgdm1heD16bWFkZCh2bWF4LFoxKTsKKwkgICAgZ3ZhbC52bWF4PXZtYXg7CisJICAgIGV2YWxfY29uc3QoJmd2YWwsdCk7CisJICAgIGluc2VydF9jb25zdCgmcC0+cTIudmFsLHQpOworCSAgICBpZihiYz09QkxFKSBiYz1CTFQ7IGVsc2UgYmM9QkdFOworCSAgICBicmFuY2gtPmNvZGU9YmM7CisJICB9CisJfQorCWlmKGllZWUmJklTRkxPQVQodCkpeworCSAgaWYoIWllZWUpIGllcnJvcigwKTsKKwkgIHQmPU5ROworCSAgaWYocmVnc1tMQVNUX1BBSVJdKSBpZXJyb3IoMCk7CisJICByZWdzW0xBU1RfUEFJUl09MTsKKwkgIGlmKHJlZ3NbcmFdfHxyZWdzW3JheF0pCisJICAgIGllcnJvcigwKTsKKwkgIGxvYWRfYWRkcmVzcyhmLExBU1RfUEFJUiwmcC0+cTIsdCk7CisJICBCU0VUKHJlZ3VzZWQsdDMpOworCSAgQlNFVChyZWd1c2VkLHQ0KTsKKwkgIGVtaXQoZiwiXHRqc3JcdCVzX19mbG9hZCVjXG4iLGlkcHJlZml4LCh0PT1GTE9BVD8ncyc6J2QnKSk7CisJICB5dmFsPU5PVkFMOworCSAgbG9hZF9hZGRyZXNzKGYsTEFTVF9QQUlSLCZwLT5xMSx0KTsKKwkgIGVtaXQoZiwiXHRqc3JcdCVzX19mY21wJWNcbiIsaWRwcmVmaXgsKHQ9PUZMT0FUPydzJzonZCcpKTsKKwkgIHl2YWw9Tk9WQUw7CisJICByZWdzW0xBU1RfUEFJUl09MDsKKwkgIGlmKGJjPT1CTFR8fGJjPT1CTEUpCisJICAgIGVtaXQoZiwiXHRibWlcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgZWxzZSBpZihiYz09QkdUfGJjPT1CR0UpCisJICAgIGVtaXQoZiwiXHRidnNcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgaWYoYmM9PUJFUXx8YmM9PUJMRXx8YmM9PUJHRSkKKwkgICAgZW1pdChmLCJcdGJlcVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICBpZihiYz09Qk5FKQorCSAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgIGNvbnRpbnVlOworCX0KKwlpZihJU0NIQVIodCkpeworCSAgY2hhciAqcz0wOworCSAgaWYoaXNyZWcocTEpJiZJU0lEWChwLT5xMS5yZWcpJiYhaW5kaXJlY3QoJnAtPnEyKSYmKGJjPT1CRVF8fGJjPT1CTkV8fCh0JlVOU0lHTkVEKSkpeworCSAgICBzdGF0aWMgY2hhciBidWZbNF09ImNwciI7CisJICAgIHM9YnVmO3NbMl09bXJlZ25hbWVzW3AtPnExLnJlZ11bMF07CisJICB9ZWxzZXsKKwkgICAgaWYocGFjYz1jbXBfZ2V0X2FjYyhmLHAsYnJhbmNoKSkKKwkgICAgICBib3V0PSsrbGFiZWw7CisJICAgIGxvYWRfYWNjKGYsJnAtPnExLHQpOworCSAgICBpZihiYz09QkVRfHxiYz09Qk5FfHwodCZVTlNJR05FRCkpeworCSAgICAgIHM9ImNtcCI7CisJICAgIH1lbHNleworCSAgICAgIGlmKGJjPT1CTFR8fGJjPT1CR0UpCisJCWVtaXQoZiwiXHRzZWNcbiIpOworCSAgICAgIGVsc2UKKwkJZW1pdChmLCJcdGNsY1xuIik7CisJICAgICAgcz0ic2JjIjsKKwkgICAgfQorCSAgfQorCSAgaWYoYz09VEVTVCkKKwkgICAgZW1pdChmLCJcdCVzXHQjMFxuIixzKTsKKwkgIGVsc2UKKwkgICAgZG9fbG9ieXRlKGYscywmcC0+cTIsdCk7CisJICBpZihiYz09QkVRKQorCSAgICBlbWl0KGYsIlx0YmVxXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgIGVsc2UgaWYoYmM9PUJORSkKKwkgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICBlbHNlIGlmKHQmVU5TSUdORUQpeworCSAgICBpZihiYz09QkxUKQorCSAgICAgIGVtaXQoZiwiXHRiY2NcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgICBlbHNlIGlmKGJjPT1CR0UpCisJICAgICAgZW1pdChmLCJcdGJjc1x0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICAgIGVsc2UgaWYoYmM9PUJMRSl7CisJICAgICAgZW1pdChmLCJcdGJjY1x0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICAgICAgZW1pdChmLCJcdGJlcVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICAgIH1lbHNlIGlmKGJjPT1CR1QpeworCSAgICAgIGVtaXQoZiwiO1xuXHRiZXFcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCSAgICAgIGVtaXQoZiwiXHRiY3NcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgICAgfWVsc2UKKwkgICAgICBpZXJyb3IoMCk7CisJICB9ZWxzZXsKKwkgICAgZW1pdChmLCJcdGJ2Y1x0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICAgIGVtaXQoZiwiXHRlb3JcdCMxMjhcbiIpOworCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgIGlmKGJjPT1CTFR8fGJjPT1CTEUpCisJICAgICAgZW1pdChmLCJcdGJtaVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICAgIGVsc2UKKwkgICAgICBlbWl0KGYsIlx0YnBsXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgIH0KKwkgIGlmKHBhY2MpeworCSAgICByZWxvYWRfYWNjKGYpOworCSAgICBhZGRfY21wbGlzdChib3V0LGJyYW5jaC0+dHlwZixwYWNjKTsKKwkgIH0KKwkgIGNvbnRpbnVlOworCX1lbHNlIGlmKGJjPT1CRVF8fGJjPT1CTkV8fCh0JlVOU0lHTkVEKXx8SVNGUE9JTlRFUih0KSl7CisJICBpbnQgaW49MDsKKwkgIGlmKHBhY2M9Y21wX2dldF9hY2MoZixwLGJyYW5jaCkpCisJICAgIGJvdXQ9KytsYWJlbDsKKworCSAgLy8gUEdTIENoZWNrIGZvciBzcGVjaWFsIGNhc2VzIG9mIGNvbXBhcmluZyB0byBjb25zdGFudHMKKwkgIGlmKCEoSVNMT05HKHQpfHxJU0ZQT0lOVEVSKHQpfHxpc2FjYyhxMSkpKSB7CisJICAgIC8vIElzIGEgMTYtYml0IHZhbHVlCisJICAgIGlmIChwLT5xMi5mbGFncyZLT05TVCkgeworCSAgICAgIGlmICghKHAtPnEyLmZsYWdzJkRSRUZPQkopKSB7CisJCWV2YWxfY29uc3QoJnAtPnEyLnZhbCx0KTsKKwkJaWYoSVNGTE9BVCh0KSkgY252X2ZwKCk7CisJCWlmICh6bTJsKHZtYXgpPT0weDEwMCkgeworCQkgIGlmIChiYz09QkdFKSB7CisJCSAgICAvLyA+PSAkMTAwIHdlIGNhbiBjaGVjayBieSBqdXN0IHJlYWRpbmcgdGhlIDJuZCBieXRlCisJCSAgICAvLyBJZiBub24temVybywgdGhlbiB3ZSB0YWtlIHRoZSBicmFuY2gKKwkJICAgIGRvX2hpYnl0ZShmLCJsZGEiLCZwLT5xMSx0KTsKKwkJICAgIGVtaXQoZiwiXHRibmVcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCQkgICAgY29udGludWU7CisJCSAgfSBlbHNlIGlmIChiYz09QkxUKSB7CisJCSAgICAvLyA8JDEwMCB3ZSBjYW4gY2hlY2sgYnkganVzdCByZWFkaW5nIHRoZSAybmQgYnl0ZQorCQkgICAgLy8gQW5kIGlmIHplcm8sIHRoZW4gd2UgdGFrZSB0aGUgYnJhbmNoCisJCSAgICBkb19oaWJ5dGUoZiwibGRhIiwmcC0+cTEsdCk7CisJCSAgICBlbWl0KGYsIlx0YmVxXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsJCSAgCisJCSAgICBjb250aW51ZTsKKwkJICB9CisJCX0gZWxzZSBpZiAoem0ybCh2bWF4KTwweDEwMCkgeworCQkgIC8vIFZhbHVlcyA8JDEwMCB3ZSBjYW4gZG8gYWxtb3N0IGFzIHNpbXBseSwgYnV0IHdlIGhhdmUgdG8KKwkJICAvLyBhbHNvIGNoZWNrIHRoZSBsb3cgYnl0ZSBmb3IgZXhjZXB0aW9ucy4KKwkJICAvLyBYWFggUEdTIFRPRE8KKwkJICAKKwkJfQorCSAgICAgIH0KKwkgICAgfQorCSAgfQorCSAgCisJICAvLyBGYXItUG9pbnRlcnMgYXJlIDMyLWJpdCBvbiBNNjUKKwkgIGlmKElTTE9ORyh0KXx8SVNGUE9JTlRFUih0KSl7CisJICAgIGRvX2J5dGU0KGYsImxkYSIsJnAtPnExLHQpOworCSAgICBpZihjPT1URVNUKQorCSAgICAgIGVtaXQoZiwiXHRjbXBcdCMwXG4iKTsKKwkgICAgZWxzZQorCSAgICAgIGRvX2J5dGU0KGYsImNtcCIsJnAtPnEyLHQpOworCSAgICBpZihiYz09QkVRKQorCSAgICAgIGVtaXQoZiwiXHRibmVcdCVzJWRcbiIsbGFicHJlZml4LGluPSsrbGFiZWwpOworCSAgICBlbHNlIGlmKGJjPT1CTkUpCisJICAgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICAgIGVsc2UgaWYoYmM9PUJMVHx8YmM9PUJMRSl7CisJICAgICAgZW1pdChmLCJcdGJjY1x0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICAgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsaW49KytsYWJlbCk7CisJICAgIH1lbHNlIGlmKGJjPT1CR0V8fGJjPT1CR1QpeworCSAgICAgIGVtaXQoZiwiXHRiY2NcdCVzJWRcbiIsbGFicHJlZml4LGluPSsrbGFiZWwpOwkKKwkgICAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgICAgfWVsc2UKKwkgICAgICBpZXJyb3IoMCk7CisJICB9CisJICBpZihJU0xPTkcodCl8fElTRlBPSU5URVIodCkpeworCSAgICBkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgaWYoYz09VEVTVCkKKwkgICAgICBlbWl0KGYsIlx0Y21wXHQjMFxuIik7CisJICAgIGVsc2UKKwkgICAgICBkb19ieXRlMyhmLCJjbXAiLCZwLT5xMix0KTsKKwkgICAgaWYoYmM9PUJFUSkKKwkgICAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxpbj9pbjooaW49KytsYWJlbCkpOworCSAgICBlbHNlIGlmKGJjPT1CTkUpCisJICAgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICAgIGVsc2UgaWYoYmM9PUJMVHx8YmM9PUJMRSl7CisJICAgICAgZW1pdChmLCJcdGJjY1x0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICAgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsaW4/aW46KGluPSsrbGFiZWwpKTsKKwkgICAgfWVsc2UgaWYoYmM9PUJHRXx8YmM9PUJHVCl7CisJICAgICAgZW1pdChmLCJcdGJjY1x0JXMlZFxuIixsYWJwcmVmaXgsaW4/aW46KGluPSsrbGFiZWwpKTsJCisJICAgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICAgIH1lbHNlCisJICAgICAgaWVycm9yKDApOwkgIAorCSAgfQorCSAgaWYoaXNhY2MocTEpKXsKKwkgICAgaWYoIWluZGlyZWN0KCZwLT5xMikpeworCSAgICAgIGRvX2hpYnl0ZShmLCJjcHgiLCZwLT5xMix0KTsKKwkgICAgfWVsc2V7CisJICAgICAgaW50IHI9Z2V0X3JlZyhmLHAsQ0hBUik7CisJICAgICAgZW1pdChmLCJcdHBoYVxuIik7CisJICAgICAgbG9hZF9oaWJ5dGUoZiwmcC0+cTIsdCk7CisJICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgICAgICBlbWl0KGYsIlx0cGxhXG4iKTsKKwkgICAgICBlbWl0KGYsIlx0Y3B4XHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICB9CisJICB9ZWxzZXsKKwkgICAgbG9hZF9oaWJ5dGUoZiwmcC0+cTEsdCk7CisJICAgIGlmKGM9PVRFU1QpCisJICAgICAgZW1pdChmLCJcdGNtcFx0IzBcbiIpOworCSAgICBlbHNlCisJICAgICAgZG9faGlieXRlKGYsImNtcCIsJnAtPnEyLHQpOworCSAgfQorCSAgaWYoYmM9PUJFUSkKKwkgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsaW4/aW46KGluPSsrbGFiZWwpKTsKKwkgIGVsc2UgaWYoYmM9PUJORSkKKwkgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICBlbHNlIGlmKGJjPT1CTFR8fGJjPT1CTEUpeworCSAgICBlbWl0KGYsIlx0YmNjXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsaW4/aW46KGluPSsrbGFiZWwpKTsKKwkgIH1lbHNlIGlmKGJjPT1CR0V8fGJjPT1CR1QpeworCSAgICBlbWl0KGYsIlx0YmNjXHQlcyVkXG4iLGxhYnByZWZpeCxpbj9pbjooaW49KytsYWJlbCkpOworCSAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgIH1lbHNlCisJICAgIGllcnJvcigwKTsKKwkgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgaWYoYz09VEVTVCkKKwkgICAgZW1pdChmLCJcdGNtcFx0IzBcbiIpOworCSAgZWxzZQorCSAgICBkb19sb2J5dGUoZiwiY21wIiwmcC0+cTIsdCk7CisJICBpZihiYz09QkVRKQorCSAgICBlbWl0KGYsIlx0YmVxXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgIGVsc2UgaWYoYmM9PUJORSkKKwkgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICBlbHNlIGlmKGJjPT1CTFQpCisJICAgIGVtaXQoZiwiXHRiY2NcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgZWxzZSBpZihiYz09QkdFKQorCSAgICBlbWl0KGYsIlx0YmNzXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsJCisJICBlbHNlIGlmKGJjPT1CTEUpeworCSAgICBlbWl0KGYsIlx0YmNjXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgICAgZW1pdChmLCJcdGJlcVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICB9ZWxzZSBpZihiYz09QkdUKXsKKwkgICAgZW1pdChmLCJcdGJjY1x0JXMlZFxuIixsYWJwcmVmaXgsaW4pOworCSAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgIH1lbHNlCisJICAgIGllcnJvcigwKTsKKwkgIGlmKGluKQorCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxpbik7CisJICBpZihwYWNjKXsKKwkgICAgcmVsb2FkX2FjYyhmKTsKKwkgICAgYWRkX2NtcGxpc3QoYm91dCxicmFuY2gtPnR5cGYscGFjYyk7CisJICB9CisJICBjb250aW51ZTsKKwl9ZWxzZXsKKwkgIGlmKGJjPT1CR1R8fGJjPT1CTEUpeworCSAgICBvYmogbzsKKwkgICAgaWYoaXNhY2MocTEpKXsKKwkgICAgICBpbnQgcjsKKwkgICAgICBpZihwYWNjPWNtcF9nZXRfYWNjKGYscCxicmFuY2gpKQorCQlib3V0PSsrbGFiZWw7CisJICAgICAgcj1nZXRfcmVnKGYscCxDSEFSKTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICAgIGxvYWRfbG9ieXRlKGYsJnAtPnEyLHQpOworCSAgICAgIGVtaXQoZiwiXHRjbXBcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgICAgZW1pdChmLCJcdHN0eFx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgICAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMix0KTsKKwkgICAgICBlbWl0KGYsIlx0c2JjXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICAgIGVtaXQoZiwiXHRidmNcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCSAgICAgIGVtaXQoZiwiXHRlb3JcdCMxMjhcbiIpOworCSAgICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgICAgICBpZihiYz09QkdUKQorCQllbWl0KGYsIlx0Ym1pXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgICAgICBlbHNlCisJCWVtaXQoZiwiXHRicGxcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgICAgIGlmKHBhY2MpeworCQlyZWxvYWRfYWNjKGYpOworCQlhZGRfY21wbGlzdChib3V0LGJyYW5jaC0+dHlwZixwYWNjKTsKKwkgICAgICB9CisJICAgICAgY29udGludWU7CisJICAgIH1lbHNleworCSAgICAgIG89cC0+cTE7cC0+cTE9cC0+cTI7cC0+cTI9bzsKKwkgICAgICBpZihiYz09QkdUKSBiYz1CTFQ7IGVsc2UgYmM9QkdFOworCSAgICB9CisJICB9CisJICBpZihwYWNjPWNtcF9nZXRfYWNjKGYscCxicmFuY2gpKQorCSAgICBib3V0PSsrbGFiZWw7CisJICBpZihJU0xPTkcodCkpeworCSAgICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgZG9fbG9ieXRlKGYsImNtcCIsJnAtPnEyLHQpOworCSAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgZG9faGlieXRlKGYsInNiYyIsJnAtPnEyLHQpOworCSAgICBkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgZG9fYnl0ZTMoZiwic2JjIiwmcC0+cTIsdCk7CisJICAgIGRvX2J5dGU0KGYsImxkYSIsJnAtPnExLHQpOworCSAgICBkb19ieXRlNChmLCJzYmMiLCZwLT5xMix0KTsKKwkgIH1lbHNleworCSAgICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgZG9fbG9ieXRlKGYsImNtcCIsJnAtPnEyLHQpOworCSAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgZG9faGlieXRlKGYsInNiYyIsJnAtPnEyLHQpOworCSAgfQorCSAgZW1pdChmLCJcdGJ2Y1x0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICBlbWl0KGYsIlx0ZW9yXHQjMTI4XG4iKTsKKwkgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgIGlmKGJjPT1CTFQpCisJICAgIGVtaXQoZiwiXHRibWlcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgZWxzZSBpZihiYz09QkdFKQorCSAgICBlbWl0KGYsIlx0YnBsXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgIGVsc2UKKwkgICAgaWVycm9yKDApOworCSAgaWYocGFjYyl7CisJICAgIHJlbG9hZF9hY2MoZik7CisJICAgIGFkZF9jbXBsaXN0KGJvdXQsYnJhbmNoLT50eXBmLHBhY2MpOworCSAgfQorCSAgY29udGludWU7IAorCX0KKwlpZXJyb3IoMCk7CisgICAgICB9CisgICAgICBpZigoYz09QUREfHxjPT1TVUJ8fGM9PUFEREkyUHx8Yz09U1VCSUZQKSYmY29tcGFyZV9vYmplY3RzKCZwLT5xMSwmcC0+eikmJighaW5kaXJlY3QoJnAtPnExKXx8KGlzcmVnKHExKSYmSVNJRFgocC0+cTEucmVnKSkpJiZpc2NvbnN0KHEyKSYmIWlzYWNjKHopKXsKKwlsb25nIGw7CisJZXZhbF9jb25zdCgmcC0+cTIudmFsLHEydHlwKHApKTsKKwlsPXptMmwodm1heCk7CisJaWYoYz09QURESTJQLyomJih0MiZOUSk9PVBPSU5URVIqLykge2M9QUREO3Q9VU5TSUdORUR8SU5UO30KKwlpZihjPT1TVUJJRlAvKiYmKHQyJk5RKT09UE9JTlRFUiovKSB7Yz1TVUI7dD1VTlNJR05FRHxJTlQ7fQorCWlmKGM9PVNVQnx8Yz09U1VCSUZQKSBsPS1sOworCS8qVE9ETzogYWxsb3cgbGFyZ2VyIHR5cGVzICovCisJaWYobDwzJiZsPi0zJiYodCZOUSk8PUlOVCl7CisJICBpZihsPDApeworCSAgICBnZXRfYWNjKGYscCxDSEFSKTsKKwkgICAgaW5jbWVtKGYsJnAtPnosdCxTVUIsLWwpOworCSAgfWVsc2UKKwkgICAgaW5jbWVtKGYsJnAtPnosdCxBREQsbCk7CisJICBjb250aW51ZTsKKwl9CisgICAgICB9CisKKyAgICAgIGlmKChjPT1MU0hJRlR8fGM9PVJTSElGVCkmJmlzcmVnKHExKSYmaXNyZWcoeikmJmlzY29uc3QocTIpJiZwLT5xMS5yZWc9PXAtPnoucmVnJiZwLT56LnJlZyE9cmEmJnAtPnoucmVnIT1yYXgpeworCWxvbmcgbDsKKwlldmFsX2NvbnN0KCZwLT5xMi52YWwscTJ0eXAocCkpOworCWw9em0ybCh2bWF4KTsKKwkvKlRPRE86IGFsbG93IGxhcmdlciB0eXBlcyAqLworCWlmKGw8NSYmKHQmTlEpPD1JTlQpeworCSAgaWYoYz09UlNISUZUJiYhKHQmVU5TSUdORUQpKQorCSAgICBnZXRfYWNjKGYscCxDSEFSKTsKKwkgIGluY21lbShmLCZwLT56LHQsYyxsKTsKKwkgIGNvbnRpbnVlOworCX0KKyAgICAgIH0KKworICAgICAgaWYoYz09TFNISUZUfHxjPT1SU0hJRlQpeworCWxvbmcgbD0tMTtpbnQgbG9vcD0wLHIscjIscjMsb3V0bD0wOworCWlmKGlzY29uc3QocTIpKXsKKwkgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxxMnR5cChwKSk7CisJICBsPXptMmwodm1heCk7CisJICBsb29wPTA7CisJfWVsc2UKKwkgIGxvb3A9MTsKKwlpZihsPj0wJiZvcHRzaXplKXsKKwkgIGlmKGM9PUxTSElGVCYmKGwmNyk+NikgCisJICAgIGxvb3A9MTsKKwkgIGVsc2UgaWYoYz09UlNISUZUJiYodCZVTlNJR05FRCkmJihsJjcpPjMpCisJICAgIGxvb3A9MTsKKwkgIGVsc2UgaWYoYz09UlNISUZUJiYhKHQmVU5TSUdORUQpJiYobCY3KT4yKQorCSAgICBsb29wPTE7CisJfQorCisJaWYoIUlTQ0hBUih0KSkKKwkgIHI9Z2V0X3JlZyhmLHAsQ0hBUik7CisJaWYoSVNMT05HKHQpKXsKKwkgIHIyPWdldF9yZWcoZixwLENIQVIpOworCSAgcjM9Z2V0X3JlZyhmLHAsQ0hBUik7CisJfQorCWlmKElTTE9ORyh0KSl7CisJICBnZXRfYWNjKGYscCxDSEFSKTsKKwkgIGlmKGw+PTI0KXsKKwkgICAgaWYoYz09TFNISUZUKXsKKwkgICAgICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjNdKTsKKwkgICAgICBlbWl0KGYsIlx0bGRhXHQjMFxuIik7CisJICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjJdKTsKKwkgICAgfWVsc2UgaWYoYz09UlNISUZUJiYhKHQmVU5TSUdORUQpKXsKKwkgICAgICBkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjNdKTsKKwkgICAgICBzZXR5KGYsMCk7CisJICAgICAgZW1pdChmLCJcdGNtcFx0IzBcbiIpOworCSAgICAgIGVtaXQoZiwiXHRicGxcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCSAgICAgIGVtaXQoZiwiXHRkZXlcbiIpOworCSAgICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgICAgICBlbWl0KGYsIlx0c3R5XHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICAgIGVtaXQoZiwiXHRzdHlcdCVzXG4iLG1yZWduYW1lc1tyMl0pOworCSAgICAgIGVtaXQoZiwiXHR0eWFcbiIpOworCSAgICAgIHl2YWw9Tk9WQUw7CisJICAgIH1lbHNleworCSAgICAgIGVtaXQoZiwiXHRsZGFcdCMwXG4iKTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjNdKTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjJdKTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICAgIGRvX2J5dGU0KGYsImxkYSIsJnAtPnExLHQpOworCisJICAgIH0KKwkgIH1lbHNlIGlmKGw+PTE2KXsKKwkgICAgaWYoYz09TFNISUZUKXsKKwkgICAgICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjJdKTsKKwkgICAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjNdKTsKKwkgICAgICBlbWl0KGYsIlx0bGRhXHQjMFxuIik7CisJICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgICAgfWVsc2UgaWYoYz09UlNISUZUJiYhKHQmVU5TSUdORUQpKXsKKwkgICAgICBkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjNdKTsKKwkgICAgICBkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjJdKTsKKwkgICAgICBzZXR5KGYsMCk7CisJICAgICAgZW1pdChmLCJcdGNtcFx0IzBcbiIpOworCSAgICAgIGVtaXQoZiwiXHRicGxcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCSAgICAgIGVtaXQoZiwiXHRkZXlcbiIpOworCSAgICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgICAgICBlbWl0KGYsIlx0c3R5XHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICAgIGVtaXQoZiwiXHR0eWFcbiIpOworCSAgICAgIHl2YWw9Tk9WQUw7CisJICAgIH1lbHNleworCSAgICAgIGVtaXQoZiwiXHRsZGFcdCMwXG4iKTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjJdKTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjNdKTsKKwkgICAgICBkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCisJICAgIH0KKwkgIH1lbHNlIGlmKGw+PTgpeworCSAgICBpZihjPT1MU0hJRlQpeworCSAgICAgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgICAgbG9hZF9oaWJ5dGUoZiwmcC0+cTEsdCk7CisJICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3IyXSk7CisJICAgICAgZG9fYnl0ZTMoZiwibGRhIiwmcC0+cTEsdCk7CisJICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3IzXSk7CisJICAgICAgZW1pdChmLCJcdGxkYVx0IzBcbiIpOworCSAgICB9ZWxzZSBpZihjPT1SU0hJRlQmJiEodCZVTlNJR05FRCkpeworCSAgICAgIGxvYWRfaGlieXRlKGYsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyM10pOworCSAgICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyMl0pOworCSAgICAgIGRvX2J5dGU0KGYsImxkYSIsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgICAgc2V0eShmLDApOworCSAgICAgIGVtaXQoZiwiXHRjbXBcdCMwXG4iKTsKKwkgICAgICBlbWl0KGYsIlx0YnBsXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgICAgICBlbWl0KGYsIlx0ZGV5XG4iKTsKKwkgICAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgICAgZW1pdChmLCJcdHR5YVxuIik7CisJICAgICAgeXZhbD1OT1ZBTDsKKwkgICAgfWVsc2V7CisJICAgICAgZW1pdChmLCJcdGxkYVx0IzBcbiIpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyM10pOworCSAgICAgIGRvX2J5dGU0KGYsImxkYSIsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyMl0pOworCSAgICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgICAgbG9hZF9oaWJ5dGUoZiwmcC0+cTEsdCk7CisKKwkgICAgfQorCSAgfWVsc2UgaWYoYz09UlNISUZUJiYhKHQmVU5TSUdORUQpKXsKKwkgICAgbG9hZF9sb2J5dGUoZiwmcC0+cTEsdCk7CisJICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyM10pOworCSAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3IyXSk7CisJICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCSAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICBkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkgIH1lbHNleworCSAgICBkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3IzXSk7CisJICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCSAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjJdKTsKKwkgICAgbG9hZF9oaWJ5dGUoZiwmcC0+cTEsdCk7CisJICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgfQorCX1lbHNlCisJICBnZXRfYWNjKGYscCx0KTsKKwlpZighSVNMT05HKHQpKXsKKwkgIGlmKGw+PTgpeworCSAgICBpZighSVNTSE9SVCh0KSkgaWVycm9yKDApOworCSAgICBpZihjPT1MU0hJRlQpeworCSAgICAgIGlmKGluZGlyZWN0KCZwLT5xMSkpeworCQlsb2FkX2xvYnl0ZShmLCZwLT5xMSx0KTsKKwkJZW1pdChmLCJcdHRheFxuIik7CisJCWVtaXQoZiwiXHRsZGFcdCMwXG4iKTsKKwkgICAgICB9ZWxzZXsKKwkJaWYoaXNhY2MocTEpKQorCQkgIGVtaXQoZiwiXHR0YXhcbiIpOworCQllbHNlCisJCSAgZG9fbG9ieXRlKGYsImxkeCIsJnAtPnExLHQpOworCQllbWl0KGYsIlx0bGRhXHQjMFxuIik7CisJICAgICAgfQorCSAgICB9ZWxzZXsKKwkgICAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0bGR4XHQjMFxuIik7CisJICAgICAgaWYoISh0JlVOU0lHTkVEKSl7CisJCWVtaXQoZiwiXHRjbXBcdCMwXG4iKTsKKwkJZW1pdChmLCJcdGJwbFx0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJCWVtaXQoZiwiXHRkZXhcbiIpOworCQllbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgICAgfQorCSAgICB9CisJICB9ZWxzZQorCSAgICBsb2FkX2FjYyhmLCZwLT5xMSx0KTsKKwl9CisJaWYoSVNTSE9SVCh0KSkKKwkgIGVtaXQoZiwiXHRzdHhcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJaWYobD49MCkgbCY9NzsKKwlpZihsb29wKXsKKwkgIGlmKGw+PTApCisJICAgIHNldHkoZixsKTsKKwkgIGVsc2V7CisJICAgIGlmKGluZGlyZWN0KCZwLT5xMikpeworCSAgICAgIGVtaXQoZiwiXHRwaGFcbiIpOworCSAgICAgIGxvYWRfbG9ieXRlKGYsJnAtPnEyLHEydHlwKHApKTsKKwkgICAgICBlbWl0KGYsIlx0dGF5XG4iKTsKKwkgICAgICBlbWl0KGYsIlx0cGxhXG4iKTsKKwkgICAgICBlbWl0KGYsIlx0Y3B5XHQjMFxuIik7CisJICAgIH1lbHNleworCSAgICAgIGVtaXQoZiwiXHRsZHlcdCIpOworCSAgICAgIGVtaXRfbG9ieXRlKGYsJnAtPnEyLHEydHlwKHApKTsKKwkgICAgICBlbWl0KGYsIlxuIik7CisJICAgIH0KKwkgICAgb3V0bD0rK2xhYmVsOworCSAgICBlbWl0KGYsIlx0YmVxXHQlcyVkXG4iLGxhYnByZWZpeCxvdXRsKTsKKwkgIH0KKwkgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCX1lbHNleworCSAgaWYoSVNDSEFSKHQpKQorCSAgICBsJj03OworCSAgZWxzZSBpZihJU1NIT1JUKHQpKQorCSAgICBsJj0xNTsKKwkgIGVsc2UKKwkgICAgbCY9MzE7CisJfQorCXdoaWxlKGw+MHx8bG9vcCl7CisJICBpZihjPT1MU0hJRlQpeworCSAgICBlbWl0KGYsIlx0YXNsXG4iKTsKKwkgICAgaWYoIUlTQ0hBUih0KSkKKwkgICAgICBlbWl0KGYsIlx0cm9sXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICBpZihJU0xPTkcodCkpeworCSAgICAgIGVtaXQoZiwiXHRyb2xcdCVzXG4iLG1yZWduYW1lc1tyMl0pOworCSAgICAgIGVtaXQoZiwiXHRyb2xcdCVzXG4iLG1yZWduYW1lc1tyM10pOworCSAgICB9CisJICB9ZWxzZSBpZih0JlVOU0lHTkVEKXsKKwkgICAgZW1pdChmLCJcdGNsY1xuIik7CisJICAgIGlmKElTTE9ORyh0KSl7CisJICAgICAgZW1pdChmLCJcdHJvclx0JXNcbiIsbXJlZ25hbWVzW3IzXSk7CisJICAgICAgZW1pdChmLCJcdHJvclx0JXNcbiIsbXJlZ25hbWVzW3IyXSk7CisJICAgIH0KKwkgICAgaWYoIUlTQ0hBUih0KSkKKwkgICAgICBlbWl0KGYsIlx0cm9yXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICBlbWl0KGYsIlx0cm9yXG4iKTsKKwkgIH1lbHNleworCSAgICBpZihJU0xPTkcodCkpeworCSAgICAgIGVtaXQoZiwiXHRjbXBcdCMxMjhcbiIpOworCSAgICAgIGVtaXQoZiwiXHRyb3JcbiIpOworCSAgICAgIGVtaXQoZiwiXHRyb3JcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgICAgZW1pdChmLCJcdHJvclx0JXNcbiIsbXJlZ25hbWVzW3IyXSk7CisJICAgICAgZW1pdChmLCJcdHJvclx0JXNcbiIsbXJlZ25hbWVzW3IzXSk7CisJICAgIH1lbHNleworCSAgICAgIGlmKCFJU0NIQVIodCkpeworCQllbWl0KGYsIlx0Y3B4XHQjMTI4XG4iKTsKKwkJZW1pdChmLCJcdHJvclx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgICAgICB9ZWxzZQorCQllbWl0KGYsIlx0Y21wXHQjMTI4XG4iKTsKKwkgICAgICBlbWl0KGYsIlx0cm9yXG4iKTsKKwkgICAgfQorCSAgfQorCSAgaWYobG9vcCl7CisJICAgIGVtaXQoZiwiXHRkZXlcbiIpOworCSAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgIGlmKG91dGwpIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LG91dGwpOworCSAgICB5dmFsPTA7CisJICAgIGJyZWFrOworCSAgfQorCSAgbC0tOworCX0KKwlpZihJU0xPTkcodCkpeworCSAgaWYoYz09UlNISUZUJiYhKHQmVU5TSUdORUQpKXsKKwkgICAgZG9fYnl0ZTQoZiwic3RhIiwmcC0+eix0KTsKKwkgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgICAgZG9fYnl0ZTMoZiwic3RhIiwmcC0+eix0KTsKKwkgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3IyXSk7CisJICAgIHN0b3JlX2hpYnl0ZShmLCZwLT56LHQpOworCSAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcjNdKTsKKwkgICAgc3RvcmVfbG9ieXRlKGYsJnAtPnosdCk7CisJICB9ZWxzZXsKKwkgICAgc3RvcmVfbG9ieXRlKGYsJnAtPnosdCk7CisJICAgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgIHN0b3JlX2hpYnl0ZShmLCZwLT56LHQpOworCSAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcjJdKTsKKwkgICAgZG9fYnl0ZTMoZiwic3RhIiwmcC0+eix0KTsKKwkgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3IzXSk7CisJICAgIGRvX2J5dGU0KGYsInN0YSIsJnAtPnosdCk7CisJICB9CisJfWVsc2V7CisJICBpZighSVNDSEFSKHQpKQorCSAgICBlbWl0KGYsIlx0bGR4XHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgaWYoSVNDSEFSKHQpfHxpbmRpcmVjdCgmcC0+eikpCisJICAgIHN0b3JlX2FjYyhmLCZwLT56LHQpOworCSAgZWxzZXsKKwkgICAgc3RvcmVfbG9ieXRlKGYsJnAtPnosdCk7CisJICAgIGlmKCFpc3JlZyh6KXx8cC0+ei5yZWchPXJheCl7CisJICAgICAgZW1pdChmLCJcdHN0eFx0Iik7CisJICAgICAgZW1pdF9oaWJ5dGUoZiwmcC0+eix0KTsKKwkgICAgICBlbWl0KGYsIlxuIik7CisJICAgIH0KKwkgIH0KKwl9CisJY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmKChjPj1PUiYmYzw9QU5EKXx8KGM+PUxTSElGVCYmYzw9TU9EKXx8Yz09QURESTJQfHxjPT1TVUJJRlApeworCWNoYXIgKnM7aW50IHQyPXQscHQ9cC0+dHlwZjI7CisJaWYoIWlzYWNjKHopKQorCSAgZ2V0X2FjYyhmLHAsQ0hBUik7CisJaWYoYz09QURESTJQfHxjPT1TVUJJRlApeworCSAgaWYoYz09QURESTJQKSBjPUFERDsgZWxzZSBjPVNVQjsKKwkgIHQ9VU5TSUdORUR8SU5UOworCSAgaWYoKHB0Jk5RKT09UE9JTlRFUiYmKHAtPnExLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKwkgICAgZXZhbF9jb25zdCgmcC0+cTEudmFsLFBPSU5URVIpOworCSAgICBpbnNlcnRfY29uc3QoJnAtPnExLnZhbCxVTlNJR05FRHxJTlQpOworCSAgfQorCX0KKwlpZihjPj1PUiYmYzw9QU5EKQorCSAgcz1sb2dpY2Fsc1tjLU9SXTsKKwllbHNlCisJICBzPWFyaXRobWV0aWNzW2MtTFNISUZUXTsKKyAgICAgIAorCWlmKElTRkxPQVQodCkpeworCSAgaWYoIWllZWUpIGllcnJvcigwKTsKKwkgIHQmPU5ROworCSAgaWYocmVnc1tMQVNUX1BBSVJdKSBpZXJyb3IoMCk7CisJICBnZXRfYWNjKGYscCxJTlQpOworCSAgcmVnc1tMQVNUX1BBSVJdPTE7CisJICBsb2FkX2FkZHJlc3MoZixMQVNUX1BBSVIsJnAtPnExLHQpOworCSAgQlNFVChyZWd1c2VkLHQzKTsKKwkgIEJTRVQocmVndXNlZCx0NCk7CisJICBlbWl0KGYsIlx0anNyXHQlc19fZmxvYWQlY1xuIixpZHByZWZpeCwodD09RkxPQVQ/J3MnOidkJykpOworCSAgeXZhbD1OT1ZBTDsKKwkgIGxvYWRfYWRkcmVzcyhmLExBU1RfUEFJUiwmcC0+cTIsdCk7CisJICBlbWl0KGYsIlx0anNyXHQlc19fZiVzJWNcbiIsaWRwcmVmaXgsZW5hbWVbY10sKHQ9PUZMT0FUPydzJzonZCcpKTsKKwkgIHl2YWw9Tk9WQUw7CisJICBsb2FkX2FkZHJlc3MoZixMQVNUX1BBSVIsJnAtPnosdCk7CisJICBlbWl0KGYsIlx0anNyXHQlc19fZnN0b3JlJWNcbiIsaWRwcmVmaXgsKHQ9PUZMT0FUPydzJzonZCcpKTsKKwkgIHl2YWw9Tk9WQUw7CisJICByZWdzW0xBU1RfUEFJUl09MDsKKwkgIGNvbnRpbnVlOworCX1lbHNlIGlmKElTTE9ORyh0KSl7CisJICBpZihjPT1BREQpIGVtaXQoZiwiXHRjbGNcbiIpOworCSAgaWYoYz09U1VCKSBlbWl0KGYsIlx0c2VjXG4iKTsKKwkgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgZG9fbG9ieXRlKGYscywmcC0+cTIsdCk7CisJICBzdG9yZV9sb2J5dGUoZiwmcC0+eix0KTsKKwkgIGxvYWRfaGlieXRlKGYsJnAtPnExLHQpOworCSAgZG9faGlieXRlKGYscywmcC0+cTIsdCk7CisJICBzdG9yZV9oaWJ5dGUoZiwmcC0+eix0KTsKKwkgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCSAgZG9fYnl0ZTMoZixzLCZwLT5xMix0KTsKKwkgIGRvX2J5dGUzKGYsInN0YSIsJnAtPnosdCk7CisJICBkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkgIGRvX2J5dGU0KGYscywmcC0+cTIsdCk7CisJICBkb19ieXRlNChmLCJzdGEiLCZwLT56LHQpOworCSAgY29udGludWU7CisJfWVsc2UgaWYoSVNDSEFSKHQpKXsKKwkgIGxvYWRfYWNjKGYsJnAtPnExLHQpOworCSAgaWYoaGFzX2luY19hJiYoYz09QUREfHxjPT1TVUIpJiYocC0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworCSAgICBldmFsX2NvbnN0KCZwLT5xMi52YWwsdCk7CisJICAgIGlmKHptZXF0byh2bWF4LFoxKXx8em1lcXRvKHZtYXgsbDJ6bSgyTCkpKXsKKwkgICAgICBpZih6bWVxdG8odm1heCxsMnptKDJMKSkpCisJCWVtaXQoZiwiXHQlc1xuIixjPT1BREQ/ImluYSI6ImRlYSIpOworCSAgICAgIGVtaXQoZiwiXHQlc1xuIixjPT1BREQ/ImluYSI6ImRlYSIpOworCSAgICAgIHN0b3JlX2FjYyhmLCZwLT56LHQpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICB9CisJICBpZihjPT1BREQpIGVtaXQoZiwiXHRjbGNcbiIpOworCSAgaWYoYz09U1VCKSBlbWl0KGYsIlx0c2VjXG4iKTsKKwkgIGlmKGlzcmVnKHEyKSYmSVNJRFgocC0+cTIucmVnKSl7CisJICAgIGludCByPWdldF9yZWcoZixwLENIQVIpOworCSAgICBlbWl0KGYsIlx0c3Qlc1x0JXNcbiIsbXJlZ25hbWVzW3AtPnEyLnJlZ10sbXJlZ25hbWVzW3JdKTsKKwkgICAgcC0+cTIuZmxhZ3M9UkVHOworCSAgICBwLT5xMi5yZWc9cjsKKwkgIH0KKwkgIGRvX2xvYnl0ZShmLHMsJnAtPnEyLHQpOworCSAgc3RvcmVfYWNjKGYsJnAtPnosdCk7CisJfWVsc2UgaWYoYz09QUREfHxjPT1TVUIpeworCSAgaW50IGEscjtsb25nIGw9MTsKKwkgIGlmKGlzY29uc3QocTIpKXsKKwkgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHQyKTsKKwkgICAgbD16bTJsKHZtYXgpOworCSAgICBsJj0weGZmMDA7CisJICB9CisJICBpZihpc3JlZyh6KSYmcC0+ei5yZWc9PXJheCkgYT0xOyBlbHNlIGE9MDsKKwkgIGlmKCh0MiZOVSk9PUNIQVImJihwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpIT1LT05TVCl7CisJICAgIGVtaXQoZiwiXHRsZHhcdCMwXG4iKTsKKwkgIH0KKwkgIGlmKCh0MiZOVSk9PUNIQVImJihwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpIT1LT05TVCl7CisJICAgIGxvYWRfbG9ieXRlKGYsJnAtPnEyLHQpOworCSAgICBlbWl0KGYsIlx0YnBsXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgICAgZW1pdChmLCJcdGRleFxuIik7CisJICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgICAgaWYoYz09QUREKXsKKwkgICAgICBpZihjPT1BREQpIGVtaXQoZiwiXHRjbGNcbiIpOyBlbHNlIGVtaXQoZiwiXHRzZWNcbiIpOworCSAgICAgIGRvX2xvYnl0ZShmLHMsJnAtPnExLHQpOworCSAgICAgIGlmKGlzYWNjKHopKQorCQllbWl0KGYsIlx0cGhhXG4iKTsKKwkgICAgICBlbHNlCisJCXN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCSAgICAgIGVtaXQoZiwiXHR0eGFcbiIpOworCSAgICAgIGRvX2hpYnl0ZShmLHMsJnAtPnExLHQpOworCSAgICAgIHN0b3JlX2hpYnl0ZShmLCZwLT56LHQpOworCSAgICAgIGlmKElTRlBPSU5URVIocHQpJiYhY29tcGFyZV9vYmplY3RzKCZwLT5xMSwmcC0+eikpeworCQlkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSxwdCk7CisJCWRvX2J5dGUzKGYsInN0YSIsJnAtPnoscHQpOworCSAgICAgIH0KKwkgICAgICBpZihpc2FjYyh6KSkKKwkJZW1pdChmLCJcdHBsYVxuIik7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgICAgcj1nZXRfcmVnKGYscCxDSEFSKTsKKwkgICAgZW1pdChmLCJcdHN0eFx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgIH0KKwkgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgaWYoYz09QUREKSBlbWl0KGYsIlx0Y2xjXG4iKTsgZWxzZSBlbWl0KGYsIlx0c2VjXG4iKTsKKwkgIGRvX2xvYnl0ZShmLHMsJnAtPnEyLHQyKTsKKwkgIHN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCSAgaWYobD09MCYmaXNyZWcocTEpJiZpc3JlZyh6KSYmcC0+cTEucmVnPT1wLT56LnJlZyl7CisJICAgIGlmKGM9PUFERCl7CisJICAgICAgZW1pdChmLCJcdGJjY1x0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICAgICAgaWYoYSkKKwkJZW1pdChmLCJcdGlueFxuIik7CisJICAgICAgZWxzZXsKKwkJLyppZighcmVnX3BhaXIocC0+ei5yZWcsJnJwKSkgaWVycm9yKDApOyovCisJCWVtaXQoZiwiXHRpbmNcdCVzKzFcbiIsbXJlZ25hbWVzW3AtPnoucmVnXSk7CisJICAgICAgfQorCSAgICB9ZWxzZXsKKwkgICAgICBlbWl0KGYsIlx0YmNzXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgICAgICBpZihhKQorCQllbWl0KGYsIlx0ZGV4XG4iKTsKKwkgICAgICBlbHNleworCQlpZighcmVnX3BhaXIocC0+ei5yZWcsJnJwKSkgaWVycm9yKDApOworCQllbWl0KGYsIlx0ZGVjXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsKKwkgICAgICB9CisJICAgIH0KKwkgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwpOworCSAgfWVsc2V7CisJICAgIGlmKGE9PTEpIGVtaXQoZiwiXHRwaGFcbiIpOworCSAgICBpZigodDImTlEpPT1DSEFSKXsKKwkgICAgICBpZih0MiZVTlNJR05FRCl7CisJCWxvYWRfaGlieXRlKGYsJnAtPnExLHQpOworCQllbWl0KGYsIlx0JXNcdCMwXG4iLHMpOworCSAgICAgIH1lbHNleworCQlsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkJaWYoKHAtPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKwkJICBldmFsX2NvbnN0KCZwLT5xMi52YWwsdDIpOworCQkgIGlmKHptbGVxKFowLHZtYXgpKQorCQkgICAgZW1pdChmLCJcdCVzXHQjMFxuIixzKTsKKwkJICBlbHNlCisJCSAgICBlbWl0KGYsIlx0JXNcdCMyNTVcbiIscyk7CisJCX1lbHNleworCQkgIGVtaXQoZiwiXHQlc1x0JXNcbiIscyxtcmVnbmFtZXNbcl0pOworCQl9CisJICAgICAgfQorCSAgICB9ZWxzZXsKKwkgICAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgICBkb19oaWJ5dGUoZixzLCZwLT5xMix0Mik7CisJICAgIH0KKwkgICAgc3RvcmVfaGlieXRlKGYsJnAtPnosdCk7CisJICAgIGlmKGE9PTEpIGVtaXQoZiwiXHRwbGFcbiIpOworCSAgICBpZihJU0ZQT0lOVEVSKHB0KSYmcC0+Y29kZSE9U1VCUEZQKXsKKwkgICAgICBpZighY29tcGFyZV9vYmplY3RzKCZwLT5xMSwmcC0+eikpeworCQlkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSxGUE9JTlRFUik7CisJCWRvX2J5dGUzKGYsInN0YSIsJnAtPnosRlBPSU5URVIpOworCSAgICAgIH0KKwkgICAgfQorCSAgfQorCX1lbHNleworCSAgaWYoaXNhY2MocTEpKQorCSAgICBlbWl0KGYsIlx0cGhhXG4iKTsKKwkgIGxvYWRfaGlieXRlKGYsJnAtPnExLHQpOworCSAgZG9faGlieXRlKGYscywmcC0+cTIsdCk7CisJICBzdG9yZV9oaWJ5dGUoZiwmcC0+eix0KTsKKwkgIGlmKGlzYWNjKHExKSkKKwkgICAgZW1pdChmLCJcdHBsYVxuIik7CisJICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0KTsKKwkgIGRvX2xvYnl0ZShmLHMsJnAtPnEyLHQpOworCSAgc3RvcmVfbG9ieXRlKGYsJnAtPnosdCk7CisJfQorCWNvbnRpbnVlOworICAgICAgfQorICAgICAgcHJpYzIoc3Rkb3V0LHApOworICAgICAgaWVycm9yKDApOworICAgIH0KKworICAgIGZ1bmN0aW9uX2JvdHRvbShmLHYsbG9jYWxzaXplKTsKKyAgICAKKyAgICBmb3IoYz0xO2M8PU1BWFI7YysrKXsKKyAgICAgIGlmKHJlZ3NhW2NdfHxyZWd1c2VkW2NdKXsKKwlCU0VUKHJlZ3NfbW9kaWZpZWQsYyk7CisgICAgICB9CisgICAgfQorCisgICAgaWYoc3RhY2tfdmFsaWQpeworICAgICAgaWYoIXYtPmZpKSB2LT5maT1uZXdfZmkoKTsKKyAgICAgIHYtPmZpLT5mbGFnc3w9QUxMX1NUQUNLOworICAgICAgdi0+ZmktPnN0YWNrMT1zdGFjazsKKyAgICB9CisgIH0KKworICBmcmVlX0lDKG1pKTsKKworICBlbWl0KGYsIjsgc3RhY2tzaXplPSVsdSVzXG4iLHp1bTJ1bChzdGFjayksc3RhY2tfdmFsaWQ/IiI6Iis/PyIpOworfQorCitpbnQgc2hvcnRjdXQoaW50IGNvZGUsaW50IHR5cCkKK3sKKyAgaWYoY29kZT09Q09NUEFSRS8qfHxjb2RlPT1NVUxUKi98fGNvZGU9PUFERHx8Y29kZT09U1VCfHxjb2RlPT1BTkR8fGNvZGU9PU9SfHxjb2RlPT1YT1J8fGNvZGU9PUxTSElGVHx8Y29kZT09UlNISUZUfHxjb2RlPT1NSU5VU3x8Y29kZT09S09NUExFTUVOVHx8Y29kZT09TkVHQVRJT04pCisgICAgcmV0dXJuIDE7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmF0dHIodHlwZSAqcCxjaGFyICpzKQoreworICBpZihwLT5hdHRyJiZzdHJzdHIocC0+YXR0cixzKSkKKyAgICByZXR1cm4gMTsKKyAgaWYocC0+bmV4dCkKKyAgICByZXR1cm4gZmF0dHIocC0+bmV4dCxzKTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCitpbnQgcmVnX3Bhcm0oc3RydWN0IHJlZ19oYW5kbGUgKm0sIHN0cnVjdCBUeXAgKnQsaW50IHZhcmFyZyxzdHJ1Y3QgVHlwICpkKQoreworICBpbnQgZjsKKworICBpZih2YXJhcmcpCisgICAgcmV0dXJuIDA7CisgIGY9dC0+ZmxhZ3MmTlE7CisgIGlmKE9MREZQJiZJU0ZMT0FUKGYpKSByZXR1cm4gMDsKKyAgaWYoZCYmZmF0dHIoZCwiX19zdGFja3Bhcm1zX18iKSkKKyAgICByZXR1cm4gMDsKKyAgaWYoZCYmZmF0dHIoZCwiX19jYzY1X18iKSl7CisgICAgbS0+cmVncysrOworICAgIHByaW50ZigiYXJnPSVkIGNudD0lZFxuIixtLT5yZWdzLGQtPmV4YWN0LT5jb3VudCk7CisgICAgaWYobS0+cmVncz09ZC0+ZXhhY3QtPmNvdW50LTEpeworICAgICAgaWYoSVNDSEFSKHQtPmZsYWdzKSkKKwlyZXR1cm4gcmE7CisgICAgICBpZihJU1NIT1JUKHQtPmZsYWdzKSkKKwlyZXR1cm4gcmF4OworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorICBpZihJU0NIQVIoZikpeworICAgIGlmKCF0LT5leGFjdCl7CisgICAgICBpZihtLT5yZWdzPj1HUFJfQVJHUy0xKQorCXJldHVybiAwOworICAgICAgZj1GSVJTVF9HUFIrbS0+cmVnczsKKyAgICAgIG0tPnJlZ3MrPTI7CisgICAgICByZXR1cm4gZjsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKG0tPnJlZ3M+PUdQUl9BUkdTKQorCXJldHVybiAwOworICAgICAgZWxzZQorCXJldHVybiBGSVJTVF9HUFIrbS0+cmVncysrOworICAgIH0KKyAgfQorICBpZihJU1NIT1JUKGYpfHxmPT1QT0lOVEVSKXsKKyAgICBpZihtLT5yZWdzPj1HUFJfQVJHUy0xKQorICAgICAgcmV0dXJuIDA7CisgICAgZWxzZXsKKyAgICAgIGlmKG0tPnJlZ3MmMSkgbS0+cmVncys9MTsKKyAgICAgIG0tPnJlZ3MrPTI7CisgICAgICByZXR1cm4gRklSU1RfUEFJUittLT5yZWdzLzItMTsKKyAgICB9CisgIH0KKyAgaWYoZj09RlBPSU5URVJ8fGY9PUxPTkd8fGY9PUZMT0FUfHwoIWllZWUmJihmPT1ET1VCTEV8fGY9PUxET1VCTEUpKSl7CisgICAgaWYobS0+YnJlZ3M+PTQpCisgICAgICByZXR1cm4gMDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gRklSU1RfQklHK20tPmJyZWdzKys7CisgIH0KKyAgaWYoZj09TExPTkd8fChpZWVlJiYoZj09RE9VQkxFfHxmPT1MRE9VQkxFKSkpeworICAgIGlmKG0tPmJyZWdzPj0zKQorICAgICAgcmV0dXJuIDA7CisgICAgZWxzZXsKKyAgICAgIGlmKG0tPmJyZWdzJjEpICBtLT5icmVncysrOworICAgICAgbS0+YnJlZ3MrPTI7CisgICAgICByZXR1cm4gRklSU1RfQklHUCttLT5icmVncy8yLTE7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitpbnQgaGFuZGxlX3ByYWdtYShjb25zdCBjaGFyICpzKQoreworICBzdGF0aWMgY2hhciBzZWNbU0VDTEVOXTsKKyAgaW50IGk7CisgIGlmKHNzY2FuZihzLCJzZWN0aW9uICUxMjdzIixzZWMpPT0xKXsKKyAgICBpZighc3RyY21wKHNlYywiZGVmYXVsdCIpKQorICAgICAgdXNlX3NlYz0wOworICAgIGVsc2UKKyAgICAgIHVzZV9zZWM9c2VjOworICAgIHJldHVybiAxOworICB9CisgIGlmKHNzY2FuZihzLCJiYW5rICVkIiwmaSk9PTEpeworICAgIHVzZV9iYW5rPWk7CisgICAgcmV0dXJuIDE7CisgIH0KK30KK3ZvaWQgY2xlYW51cF9jZyhGSUxFICpmKQoreworICBpbnQgaTsKKyAgc3RydWN0IGZwY29uc3RsaXN0ICpwPWZpcnN0ZnBjOworCisgIGlmKGYmJnApeworICAgIGVtaXQoZixyb2RhdGFuYW1lKTtlbWl0KGYsIlxuIik7CisgICAgc2VjdGlvbj1ST0RBVEE7CisgIH0KKyAgd2hpbGUocD1maXJzdGZwYyl7CisgICAgZW1pdChmLCIlcyVkOlxuXHR3b3JkXHQiLGxhYnByZWZpeCxwLT5sYWJlbCk7CisgICAgaWYoaWVlZSkKKyAgICAgIGVtaXRfaWVlZShmLCZwLT52YWwscC0+dCk7CisgICAgZWxzZXsKKyAgICAgIGludCB3b3Jkcz16bTJsKHNpemV0YWJbcC0+dCZOUV0pLzI7CisgICAgICBldmFsX2NvbnN0KCZwLT52YWwscC0+dCk7CisgICAgICBpZihJU0ZMT0FUKHAtPnQpKSBjbnZfZnAoKTsKKyAgICAgIGZvcihpPTA7aTx3b3JkcztpKyspeworCWVtaXQoZiwiJWxkIix6bTJsKHZtYXgpJjB4ZmZmZik7CisJaWYoaTx3b3Jkcy0xKXtlbWl0KGYsIiwiKTt2bWF4PXptcnNoaWZ0KHZtYXgsbDJ6bSgxNkwpKTt9CisgICAgICB9CisgICAgICBlbWl0KGYsIlxuIik7CisgICAgICAvKmVtaXQoZiwiJWxkLCVsZFxuIix6bTJsKHZtYXgpJjB4ZmZmZix6bTJsKHptcnNoaWZ0KHZtYXgsbDJ6bSgxNkwpKSkmMHhmZmZmKTsqLworICAgIH0KKyAgICBmaXJzdGZwYz1wLT5uZXh0OworICAgIGZyZWUocCk7CisgIH0KKworICBlbWl0KGYsIlx0enBhZ2VcdCVzXG4iLG1yZWduYW1lc1tzcF0pOworICBmb3IoaT1GSVJTVF9HUFI7aTw9TEFTVF9HUFI7aSsrKQorICAgIGVtaXQoZiwiXHR6cGFnZVx0JXNcbiIsbXJlZ25hbWVzW2ldKTsKKyAgZm9yKGk9RklSU1RfQklHO2k8PUxBU1RfQklHO2krKykKKyAgICBlbWl0KGYsIlx0enBhZ2VcdCVzXG4iLG1yZWduYW1lc1tpXSk7CisKK30KK3ZvaWQgY2xlYW51cF9kYihGSUxFICpmKQoreworICBpZihmKSBzZWN0aW9uPS0xOworfQorCitzdGF0aWMgY2hhciAqem9wc1tdPXsKKyAgImFkYyIsImFuZCIsImFzbCIsImJpdCIsImVvciIsImxkYSIsIm9yYSIsCisgICJ0YXgiLCJ0eGEiLCJ0YXkiLCJ0eWEiLCJzYmMifTsKKworc3RhdGljIGludCBzZXRzemZsYWcoY2hhciAqb3ApCit7CisgIGludCBpOworICBmb3IoaT0wO2k8c2l6ZW9mKHpvcHMpL3NpemVvZih6b3BzWzBdKTtpKyspCisgICAgaWYoIXN0cmNtcChvcCx6b3BzW2ldKSkKKyAgICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKnp4b3BzW109eworICAidGF4IiwidHhhIiwibGR4IiwiaW54IiwiZGV4In07CisKK3N0YXRpYyBpbnQgc2V0c3p4ZmxhZyhjaGFyICpvcCkKK3sKKyAgaW50IGk7CisgIGZvcihpPTA7aTxzaXplb2YoenhvcHMpL3NpemVvZih6eG9wc1swXSk7aSsrKQorICAgIGlmKCFzdHJjbXAob3AsenhvcHNbaV0pKQorICAgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitlbnVtIHBlZXBmIHsgTkVFRFNBTUUgPSAxLCBSRU1PVkUxU1QgPSAyfTsKK3N0cnVjdCBwZWVwcyB7Y2hhciAqczEsKnMyLCpyO2VudW0gcGVlcGYgZmxhZ3M7fTsKKworCisKK2ludCBlbWl0X3BlZXBob2xlKHZvaWQpCit7CisgIGludCBlbnRyaWVzLGksajsKKyAgY2hhciAqYXNtbGluZVtFTUlUX0JVRl9ERVBUSF07CisgIGNoYXIgYnVmMVsxMDI0XSxidWYyWzEwMjRdOworICBjaGFyIG9wMVs4XSxvcDJbOF07CisgIHN0YXRpYyBjaGFyIGNhWzEwMjRdLGN4WzEwMjRdLGN5WzEwMjRdLGN6WzEwMjRdOworICBzdGF0aWMgaW50IHJtLGRpc2FibGVkOworCisgIGZwcmludGYoc3RkZXJyLCJDYWxsZWQgZW1pdF9wZWVwaG9sZSgpXG4iKTsKKyAgCisgIHN0YXRpYyBzdHJ1Y3QgcGVlcHMgZWxpbVtdPXsKKyAgICAibGRhIiwic3RhIiwwLE5FRURTQU1FLAorICAgICJsZHgiLCJzdHgiLDAsTkVFRFNBTUUsCisgICAgInN0YSIsInN0YSIsMCxORUVEU0FNRSwKKyAgICAic3R4Iiwic3R4IiwwLE5FRURTQU1FLAorICAgICJzdGEiLCJsZGEiLDAsTkVFRFNBTUUsCisgICAgInN0eCIsImxkeCIsMCxORUVEU0FNRSwKKyAgICAidHhhIiwidGF4IiwwLDAsCisgICAgInRheCIsInR4YSIsMCwwLAorICAgICJsZGEiLCJsZGEiLDAsUkVNT1ZFMVNULAorICAgICJsZHgiLCJsZHgiLDAsUkVNT1ZFMVNULAorICAgICJsZHkiLCJsZHkiLDAsUkVNT1ZFMVNULAorICAgICJsZHoiLCJsZHoiLDAsUkVNT1ZFMVNULAorICAgICJsZGEiLCJwbGEiLDAsUkVNT1ZFMVNULAorICAgICJsZGEiLCJ0eGEiLDAsUkVNT1ZFMVNULAorICAgICJsZGEiLCJ0eWEiLDAsUkVNT1ZFMVNULAorICAgICJsZHgiLCJ0YXgiLDAsUkVNT1ZFMVNULAorICAgICJsZHkiLCJ0YXkiLDAsUkVNT1ZFMVNULAorICAgICJ0YXkiLCJsZHkiLDAsUkVNT1ZFMVNULAorICAgICJ0YXoiLCJsZHoiLDAsUkVNT1ZFMVNULAorICAgICJ0YXgiLCJsZHgiLDAsUkVNT1ZFMVNULAorICAgICJ0eGEiLCJsZGEiLDAsUkVNT1ZFMVNULAorICAgICJ0eWEiLCJsZGEiLDAsUkVNT1ZFMVNULAorICAgICJ0emEiLCJsZGEiLDAsUkVNT1ZFMVNULAorICAgICJsZGEiLCJsZHgiLCJcdHRheFxuIixORUVEU0FNRSwKKyAgICAibGRhIiwibGR5IiwiXHR0YXlcbiIsTkVFRFNBTUUsCisgICAgImxkeCIsImxkYSIsIlx0dHhhXG4iLE5FRURTQU1FLAorICAgICJsZHkiLCJsZGEiLCJcdHR5YVxuIixORUVEU0FNRSwKKyAgICAic3RhIiwibGR4IiwiXHR0YXhcbiIsTkVFRFNBTUUsCisgICAgInN0YSIsImxkeSIsIlx0dGF5XG4iLE5FRURTQU1FLAorICAgICJzdHgiLCJsZGEiLCJcdHR4YVxuIixORUVEU0FNRSwKKyAgICAic3R5IiwibGRhIiwiXHR0eWFcbiIsTkVFRFNBTUUsCisKKyAgfTsKKworICBpZihub3BlZXApIHJldHVybiAwOworCisgIGk9ZW1pdF9sOworICBpZihlbWl0X2Y9PTApCisgICAgZW50cmllcz1pLWVtaXRfZisxOworICBlbHNlCisgICAgZW50cmllcz1FTUlUX0JVRl9ERVBUSDsKKyAgYXNtbGluZVswXT1lbWl0X2J1ZmZlcltpXTsKKworICBpZighc3RyY21wKGFzbWxpbmVbMF0sIjtzdGFydGlubGluZVxuIikpIGRpc2FibGVkPTE7CisgIGlmKCFzdHJjbXAoYXNtbGluZVswXSwiO2VuZGlubGluZVxuIikpIGRpc2FibGVkPTA7CisgIGlmKGRpc2FibGVkKSByZXR1cm4gMDsKKworICBidWYxWzBdPTA7b3AxWzBdPTA7CisgIGlmKChqPXNzY2FuZihhc21saW5lWzBdLCIgJTZzICU5OTlzIixvcDEsYnVmMSkpPj0xKXsKKyAgICBwcmludGYoImE9JXMgeD0lcyB5PSVzLCB6PSVzXG4iLGNhLGN4LGN5LGN6KTsKKyAgICBwcmludGYoIlx0XHQlcyAlc1xuIixvcDEsYnVmMSk7CisgICAgaWYoIXN0cmNtcChvcDEsInN0YSIpKSB7CisgICAgICAvLyBXb3JrIG91dCB3aGVuIHdlIGFyZSBhY2Nlc3NpbmcgdmFyaWFibGVzIG9uIHRoZSBzdGFjaworICAgICAgaWYgKCFzdHJjbXAoYnVmMSwiKHNwKSx5IikpIHsKKwkvLyBXZSBpbnZhbGlkYXRlIHRoaXMgd2hlbiBZIGNoYW5nZXMKKwlzbnByaW50ZihjYSwxMDI0LCIoc3ApLHkiLGN5KTsKKyAgICAgIH0gCisgICAgfSBlbHNlIGlmKCFzdHJjbXAob3AxLCJzdGEiKSl7CisgICAgICAvLyBSZW1vdmUgd3JpdGVzIHRvIHdoZXJldmVyIEEgd2FzIGxvYWRlZCBmcm9tCisgICAgICBpZiAoIXN0cmNtcChidWYxLGNhKSkgeworCXJlbW92ZV9hc20oKTsKKwlyZXR1cm4gcm09MTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYoIXN0cmNtcChvcDEsImxkYSIpKXsKKyAgICAgIGlmKGJ1ZjFbMF09PScjJyl7CisJaWYoIXJtJiYhc3RyY21wKGJ1ZjEsY2EpKXtyZW1vdmVfYXNtKCk7cmV0dXJuIHJtPTE7fQorCXN0cmNweShjYSxidWYxKTsKKyAgICAgIH1lbHNlIHsKKwkvLyBXb3JrIG91dCB3aGVuIHdlIGFyZSBhY2Nlc3NpbmcgdmFyaWFibGVzIG9uIHRoZSBzdGFjaworCWlmICghc3RyY21wKGJ1ZjEsIihzcCkseSIpKSB7CSAKKwkgIGlmKCFzdHJjbXAoYnVmMSxjYSkpeworCSAgICByZW1vdmVfYXNtKCk7CisJICAgIHJldHVybiBybT0xOworCSAgfQorCSAgc25wcmludGYoY2EsMTAyNCwiKHNwKSx5IixjeSk7CisJfQorCS8vIFNpbWlsYXJseSBsb29rIGZvciByZWdpc3RlciBsb2FkcworCS8vIFdlIGNhbiBzb21ldGltZXMgcmVtb3ZlIHNvbWUgb2YgdGhvc2UsIHRvby4KKwlpZiAoKHN0cmxlbihidWYxKT4xKSYmKGJ1ZjFbMF09PSdyJykpIHsKKwkgIGlmIChzdHJjbXAoY2EsYnVmMSkpIAorCSAgICBzbnByaW50ZihjYSwxMDI0LCIlcyIsYnVmMSk7CisJICBlbHNlIHsKKwkgICAgLy8gRG9uJ3QgcmUtbG9hZCBBIHdpdGggdGhlIHNhbWUgY29udGVudHMgaXQgYWxyZWFkeSBoYXMKKwkgICAgcmVtb3ZlX2FzbSgpOworCSAgICByZXR1cm4gcm09MTsKKwkgIH0KKwl9CisgICAgICB9CisgICAgfWVsc2UgaWYoIXN0cmNtcChvcDEsImxkeCIpKXsKKyAgICAgIGlmKGJ1ZjFbMF09PScjJyl7CisJaWYoIXJtJiYhc3RyY21wKGJ1ZjEsY3gpKXtyZW1vdmVfYXNtKCk7cmV0dXJuIHJtPTE7fQorCXN0cmNweShjeCxidWYxKTsKKyAgICAgIH1lbHNlIGN4WzBdPTA7CisgICAgfWVsc2UgaWYoIXN0cmNtcChvcDEsImxkeSIpKXsKKyAgICAgIGlmKGJ1ZjFbMF09PScjJyl7CisJaWYoIXJtJiYhc3RyY21wKGJ1ZjEsY3kpKXtyZW1vdmVfYXNtKCk7cmV0dXJuIHJtPTE7fQorCXN0cmNweShjeSxidWYxKTsKKyAgICAgIH1lbHNlIGN5WzBdPTA7CisgICAgfWVsc2UgaWYoIXN0cmNtcChvcDEsImxkeiIpKXsKKyAgICAgIGlmKGJ1ZjFbMF09PScjJyl7CisJaWYoIXJtJiYhc3RyY21wKGJ1ZjEsY3opKXtyZW1vdmVfYXNtKCk7cmV0dXJuIHJtPTE7fQorCXN0cmNweShjeixidWYxKTsKKyAgICAgIH1lbHNlIGN6WzBdPTA7CisgICAgfWVsc2V7CisgICAgICAvLyBUT0RPOiBQR1M6IEFkZCB0aGUgQVhZWiBvcGVyYXRpb25zIHRvIHRoZSBjbG9iYmVyIGxpc3RzLgorICAgICAgLy8gICAgICAgICAgICBXaWxsIHdlIG5lZWQgdG8gaGFuZGxlIHRoZW0gc3BlY2lhbGx5PworICAgICAgc3RhdGljIGNoYXIgY2xvYmJlcm5vbmVbXT0iY2xjIGNsZCBjbGkgY2x2IGNtcCBjcHggY3B5IGRlYyBpbmMgbm9wIHBoYSBwaHAgcGxwIHNlYyBzZWQgc2VpIHN0YSBzdHggc3R5IHN0eiI7CisgICAgICBzdGF0aWMgY2hhciBjbG9iYmVyYVtdPSJhZGMgYW5kIGFzbCBlb3IgbHNyIG9yYSBwbGEgcm9sIHJvciBzYmMgdHhhIHR5YSB0emEgbmVnIjsKKyAgICAgIHN0YXRpYyBjaGFyIGNsb2JiZXJ4W109ImRleCBpbnggdGF4IHRzeCI7CisgICAgICBzdGF0aWMgY2hhciBjbG9iYmVyeVtdPSJkZXkgaW55IHRheSI7CisgICAgICBzdGF0aWMgY2hhciBjbG9iYmVyeltdPSJkZXogaW56IHRheiI7CisgICAgICBpZihzdHJzdHIoY2xvYmJlcm5vbmUsb3AxKSl7CisJLy8gSW52YWxpZGF0ZSBBIGhvbGRpbmcgYSBzdGFjayB2YXJpYWJsZSBieXRlIGlmIFNQIGNoYW5nZXMKKwlpZiAoc3Ryc3RyKGJ1ZjEsInNwIikpIHsKKwkgIHByaW50ZigiYnVmMT0nJXMnXG4iLGJ1ZjEpOworCSAgaWYgKHN0cnN0cihjYSwiKHNwKSx5IikpIGNhWzBdPTA7CisJfQkKKyAgICAgIH1lbHNlIGlmKHN0cnN0cihjbG9iYmVyYSxvcDEpKQorCWNhWzBdPTA7CisgICAgICBlbHNlIGlmKHN0cnN0cihjbG9iYmVyeCxvcDEpKQorCWN4WzBdPTA7CisgICAgICBlbHNlIGlmKHN0cnN0cihjbG9iYmVyeSxvcDEpKSB7CisJY3lbMF09MDsKKwkvLyBJbnZhbGlkYXRlIEEgaG9sZGluZyBhIHN0YWNrIHZhcmlhYmxlIGJ5dGUgaWYgWSBjaGFuZ2VzCisJaWYgKHN0cnN0cihjYSwiKHNwKSx5IikpIGNhWzBdPTA7CisgICAgICB9CisgICAgICBlbHNlIGlmKHN0cnN0cihjbG9iYmVyeixvcDEpKQorCWN6WzBdPTA7CisgICAgICBlbHNlCisJY2FbMF09Y3hbMF09Y3lbMF09Y3pbMF09MDsKKyAgICB9CisgIH1lbHNleworICAgIGNhWzBdPWN4WzBdPWN5WzBdPWN6WzBdPTA7CisgIH0KKworICBybT0wOworCisgIGlmKHNzY2FuZihhc21saW5lWzBdLCIgJTZzICU5OTlzIixvcDEsYnVmMSk9PTImJiFzdHJjbXAob3AxLCJhbmQiKSYmIXN0cmNtcChidWYxLCIjMCIpKXsKKyAgICBzdHJjcHkoYXNtbGluZVswXSwiXHRsZGFcdCMwXG4iKTsKKyAgICByZXR1cm4gcm09MTsKKyAgfQorCisgIGlmKGVudHJpZXM+PTIpeworICAgIGktLTsKKyAgICBpZihpPDApIGk9RU1JVF9CVUZfREVQVEgtMTsKKyAgICBhc21saW5lWzFdPWVtaXRfYnVmZmVyW2ldOworCisKKyAgICBpZighc3RyY21wKGFzbWxpbmVbMF0sIjsgdm9sYXRpbGUgYmFycmllclxuIikmJiFzdHJjbXAoYXNtbGluZVswXSxhc21saW5lWzFdKSl7CisgICAgICByZW1vdmVfYXNtKCk7CisgICAgICByZXR1cm4gcm09MTsKKyAgICB9CisKKyAgICBpZihzc2NhbmYoYXNtbGluZVswXSwiICU2cyIsb3AxKT09MSYmIXN0cmNtcChvcDEsInJ0cyIpJiYKKyAgICAgICBzc2NhbmYoYXNtbGluZVsxXSwiICU2cyAlOTk5cyIsb3AyLGJ1ZjIpPT0yJiYhc3RyY21wKG9wMiwianNyIikpeworICAgICAgc3ByaW50Zihhc21saW5lWzFdLCJcdGptcFx0JXNcbiIsYnVmMik7CisgICAgICByZW1vdmVfYXNtKCk7CisgICAgICByZXR1cm4gcm09MTsKKyAgICB9CisKKyAgICBmb3Ioaj0wO2o8c2l6ZW9mKGVsaW0pL3NpemVvZihlbGltWzBdKTtqKyspeworICAgICAgaWYoZWxpbVtqXS5mbGFncyZORUVEU0FNRSl7CisJaWYoc3NjYW5mKGFzbWxpbmVbMF0sIiAlNnMgJTk5OXMiLG9wMixidWYyKT09MiYmCisJICAgc3NjYW5mKGFzbWxpbmVbMV0sIiAlNnMgJTk5OXMiLG9wMSxidWYxKT09MiYmCisJICAgIXN0cmNtcChvcDEsZWxpbVtqXS5zMSkmJiFzdHJjbXAob3AyLGVsaW1bal0uczIpJiYKKwkgICAhc3RyY21wKGJ1ZjEsYnVmMikpeworCSAgaWYoZWxpbVtqXS5yKXsKKwkgICAgc3RyY3B5KGFzbWxpbmVbMF0sZWxpbVtqXS5yKTsKKwkgIH1lbHNleworCSAgICBpZihlbGltW2pdLmZsYWdzJlJFTU9WRTFTVCkKKwkgICAgICBzdHJjcHkoYXNtbGluZVsxXSxhc21saW5lWzBdKTsKKwkgICAgcmVtb3ZlX2FzbSgpOworCSAgfQorCSAgcmV0dXJuIHJtPTE7CisJfQorICAgICAgfWVsc2V7CisJaWYoc3NjYW5mKGFzbWxpbmVbMV0sIiAlNnMiLG9wMSk9PTEmJgorCSAgIHNzY2FuZihhc21saW5lWzBdLCIgJTZzIixvcDIpPT0xJiYKKwkgICAhc3RyY21wKG9wMSxlbGltW2pdLnMxKSYmIXN0cmNtcChvcDIsZWxpbVtqXS5zMikpeworCSAgaWYoZWxpbVtqXS5mbGFncyZSRU1PVkUxU1QpCisJICAgIHN0cmNweShhc21saW5lWzFdLGFzbWxpbmVbMF0pOworCSAgcmVtb3ZlX2FzbSgpOworCSAgcmV0dXJuIHJtPTE7CisJfQorICAgICAgfQorICAgIH0KKworCisgIH0KKworICBpZihlbnRyaWVzPj0zKXsKKyAgICBpLS07CisgICAgaWYoaTwwKSBpPUVNSVRfQlVGX0RFUFRILTE7CisgICAgYXNtbGluZVsyXT1lbWl0X2J1ZmZlcltpXTsKKyAgICBpZihzc2NhbmYoYXNtbGluZVswXSwiICU2cyAlOTk5cyIsb3AxLGJ1ZjEpPT0yKXsKKyNpZiAwCisgICAgICBpZighc3RyY21wKG9wMSwibGRhIikmJmJ1ZjFbMF09PScjJyl7CisJaWYoc3NjYW5mKGFzbWxpbmVbMV0sIiAlNnMgJTk5OXMiLG9wMixidWYyKT09MiYmCisJICAgIXN0cmNtcChvcDIsInN0YSIpKXsKKwkgIGlmKHNzY2FuZihhc21saW5lWzJdLCIgJTZzICU5OTlzIixvcDIsYnVmMik9PTImJgorCSAgICAgIXN0cmNtcChvcDIsImxkYSIpJiYhc3RyY21wKGJ1ZjEsYnVmMikpeworCSAgICByZW1vdmVfYXNtKCk7CisJICAgIHJldHVybiBybT0xOworCSAgfQorCX0KKyAgICAgIH0KKyNlbmRpZgorICAgICAgaWYoIXN0cmNtcChvcDEsImJlcSIpfHwhc3RyY21wKG9wMSwiYm5lIikpeworCWlmKHNzY2FuZihhc21saW5lWzFdLCIgJTZzICU5OTlzIixvcDIsYnVmMik9PTImJgorCSAgICFzdHJjbXAob3AyLCJjbXAiKSYmIXN0cmNtcChidWYyLCIjMCIpKXsKKwkgIGlmKHNzY2FuZihhc21saW5lWzJdLCIgJTZzIixvcDIpPT0xJiYKKwkgICAgIHNldHN6ZmxhZyhvcDIpKXsKKwkgICAgc3RyY3B5KGFzbWxpbmVbMV0sYXNtbGluZVswXSk7CisJICAgIHJlbW92ZV9hc20oKTsKKwkgICAgcmV0dXJuIHJtPTE7CisJICB9CisJfQorICAgICAgfQorICAgICAgaWYoIXN0cmNtcChvcDEsImJlcSIpfHwhc3RyY21wKG9wMSwiYm5lIikpeworCWlmKHNzY2FuZihhc21saW5lWzFdLCIgJTZzICU5OTlzIixvcDIsYnVmMik9PTImJgorCSAgICFzdHJjbXAob3AyLCJjcHgiKSYmIXN0cmNtcChidWYyLCIjMCIpKXsKKwkgIGlmKHNzY2FuZihhc21saW5lWzJdLCIgJTZzIixvcDIpPT0xJiYKKwkgICAgIHNldHN6eGZsYWcob3AyKSl7CisJICAgIHN0cmNweShhc21saW5lWzFdLGFzbWxpbmVbMF0pOworCSAgICByZW1vdmVfYXNtKCk7CisJICAgIHJldHVybiBybT0xOworCSAgfQorCX0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIHJldHVybiAwOworfQorCisvKiBSZXR1cm4gbmFtZSBvZiBsaWJyYXJ5IGZ1bmN0aW9uLCBpZiB0aGlzIG5vZGUgc2hvdWxkIGJlCisgICBpbXBsZW1lbnRlZCB2aWEgbGliY2FsbC4gKi8KK2NoYXIgKnVzZV9saWJjYWxsKGludCBjLGludCB0LGludCB0MikKK3sKKyAgc3RhdGljIGNoYXIgZm5hbWVbMTZdOworICBjaGFyICpyZXQ9MDsKKworICBpZihjPT1DT01QQVJFKXsKKyAgICBpZigodCZOUSk9PUxMT05HfHwoSVNGTE9BVCh0KSYmIWllZWUpKXsKKyAgICAgIHNwcmludGYoZm5hbWUsIl9fY21wJXMlcyVsZCIsKHQmVU5TSUdORUQpPyJ1IjoicyIsSVNGTE9BVCh0KT8iZmx0IjoiaW50Iix6bTJsKHNpemV0YWJbdCZOUV0pKjgpOworICAgICAgcmV0PWZuYW1lOworICAgIH0KKyAgfWVsc2V7CisgICAgdCY9TlU7CisgICAgdDImPU5VOworICAgIGlmKElTU0hPUlQodCkmJmMhPU1VTFQmJmMhPURJViYmYyE9TU9EJiYhSVNGTE9BVCh0MikpCisgICAgICByZXR1cm4gMDsKKyAgICBpZihJU0xPTkcodCkmJmMhPU1VTFQmJmMhPURJViYmYyE9TU9EJiYhSVNGTE9BVCh0MikpCisgICAgICByZXR1cm4gMDsKKworICAgIGlmKCFpZWVlJiZJU0ZMT0FUKHQpKSB0PUZMT0FUOworICAgIGlmKHQ9PUxET1VCTEUpIHQ9RE9VQkxFOworICAgIGlmKHQyPT1MRE9VQkxFKSB0Mj1ET1VCTEU7CisgICAgaWYoIWllZWUmJklTRkxPQVQodDIpKSB0Mj1GTE9BVDsKKyAgICBpZihjPT1DT05WRVJUKXsKKyAgICAgIGlmKHQ9PXQyKSByZXR1cm4gMDsKKyAgICAgIGlmKHQ9PUZMT0FUJiZ0Mj09RE9VQkxFKSByZXR1cm4gIl9fZmx0NjR0b2ZsdDMyIjsKKyAgICAgIGlmKHQ9PURPVUJMRSYmdDI9PUZMT0FUKSByZXR1cm4gIl9fZmx0MzJ0b2ZsdDY0IjsKKworICAgICAgaWYoSVNGTE9BVCh0KSl7CisgICAgICAgIHNwcmludGYoZm5hbWUsIl9fJWNpbnQlbGR0b2ZsdCVkIiwodDImVU5TSUdORUQpPyd1Jzoncycsem0ybChzaXpldGFiW3QyJk5RXSkqOCwodD09RkxPQVQpPzMyOjY0KTsKKyAgICAgICAgcmV0PWZuYW1lOworICAgICAgfQorICAgICAgaWYoSVNGTE9BVCh0MikpeworICAgICAgICBzcHJpbnRmKGZuYW1lLCJfX2ZsdCVkdG8lY2ludCVsZCIsKCh0MiZOVSk9PUZMT0FUKT8zMjo2NCwodCZVTlNJR05FRCk/J3UnOidzJyx6bTJsKHNpemV0YWJbdCZOUV0pKjgpOworICAgICAgICByZXQ9Zm5hbWU7CisgICAgICB9CisgICAgfQorICAgIGlmKCh0Jk5RKT09SU5UfHwodCZOUSk9PUxPTkd8fCh0Jk5RKT09TExPTkd8fCghaWVlZSYmSVNGTE9BVCh0KSkpeworICAgICAgaWYoKGM+PUxTSElGVCYmYzw9TU9EKXx8KGM+PU9SJiZjPD1BTkQpfHxjPT1LT01QTEVNRU5UfHxjPT1NSU5VUyl7CisgICAgICAgIGlmKHQ9PShVTlNJR05FRHxMTE9ORykmJihjPT1NVUxUfHxjPT1ESVZ8fGM9PU1PRHx8Yz09UlNISUZUKSl7CisgICAgICAgICAgc3ByaW50ZihmbmFtZSwiX18lc3VpbnQ2NCIsZW5hbWVbY10pOworICAgICAgICAgIHJldD1mbmFtZTsKKyAgICAgICAgfWVsc2UgaWYoKHQmTlEpPT1MTE9ORyl7CisgICAgICAgICAgc3ByaW50ZihmbmFtZSwiX18lc2ludDY0IixlbmFtZVtjXSk7CisgICAgICAgICAgcmV0PWZuYW1lOworICAgICAgICB9ZWxzZSBpZih0PT0oVU5TSUdORUR8TE9ORykmJihjPT1ESVZ8fGM9PU1PRHx8Yz09UlNISUZUKSl7CisgICAgICAgICAgc3ByaW50ZihmbmFtZSwiX18lc3VpbnQzMiIsZW5hbWVbY10pOworICAgICAgICAgIHJldD1mbmFtZTsKKyAgICAgICAgfWVsc2UgaWYoKHQmTlEpPT1MT05HKXsKKyAgICAgICAgICBzcHJpbnRmKGZuYW1lLCJfXyVzaW50MzIiLGVuYW1lW2NdKTsKKyAgICAgICAgICByZXQ9Zm5hbWU7CisgICAgICAgIH1lbHNlIGlmKHQ9PShVTlNJR05FRHxJTlQpJiYoYz09RElWfHxjPT1NT0R8fGM9PVJTSElGVCkpeworICAgICAgICAgIHNwcmludGYoZm5hbWUsIl9fJXN1aW50MTYiLGVuYW1lW2NdKTsKKyAgICAgICAgICByZXQ9Zm5hbWU7CisgICAgICAgIH1lbHNlIGlmKCh0Jk5RKT09SU5UKXsKKyAgICAgICAgICBzcHJpbnRmKGZuYW1lLCJfXyVzaW50MTYiLGVuYW1lW2NdKTsKKyAgICAgICAgICByZXQ9Zm5hbWU7CisgICAgICAgIH1lbHNleworICAgICAgICAgIHNwcmludGYoZm5hbWUsIl9fJXMlcyVzJWxkIixlbmFtZVtjXSwodCZVTlNJR05FRCk/InUiOiIiLElTRkxPQVQodCk/ImZsdCI6ImludCIsem0ybChzaXpldGFiW3QmTlFdKSo4KTsKKyAgICAgICAgICByZXQ9Zm5hbWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisKK2ludCBwb2ludGVyX3ZhcmFkcihWYXIgKnYpCit7CisgIGludCBiPWJhbmsodik7CisgIGlmKGI+PTAmJmIhPWJhbmtjbnVtJiYhTk9CQU5LVkFSUyl7CisgICAgaWYoY3VyX2Z1bmN2JiZiYW5rKGN1cl9mdW5jdikhPWIpCisgICAgICByZXR1cm4gRlBPSU5URVI7CisgIH0KKyAgcmV0dXJuIHBvaW50ZXJfdHlwZSh2LT52dHlwKTsKK30KKworaW50IHBvaW50ZXJfdHlwZShzdHJ1Y3QgVHlwICpwKQoreworICBzdHJ1Y3QgVHlwICptZXJrPXA7CisgIGlmKCFwKSBpZXJyb3IoMCk7CisgIGlmKExBUkdFKSByZXR1cm4gRlBPSU5URVI7CisgIHdoaWxlKElTQVJSQVkocC0+ZmxhZ3MpfHxJU0ZVTkMocC0+ZmxhZ3MpKSBwPXAtPm5leHQ7CisgIGlmKHAtPmF0dHIpeworICAgIGNoYXIgKnM7CisgICAgaWYoc3Ryc3RyKHAtPmF0dHIsU1RSX0hVR0UpKSByZXR1cm4gSFBPSU5URVI7CisgICAgaWYoc3Ryc3RyKHAtPmF0dHIsU1RSX0ZBUikpIHJldHVybiBGUE9JTlRFUjsKKyAgICBpZihzdHJzdHIocC0+YXR0cixTVFJfTkVBUikpIHJldHVybiBQT0lOVEVSOworICB9CisgIHJldHVybiBQT0lOVEVSOworfQorCit1bnNpZ25lZCBjaGFyIGNibWNvbnYodW5zaWduZWQgY2hhciB4KQoreworICBzdGF0aWMgdW5zaWduZWQgY2hhciBjdGFiWzI1Nl09eworICAgIDB4MDAsMHgwMSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDE0LDB4MDksMHgwRCwweDExLDB4OTMsMHgwQSwweDBFLDB4MEYsCisgICAgMHgxMCwweDBCLDB4MTIsMHgxMywweDA4LDB4MTUsMHgxNiwweDE3LDB4MTgsMHgxOSwweDFBLDB4MUIsMHgxQywweDFELDB4MUUsMHgxRiwKKyAgICAweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDI5LDB4MkEsMHgyQiwweDJDLDB4MkQsMHgyRSwweDJGLAorICAgIDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LDB4MzYsMHgzNywweDM4LDB4MzksMHgzQSwweDNCLDB4M0MsMHgzRCwweDNFLDB4M0YsCisgICAgMHg0MCwweEMxLDB4QzIsMHhDMywweEM0LDB4QzUsMHhDNiwweEM3LDB4QzgsMHhDOSwweENBLDB4Q0IsMHhDQywweENELDB4Q0UsMHhDRiwKKyAgICAweEQwLDB4RDEsMHhEMiwweEQzLDB4RDQsMHhENSwweEQ2LDB4RDcsMHhEOCwweEQ5LDB4REEsMHg1QiwweEJGLDB4NUQsMHg1RSwweEE0LAorICAgIDB4QUQsMHg0MSwweDQyLDB4NDMsMHg0NCwweDQ1LDB4NDYsMHg0NywweDQ4LDB4NDksMHg0QSwweDRCLDB4NEMsMHg0RCwweDRFLDB4NEYsCisgICAgMHg1MCwweDUxLDB4NTIsMHg1MywweDU0LDB4NTUsMHg1NiwweDU3LDB4NTgsMHg1OSwweDVBLDB4QjMsMHhERCwweEFCLDB4QjEsMHhERiwKKyAgICAweDgwLDB4ODEsMHg4MiwweDgzLDB4ODQsMHg4NSwweDg2LDB4ODcsMHg4OCwweDg5LDB4OEEsMHg4QiwweDhDLDB4OEQsMHg4RSwweDhGLAorICAgIDB4OTAsMHg5MSwweDkyLDB4MEMsMHg5NCwweDk1LDB4OTYsMHg5NywweDk4LDB4OTksMHg5QSwweDlCLDB4OUMsMHg5RCwweDlFLDB4OUYsCisgICAgMHhBMCwweEExLDB4QTIsMHhBMywweDVGLDB4QTUsMHhBNiwweEE3LDB4QTgsMHhBOSwweEFBLDB4N0QsMHhBQywweDYwLDB4QUUsMHhBRiwKKyAgICAweEIwLDB4N0UsMHhCMiwweDdCLDB4QjQsMHhCNSwweEI2LDB4QjcsMHhCOCwweEI5LDB4QkEsMHhCQiwweEJDLDB4QkQsMHhCRSwweDVDLAorICAgIDB4NjAsMHg2MSwweDYyLDB4NjMsMHg2NCwweDY1LDB4NjYsMHg2NywweDY4LDB4NjksMHg2QSwweDZCLDB4NkMsMHg2RCwweDZFLDB4NkYsCisgICAgMHg3MCwweDcxLDB4NzIsMHg3MywweDc0LDB4NzUsMHg3NiwweDc3LDB4NzgsMHg3OSwweDdBLDB4N0IsMHhEQywweDdDLDB4REUsMHg3RiwKKyAgICAweEUwLDB4RTEsMHhFMiwweEUzLDB4RTQsMHhFNSwweEU2LDB4RTcsMHhFOCwweEU5LDB4RUEsMHhFQiwweEVDLDB4RUQsMHhFRSwweEVGLAorICAgIDB4RjAsMHhGMSwweEYyLDB4RjMsMHhGNCwweEY1LDB4RjYsMHhGNywweEY4LDB4RjksMHhGQSwweEZCLDB4RkMsMHhGRCwweEZFLDB4RkYKKyAgfTsKKworICBzdGF0aWMgdW5zaWduZWQgY2hhciBhdGFiW109ezB4ZmQsOCwweDdmLDB4OWIsMTEsMHg3ZH07CisKKyAgaWYoY2JtYXNjaWkpCisgICAgcmV0dXJuIGN0YWJbeCYyNTVdOworICBlbHNlIGlmKGF0YXNjaWkmJng+PTcmJng8PTEyKQorICAgIHJldHVybiBhdGFiW3gtN107CisgIGVsc2UKKyAgICByZXR1cm4geDsKK30KKwordm9pZCBpbnNlcnRfY29uc3QodW5pb24gYXR5cHMgKnAsaW50IHQpCisvKiAgVHJhZWd0IEtvbnN0YW50ZSBpbiBlbnRwcmVjaGVuZGVzIEZlbGQgZWluLiAgICAgICAqLworeworICBpZighcCkgaWVycm9yKDApOworLyogICpwID0gKHVuaW9uIGF0eXBzKSAwIDsgLyogcmZpOiBjbGVhciB1bnVzZWQgYml0cyAqLworICB0Jj1OVTsKKyAgaWYodD09Q0hBUikge3AtPnZjaGFyPXZjaGFyO3JldHVybjt9CisgIGlmKHQ9PVNIT1JUKSB7cC0+dnNob3J0PXZzaG9ydDtyZXR1cm47fQorICBpZih0PT1JTlQpIHtwLT52aW50PXZpbnQ7cmV0dXJuO30KKyAgaWYodD09TE9ORykge3AtPnZsb25nPXZsb25nO3JldHVybjt9CisgIGlmKHQ9PUxMT05HKSB7cC0+dmxsb25nPXZsbG9uZztyZXR1cm47fQorICBpZih0PT1NQVhJTlQpIHtwLT52bWF4PXZtYXg7cmV0dXJuO30KKyAgaWYodD09KFVOU0lHTkVEfENIQVIpKSB7cC0+dnVjaGFyPXZ1Y2hhcjtyZXR1cm47fQorICBpZih0PT0oVU5TSUdORUR8U0hPUlQpKSB7cC0+dnVzaG9ydD12dXNob3J0O3JldHVybjt9CisgIGlmKHQ9PShVTlNJR05FRHxJTlQpKSB7cC0+dnVpbnQ9dnVpbnQ7cmV0dXJuO30KKyAgaWYodD09KFVOU0lHTkVEfExPTkcpKSB7cC0+dnVsb25nPXZ1bG9uZztyZXR1cm47fQorICBpZih0PT0oVU5TSUdORUR8TExPTkcpKSB7cC0+dnVsbG9uZz12dWxsb25nO3JldHVybjt9CisgIGlmKHQ9PShVTlNJR05FRHxNQVhJTlQpKSB7cC0+dnVtYXg9dnVtYXg7cmV0dXJuO30KKyAgaWYodD09RkxPQVQpIHtwLT52ZmxvYXQ9dmZsb2F0O3JldHVybjt9CisgIGlmKHQ9PURPVUJMRSkge3AtPnZkb3VibGU9dmRvdWJsZTtyZXR1cm47fQorICBpZih0PT1MRE9VQkxFKSB7cC0+dmxkb3VibGU9dmxkb3VibGU7cmV0dXJuO30KKyAgaWYodD09UE9JTlRFUikge3AtPnZ1aW50PXZ1aW50O3JldHVybjt9CisgIGlmKHQ9PUZQT0lOVEVSfHx0PT1IUE9JTlRFUikge3AtPnZ1bG9uZz12dWxvbmc7cmV0dXJuO30KK30KKwordm9pZCBldmFsX2NvbnN0KHVuaW9uIGF0eXBzICpwLGludCB0KQorLyogIFdlaXN0IGJlc3RpbW10ZW4gZ2xvYmFsZW4gVmFyaWFibGVuIFdlcnQgZWluZXIgQ0VYUFIgenUuICAgICAgICovCit7CisgIGludCBmPXQmTlE7CisgIGlmKCFwKSBpZXJyb3IoMCk7CisgIGlmKGY9PU1BWElOVHx8KGY+PUNIQVImJmY8PUxMT05HKSl7CisgICAgaWYoISh0JlVOU0lHTkVEKSl7CisgICAgICBpZihmPT1DSEFSKSB2bWF4PXpjMnptKHAtPnZjaGFyKTsKKyAgICAgIGVsc2UgaWYoZj09U0hPUlQpdm1heD16czJ6bShwLT52c2hvcnQpOworICAgICAgZWxzZSBpZihmPT1JTlQpICB2bWF4PXppMnptKHAtPnZpbnQpOworICAgICAgZWxzZSBpZihmPT1MT05HKSB2bWF4PXpsMnptKHAtPnZsb25nKTsKKyAgICAgIGVsc2UgaWYoZj09TExPTkcpIHZtYXg9emxsMnptKHAtPnZsbG9uZyk7CisgICAgICBlbHNlIGlmKGY9PU1BWElOVCkgdm1heD1wLT52bWF4OworICAgICAgZWxzZSBpZXJyb3IoMCk7CisgICAgICB2dW1heD16bTJ6dW0odm1heCk7CisgICAgICB2bGRvdWJsZT16bTJ6bGQodm1heCk7CisgICAgfWVsc2V7CisgICAgICBpZihmPT1DSEFSKSB2dW1heD16dWMyenVtKHAtPnZ1Y2hhcik7CisgICAgICBlbHNlIGlmKGY9PVNIT1JUKXZ1bWF4PXp1czJ6dW0ocC0+dnVzaG9ydCk7CisgICAgICBlbHNlIGlmKGY9PUlOVCkgIHZ1bWF4PXp1aTJ6dW0ocC0+dnVpbnQpOworICAgICAgZWxzZSBpZihmPT1MT05HKSB2dW1heD16dWwyenVtKHAtPnZ1bG9uZyk7CisgICAgICBlbHNlIGlmKGY9PUxMT05HKSB2dW1heD16dWxsMnp1bShwLT52dWxsb25nKTsKKyAgICAgIGVsc2UgaWYoZj09TUFYSU5UKSB2dW1heD1wLT52dW1heDsKKyAgICAgIGVsc2UgaWVycm9yKDApOworICAgICAgdm1heD16dW0yem0odnVtYXgpOworICAgICAgdmxkb3VibGU9enVtMnpsZCh2dW1heCk7CisgICAgfQorICB9ZWxzZXsKKyAgICBpZihJU1BPSU5URVIoZikpeworICAgICAgaWYoZj09UE9JTlRFUikKKwl2dW1heD16dWkyenVtKHAtPnZ1aW50KTsKKyAgICAgIGVsc2UKKwl2dW1heD16dWwyenVtKHAtPnZ1bG9uZyk7CisgICAgICB2bWF4PXp1bTJ6bSh2dW1heCk7dmxkb3VibGU9enVtMnpsZCh2dW1heCk7CisgICAgfWVsc2V7CisgICAgICBpZihmPT1GTE9BVCkgdmxkb3VibGU9emYyemxkKHAtPnZmbG9hdCk7CisgICAgICBlbHNlIGlmKGY9PURPVUJMRSkgdmxkb3VibGU9emQyemxkKHAtPnZkb3VibGUpOworICAgICAgZWxzZSB2bGRvdWJsZT1wLT52bGRvdWJsZTsKKyAgICAgIHZtYXg9emxkMnptKHZsZG91YmxlKTsKKyAgICAgIHZ1bWF4PXpsZDJ6dW0odmxkb3VibGUpOworICAgIH0KKyAgfQorICB2ZmxvYXQ9emxkMnpmKHZsZG91YmxlKTsKKyAgdmRvdWJsZT16bGQyemQodmxkb3VibGUpOworICB2dWNoYXI9enVtMnp1Yyh2dW1heCk7CisgIHZ1c2hvcnQ9enVtMnp1cyh2dW1heCk7CisgIHZ1aW50PXp1bTJ6dWkodnVtYXgpOworICB2dWxvbmc9enVtMnp1bCh2dW1heCk7CisgIHZ1bGxvbmc9enVtMnp1bGwodnVtYXgpOworICB2Y2hhcj16bTJ6Yyh2bWF4KTsKKyAgdnNob3J0PXptMnpzKHZtYXgpOworICB2aW50PXptMnppKHZtYXgpOworICB2bG9uZz16bTJ6bCh2bWF4KTsKKyAgdmxsb25nPXptMnpsbCh2bWF4KTsKK30KKwordm9pZCBwcmludHZhbChGSUxFICpmLHVuaW9uIGF0eXBzICpwLGludCB0KQorLyogIEdpYnQgYXR5cHMgYXVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICB0Jj1OVTsKKyAgaWYodD09Q0hBUil7ZnByaW50ZihmLCJDIik7dm1heD16YzJ6bShwLT52Y2hhcik7cHJpbnR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfENIQVIpKXtmcHJpbnRmKGYsIlVDIik7dnVtYXg9enVjMnp1bShwLT52dWNoYXIpO3ByaW50enVtKGYsdnVtYXgpO30KKyAgaWYodD09U0hPUlQpe2ZwcmludGYoZiwiUyIpO3ZtYXg9enMyem0ocC0+dnNob3J0KTtwcmludHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8U0hPUlQpKXtmcHJpbnRmKGYsIlVTIik7dnVtYXg9enVzMnp1bShwLT52dXNob3J0KTtwcmludHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUZMT0FUKXtmcHJpbnRmKGYsIkYiKTt2bGRvdWJsZT16ZjJ6bGQocC0+dmZsb2F0KTtwcmludHpsZChmLHZsZG91YmxlKTt9CisgIGlmKHQ9PURPVUJMRSl7ZnByaW50ZihmLCJEIik7dmxkb3VibGU9emQyemxkKHAtPnZkb3VibGUpO3ByaW50emxkKGYsdmxkb3VibGUpO30KKyAgaWYodD09TERPVUJMRSl7ZnByaW50ZihmLCJMRCIpO3ByaW50emxkKGYscC0+dmxkb3VibGUpO30KKyAgaWYodD09SU5UKXtmcHJpbnRmKGYsIkkiKTt2bWF4PXppMnptKHAtPnZpbnQpO3ByaW50em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxJTlQpfHx0PT1QT0lOVEVSKXtmcHJpbnRmKGYsIlVJIik7dnVtYXg9enVpMnp1bShwLT52dWludCk7cHJpbnR6dW0oZix2dW1heCk7fQorICBpZih0PT1MT05HKXtmcHJpbnRmKGYsIkwiKTt2bWF4PXpsMnptKHAtPnZsb25nKTtwcmludHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8TE9ORyl8fHQ9PUZQT0lOVEVSfHx0PT1IUE9JTlRFUil7ZnByaW50ZihmLCJVTCIpO3Z1bWF4PXp1bDJ6dW0ocC0+dnVsb25nKTtwcmludHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUxMT05HKXtmcHJpbnRmKGYsIkxMIik7dm1heD16bGwyem0ocC0+dmxsb25nKTtwcmludHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8TExPTkcpKXtmcHJpbnRmKGYsIlVMTCIpO3Z1bWF4PXp1bGwyenVtKHAtPnZ1bGxvbmcpO3ByaW50enVtKGYsdnVtYXgpO30KKyAgaWYodD09TUFYSU5UKSBwcmludHptKGYscC0+dm1heCk7CisgIGlmKHQ9PShVTlNJR05FRHxNQVhJTlQpKSBwcmludHp1bShmLHAtPnZ1bWF4KTsKK30KKwordm9pZCBlbWl0dmFsKEZJTEUgKmYsdW5pb24gYXR5cHMgKnAsaW50IHQpCisvKiAgR2lidCBhdHlwcyBhdXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIHQmPU5VOworICBpZih0PT1DSEFSKXt2bWF4PXpjMnptKHAtPnZjaGFyKTtlbWl0em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxDSEFSKSl7dnVtYXg9enVjMnp1bShwLT52dWNoYXIpO2VtaXR6dW0oZix2dW1heCk7fQorICBpZih0PT1TSE9SVCl7dm1heD16czJ6bShwLT52c2hvcnQpO2VtaXR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfFNIT1JUKSl7dnVtYXg9enVzMnp1bShwLT52dXNob3J0KTtlbWl0enVtKGYsdnVtYXgpO30KKyAgaWYodD09RkxPQVQpe3ZsZG91YmxlPXpmMnpsZChwLT52ZmxvYXQpO2VtaXR6bGQoZix2bGRvdWJsZSk7fQorICBpZih0PT1ET1VCTEUpe3ZsZG91YmxlPXpkMnpsZChwLT52ZG91YmxlKTtlbWl0emxkKGYsdmxkb3VibGUpO30KKyAgaWYodD09TERPVUJMRSl7ZW1pdHpsZChmLHAtPnZsZG91YmxlKTt9CisgIGlmKHQ9PUlOVCl7dm1heD16aTJ6bShwLT52aW50KTtlbWl0em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxJTlQpfHx0PT1QT0lOVEVSKXt2dW1heD16dWkyenVtKHAtPnZ1aW50KTtlbWl0enVtKGYsdnVtYXgpO30KKyAgaWYodD09TE9ORyl7dm1heD16bDJ6bShwLT52bG9uZyk7ZW1pdHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8TE9ORyl8fHQ9PUZQT0lOVEVSfHx0PT1IUE9JTlRFUil7dnVtYXg9enVsMnp1bShwLT52dWxvbmcpO2VtaXR6dW0oZix2dW1heCk7fQorICBpZih0PT1MTE9ORyl7dm1heD16bGwyem0ocC0+dmxsb25nKTtlbWl0em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxMTE9ORykpe3Z1bWF4PXp1bGwyenVtKHAtPnZ1bGxvbmcpO2VtaXR6dW0oZix2dW1heCk7fQorICBpZih0PT1NQVhJTlQpIGVtaXR6bShmLHAtPnZtYXgpOworICBpZih0PT0oVU5TSUdORUR8TUFYSU5UKSkgZW1pdHp1bShmLHAtPnZ1bWF4KTsKK30KKwordm9pZCBjb252X3R5cChzdHJ1Y3QgVHlwICpwKQorLyogRXJ6ZXVndCBleHRlbmRlZCB0eXBlcyBpbiBlaW5lbSBUeXAuICovCit7CisgIGNoYXIgKmF0dHI7CisgIHdoaWxlKHApeworICAgIGlmKElTUE9JTlRFUihwLT5mbGFncykpeworICAgICAgcC0+ZmxhZ3M9KChwLT5mbGFncyZ+TlUpfFBPSU5URVJfVFlQRShwLT5uZXh0KSk7CisgICAgICBpZihhdHRyPXAtPm5leHQtPmF0dHIpeworICAgICAgICBpZihzdHJzdHIoYXR0cixTVFJfTkVBUikpCisgICAgICAgICAgcC0+ZmxhZ3M9KChwLT5mbGFncyZ+TlUpfFBPSU5URVIpOworICAgICAgICBpZihzdHJzdHIoYXR0cixTVFJfRkFSKSkKKyAgICAgICAgICBwLT5mbGFncz0oKHAtPmZsYWdzJn5OVSl8RlBPSU5URVIpOworICAgICAgICBpZihzdHJzdHIoYXR0cixTVFJfSFVHRSkpCisgICAgICAgICAgcC0+ZmxhZ3M9KChwLT5mbGFncyZ+TlUpfEhQT0lOVEVSKTsKKyAgICAgIH0KKyAgICB9CisgICAgcD1wLT5uZXh0OworICB9Cit9CisKK3ZvaWQgYWRkX3Zhcl9ob29rX3Bvc3QoVmFyICp2KQoreworICBpZih1c2Vfc2VjJiYodi0+c3RvcmFnZV9jbGFzcz09U1RBVElDfHx2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pKXsKKyAgICBjaGFyIGJ1ZltTRUNMRU4rMzJdOworICAgIHNwcmludGYoYnVmLCJzZWN0aW9uKFwiJXNcIik7Iix1c2Vfc2VjKTsKKyAgICBhZGRfYXR0cigmdi0+dmF0dHIsYnVmKTsKKyAgfQorICBpZih1c2VfYmFuaz49MCYmKHYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQ3x8di0+c3RvcmFnZV9jbGFzcz09RVhURVJOKSl7CisgICAgY2hhciBidWZbNjRdOworICAgIC8qc3ByaW50ZihidWYsInNlY3Rpb24oXCJiYW5rJWRcIik7YmFuayglZCkiLHVzZV9iYW5rLHVzZV9iYW5rKTsqLworICAgIHNwcmludGYoYnVmLCJiYW5rKCVkKSIsdXNlX2JhbmspOworICAgIGFkZF9hdHRyKCZ2LT52YXR0cixidWYpOworICB9Cit9CisKK2ludCBkZWNpZGVfcmV2ZXJzZSh6bWF4IHYpCit7CisgIGlmKHptZXF0byh2LFoxKXx8em1lcXRvKHYsbDJ6bSgyTCkpKQorICAgIHJldHVybiAxOworICBpZihvcHRzcGVlZCkKKyAgICBpZih6bWVxdG8odixsMnptKDRMKSl8fHptZXF0byh2LGwyem0oOEwpKXx8em1lcXRvKHYsbDJ6bSgyNTZMKSl8fHptZXF0byh2LGwyem0oNTEyTCkpKQorICAgICAgcmV0dXJuIDE7CisgIAorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19zaW5nbGVfZWZmX2ljKHN0cnVjdCBJQyAqcCkKK3sKKyAgc3RydWN0IFZhciAqdiwqaWR4OworICBpZihwLT5jb2RlIT1BRERJMlB8fChwLT50eXBmMiZOUSkhPVBPSU5URVIpCisgICAgcmV0dXJuIDA7CisgIGlmKCEocC0+cTIuZmxhZ3MmS09OU1QpKXsKKyAgICBpZigocC0+dHlwZiZOVSkhPShVTlNJR05FRHxDSEFSKSkKKyAgICAgIHJldHVybiAwOworICAgIGlmKChwLT5xMi5mbGFncyYoVkFSfERSRUZPQkopKSE9VkFSKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYocC0+cTIudi0+c3RvcmFnZV9jbGFzcyE9QVVUTyYmcC0+cTIudi0+c3RvcmFnZV9jbGFzcyE9UkVHSVNURVIpCisgICAgICByZXR1cm4gMDsKKyAgICBpZHg9cC0+cTIudjsKKyAgfWVsc2V7CisgICAgaWR4PTA7CisgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHAtPnR5cGYpOworICAgIC8qIFRPRE86IG1vcmUgcHJlY2lzZSBjaGVjayBjb25zaWRlcmluZyBkYXRhIHR5cGUgdXNlZnVsPyAqLworICAgIGlmKCF6bWxlcSh2dW1heCxsMnptKDI1NUwpKSkKKyAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOworICB9CisgIGlmKHAtPnExLmZsYWdzJkRSRUZPQkopCisgICAgcmV0dXJuIDA7CisgIGlmKChwLT56LmZsYWdzJihWQVJ8RFJFRk9CSikpIT1WQVIpCisgICAgcmV0dXJuIDA7CisgIGlmKHAtPnoudi0+c3RvcmFnZV9jbGFzcz09U1RBVElDfHxwLT56LnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTikKKyAgICByZXR1cm4gMDsKKyAgdj1wLT56LnY7CisgIGZvcihwPXAtPm5leHQ7cDtwPXAtPm5leHQpeworICAgIGludCBjPXAtPmNvZGU7CisgICAgaWYoYz09TEFCRUx8fChjPj1CRVEmJmM8PUJSQSkpCisgICAgICByZXR1cm4gMTsgLyogVE9ETzogaG93IGVsYWJvcmF0ZSBzaG91bGQgd2UgdGVzdD8gKi8KKyAgICBpZigocC0+cTEuZmxhZ3MmVkFSKSYmcC0+cTEudj09dil7CisgICAgICBpZihwLT5xMS5mbGFncyZEUkVGT0JKKQorICAgICAgICByZXR1cm4gMTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmKChwLT5xMi5mbGFncyZWQVIpJiZwLT5xMi52PT12KXsKKyAgICAgIGlmKHAtPnEyLmZsYWdzJkRSRUZPQkopCisgICAgICAgIHJldHVybiAxOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYoKHAtPnouZmxhZ3MmVkFSKSYmcC0+ei52PT12KXsKKyAgICAgIGlmKHAtPnouZmxhZ3MmRFJFRk9CSikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZigocC0+ei5mbGFncyZWQVIpJiZwLT56LnY9PWlkeCkKKyAgICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAwOworfQorCit2b2lkIG1hcmtfZWZmX2ljcyh2b2lkKQoreworICBzdHJ1Y3QgSUMgKnA7CisgIGZvcihwPWZpcnN0X2ljO3A7cD1wLT5uZXh0KXsKKyAgICBpZihpc19zaW5nbGVfZWZmX2ljKHApKQorICAgICAgcC0+ZmxhZ3N8PUVGRl9JQzsKKyAgICBlbHNlCisgICAgICBwLT5mbGFncyY9fkVGRl9JQzsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvbTY1L21hY2hpbmUuZHQgYi9tYWNoaW5lcy9tNjUvbWFjaGluZS5kdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYWIzOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvbTY1L21hY2hpbmUuZHQKQEAgLTAsMCArMSwxNiBAQAorUzhCUworUzhCVQorUzE2QlNMRSBTMTZCU0JFCitTMTZCVUxFIFMxNkJVQkUKK1MxNkJTTEUgUzE2QlNCRQorUzE2QlVMRSBTMTZCVUJFCitTMzJCU0xFIFMzMkJTQkUKK1MzMkJVTEUgUzMyQlVCRQorUzY0QlNMRSBTNjRCU0JFCitTNjRCVUxFIFM2NEJVQkUKK1MzMkJJRUVFTEUKK1M2NEJJRUVFTEUKK1M2NEJJRUVFTEUKK1MxNkJVTEUgUzE2QlVCRQorCisKZGlmZiAtLWdpdCBhL21hY2hpbmVzL202NS9tYWNoaW5lLmggYi9tYWNoaW5lcy9tNjUvbWFjaGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNhNTRmZjkKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9tNjUvbWFjaGluZS5oCkBAIC0wLDAgKzEsMjY5IEBACisvKiAgTUVHQTY1IC8gNDVHUzAyIGJhY2tlbmQgZm9yIHZiY2MKKyAgICAoYykgVm9sa2VyIEJhcnRoZWxtYW5uIDIwMjAKKyAgICAoYykgUGF1bCBHYXJkbmVyLVN0ZXBoZW4gMjAyMAorCisqLworCisvKiBidWlsdC10aW1lIGNvbmZpZ3VyYWJsZSBvcHRpb25zOiAqLworI2RlZmluZSBOVU1fR1BSUyAzMgorI2RlZmluZSBOVU1fUEFJUlMgKE5VTV9HUFJTLzIpCisjZGVmaW5lIE5VTV9CSUcgNAorI2RlZmluZSBOVU1fQklHUCAoTlVNX0JJRy8yKQorI2RlZmluZSBGSVhFRF9TUCAxCisKKyNpbmNsdWRlICJkdC5oIgorCisjdW5kZWYgQ0hBUgorI3VuZGVmIFNIT1JUCisjdW5kZWYgSU5UCisjdW5kZWYgTE9ORworI3VuZGVmIExMT05HCisjdW5kZWYgRkxPQVQKKyN1bmRlZiBET1VCTEUKKyN1bmRlZiBMRE9VQkxFCisjdW5kZWYgVk9JRAorI3VuZGVmIFBPSU5URVIKKyN1bmRlZiBBUlJBWQorI3VuZGVmIFNUUlVDVAorI3VuZGVmIFVOSU9OCisjdW5kZWYgRU5VTQorI3VuZGVmIEZVTktUCisjdW5kZWYgQk9PTAorI3VuZGVmIE1BWElOVAorI3VuZGVmIE1BWF9UWVBFCisKKyNkZWZpbmUgQ0hBUiAxCisjZGVmaW5lIFNIT1JUIDIKKyNkZWZpbmUgSU5UIDMKKyNkZWZpbmUgTE9ORyA0CisjZGVmaW5lIExMT05HIDUKKyNkZWZpbmUgRkxPQVQgNgorI2RlZmluZSBET1VCTEUgNworI2RlZmluZSBMRE9VQkxFIDgKKyNkZWZpbmUgVk9JRCA5CisjZGVmaW5lIFBPSU5URVIgMTAKKyNkZWZpbmUgRlBPSU5URVIgMTEKKyNkZWZpbmUgSFBPSU5URVIgMTIKKyNkZWZpbmUgQVJSQVkgMTMKKyNkZWZpbmUgU1RSVUNUIDE0CisjZGVmaW5lIFVOSU9OIDE1CisjZGVmaW5lIEVOVU0gMTYKKyNkZWZpbmUgRlVOS1QgMTcKKyNkZWZpbmUgQk9PTCAxOAorCisjZGVmaW5lIE1BWElOVCAxOQorCisjZGVmaW5lIE1BWF9UWVBFIE1BWElOVAorCisKKyNkZWZpbmUgUE9JTlRFUl9UWVBFKHgpIHBvaW50ZXJfdHlwZSh4KQorI2RlZmluZSBQT0lOVEVSX1ZBUkFEUih4KSBwb2ludGVyX3ZhcmFkcih4KQorZXh0ZXJuIGludCBwb2ludGVyX3R5cGUoKTsKK2V4dGVybiBpbnQgcG9pbnRlcl92YXJhZHIoKTsKKyNkZWZpbmUgSVNQT0lOVEVSKHgpICgoeCZOUSk+PVBPSU5URVImJih4Jk5RKTw9SFBPSU5URVIpCisjZGVmaW5lIElTU0NBTEFSKHgpICgoeCZOUSk+PUNIQVImJih4Jk5RKTw9SFBPSU5URVIpCisjZGVmaW5lIElTSU5UKHgpICgoeCZOUSk+PUNIQVImJih4Jk5RKTw9TExPTkcpCisjZGVmaW5lIFBUUkRJRkZfVCh4KSAoKHgpPT1IUE9JTlRFUj9MT05HOklOVCkKKwordHlwZWRlZiB6bGxvbmcgem1heDsKK3R5cGVkZWYgenVsbG9uZyB6dW1heDsKKwordW5pb24gYXR5cHN7CisgIHpjaGFyIHZjaGFyOworICB6dWNoYXIgdnVjaGFyOworICB6c2hvcnQgdnNob3J0OworICB6dXNob3J0IHZ1c2hvcnQ7CisgIHppbnQgdmludDsKKyAgenVpbnQgdnVpbnQ7CisgIHpsb25nIHZsb25nOworICB6dWxvbmcgdnVsb25nOworICB6bGxvbmcgdmxsb25nOworICB6dWxsb25nIHZ1bGxvbmc7CisgIHptYXggdm1heDsKKyAgenVtYXggdnVtYXg7CisgIHpmbG9hdCB2ZmxvYXQ7CisgIHpkb3VibGUgdmRvdWJsZTsKKyAgemxkb3VibGUgdmxkb3VibGU7Cit9OworCisKKy8qIGludGVybmFsbHkgdXNlZCBieSB0aGUgYmFja2VuZCAqLworI2RlZmluZSBGSVJTVF9HUFIgMTAKKyNkZWZpbmUgTEFTVF9HUFIgKEZJUlNUX0dQUitOVU1fR1BSUy0xKQorI2RlZmluZSBGSVJTVF9QQUlSIChMQVNUX0dQUisxKQorI2RlZmluZSBMQVNUX1BBSVIgKEZJUlNUX1BBSVIrTlVNX1BBSVJTLTEpCisjZGVmaW5lIEZJUlNUX0JJRyAoTEFTVF9QQUlSKzEpCisjZGVmaW5lIExBU1RfQklHIChGSVJTVF9CSUcrTlVNX0JJRy0xKQorI2RlZmluZSBGSVJTVF9CSUdQIChMQVNUX0JJRysxKQorI2RlZmluZSBMQVNUX0JJR1AgKEZJUlNUX0JJR1ArTlVNX0JJR1AtMSkKKworLyogIFRoaXMgc3RydWN0IGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBtYWNoaW5lLXNwZWNpZmljICAgICAgICAgICAqLworLyogIGFkZHJlc3NpbmctbW9kZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEN1cnJlbnRseSBwb3NzaWJsZSBhcmUgKGNvbnN0LGdwcikgYW5kIChncHIsZ3ByKSAgICAgICAgICAgICAgICAqLworc3RydWN0IEFkZHJlc3NpbmdNb2RleworICBpbnQgZmxhZ3M7CisgIGludCBiYXNlOworICBpbnQgaWR4OworICBsb25nIG9mZnNldDsKKyAgdm9pZCAqdjsKK307CisKKy8qICBUaGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUuICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFYUiBMQVNUX0JJR1AKKworLyogIE51bWJlciBvZiBjb21tYW5kbGluZS1vcHRpb25zIHRoZSBjb2RlLWdlbmVyYXRvciBhY2NlcHRzLiAgICAgICAqLworI2RlZmluZSBNQVhHRiAyMAorCisvKiAgSWYgdGhpcyBpcyBzZXQgdG8gemVybyB2YmNjIHdpbGwgbm90IGdlbmVyYXRlIElDcyB3aGVyZSB0aGUgICAgICovCisvKiAgdGFyZ2V0IG9wZXJhbmQgaXMgdGhlIHNhbWUgYXMgdGhlIDJuZCBzb3VyY2Ugb3BlcmFuZC4gICAgICAgICAgICovCisvKiAgVGhpcyBjYW4gc29tZXRpbWVzIHNpbXBsaWZ5IHRoZSBjb2RlLWdlbmVyYXRvciwgYnV0IHVzdWFsbHkgICAgICovCisvKiAgdGhlIGNvZGUgaXMgYmV0dGVyIGlmIHRoZSBjb2RlLWdlbmVyYXRvciBhbGxvd3MgaXQuICAgICAgICAgICAgICovCisjZGVmaW5lIFVTRVEyQVNaIDEKKworLyogIFRoaXMgc3BlY2lmaWVzIHRoZSBzbWFsbGVzdCBpbnRlZ2VyIHR5cGUgdGhhdCBjYW4gYmUgYWRkZWQgdG8gYSAqLworLyogIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNSU5BRERJMlAgQ0hBUgorCisvKiAgSWYgdGhlIGJ5dGVzIG9mIGFuIGludGVnZXIgYXJlIG9yZGVyZWQgbW9zdCBzaWduaWZpY2FudCBieXRlICAgICovCisvKiAgYnl0ZSBmaXJzdCBhbmQgdGhlbiBkZWNyZWFzaW5nIHNldCBCSUdFTkRJQU4gdG8gMS4gICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR0VORElBTiAwCisKKy8qICBJZiB0aGUgYnl0ZXMgb2YgYW4gaW50ZWdlciBhcmUgb3JkZXJlZCBsZXN0IHNpZ25pZmljYW50IGJ5dGUgICAgKi8KKy8qICBieXRlIGZpcnN0IGFuZCB0aGVuIGluY3JlYXNpbmcgc2V0IExJVFRMRUVORElBTiB0byAxLiAgICAgICAgICAgKi8KKyNkZWZpbmUgTElUVExFRU5ESUFOIDEKKworLyogIE5vdGUgdGhhdCBCSUdFTkRJQU4gYW5kIExJVFRMRUVORElBTiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAgICAqLworCisvKiAgSWYgc3dpdGNoLXN0YXRlbWVudHMgc2hvdWxkIGJlIGdlbmVyYXRlZCBhcyBhIHNlcXVlbmNlIG9mICAgICAgICovCisvKiAgU1VCLFRTVCxCRVEgSUNzIHJhdGhlciB0aGFuIENPTVBBUkUsQkVRIElDcyBzZXQgdGhpcyB0byAxLiAgICAgICovCisvKiAgVGhpcyBjYW4geWllbGQgYmV0dGVyIGNvZGUgb24gc29tZSBtYWNoaW5lcy4gICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNXSVRDSFNVQlMgMAorCisvKiAgSW4gb3B0aW1pemluZyBjb21waWxhdGlvbiBjZXJ0YWluIGxpYnJhcnkgbWVtY3B5L3N0cmNweS1jYWxscyAgICovCisvKiAgd2l0aCBsZW5ndGgga25vd24gYXQgY29tcGlsZS10aW1lIHdpbGwgYmUgaW5saW5lZCB1c2luZyBhbiAgICAgICovCisvKiAgQVNTSUdOLUlDIGlmIHRoZSBzaXplIGlzIGxlc3Mgb3IgZXF1YWwgdG8gSU5MSU5FTUVNQ1BZLiAgICAgICAgICovCisvKiAgVGhlIHR5cGUgdXNlZCBmb3IgdGhlIEFTU0lHTi1JQyB3aWxsIGJlIFVOU0lHTkVEfENIQVIuICAgICAgICAgICovCisjZGVmaW5lIElOTElORU1FTUNQWSAxMDI0CisKKy8qICBQYXJhbWV0ZXJzIGFyZSBzb21ldGltZXMgcGFzc2VkIGluIHJlZ2lzdGVycyB3aXRob3V0IF9fcmVnLiAgICAgKi8KKyNkZWZpbmUgSEFWRV9SRUdQQVJNUyAxCisKKy8qICBQYXJhbWV0ZXJzIG9uIHRoZSBzdGFjayBzaG91bGQgYmUgcHVzaGVkIGluIG9yZGVyIHJhdGhlciB0aGFuICAgKi8KKy8qICBpbiByZXZlcnNlIG9yZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT1JERVJFRF9QVVNIIEZJWEVEX1NQCisKKy8qICBTdHJ1Y3R1cmUgZm9yIHJlZ19wYXJtKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0cnVjdCByZWdfaGFuZGxleworICBpbnQgcmVnczsKKyAgaW50IGJyZWdzOworfTsKKworLyogIFdlIGhhdmUgc29tZSB0YXJnZXQtc3BlY2lmaWMgdmFyaWFibGUgYXR0cmlidXRlcy4gICAgICAgICAgICAgICAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9BVFRSSUJVVEVTCisKKy8qIFdlIGhhdmUgdGFyZ2V0LXNwZWNpZmljIHByYWdtYXMgKi8KKyNkZWZpbmUgSEFWRV9UQVJHRVRfUFJBR01BUworCisvKiAgV2Uga2VlcCB0cmFjayBvZiBhbGwgcmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IGEgZnVuY3Rpb24uICAgICAgICAgICovCisjZGVmaW5lIEhBVkVfUkVHU19NT0RJRklFRCAxCisKKy8qIFdlIGhhdmUgYSBpbXBsZW1lbnQgb3VyIG93biBjb3N0LWZ1bmN0aW9ucyB0byBhZGFwdCAKKyAgIHJlZ2lzdGVyLWFsbG9jYXRpb24gKi8KKyNkZWZpbmUgSEFWRV9UQVJHRVRfUkFMTE9DIDEKKyNkZWZpbmUgY29zdF9tb3ZlX3JlZyh4LHkpIDMKKy8vIE1FR0E2NSBDUFUgaGFzIG9uZSB3YWl0LXN0YXRlIG9uIHJlYWRzIHdoZW4gQ1BVIGlzIGF0IGZ1bGwgc3BlZWQKKyNkZWZpbmUgY29zdF9sb2FkX3JlZyh4LHkpIDUKKyNkZWZpbmUgY29zdF9zYXZlX3JlZyh4LHkpIDQKKyNkZWZpbmUgY29zdF9wdXNocG9wX3JlZyh4KSA2CisKKy8qIHNpemUgb2YgYnVmZmVyIGZvciBhc20tb3V0cHV0LCB0aGlzIGNhbiBiZSB1c2VkIHRvIGRvCisgICBwZWVwaG9sZS1vcHRpbWl6YXRpb25zIG9mIHRoZSBnZW5lcmF0ZWQgYXNzZW1ibHktb3V0cHV0ICovCisjZGVmaW5lIEVNSVRfQlVGX0xFTiAxMDI0IC8qIHNob3VsZCBiZSBlbm91Z2ggKi8KKy8qIG51bWJlciBvZiBhc20tb3V0cHV0IGxpbmVzIGJ1ZmZlcmVkICovCisjZGVmaW5lIEVNSVRfQlVGX0RFUFRIIDgKKworLyogIFdlIGhhdmUgbm8gYXNtX3BlZXBob2xlIHRvIG9wdGltaXplIGFzc2VtYmx5LW91dHB1dCAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9QRUVQSE9MRSAxCisKKy8qIHdlIGRvIG5vdCBoYXZlIGEgbWFya19lZmZfaWNzIGZ1bmN0aW9uLCB0aGlzIGlzIHVzZWQgdG8gcHJldmVudAorICAgb3B0aW1pemF0aW9ucyBvbiBjb2RlIHdoaWNoIGNhbiBhbHJlYWR5IGJlIGltcGxlbWVudGVkIGJ5IGVmZmljaWVudAorICAgYXNzZW1ibHkgKi8KKyN1bmRlZiBIQVZFX1RBUkdFVF9FRkZfSUMKKworLyogd2UgaGF2ZSBhZGRpdGlvbmFsIHR5cGVzICovCisjZGVmaW5lIEhBVkVfRVhUX1RZUEVTCisjZGVmaW5lIEhBVkVfVEdUX1BSSU5UVkFMCisKKy8qIHdlIGRvIG5vdCBuZWVkIGV4dHJhIGVsZW1lbnRzIGluIHRoZSBJQyAqLworI3VuZGVmIEhBVkVfRVhUX0lDCisKKy8qIHdlIGRvIG5vdCB1c2UgdW5zaWduZWQgaW50IGFzIHNpemVfdCAoYnV0IHVuc2lnbmVkIGxvbmcsIHRoZSBkZWZhdWx0KSAqLworI2RlZmluZSBIQVZFX0lOVF9TSVpFVCAxCisKKy8qIHdlIGRvIG5vdCBuZWVkIHJlZ2lzdGVyLXBhaXJzICovCisjZGVmaW5lIEhBVkVfUkVHUEFJUlMgMQorCisKKy8qIGRvIG5vdCBjcmVhdGUgQ09OVkVSVCBJQ3MgZnJvbSBpbnRlZ2VycyBzbWFsbGVyIHRoYW4gaW50IHRvIGZsb2F0cyAqLworI2RlZmluZSBNSU5fSU5UX1RPX0ZMT0FUX1RZUEUgSU5UCisKKy8qIGRvIG5vdCBjcmVhdGUgQ09OVkVSVCBJQ3MgZnJvbSBmbG9hdHMgdG8gaW50cyBzbWFsbGVyIHRoYW4gaW50ICovCisjZGVmaW5lIE1JTl9GTE9BVF9UT19JTlRfVFlQRSBJTlQKKworLyogZG8gbm90IGNyZWF0ZSBDT05WRVJUX0lDcyBmcm9tIGZsb2F0cyB0byB1bnNpZ25lZCBpbnRlZ2VycyAqLworI2RlZmluZSBBVk9JRF9GTE9BVF9UT19VTlNJR05FRCAwCisKKy8qIGRvIG5vdCBjcmVhdGUgQ09OVkVSVF9JQ3MgZnJvbSB1bnNpZ25lZCBpbnRlZ2VycyB0byBmbG9hdHMgKi8KKyNkZWZpbmUgQVZPSURfVU5TSUdORURfVE9fRkxPQVQgMAorCisvKiBjb252ZXJ0IG11bHRpcGxpY2F0aW9ucy9kaXZpc2lvbiBieSBwb3dlcnMgb2YgdHdvIHRvIHNoaWZ0cyAqLworI2RlZmluZSBIQVZFX1BPRjJPUFQgMQorCisvKiBXZSB1c2UgYnVpbHRpbiBsaWJjYWxscyBmb3Igc29tZSBvcGVyYXRpb25zICovCisjZGVmaW5lIEhBVkVfTElCQ0FMTFMgMQorCisvKiBVc2UgY2hhciBmb3IgcmV0dXJuIG9mIGNvbXBhcmlzb24gbGliY2FsbHMgKi8KKyNkZWZpbmUgTElCQ0FMTF9DTVBUWVBFIENIQVIKKworLyogV2UgcHJlZmVyIEJORSByYXRoZXIgdGhhbiBCR1QuICovCisjZGVmaW5lIEhBVkVfV0FOVEJORSAxCisKKyNkZWZpbmUgQkVTVENPUFlUIENIQVIKKworI2RlZmluZSBIQVZFX0FPUzQgMQorCisjZGVmaW5lIENIQVJDT05WKHgpIGNibWNvbnYoeCkKK3Vuc2lnbmVkIGNoYXIgY2JtY29udih1bnNpZ25lZCBjaGFyKTsKKworI2RlZmluZSBBTExPQ1ZMQV9SRUcgRklSU1RfUEFJUgorI2RlZmluZSBBTExPQ1ZMQV9JTkxJTkVBU00gIlx0bGRhXHRzcFxuIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdHNlY1xuIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdHNiY1x0cjBcbiJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRzdGFcdHNwXG4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0bGRhXHRzcCsxXG4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0c2JjXHRyMVxuIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdHN0YVx0c3ArMVxuIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdGxkYVx0c3BcbiJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRjbGNcbiJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRsZHhcdHNwKzFcbiJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRhZGNcdCNfX19mb1xuIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdGJjY1x0KiszXG4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0aW54XG4iCisKKyNkZWZpbmUgRlJFRVZMQV9SRUcgRklSU1RfUEFJUgorI2RlZmluZSBGUkVFVkxBX0lOTElORUFTTSAiXHRsZGFcdHIwXG4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRzdGFcdHNwXG4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRsZGFcdHIxXG4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRzdGFcdHNwKzFcbiIKKworI2RlZmluZSBPTERTUFZMQV9JTkxJTkVBU00gIlx0bGRhXHRzcCsxXG4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0dGF4XG4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0bGRhXHRzcCIKKworI2RlZmluZSBGUFZMQV9SRUcgKExBU1RfUEFJUi0yKQorCisjZGVmaW5lIEhBVkVfVEFSR0VUX1ZBUkhPT0tfUE9TVCAxCisKKyNkZWZpbmUgSEFWRV9ERUNJREVfUkVWRVJTRSAxCisKKyNkZWZpbmUgSEFWRV9UQVJHRVRfRUZGX0lDIDEKZGlmZiAtLWdpdCBhL21hY2hpbmVzL202NS9tZXJnZS5jIGIvbWFjaGluZXMvbTY1L21lcmdlLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmU0M2Q3MwotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL202NS9tZXJnZS5jCkBAIC0wLDAgKzEsNDk5NSBAQAorLyogIE1FR0E2NSA0NUdTMDIgYmFja2VuZCBmb3IgdmJjYworICAgIChjKSBWb2xrZXIgQmFydGhlbG1hbm4gMjAyMAorICAgIChjKSBQYXVsIEdhcmRuZXItU3RlcGhlbiAyMDIwCisKKyovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworI2luY2x1ZGUgInN1cHAuaCIKKyNpbmNsdWRlICJ2YmMuaCIKKworI2luY2x1ZGUgPG1hdGguaD4KKworc3RhdGljIGNoYXIgRklMRV9bXT1fX0ZJTEVfXzsKKworLyogIFB1YmxpYyBkYXRhIHRoYXQgTVVTVCBiZSB0aGVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIE5hbWUgYW5kIGNvcHlyaWdodC4gKi8KK2NoYXIgY2dfY29weXJpZ2h0W109InZiY2MgNDVHUzAyIChNRUdBNjUpIGNvZGUtZ2VuZXJhdG9yIFYwLjEgKGMpIGluIDIwMjAgYnkgVm9sa2VyIEJhcnRoZWxtYW5uLCBQYXVsIEdhcmRuZXItU3RlcGhlbiI7CisKKy8qICBDb21tYW5kbGluZS1mbGFncyB0aGUgY29kZS1nZW5lcmF0b3IgYWNjZXB0czoKKyAgICAwOiBqdXN0IGEgZmxhZworICAgIFZBTEZMQUc6IGEgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQKKyAgICBTVFJJTkdGTEFHOiBhIHN0cmluZyBjYW4gYmUgc3BlY2lmaWVkCisgICAgRlVOQ0ZMQUc6IGEgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKKyAgICBhcGFydCBmcm9tIEZVTkNGTEFHLCBhbGwgb3RoZXIgdmVyc2lvbnMgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIG9uY2UgKi8KK2ludCBnX2ZsYWdzW01BWEdGXT17MCwwLAorCQkgICAgVkFMRkxBRywwLDAsCisJCSAgICAwLDAsCisJCSAgICBWQUxGTEFHLFZBTEZMQUcsMCwwLAorCQkgICAgVkFMRkxBRywwLDAsMCwKKwkJICAgIDAsMCwwLAorCQkgICAgMH07CisKKy8qIHRoZSBmbGFnLW5hbWUsIGRvIG5vdCB1c2UgbmFtZXMgYmVnaW5uaW5nIHdpdGggbCwgTCwgSSwgRCBvciBVLCBiZWNhdXNlCisgICB0aGV5IGNvbGxpZGUgd2l0aCB0aGUgZnJvbnRlbmQgKi8KK2NoYXIgKmdfZmxhZ3NfbmFtZVtNQVhHRl09eyJzdGQtc3ludGF4Iiwibm8tcmF4IiwKKwkJCSAgICJ2b2xhdGlsZS1yZWdzIiwiaWVlZSIsIm5vLXBlZXBob2xlIiwKKwkJCSAgICJjYm1hc2NpaSIsInNvZnRzdGFjayIsCisJCQkgICAicmVnLWFyZ3MiLCJpbnQtYXJncyIsIm1haW5hcmdzIiwibm8tYmFuay12YXJzIiwKKwkJCSAgICJjb21tb24tYmFua25yIiwiYnRtcC16cGFnZSIsIm9sZGZwIiwibGFyZ2UiLAorCQkJICAgImdsb2ItYWNjIiwiYXZvaWQtYmFuay1zd2l0Y2giLCJtYW51YWwtYmFua2luZyIsCisJCQkgICAiYXRhc2NpaSJ9OworCisvKiB0aGUgcmVzdWx0cyBvZiBwYXJzaW5nIHRoZSBjb21tYW5kLWxpbmUtZmxhZ3Mgd2lsbCBiZSBzdG9yZWQgaGVyZSAqLwordW5pb24gcHBpIGdfZmxhZ3NfdmFsW01BWEdGXTsKKworLyogIEFsaWdubWVudC1yZXF1aXJlbWVudHMgZm9yIGFsbCB0eXBlcyBpbiBieXRlcy4gICAgICAgICAgICAgICovCit6bWF4IGFsaWduW01BWF9UWVBFKzFdOworCisvKiAgQWxpZ25tZW50IHRoYXQgaXMgc3VmZmljaWVudCBmb3IgZXZlcnkgb2JqZWN0LiAgICAgICAgICAgICAgKi8KK3ptYXggbWF4YWxpZ247CisKKy8qICBDSEFSX0JJVCBmb3IgdGhlIHRhcmdldCBtYWNoaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworem1heCBjaGFyX2JpdDsKKworLyogIHNpemVzIG9mIHRoZSBiYXNpYyB0eXBlcyAoaW4gYnl0ZXMpICovCit6bWF4IHNpemV0YWJbTUFYX1RZUEUrMV07CisKKy8qICBNaW5pbXVtIGFuZCBNYXhpbXVtIHZhbHVlcyBlYWNoIHR5cGUgY2FuIGhhdmUuICAgICAgICAgICAgICAqLworLyogIE11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gaW5pdF9jZygpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IHRfbWluW01BWF9UWVBFKzFdOworenVtYXggdF9tYXhbTUFYX1RZUEUrMV07Cit6dW1heCB0dV9tYXhbTUFYX1RZUEUrMV07CisKKy8qICBOYW1lcyBvZiBhbGwgcmVnaXN0ZXJzLiB3aWxsIGJlIGluaXRpYWxpemVkIGluIGluaXRfY2coKSwKKyAgICByZWdpc3RlciBudW1iZXIgMCBpcyBpbnZhbGlkLCB2YWxpZCByZWdpc3RlcnMgc3RhcnQgYXQgMSAqLworY2hhciAqcmVnbmFtZXNbTUFYUisxXTsKKworLyogIFRoZSBTaXplIG9mIGVhY2ggcmVnaXN0ZXIgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IHJlZ3NpemVbTUFYUisxXTsKKworLyogIGEgdHlwZSB3aGljaCBjYW4gc3RvcmUgZWFjaCByZWdpc3Rlci4gKi8KK3N0cnVjdCBUeXAgKnJlZ3R5cGVbTUFYUisxXTsKKworLyogIHJlZ3NhW3JlZ10hPTAgaWYgYSBjZXJ0YWluIHJlZ2lzdGVyIGlzIGFsbG9jYXRlZCBhbmQgc2hvdWxkICovCisvKiAgbm90IGJlIHVzZWQgYnkgdGhlIGNvbXBpbGVyIHBhc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2ludCByZWdzYVtNQVhSKzFdOworCisvKiAgU3BlY2lmaWVzIHdoaWNoIHJlZ2lzdGVycyBtYXkgYmUgc2NyYXRjaGVkIGJ5IGZ1bmN0aW9ucy4gICAgKi8KK2ludCByZWdzY3JhdGNoW01BWFIrMV07CisKKy8qIHNwZWNpZmllcyB0aGUgcHJpb3JpdHkgZm9yIHRoZSByZWdpc3Rlci1hbGxvY2F0b3IsIGlmIHRoZSBzYW1lCisgICBlc3RpbWF0ZWQgY29zdC1zYXZpbmcgY2FuIGJlIG9idGFpbmVkIGJ5IHNldmVyYWwgcmVnaXN0ZXJzLCB0aGUKKyAgIG9uZSB3aXRoIHRoZSBoaWdoZXN0IHByaW9yaXR5IHdpbGwgYmUgdXNlZCAqLworaW50IHJlZ19wcmlvW01BWFIrMV07CisKKy8qIGFuIGVtcHR5IHJlZy1oYW5kbGUgcmVwcmVzZW50aW5nIGluaXRpYWwgc3RhdGUgKi8KK3N0cnVjdCByZWdfaGFuZGxlIGVtcHR5X3JlZ19oYW5kbGU9ezAsMH07CisKKy8qIE5hbWVzIG9mIHRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZSBhdHRyaWJ1dGVzLiAgICAgICAgICAgICAgICAqLworY2hhciAqZ19hdHRyX25hbWVbXT17Il9faW50ZXJydXB0IiwiX196cGFnZSIsIl9fbm9jcHIiLDB9OworCisjZGVmaW5lIElOVEVSUlVQVCAxCisjZGVmaW5lIFpQQUdFIDIKKyNkZWZpbmUgTk9DT01QUkVTUyA0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFByaXZhdGUgZGF0YSBhbmQgZnVuY3Rpb25zLiAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTVERTWU5UQVggIChnX2ZsYWdzWzBdJlVTRURGTEFHKQorI2RlZmluZSBOT1JBWCAgICAgIChnX2ZsYWdzWzFdJlVTRURGTEFHKQorI2RlZmluZSBWT0xfR1BSUyAgICgoZ19mbGFnc1syXSZVU0VERkxBRyk/Z19mbGFnc192YWxbMl0ubDpOVU1fR1BSUy8yKQorI2RlZmluZSBJRUVFICAgICAgIChnX2ZsYWdzWzNdJlVTRURGTEFHKQorI2RlZmluZSBOT1BFRVAgICAgIChnX2ZsYWdzWzRdJlVTRURGTEFHKQorI2RlZmluZSBDQk1BU0NJSSAgIChnX2ZsYWdzWzVdJlVTRURGTEFHKQorI2RlZmluZSBTT0ZUU1RBQ0sgIChnX2ZsYWdzWzZdJlVTRURGTEFHKQorI2RlZmluZSBHUFJfQVJHUyAgICgoZ19mbGFnc1s3XSZVU0VERkxBRyk/Z19mbGFnc192YWxbN10ubDo4KQorI2RlZmluZSBNQUlOQVJHUyAgIChnX2ZsYWdzWzldJlVTRURGTEFHKQorI2RlZmluZSBOT0JBTktWQVJTIChnX2ZsYWdzWzEwXSZVU0VERkxBRykKKyNkZWZpbmUgQ09NTU9OQkFOSyAoKGdfZmxhZ3NbMTFdJlVTRURGTEFHKT9nX2ZsYWdzX3ZhbFsxMV0ubDowKQorI2RlZmluZSBCSUdaUEFHRSAgIChnX2ZsYWdzWzEyXSZVU0VERkxBRykKKyNkZWZpbmUgT0xERlAgICAgICAoZ19mbGFnc1sxM10mVVNFREZMQUcpCisjZGVmaW5lIExBUkdFICAgICAgKGdfZmxhZ3NbMTRdJlVTRURGTEFHKQorI2RlZmluZSBHTE9CQUNDICAgIChnX2ZsYWdzWzE1XSZVU0VERkxBRykKKyNkZWZpbmUgTk9TV0lUQ0ggICAoZ19mbGFnc1sxNl0mVVNFREZMQUcpCisjZGVmaW5lIE5PQkFOS0lORyAgKGdfZmxhZ3NbMTddJlVTRURGTEFHKQorI2RlZmluZSBBVEFTQ0lJICAgIChnX2ZsYWdzWzE4XSZVU0VERkxBRykKKworCisKKyNkZWZpbmUgU1RSX05FQVIgIm5lYXIiCisjZGVmaW5lIFNUUl9GQVIgImZhciIKKyNkZWZpbmUgU1RSX0hVR0UgImh1Z2UiCisKKyNkZWZpbmUgUExBICgtMSkKKyNkZWZpbmUgSk1QSU5EICgtMikKKworc3RhdGljIHZvaWQgZnVuY3Rpb25fdG9wKEZJTEUgKixzdHJ1Y3QgVmFyICosbG9uZyk7CitzdGF0aWMgdm9pZCBmdW5jdGlvbl9ib3R0b20oRklMRSAqZixzdHJ1Y3QgVmFyICosbG9uZyk7CisKKyNkZWZpbmUgaXNyZWcoeCkgKChwLT54LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpCisjZGVmaW5lIGlzYWNjKHgpIChpc3JlZyh4KSYmKHAtPngucmVnPT1yYXx8cC0+eC5yZWc9PXJheCkpCisjZGVmaW5lIGlzY29uc3QoeCkgKChwLT54LmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKQorCisjZGVmaW5lIGlzcHRyKHIpICgocik+PUZJUlNUX1BBSVImJihyKTw9TEFTVF9QQUlSKQorCitzdGF0aWMgaW50IHExcmVnLHEycmVnLHpyZWc7CisKK3N0YXRpYyBjaGFyICpjY3NbXT17ImVxIiwibmUiLCJsdCIsImdlIiwibGUiLCJndCIsIiJ9Oworc3RhdGljIGNoYXIgKmxvZ2ljYWxzW109eyJvcmEiLCJlb3IiLCJhbmQifTsKK3N0YXRpYyBjaGFyICphcml0aG1ldGljc1tdPXsic2x3Iiwic3J3IiwiYWRjIiwic2JjIiwibXVsbHciLCJkaXZ3IiwibW9kIn07CisKKy8qIGFsaWdubWVudCBvZiBiYXNpYyBkYXRhLXR5cGVzLCB1c2VkIHRvIGluaXRpYWxpemUgYWxpZ25bXSAqLworc3RhdGljIGxvbmcgbWFsaWduW01BWF9UWVBFKzFdPSAgezEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxfTsKKy8qIHNpemVzIG9mIGJhc2ljIGRhdGEtdHlwZXMsIHVzZWQgdG8gaW5pdGlhbGl6ZSBzaXpldGFiW10gKi8KK3N0YXRpYyBsb25nIG1zaXpldGFiW01BWF9UWVBFKzFdPXsxLDEsMiwyLDQsOCw0LDQsNCwwLDIsMywzLDAsMCwwLDEsMH07CitzdGF0aWMgY2hhciAqbXJlZ25hbWVzW01BWFIrMV07CisKKy8qIFR5cGVuYW1lcyAobmVlZGVkIGJlY2F1c2Ugb2YgSEFWRV9FWFRfVFlQRVMpLiAqLworY2hhciAqdHlwbmFtZVtdPXsic3RyYW5nZSIsImNoYXIiLCJzaG9ydCIsImludCIsImxvbmciLCJsb25nIGxvbmciLAorICAgICAgICAgICAgICAgICAiZmxvYXQiLCJkb3VibGUiLCJsb25nIGRvdWJsZSIsInZvaWQiLAorICAgICAgICAgICAgICAgICAibmVhci1wb2ludGVyIiwiZmFyLXBvaW50ZXIiLCJodWdlLXBvaW50ZXIiLAorICAgICAgICAgICAgICAgICAiYXJyYXkiLCJzdHJ1Y3QiLCJ1bmlvbiIsImVudW0iLCJmdW5jdGlvbiJ9OworCisKKy8qIHVzZWQgdG8gaW5pdGlhbGl6ZSByZWd0eXBbXSAqLworc3RhdGljIHN0cnVjdCBUeXAgaXR5cD17SU5UfSxjdHlwPXtDSEFSfSxmdHlwPXtGTE9BVH0sbGx0eXA9e0xMT05HfTsKKworLyogbWFjcm9zIGRlZmluZWQgYnkgdGhlIGJhY2tlbmQgKi8KK3N0YXRpYyBjaGFyICptYXJyYXlbXT17Il9fc2VjdGlvbih4KT1fX3ZhdHRyKFwic2VjdGlvbihcIiN4XCIpXCIpIiwKKwkJICAgICAgICJfX202NV9fIiwgCisJCSAgICAgICAiX19TSVpFX1RfSU5UIiwKKwkJICAgICAgICJfX2JhbmsoeCk9X192YXR0cihcImJhbmsoXCIjeFwiKVwiKSIsCisgICAgICAgICAgICAgICAgICAgICAgICJfX2Zhcj1fX2F0dHIoXCJmYXJcIikiLAorICAgICAgICAgICAgICAgICAgICAgICAiX19uZWFyPV9fYXR0cihcIm5lYXJcIikiLAorICAgICAgICAgICAgICAgICAgICAgICAiX19odWdlPV9fYXR0cihcImh1Z2VcIikiLAorCQkgICAgICAgMH07CisKKy8qIHNwZWNpYWwgcmVnaXN0ZXJzICovCitzdGF0aWMgaW50IHJhPTEsIHJ4PTIsIHJ5PTMsIHJ6PTQsIHNwMT01LHNwMj02LHNwPTcsZnAsZnAxLGZwMjsKK3N0YXRpYyBpbnQgdDQ9TEFTVF9HUFIsdDM9TEFTVF9HUFItMSx0Mj1MQVNUX0dQUi0yLHQxPUxBU1RfR1BSLTM7CitzdGF0aWMgaW50IHJheD04Oworc3RhdGljIGludCByYXh5ej05Oworc3RhdGljIGludCB5dmFsOworI2RlZmluZSBOT1ZBTCAxMDAwCisKK3N0YXRpYyBpbnQgdDEsdDIsZjEsZjI7IC8qdE9ETzogcmVtb3ZlKi8KKworc3RhdGljIGludCBwdXNoZWRhY2MscHVzaGVkeCxub3BlZXAsY2JtYXNjaWksYXRhc2NpaSxpZWVlOworc3RhdGljIGludCBwYXNzOworc3RhdGljIGludCBsaWJzYXZlOworc3RhdGljIHN0cnVjdCBycGFpciBycDI7CitzdGF0aWMgaW50IGNiYW5rOworc3RhdGljIFZhciBiYW5rdjsKK3N0YXRpYyBpbnQgYmFua3ZvZmZzZXQ7CitzdGF0aWMgaW50IGJhbmtjbnVtOworc3RhdGljIG9iaiB6c3RvcmU7CitzdGF0aWMgaW50IHpzdG9yZWZsYWc7CisKKyNkZWZpbmUgU0VDTEVOIDEyOAorY2hhciAqdXNlX3NlYzsKK2ludCB1c2VfYmFuaz0tMTsKKworI2RlZmluZSBkdCh0KSAoKCh0KSZVTlNJR05FRCk/dWR0Wyh0KSZOUV06c2R0Wyh0KSZOUV0pCitzdGF0aWMgY2hhciAqc2R0W01BWF9UWVBFKzFdPXsiPz8iLCJjIiwicyIsImkiLCJsIiwibGwiLCJmIiwiZCIsImxkIiwidiIsInAifTsKK3N0YXRpYyBjaGFyICp1ZHRbTUFYX1RZUEUrMV09eyI/PyIsInVjIiwidXMiLCJ1aSIsInVsIiwidWxsIiwiZiIsImQiLCJsZCIsInYiLCJwIn07CisKKy8qIHBlcmhhcHMgcHJvdmlkZSB2ZXJzaW9uIHdpdGggOGJpdCBpbnQ/ICovCisjZGVmaW5lIElTQ0hBUih0KSAoKHQmTlEpPT1DSEFSKQorI2RlZmluZSBJU1NIT1JUKHQpICgodCZOUSk9PVNIT1JUfHwodCZOUSk9PUlOVHx8KHQmTlEpPT1QT0lOVEVSKQorI2RlZmluZSBJU0ZQT0lOVEVSKHQpICgodCZOUSk9PUZQT0lOVEVSKQorI2RlZmluZSBJU0xPTkcodCkgKCh0Jk5RKT09TE9ORykKKyNkZWZpbmUgSVNMTE9ORyh0KSAoKHQmTlEpPT1MTE9ORykKKworLyogYW0gKi8KKyNkZWZpbmUgSU1NX0lORCAxCisjZGVmaW5lIEdQUl9JTkQgMgorI2RlZmluZSBBQlNfSU5EIDMKKworLyogc2VjdGlvbnMgKi8KKyNkZWZpbmUgREFUQSAwCisjZGVmaW5lIEJTUyAxCisjZGVmaW5lIENPREUgMgorI2RlZmluZSBST0RBVEEgMworI2RlZmluZSBTUEVDSUFMIDQKKworc3RhdGljIGxvbmcgc3RhY2s7CitzdGF0aWMgaW50IHN0YWNrX3ZhbGlkOworc3RhdGljIGludCBzZWN0aW9uPS0xLG5ld29iajsKK3N0YXRpYyBjaGFyICpjb2RlbmFtZT0iXHRzZWN0aW9uXHR0ZXh0IiwKKyAgKmRhdGFuYW1lPSJcdHNlY3Rpb25cdGRhdGEiLAorICAqYnNzbmFtZT0iXHRzZWN0aW9uXHRic3MiLAorICAqcm9kYXRhbmFtZT0iXHRzZWN0aW9uXHRyb2RhdGEiOworCisvKiByZXR1cm4taW5zdHJ1Y3Rpb24gKi8KK3N0YXRpYyBjaGFyICpyZXQ7CisKKy8qIGxhYmVsIGF0IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uIChpZiBhbnkpICovCitzdGF0aWMgaW50IGV4aXRfbGFiZWw7CisKKy8qIGFzc2VtYmx5LXByZWZpeGVzIGZvciBsYWJlbHMgYW5kIGV4dGVybmFsIGlkZW50aWZpZXJzICovCitzdGF0aWMgY2hhciAqbGFicHJlZml4PSJsIiwqaWRwcmVmaXg9Il8iOworCisvKiB2YXJpYWJsZXMgdG8gY2FsY3VsYXRlIHRoZSBzaXplIGFuZCBwYXJ0aXRpb25pbmcgb2YgdGhlIHN0YWNrLWZyYW1lCisgICBpbiB0aGUgY2FzZSBvZiBGSVhFRF9TUCAqLworc3RhdGljIGxvbmcgZnJhbWVvZmZzZXQscHVzaGVkLG1heHB1c2hlZCxmcmFtZXNpemU7CisKK3N0YXRpYyBsb25nIGxvY2Fsc2l6ZSxyc2F2ZXNpemUscnNjbnQsYXJnc2l6ZTsKKworc3RhdGljIHZvaWQgZW1pdF9vYmooRklMRSAqZixzdHJ1Y3Qgb2JqICpwLGludCB0KTsKKworLyogY2FsY3VsYXRlIHRoZSBhY3R1YWwgY3VycmVudCBvZmZzZXQgb2YgYW4gb2JqZWN0IHJlbGF0aXYgdG8gdGhlCisgICBzdGFjay1wb2ludGVyOyB3ZSB1c2UgYSBsYXlvdXQgbGlrZSB0aGlzOgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB8IGFyZ3VtZW50cyB0byB0aGlzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgIHwKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCBjYWxsZXItc2F2ZSByZWdpc3RlcnMgW3NpemU9cnNhdmVzaXplXSAgICAgICB8CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHwgbG9jYWwgdmFyaWFibGVzIFtzaXplPWxvY2Fsc2l6ZV0gICAgICAgICAgICAgfAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB8IGFyZ3VtZW50cyB0byBjYWxsZWQgZnVuY3Rpb25zIFtzaXplPWFyZ3NpemVdIHwKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgQWxsIHNpemVzIHdpbGwgYmUgYWxpZ25lZCBhcyBuZWNlc3NhcnkuCisgICBJbiB0aGUgY2FzZSBvZiBGSVhFRF9TUCwgdGhlIHN0YWNrLXBvaW50ZXIgd2lsbCBiZSBhZGp1c3RlZCBhdAorICAgZnVuY3Rpb24tZW50cnkgdG8gbGVhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgYXJndW1lbnRzIGFuZCBoYXZlIGl0CisgICBhbGlnbmVkIHRvIDE2IGJ5dGVzLiBUaGVyZWZvcmUsIHdoZW4gY2FsbGluZyBhIGZ1bmN0aW9uLCB0aGUKKyAgIHN0YWNrLXBvaW50ZXIgaXMgYWx3YXlzIGFsaWduZWQgdG8gMTYgYnl0ZXMuCisgICBGb3IgYSBtb3Zpbmcgc3RhY2stcG9pbnRlciwgdGhlIHN0YWNrLXBvaW50ZXIgd2lsbCB1c3VhbGx5IHBvaW50CisgICB0byB0aGUgYm90dG9tIG9mIHRoZSBhcmVhIGZvciBsb2NhbCB2YXJpYWJsZXMsIGJ1dCB3aWxsIG1vdmUgd2hpbGUKKyAgIGFyZ3VtZW50cyBhcmUgcHV0IG9uIHRoZSBzdGFjay4KKworICAgVGhpcyBpcyBqdXN0IGFuIGV4YW1wbGUgbGF5b3V0LiBPdGhlciBsYXlvdXRzIGFyZSBhbHNvIHBvc3NpYmxlLgorKi8KKworc3RhdGljIGludCBiYW5rKFZhciAqdikKK3sKKyAgY2hhciAqcz12LT52YXR0cjsKKyAgaW50IG4scjsKKyAgaWYoIU5PQkFOS0lORyYmcyYmKHM9c3Ryc3RyKHMsImJhbmsoIikpKXsKKyAgICBpZihzc2NhbmYocys1LCIlaSIsJm4pPT0xKQorICAgICAgcmV0dXJuIG47CisgIH0KKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBlYmFuayhGSUxFICpmLGludCBiKQoreworICBpZihiPj0wKSBlbWl0KGYsIiVkIixiKTsKKyAgZW1pdChmLCJcbiIpOworfQorCitzdGF0aWMgbG9uZyByZWFsX29mZnNldChzdHJ1Y3Qgb2JqICpvKQoreworICBsb25nIG9mZj16bTJsKG8tPnYtPm9mZnNldCk7CisgIGlmKG9mZjwwKXsKKyAgICAvKiBmdW5jdGlvbiBwYXJhbWV0ZXIgKi8KKyAgICBvZmY9bG9jYWxzaXplK3JzYXZlc2l6ZS1vZmYtem0ybChtYXhhbGlnbik7CisgIH0KKworICBvZmYrPWFyZ3NpemU7CisgIG9mZis9em0ybChvLT52YWwudm1heCk7CisgIHJldHVybiBvZmY7Cit9CisKKy8qICBJbml0aWFsaXplcyBhbiBhZGRyZXNzaW5nLW1vZGUgc3RydWN0dXJlIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0bworICAgIHRoYXQgb2JqZWN0LiBXaWxsIG5vdCBzdXJ2aXZlIGEgc2Vjb25kIGNhbGwhICovCitzdGF0aWMgc3RydWN0IG9iaiAqY2FtKGludCBmbGFncyxpbnQgYmFzZSxsb25nIG9mZnNldCkKK3sKKyAgc3RhdGljIHN0cnVjdCBvYmogb2JqOworICBzdGF0aWMgc3RydWN0IEFkZHJlc3NpbmdNb2RlIGFtOworICBvYmouYW09JmFtOworICBhbS5mbGFncz1mbGFnczsKKyAgYW0uYmFzZT1iYXNlOworICBhbS5vZmZzZXQ9b2Zmc2V0OworICByZXR1cm4gJm9iajsKK30KKworLyogY2hhbmdlcyB0byBhIHNwZWNpYWwgc2VjdGlvbiwgdXNlZCBmb3IgX19zZWN0aW9uKCkgKi8KK3N0YXRpYyBpbnQgc3BlY2lhbF9zZWN0aW9uKEZJTEUgKmYsc3RydWN0IFZhciAqdikKK3sKKyAgY2hhciAqc2VjOworICBpZih2LT50YXR0ciZaUEFHRSl7CisgICAgZW1pdChmLCJcdHNlY3Rpb25cdHpwYWdlXG4iKTsKKyAgfWVsc2V7CisgICAgaWYoIXYtPnZhdHRyKSByZXR1cm4gMDsKKyAgICBzZWM9c3Ryc3RyKHYtPnZhdHRyLCJzZWN0aW9uKCIpOworICAgIGlmKCFzZWMpIHJldHVybiAwOworICAgIHNlYys9c3RybGVuKCJzZWN0aW9uKCIpOworICAgIGVtaXQoZiwiXHRzZWN0aW9uXHQiKTsKKyAgICB3aGlsZSgqc2VjJiYqc2VjIT0nKScpIGVtaXRfY2hhcihmLCpzZWMrKyk7CisgICAgZW1pdChmLCJcbiIpOworICB9CisgIGlmKGYpIHNlY3Rpb249U1BFQ0lBTDsKKyAgcmV0dXJuIDE7Cit9CisKKworCisjZGVmaW5lIGNoa19jb2xsKHgpIGRve2lmKCh4KT09cnx8KHgpPT1yMXx8KHgpPT1yMikgcmV0dXJuIDA7CVwKKyAgICBpZihyZWdfcGFpcigoeCksJnJwKSYmKHJwLnIxPT1yfHxycC5yMj09cikpIHJldHVybiAwO313aGlsZSgwKQorCitzdGF0aWMgaW50IHNjcmF0Y2goSUMgKnAsaW50IHIpCit7CisgIGludCByMSxyMjsKKyAgaWYoIXApIHJldHVybiAxOworICBpZihyZWdfcGFpcihyLCZycCkpeworICAgIHIxPXJwLnIxOworICAgIHIyPXJwLnIyOworICB9ZWxzZXsKKyAgICByMT0wOworICAgIHIyPTA7CisgIH0KKyAgaWYoaXNyZWcoeikmJnAtPnoucmVnPT1yKXsKKyAgICBpZighKHAtPnEyLmZsYWdzJlJFRykpCisgICAgICByZXR1cm4gMTsKKyAgICBpZihwLT5xMi5yZWc9PXJ8fHAtPnEyLnJlZz09cjF8fHAtPnEyLnJlZz09cjIpCisgICAgICByZXR1cm4gMDsKKyAgICBpZihyZWdfcGFpcihwLT5xMi5yZWcsJnJwKSkKKyAgICAgIGlmKHJwLnIxPT1yfHxycC5yMj09cikKKwlyZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKKyAgfQorICB3aGlsZShwKXsKKyAgICBpZihwLT5jb2RlPT1MQUJFTHx8cC0+Y29kZT09Q0FMTCkKKyAgICAgIHJldHVybiAwOworICAgIGlmKHAtPmNvZGU+PUJFUSYmcC0+Y29kZTw9QlJBKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYocC0+Y29kZT09RlJFRVJFR3x8cC0+Y29kZT09QUxMT0NSRUcpeworICAgICAgaWYocC0+cTEucmVnPT1yKQorCXJldHVybiAxOworICAgICAgaWYocmVnX3BhaXIocC0+cTEucmVnLCZycCkmJihycC5yMT09cnx8cnAucjI9PXIpKQorCXJldHVybiAxOworICAgIH0KKyAgICBpZihwLT5xMS5hbSkgY2hrX2NvbGwocC0+cTEuYW0tPmJhc2UpOworICAgIGlmKHAtPnEyLmFtKSBjaGtfY29sbChwLT5xMi5hbS0+YmFzZSk7CisgICAgaWYocC0+ei5hbSkgY2hrX2NvbGwocC0+ei5hbS0+YmFzZSk7CisgICAgaWYocC0+cTEuZmxhZ3MmUkVHKSBjaGtfY29sbChwLT5xMS5yZWcpOworICAgIGlmKHAtPnEyLmZsYWdzJlJFRykgY2hrX2NvbGwocC0+cTIucmVnKTsKKyAgICBpZihwLT56LmZsYWdzJlJFRyl7CisgICAgICBpZihwLT56LmZsYWdzJkRSRUZPQkopCisJY2hrX2NvbGwocC0+ei5yZWcpOworICAgICAgZWxzZXsKKwlpZihwLT56LnJlZz09cikKKwkgIHJldHVybiAxOworCWlmKHJlZ19wYWlyKHAtPnoucmVnLCZycCkmJihycC5yMT09cnx8cnAucjI9PXIpKQorCSAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorCisgICAgcD1wLT5uZXh0OworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHJzYXZlY3VyOworc3RhdGljIGludCBpbl9pc3I7CisKK3N0YXRpYyBpbnQgZ2V0X3JlZyhGSUxFICpmLElDICpwLGludCB0KQoreworICBpbnQgcixyMSxyMixwYXNzLGZsYWc7CisKKyAgZm9yKHBhc3M9MDtwYXNzPDU7cGFzcysrKXsKKyAgICBmb3Iocj1NQVhSO3I+c3A7ci0tKXsKKyAgICAgIGlmKHJlZ19wYWlyKHIsJnJwKSl7CisJcjE9cnAucjE7CisJcjI9cnAucjI7CisgICAgICB9ZWxzZXsKKwlyMT0wOworCXIyPTA7CisgICAgICB9CisgICAgICBpZigocGFzcz09MHx8cGFzcz09MykmJighcmVnc2NyYXRjaFtyXXx8aW5faXNyKSkKKwljb250aW51ZTsKKyAgICAgIGlmKHBhc3M8Myl7CisJaWYocmVnc1tyXSkgY29udGludWU7CisJaWYocjEmJihyZWdzW3IxXXx8cmVnc1tyMl0pKSBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKHBhc3M9PTImJiEocmVnc1tyXSY0KSkKKwljb250aW51ZTsKKyAgICAgIGlmKChwLT5xMS5mbGFncyZSRUcpJiYocC0+cTEucmVnPT1yfHxwLT5xMS5yZWc9PXIxfHxwLT5xMS5yZWc9PXIyKSkgY29udGludWU7CisgICAgICBpZigocC0+cTIuZmxhZ3MmUkVHKSYmKHAtPnEyLnJlZz09cnx8cC0+cTIucmVnPT1yMXx8cC0+cTIucmVnPT1yMikpIGNvbnRpbnVlOworICAgICAgaWYoKHAtPnouZmxhZ3MmUkVHKSYmKHAtPnoucmVnPT1yfHxwLT56LnJlZz09cjF8fHAtPnoucmVnPT1yMikpIGNvbnRpbnVlOworICAgICAgaWYocmVnb2socix0LDEpKXsKKwlmbGFnPTg7CisJaWYocmVnc1tyXSl7CisJICBmbGFnfD0yOworCSAgaWYocC0+Y29kZT09Q09NUEFSRXx8cC0+Y29kZT09VEVTVCkKKwkgICAgaWVycm9yKDApOworCSAgaWYocmVnc1tyYV0peworCSAgICBlbWl0KGYsIlx0dGF5XG4iKTsKKwkgICAgeXZhbD1OT1ZBTDsKKwkgIH0KKwkgIGlmKHIxKXsKKwkgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3IxXSk7CisJICAgIGVtaXQoZiwiXHRwaGFcbiIpOworCSAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcjJdKTsKKwkgICAgZW1pdChmLCJcdHBoYVxuIik7CisJICB9ZWxzZXsKKwkgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgICAgZW1pdChmLCJcdHBoYVxuIik7CisJICB9CisJICBpZihyZWdzW3JhXSkKKwkgICAgZW1pdChmLCJcdHR5YVxuIik7CisJfQorCWlmKHIxKXsKKwkgIHJlZ3NbcjFdfD1mbGFnOworCSAgcmVnc1tyMl18PWZsYWc7CisJfQorCXJlZ3Nbcl18PWZsYWc7CisJcmVndXNlZFtyXT0xOworCXJlZ3VzZWRbcjFdPTE7CisJcmVndXNlZFtyMl09MTsKKwlyZXR1cm4gcjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcHJpYzIoc3Rkb3V0LHApOworICBpZXJyb3IoMCk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9hY2MoRklMRSAqZiwgSUMgKnAsaW50IHQpCit7CisgIGludCByOworICBpZihpc2FjYyh6KSkgcmV0dXJuOworICB0Jj1OUTsKKyAgaWYoSVNDSEFSKHQpKXsKKyAgICBpZigxLyohaXNyZWcocTEpfHwocC0+cTEucmVnIT1yYSYmcC0+cTEucmVnIT1yYXgpKi8peworICAgICAgaWYoKHJlZ3NbcmFdfHxyZWdzW3JheF0pJiYhc2NyYXRjaChwLHJhKSYmIXB1c2hlZGFjYyl7CisJaWYob3B0c2l6ZXx8KHJlZ3NbdDFdJiZyZWdzW3QyXSYmcmVnc1t0M10mJnJlZ3NbdDRdKSl7CisJICBlbWl0KGYsIlx0cGhhXG4iKTsKKwkgIHB1c2hlZGFjYz0tMTsKKwl9ZWxzZXsKKwkgIHI9Z2V0X3JlZyhmLHAsQ0hBUik7CisJICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgcHVzaGVkYWNjPXI7CisJfQorICAgICAgfQorICAgIH0KKyAgfWVsc2V7CisgICAgaWYoMS8qIWlzcmVnKHExKXx8cC0+cTEucmVnIT1yYXgqLyl7CisgICAgICBpZigocmVnc1tyYV18fHJlZ3NbcmF4XSkmJighc2NyYXRjaChwLHJhKXx8IXNjcmF0Y2gocCxyYXgpKSYmIXB1c2hlZGFjYyl7CisJcj1nZXRfcmVnKGYscCxDSEFSKTsKKwllbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCXB1c2hlZGFjYz1yOworICAgICAgfQorICAgICAgaWYoKHJlZ3NbcnhdfHxyZWdzW3JheF0pJiYhc2NyYXRjaChwLHJheCkmJiFwdXNoZWR4KXsKKwlyPWdldF9yZWcoZixwLENIQVIpOworCWVtaXQoZiwiXHRzdHhcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJcHVzaGVkeD1yOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgaW50IGNtcF9nZXRfYWNjKEZJTEUgKmYsSUMgKnAsSUMgKmJyYW5jaCkKK3sKKyAgaWYoIXJlZ3NbcmFdJiYhcmVnc1tyYXhdKQorICAgIHJldHVybiAwOworICBpZihicmFuY2g9PTAmJnB1c2hlZGFjYykKKyAgICByZXR1cm4gMDsKKyAgaWYoYnJhbmNoJiZpc3JlZyhxMSkmJihwLT5xMS5yZWc9PXJhfHxwLT5xMS5yZWc9PXJheCkpCisgICAgaWYoYnJhbmNoLT5jb2RlPT1CRVF8fGJyYW5jaC0+Y29kZT09Qk5FfHwocC0+dHlwZiZVTlNJR05FRCkpCisgICAgICByZXR1cm4gMDsKKyAgaWYoc2NyYXRjaChwLHJhKSkKKyAgICByZXR1cm4gMDsKKyAgaWYoIXJlZ3NbcnhdJiYhcmVnc1tyYXhdKXsKKyAgICBlbWl0KGYsIlx0dGF4XG4iKTsKKyAgICBwdXNoZWRhY2M9cng7CisgIH0KKyAgZW1pdChmLCJcdHBoYVxuIik7CisgIHB1c2hlZGFjYz0tMTsKKyAgcmV0dXJuIHB1c2hlZGFjYzsKK30KKworc3RhdGljIHZvaWQgcmVsb2FkX2FjY19vcHQoRklMRSAqZixJQyAqcCkKK3sKKyAgaWYocHVzaGVkYWNjPT0wKSByZXR1cm47CisgIGlmKHB1c2hlZGFjYz4wKXsKKyAgICB3aGlsZShwKXsKKyAgICAgIGlmKHAtPmNvZGUhPUZSRUVSRUcpIGJyZWFrOworICAgICAgaWYocC0+cTEucmVnPT1yYXx8cC0+cTEucmVnPT1yYXgpeworCXB1c2hlZGFjYz0wOworCXJldHVybjsKKyAgICAgIH0KKyAgICAgIHA9cC0+bmV4dDsKKyAgICB9CisgIH0KKyAgaWYocHVzaGVkYWNjPT0tMSkKKyAgICBlbWl0KGYsIlx0cGxhXG4iKTsKKyAgZWxzZSBpZihwdXNoZWRhY2M9PXJ4KQorICAgIGVtaXQoZiwiXHR0eGFcbiIpOworICBlbHNlIGlmKHB1c2hlZGFjYz09cnkpCisgICAgZW1pdChmLCJcdHR5YVxuIik7CisgIGVsc2UgaWYocHVzaGVkYWNjKXsKKyAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcHVzaGVkYWNjXSk7CisgICAgcmVnc1twdXNoZWRhY2NdJj1+ODsKKyAgfQorICBwdXNoZWRhY2M9MDsKK30KKworc3RhdGljIHZvaWQgcmVsb2FkX2FjYyhGSUxFICpmKQoreworICByZWxvYWRfYWNjX29wdChmLDApOworfQorCitzdGF0aWMgdm9pZCBwdXNoKGludCBpKQoreworICBwdXNoZWQtPWk7CisgIGlmKHB1c2hlZDxtYXhwdXNoZWQpCisgICAgbWF4cHVzaGVkPXB1c2hlZDsKK30KKworc3RhdGljIHZvaWQgcG9wKGludCBpKQoreworICBwdXNoZWQrPWk7CisgIGlmKHB1c2hlZD4wKSBpZXJyb3IoMCk7Cit9CisKK3N0YXRpYyBpbnQgaW5kaXJlY3Qob2JqICpvKQoreworICBpZigoby0+ZmxhZ3MmKERSRUZPQkp8S09OU1QpKT09RFJFRk9CSikKKyAgICByZXR1cm4gMTsKKyAgaWYoKG8tPmZsYWdzJihSRUd8VkFSKSkhPVZBUikKKyAgICByZXR1cm4gMDsKKyAgaWYoby0+di0+c3RvcmFnZV9jbGFzcz09QVVUT3x8by0+di0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCit2b2lkIGNvbnZmbG9hdCh2b2lkKQoreworfSAgCisKK3ZvaWQgc2V0eShGSUxFICpmLGludCB2YWwpCit7CisgIGlmKHl2YWw9PXZhbCkKKyAgICByZXR1cm47CisgIGlmKHZhbC15dmFsPT0xKQorICAgIGVtaXQoZiwiXHRpbnlcbiIpOworICBlbHNlIGlmKHl2YWwtdmFsPT0xKQorICAgIGVtaXQoZiwiXHRkZXlcbiIpOworICBlbHNleworICAgIGVtaXQoZiwiXHRsZHlcdCMlZFxuIix2YWwpOworICAgIGlmKHZhbDwwfHx2YWw+MjU1KQorICAgICAgaWVycm9yKDApOworICB9CisgIHl2YWw9dmFsOworfQorCitzdGF0aWMgdm9pZCBjbnZfZnAodm9pZCkKK3sKKyAgZG91YmxlIGQsbWFudDsKKyAgaW50IGV4cDsKKyAgdW5zaWduZWQgbG9uZyB0OworCisgIGlmKGllZWUpeworICAgIHZmbG9hdD16bGQyemYodmxkb3VibGUpOworICAgIG1lbWNweSgodm9pZCopJnZtYXgsKHZvaWQqKSZ2ZmxvYXQsNCk7CisgIH1lbHNleworICAgIGQ9emxkMmQodmxkb3VibGUpOworICAgIG1hbnQ9ZnJleHAoZCwmZXhwKTsKKyAgICBleHA9KGV4cCsxMjcpJjI1NTsKKyAgICB0PSgodW5zaWduZWQgbG9uZykobWFudCo4Mzg4NjA4KSkmMHhmZmZmZmY7CisgICAgdHw9KChsb25nKWV4cCk8PDI0OworICAgIAorICAgIHQ9KCh0JjB4ZmYpPDwyNCl8KCh0JjB4ZmYwMCk8PDgpfCgodCYweGZmMDAwMCk+PjgpfCgodCYweGZmMDAwMDAwKT4+MjQpOworICAgIHZtYXg9bDJ6bSgobG9uZyl0KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBlbWl0X2llZWUoRklMRSAqZix1bmlvbiBhdHlwcyAqcCxpbnQgdCkKK3sKKyAgdW5zaWduZWQgY2hhciAqaXA9KHVuc2lnbmVkIGNoYXIgKikmcC0+dmRvdWJsZTsKKyAgZW1pdChmLCIweCUwMnglMDJ4LDB4JTAyeCUwMngiLGlwWzFdLGlwWzBdLGlwWzNdLGlwWzJdKTsKKyAgaWYodD09RE9VQkxFfHx0PT1MRE9VQkxFKQorICAgIGVtaXQoZiwiLDB4JTAyeCUwMngsMHglMDJ4JTAyeCIsaXBbNV0saXBbNF0saXBbN10saXBbNl0pOworICBlbWl0KGYsIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfbG9ieXRlKEZJTEUgKmYsb2JqICpvLGludCB0KQoreworICBpZihvLT5mbGFncyZLT05TVCl7CisgICAgaWYoby0+ZmxhZ3MmRFJFRk9CSil7CisgICAgICBldmFsX2NvbnN0KCZvLT52YWwsby0+ZHR5cCk7CisgICAgICAgZW1pdChmLCIlZCIsem0ybCh2bWF4KSk7CisgICAgfWVsc2V7CisgICAgICBldmFsX2NvbnN0KCZvLT52YWwsdCk7CisgICAgICBpZihJU0ZMT0FUKHQpKSBjbnZfZnAoKTsKKyAgICAgIGVtaXQoZiwiIyVkIix6bTJsKHZtYXgpJjI1NSk7CisgICAgfQorICB9ZWxzZSBpZihvLT5mbGFncyZWQVJBRFIpeworICAgIGVtaXQoZiwiIzwoIik7CisgICAgZW1pdF9vYmooZixvLHQpOworICAgIGVtaXQoZiwiKSIpOworICB9ZWxzZSBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgaWYoIXJlZ19wYWlyKG8tPnJlZywmcnApKQorICAgICAgZW1pdChmLCIlcyIsbXJlZ25hbWVzW28tPnJlZ10pOworICAgIGVsc2UKKyAgICAgIGVtaXQoZiwiJXMiLG1yZWduYW1lc1tycC5yMV0pOworICB9ZWxzZXsKKyAgICBlbWl0X29iaihmLG8sdCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgZW1pdF9oaWJ5dGUoRklMRSAqZixvYmogKm8saW50IHQpCit7CisgIGlmKG8tPmZsYWdzJktPTlNUKXsKKyAgICBpZihvLT5mbGFncyZEUkVGT0JKKXsKKyAgICAgIGV2YWxfY29uc3QoJm8tPnZhbCxvLT5kdHlwKTsKKyAgICAgIGVtaXQoZiwiJWQiLHptMmwodm1heCkrMSk7CisgICAgfWVsc2V7CisgICAgICBldmFsX2NvbnN0KCZvLT52YWwsdCk7CisgICAgICBpZihJU0ZMT0FUKHQpKSBjbnZfZnAoKTsKKyAgICAgIGVtaXQoZiwiIyVkIiwoem0ybCh2bWF4KT4+OCkmMjU1KTsKKyAgICB9CisgIH1lbHNlIGlmKG8tPmZsYWdzJlZBUkFEUil7CisgICAgZW1pdChmLCIjPigiKTsKKyAgICBlbWl0X29iaihmLG8sdCk7CisgICAgZW1pdChmLCIpIik7CisgIH1lbHNlIGlmKChvLT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKyAgICBpZihvLT5yZWc+PUZJUlNUX0JJRyYmby0+cmVnPD1MQVNUX0JJR1ApeworICAgICAgZW1pdChmLCIlcysxIixtcmVnbmFtZXNbby0+cmVnXSk7CisgICAgfWVsc2V7CisgICAgICBpZighcmVnX3BhaXIoby0+cmVnLCZycCkpCisJaWVycm9yKDApOworICAgICAgZW1pdChmLCIlcyIsbXJlZ25hbWVzW3JwLnIyXSk7CisgICAgfQorICB9ZWxzZXsKKyAgICBpZihvLT5mbGFncyZWQVJBRFIpCisgICAgICBlbWl0KGYsIiMiKTsKKyAgICBpZighKG8tPmZsYWdzJkRSRUZPQkopKQorICAgICAgby0+dmFsLnZtYXg9em1hZGQoby0+dmFsLnZtYXgsWjEpOworICAgIGVtaXRfb2JqKGYsbyx0KTsKKyAgICBpZighKG8tPmZsYWdzJkRSRUZPQkopKQorICAgICAgby0+dmFsLnZtYXg9em1zdWIoby0+dmFsLnZtYXgsWjEpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfYnl0ZTMoRklMRSAqZixvYmogKm8saW50IHQpCit7CisgIGlmKG8tPmZsYWdzJktPTlNUKXsKKyAgICBpZihvLT5mbGFncyZEUkVGT0JKKXsKKyAgICAgIGV2YWxfY29uc3QoJm8tPnZhbCxvLT5kdHlwKTsKKyAgICAgIGVtaXQoZiwiJWQiLHptMmwodm1heCkrMik7CisgICAgfWVsc2V7CisgICAgICBldmFsX2NvbnN0KCZvLT52YWwsdCk7CisgICAgICBpZihJU0ZMT0FUKHQpKSBjbnZfZnAoKTsKKyAgICAgIGVtaXQoZiwiIyVkIiwoem0ybCh2bWF4KT4+MTYpJjI1NSk7CisgICAgfQorICB9ZWxzZSBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgZW1pdChmLCIlcysyIixtcmVnbmFtZXNbby0+cmVnXSk7CisgIH1lbHNlIGlmKG8tPmZsYWdzJlZBUkFEUil7CisgICAgZW1pdChmLCIjJWQiLGJhbmsoby0+dikpOworICB9ZWxzZXsKKyAgICBpZighKG8tPmZsYWdzJkRSRUZPQkopKQorICAgICAgby0+dmFsLnZtYXg9em1hZGQoby0+dmFsLnZtYXgsbDJ6bSgyTCkpOworICAgIGVtaXRfb2JqKGYsbyx0KTsKKyAgICBpZighKG8tPmZsYWdzJkRSRUZPQkopKQorICAgICAgby0+dmFsLnZtYXg9em1zdWIoby0+dmFsLnZtYXgsbDJ6bSgyTCkpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfYnl0ZTQoRklMRSAqZixvYmogKm8saW50IHQpCit7CisgIGlmKG8tPmZsYWdzJktPTlNUKXsKKyAgICBpZihvLT5mbGFncyZEUkVGT0JKKXsKKyAgICAgIGV2YWxfY29uc3QoJm8tPnZhbCxvLT5kdHlwKTsKKyAgICAgIGVtaXQoZiwiJWQiLHptMmwodm1heCkrMyk7CisgICAgfWVsc2V7CisgICAgICBldmFsX2NvbnN0KCZvLT52YWwsdCk7CisgICAgICBpZihJU0ZMT0FUKHQpKSBjbnZfZnAoKTsKKyAgICAgIGVtaXQoZiwiIyVkIiwoem0ybCh2bWF4KT4+MjQpJjI1NSk7CisgICAgfQorICB9ZWxzZSBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgZW1pdChmLCIlcyszIixtcmVnbmFtZXNbby0+cmVnXSk7CisgIH1lbHNleworICAgIGlmKCEoby0+ZmxhZ3MmRFJFRk9CSikpCisgICAgICBvLT52YWwudm1heD16bWFkZChvLT52YWwudm1heCxsMnptKDNMKSk7CisgICAgZW1pdF9vYmooZixvLHQpOworICAgIGlmKCEoby0+ZmxhZ3MmRFJFRk9CSikpCisgICAgICBvLT52YWwudm1heD16bXN1YihvLT52YWwudm1heCxsMnptKDNMKSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgZG9fbG9ieXRlKEZJTEUgKmYsY2hhciAqcyxvYmogKm8saW50IHR5cGUpCit7CisgIGlmKG8tPmFtKXsKKyAgICBpZihvLT5hbS0+ZmxhZ3M9PUlNTV9JTkQpCisgICAgICBzZXR5KGYsby0+YW0tPm9mZnNldCk7CisgICAgZWxzZSBpZihvLT5hbS0+ZmxhZ3M9PUdQUl9JTkR8fG8tPmFtLT5mbGFncz09QUJTX0lORCl7CisgICAgICBpZihvLT5hbS0+b2Zmc2V0PT1yYSkKKwllbWl0KGYsIlx0dGF5XG4iKTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIlx0bGR5XHQlc1xuIixtcmVnbmFtZXNbby0+YW0tPmlkeF0pOworICAgICAgeXZhbD1OT1ZBTDsKKyAgICB9ZWxzZQorICAgICAgaWVycm9yKDApOworICB9ZWxzZSBpZigoby0+ZmxhZ3MmKERSRUZPQkp8S09OU1QpKT09RFJFRk9CSil7CisgICAgc2V0eShmLDApOworICB9ZWxzZSBpZigoby0+ZmxhZ3MmKFZBUnxSRUd8VkFSQURSKSk9PVZBUiYmKG8tPnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fG8tPnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKSl7CisgICAgc2V0eShmLChpbnQpcmVhbF9vZmZzZXQobykpOworICB9CisgIGVtaXQoZiwiXHQlc1x0IixzKTsKKyAgZW1pdF9sb2J5dGUoZixvLHR5cGUpOworICBlbWl0KGYsIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2hpYnl0ZShGSUxFICpmLGNoYXIgKnMsb2JqICpvLGludCB0eXBlKQoreworICBpbnQgYW1pPTA7CisgIGlmKG8tPmFtKXsKKyAgICBpZihvLT5hbS0+ZmxhZ3M9PUlNTV9JTkQpCisgICAgICBzZXR5KGYsby0+YW0tPm9mZnNldCsxKTsKKyAgICBlbHNlIGlmKG8tPmFtLT5mbGFncz09QUJTX0lORCl7CisgICAgICBpZihvLT5hbS0+b2Zmc2V0PT1yYSkKKwllbWl0KGYsIlx0dGF5XG4iKTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIlx0bGR5XHQlc1xuIixtcmVnbmFtZXNbby0+YW0tPmlkeF0pOworICAgICAgby0+YW0tPm9mZnNldCsrO2FtaT0xOworICAgICAgeXZhbD1OT1ZBTDsKKyAgICB9ZWxzZQorICAgICAgaWVycm9yKDApOworICB9ZWxzZSAgaWYoKG8tPmZsYWdzJihEUkVGT0JKfEtPTlNUKSk9PURSRUZPQkopeworICAgIHNldHkoZiwxKTsKKyAgfWVsc2UgaWYoKG8tPmZsYWdzJihWQVJ8UkVHfFZBUkFEUikpPT1WQVImJihvLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikpeworICAgIHNldHkoZiwoaW50KXJlYWxfb2Zmc2V0KG8pKzEpOworICB9CisgIGVtaXQoZiwiXHQlc1x0IixzKTsKKyAgZW1pdF9oaWJ5dGUoZixvLHR5cGUpOworICBlbWl0KGYsIlxuIik7CisgIGlmKGFtaSkgby0+YW0tPm9mZnNldC0tOworfQorCitzdGF0aWMgdm9pZCBkb19ieXRlMyhGSUxFICpmLGNoYXIgKnMsb2JqICpvLGludCB0eXBlKQoreworICBpbnQgYW1pPTA7CisgIGlmKG8tPmFtKXsKKyAgICBpZihvLT5hbS0+ZmxhZ3M9PUlNTV9JTkQpCisgICAgICBzZXR5KGYsby0+YW0tPm9mZnNldCsyKTsKKyAgICBlbHNlIGlmKG8tPmFtLT5mbGFncz09QUJTX0lORCl7CisgICAgICBpZihvLT5hbS0+b2Zmc2V0PT1yYSkKKwllbWl0KGYsIlx0dGF5XG4iKTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIlx0bGR5XHQlc1xuIixtcmVnbmFtZXNbby0+YW0tPmlkeF0pOworICAgICAgeXZhbD1OT1ZBTDsKKyAgICAgIG8tPmFtLT5vZmZzZXQrPTI7YW1pPTE7CisgICAgfWVsc2UKKyAgICAgIGllcnJvcigwKTsKKyAgfWVsc2UgIGlmKChvLT5mbGFncyYoRFJFRk9CSnxLT05TVCkpPT1EUkVGT0JKKXsKKyAgICBzZXR5KGYsMik7CisgIH1lbHNlIGlmKChvLT5mbGFncyYoVkFSfFJFR3xWQVJBRFIpKT09VkFSJiYoby0+di0+c3RvcmFnZV9jbGFzcz09QVVUT3x8by0+di0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpKXsKKyAgICBzZXR5KGYsKGludClyZWFsX29mZnNldChvKSsyKTsKKyAgfQorICBlbWl0KGYsIlx0JXNcdCIscyk7CisgIGVtaXRfYnl0ZTMoZixvLHR5cGUpOworICBlbWl0KGYsIlxuIik7CisgIGlmKGFtaSkgby0+YW0tPm9mZnNldC09MjsKK30KKworc3RhdGljIHZvaWQgZG9fYnl0ZTQoRklMRSAqZixjaGFyICpzLG9iaiAqbyxpbnQgdHlwZSkKK3sKKyAgaW50IGFtaT0wOworICBpZihvLT5hbSl7CisgICAgaWYoby0+YW0tPmZsYWdzPT1JTU1fSU5EKQorICAgICAgc2V0eShmLG8tPmFtLT5vZmZzZXQrMyk7CisgICAgZWxzZSBpZihvLT5hbS0+ZmxhZ3M9PUFCU19JTkQpeworICAgICAgaWYoby0+YW0tPm9mZnNldD09cmEpCisJZW1pdChmLCJcdHRheVxuIik7CisgICAgICBlbHNlCisJZW1pdChmLCJcdGxkeVx0JXNcbiIsbXJlZ25hbWVzW28tPmFtLT5pZHhdKTsKKyAgICAgIHl2YWw9Tk9WQUw7CisgICAgICBvLT5hbS0+b2Zmc2V0Kz0zO2FtaT0xOworICAgIH1lbHNlCisgICAgICBpZXJyb3IoMCk7CisgIH1lbHNlICBpZigoby0+ZmxhZ3MmKERSRUZPQkp8S09OU1QpKT09RFJFRk9CSil7CisgICAgc2V0eShmLDMpOworICB9ZWxzZSBpZigoby0+ZmxhZ3MmKFZBUnxSRUd8VkFSQURSKSk9PVZBUiYmKG8tPnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fG8tPnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKSl7CisgICAgc2V0eShmLChpbnQpcmVhbF9vZmZzZXQobykrMyk7CisgIH0KKyAgZW1pdChmLCJcdCVzXHQiLHMpOworICBlbWl0X2J5dGU0KGYsbyx0eXBlKTsKKyAgZW1pdChmLCJcbiIpOworICBpZihhbWkpIG8tPmFtLT5vZmZzZXQtPTM7Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfbG9ieXRlKEZJTEUgKmYsb2JqICpvLGludCB0KQoreworICBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgaWYoby0+cmVnPT1yYXx8by0+cmVnPT1yYXgpCisgICAgICByZXR1cm47CisgICAgaWYoby0+cmVnPT1yeCl7CisgICAgICBlbWl0KGYsIlx0dHhhXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgZG9fbG9ieXRlKGYsImxkYSIsbyx0KTsKK30KKworc3RhdGljIHZvaWQgbG9hZF9oaWJ5dGUoRklMRSAqZixvYmogKm8saW50IHQpCit7CisgIGlmKChvLT5mbGFncyZSRUcpJiYoby0+cmVnPT1yeHx8by0+cmVnPT1yYXgpKQorICAgIGVtaXQoZiwiXHR0eGFcbiIpOworICBlbHNlCisgICAgZG9faGlieXRlKGYsImxkYSIsbyx0KTsKK30KKworc3RhdGljIHZvaWQgc3RvcmVfbG9ieXRlKEZJTEUgKmYsb2JqICpvLGludCB0KQoreworICBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgaWYoby0+cmVnPT1yYXx8by0+cmVnPT1yYXgpCisgICAgICByZXR1cm47CisgICAgaWYoby0+cmVnPT1yeCl7CisgICAgICBlbWl0KGYsIlx0dGF4XG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgZG9fbG9ieXRlKGYsInN0YSIsbyx0KTsKK30KKworc3RhdGljIHZvaWQgc3RvcmVfaGlieXRlKEZJTEUgKmYsb2JqICpvLGludCB0KQoreworICBpZigoby0+ZmxhZ3MmUkVHKSYmKG8tPnJlZz09cnh8fG8tPnJlZz09cmF4KSkKKyAgICBlbWl0KGYsIlx0dGF4XG4iKTsKKyAgZWxzZQorICAgIGRvX2hpYnl0ZShmLCJzdGEiLG8sdCk7Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfYWNjKEZJTEUgKmYsb2JqICpvLGludCB0eXBlKQoreworICBpZigoby0+ZmxhZ3MmUkVHKSYmKG8tPnJlZz09cmF8fG8tPnJlZz09cmF4KSkKKyAgICByZXR1cm47CisgIGlmKCFJU0NIQVIodHlwZSkpeworICAgIGlmKGluZGlyZWN0KG8pKXsKKyAgICAgIGRvX2hpYnl0ZShmLCJsZGEiLG8sdHlwZSk7CisgICAgICBlbWl0KGYsIlx0dGF4XG4iKTsKKyAgICB9ZWxzZQorICAgICAgZG9faGlieXRlKGYsImxkeCIsbyx0eXBlKTsKKyAgfQorICBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmby0+cmVnPT1yeCkKKyAgICBlbWl0KGYsIlx0dHhhXG4iKTsKKyAgZWxzZQorICAgIGRvX2xvYnl0ZShmLCJsZGEiLG8sdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3JlX2FjYyhGSUxFICpmLG9iaiAqbyxpbnQgdHlwZSkKK3sKKyAgaWYoKG8tPmZsYWdzJihEUkVGT0JKfEtPTlNUKSk9PURSRUZPQkomJigoIShvLT5mbGFncyZSRUcpKXx8IWlzcHRyKG8tPnJlZykpKXsKKyAgICBpZXJyb3IoMCk7CisgIH0KKyAgaWYoKG8tPmZsYWdzJlJFRykmJihvLT5yZWc9PXJhfHxvLT5yZWc9PXJheCkpCisgICAgcmV0dXJuOworICBpZigoby0+ZmxhZ3MmUkVHKSYmby0+cmVnPT1yeCl7CisgICAgZW1pdChmLCJcdHRheFxuIik7CisgICAgcmV0dXJuOworICB9CisgIHN0b3JlX2xvYnl0ZShmLG8sdHlwZSk7CisgIGlmKCFJU0NIQVIodHlwZSkpeworICAgIGlmKGluZGlyZWN0KG8pKXsKKyAgICAgIC8qVE9ETzogc2F2ZSBhY2N1ICovCisgICAgICBlbWl0KGYsIlx0dHhhXG4iKTsKKyAgICAgIHN0b3JlX2hpYnl0ZShmLG8sdHlwZSk7CisgICAgfWVsc2UKKyAgICAgIGRvX2hpYnl0ZShmLCJzdHgiLG8sdHlwZSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgbG9hZF9yZWcoRklMRSAqZixpbnQgcixzdHJ1Y3Qgb2JqICpvLGludCB0eXBlKQoreworICBzdGF0aWMgb2JqIHJvOworICByby5mbGFncz1SRUc7CisgIHJvLnJlZz1yOworICBsb2FkX2xvYnl0ZShmLG8sdHlwZSk7CisgIHN0b3JlX2xvYnl0ZShmLCZybyx0eXBlKTsKKyAgaWYoIUlTQ0hBUih0eXBlKSl7CisgICAgbG9hZF9oaWJ5dGUoZixvLHR5cGUpOworICAgIHN0b3JlX2hpYnl0ZShmLCZybyx0eXBlKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBzdG9yZV9yZWcoRklMRSAqZixpbnQgcixzdHJ1Y3Qgb2JqICpvLGludCB0eXBlKQoreworICBzdGF0aWMgb2JqIHJvOworICBpZihyPT1yeCl7CisgICAgaWYoKG8tPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpeworICAgICAgaWYoby0+cmVnPT1yeCkKKwlyZXR1cm47CisgICAgICBpZihvLT5yZWc9PXJhKXsKKwllbWl0KGYsIlx0dHhhXG4iKTsKKwlyZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisgIHJvLmZsYWdzPVJFRzsKKyAgcm8ucmVnPXI7CisgIGlmKHIhPXJhJiZyIT1yYXgpCisgICAgbG9hZF9hY2MoZiwmcm8sdHlwZSk7CisgIHN0b3JlX2FjYyhmLG8sdHlwZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnBjb25zdGxpc3QgeworICBzdHJ1Y3QgZnBjb25zdGxpc3QgKm5leHQ7CisgIGludCBsYWJlbDsKKyAgaW50IHQ7CisgIHVuaW9uIGF0eXBzIHZhbDsKK30gKmZpcnN0ZnBjOworCitzdGF0aWMgaW50IGFkZGZwY29uc3Qoc3RydWN0IG9iaiAqbyxpbnQgdCkKK3sKKyAgc3RydWN0IGZwY29uc3RsaXN0ICpwPWZpcnN0ZnBjOworICB0Jj1OUTsKKyAgaWYodD09TERPVUJMRSkgdD1ET1VCTEU7CisgIGZvcihwPWZpcnN0ZnBjO3A7cD1wLT5uZXh0KXsKKyAgICBpZih0PT1wLT50KXsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnZhbCx0KTsKKyAgICAgIGlmKHQ9PUZMT0FUJiZ6bGRlcXRvKHZsZG91YmxlLHpmMnpsZChvLT52YWwudmZsb2F0KSkpIHJldHVybiBwLT5sYWJlbDsKKyAgICAgIGlmKHQ9PURPVUJMRSYmemxkZXF0byh2bGRvdWJsZSx6ZDJ6bGQoby0+dmFsLnZkb3VibGUpKSkgcmV0dXJuIHAtPmxhYmVsOworICAgICAgaWYodD09TE9ORyYmem1lcXRvKHZtYXgsemwyem0oby0+dmFsLnZsb25nKSkpIHJldHVybiBwLT5sYWJlbDsKKyAgICAgIGlmKHQ9PUxMT05HJiZ6bWVxdG8odm1heCx6bGwyem0oby0+dmFsLnZsbG9uZykpKSByZXR1cm4gcC0+bGFiZWw7CisgICAgfQorICB9CisgIHA9bXltYWxsb2Moc2l6ZW9mKHN0cnVjdCBmcGNvbnN0bGlzdCkpOworICBwLT5uZXh0PWZpcnN0ZnBjOworICBwLT50PXQ7CisgIHAtPmxhYmVsPSsrbGFiZWw7CisgIHAtPnZhbD1vLT52YWw7CisgIGZpcnN0ZnBjPXA7CisgIHJldHVybiBwLT5sYWJlbDsKK30KKworLyogZ2VuZXJhdGUgY29kZSB0byBsb2FkIHRoZSBhZGRyZXNzIG9mIGEgbG9jYWwgdmFyaWFibGUgaW50byByZWdpc3RlciByICovCitzdGF0aWMgdm9pZCBsb2FkX2xhZGRyKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbykKK3sKKyAgbG9uZyBsPXJlYWxfb2Zmc2V0KG8pOworICAvKiBhc3N1bWVzIGFjYyBpcyBhdmFpbGFibGUgKi8KKyAgaWYoIXJlZ19wYWlyKHIsJnJwKSkgaWVycm9yKDApOworICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbZnBdKTsKKyAgaWYobCE9MCkKKyAgICBlbWl0KGYsIlx0Y2xjXG4iKTsKKyAgaWYobCYyNTUpCisgICAgZW1pdChmLCJcdGFkY1x0IyVsZFxuIixsJjI1NSk7CisgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMV0pOworICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbZnAyXSk7CisgIGlmKGwhPTApCisgICAgZW1pdChmLCJcdGFkY1x0IyVsZFxuIiwobD4+OCkmMjU1KTsKKyAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIyXSk7Cit9CisKKy8qIGdlbmVyYXRlIGNvZGUgdG8gbG9hZCB0aGUgYWRkcmVzcyBvZiBhIHZhcmlhYmxlIGludG8gcmVnaXN0ZXIgciAqLworc3RhdGljIHZvaWQgbG9hZF9hZGRyZXNzKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdCkKK3sKKyAgaWYoby0+ZmxhZ3MmRFJFRk9CSil7CisgICAgby0+ZmxhZ3MmPX5EUkVGT0JKOworICAgIGxvYWRfcmVnKGYscixvLFBPSU5URVIpOworICAgIG8tPmZsYWdzfD1EUkVGT0JKOworICB9ZWxzZSBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgaWYoIXJlZ19wYWlyKHIsJnJwKSkgaWVycm9yKDApOworICAgIGVtaXQoZiwiXHRsZGFcdCM+JXNcbiIsbXJlZ25hbWVzW28tPnJlZ10pOworICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworICAgIGVtaXQoZiwiXHRsZGFcdCM8JXNcbiIsbXJlZ25hbWVzW28tPnJlZ10pOworICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMV0pOyAgICAKKyAgfWVsc2UgaWYoby0+ZmxhZ3MmVkFSKXsKKyAgICBpZihvLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CisgICAgICBsb2FkX2xhZGRyKGYscixvKTsKKyAgICB9ZWxzZXsKKyAgICAgIG8tPmZsYWdzfD1WQVJBRFI7CisgICAgICBsb2FkX3JlZyhmLHIsbyxQT0lOVEVSKTsKKyAgICAgIG8tPmZsYWdzJj1+VkFSQURSOworICAgIH0KKyAgfWVsc2UgaWYoKG8tPmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKyAgICBpbnQgbD1hZGRmcGNvbnN0KG8sdCk7CisgICAgaWYoIWllZWUpIGllcnJvcigwKTsKKyAgICBpZighcmVnX3BhaXIociwmcnApKSBpZXJyb3IoMCk7CisgICAgZW1pdChmLCJcdGxkYVx0Iz4lcyVkXG4iLGxhYnByZWZpeCxsKTsKKyAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsKKyAgICBlbWl0KGYsIlx0bGRhXHQjPCVzJWRcbiIsbGFicHJlZml4LGwpOworICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMV0pOyAgICAKKyAgfWVsc2UKKyAgICBpZXJyb3IoMCk7Cit9CisKKworLyogIFlpZWxkcyBsb2cyKHgpKzEgb3IgMC4gKi8KK3N0YXRpYyBsb25nIHBvZjIoenVtYXggeCkKK3sKKyAgenVtYXggcDtpbnQgbG49MTsKKyAgcD11bDJ6dW0oMUwpOworICB3aGlsZShsbjw9MzImJnp1bWxlcShwLHgpKXsKKyAgICBpZih6dW1lcXRvKHgscCkpIHJldHVybiBsbjsKKyAgICBsbisrO3A9enVtYWRkKHAscCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGluY21lbShGSUxFICpmLG9iaiAqbyxpbnQgdCxpbnQgb3AsaW50IHgpCit7CisgIGludCBpOworICBjaGFyICpzOworCisgIC8vIFBHUzogQWxsIHJlZ2lzdGVycyBhbmQgcHNldWRvIHJlZ2lzdGVycyBvbiB0aGUgTTY1IHRhcmdldAorICAvLyBsaXZlIGluIHplcm8tcGFnZSwgc28gd2UgY2FuIHVzZSBJTlcgYW5kIERFVyBmb3IgZmFzdAorICAvLyBpbmNyZW1lbnQvZGVjcmVtZW50LgorICBpZiAoby0+ZmxhZ3MmUkVHKSB7CisgICAgc3dpdGNoKG9wKSB7CisgICAgY2FzZSBBREQ6CisgICAgICBpZihJU0NIQVIodCkpeworCWVtaXQoZiwiXHRpbmNcdCIpOworCWVtaXRfb2JqKGYsbyx0KTsKKwllbWl0KGYsIlxuIik7CQorICAgICAgfSBlbHNlIHsKKwllbWl0KGYsIlx0aW53XHQiKTsKKwllbWl0X29iaihmLG8sdCk7CisJZW1pdChmLCJcbiIpOwkKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1VCOgorICAgICAgaWYoSVNDSEFSKHQpKXsKKwllbWl0KGYsIlx0ZGVjXHQiKTsKKwllbWl0X29iaihmLG8sdCk7CisJZW1pdChmLCJcbiIpOwkKKyAgICAgIH0gZWxzZSB7CisJZW1pdChmLCJcdGRld1x0Iik7CisJZW1pdF9vYmooZixvLHQpOworCWVtaXQoZiwiXG4iKTsJCisgICAgICB9CisgICAgICByZXR1cm47CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgCisgIGlmKG9wPT1BREQpCisgICAgcz0iaW5jIjsKKyAgZWxzZSBpZihvcD09U1VCKQorICAgIHM9ImRlYyI7CisgIGVsc2UgaWYob3A9PUxTSElGVCkKKyAgICBzPSJhc2wiOworICBlbHNlIGlmKG9wPT1SU0hJRlQmJih0JlVOU0lHTkVEKSkKKyAgICBzPSJjbGNcblx0cm9yIjsKKyAgZWxzZSBpZihvcD09UlNISUZUKXsKKyAgICBzPSJjbXBcdCMxMjhcblx0cm9yIjsKKyAgfWVsc2UKKyAgICBpZXJyb3IoMCk7CisgIGlmKElTQ0hBUih0KSl7CisgICAgZm9yKGk9MDtpPHg7aSsrKXsKKyAgICAgIGVtaXQoZiwiXHQlc1x0IixzKTsKKyAgICAgIGVtaXRfb2JqKGYsbyx0KTsKKyAgICAgIGVtaXQoZiwiXG4iKTsKKyAgICB9CisgIH1lbHNleworICAgIGZvcihpPTA7aTx4O2krKyl7CisgICAgICBpZihvcD09U1VCKXsKKwkvKiBjYWxsZXIgbXVzIG1ha2Ugc3VyZSBhY2N1IGlzIGF2YWlsYWJsZSAqLworCWxvYWRfbG9ieXRlKGYsbyx0KTsKKwllbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwllbWl0KGYsIlx0ZGVjXHQiKTsKKwllbWl0X2hpYnl0ZShmLG8sdCk7CisJZW1pdChmLCJcbiIpOworCWVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwllbWl0KGYsIlx0ZGVjXHQiKTsKKwllbWl0X2xvYnl0ZShmLG8sdCk7CisJZW1pdChmLCJcbiIpOwkKKyAgICAgIH1lbHNlIGlmKG9wPT1BREQpeworCWVtaXQoZiwiXHQlc1x0IixzKTsKKwllbWl0X2xvYnl0ZShmLG8sdCk7CisJZW1pdChmLCJcbiIpOworCWVtaXQoZiwiXHRibmVcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCWVtaXQoZiwiXHQlc1x0IixzKTsKKwllbWl0X2hpYnl0ZShmLG8sdCk7CisJZW1pdChmLCJcbiIpOworCWVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKyAgICAgIH1lbHNlIGlmKG9wPT1MU0hJRlQpeworCS8vIDQ1MTAgLyA0NUdTMDIgaGF2ZSBBU1cvUk9XIG9wZXJhdGlvbnMKKwkvLyBmb3IgbGVmdC1zaGlmdGluZyAxNi1iaXQgdmFsdWVzCisJCisJZW1pdChmLCJcdGFzd1x0Iik7CisJZW1pdF9sb2J5dGUoZixvLHQpOworCWVtaXQoZiwiXG4iKTsKKworICAgICAgfWVsc2UgaWYob3A9PVJTSElGVCYmKHQmVU5TSUdORUQpKXsKKwllbWl0KGYsIlx0Y2xjXG4iKTsKKwllbWl0KGYsIlx0cm9yXHQiKTsKKwllbWl0X2hpYnl0ZShmLG8sdCk7CisJZW1pdChmLCJcbiIpOworCWVtaXQoZiwiXHRyb3JcdCIpOworCWVtaXRfbG9ieXRlKGYsbyx0KTsKKwllbWl0KGYsIlxuIik7CisgICAgICB9ZWxzZSBpZihvcD09UlNISUZUKXsKKwlsb2FkX2hpYnl0ZShmLG8sdCk7CisJZW1pdChmLCJcdGNtcFx0IzEyOFxuIik7CisJZW1pdChmLCJcdHJvclx0Iik7CisJZW1pdF9oaWJ5dGUoZixvLHQpOworCWVtaXQoZiwiXG4iKTsKKwllbWl0KGYsIlx0cm9yXHQiKTsKKwllbWl0X2xvYnl0ZShmLG8sdCk7CisJZW1pdChmLCJcbiIpOwkKKyAgICAgIH1lbHNleworCXByaW50Zigib3A9JWRcbiIsb3ApOworCWllcnJvcigwKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgcHJlbG9hZF9vYmooRklMRSAqZixJQyAqcCxvYmogKm8pCit7CisgIGludCByO2xvbmcgb2Y7CisKKyAgaWYoKHAtPnR5cGYmVk9MQVRJTEUpfHwocC0+dHlwZjImVk9MQVRJTEUpfHwKKyAgICAgKChwLT5xMS5mbGFncyZEUkVGT0JKKSYmKHAtPnExLmR0eXAmKFZPTEFUSUxFfFBWT0xBVElMRSkpKXx8CisgICAgICgocC0+cTIuZmxhZ3MmRFJFRk9CSikmJihwLT5xMi5kdHlwJihWT0xBVElMRXxQVk9MQVRJTEUpKSl8fAorICAgICAoKHAtPnouZmxhZ3MmRFJFRk9CSikmJihwLT56LmR0eXAmKFZPTEFUSUxFfFBWT0xBVElMRSkpKSkKKyAgICBlbWl0KGYsIjsgdm9sYXRpbGUgYmFycmllclxuIik7CisKKworICBpZigoby0+ZmxhZ3MmKFZBUnxSRUcpKT09VkFSJiYoby0+di0+c3RvcmFnZV9jbGFzcz09QVVUT3x8by0+di0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpJiYob2Y9cmVhbF9vZmZzZXQobykpK3ptMmwoc3pvZihvLT52LT52dHlwKSk+MjU1KXsKKyAgICByPWdldF9yZWcoZixwLFBPSU5URVIpOworICAgIGlmKG8tPmZsYWdzJkRSRUZPQkopCisgICAgICBnZXRfYWNjKGYscCxJTlQpOworICAgIGVsc2UKKyAgICAgIGNtcF9nZXRfYWNjKGYscCwwKTsKKyAgICBpZighcmVnX3BhaXIociwmcnApKSBpZXJyb3IoMCk7CisgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW2ZwMV0pOworICAgIGVtaXQoZiwiXHRjbGNcbiIpOworICAgIGlmKG9mJjB4ZmYpCisgICAgICBlbWl0KGYsIlx0YWRjXHQjJWxkXG4iLG9mJjB4ZmYpOworICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMV0pOworICAgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tmcDJdKTsKKyAgICBpZigxLypvZiYweGZmMDAqLykKKyAgICAgIGVtaXQoZiwiXHRhZGNcdCMlbGRcbiIsKG9mPj44KSYweGZmKTsKKyAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsKKyAgICBvLT5mbGFnc3w9UkVHOworICAgIG8tPnJlZz1yOworICAgIGlmKG8tPmZsYWdzJkRSRUZPQkopeworICAgICAgc2V0eShmLDApOworICAgICAgZW1pdChmLCJcdGxkYVx0KCVzKSx5XG4iLG1yZWduYW1lc1tyXSk7CisgICAgICBlbWl0KGYsIlx0dHhhXG4iKTsKKyAgICAgIHNldHkoZiwxKTsKKyAgICAgIGVtaXQoZiwiXHRsZGFcdCglcykseVxuIixtcmVnbmFtZXNbcl0pOworICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIyXSk7CisgICAgICBlbWl0KGYsIlx0c3R4XHQlc1xuIixtcmVnbmFtZXNbcnAucjFdKTsKKyAgICB9ZWxzZXsKKyAgICAgIG8tPmZsYWdzfD1EUkVGT0JKOworICAgICAgby0+ZHR5cD1QT0lOVEVSOworICAgIH0KKyAgfQorCisgIGlmKChvLT5mbGFncyYoRFJFRk9CSnxLT05TVCkpPT1EUkVGT0JKJiYoIShvLT5mbGFncyZSRUcpfHwhaXNwdHIoby0+cmVnKSkmJighKG8tPmZsYWdzJlZBUil8fCEoby0+di0+dGF0dHImWlBBR0UpKSYmIUlTRlBPSU5URVIoby0+ZHR5cCkpeworICAgIGNtcF9nZXRfYWNjKGYscCwwKTsKKyAgICByPWdldF9yZWcoZixwLFBPSU5URVIpOworICAgIG8tPmZsYWdzJj1+RFJFRk9CSjsKKyAgICBsb2FkX3JlZyhmLHIsbyxQT0lOVEVSKTsKKyAgICBvLT5mbGFnc3w9UkVHfERSRUZPQko7CisgICAgby0+cmVnPXI7CisgIH0KK30KKworc3RhdGljIHZvaWQgZmFyX2NvcHkoRklMRSAqZixJQyAqcCkKK3sKKyAgaW50IGI7bG9uZyBsOworICBnZXRfYWNjKGYscCxJTlQpOworICBpZihwLT5jb2RlPT1QVVNIKXsKKyAgICBpZighcmVnX3BhaXIoTEFTVF9QQUlSLCZycCkpIGllcnJvcigwKTsKKyAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbc3BdKTsKKyAgICBpZihwdXNoZWQpIGVtaXQoZiwiXHRjbGNcbiIpOworICAgIGlmKHB1c2hlZCYweGZmKSBlbWl0KGYsIlx0YWRjXHQjJWRcbiIsKHB1c2hlZCYweGZmKSk7CisgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisgICAgZW1pdChmLCJcdGxkYVx0JXMrMVxuIixtcmVnbmFtZXNbc3BdKTsKKyAgICBpZihwdXNoZWQpIGVtaXQoZiwiXHRhZGNcdCMlZFxuIiwoKHB1c2hlZD4+OCkmMHhmZikpOworICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworICAgIHB1c2hlZCs9em0ybChwLT5xMi52YWwudm1heCk7CisgICAgZW1pdChmLCJcdGxkeFx0IyVkXG4iLGJhbmtjbnVtKTsKKyAgfWVsc2UgaWYocC0+ei5mbGFncyZEUkVGT0JKKXsKKyAgICBpZighcmVnX3BhaXIoTEFTVF9QQUlSLCZycCkpIGllcnJvcigwKTsKKyAgICBwLT56LmZsYWdzJj1+RFJFRk9CSjsKKyAgICBsb2FkX2xvYnl0ZShmLCZwLT56LEZQT0lOVEVSKTsKKyAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAucjFdKTsKKyAgICBsb2FkX2hpYnl0ZShmLCZwLT56LEZQT0lOVEVSKTsKKyAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsKKyAgICBpZihpbmRpcmVjdCgmcC0+eikpeworICAgICAgZG9fYnl0ZTMoZiwibGRhIiwmcC0+eixGUE9JTlRFUik7CisgICAgICBlbWl0KGYsIlx0dGF4XG4iKTsKKyAgICB9ZWxzZQorICAgICAgZG9fYnl0ZTMoZiwibGR4IiwmcC0+eixGUE9JTlRFUik7CisgIH1lbHNleworICAgIGxvYWRfYWRkcmVzcyhmLExBU1RfUEFJUiwmcC0+eixQT0lOVEVSKTsKKyAgICBiPWJhbmsocC0+ei52KTsKKyAgICBlbWl0KGYsIlx0bGR4XHQjJWRcbiIsYj49MD9iOmJhbmtjbnVtKTsKKyAgfQorICBpZihwLT5xMS5mbGFncyZEUkVGT0JKKXsKKyAgICBpZighcmVnX3BhaXIoTEFTVF9QQUlSLTEsJnJwKSkgaWVycm9yKDApOworICAgIHAtPnExLmZsYWdzJj1+RFJFRk9CSjsKKyAgICBsb2FkX2xvYnl0ZShmLCZwLT5xMSxGUE9JTlRFUik7CisgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisgICAgbG9hZF9oaWJ5dGUoZiwmcC0+cTEsRlBPSU5URVIpOworICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworICAgIGlmKGluZGlyZWN0KCZwLT5xMSkpeworICAgICAgZG9fYnl0ZTMoZiwibGRhIiwmcC0+cTEsRlBPSU5URVIpOworICAgICAgZW1pdChmLCJcdHRheVxuIik7CisgICAgfWVsc2UKKyAgICAgIGRvX2J5dGUzKGYsImxkeSIsJnAtPnExLEZQT0lOVEVSKTsKKyAgfWVsc2V7CisgICAgbG9hZF9hZGRyZXNzKGYsTEFTVF9QQUlSLTEsJnAtPnExLFBPSU5URVIpOworICAgIGI9YmFuayhwLT5xMS52KTsKKyAgICBzZXR5KGYsYj49MD9iOmJhbmtjbnVtKTsKKyAgfQorICBsPXptMmwocC0+cTIudmFsLnZtYXgpOworICBlbWl0KGYsIlx0bGRhXHQjJWRcbiIsKGw+PjgpJjB4ZmYpOworICBlbWl0KGYsIlx0c3RhXHQlc19fYmFua2NvcHlfbGVuKzFcbiIsaWRwcmVmaXgpOworICBlbWl0KGYsIlx0bGRhXHQjJWRcbiIsKGwpJjB4ZmYpOworICBlbWl0KGYsIlx0c3RhXHQlc19fYmFua2NvcHlfbGVuXG4iLGlkcHJlZml4KTsKKyAgZW1pdChmLCJcdGxkYVx0IyVkXG4iLGNiYW5rPj0wP2NiYW5rOmJhbmtjbnVtKTsKKyAgZW1pdChmLCJcdGpzclx0JXNfX2Jhbmtjb3B5XG4iLGlkcHJlZml4KTsKKyAgeXZhbD1OT1ZBTDsKK30KKworc3RhdGljIHZvaWQgbG9hZF9mYXIoRklMRSAqZixJQyAqcCxvYmogKm8saW50IHQpCit7CisgIGludCBwdXNoZWQ9MDsKKyAgaWYoIShvLT5mbGFncyZEUkVGT0JKKSkgaWVycm9yKDApOworICBvLT5mbGFncyY9fkRSRUZPQko7CisgIHQmPU5ROworICBpZih6bWVxdG8oc2l6ZXRhYlt0XSxaMCkpIHJldHVybjsKKyAgLypnZXRfYWNjKGYscCxJTlQpOyovCisgIGlmKHB1c2hlZGFjYz09dDN8fHB1c2hlZGFjYz09dDQpIGllcnJvcigwKTsKKyAgaWYocHVzaGVkeD09dDN8fHB1c2hlZHg9PXQ0KSBpZXJyb3IoMCk7CisgIGlmKHJlZ3NbcmFdfHxyZWdzW3JheF0peworICAgIGlmKGlzYWNjKHExKXx8aXNhY2MocTIpfHwhaXNhY2MoeikpeworICAgICAgcHVzaGVkPTE7CisgICAgICBlbWl0KGYsIlx0cGhhXG4iKTsKKyAgICAgIGlmKHJlZ3NbcmF4XSkgZW1pdChmLCJcdHR4YVxuXHRwaGFcbiIpOworICAgIH0KKyAgfQorICBsb2FkX3JlZyhmLExBU1RfUEFJUixvLFBPSU5URVIpOworICBpZighaW5kaXJlY3QobykpCisgICAgZG9fYnl0ZTMoZiwibGR5IixvLENIQVIpOworICBlbHNleworICAgIGRvX2J5dGUzKGYsImxkYSIsbyxDSEFSKTsKKyAgICBlbWl0KGYsIlx0dGF5XG4iKTsKKyAgfQorICBlbWl0KGYsIlx0bGR4XHQjJWRcbiIsYmFua3ZvZmZzZXQpOworICBlbWl0KGYsIlx0bGRhXHQjJWRcbiIsY2Jhbms+PTA/Y2Jhbms6YmFua2NudW0pOworICBlbWl0KGYsIlx0anNyXHQlc19fYmFua2xvYWQlZFxuIixpZHByZWZpeCwoaW50KXptMmwoc2l6ZXRhYlt0XSkpOworICB5dmFsPU5PVkFMOworICBvLT5mbGFncz1WQVI7CisgIG8tPnY9JmJhbmt2OworICBvLT52YWwudm1heD1sMnptKChsb25nKWJhbmt2b2Zmc2V0KTsKKyAgYmFua3ZvZmZzZXQrPXptMmwoc2l6ZXRhYlt0XSk7CisgIGlmKHB1c2hlZCl7CisgICAgaWYocmVnc1tyYXhdKSBlbWl0KGYsIlx0cGxhXG5cdHRheFxuIik7CisgICAgZW1pdChmLCJcdHBsYVxuIik7CisgIH0KK30KKworc3RhdGljIHZvaWQgbG9hZF9iYW5rZWQoRklMRSAqZixJQyAqcCxvYmogKm8saW50IHQpCit7CisgIGludCBwdXNoZWQ9MCxtOworICBpZihvLT5mbGFncyZEUkVGT0JKKSB0PW8tPmR0eXA7CisgIHQmPU5ROworICBpZih6bWVxdG8oc2l6ZXRhYlt0XSxaMCkpIHJldHVybjsKKyAgLypnZXRfYWNjKGYscCxJTlQpOyovCisgIGlmKHB1c2hlZGFjYz09dDN8fHB1c2hlZGFjYz09dDQpIGllcnJvcigwKTsKKyAgaWYocHVzaGVkeD09dDN8fHB1c2hlZHg9PXQ0KSBpZXJyb3IoMCk7CisgIGlmKHJlZ3NbcmFdfHxyZWdzW3JheF0peworICAgIGlmKGlzYWNjKHExKXx8aXNhY2MocTIpfHwhaXNhY2MoeikpeworICAgICAgcHVzaGVkPTE7CisgICAgICBlbWl0KGYsIlx0cGhhXG4iKTsKKyAgICAgIGlmKHJlZ3NbcmF4XSkgZW1pdChmLCJcdHR4YVxuXHRwaGFcbiIpOworICAgIH0KKyAgfQorICBtPW8tPmZsYWdzOworICBvLT5mbGFncyY9fkRSRUZPQko7CisgIGxvYWRfYWRkcmVzcyhmLExBU1RfUEFJUixvLFBPSU5URVIpOworICBvLT5mbGFncz1tOworICBlbWl0KGYsIlx0bGR4XHQjJWRcbiIsYmFua3ZvZmZzZXQpOworICBlbWl0KGYsIlx0bGRhXHQjJWRcbiIsY2Jhbms+PTA/Y2Jhbms6YmFua2NudW0pOworICBzZXR5KGYsYmFuayhvLT52KSk7CisgIGVtaXQoZiwiXHRqc3JcdCVzX19iYW5rbG9hZCVkXG4iLGlkcHJlZml4LChpbnQpem0ybChzaXpldGFiW3RdKSk7CisgIHl2YWw9Tk9WQUw7CisgIG8tPnY9JmJhbmt2OworICBvLT52YWwudm1heD1sMnptKChsb25nKWJhbmt2b2Zmc2V0KTsKKyAgYmFua3ZvZmZzZXQrPXptMmwoc2l6ZXRhYlt0XSk7CisgIGlmKHB1c2hlZCl7CisgICAgaWYocmVnc1tyYXhdKSBlbWl0KGYsIlx0cGxhXG5cdHRheFxuIik7CisgICAgZW1pdChmLCJcdHBsYVxuIik7CisgIH0KK30KKworc3RhdGljIHZvaWQgcHJlbG9hZChGSUxFICpmLElDICpwKQoreworICBpbnQgcixtcmE9cmVnc1tyYV0sbXJheD1yZWdzW3JheF07CisgIGludCBicTE9LTEsYnEyPS0xLGJ6PS0xLHNiPS0xLHpidWY9MDsKKworICBpZihwLT5jb2RlPT1HRVRSRVRVUk4mJnAtPnExLnJlZz09cmEmJiFyZWdzW3JhXSkKKyAgICByZWdzW3JhXT0xOworCisgIGlmKHAtPmNvZGU9PUdFVFJFVFVSTiYmcC0+cTEucmVnPT1yYXgmJiFyZWdzW3JheF0pCisgICAgcmVnc1tyYXhdPTE7CisKKyAgYmFua3ZvZmZzZXQ9MDsKKworICBpZighTk9CQU5LVkFSUyl7CisgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8VkFSQURSKSk9PVZBUikgYnExPWJhbmsocC0+cTEudik7CisgICAgaWYoKHAtPnEyLmZsYWdzJihWQVJ8VkFSQURSKSk9PVZBUikgYnEyPWJhbmsocC0+cTIudik7CisgICAgaWYoKHAtPnouZmxhZ3MmKFZBUnxWQVJBRFIpKT09VkFSKSBiej1iYW5rKHAtPnoudik7CisKKyAgICBpZigocC0+cTEuZmxhZ3MmKFZBUnxWQVJBRFIpKT09KFZBUnxWQVJBRFIpKXsKKyAgICAgIHI9YmFuayhwLT5xMS52KTsKKyAgICAgIC8qaWYocj49MCYmciE9Y2JhbmspIGllcnJvcigwKTsqLworICAgIH0KKyAgICAKKyAgICBpZigocC0+Y29kZT09QVNTSUdOfHxwLT5jb2RlPT1QVVNIKSYmIXptbGVxKHAtPnEyLnZhbC52bWF4LGwyem0oNEwpKSl7CisgICAgICBpZihwLT5xMS5mbGFncyZEUkVGT0JKKSBwcmVsb2FkX29iaihmLHAsJnAtPnExKTsKKyAgICAgIGlmKHAtPnouZmxhZ3MmRFJFRk9CSikgcHJlbG9hZF9vYmooZixwLCZwLT56KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZihwLT5jb2RlIT1DQUxMKXsKKyAgICAgIC8qIFRPRE86IHNvbWUgb3B0aW1pemF0aW9ucyBwb3NzaWJsZSAqLworICAgICAgaWYoYnExPj0wJiZicTEhPWNiYW5rKXsKKwlpZihjYmFuazwwJiYhTk9TV0lUQ0gpCisJICBzYj1icTE7CisJZWxzZQorCSAgbG9hZF9iYW5rZWQoZixwLCZwLT5xMSxxMXR5cChwKSk7CisgICAgICB9CisgICAgICBpZihicTI+PTAmJmJxMiE9Y2JhbmspeworCWlmKChicTI9PXNifHwoY2Jhbms8MCYmc2I8MCkpJiYhTk9TV0lUQ0gpCisJICBzYj1icTI7CisJZWxzZQorCSAgbG9hZF9iYW5rZWQoZixwLCZwLT5xMixxMnR5cChwKSk7CisgICAgICB9CisgICAgICBpZihiej49MCYmYnohPWNiYW5rJiYocC0+ei5mbGFncyZEUkVGT0JKKSl7CisJaWYoKGJ6PT1zYnx8KGNiYW5rPDAmJnNiPDApKXx8IU5PU1dJVENIKQorCSAgc2I9Yno7CisJZWxzZQorCSAgbG9hZF9iYW5rZWQoZixwLCZwLT56LHp0eXAocCkpOworICAgICAgfQorICAgICAgCisgICAgICBpZihzYj49MCl7CisJaWYoTk9TV0lUQ0gpIGllcnJvcigwKTsKKwlzZXR5KGYsc2IpOworCWVtaXQoZiwiXHRqc3JcdCVzX19iYW5rc3dpdGNoXG4iLGlkcHJlZml4KTsKKwl5dmFsPU5PVkFMOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmKChwLT5xMS5mbGFncyZEUkVGT0JKKSYmSVNGUE9JTlRFUihwLT5xMS5kdHlwKSYmcC0+Y29kZSE9Q0FMTCkgbG9hZF9mYXIoZixwLCZwLT5xMSxxMXR5cChwKSk7CisgIGlmKChwLT5xMi5mbGFncyZEUkVGT0JKKSYmSVNGUE9JTlRFUihwLT5xMi5kdHlwKSkgbG9hZF9mYXIoZixwLCZwLT5xMixxMnR5cChwKSk7CisKKyAgaWYoaXNhY2MocTIpKXsKKyAgICBzdGF0aWMgb2JqIG87CisgICAgaW50IHQ9cTJ0eXAocCk7CisgICAgcj1nZXRfcmVnKGYscCx0KTsKKyAgICBvLmZsYWdzPVJFRzsKKyAgICBvLnJlZz1yOworICAgIHN0b3JlX2FjYyhmLCZvLHQpOworICAgIHAtPnEyLnJlZz1yOworICB9CisKKyAgaWYocC0+Y29kZSE9QUREUkVTUyl7CisgICAgcHJlbG9hZF9vYmooZixwLCZwLT5xMSk7CisgICAgaWYoKHAtPnExLmZsYWdzJihEUkVGT0JKfFZBUnxSRUcpKT09KERSRUZPQkp8VkFSfFJFRykmJgorICAgICAgIChwLT5xMi5mbGFncyYoRFJFRk9CSnxWQVJ8UkVHKSk9PShEUkVGT0JKfFZBUikmJgorICAgICAgIHAtPnExLnY9PXAtPnEyLnYpeworICAgICAgcC0+cTIuZmxhZ3N8PVJFRzsKKyAgICAgIHAtPnEyLnJlZz1wLT5xMS5yZWc7CisgICAgfQorICAgIGlmKChwLT5xMS5mbGFncyYoRFJFRk9CSnxWQVJ8UkVHKSk9PShEUkVGT0JKfFZBUnxSRUcpJiYKKyAgICAgICAocC0+ei5mbGFncyYoRFJFRk9CSnxWQVJ8UkVHKSk9PShEUkVGT0JKfFZBUikmJgorICAgICAgIHAtPnExLnY9PXAtPnoudil7CisgICAgICBwLT56LmZsYWdzfD1SRUc7CisgICAgICBwLT56LnJlZz1wLT5xMS5yZWc7CisgICAgfQorICB9CisKKyAgcHJlbG9hZF9vYmooZixwLCZwLT5xMik7CisgIGlmKChwLT5xMi5mbGFncyYoRFJFRk9CSnxWQVJ8UkVHKSk9PShEUkVGT0JKfFZBUnxSRUcpJiYKKyAgICAgKHAtPnouZmxhZ3MmKERSRUZPQkp8VkFSfFJFRykpPT0oRFJFRk9CSnxWQVIpJiYKKyAgICAgcC0+cTIudj09cC0+ei52KXsKKyAgICBwLT56LmZsYWdzfD1SRUc7CisgICAgcC0+ei5yZWc9cC0+cTEucmVnOworICB9CisKKworICBpZigocC0+ei5mbGFncyZEUkVGT0JKKSYmSVNGUE9JTlRFUihwLT56LmR0eXApKSB6YnVmPTE7CisgIGlmKChwLT56LmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVIpeworICAgIGJ6PWJhbmsocC0+ei52KTsKKyAgICBpZihiej49MCYmYnohPWNiYW5rKSB6YnVmPTE7CisgIH0KKyAgCisgIGlmKHpidWYmJiFOT0JBTktWQVJTKXsKKyAgICB6c3RvcmU9cC0+ejsKKyAgICBwLT56LmZsYWdzPVZBUjsKKyAgICBwLT56LnY9JmJhbmt2OworICAgIHAtPnoudmFsLnZtYXg9bDJ6bSgobG9uZyliYW5rdm9mZnNldCk7CisgICAgenN0b3JlZmxhZz0xOworICAgIC8qYmFua3ZvZmZzZXQrPXptMmwoc2l6ZXRhYltwLT50eXBmJk5RXSk7Ki8KKyAgfWVsc2V7CisgICAgcHJlbG9hZF9vYmooZixwLCZwLT56KTsKKworICAgIGlmKGlzcmVnKHopKXsKKyAgICAgIHI9MDsKKyAgICAgIGlmKHAtPnExLmFtJiZwLT5xMS5hbS0+YmFzZT09cC0+ei5yZWcpeworCXI9Z2V0X3JlZyhmLHAsUE9JTlRFUik7CisJY21wX2dldF9hY2MoZixwLDApOworCWlmKCFyZWdfcGFpcihwLT5xMS5hbS0+YmFzZSwmcnApKSBpZXJyb3IoMCk7CisJaWYoIXJlZ19wYWlyKHIsJnJwMikpIGllcnJvcigwKTsKKwllbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcnAucjFdKTsKKwllbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAyLnIxXSk7CisJZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIyXSk7CisJZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwMi5yMl0pOworCXAtPnExLmFtLT5iYXNlPXAtPnExLnJlZz1yOworICAgICAgfWVsc2UgaWYoKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwLT5xMS5yZWc9PXAtPnoucmVnKXsKKwlyPWdldF9yZWcoZixwLFBPSU5URVIpOworCWNtcF9nZXRfYWNjKGYscCwwKTsKKwlpZighcmVnX3BhaXIocC0+ei5yZWcsJnJwKSkgaWVycm9yKDApOworCWlmKCFyZWdfcGFpcihyLCZycDIpKSBpZXJyb3IoMCk7CisJZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisJZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwMi5yMV0pOworCWVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworCWVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycDIucjJdKTsKKwlwLT5xMS5yZWc9cjsKKyAgICAgIH0KKyAgICAgIGlmKHAtPnEyLmFtJiZwLT5xMi5hbS0+YmFzZT09cC0+ei5yZWcpeworCWlmKHI9PTApeworCSAgcj1nZXRfcmVnKGYscCxQT0lOVEVSKTsKKwkgIGNtcF9nZXRfYWNjKGYscCwwKTsKKwkgIGlmKCFyZWdfcGFpcihwLT5xMi5hbS0+YmFzZSwmcnApKSBpZXJyb3IoMCk7CisJICBpZighcmVnX3BhaXIociwmcnAyKSkgaWVycm9yKDApOworCSAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisJICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAyLnIxXSk7CisJICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsKKwkgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycDIucjJdKTsKKwl9CisJcC0+cTIuYW0tPmJhc2U9cC0+cTIucmVnPXI7CisgICAgICB9ZWxzZSBpZigocC0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAtPnEyLnJlZz09cC0+ei5yZWcpeworCWlmKHI9PTApeworCSAgcj1nZXRfcmVnKGYscCxQT0lOVEVSKTsKKwkgIGNtcF9nZXRfYWNjKGYscCwwKTsKKwkgIGlmKCFyZWdfcGFpcihwLT56LnJlZywmcnApKSBpZXJyb3IoMCk7CisJICBpZighcmVnX3BhaXIociwmcnAyKSkgaWVycm9yKDApOworCSAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisJICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAyLnIxXSk7CisJICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsKKwkgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycDIucjJdKTsKKwl9CisJcC0+cTIucmVnPXI7CisgICAgICB9CisgICAgfQorICAgIGlmKGlzYWNjKHopKXsKKyAgICAgIGlmKGlzYWNjKHEyKSl7CisJaWYocC0+cTIucmVnPT1yYXgpeworCSAgcj1nZXRfcmVnKGYscCxJTlQpOworCSAgaWYoIXJlZ19wYWlyKHIsJnJwKSkgaWVycm9yKDApOworCSAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisJICBlbWl0KGYsIlx0c3R4XHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsKKwl9ZWxzZXsKKwkgIHI9Z2V0X3JlZyhmLHAsQ0hBUik7CisJICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCX0KKwlwLT5xMi5yZWc9cjsKKwlpZihpc2FjYyhxMSkpCisJICBwLT5xMS5yZWc9cjsKKyAgICAgIH0KKyAgICB9CisgIH0gICAgIAorIAorICByZWxvYWRfYWNjKGYpOworCisgIHJlZ3NbcmFdPW1yYTsKKyAgcmVnc1tyYXhdPW1yYXg7Cit9CisKKworLyogY29tcGFyZSBpZiB0d28gb2JqZWN0cyBhcmUgdGhlIHNhbWUgKi8KK3N0YXRpYyBpbnQgY29tcGFyZV9vYmplY3RzKHN0cnVjdCBvYmogKm8xLHN0cnVjdCBvYmogKm8yKQoreworICBpZigobzEtPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJihvMi0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmbzEtPnJlZz09bzItPnJlZykKKyAgICByZXR1cm4gMTsKKyAgaWYobzEtPmZsYWdzPT1vMi0+ZmxhZ3MmJm8xLT5hbT09bzItPmFtKXsKKyAgICBpZighKG8xLT5mbGFncyZWQVIpfHwobzEtPnY9PW8yLT52JiZ6bWVxdG8obzEtPnZhbC52bWF4LG8yLT52YWwudm1heCkpKXsKKyAgICAgIGlmKCEobzEtPmZsYWdzJlJFRyl8fG8xLT5yZWc9PW8yLT5yZWcpeworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIHNhdmUgdGhlIHJlc3VsdCAoaW4genJlZykgaW50byBwLT56ICovCit2b2lkIHNhdmVfcmVzdWx0KEZJTEUgKmYsc3RydWN0IElDICpwKQoreworICBpZXJyb3IoMCk7Cit9CisKKy8qIHByaW50cyBhbiBvYmplY3QgKi8KK3N0YXRpYyB2b2lkIGVtaXRfb2JqKEZJTEUgKmYsc3RydWN0IG9iaiAqcCxpbnQgdCkKK3sKKyAgaWYocC0+YW0peworICAgIGlmKHAtPmFtLT5mbGFncz09SU1NX0lORCkKKyAgICAgIGVtaXQoZiwiKCVzKSx5IDthbSglbGQpIixtcmVnbmFtZXNbcC0+YW0tPmJhc2VdLHAtPmFtLT5vZmZzZXQpOworICAgIGVsc2UgaWYocC0+YW0tPmZsYWdzPT1HUFJfSU5EKQorICAgICAgZW1pdChmLCIoJXMpLHkgO2FtKCVzKSIsbXJlZ25hbWVzW3AtPmFtLT5iYXNlXSxtcmVnbmFtZXNbcC0+YW0tPmlkeF0pOworICAgIGVsc2UgaWYocC0+YW0tPmZsYWdzPT1BQlNfSU5EKXsKKyAgICAgIGVtaXQoZiwiJWxkIixwLT5hbS0+b2Zmc2V0KTsKKyAgICAgIGlmKHAtPmFtLT52KXsKKwlWYXIgKnY9cC0+YW0tPnY7CisJaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKQorCSAgZW1pdChmLCIrJXMlcyIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisJZWxzZQorCSAgZW1pdChmLCIrJXMlbGQiLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICAgICAgfQorICAgICAgZW1pdChmLCIseSA7YW0oJXMpIixtcmVnbmFtZXNbcC0+YW0tPmlkeF0pOworICAgIH1lbHNlCisgICAgICBpZXJyb3IoMCk7CisgICAgcmV0dXJuOworICB9CisgIGlmKChwLT5mbGFncyYoS09OU1R8RFJFRk9CSikpPT0oS09OU1R8RFJFRk9CSikpeworICAgIGVtaXR2YWwoZiwmcC0+dmFsLHAtPmR0eXAmTlUpOworICAgIHJldHVybjsKKyAgfQorICBpZihwLT5mbGFncyZEUkVGT0JKKSBlbWl0KGYsIigiKTsKKyAgaWYocC0+ZmxhZ3MmUkVHKXsKKyAgICBlbWl0KGYsIiVzIixtcmVnbmFtZXNbcC0+cmVnXSk7CisgIH1lbHNlIGlmKHAtPmZsYWdzJlZBUikgeworICAgIGlmKHAtPnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHAtPnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKQorICAgICAgZW1pdChmLCIoJXMpLHkiLG1yZWduYW1lc1tmcF0pOworICAgIGVsc2V7CisgICAgICBpZighem1lcXRvKGwyem0oMEwpLHAtPnZhbC52bWF4KSl7ZW1pdHZhbChmLCZwLT52YWwsTUFYSU5UKTtlbWl0KGYsIisiKTt9CisgICAgICBpZihwLT52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpeworICAgICAgICBlbWl0KGYsIiVzJWxkIixsYWJwcmVmaXgsem0ybChwLT52LT5vZmZzZXQpKTsKKyAgICAgIH1lbHNleworICAgICAgICBlbWl0KGYsIiVzJXMiLGlkcHJlZml4LHAtPnYtPmlkZW50aWZpZXIpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihwLT5mbGFncyZLT05TVCl7CisgICAgaWYoLyppZWVlJiYoKHQmTlEpPT1ET1VCTEV8fCh0Jk5RKT09TERPVUJMRSkqL0lTRkxPQVQodCkpCisgICAgICBlbWl0KGYsIiVzJWQiLGxhYnByZWZpeCxhZGRmcGNvbnN0KHAsdCkpOworICAgIGVsc2UKKyAgICAgIGVtaXR2YWwoZiwmcC0+dmFsLHQmTlUpOworICB9CisgIGlmKHAtPmZsYWdzJkRSRUZPQkopIGVtaXQoZiwiKSx5Iik7Cit9CisKKy8qICBUZXN0IGlmIHRoZXJlIGlzIGEgc2VxdWVuY2Ugb2YgRlJFRVJFR3MgY29udGFpbmluZyBGUkVFUkVHIHJlZy4KKyAgICBVc2VkIGJ5IHBlZXBob2xlLiAqLworc3RhdGljIGludCBleGlzdHNfZnJlZXJlZyhzdHJ1Y3QgSUMgKnAsaW50IHJlZykKK3sKKyAgd2hpbGUocCYmKHAtPmNvZGU9PUZSRUVSRUd8fHAtPmNvZGU9PUFMTE9DUkVHKSl7CisgICAgaWYocC0+Y29kZT09RlJFRVJFRyYmcC0+cTEucmVnPT1yZWcpIHJldHVybiAxOworICAgIHA9cC0+bmV4dDsKKyAgfQorICByZXR1cm4gMDsKK30KKworY2hhciBhbW9kZV9idWZmWzgxOTJdOworY2hhciAqcmVuZGVyX2Ftb2RlKHN0cnVjdCBBZGRyZXNzaW5nTW9kZSAqYW0pCit7CisgIHJldHVybiAiKGFtb2RlOiBub3QgaW1wbGVtZW50ZWQpIjsKK30KKworY2hhciB2YWxfYnVmZls4MTkyXTsKK2NoYXIgKnJlbmRlcl92YWwodW5pb24gYXR5cHMgdmFsKQoreworICBzbnByaW50Zih2YWxfYnVmZiw4MTkyLCIodmFsOiAlMDJ4Li4uKSIsCisJICAgdmFsLnZ1Y2hhcik7CisgIHJldHVybiB2YWxfYnVmZjsKK30KKworY2hhciB2YXJfYnVmZls4MTkyXTsKK2NoYXIgKnJlbmRlcl92YXIoc3RydWN0IFZhciAqdikKK3sKKyAgaWYgKCF2KSByZXR1cm4gIjxudWxsPiI7CisgIHNucHJpbnRmKHZhcl9idWZmLDgxOTIsIih2YXIgaWQ9JXMpIix2LT5pZGVudGlmaWVyKTsKKyAgcmV0dXJuIHZhcl9idWZmOworfQorCitjaGFyIG9ial9idWZmWzgxOTJdOworY2hhciAqcmVuZGVyX29iaihzdHJ1Y3Qgb2JqIG8pCit7CisgIC8vIFhYWCBDYWxsaW5nIHJlbmRlcl92YXIoKSBjYW4gcmVzdWx0IGluIHNlZ2ZhdWx0cworICBzbnByaW50ZihvYmpfYnVmZiw4MTkyLCIoZmxhZ3M9JWQsIHJlZz0lZCwgZHR5cGU9JWQsIHZhcj0lcywgYW1vZGU9JXMsIHZhbD0lcykiLAorCSAgIG8uZmxhZ3Msby5yZWcsby5kdHlwLCJyZW5kZXJfdmFyKG8udikiLHJlbmRlcl9hbW9kZShvLmFtKSxyZW5kZXJfdmFsKG8udmFsKSk7CisgIHJldHVybiBvYmpfYnVmZjsKK30KKworLyogc2VhcmNoIGZvciBwb3NzaWJsZSBhZGRyZXNzaW5nLW1vZGVzICovCitzdGF0aWMgdm9pZCBwZWVwaG9sZShzdHJ1Y3QgSUMgKnApCit7CisgIGludCBjLGMyLHI7c3RydWN0IElDICpwMjtzdHJ1Y3QgQWRkcmVzc2luZ01vZGUgKmFtOworCisgIGZwcmludGYoc3RkZXJyLCJwZWVwaG9sZSgpIGNhbGxlZC5cbiIpOworCisgIC8qCisgICAgWFhYIFBHUyBUaGluZ3MgdG8gY29uc2lkZXIgYWRkaW5nIGhlcmU6CisgICAgMS4gUmVtb3ZhbCBvZiBkZWFkIGxvYWRzIHdoZW4gd2Uga25vdyBhIHJlZ2lzdGVyIGFscmVhZHkgaGFzIGxvYWRlZCB0aGUgdGFyZ2V0IHdlIHdhbnQuCisgICAgMi4gUmVtb3ZhbCBvZiBkZWFkIHN0b3JlcyB0byBsb2NhbCBzdGFjayB2YXJpYWJsZXMgdGhhdCBuZXZlciBnZXQgcmVhZCBiZWZvcmUgcmV0dXJuaW5nIGZyb20gYSBmdW5jdGlvbj8KKyAgICAzLiBSZW1vdmFsIG9mIFNQIGRlY3JlbWVudCBhbmQgaW5jcmVtZW50LCB3aGVuIG5vIHVzZSBvZiBsb2NhbCBzdGFjayBpcyBtYWRlLgorICAgIDQuIFByb21vdGluZyBzdGFjayB2YXJpYWJsZXMgdG8gZ2xvYmFsIHZhcmlhYmxlcyB3aGVyZSBpdCBzYXZlcyB0aW1lIGFuZC9vciBzcGFjZT8KKyAgICA1LiBVc2luZyBaIGFzIGEgdGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIgZm9yIGxvY2FsIHZhcmlhYmxlcywgd2hlcmUgaXQgZG9lc24ndCB1cHNldAorICAgICAgIG90aGVyIHRoaW5ncz8KKyAgKi8KKyAgICAKKyAgCisgIGZvcig7cDtwPXAtPm5leHQpeworICAgIGZwcmludGYoc3RkZXJyLCIgIEluc3RydWN0aW9uIEAgJXAgOiAiLHApOworICAgIGZwcmludGYoc3RkZXJyLCJjb2RlPSVkLCAiLHAtPmNvZGUpOworICAgIGZwcmludGYoc3RkZXJyLCJcbiAgICBxMT0lcywgIixyZW5kZXJfb2JqKHAtPnExKSk7CisgICAgZnByaW50ZihzdGRlcnIsIlxuICAgIHEyPSVzLCAiLHJlbmRlcl9vYmoocC0+cTIpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiXG4gICAgej0lcywgIixyZW5kZXJfb2JqKHAtPnopKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKyAgICAKKyAgICBjPXAtPmNvZGU7CisgICAgaWYoYyE9RlJFRVJFRyYmYyE9QUxMT0NSRUcmJihjIT1TRVRSRVRVUk58fCFpc3JlZyhxMSl8fHAtPnExLnJlZyE9cC0+ei5yZWcpKSBleGl0X2xhYmVsPTA7CisgICAgaWYoYz09TEFCRUwpIGV4aXRfbGFiZWw9cC0+dHlwZjsKKworICAgIC8qIFRyeSBjb25zdChyZWcpICovCisgICAgaWYoKGM9PUFEREkyUHx8Yz09U1VCSUZQKSYmaXNyZWcoeikmJihwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCYmIUlTRlBPSU5URVIocC0+dHlwZjIpKXsKKyAgICAgIGludCBiYXNlO3ptYXggb2Y7c3RydWN0IG9iaiAqbzsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxwLT50eXBmKTsKKyAgICAgIGlmKGM9PVNVQklGUCkgb2Y9em1zdWIobDJ6bSgwTCksdm1heCk7IGVsc2Ugb2Y9dm1heDsKKyAgICAgIGlmKHptbGVxKFowLG9mKSYmem1sZXEob2YsbDJ6bSgyNTVMKSkpeworCXI9cC0+ei5yZWc7CisJaWYoaXNyZWcocTEpJiZpc3B0cihwLT5xMS5yZWcpKSBiYXNlPXAtPnExLnJlZzsgZWxzZSBiYXNlPXI7CisJbz0wOworCWZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKwkgIGMyPXAyLT5jb2RlOworCSAgaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKKwkgIGlmKGMyIT1GUkVFUkVHJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMS5yZWc9PXIpIGJyZWFrOworCSAgaWYoYzIhPUZSRUVSRUcmJihwMi0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnEyLnJlZz09cikgYnJlYWs7CisJICBpZihjMiE9Q0FMTCYmKGMyPExBQkVMfHxjMj5CUkEpLyomJmMyIT1BRERSRVNTKi8peworCSAgICBpbnQgdCxtYzsKKwkgICAgaWYoKGMyPT1BU1NJR058YzI9PVBVU0gpJiYocDItPnR5cGYmTlEpPT1DSEFSJiYhem1lcXRvKHAyLT5xMi52YWwudm1heCxaMSkpCisJICAgICAgbWM9MTsKKwkgICAgZWxzZQorCSAgICAgIG1jPTA7CisJICAgIGlmKCFwMi0+cTEuYW0mJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT5xMS5yZWc9PXIpeworCSAgICAgIGlmKG98fG1jKSBicmVhazsKKwkgICAgICB0PXExdHlwKHAyKSZOUTsKKwkgICAgICBpZih0PlBPSU5URVJ8fElTRkxPQVQodCkpIGJyZWFrOworCSAgICAgIG89JnAyLT5xMTsKKwkgICAgfQorCSAgICBpZighcDItPnEyLmFtJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTIucmVnPT1yKXsKKwkgICAgICBpZihvfHxtYykgYnJlYWs7CisJICAgICAgdD1xMnR5cChwMikmTlE7CisJICAgICAgaWYodD5QT0lOVEVSfHxJU0ZMT0FUKHQpKSBicmVhazsKKwkgICAgICBvPSZwMi0+cTI7CisJICAgIH0KKwkgICAgaWYoIXAyLT56LmFtJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT56LnJlZz09cil7CisJICAgICAgaWYob3x8bWMpIGJyZWFrOworCSAgICAgIHQ9enR5cChwMikmTlE7CisJICAgICAgaWYodD5QT0lOVEVSfHxJU0ZMT0FUKHQpKSBicmVhazsKKwkgICAgICBvPSZwMi0+ejsKKwkgICAgfQorCSAgfQorCSAgaWYoYzI9PUZSRUVSRUd8fChwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKwkgICAgaW50IG07CisJICAgIGlmKGMyPT1GUkVFUkVHKQorCSAgICAgIG09cDItPnExLnJlZzsKKwkgICAgZWxzZXsKKwkgICAgICBtPXAyLT56LnJlZzsKKwkgICAgICBpZihvPT0mcC0+cTF8fG89PSZwLT5xMikgYnJlYWs7CisJICAgIH0KKwkgICAgaWYobT09cil7CisJICAgICAgaWYobyl7CisJCW8tPmFtPWFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKKwkJYW0tPmZsYWdzPUlNTV9JTkQ7CisJCWFtLT5iYXNlPWJhc2U7CisJCWFtLT5vZmZzZXQ9KGludCl6bTJsKG9mKTsKKwkJaWYoaXNyZWcocTEpJiZpc3B0cihwLT5xMS5yZWcpKXsKKwkJICBwLT5jb2RlPWM9Tk9QO3AtPnExLmZsYWdzPXAtPnEyLmZsYWdzPXAtPnouZmxhZ3M9MDsKKwkJfWVsc2V7CisJCSAgcC0+Y29kZT1jPUFTU0lHTjtwLT5xMi5mbGFncz0wOworCQkgIHAtPnR5cGY9cC0+dHlwZjI7cC0+cTIudmFsLnZtYXg9c2l6ZXRhYltwLT50eXBmMiZOUV07CisJCX0KKwkgICAgICB9CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgICAgaWYoYzIhPUZSRUVSRUcmJm09PWJhc2UpIGJyZWFrOworCSAgICBjb250aW51ZTsKKwkgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvKiBUcnkgcmVnLHJlZyAqLworICAgIGlmKGM9PUFEREkyUCYmKHAtPnR5cGYmTlUpPT0oVU5TSUdORUR8Q0hBUikmJiFJU0ZQT0lOVEVSKHAtPnR5cGYyKSYmaXNyZWcocTIpJiZwLT5xMi5yZWchPXJhJiZpc3JlZyh6KSYmKGlzcmVnKHExKXx8cC0+cTIucmVnIT1wLT56LnJlZykpeworICAgICAgaW50IGJhc2UsaWR4LGluZDtzdHJ1Y3Qgb2JqICpvOworICAgICAgcj1wLT56LnJlZztpZHg9cC0+cTIucmVnOworICAgICAgaWYoaXNyZWcocTEpKSBiYXNlPXAtPnExLnJlZzsgZWxzZSBiYXNlPXI7CisgICAgICBpZigocC0+cTEuZmxhZ3MmVkFSQURSKXx8KHAtPnExLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKQorCWluZD0wOworICAgICAgZWxzZQorCWluZD0xOworICAgICAgbz0wOworICAgICAgZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpeworICAgICAgICBjMj1wMi0+Y29kZTsKKyAgICAgICAgaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKKyAgICAgICAgaWYoYzIhPUZSRUVSRUcmJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09cikgYnJlYWs7CisgICAgICAgIGlmKGMyIT1GUkVFUkVHJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMi5yZWc9PXIpIGJyZWFrOworICAgICAgICBpZigocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnoucmVnPT1pZHgmJmlkeCE9cikgYnJlYWs7CisJCisgICAgICAgIGlmKGMyIT1DQUxMJiYoYzI8TEFCRUx8fGMyPkJSQSkvKiYmYzIhPUFERFJFU1MqLyl7CisgICAgICAgICAgaWYoIXAyLT5xMS5hbSYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnExLnJlZz09cil7CisgICAgICAgICAgICBpZihvfHwoaW5kJiYocTF0eXAocDIpJk5RKSE9Q0hBUikpIGJyZWFrOworICAgICAgICAgICAgbz0mcDItPnExOworICAgICAgICAgIH0KKyAgICAgICAgICBpZighcDItPnEyLmFtJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTIucmVnPT1yKXsKKyAgICAgICAgICAgIGlmKG98fChpbmQmJihxMnR5cChwMikmTlEpIT1DSEFSKSkgYnJlYWs7CisgICAgICAgICAgICBvPSZwMi0+cTI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKCFwMi0+ei5hbSYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+ei5yZWc9PXIpeworICAgICAgICAgICAgaWYob3x8KGluZCYmKHp0eXAocDIpJk5RKSE9Q0hBUikpIGJyZWFrOworICAgICAgICAgICAgbz0mcDItPno7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKGMyPT1GUkVFUkVHfHwocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgICAgICAgaW50IG07CisgICAgICAgICAgaWYoYzI9PUZSRUVSRUcpCisgICAgICAgICAgICBtPXAyLT5xMS5yZWc7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbT1wMi0+ei5yZWc7CisgICAgICAgICAgaWYobT09cil7CisgICAgICAgICAgICBpZihvKXsKKyAgICAgICAgICAgICAgby0+YW09YW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworCSAgICAgIGFtLT5pZHg9aWR4OworCSAgICAgIGlmKGluZCl7CisJCWFtLT5mbGFncz1HUFJfSU5EOworCQlhbS0+YmFzZT1iYXNlOworCQlpZihpc3JlZyhxMSkpeworCQkgIHAtPmNvZGU9Yz1OT1A7cC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworCQl9ZWxzZXsKKwkJICBwLT5jb2RlPWM9QVNTSUdOO3AtPnEyLmZsYWdzPTA7CisJCSAgcC0+dHlwZj1wLT50eXBmMjtwLT5xMi52YWwudm1heD1zaXpldGFiW3AtPnR5cGYyJk5RXTsKKwkJfQorCSAgICAgIH1lbHNleworCQlhbS0+ZmxhZ3M9QUJTX0lORDsKKwkJYW0tPmJhc2U9MDsKKwkJZXZhbF9jb25zdCgmcC0+cTEudmFsLE1BWElOVCk7CisJCWFtLT5vZmZzZXQ9em0ybCh2bWF4KTsKKwkJaWYocC0+cTEuZmxhZ3MmVkFSQURSKQorCQkgIGFtLT52PXAtPnExLnY7CisJCWVsc2UKKwkJICBhbS0+dj0wOworCQlwLT5jb2RlPWM9Tk9QO3AtPnExLmZsYWdzPXAtPnEyLmZsYWdzPXAtPnouZmxhZ3M9MDsKKwkgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYoYzIhPUZSRUVSRUcmJm09PWJhc2UpIGJyZWFrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIHByKEZJTEUgKmYsc3RydWN0IElDICpwKQoreworICBpbnQgcjsKKworICBpZih6c3RvcmVmbGFnKXsKKyAgICBpbnQgb2ZmOworICAgIGlmKHAtPnouZmxhZ3MhPVZBUnx8cC0+ei52IT0mYmFua3YpIGllcnJvcigwKTsKKyAgICBvZmY9KGludCl6bTJsKHAtPnoudmFsLnZtYXgpOworICAgIHAtPno9enN0b3JlOworICAgIGdldF9hY2MoZixwLElOVCk7CisgICAgaWYoenN0b3JlLmZsYWdzJkRSRUZPQkopeworICAgICAgaWYoIUlTRlBPSU5URVIoenN0b3JlLmR0eXApKSBpZXJyb3IoMCk7CisgICAgICB6c3RvcmUuZmxhZ3MmPX5EUkVGT0JKOworICAgICAgbG9hZF9yZWcoZixMQVNUX1BBSVIsJnpzdG9yZSxQT0lOVEVSKTsKKyAgICAgIGlmKGluZGlyZWN0KCZ6c3RvcmUpKXsKKwlkb19ieXRlMyhmLCJsZGEiLCZ6c3RvcmUsRlBPSU5URVIpOworCWVtaXQoZiwiXHR0YXlcbiIpOworICAgICAgfWVsc2UKKwlkb19ieXRlMyhmLCJsZHkiLCZ6c3RvcmUsRlBPSU5URVIpOworICAgICAgeXZhbD1OT1ZBTDsKKyAgICB9ZWxzZXsKKyAgICAgIGxvYWRfYWRkcmVzcyhmLExBU1RfUEFJUiwmenN0b3JlLHAtPnR5cGYpOworICAgICAgcj1iYW5rKHpzdG9yZS52KTsKKyAgICAgIHNldHkoZixyPj0wP3I6YmFua2NudW0pOworICAgIH0KKyAgICBlbWl0KGYsIlx0bGR4XHQjJWRcbiIsb2ZmKTsKKyAgICBlbWl0KGYsIlx0bGRhXHQjJWRcbiIsY2Jhbms+PTA/Y2Jhbms6YmFua2NudW0pOworICAgIGVtaXQoZiwiXHRqc3JcdCVzX19iYW5rc3RvcmUlZFxuIixpZHByZWZpeCwoaW50KXptMmwoc2l6ZXRhYltwLT50eXBmJk5RXSkpOworICAgIHl2YWw9Tk9WQUw7CisgICAgenN0b3JlZmxhZz0wOworICB9CisKKyAgZm9yKHI9MTtyPD1NQVhSO3IrKyl7CisgICAgaWYocmVnc1tyXSY4KQorICAgICAgcmVnc1tyXSY9fjg7CisgIH0KKyAgZm9yKHI9RklSU1RfR1BSO3I8PUxBU1RfR1BSO3IrKyl7CisgICAgaW50IHRhPTA7CisgICAgaWYocmVnc1tyXSYyKXsKKyAgICAgIGlmKHJlZ3NbcmFdJiYhcHVzaGVkYWNjKXsKKwllbWl0KGYsIlx0dGF5XG4iKTsKKwl5dmFsPU5PVkFMOworCXRhPTE7CisgICAgICB9CisgICAgICBlbWl0KGYsIlx0cGxhXG4iKTsKKyAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisgICAgICByZWdzW3JdJj1+MjsKKyAgICB9CisgICAgaWYodGEpCisgICAgICBlbWl0KGYsIlx0dHlhXG4iKTsKKyAgfQorICBpZihwdXNoZWR4KXsKKyAgICBlbWl0KGYsIlx0bGR4XHQlc1xuIixtcmVnbmFtZXNbcHVzaGVkeF0pOworICAgIHB1c2hlZHg9MDsKKyAgfQorCisgIHJlbG9hZF9hY2Nfb3B0KGYscC0+bmV4dCk7Cit9CisKK3N0cnVjdCBjbXBsaXN0IHtzdHJ1Y3QgY21wbGlzdCAqbmV4dDtpbnQgZnJvbSx0byxtb2RlO30gKmZpcnN0X2NtcGxpc3Q7CisKK3N0YXRpYyB2b2lkIGFkZF9jbXBsaXN0KGludCBmcm9tLCBpbnQgdG8sIGludCBtb2RlKQoreworICBzdHJ1Y3QgY21wbGlzdCAqbmV3OworICBuZXc9bXltYWxsb2Moc2l6ZW9mKCpuZXcpKTsKKyAgbmV3LT5uZXh0PWZpcnN0X2NtcGxpc3Q7CisgIG5ldy0+ZnJvbT1mcm9tOworICBuZXctPnRvPXRvOworICBuZXctPm1vZGU9bW9kZTsKKyAgZmlyc3RfY21wbGlzdD1uZXc7Cit9CisKK3N0YXRpYyB2b2lkIGluY3NwKEZJTEUgKmYsbG9uZyBvZikKK3sKKyAgaWYob2Y9PTApIHJldHVybjsKKyAgaWYob2Y9PTF8fG9mPT0tMSl7CisgICAgc3RhdGljIG9iaiBvOworICAgIG8uZmxhZ3M9UkVHOworICAgIG8ucmVnPXNwOworICAgIGlmKG9mPT0xKQorICAgICAgaW5jbWVtKGYsJm8sSU5ULEFERCwxKTsKKyAgICBlbHNlCisgICAgICBpbmNtZW0oZiwmbyxJTlQsU1VCLDEpOworICB9ZWxzZSBpZihvZj09MjU2KXsKKyAgICBlbWl0KGYsIlx0aW5jXHQlcysxXG4iLG1yZWduYW1lc1tzcF0pOworICB9ZWxzZSBpZihvZj09LTI1Nil7CisgICAgZW1pdChmLCJcdGRlY1x0JXMrMVxuIixtcmVnbmFtZXNbc3BdKTsKKyAgfWVsc2V7CisgICAgbG9uZyBhYnM7CisgICAgaWYob2Y+MCl7CisgICAgICBhYnM9b2Y7CisgICAgICBlbWl0KGYsIlx0Y2xjXG4iKTsKKyAgICB9ZWxzZXsKKyAgICAgIGFicz0tb2Y7CisgICAgICBlbWl0KGYsIlx0c2VjXG4iKTsKKyAgICB9CisgICAgaWYoYWJzJjI1NSl7CisgICAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbc3BdKTsKKyAgICAgIGlmKG9mPjApeworCWVtaXQoZiwiXHRhZGNcdCMlbGRcbiIsYWJzJjI1NSk7CisgICAgICB9ZWxzZXsKKwllbWl0KGYsIlx0c2JjXHQjJWxkXG4iLGFicyYyNTUpOworICAgICAgfQorICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3NwXSk7CisgICAgfQorICAgIGlmKChhYnMmMHhmZjAwKT09MCl7CisgICAgICBpZihvZj4wKXsKKwllbWl0KGYsIlx0YmNjXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwllbWl0KGYsIlx0aW5jXHQlcysxXG4iLG1yZWduYW1lc1tzcF0pOworCWVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKyAgICAgIH1lbHNleworCWVtaXQoZiwiXHRiY3NcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCWVtaXQoZiwiXHRkZWNcdCVzKzFcbiIsbXJlZ25hbWVzW3NwXSk7CisJZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwpOworICAgICAgfQkKKyAgICB9ZWxzZXsKKyAgICAgIGVtaXQoZiwiXHRsZGFcdCVzKzFcbiIsbXJlZ25hbWVzW3NwXSk7CisgICAgICBpZihvZj4wKQorCWVtaXQoZiwiXHRhZGNcdCMlbGRcbiIsKGFicz4+OCkmMjU1KTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIlx0c2JjXHQjJWxkXG4iLChhYnM+PjgpJjI1NSk7CisgICAgICBlbWl0KGYsIlx0c3RhXHQlcysxXG4iLG1yZWduYW1lc1tzcF0pOworICAgIH0KKyAgfQorfQorCisvKiBnZW5lcmF0ZXMgdGhlIGZ1bmN0aW9uIGVudHJ5IGNvZGUgKi8KK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX3RvcChGSUxFICpmLHN0cnVjdCBWYXIgKnYsbG9uZyBvZmZzZXQpCit7CisgIGludCBpLHIsb2Y7CisgIHJzYXZlc2l6ZT0wOworICBsaWJzYXZlPTE7CisKKyAgaWYoIW9wdHNpemV8fCh2LT50YXR0ciZOT0NPTVBSRVNTKSkgZW1pdChmLCI7dmNwcm1pbj0xMDAwMFxuIik7CisgIGlmKHZsYXMpIGVtaXQoZiwiX19fZm9cdHNldFx0JWxkXG4iLChsb25nKWFyZ3NpemUpOworICByPTA7CisgIGZvcihpPUZJUlNUX0dQUjtpPD1MQVNUX0dQUjtpKyspeworICAgIGlmKChyZWd1c2VkW2ldJiYoaW5faXNyfHwhcmVnc2NyYXRjaFtpXSkpfHwoaW5faXNyJiZmdW5jdGlvbl9jYWxscyYmcmVnc2NyYXRjaFtpXSYmIXJlZ3NhW2ldKSl7CisgICAgICBpZihpIT1MQVNUX0dQUi1WT0xfR1BSUysxJiZyPT0wKSBsaWJzYXZlPTA7CisgICAgICByc2F2ZXNpemUrKzsKKyAgICAgIHI9MTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKGk9PUxBU1RfR1BSLVZPTF9HUFJTKzEpIGxpYnNhdmU9MDsKKyAgICAgIHI9MDsKKyAgICB9CisgIH0KKyAgcnNjbnQ9cnNhdmVzaXplOworICBpZihyc2NudCYmIVNPRlRTVEFDSyl7CisgICAgaWYob3B0c3BlZWR8fHJzY250PDIpCisgICAgICByc2F2ZXNpemU9MDsKKyAgICBlbHNlIGlmKCFvcHRzaXplJiZyc2NudDw9NSkKKyAgICAgIHJzYXZlc2l6ZT0wOworICB9CisKKyAgaWYoIXNwZWNpYWxfc2VjdGlvbihmLHYpKXtlbWl0KGYsY29kZW5hbWUpO2ViYW5rKGYsYmFuayh2KSk7aWYoZikgc2VjdGlvbj1DT0RFO30gCisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisgICAgaWYoKHYtPmZsYWdzJihJTkxJTkVGVU5DfElOTElORUVYVCkpIT1JTkxJTkVGVU5DKQorICAgICAgZW1pdChmLCJcdGdsb2JhbFx0JXMlc1xuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICBlbWl0KGYsIiVzJXM6XG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICB9ZWxzZQorICAgIGVtaXQoZiwiJXMlbGQ6XG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworCisgIG9mZnNldD1sb2NhbHNpemUrYXJnc2l6ZStyc2F2ZXNpemU7CisKKyAgaWYoaW5faXNyKXsKKyAgICBlbWl0KGYsIlx0cGhhXG4iKTsKKyAgICBlbWl0KGYsIlx0cGh4XG4iKTsKKyAgICBlbWl0KGYsIlx0cGh5XG4iKTsKKyAgICBlbWl0KGYsIlx0cGh6XG4iKTsKKyAgICBpZihvZmZzZXR8fGZ1bmN0aW9uX2NhbGxzKXsKKyAgICAgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tzcF0pOworICAgICAgZW1pdChmLCJcdHBoYVxuIik7CisgICAgICBlbWl0KGYsIlx0bGRhXHQlcysxXG4iLG1yZWduYW1lc1tzcF0pOworICAgICAgZW1pdChmLCJcdHBoYVxuIik7CisgICAgICBlbWl0KGYsIlx0bGRhXHQjPChfX19pc3JzdGFjay0lbGQpXG4iLG9mZnNldCk7CisgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbc3BdKTsKKyAgICAgIGVtaXQoZiwiXHRsZGFcdCM+KF9fX2lzcnN0YWNrLSVsZClcbiIsb2Zmc2V0KTsKKyAgICAgIGVtaXQoZiwiXHRzdGFcdCVzKzFcbiIsbXJlZ25hbWVzW3NwXSk7CisgICAgfQorICB9CisKKyAgaWYoTUFJTkFSR1MmJnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTiYmIXN0cmNtcCh2LT5pZGVudGlmaWVyLCJtYWluIikmJnYtPnZ0eXAtPmV4YWN0LT5jb3VudD4xKQorICAgIGVtaXQoZiwiXHRqc3JcdGluaXRtYWluYXJnc1xuIik7CisKKyAgeXZhbD1OT1ZBTDsKKyAgb2Y9YXJnc2l6ZStsb2NhbHNpemU7CisKKyAgaWYocnNhdmVzaXplPjAmJm9mK3JzYXZlc2l6ZT4yNTUpeworICAgIG9mZnNldC09cnNhdmVzaXplOworICAgIGluY3NwKGYsLXJzYXZlc2l6ZSk7CisgICAgb2Y9MDsKKyAgfWVsc2V7CisgICAgaW5jc3AoZiwtb2Zmc2V0KTsKKyAgICBvZmZzZXQ9MDsKKyAgfQorCisKKyAgaWYoIWxpYnNhdmV8fHJzY250IT1yc2F2ZXNpemV8fG9wdHNwZWVkfHxyc2NudDw9MXx8KHJzY250PD0zJiYoIW9wdHNpemUpKSkKKyAgICBsaWJzYXZlPTA7CisgIAorICBpZihsaWJzYXZlKXsKKyAgICBzZXR5KGYsb2YrcnNhdmVzaXplLTEpOworICAgIGVtaXQoZiwiXHRqc3JcdCVzX19yc2F2ZSVsZFxuIixpZHByZWZpeCxyc2NudCk7CisgICAgeXZhbD1vZjsKKyAgfWVsc2V7CisgICAgZm9yKGk9RklSU1RfR1BSO2k8PUxBU1RfR1BSO2krKyl7CisgICAgICBpZigocmVndXNlZFtpXSYmKGluX2lzcnx8IXJlZ3NjcmF0Y2hbaV0pKXx8KGluX2lzciYmZnVuY3Rpb25fY2FsbHMmJnJlZ3NjcmF0Y2hbaV0mJiFyZWdzYVtpXSkpeworCWlmKHJzY250IT1yc2F2ZXNpemUpeworCSAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW2ldKTsKKwkgIGVtaXQoZiwiXHRwaGFcbiIpOworCX1lbHNleworCSAgc2V0eShmLG9mKyspOworCSAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW2ldKTsKKwkgIGVtaXQoZiwiXHRzdGFcdCglcykseVxuIixtcmVnbmFtZXNbc3BdKTsKKwl9CisgICAgICB9CisgICAgfQorICB9CisKKworCisgIGluY3NwKGYsLW9mZnNldCk7CisKKyAgaWYodmxhcyl7CisgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3NwXSk7CisgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW2ZwXSk7CisgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3NwMl0pOworICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tmcDJdKTsKKyAgfQorfQorCisvKiBnZW5lcmF0ZXMgdGhlIGZ1bmN0aW9uIGV4aXQgY29kZSAqLworc3RhdGljIHZvaWQgZnVuY3Rpb25fYm90dG9tKEZJTEUgKmYsc3RydWN0IFZhciAqdixsb25nIG9mZnNldCkKK3sKKyAgaW50IGksb2YsYXI7CisgIHN0cnVjdCBjbXBsaXN0ICpwOworICBvZmZzZXQ9bG9jYWxzaXplK2FyZ3NpemUrcnNhdmVzaXplOworICBvZj1hcmdzaXplK2xvY2Fsc2l6ZTsKKworICBpPWZyZXR1cm4odi0+dnR5cC0+bmV4dCk7CisgIGlmKGk9PXJhfHxpPT1yYXgpIGFyPTE7IGVsc2UgYXI9MDsKKworICBpZihyc2NudCE9cnNhdmVzaXplKXsKKyAgICBpZihhciYmIXB1c2hlZGFjYyl7CisgICAgICBwdXNoZWRhY2M9dDQ7CisgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcHVzaGVkYWNjXSk7CisgICAgfQorICAgIGZvcihpPUxBU1RfR1BSO2k+PUZJUlNUX0dQUjtpLS0peworICAgICAgaWYoKHJlZ3VzZWRbaV0mJihpbl9pc3J8fCFyZWdzY3JhdGNoW2ldKSl8fChpbl9pc3ImJmZ1bmN0aW9uX2NhbGxzJiZyZWdzY3JhdGNoW2ldJiYhcmVnc2FbaV0pKXsKKwllbWl0KGYsIlx0cGxhXG4iKTsKKwllbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbaV0pOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihyc2F2ZXNpemU+MCYmb2YrcnNhdmVzaXplPjI1NSl7CisgICAgaWYob2YhPTEmJmFyJiYhcHVzaGVkYWNjKXsKKyAgICAgIHB1c2hlZGFjYz10NDsKKyAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1twdXNoZWRhY2NdKTsKKyAgICB9CisgICAgaW5jc3AoZixvZik7CisgICAgb2Zmc2V0LT1vZjsKKyAgICBvZj0wOworICB9CisgIGlmKHJzYXZlc2l6ZT4wKXsKKyAgICBpZihhciYmIXB1c2hlZGFjYyl7CisgICAgICBwdXNoZWRhY2M9dDQ7CisgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcHVzaGVkYWNjXSk7CisgICAgfQorICB9CisgIGlmKHJzYXZlc2l6ZSl7CisgICAgaWYobGlic2F2ZSl7CisgICAgICBzZXR5KGYsb2YrcnNhdmVzaXplLTEpOworICAgICAgZW1pdChmLCJcdGpzclx0JXNfX3Jsb2FkJWxkXG4iLGlkcHJlZml4LHJzY250KTsKKyAgICAgIHl2YWw9b2Y7CisgICAgfWVsc2V7CisgICAgICBmb3IoaT1GSVJTVF9HUFI7aTw9TEFTVF9HUFI7aSsrKXsKKwlpZigocmVndXNlZFtpXSYmKGluX2lzcnx8IXJlZ3NjcmF0Y2hbaV0pKXx8KGluX2lzciYmZnVuY3Rpb25fY2FsbHMmJnJlZ3NjcmF0Y2hbaV0mJiFyZWdzYVtpXSkpeworCSAgc2V0eShmLG9mKyspOworCSAgZW1pdChmLCJcdGxkYVx0KCVzKSx5XG4iLG1yZWduYW1lc1tzcF0pOworCSAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW2ldKTsKKwl9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGluX2lzcil7CisgICAgaWYob2Zmc2V0fHxmdW5jdGlvbl9jYWxscyl7CisgICAgICBlbWl0KGYsIlx0cGxhXG4iKTsKKyAgICAgIGVtaXQoZiwiXHRzdGFcdCVzKzFcbiIsbXJlZ25hbWVzW3NwXSk7CisgICAgICBlbWl0KGYsIlx0cGxhXG4iKTsKKyAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tzcF0pOworICAgIH0KKyAgfWVsc2UgaWYob2Zmc2V0PT0yJiYhcHVzaGVkYWNjKXsKKyAgICBlbWl0KGYsIlx0aW5jXHQlc1xuIixtcmVnbmFtZXNbc3BdKTsKKyAgICBlbWl0KGYsIlx0YmVxXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKyAgICBlbWl0KGYsIlx0aW5jXHQlc1xuIixtcmVnbmFtZXNbc3BdKTsKKyAgICBlbWl0KGYsIlx0YmVxXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKyAgICByZWxvYWRfYWNjKGYpOworICAgIGVtaXQoZixyZXQpOworICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsLTEpOworICAgIGVtaXQoZiwiXHRpbmNcdCVzXG4iLG1yZWduYW1lc1tzcF0pOworICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKyAgICBlbWl0KGYsIlx0aW5jXHQlcysxXG4iLG1yZWduYW1lc1tzcF0pOworICB9ZWxzZXsKKyAgICBpZihvZmZzZXQhPTAmJmFyJiYhcHVzaGVkYWNjKXsKKyAgICAgIHB1c2hlZGFjYz10NDsKKyAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1twdXNoZWRhY2NdKTsKKyAgICB9CisgICAgaW5jc3AoZixvZmZzZXQpOworICB9CisKKyAgcmVsb2FkX2FjYyhmKTsKKworICBpZihpbl9pc3IpeworICAgIGVtaXQoZiwiXHRwbHpcbiIpOworICAgIGVtaXQoZiwiXHRwbHlcbiIpOworICAgIGVtaXQoZiwiXHRwbHhcbiIpOworICAgIGVtaXQoZiwiXHRwbGFcbiIpOworICB9CisgIGVtaXQoZixyZXQpOworCisgIGZvcihwPWZpcnN0X2NtcGxpc3Q7cDspeworICAgIHN0cnVjdCBjbXBsaXN0ICptOworICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LHAtPmZyb20pOworICAgIGlmKHAtPm1vZGU9PUpNUElORCl7CisgICAgICAvKiBpbmRpcmVjdCBjYWxsICovCisgICAgICBlbWl0KGYsIlx0am1wXHQoJXMpXG4iLG1yZWduYW1lc1twLT50b10pOworICAgIH1lbHNleworICAgICAgcHVzaGVkYWNjPXAtPm1vZGU7CisgICAgICByZWxvYWRfYWNjKGYpOworICAgICAgZW1pdChmLCJcdGptcFx0JXMlZFxuIixsYWJwcmVmaXgscC0+dG8pOworICAgIH0KKyAgICBtPXA7CisgICAgcD1wLT5uZXh0OworICAgIGZyZWUobSk7CisgIH0KKyAgZmlyc3RfY21wbGlzdD0wOworICBwdXNoZWRhY2M9MDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgRW5kIG9mIHByaXZhdGUgZGF0YSBhbmQgZnVuY3Rpb25zLiAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAgRG9lcyBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb25zIGZvciB0aGUgY29kZS1nZW5lcmF0b3IuIEdldHMgY2FsbGVkICAqLworLyogIG9uY2UgYXQgdGhlIGJlZ2lubmluZyBhbmQgc2hvdWxkIHJldHVybiAwIGluIGNhc2Ugb2YgcHJvYmxlbXMuICAgICAgKi8KK2ludCBpbml0X2NnKHZvaWQpCit7CisgIGludCBpOworICAvKiAgSW5pdGlhbGl6ZSBzb21lIHZhbHVlcyB3aGljaCBjYW5ub3QgYmUgc3RhdGljYWxseSBpbml0aWFsaXplZCAgICovCisgIC8qICBiZWNhdXNlIHRoZXkgYXJlIHN0b3JlZCBpbiB0aGUgdGFyZ2V0J3MgYXJpdGhtZXRpYy4gICAgICAgICAgICAgKi8KKyAgbWF4YWxpZ249bDJ6bSgxTCk7CisgIGNoYXJfYml0PWwyem0oOEwpOworICBzdGFja2FsaWduPWwyem0oMSk7CisKKyAgaWYoSUVFRSl7CisgICAgaWVlZT0xOworICAgIG1zaXpldGFiW0RPVUJMRV09bXNpemV0YWJbTERPVUJMRV09bDJ6bSg4TCk7CisgIH0KKworCisgIG1yZWduYW1lc1swXT1yZWduYW1lc1swXT0ibm9yZWciOworICBmb3IoaT1GSVJTVF9HUFI7aTw9TEFTVF9HUFI7aSsrKXsKKyAgICByZWduYW1lc1tpXT1teW1hbGxvYygxMCk7CisgICAgc3ByaW50ZihyZWduYW1lc1tpXSwiciVkIixpLUZJUlNUX0dQUik7CisgICAgbXJlZ25hbWVzW2ldPXJlZ25hbWVzW2ldOworICAgIHJlZ3NpemVbaV09bDJ6bSgxTCk7CisgICAgcmVndHlwZVtpXT0mY3R5cDsKKyAgfQorICBmb3IoaT1GSVJTVF9QQUlSO2k8PUxBU1RfUEFJUjtpKyspeworICAgIGludCBzcj0oaS1GSVJTVF9QQUlSKSoyK0ZJUlNUX0dQUjsKKyAgICByZWduYW1lc1tpXT1teW1hbGxvYygxMCk7CisgICAgc3ByaW50ZihyZWduYW1lc1tpXSwiJXMvJXMiLG1yZWduYW1lc1tzcl0sbXJlZ25hbWVzW3NyKzFdKTsKKyAgICBtcmVnbmFtZXNbaV09cmVnbmFtZXNbc3JdOworICAgIHJlZ3NpemVbaV09bDJ6bSgyTCk7CisgICAgcmVndHlwZVtpXT0maXR5cDsKKyAgfQorICBmb3IoaT1GSVJTVF9CSUc7aTw9TEFTVF9CSUc7aSsrKXsKKyAgICByZWduYW1lc1tpXT1teW1hbGxvYygxMCk7CisgICAgc3ByaW50ZihyZWduYW1lc1tpXSwiYnRtcCVkIixpLUZJUlNUX0JJRyk7CisgICAgbXJlZ25hbWVzW2ldPXJlZ25hbWVzW2ldOworICAgIHJlZ3NpemVbaV09bXNpemV0YWJbRkxPQVRdOworICAgIHJlZ3R5cGVbaV09JmZ0eXA7CisgICAgcmVnc2FbaV09MDsKKyAgICByZWdzY3JhdGNoW2ldPTE7CisgIH0KKyAgZm9yKGk9RklSU1RfQklHUDtpPD1MQVNUX0JJR1A7aSsrKXsKKyAgICBpbnQgc3I9KGktRklSU1RfQklHUCkqMitGSVJTVF9CSUc7CisgICAgcmVnbmFtZXNbaV09bXltYWxsb2MoMjApOworICAgIHNwcmludGYocmVnbmFtZXNbaV0sIiVzLyVzIixtcmVnbmFtZXNbc3JdLG1yZWduYW1lc1tzcisxXSk7CisgICAgbXJlZ25hbWVzW2ldPXJlZ25hbWVzW3NyXTsKKyAgICByZWdzaXplW2ldPW1zaXpldGFiW0xMT05HXTsKKyAgICByZWd0eXBlW2ldPSZsbHR5cDsKKyAgICByZWdzYVtpXT0wOworICAgIHJlZ3NjcmF0Y2hbaV09MTsKKyAgfQorCisgIG1yZWduYW1lc1tyYV0gPSByZWduYW1lc1tyYV0gPSAiYSI7CisgIG1yZWduYW1lc1tyeF0gPSByZWduYW1lc1tyeF0gPSAieCI7CisgIG1yZWduYW1lc1tyeV0gPSByZWduYW1lc1tyeV0gPSAieSI7CisgIG1yZWduYW1lc1tyel0gPSByZWduYW1lc1tyel0gPSAieiI7CisgIHJlZ3NpemVbcmFdPXJlZ3NpemVbcnhdPXJlZ3NpemVbcnldPWwyem0oMUwpOworICByZWd0eXBlW3JhXT1yZWd0eXBlW3J4XT1yZWd0eXBlW3J5XT0mY3R5cDsKKyAgbXJlZ25hbWVzW3NwXT1yZWduYW1lc1tzcF0gPSAic3AiOworICBtcmVnbmFtZXNbc3AxXT1yZWduYW1lc1tzcDFdID0gInNwIjsKKyAgbXJlZ25hbWVzW3NwMl09cmVnbmFtZXNbc3AyXSA9ICJzcCsxIjsKKworICBtcmVnbmFtZXNbcmF4XT1yZWduYW1lc1tyYXhdID0gImF4IjsKKyAgcmVnc2l6ZVtyYXhdPXJlZ3NpemVbc3BdPWwyem0oMkwpOworICByZWd0eXBlW3JheF09cmVndHlwZVtzcF09Jml0eXA7CisKKyAgcmVnX3ByaW9bcmFdPXJlZ19wcmlvW3JheF09MTAwOworICByZWdfcHJpb1tyeF09NTA7CisKKyAgbXJlZ25hbWVzW3JheHl6XT1yZWduYW1lc1tyYXh5el0gPSAiYXh5eiI7CisgIHJlZ3NpemVbcmF4eXpdPWwyem0oM0wpOworICByZWd0eXBlW3JheHl6XT0mbGx0eXA7CisKKyAgLyogIFVzZSBtdWx0aXBsZSBjY3MuICAgKi8KKyAgbXVsdGlwbGVfY2NzPTA7CisKKyAgc2hvcnRfcHVzaD0xOworCisgIHN0YXRpY19jc2U9MDsKKworICBkcmVmX2NzZT0xOworCisgIC8qcHJlZmVyX3N0YXRpY3M9MTsgVE9ETyAqLworCisKKyAgaWYob3B0c2l6ZSl7CisgICAgY2xpc3RfY29weV9zdGFjaz0yOworICAgIGNsaXN0X2NvcHlfcG9pbnRlcj0yOworICAgIGNsaXN0X2NvcHlfc3RhdGljPTI7CisgIH1lbHNlIGlmKG9wdHNwZWVkKXsKKyAgICBjbGlzdF9jb3B5X3N0YWNrPTY0OworICAgIGNsaXN0X2NvcHlfcG9pbnRlcj02NDsKKyAgICBjbGlzdF9jb3B5X3N0YXRpYz02NDsKKyAgfWVsc2V7CisgICAgY2xpc3RfY29weV9zdGFjaz04OworICAgIGNsaXN0X2NvcHlfcG9pbnRlcj04OworICAgIGNsaXN0X2NvcHlfc3RhdGljPTg7CisgIH0KKworICAvKiAgSW5pdGlhbGl6ZSB0aGUgbWluL21heC1zZXR0aW5ncy4gTm90ZSB0aGF0IHRoZSB0eXBlcyBvZiB0aGUgICAgICovCisgIC8qICBob3N0IHN5c3RlbSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIHRhcmdldCBzeXN0ZW0gYW5kIHlvdSBtYXkgKi8KKyAgLyogIG9ubHkgdXNlIHRoZSBzbWFsbGVzdCBtYXhpbXVtIHZhbHVlcyBBTlNJIGd1YXJhbnRlZXMgaWYgeW91ICAgICAqLworICAvKiAgd2FudCB0byBiZSBwb3J0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBUaGF0J3MgdGhlIHJlYXNvbiBmb3IgdGhlIHN1YnRyYWN0aW9uIGluIHRfbWluW0lOVF0uIExvbmcgY291bGQgKi8KKyAgLyogIGJlIHVuYWJsZSB0byByZXByZXNlbnQgLTIxNDc0ODM2NDggb24gdGhlIGhvc3Qgc3lzdGVtLiAgICAgICAgICAqLworICB0X21pbltDSEFSXT1sMnptKC0xMjhMKTsKKyAgdF9taW5bU0hPUlRdPWwyem0oLTMyNzY4TCk7CisgIHRfbWluW0xPTkddPXptc3ViKGwyem0oLTIxNDc0ODM2NDdMKSxsMnptKDFMKSk7CisgIHRfbWluW0lOVF09dF9taW4oU0hPUlQpOworICB0X21pbltMTE9OR109em1sc2hpZnQobDJ6bSgxTCksbDJ6bSg2M0wpKTsKKyAgdF9taW5bTUFYSU5UXT10X21pbihMTE9ORyk7CisgIHRfbWF4W0NIQVJdPXVsMnp1bSgxMjdMKTsKKyAgdF9tYXhbU0hPUlRdPXVsMnp1bSgzMjc2N1VMKTsKKyAgdF9tYXhbTE9OR109dWwyenVtKDIxNDc0ODM2NDdVTCk7CisgIHRfbWF4W0lOVF09dF9tYXgoU0hPUlQpOworICB0X21heFtMTE9OR109enVtcnNoaWZ0KHp1bWtvbXBsKHVsMnp1bSgwVUwpKSx1bDJ6dW0oMVVMKSk7CisgIHRfbWF4W01BWElOVF09dF9tYXgoTExPTkcpOworICB0dV9tYXhbQ0hBUl09dWwyenVtKDI1NVVMKTsKKyAgdHVfbWF4W1NIT1JUXT11bDJ6dW0oNjU1MzVVTCk7CisgIHR1X21heFtMT05HXT11bDJ6dW0oNDI5NDk2NzI5NVVMKTsKKyAgdHVfbWF4W0lOVF09dF9tYXgoVU5TSUdORUR8U0hPUlQpOworICB0dV9tYXhbTExPTkddPXp1bWtvbXBsKHVsMnp1bSgwVUwpKTsKKyAgdHVfbWF4W01BWElOVF09dF9tYXgoVU5TSUdORUR8TExPTkcpOworICAKKyAgLyogIFJlc2VydmUgYSBmZXcgcmVnaXN0ZXJzIGZvciB1c2UgYnkgdGhlIGNvZGUtZ2VuZXJhdG9yLiAgICAgICovCisgIC8qICBUaGlzIGlzIG5vdCBvcHRpbWFsIGJ1dCBzaW1wbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICByZWdzYVtyYXh5el09cmVnc2FbcnpdPXJlZ3NhW3J5XT1yZWdzYVtzcF09cmVnc2Fbc3AxXT1yZWdzYVtzcDJdPVJFR1NBX05FVkVSOworICByZWdzYVt0MV09cmVnc2FbdDJdPXJlZ3NhW3QzXT1yZWdzYVt0NF09UkVHU0FfTkVWRVI7CisgIHJlZ3NjcmF0Y2hbcmFdPXJlZ3NjcmF0Y2hbcnhdPXJlZ3NjcmF0Y2hbcmF4XT0xOworICBpZighR0xPQkFDQykKKyAgICByZWdzYVtyYV09cmVnc2FbcnhdPXJlZ3NhW3JheF09UkVHU0FfVEVNUFM7CisgIHJlZ3NjcmF0Y2hbc3BdPXJlZ3NjcmF0Y2hbc3AxXT1yZWdzY3JhdGNoW3NwMl09cmVnc2NyYXRjaFtyeV09cmVnc2NyYXRjaFtyel09MDsKKyAgcmVnc2NyYXRjaFt0MV09cmVnc2NyYXRjaFt0Ml09cmVnc2NyYXRjaFt0M109cmVnc2NyYXRjaFt0NF09MTsKKworICBmb3IoaT1GSVJTVF9HUFI7aTw9TEFTVF9HUFItVk9MX0dQUlM7aSsrKXsKKyAgICByZWdzY3JhdGNoW2ldPTE7CisgICAgaWYoaSYxKQorICAgICAgcmVnc2NyYXRjaFtGSVJTVF9QQUlSKyhpLUZJUlNUX0dQUikvMl09MTsKKyAgfQorCisgIHRhcmdldF9tYWNyb3M9bWFycmF5OworCisgIGRlY2xhcmVfYnVpbHRpbigiX19tdWxpbnQxNiIsSU5ULElOVCxGSVJTVF9QQUlSLElOVCxGSVJTVF9QQUlSKzEsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX211bHVpbnQxNiIsVU5TSUdORUR8SU5ULFVOU0lHTkVEfElOVCxGSVJTVF9QQUlSLFVOU0lHTkVEfElOVCxGSVJTVF9QQUlSKzEsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2RpdnVpbnQxNiIsVU5TSUdORUR8SU5ULFVOU0lHTkVEfElOVCxGSVJTVF9QQUlSLFVOU0lHTkVEfElOVCxGSVJTVF9QQUlSKzEsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2RpdmludDE2IixJTlQsSU5ULEZJUlNUX1BBSVIsSU5ULEZJUlNUX1BBSVIrMSwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbW9kdWludDE2IixVTlNJR05FRHxJTlQsVU5TSUdORUR8SU5ULEZJUlNUX1BBSVIsVU5TSUdORUR8SU5ULEZJUlNUX1BBSVIrMSwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbW9kaW50MTYiLElOVCxJTlQsRklSU1RfUEFJUixJTlQsRklSU1RfUEFJUisxLDEsMCk7CisKKyAgZGVjbGFyZV9idWlsdGluKCJfX211bGludDMyIixMT05HLExPTkcsRklSU1RfQklHKzEsTE9ORyxGSVJTVF9CSUcrMiwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbXVsdWludDMyIixVTlNJR05FRHxMT05HLFVOU0lHTkVEfExPTkcsRklSU1RfQklHKzEsVU5TSUdORUR8TE9ORyxGSVJTVF9CSUcrMiwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2aW50MzIiLExPTkcsTE9ORyxGSVJTVF9CSUcsTE9ORyxGSVJTVF9CSUcrMSwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2dWludDMyIixVTlNJR05FRHxMT05HLFVOU0lHTkVEfExPTkcsRklSU1RfQklHLFVOU0lHTkVEfExPTkcsRklSU1RfQklHKzEsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZGludDMyIixMT05HLExPTkcsRklSU1RfQklHLExPTkcsRklSU1RfQklHKzEsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZHVpbnQzMiIsVU5TSUdORUR8TE9ORyxVTlNJR05FRHxMT05HLEZJUlNUX0JJRyxVTlNJR05FRHxMT05HLEZJUlNUX0JJRysxLDEsMCk7CisKKyAgZGVjbGFyZV9idWlsdGluKCJfX211bGludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2FkZGludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3N1YmludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2FuZGludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX29yaW50NjQiLExMT05HLExMT05HLDAsTExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZW9yaW50NjQiLExMT05HLExMT05HLDAsTExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbmVnaW50NjQiLExMT05HLExMT05HLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19sc2xpbnQ2NCIsTExPTkcsTExPTkcsMCxJTlQsMCwxLDApOworCisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZ1aW50NjQiLFVOU0lHTkVEfExMT05HLFVOU0lHTkVEfExMT05HLDAsVU5TSUdORUR8TExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbW9kaW50NjQiLExMT05HLExMT05HLDAsTExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbW9kdWludDY0IixVTlNJR05FRHxMTE9ORyxVTlNJR05FRHxMTE9ORywwLFVOU0lHTkVEfExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2xzcmludDY0IixMTE9ORyxMTE9ORywwLElOVCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19sc3J1aW50NjQiLFVOU0lHTkVEfExMT05HLFVOU0lHTkVEfExMT05HLDAsSU5ULDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2NtcHNpbnQ2NCIsSU5ULExMT05HLDAsTExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fY21wdWludDY0IixJTlQsVU5TSUdORUR8TExPTkcsMCxVTlNJR05FRHxMTE9ORywwLDEsMCk7CisKKyAgZGVjbGFyZV9idWlsdGluKCJfX3NpbnQzMnRvZmx0MzIiLEZMT0FULExPTkcsT0xERlA/MDpGSVJTVF9CSUcsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX191aW50MzJ0b2ZsdDMyIixGTE9BVCxVTlNJR05FRHxMT05HLE9MREZQPzA6RklSU1RfQklHLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0MzJ0b3NpbnQzMiIsTE9ORyxGTE9BVCxPTERGUD8wOkZJUlNUX0JJRywwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDMydG91aW50MzIiLFVOU0lHTkVEfExPTkcsRkxPQVQsT0xERlA/MDpGSVJTVF9CSUcsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19zaW50MTZ0b2ZsdDMyIixGTE9BVCxJTlQsRklSU1RfUEFJUiwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3VpbnQxNnRvZmx0MzIiLEZMT0FULFVOU0lHTkVEfElOVCxGSVJTVF9QQUlSLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0MzJ0b3NpbnQxNiIsSU5ULEZMT0FULE9MREZQPzA6RklSU1RfQklHLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0MzJ0b3VpbnQxNiIsVU5TSUdORUR8SU5ULEZMT0FULE9MREZQPzA6RklSU1RfQklHLDAsMCwxLDApOworCisgIGRlY2xhcmVfYnVpbHRpbigiX19zaW50MzJ0b2ZsdDY0IixET1VCTEUsTE9ORyxPTERGUD8wOkZJUlNUX0JJRywwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3VpbnQzMnRvZmx0NjQiLERPVUJMRSxVTlNJR05FRHxMT05HLE9MREZQPzA6RklSU1RfQklHLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b3NpbnQzMiIsTE9ORyxET1VCTEUsT0xERlA/MDpGSVJTVF9CSUdQLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b3VpbnQzMiIsVU5TSUdORUR8TE9ORyxET1VCTEUsT0xERlA/MDpGSVJTVF9CSUdQLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDE2dG9mbHQ2NCIsRE9VQkxFLElOVCxGSVJTVF9QQUlSLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fdWludDE2dG9mbHQ2NCIsRE9VQkxFLFVOU0lHTkVEfElOVCxGSVJTVF9QQUlSLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b3NpbnQxNiIsSU5ULERPVUJMRSxPTERGUD8wOkZJUlNUX0JJR1AsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQ2NHRvdWludDE2IixVTlNJR05FRHxJTlQsRE9VQkxFLE9MREZQPzA6RklSU1RfQklHUCwwLDAsMSwwKTsKKworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b2ZsdDMyIixGTE9BVCxET1VCTEUsT0xERlA/MDpGSVJTVF9CSUdQLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0MzJ0b2ZsdDY0IixET1VCTEUsRkxPQVQsT0xERlA/MDpGSVJTVF9CSUcsMCwwLDEsMCk7CisKKyAgZGVjbGFyZV9idWlsdGluKCJfX2FkZGZsdDMyIixGTE9BVCxGTE9BVCxPTERGUD8wOkZJUlNUX0JJRysxLEZMT0FULE9MREZQPzA6RklSU1RfQklHLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19zdWJmbHQzMiIsRkxPQVQsRkxPQVQsT0xERlA/MDpGSVJTVF9CSUcrMSxGTE9BVCxPTERGUD8wOkZJUlNUX0JJRywxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbXVsZmx0MzIiLEZMT0FULEZMT0FULE9MREZQPzA6RklSU1RfQklHKzEsRkxPQVQsT0xERlA/MDpGSVJTVF9CSUcsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2RpdmZsdDMyIixGTE9BVCxGTE9BVCxPTERGUD8wOkZJUlNUX0JJRysxLEZMT0FULE9MREZQPzA6RklSU1RfQklHLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19uZWdmbHQzMiIsRkxPQVQsRkxPQVQsT0xERlA/MDpGSVJTVF9CSUcsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19jbXBzZmx0MzIiLENIQVIsRkxPQVQsT0xERlA/MDpGSVJTVF9CSUcrMSxGTE9BVCxPTERGUD8wOkZJUlNUX0JJRywxLDApOworCisjaWYgMAorICBmb3IoaT0xO2k8TUFYUjtpKyspeworICAgIHByaW50ZigiJTAyZCAlcyBzY3JhdGNoPSVkICIsaSxyZWduYW1lc1tpXSxyZWdzY3JhdGNoW2ldKTsKKyAgICBpZihyZWdfcGFpcihpLCZycCkpCisgICAgICBwcmludGYoInBhaXIoJXMsJXMpIixyZWduYW1lc1tycC5yMV0scmVnbmFtZXNbcnAucjJdKTsKKyAgICBwcmludGYoIlxuIik7CisgIH0KKyNlbmRpZgorCisgIGlmKE5PUEVFUCkgbm9wZWVwPTE7CisgIGlmKENCTUFTQ0lJKSBjYm1hc2NpaT0xOworICBpZihBVEFTQ0lJKSBhdGFzY2lpPTE7CisKKworICBmb3IoaT0wO2k8PU1BWF9UWVBFO2krKyl7CisgICAgc2l6ZXRhYltpXT1sMnptKG1zaXpldGFiW2ldKTsKKyAgICBhbGlnbltpXT1sMnptKG1hbGlnbltpXSk7CisgIH0KKworICBiYW5rdi5zdG9yYWdlX2NsYXNzPUVYVEVSTjsKKyAgYmFua3YuaWRlbnRpZmllcj0iX19iYW5rdiI7CisgIGJhbmt2LnZ0eXA9bmV3X3R5cCgpOworICBiYW5rdi52dHlwLT5mbGFncz1DSEFSOworCisgIGJhbmtjbnVtPUNPTU1PTkJBTks7CisKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgaW5pdF9kYihGSUxFICpmKQoreworfQorCitpbnQgZnJldHVybihzdHJ1Y3QgVHlwICp0KQorLyogIFJldHVybnMgdGhlIHJlZ2lzdGVyIGluIHdoaWNoIHZhcmlhYmxlcyBvZiB0eXBlIHQgYXJlIHJldHVybmVkLiAqLworLyogIElmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgcmV0dXJuZWQgaW4gYSByZWdpc3RlciByZXR1cm5zIDAuICAgICAgICAqLworLyogIEEgcG9pbnRlciBNVVNUIGJlIHJldHVybmVkIGluIGEgcmVnaXN0ZXIuIFRoZSBjb2RlLWdlbmVyYXRvciAgICAqLworLyogIGhhcyB0byBzaW11bGF0ZSBhIHBzZXVkbyByZWdpc3RlciBpZiBuZWNlc3NhcnkuICAgICAgICAgICAgICAgICAqLworeworICBpbnQgdHlwPXQtPmZsYWdzJk5ROworICBpZihJU1NUUlVDVCh0eXApfHxJU1VOSU9OKHR5cCl8fHR5cD09Vk9JRCkgCisgICAgcmV0dXJuIDA7CisgIGlmKE9MREZQJiZJU0ZMT0FUKHR5cCkpIHJldHVybiBGSVJTVF9HUFI7CisgIGlmKHR5cD09TE9OR3x8dHlwPT1GTE9BVHx8SVNGUE9JTlRFUih0eXApfHwoIWllZWUmJih0eXA9PURPVUJMRXx8dHlwPT1MRE9VQkxFKSkpCisgICAgcmV0dXJuIEZJUlNUX0JJRzsKKyAgaWYodHlwPT1MTE9OR3x8KGllZWUmJih0eXA9PURPVUJMRXx8dHlwPT1MRE9VQkxFKSkpCisgICAgcmV0dXJuIEZJUlNUX0JJR1A7CisgIGlmKHptbGVxKHN6b2YodCksbDJ6bSgxTCkpKQorICAgIHJldHVybiByYTsKKyAgaWYoem1sZXEoc3pvZih0KSxsMnptKDJMKSkpIAorICAgIHJldHVybiByYXg7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworaW50IHJlZ19wYWlyKGludCByLHN0cnVjdCBycGFpciAqcCkKKy8qIFJldHVybnMgMCBpZiB0aGUgcmVnaXN0ZXIgaXMgbm8gcmVnaXN0ZXIgcGFpci4gSWYgciAgKi8KKy8qIGlzIGEgcmVnaXN0ZXIgcGFpciBub24temVybyB3aWxsIGJlIHJldHVybmVkIGFuZCB0aGUgKi8KKy8qIHN0cnVjdHVyZSBwb2ludGVkIHRvIHAgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgdHdvICAgKi8KKy8qIGVsZW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYocj49RklSU1RfUEFJUiYmcjw9TEFTVF9QQUlSKXsKKyAgICBwLT5yMT0oci1GSVJTVF9QQUlSKSoyK0ZJUlNUX0dQUjsKKyAgICBwLT5yMj1wLT5yMSsxOworICAgIHJldHVybiAxOworICB9ZWxzZSBpZihyPj1GSVJTVF9CSUdQJiZyPD1MQVNUX0JJR1ApeworICAgIHAtPnIxPShyLUZJUlNUX0JJR1ApKjIrRklSU1RfQklHOworICAgIHAtPnIyPXAtPnIxKzE7CisgICAgcmV0dXJuIDE7CisgIH1lbHNlIGlmKHI9PXJheCl7CisgICAgcC0+cjE9cmE7CisgICAgcC0+cjI9cng7CisgICAgcmV0dXJuIDE7CisgIH1lbHNlIGlmKHI9PXJheHl6KSB7CisgICAgLy8gVE9ETzogUEdTOiBIb3cgZG8gd2UgZGVjbGFyZSBhIHJlZyBwYWlyIHRoYXQgaXMgbWFkZSBvZiA0IHJlZ3MsIG5vdCAyPworICAgIHAtPnIxPXJhOworICAgIHAtPnIyPXJ4OworICAgIHJldHVybiAxOworICB9ZWxzZSBpZihyPT1zcCl7CisgICAgcC0+cjE9c3AxOworICAgIHAtPnIyPXNwMjsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyogZXN0aW1hdGUgdGhlIGNvc3Qtc2F2aW5nIGlmIG9iamVjdCBvIGZyb20gSUMgcCBpcyBwbGFjZWQgaW4KKyAgIHJlZ2lzdGVyIHIgKi8KK2ludCBjb3N0X3NhdmluZ3Moc3RydWN0IElDICpwLGludCByLHN0cnVjdCBvYmogKm8pCit7CisgIGludCBjPXAtPmNvZGU7CisgIC8qVE9ETzogYWRhcHQgdGhpcyAqLworICBpZihvLT5mbGFncyZWS09OU1QpeworICAgIHJldHVybiAwOworICAgIGlmKG89PSZwLT5xMSYmcC0+Y29kZT09QVNTSUdOJiYocC0+ei5mbGFncyZEUkVGT0JKKSkKKyAgICAgIHJldHVybiA0OworICAgIGVsc2UKKyAgICAgIHJldHVybiAyOworICB9CisgIGlmKG8tPmZsYWdzJkRSRUZPQkopeworICAgIGlmKGlzcHRyKHIpKQorICAgICAgcmV0dXJuIDQ7CisgICAgaWYocj09cmF4KQorICAgICAgcmV0dXJuIElOVF9NSU47CisgIH0KKyAgaWYoYz09U0VUUkVUVVJOJiZyPT1wLT56LnJlZyYmIShvLT5mbGFncyZEUkVGT0JKKSkgcmV0dXJuIDY7CisgIGlmKGM9PUdFVFJFVFVSTiYmcj09cC0+cTEucmVnJiYhKG8tPmZsYWdzJkRSRUZPQkopKSByZXR1cm4gNjsKKyAgaWYocj09cmEpCisgICAgcmV0dXJuIDU7CisgIGlmKHI9PXJ4KQorICAgIHJldHVybiA0OworICBpZihyPT1yYXgpCisgICAgcmV0dXJuIDI7CisgIHJldHVybiAyOworfQorCitpbnQgcmVnb2soaW50IHIsaW50IHQsaW50IG1vZGUpCisvKiAgUmV0dXJucyAwIGlmIHJlZ2lzdGVyIHIgY2Fubm90IHN0b3JlIHZhcmlhYmxlcyBvZiAgICovCisvKiAgdHlwZSB0LiBJZiB0PT1QT0lOVEVSIGFuZCBtb2RlIT0wIHRoZW4gaXQgcmV0dXJucyAgICovCisvKiAgbm9uLXplcm8gb25seSBpZiB0aGUgcmVnaXN0ZXIgY2FuIHN0b3JlIGEgcG9pbnRlciAgICovCisvKiAgYW5kIGRlcmVmZXJlbmNlIGEgcG9pbnRlciB0byBtb2RlLiAgICAgICAgICAgICAgICAgICovCit7CisgIGlmKHI9PTApCisgICAgcmV0dXJuIDA7CisgIGlmKHI9PXJheCYmTk9SQVgpCisgICAgcmV0dXJuIDA7CisgIHQmPU5ROworICBpZihJU0NIQVIodCkpCisgICAgaWYocj09cmEvKnx8cj09cngqL3x8KHI+PUZJUlNUX0dQUiYmcjw9TEFTVF9HUFIpKQorICAgICAgcmV0dXJuIDE7CisgIGlmKElTU0hPUlQodCkpeworICAgIGlmKHI9PXJheCl7CisgICAgICBpZih0PT1QT0lOVEVSJiZtb2RlPDApCisJcmV0dXJuIDE7CisgICAgICBpZih0IT1QT0lOVEVSKQorCXJldHVybiAxOworICAgIH0KKyAgICBpZihyPj1GSVJTVF9QQUlSJiZyPD1MQVNUX1BBSVIpCisgICAgICByZXR1cm4gMTsKKyAgfQorICBpZihyPj1GSVJTVF9CSUcmJnI8PUxBU1RfQklHKXsKKyAgICBpZih0PT1MT05HfHx0PT1GTE9BVHx8KCh0PT1ET1VCTEV8fHQ9PUxET1VCTEUpJiYhaWVlZSkpCisgICAgICByZXR1cm4gMTsKKyAgICBpZih0PT1GUE9JTlRFUikKKyAgICAgIHJldHVybiAxOworICB9CisgIGlmKHI+PUZJUlNUX0JJR1AmJnI8PUxBU1RfQklHUCl7CisgICAgaWYodD09TExPTkd8fCgodD09RE9VQkxFfHx0PT1MRE9VQkxFKSYmaWVlZSkpCisgICAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IGRhbmdlcm91c19JQyhzdHJ1Y3QgSUMgKnApCisvKiAgUmV0dXJucyB6ZXJvIGlmIHRoZSBJQyBwIGNhbiBiZSBzYWZlbHkgZXhlY3V0ZWQgICAgICovCisvKiAgd2l0aG91dCBkYW5nZXIgb2YgZXhjZXB0aW9ucyBvciBzaW1pbGFyIHRoaW5ncy4gICAgICovCisvKiAgdmJjYyBtYXkgZ2VuZXJhdGUgY29kZSBpbiB3aGljaCBub24tZGFuZ2Vyb3VzIElDcyAgICovCisvKiAgYXJlIHNvbWV0aW1lcyBleGVjdXRlZCBhbHRob3VnaCBjb250cm9sLWZsb3cgbWF5ICAgICovCisvKiAgbmV2ZXIgcmVhY2ggdGhlbSAobWFpbmx5IHdoZW4gbW92aW5nIGNvbXB1dGF0aW9ucyAgICovCisvKiAgb3V0IG9mIGxvb3BzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVHlwaWNhbCBJQ3MgdGhhdCBnZW5lcmF0ZSBleGNlcHRpb25zIG9uIHNvbWUgICAgICAgICovCisvKiAgbWFjaGluZXMgYXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gYWNjZXNzZXMgdmlhIHBvaW50ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gZGl2aXNpb24vbW9kdWxvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gb3ZlcmZsb3cgb24gc2lnbmVkIGludGVnZXIvZmxvYXRzICAgICAgICAgICAgICovCit7CisgIGludCBjPXAtPmNvZGU7CisgIGlmKChwLT5xMS5mbGFncyZEUkVGT0JKKXx8KHAtPnEyLmZsYWdzJkRSRUZPQkopfHwocC0+ei5mbGFncyZEUkVGT0JKKSkKKyAgICByZXR1cm4gMTsKKyAgaWYoKGM9PURJVnx8Yz09TU9EKSYmIWlzY29uc3QocTIpKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworaW50IG11c3RfY29udmVydChpbnQgbyxpbnQgdCxpbnQgY29uc3RfZXhwcikKKy8qICBSZXR1cm5zIHplcm8gaWYgY29kZSBmb3IgY29udmVydGluZyBucCB0byB0eXBlIHQgICAgKi8KKy8qICBjYW4gYmUgb21pdHRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBPbiB0aGUgUG93ZXJQQyBjcHUgcG9pbnRlcnMgYW5kIDMyYml0ICAgICAgICAgICAgICAgKi8KKy8qICBpbnRlZ2VycyBoYXZlIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uIGFuZCBjYW4gdXNlICAgKi8KKy8qICB0aGUgc2FtZSByZWdpc3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IG9wPW8mTlEsdHA9dCZOUTsKKworICBpZihvcD09dHApIHJldHVybiAwOworICBpZihJU0NIQVIob3ApJiZJU0NIQVIodHApKSByZXR1cm4gMDsKKyAgaWYoSVNTSE9SVChvcCkmJklTU0hPUlQodHApKSByZXR1cm4gMDsKKyAgaWYoIWllZWUmJklTRkxPQVQob3ApJiZJU0ZMT0FUKHRwKSkgcmV0dXJuIDA7CisgIGlmKG9wPT1ET1VCTEUmJnRwPT1MRE9VQkxFKSByZXR1cm4gMDsKKyAgaWYob3A9PUxET1VCTEUmJnRwPT1ET1VCTEUpIHJldHVybiAwOworCisgIHJldHVybiAxOworfQorCit2b2lkIGdlbl9kcyhGSUxFICpmLHptYXggc2l6ZSxzdHJ1Y3QgVHlwICp0KQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSA8c2l6ZT4gYnl0ZXMgb2Ygc3RvcmFnZSAqLworLyogIGluaXRpYWxpemVkIHdpdGggemVyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpZihTVERTWU5UQVgpCisgICAgZW1pdChmLCJcdHNwYWNlXHQlbGRcbiIsem0ybChzaXplKSk7CisgIGVsc2UKKyAgICBlbWl0KGYsIlx0cmVzZXJ2ZVx0JWxkXG4iLHptMmwoc2l6ZSkpOworICBuZXdvYmo9MDsKK30KKwordm9pZCBnZW5fYWxpZ24oRklMRSAqZix6bWF4IGFsaWduKQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIG1ha2Ugc3VyZSB0aGUgbmV4dCBkYXRhIGlzICAgICAqLworLyogIGFsaWduZWQgdG8gbXVsdGlwbGVzIG9mIDxhbGlnbj4gYnl0ZXMuICAgICAgICAgICAgICAqLworeworICBpZih6bTJsKGFsaWduKT4xKSBlbWl0KGYsIlx0YWxpZ24gMVxuIik7Cit9CisKK3ZvaWQgZ2VuX3Zhcl9oZWFkKEZJTEUgKmYsc3RydWN0IFZhciAqdikKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjcmVhdGUgdGhlIGhlYWQgb2YgYSB2YXJpYWJsZSAgKi8KKy8qICBkZWZpbml0aW9uLCBpLmUuIHRoZSBsYWJlbCBhbmQgaW5mb3JtYXRpb24gZm9yICAgICAgKi8KKy8qICBsaW5rYWdlIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGNvbnN0ZmxhZyxiPWJhbmsodik7Y2hhciAqc2VjOworICBpZih2LT5jbGlzdCkgY29uc3RmbGFnPWlzX2NvbnN0KHYtPnZ0eXApOworICBpZih2LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpeworICAgIGlmKElTRlVOQyh2LT52dHlwLT5mbGFncykpIHJldHVybjsKKyAgICBpZih2LT50YXR0ciZaUEFHRSkKKyAgICAgIGVtaXQoZiwiXHR6cGFnZVx0JXMlbGRcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgaWYoIXNwZWNpYWxfc2VjdGlvbihmLHYpKXsKKyAgICAgIGlmKHYtPmNsaXN0JiYoIWNvbnN0ZmxhZ3x8KGdfZmxhZ3NbMl0mVVNFREZMQUcpKSl7ZW1pdChmLGRhdGFuYW1lKTtlYmFuayhmLGIpO2lmKGYpIHNlY3Rpb249REFUQTt9CisgICAgICBpZih2LT5jbGlzdCYmY29uc3RmbGFnJiYhKGdfZmxhZ3NbMl0mVVNFREZMQUcpKXtlbWl0KGYscm9kYXRhbmFtZSk7ZWJhbmsoZixiKTtpZihmKSBzZWN0aW9uPVJPREFUQTt9CisgICAgICBpZighdi0+Y2xpc3Qpe2VtaXQoZixic3NuYW1lKTtlYmFuayhmLGIpO2lmKGYpIHNlY3Rpb249QlNTO30KKyAgICB9CisgICAgZ2VuX2FsaWduKGYsZmFsaWduKHYtPnZ0eXApKTsKKyAgICBlbWl0KGYsIiVzJWxkOlxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKyAgICBuZXdvYmo9MTsKKyAgfQorICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4peworICAgIGVtaXQoZiwiXHRnbG9iYWxcdCVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgaWYodi0+dGF0dHImWlBBR0UpCisgICAgICBlbWl0KGYsIlx0enBhZ2VcdCVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgaWYodi0+ZmxhZ3MmKERFRklORUR8VEVOVEFUSVZFKSl7CisgICAgICBpZighc3BlY2lhbF9zZWN0aW9uKGYsdikpeworCWlmKHYtPmNsaXN0JiYoIWNvbnN0ZmxhZ3x8KGdfZmxhZ3NbMl0mVVNFREZMQUcpKSl7ZW1pdChmLGRhdGFuYW1lKTtlYmFuayhmLGIpO2lmKGYpIHNlY3Rpb249REFUQTt9CisJaWYodi0+Y2xpc3QmJmNvbnN0ZmxhZyYmIShnX2ZsYWdzWzJdJlVTRURGTEFHKSl7ZW1pdChmLHJvZGF0YW5hbWUpO2ViYW5rKGYsYik7aWYoZikgc2VjdGlvbj1ST0RBVEE7fQorCWlmKCF2LT5jbGlzdCl7ZW1pdChmLGJzc25hbWUpO2ViYW5rKGYsYik7aWYoZikgc2VjdGlvbj1CU1M7fQorICAgICAgfQorCisgICAgICBnZW5fYWxpZ24oZixmYWxpZ24odi0+dnR5cCkpOworICAgICAgZW1pdChmLCIlcyVzOlxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICAgIG5ld29iaj0xOworICAgIH0KKyAgfQorfQorCit2b2lkIGdlbl9kYyhGSUxFICpmLGludCB0LHN0cnVjdCBjb25zdF9saXN0ICpwKQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSBzdGF0aWMgc3RvcmFnZSAgICAgICAgICAqLworLyogIGluaXRpYWxpemVkIHdpdGggY29uc3QtbGlzdCBwLiAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpZihJU0NIQVIodCkpCisgICAgZW1pdChmLCJcdGJ5dGVcdCIpOworICBlbHNlCisgICAgZW1pdChmLCJcdHdvcmRcdCIpOworICBpZighcC0+dHJlZSl7CisgICAgaWYoSVNMT05HKHQpfHxJU0ZMT0FUKHQpKXsKKyAgICAgIGlmKGllZWUmJklTRkxPQVQodCkpeworCWVtaXRfaWVlZShmLCZwLT52YWwsdCZOUSk7CisgICAgICB9ZWxzZXsKKwlldmFsX2NvbnN0KCZwLT52YWwsdCZOVSk7CisJaWYoSVNGTE9BVCh0KSkgY252X2ZwKCk7CisJZ3ZhbC52bWF4PXptYW5kKHZtYXgsbDJ6bSgweGZmZmZMKSk7CisJZW1pdHZhbChmLCZndmFsLE1BWElOVCk7CisJZW1pdChmLCIsIik7CisJZ3ZhbC52bWF4PXptYW5kKHptcnNoaWZ0KHZtYXgsbDJ6bSgxNkwpKSxsMnptKDB4ZmZmZkwpKTsKKwllbWl0dmFsKGYsJmd2YWwsTUFYSU5UKTsKKyAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgIGlmKElTRlBPSU5URVIodCkpeworCWV2YWxfY29uc3QoJnAtPnZhbCx0Jk5VKTsKKwllbWl0KGYsIiVsZFxuIiwobG9uZyl6bTJsKHZtYXgpJjB4ZmZmZik7CisJZW1pdChmLCJcdGJ5dGVcdCVkXG4iLChpbnQpKCh6bTJsKHZtYXgpPj4xNikmMHhmZikpOworICAgICAgfWVsc2UKKwllbWl0dmFsKGYsJnAtPnZhbCx0Jk5VKTsKKyAgICB9CisgIH1lbHNleworICAgIGVtaXRfb2JqKGYsJnAtPnRyZWUtPm8sdCZOVSk7CisgICAgaWYoSVNGUE9JTlRFUih0KSl7CisgICAgICBpbnQgYjsKKyAgICAgIGlmKChwLT50cmVlLT5vLmZsYWdzJihWQVJ8VkFSQURSKSkhPShWQVJ8VkFSQURSKSkgaWVycm9yKDApOworICAgICAgYj1iYW5rKHAtPnRyZWUtPm8udik7CisgICAgICBlbWl0KGYsIlxuXHRieXRlXHQlZCIsYj49MD9iOmJhbmtjbnVtKTsKKyAgICB9CisgIH0KKyAgZW1pdChmLCJcbiIpO25ld29iaj0wOworfQorCisKKy8qICBUaGUgbWFpbiBjb2RlLWdlbmVyYXRpb24gcm91dGluZS4gICAgICAgICAgICAgICAgICAgKi8KKy8qICBmIGlzIHRoZSBzdHJlYW0gdGhlIGNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8uICAgICAgKi8KKy8qICBwIGlzIGEgcG9pbnRlciB0byBhIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBJQ3MgICAgICAgKi8KKy8qICBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBib2R5IHRvIGdlbmVyYXRlIGNvZGUgZm9yLiAgKi8KKy8qICB2IGlzIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBvZmZzZXQgaXMgdGhlIHNpemUgb2YgdGhlIHN0YWNrZnJhbWUgdGhlIGZ1bmN0aW9uICAgKi8KKy8qICBuZWVkcyBmb3IgbG9jYWwgdmFyaWFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwordm9pZCBnZW5fY29kZShGSUxFICpmLHN0cnVjdCBJQyAqcCxzdHJ1Y3QgVmFyICp2LHptYXggb2Zmc2V0KQorLyogIFRoZSBtYWluIGNvZGUtZ2VuZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGMsdCxpOworICBzdHJ1Y3QgSUMgKm1pOworICBGSUxFICpyZj1mOworICBzdGF0aWMgY2hhciAqZGJnZmlsZTsKKyAgc3RhdGljIGludCBkYmdsaW5lOworCisgIGlmKHZsYXMpeworICAgIGZwPUZQVkxBX1JFRzsKKyAgICBpZighcmVnX3BhaXIoZnAsJnJwKSkgaWVycm9yKDApOworICAgIGZwMT1ycC5yMTsKKyAgICBmcDI9cnAucjI7CisgICAgcmVndXNlZFtmcF09cmVndXNlZFtmcDFdPXJlZ3VzZWRbZnAyXT0xOworICAgfWVsc2V7CisgICAgZnA9c3A7CisgICAgZnAxPXNwMTsKKyAgICBmcDI9c3AyOworICB9CisgIGFyZ3NpemU9MDsKKyAgbG9jYWxzaXplPW9mZnNldDsKKyAgaWYoREVCVUcmMSkgcHJpbnRmKCJnZW5fY29kZSgpXG4iKTsKKworICBjYmFuaz1iYW5rKHYpOworCisgIGlmKCF2LT5maSkgdi0+Zmk9bmV3X2ZpKCk7CisgIHYtPmZpLT5mbGFnc3w9QUxMX1JFR1M7CisKKyAgZm9yKHBhc3M9MDtwYXNzPDI7cGFzcysrKXsKKworICAgIGlmKERFQlVHJjEpIHByaW50ZigicGFzcyAlZFxuIixwYXNzKTsKKworICAgIGlmKHBhc3M9PTApeworICAgICAgZj0wOworICAgICAgbWk9Y2xvbmVfaWMocCk7CisgICAgfWVsc2UKKyAgICAgIGY9cmY7CisKKyAgICBmb3IoYz0xO2M8PU1BWFI7YysrKSByZWdzW2NdPTA7IC8qcmVnc2FbY107Ki8KKyAgICBtYXhwdXNoZWQ9MDsKKworICAgIC8qRklYTUUqLworICAgIGlmKHYtPnRhdHRyJklOVEVSUlVQVCl7CisgICAgICByZXQ9Ilx0cnRpXG4iOworICAgICAgaW5faXNyPTE7CisgICAgfWVsc2V7CisgICAgICByZXQ9Ilx0cnRzXG4iOworICAgICAgaW5faXNyPTA7CisgICAgfQorCisgICAgaWYoIW5vcGVlcCkgcGVlcGhvbGUocGFzcz09MD9wOm1pKTsKKworICAgIGZ1bmN0aW9uX3RvcChmLHYsbG9jYWxzaXplKTsKKworICAgIHB1c2hlZD0wOworCisgICAgeXZhbD1OT1ZBTDsKKworICAgIGRiZ2ZpbGU9MDsKKyAgICBkYmdsaW5lPTA7CisKKyAgICBmb3IocD1wYXNzPT0wP3A6bWk7cDtwcihmLHApLHA9cC0+bmV4dCl7CisKKworCisgICAgICBpZihERUJVRyYxKSBwcmljMihzdGRvdXQscCk7CisKKyAgICAgIGlmKGRlYnVnX2luZm8peworCWlmKHAtPmZpbGUmJnAtPmxpbmUpeworCSAgaWYocC0+ZmlsZSE9ZGJnZmlsZXx8cC0+bGluZSE9ZGJnbGluZSl7CisJICAgIGRiZ2ZpbGU9cC0+ZmlsZTsKKwkgICAgZGJnbGluZT1wLT5saW5lOworCSAgICBlbWl0KGYsIjsgJWQgXCIlc1wiXG4iLGRiZ2xpbmUsZGJnZmlsZSk7CisJICB9CisJfQorICAgICAgfQorCisgICAgICBjPXAtPmNvZGU7dD1wLT50eXBmOworCisgICAgICBpZihjPT1OT1ApIHtwLT56LmZsYWdzPTA7Y29udGludWU7fQorICAgICAgaWYoYz09QUxMT0NSRUcpeworCXJlZ3NbcC0+cTEucmVnXT0xOworCWlmKHJlZ19wYWlyKHAtPnExLnJlZywmcnApKXsKKwkgIHJlZ3NbcnAucjFdPTE7CisJICByZWdzW3JwLnIyXT0xOworCX0KKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PUZSRUVSRUcpeworCXJlZ3NbcC0+cTEucmVnXT0wOworCWlmKHJlZ19wYWlyKHAtPnExLnJlZywmcnApKXsKKwkgIHJlZ3NbcnAucjFdPTA7CisJICByZWdzW3JwLnIyXT0wOworCX0KKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PUxBQkVMKSB7ZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsdCk7eXZhbD1OT1ZBTDtjb250aW51ZTt9CisgICAgICBpZihjPT1CUkEpeworCXl2YWw9Tk9WQUw7CisJaWYodD09ZXhpdF9sYWJlbCYmbG9jYWxzaXplK2FyZ3NpemUrcnNhdmVzaXplK3JzY250PT0wKQorCSAgZW1pdChmLHJldCk7CisJZWxzZQorCSAgZW1pdChmLCJcdGptcFx0JXMlZFxuIixsYWJwcmVmaXgsdCk7CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZihjPj1CRVEmJmM8QlJBKXsKKwl5dmFsPU5PVkFMOworCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZihjPT1NT1ZFVE9SRUcpeworCXAtPmNvZGU9Yz1BU1NJR047CisJcC0+dHlwZj10PXJlZ3R5cGVbcC0+ei5yZWddLT5mbGFnczsKKwlwLT5xMi52YWwudm1heD1zaXpldGFiW3JlZ3R5cGVbcC0+ei5yZWddLT5mbGFnc107CisgICAgICB9CisgICAgICBpZihjPT1NT1ZFRlJPTVJFRyl7CisJcC0+Y29kZT1jPUFTU0lHTjsKKwlwLT50eXBmPXQ9cmVndHlwZVtwLT5xMS5yZWddLT5mbGFnczsKKwlwLT5xMi52YWwudm1heD1zaXpldGFiW3JlZ3R5cGVbcC0+cTEucmVnXS0+ZmxhZ3NdOworICAgICAgfQorICAgICAgaWYoYz09Q09OVkVSVCYmSVNDSEFSKHQpJiZJU0NIQVIocC0+dHlwZjIpKXsKKwlwLT5jb2RlPWM9QVNTSUdOOworCXAtPnEyLnZhbC52bWF4PXNpemV0YWJbQ0hBUl07CisgICAgICB9CisgICAgICBpZihjPT1DT05WRVJUJiZtc2l6ZXRhYlt0Jk5RXT09MyYmbXNpemV0YWJbcC0+dHlwZjImTlFdPT0zKXsKKwlwLT5jb2RlPWM9QVNTSUdOOworCXAtPnEyLnZhbC52bWF4PXNpemV0YWJbU0hPUlRdOworICAgICAgfQorICAgICAgaWYoYz09Q09OVkVSVCYmSVNTSE9SVCh0KSYmSVNTSE9SVChwLT50eXBmMikpeworCXAtPmNvZGU9Yz1BU1NJR047CisJcC0+cTIudmFsLnZtYXg9c2l6ZXRhYltTSE9SVF07CisgICAgICB9CisgICAgICBpZihjPT1DT05WRVJUJiZJU0xPTkcodCkmJklTTE9ORyhwLT50eXBmMikpeworCXAtPmNvZGU9Yz1BU1NJR047CisJcC0+cTIudmFsLnZtYXg9c2l6ZXRhYltMT05HXTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PUNPTlZFUlQmJklTTExPTkcodCkmJklTTExPTkcocC0+dHlwZjIpKXsKKwlwLT5jb2RlPWM9QVNTSUdOOworCXAtPnEyLnZhbC52bWF4PXNpemV0YWJbTExPTkddOworICAgICAgfQorICAgICAgaWYoYz09Q09OVkVSVCYmSVNGTE9BVCh0KSYmSVNGTE9BVChwLT50eXBmMikpeworCXAtPmNvZGU9Yz1BU1NJR047CisJcC0+cTIudmFsLnZtYXg9c2l6ZXRhYlt0Jk5RXTsKKyAgICAgIH0KKworCisgICAgICAvKiBzd2l0Y2ggY29tbXV0YXRpdmUgb3BlcmFuZHMgaWYgc3VpdGFibGUgKi8KKyAgICAgIGlmKGM9PUFERHx8Yz09TVVMVHx8Yz09QU5EfHxjPT1YT1J8fGM9PU9SfHwoYz09QURESTJQJiZJU1NIT1JUKHQpJiYhSVNGUE9JTlRFUihwLT50eXBmMikpKXsKKwlpZihjb21wYXJlX29iamVjdHMoJnAtPnEyLCZwLT56KXx8aXNhY2MocTIpKXsKKwkgIHN0cnVjdCBvYmogdG1wOworCSAgdG1wPXAtPnExOworCSAgcC0+cTE9cC0+cTI7CisJICBwLT5xMj10bXA7CisJfQorICAgICAgfQorCisgICAgICBpZihjPT1DT01QQVJFJiYocC0+cTEuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworCW9iaiB0bXA7CisJdG1wPXAtPnExOworCXAtPnExPXAtPnEyOworCXAtPnEyPXRtcDsKKyAgICAgIH0KKworICAgICAgYz1wLT5jb2RlOworICAgICAgaWYoYz09U1VCUEZQKSBjPVNVQjsKKyAgICAgIC8qaWYoYz09QURESTJQKSBjPUFERDsqLworICAgICAgLyppZihjPT1TVUJJRlApIGM9U1VCOyovCisKKworICAgICAgaWYoYz09TUlOVVMpeworCWlmKGlzYWNjKHExKSYmaXNhY2MoeikpeworCSAgZW1pdChmLCJcdG5lZ1xuIik7CisJICBpZighSVNDSEFSKHQpKXsKKwkgICAgZW1pdChmLCJcdHBoYVxuIik7CisJICAgIGVtaXQoZiwiXHR0eGFcbiIpOworCSAgICBlbWl0KGYsIlx0ZW9yXHQjMjU1XG4iKTsKKwkgICAgZW1pdChmLCJcdGFkY1x0IzBcbiIpOworCSAgICBlbWl0KGYsIlx0dGF4XG4iKTsKKwkgICAgZW1pdChmLCJcdHBsYVxuIik7CisJICB9CisJICBjb250aW51ZTsKKwl9CisJcC0+Y29kZT1jPVNVQjsKKwlwLT5xMj1wLT5xMTsKKwlwLT5xMS5mbGFncz1LT05TVDsKKwlndmFsLnZtYXg9WjA7CisJZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworCWluc2VydF9jb25zdCgmcC0+cTEudmFsLHQpOworICAgICAgfQorCisgICAgICBwcmVsb2FkKGYscCk7CisKKyAgICAgIGlmKGM9PUNPTlZFUlQpeworCWludCB0bz1xMXR5cChwKSZOVTsKKwl0Jj1OVTsKKwlpZihJU0NIQVIodCkpeworCSAgZ2V0X2FjYyhmLHAsQ0hBUik7CisJICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0byk7CisJICBzdG9yZV9sb2J5dGUoZiwmcC0+eix0KTsKKwkgIGNvbnRpbnVlOworCX0KKwlpZihJU0xPTkcodG8pKXsKKwkgIGlmKCFpc2FjYyh6KSkKKwkgICAgZ2V0X2FjYyhmLHAsQ0hBUik7CisJICBpZih6bTJsKHNpemV0YWJbdCZOUV0pPT0zKXsKKwkgICAgZG9fYnl0ZTMoZiwibGRhIiwmcC0+cTEsdG8pOworCSAgICBkb19ieXRlMyhmLCJzdGEiLCZwLT56LHQpOworCSAgfQorCSAgaWYoem0ybChzaXpldGFiW3QmTlFdKT49Mil7CisJICAgIGxvYWRfaGlieXRlKGYsJnAtPnExLHRvKTsKKwkgICAgc3RvcmVfaGlieXRlKGYsJnAtPnosdCk7CisJICB9CisJICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0byk7CisJICBzdG9yZV9sb2J5dGUoZiwmcC0+eix0KTsKKwkgIGNvbnRpbnVlOworCX0KKwlpZihJU1NIT1JUKHRvKSl7CisJICBpZigodCZVTlNJR05FRCl8fElTRlBPSU5URVIodCkpCisJICAgIGdldF9hY2MoZixwLENIQVIpOworCSAgZWxzZQorCSAgICBnZXRfYWNjKGYscCxTSE9SVCk7CisJICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0byk7CisJICBzdG9yZV9sb2J5dGUoZiwmcC0+eix0KTsKKwkgIGxvYWRfaGlieXRlKGYsJnAtPnExLHRvKTsKKwkgIHN0b3JlX2hpYnl0ZShmLCZwLT56LHQpOworCSAgaWYoSVNGUE9JTlRFUih0KSl7CisJICAgIGludCBiPS0xOworCSAgICBpZigocC0+cTEuZmxhZ3MmKFZBUkFEUnxEUkVGT0JKKSk9PVZBUkFEUikgYj1iYW5rKHAtPnExLnYpOworCSAgICBlbWl0KGYsIlx0bGRhXHQjJWRcbiIsYj49MD9iOmJhbmtjbnVtKTsKKwkgICAgZG9fYnl0ZTMoZiwic3RhIiwmcC0+eix0KTsKKwkgICAgY29udGludWU7CisJICB9CisJICBpZih0byZVTlNJR05FRCl7CisJICAgIGVtaXQoZiwiXHRsZGFcdCMwXG4iKTsKKwkgICAgZG9fYnl0ZTMoZiwic3RhIiwmcC0+eix0KTsKKwkgICAgZG9fYnl0ZTQoZiwic3RhIiwmcC0+eix0KTsKKwkgIH1lbHNleworCSAgICBlbWl0KGYsIlx0bGR4XHQjMFxuIik7CisJICAgIGVtaXQoZiwiXHRjbXBcdCMwXG4iKTsKKwkgICAgZW1pdChmLCJcdGJwbFx0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICAgIGVtaXQoZiwiXHRkZXhcbiIpOworCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgIGlmKGluZGlyZWN0KCZwLT56KSl7CisJICAgICAgZW1pdChmLCJcdHR4YVxuIik7CisJICAgICAgZG9fYnl0ZTMoZiwic3RhIiwmcC0+eix0KTsKKwkgICAgICBkb19ieXRlNChmLCJzdGEiLCZwLT56LHQpOworCSAgICB9ZWxzZXsKKwkgICAgICBkb19ieXRlMyhmLCJzdHgiLCZwLT56LHQpOworCSAgICAgIGRvX2J5dGU0KGYsInN0eCIsJnAtPnosdCk7CisJICAgIH0KKwkgIH0KKwkgIGNvbnRpbnVlOworCX0KKwlpZihJU0NIQVIodG8pKXsKKwkgIGlmKHRvJlVOU0lHTkVEKXsKKwkgICAgZ2V0X2FjYyhmLHAsQ0hBUik7CisJICAgIGlmKElTTE9ORyh0KSl7CisJICAgICAgbG9hZF9sb2J5dGUoZiwmcC0+cTEsdG8pOworCSAgICAgIHN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCSAgICAgIGVtaXQoZiwiXHRsZGFcdCMwXG4iKTsKKwkgICAgICBzdG9yZV9oaWJ5dGUoZiwmcC0+eix0KTsKKwkgICAgICBkb19ieXRlMyhmLCJzdGEiLCZwLT56LHQpOworCSAgICAgIGlmKElTTE9ORyh0KSkKKwkJZG9fYnl0ZTQoZiwic3RhIiwmcC0+eix0KTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgICBpZihpc2FjYyh6KSkKKwkgICAgICBlbWl0KGYsIlx0bGR4XHQjMFxuIik7CisJICAgIGVsc2UgaWYoaXNhY2MocTEpKXsKKwkgICAgICBlbWl0KGYsIlx0bGR4XHQjMFxuIik7CisJICAgICAgc3RvcmVfYWNjKGYsJnAtPnosdCk7CisJICAgICAgY29udGludWU7CisJICAgIH1lbHNleworCSAgICAgIGVtaXQoZiwiXHRsZGFcdCMwXG4iKTsKKwkgICAgICBzdG9yZV9oaWJ5dGUoZiwmcC0+eix0KTsKKwkgICAgfQorCSAgICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0byk7CisJICAgIHN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCSAgfWVsc2V7CisJICAgIGludCBsPSsrbGFiZWw7CisJICAgIGdldF9hY2MoZixwLFNIT1JUKTsKKwkgICAgZW1pdChmLCJcdGxkeFx0IzBcbiIpOworCSAgICBpZihpc3JlZyhxMSkmJnAtPnExLnJlZz09cmEpCisJICAgICAgZW1pdChmLCJcdGNtcFx0IzBcbiIpOworCSAgICBlbHNlCisJICAgICAgbG9hZF9sb2J5dGUoZiwmcC0+cTEsdG8pOworCSAgICBlbWl0KGYsIlx0YnBsXHQlcyVkXG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgIGVtaXQoZiwiXHRkZXhcbiIpOworCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgIHN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCSAgICBpZihpbmRpcmVjdCgmcC0+eikpeworCSAgICAgIGVtaXQoZiwiXHR0eGFcbiIpOworCSAgICAgIHN0b3JlX2hpYnl0ZShmLCZwLT56LHQpOworCSAgICAgIGlmKElTTE9ORyh0KSl7CisJCWRvX2J5dGUzKGYsInN0YSIsJnAtPnosdCk7CisJCWRvX2J5dGU0KGYsInN0YSIsJnAtPnosdCk7CisJICAgICAgfQorCSAgICB9ZWxzZXsKKwkgICAgICBpZighaXNyZWcoeil8fHAtPnoucmVnIT1yYXgpeworCQllbWl0KGYsIlx0c3R4XHQiKTsKKwkJZW1pdF9oaWJ5dGUoZiwmcC0+eix0KTsKKwkJZW1pdChmLCJcbiIpOworCSAgICAgIH0KKwkgICAgICBpZihJU0xPTkcodCkpeworCQlkb19ieXRlMyhmLCJzdHgiLCZwLT56LHQpOworCQlkb19ieXRlNChmLCJzdHgiLCZwLT56LHQpOworCSAgICAgIH0KKwkgICAgfQorCSAgfQorCSAgaWYoSVNGUE9JTlRFUih0KSl7CisJICAgIGVtaXQoZiwiXHRsZGFcdCMlZFxuIixjYmFuaz49MD9jYmFuazpiYW5rY251bSk7CisJICAgIGRvX2J5dGUzKGYsInN0YSIsJnAtPnosdCk7CisJICB9CisJICBjb250aW51ZTsKKwl9CisJaWYoSVNGUE9JTlRFUih0bykpeworCSAgZ2V0X2FjYyhmLHAsQ0hBUik7CisJICBpZih6bTJsKHNpemV0YWJbdCZOUV0pPj0zKXsKKwkgICAgZG9fYnl0ZTMoZiwibGRhIiwmcC0+cTEsdG8pOworCSAgICBkb19ieXRlMyhmLCJzdGEiLCZwLT56LHQpOworCSAgfQorCSAgaWYoem0ybChzaXpldGFiW3QmTlFdKT49Mil7CisJICAgIGxvYWRfaGlieXRlKGYsJnAtPnExLHRvKTsKKwkgICAgc3RvcmVfaGlieXRlKGYsJnAtPnosdCk7CisJICB9CisJICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0byk7CisJICBzdG9yZV9sb2J5dGUoZiwmcC0+eix0KTsKKworCSAgY29udGludWU7CisJfQorCWllcnJvcigwKTsKKyAgICAgIH0KKworICAgICAgaWYoYz09S09NUExFTUVOVCl7CisJZ2V0X2FjYyhmLHAsQ0hBUik7CisJaWYoSVNDSEFSKHQpKXsKKwkgIGxvYWRfYWNjKGYsJnAtPnExLHQpOworCSAgZW1pdChmLCJcdGVvclx0Iy0xXG4iKTsKKwkgIHN0b3JlX2FjYyhmLCZwLT56LHQpOworCX1lbHNleworCSAgaWYoaXNhY2MocTEpKQorCSAgICBlbWl0KGYsIlx0cGhhXG4iKTsKKwkgIGlmKElTTE9ORyh0KSl7CisJICAgIGRvX2J5dGU0KGYsImxkYSIsJnAtPnExLHQpOworCSAgICBlbWl0KGYsIlx0ZW9yXHQjLTFcbiIpOworCSAgICBkb19ieXRlNChmLCJzdGEiLCZwLT56LHQpOworCSAgICBkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgZW1pdChmLCJcdGVvclx0Iy0xXG4iKTsKKwkgICAgZG9fYnl0ZTMoZiwic3RhIiwmcC0+eix0KTsKKwkgIH0KKwkgIGxvYWRfaGlieXRlKGYsJnAtPnExLHQpOworCSAgZW1pdChmLCJcdGVvclx0Iy0xXG4iKTsKKwkgIHN0b3JlX2hpYnl0ZShmLCZwLT56LHQpOworCSAgaWYoaXNhY2MocTEpKQorCSAgICBlbWl0KGYsIlx0cGxhXG4iKTsKKwkgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgZW1pdChmLCJcdGVvclx0Iy0xXG4iKTsKKwkgIHN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCX0KKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PVNFVFJFVFVSTil7CisJdCY9TlE7CisJaWYoaXNyZWcocTEpJiZwLT5xMS5yZWc9PXAtPnoucmVnKSBjb250aW51ZTsKKwlpZih0PT1MT05HfHx0PT1MTE9OR3x8SVNGTE9BVCh0KXx8SVNGUE9JTlRFUih0KSl7CisJICBsb25nIGw9em0ybChwLT5xMi52YWwudm1heCk7CisJICBpbnQgenI9cC0+ei5yZWc7CisJICAvL2dldF9hY2MoZixwLHQpOworCSAgaWYoKG9wdHNpemV8fGw+NCkmJiFJU0ZQT0lOVEVSKHQpKXsKKwkgICAgaW50IGluZD1pbmRpcmVjdCgmcC0+cTEpOworCSAgICBpZihpbmQpIGxvYWRfYWRkcmVzcyhmLExBU1RfUEFJUiwmcC0+cTEsdCk7CisJICAgIEJTRVQocmVndXNlZCx0Myk7CisJICAgIEJTRVQocmVndXNlZCx0NCk7CisJICAgIHNldHkoZixsLTEpOworCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgICAgaWYoaW5kKQorCSAgICAgIGVtaXQoZiwiXHRsZGFcdCglcykseVxuIixtcmVnbmFtZXNbTEFTVF9QQUlSXSk7CisJICAgIGVsc2V7CisJICAgICAgZW1pdChmLCJcdGxkYVx0Iik7CisJICAgICAgaWYoIUlTRkxPQVQodCkmJihwLT5xMS5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisJCWVtaXQoZiwiJXMlZCIsbGFicHJlZml4LGFkZGZwY29uc3QoJnAtPnExLHQpKTsKKwkgICAgICB9ZWxzZQorCQllbWl0X29iaihmLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIix5XG4iKTsKKwkgICAgfQorCSAgICBlbWl0KGYsIlx0c3RhXHQlcyx5XG4iLG1yZWduYW1lc1t6cl0pOworCSAgICBlbWl0KGYsIlx0ZGV5XG4iKTsKKwkgICAgZW1pdChmLCJcdGJwbFx0JXMlZFxuIixsYWJwcmVmaXgsbGFiZWwpOworCSAgICB5dmFsPTI1NTsKKwkgIH1lbHNleworCSAgICBpZigocC0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikpeworCSAgICAgIGlmKHAtPnExLnJlZz09enIpeworCQlpbnQgcj1nZXRfcmVnKGYscCxQT0lOVEVSKTsKKwkJaWYocj09RklSU1RfUEFJUnx8cj09RklSU1RfUEFJUisxKQorCQkgIGllcnJvcigwKTsKKwkJaWYoIXJlZ19wYWlyKHIsJnJwMikpIGllcnJvcigwKTsKKwkJZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3pyXSk7CisJCWVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycDIucjFdKTsKKwkJZW1pdChmLCJcdGxkYVx0JXMrMVxuIixtcmVnbmFtZXNbenJdKTsKKwkJZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwMi5yMl0pOworCQlwLT5xMS5yZWc9cjsKKwkgICAgICB9CisJICAgIH0KKwkgICAgbG9hZF9sb2J5dGUoZiwmcC0+cTEsdCk7CisJICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1t6cl0pOworCSAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgZW1pdChmLCJcdHN0YVx0JXMrMVxuIixtcmVnbmFtZXNbenJdKTsKKwkgICAgZG9fYnl0ZTMoZiwibGRhIiwmcC0+cTEsdCk7CisJICAgIGVtaXQoZiwiXHRzdGFcdCVzKzJcbiIsbXJlZ25hbWVzW3pyXSk7CisJICAgIGlmKCFJU0ZQT0lOVEVSKHQpKXsKKwkgICAgICBkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlcyszXG4iLG1yZWduYW1lc1t6cl0pOworCSAgICB9CisJICAgIC8qVE9ETzpyZWd1c2VkIE9MREZQICovCisJICAgIHJlZ3VzZWRbenJdPTE7CisJICB9CisJICBjb250aW51ZTsKKwl9CisJLy9nZXRfYWNjKGYscCx0KTsKKwlsb2FkX2FjYyhmLCZwLT5xMSx0KTsKKwlyZWd1c2VkW3JhXT0xOworCXJlZ3VzZWRbcnhdPTE7CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZihjPT1HRVRSRVRVUk4peworCXQmPU5ROworCWlmKGlzcmVnKHopJiZwLT5xMS5yZWc9PXAtPnoucmVnKSBjb250aW51ZTsKKwlpZih0PT1MT05HfHx0PT1MTE9OR3x8SVNGTE9BVCh0KXx8SVNGUE9JTlRFUih0KSl7CisJICBsb25nIGw9em0ybChwLT5xMi52YWwudm1heCk7CisJICBpbnQgcXI9cC0+cTEucmVnOworCSAgaWYoKG9wdHNpemV8fGw+NCkmJiFJU0ZQT0lOVEVSKHQpKXsKKwkgICAgaW50IGluZD1pbmRpcmVjdCgmcC0+eik7CisJICAgIGlmKGluZCkgbG9hZF9hZGRyZXNzKGYsTEFTVF9QQUlSLCZwLT56LHQpOworCSAgICBCU0VUKHJlZ3VzZWQsdDMpOworCSAgICBCU0VUKHJlZ3VzZWQsdDQpOworCSAgICBzZXR5KGYsbC0xKTsKKwkgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICAgIGVtaXQoZiwiXHRsZGFcdCVzLHlcbiIsbXJlZ25hbWVzW3FyXSk7CisJICAgIGlmKGluZCkKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQoJXMpLHlcbiIsbXJlZ25hbWVzW0xBU1RfUEFJUl0pOworCSAgICBlbHNleworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCIpOworCSAgICAgIGVtaXRfb2JqKGYsJnAtPnosdCk7CisJICAgICAgZW1pdChmLCIseVxuIik7CisJICAgIH0KKwkgICAgZW1pdChmLCJcdGRleVxuIik7CisJICAgIGVtaXQoZiwiXHRicGxcdCVzJWRcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgICAgeXZhbD0yNTU7CisJICB9ZWxzZXsKKwkgICAgaWYoKHAtPnoucmVnJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopKXsKKwkgICAgICBpZihwLT56LnJlZz09cXIpIGllcnJvcigwKTsKKwkgICAgfQorCSAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcXJdKTsKKwkgICAgc3RvcmVfbG9ieXRlKGYsJnAtPnosdCk7CisJICAgIGVtaXQoZiwiXHRsZGFcdCVzKzFcbiIsbXJlZ25hbWVzW3FyXSk7CisJICAgIHN0b3JlX2hpYnl0ZShmLCZwLT56LHQpOworCSAgICBlbWl0KGYsIlx0bGRhXHQlcysyXG4iLG1yZWduYW1lc1txcl0pOworCSAgICBkb19ieXRlMyhmLCJzdGEiLCZwLT56LHQpOworCSAgICBpZighSVNGUE9JTlRFUih0KSl7CisJICAgICAgZW1pdChmLCJcdGxkYVx0JXMrM1xuIixtcmVnbmFtZXNbcXJdKTsKKwkgICAgICBkb19ieXRlNChmLCJzdGEiLCZwLT56LHQpOworCSAgICB9CisJICB9CisJICBjb250aW51ZTsKKwl9CisJaWYocC0+cTEucmVnKQorCSAgc3RvcmVfYWNjKGYsJnAtPnosdCk7CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZihjPT1DQUxMKXsKKwlpbnQgcmVnOworCisJaWYoYXJnc2l6ZTx6bTJsKHAtPnEyLnZhbC52bWF4KSkgYXJnc2l6ZT16bTJsKHAtPnEyLnZhbC52bWF4KTsKKworCS8qRklYTUUqLworI2lmIDAgICAgICAKKwlpZihzdGFja192YWxpZCYmKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJnAtPnExLnYtPmZpJiYocC0+cTEudi0+ZmktPmZsYWdzJkFMTF9TVEFDSykpeworCSAgaWYoZnJhbWVzaXplK3p1bTJ1bChwLT5xMS52LT5maS0+c3RhY2sxKT5zdGFjaykKKwkgICAgc3RhY2s9ZnJhbWVzaXplK3p1bTJ1bChwLT5xMS52LT5maS0+c3RhY2sxKTsKKwl9ZWxzZQorCSAgc3RhY2tfdmFsaWQ9MDsKKyNlbmRpZgorCWlmKChwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiYhc3RyY21wKCJfX3ZhX3N0YXJ0IixwLT5xMS52LT5pZGVudGlmaWVyKSl7CisJICBsb25nIG9mPXZhX29mZnNldCh2KStsb2NhbHNpemUrcnNhdmVzaXplK2FyZ3NpemU7CisJICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbZnBdKTsKKwkgIGlmKG9mKXsKKwkgICAgZW1pdChmLCJcdGNsY1xuIik7CisJICAgIGlmKG9mJjI1NSkKKwkgICAgICBlbWl0KGYsIlx0YWRjXHQjJWRcbiIsKG9mJjI1NSkpOworCSAgfQorCSAgZW1pdChmLCJcdGxkeFx0JXMrMVxuIixtcmVnbmFtZXNbZnBdKTsKKwkgIGlmKG9mJjB4ZmYwMCl7CisJICAgIGVtaXQoZiwiXHRwaGFcbiIpOworCSAgICBlbWl0KGYsIlx0dHhhXG4iKTsKKwkgICAgZW1pdChmLCJcdGFkY1x0IyVkXG4iLChvZj4+OCkmMjU1KTsKKwkgICAgZW1pdChmLCJcdHRheFxuIik7CisJICAgIGVtaXQoZiwiXHRwbGFcbiIpOworCSAgfWVsc2UgaWYob2YpeworCSAgICBlbWl0KGYsIlx0YmNjXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgICAgZW1pdChmLCJcdGlueFxuIik7CisJICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgIH0KKwkgIGNvbnRpbnVlOworCX0KKwlpZigocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmcC0+cTEudi0+ZmkmJnAtPnExLnYtPmZpLT5pbmxpbmVfYXNtKXsKKwkgIGVtaXQoZiwiO3N0YXJ0aW5saW5lXG4iKTsKKwkgIGVtaXRfaW5saW5lX2FzbShmLHAtPnExLnYtPmZpLT5pbmxpbmVfYXNtKTsKKwkgIGVtaXQoZiwiO2VuZGlubGluZVxuIik7CisJfWVsc2UgaWYocC0+cTEuZmxhZ3MmRFJFRk9CSil7CisJICBpZihJU0ZQT0lOVEVSKHAtPnExLmR0eXApKXsKKwkgICAgcC0+cTEuZmxhZ3MmPX5EUkVGT0JKOworCSAgICBsb2FkX3JlZyhmLExBU1RfUEFJUiwmcC0+cTEsUE9JTlRFUik7CisJICAgIGlmKGluZGlyZWN0KCZwLT5xMSkpeworCSAgICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLEZQT0lOVEVSKTsKKwkgICAgICBlbWl0KGYsIlx0dGF5XG4iKTsKKwkgICAgfWVsc2UKKwkgICAgICBkb19ieXRlMyhmLCJsZHkiLCZwLT5xMSxGUE9JTlRFUik7CisJICAgIGVtaXQoZiwiXHRsZGFcdCMlZFxuIixjYmFuaz49MD9jYmFuazpiYW5rY251bSk7CisJICAgIGVtaXQoZiwiXHRqc3JcdCVzX19iYW5ranNyXG4iLGlkcHJlZml4KTsKKwkgICAgeXZhbD1OT1ZBTDsKKwkgIH1lbHNleworCSAgICBpZighKHAtPnExLmZsYWdzJlJFRykpIGllcnJvcigwKTsKKwkgICAgZW1pdChmLCJcdGpzclx0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICAgIHl2YWw9Tk9WQUw7CisJICAgIGFkZF9jbXBsaXN0KGxhYmVsLHAtPnExLnJlZyxKTVBJTkQpOworCSAgfQorCX1lbHNleworCSAgaW50IHRiYW5rPS0xOworCSAgaWYocC0+cTEuZmxhZ3MmVkFSKSB0YmFuaz1iYW5rKHAtPnExLnYpOworCSAgaWYodGJhbmshPWNiYW5rJiZ0YmFuaz49MCl7CisJICAgIGlmKGNiYW5rPj0wKXsKKwkgICAgICBsb2FkX2FkZHJlc3MoZixMQVNUX1BBSVIsJnAtPnExLHQpOworCSAgICAgIHNldHkoZix0YmFuayk7CisJICAgICAgZW1pdChmLCJcdGxkYVx0IyVkXG4iLGNiYW5rKTsKKwkgICAgICBlbWl0KGYsIlx0anNyXHQlc19fYmFua2pzclxuIixpZHByZWZpeCk7CisJICAgICAgeXZhbD1OT1ZBTDsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgICBzZXR5KGYsdGJhbmspOworCSAgICBlbWl0KGYsIlx0anNyXHQlc19fYmFua3N3aXRjaFxuIixpZHByZWZpeCk7CisJICAgIHl2YWw9Tk9WQUw7CisJICB9CisJICBpZigocC0+cTEuZmxhZ3MmVkFSKSYmIXN0cmNtcChwLT5xMS52LT5pZGVudGlmaWVyLCJfZm1lbWNweSIpKQorCSAgICBlbWl0KGYsIlx0bGRhXHQjJWRcbiIsY2Jhbms+PTA/Y2Jhbms6YmFua2NudW0pOworCSAgZW1pdChmLCJcdGpzclx0Iik7CisJICBlbWl0X29iaihmLCZwLT5xMSx0KTsKKwkgIGVtaXQoZiwiXG4iKTsKKwl9CisJcHVzaGVkLT16bTJsKHAtPnEyLnZhbC52bWF4KTsKKwlpZighY2FsY19yZWdzKHAsZiE9MCkmJnYtPmZpKSB2LT5maS0+ZmxhZ3MmPX5BTExfUkVHUzsKKwl5dmFsPU5PVkFMOworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoYz09QVNTSUdOfHxjPT1QVVNIKXsKKwlpZih0PT0wKSBpZXJyb3IoMCk7CisJaWYoKHAtPnExLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUJiYodCZOUSk9PUxMT05HKXsKKwkgIGludCBpOworCSAgZXZhbF9jb25zdCgmcC0+cTEudmFsLHQpOworCSAgZm9yKGk9MDtpPDg7aSsrKXsKKwkgICAgZW1pdChmLCJcdGxkYVx0IyVkXG4iLHptMmwodm1heCkmMjU1KTsKKwkgICAgdm1heD16bXJzaGlmdCh2bWF4LGwyem0oOEwpKTsKKwkgICAgaWYoYz09UFVTSHx8KHAtPnouZmxhZ3MmRFJFRk9CSikpeworCSAgICAgIHNldHkoZixpKygoYz09UFVTSCk/cHVzaGVkOjApKTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQoJXMpLHlcbiIsKGM9PVBVU0gpP21yZWduYW1lc1tzcF06bXJlZ25hbWVzW3AtPnoucmVnXSk7CisJICAgIH1lbHNleworCSAgICAgIHAtPnoudmFsLnZtYXg9em1hZGQocC0+ei52YWwudm1heCxsMnptKChsb25nKWkpKTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQiKTsKKwkgICAgICBlbWl0X2xvYnl0ZShmLCZwLT56LHQpOworCSAgICAgIGVtaXQoZiwiXG4iKTsKKwkgICAgICBwLT56LnZhbC52bWF4PXptc3ViKHAtPnoudmFsLnZtYXgsbDJ6bSgobG9uZylpKSk7CisJICAgIH0KKwkgIH0KKwkgIGlmKGM9PVBVU0gpIHB1c2hlZCs9ODsKKwkgIGNvbnRpbnVlOworCX0gIAorCisJaWYoIXptbGVxKHAtPnEyLnZhbC52bWF4LGwyem0oNEwpKSl7CisJICBsb25nIGxlbj16bTJsKHAtPnEyLnZhbC52bWF4KTsKKwkgIGludCByMSxyMixsb29wcyxsb29wbGFiOworCSAgaWYobGVuPjMyNzY3KSBpZXJyb3IoMCk7CisJICBpZighTk9CQU5LVkFSUyl7CisJICAgIGludCBicT0tMSxiej0tMSxzPS0xOworCSAgICBpZigocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUikgYnE9YmFuayhwLT5xMS52KTsKKwkgICAgaWYoKHAtPnouZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUikgYno9YmFuayhwLT56LnYpOworCSAgICBpZigoKHAtPnExLmZsYWdzJkRSRUZPQkopJiZJU0ZQT0lOVEVSKHAtPnExLmR0eXApKXx8CisJICAgICAgICgocC0+ei5mbGFncyZEUkVGT0JKKSYmSVNGUE9JTlRFUihwLT56LmR0eXApKSl7CisJICAgICAgZmFyX2NvcHkoZixwKTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgICBpZihjYmFuazwwKXsKKwkgICAgICBpZihicT49MCYmYno+PTApeworCQlpZihicSE9YnopeworCQkgIGZhcl9jb3B5KGYscCk7CisJCSAgY29udGludWU7CisJCX0KKwkJcz1icTsKKwkgICAgICB9ZWxzZXsKKwkJaWYoYnE+PTApIHM9YnE7CisJCWlmKGJ6Pj0wKSBzPWJ6OworCSAgICAgIH0KKwkgICAgICBpZihzPj0wKXsKKwkJc2V0eShmLHMpOworCQllbWl0KGYsIlx0anNyXHQlc19fYmFua3N3aXRjaFxuIixpZHByZWZpeCk7CisJCXl2YWw9Tk9WQUw7CisJICAgICAgfQorCSAgICB9ZWxzZXsKKwkgICAgICBpZigoYnE+PTAmJmJxIT1jYmFuayl8fChiej49MCYmYnohPWNiYW5rKSl7CisJCWZhcl9jb3B5KGYscCk7CisJCWNvbnRpbnVlOworCSAgICAgIH0KKwkgICAgfQorCSAgfQorCSAgZ2V0X2FjYyhmLHAsQ0hBUik7CisJICBpZigocC0+cTEuZmxhZ3MmKERSRUZPQkp8S09OU1QpKT09RFJFRk9CSil7CisJICAgIGlmKHAtPnExLmZsYWdzJlJFRyl7CisJICAgICAgcjE9cC0+cTEucmVnOworCSAgICAgIGlmKCFyZWdfcGFpcihyMSwmcnApKSBpZXJyb3IoMCk7CisJICAgICAgaWYobGVuPjEyOCl7CisJCWVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMV0pOworCQllbWl0KGYsIlx0Y2xjXG4iKTsKKwkJaWYobGVuJjEyOCkKKwkJICBlbWl0KGYsIlx0YWRjXHQjMTI4XG4iKTsKKwkJZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisJCWlmKGxlbj4yNTUpeworCQkgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworCQkgIGVtaXQoZiwiXHRhZGNcdCMlbGRcbiIsKGxlbj4+OCkmMjU1KTsKKwkJICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsJCisJCX1lbHNleworCQkgIGVtaXQoZiwiXHRiY2NcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCQkgIGVtaXQoZiwiXHRpbmNcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworCQkgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkJfQorCSAgICAgIH0KKwkgICAgfWVsc2UKKwkgICAgICBpZXJyb3IoMCk7CisJICB9ZWxzZSBpZighaW5kaXJlY3QoJnAtPnExKSYmbGVuPD0xMjgmJihwLT5xMS5mbGFncyYoRFJFRk9CSnxLT05TVCkpIT1LT05TVCl7CisJICAgIHIxPTA7CisJICB9ZWxzZXsKKwkgICAgVmFyICp2PXAtPnExLnY7CisJICAgIC8qaWYoKHAtPnExLmZsYWdzJihWQVJBRFJ8VkFSKSkhPVZBUikgaWVycm9yKDApOyovCisJICAgIHIxPWdldF9yZWcoZixwLFBPSU5URVIpOworCSAgICBpZihsZW4+MTI4KSBwLT5xMS52YWwudm1heD16bWFkZChwLT5xMS52YWwudm1heCxsMnptKGxlbiYweGZmODApKTsKKwkgICAgbG9hZF9hZGRyZXNzKGYscjEsJnAtPnExLHQpOworCSAgICBpZihsZW4+MTI4KSBwLT5xMS52YWwudm1heD16bXN1YihwLT5xMS52YWwudm1heCxsMnptKGxlbiYweGZmODApKTsKKwkgIH0KKwkgIGlmKChwLT56LmZsYWdzJihEUkVGT0JKfEtPTlNUKSk9PURSRUZPQkopeworCSAgICBpZihwLT56LmZsYWdzJlJFRyl7CisJICAgICAgcjI9cC0+ei5yZWc7CisJICAgICAgaWYoIXJlZ19wYWlyKHIyLCZycCkpIGllcnJvcigwKTsKKwkgICAgICBpZihsZW4+MTI4KXsKKwkJZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisJCWVtaXQoZiwiXHRjbGNcbiIpOworCQlpZihsZW4mMTI4KQorCQkgIGVtaXQoZiwiXHRhZGNcdCMxMjhcbiIpOworCQllbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAucjFdKTsKKwkJaWYobGVuPjI1NSl7CisJCSAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIyXSk7CisJCSAgZW1pdChmLCJcdGFkY1x0IyVsZFxuIiwobGVuPj44KSYyNTUpOworCQkgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOwkKKwkJfWVsc2V7CisJCSAgZW1pdChmLCJcdGJjY1x0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJCSAgZW1pdChmLCJcdGluY1x0JXNcbiIsbXJlZ25hbWVzW3JwLnIyXSk7CisJCSAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwpOworCQl9CisJICAgICAgfQorCSAgICB9ZWxzZQorCSAgICAgIGllcnJvcigwKTsKKwkgIH1lbHNlIGlmKGM9PVBVU0gpeworCSAgICBpZihsZW48PTEyOCYmcHVzaGVkPT0wKXsKKwkgICAgICByMj1zcDsKKwkgICAgfWVsc2V7CisJICAgICAgcjI9Z2V0X3JlZyhmLHAsUE9JTlRFUik7CisJICAgICAgaWYoIXJlZ19wYWlyKHIyLCZycCkpIGllcnJvcigwKTsKKwkgICAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbc3BdKTsKKwkgICAgICBlbWl0KGYsIlx0Y2xjXG4iKTsKKwkgICAgICBpZigoKHB1c2hlZCsobGVuJjEyOCkpJjI1NSkhPTApCisJCWVtaXQoZiwiXHRhZGNcdCMlbGRcbiIsKHB1c2hlZCsobGVuJjEyOCkpJjI1NSk7CisJICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisJICAgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3NwMl0pOworCSAgICAgIGVtaXQoZiwiXHRhZGNcdCMlbGRcbiIsKChwdXNoZWQrbGVuKT4+OCkmMjU1KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAucjJdKTsKKwkgICAgfQorCSAgfWVsc2UgaWYoIWluZGlyZWN0KCZwLT56KSYmbGVuPD0xMjgpeworCSAgICByMj0wOworCSAgfWVsc2V7CisJICAgIFZhciAqdj1wLT56LnY7CisJICAgIHIyPWdldF9yZWcoZixwLFBPSU5URVIpOworCSAgICBpZihsZW4+MTI4KSBwLT56LnZhbC52bWF4PXptYWRkKHAtPnoudmFsLnZtYXgsbDJ6bShsZW4mMHhmZjgwKSk7CisJICAgIGxvYWRfYWRkcmVzcyhmLHIyLCZwLT56LHQpOworCSAgICBpZihsZW4+MTI4KSBwLT56LnZhbC52bWF4PXptc3ViKHAtPnoudmFsLnZtYXgsbDJ6bShsZW4mMHhmZjgwKSk7CisJICB9CisJICBpZihsZW4+MTI4KXsKKwkgICAgZ2V0X2FjYyhmLHAsUE9JTlRFUik7IC8qIGdldCB4ICovCisJICAgIGVtaXQoZiwiXHRsZHhcdCMlbGRcbiIsKChsZW4+PjcpKzEpJjI1NSk7CisJICB9CisJICBzZXR5KGYsKGxlbi0xKSYxMjcpOworCSAgaWYoKG9wdHNpemUmJmxlbj40KXx8bGVuPjgpeworCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsb29wbGFiPSsrbGFiZWwpOworCSAgICBpZihvcHRzaXplKQorCSAgICAgIGxvb3BzPTE7CisJICAgIGVsc2V7CisJICAgICAgaWYoKGxlbiYzKT09MCkKKwkJbG9vcHM9NDsKKwkgICAgICBlbHNlIGlmKChsZW4mMSk9PTApCisJCWxvb3BzPTI7CisJICAgICAgZWxzZQorCQlsb29wcz0xOworCSAgICB9CisJICB9ZWxzZQorCSAgICBsb29wcz1sZW47CisJICBpZihyMSYmIXJlZ19wYWlyKHIxLCZycCkpIGllcnJvcigwKTsKKwkgIGlmKHIyJiYhcmVnX3BhaXIocjIsJnJwMikpIGllcnJvcigwKTsKKwkgIGZvcihpPTA7aTxsb29wcztpKyspeworCSAgICBpZihyMSkKKwkgICAgICBlbWl0KGYsIlx0bGRhXHQoJXMpLHlcbiIsbXJlZ25hbWVzW3JwLnIxXSk7CisJICAgIGVsc2V7CisJICAgICAgZW1pdChmLCJcdGxkYVx0Iik7CisJICAgICAgZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJICAgICAgZW1pdChmLCIseVxuIik7CisJICAgIH0KKwkgICAgaWYocjIpCisJICAgICAgZW1pdChmLCJcdHN0YVx0KCVzKSx5XG4iLG1yZWduYW1lc1tycDIucjFdKTsKKwkgICAgZWxzZXsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQiKTsKKwkgICAgICBlbWl0X29iaihmLCZwLT56LHQpOworCSAgICAgIGVtaXQoZiwiLHlcbiIpOworCSAgICB9CisJICAgIGVtaXQoZiwiXHRkZXlcbiIpOworCSAgfQorCSAgaWYobG9vcHMhPWxlbil7CisJICAgIGVtaXQoZiwiXHRicGxcdCVzJWRcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgIH0JICAKKwkgIGlmKGxlbj4xMjgpeworCSAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcnAucjFdKTsKKwkgICAgZW1pdChmLCJcdHNlY1xuIik7CisJICAgIGVtaXQoZiwiXHRzYmNcdCMxMjhcbiIpOworCSAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAucjFdKTsKKwkgICAgZW1pdChmLCJcdGJjc1x0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICAgIGVtaXQoZiwiXHRkZWNcdCVzXG4iLG1yZWduYW1lc1tycC5yMl0pOworCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tycDIucjFdKTsKKwkgICAgZW1pdChmLCJcdHNlY1xuIik7CisJICAgIGVtaXQoZiwiXHRzYmNcdCMxMjhcbiIpOworCSAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcnAyLnIxXSk7CisJICAgIGVtaXQoZiwiXHRiY3NcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCSAgICBlbWl0KGYsIlx0ZGVjXHQlc1xuIixtcmVnbmFtZXNbcnAyLnIyXSk7CisJICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgICAgZW1pdChmLCJcdGxkeVx0IzEyN1xuIik7CisJICAgIGVtaXQoZiwiXHRkZXhcbiIpOworCSAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxsb29wbGFiKTsKKwkgIH0KKwkgIHl2YWw9Tk9WQUw7CisJICBpZihjPT1QVVNIKQorCSAgICBwdXNoZWQrPXptMmwocC0+cTIudmFsLnZtYXgpOworCSAgY29udGludWU7CisJfQorCWlmKGM9PVBVU0gpeworCSAgZ2V0X2FjYyhmLHAsQ0hBUik7CisJICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0KTsKKwkgIHNldHkoZixwdXNoZWQpOworCSAgZW1pdChmLCJcdHN0YVx0KCVzKSx5XG4iLG1yZWduYW1lc1tzcF0pOworCSAgaWYoIXptbGVxKHAtPnEyLnZhbC52bWF4LFoxKSl7CisJICAgIGxvYWRfaGlieXRlKGYsJnAtPnExLHQpOworCSAgICBzZXR5KGYscHVzaGVkKzEpOworCSAgICBlbWl0KGYsIlx0c3RhXHQoJXMpLHlcbiIsbXJlZ25hbWVzW3NwXSk7CisJICB9CisJICBpZighem1sZXEocC0+cTIudmFsLnZtYXgsbDJ6bSgyTCkpKXsKKwkgICAgZG9fYnl0ZTMoZiwibGRhIiwmcC0+cTEsdCk7CisJICAgIHNldHkoZixwdXNoZWQrMik7CisJICAgIGVtaXQoZiwiXHRzdGFcdCglcykseVxuIixtcmVnbmFtZXNbc3BdKTsKKwkgIH0KKwkgIGlmKCF6bWxlcShwLT5xMi52YWwudm1heCxsMnptKDNMKSkpeworCSAgICBkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgc2V0eShmLHB1c2hlZCszKTsKKwkgICAgZW1pdChmLCJcdHN0YVx0KCVzKSx5XG4iLG1yZWduYW1lc1tzcF0pOworCSAgfQorCisJICBwdXNoZWQrPXptMmwocC0+cTIudmFsLnZtYXgpOworCSAgY29udGludWU7CisJfQorCWlmKGM9PUFTU0lHTil7CisJICBpZihpc3JlZyhxMSkmJmlzcmVnKHopJiZwLT5xMS5yZWc9PXAtPnoucmVnKSBjb250aW51ZTsKKwkgIGlmKGlzYWNjKHExKSl7CisJICAgIGlmKHAtPnExLnJlZz09cmF4KSBnZXRfYWNjKGYscCxDSEFSKTsKKwkgICAgc3RvcmVfYWNjKGYsJnAtPnosdCk7CisJICAgIGNvbnRpbnVlOworCSAgfQorCSAgZ2V0X2FjYyhmLHAsQ0hBUik7CisJICBpZigwLypJU0NIQVIodCkqLyl7CisJICAgIGxvYWRfYWNjKGYsJnAtPnExLHQpOworCSAgICBzdG9yZV9hY2MoZiwmcC0+eix0KTsKKwkgIH1lbHNleworICAgICAgICAgICAgLy8gVE9ETzogUEdTOiBVc2UgQVhZWiBmb3IgMzItYml0IGNvcHkgaWYgYXBwcm9wcmlhdGUKKwkgICAgLy8gVE9HTzogUEdTOiBDb25zaWRlciB1c2luZyBBWFlaIGZvciBsb2FkLCBldmVuIGZvciAxNiBvciAyNC1iaXQgdmFsdWVzCisJICAgIGlmKCF6bWxlcShwLT5xMi52YWwudm1heCxsMnptKDNMKSkpeworCSAgICAgIGRvX2J5dGU0KGYsImxkYSIsJnAtPnExLHQpOworCSAgICAgIGRvX2J5dGU0KGYsInN0YSIsJnAtPnosdCk7CisJICAgIH0KKwkgICAgaWYoIXptbGVxKHAtPnEyLnZhbC52bWF4LGwyem0oMkwpKSl7CisJICAgICAgZG9fYnl0ZTMoZiwibGRhIiwmcC0+cTEsdCk7CisJICAgICAgZG9fYnl0ZTMoZiwic3RhIiwmcC0+eix0KTsKKwkgICAgfQorCSAgICBpZighem1sZXEocC0+cTIudmFsLnZtYXgsbDJ6bSgxTCkpKXsKKwkgICAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgICBzdG9yZV9oaWJ5dGUoZiwmcC0+eix0KTsKKwkgICAgfQorCSAgICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgc3RvcmVfbG9ieXRlKGYsJnAtPnosdCk7CisJICB9CisJfQorCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoYz09QUREUkVTUyl7CisJbG9uZyBvPXJlYWxfb2Zmc2V0KCZwLT5xMSk7CisJZ2V0X2FjYyhmLHAsQ0hBUik7CisJZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW2ZwMV0pOworCWlmKG8peworCSAgZW1pdChmLCJcdGNsY1xuIik7CisJICBpZigobyYyNTUpIT0wKQorCSAgICBlbWl0KGYsIlx0YWRjXHQjJWxkXG4iLHJlYWxfb2Zmc2V0KCZwLT5xMSkmMjU1KTsKKwl9CisJc3RvcmVfbG9ieXRlKGYsJnAtPnosdCk7CisJaWYoaXNhY2MoeikpIGVtaXQoZiwiXHRwaGFcbiIpOworCWVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tmcDJdKTsKKwlpZihvIT0wKQorCSAgZW1pdChmLCJcdGFkY1x0IyVsZFxuIixyZWFsX29mZnNldCgmcC0+cTEpPj44JjI1NSk7CisJc3RvcmVfaGlieXRlKGYsJnAtPnosdCk7CisJaWYoaXNhY2MoeikpIGVtaXQoZiwiXHRwbGFcbiIpOworCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZihjPT1DT01QQVJFfHxjPT1URVNUKXsKKwlJQyAqYnJhbmNoPXAtPm5leHQ7CisJaW50IHBhY2M9MCxiYyxib3V0OworCXdoaWxlKGJyYW5jaCl7CisJICBpZihicmFuY2gtPmNvZGU+PUJFUSYmYnJhbmNoLT5jb2RlPEJSQSkKKwkgICAgYnJlYWs7CisJICBpZihicmFuY2gtPmNvZGUhPUZSRUVSRUcmJmJyYW5jaC0+Y29kZSE9QUxMT0NSRUcmJmJyYW5jaC0+Y29kZSE9Tk9QKQorCSAgICBpZXJyb3IoMCk7CisJICBicmFuY2g9YnJhbmNoLT5uZXh0OworCX0KKwliYz1icmFuY2gtPmNvZGU7CisJYm91dD1icmFuY2gtPnR5cGY7CisJaWYoYz09VEVTVCl7CisJICBwLT5xMi5mbGFncz1LT05TVDsKKwkgIGd2YWwudm1heD1aMDsKKwkgIGV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKKwkgIGluc2VydF9jb25zdCgmcC0+cTIudmFsLHQpOworCX0KKwlpZihpZWVlJiZJU0ZMT0FUKHQpKXsKKwkgIGlmKCFpZWVlKSBpZXJyb3IoMCk7CisJICB0Jj1OUTsKKwkgIGlmKHJlZ3NbTEFTVF9QQUlSXSkgaWVycm9yKDApOworCSAgcmVnc1tMQVNUX1BBSVJdPTE7CisJICBpZihyZWdzW3JhXXx8cmVnc1tyYXhdKQorCSAgICBpZXJyb3IoMCk7CisJICBsb2FkX2FkZHJlc3MoZixMQVNUX1BBSVIsJnAtPnEyLHQpOworCSAgQlNFVChyZWd1c2VkLHQzKTsKKwkgIEJTRVQocmVndXNlZCx0NCk7CisJICBlbWl0KGYsIlx0anNyXHQlc19fZmxvYWQlY1xuIixpZHByZWZpeCwodD09RkxPQVQ/J3MnOidkJykpOworCSAgeXZhbD1OT1ZBTDsKKwkgIGxvYWRfYWRkcmVzcyhmLExBU1RfUEFJUiwmcC0+cTEsdCk7CisJICBlbWl0KGYsIlx0anNyXHQlc19fZmNtcCVjXG4iLGlkcHJlZml4LCh0PT1GTE9BVD8ncyc6J2QnKSk7CisJICB5dmFsPU5PVkFMOworCSAgcmVnc1tMQVNUX1BBSVJdPTA7CisJICBpZihiYz09QkxUfHxiYz09QkxFKQorCSAgICBlbWl0KGYsIlx0Ym1pXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgIGVsc2UgaWYoYmM9PUJHVHxiYz09QkdFKQorCSAgICBlbWl0KGYsIlx0YnZzXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgIGlmKGJjPT1CRVF8fGJjPT1CTEV8fGJjPT1CR0UpCisJICAgIGVtaXQoZiwiXHRiZXFcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgaWYoYmM9PUJORSkKKwkgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICBjb250aW51ZTsKKwl9CisJaWYoSVNDSEFSKHQpKXsKKwkgIGNoYXIgKnM7CisJICBpZihwYWNjPWNtcF9nZXRfYWNjKGYscCxicmFuY2gpKQorCSAgICBib3V0PSsrbGFiZWw7CisJICBsb2FkX2FjYyhmLCZwLT5xMSx0KTsKKwkgIGlmKGJjPT1CRVF8fGJjPT1CTkV8fCh0JlVOU0lHTkVEKSl7CisJICAgIHM9ImNtcCI7CisJICB9ZWxzZXsKKwkgICAgaWYoYmM9PUJMVHx8YmM9PUJHRSkKKwkgICAgICBlbWl0KGYsIlx0c2VjXG4iKTsKKwkgICAgZWxzZQorCSAgICAgIGVtaXQoZiwiXHRjbGNcbiIpOworCSAgICBzPSJzYmMiOworCSAgfQorCSAgaWYoYz09VEVTVCkKKwkgICAgZW1pdChmLCJcdCVzXHQjMFxuIixzKTsKKwkgIGVsc2UKKwkgICAgZG9fbG9ieXRlKGYscywmcC0+cTIsdCk7CisJICBpZihiYz09QkVRKQorCSAgICBlbWl0KGYsIlx0YmVxXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgIGVsc2UgaWYoYmM9PUJORSkKKwkgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICBlbHNlIGlmKHQmVU5TSUdORUQpeworCSAgICBpZihiYz09QkxUKQorCSAgICAgIGVtaXQoZiwiXHRiY2NcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgICBlbHNlIGlmKGJjPT1CR0UpCisJICAgICAgZW1pdChmLCJcdGJjc1x0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICAgIGVsc2UgaWYoYmM9PUJMRSl7CisJICAgICAgZW1pdChmLCJcdGJjY1x0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICAgICAgZW1pdChmLCJcdGJlcVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICAgIH1lbHNlIGlmKGJjPT1CR1QpeworCSAgICAgIGVtaXQoZiwiO1xuXHRiZXFcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCSAgICAgIGVtaXQoZiwiXHRiY3NcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgICAgfWVsc2UKKwkgICAgICBpZXJyb3IoMCk7CisJICB9ZWxzZXsKKwkgICAgZW1pdChmLCJcdGJ2Y1x0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICAgIGVtaXQoZiwiXHRlb3JcdCMxMjhcbiIpOworCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgIGlmKGJjPT1CTFR8fGJjPT1CTEUpCisJICAgICAgZW1pdChmLCJcdGJtaVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICAgIGVsc2UKKwkgICAgICBlbWl0KGYsIlx0YnBsXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgIH0KKwkgIGlmKHBhY2MpeworCSAgICByZWxvYWRfYWNjKGYpOworCSAgICBhZGRfY21wbGlzdChib3V0LGJyYW5jaC0+dHlwZixwYWNjKTsKKwkgIH0KKwkgIGNvbnRpbnVlOworCX1lbHNlIGlmKGJjPT1CRVF8fGJjPT1CTkV8fCh0JlVOU0lHTkVEKXx8SVNGUE9JTlRFUih0KSl7CisJICBpbnQgaW49MDsKKwkgIGlmKHBhY2M9Y21wX2dldF9hY2MoZixwLGJyYW5jaCkpCisJICAgIGJvdXQ9KytsYWJlbDsKKworCSAgLy8gUEdTIENoZWNrIGZvciBzcGVjaWFsIGNhc2VzIG9mIGNvbXBhcmluZyB0byBjb25zdGFudHMKKwkgIGlmKCEoSVNMT05HKHQpfHxJU0ZQT0lOVEVSKHQpfHxpc2FjYyhxMSkpKSB7CisJICAgIC8vIElzIGEgMTYtYml0IHZhbHVlCisJICAgIGlmIChwLT5xMi5mbGFncyZLT05TVCkgeworCSAgICAgIGlmICghKHAtPnEyLmZsYWdzJkRSRUZPQkopKSB7CisJCWV2YWxfY29uc3QoJnAtPnEyLnZhbCx0KTsKKwkJaWYoSVNGTE9BVCh0KSkgY252X2ZwKCk7CisJCWlmICh6bTJsKHZtYXgpPT0weDEwMCkgeworCQkgIGlmIChiYz09QkdFKSB7CisJCSAgICAvLyA+PSAkMTAwIHdlIGNhbiBjaGVjayBieSBqdXN0IHJlYWRpbmcgdGhlIDJuZCBieXRlCisJCSAgICAvLyBJZiBub24temVybywgdGhlbiB3ZSB0YWtlIHRoZSBicmFuY2gKKwkJICAgIGRvX2hpYnl0ZShmLCJsZGEiLCZwLT5xMSx0KTsKKwkJICAgIGVtaXQoZiwiXHRibmVcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCQkgICAgY29udGludWU7CisJCSAgfSBlbHNlIGlmIChiYz09QkxUKSB7CisJCSAgICAvLyA8JDEwMCB3ZSBjYW4gY2hlY2sgYnkganVzdCByZWFkaW5nIHRoZSAybmQgYnl0ZQorCQkgICAgLy8gQW5kIGlmIHplcm8sIHRoZW4gd2UgdGFrZSB0aGUgYnJhbmNoCisJCSAgICBkb19oaWJ5dGUoZiwibGRhIiwmcC0+cTEsdCk7CisJCSAgICBlbWl0KGYsIlx0YmVxXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsJCSAgCisJCSAgICBjb250aW51ZTsKKwkJICB9CisJCX0gZWxzZSBpZiAoem0ybCh2bWF4KTwweDEwMCkgeworCQkgIC8vIFZhbHVlcyA8JDEwMCB3ZSBjYW4gZG8gYWxtb3N0IGFzIHNpbXBseSwgYnV0IHdlIGhhdmUgdG8KKwkJICAvLyBhbHNvIGNoZWNrIHRoZSBsb3cgYnl0ZSBmb3IgZXhjZXB0aW9ucy4KKwkJICAvLyBYWFggUEdTIFRPRE8KKwkJICAKKwkJfQorCSAgICAgIH0KKwkgICAgfQorCSAgfQorCSAgCisJICAvLyBGYXItUG9pbnRlcnMgYXJlIDMyLWJpdCBvbiBNNjUKKwkgIGlmKElTTE9ORyh0KXx8SVNGUE9JTlRFUih0KSl7CisJICAgIGRvX2J5dGU0KGYsImxkYSIsJnAtPnExLHQpOworCSAgICBpZihjPT1URVNUKQorCSAgICAgIGVtaXQoZiwiXHRjbXBcdCMwXG4iKTsKKwkgICAgZWxzZQorCSAgICAgIGRvX2J5dGU0KGYsImNtcCIsJnAtPnEyLHQpOworCSAgICBpZihiYz09QkVRKQorCSAgICAgIGVtaXQoZiwiXHRibmVcdCVzJWRcbiIsbGFicHJlZml4LGluPSsrbGFiZWwpOworCSAgICBlbHNlIGlmKGJjPT1CTkUpCisJICAgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICAgIGVsc2UgaWYoYmM9PUJMVHx8YmM9PUJMRSl7CisJICAgICAgZW1pdChmLCJcdGJjY1x0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICAgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsaW49KytsYWJlbCk7CisJICAgIH1lbHNlIGlmKGJjPT1CR0V8fGJjPT1CR1QpeworCSAgICAgIGVtaXQoZiwiXHRiY2NcdCVzJWRcbiIsbGFicHJlZml4LGluPSsrbGFiZWwpOwkKKwkgICAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgICAgfWVsc2UKKwkgICAgICBpZXJyb3IoMCk7CisJICB9CisJICBpZihJU0xPTkcodCl8fElTRlBPSU5URVIodCkpeworCSAgICBkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgaWYoYz09VEVTVCkKKwkgICAgICBlbWl0KGYsIlx0Y21wXHQjMFxuIik7CisJICAgIGVsc2UKKwkgICAgICBkb19ieXRlMyhmLCJjbXAiLCZwLT5xMix0KTsKKwkgICAgaWYoYmM9PUJFUSkKKwkgICAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxpbj9pbjooaW49KytsYWJlbCkpOworCSAgICBlbHNlIGlmKGJjPT1CTkUpCisJICAgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICAgIGVsc2UgaWYoYmM9PUJMVHx8YmM9PUJMRSl7CisJICAgICAgZW1pdChmLCJcdGJjY1x0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICAgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsaW4/aW46KGluPSsrbGFiZWwpKTsKKwkgICAgfWVsc2UgaWYoYmM9PUJHRXx8YmM9PUJHVCl7CisJICAgICAgZW1pdChmLCJcdGJjY1x0JXMlZFxuIixsYWJwcmVmaXgsaW4/aW46KGluPSsrbGFiZWwpKTsJCisJICAgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICAgIH1lbHNlCisJICAgICAgaWVycm9yKDApOwkgIAorCSAgfQorCSAgaWYoaXNhY2MocTEpKXsKKwkgICAgaWYoIWluZGlyZWN0KCZwLT5xMikpeworCSAgICAgIGRvX2hpYnl0ZShmLCJjcHgiLCZwLT5xMix0KTsKKwkgICAgfWVsc2V7CisJICAgICAgaW50IHI9Z2V0X3JlZyhmLHAsQ0hBUik7CisJICAgICAgZW1pdChmLCJcdHBoYVxuIik7CisJICAgICAgbG9hZF9oaWJ5dGUoZiwmcC0+cTIsdCk7CisJICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgICAgICBlbWl0KGYsIlx0cGxhXG4iKTsKKwkgICAgICBlbWl0KGYsIlx0Y3B4XHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICB9CisJICB9ZWxzZXsKKwkgICAgbG9hZF9oaWJ5dGUoZiwmcC0+cTEsdCk7CisJICAgIGlmKGM9PVRFU1QpCisJICAgICAgZW1pdChmLCJcdGNtcFx0IzBcbiIpOworCSAgICBlbHNlCisJICAgICAgZG9faGlieXRlKGYsImNtcCIsJnAtPnEyLHQpOworCSAgfQorCSAgaWYoYmM9PUJFUSkKKwkgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsaW4/aW46KGluPSsrbGFiZWwpKTsKKwkgIGVsc2UgaWYoYmM9PUJORSkKKwkgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICBlbHNlIGlmKGJjPT1CTFR8fGJjPT1CTEUpeworCSAgICBlbWl0KGYsIlx0YmNjXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsaW4/aW46KGluPSsrbGFiZWwpKTsKKwkgIH1lbHNlIGlmKGJjPT1CR0V8fGJjPT1CR1QpeworCSAgICBlbWl0KGYsIlx0YmNjXHQlcyVkXG4iLGxhYnByZWZpeCxpbj9pbjooaW49KytsYWJlbCkpOworCSAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgIH1lbHNlCisJICAgIGllcnJvcigwKTsKKwkgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgaWYoYz09VEVTVCkKKwkgICAgZW1pdChmLCJcdGNtcFx0IzBcbiIpOworCSAgZWxzZQorCSAgICBkb19sb2J5dGUoZiwiY21wIiwmcC0+cTIsdCk7CisJICBpZihiYz09QkVRKQorCSAgICBlbWl0KGYsIlx0YmVxXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgIGVsc2UgaWYoYmM9PUJORSkKKwkgICAgZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICBlbHNlIGlmKGJjPT1CTFQpCisJICAgIGVtaXQoZiwiXHRiY2NcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgZWxzZSBpZihiYz09QkdFKQorCSAgICBlbWl0KGYsIlx0YmNzXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsJCisJICBlbHNlIGlmKGJjPT1CTEUpeworCSAgICBlbWl0KGYsIlx0YmNjXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgICAgZW1pdChmLCJcdGJlcVx0JXMlZFxuIixsYWJwcmVmaXgsYm91dCk7CisJICB9ZWxzZSBpZihiYz09QkdUKXsKKwkgICAgZW1pdChmLCJcdGJjY1x0JXMlZFxuIixsYWJwcmVmaXgsaW4pOworCSAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgIH1lbHNlCisJICAgIGllcnJvcigwKTsKKwkgIGlmKGluKQorCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxpbik7CisJICBpZihwYWNjKXsKKwkgICAgcmVsb2FkX2FjYyhmKTsKKwkgICAgYWRkX2NtcGxpc3QoYm91dCxicmFuY2gtPnR5cGYscGFjYyk7CisJICB9CisJICBjb250aW51ZTsKKwl9ZWxzZXsKKwkgIGlmKGJjPT1CR1R8fGJjPT1CTEUpeworCSAgICBvYmogbzsKKwkgICAgaWYoaXNhY2MocTEpKXsKKwkgICAgICBpbnQgcjsKKwkgICAgICBpZihwYWNjPWNtcF9nZXRfYWNjKGYscCxicmFuY2gpKQorCQlib3V0PSsrbGFiZWw7CisJICAgICAgcj1nZXRfcmVnKGYscCxDSEFSKTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICAgIGxvYWRfbG9ieXRlKGYsJnAtPnEyLHQpOworCSAgICAgIGVtaXQoZiwiXHRjbXBcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgICAgZW1pdChmLCJcdHN0eFx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgICAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMix0KTsKKwkgICAgICBlbWl0KGYsIlx0c2JjXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICAgIGVtaXQoZiwiXHRidmNcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCSAgICAgIGVtaXQoZiwiXHRlb3JcdCMxMjhcbiIpOworCSAgICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgICAgICBpZihiYz09QkdUKQorCQllbWl0KGYsIlx0Ym1pXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgICAgICBlbHNlCisJCWVtaXQoZiwiXHRicGxcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgICAgIGlmKHBhY2MpeworCQlyZWxvYWRfYWNjKGYpOworCQlhZGRfY21wbGlzdChib3V0LGJyYW5jaC0+dHlwZixwYWNjKTsKKwkgICAgICB9CisJICAgICAgY29udGludWU7CisJICAgIH1lbHNleworCSAgICAgIG89cC0+cTE7cC0+cTE9cC0+cTI7cC0+cTI9bzsKKwkgICAgICBpZihiYz09QkdUKSBiYz1CTFQ7IGVsc2UgYmM9QkdFOworCSAgICB9CisJICB9CisJICBpZihwYWNjPWNtcF9nZXRfYWNjKGYscCxicmFuY2gpKQorCSAgICBib3V0PSsrbGFiZWw7CisJICBpZihJU0xPTkcodCkpeworCSAgICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgZG9fbG9ieXRlKGYsImNtcCIsJnAtPnEyLHQpOworCSAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgZG9faGlieXRlKGYsInNiYyIsJnAtPnEyLHQpOworCSAgICBkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgZG9fYnl0ZTMoZiwic2JjIiwmcC0+cTIsdCk7CisJICAgIGRvX2J5dGU0KGYsImxkYSIsJnAtPnExLHQpOworCSAgICBkb19ieXRlNChmLCJzYmMiLCZwLT5xMix0KTsKKwkgIH1lbHNleworCSAgICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgZG9fbG9ieXRlKGYsImNtcCIsJnAtPnEyLHQpOworCSAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgZG9faGlieXRlKGYsInNiYyIsJnAtPnEyLHQpOworCSAgfQorCSAgZW1pdChmLCJcdGJ2Y1x0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICBlbWl0KGYsIlx0ZW9yXHQjMTI4XG4iKTsKKwkgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgIGlmKGJjPT1CTFQpCisJICAgIGVtaXQoZiwiXHRibWlcdCVzJWRcbiIsbGFicHJlZml4LGJvdXQpOworCSAgZWxzZSBpZihiYz09QkdFKQorCSAgICBlbWl0KGYsIlx0YnBsXHQlcyVkXG4iLGxhYnByZWZpeCxib3V0KTsKKwkgIGVsc2UKKwkgICAgaWVycm9yKDApOworCSAgaWYocGFjYyl7CisJICAgIHJlbG9hZF9hY2MoZik7CisJICAgIGFkZF9jbXBsaXN0KGJvdXQsYnJhbmNoLT50eXBmLHBhY2MpOworCSAgfQorCSAgY29udGludWU7IAorCX0KKwlpZXJyb3IoMCk7CisgICAgICB9CisgICAgICBpZigoYz09QUREfHxjPT1TVUJ8fGM9PUFEREkyUHx8Yz09U1VCSUZQKSYmY29tcGFyZV9vYmplY3RzKCZwLT5xMSwmcC0+eikmJiFpbmRpcmVjdCgmcC0+cTEpJiZpc2NvbnN0KHEyKSYmIWlzYWNjKHopKXsKKwlsb25nIGw7CisJZXZhbF9jb25zdCgmcC0+cTIudmFsLHEydHlwKHApKTsKKwlsPXptMmwodm1heCk7CisJaWYoYz09QURESTJQLyomJih0MiZOUSk9PVBPSU5URVIqLykge2M9QUREO3Q9VU5TSUdORUR8SU5UO30KKwlpZihjPT1TVUJJRlAvKiYmKHQyJk5RKT09UE9JTlRFUiovKSB7Yz1TVUI7dD1VTlNJR05FRHxJTlQ7fQorCWlmKGM9PVNVQnx8Yz09U1VCSUZQKSBsPS1sOworCS8qVE9ETzogYWxsb3cgbGFyZ2VyIHR5cGVzICovCisJaWYobDwzJiZsPi0zJiYodCZOUSk8PUlOVCl7CisJICBpZihsPDApeworCSAgICBnZXRfYWNjKGYscCxDSEFSKTsKKwkgICAgaW5jbWVtKGYsJnAtPnosdCxTVUIsLWwpOworCSAgfWVsc2UKKwkgICAgaW5jbWVtKGYsJnAtPnosdCxBREQsbCk7CisJICBjb250aW51ZTsKKwl9CisgICAgICB9CisKKyAgICAgIGlmKChjPT1MU0hJRlR8fGM9PVJTSElGVCkmJmlzcmVnKHExKSYmaXNyZWcoeikmJmlzY29uc3QocTIpJiZwLT5xMS5yZWc9PXAtPnoucmVnJiZwLT56LnJlZyE9cmEmJnAtPnoucmVnIT1yYXgpeworCWxvbmcgbDsKKwlldmFsX2NvbnN0KCZwLT5xMi52YWwscTJ0eXAocCkpOworCWw9em0ybCh2bWF4KTsKKwkvKlRPRE86IGFsbG93IGxhcmdlciB0eXBlcyAqLworCWlmKGw8NSYmKHQmTlEpPD1JTlQpeworCSAgaWYoYz09UlNISUZUJiYhKHQmVU5TSUdORUQpKQorCSAgICBnZXRfYWNjKGYscCxDSEFSKTsKKwkgIGluY21lbShmLCZwLT56LHQsYyxsKTsKKwkgIGNvbnRpbnVlOworCX0KKyAgICAgIH0KKworICAgICAgaWYoYz09TFNISUZUfHxjPT1SU0hJRlQpeworCWxvbmcgbD0tMTtpbnQgbG9vcD0wLHIscjIscjMsb3V0bD0wOworCWlmKGlzY29uc3QocTIpKXsKKwkgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxxMnR5cChwKSk7CisJICBsPXptMmwodm1heCk7CisJICBsb29wPTA7CisJfWVsc2UKKwkgIGxvb3A9MTsKKwlpZihsPj0wJiZvcHRzaXplKXsKKwkgIGlmKGM9PUxTSElGVCYmKGwmNyk+NikgCisJICAgIGxvb3A9MTsKKwkgIGVsc2UgaWYoYz09UlNISUZUJiYodCZVTlNJR05FRCkmJihsJjcpPjMpCisJICAgIGxvb3A9MTsKKwkgIGVsc2UgaWYoYz09UlNISUZUJiYhKHQmVU5TSUdORUQpJiYobCY3KT4yKQorCSAgICBsb29wPTE7CisJfQorCisJaWYoIUlTQ0hBUih0KSkKKwkgIHI9Z2V0X3JlZyhmLHAsQ0hBUik7CisJaWYoSVNMT05HKHQpKXsKKwkgIHIyPWdldF9yZWcoZixwLENIQVIpOworCSAgcjM9Z2V0X3JlZyhmLHAsQ0hBUik7CisJfQorCWlmKElTTE9ORyh0KSl7CisJICBnZXRfYWNjKGYscCxDSEFSKTsKKwkgIGlmKGw+PTI0KXsKKwkgICAgaWYoYz09TFNISUZUKXsKKwkgICAgICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjNdKTsKKwkgICAgICBlbWl0KGYsIlx0bGRhXHQjMFxuIik7CisJICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjJdKTsKKwkgICAgfWVsc2UgaWYoYz09UlNISUZUJiYhKHQmVU5TSUdORUQpKXsKKwkgICAgICBkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjNdKTsKKwkgICAgICBzZXR5KGYsMCk7CisJICAgICAgZW1pdChmLCJcdGNtcFx0IzBcbiIpOworCSAgICAgIGVtaXQoZiwiXHRicGxcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCSAgICAgIGVtaXQoZiwiXHRkZXlcbiIpOworCSAgICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgICAgICBlbWl0KGYsIlx0c3R5XHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICAgIGVtaXQoZiwiXHRzdHlcdCVzXG4iLG1yZWduYW1lc1tyMl0pOworCSAgICAgIGVtaXQoZiwiXHR0eWFcbiIpOworCSAgICAgIHl2YWw9Tk9WQUw7CisJICAgIH1lbHNleworCSAgICAgIGVtaXQoZiwiXHRsZGFcdCMwXG4iKTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjNdKTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjJdKTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICAgIGRvX2J5dGU0KGYsImxkYSIsJnAtPnExLHQpOworCisJICAgIH0KKwkgIH1lbHNlIGlmKGw+PTE2KXsKKwkgICAgaWYoYz09TFNISUZUKXsKKwkgICAgICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjJdKTsKKwkgICAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjNdKTsKKwkgICAgICBlbWl0KGYsIlx0bGRhXHQjMFxuIik7CisJICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgICAgfWVsc2UgaWYoYz09UlNISUZUJiYhKHQmVU5TSUdORUQpKXsKKwkgICAgICBkb19ieXRlMyhmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjNdKTsKKwkgICAgICBkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjJdKTsKKwkgICAgICBzZXR5KGYsMCk7CisJICAgICAgZW1pdChmLCJcdGNtcFx0IzBcbiIpOworCSAgICAgIGVtaXQoZiwiXHRicGxcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCSAgICAgIGVtaXQoZiwiXHRkZXlcbiIpOworCSAgICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgICAgICBlbWl0KGYsIlx0c3R5XHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICAgIGVtaXQoZiwiXHR0eWFcbiIpOworCSAgICAgIHl2YWw9Tk9WQUw7CisJICAgIH1lbHNleworCSAgICAgIGVtaXQoZiwiXHRsZGFcdCMwXG4iKTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjJdKTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjNdKTsKKwkgICAgICBkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCisJICAgIH0KKwkgIH1lbHNlIGlmKGw+PTgpeworCSAgICBpZihjPT1MU0hJRlQpeworCSAgICAgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgICAgbG9hZF9oaWJ5dGUoZiwmcC0+cTEsdCk7CisJICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3IyXSk7CisJICAgICAgZG9fYnl0ZTMoZiwibGRhIiwmcC0+cTEsdCk7CisJICAgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3IzXSk7CisJICAgICAgZW1pdChmLCJcdGxkYVx0IzBcbiIpOworCSAgICB9ZWxzZSBpZihjPT1SU0hJRlQmJiEodCZVTlNJR05FRCkpeworCSAgICAgIGxvYWRfaGlieXRlKGYsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyM10pOworCSAgICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyMl0pOworCSAgICAgIGRvX2J5dGU0KGYsImxkYSIsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgICAgc2V0eShmLDApOworCSAgICAgIGVtaXQoZiwiXHRjbXBcdCMwXG4iKTsKKwkgICAgICBlbWl0KGYsIlx0YnBsXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgICAgICBlbWl0KGYsIlx0ZGV5XG4iKTsKKwkgICAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgICAgZW1pdChmLCJcdHR5YVxuIik7CisJICAgICAgeXZhbD1OT1ZBTDsKKwkgICAgfWVsc2V7CisJICAgICAgZW1pdChmLCJcdGxkYVx0IzBcbiIpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyM10pOworCSAgICAgIGRvX2J5dGU0KGYsImxkYSIsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyMl0pOworCSAgICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgICAgbG9hZF9oaWJ5dGUoZiwmcC0+cTEsdCk7CisKKwkgICAgfQorCSAgfWVsc2UgaWYoYz09UlNISUZUJiYhKHQmVU5TSUdORUQpKXsKKwkgICAgbG9hZF9sb2J5dGUoZiwmcC0+cTEsdCk7CisJICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyM10pOworCSAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3IyXSk7CisJICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCSAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICBkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkgIH1lbHNleworCSAgICBkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkgICAgZW1pdChmLCJcdHN0YVx0JXNcbiIsbXJlZ25hbWVzW3IzXSk7CisJICAgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCSAgICBlbWl0KGYsIlx0c3RhXHQlc1xuIixtcmVnbmFtZXNbcjJdKTsKKwkgICAgbG9hZF9oaWJ5dGUoZiwmcC0+cTEsdCk7CisJICAgIGVtaXQoZiwiXHRzdGFcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgfQorCX1lbHNlCisJICBnZXRfYWNjKGYscCx0KTsKKwlpZighSVNMT05HKHQpKXsKKwkgIGlmKGw+PTgpeworCSAgICBpZighSVNTSE9SVCh0KSkgaWVycm9yKDApOworCSAgICBpZihjPT1MU0hJRlQpeworCSAgICAgIGlmKGluZGlyZWN0KCZwLT5xMSkpeworCQlsb2FkX2xvYnl0ZShmLCZwLT5xMSx0KTsKKwkJZW1pdChmLCJcdHRheFxuIik7CisJCWVtaXQoZiwiXHRsZGFcdCMwXG4iKTsKKwkgICAgICB9ZWxzZXsKKwkJaWYoaXNhY2MocTEpKQorCQkgIGVtaXQoZiwiXHR0YXhcbiIpOworCQllbHNlCisJCSAgZG9fbG9ieXRlKGYsImxkeCIsJnAtPnExLHQpOworCQllbWl0KGYsIlx0bGRhXHQjMFxuIik7CisJICAgICAgfQorCSAgICB9ZWxzZXsKKwkgICAgICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgICAgICBlbWl0KGYsIlx0bGR4XHQjMFxuIik7CisJICAgICAgaWYoISh0JlVOU0lHTkVEKSl7CisJCWVtaXQoZiwiXHRjbXBcdCMwXG4iKTsKKwkJZW1pdChmLCJcdGJwbFx0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJCWVtaXQoZiwiXHRkZXhcbiIpOworCQllbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgICAgfQorCSAgICB9CisJICB9ZWxzZQorCSAgICBsb2FkX2FjYyhmLCZwLT5xMSx0KTsKKwl9CisJaWYoSVNTSE9SVCh0KSkKKwkgIGVtaXQoZiwiXHRzdHhcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJaWYobD49MCkgbCY9NzsKKwlpZihsb29wKXsKKwkgIGlmKGw+PTApCisJICAgIHNldHkoZixsKTsKKwkgIGVsc2V7CisJICAgIGlmKGluZGlyZWN0KCZwLT5xMikpeworCSAgICAgIGVtaXQoZiwiXHRwaGFcbiIpOworCSAgICAgIGxvYWRfbG9ieXRlKGYsJnAtPnEyLHEydHlwKHApKTsKKwkgICAgICBlbWl0KGYsIlx0dGF5XG4iKTsKKwkgICAgICBlbWl0KGYsIlx0cGxhXG4iKTsKKwkgICAgICBlbWl0KGYsIlx0Y3B5XHQjMFxuIik7CisJICAgIH1lbHNleworCSAgICAgIGVtaXQoZiwiXHRsZHlcdCIpOworCSAgICAgIGVtaXRfbG9ieXRlKGYsJnAtPnEyLHEydHlwKHApKTsKKwkgICAgICBlbWl0KGYsIlxuIik7CisJICAgIH0KKwkgICAgb3V0bD0rK2xhYmVsOworCSAgICBlbWl0KGYsIlx0YmVxXHQlcyVkXG4iLGxhYnByZWZpeCxvdXRsKTsKKwkgIH0KKwkgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCX1lbHNleworCSAgaWYoSVNDSEFSKHQpKQorCSAgICBsJj03OworCSAgZWxzZSBpZihJU1NIT1JUKHQpKQorCSAgICBsJj0xNTsKKwkgIGVsc2UKKwkgICAgbCY9MzE7CisJfQorCXdoaWxlKGw+MHx8bG9vcCl7CisJICBpZihjPT1MU0hJRlQpeworCSAgICBlbWl0KGYsIlx0YXNsXG4iKTsKKwkgICAgaWYoIUlTQ0hBUih0KSkKKwkgICAgICBlbWl0KGYsIlx0cm9sXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICBpZihJU0xPTkcodCkpeworCSAgICAgIGVtaXQoZiwiXHRyb2xcdCVzXG4iLG1yZWduYW1lc1tyMl0pOworCSAgICAgIGVtaXQoZiwiXHRyb2xcdCVzXG4iLG1yZWduYW1lc1tyM10pOworCSAgICB9CisJICB9ZWxzZSBpZih0JlVOU0lHTkVEKXsKKwkgICAgZW1pdChmLCJcdGNsY1xuIik7CisJICAgIGlmKElTTE9ORyh0KSl7CisJICAgICAgZW1pdChmLCJcdHJvclx0JXNcbiIsbXJlZ25hbWVzW3IzXSk7CisJICAgICAgZW1pdChmLCJcdHJvclx0JXNcbiIsbXJlZ25hbWVzW3IyXSk7CisJICAgIH0KKwkgICAgaWYoIUlTQ0hBUih0KSkKKwkgICAgICBlbWl0KGYsIlx0cm9yXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICBlbWl0KGYsIlx0cm9yXG4iKTsKKwkgIH1lbHNleworCSAgICBpZihJU0xPTkcodCkpeworCSAgICAgIGVtaXQoZiwiXHRjbXBcdCMxMjhcbiIpOworCSAgICAgIGVtaXQoZiwiXHRyb3JcbiIpOworCSAgICAgIGVtaXQoZiwiXHRyb3JcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgICAgZW1pdChmLCJcdHJvclx0JXNcbiIsbXJlZ25hbWVzW3IyXSk7CisJICAgICAgZW1pdChmLCJcdHJvclx0JXNcbiIsbXJlZ25hbWVzW3IzXSk7CisJICAgIH1lbHNleworCSAgICAgIGlmKCFJU0NIQVIodCkpeworCQllbWl0KGYsIlx0Y3B4XHQjMTI4XG4iKTsKKwkJZW1pdChmLCJcdHJvclx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgICAgICB9ZWxzZQorCQllbWl0KGYsIlx0Y21wXHQjMTI4XG4iKTsKKwkgICAgICBlbWl0KGYsIlx0cm9yXG4iKTsKKwkgICAgfQorCSAgfQorCSAgaWYobG9vcCl7CisJICAgIGVtaXQoZiwiXHRkZXlcbiIpOworCSAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgIGlmKG91dGwpIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LG91dGwpOworCSAgICB5dmFsPTA7CisJICAgIGJyZWFrOworCSAgfQorCSAgbC0tOworCX0KKwlpZihJU0xPTkcodCkpeworCSAgaWYoYz09UlNISUZUJiYhKHQmVU5TSUdORUQpKXsKKwkgICAgZG9fYnl0ZTQoZiwic3RhIiwmcC0+eix0KTsKKwkgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgICAgZG9fYnl0ZTMoZiwic3RhIiwmcC0+eix0KTsKKwkgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3IyXSk7CisJICAgIHN0b3JlX2hpYnl0ZShmLCZwLT56LHQpOworCSAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcjNdKTsKKwkgICAgc3RvcmVfbG9ieXRlKGYsJnAtPnosdCk7CisJICB9ZWxzZXsKKwkgICAgc3RvcmVfbG9ieXRlKGYsJnAtPnosdCk7CisJICAgIGVtaXQoZiwiXHRsZGFcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICAgIHN0b3JlX2hpYnl0ZShmLCZwLT56LHQpOworCSAgICBlbWl0KGYsIlx0bGRhXHQlc1xuIixtcmVnbmFtZXNbcjJdKTsKKwkgICAgZG9fYnl0ZTMoZiwic3RhIiwmcC0+eix0KTsKKwkgICAgZW1pdChmLCJcdGxkYVx0JXNcbiIsbXJlZ25hbWVzW3IzXSk7CisJICAgIGRvX2J5dGU0KGYsInN0YSIsJnAtPnosdCk7CisJICB9CisJfWVsc2V7CisJICBpZighSVNDSEFSKHQpKQorCSAgICBlbWl0KGYsIlx0bGR4XHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgaWYoSVNDSEFSKHQpfHxpbmRpcmVjdCgmcC0+eikpCisJICAgIHN0b3JlX2FjYyhmLCZwLT56LHQpOworCSAgZWxzZXsKKwkgICAgc3RvcmVfbG9ieXRlKGYsJnAtPnosdCk7CisJICAgIGlmKCFpc3JlZyh6KXx8cC0+ei5yZWchPXJheCl7CisJICAgICAgZW1pdChmLCJcdHN0eFx0Iik7CisJICAgICAgZW1pdF9oaWJ5dGUoZiwmcC0+eix0KTsKKwkgICAgICBlbWl0KGYsIlxuIik7CisJICAgIH0KKwkgIH0KKwl9CisJY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmKChjPj1PUiYmYzw9QU5EKXx8KGM+PUxTSElGVCYmYzw9TU9EKXx8Yz09QURESTJQfHxjPT1TVUJJRlApeworCWNoYXIgKnM7aW50IHQyPXQscHQ9cC0+dHlwZjI7CisJaWYoIWlzYWNjKHopKQorCSAgZ2V0X2FjYyhmLHAsQ0hBUik7CisJaWYoYz09QURESTJQfHxjPT1TVUJJRlApeworCSAgaWYoYz09QURESTJQKSBjPUFERDsgZWxzZSBjPVNVQjsKKwkgIHQ9VU5TSUdORUR8SU5UOworCSAgaWYoKHB0Jk5RKT09UE9JTlRFUiYmKHAtPnExLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKwkgICAgZXZhbF9jb25zdCgmcC0+cTEudmFsLFBPSU5URVIpOworCSAgICBpbnNlcnRfY29uc3QoJnAtPnExLnZhbCxVTlNJR05FRHxJTlQpOworCSAgfQorCX0KKwlpZihjPj1PUiYmYzw9QU5EKQorCSAgcz1sb2dpY2Fsc1tjLU9SXTsKKwllbHNlCisJICBzPWFyaXRobWV0aWNzW2MtTFNISUZUXTsKKyAgICAgIAorCWlmKElTRkxPQVQodCkpeworCSAgaWYoIWllZWUpIGllcnJvcigwKTsKKwkgIHQmPU5ROworCSAgaWYocmVnc1tMQVNUX1BBSVJdKSBpZXJyb3IoMCk7CisJICBnZXRfYWNjKGYscCxJTlQpOworCSAgcmVnc1tMQVNUX1BBSVJdPTE7CisJICBsb2FkX2FkZHJlc3MoZixMQVNUX1BBSVIsJnAtPnExLHQpOworCSAgQlNFVChyZWd1c2VkLHQzKTsKKwkgIEJTRVQocmVndXNlZCx0NCk7CisJICBlbWl0KGYsIlx0anNyXHQlc19fZmxvYWQlY1xuIixpZHByZWZpeCwodD09RkxPQVQ/J3MnOidkJykpOworCSAgeXZhbD1OT1ZBTDsKKwkgIGxvYWRfYWRkcmVzcyhmLExBU1RfUEFJUiwmcC0+cTIsdCk7CisJICBlbWl0KGYsIlx0anNyXHQlc19fZiVzJWNcbiIsaWRwcmVmaXgsZW5hbWVbY10sKHQ9PUZMT0FUPydzJzonZCcpKTsKKwkgIHl2YWw9Tk9WQUw7CisJICBsb2FkX2FkZHJlc3MoZixMQVNUX1BBSVIsJnAtPnosdCk7CisJICBlbWl0KGYsIlx0anNyXHQlc19fZnN0b3JlJWNcbiIsaWRwcmVmaXgsKHQ9PUZMT0FUPydzJzonZCcpKTsKKwkgIHl2YWw9Tk9WQUw7CisJICByZWdzW0xBU1RfUEFJUl09MDsKKwkgIGNvbnRpbnVlOworCX1lbHNlIGlmKElTTE9ORyh0KSl7CisJICBpZihjPT1BREQpIGVtaXQoZiwiXHRjbGNcbiIpOworCSAgaWYoYz09U1VCKSBlbWl0KGYsIlx0c2VjXG4iKTsKKwkgIGxvYWRfbG9ieXRlKGYsJnAtPnExLHQpOworCSAgZG9fbG9ieXRlKGYscywmcC0+cTIsdCk7CisJICBzdG9yZV9sb2J5dGUoZiwmcC0+eix0KTsKKwkgIGxvYWRfaGlieXRlKGYsJnAtPnExLHQpOworCSAgZG9faGlieXRlKGYscywmcC0+cTIsdCk7CisJICBzdG9yZV9oaWJ5dGUoZiwmcC0+eix0KTsKKwkgIGRvX2J5dGUzKGYsImxkYSIsJnAtPnExLHQpOworCSAgZG9fYnl0ZTMoZixzLCZwLT5xMix0KTsKKwkgIGRvX2J5dGUzKGYsInN0YSIsJnAtPnosdCk7CisJICBkb19ieXRlNChmLCJsZGEiLCZwLT5xMSx0KTsKKwkgIGRvX2J5dGU0KGYscywmcC0+cTIsdCk7CisJICBkb19ieXRlNChmLCJzdGEiLCZwLT56LHQpOworCSAgY29udGludWU7CisJfWVsc2UgaWYoSVNDSEFSKHQpKXsKKwkgIGxvYWRfYWNjKGYsJnAtPnExLHQpOworCSAgaWYoYz09QUREKSBlbWl0KGYsIlx0Y2xjXG4iKTsKKwkgIGlmKGM9PVNVQikgZW1pdChmLCJcdHNlY1xuIik7CisJICBkb19sb2J5dGUoZixzLCZwLT5xMix0KTsKKwkgIHN0b3JlX2FjYyhmLCZwLT56LHQpOworCX1lbHNlIGlmKGM9PUFERHx8Yz09U1VCKXsKKwkgIGludCBhLHI7bG9uZyBsPTE7CisJICBpZihpc2NvbnN0KHEyKSl7CisJICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCx0Mik7CisJICAgIGw9em0ybCh2bWF4KTsKKwkgICAgbCY9MHhmZjAwOworCSAgfQorCSAgaWYoaXNyZWcoeikmJnAtPnoucmVnPT1yYXgpIGE9MTsgZWxzZSBhPTA7CisJICBpZigodDImTlUpPT1DSEFSJiYocC0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKSE9S09OU1QpeworCSAgICBlbWl0KGYsIlx0bGR4XHQjMFxuIik7CisJICB9CisJICBpZigodDImTlUpPT1DSEFSJiYocC0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKSE9S09OU1QpeworCSAgICBsb2FkX2xvYnl0ZShmLCZwLT5xMix0KTsKKwkgICAgZW1pdChmLCJcdGJwbFx0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICAgIGVtaXQoZiwiXHRkZXhcbiIpOworCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICAgIGlmKGM9PUFERCl7CisJICAgICAgaWYoYz09QUREKSBlbWl0KGYsIlx0Y2xjXG4iKTsgZWxzZSBlbWl0KGYsIlx0c2VjXG4iKTsKKwkgICAgICBkb19sb2J5dGUoZixzLCZwLT5xMSx0KTsKKwkgICAgICBpZihpc2FjYyh6KSkKKwkJZW1pdChmLCJcdHBoYVxuIik7CisJICAgICAgZWxzZQorCQlzdG9yZV9sb2J5dGUoZiwmcC0+eix0KTsKKwkgICAgICBlbWl0KGYsIlx0dHhhXG4iKTsKKwkgICAgICBkb19oaWJ5dGUoZixzLCZwLT5xMSx0KTsKKwkgICAgICBzdG9yZV9oaWJ5dGUoZiwmcC0+eix0KTsKKwkgICAgICBpZihJU0ZQT0lOVEVSKHB0KSYmIWNvbXBhcmVfb2JqZWN0cygmcC0+cTEsJnAtPnopKXsKKwkJZG9fYnl0ZTMoZiwibGRhIiwmcC0+cTEscHQpOworCQlkb19ieXRlMyhmLCJzdGEiLCZwLT56LHB0KTsKKwkgICAgICB9CisJICAgICAgaWYoaXNhY2MoeikpCisJCWVtaXQoZiwiXHRwbGFcbiIpOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICAgIHI9Z2V0X3JlZyhmLHAsQ0hBUik7CisJICAgIGVtaXQoZiwiXHRzdHhcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisJICB9CisJICBsb2FkX2xvYnl0ZShmLCZwLT5xMSx0KTsKKwkgIGlmKGM9PUFERCkgZW1pdChmLCJcdGNsY1xuIik7IGVsc2UgZW1pdChmLCJcdHNlY1xuIik7CisJICBkb19sb2J5dGUoZixzLCZwLT5xMix0Mik7CisJICBzdG9yZV9sb2J5dGUoZiwmcC0+eix0KTsKKwkgIGlmKGw9PTAmJmlzcmVnKHExKSYmaXNyZWcoeikmJnAtPnExLnJlZz09cC0+ei5yZWcpeworCSAgICBpZihjPT1BREQpeworCSAgICAgIGVtaXQoZiwiXHRiY2NcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCSAgICAgIGlmKGEpCisJCWVtaXQoZiwiXHRpbnhcbiIpOworCSAgICAgIGVsc2V7CisJCS8qaWYoIXJlZ19wYWlyKHAtPnoucmVnLCZycCkpIGllcnJvcigwKTsqLworCQllbWl0KGYsIlx0aW5jXHQlcysxXG4iLG1yZWduYW1lc1twLT56LnJlZ10pOworCSAgICAgIH0KKwkgICAgfWVsc2V7CisJICAgICAgZW1pdChmLCJcdGJjc1x0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICAgICAgaWYoYSkKKwkJZW1pdChmLCJcdGRleFxuIik7CisJICAgICAgZWxzZXsKKwkJaWYoIXJlZ19wYWlyKHAtPnoucmVnLCZycCkpIGllcnJvcigwKTsKKwkJZW1pdChmLCJcdGRlY1x0JXNcbiIsbXJlZ25hbWVzW3JwLnIyXSk7CisJICAgICAgfQorCSAgICB9CisJICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgIH1lbHNleworCSAgICBpZihhPT0xKSBlbWl0KGYsIlx0cGhhXG4iKTsKKwkgICAgaWYoKHQyJk5RKT09Q0hBUil7CisJICAgICAgaWYodDImVU5TSUdORUQpeworCQlsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkJZW1pdChmLCJcdCVzXHQjMFxuIixzKTsKKwkgICAgICB9ZWxzZXsKKwkJbG9hZF9oaWJ5dGUoZiwmcC0+cTEsdCk7CisJCWlmKChwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisJCSAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHQyKTsKKwkJICBpZih6bWxlcShaMCx2bWF4KSkKKwkJICAgIGVtaXQoZiwiXHQlc1x0IzBcbiIscyk7CisJCSAgZWxzZQorCQkgICAgZW1pdChmLCJcdCVzXHQjMjU1XG4iLHMpOworCQl9ZWxzZXsKKwkJICBlbWl0KGYsIlx0JXNcdCVzXG4iLHMsbXJlZ25hbWVzW3JdKTsKKwkJfQorCSAgICAgIH0KKwkgICAgfWVsc2V7CisJICAgICAgbG9hZF9oaWJ5dGUoZiwmcC0+cTEsdCk7CisJICAgICAgZG9faGlieXRlKGYscywmcC0+cTIsdDIpOworCSAgICB9CisJICAgIHN0b3JlX2hpYnl0ZShmLCZwLT56LHQpOworCSAgICBpZihhPT0xKSBlbWl0KGYsIlx0cGxhXG4iKTsKKwkgICAgaWYoSVNGUE9JTlRFUihwdCkmJnAtPmNvZGUhPVNVQlBGUCl7CisJICAgICAgaWYoIWNvbXBhcmVfb2JqZWN0cygmcC0+cTEsJnAtPnopKXsKKwkJZG9fYnl0ZTMoZiwibGRhIiwmcC0+cTEsRlBPSU5URVIpOworCQlkb19ieXRlMyhmLCJzdGEiLCZwLT56LEZQT0lOVEVSKTsKKwkgICAgICB9CisJICAgIH0KKwkgIH0KKwl9ZWxzZXsKKwkgIGlmKGlzYWNjKHExKSkKKwkgICAgZW1pdChmLCJcdHBoYVxuIik7CisJICBsb2FkX2hpYnl0ZShmLCZwLT5xMSx0KTsKKwkgIGRvX2hpYnl0ZShmLHMsJnAtPnEyLHQpOworCSAgc3RvcmVfaGlieXRlKGYsJnAtPnosdCk7CisJICBpZihpc2FjYyhxMSkpCisJICAgIGVtaXQoZiwiXHRwbGFcbiIpOworCSAgbG9hZF9sb2J5dGUoZiwmcC0+cTEsdCk7CisJICBkb19sb2J5dGUoZixzLCZwLT5xMix0KTsKKwkgIHN0b3JlX2xvYnl0ZShmLCZwLT56LHQpOworCX0KKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHByaWMyKHN0ZG91dCxwKTsKKyAgICAgIGllcnJvcigwKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbl9ib3R0b20oZix2LGxvY2Fsc2l6ZSk7CisgICAgCisgICAgZm9yKGM9MTtjPD1NQVhSO2MrKyl7CisgICAgICBpZihyZWdzYVtjXXx8cmVndXNlZFtjXSl7CisJQlNFVChyZWdzX21vZGlmaWVkLGMpOworICAgICAgfQorICAgIH0KKworICAgIGlmKHN0YWNrX3ZhbGlkKXsKKyAgICAgIGlmKCF2LT5maSkgdi0+Zmk9bmV3X2ZpKCk7CisgICAgICB2LT5maS0+ZmxhZ3N8PUFMTF9TVEFDSzsKKyAgICAgIHYtPmZpLT5zdGFjazE9c3RhY2s7CisgICAgfQorICB9CisKKyAgZnJlZV9JQyhtaSk7CisKKyAgZW1pdChmLCI7IHN0YWNrc2l6ZT0lbHUlc1xuIix6dW0ydWwoc3RhY2spLHN0YWNrX3ZhbGlkPyIiOiIrPz8iKTsKK30KKworaW50IHNob3J0Y3V0KGludCBjb2RlLGludCB0eXApCit7CisgIGlmKGNvZGU9PUNPTVBBUkUvKnx8Y29kZT09TVVMVCovfHxjb2RlPT1BRER8fGNvZGU9PVNVQnx8Y29kZT09QU5EfHxjb2RlPT1PUnx8Y29kZT09WE9SfHxjb2RlPT1MU0hJRlR8fGNvZGU9PVJTSElGVC8qfHxjb2RlPT1NSU5VUyovfHxjb2RlPT1LT01QTEVNRU5UKQorICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZhdHRyKHR5cGUgKnAsY2hhciAqcykKK3sKKyAgaWYocC0+YXR0ciYmc3Ryc3RyKHAtPmF0dHIscykpCisgICAgcmV0dXJuIDE7CisgIGlmKHAtPm5leHQpCisgICAgcmV0dXJuIGZhdHRyKHAtPm5leHQscyk7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworaW50IHJlZ19wYXJtKHN0cnVjdCByZWdfaGFuZGxlICptLCBzdHJ1Y3QgVHlwICp0LGludCB2YXJhcmcsc3RydWN0IFR5cCAqZCkKK3sKKyAgaW50IGY7CisKKyAgaWYodmFyYXJnKQorICAgIHJldHVybiAwOworICBmPXQtPmZsYWdzJk5ROworICBpZihPTERGUCYmSVNGTE9BVChmKSkgcmV0dXJuIDA7CisgIGlmKGQmJmZhdHRyKGQsIl9fc3RhY2twYXJtc19fIikpCisgICAgcmV0dXJuIDA7CisgIGlmKGQmJmZhdHRyKGQsIl9fY2M2NV9fIikpeworICAgIG0tPnJlZ3MrKzsKKyAgICBwcmludGYoImFyZz0lZCBjbnQ9JWRcbiIsbS0+cmVncyxkLT5leGFjdC0+Y291bnQpOworICAgIGlmKG0tPnJlZ3M9PWQtPmV4YWN0LT5jb3VudC0xKXsKKyAgICAgIGlmKElTQ0hBUih0LT5mbGFncykpCisJcmV0dXJuIHJhOworICAgICAgaWYoSVNTSE9SVCh0LT5mbGFncykpCisJcmV0dXJuIHJheDsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYoSVNDSEFSKGYpKXsKKyAgICBpZighdC0+ZXhhY3QpeworICAgICAgaWYobS0+cmVncz49R1BSX0FSR1MtMSkKKwlyZXR1cm4gMDsKKyAgICAgIGY9RklSU1RfR1BSK20tPnJlZ3M7CisgICAgICBtLT5yZWdzKz0yOworICAgICAgcmV0dXJuIGY7CisgICAgfWVsc2V7CisgICAgICBpZihtLT5yZWdzPj1HUFJfQVJHUykKKwlyZXR1cm4gMDsKKyAgICAgIGVsc2UKKwlyZXR1cm4gRklSU1RfR1BSK20tPnJlZ3MrKzsKKyAgICB9CisgIH0KKyAgaWYoSVNTSE9SVChmKXx8Zj09UE9JTlRFUil7CisgICAgaWYobS0+cmVncz49R1BSX0FSR1MtMSkKKyAgICAgIHJldHVybiAwOworICAgIGVsc2V7CisgICAgICBpZihtLT5yZWdzJjEpIG0tPnJlZ3MrPTE7CisgICAgICBtLT5yZWdzKz0yOworICAgICAgcmV0dXJuIEZJUlNUX1BBSVIrbS0+cmVncy8yLTE7CisgICAgfQorICB9CisgIGlmKGY9PUZQT0lOVEVSfHxmPT1MT05HfHxmPT1GTE9BVHx8KCFpZWVlJiYoZj09RE9VQkxFfHxmPT1MRE9VQkxFKSkpeworICAgIGlmKG0tPmJyZWdzPj00KQorICAgICAgcmV0dXJuIDA7CisgICAgZWxzZQorICAgICAgcmV0dXJuIEZJUlNUX0JJRyttLT5icmVncysrOworICB9CisgIGlmKGY9PUxMT05HfHwoaWVlZSYmKGY9PURPVUJMRXx8Zj09TERPVUJMRSkpKXsKKyAgICBpZihtLT5icmVncz49MykKKyAgICAgIHJldHVybiAwOworICAgIGVsc2V7CisgICAgICBpZihtLT5icmVncyYxKSAgbS0+YnJlZ3MrKzsKKyAgICAgIG0tPmJyZWdzKz0yOworICAgICAgcmV0dXJuIEZJUlNUX0JJR1ArbS0+YnJlZ3MvMi0xOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IGhhbmRsZV9wcmFnbWEoY29uc3QgY2hhciAqcykKK3sKKyAgc3RhdGljIGNoYXIgc2VjW1NFQ0xFTl07CisgIGludCBpOworICBpZihzc2NhbmYocywic2VjdGlvbiAlMTI3cyIsc2VjKT09MSl7CisgICAgaWYoIXN0cmNtcChzZWMsImRlZmF1bHQiKSkKKyAgICAgIHVzZV9zZWM9MDsKKyAgICBlbHNlCisgICAgICB1c2Vfc2VjPXNlYzsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZihzc2NhbmYocywiYmFuayAlZCIsJmkpPT0xKXsKKyAgICB1c2VfYmFuaz1pOworICAgIHJldHVybiAxOworICB9Cit9Cit2b2lkIGNsZWFudXBfY2coRklMRSAqZikKK3sKKyAgaW50IGk7CisgIHN0cnVjdCBmcGNvbnN0bGlzdCAqcD1maXJzdGZwYzsKKworICBpZihmJiZwKXsKKyAgICBlbWl0KGYscm9kYXRhbmFtZSk7ZW1pdChmLCJcbiIpOworICAgIHNlY3Rpb249Uk9EQVRBOworICB9CisgIHdoaWxlKHA9Zmlyc3RmcGMpeworICAgIGVtaXQoZiwiJXMlZDpcblx0d29yZFx0IixsYWJwcmVmaXgscC0+bGFiZWwpOworICAgIGlmKGllZWUpCisgICAgICBlbWl0X2llZWUoZiwmcC0+dmFsLHAtPnQpOworICAgIGVsc2V7CisgICAgICBpbnQgd29yZHM9em0ybChzaXpldGFiW3AtPnQmTlFdKS8yOworICAgICAgZXZhbF9jb25zdCgmcC0+dmFsLHAtPnQpOworICAgICAgaWYoSVNGTE9BVChwLT50KSkgY252X2ZwKCk7CisgICAgICBmb3IoaT0wO2k8d29yZHM7aSsrKXsKKwllbWl0KGYsIiVsZCIsem0ybCh2bWF4KSYweGZmZmYpOworCWlmKGk8d29yZHMtMSl7ZW1pdChmLCIsIik7dm1heD16bXJzaGlmdCh2bWF4LGwyem0oMTZMKSk7fQorICAgICAgfQorICAgICAgZW1pdChmLCJcbiIpOworICAgICAgLyplbWl0KGYsIiVsZCwlbGRcbiIsem0ybCh2bWF4KSYweGZmZmYsem0ybCh6bXJzaGlmdCh2bWF4LGwyem0oMTZMKSkpJjB4ZmZmZik7Ki8KKyAgICB9CisgICAgZmlyc3RmcGM9cC0+bmV4dDsKKyAgICBmcmVlKHApOworICB9CisKKyAgZW1pdChmLCJcdHpwYWdlXHQlc1xuIixtcmVnbmFtZXNbc3BdKTsKKyAgZm9yKGk9RklSU1RfR1BSO2k8PUxBU1RfR1BSO2krKykKKyAgICBlbWl0KGYsIlx0enBhZ2VcdCVzXG4iLG1yZWduYW1lc1tpXSk7CisgIGZvcihpPUZJUlNUX0JJRztpPD1MQVNUX0JJRztpKyspCisgICAgZW1pdChmLCJcdHpwYWdlXHQlc1xuIixtcmVnbmFtZXNbaV0pOworCit9Cit2b2lkIGNsZWFudXBfZGIoRklMRSAqZikKK3sKKyAgaWYoZikgc2VjdGlvbj0tMTsKK30KKworc3RhdGljIGNoYXIgKnpvcHNbXT17CisgICJhZGMiLCJhbmQiLCJhc2wiLCJiaXQiLCJlb3IiLCJsZGEiLCJvcmEiLAorICAidGF4IiwidHhhIiwidGF5IiwidHlhIiwic2JjIn07CisKK3N0YXRpYyBpbnQgc2V0c3pmbGFnKGNoYXIgKm9wKQoreworICBpbnQgaTsKKyAgZm9yKGk9MDtpPHNpemVvZih6b3BzKS9zaXplb2Yoem9wc1swXSk7aSsrKQorICAgIGlmKCFzdHJjbXAob3Asem9wc1tpXSkpCisgICAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKKworZW51bSBwZWVwZiB7IE5FRURTQU1FID0gMSwgUkVNT1ZFMVNUID0gMn07CitzdHJ1Y3QgcGVlcHMge2NoYXIgKnMxLCpzMiwqcjtlbnVtIHBlZXBmIGZsYWdzO307CisKKworCitpbnQgZW1pdF9wZWVwaG9sZSh2b2lkKQoreworICBpbnQgZW50cmllcyxpLGo7CisgIGNoYXIgKmFzbWxpbmVbRU1JVF9CVUZfREVQVEhdOworICBjaGFyIGJ1ZjFbMTAyNF0sYnVmMlsxMDI0XTsKKyAgY2hhciBvcDFbOF0sb3AyWzhdOworICBzdGF0aWMgY2hhciBjYVsxMDI0XSxjeFsxMDI0XSxjeVsxMDI0XSxjelsxMDI0XTsKKyAgc3RhdGljIGludCBybSxkaXNhYmxlZDsKKworICBmcHJpbnRmKHN0ZGVyciwiQ2FsbGVkIGVtaXRfcGVlcGhvbGUoKVxuIik7CisgIAorICBzdGF0aWMgc3RydWN0IHBlZXBzIGVsaW1bXT17CisgICAgImxkYSIsInN0YSIsMCxORUVEU0FNRSwKKyAgICAibGR4Iiwic3R4IiwwLE5FRURTQU1FLAorICAgICJzdGEiLCJzdGEiLDAsTkVFRFNBTUUsCisgICAgInN0eCIsInN0eCIsMCxORUVEU0FNRSwKKyAgICAic3RhIiwibGRhIiwwLE5FRURTQU1FLAorICAgICJzdHgiLCJsZHgiLDAsTkVFRFNBTUUsCisgICAgInR4YSIsInRheCIsMCwwLAorICAgICJ0YXgiLCJ0eGEiLDAsMCwKKyAgICAibGRhIiwibGRhIiwwLFJFTU9WRTFTVCwKKyAgICAibGR4IiwibGR4IiwwLFJFTU9WRTFTVCwKKyAgICAibGR5IiwibGR5IiwwLFJFTU9WRTFTVCwKKyAgICAibGR6IiwibGR6IiwwLFJFTU9WRTFTVCwKKyAgICAibGRhIiwicGxhIiwwLFJFTU9WRTFTVCwKKyAgICAibGRhIiwidHhhIiwwLFJFTU9WRTFTVCwKKyAgICAibGRhIiwidHlhIiwwLFJFTU9WRTFTVCwKKyAgICAibGR4IiwidGF4IiwwLFJFTU9WRTFTVCwKKyAgICAibGR5IiwidGF5IiwwLFJFTU9WRTFTVCwKKyAgICAidGF5IiwibGR5IiwwLFJFTU9WRTFTVCwKKyAgICAidGF6IiwibGR6IiwwLFJFTU9WRTFTVCwKKyAgICAidGF4IiwibGR4IiwwLFJFTU9WRTFTVCwKKyAgICAidHhhIiwibGRhIiwwLFJFTU9WRTFTVCwKKyAgICAidHlhIiwibGRhIiwwLFJFTU9WRTFTVCwKKyAgICAidHphIiwibGRhIiwwLFJFTU9WRTFTVCwKKyAgICAibGRhIiwibGR4IiwiXHR0YXhcbiIsTkVFRFNBTUUsCisgICAgImxkYSIsImxkeSIsIlx0dGF5XG4iLE5FRURTQU1FLAorICAgICJsZHgiLCJsZGEiLCJcdHR4YVxuIixORUVEU0FNRSwKKyAgICAibGR5IiwibGRhIiwiXHR0eWFcbiIsTkVFRFNBTUUsCisgICAgInN0YSIsImxkeCIsIlx0dGF4XG4iLE5FRURTQU1FLAorICAgICJzdGEiLCJsZHkiLCJcdHRheVxuIixORUVEU0FNRSwKKyAgICAic3R4IiwibGRhIiwiXHR0eGFcbiIsTkVFRFNBTUUsCisgICAgInN0eSIsImxkYSIsIlx0dHlhXG4iLE5FRURTQU1FLAorCisgIH07CisKKyAgaWYobm9wZWVwKSByZXR1cm4gMDsKKworICBpPWVtaXRfbDsKKyAgaWYoZW1pdF9mPT0wKQorICAgIGVudHJpZXM9aS1lbWl0X2YrMTsKKyAgZWxzZQorICAgIGVudHJpZXM9RU1JVF9CVUZfREVQVEg7CisgIGFzbWxpbmVbMF09ZW1pdF9idWZmZXJbaV07CisKKyAgaWYoIXN0cmNtcChhc21saW5lWzBdLCI7c3RhcnRpbmxpbmVcbiIpKSBkaXNhYmxlZD0xOworICBpZighc3RyY21wKGFzbWxpbmVbMF0sIjtlbmRpbmxpbmVcbiIpKSBkaXNhYmxlZD0wOworICBpZihkaXNhYmxlZCkgcmV0dXJuIDA7CisKKyAgYnVmMVswXT0wO29wMVswXT0wOworICBpZigoaj1zc2NhbmYoYXNtbGluZVswXSwiICU2cyAlOTk5cyIsb3AxLGJ1ZjEpKT49MSl7CisgICAgcHJpbnRmKCJhPSVzIHg9JXMgeT0lcywgej0lc1xuIixjYSxjeCxjeSxjeik7CisgICAgcHJpbnRmKCJcdFx0JXMgJXNcbiIsb3AxLGJ1ZjEpOworICAgIGlmKCFzdHJjbXAob3AxLCJzdGEiKSkgeworICAgICAgLy8gV29yayBvdXQgd2hlbiB3ZSBhcmUgYWNjZXNzaW5nIHZhcmlhYmxlcyBvbiB0aGUgc3RhY2sKKyAgICAgIGlmICghc3RyY21wKGJ1ZjEsIihzcCkseSIpKSB7CisJLy8gV2UgaW52YWxpZGF0ZSB0aGlzIHdoZW4gWSBjaGFuZ2VzCisJc25wcmludGYoY2EsMTAyNCwiKHNwKSx5IixjeSk7CisgICAgICB9IAorICAgIH0gZWxzZSBpZighc3RyY21wKG9wMSwic3RhIikpeworICAgICAgLy8gUmVtb3ZlIHdyaXRlcyB0byB3aGVyZXZlciBBIHdhcyBsb2FkZWQgZnJvbQorICAgICAgaWYgKCFzdHJjbXAoYnVmMSxjYSkpIHsKKwlyZW1vdmVfYXNtKCk7CisJcmV0dXJuIHJtPTE7CisgICAgICB9CisgICAgfSBlbHNlIGlmKCFzdHJjbXAob3AxLCJsZGEiKSl7CisgICAgICBpZihidWYxWzBdPT0nIycpeworCWlmKCFzdHJjbXAoYnVmMSxjYSkpe3JlbW92ZV9hc20oKTtyZXR1cm4gcm09MTt9CisJc3RyY3B5KGNhLGJ1ZjEpOworICAgICAgfWVsc2UgeworCS8vIFdvcmsgb3V0IHdoZW4gd2UgYXJlIGFjY2Vzc2luZyB2YXJpYWJsZXMgb24gdGhlIHN0YWNrCisJaWYgKCFzdHJjbXAoYnVmMSwiKHNwKSx5IikpIHsJIAorCSAgaWYoIXN0cmNtcChidWYxLGNhKSl7CisJICAgIHJlbW92ZV9hc20oKTsKKwkgICAgcmV0dXJuIHJtPTE7CisJICB9CisJICBzbnByaW50ZihjYSwxMDI0LCIoc3ApLHkiLGN5KTsKKwl9CisJLy8gU2ltaWxhcmx5IGxvb2sgZm9yIHJlZ2lzdGVyIGxvYWRzCisJLy8gV2UgY2FuIHNvbWV0aW1lcyByZW1vdmUgc29tZSBvZiB0aG9zZSwgdG9vLgorCWlmICgoc3RybGVuKGJ1ZjEpPjEpJiYoYnVmMVswXT09J3InKSkgeworCSAgaWYgKHN0cmNtcChjYSxidWYxKSkgCisJICAgIHNucHJpbnRmKGNhLDEwMjQsIiVzIixidWYxKTsKKwkgIGVsc2UgeworCSAgICAvLyBEb24ndCByZS1sb2FkIEEgd2l0aCB0aGUgc2FtZSBjb250ZW50cyBpdCBhbHJlYWR5IGhhcworCSAgICByZW1vdmVfYXNtKCk7CisJICAgIHJldHVybiBybT0xOworCSAgfQorCX0KKyAgICAgIH0KKyAgICB9ZWxzZSBpZighc3RyY21wKG9wMSwibGR4IikpeworICAgICAgaWYoYnVmMVswXT09JyMnKXsKKwlpZighcm0mJiFzdHJjbXAoYnVmMSxjeCkpe3JlbW92ZV9hc20oKTtyZXR1cm4gcm09MTt9CisJc3RyY3B5KGN4LGJ1ZjEpOworICAgICAgfWVsc2UgY3hbMF09MDsKKyAgICB9ZWxzZSBpZighc3RyY21wKG9wMSwibGR5IikpeworICAgICAgaWYoYnVmMVswXT09JyMnKXsKKwlpZighcm0mJiFzdHJjbXAoYnVmMSxjeSkpe3JlbW92ZV9hc20oKTtyZXR1cm4gcm09MTt9CisJc3RyY3B5KGN5LGJ1ZjEpOworICAgICAgfWVsc2UgY3lbMF09MDsKKyAgICB9ZWxzZSBpZighc3RyY21wKG9wMSwibGR6IikpeworICAgICAgaWYoYnVmMVswXT09JyMnKXsKKwlpZighcm0mJiFzdHJjbXAoYnVmMSxjeikpe3JlbW92ZV9hc20oKTtyZXR1cm4gcm09MTt9CisJc3RyY3B5KGN6LGJ1ZjEpOworICAgICAgfWVsc2UgY3pbMF09MDsKKyAgICB9ZWxzZXsKKyAgICAgIC8vIFRPRE86IFBHUzogQWRkIHRoZSBBWFlaIG9wZXJhdGlvbnMgdG8gdGhlIGNsb2JiZXIgbGlzdHMuCisgICAgICAvLyAgICAgICAgICAgIFdpbGwgd2UgbmVlZCB0byBoYW5kbGUgdGhlbSBzcGVjaWFsbHk/CisgICAgICBzdGF0aWMgY2hhciBjbG9iYmVybm9uZVtdPSJjbGMgY2xkIGNsaSBjbHYgY21wIGNweCBjcHkgZGVjIGluYyBub3AgcGhhIHBocCBwbHAgc2VjIHNlZCBzZWkgc3RhIHN0eCBzdHkgc3R6IjsKKyAgICAgIHN0YXRpYyBjaGFyIGNsb2JiZXJhW109ImFkYyBhbmQgYXNsIGVvciBsc3Igb3JhIHBsYSByb2wgcm9yIHNiYyB0eGEgdHlhIHR6YSBuZWciOworICAgICAgc3RhdGljIGNoYXIgY2xvYmJlcnhbXT0iZGV4IGlueCB0YXggdHN4IjsKKyAgICAgIHN0YXRpYyBjaGFyIGNsb2JiZXJ5W109ImRleSBpbnkgdGF5IjsKKyAgICAgIHN0YXRpYyBjaGFyIGNsb2JiZXJ6W109ImRleiBpbnogdGF6IjsKKyAgICAgIGlmKHN0cnN0cihjbG9iYmVybm9uZSxvcDEpKXsKKwkvLyBJbnZhbGlkYXRlIEEgaG9sZGluZyBhIHN0YWNrIHZhcmlhYmxlIGJ5dGUgaWYgU1AgY2hhbmdlcworCWlmIChzdHJzdHIoYnVmMSwic3AiKSkgeworCSAgcHJpbnRmKCJidWYxPSclcydcbiIsYnVmMSk7CisJICBpZiAoc3Ryc3RyKGNhLCIoc3ApLHkiKSkgY2FbMF09MDsKKwl9CQorICAgICAgfWVsc2UgaWYoc3Ryc3RyKGNsb2JiZXJhLG9wMSkpCisJY2FbMF09MDsKKyAgICAgIGVsc2UgaWYoc3Ryc3RyKGNsb2JiZXJ4LG9wMSkpCisJY3hbMF09MDsKKyAgICAgIGVsc2UgaWYoc3Ryc3RyKGNsb2JiZXJ5LG9wMSkpIHsKKwljeVswXT0wOworCS8vIEludmFsaWRhdGUgQSBob2xkaW5nIGEgc3RhY2sgdmFyaWFibGUgYnl0ZSBpZiBZIGNoYW5nZXMKKwlpZiAoc3Ryc3RyKGNhLCIoc3ApLHkiKSkgY2FbMF09MDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoc3Ryc3RyKGNsb2JiZXJ6LG9wMSkpCisJY3pbMF09MDsKKyAgICAgIGVsc2UKKwljYVswXT1jeFswXT1jeVswXT1jelswXT0wOworICAgIH0KKyAgfWVsc2V7CisgICAgY2FbMF09Y3hbMF09Y3lbMF09Y3pbMF09MDsKKyAgfQorCisgIHJtPTA7CisKKyAgaWYoc3NjYW5mKGFzbWxpbmVbMF0sIiAlNnMgJTk5OXMiLG9wMSxidWYxKT09MiYmIXN0cmNtcChvcDEsImFuZCIpJiYhc3RyY21wKGJ1ZjEsIiMwIikpeworICAgIHN0cmNweShhc21saW5lWzBdLCJcdGxkYVx0IzBcbiIpOworICAgIHJldHVybiBybT0xOworICB9CisKKyAgaWYoZW50cmllcz49Mil7CisgICAgaS0tOworICAgIGlmKGk8MCkgaT1FTUlUX0JVRl9ERVBUSC0xOworICAgIGFzbWxpbmVbMV09ZW1pdF9idWZmZXJbaV07CisKKworICAgIGlmKCFzdHJjbXAoYXNtbGluZVswXSwiOyB2b2xhdGlsZSBiYXJyaWVyXG4iKSYmIXN0cmNtcChhc21saW5lWzBdLGFzbWxpbmVbMV0pKXsKKyAgICAgIHJlbW92ZV9hc20oKTsKKyAgICAgIHJldHVybiBybT0xOworICAgIH0KKworICAgIGlmKHNzY2FuZihhc21saW5lWzBdLCIgJTZzIixvcDEpPT0xJiYhc3RyY21wKG9wMSwicnRzIikmJgorICAgICAgIHNzY2FuZihhc21saW5lWzFdLCIgJTZzICU5OTlzIixvcDIsYnVmMik9PTImJiFzdHJjbXAob3AyLCJqc3IiKSl7CisgICAgICBzcHJpbnRmKGFzbWxpbmVbMV0sIlx0am1wXHQlc1xuIixidWYyKTsKKyAgICAgIHJlbW92ZV9hc20oKTsKKyAgICAgIHJldHVybiBybT0xOworICAgIH0KKworICAgIGZvcihqPTA7ajxzaXplb2YoZWxpbSkvc2l6ZW9mKGVsaW1bMF0pO2orKyl7CisgICAgICBpZihlbGltW2pdLmZsYWdzJk5FRURTQU1FKXsKKwlpZihzc2NhbmYoYXNtbGluZVswXSwiICU2cyAlOTk5cyIsb3AyLGJ1ZjIpPT0yJiYKKwkgICBzc2NhbmYoYXNtbGluZVsxXSwiICU2cyAlOTk5cyIsb3AxLGJ1ZjEpPT0yJiYKKwkgICAhc3RyY21wKG9wMSxlbGltW2pdLnMxKSYmIXN0cmNtcChvcDIsZWxpbVtqXS5zMikmJgorCSAgICFzdHJjbXAoYnVmMSxidWYyKSl7CisJICBpZihlbGltW2pdLnIpeworCSAgICBzdHJjcHkoYXNtbGluZVswXSxlbGltW2pdLnIpOworCSAgfWVsc2V7CisJICAgIGlmKGVsaW1bal0uZmxhZ3MmUkVNT1ZFMVNUKQorCSAgICAgIHN0cmNweShhc21saW5lWzFdLGFzbWxpbmVbMF0pOworCSAgICByZW1vdmVfYXNtKCk7CisJICB9CisJICByZXR1cm4gcm09MTsKKwl9CisgICAgICB9ZWxzZXsKKwlpZihzc2NhbmYoYXNtbGluZVsxXSwiICU2cyIsb3AxKT09MSYmCisJICAgc3NjYW5mKGFzbWxpbmVbMF0sIiAlNnMiLG9wMik9PTEmJgorCSAgICFzdHJjbXAob3AxLGVsaW1bal0uczEpJiYhc3RyY21wKG9wMixlbGltW2pdLnMyKSl7CisJICBpZihlbGltW2pdLmZsYWdzJlJFTU9WRTFTVCkKKwkgICAgc3RyY3B5KGFzbWxpbmVbMV0sYXNtbGluZVswXSk7CisJICByZW1vdmVfYXNtKCk7CisJICByZXR1cm4gcm09MTsKKwl9CisgICAgICB9CisgICAgfQorCisKKyAgfQorCisgIGlmKGVudHJpZXM+PTMpeworICAgIGktLTsKKyAgICBpZihpPDApIGk9RU1JVF9CVUZfREVQVEgtMTsKKyAgICBhc21saW5lWzJdPWVtaXRfYnVmZmVyW2ldOworICAgIGlmKHNzY2FuZihhc21saW5lWzBdLCIgJTZzICU5OTlzIixvcDEsYnVmMSk9PTIpeworI2lmIDAKKyAgICAgIGlmKCFzdHJjbXAob3AxLCJsZGEiKSYmYnVmMVswXT09JyMnKXsKKwlpZihzc2NhbmYoYXNtbGluZVsxXSwiICU2cyAlOTk5cyIsb3AyLGJ1ZjIpPT0yJiYKKwkgICAhc3RyY21wKG9wMiwic3RhIikpeworCSAgaWYoc3NjYW5mKGFzbWxpbmVbMl0sIiAlNnMgJTk5OXMiLG9wMixidWYyKT09MiYmCisJICAgICAhc3RyY21wKG9wMiwibGRhIikmJiFzdHJjbXAoYnVmMSxidWYyKSl7CisJICAgIHJlbW92ZV9hc20oKTsKKwkgICAgcmV0dXJuIHJtPTE7CisJICB9CisJfQorICAgICAgfQorI2VuZGlmCisgICAgICBpZighc3RyY21wKG9wMSwiYmVxIil8fCFzdHJjbXAob3AxLCJibmUiKSl7CisJaWYoc3NjYW5mKGFzbWxpbmVbMV0sIiAlNnMgJTk5OXMiLG9wMSxidWYxKT09MiYmCisJICAgIXN0cmNtcChvcDEsImNtcCIpJiYhc3RyY21wKGJ1ZjEsIiMwIikpeworCSAgaWYoc3NjYW5mKGFzbWxpbmVbMl0sIiAlNnMiLG9wMSk9PTEmJgorCSAgICAgc2V0c3pmbGFnKG9wMSkpeworCSAgICBzdHJjcHkoYXNtbGluZVsxXSxhc21saW5lWzBdKTsKKwkgICAgcmVtb3ZlX2FzbSgpOworCSAgICByZXR1cm4gcm09MTsKKwkgIH0KKwl9CisgICAgICB9CisgICAgfQorICB9CisgIAorICByZXR1cm4gMDsKK30KKworLyogUmV0dXJuIG5hbWUgb2YgbGlicmFyeSBmdW5jdGlvbiwgaWYgdGhpcyBub2RlIHNob3VsZCBiZQorICAgaW1wbGVtZW50ZWQgdmlhIGxpYmNhbGwuICovCitjaGFyICp1c2VfbGliY2FsbChpbnQgYyxpbnQgdCxpbnQgdDIpCit7CisgIHN0YXRpYyBjaGFyIGZuYW1lWzE2XTsKKyAgY2hhciAqcmV0PTA7CisKKyAgaWYoYz09Q09NUEFSRSl7CisgICAgaWYoKHQmTlEpPT1MTE9OR3x8KElTRkxPQVQodCkmJiFpZWVlKSl7CisgICAgICBzcHJpbnRmKGZuYW1lLCJfX2NtcCVzJXMlbGQiLCh0JlVOU0lHTkVEKT8idSI6InMiLElTRkxPQVQodCk/ImZsdCI6ImludCIsem0ybChzaXpldGFiW3QmTlFdKSo4KTsKKyAgICAgIHJldD1mbmFtZTsKKyAgICB9CisgIH1lbHNleworICAgIHQmPU5VOworICAgIHQyJj1OVTsKKyAgICBpZihJU1NIT1JUKHQpJiZjIT1NVUxUJiZjIT1ESVYmJmMhPU1PRCYmIUlTRkxPQVQodDIpKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYoSVNMT05HKHQpJiZjIT1NVUxUJiZjIT1ESVYmJmMhPU1PRCYmIUlTRkxPQVQodDIpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBpZighaWVlZSYmSVNGTE9BVCh0KSkgdD1GTE9BVDsKKyAgICBpZih0PT1MRE9VQkxFKSB0PURPVUJMRTsKKyAgICBpZih0Mj09TERPVUJMRSkgdDI9RE9VQkxFOworICAgIGlmKCFpZWVlJiZJU0ZMT0FUKHQyKSkgdDI9RkxPQVQ7CisgICAgaWYoYz09Q09OVkVSVCl7CisgICAgICBpZih0PT10MikgcmV0dXJuIDA7CisgICAgICBpZih0PT1GTE9BVCYmdDI9PURPVUJMRSkgcmV0dXJuICJfX2ZsdDY0dG9mbHQzMiI7CisgICAgICBpZih0PT1ET1VCTEUmJnQyPT1GTE9BVCkgcmV0dXJuICJfX2ZsdDMydG9mbHQ2NCI7CisKKyAgICAgIGlmKElTRkxPQVQodCkpeworICAgICAgICBzcHJpbnRmKGZuYW1lLCJfXyVjaW50JWxkdG9mbHQlZCIsKHQyJlVOU0lHTkVEKT8ndSc6J3MnLHptMmwoc2l6ZXRhYlt0MiZOUV0pKjgsKHQ9PUZMT0FUKT8zMjo2NCk7CisgICAgICAgIHJldD1mbmFtZTsKKyAgICAgIH0KKyAgICAgIGlmKElTRkxPQVQodDIpKXsKKyAgICAgICAgc3ByaW50ZihmbmFtZSwiX19mbHQlZHRvJWNpbnQlbGQiLCgodDImTlUpPT1GTE9BVCk/MzI6NjQsKHQmVU5TSUdORUQpPyd1Jzoncycsem0ybChzaXpldGFiW3QmTlFdKSo4KTsKKyAgICAgICAgcmV0PWZuYW1lOworICAgICAgfQorICAgIH0KKyAgICBpZigodCZOUSk9PUlOVHx8KHQmTlEpPT1MT05HfHwodCZOUSk9PUxMT05HfHwoIWllZWUmJklTRkxPQVQodCkpKXsKKyAgICAgIGlmKChjPj1MU0hJRlQmJmM8PU1PRCl8fChjPj1PUiYmYzw9QU5EKXx8Yz09S09NUExFTUVOVHx8Yz09TUlOVVMpeworICAgICAgICBpZih0PT0oVU5TSUdORUR8TExPTkcpJiYoYz09TVVMVHx8Yz09RElWfHxjPT1NT0R8fGM9PVJTSElGVCkpeworICAgICAgICAgIHNwcmludGYoZm5hbWUsIl9fJXN1aW50NjQiLGVuYW1lW2NdKTsKKyAgICAgICAgICByZXQ9Zm5hbWU7CisgICAgICAgIH1lbHNlIGlmKCh0Jk5RKT09TExPTkcpeworICAgICAgICAgIHNwcmludGYoZm5hbWUsIl9fJXNpbnQ2NCIsZW5hbWVbY10pOworICAgICAgICAgIHJldD1mbmFtZTsKKyAgICAgICAgfWVsc2UgaWYodD09KFVOU0lHTkVEfExPTkcpJiYoYz09RElWfHxjPT1NT0R8fGM9PVJTSElGVCkpeworICAgICAgICAgIHNwcmludGYoZm5hbWUsIl9fJXN1aW50MzIiLGVuYW1lW2NdKTsKKyAgICAgICAgICByZXQ9Zm5hbWU7CisgICAgICAgIH1lbHNlIGlmKCh0Jk5RKT09TE9ORyl7CisgICAgICAgICAgc3ByaW50ZihmbmFtZSwiX18lc2ludDMyIixlbmFtZVtjXSk7CisgICAgICAgICAgcmV0PWZuYW1lOworICAgICAgICB9ZWxzZSBpZih0PT0oVU5TSUdORUR8SU5UKSYmKGM9PURJVnx8Yz09TU9EfHxjPT1SU0hJRlQpKXsKKyAgICAgICAgICBzcHJpbnRmKGZuYW1lLCJfXyVzdWludDE2IixlbmFtZVtjXSk7CisgICAgICAgICAgcmV0PWZuYW1lOworICAgICAgICB9ZWxzZSBpZigodCZOUSk9PUlOVCl7CisgICAgICAgICAgc3ByaW50ZihmbmFtZSwiX18lc2ludDE2IixlbmFtZVtjXSk7CisgICAgICAgICAgcmV0PWZuYW1lOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICBzcHJpbnRmKGZuYW1lLCJfXyVzJXMlcyVsZCIsZW5hbWVbY10sKHQmVU5TSUdORUQpPyJ1IjoiIixJU0ZMT0FUKHQpPyJmbHQiOiJpbnQiLHptMmwoc2l6ZXRhYlt0Jk5RXSkqOCk7CisgICAgICAgICAgcmV0PWZuYW1lOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworCitpbnQgcG9pbnRlcl92YXJhZHIoVmFyICp2KQoreworICBpbnQgYj1iYW5rKHYpOworICBpZihiPj0wJiZiIT1iYW5rY251bSYmIU5PQkFOS1ZBUlMpeworICAgIGlmKGN1cl9mdW5jdiYmYmFuayhjdXJfZnVuY3YpIT1iKQorICAgICAgcmV0dXJuIEZQT0lOVEVSOworICB9CisgIHJldHVybiBwb2ludGVyX3R5cGUodi0+dnR5cCk7Cit9CisKK2ludCBwb2ludGVyX3R5cGUoc3RydWN0IFR5cCAqcCkKK3sKKyAgc3RydWN0IFR5cCAqbWVyaz1wOworICBpZighcCkgaWVycm9yKDApOworICBpZihMQVJHRSkgcmV0dXJuIEZQT0lOVEVSOworICB3aGlsZShJU0FSUkFZKHAtPmZsYWdzKXx8SVNGVU5DKHAtPmZsYWdzKSkgcD1wLT5uZXh0OworICBpZihwLT5hdHRyKXsKKyAgICBjaGFyICpzOworICAgIGlmKHN0cnN0cihwLT5hdHRyLFNUUl9IVUdFKSkgcmV0dXJuIEhQT0lOVEVSOworICAgIGlmKHN0cnN0cihwLT5hdHRyLFNUUl9GQVIpKSByZXR1cm4gRlBPSU5URVI7CisgICAgaWYoc3Ryc3RyKHAtPmF0dHIsU1RSX05FQVIpKSByZXR1cm4gUE9JTlRFUjsKKyAgfQorICByZXR1cm4gUE9JTlRFUjsKK30KKwordW5zaWduZWQgY2hhciBjYm1jb252KHVuc2lnbmVkIGNoYXIgeCkKK3sKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgY3RhYlsyNTZdPXsKKyAgICAweDAwLDB4MDEsMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgxNCwweDA5LDB4MEQsMHgxMSwweDkzLDB4MEEsMHgwRSwweDBGLAorICAgIDB4MTAsMHgwQiwweDEyLDB4MTMsMHgwOCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLDB4MUMsMHgxRCwweDFFLDB4MUYsCisgICAgMHgyMCwweDIxLDB4MjIsMHgyMywweDI0LDB4MjUsMHgyNiwweDI3LDB4MjgsMHgyOSwweDJBLDB4MkIsMHgyQywweDJELDB4MkUsMHgyRiwKKyAgICAweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwweDM2LDB4MzcsMHgzOCwweDM5LDB4M0EsMHgzQiwweDNDLDB4M0QsMHgzRSwweDNGLAorICAgIDB4NDAsMHhDMSwweEMyLDB4QzMsMHhDNCwweEM1LDB4QzYsMHhDNywweEM4LDB4QzksMHhDQSwweENCLDB4Q0MsMHhDRCwweENFLDB4Q0YsCisgICAgMHhEMCwweEQxLDB4RDIsMHhEMywweEQ0LDB4RDUsMHhENiwweEQ3LDB4RDgsMHhEOSwweERBLDB4NUIsMHhCRiwweDVELDB4NUUsMHhBNCwKKyAgICAweEFELDB4NDEsMHg0MiwweDQzLDB4NDQsMHg0NSwweDQ2LDB4NDcsMHg0OCwweDQ5LDB4NEEsMHg0QiwweDRDLDB4NEQsMHg0RSwweDRGLAorICAgIDB4NTAsMHg1MSwweDUyLDB4NTMsMHg1NCwweDU1LDB4NTYsMHg1NywweDU4LDB4NTksMHg1QSwweEIzLDB4REQsMHhBQiwweEIxLDB4REYsCisgICAgMHg4MCwweDgxLDB4ODIsMHg4MywweDg0LDB4ODUsMHg4NiwweDg3LDB4ODgsMHg4OSwweDhBLDB4OEIsMHg4QywweDhELDB4OEUsMHg4RiwKKyAgICAweDkwLDB4OTEsMHg5MiwweDBDLDB4OTQsMHg5NSwweDk2LDB4OTcsMHg5OCwweDk5LDB4OUEsMHg5QiwweDlDLDB4OUQsMHg5RSwweDlGLAorICAgIDB4QTAsMHhBMSwweEEyLDB4QTMsMHg1RiwweEE1LDB4QTYsMHhBNywweEE4LDB4QTksMHhBQSwweDdELDB4QUMsMHg2MCwweEFFLDB4QUYsCisgICAgMHhCMCwweDdFLDB4QjIsMHg3QiwweEI0LDB4QjUsMHhCNiwweEI3LDB4QjgsMHhCOSwweEJBLDB4QkIsMHhCQywweEJELDB4QkUsMHg1QywKKyAgICAweDYwLDB4NjEsMHg2MiwweDYzLDB4NjQsMHg2NSwweDY2LDB4NjcsMHg2OCwweDY5LDB4NkEsMHg2QiwweDZDLDB4NkQsMHg2RSwweDZGLAorICAgIDB4NzAsMHg3MSwweDcyLDB4NzMsMHg3NCwweDc1LDB4NzYsMHg3NywweDc4LDB4NzksMHg3QSwweDdCLDB4REMsMHg3QywweERFLDB4N0YsCisgICAgMHhFMCwweEUxLDB4RTIsMHhFMywweEU0LDB4RTUsMHhFNiwweEU3LDB4RTgsMHhFOSwweEVBLDB4RUIsMHhFQywweEVELDB4RUUsMHhFRiwKKyAgICAweEYwLDB4RjEsMHhGMiwweEYzLDB4RjQsMHhGNSwweEY2LDB4RjcsMHhGOCwweEY5LDB4RkEsMHhGQiwweEZDLDB4RkQsMHhGRSwweEZGCisgIH07CisKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgYXRhYltdPXsweGZkLDgsMHg3ZiwweDliLDExLDB4N2R9OworCisgIGlmKGNibWFzY2lpKQorICAgIHJldHVybiBjdGFiW3gmMjU1XTsKKyAgZWxzZSBpZihhdGFzY2lpJiZ4Pj03JiZ4PD0xMikKKyAgICByZXR1cm4gYXRhYlt4LTddOworICBlbHNlCisgICAgcmV0dXJuIHg7Cit9CisKK3ZvaWQgaW5zZXJ0X2NvbnN0KHVuaW9uIGF0eXBzICpwLGludCB0KQorLyogIFRyYWVndCBLb25zdGFudGUgaW4gZW50cHJlY2hlbmRlcyBGZWxkIGVpbi4gICAgICAgKi8KK3sKKyAgaWYoIXApIGllcnJvcigwKTsKKy8qICAqcCA9ICh1bmlvbiBhdHlwcykgMCA7IC8qIHJmaTogY2xlYXIgdW51c2VkIGJpdHMgKi8KKyAgdCY9TlU7CisgIGlmKHQ9PUNIQVIpIHtwLT52Y2hhcj12Y2hhcjtyZXR1cm47fQorICBpZih0PT1TSE9SVCkge3AtPnZzaG9ydD12c2hvcnQ7cmV0dXJuO30KKyAgaWYodD09SU5UKSB7cC0+dmludD12aW50O3JldHVybjt9CisgIGlmKHQ9PUxPTkcpIHtwLT52bG9uZz12bG9uZztyZXR1cm47fQorICBpZih0PT1MTE9ORykge3AtPnZsbG9uZz12bGxvbmc7cmV0dXJuO30KKyAgaWYodD09TUFYSU5UKSB7cC0+dm1heD12bWF4O3JldHVybjt9CisgIGlmKHQ9PShVTlNJR05FRHxDSEFSKSkge3AtPnZ1Y2hhcj12dWNoYXI7cmV0dXJuO30KKyAgaWYodD09KFVOU0lHTkVEfFNIT1JUKSkge3AtPnZ1c2hvcnQ9dnVzaG9ydDtyZXR1cm47fQorICBpZih0PT0oVU5TSUdORUR8SU5UKSkge3AtPnZ1aW50PXZ1aW50O3JldHVybjt9CisgIGlmKHQ9PShVTlNJR05FRHxMT05HKSkge3AtPnZ1bG9uZz12dWxvbmc7cmV0dXJuO30KKyAgaWYodD09KFVOU0lHTkVEfExMT05HKSkge3AtPnZ1bGxvbmc9dnVsbG9uZztyZXR1cm47fQorICBpZih0PT0oVU5TSUdORUR8TUFYSU5UKSkge3AtPnZ1bWF4PXZ1bWF4O3JldHVybjt9CisgIGlmKHQ9PUZMT0FUKSB7cC0+dmZsb2F0PXZmbG9hdDtyZXR1cm47fQorICBpZih0PT1ET1VCTEUpIHtwLT52ZG91YmxlPXZkb3VibGU7cmV0dXJuO30KKyAgaWYodD09TERPVUJMRSkge3AtPnZsZG91YmxlPXZsZG91YmxlO3JldHVybjt9CisgIGlmKHQ9PVBPSU5URVIpIHtwLT52dWludD12dWludDtyZXR1cm47fQorICBpZih0PT1GUE9JTlRFUnx8dD09SFBPSU5URVIpIHtwLT52dWxvbmc9dnVsb25nO3JldHVybjt9Cit9CisKK3ZvaWQgZXZhbF9jb25zdCh1bmlvbiBhdHlwcyAqcCxpbnQgdCkKKy8qICBXZWlzdCBiZXN0aW1tdGVuIGdsb2JhbGVuIFZhcmlhYmxlbiBXZXJ0IGVpbmVyIENFWFBSIHp1LiAgICAgICAqLworeworICBpbnQgZj10Jk5ROworICBpZighcCkgaWVycm9yKDApOworICBpZihmPT1NQVhJTlR8fChmPj1DSEFSJiZmPD1MTE9ORykpeworICAgIGlmKCEodCZVTlNJR05FRCkpeworICAgICAgaWYoZj09Q0hBUikgdm1heD16YzJ6bShwLT52Y2hhcik7CisgICAgICBlbHNlIGlmKGY9PVNIT1JUKXZtYXg9enMyem0ocC0+dnNob3J0KTsKKyAgICAgIGVsc2UgaWYoZj09SU5UKSAgdm1heD16aTJ6bShwLT52aW50KTsKKyAgICAgIGVsc2UgaWYoZj09TE9ORykgdm1heD16bDJ6bShwLT52bG9uZyk7CisgICAgICBlbHNlIGlmKGY9PUxMT05HKSB2bWF4PXpsbDJ6bShwLT52bGxvbmcpOworICAgICAgZWxzZSBpZihmPT1NQVhJTlQpIHZtYXg9cC0+dm1heDsKKyAgICAgIGVsc2UgaWVycm9yKDApOworICAgICAgdnVtYXg9em0yenVtKHZtYXgpOworICAgICAgdmxkb3VibGU9em0yemxkKHZtYXgpOworICAgIH1lbHNleworICAgICAgaWYoZj09Q0hBUikgdnVtYXg9enVjMnp1bShwLT52dWNoYXIpOworICAgICAgZWxzZSBpZihmPT1TSE9SVCl2dW1heD16dXMyenVtKHAtPnZ1c2hvcnQpOworICAgICAgZWxzZSBpZihmPT1JTlQpICB2dW1heD16dWkyenVtKHAtPnZ1aW50KTsKKyAgICAgIGVsc2UgaWYoZj09TE9ORykgdnVtYXg9enVsMnp1bShwLT52dWxvbmcpOworICAgICAgZWxzZSBpZihmPT1MTE9ORykgdnVtYXg9enVsbDJ6dW0ocC0+dnVsbG9uZyk7CisgICAgICBlbHNlIGlmKGY9PU1BWElOVCkgdnVtYXg9cC0+dnVtYXg7CisgICAgICBlbHNlIGllcnJvcigwKTsKKyAgICAgIHZtYXg9enVtMnptKHZ1bWF4KTsKKyAgICAgIHZsZG91YmxlPXp1bTJ6bGQodnVtYXgpOworICAgIH0KKyAgfWVsc2V7CisgICAgaWYoSVNQT0lOVEVSKGYpKXsKKyAgICAgIGlmKGY9PVBPSU5URVIpCisJdnVtYXg9enVpMnp1bShwLT52dWludCk7CisgICAgICBlbHNlCisJdnVtYXg9enVsMnp1bShwLT52dWxvbmcpOworICAgICAgdm1heD16dW0yem0odnVtYXgpO3ZsZG91YmxlPXp1bTJ6bGQodnVtYXgpOworICAgIH1lbHNleworICAgICAgaWYoZj09RkxPQVQpIHZsZG91YmxlPXpmMnpsZChwLT52ZmxvYXQpOworICAgICAgZWxzZSBpZihmPT1ET1VCTEUpIHZsZG91YmxlPXpkMnpsZChwLT52ZG91YmxlKTsKKyAgICAgIGVsc2Ugdmxkb3VibGU9cC0+dmxkb3VibGU7CisgICAgICB2bWF4PXpsZDJ6bSh2bGRvdWJsZSk7CisgICAgICB2dW1heD16bGQyenVtKHZsZG91YmxlKTsKKyAgICB9CisgIH0KKyAgdmZsb2F0PXpsZDJ6Zih2bGRvdWJsZSk7CisgIHZkb3VibGU9emxkMnpkKHZsZG91YmxlKTsKKyAgdnVjaGFyPXp1bTJ6dWModnVtYXgpOworICB2dXNob3J0PXp1bTJ6dXModnVtYXgpOworICB2dWludD16dW0yenVpKHZ1bWF4KTsKKyAgdnVsb25nPXp1bTJ6dWwodnVtYXgpOworICB2dWxsb25nPXp1bTJ6dWxsKHZ1bWF4KTsKKyAgdmNoYXI9em0yemModm1heCk7CisgIHZzaG9ydD16bTJ6cyh2bWF4KTsKKyAgdmludD16bTJ6aSh2bWF4KTsKKyAgdmxvbmc9em0yemwodm1heCk7CisgIHZsbG9uZz16bTJ6bGwodm1heCk7Cit9CisKK3ZvaWQgcHJpbnR2YWwoRklMRSAqZix1bmlvbiBhdHlwcyAqcCxpbnQgdCkKKy8qICBHaWJ0IGF0eXBzIGF1cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgdCY9TlU7CisgIGlmKHQ9PUNIQVIpe2ZwcmludGYoZiwiQyIpO3ZtYXg9emMyem0ocC0+dmNoYXIpO3ByaW50em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxDSEFSKSl7ZnByaW50ZihmLCJVQyIpO3Z1bWF4PXp1YzJ6dW0ocC0+dnVjaGFyKTtwcmludHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PVNIT1JUKXtmcHJpbnRmKGYsIlMiKTt2bWF4PXpzMnptKHAtPnZzaG9ydCk7cHJpbnR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfFNIT1JUKSl7ZnByaW50ZihmLCJVUyIpO3Z1bWF4PXp1czJ6dW0ocC0+dnVzaG9ydCk7cHJpbnR6dW0oZix2dW1heCk7fQorICBpZih0PT1GTE9BVCl7ZnByaW50ZihmLCJGIik7dmxkb3VibGU9emYyemxkKHAtPnZmbG9hdCk7cHJpbnR6bGQoZix2bGRvdWJsZSk7fQorICBpZih0PT1ET1VCTEUpe2ZwcmludGYoZiwiRCIpO3ZsZG91YmxlPXpkMnpsZChwLT52ZG91YmxlKTtwcmludHpsZChmLHZsZG91YmxlKTt9CisgIGlmKHQ9PUxET1VCTEUpe2ZwcmludGYoZiwiTEQiKTtwcmludHpsZChmLHAtPnZsZG91YmxlKTt9CisgIGlmKHQ9PUlOVCl7ZnByaW50ZihmLCJJIik7dm1heD16aTJ6bShwLT52aW50KTtwcmludHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8SU5UKXx8dD09UE9JTlRFUil7ZnByaW50ZihmLCJVSSIpO3Z1bWF4PXp1aTJ6dW0ocC0+dnVpbnQpO3ByaW50enVtKGYsdnVtYXgpO30KKyAgaWYodD09TE9ORyl7ZnByaW50ZihmLCJMIik7dm1heD16bDJ6bShwLT52bG9uZyk7cHJpbnR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfExPTkcpfHx0PT1GUE9JTlRFUnx8dD09SFBPSU5URVIpe2ZwcmludGYoZiwiVUwiKTt2dW1heD16dWwyenVtKHAtPnZ1bG9uZyk7cHJpbnR6dW0oZix2dW1heCk7fQorICBpZih0PT1MTE9ORyl7ZnByaW50ZihmLCJMTCIpO3ZtYXg9emxsMnptKHAtPnZsbG9uZyk7cHJpbnR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfExMT05HKSl7ZnByaW50ZihmLCJVTEwiKTt2dW1heD16dWxsMnp1bShwLT52dWxsb25nKTtwcmludHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PU1BWElOVCkgcHJpbnR6bShmLHAtPnZtYXgpOworICBpZih0PT0oVU5TSUdORUR8TUFYSU5UKSkgcHJpbnR6dW0oZixwLT52dW1heCk7Cit9CisKK3ZvaWQgZW1pdHZhbChGSUxFICpmLHVuaW9uIGF0eXBzICpwLGludCB0KQorLyogIEdpYnQgYXR5cHMgYXVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICB0Jj1OVTsKKyAgaWYodD09Q0hBUil7dm1heD16YzJ6bShwLT52Y2hhcik7ZW1pdHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8Q0hBUikpe3Z1bWF4PXp1YzJ6dW0ocC0+dnVjaGFyKTtlbWl0enVtKGYsdnVtYXgpO30KKyAgaWYodD09U0hPUlQpe3ZtYXg9enMyem0ocC0+dnNob3J0KTtlbWl0em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxTSE9SVCkpe3Z1bWF4PXp1czJ6dW0ocC0+dnVzaG9ydCk7ZW1pdHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUZMT0FUKXt2bGRvdWJsZT16ZjJ6bGQocC0+dmZsb2F0KTtlbWl0emxkKGYsdmxkb3VibGUpO30KKyAgaWYodD09RE9VQkxFKXt2bGRvdWJsZT16ZDJ6bGQocC0+dmRvdWJsZSk7ZW1pdHpsZChmLHZsZG91YmxlKTt9CisgIGlmKHQ9PUxET1VCTEUpe2VtaXR6bGQoZixwLT52bGRvdWJsZSk7fQorICBpZih0PT1JTlQpe3ZtYXg9emkyem0ocC0+dmludCk7ZW1pdHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8SU5UKXx8dD09UE9JTlRFUil7dnVtYXg9enVpMnp1bShwLT52dWludCk7ZW1pdHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUxPTkcpe3ZtYXg9emwyem0ocC0+dmxvbmcpO2VtaXR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfExPTkcpfHx0PT1GUE9JTlRFUnx8dD09SFBPSU5URVIpe3Z1bWF4PXp1bDJ6dW0ocC0+dnVsb25nKTtlbWl0enVtKGYsdnVtYXgpO30KKyAgaWYodD09TExPTkcpe3ZtYXg9emxsMnptKHAtPnZsbG9uZyk7ZW1pdHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8TExPTkcpKXt2dW1heD16dWxsMnp1bShwLT52dWxsb25nKTtlbWl0enVtKGYsdnVtYXgpO30KKyAgaWYodD09TUFYSU5UKSBlbWl0em0oZixwLT52bWF4KTsKKyAgaWYodD09KFVOU0lHTkVEfE1BWElOVCkpIGVtaXR6dW0oZixwLT52dW1heCk7Cit9CisKK3ZvaWQgY29udl90eXAoc3RydWN0IFR5cCAqcCkKKy8qIEVyemV1Z3QgZXh0ZW5kZWQgdHlwZXMgaW4gZWluZW0gVHlwLiAqLworeworICBjaGFyICphdHRyOworICB3aGlsZShwKXsKKyAgICBpZihJU1BPSU5URVIocC0+ZmxhZ3MpKXsKKyAgICAgIHAtPmZsYWdzPSgocC0+ZmxhZ3Mmfk5VKXxQT0lOVEVSX1RZUEUocC0+bmV4dCkpOworICAgICAgaWYoYXR0cj1wLT5uZXh0LT5hdHRyKXsKKyAgICAgICAgaWYoc3Ryc3RyKGF0dHIsU1RSX05FQVIpKQorICAgICAgICAgIHAtPmZsYWdzPSgocC0+ZmxhZ3Mmfk5VKXxQT0lOVEVSKTsKKyAgICAgICAgaWYoc3Ryc3RyKGF0dHIsU1RSX0ZBUikpCisgICAgICAgICAgcC0+ZmxhZ3M9KChwLT5mbGFncyZ+TlUpfEZQT0lOVEVSKTsKKyAgICAgICAgaWYoc3Ryc3RyKGF0dHIsU1RSX0hVR0UpKQorICAgICAgICAgIHAtPmZsYWdzPSgocC0+ZmxhZ3Mmfk5VKXxIUE9JTlRFUik7CisgICAgICB9CisgICAgfQorICAgIHA9cC0+bmV4dDsKKyAgfQorfQorCit2b2lkIGFkZF92YXJfaG9va19wb3N0KFZhciAqdikKK3sKKyAgaWYodXNlX3NlYyYmKHYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQ3x8di0+c3RvcmFnZV9jbGFzcz09RVhURVJOKSl7CisgICAgY2hhciBidWZbU0VDTEVOKzMyXTsKKyAgICBzcHJpbnRmKGJ1Ziwic2VjdGlvbihcIiVzXCIpOyIsdXNlX3NlYyk7CisgICAgYWRkX2F0dHIoJnYtPnZhdHRyLGJ1Zik7CisgIH0KKyAgaWYodXNlX2Jhbms+PTAmJih2LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUN8fHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTikpeworICAgIGNoYXIgYnVmWzY0XTsKKyAgICAvKnNwcmludGYoYnVmLCJzZWN0aW9uKFwiYmFuayVkXCIpO2JhbmsoJWQpIix1c2VfYmFuayx1c2VfYmFuayk7Ki8KKyAgICBzcHJpbnRmKGJ1ZiwiYmFuayglZCkiLHVzZV9iYW5rKTsKKyAgICBhZGRfYXR0cigmdi0+dmF0dHIsYnVmKTsKKyAgfQorfQorCitpbnQgZGVjaWRlX3JldmVyc2Uoem1heCB2KQoreworICBpZih6bWVxdG8odixaMSl8fHptZXF0byh2LGwyem0oMkwpKSkKKyAgICByZXR1cm4gMTsKKyAgaWYob3B0c3BlZWQpCisgICAgaWYoem1lcXRvKHYsbDJ6bSg0TCkpfHx6bWVxdG8odixsMnptKDhMKSl8fHptZXF0byh2LGwyem0oMjU2TCkpfHx6bWVxdG8odixsMnptKDUxMkwpKSkKKyAgICAgIHJldHVybiAxOworICAKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNfc2luZ2xlX2VmZl9pYyhzdHJ1Y3QgSUMgKnApCit7CisgIHN0cnVjdCBWYXIgKnYsKmlkeDsKKyAgaWYocC0+Y29kZSE9QURESTJQfHwocC0+dHlwZjImTlEpIT1QT0lOVEVSKQorICAgIHJldHVybiAwOworICBpZighKHAtPnEyLmZsYWdzJktPTlNUKSl7CisgICAgaWYoKHAtPnR5cGYmTlUpIT0oVU5TSUdORUR8Q0hBUikpCisgICAgICByZXR1cm4gMDsKKyAgICBpZigocC0+cTIuZmxhZ3MmKFZBUnxEUkVGT0JKKSkhPVZBUikKKyAgICAgIHJldHVybiAwOworICAgIGlmKHAtPnEyLnYtPnN0b3JhZ2VfY2xhc3MhPUFVVE8mJnAtPnEyLnYtPnN0b3JhZ2VfY2xhc3MhPVJFR0lTVEVSKQorICAgICAgcmV0dXJuIDA7CisgICAgaWR4PXAtPnEyLnY7CisgIH1lbHNleworICAgIGlkeD0wOworICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxwLT50eXBmKTsKKyAgICAvKiBUT0RPOiBtb3JlIHByZWNpc2UgY2hlY2sgY29uc2lkZXJpbmcgZGF0YSB0eXBlIHVzZWZ1bD8gKi8KKyAgICBpZighem1sZXEodnVtYXgsbDJ6bSgyNTVMKSkpCisgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZihwLT5xMS5mbGFncyZEUkVGT0JKKQorICAgIHJldHVybiAwOworICBpZigocC0+ei5mbGFncyYoVkFSfERSRUZPQkopKSE9VkFSKQorICAgIHJldHVybiAwOworICBpZihwLT56LnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQ3x8cC0+ei52LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pCisgICAgcmV0dXJuIDA7CisgIHY9cC0+ei52OworICBmb3IocD1wLT5uZXh0O3A7cD1wLT5uZXh0KXsKKyAgICBpbnQgYz1wLT5jb2RlOworICAgIGlmKGM9PUxBQkVMfHwoYz49QkVRJiZjPD1CUkEpKQorICAgICAgcmV0dXJuIDE7IC8qIFRPRE86IGhvdyBlbGFib3JhdGUgc2hvdWxkIHdlIHRlc3Q/ICovCisgICAgaWYoKHAtPnExLmZsYWdzJlZBUikmJnAtPnExLnY9PXYpeworICAgICAgaWYocC0+cTEuZmxhZ3MmRFJFRk9CSikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZigocC0+cTIuZmxhZ3MmVkFSKSYmcC0+cTIudj09dil7CisgICAgICBpZihwLT5xMi5mbGFncyZEUkVGT0JKKQorICAgICAgICByZXR1cm4gMTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmKChwLT56LmZsYWdzJlZBUikmJnAtPnoudj09dil7CisgICAgICBpZihwLT56LmZsYWdzJkRSRUZPQkopCisgICAgICAgIHJldHVybiAxOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYoKHAtPnouZmxhZ3MmVkFSKSYmcC0+ei52PT1pZHgpCisgICAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMDsKK30KKwordm9pZCBtYXJrX2VmZl9pY3Modm9pZCkKK3sKKyAgc3RydWN0IElDICpwOworICBmb3IocD1maXJzdF9pYztwO3A9cC0+bmV4dCl7CisgICAgaWYoaXNfc2luZ2xlX2VmZl9pYyhwKSkKKyAgICAgIHAtPmZsYWdzfD1FRkZfSUM7CisgICAgZWxzZQorICAgICAgcC0+ZmxhZ3MmPX5FRkZfSUM7CisgIH0KK30KZGlmZiAtLWdpdCBhL21hY2hpbmVzL202OGsvbWFjaGluZS5jIGIvbWFjaGluZXMvbTY4ay9tYWNoaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U5NmEzMQotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL202OGsvbWFjaGluZS5jCkBAIC0wLDAgKzEsNTU5NSBAQAorLyogICRWRVI6IHZiY2MgKG02OGsvbWFjaGluZS5jKSAkUmV2aXNpb246IDEuMTM5ICQgICAgICovCisvKiAgQ29kZSBnZW5lcmF0b3IgZm9yIE1vdG9yb2xhIDY4MHgwIENQVXMuIFN1cHBvcnRzIDY4MDAwLTY4MDYwKzY4ODgxLzIgICAgKi8KKy8qICBhbmQgQ29sZEZpcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHZhc20sIFBoeEFzcyBhbmQgdGhlIEdOVSBhc3NlbWJsZXIgaXMgc3VwcG9ydGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCisKKworI2luY2x1ZGUgInN1cHAuaCIKKworI2RlZmluZSBORVdfUkVUIDAKKworc3RhdGljIGNoYXIgRklMRV9bXT1fX0ZJTEVfXzsKKworI2luY2x1ZGUgImR3YXJmMi5jIgorCisvKiAgUHVibGljIGRhdGEgdGhhdCBNVVNUIGJlIHRoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogTmFtZSBhbmQgY29weXJpZ2h0LiAqLworY2hhciBjZ19jb3B5cmlnaHRbXT0idmJjYyBjb2RlLWdlbmVyYXRvciBmb3IgbTY4ay9Db2xkRmlyZSBWMS4xNSAoYykgaW4gMTk5NS0yMDIyIGJ5IFZvbGtlciBCYXJ0aGVsbWFubiI7CisKKy8qICBDb21tYW5kbGluZS1mbGFncyB0aGUgY29kZS1nZW5lcmF0b3IgYWNjZXB0cyAgICAgICAgICAgICAgICAqLworaW50IGdfZmxhZ3NbTUFYR0ZdPXtWQUxGTEFHLFZBTEZMQUcsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CitjaGFyICpnX2ZsYWdzX25hbWVbTUFYR0ZdPXsKKyAgICAiY3B1IiwiZnB1IiwiZDJzY3JhdGNoIiwibm9hNCIsInNjIiwic2QiLCJwcm9mIiwiY29uc3QtaW4tZGF0YSIsCisgICAgInVzZS1mcmFtZXBvaW50ZXIiLCJuby1wZWVwaG9sZSIsIm5vLWRlbGF5ZWQtcG9wcGluZyIsCisgICAgImdhcyIsImJyYW5jaC1vcHQiLCJuby1mcC1yZXR1cm4iLCJuby1tcmVnLXJldHVybiIsImh1bmtkZWJ1ZyIsCisgICAgIm5vLWludHoiLCJvbGQtcGVlcGhvbGUiLCJjb25zZXJ2YXRpdmUtc3IiLCJlbGYiLCJ1c2UtY29tbW9ucyIsCisgICAgImEyc2NyYXRjaCIsIm9sZC1zb2Z0ZmxvYXQiLCJhbWlnYS1zb2Z0ZmxvYXQiLCJmYXN0Y2FsbCIsImZwMnNjcmF0Y2giLAorICAgICJuby1yZXNlcnZlLXJlZ3MiLCJwaHhhc3MiLCJjbGVhbi1mYXR0ciIsIm9sZC1saWJjYWxscyIsInZiY2NjYWxsIiwKKyAgICAiZmxvYXQ2NCIKK307CisKK3VuaW9uIHBwaSBnX2ZsYWdzX3ZhbFtNQVhHRl07CisKKy8qICBBbGlnbm1lbnQtcmVxdWlyZW1lbnRzIGZvciBhbGwgdHlwZXMgaW4gYnl0ZXMuICAgICAgICAgICAgICAqLworem1heCBhbGlnbltNQVhfVFlQRSsxXTsKKworLyogIEFsaWdubWVudCB0aGF0IGlzIHN1ZmZpY2llbnQgZm9yIGV2ZXJ5IG9iamVjdC4gICAgICAgICAgICAgICovCit6bWF4IG1heGFsaWduOworCisvKiAgQ0hBUl9CSVQgb2YgdGhlIHRhcmdldCBtYWNoaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggY2hhcl9iaXQ7CisKKy8qICBTaXplcyBvZiBhbGwgZWxlbWVudGFyeSB0eXBlcyBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAqLworem1heCBzaXpldGFiW01BWF9UWVBFKzFdOworCisvKiAgTWluaW11bSBhbmQgTWF4aW11bSB2YWx1ZXMgZWFjaCB0eXBlIGNhbiBoYXZlLiAgICAgICAgICAgICAgKi8KKy8qICBNdXN0IGJlIGluaXRpYWxpemVkIGluIGluaXRfY2coKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworem1heCB0X21pbltNQVhfVFlQRSsxXTsKK3p1bWF4IHRfbWF4W01BWF9UWVBFKzFdOworenVtYXggdHVfbWF4W01BWF9UWVBFKzFdOworCisvKiAgTmFtZXMgb2YgYWxsIHJlZ2lzdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2NoYXIgKnJlZ25hbWVzW01BWFIrMV09eyJub3JlZyIsImEwIiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsImE2IiwiYTciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkMCIsImQxIiwiZDIiLCJkMyIsImQ0IiwiZDUiLCJkNiIsImQ3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmcDAiLCJmcDEiLCJmcDIiLCJmcDMiLCJmcDQiLCJmcDUiLCJmcDYiLCJmcDciLAorICAgICAgICAgICAgICAgICAgICAgICAgImQwL2QxIiwiZDIvZDMiLCJkNC9kNSIsImQ2L2Q3In07CisKK3N0YXRpYyBjaGFyICplbGZyZWduYW1lc1tNQVhSKzFdPXsibm9yZWciLCIlYTAiLCIlYTEiLCIlYTIiLCIlYTMiLCIlYTQiLCIlYTUiLCIlYTYiLCIlYTciLAorCQkJICAgIiVkMCIsIiVkMSIsIiVkMiIsIiVkMyIsIiVkNCIsIiVkNSIsIiVkNiIsIiVkNyIsCisJCQkgICAiJWZwMCIsIiVmcDEiLCIlZnAyIiwiJWZwMyIsIiVmcDQiLCIlZnA1IiwiJWZwNiIsIiVmcDciLAorCQkJICAgIiVkMC8lZDEiLCIlZDIvJWQzIiwiJWQ0LyVkNSIsIiVkNi8lZDcifTsKKworc3RhdGljIGNoYXIgKm1yZWduYW1lc1tNQVhSKzFdOworCisvKiAgVGhlIFNpemUgb2YgZWFjaCByZWdpc3RlciBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggcmVnc2l6ZVtNQVhSKzFdOworCisvKiAgVHlwZSB3aGljaCBjYW4gc3RvcmUgZWFjaCByZWdpc3Rlci4gKi8KK3R5cGUgKnJlZ3R5cGVbTUFYUisxXTsKKworLyogIHJlZ3NhW3JlZ10hPTAgaWYgYSBjZXJ0YWluIHJlZ2lzdGVyIGlzIGFsbG9jYXRlZCBhbmQgc2hvdWxkICovCisvKiAgbm90IGJlIHVzZWQgYnkgdGhlIGNvbXBpbGVyIHBhc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2ludCByZWdzYVtNQVhSKzFdPXswLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfTsKKworLyogIFNwZWNpZmllcyB3aGljaCByZWdpc3RlcnMgbWF5IGJlIHNjcmF0Y2hlZCBieSBmdW5jdGlvbnMuICAgICovCitpbnQgcmVnc2NyYXRjaFtNQVhSKzFdPXswLDEsMSwwLDAsMCwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLAorCQkJMSwwLDAsMH07CisKK2ludCByZWdfcHJpb1tNQVhSKzFdPXswLDQsNCwzLDMsMywzLDMsMCwyLDIsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDB9OworCit0cmVnX2hhbmRsZSBlbXB0eV9yZWdfaGFuZGxlPXswLDAsMH07CisKKy8qIE5hbWVzIG9mIHRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZSBhdHRyaWJ1dGVzLiAgICAgICAgICAgICAgICAqLworY2hhciAqZ19hdHRyX25hbWVbXT17Il9fZmFyIiwiX19uZWFyIiwiX19jaGlwIiwiX19zYXZlZHMiLAorICAgICAgICAgICAgICAgICAgICAgIl9faW50ZXJydXB0IiwiX19hbWlnYWludGVycnVwdCIsMH07CisjZGVmaW5lIEZBUiAxCisjZGVmaW5lIE5FQVIgMgorI2RlZmluZSBDSElQIDQKKyNkZWZpbmUgU0FWRURTIDgKKyNkZWZpbmUgSU5URVJSVVBUIDE2CisjZGVmaW5lIEFNSUlOVEVSUlVQVCAzMgorI2RlZmluZSBTVERBUkdTIDY0IC8qIG5vdCB1c2VkLCBqdXN0IGZvciBjb21wYXRpYmlsaXR5ICovCisKK2ludCBNSU5BRERJMlA9U0hPUlQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFNvbWUgcHJpdmF0ZSBkYXRhIGFuZCBmdW5jdGlvbnMuICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQ1BVICAgICAgICAgICAgIChnX2ZsYWdzX3ZhbFswXS5sKQorI2RlZmluZSBGUFUgICAgICAgICAgICAgKGdfZmxhZ3NfdmFsWzFdLmwpCisjZGVmaW5lIEQyU0NSQVRDSCAgICAgICAoZ19mbGFnc1syXSZVU0VERkxBRykKKyNkZWZpbmUgTk9BNCAgICAgICAgICAgIChnX2ZsYWdzWzNdJlVTRURGTEFHKQorI2RlZmluZSBTTUFMTENPREUgICAgICAgKGdfZmxhZ3NbNF0mVVNFREZMQUcpCisjZGVmaW5lIFNNQUxMREFUQSAgICAgICAoZ19mbGFnc1s1XSZVU0VERkxBRykKKyNkZWZpbmUgUFJPRklMRVIgICAgICAgIChnX2ZsYWdzWzZdJlVTRURGTEFHKQorI2RlZmluZSBDT05TVElOREFUQSAgICAgKGdfZmxhZ3NbN10mVVNFREZMQUcpCisjZGVmaW5lIFVTRUZSQU1FUE9JTlRFUiAoZ19mbGFnc1s4XSZVU0VERkxBRykKKyNkZWZpbmUgTk9QRUVQSE9MRSAgICAgIChnX2ZsYWdzWzldJlVTRURGTEFHKQorI2RlZmluZSBOT0RFTEFZRURQT1AgICAgKGdfZmxhZ3NbMTBdJlVTRURGTEFHKQorI2RlZmluZSBHQVMgICAgICAgICAgICAgKGdfZmxhZ3NbMTFdJlVTRURGTEFHKQorI2RlZmluZSBCUkFOQ0hPUFQgICAgICAgKGdfZmxhZ3NbMTJdJlVTRURGTEFHKQorI2RlZmluZSBOT0ZQUkVUVVJOICAgICAgKGdfZmxhZ3NbMTNdJlVTRURGTEFHKQorI2RlZmluZSBOT01SRUdSRVRVUk4gICAgKGdfZmxhZ3NbMTRdJlVTRURGTEFHKQorI2RlZmluZSBIVU5LREVCVUcgICAgICAgKGdfZmxhZ3NbMTVdJlVTRURGTEFHKQorI2RlZmluZSBOT0lOVFogICAgICAgICAgKGdfZmxhZ3NbMTZdJlVTRURGTEFHKQorI2RlZmluZSBPTERQRUVQSE9MRSAgICAgKGdfZmxhZ3NbMTddJlVTRURGTEFHKQorI2RlZmluZSBDT05TRVJWQVRJVkVfU1IgKGdfZmxhZ3NbMThdJlVTRURGTEFHKQorI2RlZmluZSBFTEYgICAgICAgICAgICAgKGdfZmxhZ3NbMTldJlVTRURGTEFHKQorI2RlZmluZSBVU0VfQ09NTU9OUyAgICAgKGdfZmxhZ3NbMjBdJlVTRURGTEFHKQorI2RlZmluZSBBMlNDUkFUQ0ggICAgICAgKGdfZmxhZ3NbMjFdJlVTRURGTEFHKQorI2RlZmluZSBPTERfU09GVEZMT0FUICAgKGdfZmxhZ3NbMjJdJlVTRURGTEFHKQorI2RlZmluZSBBTUlfU09GVEZMT0FUICAgKGdfZmxhZ3NbMjNdJlVTRURGTEFHKQorI2RlZmluZSBGQVNUQ0FMTCAgICAgICAgKGdfZmxhZ3NbMjRdJlVTRURGTEFHKQorI2RlZmluZSBGUDJTQ1JBVENIICAgICAgKGdfZmxhZ3NbMjVdJlVTRURGTEFHKQorI2RlZmluZSBSRVNFUlZFUkVHUyAgICAgKGdfZmxhZ3NbMjZdJlVTRURGTEFHKQorI2RlZmluZSBQSFhBU1MgICAgICAgICAgKGdfZmxhZ3NbMjddJlVTRURGTEFHKQorI2RlZmluZSBDTEVBTkZBVFRSICAgICAgKGdfZmxhZ3NbMjhdJlVTRURGTEFHKQorI2RlZmluZSBPTERMSUJDQUxMUyAgICAgKGdfZmxhZ3NbMjldJlVTRURGTEFHKQorI2RlZmluZSBWQkNDQ0FMTCAgICAgICAgKGdfZmxhZ3NbMzBdJlVTRURGTEFHKQorI2RlZmluZSBGTE9BVDY0ICAgICAgICAgKGdfZmxhZ3NbMzFdJlVTRURGTEFHKQorCisKK3N0YXRpYyBpbnQgdXNlX3NkOworCisjaWZkZWYgTTY4S18xNkJJVF9JTlQKK3N0YXRpYyBsb25nIG1hbGlnbltNQVhfVFlQRSsxXT0gIHsxLDEsMiwyLDIsMiwyLDIsMiwxLDIsMSwxLDEsMiwxfTsKK3N0YXRpYyBsb25nIG1zaXpldGFiW01BWF9UWVBFKzFdPXswLDEsMiwyLDQsOCw0LDgsOCwwLDQsMCwwLDAsNCwwfTsKKyNlbHNlCitzdGF0aWMgbG9uZyBtYWxpZ25bTUFYX1RZUEUrMV09ICB7MSwxLDIsMiwyLDIsMiwyLDIsMSwyLDEsMSwxLDIsMX07CitzdGF0aWMgbG9uZyBtc2l6ZXRhYltNQVhfVFlQRSsxXT17MCwxLDIsNCw0LDgsNCw4LDgsMCw0LDAsMCwwLDQsMH07CisjZW5kaWYKKworc3RhdGljIHR5cGUgbHR5cD17TE9OR30sbGFycmF5PXtBUlJBWSwmbHR5cH0sbGx0eXA9e0xMT05HfTsKKworc3RhdGljIGNoYXIgY3B1X21hY3JvWzE2XSxmcHVfbWFjcm9bMTZdLCptYXJyYXlbMTZdOworCitzdGF0aWMgY2hhciBwdXNocmVnbGlzdFsyMDBdLHBvcHJlZ2xpc3RbMjAwXTsKKworI2RlZmluZSBEQVRBIDAKKyNkZWZpbmUgQlNTIDEKKyNkZWZpbmUgQ09ERSAyCisjZGVmaW5lIFNQRUNJQUwgMworCitzdGF0aWMgY2hhciAqbGFicHJlZml4LCppZHByZWZpeDsKKworc3RhdGljIGludCByZWdsYWJlbCxmcmVnbGFiZWwsc2VjdGlvbj0tMTsKK2VudW0geworICBhMD0xLGExLGEyLGEzLGE0LGE1LGE2LGE3LAorICBkMCxkMSxkMixkMyxkNCxkNSxkNixkNywKKyAgZnAwLGZwMSxmcDIsZnAzLGZwNCxmcDUsZnA2LGZwNywKKyAgZDBkMSxkMmQzLGQ0ZDUsZDZkNworfTsKK3N0YXRpYyBpbnQgc3A9OCxmYnA9NixmcmFtZXNpemU7CitzdGF0aWMgaW50IHN0YWNrX3ZhbGlkOworc3RhdGljIGNoYXIgKmNvZGVuYW1lLCpic3NuYW1lLCpkYXRhbmFtZTsKK3N0YXRpYyBjaGFyICptX2Jzc25hbWUsKm1fZGF0YW5hbWU7CitzdGF0aWMgY2hhciAqcnByZWZpeDsKKworc3RhdGljIHZvaWQgZW1pdF9vYmooRklMRSAqLG9iaiAqLGludCk7CitzdGF0aWMgSUMgKmRvX3JlZnMoRklMRSAqLElDICopOworc3RhdGljIHZvaWQgcHIoRklMRSAqLElDICopOworc3RhdGljIGludCBnZXRfcmVnKEZJTEUgKixpbnQsSUMgKixpbnQpOworc3RhdGljIGxvbmcgcG9mMih6dW1heCk7CitzdGF0aWMgdm9pZCBmdW5jdGlvbl90b3AoRklMRSAqLFZhciAqLGxvbmcpOworc3RhdGljIHZvaWQgZnVuY3Rpb25fYm90dG9tKEZJTEUgKmYsVmFyICosbG9uZyk7CisKKyNkZWZpbmUgc2F2ZXJlZ3MoeCx5KSBzYXZlcmVnc3dmcCh4LHksMCkKK3N0YXRpYyB2b2lkIHNhdmVyZWdzd2ZwKEZJTEUgKixJQyAqLGludCk7CitzdGF0aWMgdm9pZCByZXN0b3JlcmVnc2EoRklMRSAqLElDICopOworc3RhdGljIHZvaWQgcmVzdG9yZXJlZ3NkKEZJTEUgKixJQyAqKTsKKworc3RhdGljIHZvaWQgYXNzaWduKEZJTEUgKixJQyAqLG9iaiAqLG9iaiAqLGludCxsb25nLGludCk7CitzdGF0aWMgaW50IGNvbXBhcmVfb2JqZWN0cyhvYmogKm8xLG9iaiAqbzIpOworCitzdGF0aWMgY2hhciB4X3NbXT17JzAnLCdiJywndycsJzMnLCdsJ307CisjaWZkZWYgTTY4S18xNkJJVF9JTlQKK3N0YXRpYyBjaGFyIHhfdFtdPXsnPycsJ2InLCd3JywndycsJ2wnLCdMJywncycsJ2QnLCdkJywndicsJ2wnLCdhJywncycsJ3UnLCdlJywnZid9OworI2Vsc2UKK3N0YXRpYyBjaGFyIHhfdFtdPXsnPycsJ2InLCd3JywnbCcsJ2wnLCdMJywncycsJ2QnLCdkJywndicsJ2wnLCdhJywncycsJ3UnLCdlJywnZid9OworI2VuZGlmCisKK3N0YXRpYyBjaGFyICpxdWlja1syXT17IiIsInEifTsKK3N0YXRpYyBjaGFyICpzdHJzaG9ydFsyXT17ImwiLCJ3In07CisKK3N0YXRpYyBjaGFyICp1YnJhbmNoW109eyJlcSIsIm5lIiwiY3MiLCJjYyIsImxzIiwiaGkifTsKKworc3RhdGljIGludCBwdXNoZWRyZWcsc3RvcmVkX2NjOyAvKiBwdXNoZWRyZWcmMjogYXJlZ3NhdmVkOyA0OiBkcmVnOyA4OiBmcmVnICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE2OiBkdXJjaCBSRVNUT1JFUkVHUyBnZXB1c2hlZCAgICAgICAgICAgKi8KK3N0YXRpYyBpbnQgY29tcHR5cDsKK3N0YXRpYyBpbnQgcHVzaGZsYWc7CitzdGF0aWMgaW50IGdldGE0Oworc3RhdGljIGludCBkc2NyYXRjaD0xLGFzY3JhdGNoPTEsZnNjcmF0Y2g9MTsKKworI2RlZmluZSBEMTZPRkYgMTAyNAorCitzdGF0aWMgaW50IG5ld29iaj0wOyAgIC8qICB1bSB6dSBlcmtlbm5lbiwgb2IgbmV1ZSBzZWN0aW9uIGVybGF1YnQgaXN0ICovCisKK3N0YXRpYyBpbnQgY2Y7CitzdGF0aWMgaW50IGFkZF9zdGRhcmdzOworCitzdGF0aWMgaW50IGlzcXVpY2trb25zdCh1bmlvbiBhdHlwcyAqLGludCksaXNxdWlja2tvbnN0Mih1bmlvbiBhdHlwcyAqLGludCkscmVnYXZhaWxhYmxlKGludCk7CitzdGF0aWMgdm9pZCBtb3ZlKEZJTEUgKixvYmogKixpbnQsb2JqICosaW50LGludCk7CitzdGF0aWMgdm9pZCBsb2FkZXh0KEZJTEUgKixpbnQsb2JqICosaW50KTsKK3N0YXRpYyB2b2lkIGFkZChGSUxFICosb2JqICosaW50LG9iaiAqLGludCxpbnQpOworc3RhdGljIHZvaWQgc3ViKEZJTEUgKixvYmogKixpbnQsb2JqICosaW50LGludCk7CitzdGF0aWMgdm9pZCBtdWx0KEZJTEUgKixvYmogKixpbnQsb2JqICosaW50LGludCxpbnQsSUMgKik7CisKK2V4dGVybiBpbnQgc3RhdGljX2NzZTsKKworc3RhdGljIHZvaWQgc2NyYXRjaF9tb2RpZmllZCh2b2lkKQoreworICBCU0VUKHJlZ3NfbW9kaWZpZWQsYTApOworICBCU0VUKHJlZ3NfbW9kaWZpZWQsYTEpOworICBCU0VUKHJlZ3NfbW9kaWZpZWQsZDApOworICBCU0VUKHJlZ3NfbW9kaWZpZWQsZDEpOworICBpZihGUFU+NjgwMDApeworICAgIEJTRVQocmVnc19tb2RpZmllZCxmcDApOworICAgIEJTRVQocmVnc19tb2RpZmllZCxmcDEpOworICB9CisgIGlmKEQyU0NSQVRDSCkgQlNFVChyZWdzX21vZGlmaWVkLGQyKTsKKyAgaWYoQTJTQ1JBVENIKSBCU0VUKHJlZ3NfbW9kaWZpZWQsYTIpOworICBpZihGUDJTQ1JBVENIKSBCU0VUKHJlZ3NfbW9kaWZpZWQsZnAyKTsKKworfQorCitzdGF0aWMgbG9uZyBwb2YyKHp1bWF4IHgpCisvKiAgWWllbGRzIGxvZzIoeCkrMSBvZGVyIDAuICovCit7CisgICAgenVtYXggcDtpbnQgbG49MTsKKyAgICBwPXVsMnp1bSgxVUwpOworICAgIHdoaWxlKGxuPD0zMiYmenVtbGVxKHAseCkpeworICAgICAgICBpZih6dW1lcXRvKHgscCkpIHJldHVybiBsbjsKKyAgICAgICAgbG4rKztwPXp1bWFkZChwLHApOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBpc3JlZyh4KSAoKHAtPnguZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRykKKyNkZWZpbmUgaXNjb25zdCh4KSAoKHAtPnguZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpCisKKyNpZmRlZiBNNjhLXzE2QklUX0lOVAorI2RlZmluZSBJU0hXT1JEKHgpICgoeCZOUSk8PUlOVCkKKyNlbHNlCisjZGVmaW5lIElTSFdPUkQoeCkgKCh4Jk5RKTxJTlQpCisjZW5kaWYKKworI2RlZmluZSBQRUEgLTEKKyNkZWZpbmUgTEVBIC0yCisKKyNkZWZpbmUgRlVOQ1BSRUZJWCh0KSAoKHN0ZGFyZ3ModCkmJnJwYXJtdHlwZSE9UEFSTVZCQ0MpP2lkcHJlZml4OihycGFybXR5cGU9PVBBUk1WQkNDPyJAJCI6IkAiKSkKKworc3RhdGljIHZvaWQgZW1pdF9sd29yZChGSUxFICosb2JqICopOworc3RhdGljIHZvaWQgZW1pdF9od29yZChGSUxFICosb2JqICopOworc3RhdGljIGludCBhZGRyZXNzaW5nKElDICopOworc3RhdGljIGxvbmcgbm90cG9wcGVkLGRvbnRwb3Asc3RhY2tvZmZzZXQsbG9mZixtYXhwdXNoZWQsc3RhY2s7CitzdGF0aWMgaW50IG9mZmxhYmVsLHJlZ29mZnNldDsKKy8qICBGb3Iga2VlcGluZyB0cmFjayBvZiBjb25kaXRpb24gY29kZXMuICAgKi8KK3N0YXRpYyBvYmogKmNjX3NldCwqY2Nfc2V0X3RzdDsKK3N0YXRpYyBpbnQgY2NfdHlwLGNjX3R5cF90c3Q7CitzdGF0aWMgaW50IG1pc3Npbmcsc2F2ZWRlbWl0LHNhdmVkYWxsb2M7CitzdGF0aWMgaW50IGxhc3RwdXNoLHVub3JkZXJlZHB1c2gscHVzaG9mZltNQVhSKzFdOworCitzdGF0aWMgaW50IHZzZWMoRklMRSAqZixWYXIgKnYpCit7CisgIGNoYXIgKnR5cGU9ImJzcyI7CisgIGlmKCFzZWNfcGVyX29ianx8KHYtPnRhdHRyJkNISVApKSByZXR1cm4gMDsKKyAgaWYoSVNGVU5DKHYtPnZ0eXAtPmZsYWdzKXx8KHYtPmNsaXN0JiZpc19jb25zdCh2LT52dHlwKSkpIHR5cGU9ImNvZGUiOyBlbHNlIGlmKHYtPmNsaXN0KSB0eXBlPSJkYXRhIjsKKyAgZW1pdChmLCJcdCVzc2VjdGlvblx0XCJET05UTUVSR0VfJXMuJXMuJWxkXCIlcyVzXG4iLEdBUz8iLiI6IiIsdHlwZSx2LT5pZGVudGlmaWVyLHYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQy8qJiYhSVNGVU5DKHYtPnZ0eXAtPmZsYWdzKSovPyhsb25nKXptMmwodi0+b2Zmc2V0KTowTCxHQVM/IiI6IiwiLEdBUz8iIjp0eXBlKTsKKyAgaWYoZikgc2VjdGlvbj1TUEVDSUFMOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzcGVjaWFsX3NlY3Rpb24oRklMRSAqZixWYXIgKnYpCit7CisgIGNoYXIgKnNlYzsKKyAgaWYoIXYtPnZhdHRyKSByZXR1cm4gdnNlYyhmLHYpOzsKKyAgc2VjPXN0cnN0cih2LT52YXR0ciwic2VjdGlvbigiKTsKKyAgaWYoIXNlYykgcmV0dXJuIHZzZWMoZix2KTs7CisgIHNlYys9c3RybGVuKCJzZWN0aW9uKCIpOworICBpZihHQVMpCisgICAgZW1pdChmLCJcdC5zZWN0aW9uXHQiKTsKKyAgZWxzZQorICAgIGVtaXQoZiwiXHRzZWN0aW9uXHQiKTsKKyAgd2hpbGUoKnNlYyYmKnNlYyE9JyknKSBlbWl0X2NoYXIoZiwqc2VjKyspOworICBlbWl0KGYsIlxuIik7CisgIGlmKGYpIHNlY3Rpb249U1BFQ0lBTDsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBlbnVteworICBQQVJNU1RELAorICBQQVJNVkJDQywKKyAgUEFSTVNBUworfSBycGFybXR5cGU7CisKK3N0YXRpYyBpbnQgc3RkYXJncyh0eXBlICp0KQoreworICB0eXBlICpwOworCisgIGlmKFZCQ0NDQUxMKSBycGFybXR5cGU9UEFSTVZCQ0M7CisgIGVsc2UgaWYoRkFTVENBTEwpIHJwYXJtdHlwZT1QQVJNU0FTOworICBlbHNlIHJwYXJtdHlwZT1QQVJNU1REOworCisgIGZvcihwPXQtPm5leHQ7cDtwPXAtPm5leHQpeworICAgIGlmKHAtPmF0dHImJnN0cnN0cihwLT5hdHRyLCJfX3N0ZGFyZ3MiKSkge3JwYXJtdHlwZT1QQVJNU1REO3JldHVybiAxO30KKyAgICBpZihwLT5hdHRyJiZzdHJzdHIocC0+YXR0ciwiX192YmNjYXJncyIpKSB7cnBhcm10eXBlPVBBUk1WQkNDO3JldHVybiAwO30KKyAgICBpZihwLT5hdHRyJiZzdHJzdHIocC0+YXR0ciwiX19yZWdhcmdzIikpIHtycGFybXR5cGU9UEFSTVNBUztyZXR1cm4gMDt9CisgICAgaWYoQ0xFQU5GQVRUUikgYnJlYWs7CisgIH0KKyAgaWYoKCFGQVNUQ0FMTCYmIVZCQ0NDQUxMKXx8YWRkX3N0ZGFyZ3MpIHJldHVybiAxOworICBpZih0LT5mbGFncz09RlVOS1QmJmlzX3ZhcmFyZ3ModCkpIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworLyogcHVzaGVkIG9uIHRoZSBzdGFjayBieSBhIGNhbGxlZSwgbm8gcG9wIG5lZWRlZCAqLworc3RhdGljIHZvaWQgY2FsbGVlX3B1c2gobG9uZyBsKQoreworICBpZihsLXN0YWNrb2Zmc2V0PnN0YWNrKQorICAgIHN0YWNrPWwtc3RhY2tvZmZzZXQ7Cit9CitzdGF0aWMgdm9pZCBwdXNoKGxvbmcgbCkKK3sKKyAgc3RhY2tvZmZzZXQtPWw7CisgIGlmKHN0YWNrb2Zmc2V0PG1heHB1c2hlZCkgCisgICAgbWF4cHVzaGVkPXN0YWNrb2Zmc2V0OworICBpZigtbWF4cHVzaGVkPnN0YWNrKQorICAgIHN0YWNrPS1tYXhwdXNoZWQ7Cit9CitzdGF0aWMgdm9pZCBwb3AobG9uZyBsKQoreworICBzdGFja29mZnNldCs9bDsKK30KKwordm9pZCB0aXRsZShGSUxFICpmKQoreworICBzdGF0aWMgaW50IGRvbmU7CisgIGV4dGVybiBjaGFyICppbm5hbWU7IC8qZ3JtcGYqLworICBpZighZG9uZSYmZil7CisgICAgZG9uZT0xOworICAgIGlmKEdBUykKKyAgICAgIGVtaXQoZiwiXHQuZmlsZVx0XCIlc1wiXG4iLGlubmFtZSk7CisgICAgZWxzZQorICAgICAgZW1pdChmLCJcdGlkbnRcdFwiJXNcIlxuIixpbm5hbWUpOworICB9Cit9ICAgICAgCisKK3N0YXRpYyBpbnQgaXNfYXJnX3JlZyhJQyAqcCxpbnQgcikKK3sKKyAgaW50IGksdTtJQyAqYTsKKyAgZm9yKGk9MDtpPHAtPmFyZ19jbnQ7aSsrKXsKKyAgICBhPXAtPmFyZ19saXN0W2ldOworICAgIHU9MDsKKyAgICBpZigoYS0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKQorICAgICAgdT1hLT56LnJlZzsKKyAgICBlbHNlIGlmKChhLT56LmZsYWdzJlZBUikmJmEtPnoudi0+cmVnKQorICAgICAgdT1hLT56LnYtPnJlZzsKKyAgICBpZih1KXsKKyAgICAgIGlmKHI9PXV8fChyZWdfcGFpcih1LCZycCkmJnI9PXJwLnIxfHxyPT1ycC5yMikpeworCXJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbV91c2VzX3JlZyhJQyAqcCxpbnQgaSkKK3sKKyAgaWYoKHAtPnExLmFtJiYoKHAtPnExLmFtLT5kcmVnJjEyNyk9PWl8fHAtPnExLmFtLT5iYXNlcmVnPT1pKSkKKyAgICAgfHwocC0+cTIuYW0mJigocC0+cTIuYW0tPmRyZWcmMTI3KT09aXx8cC0+cTIuYW0tPmJhc2VyZWc9PWkpKQorICAgICB8fChwLT56LmFtJiYoKHAtPnouYW0tPmRyZWcmMTI3KT09aXx8cC0+ei5hbS0+YmFzZXJlZz09aSkpKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworLyogY2hlY2sgaWYgcmVnaXN0ZXIgY2FuIGJlIHNjcmF0Y2hlZCAqLworc3RhdGljIGludCBzY3JhdGNocmVnKGludCByLElDICpwKQoreworICBpbnQgYzsKKyAgd2hpbGUoMSl7CisgICAgcD1wLT5uZXh0OworICAgIGlmKCFwfHwoKGM9cC0+Y29kZSk9PUZSRUVSRUcmJnAtPnExLnJlZz09cikpIHJldHVybiAxOworICAgIGlmKGM9PUNBTEx8fChjPj1CRVEmJmM8PUJSQSkpIHJldHVybiAwOworICAgIGlmKChwLT5xMS5mbGFncyZSRUcpJiZwLT5xMS5yZWc9PXIpIHJldHVybiAwOworICAgIGlmKChwLT5xMi5mbGFncyZSRUcpJiZwLT5xMi5yZWc9PXIpIHJldHVybiAwOworICAgIGlmKChwLT56LmZsYWdzJlJFRykmJnAtPnoucmVnPT1yKSByZXR1cm4gMDsKKyAgICBpZihhbV91c2VzX3JlZyhwLHIpKSByZXR1cm4gMDsKKyAgfQorfQorCisKKworc3RhdGljIGludCBwZ2V0X3JlZyhGSUxFICpmLGludCBmbGFnLElDICpwLGludCB1c2VxMSkKK3sKKyAgaW50IGk7CisKKyAgZmxhZz0xK2ZsYWcqODsKKworICBpZih1c2VxMSl7CisgICAgaWYoaXNyZWcocTEpJiZwLT5xMS5yZWc+PWZsYWcmJnAtPnExLnJlZzw9ZmxhZys3JiZzY3JhdGNocmVnKHAtPnExLnJlZyxwKSkKKyAgICAgIHJldHVybiBwLT5xMS5yZWc7CisgIH0KKworICBmb3IoaT1mbGFnO2k8ZmxhZys4O2krKyl7CisgICAgaWYocmVnc1tpXT09MSYmKCFwfHwoaSE9cC0+cTEucmVnJiZpIT1wLT5xMi5yZWcmJmkhPXAtPnoucmVnKSkpeworICAgICAgaWYocCl7CisJaWYoYW1fdXNlc19yZWcocCxpKSkKKwkgIGNvbnRpbnVlOworCWlmKHAtPmNvZGU9PUNBTEwmJmlzX2FyZ19yZWcocCxpKSkKKwkgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgcmVnc1tpXXw9ODsKKyAgICAgIHB1c2hmbGFnPTE7CisgICAgICBlbWl0KGYsIlx0bW92ZS5sXHQlcywlbGQoJXMpXG4iLG1yZWduYW1lc1tpXSwtc3RhY2tvZmZzZXQsbXJlZ25hbWVzW3NwXSk7CisgICAgICBpZihpPGQwKSAKKwlwdXNoZWRyZWd8PTI7CisgICAgICBlbHNlIGlmIChpPGZwMCkKKwlwdXNoZWRyZWd8PTQ7CisgICAgICBlbHNlCisJcHVzaGVkcmVnfD04OworICAgICAgQlNFVChyZWdzX21vZGlmaWVkLGkpOworICAgICAgcmV0dXJuIGk7CisgICAgfQorICB9CisgIGllcnJvcigwKTsKK30KKworc3RhdGljIGludCBnZXRfcmVnKEZJTEUgKmYsaW50IGZsYWcsSUMgKnAsaW50IHVzZXExKQorLyogIEdldHMgYSByZWdpc3RlcjogZmxhZz0wPWFyZWcsIDE9ZHJlZywgMj1mcHJlZyAgICAgICAgICAgKi8KK3sKKyAgaW50IGk7CisKKyAgZmxhZz0xK2ZsYWcqODsKKworICBpZih1c2VxMSl7CisgICAgaWYoaXNyZWcocTEpJiZwLT5xMS5yZWc+PWZsYWcmJnAtPnExLnJlZzw9ZmxhZys3JiZzY3JhdGNocmVnKHAtPnExLnJlZyxwKSkKKyAgICAgIHJldHVybiBwLT5xMS5yZWc7CisgIH0KKworICBmb3IoaT1mbGFnO2k8ZmxhZys4O2krKyl7CisgICAgaWYocmVnc1tpXT09MCl7CisgICAgICBpZihwKXsKKwlpZihhbV91c2VzX3JlZyhwLGkpKQorCSAgY29udGludWU7CisJaWYocC0+Y29kZT09Q0FMTCYmaXNfYXJnX3JlZyhwLGkpKQorCSAgY29udGludWU7CisgICAgICB9CisgICAgICByZWdzW2ldPTI7cHVzaGVkcmVnfD0xOworICAgICAgaWYoIXJlZ3VzZWRbaV0mJiFyZWdzY3JhdGNoW2ldKXtyZWd1c2VkW2ldPTE7IH0KKyAgICAgIEJTRVQocmVnc19tb2RpZmllZCxpKTsKKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgfQorICBmb3IoaT1mbGFnO2k8ZmxhZys4O2krKyl7CisgICAgc3RhdGljIHJwYWlyIHJwOworICAgIGlmKHJlZ3NbaV09PTEpeworICAgICAgaWYocCl7CisJaWYoKHAtPnExLmFtJiYoKHAtPnExLmFtLT5kcmVnJjEyNyk9PWl8fHAtPnExLmFtLT5iYXNlcmVnPT1pKSkKKwkgICB8fChwLT5xMi5hbSYmKChwLT5xMi5hbS0+ZHJlZyYxMjcpPT1pfHxwLT5xMi5hbS0+YmFzZXJlZz09aSkpCisJICAgfHwocC0+ei5hbSYmKChwLT56LmFtLT5kcmVnJjEyNyk9PWl8fHAtPnouYW0tPmJhc2VyZWc9PWkpKSl7CisJICBjb250aW51ZTsKKwl9CisJaWYocC0+Y29kZT09Q0FMTCYmaXNfYXJnX3JlZyhwLGkpKQorCSAgY29udGludWU7CisJaWYocC0+cTEuZmxhZ3MmUkVHKXsKKwkgIGlmKHAtPnExLnJlZz09aSkgY29udGludWU7CisJICBpZihyZWdfcGFpcihwLT5xMS5yZWcsJnJwKSYmKHJwLnIxPT1pfHxycC5yMj09aSkpIGNvbnRpbnVlOworCX0KKwlpZihwLT5xMi5mbGFncyZSRUcpeworCSAgaWYocC0+cTIucmVnPT1pKSBjb250aW51ZTsKKwkgIGlmKHJlZ19wYWlyKHAtPnEyLnJlZywmcnApJiYocnAucjE9PWl8fHJwLnIyPT1pKSkgY29udGludWU7CisJfQorCWlmKHAtPnouZmxhZ3MmUkVHKXsKKwkgIGlmKHAtPnoucmVnPT1pKSBjb250aW51ZTsKKwkgIGlmKHJlZ19wYWlyKHAtPnoucmVnLCZycCkmJihycC5yMT09aXx8cnAucjI9PWkpKSBjb250aW51ZTsKKwl9CisgICAgICB9CisgICAgICByZWdzW2ldKz00OworICAgICAgaWYoaTxsYXN0cHVzaCl7CisJdW5vcmRlcmVkcHVzaD0xOworCS8qcHJpbnRmKCIlcyAlc1xuIixtcmVnbmFtZXNbbGFzdHB1c2hdLG1yZWduYW1lc1tpXSk7Ki8KKyAgICAgIH0KKyAgICAgIGlmKGk8ZnAwKXsKKwllbWl0KGYsIlx0bW92ZS5sXHQlcywtKCVzKVxuIixtcmVnbmFtZXNbaV0sbXJlZ25hbWVzW3NwXSk7CisJcHVzaCg0KTsKKwlwdXNob2ZmW2ldPXB1c2hvZmZbbGFzdHB1c2hdKzQ7CisgICAgICB9ZWxzZXsKKwllbWl0KGYsIlx0Zm1vdmUueFx0JXMsLSglcylcbiIsbXJlZ25hbWVzW2ldLG1yZWduYW1lc1tzcF0pOworCXB1c2goMTIpOworCXB1c2hvZmZbaV09cHVzaG9mZltsYXN0cHVzaF0rMTI7CisgICAgICB9CisgICAgICBsYXN0cHVzaD1pOworICAgICAgaWYoaTxkMCkKKwlwdXNoZWRyZWd8PTI7CisgICAgICBlbHNlIGlmKGk8ZnAwKQorCXB1c2hlZHJlZ3w9NDsKKyAgICAgIGVsc2UKKwlwdXNoZWRyZWd8PTg7CisgICAgICBCU0VUKHJlZ3NfbW9kaWZpZWQsaSk7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgIH0KKyAgaWVycm9yKDApOworfQorc3RhdGljIGludCBpc3F1aWNra29uc3QodW5pb24gYXR5cHMgKnAsaW50IHQpCisvKiAgUmV0dXJucyAxIGlmIGNvbnN0YW50IGlzIGJldHdlZW4gLTEyOCBhbmQgMTI3LiAgICovCit7CisgICAgem1heCB6bTt6dW1heCB6dW07CisgICAgaWYoSVNGTE9BVCh0KSkgcmV0dXJuIDA7CisgICAgZXZhbF9jb25zdChwLHQpOworICAgIGlmKHQmVU5TSUdORUQpeworICAgICAgICB6dW09dWwyenVtKDEyN1VMKTsKKyAgICAgICAgcmV0dXJuIHp1bWxlcSh2dW1heCx6dW0pOworICAgIH1lbHNleworICAgICAgICB6bT1sMnptKC0xMjlMKTsKKyAgICAgICAgaWYoem1sZXEodm1heCx6bSkpIHJldHVybiAwOworICAgICAgICB6bT1sMnptKDEyN0wpOworICAgICAgICByZXR1cm4gem1sZXEodm1heCx6bSk7CisgICAgfQorfQorc3RhdGljIGludCBpc3F1aWNra29uc3QyKHVuaW9uIGF0eXBzICpwLGludCB0KQorLyogIFJldHVybnMgMSBpZiBjb25zdGFudCBpcyBiZXR3ZWVuIDEgYW5kIDguICAgKi8KK3sKKyAgICB6bWF4IHptO3p1bWF4IHp1bTsKKyAgICBpZihJU0ZMT0FUKHQpKSByZXR1cm4gMDsKKyAgICBldmFsX2NvbnN0KHAsdCk7CisgICAgaWYodCZVTlNJR05FRCl7CisgICAgICAgIGlmKHp1bWVxdG8odWwyenVtKDBVTCksdnVtYXgpKSByZXR1cm4gMDsKKyAgICAgICAgenVtPXVsMnp1bSg4VUwpOworICAgICAgICByZXR1cm4genVtbGVxKHZ1bWF4LHp1bSk7CisgICAgfWVsc2V7CisgICAgICAgIGlmKHptZXF0byhsMnptKDBMKSx2bWF4KSkgcmV0dXJuIDA7CisgICAgICAgIHptPWwyem0oLTFMKTsKKyAgICAgICAgaWYoem1sZXEodm1heCx6bSkpIHJldHVybiAwOworICAgICAgICB6bT1sMnptKDhMKTsKKyAgICAgICAgcmV0dXJuIHptbGVxKHZtYXgsem0pOworICAgIH0KK30KKworc3RhdGljIGludCBwcmVnYXZhaWxhYmxlKElDICpwLGludCBhcnQpCisvKiAgUmV0dXJucyB0cnVlIGlmIG1hdGNoaW5nIHJlZ2lzdGVyIGlzIGF2YWlsYWJsZS4gSGFuZGxlcyBhcmdsaXN0Ki8KK3sKKyAgICBpbnQgaTsKKyAgICBhcnQ9MSthcnQqODsKKyAgICBmb3IoaT1hcnQrMTtpPGFydCs4O2krKykKKyAgICAgIGlmKHJlZ3NbaV09PTAmJiFpc19hcmdfcmVnKHAsaSkpIHJldHVybigxKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWdhdmFpbGFibGUoaW50IGFydCkKKy8qICBSZXR1cm5zIHRydWUgaWYgbWF0Y2hpbmcgcmVnaXN0ZXIgaXMgYXZhaWxhYmxlLiAgICAgKi8KK3sKKyAgICBpbnQgaTsKKyAgICBhcnQ9MSthcnQqODsKKyAgICBmb3IoaT1hcnQrMTtpPGFydCs4O2krKykKKyAgICAgICAgaWYocmVnc1tpXT09MCkgcmV0dXJuKDEpOworICAgIHJldHVybiAwOworfQorc3RhdGljIGludCBjb21wYXJlX29iamVjdHMob2JqICpvMSxvYmogKm8yKQorLyogIFRlc3RzIGlmIHR3byBvYmplY3RzIGFyZSBlcXVhbC4gICAgICovCit7CisgIGlmKChvMS0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmKG8yLT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZvMS0+cmVnPT1vMi0+cmVnKQorICAgIHJldHVybiAxOworICBpZigobzEtPmZsYWdzJihLT05TVHxWQVJ8RFJFRk9CSnxSRUd8VkFSQURSKSk9PShvMi0+ZmxhZ3MmKEtPTlNUfFZBUnxEUkVGT0JKfFJFR3xWQVJBRFIpKSYmbzEtPmFtPT1vMi0+YW0peworICAgIGlmKCEobzEtPmZsYWdzJlZBUil8fChvMS0+dj09bzItPnYmJnptZXF0byhvMS0+dmFsLnZtYXgsbzItPnZhbC52bWF4KSkpeworICAgICAgaWYoIShvMS0+ZmxhZ3MmUkVHKXx8bzEtPnJlZz09bzItPnJlZyl7CisJcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorc3RhdGljIElDICpkb19yZWZzKEZJTEUgKmYsSUMgKnApCisvKiAgTG9hZHMgRFJFRk9CSnMgaW50byBhZGRyZXNzIHJlZ2lzdGVycywgaWYgbmVjZXNzYXJ5LiAgICAqLworLyogIFNtYWxsIGNvbnN0YW50cyBhcmUgbG9hZGVkIGludG8gZGF0YSByZWdpc3RlcnMgaWYgdGhpcyAgKi8KKy8qICBpbXByb3ZlcyBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgICAgaW50IHJlZyxjPXAtPmNvZGUsdD1wLT50eXBmLGVxdWFsOworICAgIGlmKChwLT5xMS5mbGFncyZEUkVGT0JKKSYmIShwLT5xMS5mbGFncyZLT05TVCkmJighKHAtPnExLmZsYWdzJlJFRyl8fHAtPnExLnJlZzwxfHxwLT5xMS5yZWc+OCkpeworICAgICAgICBlcXVhbD0wOworICAgICAgICBpZihjb21wYXJlX29iamVjdHMoJnAtPnExLCZwLT5xMikpIGVxdWFsfD0xOworICAgICAgICBpZihjb21wYXJlX29iamVjdHMoJnAtPnExLCZwLT56KSkgZXF1YWx8PTI7CisJaWYocC0+Y29kZT09UFVTSCYmIXByZWdhdmFpbGFibGUocCwwKSkKKwkgIHJlZz1wZ2V0X3JlZyhmLDAscCwwKTsKKwllbHNlIGlmKHAtPmNvZGU9PUNBTEwmJiFwcmVnYXZhaWxhYmxlKHAsMCkpCisJICByZXR1cm4gcDsKKwllbHNlCisJICByZWc9Z2V0X3JlZyhmLDAscCwwKTsKKyAgICAgICAgcC0+cTEuZmxhZ3MmPX5EUkVGT0JKOworICAgICAgICBlbWl0KGYsIlx0bW92ZS5sXHQiKTtlbWl0X29iaihmLCZwLT5xMSxQT0lOVEVSKTsKKyAgICAgICAgcC0+cTEuZmxhZ3M9UkVHfERSRUZPQko7CisgICAgICAgIHAtPnExLnJlZz1yZWc7CisgICAgICAgIGVtaXQoZiwiLCVzXG4iLG1yZWduYW1lc1twLT5xMS5yZWddKTsKKyAgICAgICAgaWYoZXF1YWwmMSkgcC0+cTI9cC0+cTE7CisgICAgICAgIGlmKGVxdWFsJjIpIHAtPno9cC0+cTE7CisJaWYoYz09VEVTVCkgY2Nfc2V0X3RzdD1jY19zZXQ9MDsKKyAgICB9CisgICAgaWYoKHAtPnEyLmZsYWdzJkRSRUZPQkopJiYhKHAtPnEyLmZsYWdzJktPTlNUKSYmKCEocC0+cTIuZmxhZ3MmUkVHKXx8cC0+cTIucmVnPDF8fHAtPnEyLnJlZz44KSl7CisgICAgICAgIGlmKGNvbXBhcmVfb2JqZWN0cygmcC0+cTIsJnAtPnopKSBlcXVhbD0xOyBlbHNlIGVxdWFsPTA7CisgICAgICAgIHJlZz1nZXRfcmVnKGYsMCxwLDApOworICAgICAgICBwLT5xMi5mbGFncyY9fkRSRUZPQko7CisgICAgICAgIGVtaXQoZiwiXHRtb3ZlLmxcdCIpO2VtaXRfb2JqKGYsJnAtPnEyLFBPSU5URVIpOworICAgICAgICBwLT5xMi5mbGFncz1SRUd8RFJFRk9CSjsKKyAgICAgICAgcC0+cTIucmVnPXJlZzsKKyAgICAgICAgZW1pdChmLCIsJXNcbiIsbXJlZ25hbWVzW3AtPnEyLnJlZ10pOworICAgICAgICBpZihlcXVhbCkgcC0+ej1wLT5xMjsKKyAgICB9CisgICAgaWYoKHAtPnouZmxhZ3MmRFJFRk9CSikmJiEocC0+ei5mbGFncyZLT05TVCkmJighKHAtPnouZmxhZ3MmUkVHKXx8cC0+ei5yZWc8MXx8cC0+ei5yZWc+OCkpeworICAgICAgcmVnPWdldF9yZWcoZiwwLHAsMCk7CisgICAgICAgIHAtPnouZmxhZ3MmPX5EUkVGT0JKOworICAgICAgICBlbWl0KGYsIlx0bW92ZS5sXHQiKTtlbWl0X29iaihmLCZwLT56LFBPSU5URVIpOworICAgICAgICBwLT56LmZsYWdzPVJFR3xEUkVGT0JKOworICAgICAgICBwLT56LnJlZz1yZWc7CisgICAgICAgIGVtaXQoZiwiLCVzXG4iLG1yZWduYW1lc1twLT56LnJlZ10pOworICAgIH0KKyAgICBpZihDUFUhPTY4MDQwKXsKKyAgICAvKiAgRG9uJ3QgZG8gaXQgb24gMDQwIGJlY2F1c2UgaXQncyBzbG93ZXIuICovCisgICAgICAgIGlmKHhfdFt0Jk5RXT09J2wnJiYodCZOUSkhPUZMT0FUJiYoYyE9QVNTSUdOfHwhaXNyZWcoeikpJiYKKyAgICAgICAgICAgYyE9TVVMVCYmYyE9RElWJiZjIT1NT0QmJmMhPUxTSElGVCYmYyE9UlNISUZUJiZjIT1TRVRSRVRVUk4mJmMhPVBVU0gmJmMhPUFEREkyUCYmYyE9U1VCSUZQJiYKKyAgICAgICAgICAgKCEocC0+ei5mbGFncyZSRUcpfHxwLT56LnJlZzxkMHx8cC0+ei5yZWc+ZDcpKXsKKyAgICAgICAgICAgIC8qICBDb25zdGFudHMgaW50byByZWdpc3RlcnMuICAgICovCisgICAgICAgICAgICBpZihpc2NvbnN0KHExKSYmaXNxdWlja2tvbnN0KCZwLT5xMS52YWwsdCkmJigoYyE9QUREJiZjIT1TVUImJmMhPUFEREkyUCYmYyE9U1VCSUZQKXx8IWlzcXVpY2trb25zdDIoJnAtPnExLnZhbCx0KSkpeworICAgICAgICAgICAgICAgIGV2YWxfY29uc3QoJnAtPnExLnZhbCx0KTsKKyAgICAgICAgICAgICAgICBpZigoIXpsZGVxdG8oZDJ6bGQoMC4wKSx2bGRvdWJsZSl8fCF6bWVxdG8obDJ6bSgwTCksdm1heCl8fCF6dW1lcXRvKHVsMnp1bSgwVUwpLHZ1bWF4KSkmJnJlZ2F2YWlsYWJsZSgxKSl7CisJCSAgcmVnPWdldF9yZWcoZiwxLHAsMCk7CisJCSAgbW92ZShmLCZwLT5xMSwwLDAscmVnLHQpOworCQkgIHAtPnExLmZsYWdzPVJFRztwLT5xMS5yZWc9cmVnOworCQkgIHAtPnExLnZhbC52bWF4PWwyem0oMEwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGlzY29uc3QocTIpJiZpc3F1aWNra29uc3QoJnAtPnEyLnZhbCx0KSYmKChjIT1BREQmJmMhPVNVQiYmYyE9QURESTJQJiZjIT1TVUJJRlApfHwhaXNxdWlja2tvbnN0MigmcC0+cTIudmFsLHQpKSl7CisgICAgICAgICAgICAgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHQpOworICAgICAgICAgICAgICAgIGlmKCghemxkZXF0byhkMnpsZCgwLjApLHZsZG91YmxlKXx8IXptZXF0byhsMnptKDBMKSx2bWF4KXx8IXp1bWVxdG8odWwyenVtKDBVTCksdnVtYXgpKSYmcmVnYXZhaWxhYmxlKDEpKXsKKwkJICByZWc9Z2V0X3JlZyhmLDEscCwwKTsKKwkJICBtb3ZlKGYsJnAtPnEyLDAsMCxyZWcsdCk7CisJCSAgcC0+cTIuZmxhZ3M9UkVHO3AtPnEyLnJlZz1yZWc7CisJCSAgcC0+cTIudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwOworfQorc3RhdGljIHZvaWQgcHIoRklMRSAqZixJQyAqcCkKKy8qICBSZWxlYXNlIHJlZ2lzdGVycyBhbmQgcG9wIHRoZW0gZnJvbSBzdGFjayBpZiBuZWNlc3NhcnkuICovCit7CisgIGludCBpLHNpemU9MDtjaGFyICpzPSIiOworICAgIC8qICBUbyBrZWVwIHRyYWNrIG9mIGNvbmRpdGlvbiBjb2Rlcy4gICAqLworI2lmIDAKKyAgaWYoKHB1c2hlZHJlZyYxMikmJihwLT5jb2RlPT1URVNUfHxwLT5jb2RlPT1DT01QQVJFKSl7CisgICAgY2hhciAqZnA7SUMgKmJyYW5jaDsKKyAgICBpZihGUFU+NjgwMDAmJklTRkxPQVQocC0+dHlwZikpIGZwPSJmIjsgZWxzZSBmcD0iIjsKKyAgICBicmFuY2g9cDsKKyAgICB3aGlsZShicmFuY2gtPmNvZGU8QkVRfHxicmFuY2gtPmNvZGU+PUJSQSkgYnJhbmNoPWJyYW5jaC0+bmV4dDsKKyAgICAvKkZJWE1FKi8KKyAgICBpZigocC0+dHlwZiZVTlNJR05FRCl8fElTUE9JTlRFUihwLT50eXBmKSl7CisgICAgICBlbWl0KGYsIlx0cyVzXHQtMiglcylcbiIsdWJyYW5jaFticmFuY2gtPmNvZGUtQkVRXSxtcmVnbmFtZXNbc3BdKTsKKyAgICB9ZWxzZXsKKyAgICAgIGVtaXQoZiwiXHQlc3Mlc1x0LTIoJXMpXG4iLGZwLGVuYW1lW2JyYW5jaC0+Y29kZV0rMSxtcmVnbmFtZXNbc3BdKTsKKyAgICB9CisgICAgc3RvcmVkX2NjPTE7CisgIH0KKyNlbmRpZgorICBpZigocHVzaGVkcmVnJjEyKSYmKHAtPmNvZGU9PVRFU1R8fHAtPmNvZGU9PUNPTVBBUkV8fHAtPmNvZGU9PVNFVFJFVFVSTikpeworICAgIHM9Im0iOworICAgIGlmKCFHQVMmJiFQSFhBU1MpIGVtaXQoZiwiXHRvcHRcdG9tLVxuIik7CisgIH0KKyAgZm9yKGk9TUFYUjtpPjA7aS0tKXsKKyAgICBpZihyZWdzW2ldPT0yKSByZWdzW2ldPTA7CisgICAgaWYocmVnc1tpXSY4KXsKKyAgICAgIHJlZ3NbaV0mPX44OworICAgICAgCisgICAgICBlbWl0KGYsIlx0bW92ZSVzLmxcdCVsZCglcyksJXNcbiIscywtc3RhY2tvZmZzZXQsbXJlZ25hbWVzW3NwXSxtcmVnbmFtZXNbaV0pOworICAgICAgaWYoaT49ZDApIGNjX3NldD0wOworICAgICAgaWYoY2Nfc2V0JiYoY2Nfc2V0LT5mbGFncyZSRUcpJiZjY19zZXQtPnJlZz09aSkKKwljY19zZXQ9MDsKKyAgICAgIG1pc3NpbmcrKzsKKyAgICB9CisgICAgaWYocmVnc1tpXSY0KXsKKyAgICAgIHJlZ3NbaV0mPX40OworICAgICAgaWYoaT49MSYmaTw9ZDcpeworCWlmKHVub3JkZXJlZHB1c2gpCisJICBlbWl0KGYsIlx0bW92ZSVzLmxcdCVkKCVzKSwlc1xuIixzLHB1c2hvZmZbbGFzdHB1c2hdLXB1c2hvZmZbaV0sbXJlZ25hbWVzW3NwXSxtcmVnbmFtZXNbaV0pOworCWVsc2V7CisJICBpZihjZiYmKnM9PSdtJyl7CisJICAgIGVtaXQoZiwiXHRtb3ZlJXMubFx0KCVzKSwlc1xuXHRhZGRxLmxcdCM0LCVzXG4iLHMsbXJlZ25hbWVzW3NwXSxtcmVnbmFtZXNbaV0sbXJlZ25hbWVzW3NwXSk7CisJICB9ZWxzZXsKKwkgICAgZW1pdChmLCJcdG1vdmUlcy5sXHQoJXMpKywlc1xuIixzLG1yZWduYW1lc1tzcF0sbXJlZ25hbWVzW2ldKTsKKwkgIH0KKwl9CisJcG9wKDQpO3NpemUrPTQ7CisgICAgICB9ZWxzZSBpZihpPj1mcDAmJmk8PWZwNyl7CisJaWYodW5vcmRlcmVkcHVzaCkKKwkgIGVtaXQoZiwiXHRmbW92ZSVzLnhcdCVkKCVzKSwlc1xuIixzLHB1c2hvZmZbbGFzdHB1c2hdLXB1c2hvZmZbaV0sbXJlZ25hbWVzW3NwXSxtcmVnbmFtZXNbaV0pOworCWVsc2UKKwkgIGVtaXQoZiwiXHRmbW92ZSVzLnhcdCglcykrLCVzXG4iLHMsbXJlZ25hbWVzW3NwXSxtcmVnbmFtZXNbaV0pOworCXBvcCgxMik7c2l6ZSs9MTI7CisgICAgICB9ZWxzZSBpZihpPj0yNSYmaTw9MjgpeworCWlmKHVub3JkZXJlZHB1c2gpCisJICBlbWl0KGYsIlx0bW92ZW0ubFx0JWQoJXMpLCVzXG4iLHB1c2hvZmZbbGFzdHB1c2hdLXB1c2hvZmZbaV0sbXJlZ25hbWVzW3NwXSxtcmVnbmFtZXNbaV0pOworCWVsc2V7CisJICBpZihjZikKKwkgICAgZW1pdChmLCJcdG1vdmVtLmxcdCglcyksJXNcblx0YWRkcS5sXHQjOCwlc1xuIixtcmVnbmFtZXNbc3BdLG1yZWduYW1lc1tpXSxtcmVnbmFtZXNbc3BdKTsKKwkgIGVsc2UKKwkgICAgZW1pdChmLCJcdG1vdmVtLmxcdCglcykrLCVzXG4iLG1yZWduYW1lc1tzcF0sbXJlZ25hbWVzW2ldKTsKKwl9CisJcG9wKDgpO3NpemUrPTg7CisgICAgICB9ZWxzZQorCWllcnJvcigwKTsKKyAgICAgIGlmKGk+PWQwKSBjY19zZXQ9MDsKKyAgICAgIGlmKGNjX3NldCYmKGNjX3NldC0+ZmxhZ3MmUkVHKSYmY2Nfc2V0LT5yZWc9PWkpCisJY2Nfc2V0PTA7CisgICAgICBtaXNzaW5nKys7CisgICAgfQorICB9CisgIGlmKCpzPT0nbScmJiFHQVMmJiFQSFhBU1MpIGVtaXQoZiwiXHRvcHRcdG9tK1xuIik7CisjaWYgMAorICBpZigocHVzaGVkcmVnJjEyKSYmKHAtPmNvZGU9PVRFU1R8fHAtPmNvZGU9PUNPTVBBUkUpKQorICAgIGVtaXQoZiwiXHR0c3QuYlx0LSVkKCVzKVxuIixzaXplKzIsbXJlZ25hbWVzW3NwXSk7CisjZW5kaWYKKyAgaWYodW5vcmRlcmVkcHVzaCkKKyAgICBlbWl0KGYsIlx0YWRkJXMuJWNcdCMlZCwlc1xuIixwdXNob2ZmW2xhc3RwdXNoXTw9OD8icSI6IiIsY2Y/J2wnOid3JyxwdXNob2ZmW2xhc3RwdXNoXSxtcmVnbmFtZXNbc3BdKTsKKyAgbGFzdHB1c2g9MDsKKyAgdW5vcmRlcmVkcHVzaD0wOworfQorc3RhdGljIHZvaWQgZW1pdF9vYmooRklMRSAqZixvYmogKnAsaW50IHQpCisvKiAgV3JpdGUgb2JqZWN0LiAgICovCit7CisgIGlmKHAtPmFtKXsKKyAgICAvKiAgQWRkcmVzc2luZyBtb2Rlcy4gICAqLworICAgIGlmKE5PUEVFUEhPTEUpIHtpZXJyb3IoMCk7cC0+YW09MDtyZXR1cm47fQorICAgIGlmKHAtPmFtLT5za2FsPj0wKXsKKyAgICAgIGxvbmcgbD0wOworICAgICAgaWYocC0+ZmxhZ3MmRDE2T0ZGKSBsPXptMmwocC0+dmFsLnZtYXgpOworICAgICAgZW1pdChmLCIoJWxkIixwLT5hbS0+ZGlzdCtsKTsKKyAgICAgIGlmKCFHQVMmJkNQVT49NjgwMjAmJigocC0+YW0tPmRpc3QrbCk+MzI3Njd8fChwLT5hbS0+ZGlzdCtsKTwtMzI3NjgpKQorCWVtaXQoZiwiLmwiKTsKKyAgICAgIGVsc2UgaWYoIUdBUyYmQ1BVPj02ODAyMCYmKChwLT5hbS0+ZGlzdCtsKT4xMjd8fChwLT5hbS0+ZGlzdCtsKTwtMTI4KSkKKwllbWl0KGYsIi53Iik7CisgICAgICBlbWl0KGYsIiwlcyIsbXJlZ25hbWVzW3AtPmFtLT5iYXNlcmVnXSk7CisgICAgICBpZihwLT5hbS0+ZHJlZyl7CisJZW1pdChmLCIsJXMiLG1yZWduYW1lc1twLT5hbS0+ZHJlZyYxMjddKTsKKwlpZihwLT5hbS0+ZHJlZyYxMjgpIGVtaXQoZiwiLnciKTsgZWxzZSBlbWl0KGYsIi5sIik7CisJaWYocC0+YW0tPnNrYWwpIGVtaXQoZiwiKiVkIixwLT5hbS0+c2thbCk7CisgICAgICB9CisgICAgICBlbWl0KGYsIikiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoKHAtPmZsYWdzJkQxNk9GRikmJnAtPmFtLT5za2FsPDAmJiF6bWVxdG8obDJ6bSgwTCkscC0+dmFsLnZtYXgpKSBpZXJyb3IoMCk7CisgICAgaWYocC0+YW0tPnNrYWw9PS0xKXsKKyAgICAgIGVtaXQoZiwiKCVzKSsiLG1yZWduYW1lc1twLT5hbS0+YmFzZXJlZ10pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZihwLT5hbS0+c2thbD09LTIpeyAgICAvKiAgTm9jaCBuaWNodCBpbXBsZW1lbnRpZXJ0ICAgICovCisgICAgICBlbWl0KGYsIi0oJXMpIixtcmVnbmFtZXNbcC0+YW0tPmJhc2VyZWddKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgaWYocC0+ZmxhZ3MmRFJFRk9CSil7CisgICAgaWYocC0+ZmxhZ3MmS09OU1QpeworICAgICAgZW1pdHZhbChmLCZwLT52YWwscC0+ZHR5cCZOVSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGVtaXQoZiwiKCIpOworICAgIGlmKChwLT5mbGFncyZEMTZPRkYpJiYhem1lcXRvKGwyem0oMEwpLHAtPnZhbC52bWF4KSl7CisgICAgICBlbWl0dmFsKGYsJnAtPnZhbCxNQVhJTlQpOworICAgICAgaWYoIXptbGVxKHAtPnZhbC52bWF4LGwyem0oMzI3NjdMKSl8fCF6bWxlcShsMnptKC0zMjc2OEwpLHAtPnZhbC52bWF4KSkKKwllbWl0KGYsIi5sIik7CisgICAgICBlbHNlIGlmKCF6bWxlcShwLT52YWwudm1heCxsMnptKDEyN0wpKXx8IXptbGVxKGwyem0oLTEyOEwpLHAtPnZhbC52bWF4KSkKKwllbWl0KGYsIi53Iik7CisgICAgICBlbWl0KGYsIiwiKTsKKyAgICB9CisgIH0KKyAgaWYocC0+ZmxhZ3MmVkFSQURSKSBlbWl0KGYsIiMiKTsKKyAgaWYocC0+ZmxhZ3MmVkFSKSB7CisgICAgaWYocC0+ZmxhZ3MmUkVHKXsKKyAgICAgIGVtaXQoZiwiJXMiLG1yZWduYW1lc1twLT5yZWddKTsKKyAgICB9ZWxzZSBpZihwLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CisgICAgICBsb25nIG9zOworICAgICAgb3M9em0ybChwLT52YWwudm1heCk7CisgICAgICBpZighVVNFRlJBTUVQT0lOVEVSJiYhdmxhcyl7CisJaWYoIXptbGVxKGwyem0oMEwpLHAtPnYtPm9mZnNldCkpIAorCSAgb3M9b3MrbG9mZi16bTJsKHAtPnYtPm9mZnNldCkrKFBST0ZJTEVSPzE2OjApOworCWVsc2UKKwkgIG9zPW9zK3ptMmwocC0+di0+b2Zmc2V0KTsKKwlpZighR0FTJiZDUFU+PTY4MDIwJiYob3Mtc3RhY2tvZmZzZXQpPjB4N2MwMCkgLyogK2wlZCBtYXguMTAyND8gKi8KKwkgIGVtaXQoZiwiKCglbGQrJXMlZCkubCwlcykiLG9zLXN0YWNrb2Zmc2V0LGxhYnByZWZpeCxvZmZsYWJlbCxtcmVnbmFtZXNbc3BdKTsKKwllbHNlCisJICBlbWl0KGYsIiglbGQrJXMlZCwlcykiLG9zLXN0YWNrb2Zmc2V0LGxhYnByZWZpeCxvZmZsYWJlbCxtcmVnbmFtZXNbc3BdKTsgCisgICAgICB9ZWxzZXsKKwlpZighem1sZXEobDJ6bSgwTCkscC0+di0+b2Zmc2V0KSkKKwkgIG9zPW9zLXptMmwocC0+di0+b2Zmc2V0KSs0KyhQUk9GSUxFUj8xNjowKTsKKwllbHNlCisJICBvcz1vcy0oem0ybChwLT52LT5vZmZzZXQpK3ptMmwoc3pvZihwLT52LT52dHlwKSkpOworCWVtaXQoZiwiKCVsZCIsb3MpOworCWlmKCFHQVMmJkNQVT49NjgwMjAmJm9zPjB4N2ZmZikKKwkgIGVtaXQoZiwiLmwiKTsKKwllbWl0KGYsIiwlcykiLG1yZWduYW1lc1tmYnBdKTsKKyAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgIGlmKCF6bWVxdG8obDJ6bSgwTCkscC0+dmFsLnZtYXgpKXtlbWl0dmFsKGYsJnAtPnZhbCxNQVhJTlQpO2VtaXQoZiwiKyIpO30KKyAgICAgIGlmKHAtPnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQyl7CisJZW1pdChmLCIlcyVsZCIsbGFicHJlZml4LHptMmwocC0+di0+b2Zmc2V0KSk7CisgICAgICB9ZWxzZXsKKwlpZihJU0ZVTkMocC0+di0+dnR5cC0+ZmxhZ3MpKQorCSAgZW1pdChmLCIlcyVzIixGVU5DUFJFRklYKHAtPnYtPnZ0eXApLHAtPnYtPmlkZW50aWZpZXIpOworCWVsc2UKKwkgIGVtaXQoZiwiJXMlcyIsaWRwcmVmaXgscC0+di0+aWRlbnRpZmllcik7CisgICAgICB9CisgICAgICBpZih1c2Vfc2QmJiEocC0+ZmxhZ3MmVkFSQURSKSYmIUlTRlVOQyhwLT52LT52dHlwLT5mbGFncykKKwkgJiYhKHAtPnYtPnRhdHRyJihDSElQfEZBUikpJiYoQ09OU1RJTkRBVEF8fCFpc19jb25zdChwLT52LT52dHlwKSkKKwkgJiZ6bWxlcShsMnptKDBMKSxwLT52YWwudm1heCkmJiF6bWxlcShzem9mKHAtPnYtPnZ0eXApLHAtPnZhbC52bWF4KSkKKwllbWl0KGYsIihhNCkiKTsKKyAgICB9CisgIH0KKyAgaWYoKHAtPmZsYWdzJlJFRykmJiEocC0+ZmxhZ3MmVkFSKSkgZW1pdChmLCIlcyIsbXJlZ25hbWVzW3AtPnJlZ10pOworICBpZihwLT5mbGFncyZLT05TVCl7CisgICAgLyogIFRoaXMgcmVxdWlyZXMgSUVFRSBmbG9hdHMvZG91YmxlcyBvbiB0aGUgaG9zdCBjb21waWxlci4gKi8KKyAgICBpZihJU0ZMT0FUKHQpKXsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmlwPSh1bnNpZ25lZCBjaGFyICopJnAtPnZhbC52ZmxvYXQ7CisgICAgICBjaGFyICpzOworICAgICAgaWYoR0FTKSBzPSIweCI7IGVsc2Ugcz0iJCI7CisgICAgICBlbWl0KGYsIiMlcyUwMnglMDJ4JTAyeCUwMngiLHMsaXBbMF0saXBbMV0saXBbMl0saXBbM10pOworICAgICAgaWYoKHQmTlEpIT1GTE9BVCl7CisJaWYoREVCVUcmMSkgcHJpbnRmKCJkb3VibGVjb25zdD0lZlxuIix6bGQyZCh6ZDJ6bGQocC0+dmFsLnZkb3VibGUpKSk7CisJZW1pdChmLCIlMDJ4JTAyeCUwMnglMDJ4IixpcFs0XSxpcFs1XSxpcFs2XSxpcFs3XSk7CisgICAgICB9CisgICAgfWVsc2V7CisgICAgICBlbWl0KGYsIiMiKTtlbWl0dmFsKGYsJnAtPnZhbCx0Jk5VKTsKKyAgICB9CisgIH0KKyAgaWYocC0+ZmxhZ3MmRFJFRk9CSikgZW1pdChmLCIpIik7Cit9CitzdGF0aWMgdm9pZCBkd2FyZjJfcHJpbnRfZnJhbWVfbG9jYXRpb24oRklMRSAqZixWYXIgKnYpCit7CisgIC8qRklYTUU6IG5lZWRzIGEgbG9jYXRpb24gbGlzdCBhbmQgY29ycmVjdCByZWdpc3RlciB0cmFic2xhdGlvbiAqLworICBvYmogbzsKKyAgby5mbGFncz1SRUc7CisgIGlmKFVTRUZSQU1FUE9JTlRFUnx8dmxhcykKKyAgICBvLnJlZz1mYnA7CisgIGVsc2UKKyAgICBvLnJlZz1zcDsKKyAgby52YWwudm1heD1sMnptKDBMKTsKKyAgby52PTA7CisgIGR3YXJmMl9wcmludF9sb2NhdGlvbihmLCZvKTsKK30KK3N0YXRpYyBpbnQgZHdhcmYyX3JlZ251bWJlcihpbnQgcikKK3sKKyAgaWYocjw9OCkKKyAgICByZXR1cm4gcis3OworICBlbHNlIGlmKHI8PWQ3KQorICAgIHJldHVybiByLTg7CisgIGVsc2UgaWYocjw9ZnA3KQorICAgIHJldHVybiByKzE7CisgIGVsc2UKKyAgICBpZXJyb3IoMCk7Cit9CitzdGF0aWMgem1heCBkd2FyZjJfZmJvZmZzZXQoVmFyICp2KQoreworICBsb25nIG9zOworICBpZighdnx8KHYtPnN0b3JhZ2VfY2xhc3MhPUFVVE8mJnYtPnN0b3JhZ2VfY2xhc3MhPVJFR0lTVEVSKSkgaWVycm9yKDApOworICBpZighVVNFRlJBTUVQT0lOVEVSJiYhdmxhcyl7CisgICAgaWYoIXptbGVxKGwyem0oMEwpLHYtPm9mZnNldCkpIAorICAgICAgb3M9bG9mZi16bTJsKHYtPm9mZnNldCk7CisgICAgZWxzZQorICAgICAgb3M9em0ybCh2LT5vZmZzZXQpOworICAgIHJldHVybiBsMnptKG9zK2ZyYW1lc2l6ZSk7CisgIH1lbHNleworICAgIGlmKCF6bWxlcShsMnptKDBMKSx2LT5vZmZzZXQpKSAKKyAgICAgIHJldHVybiBsMnptKC16bTJsKHYtPm9mZnNldCkrNCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGwyem0oLSh6bTJsKHYtPm9mZnNldCkrem0ybChzem9mKHYtPnZ0eXApKSkpOworICB9Cit9CisKK3N0YXRpYyBjaGFyIHRzaFtdPXsndycsJ2wnfTsKK3N0YXRpYyBpbnQgcHJvZmxhYmVsLHN0YWNrc2l6ZWxhYmVsOworc3RhdGljIHZvaWQgZnVuY3Rpb25fdG9wKEZJTEUgKmYsVmFyICp2LGxvbmcgb2Zmc2V0KQorLyogIFdyaXRlcyBmdW5jdGlvbiBoZWFkZXIuICovCit7CisgICAgZ2V0YTQ9MDsKKyAgICBpZihHQVMpeworICAgIH1lbHNleworICAgICAgICBpZihkZWJ1Z19pbmZvJiZIVU5LREVCVUcpIGVtaXQoZiwiXHRzeW1kZWJ1Z1xuIik7CisgICAgICAgIGlmKENQVSE9NjgwMDApIGVtaXQoZiwiXHRtYWNoaW5lXHQlbGRcbiIsQ1BVKTsKKyAgICAgICAgaWYoY2YpIHN0cnNob3J0WzFdPSJsIjsKKyAgICAgICAgaWYoRlBVPjY4MDAwKSBlbWl0KGYsIlx0ZnB1XHQxXG4iKTsKKyAgICAgICAgaWYoU01BTExDT0RFKSBlbWl0KGYsIlx0bmVhclx0Y29kZVxuIik7CisgICAgICAgIGlmKHVzZV9zZCkgZW1pdChmLCJcdG5lYXJcdGE0LC0yXG4iKTsKKwlpZihQSFhBU1MpeworCSAgZW1pdChmLCJcdG9wdFx0MFxuXHRvcHRcdE5RTFBTTSIpOworCSAgaWYoQ1BVIT02ODA0MCkgZW1pdChmLCJSIik7CisJICBpZigxLypCUkFOQ0hPUFR8fChvcHRmbGFncyYyKSovKSBlbWl0KGYsIkJUIik7CisJICBlbWl0KGYsIlxuIik7CisJfWVsc2V7CisJICBlbWl0KGYsIlx0b3B0IG8rLG9sKyxvcCssb2MrLG90Kyxvaissb2IrLG9tKyIpOworCSAgaWYoQ1BVPT02ODA0MCkgZW1pdChmLCIsYS0iKTsKKwkgIGVtaXQoZiwiXG4iKTsKKwl9CisgICAgfQorICAgIGlmKCFzcGVjaWFsX3NlY3Rpb24oZix2KSYmc2VjdGlvbiE9Q09ERSl7ZW1pdChmLGNvZGVuYW1lKTtpZihmKSBzZWN0aW9uPUNPREU7fQorICAgIGlmKFBST0ZJTEVSKXsKKyAgICAgICAgcHJvZmxhYmVsPSsrbGFiZWw7CisgICAgICAgIGlmKEdBUyl7CisgICAgICAgICAgICBlbWl0KGYsIiVzJWQ6XG5cdC5ieXRlXHRcIiVzXCIsMFxuIixsYWJwcmVmaXgscHJvZmxhYmVsLHYtPmlkZW50aWZpZXIpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGVtaXQoZiwiJXMlZFxuXHRkYy5iXHRcIiVzXCIsMFxuIixsYWJwcmVmaXgscHJvZmxhYmVsLHYtPmlkZW50aWZpZXIpOworICAgICAgICB9CisgICAgfQorICAgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisgICAgICBpZigodi0+ZmxhZ3MmKElOTElORUZVTkN8SU5MSU5FRVhUKSkhPUlOTElORUZVTkMpeworICAgICAgICBpZihHQVMpeworCSAgZW1pdChmLCJcdC5nbG9iYWxcdCVzJXNcbiIsRlVOQ1BSRUZJWCh2LT52dHlwKSx2LT5pZGVudGlmaWVyKTsKKyAgICAgICAgfWVsc2V7CisJICBlbWl0KGYsIlx0cHVibGljXHQlcyVzXG4iLEZVTkNQUkVGSVgodi0+dnR5cCksdi0+aWRlbnRpZmllcik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKKyAgICAgIGlmKEdBUyl7CisgICAgICAgIGVtaXQoZiwiXHQuYWxpZ25cdDRcbiVzJXM6XG4iLEZVTkNQUkVGSVgodi0+dnR5cCksdi0+aWRlbnRpZmllcik7CisgICAgICB9ZWxzZXsKKyAgICAgICAgZW1pdChmLCJcdGNub3BcdDAsNFxuJXMlc1xuIixGVU5DUFJFRklYKHYtPnZ0eXApLHYtPmlkZW50aWZpZXIpOworICAgICAgfQorICAgIH1lbHNleworICAgICAgaWYoR0FTKXsKKyAgICAgICAgZW1pdChmLCJcdC5hbGlnblx0NFxuJXMlbGQ6XG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICAgICAgfWVsc2V7CisgICAgICAgIGVtaXQoZiwiXHRjbm9wXHQwLDRcbiVzJWxkXG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICAgICAgfQorICAgIH0gICAgICAKKyAgICBpZihzdGFja19jaGVjayYmISh2LT50YXR0ciZBTUlJTlRFUlJVUFQpKXsKKyAgICAgIHN0YWNrc2l6ZWxhYmVsPSsrbGFiZWw7CisgICAgICBpZihHQVMpeworCWVtaXQoZiwiXHRtb3ZlLmxcdCMlcyVkLC0oJXMpXG5cdGpic3JcdF9fX3N0YWNrX2NoZWNrXG5cdGFkZHEubFx0IzQsJXNcbiIsbGFicHJlZml4LHN0YWNrc2l6ZWxhYmVsLG1yZWduYW1lc1tzcF0sbXJlZ25hbWVzW3NwXSk7CisgICAgICB9ZWxzZXsKKwllbWl0KGYsIlx0bW92ZS5sXHQjJXMlZCwtKCVzKVxuXHRqc3JcdF9fX3N0YWNrX2NoZWNrXG5cdGFkZHEubFx0IzQsJXNcbiIsbGFicHJlZml4LHN0YWNrc2l6ZWxhYmVsLG1yZWduYW1lc1tzcF0sbXJlZ25hbWVzW3NwXSk7CisgICAgICB9CisgICAgfSAgICAgIAorICAgIGlmKFBST0ZJTEVSKXsKKyAgICAgICAgaWYoR0FTKXsKKyAgICAgICAgICAgIGVtaXQoZiwiXHRzdWIubFx0IzE2LCVzXG5cdG1vdmUubFx0JXMsLSglcylcblx0cGVhXHQlcyVkXG5cdC5nbG9iYWxcdF9fc3RhcnRwcm9mXG5cdGpic3JcdF9fc3RhcnRwcm9mXG5cdGFkZHEuJXNcdCM4LCVzXG4iLG1yZWduYW1lc1tzcF0sbXJlZ25hbWVzW3NwXSxtcmVnbmFtZXNbc3BdLGxhYnByZWZpeCxwcm9mbGFiZWwsc3Ryc2hvcnRbMV0sbXJlZ25hbWVzW3NwXSk7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgZW1pdChmLCJcdHN1Yi5sXHQjMTYsJXNcblx0bW92ZS5sXHQlcywtKCVzKVxuXHRwZWFcdCVzJWRcblx0cHVibGljXHRfX3N0YXJ0cHJvZlxuXHRqc3JcdF9fc3RhcnRwcm9mXG5cdGFkZHEuJXNcdCM4LCVzXG4iLG1yZWduYW1lc1tzcF0sbXJlZ25hbWVzW3NwXSxtcmVnbmFtZXNbc3BdLGxhYnByZWZpeCxwcm9mbGFiZWwsc3Ryc2hvcnRbMV0sbXJlZ25hbWVzW3NwXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgb2Zmc2V0PS0oKG9mZnNldCs0LTEpLzQpKjQ7CisgICAgbG9mZj0tb2Zmc2V0O29mZmxhYmVsPSsrbGFiZWw7CisgICAgaWYoIVVTRUZSQU1FUE9JTlRFUiYmIXZsYXMpeworICAgICAgaWYob2Zmc2V0PDApIGVtaXQoZiwiXHRzdWIlcy4lc1x0IyVsZCwlc1xuIixxdWlja1tvZmZzZXQ+PS04XSxzdHJzaG9ydFtvZmZzZXQ+PS0zMjc2OF0sLW9mZnNldCxtcmVnbmFtZXNbc3BdKTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKG9mZnNldD49LTMyNzY4fHxDUFU+PTY4MDIwKXsKKwllbWl0KGYsIlx0bGluay4lY1x0JXMsIyVsZFxuIix0c2hbb2Zmc2V0PC0zMjc2OF0sbXJlZ25hbWVzW2ZicF0sb2Zmc2V0KTsKKyAgICAgIH1lbHNleworCWVtaXQoZiwiXHRsaW5rLndcdCVzLCMtMzI3NjhcbiIsbXJlZ25hbWVzW2ZicF0pO29mZnNldCs9MzI3Njg7CisJICBlbWl0KGYsIlx0c3ViLiVjXHQjJWxkLCVzXG4iLHRzaFtvZmZzZXQ8LTMyNzY4XSxvZmZzZXQsbXJlZ25hbWVzW2ZicF0pOworICAgICAgfQorICAgIH0KKyAgICBpZihGUFU+NjgwMDAmJmZsb2F0X3VzZWQpeworICAgICAgICBpZihHQVMpeworICAgICAgICAgICAgZW1pdChmLCJcdC53b3JkXHQweGYyMjcsJXMlZFxuIixsYWJwcmVmaXgsZnJlZ2xhYmVsKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBlbWl0KGYsIlx0Zm1vdmVtLnhcdCVzJWQsLSglcylcbiIsbGFicHJlZml4LGZyZWdsYWJlbCxtcmVnbmFtZXNbc3BdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZihjZil7CisgICAgICBlbWl0KGYsIlx0c3ViLmxcdCMlcyVkLCVzXG4iLGxhYnByZWZpeCxvZmZsYWJlbCxtcmVnbmFtZXNbc3BdKTsKKyAgICAgIGlmKEdBUyl7CisgICAgICAgIGVtaXQoZiwiXHRtb3ZlbS5sXHQjJXMlZCwoJXMpXG4iLGxhYnByZWZpeCxyZWdsYWJlbCxtcmVnbmFtZXNbc3BdKTsKKyAgICAgIH1lbHNleworICAgICAgICBlbWl0KGYsIlx0bW92ZW0ubFx0JXMlZCwoJXMpXG4iLGxhYnByZWZpeCxyZWdsYWJlbCxtcmVnbmFtZXNbc3BdKTsKKyAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgIGlmKEdBUyl7CisgICAgICAgIGVtaXQoZiwiXHRtb3ZlbS5sXHQjJXMlZCwtKCVzKVxuIixsYWJwcmVmaXgscmVnbGFiZWwsbXJlZ25hbWVzW3NwXSk7CisgICAgICB9ZWxzZXsKKyAgICAgICAgZW1pdChmLCJcdG1vdmVtLmxcdCVzJWQsLSglcylcbiIsbGFicHJlZml4LHJlZ2xhYmVsLG1yZWduYW1lc1tzcF0pOworICAgICAgfQorICAgIH0KKyAgICBpZigodi0+dGF0dHImU0FWRURTKSYmdXNlX3NkKSBlbWl0KGYsIlx0eHJlZlx0X0xpbmtlckRCXG5cdGxlYVx0X0xpbmtlckRCLGE0XG4iKTsKKyAgICBzdGFja192YWxpZD0xOworICAgIHN0YWNrPTA7Cit9CitzdGF0aWMgdm9pZCBmdW5jdGlvbl9ib3R0b20oRklMRSAqZixWYXIgKnYsbG9uZyBvZmZzZXQpCisvKiAgV3JpdGVzIGZ1bmN0aW9uIGZvb3Rlci4gKi8KK3sKKyAgICBpbnQgaSxzaXplPTA7dW5zaWduZWQgaW50IHB1c2h2YWwscG9wdmFsOworICAgICpwdXNocmVnbGlzdD0wOypwb3ByZWdsaXN0PTA7CisgICAgcHVzaHZhbD1wb3B2YWw9MDsKKyAgICBpZigodi0+dGF0dHImU0FWRURTKSYmdXNlX3NkKSBnZXRhND0xOworICAgIGZvcihpPTE7aTw9MTY7aSsrKXsKKyAgICAgICAgaWYoKCgocmVndXNlZFtpXSYmIXJlZ3NjcmF0Y2hbaV0pfHwoKHYtPnRhdHRyJklOVEVSUlVQVCkmJkJUU1QocmVnc19tb2RpZmllZCxpKSkpJiYhcmVnc2FbaV0pfHwoaT09NSYmZ2V0YTQpfHwoaT09ZDAmJnB1c2hmbGFnKSl7CisgICAgICAgICAgICBpZigqcHVzaHJlZ2xpc3QpIHN0cmNhdChwdXNocmVnbGlzdCwiLyIpOworICAgICAgICAgICAgc3RyY2F0KHB1c2hyZWdsaXN0LG1yZWduYW1lc1tpXSk7CisJICAgIGlmKGkhPWQwfHwodi0+dGF0dHImSU5URVJSVVBUKSl7CisJICAgICAgaWYoKnBvcHJlZ2xpc3QpIHN0cmNhdChwb3ByZWdsaXN0LCIvIik7CisJICAgICAgc3RyY2F0KHBvcHJlZ2xpc3QsbXJlZ25hbWVzW2ldKTsKKwkgICAgfQorICAgICAgICAgICAgaWYoaTxkMCl7CisJICAgICAgcHVzaHZhbHw9KDI1Nj4+aSk7cG9wdmFsfD0oMTI4PDxpKTsKKwkgICAgfWVsc2V7CisJICAgICAgcHVzaHZhbHw9KDB4ODAwMD4+KGktOSkpOworCSAgICAgIGlmKGkhPWQwKSBwb3B2YWx8PSgxPDwoaS05KSk7CisJICAgIH0KKyAgICAgICAgICAgIHNpemUrPTQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYocHVzaGZsYWcpeworICAgICAgZW1pdChmLCJcdGFkZHEuJWNcdCM0LCVzXG4iLGNmPydsJzondycsbXJlZ25hbWVzW3NwXSk7CisgICAgICBpZih2LT50YXR0ciZJTlRFUlJVUFQpIGllcnJvcigwKTsKKyAgICB9CisgICAgaWYoY2YpeworICAgICAgaWYoR0FTKXsKKyAgICAgICAgaWYocG9wdmFsKQorCSAgZW1pdChmLCJcdC5lcXVcdCVzJWQsJXVcblx0bW92ZW0ubFx0KCVzKSwjJXVcblx0YWRkLmxcdCMlcyVkJXMsJXNcbiIsbGFicHJlZml4LHJlZ2xhYmVsLHB1c2h2YWwsbXJlZ25hbWVzW3NwXSxwb3B2YWwsbGFicHJlZml4LG9mZmxhYmVsLHB1c2hmbGFnPyItNCI6IiIsbXJlZ25hbWVzW3NwXSk7CisgICAgICAgIGVsc2UKKwkgIGVtaXQoZiwiXHQuZXF1XHQlcyVkLDBcbiIsbGFicHJlZml4LHJlZ2xhYmVsKTsKKyAgICAgIH1lbHNleworICAgICAgICBpZigqcHVzaHJlZ2xpc3QpCisJICBlbWl0KGYsIiVzJWRcdHJlZ1x0JXNcbiIsbGFicHJlZml4LHJlZ2xhYmVsLHB1c2hyZWdsaXN0KTsKKwllbHNlCisJICBlbWl0KGYsIiVzJWRcdHJlZ1xuIixsYWJwcmVmaXgscmVnbGFiZWwpOworCWlmKCpwb3ByZWdsaXN0KQorCSAgZW1pdChmLCJcdG1vdmVtLmxcdCglcyksJXNcblx0YWRkLmxcdCMlcyVkJXMsJXNcbiIsbXJlZ25hbWVzW3NwXSxwb3ByZWdsaXN0LGxhYnByZWZpeCxvZmZsYWJlbCxwdXNoZmxhZz8iLTQiOiIiLG1yZWduYW1lc1tzcF0pOworICAgICAgfQorICAgIH1lbHNleworICAgICAgaWYoR0FTKXsKKyAgICAgICAgaWYocG9wdmFsKQorCSAgZW1pdChmLCJcdC5lcXVcdCVzJWQsJXVcblx0bW92ZW0ubFx0KCVzKSssIyV1XG4iLGxhYnByZWZpeCxyZWdsYWJlbCxwdXNodmFsLG1yZWduYW1lc1tzcF0scG9wdmFsKTsKKyAgICAgICAgZWxzZQorCSAgZW1pdChmLCJcdC5lcXVcdCVzJWQsMFxuIixsYWJwcmVmaXgscmVnbGFiZWwpOworICAgICAgfWVsc2V7CisgICAgICAgIGlmKCpwdXNocmVnbGlzdCkKKwkgIGVtaXQoZiwiJXMlZFx0cmVnXHQlc1xuIixsYWJwcmVmaXgscmVnbGFiZWwscHVzaHJlZ2xpc3QpOworICAgICAgICBlbHNlCisJICBlbWl0KGYsIiVzJWRcdHJlZ1xuIixsYWJwcmVmaXgscmVnbGFiZWwpOworCWlmKCpwb3ByZWdsaXN0KQorCSAgZW1pdChmLCJcdG1vdmVtLmxcdCglcykrLCVzXG4iLG1yZWduYW1lc1tzcF0scG9wcmVnbGlzdCk7CisgICAgICB9CisgICAgfQorICAgICpwdXNocmVnbGlzdD0wOypwb3ByZWdsaXN0PTA7cHVzaHZhbD0weGUwMDA7cG9wdmFsPTB4ZDAwMDsKKyAgICBmb3IoaT1mcDA7aTw9ZnA3O2krKyl7CisgICAgICBpZigoKChyZWd1c2VkW2ldJiYhcmVnc2NyYXRjaFtpXSl8fCgodi0+dGF0dHImSU5URVJSVVBUKSYmQlRTVChyZWdzX21vZGlmaWVkLGkpKSkmJiFyZWdzYVtpXSkpeworCWlmKCpwb3ByZWdsaXN0KSBzdHJjYXQocG9wcmVnbGlzdCwiLyIpOworCXN0cmNhdChwb3ByZWdsaXN0LG1yZWduYW1lc1tpXSk7CisJcHVzaHZhbHw9KDE8PChpLTE3KSk7cG9wdmFsfD0oMHg4MD4+KGktMTcpKTsKKwlzaXplKz0xMjsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoRlBVPjY4MDAwJiYoZmxvYXRfdXNlZHx8KHYtPnRhdHRyJklOVEVSUlVQVCkpKXsKKyAgICAgIGlmKEdBUyl7CisJaWYocG9wdmFsIT0weGQwMDApCisJICBlbWl0KGYsIlx0LmVxdVx0JXMlZCwweCV4XG5cdC53b3JkXHQweGYyMWYsMHgleFxuIixsYWJwcmVmaXgsZnJlZ2xhYmVsLChpbnQpcHVzaHZhbCwoaW50KXBvcHZhbCk7CisJZWxzZQorCSAgZW1pdChmLCJcdC5lcXVcdCVzJWQsMHhlMDAwXG4iLGxhYnByZWZpeCxmcmVnbGFiZWwpOworICAgICAgfWVsc2V7CisJaWYoKnBvcHJlZ2xpc3QpCisJICBlbWl0KGYsIiVzJWRcdGZyZWdcdCVzXG5cdGZtb3ZlbS54XHQoJXMpKywlcyVkXG4iLGxhYnByZWZpeCxmcmVnbGFiZWwscG9wcmVnbGlzdCxtcmVnbmFtZXNbc3BdLGxhYnByZWZpeCxmcmVnbGFiZWwpOworCWVsc2UKKwkgIGVtaXQoZiwiJXMlZFx0ZnJlZ1xuIixsYWJwcmVmaXgsZnJlZ2xhYmVsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZihjZnx8KCFVU0VGUkFNRVBPSU5URVImJiF2bGFzKSl7CisgICAgICBpZihHQVMpeworCWVtaXQoZiwiXHQuZXF1XHQlcyVkLCVkXG4iLGxhYnByZWZpeCxvZmZsYWJlbCxzaXplKTsKKyAgICAgIH1lbHNleworCWVtaXQoZiwiJXMlZFx0ZXF1XHQlZFxuIixsYWJwcmVmaXgsb2ZmbGFiZWwsc2l6ZSk7CisgICAgICB9CisgICAgfQorICAgIGlmKCFVU0VGUkFNRVBPSU5URVImJiF2bGFzKXsKKyAgICAgIGlmKGxvZmYpIGVtaXQoZiwiXHRhZGQlcy4lc1x0IyVsZCwlc1xuIixxdWlja1tsb2ZmPD04XSxzdHJzaG9ydFtsb2ZmPDMyNzY4XSxsb2ZmLG1yZWduYW1lc1tzcF0pOworICAgICAgZnJhbWVzaXplPXNpemU7CisgICAgfWVsc2UKKyAgICAgIGVtaXQoZiwiXHR1bmxrXHQlc1xuIixtcmVnbmFtZXNbZmJwXSk7CisgICAgaWYoUFJPRklMRVIpeworICAgICAgICBpZihHQVMpeworICAgICAgICAgICAgZW1pdChmLCJcdG1vdmUubFx0JXMsLSglcylcblx0Lmdsb2JhbFx0X19lbmRwcm9mXG5cdGpic3JcdF9fZW5kcHJvZlxuXHRhZGQuJXNcdCMyMCwlc1xuIixtcmVnbmFtZXNbc3BdLG1yZWduYW1lc1tzcF0sc3Ryc2hvcnRbMV0sbXJlZ25hbWVzW3NwXSk7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgZW1pdChmLCJcdG1vdmUubFx0JXMsLSglcylcblx0cHVibGljXHRfX2VuZHByb2Zcblx0anNyXHRfX2VuZHByb2Zcblx0YWRkLiVzXHQjMjAsJXNcbiIsbXJlZ25hbWVzW3NwXSxtcmVnbmFtZXNbc3BdLHN0cnNob3J0WzFdLG1yZWduYW1lc1tzcF0pOworICAgICAgICB9CisgICAgfQorICAgIGlmKHYtPnRhdHRyJklOVEVSUlVQVCkKKyAgICAgIGVtaXQoZiwiXHRydGVcbiIpOworICAgIGVsc2UKKyAgICAgIGVtaXQoZiwiXHRydHNcbiIpOworICAgIGlmKHN0YWNrX2NoZWNrJiYhKHYtPnRhdHRyJkFNSUlOVEVSUlVQVCkpeworICAgICAgaWYoR0FTKQorCWVtaXQoZiwiXHQuZXF1XHQlcyVkLCVsZFxuIixsYWJwcmVmaXgsc3RhY2tzaXplbGFiZWwsc2l6ZStsb2ZmLW1heHB1c2hlZCk7CisgICAgICBlbHNlCisJZW1pdChmLCIlcyVkXHRlcXVcdCVsZFxuIixsYWJwcmVmaXgsc3RhY2tzaXplbGFiZWwsc2l6ZStsb2ZmLW1heHB1c2hlZCk7CisgICAgfQorICAgIGlmKHN0YWNrX3ZhbGlkKXsKKyAgICAgIGlmKCF2LT5maSkgdi0+Zmk9bmV3X2ZpKCk7CisgICAgICB2LT5maS0+ZmxhZ3N8PUFMTF9TVEFDSzsKKyAgICAgIHYtPmZpLT5zdGFjazE9bDJ6bShzaXplK2xvZmYrc3RhY2spOworICAgICAgZW1pdChmLCIlYyBzdGFja3NpemU9JWxkXG4iLEdBUz8nIyc6JzsnLHNpemUrbG9mZitzdGFjayk7CisgICAgfQorfQorc3RhdGljIHZvaWQgbW92ZShGSUxFICpmLG9iaiAqcSxpbnQgcXJlZyxvYmogKnosaW50IHpyZWcsaW50IHQpCisvKiAgZXJ6ZXVndCBlaW5lIG1vdmUgQW53ZWlzdW5nLi4uRGEgc29sbGVuIG1hbCBPcHRpbWllcnVuZ2VuIHJlaW4gICovCit7CisgICAgaWYoIXpyZWcmJih6LT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKSB6cmVnPXotPnJlZzsKKyAgICBpZighcXJlZyYmKHEtPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpIHFyZWc9cS0+cmVnOworICAgIGlmKHpyZWc9PXFyZWcmJnpyZWcpIHJldHVybjsKKyAgICBpZihxJiYocS0+ZmxhZ3MmVkFSQURSKSYmenJlZz49MSYmenJlZzw9OCl7CisgICAgICAgIGVtaXQoZiwiXHRsZWFcdCIpOworICAgICAgICBxLT5mbGFncyY9flZBUkFEUjtlbWl0X29iaihmLHEsdCk7cS0+ZmxhZ3N8PVZBUkFEUjsKKyAgICAgICAgZW1pdChmLCIsJXNcbiIsbXJlZ25hbWVzW3pyZWddKTsKKwlCU0VUKHJlZ3NfbW9kaWZpZWQsenJlZyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoenJlZz49ZDAmJnpyZWc8ZnAwJiZxJiYocS0+ZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QmJmlzcXVpY2trb25zdCgmcS0+dmFsLHQpKXsKKyAgICAgICAgZW1pdChmLCJcdG1vdmVxXHQiKTsKKyAgICB9ZWxzZXsKKyAgICAgICAgaWYoKHpyZWc+PWZwMCYmenJlZzw9ZnA3KXx8KHFyZWc+PWZwMCYmcXJlZzw9ZnA3KSl7CisgICAgICAgICAgICBpZihxcmVnPj1mcDAmJnFyZWc8PWZwNyYmenJlZz49ZnAwJiZ6cmVnPD1mcDcpIGVtaXQoZiwiXHRmbW92ZS54XHQiKTsKKyAgICAgICAgICAgICBlbHNlIGVtaXQoZiwiXHRmbW92ZS4lY1x0Iix4X3RbdCZOUV0pOworICAgICAgICB9ZWxzZXsKKwkgIGlmKCFjZnx8cXJlZ3x8enJlZykKKyAgICAgICAgICAgIGVtaXQoZiwiXHRtb3ZlLiVjXHQiLHhfc1ttc2l6ZXRhYlt0Jk5RXV0pOworICAgICAgICB9CisgICAgfQorICAgIGlmKGNmJiYhcXJlZyYmIXpyZWcpeworICAgICAgICBzdGF0aWMgSUMgZHVtbXk7CisgICAgICAgIGR1bW15LmNvZGU9QVNTSUdOOworICAgICAgICBkdW1teS50eXBmPXQ7CisgICAgICAgIGR1bW15LnExPSpxOworICAgICAgICBkdW1teS5xMi5mbGFncz0wOworICAgICAgICBkdW1teS56PSp6OworICAgICAgICBxcmVnPWdldF9yZWcoZiwxLCZkdW1teSwwKTsKKwllbWl0KGYsIlx0bW92ZS4lY1x0Iix4X3NbbXNpemV0YWJbdCZOUV1dKTsKKyAgICAgICAgZW1pdF9vYmooZixxLHQpOworICAgICAgICBlbWl0KGYsIiwlc1xuXHRtb3ZlLiVjXHQlcywiLG1yZWduYW1lc1txcmVnXSx4X3NbbXNpemV0YWJbdCZOUV1dLG1yZWduYW1lc1txcmVnXSk7CisgICAgICAgIGVtaXRfb2JqKGYseix0KTsKKyAgICAgICAgZW1pdChmLCJcbiIpOworICAgIH1lbHNleworICAgICAgaWYocXJlZykgZW1pdChmLCIlcyIsbXJlZ25hbWVzW3FyZWddKTsgZWxzZSBlbWl0X29iaihmLHEsdCk7CisgICAgICBlbWl0KGYsIiwiKTsKKyAgICAgIGlmKHpyZWcpIGVtaXQoZiwiJXMiLG1yZWduYW1lc1t6cmVnXSk7IGVsc2UgZW1pdF9vYmooZix6LHQpOworICAgICAgZW1pdChmLCJcbiIpOworICAgICAgaWYoenJlZykgQlNFVChyZWdzX21vZGlmaWVkLHpyZWcpOworICAgIH0KK30KK3N0YXRpYyB2b2lkIGxvYWRleHQoRklMRSAqZixpbnQgcixvYmogKnEsaW50IHQpCisvKiAgbGFlZHQgT2JqZWt0IHEgdm9tIFR5cCB0IGluIFJlZ2lzdGVyIHIgdW5kIGVyd2VpdGVydCBhdWYgbG9uZyAgICovCit7CisgICAgaWYodCZVTlNJR05FRCl7CisgICAgICBpZigocS0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcS0+cmVnPT1yKQorICAgICAgICBlbWl0KGYsIlx0YW5kLmxcdCMldSwlc1xuIiwoKHQmTlEpPT1DSEFSPzB4ZmZ1OjB4ZmZmZnUpLG1yZWduYW1lc1tyXSk7CisgICAgICBlbHNlCisgICAgICAgIGVtaXQoZiwiXHRtb3ZlcVx0IzAsJXNcbiIsbXJlZ25hbWVzW3JdKTsKKyAgICB9CisgICAgbW92ZShmLHEsMCwwLHIsdCk7CisjaWZkZWYgTTY4S18xNkJJVF9JTlQKKyAgICBpZigodCZOVSk9PVNIT1JUfHwodCZOVSk9PUlOVCkgZW1pdChmLCJcdGV4dC5sXHQlc1xuIixtcmVnbmFtZXNbcl0pOworI2Vsc2UKKyAgICBpZigodCZOVSk9PVNIT1JUKSBlbWl0KGYsIlx0ZXh0LmxcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisjZW5kaWYKKyAgICBpZigodCZOVSk9PUNIQVIpeworICAgICAgaWYoY2Z8fENQVT49NjgwMjApCisgICAgICAgIGVtaXQoZiwiXHRleHRiLmxcdCVzXG4iLG1yZWduYW1lc1tyXSk7CisgICAgICBlbHNlCisgICAgICAgIGVtaXQoZiwiXHRleHQud1x0JXNcblx0ZXh0LmxcdCVzXG4iLG1yZWduYW1lc1tyXSxtcmVnbmFtZXNbcl0pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYWRkKEZJTEUgKmYsb2JqICpxLGludCBxcmVnLG9iaiAqeixpbnQgenJlZyxpbnQgdCkKKy8qICBlcnpldWd0IGVpbmUgYWRkIEFud2Vpc3VuZy4uLkRhIHNvbGxlbiBtYWwgT3B0aW1pZXJ1bmdlbiByZWluICAgKi8KK3sKKyAgICBpZighcXJlZyYmIXEpIGllcnJvcigwKTsKKyAgICBpZighenJlZyYmIXopIGllcnJvcigwKTsKKyAgICBpZighenJlZyYmKHotPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpIHpyZWc9ei0+cmVnOworICAgIGlmKGNmJiZ4X3RbdCZOUV0hPSdsJyYmKHFyZWd8fChxLT5mbGFncyYoS09OU1R8RFJFRk9CSikpIT1LT05TVCkpIGllcnJvcigwKTsKKyAgICBpZighcXJlZyYmKHEtPmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUJiZpc3F1aWNra29uc3QyKCZxLT52YWwsdCkpeworICAgICAgZW1pdChmLCJcdGFkZHEuJWNcdCIsY2Y/J2wnOnhfdFt0Jk5RXSk7CisgICAgfWVsc2V7CisgICAgICAgIC8qICBoaWVyIG5vY2ggQWJmcmFnZSwgb2IgI2MudyxheCAgICovCisgICAgICBlbWl0KGYsIlx0YWRkLiVjXHQiLGNmPydsJzp4X3RbdCZOUV0pOworICAgIH0KKyAgICBpZihxcmVnKSBlbWl0KGYsIiVzIixtcmVnbmFtZXNbcXJlZ10pOyBlbHNlIGVtaXRfb2JqKGYscSx0KTsKKyAgICBlbWl0KGYsIiwiKTsKKyAgICBpZih6cmVnKSBlbWl0KGYsIiVzIixtcmVnbmFtZXNbenJlZ10pOyBlbHNlIGVtaXRfb2JqKGYseix0KTsKKyAgICBlbWl0KGYsIlxuIik7Cit9CitzdGF0aWMgdm9pZCBzdWIoRklMRSAqZixvYmogKnEsaW50IHFyZWcsb2JqICp6LGludCB6cmVnLGludCB0KQorLyogIGVyemV1Z3QgZWluZSBzdWIgQW53ZWlzdW5nLi4uRGEgc29sbGVuIG1hbCBPcHRpbWllcnVuZ2VuIHJlaW4gICAqLworeworICAgIGlmKGNmJiZ4X3RbdCZOUV0hPSdsJyYmKHFyZWd8fChxLT5mbGFncyYoS09OU1R8RFJFRk9CSikpIT1LT05TVCkpIGllcnJvcigwKTsKKyAgICBpZighenJlZyYmKHotPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpIHpyZWc9ei0+cmVnOworICAgIGlmKHEmJihxLT5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCYmaXNxdWlja2tvbnN0MigmcS0+dmFsLHQpKXsKKyAgICAgIGVtaXQoZiwiXHRzdWJxLiVjXHQiLGNmPydsJzp4X3RbdCZOUV0pOworICAgIH1lbHNleworICAgICAgICAvKiAgaGllciBub2NoIEFiZnJhZ2UsIG9iICNjLncsYXggICAqLworICAgICAgZW1pdChmLCJcdHN1Yi4lY1x0IixjZj8nbCc6eF90W3QmTlFdKTsKKyAgICB9CisgICAgaWYocXJlZykgZW1pdChmLCIlcyIsbXJlZ25hbWVzW3FyZWddKTsgZWxzZSBlbWl0X29iaihmLHEsdCk7CisgICAgZW1pdChmLCIsIik7CisgICAgaWYoenJlZykgZW1pdChmLCIlcyIsbXJlZ25hbWVzW3pyZWddKTsgZWxzZSBlbWl0X29iaihmLHosdCk7CisgICAgZW1pdChmLCJcbiIpOworfQorc3RhdGljIHZvaWQgbXVsdChGSUxFICpmLG9iaiAqcSxpbnQgcXJlZyxvYmogKnosaW50IHpyZWcsIGludCB0LGludCBjLElDICpwKQorLyogIGVyemV1Z3QgZWluZSBtdWx0IEFud2Vpc3VuZy4uLkRhIHNvbGxlbiBtYWwgT3B0aW1pZXJ1bmdlbiByZWluICAqLworLyogIGVyemV1Z3QgYXVjaCBkaXYvbW9kIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgbW9kcmVnOworICBpZighcXJlZyYmKHEtPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpIHFyZWc9cS0+cmVnOworICBpZighenJlZyYmKHotPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpIHpyZWc9ei0+cmVnOworICBpZihjZiYmIXFyZWcpIHtxcmVnPWdldF9yZWcoZiwxLHAsMCk7bW92ZShmLHEsMCwwLHFyZWcsdCk7fQorICBpZigoYz09TVVMVHx8Yz09RElWfHxjPT1NT0QpJiZDUFU8NjgwMjAmJiFjZiYmbXNpemV0YWJbdCZOUV09PTQpeworICAgIGlmKGM9PU1VTFQpeworICAgICAgLyogIGlzdCBkYXMgbWl0IGdldF9yZWcoLiwuLDApIG9rPyBub2NobWFsIHVlYmVyZGVua2VuLi4uICAgKi8KKyAgICAgIC8qICAuLi5kaWUgZ2FuemUgUm91dGluZSBhbSBiZXN0ZW4uLi4gICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgLi4uZXMgd2FyIG5pY2h0LCBkZXNoYWxiIGlzdCBlcyBqZXR6dCBnZWFlbmRlcnQgICAgICAgICAqLworICAgICAgaW50IGR4LGR5LHQxLHQyOworICAgICAgaWYoenJlZz49ZDAmJnpyZWc8PWQ3KXsKKwlkeD16cmVnOworICAgICAgfWVsc2V7CisJZHg9Z2V0X3JlZyhmLDEscCwwKTsKKwltb3ZlKGYseiwwLDAsZHgsdCk7CisgICAgICB9CisgICAgICBpZihxcmVnPj1kMCYmcXJlZzw9ZDcmJnFyZWchPWR4KXsKKwlkeT1xcmVnOworICAgICAgfWVsc2V7CisJZHk9Z2V0X3JlZyhmLDEscCwwKTsKKwltb3ZlKGYscSwwLDAsZHksdCk7CisgICAgICB9CisgICAgICB0MT1nZXRfcmVnKGYsMSxwLDApO3QyPWdldF9yZWcoZiwxLHAsMCk7CisgICAgICBpZih0MT09ZHh8fHQyPT1keHx8dDE9PWR5fHx0Mj09ZHkpIGllcnJvcigwKTsKKyAgICAgIGVtaXQoZiwiXHRtb3ZlLmxcdCVzLCVzXG4iLG1yZWduYW1lc1tkeF0sbXJlZ25hbWVzW3QxXSk7CisgICAgICBlbWl0KGYsIlx0bW92ZS5sXHQlcywlc1xuIixtcmVnbmFtZXNbZHldLG1yZWduYW1lc1t0Ml0pOworICAgICAgZW1pdChmLCJcdHN3YXBcdCVzXG4iLG1yZWduYW1lc1t0MV0pOworICAgICAgZW1pdChmLCJcdHN3YXBcdCVzXG4iLG1yZWduYW1lc1t0Ml0pOworICAgICAgZW1pdChmLCJcdG11bHUud1x0JXMsJXNcbiIsbXJlZ25hbWVzW2R5XSxtcmVnbmFtZXNbdDFdKTsKKyAgICAgIGVtaXQoZiwiXHRtdWx1LndcdCVzLCVzXG4iLG1yZWduYW1lc1tkeF0sbXJlZ25hbWVzW3QyXSk7CisgICAgICBlbWl0KGYsIlx0bXVsdS53XHQlcywlc1xuIixtcmVnbmFtZXNbZHldLG1yZWduYW1lc1tkeF0pOworICAgICAgZW1pdChmLCJcdGFkZC53XHQlcywlc1xuIixtcmVnbmFtZXNbdDJdLG1yZWduYW1lc1t0MV0pOworICAgICAgZW1pdChmLCJcdHN3YXBcdCVzXG4iLG1yZWduYW1lc1t0MV0pOworICAgICAgZW1pdChmLCJcdGNsci53XHQlc1xuIixtcmVnbmFtZXNbdDFdKTsKKyAgICAgIGVtaXQoZiwiXHRhZGQubFx0JXMsJXNcbiIsbXJlZ25hbWVzW3QxXSxtcmVnbmFtZXNbZHhdKTsKKyAgICAgIGlmKHpyZWchPWR4KSBtb3ZlKGYsMCx0MSx6LDAsdCk7CisgICAgfWVsc2UgaWVycm9yKDApOworICAgIHJldHVybjsKKyAgfQorICBpZihjPT1NVUxUKXsKKyAgICAvKiAgZGFzIGR1ZXJmdGUgbnVyIGRlciBBZXN0aGV0aWsgZGllbmVuLi4uICovCisgICAgaWYodCZVTlNJR05FRCkgCisgICAgICBlbWl0KGYsIlx0bXVsdS4lY1x0Iix4X3RbdCZOUV0pOworICAgIGVsc2UgCisgICAgICBlbWl0KGYsIlx0bXVscy4lY1x0Iix4X3RbdCZOUV0pOworICAgIGlmKCh0Jk5RKTw9U0hPUlQpIGNjX3NldD0wOworICB9CisgIGlmKGM9PURJVnx8KGM9PU1PRCYmSVNIV09SRCh0KSkpeworICAgIGlmKHQmVU5TSUdORUQpeworICAgICAgaWYoSVNIV09SRCh0KSkgZW1pdChmLCJcdGFuZC5sXHQjNjU1MzUsJXNcbiIsbXJlZ25hbWVzW3pyZWddKTsKKyAgICAgIGVtaXQoZiwiXHRkaXZ1LiVjXHQiLHhfdFt0Jk5RXSk7CisgICAgfWVsc2V7CisgICAgICBpZihJU0hXT1JEKHQpKSBlbWl0KGYsIlx0ZXh0LmxcdCVzXG4iLG1yZWduYW1lc1t6cmVnXSk7CisgICAgICBlbWl0KGYsIlx0ZGl2cy4lY1x0Iix4X3RbdCZOUV0pOworICAgIH0KKyAgfSAgCisgIGlmKHFyZWcpIAorICAgIGVtaXQoZiwiJXMiLG1yZWduYW1lc1txcmVnXSk7IAorICBlbHNlIAorICAgIGVtaXRfb2JqKGYscSx0KTsKKyAgZW1pdChmLCIsIik7CisgIC8qICBlaWdlbnRsaWNoIG11c3MgenJlZyE9MCBzZWluLi4uICAgICAqLworICBpZih6cmVnKSAKKyAgICBlbWl0KGYsIiVzIixtcmVnbmFtZXNbenJlZ10pOyAKKyAgZWxzZSAKKyAgICBlbWl0X29iaihmLHosdCk7CisgIGVtaXQoZiwiXG4iKTsKKyAgaWYoYz09TU9EKXsKKyAgICBlbWl0KGYsIlx0c3dhcFx0JXNcbiIsbXJlZ25hbWVzW3pyZWddKTsKKyAgICBjY19zZXQ9MDsKKyAgfQorfQorc3RhdGljIElDICphbV9mcmVlZHJlZ1s5XSwqYW1fc2hpZnRkcmVnWzldOworc3RhdGljIElDICphbV9kaXN0X2ljWzldLCphbV9kcmVnX2ljWzldLCphbV91c2VbOV07CisvKiAgYW1fZGlzdF9pYyB1bmQgYW1fZHJlZ19pYyB3ZXJkZW4gYXVjaCBmdWVyIChheCkrIGJlbnV0enQgICAgKi8KK3N0YXRpYyBsb25nIGFtX2Rpc3RbOV0sYW1fZHJlZ1s5XSxhbV9iYXNlWzldLGFtX2luY1s5XSxhbV9za2FsWzldLGFtX2RiYXNlWzldOworI2RlZmluZSBBTVMgc2l6ZW9mKEFkZHJlc3NpbmdNb2RlKQorCitzdGF0aWMgaW50IG1vcHNpemUoSUMgKnAsaW50IHJlZykKKy8qICBMaWVmZXJ0IGRpZSBHcm9lc3NlIGluIEJ5dGVzLCBtaXQgZGVyIGltIElDIGF1ZiAocmVnKSB6dWdlZ3JpZmZlbiB3aXJkLiAqLworeworICAgIGludCBjPXAtPmNvZGU7CisgICAgaWYoYz09QURESTJQfHxjPT1TVUJJRlApeworICAgICAgICBpZigocC0+cTIuZmxhZ3MmUkVHKSYmcC0+cTIucmVnPT1yZWcpCisgICAgICAgICAgICByZXR1cm4gem0ybChzaXpldGFiW3AtPnR5cGYmTlFdKTsKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgfQorICAgIGlmKGM9PUNPTlZFUlQpeworICAgICAgICBpZigocC0+ei5mbGFncyZSRUcpJiZwLT56LnJlZz09cmVnKQorICAgICAgICAgIHJldHVybiB6bTJsKHNpemV0YWJbcC0+dHlwZiZOUV0pOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIHptMmwoc2l6ZXRhYltwLT50eXBmMiZOUV0pOworICAgIH0KKyAgICByZXR1cm4gem0ybChzaXpldGFiW3AtPnR5cGYmTlFdKTsKK30KK3N0YXRpYyB2b2lkIGNsZWFyX2FtKGludCByZWcpCisvKiAgbG9lc2NodCBXZXJ0ZSBmdWVyIGVyd2VpdGVydGUgQWRyZXNzaWVydW5nc2FydGVuIGZ1ZXIgUmVnaXN0ZXIgcmVnICAqLworeworICAgIGlmKHJlZzwwfHxyZWc+ZDcpIGllcnJvcigwKTsKKyAgICBpZihERUJVRyYzMikgcHJpbnRmKCJjbGVhcl9hbSglcylcbiIsbXJlZ25hbWVzW3JlZ10pOworICAgIGlmKHJlZzw9OCl7CisgICAgICAgIGFtX2Rpc3RfaWNbcmVnXT1hbV9kcmVnX2ljW3JlZ109YW1fdXNlW3JlZ109MDsKKyAgICAgICAgYW1fZGlzdFtyZWddPWFtX2RyZWdbcmVnXT1hbV9iYXNlW3JlZ109YW1faW5jW3JlZ109MDsKKyAgICB9ZWxzZXsKKyAgICAgICAgcmVnLT04OworICAgICAgICBhbV9mcmVlZHJlZ1tyZWddPWFtX3NoaWZ0ZHJlZ1tyZWddPTA7CisgICAgICAgIGFtX3NrYWxbcmVnXT1hbV9kYmFzZVtyZWddPTA7CisgICAgfQorfQorc3RhdGljIHZvaWQgbW9kX3JlZyhpbnQgcikKK3sKKyAgaW50IGk7CisgIGZvcihpPTE7aTw9ODtpKyspeworICAgIGlmKCghYW1fdXNlW2ldJiZhbV9iYXNlW2ldPT1yKXx8KGFtX2RyZWdbaV0mMTI3KT09cikKKyAgICAgIGNsZWFyX2FtKGkpOworICB9CisjaWYgMAorICBpZihyPj05JiZyPD0xNil7CisgICAgZm9yKGk9OTtpPD0xNjtpKyspeworICAgICAgaWYoYW1fZGJhc2VbaS04XT09cikKKwljbGVhcl9hbShpKTsKKyAgICB9CisgIH0KKyNlbmRpZgorfQorLyogcmV0dXJuIG5vbi16ZXJvIGlmIElDIGlzIGltcGxlbWVudGVkIGJ5IGEgZnVuY3Rpb24gY2FsbCAqLworc3RhdGljIGludCBpc2xpYmNhbGwoSUMgKnApCit7CisgIGludCBjPXAtPmNvZGUsdD1wLT50eXBmL05ROworICBpZigoYz09RElWfHxjPT1NT0QpJiZDUFU8NjgwMjApCisgICAgcmV0dXJuIDE7CisgIGlmKHQ9PUxMT05HJiZjIT1BREQmJmMhPVNVQiYmYyE9T1ImJmMhPUFORCYmYyE9WE9SJiZjIT1DT01QQVJFKQorICAgIHJldHVybiAxOworICBpZihJU0ZMT0FUKHQpJiZGUFU8PTY4MDAwKQorICAgIHJldHVybiAxOworICBpZihjPT1DT05WRVJUKXsKKyAgICBpZih0PT1MTE9OR3x8SVNGTE9BVCh0KSkgCisgICAgICByZXR1cm4gMTsKKyAgICB0PXAtPnR5cGYyJk5ROworICAgIGlmKHQ9PUxMT05HfHxJU0ZMT0FUKHQpKQorICAgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmV3X3BlZXBob2xlKElDICpmaXJzdCkKK3sKKyAgaW50IGxvY2FsdXNlZD0wLGMscix0LGMyO2xvbmcgc3o7CisgIElDICpwLCpwMjsKKyAgQWRkcmVzc2luZ01vZGUgKmFtOworICBmb3IocD1maXJzdDtwO3A9cC0+bmV4dCl7CisgICAgaW50IGM9cC0+Y29kZTsKKyAgICBpZighbG9jYWx1c2VkKXsKKyAgICAgIGlmKChwLT5xMS5mbGFncyYoVkFSfFJFRykpPT1WQVImJihwLT5xMS52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT5xMS52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikmJnptbGVxKGwyem0oMEwpLHAtPnExLnYtPm9mZnNldCkpCisJbG9jYWx1c2VkPTE7CisgICAgICBpZigocC0+cTIuZmxhZ3MmKFZBUnxSRUcpKT09VkFSJiYocC0+cTIudi0+c3RvcmFnZV9jbGFzcz09QVVUT3x8cC0+cTIudi0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpJiZ6bWxlcShsMnptKDBMKSxwLT5xMi52LT5vZmZzZXQpKQorCWxvY2FsdXNlZD0xOworICAgICAgaWYoKHAtPnouZmxhZ3MmKFZBUnxSRUcpKT09VkFSJiYocC0+ei52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT56LnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKSYmem1sZXEobDJ6bSgwTCkscC0+ei52LT5vZmZzZXQpKQorCWxvY2FsdXNlZD0xOworICAgICAgaWYoREVCVUcmMzImJmxvY2FsdXNlZD09MSkgcHJpbnRmKCJsb2NhbHVzZWQ9MVxuIik7CisgICAgfQorICAgIC8qIC0oYXgpICovCisgICAgaWYoYz09U1VCSUZQJiZpc3JlZyhxMSkmJmlzcmVnKHopJiZwLT5xMS5yZWc9PXAtPnoucmVnJiZwLT5xMS5yZWc8PTgmJmlzY29uc3QocTIpKXsKKyAgICAgIHI9cC0+cTEucmVnOworICAgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHEydHlwKHApKTsKKyAgICAgIHN6PXptMmwodm1heCk7CisgICAgICBpZihzej09MXx8c3o9PTJ8fHN6PT00fHxzej09OCl7CisJZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpeworCSAgYzI9cDItPmNvZGU7CisJICBpZighcDItPnExLmFtJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTEucmVnPT1yJiYoIShwMi0+cTIuZmxhZ3MmUkVHKXx8cDItPnEyLnJlZyE9cikmJighKHAyLT56LmZsYWdzJlJFRyl8fHAyLT56LnJlZyE9cikmJihjMiE9Q09OVkVSVHx8KHExdHlwKHAyKSZOUSk8PSh6dHlwKHAyKSZOUSkpKXsKKwkgICAgdD0ocTF0eXAocDIpJk5RKTsKKwkgICAgaWYoKElTSU5UKHQpfHxJU1BPSU5URVIodCkpJiZ0IT1MTE9ORyYmem1lcXRvKHNpemV0YWJbcTF0eXAocDIpJk5RXSxsMnptKHN6KSkmJiFpc2xpYmNhbGwocDIpKXsKKwkgICAgICBwMi0+cTEuYW09YW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworCSAgICAgIHAyLT5xMS52YWwudm1heD1sMnptKDBMKTsKKwkgICAgICBhbS0+YmFzZXJlZz1yOworCSAgICAgIGFtLT5kaXN0PTA7CisJICAgICAgYW0tPnNrYWw9LTI7CisJICAgICAgYW0tPmRyZWc9MDsKKwkgICAgICBwLT5jb2RlPU5PUDsKKwkgICAgICBwLT5xMS5mbGFncz1wLT5xMi5mbGFncz1wLT56LmZsYWdzPTA7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIH0KKwkgIGlmKCFwMi0+cTIuYW0mJihwMi0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT5xMi5yZWc9PXImJighKHAyLT5xMS5mbGFncyZSRUcpfHxwMi0+cTEucmVnIT1yKSYmKCEocDItPnouZmxhZ3MmUkVHKXx8cDItPnoucmVnIT1yKSl7CisJICAgIHQ9KHEydHlwKHAyKSZOUSk7CisJICAgIGlmKChJU0lOVCh0KXx8SVNQT0lOVEVSKHQpKSYmdCE9TExPTkcmJnptZXF0byhzaXpldGFiW3EydHlwKHAyKSZOUV0sbDJ6bShzeikpJiYhaXNsaWJjYWxsKHAyKSl7CisJICAgICAgcDItPnEyLmFtPWFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKKwkgICAgICBwMi0+cTIudmFsLnZtYXg9bDJ6bSgwTCk7CisJICAgICAgYW0tPmJhc2VyZWc9cjsKKwkgICAgICBhbS0+ZGlzdD0wOworCSAgICAgIGFtLT5za2FsPS0yOworCSAgICAgIGFtLT5kcmVnPTA7CisJICAgICAgcC0+Y29kZT1OT1A7CisJICAgICAgcC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICB9CisJICBpZighcDItPnouYW0mJihwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnoucmVnPT1yJiYoIShwMi0+cTIuZmxhZ3MmUkVHKXx8cDItPnEyLnJlZyE9cikmJighKHAyLT5xMS5mbGFncyZSRUcpfHxwMi0+cTEucmVnIT1yKSl7CisJICAgIHQ9KHp0eXAocDIpJk5RKTsKKwkgICAgaWYoKElTSU5UKHQpfHxJU1BPSU5URVIodCkpJiZ0IT1MTE9ORyYmem1lcXRvKHNpemV0YWJbenR5cChwMikmTlFdLGwyem0oc3opKSYmIWlzbGliY2FsbChwMikpeworCSAgICAgIHAyLT56LmFtPWFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKKwkgICAgICBwMi0+ei52YWwudm1heD1sMnptKDBMKTsKKwkgICAgICBhbS0+YmFzZXJlZz1yOworCSAgICAgIGFtLT5kaXN0PTA7CisJICAgICAgYW0tPnNrYWw9LTI7CisJICAgICAgYW0tPmRyZWc9MDsKKwkgICAgICBwLT5jb2RlPU5PUDsKKwkgICAgICBwLT5xMS5mbGFncz1wLT5xMi5mbGFncz1wLT56LmZsYWdzPTA7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIH0KKwkgIGlmKGMyPT1DQUxMfHxjMj09TEFCRUx8fChjMj49QkVRJiZjMjw9QlJBKSkgYnJlYWs7CisJICBpZigocDItPnExLmZsYWdzJlJFRykmJnAyLT5xMS5yZWc9PXIpIGJyZWFrOworCSAgaWYoKHAyLT5xMi5mbGFncyZSRUcpJiZwMi0+cTIucmVnPT1yKSBicmVhazsKKwkgIGlmKChwMi0+ei5mbGFncyZSRUcpJiZwMi0+ei5yZWc9PXIpIGJyZWFrOworCX0KKyAgICAgIH0KKyAgICB9CisgICAgLyogKGF4KSsgaW4gcTEgKi8KKyAgICBpZighcC0+cTEuYW0mJihwLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcC0+cTEucmVnPD04JiYoYyE9Q09OVkVSVHx8KHExdHlwKHApJk5RKTw9KHp0eXAocCkmTlEpKSl7CisgICAgICB0PShxMXR5cChwKSZOUSk7CisgICAgICBzej16bTJsKHNpemV0YWJbdF0pOworICAgICAgcj1wLT5xMS5yZWc7CisgICAgICBpZigoc3o9PTF8fHN6PT0yfHxzej09NHx8c3o9PTgpJiYoSVNJTlQodCl8fElTUE9JTlRFUih0KSkmJnQhPUxMT05HJiYoIShwLT5xMi5mbGFncyZSRUcpfHxwLT5xMi5yZWchPXIpJiYoIShwLT56LmZsYWdzJlJFRyl8fHAtPnoucmVnIT1yKSYmKCFwLT5xMi5hbXx8cC0+cTIuYW0tPmJhc2VyZWchPXIpJiYoIXAtPnouYW18fHAtPnouYW0tPmJhc2VyZWchPXIpKXsKKwlmb3IocDI9cC0+bmV4dDtwMjtwMj1wMi0+bmV4dCl7CisJICBjMj1wMi0+Y29kZTsKKwkgIGlmKGMyPT1BRERJMlAmJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09ciYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT56LnJlZz09ciYmKHAyLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCYmIWlzbGliY2FsbChwKSl7CisJICAgIGV2YWxfY29uc3QoJnAyLT5xMi52YWwscTJ0eXAocDIpKTsKKwkgICAgaWYoem1lcXRvKHZtYXgsbDJ6bShzeikpKXsKKwkgICAgICBwLT5xMS5hbT1hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CisJICAgICAgcC0+cTEudmFsLnZtYXg9bDJ6bSgwTCk7CisJICAgICAgYW0tPmJhc2VyZWc9cjsKKwkgICAgICBhbS0+ZGlzdD0wOworCSAgICAgIGFtLT5za2FsPS0xOworCSAgICAgIGFtLT5kcmVnPTA7CisJICAgICAgcDItPmNvZGU9Tk9QOworCSAgICAgIHAyLT5xMS5mbGFncz1wMi0+cTIuZmxhZ3M9cDItPnouZmxhZ3M9MDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgfQorCSAgaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKKwkgIGlmKChwMi0+cTEuZmxhZ3MmUkVHKSYmcDItPnExLnJlZz09cikgYnJlYWs7CisJICBpZigocDItPnEyLmZsYWdzJlJFRykmJnAyLT5xMi5yZWc9PXIpIGJyZWFrOworCSAgaWYoKHAyLT56LmZsYWdzJlJFRykmJnAyLT56LnJlZz09cikgYnJlYWs7CisJICBpZihwMi0+cTEuYW0mJnAyLT5xMS5hbS0+YmFzZXJlZz09cikgYnJlYWs7CisJICBpZihwMi0+cTIuYW0mJnAyLT5xMi5hbS0+YmFzZXJlZz09cikgYnJlYWs7CisJICBpZihwMi0+ei5hbSYmcDItPnouYW0tPmJhc2VyZWc9PXIpIGJyZWFrOworCX0KKyAgICAgIH0KKyAgICB9CisgICAgLyogKGF4KSsgaW4gcTIgKi8KKyAgICBpZighcC0+cTIuYW0mJihwLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcC0+cTIucmVnPD04KXsKKyAgICAgIHQ9KHEydHlwKHApJk5RKTsKKyAgICAgIHN6PXptMmwoc2l6ZXRhYlt0XSk7CisgICAgICByPXAtPnEyLnJlZzsKKyAgICAgIGlmKChzej09MXx8c3o9PTJ8fHN6PT00fHxzej09OCkmJihJU0lOVCh0KXx8SVNQT0lOVEVSKHQpKSYmdCE9TExPTkcmJighKHAtPnExLmZsYWdzJlJFRyl8fHAtPnExLnJlZyE9cikmJighKHAtPnouZmxhZ3MmUkVHKXx8cC0+ei5yZWchPXIpJiYoIXAtPnExLmFtfHxwLT5xMS5hbS0+YmFzZXJlZyE9cikmJighcC0+ei5hbXx8cC0+ei5hbS0+YmFzZXJlZyE9cikpeworCWZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKwkgIGMyPXAyLT5jb2RlOworCSAgaWYoYzI9PUFEREkyUCYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1yJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnoucmVnPT1yJiYocDItPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUJiYhaXNsaWJjYWxsKHApKXsKKwkgICAgZXZhbF9jb25zdCgmcDItPnEyLnZhbCxxMnR5cChwMikpOworCSAgICBpZih6bWVxdG8odm1heCxsMnptKHN6KSkpeworCSAgICAgIHAtPnEyLmFtPWFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKKwkgICAgICBwLT5xMi52YWwudm1heD1sMnptKDBMKTsKKwkgICAgICBhbS0+YmFzZXJlZz1yOworCSAgICAgIGFtLT5kaXN0PTA7CisJICAgICAgYW0tPnNrYWw9LTE7CisJICAgICAgYW0tPmRyZWc9MDsKKwkgICAgICBwMi0+Y29kZT1OT1A7CisJICAgICAgcDItPnExLmZsYWdzPXAyLT5xMi5mbGFncz1wMi0+ei5mbGFncz0wOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICB9CisJICBpZihjMj09Q0FMTHx8YzI9PUxBQkVMfHwoYzI+PUJFUSYmYzI8PUJSQSkpIGJyZWFrOworCSAgaWYoKHAyLT5xMS5mbGFncyZSRUcpJiZwMi0+cTEucmVnPT1yKSBicmVhazsKKwkgIGlmKChwMi0+cTIuZmxhZ3MmUkVHKSYmcDItPnEyLnJlZz09cikgYnJlYWs7CisJICBpZigocDItPnouZmxhZ3MmUkVHKSYmcDItPnoucmVnPT1yKSBicmVhazsKKwkgIGlmKHAyLT5xMS5hbSYmcDItPnExLmFtLT5iYXNlcmVnPT1yKSBicmVhazsKKwkgIGlmKHAyLT5xMi5hbSYmcDItPnEyLmFtLT5iYXNlcmVnPT1yKSBicmVhazsKKwkgIGlmKHAyLT56LmFtJiZwMi0+ei5hbS0+YmFzZXJlZz09cikgYnJlYWs7CisJfQorICAgICAgfQorICAgIH0KKyAgICAvKiAoYXgpKyBpbiB6ICovCisgICAgaWYoIXAtPnouYW0mJihwLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwLT56LnJlZzw9OCl7CisgICAgICB0PSh6dHlwKHApJk5RKTsKKyAgICAgIHN6PXptMmwoc2l6ZXRhYlt0XSk7CisgICAgICByPXAtPnoucmVnOworICAgICAgaWYoKHN6PT0xfHxzej09Mnx8c3o9PTR8fHN6PT04KSYmKElTSU5UKHQpfHxJU1BPSU5URVIodCkpJiZ0IT1MTE9ORyYmKCEocC0+cTEuZmxhZ3MmUkVHKXx8cC0+cTEucmVnIT1yKSYmKCEocC0+cTIuZmxhZ3MmUkVHKXx8cC0+cTIucmVnIT1yKSYmKCFwLT5xMi5hbXx8cC0+cTIuYW0tPmJhc2VyZWchPXIpJiYoIXAtPnExLmFtfHxwLT5xMS5hbS0+YmFzZXJlZyE9cikpeworCWZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKwkgIGMyPXAyLT5jb2RlOworCSAgaWYoYzI9PUFEREkyUCYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1yJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnoucmVnPT1yJiYocDItPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUJiYhaXNsaWJjYWxsKHApKXsKKwkgICAgZXZhbF9jb25zdCgmcDItPnEyLnZhbCxxMnR5cChwMikpOworCSAgICBpZih6bWVxdG8odm1heCxsMnptKHN6KSkpeworCSAgICAgIHAtPnouYW09YW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworCSAgICAgIHAtPnoudmFsLnZtYXg9bDJ6bSgwTCk7CisJICAgICAgYW0tPmJhc2VyZWc9cjsKKwkgICAgICBhbS0+ZGlzdD0wOworCSAgICAgIGFtLT5za2FsPS0xOworCSAgICAgIGFtLT5kcmVnPTA7CisJICAgICAgcDItPmNvZGU9Tk9QOworCSAgICAgIHAyLT5xMS5mbGFncz1wMi0+cTIuZmxhZ3M9cDItPnouZmxhZ3M9MDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgfQorCSAgaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKKwkgIGlmKChwMi0+cTEuZmxhZ3MmUkVHKSYmcDItPnExLnJlZz09cikgYnJlYWs7CisJICBpZigocDItPnEyLmZsYWdzJlJFRykmJnAyLT5xMi5yZWc9PXIpIGJyZWFrOworCSAgaWYoKHAyLT56LmZsYWdzJlJFRykmJnAyLT56LnJlZz09cikgYnJlYWs7CisJICBpZihwMi0+cTEuYW0mJnAyLT5xMS5hbS0+YmFzZXJlZz09cikgYnJlYWs7CisJICBpZihwMi0+cTIuYW0mJnAyLT5xMi5hbS0+YmFzZXJlZz09cikgYnJlYWs7CisJICBpZihwMi0+ei5hbSYmcDItPnouYW0tPmJhc2VyZWc9PXIpIGJyZWFrOworCX0KKyAgICAgIH0KKyAgICB9CisgICAgLyogZChheCkgKCtkKGF4LGR5KSkgKi8KKyAgICBpZigoYz09QURESTJQfHxjPT1TVUJJRlApJiZpc3JlZyh6KSYmcC0+ei5yZWc8PTgmJihwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisgICAgICBpbnQgYmFzZSxpZHg9LTE7em1heCBvZjtvYmogKm87CisgICAgICBJQyAqaWR4X2ljPTAsKmZyZWVfaWR4PTAsKmZyZWVfYmFzZT0wLCp1c2U9MDsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxwLT50eXBmKTsKKyAgICAgIGlmKGM9PVNVQklGUCkgb2Y9em1zdWIobDJ6bSgwTCksdm1heCk7IGVsc2Ugb2Y9dm1heDsKKyAgICAgIGlmKENQVT49NjgwMjB8fCh6bWxlcShsMnptKC0zMjc2OEwpLHZtYXgpJiZ6bWxlcSh2bWF4LGwyem0oMzI3NjdMKSkpKXsKKwlyPXAtPnoucmVnOworCWlmKGlzcmVnKHExKSYmcC0+cTEucmVnPD04KSBiYXNlPXAtPnExLnJlZzsgZWxzZSBiYXNlPXI7CisJbz0wOworCWZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKwkgIGMyPXAyLT5jb2RlOworCSAgaWYoIWlkeF9pYyYmYzI9PUFEREkyUCYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1yJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnoucmVnPT1yJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMi5yZWc+PWQwJiZwMi0+cTIucmVnPGZwMCl7CisJICAgIGlmKENQVT49NjgwMjB8fCh6bWxlcShvZixsMnptKDEyN0wpKSYmem1sZXEobDJ6bSgtMTI4TCksb2YpKSl7CisJICAgICAgaWR4PXAyLT5xMi5yZWc7CisJICAgICAgaWR4X2ljPXAyOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICB9CisJICBpZihjMj09Q0FMTHx8YzI9PUxBQkVMfHwoYzI+PUJFUSYmYzI8PUJSQSkpIGJyZWFrOworCSAgaWYoIXVzZSYmaWR4X2ljJiZjMj09RlJFRVJFRyYmcDItPnExLnJlZz09aWR4KXsKKwkgICAgZnJlZV9pZHg9cDI7CisJICAgIGNvbnRpbnVlOworCSAgfQorCSAgaWYoIXVzZSYmYzI9PUZSRUVSRUcmJnAyLT5xMS5yZWc9PWJhc2UpeworCSAgICBmcmVlX2Jhc2U9cDI7CisJICAgIGNvbnRpbnVlOworCSAgfQorCSAgaWYoaWR4X2ljKXsKKwkgICAgaWYoKHAyLT5xMS5mbGFncyZSRUcpJiZwMi0+cTEucmVnPT1pZHgpIGJyZWFrOworCSAgICBpZigocDItPnEyLmZsYWdzJlJFRykmJnAyLT5xMi5yZWc9PWlkeCkgYnJlYWs7CisJICAgIGlmKChwMi0+ei5mbGFncyZSRUcpJiZwMi0+ei5yZWc9PWlkeCkgYnJlYWs7CisJICAgIGlmKHAyLT5xMS5hbSYmKHAyLT5xMS5hbS0+ZHJlZyYxMjcpPT1pZHgpIGJyZWFrOworCSAgICBpZihwMi0+cTIuYW0mJihwMi0+cTIuYW0tPmRyZWcmMTI3KT09aWR4KSBicmVhazsKKwkgICAgaWYocDItPnouYW0mJihwMi0+ei5hbS0+ZHJlZyYxMjcpPT1pZHgpIGJyZWFrOworCSAgICBpZihjMj09QUxMT0NSRUcmJnAyLT5xMS5yZWc9PWlkeCkgYnJlYWs7CisJICB9CisKKwkgIGlmKCFwMi0+cTEuYW0mJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09ciYmYzI9PVBVU0gpeworCSAgICBpZihvKSBicmVhazsKKwkgICAgbz0mcDItPnExOworCSAgICB1c2U9cDI7CisJICAgIGNvbnRpbnVlOworCSAgfQorCisJICBpZihjMiE9RlJFRVJFRyYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1yKSBicmVhazsKKwkgIGlmKGMyIT1GUkVFUkVHJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMi5yZWc9PXIpIGJyZWFrOworCSAgaWYoYzIhPUNBTEwmJihjMjxMQUJFTHx8YzI+QlJBKS8qJiZjMiE9QUREUkVTUyovKXsKKwkgICAgaWYoIXAyLT5xMS5hbSYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnExLnJlZz09cil7CisJICAgICAgaWYobykgYnJlYWs7CisJICAgICAgbz0mcDItPnExOworCSAgICAgIHVzZT1wMjsKKwkgICAgfQorCSAgICBpZighcDItPnEyLmFtJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTIucmVnPT1yKXsKKwkgICAgICBpZihvKSBicmVhazsKKwkgICAgICBvPSZwMi0+cTI7CisJICAgICAgdXNlPXAyOworCSAgICB9CisJICAgIGlmKCFwMi0+ei5hbSYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+ei5yZWc9PXIpeworCisJICAgICAgaWYobykgYnJlYWs7CisJICAgICAgaWYocDItPnouZmxhZ3MmJihpZHg9PWQwfHxpZHg9PWQxKSYmRlBVPD02ODAwMCYmSVNGTE9BVCh6dHlwKHAyKSkmJiEocDItPnEyLmZsYWdzPT0wJiZjMiE9Q09OVkVSVCkpIGJyZWFrOworCSAgICAgIG89JnAyLT56OworCSAgICAgIHVzZT1wMjsKKwkgICAgfQorCSAgfQorCSAgaWYoYzI9PUZSRUVSRUd8fChwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKwkgICAgaW50IG07CisJICAgIGlmKGMyPT1GUkVFUkVHKQorCSAgICAgIG09cDItPnExLnJlZzsKKwkgICAgZWxzZQorCSAgICAgIG09cDItPnoucmVnOworCSAgICBpZihtPT1yKXsKKwkgICAgICBpZihvKXsKKwkJby0+YW09YW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworCQlvLT52YWwudm1heD1sMnptKDBMKTsKKwkJYW0tPmJhc2VyZWc9YmFzZTsKKwkJYW0tPmRpc3Q9em0ybChvZik7CisJCWFtLT5za2FsPTA7CisJCWlmKGZyZWVfYmFzZSkgbW92ZV9JQyh1c2UsZnJlZV9iYXNlKTsKKwkJaWYoaWR4X2ljKXsKKwkJICBhbS0+ZHJlZz1pZHg7CisJCSAgaWYoSVNIV09SRChpZHhfaWMtPnR5cGYpKSBhbS0+ZHJlZ3w9MTI4OworCQkgIGlmKGZyZWVfaWR4KSBtb3ZlX0lDKHVzZSxmcmVlX2lkeCk7CisJCSAgaWR4X2ljLT5jb2RlPU5PUDsKKwkJICBpZHhfaWMtPnExLmZsYWdzPWlkeF9pYy0+cTIuZmxhZ3M9aWR4X2ljLT56LmZsYWdzPTA7CisJCX1lbHNlCisJCSAgYW0tPmRyZWc9MDsKKwkJaWYoaXNyZWcocTEpJiZwLT5xMS5yZWc8PTgpeworCQkgIHAtPmNvZGU9Yz1OT1A7cC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworCQl9ZWxzZXsKKwkJICBwLT5jb2RlPWM9QVNTSUdOO3AtPnEyLmZsYWdzPTA7CisJCSAgcC0+dHlwZj1wLT50eXBmMjtwLT5xMi52YWwudm1heD1zaXpldGFiW3AtPnR5cGYyJk5RXTsKKwkJfQorCQlpZighKG8tPmZsYWdzJkRSRUZPQkopKXsKKwkJICBvLT5mbGFnc3w9RFJFRk9CSjsKKwkJICBpZih1c2UtPmNvZGU9PVBVU0gpCisJCSAgICB1c2UtPmNvZGU9UEVBOworCQkgIGVsc2UgaWYodXNlLT5jb2RlPT1BU1NJR04pCisJCSAgICB1c2UtPmNvZGU9TEVBOworCQkgIGVsc2UKKwkJICAgIGllcnJvcigwKTsKKwkJfQorCSAgICAgIH0KKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgICBpZihjMiE9RlJFRVJFRyYmbT09YmFzZSkgYnJlYWs7CisJICAgIGNvbnRpbnVlOworCSAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8qIChheCxkeSkgKCtkKGF4LGR5KSkgKi8KKyAgICBpZihjPT1BRERJMlAmJmlzcmVnKHEyKSYmcC0+cTIucmVnPj1kMCYmaXNyZWcoeikmJnAtPnoucmVnPD04JiYoaXNyZWcocTEpfHxwLT5xMi5yZWchPXAtPnoucmVnKSl7CisgICAgICBpbnQgYmFzZSxpZHg7b2JqICpvOworICAgICAgbG9uZyBkaXN0PTA7CisgICAgICBJQyAqZnJlZV9pZHg9MCwqZnJlZV9iYXNlPTAsKnVzZT0wLCpvZmY9MDsKKyAgICAgIHI9cC0+ei5yZWc7aWR4PXAtPnEyLnJlZzsKKyAgICAgIGlmKGlzcmVnKHExKSYmcC0+cTEucmVnPD04KSBiYXNlPXAtPnExLnJlZzsgZWxzZSBiYXNlPXI7CisgICAgICBvPTA7CisgICAgICBmb3IocDI9cC0+bmV4dDtwMjtwMj1wMi0+bmV4dCl7CisgICAgICAgIGMyPXAyLT5jb2RlOworCWlmKCFvZmYmJihjMj09QURESTJQfHxjMj09U1VCSUZQKSYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1yJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnoucmVnPT1yJiYocDItPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKwkgIGV2YWxfY29uc3QoJnAyLT5xMi52YWwscDItPnR5cGYpOworCSAgaWYoYzI9PVNVQklGUCkgdm1heD16bXN1YihsMnptKDBMKSx2bWF4KTsKKwkgIGlmKENQVT49NjgwMjB8fCh6bWxlcSh2bWF4LGwyem0oMTI3TCkpJiZ6bWxlcShsMnptKC0xMjhMKSx2bWF4KSkpeworCSAgICBkaXN0PXptMmwodm1heCk7CisJICAgIG9mZj1wMjsKKwkgICAgY29udGludWU7CisJICB9CisJfQorCQorICAgICAgICBpZihjMj09Q0FMTHx8YzI9PUxBQkVMfHwoYzI+PUJFUSYmYzI8PUJSQSkpIGJyZWFrOworCisKKworCWlmKCFwMi0+cTEuYW0mJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09ciYmYzI9PVBVU0gpeworCSAgaWYobykgYnJlYWs7CisKKwkgIG89JnAyLT5xMTsKKwkgIHVzZT1wMjsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgICBpZihjMiE9RlJFRVJFRyYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1yKSBicmVhazsKKyAgICAgICAgaWYoYzIhPUZSRUVSRUcmJihwMi0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnEyLnJlZz09cikgYnJlYWs7CisgICAgICAgIGlmKChwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+ei5yZWc9PWlkeCYmaWR4IT1yKSBicmVhazsKKwlpZihjMj09QUxMT0NSRUcmJihwLT5xMS5yZWc9PWlkeHx8cC0+cTEucmVnPT1iYXNlKSkgYnJlYWs7CisJaWYoIXVzZSYmYzI9PUZSRUVSRUcmJnAyLT5xMS5yZWc9PWJhc2UpIGZyZWVfYmFzZT1wMjsKKwlpZighdXNlJiZjMj09RlJFRVJFRyYmcDItPnExLnJlZz09aWR4KSBmcmVlX2lkeD1wMjsKKworCisgICAgICAgIGlmKGMyIT1DQUxMJiYoYzI8TEFCRUx8fGMyPkJSQSkvKiYmYzIhPUFERFJFU1MqLyl7CisgICAgICAgICAgaWYoIXAyLT5xMS5hbSYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnExLnJlZz09cil7CisgICAgICAgICAgICBpZihvfHwocTF0eXAocDIpJk5RKT09TExPTkcpIGJyZWFrOworICAgICAgICAgICAgbz0mcDItPnExO3VzZT1wMjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYoIXAyLT5xMi5hbSYmKHAyLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnEyLnJlZz09cil7CisgICAgICAgICAgICBpZihvfHwocTJ0eXAocDIpJk5RKT09TExPTkcpIGJyZWFrOworICAgICAgICAgICAgbz0mcDItPnEyO3VzZT1wMjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYoIXAyLT56LmFtJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT56LnJlZz09cil7CisgICAgICAgICAgICBpZihvfHwoenR5cChwMikmTlEpPT1MTE9ORykgYnJlYWs7CisJICAgIGlmKHAyLT56LmZsYWdzJiYoaWR4PT1kMHx8aWR4PT1kMSkmJkZQVTw9NjgwMDAmJklTRkxPQVQoenR5cChwMikpJiYhKHAyLT5xMi5mbGFncz09MCYmYzIhPUNPTlZFUlQpKSBicmVhazsKKworICAgICAgICAgICAgbz0mcDItPno7dXNlPXAyOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihjMj09RlJFRVJFR3x8KHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpeworICAgICAgICAgIGludCBtOworICAgICAgICAgIGlmKGMyPT1GUkVFUkVHKQorICAgICAgICAgICAgbT1wMi0+cTEucmVnOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG09cDItPnoucmVnOworICAgICAgICAgIGlmKG09PXIpeworCSAgICAvKiBkbyBub3QgdXNlIGFkZHJlc3NpbmcgbW9kZSBmb3IgbGliY2FsbHMgKi8KKwkgICAgaWYoRlBVPD02ODAwMCYmbyYmbz09JnVzZS0+eiYmKElTRkxPQVQodXNlLT50eXBmKXx8SVNGTE9BVCh1c2UtPnR5cGYyKSkmJnVzZS0+Y29kZSE9QVNTSUdOKQorCSAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYobyl7CisgICAgICAgICAgICAgIG8tPmFtPWFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKKwkgICAgICBvLT52YWwudm1heD1sMnptKDBMKTsKKyAgICAgICAgICAgICAgYW0tPmJhc2VyZWc9YmFzZTsKKyAgICAgICAgICAgICAgYW0tPmRyZWc9aWR4OworCSAgICAgIGFtLT5kaXN0PWRpc3Q7CisJICAgICAgYW0tPnNrYWw9MDsKKwkgICAgICBpZihJU0hXT1JEKHEydHlwKHApKSkgYW0tPmRyZWd8PTEyODsKKwkgICAgICBpZihpc3JlZyhxMSkmJnAtPnExLnJlZzw9OCl7CisJCXAtPmNvZGU9Yz1OT1A7cC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworCSAgICAgIH1lbHNleworCQlwLT5jb2RlPWM9QVNTSUdOO3AtPnEyLmZsYWdzPTA7CisJCXAtPnR5cGY9cC0+dHlwZjI7cC0+cTIudmFsLnZtYXg9c2l6ZXRhYltwLT50eXBmMiZOUV07CisJICAgICAgfQorCSAgICAgIGlmKG9mZil7CisJCW9mZi0+Y29kZT1OT1A7CisJCW9mZi0+cTEuZmxhZ3M9b2ZmLT5xMi5mbGFncz1vZmYtPnouZmxhZ3M9MDsKKwkgICAgICB9CisJICAgICAgaWYoIXVzZSkgaWVycm9yKDApOworCSAgICAgIGlmKGZyZWVfaWR4KSBtb3ZlX0lDKHVzZSxmcmVlX2lkeCk7CisJICAgICAgaWYoZnJlZV9iYXNlKSBtb3ZlX0lDKHVzZSxmcmVlX2Jhc2UpOworCSAgICAgIGlmKGZyZWVfaWR4JiZ1c2UtPm5leHQhPWZyZWVfaWR4JiZ1c2UtPm5leHQtPm5leHQhPWZyZWVfaWR4KSBpZXJyb3IoMCk7CisJICAgICAgaWYoZnJlZV9iYXNlJiZ1c2UtPm5leHQhPWZyZWVfYmFzZSYmdXNlLT5uZXh0LT5uZXh0IT1mcmVlX2Jhc2UpIGllcnJvcigwKTsKKwkgICAgICBpZighKG8tPmZsYWdzJkRSRUZPQkopKXsKKwkJby0+ZmxhZ3N8PURSRUZPQko7CisJCWlmKHVzZS0+Y29kZT09UFVTSCkKKwkJICB1c2UtPmNvZGU9UEVBOworCQllbHNlIGlmKHVzZS0+Y29kZT09QVNTSUdOKQorCQkgIHVzZS0+Y29kZT1MRUE7CisJCWVsc2UKKwkJICBpZXJyb3IoMCk7CisJICAgICAgfQkJICAgCisJICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKGMyIT1GUkVFUkVHJiZtPT1iYXNlKSBicmVhazsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAKKworICB9CisKKyAgLyogZG8gYW4gYWRkaXRpb25hbCBwYXNzIHRvIHNlYXJjaCBmb3Igc2NhbGVkIGFkZHJlc3NpbmctbW9kZXMgKi8KKyAgaWYoQ1BVPj02ODAyMCl7CisgICAgZm9yKHA9Zmlyc3Q7cDtwPXAtPm5leHQpeworICAgICAgYz1wLT5jb2RlO3Q9cC0+dHlwZjsKKyAgICAgIGlmKChjPT1NVUxUfHxjPT1MU0hJRlQpJiZpc2NvbnN0KHEyKSYmaXNyZWcoeikmJnAtPnoucmVnPj1kMCYmcC0+ei5yZWc8PWQ3JiZJU0lOVCh0KSYmKHQmTlEpPD1MT05HKXsKKwl1bnNpZ25lZCBsb25nIHVsOworCXI9cC0+ei5yZWc7CisJZXZhbF9jb25zdCgmcC0+cTIudmFsLHEydHlwKHApKTsKKwl1bD16dW0ydWwodnVtYXgpOworCWlmKGM9PUxTSElGVCl7CisJICBpZih1bDw9MykKKwkgICAgdWw9MTw8dWw7CisJICBlbHNlCisJICAgIHVsPTA7CisJfQorCWlmKHVsPT0yfHx1bD09NHx8dWw9PTgpeworCSAgQWRkcmVzc2luZ01vZGUgKmFtdXNlPTA7CisJICBJQyAqZnJlZV9zcmM9MCwqZnJlZV9yc3JjPTAsKnVzZT0wOworCSAgaW50IHNyY19tb2Q9MDsKKwkgIGZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKwkgICAgYzI9cDItPmNvZGU7CisJICAgIGlmKCF1c2UmJnAyLT5xMS5hbSYmcDItPnExLmFtLT5za2FsPT0wJiYocDItPnExLmFtLT5kcmVnJjEyNyk9PXImJighcDItPnEyLmFtfHwocDItPnEyLmFtLT5kcmVnJjEyNykhPXIpJiYoIXAyLT56LmFtfHwocDItPnouYW0tPmRyZWcmMTI3KSE9cikmJighKHAyLT5xMi5mbGFncyZSRUcpfHxwMi0+cTIuZmxhZ3MhPXIpJiYoIShwMi0+ei5mbGFncyZSRUcpfHxwMi0+ei5mbGFncyE9cikpeworCSAgICAgIGFtdXNlPXAyLT5xMS5hbTsKKwkgICAgICB1c2U9cDI7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgICAgaWYoIXVzZSYmcDItPnEyLmFtJiZwMi0+cTIuYW0tPnNrYWw9PTAmJihwMi0+cTIuYW0tPmRyZWcmMTI3KT09ciYmKCFwMi0+cTEuYW18fChwMi0+cTEuYW0tPmRyZWcmMTI3KSE9cikmJighcDItPnouYW18fChwMi0+ei5hbS0+ZHJlZyYxMjcpIT1yKSYmKCEocDItPnExLmZsYWdzJlJFRyl8fHAyLT5xMS5mbGFncyE9cikmJighKHAyLT56LmZsYWdzJlJFRyl8fHAyLT56LmZsYWdzIT1yKSl7CisJICAgICAgYW11c2U9cDItPnEyLmFtOworCSAgICAgIHVzZT1wMjsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgICBpZighdXNlJiZwMi0+ei5hbSYmcDItPnouYW0tPnNrYWw9PTAmJihwMi0+ei5hbS0+ZHJlZyYxMjcpPT1yJiYoIXAyLT5xMi5hbXx8KHAyLT5xMi5hbS0+ZHJlZyYxMjcpIT1yKSYmKCFwMi0+cTEuYW18fChwMi0+cTEuYW0tPmRyZWcmMTI3KSE9cikmJighKHAyLT5xMi5mbGFncyZSRUcpfHxwMi0+cTIuZmxhZ3MhPXIpJiYoIShwMi0+ei5mbGFncyZSRUcpfHxwMi0+ei5mbGFncyE9cikpeworCSAgICAgIGFtdXNlPXAyLT56LmFtOworCSAgICAgIHVzZT1wMjsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgICBpZighdXNlJiZjMj09RlJFRVJFRyYmcDItPnExLnJlZz09cil7CisJICAgICAgZnJlZV9zcmM9cDI7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgICAgaWYoIXVzZSYmYzI9PUZSRUVSRUcmJmlzcmVnKHExKSYmcC0+cTEucmVnPj1kMCYmcC0+cTEucmVnPD1kNyYmcDItPnExLnJlZz09cC0+cTEucmVnKXsKKwkgICAgICBmcmVlX3JzcmM9cDI7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgICAgaWYodXNlJiYoKGMyPT1GUkVFUkVHJiZwMi0+cTEucmVnPT1yKXx8KChwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+ei5yZWc9PXIpKSl7CisJICAgICAgYW11c2UtPnNrYWw9dWw7CisJICAgICAgaWYoIXNyY19tb2QmJmlzcmVnKHExKSYmcC0+cTEucmVnPj1kMCYmcC0+cTEucmVnPD1kNyl7CisJCWFtdXNlLT5kcmVnPXAtPnExLnJlZzsKKwkJcC0+Y29kZT1OT1A7CisJCXAtPnExLmZsYWdzPXAtPnEyLmZsYWdzPXAtPnouZmxhZ3M9MDsKKwkgICAgICB9ZWxzZXsKKwkJcC0+Y29kZT1BU1NJR047CisJCXAtPnEyLmZsYWdzPTA7CisJCXAtPnEyLnZhbC52bWF4PXNpemV0YWJbcC0+dHlwZiZOUV07CisJICAgICAgfQorCSAgICAgIGlmKGZyZWVfc3JjKSBtb3ZlX0lDKHVzZSxmcmVlX3NyYyk7CisJICAgICAgaWYoZnJlZV9yc3JjKSBtb3ZlX0lDKHVzZSxmcmVlX3JzcmMpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGlmKGMyPT1DQUxMfHxjMj09TEFCRUx8fChjMj49QkVRJiZjMjw9QlJBKSkgYnJlYWs7CisJICAgIGlmKChwMi0+cTEuZmxhZ3MmUkVHKSYmcDItPnExLnJlZz09cikgYnJlYWs7CisJICAgIGlmKChwMi0+cTIuZmxhZ3MmUkVHKSYmcDItPnEyLnJlZz09cikgYnJlYWs7CisJICAgIGlmKChwMi0+ei5mbGFncyZSRUcpJiZwMi0+ei5yZWc9PXIpIGJyZWFrOworCSAgICBpZihwMi0+cTEuYW0mJihwMi0+cTEuYW0tPmRyZWcmMTI3KT09cikgYnJlYWs7CisJICAgIGlmKHAyLT5xMi5hbSYmKHAyLT5xMi5hbS0+ZHJlZyYxMjcpPT1yKSBicmVhazsKKwkgICAgaWYocDItPnouYW0mJihwMi0+ei5hbS0+ZHJlZyYxMjcpPT1yKSBicmVhazsKKwkgICAgaWYoKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJihwLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKSYmcDItPnoucmVnPT1wLT5xMS5yZWcpCisJICAgICAgc3JjX21vZD0xOworCSAgfQorCX0KKyAgICAgIH0KKyAgICB9CSAgICAKKyAgfQorCisgIC8qIGFub3RoZXIgcGFzcyB0byByZW1vdmUgdW5uZWNlc3NhcnkgQUxMT0NSRUdzICovCisgIGZvcihwPWZpcnN0O3A7cD1wLT5uZXh0KXsKKyAgICBpZihwLT5jb2RlPT1BTExPQ1JFRyl7CisgICAgICByPXAtPnExLnJlZzsKKyAgICAgIGZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKwljMj1wMi0+Y29kZTsKKwlpZihjMj09QUxMT0NSRUcmJnAyLT5xMS5yZWc9PXIpIGllcnJvcigwKTsKKwlpZihjMj09RlJFRVJFRyYmcDItPnExLnJlZz09cil7CisJICBwLT5jb2RlPU5PUDsKKwkgIHAtPnExLmZsYWdzPTA7CisJICBwMi0+Y29kZT1OT1A7CisJICBwMi0+cTEuZmxhZ3M9MDsKKwkgIHNhdmVkYWxsb2MrKzsKKwkgIGJyZWFrOworCX0KKwlpZihjMj09Q0FMTHx8YzI9PUxBQkVMfHwoYzI+PUJFUSYmYzI8PUJSQSkpIGJyZWFrOworCWlmKChwMi0+cTEuZmxhZ3MmUkVHKSYmcDItPnExLnJlZz09cikgYnJlYWs7CisJaWYoKHAyLT5xMi5mbGFncyZSRUcpJiZwMi0+cTIucmVnPT1yKSBicmVhazsKKwlpZigocDItPnouZmxhZ3MmUkVHKSYmcDItPnoucmVnPT1yKSBicmVhazsKKwlpZigoYW09cDItPnExLmFtKSYmKGFtLT5iYXNlcmVnPT1yfHwoYW0tPmRyZWcmMTI3KT09cikpIGJyZWFrOworCWlmKChhbT1wMi0+cTIuYW0pJiYoYW0tPmJhc2VyZWc9PXJ8fChhbS0+ZHJlZyYxMjcpPT1yKSkgYnJlYWs7CisJaWYoKGFtPXAyLT56LmFtKSYmKGFtLT5iYXNlcmVnPT1yfHwoYW0tPmRyZWcmMTI3KT09cikpIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBsb2NhbHVzZWQ7Cit9CitzdGF0aWMgaW50IGFkZHJlc3NpbmcoSUMgKnApCisvKiAgVW50ZXJzdWNodCBJQ3MgYXVmIGVyd2VpdGVydGUgQWRkcmVzaWVydW5nc2FydGVuICAgICovCit7CisgICAgaW50IGNvdW50LGxvY2FsdXNlZD0wOworICAgIGlmKCFPTERQRUVQSE9MRSkgcmV0dXJuIG5ld19wZWVwaG9sZShwKTsKKyAgICBpZihERUJVRyYzMikgcHJpbnRmKCJhZGRyZXNzaW5nKCkgc3RhcnRlZFxuIik7CisgICAgZm9yKGNvdW50PTE7Y291bnQ8PTE2O2NvdW50KyspIGNsZWFyX2FtKGNvdW50KTsKKyAgICBmb3IoY291bnQ9MDtwO3A9cC0+bmV4dCl7CisgICAgICAgIGludCBjPXAtPmNvZGUscTFyZWcscTJyZWcsenJlZzsKKyAgICAgICAgaWYocC0+cTEuZmxhZ3MmUkVHKSBxMXJlZz1wLT5xMS5yZWc7IGVsc2UgcTFyZWc9MDsKKyAgICAgICAgaWYocC0+cTIuZmxhZ3MmUkVHKSBxMnJlZz1wLT5xMi5yZWc7IGVsc2UgcTJyZWc9MDsKKyAgICAgICAgaWYocC0+ei5mbGFncyZSRUcpIHpyZWc9cC0+ei5yZWc7IGVsc2UgenJlZz0wOworICAgICAgICBpZihjPT1BRERJMlApIGM9QUREOworICAgICAgICBpZihjPT1TVUJJRlApIGM9U1VCOworICAgICAgICBpZihERUJVRyYzMikgcHJpYzIoc3Rkb3V0LHApOworICAgICAgICBpZighbG9jYWx1c2VkKXsKKyAgICAgICAgICAgIGlmKChwLT5xMS5mbGFncyYoVkFSfFJFRykpPT1WQVImJihwLT5xMS52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT5xMS52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikmJnptbGVxKGwyem0oMEwpLHAtPnExLnYtPm9mZnNldCkpCisgICAgICAgICAgICAgICAgbG9jYWx1c2VkPTE7CisgICAgICAgICAgICBpZigocC0+cTIuZmxhZ3MmKFZBUnxSRUcpKT09VkFSJiYocC0+cTIudi0+c3RvcmFnZV9jbGFzcz09QVVUT3x8cC0+cTIudi0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpJiZ6bWxlcShsMnptKDBMKSxwLT5xMi52LT5vZmZzZXQpKQorICAgICAgICAgICAgICAgIGxvY2FsdXNlZD0xOworICAgICAgICAgICAgaWYoKHAtPnouZmxhZ3MmKFZBUnxSRUcpKT09VkFSJiYocC0+ei52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT56LnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKSYmem1sZXEobDJ6bSgwTCkscC0+ei52LT5vZmZzZXQpKQorICAgICAgICAgICAgICAgIGxvY2FsdXNlZD0xOworICAgICAgICAgICAgaWYoREVCVUcmMzImJmxvY2FsdXNlZD09MSkgcHJpbnRmKCJsb2NhbHVzZWQ9MVxuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYoYz09QVNTSUdOJiZpc3JlZyhxMSkmJmlzcmVnKHopJiZxMXJlZz49MSYmcTFyZWc8PTgmJnpyZWc+PTEmJnpyZWc8PTgpeworICAgICAgICAvKiAgZnVlciAoYXgpKyAgKi8KKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgY2xlYXJfYW0ocTFyZWcpOworICAgICAgICAgICAgZm9yKGk9MTtpPD04O2krKykKKyAgICAgICAgICAgICAgICBpZihhbV9iYXNlW2ldPT16cmVnfHxhbV9iYXNlW2ldPT1xMXJlZykgY2xlYXJfYW0oaSk7CisJICAgIG1vZF9yZWcoenJlZyk7CisgICAgICAgICAgICBjbGVhcl9hbSh6cmVnKTthbV9iYXNlW3pyZWddPXExcmVnO2FtX2RyZWdfaWNbenJlZ109cDsKKyAgICAgICAgICAgIGlmKERFQlVHJjMyKSBwcmludGYoIm1vdmUgJXMsJXMgZm91bmRcbiIsbXJlZ25hbWVzW3ExcmVnXSxtcmVnbmFtZXNbenJlZ10pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYoYz09TVVMVCYmQ1BVPj02ODAyMCYmaXNjb25zdChxMikmJmlzcmVnKHopJiZ6cmVnPj1kMCYmenJlZzw9ZDcpeworICAgICAgICAvKiAgZHg9YSpjb25zdCwgZnVlciBTa2FsaWVydW5nICAgICovCisgICAgICAgICAgICBpbnQgZHJlZz16cmVnLTg7CisgICAgICAgICAgICBpZihkcmVnPDF8fGRyZWc+OCkgaWVycm9yKDApOworICAgICAgICAgICAgaWYocTFyZWc+PTEmJnExcmVnPD1kNyl7CisgICAgICAgICAgICAgICAgaWYoaXNyZWcocTEpJiYocTFyZWc+OHx8YW1fdXNlW3ExcmVnXSE9cCkpIGNsZWFyX2FtKHExcmVnKTsKKyAgICAgICAgICAgICAgICBpZigocC0+cTEuZmxhZ3MmRFJFRk9CSikmJnExcmVnPD04JiZhbV91c2VbcTFyZWddKSBjbGVhcl9hbShxMXJlZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihERUJVRyYzMikgcHJpbnRmKCJtdWx0IHgsY29uc3QtPmRyZWcgZm91bmRcbiIpOworCSAgICBtb2RfcmVnKHpyZWcpOworICAgICAgICAgICAgaWYoYW1fc2thbFtkcmVnXSkge2NsZWFyX2FtKHpyZWcpO2NvbnRpbnVlO30KKyAgICAgICAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxwLT50eXBmKTsKKyAgICAgICAgICAgIGFtX3NrYWxbZHJlZ109em0ybCh2bWF4KTsKKyAgICAgICAgICAgIGlmKGFtX3NrYWxbZHJlZ10hPTImJmFtX3NrYWxbZHJlZ10hPTQmJmFtX3NrYWxbZHJlZ10hPTgpCisgICAgICAgICAgICAgICAge2NsZWFyX2FtKHpyZWcpO2NvbnRpbnVlO30KKyAgICAgICAgICAgIGFtX3NoaWZ0ZHJlZ1tkcmVnXT1wOworICAgICAgICAgICAgaWYoaXNyZWcocTEpJiZxMXJlZz49ZDAmJnExcmVnPD1kNykgYW1fZGJhc2VbZHJlZ109cTFyZWc7IGVsc2UgYW1fZGJhc2VbZHJlZ109enJlZzsKKwkgICAgaWYoKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopKSBjbGVhcl9hbShwLT5xMS5yZWcpOworICAgICAgICAgICAgaWYoREVCVUcmMzIpIHByaW50ZigiaXMgdXNhYmxlXG4iKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmKChjPT1BRER8fGM9PVNVQikmJmlzY29uc3QocTIpJiZ6cmVnPj0xJiZ6cmVnPD04JiZpc3JlZyh6KSl7CisgICAgICAgIC8qICBhZGQgYXgsI2NvbnN0LGF4LT5heiBUZXN0IGF1ZiBkOC8xNiBmZWhsdCBub2NoIChuaWNodCBtZWhyKSAqLworICAgICAgICAgICAgbG9uZyBsOworICAgICAgICAgICAgaWYoenJlZzwxfHx6cmVnPjgpIGllcnJvcigwKTsKKyAgICAgICAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxwLT50eXBmKTsKKyAgICAgICAgICAgIGw9em0ybCh2bWF4KTsKKyAgICAgICAgICAgIGlmKGM9PVNVQikgbD0tbDsKKwkgICAgbW9kX3JlZyh6cmVnKTsKKyAgICAgICAgICAgIGlmKHExcmVnPT16cmVnJiZpc3JlZyhxMSkmJmFtX3VzZVt6cmVnXSYmKGw9PTF8fGw9PTJ8fGw9PTQpKXsKKyAgICAgICAgICAgICAgICBpZihsPT1tb3BzaXplKGFtX3VzZVt6cmVnXSx6cmVnKSYmKGFtX3VzZVt6cmVnXS0+Y29kZSE9Q09OVkVSVHx8em1sZXEoc2l6ZXRhYlthbV91c2VbenJlZ10tPnR5cGYyJk5RXSxzaXpldGFiW2FtX3VzZVt6cmVnXS0+dHlwZiZOUV0pKSl7CisgICAgICAgICAgICAgICAgICAgIElDICpvcD1hbV91c2VbenJlZ107CisgICAgICAgICAgICAgICAgICAgIG9iaiAqbz0wOworICAgICAgICAgICAgICAgICAgICBpZihERUJVRyYzMil7IHByaW50ZigiZm91bmQgcG9zdGluY3JlbWVudDpcbiIpO3ByaWMyKHN0ZG91dCxvcCk7cHJpYzIoc3Rkb3V0LHApO30KKyAgICAgICAgICAgICAgICAgICAgaWYoKG9wLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmb3AtPnExLnJlZz09enJlZyl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihERUJVRyYzMikgcHJpbnRmKCJxMVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBvPSZvcC0+cTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoKG9wLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmb3AtPnEyLnJlZz09enJlZyl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihERUJVRyYzMikgcHJpbnRmKCJxMlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihvKSBjb250aW51ZTsgZWxzZSBvPSZvcC0+cTI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoKG9wLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZvcC0+ei5yZWc9PXpyZWcpeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoREVCVUcmMzIpIHByaW50ZigielxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihvKSBjb250aW51ZTsgZWxzZSBvPSZvcC0+ejsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvLT5hbT1teW1hbGxvYyhBTVMpOworICAgICAgICAgICAgICAgICAgICBvLT5hbS0+YmFzZXJlZz16cmVnOworICAgICAgICAgICAgICAgICAgICBvLT5hbS0+c2thbD0tMTsKKyAgICAgICAgICAgICAgICAgICAgby0+YW0tPmRpc3Q9MDsKKyAgICAgICAgICAgICAgICAgICAgby0+YW0tPmRyZWc9MDsKKyAgICAgICAgICAgICAgICAgICAgcD1wLT5wcmV2OworICAgICAgICAgICAgICAgICAgICByZW1vdmVfSUMocC0+bmV4dCk7CisgICAgICAgICAgICAgICAgICAgIGNsZWFyX2FtKHpyZWcpO2NvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsZWFyX2FtKHExcmVnKTsKKyAgICAgICAgICAgIGlmKGFtX2Rpc3RbenJlZ118fGFtX2luY1t6cmVnXXx8YW1fdXNlW3pyZWddKSB7Y2xlYXJfYW0oenJlZyk7Y29udGludWU7fSAvKiBudXIgZWluIE9mZnNldCAqLworICAgICAgICAgICAgaWYoaXNyZWcocTEpJiZxMXJlZz09enJlZyYmKGw9PTF8fGw9PTJ8fGw9PTQpKXsKKyAgICAgICAgICAgIC8qICBheCs9Y29uc3QsIGZ1ZXIgKGF4KSsgICAqLworICAgICAgICAgICAgICAgIGludCBpLGY7CisgICAgICAgICAgICAgICAgZm9yKGY9MCxpPTE7aTw9ODtpKyspeworICAgICAgICAgICAgICAgICAgICBpZihhbV9iYXNlW2ldPT16cmVnJiYhYW1fZHJlZ1tpXSYmIWFtX2Rpc3RbaV0peworICAgICAgICAgICAgICAgICAgICAgICAgaWYoZikgaWVycm9yKDApOworICAgICAgICAgICAgICAgICAgICAgICAgYW1faW5jW2ldPWw7YW1fZGlzdF9pY1tpXT1wO2Y9aTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKERFQlVHJjMyKSBwcmludGYoImluYyAlcyBmb3VuZFxuIixtcmVnbmFtZXNbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKGYpIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYW1fZGlzdFt6cmVnXT1sOworICAgICAgICAgICAgaWYoREVCVUcmMzIpIHByaW50ZigiZGlzdD0lbGRcbiIsYW1fZGlzdFt6cmVnXSk7CisgICAgICAgICAgICBpZihDUFU8NjgwMjApeworICAgICAgICAgICAgLyogIGJlaSA8NjgwMjAgZGFyZiBkZXIgT2Zmc2V0IG51ciAxNmJpdCBvZGVyIDhiaXQgYmVpIGRyZWcgc2VpbiAqLworICAgICAgICAgICAgICAgIGlmKChhbV9kcmVnW3pyZWddJiYoYW1fZGlzdFt6cmVnXTwtMTI4fHxhbV9kaXN0W3pyZWddPjEyNykpfHxhbV9kaXN0W3pyZWddPC0zMjc2OHx8YW1fZGlzdFt6cmVnXT4zMjc2NykKKyAgICAgICAgICAgICAgICAgICAge2NsZWFyX2FtKHpyZWcpO2NvbnRpbnVlO30KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFtX2Rpc3RfaWNbenJlZ109cDsKKyAgICAgICAgICAgIGlmKGFtX2Jhc2VbenJlZ10peworICAgICAgICAgICAgICAgIGlmKHExcmVnIT16cmVnfHwhaXNyZWcocTEpKSB7Y2xlYXJfYW0oenJlZyk7Y29udGludWU7fQorICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgaWYocTFyZWc+PTEmJnExcmVnPD04JiZpc3JlZyhxMSkpIGFtX2Jhc2VbenJlZ109cTFyZWc7IGVsc2UgYW1fYmFzZVt6cmVnXT16cmVnOworICAgICAgICAgICAgICAgIGlmKERFQlVHJjMyKSBwcmludGYoIiVzIHBvdGVudGlhbCBiYXNlIGZvciAlc1xuIixtcmVnbmFtZXNbYW1fYmFzZVt6cmVnXV0sbXJlZ25hbWVzW3pyZWddKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKERFQlVHJjMyKSBwcmludGYoImFkZCAjY29uc3QsJXMgZm91bmRcbiIsbXJlZ25hbWVzW3pyZWddKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmKGM9PUFERCYmcTJyZWc+PWQwJiZxMnJlZzw9ZDcmJmlzcmVnKHEyKSYmenJlZz49MSYmenJlZzw9OCYmaXNyZWcoeikmJihwLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKSE9KFJFR3xEUkVGT0JKKSl7CisgICAgICAgIC8qICBhZGQgYXgsZHktPmF6ICAgKi8KKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgaWYoenJlZzwxfHx6cmVnPjgpIGllcnJvcigwKTsKKyAgICAgICAgICAgIGZvcihpPTE7aTw9ODtpKyspCisgICAgICAgICAgICAgICAgaWYoYW1fZHJlZ1tpXT09cTJyZWcpeyBjbGVhcl9hbShxMnJlZyk7Y2xlYXJfYW0oaSk7fQorICAgICAgICAgICAgY2xlYXJfYW0ocTFyZWcpOworCSAgICBtb2RfcmVnKHpyZWcpOworICAgICAgICAgICAgaWYoYW1fZHJlZ1t6cmVnXXx8YW1faW5jW3pyZWddfHxhbV91c2VbenJlZ10pIHtjbGVhcl9hbSh6cmVnKTtjb250aW51ZTt9IC8qIG51ciBlaW4gUmVnb2Zmc2V0ICovCisgICAgICAgICAgICBpZihDUFU8NjgwMjAmJihhbV9kaXN0W3pyZWddPC0xMjh8fGFtX2Rpc3RbenJlZ10+MTI3KSkKKyAgICAgICAgICAgICAgICB7Y2xlYXJfYW0oenJlZyk7Y29udGludWU7fSAvKiBiZWkgPDY4MDIwIG51ciA4Yml0IE9mZnNldCAqLworICAgICAgICAgICAgYW1fZHJlZ1t6cmVnXT1xMnJlZzsKKyAgICAgICAgICAgIGlmKElTSFdPUkQocC0+dHlwZikpIGFtX2RyZWdbenJlZ118PTEyODsgLyogZHgudyBzdGF0dCBkeC5sICovCisgICAgICAgICAgICBhbV9kcmVnX2ljW3pyZWddPXA7CisgICAgICAgICAgICBpZihhbV9iYXNlW3pyZWddKXsKKyAgICAgICAgICAgICAgICBpZihxMXJlZyE9enJlZ3x8IWlzcmVnKHExKSkge2NsZWFyX2FtKHpyZWcpO2NvbnRpbnVlO30KKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGlmKHExcmVnPj0xJiZxMXJlZzw9OCYmaXNyZWcocTEpKSBhbV9iYXNlW3pyZWddPXExcmVnOyBlbHNlIGFtX2Jhc2VbenJlZ109enJlZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKERFQlVHJjMyKSBwcmludGYoImFkZCAlcywlcyBmb3VuZFxuIixtcmVnbmFtZXNbcTJyZWddLG1yZWduYW1lc1t6cmVnXSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZihjPT1GUkVFUkVHKXsKKyAgICAgICAgLyogIHdpciBrb2VubmVuIGRlbiBNb2R1cyB0YXRzYWVjaGxpY2ggYmVudXR6ZW4gKi8KKyAgICAgICAgICAgIEFkZHJlc3NpbmdNb2RlICphbTtJQyAqcDEsKnAyO2ludCBkcmVnLGk7CisgICAgICAgICAgICBpZihERUJVRyYzMikgcHJpbnRmKCJmcmVlcmVnICVzIGZvdW5kXG4iLG1yZWduYW1lc1twLT5xMS5yZWddKTsKKyAgICAgICAgICAgIGlmKHExcmVnPj1kMCYmcTFyZWc8PWQ3KSB7YW1fZnJlZWRyZWdbcTFyZWctOF09cDtpZihERUJVRyYzMikgcHJpbnRmKCJmcmVlZHJlZ1slZF09JWx4XG4iLHExcmVnLTgsKGxvbmcpcCk7fQorICAgICAgICAgICAgaWYocTFyZWc+OCkgY29udGludWU7CisgICAgICAgICAgICBpZihERUJVRyYzMikgcHJpbnRmKCJ1c2U9JXAsYmFzZT0lcCxkaXN0PSVwLGRyZWc9JXBcbiIsKHZvaWQqKWFtX3VzZVtxMXJlZ10sKHZvaWQqKWFtX2Jhc2VbcTFyZWddLCh2b2lkKilhbV9kaXN0W3ExcmVnXSwodm9pZCopYW1fZHJlZ1txMXJlZ10pOworICAgICAgICAgICAgZm9yKGk9MTtpPD04O2krKykgaWYoYW1fYmFzZVtpXT09cTFyZWcpIGNsZWFyX2FtKGkpOworICAgICAgICAgICAgaWYoIWFtX3VzZVtxMXJlZ118fCFhbV9iYXNlW3ExcmVnXSkgY29udGludWU7CisgICAgICAgICAgICBpZihhbV9pbmNbcTFyZWddJiZhbV9pbmNbcTFyZWddIT1tb3BzaXplKGFtX3VzZVtxMXJlZ10scTFyZWcpKQorICAgICAgICAgICAgICAgIHtjbGVhcl9hbShxMXJlZyk7Y29udGludWU7fQorICAgICAgICAgICAgaWYoIWFtX2Rpc3RbcTFyZWddJiYhYW1fZHJlZ1txMXJlZ10mJiFhbV9pbmNbcTFyZWddKSBjb250aW51ZTsKKyAgICAgICAgICAgIHAxPWFtX2Rpc3RfaWNbcTFyZWddO3AyPWFtX2RyZWdfaWNbcTFyZWddOworICAgICAgICAgICAgaWYoREVCVUcmMzIpeworICAgICAgICAgICAgICAgIHByaW50ZigiY291bGQgcmVhbGx5IHVzZSAlc1xuIixtcmVnbmFtZXNbcTFyZWddKTsKKyAgICAgICAgICAgICAgICBpZihwMSkgcHJpYzIoc3Rkb3V0LHAxKTsKKyAgICAgICAgICAgICAgICBpZihwMikgcHJpYzIoc3Rkb3V0LHAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGFtX2Jhc2VbcTFyZWddPT1xMXJlZyl7CisgICAgICAgICAgICAgICAgaWYocDEpIHtwMS0+cTIuZmxhZ3M9MDtwMS0+Y29kZT1BU1NJR047cDEtPnEyLnZhbC52bWF4PWwyem0oNEwpO3AxLT50eXBmPVBPSU5URVI7fQorICAgICAgICAgICAgICAgIGlmKHAyKSB7cDItPnEyLmZsYWdzPTA7cDItPmNvZGU9QVNTSUdOO3AyLT5xMi52YWwudm1heD1sMnptKDRMKTtwMi0+dHlwZj1QT0lOVEVSO30KKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGlmKHAxKSByZW1vdmVfSUMocDEpOworICAgICAgICAgICAgICAgIGlmKHAyKSByZW1vdmVfSUMocDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHJlZz0oYW1fZHJlZ1txMXJlZ10mMTI3KS04OworICAgICAgICAgICAgYW09bXltYWxsb2MoQU1TKTsKKyAgICAgICAgICAgIGFtLT5za2FsPTA7CisgICAgICAgICAgICBhbS0+YmFzZXJlZz1hbV9iYXNlW3ExcmVnXTsKKyAgICAgICAgICAgIGFtLT5kaXN0PWFtX2Rpc3RbcTFyZWddOworICAgICAgICAgICAgYW0tPmRyZWc9YW1fZHJlZ1txMXJlZ107CisgICAgICAgICAgICBpZihhbV9pbmNbcTFyZWddKSBhbS0+c2thbD0tMTsKKyAgICAgICAgICAgIGlmKGRyZWc+MCl7CisgICAgICAgICAgICAgICAgLyogIGJlaSAoZCxheCxkeSkgZGFzIGZyZWVyZWcgZHkgbmFjaCBoaW50ZW4gdmVyc2NoaWViZW4gICAgKi8KKyAgICAgICAgICAgICAgICBpZihkcmVnPDF8fGRyZWc+OCkgaWVycm9yKDApOworICAgICAgICAgICAgICAgIGlmKHAxPWFtX2ZyZWVkcmVnW2RyZWddKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoREVCVUcmMzIpeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJmcmVlcmVnICVzIG1vdmVkIGZyb20gJXAgdG8gJXBcbiIsbXJlZ25hbWVzW2RyZWcrOF0sKHZvaWQqKXAxLCh2b2lkKilwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaWMyKHN0ZG91dCxwMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYocDEtPmNvZGUhPUZSRUVSRUcpe2llcnJvcigwKTtwcmludGYoImZyZWVyZWdbJWRdPSVwXG4iLGRyZWcsKHZvaWQqKXAxKTtjb250aW51ZTt9CisgICAgICAgICAgICAgICAgICAgIGlmKCFwMS0+bmV4dCkge2llcnJvcigwKTtjb250aW51ZTt9CisgICAgICAgICAgICAgICAgICAgIGlmKCFwMS0+cHJldikge2llcnJvcigwKTtjb250aW51ZTt9CisgICAgICAgICAgICAgICAgICAgIHAxLT5wcmV2LT5uZXh0PXAxLT5uZXh0OworICAgICAgICAgICAgICAgICAgICBwMS0+bmV4dC0+cHJldj1wMS0+cHJldjsKKyAgICAgICAgICAgICAgICAgICAgcDEtPm5leHQ9cC0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgcDEtPnByZXY9cDsKKyAgICAgICAgICAgICAgICAgICAgaWYocC0+bmV4dCkgcC0+bmV4dC0+cHJldj1wMTsKKyAgICAgICAgICAgICAgICAgICAgcC0+bmV4dD1wMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoYW1fc2thbFtkcmVnXSl7CisgICAgICAgICAgICAgICAgLyogIFNrYWxpZXJ1bmcgYmVhcmJlaXRlbiAgICovCisgICAgICAgICAgICAgICAgICAgIGlmKHAxKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFtLT5za2FsPWFtX3NrYWxbZHJlZ107CisgICAgICAgICAgICAgICAgICAgICAgICBhbS0+ZHJlZz1hbV9kYmFzZVtkcmVnXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAxPWFtX3NoaWZ0ZHJlZ1tkcmVnXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKERFQlVHJjMyKSBwcmljMihzdGRvdXQscDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoYW1fZGJhc2VbZHJlZ109PWRyZWcrOCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDEtPmNvZGU9QVNTSUdOO3AxLT5xMi5mbGFncz0wO3AxLT5xMi52YWwudm1heD1zaXpldGFiW3AxLT50eXBmJk5RXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIHJlbW92ZV9JQyhwMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2xlYXJfYW0oZHJlZys4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiAgZGFzIGhpZXIgZHVlcmZ0ZSB1bm5vZXRpZyBzZWluLCBkYSBkaWUgQWRyZXNzaWVydW5nc2FydCBpbiAgKi8KKyAgICAgICAgICAgIC8qICBlaW5lbSBJQyBlaWdlbnRsaWNoIGhvZWNoc3RlbnMgZWlubWFsIHZvcmtvbW1lbiBkYXJmICAgICAgICAqLworICAgICAgICAgICAgaWYocTFyZWc8MHx8cTFyZWc+OCkgaWVycm9yKDApOworICAgICAgICAgICAgcDE9YW1fdXNlW3ExcmVnXTsKKyAgICAgICAgICAgIGlmKERFQlVHJjMyKSBwcmljMihzdGRvdXQscDEpOworICAgICAgICAgICAgaWYocDEtPmNvZGU9PVBVU0gmJnAxLT5xMS5yZWc9PXExcmVnJiYoKHAxLT5xMS5mbGFncyYoRFJFRk9CSnxSRUcpKT09KFJFRykpKXsKKyAgICAgICAgICAgICAgICBwMS0+cTEuYW09bXltYWxsb2MoQU1TKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocDEtPnExLmFtLGFtLEFNUyk7CisgICAgICAgICAgICAgICAgcC0+cTEudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICAgICAgICAgICAgcDEtPmNvZGU9UEVBOworICAgICAgICAgICAgICAgIGlmKERFQlVHJjMyKSBwcmludGYoInExIHBhdGNoZWRcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYocDEtPnExLnJlZz09cTFyZWcmJigocDEtPnExLmZsYWdzJihEUkVGT0JKfFJFRykpPT0oRFJFRk9CSnxSRUcpKSl7CisgICAgICAgICAgICAgICAgcDEtPnExLmFtPW15bWFsbG9jKEFNUyk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHAxLT5xMS5hbSxhbSxBTVMpOworICAgICAgICAgICAgICAgIHAxLT5xMS52YWwudm1heD1sMnptKDBMKTsKKyAgICAgICAgICAgICAgICBpZihERUJVRyYzMikgcHJpbnRmKCJxMSBwYXRjaGVkXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHAxLT5xMi5yZWc9PXExcmVnJiYoKHAxLT5xMi5mbGFncyYoRFJFRk9CSnxSRUcpKT09KERSRUZPQkp8UkVHKSkpeworICAgICAgICAgICAgICAgIHAxLT5xMi5hbT1teW1hbGxvYyhBTVMpOworICAgICAgICAgICAgICAgIG1lbWNweShwMS0+cTIuYW0sYW0sQU1TKTsKKyAgICAgICAgICAgICAgICBwMS0+cTIudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICAgICAgICAgICAgaWYoREVCVUcmMzIpIHByaW50ZigicTIgcGF0Y2hlZFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihwMS0+ei5yZWc9PXExcmVnJiYoKHAxLT56LmZsYWdzJihEUkVGT0JKfFJFRykpPT0oRFJFRk9CSnxSRUcpKSl7CisgICAgICAgICAgICAgICAgcDEtPnouYW09bXltYWxsb2MoQU1TKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocDEtPnouYW0sYW0sQU1TKTsKKyAgICAgICAgICAgICAgICBwMS0+ei52YWwudm1heD1sMnptKDBMKTsKKyAgICAgICAgICAgICAgICBpZihERUJVRyYzMikgcHJpbnRmKCJ6IHBhdGNoZWRcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShhbSk7Y291bnQrKzsKKyAgICAgICAgICAgIGNsZWFyX2FtKHExcmVnKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmKGM+PUxBQkVMJiZjPD1CUkEpeworICAgICAgICAgICAgaW50IGk7ICAgICAgLyogIHVlYmVyIGJhc2ljIGJsb2NrcyBoaW53ZWcgdW5zaWNoZXIgICovCisgICAgICAgICAgICBmb3IoaT0xO2k8PTE2O2krKykgY2xlYXJfYW0oaSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvKiAgV2VubiBMaWJyYXJ5YXVmcnVmZSBub2V0aWcgc2luZCAoZmxvYXRpbmcgcG9pbnQgb2huZSBGUFUgb2RlciAgICovCisgICAgICAgIC8qICAzMmJpdCBtdWwvZGl2L21vZCBvaG5lIDAyMCspIGtlaW5lIEFkZHJlc3NpZXJ1bmdzYXJ0ZW4gbnV0emVuICAgKi8KKyAgICAgICAgaWYoRlBVPD02ODAwMCYmKElTRkxPQVQocC0+dHlwZil8fChwLT5jb2RlPT1DT05WRVJUJiZJU0ZMT0FUKHAtPnR5cGYyKSkpKXsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgZm9yKGk9MTtpPD0xNjtpKyspIGNsZWFyX2FtKGkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYoQ1BVPDY4MDIwJiYoYz09RElWfHxjPT1NT0QpKXsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgZm9yKGk9MTtpPD0xNjtpKyspIGNsZWFyX2FtKGkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYoYz09UFVTSCYmKChwLT5xMS5mbGFncyYoRFJFRk9CSnxSRUcpKT09UkVHJiZxMXJlZzw9OCYmIWFtX3VzZVtxMXJlZ10mJihhbV9pbmNbcTFyZWddfHxhbV9kaXN0W3ExcmVnXXx8YW1fZHJlZ1txMXJlZ10pKSl7CisgICAgICAgICAgICBpZihxMXJlZzwxfHxxMXJlZz44KSBpZXJyb3IoMCk7CisgICAgICAgICAgICBpZihhbV9pbmNbcTFyZWddJiZhbV9pbmNbcTFyZWddIT1tc2l6ZXRhYltwLT50eXBmJk5RXSkgY2xlYXJfYW0ocTFyZWcpOyBlbHNlIGFtX3VzZVtxMXJlZ109cDsKKyAgICAgICAgICAgIGlmKERFQlVHJjMyKSBwcmludGYoInVzZSBvZiAlcyBmb3VuZFxuIixtcmVnbmFtZXNbcTFyZWddKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmKCgocC0+cTEuZmxhZ3MmKERSRUZPQkp8UkVHKSk9PShEUkVGT0JKfFJFRykmJnExcmVnPD04KSl7CisgICAgICAgICAgICBpZihxMXJlZzwxfHxxMXJlZz44KSBpZXJyb3IoMCk7CisgICAgICAgICAgICBpZihhbV91c2VbcTFyZWddJiYoYW1fdXNlW3ExcmVnXSE9cHx8YW1faW5jW3ExcmVnXSkpIGNsZWFyX2FtKHExcmVnKTsgZWxzZSBhbV91c2VbcTFyZWddPXA7CisgICAgICAgICAgICBpZihhbV9pbmNbcTFyZWddJiZhbV9pbmNbcTFyZWddIT1zaXpldGFiW3AtPnR5cGYmTlFdKSBjbGVhcl9hbShxMXJlZyk7CisgICAgICAgICAgICBpZihERUJVRyYzMikgcHJpbnRmKCJ1c2Ugb2YgJXMgZm91bmRcbiIsbXJlZ25hbWVzW3ExcmVnXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYoKChwLT5xMi5mbGFncyYoRFJFRk9CSnxSRUcpKT09KERSRUZPQkp8UkVHKSYmcTJyZWc8PTgpKXsKKyAgICAgICAgICAgIGlmKHEycmVnPDF8fHEycmVnPjgpIGllcnJvcigwKTsKKyAgICAgICAgICAgIGlmKGFtX3VzZVtxMnJlZ10mJihhbV91c2VbcTJyZWddIT1wfHxhbV9pbmNbcTJyZWddKSkgY2xlYXJfYW0ocTJyZWcpOyBlbHNlIGFtX3VzZVtxMnJlZ109cDsKKyAgICAgICAgICAgIGlmKGFtX2luY1txMnJlZ10mJmFtX2luY1txMnJlZ10hPXNpemV0YWJbcC0+dHlwZiZOUV0pIGNsZWFyX2FtKHEycmVnKTsKKyAgICAgICAgICAgIGlmKERFQlVHJjMyKSBwcmludGYoInVzZSBvZiAlcyBmb3VuZFxuIixtcmVnbmFtZXNbcTJyZWddKTsKKyAgICAgICAgfQorICAgICAgICBpZigoKHAtPnouZmxhZ3MmKERSRUZPQkp8UkVHKSk9PShEUkVGT0JKfFJFRykmJnpyZWc8PTgpKXsKKyAgICAgICAgICAgIGlmKHpyZWc8MXx8enJlZz44KSBpZXJyb3IoMCk7CisgICAgICAgICAgICBpZihhbV91c2VbenJlZ10mJihhbV91c2VbenJlZ10hPXB8fGFtX2luY1t6cmVnXSkpIGNsZWFyX2FtKHpyZWcpOyBlbHNlIGFtX3VzZVt6cmVnXT1wOworICAgICAgICAgICAgaWYoYW1faW5jW3pyZWddJiZhbV9pbmNbenJlZ10hPXNpemV0YWJbcC0+dHlwZiZOUV0pIGNsZWFyX2FtKHpyZWcpOworICAgICAgICAgICAgaWYoREVCVUcmMzIpIHByaW50ZigidXNlIG9mICVzIGZvdW5kXG4iLG1yZWduYW1lc1t6cmVnXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYoYz09QUxMT0NSRUcpeworICAgICAgICAvKiAgYWxsb2NyZWcgemFlaGx0IGFscyB6ZXJzdG9lcnVuZyB2b24gcmVnICovCisgICAgICAgICAgICBwLT56LmZsYWdzPVJFRzsKKyAgICAgICAgICAgIHAtPnoucmVnPXpyZWc9cTFyZWc9cC0+cTEucmVnOworICAgICAgICB9CisgICAgICAgIGlmKHExcmVnPj0xJiZxMXJlZzw9ZDcmJmlzcmVnKHExKSYmKHExcmVnPjh8fGFtX3VzZVtxMXJlZ10hPXApKSBjbGVhcl9hbShxMXJlZyk7CisgICAgICAgIGlmKHEycmVnPj0xJiZxMnJlZzw9ZDcmJmlzcmVnKHEyKSYmKHEycmVnPjh8fGFtX3VzZVtxMnJlZ10hPXApKSBjbGVhcl9hbShxMnJlZyk7CisgICAgICAgIGlmKHpyZWc+PTEmJnpyZWc8PWQ3JiZpc3JlZyh6KSkgY2xlYXJfYW0oenJlZyk7CisgICAgICAgIGlmKGlzcmVnKHopJiZ6cmVnPD1kNyl7CisgICAgICAgIC8qICBzY2hhdWVuLCBvYiBlaW5lcyBkZXIgUmVnaXN0ZXIgdWViZXJzY2hyaWViZW4gd2lyZCAgKi8KKyAgICAgICAgLyogIHdvaGwgbm9jaCBzZWhyIGxhbmdzYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCSAgbW9kX3JlZyh6cmVnKTsKKyAgICAgICAgfQorICAgICAgICBpZihjPT1BTExPQ1JFRykgcC0+ei5mbGFncz0wOworICAgIH0KKyAgICBpZihERUJVRyYxKSBwcmludGYoIiVkIGFkZHJlc3Npbmdtb2RlcyB1c2VkLCBsb2NhbHVzZWQ9JWRcbiIsY291bnQsbG9jYWx1c2VkKTsKKyAgICByZXR1cm4gbG9jYWx1c2VkOworfQorc3RhdGljIGludCBhbGlnbm1lbnQob2JqICpvKQorLyogIHZlcnN1Y2h0IHJhdXN6dWZpbmRlbiwgd2llIGVpbiBPYmpla3QgYWxpZ25ldCBpc3QgICAqLworeworICAgIC8qICB3ZW5uIGVzIGtlaW5lIFZhcmlhYmxlIGlzdCwga2FubiBtYW4gbmljaHRzIGF1c3NhZ2VuICAgICovCisgICAgbG9uZyBvczsKKyAgICBpZihvLT5hbXx8IShvLT5mbGFncyZWQVIpKSByZXR1cm4gLTE7CisgICAgaWYoKG8tPmZsYWdzJkRSRUZPQkopKXsKKyAgICAgIGlmKCEoby0+di0+ZmxhZ3MmTk9UVFlQRVNBRkUpfHwhSVNQT0lOVEVSKG8tPnYtPnZ0eXAtPmZsYWdzKXx8em1lcXRvKGZhbGlnbihvLT52LT52dHlwLT5uZXh0KSxsMnptKDFMKSkpCisJcmV0dXJuIC0xOworICAgICAgZWxzZQorCXJldHVybiAwOworICAgIH0KKyAgICBpZighby0+dikgaWVycm9yKDApOworICAgIG9zPXptMmwoby0+dmFsLnZtYXgpOworICAgIGlmKG8tPnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fG8tPnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKXsKKyAgICAgICAgaWYoIVVTRUZSQU1FUE9JTlRFUiYmIXZsYXMpeworICAgICAgICAgICAgaWYoIXptbGVxKGwyem0oMEwpLG8tPnYtPm9mZnNldCkpIG9zPW9zK2xvZmYtem0ybChvLT52LT5vZmZzZXQpOworICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgIG9zPW9zK3ptMmwoby0+di0+b2Zmc2V0KTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBpZighem1sZXEobDJ6bSgwTCksby0+di0+b2Zmc2V0KSkgb3M9b3Mtem0ybChvLT52LT5vZmZzZXQpOworICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgIG9zPW9zLSh6bTJsKG8tPnYtPm9mZnNldCkrem0ybChzem9mKG8tPnYtPnZ0eXApKSk7CisgICAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgIGlmKCEoby0+di0+ZmxhZ3MmKFRFTlRBVElWRXxERUZJTkVEKSkmJnptZXF0byhmYWxpZ24oby0+di0+dnR5cCksbDJ6bSgxTCkpKQorCXJldHVybiAtMTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIG9zJjM7Cit9CitzdGF0aWMgdm9pZCBzdG9yZWQwZDEoRklMRSAqZixvYmogKm8saW50IHQpCit7CisgIGlmKChvLT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKyAgICBpZighcmVnX3BhaXIoby0+cmVnLCZycCkpIGllcnJvcigwKTsKKyAgICBpZihvLT5yZWc9PTI1KSByZXR1cm47CisgICAgZW1pdChmLCJcdG1vdmUubFx0JXMsJXNcbiIsbXJlZ25hbWVzW2QwXSxtcmVnbmFtZXNbcnAucjFdKTsKKyAgICBlbWl0KGYsIlx0bW92ZS5sXHQlcywlc1xuIixtcmVnbmFtZXNbMTBdLG1yZWduYW1lc1tycC5yMl0pOworICB9ZWxzZXsKKyAgICBpZihjZiYmKG8tPmZsYWdzJihSRUd8RFJFRk9CSikpIT0oUkVHfERSRUZPQkopKXsKKyAgICAgIGVtaXQoZiwiXHRtb3ZlLmxcdCVzLCIsbXJlZ25hbWVzW2QwXSk7CisgICAgICBlbWl0X29iaihmLG8sdCk7CisgICAgICBlbWl0KGYsIlxuIik7CisgICAgICBlbWl0KGYsIlx0bW92ZS5sXHQlcywiLG1yZWduYW1lc1tkMV0pOworICAgICAgby0+dmFsLnZtYXg9em1hZGQoby0+dmFsLnZtYXgsbDJ6bSg0TCkpOworICAgICAgZW1pdF9vYmooZixvLHQpOworICAgICAgby0+dmFsLnZtYXg9em1zdWIoby0+dmFsLnZtYXgsbDJ6bSg0TCkpOworICAgICAgZW1pdChmLCJcbiIpOworICAgIH1lbHNleworICAgICAgZW1pdChmLCJcdG1vdmVtLmxcdCVzLCIsbXJlZ25hbWVzW2QwZDFdKTsKKyAgICAgIGVtaXRfb2JqKGYsbyx0KTsKKyAgICAgIGVtaXQoZiwiXG4iKTsKKyAgICB9CisgIH0KK30KK3N0YXRpYyB2b2lkIGxvYWRkMGQxKEZJTEUgKmYsb2JqICpvLGludCB0KQoreworICBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgaWYoIXJlZ19wYWlyKG8tPnJlZywmcnApKSAKKyAgICAgIGllcnJvcigwKTsKKyAgICBpZihvLT5yZWc9PTI1KSByZXR1cm47CisgICAgZW1pdChmLCJcdG1vdmUubFx0JXMsJXNcbiIsbXJlZ25hbWVzW3JwLnIxXSxtcmVnbmFtZXNbZDBdKTsKKyAgICBlbWl0KGYsIlx0bW92ZS5sXHQlcywlc1xuIixtcmVnbmFtZXNbcnAucjJdLG1yZWduYW1lc1sxMF0pOworICB9ZWxzZXsKKyAgICBpZihjZil7CisgICAgICBlbWl0KGYsIlx0bW92ZS5sXHQiKTsKKyAgICAgIGVtaXRfb2JqKGYsbyx0KTsKKyAgICAgIGVtaXQoZiwiLCVzXG4iLG1yZWduYW1lc1tkMF0pOworICAgICAgZW1pdChmLCJcdG1vdmUubFx0Iik7CisgICAgICBvLT52YWwudm1heD16bWFkZChvLT52YWwudm1heCxsMnptKDRMKSk7CisgICAgICBlbWl0X29iaihmLG8sdCk7CisgICAgICBvLT52YWwudm1heD16bXN1YihvLT52YWwudm1heCxsMnptKDRMKSk7CisgICAgICBlbWl0KGYsIiwlc1xuIixtcmVnbmFtZXNbZDFdKTsKKyAgICB9ZWxzZXsKKyAgICAgIGVtaXQoZiwiXHRtb3ZlbS5sXHQiKTsKKyAgICAgIGVtaXRfb2JqKGYsbyx0KTsKKyAgICAgIGVtaXQoZiwiLCVzXG4iLG1yZWduYW1lc1tkMGQxXSk7CisgICAgfQorICB9Cit9CitzdGF0aWMgdm9pZCBhc3NpZ24oRklMRSAqZixJQyAqcCxvYmogKnEsb2JqICp6LGludCBjLGxvbmcgc2l6ZSxpbnQgdCkKKy8qICBHZW5lcmllcnQgQ29kZSBmdWVyIFp1d2Vpc3VuZ2VuIHVuZCBQVVNILiAgICovCit7CisgICAgLyogIGF1Y2ggbm9jaCBzZWhyIGZwdS1zcGV6aWZpc2NoICAgKi8KKyAgaWYoRlBVPD02ODAwMCYmKCh0Jk5RKT09RE9VQkxFfHwodCZOUSk9PUxET1VCTEUpJiYhKChxLT5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCkpCisgICAgdD1MTE9ORzsKKyAgaWYoSVNGTE9BVCh0KSl7CisgICAgaWYocSYmKHEtPmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKyAgICAgIGlmKHomJih6LT5mbGFncyYoRFJFRk9CSnxSRUcpKT09UkVHJiZ6LT5yZWc+PWZwMCYmei0+cmVnPD1mcDcpeworCS8qICBGUC1Lb25zdGFudGUtPlJlZ2lzdGVyIChtdXNzIGltbWVyIHJlaW5wYXNzZW4pICAqLworCWlmKHotPnJlZz49ZnAwKSBlbWl0KGYsIlx0Zm1vdmUiKTsgZWxzZSBlbWl0KGYsIlx0bW92ZSIpOworCWVtaXQoZiwiLiVjXHQiLHhfdFt0Jk5RXSk7ZW1pdF9vYmooZixxLHQpOworCWVtaXQoZiwiLCVzXG4iLG1yZWduYW1lc1t6LT5yZWddKTsKKyAgICAgIH1lbHNleworCS8qICBGUC1Lb25zdGFudGUtPlNwZWljaGVyIChldnRsLiBhdWYgendlaW1hbCkgICovCisJaW50IG0scjt1bnNpZ25lZCBjaGFyICppcD0odW5zaWduZWQgY2hhciAqKSZxLT52YWwudmZsb2F0OyAvKiBuaWNodCBzZWhyIHNjaG9lbiAgKi8KKwljaGFyICpzOworCWlmKGNmJiZjPT1BU1NJR04pIHI9Z2V0X3JlZyhmLDEscCwwKTsKKwlpZihHQVMpIHM9IjB4IjsgZWxzZSBzPSIkIjsKKwlpZihjPT1QVVNIJiYodCZOUSkhPUZMT0FUKXsKKwkgIGVtaXQoZiwiXHRtb3ZlLmxcdCMlcyUwMnglMDJ4JTAyeCUwMngsLSglcylcbiIscyxpcFs0XSxpcFs1XSxpcFs2XSxpcFs3XSxtcmVnbmFtZXNbc3BdKTsKKwkgIHB1c2goNCk7CisJfQorCWVtaXQoZiwiXHRtb3ZlLmxcdCMlcyUwMnglMDJ4JTAyeCUwMngsIixzLGlwWzBdLGlwWzFdLGlwWzJdLGlwWzNdKTsKKwlpZihjPT1BU1NJR04peworCSAgaWYoY2YpCisJICAgIGVtaXQoZiwiJXNcblx0bW92ZS5sXHQlcywiLG1yZWduYW1lc1tyXSxtcmVnbmFtZXNbcl0pOworCSAgaWYoaXNyZWcoeikmJnJlZ19wYWlyKHAtPnoucmVnLCZycCkpCisJICAgIGVtaXQoZiwiJXMiLG1yZWduYW1lc1tycC5yMV0pOworCSAgZWxzZQorCSAgICBlbWl0X29iaihmLHosdCk7CisJfWVsc2V7CisJICBlbWl0KGYsIi0oJXMpIixtcmVnbmFtZXNbc3BdKTsKKwkgIHB1c2goNCk7CisJfQorCWVtaXQoZiwiXG4iKTsKKwlpZigodCZOUSk9PUZMT0FUfHxjPT1QVVNIKSByZXR1cm47CisJbT0wOworCWlmKHomJih6LT5mbGFncyZSRUcpKXsKKwkgIG09MTt6LT5mbGFnc3w9RDE2T0ZGOworCSAgei0+dmFsLnZtYXg9bDJ6bSgwTCk7CisJfQorCXZtYXg9bDJ6bSg0TCk7CisJei0+dmFsLnZtYXg9em1hZGQoei0+dmFsLnZtYXgsdm1heCk7CisJZW1pdChmLCJcdG1vdmUubFx0IyVzJTAyeCUwMnglMDJ4JTAyeCwiLHMsaXBbNF0saXBbNV0saXBbNl0saXBbN10pOworCWlmKGNmKQorCSAgZW1pdChmLCIlc1xuXHRtb3ZlLmxcdCVzLCIsbXJlZ25hbWVzW3JdLG1yZWduYW1lc1tyXSk7CisJaWYoaXNyZWcoeikmJnJlZ19wYWlyKHAtPnoucmVnLCZycCkpCisJICBlbWl0KGYsIiVzIixtcmVnbmFtZXNbcnAucjJdKTsKKwllbHNlCisJICBlbWl0X29iaihmLHosdCk7CisJZW1pdChmLCJcbiIpOworCWlmKG0peworCSAgei0+ZmxhZ3MmPX5EMTZPRkY7dm1heD1sMnptKDRMKTsKKwkgIHotPnZhbC52bWF4PXptc3ViKHotPnZhbC52bWF4LHZtYXgpOworCX0KKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoKHEmJihxLT5mbGFncyZSRUcpJiZxLT5yZWc+PWZwMCl8fCh6JiYoei0+ZmxhZ3MmUkVHKSYmei0+cmVnPj1mcDApKXsKKyAgICAgIGlmKGM9PUFTU0lHTiYmKHEtPmZsYWdzJlJFRykmJih6LT5mbGFncyZSRUcpJiZxLT5yZWc9PXotPnJlZykgcmV0dXJuOworICAgICAgaWYoYz09QVNTSUdOKXsgbW92ZShmLHEsMCx6LDAsdCk7cmV0dXJuO30KKyAgICAgIGVtaXQoZiwiXHRmbW92ZS4lY1x0Iix4X3RbdCZOUV0pOworICAgICAgZW1pdF9vYmooZixxLHQpOworICAgICAgZW1pdChmLCIsIik7CisgICAgICBpZihjPT1QVVNIKXsKKwllbWl0KGYsIi0oJXMpIixtcmVnbmFtZXNbc3BdKTsKKwlwdXNoKHNpemUpOworICAgICAgfSBlbHNlIAorCWVtaXRfb2JqKGYseix0KTsKKyAgICAgIGVtaXQoZiwiXG4iKTtyZXR1cm47CisgICAgfQorICAgIGlmKHNpemU9PTgpIHQ9TExPTkc7CisgIH0KKyAgaWYoKHQmTlEpPT1MTE9ORyl7CisgICAgaWYoeiYmY29tcGFyZV9vYmplY3RzKHEseikpIHJldHVybjsKKyAgICBpZigoKGNmJiZjPT1BU1NJR04pfHwocS0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRykmJighenx8KHotPmZsYWdzJihSRUd8RFJFRk9CSikpIT1SRUcpKXsKKyAgICAgIGlmKGNmKXsKKwlpZihjPT1BU1NJR04peworCSAgaW50IHI7CisJICBpZigocS0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisJICAgIGlmKCFyZWdfcGFpcihxLT5yZWcsJnJwKSkgaWVycm9yKDApOworCSAgICByPXJwLnIyOworCSAgfWVsc2V7CisJICAgIHI9Z2V0X3JlZyhmLDEscCwwKTsKKwkgICAgZW1pdChmLCJcdG1vdmUubFx0Iik7CisJICAgIGVtaXRfbHdvcmQoZixxKTsKKwkgICAgZW1pdChmLCIsJXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgIH0KKwkgIGVtaXQoZiwiXHRtb3ZlLmxcdCVzLCIsbXJlZ25hbWVzW3JdKTsKKwkgIGVtaXRfbHdvcmQoZix6KTsKKwkgIGVtaXQoZiwiXG4iKTsKKwkgIGlmKChxLT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKwkgICAgcj1ycC5yMTsKKwkgIH1lbHNleworCSAgICBlbWl0KGYsIlx0bW92ZS5sXHQiKTsKKwkgICAgZW1pdF9od29yZChmLHEpOworCSAgICBlbWl0KGYsIiwlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgfQorCSAgZW1pdChmLCJcdG1vdmUubFx0JXMsIixtcmVnbmFtZXNbcl0pOworCSAgZW1pdF9od29yZChmLHopOworCSAgZW1pdChmLCJcbiIpOworCX1lbHNleworCSAgZW1pdChmLCJcdHN1YnEubFx0IzgsJXNcbiIsbXJlZ25hbWVzW3NwXSk7CisJICBwdXNoKDgpOworCSAgZW1pdChmLCJcdG1vdmVtLmxcdCVzLCglcylcbiIsbXJlZ25hbWVzW3EtPnJlZ10sbXJlZ25hbWVzW3NwXSk7CisJfQorICAgICAgfWVsc2V7CisJZW1pdChmLCJcdG1vdmVtLmxcdCVzLCIsbXJlZ25hbWVzW3EtPnJlZ10pOworCWlmKGM9PUFTU0lHTil7CisJICBlbWl0X29iaihmLHosdCk7CisJfWVsc2V7CisJICBlbWl0KGYsIi0oJXMpIixtcmVnbmFtZXNbc3BdKTsKKwkgIHB1c2goOCk7CisJfQorCWVtaXQoZiwiXG4iKTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoIWNmJiYocS0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSkhPVJFRyYmISgocS0+ZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpJiZ6JiYoei0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgICBlbWl0KGYsIlx0bW92ZW0ubFx0Iik7CisgICAgICBlbWl0X29iaihmLHEsdCk7CisgICAgICBlbWl0KGYsIiwlc1xuIixtcmVnbmFtZXNbei0+cmVnXSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGVtaXQoZiwiXHRtb3ZlLmxcdCIpOworICAgIGVtaXRfbHdvcmQoZixxKTsKKyAgICBlbWl0KGYsIiwiKTsKKyAgICBpZihjPT1BU1NJR04peworICAgICAgZW1pdF9sd29yZChmLHopOworICAgIH1lbHNleworICAgICAgZW1pdChmLCItKCVzKSIsbXJlZ25hbWVzW3NwXSk7CisgICAgICBwdXNoKDQpOworICAgIH0KKyAgICBlbWl0KGYsIlxuIik7CisgICAgZW1pdChmLCJcdG1vdmUubFx0Iik7CisgICAgZW1pdF9od29yZChmLHEpOworICAgIGVtaXQoZiwiLCIpOworICAgIGlmKGM9PUFTU0lHTil7CisgICAgICBlbWl0X2h3b3JkKGYseik7CisgICAgfWVsc2V7CisgICAgICBlbWl0KGYsIi0oJXMpIixtcmVnbmFtZXNbc3BdKTsKKyAgICAgIHB1c2goNCk7CisgICAgfQorICAgIGVtaXQoZiwiXG4iKTsgICAgCisgICAgcmV0dXJuOworICB9CisgIGlmKChzaXplPT0xfHxzaXplPT0yfHxzaXplPT00KSYmIUlTQVJSQVkodCkmJihwLT5jb2RlIT1QVVNIfHx6bTJsKHAtPnoudmFsLnZtYXgpIT0zKSYmKCh0Jk5RKSE9Q0hBUnx8c2l6ZT09MSkpeworICAgIGlmKElTU1RSVUNUKHQpfHxJU1VOSU9OKHQpKXsKKyAgICAgIGlmKHAtPmNvZGU9PVBVU0gmJiF6bWVxdG8ocC0+cTIudmFsLnZtYXgscC0+ei52YWwudm1heCkpeworCWlmKHNpemUhPTQmJnNpemUhPTIpIGllcnJvcihzaXplKTsKKwllbWl0KGYsIlx0c3VicS4lc1x0IyVkLCVzXG4iLGNmPyJsIjoidyIsc2l6ZSxtcmVnbmFtZXNbc3BdKTsKKwlwdXNoKHNpemUpOworCXNpemU9em0ybChwLT56LnZhbC52bWF4KTsKKwlpZihzaXplIT0xJiZzaXplIT0yKSBpZXJyb3IoMCk7CisJZW1pdChmLCJcdG1vdmUuJWNcdCIsc2l6ZT09MT8nYic6J3cnKTsKKwllbWl0X29iaihmLHEsKHNpemU9PTE/Q0hBUjpTSE9SVCkpOworCWVtaXQoZiwiLCglcylcbiIsbXJlZ25hbWVzW3NwXSk7CisJcmV0dXJuOworICAgICAgfWVsc2V7CisJaWYoc2l6ZT09MSkKKwkgIHQ9Q0hBUjsKKwllbHNlIGlmKHNpemU9PTIpCisJICB0PVNIT1JUOworCWVsc2UKKwkgIHQ9TE9ORzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoYz09QVNTSUdOKXttb3ZlKGYscSwwLHosMCx0KTtyZXR1cm47fQorICAgIC8qICBTb25kZXJmYWxsIHBlYSAgKi8KKyAgICBpZigocS0+ZmxhZ3MmVkFSQURSKSYmYz09UFVTSCl7CisgICAgICBlbWl0KGYsIlx0cGVhXHQiKTsKKyAgICAgIHEtPmZsYWdzJj1+VkFSQURSOyBlbWl0X29iaihmLHEsdCk7IHEtPmZsYWdzfD1WQVJBRFI7CisgICAgICBlbWl0KGYsIlxuIik7IAorICAgICAgcHVzaChzaXplKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZW1pdChmLCJcdG1vdmUuJWNcdCIseF9zW3NpemVdKTsKKyAgICBlbWl0X29iaihmLHEsdCk7CisgICAgZW1pdChmLCIsIik7CisgICAgaWYoYz09UFVTSCl7CisgICAgICBlbWl0KGYsIi0oJXMpIixtcmVnbmFtZXNbc3BdKTsKKyAgICAgIHB1c2goc2l6ZSk7CisgICAgfSBlbHNlIAorICAgICAgZW1pdF9vYmooZix6LHQpOworICAgIGVtaXQoZiwiXG4iKTtyZXR1cm47CisgIH1lbHNleworICAgIGludCBhMSxhMixxcmVnLHpyZWcsZHJlZyxsb29wcyxzY3JhdGNoPTAsZG93bj0wO2NoYXIgKmNwc3RyOworICAgIGxvbmcgcz1zaXplLG9zaXplPXNpemU7CisgICAgSUMgKm07CisgICAgZm9yKG09cC0+bmV4dDttJiZtLT5jb2RlPT1GUkVFUkVHO209bS0+bmV4dCl7CisgICAgICBpZihxJiZtLT5xMS5yZWc9PXEtPnJlZykgc2NyYXRjaHw9MTsKKyAgICAgIGlmKHomJm0tPnExLnJlZz09ei0+cmVnKSBzY3JhdGNofD0yOworICAgIH0KKyAgICBhMT1hbGlnbm1lbnQocSk7CisgICAgaWYoYyE9UFVTSCkgIGEyPWFsaWdubWVudCh6KTsgZWxzZSBhMj0wOworICAgIGlmKGExPDB8fGEyPDApIHthMT0xO2EyPTI7fQorICAgIGlmKHAtPnR5cGYyPT0yfHxwLT50eXBmMj09NCkge2ExPWEyPTA7fQorICAgIGlmKChjPT1QVVNIfHwoc2NyYXRjaCYxKSkmJihxLT5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcS0+cmVnPj0xJiZxLT5yZWc8PTgmJiFxLT5hbSl7CisgICAgICBxcmVnPXEtPnJlZzsKKyAgICAgIGlmKGM9PVBVU0gmJihhMSYxKT09MCYmKGEyJjEpPT0wKQorCWVtaXQoZiwiXHRhZGQlcy4lc1x0IyVsZCwlc1xuIixxdWlja1tzPD04XSxzdHJzaG9ydFtzPD0zMjc2N10sKGxvbmcpcyxtcmVnbmFtZXNbcS0+cmVnXSk7CisgICAgfWVsc2V7CisgICAgICBpZihjIT1BU1NJR04mJiFyZWdhdmFpbGFibGUoMCkpCisJcXJlZz1wZ2V0X3JlZyhmLDAscCwwKTsKKyAgICAgIGVsc2UKKwlxcmVnPWdldF9yZWcoZiwwLHAsMCk7CisgICAgICBpZihjPT1QVVNIJiYoYTEmMSk9PTAmJihhMiYxKT09MCl7CisJcS0+ZmxhZ3N8PUQxNk9GRjsgCisJcS0+dmFsLnZtYXg9em1hZGQocS0+dmFsLnZtYXgsbDJ6bSgobG9uZylzKSk7CisJZW1pdChmLCJcdGxlYVx0Iik7ZW1pdF9vYmooZixxLFBPSU5URVIpOworCXEtPnZhbC52bWF4PXptc3ViKHEtPnZhbC52bWF4LGwyem0oKGxvbmcpcykpOworCWVtaXQoZiwiLCVzXG4iLG1yZWduYW1lc1txcmVnXSk7CisgICAgICB9ZWxzZXsKKwllbWl0KGYsIlx0bGVhXHQiKTtlbWl0X29iaihmLHEsUE9JTlRFUik7CisJZW1pdChmLCIsJXNcbiIsbXJlZ25hbWVzW3FyZWddKTsKKyAgICAgIH0JICAgICAgCisgICAgfQorICAgIGlmKGM9PVBVU0gpeworICAgICAgaWYoKGExJjEpPT0wJiYoYTImMSk9PTApeworCXpyZWc9ODsKKyAgICAgIH1lbHNleworCWVtaXQoZiwiXHRzdWIlcy4lc1x0IyVsZCwlc1xuIixxdWlja1tzPD04XSxzdHJzaG9ydFtzPD0zMjc2N10sKGxvbmcpcyxtcmVnbmFtZXNbc3BdKTsKKwlwdXNoKHNpemUpOworCXNpemU9MDsKKwlpZighcmVnYXZhaWxhYmxlKDApKQorCSAgenJlZz1wZ2V0X3JlZyhmLDAscCwwKTsKKwllbHNlCisJICB6cmVnPWdldF9yZWcoZiwwLHAsMCk7CisJZW1pdChmLCJcdG1vdmUubFx0JXMsJXNcbiIsbXJlZ25hbWVzW3NwXSxtcmVnbmFtZXNbenJlZ10pOworICAgICAgfQorICAgIH1lbHNleworICAgICAgaWYoKHNjcmF0Y2gmMikmJih6LT5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmei0+cmVnPj0xJiZ6LT5yZWc8PTgmJiF6LT5hbSl7CisJenJlZz16LT5yZWc7CisgICAgICB9ZWxzZXsKKwl6cmVnPWdldF9yZWcoZiwwLHAsMCk7CisJZW1pdChmLCJcdGxlYVx0Iik7ZW1pdF9vYmooZix6LFBPSU5URVIpOworCWVtaXQoZiwiLCVzXG4iLG1yZWduYW1lc1t6cmVnXSk7CisgICAgICB9CisgICAgfQorICAgIC8qICB3ZW5uIFR5cD09Q0hBUiwgZGFubiBpc3QgZGFzIGVpbiBpbmxpbmVfbWVtY3B5IHVuZCB3aXIgbmVobWVuICAgKi8KKyAgICAvKiAgZGFzIHVuZ3VlbnN0aWdzdGUgQWxpZ25tZW50IGFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyppZigodCZOUSk9PUNIQVIpeyBhMT0xO2EyPTI7fSovCisgICAgCisgICAgaWYoYz09UFVTSCYmKGExJjEpPT0wJiYoYTImMSk9PTApeworICAgICAgY3BzdHI9Ilx0bW92ZS4lY1x0LSglcyksLSglcylcbiI7CisgICAgICBkb3duPTE7CisgICAgfWVsc2UKKyAgICAgIGNwc3RyPSJcdG1vdmUuJWNcdCglcykrLCglcykrXG4iOworICAgIAorICAgIGlmKChhMSYxKSYmKGEyJjEpKXtlbWl0KGYsY3BzdHIsJ2InLG1yZWduYW1lc1txcmVnXSxtcmVnbmFtZXNbenJlZ10pO3MtLTthMSY9fjE7YTImPX4xO30KKyAgICBpZigoYTEmMikmJihhMiYyKSl7ZW1pdChmLGNwc3RyLCd3JyxtcmVnbmFtZXNbcXJlZ10sbXJlZ25hbWVzW3pyZWddKTtzLT0yO2ExJj1+MjthMiY9fjI7fQorICAgIGlmKCEoYTEmMSkmJiEoYTImMSkpIGxvb3BzPXMvMTYtMTsgZWxzZSBsb29wcz1zLzQtMTsKKyAgICBpZihsb29wcz4wKXsKKyAgICAgIGlmKGMhPUFTU0lHTiYmIXJlZ2F2YWlsYWJsZSgxKSkgZHJlZz1wZ2V0X3JlZyhmLDEscCwwKTsKKyAgICAgIGVsc2UgZHJlZz1nZXRfcmVnKGYsMSxwLDApOworICAgICAgZW1pdChmLCJcdG1vdmUlcy5sXHQjJWQsJXNcbiVzJWQ6XG4iLHF1aWNrW2xvb3BzPj0tMTI4JiZsb29wczw9MTI3XSxsb29wcyxtcmVnbmFtZXNbZHJlZ10sbGFicHJlZml4LCsrbGFiZWwpOworICAgIH0KKyAgICBpZihsb29wcz49MCl7CisgICAgICBpbnQgdDsKKyAgICAgIGlmKCEoYTEmMSkmJiEoYTImMSkpIHQ9J2wnOyBlbHNlIHQ9J2InOworICAgICAgZW1pdChmLGNwc3RyLHQsbXJlZ25hbWVzW3FyZWddLG1yZWduYW1lc1t6cmVnXSk7CisgICAgICBlbWl0KGYsY3BzdHIsdCxtcmVnbmFtZXNbcXJlZ10sbXJlZ25hbWVzW3pyZWddKTsKKyAgICAgIGVtaXQoZixjcHN0cix0LG1yZWduYW1lc1txcmVnXSxtcmVnbmFtZXNbenJlZ10pOworICAgICAgZW1pdChmLGNwc3RyLHQsbXJlZ25hbWVzW3FyZWddLG1yZWduYW1lc1t6cmVnXSk7CisgICAgfQorICAgIGlmKGxvb3BzPjApeworICAgICAgaWYoIWNmJiZsb29wczw9MzI3NjcmJmxvb3BzPj0tMzI3NjgpeworCWVtaXQoZiwiXHRkYnJhXHQlcywlcyVkXG4iLG1yZWduYW1lc1tkcmVnXSxsYWJwcmVmaXgsbGFiZWwpOworICAgICAgfWVsc2V7CisJZW1pdChmLCJcdHN1YnEubFx0IzEsJXNcblx0YmdlXHQlcyVkXG4iLG1yZWduYW1lc1tkcmVnXSxsYWJwcmVmaXgsbGFiZWwpOworICAgICAgfQorICAgIH0KKyAgICBpZighKGExJjEpJiYhKGEyJjEpKXsKKyAgICAgIGlmKHMmOCl7CisJZW1pdChmLGNwc3RyLCdsJyxtcmVnbmFtZXNbcXJlZ10sbXJlZ25hbWVzW3pyZWddKTsKKwllbWl0KGYsY3BzdHIsJ2wnLG1yZWduYW1lc1txcmVnXSxtcmVnbmFtZXNbenJlZ10pOworICAgICAgfQorICAgICAgaWYocyY0KSBlbWl0KGYsY3BzdHIsJ2wnLG1yZWduYW1lc1txcmVnXSxtcmVnbmFtZXNbenJlZ10pOworICAgICAgaWYocyYyKSBlbWl0KGYsY3BzdHIsJ3cnLG1yZWduYW1lc1txcmVnXSxtcmVnbmFtZXNbenJlZ10pOworICAgICAgaWYocyYxKSBlbWl0KGYsY3BzdHIsJ2InLG1yZWduYW1lc1txcmVnXSxtcmVnbmFtZXNbenJlZ10pOworICAgIH1lbHNleworICAgICAgcyY9MzsKKyAgICAgIHdoaWxlKHMpe2VtaXQoZixjcHN0ciwnYicsbXJlZ25hbWVzW3FyZWddLG1yZWduYW1lc1t6cmVnXSk7cy0tO30KKyAgICB9CisgICAgaWYoYz09UFVTSCYmcXJlZz09cS0+cmVnJiYoIShzY3JhdGNoJjEpKSYmIWRvd24pCisgICAgICBlbWl0KGYsIlx0c3ViJXMuJXNcdCMlbGQsJXNcbiIscXVpY2tbb3NpemU8PThdLHN0cnNob3J0W29zaXplPD0zMjc2N10sb3NpemUscmVnbmFtZXNbcXJlZ10pOworICAgIGlmKGM9PVBVU0gpIHB1c2goc2l6ZSk7CisgIH0KKyAgcmV0dXJuOworfQorc3RhdGljIGludCBtdXN0c3RvcmUoSUMgKnAsaW50IHIpCit7CisgIGlmKCFyZWdzW3JdKQorICAgIHJldHVybiAwOworI2lmIDAKKyAgLyogbWFsIGJlaSBHZWxlZ2VuaGVpdCB0ZXN0ZW4gKi8KKyAgd2hpbGUocCl7CisgICAgaWYocC0+Y29kZT09RlJFRVJFRyYmcC0+cTEucmVnPT1yKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYoKHAtPnExLmZsYWdzJlJFRykmJnAtPnExLnJlZz09cikKKyAgICAgIHJldHVybiAxOworICAgIGlmKHAtPnExLmFtJiYocC0+cTEuYW0tPmJhc2VyZWc9PXJ8fChwLT5xMS5hbS0+ZHJlZyYxMjcpPT1yKSkKKyAgICAgIHJldHVybiAxOworICAgIGlmKChwLT5xMi5mbGFncyZSRUcpJiZwLT5xMi5yZWc9PXIpCisgICAgICByZXR1cm4gMTsKKyAgICBpZihwLT5xMi5hbSYmKHAtPnEyLmFtLT5iYXNlcmVnPT1yfHwocC0+cTIuYW0tPmRyZWcmMTI3KT09cikpCisgICAgICByZXR1cm4gMTsKKyAgICBpZihwLT56LmFtJiYocC0+ei5hbS0+YmFzZXJlZz09cnx8KHAtPnouYW0tPmRyZWcmMTI3KT09cikpCisgICAgICByZXR1cm4gMTsKKyAgICBpZigocC0+ei5mbGFncyZSRUcpJiZwLT56LnJlZz09cikKKyAgICAgIHJldHVybiAocC0+ei5mbGFncyZEUkVGT0JKKSE9MDsKKyAgICBpZihwLT5jb2RlPj1MQUJFTCYmcC0+Y29kZTw9QlJBKQorICAgICAgcmV0dXJuIDE7CisgICAgcD1wLT5uZXh0OworICB9CisgIHJldHVybiAwOworI2Vsc2UKKyAgcmV0dXJuIDE7CisjZW5kaWYKK30KKworc3RhdGljIGludCBzdG9yZV9zYXZlcmVnczsKK3N0YXRpYyB2b2lkIHNhdmVyZWdzd2ZwKEZJTEUgKmYsSUMgKnAsaW50IHN0b3JlZnApCit7CisgICAgaW50IGRvbnRzYXZlOworICAgIHN0b3JlX3NhdmVyZWdzPTA7CisgICAgaWYoKHAtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRykgZG9udHNhdmU9cC0+ei5yZWc7IGVsc2UgZG9udHNhdmU9MDsKKyAgICBpZihkb250c2F2ZSE9IGQwJiZkb250c2F2ZSE9MjUmJihtdXN0c3RvcmUocCxkMCl8fG11c3RzdG9yZShwLGQwZDEpKSkge2VtaXQoZiwiXHRtb3ZlLmxcdCVzLC0oJXMpXG4iLG1yZWduYW1lc1tkMF0sbXJlZ25hbWVzW3NwXSk7cHVzaCg0KTtzdG9yZV9zYXZlcmVnc3w9MTt9CisgICAgaWYoZG9udHNhdmUhPTEwJiZkb250c2F2ZSE9MjUmJihtdXN0c3RvcmUocCxkMSl8fG11c3RzdG9yZShwLGQwZDEpKSkge2VtaXQoZiwiXHRtb3ZlLmxcdCVzLC0oJXMpXG4iLG1yZWduYW1lc1tkMV0sbXJlZ25hbWVzW3NwXSk7cHVzaCg0KTtzdG9yZV9zYXZlcmVnc3w9Mjt9CisgICAgaWYoZG9udHNhdmUhPSBmcDAmJm11c3RzdG9yZShwLGZwMCkpIHtlbWl0KGYsIlx0Zm1vdmUueFx0JXMsLSglcylcbiIsbXJlZ25hbWVzW2ZwMF0sbXJlZ25hbWVzW3NwXSk7cHVzaCgxMik7c3RvcmVfc2F2ZXJlZ3N8PTE2O30KKyAgICBpZihkb250c2F2ZSE9IGZwMSYmbXVzdHN0b3JlKHAsZnAxKSkge2VtaXQoZiwiXHRmbW92ZS54XHQlcywtKCVzKVxuIixtcmVnbmFtZXNbZnAxXSxtcmVnbmFtZXNbc3BdKTtwdXNoKDEyKTtzdG9yZV9zYXZlcmVnc3w9MzI7fQorICAgIGlmKGRvbnRzYXZlIT0gYTAmJm11c3RzdG9yZShwLGEwKSkge2VtaXQoZiwiXHRtb3ZlLmxcdCVzLC0oJXMpXG4iLG1yZWduYW1lc1thMF0sbXJlZ25hbWVzW3NwXSk7cHVzaCg0KTtzdG9yZV9zYXZlcmVnc3w9NDt9CisgICAgaWYoZG9udHNhdmUhPSBhMSYmbXVzdHN0b3JlKHAsYTEpKSB7ZW1pdChmLCJcdG1vdmUubFx0JXMsLSglcylcbiIsbXJlZ25hbWVzW2ExXSxtcmVnbmFtZXNbc3BdKTtwdXNoKDQpO3N0b3JlX3NhdmVyZWdzfD04O30KKworfQorc3RhdGljIHZvaWQgcmVzdG9yZXJlZ3NhKEZJTEUgKmYsSUMgKnApCit7CisgICAgaWYoc3RvcmVfc2F2ZXJlZ3MmOCkge2VtaXQoZiwiXHRtb3ZlLmxcdCglcykrLCVzXG4iLG1yZWduYW1lc1tzcF0sbXJlZ25hbWVzW2ExXSk7cG9wKDQpO30KKyAgICBpZihzdG9yZV9zYXZlcmVncyY0KSB7ZW1pdChmLCJcdG1vdmUubFx0KCVzKSssJXNcbiIsbXJlZ25hbWVzW3NwXSxtcmVnbmFtZXNbYTBdKTtwb3AoNCk7fQorfQorc3RhdGljIHZvaWQgcmVzdG9yZXJlZ3NkKEZJTEUgKmYsSUMgKnApCit7CisgICAgaW50IGRvbnRzYXZlOworICAgIGlmKChwLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpIGRvbnRzYXZlPXAtPnoucmVnOyBlbHNlIGRvbnRzYXZlPTA7CisgICAgaWYoZG9udHNhdmUhPWZwMSYmKHN0b3JlX3NhdmVyZWdzJjMyKSl7CisgICAgICBlbWl0KGYsIlx0Zm1vdmUueFx0KCVzKSssJXNcbiIsbXJlZ25hbWVzW3NwXSxtcmVnbmFtZXNbZnAxXSk7CisgICAgICBwb3AoMTIpOworICAgIH0KKyAgICBpZihkb250c2F2ZSE9ZnAwJiYoc3RvcmVfc2F2ZXJlZ3MmMTYpKXsKKyAgICAgIGVtaXQoZiwiXHRmbW92ZS54XHQoJXMpKywlc1xuIixtcmVnbmFtZXNbc3BdLG1yZWduYW1lc1tmcDBdKTsKKyAgICAgIHBvcCgxMik7CisgICAgfQorICAgIGlmKGRvbnRzYXZlIT0xMCYmKHN0b3JlX3NhdmVyZWdzJjIpKXsKKyAgICAgIGlmKCFHQVMmJiFQSFhBU1MpCisJZW1pdChmLCJcdG9wdFx0b20tXG4iKTsKKyAgICAgIGlmKGNmKQorICAgICAgICBlbWl0KGYsIlx0bW92ZW0ubFx0KCVzKSwlc1xuXHRhZGRxLmxcdCM0LCVzXG4iLG1yZWduYW1lc1tzcF0sbXJlZ25hbWVzW2QxXSxtcmVnbmFtZXNbc3BdKTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIlx0bW92ZW0ubFx0KCVzKSssJXNcbiIsbXJlZ25hbWVzW3NwXSxtcmVnbmFtZXNbZDFdKTsKKyAgICAgIHBvcCg0KTsKKyAgICAgIGlmKCFHQVMmJiFQSFhBU1MpCisJZW1pdChmLCJcdG9wdFx0b20rXG4iKTsKKyAgICB9CisgICAgaWYoZG9udHNhdmUhPWQwICYmKHN0b3JlX3NhdmVyZWdzJjEpKXsKKyAgICAgIGlmKCFHQVMmJiFQSFhBU1MpCisJZW1pdChmLCJcdG9wdFx0b20tXG4iKTsKKyAgICAgIGlmKGNmKQorICAgICAgICBlbWl0KGYsIlx0bW92ZW0ubFx0KCVzKSwlc1xuXHRhZGRxLmxcdCM0LCVzXG4iLG1yZWduYW1lc1tzcF0sbXJlZ25hbWVzW2QwXSxtcmVnbmFtZXNbc3BdKTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIlx0bW92ZW0ubFx0KCVzKSssJXNcbiIsbXJlZ25hbWVzW3NwXSxtcmVnbmFtZXNbZDBdKTsKKyAgICAgIHBvcCg0KTsKKyAgICAgIGlmKCFHQVMmJiFQSFhBU1MpCisJZW1pdChmLCJcdG9wdFx0b20rXG4iKTsKKyAgICB9Cit9CisKKy8qIGVtaXRzIHRoZSBsb3cgd29yZCBvZiBhIGxvbmcgbG9uZyBvYmplY3QgKi8KK3N0YXRpYyB2b2lkIGVtaXRfbHdvcmQoRklMRSAqZixvYmogKm8pCit7CisgIGlmKChvLT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKyAgICBpZighcmVnX3BhaXIoby0+cmVnLCZycCkpCisgICAgICBpZXJyb3IoMCk7CisgICAgZW1pdChmLCIlcyIsbXJlZ25hbWVzW3JwLnIyXSk7CisgIH1lbHNlIGlmKChvLT5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisgICAgZXZhbF9jb25zdCgmby0+dmFsLFVOU0lHTkVEfExMT05HKTsKKyAgICB2dW1heD16dW1hbmQodnVtYXgsdWwyenVtKDB4ZmZmZmZmZmYpKTsKKyAgICBpbnNlcnRfY29uc3QoJmd2YWwsVU5TSUdORUR8TUFYSU5UKTsKKyAgICBlbWl0KGYsIiMiKTsKKyAgICBlbWl0dmFsKGYsJmd2YWwsVU5TSUdORUR8TUFYSU5UKTsKKyAgfWVsc2V7CisgICAgaWYoby0+YW18fChvLT5mbGFncyZSRUcpKXsKKyAgICAgIG8tPmZsYWdzfD1EMTZPRkY7CisgICAgICBvLT52YWwudm1heD1sMnptKDBMKTsKKyAgICB9CisgICAgby0+dmFsLnZtYXg9em1hZGQoby0+dmFsLnZtYXgsbDJ6bSg0TCkpOworICAgIGVtaXRfb2JqKGYsbyxMTE9ORyk7CisgICAgby0+ZmxhZ3MmPX5EMTZPRkY7CisgICAgby0+dmFsLnZtYXg9em1zdWIoby0+dmFsLnZtYXgsbDJ6bSg0TCkpOworICB9Cit9CisvKiBlbWl0cyB0aGUgaGlnaCB3b3JkIG9mIGEgbG9uZyBsb25nIG9iamVjdCAqLworc3RhdGljIHZvaWQgZW1pdF9od29yZChGSUxFICpmLG9iaiAqbykKK3sKKyAgaWYoKG8tPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpeworICAgIGlmKCFyZWdfcGFpcihvLT5yZWcsJnJwKSkgCisgICAgICBpZXJyb3IoMCk7CisgICAgZW1pdChmLCIlcyIsbXJlZ25hbWVzW3JwLnIxXSk7CisgIH1lbHNlIGlmKChvLT5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisgICAgZXZhbF9jb25zdCgmby0+dmFsLFVOU0lHTkVEfE1BWElOVCk7CisgICAgdnVtYXg9enVtYW5kKHp1bXJzaGlmdCh2dW1heCx1bDJ6dW0oMzJVTCkpLHVsMnp1bSgweGZmZmZmZmZmKSk7CisgICAgaW5zZXJ0X2NvbnN0KCZndmFsLFVOU0lHTkVEfE1BWElOVCk7CisgICAgZW1pdChmLCIjIik7CisgICAgZW1pdHZhbChmLCZndmFsLFVOU0lHTkVEfE1BWElOVCk7CisgIH1lbHNleworICAgIGVtaXRfb2JqKGYsbyxMT05HKTsKKyAgfQorfQorLyogcHJvY2VzcyBJQ3Mgd2l0aCBsb25nIGxvbmc7IHJldHVybiAxIGlmIElDIGhhcyBiZWVuIGhhbmRsZWQgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX2xsb25nKEZJTEUgKmYsSUMgKnApCit7CisgIGludCBjPXAtPmNvZGUscj0wLHQ9cC0+dHlwZiZOVTsKKyAgY2hhciAqbGliZnVuY25hbWU7CisKKyAgaWYoYz09QUREUkVTUykgcmV0dXJuIDA7CisgIAorICBjY19zZXQ9MDsKKyAgaWYoYz09R0VUUkVUVVJOKXsKKyAgICBpZihpc3JlZyh6KSYmcC0+ei5yZWc9PTI1KQorICAgICAgcmV0dXJuIDE7CisgICAgZW1pdChmLCJcdG1vdmUubFx0JXMsIixtcmVnbmFtZXNbZDFdKTsKKyAgICBlbWl0X2x3b3JkKGYsJnAtPnopOworICAgIGVtaXQoZiwiXG4iKTsKKyAgICBlbWl0KGYsIlx0bW92ZS5sXHQlcywiLG1yZWduYW1lc1tkMF0pOworICAgIGVtaXRfaHdvcmQoZiwmcC0+eik7CisgICAgZW1pdChmLCJcbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmKGM9PVNFVFJFVFVSTil7CisgICAgaWYoaXNyZWcocTEpJiZwLT5xMS5yZWc9PTI1KQorICAgICAgcmV0dXJuIDE7CisgICAgZW1pdChmLCJcdG1vdmUubFx0Iik7CisgICAgZW1pdF9sd29yZChmLCZwLT5xMSk7CisgICAgZW1pdChmLCIsJXNcbiIsbXJlZ25hbWVzW2QxXSk7CisgICAgZW1pdChmLCJcdG1vdmUubFx0Iik7CisgICAgZW1pdF9od29yZChmLCZwLT5xMSk7CisgICAgZW1pdChmLCIsJXNcbiIsbXJlZ25hbWVzW2QwXSk7ICAgIAorICAgIHJldHVybiAxOworICB9CisgIGlmKGM9PUNPTlZFUlQpeworICAgIGludCB0b2xkPXExdHlwKHApLHRuZXc9enR5cChwKTsKKyAgICBpZihJU1BPSU5URVIodG9sZCkpIHRvbGQ9VU5TSUdORUR8TE9ORzsKKyAgICBpZihJU1BPSU5URVIodG5ldykpIHRuZXc9VU5TSUdORUR8TE9ORzsKKyAgICBpZihJU0ZMT0FUKHRvbGQpKXsKKyAgICAgIGlmKCFPTERfU09GVEZMT0FUKSBpZXJyb3IoMCk7CisgICAgICBzYXZlcmVncyhmLHApOworICAgICAgYXNzaWduKGYscCwmcC0+cTEsMCxQVVNILG1zaXpldGFiW3RvbGQmTlFdLHRvbGQpOworICAgICAgc2NyYXRjaF9tb2RpZmllZCgpOworICAgICAgaWYoR0FTKQorCWVtaXQoZiwiXHQuZ2xvYmFsXHRfX2ZsdCVsZHRvJWNpbnQ2NFxuXHRqYnNyXHRfX2ZsdCVsZHRvJWNpbnQ2NFxuXHRhZGRxLiVzXHQjJWxkLCVzXG4iLG1zaXpldGFiW3RvbGQmTlFdKjgsKHRuZXcmVU5TSUdORUQpPyd1JzoncycsbXNpemV0YWJbdG9sZCZOUV0qOCwodG5ldyZVTlNJR05FRCk/J3UnOidzJyxzdHJzaG9ydFsxXSxtc2l6ZXRhYlt0b2xkJk5RXSxtcmVnbmFtZXNbc3BdKTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIlx0cHVibGljXHRfX2ZsdCVsZHRvJWNpbnQ2NFxuXHRqc3JcdF9fZmx0JWxkdG8lY2ludDY0XG5cdGFkZHEuJXNcdCMlbGQsJXNcbiIsbXNpemV0YWJbdG9sZCZOUV0qOCwodG5ldyZVTlNJR05FRCk/J3UnOidzJyxtc2l6ZXRhYlt0b2xkJk5RXSo4LCh0bmV3JlVOU0lHTkVEKT8ndSc6J3MnLHN0cnNob3J0WzFdLG1zaXpldGFiW3RvbGQmTlFdLG1yZWduYW1lc1tzcF0pOworICAgICAgcG9wKG1zaXpldGFiW3RvbGRdKTsKKyAgICAgIHJlc3RvcmVyZWdzYShmLHApOworICAgICAgaWYoIWlzcmVnKHopfHxwLT56LnJlZyE9MjUpeyAvKiBkMC9kMSAqLworCWVtaXQoZiwiXHRtb3ZlLmxcdCVzLCIsbXJlZ25hbWVzW2QxXSk7CisJZW1pdF9sd29yZChmLCZwLT56KTsKKwllbWl0KGYsIlxuIik7CisJZW1pdChmLCJcdG1vdmUubFx0JXMsIixtcmVnbmFtZXNbZDBdKTsKKwllbWl0X2h3b3JkKGYsJnAtPnopOworCWVtaXQoZiwiXG4iKTsKKyAgICAgIH0KKyAgICAgIHJlc3RvcmVyZWdzZChmLHApOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmKElTRkxPQVQodG5ldykpeworICAgICAgc2F2ZXJlZ3N3ZnAoZixwLDEpOworICAgICAgYXNzaWduKGYscCwmcC0+cTEsMCxQVVNILG1zaXpldGFiW3RvbGQmTlFdLHRvbGQpOworICAgICAgc2NyYXRjaF9tb2RpZmllZCgpOworICAgICAgaWYoR0FTKQorCWVtaXQoZiwiXHQuZ2xvYmFsXHRfXyVjaW50NjR0b2ZsdCVsZFxuXHRqYnNyXHRfXyVjaW50NjR0b2ZsdCVsZFxuXHRhZGRxLiVzXHQjJWxkLCVzXG4iLCh0b2xkJlVOU0lHTkVEKT8ndSc6J3MnLG1zaXpldGFiW3RuZXcmTlFdKjgsKHRvbGQmVU5TSUdORUQpPyd1JzoncycsbXNpemV0YWJbdG5ldyZOUV0qOCxzdHJzaG9ydFsxXSxtc2l6ZXRhYlt0b2xkJk5RXSxtcmVnbmFtZXNbc3BdKTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIlx0cHVibGljXHRfXyVjaW50NjR0b2ZsdCVsZFxuXHRqc3JcdF9fJWNpbnQ2NHRvZmx0JWxkXG5cdGFkZHEuJXNcdCMlbGQsJXNcbiIsKHRvbGQmVU5TSUdORUQpPyd1JzoncycsbXNpemV0YWJbdG5ldyZOUV0qOCwodG9sZCZVTlNJR05FRCk/J3UnOidzJyxtc2l6ZXRhYlt0bmV3Jk5RXSo4LHN0cnNob3J0WzFdLG1zaXpldGFiW3RvbGQmTlFdLG1yZWduYW1lc1tzcF0pOworICAgICAgcG9wKG1zaXpldGFiW3RvbGQmTlFdKTsKKyAgICAgIHJlc3RvcmVyZWdzYShmLHApOworICAgICAgaWYoRlBVPjY4MDAwKXsKKwllbWl0KGYsIlx0Zm1vdmUueFx0ZnAwLCIpOworCWVtaXRfb2JqKGYsJnAtPnosdG5ldyk7CisJZW1pdChmLCJcbiIpOworICAgICAgfWVsc2UgaWYoKHRuZXcmTlEpPT1GTE9BVCl7CisJZW1pdChmLCJcdG1vdmUubFx0JXMsIixtcmVnbmFtZXNbZDBdKTsKKwllbWl0X29iaihmLCZwLT56LHRuZXcpOworCWVtaXQoZiwiXG4iKTsKKyAgICAgIH1lbHNleworCWVtaXQoZiwiXHRtb3ZlLmxcdGQxLCIpOworCWVtaXRfbHdvcmQoZiwmcC0+eik7CisJZW1pdChmLCJcbiIpOworCWVtaXQoZiwiXHRtb3ZlLmxcdCVzLCIsbXJlZ25hbWVzW2QwXSk7CisJZW1pdF9od29yZChmLCZwLT56KTsKKwllbWl0KGYsIlxuIik7CisgICAgICB9CisgICAgICByZXN0b3JlcmVnc2QoZixwKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZigodG9sZCZOUSk8TExPTkcpeworICAgICAgaW50IGRlc3RyZWc9MDsKKyAgICAgIGlmKElTSFdPUkQodG9sZCl8fCEodG9sZCZVTlNJR05FRCkpeworCWlmKGlzcmVnKHopKXsKKwkgIGlmKCFyZWdfcGFpcihwLT56LnJlZywmcnApKSBpZXJyb3IoMCk7CisJICByPXJwLnIyOworCSAgZGVzdHJlZz0xOworCX1lbHNleworCSAgcj1nZXRfcmVnKGYsMSxwLDApOworCX0KKwlsb2FkZXh0KGYsciwmcC0+cTEsdG9sZCk7CisJcC0+cTEuZmxhZ3M9UkVHOworCXAtPnExLnJlZz1yOworCXAtPnExLmFtPTA7CisgICAgICB9CisgICAgICBpZighZGVzdHJlZyl7CisJZW1pdChmLCJcdG1vdmUubFx0Iik7CisJZW1pdF9vYmooZiwmcC0+cTEsdG9sZCk7CisJZW1pdChmLCIsIik7CisJZW1pdF9sd29yZChmLCZwLT56KTsKKwllbWl0KGYsIlxuIik7CisgICAgICB9CisgICAgICBpZih0b2xkJlVOU0lHTkVEKXsKKwllbWl0KGYsIlx0bW92ZS5sXHQjMCwiKTsKKwllbWl0X2h3b3JkKGYsJnAtPnopOworCWVtaXQoZiwiXG4iKTsKKyAgICAgIH1lbHNleworCWludCB0bXA7CisJaWYocj09MCkKKwkgIGllcnJvcigwKTsKKwlpZihkZXN0cmVnKXsKKwkgIGVtaXQoZiwiXHRtb3ZlLmxcdCVzLCVzXG4iLG1yZWduYW1lc1tyXSxtcmVnbmFtZXNbcnAucjFdKTsKKwkgIHI9cnAucjE7CisJfQorCXRtcD1nZXRfcmVnKGYsMSxwLDApOworCWVtaXQoZiwiXHRtb3ZlcVx0IzMxLCVzXG4iLG1yZWduYW1lc1t0bXBdKTsKKwllbWl0KGYsIlx0YXNyLmxcdCVzLCVzXG4iLG1yZWduYW1lc1t0bXBdLG1yZWduYW1lc1tyXSk7CisJaWYoIWRlc3RyZWcpeworCSAgZW1pdChmLCJcdG1vdmUubFx0JXMsIixtcmVnbmFtZXNbcl0pOworCSAgZW1pdF9od29yZChmLCZwLT56KTsKKwkgIGVtaXQoZiwiXG4iKTsKKwl9CisgICAgICB9CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYoKHRuZXcmTlEpPExMT05HKXsKKyAgICAgIGlmKCh0bmV3Jk5RKTxJTlQmJiFpc3JlZyh6KSl7CisJcj1nZXRfcmVnKGYsMSxwLDApOworCWVtaXQoZiwiXHRtb3ZlLmxcdCIpOworCWVtaXRfbHdvcmQoZiwmcC0+cTEpOworCWVtaXQoZiwiLCVzXG4iLG1yZWduYW1lc1tyXSk7CisJZW1pdChmLCJcdG1vdmUuJWNcdCVzLCIseF90W3RuZXcmTlFdLG1yZWduYW1lc1tyXSk7CisJZW1pdF9vYmooZiwmcC0+eix0bmV3KTsKKwllbWl0KGYsIlxuIik7CisgICAgICB9ZWxzZXsKKwllbWl0KGYsIlx0bW92ZS4lY1x0Iix4X3RbdG5ldyZOUV0pOworCXAtPnExLnZhbC52bWF4PXptYWRkKHAtPnExLnZhbC52bWF4LHptc3ViKHNpemV0YWJbTE9OR10sc2l6ZXRhYlt0bmV3Jk5RXSkpOworCWVtaXRfbHdvcmQoZiwmcC0+cTEpOworCWVtaXQoZiwiLCIpOworCWVtaXRfb2JqKGYsJnAtPnosdG5ldyk7CisJZW1pdChmLCJcbiIpOworICAgICAgfQorICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGFzc2lnbihmLHAsJnAtPnExLCZwLT56LEFTU0lHTixtc2l6ZXRhYlt0XSx0KTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZihjPT1BU1NJR04peworICAgIGFzc2lnbihmLHAsJnAtPnExLCZwLT56LEFTU0lHTixtc2l6ZXRhYlt0XSx0KTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZihjPT1QVVNIKXsKKyAgICBkb250cG9wKz16bTJsKHAtPnEyLnZhbC52bWF4KTsKKyAgICBhc3NpZ24oZixwLCZwLT5xMSwwLFBVU0gsbXNpemV0YWJbdF0sdCk7CisgICAgcmV0dXJuIDE7CisgIH0gIAorICBpZihjPT1NSU5VU3x8Yz09S09NUExFTUVOVCl7CisgICAgY2hhciAqc2wsKnNoOworICAgIGlmKGM9PU1JTlVTKXsKKyAgICAgIHNsPSJuZWcubCI7CisgICAgICBzaD0ibmVneC5sIjsKKyAgICB9ZWxzZQorICAgICAgc2w9c2g9Im5vdC5sIjsKKyAgICBpZighY2YmJmNvbXBhcmVfb2JqZWN0cygmcC0+cTEsJnAtPnopKXsKKyAgICAgIGVtaXQoZiwiXHQlc1x0IixzbCk7CisgICAgICBlbWl0X2x3b3JkKGYsJnAtPnopOworICAgICAgZW1pdChmLCJcbiIpOworICAgICAgZW1pdChmLCJcdCVzXHQiLHNoKTsKKyAgICAgIGVtaXRfaHdvcmQoZiwmcC0+eik7CisgICAgICBlbWl0KGYsIlxuIik7ICAgICAgCisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYoaXNyZWcoeikpeworICAgICAgaWYoIXJlZ19wYWlyKHAtPnoucmVnLCZycCkpIGllcnJvcigwKTsKKyAgICAgIGFzc2lnbihmLHAsJnAtPnExLCZwLT56LEFTU0lHTixtc2l6ZXRhYlt0XSx0KTsKKyAgICAgIGVtaXQoZiwiXHQlc1x0JXNcbiIsc2wsbXJlZ25hbWVzW3JwLnIyXSk7CisgICAgICBlbWl0KGYsIlx0JXNcdCVzXG4iLHNoLG1yZWduYW1lc1tycC5yMV0pOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHI9Z2V0X3JlZyhmLDEscCwwKTsKKyAgICBlbWl0KGYsIlx0bW92ZS5sXHQiKTsKKyAgICBlbWl0X2x3b3JkKGYsJnAtPnExKTsKKyAgICBlbWl0KGYsIiwlc1xuIixtcmVnbmFtZXNbcl0pOworICAgIGVtaXQoZiwiXHQlc1x0JXNcbiIsc2wsbXJlZ25hbWVzW3JdKTsKKyAgICBlbWl0KGYsIlx0bW92ZS5sXHQlcywiLG1yZWduYW1lc1tyXSk7CisgICAgZW1pdF9sd29yZChmLCZwLT56KTsKKyAgICBlbWl0KGYsIlxuIik7CisgICAgZW1pdChmLCJcdG1vdmUubFx0Iik7CisgICAgZW1pdF9od29yZChmLCZwLT5xMSk7CisgICAgZW1pdChmLCIsJXNcbiIsbXJlZ25hbWVzW3JdKTsKKyAgICBlbWl0KGYsIlx0JXNcdCVzXG4iLHNoLG1yZWduYW1lc1tyXSk7CisgICAgZW1pdChmLCJcdG1vdmUubFx0JXMsIixtcmVnbmFtZXNbcl0pOworICAgIGVtaXRfaHdvcmQoZiwmcC0+eik7ICAgIAorICAgIGVtaXQoZiwiXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZigoYz49T1ImJmM8PUFORCl8fGM9PUFERHx8Yz09U1VCKXsKKyAgICBjaGFyICpzbCwqc2g7aW50IHQyPTA7CisgICAgc3dpdGNoX0lDKHApOworICAgIGlmKGM9PUFERCl7c2w9ImFkZC5sIjtzaD0iYWRkeC5sIjt9CisgICAgZWxzZSBpZihjPT1TVUIpe3NsPSJzdWIubCI7c2g9InN1YngubCI7fQorICAgIGVsc2UgaWYoYz09QU5EKXtzbD1zaD0iYW5kLmwiO30KKyAgICBlbHNlIGlmKGM9PU9SKXtzbD1zaD0ib3IubCI7fQorICAgIGVsc2UgaWYoYz09WE9SKXtzbD1zaD0iZW9yLmwiO30KKyAgICBlbHNlCisgICAgICBpZXJyb3IoMCk7CisgICAgaWYoaXNyZWcocTEpJiZpc3JlZyhxMikmJmlzcmVnKHopJiZwLT5xMS5yZWc9PXAtPnEyLnJlZyYmcC0+cTEucmVnPT1wLT56LnJlZyl7CisgICAgICBpZighcmVnX3BhaXIocC0+cTEucmVnLCZycCkpIGllcnJvcigwKTsKKyAgICAgIGVtaXQoZiwiXHQlc1x0JXMsJXNcbiIsc2wsbXJlZ25hbWVzW3JwLnIyXSxtcmVnbmFtZXNbcnAucjJdKTsKKyAgICAgIGVtaXQoZiwiXHQlc1x0JXMsJXNcbiIsc2gsbXJlZ25hbWVzW3JwLnIxXSxtcmVnbmFtZXNbcnAucjFdKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZighaXNyZWcoeikmJmNvbXBhcmVfb2JqZWN0cygmcC0+cTEsJnAtPnopKXsKKyAgICAgIGlmKGlzcmVnKHEyKXx8KGlzY29uc3QocTIpJiYoYz09QUREfHxjPT1TVUIpJiYhY2YpKXsKKwlpZighcikgcj1nZXRfcmVnKGYsMSxwLDApOworCWVtaXQoZiwiXHQlc1x0IixzbCk7CisJZW1pdF9sd29yZChmLCZwLT5xMik7CisgICAgICB9ZWxzZXsKKwlpZighcikgcj1nZXRfcmVnKGYsMSxwLDApOworCWVtaXQoZiwiXHRtb3ZlLmxcdCIpOworCWVtaXRfbHdvcmQoZiwmcC0+cTIpOworCWVtaXQoZiwiLCVzXG4iLG1yZWduYW1lc1tyXSk7CisJZW1pdChmLCJcdCVzXHQlcyIsc2wsbXJlZ25hbWVzW3JdKTsKKyAgICAgIH0KKyAgICAgIGVtaXQoZiwiLCIpOworICAgICAgZW1pdF9sd29yZChmLCZwLT56KTsKKyAgICAgIGVtaXQoZiwiXG4iKTsKKyAgICAgIGlmKCFpc3JlZyhxMil8fGM9PUFERHx8Yz09U1VCfHxjPT1YT1IpeworCWVtaXQoZiwiXHRtb3ZlLmxcdCIpOworCWVtaXRfaHdvcmQoZiwmcC0+cTEpOworCWVtaXQoZiwiLCVzXG4iLG1yZWduYW1lc1tyXSk7CisJaWYoaXNyZWcocTIpKXsKKwkgIGlmKCFyZWdfcGFpcihwLT5xMi5yZWcsJnJwKSkgaWVycm9yKDApOworCSAgdDI9cnAucjE7CisJfWVsc2V7CisJICB0Mj1nZXRfcmVnKGYsMSxwLDApOworCSAgZW1pdChmLCJcdG1vdmUubFx0Iik7CisJICBlbWl0X2h3b3JkKGYsJnAtPnEyKTsKKwkgIGVtaXQoZiwiLCVzXG4iLG1yZWduYW1lc1t0Ml0pOworCX0KKwllbWl0KGYsIlx0JXNcdCVzLCVzXG4iLHNoLG1yZWduYW1lc1t0Ml0sbXJlZ25hbWVzW3JdKTsKKwllbWl0KGYsIlx0bW92ZS5sXHQlcywiLG1yZWduYW1lc1tyXSk7CisJZW1pdF9od29yZChmLCZwLT56KTsKKwllbWl0KGYsIlxuIik7CisgICAgICB9ZWxzZXsKKwlpZihpc3JlZyhxMikpeworCSAgZW1pdChmLCJcdCVzXHQiLHNoKTsKKwkgIGVtaXRfaHdvcmQoZiwmcC0+cTIpOworCX1lbHNleworCSAgaWYoIXIpIHI9Z2V0X3JlZyhmLDEscCwwKTsKKwkgIGVtaXQoZiwiXHRtb3ZlLmxcdCIpOworCSAgZW1pdF9od29yZChmLCZwLT5xMik7CisJICBlbWl0KGYsIiwlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgZW1pdChmLCJcdCVzXHQlcyIsc2gsbXJlZ25hbWVzW3JdKTsKKwl9CisJZW1pdChmLCIsIik7CisJZW1pdF9od29yZChmLCZwLT56KTsKKwllbWl0KGYsIlxuIik7ICAgICAgCisgICAgICB9CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYoaXNyZWcoeikmJighaXNyZWcocTIpfHxwLT56LnJlZyE9cC0+cTIucmVnKSl7CisgICAgICBpZighcmVnX3BhaXIocC0+ei5yZWcsJnJwKSkgaWVycm9yKDApOworICAgICAgcj1ycC5yMjsKKyAgICB9ZWxzZXsKKyAgICAgIHI9Z2V0X3JlZyhmLDEscCwwKTsKKyAgICB9CisgICAgaWYoIWNvbXBhcmVfb2JqZWN0cygmcC0+cTEsJnAtPnopKXsKKyAgICAgIGVtaXQoZiwiXHRtb3ZlLmxcdCIpOworICAgICAgZW1pdF9sd29yZChmLCZwLT5xMSk7CisgICAgICBlbWl0KGYsIiwlc1xuIixtcmVnbmFtZXNbcl0pOworICAgIH0KKyAgICBpZihjPT1YT1IpeworICAgICAgdDI9Z2V0X3JlZyhmLDEscCwwKTsKKyAgICAgIGVtaXQoZiwiXHRtb3ZlLmxcdCIpOworICAgICAgZW1pdF9sd29yZChmLCZwLT5xMik7CisgICAgICBlbWl0KGYsIiwlc1xuIixtcmVnbmFtZXNbdDJdKTsKKyAgICAgIGVtaXQoZiwiXHQlc1x0JXMsJXNcbiIsc2wsbXJlZ25hbWVzW3QyXSxtcmVnbmFtZXNbcl0pOworICAgIH1lbHNleworICAgICAgZW1pdChmLCJcdCVzXHQiLHNsKTsKKyAgICAgIGVtaXRfbHdvcmQoZiwmcC0+cTIpOworICAgICAgZW1pdChmLCIsJXNcbiIsbXJlZ25hbWVzW3JdKTsKKyAgICB9CisgICAgaWYoaXNyZWcoeikmJighaXNyZWcocTIpfHxwLT56LnJlZyE9cC0+cTIucmVnKSl7CisgICAgICBpZighcmVnX3BhaXIocC0+ei5yZWcsJnJwKSkgaWVycm9yKDApOworICAgICAgcj1ycC5yMTsKKyAgICB9ZWxzZXsKKyAgICAgIGVtaXQoZiwiXHRtb3ZlLmxcdCVzLCIsbXJlZ25hbWVzW3JdKTsKKyAgICAgIGVtaXRfbHdvcmQoZiwmcC0+eik7CisgICAgICBlbWl0KGYsIlxuIik7CisgICAgfQorICAgIGlmKCFjb21wYXJlX29iamVjdHMoJnAtPnExLCZwLT56KSl7CisgICAgICBlbWl0KGYsIlx0bW92ZS5sXHQiKTsKKyAgICAgIGVtaXRfaHdvcmQoZiwmcC0+cTEpOworICAgICAgZW1pdChmLCIsJXNcbiIsbXJlZ25hbWVzW3JdKTsKKyAgICB9CisgICAgaWYoYz09WE9SfHxjPT1BRER8fGM9PVNVQil7CisgICAgICBpZihpc3JlZyhxMikpeworCWlmKCFyZWdfcGFpcihwLT5xMi5yZWcsJnJwKSkgaWVycm9yKDApOworCXQyPXJwLnIxOworICAgICAgfWVsc2V7CisJaWYoIXQyKSB0Mj1nZXRfcmVnKGYsMSxwLDApOworCWVtaXQoZiwiXHRtb3ZlLmxcdCIpOworCWVtaXRfaHdvcmQoZiwmcC0+cTIpOworCWVtaXQoZiwiLCVzXG4iLG1yZWduYW1lc1t0Ml0pOworICAgICAgfQorICAgICAgZW1pdChmLCJcdCVzXHQlcywlc1xuIixzaCxtcmVnbmFtZXNbdDJdLG1yZWduYW1lc1tyXSk7CisgICAgfWVsc2V7CisgICAgICBlbWl0KGYsIlx0JXNcdCIsc2gpOworICAgICAgZW1pdF9od29yZChmLCZwLT5xMik7CisgICAgICBlbWl0KGYsIiwlc1xuIixtcmVnbmFtZXNbcl0pOworICAgIH0KKyAgICBpZighaXNyZWcoeil8fChpc3JlZyhxMikmJnAtPnoucmVnPT1wLT5xMi5yZWcpKXsKKyAgICAgIGVtaXQoZiwiXHRtb3ZlLmxcdCVzLCIsbXJlZ25hbWVzW3JdKTsKKyAgICAgIGVtaXRfaHdvcmQoZiwmcC0+eik7CisgICAgICBlbWl0KGYsIlxuIik7CisgICAgfSAgICAgIAorICAgIHJldHVybiAxOworICB9CisgIGlmKGM9PVRFU1QpeworICAgIHAtPmNvZGU9Yz1DT01QQVJFOworICAgIHAtPnEyLmZsYWdzPUtPTlNUOworICAgIGlmKCh0Jk5VKT09TExPTkcpCisgICAgICBwLT5xMi52YWwudmxsb25nPXptMnpsbChsMnptKDBMKSk7CisgICAgZWxzZSBpZigodCZOVSk9PShVTlNJR05FRHxMTE9ORykpCisgICAgICBwLT5xMi52YWwudnVsbG9uZz16dW0yenVsbCh1bDJ6dW0oMFVMKSk7CisgICAgZWxzZQorICAgICAgaWVycm9yKDApOworICB9CisgIGlmKGM9PUNPTVBBUkUpeworICAgIGludCBybCxyaCx0MjsKKyAgICBjb21wdHlwPXAtPnR5cGY7CisgICAgcmw9Z2V0X3JlZyhmLDEscCwwKTsKKyAgICByaD1nZXRfcmVnKGYsMSxwLDApOworICAgIGVtaXQoZiwiXHRtb3ZlLmxcdCIpOworICAgIGVtaXRfbHdvcmQoZiwmcC0+cTEpOworICAgIGVtaXQoZiwiLCVzXG4iLG1yZWduYW1lc1tybF0pOworICAgIGVtaXQoZiwiXHRtb3ZlLmxcdCIpOworICAgIGVtaXRfaHdvcmQoZiwmcC0+cTEpOworICAgIGVtaXQoZiwiLCVzXG4iLG1yZWduYW1lc1tyaF0pOworICAgIGlmKGlzcmVnKHEyKSl7CisgICAgICBpZighcmVnX3BhaXIocC0+cTIucmVnLCZycCkpIGllcnJvcigwKTsKKyAgICAgIHQyPXJwLnIxOworICAgIH1lbHNleworICAgICAgdDI9Z2V0X3JlZyhmLDEscCwwKTsKKyAgICAgIGVtaXQoZiwiXHRtb3ZlLmxcdCIpOworICAgICAgZW1pdF9od29yZChmLCZwLT5xMik7CisgICAgICBlbWl0KGYsIiwlc1xuIixtcmVnbmFtZXNbdDJdKTsKKyAgICB9CisgICAgZW1pdChmLCJcdHN1Yi5sXHQiKTsKKyAgICBlbWl0X2x3b3JkKGYsJnAtPnEyKTsKKyAgICBlbWl0KGYsIiwlc1xuIixtcmVnbmFtZXNbcmxdKTsKKyAgICBlbWl0KGYsIlx0c3VieC5sXHQlcywlc1xuIixtcmVnbmFtZXNbdDJdLG1yZWduYW1lc1tyaF0pOworICAgIHJldHVybiAxOworICB9CisgIHNhdmVyZWdzKGYscCk7CisgIGlmKChjPT1MU0hJRlR8fGM9PVJTSElGVCkmJihxMnR5cChwKSZOUSk9PUxMT05HKXsKKyAgICBlbWl0KGYsIlx0bW92ZS5sXHQiKTsKKyAgICBlbWl0X2x3b3JkKGYsJnAtPnEyKTsKKyAgICBlbWl0KGYsIiwtKCVzKVxuIixtcmVnbmFtZXNbc3BdKTsKKyAgICBwdXNoKDQpOworICB9ZWxzZQorICAgIGFzc2lnbihmLHAsJnAtPnEyLDAsUFVTSCxtc2l6ZXRhYltxMnR5cChwKSZOUV0scTJ0eXAocCkpOworICBhc3NpZ24oZixwLCZwLT5xMSwwLFBVU0gsbXNpemV0YWJbcTF0eXAocCkmTlFdLHExdHlwKHApKTsKKyAgc2NyYXRjaF9tb2RpZmllZCgpOworICBpZihjPT1NVUxUKXsKKyAgICBpZihDUFU9PTY4MDYwKQorICAgICAgbGliZnVuY25hbWU9Il9fbXVsaW50NjRfMDYwIjsKKyAgICBlbHNlIGlmKENQVT49NjgwMjApCisgICAgICBsaWJmdW5jbmFtZT0iX19tdWxpbnQ2NF8wMjAiOworICAgIGVsc2UKKyAgICAgIGxpYmZ1bmNuYW1lPSJfX211bGludDY0IjsKKyAgfWVsc2UgaWYoYz09RElWKXsKKyAgICBpZih0JlVOU0lHTkVEKXsKKyAgICAgIGlmKENQVT09NjgwNjApCisJbGliZnVuY25hbWU9Il9fZGl2dWludDY0XzA2MCI7CisgICAgICBlbHNlIGlmKENQVT49NjgwMjApCisJbGliZnVuY25hbWU9Il9fZGl2dWludDY0XzAyMCI7CisgICAgICBlbHNlCisJbGliZnVuY25hbWU9Il9fZGl2dWludDY0IjsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKENQVT09NjgwNjApCisJbGliZnVuY25hbWU9Il9fZGl2c2ludDY0XzA2MCI7CisgICAgICBlbHNlIGlmKENQVT49NjgwMjApCisJbGliZnVuY25hbWU9Il9fZGl2c2ludDY0XzAyMCI7CisgICAgICBlbHNlCisJbGliZnVuY25hbWU9Il9fZGl2c2ludDY0IjsKKyAgICB9CisgIH1lbHNlIGlmKGM9PU1PRCl7CisgICAgaWYodCZVTlNJR05FRCl7CisgICAgICBpZihDUFU9PTY4MDYwKQorCWxpYmZ1bmNuYW1lPSJfX21vZHVpbnQ2NF8wNjAiOworICAgICAgZWxzZSBpZihDUFU+PTY4MDIwKQorCWxpYmZ1bmNuYW1lPSJfX21vZHVpbnQ2NF8wMjAiOworICAgICAgZWxzZQorCWxpYmZ1bmNuYW1lPSJfX21vZHVpbnQ2NCI7CisgICAgfWVsc2V7CisgICAgICBpZihDUFU9PTY4MDYwKQorCWxpYmZ1bmNuYW1lPSJfX21vZHNpbnQ2NF8wNjAiOworICAgICAgZWxzZSBpZihDUFU+PTY4MDIwKQorCWxpYmZ1bmNuYW1lPSJfX21vZHNpbnQ2NF8wMjAiOworICAgICAgZWxzZQorCWxpYmZ1bmNuYW1lPSJfX21vZHNpbnQ2NCI7CisgICAgfQorICB9ZWxzZSBpZihjPT1SU0hJRlQpeworICAgIGlmKHQmVU5TSUdORUQpCisgICAgICBsaWJmdW5jbmFtZT0iX19yc2h1aW50NjQiOworICAgIGVsc2UKKyAgICAgIGxpYmZ1bmNuYW1lPSJfX3JzaHNpbnQ2NCI7CisgIH1lbHNlIGlmKGM9PUxTSElGVCkKKyAgICBsaWJmdW5jbmFtZT0iX19sc2hpbnQ2NCI7CisgIGVsc2V7CisgICAgcHJpbnRmKCJjPSVkXG4iLGMpOworICAgIGllcnJvcigwKTsKKyAgfQorICBpZihHQVMpCisgICAgZW1pdChmLCJcdC5nbG9iYWxcdCVzXG5cdGpic3JcdCVzXG4iLGxpYmZ1bmNuYW1lLGxpYmZ1bmNuYW1lKTsKKyAgZWxzZQorICAgIGVtaXQoZiwiXHRwdWJsaWNcdCVzXG5cdGpzclx0JXNcbiIsbGliZnVuY25hbWUsbGliZnVuY25hbWUpOworICBpZihjPT1MU0hJRlR8fGM9PVJTSElGVCl7CisjaWZkZWYgTTY4S18xNkJJVF9JTlQKKyAgICBlbWl0KGYsIlx0YWRkLiVzXHQjMTAsJXNcbiIsc3Ryc2hvcnRbMV0sbXJlZ25hbWVzW3NwXSk7CisgICAgcG9wKDEwKTsKKyNlbHNlCisgICAgZW1pdChmLCJcdGFkZC4lc1x0IzEyLCVzXG4iLHN0cnNob3J0WzFdLG1yZWduYW1lc1tzcF0pOworICAgIHBvcCgxMik7CisjZW5kaWYKKyAgfWVsc2V7CisgICAgZW1pdChmLCJcdGFkZC4lc1x0IzE2LCVzXG4iLHN0cnNob3J0WzFdLG1yZWduYW1lc1tzcF0pOworICAgIHBvcCgxNik7CisgIH0KKyAgcmVzdG9yZXJlZ3NhKGYscCk7CisgIGlmKCFpc3JlZyh6KXx8cC0+ei5yZWchPTI1KXsKKyAgICBlbWl0KGYsIlx0bW92ZS5sXHQlcywiLG1yZWduYW1lc1tkMF0pOworICAgIGVtaXRfaHdvcmQoZiwmcC0+eik7CisgICAgZW1pdChmLCJcbiIpOworICAgIGVtaXQoZiwiXHRtb3ZlLmxcdCVzLCIsbXJlZ25hbWVzWzEwXSk7CisgICAgZW1pdF9sd29yZChmLCZwLT56KTsKKyAgICBlbWl0KGYsIlxuIik7CisgIH0gICAgCisgIHJlc3RvcmVyZWdzZChmLHApOworICByZXR1cm4gMTsKK30KKworLyogZ2VuZXJhdGUgaW5saW5lcyBmb3IgQW1pZ2EgSUVFRSBzb2Z0Y2FsbHMgKi8KK3N0YXRpYyBjaGFyICphbWlfaWVlZShjaGFyICpiYXNlLGludCBvZmYpCit7CisgIGNoYXIgKnM7CisgIGlmKGNmKSBpZXJyb3IoMCk7CisgIHM9bXltYWxsb2MoMTI4KTsKKyAgc3ByaW50ZihzLCJcdG1vdmUubFx0JXMsLSglcylcblx0bW92ZS5sXHQlc01hdGhJZWVlJXNCYXNlJXMsJXNcblx0anNyXHQlZCglcylcblx0bW92ZS5sXHQoJXMpKywlcyIsbXJlZ25hbWVzW2E2XSxtcmVnbmFtZXNbc3BdLGlkcHJlZml4LGJhc2UsdXNlX3NkPyIoYTQpIjoiIixtcmVnbmFtZXNbYTZdLG9mZixtcmVnbmFtZXNbYTZdLG1yZWduYW1lc1tzcF0sbXJlZ25hbWVzW2E2XSk7CisgIHJldHVybiBzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBFbmQgb2YgcHJpdmF0ZSBmYXRhIGFuZCBmdW5jdGlvbnMuICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCitpbnQgaW5pdF9jZyh2b2lkKQorLyogIERvZXMgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9ucyBmb3IgdGhlIGNvZGUtZ2VuZXJhdG9yLiBHZXRzIGNhbGxlZCAgKi8KKy8qICBvbmNlIGF0IHRoZSBiZWdpbm5pbmcgYW5kIHNob3VsZCByZXR1cm4gMCBpbiBjYXNlIG9mIHByb2JsZW1zLiAgICAgICovCit7CisgICAgaW50IGk7CisgICAgbGFycmF5LnNpemU9bDJ6bSgzTCk7CisgICAgLyogIEluaXRpYWxpemUgc29tZSB2YWx1ZXMgd2hpY2ggY2Fubm90IGJlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgICAqLworICAgIC8qICBiZWNhdXNlIHRoZXkgYXJlIHN0b3JlZCBpbiB0aGUgdGFyZ2V0J3MgYXJpdGhtZXRpYy4gICAgICAgICAgICAgKi8KKyAgICBtYXhhbGlnbj1sMnptKDRMKTsKKyAgICBjaGFyX2JpdD1sMnptKDhMKTsKKyAgICBmb3IoaT0wO2k8PU1BWF9UWVBFO2krKyl7CisgICAgICAgIHNpemV0YWJbaV09bDJ6bShtc2l6ZXRhYltpXSk7CisgICAgICAgIGFsaWduW2ldPWwyem0obWFsaWduW2ldKTsKKyAgICB9CisgICAgZm9yKGk9IDE7aTw9MTY7aSsrKSB7cmVnc2l6ZVtpXT1sMnptKCA0TCk7cmVndHlwZVtpXT0mbHR5cDt9CisgICAgZm9yKGk9ZnAwO2k8PWZwNztpKyspIHtyZWdzaXplW2ldPWwyem0oMTJMKTtyZWd0eXBlW2ldPSZsYXJyYXk7fQorICAgIGZvcihpPTI1O2k8PTI4O2krKykge3JlZ3NpemVbaV09bDJ6bSggOEwpO3JlZ3R5cGVbaV09JmxsdHlwO30KKworICAgIGlmKEVMRil7CisgICAgICBmb3IoaT0xO2k8PU1BWFI7aSsrKQorCW1yZWduYW1lc1tpXT1lbGZyZWduYW1lc1tpXTsKKyAgICAgIGlkcHJlZml4PSIiOworICAgICAgbGFicHJlZml4PSIubCI7CisgICAgICBycHJlZml4PSIlIjsKKyAgICB9ZWxzZXsKKyAgICAgIGZvcihpPTE7aTw9TUFYUjtpKyspCisJbXJlZ25hbWVzW2ldPXJlZ25hbWVzW2ldOworICAgICAgaWRwcmVmaXg9Il8iOworICAgICAgbGFicHJlZml4PSJsIjsKKyAgICAgIHJwcmVmaXg9IiI7CisgICAgfQorCisgICAgaWYoU01BTExEQVRBKSB1c2Vfc2Q9MTsKKworCisgICAgLyogIGRlZmF1bHQgQ1BVIGlzIDY4MDAwICAgICovCisgICAgaWYoIShnX2ZsYWdzWzBdJlVTRURGTEFHKSkgQ1BVPTY4MDAwOworICAgIGlmKENQVT09NjgwNDApIHN0YXRpY19jc2U9MDsgZWxzZSBzdGF0aWNfY3NlPTE7CisgICAgaWYoQ1BVPDY4MDAwKSBjZj0xOworICAgIGlmKGNmKSBNSU5BRERJMlA9SU5UOyAvKiByZXF1aXJlcyAzMmJpdCBpbnQhICovCisgICAgLyogIG5vIEZQVSBieSBkZWZhdWx0ICAgICAgICovCisgICAgaWYoIShnX2ZsYWdzWzFdJlVTRURGTEFHKSkgRlBVPTA7CisgICAgaWYoRlBVPD02ODAwMCkge3hfdFtGTE9BVF09J2wnO30KKyAgICBpZihEMlNDUkFUQ0gpe3JlZ3NjcmF0Y2hbZDJdPTE7ZHNjcmF0Y2grKzt9CisgICAgaWYoQTJTQ1JBVENIKSB7cmVnc2NyYXRjaFthMl09MTthc2NyYXRjaCsrO30KKyAgICBpZihGUDJTQ1JBVENIKSB7cmVnc2NyYXRjaFtmcDJdPTE7ZnNjcmF0Y2grKzt9CisKKyAgICBpZihOT0E0KSByZWdzYVs1XT0xOworICAgIGlmKEdBUyl7CisgICAgICAgIGNvZGVuYW1lPSJcdC50ZXh0XG4iOworICAgICAgICBic3NuYW1lPSIiOworICAgICAgICBkYXRhbmFtZT0iXHQuZGF0YVxuIjsKKyAgICAgICAgaWYodXNlX3NkKSByZWdzYVs1XT0xOworICAgIH1lbHNleworICAgICAgICBjb2RlbmFtZT0iXHRzZWN0aW9uXHRcIkNPREVcIixjb2RlXG4iOworICAgICAgICBpZih1c2Vfc2QpeworICAgICAgICAgICAgLyogIHByZXBhcmluZyBzbWFsbCBkYXRhICAgICovCisgICAgICAgICAgICByZWdzYVs1XT0xOworICAgICAgICAgICAgYnNzbmFtZT0gIlx0c2VjdGlvblx0XCJfX01FUkdFRFwiLGJzc1xuIjsKKyAgICAgICAgICAgIGRhdGFuYW1lPSJcdHNlY3Rpb25cdFwiX19NRVJHRURcIixkYXRhXG4iOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGJzc25hbWU9ICJcdHNlY3Rpb25cdFwiQlNTXCIsYnNzXG4iOworICAgICAgICAgICAgZGF0YW5hbWU9Ilx0c2VjdGlvblx0XCJEQVRBXCIsZGF0YVxuIjsKKyAgICAgICAgfQorICAgIH0KKyAgICBtX2RhdGFuYW1lPWRhdGFuYW1lOworICAgIG1fYnNzbmFtZT1ic3NuYW1lOworICAgIC8qICBhNSBjYW4gYmUgdXNlZCBpZiBubyBmcmFtZXBvaW50ZXIgaXMgdXNlZC4gICovCisgICAgaWYoIVVTRUZSQU1FUE9JTlRFUil7IHJlZ3NhW2ZicF09MDsvKmZicD1zcDsqL30KKyAgICBpZihERUJVRyYxKSBwcmludGYoIkNQVT0lbGQgRlBVPSVsZFxuIixDUFUsRlBVKTsKKyAgICAvKiAgSW5pdGlhbGl6ZSB0aGUgbWluL21heC1zZXR0aW5ncy4gTm90ZSB0aGF0IHRoZSB0eXBlcyBvZiB0aGUgICAgICovCisgICAgLyogIGhvc3Qgc3lzdGVtIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgdGFyZ2V0IHN5c3RlbSBhbmQgeW91IG1heSAqLworICAgIC8qICBvbmx5IHVzZSB0aGUgc21hbGxlc3QgbWF4aW11bSB2YWx1ZXMgQU5TSSBndWFyYW50ZWVzIGlmIHlvdSAgICAgKi8KKyAgICAvKiAgd2FudCB0byBiZSBwb3J0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogIFRoYXQncyB0aGUgcmVhc29uIGZvciB0aGUgc3VidHJhY3Rpb24gaW4gdF9taW5bSU5UXS4gTG9uZyBjb3VsZCAqLworICAgIC8qICBiZSB1bmFibGUgdG8gcmVwcmVzZW50IC0yMTQ3NDgzNjQ4IG9uIHRoZSBob3N0IHN5c3RlbS4gICAgICAgICAgKi8KKyAgICB0X21pbltDSEFSXT1sMnptKC0xMjhMKTsKKyAgICB0X21pbltTSE9SVF09bDJ6bSgtMzI3NjhMKTsKKyAgICB0X21pbltMT05HXT16bXN1YihsMnptKC0yMTQ3NDgzNjQ3TCksbDJ6bSgxTCkpOworI2lmZGVmIE02OEtfMTZCSVRfSU5UCisgICAgdF9taW5bSU5UXT10X21pbihTSE9SVCk7CisjZWxzZQorICAgIHRfbWluW0lOVF09dF9taW4oTE9ORyk7CisjZW5kaWYKKyAgICB0X21pbltMTE9OR109em1sc2hpZnQobDJ6bSgxTCksbDJ6bSg2M0wpKTsKKyAgICB0X21pbltNQVhJTlRdPXRfbWluKExMT05HKTsKKyAgICB0X21heFtDSEFSXT11bDJ6dW0oMTI3TCk7CisgICAgdF9tYXhbU0hPUlRdPXVsMnp1bSgzMjc2N1VMKTsKKyAgICB0X21heFtMT05HXT11bDJ6dW0oMjE0NzQ4MzY0N1VMKTsKKyNpZmRlZiBNNjhLXzE2QklUX0lOVAorICAgIHRfbWF4W0lOVF09dF9tYXgoU0hPUlQpOworI2Vsc2UKKyAgICB0X21heFtJTlRdPXRfbWF4KExPTkcpOworI2VuZGlmCisgICAgdF9tYXhbTExPTkddPXp1bXJzaGlmdCh6dW1rb21wbCh1bDJ6dW0oMFVMKSksdWwyenVtKDFVTCkpOworICAgIHRfbWF4W01BWElOVF09dF9tYXgoTExPTkcpOworICAgIHR1X21heFtDSEFSXT11bDJ6dW0oMjU1VUwpOworICAgIHR1X21heFtTSE9SVF09dWwyenVtKDY1NTM1VUwpOworICAgIHR1X21heFtMT05HXT11bDJ6dW0oNDI5NDk2NzI5NVVMKTsKKyNpZmRlZiBNNjhLXzE2QklUX0lOVAorICAgIHR1X21heFtJTlRdPXRfbWF4KFVOU0lHTkVEfFNIT1JUKTsKKyNlbHNlCisgICAgdHVfbWF4W0lOVF09dF9tYXgoVU5TSUdORUR8TE9ORyk7CisjZW5kaWYKKyAgICB0dV9tYXhbTExPTkddPXp1bWtvbXBsKHVsMnp1bSgwVUwpKTsKKyAgICB0dV9tYXhbTUFYSU5UXT10X21heChVTlNJR05FRHxMTE9ORyk7CisKKyNpZmRlZiBNNjhLXzE2QklUX0lOVAorICAgIHN0YWNrYWxpZ249MjsKKyNlbmRpZgorCisgICAgaWYoRkxPQVQ2NCl7CisgICAgICBzaXpldGFiW0ZMT0FUXT1zaXpldGFiW0RPVUJMRV07CisgICAgICBhbGlnbltGTE9BVF09bWFsaWduW0RPVUJMRV07CisgICAgfQorCisgICAgbWFycmF5WzBdPSJfX3NlY3Rpb24oeCk9X192YXR0cihcInNlY3Rpb24oXCIjeFwiKVwiKSI7CisgICAgbWFycmF5WzFdPSJfX002OEtfXyI7CisKKyAgICBpZihDUFU+PTY4MDAwJiZDUFU8NjkwMDApCisgICAgICBzcHJpbnRmKGNwdV9tYWNybywiX19NJWxkPTEiLENQVSk7CisgICAgZWxzZQorICAgICAgc3ByaW50ZihjcHVfbWFjcm8sIl9fQ09MREZJUkU9MSIpOworICAgIG1hcnJheVsyXT1jcHVfbWFjcm87CisKKyNpZmRlZiBNNjhLXzE2QklUX0lOVAorICAgIG1hcnJheVszXT0iX19JTlRTSVpFPTE2IjsKKyNlbHNlCisgICAgbWFycmF5WzNdPSJfX0lOVFNJWkU9MzIiOworI2VuZGlmCisKKyAgICBtYXJyYXlbNF09Il9fc3RkYXJncz1fX2F0dHIoXCJfX3N0ZGFyZ3M7XCIpIjsKKyAgICBtYXJyYXlbNV09Il9fcmVnYXJncz1fX2F0dHIoXCJfX3JlZ2FyZ3M7XCIpIjsKKyAgICBtYXJyYXlbNl09Il9fdmJjY2FyZ3M9X19hdHRyKFwiX192YmNjYXJncztcIikiOworICAgIG1hcnJheVs3XT0iX19mcDByZXQ9X19hdHRyKFwiX19mcDByZXQ7XCIpIjsKKyAgICBpZihTTUFMTERBVEEpIAorICAgICAgbWFycmF5WzhdPSJfX1NNQUxMX0RBVEFfXyI7CisgICAgZWxzZQorICAgICAgbWFycmF5WzhdPSJfX0xBUkdFX0RBVEFfXyI7CisKKyAgICBpZihGUFU9PTY4ODgxKXsKKyAgICAgIHNwcmludGYoZnB1X21hY3JvLCJfX002ODg4MT0xIik7CisgICAgICBtYXJyYXlbOV09ZnB1X21hY3JvOworICAgIH1lbHNlIGlmKEZQVT42ODAwMCYmRlBVPDY5MDAwKXsKKyAgICAgIHNwcmludGYoZnB1X21hY3JvLCJfX002ODg4Mj0xIik7CisgICAgICBtYXJyYXlbOV09ZnB1X21hY3JvOworICAgIH1lbHNlCisgICAgICBtYXJyYXlbOV09MDsKKyAgICBtYXJyYXlbMTBdPTA7CisgICAgdGFyZ2V0X21hY3Jvcz1tYXJyYXk7CisKKyAgICBpZihBTUlfU09GVEZMT0FUJiYhb3B0c2l6ZSl7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlYWRkbCIsRkxPQVQsRkxPQVQsZDAsRkxPQVQsZDEsMSxhbWlfaWVlZSgiU2luZ0JhcyIsLTY2KSk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlc3VibCIsRkxPQVQsRkxPQVQsZDAsRkxPQVQsZDEsMSxhbWlfaWVlZSgiU2luZ0JhcyIsLTcyKSk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlbXVsbCIsRkxPQVQsRkxPQVQsZDAsRkxPQVQsZDEsMSxhbWlfaWVlZSgiU2luZ0JhcyIsLTc4KSk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlZGl2bCIsRkxPQVQsRkxPQVQsZDAsRkxPQVQsZDEsMSxhbWlfaWVlZSgiU2luZ0JhcyIsLTg0KSk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlbmVnbCIsRkxPQVQsRkxPQVQsZDAsMCwwLDEsYW1pX2llZWUoIlNpbmdCYXMiLC02MCkpOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWFkZGQiLERPVUJMRSxET1VCTEUsZDBkMSxET1VCTEUsZDJkMywxLGFtaV9pZWVlKCJEb3ViQmFzIiwtNjYpKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVzdWJkIixET1VCTEUsRE9VQkxFLGQwZDEsRE9VQkxFLGQyZDMsMSxhbWlfaWVlZSgiRG91YkJhcyIsLTcyKSk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlbXVsZCIsRE9VQkxFLERPVUJMRSxkMGQxLERPVUJMRSxkMmQzLDEsYW1pX2llZWUoIkRvdWJCYXMiLC03OCkpOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWRpdmQiLERPVUJMRSxET1VCTEUsZDBkMSxET1VCTEUsZDJkMywxLGFtaV9pZWVlKCJEb3ViQmFzIiwtODQpKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVuZWdkIixET1VCTEUsRE9VQkxFLGQwZDEsMCwwLDEsYW1pX2llZWUoIkRvdWJCYXMiLC02MCkpOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZXMyZCIsRE9VQkxFLEZMT0FULGQwLDAsMCwxLGFtaV9pZWVlKCJEb3ViVHJhbnMiLC0xMDgpKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVkMnMiLEZMT0FULERPVUJMRSxkMGQxLDAsMCwxLGFtaV9pZWVlKCJEb3ViVHJhbnMiLC0xMDIpKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVmbHRzbCIsRkxPQVQsTE9ORyxkMCwwLDAsMSxhbWlfaWVlZSgiU2luZ0JhcyIsLTM2KSk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlZmx0c2QiLERPVUJMRSxMT05HLGQwLDAsMCwxLGFtaV9pZWVlKCJEb3ViQmFzIiwtMzYpKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVmbHR1bCIsRkxPQVQsVU5TSUdORUR8TE9ORywwLDAsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWZsdHVkIixET1VCTEUsVU5TSUdORUR8TE9ORywwLDAsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWZpeGxzbCIsTE9ORyxGTE9BVCxkMCwwLDAsMSxhbWlfaWVlZSgiU2luZ0JhcyIsLTMwKSk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlZml4bHN3IixTSE9SVCxGTE9BVCxkMCwwLDAsMSxhbWlfaWVlZSgiU2luZ0JhcyIsLTMwKSk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlZml4bHNiIixDSEFSLEZMT0FULGQwLDAsMCwxLGFtaV9pZWVlKCJTaW5nQmFzIiwtMzApKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVmaXhkc2wiLExPTkcsRE9VQkxFLGQwZDEsMCwwLDEsYW1pX2llZWUoIkRvdWJCYXMiLC0zMCkpOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWZpeGRzdyIsU0hPUlQsRE9VQkxFLGQwZDEsMCwwLDEsYW1pX2llZWUoIkRvdWJCYXMiLC0zMCkpOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWZpeGRzYiIsQ0hBUixET1VCTEUsZDBkMSwwLDAsMSxhbWlfaWVlZSgiRG91YkJhcyIsLTMwKSk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlZml4bHVsIixVTlNJR05FRHxMT05HLEZMT0FULDAsMCwwLDEsMCk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlZml4bHV3IixVTlNJR05FRHxTSE9SVCxGTE9BVCwwLDAsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWZpeGx1YiIsVU5TSUdORUR8Q0hBUixGTE9BVCwwLDAsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWZpeGR1bCIsVU5TSUdORUR8TE9ORyxET1VCTEUsMCwwLDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVmaXhkdXciLFVOU0lHTkVEfFNIT1JULERPVUJMRSwwLDAsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWZpeGR1YiIsVU5TSUdORUR8Q0hBUixET1VCTEUsMCwwLDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVjbXBsIixJTlQsRkxPQVQsZDAsRkxPQVQsZDEsMSxhbWlfaWVlZSgiU2luZ0JhcyIsLTQyKSk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlY21wZCIsSU5ULERPVUJMRSxkMGQxLERPVUJMRSxkMmQzLDEsYW1pX2llZWUoIkRvdWJCYXMiLC00MikpOworI2lmIDAKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVjbXBsbHQiLElOVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVjbXBsbGUiLElOVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVjbXBsZ3QiLElOVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVjbXBsZ2UiLElOVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVjbXBsZXEiLElOVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVjbXBsbmVxIixJTlQsRkxPQVQsMCxGTE9BVCwwLDEsMCk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlY21wZGx0IixJTlQsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVjbXBkbGUiLElOVCxET1VCTEUsMCxET1VCTEUsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWNtcGRndCIsSU5ULERPVUJMRSwwLERPVUJMRSwwLDEsMCk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlY21wZGdlIixJTlQsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVjbXBkZXEiLElOVCxET1VCTEUsMCxET1VCTEUsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWNtcGRuZXEiLElOVCxET1VCTEUsMCxET1VCTEUsMCwxLDApOworI2VuZGlmCisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVldHN0bCIsSU5ULEZMT0FULGQwLDAsMCwxLGFtaV9pZWVlKCJTaW5nQmFzIiwtNDgpKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWV0c3RkIixJTlQsRE9VQkxFLGQwZDEsMCwwLDEsYW1pX2llZWUoIkRvdWJCYXMiLC00OCkpOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfZmx0MzJ0b3NpbnQ2NCIsTExPTkcsRkxPQVQsMCwwLDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2ZsdDY0dG9zaW50NjQiLExMT05HLERPVUJMRSwwLDAsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfZmx0MzJ0b3VpbnQ2NCIsVU5TSUdORUR8TExPTkcsRkxPQVQsMCwwLDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2ZsdDY0dG91aW50NjQiLFVOU0lHTkVEfExMT05HLERPVUJMRSwwLDAsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfc2ludDY0dG9mbHQzMiIsRkxPQVQsTExPTkcsMCwwLDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX3NpbnQ2NHRvZmx0NjQiLERPVUJMRSxMTE9ORywwLDAsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfdWludDY0dG9mbHQzMiIsRkxPQVQsVU5TSUdORUR8TExPTkcsMCwwLDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX3VpbnQ2NHRvZmx0NjQiLERPVUJMRSxVTlNJR05FRHxMTE9ORywwLDAsMCwxLDApOworICAgIH1lbHNleworICAgICAgaW50IHBkMCxwZDEscGQwZDE7CisgICAgICBpZihWQkNDQ0FMTCl7CisJcGQwPWQwO3BkMT1kMTtwZDBkMT1kMGQxOworICAgICAgfWVsc2V7CisJcGQwPXBkMT1wZDBkMT0wOworICAgICAgfQorCQorICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWFkZGwiLEZMT0FULEZMT0FULHBkMCxGTE9BVCxwZDEsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVzdWJsIixGTE9BVCxGTE9BVCxwZDAsRkxPQVQscGQxLDEsMCk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlbXVsbCIsRkxPQVQsRkxPQVQscGQwLEZMT0FULHBkMSwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWRpdmwiLEZMT0FULEZMT0FULHBkMCxGTE9BVCxwZDEsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVuZWdsIixGTE9BVCxGTE9BVCxwZDAsMCwwLDEsMCk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlYWRkZCIsRE9VQkxFLERPVUJMRSxwZDBkMSxET1VCTEUsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZXN1YmQiLERPVUJMRSxET1VCTEUscGQwZDEsRE9VQkxFLDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVtdWxkIixET1VCTEUsRE9VQkxFLHBkMGQxLERPVUJMRSwwLDEsMCk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlZGl2ZCIsRE9VQkxFLERPVUJMRSxwZDBkMSxET1VCTEUsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZW5lZ2QiLERPVUJMRSxET1VCTEUscGQwZDEsMCwwLDEsMCk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlczJkIixET1VCTEUsRkxPQVQscGQwLDAsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWQycyIsRkxPQVQsRE9VQkxFLHBkMGQxLDAsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWZsdHNsIixGTE9BVCxMT05HLHBkMCwwLDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVmbHRzZCIsRE9VQkxFLExPTkcscGQwLDAsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWZsdHVsIixGTE9BVCxVTlNJR05FRHxMT05HLHBkMCwwLDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVmbHR1ZCIsRE9VQkxFLFVOU0lHTkVEfExPTkcscGQwLDAsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWZpeGxzbCIsTE9ORyxGTE9BVCxwZDAsMCwwLDEsMCk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlZml4bHN3IixTSE9SVCxGTE9BVCxwZDAsMCwwLDEsMCk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlZml4bHNiIixDSEFSLEZMT0FULHBkMCwwLDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVmaXhkc2wiLExPTkcsRE9VQkxFLHBkMGQxLDAsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWZpeGRzdyIsU0hPUlQsRE9VQkxFLHBkMGQxLDAsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWZpeGRzYiIsQ0hBUixET1VCTEUscGQwZDEsMCwwLDEsMCk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlZml4bHVsIixVTlNJR05FRHxMT05HLEZMT0FULHBkMCwwLDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVmaXhsdXciLFVOU0lHTkVEfFNIT1JULEZMT0FULHBkMCwwLDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVmaXhsdWIiLFVOU0lHTkVEfENIQVIsRkxPQVQscGQwLDAsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWZpeGR1bCIsVU5TSUdORUR8TE9ORyxET1VCTEUscGQwZDEsMCwwLDEsMCk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlZml4ZHV3IixVTlNJR05FRHxTSE9SVCxET1VCTEUscGQwZDEsMCwwLDEsMCk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlZml4ZHViIixVTlNJR05FRHxDSEFSLERPVUJMRSxwZDBkMSwwLDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVmaXhkdWIiLFVOU0lHTkVEfENIQVIsRE9VQkxFLHBkMGQxLDAsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWNtcGwiLElOVCxGTE9BVCxwZDAsRkxPQVQscGQxLDEsMCk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlY21wZCIsSU5ULERPVUJMRSxwZDBkMSxET1VCTEUsMCwxLDApOworI2lmIDAKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVjbXBsbHQiLElOVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVjbXBsbGUiLElOVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVjbXBsZ3QiLElOVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVjbXBsZ2UiLElOVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVjbXBsZXEiLElOVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVjbXBsbmVxIixJTlQsRkxPQVQsMCxGTE9BVCwwLDEsMCk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlY21wZGx0IixJTlQsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVjbXBkbGUiLElOVCxET1VCTEUsMCxET1VCTEUsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWNtcGRndCIsSU5ULERPVUJMRSwwLERPVUJMRSwwLDEsMCk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVlY21wZGdlIixJTlQsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWVjbXBkZXEiLElOVCxET1VCTEUsMCxET1VCTEUsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfaWVlZWNtcGRuZXEiLElOVCxET1VCTEUsMCxET1VCTEUsMCwxLDApOworI2VuZGlmCisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9pZWVldHN0bCIsSU5ULEZMT0FULHBkMCwwLDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2llZWV0c3RkIixJTlQsRE9VQkxFLHBkMGQxLDAsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfZmx0MzJ0b3NpbnQ2NCIsTExPTkcsRkxPQVQscGQwLDAsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfZmx0NjR0b3NpbnQ2NCIsTExPTkcsRE9VQkxFLHBkMGQxLDAsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfZmx0MzJ0b3VpbnQ2NCIsVU5TSUdORUR8TExPTkcsRkxPQVQscGQwLDAsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfZmx0NjR0b3VpbnQ2NCIsVU5TSUdORUR8TExPTkcsRE9VQkxFLHBkMGQxLDAsMCwxLDApOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfc2ludDY0dG9mbHQzMiIsRkxPQVQsTExPTkcscGQwZDEsMCwwLDEsMCk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl9zaW50NjR0b2ZsdDY0IixET1VCTEUsTExPTkcscGQwZDEsMCwwLDEsMCk7CisgICAgICBkZWNsYXJlX2J1aWx0aW4oIl91aW50NjR0b2ZsdDMyIixGTE9BVCxVTlNJR05FRHxMTE9ORyxwZDBkMSwwLDAsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX3VpbnQ2NHRvZmx0NjQiLERPVUJMRSxVTlNJR05FRHxMTE9ORyxwZDBkMSwwLDAsMSwwKTsKKyAgICB9CisgICAgeworICAgICAgY2hhciAqYXNtOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfZGl2cyIsTE9ORyxMT05HLGQwLExPTkcsZDEsMSwwKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX2RpdnUiLExPTkcsTE9ORyxkMCxMT05HLGQxLDEsMCk7CisjZGVmaW5lIFNNT0RTICJcdGpzclx0X19kaXZzXG5cdG1vdmUubFx0ZDEsZDAiCisjZGVmaW5lIFNNT0RVICJcdGpzclx0X19kaXZ1XG5cdG1vdmUubFx0ZDEsZDAiCisgICAgICBhc209bXltYWxsb2Moc3RybGVuKFNNT0RTKSsxKTsKKyAgICAgIHN0cmNweShhc20sU01PRFMpOworICAgICAgZGVjbGFyZV9idWlsdGluKCJfbW9kcyIsTE9ORyxMT05HLGQwLExPTkcsZDEsMSxhc20pOworICAgICAgYXNtPW15bWFsbG9jKHN0cmxlbihTTU9EVSkrMSk7CisgICAgICBzdHJjcHkoYXNtLFNNT0RVKTsKKyAgICAgIGRlY2xhcmVfYnVpbHRpbigiX21vZHUiLExPTkcsTE9ORyxkMCxMT05HLGQxLDEsYXNtKTsKKyAgICB9CisgICAgZGVjbGFyZV9idWlsdGluKCJfbHNoaW50NjQiLExMT05HLExMT05HLDAsSU5ULDAsMSwwKTsKKyAgICBkZWNsYXJlX2J1aWx0aW4oIl9yc2hzaW50NjQiLExMT05HLExMT05HLDAsSU5ULDAsMSwwKTsKKyAgICBkZWNsYXJlX2J1aWx0aW4oIl9yc2h1aW50NjQiLChVTlNJR05FRHxMTE9ORyksKFVOU0lHTkVEfExMT05HKSwwLElOVCwwLDEsMCk7CisKKyAgICByZXR1cm4gMTsKK30KKworaW50IGZyZXR1cm4odHlwZSAqdCkKKy8qICBSZXR1cm5zIHRoZSByZWdpc3RlciBpbiB3aGljaCB2YXJpYWJsZXMgb2YgdHlwZSB0IGFyZSByZXR1cm5lZC4gKi8KKy8qICBJZiB0aGUgdmFsdWUgY2Fubm90IGJlIHJldHVybmVkIGluIGEgcmVnaXN0ZXIgcmV0dXJucyAwLiAgICAgICAgKi8KK3sKKyAgICBsb25nIGw7aW50IHR1PXQtPmZsYWdzJk5ROworICAgIGlmKHQtPmF0dHImJklTRkxPQVQodHUpJiZGUFU+NjgwMDAmJnN0cnN0cih0LT5hdHRyLCJfX2ZwMHJldDsiKSkgcmV0dXJuIGZwMDsKKyAgICBpZih0dT09RkxPQVQmJkZMT0FUNjQpIHR1Kz1ET1VCTEUtRkxPQVQ7CisgICAgaWYodHU9PUZMT0FUKXsKKyAgICAgICAgaWYoRlBVPjY4MDAwJiYhTk9GUFJFVFVSTikKKyAgICAgICAgICAgIHJldHVybiBmcDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBkMDsKKyAgICB9CisgICAgaWYodHU9PURPVUJMRXx8dHU9PUxET1VCTEUpeworICAgICAgICBpZihGUFU+NjgwMDAmJiFOT0ZQUkVUVVJOKXsKKyAgICAgICAgICAgIHJldHVybiBmcDA7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgaWYoTk9NUkVHUkVUVVJOKSByZXR1cm4gMDsKKyNpZiBORVdfUkVUCisgICAgICAgICAgICByZXR1cm4gZDBkMTsKKyNlbHNlCisJICAgIHJldHVybiBkMDsKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorICAgIGlmKHR1PT1TVFJVQ1R8fHR1PT1VTklPTil7CisgICAgICAgIGlmKCFOT01SRUdSRVRVUk4peworICAgICAgICAgICAgbD16bTJsKHN6b2YodCkpOworI2lmIE5FV19SRVQKKwkgICAgaWYobD09NCkgcmV0dXJuIGQwOworCSAgICBpZihsPT04KSByZXR1cm4gZDBkMTsKKwkgICAgLyogYWx0ZSBWYXJpYW50ZTsgdW5zY2hvZW4gKi8KKwkgICAgaWYobD09MTIpIHJldHVybiBkMDsKKwkgICAgaWYobD09MTYpIHJldHVybiBkMDsKKyNlbHNlCisgICAgICAgICAgICBpZihsPT00fHxsPT04fHxsPT0xMnx8bD09MTYpIHJldHVybiBkMDsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZih0dT09TExPTkcpCisgICAgICByZXR1cm4gZDBkMTsKKyAgICBpZih6bWxlcShzem9mKHQpLGwyem0oNEwpKSkgcmV0dXJuIGQwOyBlbHNlIHJldHVybiAwOworfQoraW50IGNvc3Rfc2F2aW5ncyhJQyAqcCxpbnQgcixvYmogKm8pCit7CisgIGludCBjPXAtPmNvZGU7CisgIGlmKChyPT1hNnx8cj09ZDd8fHI9PWQ2ZDd8fHI9PWZwNykmJiFSRVNFUlZFUkVHUykgcmV0dXJuIC0xOworICBpZihjPT1TRVRSRVRVUk4mJnI9PXAtPnoucmVnJiYhKG8tPmZsYWdzJkRSRUZPQkopKSByZXR1cm4gMzsKKyAgaWYoYz09R0VUUkVUVVJOJiZyPT1wLT5xMS5yZWcmJiEoby0+ZmxhZ3MmRFJFRk9CSikpIHJldHVybiAzOworICBpZihvLT5mbGFncyZWS09OU1QpeworICAgIGludCB0OworICAgIGlmKENQVT09NjgwNDApIHJldHVybiAwOworICAgIHQ9by0+di0+Y3R5cCZOUTsKKyAgICBpZihJU0ZMT0FUKHQpKSByZXR1cm4gMjsKKyAgICBpZih0PT1DSEFSJiZyPj1hMCYmcjw9YTcpIHJldHVybiAwLypJTlRfTUlOKi87CisgICAgaWYodD09TExPTkcpIHJldHVybiAwOworICAgIGlmKGNmJiYodDxJTlQpJiZwLT5xMi5mbGFncykgcmV0dXJuIDAvKklOVF9NSU4qLzsKKyAgICBldmFsX2NvbnN0KCZvLT52LT5jb2JqLnZhbCx0KTsKKyAgICBpZih6bWVxdG8odm1heCxaMCkpIHJldHVybiAwOworICAgIGlmKG8tPmZsYWdzJkRSRUZPQkopIHJldHVybiAyOworICAgIGlmKChwLT5jb2RlPT1BU1NJR04mJm89PSZwLT5xMSl8fHAtPmNvZGU9PVBVU0h8fHAtPmNvZGU9PVNFVFJFVFVSTil7CisgICAgICBpZihwLT5jb2RlPT1QVVNIfHwocC0+ei5mbGFncyZEUkVGT0JKKXx8CisJICgocC0+ei5mbGFncyZWQVIpJiYocC0+ei52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUN8fHAtPnoudi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKSkpeworCWlmKHI+PWQwJiZyPD1kNykKKwkgIHJldHVybiAyOworCWVsc2UKKwkgIHJldHVybiAxOworICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmKGM9PUFEREkyUHx8Yz09U1VCSUZQKXsKKyAgICAgIGlmKHptbGVxKHZtYXgsbDJ6bSgzMjc2N0wpKSYmem1sZXEobDJ6bSgtMzI3NjhMKSx2bWF4KSkgcmV0dXJuIDA7CisgICAgICBpZihyPj1kMCYmcjw9ZDcpCisJcmV0dXJuIDM7CisgICAgICByZXR1cm4gQ1BVPDY4MDIwPzE6MDsKKyAgICB9CisgICAgaWYoYz09QUREfHxjPT1TVUJ8fGM9PUFEREkyUHx8Yz09U1VCSUZQfHxjPT1TVUJQRlApeworICAgICAgaWYoem1sZXEodm1heCxsMnptKDhMKSkmJnptbGVxKGwyem0oLThMKSx2bWF4KSkgcmV0dXJuIDA7CisgICAgICBpZihwLT5mbGFncyZFRkZfSUMpIHJldHVybiAwOworICAgICAgaWYocj49ZDAmJnI8PWQ3KQorCXJldHVybiAyOworICAgICAgZWxzZQorCXJldHVybiAxOworICAgIH0KKyAgICBpZihjPT1DT01QQVJFKXsKKyAgICAgIGlmKHI+PWQwJiZyPD1kNykKKwlyZXR1cm4gMjsKKyAgICAgIGVsc2UKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgaWYocj49YTAmJnI8PWE3KSByZXR1cm4gSU5UX01JTjsKKyAgICAvKiBUT0RPOiB3aGljaCBhbGxvY2F0aW9ucyBhcmUgdXNlZnVsPyAqLworICAgIHJldHVybiAwOworICB9CisgIGlmKG8tPmZsYWdzJkRSRUZPQkopeworICAgIGlmKHI+PWEwJiZyPD1hNyl7CisgICAgICByZXR1cm4gNDsKKyAgICB9CisgIH0KKyAgaWYoKGM9PUFEREkyUHx8Yz09U1VCSUZQfHxjPT1BRERSRVNTKSYmKG89PSZwLT5xMXx8bz09JnAtPnopJiZyPj1hMCYmcjw9YTcpeworICAgIHJldHVybiA0OworICB9CisgIGlmKHI+PWEwJiZyPD1hNyl7CisgICAgaWYoby0+ZmxhZ3MmRFJFRk9CSikgaWVycm9yKDApOworICAgIGlmKGMhPUdFVFJFVFVSTiYmYyE9U0VUUkVUVVJOJiZjIT1BU1NJR04mJmMhPVBVU0gmJmMhPVRFU1QmJmMhPUNPTVBBUkUmJmMhPUNPTlZFUlQpeworICAgICAgaWYoYz09QURESTJQfHxjPT1TVUJJRlApeworCWlmKG89PSZwLT5xMikKKwkgIHJldHVybiBJTlRfTUlOOworICAgICAgfWVsc2UgaWYoYz09U1VCUEZQKXsKKwlpZihvPT0mcC0+eikKKwkgIHJldHVybiBJTlRfTUlOOworICAgICAgfWVsc2V7CisJcmV0dXJuIElOVF9NSU47CisgICAgICB9CisgICAgfQorICAgIGlmKGM9PUNPTlZFUlQmJigocC0+dHlwZiZOUSk9PUNIQVJ8fChwLT50eXBmMiZOUSk9PUNIQVJ8fElTRkxPQVQocC0+dHlwZil8fElTRkxPQVQocC0+dHlwZjIpKSkKKyAgICAgIHJldHVybiBJTlRfTUlOOworICB9CisKKyAgaWYoYz09VEVTVCYmcj49ZDAmJnI8PWQ3KXsKKyAgICByZXR1cm4gMzsKKyAgfQorICBpZihvPT0mcC0+eiYmKHAtPnExLmZsYWdzJlZLT05TVCkpeworICAgIGV2YWxfY29uc3QoJnAtPnExLnYtPmNvYmoudmFsLHAtPnExLnYtPmN0eXAmTlEpOworICAgIGlmKHptbGVxKHZtYXgsbDJ6bSgxMjdMKSkmJnptbGVxKGwyem0oLTEyOEwpLHZtYXgpJiZyPj1kMCYmcjw9ZDcpCisgICAgICByZXR1cm4gMzsKKyAgfQorICByZXR1cm4gMjsKK30KKworaW50IHJlZ29rKGludCByLGludCB0LGludCBtb2RlKQorLyogIFJldHVybnMgMCBpZiByZWdpc3RlciByIGNhbm5vdCBzdG9yZSB2YXJpYWJsZXMgb2YgICAqLworLyogIHR5cGUgdC4gSWYgdD09UE9JTlRFUiBhbmQgbW9kZSE9MCB0aGVuIGl0IHJldHVybnMgICAqLworLyogIG5vbi16ZXJvIG9ubHkgaWYgdGhlIHJlZ2lzdGVyIGNhbiBzdG9yZSBhIHBvaW50ZXIgICAqLworLyogIGFuZCBkZXJlZmVyZW5jZSBhIHBvaW50ZXIgdG8gbW9kZS4gICAgICAgICAgICAgICAgICAqLworeworICBpZihyPT0wKSByZXR1cm4gMDsKKyAgdCY9TlE7CisgIGlmKElTRkxPQVQodCkpeworICAgIGlmKEZQVT42ODAwMCl7CisgICAgICBpZihyPj1mcDAmJnI8PWZwNykgcmV0dXJuKDEpOyBlbHNlIHJldHVybiAwOworICAgIH1lbHNleworICAgICAgaWYodD09RkxPQVQmJiFGTE9BVDY0KQorCXJldHVybiAocj49ZDAmJnI8PWQ3KTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gKHI+PTI1JiZyPD0yOCk7CisgICAgfQorICB9CisgIGlmKHQ9PVBPSU5URVImJm1vZGU8PTAmJnI+PWQwJiZyPD1kNykgcmV0dXJuIDE7CisgIGlmKHQ9PVBPSU5URVImJnI+PTEmJnI8PTgpIHJldHVybiAxOworICBpZih0Pj1DSEFSJiZ0PD1MT05HKXsKKyAgICBpZigocj49ZDAmJnI8PWQ3KXx8KG1vZGU9PS0xJiZ0Pj1TSE9SVCYmcj49MSYmcjw9OCkpIHJldHVybiAxOworICB9CisgIGlmKHQ9PUxMT05HJiZyPj0yNSYmcjw9MjgpIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworaW50IGRhbmdlcm91c19JQyhJQyAqcCkKKy8qICBSZXR1cm5zIHplcm8gaWYgdGhlIElDIHAgY2FuIGJlIHNhZmVseSBleGVjdXRlZCAgICAgKi8KKy8qICB3aXRob3V0IGRhbmdlciBvZiBleGNlcHRpb25zIG9yIHNpbWlsYXIgdGhpbmdzLiAgICAgKi8KKy8qICB2YmNjIG1heSBnZW5lcmF0ZSBjb2RlIGluIHdoaWNoIG5vbi1kYW5nZXJvdXMgSUNzICAgKi8KKy8qICBhcmUgc29tZXRpbWVzIGV4ZWN1dGVkIGFsdGhvdWdoIGNvbnRyb2wtZmxvdyBtYXkgICAgKi8KKy8qICBuZXZlciByZWFjaCB0aGVtIChtYWlubHkgd2hlbiBtb3ZpbmcgY29tcHV0YXRpb25zICAgKi8KKy8qICBvdXQgb2YgbG9vcHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUeXBpY2FsIElDcyB0aGF0IGdlbmVyYXRlIGV4Y2VwdGlvbnMgb24gc29tZSAgICAgICAgKi8KKy8qICBtYWNoaW5lcyBhcmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBhY2Nlc3NlcyB2aWEgcG9pbnRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBkaXZpc2lvbi9tb2R1bG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBvdmVyZmxvdyBvbiBzaWduZWQgaW50ZWdlci9mbG9hdHMgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGM9cC0+Y29kZTsKKyAgaWYoKHAtPnExLmZsYWdzJkRSRUZPQkopfHwocC0+cTIuZmxhZ3MmRFJFRk9CSil8fChwLT56LmZsYWdzJkRSRUZPQkopKQorICAgIHJldHVybiAxOworICBpZigoYz09RElWfHxjPT1NT0QpJiYhaXNjb25zdChxMikpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitpbnQgbXVzdF9jb252ZXJ0KGludCBvLGludCB0LGludCBjb25zdF9leHByKQorLyogIFJldHVybnMgemVybyBpZiBjb2RlIGZvciBjb252ZXJ0aW5nIG5wIHRvIHR5cGUgdCAgICAqLworLyogIGNhbiBiZSBvbWl0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICAgIGludCBvcD1vJk5RLHRwPXQmTlE7CisgICAgLyogIEFsbCBwb2ludGVycyBoYXZlIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uLiAgKi8KKyAgICBpZih0cD09UE9JTlRFUiYmb3A9PVBPSU5URVIpIHJldHVybiAwOworICAgIC8qICBQb2ludGVyIGFuZCBpbnQvbG9uZyBhcyB3ZWxsICAgKi8KKyAgICBpZihjb25zdF9leHByKXsKKyNpZmRlZiBNNjhLXzE2QklUX0lOVAorICAgICAgaWYodHA9PVBPSU5URVImJihvcD09TE9ORykpIHJldHVybiAwOworICAgICAgaWYob3A9PVBPSU5URVImJih0cD09TE9ORykpIHJldHVybiAwOworI2Vsc2UKKyAgICAgIGlmKHRwPT1QT0lOVEVSJiYob3A9PUlOVHx8b3A9PUxPTkcpKSByZXR1cm4gMDsKKyAgICAgIGlmKG9wPT1QT0lOVEVSJiYodHA9PUlOVHx8dHA9PUxPTkcpKSByZXR1cm4gMDsKKyNlbmRpZgorICAgIH0KKyAgICAvKiAgU2lnbmVkIHVuZCBVbnNpZ25lZCBpbnRlZ2VycyB3aXRoIHRoZSBzYW1lIHNpemUsIHRvby4gICovCisgICAgaWYob3A9PXRwKSByZXR1cm4gMDsKKyNpZmRlZiBNNjhLXzE2QklUX0lOVAorICAgIC8qICBpbnQ9PXNob3J0ICAgKi8KKyAgICBpZigodHA9PUlOVCYmb3A9PVNIT1JUKXx8KHRwPT1TSE9SVCYmb3A9PUlOVCkpIHJldHVybiAwOworI2Vsc2UKKyAgICAvKiAgaW50PT1sb25nICAgKi8KKyAgICBpZigodHA9PUlOVCYmb3A9PUxPTkcpfHwodHA9PUxPTkcmJm9wPT1JTlQpKSByZXR1cm4gMDsKKyNlbmRpZgorICAgIGlmKEZMT0FUNjQmJklTRkxPQVQob3ApJiZJU0ZMT0FUKHRwKSkgcmV0dXJuIDA7CisgICAgLyogbG9uZyBkb3VibGU9PWRvdWJsZSAqLworICAgIGlmKChvcD09RE9VQkxFfHxvcD09TERPVUJMRSkmJih0cD09RE9VQkxFfHx0cD09TERPVUJMRSkpIHJldHVybiAwOworICAgIHJldHVybiAxOworfQorCit2b2lkIGdlbl9kcyhGSUxFICpmLHptYXggc2l6ZSx0eXBlICp0KQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSA8c2l6ZT4gYnl0ZXMgb2Ygc3RvcmFnZSAqLworLyogIGluaXRpYWxpemVkIHdpdGggemVyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICB0aXRsZShmKTsKKyAgaWYoR0FTKXsKKyAgICBpZihuZXdvYmomJnNlY3Rpb24hPVNQRUNJQUwpCisgICAgICBlbWl0KGYsIiVsZFxuIix6bTJsKHNpemUpKTsKKyAgICBlbHNlCisgICAgICBlbWl0KGYsIlx0LnNwYWNlXHQlbGRcbiIsem0ybChzaXplKSk7CisgICAgbmV3b2JqPTA7CisgIH1lbHNleworICAgIC8qaWYoc2VjdGlvbiE9QlNTJiZzZWN0aW9uIT1TUEVDSUFMJiZuZXdvYmope2VtaXQoZixic3NuYW1lKTtpZihmKSBzZWN0aW9uPUJTUzt9Ki8KKyAgICBlbWl0KGYsIlx0ZHMuYlx0JWxkXG4iLHptMmwoc2l6ZSkpO25ld29iaj0wOworICB9Cit9CisKK3ZvaWQgZ2VuX2FsaWduKEZJTEUgKmYsem1heCBhbGlnbikKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBtYWtlIHN1cmUgdGhlIG5leHQgZGF0YSBpcyAgICAgKi8KKy8qICBhbGlnbmVkIHRvIG11bHRpcGxlcyBvZiA8YWxpZ24+IGJ5dGVzLiAgICAgICAgICAgICAgKi8KK3sKKyAgdGl0bGUoZik7CisgIGlmKHptMmwoYWxpZ24pPjEpeworICAgIGlmKEdBUyl7CisgICAgICBlbWl0KGYsIlx0LmFsaWduXHQ0XG4iKTsKKyAgICB9ZWxzZXsKKyAgICAgIGVtaXQoZiwiXHRjbm9wXHQwLDRcbiIpOworICAgIH0KKyAgfQorfQordm9pZCBnZW5fdmFyX2hlYWQoRklMRSAqZixWYXIgKnYpCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIHRoZSBoZWFkIG9mIGEgdmFyaWFibGUgICovCisvKiAgZGVmaW5pdGlvbiwgaS5lLiB0aGUgbGFiZWwgYW5kIGluZm9ybWF0aW9uIGZvciAgICAgICovCisvKiAgbGlua2FnZSBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBjb25zdGZsYWc7CisgIHRpdGxlKGYpOworICBpZih2LT5jbGlzdCkgY29uc3RmbGFnPWlzX2NvbnN0KHYtPnZ0eXApOworICBpZih2LT50YXR0ciYoRkFSfENISVApKXsKKyAgICBpZih2LT50YXR0ciZDSElQKXsKKyAgICAgIGRhdGFuYW1lPSJcdHNlY3Rpb25cdFwiQ0hJUF9EQVRBXCIsZGF0YSxjaGlwXG4iOworICAgICAgYnNzbmFtZT0iXHRzZWN0aW9uXHRcIkNISVBfQlNTXCIsYnNzLGNoaXBcbiI7CisgICAgfWVsc2V7CisgICAgICBkYXRhbmFtZT0iXHRzZWN0aW9uXHRcIkRBVEFcIixkYXRhXG4iOworICAgICAgYnNzbmFtZT0iXHRzZWN0aW9uXHRcIkJTU1wiLGJzc1xuIjsKKyAgICB9CisgICAgaWYoZikgc2VjdGlvbj0tMTsKKyAgfWVsc2V7CisgICAgZGF0YW5hbWU9bV9kYXRhbmFtZTsKKyAgICBic3NuYW1lPW1fYnNzbmFtZTsKKyAgfQorICBpZih2LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpeworICAgIGlmKElTRlVOQyh2LT52dHlwLT5mbGFncykpIHJldHVybjsKKyAgICBpZighc3BlY2lhbF9zZWN0aW9uKGYsdikpeworICAgICAgaWYodi0+Y2xpc3QmJighY29uc3RmbGFnfHxDT05TVElOREFUQS8qfHx1c2Vfc2QqLykmJnNlY3Rpb24hPURBVEEpe2VtaXQoZixkYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1EQVRBO30KKyAgICAgIGlmKHYtPmNsaXN0JiZjb25zdGZsYWcmJiFDT05TVElOREFUQS8qJiYhdXNlX3NkKi8mJnNlY3Rpb24hPUNPREUpe2VtaXQoZixjb2RlbmFtZSk7aWYoZikgc2VjdGlvbj1DT0RFO30KKyAgICAgIGlmKCF2LT5jbGlzdCYmc2VjdGlvbiE9QlNTKXtlbWl0KGYsYnNzbmFtZSk7aWYoZikgc2VjdGlvbj1CU1M7fQorICAgIH0KKyAgICBpZihHQVMpeworICAgICAgaWYoc2VjdGlvbiE9QlNTKSBlbWl0KGYsIlx0LmFsaWduXHQ0XG4lcyVsZDpcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgICBlbHNlIGVtaXQoZiwiXHQuY29tbVx0JXMlbGQsIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKyAgICB9ZWxzZXsKKyAgICAgIGVtaXQoZiwiXHRjbm9wXHQwLDRcbiVzJWxkXG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICAgIH0KKyAgICBuZXdvYmo9MTsKKyAgfQorICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4peworICAgIGlmKEdBUyl7CisgICAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXMlc1xuIixJU0ZVTkModi0+dnR5cC0+ZmxhZ3MpP0ZVTkNQUkVGSVgodi0+dnR5cCk6aWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgfWVsc2V7CisgICAgICBlbWl0KGYsIlx0cHVibGljXHQlcyVzXG4iLElTRlVOQyh2LT52dHlwLT5mbGFncyk/RlVOQ1BSRUZJWCh2LT52dHlwKTppZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICB9CisgICAgaWYodi0+ZmxhZ3MmKERFRklORUR8VEVOVEFUSVZFKSl7CisgICAgICBpZighc3BlY2lhbF9zZWN0aW9uKGYsdikpeworCWlmKHYtPmNsaXN0JiYoIWNvbnN0ZmxhZ3x8Q09OU1RJTkRBVEEvKnx8dXNlX3NkKi8pJiZzZWN0aW9uIT1EQVRBKXtlbWl0KGYsZGF0YW5hbWUpO2lmKGYpIHNlY3Rpb249REFUQTt9CisJaWYodi0+Y2xpc3QmJmNvbnN0ZmxhZyYmIUNPTlNUSU5EQVRBLyomJiF1c2Vfc2QqLyYmc2VjdGlvbiE9Q09ERSl7ZW1pdChmLGNvZGVuYW1lKTtpZihmKSBzZWN0aW9uPUNPREU7fQorCWlmKCF2LT5jbGlzdCYmc2VjdGlvbiE9QlNTKXtlbWl0KGYsYnNzbmFtZSk7aWYoZikgc2VjdGlvbj1CU1M7fQorICAgICAgfQorICAgICAgaWYoR0FTKXsKKwlpZihzZWN0aW9uIT1CU1MpCisJICBlbWl0KGYsIlx0LmFsaWduXHQ0XG4lcyVzOlxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKwllbHNlCisJICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXMlc1xuXHQuJXNjb21tXHQlcyVzLCIsaWRwcmVmaXgsdi0+aWRlbnRpZmllciwoVVNFX0NPTU1PTlM/IiI6ImwiKSxpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICAgIH1lbHNleworCWVtaXQoZiwiXHRjbm9wXHQwLDRcbiVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgICB9CisgICAgICBuZXdvYmo9MTsKKyAgICB9CisgIH0KKyAgaWYodi0+dGF0dHImKEZBUnxDSElQKSkge2lmKGYpIHNlY3Rpb249LTE7bmV3b2JqPTA7fQorfQordm9pZCBnZW5fZGMoRklMRSAqZixpbnQgdCxjb25zdF9saXN0ICpwKQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSBzdGF0aWMgc3RvcmFnZSAgICAgICAgICAqLworLyogIGluaXRpYWxpemVkIHdpdGggY29uc3QtbGlzdCBwLiAgICAgICAgICAgICAgICAgICAgICAqLworeworICBjaGFyIHM7CisgIHRpdGxlKGYpOworICBpZighcCkgaWVycm9yKDApOworLyogICAgaWYoc2VjdGlvbiE9REFUQSl7ZW1pdChmLGRhdGFuYW1lKTtpZihmKSBzZWN0aW9uPURBVEE7fSovCisgIGlmKElTRkxPQVQodCl8fCh0Jk5RKT09TExPTkcpIHM9J2wnOyBlbHNlIHM9eF90W3QmTlFdOworICBpZihHQVMpeworICAgIGNoYXIgKnN0cjsKKyAgICBpZihzPT0nYicpIHN0cj0iXHQuYnl0ZVx0IjsKKyAgICBlbHNlIGlmKHM9PSd3Jykgc3RyPSJcdC5zaG9ydFx0IjsKKyAgICBlbHNlIGlmKHM9PSdsJykgc3RyPSJcdC5sb25nXHQiOworICAgIGVsc2UgaWVycm9yKDApOworICAgIGVtaXQoZiwiJXMiLHN0cik7CisgIH1lbHNleworICAgIGVtaXQoZiwiXHRkYy4lY1x0IixzKTsKKyAgfQorICBpZighcC0+dHJlZSl7CisgICAgaWYoSVNGTE9BVCh0KSl7CisgICAgICAvKiAgYXVjaCB3aWVkZXIgbmljaHQgc2VociBzY2hvZW4gdW5kIElFRUUgbm9ldGlnICAgKi8KKyAgICAgIHVuc2lnbmVkIGNoYXIgKmlwO2NoYXIgKnM7CisgICAgICBpcD0odW5zaWduZWQgY2hhciAqKSZwLT52YWwudmRvdWJsZTsKKyAgICAgIGlmKEdBUykgcz0iMHgiOyBlbHNlIHM9IiQiOworICAgICAgZW1pdChmLCIlcyUwMnglMDJ4JTAyeCUwMngiLHMsaXBbMF0saXBbMV0saXBbMl0saXBbM10pOworICAgICAgaWYoKHQmTlEpIT1GTE9BVCl7CisJZW1pdChmLCIsJXMlMDJ4JTAyeCUwMnglMDJ4IixzLGlwWzRdLGlwWzVdLGlwWzZdLGlwWzddKTsKKyAgICAgIH0KKyAgICB9ZWxzZSBpZigodCZOUSk9PUxMT05HKXsKKyAgICAgIHp1bWF4IHRtcDsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnZhbCx0KTsKKyAgICAgIHRtcD12dW1heDsKKyAgICAgIHZ1bWF4PXp1bWFuZCh6dW1yc2hpZnQodnVtYXgsdWwyenVtKDMyVUwpKSx1bDJ6dW0oMHhmZmZmZmZmZikpOyAKKyAgICAgIGd2YWwudnVsb25nPXp1bTJ6dWwodnVtYXgpOworICAgICAgZW1pdHZhbChmLCZndmFsLFVOU0lHTkVEfExPTkcpOworICAgICAgZW1pdChmLCIsIik7CisgICAgICB2dW1heD16dW1hbmQodG1wLHVsMnp1bSgweGZmZmZmZmZmKSk7IAorICAgICAgZ3ZhbC52dWxvbmc9enVtMnp1bCh2dW1heCk7CisgICAgICBlbWl0dmFsKGYsJmd2YWwsVU5TSUdORUR8TE9ORyk7CisgICAgfWVsc2V7CisgICAgICBlbWl0dmFsKGYsJnAtPnZhbCx0Jk5VKTsKKyAgICB9CisgIH1lbHNleworICAgIGludCBtLG0yLG0zOworICAgIHAtPnRyZWUtPm8uYW09MDsKKyAgICBtPXAtPnRyZWUtPm8uZmxhZ3M7CisgICAgcC0+dHJlZS0+by5mbGFncyY9flZBUkFEUjsKKyAgICBtMj1nX2ZsYWdzWzVdOworICAgIGdfZmxhZ3NbNV0mPX5VU0VERkxBRzsKKyAgICBtMz11c2Vfc2Q7CisgICAgdXNlX3NkPTA7CisgICAgZW1pdF9vYmooZiwmcC0+dHJlZS0+byx0Jk5VKTsKKyAgICBwLT50cmVlLT5vLmZsYWdzPW07CisgICAgZ19mbGFnc1s1XT1tMjsKKyAgICB1c2Vfc2Q9bTM7CisgIH0KKyAgZW1pdChmLCJcbiIpO25ld29iaj0wOworfQorCitzdGF0aWMgdm9pZCBhbGxvY3JlZyhpbnQgcikKK3sKKyAgaWYocmVnX3BhaXIociwmcnApKXsKKyAgICByZWdzW3JwLnIxXT0xOworICAgIHJlZ3NbcnAucjJdPTE7CisgIH0KKyAgcmVnc1tyXT0xOworfQorCitzdGF0aWMgdm9pZCBmcmVlcmVnKGludCByKQoreworICBpZihyZWdfcGFpcihyLCZycCkpeworICAgIHJlZ3NbcnAucjFdPTA7CisgICAgcmVnc1tycC5yMl09MDsKKyAgfQorICByZWdzW3JdPTA7Cit9CisKKy8qICBUaGUgbWFpbiBjb2RlLWdlbmVyYXRpb24gcm91dGluZS4gICAgICAgICAgICAgICAgICAgKi8KKy8qICBmIGlzIHRoZSBzdHJlYW0gdGhlIGNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8uICAgICAgKi8KKy8qICBwIGlzIGEgcG9pbnRlciB0byBhIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBJQ3MgICAgICAgKi8KKy8qICBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBib2R5IHRvIGdlbmVyYXRlIGNvZGUgZm9yLiAgKi8KKy8qICB2IGlzIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBvZmZzZXQgaXMgdGhlIHNpemUgb2YgdGhlIHN0YWNrZnJhbWUgdGhlIGZ1bmN0aW9uICAgKi8KKy8qICBuZWVkcyBmb3IgbG9jYWwgdmFyaWFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwordm9pZCBnZW5fY29kZShGSUxFICpmLElDICpwLFZhciAqdix6bWF4IG9mZnNldCkKK3sKKyAgaW50IGMsdDtjaGFyIGZwWzJdPSJcMFwwIjsKKyAgaW50IGFjdF9saW5lPTA7Y2hhciAqYWN0X2ZpbGU9MDsKKyAgaW50IHNoaWZ0aXNkaXY7CisgIGlmKERFQlVHJjEpIHByaW50ZigiZ2VuX2NvZGUoKVxuIik7CisgIGZvcihjPTE7Yzw9TUFYUjtjKyspIHJlZ3NbY109cmVnc2FbY107CisgIGlmKCFOT1BFRVBIT0xFKXsKKyAgICAvKiAgQWRyZXNzaWVydW5nc2FydGVuIGJlbnV0emVuICovCisgICAgaWYoIWFkZHJlc3NpbmcocCkpIG9mZnNldD1sMnptKDBMKTsKKyAgfQorICB0aXRsZShmKTsKKyAgaWYoZGVidWdfaW5mbyl7CisgICAgaWYoSFVOS0RFQlVHKXsKKyAgICAgIGlmKCFHQVMpeworCWFjdF9saW5lPTE7CisJZW1pdChmLCJcdGRzb3VyY2VcdFwiJXNcIlxuIixmaWxlbmFtZSk7CisJZW1pdChmLCJcdGRlYnVnXHQlZFxuIixhY3RfbGluZSk7CisgICAgICB9CisgICAgfQorICB9CisgIHJlZ2xhYmVsPSsrbGFiZWw7ZnJlZ2xhYmVsPSsrbGFiZWw7CisgIGZ1bmN0aW9uX3RvcChmLHYsem0ybChvZmZzZXQpKTsKKyAgY2Nfc2V0PWNjX3NldF90c3Q9MDsKKyAgc3RhY2tvZmZzZXQ9bm90cG9wcGVkPWRvbnRwb3A9bWF4cHVzaGVkPTA7CisgIGZvcihjPTE7Yzw9TUFYUjtjKyspeworICAgIGlmKHJlZ3NhW2NdfHxyZWd1c2VkW2NdKXsKKyAgICAgIEJTRVQocmVnc19tb2RpZmllZCxjKTsKKyAgICB9CisgIH0KKyAgZm9yKDtwO3ByKGYscCkscD1wLT5uZXh0KXsKKyAgICBpZihkZWJ1Z19pbmZvKXsKKyAgICAgIGlmKEhVTktERUJVRyl7CisJaWYocC0+ZmlsZSYmcC0+ZmlsZSE9YWN0X2ZpbGUpeworCSAgYWN0X2ZpbGU9cC0+ZmlsZTsKKwkgIGlmKCFHQVMpIGVtaXQoZiwiXHRkc291cmNlXHRcIiVzXCJcbiIsYWN0X2ZpbGUpOworCX0KKwlpZihwLT5saW5lJiZwLT5saW5lIT1hY3RfbGluZSl7CisJICBhY3RfbGluZT1wLT5saW5lOworCSAgaWYoIUdBUykgZW1pdChmLCJcdGRlYnVnXHQlZFxuIixhY3RfbGluZSk7CisJfQorICAgICAgfWVsc2V7CisJZHdhcmYyX2xpbmVfaW5mbyhmLHApOworICAgICAgfQorICAgIH0KKworICAgIGlmKEZMT0FUNjQpeworICAgICAgaWYocC0+Y29kZT09Q09OVkVSVCkKKwlpZigocTF0eXAocCkmTlEpPT1GTE9BVCkgcC0+dHlwZjIrPURPVUJMRS1GTE9BVDsKKyAgICAgIGlmKCh6dHlwKHApJk5RKT09RkxPQVQpIHAtPnR5cGYrPURPVUJMRS1GTE9BVDsKKyAgICB9CisKKyAgICBjPXAtPmNvZGU7dD1wLT50eXBmOworICAgIGlmKGM9PU5PUCkgY29udGludWU7CisgICAgY2Nfc2V0X3RzdD1jY19zZXQ7CisgICAgY2NfdHlwX3RzdD1jY190eXA7CisgICAgc2hpZnRpc2Rpdj0wOworICAgIGlmKGNjX3NldF90c3QmJihERUJVRyY1MTIpKXtlbWl0KGYsIjsgY2Nfc2V0X3RzdD0iKTtlbWl0X29iaihmLGNjX3NldF90c3QsdCk7ZW1pdChmLCJcbiIpO30KKyAgICBpZihjY19zZXQmJihERUJVRyY1MTIpKXtlbWl0KGYsIjsgY2Nfc2V0PSIpO2VtaXRfb2JqKGYsY2Nfc2V0LHQpO2VtaXQoZiwiXG4iKTt9CisgICAgcHVzaGVkcmVnJj0xNjtpZihjPT1SRVNUT1JFUkVHUykgcHVzaGVkcmVnPTA7CisgICAgaWYoREVCVUcmMjU2KXtlbWl0KGYsIjsgIik7IHByaWMyKGYscCk7fQorICAgIGlmKERFQlVHJjUxMikgZW1pdChmLCI7IHN0YWNrb2Zmc2V0PSVsZCwgbm90cG9wcGVkPSVsZCwgcHVzaGVkcmVnPSVkLCBkb250cG9wPSVsZFxuIixzdGFja29mZnNldCxub3Rwb3BwZWQscHVzaGVkcmVnLGRvbnRwb3ApOworICAgIC8qICBtdWVzc2VuIHdpciBBcmd1bWVudGUgcG9wcGVuPyAgICovCisgICAgaWYobm90cG9wcGVkJiYhZG9udHBvcCl7CisgICAgICBpbnQgZmxhZz0wOworICAgICAgaWYoYz09TEFCRUx8fGM9PUNPTVBBUkV8fGM9PVRFU1R8fGM9PUJSQSl7CisJZW1pdChmLCJcdGFkZCVzLiVzXHQjJWxkLCVzXG4iLHF1aWNrW25vdHBvcHBlZDw9OF0sc3Ryc2hvcnRbbm90cG9wcGVkPDMyNzY4XSxub3Rwb3BwZWQsbXJlZ25hbWVzW3NwXSk7CisJcG9wKG5vdHBvcHBlZCk7bm90cG9wcGVkPTA7LypjY19zZXRfdHN0PWNjX3NldD0wOyovCisgICAgICB9CisgICAgfQorICAgIC8qICBuYSwgb2IgZGFzIGhpZXIgb2sgaXN0Li4/ICAgKi8KKyAgICBpZihjPT1TVUJQRlApIGM9U1VCOworICAgIGlmKGM9PVBNVUxUKSBjPU1VTFQ7CisgICAgaWYoYz09QUxMT0NSRUcpeworICAgICAgYWxsb2NyZWcocC0+cTEucmVnKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1GUkVFUkVHKXsKKyAgICAgIGZyZWVyZWcocC0+cTEucmVnKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1MQUJFTCl7CisgICAgICBpZihkZWJ1Z19pbmZvJiZIVU5LREVCVUcpIGFjdF9saW5lPTA7CisgICAgICBpZihHQVMpeworCWVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LHQpOworICAgICAgfWVsc2V7CisJZW1pdChmLCIlcyVkXG4iLGxhYnByZWZpeCx0KTsKKyAgICAgIH0KKyAgICAgIGNjX3NldD0wO2NvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1CUkEpe2VtaXQoZiwiXHQlc2JyYVx0JXMlZFxuIiwoR0FTPyJqIjoiIiksbGFicHJlZml4LHQpO2NvbnRpbnVlO30KKyAgICBpZihjPj1CRVEmJmM8QlJBKXsKKyAgICAgIGlmKEdBUyl7CisJaWYoc3RvcmVkX2NjKXtlbWl0KGYsIlx0am5lXHQlcyVkXG4iLGxhYnByZWZpeCx0KTtzdG9yZWRfY2M9MDtjb250aW51ZTt9CisJaWYoKGNvbXB0eXAmVU5TSUdORUQpfHwoY29tcHR5cCZOUSk9PVBPSU5URVIpeworCSAgZW1pdChmLCJcdGolc1x0JXMlZFxuIix1YnJhbmNoW2MtQkVRXSxsYWJwcmVmaXgsdCk7CisJfWVsc2V7CisJICBlbWl0KGYsIlx0JXNqJXNcdCVzJWRcbiIsZnAsZW5hbWVbY10rMSxsYWJwcmVmaXgsdCk7CisJfQorICAgICAgfWVsc2V7CisJaWYoc3RvcmVkX2NjKXtlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCx0KTtzdG9yZWRfY2M9MDtjb250aW51ZTt9CisJaWYoKGNvbXB0eXAmVU5TSUdORUQpfHwoY29tcHR5cCZOUSk9PVBPSU5URVIpeworCSAgZW1pdChmLCJcdGIlc1x0JXMlZFxuIix1YnJhbmNoW2MtQkVRXSxsYWJwcmVmaXgsdCk7CisJfWVsc2V7CisJICBlbWl0KGYsIlx0JXMlc1x0JXMlZFxuIixmcCxlbmFtZVtjXSxsYWJwcmVmaXgsdCk7CisJfQorICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorI2lmIDAKKyAgICBpZihDUFU+PTY4MDIwJiYoYz09TFNISUZUfHxjPT1NVUxUKSYmKHAtPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUJiZpc3JlZyh6KSYmcC0+ei5yZWc+PWQwJiZwLT56LnJlZzw9ZDcmJklTSU5UKHAtPnR5cGYpKXsKKyAgICAgIGludCBsPTA7CisgICAgICBldmFsX2NvbnN0KCZwLT5xMi52YWwscTJ0eXAocCkpOworICAgICAgaWYoYz09TFNISUZUJiZ6bWVxdG8odm1heCxsMnptKDFMKSkpIGw9MjsKKyAgICAgIGlmKGM9PUxTSElGVCYmem1lcXRvKHZtYXgsbDJ6bSgyTCkpKSBsPTQ7CisgICAgICBpZihjPT1MU0hJRlQmJnptZXF0byh2bWF4LGwyem0oM0wpKSkgbD04OworICAgICAgaWYoYz09TVVMVCYmem1lcXRvKHZtYXgsbDJ6bSgyTCkpKSBsPTI7CisgICAgICBpZihjPT1NVUxUJiZ6bWVxdG8odm1heCxsMnptKDRMKSkpIGw9NDsKKyAgICAgIGlmKGM9PU1VTFQmJnptZXF0byh2bWF4LGwyem0oOEwpKSkgbD04OworICAgICAgaWYobCE9MCl7CisJSUMgKnAyPXAtPm5leHQ7CisJd2hpbGUocDImJihwMi0+Y29kZT09QUxMT0NSRUd8fHAyLT5jb2RlPT1GUkVFUkVHKSkgcDI9cDItPm5leHQ7CisJaWYoKHAyLT5jb2RlPT1BRER8fHAyLT5jb2RlPT1BRERJMlApJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMi5yZWc9PXAtPnoucmVnJiYocDItPnR5cGYmTlUpPT0ocC0+dHlwZiZOVSkmJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz49YTAmJnAyLT5xMS5yZWc8PWE3JiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnoucmVnPj1hMCYmcDItPnoucmVnPD1hNyl7CisJICBJQyAqcDM9cDItPm5leHQ7CisJICB3aGlsZShwMyYmcDMtPmNvZGU9PUZSRUVSRUcpIGlmKHAzJiZwMy0+cTEucmVnPT1wLT56LnJlZykgYnJlYWs7CisJICBpZihwMyYmcDMtPmNvZGU9PUZSRUVSRUcmJnAzLT5xMS5yZWc9PXAtPnoucmVnKXsKKwkgICAgaW50IHI7CisJICAgIGlmKGlzcmVnKHExKSYmcC0+cTEucmVnPj1kMCYmcC0+cTEucmVnPD1kNykKKwkgICAgICByPXAtPnExLnJlZzsKKwkgICAgZWxzZXsKKwkgICAgICBtb3ZlKGYsJnAtPnExLDAsMCxwLT56LnJlZyxwLT50eXBmKTsKKwkgICAgICByPXAtPnoucmVnOworCSAgICB9CisJICAgIGVtaXQoZiwiXHRsZWFcdCglcywlcy4lYyolZCksJXNcbiIsbXJlZ25hbWVzW3AyLT5xMS5yZWddLG1yZWduYW1lc1tyXSxzaXpldGFiW3AtPnR5cGYmTlFdPT0yPyd3JzonbCcsbCxtcmVnbmFtZXNbcDItPnoucmVnXSk7CisJICAgIHAtPmNvZGU9Tk9QOworCSAgICBwLT5xMS5mbGFncz1wLT5xMi5mbGFncz1wLT56LmZsYWdzPTA7CisJICAgIHAyLT5jb2RlPU5PUDsKKwkgICAgcDItPnExLmZsYWdzPXAyLT5xMi5mbGFncz1wMi0+ei5mbGFncz0wOworCSAgICBjb250aW51ZTsKKwkgIH0KKwl9CisgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgaWYoYz09Q09NUEFSRSYmaXNjb25zdChxMikmJiFjZiYmKHQmTlEpIT1MTE9ORyl7CisgICAgICBjYXNlX3RhYmxlICpjdD1jYWxjX2Nhc2VfdGFibGUocCxKVU1QX1RBQkxFX0RFTlNJVFkpOworICAgICAgSUMgKnAyOworICAgICAgaWYoY3QmJihjdC0+bnVtPj1KVU1QX1RBQkxFX0xFTkdUSHx8KCFpc3JlZyhxMSkmJmN0LT5udW0+PUpVTVBfVEFCTEVfTEVOR1RILzIpKSl7CisJaW50IHIsZGVmbCx0YWJsPSsrbGFiZWwscnRzPTAsaSxhcj0wOworCWlmKGN0LT5uZXh0X2ljLT5jb2RlPT1CUkEpCisJICBkZWZsPWN0LT5uZXh0X2ljLT50eXBmOworCWVsc2UKKwkgIGRlZmw9KytsYWJlbDsKKwlmb3Iocj1kMDtyPD1kNztyKyspCisJICBpZighcmVnc1tyXSkgYnJlYWs7CisJaWYocj5kNyl7CisJICBpZigoIShwLT5xMS5mbGFncyZSRUcpKXx8cC0+cTEucmVnIT1kMCkKKwkgICAgcj1kMDsKKwkgIGVsc2UKKwkgICAgcj1kMTsKKwkgIGVtaXQoZiwiXHRzdWJxLiVzXHQjNCwlc1xuIixjZj8ibCI6InciLG1yZWduYW1lc1tzcF0pOworCSAgZW1pdChmLCJcdG1vdmUubFx0JXMsLSglcylcbiIsbXJlZ25hbWVzW3JdLG1yZWduYW1lc1tzcF0pOworCSAgcHVzaCg4KTsKKwl9ZWxzZXsKKwkgIHJlZ3VzZWRbcl09MTsKKwkgIEJTRVQocmVnc19tb2RpZmllZCxyKTsKKwl9CisJaWYoIXJlZ3Nbcl18fChwLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09RFJFRk9CSil7CisJICBmb3IoYXI9MTthcjxzcDthcisrKQorCSAgICBpZighcmVnc1thcl0pIGJyZWFrOworCSAgaWYoYXI+PXNwKXsKKwkgICAgYXI9YTA7CisJICAgIGlmKCFyZWdzW3JdKXsKKwkgICAgICBlbWl0KGYsIlx0c3VicS4lc1x0IzQsJXNcbiIsY2Y/ImwiOiJ3IixtcmVnbmFtZXNbc3BdKTsKKwkgICAgICBwdXNoKDQpOworCSAgICB9CisJICAgIGVtaXQoZiwiXHRtb3ZlLmxcdCVzLC0oJXMpXG4iLG1yZWduYW1lc1thcl0sbXJlZ25hbWVzW3NwXSk7CisJICAgIHB1c2goNCk7CisJICB9ZWxzZXsKKwkgICAgcmVndXNlZFthcl09MTsKKwkgICAgQlNFVChyZWdzX21vZGlmaWVkLGFyKTsKKwkgIH0KKwl9CisJaWYocmVnc1tyXXx8KGFyJiZyZWdzW2FyXSkpIGRlZmw9KytsYWJlbDsKKwlpZighcC0+cTEuYW0mJihwLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09RFJFRk9CSil7CisJICBwLT5xMS5mbGFncyY9fkRSRUZPQko7CisJICBtb3ZlKGYsJnAtPnExLDAsMCxhcixQT0lOVEVSKTsKKwkgIHAtPnExLmZsYWdzfD0oUkVHfERSRUZPQkopOworCSAgcC0+cTEuZmxhZ3MmPX5WQVI7CisJICBwLT5xMS5yZWc9YXI7CisJfQorCWlmKCh0Jk5VKT09KFVOU0lHTkVEfENIQVIpKQorCSAgZW1pdChmLCJcdG1vdmVxXHQjMCwlc1xuIixtcmVnbmFtZXNbcl0pOworCW1vdmUoZiwmcC0+cTEsMCwwLHIsdCk7CisJaWYoKHQmTlUpPT1DSEFSKXsKKwkgIGVtaXQoZiwiXHRleHQud1x0JXNcbiIsbXJlZ25hbWVzW3JdKTsKKwkgIHQ9U0hPUlQ7CisJfQorCWlmKCh0Jk5VKT09KFVOU0lHTkVEfENIQVIpKQorCSAgdD0oVU5TSUdORUR8U0hPUlQpOworCWlmKCgodCZVTlNJR05FRCkmJiF6dW1lcXRvKGN0LT5taW4udnVtYXgsdWwyenVtKDBVTCkpKXx8CisJICAgKCEodCZVTlNJR05FRCkmJiF6bWVxdG8oY3QtPm1pbi52bWF4LGwyem0oMEwpKSkpeworCSAgZW1pdChmLCJcdHN1Yi4lY1x0IyIseF90W3QmTlFdKTsKKwkgIGlmKHQmVU5TSUdORUQpCisJICAgIGVtaXR6dW0oZixjdC0+bWluLnZ1bWF4KTsKKwkgIGVsc2UKKwkgICAgZW1pdHptKGYsY3QtPm1pbi52bWF4KTsKKwkgIGVtaXQoZiwiLCVzXG4iLG1yZWduYW1lc1tyXSk7CisJfQorCWVtaXQoZiwiXHRjbXAuJWNcdCMiLHhfdFt0Jk5RXSk7CisJZW1pdHp1bShmLGN0LT5kaWZmKTsKKwllbWl0KGYsIiwlc1xuIixtcmVnbmFtZXNbcl0pOworCWlmKHJlZ3Nbcl18fHJlZ3NbYXJdKQorCSAgZW1pdChmLCJcdGJoaVx0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJZWxzZQorCSAgZW1pdChmLCJcdGJoaVx0JXMlZFxuIixsYWJwcmVmaXgsZGVmbCk7CisJaWYoQ1BVPDY4MDIwKQorCSAgZW1pdChmLCJcdGxzbC4lY1x0IzIsJXNcbiIseF90W3QmTlFdLG1yZWduYW1lc1tyXSk7CisJZm9yKGk9TUFYUjtpPj0xO2ktLSkKKwkgIGlmKHJlZ3NbaV0mNCkgcnRzPTE7CisJaWYocmVnc1tyXXx8cmVnc1thcl0peworCSAgaW50IG9mZjsKKwkgIGlmKHJlZ3Nbcl0pIG9mZj00OyBlbHNlIG9mZj0wOworCSAgaWYoYXImJnJlZ3NbYXJdKSBvZmYrPTQ7CisJICBpZihDUFU+PTY4MDIwKQorCSAgICBlbWl0KGYsIlx0bW92ZS5sXHQlcyVkKCVzcGMsJXMuJWMqNCksJWQoJXMpXG4iLGxhYnByZWZpeCx0YWJsLHJwcmVmaXgsbXJlZ25hbWVzW3JdLHhfdFt0Jk5RXSxvZmYsbXJlZ25hbWVzW3NwXSk7CisJICBlbHNlCisJICAgIGVtaXQoZiwiXHRtb3ZlLmxcdCVzJWQoJXNwYywlcy4lYyksJWQoJXMpXG4iLGxhYnByZWZpeCx0YWJsLHJwcmVmaXgsbXJlZ25hbWVzW3JdLHhfdFt0Jk5RXSxvZmYsbXJlZ25hbWVzW3NwXSk7CisJICBpZihhciYmcmVnc1thcl0peworCSAgICBlbWl0KGYsIlx0bW92ZS5sXHQoJXMpKywlc1xuIixtcmVnbmFtZXNbc3BdLG1yZWduYW1lc1thcl0pOworCSAgICBwb3AoNCk7CisJICB9CSAgICAgIAorCSAgaWYocmVnc1tyXSl7CisJICAgIGVtaXQoZiwiXHRtb3ZlLmxcdCglcykrLCVzXG4iLG1yZWduYW1lc1tzcF0sbXJlZ25hbWVzW3JdKTsKKwkgICAgcG9wKDQpOworCSAgfQorCSAgZW1pdChmLCJcdHJ0c1xuIik7CisJICBwb3AoNCk7CisJfWVsc2V7CisJICBpZihDUFU+PTY4MDIwKQorCSAgICBlbWl0KGYsIlx0bW92ZS5sXHQlcyVkKCVzcGMsJXMuJWMqNCksJXNcbiIsbGFicHJlZml4LHRhYmwscnByZWZpeCxtcmVnbmFtZXNbcl0seF90W3QmTlFdLG1yZWduYW1lc1thcl0pOworCSAgZWxzZQorCSAgICBlbWl0KGYsIlx0bW92ZS5sXHQlcyVkKCVzcGMsJXMuJWMpLCVzXG4iLGxhYnByZWZpeCx0YWJsLHJwcmVmaXgsbXJlZ25hbWVzW3JdLHhfdFt0Jk5RXSxtcmVnbmFtZXNbYXJdKTsKKwkgIGVtaXQoZiwiXHRqbXBcdCglcylcbiIsbXJlZ25hbWVzW2FyXSk7CisJfQorCWlmKEdBUyl7CisJICBlbWl0KGYsIlx0LmFsaWduXHQyXG4iKTsKKwkgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LHRhYmwpOworCSAgZW1pdF9qdW1wX3RhYmxlKGYsY3QsIlx0LmxvbmdcdCIsImwiLGRlZmwpOworCX1lbHNleworCSAgZW1pdChmLCJcdGNub3BcdDAsNFxuIik7CisJICBlbWl0KGYsIiVzJWRcbiIsbGFicHJlZml4LHRhYmwpOworCSAgZW1pdF9qdW1wX3RhYmxlKGYsY3QsIlx0ZGMubFx0IiwibCIsZGVmbCk7CisJfQorCWlmKGN0LT5uZXh0X2ljLT5jb2RlIT1CUkF8fHJlZ3Nbcl18fChhciYmcmVnc1thcl0pKXsKKwkgIGlmKHJlZ3Nbcl18fChhciYmcmVnc1thcl0pKXsKKwkgICAgZW1pdChmLCIlcyVkJXNcbiIsbGFicHJlZml4LGxhYmVsLEdBUz8iOiI6IiIpOworCSAgICBpZihhciYmcmVnc1thcl0pCisJICAgICAgZW1pdChmLCJcdG1vdmUubFx0KCVzKSssJXNcbiIsbXJlZ25hbWVzW3NwXSxtcmVnbmFtZXNbYXJdKTsKKwkgICAgaWYocmVnc1tyXSkKKwkgICAgICBlbWl0KGYsIlx0bW92ZS5sXHQoJXMpKywlc1xuIixtcmVnbmFtZXNbc3BdLG1yZWduYW1lc1tyXSk7CisJICAgIGVtaXQoZiwiXHRhZGRxLiVjXHQjNCwlc1xuIixjZj8nbCc6J3cnLG1yZWduYW1lc1tzcF0pOworCSAgfQorCSAgZW1pdChmLCIlcyVkJXNcbiIsbGFicHJlZml4LGRlZmwsR0FTPyI6IjoiIik7CisJICBwMj1jdC0+bmV4dF9pYy0+cHJldjsKKwl9ZWxzZQorCSAgcDI9Y3QtPm5leHRfaWM7CisJaWYocC0+cHJldikgcD1wLT5wcmV2OworCWRveworCSAgcD1wLT5uZXh0OworCSAgaWYocC0+Y29kZT09QUxMT0NSRUcpCisJICAgIGFsbG9jcmVnKHAtPnExLnJlZyk7CisJICBpZihwLT5jb2RlPT1GUkVFUkVHKQorCSAgICBmcmVlcmVnKHAtPnExLnJlZyk7CisJfXdoaWxlKHAhPXAyKTsKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYocC0+cTEuYW0peworICAgICAgaWYoIXJlZ3NbcC0+cTEuYW0tPmJhc2VyZWddKXsKKwlwcmljMihzdGRvdXQscCk7cHJpbnRmKCIlc1xuIixtcmVnbmFtZXNbcC0+cTEuYW0tPmJhc2VyZWddKTsgaWVycm9yKDApOworICAgICAgfQorICAgICAgaWYocC0+cTEuYW0tPmRyZWcmJiFyZWdzW3AtPnExLmFtLT5kcmVnJjEyN10peworCXByaW50ZigiUmVnaXN0ZXIgJXM6XG4iLG1yZWduYW1lc1twLT5xMS5hbS0+ZHJlZyYxMjddKTsKKwlpZXJyb3IoMCk7CisgICAgICB9CisgICAgfQorICAgIGlmKHAtPnEyLmFtKXsKKyAgICAgIGlmKCFyZWdzW3AtPnEyLmFtLT5iYXNlcmVnXSkge3ByaWMyKHN0ZG91dCxwKTtpZXJyb3IoMCk7fQorICAgICAgaWYocC0+cTIuYW0tPmRyZWcmJiFyZWdzW3AtPnEyLmFtLT5kcmVnJjEyN10pIHtwcmludGYoIlJlZ2lzdGVyICVzOlxuIixtcmVnbmFtZXNbcC0+cTIuYW0tPmRyZWcmMTI3XSk7aWVycm9yKDApO30KKyAgICB9CisgICAgaWYocC0+ei5hbSl7CisgICAgICBpZighcmVnc1twLT56LmFtLT5iYXNlcmVnXSkge3ByaWMyKHN0ZG91dCxwKTtwcmludGYoImFtPSVwIGI9JXMsaT0lcyxvPSVsZCxzPSVkXG4iLCh2b2lkKilwLT56LmFtLG1yZWduYW1lc1twLT56LmFtLT5iYXNlcmVnXSxtcmVnbmFtZXNbcC0+ei5hbS0+ZHJlZyYxMjddLHAtPnouYW0tPmRpc3QscC0+ei5hbS0+c2thbCk7aWVycm9yKDApO30KKyAgICAgIGlmKHAtPnouYW0tPmRyZWcmJiFyZWdzW3AtPnouYW0tPmRyZWcmMTI3XSkge3ByaW50ZigiUmVnaXN0ZXIgJXM6XG4iLG1yZWduYW1lc1twLT56LmFtLT5kcmVnJjEyN10pO2llcnJvcigwKTt9CisgICAgfQorICAgIGlmKChwLT5xMS5mbGFncyZSRUcpJiYhcmVnc1twLT5xMS5yZWddJiZwLT5jb2RlIT1NT1ZFRlJPTVJFRyYmKCFyZWdfcGFpcihwLT5xMS5yZWcsJnJwKXx8IXJlZ3NbcnAucjFdfHwhcmVnc1tycC5yMl0pKXsKKyAgICAgIHByaW50ZigiUmVnaXN0ZXIgJXM6XG4iLG1yZWduYW1lc1twLT5xMS5yZWddKTtwcmljMihzdGRvdXQscCk7dGVycm9yKCJpbGxlZ2FsIHVzZSBvZiByZWdpc3RlciIpO30KKyAgICBpZigocC0+cTIuZmxhZ3MmUkVHKSYmIXJlZ3NbcC0+cTIucmVnXSYmKCFyZWdfcGFpcihwLT5xMi5yZWcsJnJwKXx8IXJlZ3NbcnAucjFdfHwhcmVnc1tycC5yMl0pKXtwcmludGYoIlJlZ2lzdGVyICVzOlxuIixtcmVnbmFtZXNbcC0+cTIucmVnXSk7cHJpYzIoc3Rkb3V0LHApO3RlcnJvcigiaWxsZWdhbCB1c2Ugb2YgcmVnaXN0ZXIiKTt9CisgICAgaWYoKHAtPnouZmxhZ3MmUkVHKSYmIXJlZ3NbcC0+ei5yZWddJiZwLT5jb2RlIT1NT1ZFVE9SRUcmJighcmVnX3BhaXIocC0+ei5yZWcsJnJwKXx8IXJlZ3NbcnAucjFdfHwhcmVnc1tycC5yMl0pKXtwcmludGYoIlJlZ2lzdGVyICVzOlxuIixtcmVnbmFtZXNbcC0+ei5yZWddKTtpZihyZWdfcGFpcihwLT56LnJlZywmcnApKSBwcmludGYoIiVzPSVkICVzPSVkXG4iLHJlZ25hbWVzW3JwLnIxXSxyZWdzW3JwLnIxXSxyZWduYW1lc1tycC5yMl0scmVnc1tycC5yMl0pO3ByaWMyKHN0ZG91dCxwKTt0ZXJyb3IoImlsbGVnYWwgdXNlIG9mIHJlZ2lzdGVyIik7fQorICAgIC8qICAgICAgICBpZigocC0+cTIuZmxhZ3MmUkVHKSYmKHAtPnouZmxhZ3MmUkVHKSYmcC0+cTIucmVnPT1wLT56LnJlZyl7cHJpYzIoc3Rkb3V0LHApO2llcnJvcigwKTt9Ki8KKyAgICAvKmlmKChwLT5xMi5mbGFncyZWQVIpJiYocC0+ei5mbGFncyZWQVIpJiZwLT5xMi52PT1wLT56LnYmJmNvbXBhcmVfb2JqZWN0cygmcC0+cTIsJnAtPnopKXtwcmljMihzdGRvdXQscCk7aWVycm9yKDApO30qLworICAgIC8qICBDT01QQVJFICMwIGR1cmNoIFRFU1QgZXJzZXR6ZW4gKGVybGF1YnQsIGRhIHRzdCBhbGxlIEZsYWdzIHNldHp0KSAgICovCisgICAgaWYoYz09Q09NUEFSRSYmaXNjb25zdChxMikpeworICAgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHQpOworICAgICAgaWYoem1lcXRvKGwyem0oMEwpLHZtYXgpJiZ6dW1lcXRvKHVsMnp1bSgwVUwpLHZ1bWF4KSYmemxkZXF0byhkMnpsZCgwLjApLHZsZG91YmxlKSl7CisJYz1wLT5jb2RlPVRFU1Q7cC0+cTIuZmxhZ3M9MDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoYz09Q09NUEFSRSYmaXNjb25zdChxMSkpeworICAgICAgZXZhbF9jb25zdCgmcC0+cTEudmFsLHQpOworICAgICAgaWYoem1lcXRvKGwyem0oMEwpLHZtYXgpJiZ6dW1lcXRvKHVsMnp1bSgwVUwpLHZ1bWF4KSYmemxkZXF0byhkMnpsZCgwLjApLHZsZG91YmxlKSl7CisJSUMgKmJwPXAtPm5leHQ7aW50IGJjOworCWM9cC0+Y29kZT1URVNUO3AtPnExPXAtPnEyO3AtPnEyLmZsYWdzPTA7cC0+cTIuYW09MDsKKwkvKiAgTmFjaGZvbGdlbmRlbiBCcmFuY2ggdW1kcmVoZW4gICAqLworCXdoaWxlKGJwJiZicC0+Y29kZT09RlJFRVJFRykgYnA9YnAtPm5leHQ7CisJYmM9YnAtPmNvZGU7CisJaWYoIWJwfHxiYzxCRVF8fGJjPkJHVCkgaWVycm9yKDApOworCWlmKGJjPT1CTFQpIGJwLT5jb2RlPUJHVDsKKwlpZihiYz09QkdUKSBicC0+Y29kZT1CTFQ7CisJaWYoYmM9PUJMRSkgYnAtPmNvZGU9QkdFOworCWlmKGJjPT1CR0UpIGJwLT5jb2RlPUJMRTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogIGdlc2V0enRlIENvbmRpdGlvbkNvZGVzIG1lcmtlbiAgKi8KKyAgICBpZihwLT56LmZsYWdzJiYoIWlzcmVnKHopfHxwLT56LnJlZz49ZDApJiYoYyE9Q09OVkVSVHx8IUlTRkxPQVQocC0+dHlwZjIpKSYmKCghSVNGTE9BVCh0KSl8fEZQVT42ODAwMCkpeworICAgICAgY2Nfc2V0PSZwLT56O2NjX3R5cD1wLT50eXBmOworICAgIH1lbHNleworICAgICAgY2Nfc2V0PTA7CisgICAgfQorICAgIGlmKGM9PUxFQSl7CisgICAgICBpZighaXNyZWcoeil8fHAtPnoucmVnPjgpIGllcnJvcigwKTsKKyAgICAgIGVtaXQoZiwiXHRsZWFcdCIpO2VtaXRfb2JqKGYsJnAtPnExLHQpOworICAgICAgZW1pdChmLCIsJXNcbiIsbXJlZ25hbWVzW3AtPnoucmVnXSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09UEVBKXsKKyAgICAgIGVtaXQoZiwiXHRwZWFcdCIpO2VtaXRfb2JqKGYsJnAtPnExLHQpO2VtaXQoZiwiXG4iKTsKKyAgICAgIHB1c2goem0ybChwLT5xMi52YWwudm1heCkpOworICAgICAgZG9udHBvcCs9em0ybChwLT5xMi52YWwudm1heCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09TU9WRUZST01SRUcpeworICAgICAgaWYocC0+cTEucmVnPGZwMCkKKwllbWl0KGYsIlx0bW92ZS5sXHQlcywiLG1yZWduYW1lc1twLT5xMS5yZWddKTsKKyAgICAgIGVsc2UgaWYocC0+cTEucmVnPDI1KQorCWVtaXQoZiwiXHRmbW92ZS54XHQlcywiLG1yZWduYW1lc1twLT5xMS5yZWddKTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIlx0bW92ZW0ubFx0JXMsIixtcmVnbmFtZXNbcC0+cTEucmVnXSk7CisgICAgICBlbWl0X29iaihmLCZwLT56LHQpO2VtaXQoZiwiXG4iKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1NT1ZFVE9SRUcpeworICAgICAgaWYocC0+ei5yZWc8ZnAwKQorCWVtaXQoZiwiXHRtb3ZlLmxcdCIpOworICAgICAgZWxzZSBpZihwLT56LnJlZzwyNSkKKwllbWl0KGYsIlx0Zm1vdmUueFx0Iik7CisgICAgICBlbHNlCisJZW1pdChmLCJcdG1vdmVtLmxcdCIpOworICAgICAgZW1pdF9vYmooZiwmcC0+cTEsdCk7ZW1pdChmLCIsJXNcbiIsbXJlZ25hbWVzW3AtPnoucmVnXSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoTk9QRUVQSE9MRSl7CisgICAgICBpZihwLT5xMS5hbXx8cC0+cTIuYW18fHAtPnouYW0peworCWllcnJvcigwKTsKKwlwLT5xMS5hbT1wLT5xMi5hbT1wLT56LmFtPTA7CisgICAgICB9CisgICAgfQorICAgIHA9ZG9fcmVmcyhmLHApOworICAgIGlmKChwLT5xMS5mbGFncyYmKHExdHlwKHApJk5RKT09TExPTkcpfHwocC0+cTIuZmxhZ3MmJihxMnR5cChwKSZOUSk9PUxMT05HJiZwLT5jb2RlIT1MU0hJRlQmJnAtPmNvZGUhPVJTSElGVCl8fChwLT56LmZsYWdzJiYoenR5cChwKSZOUSk9PUxMT05HKSl7CisgICAgICBpZihoYW5kbGVfbGxvbmcoZixwKSl7CisJKmZwPTA7CisJY29udGludWU7CisgICAgICB9CisgICAgfQorICAgIGlmKE5PUEVFUEhPTEUpeworICAgICAgaWYocC0+cTEuYW18fHAtPnEyLmFtfHxwLT56LmFtKXsKKwlpZXJyb3IoMCk7CisJcC0+cTEuYW09cC0+cTIuYW09cC0+ei5hbT0wOworICAgICAgfQorICAgIH0KKyNpZmRlZiBNNjhLXzE2QklUX0lOVAorICAgIGlmKGM9PUNPTlZFUlQmJigodCZOUSk9PUxPTkd8fCh0Jk5RKT09UE9JTlRFUikmJigocC0+dHlwZjImTlEpPT1MT05HfHwocC0+dHlwZjImTlEpPT1QT0lOVEVSKSl7CisgICAgICBwLT5jb2RlPWM9QVNTSUdOOworICAgICAgcC0+cTIudmFsLnZtYXg9c2l6ZXRhYltMT05HXTsKKyAgICB9ICAgICAgICAgICAgICAgICAKKyNlbHNlCisgICAgaWYoYz09Q09OVkVSVCYmKCh0Jk5RKT09TE9OR3x8KHQmTlEpPT1JTlR8fCh0Jk5RKT09UE9JTlRFUikmJigocC0+dHlwZjImTlEpPT1MT05HfHwocC0+dHlwZjImTlEpPT1JTlR8fChwLT50eXBmMiZOUSk9PVBPSU5URVIpKXsKKyAgICAgIHAtPmNvZGU9Yz1BU1NJR047CisgICAgICBwLT5xMi52YWwudm1heD1zaXpldGFiW0xPTkddOworICAgIH0gICAgICAgICAgICAgICAgIAorI2VuZGlmCisgICAgaWYoYz09Q09OVkVSVCl7CisgICAgICBpbnQgdG87CisgICAgICBpZigodCZOUSk9PVBPSU5URVIpIHQ9KFVOU0lHTkVEfExPTkcpOworICAgICAgaWYoKHQmTlEpPT1MRE9VQkxFKSB0PURPVUJMRTsKKyAgICAgIHRvPXAtPnR5cGYyJk5VOworICAgICAgaWYodG89PVBPSU5URVIpIHRvPVVOU0lHTkVEfExPTkc7CisgICAgICBpZih0bz09TERPVUJMRSkgdG89RE9VQkxFOworI2lmZGVmIE02OEtfMTZCSVRfSU5UCisgICAgICBpZigodG89PShVTlNJR05FRHxDSEFSKXx8dG89PShVTlNJR05FRHxTSE9SVCl8fHRvPT0oVU5TSUdORUR8SU5UKSkmJiEodCZVTlNJR05FRCkmJih0Jk5RKT4odG8mTlEpKQorCWNjX3NldD0wOworI2Vsc2UKKyAgICAgIGlmKCh0bz09KFVOU0lHTkVEfENIQVIpfHx0bz09KFVOU0lHTkVEfFNIT1JUKSkmJiEodCZVTlNJR05FRCkmJih0Jk5RKT4odG8mTlEpKQorCWNjX3NldD0wOworI2VuZGlmCisgICAgICBpZihJU0ZMT0FUKHQpfHxJU0ZMT0FUKHRvKSl7CisJaWYoRlBVPjY4MDAwKXsKKwkgIGludCB6cmVnPTAsZnJlZz0wOworCSAgaWYoSVNGTE9BVCh0KSYmSVNGTE9BVCh0bykpeworCSAgICBpZihpc3JlZyhxMSkmJmlzcmVnKHopKXsKKwkgICAgICBpZihwLT5xMS5yZWchPXAtPnoucmVnKQorCQllbWl0KGYsIlx0Zm1vdmUueFx0JXMsJXNcbiIsbXJlZ25hbWVzW3AtPnExLnJlZ10sbXJlZ25hbWVzW3AtPnoucmVnXSk7CisJICAgICAgY29udGludWU7CisJICAgIH0KKwkgIH0KKwkgIGlmKGlzcmVnKHopJiZwLT56LnJlZz49ZnAwKQorCSAgICB6cmVnPXAtPnoucmVnOworCSAgaWYoaXNyZWcocTEpJiZwLT5xMS5yZWc+PWZwMCl7CisJICAgIGlmKCF6cmVnJiYodCZVTlNJR05FRCkmJiFJU0hXT1JEKHQpKQorCSAgICAgIHpyZWc9cC0+cTEucmVnOyAKKwkgICAgZWxzZSAKKwkgICAgICB6cmVnPWZyZWc9Z2V0X3JlZyhmLDIscCwxKTt9CisJICBpZighenJlZykgenJlZz1mcmVnPWdldF9yZWcoZiwyLHAsMCk7CisJICBpZigodG8mVU5TSUdORUQpJiZ4X3RbdG8mTlFdIT0nbCcpeworCSAgICBpbnQgZHJlZz1nZXRfcmVnKGYsMSxwLDApOworCSAgICBlbWl0KGYsIlx0bW92ZXFcdCMwLCVzXG4iLG1yZWduYW1lc1tkcmVnXSk7CisJICAgIG1vdmUoZiwmcC0+cTEsMCwwLGRyZWcsdG8pOworCSAgICBtb3ZlKGYsMCxkcmVnLDAsenJlZyxMT05HKTsKKwkgIH1lbHNleworCSAgICBpZighaXNyZWcocTEpfHxwLT5xMS5yZWchPXpyZWcpCisJICAgICAgbW92ZShmLCZwLT5xMSwwLDAsenJlZyx0byk7CisJICB9CisJICBpZighSVNGTE9BVCh0KSl7CisJICAgIGlmKCh0JlVOU0lHTkVEKSYmIUlTSFdPUkQodCkpeworCSAgICAgIGNoYXIgKnM7CisJICAgICAgaW50IGRyZWcxLGRyZWcyOworCSAgICAgIGludCBsMT0rK2xhYmVsLGwyPSsrbGFiZWw7CisJICAgICAgaWYoR0FTKSBzPSIweCI7IGVsc2Ugcz0iJCI7CisJICAgICAgaWYoaXNyZWcoeikpIAorCQlkcmVnMT1wLT56LnJlZzsKKwkgICAgICBlbHNlCisJCWRyZWcxPWdldF9yZWcoZiwxLHAsMCk7CisJICAgICAgaWYoRlBVPT02ODA0MCkKKwkJZHJlZzI9Z2V0X3JlZyhmLDEscCwwKTsKKwkgICAgICBpZighZnJlZyl7CisJCWlmKCEoaXNyZWcocTEpJiZwLT5uZXh0JiZwLT5uZXh0LT5jb2RlPT1GUkVFUkVHJiZwLT5uZXh0LT5xMS5yZWc9PXpyZWcpKXsKKwkJICBmcmVnPWdldF9yZWcoZiwyLHAsMSk7CisJCSAgZW1pdChmLCJcdGZtb3ZlLnhcdCVzLCVzXG4iLG1yZWduYW1lc1t6cmVnXSxtcmVnbmFtZXNbZnJlZ10pOworCQkgIHpyZWc9ZnJlZzsKKwkJfQkJCisJICAgICAgfQorCSAgICAgIGVtaXQoZiwiXHRmY21wLmRcdCMlczQxZTAwMDAwMDAwMDAwMDAsJXNcbiIscyxtcmVnbmFtZXNbenJlZ10pOworCSAgICAgIGVtaXQoZiwiXHRmYmdlXHQlcyVkXG4iLGxhYnByZWZpeCxsMSk7CisJICAgICAgaWYoRlBVPT02ODA0MCl7CisJCWVtaXQoZiwiXHRmbW92ZS5sXHQlc2ZwY3IsJXNcbiIscnByZWZpeCxtcmVnbmFtZXNbZHJlZzJdKTsKKwkJZW1pdChmLCJcdG1vdmVxXHQjMTYsJXNcbiIsbXJlZ25hbWVzW2RyZWcxXSk7CisJCWVtaXQoZiwiXHRvci5sXHQlcywlc1xuIixtcmVnbmFtZXNbZHJlZzJdLG1yZWduYW1lc1tkcmVnMV0pOworCQllbWl0KGYsIlx0YW5kLndcdCMtMzMsJXNcbiIsbXJlZ25hbWVzW2RyZWcxXSk7CisJCWVtaXQoZiwiXHRmbW92ZS5sXHQlcywlc2ZwY3JcbiIsbXJlZ25hbWVzW2RyZWcxXSxycHJlZml4KTsKKwkgICAgICB9ZWxzZXsKKwkJZW1pdChmLCJcdGZpbnRyelx0JXNcbiIsbXJlZ25hbWVzW3pyZWddKTsKKwkgICAgICB9CisJICAgICAgZW1pdChmLCJcdGZtb3ZlLmxcdCVzLCVzXG4iLG1yZWduYW1lc1t6cmVnXSxtcmVnbmFtZXNbZHJlZzFdKTsKKwkgICAgICBlbWl0KGYsIlx0YnJhXHQlcyVkXG4iLGxhYnByZWZpeCxsMik7CisJICAgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbDEpOworCSAgICAgIGVtaXQoZiwiXHRmc3ViLmRcdCMlczQxZTAwMDAwMDAwMDAwMDAsJXNcbiIscyxtcmVnbmFtZXNbenJlZ10pOworCSAgICAgIGlmKEZQVT09NjgwNDApeworCQllbWl0KGYsIlx0Zm1vdmUubFx0JXNmcGNyLCVzXG4iLHJwcmVmaXgsbXJlZ25hbWVzW2RyZWcyXSk7CisJCWVtaXQoZiwiXHRtb3ZlcVx0IzE2LCVzXG4iLG1yZWduYW1lc1tkcmVnMV0pOworCQllbWl0KGYsIlx0b3IubFx0JXMsJXNcbiIsbXJlZ25hbWVzW2RyZWcyXSxtcmVnbmFtZXNbZHJlZzFdKTsKKwkJZW1pdChmLCJcdGFuZC53XHQjLTMzLCVzXG4iLG1yZWduYW1lc1tkcmVnMV0pOworCQllbWl0KGYsIlx0Zm1vdmUubFx0JXMsJXNmcGNyXG4iLG1yZWduYW1lc1tkcmVnMV0scnByZWZpeCk7CisJICAgICAgfWVsc2V7CisJCWVtaXQoZiwiXHRmaW50cnpcdCVzXG4iLG1yZWduYW1lc1t6cmVnXSk7CisJICAgICAgfQorCSAgICAgIGVtaXQoZiwiXHRmbW92ZS5sXHQlcywlc1xuIixtcmVnbmFtZXNbenJlZ10sbXJlZ25hbWVzW2RyZWcxXSk7CisJICAgICAgZW1pdChmLCJcdGJjaGdcdCMzMSwlc1xuIixtcmVnbmFtZXNbZHJlZzFdKTsKKwkgICAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsMik7CisJICAgICAgaWYoRlBVPT02ODA0MCkKKwkJZW1pdChmLCJcdGZtb3ZlLmxcdCVzLCVzZnBjclxuIixtcmVnbmFtZXNbZHJlZzJdLHJwcmVmaXgpOworCSAgICAgIG1vdmUoZiwwLGRyZWcxLCZwLT56LDAsdCk7CisJICAgICAgY29udGludWU7CisJICAgIH0JICAgICAgCisJICAgIC8qICBuYWNoIGludGVnZXIsIGQuaC4gS29tbWFzdGVsbGVuIGFic2NobmVpZGVuICovCisJICAgIGlmKEZQVT09NjgwNDAvKnx8RlBVPT02ODA2MCovKXsKKwkgICAgICAvKiAgYmVpIDA0MCBlbXVsaWVydCAgICAqLworCSAgICAgIGludCBkcmVnMSxkcmVnMjsKKwkgICAgICBpZighTk9JTlRaKXsKKwkJaWYoaXNyZWcoeikpCisJCSAgZHJlZzE9cC0+ei5yZWc7CisJCWVsc2UKKwkJICBkcmVnMT1nZXRfcmVnKGYsMSxwLDApOworCQlkcmVnMj1nZXRfcmVnKGYsMSxwLDApOworCQllbWl0KGYsIlx0Zm1vdmUubFx0JXNmcGNyLCVzXG4iLHJwcmVmaXgsbXJlZ25hbWVzW2RyZWcyXSk7CisJCWVtaXQoZiwiXHRtb3ZlcVx0IzE2LCVzXG4iLG1yZWduYW1lc1tkcmVnMV0pOworCQllbWl0KGYsIlx0b3IubFx0JXMsJXNcbiIsbXJlZ25hbWVzW2RyZWcyXSxtcmVnbmFtZXNbZHJlZzFdKTsKKwkJZW1pdChmLCJcdGFuZC53XHQjLTMzLCVzXG4iLG1yZWduYW1lc1tkcmVnMV0pOworCQllbWl0KGYsIlx0Zm1vdmUubFx0JXMsJXNmcGNyXG4iLG1yZWduYW1lc1tkcmVnMV0scnByZWZpeCk7CisJICAgICAgfWVsc2V7CisJCWRyZWcxPWdldF9yZWcoZiwxLHAsMCk7CisJICAgICAgfQorCSAgICAgIGlmKCh0JlVOU0lHTkVEKSYmSVNIV09SRCh0KSl7CisJCWVtaXQoZiwiXHRmbW92ZS5sXHQlcywlc1xuIixtcmVnbmFtZXNbenJlZ10sbXJlZ25hbWVzW2RyZWcxXSk7CisJCWVtaXQoZiwiXHRtb3ZlLiVjXHQlcywiLHhfdFt0Jk5RXSxtcmVnbmFtZXNbZHJlZzFdKTsKKwkgICAgICB9ZWxzZXsKKwkJZW1pdChmLCJcdGZtb3ZlLiVjXHQlcywiLHhfdFt0Jk5RXSxtcmVnbmFtZXNbenJlZ10pOworCSAgICAgIH0KKwkgICAgICBlbWl0X29iaihmLCZwLT56LHQpO2VtaXQoZiwiXG4iKTsKKwkgICAgICBpZighTk9JTlRaKQorCQllbWl0KGYsIlx0Zm1vdmUubFx0JXMsJXNmcGNyXG4iLG1yZWduYW1lc1tkcmVnMl0scnByZWZpeCk7CisJICAgICAgY29udGludWU7CisJICAgIH1lbHNleworCSAgICAgIGlmKCFOT0lOVFopeworCQlpZighaXNyZWcocTEpfHxwLT5xMS5yZWchPXpyZWcpeworCQkgIGVtaXQoZiwiXHRmaW50cnoueFx0JXNcbiIsbXJlZ25hbWVzW3pyZWddKTsKKwkJfWVsc2V7CisJCSAgaW50IG5yZWc9Z2V0X3JlZyhmLDIscCwxKTsKKwkJICBlbWl0KGYsIlx0ZmludHJ6LnhcdCVzLCVzXG4iLG1yZWduYW1lc1t6cmVnXSxtcmVnbmFtZXNbbnJlZ10pOworCQkgIHpyZWc9bnJlZzsKKwkJfQorCSAgICAgIH0KKwkgICAgICBpZigodCZVTlNJR05FRCkmJklTSFdPUkQodCkpeworCQlpbnQgcjsKKwkJaWYoaXNyZWcoeikpIHI9cC0+ei5yZWc7IGVsc2Ugcj1nZXRfcmVnKGYsMSxwLDApOworCQltb3ZlKGYsMCx6cmVnLDAscixMT05HKTsKKwkJbW92ZShmLDAsciwmcC0+eiwwLHQpOworCSAgICAgIH1lbHNleworCQltb3ZlKGYsMCx6cmVnLCZwLT56LDAsdCk7CisJICAgICAgfQorCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICB9CisJICBpZigodG8mVU5TSUdORUQpJiZ4X3RbdG8mTlFdPT0nbCcpeworCSAgICBpbnQgbmxhYmVsOworCSAgICBlbWl0KGYsIlx0dHN0LiVjXHQiLHhfdFt0byZOUV0pOworCSAgICBlbWl0X29iaihmLCZwLT5xMSx0byk7ZW1pdChmLCJcbiIpOworCSAgICBubGFiZWw9KytsYWJlbDsKKwkgICAgZW1pdChmLCJcdGJnZS5zXHQlcyVkXG4iLGxhYnByZWZpeCxubGFiZWwpOworCSAgICBlbWl0KGYsIlx0ZmFkZC5kXHQjNDI5NDk2NzI5Niwlc1xuIixtcmVnbmFtZXNbenJlZ10pOworCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxubGFiZWwpOworCSAgfQorCSAgaWYoIShwLT56LnJlZyl8fHAtPnoucmVnIT16cmVnKXsKKwkgICAgbW92ZShmLDAsenJlZywmcC0+eiwwLHQpOworCSAgfQorCX1lbHNleworCSAgY2Nfc2V0PTA7CisJICBpZigodG8mTlEpPT0odCZOUSkpeworCSAgICBhc3NpZ24oZixwLCZwLT5xMSwmcC0+eixBU1NJR04sc2l6ZXRhYlt0byZOUV0sdCk7CisJICAgIGNvbnRpbnVlOworCSAgfQorCSAgaWYoKHRvJk5RKT09RkxPQVQmJigodCZOUSk9PURPVUJMRXx8KHQmTlEpPT1MRE9VQkxFKSl7CisJICAgIGlmKCFPTERfU09GVEZMT0FUKQorCSAgICAgIGllcnJvcigwKTsKKwkgICAgc2F2ZXJlZ3MoZixwKTsKKwkgICAgYXNzaWduKGYscCwmcC0+cTEsMCxQVVNILG1zaXpldGFiW0ZMT0FUXSxGTE9BVCk7CisJICAgIHNjcmF0Y2hfbW9kaWZpZWQoKTsKKwkgICAgaWYoR0FTKXsKKwkgICAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0X19pZWVlczJkXG5cdGpic3JcdF9faWVlZXMyZFxuXHRhZGRxLiVzXHQjNCwlc1xuIixzdHJzaG9ydFsxXSxtcmVnbmFtZXNbc3BdKTsKKwkgICAgfWVsc2V7CisJICAgICAgZW1pdChmLCJcdHB1YmxpY1x0X19pZWVlczJkXG5cdGpzclx0X19pZWVlczJkXG5cdGFkZHEuJXNcdCM0LCVzXG4iLHN0cnNob3J0WzFdLG1yZWduYW1lc1tzcF0pOworCSAgICB9CisJICAgIHBvcCg0KTsKKwkgICAgcmVzdG9yZXJlZ3NhKGYscCk7CisJICAgIHN0b3JlZDBkMShmLCZwLT56LHQpOworCSAgICByZXN0b3JlcmVnc2QoZixwKTsKKwkgICAgY29udGludWU7CisJICB9CisJICBpZigoKHRvJk5RKT09RE9VQkxFfHwodG8mTlEpPT1MRE9VQkxFKSYmKHQmTlEpPT1GTE9BVCl7CisJICAgIGlmKCFPTERfU09GVEZMT0FUKSBpZXJyb3IoMCk7CisJICAgIHNhdmVyZWdzKGYscCk7CisJICAgIGFzc2lnbihmLHAsJnAtPnExLDAsUFVTSCxtc2l6ZXRhYltET1VCTEVdLERPVUJMRSk7CisJICAgIHNjcmF0Y2hfbW9kaWZpZWQoKTsKKwkgICAgaWYoR0FTKXsKKwkgICAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0X19pZWVlZDJzXG5cdGpic3JcdF9faWVlZWQyc1xuXHRhZGRxLiVzXHQjOCwlc1xuIixzdHJzaG9ydFsxXSxtcmVnbmFtZXNbc3BdKTsKKwkgICAgfWVsc2V7CisJICAgICAgZW1pdChmLCJcdHB1YmxpY1x0X19pZWVlZDJzXG5cdGpzclx0X19pZWVlZDJzXG5cdGFkZHEuJXNcdCM4LCVzXG4iLHN0cnNob3J0WzFdLG1yZWduYW1lc1tzcF0pOworCSAgICB9CisJICAgIHBvcCg4KTsKKwkgICAgcmVzdG9yZXJlZ3NhKGYscCk7CisJICAgIG1vdmUoZiwwLGQwLCZwLT56LDAsdCk7CisJICAgIHJlc3RvcmVyZWdzZChmLHApOworCSAgICBjb250aW51ZTsKKwkgIH0KKwkgIGlmKElTRkxPQVQodG8pKXsKKwkgICAgaW50IHVuczsKKwkgICAgaWYoIU9MRF9TT0ZURkxPQVQpIGllcnJvcigwKTsKKwkgICAgc2F2ZXJlZ3MoZixwKTsKKwkgICAgaWYodCZVTlNJR05FRCkgdW5zPSd1JzsgZWxzZSB1bnM9J3MnOworCSAgICBhc3NpZ24oZixwLCZwLT5xMSwwLFBVU0gsc2l6ZXRhYlt0byZOUV0sdG8pOworCSAgICBzY3JhdGNoX21vZGlmaWVkKCk7CisJICAgIGlmKEdBUyl7CisJICAgICAgZW1pdChmLCJcdC5nbG9iYWxcdF9faWVlZWZpeCVjJWNcblx0amJzclx0X19pZWVlZml4JWMlY1xuXHRhZGRxLiVzXHQjJWxkLCVzXG4iLHhfdFt0byZOUV0sdW5zLHhfdFt0byZOUV0sdW5zLHN0cnNob3J0WzFdLHptMmwoc2l6ZXRhYlt0byZOUV0pLG1yZWduYW1lc1tzcF0pOworCSAgICB9ZWxzZXsKKwkgICAgICBlbWl0KGYsIlx0cHVibGljXHRfX2llZWVmaXglYyVjXG5cdGpzclx0X19pZWVlZml4JWMlY1xuXHRhZGRxLiVzXHQjJWxkLCVzXG4iLHhfdFt0byZOUV0sdW5zLHhfdFt0byZOUV0sdW5zLHN0cnNob3J0WzFdLHptMmwoc2l6ZXRhYlt0byZOUV0pLG1yZWduYW1lc1tzcF0pOworCSAgICB9CisJICAgIHBvcChzaXpldGFiW3RvJk5RXSk7CisJICAgIHJlc3RvcmVyZWdzYShmLHApOworCSAgICBtb3ZlKGYsMCxkMCwmcC0+eiwwLHQpOworCSAgICByZXN0b3JlcmVnc2QoZixwKTsKKwkgICAgY29udGludWU7CisJICB9ZWxzZXsKKwkgICAgaW50IHVucyx4dD14X3RbdG8mTlFdOworCSAgICBpZighT0xEX1NPRlRGTE9BVCkgaWVycm9yKDApOworCSAgICBzYXZlcmVncyhmLHApOworCSAgICBpZih0byZVTlNJR05FRCkgdW5zPSd1JzsgZWxzZSB1bnM9J3MnOworCSAgICBpZih4dCE9J2wnKXsKKwkgICAgICBlbWl0KGYsIlx0c3VicS4lc1x0IzQsJXNcbiIsc3Ryc2hvcnRbMV0sbXJlZ25hbWVzW3NwXSk7CisJICAgICAgcHVzaCg0KTsKKwkgICAgfQorCSAgICBlbWl0KGYsIlx0bW92ZS4lY1x0Iix4dCk7CisJICAgIGVtaXRfb2JqKGYsJnAtPnExLHRvKTsKKwkgICAgaWYoeHQhPSdsJykKKwkgICAgICBlbWl0KGYsIiwoJXMpXG4iLG1yZWduYW1lc1tzcF0pOyAKKwkgICAgZWxzZXsKKwkgICAgICBlbWl0KGYsIiwtKCVzKVxuIixtcmVnbmFtZXNbc3BdKTsKKwkgICAgICBwdXNoKDQpOworCSAgICB9CisJICAgIHNjcmF0Y2hfbW9kaWZpZWQoKTsKKwkgICAgaWYoR0FTKXsKKwkgICAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0X19pZWVlZmx0JWMlYyVjXG5cdGpic3JcdF9faWVlZWZsdCVjJWMlY1xuXHRhZGRxLiVzXHQjNCwlc1xuIix1bnMseHQseF90W3QmTlFdLHVucyx4dCx4X3RbdCZOUV0sc3Ryc2hvcnRbMV0sbXJlZ25hbWVzW3NwXSk7CisJICAgIH1lbHNleworCSAgICAgIGVtaXQoZiwiXHRwdWJsaWNcdF9faWVlZWZsdCVjJWMlY1xuXHRqc3JcdF9faWVlZWZsdCVjJWMlY1xuXHRhZGRxLiVzXHQjNCwlc1xuIix1bnMseHQseF90W3QmTlFdLHVucyx4dCx4X3RbdCZOUV0sc3Ryc2hvcnRbMV0sbXJlZ25hbWVzW3NwXSk7CisJICAgIH0KKwkgICAgcG9wKDQpOworCSAgICByZXN0b3JlcmVnc2EoZixwKTsKKwkgICAgaWYoKHQmTlEpPT1ET1VCTEV8fCh0Jk5RKT09TERPVUJMRSkKKwkgICAgICBzdG9yZWQwZDEoZiwmcC0+eix0KTsKKwkgICAgZWxzZQorCSAgICAgIG1vdmUoZiwwLGQwLCZwLT56LDAsdCk7CisJICAgIHJlc3RvcmVyZWdzZChmLHApOworCSAgICBjb250aW51ZTsKKwkgIH0KKwl9CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZigodG8mTlEpPCh0Jk5RKSl7CisJaW50IHpyZWc7CisJaWYoaXNyZWcoeikmJnAtPnoucmVnPj1kMCYmcC0+ei5yZWc8PWQ3KXsKKwkgIHpyZWc9cC0+ei5yZWc7CisJfWVsc2V7CisJICB6cmVnPWdldF9yZWcoZiwxLHAsMCk7CisJfQorCWlmKHNpemV0YWJbdCZOUV0hPXNpemV0YWJbTE9OR118fHNpemV0YWJbdG8mTlFdIT1zaXpldGFiW0xPTkddKXsKKwkgIC8qICBhdWZwYXNzZW4sIGZhbGxzIHVuc2lnbmVkIHVuZCBRdWVsbGU9PVppZWwgICovCisJICBpZigodG8mVU5TSUdORUQpJiZpc3JlZyhxMSkmJnpyZWc9PXAtPnExLnJlZyl7CisJICAgIHVuc2lnbmVkIGxvbmcgbDsKKwkgICAgaWYoKHRvJk5RKT09Q0hBUikgbD0weGZmOyBlbHNlIGw9MHhmZmZmOworCSAgICBlbWl0KGYsIlx0YW5kLiVjXHQjJWx1LCVzXG4iLGNmPydsJzp4X3RbdCZOUV0sbCxtcmVnbmFtZXNbenJlZ10pOworCSAgICBjb250aW51ZTsKKwkgIH0KKwkgIGlmKCh0byZVTlNJR05FRCkmJnAtPnExLmFtJiYoenJlZz09cC0+cTEuYW0tPmJhc2VyZWd8fHpyZWc9PShwLT5xMS5hbS0+ZHJlZyYxMjcpKSl7CisJICAgIC8qICBhdWZwYXNzZW4sIGZhbGxzIHVuc2lnbmVkIHVuZCBaaWVsIGltIGFtICAqLworCSAgICB1bnNpZ25lZCBsb25nIGw7CisJICAgIGlmKCh0byZOUSk9PUNIQVIpIGw9MHhmZjsgZWxzZSBsPTB4ZmZmZjsKKwkgICAgbW92ZShmLCZwLT5xMSwwLDAsenJlZyx0byk7CisJICAgIGVtaXQoZiwiXHRhbmQuJWNcdCMlbHUsJXNcbiIsY2Y/J2wnOnhfdFt0Jk5RXSxsLG1yZWduYW1lc1t6cmVnXSk7CisJICB9ZWxzZXsKKwkgICAgaWYodG8mVU5TSUdORUQpCisJICAgICAgZW1pdChmLCJcdG1vdmVxXHQjMCwlc1xuIixtcmVnbmFtZXNbenJlZ10pOworCSAgICBtb3ZlKGYsJnAtPnExLDAsMCx6cmVnLHRvKTsKKwkgIH0KKwkgIGlmKCEodG8mVU5TSUdORUQpKXsKKyNpZmRlZiBNNjhLXzE2QklUX0lOVAorCSAgICBpZigodG8mTlEpPT1DSEFSJiYoKHQmTlEpPT1TSE9SVHx8KHQmTlEpPT1JTlQpKSBlbWl0KGYsIlx0ZXh0LndcdCVzXG4iLG1yZWduYW1lc1t6cmVnXSk7CisJICAgIGlmKCgodG8mTlEpPT1TSE9SVHx8KHRvJk5RKT09SU5UKSYmbXNpemV0YWJbdCZOUV09PTQpIGVtaXQoZiwiXHRleHQubFx0JXNcbiIsbXJlZ25hbWVzW3pyZWddKTsKKyNlbHNlCisJICAgIGlmKCh0byZOUSk9PUNIQVImJih0Jk5RKT09U0hPUlQpIGVtaXQoZiwiXHRleHQud1x0JXNcbiIsbXJlZ25hbWVzW3pyZWddKTsKKwkgICAgaWYoKHRvJk5RKT09U0hPUlQmJm1zaXpldGFiW3QmTlFdPT00KSBlbWl0KGYsIlx0ZXh0LmxcdCVzXG4iLG1yZWduYW1lc1t6cmVnXSk7CisjZW5kaWYKKwkgICAgaWYoKHRvJk5RKT09Q0hBUiYmbXNpemV0YWJbdCZOUV09PTQpeworCSAgICAgIGlmKGNmfHxDUFU+PTY4MDIwKQorCQllbWl0KGYsIlx0ZXh0Yi5sXHQlc1xuIixtcmVnbmFtZXNbenJlZ10pOworCSAgICAgIGVsc2UKKwkJZW1pdChmLCJcdGV4dC53XHQlc1xuXHRleHQubFx0JXNcbiIsbXJlZ25hbWVzW3pyZWddLG1yZWduYW1lc1t6cmVnXSk7CisJICAgIH0KKwkgIH0KKwl9CisJaWYoIWlzcmVnKHopfHxwLT56LnJlZyE9enJlZyl7CisJICBtb3ZlKGYsMCx6cmVnLCZwLT56LDAsdCk7CisJfQorICAgICAgfWVsc2V7CisJbG9uZyBkaWZmO2ludCBtOworCW09MDsKKwlpZihwLT5xMS5mbGFncyZSRUcpeworCSAgcC0+cTEudmFsLnZtYXg9bDJ6bSgwTCk7CisJICBwLT5xMS5mbGFnc3w9RDE2T0ZGO209MTsKKwl9CisJZGlmZj1tc2l6ZXRhYlt0byZOUV0tbXNpemV0YWJbdCZOUV07CisJdm1heD1sMnptKGRpZmYpOworCXAtPnExLnZhbC52bWF4PXptYWRkKHAtPnExLnZhbC52bWF4LHZtYXgpOworCW1vdmUoZiwmcC0+cTEsMCwmcC0+eiwwLHQpOworCXZtYXg9bDJ6bShkaWZmKTsKKwlwLT5xMS52YWwudm1heD16bXN1YihwLT5xMS52YWwudm1heCx2bWF4KTsKKwlpZihtKSBwLT5xMS5mbGFncyY9fkQxNk9GRjsKKwlpZihjb21wYXJlX29iamVjdHMoJnAtPnExLCZwLT56KSkKKwkgIGNjX3NldD0wOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKElTRkxPQVQodCkmJkZQVT42ODAwMCkgKmZwPSdmJzsgZWxzZSAqZnA9MDsKKyAgICBpZihjPT1NSU5VU3x8Yz09S09NUExFTUVOVCl7CisgICAgICBpbnQgenJlZzsKKyAgICAgIGlmKElTRkxPQVQodCkpeworCWlmKEZQVT42ODAwMCl7CisJICBpZihpc3JlZyh6KSkgenJlZz1wLT56LnJlZzsgZWxzZSB6cmVnPWdldF9yZWcoZiwyLHAsMSk7CisJICBlbWl0KGYsIlx0Zm5lZy4iKTsKKwkgIGlmKGlzcmVnKHExKSkgZW1pdChmLCJ4XHQlcyIsbXJlZ25hbWVzW3AtPnExLnJlZ10pOworCSAgZWxzZSAgICB7ZW1pdChmLCIlY1x0Iix4X3RbdCZOUV0pO2VtaXRfb2JqKGYsJnAtPnExLHQpO30KKwkgIGVtaXQoZiwiLCVzXG4iLG1yZWduYW1lc1t6cmVnXSk7CisJICBpZighaXNyZWcoeil8fHAtPnoucmVnIT16cmVnKXsKKwkgICAgbW92ZShmLDAsenJlZywmcC0+eiwwLHQpOworCSAgfQorCSAgY29udGludWU7CisJfWVsc2V7CisJICBpZighT0xEX1NPRlRGTE9BVCkgaWVycm9yKDApOworCSAgc2F2ZXJlZ3MoZixwKTsKKwkgIGFzc2lnbihmLHAsJnAtPnExLDAsUFVTSCxtc2l6ZXRhYlt0Jk5RXSx0KTsKKwkgIHNjcmF0Y2hfbW9kaWZpZWQoKTsKKwkgIGlmKEdBUyl7CisJICAgIGVtaXQoZiwiXHQuZ2xvYmFsXHRfX2llZWVuZWclY1xuXHRqYnNyXHRfX2llZWVuZWclY1xuXHRhZGRxLiVzXHQjJWxkLCVzXG4iLHhfdFt0Jk5RXSx4X3RbdCZOUV0sc3Ryc2hvcnRbMV0sbXNpemV0YWJbdCZOUV0sbXJlZ25hbWVzW3NwXSk7CisJICB9ZWxzZXsKKwkgICAgZW1pdChmLCJcdHB1YmxpY1x0X19pZWVlbmVnJWNcblx0anNyXHRfX2llZWVuZWclY1xuXHRhZGRxLiVzXHQjJWxkLCVzXG4iLHhfdFt0Jk5RXSx4X3RbdCZOUV0sc3Ryc2hvcnRbMV0sbXNpemV0YWJbdCZOUV0sbXJlZ25hbWVzW3NwXSk7CisJICB9CisJICBwb3AobXNpemV0YWJbdCZOUV0pOworCSAgcmVzdG9yZXJlZ3NhKGYscCk7CisJICBpZigodCZOUSkhPUZMT0FUKQorCSAgICBzdG9yZWQwZDEoZiwmcC0+eix0KTsKKwkgIGVsc2UKKwkgICAgbW92ZShmLDAsZDAsJnAtPnosMCx0KTsKKwkgIHJlc3RvcmVyZWdzZChmLHApOworCSAgY29udGludWU7CisJfQorICAgICAgfQorICAgICAgaWYoIWNmJiZjb21wYXJlX29iamVjdHMoJnAtPnExLCZwLT56KSl7CisJZW1pdChmLCJcdCVzLiVjXHQiLGVuYW1lW2NdLHhfdFt0Jk5RXSk7CisJZW1pdF9vYmooZiwmcC0+cTEsdCk7ZW1pdChmLCJcbiIpOworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoaXNyZWcoeikmJnAtPnoucmVnPj1kMC8qJiZwLT56LnJlZzw9ZDcqLykKKwl6cmVnPXAtPnoucmVnOyBlbHNlIHpyZWc9Z2V0X3JlZyhmLDEscCwxKTsKKyAgICAgIGlmKCFpc3JlZyhxMSl8fHAtPnExLnJlZyE9enJlZyl7CisJbW92ZShmLCZwLT5xMSwwLDAsenJlZyx0KTsKKyAgICAgIH0KKyAgICAgIGVtaXQoZiwiXHQlcy4lY1x0JXNcbiIsZW5hbWVbY10seF90W3QmTlFdLG1yZWduYW1lc1t6cmVnXSk7CisgICAgICBpZighaXNyZWcoeil8fHAtPnoucmVnIT16cmVnKXsKKwltb3ZlKGYsMCx6cmVnLCZwLT56LDAsdCk7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09U0VUUkVUVVJOKXsKKyAgICAgIC8qICBSZXR1cm53ZXJ0IHNldHplbiAtIHEyLnZhbC52bWF4PT1zaXplLCB6LnJlZz09UmV0dXJucmVnaXN0ZXIgKi8KKyAgICAgIGlmKCgodCZOUSk9PURPVUJMRXx8KHQmTlEpPT1MRE9VQkxFKSYmcC0+ei5yZWc9PWQwKXsKKwlCU0VUKHJlZ3NfbW9kaWZpZWQsZDApO0JTRVQocmVnc19tb2RpZmllZCwxMCk7CisJaWYoaXNjb25zdChxMSkpeworCSAgdW5zaWduZWQgY2hhciAqaXA9KHVuc2lnbmVkIGNoYXIgKikmcC0+cTEudmFsLnZkb3VibGU7CisJICBjaGFyICpzOworCSAgaWYoR0FTKSBzPSIweCI7IGVsc2Ugcz0iJCI7CisJICBlbWl0KGYsIlx0bW92ZS5sXHQjJXMlMDJ4JTAyeCUwMnglMDJ4LCVzXG4iLHMsaXBbMF0saXBbMV0saXBbMl0saXBbM10sbXJlZ25hbWVzW2QwXSk7CisJICBlbWl0KGYsIlx0bW92ZS5sXHQjJXMlMDJ4JTAyeCUwMnglMDJ4LCVzXG4iLHMsaXBbNF0saXBbNV0saXBbNl0saXBbN10sbXJlZ25hbWVzW2QxXSk7CisJICBjb250aW51ZTsKKwl9CisJaWYoaXNyZWcocTEpJiZwLT5xMS5yZWc+PWZwMCYmcC0+cTEucmVnPD1mcDcpeworCSAgZW1pdChmLCJcdGZtb3ZlLmRcdCVzLC0oJXMpXG5cdG1vdmVtLmxcdCglcykrLCVzXG4iLG1yZWduYW1lc1twLT5xMS5yZWddLG1yZWduYW1lc1tzcF0sbXJlZ25hbWVzW3NwXSxtcmVnbmFtZXNbZDBkMV0pOworCX1lbHNleworCSAgbG9hZGQwZDEoZiwmcC0+cTEsdCk7CisJfQorCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoKElTU1RSVUNUKHQpfHxJU1VOSU9OKHQpKSYmcC0+ei5yZWc9PWQwKXsKKwlsb25nIGw9em0ybChwLT5xMi52YWwudm1heCk7CisJZW1pdChmLCJcdG1vdmVtLmxcdCIpO2VtaXRfb2JqKGYsJnAtPnExLHQpOworCWVtaXQoZiwiLCVzIixtcmVnbmFtZXNbZDBdKTtCU0VUKHJlZ3NfbW9kaWZpZWQsZDApOworCWlmKGw+PTgpIHtlbWl0KGYsIi8lcyIsbXJlZ25hbWVzW2QxXSk7QlNFVChyZWdzX21vZGlmaWVkLGQxKTt9CisJaWYobD49MTIpIHtlbWl0KGYsIi8lcyIsbXJlZ25hbWVzW2EwXSk7QlNFVChyZWdzX21vZGlmaWVkLGEwKTt9CisJaWYobD49MTYpIHtlbWl0KGYsIi8lcyIsbXJlZ25hbWVzW2ExXSk7QlNFVChyZWdzX21vZGlmaWVkLGExKTt9CisJZW1pdChmLCJcbiIpOworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgLyogIFdlbm4gUmV0dXJud2VydCB1ZWJlciBaZWlnZXIgZ2VzZXR6dCB3aXJkLCBuaWNodHMgbm9ldGlnICAgICovCisgICAgICBpZihwLT56LnJlZyl7CisJbW92ZShmLCZwLT5xMSwwLDAscC0+ei5yZWcscC0+dHlwZik7CisJQlNFVChyZWdzX21vZGlmaWVkLHAtPnoucmVnKTsKKwlpZih2LT50YXR0ciZBTUlJTlRFUlJVUFQpeworCSAgLyogaWYgbmVjZXNzYXJ5LCBzZXQgY29uZGl0aW9uLWNvZGVzICovCisJICBpZihwLT56LnJlZyE9ZDApIGllcnJvcigwKTsKKwkgIGlmKGlzcmVnKHExKSYmcC0+cTEucmVnPT1kMCkKKwkgICAgZW1pdChmLCJcdHRzdC4lY1x0JXNcbiIseF90W3QmTlFdLG1yZWduYW1lc1tkMF0pOworCX0KKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1HRVRSRVRVUk4peworICAgICAgLyogIFJldHVybndlcnQgaG9sZW4gLSBxMi52YWwudm1heD09c2l6ZSwgcTEucmVnPT1SZXR1cm5yZWdpc3RlciAgICAgKi8KKyAgICAgIGlmKCgodCZOUSk9PURPVUJMRXx8KHQmTlEpPT1MRE9VQkxFKSYmKHAtPnExLnJlZz09ZDB8fHAtPnExLnJlZz09ZDBkMSkpeworCWlmKGlzcmVnKHopJiZwLT56LnJlZz49ZnAwJiZwLT56LnJlZzw9ZnA3KXsKKwkgIGVtaXQoZiwiXHRtb3ZlbS5sXHQlcywtKCVzKVxuXHRmbW92ZS5kXHQoJXMpKywlc1xuIixtcmVnbmFtZXNbZDBkMV0sbXJlZ25hbWVzW3NwXSxtcmVnbmFtZXNbc3BdLG1yZWduYW1lc1twLT56LnJlZ10pOworCX1lbHNleworCSAgc3RvcmVkMGQxKGYsJnAtPnosdCk7CisJfQorCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoKElTU1RSVUNUKHQpfHxJU1VOSU9OKHQpKSYmcC0+cTEucmVnPT1kMCl7CisJbG9uZyBsPXptMmwocC0+cTIudmFsLnZtYXgpOworCWVtaXQoZiwiXHRtb3ZlbS5sXHQiKTsKKwllbWl0KGYsIiVzIixtcmVnbmFtZXNbZDBdKTsKKwlpZihsPj04KSBlbWl0KGYsIi8lcyIsbXJlZ25hbWVzW2QxXSk7CisJaWYobD49MTIpIGVtaXQoZiwiLyVzIixtcmVnbmFtZXNbYTBdKTsKKwlpZihsPj0xNikgZW1pdChmLCIvJXMiLG1yZWduYW1lc1thMV0pOworCWVtaXQoZiwiLCIpO2VtaXRfb2JqKGYsJnAtPnosdCk7ZW1pdChmLCJcbiIpOworCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKiAgV2VubiBSZXR1cm53ZXJ0IHVlYmVyIFplaWdlciBnZXNldHp0IHdpcmQsIG5pY2h0cyBub2V0aWcgICAgKi8KKyAgICAgIGNjX3NldD0wOworICAgICAgaWYocC0+cTEucmVnKXsKKwltb3ZlKGYsMCxwLT5xMS5yZWcsJnAtPnosMCxwLT50eXBmKTsKKwlpZighKHAtPnouZmxhZ3MmUkVHKXx8KHAtPnoucmVnIT1wLT5xMS5yZWcmJnAtPnoucmVnPj1kMCkpeyBjY19zZXQ9JnAtPno7Y2NfdHlwPXAtPnR5cGY7fQorICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PUNBTEwpeworICAgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJiFzdHJjbXAoIl9fdmFfc3RhcnQiLHAtPnExLnYtPmlkZW50aWZpZXIpKXsKKwlpbnQgc3I9KFVTRUZSQU1FUE9JTlRFUnx8dmxhcyk/ZmJwOnNwOworCWxvbmcgdmFfb2ZmPTA7CisJaWYoVVNFRlJBTUVQT0lOVEVSfHx2bGFzKXsKKwkgIGVtaXQoZiwiXHRtb3ZlLmxcdCVzLCVzXG4iLG1yZWduYW1lc1tmYnBdLG1yZWduYW1lc1tkMF0pOworCSAgZW1pdChmLCJcdGFkZC5sXHQjJWxkLCVzXG4iLChsb25nKSg4K3ptMmwodmFfb2Zmc2V0KHYpKSkrKFBST0ZJTEVSPzE2OjApLG1yZWduYW1lc1tkMF0pOworCX1lbHNleworCSAgZW1pdChmLCJcdG1vdmUubFx0JXMsJXNcbiIsbXJlZ25hbWVzW3NwXSxtcmVnbmFtZXNbZDBdKTsKKwkgIGVtaXQoZiwiXHRhZGQubFx0IyVzJWQrJWxkLCVzXG4iLGxhYnByZWZpeCxvZmZsYWJlbCwobG9uZykoNCt6bTJsKHZhX29mZnNldCh2KSkpK2xvZmYrKFBST0ZJTEVSPzE2OjApLG1yZWduYW1lc1tkMF0pOworCX0KKwlCU0VUKHJlZ3NfbW9kaWZpZWQsZDApOworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoKHAtPnExLmZsYWdzJlZBUikmJnAtPnExLnYtPmZpJiZwLT5xMS52LT5maS0+aW5saW5lX2FzbSl7CisJZW1pdF9pbmxpbmVfYXNtKGYscC0+cTEudi0+ZmktPmlubGluZV9hc20pOworCWlmKHN0YWNrX3ZhbGlkJiYocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmcC0+cTEudi0+ZmkmJihwLT5xMS52LT5maS0+ZmxhZ3MmQUxMX1NUQUNLKSkKKwkgIGNhbGxlZV9wdXNoKHp1bTJ1bChwLT5xMS52LT5maS0+c3RhY2sxKSk7CisJZWxzZQorCSAgc3RhY2tfdmFsaWQ9MDsKKyAgICAgIH1lbHNleworCWlmKChwLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09RFJFRk9CSil7CisJICBpZigxLypDUFU8NjgwMjAqLyl7CisJICAgIGVtaXQoZiwiXHRwZWFcdCVzJWQocGMpXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgICAgZW1pdChmLCJcdG1vdmUubFx0Iik7CisJICB9ZWxzZQorCSAgICBlbWl0KGYsIlx0JXNcdChbIixHQVM/Impic3IiOiJqc3IiKTsKKwkgIHAtPnExLmZsYWdzJj1+RFJFRk9CSjsKKwkgIGVtaXRfb2JqKGYsJnAtPnExLFBPSU5URVIpOworCSAgcC0+cTEuZmxhZ3N8PURSRUZPQko7CisJICBpZigxLypDUFU8NjgwMjAqLyl7CisJICAgIGVtaXQoZiwiLC0oJXMpXG4iLG1yZWduYW1lc1tzcF0pOworCSAgICBlbWl0KGYsIlx0cnRzXG4iKTsKKwkgICAgZW1pdChmLCIlcyVkJXNcbiIsbGFicHJlZml4LGxhYmVsLEdBUz8iOiI6IiIpOworCSAgfWVsc2UKKwkgICAgZW1pdChmLCJdKVxuIik7CisJfWVsc2V7CisJICBpZihHQVMpeworCSAgICBlbWl0KGYsIlx0amJzclx0Iik7CisJICB9ZWxzZXsKKwkgICAgZW1pdChmLCJcdGpzclx0Iik7CisJICB9CisJICAvKiAgV2VubiBnZXRhNCgpIGF1ZmdlcnVmZW4gd3VyZGUsIG1lcmtlbi4gICovCisJICBpZih1c2Vfc2QmJihwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiYhc3RyY21wKHAtPnExLnYtPmlkZW50aWZpZXIsImdldGE0IikmJnAtPnExLnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTikKKwkgICAgZ2V0YTQ9MTsKKwkgIGlmKChwLT5xMS5mbGFncyYoRFJFRk9CSnxSRUd8S09OU1QpKT09RFJFRk9CSikgaWVycm9yKDApOworCSAgZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJICBlbWl0KGYsIlxuIik7CisJfQorCXB1c2goNCk7CisJaWYoc3RhY2tfdmFsaWQmJihwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiZwLT5xMS52LT5maSYmKHAtPnExLnYtPmZpLT5mbGFncyZBTExfU1RBQ0spKQorCSAgY2FsbGVlX3B1c2goenVtMnVsKHAtPnExLnYtPmZpLT5zdGFjazEpKTsKKwllbHNlCisJICBzdGFja192YWxpZD0wOworCXBvcCg0KTsKKyAgICAgIH0KKyAgICAgIGlmKGRlYnVnX2luZm8mJkhVTktERUJVRykgYWN0X2xpbmU9MDsKKyAgICAgIGlmKCF6bWVxdG8ocC0+cTIudmFsLnZtYXgsbDJ6bSgwTCkpKXsKKwlub3Rwb3BwZWQrPXptMmwocC0+cTIudmFsLnZtYXgpOworCWRvbnRwb3AtPXptMmwocC0+cTIudmFsLnZtYXgpOworCWlmKCFOT0RFTEFZRURQT1AmJiEocHVzaGVkcmVnJjMwKSYmIXZsYXMmJnN0YWNrb2Zmc2V0PT0tbm90cG9wcGVkKXsKKwkgIC8qICBFbnRmZXJuZW4gZGVyIFBhcmFtZXRlciB2ZXJ6b2VnZXJuICAqLworCX1lbHNleworCSAgaWYoZGVidWdfaW5mbyYmSFVOS0RFQlVHJiYhR0FTKXsgYWN0X2xpbmU9cC0+bGluZTsgZW1pdChmLCJcdGRlYnVnXHQlZFxuIixhY3RfbGluZSk7fQorCSAgZW1pdChmLCJcdGFkZCVzLiVzXHQjJWxkLCVzXG4iLHF1aWNrW3ptMmwocC0+cTIudmFsLnZtYXgpPD04XSxzdHJzaG9ydFt6bTJsKHAtPnEyLnZhbC52bWF4KTwzMjc2OF0sem0ybChwLT5xMi52YWwudm1heCksbXJlZ25hbWVzW3NwXSk7CisJICBwb3Aoem0ybChwLT5xMi52YWwudm1heCkpOworCSAgbm90cG9wcGVkLT16bTJsKHAtPnEyLnZhbC52bWF4KTsKKwl9CisgICAgICB9CisgICAgICBpZigocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmcC0+cTEudi0+ZmkmJihwLT5xMS52LT5maS0+ZmxhZ3MmQUxMX1JFR1MpKXsKKwlidnVuaXRlKHJlZ3NfbW9kaWZpZWQscC0+cTEudi0+ZmktPnJlZ3NfbW9kaWZpZWQsUlNJWkUpOworICAgICAgfWVsc2V7CisJaW50IGk7CisJZm9yKGk9MTtpPD1NQVhSO2krKyl7CisJICBpZihyZWdzY3JhdGNoW2ldKQorCSAgICBpZihpPGZwMHx8aT5mcDd8fEZQVT42ODAwMCkgCisJICAgICAgQlNFVChyZWdzX21vZGlmaWVkLGkpOworCX0KKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1URVNUKXsKKyAgICAgIC8qICBDb25kaXRpb25Db2RlcyBzY2hvbiBnZXNldHp0PyAgICovCisgICAgICBjY19zZXQ9JnAtPnExO2NjX3R5cD10OworICAgICAgY29tcHR5cD10OworICAgICAgaWYoY2Nfc2V0X3RzdCYmdD09Y2NfdHlwX3RzdCl7CisJSUMgKmJyYW5jaDsKKwlpZih0JlVOU0lHTkVEKXsKKwkgIGJyYW5jaD1wLT5uZXh0OworCSAgd2hpbGUoYnJhbmNoJiYoYnJhbmNoLT5jb2RlPEJFUXx8YnJhbmNoLT5jb2RlPkJHVCkpCisJICAgIGJyYW5jaD1icmFuY2gtPm5leHQ7CisJICBpZighYnJhbmNoKSBjb250aW51ZTsKKwkgIGlmKGJyYW5jaC0+Y29kZT09QkxFKSBicmFuY2gtPmNvZGU9QkVROworCSAgaWYoYnJhbmNoLT5jb2RlPT1CR1QpIGJyYW5jaC0+Y29kZT1CTkU7CisJICBpZihicmFuY2gtPmNvZGU9PUJHRSkge2JyYW5jaC0+Y29kZT1CUkE7Y29udGludWU7fQorCSAgaWYoYnJhbmNoLT5jb2RlPT1CTFQpIHticmFuY2gtPmNvZGU9Tk9QO2NvbnRpbnVlO30KKwl9CisJaWYoY29tcGFyZV9vYmplY3RzKCZwLT5xMSxjY19zZXRfdHN0KSYmcC0+cTEuYW09PWNjX3NldF90c3QtPmFtJiZ6bWVxdG8ocC0+cTEudmFsLnZtYXgsY2Nfc2V0X3RzdC0+dmFsLnZtYXgpKXsKKwkgIGlmKERFQlVHJjUxMil7ZW1pdChmLCI7IHRzdCBlbGltaW5hdGVkOiBjYz0iKTtlbWl0X29iaihmLGNjX3NldF90c3QsdCk7CisJICBlbWl0KGYsIiwgcTE9Iik7ZW1pdF9vYmooZiwmcC0+cTEsdCk7ZW1pdChmLCJcbiIpO30KKwkgIGNvbnRpbnVlOworCX0KKyAgICAgIH0KKyAgICAgIGlmKENQVTw2ODAyMCYmaXNyZWcocTEpJiZwLT5xMS5yZWc+PTEmJnAtPnExLnJlZzw9OCl7CisJLyogIHRzdCBheCBnaWJ0IGVzIG5pY2h0IGJlaSA8NjgwMDAgOi0oICovCisJaWYocmVnYXZhaWxhYmxlKDEpKXsKKwkgIGVtaXQoZiwiXHRtb3ZlLiVjXHQlcywlc1xuIix4X3RbdCZOUV0sbXJlZ25hbWVzW3AtPnExLnJlZ10sbXJlZ25hbWVzW2dldF9yZWcoZiwxLHAsMCldKTsKKwl9ZWxzZXsKKwkgIGVtaXQoZiwiXHRjbXAuJWNcdCMwLCVzXG4iLGNmPydsJzondycsbXJlZ25hbWVzW3AtPnExLnJlZ10pOworCX0KKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKElTRkxPQVQodCkmJkZQVTw9NjgwMDApeworCS8qICBuaWNodCBzZWhyIHNjaG9lbiAgICovCisJaW50IHJlc3VsdD1nZXRfcmVnKGYsMSxwLDApOworCWlmKCFPTERfU09GVEZMT0FUKSBpZXJyb3IoMCk7CisJc2F2ZXJlZ3MoZixwKTsKKwlhc3NpZ24oZixwLCZwLT5xMSwwLFBVU0gsbXNpemV0YWJbdCZOUV0sdCk7CisJc2NyYXRjaF9tb2RpZmllZCgpOworCWlmKEdBUyl7CisJICBlbWl0KGYsIlx0Lmdsb2JhbFx0X19pZWVldHN0JWNcblx0amJzclx0X19pZWVldHN0JWNcblx0YWRkcS4lc1x0IyVsZCwlc1xuIix4X3RbdCZOUV0seF90W3QmTlFdLHN0cnNob3J0WzFdLG1zaXpldGFiW3QmTlFdLG1yZWduYW1lc1tzcF0pOworCX1lbHNleworCSAgZW1pdChmLCJcdHB1YmxpY1x0X19pZWVldHN0JWNcblx0anNyXHRfX2llZWV0c3QlY1xuXHRhZGRxLiVzXHQjJWxkLCVzXG4iLHhfdFt0Jk5RXSx4X3RbdCZOUV0sc3Ryc2hvcnRbMV0sbXNpemV0YWJbdCZOUV0sbXJlZ25hbWVzW3NwXSk7CisJfQorCXBvcChtc2l6ZXRhYlt0Jk5RXSk7CisJcmVzdG9yZXJlZ3NhKGYscCk7CisJaWYocmVzdWx0IT1kMCkgZW1pdChmLCJcdG1vdmUubFx0JXMsJXNcbiIsbXJlZ25hbWVzW2QwXSxtcmVnbmFtZXNbcmVzdWx0XSk7CisJZW1pdChmLCJcdHRzdC5sXHQlc1xuIixtcmVnbmFtZXNbcmVzdWx0XSk7CisJcmVzdG9yZXJlZ3NkKGYscCk7CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZihpc3JlZyhxMSkmJnAtPnExLnJlZz49ZnAwJiZwLT5xMS5yZWc8PWZwNyl7CisJZW1pdChmLCJcdGZ0c3QueFx0JXNcbiIsbXJlZ25hbWVzW3AtPnExLnJlZ10pOworICAgICAgfWVsc2UgaWYocC0+cTEuZmxhZ3MmKFZBUkFEUnxLT05TVCkpeworCWludCByPWdldF9yZWcoZiwxLHAsMCk7CisJZW1pdChmLCJcdG1vdmUuJWNcdCIseF90W3QmTlFdKTsKKwllbWl0X29iaihmLCZwLT5xMSx0KTsKKwllbWl0KGYsIiwlc1xuIixtcmVnbmFtZXNbcl0pOworICAgICAgfWVsc2V7CisJZW1pdChmLCJcdCVzdHN0LiVjXHQiLGZwLHhfdFt0Jk5RXSk7ZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJZW1pdChmLCJcbiIpOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PUFTU0lHTnx8Yz09UFVTSCl7CisgICAgICBpZihjPT1BU1NJR04mJmNvbXBhcmVfb2JqZWN0cygmcC0+cTEsJnAtPnopKSBjY19zZXQ9MDsKKyAgICAgIGlmKGM9PVBVU0gpIGRvbnRwb3ArPXptMmwocC0+cTIudmFsLnZtYXgpOworICAgICAgYXNzaWduKGYscCwmcC0+cTEsJnAtPnosYyx6bTJsKHAtPnEyLnZhbC52bWF4KSx0KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1BRERSRVNTKXsKKyAgICAgIGludCB6cmVnOworICAgICAgaWYoaXNyZWcoeikmJnAtPnoucmVnPj0xJiZwLT56LnJlZzw9OCkKKwl6cmVnPXAtPnoucmVnOyBlbHNlIHpyZWc9Z2V0X3JlZyhmLDAscCwwKTsKKyAgICAgIGVtaXQoZiwiXHRsZWFcdCIpO2VtaXRfb2JqKGYsJnAtPnExLHQpOworICAgICAgZW1pdChmLCIsJXNcbiIsbXJlZ25hbWVzW3pyZWddKTsKKyAgICAgIGlmKCFpc3JlZyh6KXx8cC0+ei5yZWchPXpyZWcpeworCW1vdmUoZiwwLHpyZWcsJnAtPnosMCxQT0lOVEVSKTsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1DT01QQVJFKXsKKyAgICAgIGludCB6cmVnOworICAgICAgY29tcHR5cD10OworICAgICAgaWYoaXNjb25zdChxMSl8fGlzcmVnKHEyKSl7CisJLyogIGV2dGwuIEFyZ3VtZW50ZSB2b24gY21wIHVuZCBuYWNoZm9sZ2VuZGVzIGJjYyB1bWRyZWhlbiAgKi8KKwlJQyAqbjtvYmogbTsKKwluPXAtPm5leHQ7CisJd2hpbGUobil7CisJICBpZihuLT5jb2RlPj1CRVEmJm4tPmNvZGU8QlJBKXsKKwkgICAgaWYoIXAtPnouZmxhZ3MpeworCSAgICAgIGlmKERFQlVHJjEpIHByaW50ZigiYXJndW1lbnRzIG9mIGNtcCBleGNoYW5nZWRcbiIpOworCSAgICAgIG09cC0+cTE7cC0+cTE9cC0+cTI7cC0+cTI9bTsKKwkgICAgICBwLT56LmZsYWdzPTE7CisJICAgIH0KKwkgICAgLyogIG5hY2hmb2xnZW5kZW4gQnJhbmNoIHVtZHJlaGVuICAgKi8KKwkgICAgc3dpdGNoKG4tPmNvZGUpeworCSAgICBjYXNlIEJHVDogbi0+Y29kZT1CTFQ7YnJlYWs7CisJICAgIGNhc2UgQkxUOiBuLT5jb2RlPUJHVDticmVhazsKKwkgICAgY2FzZSBCR0U6IG4tPmNvZGU9QkxFO2JyZWFrOworCSAgICBjYXNlIEJMRTogbi0+Y29kZT1CR0U7YnJlYWs7CisJICAgIH0KKwkgICAgYnJlYWs7CisJICB9CisJICBpZihuLT5jb2RlPT1GUkVFUkVHKSBuPW4tPm5leHQ7IGVsc2UgYnJlYWs7IC8qICBjb21wYXJlIG9obmUgYnJhbmNoID0+IGxlZXJlciBCbG9jayBvLmFlLiAgICovCisJfQorICAgICAgfQorICAgICAgaWYoSVNGTE9BVCh0KSl7CisJaWYoRlBVPjY4MDAwKXsKKwkgIGlmKGlzcmVnKHExKSYmcC0+cTEucmVnPj1mcDApeworCSAgICB6cmVnPXAtPnExLnJlZzsKKwkgIH1lbHNleworCSAgICB6cmVnPWdldF9yZWcoZiwyLHAsMCk7CisJICAgIG1vdmUoZiwmcC0+cTEsMCwwLHpyZWcsdCk7CisJICB9CisJICBpZihpc3JlZyhxMikpe2VtaXQoZiwiXHRmY21wLnhcdCVzLCVzXG4iLG1yZWduYW1lc1twLT5xMi5yZWddLG1yZWduYW1lc1t6cmVnXSk7Y29udGludWU7fQorCSAgZW1pdChmLCJcdGZjbXAuJWNcdCIseF90W3QmTlFdKTtlbWl0X29iaihmLCZwLT5xMix0KTsKKwkgIGVtaXQoZiwiLCVzXG4iLG1yZWduYW1lc1t6cmVnXSk7CisJICBjb250aW51ZTsKKwl9ZWxzZXsKKwkgIC8qICBuaWNodCBzZWhyIHNjaG9lbiAgICovCisJICBpbnQgcmVzdWx0PWdldF9yZWcoZiwxLHAsMCk7CisJICBpZighT0xEX1NPRlRGTE9BVCkgaWVycm9yKDApOworCSAgc2F2ZXJlZ3MoZixwKTsKKwkgIGFzc2lnbihmLHAsJnAtPnEyLDAsUFVTSCxtc2l6ZXRhYlt0Jk5RXSx0KTsKKwkgIGFzc2lnbihmLHAsJnAtPnExLDAsUFVTSCxtc2l6ZXRhYlt0Jk5RXSx0KTsKKwkgIHNjcmF0Y2hfbW9kaWZpZWQoKTsKKwkgIGlmKEdBUyl7CisJICAgIGVtaXQoZiwiXHQuZ2xvYmFsXHRfX2llZWVjbXAlY1xuXHRqYnNyXHRfX2llZWVjbXAlY1xuXHRhZGQuJXNcdCMlbGQsJXNcbiIseF90W3QmTlFdLHhfdFt0Jk5RXSxzdHJzaG9ydFsxXSwyKm1zaXpldGFiW3QmTlFdLG1yZWduYW1lc1tzcF0pOworCSAgfWVsc2V7CisJICAgIGVtaXQoZiwiXHRwdWJsaWNcdF9faWVlZWNtcCVjXG5cdGpzclx0X19pZWVlY21wJWNcblx0YWRkLiVzXHQjJWxkLCVzXG4iLHhfdFt0Jk5RXSx4X3RbdCZOUV0sc3Ryc2hvcnRbMV0sMiptc2l6ZXRhYlt0Jk5RXSxtcmVnbmFtZXNbc3BdKTsKKwkgIH0KKwkgIHBvcCgyKm1zaXpldGFiW3QmTlFdKTsKKwkgIHJlc3RvcmVyZWdzYShmLHApOworCSAgaWYocmVzdWx0IT1kMCkgZW1pdChmLCJcdG1vdmUubFx0JXMsJXNcbiIsbXJlZ25hbWVzW2QwXSxtcmVnbmFtZXNbcmVzdWx0XSk7CisJICBlbWl0KGYsIlx0dHN0LmxcdCVzXG4iLG1yZWduYW1lc1tyZXN1bHRdKTsKKwkgIHJlc3RvcmVyZWdzZChmLHApOworCSAgY29udGludWU7CisJfQorICAgICAgfQorICAgICAgaWYoY2YmJnhfdFt0Jk5RXSE9J2wnKXsKKwlpZihpc3JlZyhxMSkpIHpyZWc9cC0+cTEucmVnOyBlbHNlIHpyZWc9Z2V0X3JlZyhmLDEscCwwKTsKKwlsb2FkZXh0KGYsenJlZywmcC0+cTEsdCk7CisJaWYoaXNjb25zdChxMikpeworCSAgZW1pdChmLCJcdGNtcC5sXHQiKTsKKwkgIGVtaXRfb2JqKGYsJnAtPnEyLHQpOworCX1lbHNleworCSAgaW50IHI7CisJICBpZihpc3JlZyhxMikpIHI9cC0+cTIucmVnOyBlbHNlIHI9Z2V0X3JlZyhmLDEscCwwKTsKKwkgIGxvYWRleHQoZixyLCZwLT5xMix0KTsKKwkgIGVtaXQoZiwiXHRjbXAubFx0JXMiLG1yZWduYW1lc1tyXSk7CisJfQorCWVtaXQoZiwiLCVzXG4iLG1yZWduYW1lc1t6cmVnXSk7CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZigocC0+cTIuZmxhZ3MmKEtPTlNUfFZBUkFEUikpJiYhKHAtPnExLmZsYWdzJihLT05TVHxWQVJBRFIpKSYmKCFjZnx8aXNyZWcocTEpKSl7CisJZW1pdChmLCJcdGNtcC4lY1x0Iix4X3RbdCZOUV0pO2VtaXRfb2JqKGYsJnAtPnEyLHQpOworCWVtaXQoZiwiLCIpO2VtaXRfb2JqKGYsJnAtPnExLHQpO2VtaXQoZiwiXG4iKTsKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKGlzcmVnKHExKSl7CisJenJlZz1wLT5xMS5yZWc7CisgICAgICB9ZWxzZXsKKwl6cmVnPWdldF9yZWcoZiwxLHAsMSk7ICAgIC8qIGhpZXIgZXZ0bC4gYXVjaCBBZHJlc3NyZWdpc3RlciBuZWhtZW4gKi8KKwltb3ZlKGYsJnAtPnExLDAsMCx6cmVnLHQpOworICAgICAgfQorICAgICAgZW1pdChmLCJcdGNtcC4lY1x0Iix4X3RbdCZOUV0pO2VtaXRfb2JqKGYsJnAtPnEyLHQpOworICAgICAgZW1pdChmLCIsJXNcbiIsbXJlZ25hbWVzW3pyZWddKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1BRERJMlB8fGM9PVNVQklGUCl7CisgICAgICBpbnQgenJlZz0tMSxyOworCisgICAgICAvKiAgaGllciBkaWUgendlaXRlIEFsdGVybmF0aXZlIG1pdCBpc3JlZygpIHNjaHJlaWJlbj8gICovCisgICAgICBpZigoKChwLT5xMi5mbGFncyZSRUcpJiYocC0+ei5mbGFncyZSRUcpJiZwLT5xMi5yZWc9PXAtPnoucmVnJiYoIShwLT5xMS5mbGFncyZSRUcpfHxwLT5xMS5yZWchPXAtPnoucmVnKSl8fAorCSAoY29tcGFyZV9vYmplY3RzKCZwLT5xMiwmcC0+eikmJiFjb21wYXJlX29iamVjdHMoJnAtPnExLCZwLT56KSkpKXsKKwlvYmogbTsKKwlpZihjPT1BRERJMlAmJnhfdFt0Jk5RXT09J2wnKXsKKwkgIG09cC0+cTE7cC0+cTE9cC0+cTI7cC0+cTI9bTsKKwl9ZWxzZXsKKwkgIGlmKCFjZiYmeF90W3QmTlFdPT0nbCcmJmlzcmVnKHEyKSYmcC0+cTIucmVnPj1kMCYmcC0+cTIucmVnPD1kNyl7CisJICAgIG09cC0+cTE7cC0+cTE9cC0+cTI7cC0+cTI9bTsKKwkgICAgYz1BRERJMlA7CisJICAgIGVtaXQoZiwiXHRuZWcuJWNcdCIseF90W3QmTlFdKTsKKwkgICAgZW1pdF9vYmooZiwmcC0+cTEsdCk7ZW1pdChmLCJcbiIpOworCSAgfWVsc2V7CisJICAgIHpyZWc9Z2V0X3JlZyhmLDAscCwwKTsKKwkgIH0KKwl9CisgICAgICB9CisKKyAgICAgIGlmKGlzcmVnKHExKSYmcC0+cTEucmVnPD04JiZpc3JlZyh6KSYmcC0+ei5yZWc8PTgmJnAtPnExLnJlZyE9cC0+ei5yZWcpeworCS8qICBxMSB1bmQgeiBBZHJlc3NyZWdpc3RlciA9PiBsZWEgbmVobWVuICAgKi8KKwlpZihpc2NvbnN0KHEyKSl7CisJICBldmFsX2NvbnN0KCZwLT5xMi52YWwsdCk7CisJICBpZihjPT1TVUJJRlApIHZtYXg9em1zdWIobDJ6bSgwTCksdm1heCk7CisJICBpZihDUFU+PTY4MDIwfHwoem1sZXEodm1heCxsMnptKDMyNzY3KSkmJnptbGVxKGwyem0oLTMyNzY4KSx2bWF4KSkpeworCSAgICBlbWl0KGYsIlx0bGVhXHQoJWxkIix6bTJsKHZtYXgpKTsKKwkgICAgaWYoIUdBUyYmem0ybCh2bWF4KT4weDdmZmYpCisJICAgICAgZW1pdChmLCIubCIpOworCSAgICBlbWl0KGYsIiwlcyksJXNcbiIsbXJlZ25hbWVzW3AtPnExLnJlZ10sbXJlZ25hbWVzW3AtPnoucmVnXSk7CisJICAgIGNvbnRpbnVlOworCSAgfQorCX1lbHNlIGlmKGM9PUFEREkyUCYmaXNyZWcocTIpKXsKKwkgIGVtaXQoZiwiXHRsZWFcdCglcywlcy4lYyksJXNcbiIsbXJlZ25hbWVzW3AtPnExLnJlZ10sbXJlZ25hbWVzW3AtPnEyLnJlZ10seF90W3QmTlFdLG1yZWduYW1lc1twLT56LnJlZ10pOworCSAgY29udGludWU7CisJfQorICAgICAgfQorICAgICAgaWYoY29tcGFyZV9vYmplY3RzKCZwLT5xMSwmcC0+eikpeworCWlmKGlzY29uc3QocTIpJiYoIWNmfHxpc3F1aWNra29uc3QyKCZwLT5xMi52YWwsdCkpKXsKKwkgIGlmKGM9PUFEREkyUCkKKwkgICAgZW1pdChmLCJcdGFkZCVzLmxcdCIscXVpY2tbaXNxdWlja2tvbnN0MigmcC0+cTIudmFsLHQpXSk7CisJICBlbHNlCisJICAgIGVtaXQoZiwiXHRzdWIlcy5sXHQiLHF1aWNrW2lzcXVpY2trb25zdDIoJnAtPnEyLnZhbCx0KV0pOworCSAgZW1pdF9vYmooZiwmcC0+cTIsdCk7ZW1pdChmLCIsIik7CisJICBlbWl0X29iaihmLCZwLT56LFBPSU5URVIpO2VtaXQoZiwiXG4iKTsKKwkgIGNvbnRpbnVlOworCX0KKwlpZihpc3JlZyhxMSkmJih4X3RbdCZOUV09PSdsJ3x8cC0+cTEucmVnPD04KSl7CisJICBpZihjPT1BRERJMlApCisJICAgIGVtaXQoZiwiXHRhZGQuJWNcdCIseF90W3QmTlFdKTsKKwkgIGVsc2UKKwkgICAgZW1pdChmLCJcdHN1Yi4lY1x0Iix4X3RbdCZOUV0pOworCSAgZW1pdF9vYmooZiwmcC0+cTIsdCk7ZW1pdChmLCIsJXNcbiIsbXJlZ25hbWVzW3AtPnoucmVnXSk7CisJICBjb250aW51ZTsKKwl9CisJaWYoaXNyZWcocTIpJiZwLT5xMi5yZWc+PTkmJnAtPnEyLnJlZzw9MTYpeworCSAgcj1wLT5xMi5yZWc7CisJfWVsc2V7CisJICByPWdldF9yZWcoZiwxLHAsMCk7CisJICBtb3ZlKGYsJnAtPnEyLDAsMCxyLHQpOworCX0KKwlpZih4X3RbdCZOUV0hPSdsJyYmKCFpc3JlZyh6KXx8cC0+ei5yZWc8MXx8cC0+ei5yZWc+OCkpeworCSAgLyogIHdlbm4gWmllbCBrZWluIEFkcmVzc3JlZ2lzdGVyLCBtdXNzIHNob3J0IGVyc3QgYXVmIGxvbmcgKi8KKwkgIC8qICBjaGFyIGRhcmYgaGllciBuaWNodCBhdWZ0cmV0ZXRlbiB1bmQgbG9uZyBwYXNzdCBzY2hvbiAgICovCisJICBpZih0JlVOU0lHTkVEKXsKKwkgICAgaWYoQ1BVPj02ODA0MCkKKwkgICAgICBlbWl0KGYsIlx0YW5kLmxcdCM2NTUzNSwlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICBlbHNlCisJICAgICAgZW1pdChmLCJcdHN3YXBcdCVzXG5cdGNsci53XHQlc1xuXHRzd2FwXHQlc1xuIixtcmVnbmFtZXNbcl0sbXJlZ25hbWVzW3JdLG1yZWduYW1lc1tyXSk7CisJICB9ZWxzZSAKKwkgICAgZW1pdChmLCJcdGV4dC5sXHQlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgdD1QT0lOVEVSOworCX0KKwkvKiAgICAgICAgICAgICAgICBpZihjPT1BRERJMlApCisJCQkgIGVtaXQoZiwiXHRhZGQuJWNcdCVzLCIseF90W3QmTlFdLG1yZWduYW1lc1tyXSk7CisJCQkgIGVsc2UKKwkJCSAgZW1pdChmLCJcdHN1Yi4lY1x0JXMsIix4X3RbdCZOUV0sbXJlZ25hbWVzW3JdKTsKKwkJCSAgZW1pdF9vYmooZiwmcC0+eix0KTtlbWl0KGYsIlxuIik7Ki8KKwlpZihjPT1BRERJMlApIAorCSAgYWRkKGYsMCxyLCZwLT56LDAsdCk7CisJZWxzZQorCSAgc3ViKGYsMCxyLCZwLT56LDAsdCk7CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZihpc3JlZyh6KSYmenJlZz09LTEmJnAtPnoucmVnPj0xJiZwLT56LnJlZzw9ZDcpCisJenJlZz1wLT56LnJlZzsgCisgICAgICBlbHNlIAorCXpyZWc9Z2V0X3JlZyhmLDAscCwwKTsKKyAgICAgIC8qICBTcGV6aWFsZmFsbCwgZmFsbHMgWmllbCBEYXRlbnJlZ2lzdGVyIHVuZCBzaG9ydCAqLworICAgICAgLyogIG5pY2h0IHNjaG9lbiwgYWJlciBhdWYgZGllIFNjaG5lbGxlLi4uICAgICAgICAgICovCisgICAgICBpZih4X3RbdCZOUV0hPSdsJyYmenJlZz44KXsKKwltb3ZlKGYsJnAtPnEyLDAsMCx6cmVnLHQpOworCWlmKHQmVU5TSUdORUQpeworCSAgaWYoQ1BVPj02ODA0MCkKKwkgICAgZW1pdChmLCJcdGFuZC5sXHQjNjU1MzUsJXNcbiIsbXJlZ25hbWVzW3pyZWddKTsKKwkgIGVsc2UKKwkgICAgZW1pdChmLCJcdHN3YXBcdCVzXG5cdGNsci53XHQlc1xuXHRzd2FwXHQlc1xuIixtcmVnbmFtZXNbenJlZ10sbXJlZ25hbWVzW3pyZWddLG1yZWduYW1lc1t6cmVnXSk7CisJfWVsc2UKKwkgIGVtaXQoZiwiXHRleHQubFx0JXNcbiIsbXJlZ25hbWVzW3pyZWddKTsKKwlpZihjPT1TVUJJRlApIGVtaXQoZiwiXHRuZWcubFx0JXNcbiIsbXJlZ25hbWVzW3pyZWddKTsKKwlhZGQoZiwmcC0+cTEsMCwwLHpyZWcsUE9JTlRFUik7CisJaWYoIWlzcmVnKHopfHxwLT56LnJlZyE9enJlZykKKwkgIG1vdmUoZiwwLHpyZWcsJnAtPnosMCxQT0lOVEVSKTsKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKCFpc3JlZyhxMSl8fHAtPnExLnJlZyE9enJlZyl7CisJbW92ZShmLCZwLT5xMSwwLDAsenJlZyxQT0lOVEVSKTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PUFEREkyUCkKKwlhZGQoZiwmcC0+cTIsMCwwLHpyZWcsdCk7CisgICAgICBlbHNlIAorCXN1YihmLCZwLT5xMiwwLDAsenJlZyx0KTsKKyAgICAgIGlmKCFpc3JlZyh6KXx8cC0+ei5yZWchPXpyZWcpeworCW1vdmUoZiwwLHpyZWcsJnAtPnosMCxQT0lOVEVSKTsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZigoYz49T1ImJmM8PUFORCl8fGM9PU1VTFR8fGM9PUFERCl7CisgICAgICBpZighaXNyZWcocTEpJiYhaXNyZWcoeikmJmlzcmVnKHEyKSl7CisJb2JqIG87CisJbz1wLT5xMTtwLT5xMT1wLT5xMjtwLT5xMj1vOworICAgICAgfQorICAgIH0KKyAgICBzd2l0Y2hfSUMocCk7CisgICAgaWYoKGM+PU9SJiZjPD1BTkQpfHwoYz49TFNISUZUJiZjPD1NT0QpKXsKKyAgICAgIGludCB6cmVnLHExcmVnLHEycmVnOworICAgICAgaWYoaXNjb25zdChxMikmJgorCSAoIShwLT5xMS5mbGFncyZSRUcpfHwhKHAtPnouZmxhZ3MmUkVHKXx8cC0+cTEucmVnIT1wLT56LnJlZykmJgorCSAoIShwLT5xMS5mbGFncyZWQVIpfHwhKHAtPnouZmxhZ3MmVkFSKXx8cC0+cTEudiE9cC0+ei52KSYmCisJICgoYz49T1ImJmM8PUFORCl8fGM9PUFERHx8Yz09TVVMVCkpeworCW9iaiBvOworCWlmKGM9PU1VTFQpeworCSAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHQpOworCSAgaWYoem1sZXEobDJ6bSgwTCksdm1heCkmJnp1bWxlcSh1bDJ6dW0oMFVMKSx2dW1heCkmJiFwb2YyKHZ1bWF4KSl7CisJICAgIG89cC0+cTE7cC0+cTE9cC0+cTI7cC0+cTI9bzsKKwkgIH0KKwl9ZWxzZXsKKwkgIGlmKCFjZnx8IUlTSFdPUkQodCkpeworCSAgICBvPXAtPnExO3AtPnExPXAtPnEyO3AtPnEyPW87CisJICB9CisJfQorICAgICAgfQorICAgICAgaWYoSVNGTE9BVCh0KSl7CisJaWYoRlBVPjY4MDAwKXsKKwkgIGlmKGNvbXBhcmVfb2JqZWN0cygmcC0+cTIsJnAtPnopJiYhY29tcGFyZV9vYmplY3RzKCZwLT5xMiwmcC0+cTEpKXsKKwkgICAgb2JqIG07CisJICAgIGlmKGM9PUFERHx8Yz09TVVMVCl7CisJICAgICAgbT1wLT5xMTtwLT5xMT1wLT5xMjtwLT5xMj1tOworCSAgICB9ZWxzZXsKKwkgICAgICBpZihpc3JlZyhxMikpeworCQlpZihjPT1TVUIpeworCQkgIGVtaXQoZiwiXHRmbmVnLnhcdCVzXG4iLG1yZWduYW1lc1twLT5xMi5yZWddKTsKKwkJICBtPXAtPnExO3AtPnExPXAtPnEyO3AtPnEyPW07CisJCSAgcC0+Y29kZT1jPUFERDsKKwkJfWVsc2V7CisJCSAgaW50IHRtcD1nZXRfcmVnKGYsMixwLDApOworCQkgIG1vdmUoZiwmcC0+cTIsMCwwLHRtcCx0KTsKKwkJICBwLT5xMi5yZWc9dG1wOworCQkgIHAtPnEyLmZsYWdzPVJFRzsKKwkJfQorCSAgICAgIH0KKwkgICAgfQorCSAgfQorCSAgaWYoaXNyZWcoeikmJnAtPnoucmVnPj1mcDApCisJICAgIHpyZWc9cC0+ei5yZWc7CisJICBlbHNlIAorCSAgICB6cmVnPWdldF9yZWcoZiwyLHAsMSk7CisJICBpZighaXNyZWcocTEpfHxwLT5xMS5yZWchPXAtPnoucmVnKQorCSAgICBtb3ZlKGYsJnAtPnExLDAsMCx6cmVnLHQpOworCSAgZW1pdChmLCJcdGYlcy4iLGVuYW1lW2NdKTsKKwkgIGlmKGlzcmVnKHEyKSkKKwkgICAgZW1pdChmLCJ4XHQiKTsKKwkgIGVsc2UKKwkgICAgZW1pdChmLCIlY1x0Iix4X3RbdCZOUV0pOworCSAgZW1pdF9vYmooZiwmcC0+cTIsdCk7CisJICBlbWl0KGYsIiwlc1xuIixtcmVnbmFtZXNbenJlZ10pOworCSAgaWYoIWlzcmVnKHopfHxwLT56LnJlZyE9enJlZyl7CisJICAgIG1vdmUoZiwwLHpyZWcsJnAtPnosMCx0KTsKKwkgIH0KKwkgIGNvbnRpbnVlOworCX1lbHNleworCSAgaWYoIU9MRF9TT0ZURkxPQVQpIGllcnJvcigwKTsKKwkgIHNhdmVyZWdzKGYscCk7CisJICBhc3NpZ24oZixwLCZwLT5xMiwwLFBVU0gsbXNpemV0YWJbdCZOUV0sdCk7CisJICBhc3NpZ24oZixwLCZwLT5xMSwwLFBVU0gsbXNpemV0YWJbdCZOUV0sdCk7CisJICBzY3JhdGNoX21vZGlmaWVkKCk7CisJICBpZihHQVMpeworCSAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0X19pZWVlJXMlY1xuXHRqYnNyXHRfX2llZWUlcyVjXG5cdGFkZC4lc1x0IyVsZCwlc1xuIixlbmFtZVtjXSx4X3RbdCZOUV0sZW5hbWVbY10seF90W3QmTlFdLHN0cnNob3J0WzFdLDIqbXNpemV0YWJbdCZOUV0sbXJlZ25hbWVzW3NwXSk7CisJICB9ZWxzZXsKKwkgICAgZW1pdChmLCJcdHB1YmxpY1x0X19pZWVlJXMlY1xuXHRqc3JcdF9faWVlZSVzJWNcblx0YWRkLiVzXHQjJWxkLCVzXG4iLGVuYW1lW2NdLHhfdFt0Jk5RXSxlbmFtZVtjXSx4X3RbdCZOUV0sc3Ryc2hvcnRbMV0sMiptc2l6ZXRhYlt0Jk5RXSxtcmVnbmFtZXNbc3BdKTsKKwkgIH0KKwkgIHBvcCgyKm1zaXpldGFiW3QmTlFdKTsKKwkgIHJlc3RvcmVyZWdzYShmLHApOworCSAgaWYoKHQmTlEpPT1ET1VCTEV8fCh0Jk5RKT09TERPVUJMRSkKKwkgICAgc3RvcmVkMGQxKGYsJnAtPnosdCk7CisJICBlbHNlCisJICAgIG1vdmUoZiwwLGQwLCZwLT56LDAsdCk7CisJICByZXN0b3JlcmVnc2QoZixwKTsKKwkgIGNvbnRpbnVlOworCX0KKyAgICAgIH0KKyAgICAgIGlmKCgoYz09TVVMVHx8Yz09RElWKXx8KGM9PU1PRCYmKHAtPnR5cGYmVU5TSUdORUQpKSkmJmlzY29uc3QocTIpKXsKKwkvKiAgZXJzZXR6dCBtdWwgZXRjLiBtaXQgWndlaWVycG90ZW56ZW4gICAgICovCisJLyogIGhpZXIgZXZ0bC4gbm9jaCBGZWhsZXIgICAgICAgICAgICAgICAgICAqLworCWxvbmcgbG47CisJZXZhbF9jb25zdCgmcC0+cTIudmFsLHQpOworCWlmKHptbGVxKGwyem0oMEwpLHZtYXgpJiZ6dW1sZXEodWwyenVtKDBVTCksdnVtYXgpKXsKKwkgIGlmKGxuPXBvZjIodnVtYXgpKXsKKwkgICAgaWYoYz09TU9EKXsKKwkgICAgICB2bWF4PXptc3ViKHZtYXgsbDJ6bSgxTCkpOworCSAgICAgIHAtPmNvZGU9QU5EOworCSAgICB9ZWxzZXsKKwkgICAgICB2bWF4PWwyem0obG4tMSk7CisJICAgICAgaWYoYz09RElWKXsKKwkJcC0+Y29kZT1SU0hJRlQ7CisJCXNoaWZ0aXNkaXY9MTsKKwkgICAgICB9ZWxzZQorCQlwLT5jb2RlPUxTSElGVDsKKwkgICAgfQorCSAgICBjPXAtPmNvZGU7CisJICAgIGd2YWwudm1heD12bWF4OworCSAgICBldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CisJICAgIGlmKGM9PUFORCl7CisJICAgICAgaW5zZXJ0X2NvbnN0KCZwLT5xMi52YWwsdCk7CisJICAgIH1lbHNleworCSAgICAgIGluc2VydF9jb25zdCgmcC0+cTIudmFsLElOVCk7CisJICAgICAgcC0+dHlwZjI9SU5UOworCSAgICB9CisJICB9CisJfQorICAgICAgfQorICAgICAgaWYoYz09RElWfHxjPT1NT0QpeworCWlmKHhfdFt0Jk5RXT09J2wnJiZDUFU8NjgwMjApeworCSAgLyogIGRhcyBoaWVyIGlzdCBhdWNoIG5pY2h0IGFsbHp1IHNjaG9lbiAgKi8KKwkgIGNoYXIgKmZuYW1lOworCSAgY2Nfc2V0PTA7ICAgLyogIExpYnJhcnktRnVua3Rpb25lbiBzZXR6ZW4gY2MgbmljaHQgaW1tZXIgKi8KKwkgIHNhdmVyZWdzKGYscCk7CisJICBlbWl0KGYsIlx0bW92ZS5sXHQiKTsgZW1pdF9vYmooZiwmcC0+cTIsdCk7CisJICBlbWl0KGYsIiwtKCVzKVxuIixtcmVnbmFtZXNbc3BdKTsKKwkgIHB1c2goNCk7CisJICBlbWl0KGYsIlx0bW92ZS5sXHQiKTsgZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJICBlbWl0KGYsIiwtKCVzKVxuIixtcmVnbmFtZXNbc3BdKTsKKwkgIHB1c2goNCk7CisJICBpZih0JlVOU0lHTkVEKSBmbmFtZT0iZGl2dSI7IGVsc2UgZm5hbWU9ImRpdnMiOworCSAgc2NyYXRjaF9tb2RpZmllZCgpOworCSAgaWYoR0FTKXsKKwkgICAgZW1pdChmLCJcdC5nbG9iYWxcdF9fbCVzXG5cdGpic3JcdF9fbCVzXG4iLGZuYW1lLGZuYW1lKTsKKwkgIH1lbHNleworCSAgICBlbWl0KGYsIlx0cHVibGljXHRfX2wlc1xuXHRqc3JcdF9fbCVzXG4iLGZuYW1lLGZuYW1lKTsKKwkgIH0KKwkgIGVtaXQoZiwiXHRhZGRxLiVzXHQjOCwlc1xuIixzdHJzaG9ydFsxXSxtcmVnbmFtZXNbc3BdKTsKKwkgIGlmKGM9PU1PRCkgZW1pdChmLCJcdG1vdmUubFx0ZDEsZDBcbiIpOworCSAgcG9wKDgpOworCSAgcmVzdG9yZXJlZ3NhKGYscCk7CisJICBtb3ZlKGYsMCxkMCwmcC0+eiwwLHQpOworCSAgcmVzdG9yZXJlZ3NkKGYscCk7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIH0KKyAgICAgIC8qICBoaWVyIGRpZSB6d2VpdGUgQWx0ZXJuYXRpdmUgbWl0IGlzcmVnKCkgc2NocmVpYmVuPyAgKi8KKyAgICAgIGlmKGNvbXBhcmVfb2JqZWN0cygmcC0+cTIsJnAtPnopJiYhY29tcGFyZV9vYmplY3RzKCZwLT5xMiwmcC0+cTEpKXsKKwlvYmogbTsKKwlpZigoYz49T1ImJmM8PUFORCl8fGM9PUFERHx8Yz09U1VCKXsKKwkgIGlmKGMhPVNVQil7CisJICAgIG09cC0+cTE7cC0+cTE9cC0+cTI7cC0+cTI9bTsKKwkgIH1lbHNleworCSAgICBpZihpc3JlZyhxMikmJnAtPnEyLnJlZz49ZDAmJnAtPnEyLnJlZzw9ZDcpeworCSAgICAgIG09cC0+cTE7cC0+cTE9cC0+cTI7cC0+cTI9bTsKKwkgICAgICBjPUFERDsKKwkgICAgICBlbWl0KGYsIlx0bmVnLiVjXHQiLHhfdFt0Jk5RXSk7CisJICAgICAgZW1pdF9vYmooZiwmcC0+cTEsdCk7ZW1pdChmLCJcbiIpOworCSAgICB9CisJICB9CisJfQorICAgICAgfQorICAgICAgaWYoY29tcGFyZV9vYmplY3RzKCZwLT5xMSwmcC0+eikpeworCWlmKChjPj1PUiYmYzw9QU5EKXx8Yz09QUREfHxjPT1TVUIpeworCSAgaW50IHI7CisJICBpZihpc2NvbnN0KHEyKSYmKCFjZnx8aXNyZWcoeil8fCgoYz09QUREfHxjPT1TVUIpJiZpc3F1aWNra29uc3QyKCZwLT5xMi52YWwsdCZOUSkpKSl7CisJICAgIGlmKGNmJiYoKHQmTlEpPT1DSEFSfHxJU0hXT1JEKHQpKSl7CisJICAgICAgaWYoaXNyZWcocTEpKSByPXAtPnExLnJlZzsgZWxzZSByPWdldF9yZWcoZiwxLHAsMSk7CisJICAgICAgbG9hZGV4dChmLHIsJnAtPnExLHQpOworCSAgICAgIGVtaXQoZiwiXHQlcy5sXHQiLGVuYW1lW2NdKTsKKwkgICAgICBlbWl0X29iaihmLCZwLT5xMix0KTsKKwkgICAgICBlbWl0KGYsIiwlc1xuIixtcmVnbmFtZXNbcl0pOworCSAgICAgIG1vdmUoZiwwLHIsJnAtPnosMCx0KTsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfWVsc2V7CisJICAgICAgaWYoYz09QUREKSB7YWRkKGYsJnAtPnEyLDAsJnAtPnosMCx0KTtjb250aW51ZTt9CisJICAgICAgaWYoYz09U1VCKSB7c3ViKGYsJnAtPnEyLDAsJnAtPnosMCx0KTtjb250aW51ZTt9CisJICAgICAgZW1pdChmLCJcdCVzLiVjXHQiLGVuYW1lW2NdLHhfdFt0Jk5RXSk7CisJICAgICAgZW1pdF9vYmooZiwmcC0+cTIsdCk7ZW1pdChmLCIsIik7CisJICAgICAgZW1pdF9vYmooZiwmcC0+eix0KTtlbWl0KGYsIlxuIik7CisJICAgIH0KKwkgICAgY29udGludWU7CisJICB9CisJICBpZighaXNyZWcoeikmJighY2Z8fHhfdFt0Jk5RXT09J2wnKSl7CisJICAgIGlmKGlzcmVnKHEyKSYmcC0+cTIucmVnPj1kMCYmcC0+cTIucmVnPD1kNykKKwkgICAgICByPXAtPnEyLnJlZzsgZWxzZSByPWdldF9yZWcoZiwxLHAsMCk7CisJICAgIGlmKCFpc3JlZyhxMil8fHAtPnEyLnJlZyE9cil7CisJICAgICAgbW92ZShmLCZwLT5xMiwwLDAscix0KTsKKwkgICAgfQorCSAgICBlbWl0KGYsIlx0JXMuJWNcdCVzLCIsZW5hbWVbY10seF90W3QmTlFdLG1yZWduYW1lc1tyXSk7CisJICAgIGVtaXRfb2JqKGYsJnAtPnosdCk7ZW1pdChmLCJcbiIpOworCSAgICBjb250aW51ZTsKKwkgIH0KKwl9CisgICAgICB9CisgICAgICAvKiAgYmVpIHhvciBvZGVyIGFzbCAoYXVzc2VyIDA8PWNvbnN0PD04KSBtdXNzIHEyIGluIFJlZ2lzdGVyICAgKi8KKyAgICAgIGlmKGlzcmVnKHEyKSYmcC0+cTIucmVnPj1kMCYmcC0+cTIucmVnPD1kNyl7CisJcTJyZWc9cC0+cTIucmVnOworICAgICAgfWVsc2V7CisJaWYoYz09TFNISUZUfHxjPT1SU0hJRlR8fGM9PVhPUil7CisJICBpbnQgdDI9cTJ0eXAocCkmTlU7CisJICBldmFsX2NvbnN0KCZwLT5xMi52YWwsdDIpOworCSAgaWYoYz09WE9SfHwhaXNjb25zdChxMil8fCFpc3F1aWNra29uc3QyKCZwLT5xMi52YWwsdDIpKXsKKwkgICAgaWYoKGM9PUxTSElGVHx8Yz09UlNISUZUKSYmKHAtPnR5cGYyJk5RKT09TExPTkcpeworCSAgICAgIGlmKCFpc3JlZyhxMikpeworCQlxMnJlZz1nZXRfcmVnKGYsMSxwLDApOworCQllbWl0KGYsIlx0bW92ZS5sXHQiKTsKKwkJZW1pdF9sd29yZChmLCZwLT5xMik7CisJCWVtaXQoZiwiLCVzXG4iLG1yZWduYW1lc1txMnJlZ10pOworCSAgICAgIH1lbHNleworCQlpZighcmVnX3BhaXIocC0+cTIucmVnLCZycCkpIGllcnJvcigwKTsKKwkJcTJyZWc9cnAucjI7CisJICAgICAgfQorCSAgICB9ZWxzZXsKKwkgICAgICBxMnJlZz1nZXRfcmVnKGYsMSxwLDApOworCSAgICAgIG1vdmUoZiwmcC0+cTIsMCwwLHEycmVnLHQyKTsKKwkgICAgfQorCSAgfWVsc2UgcTJyZWc9MDsKKwl9ZWxzZXsKKwkgIHEycmVnPTA7CisJfQorICAgICAgfQorICAgICAgaWYoYz09TU9EJiYhSVNIV09SRCh0KSl7CisJaW50IG1vZHJlZzsKKwlpZihpc3JlZyh6KSYmcC0+ei5yZWc+PWQwJiZwLT56LnJlZzw9ZDcmJnAtPnoucmVnIT1xMnJlZykKKwkgIHpyZWc9cC0+ei5yZWc7IGVsc2UgenJlZz1nZXRfcmVnKGYsMSxwLDApOworCW1vZHJlZz1nZXRfcmVnKGYsMSxwLDEpOworCWlmKG1vZHJlZz09enJlZykgbW9kcmVnPWdldF9yZWcoZiwxLHAsMCk7CisJbW92ZShmLCZwLT5xMSwwLDAsbW9kcmVnLHQpOworCWlmKDAgLypDUFU9PTY4MDYwKi8peworCSAgLyogIGRpdj9sLmwgd2lyZCBkYSBlbXVsaWVydD8gICAqLworCSAgZW1pdChmLCJcdHNtaVx0JXNcblx0ZXh0Yi5sXHQlc1xuIixtcmVnbmFtZXNbenJlZ10sbXJlZ25hbWVzW3pyZWddKTsKKwkgIGlmKHQmVU5TSUdORUQpIGVtaXQoZiwiXHRkaXZ1LiVjXHQiLHhfdFt0Jk5RXSk7IGVsc2UgZW1pdChmLCJcdGRpdnMuJWNcdCIseF90W3QmTlFdKTsKKwl9ZWxzZXsKKwkgIGlmKHQmVU5TSUdORUQpIGVtaXQoZiwiXHRkaXZ1bC4lY1x0Iix4X3RbdCZOUV0pOyBlbHNlIGVtaXQoZiwiXHRkaXZzbC4lY1x0Iix4X3RbdCZOUV0pOworCX0KKwllbWl0X29iaihmLCZwLT5xMix0KTsKKwllbWl0KGYsIiwlczolc1xuIixtcmVnbmFtZXNbenJlZ10sbXJlZ25hbWVzW21vZHJlZ10pOworCW1vdmUoZiwwLHpyZWcsJnAtPnosMCx0KTsKKwljY19zZXQ9MDsKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKGlzcmVnKHopJiZwLT56LnJlZz49ZDAmJnAtPnoucmVnPD1kNyYmKHAtPnoucmVnIT1xMnJlZ3x8KGlzcmVnKHExKSYmcC0+cTEucmVnPT1xMnJlZykpKQorCXpyZWc9cC0+ei5yZWc7IGVsc2UgenJlZz1nZXRfcmVnKGYsMSxwLDEpOworICAgICAgaWYoaXNyZWcocTEpJiZwLT5xMS5yZWc+PWQwJiZwLT5xMS5yZWc8PWQ3KQorCXExcmVnPXAtPnExLnJlZzsgZWxzZSBxMXJlZz0wOworICAgICAgaWYocTFyZWchPXpyZWcpeworCW1vdmUoZiwmcC0+cTEsMCwwLHpyZWcsdCk7CisgICAgICB9CisgICAgICBpZihjIT1NVUxUJiZjIT1ESVYmJmMhPU1PRCYmYyE9QUREJiZjIT1TVUIpeworCWlmKGNmJiZjPT1SU0hJRlQpeworCSAgaWYoY2YmJih0Jk5VKT09Q0hBUikKKwkgICAgZW1pdChmLCJcdGV4dGIubFx0JXNcbiIsbXJlZ25hbWVzW3pyZWddKTsKKwkgIGVsc2UgaWYoY2YmJih0Jk5VKT09U0hPUlQpCisJICAgIGVtaXQoZiwiXHRleHQud1x0JXNcbiIsbXJlZ25hbWVzW3pyZWddKTsKKwkgIGlmKGNmJiYodCZOVSk9PShVTlNJR05FRHxDSEFSKSkKKwkgICAgZW1pdChmLCJcdGFuZC5sXHQjMjU1LCVzXG4iLG1yZWduYW1lc1t6cmVnXSk7CisJICBlbHNlIGlmKGNmJiYodCZOVSk9PShVTlNJR05FRHxTSE9SVCkpCisJICAgIGVtaXQoZiwiXHRhbmQubFx0IzY1NTM1LCVzXG4iLG1yZWduYW1lc1t6cmVnXSk7CisJfQorCWlmKHNoaWZ0aXNkaXYmJiEodCZVTlNJR05FRCkpeworCSAgdW5zaWduZWQgbG9uZyBsOworCSAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHAtPnR5cGYyKTsKKwkgIGw9KDE8PHp1bTJ1bCh2dW1heCkpLTE7CisJICBpZihpc3JlZyhxMSkmJnAtPnExLnJlZz09enJlZykKKwkgICAgZW1pdChmLCJcdHRzdC4lY1x0JXNcbiIseF90W3QmTlFdLG1yZWduYW1lc1t6cmVnXSk7CisJICBlbWl0KGYsIlx0YmdlXHQlcyVkXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgIGVtaXQoZiwiXHRhZGQlcy4lY1x0IyVsZCwlc1xuIiwobDw9Nz8icSI6IiIpLHhfdFt0Jk5RXSxsLG1yZWduYW1lc1t6cmVnXSk7CisJICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJfQorCWlmKGM9PVJTSElGVCYmISh0JlVOU0lHTkVEKSkKKwkgIGVtaXQoZiwiXHRhc3IuJWNcdCIsY2Y/J2wnOnhfdFt0Jk5RXSk7CisJZWxzZQorCSAgZW1pdChmLCJcdCVzLiVjXHQiLGVuYW1lW2NdLGNmPydsJzp4X3RbdCZOUV0pOworCWlmKHEycmVnKQorCSAgZW1pdChmLCIlcyIsbXJlZ25hbWVzW3EycmVnXSk7CisJZWxzZSAKKwkgIGVtaXRfb2JqKGYsJnAtPnEyLHEydHlwKHApKTsKKwllbWl0KGYsIiwlc1xuIixtcmVnbmFtZXNbenJlZ10pOworICAgICAgfWVsc2V7CisJaWYoYz09QUREKSBhZGQoZiwmcC0+cTIscTJyZWcsMCx6cmVnLHQpOworCWlmKGM9PVNVQikgc3ViKGYsJnAtPnEyLHEycmVnLDAsenJlZyx0KTsKKwlpZihjPT1NVUxUfHxjPT1ESVZ8fGM9PU1PRCkgbXVsdChmLCZwLT5xMixxMnJlZywwLHpyZWcsdCxjLHApOworICAgICAgfQorICAgICAgaWYoKCFpc3JlZyh6KXx8cC0+ei5yZWchPXpyZWcpKXsKKwltb3ZlKGYsMCx6cmVnLCZwLT56LDAsdCk7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWVycm9yKDApOworICB9CisgIGlmKG5vdHBvcHBlZCl7CisgICAgZW1pdChmLCJcdGFkZCVzLiVzXHQjJWxkLCVzXG4iLHF1aWNrW25vdHBvcHBlZDw9OF0sc3Ryc2hvcnRbbm90cG9wcGVkPDMyNzY4XSxub3Rwb3BwZWQsbXJlZ25hbWVzW3NwXSk7CisgICAgcG9wKG5vdHBvcHBlZCk7bm90cG9wcGVkPTA7CisgIH0KKyAgZnVuY3Rpb25fYm90dG9tKGYsdix6bTJsKG9mZnNldCkpOworICBpZihkZWJ1Z19pbmZvJiYhSFVOS0RFQlVHKXsKKyAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKyAgICBkd2FyZjJfZnVuY3Rpb24oZix2LGxhYmVsKTsKKyAgICBpZihmKSBzZWN0aW9uPS0xOworICB9CisgIHB1c2hmbGFnPTA7Cit9CisKKy8qRklYTUUqLworaW50IHNob3J0Y3V0KGludCBjb2RlLGludCB0eXApCit7CisgIGlmKCFjZiYmKGNvZGU9PUNPTVBBUkV8fGNvZGU9PUFERHx8Y29kZT09U1VCfHxjb2RlPT1BTkR8fGNvZGU9PU9SfHxjb2RlPT1YT1J8fGNvZGU9PUxTSElGVHx8Y29kZT09UlNISUZUKSkgcmV0dXJuKDEpOworICBpZighY2YmJmNvZGU9PU1VTFQmJih0eXAmTlEpIT1DSEFSKSByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KK3ZvaWQgaW5pdF9kYihGSUxFICpmKQoreworICBpZighSFVOS0RFQlVHKXsKKyAgICBpZihHQVMpCisgICAgICBkd2FyZjJfc2V0dXAoc2l6ZXRhYltQT0lOVEVSXSwiLmJ5dGUiLCIuMmJ5dGUiLCIuNGJ5dGUiLCIuNGJ5dGUiLCJsIiwiXyIsIi5zZWN0aW9uIik7CisgICAgZWxzZQorICAgICAgZHdhcmYyX3NldHVwKHNpemV0YWJbUE9JTlRFUl0sImRjLmIiLCJkYy53IiwiZGMubCIsImRjLmwiLCJsIiwiXyIsInNlY3Rpb24iKTsKKyAgICBkd2FyZjJfcHJpbnRfY29tcF91bml0X2hlYWRlcihmKTsKKyAgfQorfQordm9pZCBjbGVhbnVwX2RiKEZJTEUgKmYpCit7CisgIGlmKCFIVU5LREVCVUcmJmYpeworICAgIGR3YXJmMl9jbGVhbnVwKGYpOworICAgIGlmKGYpIHNlY3Rpb249LTE7CisgIH0KK30KK3ZvaWQgY2xlYW51cF9jZyhGSUxFICpmKQoreworICB0aXRsZShmKTsKKyAgaWYoZiYmc3RhY2tfY2hlY2speworICAgIGlmKEdBUykKKyAgICAgIGVtaXQoZiwiXHQuZ2xvYmFsXHRfX19zdGFja19jaGVja1xuIik7CisgICAgZWxzZQorICAgICAgZW1pdChmLCJcdHB1YmxpY1x0X19fc3RhY2tfY2hlY2tcbiIpOworICB9CisgIC8qcHJpbnRmKCJwdXNoZWQgJWQsIHNhdmVkICVkLCByZW1vdmVkIGFsbG9jcmVnICVkXG4iLG1pc3Npbmcsc2F2ZWRlbWl0LHNhdmVkYWxsb2MpOyovCisgIHJldHVybjsKK30KKworLyogbWFyayBpbnN0cnVjdGlvbnMgd2hpY2ggY2FuIChwcm9iYWJseSkgYmUgaW1wbGVtZW50ZWQgd2l0aCBmYXN0ZXIKKyAgIG1hY2hpbmUtY29kZSB0aGFuIHRoZSBJQyBtaWdoIHN1Z2dlc3QsIGUuZy4gYW4gYWRkaXRpb24gd2hpY2ggY2FuCisgICBiZSBtZXJnZWQgd2l0aCBhIGxvYWQgYnogdXNlIG9mIHRhcmdldCBhZGRyZXNzaW5nLW1vZGVzOworICAgdGhlIG9wdGltaXplciBzaG91bGQgaGVzaXRhdGUgdG8gbW9kaWZ6IHN1Y2ggaW5zdHJ1Y3Rpb25zIGlmIGl0J3Mgbm90CisgICBhIGRlZmluaXRlIHdpbiAqLworCitzdGF0aWMgaW50IGlzX3NpbmdsZV9lZmZfaWMoSUMgKnApCit7CisgIFZhciAqdjsKKyAgaWYocC0+Y29kZSE9QURESTJQJiZwLT5jb2RlIT1TVUJJRlApCisgICAgcmV0dXJuIDA7CisgIGlmKCFpc2NvbnN0KHEyKSl7CisgICAgaWYoQ09OU0VSVkFUSVZFX1NSKXsKKyAgICAgIGlmKChwLT5xMi5mbGFncyYoVkFSfERSRUZPQkopKSE9VkFSKQorCXJldHVybiAwOworICAgICAgaWYocC0+cTIudi0+c3RvcmFnZV9jbGFzcz09U1RBVElDfHxwLT5xMi52LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pCisJcmV0dXJuIDA7CisgICAgfWVsc2UKKyAgICAgIHJldHVybiAwOworICB9CisgIGlmKChwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKSE9VkFSKQorICAgIHJldHVybiAwOworICBpZihwLT5xMS52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUN8fHAtPnExLnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTikKKyAgICByZXR1cm4gMDsKKyAgaWYoKHAtPnouZmxhZ3MmKFZBUnxEUkVGT0JKKSkhPVZBUikKKyAgICByZXR1cm4gMDsKKyAgaWYocC0+ei52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUN8fHAtPnoudi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKQorICAgIHJldHVybiAwOworICB2PXAtPnoudjsKKyAgZm9yKHA9cC0+bmV4dDtwO3A9cC0+bmV4dCl7CisgICAgaW50IGM9cC0+Y29kZTsKKyAgICBpZihjPT1MQUJFTHx8KGM+PUJFUSYmYzw9QlJBKSkKKyAgICAgIHJldHVybiAwOworICAgIGlmKChwLT5xMS5mbGFncyZWQVIpJiZwLT5xMS52PT12KXsKKyAgICAgIGlmKHAtPnExLmZsYWdzJkRSRUZPQkopCisJcmV0dXJuIDE7CisgICAgICBlbHNlCisJcmV0dXJuIDA7CisgICAgfQorICAgIGlmKChwLT5xMi5mbGFncyZWQVIpJiZwLT5xMi52PT12KXsKKyAgICAgIGlmKHAtPnEyLmZsYWdzJkRSRUZPQkopCisJcmV0dXJuIDE7CisgICAgICBlbHNlCisJcmV0dXJuIDA7CisgICAgfQorICAgIGlmKChwLT56LmZsYWdzJlZBUikmJnAtPnoudj09dil7CisgICAgICBpZihwLT56LmZsYWdzJkRSRUZPQkopCisJcmV0dXJuIDE7CisgICAgICBlbHNlCisJcmV0dXJuIDA7CisgICAgfQorICB9Cit9Cit2b2lkIG1hcmtfZWZmX2ljcyh2b2lkKQoreworICBJQyAqcDsKKyAgZm9yKHA9Zmlyc3RfaWM7cDtwPXAtPm5leHQpeworICAgIGlmKGlzX3NpbmdsZV9lZmZfaWMocCkpCisgICAgICBwLT5mbGFnc3w9RUZGX0lDOworICAgIGVsc2UKKyAgICAgIHAtPmZsYWdzJj1+RUZGX0lDOworICB9Cit9CisKK2ludCByZWdfcGFpcihpbnQgcixycGFpciAqcCkKKyAgICAgLyogUmV0dXJucyAwIGlmIHRoZSByZWdpc3RlciBpcyBubyByZWdpc3RlciBwYWlyLiBJZiByICAqLworICAgICAvKiBpcyBhIHJlZ2lzdGVyIHBhaXIgbm9uLXplcm8gd2lsbCBiZSByZXR1cm5lZCBhbmQgdGhlICovCisgICAgIC8qIHN0cnVjdHVyZSBwb2ludGVkIHRvIHAgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgdHdvICAgKi8KKyAgICAgLyogZWxlbWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpZihyPD1mcDcpIHJldHVybiAwOworICBpZihwKXsKKyAgICBzd2l0Y2gocil7CisgICAgY2FzZSBkMGQxOiBwLT5yMT1kMDtwLT5yMj1kMTticmVhazsKKyAgICBjYXNlIGQyZDM6IHAtPnIxPWQyO3AtPnIyPWQzO2JyZWFrOworICAgIGNhc2UgZDRkNTogcC0+cjE9ZDQ7cC0+cjI9ZDU7YnJlYWs7CisgICAgY2FzZSBkNmQ3OiBwLT5yMT1kNjtwLT5yMj1kNzticmVhazsKKyAgICBkZWZhdWx0OiBpZXJyb3IoMCk7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitpbnQgZW1pdF9wZWVwaG9sZSh2b2lkKQoreworICBpbnQgZW50cmllcyxpLHIxLHIyLHIzLHI0OworICBjaGFyICphc21saW5lW0VNSVRfQlVGX0RFUFRIXSxjMSxjMixjMyxjNCxlOworCisgIGlmKE9MRFBFRVBIT0xFKSByZXR1cm4gMDsKKyAgaT1lbWl0X2w7CisgIGlmKGVtaXRfZj09MCkKKyAgICBlbnRyaWVzPWktZW1pdF9mKzE7CisgIGVsc2UKKyAgICBlbnRyaWVzPUVNSVRfQlVGX0RFUFRIOworICBhc21saW5lWzBdPWVtaXRfYnVmZmVyW2ldOworICBpZihlbnRyaWVzPj0yKXsKKyAgICBpLS07CisgICAgaWYoaTwwKSBpPUVNSVRfQlVGX0RFUFRILTE7CisgICAgYXNtbGluZVsxXT1lbWl0X2J1ZmZlcltpXTsKKyAgICBpZihzc2NhbmYoYXNtbGluZVsxXSwiXHRtb3ZlLmxcdChhNykrLCVjJWRcbiVjIiwmYzEsJnIxLCZlKT09MiYmCisgICAgICAgc3NjYW5mKGFzbWxpbmVbMF0sIlx0bW92ZS5sXHQlYyVkLC0oYTclYyIsJmMyLCZyMiwmZSk9PTMmJgorICAgICAgIGMxPT1jMiYmcjE9PXIyJiYoYzE9PSdhJ3x8YzE9PSdkJykmJnIxPj0wJiZyMTw9NyYmZT09JyknKXsKKyAgICAgIHNwcmludGYoYXNtbGluZVsxXSwiXHRtb3ZlLmxcdChhNyksJWMlZFxuIixjMSxyMSk7CisgICAgICByZW1vdmVfYXNtKCk7CisgICAgICBzYXZlZGVtaXQrKzsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZihzc2NhbmYoYXNtbGluZVsxXSwiXHRtb3ZlbS5sXHQoYTcpKywlYyVkXG4lYyIsJmMxLCZyMSwmZSk9PTImJgorICAgICAgIHNzY2FuZihhc21saW5lWzBdLCJcdG1vdmUubFx0JWMlZCwtKGE3JWMiLCZjMiwmcjIsJmUpPT0zJiYKKyAgICAgICBjMT09YzImJnIxPT1yMiYmKGMxPT0nYSd8fGMxPT0nZCcpJiZyMT49MCYmcjE8PTcmJmU9PScpJyl7CisgICAgICBzcHJpbnRmKGFzbWxpbmVbMV0sIlx0bW92ZS5sXHQoYTcpLCVjJWRcbiIsYzEscjEpOworICAgICAgcmVtb3ZlX2FzbSgpOworICAgICAgc2F2ZWRlbWl0Kys7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZihzc2NhbmYoYXNtbGluZVsxXSwiXHRtb3ZlLmxcdCVjJWQsJWMlZFxuJWMiLCZjMSwmcjEsJmMyLCZyMiwmZSk9PTQmJgorICAgICAgIHNzY2FuZihhc21saW5lWzBdLCJcdG1vdmUubFx0JWMlZCwlYyVkXG4lYyIsJmMzLCZyMywmYzQsJnI0LCZlKT09NCYmCisgICAgICAgYzE9PWM0JiZyMT09cjQmJmMyPT1jMyYmcjI9PXIzJiZyMT49MCYmcjE8PTcmJnIyPj0wJiZyMjw9NyYmCisgICAgICAgKGMxPT0nYSd8fGMxPT0nZCcpJiYoYzI9PSdhJ3x8YzI9PSdkJykpeworICAgICAgLyogY3JlYXRlIHRzdCBpbnN0cnVjdGlvbiBpZiBjb25kaXRpb24gY29kZXMgb2YgYWRkcmVzcyByZWdpc3RlciBhcmUgbmVlZGVkICovCisgICAgICBpZihjMT09J2QnJiZjMj09J2EnJiZjY19zZXQhPTAmJihjY19zZXQtPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJmNjX3NldC0+cmVnPT1hMCtyMikKKwlzcHJpbnRmKGFzbWxpbmVbMF0sIlx0dHN0LmxcdCVzXG4iLG1yZWduYW1lc1tkMCtyMV0pOworICAgICAgZWxzZQorCXJlbW92ZV9hc20oKTsKKyAgICAgIHNhdmVkZW1pdCsrOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitjaGFyICp1c2VfbGliY2FsbChpbnQgYyxpbnQgdCxpbnQgdDIpCit7CisgIHN0YXRpYyBjaGFyIGZuYW1lWzMyXTsKKyAgY2hhciAqcmV0PTA7CisgIGludCBmOworCisgIHQmPU5VOworICB0MiY9TlU7CisKKyAgaWYoYz09TFNISUZUJiYoKHQmTlEpPT1MTE9ORykpIHJldHVybiAiX2xzaGludDY0IjsKKyAgaWYoYz09UlNISUZUJiZ0PT1MTE9ORykgcmV0dXJuICJfcnNoc2ludDY0IjsKKyAgaWYoYz09UlNISUZUJiZ0PT0oVU5TSUdORUR8TExPTkcpKSByZXR1cm4gIl9yc2h1aW50NjQiOworCisKKyAgaWYoRlBVPjY4MDAwKXsKKyAgICBpZihjIT1DT05WRVJUKSByZXR1cm4gMDsKKyAgICBpZigoIUlTRkxPQVQodCl8fCh0MiZOUSkhPUxMT05HKSYmCisgICAgICAgKCFJU0ZMT0FUKHQyKXx8KHQmTlEpIT1MTE9ORykpCisgICAgICByZXR1cm4gMDsKKyAgfQorICBpZihPTERfU09GVEZMT0FUKSByZXR1cm4gMDsKKworICBpZih0PT1MRE9VQkxFKSB0PURPVUJMRTsKKyAgaWYodDI9PUxET1VCTEUpIHQyPURPVUJMRTsKKyAgaWYoRkxPQVQ2NCl7CisgICAgaWYodD09RkxPQVQpIHQ9RE9VQkxFOworICAgIGlmKHQyPT1GTE9BVCkgdDI9RE9VQkxFOworICB9CisKKyAgaWYoYz09Q09NUEFSRSl7CisgICAgaWYoSVNGTE9BVCh0KSl7CisgICAgICBzcHJpbnRmKGZuYW1lLCJfaWVlZWNtcCVjIix4X3RbdF0pOworICAgICAgcmV0PWZuYW1lOworICAgIH0KKyAgfWVsc2UgaWYoYz09Q09OVkVSVCl7CisgICAgaWYodDI9PUlOVCkgdDI9KHptMmwoc2l6ZXRhYltJTlRdKT09ND9MT05HOlNIT1JUKTsKKyAgICBpZih0Mj09KFVOU0lHTkVEfElOVCkpIHQyPShzaXpldGFiW0lOVF09PTQ/KFVOU0lHTkVEfExPTkcpOihVTlNJR05FRHxTSE9SVCkpOworICAgIGlmKHQ9PUZMT0FUJiZ0Mj09RE9VQkxFKSByZXR1cm4gIl9pZWVlZDJzIjsKKyAgICBpZih0PT1ET1VCTEUmJnQyPT1GTE9BVCkgcmV0dXJuICJfaWVlZXMyZCI7CisgICAgaWYodD09RE9VQkxFJiZ0Mj09RE9VQkxFKSByZXR1cm4gMDsKKyAgICBpZih0PT1GTE9BVHx8dD09RE9VQkxFKXsKKyAgICAgIGlmKCh0MiZOUSk9PUxMT05HKQorCXNwcmludGYoZm5hbWUsIl8lY2ludDY0dG9mbHQlcyIsKHQyJlVOU0lHTkVEKT8ndSc6J3MnLHQ9PUZMT0FUPyIzMiI6IjY0Iik7CisgICAgICBlbHNlCisJc3ByaW50ZihmbmFtZSwiX2llZWVmbHQlYyVjIiwodDImVU5TSUdORUQpPyd1JzoncycseF90W3RdKTsKKyAgICAgIHJldD1mbmFtZTsKKyAgICB9CisgICAgaWYodDI9PUZMT0FUfHx0Mj09RE9VQkxFKXsKKyAgICAgIGlmKCh0Jk5RKT09TExPTkcpCisJc3ByaW50ZihmbmFtZSwiX2ZsdCVzdG8lY2ludDY0Iix0Mj09RkxPQVQ/IjMyIjoiNjQiLCh0JlVOU0lHTkVEKT8ndSc6J3MnKTsKKyAgICAgIGVsc2UKKwlzcHJpbnRmKGZuYW1lLCJfaWVlZWZpeCVjJWMlYyIseF90W3QyXSwodDImVU5TSUdORUQpPyd1JzoncycseF90W3QmTlFdKTsKKyAgICAgIHJldD1mbmFtZTsKKyAgICB9CisgIH1lbHNlIGlmKElTRkxPQVQodCkpeworICAgIGlmKGM9PU1JTlVTKXsKKyAgICAgIHNwcmludGYoZm5hbWUsIl9pZWVlbmVnJWMiLHhfdFt0Jk5RXSk7CisgICAgICByZXQ9Zm5hbWU7CisgICAgfWVsc2UgaWYoYz49QUREJiZjPD1ESVYpeworICAgICAgc3ByaW50ZihmbmFtZSwiX2llZWUlcyVjIixlbmFtZVtjXSx4X3RbdCZOUV0pOworICAgICAgcmV0PWZuYW1lOworICAgIH0KKyAgICBpZihjPT1URVNUKXsKKyAgICAgIHNwcmludGYoZm5hbWUsIl9pZWVldHN0JWMiLHhfdFt0Jk5RXSk7CisgICAgICByZXQ9Zm5hbWU7CisgICAgfQorICB9ZWxzZSBpZihDUFU8NjgwMjAmJiFPTERMSUJDQUxMUyl7CisgICAgaWYoKGM9PURJVnx8Yz09TU9EKSYmSVNJTlQodCkmJnptMmwoc2l6ZXRhYlt0Jk5RXSk9PTQpeworICAgICAgc3ByaW50ZihmbmFtZSwiXyVzJWMiLGVuYW1lW2NdLCh0JlVOU0lHTkVEKT8ndSc6J3MnKTsKKyAgICAgIHJldD1mbmFtZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworCitpbnQgcmVnX3Bhcm0odHJlZ19oYW5kbGUgKnAsdHlwZSAqdCxpbnQgbW9kZSx0eXBlICpma3QpCit7CisgIGludCBmOworCisgIGlmKCFma3R8fGZrdC0+ZmxhZ3MhPUZVTktUKQorICAgIGllcnJvcigwKTsKKworICBpZighZmt0LT5uZXh0KQorICAgIGllcnJvcigwKTsKKworICBpZihzdGRhcmdzKGZrdCkpCisgICAgIHJldHVybiAwOworCisgIGY9dC0+ZmxhZ3MmTlE7CisgIGlmKG1vZGUvKnx8Zj09TExPTkd8fCFJU1NDQUxBUihmKSovKQorICAgIHJldHVybiAwOworICBpZihJU1BPSU5URVIoZikpeworICAgIGlmKHAtPmFyPmFzY3JhdGNoKQorICAgICAgcmV0dXJuIDA7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGEwK3AtPmFyKys7CisgIH0KKyAgaWYoSVNGTE9BVChmKXx8Zj09TExPTkcpeworICAgIGlmKEZQVTw9NjgwMDB8fGY9PUxMT05HKXsKKyAgICAgIGlmKHJwYXJtdHlwZT09UEFSTVNBUykgcmV0dXJuIDA7CisgICAgICBpZihmIT1GTE9BVCl7CisJaWYocC0+ZHIhPTApIHJldHVybiAwOworCXAtPmRyKz0yOworCXJldHVybiBkMGQxOworICAgICAgfQorICAgICAgaWYocC0+ZHI+ZHNjcmF0Y2gpCisJcmV0dXJuIDA7CisgICAgICBlbHNlCisJcmV0dXJuIGQwK3AtPmRyKys7CisgICAgfWVsc2V7CisgICAgICBpZihwLT5mcj5mc2NyYXRjaCkKKwlyZXR1cm4gMDsKKyAgICAgIGVsc2UKKwlyZXR1cm4gZnAwK3AtPmZyKys7CisgICAgfQorICB9CisgIGlmKCFJU0lOVChmKSkgcmV0dXJuIDA7CisgIGlmKHAtPmRyPmRzY3JhdGNoKQorICAgIHJldHVybiAwOworICBlbHNlCisgICAgcmV0dXJuIGQwK3AtPmRyKys7Cit9CisKK2ludCBoYW5kbGVfcHJhZ21hKGNvbnN0IGNoYXIgKnMpCit7CisgIGlmKCFzdHJuY21wKCJzdGRhcmdzLW9uIixzLDEwKSl7CisgICAgYWRkX3N0ZGFyZ3M9MTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZighc3RybmNtcCgic3RkYXJncy1vZmYiLHMsMTEpKXsKKyAgICBhZGRfc3RkYXJncz0wOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCit2b2lkIGFkZF92YXJfaG9va19wcmUoY29uc3QgY2hhciAqaWRlbnRpZmllciwgdHlwZSAqdCwgaW50IHN0b3JhZ2VfY2xhc3MsY29uc3RfbGlzdCAqY2xpc3QpCit7CisgIGlmKCFhZGRfc3RkYXJncykgcmV0dXJuOworICBpZihJU0ZVTkModC0+ZmxhZ3MpKQorICAgIGFkZF9hdHRyKCZ0LT5uZXh0LT5hdHRyLCJfX3N0ZGFyZ3MiKTsKK30KZGlmZiAtLWdpdCBhL21hY2hpbmVzL202OGsvbWFjaGluZS5kdCBiL21hY2hpbmVzL202OGsvbWFjaGluZS5kdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MjZjOGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvbTY4ay9tYWNoaW5lLmR0CkBAIC0wLDAgKzEsMTYgQEAKK1M4QlMKK1M4QlUKK1MxNkJTQkUgUzE2QlNMRQorUzE2QlVCRSBTMTZCVUxFCitTMzJCU0JFIFMzMkJTTEUKK1MzMkJVQkUgUzMyQlVMRQorUzMyQlNCRSBTMzJCU0xFCitTMzJCVUJFIFMzMkJVTEUKK1M2NEJTQkUgUzY0QlNMRQorUzY0QlVCRSBTNjRCVUxFCitTMzJCSUVFRUJFCitTNjRCSUVFRUJFCitTNjRCSUVFRUJFCitTMzJCVUJFIFMzMkJVTEUKKworCmRpZmYgLS1naXQgYS9tYWNoaW5lcy9tNjhrL21hY2hpbmUuaCBiL21hY2hpbmVzL202OGsvbWFjaGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZDJhZmUKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9tNjhrL21hY2hpbmUuaApAQCAtMCwwICsxLDExOCBAQAorLyogICRWRVI6IHZiY2MgKG02OGsvbWFjaGluZS5oKSAkUmV2aXNpb246IDEuMTMgJCAgICAgKi8KKworI2luY2x1ZGUgImR0LmgiCisKKy8qICBUaGlzIHN0cnVjdCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgbWFjaGluZS1zcGVjaWZpYyAgICAgICAgICAgKi8KKy8qICBhZGRyZXNzaW5nLW1vZGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3R5cGVkZWYgc3RydWN0IEFkZHJlc3NpbmdNb2RleworICAgIGludCBiYXNlcmVnOworICAgIGxvbmcgZGlzdDsKKyAgICBpbnQgc2thbDsKKyAgICBpbnQgZHJlZzsKK30gQWRkcmVzc2luZ01vZGU7CisKKy8qICBUaGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUuICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFYUiAyOAorCisvKiAgTnVtYmVyIG9mIGNvbW1hbmRsaW5lLW9wdGlvbnMgdGhlIGNvZGUtZ2VuZXJhdG9yIGFjY2VwdHMuICAgICAgICovCisjZGVmaW5lIE1BWEdGIDM1CisKKy8qICBJZiB0aGlzIGlzIHNldCB0byB6ZXJvIHZiY2Mgd2lsbCBub3QgZ2VuZXJhdGUgSUNzIHdoZXJlIHRoZSAgICAgKi8KKy8qICB0YXJnZXQgb3BlcmFuZCBpcyB0aGUgc2FtZSBhcyB0aGUgMm5kIHNvdXJjZSBvcGVyYW5kLiAgICAgICAgICAgKi8KKy8qICBUaGlzIGNhbiBzb21ldGltZXMgc2ltcGxpZnkgdGhlIGNvZGUtZ2VuZXJhdG9yLCBidXQgdXN1YWxseSAgICAgKi8KKy8qICB0aGUgY29kZSBpcyBiZXR0ZXIgaWYgdGhlIGNvZGUtZ2VuZXJhdG9yIGFsbG93cyBpdC4gICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNFUTJBU1ogMQorCisvKiAgVGhpcyBzcGVjaWZpZXMgdGhlIHNtYWxsZXN0IGludGVnZXIgdHlwZSB0aGF0IGNhbiBiZSBhZGRlZCB0byBhICovCisvKiAgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitleHRlcm4gaW50IE1JTkFEREkyUDsKKworLyogIFRoaXMgc3BlY2lmaWVzIHRoZSBzbWFsbGVzdCB1bnNpZ25lZCB0eXBlIHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgKi8KKy8qICBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlOQUREVUkyUCAoVU5TSUdORUR8SU5UKQorCisKKy8qICBUaGlzIHNwZWNpZmllcyB0aGUgYmlnZ2VzdCBpbnRlZ2VyIHR5cGUgdGhhdCBjYW4gYmUgYWRkZWQgdG8gYSAgKi8KKy8qICBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFYQURESTJQIExPTkcKKworLyogIElmIHRoZSBieXRlcyBvZiBhbiBpbnRlZ2VyIGFyZSBvcmRlcmVkIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSAgICAqLworLyogIGJ5dGUgZmlyc3QgYW5kIHRoZW4gZGVjcmVhc2luZyBzZXQgQklHRU5ESUFOIHRvIDEuICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdFTkRJQU4gMQorCisvKiAgSWYgdGhlIGJ5dGVzIG9mIGFuIGludGVnZXIgYXJlIG9yZGVyZWQgbGVzdCBzaWduaWZpY2FudCBieXRlICAgICovCisvKiAgYnl0ZSBmaXJzdCBhbmQgdGhlbiBpbmNyZWFzaW5nIHNldCBMSVRUTEVFTkRJQU4gdG8gMS4gICAgICAgICAgICovCisjZGVmaW5lIExJVFRMRUVORElBTiAwCisKKy8qICBOb3RlIHRoYXQgQklHRU5ESUFOIGFuZCBMSVRUTEVFTkRJQU4gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gICAgKi8KKworLyogIElmIHN3aXRjaC1zdGF0ZW1lbnRzIHNob3VsZCBiZSBnZW5lcmF0ZWQgYXMgYSBzZXF1ZW5jZSBvZiAgICAgICAqLworLyogIFNVQixUU1QsQkVRIElDcyByYXRoZXIgdGhhbiBDT01QQVJFLEJFUSBJQ3Mgc2V0IHRoaXMgdG8gMS4gICAgICAqLworLyogIFRoaXMgY2FuIHlpZWxkIGJldHRlciBjb2RlIG9uIHNvbWUgbWFjaGluZXMuICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTV0lUQ0hTVUJTIDEKKworLyogIEluIG9wdGltaXppbmcgY29tcGlsYXRpb24gY2VydGFpbiBsaWJyYXJ5IG1lbWNweS9zdHJjcHktY2FsbHMgICAqLworLyogIHdpdGggbGVuZ3RoIGtub3duIGF0IGNvbXBpbGUtdGltZSB3aWxsIGJlIGlubGluZWQgdXNpbmcgYW4gICAgICAqLworLyogIEFTU0lHTi1JQyBpZiB0aGUgc2l6ZSBpcyBsZXNzIG9yIGVxdWFsIHRvIElOTElORU1FTUNQWS4gICAgICAgICAqLworLyogIFRoZSB0eXBlIHVzZWQgZm9yIHRoZSBBU1NJR04tSUMgd2lsbCBiZSBVTlNJR05FRHxDSEFSLiAgICAgICAgICAqLworI2RlZmluZSBJTkxJTkVNRU1DUFkgMjU2CisKKy8qICBXZSBoYXZlIHNvbWUgdGFyZ2V0LXNwZWNpZmljIHZhcmlhYmxlIGF0dHJpYnV0ZXMuICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9UQVJHRVRfQVRUUklCVVRFUyAxCisKKy8qICBXZSBrZWVwIHRyYWNrIG9mIGFsbCByZWdpc3RlcnMgbW9kaWZpZWQgYnkgYSBmdW5jdGlvbi4gICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9SRUdTX01PRElGSUVEIDEKKworI2RlZmluZSBIQVZFX1RBUkdFVF9SQUxMT0MgMQorI2RlZmluZSBjb3N0X21vdmVfcmVnKHgseSkgMQorI2RlZmluZSBjb3N0X2xvYWRfcmVnKHgseSkgMgorI2RlZmluZSBjb3N0X3NhdmVfcmVnKHgseSkgMgorI2RlZmluZSBjb3N0X3B1c2hwb3BfcmVnKHgpIDIKKworLyogc2l6ZSBvZiBidWZmZXIgZm9yIGFzbS1vdXRwdXQgKi8KKyNkZWZpbmUgRU1JVF9CVUZfTEVOIDEwMjQgLyogc2hvdWxkIGJlIGVub3VnaCAqLworLyogbnVtYmVyIG9mIGFzbS1vdXRwdXQgbGluZXMgYnVmZmVyZWQgKi8KKyNkZWZpbmUgRU1JVF9CVUZfREVQVEggNAorCisvKiAgV2UgaGF2ZSBubyBhc21fcGVlcGhvbGUgdG8gb3B0aW1pemUgYXNzZW1ibHktb3V0cHV0ICovCisjZGVmaW5lIEhBVkVfVEFSR0VUX1BFRVBIT0xFIDEKKworLyogd2UgaGF2ZSBhIG1hcmtfZWZmX2ljcyBmdW5jdGlvbiAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9FRkZfSUMgMQorCisvKiB3ZSBoYXZlIHJlZ2lzdGVyLXBhaXJzICovCisjZGVmaW5lIEhBVkVfUkVHUEFJUlMgMQorCisjZGVmaW5lIEhBVkVfUkVHUEFSTVMgMQorCitzdHJ1Y3QgcmVnX2hhbmRsZSB7CisgIGludCBkcixhcixmcjsKK307CisKKworI2RlZmluZSBKVU1QX1RBQkxFX0RFTlNJVFkgMC44CisjZGVmaW5lIEpVTVBfVEFCTEVfTEVOR1RIIDgKKworLyogc3VwcG9ydCBmb3IgdmFyaWFibGUtbGVuZ3RoIGFycmF5cyAqLworI2RlZmluZSBBTExPQ1ZMQV9SRUcgOQorI2RlZmluZSBBTExPQ1ZMQV9JTkxJTkVBU00gIlx0YWRkcS5sXHQjMyxkMFxuXHRhbmQuYlx0IzI1MixkMFxuXHRzdWIubFx0ZDAsYTdcblx0bW92ZS5sXHRhNyxkMCIKKyNkZWZpbmUgRlJFRVZMQV9SRUcgMAorLyogVE9ETzogZmluZCBhIGJldHRlciBzb2x1dGlvbiBzb21lIHRpbWUgKi8KKyNkZWZpbmUgRlJFRVZMQV9JTkxJTkVBU00gIlx0bW92ZS5sXHQoYTcpLGE3XG5cdHN1YnEubFx0IzQsYTciCisjZGVmaW5lIE9MRFNQVkxBX0lOTElORUFTTSAiXHRtb3ZlLmxcdGE3LGQwIgorI2RlZmluZSBGUFZMQV9SRUcgNgorCisvKiBXZSB1c2UgYnVpbHRpbiBsaWJjYWxscyBmb3Igc29tZSBvcGVyYXRpb25zICovCisjZGVmaW5lIEhBVkVfTElCQ0FMTFMgMQorCisvKiBXZSBoYXZlIHRhcmdldC1zcGVjaWZpYyBwcmFnbWFzICovCisjZGVmaW5lIEhBVkVfVEFSR0VUX1BSQUdNQVMKKworLyogV2UgaGF2ZSBhIHRhcmdldC1zcGVjaWZpYyBhZGRfdmFyIGhvb2sgKi8KKyNkZWZpbmUgSEFWRV9UQVJHRVRfVkFSSE9PS19QUkUKKworI2RlZmluZSBIQVZFX1BPRjJPUFQgMQorCisjaWZuZGVmIE02OEtfMTZCSVRfSU5UCisjZGVmaW5lIEhBVkVfSU5UX1NJWkVUIDEKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvbTY4a3MvbWFjaGluZS5jIGIvbWFjaGluZXMvbTY4a3MvbWFjaGluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNhMzQyYjUKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9tNjhrcy9tYWNoaW5lLmMKQEAgLTAsMCArMSw3IEBACisvKiAgQ29kZSBnZW5lcmF0b3IgZm9yIE1vdG9yb2xhIDY4MHgwIENQVXMuIFN1cHBvcnRzIDY4MDAwLTY4MDYwKzY4ODgxLzIgICAgKi8KKy8qICBhbmQgQ29sZEZpcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFBoeEFzcyBhbmQgdGhlIEdOVSBhc3NlbWJsZXIgaXMgc3VwcG9ydGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qICBzdHViIGZvciBTVCB2ZXJzaW9uIHdpdGggMTZiaXQgaW50ICAqLworCisjaW5jbHVkZSAibWFjaGluZXMvbTY4ay9tYWNoaW5lLmMiCmRpZmYgLS1naXQgYS9tYWNoaW5lcy9tNjhrcy9tYWNoaW5lLmR0IGIvbWFjaGluZXMvbTY4a3MvbWFjaGluZS5kdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NDU0NGEyCi0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvbTY4a3MvbWFjaGluZS5kdApAQCAtMCwwICsxLDE2IEBACitTOEJTCitTOEJVCitTMTZCU0JFIFMxNkJTTEUKK1MxNkJVQkUgUzE2QlVMRQorUzE2QlNCRSBTMTZCU0xFCitTMTZCVUJFIFMxNkJVTEUKK1MzMkJTQkUgUzMyQlNMRQorUzMyQlVCRSBTMzJCVUxFCitTNjRCU0JFIFM2NEJTTEUKK1M2NEJVQkUgUzY0QlVMRQorUzMyQklFRUVCRQorUzY0QklFRUVCRQorUzY0QklFRUVCRQorUzMyQlVCRSBTMzJCVUxFCisKKwpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvbTY4a3MvbWFjaGluZS5oIGIvbWFjaGluZXMvbTY4a3MvbWFjaGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFjM2VlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9tNjhrcy9tYWNoaW5lLmgKQEAgLTAsMCArMSwxNCBAQAorLyogIENvZGUgZ2VuZXJhdG9yIGZvciBNb3Rvcm9sYSA2ODB4MCBDUFVzLiBTdXBwb3J0cyA2ODAwMC02ODA2MCs2ODg4MS8yICAgICovCisvKiAgYW5kIENvbGRGaXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQaHhBc3MgYW5kIHRoZSBHTlUgYXNzZW1ibGVyIGlzIHN1cHBvcnRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiAgc3R1YiBmb3IgU1QgdmVyc2lvbiB3aXRoIDE2Yml0IGludCAgKi8KKworI2RlZmluZSBNNjhLXzE2QklUX0lOVAorCisjZGVmaW5lIFBUUkRJRkZfVCh4KSBMT05HCisKKyNkZWZpbmUgQkVTVENPUFlUIExPTkcKKworI2luY2x1ZGUgImR0LmgiCisjaW5jbHVkZSAiLi4vbTY4ay9tYWNoaW5lLmgiCmRpZmYgLS1naXQgYS9tYWNoaW5lcy9tYXJrL21hY2hpbmUuYyBiL21hY2hpbmVzL21hcmsvbWFjaGluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ODU5ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9tYXJrL21hY2hpbmUuYwpAQCAtMCwwICsxLDE1MjYgQEAKKyNpbmNsdWRlICJzdXBwLmgiCisvLyNkZWZpbmUgREVCVUdfTUFSSworCitzdGF0aWMgY2hhciBGSUxFX1tdPV9fRklMRV9fOworCisvLyNpbmNsdWRlICJ2ZXJzaW9uLmgiCitjaGFyIGNnX2NvcHlyaWdodFtdPSJub3QgZm9yIHB1YmxpYyByZWxlYXNlIjsKKworaW50IGdfZmxhZ3NbTUFYR0ZdPXt9OworY2hhciAqZ19mbGFnc19uYW1lW01BWEdGXT17fTsKK3VuaW9uIHBwaSBnX2ZsYWdzX3ZhbFtNQVhHRl07CisKK3N0cnVjdCByZWdfaGFuZGxlIGVtcHR5X3JlZ19oYW5kbGU9ezB9OworCitleHRlcm4gaW50IGhhbmRsZV9wcmFnbWEoY29uc3QgY2hhciAqIGMpe3JldHVybiAwO30KKworLy9zdXBwb3J0IGZvciBJU1IKK2NoYXIgKmdfYXR0cl9uYW1lW10gPSB7Il9faW50ZXJydXB0IiwgMH07CisjZGVmaW5lIElOVEVSUlVQVCAxCisKKy8qCisgKiBEZWZpbmUgcmVnaXN0ZXJzIGNvZGVzCisgKi8KKworI2RlZmluZSBSMCAxICAvL3plcm8gcmVnaXN0ZXIKKyNkZWZpbmUgUjEgMiAgLy9yZXNlcnZlZCBmb3IgY29tcGlsZXIKKyNkZWZpbmUgUjIgMyAgLy9yZXNlcnZlZCBmb3IgY29tcGlsZXIKKyNkZWZpbmUgUjMgNCAgLy9yZXNlcnZlZCBmb3IgY29tcGlsZXIKKyNkZWZpbmUgUjQgNSAgLy9jb25kaXRpb24gY29kZXMKKyNkZWZpbmUgUjUgNiAgLy9yZXR1cm4gdmFsdWUKKyNkZWZpbmUgUjYgNworI2RlZmluZSBSNyA4CisjZGVmaW5lIFI4IDkKKyNkZWZpbmUgUjkgMTAKKyNkZWZpbmUgUjEwIDExCisjZGVmaW5lIFIxMSAxMgorI2RlZmluZSBSMTIgMTMKKyNkZWZpbmUgRlAgMTQgLy9mcmFtZSBwb2ludGVyCisjZGVmaW5lIFBDIDE1IC8vcHJvZ3JhbSBjb3VudGVyCisjZGVmaW5lIFNQIDE2IC8vc3RhY2sgcG9pbnRlcgorCisvKgorICogQ3VzdG9tIGZ1bmN0aW9uCisgKi8KKworLy9ldmFsdWUgY29tcGFyZSBJQyBhbmQgcHJlcGFyZSBjb25kaXRpb24gY29kZXMgaW4gUjMgKENPTVBBUkUgSUMgaXMgZm9sbG93ZWQgYnkgQlJBTkNIIGFsbHdheXMpCit2b2lkIGNvbXBhcmUoRklMRSAqZiwgc3RydWN0IElDICpwKTsKKy8vaGVscGVyIGZ1bmN0aW9uIGZvciBsb2FkaW5nIG9iaiBvIGludG8gcmVnaXN0ZXIgZGVzdF9yZWcKK3ZvaWQgbG9hZF9pbnRvX3JlZyhGSUxFICpmLCBpbnQgZGVzdF9yZWcsIHN0cnVjdCBvYmogKm8sIGludCB0eXBlLCBpbnQgdG1wX3JlZyk7CisvL3N0b3JlIHJlZyBpbnRvIG9iaiBvCit2b2lkIHN0b3JlX2Zyb21fcmVnKEZJTEUgKmYsIGludCBzb3VyY2VfcmVnLCBzdHJ1Y3Qgb2JqICpvLCBpbnQgdHlwZSwgaW50IHRtcF9yZWcsIGludCB0bXBfcmVnX2IpOworLy90YWtlIGNhcmUgYWJvdXQgYWxsIGFyaXRobWV0aWMgSUMKK3ZvaWQgYXJpdGhtZXRpYyhGSUxFICpmLCBzdHJ1Y3QgSUMgKnApOworLy9sb2FkIGNvbnN0YW50IGludG8gcmVnaXN0ZXIKK3ZvaWQgbG9hZF9jb25zKEZJTEUgKmYsIGludCByZWcsIGxvbmcgaW50IHZhbHVlKTsKKworLyoKKyAqIERhdGEgVHlwZXMKKyAqLworem1heCBjaGFyX2JpdDsgLy8gQ0hBUl9CSVQgZm9yIHRoZSB0YXJnZXQgbWFjaGluZS4KK3ptYXggYWxpZ25bTUFYX1RZUEUrMV07IC8vICBBbGlnbm1lbnQtcmVxdWlyZW1lbnRzIGZvciBhbGwgdHlwZXMgaW4gYnl0ZXMuCit6bWF4IG1heGFsaWduOyAvLyAgQWxpZ25tZW50IHRoYXQgaXMgc3VmZmljaWVudCBmb3IgZXZlcnkgb2JqZWN0Lgorem1heCBzaXpldGFiW01BWF9UWVBFKzFdOyAvLyAgc2l6ZXMgb2YgdGhlIGJhc2ljIHR5cGVzIChpbiBieXRlcykKKworLy8gIE1pbmltdW0gYW5kIE1heGltdW0gdmFsdWVzIGVhY2ggdHlwZSBjYW4gaGF2ZS4KK3ptYXggdF9taW5bTUFYX1RZUEUrMV07Cit6dW1heCB0X21heFtNQVhfVFlQRSsxXTsKK3p1bWF4IHR1X21heFtNQVhfVFlQRSsxXTsKKworCisvKgorICogUmVnaXN0ZXIgIFNldAorICovCisKKy8qCisgKiBOYW1lcyBvZiBhbGwgcmVnaXN0ZXJzLiB3aWxsIGJlIGluaXRpYWxpemVkIGluIGluaXRfY2coKSwKKyAqIHJlZ2lzdGVyIG51bWJlciAwIGlzIGludmFsaWQsIHZhbGlkIHJlZ2lzdGVycyBzdGFydCBhdCAxCisgKi8KK2NoYXIgKnJlZ25hbWVzW01BWFIrMV07CisKKy8qCisgKiAgVGhlIFNpemUgb2YgZWFjaCByZWdpc3RlciBpbiBieXRlcy4KKyAqLworem1heCByZWdzaXplW01BWFIrMV07CisKKy8qCisgKiAgIFNwZWNpZmllcyB3aGljaCByZWdpc3RlcnMgbWF5IGJlIHNjcmF0Y2hlZCBieSBmdW5jdGlvbnMuCisgKi8KK2ludCByZWdzY3JhdGNoW01BWFIrMV07CisKKy8qCisgKiAgIGEgdHlwZSB3aGljaCBjYW4gc3RvcmUgZWFjaCByZWdpc3Rlci4KKyAqLworc3RydWN0IFR5cCAqcmVndHlwZVtNQVhSKzFdOworCisvKiAgcmVnc2FbcmVnXSE9MCBpZiBhIGNlcnRhaW4gcmVnaXN0ZXIgaXMgYWxsb2NhdGVkIGFuZCBzaG91bGQKKyAqICBub3QgYmUgdXNlZCBieSB0aGUgY29tcGlsZXIgcGFzcy4KKyAqLworaW50IHJlZ3NhW01BWFIrMV07CisKKy8qCisgKiBzcGVjaWZpZXMgdGhlIHByaW9yaXR5IGZvciB0aGUgcmVnaXN0ZXItYWxsb2NhdG9yLCBpZiB0aGUgc2FtZQorICogZXN0aW1hdGVkIGNvc3Qtc2F2aW5nIGNhbiBiZSBvYnRhaW5lZCBieSBzZXZlcmFsIHJlZ2lzdGVycywgdGhlCisgKiBvbmUgd2l0aCB0aGUgaGlnaGVzdCBwcmlvcml0eSB3aWxsIGJlIHVzZWQKKyAqLworaW50IHJlZ19wcmlvW01BWFIrMV07CisKKworLyoKKyAqIERvZXMgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9ucyBmb3IgdGhlIGNvZGUtZ2VuZXJhdG9yLiBHZXRzIGNhbGxlZAorICogb25jZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCBzaG91bGQgcmV0dXJuIDAgaW4gY2FzZSBvZiBwcm9ibGVtcy4KKyAqLworaW50IGluaXRfY2codm9pZCl7CisKKyAgICAjaWZkZWYgREVCVUdfTUFSSworICAgIHByaW50ZigiQ2FsbGVkIGluaXRfY2coKVxuIik7CisgICAgI2VuZGlmCisKKyAgICBpbnQgaTsKKworICAgIG1heGFsaWduPWwyem0oMUwpOworICAgIGNoYXJfYml0PWwyem0oMzJMKTsKKworICAgIGZvcihpPTA7aTw9TUFYX1RZUEU7aSsrKXsKKyAgICAgICAgYWxpZ25baV0gPSBsMnptKDFMKTsKKyAgICAgICAgc2l6ZXRhYltpXSA9IGwyem0oMUwpOworICAgIH0KKworICAgIHRfbWluW0NIQVJdID0gem1zdWIobDJ6bSgtMjE0NzQ4MzY0N0wpLGwyem0oMUwpKTsKKyAgICB0X21pbltTSE9SVF0gPSB0X21pbltDSEFSXTsKKyAgICB0X21pbltJTlRdID0gdF9taW5bQ0hBUl07CisgICAgdF9taW5bTE9OR10gPSB0X21pbltDSEFSXTsKKyAgICB0X21pbltMTE9OR10gPSB0X21pbltDSEFSXTsKKyAgICB0X21pbltNQVhJTlRdID0gdF9taW5bQ0hBUl07CisKKyAgICB0X21heFtDSEFSXSA9IHVsMnp1bSgyMTQ3NDgzNjQ3VUwpOworICAgIHRfbWF4W1NIT1JUXSA9IHRfbWF4W0NIQVJdOworICAgIHRfbWF4W0lOVF0gPSB0X21heFtDSEFSXTsKKyAgICB0X21heFtMT05HXSA9IHRfbWF4W0NIQVJdOworICAgIHRfbWF4W0xMT05HXSA9IHRfbWF4W0NIQVJdOworICAgIHRfbWF4W01BWElOVF0gPSB0X21heFtDSEFSXTsKKworICAgIHR1X21heFtDSEFSXT11bDJ6dW0oNDI5NDk2NzI5NVVMKTsKKyAgICB0dV9tYXhbU0hPUlRdID0gdHVfbWF4W0NIQVJdOworICAgIHR1X21heFtJTlRdID0gdHVfbWF4W0NIQVJdOworICAgIHR1X21heFtMT05HXSA9IHR1X21heFtDSEFSXTsKKyAgICB0dV9tYXhbTExPTkddID0gdHVfbWF4W0NIQVJdOworICAgIHR1X21heFtNQVhJTlRdID0gdHVfbWF4W0NIQVJdOworCisKKyAgICByZWduYW1lc1swXSA9ICJub3JlZyI7CisgICAgcmVnX3ByaW9bMF0gPSAwOworICAgIHJlZ3NjcmF0Y2hbMF0gPSAwOworICAgIHJlZ3NhWzBdID0gMDsKKworICAgIC8vemVybyByZWdpc3RlcgorICAgIHJlZ25hbWVzWzFdID0gIlIwIjsKKyAgICByZWdfcHJpb1sxXSA9IDA7CisgICAgcmVnc2NyYXRjaFsxXSA9IDA7CisgICAgcmVnc2FbMV0gPSAxOworCisgICAgLy9SMSByZXNlcnZlZCBmb3IgYmFja2VkCisgICAgcmVnbmFtZXNbMl0gPSAiUjEiOworICAgIHJlZ19wcmlvWzJdID0gMDsKKyAgICByZWdzY3JhdGNoWzJdID0gMDsKKyAgICByZWdzYVsyXSA9IDE7CisKKyAgICAvL1IyIHJlc2VydmVkIGZvciBiYWNrZWQKKyAgICByZWduYW1lc1szXSA9ICJSMiI7CisgICAgcmVnX3ByaW9bM10gPSAwOworICAgIHJlZ3NjcmF0Y2hbM10gPSAwOworICAgIHJlZ3NhWzNdID0gMTsKKworICAgIC8vUjMgcmVzZXJ2ZWQgZm9yIGJhY2tlZAorICAgIHJlZ25hbWVzWzRdID0gIlIzIjsKKyAgICByZWdfcHJpb1s0XSA9IDA7CisgICAgcmVnc2NyYXRjaFs0XSA9IDA7CisgICAgcmVnc2FbNF0gPSAxOworCisgICAgLy9SNCBjb25kaXRpb24gY29kZXMKKyAgICByZWduYW1lc1s1XSA9ICJSNCI7CisgICAgcmVnX3ByaW9bNV0gPSAwOworICAgIHJlZ3NjcmF0Y2hbNV0gPSAwOworICAgIHJlZ3NhWzVdID0gMTsKKworICAgIC8vUjUgcmV0dXJuIHZhbHVlIGZvciBmdW5jdGlvbgorICAgIHJlZ25hbWVzWzZdID0gIlI1IjsKKyAgICByZWdfcHJpb1s2XSA9IDA7CisgICAgcmVnc2NyYXRjaFs2XSA9IDA7CisgICAgcmVnc2FbNl0gPSAxOworCisgICAgcmVnbmFtZXNbN10gPSAiUjYiOworICAgIHJlZ19wcmlvWzddID0gMDsKKyAgICByZWdzY3JhdGNoWzddID0gMDsKKyAgICByZWdzYVs3XSA9IDA7CisKKyAgICByZWduYW1lc1s4XSA9ICJSNyI7CisgICAgcmVnX3ByaW9bOF0gPSAwOworICAgIHJlZ3NjcmF0Y2hbOF0gPSAwOworICAgIHJlZ3NhWzhdID0gMDsKKworICAgIHJlZ25hbWVzWzldID0gIlI4IjsKKyAgICByZWdfcHJpb1s5XSA9IDA7CisgICAgcmVnc2NyYXRjaFs5XSA9IDA7CisgICAgcmVnc2FbOV0gPSAwOworCisgICAgcmVnbmFtZXNbMTBdID0gIlI5IjsKKyAgICByZWdfcHJpb1sxMF0gPSAwOworICAgIHJlZ3NjcmF0Y2hbMTBdID0gMDsKKyAgICByZWdzYVsxMF0gPSAwOworCisgICAgcmVnbmFtZXNbMTFdID0gIlIxMCI7CisgICAgcmVnX3ByaW9bMTFdID0gMDsKKyAgICByZWdzY3JhdGNoWzExXSA9IDA7CisgICAgcmVnc2FbMTFdID0gMDsKKworICAgIHJlZ25hbWVzWzEyXSA9ICJSMTEiOworICAgIHJlZ19wcmlvWzEyXSA9IDA7CisgICAgcmVnc2NyYXRjaFsxMl0gPSAwOworICAgIHJlZ3NhWzEyXSA9IDA7CisKKyAgICByZWduYW1lc1sxM10gPSAiUjEyIjsKKyAgICByZWdfcHJpb1sxM10gPSAwOworICAgIHJlZ3NjcmF0Y2hbMTNdID0gMDsKKyAgICByZWdzYVsxM10gPSAwOworCisgICAgLy8gRnJhbWUgcG9pbnRlcgorICAgIHJlZ25hbWVzW0ZQXSA9ICJSMTMiOworICAgIHJlZ19wcmlvWzE0XSA9IDA7CisgICAgcmVnc2NyYXRjaFsxNF0gPSAwOworICAgIHJlZ3NhWzE0XSA9IDE7CisKKyAgICAvLyBQcm9ncmFtIGNvdW50ZXIKKyAgICByZWduYW1lc1sxNV0gPSAiUEMiOworICAgIHJlZ19wcmlvWzE1XSA9IDA7CisgICAgcmVnc2NyYXRjaFsxNV0gPSAwOworICAgIHJlZ3NhWzE1XSA9IDE7CisKKyAgICAvLyBTdGFjayBwb2ludGVyCisgICAgcmVnbmFtZXNbMTZdID0gIlNQIjsKKyAgICByZWdfcHJpb1sxNl0gPSAwOworICAgIHJlZ3NjcmF0Y2hbMTZdID0gMDsKKyAgICByZWdzYVsxNl0gPSAxOworCisKKyAgICBmb3IoaT0wO2k8PU1BWFI7aSsrKXsKKyAgICAgICAgcmVnc2l6ZVtpXSA9IGwyem0oMUwpOworICAgIH0KKworICAgIC8vIFVzZSBtdWx0aXBsZSBjY3MKKyAgICBtdWx0aXBsZV9jY3MgPSAwOworCisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgY2xlYW51cF9jZyhGSUxFICpmKXsKKyAgICAjaWZkZWYgREVCVUdfTUFSSworICAgIHByaW50ZigiQ2FsbGVkIGNsZWFudXBfY2coKVxuIik7CisgICAgI2VuZGlmCit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSByZWdpc3RlciBpbiB3aGljaCB2YXJpYWJsZXMgb2YgdHlwZSB0IGFyZSByZXR1cm5lZC4KKyAqIElmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgcmV0dXJuZWQgaW4gYSByZWdpc3RlciByZXR1cm5zIDAuCisgKi8KK2ludCBmcmV0dXJuKHN0cnVjdCBUeXAgKnQpeworICAgIHJldHVybiBSNTsKK30KKworLyoKKyAqIFJldHVybnMgMCBpZiByZWdpc3RlciByIGNhbm5vdCBzdG9yZSB2YXJpYWJsZXMgb2YKKyAqIHR5cGUgdC4gSWYgdD09UE9JTlRFUiBhbmQgbW9kZSE9MCB0aGVuIGl0IHJldHVybnMKKyAqIG5vbi16ZXJvIG9ubHkgaWYgdGhlIHJlZ2lzdGVyIGNhbiBzdG9yZSBhIHBvaW50ZXIKKyAqIGFuZCBkZXJlZmVyZW5jZSBhIHBvaW50ZXIgdG8gbW9kZS4KKyAqLworaW50IHJlZ29rKGludCByLGludCB0LGludCBtb2RlKXsKKyAgICByZXR1cm4gMTsKK30KKworLyoKKyAqICBSZXR1cm5zIHplcm8gaWYgdGhlIElDIHAgY2FuIGJlIHNhZmVseSBleGVjdXRlZAorICogIHdpdGhvdXQgZGFuZ2VyIG9mIGV4Y2VwdGlvbnMgb3Igc2ltaWxhciB0aGluZ3MuCisgKiAgdmJjYyBtYXkgZ2VuZXJhdGUgY29kZSBpbiB3aGljaCBub24tZGFuZ2Vyb3VzIElDcworICogIGFyZSBzb21ldGltZXMgZXhlY3V0ZWQgYWx0aG91Z2ggY29udHJvbC1mbG93IG1heQorICogIG5ldmVyIHJlYWNoIHRoZW0gKG1haW5seSB3aGVuIG1vdmluZyBjb21wdXRhdGlvbnMKKyAqICBvdXQgb2YgbG9vcHMpLgorICogIFR5cGljYWwgSUNzIHRoYXQgZ2VuZXJhdGUgZXhjZXB0aW9ucyBvbiBzb21lCisgKiAgbWFjaGluZXMgYXJlOgorICogICAgICAtIGFjY2Vzc2VzIHZpYSBwb2ludGVycworICogICAgICAtIGRpdmlzaW9uL21vZHVsbworICogICAgICAtIG92ZXJmbG93IG9uIHNpZ25lZCBpbnRlZ2VyL2Zsb2F0cworICovCitpbnQgZGFuZ2Vyb3VzX0lDKHN0cnVjdCBJQyAqcCl7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgUmV0dXJucyB6ZXJvIGlmIGNvZGUgZm9yIGNvbnZlcnRpbmcgbnAgdG8gdHlwZSB0CisgKiAgY2FuIGJlIG9taXR0ZWQuCisgKiAgT24gdGhlIFBvd2VyUEMgY3B1IHBvaW50ZXJzIGFuZCAzMmJpdAorICogIGludGVnZXJzIGhhdmUgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gYW5kIGNhbiB1c2UKKyAqICB0aGUgc2FtZSByZWdpc3RlcnMuCisgKi8KK2ludCBtdXN0X2NvbnZlcnQoaW50IG8saW50IHQsaW50IGNvbnN0X2V4cHIpeworICAgIHJldHVybiAwOworfQorCitpbnQgc2hvcnRjdXQoaW50IGNvZGUsaW50IHR5cCl7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgVGhlIG1haW4gY29kZS1nZW5lcmF0aW9uIHJvdXRpbmUuCisgKiAgZiBpcyB0aGUgc3RyZWFtIHRoZSBjb2RlIHNob3VsZCBiZSB3cml0dGVuIHRvLgorICogIHAgaXMgYSBwb2ludGVyIHRvIGEgZG91Ymx5IGxpbmtlZCBsaXN0IG9mIElDcworICogIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIGJvZHkgdG8gZ2VuZXJhdGUgY29kZSBmb3IuCisgKiAgdiBpcyBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uLgorICogIG9mZnNldCBpcyB0aGUgc2l6ZSBvZiB0aGUgc3RhY2tmcmFtZSB0aGUgZnVuY3Rpb24KKyAqICBuZWVkcyBmb3IgbG9jYWwgdmFyaWFibGVzLgorICovCit2b2lkIGdlbl9jb2RlKEZJTEUgKmYsc3RydWN0IElDICpwLHN0cnVjdCBWYXIgKnYsem1heCBvZmZzZXQpeworICAgICNpZmRlZiBERUJVR19NQVJLCisgICAgcHJpbnRmKCJDYWxsZWQgZ2VuX2NvZGUoRklMRSAqZixzdHJ1Y3QgSUMgKnAsc3RydWN0IFZhciAqdix6bWF4IG9mZnNldClcbiIpOworICAgIHByaW50ZigiXHRJZGVudGlmaWVyOiAlcyIsIHYtPmlkZW50aWZpZXIpOworICAgICNlbmRpZgorCisgICAgLy9lbWl0IGZ1bmN0aW9uIGhlYWQKKyAgICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4peworICAgICAgICBpZiggKHYtPmZsYWdzICYgKElOTElORUZVTkN8SU5MSU5FRVhUKSkgIT0gSU5MSU5FRlVOQyApeworICAgICAgICAgICAgZW1pdChmLCIuRVhQT1JUIFx0ICVzIFxuIix2LT5pZGVudGlmaWVyKTsKKyAgICAgICAgfQorICAgICAgICBlbWl0KGYsIiVzOiBcbiIsdi0+aWRlbnRpZmllcik7CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIGVtaXQoZiwiTF8lbGQ6XG4iLHptMmwodi0+b2Zmc2V0KSk7CisgICAgfQorCisgICAgLy9lbWl0IGZ1bmN0aW9uIHByb2xvZ3VlCisgICAgZW1pdChmLCAiXHRQVVNIIFx0ICVzXG4iLCByZWduYW1lc1tGUF0pOyAgLy9wdXNoIEZQCisgICAgZW1pdChmLCAiXHRPUiAgIFx0ICVzICVzICVzXG4iLHJlZ25hbWVzW1IwXSwgcmVnbmFtZXNbU1BdLCByZWduYW1lc1tGUF0pOyAvL01PVkUgU1AgLT4gRlAKKworICAgIC8vbWFrZSBzcGFjZSBmb3IgYXV0byB2YXJpYWJsZXMgYXQgc3RhY2sKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgem0ybChvZmZzZXQpOyBpKyspeworICAgICAgICBlbWl0KGYsICJcdERFQyBcdCAlcyAlc1xuIiwgcmVnbmFtZXNbU1BdLCByZWduYW1lc1tTUF0pOworICAgIH0KKworICAgIC8vc3RvcmUgYmFja2VuZCByZWdpc3RlcnMKKyAgICBlbWl0KGYsICJcdFBVU0ggXHQgUjFcblx0UFVTSCBcdCBSMlxuXHRQVVNIIFx0IFIzXG5cdFBVU0ggXHQgUjRcbiIpOworCisgICAgLy9maW5kIHVzZWQgcmVnaXN0ZXJzCisgICAgaW50IHNhdmVkX3JlZ3NbN10gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMH07CisKKyAgICBzdHJ1Y3QgSUMgKnBzID0gcDsKKyAgICBmb3IoO3BzO3BzPXBzLT5uZXh0KXsKKyAgICAgICAgaWYoICgocHMtPmNvZGUpICE9IEZSRUVSRUcpICYmICgocHMtPmNvZGUpICE9IEFMTE9DUkVHKSApeworICAgICAgICAgICAgaWYoKChwcy0+cTEuZmxhZ3MpICYgKEtPTlNUfFZBUnxSRUd8RFJFRk9CSnxWQVJBRFIpKSA9PSBSRUcpeworICAgICAgICAgICAgICAgIGlmKCgocHMtPnExLnJlZykgPiBSNSkgJiYgKChwcy0+cTEucmVnKSA8IEZQKSl7CisgICAgICAgICAgICAgICAgICAgIHNhdmVkX3JlZ3NbKHBzLT5xMS5yZWcpIC0gN10gPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCgocHMtPnEyLmZsYWdzKSAmIChLT05TVHxWQVJ8UkVHfERSRUZPQkp8VkFSQURSKSkgPT0gUkVHKXsKKyAgICAgICAgICAgICAgICBpZigoKHBzLT5xMi5yZWcpID4gUjUpICYmICgocHMtPnEyLnJlZykgPCBGUCkpeworICAgICAgICAgICAgICAgICAgICBzYXZlZF9yZWdzWyhwcy0+cTIucmVnKSAtIDddID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZigoKHBzLT56LmZsYWdzKSAmIChLT05TVHxWQVJ8UkVHfERSRUZPQkp8VkFSQURSKSkgPT0gUkVHKXsKKyAgICAgICAgICAgICAgICBpZigoKHBzLT56LnJlZykgPiBSNSkgJiYgKChwcy0+ei5yZWcpIDwgRlApKXsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZWRfcmVnc1socHMtPnoucmVnKSAtIDddID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL3NhdmUgdXNlZCByZWdpc3RlcnMKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgNzsgaSsrKXsKKyAgICAgICAgaWYoc2F2ZWRfcmVnc1tpXSA9PSAxKXsKKyAgICAgICAgICAgIGVtaXQoZiwgIlx0UFVTSCBcdCAlc1xuIiwgcmVnbmFtZXNbaSArIDddKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vZW1pdCBmdW5jdGlvbiBib2R5CisgICAgZm9yKDtwO3A9cC0+bmV4dCl7CisgICAgICAgIGludCBjID0gcC0+Y29kZTsKKworICAgICAgICAjaWZkZWYgREVCVUdfTUFSSworICAgICAgICBlbWl0KGYsICJcblx0O3AtPmNvZGU6ICVkXG4iLCBwLT5jb2RlKTsKKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgc3dpdGNoKHAtPmNvZGUpeworICAgICAgICAgICAgY2FzZSBBU1NJR046CisgICAgICAgICAgICAgICAgI2lmZGVmIERFQlVHX01BUksKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRBU1NJR05cblx0ei5mbGFnczolZFx0cTEuZmxhZ3M6JWRcdHR5cGY6JWRcbiIsIHAtPnouZmxhZ3MsIHAtPnExLmZsYWdzLCBwLT50eXBmKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIC8vd2UgY2FuIHNpbXBsaWZ5IGFzc2lnbiB3aGVuIGJvdGggb3BlcmFuZHMgYXJlIGluIHJlZ2lzdGVycworICAgICAgICAgICAgICAgIGlmKCgoKHAtPnExLmZsYWdzKSAmIChLT05TVHxWQVJ8UkVHfERSRUZPQkp8VkFSQURSKSkgPT0gUkVHKSAmJgorICAgICAgICAgICAgICAgICAgICgoKHAtPnouZmxhZ3MpICYgKEtPTlNUfFZBUnxSRUd8RFJFRk9CSnxWQVJBRFIpKSA9PSBSRUcpICl7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0T1IgICBcdCAlcyAlcyAlcyIscmVnbmFtZXNbUjBdLCByZWduYW1lc1twLT5xMS5yZWddLCByZWduYW1lc1twLT56LnJlZ10pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vdGhpcyBpcyBhbm90aGVyIG9wdGltYWxpemF0aW9uLCBpZiBoYXZlIHRvIGFzc2lnbiB6ZXJvOyB0aGVuCisgICAgICAgICAgICAgICAgLy96ZXJvIGlzIHJlYWQgZnJvbSBSMCBpbnN0ZWQgcHVzaGluZyBjb25zdGFudCBpbnRvIHJlZ2lzdGVyCisgICAgICAgICAgICAgICAgZWxzZSBpZigKKyAgICAgICAgICAgICAgICAoKChwLT5xMS5mbGFncykgJiAoS09OU1R8VkFSfFJFR3xEUkVGT0JKfFZBUkFEUikpID09IEtPTlNUKSAmJgorICAgICAgICAgICAgICAgICgocC0+cTEudmFsLnZtYXgpID09IDApCisgICAgICAgICAgICAgICAgKXsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVfZnJvbV9yZWcoZiwgUjAsICYocC0+eiksIHAtPnR5cGYsIFIyLCBSMyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgbG9hZF9pbnRvX3JlZyhmLCBSMSwgJihwLT5xMSksIHAtPnR5cGYsIFIyKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVfZnJvbV9yZWcoZiwgUjEsICYocC0+eiksIHAtPnR5cGYsIFIyLCBSMyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9SOgorICAgICAgICAgICAgICAgICNpZmRlZiBERUJVR19NQVJLCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0T1JcbiIpOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIGFyaXRobWV0aWMoZiwgcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFhPUjoKKyAgICAgICAgICAgICAgICAjaWZkZWYgREVCVUdfTUFSSworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFhPUlxuIik7CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgYXJpdGhtZXRpYyhmLCBwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU5EOgorICAgICAgICAgICAgICAgICNpZmRlZiBERUJVR19NQVJLCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0QU5EXG4iKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICBhcml0aG1ldGljKGYsIHApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMU0hJRlQ6CisgICAgICAgICAgICAgICAgI2lmZGVmIERFQlVHX01BUksKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRMU0hJRlRcbiIpOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIGFyaXRobWV0aWMoZiwgcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJTSElGVDoKKyAgICAgICAgICAgICAgICAjaWZkZWYgREVCVUdfTUFSSworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFJTSElGVFxuIik7CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgYXJpdGhtZXRpYyhmLCBwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUREOgorICAgICAgICAgICAgICAgICNpZmRlZiBERUJVR19NQVJLCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0QUREXG4iKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICBhcml0aG1ldGljKGYsIHApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVUI6CisgICAgICAgICAgICAgICAgI2lmZGVmIERFQlVHX01BUksKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRTVUJcbiIpOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIGFyaXRobWV0aWMoZiwgcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1VTFQ6CisgICAgICAgICAgICAgICAgI2lmZGVmIERFQlVHX01BUksKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRNVUxUXG4iKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICBhcml0aG1ldGljKGYsIHApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBESVY6CisgICAgICAgICAgICAgICAgI2lmZGVmIERFQlVHX01BUksKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRESVZcbiIpOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIGFyaXRobWV0aWMoZiwgcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1PRDoKKyAgICAgICAgICAgICAgICAjaWZkZWYgREVCVUdfTUFSSworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdE1PRFxuIik7CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgYXJpdGhtZXRpYyhmLCBwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgS09NUExFTUVOVDoKKyAgICAgICAgICAgICAgICAjaWZkZWYgREVCVUdfTUFSSworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdEtPTVBMRU1FTlRcbiIpOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIGFyaXRobWV0aWMoZiwgcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JTlVTOgorICAgICAgICAgICAgICAgICNpZmRlZiBERUJVR19NQVJLCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0TUlOVVNcbiIpOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIGFyaXRobWV0aWMoZiwgcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFERFJFU1M6CisgICAgICAgICAgICAgICAgI2lmZGVmIERFQlVHX01BUksKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRBRERSRVNTXG4iKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIGlmKAorICAgICAgICAgICAgICAgICgoKHAtPnExLmZsYWdzKSAmIChLT05TVHxWQVJ8UkVHfERSRUZPQkp8VkFSQURSKSkgPT0gVkFSKSAmJgorICAgICAgICAgICAgICAgICgoKHAtPnExLnYtPnN0b3JhZ2VfY2xhc3MpICYgKEFVVE98UkVHSVNURVJ8U1RBVElDfEVYVEVSTikpID09IEFVVE8pCisgICAgICAgICAgICAgICAgKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoSVNBUlJBWShwLT5xMS52LT5mbGFncykpeworICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9jb25zKGYsIFIxLCB6bTJsKHAtPnExLnYtPm9mZnNldCkrem0ybChwLT5xMS52YWwudm1heCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX2NvbnMoZiwgUjEsIHptMmwocC0+cTEudi0+b2Zmc2V0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRBREQgXHQgUjEgUjEzIFIxXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVfZnJvbV9yZWcoZiwgUjEsICYocC0+eiksIHAtPnR5cGYsIFIyLCBSMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgIGllcnJvcigwKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0FMTDoKKyAgICAgICAgICAgICAgICAjaWZkZWYgREVCVUdfTUFSSworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdENBTExcblx0cTEuZmxhZ3M6ICVkXG4iLCBwLT5xMS5mbGFncyk7CisgICAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICBpZigocC0+cTEuZmxhZ3MgJiAoVkFSfERSRUZPQkopKSA9PSBWQVIgJiYgcC0+cTEudi0+ZmkgJiYgcC0+cTEudi0+ZmktPmlubGluZV9hc20peworICAgICAgICAgICAgICAgICAgICBlbWl0X2lubGluZV9hc20oZixwLT5xMS52LT5maS0+aW5saW5lX2FzbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2V7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoKChwLT5xMS5mbGFncykgJiAoS09OU1R8VkFSfFJFR3xEUkVGT0JKfFZBUkFEUikpID09IFZBUil7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBERUJVR19NQVJLCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlx0cTEudi0+c3RvcmFnZV9jbGFzczogJWRcbiIsIHAtPnExLnYtPnN0b3JhZ2VfY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCgocC0+cTEudi0+c3RvcmFnZV9jbGFzcykgJiAoQVVUT3xSRUdJU1RFUnxTVEFUSUN8RVhURVJOKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFWFRFUk46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0Q0FMTCBcdCAlc1xuIiwgcC0+cTEudi0+aWRlbnRpZmllcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCAocC0+cTIudmFsLnZtYXgpOyBpKyspeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRJTkMgXHQgJXMgJXNcbiIsIHJlZ25hbWVzW1NQXSwgcmVnbmFtZXNbU1BdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNUQVRJQzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRDQUxMIFx0IExfJWxkXG4iLCB6bTJsKHAtPnExLnYtPm9mZnNldCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgKHAtPnEyLnZhbC52bWF4KTsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0SU5DIFx0ICVzICVzXG4iLCByZWduYW1lc1tTUF0sIHJlZ25hbWVzW1NQXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmZGVmIERFQlVHX01BUksKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcdFRoaXMgaXMgbm90IGltcGxlbWVudGVkIVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllcnJvcigwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigoKHAtPnExLmZsYWdzKSAmIChLT05TVHxWQVJ8UkVHfERSRUZPQkp8VkFSQURSKSkgPT0gKFZBUnxEUkVGT0JKKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAjaWZkZWYgREVCVUdfTUFSSworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcdHExLnYtPnN0b3JhZ2VfY2xhc3M6ICVkXG4iLCBwLT5xMS52LT5zdG9yYWdlX2NsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9pbnRvX3JlZyhmLCBSMSwgJihwLT5xMSksIHAtPnR5cGYsIFIzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0Q0FMTElcdCAlc1xuIiwgcmVnbmFtZXNbUjFdKTsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0SU5DIFx0ICVzICVzXG4iLCByZWduYW1lc1tTUF0sIHJlZ25hbWVzW1NQXSk7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBERUJVR19NQVJLCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlx0VGhpcyBpcyBub3QgaW1wbGVtZW50ZWQhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBpZXJyb3IoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ09OVkVSVDoKKyAgICAgICAgICAgICAgICAjaWZkZWYgREVCVUdfTUFSSworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdENPTlZFUlRcbiIpOworICAgICAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFMTE9DUkVHOgorICAgICAgICAgICAgICAgICNpZmRlZiBERUJVR19NQVJLCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0QUxMT0NSRUdcbiIpOworICAgICAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAgICAgcmVnc1twLT5xMS5yZWddID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRlJFRVJFRzoKKyAgICAgICAgICAgICAgICAjaWZkZWYgREVCVUdfTUFSSworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdEZSRUVSRUdcbiIpOworICAgICAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAgICAgcmVnc1twLT5xMS5yZWddID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ09NUEFSRToKKyAgICAgICAgICAgICAgICAjaWZkZWYgREVCVUdfTUFSSworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdENPTVBBUkVcbiIpOworICAgICAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAgICAgY29tcGFyZShmLCBwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVEVTVDoKKyAgICAgICAgICAgICAgICAjaWZkZWYgREVCVUdfTUFSSworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFRFU1RcbiIpOworICAgICAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAgICAgY29tcGFyZShmLCBwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTEFCRUw6CisgICAgICAgICAgICAgICAgI2lmZGVmIERFQlVHX01BUksKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRMQUJFTFxuIik7CisgICAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICBlbWl0KGYsIkxfJWQ6XG4iLHAtPnR5cGYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCRVE6CisgICAgICAgICAgICAgICAgI2lmZGVmIERFQlVHX01BUksKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRCRVFcbiIpOworICAgICAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRCTlogXHQgUjQgTF8lZFxuIiwgcC0+dHlwZik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJORToKKyAgICAgICAgICAgICAgICAjaWZkZWYgREVCVUdfTUFSSworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdEJORVxuIik7CisgICAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICBlbWl0KGYsICJcdEJOWiBcdCBSNCBMXyVkXG4iLCBwLT50eXBmKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxUOgorICAgICAgICAgICAgICAgICNpZmRlZiBERUJVR19NQVJLCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0QkxUXG4iKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0Qk5aIFx0IFI0IExfJWRcbiIsIHAtPnR5cGYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCR0U6CisgICAgICAgICAgICAgICAgI2lmZGVmIERFQlVHX01BUksKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRCR0VcbiIpOworICAgICAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRCTlogXHQgUjQgTF8lZFxuIiwgcC0+dHlwZik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJMRToKKyAgICAgICAgICAgICAgICAjaWZkZWYgREVCVUdfTUFSSworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdEJMRVxuIik7CisgICAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICBlbWl0KGYsICJcdEJOWiBcdCBSNCBMXyVkXG4iLCBwLT50eXBmKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkdUOgorICAgICAgICAgICAgICAgICNpZmRlZiBERUJVR19NQVJLCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0QkdUXG4iKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0Qk5aIFx0IFI0IExfJWRcbiIsIHAtPnR5cGYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCUkE6CisgICAgICAgICAgICAgICAgI2lmZGVmIERFQlVHX01BUksKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRCUkFcbiIpOworICAgICAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRCWiAgIFx0IFIwIExfJWRcbiIsIHAtPnR5cGYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQVVNIOgorICAgICAgICAgICAgICAgICNpZmRlZiBERUJVR19NQVJLCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0UFVTSFxuIik7CisgICAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICBsb2FkX2ludG9fcmVnKGYsIFIxLCAmKHAtPnExKSwgcC0+dHlwZiwgUjIpOworICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0UFVTSCBcdCBSMVxuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFEREkyUDoKKyAgICAgICAgICAgICAgICAjaWZkZWYgREVCVUdfTUFSSworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdEFEREkyUFxuIik7CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgYXJpdGhtZXRpYyhmLCBwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1VCSUZQOgorICAgICAgICAgICAgICAgICNpZmRlZiBERUJVR19NQVJLCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0U1VCSUZQXG4iKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICBhcml0aG1ldGljKGYsIHApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVUJQRlA6CisgICAgICAgICAgICAgICAgI2lmZGVmIERFQlVHX01BUksKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRTVUJQRlBcbiIpOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIGFyaXRobWV0aWMoZiwgcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdFVFJFVFVSTjoKKyAgICAgICAgICAgICAgICAjaWZkZWYgREVCVUdfTUFSSworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdEdFVFJFVFVSTlxuIik7CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgaWYoKHAtPnExLnJlZykgIT0gMCl7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlX2Zyb21fcmVnKGYsIHAtPnExLnJlZywgJihwLT56KSwgcC0+dHlwZiwgUjIsIFIzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgI2lmZGVmIERFQlVHX01BUksKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcdHExLnJlZyA9PSAwLCBkaWRuJ3Qga25vdyBob3cgdG8gZGVhbHQgd2l0aCBpdCEiKTsKKyAgICAgICAgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgaWVycm9yKDApOworICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNFVFJFVFVSTjoKKyAgICAgICAgICAgICAgICAjaWZkZWYgREVCVUdfTUFSSworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFNFVFJFVFVSTlxuXHR6LmZsYWdzOiVkXG4iLCBwLT56LmZsYWdzKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICBpZigocC0+ei5yZWcpICE9IDApeworICAgICAgICAgICAgICAgICAgICBsb2FkX2ludG9fcmVnKGYsIHAtPnoucmVnLCAmKHAtPnExKSwgcC0+dHlwZiwgUjEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICAjaWZkZWYgREVCVUdfTUFSSworICAgICAgICAgICAgICAgICAgICBwcmludGYoIlx0ei5yZWcgPT0gMCwgZGlkbid0IGtub3cgaG93IHRvIGRlYWx0IHdpdGggaXQhIik7CisgICAgICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgICAgIGllcnJvcigwKTsKKyAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNT1ZFRlJPTVJFRzoKKyAgICAgICAgICAgICAgICAjaWZkZWYgREVCVUdfTUFSSworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdE1PVkVGUk9NUkVHXG4iKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIHN0b3JlX2Zyb21fcmVnKGYsIHAtPnExLnJlZywgJihwLT56KSwgcC0+dHlwZiwgUjEsIFIzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTU9WRVRPUkVHOgorICAgICAgICAgICAgICAgICNpZmRlZiBERUJVR19NQVJLCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0TU9WRVRPUkVHXG4iKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgICAgIGxvYWRfaW50b19yZWcoZiwgcC0+ei5yZWcsICYocC0+cTEpLCBwLT50eXBmLCBSMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5PUDoKKyAgICAgICAgICAgICAgICAjaWZkZWYgREVCVUdfTUFSSworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdE5PUFxuIik7CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICNpZmRlZiBERUJVR19NQVJLCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcdFNvbWV0aGluZyBpcyB3cm9uZyBpbiBnZW5jb2RlKCkhXG4iKTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIGllcnJvcigwKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vcmVzdG9yZSB1c2VkIHJlZ2lzdGVycworICAgIGZvcihpbnQgaSA9IDY7IGkgPj0gMDsgaS0tKXsKKyAgICAgICAgaWYoc2F2ZWRfcmVnc1tpXSA9PSAxKXsKKyAgICAgICAgICAgIGVtaXQoZiwgIlx0UE9QIFx0ICVzXG4iLCByZWduYW1lc1tpICsgN10pOworICAgICAgICB9CisgICAgfQorCisgICAgLy9yZXN0b3JlIGJhY2tlbmQgcmVnaXN0ZXJzCisgICAgZW1pdChmLCAiXHRQT1AgXHQgUjRcblx0UE9QIFx0IFIzXG5cdFBPUCBcdCBSMlxuXHRQT1AgXHQgUjFcbiIpOworCisgICAgLy9lbWl0IGZ1bmN0aW9uIGVwaWxvZ3VlCisgICAgZW1pdChmLCAiXHRPUiAgXHQgJXMgJXMgJXNcbiIscmVnbmFtZXNbUjBdLCByZWduYW1lc1tGUF0sIHJlZ25hbWVzW1NQXSk7IC8vcmVzdG9yZSBTUCBmcm9tIEZQCisgICAgZW1pdChmLCAiXHRQT1AgXHQgJXNcbiIsIHJlZ25hbWVzW0ZQXSk7IC8vcmVzdG9yZSBvbGQgRlAgZnJvbSBzdGFjaworCisgICAgLy9yZXR1cm4KKyAgICBpZigodi0+dGF0dHIpJklOVEVSUlVQVCl7CisgICAgICAgIGVtaXQoZiwgIlx0UkVUSVxuIik7CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIGVtaXQoZiwgIlx0UkVUXG4iKTsKKyAgICB9Cit9CisKKy8qCisgKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIDxzaXplPiBieXRlcyBvZiBzdG9yYWdlCisgKiAgaW5pdGlhbGl6ZWQgd2l0aCB6ZXJvLgorICovCit2b2lkIGdlbl9kcyhGSUxFICpmLHptYXggc2l6ZSxzdHJ1Y3QgVHlwICp0KXsKKyAgICAjaWZkZWYgREVCVUdfTUFSSworICAgIHByaW50ZigiQ2FsbGVkIGdlbl9kcyhGSUxFICpmLHptYXggc2l6ZSxzdHJ1Y3QgVHlwICp0KVxuIik7CisgICAgI2VuZGlmCisgICAgZW1pdChmLCAiXHQuRFMgXHQlbGRcbiIsIHptMmwoc2l6ZSkpOworfQorCisvKgorICogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIG1ha2Ugc3VyZSB0aGUgbmV4dCBkYXRhIGlzCisgKiAgYWxpZ25lZCB0byBtdWx0aXBsZXMgb2YgPGFsaWduPiBieXRlcy4KKyAqLwordm9pZCBnZW5fYWxpZ24oRklMRSAqZix6bWF4IGFsaWduKXt9CisKKy8qCisgKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIHRoZSBoZWFkIG9mIGEgdmFyaWFibGUKKyAqICBkZWZpbml0aW9uLCBpLmUuIHRoZSBsYWJlbCBhbmQgaW5mb3JtYXRpb24gZm9yCisgKiAgbGlua2FnZSBldGMuCisgKi8KK3ZvaWQgZ2VuX3Zhcl9oZWFkKEZJTEUgKmYsc3RydWN0IFZhciAqdil7CisgICAgI2lmZGVmIERFQlVHX01BUksKKyAgICBwcmludGYoIkNhbGxlZCBnZW5fdmFyX2hlYWQoRklMRSAqZixzdHJ1Y3QgVmFyICp2KVxuIik7CisgICAgI2VuZGlmCisKKyAgICBzd2l0Y2goKHYtPnN0b3JhZ2VfY2xhc3MpICYgKFNUQVRJQ3xFWFRFUk58QVVUT3xSRUdJU1RFUikpeworICAgICAgICBjYXNlIFNUQVRJQzoKKyAgICAgICAgICAgICNpZmRlZiBERUJVR19NQVJLCisgICAgICAgICAgICBwcmludGYoIlx0SGF2ZSB0byBlbWl0IHN0YXRpYyB2YXJpYWJsZSBoZWFkLlxuIik7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIGVtaXQoZiwiTF8lbGQ6XG4iLCB6bTJsKHYtPm9mZnNldCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVhURVJOOgorICAgICAgICAgICAgI2lmZGVmIERFQlVHX01BUksKKyAgICAgICAgICAgIHByaW50ZigiXHRIYXZlIHRvIGVtaXQgZXh0ZXJuIHZhcmlhYmxlIGhlYWQuXG4iKTsKKyAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICBpZih2LT5mbGFncyYoREVGSU5FRHxURU5UQVRJVkUpKXsKKyAgICAgICAgICAgICAgICBlbWl0KGYsIi5FWFBPUlQgXHQgJXNcbiIsIHYtPmlkZW50aWZpZXIpOworICAgICAgICAgICAgICAgIGVtaXQoZiwiJXM6XG4iLCB2LT5pZGVudGlmaWVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgZW1pdChmLCIuSU1QT1JUIFx0ICVzXG4iLCB2LT5pZGVudGlmaWVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgI2lmZGVmIERFQlVHX01BUksKKyAgICAgICAgICAgIHByaW50ZigiXHRDYW50IGdlbmVyYXRlIGhlYWQsIHVua25vd24gc3RvcmFnZSBjbGFzczogJWRcbiIsIHYtPnN0b3JhZ2VfY2xhc3MpOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIGllcnJvcigwKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKgorICogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSBzdGF0aWMgc3RvcmFnZQorICogIGluaXRpYWxpemVkIHdpdGggY29uc3QtbGlzdCBwLgorICovCit2b2lkIGdlbl9kYyhGSUxFICpmLGludCB0LHN0cnVjdCBjb25zdF9saXN0ICpwKXsKKyAgICAjaWZkZWYgREVCVUdfTUFSSworICAgIHByaW50ZigiQ2FsbGVkIGdlbl9kYyhGSUxFICpmLGludCB0LHN0cnVjdCBjb25zdF9saXN0ICpwKVxuIik7CisgICAgI2VuZGlmCisKKyAgICBpZighcC0+dHJlZSl7CisgICAgICAgIGlmKElTRkxPQVQodCkpeworICAgICAgICAgICAgZW1pdChmLCJcdC5EQVQgXHQgIik7CisgICAgICAgICAgICBlbWl0KGYsIjB4JXgiLCAqKHVuc2lnbmVkIGludCopJnAtPnZhbCk7CisgICAgICAgICAgICBlbWl0KGYsIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZXsKKyAgICAgICAgICAgIGVtaXQoZiwiXHQuREFUIFx0ICIpOworICAgICAgICAgICAgZW1pdHZhbChmLCZwLT52YWwsdCZOVSk7CisgICAgICAgICAgICBlbWl0KGYsIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZXsKKyAgICAgICAgZW1pdChmLCJcdC5EQVQgXHQgIik7CisgICAgICAgIHN0cnVjdCBjb25zdF9saXN0ICpwX25leHQgPSBwOworICAgICAgICBmb3IoO3BfbmV4dDtwX25leHQ9cF9uZXh0LT5uZXh0KXsKKyAgICAgICAgICAgIGVtaXR2YWwoZiwmcF9uZXh0LT52YWwsdCZOVSk7CisgICAgICAgICAgICBlbWl0KGYsICIgIik7CisgICAgICAgIH0KKyAgICAgICAgZW1pdChmLCAiXG4iKTsKKyAgICB9Cit9CisKKy8vdGhpcyBpcyBmb3IgZGVidWcsIG5vdCBuZWVkZWQgbm93Cit2b2lkIGluaXRfZGIoRklMRSAqZil7fQordm9pZCBjbGVhbnVwX2RiKEZJTEUgKmYpe30KKworaW50IHJlZ19wYXJtKHN0cnVjdCByZWdfaGFuZGxlICptLCBzdHJ1Y3QgVHlwICp0LGludCB2YXJhcmcsc3RydWN0IFR5cCAqZCl7CisgICAgLy90aGlzIHdpbGwgcHV0IGFsbCBhcmd1bWVudHMgaW50byBzdGFjaworICAgIHJldHVybiAwOworfQorCisvKgorICogUmV0dXJucyAwIGlmIHRoZSByZWdpc3RlciBpcyBubyByZWdpc3RlciBwYWlyLiBJZiByCisgKiBpcyBhIHJlZ2lzdGVyIHBhaXIgbm9uLXplcm8gd2lsbCBiZSByZXR1cm5lZCBhbmQgdGhlCisgKiBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBwIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHR3bworICogZWxlbWVudHMuCisgKi8KK2ludCByZWdfcGFpcihpbnQgcixzdHJ1Y3QgcnBhaXIgKnApeworICAgIHJldHVybiAwOworfQorCit2b2lkIGNvbXBhcmUoRklMRSAqZiwgc3RydWN0IElDICpwKXsKKworICAgIGludCBxMXJlZyA9IDA7CisgICAgaW50IHEycmVnID0gMDsKKworICAgIC8vbG9hZCBvcGVyYW5kcyBpbnRvIFIxIGFuZCBSMgorICAgIGlmKCgocC0+cTEuZmxhZ3MpICYgKEtPTlNUfFZBUnxSRUd8RFJFRk9CSnxWQVJBRFIpKSAhPSBSRUcpeworICAgICAgICBsb2FkX2ludG9fcmVnKGYsIFIxLCAmKHAtPnExKSwgcC0+dHlwZiwgUjMpOworICAgICAgICBxMXJlZyA9IFIxOworICAgIH0KKyAgICBlbHNleworICAgICAgICBxMXJlZyA9IHAtPnExLnJlZzsKKyAgICB9CisKKyAgICBpZigocC0+Y29kZSkgIT0gVEVTVCl7CisgICAgICAgIGlmKCgocC0+cTIuZmxhZ3MpICYgKEtPTlNUfFZBUnxSRUd8RFJFRk9CSnxWQVJBRFIpKSAhPSBSRUcpeworICAgICAgICAgICAgbG9hZF9pbnRvX3JlZyhmLCBSMiwgJihwLT5xMiksIHAtPnR5cGYsIFIzKTsKKyAgICAgICAgICAgIHEycmVnID0gUjI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZXsKKyAgICAgICAgICAgIHEycmVnID0gcC0+cTIucmVnOworICAgICAgICB9CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIHEycmVnID0gUjI7CisgICAgICAgIGVtaXQoZiwgIlx0T1IgIFx0ICVzICVzICVzXG4iLHJlZ25hbWVzW1IwXSwgcmVnbmFtZXNbUjBdLCByZWduYW1lc1tSMl0pOworICAgIH0KKworICAgIC8vZmluZCBicmFuY2ggSUMKKyAgICBzdHJ1Y3QgSUMgKmJyYW5jaF9pYzsKKyAgICBicmFuY2hfaWMgPSBwLT5uZXh0OworICAgIHdoaWxlKGJyYW5jaF9pYyAmJiAoKGJyYW5jaF9pYy0+Y29kZSkgPT0gRlJFRVJFRykgKSB7CisgICAgICAgIGJyYW5jaF9pYyA9IGJyYW5jaF9pYy0+bmV4dDsKKyAgICB9CisKKyAgICAvL2VtaXQgY29tcGFyZSBjb2RlCisgICAgaWYgKCgocC0+dHlwZikgJiBGTE9BVCkgPT0gRkxPQVQgfHwgKChwLT50eXBmKSAmIERPVUJMRSkgPT0gRE9VQkxFIHx8ICgocC0+dHlwZikgJiBMRE9VQkxFKSA9PSBMRE9VQkxFKXsKKyAgICAgICAgc3dpdGNoKGJyYW5jaF9pYy0+Y29kZSl7CisgICAgICAgICAgICBjYXNlIEJFUToKKyAgICAgICAgICAgICAgICBlbWl0KGYsICJcdENNUEYgXHQgRVEgJXMgJXMgUjRcbiIsIHJlZ25hbWVzW3ExcmVnXSwgcmVnbmFtZXNbcTJyZWddKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQk5FOgorICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0Q01QRiBcdCBORVEgJXMgJXMgUjRcbiIsIHJlZ25hbWVzW3ExcmVnXSwgcmVnbmFtZXNbcTJyZWddKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxUOgorICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0Q01QRiBcdCBMICVzICVzIFI0XG4iLCByZWduYW1lc1txMXJlZ10sIHJlZ25hbWVzW3EycmVnXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJHRToKKyAgICAgICAgICAgICAgICBlbWl0KGYsICJcdENNUEYgXHQgR0UgJXMgJXMgUjRcbiIsIHJlZ25hbWVzW3ExcmVnXSwgcmVnbmFtZXNbcTJyZWddKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFOgorICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0Q01QRiBcdCBMRSAlcyAlcyBSNFxuIiwgcmVnbmFtZXNbcTFyZWddLCByZWduYW1lc1txMnJlZ10pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCR1Q6CisgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRDTVBGIFx0IEcgJXMgJXMgUjRcbiIsIHJlZ25hbWVzW3ExcmVnXSwgcmVnbmFtZXNbcTJyZWddKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWVycm9yKDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIHN3aXRjaChicmFuY2hfaWMtPmNvZGUpeworICAgICAgICAgICAgY2FzZSBCRVE6CisgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRDTVBJIFx0IEVRICVzICVzIFI0XG4iLCByZWduYW1lc1txMXJlZ10sIHJlZ25hbWVzW3EycmVnXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJORToKKyAgICAgICAgICAgICAgICBlbWl0KGYsICJcdENNUEkgXHQgTkVRICVzICVzIFI0XG4iLCByZWduYW1lc1txMXJlZ10sIHJlZ25hbWVzW3EycmVnXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJMVDoKKyAgICAgICAgICAgICAgICBpZigocC0+dHlwZiAmIFVOU0lHTkVEKSA9PSBVTlNJR05FRCl7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0Q01QSSBcdCBMVSAlcyAlcyBSNFxuIiwgcmVnbmFtZXNbcTFyZWddLCByZWduYW1lc1txMnJlZ10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdENNUEkgXHQgTCAlcyAlcyBSNFxuIiwgcmVnbmFtZXNbcTFyZWddLCByZWduYW1lc1txMnJlZ10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkdFOgorICAgICAgICAgICAgICAgIGlmKChwLT50eXBmICYgVU5TSUdORUQpID09IFVOU0lHTkVEKXsKKyAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRDTVBJIFx0IEdFVSAlcyAlcyBSNFxuIiwgcmVnbmFtZXNbcTFyZWddLCByZWduYW1lc1txMnJlZ10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdENNUEkgXHQgR0UgJXMgJXMgUjRcbiIsIHJlZ25hbWVzW3ExcmVnXSwgcmVnbmFtZXNbcTJyZWddKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJMRToKKyAgICAgICAgICAgICAgICBpZigocC0+dHlwZiAmIFVOU0lHTkVEKSA9PSBVTlNJR05FRCl7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0Q01QSSBcdCBMRVUgJXMgJXMgUjRcbiIsIHJlZ25hbWVzW3ExcmVnXSwgcmVnbmFtZXNbcTJyZWddKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRDTVBJIFx0IExFICVzICVzIFI0XG4iLCByZWduYW1lc1txMXJlZ10sIHJlZ25hbWVzW3EycmVnXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCR1Q6CisgICAgICAgICAgICAgICAgaWYoKHAtPnR5cGYgJiBVTlNJR05FRCkgPT0gVU5TSUdORUQpeworICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdENNUEkgXHQgR1UgJXMgJXMgUjRcbiIsIHJlZ25hbWVzW3ExcmVnXSwgcmVnbmFtZXNbcTJyZWddKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRDTVBJIFx0IEcgJXMgJXMgUjRcbiIsIHJlZ25hbWVzW3ExcmVnXSwgcmVnbmFtZXNbcTJyZWddKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGllcnJvcigwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBsb2FkX2ludG9fcmVnKEZJTEUgKmYsIGludCBkZXN0X3JlZywgc3RydWN0IG9iaiAqbywgaW50IHR5cGUsIGludCB0bXBfcmVnKXsKKyAgICBzd2l0Y2goKG8tPmZsYWdzKSAmIChLT05TVHxWQVJ8UkVHfERSRUZPQkp8VkFSQURSKSl7CisgICAgICAgIGNhc2UgS09OU1Q6CisgICAgICAgICAgICBsb2FkX2NvbnMoZiwgZGVzdF9yZWcsIG8tPnZhbC52bWF4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIChLT05TVHxEUkVGT0JKKToKKyAgICAgICAgICAgIC8vcGxhY2UgbWVtb3J5IGxvY2F0aW9uIGNvbnN0YW50IHBvaW50IHRvIGludG8gcmVnaXN0ZXIKKyAgICAgICAgICAgIGVtaXQoZiwgIlx0TEQgIFx0ICIpOworICAgICAgICAgICAgZW1pdHZhbChmLCAmKG8tPnZhbCksIHR5cGUpOworICAgICAgICAgICAgZW1pdChmLCAiICVzXG4iLCByZWduYW1lc1tkZXN0X3JlZ10pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHOgorICAgICAgICAgICAgLy9tb3ZlIGJldHdlZW4gcmVnaXN0ZXJzCisgICAgICAgICAgICBpZigoby0+cmVnKSAhPSBkZXN0X3JlZyl7CisgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRPUiAgXHQgJXMgJXMgJXNcbiIscmVnbmFtZXNbUjBdLCByZWduYW1lc1tvLT5yZWddLCByZWduYW1lc1tkZXN0X3JlZ10pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVkFSOgorICAgICAgICAgICAgLy9wdXQgdmFsdWUgb2YgdmFyaWFibGUgaW50byByZWdpc3RlcgorCisgICAgICAgICAgICBzd2l0Y2goKG8tPnYtPnN0b3JhZ2VfY2xhc3MpICYgKFNUQVRJQ3xFWFRFUk58QVVUT3xSRUdJU1RFUikpeworICAgICAgICAgICAgICAgIGNhc2UgU1RBVElDOgorICAgICAgICAgICAgICAgICAgICBpZih6bTJsKG8tPnZhbC52bWF4KSAhPSAwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0TVZJQSBcdCAlcyBMXyVsZFxuIiwgcmVnbmFtZXNbZGVzdF9yZWddLCB6bTJsKG8tPnYtPm9mZnNldCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9jb25zKGYsIHRtcF9yZWcsIHptMmwoby0+dmFsLnZtYXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0QUREIFx0ICVzICVzICVzXG4iLCByZWduYW1lc1tkZXN0X3JlZ10sIHJlZ25hbWVzW3RtcF9yZWddLCByZWduYW1lc1t0bXBfcmVnXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdExESSBcdCAlcyAlc1xuIiwgcmVnbmFtZXNbdG1wX3JlZ10sIHJlZ25hbWVzW2Rlc3RfcmVnXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0TEQgXHQgTF8lbGQgJXNcbiIsIHptMmwoby0+di0+b2Zmc2V0KSwgcmVnbmFtZXNbZGVzdF9yZWddKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVYVEVSTjoKKyAgICAgICAgICAgICAgICAgICAgaWYoem0ybChvLT52YWwudm1heCkgIT0gMCl7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdE1WSUEgXHQgJXMgJXNcbiIsIHJlZ25hbWVzW2Rlc3RfcmVnXSwgby0+di0+aWRlbnRpZmllcik7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX2NvbnMoZiwgdG1wX3JlZywgem0ybChvLT52YWwudm1heCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRBREQgXHQgJXMgJXMgJXNcbiIsIHJlZ25hbWVzW2Rlc3RfcmVnXSwgcmVnbmFtZXNbdG1wX3JlZ10sIHJlZ25hbWVzW3RtcF9yZWddKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0TERJIFx0ICVzICVzXG4iLCByZWduYW1lc1t0bXBfcmVnXSwgcmVnbmFtZXNbZGVzdF9yZWddKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRMRCBcdCAlcyAlc1xuIiwgby0+di0+aWRlbnRpZmllciAsIHJlZ25hbWVzW2Rlc3RfcmVnXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBVVRPOgorICAgICAgICAgICAgICAgICAgICBpZigoby0+di0+b2Zmc2V0KSA8IDApeworICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIGlzIGFyZ3VtZW50CisgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX2NvbnMoZiwgZGVzdF9yZWcsICh6bTJsKG8tPnYtPm9mZnNldCkvKC0xTCkpKzIrem0ybChvLT52YWwudm1heCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRBREQgXHQgJXMgJXMgJXNcbiIsIHJlZ25hbWVzW2Rlc3RfcmVnXSxyZWduYW1lc1tGUF0sIHJlZ25hbWVzW3RtcF9yZWddKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0TERJIFx0ICVzICVzXG4iLCByZWduYW1lc1t0bXBfcmVnXSwgcmVnbmFtZXNbZGVzdF9yZWddKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIGlzIGF1dG8gdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSB6bTJsKG8tPnYtPm9mZnNldCkrem0ybChvLT52YWwudm1heCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKG9mZnNldCA9PSAwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdExESSBcdCAlcyAlc1xuIiwgcmVnbmFtZXNbRlBdLCByZWduYW1lc1tkZXN0X3JlZ10pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihvZmZzZXQgPT0gMSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRERUMgXHQgJXMgJXNcbiIsIHJlZ25hbWVzW0ZQXSwgcmVnbmFtZXNbdG1wX3JlZ10pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0TERJIFx0ICVzICVzXG4iLCByZWduYW1lc1t0bXBfcmVnXSwgcmVnbmFtZXNbZGVzdF9yZWddKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9jb25zKGYsIGRlc3RfcmVnLCBvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0U1VCIFx0ICVzICVzICVzXG4iLCByZWduYW1lc1tGUF0scmVnbmFtZXNbZGVzdF9yZWddLCByZWduYW1lc1t0bXBfcmVnXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRMREkgXHQgJXMgJXNcbiIsIHJlZ25hbWVzW3RtcF9yZWddLCByZWduYW1lc1tkZXN0X3JlZ10pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgI2lmZGVmIERFQlVHX01BUksKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcdEhhdmUgdG8gbG9hZCB2YXJpYWJsZSB0aGF0IGlzIG5vdCBzdGF0aWMsIGV4dGVybiBvciBhdXRvLCB0aGlzIGlzIG5vdCBpbXBsZW1lbnRlZCFcbiIpOworICAgICAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICAgICBpZXJyb3IoMCk7CisgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgKFZBUnxSRUcpOgorICAgICAgICAgICAgaWYoKG8tPnJlZykgIT0gZGVzdF9yZWcpeworICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0T1IgIFx0ICVzICVzICVzXG4iLCByZWduYW1lc1tSMF0sIHJlZ25hbWVzW28tPnJlZ10sIHJlZ25hbWVzW2Rlc3RfcmVnXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAoUkVHfERSRUZPQkopOgorICAgICAgICAgICAgLy9wb2ludCBpbnRvIG1lbW9yeSB3aXRoIHJlZ2lzdGVyIHZhbHVlCisKKyAgICAgICAgICAgIGVtaXQoZiwgIlx0TERJIFx0ICVzICVzXG4iLCByZWduYW1lc1tvLT5yZWddLCByZWduYW1lc1tkZXN0X3JlZ10pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgKFZBUnxEUkVGT0JKKToKKyAgICAgICAgICAgIC8vdXNlIHZhcmlhYmxlIHZhbHVlIGFzIHBvaW50ZXIgdG8gbWVtb3J5CisKKyAgICAgICAgICAgIHN3aXRjaCgoby0+di0+c3RvcmFnZV9jbGFzcykgJiAoU1RBVElDfEVYVEVSTnxBVVRPfFJFR0lTVEVSKSl7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFUSUM6CisgICAgICAgICAgICAgICAgICAgIGlmKHptMmwoby0+dmFsLnZtYXgpICE9IDApeworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRNVklBIFx0ICVzIExfJWxkXG4iLCByZWduYW1lc1tkZXN0X3JlZ10sIHptMmwoby0+di0+b2Zmc2V0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX2NvbnMoZiwgdG1wX3JlZywgem0ybChvLT52YWwudm1heCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRBREQgXHQgJXMgJXMgJXNcbiIsIHJlZ25hbWVzW2Rlc3RfcmVnXSwgcmVnbmFtZXNbdG1wX3JlZ10sIHJlZ25hbWVzW2Rlc3RfcmVnXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdExESSBcdCAlcyAlc1xuIiwgcmVnbmFtZXNbZGVzdF9yZWddLCByZWduYW1lc1t0bXBfcmVnXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0TEQgIFx0IExfJWxkICVzXG4iLCB6bTJsKG8tPnYtPm9mZnNldCksIHJlZ25hbWVzW3RtcF9yZWddKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdExESSBcdCAlcyAlc1xuIiwgcmVnbmFtZXNbdG1wX3JlZ10sIHJlZ25hbWVzW2Rlc3RfcmVnXSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRVhURVJOOgorICAgICAgICAgICAgICAgICAgICBpZih6bTJsKG8tPnZhbC52bWF4KSAhPSAwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0TVZJQSBcdCAlcyAlc1xuIiwgcmVnbmFtZXNbZGVzdF9yZWddLCBvLT52LT5pZGVudGlmaWVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfY29ucyhmLCB0bXBfcmVnLCB6bTJsKG8tPnZhbC52bWF4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdEFERCBcdCAlcyAlcyAlc1xuIiwgcmVnbmFtZXNbZGVzdF9yZWddLCByZWduYW1lc1t0bXBfcmVnXSwgcmVnbmFtZXNbZGVzdF9yZWddKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0TERJIFx0ICVzICVzXG4iLCByZWduYW1lc1tkZXN0X3JlZ10sIHJlZ25hbWVzW3RtcF9yZWddKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRMRCBcdCAlcyAlc1xuIiwgby0+di0+aWRlbnRpZmllciAsIHJlZ25hbWVzW3RtcF9yZWddKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdExESSBcdCAlcyAlc1xuIiwgcmVnbmFtZXNbdG1wX3JlZ10sIHJlZ25hbWVzW2Rlc3RfcmVnXSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgaWYoKG8tPnYtPm9mZnNldCkgPCAwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBpcyBhcmd1bWVudAorICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9jb25zKGYsIGRlc3RfcmVnLCAoem0ybChvLT52LT5vZmZzZXQpLygtMUwpKSsyK3ptMmwoby0+dmFsLnZtYXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0QUREIFx0ICVzICVzICVzXG4iLCByZWduYW1lc1tkZXN0X3JlZ10scmVnbmFtZXNbRlBdLCByZWduYW1lc1t0bXBfcmVnXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdExESSBcdCAlcyAlc1xuIiwgcmVnbmFtZXNbdG1wX3JlZ10sIHJlZ25hbWVzW2Rlc3RfcmVnXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBpcyBhdXRvIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gem0ybChvLT52LT5vZmZzZXQpK3ptMmwoby0+dmFsLnZtYXgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZihvZmZzZXQgPT0gMCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRMREkgXHQgJXMgJXNcbiIsIHJlZ25hbWVzW0ZQXSwgcmVnbmFtZXNbZGVzdF9yZWddKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYob2Zmc2V0ID09IDEpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0REVDIFx0ICVzICVzXG4iLCByZWduYW1lc1tGUF0sIHJlZ25hbWVzW3RtcF9yZWddKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdExESSBcdCAlcyAlc1xuIiwgcmVnbmFtZXNbdG1wX3JlZ10sIHJlZ25hbWVzW2Rlc3RfcmVnXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfY29ucyhmLCBkZXN0X3JlZywgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdFNVQiBcdCAlcyAlcyAlc1xuIiwgcmVnbmFtZXNbRlBdLHJlZ25hbWVzW2Rlc3RfcmVnXSwgcmVnbmFtZXNbdG1wX3JlZ10pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0TERJIFx0ICVzICVzXG4iLCByZWduYW1lc1t0bXBfcmVnXSwgcmVnbmFtZXNbZGVzdF9yZWddKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICNpZmRlZiBERUJVR19NQVJLCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXHRIYXZlIHRvIGxvYWQgdmFyaWFibGUgdGhhdCBpcyBub3Qgc3RhdGljLCBleHRlcm4gb3IgYXV0bywgdGhpcyBpcyBub3QgaW1wbGVtZW50ZWQhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgaWVycm9yKDApOworICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVtaXQoZiwgIlx0TERJIFx0ICVzICVzXG4iLCByZWduYW1lc1tkZXN0X3JlZ10sIHJlZ25hbWVzW3RtcF9yZWddKTsKKyAgICAgICAgICAgIGVtaXQoZiwgIlx0T1IgIFx0IFIwICVzICVzXG4iLCByZWduYW1lc1t0bXBfcmVnXSwgcmVnbmFtZXNbZGVzdF9yZWddKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgKFZBUnxSRUd8RFJFRk9CSik6CisgICAgICAgICAgICBpZigoby0+cmVnKSAhPSBkZXN0X3JlZyl7CisgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRPUiAgXHQgJXMgJXMgJXNcbiIscmVnbmFtZXNbUjBdLCByZWduYW1lc1tvLT5yZWddLCByZWduYW1lc1t0bXBfcmVnXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbWl0KGYsICJcdExESSBcdCAlcyAlc1xuIiwgcmVnbmFtZXNbdG1wX3JlZ10sIHJlZ25hbWVzW2Rlc3RfcmVnXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAoVkFSfFZBUkFEUik6CisgICAgICAgICAgICAvL2ludG8gZGVzdF9yZWcgc3RvcmUgYWRkcmVzcyBvZiB2YXJpYWJsZQorICAgICAgICAgICAgc3dpdGNoKChvLT52LT5zdG9yYWdlX2NsYXNzKSAmIChTVEFUSUN8RVhURVJOKSl7CisgICAgICAgICAgICAgICAgY2FzZSBFWFRFUk46CisgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0TVZJQSBcdCAlcyAlc1xuIiwgcmVnbmFtZXNbZGVzdF9yZWddLCBvLT52LT5pZGVudGlmaWVyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFUSUM6CisgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0TVZJQSBcdCAlcyBMXyVsZFxuIiwgcmVnbmFtZXNbZGVzdF9yZWddLCB6bTJsKG8tPnYtPm9mZnNldCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiAvL3RoaXMgaXMgcG9pbnRsZXNzIHN0b3JhZ2VfY2xhc3MgY2FuIGJlIG9ubHkgc3RhdGljIG9yIGV4dGVybiB3aXRoIFZBUkFEUgorICAgICAgICAgICAgICAgICAgICBpZXJyb3IoMCk7CisgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgICAgICAvL3RoaXMgaXMgdXNlZnVsIHdoZW4gb2JqZWN0IGlzIGFycmF5IGFuZCB3ZSB3YW50IGFkcmVzIG9mIG5vbmZpcnN0IGVsZW1lbnQKKyAgICAgICAgICAgIGlmKG8tPnZhbC52bWF4ID4gMCl7CisgICAgICAgICAgICAgICAgbG9hZF9jb25zKGYsIHRtcF9yZWcsIG8tPnZhbC52bWF4KTsKKyAgICAgICAgICAgICAgICBlbWl0KGYsICJcdEFERCBcdCAlcyAlcyAlc1xuIiwgcmVnbmFtZXNbZGVzdF9yZWddLCByZWduYW1lc1t0bXBfcmVnXSwgcmVnbmFtZXNbZGVzdF9yZWddKTsgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICNpZmRlZiBERUJVR19NQVJLCisgICAgICAgICAgICBwcmludGYoIlx0U29tZXRoaW5nIGlzIHdyb25nIHdoaWxlIGFjdXJpbmcgb3BlcmFuZCFcbiIpOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIGllcnJvcigwKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIHN0b3JlX2Zyb21fcmVnKEZJTEUgKmYsIGludCBzb3VyY2VfcmVnLCBzdHJ1Y3Qgb2JqICpvLCBpbnQgdHlwZSwgaW50IHRtcF9yZWcsIGludCB0bXBfcmVnX2IpeworICAgIHN3aXRjaCgoby0+ZmxhZ3MpICYgKEtPTlNUfFZBUnxSRUd8RFJFRk9CSnxWQVJBRFIpKXsKKyAgICAgICAgY2FzZSBLT05TVDoKKyAgICAgICAgICAgIC8vSG93IGNhbiBJIHN0b3JlIHJlZ2lzdGVyIGludG8gS09OU1Q/IQorICAgICAgICAgICAgaWVycm9yKDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgKEtPTlNUfERSRUZPQkopOgorICAgICAgICAgICAgLy91c2Uga29uc3RhbnQgYXMgcG9pbnRlciBpbnRvIG1lbW9yeQorICAgICAgICAgICAgZW1pdChmLCAiXHRTVCAgXHQgJXMgIiwgcmVnbmFtZXNbc291cmNlX3JlZ10pOworICAgICAgICAgICAgZW1pdHZhbChmLCAmKG8tPnZhbCksIHR5cGUpOworICAgICAgICAgICAgZW1pdChmLCAiXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFRzoKKyAgICAgICAgICAgIC8vbW92ZSBmcm9tIHJlZ2lzdGVyIGludG8gcmVnaXN0ZXIKKyAgICAgICAgICAgIGlmKHNvdXJjZV9yZWcgIT0gKG8tPnJlZykpeworICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0T1IgIFx0ICVzICVzICVzXG4iLHJlZ25hbWVzW1IwXSwgcmVnbmFtZXNbc291cmNlX3JlZ10sIHJlZ25hbWVzW28tPnJlZ10pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVkFSOgorICAgICAgICAgICAgLy9sb2FkIHJlZ2lzdGVyIGludG8gdmFyaWFibGUKKyAgICAgICAgICAgIHN3aXRjaCgoby0+di0+c3RvcmFnZV9jbGFzcykgJiAoU1RBVElDfEVYVEVSTnxBVVRPfFJFR0lTVEVSKSl7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFUSUM6CisgICAgICAgICAgICAgICAgICAgIGlmKHptMmwoby0+dmFsLnZtYXgpICE9IDApeworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRNVklBIFx0ICVzIExfJWxkXG4iLCByZWduYW1lc1t0bXBfcmVnXSwgem0ybChvLT52LT5vZmZzZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfY29ucyhmLCB0bXBfcmVnX2IsIHptMmwoby0+dmFsLnZtYXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0QUREIFx0ICVzICVzICVzXG4iLCByZWduYW1lc1t0bXBfcmVnXSwgcmVnbmFtZXNbdG1wX3JlZ19iXSwgcmVnbmFtZXNbdG1wX3JlZ10pOworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRTVEkgXHQgJXMgJXNcbiIsIHJlZ25hbWVzW3NvdXJjZV9yZWddLCByZWduYW1lc1t0bXBfcmVnXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0U1QgIFx0ICVzIExfJWxkXG4iLCByZWduYW1lc1tzb3VyY2VfcmVnXSwgem0ybChvLT52LT5vZmZzZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVYVEVSTjoKKyAgICAgICAgICAgICAgICAgICAgaWYoem0ybChvLT52YWwudm1heCkgIT0gMCl7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdE1WSUEgXHQgJXMgJXNcbiIsIHJlZ25hbWVzW3RtcF9yZWddLCBvLT52LT5pZGVudGlmaWVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfY29ucyhmLCB0bXBfcmVnX2IsIHptMmwoby0+dmFsLnZtYXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0QUREIFx0ICVzICVzICVzXG4iLCByZWduYW1lc1t0bXBfcmVnXSwgcmVnbmFtZXNbdG1wX3JlZ19iXSwgcmVnbmFtZXNbdG1wX3JlZ10pOworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRTVEkgXHQgJXMgJXNcbiIsIHJlZ25hbWVzW3NvdXJjZV9yZWddLCByZWduYW1lc1t0bXBfcmVnXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0U1QgIFx0ICVzICVzXG4iLCByZWduYW1lc1tzb3VyY2VfcmVnXSwgby0+di0+aWRlbnRpZmllcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBVVRPOgorICAgICAgICAgICAgICAgICAgICBpZigoby0+di0+b2Zmc2V0KSA8IDApeworICAgICAgICAgICAgICAgICAgICAgICAgLy9mdW5jdGlvbiBhcmd1bWVudAorICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9jb25zKGYsIHRtcF9yZWcsICh6bTJsKG8tPnYtPm9mZnNldCkvKC0xTCkpKzIrem0ybChvLT52YWwudm1heCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRBREQgXHQgJXMgJXMgJXNcbiIsIHJlZ25hbWVzW3RtcF9yZWddLHJlZ25hbWVzW0ZQXSwgcmVnbmFtZXNbdG1wX3JlZ10pOworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRTVEkgXHQgJXMgJXNcbiIsIHJlZ25hbWVzW3NvdXJjZV9yZWddLCByZWduYW1lc1t0bXBfcmVnXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vYXV0byB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IHptMmwoby0+di0+b2Zmc2V0KSt6bTJsKG8tPnZhbC52bWF4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gMCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRTVEkgXHQgJXMgJXNcbiIsIHJlZ25hbWVzW3NvdXJjZV9yZWddLCByZWduYW1lc1tGUF0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihvZmZzZXQgPT0gMSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRERUMgXHQgJXMgJXNcbiIsIHJlZ25hbWVzW0ZQXSwgcmVnbmFtZXNbdG1wX3JlZ10pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0U1RJIFx0ICVzICVzXG4iLCByZWduYW1lc1tzb3VyY2VfcmVnXSwgcmVnbmFtZXNbdG1wX3JlZ10pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX2NvbnMoZiwgdG1wX3JlZywgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdFNVQiBcdCAlcyAlcyAlc1xuIiwgcmVnbmFtZXNbRlBdLHJlZ25hbWVzW3RtcF9yZWddLCByZWduYW1lc1t0bXBfcmVnXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRTVEkgXHQgJXMgJXNcbiIsIHJlZ25hbWVzW3NvdXJjZV9yZWddLCByZWduYW1lc1t0bXBfcmVnXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgI2lmZGVmIERFQlVHX01BUksKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcdEhhdmUgdG8gc3RvcmUgaW50byB2YXJpYWJsZSB0aGF0IGlzIG5vdCBzdGF0aWMsIGV4dGVybiBvciBhdXRvLCB0aGlzIGlzIG5vdCBpbXBsZW1lbnRlZCFcbiIpOworICAgICAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICAgICBpZXJyb3IoMCk7CisgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIChWQVJ8UkVHKToKKyAgICAgICAgICAgIGVtaXQoZiwgIlx0T1IgICBcdCAlcyAlcyAlc1xuIiwgcmVnbmFtZXNbUjBdLCByZWduYW1lc1tzb3VyY2VfcmVnXSwgcmVnbmFtZXNbby0+cmVnXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAoUkVHfERSRUZPQkopOgorICAgICAgICAgICAgLy91c2UgdmFsdWUgaW4gcmVnaXN0ZXIgYXMgcG9pbnRlciBpbnRvIG1lbW9yeQorICAgICAgICAgICAgZW1pdChmLCAiXHRTVEkgXHQgJXMgJXNcbiIsIHJlZ25hbWVzW3NvdXJjZV9yZWddLCByZWduYW1lc1tvLT5yZWddKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIChWQVJ8RFJFRk9CSik6CisgICAgICAgICAgICAvL3VzZSB2YWx1ZSBpbiB2YXJpYWJsZSBhcyBwb2ludGVyIGludG8gbWVtb3J5CisgICAgICAgICAgICBzd2l0Y2goKG8tPnYtPnN0b3JhZ2VfY2xhc3MpICYgKFNUQVRJQ3xFWFRFUk58QVVUT3xSRUdJU1RFUikpeworICAgICAgICAgICAgICAgIGNhc2UgU1RBVElDOgorICAgICAgICAgICAgICAgICAgICBpZih6bTJsKG8tPnZhbC52bWF4KSAhPSAwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0TVZJQSBcdCAlcyBMXyVsZFxuIiwgcmVnbmFtZXNbdG1wX3JlZ10sIHptMmwoby0+di0+b2Zmc2V0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX2NvbnMoZiwgdG1wX3JlZ19iLCB6bTJsKG8tPnZhbC52bWF4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdEFERCBcdCAlcyAlcyAlc1xuIiwgcmVnbmFtZXNbdG1wX3JlZ10sIHJlZ25hbWVzW3RtcF9yZWdfYl0sIHJlZ25hbWVzW3RtcF9yZWdfYl0pOworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRMREkgXHQgJXMgJXNcbiIsIHJlZ25hbWVzW3RtcF9yZWdfYl0sIHJlZ25hbWVzW3RtcF9yZWddKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRMRCAgXHQgTF8lbGQgJXNcbiIsIHptMmwoby0+di0+b2Zmc2V0KSwgcmVnbmFtZXNbdG1wX3JlZ10pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0U1RJIFx0ICVzICVzXG4iLCByZWduYW1lc1tzb3VyY2VfcmVnXSwgcmVnbmFtZXNbdG1wX3JlZ10pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVYVEVSTjoKKyAgICAgICAgICAgICAgICAgICAgaWYoem0ybChvLT52YWwudm1heCkgIT0gMCl7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdE1WSUEgXHQgJXMgJXNcbiIsIHJlZ25hbWVzW3RtcF9yZWddLCBvLT52LT5pZGVudGlmaWVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfY29ucyhmLCB0bXBfcmVnX2IsIHptMmwoby0+dmFsLnZtYXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0QUREIFx0ICVzICVzICVzXG4iLCByZWduYW1lc1t0bXBfcmVnXSwgcmVnbmFtZXNbdG1wX3JlZ19iXSwgcmVnbmFtZXNbdG1wX3JlZ19iXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdExESSBcdCAlcyAlc1xuIiwgcmVnbmFtZXNbdG1wX3JlZ19iXSwgcmVnbmFtZXNbdG1wX3JlZ10pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdExEICBcdCAlcyAlc1xuIiwgby0+di0+aWRlbnRpZmllciwgcmVnbmFtZXNbdG1wX3JlZ10gKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdFNUSSBcdCAlcyAlc1xuIiwgcmVnbmFtZXNbc291cmNlX3JlZ10sIHJlZ25hbWVzW3RtcF9yZWddKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBVVRPOgorICAgICAgICAgICAgICAgICAgICBpZigoby0+di0+b2Zmc2V0KSA8IDApeworICAgICAgICAgICAgICAgICAgICAgICAgLy9mdW5jdGlvbiBhcmd1bWVudAorICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9jb25zKGYsIHRtcF9yZWcsICh6bTJsKG8tPnYtPm9mZnNldCkvKC0xTCkpKzIrem0ybChvLT52YWwudm1heCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRBREQgXHQgJXMgJXMgJXNcbiIsIHJlZ25hbWVzW3RtcF9yZWddLHJlZ25hbWVzW0ZQXSwgcmVnbmFtZXNbdG1wX3JlZ19iXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdExESSBcdCAlcyAlc1xuIiwgcmVnbmFtZXNbdG1wX3JlZ19iXSwgcmVnbmFtZXNbdG1wX3JlZ10pOworICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRTVEkgXHQgJXMgJXNcbiIsIHJlZ25hbWVzW3NvdXJjZV9yZWddLCByZWduYW1lc1t0bXBfcmVnXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vYXV0byB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IHptMmwoby0+di0+b2Zmc2V0KSt6bTJsKG8tPnZhbC52bWF4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKG9mZnNldCA9PSAwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdExESSBcdCAlcyAlc1xuIiwgcmVnbmFtZXNbRlBdLCByZWduYW1lc1t0bXBfcmVnX2JdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYob2Zmc2V0ID09IDEpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0REVDIFx0ICVzICVzXG4iLCByZWduYW1lc1tGUF0sIHJlZ25hbWVzW3RtcF9yZWdfYl0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0TERJIFx0ICVzICVzXG4iLCByZWduYW1lc1t0bXBfcmVnX2JdLCByZWduYW1lc1t0bXBfcmVnXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfY29ucyhmLCB0bXBfcmVnLCBvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0U1VCIFx0ICVzICVzICVzXG4iLCByZWduYW1lc1tGUF0scmVnbmFtZXNbdG1wX3JlZ10sIHJlZ25hbWVzW3RtcF9yZWddKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdExESSBcdCAlcyAlc1xuIiwgcmVnbmFtZXNbdG1wX3JlZ10sIHJlZ25hbWVzW3RtcF9yZWdfYl0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRTVEkgXHQgJXMgJXNcbiIsIHJlZ25hbWVzW3NvdXJjZV9yZWddLCByZWduYW1lc1t0bXBfcmVnX2JdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAjaWZkZWYgREVCVUdfTUFSSworICAgICAgICAgICAgICAgICAgICBwcmludGYoIlx0SGF2ZSB0byBzdG9yZSBpbnRvIHZhcmlhYmxlIHRoYXQgaXMgbm90IHN0YXRpYywgZXh0ZXJuIG9yIGF1dG8sIHRoaXMgaXMgbm90IGltcGxlbWVudGVkIVxuIik7CisgICAgICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgICAgIGllcnJvcigwKTsKKyAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgKFZBUnxSRUd8RFJFRk9CSik6CisgICAgICAgICAgICBlbWl0KGYsICJcdFNUSSBcdCAlcyAlc1xuIiwgcmVnbmFtZXNbc291cmNlX3JlZ10sIHJlZ25hbWVzW28tPnJlZ10pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgKFZBUnxWQVJBRFIpOiAvL3VzZSB2YXJpYWJsZSBhZGRyZXNzIGFzIHBvaW50ZXIKKyAgICAgICAgICAgIHN3aXRjaChvLT52LT5zdG9yYWdlX2NsYXNzKXsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRJQzoKKyAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRNVklBIFx0ICVzIExfJWxkXG4iLCByZWduYW1lc1t0bXBfcmVnXSwgem0ybChvLT52LT5vZmZzZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRTVEkgXHQgJXMgJXNcbiIsIHJlZ25hbWVzW3NvdXJjZV9yZWddLCByZWduYW1lc1t0bXBfcmVnXSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRVhURVJOOgorICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdE1WSUEgXHQgJXMgJXNcbiIsIHJlZ25hbWVzW3RtcF9yZWddLCBvLT52LT5pZGVudGlmaWVyKTsKKyAgICAgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRTVEkgXHQgJXMgJXNcbiIsIHJlZ25hbWVzW3NvdXJjZV9yZWddLCByZWduYW1lc1t0bXBfcmVnXSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vY2FuIGJlIG9ubHkgc3RhdGljIG9yIGV4dGVybgorICAgICAgICAgICAgICAgICAgICBpZXJyb3IoMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAjaWZkZWYgREVCVUdfTUFSSworICAgICAgICAgICAgcHJpbnRmKCJcdENhbnQgc3RvcmUgcmVnIGludG8gb2JqZWN0LCB1bmtub3duIG9iamVjdCFcbiIpOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIGllcnJvcigwKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIGFyaXRobWV0aWMoRklMRSAqZiwgc3RydWN0IElDICpwKXsKKyAgICBpbnQgcTFyZWcgPSAwOworICAgIGludCBxMnJlZyA9IDA7CisKKyAgICBpbnQgenJlZyA9IDA7CisgICAgaW50IG1vdmV6ID0gMDsKKworICAgIGludCB1bmFyeSA9IDA7CisKKyAgICBpbnQgaXN1bnNpZ25lZCA9IDA7CisgICAgaWYgKCgocC0+dHlwZikgJiBVTlNJR05FRCkgPT0gVU5TSUdORUQpeworICAgICAgICBpc3Vuc2lnbmVkID0gMTsKKyAgICB9CisKKyAgICBpZigoKHAtPmNvZGUpID09IE1JTlVTKSB8fCAoKHAtPmNvZGUpID09IEtPTVBMRU1FTlQpKXsKKyAgICAgICAgdW5hcnkgPSAxOworICAgIH0KKworICAgIC8vbG9hZCBmaXJzdCBvcGVyYW5kCisgICAgaWYoKChwLT5xMS5mbGFncykgJiAoS09OU1R8VkFSfFJFR3xEUkVGT0JKfFZBUkFEUikpID09IFJFRyl7CisgICAgICAgIHExcmVnID0gcC0+cTEucmVnOworICAgIH0KKyAgICBlbHNleworICAgICAgICBsb2FkX2ludG9fcmVnKGYsIFIxLCAmKHAtPnExKSwgcC0+dHlwZiwgUjMpOworICAgICAgICBxMXJlZyA9IFIxOworICAgIH0KKworICAgIC8vbG9hZCBzZWNvbmQgb3BlcmFuZAorICAgIGlmKHVuYXJ5ICE9IDEpeworICAgICAgICBpZigoKHAtPnEyLmZsYWdzKSAmIChLT05TVHxWQVJ8UkVHfERSRUZPQkp8VkFSQURSKSkgPT0gUkVHKXsKKyAgICAgICAgICAgIHEycmVnID0gcC0+cTIucmVnOworICAgICAgICB9CisgICAgICAgIGVsc2V7CisgICAgICAgICAgICBsb2FkX2ludG9fcmVnKGYsIFIyLCAmKHAtPnEyKSwgcC0+dHlwZiwgUjMpOworICAgICAgICAgICAgcTJyZWcgPSBSMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vcHJlcGFyZSB0YXJnZXQgcmVnaXN0ZXIKKyAgICBpZigoKHAtPnouZmxhZ3MpICYgKEtPTlNUfFZBUnxSRUd8RFJFRk9CSnxWQVJBRFIpKSA9PSBSRUcpeworICAgICAgICB6cmVnID0gcC0+ei5yZWc7CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIHpyZWcgPSBSMTsKKyAgICAgICAgbW92ZXogPSAxOworICAgIH0KKworICAgIGlmICgoKHAtPnR5cGYpICYgRkxPQVQpID09IEZMT0FUIHx8ICgocC0+dHlwZikgJiBET1VCTEUpID09IERPVUJMRSB8fCAoKHAtPnR5cGYpICYgTERPVUJMRSkgPT0gTERPVUJMRSl7CisgICAgICAgIHN3aXRjaChwLT5jb2RlKXsKKyAgICAgICAgICAgIGNhc2UgQUREOgorICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0RkFERCBcdCAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1VCOgorICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0RlNVQiBcdCAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVVMVDoKKyAgICAgICAgICAgICAgICBlbWl0KGYsICJcdEZNVUwgXHQgIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERJVjoKKyAgICAgICAgICAgICAgICBlbWl0KGYsICJcdEZESVYgXHQgIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JTlVTOgorICAgICAgICAgICAgICAgIGxvYWRfY29ucyhmLCBSMiwgMHgzZjgwMDAwMCk7CisgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRTVUIgXHQgIik7CisgICAgICAgICAgICAgICAgdW5hcnkgPSAwOworICAgICAgICAgICAgICAgIHEycmVnID0gUjI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICNpZmRlZiBERUJVR19NQVJLCisgICAgICAgICAgICAgICAgcHJpbnRmKCJUaGlzIGlzIG5vdCBpbXBsZW1lbnRlZCFcbiIpOworICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgaWVycm9yKDApOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2V7CisKKyAgICAgICAgLy9lbWl0IGluc3RydWN0aW9uIG9wY29kZQorICAgICAgICBzd2l0Y2gocC0+Y29kZSl7CisgICAgICAgICAgICBjYXNlIE9SOgorICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0T1IgIFx0ICIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBYT1I6CisgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRYT1IgXHQgIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFORDoKKyAgICAgICAgICAgICAgICBlbWl0KGYsICJcdEFORCBcdCAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTFNISUZUOgorICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0TFNMIFx0ICIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSU0hJRlQ6CisgICAgICAgICAgICAgICAgaWYoaXN1bnNpZ25lZCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0TFNSIFx0ICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdEFTUiBcdCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFERDoKKyAgICAgICAgICAgICAgICBlbWl0KGYsICJcdEFERCBcdCAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1VCOgorICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0U1VCIFx0ICIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNVUxUOgorICAgICAgICAgICAgICAgIGlmKGlzdW5zaWduZWQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdE1VTFUgXHQgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0TVVMIFx0ICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRElWOgorICAgICAgICAgICAgICAgIGlmKGlzdW5zaWduZWQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdERJVlUgXHQgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0RElWIFx0ICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTU9EOgorICAgICAgICAgICAgICAgIGlmKGlzdW5zaWduZWQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBlbWl0KGYsICJcdFJFTVUgXHQgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0UkVNIFx0ICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQURESTJQOgorICAgICAgICAgICAgICAgIGVtaXQoZiwgIlx0QUREIFx0ICIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVUJJRlA6CisgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRTVUIgXHQgIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNVQlBGUDoKKyAgICAgICAgICAgICAgICBlbWl0KGYsICJcdFNVQiBcdCAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgICAgICAgICAgZW1pdChmLCAiXHRERUMgXHQgIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEtPTVBMRU1FTlQ6CisgICAgICAgICAgICAgICAgZW1pdChmLCAiXHROT1QgXHQgIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICNpZmRlZiBERUJVR19NQVJLCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcdFBhc3NlZCBpbnZhbGlkIElDIGludG8gYXJpdGhtZXRpYygpXG5cdHAtPmNvZGU6ICVkXG4iLCBwLT5jb2RlKTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIGllcnJvcigwKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vZW1pdCBpbnN0cnVjdGlvbiBhcmd1bWVudHMKKyAgICBpZih1bmFyeSAhPSAxKXsKKyAgICAgICAgZW1pdChmLCAiJXMgJXMgJXNcbiIsIHJlZ25hbWVzW3ExcmVnXSwgcmVnbmFtZXNbcTJyZWddLCByZWduYW1lc1t6cmVnXSk7CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIGVtaXQoZiwgIiVzICVzXG4iLCByZWduYW1lc1txMXJlZ10sIHJlZ25hbWVzW3pyZWddKTsKKyAgICB9CisKKyAgICBpZihtb3ZleiA9PSAxKXsKKyAgICAgICAgc3RvcmVfZnJvbV9yZWcoZiwgUjEsICYocC0+eiksIHAtPnR5cGYsIFIyLCBSMyk7CisgICAgfQorfQorCit2b2lkIGxvYWRfY29ucyhGSUxFICpmLCBpbnQgcmVnLCBsb25nIGludCB2YWx1ZSl7CisgICAgaWYodmFsdWUgPT0gMCl7CisgICAgICAgIGVtaXQoZiwgIlx0T1IgIFx0IFIwIFIwICVzXG4iLCByZWduYW1lc1tyZWddKTsKKyAgICB9CisgICAgZWxzZSBpZigoMTY3NzcyMTYgPiB2YWx1ZSkgJiYgKHZhbHVlID4gMCkpeworICAgICAgICBlbWl0KGYsICJcdE1WSUEgXHQgJXMgJWxkXG4iLCByZWduYW1lc1tyZWddLCB2YWx1ZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHZhbHVlID4gMCl7CisgICAgICAgIGVtaXQoZiwgIlx0Lk1WSSBcdCAlcyAlbGRcbiIsIHJlZ25hbWVzW3JlZ10sIHZhbHVlKTsKKyAgICB9CisgICAgZWxzZXsKKyAgICAgICAgZW1pdChmLCAiXHQuTVZJIFx0ICVzIDB4JXhcbiIsIHJlZ25hbWVzW3JlZ10sIHZhbHVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tYWNoaW5lcy9tYXJrL21hY2hpbmUuZHQgYi9tYWNoaW5lcy9tYXJrL21hY2hpbmUuZHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMwYTUzYwotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL21hcmsvbWFjaGluZS5kdApAQCAtMCwwICsxLDE1IEBACitTMzJCU0xFIFMzMkJTQkUKK1MzMkJVTEUgUzMyQlVCRQorUzMyQlNMRSBTMzJCU0JFCitTMzJCVUxFIFMzMkJVQkUKK1MzMkJTTEUgUzMyQlNCRQorUzMyQlVMRSBTMzJCVUJFCitTMzJCU0xFIFMzMkJTQkUKK1MzMkJVTEUgUzMyQlVCRQorUzMyQlNMRSBTMzJCU0JFCitTMzJCVUxFIFMzMkJVQkUKK1MzMkJJRUVFTEUgUzMyQklFRUVCRQorUzMyQklFRUVMRSBTMzJCSUVFRUJFCitTMzJCSUVFRUxFIFMzMkJJRUVFQkUKK1MzMkJVTEUgUzMyQlVCRQorCmRpZmYgLS1naXQgYS9tYWNoaW5lcy9tYXJrL21hY2hpbmUuaCBiL21hY2hpbmVzL21hcmsvbWFjaGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxM2U2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9tYXJrL21hY2hpbmUuaApAQCAtMCwwICsxLDkzIEBACisjaW5jbHVkZSAiZHQuaCIKKworLy9iZXogc3BlY2nDoWxuw61jaCBhZHJlc27DrWNoIG1vZHUKK3N0cnVjdCBBZGRyZXNzaW5nTW9kZSB7CisgICAgaW50IG5ldmVyX3VzZWQ7Cit9OworCitzdHJ1Y3QgcmVnX2hhbmRsZSB7CisgIGludCBncHI7Cit9OworCisvLyBzZW0gbmFjcGF0IHBvxI1ldCByZWdpc3Ryxa8sIGFsZSBjbyBTUCwgUEMgYSBaZXJvIHJlZz8gVG8ganNvdSBzcGVjLiByZWdpc3RyeQorLy8ga3RlcsOpIGtvbXBpbMOhdG9yIG5lbcWvxb5lIGplbiB0YWsgcG91xb7DrXZhdAorI2RlZmluZSBNQVhSIDE2CisKKy8vIHBvxI1ldCBhcmd1bWVudMWvLCBuZW3DoW0gxb7DoWRuw6kgYWxlIGRva3UgdHZyZMOtIMW+ZSB0IGkgdGFrIG11c8OtIGLDvXQgTUFYR0YgMQorI2RlZmluZSBNQVhHRiAxCisKKy8vbcWvxb5lIGLDvXQgZHJ1aMO9IG9wZXJhbmQgSUMgc3Rlam7DvSBqYWtvIGPDrWw/IDAtYW5vIDEtbmUKKyNkZWZpbmUgVVNFUTJBU1ogMAorCisvL0EgY28gbcOhbSBqYWtvIGt1cnZhIGTDoXQgc2VtPyEgWmt1c8OtbSBDSEFSIGtkecW+IHRvIG5lYnVkZSBmdW5nb3ZhdCBkZWogdGFtIElOVCEKKyNkZWZpbmUgTUlOQURESTJQIENIQVIKKworLy8gZGFsxaHDrSB3dGYhIE1vamUgYXJjaCB0b2hsZSBuZcWZZcWhw60sIHRhayB0YW0gcHJvc3TEmyBwcnNrbmVtZSBtYWzDqWhvIGluZGnDoW5hCisjZGVmaW5lIEJJR0VORElBTiAwCisjZGVmaW5lIExJVFRMRUVORElBTiAxCisKKy8vc3dpdGNoZSBjaGNpIGNvbXBpbG92YXQgbmEgQ09NUEFSRS9CRVEgbmlrb2xpdiBuYSBTVUIvVEVTVC9CRVEKKyNkZWZpbmUgU1dJVENIU1VCUyAwCisKKy8vIG9ixaFsZWhudXRvIHogZ2VuZXJpYywgdGFkeSB0b2hvIGplIHbFr2JlYyBob2RuxJsgb2LFoWxlaG51dMOpaG8KKyNkZWZpbmUgSU5MSU5FTUVNQ1BZIDEwMjQKKworLy8gcmV2ZXJzZSBhcmd1bWVudCBwdXNoIG9yZGVyCisvLyNkZWZpbmUgT1JERVJFRF9QVVNIIDAKKworLy8gYXJndW1lbnR5IGtsaWRuxJsgZG8gcmVnaXN0csWvCisjZGVmaW5lIEhBVkVfUkVHUEFSTVMgMQorCisvL25lbcOhbSByZWdpc3Ryb3bDqSBww6FyeQorI3VuZGVmIEhBVkVfUkVHUEFJUlMKKworLy9uw7MsIGFsZSB6dmhsZWRlbSBrIHRvbXUgxb5lIGxvbmcgYSBpbnQgamUgbmEgbWVqIGFyY2ggc3Rlam7DvSB0YWsgamUgdG8gYXNpIGsgcHJkdSBhbGUgYnVkacW+CisjdW5kZWYgSEFWRV9JTlRfU0laRVQKKworLy8gYSB0ZcSPIHR5IHNyYcSNa3kgcHJvIHBlZXBob2xlIG9wdGltYWxpemFjZSwgdHkgZMSbbGF0IG5lYnVkdSB0YWsganNlbSB0b2hsZSBvYsWhbGVobCB6IGdlbmVyaWMKKworLyogc2l6ZSBvZiBidWZmZXIgZm9yIGFzbS1vdXRwdXQsIHRoaXMgY2FuIGJlIHVzZWQgdG8gZG8KKyAgIHBlZXBob2xlLW9wdGltaXphdGlvbnMgb2YgdGhlIGdlbmVyYXRlZCBhc3NlbWJseS1vdXRwdXQgKi8KKyNkZWZpbmUgRU1JVF9CVUZfTEVOIDEwMjQgLyogc2hvdWxkIGJlIGVub3VnaCAqLworLyogbnVtYmVyIG9mIGFzbS1vdXRwdXQgbGluZXMgYnVmZmVyZWQgKi8KKyNkZWZpbmUgRU1JVF9CVUZfREVQVEggNAorLyogIFdlIGhhdmUgbm8gYXNtX3BlZXBob2xlIHRvIG9wdGltaXplIGFzc2VtYmx5LW91dHB1dCAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9QRUVQSE9MRSAwCisKKworLy8gdG9obGUgamUgemF0w61tIGsgaG92bnUgcG96ZMSbamkgc2UgdG8gYWxlIG3Fr8W+ZSBob2RpdAorI2RlZmluZSBIQVZFX1RBUkdFVF9BVFRSSUJVVEVTCisjZGVmaW5lIEhBVkVfVEFSR0VUX1BSQUdNQVMKKworI3VuZGVmIEhBVkVfUkVHU19NT0RJRklFRCAvL25lcG9kcG9ydWppIGludGVycHJvY2VkdXJhbCByZWdpc3RlciBhbGxvY2F0aW9uCisKKy8vdG9obGUgamUgZG9icsO9IHBybyBDUFUgcyByZWdpc3RyYW1hIGNvIG1hasOtIHBldm7EmyBkYW5vdSBmdW5rY2ksIG1vamUgYXJjaCBqZSBvcnRvZ29uw6FsbsOtIGHFviBixJtkYSB0YWsgdG8gbmVtdXPDrW0gxZllxaFpdAorI3VuZGVmIEhBVkVfVEFSR0VUX1JBTExPQworCisvLyBwcm8gbcSbIHpieXRlxI1uw6ksIGplIHRvIHBybyBhcHRpbWFsaXphY2kKKyN1bmRlZiBIQVZFX0VYVF9JQworCisvL3RvaGxlIGplIHNyYW5kYSwgZG9rdSBzZSB0dSBvZGthenVqZSBuYSBrYXBpdG9sdSBrdGVyw6EgbmVuw60gbmFwc2Fuw6EsIG5pY23DqW7EmywgZXh0ZXJuw60gdHlweSBuZXBvdMWZZWJ1amVtZQorI3VuZGVmIEhBVkVfRVhUX1RZUEVTCisKKyN1bmRlZiBIQVZFX1RHVF9QUklOVFZBTCAvL3RvaGxlIGplIHN0ZWpuw6EgIHNyYcSNa2EgamFrbyB0YSB2ZWrFoSwga2RvIHbDrSBrIMSNZW11IHRvIGplIGFsZSBuZWNoY2kgdG8KKworLy8gbm8sIG5lbcOhbSBww6FydSBqYWsgdG8gbmFzdGF2aXQgdGFrIGplIHRvIG9ixaFsZWhudXTDqQorI2RlZmluZSBKVU1QX1RBQkxFX0RFTlNJVFkgMC44CisjZGVmaW5lIEpVTVBfVEFCTEVfTEVOR1RIIDEyCisKKy8qIHRvdG8gamUgcHJvIHZhcmlhYmxlIGxlbmdodCBhcnJheXMgKG51dG5vIHBvdcW+w610IC1jOTkpIHphdMOtbSB0byBqZWJ1LCBzcG91c3RhIGFyY2hpdGVrdHVyIHRvIHRha3kgbmVtw6EKKyNkZWZpbmUgQUxMT0NWTEFfUkVHIDxyZWc+CisjZGVmaW5lIEFMTE9DVkxBX0lOTElORUFTTSA8aW5saW5lIGFzbT4KKyNkZWZpbmUgRlJFRVZMQV9SRUcgPHJlZz4KKyNkZWZpbmUgRlJFRVZMQV9JTkxJTkVBU00gPGlubGluZSBhc20+CisjZGVmaW5lIE9MRFNQVkxBX0lOTElORUFTTSA8aW5saW5lIGFzbT4KKyNkZWZpbmUgRlBWTEFfUkVHIDxyZWc+CisqLworCisvL3RvaGxlIGplIHBybyBuYWhyYXplbsOtIHNsb8W+aXTEm2rFocOtY2ggb3BlcmFjw60gdm9sw6HDrW0gZG8ga25paG92ZW4gLSBzdXBlciB2xJtjIGFsZSB6YXTDrW0gdG8gamVidSBhIGJ1ZHUgZ2VuZXJvdmF0IG1ha3JhCisjdW5kZWYgSEFWRV9MSUJDQUxMUworCisvLyB3aG8gY2FyZXM/CisjZGVmaW5lIEFWT0lEX0ZMT0FUX1RPX1VOU0lHTkVEIDEKKyNkZWZpbmUgQVZPSURfVU5TSUdORURfVE9fRkxPQVQgMQpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvbWVzc2lhaHRyb24vbWFjaGluZS5jIGIvbWFjaGluZXMvbWVzc2lhaHRyb24vbWFjaGluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY3NWRmM2YKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9tZXNzaWFodHJvbi9tYWNoaW5lLmMKQEAgLTAsMCArMSwyNzE3IEBACisvKiAgRXhhbXBsZSBiYWNrZW5kIGZvciB2YmNjLCBpdCBtb2RlbHMgYSBnZW5lcmljIDMyYml0IFJJU0Mgb3IgQ0lTQw0KK0NQVS4NCisNCitDb25maWd1cmFibGUgYXQgYnVpbGQtdGltZSBhcmU6DQorLSBudW1iZXIgb2YgKDMyYml0KSBnZW5lcmFsLXB1cnBvc2UtcmVnaXN0ZXJzDQorLSBudW1iZXIgb2YgKDY0Yml0KSBmbG9hdGluZy1wb2ludC1yZWdpc3RlcnMNCistIG51bWJlciBvZiAoOGJpdCkgY29uZGl0aW9uLWNvZGUtcmVnaXN0ZXJzDQorLSBtZWNoYW5pc20gZm9yIHN0YWNrLWFyZ3VtZW50cyAobW92aW5nIG90IGZpeGVkIHNwKQ0KKw0KK0l0IGFsbG93cyB0byBzZWxlY3QgYXMgcnVuLXRpbWUtb3B0aW9uczoNCistIHR3by0gb3IgdGhyZWUtYWRkcmVzcyBjb2RlDQorLSBtZW1vcnkgb3BlcmFuZHMgb3IgbG9hZC1zdG9yZS1hcmNoaXRlY3R1cmUNCistIG51bWJlciBvZiByZWdpc3Rlci1hcmd1bWVudHMNCistIG51bWJlciBvZiBjYWxsZXItc2F2ZS1yZWdpc3RlcnMNCisqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorI2luY2x1ZGUgIi4uLy4uL3N1cHAuaCINCisNCitzdGF0aWMgY2hhciBGSUxFX1tdPV9fRklMRV9fOw0KKw0KKy8qICBQdWJsaWMgZGF0YSB0aGF0IE1VU1QgYmUgdGhlcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKw0KKy8qIE5hbWUgYW5kIGNvcHlyaWdodC4gKi8NCitjaGFyIGNnX2NvcHlyaWdodFtdPSJ2YmNjIE1lc3NpYWh0cm9uIGNvZGUtZ2VuZXJhdG9yICJfX0RBVEVfXyIgKGMpIGluIDIwMDggYnkgQW5kcmV3IFByaWNlIjsNCisNCisvKiAgQ29tbWFuZGxpbmUtZmxhZ3MgdGhlIGNvZGUtZ2VuZXJhdG9yIGFjY2VwdHM6DQorMDoganVzdCBhIGZsYWcNCitWQUxGTEFHOiBhIHZhbHVlIG11c3QgYmUgc3BlY2lmaWVkDQorU1RSSU5HRkxBRzogYSBzdHJpbmcgY2FuIGJlIHNwZWNpZmllZA0KK0ZVTkNGTEFHOiBhIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkDQorYXBhcnQgZnJvbSBGVU5DRkxBRywgYWxsIG90aGVyIHZlcnNpb25zIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBvbmNlICovDQoraW50IGdfZmxhZ3NbTUFYR0ZdPXswLDAsDQorVkFMRkxBRyxWQUxGTEFHLFZBTEZMQUcsDQorMCwwLA0KK1ZBTEZMQUcsVkFMRkxBRywwfTsNCisNCisvKiB0aGUgZmxhZy1uYW1lLCBkbyBub3QgdXNlIG5hbWVzIGJlZ2lubmluZyB3aXRoIGwsIEwsIEksIEQgb3IgVSwgYmVjYXVzZQ0KK3RoZXkgY29sbGlkZSB3aXRoIHRoZSBmcm9udGVuZCAqLw0KK2NoYXIgKmdfZmxhZ3NfbmFtZVtNQVhHRl09eyJ0aHJlZS1hZGRyIiwibG9hZC1zdG9yZSIsDQorInZvbGF0aWxlLWdwcnMiLCJ2b2xhdGlsZS1mcHJzIiwidm9sYXRpbGUtY2NycyIsDQorImltbS1pbmQiLCJncHItaW5kIiwNCisiZ3ByLWFyZ3MiLCJmcHItYXJncyIsInVzZS1jb21tb25zIn07DQorDQorLyogdGhlIHJlc3VsdHMgb2YgcGFyc2luZyB0aGUgY29tbWFuZC1saW5lLWZsYWdzIHdpbGwgYmUgc3RvcmVkIGhlcmUgKi8NCit1bmlvbiBwcGkgZ19mbGFnc192YWxbTUFYR0ZdOw0KKw0KKy8qICBBbGlnbm1lbnQtcmVxdWlyZW1lbnRzIGZvciBhbGwgdHlwZXMgaW4gYnl0ZXMuICAgICAgICAgICAgICAqLw0KK3ptYXggYWxpZ25bTUFYX1RZUEUrMV07DQorDQorLyogIEFsaWdubWVudCB0aGF0IGlzIHN1ZmZpY2llbnQgZm9yIGV2ZXJ5IG9iamVjdC4gICAgICAgICAgICAgICovDQorem1heCBtYXhhbGlnbjsNCisNCisvKiAgQ0hBUl9CSVQgZm9yIHRoZSB0YXJnZXQgbWFjaGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCit6bWF4IGNoYXJfYml0Ow0KKw0KKy8qICBzaXplcyBvZiB0aGUgYmFzaWMgdHlwZXMgKGluIGJ5dGVzKSAqLw0KK3ptYXggc2l6ZXRhYltNQVhfVFlQRSsxXTsNCisNCisvKiAgTWluaW11bSBhbmQgTWF4aW11bSB2YWx1ZXMgZWFjaCB0eXBlIGNhbiBoYXZlLiAgICAgICAgICAgICAgKi8NCisvKiAgTXVzdCBiZSBpbml0aWFsaXplZCBpbiBpbml0X2NnKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCit6bWF4IHRfbWluW01BWF9UWVBFKzFdOw0KK3p1bWF4IHRfbWF4W01BWF9UWVBFKzFdOw0KK3p1bWF4IHR1X21heFtNQVhfVFlQRSsxXTsNCisNCisvKiAgTmFtZXMgb2YgYWxsIHJlZ2lzdGVycy4gd2lsbCBiZSBpbml0aWFsaXplZCBpbiBpbml0X2NnKCksDQorcmVnaXN0ZXIgbnVtYmVyIDAgaXMgaW52YWxpZCwgdmFsaWQgcmVnaXN0ZXJzIHN0YXJ0IGF0IDEgKi8NCitjaGFyICpyZWduYW1lc1tNQVhSKzFdOw0KKw0KKy8qICBUaGUgU2l6ZSBvZiBlYWNoIHJlZ2lzdGVyIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KK3ptYXggcmVnc2l6ZVtNQVhSKzFdOw0KKw0KKy8qICBhIHR5cGUgd2hpY2ggY2FuIHN0b3JlIGVhY2ggcmVnaXN0ZXIuICovDQorc3RydWN0IFR5cCAqcmVndHlwZVtNQVhSKzFdOw0KKw0KKy8qICByZWdzYVtyZWddIT0wIGlmIGEgY2VydGFpbiByZWdpc3RlciBpcyBhbGxvY2F0ZWQgYW5kIHNob3VsZCAqLw0KKy8qICBub3QgYmUgdXNlZCBieSB0aGUgY29tcGlsZXIgcGFzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KK2ludCByZWdzYVtNQVhSKzFdOw0KKw0KKy8qICBTcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXJzIG1heSBiZSBzY3JhdGNoZWQgYnkgZnVuY3Rpb25zLiAgICAqLw0KK2ludCByZWdzY3JhdGNoW01BWFIrMV07DQorDQorLyogc3BlY2lmaWVzIHRoZSBwcmlvcml0eSBmb3IgdGhlIHJlZ2lzdGVyLWFsbG9jYXRvciwgaWYgdGhlIHNhbWUNCitlc3RpbWF0ZWQgY29zdC1zYXZpbmcgY2FuIGJlIG9idGFpbmVkIGJ5IHNldmVyYWwgcmVnaXN0ZXJzLCB0aGUNCitvbmUgd2l0aCB0aGUgaGlnaGVzdCBwcmlvcml0eSB3aWxsIGJlIHVzZWQgKi8NCitpbnQgcmVnX3ByaW9bTUFYUisxXTsNCisNCisvKiBhbiBlbXB0eSByZWctaGFuZGxlIHJlcHJlc2VudGluZyBpbml0aWFsIHN0YXRlICovDQorc3RydWN0IHJlZ19oYW5kbGUgZW1wdHlfcmVnX2hhbmRsZT17MCwwfTsNCisNCisvKiBOYW1lcyBvZiB0YXJnZXQtc3BlY2lmaWMgdmFyaWFibGUgYXR0cmlidXRlcy4gICAgICAgICAgICAgICAgKi8NCitjaGFyICpnX2F0dHJfbmFtZVtdPXsiX19pbnRlcnJ1cHQiLDB9Ow0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8qICBQcml2YXRlIGRhdGEgYW5kIGZ1bmN0aW9ucy4gICAgICAgICAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNkZWZpbmUgVEhSRUVfQUREUiAoZ19mbGFnc1swXSZVU0VERkxBRykNCisjZGVmaW5lIExPQURfU1RPUkUgKGdfZmxhZ3NbMV0mVVNFREZMQUcpDQorLy8jZGVmaW5lIFZPTF9GSVhFRCAgIE5VTV9GSVhFRA0KKyNkZWZpbmUgVk9MXzE2QklUICAgKChnX2ZsYWdzWzNdJlVTRURGTEFHKT9nX2ZsYWdzX3ZhbFszXS5sOk5VTV8xNkJJVC8yKQ0KKyNkZWZpbmUgVk9MXzMyQklUICAgKChnX2ZsYWdzWzRdJlVTRURGTEFHKT9nX2ZsYWdzX3ZhbFs0XS5sOk5VTV8zMkJJVC8yKQ0KKyNkZWZpbmUgVk9MXzY0QklUICAgKChnX2ZsYWdzWzRdJlVTRURGTEFHKT9nX2ZsYWdzX3ZhbFs1XS5sOk5VTV82NEJJVC8yKQ0KKyNkZWZpbmUgVk9MXzhCSVQgICAoKGdfZmxhZ3NbNF0mVVNFREZMQUcpP2dfZmxhZ3NfdmFsWzZdLmw6TlVNXzhCSVQvMikNCisjZGVmaW5lIElNTV9JTkQgICAgKChnX2ZsYWdzWzVdJlVTRURGTEFHKT8xOjApDQorI2RlZmluZSBHUFJfSU5EICAgICgoZ19mbGFnc1s2XSZVU0VERkxBRyk/MjowKQ0KKy8vI2RlZmluZSBBUkdTOCAgICgoZ19mbGFnc1s3XSZVU0VERkxBRyk/Z19mbGFnc192YWxbN10ubDoxKQ0KKy8vI2RlZmluZSBBUkdTMTYgICAoKGdfZmxhZ3NbN10mVVNFREZMQUcpP2dfZmxhZ3NfdmFsWzddLmw6MCkNCisvLyNkZWZpbmUgQVJHUzMyICAgKChnX2ZsYWdzWzddJlVTRURGTEFHKT9nX2ZsYWdzX3ZhbFs3XS5sOjApDQorLy8jZGVmaW5lIEFSR1M2NCAgICgoZ19mbGFnc1s3XSZVU0VERkxBRyk/Z19mbGFnc192YWxbN10ubDowKQ0KKy8vICNkZWZpbmUgRlBSX0FSR1MgICAoKGdfZmxhZ3NbOF0mVVNFREZMQUcpP2dfZmxhZ3NfdmFsWzhdLmw6MCkNCisvLyNkZWZpbmUgVVNFX0NPTU1PTlMgKGdfZmxhZ3NbOV0mVVNFREZMQUcpDQorDQorDQorLyogYWxpZ25tZW50IG9mIGJhc2ljIGRhdGEtdHlwZXMsIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbGlnbltdICovDQorc3RhdGljIGxvbmcgbWFsaWduW01BWF9UWVBFKzFdPXsxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDF9Ow0KKy8qIHNpemVzIG9mIGJhc2ljIGRhdGEtdHlwZXMsIHVzZWQgdG8gaW5pdGlhbGl6ZSBzaXpldGFiW10gKi8NCitzdGF0aWMgbG9uZyBtc2l6ZXRhYltNQVhfVFlQRSsxXT17MCwxLDIsNCw0LDgsNCw4LDgsMCw0LDAsMCwwLDQsMH07DQorDQorLyogdXNlZCB0byBpbml0aWFsaXplIHJlZ3R5cFtdICovDQorc3RhdGljIHN0cnVjdCBUeXAgbGxvbmc9e0xMT05HfSxsdHlwPXtMT05HfSxsc2hvcnQ9e1NIT1JUfSxsY2hhcj17Q0hBUn07DQorDQorLyogbWFjcm9zIGRlZmluZWQgYnkgdGhlIGJhY2tlbmQgKi8NCitzdGF0aWMgY2hhciAqbWFycmF5W109eyJfX3NlY3Rpb24oeCk9X192YXR0cihcInNlY3Rpb24oXCIjeFwiKVwiKSIsDQorIl9fR0VORVJJQ19fIiwNCiswfTsNCisNCisvKiBzcGVjaWFsIHJlZ2lzdGVycyAqLw0KK3N0YXRpYyBpbnQgc3A7ICAgICAgICAgICAgICAgICAgICAgLyogIFN0YWNrcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICovDQorc3RhdGljIGludCB0OGJpdDEsdDhiaXQyOyAgICAgICAgICAgICAgIC8qICB0ZW1wb3JhcnkgZ3BycyAqLw0KK3N0YXRpYyBpbnQgdDE2Yml0MSx0MTZiaXQyOw0KK3N0YXRpYyBpbnQgdDMyYml0MSx0MzJiaXQyOw0KK3N0YXRpYyBpbnQgdDY0Yml0MSx0NjRiaXQyOw0KKw0KKyNkZWZpbmUgZHQodCkgKCgodCkmVU5TSUdORUQpP3VkdFsodCkmTlFdOnNkdFsodCkmTlFdKQ0KK3N0YXRpYyBjaGFyICpzZHRbTUFYX1RZUEUrMV09eyI/PyIsImMiLCJzIiwiaSIsImwiLCJsbCIsImYiLCJkIiwibGQiLCJ2IiwicCJ9Ow0KK3N0YXRpYyBjaGFyICp1ZHRbTUFYX1RZUEUrMV09eyI/PyIsInVjIiwidXMiLCJ1aSIsInVsIiwidWxsIiwiZiIsImQiLCJsZCIsInYiLCJwIn07DQorDQorLyogc2VjdGlvbnMgKi8NCisjZGVmaW5lIERBVEEgMA0KKyNkZWZpbmUgQlNTIDENCisjZGVmaW5lIENPREUgMg0KKyNkZWZpbmUgUk9EQVRBIDMNCisjZGVmaW5lIFNQRUNJQUwgNA0KKw0KK3N0YXRpYyBsb25nIHN0YWNrOw0KK3N0YXRpYyBpbnQgc3RhY2tfdmFsaWQ7DQorc3RhdGljIGludCBzZWN0aW9uPS0xLG5ld29iajsNCitzdGF0aWMgY2hhciAqY29kZW5hbWU9Ii5yZXNldGxvY2Fsc1xuO2NvZGVcbiIsDQorKmRhdGFuYW1lPSI7ZGF0YVxuIiwNCisqYnNzbmFtZT0iO2Jzc1xuIiwNCisqcm9kYXRhbmFtZT0iO3JlYWQgb25seSBkYXRhXG4iOw0KKw0KKy8qIHJldHVybi1pbnN0cnVjdGlvbiAqLw0KK3N0YXRpYyBjaGFyICpyZXQ7DQorDQorLyogbGFiZWwgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24gKGlmIGFueSkgKi8NCitzdGF0aWMgaW50IGV4aXRfbGFiZWw7DQorDQorLyogYXNzZW1ibHktcHJlZml4ZXMgZm9yIGxhYmVscyBhbmQgZXh0ZXJuYWwgaWRlbnRpZmllcnMgKi8NCitzdGF0aWMgY2hhciAqbGFicHJlZml4PSJsIiwqaWRwcmVmaXg9Il8iOw0KKw0KKy8qIHZhcmlhYmxlcyB0byBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IHN0YWNrLW9mZnNldCBpbiB0aGUgY2FzZSBvZg0KK2EgbW92aW5nIHN0YWNrLXBvaW50ZXIgKi8NCitzdGF0aWMgbG9uZyBsb2ZmLHN0YWNrb2Zmc2V0LG5vdHBvcHBlZCxkb250cG9wLG1heHB1c2hlZCxzdGFjazsNCitzdGF0aWMgcHVzaG9yZGVyPTI7DQorDQorc3RhdGljIGxvbmcgbG9jYWxzaXplLHJzYXZlc2l6ZSxhcmdzaXplOw0KKw0KKy8qIHB1c2hlZCBvbiB0aGUgc3RhY2sgYnkgYSBjYWxsZWUsIG5vIHBvcCBuZWVkZWQgKi8NCitzdGF0aWMgdm9pZCBjYWxsZWVfcHVzaChsb25nIGwpDQorew0KK30NCisNCitzdGF0aWMgdm9pZCBwdXNoKGxvbmcgbCkNCit7DQorCXN0YWNrb2Zmc2V0LT1sOw0KKwlpZihzdGFja29mZnNldDxtYXhwdXNoZWQpDQorCQltYXhwdXNoZWQ9c3RhY2tvZmZzZXQ7DQorfQ0KK3N0YXRpYyB2b2lkIHBvcChsb25nIGwpDQorew0KKwlzdGFja29mZnNldCs9bDsNCit9DQorDQorc3RhdGljIHZvaWQgZW1pdF9vYmooRklMRSAqZixzdHJ1Y3Qgb2JqICpwLGludCB0KTsNCisNCisvKiBjYWxjdWxhdGUgdGhlIGFjdHVhbCBjdXJyZW50IG9mZnNldCBvZiBhbiBvYmplY3QgcmVsYXRpdiB0byB0aGUNCitzdGFjay1wb2ludGVyOyB3ZSB1c2UgYSBsYXlvdXQgbGlrZSB0aGlzOg0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3wgYXJndW1lbnRzIHRvIHRoaXMgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3wgcmV0dXJuLWFkZHJlc3MgW3NpemU9NF0gICAgICAgICAgICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3wgY2FsbGVyLXNhdmUgcmVnaXN0ZXJzIFtzaXplPXJzYXZlc2l6ZV0gICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3wgbG9jYWwgdmFyaWFibGVzIFtzaXplPWxvY2Fsc2l6ZV0gICAgICAgICAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3wgYXJndW1lbnRzIHRvIGNhbGxlZCBmdW5jdGlvbnMgW3NpemU9YXJnc2l6ZV0gfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK0FsbCBzaXplcyB3aWxsIGJlIGFsaWduZWQgYXMgbmVjZXNzYXJ5Lg0KK0luIHRoZSBjYXNlIG9mIEZJWEVEX1NQLCB0aGUgc3RhY2stcG9pbnRlciB3aWxsIGJlIGFkanVzdGVkIGF0DQorZnVuY3Rpb24tZW50cnkgdG8gbGVhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgYXJndW1lbnRzIGFuZCBoYXZlIGl0DQorYWxpZ25lZCB0byAxNiBieXRlcy4gVGhlcmVmb3JlLCB3aGVuIGNhbGxpbmcgYSBmdW5jdGlvbiwgdGhlDQorc3RhY2stcG9pbnRlciBpcyBhbHdheXMgYWxpZ25lZCB0byAxNiBieXRlcy4NCitGb3IgYSBtb3Zpbmcgc3RhY2stcG9pbnRlciwgdGhlIHN0YWNrLXBvaW50ZXIgd2lsbCB1c3VhbGx5IHBvaW50DQordG8gdGhlIGJvdHRvbSBvZiB0aGUgYXJlYSBmb3IgbG9jYWwgdmFyaWFibGVzLCBidXQgd2lsbCBtb3ZlIHdoaWxlDQorYXJndW1lbnRzIGFyZSBwdXQgb24gdGhlIHN0YWNrLg0KKw0KK1RoaXMgaXMganVzdCBhbiBleGFtcGxlIGxheW91dC4gT3RoZXIgbGF5b3V0cyBhcmUgYWxzbyBwb3NzaWJsZS4NCisqLw0KKw0KK3N0YXRpYyBsb25nIHJlYWxfb2Zmc2V0KHN0cnVjdCBvYmogKm8pDQorew0KKwlsb25nIG9mZj16bTJsKG8tPnYtPm9mZnNldCk7DQorCWlmKG9mZjwwKXsNCisJCS8qIGZ1bmN0aW9uIHBhcmFtZXRlciAqLw0KKwkJb2ZmPWxvY2Fsc2l6ZStyc2F2ZXNpemUrNC1vZmYtem0ybChtYXhhbGlnbik7DQorCX0NCisNCisJb2ZmKz00Ow0KKw0KKwlvZmYrPXN0YWNrb2Zmc2V0Ow0KKwlvZmYrPXptMmwoby0+dmFsLnZtYXgpOw0KKwlyZXR1cm4gb2ZmOw0KK30NCisNCisvKiAgSW5pdGlhbGl6ZXMgYW4gYWRkcmVzc2luZy1tb2RlIHN0cnVjdHVyZSBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8NCit0aGF0IG9iamVjdC4gV2lsbCBub3Qgc3Vydml2ZSBhIHNlY29uZCBjYWxsISAqLw0KK3N0YXRpYyBzdHJ1Y3Qgb2JqICpjYW0oaW50IGZsYWdzLGludCBiYXNlLGxvbmcgb2Zmc2V0KQ0KK3sNCisJc3RhdGljIHN0cnVjdCBvYmogb2JqOw0KKwlzdGF0aWMgc3RydWN0IEFkZHJlc3NpbmdNb2RlIGFtOw0KKwlvYmouYW09JmFtOw0KKwlhbS5mbGFncz1mbGFnczsNCisJYW0uYmFzZT1iYXNlOw0KKwlhbS5vZmZzZXQ9b2Zmc2V0Ow0KKwlyZXR1cm4gJm9iajsNCit9DQorDQorLyogY2hhbmdlcyB0byBhIHNwZWNpYWwgc2VjdGlvbiwgdXNlZCBmb3IgX19zZWN0aW9uKCkgKi8NCitzdGF0aWMgaW50IHNwZWNpYWxfc2VjdGlvbihGSUxFICpmLHN0cnVjdCBWYXIgKnYpDQorew0KKwljaGFyICpzZWM7DQorCWlmKCF2LT52YXR0cikgcmV0dXJuIDA7DQorCXNlYz1zdHJzdHIodi0+dmF0dHIsInNlY3Rpb24oIik7DQorCWlmKCFzZWMpIHJldHVybiAwOw0KKwlzZWMrPXN0cmxlbigic2VjdGlvbigiKTsNCisJZW1pdChmLCI7IHNlY3Rpb24iKTsNCisJd2hpbGUoKnNlYyYmKnNlYyE9JyknKSBlbWl0X2NoYXIoZiwqc2VjKyspOw0KKwllbWl0KGYsIlxuIik7DQorCWlmKGYpIHNlY3Rpb249U1BFQ0lBTDsNCisJcmV0dXJuIDE7DQorfQ0KKw0KKy8qIGdlbmVyYXRlIGNvZGUgdG8gbG9hZCB0aGUgYWRkcmVzcyBvZiBhIHZhcmlhYmxlIGludG8gcmVnaXN0ZXIgciAqLw0KK3N0YXRpYyB2b2lkIGxvYWRfYWRkcmVzcyhGSUxFICpmLGludCByLHN0cnVjdCBvYmogKm8saW50IHR5cGUpDQorLyogIEdlbmVyYXRlcyBjb2RlIHRvIGxvYWQgdGhlIGFkZHJlc3Mgb2YgYSB2YXJpYWJsZSBpbnRvIHJlZ2lzdGVyIHIuICAgKi8NCit7DQorCWlmKCEoby0+ZmxhZ3MmVkFSKSkNCisJCWllcnJvcigwKTsNCisJaWYoby0+di0+c3RvcmFnZV9jbGFzcz09QVVUT3x8by0+di0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpDQorCXsNCisJCWxvbmcgb2ZmPXJlYWxfb2Zmc2V0KG8pOw0KKwkJZW1pdChmLCJcdG1vdlx0JXMgJXMgOyBsb2FkX2FkZHJlc3MgJXNcbiIscmVnbmFtZXNbcl0scmVnbmFtZXNbc3BdLGR0KFBPSU5URVIpKTsNCisJCWlmKG9mZikNCisJCXsNCisJCQllbWl0KGYsIlx0bW92XHRiMzAgJWxkIDsgJXNcbiIsb2ZmLGR0KFBPSU5URVIpKTsNCisJCQllbWl0KGYsIlx0c3ViXHQlcyBiMzAgOyAlc1xuIixyZWduYW1lc1tyXSxkdChQT0lOVEVSKSk7DQorCQl9DQorCX0NCisJZWxzZQ0KKwl7DQorCQllbWl0KGYsIlx0bW92XHQlcyAiLHJlZ25hbWVzW3JdKTsNCisJCWVtaXRfb2JqKGYsbyx0eXBlKTsNCisJCWVtaXQoZiwiIDslc1xuIiwgZHQoUE9JTlRFUikpOw0KKwl9DQorfQ0KKy8qIEdlbmVyYXRlcyBjb2RlIHRvIGxvYWQgYSBtZW1vcnkgb2JqZWN0IGludG8gcmVnaXN0ZXIgci4gdG1wIGlzIGENCitnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgd2hpY2ggbWF5IGJlIHVzZWQuIHRtcCBjYW4gYmUgci4gKi8NCitzdGF0aWMgdm9pZCBsb2FkX3JlZyhGSUxFICpmLGludCByLHN0cnVjdCBvYmogKm8saW50IHR5cGUpDQorew0KKwl0eXBlJj1OVTsNCisJaWYoby0+ZmxhZ3MmVkFSQURSKQ0KKwl7DQorCQlsb2FkX2FkZHJlc3MoZixyLG8sUE9JTlRFUik7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmby0+cmVnPT1yKQ0KKwkJCXJldHVybjsNCisJCWlmKChvLT5mbGFncyZWQVIpJiYhKG8tPmZsYWdzJlJFRykpDQorCQl7DQorCQkJaWYoby0+di0+c3RvcmFnZV9jbGFzcz09QVVUT3x8by0+di0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpDQorCQkJew0KKwkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHJlYWxfb2Zmc2V0KG8pOw0KKwkJCQlpZihvZmZzZXQgPT0gMCkNCisJCQkJew0KKwkJCQkJZW1pdChmLCJcdG1vdlx0JXNcdFt6Ml0gOyVzXG4iLHJlZ25hbWVzW3JdLGR0KHR5cGUpKTsNCisJCQkJfQ0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOFx0JWxkIDsgZ2V0IGZyb20gc3RhY2tcbiIsIG9mZnNldCk7DQorCQkJCQllbWl0KGYsIlx0bW92XHRiMjlcdHoyXG4iKTsNCisJCQkJCWVtaXQoZiwiXHRzdWJcdGIyOVx0YjI4XG4iKTsNCisJCQkJCWlmKElTRkxPQVQodHlwZSkpDQorCQkJCQkJZW1pdChmLCJcdG1vdmZcdCVzXHRbYjI5XSA7JXNcbiIscmVnbmFtZXNbcl0sZHQodHlwZSkpOw0KKwkJCQkJZWxzZSBpZigodHlwZSAmIFVOU0lHTkVEKSB8fCB0eXBlID09IFBPSU5URVIgfHwgdHlwZSA9PSBTVFJVQ1QpDQorCQkJCQkJZW1pdChmLCJcdG1vdlx0JXNcdFtiMjldIDslc1xuIixyZWduYW1lc1tyXSxkdCh0eXBlKSk7DQorCQkJCQllbHNlDQorCQkJCQkJZW1pdChmLCJcdG1vdnNcdCVzXHRbYjI5XSA7JXNcbiIscmVnbmFtZXNbcl0sZHQodHlwZSkpOw0KKwkJCQl9DQorDQorCQkJCXJldHVybjsNCisJCQl9DQorCQl9DQorDQorCQlpZihJU0ZMT0FUKHR5cGUpKQ0KKwkJCWVtaXQoZiwiXHRtb3ZmIFx0JXMgIixyZWduYW1lc1tyXSk7DQorCQllbHNlIGlmKCh0eXBlICYgVU5TSUdORUQpIHx8IHR5cGUgPT0gUE9JTlRFUiB8fCB0eXBlID09IFNUUlVDVCkNCisJCQllbWl0KGYsIlx0bW92IFx0JXMgIixyZWduYW1lc1tyXSk7DQorCQllbHNlDQorCQkJZW1pdChmLCJcdG1vdnMgXHQlcyAiLHJlZ25hbWVzW3JdKTsNCisJCWVtaXRfb2JqKGYsbyx0eXBlKTsNCisJCWVtaXQoZiwiIDslc1xuIixkdCh0eXBlKSk7DQorCX0NCit9DQorDQorLyogIEdlbmVyYXRlcyBjb2RlIHRvIHN0b3JlIHJlZ2lzdGVyIHIgaW50byBtZW1vcnkgb2JqZWN0IG8uICovDQorc3RhdGljIHZvaWQgc3RvcmVfcmVnKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdHlwZSkNCit7DQorCXR5cGUmPU5ROw0KKw0KKwlpZigoby0+ZmxhZ3MmVkFSKSYmIShvLT5mbGFncyZSRUcpKQ0KKwl7DQorDQorCQlpZihvLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikNCisJCXsNCisJCQl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHJlYWxfb2Zmc2V0KG8pOw0KKw0KKwkJCWlmKG9mZnNldCA9PSAwKQ0KKwkJCXsNCisJCQkJaWYoSVNGTE9BVCh0eXBlKSkNCisJCQkJCWVtaXQoZiwiXHRtb3ZmXHRbejJdXHQlcyA7JXNcbiIscmVnbmFtZXNbcl0sZHQodHlwZSkpOw0KKwkJCQllbHNlIGlmKCh0eXBlICYgVU5TSUdORUQpIHx8IHR5cGUgPT0gUE9JTlRFUiB8fCB0eXBlID09IFNUUlVDVCkNCisJCQkJCWVtaXQoZiwiXHRtb3ZcdFt6Ml1cdCVzIDslc1xuIixyZWduYW1lc1tyXSxkdCh0eXBlKSk7DQorCQkJCWVsc2UNCisJCQkJCWVtaXQoZiwiXHRtb3ZzXHRbejJdXHQlcyA7JXNcbiIscmVnbmFtZXNbcl0sZHQodHlwZSkpOw0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKwkJCQllbWl0KGYsIlx0bW92XHRiMjhcdCVsZCA7IG1vdiB0byBzdGFja1xuIiwgb2Zmc2V0KTsNCisJCQkJZW1pdChmLCJcdG1vdlx0YjI5XHR6MlxuIik7DQorCQkJCWVtaXQoZiwiXHRzdWJcdGIyOVx0YjI4XG4iKTsNCisJCQkJaWYoSVNGTE9BVCh0eXBlKSkNCisJCQkJCWVtaXQoZiwiXHRtb3ZmXHRbYjI5XVx0JXMgOyVzXG4iLHJlZ25hbWVzW3JdLGR0KHR5cGUpKTsNCisJCQkJZWxzZSBpZigodHlwZSAmIFVOU0lHTkVEKSB8fCB0eXBlID09IFBPSU5URVIgfHwgdHlwZSA9PSBTVFJVQ1QpDQorCQkJCQllbWl0KGYsIlx0bW92XHRbYjI5XVx0JXMgOyVzXG4iLHJlZ25hbWVzW3JdLGR0KHR5cGUpKTsNCisJCQkJZWxzZQ0KKwkJCQkJZW1pdChmLCJcdG1vdnNcdFtiMjldXHQlcyA7JXNcbiIscmVnbmFtZXNbcl0sZHQodHlwZSkpOw0KKwkJCX0NCisJCQlyZXR1cm47DQorCQl9DQorCX0NCisJaWYociA9PSAwKQ0KKwkJZW1pdChmLCAiOyIpOw0KKw0KKwlpZihJU0ZMT0FUKHR5cGUpKQ0KKwkJZW1pdChmLCJcdG1vdmZcdCIpOw0KKwllbHNlIGlmKHR5cGUgJiBVTlNJR05FRCkNCisJCWVtaXQoZiwiXHRtb3ZcdCIpOw0KKwllbHNlDQorCQllbWl0KGYsIlx0bW92c1x0Iik7DQorDQorCWVtaXRfb2JqKGYsbyx0eXBlKTsNCisJZW1pdChmLCJcdCVzIDslc1xuIixyZWduYW1lc1tyXSxkdCh0eXBlKSk7DQorfQ0KKw0KKy8qICBZaWVsZHMgbG9nMih4KSsxIG9yIDAuICovDQorc3RhdGljIGxvbmcgcG9mMih6dW1heCB4KQ0KK3sNCisJenVtYXggcDtpbnQgbG49MTsNCisJcD11bDJ6dW0oMUwpOw0KKwl3aGlsZShsbjw9MzImJnp1bWxlcShwLHgpKXsNCisJCWlmKHp1bWVxdG8oeCxwKSkgcmV0dXJuIGxuOw0KKwkJbG4rKztwPXp1bWFkZChwLHApOw0KKwl9DQorCXJldHVybiAwOw0KK30NCisNCitzdGF0aWMgc3RydWN0IElDICpwcmVsb2FkKEZJTEUgKixzdHJ1Y3QgSUMgKik7DQorDQorc3RhdGljIHZvaWQgZnVuY3Rpb25fdG9wKEZJTEUgKixzdHJ1Y3QgVmFyICosbG9uZyk7DQorc3RhdGljIHZvaWQgZnVuY3Rpb25fYm90dG9tKEZJTEUgKmYsc3RydWN0IFZhciAqLGxvbmcpOw0KKw0KKyNkZWZpbmUgaXNyZWcoeCkgKChwLT54LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpDQorI2RlZmluZSBpc2NvbnN0KHgpICgocC0+eC5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCkNCisNCitzdGF0aWMgaW50IHExcmVnLHEycmVnLHpyZWc7DQorDQorLyogRG9lcyBzb21lIHByZS1wcm9jZXNzaW5nIGxpa2UgZmV0Y2hpbmcgb3BlcmFuZHMgZnJvbSBtZW1vcnkgdG8NCityZWdpc3RlcnMgZXRjLiAqLw0KK3N0YXRpYyBzdHJ1Y3QgSUMgKnByZWxvYWQoRklMRSAqZixzdHJ1Y3QgSUMgKnApDQorew0KKwlpbnQgcjsNCisNCisJaWYoaXNyZWcocTEpKQ0KKwkJcTFyZWc9cC0+cTEucmVnOw0KKwllbHNlDQorCQlxMXJlZz0wOw0KKw0KKwlpZihpc3JlZyhxMikpDQorCQlxMnJlZz1wLT5xMi5yZWc7DQorCWVsc2UNCisJCXEycmVnPTA7DQorDQorLy8JZW1pdChmLCIgOyBQcmVsb2FkIHJlZ2lzdGVyIHR5cGUgJWRcdCVkIHo6JWRcdCVkXHQgIiwgcTF0eXAocCksIHExdHlwKHApICYgTlEsIHp0eXAocCksIHp0eXAocCkgJiBOUSk7DQorDQorCWlmKGlzcmVnKHopKQ0KKwl7DQorCQl6cmVnPXAtPnoucmVnOw0KKy8vCQllbWl0KGYsIiBpcyBhIHJlZyAiKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCWlmKCh6dHlwKHApICYgTlEpID09IENIQVIpDQorCQl7DQorLy8JCQllbWl0KGYsIiBpcyBhIDggYml0IHJlZyAoMSkgIik7DQorCQkJenJlZz10OGJpdDE7DQorCQl9DQorCQllbHNlIGlmKCh6dHlwKHApICYgTlEpID09IFNIT1JUKQ0KKwkJew0KKy8vCQkJZW1pdChmLCIgaXMgYSAxNiBiaXQgcmVnICgxKSAiKTsNCisJCQl6cmVnPXQxNmJpdDE7DQorCQl9DQorCQllbHNlIGlmKCh6dHlwKHApICYgTlEpID09IExET1VCTEUgfHwgKHp0eXAocCkgJiBOUSkgPT0gTExPTkcgfHwgKHp0eXAocCkgJiBOUSkgPT0gRE9VQkxFKQ0KKwkJew0KKy8vCQkJZW1pdChmLCIgaXMgYSA2NCBiaXQgcmVnICgxKSAiKTsNCisJCQl6cmVnPXQ2NGJpdDE7DQorCQl9DQorCQllbHNlDQorCQl7DQorLy8JCQllbWl0KGYsIiBpcyBhIDMyIGJpdCByZWcgKDEpICIpOw0KKwkJCXpyZWc9dDMyYml0MTsNCisJCX0NCisJfQ0KKw0KKwlpZigocC0+cTEuZmxhZ3MmKERSRUZPQkp8UkVHKSk9PURSRUZPQkomJiFwLT5xMS5hbSl7DQorCQlwLT5xMS5mbGFncyY9fkRSRUZPQko7DQorCQlpZigocTF0eXAocCkgJiBOUSkgPT0gQ0hBUikNCisJCXsNCisJCQlsb2FkX3JlZyhmLHQ4Yml0MSwmcC0+cTEscTF0eXAocCkpOw0KKwkJCXAtPnExLnJlZz10OGJpdDE7DQorLy8JCQllbWl0KGYsIiBpcyBhIDggYml0IHJlZyAoMikgIik7DQorCQl9DQorCQllbHNlIGlmKChxMXR5cChwKSAmIE5RKSA9PSBTSE9SVCkNCisJCXsNCisJCQlsb2FkX3JlZyhmLHQxNmJpdDEsJnAtPnExLHExdHlwKHApKTsNCisJCQlwLT5xMS5yZWc9dDE2Yml0MTsNCisvLwkJCWVtaXQoZiwiIGlzIGEgMTYgYml0IHJlZyAoMikgIik7DQorCQl9DQorCQllbHNlIGlmKChxMXR5cChwKSAmIE5RKSA9PSBMRE9VQkxFIHx8IChxMXR5cChwKSAmIE5RKSA9PSBMTE9ORyB8fCAocTF0eXAocCkgJiBOUSkgPT0gRE9VQkxFKQ0KKwkJew0KKwkJCWxvYWRfcmVnKGYsdDY0Yml0MSwmcC0+cTEscTF0eXAocCkpOw0KKwkJCXAtPnExLnJlZz10NjRiaXQxOw0KKy8vCQkJZW1pdChmLCIgaXMgYSA2NCBiaXQgcmVnICgyKSAiKTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlsb2FkX3JlZyhmLHQzMmJpdDEsJnAtPnExLHExdHlwKHApKTsNCisJCQlwLT5xMS5yZWc9dDMyYml0MTsNCisvLwkJCWVtaXQoZiwiIGlzIGEgMzIgYml0IHJlZyAoMikgIik7DQorCQl9DQorCQlwLT5xMS5mbGFnc3w9KFJFR3xEUkVGT0JKKTsNCisJfQ0KKwlpZihwLT5xMS5mbGFncyYmTE9BRF9TVE9SRSYmIWlzcmVnKHExKSl7DQorCQlpZigocTF0eXAocCkgJiBOUSkgPT0gQ0hBUikNCisJCXsNCisJCQlxMXJlZz10OGJpdDE7DQorLy8JCQllbWl0KGYsIiBpcyBhIDggYml0IHJlZyAoMykgIik7DQorCQl9DQorCQllbHNlIGlmKChxMXR5cChwKSAmIE5RKSA9PSBTSE9SVCkNCisJCXsNCisJCQlxMXJlZz10MTZiaXQxOw0KKy8vCQkJZW1pdChmLCIgaXMgYSAxNiBiaXQgcmVnICgzKSAiKTsNCisJCX0NCisJCWVsc2UgaWYoKHExdHlwKHApICYgTlEpID09IExET1VCTEUgfHwgKHExdHlwKHApICYgTlEpID09IExMT05HIHx8IChxMXR5cChwKSAmIE5RKSA9PSBET1VCTEUpDQorCQl7DQorCQkJcTFyZWc9dDY0Yml0MTsNCisvLwkJCWVtaXQoZiwiIGlzIGEgNjQgYml0IHJlZyAoMykgIik7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJcTFyZWc9dDMyYml0MTsNCisvLwkJCWVtaXQoZiwiIGlzIGEgMzIgYml0IHJlZyAoMykgIik7DQorCQl9DQorCQlsb2FkX3JlZyhmLHExcmVnLCZwLT5xMSxxMXR5cChwKSk7DQorCQlwLT5xMS5yZWc9cTFyZWc7DQorCQlwLT5xMS5mbGFncz1SRUc7DQorCX0NCisNCisJaWYoKHAtPnEyLmZsYWdzJihEUkVGT0JKfFJFRykpPT1EUkVGT0JKJiYhcC0+cTIuYW0pew0KKwkJcC0+cTIuZmxhZ3MmPX5EUkVGT0JKOw0KKwkJaWYoKHExdHlwKHApICYgTlEpID09IENIQVIpDQorCQl7DQorCQkJbG9hZF9yZWcoZix0OGJpdDEsJnAtPnEyLHEydHlwKHApKTsNCisJCQlwLT5xMi5yZWc9dDhiaXQxOw0KKy8vCQkJZW1pdChmLCIgaXMgYSA4IGJpdCByZWcgKDQpICIpOw0KKwkJfQ0KKwkJZWxzZSBpZigocTF0eXAocCkgJiBOUSkgPT0gU0hPUlQpDQorCQl7DQorCQkJbG9hZF9yZWcoZix0MTZiaXQxLCZwLT5xMixxMnR5cChwKSk7DQorCQkJcC0+cTIucmVnPXQxNmJpdDE7DQorLy8JCQllbWl0KGYsIiBpcyBhIDE2IGJpdCByZWcgKDQpICIpOw0KKwkJfQ0KKwkJZWxzZSBpZigocTF0eXAocCkgJiBOUSkgPT0gTERPVUJMRSB8fCAocTF0eXAocCkgJiBOUSkgPT0gTExPTkcgfHwgKHExdHlwKHApICYgTlEpID09IERPVUJMRSkNCisJCXsNCisJCQlsb2FkX3JlZyhmLHQ2NGJpdDEsJnAtPnEyLHEydHlwKHApKTsNCisJCQlwLT5xMi5yZWc9dDY0Yml0MTsNCisvLwkJCWVtaXQoZiwiIGlzIGEgNjQgYml0IHJlZyAoNCkgIik7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJbG9hZF9yZWcoZix0MzJiaXQxLCZwLT5xMixxMnR5cChwKSk7DQorCQkJcC0+cTIucmVnPXQzMmJpdDE7DQorLy8JCQllbWl0KGYsIiBpcyBhIDMyIGJpdCByZWcgKDQpICIpOw0KKwkJfQ0KKw0KKwkJcC0+cTIuZmxhZ3N8PShSRUd8RFJFRk9CSik7DQorCX0NCisJaWYocC0+cTIuZmxhZ3MmJkxPQURfU1RPUkUmJiFpc3JlZyhxMikpew0KKwkJaWYoKHExdHlwKHApICYgTlEpID09IENIQVIpDQorCQl7DQorCQkJcTJyZWc9dDhiaXQxOw0KKy8vCQkJZW1pdChmLCIgaXMgYSA4IGJpdCByZWcgKDUpICIpOw0KKwkJfQ0KKwkJZWxzZSBpZigocTF0eXAocCkgJiBOUSkgPT0gU0hPUlQpDQorCQl7DQorCQkJcTJyZWc9dDE2Yml0MTsNCisvLwkJCWVtaXQoZiwiIGlzIGEgMTYgYml0IHJlZyAoNSkgIik7DQorCQl9DQorCQllbHNlIGlmKChxMXR5cChwKSAmIE5RKSA9PSBMRE9VQkxFIHx8IChxMXR5cChwKSAmIE5RKSA9PSBMTE9ORyB8fCAocTF0eXAocCkgJiBOUSkgPT0gRE9VQkxFKQ0KKwkJew0KKwkJCXEycmVnPXQ2NGJpdDE7DQorLy8JCQllbWl0KGYsIiBpcyBhIDY0IGJpdCByZWcgKDUpICIpOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCXEycmVnPXQzMmJpdDE7DQorLy8JCQllbWl0KGYsIiBpcyBhIDMyIGJpdCByZWcgKDUpICIpOw0KKwkJfQ0KKw0KKwkJbG9hZF9yZWcoZixxMnJlZywmcC0+cTIscTJ0eXAocCkpOw0KKwkJcC0+cTIucmVnPXEycmVnOw0KKwkJcC0+cTIuZmxhZ3M9UkVHOw0KKwl9DQorDQorLy8JZW1pdChmLCJcbiIpOw0KKwlyZXR1cm4gcDsNCit9DQorDQorLyogc2F2ZSB0aGUgcmVzdWx0IChpbiB6cmVnKSBpbnRvIHAtPnogKi8NCit2b2lkIHNhdmVfcmVzdWx0KEZJTEUgKmYsc3RydWN0IElDICpwKQ0KK3sNCisJaWYoKHAtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PURSRUZPQkomJiFwLT56LmFtKXsNCisJCXAtPnouZmxhZ3MmPX5EUkVGT0JKOw0KKwkJaWYoKHAtPnR5cGYgJiBOUSkgPT0gQ0hBUikNCisJCXsNCisJCQlsb2FkX3JlZyhmLHQ4Yml0MiwmcC0+eixQT0lOVEVSKTsNCisJCQlwLT56LnJlZz10OGJpdDI7DQorCQl9DQorCQllbHNlIGlmKChwLT50eXBmICYgTlEpID09IFNIT1JUKQ0KKwkJew0KKwkJCWxvYWRfcmVnKGYsdDE2Yml0MiwmcC0+eixQT0lOVEVSKTsNCisJCQlwLT56LnJlZz10MTZiaXQyOw0KKwkJfQ0KKwkJZWxzZSBpZigocC0+dHlwZiAmIE5RKSA9PSBMRE9VQkxFIHx8IChwLT50eXBmICYgTlEpID09IExMT05HIHx8IChwLT50eXBmICYgTlEpID09IERPVUJMRSkNCisJCXsNCisJCQlsb2FkX3JlZyhmLHQ2NGJpdDIsJnAtPnosUE9JTlRFUik7DQorCQkJcC0+ei5yZWc9dDY0Yml0MjsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlsb2FkX3JlZyhmLHQzMmJpdDIsJnAtPnosUE9JTlRFUik7DQorCQkJcC0+ei5yZWc9dDMyYml0MjsNCisJCX0NCisJCXAtPnouZmxhZ3N8PShSRUd8RFJFRk9CSik7DQorCQkvL3ByaW50Zigic2V0dGluZyByZWcgdG8gJXNcbiIsIHJlZ25hbWVzW3AtPnoucmVnXSk7DQorCX0NCisNCisJaWYoaXNyZWcoeikpew0KKwkJaWYocC0+ei5yZWchPXpyZWcpDQorCQkJZW1pdChmLCJcdG1vdlx0JXMgJXMgOyVzXG4iLHJlZ25hbWVzW3AtPnoucmVnXSxyZWduYW1lc1t6cmVnXSxkdCh6dHlwKHApKSk7DQorCX1lbHNlew0KKwkJc3RvcmVfcmVnKGYsenJlZywmcC0+eix6dHlwKHApKTsNCisJfQ0KK30NCisNCisvKiBwcmludHMgYW4gb2JqZWN0ICovDQorc3RhdGljIHZvaWQgZW1pdF9vYmooRklMRSAqZixzdHJ1Y3Qgb2JqICpwLGludCB0KQ0KK3sNCisJLy9wcmludGYoInR5cGUgPSAlaVxuIiwgdCk7DQorCWlmKChwLT5mbGFncyYoRFJFRk9CSnxLT05TVCkpPT0oRFJFRk9CSnxLT05TVCkpDQorCXsNCisJCWVtaXR2YWwoZiwmcC0+dmFsLHAtPmR0eXAmTlUpOw0KKwkJcmV0dXJuOw0KKwl9DQorCWlmKChwLT5mbGFncyYoRFJFRk9CSnxSRUcpKT09KERSRUZPQkp8UkVHKSkNCisJCWVtaXQoZiwiWyIpOw0KKw0KKwlpZigocC0+ZmxhZ3MmVkFSKSYmIShwLT5mbGFncyZSRUcpKQ0KKwl7DQorCQlpZighem1lcXRvKGwyem0oMEwpLHAtPnZhbC52bWF4KSkNCisJCXsNCisJCQllbWl0dmFsKGYsJnAtPnZhbCxMT05HKTsNCisJCQllbWl0KGYsIisiKTsNCisJCX0NCisJCWlmKHAtPnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQykNCisJCXsNCisJCQllbWl0KGYsIiVzJWxkIiwgbGFicHJlZml4LCB6bTJsKHAtPnYtPm9mZnNldCkpOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCWlmKHQgPT0gRlVOS1QpDQorCQkJCWVtaXQoZiwiJXMlcyIsIGlkcHJlZml4LCBwLT52LT5pZGVudGlmaWVyKTsNCisJCQllbHNlIGlmKHAtPmZsYWdzJlZBUkFEUikNCisJCQkJZW1pdChmLCIlcyVzIiwgaWRwcmVmaXgsIHAtPnYtPmlkZW50aWZpZXIpOw0KKwkJCWVsc2UNCisJCQkJZW1pdChmLCJbJXMlc10iLCBpZHByZWZpeCwgcC0+di0+aWRlbnRpZmllcik7DQorCQl9DQorCX0NCisJaWYocC0+ZmxhZ3MmUkVHKQ0KKwl7DQorCQllbWl0KGYsICIlcyIsIHJlZ25hbWVzW3AtPnJlZ10pOw0KKwl9DQorCWlmKHAtPmZsYWdzJktPTlNUKQ0KKwl7DQorCQlpZihJU0ZMT0FUKHQpKQ0KKwkJew0KKwkJCS8vCQkJY2FzZSBGTE9BVDoNCisJCQljaGFyICp2YWx1ZXMgPSAoY2hhciAqKSZwLT52YWwudmZsb2F0Ow0KKwkJCS8vIHN3YXAgdGhlIG9yZGVyDQorCQkJY2hhciB0bXAgPSB2YWx1ZXNbMF07DQorCQkJdmFsdWVzWzBdID0gdmFsdWVzWzNdOw0KKwkJCXZhbHVlc1szXSA9IHRtcDsNCisJCQl0bXAgPSB2YWx1ZXNbMV07DQorCQkJdmFsdWVzWzFdID0gdmFsdWVzWzJdOw0KKwkJCXZhbHVlc1syXSA9IHRtcDsNCisNCisJCQllbWl0KGYsICIweCUxWCIsICoodW5zaWduZWQgaW50ICopdmFsdWVzKTsNCisJCQkvLwkJCQlicmVhazsNCisNCisJCQkvLwkJCWNhc2UgRE9VQkxFOg0KKwkJCS8vCQkJCWZwcmludGYoZnAsICJbZG91YmxlICMlMDhYXSIsIG9iai0+dmFsLnZkb3VibGUpOw0KKwkJCS8vCQkJZW1pdChmLCIwZiVlIiwvKmxhYnByZWZpeCwqL3AtPnZhbC52ZmxvYXQpOw0KKwkJCS8vCQkJZW1pdChmLCIwZiIpOw0KKwkJCS8vCQkJZW1pdHZhbChmLCZwLT52YWwsdCZOVSk7DQorCQl9DQorCQllbHNlIGlmKHQgJiBVTlNJR05FRCkNCisJCXsNCisJCQkvLwkJCWVtaXQoZiwgIjB1Iik7DQorCQkJZW1pdHZhbChmLCZwLT52YWwsdCZOVSk7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJZW1pdChmLCIwcyIpOw0KKwkJCWVtaXR2YWwoZiwmcC0+dmFsLHQmTlUpOw0KKwkJfQ0KKwl9DQorCWlmKChwLT5mbGFncyYoRFJFRk9CSnxSRUcpKT09KERSRUZPQkp8UkVHKSkNCisJCWVtaXQoZiwiXSIpOw0KK30NCisNCisvKiAgVGVzdCBpZiB0aGVyZSBpcyBhIHNlcXVlbmNlIG9mIEZSRUVSRUdzIGNvbnRhaW5pbmcgRlJFRVJFRyByZWcuDQorVXNlZCBieSBwZWVwaG9sZS4gKi8NCitzdGF0aWMgaW50IGV4aXN0c19mcmVlcmVnKHN0cnVjdCBJQyAqcCxpbnQgcmVnKQ0KK3sNCisJd2hpbGUocCYmKHAtPmNvZGU9PUZSRUVSRUd8fHAtPmNvZGU9PUFMTE9DUkVHKSkNCisJew0KKwkJaWYocC0+Y29kZT09RlJFRVJFRyYmcC0+cTEucmVnPT1yZWcpDQorCQkJcmV0dXJuIDE7DQorCQlwPXAtPm5leHQ7DQorCX0NCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qIHNlYXJjaCBmb3IgcG9zc2libGUgYWRkcmVzc2luZy1tb2RlcyAqLw0KK3N0YXRpYyB2b2lkIHBlZXBob2xlKHN0cnVjdCBJQyAqcCkNCit7DQorCWludCBjLGMyLHI7DQorCXN0cnVjdCBJQyAqcDI7DQorCXN0cnVjdCBBZGRyZXNzaW5nTW9kZSAqYW07DQorDQorCWZvcig7cDtwPXAtPm5leHQpDQorCXsNCisJCWM9cC0+Y29kZTsNCisJCWlmKGMgIT0gRlJFRVJFRyAmJiBjICE9IEFMTE9DUkVHICYmIChjICE9IFNFVFJFVFVSTiB8fCAhaXNyZWcocTEpIHx8IHAtPnExLnJlZyAhPSBwLT56LnJlZykpDQorCQkJZXhpdF9sYWJlbD0wOw0KKwkJaWYoYz09TEFCRUwpDQorCQkJZXhpdF9sYWJlbD1wLT50eXBmOw0KKw0KKwkJLyogVHJ5IGNvbnN0KHJlZykgKi8NCisJCWlmKElNTV9JTkQmJihjPT1BRERJMlB8fGM9PVNVQklGUCkmJmlzcmVnKHopJiYocC0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpDQorCQl7DQorCQkJaW50IGJhc2U7em1heCBvZjtzdHJ1Y3Qgb2JqICpvOw0KKwkJCWV2YWxfY29uc3QoJnAtPnEyLnZhbCxwLT50eXBmKTsNCisJCQlpZihjPT1TVUJJRlApIG9mPXptc3ViKGwyem0oMEwpLHZtYXgpOyBlbHNlIG9mPXZtYXg7DQorCQkJaWYoMS8qem1sZXEobDJ6bSgtMzI3NjhMKSx2bWF4KSYmem1sZXEodm1heCxsMnptKDMyNzY3TCkpKi8pDQorCQkJew0KKwkJCQlyPXAtPnoucmVnOw0KKwkJCQlpZihpc3JlZyhxMSkpDQorCQkJCQliYXNlPXAtPnExLnJlZzsNCisJCQkJZWxzZQ0KKwkJCQkJYmFzZT1yOw0KKwkJCQlvPTA7DQorCQkJCWZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KQ0KKwkJCQl7DQorCQkJCQljMj1wMi0+Y29kZTsNCisJCQkJCWlmKGMyPT1DQUxMfHxjMj09TEFCRUx8fChjMj49QkVRJiZjMjw9QlJBKSkNCisJCQkJCQlicmVhazsNCisJCQkJCWlmKGMyIT1GUkVFUkVHJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMS5yZWc9PXIpDQorCQkJCQkJYnJlYWs7DQorCQkJCQlpZihjMiE9RlJFRVJFRyYmKHAyLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTIucmVnPT1yKQ0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJaWYoYzIhPUNBTEwmJihjMjxMQUJFTHx8YzI+QlJBKS8qJiZjMiE9QUREUkVTUyovKQ0KKwkJCQkJew0KKwkJCQkJCWlmKCFwMi0+cTEuYW0mJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT5xMS5yZWc9PXIpDQorCQkJCQkJew0KKwkJCQkJCQlpZihvKSBicmVhazsNCisJCQkJCQkJbz0mcDItPnExOw0KKwkJCQkJCX0NCisJCQkJCQlpZighcDItPnEyLmFtJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTIucmVnPT1yKQ0KKwkJCQkJCXsNCisJCQkJCQkJaWYobykgYnJlYWs7DQorCQkJCQkJCW89JnAyLT5xMjsNCisJCQkJCQl9DQorCQkJCQkJaWYoIXAyLT56LmFtJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT56LnJlZz09cikNCisJCQkJCQl7DQorCQkJCQkJCWlmKG8pIGJyZWFrOw0KKwkJCQkJCQlvPSZwMi0+ejsNCisJCQkJCQl9DQorCQkJCQl9DQorCQkJCQlpZihjMj09RlJFRVJFR3x8KHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpDQorCQkJCQl7DQorCQkJCQkJaW50IG07DQorCQkJCQkJaWYoYzI9PUZSRUVSRUcpDQorCQkJCQkJCW09cDItPnExLnJlZzsNCisJCQkJCQllbHNlDQorCQkJCQkJCW09cDItPnoucmVnOw0KKwkJCQkJCWlmKG09PXIpDQorCQkJCQkJew0KKwkJCQkJCQlpZihvKQ0KKwkJCQkJCQl7DQorCQkJCQkJCQlvLT5hbT1hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7DQorCQkJCQkJCQlhbS0+ZmxhZ3M9SU1NX0lORDsNCisJCQkJCQkJCWFtLT5iYXNlPWJhc2U7DQorCQkJCQkJCQlhbS0+b2Zmc2V0PXptMmwob2YpOw0KKwkJCQkJCQkJaWYoaXNyZWcocTEpKQ0KKwkJCQkJCQkJew0KKwkJCQkJCQkJCXAtPmNvZGU9Yz1OT1A7cC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQkJZWxzZQ0KKwkJCQkJCQkJew0KKwkJCQkJCQkJCXAtPmNvZGU9Yz1BU1NJR047cC0+cTIuZmxhZ3M9MDsNCisJCQkJCQkJCQlwLT50eXBmPXAtPnR5cGYyO3AtPnEyLnZhbC52bWF4PXNpemV0YWJbcC0+dHlwZjImTlFdOw0KKwkJCQkJCQkJfQ0KKwkJCQkJCQl9DQorCQkJCQkJCWJyZWFrOw0KKwkJCQkJCX0NCisJCQkJCQlpZihjMiE9RlJFRVJFRyYmbT09YmFzZSkNCisJCQkJCQkJYnJlYWs7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQl9DQorCQl9DQorCQkvKiBUcnkgcmVnLHJlZyAqLw0KKwkJaWYoR1BSX0lORCYmYz09QURESTJQJiZpc3JlZyhxMikmJmlzcmVnKHopJiYoaXNyZWcocTEpfHxwLT5xMi5yZWchPXAtPnoucmVnKSkNCisJCXsNCisJCQlpbnQgYmFzZSxpZHg7c3RydWN0IG9iaiAqbzsNCisJCQlyPXAtPnoucmVnO2lkeD1wLT5xMi5yZWc7DQorCQkJaWYoaXNyZWcocTEpKSBiYXNlPXAtPnExLnJlZzsgZWxzZSBiYXNlPXI7DQorCQkJbz0wOw0KKwkJCWZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KQ0KKwkJCXsNCisJCQkJYzI9cDItPmNvZGU7DQorCQkJCWlmKGMyPT1DQUxMfHxjMj09TEFCRUx8fChjMj49QkVRJiZjMjw9QlJBKSkNCisJCQkJCWJyZWFrOw0KKwkJCQlpZihjMiE9RlJFRVJFRyYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1yKQ0KKwkJCQkJYnJlYWs7DQorCQkJCWlmKGMyIT1GUkVFUkVHJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMi5yZWc9PXIpDQorCQkJCQlicmVhazsNCisJCQkJaWYoKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT56LnJlZz09aWR4JiZpZHghPXIpDQorCQkJCQlicmVhazsNCisNCisJCQkJaWYoYzIhPUNBTEwmJihjMjxMQUJFTHx8YzI+QlJBKS8qJiZjMiE9QUREUkVTUyovKQ0KKwkJCQl7DQorCQkJCQlpZighcDItPnExLmFtJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTEucmVnPT1yKQ0KKwkJCQkJew0KKwkJCQkJCWlmKG98fChxMXR5cChwMikmTlEpPT1MTE9ORykgYnJlYWs7DQorCQkJCQkJbz0mcDItPnExOw0KKwkJCQkJfQ0KKwkJCQkJaWYoIXAyLT5xMi5hbSYmKHAyLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnEyLnJlZz09cikNCisJCQkJCXsNCisJCQkJCQlpZihvfHwocTJ0eXAocDIpJk5RKT09TExPTkcpIGJyZWFrOw0KKwkJCQkJCW89JnAyLT5xMjsNCisJCQkJCX0NCisJCQkJCWlmKCFwMi0+ei5hbSYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+ei5yZWc9PXIpDQorCQkJCQl7DQorCQkJCQkJaWYob3x8KHp0eXAocDIpJk5RKT09TExPTkcpIGJyZWFrOw0KKwkJCQkJCW89JnAyLT56Ow0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWlmKGMyPT1GUkVFUkVHfHwocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRykNCisJCQkJew0KKwkJCQkJaW50IG07DQorCQkJCQlpZihjMj09RlJFRVJFRykNCisJCQkJCQltPXAyLT5xMS5yZWc7DQorCQkJCQllbHNlDQorCQkJCQkJbT1wMi0+ei5yZWc7DQorCQkJCQlpZihtPT1yKQ0KKwkJCQkJew0KKwkJCQkJCWlmKG8pDQorCQkJCQkJew0KKwkJCQkJCQlvLT5hbT1hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7DQorCQkJCQkJCWFtLT5mbGFncz1HUFJfSU5EOw0KKwkJCQkJCQlhbS0+YmFzZT1iYXNlOw0KKwkJCQkJCQlhbS0+b2Zmc2V0PWlkeDsNCisJCQkJCQkJaWYoaXNyZWcocTEpKQ0KKwkJCQkJCQl7DQorCQkJCQkJCQlwLT5jb2RlPWM9Tk9QO3AtPnExLmZsYWdzPXAtPnEyLmZsYWdzPXAtPnouZmxhZ3M9MDsNCisJCQkJCQkJfQ0KKwkJCQkJCQllbHNlDQorCQkJCQkJCXsNCisJCQkJCQkJCXAtPmNvZGU9Yz1BU1NJR047cC0+cTIuZmxhZ3M9MDsNCisJCQkJCQkJCXAtPnR5cGY9cC0+dHlwZjI7cC0+cTIudmFsLnZtYXg9c2l6ZXRhYltwLT50eXBmMiZOUV07DQorCQkJCQkJCX0NCisJCQkJCQl9DQorCQkJCQkJYnJlYWs7DQorCQkJCQl9DQorCQkJCQlpZihjMiE9RlJFRVJFRyYmbT09YmFzZSkgYnJlYWs7DQorCQkJCQljb250aW51ZTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfQ0KK30NCisNCitzdGF0aWMgdm9pZCBwcihGSUxFICpmLHN0cnVjdCBJQyAqcCkNCit7DQorCWludCBpOw0KKwlmb3IoO3B1c2hvcmRlcj4yO3B1c2hvcmRlcj4+PTEpDQorCXsNCisJCWZvcihpPTE7aTw9ODtpKyspDQorCQl7DQorCQkJaWYocmVnc1tpXSZwdXNob3JkZXIpDQorCQkJew0KKwkJCQlpZihwLT5jb2RlPT1QVVNIfHxwLT5jb2RlPT1DQUxMKQ0KKwkJCQl7DQorCQkJCQkvL2VtaXQoZiwiXHRtb3ZsXHQlbGQoJXMpLCVzXG4iLGxvZmYtNC1zdGFja29mZnNldCxyZWduYW1lc1tzcF0scmVnbmFtZXNbaV0pOw0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJZW1pdChmLCJcdHBvcFx0JXNcbiIscmVnbmFtZXNbaV0pOw0KKwkJCQkJcG9wKDQpOw0KKwkJCQl9DQorCQkJCXJlZ3NbaV0mPX5wdXNob3JkZXI7DQorCQkJfQ0KKwkJfQ0KKwl9DQorCWZvcihpPTE7aTw9ODtpKyspDQorCQlpZihyZWdzW2ldJjIpIHJlZ3NbaV0mPX4yOw0KK30NCisNCisvKiBnZW5lcmF0ZXMgdGhlIGZ1bmN0aW9uIGVudHJ5IGNvZGUgKi8NCitzdGF0aWMgdm9pZCBmdW5jdGlvbl90b3AoRklMRSAqZixzdHJ1Y3QgVmFyICp2LGxvbmcgb2Zmc2V0KQ0KK3sNCisJcnNhdmVzaXplPTA7DQorCWlmKCFzcGVjaWFsX3NlY3Rpb24oZix2KSYmc2VjdGlvbiE9Q09ERSl7ZW1pdChmLGNvZGVuYW1lKTtpZihmKSBzZWN0aW9uPUNPREU7fSANCisJaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKQ0KKwl7DQorCQlpZigodi0+ZmxhZ3MmKElOTElORUZVTkN8SU5MSU5FRVhUKSkhPUlOTElORUZVTkMpDQorCQkJZW1pdChmLCIuZ2xvYmFsICIpOw0KKwkJLy8gICAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXMlc1xuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsNCisJCWVtaXQoZiwiJXMlczpcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7DQorCX0NCisJZWxzZQ0KKwkJZW1pdChmLCIlcyVsZDpcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7DQorDQorCS8vIHJlc2VydmUgZW5vdWdoIGluIHN0YWNrIGZvciBsb2NhbCBmdW5jdGlvbnMNCisJaWYob2Zmc2V0ID4gMCkNCisJew0KKwkJZW1pdChmLCJcdG1vdlx0YjI4XHQlZFxuIiwgb2Zmc2V0KTsNCisJCWVtaXQoZiwiXHRhZGRcdHoyXHRiMjggO3Jlc2VydmUgJWQgb24gc3RhY2tcbiIsIG9mZnNldCk7DQorCX0NCit9DQorLyogZ2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBleGl0IGNvZGUgKi8NCitzdGF0aWMgdm9pZCBmdW5jdGlvbl9ib3R0b20oRklMRSAqZixzdHJ1Y3QgVmFyICp2LGxvbmcgb2Zmc2V0KQ0KK3sNCisJLy8gcmVzZXJ2ZSBlbm91Z2ggaW4gc3RhY2sgZm9yIGxvY2FsIGZ1bmN0aW9ucw0KKwlpZihvZmZzZXQgPiAwKQ0KKwl7DQorCQllbWl0KGYsIlx0bW92XHRiMjhcdCVkXG4iLCBvZmZzZXQpOw0KKwkJZW1pdChmLCJcdHN1Ylx0ejJcdGIyOCA7cmVzZXJ2ZSAlZCBvbiBzdGFja1xuIiwgb2Zmc2V0KTsNCisJfQ0KKw0KKwllbWl0KGYscmV0KTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyogIEVuZCBvZiBwcml2YXRlIGRhdGEgYW5kIGZ1bmN0aW9ucy4gICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorLyogIERvZXMgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9ucyBmb3IgdGhlIGNvZGUtZ2VuZXJhdG9yLiBHZXRzIGNhbGxlZCAgKi8NCisvKiAgb25jZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCBzaG91bGQgcmV0dXJuIDAgaW4gY2FzZSBvZiBwcm9ibGVtcy4gICAgICAqLw0KK2ludCBpbml0X2NnKHZvaWQpDQorew0KKwlpbnQgaTsNCisJLyogIEluaXRpYWxpemUgc29tZSB2YWx1ZXMgd2hpY2ggY2Fubm90IGJlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgICAqLw0KKwkvKiAgYmVjYXVzZSB0aGV5IGFyZSBzdG9yZWQgaW4gdGhlIHRhcmdldCdzIGFyaXRobWV0aWMuICAgICAgICAgICAgICovDQorCW1heGFsaWduPWwyem0oMUwpOw0KKwljaGFyX2JpdD1sMnptKDhMKTsNCisNCisJZm9yKGk9MDtpPD1NQVhfVFlQRTtpKyspDQorCXsNCisJCXNpemV0YWJbaV09bDJ6bShtc2l6ZXRhYltpXSk7DQorCQlhbGlnbltpXT1sMnptKG1hbGlnbltpXSk7DQorCX0NCisNCisJcmVnbmFtZXNbMF09Im5vcmVnIjsNCisJcmVndHlwZVswXT1teW1hbGxvYyhzaXplb2Yoc3RydWN0IFR5cCkpOw0KKwkvLwlmb3IoaT1GSVJTVF9GSVhFRDtpPD1MQVNUX0ZJWEVEO2krKykNCisJLy8Jew0KKwkvLwkJcmVnbmFtZXNbaV09bXltYWxsb2MoMTApOw0KKwkvLwkJc3ByaW50ZihyZWduYW1lc1tpXSwiYiVkIiwoaS1GSVJTVF9GSVhFRCkgKyAyNyk7DQorCS8vCQlyZWdzaXplW2ldPTQ7DQorCS8vCQlyZWd0eXBlW2ldPSZsdHlwOw0KKwkvLwl9DQorDQorCS8vIHN0YXRpYyBzdHJ1Y3QgVHlwIGxsdHlwZT17TExPTkd9LGx0eXA9e0xPTkd9LGxzaG9ydD17U0hPUlR9LGxjaGFyPXtDSEFSfTsNCisNCisJZm9yKGk9RklSU1RfMTZCSVQ7aTw9TEFTVF8xNkJJVDtpKyspDQorCXsNCisJCXJlZ25hbWVzW2ldPW15bWFsbG9jKDEwKTsNCisJCXNwcmludGYocmVnbmFtZXNbaV0sImElZCIsaS1GSVJTVF8xNkJJVCk7DQorCQlyZWdzaXplW2ldPTI7DQorCQlyZWd0eXBlW2ldPW15bWFsbG9jKHNpemVvZihzdHJ1Y3QgVHlwKSk7DQorCX0NCisNCisJZm9yKGk9RklSU1RfMzJCSVQ7aTw9TEFTVF8zMkJJVDtpKyspDQorCXsNCisJCXJlZ25hbWVzW2ldPW15bWFsbG9jKDEwKTsNCisJCXNwcmludGYocmVnbmFtZXNbaV0sImIlZCIsKGktRklSU1RfMzJCSVQpICsgNSk7DQorCQlyZWdzaXplW2ldPTQ7DQorCQlyZWd0eXBlW2ldPW15bWFsbG9jKHNpemVvZihzdHJ1Y3QgVHlwKSk7DQorCX0NCisNCisJZm9yKGk9RklSU1RfNjRCSVQ7aTw9TEFTVF82NEJJVDtpKyspDQorCXsNCisJCXJlZ25hbWVzW2ldPW15bWFsbG9jKDEwKTsNCisJCXNwcmludGYocmVnbmFtZXNbaV0sImMlZCIsKGktRklSU1RfNjRCSVQpICsgOSk7DQorCQlyZWdzaXplW2ldPTg7DQorCQlyZWd0eXBlW2ldPW15bWFsbG9jKHNpemVvZihzdHJ1Y3QgVHlwKSk7DQorCX0NCisNCisJZm9yKGk9RklSU1RfOEJJVDtpPD1MQVNUXzhCSVQ7aSsrKQ0KKwl7DQorCQlyZWduYW1lc1tpXT1teW1hbGxvYygxMCk7DQorCQlzcHJpbnRmKHJlZ25hbWVzW2ldLCJoJWQiLChpLUZJUlNUXzhCSVQpKTsNCisJCXJlZ3NpemVbaV09MTsNCisJCS8vcmVndHlwZVtpXT0mbGNoYXI7DQorCQlyZWd0eXBlW2ldPW15bWFsbG9jKHNpemVvZihzdHJ1Y3QgVHlwKSk7DQorCX0NCisNCisJcmVnbmFtZXNbU1RBQ0tfUE9JTlRFUl09bXltYWxsb2MoMTApOw0KKwlzcHJpbnRmKHJlZ25hbWVzW1NUQUNLX1BPSU5URVJdLCJ6MiIpOw0KKwlyZWdzaXplW1NUQUNLX1BPSU5URVJdPTQ7DQorCXJlZ3R5cGVbU1RBQ0tfUE9JTlRFUl09Jmx0eXA7DQorCXJlZ3R5cGVbU1RBQ0tfUE9JTlRFUl09bXltYWxsb2Moc2l6ZW9mKHN0cnVjdCBUeXApKTsNCisNCisJLyogIFVzZSBtdWx0aXBsZSBjY3MuICAgKi8NCisJbXVsdGlwbGVfY2NzPTA7DQorDQorCS8qICBJbml0aWFsaXplIHRoZSBtaW4vbWF4LXNldHRpbmdzLiBOb3RlIHRoYXQgdGhlIHR5cGVzIG9mIHRoZSAgICAgKi8NCisJLyogIGhvc3Qgc3lzdGVtIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgdGFyZ2V0IHN5c3RlbSBhbmQgeW91IG1heSAqLw0KKwkvKiAgb25seSB1c2UgdGhlIHNtYWxsZXN0IG1heGltdW0gdmFsdWVzIEFOU0kgZ3VhcmFudGVlcyBpZiB5b3UgICAgICovDQorCS8qICB3YW50IHRvIGJlIHBvcnRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJLyogIFRoYXQncyB0aGUgcmVhc29uIGZvciB0aGUgc3VidHJhY3Rpb24gaW4gdF9taW5bSU5UXS4gTG9uZyBjb3VsZCAqLw0KKwkvKiAgYmUgdW5hYmxlIHRvIHJlcHJlc2VudCAtMjE0NzQ4MzY0OCBvbiB0aGUgaG9zdCBzeXN0ZW0uICAgICAgICAgICovDQorCXRfbWluW0NIQVJdPWwyem0oLTEyOEwpOw0KKwl0X21pbltTSE9SVF09bDJ6bSgtMzI3NjhMKTsNCisJdF9taW5bSU5UXT16bXN1YihsMnptKC0yMTQ3NDgzNjQ3TCksbDJ6bSgxTCkpOw0KKwl0X21pbltMT05HXT10X21pbihJTlQpOw0KKwl0X21pbltMTE9OR109em1sc2hpZnQobDJ6bSgxTCksbDJ6bSg2M0wpKTsNCisJdF9taW5bTUFYSU5UXT10X21pbihMTE9ORyk7DQorCXRfbWF4W0NIQVJdPXVsMnp1bSgxMjdMKTsNCisJdF9tYXhbU0hPUlRdPXVsMnp1bSgzMjc2N1VMKTsNCisJdF9tYXhbSU5UXT11bDJ6dW0oMjE0NzQ4MzY0N1VMKTsNCisJdF9tYXhbTE9OR109dF9tYXgoSU5UKTsNCisJdF9tYXhbTExPTkddPXp1bXJzaGlmdCh6dW1rb21wbCh1bDJ6dW0oMFVMKSksdWwyenVtKDFVTCkpOw0KKwl0X21heFtNQVhJTlRdPXRfbWF4KExMT05HKTsNCisJdHVfbWF4W0NIQVJdPXVsMnp1bSgyNTVVTCk7DQorCXR1X21heFtTSE9SVF09dWwyenVtKDY1NTM1VUwpOw0KKwl0dV9tYXhbSU5UXT11bDJ6dW0oNDI5NDk2NzI5NVVMKTsNCisJdHVfbWF4W0xPTkddPXRfbWF4KFVOU0lHTkVEfElOVCk7DQorCXR1X21heFtMTE9OR109enVta29tcGwodWwyenVtKDBVTCkpOw0KKwl0dV9tYXhbTUFYSU5UXT10X21heChVTlNJR05FRHxMTE9ORyk7DQorDQorCWZvcihpPUZJUlNUXzE2QklUO2k8PUxBU1RfMTZCSVQtVk9MXzE2QklUO2krKykNCisJCXJlZ3NjcmF0Y2hbaV09MTsNCisJZm9yKGk9RklSU1RfMzJCSVQ7aTw9TEFTVF8zMkJJVC1WT0xfMzJCSVQ7aSsrKQ0KKwkJcmVnc2NyYXRjaFtpXT0xOw0KKwlmb3IoaT1GSVJTVF82NEJJVDtpPD1MQVNUXzY0QklULVZPTF82NEJJVDtpKyspDQorCQlyZWdzY3JhdGNoW2ldPTE7DQorCWZvcihpPUZJUlNUXzhCSVQ7aTw9TEFTVF84QklULVZPTF84QklUO2krKykNCisJCXJlZ3NjcmF0Y2hbaV09MTsNCisNCisJLyogIFJlc2VydmUgYSBmZXcgcmVnaXN0ZXJzIGZvciB1c2UgYnkgdGhlIGNvZGUtZ2VuZXJhdG9yLiAgICAgICovDQorCS8qICBUaGlzIGlzIG5vdCBvcHRpbWFsIGJ1dCBzaW1wbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwlzcD1TVEFDS19QT0lOVEVSOw0KKwl0OGJpdDE9RklSU1RfOEJJVDsNCisJdDhiaXQyPUZJUlNUXzhCSVQrMTsNCisJdDE2Yml0MT1GSVJTVF8xNkJJVDsNCisJdDE2Yml0Mj1GSVJTVF8xNkJJVCsxOw0KKwl0MzJiaXQxPUZJUlNUXzMyQklUOw0KKwl0MzJiaXQyPUZJUlNUXzMyQklUKzE7DQorCXQ2NGJpdDE9RklSU1RfNjRCSVQ7DQorCXQ2NGJpdDI9RklSU1RfNjRCSVQrMTsNCisJcmVnc2FbdDhiaXQxXT1yZWdzYVt0OGJpdDJdPTE7DQorCXJlZ3NhW3QxNmJpdDFdPXJlZ3NhW3QxNmJpdDJdPTE7DQorCXJlZ3NhW3QzMmJpdDFdPXJlZ3NhW3QzMmJpdDJdPTE7DQorCXJlZ3NhW3Q2NGJpdDFdPXJlZ3NhW3Q2NGJpdDJdPTE7DQorCXJlZ3NhW3NwXT0xOw0KKwlyZWdzY3JhdGNoW3Q4Yml0MV09cmVnc2NyYXRjaFt0OGJpdDJdPTA7DQorCXJlZ3NjcmF0Y2hbdDE2Yml0MV09cmVnc2NyYXRjaFt0MTZiaXQyXT0wOw0KKwlyZWdzY3JhdGNoW3QzMmJpdDFdPXJlZ3NjcmF0Y2hbdDMyYml0Ml09MDsNCisJcmVnc2NyYXRjaFt0NjRiaXQxXT1yZWdzY3JhdGNoW3Q2NGJpdDJdPTA7DQorCXJlZ3NjcmF0Y2hbc3BdPTA7DQorDQorCS8vCWZvcihpPUZJUlNUX0ZJWEVEO2k8PUxBU1RfRklYRUQtVk9MX0ZJWEVEO2krKykNCisJLy8JCXJlZ3NjcmF0Y2hbaV09MTsNCisJdGFyZ2V0X21hY3Jvcz1tYXJyYXk7DQorDQorCXJldHVybiAxOw0KK30NCisNCit2b2lkIGluaXRfZGIoRklMRSAqZikNCit7DQorfQ0KKw0KK2ludCBmcmV0dXJuKHN0cnVjdCBUeXAgKnQpDQorLyogIFJldHVybnMgdGhlIHJlZ2lzdGVyIGluIHdoaWNoIHZhcmlhYmxlcyBvZiB0eXBlIHQgYXJlIHJldHVybmVkLiAqLw0KKy8qICBJZiB0aGUgdmFsdWUgY2Fubm90IGJlIHJldHVybmVkIGluIGEgcmVnaXN0ZXIgcmV0dXJucyAwLiAgICAgICAgKi8NCisvKiAgQSBwb2ludGVyIE1VU1QgYmUgcmV0dXJuZWQgaW4gYSByZWdpc3Rlci4gVGhlIGNvZGUtZ2VuZXJhdG9yICAgICovDQorLyogIGhhcyB0byBzaW11bGF0ZSBhIHBzZXVkbyByZWdpc3RlciBpZiBuZWNlc3NhcnkuICAgICAgICAgICAgICAgICAqLw0KK3sNCisJaWYoSVNTVFJVQ1QodC0+ZmxhZ3MpfHxJU1VOSU9OKHQtPmZsYWdzKSkgDQorCQlyZXR1cm4gMDsNCisJaWYodC0+c2l6ZSA9PSAxKQ0KKwkJcmV0dXJuIEZJUlNUXzhCSVQrMzsNCisJaWYodC0+c2l6ZSA9PSAyKQ0KKwkJcmV0dXJuIEZJUlNUXzE2QklUKzM7DQorCWlmKHQtPnNpemUgPT0gNCkNCisJCXJldHVybiBGSVJTVF8zMkJJVCszOw0KKwlpZih0LT5zaXplID09IDgpDQorCQlyZXR1cm4gRklSU1RfNjRCSVQrMzsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2ludCByZWdfcGFpcihpbnQgcixzdHJ1Y3QgcnBhaXIgKnApDQorLyogUmV0dXJucyAwIGlmIHRoZSByZWdpc3RlciBpcyBubyByZWdpc3RlciBwYWlyLiBJZiByICAqLw0KKy8qIGlzIGEgcmVnaXN0ZXIgcGFpciBub24temVybyB3aWxsIGJlIHJldHVybmVkIGFuZCB0aGUgKi8NCisvKiBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBwIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHR3byAgICovDQorLyogZWxlbWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KK3sNCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qIGVzdGltYXRlIHRoZSBjb3N0LXNhdmluZyBpZiBvYmplY3QgbyBmcm9tIElDIHAgaXMgcGxhY2VkIGluDQorcmVnaXN0ZXIgciAqLw0KK2ludCBjb3N0X3NhdmluZ3Moc3RydWN0IElDICpwLGludCByLHN0cnVjdCBvYmogKm8pDQorew0KKwlpbnQgYz1wLT5jb2RlOw0KKwlpZihvLT5mbGFncyZWS09OU1QpDQorCXsNCisJCWlmKCFMT0FEX1NUT1JFKQ0KKwkJCXJldHVybiAwOw0KKwkJaWYobz09JnAtPnExJiZwLT5jb2RlPT1BU1NJR04mJihwLT56LmZsYWdzJkRSRUZPQkopKQ0KKwkJCXJldHVybiA0Ow0KKwkJZWxzZQ0KKwkJCXJldHVybiAyOw0KKwl9DQorCWlmKG8tPmZsYWdzJkRSRUZPQkopDQorCQlyZXR1cm4gNDsNCisJaWYoYz09U0VUUkVUVVJOJiZyPT1wLT56LnJlZyYmIShvLT5mbGFncyZEUkVGT0JKKSkNCisJCXJldHVybiAzOw0KKwlpZihjPT1HRVRSRVRVUk4mJnI9PXAtPnExLnJlZyYmIShvLT5mbGFncyZEUkVGT0JKKSkNCisJCXJldHVybiAzOw0KKwlyZXR1cm4gMjsNCit9DQorDQoraW50IHJlZ29rKGludCByLGludCB0LGludCBtb2RlKQ0KKy8qICBSZXR1cm5zIDAgaWYgcmVnaXN0ZXIgciBjYW5ub3Qgc3RvcmUgdmFyaWFibGVzIG9mICAgKi8NCisvKiAgdHlwZSB0LiBJZiB0PT1QT0lOVEVSIGFuZCBtb2RlIT0wIHRoZW4gaXQgcmV0dXJucyAgICovDQorLyogIG5vbi16ZXJvIG9ubHkgaWYgdGhlIHJlZ2lzdGVyIGNhbiBzdG9yZSBhIHBvaW50ZXIgICAqLw0KKy8qICBhbmQgZGVyZWZlcmVuY2UgYSBwb2ludGVyIHRvIG1vZGUuICAgICAgICAgICAgICAgICAgKi8NCit7DQorCWlmKHI9PTApDQorCQlyZXR1cm4gMDsNCisJdCY9TlE7DQorDQorCWlmKHI+PUZJUlNUXzhCSVQmJnI8PUxBU1RfOEJJVCkNCisJew0KKy8vCQlwcmludGYoIjggYml0IHJlZ2lzdGVyOiAiKTsNCisJCWlmKHQgPT0gQ0hBUikNCisJCXsNCisvLwkJCXByaW50ZigiIGNhbiBmaXRcbiIpOw0KKwkJCXJldHVybiAxOw0KKwkJfQ0KKy8vCQllbHNlDQorLy8JCQlwcmludGYoIiBjYW4ndCBmaXRcbiIpOw0KKwl9DQorCWVsc2UgaWYocj49RklSU1RfMTZCSVQmJnI8PUxBU1RfMTZCSVQpDQorCXsNCisvLwkJcHJpbnRmKCIxNiBiaXQgcmVnaXN0ZXI6ICIpOw0KKwkJaWYodCA9PSBTSE9SVCkNCisJCXsNCisvLwkJCXByaW50ZigiIGNhbiBmaXRcbiIpOw0KKwkJCXJldHVybiAxOw0KKwkJfQ0KKy8vCQllbHNlDQorLy8JCQlwcmludGYoIiBjYW4ndCBmaXRcbiIpOw0KKwl9DQorCWVsc2UgaWYocj49RklSU1RfMzJCSVQmJnI8PUxBU1RfMzJCSVQpDQorCXsNCisvLwkJcHJpbnRmKCIzMiBiaXQgcmVnaXN0ZXI6ICIpOw0KKwkJaWYodCA9PSBJTlQgfHwgdCA9PSBMT05HIHx8IHQgPT0gRkxPQVQNCisJCQl8fHQgPT0gUE9JTlRFUikNCisJCXsNCisvLwkJCXByaW50ZigiIGNhbiBmaXRcbiIpOw0KKwkJCXJldHVybiAxOw0KKwkJfQ0KKy8vCQlldHNlDQorLy8JCQlwcmludGYoIiBjYW4ndCBmaXRcbiIpOw0KKwl9DQorCWVsc2UgaWYocj49RklSU1RfNjRCSVQmJnI8PUxBU1RfNjRCSVQpDQorCXsNCisvLwkJcHJpbnRmKCI2NCBiaXQgcmVnaXN0ZXI6ICIpOw0KKwkJaWYodCA9PSBMRE9VQkxFIHx8IHQgPT0gRE9VQkxFIHx8IHQgPT0gTExPTkcpDQorCQl7DQorLy8JCQlwcmludGYoIiBjYW4gZml0XG4iKTsNCisJCQlyZXR1cm4gMTsNCisJCX0NCisvLwkJZWxzZQ0KKy8vCQkJcHJpbnRmKCIgY2FuJ3QgZml0XG4iKTs7DQorCX0NCisNCisJcmV0dXJuIDA7DQorDQorDQorCS8qI2RlZmluZSBDSEFSIDENCisJI2RlZmluZSBTSE9SVCAyDQorCSNkZWZpbmUgSU5UIDMNCisJI2RlZmluZSBMT05HIDQNCisJI2RlZmluZSBMTE9ORyA1DQorCSNkZWZpbmUgRkxPQVQgNg0KKwkjZGVmaW5lIERPVUJMRSA3DQorCSNkZWZpbmUgTERPVUJMRSA4DQorCSNkZWZpbmUgVk9JRCA5DQorCSNkZWZpbmUgUE9JTlRFUiAxMA0KKwkjZGVmaW5lIEFSUkFZIDExDQorCSNkZWZpbmUgU1RSVUNUIDEyDQorCSNkZWZpbmUgVU5JT04gMTMNCisJI2RlZmluZSBFTlVNIDE0Ki8NCit9DQorDQoraW50IGRhbmdlcm91c19JQyhzdHJ1Y3QgSUMgKnApDQorLyogIFJldHVybnMgemVybyBpZiB0aGUgSUMgcCBjYW4gYmUgc2FmZWx5IGV4ZWN1dGVkICAgICAqLw0KKy8qICB3aXRob3V0IGRhbmdlciBvZiBleGNlcHRpb25zIG9yIHNpbWlsYXIgdGhpbmdzLiAgICAgKi8NCisvKiAgdmJjYyBtYXkgZ2VuZXJhdGUgY29kZSBpbiB3aGljaCBub24tZGFuZ2Vyb3VzIElDcyAgICovDQorLyogIGFyZSBzb21ldGltZXMgZXhlY3V0ZWQgYWx0aG91Z2ggY29udHJvbC1mbG93IG1heSAgICAqLw0KKy8qICBuZXZlciByZWFjaCB0aGVtIChtYWlubHkgd2hlbiBtb3ZpbmcgY29tcHV0YXRpb25zICAgKi8NCisvKiAgb3V0IG9mIGxvb3BzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorLyogIFR5cGljYWwgSUNzIHRoYXQgZ2VuZXJhdGUgZXhjZXB0aW9ucyBvbiBzb21lICAgICAgICAqLw0KKy8qICBtYWNoaW5lcyBhcmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisvKiAgICAgIC0gYWNjZXNzZXMgdmlhIHBvaW50ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICovDQorLyogICAgICAtIGRpdmlzaW9uL21vZHVsbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKy8qICAgICAgLSBvdmVyZmxvdyBvbiBzaWduZWQgaW50ZWdlci9mbG9hdHMgICAgICAgICAgICAgKi8NCit7DQorCWludCBjPXAtPmNvZGU7DQorCWlmKChwLT5xMS5mbGFncyZEUkVGT0JKKXx8KHAtPnEyLmZsYWdzJkRSRUZPQkopfHwocC0+ei5mbGFncyZEUkVGT0JKKSkNCisJCXJldHVybiAxOw0KKwlpZigoYz09RElWfHxjPT1NT0QpJiYhaXNjb25zdChxMikpDQorCQlyZXR1cm4gMTsNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBtdXN0X2NvbnZlcnQoaW50IG8saW50IHQsaW50IGNvbnN0X2V4cHIpDQorLyogIFJldHVybnMgemVybyBpZiBjb2RlIGZvciBjb252ZXJ0aW5nIG5wIHRvIHR5cGUgdCAgICAqLw0KKy8qICBjYW4gYmUgb21pdHRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisvKiAgT24gdGhlIFBvd2VyUEMgY3B1IHBvaW50ZXJzIGFuZCAzMmJpdCAgICAgICAgICAgICAgICovDQorLyogIGludGVnZXJzIGhhdmUgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gYW5kIGNhbiB1c2UgICAqLw0KKy8qICB0aGUgc2FtZSByZWdpc3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCit7DQorCWludCBvcD1vJk5RLHRwPXQmTlE7DQorDQorCWlmKG9wID09IExPTkcgfHwgb3AgPT0gUE9JTlRFUikNCisJCW9wID0gSU5UOw0KKw0KKwlpZih0cD09TE9ORyB8fCB0cCA9PVBPSU5URVIpDQorCQl0cCA9IElOVDsNCisNCisJaWYob3AgPT0gdHApIC8vIHNhbWUgdHlwZQ0KKwkJaWYoKG8gJiBOUSk9PSAodCAmIE5RKSkgLy8gc2FtZSBzaWduZXNzDQorCQkJcmV0dXJuIDA7IC8vIG5vIGNvZGUgbmVlZGVkDQorDQorCXJldHVybiAxOw0KK30NCisNCit2b2lkIGdlbl9kcyhGSUxFICpmLHptYXggc2l6ZSxzdHJ1Y3QgVHlwICp0KQ0KKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjcmVhdGUgPHNpemU+IGJ5dGVzIG9mIHN0b3JhZ2UgKi8NCisvKiAgaW5pdGlhbGl6ZWQgd2l0aCB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorew0KKwlpZihuZXdvYmomJnNlY3Rpb24hPVNQRUNJQUwpDQorCQllbWl0KGYsIiBkYXRhICVsZFxuIix6bTJsKHNpemUpKTsNCisJZWxzZQ0KKwkJZW1pdChmLCIgZGF0YSAlbGRcbiIsem0ybChzaXplKSk7DQorCW5ld29iaj0wOw0KK30NCisNCit2b2lkIGdlbl9hbGlnbihGSUxFICpmLHptYXggYWxpZ24pDQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIG1ha2Ugc3VyZSB0aGUgbmV4dCBkYXRhIGlzICAgICAqLw0KKy8qICBhbGlnbmVkIHRvIG11bHRpcGxlcyBvZiA8YWxpZ24+IGJ5dGVzLiAgICAgICAgICAgICAgKi8NCit7DQorCWlmKHptMmwoYWxpZ24pPjEpDQorCQllbWl0KGYsIjsgTk9UIElNUExFTUVOVEVEIC0gXHQuYWxpZ25cdCVkXG4iLCBhbGlnbik7DQorfQ0KKw0KK3ZvaWQgZ2VuX3Zhcl9oZWFkKEZJTEUgKmYsc3RydWN0IFZhciAqdikNCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIHRoZSBoZWFkIG9mIGEgdmFyaWFibGUgICovDQorLyogIGRlZmluaXRpb24sIGkuZS4gdGhlIGxhYmVsIGFuZCBpbmZvcm1hdGlvbiBmb3IgICAgICAqLw0KKy8qICBsaW5rYWdlIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCit7DQorCWludCBjb25zdGZsYWc7DQorCWNoYXIgKnNlYzsNCisJaWYodi0+Y2xpc3QpIGNvbnN0ZmxhZz1pc19jb25zdCh2LT52dHlwKTsNCisJaWYodi0+c3RvcmFnZV9jbGFzcz09U1RBVElDKQ0KKwl7DQorCQlpZihJU0ZVTkModi0+dnR5cC0+ZmxhZ3MpKQ0KKwkJCXJldHVybjsNCisJCWlmKCFzcGVjaWFsX3NlY3Rpb24oZix2KSkNCisJCXsNCisJCQlpZih2LT5jbGlzdCYmKCFjb25zdGZsYWd8fChnX2ZsYWdzWzJdJlVTRURGTEFHKSkmJnNlY3Rpb24hPURBVEEpe2VtaXQoZixkYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1EQVRBO30NCisJCQlpZih2LT5jbGlzdCYmY29uc3RmbGFnJiYhKGdfZmxhZ3NbMl0mVVNFREZMQUcpJiZzZWN0aW9uIT1ST0RBVEEpe2VtaXQoZixyb2RhdGFuYW1lKTtpZihmKSBzZWN0aW9uPVJPREFUQTt9DQorCQkJaWYoIXYtPmNsaXN0JiZzZWN0aW9uIT1CU1Mpe2VtaXQoZixic3NuYW1lKTtpZihmKSBzZWN0aW9uPUJTUzt9DQorCQl9DQorCQlpZih2LT5jbGlzdHx8c2VjdGlvbj09U1BFQ0lBTCkNCisJCXsNCisJCQlnZW5fYWxpZ24oZixmYWxpZ24odi0+dnR5cCkpOw0KKwkJCWVtaXQoZiwiJXMlbGQ6XG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJCWVtaXQoZiwiXHQubGNvbW1cdCVzJWxkLCIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7DQorCQluZXdvYmo9MTsNCisJfQ0KKwlpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pDQorCXsNCisJCS8vICBlbWl0KGYsIlx0Lmdsb2JsXHQlcyVzXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOw0KKwkJaWYodi0+ZmxhZ3MmKERFRklORUR8VEVOVEFUSVZFKSkNCisJCXsNCisJCQlpZighc3BlY2lhbF9zZWN0aW9uKGYsdikpDQorCQkJew0KKwkJCQlpZih2LT5jbGlzdCYmKCFjb25zdGZsYWd8fChnX2ZsYWdzWzJdJlVTRURGTEFHKSkmJnNlY3Rpb24hPURBVEEpDQorCQkJCXsNCisJCQkJCWVtaXQoZixkYXRhbmFtZSk7DQorCQkJCQlpZihmKQ0KKwkJCQkJCXNlY3Rpb249REFUQTsNCisJCQkJfQ0KKwkJCQlpZih2LT5jbGlzdCYmY29uc3RmbGFnJiYhKGdfZmxhZ3NbMl0mVVNFREZMQUcpJiZzZWN0aW9uIT1ST0RBVEEpDQorCQkJCXsNCisJCQkJCWVtaXQoZixyb2RhdGFuYW1lKTsNCisJCQkJCWlmKGYpDQorCQkJCQkJc2VjdGlvbj1ST0RBVEE7DQorCQkJCX0NCisJCQkJaWYoIXYtPmNsaXN0JiZzZWN0aW9uIT1CU1MpDQorCQkJCXsNCisJCQkJCWVtaXQoZixic3NuYW1lKTsNCisJCQkJCWlmKGYpDQorCQkJCQkJc2VjdGlvbj1CU1M7DQorCQkJCX0NCisJCQl9DQorCQkJaWYodi0+Y2xpc3R8fHNlY3Rpb249PVNQRUNJQUwpDQorCQkJew0KKwkJCQlnZW5fYWxpZ24oZixmYWxpZ24odi0+dnR5cCkpOw0KKwkJCQkvLyAgICAgICAgZW1pdChmLCIlcyVzOlxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCQllbWl0KGYsIi5nbG9iYWwgJXMlczoiLC8qKFVTRV9DT01NT05TPyIiOiJsIiksKi9pZHByZWZpeCx2LT5pZGVudGlmaWVyKTsNCisJCQluZXdvYmo9MTsNCisJCX0NCisJfQ0KK30NCisNCit2b2lkIGdlbl9kYyhGSUxFICpmLGludCB0LHN0cnVjdCBjb25zdF9saXN0ICpwKQ0KKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjcmVhdGUgc3RhdGljIHN0b3JhZ2UgICAgICAgICAgKi8NCisvKiAgaW5pdGlhbGl6ZWQgd2l0aCBjb25zdC1saXN0IHAuICAgICAgICAgICAgICAgICAgICAgICovDQorew0KKwkvL2VtaXQoZiwiXHRkYy4lc1x0IixkdCh0Jk5RKSk7DQorCWludCBvID0gdCZOUTsNCisJaW50IHNpemUgPSA0Ow0KKwlpZihvID09IENIQVIpDQorCQlzaXplID0gMTsNCisJaWYobyA9PSBTSE9SVCkNCisJCXNpemUgPSAyOw0KKwlpZihvID09IExMT05HIHx8IHQgPT0gRE9VQkxFKQ0KKwkJc2l6ZSA9IDg7DQorDQorCWVtaXQoZiwiXHRkYXRhXHQlaVx0IixzaXplKTsNCisJaWYoIXAtPnRyZWUpDQorCXsNCisJCWlmKElTRkxPQVQodCkpDQorCQl7DQorCQkJLyogIGF1Y2ggd2llZGVyIG5pY2h0IHNlaHIgc2Nob2VuIHVuZCBJRUVFIG5vZXRpZyAgICovDQorCQkJdW5zaWduZWQgY2hhciAqaXA7DQorCQkJaXA9KHVuc2lnbmVkIGNoYXIgKikmcC0+dmFsLnZkb3VibGU7DQorCQkJZW1pdChmLCIweCUwMnglMDJ4JTAyeCUwMngiLGlwWzBdLGlwWzFdLGlwWzJdLGlwWzNdKTsNCisJCQlpZigodCZOUSkhPUZMT0FUKXsNCisJCQkJZW1pdChmLCIsMHglMDJ4JTAyeCUwMnglMDJ4IixpcFs0XSxpcFs1XSxpcFs2XSxpcFs3XSk7DQorCQkJfQ0KKwkJfQ0KKwkJZWxzZSBpZihvICYgVU5TSUdORUQpDQorCQl7DQorCQkJZW1pdHZhbChmLCZwLT52YWwsdCk7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJZW1pdChmLCAiMHMiKTsNCisJCQllbWl0dmFsKGYsJnAtPnZhbCx0KTsNCisJCX0NCisJfQ0KKwllbHNlDQorCXsNCisJCWVtaXRfb2JqKGYsJnAtPnRyZWUtPm8sdCk7DQorCX0NCisJZW1pdChmLCJcbiIpOw0KKwluZXdvYmo9MDsNCit9DQorDQorDQorLyogIFRoZSBtYWluIGNvZGUtZ2VuZXJhdGlvbiByb3V0aW5lLiAgICAgICAgICAgICAgICAgICAqLw0KKy8qICBmIGlzIHRoZSBzdHJlYW0gdGhlIGNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8uICAgICAgKi8NCisvKiAgcCBpcyBhIHBvaW50ZXIgdG8gYSBkb3VibHkgbGlua2VkIGxpc3Qgb2YgSUNzICAgICAgICovDQorLyogIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIGJvZHkgdG8gZ2VuZXJhdGUgY29kZSBmb3IuICAqLw0KKy8qICB2IGlzIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgKi8NCisvKiAgb2Zmc2V0IGlzIHRoZSBzaXplIG9mIHRoZSBzdGFja2ZyYW1lIHRoZSBmdW5jdGlvbiAgICovDQorLyogIG5lZWRzIGZvciBsb2NhbCB2YXJpYWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKw0KK3ZvaWQgZ2VuX2NvZGUoRklMRSAqZixzdHJ1Y3QgSUMgKnAsc3RydWN0IFZhciAqdix6bWF4IG9mZnNldCkNCisvKiAgVGhlIG1haW4gY29kZS1nZW5lcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KK3sNCisJaW50IGMsdCxpLGxhc3Rjb21wPTA7DQorCXN0cnVjdCBJQyAqbTsNCisJYXJnc2l6ZT0wOw0KKwlpZihERUJVRyYxKQ0KKwkJcHJpbnRmKCJnZW5fY29kZSgpXG4iKTsNCisJZm9yKGM9MTtjPD1NQVhSO2MrKykNCisJCXJlZ3NbY109cmVnc2FbY107DQorCW1heHB1c2hlZD0wOw0KKw0KKwkvKkZJWE1FKi8NCisJcmV0PSJcdHJldFxuIjsNCisNCisJc3RydWN0IElDICpwX3Rlc3QgPSAwOw0KKwljaGFyIHRlc3RfaGFuZGxlZCA9IDA7DQorCWludCB0ZXN0X3JlZyA9IDA7DQorCWludCB0ZXN0X3JlZzIgPSAwOw0KKw0KKwlmb3IobT1wO207bT1tLT5uZXh0KQ0KKwl7DQorCQljPW0tPmNvZGU7dD1tLT50eXBmOw0KKwkJaWYoYz09QUxMT0NSRUcpDQorCQl7DQorCQkJcmVnc1ttLT5xMS5yZWddPTE7DQorCQkJY29udGludWU7DQorCQl9DQorCQlpZihjPT1GUkVFUkVHKQ0KKwkJew0KKwkJCXJlZ3NbbS0+cTEucmVnXT0wOw0KKwkJCWNvbnRpbnVlOw0KKwkJfQ0KKw0KKwkJLyogY29udmVydCBNVUxUL0RJVi9NT0Qgd2l0aCBwb3dlcnMgb2YgdHdvICovDQorCQlpZigodCZOUSk8PUxPTkcmJihtLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCYmKHQmTlEpPD1MT05HJiYoYz09TVVMVHx8KChjPT1ESVZ8fGM9PU1PRCkmJih0JlVOU0lHTkVEKSkpKQ0KKwkJew0KKwkJCWV2YWxfY29uc3QoJm0tPnEyLnZhbCx0KTsNCisJCQlpPXBvZjIodm1heCk7DQorCQkJaWYoaSkNCisJCQl7DQorCQkJCWlmKGM9PU1PRCkNCisJCQkJew0KKwkJCQkJdm1heD16bXN1Yih2bWF4LGwyem0oMUwpKTsNCisJCQkJCW0tPmNvZGU9QU5EOw0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJdm1heD1sMnptKGktMSk7DQorCQkJCQlpZihjPT1ESVYpDQorCQkJCQkJbS0+Y29kZT1SU0hJRlQ7DQorCQkJCQllbHNlDQorCQkJCQkJbS0+Y29kZT1MU0hJRlQ7DQorCQkJCX0NCisJCQkJYz1tLT5jb2RlOw0KKwkJCQlndmFsLnZtYXg9dm1heDsNCisJCQkJZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOw0KKwkJCQlpZihjPT1BTkQpDQorCQkJCXsNCisJCQkJCWluc2VydF9jb25zdCgmbS0+cTIudmFsLHQpOw0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJaW5zZXJ0X2NvbnN0KCZtLT5xMi52YWwsSU5UKTsNCisJCQkJCXAtPnR5cGYyPUlOVDsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisjaWYgRklYRURfU1ANCisJCWlmKGM9PUNBTEwmJmFyZ3NpemU8em0ybChtLT5xMi52YWwudm1heCkpDQorCQkJYXJnc2l6ZT16bTJsKG0tPnEyLnZhbC52bWF4KTsNCisjZW5kaWYNCisJfQ0KKwlwZWVwaG9sZShwKTsNCisNCisJZm9yKGM9MTtjPD1NQVhSO2MrKykNCisJew0KKwkJaWYocmVnc2FbY118fHJlZ3VzZWRbY10pDQorCQl7DQorCQkJQlNFVChyZWdzX21vZGlmaWVkLGMpOw0KKwkJfQ0KKwl9DQorDQorCWxvY2Fsc2l6ZT0oem0ybChvZmZzZXQpKzMpLzQqNDsNCisjaWYgRklYRURfU1ANCisJLypGSVhNRTogYWRqdXN0IGxvY2Fsc2l6ZSB0byBnZXQgYW4gYWxpZ25lZCBzdGFjay1mcmFtZSAqLw0KKyNlbmRpZg0KKw0KKwlmdW5jdGlvbl90b3AoZix2LGxvY2Fsc2l6ZSk7DQorDQorCXN0YWNrb2Zmc2V0PW5vdHBvcHBlZD1kb250cG9wPTA7DQorDQorCWZvcig7cDtwPXAtPm5leHQpDQorCXsNCisJCWM9cC0+Y29kZTt0PXAtPnR5cGY7DQorCQlpZihjPT1OT1ApDQorCQl7DQorCQkJcC0+ei5mbGFncz0wOw0KKwkJCWNvbnRpbnVlOw0KKwkJfQ0KKw0KKwkJaWYoYz09QUxMT0NSRUcpDQorCQl7DQorCQkJcmVnc1twLT5xMS5yZWddPTE7DQorCQkJY29udGludWU7DQorCQl9DQorDQorCQlpZihjPT1GUkVFUkVHKQ0KKwkJew0KKwkJCXJlZ3NbcC0+cTEucmVnXT0wOw0KKwkJCWNvbnRpbnVlOw0KKwkJfQ0KKwkJaWYoYz09TEFCRUwpDQorCQl7DQorCQkJZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsdCk7DQorCQkJY29udGludWU7DQorCQl9DQorDQorCQlpZihub3Rwb3BwZWQmJiFkb250cG9wKQ0KKwkJew0KKwkJCWlmKGM9PUxBQkVMfHxjPT1DT01QQVJFfHxjPT1URVNUfHxjPT1CUkEpDQorCQkJew0KKwkJCQllbWl0KGYsIlx0YWRkbFx0JCVsZCwlJWVzcFxuIixub3Rwb3BwZWQpOw0KKwkJCQlwb3Aobm90cG9wcGVkKTsNCisJCQkJbm90cG9wcGVkPTA7DQorCQkJfQ0KKwkJfQ0KKwkJaWYoYz09QlJBKQ0KKwkJew0KKwkJCWVtaXQoZiwiXHRtb3YgYjI5ICVzJWRcbiIsIGxhYnByZWZpeCwgdCk7DQorCQkJZW1pdChmLCJcdGptcFx0YjI5XG4iKTsNCisNCisJCQkvL2VtaXQoZiwiXHRtb3YgYjI5XHQiKTsNCisJCQkvL2lmKGlzcmVnKHExKSl7DQorCQkJLy9lbWl0X29iaihmLCZwLT5xMSwwKTsNCisJCQkvL2VtaXQoZiwiLCIpOw0KKwkJCS8vfQ0KKwkJCS8vZW1pdChmLCIlcyVkO1xuIixsYWJwcmVmaXgsdCk7DQorCQkJY29udGludWU7DQorCQl9DQorDQorCQlpZihjPT1NT1ZFVE9SRUcpDQorCQl7DQorCQkJLy9wcmludGYoInJlZzogJXNcbiIsIHJlZ25hbWVzW3AtPnoucmVnXSk7DQorCQkJaWYocC0+ei5yZWcgPD0gTUFYUikNCisJCQkJbG9hZF9yZWcoZixwLT56LnJlZywmcC0+cTEscmVndHlwZVtwLT56LnJlZ10tPmZsYWdzKTsNCisJCQllbHNlDQorCQkJCWVtaXQoZiwiIDsgbW92ZSBub24gZXhpc3RhbnQgcmVnIGluIHRvICVzXG4iLHJlZ25hbWVzW3AtPnExLnJlZ10pOw0KKwkJCWNvbnRpbnVlOw0KKwkJfQ0KKwkJaWYoYz09TU9WRUZST01SRUcpDQorCQl7DQorCQkJLy8JCQlwcmludGYoInJlZzogJXNcbiIsIHJlZ25hbWVzW3AtPnoucmVnXSk7DQorCQkJaWYocC0+ei5yZWcgPD0gTUFYUikNCisJCQkJc3RvcmVfcmVnKGYsIHAtPnoucmVnLCAmcC0+cTEsIHJlZ3R5cGVbcC0+ei5yZWddLT5mbGFncyk7DQorCQkJY29udGludWU7DQorCQl9DQorCQlpZigoYz09QVNTSUdOfHxjPT1QVVNIKSYmKCh0Jk5RKT5QT0lOVEVSfHwoKHQmTlEpPT1DSEFSJiZ6bTJsKHAtPnEyLnZhbC52bWF4KSE9MSkpKQ0KKwkJew0KKwkJCWllcnJvcigwKTsNCisJCX0NCisJCXA9cHJlbG9hZChmLHApOw0KKwkJYz1wLT5jb2RlOw0KKwkJaWYoYz09U1VCUEZQKQ0KKwkJCWM9U1VCOw0KKwkJaWYoYz09QURESTJQKQ0KKwkJCWM9QUREOw0KKwkJaWYoYz09U1VCSUZQKQ0KKwkJCWM9U1VCOw0KKwkJaWYoYz09Q09OVkVSVCkNCisJCXsNCisJCQlsb2FkX3JlZyhmLHpyZWcsJnAtPnExLHAtPnR5cGYyKTsNCisJCQlpZihJU0ZMT0FUKHAtPnR5cGYpKSAvLyBjb252ZXJ0IHRvIGZsb2F0DQorCQkJew0KKwkJCQlpZihJU0ZMT0FUKHAtPnR5cGYyKSkgLy8gZnJvbSBmbG9hdA0KKwkJCQl7CQkJCQkNCisJCQkJCS8vCQkJCQllbWl0KGYsIlx0bW92Zlx0JXNcdCVzXG4iLCByZWduYW1lc1t6cmVnXSwgcmVnbmFtZXNbcC0+cTEucmVnXSk7DQorCQkJCX0NCisJCQkJZWxzZSBpZighKHAtPnR5cGYyICYgVU5TSUdORUQpKSAvLyBmcm9tIHNpZ25lZA0KKwkJCQl7DQorCQkJCQkvLwkJCQkJZW1pdChmLCJcdG1vdnNcdCVzXHQlc1xuIiwgcmVnbmFtZXNbenJlZ10sIHJlZ25hbWVzW3AtPnExLnJlZ10pOw0KKwkJCQkJZW1pdChmLCJcdHN0Zlx0JXMgOyVzXG4iLHJlZ25hbWVzW3pyZWddLGR0KHExdHlwKHApKSk7DQorCQkJCX0NCisJCQkJZWxzZSBpZihwLT50eXBmMiAmIFVOU0lHTkVEKSAvLyBmcm9tIHVuc2lnbmVkDQorCQkJCXsNCisJCQkJCS8vCQkJCQllbWl0KGYsIlx0bW92XHQlc1x0JXNcbiIsIHJlZ25hbWVzW3pyZWddLCByZWduYW1lc1twLT5xMS5yZWddKTsNCisJCQkJCWVtaXQoZiwiXHR1dGZcdCVzIDslc1xuIixyZWduYW1lc1t6cmVnXSxkdChxMXR5cChwKSkpOw0KKwkJCQl9DQorCQkJfQ0KKwkJCWVsc2UgaWYoIShwLT50eXBmICYgVU5TSUdORUQpKSAvLyBjb252ZXJ0IHRvIHNpZ25lZA0KKwkJCXsNCisJCQkJaWYoSVNGTE9BVChwLT50eXBmMikpIC8vIGZyb20gZmxvYXQNCisJCQkJew0KKwkJCQkJLy8JCQkJCWVtaXQoZiwiXHRtb3ZmXHQlc1x0JXNcbiIsIHJlZ25hbWVzW3pyZWddLCByZWduYW1lc1twLT5xMS5yZWddKTsNCisJCQkJCWVtaXQoZiwiXHRmdHNcdCVzIDslc1xuIixyZWduYW1lc1t6cmVnXSxkdChxMXR5cChwKSkpOw0KKwkJCQl9DQorCQkJCWVsc2UgaWYoIShwLT50eXBmMiAmIFVOU0lHTkVEKSkgLy8gZnJvbSBzaWduZWQNCisJCQkJew0KKwkJCQkJLy8JCQkJCWVtaXQoZiwiXHRtb3ZzXHQlc1x0JXNcbiIsIHJlZ25hbWVzW3pyZWddLCByZWduYW1lc1twLT5xMS5yZWddKTsNCisJCQkJfQ0KKwkJCQllbHNlIGlmKHAtPnR5cGYyICYgVU5TSUdORUQpIC8vIGZyb20gdW5zaWduZWQNCisJCQkJew0KKwkJCQkJLy8JCQkJCWVtaXQoZiwiXHRtb3ZcdCVzXHQiLCByZWduYW1lc1t6cmVnXSk7DQorCQkJCQkvLwkJCQkJZW1pdF9vYmooZiwmcC0+cTEscC0+dHlwZjIpOw0KKy8vCQkJCQllbWl0KGYsIlxuXHR1dHNcdCVzIDslc1xuIixyZWduYW1lc1t6cmVnXSxkdChxMXR5cChwKSkpOw0KKwkJCQl9DQorCQkJfQ0KKwkJCWVsc2UgaWYocC0+dHlwZiAmIFVOU0lHTkVEKSAvLyBjb252ZXJ0IHRvIHVuc2lnbmVkDQorCQkJew0KKwkJCQlpZihJU0ZMT0FUKHAtPnR5cGYyKSkgLy8gZnJvbSBmbG9hdA0KKwkJCQl7DQorCQkJCQkvLwkJCQkJZW1pdChmLCJcdG1vdmZcdCVzXHQlc1xuIiwgcmVnbmFtZXNbenJlZ10sIHJlZ25hbWVzW3AtPnExLnJlZ10pOw0KKwkJCQkJZW1pdChmLCJcdGZ0dVx0JXMgOyVzXG4iLHJlZ25hbWVzW3pyZWddLGR0KHExdHlwKHApKSk7DQorCQkJCX0NCisJCQkJZWxzZSBpZighKHAtPnR5cGYyICYgVU5TSUdORUQpKSAvLyBmcm9tIHNpZ25lZA0KKwkJCQl7DQorCQkJCQkvLwkJCQkJZW1pdChmLCJcdG1vdnNcdCVzXHQlc1xuIiwgcmVnbmFtZXNbenJlZ10sIHJlZ25hbWVzW3AtPnExLnJlZ10pOw0KKy8vCQkJCQllbWl0KGYsIlx0c3R1XHQlcyA7JXNcbiIscmVnbmFtZXNbenJlZ10sZHQocTF0eXAocCkpKTsNCisJCQkJfQ0KKwkJCQllbHNlIGlmKHAtPnR5cGYyICYgVU5TSUdORUQpIC8vIGZyb20gdW5zaWduZWQNCisJCQkJew0KKwkJCQkJLy8JCQkJCWVtaXQoZiwiXHRtb3ZcdCVzXHQlc1xuIiwgcmVnbmFtZXNbenJlZ10sIHJlZ25hbWVzW3AtPnExLnJlZ10pOw0KKwkJCQl9DQorCQkJfQ0KKwkJCXNhdmVfcmVzdWx0KGYscCk7DQorCQkJY29udGludWU7DQorCQl9DQorCQlpZihjPT1LT01QTEVNRU5UKQ0KKwkJew0KKwkJCWxvYWRfcmVnKGYsenJlZywmcC0+cTEsdCk7DQorCQkJZW1pdChmLCJcdGNwbC4lc1x0JXNcbiIsZHQodCkscmVnbmFtZXNbenJlZ10pOw0KKwkJCXNhdmVfcmVzdWx0KGYscCk7DQorCQkJY29udGludWU7DQorCQl9DQorCQlpZihjPT1TRVRSRVRVUk4pDQorCQl7DQorCQkJbG9hZF9yZWcoZixwLT56LnJlZywmcC0+cTEsdCk7DQorCQkJQlNFVChyZWdzX21vZGlmaWVkLHAtPnoucmVnKTsNCisJCQljb250aW51ZTsNCisJCX0NCisJCWlmKGM9PUdFVFJFVFVSTikNCisJCXsNCisJCQlpZihwLT5xMS5yZWcpDQorCQkJew0KKwkJCQl6cmVnPXAtPnExLnJlZzsNCisJCQkJc2F2ZV9yZXN1bHQoZixwKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCQlwLT56LmZsYWdzPTA7DQorCQkJY29udGludWU7DQorCQl9DQorCQlpZihjPT1DQUxMKQ0KKwkJew0KKwkJCWludCByZWc7DQorCQkJLypGSVhNRSovDQorI2lmIDAgICAgICANCisJCQlpZihzdGFja192YWxpZCYmKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJnAtPnExLnYtPmZpJiYocC0+cTEudi0+ZmktPmZsYWdzJkFMTF9TVEFDSykpDQorCQkJew0KKwkJCQlpZihmcmFtZXNpemUrenVtMnVsKHAtPnExLnYtPmZpLT5zdGFjazEpPnN0YWNrKQ0KKwkJCQkJc3RhY2s9ZnJhbWVzaXplK3p1bTJ1bChwLT5xMS52LT5maS0+c3RhY2sxKTsNCisJCQl9ZWxzZQ0KKwkJCQlzdGFja192YWxpZD0wOw0KKyNlbmRpZg0KKwkJCWlmKChwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiZwLT5xMS52LT5maSYmcC0+cTEudi0+ZmktPmlubGluZV9hc20pDQorCQkJew0KKwkJCQllbWl0X2lubGluZV9hc20oZixwLT5xMS52LT5maS0+aW5saW5lX2FzbSk7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCWVtaXQoZiwgIlx0bW92XHRiMjlcdCIpOw0KKwkJCQllbWl0X29iaihmLCZwLT5xMSx0KTsNCisJCQkJZW1pdChmLCJcbiIpOw0KKwkJCQllbWl0KGYsIlx0Y2FsbFx0YjI5XG4iKTsNCisJCQl9DQorCQkJLypGSVhNRSovDQorI2lmIEZJWEVEX1NQDQorCQkJcHVzaGVkLT16bTJsKHAtPnEyLnZhbC52bWF4KTsNCisjZW5kaWYNCisJCQlpZigocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmcC0+cTEudi0+ZmkmJihwLT5xMS52LT5maS0+ZmxhZ3MmQUxMX1JFR1MpKQ0KKwkJCXsNCisJCQkJYnZ1bml0ZShyZWdzX21vZGlmaWVkLHAtPnExLnYtPmZpLT5yZWdzX21vZGlmaWVkLFJTSVpFKTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJaW50IGk7DQorCQkJCWZvcihpPTE7aTw9TUFYUjtpKyspDQorCQkJCXsNCisJCQkJCWlmKHJlZ3NjcmF0Y2hbaV0pIEJTRVQocmVnc19tb2RpZmllZCxpKTsNCisJCQkJfQ0KKwkJCX0NCisJCQljb250aW51ZTsNCisJCX0NCisJCWlmKGM9PUFTU0lHTnx8Yz09UFVTSCkNCisJCXsNCisJCQlpZih0PT0wKQ0KKwkJCQlpZXJyb3IoMCk7DQorCQkJaWYoYz09UFVTSCkNCisJCQl7DQorCQkJCWVtaXQoZiwiXHRwdXNoXHQiLyosZHQodCkqLyk7DQorCQkJCWVtaXRfb2JqKGYsJnAtPnExLHQpOw0KKwkJCQllbWl0KGYsIlxuIik7DQorCQkJCXB1c2goem0ybChwLT5xMi52YWwudm1heCkpOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJaWYoYz09QVNTSUdOKQ0KKwkJCXsNCisJCQkJbG9hZF9yZWcoZix6cmVnLCZwLT5xMSx0KTsNCisJCQkJaWYocTJyZWcgIT0gMCkNCisJCQkJCWxvYWRfcmVnKGYscTJyZWcsJnAtPnEyLHQpOw0KKwkJCQlzYXZlX3Jlc3VsdChmLHApOw0KKwkJCX0NCisJCQljb250aW51ZTsNCisJCX0NCisJCWlmKGM9PUFERFJFU1MpDQorCQl7DQorCQkJbG9hZF9hZGRyZXNzKGYsenJlZywmcC0+cTEsUE9JTlRFUik7DQorCQkJc2F2ZV9yZXN1bHQoZixwKTsNCisJCQljb250aW51ZTsNCisJCX0NCisJCWlmKGM9PU1JTlVTKQ0KKwkJew0KKwkJCWxvYWRfcmVnKGYsenJlZywmcC0+cTEsdCk7DQorCQkJZW1pdChmLCJcdG5lZ1x0JXMgOyAlc1xuIixkdCh0KSxyZWduYW1lc1t6cmVnXSk7DQorCQkJc2F2ZV9yZXN1bHQoZixwKTsNCisJCQljb250aW51ZTsNCisJCX0NCisJCWlmKGMgPj0gQkVRICYmIGMgPCBCUkEpDQorCQl7DQorDQorCQkJY2hhciAqY2N1W109eyJjbXAiLCJuZXF1IiwiZ3QiLCIhZ3RlIiwiZ3RlIiwiIWd0In07DQorCQkJY2hhciAqY2NzW109eyJjbXBzIiwibmVxdXMiLCJndHMiLCIhZ3RlcyIsImd0ZXMiLCIhZ3RzIn07DQorCQkJY2hhciAqY2NmW109eyJjbXBmIiwibmVxdWYiLCJndGYiLCIhZ3RlZiIsImd0ZWYiLCIhZ3RmIn07DQorCQkJaWYocF90ZXN0ID09IDApDQorCQkJew0KKwkJCQlwcmludGYoIkNhbGxpbmcgJXMgd2l0aG91dCBhIHRlc3QhXG4iLGNjc1tjLUJFUV0pOw0KKwkJCQllbWl0KGYsIkNhbGxpbmcgJXMgd2l0aG91dCBhIHRlc3QhXG4iLGNjc1tjLUJFUV0pOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorDQorCQkJc3RydWN0IElDICpwX29sZCA9IHA7DQorCQkJcCA9IHBfdGVzdDsNCisJCQl0PXAtPnR5cGY7DQorDQorCQkJaWYodGVzdF9oYW5kbGVkID09IDApDQorCQkJew0KKwkJCQlpZihJU0ZMT0FUKHQpKQ0KKwkJCQl7DQorCQkJCQlpZihpc3JlZyhxMikpDQorCQkJCQl7DQorCQkJCQkJY2hhciBpbnN0cnVjdGlvblsxMF07DQorCQkJCQkJc3ByaW50ZihpbnN0cnVjdGlvbiwgIiVzIiwgY2NmW2MtQkVRXSk7DQorCQkJCQkJaWYoaW5zdHJ1Y3Rpb25bMF0gPT0gJyEnKQ0KKwkJCQkJCXsNCisJCQkJCQkJaW5zdHJ1Y3Rpb25bMF0gPSAnICc7DQorCQkJCQkJCWVtaXQoZiwiXG5cdCVzXHQlc1x0JXNcbiIsaW5zdHJ1Y3Rpb24scmVnbmFtZXNbdGVzdF9yZWddLHJlZ25hbWVzW3Rlc3RfcmVnMl0pOw0KKwkJCQkJCX0NCisJCQkJCQllbHNlDQorCQkJCQkJCWVtaXQoZiwiXG5cdCVzXHQlc1x0JXNcbiIsaW5zdHJ1Y3Rpb24scmVnbmFtZXNbdGVzdF9yZWcyXSxyZWduYW1lc1t0ZXN0X3JlZ10pOw0KKw0KKwkJCQkJCXNhdmVfcmVzdWx0KGYscCk7DQorCQkJCQl9DQorCQkJCQllbHNlDQorCQkJCQl7DQorCQkJCQkJaWYoKChwLT5xMi5mbGFncyZWQVIpJiYhKHAtPnEyLmZsYWdzJlJFRykpICYmIChwLT5xMi52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT5xMi52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikpDQorCQkJCQkJew0KKwkJCQkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHJlYWxfb2Zmc2V0KCZwLT5xMik7DQorCQkJCQkJCWlmKG9mZnNldCA9PSAwKQ0KKwkJCQkJCQl7DQorCQkJCQkJCQllbWl0KGYsIlx0bW92Zlx0YjI4XHRbejJdXG4iKTsNCisJCQkJCQkJfQ0KKwkJCQkJCQllbHNlDQorCQkJCQkJCXsNCisJCQkJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOFx0JWxkIDsgZ2V0IGZyb20gc3RhY2tcbiIsIG9mZnNldCk7DQorCQkJCQkJCQllbWl0KGYsIlx0bW92XHRiMjlcdHoyXG4iKTsNCisJCQkJCQkJCWVtaXQoZiwiXHRzdWJcdGIyOVx0YjI4XG4iKTsNCisJCQkJCQkJCWVtaXQoZiwiXHRtb3ZmXHRiMjhcdFtiMjldXG4iKTsNCisJCQkJCQkJfQ0KKwkJCQkJCX0NCisJCQkJCQllbHNlDQorCQkJCQkJew0KKwkJCQkJCQllbWl0KGYsIlx0bW92Zlx0YjI4XHQiKTsNCisJCQkJCQkJZW1pdF9vYmooZiwmcC0+cTIsdCk7DQorCQkJCQkJCWVtaXQoZiwiXG4iKTsNCisJCQkJCQl9DQorDQorCQkJCQkJY2hhciBpbnN0cnVjdGlvblsxMF07DQorCQkJCQkJc3ByaW50ZihpbnN0cnVjdGlvbiwgIiVzIiwgY2NmW2MtQkVRXSk7DQorCQkJCQkJaWYoaW5zdHJ1Y3Rpb25bMF0gPT0gJyEnKQ0KKwkJCQkJCXsNCisJCQkJCQkJaW5zdHJ1Y3Rpb25bMF0gPSAnICc7DQorCQkJCQkJCWVtaXQoZiwiXG5cdCVzXHQlc1x0YjI4XG4iLGluc3RydWN0aW9uLHJlZ25hbWVzW3Rlc3RfcmVnXSk7DQorCQkJCQkJfQ0KKwkJCQkJCWVsc2UNCisJCQkJCQkJZW1pdChmLCJcblx0JXNcdGIyOFx0JXNcbiIsaW5zdHJ1Y3Rpb24scmVnbmFtZXNbdGVzdF9yZWddKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQllbHNlIGlmKHQgJiBVTlNJR05FRCkNCisJCQkJew0KKwkJCQkJaWYoaXNyZWcocTIpKQ0KKwkJCQkJew0KKwkJCQkJCWNoYXIgaW5zdHJ1Y3Rpb25bMTBdOw0KKwkJCQkJCXNwcmludGYoaW5zdHJ1Y3Rpb24sICIlcyIsIGNjdVtjLUJFUV0pOw0KKwkJCQkJCWlmKGluc3RydWN0aW9uWzBdID09ICchJykNCisJCQkJCQl7DQorCQkJCQkJCWluc3RydWN0aW9uWzBdID0gJyAnOw0KKwkJCQkJCQllbWl0KGYsIlxuXHQlc1x0JXNcdCVzXG4iLGluc3RydWN0aW9uLHJlZ25hbWVzW3Rlc3RfcmVnMl0scmVnbmFtZXNbdGVzdF9yZWddKTsNCisJCQkJCQl9DQorCQkJCQkJZWxzZQ0KKwkJCQkJCQllbWl0KGYsIlxuXHQlc1x0JXNcdCVzXG4iLGluc3RydWN0aW9uLHJlZ25hbWVzW3Rlc3RfcmVnXSxyZWduYW1lc1t0ZXN0X3JlZzJdKTsNCisJCQkJCQlzYXZlX3Jlc3VsdChmLHApOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQkJZWxzZQ0KKwkJCQkJew0KKwkJCQkJCWlmKCgocC0+cTIuZmxhZ3MmVkFSKSYmIShwLT5xMi5mbGFncyZSRUcpKSAmJiAocC0+cTIudi0+c3RvcmFnZV9jbGFzcz09QVVUT3x8cC0+cTIudi0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpKQ0KKwkJCQkJCXsNCisJCQkJCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSByZWFsX29mZnNldCgmcC0+cTIpOw0KKwkJCQkJCQlpZihvZmZzZXQgPT0gMCkNCisJCQkJCQkJew0KKwkJCQkJCQkJZW1pdChmLCJcdG1vdlx0YjI4XHRbejJdXG4iKTsNCisJCQkJCQkJfQ0KKwkJCQkJCQllbHNlDQorCQkJCQkJCXsNCisJCQkJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOFx0JWxkIDsgZ2V0IGZyb20gc3RhY2tcbiIsIG9mZnNldCk7DQorCQkJCQkJCQllbWl0KGYsIlx0bW92XHRiMjlcdHoyXG4iKTsNCisJCQkJCQkJCWVtaXQoZiwiXHRzdWJcdGIyOVx0YjI4XG4iKTsNCisJCQkJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOFx0W2IyOV1cbiIpOw0KKwkJCQkJCQl9DQorCQkJCQkJfQ0KKwkJCQkJCWVsc2UNCisJCQkJCQl7DQorCQkJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOFx0Iik7DQorCQkJCQkJCWVtaXRfb2JqKGYsJnAtPnEyLHQpOw0KKwkJCQkJCQllbWl0KGYsIlxuIik7DQorCQkJCQkJfQ0KKw0KKwkJCQkJCWNoYXIgaW5zdHJ1Y3Rpb25bMTBdOw0KKwkJCQkJCXNwcmludGYoaW5zdHJ1Y3Rpb24sICIlcyIsIGNjdVtjLUJFUV0pOw0KKwkJCQkJCWlmKGluc3RydWN0aW9uWzBdID09ICchJykNCisJCQkJCQl7DQorCQkJCQkJCWluc3RydWN0aW9uWzBdID0gJyAnOw0KKwkJCQkJCQllbWl0KGYsIlxuXHQlc1x0JXNcdGIyOFxuIixpbnN0cnVjdGlvbixyZWduYW1lc1t0ZXN0X3JlZ10pOw0KKwkJCQkJCX0NCisJCQkJCQllbHNlDQorCQkJCQkJCWVtaXQoZiwiXG5cdCVzXHRiMjhcdCVzXG4iLGluc3RydWN0aW9uLHJlZ25hbWVzW3Rlc3RfcmVnXSk7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQlpZihpc3JlZyhxMikpDQorCQkJCQl7DQorCQkJCQkJY2hhciBpbnN0cnVjdGlvblsxMF07DQorCQkJCQkJc3ByaW50ZihpbnN0cnVjdGlvbiwgIiVzIiwgY2NzW2MtQkVRXSk7DQorCQkJCQkJaWYoaW5zdHJ1Y3Rpb25bMF0gPT0gJyEnKQ0KKwkJCQkJCXsNCisJCQkJCQkJaW5zdHJ1Y3Rpb25bMF0gPSAnICc7DQorCQkJCQkJCWVtaXQoZiwiXG5cdCVzXHQlc1x0JXNcbiIsaW5zdHJ1Y3Rpb24scmVnbmFtZXNbdGVzdF9yZWddLHJlZ25hbWVzW3Rlc3RfcmVnMl0pOw0KKwkJCQkJCX0NCisJCQkJCQllbHNlDQorCQkJCQkJCWVtaXQoZiwiXG5cdCVzXHQlc1x0JXNcbiIsaW5zdHJ1Y3Rpb24scmVnbmFtZXNbcC0+cTIucmVnXSxyZWduYW1lc1t0ZXN0X3JlZ10pOw0KKw0KKwkJCQkJCXNhdmVfcmVzdWx0KGYscCk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCQllbHNlDQorCQkJCQl7DQorCQkJCQkJaWYoKChwLT5xMi5mbGFncyZWQVIpJiYhKHAtPnEyLmZsYWdzJlJFRykpICYmIChwLT5xMi52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT5xMi52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikpDQorCQkJCQkJew0KKwkJCQkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHJlYWxfb2Zmc2V0KCZwLT5xMik7DQorCQkJCQkJCWlmKG9mZnNldCA9PSAwKQ0KKwkJCQkJCQl7DQorCQkJCQkJCQllbWl0KGYsIlx0bW92c1x0YjI4XHRbejJdXG4iKTsNCisJCQkJCQkJfQ0KKwkJCQkJCQllbHNlDQorCQkJCQkJCXsNCisJCQkJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOFx0JWxkIDsgZ2V0IGZyb20gc3RhY2tcbiIsIG9mZnNldCk7DQorCQkJCQkJCQllbWl0KGYsIlx0bW92XHRiMjlcdHoyXG4iKTsNCisJCQkJCQkJCWVtaXQoZiwiXHRzdWJcdGIyOVx0YjI4XG4iKTsNCisJCQkJCQkJCWVtaXQoZiwiXHRtb3ZzXHRiMjhcdFtiMjldXG4iKTsNCisJCQkJCQkJfQ0KKwkJCQkJCX0NCisJCQkJCQllbHNlDQorCQkJCQkJew0KKwkJCQkJCQllbWl0KGYsIlx0bW92c1x0YjI4XHQiKTsNCisJCQkJCQkJZW1pdF9vYmooZiwmcC0+cTIsdCk7DQorCQkJCQkJCWVtaXQoZiwiXG4iKTsNCisJCQkJCQl9DQorDQorCQkJCQkJY2hhciBpbnN0cnVjdGlvblsxMF07DQorCQkJCQkJc3ByaW50ZihpbnN0cnVjdGlvbiwgIiVzIiwgY2NzW2MtQkVRXSk7DQorCQkJCQkJaWYoaW5zdHJ1Y3Rpb25bMF0gPT0gJyEnKQ0KKwkJCQkJCXsNCisJCQkJCQkJaW5zdHJ1Y3Rpb25bMF0gPSAnICc7DQorCQkJCQkJCWVtaXQoZiwiXG5cdCVzXHQlc1x0YjI4XG4iLGluc3RydWN0aW9uLHJlZ25hbWVzW3Rlc3RfcmVnXSk7DQorCQkJCQkJfQ0KKwkJCQkJCWVsc2UNCisJCQkJCQkJZW1pdChmLCJcblx0JXNcdGIyOFx0JXNcbiIsaW5zdHJ1Y3Rpb24scmVnbmFtZXNbdGVzdF9yZWddKTsNCisJCQkJCX0NCisJCQkJfQ0KKw0KKwkJCQkvL2VtaXQoZiwiXHRqJXNcdCIsY2NzW2MtQkVRXSk7DQorCQkJCS8vaWYoaXNyZWcocTEpKQ0KKwkJCQkvL3sNCisJCQkJLy9lbWl0X29iaihmLCZwLT5xMSwwKTsNCisJCQkJLy9lbWl0KGYsIiwiKTsNCisJCQkJLy99DQorCQkJCS8vZW1pdChmLCIlcyVkIDtcbiIsbGFicHJlZml4LHQpOw0KKw0KKwkJCQkvLyBuZXh0DQorDQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCWlmKHBfb2xkLT5jb2RlID09IEJFUSkNCisJCQkJew0KKwkJCQkJZW1pdChmLCJcblx0cnpcdCVzXG4iLHJlZ25hbWVzW3Rlc3RfcmVnXSk7DQorCQkJCX0NCisJCQkJZWxzZSBpZihwX29sZC0+Y29kZSA9PSBCTkUpDQorCQkJCXsNCisJCQkJCWVtaXQoZiwiXG5cdHJuelx0JXNcbiIscmVnbmFtZXNbdGVzdF9yZWddKTsNCisJCQkJfQ0KKwkJCQllbHNlDQorCQkJCQllbWl0KGYsIm5vdCBzdXJlIHdoYXQgdG8gZG8gd2l0aCAlZFxuIiwgcF9vbGQtPmNvZGUpOw0KKwkJCX0NCisNCisJCQlwID0gcF9vbGQ7DQorCQkJdD1wLT50eXBmOw0KKw0KKwkJCXRlc3RfaGFuZGxlZCA9IDA7DQorDQorCQkJZW1pdChmLCJcdG1vdlx0YjI4XHQlcyVkXG4iLGxhYnByZWZpeCx0KTsNCisJCQllbWl0KGYsIlx0am56XHR6MFx0YjI4XG4iKTsNCisJCQljb250aW51ZTsNCisJCX0JDQorCQlpZihjPT1URVNUKQ0KKwkJew0KKwkJCS8vIHByaW50ZigiZm91bmQgdGVzdCIpOw0KKy8qCQkJZW1pdChmLCJcdHRzdFx0Iik7DQorCQkJaWYobXVsdGlwbGVfY2NzKQ0KKwkJCQllbWl0KGYsIiVzLCIscmVnbmFtZXNbenJlZ10pOw0KKwkJCWVtaXRfb2JqKGYsJnAtPnExLHQpOw0KKwkJCWVtaXQoZiwiIDsgJXNcbiIsZHQodCkpOw0KKwkJCWlmKG11bHRpcGxlX2NjcykNCisJCQkJc2F2ZV9yZXN1bHQoZixwKTsgKi8NCisNCisJCQl0ZXN0X3JlZyA9IHpyZWc7DQorCQkJdGVzdF9yZWcyID0gcTJyZWc7DQorDQorCQkJaWYoIWlzcmVnKHExKSkNCisJCQkJCWxvYWRfcmVnKGYsdGVzdF9yZWcsJnAtPnExLHQpOw0KKw0KKwkJCXBfdGVzdCA9IHA7DQorCQkJdGVzdF9oYW5kbGVkID0gMTsNCisNCisJCQljb250aW51ZTsNCisJCX0NCisJCWlmKGM9PUNPTVBBUkUpDQorCQl7DQorCQkJdGVzdF9yZWcgPSB6cmVnOw0KKwkJCXRlc3RfcmVnMiA9IHEycmVnOw0KKwkJCQ0KKwkJCWlmKCFpc3JlZyhxMSkpDQorCQkJCQlsb2FkX3JlZyhmLHpyZWcsJnAtPnExLHQpOw0KKw0KKwkJCXBfdGVzdCA9IHA7DQorCQkJdGVzdF9oYW5kbGVkID0gMDsNCisvLwkJCWVtaXQoZiwgIjsgY29tcGFyZSAlc1xuIiwgcmVnbmFtZXNbenJlZ10pOw0KKwkJCWNvbnRpbnVlOw0KKwkJfQ0KKwkJaWYoYz09T1IpDQorCQl7DQorCQkJZW1pdChmLCJcdG1vdlx0YjI4XHQiKTsNCisJCQllbWl0X29iaihmLCZwLT5xMix0KTsNCisNCisJCQllbWl0KGYsIlxuXHRvclx0JXMgYjI4XG4iLC8qZHQodCksKi9yZWduYW1lc1t6cmVnXSk7DQorCQkJc2F2ZV9yZXN1bHQoZixwKTsNCisJCQljb250aW51ZTsNCisJCX0NCisJCWlmKGM9PVhPUikNCisJCXsNCisJCQllbWl0KGYsIlx0bW92XHRiMjhcdCIpOw0KKwkJCWVtaXRfb2JqKGYsJnAtPnEyLHQpOw0KKw0KKwkJCWVtaXQoZiwiXG5cdHhvclx0JXMgYjI4XG4iLC8qZHQodCksKi9yZWduYW1lc1t6cmVnXSk7DQorCQkJc2F2ZV9yZXN1bHQoZixwKTsNCisJCQljb250aW51ZTsNCisJCX0NCisJCWlmKGM9PUFORCkNCisJCXsNCisJCQllbWl0KGYsIlx0bW92XHRiMjhcdCIpOw0KKwkJCWVtaXRfb2JqKGYsJnAtPnEyLHQpOw0KKw0KKwkJCWVtaXQoZiwiXG5cdGFuZFx0JXMgYjI4XG4iLC8qZHQodCksKi9yZWduYW1lc1t6cmVnXSk7DQorCQkJc2F2ZV9yZXN1bHQoZixwKTsNCisJCQljb250aW51ZTsNCisJCX0NCisNCisJCWlmKGM9PUxTSElGVCkNCisJCXsNCisJCQllbWl0KGYsIlx0bW92XHRiMjhcdCIpOw0KKwkJCWVtaXRfb2JqKGYsJnAtPnEyLHQpOw0KKw0KKwkJCWVtaXQoZiwiXG5cdHNhbFx0JXMgYjI4XG4iLC8qZHQodCksKi9yZWduYW1lc1t6cmVnXSk7DQorCQkJc2F2ZV9yZXN1bHQoZixwKTsNCisJCQljb250aW51ZTsNCisJCX0NCisNCisJCWlmKGM9PVJTSElGVCkNCisJCXsNCisJCQllbWl0KGYsIlx0bW92XHRiMjhcdCIpOw0KKwkJCWVtaXRfb2JqKGYsJnAtPnEyLHQpOw0KKw0KKwkJCWVtaXQoZiwiXG5cdHNhclx0JXMgYjI4XG4iLC8qZHQodCksKi9yZWduYW1lc1t6cmVnXSk7DQorCQkJc2F2ZV9yZXN1bHQoZixwKTsNCisJCQljb250aW51ZTsNCisJCX0NCisNCisJCWlmKGM9PUFERCkgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQURESVRJT04NCisJCXsNCisJCQlpZighaXNyZWcocTEpKQ0KKwkJCQlsb2FkX3JlZyhmLHpyZWcsJnAtPnExLHQpOw0KKw0KKwkJCWlmKHAtPnEyLmZsYWdzJktPTlNUKQ0KKwkJCXsNCisJCQkJaWYoSVNGTE9BVCh0KSkNCisJCQkJew0KKwkJCQkJY2hhciAqZHMgPSAoY2hhciAqKSZwLT5xMi52YWwudmZsb2F0Ow0KKwkJCQkJY2hhciB0bXAgPSBkc1swXTsNCisJCQkJCWRzWzBdID0gZHNbM107DQorCQkJCQlkc1szXSA9IHRtcDsNCisJCQkJCXRtcCA9IGRzWzFdOw0KKwkJCQkJZHNbMV0gPSBkc1syXTsNCisJCQkJCWRzWzJdID0gdG1wOw0KKw0KKwkJCQkJaWYoKCooZmxvYXQgKilkcykgPT0gMS4wZikNCisJCQkJCXsNCisJCQkJCQllbWl0KGYsIlx0aW5jZlx0JXNcbiIsIHJlZ25hbWVzW3pyZWddKTsNCisJCQkJCQlzYXZlX3Jlc3VsdChmLHApOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWVsc2UgaWYodCAmIFVOU0lHTkVEKQ0KKwkJCQl7DQorCQkJCQlpZigqKHVuc2lnbmVkIGludCAqKSZwLT5xMi52YWwgPT0gMSkNCisJCQkJCXsNCisJCQkJCQllbWl0KGYsIlx0aW5jXHQlc1xuIiwgcmVnbmFtZXNbenJlZ10pOw0KKwkJCQkJCXNhdmVfcmVzdWx0KGYscCk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQlpZigqKHVuc2lnbmVkIGludCAqKSZwLT5xMi52YWwgPT0gMSkNCisJCQkJCXsNCisJCQkJCQllbWl0KGYsIlx0aW5jc1x0JXNcbiIsIHJlZ25hbWVzW3pyZWddKTsNCisJCQkJCQlzYXZlX3Jlc3VsdChmLHApOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKw0KKwkJCWlmKElTRkxPQVQodCkpDQorCQkJew0KKwkJCQlpZihpc3JlZyhxMikpDQorCQkJCXsNCisJCQkJCWVtaXQoZiwiXG5cdGFkZGZcdCVzXHQlc1xuIiwvKmR0KHQpLCovcmVnbmFtZXNbenJlZ10scmVnbmFtZXNbcC0+cTIucmVnXSk7DQorCQkJCQlzYXZlX3Jlc3VsdChmLHApOw0KKwkJCQkJY29udGludWU7DQorCQkJCX0NCisNCisJCQkJaWYoKChwLT5xMi5mbGFncyZWQVIpJiYhKHAtPnEyLmZsYWdzJlJFRykpICYmIChwLT5xMi52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT5xMi52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikpDQorCQkJCXsNCisJCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcmVhbF9vZmZzZXQoJnAtPnEyKTsNCisJCQkJCWlmKG9mZnNldCA9PSAwKQ0KKwkJCQkJew0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZmXHRiMjhcdFt6Ml1cbiIpOw0KKwkJCQkJfQ0KKwkJCQkJZWxzZQ0KKwkJCQkJew0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOFx0JWxkIDsgZ2V0IGZyb20gc3RhY2tcbiIsIG9mZnNldCk7DQorCQkJCQkJZW1pdChmLCJcdG1vdlx0YjI5XHR6MlxuIik7DQorCQkJCQkJZW1pdChmLCJcdHN1Ylx0YjI5XHRiMjhcbiIpOw0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZmXHRiMjhcdFtiMjldXG4iKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCWVtaXQoZiwiXHRtb3ZmXHRiMjhcdCIpOw0KKwkJCQkJZW1pdF9vYmooZiwmcC0+cTIsdCk7DQorCQkJCQllbWl0KGYsIlxuIik7DQorCQkJCX0NCisNCisJCQkJZW1pdChmLCJcblx0YWRkZlx0JXMgYjI4XG4iLC8qZHQodCksKi9yZWduYW1lc1t6cmVnXSk7DQorCQkJCXNhdmVfcmVzdWx0KGYscCk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQllbHNlIGlmKHQgJiBVTlNJR05FRCkNCisJCQl7DQorCQkJCWlmKGlzcmVnKHEyKSkNCisJCQkJew0KKwkJCQkJZW1pdChmLCJcblx0YWRkXHQlc1x0JXNcbiIsLypkdCh0KSwqL3JlZ25hbWVzW3pyZWddLHJlZ25hbWVzW3AtPnEyLnJlZ10pOw0KKwkJCQkJc2F2ZV9yZXN1bHQoZixwKTsNCisJCQkJCWNvbnRpbnVlOw0KKwkJCQl9DQorDQorCQkJCWlmKCgocC0+cTIuZmxhZ3MmVkFSKSYmIShwLT5xMi5mbGFncyZSRUcpKSAmJiAocC0+cTIudi0+c3RvcmFnZV9jbGFzcz09QVVUT3x8cC0+cTIudi0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpKQ0KKwkJCQl7DQorCQkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHJlYWxfb2Zmc2V0KCZwLT5xMik7DQorCQkJCQlpZihvZmZzZXQgPT0gMCkNCisJCQkJCXsNCisJCQkJCQllbWl0KGYsIlx0bW92XHRiMjhcdFt6Ml1cbiIpOw0KKwkJCQkJfQ0KKwkJCQkJZWxzZQ0KKwkJCQkJew0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOFx0JWxkIDsgZ2V0IGZyb20gc3RhY2tcbiIsIG9mZnNldCk7DQorCQkJCQkJZW1pdChmLCJcdG1vdlx0YjI5XHR6MlxuIik7DQorCQkJCQkJZW1pdChmLCJcdHN1Ylx0YjI5XHRiMjhcbiIpOw0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOFx0W2IyOV1cbiIpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJZW1pdChmLCJcdG1vdlx0YjI4XHQiKTsNCisJCQkJCWVtaXRfb2JqKGYsJnAtPnEyLHQpOw0KKwkJCQkJZW1pdChmLCJcbiIpOw0KKwkJCQl9DQorDQorCQkJCWVtaXQoZiwiXG5cdGFkZFx0JXMgYjI4XG4iLC8qZHQodCksKi9yZWduYW1lc1t6cmVnXSk7DQorCQkJCXNhdmVfcmVzdWx0KGYscCk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKwkJCQlpZihpc3JlZyhxMikpDQorCQkJCXsNCisJCQkJCWVtaXQoZiwiXG5cdGFkZHNcdCVzXHQlc1xuIiwvKmR0KHQpLCovcmVnbmFtZXNbenJlZ10scmVnbmFtZXNbcC0+cTIucmVnXSk7DQorCQkJCQlzYXZlX3Jlc3VsdChmLHApOw0KKwkJCQkJY29udGludWU7DQorCQkJCX0NCisNCisJCQkJaWYoKChwLT5xMi5mbGFncyZWQVIpJiYhKHAtPnEyLmZsYWdzJlJFRykpICYmIChwLT5xMi52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT5xMi52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikpDQorCQkJCXsNCisJCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcmVhbF9vZmZzZXQoJnAtPnEyKTsNCisJCQkJCWlmKG9mZnNldCA9PSAwKQ0KKwkJCQkJew0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZzXHRiMjhcdFt6Ml1cbiIpOw0KKwkJCQkJfQ0KKwkJCQkJZWxzZQ0KKwkJCQkJew0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOFx0JWxkIDsgZ2V0IGZyb20gc3RhY2tcbiIsIG9mZnNldCk7DQorCQkJCQkJZW1pdChmLCJcdG1vdlx0YjI5XHR6MlxuIik7DQorCQkJCQkJZW1pdChmLCJcdHN1Ylx0YjI5XHRiMjhcbiIpOw0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZzXHRiMjhcdFtiMjldXG4iKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCWVtaXQoZiwiXHRtb3ZzXHRiMjhcdCIpOw0KKwkJCQkJZW1pdF9vYmooZiwmcC0+cTIsdCk7DQorCQkJCQllbWl0KGYsIlxuIik7DQorCQkJCX0NCisNCisJCQkJZW1pdChmLCJcblx0YWRkc1x0JXMgYjI4XG4iLC8qZHQodCksKi9yZWduYW1lc1t6cmVnXSk7DQorCQkJCXNhdmVfcmVzdWx0KGYscCk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisNCisJCWlmKGM9PVNVQikNCisJCXsNCisJCQlpZighaXNyZWcocTEpKQ0KKwkJCQlsb2FkX3JlZyhmLHpyZWcsJnAtPnExLHQpOw0KKw0KKwkJCWlmKHAtPnEyLmZsYWdzJktPTlNUKQ0KKwkJCXsNCisJCQkJaWYoSVNGTE9BVCh0KSkNCisJCQkJew0KKwkJCQkJY2hhciAqZHMgPSAoY2hhciAqKSZwLT5xMi52YWwudmZsb2F0Ow0KKwkJCQkJY2hhciB0bXAgPSBkc1swXTsNCisJCQkJCWRzWzBdID0gZHNbM107DQorCQkJCQlkc1szXSA9IHRtcDsNCisJCQkJCXRtcCA9IGRzWzFdOw0KKwkJCQkJZHNbMV0gPSBkc1syXTsNCisJCQkJCWRzWzJdID0gdG1wOw0KKw0KKwkJCQkJaWYoKCooZmxvYXQgKilkcykgPT0gMS4wZikNCisJCQkJCXsNCisJCQkJCQllbWl0KGYsIlx0ZGVjZlx0JXNcbiIsIHJlZ25hbWVzW3pyZWddKTsNCisJCQkJCQlzYXZlX3Jlc3VsdChmLHApOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWVsc2UgaWYodCAmIFVOU0lHTkVEKQ0KKwkJCQl7DQorCQkJCQlpZigqKHVuc2lnbmVkIGludCAqKSZwLT5xMi52YWwgPT0gMSkNCisJCQkJCXsNCisJCQkJCQllbWl0KGYsIlx0ZGVjXHQlc1xuIiwgcmVnbmFtZXNbenJlZ10pOw0KKwkJCQkJCXNhdmVfcmVzdWx0KGYscCk7DQorCQkJCQkJY29udGludWU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQlpZigqKHVuc2lnbmVkIGludCAqKSZwLT5xMi52YWwgPT0gMSkNCisJCQkJCXsNCisJCQkJCQllbWl0KGYsIlx0ZGVjc1x0JXNcbiIsIHJlZ25hbWVzW3pyZWddKTsNCisJCQkJCQlzYXZlX3Jlc3VsdChmLHApOw0KKwkJCQkJCWNvbnRpbnVlOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJCWlmKElTRkxPQVQodCkpDQorCQkJew0KKwkJCQlpZihpc3JlZyhxMikpDQorCQkJCXsNCisJCQkJCWVtaXQoZiwiXG5cdHN1YmZcdCVzXHQlc1xuIiwvKmR0KHQpLCovcmVnbmFtZXNbenJlZ10scmVnbmFtZXNbcC0+cTIucmVnXSk7DQorCQkJCQlzYXZlX3Jlc3VsdChmLHApOw0KKwkJCQkJY29udGludWU7DQorCQkJCX0NCisNCisJCQkJaWYoKChwLT5xMi5mbGFncyZWQVIpJiYhKHAtPnEyLmZsYWdzJlJFRykpICYmIChwLT5xMi52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT5xMi52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikpDQorCQkJCXsNCisJCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcmVhbF9vZmZzZXQoJnAtPnEyKTsNCisJCQkJCWlmKG9mZnNldCA9PSAwKQ0KKwkJCQkJew0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZmXHRiMjhcdFt6Ml1cbiIpOw0KKwkJCQkJfQ0KKwkJCQkJZWxzZQ0KKwkJCQkJew0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOFx0JWxkIDsgZ2V0IGZyb20gc3RhY2tcbiIsIG9mZnNldCk7DQorCQkJCQkJZW1pdChmLCJcdG1vdlx0YjI5XHR6MlxuIik7DQorCQkJCQkJZW1pdChmLCJcdHN1Ylx0YjI5XHRiMjhcbiIpOw0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZmXHRiMjhcdFtiMjldXG4iKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCWVtaXQoZiwiXHRtb3ZmXHRiMjhcdCIpOw0KKwkJCQkJZW1pdF9vYmooZiwmcC0+cTIsdCk7DQorCQkJCQllbWl0KGYsIlxuIik7DQorCQkJCX0NCisNCisJCQkJZW1pdChmLCJcblx0c3ViZlx0JXNcdGIyOFxuIiwvKmR0KHQpLCovcmVnbmFtZXNbenJlZ10pOw0KKwkJCQlzYXZlX3Jlc3VsdChmLHApOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJZWxzZSBpZih0ICYgVU5TSUdORUQpDQorCQkJew0KKwkJCQlpZihpc3JlZyhxMikpDQorCQkJCXsNCisJCQkJCWVtaXQoZiwiXG5cdHN1Ylx0JXNcdCVzXG4iLC8qZHQodCksKi9yZWduYW1lc1t6cmVnXSxyZWduYW1lc1twLT5xMi5yZWddKTsNCisJCQkJCXNhdmVfcmVzdWx0KGYscCk7DQorCQkJCQljb250aW51ZTsNCisJCQkJfQ0KKw0KKwkJCQlpZigoKHAtPnEyLmZsYWdzJlZBUikmJiEocC0+cTIuZmxhZ3MmUkVHKSkgJiYgKHAtPnEyLnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHAtPnEyLnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKSkNCisJCQkJew0KKwkJCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSByZWFsX29mZnNldCgmcC0+cTIpOw0KKwkJCQkJaWYob2Zmc2V0ID09IDApDQorCQkJCQl7DQorCQkJCQkJZW1pdChmLCJcdG1vdlx0YjI4XHRbejJdXG4iKTsNCisJCQkJCX0NCisJCQkJCWVsc2UNCisJCQkJCXsNCisJCQkJCQllbWl0KGYsIlx0bW92XHRiMjhcdCVsZCA7IGdldCBmcm9tIHN0YWNrXG4iLCBvZmZzZXQpOw0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOVx0ejJcbiIpOw0KKwkJCQkJCWVtaXQoZiwiXHRzdWJcdGIyOVx0YjI4XG4iKTsNCisJCQkJCQllbWl0KGYsIlx0bW92XHRiMjhcdFtiMjldXG4iKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOFx0Iik7DQorCQkJCQllbWl0X29iaihmLCZwLT5xMix0KTsNCisJCQkJCWVtaXQoZiwiXG4iKTsNCisJCQkJfQ0KKw0KKwkJCQllbWl0KGYsIlxuXHRzdWJcdCVzXHRiMjhcbiIsLypkdCh0KSwqL3JlZ25hbWVzW3pyZWddKTsNCisJCQkJc2F2ZV9yZXN1bHQoZixwKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCWlmKGlzcmVnKHEyKSkNCisJCQkJew0KKwkJCQkJZW1pdChmLCJcblx0c3Vic1x0JXNcdCVzXG4iLC8qZHQodCksKi9yZWduYW1lc1t6cmVnXSxyZWduYW1lc1twLT5xMi5yZWddKTsNCisJCQkJCXNhdmVfcmVzdWx0KGYscCk7DQorCQkJCQljb250aW51ZTsNCisJCQkJfQ0KKw0KKwkJCQlpZigoKHAtPnEyLmZsYWdzJlZBUikmJiEocC0+cTIuZmxhZ3MmUkVHKSkgJiYgKHAtPnEyLnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHAtPnEyLnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKSkNCisJCQkJew0KKwkJCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSByZWFsX29mZnNldCgmcC0+cTIpOw0KKwkJCQkJaWYob2Zmc2V0ID09IDApDQorCQkJCQl7DQorCQkJCQkJZW1pdChmLCJcdG1vdnNcdGIyOFx0W3oyXVxuIik7DQorCQkJCQl9DQorCQkJCQllbHNlDQorCQkJCQl7DQorCQkJCQkJZW1pdChmLCJcdG1vdlx0YjI4XHQlbGQgOyBnZXQgZnJvbSBzdGFja1xuIiwgb2Zmc2V0KTsNCisJCQkJCQllbWl0KGYsIlx0bW92XHRiMjlcdHoyXG4iKTsNCisJCQkJCQllbWl0KGYsIlx0c3ViXHRiMjlcdGIyOFxuIik7DQorCQkJCQkJZW1pdChmLCJcdG1vdnNcdGIyOFx0W2IyOV1cbiIpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJZW1pdChmLCJcdG1vdnNcdGIyOFx0Iik7DQorCQkJCQllbWl0X29iaihmLCZwLT5xMix0KTsNCisJCQkJCWVtaXQoZiwiXG4iKTsNCisJCQkJfQ0KKw0KKwkJCQllbWl0KGYsIlxuXHRzdWJzXHQlc1x0YjI4XG4iLC8qZHQodCksKi9yZWduYW1lc1t6cmVnXSk7DQorCQkJCXNhdmVfcmVzdWx0KGYscCk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisNCisJCWlmKGM9PU1VTFQpDQorCQl7DQorCQkJaWYoSVNGTE9BVCh0KSkNCisJCQl7DQorCQkJCWlmKGlzcmVnKHEyKSkNCisJCQkJew0KKwkJCQkJZW1pdChmLCJcblx0bXVsZlx0JXNcdCVzXG4iLC8qZHQodCksKi9yZWduYW1lc1t6cmVnXSxyZWduYW1lc1twLT5xMi5yZWddKTsNCisJCQkJCXNhdmVfcmVzdWx0KGYscCk7DQorCQkJCQljb250aW51ZTsNCisJCQkJfQ0KKw0KKwkJCQlpZigoKHAtPnEyLmZsYWdzJlZBUikmJiEocC0+cTIuZmxhZ3MmUkVHKSkgJiYgKHAtPnEyLnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHAtPnEyLnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKSkNCisJCQkJew0KKwkJCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSByZWFsX29mZnNldCgmcC0+cTIpOw0KKwkJCQkJaWYob2Zmc2V0ID09IDApDQorCQkJCQl7DQorCQkJCQkJZW1pdChmLCJcdG1vdmZcdGIyOFx0W3oyXVxuIik7DQorCQkJCQl9DQorCQkJCQllbHNlDQorCQkJCQl7DQorCQkJCQkJZW1pdChmLCJcdG1vdlx0YjI4XHQlbGQgOyBnZXQgZnJvbSBzdGFja1xuIiwgb2Zmc2V0KTsNCisJCQkJCQllbWl0KGYsIlx0bW92XHRiMjlcdHoyXG4iKTsNCisJCQkJCQllbWl0KGYsIlx0c3ViXHRiMjlcdGIyOFxuIik7DQorCQkJCQkJZW1pdChmLCJcdG1vdmZcdGIyOFx0W2IyOV1cbiIpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJZW1pdChmLCJcdG1vdmZcdGIyOFx0Iik7DQorCQkJCQllbWl0X29iaihmLCZwLT5xMix0KTsNCisJCQkJCWVtaXQoZiwiXG4iKTsNCisJCQkJfQ0KKw0KKwkJCQllbWl0KGYsIlxuXHRtdWxmXHQlc1x0YjI4XG4iLC8qZHQodCksKi9yZWduYW1lc1t6cmVnXSk7DQorCQkJCXNhdmVfcmVzdWx0KGYscCk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQllbHNlIGlmKHQgJiBVTlNJR05FRCkNCisJCQl7DQorCQkJCWlmKGlzcmVnKHEyKSkNCisJCQkJew0KKwkJCQkJZW1pdChmLCJcblx0bXVsXHQlc1x0JXNcbiIsLypkdCh0KSwqL3JlZ25hbWVzW3pyZWddLHJlZ25hbWVzW3AtPnEyLnJlZ10pOw0KKwkJCQkJc2F2ZV9yZXN1bHQoZixwKTsNCisJCQkJCWNvbnRpbnVlOw0KKwkJCQl9DQorDQorCQkJCWlmKCgocC0+cTIuZmxhZ3MmVkFSKSYmIShwLT5xMi5mbGFncyZSRUcpKSAmJiAocC0+cTIudi0+c3RvcmFnZV9jbGFzcz09QVVUT3x8cC0+cTIudi0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpKQ0KKwkJCQl7DQorCQkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHJlYWxfb2Zmc2V0KCZwLT5xMik7DQorCQkJCQlpZihvZmZzZXQgPT0gMCkNCisJCQkJCXsNCisJCQkJCQllbWl0KGYsIlx0bW92XHRiMjhcdFt6Ml1cbiIpOw0KKwkJCQkJfQ0KKwkJCQkJZWxzZQ0KKwkJCQkJew0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOFx0JWxkIDsgZ2V0IGZyb20gc3RhY2tcbiIsIG9mZnNldCk7DQorCQkJCQkJZW1pdChmLCJcdG1vdlx0YjI5XHR6MlxuIik7DQorCQkJCQkJZW1pdChmLCJcdHN1Ylx0YjI5XHRiMjhcbiIpOw0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOFx0W2IyOV1cbiIpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJZW1pdChmLCJcdG1vdlx0YjI4XHQiKTsNCisJCQkJCWVtaXRfb2JqKGYsJnAtPnEyLHQpOw0KKwkJCQkJZW1pdChmLCJcbiIpOw0KKwkJCQl9DQorDQorCQkJCWVtaXQoZiwiXG5cdG11bFx0JXNcdGIyOFxuIiwvKmR0KHQpLCovcmVnbmFtZXNbenJlZ10pOw0KKwkJCQlzYXZlX3Jlc3VsdChmLHApOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJZWxzZQ0KKwkJCXsNCisJCQkJaWYoaXNyZWcocTIpKQ0KKwkJCQl7DQorCQkJCQllbWl0KGYsIlxuXHRtdWxzXHQlc1x0JXNcbiIsLypkdCh0KSwqL3JlZ25hbWVzW3pyZWddLHJlZ25hbWVzW3AtPnEyLnJlZ10pOw0KKwkJCQkJc2F2ZV9yZXN1bHQoZixwKTsNCisJCQkJCWNvbnRpbnVlOw0KKwkJCQl9DQorDQorCQkJCWlmKCgocC0+cTIuZmxhZ3MmVkFSKSYmIShwLT5xMi5mbGFncyZSRUcpKSAmJiAocC0+cTIudi0+c3RvcmFnZV9jbGFzcz09QVVUT3x8cC0+cTIudi0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpKQ0KKwkJCQl7DQorCQkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHJlYWxfb2Zmc2V0KCZwLT5xMik7DQorCQkJCQlpZihvZmZzZXQgPT0gMCkNCisJCQkJCXsNCisJCQkJCQllbWl0KGYsIlx0bW92c1x0YjI4XHRbejJdXG4iKTsNCisJCQkJCX0NCisJCQkJCWVsc2UNCisJCQkJCXsNCisJCQkJCQllbWl0KGYsIlx0bW92XHRiMjhcdCVsZCA7IGdldCBmcm9tIHN0YWNrXG4iLCBvZmZzZXQpOw0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOVx0ejJcbiIpOw0KKwkJCQkJCWVtaXQoZiwiXHRzdWJcdGIyOVx0YjI4XG4iKTsNCisJCQkJCQllbWl0KGYsIlx0bW92c1x0YjI4XHRbYjI5XVxuIik7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQllbWl0KGYsIlx0bW92c1x0YjI4XHQiKTsNCisJCQkJCWVtaXRfb2JqKGYsJnAtPnEyLHQpOw0KKwkJCQkJZW1pdChmLCJcbiIpOw0KKwkJCQl9DQorDQorCQkJCWVtaXQoZiwiXG5cdG11bHNcdCVzXHRiMjhcbiIsLypkdCh0KSwqL3JlZ25hbWVzW3pyZWddKTsNCisJCQkJc2F2ZV9yZXN1bHQoZixwKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKw0KKwkJCWNvbnRpbnVlOw0KKwkJfQ0KKw0KKwkJaWYoYz09RElWKQ0KKwkJew0KKwkJCWlmKElTRkxPQVQodCkpDQorCQkJew0KKwkJCQlpZihpc3JlZyhxMikpDQorCQkJCXsNCisJCQkJCWVtaXQoZiwiXG5cdGRpdmZcdCVzXHQlc1xuIiwvKmR0KHQpLCovcmVnbmFtZXNbenJlZ10scmVnbmFtZXNbcC0+cTIucmVnXSk7DQorCQkJCQlzYXZlX3Jlc3VsdChmLHApOw0KKwkJCQkJY29udGludWU7DQorCQkJCX0NCisNCisJCQkJaWYoKChwLT5xMi5mbGFncyZWQVIpJiYhKHAtPnEyLmZsYWdzJlJFRykpICYmIChwLT5xMi52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT5xMi52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikpDQorCQkJCXsNCisJCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcmVhbF9vZmZzZXQoJnAtPnEyKTsNCisJCQkJCWlmKG9mZnNldCA9PSAwKQ0KKwkJCQkJew0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZmXHRiMjhcdFt6Ml1cbiIpOw0KKwkJCQkJfQ0KKwkJCQkJZWxzZQ0KKwkJCQkJew0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOFx0JWxkIDsgZ2V0IGZyb20gc3RhY2tcbiIsIG9mZnNldCk7DQorCQkJCQkJZW1pdChmLCJcdG1vdlx0YjI5XHR6MlxuIik7DQorCQkJCQkJZW1pdChmLCJcdHN1Ylx0YjI5XHRiMjhcbiIpOw0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZmXHRiMjhcdFtiMjldXG4iKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCWVtaXQoZiwiXHRtb3ZmXHRiMjhcdCIpOw0KKwkJCQkJZW1pdF9vYmooZiwmcC0+cTIsdCk7DQorCQkJCQllbWl0KGYsIlxuIik7DQorCQkJCX0NCisNCisJCQkJZW1pdChmLCJcblx0ZGl2Zlx0JXNcdGIyOFxuIiwvKmR0KHQpLCovcmVnbmFtZXNbenJlZ10pOw0KKwkJCQlzYXZlX3Jlc3VsdChmLHApOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJZWxzZSBpZih0ICYgVU5TSUdORUQpDQorCQkJew0KKwkJCQlpZihpc3JlZyhxMikpDQorCQkJCXsNCisJCQkJCWVtaXQoZiwiXG5cdGRpdlx0JXNcdCVzXG4iLC8qZHQodCksKi9yZWduYW1lc1t6cmVnXSxyZWduYW1lc1twLT5xMi5yZWddKTsNCisJCQkJCXNhdmVfcmVzdWx0KGYscCk7DQorCQkJCQljb250aW51ZTsNCisJCQkJfQ0KKw0KKwkJCQlpZigoKHAtPnEyLmZsYWdzJlZBUikmJiEocC0+cTIuZmxhZ3MmUkVHKSkgJiYgKHAtPnEyLnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHAtPnEyLnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKSkNCisJCQkJew0KKwkJCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSByZWFsX29mZnNldCgmcC0+cTIpOw0KKwkJCQkJaWYob2Zmc2V0ID09IDApDQorCQkJCQl7DQorCQkJCQkJZW1pdChmLCJcdG1vdlx0YjI4XHRbejJdXG4iKTsNCisJCQkJCX0NCisJCQkJCWVsc2UNCisJCQkJCXsNCisJCQkJCQllbWl0KGYsIlx0bW92XHRiMjhcdCVsZCA7IGdldCBmcm9tIHN0YWNrXG4iLCBvZmZzZXQpOw0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOVx0ejJcbiIpOw0KKwkJCQkJCWVtaXQoZiwiXHRzdWJcdGIyOVx0YjI4XG4iKTsNCisJCQkJCQllbWl0KGYsIlx0bW92XHRiMjhcdFtiMjldXG4iKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOFx0Iik7DQorCQkJCQllbWl0X29iaihmLCZwLT5xMix0KTsNCisJCQkJCWVtaXQoZiwiXG4iKTsNCisJCQkJfQ0KKw0KKwkJCQllbWl0KGYsIlxuXHRkaXZcdCVzXHRiMjhcbiIsLypkdCh0KSwqL3JlZ25hbWVzW3pyZWddKTsNCisJCQkJc2F2ZV9yZXN1bHQoZixwKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCWlmKGlzcmVnKHEyKSkNCisJCQkJew0KKwkJCQkJZW1pdChmLCJcblx0ZGl2c1x0JXNcdCVzXG4iLC8qZHQodCksKi9yZWduYW1lc1t6cmVnXSxyZWduYW1lc1twLT5xMi5yZWddKTsNCisJCQkJCXNhdmVfcmVzdWx0KGYscCk7DQorCQkJCQljb250aW51ZTsNCisJCQkJfQ0KKw0KKwkJCQlpZigoKHAtPnEyLmZsYWdzJlZBUikmJiEocC0+cTIuZmxhZ3MmUkVHKSkgJiYgKHAtPnEyLnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHAtPnEyLnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKSkNCisJCQkJew0KKwkJCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSByZWFsX29mZnNldCgmcC0+cTIpOw0KKwkJCQkJaWYob2Zmc2V0ID09IDApDQorCQkJCQl7DQorCQkJCQkJZW1pdChmLCJcdG1vdnNcdGIyOFx0W3oyXVxuIik7DQorCQkJCQl9DQorCQkJCQllbHNlDQorCQkJCQl7DQorCQkJCQkJZW1pdChmLCJcdG1vdlx0YjI4XHQlbGQgOyBnZXQgZnJvbSBzdGFja1xuIiwgb2Zmc2V0KTsNCisJCQkJCQllbWl0KGYsIlx0bW92XHRiMjlcdHoyXG4iKTsNCisJCQkJCQllbWl0KGYsIlx0c3ViXHRiMjlcdGIyOFxuIik7DQorCQkJCQkJZW1pdChmLCJcdG1vdnNcdGIyOFx0W2IyOV1cbiIpOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJCWVsc2UNCisJCQkJew0KKwkJCQkJZW1pdChmLCJcdG1vdnNcdGIyOFx0Iik7DQorCQkJCQllbWl0X29iaihmLCZwLT5xMix0KTsNCisJCQkJCWVtaXQoZiwiXG4iKTsNCisJCQkJfQ0KKw0KKwkJCQllbWl0KGYsIlxuXHRkaXZzXHQlc1x0YjI4XG4iLC8qZHQodCksKi9yZWduYW1lc1t6cmVnXSk7DQorCQkJCXNhdmVfcmVzdWx0KGYscCk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCX0NCisNCisJCWlmKGM9PU1PRCkNCisJCXsNCisJCQlpZihJU0ZMT0FUKHQpKQ0KKwkJCXsNCisJCQkJaWYoaXNyZWcocTIpKQ0KKwkJCQl7DQorCQkJCQllbWl0KGYsIlxuXHRtb2RmXHQlc1x0JXNcbiIsLypkdCh0KSwqL3JlZ25hbWVzW3pyZWddLHJlZ25hbWVzW3AtPnEyLnJlZ10pOw0KKwkJCQkJc2F2ZV9yZXN1bHQoZixwKTsNCisJCQkJCWNvbnRpbnVlOw0KKwkJCQl9DQorDQorCQkJCWlmKCgocC0+cTIuZmxhZ3MmVkFSKSYmIShwLT5xMi5mbGFncyZSRUcpKSAmJiAocC0+cTIudi0+c3RvcmFnZV9jbGFzcz09QVVUT3x8cC0+cTIudi0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpKQ0KKwkJCQl7DQorCQkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHJlYWxfb2Zmc2V0KCZwLT5xMik7DQorCQkJCQlpZihvZmZzZXQgPT0gMCkNCisJCQkJCXsNCisJCQkJCQllbWl0KGYsIlx0bW92Zlx0YjI4XHRbejJdXG4iKTsNCisJCQkJCX0NCisJCQkJCWVsc2UNCisJCQkJCXsNCisJCQkJCQllbWl0KGYsIlx0bW92XHRiMjhcdCVsZCA7IGdldCBmcm9tIHN0YWNrXG4iLCBvZmZzZXQpOw0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOVx0ejJcbiIpOw0KKwkJCQkJCWVtaXQoZiwiXHRzdWJcdGIyOVx0YjI4XG4iKTsNCisJCQkJCQllbWl0KGYsIlx0bW92Zlx0YjI4XHRbYjI5XVxuIik7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQllbWl0KGYsIlx0bW92Zlx0YjI4XHQiKTsNCisJCQkJCWVtaXRfb2JqKGYsJnAtPnEyLHQpOw0KKwkJCQkJZW1pdChmLCJcbiIpOw0KKwkJCQl9DQorDQorCQkJCWVtaXQoZiwiXG5cdG1vZGZcdCVzXHRiMjhcbiIsLypkdCh0KSwqL3JlZ25hbWVzW3pyZWddKTsNCisJCQkJc2F2ZV9yZXN1bHQoZixwKTsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWVsc2UgaWYodCAmIFVOU0lHTkVEKQ0KKwkJCXsNCisJCQkJaWYoaXNyZWcocTIpKQ0KKwkJCQl7DQorCQkJCQllbWl0KGYsIlxuXHRtb2RcdCVzXHQlc1xuIiwvKmR0KHQpLCovcmVnbmFtZXNbenJlZ10scmVnbmFtZXNbcC0+cTIucmVnXSk7DQorCQkJCQlzYXZlX3Jlc3VsdChmLHApOw0KKwkJCQkJY29udGludWU7DQorCQkJCX0NCisNCisJCQkJaWYoKChwLT5xMi5mbGFncyZWQVIpJiYhKHAtPnEyLmZsYWdzJlJFRykpICYmIChwLT5xMi52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT5xMi52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikpDQorCQkJCXsNCisJCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcmVhbF9vZmZzZXQoJnAtPnEyKTsNCisJCQkJCWlmKG9mZnNldCA9PSAwKQ0KKwkJCQkJew0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOFx0W3oyXVxuIik7DQorCQkJCQl9DQorCQkJCQllbHNlDQorCQkJCQl7DQorCQkJCQkJZW1pdChmLCJcdG1vdlx0YjI4XHQlbGQgOyBnZXQgZnJvbSBzdGFja1xuIiwgb2Zmc2V0KTsNCisJCQkJCQllbWl0KGYsIlx0bW92XHRiMjlcdHoyXG4iKTsNCisJCQkJCQllbWl0KGYsIlx0c3ViXHRiMjlcdGIyOFxuIik7DQorCQkJCQkJZW1pdChmLCJcdG1vdlx0YjI4XHRbYjI5XVxuIik7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQllbWl0KGYsIlx0bW92XHRiMjhcdCIpOw0KKwkJCQkJZW1pdF9vYmooZiwmcC0+cTIsdCk7DQorCQkJCQllbWl0KGYsIlxuIik7DQorCQkJCX0NCisNCisJCQkJZW1pdChmLCJcblx0bW9kXHQlc1x0YjI4XG4iLC8qZHQodCksKi9yZWduYW1lc1t6cmVnXSk7DQorCQkJCXNhdmVfcmVzdWx0KGYscCk7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKwkJCQlpZihpc3JlZyhxMikpDQorCQkJCXsNCisJCQkJCWVtaXQoZiwiXG5cdG1vZHNcdCVzXHQlc1xuIiwvKmR0KHQpLCovcmVnbmFtZXNbenJlZ10scmVnbmFtZXNbcC0+cTIucmVnXSk7DQorCQkJCQlzYXZlX3Jlc3VsdChmLHApOw0KKwkJCQkJY29udGludWU7DQorCQkJCX0NCisNCisJCQkJaWYoKChwLT5xMi5mbGFncyZWQVIpJiYhKHAtPnEyLmZsYWdzJlJFRykpICYmIChwLT5xMi52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT5xMi52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikpDQorCQkJCXsNCisJCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcmVhbF9vZmZzZXQoJnAtPnEyKTsNCisJCQkJCWlmKG9mZnNldCA9PSAwKQ0KKwkJCQkJew0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZzXHRiMjhcdFt6Ml1cbiIpOw0KKwkJCQkJfQ0KKwkJCQkJZWxzZQ0KKwkJCQkJew0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZcdGIyOFx0JWxkIDsgZ2V0IGZyb20gc3RhY2tcbiIsIG9mZnNldCk7DQorCQkJCQkJZW1pdChmLCJcdG1vdlx0YjI5XHR6MlxuIik7DQorCQkJCQkJZW1pdChmLCJcdHN1Ylx0YjI5XHRiMjhcbiIpOw0KKwkJCQkJCWVtaXQoZiwiXHRtb3ZzXHRiMjhcdFtiMjldXG4iKTsNCisJCQkJCX0NCisJCQkJfQ0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCWVtaXQoZiwiXHRtb3ZzXHRiMjhcdCIpOw0KKwkJCQkJZW1pdF9vYmooZiwmcC0+cTIsdCk7DQorCQkJCQllbWl0KGYsIlxuIik7DQorCQkJCX0NCisNCisJCQkJZW1pdChmLCJcblx0bW9kc1x0JXNcdGIyOFxuIiwvKmR0KHQpLCovcmVnbmFtZXNbenJlZ10pOw0KKwkJCQlzYXZlX3Jlc3VsdChmLHApOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQl9DQorDQorCQlwcmljMihzdGRvdXQscCk7DQorCQlpZXJyb3IoMCk7DQorCX0NCisJZnVuY3Rpb25fYm90dG9tKGYsdixsb2NhbHNpemUpOw0KKwlpZihzdGFja192YWxpZCkNCisJew0KKwkJaWYoIXYtPmZpKQ0KKwkJCXYtPmZpPW5ld19maSgpOw0KKwkJdi0+ZmktPmZsYWdzfD1BTExfU1RBQ0s7DQorCQl2LT5maS0+c3RhY2sxPXN0YWNrOw0KKwl9DQorCWVtaXQoZiwiIDsgc3RhY2tzaXplPSVsdSVzXG4iLHp1bTJ1bChzdGFjayksc3RhY2tfdmFsaWQ/IiI6Iis/PyIpOw0KK30NCisNCitpbnQgc2hvcnRjdXQoaW50IGNvZGUsaW50IHR5cCkNCit7DQorCXJldHVybiAxOw0KK30NCisNCitpbnQgcmVnX3Bhcm0oc3RydWN0IHJlZ19oYW5kbGUgKm0sIHN0cnVjdCBUeXAgKnQsaW50IHZhcmFyZyxzdHJ1Y3QgVHlwICpkKQ0KK3sNCisJaW50IGY7DQorCWY9dC0+ZmxhZ3MmTlE7DQorCWlmKGY9PUNIQVIpDQorCXsNCisJCWlmKG0tPnJlZ3M4Pj1OVU1fOEJJVCkNCisJCQlyZXR1cm4gMDsNCisJCWVsc2UNCisJCQlyZXR1cm4gRklSU1RfOEJJVCttLT5yZWdzOCsrOw0KKwl9DQorCWlmKGY9PVNIT1JUKQ0KKwl7DQorCQlpZihtLT5yZWdzMTY+PU5VTV8xNkJJVCkNCisJCQlyZXR1cm4gMDsNCisJCWVsc2UNCisJCQlyZXR1cm4gRklSU1RfMTZCSVQrbS0+cmVnczE2Kys7DQorCX0NCisJaWYoZj09SU5UIHx8IGY9PUxPTkcgfHwgZj09UE9JTlRFUiB8fCBmPT1GTE9BVCkNCisJew0KKwkJaWYobS0+cmVnczMyPj1OVU1fMzJCSVQpDQorCQkJcmV0dXJuIDA7DQorCQllbHNlDQorCQkJcmV0dXJuIEZJUlNUXzMyQklUK20tPnJlZ3MzMisrOw0KKwl9DQorCWlmKGY9PURPVUJMRSB8fCBmPT1MRE9VQkxFIHx8IGY9PUxMT05HKXsNCisJCWlmKG0tPnJlZ3M2ND49TlVNXzY0QklUKQ0KKwkJCXJldHVybiAwOw0KKwkJZWxzZQ0KKwkJCXJldHVybiBGSVJTVF82NEJJVCttLT5yZWdzNjQrKzsNCisJfQ0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50IGhhbmRsZV9wcmFnbWEoY29uc3QgY2hhciAqcykNCit7DQorCXJldHVybiAwOw0KK30NCisNCit2b2lkIGNsZWFudXBfY2coRklMRSAqZikNCit7DQorCWlmKCFmKQ0KKwkJcmV0dXJuOw0KKw0KK30NCisNCit2b2lkIGNsZWFudXBfZGIoRklMRSAqZikNCit7DQorCWlmKGYpDQorCQlzZWN0aW9uPS0xOw0KK30NCisNCisvKg0KK0MgcmVnaXN0ZXJzOg0KK2IyOCAtIHRlbXAgLSBzdG9yZSB2YXIgZHVyaW5nIGNhbGN1bGF0aW9uL2NvbXBhcmlzb24NCitiMjkgLSB0ZW1wIC0gc3RvcmUgYWRkcmVzcyBkdXJpbmcganVtcA0KK2IzMCAtIHRlbXAgc3RvcmUgYWRkcmVzcyBvZiBwYXJhbWV0ZXJzDQorYjMxIC0gdGVtcCBzdG9yZSBhZGRyZXNzZXMgdG8ganVtcCB0bw0KKw0KK2EwIC0gMTYgYml0CQkJCQk0DQorYTEgLSAxNiBiaXQJCQkJCTUNCithMiAtIDE2IGJpdAkJCQkJNg0KK2EzIC0gMTYgYml0CQkJCQk3DQorYTQgLSAxNiBiaXQJCQkJCTgNCithNSAtIDE2IGJpdAkJCQkJOQ0KK2E2IC0gMTYgYml0CQkJCQkxMA0KK2E3IC0gMTYgYml0CQkJCQkxMQ0KK2E4IC0gMTYgYml0CQkJCQkxMg0KK2E5IC0gMTYgYml0CQkJCQkxMw0KK2I1IC0gMzIgYml0CQkJCQkxNA0KK2I2IC0gMzIgYml0CQkJCQkxNQ0KK2I3IC0gMzIgYml0CQkJCQkxNg0KK2I4IC0gMzIgYml0CQkJCQkxNw0KK2I5IC0gMzIgYml0CQkJCQkxOA0KK2IxMCAtIDMyIGJpdAkJCQkJMTkNCitiMTEgLSAzMiBiaXQJCQkJCTIwDQorYjEyIC0gMzIgYml0CQkJCQkyMQ0KK2IxMyAtIDMyIGJpdAkJCQkJMjINCitiMTQgLSAzMiBiaXQJCQkJCTIzDQorYjE1IC0gMzIgYml0CQkJCQkyNA0KK2IxNiAtIDMyIGJpdAkJCQkJMjUNCitiMTcgLSAzMiBiaXQJCQkJCTI2DQorYzkgIC0gNjQgYml0CQkJCQkyNw0KK2MxMCAtIDY0IGJpdAkJCQkJMjgNCitjMTEgLSA2NCBiaXQJCQkJCTI5DQorYzEyIC0gNjQgYml0CQkJCQkzMA0KK2MxMyAtIDY0IGJpdAkJCQkJMzENCisNCitoMCAtIDhiaXQJCQkJCTMyDQoraDEgLSA4Yml0CQkJCQkzMw0KK2gyIC0gOGJpdAkJCQkJMzQNCitoMyAtIDhiaXQJCQkJCTM1DQorKi8NCmRpZmYgLS1naXQgYS9tYWNoaW5lcy9tZXNzaWFodHJvbi9tYWNoaW5lLmR0IGIvbWFjaGluZXMvbWVzc2lhaHRyb24vbWFjaGluZS5kdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MjZjOGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvbWVzc2lhaHRyb24vbWFjaGluZS5kdApAQCAtMCwwICsxLDE2IEBACitTOEJTCitTOEJVCitTMTZCU0JFIFMxNkJTTEUKK1MxNkJVQkUgUzE2QlVMRQorUzMyQlNCRSBTMzJCU0xFCitTMzJCVUJFIFMzMkJVTEUKK1MzMkJTQkUgUzMyQlNMRQorUzMyQlVCRSBTMzJCVUxFCitTNjRCU0JFIFM2NEJTTEUKK1M2NEJVQkUgUzY0QlVMRQorUzMyQklFRUVCRQorUzY0QklFRUVCRQorUzY0QklFRUVCRQorUzMyQlVCRSBTMzJCVUxFCisKKwpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvbWVzc2lhaHRyb24vbWFjaGluZS5oIGIvbWFjaGluZXMvbWVzc2lhaHRyb24vbWFjaGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFjYWI5YWUKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9tZXNzaWFodHJvbi9tYWNoaW5lLmgKQEAgLTAsMCArMSwxODQgQEAKKy8qICBFeGFtcGxlIGJhY2tlbmQgZm9yIHZiY2MsIGl0IG1vZGVscyBhIGdlbmVyaWMgMzJiaXQgUklTQyBvciBDSVNDCisgICAgQ1BVLgorCisgICAgQ29uZmlndXJhYmxlIGF0IGJ1aWxkLXRpbWUgYXJlOgorICAgIC0gbnVtYmVyIG9mICgzMmJpdCkgZ2VuZXJhbC1wdXJwb3NlLXJlZ2lzdGVycworICAgIC0gbnVtYmVyIG9mICg2NGJpdCkgZmxvYXRpbmctcG9pbnQtcmVnaXN0ZXJzCisgICAgLSBudW1iZXIgb2YgKDhiaXQpIGNvbmRpdGlvbi1jb2RlLXJlZ2lzdGVycworICAgIC0gbWVjaGFuaXNtIGZvciBzdGFjay1hcmd1bWVudHMgKG1vdmluZyBvdCBmaXhlZCBzcCkKKworICAgIEl0IGFsbG93cyB0byBzZWxlY3QgYXMgcnVuLXRpbWUtb3B0aW9uczoKKyAgICAtIHR3by0gb3IgdGhyZWUtYWRkcmVzcyBjb2RlCisgICAgLSBtZW1vcnkgb3BlcmFuZHMgb3IgbG9hZC1zdG9yZS1hcmNoaXRlY3R1cmUKKyAgICAtIG51bWJlciBvZiByZWdpc3Rlci1hcmd1bWVudHMKKyAgICAtIG51bWJlciBvZiBjYWxsZXItc2F2ZS1yZWdpc3RlcnMKKyovCisKKy8qIGJ1aWwtdGltZSBjb25maWd1cmFibGUgb3B0aW9uczogKi8KKworI3VuZGVmIENIQVIKKyN1bmRlZiBTSE9SVAorI3VuZGVmIElOVAorI3VuZGVmIExPTkcKKyN1bmRlZiBMTE9ORworI3VuZGVmIEZMT0FUCisjdW5kZWYgRE9VQkxFCisjdW5kZWYgTERPVUJMRQorI3VuZGVmIFZPSUQKKyN1bmRlZiBQT0lOVEVSCisjdW5kZWYgQVJSQVkKKyN1bmRlZiBTVFJVQ1QKKyN1bmRlZiBVTklPTgorI3VuZGVmIEVOVU0KKyN1bmRlZiBGVU5LVAorI3VuZGVmIE1BWElOVAorI3VuZGVmIE1BWF9UWVBFCisKKyNkZWZpbmUgQ0hBUiAxCisjZGVmaW5lIFNIT1JUIDIKKyNkZWZpbmUgSU5UIDMKKyNkZWZpbmUgTE9ORyA0CisjZGVmaW5lIExMT05HIDUKKyNkZWZpbmUgRkxPQVQgNgorI2RlZmluZSBET1VCTEUgNworI2RlZmluZSBMRE9VQkxFIDgKKyNkZWZpbmUgVk9JRCA5CisjZGVmaW5lIFBPSU5URVIgMTAKKyNkZWZpbmUgQVJSQVkgMTEKKyNkZWZpbmUgU1RSVUNUIDEyCisjZGVmaW5lIFVOSU9OIDEzCisjZGVmaW5lIEVOVU0gMTQKKyNkZWZpbmUgRlVOS1QgMTUKKyNkZWZpbmUgTUFYSU5UIDE2IC8qIHNob3VsZCBub3QgYmUgYWNjZXNpYmxlIHRvIGFwcGxpY2F0aW9uICovCisjZGVmaW5lIE1BWF9UWVBFIE1BWElOVAorCisKKy8vI2RlZmluZSBOVU1fRklYRUQgNAorI2RlZmluZSBOVU1fMTZCSVQgMTAKKyNkZWZpbmUgTlVNXzMyQklUIDEzCisjZGVmaW5lIE5VTV82NEJJVCA1CisjZGVmaW5lIE5VTV84QklUICA0CisKKyNpbmNsdWRlICJkdC5oIgorCisvKiBpbnRlcm5hbGx5IHVzZWQgYnkgdGhlIGJhY2tlbmQgKi8KKy8vI2RlZmluZSBGSVJTVF9GSVhFRCAxCisvLyNkZWZpbmUgTEFTVF9GSVhFRCAoRklSU1RfRklYRUQrTlVNX0ZJWEVELTEpCisjZGVmaW5lIEZJUlNUXzE2QklUIDEvLyhMQVNUX0ZJWEVEKzEpCisjZGVmaW5lIExBU1RfMTZCSVQgKEZJUlNUXzE2QklUK05VTV8xNkJJVC0xKQorI2RlZmluZSBGSVJTVF8zMkJJVCAoTEFTVF8xNkJJVCsxKQorI2RlZmluZSBMQVNUXzMyQklUIChGSVJTVF8zMkJJVCtOVU1fMzJCSVQtMSkKKyNkZWZpbmUgRklSU1RfNjRCSVQgKExBU1RfMzJCSVQrMSkKKyNkZWZpbmUgTEFTVF82NEJJVCAoRklSU1RfNjRCSVQrTlVNXzY0QklULTEpCisjZGVmaW5lIEZJUlNUXzhCSVQgKExBU1RfNjRCSVQrMSkKKyNkZWZpbmUgTEFTVF84QklUIChGSVJTVF84QklUK05VTV84QklULTEpCisjZGVmaW5lIFNUQUNLX1BPSU5URVIgKExBU1RfOEJJVCsxKQorCisvLyAjZGVmaW5lIEZJWEVEX1NQIDEKKworLyogIFRoaXMgc3RydWN0IGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBtYWNoaW5lLXNwZWNpZmljICAgICAgICAgICAqLworLyogIGFkZHJlc3NpbmctbW9kZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEN1cnJlbnRseSBwb3NzaWJsZSBhcmUgKGNvbnN0LGdwcikgYW5kIChncHIsZ3ByKSAgICAgICAgICAgICAgICAqLworc3RydWN0IEFkZHJlc3NpbmdNb2RleworICAgIGludCBmbGFnczsKKyAgICBpbnQgYmFzZTsKKyAgICBsb25nIG9mZnNldDsKK307CisKKy8qICBUaGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUuICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFYUiBOVU1fMTZCSVQrTlVNXzMyQklUK05VTV82NEJJVCtOVU1fOEJJVCsxCisKKy8qICBOdW1iZXIgb2YgY29tbWFuZGxpbmUtb3B0aW9ucyB0aGUgY29kZS1nZW5lcmF0b3IgYWNjZXB0cy4gICAgICAgKi8KKyNkZWZpbmUgTUFYR0YgMjAKKworLyogIElmIHRoaXMgaXMgc2V0IHRvIHplcm8gdmJjYyB3aWxsIG5vdCBnZW5lcmF0ZSBJQ3Mgd2hlcmUgdGhlICAgICAqLworLyogIHRhcmdldCBvcGVyYW5kIGlzIHRoZSBzYW1lIGFzIHRoZSAybmQgc291cmNlIG9wZXJhbmQuICAgICAgICAgICAqLworLyogIFRoaXMgY2FuIHNvbWV0aW1lcyBzaW1wbGlmeSB0aGUgY29kZS1nZW5lcmF0b3IsIGJ1dCB1c3VhbGx5ICAgICAqLworLyogIHRoZSBjb2RlIGlzIGJldHRlciBpZiB0aGUgY29kZS1nZW5lcmF0b3IgYWxsb3dzIGl0LiAgICAgICAgICAgICAqLworI2RlZmluZSBVU0VRMkFTWiAxCisKKy8qICBUaGlzIHNwZWNpZmllcyB0aGUgc21hbGxlc3QgaW50ZWdlciB0eXBlIHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgKi8KKy8qICBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlOQURESTJQIENIQVIKKworLyogIElmIHRoZSBieXRlcyBvZiBhbiBpbnRlZ2VyIGFyZSBvcmRlcmVkIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSAgICAqLworLyogIGJ5dGUgZmlyc3QgYW5kIHRoZW4gZGVjcmVhc2luZyBzZXQgQklHRU5ESUFOIHRvIDEuICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdFTkRJQU4gMQorCisvKiAgSWYgdGhlIGJ5dGVzIG9mIGFuIGludGVnZXIgYXJlIG9yZGVyZWQgbGVzdCBzaWduaWZpY2FudCBieXRlICAgICovCisvKiAgYnl0ZSBmaXJzdCBhbmQgdGhlbiBpbmNyZWFzaW5nIHNldCBMSVRUTEVFTkRJQU4gdG8gMS4gICAgICAgICAgICovCisjZGVmaW5lIExJVFRMRUVORElBTiAwCisKKy8qICBOb3RlIHRoYXQgQklHRU5ESUFOIGFuZCBMSVRUTEVFTkRJQU4gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gICAgKi8KKworLyogIElmIHN3aXRjaC1zdGF0ZW1lbnRzIHNob3VsZCBiZSBnZW5lcmF0ZWQgYXMgYSBzZXF1ZW5jZSBvZiAgICAgICAqLworLyogIFNVQixUU1QsQkVRIElDcyByYXRoZXIgdGhhbiBDT01QQVJFLEJFUSBJQ3Mgc2V0IHRoaXMgdG8gMS4gICAgICAqLworLyogIFRoaXMgY2FuIHlpZWxkIGJldHRlciBjb2RlIG9uIHNvbWUgbWFjaGluZXMuICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTV0lUQ0hTVUJTIDAKKworLyogIEluIG9wdGltaXppbmcgY29tcGlsYXRpb24gY2VydGFpbiBsaWJyYXJ5IG1lbWNweS9zdHJjcHktY2FsbHMgICAqLworLyogIHdpdGggbGVuZ3RoIGtub3duIGF0IGNvbXBpbGUtdGltZSB3aWxsIGJlIGlubGluZWQgdXNpbmcgYW4gICAgICAqLworLyogIEFTU0lHTi1JQyBpZiB0aGUgc2l6ZSBpcyBsZXNzIG9yIGVxdWFsIHRvIElOTElORU1FTUNQWS4gICAgICAgICAqLworLyogIFRoZSB0eXBlIHVzZWQgZm9yIHRoZSBBU1NJR04tSUMgd2lsbCBiZSBVTlNJR05FRHxDSEFSLiAgICAgICAgICAqLworI2RlZmluZSBJTkxJTkVNRU1DUFkgMTAyNAorCisvKiAgUGFyYW1ldGVycyBhcmUgc29tZXRpbWVzIHBhc3NlZCBpbiByZWdpc3RlcnMgd2l0aG91dCBfX3JlZy4gICAgICovCisjZGVmaW5lIEhBVkVfUkVHUEFSTVMgMQorCisvKiAgUGFyYW1ldGVycyBvbiB0aGUgc3RhY2sgc2hvdWxkIGJlIHB1c2hlZCBpbiBvcmRlciByYXRoZXIgdGhhbiAgICovCisvKiAgaW4gcmV2ZXJzZSBvcmRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9SREVSRURfUFVTSCAxCisKKy8qICBTdHJ1Y3R1cmUgZm9yIHJlZ19wYXJtKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0cnVjdCByZWdfaGFuZGxleworICAgIHVuc2lnbmVkIGxvbmcgcmVnczg7CisgICAgdW5zaWduZWQgbG9uZyByZWdzMTY7CisJdW5zaWduZWQgbG9uZyByZWdzMzI7CisJdW5zaWduZWQgbG9uZyByZWdzNjQ7Cit9OworCisvKiAgV2UgaGF2ZSBzb21lIHRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZSBhdHRyaWJ1dGVzLiAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBVkVfVEFSR0VUX0FUVFJJQlVURVMKKworLyogV2UgaGF2ZSB0YXJnZXQtc3BlY2lmaWMgcHJhZ21hcyAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9QUkFHTUFTCisKKy8qICBXZSBrZWVwIHRyYWNrIG9mIGFsbCByZWdpc3RlcnMgbW9kaWZpZWQgYnkgYSBmdW5jdGlvbi4gICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9SRUdTX01PRElGSUVEIDEKKworLyogV2UgaGF2ZSBhIGltcGxlbWVudCBvdXIgb3duIGNvc3QtZnVuY3Rpb25zIHRvIGFkYXB0IAorICAgcmVnaXN0ZXItYWxsb2NhdGlvbiAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9SQUxMT0MgMQorI2RlZmluZSBjb3N0X21vdmVfcmVnKHgseSkgMQorI2RlZmluZSBjb3N0X2xvYWRfcmVnKHgseSkgMgorI2RlZmluZSBjb3N0X3NhdmVfcmVnKHgseSkgMgorI2RlZmluZSBjb3N0X3B1c2hwb3BfcmVnKHgpIDMKKworLyogc2l6ZSBvZiBidWZmZXIgZm9yIGFzbS1vdXRwdXQsIHRoaXMgY2FuIGJlIHVzZWQgdG8gZG8KKyAgIHBlZXBob2xlLW9wdGltaXphdGlvbnMgb2YgdGhlIGdlbmVyYXRlZCBhc3NlbWJseS1vdXRwdXQgKi8KKyNkZWZpbmUgRU1JVF9CVUZfTEVOIDEwMjQgLyogc2hvdWxkIGJlIGVub3VnaCAqLworLyogbnVtYmVyIG9mIGFzbS1vdXRwdXQgbGluZXMgYnVmZmVyZWQgKi8KKyNkZWZpbmUgRU1JVF9CVUZfREVQVEggNAorCisvKiAgV2UgaGF2ZSBubyBhc21fcGVlcGhvbGUgdG8gb3B0aW1pemUgYXNzZW1ibHktb3V0cHV0ICovCisjZGVmaW5lIEhBVkVfVEFSR0VUX1BFRVBIT0xFIDAKKworLyogd2UgZG8gbm90IGhhdmUgYSBtYXJrX2VmZl9pY3MgZnVuY3Rpb24sIHRoaXMgaXMgdXNlZCB0byBwcmV2ZW50CisgICBvcHRpbWl6YXRpb25zIG9uIGNvZGUgd2hpY2ggY2FuIGFscmVhZHkgYmUgaW1wbGVtZW50ZWQgYnkgZWZmaWNpZW50CisgICBhc3NlbWJseSAqLworI3VuZGVmIEhBVkVfVEFSR0VUX0VGRl9JQworCisvKiB3ZSBvbmx5IG5lZWQgdGhlIHN0YW5kYXJkIGRhdGEgdHlwZXMgKG5vIGJpdC10eXBlcywgZGlmZmVyZW50IHBvaW50ZXJzCisgICBldGMuKSAqLworI3VuZGVmIEhBVkVfRVhUX1RZUEVTCisjdW5kZWYgSEFWRV9UR1RfUFJJTlRWQUwKKworLyogd2UgZG8gbm90IG5lZWQgZXh0cmEgZWxlbWVudHMgaW4gdGhlIElDICovCisjdW5kZWYgSEFWRV9FWFRfSUMKKworLyogd2UgZG8gbm90IHVzZSB1bnNpZ25lZCBpbnQgYXMgc2l6ZV90IChidXQgdW5zaWduZWQgbG9uZywgdGhlIGRlZmF1bHQpICovCisjdW5kZWYgSEFWRV9JTlRfU0laRVQKKworLyogd2UgZG8gbm90IG5lZWQgcmVnaXN0ZXItcGFpcnMgKi8KKyN1bmRlZiBIQVZFX1JFR1BBSVJTCisKZGlmZiAtLWdpdCBhL21hY2hpbmVzL21pbngvbWFjaGluZS5jIGIvbWFjaGluZXMvbWlueC9tYWNoaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjQxNzUyMQotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL21pbngvbWFjaGluZS5jCkBAIC0wLDAgKzEsMTAyMSBAQAorLyogIEV4YW1wbGUgYmFja2VuZCBmb3IgdmJjYywgaXQgbW9kZWxzIGEgZ2VuZXJpYyAzMmJpdCBSSVNDIG9yIENJU0MKKyBDUFUuCisgCisgQ29uZmlndXJhYmxlIGF0IGJ1aWxkLXRpbWUgYXJlOgorIC0gbnVtYmVyIG9mICgzMmJpdCkgZ2VuZXJhbC1wdXJwb3NlLXJlZ2lzdGVycworIC0gbnVtYmVyIG9mICg2NGJpdCkgZmxvYXRpbmctcG9pbnQtcmVnaXN0ZXJzCisgLSBudW1iZXIgb2YgKDhiaXQpIGNvbmRpdGlvbi1jb2RlLXJlZ2lzdGVycworIC0gbWVjaGFuaXNtIGZvciBzdGFjay1hcmd1bWVudHMgKG1vdmluZyBvdCBmaXhlZCBzcCkKKyAKKyBJdCBhbGxvd3MgdG8gc2VsZWN0IGFzIHJ1bi10aW1lLW9wdGlvbnM6CisgLSB0d28tIG9yIHRocmVlLWFkZHJlc3MgY29kZQorIC0gbWVtb3J5IG9wZXJhbmRzIG9yIGxvYWQtc3RvcmUtYXJjaGl0ZWN0dXJlCisgLSBudW1iZXIgb2YgcmVnaXN0ZXItYXJndW1lbnRzCisgLSBudW1iZXIgb2YgY2FsbGVyLXNhdmUtcmVnaXN0ZXJzCisgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisjaW5jbHVkZSAic3VwcC5oIgorCitzdGF0aWMgY2hhciBGSUxFX1tdPV9fRklMRV9fOworCisvKiAgUHVibGljIGRhdGEgdGhhdCBNVVNUIGJlIHRoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogTmFtZSBhbmQgY29weXJpZ2h0LiAqLworY2hhciBjZ19jb3B5cmlnaHRbXT0idmJjYyBnZW5lcmljIGNvZGUtZ2VuZXJhdG9yIFYwLjAxIGZvciBNaW54IChjKSBpbiAyMDAxIGJ5IHpvcmFuYyI7CisKKy8qICBDb21tYW5kbGluZS1mbGFncyB0aGUgY29kZS1nZW5lcmF0b3IgYWNjZXB0czoKKyAwOiBqdXN0IGEgZmxhZworIFZBTEZMQUc6IGEgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQKKyBTVFJJTkdGTEFHOiBhIHN0cmluZyBjYW4gYmUgc3BlY2lmaWVkCisgRlVOQ0ZMQUc6IGEgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKKyBhcGFydCBmcm9tIEZVTkNGTEFHLCBhbGwgb3RoZXIgdmVyc2lvbnMgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIG9uY2UgKi8KK2ludCBnX2ZsYWdzW01BWEdGXT17MCwwLAorICBWQUxGTEFHLFZBTEZMQUcsVkFMRkxBRywKKyAgMCwwLAorICBWQUxGTEFHLFZBTEZMQUcsMH07CisKKy8qIHRoZSBmbGFnLW5hbWUsIGRvIG5vdCB1c2UgbmFtZXMgYmVnaW5uaW5nIHdpdGggbCwgTCwgSSwgRCBvciBVLCBiZWNhdXNlCisgdGhleSBjb2xsaWRlIHdpdGggdGhlIGZyb250ZW5kICovCitjaGFyICpnX2ZsYWdzX25hbWVbTUFYR0ZdPXsidGhyZWUtYWRkciIsImxvYWQtc3RvcmUiLAorICAidm9sYXRpbGUtZ3BycyIsInZvbGF0aWxlLWZwcnMiLCJ2b2xhdGlsZS1jY3JzIiwKKyAgImltbS1pbmQiLCJncHItaW5kIiwKKyAgImdwci1hcmdzIiwiZnByLWFyZ3MiLCJ1c2UtY29tbW9ucyJ9OworCisvKiB0aGUgcmVzdWx0cyBvZiBwYXJzaW5nIHRoZSBjb21tYW5kLWxpbmUtZmxhZ3Mgd2lsbCBiZSBzdG9yZWQgaGVyZSAqLwordW5pb24gcHBpIGdfZmxhZ3NfdmFsW01BWEdGXTsKKworLyogIEFsaWdubWVudC1yZXF1aXJlbWVudHMgZm9yIGFsbCB0eXBlcyBpbiBieXRlcy4gICAgICAgICAgICAgICovCit6bWF4IGFsaWduW01BWF9UWVBFKzFdOworCisvKiAgQWxpZ25tZW50IHRoYXQgaXMgc3VmZmljaWVudCBmb3IgZXZlcnkgb2JqZWN0LiAgICAgICAgICAgICAgKi8KK3ptYXggbWF4YWxpZ247CisKKy8qICBDSEFSX0JJVCBmb3IgdGhlIHRhcmdldCBtYWNoaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworem1heCBjaGFyX2JpdDsKKworLyogIHNpemVzIG9mIHRoZSBiYXNpYyB0eXBlcyAoaW4gYnl0ZXMpICovCit6bWF4IHNpemV0YWJbTUFYX1RZUEUrMV07CisKKy8qICBNaW5pbXVtIGFuZCBNYXhpbXVtIHZhbHVlcyBlYWNoIHR5cGUgY2FuIGhhdmUuICAgICAgICAgICAgICAqLworLyogIE11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gaW5pdF9jZygpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IHRfbWluW01BWF9UWVBFKzFdOworenVtYXggdF9tYXhbTUFYX1RZUEUrMV07Cit6dW1heCB0dV9tYXhbTUFYX1RZUEUrMV07CisKKy8qICBOYW1lcyBvZiBhbGwgcmVnaXN0ZXJzLiB3aWxsIGJlIGluaXRpYWxpemVkIGluIGluaXRfY2coKSwKKyByZWdpc3RlciBudW1iZXIgMCBpcyBpbnZhbGlkLCB2YWxpZCByZWdpc3RlcnMgc3RhcnQgYXQgMSAqLworY2hhciAqcmVnbmFtZXNbTUFYUisxXTsKKworLyogIFRoZSBTaXplIG9mIGVhY2ggcmVnaXN0ZXIgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IHJlZ3NpemVbTUFYUisxXTsKKworLyogIGEgdHlwZSB3aGljaCBjYW4gc3RvcmUgZWFjaCByZWdpc3Rlci4gKi8KK3N0cnVjdCBUeXAgKnJlZ3R5cGVbTUFYUisxXTsKKworLyogIHJlZ3NhW3JlZ10hPTAgaWYgYSBjZXJ0YWluIHJlZ2lzdGVyIGlzIGFsbG9jYXRlZCBhbmQgc2hvdWxkICovCisvKiAgbm90IGJlIHVzZWQgYnkgdGhlIGNvbXBpbGVyIHBhc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2ludCByZWdzYVtNQVhSKzFdOworCisvKiAgU3BlY2lmaWVzIHdoaWNoIHJlZ2lzdGVycyBtYXkgYmUgc2NyYXRjaGVkIGJ5IGZ1bmN0aW9ucy4gICAgKi8KK2ludCByZWdzY3JhdGNoW01BWFIrMV07CisKKy8qIHNwZWNpZmllcyB0aGUgcHJpb3JpdHkgZm9yIHRoZSByZWdpc3Rlci1hbGxvY2F0b3IsIGlmIHRoZSBzYW1lCisgZXN0aW1hdGVkIGNvc3Qtc2F2aW5nIGNhbiBiZSBvYnRhaW5lZCBieSBzZXZlcmFsIHJlZ2lzdGVycywgdGhlCisgb25lIHdpdGggdGhlIGhpZ2hlc3QgcHJpb3JpdHkgd2lsbCBiZSB1c2VkICovCitpbnQgcmVnX3ByaW9bTUFYUisxXTsKKworLyogYW4gZW1wdHkgcmVnLWhhbmRsZSByZXByZXNlbnRpbmcgaW5pdGlhbCBzdGF0ZSAqLworc3RydWN0IHJlZ19oYW5kbGUgZW1wdHlfcmVnX2hhbmRsZT17MCwwfTsKKworLyogTmFtZXMgb2YgdGFyZ2V0LXNwZWNpZmljIHZhcmlhYmxlIGF0dHJpYnV0ZXMuICAgICAgICAgICAgICAgICovCitjaGFyICpnX2F0dHJfbmFtZVtdPXsiX19pbnRlcnJ1cHQiLDB9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFByaXZhdGUgZGF0YSBhbmQgZnVuY3Rpb25zLiAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUSFJFRV9BRERSIChnX2ZsYWdzWzBdJlVTRURGTEFHKQorI2RlZmluZSBMT0FEX1NUT1JFIChnX2ZsYWdzWzFdJlVTRURGTEFHKQorI2RlZmluZSBWT0xfR1BSUyAgICgoZ19mbGFnc1syXSZVU0VERkxBRyk/Z19mbGFnc192YWxbMl0ubDpOVU1fR1BSUy8yKQorI2RlZmluZSBWT0xfRlBSUyAgICgoZ19mbGFnc1szXSZVU0VERkxBRyk/Z19mbGFnc192YWxbM10ubDpOVU1fRlBSUy8yKQorI2RlZmluZSBWT0xfQ0NSUyAgICgoZ19mbGFnc1s0XSZVU0VERkxBRyk/Z19mbGFnc192YWxbNF0ubDpOVU1fQ0NSUy8yKQorI2RlZmluZSBJTU1fSU5EICAgICgoZ19mbGFnc1s1XSZVU0VERkxBRyk/MTowKQorI2RlZmluZSBHUFJfSU5EICAgICgoZ19mbGFnc1s2XSZVU0VERkxBRyk/MjowKQorI2RlZmluZSBHUFJfQVJHUyAgICgoZ19mbGFnc1s3XSZVU0VERkxBRyk/Z19mbGFnc192YWxbN10ubDowKQorI2RlZmluZSBGUFJfQVJHUyAgICgoZ19mbGFnc1s4XSZVU0VERkxBRyk/Z19mbGFnc192YWxbOF0ubDowKQorI2RlZmluZSBVU0VfQ09NTU9OUyAoZ19mbGFnc1s5XSZVU0VERkxBRykKKworCisvKiBhbGlnbm1lbnQgb2YgYmFzaWMgZGF0YS10eXBlcywgdXNlZCB0byBpbml0aWFsaXplIGFsaWduW10gKi8KK3N0YXRpYyBsb25nIG1hbGlnbltNQVhfVFlQRSsxXT0gIHsxLDEsMiw0LDQsNCw0LDgsOCwxLDQsMSwxLDEsNCwxfTsKKy8qIHNpemVzIG9mIGJhc2ljIGRhdGEtdHlwZXMsIHVzZWQgdG8gaW5pdGlhbGl6ZSBzaXpldGFiW10gKi8KK3N0YXRpYyBsb25nIG1zaXpldGFiW01BWF9UWVBFKzFdPXsxLDEsMiw0LDQsOCw0LDgsOCwwLDQsMCwwLDAsNCwwfTsKKworLyogdXNlZCB0byBpbml0aWFsaXplIHJlZ3R5cFtdICovCitzdGF0aWMgc3RydWN0IFR5cCBsdHlwPXtMT05HfSxsZGJsPXtET1VCTEV9LGxjaGFyPXtDSEFSfTsKKworLyogbWFjcm9zIGRlZmluZWQgYnkgdGhlIGJhY2tlbmQgKi8KK3N0YXRpYyBjaGFyICptYXJyYXlbXT17Il9fc2VjdGlvbih4KT1fX3ZhdHRyKFwic2VjdGlvbihcIiN4XCIpXCIpIiwKKyAgIl9fR0VORVJJQ19fIiwKKyAgMH07CisKKy8qIHNwZWNpYWwgcmVnaXN0ZXJzICovCitzdGF0aWMgaW50IHNwOyAgICAgICAgICAgICAgICAgICAgIC8qICBTdGFja3BvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIGludCB0MSx0Mix0MzsgICAgICAgICAgICAgICAvKiAgdGVtcG9yYXJ5IGdwcnMgKi8KK3N0YXRpYyBpbnQgZjEsZjIsZjM7ICAgICAgICAgICAgICAgLyogIHRlbXBvcmFyeSBmcHJzICovCisKKyNkZWZpbmUgZHQodCkgKCgodCkmVU5TSUdORUQpP3VkdFsodCkmTlFdOnNkdFsodCkmTlFdKQorc3RhdGljIGNoYXIgKnNkdFtNQVhfVFlQRSsxXT17Ij8/IiwiYyIsInMiLCJpIiwibCIsImxsIiwiZiIsImQiLCJsZCIsInYiLCJwIn07CitzdGF0aWMgY2hhciAqdWR0W01BWF9UWVBFKzFdPXsiPz8iLCJ1YyIsInVzIiwidWkiLCJ1bCIsInVsbCIsImYiLCJkIiwibGQiLCJ2IiwicCJ9OworCisvKiBzZWN0aW9ucyAqLworI2RlZmluZSBEQVRBIDAKKyNkZWZpbmUgQlNTIDEKKyNkZWZpbmUgQ09ERSAyCisjZGVmaW5lIFJPREFUQSAzCisjZGVmaW5lIFNQRUNJQUwgNAorCitzdGF0aWMgbG9uZyBzdGFjazsKK3N0YXRpYyBpbnQgc3RhY2tfdmFsaWQ7CitzdGF0aWMgaW50IHNlY3Rpb249LTEsbmV3b2JqOworc3RhdGljIGNoYXIgKmNvZGVuYW1lPSJcdC50ZXh0XG4iLAorKmRhdGFuYW1lPSJcdC5kYXRhXG4iLAorKmJzc25hbWU9IiIsCisqcm9kYXRhbmFtZT0iXHQuc2VjdGlvblx0LnJvZGF0YVxuIjsKKworLyogcmV0dXJuLWluc3RydWN0aW9uICovCitzdGF0aWMgY2hhciAqcmV0OworCisvKiBsYWJlbCBhdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiAoaWYgYW55KSAqLworc3RhdGljIGludCBleGl0X2xhYmVsOworCisvKiBhc3NlbWJseS1wcmVmaXhlcyBmb3IgbGFiZWxzIGFuZCBleHRlcm5hbCBpZGVudGlmaWVycyAqLworc3RhdGljIGNoYXIgKmxhYnByZWZpeD0ibCIsKmlkcHJlZml4PSJfIjsKKworI2lmIEZJWEVEX1NQCisvKiB2YXJpYWJsZXMgdG8gY2FsY3VsYXRlIHRoZSBzaXplIGFuZCBwYXJ0aXRpb25pbmcgb2YgdGhlIHN0YWNrLWZyYW1lCisgaW4gdGhlIGNhc2Ugb2YgRklYRURfU1AgKi8KK3N0YXRpYyBsb25nIGZyYW1lb2Zmc2V0LHB1c2hlZCxtYXhwdXNoZWQsZnJhbWVzaXplOworI2Vsc2UKKy8qIHZhcmlhYmxlcyB0byBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IHN0YWNrLW9mZnNldCBpbiB0aGUgY2FzZSBvZgorIGEgbW92aW5nIHN0YWNrLXBvaW50ZXIgKi8KK3N0YXRpYyBsb25nIG5vdHBvcHBlZCxkb250cG9wLHN0YWNrb2Zmc2V0LG1heHB1c2hlZDsKKyNlbmRpZgorCitzdGF0aWMgbG9uZyBsb2NhbHNpemUscnNhdmVzaXplLGFyZ3NpemU7CisKK3N0YXRpYyB2b2lkIGVtaXRfb2JqKEZJTEUgKmYsc3RydWN0IG9iaiAqcCxpbnQgdCk7CisKKy8qIGNhbGN1bGF0ZSB0aGUgYWN0dWFsIGN1cnJlbnQgb2Zmc2V0IG9mIGFuIG9iamVjdCByZWxhdGl2IHRvIHRoZQorIHN0YWNrLXBvaW50ZXI7IHdlIHVzZSBhIGxheW91dCBsaWtlIHRoaXM6CisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgfCBhcmd1bWVudHMgdG8gdGhpcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICB8CisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgfCByZXR1cm4tYWRkcmVzcyBbc2l6ZT00XSAgICAgICAgICAgICAgICAgICAgICB8CisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgfCBjYWxsZXItc2F2ZSByZWdpc3RlcnMgW3NpemU9cnNhdmVzaXplXSAgICAgICB8CisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgfCBsb2NhbCB2YXJpYWJsZXMgW3NpemU9bG9jYWxzaXplXSAgICAgICAgICAgICB8CisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgfCBhcmd1bWVudHMgdG8gY2FsbGVkIGZ1bmN0aW9ucyBbc2l6ZT1hcmdzaXplXSB8CisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQWxsIHNpemVzIHdpbGwgYmUgYWxpZ25lZCBhcyBuZWNlc3NhcnkuCisgSW4gdGhlIGNhc2Ugb2YgRklYRURfU1AsIHRoZSBzdGFjay1wb2ludGVyIHdpbGwgYmUgYWRqdXN0ZWQgYXQKKyBmdW5jdGlvbi1lbnRyeSB0byBsZWF2ZSBlbm91Z2ggc3BhY2UgZm9yIHRoZSBhcmd1bWVudHMgYW5kIGhhdmUgaXQKKyBhbGlnbmVkIHRvIDE2IGJ5dGVzLiBUaGVyZWZvcmUsIHdoZW4gY2FsbGluZyBhIGZ1bmN0aW9uLCB0aGUKKyBzdGFjay1wb2ludGVyIGlzIGFsd2F5cyBhbGlnbmVkIHRvIDE2IGJ5dGVzLgorIEZvciBhIG1vdmluZyBzdGFjay1wb2ludGVyLCB0aGUgc3RhY2stcG9pbnRlciB3aWxsIHVzdWFsbHkgcG9pbnQKKyB0byB0aGUgYm90dG9tIG9mIHRoZSBhcmVhIGZvciBsb2NhbCB2YXJpYWJsZXMsIGJ1dCB3aWxsIG1vdmUgd2hpbGUKKyBhcmd1bWVudHMgYXJlIHB1dCBvbiB0aGUgc3RhY2suCisgCisgVGhpcyBpcyBqdXN0IGFuIGV4YW1wbGUgbGF5b3V0LiBPdGhlciBsYXlvdXRzIGFyZSBhbHNvIHBvc3NpYmxlLgorICovCisKK3N0YXRpYyBsb25nIHJlYWxfb2Zmc2V0KHN0cnVjdCBvYmogKm8pCit7CisgIGxvbmcgb2ZmPXptMmwoby0+di0+b2Zmc2V0KTsKKyAgaWYob2ZmPDApeworICAgIC8qIGZ1bmN0aW9uIHBhcmFtZXRlciAqLworICAgIG9mZj1sb2NhbHNpemUrcnNhdmVzaXplKzQtb2ZmLXptMmwobWF4YWxpZ24pOworICB9CisgIAorI2lmIEZJWEVEX1NQCisgIG9mZis9YXJnc2l6ZTsKKyNlbHNlCisgIG9mZis9c3RhY2tvZmZzZXQ7CisjZW5kaWYKKyAgb2ZmKz16bTJsKG8tPnZhbC52bWF4KTsKKyAgcmV0dXJuIG9mZjsKK30KKworLyogIEluaXRpYWxpemVzIGFuIGFkZHJlc3NpbmctbW9kZSBzdHJ1Y3R1cmUgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvCisgdGhhdCBvYmplY3QuIFdpbGwgbm90IHN1cnZpdmUgYSBzZWNvbmQgY2FsbCEgKi8KK3N0YXRpYyBzdHJ1Y3Qgb2JqICpjYW0oaW50IGZsYWdzLGludCBiYXNlLGxvbmcgb2Zmc2V0KQoreworICBzdGF0aWMgc3RydWN0IG9iaiBvYmo7CisgIHN0YXRpYyBzdHJ1Y3QgQWRkcmVzc2luZ01vZGUgYW07CisgIG9iai5hbT0mYW07CisgIGFtLmZsYWdzPWZsYWdzOworICBhbS5iYXNlPWJhc2U7CisgIGFtLm9mZnNldD1vZmZzZXQ7CisgIHJldHVybiAmb2JqOworfQorCisvKiBjaGFuZ2VzIHRvIGEgc3BlY2lhbCBzZWN0aW9uLCB1c2VkIGZvciBfX3NlY3Rpb24oKSAqLworc3RhdGljIGludCBzcGVjaWFsX3NlY3Rpb24oRklMRSAqZixzdHJ1Y3QgVmFyICp2KQoreworICBjaGFyICpzZWM7CisgIGlmKCF2LT52YXR0cikgcmV0dXJuIDA7CisgIHNlYz1zdHJzdHIodi0+dmF0dHIsInNlY3Rpb24oIik7CisgIGlmKCFzZWMpIHJldHVybiAwOworICBzZWMrPXN0cmxlbigic2VjdGlvbigiKTsKKyAgZW1pdChmLCJcdC5zZWN0aW9uXHQiKTsKKyAgd2hpbGUoKnNlYyYmKnNlYyE9JyknKSBlbWl0X2NoYXIoZiwqc2VjKyspOworICBlbWl0KGYsIlxuIik7CisgIGlmKGYpIHNlY3Rpb249U1BFQ0lBTDsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIGdlbmVyYXRlIGNvZGUgdG8gbG9hZCB0aGUgYWRkcmVzcyBvZiBhIHZhcmlhYmxlIGludG8gcmVnaXN0ZXIgciAqLworc3RhdGljIHZvaWQgbG9hZF9hZGRyZXNzKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdHlwZSkKKy8qICBHZW5lcmF0ZXMgY29kZSB0byBsb2FkIHRoZSBhZGRyZXNzIG9mIGEgdmFyaWFibGUgaW50byByZWdpc3RlciByLiAgICovCit7CisgIGlmKCEoby0+ZmxhZ3MmVkFSKSkgaWVycm9yKDApOworICBpZihvLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CisgICAgbG9uZyBvZmY9cmVhbF9vZmZzZXQobyk7CisgICAgaWYoVEhSRUVfQUREUil7CisgICAgICBlbWl0KGYsIlx0YWRkLiVzXHQlcywlcywlbGRcbiIsZHQoUE9JTlRFUikscmVnbmFtZXNbcl0scmVnbmFtZXNbc3BdLG9mZik7CisgICAgfWVsc2V7CisgICAgICBlbWl0KGYsIlx0bW92LiVzXHQlcywlc1xuIixkdChQT0lOVEVSKSxyZWduYW1lc1tyXSxyZWduYW1lc1tzcF0pOworICAgICAgaWYob2ZmKQorICAgICAgICBlbWl0KGYsIlx0YWRkLiVzXHQlcywlbGRcbiIsZHQoUE9JTlRFUikscmVnbmFtZXNbcl0sb2ZmKTsKKyAgICB9CisgIH1lbHNleworICAgIGVtaXQoZiwiXHRtb3YuJXNcdCVzLCIsZHQoUE9JTlRFUikscmVnbmFtZXNbcl0pOworICAgIGVtaXRfb2JqKGYsbyx0eXBlKTsKKyAgICBlbWl0KGYsIlxuIik7CisgIH0KK30KKy8qIEdlbmVyYXRlcyBjb2RlIHRvIGxvYWQgYSBtZW1vcnkgb2JqZWN0IGludG8gcmVnaXN0ZXIgci4gdG1wIGlzIGEKKyBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgd2hpY2ggbWF5IGJlIHVzZWQuIHRtcCBjYW4gYmUgci4gKi8KK3N0YXRpYyB2b2lkIGxvYWRfcmVnKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdHlwZSkKK3sKKyAgdHlwZSY9TlU7CisgIGlmKG8tPmZsYWdzJlZBUkFEUil7CisgICAgbG9hZF9hZGRyZXNzKGYscixvLFBPSU5URVIpOworICB9ZWxzZXsKKyAgICBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmby0+cmVnPT1yKQorICAgICAgcmV0dXJuOworICAgIGVtaXQoZiwiXHRtb3YuJXNcdCVzLCIsZHQodHlwZSkscmVnbmFtZXNbcl0pOworICAgIGVtaXRfb2JqKGYsbyx0eXBlKTsKKyAgICBlbWl0KGYsIlxuIik7CisgIH0KK30KKworLyogIEdlbmVyYXRlcyBjb2RlIHRvIHN0b3JlIHJlZ2lzdGVyIHIgaW50byBtZW1vcnkgb2JqZWN0IG8uICovCitzdGF0aWMgdm9pZCBzdG9yZV9yZWcoRklMRSAqZixpbnQgcixzdHJ1Y3Qgb2JqICpvLGludCB0eXBlKQoreworICB0eXBlJj1OUTsKKyAgZW1pdChmLCJcdG1vdi4lc1x0IixkdCh0eXBlKSk7CisgIGVtaXRfb2JqKGYsbyx0eXBlKTsKKyAgZW1pdChmLCIsJXNcbiIscmVnbmFtZXNbcl0pOworfQorCisvKiAgWWllbGRzIGxvZzIoeCkrMSBvciAwLiAqLworc3RhdGljIGxvbmcgcG9mMih6dW1heCB4KQoreworICB6dW1heCBwO2ludCBsbj0xOworICBwPXVsMnp1bSgxTCk7CisgIHdoaWxlKGxuPD0zMiYmenVtbGVxKHAseCkpeworICAgIGlmKHp1bWVxdG8oeCxwKSkgcmV0dXJuIGxuOworICAgIGxuKys7cD16dW1hZGQocCxwKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBJQyAqcHJlbG9hZChGSUxFICosc3RydWN0IElDICopOworCitzdGF0aWMgdm9pZCBmdW5jdGlvbl90b3AoRklMRSAqLHN0cnVjdCBWYXIgKixsb25nKTsKK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX2JvdHRvbShGSUxFICpmLHN0cnVjdCBWYXIgKixsb25nKTsKKworI2RlZmluZSBpc3JlZyh4KSAoKHAtPnguZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRykKKyNkZWZpbmUgaXNjb25zdCh4KSAoKHAtPnguZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpCisKK3N0YXRpYyBpbnQgcTFyZWcscTJyZWcsenJlZzsKKworc3RhdGljIGNoYXIgKmNjc1tdPXsiZXEiLCJuZSIsImx0IiwiZ2UiLCJsZSIsImd0IiwiIn07CitzdGF0aWMgY2hhciAqbG9naWNhbHNbXT17Im9yIiwieG9yIiwiYW5kIn07CitzdGF0aWMgY2hhciAqYXJpdGhtZXRpY3NbXT17InNsdyIsInNydyIsImFkZCIsInN1YiIsIm11bGx3IiwiZGl2dyIsIm1vZCJ9OworCisvKiBEb2VzIHNvbWUgcHJlLXByb2Nlc3NpbmcgbGlrZSBmZXRjaGluZyBvcGVyYW5kcyBmcm9tIG1lbW9yeSB0bworIHJlZ2lzdGVycyBldGMuICovCitzdGF0aWMgc3RydWN0IElDICpwcmVsb2FkKEZJTEUgKmYsc3RydWN0IElDICpwKQoreworICBpbnQgcjsKKyAgCisgIGlmKGlzcmVnKHExKSkKKyAgICBxMXJlZz1wLT5xMS5yZWc7CisgIGVsc2UKKyAgICBxMXJlZz0wOworICAKKyAgaWYoaXNyZWcocTIpKQorICAgIHEycmVnPXAtPnEyLnJlZzsKKyAgZWxzZQorICAgIHEycmVnPTA7CisgIAorICBpZihpc3JlZyh6KSl7CisgICAgenJlZz1wLT56LnJlZzsKKyAgfWVsc2V7CisgICAgaWYoSVNGTE9BVCh6dHlwKHApKSkKKyAgICAgIHpyZWc9ZjE7CisgICAgZWxzZQorICAgICAgenJlZz10MTsKKyAgfQorICAKKyAgaWYoKHAtPnExLmZsYWdzJihEUkVGT0JKfFJFRykpPT1EUkVGT0JKJiYhcC0+cTEuYW0peworICAgIHAtPnExLmZsYWdzJj1+RFJFRk9CSjsKKyAgICBsb2FkX3JlZyhmLHQxLCZwLT5xMSxxMXR5cChwKSk7CisgICAgcC0+cTEucmVnPXQxOworICAgIHAtPnExLmZsYWdzfD0oUkVHfERSRUZPQkopOworICB9CisgIGlmKHAtPnExLmZsYWdzJiZMT0FEX1NUT1JFJiYhaXNyZWcocTEpKXsKKyAgICBpZihJU0ZMT0FUKHExdHlwKHApKSkKKyAgICAgIHExcmVnPWYxOworICAgIGVsc2UKKyAgICAgIHExcmVnPXQxOworICAgIGxvYWRfcmVnKGYscTFyZWcsJnAtPnExLHExdHlwKHApKTsKKyAgICBwLT5xMS5yZWc9cTFyZWc7CisgICAgcC0+cTEuZmxhZ3M9UkVHOworICB9CisgIAorICBpZigocC0+cTIuZmxhZ3MmKERSRUZPQkp8UkVHKSk9PURSRUZPQkomJiFwLT5xMi5hbSl7CisgICAgcC0+cTIuZmxhZ3MmPX5EUkVGT0JKOworICAgIGxvYWRfcmVnKGYsdDEsJnAtPnEyLHEydHlwKHApKTsKKyAgICBwLT5xMi5yZWc9dDE7CisgICAgcC0+cTIuZmxhZ3N8PShSRUd8RFJFRk9CSik7CisgIH0KKyAgaWYocC0+cTIuZmxhZ3MmJkxPQURfU1RPUkUmJiFpc3JlZyhxMikpeworICAgIGlmKElTRkxPQVQocTJ0eXAocCkpKQorICAgICAgcTJyZWc9ZjI7CisgICAgZWxzZQorICAgICAgcTJyZWc9dDI7CisgICAgbG9hZF9yZWcoZixxMnJlZywmcC0+cTIscTJ0eXAocCkpOworICAgIHAtPnEyLnJlZz1xMnJlZzsKKyAgICBwLT5xMi5mbGFncz1SRUc7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisKKy8qIHNhdmUgdGhlIHJlc3VsdCAoaW4genJlZykgaW50byBwLT56ICovCit2b2lkIHNhdmVfcmVzdWx0KEZJTEUgKmYsc3RydWN0IElDICpwKQoreworICBpZigocC0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09RFJFRk9CSiYmIXAtPnouYW0peworICAgIHAtPnouZmxhZ3MmPX5EUkVGT0JKOworICAgIGxvYWRfcmVnKGYsdDIsJnAtPnosUE9JTlRFUik7CisgICAgcC0+ei5yZWc9dDI7CisgICAgcC0+ei5mbGFnc3w9KFJFR3xEUkVGT0JKKTsKKyAgfQorICBpZihpc3JlZyh6KSl7CisgICAgaWYocC0+ei5yZWchPXpyZWcpCisgICAgICBlbWl0KGYsIlx0bW92LiVzXHQlcywlc1xuIixkdCh6dHlwKHApKSxyZWduYW1lc1twLT56LnJlZ10scmVnbmFtZXNbenJlZ10pOworICB9ZWxzZXsKKyAgICBzdG9yZV9yZWcoZix6cmVnLCZwLT56LHp0eXAocCkpOworICB9Cit9CisKKy8qIHByaW50cyBhbiBvYmplY3QgKi8KK3N0YXRpYyB2b2lkIGVtaXRfb2JqKEZJTEUgKmYsc3RydWN0IG9iaiAqcCxpbnQgdCkKK3sKKyAgaWYocC0+YW0peworICAgIGlmKHAtPmFtLT5mbGFncyZHUFJfSU5EKSBlbWl0KGYsIiglcywlcykiLHJlZ25hbWVzW3AtPmFtLT5vZmZzZXRdLHJlZ25hbWVzW3AtPmFtLT5iYXNlXSk7CisgICAgaWYocC0+YW0tPmZsYWdzJklNTV9JTkQpIGVtaXQoZiwiKCVsZCwlcykiLHAtPmFtLT5vZmZzZXQscmVnbmFtZXNbcC0+YW0tPmJhc2VdKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYoKHAtPmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PShLT05TVHxEUkVGT0JKKSl7CisgICAgZW1pdHZhbChmLCZwLT52YWwscC0+ZHR5cCZOVSk7CisgICAgcmV0dXJuOworICB9CisgIGlmKHAtPmZsYWdzJkRSRUZPQkopIGVtaXQoZiwiKCIpOworICBpZihwLT5mbGFncyZSRUcpeworICAgIGVtaXQoZiwiJXMiLHJlZ25hbWVzW3AtPnJlZ10pOworICB9ZWxzZSBpZihwLT5mbGFncyZWQVIpIHsKKyAgICBpZihwLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikKKyAgICAgIGVtaXQoZiwiJWxkKCVzKSIscmVhbF9vZmZzZXQocCkscmVnbmFtZXNbc3BdKTsKKyAgICBlbHNleworICAgICAgaWYoIXptZXF0byhsMnptKDBMKSxwLT52YWwudm1heCkpe2VtaXR2YWwoZiwmcC0+dmFsLExPTkcpO2VtaXQoZiwiKyIpO30KKyAgICAgIGlmKHAtPnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQyl7CisgICAgICAgIGVtaXQoZiwiJXMlbGQiLGxhYnByZWZpeCx6bTJsKHAtPnYtPm9mZnNldCkpOworICAgICAgfWVsc2V7CisgICAgICAgIGVtaXQoZiwiJXMlcyIsaWRwcmVmaXgscC0+di0+aWRlbnRpZmllcik7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKHAtPmZsYWdzJktPTlNUKXsKKyAgICBlbWl0dmFsKGYsJnAtPnZhbCx0Jk5VKTsKKyAgfQorICBpZihwLT5mbGFncyZEUkVGT0JKKSBlbWl0KGYsIikiKTsKK30KKworLyogIFRlc3QgaWYgdGhlcmUgaXMgYSBzZXF1ZW5jZSBvZiBGUkVFUkVHcyBjb250YWluaW5nIEZSRUVSRUcgcmVnLgorIFVzZWQgYnkgcGVlcGhvbGUuICovCitzdGF0aWMgaW50IGV4aXN0c19mcmVlcmVnKHN0cnVjdCBJQyAqcCxpbnQgcmVnKQoreworICB3aGlsZShwJiYocC0+Y29kZT09RlJFRVJFR3x8cC0+Y29kZT09QUxMT0NSRUcpKXsKKyAgICBpZihwLT5jb2RlPT1GUkVFUkVHJiZwLT5xMS5yZWc9PXJlZykgcmV0dXJuIDE7CisgICAgcD1wLT5uZXh0OworICB9CisgIHJldHVybiAwOworfQorCisvKiBnZW5lcmF0ZXMgdGhlIGZ1bmN0aW9uIGVudHJ5IGNvZGUgKi8KK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX3RvcChGSUxFICpmLHN0cnVjdCBWYXIgKnYsbG9uZyBvZmZzZXQpCit7CisgIHJzYXZlc2l6ZT0wOworICBpZighc3BlY2lhbF9zZWN0aW9uKGYsdikmJnNlY3Rpb24hPUNPREUpe2VtaXQoZixjb2RlbmFtZSk7aWYoZikgc2VjdGlvbj1DT0RFO30gCisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisgICAgaWYoKHYtPmZsYWdzJihJTkxJTkVGVU5DfElOTElORUVYVCkpIT1JTkxJTkVGVU5DKQorICAgICAgZW1pdChmLCJcdC5nbG9iYWxcdCVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgZW1pdChmLCIlcyVzOlxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgfWVsc2UKKyAgICBlbWl0KGYsIiVzJWxkOlxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKyAgaWYob2Zmc2V0KQorICAgIGVtaXQoZiwiXHRzdWIuaVx0Z3ByMCwlbGRcbiIsIG9mZnNldCk7Cit9CisvKiBnZW5lcmF0ZXMgdGhlIGZ1bmN0aW9uIGV4aXQgY29kZSAqLworc3RhdGljIHZvaWQgZnVuY3Rpb25fYm90dG9tKEZJTEUgKmYsc3RydWN0IFZhciAqdixsb25nIG9mZnNldCkKK3sKKyAgaWYob2Zmc2V0KQorICAgIGVtaXQoZiwiXHRhZGQuaVx0Z3ByMCwlbGRcbiIsIG9mZnNldCk7CisgIGVtaXQoZixyZXQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBFbmQgb2YgcHJpdmF0ZSBkYXRhIGFuZCBmdW5jdGlvbnMuICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICBEb2VzIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbnMgZm9yIHRoZSBjb2RlLWdlbmVyYXRvci4gR2V0cyBjYWxsZWQgICovCisvKiAgb25jZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCBzaG91bGQgcmV0dXJuIDAgaW4gY2FzZSBvZiBwcm9ibGVtcy4gICAgICAqLworaW50IGluaXRfY2codm9pZCkKK3sKKyAgaW50IGk7CisgIC8qICBJbml0aWFsaXplIHNvbWUgdmFsdWVzIHdoaWNoIGNhbm5vdCBiZSBzdGF0aWNhbGx5IGluaXRpYWxpemVkICAgKi8KKyAgLyogIGJlY2F1c2UgdGhleSBhcmUgc3RvcmVkIGluIHRoZSB0YXJnZXQncyBhcml0aG1ldGljLiAgICAgICAgICAgICAqLworICBtYXhhbGlnbj1sMnptKDhMKTsKKyAgY2hhcl9iaXQ9bDJ6bSg4TCk7CisgIAorICBmb3IoaT0wO2k8PU1BWF9UWVBFO2krKyl7CisgICAgc2l6ZXRhYltpXT1sMnptKG1zaXpldGFiW2ldKTsKKyAgICBhbGlnbltpXT1sMnptKG1hbGlnbltpXSk7CisgIH0KKyAgCisgIHJlZ25hbWVzWzBdPSJub3JlZyI7CisgIGZvcihpPUZJUlNUX0dQUjtpPD1MQVNUX0dQUjtpKyspeworICAgIHJlZ25hbWVzW2ldPW15bWFsbG9jKDEwKTsKKyAgICBzcHJpbnRmKHJlZ25hbWVzW2ldLCJncHIlZCIsaS1GSVJTVF9HUFIpOworICAgIHJlZ3NpemVbaV09bDJ6bSg0TCk7CisgICAgcmVndHlwZVtpXT0mbHR5cDsKKyAgfQorICBmb3IoaT1GSVJTVF9GUFI7aTw9TEFTVF9GUFI7aSsrKXsKKyAgICByZWduYW1lc1tpXT1teW1hbGxvYygxMCk7CisgICAgc3ByaW50ZihyZWduYW1lc1tpXSwiZnByJWQiLGktRklSU1RfRlBSKTsKKyAgICByZWdzaXplW2ldPWwyem0oOEwpOworICAgIHJlZ3R5cGVbaV09JmxkYmw7CisgIH0KKyAgZm9yKGk9RklSU1RfQ0NSO2k8PUxBU1RfQ0NSO2krKyl7CisgICAgcmVnbmFtZXNbaV09bXltYWxsb2MoMTApOworICAgIHNwcmludGYocmVnbmFtZXNbaV0sImNjciVkIixpLUZJUlNUX0NDUik7CisgICAgcmVnc2l6ZVtpXT1sMnptKDFMKTsKKyAgICByZWd0eXBlW2ldPSZsY2hhcjsKKyAgfQorICAKKyAgLyogIFVzZSBtdWx0aXBsZSBjY3MuICAgKi8KKyAgbXVsdGlwbGVfY2NzPTA7CisgIAorICAvKiAgSW5pdGlhbGl6ZSB0aGUgbWluL21heC1zZXR0aW5ncy4gTm90ZSB0aGF0IHRoZSB0eXBlcyBvZiB0aGUgICAgICovCisgIC8qICBob3N0IHN5c3RlbSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIHRhcmdldCBzeXN0ZW0gYW5kIHlvdSBtYXkgKi8KKyAgLyogIG9ubHkgdXNlIHRoZSBzbWFsbGVzdCBtYXhpbXVtIHZhbHVlcyBBTlNJIGd1YXJhbnRlZXMgaWYgeW91ICAgICAqLworICAvKiAgd2FudCB0byBiZSBwb3J0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBUaGF0J3MgdGhlIHJlYXNvbiBmb3IgdGhlIHN1YnRyYWN0aW9uIGluIHRfbWluW0lOVF0uIExvbmcgY291bGQgKi8KKyAgLyogIGJlIHVuYWJsZSB0byByZXByZXNlbnQgLTIxNDc0ODM2NDggb24gdGhlIGhvc3Qgc3lzdGVtLiAgICAgICAgICAqLworICB0X21pbltDSEFSXT1sMnptKC0xMjhMKTsKKyAgdF9taW5bU0hPUlRdPWwyem0oLTMyNzY4TCk7CisgIHRfbWluW0lOVF09em1zdWIobDJ6bSgtMjE0NzQ4MzY0N0wpLGwyem0oMUwpKTsKKyAgdF9taW5bTE9OR109dF9taW4oSU5UKTsKKyAgdF9taW5bTExPTkddPXptbHNoaWZ0KGwyem0oMUwpLGwyem0oMzFMKSk7CisgIHRfbWluW01BWElOVF09dF9taW4oTExPTkcpOworICB0X21heFtDSEFSXT11bDJ6dW0oMTI3TCk7CisgIHRfbWF4W1NIT1JUXT11bDJ6dW0oMzI3NjdVTCk7CisgIHRfbWF4W0lOVF09dWwyenVtKDIxNDc0ODM2NDdVTCk7CisgIHRfbWF4W0xPTkddPXRfbWF4KElOVCk7CisgIHRfbWF4W0xMT05HXT16dW1yc2hpZnQoenVta29tcGwodWwyenVtKDBVTCkpLHVsMnp1bSgxVUwpKTsKKyAgdF9tYXhbTUFYSU5UXT10X21heChMTE9ORyk7CisgIHR1X21heFtDSEFSXT11bDJ6dW0oMjU1VUwpOworICB0dV9tYXhbU0hPUlRdPXVsMnp1bSg2NTUzNVVMKTsKKyAgdHVfbWF4W0lOVF09dWwyenVtKDQyOTQ5NjcyOTVVTCk7CisgIHR1X21heFtMT05HXT10X21heChVTlNJR05FRHxJTlQpOworICB0dV9tYXhbTExPTkddPXp1bWtvbXBsKHVsMnp1bSgwVUwpKTsKKyAgdHVfbWF4W01BWElOVF09dF9tYXgoVU5TSUdORUR8TExPTkcpOworICAKKyAgLyogIFJlc2VydmUgYSBmZXcgcmVnaXN0ZXJzIGZvciB1c2UgYnkgdGhlIGNvZGUtZ2VuZXJhdG9yLiAgICAgICovCisgIC8qICBUaGlzIGlzIG5vdCBvcHRpbWFsIGJ1dCBzaW1wbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzcD1GSVJTVF9HUFI7CisgIHQxPUZJUlNUX0dQUisxOworICB0Mj1GSVJTVF9HUFIrMjsKKyAgZjE9RklSU1RfRlBSOworICBmMj1GSVJTVF9GUFIrMTsKKyAgcmVnc2FbdDFdPXJlZ3NhW3QyXT0xOworICByZWdzYVtmMV09cmVnc2FbZjJdPTE7CisgIHJlZ3NhW3NwXT0xOworICByZWdzY3JhdGNoW3QxXT1yZWdzY3JhdGNoW3QyXT0wOworICByZWdzY3JhdGNoW2YxXT1yZWdzY3JhdGNoW2YyXT0wOworICByZWdzY3JhdGNoW3NwXT0wOworICAKKyAgZm9yKGk9RklSU1RfR1BSO2k8PUxBU1RfR1BSLVZPTF9HUFJTO2krKykKKyAgICByZWdzY3JhdGNoW2ldPTE7CisgIGZvcihpPUZJUlNUX0ZQUjtpPD1MQVNUX0ZQUi1WT0xfRlBSUztpKyspCisgICAgcmVnc2NyYXRjaFtpXT0xOworICBmb3IoaT1GSVJTVF9DQ1I7aTw9TEFTVF9DQ1ItVk9MX0NDUlM7aSsrKQorICAgIHJlZ3NjcmF0Y2hbaV09MTsKKyAgCisgIHRhcmdldF9tYWNyb3M9bWFycmF5OworICAKKyAgCisgIHJldHVybiAxOworfQorCit2b2lkIGluaXRfZGIoRklMRSAqZikKK3sKK30KKworaW50IGZyZXR1cm4oc3RydWN0IFR5cCAqdCkKKy8qICBSZXR1cm5zIHRoZSByZWdpc3RlciBpbiB3aGljaCB2YXJpYWJsZXMgb2YgdHlwZSB0IGFyZSByZXR1cm5lZC4gKi8KKy8qICBJZiB0aGUgdmFsdWUgY2Fubm90IGJlIHJldHVybmVkIGluIGEgcmVnaXN0ZXIgcmV0dXJucyAwLiAgICAgICAgKi8KKy8qICBBIHBvaW50ZXIgTVVTVCBiZSByZXR1cm5lZCBpbiBhIHJlZ2lzdGVyLiBUaGUgY29kZS1nZW5lcmF0b3IgICAgKi8KKy8qICBoYXMgdG8gc2ltdWxhdGUgYSBwc2V1ZG8gcmVnaXN0ZXIgaWYgbmVjZXNzYXJ5LiAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYoSVNGTE9BVCh0LT5mbGFncykpIAorICAgIHJldHVybiBGSVJTVF9GUFIrMjsKKyAgaWYoSVNTVFJVQ1QodC0+ZmxhZ3MpfHxJU1VOSU9OKHQtPmZsYWdzKSkgCisgICAgcmV0dXJuIDA7CisgIGlmKHptbGVxKHN6b2YodCksbDJ6bSg0TCkpKSAKKyAgICByZXR1cm4gRklSU1RfR1BSKzM7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworaW50IHJlZ19wYWlyKGludCByLHN0cnVjdCBycGFpciAqcCkKKy8qIFJldHVybnMgMCBpZiB0aGUgcmVnaXN0ZXIgaXMgbm8gcmVnaXN0ZXIgcGFpci4gSWYgciAgKi8KKy8qIGlzIGEgcmVnaXN0ZXIgcGFpciBub24temVybyB3aWxsIGJlIHJldHVybmVkIGFuZCB0aGUgKi8KKy8qIHN0cnVjdHVyZSBwb2ludGVkIHRvIHAgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgdHdvICAgKi8KKy8qIGVsZW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIGVzdGltYXRlIHRoZSBjb3N0LXNhdmluZyBpZiBvYmplY3QgbyBmcm9tIElDIHAgaXMgcGxhY2VkIGluCisgcmVnaXN0ZXIgciAqLworaW50IGNvc3Rfc2F2aW5ncyhzdHJ1Y3QgSUMgKnAsaW50IHIsc3RydWN0IG9iaiAqbykKK3sKKyAgaW50IGM9cC0+Y29kZTsKKyAgaWYoby0+ZmxhZ3MmVktPTlNUKXsKKyAgICBpZighTE9BRF9TVE9SRSkKKyAgICAgIHJldHVybiAwOworICAgIGlmKG89PSZwLT5xMSYmcC0+Y29kZT09QVNTSUdOJiYocC0+ei5mbGFncyZEUkVGT0JKKSkKKyAgICAgIHJldHVybiA0OworICAgIGVsc2UKKyAgICAgIHJldHVybiAyOworICB9CisgIGlmKG8tPmZsYWdzJkRSRUZPQkopCisgICAgcmV0dXJuIDQ7CisgIGlmKGM9PVNFVFJFVFVSTiYmcj09cC0+ei5yZWcmJiEoby0+ZmxhZ3MmRFJFRk9CSikpIHJldHVybiAzOworICBpZihjPT1HRVRSRVRVUk4mJnI9PXAtPnExLnJlZyYmIShvLT5mbGFncyZEUkVGT0JKKSkgcmV0dXJuIDM7CisgIHJldHVybiAyOworfQorCitpbnQgcmVnb2soaW50IHIsaW50IHQsaW50IG1vZGUpCisvKiAgUmV0dXJucyAwIGlmIHJlZ2lzdGVyIHIgY2Fubm90IHN0b3JlIHZhcmlhYmxlcyBvZiAgICovCisvKiAgdHlwZSB0LiBJZiB0PT1QT0lOVEVSIGFuZCBtb2RlIT0wIHRoZW4gaXQgcmV0dXJucyAgICovCisvKiAgbm9uLXplcm8gb25seSBpZiB0aGUgcmVnaXN0ZXIgY2FuIHN0b3JlIGEgcG9pbnRlciAgICovCisvKiAgYW5kIGRlcmVmZXJlbmNlIGEgcG9pbnRlciB0byBtb2RlLiAgICAgICAgICAgICAgICAgICovCit7CisgIGlmKHI9PTApCisgICAgcmV0dXJuIDA7CisgIHQmPU5ROworICBpZih0PT0wJiZyPj1GSVJTVF9DQ1ImJnI8PUxBU1RfQ0NSKQorICAgIHJldHVybiAxOworICBpZihJU0ZMT0FUKHQpJiZyPj1GSVJTVF9GUFImJnI8PUxBU1RfRlBSKQorICAgIHJldHVybiAxOworICBpZih0PT1QT0lOVEVSJiZyPj1GSVJTVF9HUFImJnI8PUxBU1RfR1BSKQorICAgIHJldHVybiAxOworICBpZih0Pj1DSEFSJiZ0PD1MT05HJiZyPj1GSVJTVF9HUFImJnI8PUxBU1RfR1BSKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworaW50IGRhbmdlcm91c19JQyhzdHJ1Y3QgSUMgKnApCisvKiAgUmV0dXJucyB6ZXJvIGlmIHRoZSBJQyBwIGNhbiBiZSBzYWZlbHkgZXhlY3V0ZWQgICAgICovCisvKiAgd2l0aG91dCBkYW5nZXIgb2YgZXhjZXB0aW9ucyBvciBzaW1pbGFyIHRoaW5ncy4gICAgICovCisvKiAgdmJjYyBtYXkgZ2VuZXJhdGUgY29kZSBpbiB3aGljaCBub24tZGFuZ2Vyb3VzIElDcyAgICovCisvKiAgYXJlIHNvbWV0aW1lcyBleGVjdXRlZCBhbHRob3VnaCBjb250cm9sLWZsb3cgbWF5ICAgICovCisvKiAgbmV2ZXIgcmVhY2ggdGhlbSAobWFpbmx5IHdoZW4gbW92aW5nIGNvbXB1dGF0aW9ucyAgICovCisvKiAgb3V0IG9mIGxvb3BzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVHlwaWNhbCBJQ3MgdGhhdCBnZW5lcmF0ZSBleGNlcHRpb25zIG9uIHNvbWUgICAgICAgICovCisvKiAgbWFjaGluZXMgYXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gYWNjZXNzZXMgdmlhIHBvaW50ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gZGl2aXNpb24vbW9kdWxvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gb3ZlcmZsb3cgb24gc2lnbmVkIGludGVnZXIvZmxvYXRzICAgICAgICAgICAgICovCit7CisgIGludCBjPXAtPmNvZGU7CisgIGlmKChwLT5xMS5mbGFncyZEUkVGT0JKKXx8KHAtPnEyLmZsYWdzJkRSRUZPQkopfHwocC0+ei5mbGFncyZEUkVGT0JKKSkKKyAgICByZXR1cm4gMTsKKyAgaWYoKGM9PURJVnx8Yz09TU9EKSYmIWlzY29uc3QocTIpKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworaW50IG11c3RfY29udmVydChpbnQgbyxpbnQgdCxpbnQgY29uc3RfZXhwcikKKy8qICBSZXR1cm5zIHplcm8gaWYgY29kZSBmb3IgY29udmVydGluZyBucCB0byB0eXBlIHQgICAgKi8KKy8qICBjYW4gYmUgb21pdHRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBPbiB0aGUgUG93ZXJQQyBjcHUgcG9pbnRlcnMgYW5kIDMyYml0ICAgICAgICAgICAgICAgKi8KKy8qICBpbnRlZ2VycyBoYXZlIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uIGFuZCBjYW4gdXNlICAgKi8KKy8qICB0aGUgc2FtZSByZWdpc3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IG9wPW8mTlEsdHA9dCZOUTsKKyAgaWYoKG9wPT1JTlR8fG9wPT1MT05HfHxvcD09UE9JTlRFUikmJih0cD09SU5UfHx0cD09TE9OR3x8dHA9PVBPSU5URVIpKQorICAgIHJldHVybiAwOworICBpZihvcD09RE9VQkxFJiZ0cD09TERPVUJMRSkgcmV0dXJuIDA7CisgIGlmKG9wPT1MRE9VQkxFJiZ0cD09RE9VQkxFKSByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgZ2VuX2RzKEZJTEUgKmYsem1heCBzaXplLHN0cnVjdCBUeXAgKnQpCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIDxzaXplPiBieXRlcyBvZiBzdG9yYWdlICovCisvKiAgaW5pdGlhbGl6ZWQgd2l0aCB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGlmKG5ld29iaiYmc2VjdGlvbiE9U1BFQ0lBTCkKKyAgICBlbWl0KGYsIiVsZFxuIix6bTJsKHNpemUpKTsKKyAgZWxzZQorICAgIGVtaXQoZiwiXHQuc3BhY2VcdCVsZFxuIix6bTJsKHNpemUpKTsKKyAgbmV3b2JqPTA7Cit9CisKK3ZvaWQgZ2VuX2FsaWduKEZJTEUgKmYsem1heCBhbGlnbikKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBtYWtlIHN1cmUgdGhlIG5leHQgZGF0YSBpcyAgICAgKi8KKy8qICBhbGlnbmVkIHRvIG11bHRpcGxlcyBvZiA8YWxpZ24+IGJ5dGVzLiAgICAgICAgICAgICAgKi8KK3sKKyAgaWYoem0ybChhbGlnbik+MSkgZW1pdChmLCJcdC5hbGlnblx0MlxuIik7Cit9CisKK3ZvaWQgZ2VuX3Zhcl9oZWFkKEZJTEUgKmYsc3RydWN0IFZhciAqdikKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjcmVhdGUgdGhlIGhlYWQgb2YgYSB2YXJpYWJsZSAgKi8KKy8qICBkZWZpbml0aW9uLCBpLmUuIHRoZSBsYWJlbCBhbmQgaW5mb3JtYXRpb24gZm9yICAgICAgKi8KKy8qICBsaW5rYWdlIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGNvbnN0ZmxhZztjaGFyICpzZWM7CisgIGlmKHYtPmNsaXN0KSBjb25zdGZsYWc9aXNfY29uc3Qodi0+dnR5cCk7CisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQyl7CisgICAgaWYoSVNGVU5DKHYtPnZ0eXAtPmZsYWdzKSkgcmV0dXJuOworICAgIGlmKCFzcGVjaWFsX3NlY3Rpb24oZix2KSl7CisgICAgICBpZih2LT5jbGlzdCYmKCFjb25zdGZsYWd8fChnX2ZsYWdzWzJdJlVTRURGTEFHKSkmJnNlY3Rpb24hPURBVEEpe2VtaXQoZixkYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1EQVRBO30KKyAgICAgIGlmKHYtPmNsaXN0JiZjb25zdGZsYWcmJiEoZ19mbGFnc1syXSZVU0VERkxBRykmJnNlY3Rpb24hPVJPREFUQSl7ZW1pdChmLHJvZGF0YW5hbWUpO2lmKGYpIHNlY3Rpb249Uk9EQVRBO30KKyAgICAgIGlmKCF2LT5jbGlzdCYmc2VjdGlvbiE9QlNTKXtlbWl0KGYsYnNzbmFtZSk7aWYoZikgc2VjdGlvbj1CU1M7fQorICAgIH0KKyAgICBpZih2LT5jbGlzdHx8c2VjdGlvbj09U1BFQ0lBTCl7CisgICAgICBnZW5fYWxpZ24oZixmYWxpZ24odi0+dnR5cCkpOworICAgICAgZW1pdChmLCIlcyVsZDpcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgfWVsc2UKKyAgICAgIGVtaXQoZiwiXHQubGNvbW1cdCVzJWxkLCIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgbmV3b2JqPTE7CisgIH0KKyAgaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKKyAgICBlbWl0KGYsIlx0Lmdsb2JsXHQlcyVzXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgIGlmKHYtPmZsYWdzJihERUZJTkVEfFRFTlRBVElWRSkpeworICAgICAgaWYoIXNwZWNpYWxfc2VjdGlvbihmLHYpKXsKKyAgICAgICAgaWYodi0+Y2xpc3QmJighY29uc3RmbGFnfHwoZ19mbGFnc1syXSZVU0VERkxBRykpJiZzZWN0aW9uIT1EQVRBKXtlbWl0KGYsZGF0YW5hbWUpO2lmKGYpIHNlY3Rpb249REFUQTt9CisgICAgICAgIGlmKHYtPmNsaXN0JiZjb25zdGZsYWcmJiEoZ19mbGFnc1syXSZVU0VERkxBRykmJnNlY3Rpb24hPVJPREFUQSl7ZW1pdChmLHJvZGF0YW5hbWUpO2lmKGYpIHNlY3Rpb249Uk9EQVRBO30KKyAgICAgICAgaWYoIXYtPmNsaXN0JiZzZWN0aW9uIT1CU1Mpe2VtaXQoZixic3NuYW1lKTtpZihmKSBzZWN0aW9uPUJTUzt9CisgICAgICB9CisgICAgICBpZih2LT5jbGlzdHx8c2VjdGlvbj09U1BFQ0lBTCl7CisgICAgICAgIGdlbl9hbGlnbihmLGZhbGlnbih2LT52dHlwKSk7CisgICAgICAgIGVtaXQoZiwiJXMlczpcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgICB9ZWxzZQorICAgICAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXMlc1xuXHQuJXNjb21tXHQlcyVzLCIsaWRwcmVmaXgsdi0+aWRlbnRpZmllciwoVVNFX0NPTU1PTlM/IiI6ImwiKSxpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICAgIG5ld29iaj0xOworICAgIH0KKyAgfQorfQorCit2b2lkIGdlbl9kYyhGSUxFICpmLGludCB0LHN0cnVjdCBjb25zdF9saXN0ICpwKQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSBzdGF0aWMgc3RvcmFnZSAgICAgICAgICAqLworLyogIGluaXRpYWxpemVkIHdpdGggY29uc3QtbGlzdCBwLiAgICAgICAgICAgICAgICAgICAgICAqLworeworICBlbWl0KGYsIlx0ZGMuJXNcdCIsZHQodCZOUSkpOworICBpZighcC0+dHJlZSl7CisgICAgaWYoSVNGTE9BVCh0KSl7CisgICAgICAvKiAgYXVjaCB3aWVkZXIgbmljaHQgc2VociBzY2hvZW4gdW5kIElFRUUgbm9ldGlnICAgKi8KKyAgICAgIHVuc2lnbmVkIGNoYXIgKmlwOworICAgICAgaXA9KHVuc2lnbmVkIGNoYXIgKikmcC0+dmFsLnZkb3VibGU7CisgICAgICBlbWl0KGYsIjB4JTAyeCUwMnglMDJ4JTAyeCIsaXBbMF0saXBbMV0saXBbMl0saXBbM10pOworICAgICAgaWYoKHQmTlEpIT1GTE9BVCl7CisgICAgICAgIGVtaXQoZiwiLDB4JTAyeCUwMnglMDJ4JTAyeCIsaXBbNF0saXBbNV0saXBbNl0saXBbN10pOworICAgICAgfQorICAgIH1lbHNleworICAgICAgZW1pdHZhbChmLCZwLT52YWwsdCZOVSk7CisgICAgfQorICB9ZWxzZXsKKyAgICBlbWl0X29iaihmLCZwLT50cmVlLT5vLHQmTlUpOworICB9CisgIGVtaXQoZiwiXG4iKTtuZXdvYmo9MDsKK30KKworCisvKiAgVGhlIG1haW4gY29kZS1nZW5lcmF0aW9uIHJvdXRpbmUuICAgICAgICAgICAgICAgICAgICovCisvKiAgZiBpcyB0aGUgc3RyZWFtIHRoZSBjb2RlIHNob3VsZCBiZSB3cml0dGVuIHRvLiAgICAgICovCisvKiAgcCBpcyBhIHBvaW50ZXIgdG8gYSBkb3VibHkgbGlua2VkIGxpc3Qgb2YgSUNzICAgICAgICovCisvKiAgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gYm9keSB0byBnZW5lcmF0ZSBjb2RlIGZvci4gICovCisvKiAgdiBpcyBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb2Zmc2V0IGlzIHRoZSBzaXplIG9mIHRoZSBzdGFja2ZyYW1lIHRoZSBmdW5jdGlvbiAgICovCisvKiAgbmVlZHMgZm9yIGxvY2FsIHZhcmlhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3ZvaWQgZ2VuX2NvZGUoRklMRSAqZixzdHJ1Y3QgSUMgKnAsc3RydWN0IFZhciAqdix6bWF4IG9mZnNldCkKKy8qICBUaGUgbWFpbiBjb2RlLWdlbmVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBjLHQsaTsKKyAgc3RydWN0IElDICptOworICBhcmdzaXplPTA7CisgIGlmKERFQlVHJjEpIHByaW50ZigiZ2VuX2NvZGUoKVxuIik7CisgIGZvcihjPTE7Yzw9TUFYUjtjKyspIHJlZ3NbY109cmVnc2FbY107CisgIG1heHB1c2hlZD0wOworICAKKyAgLypGSVhNRSovCisgIHJldD0iXHRydHNcbiI7CisgIAorICBmb3IobT1wO207bT1tLT5uZXh0KXsKKyAgICBjPW0tPmNvZGU7dD1tLT50eXBmJk5VOworICAgIGlmKGM9PUFMTE9DUkVHKSB7cmVnc1ttLT5xMS5yZWddPTE7Y29udGludWU7fQorICAgIGlmKGM9PUZSRUVSRUcpIHtyZWdzW20tPnExLnJlZ109MDtjb250aW51ZTt9CisgICAgCisgICAgLyogY29udmVydCBNVUxUL0RJVi9NT0Qgd2l0aCBwb3dlcnMgb2YgdHdvICovCisgICAgaWYoKHQmTlEpPD1MT05HJiYobS0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QmJih0Jk5RKTw9TE9ORyYmKGM9PU1VTFR8fCgoYz09RElWfHxjPT1NT0QpJiYodCZVTlNJR05FRCkpKSl7CisgICAgICBldmFsX2NvbnN0KCZtLT5xMi52YWwsdCk7CisgICAgICBpPXBvZjIodm1heCk7CisgICAgICBpZihpKXsKKyAgICAgICAgaWYoYz09TU9EKXsKKyAgICAgICAgICB2bWF4PXptc3ViKHZtYXgsbDJ6bSgxTCkpOworICAgICAgICAgIG0tPmNvZGU9QU5EOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICB2bWF4PWwyem0oaS0xKTsKKyAgICAgICAgICBpZihjPT1ESVYpIG0tPmNvZGU9UlNISUZUOyBlbHNlIG0tPmNvZGU9TFNISUZUOworICAgICAgICB9CisgICAgICAgIGM9bS0+Y29kZTsKKyAgICAgICAgZ3ZhbC52bWF4PXZtYXg7CisgICAgICAgIGV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKKyAgICAgICAgaWYoYz09QU5EKXsKKyAgICAgICAgICBpbnNlcnRfY29uc3QoJm0tPnEyLnZhbCx0KTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgaW5zZXJ0X2NvbnN0KCZtLT5xMi52YWwsSU5UKTsKKyAgICAgICAgICBwLT50eXBmMj1JTlQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisjaWYgRklYRURfU1AKKyAgICBpZihjPT1DQUxMJiZhcmdzaXplPHptMmwobS0+cTIudmFsLnZtYXgpKSBhcmdzaXplPXptMmwobS0+cTIudmFsLnZtYXgpOworI2VuZGlmCisgIH0KKyAgCisgIGZvcihjPTE7Yzw9TUFYUjtjKyspeworICAgIGlmKHJlZ3NhW2NdfHxyZWd1c2VkW2NdKXsKKyAgICAgIEJTRVQocmVnc19tb2RpZmllZCxjKTsKKyAgICB9CisgIH0KKyAgCisgIGxvY2Fsc2l6ZT0oem0ybChvZmZzZXQpKzMpLzQqNDsKKyNpZiBGSVhFRF9TUAorICAvKkZJWE1FOiBhZGp1c3QgbG9jYWxzaXplIHRvIGdldCBhbiBhbGlnbmVkIHN0YWNrLWZyYW1lICovCisjZW5kaWYKKyAgCisgIGZ1bmN0aW9uX3RvcChmLHYsbG9jYWxzaXplKTsKKworI2lmIEZJWEVEX1NQCisgIHB1c2hlZD0wOworI2VuZGlmCisgIAorICBmb3IoO3A7cD1wLT5uZXh0KXsKKyAgICBjPXAtPmNvZGU7dD1wLT50eXBmOworICAgIGlmKGM9PU5PUCkge3AtPnouZmxhZ3M9MDtjb250aW51ZTt9CisgICAgaWYoYz09QUxMT0NSRUcpIHtyZWdzW3AtPnExLnJlZ109MTtjb250aW51ZTt9CisgICAgaWYoYz09RlJFRVJFRykge3JlZ3NbcC0+cTEucmVnXT0wO2NvbnRpbnVlO30KKyAgICBpZihjPT1MQUJFTCkge2VtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LHQpO2NvbnRpbnVlO30KKyAgICBpZihjPT1CUkEpeworICAgICAgaWYodD09ZXhpdF9sYWJlbCkKKyAgICAgICAgZW1pdChmLHJldCk7CisgICAgICBlbHNlCisgICAgICAgIGVtaXQoZiwiXHRiXHQlcyVkXG4iLGxhYnByZWZpeCx0KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPj1CRVEmJmM8QlJBKXsKKyAgICAgIGVtaXQoZiwiXHRiJXNcdCIsY2NzW2MtQkVRXSk7CisgICAgICBpZihpc3JlZyhxMSkpeworICAgICAgICBlbWl0X29iaihmLCZwLT5xMSwwKTsKKyAgICAgICAgZW1pdChmLCIsIik7CisgICAgICB9CisgICAgICBlbWl0KGYsIiVzJWRcbiIsbGFicHJlZml4LHQpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PU1PVkVUT1JFRyl7CisgICAgICBsb2FkX3JlZyhmLHAtPnoucmVnLCZwLT5xMSxyZWd0eXBlW3AtPnoucmVnXS0+ZmxhZ3MpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PU1PVkVGUk9NUkVHKXsKKyAgICAgIHN0b3JlX3JlZyhmLHAtPnoucmVnLCZwLT5xMSxyZWd0eXBlW3AtPnoucmVnXS0+ZmxhZ3MpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKChjPT1BU1NJR058fGM9PVBVU0gpJiYoKHQmTlEpPlBPSU5URVJ8fCgodCZOUSk9PUNIQVImJnptMmwocC0+cTIudmFsLnZtYXgpIT0xKSkpeworICAgICAgaWVycm9yKDApOworICAgIH0KKyAgICBwPXByZWxvYWQoZixwKTsKKyAgICBjPXAtPmNvZGU7CisgICAgaWYoYz09U1VCUEZQKSBjPVNVQjsKKyAgICBpZihjPT1BRERJMlApIGM9QUREOworICAgIGlmKGM9PVNVQklGUCkgYz1TVUI7CisgICAgaWYoYz09Q09OVkVSVCl7CisgICAgICBpZihJU0ZMT0FUKHExdHlwKHApKXx8SVNGTE9BVCh6dHlwKHApKSkgaWVycm9yKDApOworICAgICAgaWYoc2l6ZXRhYltxMXR5cChwKSZOUV08c2l6ZXRhYlt6dHlwKHApJk5RXSl7CisgICAgICAgIGlmKHExdHlwKHApJlVOU0lHTkVEKQorICAgICAgICAgIGVtaXQoZiwiXHR6ZXh0LiVzXHQlc1xuIixkdChxMXR5cChwKSkscmVnbmFtZXNbenJlZ10pOworICAgICAgICBlbHNlCisgICAgICAgICAgZW1pdChmLCJcdHNleHQuJXNcdCVzXG4iLGR0KHExdHlwKHApKSxyZWduYW1lc1t6cmVnXSk7CisgICAgICB9CisgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PUtPTVBMRU1FTlQpeworICAgICAgbG9hZF9yZWcoZix6cmVnLCZwLT5xMSx0KTsKKyAgICAgIGVtaXQoZiwiXHRjcGwuJXNcdCVzXG4iLGR0KHQpLHJlZ25hbWVzW3pyZWddKTsKKyAgICAgIHNhdmVfcmVzdWx0KGYscCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09U0VUUkVUVVJOKXsKKyAgICAgIGxvYWRfcmVnKGYscC0+ei5yZWcsJnAtPnExLHQpOworICAgICAgQlNFVChyZWdzX21vZGlmaWVkLHAtPnoucmVnKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1HRVRSRVRVUk4peworICAgICAgaWYocC0+cTEucmVnKXsKKyAgICAgICAgenJlZz1wLT5xMS5yZWc7CisgICAgICAgIHNhdmVfcmVzdWx0KGYscCk7CisgICAgICB9ZWxzZQorICAgICAgICBwLT56LmZsYWdzPTA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09Q0FMTCl7CisgICAgICBpbnQgcmVnOworICAgICAgLypGSVhNRSovCisjaWYgMCAgICAgIAorICAgICAgaWYoc3RhY2tfdmFsaWQmJihwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiZwLT5xMS52LT5maSYmKHAtPnExLnYtPmZpLT5mbGFncyZBTExfU1RBQ0spKXsKKyAgICAgICAgaWYoZnJhbWVzaXplK3p1bTJ1bChwLT5xMS52LT5maS0+c3RhY2sxKT5zdGFjaykKKyAgICAgICAgICBzdGFjaz1mcmFtZXNpemUrenVtMnVsKHAtPnExLnYtPmZpLT5zdGFjazEpOworICAgICAgfWVsc2UKKyAgICAgICAgc3RhY2tfdmFsaWQ9MDsKKyNlbmRpZgorICAgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJnAtPnExLnYtPmZpJiZwLT5xMS52LT5maS0+aW5saW5lX2FzbSl7CisgICAgICAgIGVtaXRfaW5saW5lX2FzbShmLHAtPnExLnYtPmZpLT5pbmxpbmVfYXNtKTsKKyAgICAgIH1lbHNleworICAgICAgICBlbWl0KGYsIlx0Y2FsbFx0Iik7CisgICAgICAgIGVtaXRfb2JqKGYsJnAtPnExLHQpOworICAgICAgICBlbWl0KGYsIlxuIik7CisgICAgICB9CisgICAgICAvKkZJWE1FKi8KKyNpZiBGSVhFRF9TUAorICAgICAgcHVzaGVkLT16bTJsKHAtPnEyLnZhbC52bWF4KTsKKyNlbmRpZgorICAgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJnAtPnExLnYtPmZpJiYocC0+cTEudi0+ZmktPmZsYWdzJkFMTF9SRUdTKSl7CisgICAgICAgIGJ2dW5pdGUocmVnc19tb2RpZmllZCxwLT5xMS52LT5maS0+cmVnc19tb2RpZmllZCxSU0laRSk7CisgICAgICB9ZWxzZXsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvcihpPTE7aTw9TUFYUjtpKyspeworICAgICAgICAgIGlmKHJlZ3NjcmF0Y2hbaV0pIEJTRVQocmVnc19tb2RpZmllZCxpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PUFTU0lHTnx8Yz09UFVTSCl7CisgICAgICBpZih0PT0wKSBpZXJyb3IoMCk7CisgICAgICBpZihjPT1QVVNIKXsKKyNpZiBGSVhFRF9TUAorICAgICAgICBlbWl0KGYsIlx0bW92LiVzXHQlbGQoJXMpLCIsZHQodCkscHVzaGVkLHJlZ25hbWVzW3NwXSk7CisgICAgICAgIGVtaXRfb2JqKGYsJnAtPnExLHQpOworICAgICAgICBlbWl0KGYsIlxuIik7CisgICAgICAgIHB1c2hlZCs9em0ybChwLT5xMi52YWwudm1heCk7CisjZWxzZQorICAgICAgICBlbWl0KGYsIlx0cHVzaC4lc1x0IixkdCh0KSk7CisgICAgICAgIGVtaXRfb2JqKGYsJnAtPnExLHQpOworICAgICAgICBlbWl0KGYsIlxuIik7CisgICAgICAgIC8qcHVzaGVkICs9IHptMmwocC0+cTIudmFsLnZtYXgpOyovCisjZW5kaWYKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZihjPT1BU1NJR04peworICAgICAgICBsb2FkX3JlZyhmLHpyZWcsJnAtPnExLHQpOworICAgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PUFERFJFU1MpeworICAgICAgbG9hZF9hZGRyZXNzKGYsenJlZywmcC0+cTEsUE9JTlRFUik7CisgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PU1JTlVTKXsKKyAgICAgIGxvYWRfcmVnKGYsenJlZywmcC0+cTEsdCk7CisgICAgICBlbWl0KGYsIlx0bmVnLiVzXHQlc1xuIixkdCh0KSxyZWduYW1lc1t6cmVnXSk7CisgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PVRFU1QpeworICAgICAgZW1pdChmLCJcdHRzdC4lc1x0IixkdCh0KSk7CisgICAgICBpZihtdWx0aXBsZV9jY3MpCisgICAgICAgIGVtaXQoZiwiJXMsIixyZWduYW1lc1t6cmVnXSk7CisgICAgICBlbWl0X29iaihmLCZwLT5xMSx0KTsKKyAgICAgIGVtaXQoZiwiXG4iKTsKKyAgICAgIGlmKG11bHRpcGxlX2NjcykKKyAgICAgICAgc2F2ZV9yZXN1bHQoZixwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1DT01QQVJFKXsKKyAgICAgIGVtaXQoZiwiXHRjbXAuJXNcdCIsZHQodCkpOworICAgICAgaWYobXVsdGlwbGVfY2NzKQorICAgICAgICBlbWl0KGYsIiVzLCIscmVnbmFtZXNbenJlZ10pOworICAgICAgZW1pdF9vYmooZiwmcC0+cTEsdCk7CisgICAgICBlbWl0KGYsIiwiKTsKKyAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHQpOworICAgICAgZW1pdChmLCJcbiIpOworICAgICAgaWYobXVsdGlwbGVfY2NzKQorICAgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKChjPj1PUiYmYzw9QU5EKXx8KGM+PUxTSElGVCYmYzw9TU9EKSl7CisgICAgICBpZighVEhSRUVfQUREUikKKyAgICAgICAgbG9hZF9yZWcoZix6cmVnLCZwLT5xMSx0KTsKKyAgICAgIGlmKGM+PU9SJiZjPD1BTkQpCisgICAgICAgIGVtaXQoZiwiXHQlcy4lc1x0JXMsIixsb2dpY2Fsc1tjLU9SXSxkdCh0KSxyZWduYW1lc1t6cmVnXSk7CisgICAgICBlbHNlCisgICAgICAgIGVtaXQoZiwiXHQlcy4lc1x0JXMsIixhcml0aG1ldGljc1tjLUxTSElGVF0sZHQodCkscmVnbmFtZXNbenJlZ10pOworICAgICAgaWYoVEhSRUVfQUREUil7CisgICAgICAgIGVtaXRfb2JqKGYsJnAtPnExLHQpOworICAgICAgICBlbWl0KGYsIiwiKTsKKyAgICAgIH0KKyAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHQpOworICAgICAgZW1pdChmLCJcbiIpOworICAgICAgc2F2ZV9yZXN1bHQoZixwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBwcmljMihzdGRvdXQscCk7CisgICAgaWVycm9yKDApOworICB9CisgIGZ1bmN0aW9uX2JvdHRvbShmLHYsbG9jYWxzaXplKTsKKyAgaWYoc3RhY2tfdmFsaWQpeworICAgIGlmKCF2LT5maSkgdi0+Zmk9bmV3X2ZpKCk7CisgICAgdi0+ZmktPmZsYWdzfD1BTExfU1RBQ0s7CisgICAgdi0+ZmktPnN0YWNrMT1zdGFjazsKKyAgfQorICBlbWl0KGYsIiMgc3RhY2tzaXplPSVsdSVzXG4iLHp1bTJ1bChzdGFjayksc3RhY2tfdmFsaWQ/IiI6Iis/PyIpOworfQorCitpbnQgc2hvcnRjdXQoaW50IGMsIGludCB0eXApCit7CisgIGlmKGM9PUNPTVBBUkV8fGM9PUFERHx8Yz09U1VCfHxjPT1BTkR8fGM9PU9SfHxjPT1YT1IpIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworaW50IHJlZ19wYXJtKHN0cnVjdCByZWdfaGFuZGxlICptLCBzdHJ1Y3QgVHlwICp0LGludCB2YXJhcmcsc3RydWN0IFR5cCAqZCkKK3sKKyAgaW50IGY7CisgIGY9dC0+ZmxhZ3MmTlE7CisgIGlmKGY8PUxPTkd8fGY9PVBPSU5URVIpeworICAgIGlmKG0tPmdyZWdzPj1HUFJfQVJHUykKKyAgICAgIHJldHVybiAwOworICAgIGVsc2UKKyAgICAgIHJldHVybiBGSVJTVF9HUFIrMyttLT5ncmVncysrOworICB9CisgIGlmKElTRkxPQVQoZikpeworICAgIGlmKG0tPmZyZWdzPj1GUFJfQVJHUykKKyAgICAgIHJldHVybiAwOworICAgIGVsc2UKKyAgICAgIHJldHVybiBGSVJTVF9GUFIrMittLT5mcmVncysrOworICB9CisgIHJldHVybiAwOworfQorCitpbnQgaGFuZGxlX3ByYWdtYShjb25zdCBjaGFyICpzKQoreworfQordm9pZCBjbGVhbnVwX2NnKEZJTEUgKmYpCit7Cit9Cit2b2lkIGNsZWFudXBfZGIoRklMRSAqZikKK3sKKyAgaWYoZikgc2VjdGlvbj0tMTsKK30KKwpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvbWlueC9tYWNoaW5lLmR0IGIvbWFjaGluZXMvbWlueC9tYWNoaW5lLmR0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjczNmZkZWMKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9taW54L21hY2hpbmUuZHQKQEAgLTAsMCArMSwxNCBAQAorUzhCUworUzhCVQorUzhCUworUzhCVQorUzE2QlNMRQorUzE2QlVMRQorUzMyQlNMRQorUzMyQlVMRQorUzMyQlNMRQorUzMyQlVMRQorUzMyQklFRUVMRQorUzY0QklFRUVMRQorUzY0QklFRUVMRQorUzMyQlVMRQpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvbWlueC9tYWNoaW5lLmggYi9tYWNoaW5lcy9taW54L21hY2hpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNTYyNmZhCi0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvbWlueC9tYWNoaW5lLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qICBFeGFtcGxlIGJhY2tlbmQgZm9yIHZiY2MsIGl0IG1vZGVscyBhIGdlbmVyaWMgMzJiaXQgUklTQyBvciBDSVNDCisgICAgQ1BVLgorCisgICAgQ29uZmlndXJhYmxlIGF0IGJ1aWxkLXRpbWUgYXJlOgorICAgIC0gbnVtYmVyIG9mICgzMmJpdCkgZ2VuZXJhbC1wdXJwb3NlLXJlZ2lzdGVycworICAgIC0gbnVtYmVyIG9mICg2NGJpdCkgZmxvYXRpbmctcG9pbnQtcmVnaXN0ZXJzCisgICAgLSBudW1iZXIgb2YgKDhiaXQpIGNvbmRpdGlvbi1jb2RlLXJlZ2lzdGVycworICAgIC0gbWVjaGFuaXNtIGZvciBzdGFjay1hcmd1bWVudHMgKG1vdmluZyBvdCBmaXhlZCBzcCkKKworICAgIEl0IGFsbG93cyB0byBzZWxlY3QgYXMgcnVuLXRpbWUtb3B0aW9uczoKKyAgICAtIHR3by0gb3IgdGhyZWUtYWRkcmVzcyBjb2RlCisgICAgLSBtZW1vcnkgb3BlcmFuZHMgb3IgbG9hZC1zdG9yZS1hcmNoaXRlY3R1cmUKKyAgICAtIG51bWJlciBvZiByZWdpc3Rlci1hcmd1bWVudHMKKyAgICAtIG51bWJlciBvZiBjYWxsZXItc2F2ZS1yZWdpc3RlcnMKKyovCisKKy8qIGJ1aWwtdGltZSBjb25maWd1cmFibGUgb3B0aW9uczogKi8KKyNkZWZpbmUgTlVNX0dQUlMgNAorI2RlZmluZSBOVU1fRlBSUyAxCisjZGVmaW5lIE5VTV9DQ1JTIDEKKyNkZWZpbmUgRklYRURfU1AgMQorCisjaW5jbHVkZSAiZHQuaCIKKworLyogaW50ZXJuYWxseSB1c2VkIGJ5IHRoZSBiYWNrZW5kICovCisjZGVmaW5lIEZJUlNUX0dQUiAxCisjZGVmaW5lIExBU1RfR1BSIChGSVJTVF9HUFIrTlVNX0dQUlMtMSkKKyNkZWZpbmUgRklSU1RfRlBSIChMQVNUX0dQUisxKQorI2RlZmluZSBMQVNUX0ZQUiAoRklSU1RfRlBSK05VTV9GUFJTLTEpCisjZGVmaW5lIEZJUlNUX0NDUiAoTEFTVF9GUFIrMSkKKyNkZWZpbmUgTEFTVF9DQ1IgKEZJUlNUX0NDUitOVU1fQ0NSUy0xKQorCisvKiAgVGhpcyBzdHJ1Y3QgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IG1hY2hpbmUtc3BlY2lmaWMgICAgICAgICAgICovCisvKiAgYWRkcmVzc2luZy1tb2Rlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ3VycmVudGx5IHBvc3NpYmxlIGFyZSAoY29uc3QsZ3ByKSBhbmQgKGdwcixncHIpICAgICAgICAgICAgICAgICovCitzdHJ1Y3QgQWRkcmVzc2luZ01vZGV7CisgICAgaW50IGZsYWdzOworICAgIGludCBiYXNlOworICAgIGxvbmcgb2Zmc2V0OworfTsKKworLyogIFRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIG9mIHRoZSB0YXJnZXQgbWFjaGluZS4gICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQVhSIE5VTV9HUFJTK05VTV9GUFJTK05VTV9DQ1JTCisKKy8qICBOdW1iZXIgb2YgY29tbWFuZGxpbmUtb3B0aW9ucyB0aGUgY29kZS1nZW5lcmF0b3IgYWNjZXB0cy4gICAgICAgKi8KKyNkZWZpbmUgTUFYR0YgMjAKKworLyogIElmIHRoaXMgaXMgc2V0IHRvIHplcm8gdmJjYyB3aWxsIG5vdCBnZW5lcmF0ZSBJQ3Mgd2hlcmUgdGhlICAgICAqLworLyogIHRhcmdldCBvcGVyYW5kIGlzIHRoZSBzYW1lIGFzIHRoZSAybmQgc291cmNlIG9wZXJhbmQuICAgICAgICAgICAqLworLyogIFRoaXMgY2FuIHNvbWV0aW1lcyBzaW1wbGlmeSB0aGUgY29kZS1nZW5lcmF0b3IsIGJ1dCB1c3VhbGx5ICAgICAqLworLyogIHRoZSBjb2RlIGlzIGJldHRlciBpZiB0aGUgY29kZS1nZW5lcmF0b3IgYWxsb3dzIGl0LiAgICAgICAgICAgICAqLworI2RlZmluZSBVU0VRMkFTWiAxCisKKy8qICBUaGlzIHNwZWNpZmllcyB0aGUgc21hbGxlc3QgaW50ZWdlciB0eXBlIHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgKi8KKy8qICBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlOQURESTJQIElOVAorCisvKiAgSWYgdGhlIGJ5dGVzIG9mIGFuIGludGVnZXIgYXJlIG9yZGVyZWQgbW9zdCBzaWduaWZpY2FudCBieXRlICAgICovCisvKiAgYnl0ZSBmaXJzdCBhbmQgdGhlbiBkZWNyZWFzaW5nIHNldCBCSUdFTkRJQU4gdG8gMS4gICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR0VORElBTiAwCisKKy8qICBJZiB0aGUgYnl0ZXMgb2YgYW4gaW50ZWdlciBhcmUgb3JkZXJlZCBsZXN0IHNpZ25pZmljYW50IGJ5dGUgICAgKi8KKy8qICBieXRlIGZpcnN0IGFuZCB0aGVuIGluY3JlYXNpbmcgc2V0IExJVFRMRUVORElBTiB0byAxLiAgICAgICAgICAgKi8KKyNkZWZpbmUgTElUVExFRU5ESUFOIDEKKworLyogIE5vdGUgdGhhdCBCSUdFTkRJQU4gYW5kIExJVFRMRUVORElBTiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAgICAqLworCisvKiAgSWYgc3dpdGNoLXN0YXRlbWVudHMgc2hvdWxkIGJlIGdlbmVyYXRlZCBhcyBhIHNlcXVlbmNlIG9mICAgICAgICovCisvKiAgU1VCLFRTVCxCRVEgSUNzIHJhdGhlciB0aGFuIENPTVBBUkUsQkVRIElDcyBzZXQgdGhpcyB0byAxLiAgICAgICovCisvKiAgVGhpcyBjYW4geWllbGQgYmV0dGVyIGNvZGUgb24gc29tZSBtYWNoaW5lcy4gICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNXSVRDSFNVQlMgMAorCisvKiAgSW4gb3B0aW1pemluZyBjb21waWxhdGlvbiBjZXJ0YWluIGxpYnJhcnkgbWVtY3B5L3N0cmNweS1jYWxscyAgICovCisvKiAgd2l0aCBsZW5ndGgga25vd24gYXQgY29tcGlsZS10aW1lIHdpbGwgYmUgaW5saW5lZCB1c2luZyBhbiAgICAgICovCisvKiAgQVNTSUdOLUlDIGlmIHRoZSBzaXplIGlzIGxlc3Mgb3IgZXF1YWwgdG8gSU5MSU5FTUVNQ1BZLiAgICAgICAgICovCisvKiAgVGhlIHR5cGUgdXNlZCBmb3IgdGhlIEFTU0lHTi1JQyB3aWxsIGJlIFVOU0lHTkVEfENIQVIuICAgICAgICAgICovCisjZGVmaW5lIElOTElORU1FTUNQWSAxMDI0CisKKy8qICBQYXJhbWV0ZXJzIGFyZSBzb21ldGltZXMgcGFzc2VkIGluIHJlZ2lzdGVycyB3aXRob3V0IF9fcmVnLiAgICAgKi8KKyNkZWZpbmUgSEFWRV9SRUdQQVJNUyAxCisKKy8qICBQYXJhbWV0ZXJzIG9uIHRoZSBzdGFjayBzaG91bGQgYmUgcHVzaGVkIGluIG9yZGVyIHJhdGhlciB0aGFuICAgKi8KKy8qICBpbiByZXZlcnNlIG9yZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT1JERVJFRF9QVVNIIEZJWEVEX1NQCisKKy8qICBTdHJ1Y3R1cmUgZm9yIHJlZ19wYXJtKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0cnVjdCByZWdfaGFuZGxleworICAgIHVuc2lnbmVkIGxvbmcgZ3JlZ3M7CisgICAgdW5zaWduZWQgbG9uZyBmcmVnczsKK307CisKKy8qICBXZSBoYXZlIHNvbWUgdGFyZ2V0LXNwZWNpZmljIHZhcmlhYmxlIGF0dHJpYnV0ZXMuICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9UQVJHRVRfQVRUUklCVVRFUworCisvKiBXZSBoYXZlIHRhcmdldC1zcGVjaWZpYyBwcmFnbWFzICovCisjZGVmaW5lIEhBVkVfVEFSR0VUX1BSQUdNQVMKKworLyogIFdlIGtlZXAgdHJhY2sgb2YgYWxsIHJlZ2lzdGVycyBtb2RpZmllZCBieSBhIGZ1bmN0aW9uLiAgICAgICAgICAqLworI2RlZmluZSBIQVZFX1JFR1NfTU9ESUZJRUQgMQorCisvKiBXZSBoYXZlIGEgaW1wbGVtZW50IG91ciBvd24gY29zdC1mdW5jdGlvbnMgdG8gYWRhcHQgCisgICByZWdpc3Rlci1hbGxvY2F0aW9uICovCisjZGVmaW5lIEhBVkVfVEFSR0VUX1JBTExPQyAxCisjZGVmaW5lIGNvc3RfbW92ZV9yZWcoeCx5KSAxCisjZGVmaW5lIGNvc3RfbG9hZF9yZWcoeCx5KSAyCisjZGVmaW5lIGNvc3Rfc2F2ZV9yZWcoeCx5KSAyCisjZGVmaW5lIGNvc3RfcHVzaHBvcF9yZWcoeCkgMworCisvKiBzaXplIG9mIGJ1ZmZlciBmb3IgYXNtLW91dHB1dCwgdGhpcyBjYW4gYmUgdXNlZCB0byBkbworICAgcGVlcGhvbGUtb3B0aW1pemF0aW9ucyBvZiB0aGUgZ2VuZXJhdGVkIGFzc2VtYmx5LW91dHB1dCAqLworI2RlZmluZSBFTUlUX0JVRl9MRU4gMTAyNCAvKiBzaG91bGQgYmUgZW5vdWdoICovCisvKiBudW1iZXIgb2YgYXNtLW91dHB1dCBsaW5lcyBidWZmZXJlZCAqLworI2RlZmluZSBFTUlUX0JVRl9ERVBUSCA0CisKKy8qICBXZSBoYXZlIG5vIGFzbV9wZWVwaG9sZSB0byBvcHRpbWl6ZSBhc3NlbWJseS1vdXRwdXQgKi8KKyNkZWZpbmUgSEFWRV9UQVJHRVRfUEVFUEhPTEUgMAorCisvKiB3ZSBkbyBub3QgaGF2ZSBhIG1hcmtfZWZmX2ljcyBmdW5jdGlvbiwgdGhpcyBpcyB1c2VkIHRvIHByZXZlbnQKKyAgIG9wdGltaXphdGlvbnMgb24gY29kZSB3aGljaCBjYW4gYWxyZWFkeSBiZSBpbXBsZW1lbnRlZCBieSBlZmZpY2llbnQKKyAgIGFzc2VtYmx5ICovCisjdW5kZWYgSEFWRV9UQVJHRVRfRUZGX0lDCisKKy8qIHdlIG9ubHkgbmVlZCB0aGUgc3RhbmRhcmQgZGF0YSB0eXBlcyAobm8gYml0LXR5cGVzLCBkaWZmZXJlbnQgcG9pbnRlcnMKKyAgIGV0Yy4pICovCisjdW5kZWYgSEFWRV9FWFRfVFlQRVMKKyN1bmRlZiBIQVZFX1RHVF9QUklOVFZBTAorCisvKiB3ZSBkbyBub3QgbmVlZCBleHRyYSBlbGVtZW50cyBpbiB0aGUgSUMgKi8KKyN1bmRlZiBIQVZFX0VYVF9JQworCisvKiB3ZSBkbyBub3QgdXNlIHVuc2lnbmVkIGludCBhcyBzaXplX3QgKGJ1dCB1bnNpZ25lZCBsb25nLCB0aGUgZGVmYXVsdCkgKi8KKyN1bmRlZiBIQVZFX0lOVF9TSVpFVAorCisvKiB3ZSBkbyBub3QgbmVlZCByZWdpc3Rlci1wYWlycyAqLworI3VuZGVmIEhBVkVfUkVHUEFJUlMKKwpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvcG0vZW1pdC5oIGIvbWFjaGluZXMvcG0vZW1pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFhMTFiMmUKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9wbS9lbWl0LmgKQEAgLTAsMCArMSw3IEBACisKKy8qIGF1dG9tYXRpY2FseSBnZW5lcmF0ZWQgYnkgcHJvY2Vzc19hbGwuaDsgZG8gbm90IGVkaXQgaXQgKi8KKworI2luY2x1ZGUgImVtaXRfbXVsdC5oIgorI2luY2x1ZGUgImVtaXRfZGl2X21vZC5oIgorI2luY2x1ZGUgImVtaXRfc3RhcnQuaCIKKyNpbmNsdWRlICJlbWl0X2VuZC5oIgpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvcG0vZW1pdF9kaXZfbW9kLmggYi9tYWNoaW5lcy9wbS9lbWl0X2Rpdl9tb2QuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOWM2MTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvcG0vZW1pdF9kaXZfbW9kLmgKQEAgLTAsMCArMSw2OSBAQAorCisvKiBhdXRvbWF0aWNhbHkgZ2VuZXJhdGVkIGZyb20gdGhlIGZpbGUgZGl2X21vZC5hc20gZG8gbm90IG1vZGlmeSAqLworCitzdGF0aWMgdm9pZCBlbWl0X2Rpdl9tb2QoRklMRSAqZikKK3sKKwllbWl0KGYsInZiY2NfX19kaXZfbW9kMTZ4MTZfMTY6XG4iKTsKKwllbWl0KGYsIlx0cHVzaFx0eFxuIik7CisJZW1pdChmLCJcdHB1c2hcdHlcbiIpOworCWVtaXQoZiwiXHRtb3ZcdHgsIDBcbiIpOworCWVtaXQoZiwiXHRjbXBcdGJhLCAwXG4iKTsKKwllbWl0KGYsIlx0am5zXHR2YmNjX19fZG1fYmFub3RuZWdcbiIpOworCWVtaXQoZiwiXHRub3RcdGFcbiIpOworCWVtaXQoZiwiXHRub3RcdGJcbiIpOworCWVtaXQoZiwiXHRpbmNcdGJhXG4iKTsKKwllbWl0KGYsIlx0YWRkXHR4LCAweDAwMTFcbiIpOworCWVtaXQoZiwidmJjY19fX2RtX2Jhbm90bmVnOlxuIik7CisJZW1pdChmLCJcdHhjaGdcdGJhLCBobFxuIik7CisJZW1pdChmLCJcdGNtcFx0YmEsIDBcbiIpOworCWVtaXQoZiwiXHRqbnNcdHZiY2NfX19kbV9obG5vdG5lZ1xuIik7CisJZW1pdChmLCJcdG5vdFx0YVxuIik7CisJZW1pdChmLCJcdG5vdFx0YlxuIik7CisJZW1pdChmLCJcdGluY1x0YmFcbiIpOworCWVtaXQoZiwiXHRpbmNcdHhcbiIpOworCWVtaXQoZiwidmJjY19fX2RtX2hsbm90bmVnOlxuIik7CisJZW1pdChmLCJcdHhjaGdcdGJhLCBobFxuIik7CisJZW1pdChmLCJcdHB1c2hcdHhcbiIpOworCWVtaXQoZiwiXHRtb3ZcdHgsIDBcbiIpOworCWVtaXQoZiwiXHRtb3ZcdHksIDFcbiIpOworCWVtaXQoZiwidmJjY19fX2RtX3NoaWZ0bG9vcDpcbiIpOworCWVtaXQoZiwiXHRzaGxcdGFcbiIpOworCWVtaXQoZiwiXHRyb2xjXHRiXG4iKTsKKwllbWl0KGYsIlx0eGNoZ1x0YmEsIHhcbiIpOworCWVtaXQoZiwiXHRyb2xjXHRhXG4iKTsKKwllbWl0KGYsIlx0cm9sY1x0YlxuIik7CisJZW1pdChmLCJcdHhjaGdcdGJhLCB4XG4iKTsKKwllbWl0KGYsIlx0c3ViXHR4LCBobFxuIik7CisJZW1pdChmLCJcdGpuc1x0dmJjY19fX2RtX3Jlc25vdG5lZ1xuIik7CisJZW1pdChmLCJcdGFkZFx0eCwgaGxcbiIpOworCWVtaXQoZiwidmJjY19fX2RtX3Jlc25vdG5lZzpcbiIpOworCWVtaXQoZiwiXHR4Y2hnXHRiYSwgeVxuIik7CisJZW1pdChmLCJcdHJvbGNcdGFcbiIpOworCWVtaXQoZiwiXHRyb2xjXHRiXG4iKTsKKwllbWl0KGYsIlx0eGNoZ1x0YmEsIHlcbiIpOworCWVtaXQoZiwiXHRqY1x0dmJjY19fX2RtX2RvbmVcbiIpOworCWVtaXQoZiwiXHRqbXBcdHZiY2NfX19kbV9zaGlmdGxvb3BcbiIpOworCWVtaXQoZiwidmJjY19fX2RtX2RvbmU6XG4iKTsKKwllbWl0KGYsIlx0cG9wXHRiYVxuIik7CisJZW1pdChmLCJcdHRzdFx0YSwgMHgxMFxuIik7CisJZW1pdChmLCJcdHhjaGdcdGJhLCB4XG4iKTsKKwllbWl0KGYsIlx0anpcdHZiY2NfX19kbV9tb2Rub3RuZWdcbiIpOworCWVtaXQoZiwiXHRub3RcdGFcbiIpOworCWVtaXQoZiwiXHRub3RcdGJcbiIpOworCWVtaXQoZiwiXHRpbmNcdGJhXG4iKTsKKwllbWl0KGYsInZiY2NfX19kbV9tb2Rub3RuZWc6XG4iKTsKKwllbWl0KGYsIlx0bW92XHRobCwgYmFcbiIpOworCWVtaXQoZiwiXHRtb3ZcdGJhLCB4XG4iKTsKKwllbWl0KGYsIlx0dHN0XHRhLCAweDAxXG4iKTsKKwllbWl0KGYsIlx0bW92XHRiYSwgeVxuIik7CisJZW1pdChmLCJcdGp6XHR2YmNjX19fZG1fcmVzbm9uZWdhdGVcbiIpOworCWVtaXQoZiwiXHRpbmNcdGJhXG4iKTsKKwllbWl0KGYsIlx0am1wXHR2YmNjX19fZG1fcmVzbmVnYXRlXG4iKTsKKwllbWl0KGYsInZiY2NfX19kbV9yZXNub25lZ2F0ZTpcbiIpOworCWVtaXQoZiwiXHRub3RcdGJcbiIpOworCWVtaXQoZiwiXHRub3RcdGFcbiIpOworCWVtaXQoZiwidmJjY19fX2RtX3Jlc25lZ2F0ZTpcbiIpOworCWVtaXQoZiwiXHRwb3BcdHlcbiIpOworCWVtaXQoZiwiXHRwb3BcdHhcbiIpOworCWVtaXQoZiwiXHRyZXRcbiIpOworfQpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvcG0vZW1pdF9lbmQuaCBiL21hY2hpbmVzL3BtL2VtaXRfZW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmE3N2IyZQotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL3BtL2VtaXRfZW5kLmgKQEAgLTAsMCArMSwyMCBAQAorCisvKiBhdXRvbWF0aWNhbHkgZ2VuZXJhdGVkIGZyb20gdGhlIGZpbGUgZW5kLmFzbSBkbyBub3QgbW9kaWZ5ICovCisKK3N0YXRpYyB2b2lkIGVtaXRfZW5kKEZJTEUgKmYpCit7CisJaWYoIXVzZWRfaW50ZXJydXB0WzE1XSkgeworCWVtaXQoZiwgIiVzMTU6XG4iLCBpbnRfaGFuZGxlcl9wcmVmaXgpOworCXVzZWRfaW50ZXJydXB0WzE1XSA9ICgxKTsKKwl9CisJZW1pdChmLCJcdG1vdmJcdFtubisweDI5XSwgKDE8PDcpXG4iKTsKKwllbWl0KGYsIlx0dGVzdFx0W25uKzB4NTJdLCAoMTw8NylcbiIpOworCWVtaXQoZiwiXHRqbnpcdHZiY2NfX19ub3R1cm5vZmZcbiIpOworCWVtaXQoZiwiXHRjaW50XHQweDI0XG4iKTsKKwllbWl0KGYsInZiY2NfX19ub3R1cm5vZmY6XG4iKTsKKwllbWl0KGYsIlx0cmV0aVxuIik7CisJZW1pdF91bmlzZWRfaXJxX2xhYmVscyhmKTsKKwllbWl0KGYsIlx0cmV0aVxuIik7CisJZW1pdF9tdWx0KGYpOworCWVtaXRfZGl2X21vZChmKTsKK30KZGlmZiAtLWdpdCBhL21hY2hpbmVzL3BtL2VtaXRfbXVsdC5oIGIvbWFjaGluZXMvcG0vZW1pdF9tdWx0LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzUwMTJiZQotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL3BtL2VtaXRfbXVsdC5oCkBAIC0wLDAgKzEsMjMgQEAKKworLyogYXV0b21hdGljYWx5IGdlbmVyYXRlZCBmcm9tIHRoZSBmaWxlIG11bHQuYXNtIGRvIG5vdCBtb2RpZnkgKi8KKworc3RhdGljIHZvaWQgZW1pdF9tdWx0KEZJTEUgKmYpCit7CisJZW1pdChmLCJ2YmNjX19fbXVsMTZ4MTZfMTY6XG4iKTsKKwllbWl0KGYsIlx0cHVzaFx0aGxcbiIpOworCWVtaXQoZiwiXHRtdWxcdGwsIGFcbiIpOworCWVtaXQoZiwiXHRwdXNoXHRobFxuIik7CisJZW1pdChmLCJcdG1vdlx0aGwsW3NwKzNdXG4iKTsKKwllbWl0KGYsIlx0bXVsXHRsLCBhXG4iKTsKKwllbWl0KGYsIlx0bW92XHRhLCBiXG4iKTsKKwllbWl0KGYsIlx0bW92XHRiLCBsXG4iKTsKKwllbWl0KGYsIlx0bW92XHRobCwgW3NwKzJdXG4iKTsKKwllbWl0KGYsIlx0bXVsXHRsLCBhXG4iKTsKKwllbWl0KGYsIlx0bW92XHRhLCBsXG4iKTsKKwllbWl0KGYsIlx0YWRkXHRhLCBiXG4iKTsKKwllbWl0KGYsIlx0bW92XHRiLCBhXG4iKTsKKwllbWl0KGYsIlx0eG9yXHRhLCBhXG4iKTsKKwllbWl0KGYsIlx0cG9wXHRobFxuIik7CisJZW1pdChmLCJcdGFkZFx0YmEsIGhsXG4iKTsKKwllbWl0KGYsIlx0cG9wXHRobFxuIik7CisJZW1pdChmLCJcdHJldFxuIik7fQpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvcG0vZW1pdF9zdGFydC5oIGIvbWFjaGluZXMvcG0vZW1pdF9zdGFydC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZkN2Q3OWUKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9wbS9lbWl0X3N0YXJ0LmgKQEAgLTAsMCArMSw0NCBAQAorCisvKiBhdXRvbWF0aWNhbHkgZ2VuZXJhdGVkIGZyb20gdGhlIGZpbGUgc3RhcnQuYXNtIGRvIG5vdCBtb2RpZnkgKi8KKworc3RhdGljIHZvaWQgZW1pdF9zdGFydChGSUxFICpmKQoreworCWVtaXQoZiwiLm9yZyAweDIxMDBcbiIpOworCWVtaXQoZiwiLmRiIFwiTU5cIlxuIik7CisJZW1pdF9pcnFfdmVjdG9ycyhmKTsKKwllbWl0KGYsIi5vcmdmaWxsIDB4MjFBNFxuIik7CisJZW1pdChmLCIuZGIgXCJOSU5URU5ET1wiXG4iKTsKKwllbWl0KGYsIi5kYiBcIiVzXCJcbiIsIGdhbWVfaWQpOworCWVtaXQoZiwiLmRiIFwiJXNcIlxuIiwgZ2FtZV9uYW1lKTsKKwllbWl0KGYsIi5vcmdmaWxsIDB4MjFCQ1xuIik7CisJZW1pdChmLCIuZGIgXCIyUFwiXG4iKTsKKwllbWl0KGYsIi5vcmdmaWxsIDB4MjFEMFxuIik7CisJZW1pdChmLCJ2YmNjX19fc3RhcnRfcm9tX3ZhcnM6XG4iKTsKKwllbWl0KGYsIi5vcmcgMHgxMDAwXG4iKTsKKwllbWl0KGYsInZiY2NfX19zdGFydF9yYW1fdmFyczpcbiIpOworCWVtaXQoZiwiLm9yZyAweDIwMDBcbiIpOworCWVtaXQoZiwidmJjY19fX2VuZF9yYW1fdmFyczpcbiIpOworCWVtaXQoZiwiLm9yZyAweDMxRDBcbiIpOworCWVtaXQoZiwiLmVxdSAgdmJjY19fX3JhbV92YXJzX29mZnNldCAlZCAtIDB4MTAwMFxuIiwgc3RhcnRfcmFtX3ZhcnMpOworCWVtaXQoZiwgIiVzMDpcbiIsIGludF9oYW5kbGVyX3ByZWZpeCk7CisJZW1pdChmLCJcdG1vdlx0XHR4LCB2YmNjX19fc3RhcnRfcm9tX3ZhcnMgKyB2YmNjX19fcmFtX3ZhcnNfb2Zmc2V0XG4iKTsKKwllbWl0KGYsIlx0bW92XHRcdHksIHZiY2NfX19zdGFydF9yYW1fdmFycyArIHZiY2NfX19yYW1fdmFyc19vZmZzZXRcbiIpOworCWVtaXQoZiwiXHRtb3ZcdFx0aGwsIHZiY2NfX19lbmRfcmFtX3ZhcnNcbiIpOworCWVtaXQoZiwidmJjY19fY29weV92YXJzX2xvb3A6XG4iKTsKKwllbWl0KGYsIlx0bW92XHRcdGEsW3hdXG4iKTsKKwllbWl0KGYsIlx0bW92XHRcdFt5XSxhXG4iKTsKKwllbWl0KGYsIlx0aW5jXHRcdHhcbiIpOworCWVtaXQoZiwiXHRpbmNcdFx0eVxuIik7CisJZW1pdChmLCJcdGNtcFx0XHRobCwgeVxuIik7CisJZW1pdChmLCJcdGpuelx0XHR2YmNjX19jb3B5X3ZhcnNfbG9vcFxuIik7CisJZW1pdChmLCJcdG1vdndcdHNwLCAweDIwMDBcbiIpOworCWVtaXQoZiwiXHRtb3Z3XHRubiwgMHgyMDAwXG4iKTsKKwllbWl0KGYsIlx0bW92Ylx0W25uKzB4MjFdLCAweDBDXG4iKTsKKwllbWl0KGYsIlx0bW92Ylx0W25uKzB4MjVdLCAoMTw8NylcbiIpOworCWVtaXQoZiwiXHRtb3ZiXHRmbGFncywgMFxuIik7CisJZW1pdChmLCJcdG1vdmJcdFtubisweDgwXSwgMGIwMDAwMTAwMFxuIik7CisJZW1pdChmLCJcdG1vdmJcdFtubisweDgxXSwgMGIwMDAwMTAwMVxuIik7CisJZW1pdChmLCJcdGNhbGxcdG1haW5cbiIpOworCWVtaXQoZiwidmJjY19fX2luZmluaXRlX2xvb3A6XG4iKTsKKwllbWl0KGYsIlx0am1wXHR2YmNjX19faW5maW5pdGVfbG9vcFxuIik7Cit9CmRpZmYgLS1naXQgYS9tYWNoaW5lcy9wbS9tYWNoaW5lLmMgYi9tYWNoaW5lcy9wbS9tYWNoaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODFjYTA3NwotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL3BtL21hY2hpbmUuYwpAQCAtMCwwICsxLDE0MTIgQEAKKworI2luY2x1ZGUgInN1cHAuaCIKKworCitzdGF0aWMgZGVidWdfcHJpbnRzID0gMDsKKworc3RhdGljIGNoYXIgRklMRV9bXT1fX0ZJTEVfXzsKKworLyogTmFtZSBhbmQgY29weXJpZ2h0LiAqLworY2hhciBjZ19jb3B5cmlnaHRbXT0idmJjYyBjb2RlLWdlbmVyYXRvciBmb3IgUG9rZW1vbiBNaW5pIFYwLjAxOSAoYykgaW4gMjAxMSBieSB6b3JhbmMiOworCisKKy8qICBDb21tYW5kbGluZS1mbGFncyB0aGUgY29kZS1nZW5lcmF0b3IgYWNjZXB0czoKKyAgICAwOiBqdXN0IGEgZmxhZworICAgIFZBTEZMQUc6IGEgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQKKyAgICBTVFJJTkdGTEFHOiBhIHN0cmluZyBjYW4gYmUgc3BlY2lmaWVkCisgICAgRlVOQ0ZMQUc6IGEgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKKyAgICBhcGFydCBmcm9tIEZVTkNGTEFHLCBhbGwgb3RoZXIgdmVyc2lvbnMgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIG9uY2UgKi8KK2ludCBnX2ZsYWdzW01BWEdGXT0geyBGVU5DRkxBRywgU1RSSU5HRkxBRywgU1RSSU5HRkxBRywgU1RSSU5HRkxBRyB9OworCisvKiB0aGUgZmxhZy1uYW1lLCBkbyBub3QgdXNlIG5hbWVzIGJlZ2lubmluZyB3aXRoIGwsIEwsIEksIEQgb3IgVSwgYmVjYXVzZQorICAgdGhleSBjb2xsaWRlIHdpdGggdGhlIGZyb250ZW5kICovCitjaGFyICpnX2ZsYWdzX25hbWVbTUFYR0ZdID0geyAiaCIsICJyYW0tdmFycyIsICJpZCIsICJuYW1lIiB9OworCisvKiB0aGUgcmVzdWx0cyBvZiBwYXJzaW5nIHRoZSBjb21tYW5kLWxpbmUtZmxhZ3Mgd2lsbCBiZSBzdG9yZWQgaGVyZSAqLwordW5pb24gcHBpIGdfZmxhZ3NfdmFsW01BWEdGXTsKKworI2RlZmluZSBIRUxQX0RVTVAgICAgICAoZ19mbGFnc1swXSZVU0VERkxBRykKKyNkZWZpbmUgUkFNX1ZBUlNfQUREUiAgKChnX2ZsYWdzWzFdJlVTRURGTEFHKT9hZGRyZXNzX251bWJlcihnX2ZsYWdzX3ZhbFsxXS5wKToweDE0RTApCisjZGVmaW5lIEdBTUVfSUQgICAgICAgICgoZ19mbGFnc1syXSZVU0VERkxBRyk/Z19mbGFnc192YWxbMl0ucDoiUEtDQyIpCisjZGVmaW5lIEdBTUVfTkFNRSAgICAgICgoZ19mbGFnc1szXSZVU0VERkxBRyk/Z19mbGFnc192YWxbM10ucDoiUG9rZUNDYnlaQyIpCisKKworCisvKiAgQWxpZ25tZW50LXJlcXVpcmVtZW50cyBmb3IgYWxsIHR5cGVzIGluIGJ5dGVzLiAgICAgICAgICAgICAgKi8KK3ptYXggYWxpZ25bTUFYX1RZUEUrMV07CisKKy8qICBBbGlnbm1lbnQgdGhhdCBpcyBzdWZmaWNpZW50IGZvciBldmVyeSBvYmplY3QuICAgICAgICAgICAgICAqLworem1heCBtYXhhbGlnbjsKKworLyogIFNpemVzIG9mIGFsbCBlbGVtZW50YXJ5IHR5cGVzIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IHNpemV0YWJbTUFYX1RZUEUrMV07CisKKy8qICBNaW5pbXVtIGFuZCBNYXhpbXVtIHZhbHVlcyBlYWNoIHR5cGUgY2FuIGhhdmUuICAgICAgICAgICAgICAqLworLyogIE11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gaW5pdF9jZygpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IHRfbWluW01BWF9UWVBFKzFdOworenVtYXggdF9tYXhbTUFYX1RZUEUrMV07Cit6dW1heCB0dV9tYXhbTUFYX1RZUEUrMV07CisKKy8qICBDSEFSX0JJVCBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworem1heCBjaGFyX2JpdDsKKworLyogIE5hbWVzIG9mIGFsbCByZWdpc3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitjaGFyICpyZWduYW1lc1tdPXsibm9yZWciLCJ4IiwieSIsICJiYSIsICJobCJ9OworY2hhciAqcmVnbmFtZXNfbG93W109eyJub3JlZyIsIm5vcmVnIiwibm9yZWciLCAiYSIsICJsIn07CitjaGFyICpyZWduYW1lc19oaWdoW109eyJub3JlZyIsIm5vcmVnIiwibm9yZWciLCAiYiIsICJoIn07CisKKy8qICBUaGUgU2l6ZSBvZiBlYWNoIHJlZ2lzdGVyIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworem1heCByZWdzaXplW01BWFIrMV07CisKKy8qICBUeXBlIHdoaWNoIGNhbiBzdG9yZSBlYWNoIHJlZ2lzdGVyLiAqLworc3RydWN0IFR5cCAqcmVndHlwZVtNQVhSKzFdOworCisvKiAgcmVnc2FbcmVnXSE9MCBpZiBhIGNlcnRhaW4gcmVnaXN0ZXIgaXMgYWxsb2NhdGVkIGFuZCBzaG91bGQgKi8KKy8qICBub3QgYmUgdXNlZCBieSB0aGUgY29tcGlsZXIgcGFzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworaW50IHJlZ3NhW01BWFIrMV07CisKKy8qICBTcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXJzIG1heSBiZSBzY3JhdGNoZWQgYnkgZnVuY3Rpb25zLiAgICAqLworaW50IHJlZ3NjcmF0Y2hbTUFYUisxXT17MCwxLDF9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFNvbWUgcHJpdmF0ZSBkYXRhIGFuZCBmdW5jdGlvbnMuICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGxvbmcgbWFsaWduW01BWF9UWVBFKzFdPSAgezEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDF9Oworc3RhdGljIGxvbmcgbXNpemV0YWJbTUFYX1RZUEUrMV09ezAsMSwxLDIsNCw0LDQsOCw4LDAsMiwwLDAsMCwyLDB9OworCitzdHJ1Y3QgVHlwIGl0eXA9e1NIT1JUfSxsdHlwPXtMT05HfTsKKworc3RhdGljIGludCBpeCA9IDEsaXkgPSAyOworc3RhdGljIGludCBxMXJlZyxxMnJlZyx6cmVnOworc3RhdGljIGludCBiYSA9IDMsaGwgPSA0OyAgICAgICAgICAgICAgIC8qICB0ZW1wb3JhcnkgZ3BycyAqLworCisKKy8qIHJldHVybi1pbnN0cnVjdGlvbiAqLworc3RhdGljIGNoYXIgKnJldDsKKworc3RhdGljIGNoYXIgKm1hcnJheVtdPXsiX19QT0tFTUlOSV9fIiwwfTsKKworI2RlZmluZSBpc3JlZyh4KSAoKHAtPnguZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRykKKyNkZWZpbmUgaXNjb25zdCh4KSAoKHAtPnguZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpCisKKyNkZWZpbmUgSVNMV09SRCh0KSAoKHQmTlEpPT1MT05HfHwodCZOUSk9PUZMT0FUKQorI2RlZmluZSBJU0hXT1JEKHQpICgodCZOUSk9PUlOVCkKKworCisvKiBhc3NlbWJseS1wcmVmaXhlcyBmb3IgbGFiZWxzIGFuZCBleHRlcm5hbCBpZGVudGlmaWVycyAqLworc3RhdGljIGNoYXIgKmxhYnByZWZpeD0idmJjY19fX2wiLCppZHByZWZpeD0iIjsKKworLyogaGFzIHRvIGJlIDQgYnl0ZXMgbG9uZyAqLworc3RhdGljIGNoYXIgZ2FtZV9pZFsxMF0gPSAiUEtDQyI7CisvKiBjYW4gYmUgdXAgdG8gMTIgYnl0ZXMgbG9uZyAqLworc3RhdGljIGNoYXIgZ2FtZV9uYW1lWzIwXSA9ICJQb2tlQ0NieVpDIjsKKworc3RhdGljIHZvaWQgZW1pdF9pcnFfdmVjdG9ycyhGSUxFICpmKTsKK3N0YXRpYyB2b2lkIGVtaXRfdW5pc2VkX2lycV9sYWJlbHMoRklMRSAqZik7CitzdGF0aWMgaW50IHVzZWRfaW50ZXJydXB0WzI2XTsKK3N0YXRpYyBjaGFyICppbnRfaGFuZGxlcl9wcmVmaXg9InZiY2NfX19pbnRlcnJ1cHRfaGFuZGxlcl8iOworCitzdGF0aWMgaW50IHN0YXJ0X3JhbV92YXJzID0gMHgxNEUwOworc3RhdGljIGludCByYW1fcm9tX2Rpc3RhbmNlID0gMHgxMUQwOworc3RhdGljIGludCBlbmRfcmFtX3ZhcnM7CitzdGF0aWMgaW50IGxhc3Rfd2FzX3JvbSA9IDE7CitzdGF0aWMgaW50IHJhbV92YXJzX2luaXRpYWxpemVkID0gMDsKKworLyogTmFtZXMgb2YgdGFyZ2V0LXNwZWNpZmljIHZhcmlhYmxlIGF0dHJpYnV0ZXMuICAgICAgICAgICAgICAgICovCitjaGFyICpnX2F0dHJfbmFtZVtdPXsiX19pbnRlcnJ1cHQiLCAiX19yb20iLCAiX19hbGlnbjgiLCAiX19hbGlnbjY0IiwgMH07CisjZGVmaW5lIElOVEVSUlVQVCAxCisjZGVmaW5lIFJPTSAyCisjZGVmaW5lIEFMSUdOOCA0CisjZGVmaW5lIEFMSUdONjQgOAorCisjaW5jbHVkZSAiZW1pdC5oIgorCisKKyNkZWZpbmUgZHQodCkgKCgodCkmVU5TSUdORUQpP3VkdFsodCkmTlFdOnNkdFsodCkmTlFdKQorc3RhdGljIGNoYXIgKnNkdFtNQVhfVFlQRSsxXT17Ij8/IiwiYyIsInMiLCJpIiwibCIsImxsIiwiZiIsImQiLCJsZCIsInYiLCJwIn07CitzdGF0aWMgY2hhciAqdWR0W01BWF9UWVBFKzFdPXsiPz8iLCJ1YyIsInVzIiwidWkiLCJ1bCIsInVsbCIsImYiLCJkIiwibGQiLCJ2IiwicCJ9OworCisKKy8vc3RhdGljIGNoYXIgKmNjc1tdPXsiZXEiLCJuZSIsImx0IiwiZ2UiLCJsZSIsImd0IiwiIn07CitzdGF0aWMgY2hhciAqY2NzMltdPXsibnoiLCJ6IiwiZ2UiLCJsIiwiZyIsImxlIiwiIn07CisvL3N0YXRpYyBjaGFyICp1Y2NzMltdPXsibnpiIiwiemIiLCJnZSIsImwiLCJnIiwibGUiLCIifTsKK3N0YXRpYyBjaGFyICp1Y2NzMltdPXsibnoiLCJ6IiwibmMiLCJjIiwiYyIsIm5jIiwiIn07CisvL3N0YXRpYyBjaGFyICp1Y2NzMltdPXsibnpiIiwiemIiLCJubyIsIm8iLCJucyIsInMiLCIifTsKK3N0YXRpYyBjaGFyICpsb2dpY2Fsc1tdPXsib3IiLCJ4b3IiLCJhbmQifTsKK3N0YXRpYyBjaGFyICphcml0aG1ldGljc1tdPXsic2x3Iiwic3J3IiwiYWRkIiwic3ViIiwibXVsbHciLCJkaXZ3IiwibW9kIn07CisKK3N0YXRpYyB2b2lkIGVtaXRfb2JqKEZJTEUgKmYsc3RydWN0IG9iaiAqcCxpbnQgdCk7CisKK3N0YXRpYyBsb25nIGxvY2Fsc2l6ZSwgcnNhdmVzaXplLCAvKmFyZ3NpemUsKi8gcHVzaGVkOworCisjZGVmaW5lIE5PVF9JTVAoKSBub3RfaW1wbGVtZW50ZWQoKGYpLChfX0xJTkVfXykpCit2b2lkIG5vdF9pbXBsZW1lbnRlZChGSUxFICpmLCBpbnQgbGluZSkKK3sKKwllbWl0KGYsICI7XHROT1QgSU1QTEVNRU5URUQ6ICVzIExJTkU6ICVkICEhIVxuIiwgX19GSUxFX18sIGxpbmUpOworfQorCisvKiBjYWxjdWxhdGUgdGhlIGFjdHVhbCBjdXJyZW50IG9mZnNldCBvZiBhbiBvYmplY3QgcmVsYXRpdiB0byB0aGUKKyBzdGFjay1wb2ludGVyOyB3ZSB1c2UgYSBsYXlvdXQgbGlrZSB0aGlzOgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHwgYXJndW1lbnRzIHRvIHRoaXMgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgfAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHwgcmV0dXJuLWFkZHJlc3MgW3NpemU9M10gICAgICAgICAgICAgICAgICAgICAgfAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHwgY2FsbGVyLXNhdmUgcmVnaXN0ZXJzIFtzaXplPXJzYXZlc2l6ZV0gICAgICAgfAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHwgbG9jYWwgdmFyaWFibGVzIFtzaXplPWxvY2Fsc2l6ZV0gICAgICAgICAgICAgfAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHwgYXJndW1lbnRzIHRvIGNhbGxlZCBmdW5jdGlvbnMgW3NpemU9YXJnc2l6ZV0gfAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEFsbCBzaXplcyB3aWxsIGJlIGFsaWduZWQgYXMgbmVjZXNzYXJ5LgorIEluIHRoZSBjYXNlIG9mIEZJWEVEX1NQLCB0aGUgc3RhY2stcG9pbnRlciB3aWxsIGJlIGFkanVzdGVkIGF0CisgZnVuY3Rpb24tZW50cnkgdG8gbGVhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgYXJndW1lbnRzIGFuZCBoYXZlIGl0CisgYWxpZ25lZCB0byAxNiBieXRlcy4gVGhlcmVmb3JlLCB3aGVuIGNhbGxpbmcgYSBmdW5jdGlvbiwgdGhlCisgc3RhY2stcG9pbnRlciBpcyBhbHdheXMgYWxpZ25lZCB0byAxNiBieXRlcy4KKyBGb3IgYSBtb3Zpbmcgc3RhY2stcG9pbnRlciwgdGhlIHN0YWNrLXBvaW50ZXIgd2lsbCB1c3VhbGx5IHBvaW50CisgdG8gdGhlIGJvdHRvbSBvZiB0aGUgYXJlYSBmb3IgbG9jYWwgdmFyaWFibGVzLCBidXQgd2lsbCBtb3ZlIHdoaWxlCisgYXJndW1lbnRzIGFyZSBwdXQgb24gdGhlIHN0YWNrLgorIAorIFRoaXMgaXMganVzdCBhbiBleGFtcGxlIGxheW91dC4gT3RoZXIgbGF5b3V0cyBhcmUgYWxzbyBwb3NzaWJsZS4KKyAqLworCitzdGF0aWMgbG9uZyByZWFsX29mZnNldChzdHJ1Y3Qgb2JqICpvKQoreworCWxvbmcgb2ZmPXptMmwoby0+di0+b2Zmc2V0KTsKKworCWlmKG9mZjwwKXsKKwkJLyogZnVuY3Rpb24gcGFyYW1ldGVyICovCisJCW9mZj1sb2NhbHNpemUrcnNhdmVzaXplKzMtb2ZmLXptMmwobWF4YWxpZ24pOworCX0KKworCW9mZis9cHVzaGVkOworCisJb2ZmKz16bTJsKG8tPnZhbC52bWF4KTsKKworCXJldHVybiBvZmY7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfaXJxX3ZlY3RvcnMoRklMRSAqZikKK3sKKwlpbnQgaTsKKwlmb3IoaT0wOyBpPDI2OyBpKyspCisJeworCQllbWl0KGYsICIub3JnZmlsbCAweCV4XG4iLCAweDIxMDIgKyA2ICogaSk7CisJCWVtaXQoZiwgIlx0am1wXHQlcyVkXG4iLCBpbnRfaGFuZGxlcl9wcmVmaXgsIGkpOworCX0KKwkKKwl1c2VkX2ludGVycnVwdFswXSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfdW5pc2VkX2lycV9sYWJlbHMoRklMRSAqZikKK3sKKwlpbnQgaTsKKwlmb3IoaT0wOyBpPDI2OyBpKyspCisJeworCQlpZighdXNlZF9pbnRlcnJ1cHRbaV0pCisJCQllbWl0KGYsICIlcyVkOlxuIiwgaW50X2hhbmRsZXJfcHJlZml4LCBpKTsKKwl9Cit9CisKK2NoYXIgKmZsYWdzX3ZlcmJvc2UoaW50IGZsYWdzLCBjaGFyICpzdHIpCit7CisJc3RhdGljIGNoYXIgKmZsYWdfc3RyW10gPSB7IktPTlNUIiwgIlZBUiIsICIiLCAiIiwgIiIsICJEUkVGT0JKIiwgIlJFRyIsICJWQVJBRFIifTsKKwlpbnQgaTsKKwkKKwlzdHJjcHkoc3RyLCAiIik7CisJCisJZm9yKGk9MDsgaTw4OyBpKyspCisJeworCQlpZihmbGFncyAmICgxIDw8IGkpKQorCQl7CisJCQlpZihzdHJsZW4oc3RyKSE9MCAmJiBzdHJsZW4oZmxhZ19zdHJbaV0pIT0wKQorCQkJCXN0cmNhdChzdHIsICJ8Iik7CisJCQlzdHJjYXQoc3RyLCBmbGFnX3N0cltpXSk7CisJCX0KKwl9CisJCisJcmV0dXJuIHN0cjsKK30KKworLyogZ2VuZXJhdGUgY29kZSB0byBsb2FkIHRoZSBhZGRyZXNzIG9mIGEgdmFyaWFibGUgaW50byByZWdpc3RlciByICovCitzdGF0aWMgdm9pZCBsb2FkX2FkZHJlc3MoRklMRSAqZixpbnQgcixzdHJ1Y3Qgb2JqICpvLGludCB0eXBlKQorLyogIEdlbmVyYXRlcyBjb2RlIHRvIGxvYWQgdGhlIGFkZHJlc3Mgb2YgYSB2YXJpYWJsZSBpbnRvIHJlZ2lzdGVyIHIuICAgKi8KK3sKKyAgY2hhciBzdHJbMTAwXTsKKyAgaWYoZGVidWdfcHJpbnRzKQorICAgCWVtaXQoZiwgIjtcdGxvYWRfYWRkcmVzcyhyZWc6JXMsIGZsYWdzOiVzLCB0eXBlOiVzKVxuIiwgcmVnbmFtZXNbcl0sIGZsYWdzX3ZlcmJvc2Uoby0+ZmxhZ3MsIHN0ciksIHR5cG5hbWVbdHlwZSZOUV0pOworICBpZighKG8tPmZsYWdzJlZBUikpIGllcnJvcigwKTsKKyAgaWYoby0+di0+c3RvcmFnZV9jbGFzcz09QVVUT3x8by0+di0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpCisgIHsKKyAgICBsb25nIG9mZj1yZWFsX29mZnNldChvKTsKKyAgICBlbWl0KGYsIlx0bW92XHQlcyxzcFxuIixyZWduYW1lc1tyXSk7CisgICAgaWYob2ZmKQorICAgICAgZW1pdChmLCJcdGFkZFx0JXMsJWxkXG4iLHJlZ25hbWVzW3JdLG9mZik7CisgIH0KKyAgZWxzZQorICB7CisgICAgZW1pdChmLCJcdG1vdlx0JXMsIixyZWduYW1lc1tyXSk7CisgICAgZW1pdF9vYmooZixvLHR5cGUpOworICAgIGVtaXQoZiwiXG4iKTsKKyAgfQorfQorLyogR2VuZXJhdGVzIGNvZGUgdG8gbG9hZCBhIG1lbW9yeSBvYmplY3QgaW50byByZWdpc3RlciByLiB0bXAgaXMgYQorIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciB3aGljaCBtYXkgYmUgdXNlZC4gdG1wIGNhbiBiZSByLiAqLworc3RhdGljIHZvaWQgbG9hZF9yZWcoRklMRSAqZiwgaW50IHIsIHN0cnVjdCBvYmogKm8sIGludCB0eXBlLCBpbnQgdHlwZTIpCit7CisgIGNoYXIgc3RyWzEwMF07CisgIGlmKGRlYnVnX3ByaW50cykKKyAgICBlbWl0KGYsICI7XHRsb2FkX3JlZyhyZWc6JXMsIGZsYWdzOiVzLCB0eXBlOiVzLCB0eXBlMjolcylcbiIsIHJlZ25hbWVzW3JdLCBmbGFnc192ZXJib3NlKG8tPmZsYWdzLCBzdHIpLCB0eXBuYW1lW3R5cGUmTlFdLCAodHlwZTImTlEpP3R5cG5hbWVbdHlwZTImTlFdOiIiKTsKKyAgdHlwZSY9TlU7CisgIGlmKG8tPmZsYWdzJlZBUkFEUikKKyAgeworICAgIGxvYWRfYWRkcmVzcyhmLHIsbyxQT0lOVEVSKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmby0+cmVnPT1yKQorICAgICAgcmV0dXJuOworICAgIGlmKCBtc2l6ZXRhYlsodHlwZSZOUSldID09IDEgJiYgCisgICAgICAgICAhKChvLT5mbGFncz09VkFSKSAvKiYmIChvLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikqLykpCisgICAgeworICAgIAkvKiBUT0RPICovCisgICAgCS8qIG9wdGltaXNlIHRoaXMgbGlrZSBpbiB0aGUgc3RvcmVfcmVnKCkgKi8KKwkJaW50IGlzXzE2X3JlZyA9ICgoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSkgPT0gUkVHKSAmJiBtc2l6ZXRhYlt0eXBlMiZOUV0gPT0gMjsKKwkJaWYociA9PSBiYSB8fCByID09IGhsKQorICAgIAl7CisJCQkvKiBoYW5kbGUgY2FzZSBvZiB0cmFuc2ZlciAxNi1iaXQgcmVnIC0+IDgtYml0IHJlZyovCisJCQllbWl0KGYsIlx0bW92XHQlcywiLGlzXzE2X3JlZz9yZWduYW1lc1tyXTpyZWduYW1lc19sb3dbcl0pOworCQkJZW1pdF9vYmooZixvLHR5cGUpOworCQkJZW1pdChmLCJcbiIpOworCQl9CisJCWVsc2UgaWYocj09aXggJiYgKChvLT5mbGFncyYoUkVHfERSRUZPQkopKSA9PSBSRUcpKQorCQl7CisJCQlpZighaXNfMTZfcmVnKQorCQkJCWVtaXQoZiwgIlx0bW92XHQlcywgMFxuIiwgcmVnbmFtZXNfaGlnaFtvLT5yZWddKTsgLy8gb3IgbWF5YmUgZXhwYW5kIHNpZ24/CisJCQllbWl0KGYsICJcdG1vdlx0eCwiKTsKKwkJCWVtaXRfb2JqKGYsbyx0eXBlKTsKKwkJCWVtaXQoZiwiXG4iKTsKKwkJfQorCQllbHNlCisJCQlOT1RfSU1QKCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJCWlmKChvLT5mbGFncz09VkFSKSAmJiB0eXBlPT1BUlJBWSkKKwkJeworCQkJZW1pdChmLCJcdG1vdlx0JXMsIixyZWduYW1lc1tyXSk7CisJCQlvLT5mbGFncyB8PSBWQVJBRFI7CisJCQllbWl0X29iaihmLG8sdHlwZSk7CisJCQlvLT5mbGFncyAmPSB+VkFSQURSOworCQkJZW1pdChmLCJcbiIpOworCQl9CisJCWVsc2UKKwkJeworCQkJZW1pdChmLCJcdG1vdlx0JXMsIixyZWduYW1lc1tyXSk7CisJCQllbWl0X29iaihmLG8sdHlwZSk7CisJCQllbWl0KGYsIlxuIik7CisJCX0KKyAgICB9CisgIH0KK30KKworc3RhdGljIGludCBmcmVlX2luZGV4X3JlZygpCit7CisJaWYoIXJlZ3NbaXhdKSByZXR1cm4gaXg7CisJaWYoIXJlZ3NbaXldKSByZXR1cm4gaXk7CisJcmV0dXJuIDA7Cit9CisKKy8qICBHZW5lcmF0ZXMgY29kZSB0byBzdG9yZSByZWdpc3RlciByIGludG8gbWVtb3J5IG9iamVjdCBvLiAqLworc3RhdGljIHZvaWQgc3RvcmVfcmVnKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdHlwZSkKK3sKKwljaGFyIHN0clsxMDBdOworICAgIGlmKGRlYnVnX3ByaW50cykKKyAgICAJZW1pdChmLCAiO1x0c3RvcmVfcmVnKHJlZzolcywgZmxhZ3M6JXMsIHR5cGU6JXMpXG4iLCByZWduYW1lc1tyXSwgZmxhZ3NfdmVyYm9zZShvLT5mbGFncywgc3RyKSwgdHlwbmFtZVt0eXBlJk5RXSk7CisJdHlwZSY9TlE7CisgICBpZiggbXNpemV0YWJbKHR5cGUmTlEpXSA9PSAxICkKKyAgIHsKKyAgICAJaWYociA9PSBiYSkKKyAgICAJeworCQkJaWYoKG8tPmZsYWdzPT1WQVIpICYmIChvLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikpCisJCQl7CisJCQkJaW50IGluZF9yZWcgPSBmcmVlX2luZGV4X3JlZygpOworCQkJCWxvbmcgb2ZmID0gcmVhbF9vZmZzZXQobyk7CisJCQkJCisJCQkJaWYob2ZmID09IDApCisJCQkJeworCQkJCQllbWl0KGYsICJcdGluY1x0c3BcbiIpOworCQkJCQllbWl0KGYsICJcdHB1c2hcdGFcbiIpOworCQkJCX0KKwkJCQllbHNlIGlmKGluZF9yZWcpCisJCQkJeworCQkJCQllbWl0KGYsICJcdG1vdlx0JXMsc3BcbiIsIHJlZ25hbWVzW2luZF9yZWddKTsKKwkJCQkJZW1pdChmLCAiXHRtb3ZcdFslcyslbGRdLCVzXG4iLCByZWduYW1lc1tpbmRfcmVnXSwgb2ZmLCByZWduYW1lc19sb3dbcl0pOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQllbWl0KGYsIlx0bW92XHRobCxzcFxuIik7CisJCQkJCWVtaXQoZiwiXHRhZGRcdGhsLCVsZFxuIixvZmYpOworCQkJCQllbWl0KGYsIlx0bW92XHRbaGxdLCVzXG4iLCByZWduYW1lc19sb3dbcl0pOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQllbWl0KGYsIlx0bW92XHQiKTsKKwkJCQllbWl0X29iaihmLG8sdHlwZSk7CisJCQkJZW1pdChmLCIsJXNcbiIscmVnbmFtZXNfbG93W3JdKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmKHI9PWl4ICYmIChvLT5mbGFncz09VkFSKSkKKwkJeworCQkJZW1pdChmLCAiXHRtb3ZcdGhsLCIpOworCQkJZW1pdF9vYmooZixvLHR5cGUpOworCQkJZW1pdChmLCAiXG4iKTsKKwkJCWVtaXQoZiwgIlx0bW92XHRoLCAwXG4iKTsgLy8gbWF5YmUgZXh0ZW5kIHNpZ24/CisJCQllbWl0KGYsICJcdG1vdlx0eCxobFxuIik7CisJCX0KKwkJZWxzZQorCQkJTk9UX0lNUCgpOworICAgfQorCWVsc2UKKwl7CisJCWVtaXQoZiwiXHRtb3ZcdCIpOworCQllbWl0X29iaihmLG8sdHlwZSk7CisJCWVtaXQoZiwiLCVzXG4iLHJlZ25hbWVzW3JdKTsKKwl9Cit9CisKKworLyogRG9lcyBzb21lIHByZS1wcm9jZXNzaW5nIGxpa2UgZmV0Y2hpbmcgb3BlcmFuZHMgZnJvbSBtZW1vcnkgdG8KKyByZWdpc3RlcnMgZXRjLiAqLworc3RhdGljIHN0cnVjdCBJQyAqcHJlbG9hZChGSUxFICpmLHN0cnVjdCBJQyAqcCkKK3sKKyAgaW50IHI7CisKKyAgaWYoZGVidWdfcHJpbnRzKQorICAgIGVtaXQoZiwgIjtcdHByZWxvYWQoKSAtIHN0YXJ0XG4iKTsKKyAgCisgIGlmKGlzcmVnKHExKSkKKyAgICBxMXJlZz1wLT5xMS5yZWc7CisgIGVsc2UKKyAgICBxMXJlZz0wOworICAKKyAgaWYoaXNyZWcocTIpKQorICAgIHEycmVnPXAtPnEyLnJlZzsKKyAgZWxzZQorICAgIHEycmVnPTA7CisgIAorICBpZihpc3JlZyh6KSAmJiBBREQgPD0gcC0+Y29kZSAmJiBwLT5jb2RlIDw9IFNVQikKKyAgeworICAgIHpyZWc9cC0+ei5yZWc7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyoKKyAgICBpZihJU0ZMT0FUKHp0eXAocCkpKQorICAgICAgenJlZz1mMTsKKyAgICBlbHNlCisgICAgKi8KKyAgICAgIHpyZWc9YmE7CisgIH0KKyAgaWYoKHAtPnExLmZsYWdzJihEUkVGT0JKfFJFRykpPT1EUkVGT0JKJiYhcC0+cTEuYW0pCisgIHsKKyAgICBpZihkZWJ1Z19wcmludHMpCisgICAgICBlbWl0KGYsICI7XHRwcmVsb2FkKCkgLSBxMVxuIik7CisgICAgcC0+cTEuZmxhZ3MmPX5EUkVGT0JKOworICAgIGxvYWRfcmVnKGYsaGwsJnAtPnExLFBPSU5URVIsMCk7CisgICAgcC0+cTEucmVnPWhsOworICAgIHAtPnExLmZsYWdzfD0oUkVHfERSRUZPQkopOworCSBwLT5xMS5mbGFncyY9fktPTlNUOworICB9CisgIGlmKHAtPnExLmZsYWdzLyogJiZMT0FEX1NUT1JFICovJiYhaXNyZWcocTEpKQorICB7CisgICAgaWYoZGVidWdfcHJpbnRzKQorICAgICAgZW1pdChmLCAiO1x0cHJlbG9hZCgpIC0gcTFhXG4iKTsKKyAgICAvKgorICAgIGlmKElTRkxPQVQocTF0eXAocCkpKQorICAgICAgcTFyZWc9ZjE7CisgICAgZWxzZQorICAgICovCisgICAgICBxMXJlZz1iYTsKKyAgICBsb2FkX3JlZyhmLHExcmVnLCZwLT5xMSxxMXR5cChwKSwwKTsKKyAgICBwLT5xMS5yZWc9cTFyZWc7CisgICAgcC0+cTEuZmxhZ3M9UkVHOworICB9CisgIAorICBpZigocC0+cTIuZmxhZ3MmKERSRUZPQkp8UkVHKSk9PURSRUZPQkomJiFwLT5xMi5hbSkKKyAgeworICAgIGlmKGRlYnVnX3ByaW50cykKKyAgICAgIGVtaXQoZiwgIjtcdHByZWxvYWQoKSAtIHEyXG4iKTsKKyAgICBwLT5xMi5mbGFncyY9fkRSRUZPQko7CisgICAgbG9hZF9yZWcoZixobCwmcC0+cTIsUE9JTlRFUiwgMCk7CisgICAgcC0+cTIucmVnPWhsOworICAgIHAtPnEyLmZsYWdzfD0oUkVHfERSRUZPQkopOworCSBwLT5xMS5mbGFncyY9fktPTlNUOworICB9CisgIGlmKHAtPnEyLmZsYWdzLyogJiZMT0FEX1NUT1JFICovJiYhaXNyZWcocTIpKQorICB7CisgICAgaWYoZGVidWdfcHJpbnRzKQorICAgICAgZW1pdChmLCAiO1x0cHJlbG9hZCgpIC0gcTJhXG4iKTsKKyAgICAvKgorICAgIGlmKElTRkxPQVQocTJ0eXAocCkpKQorICAgICAgcTJyZWc9ZjI7CisgICAgZWxzZQorICAgICovCisgICAgICBxMnJlZz1obDsKKyAgICBsb2FkX3JlZyhmLHEycmVnLCZwLT5xMixxMnR5cChwKSwgMCk7CisgICAgcC0+cTIucmVnPXEycmVnOworICAgIHAtPnEyLmZsYWdzPVJFRzsKKyAgfQorICAKKyAgaWYoZGVidWdfcHJpbnRzKQorICAgIGVtaXQoZiwgIjtcdHByZWxvYWQoKSAtIGVuZFxuIik7CisgIAorICByZXR1cm4gcDsKK30KKworLyogc2F2ZSB0aGUgcmVzdWx0IChpbiB6cmVnKSBpbnRvIHAtPnogKi8KK3ZvaWQgc2F2ZV9yZXN1bHQoRklMRSAqZixzdHJ1Y3QgSUMgKnApCit7CisgIGNoYXIgc3RyWzEwMF07CisgIGlmKGRlYnVnX3ByaW50cykKKyAgIAllbWl0KGYsICI7XHRzYXZlX3Jlc3VsdChmbGFnczolcylcbiIsIGZsYWdzX3ZlcmJvc2UocC0+ei5mbGFncywgc3RyKSk7CisgIGlmKChwLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1EUkVGT0JKJiYhcC0+ei5hbSl7CisgICAgcC0+ei5mbGFncyY9fkRSRUZPQko7CisgICAgbG9hZF9yZWcoZixobCwmcC0+eixQT0lOVEVSLCAwKTsKKyAgICBwLT56LnJlZz1obDsKKyAgICBwLT56LmZsYWdzfD0oUkVHfERSRUZPQkopOworCXAtPnouZmxhZ3MmPX5LT05TVDsKKyAgfQorICBpZihpc3JlZyh6KSl7CisgICAgaWYocC0+ei5yZWchPXpyZWcpCisgICAgICBlbWl0KGYsIlx0bW92XHQlcywlc1xuIixyZWduYW1lc1twLT56LnJlZ10scmVnbmFtZXNbenJlZ10pOworICB9ZWxzZXsKKyAgICBzdG9yZV9yZWcoZix6cmVnLCZwLT56LHp0eXAocCkpOworICB9Cit9CisKKy8qIHByaW50cyBhbiBvYmplY3QgKi8KK3N0YXRpYyB2b2lkIGVtaXRfb2JqKEZJTEUgKmYsc3RydWN0IG9iaiAqcCxpbnQgdCkKK3sKKwkvKgorCWlmKHAtPmFtKXsKKwlpZihwLT5hbS0+ZmxhZ3MmR1BSX0lORCkgZW1pdChmLCIoJXMsJXMpIixyZWduYW1lc1twLT5hbS0+b2Zmc2V0XSxyZWduYW1lc1twLT5hbS0+YmFzZV0pOworCWlmKHAtPmFtLT5mbGFncyZJTU1fSU5EKSBlbWl0KGYsIiglbGQsJXMpIixwLT5hbS0+b2Zmc2V0LHJlZ25hbWVzW3AtPmFtLT5iYXNlXSk7CisJcmV0dXJuOworCX0KKwkqLworCWlmKChwLT5mbGFncyYoS09OU1R8RFJFRk9CSikpPT0oS09OU1R8RFJFRk9CSikpCisJeworCQllbWl0dmFsKGYsJnAtPnZhbCxwLT5kdHlwJk5VKTsKKwkJcmV0dXJuOworCX0KKwlpZigocC0+ZmxhZ3MmRFJFRk9CSil8fChwLT5mbGFncyYoVkFSfFZBUkFEUikpPT1WQVIpIGVtaXQoZiwiWyIpOworCWlmKHAtPmZsYWdzJlJFRykKKwl7CisJCWVtaXQoZiwiJXMiLHJlZ25hbWVzW3AtPnJlZ10pOworCX0KKwllbHNlIGlmKHAtPmZsYWdzJlZBUikgCisJeworCQkvL2VtaXQoZiwieyVkLCVkfSIsIHAtPnYtPnN0b3JhZ2VfY2xhc3MsIHAtPmZsYWdzKTsKKwkJaWYocC0+di0+c3RvcmFnZV9jbGFzcz09QVVUT3x8cC0+di0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpCisJCQllbWl0KGYsInNwKyVsZCIscmVhbF9vZmZzZXQocCkpOworCQllbHNlCisJCXsKKwkJCS8vZW1pdChmLCJbIik7CisJCQlpZighem1lcXRvKGwyem0oMEwpLHAtPnZhbC52bWF4KSkKKwkJCXsKKwkJCQllbWl0dmFsKGYsJnAtPnZhbCxMT05HKTsKKwkJCQllbWl0KGYsIisiKTsKKwkJCX0KKwkJCWlmKHAtPnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQykKKwkJCXsKKwkJCQllbWl0KGYsIiVzJWxkIixsYWJwcmVmaXgsem0ybChwLT52LT5vZmZzZXQpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQllbWl0KGYsIiVzJXMiLGlkcHJlZml4LHAtPnYtPmlkZW50aWZpZXIpOworCQkJfQorCQkJLy9lbWl0KGYsIl0iKTsKKwkJfQorCX0KKwlpZihwLT5mbGFncyZLT05TVCkKKwl7CisJCWVtaXR2YWwoZiwmcC0+dmFsLHQmTlUpOworCX0KKwlpZigocC0+ZmxhZ3MmRFJFRk9CSil8fChwLT5mbGFncyYoVkFSfFZBUkFEUikpPT1WQVIpIGVtaXQoZiwiXSIpOworfQorCisvKiAgWWllbGRzIGxvZzIoeCkrMSBvciAwLiAqLworc3RhdGljIGxvbmcgcG9mMih6dW1heCB4KQoreworICB6dW1heCBwO2ludCBsbj0xOworICBwPXVsMnp1bSgxTCk7CisgIHdoaWxlKGxuPD0zMiYmenVtbGVxKHAseCkpeworICAgIGlmKHp1bWVxdG8oeCxwKSkgcmV0dXJuIGxuOworICAgIGxuKys7cD16dW1hZGQocCxwKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyogZW1pdCBhIGxvZ2ljYWwgaW5zdHJ1Y3Rpb24gKi8KK3N0YXRpYyB2b2lkIGVtaXRfbG9naWNhbChGSUxFICpmLCBpbnQgYywgc3RydWN0IG9iaiAqcSwgaW50IHQpCit7CisJaWYoenJlZz09YmEpCisJeworCQllbWl0KGYsICJcdHB1c2hcdCVzXG4iLCByZWduYW1lc1txLT5yZWddKTsKKwkJZW1pdChmLCAiXHRtb3ZcdGhsLHNwXG4iKTsKKwkJZW1pdChmLCAiXHQlc1x0YSxbaGxdXG4iLCBsb2dpY2Fsc1tjLU9SXSk7CisJCWVtaXQoZiwgIlx0eGNoZ1x0YSxiXG4iKTsKKwkJZW1pdChmLCAiXHRpbmNcdGhsXG4iKTsKKwkJZW1pdChmLCAiXHQlc1x0YSxbaGxdXG4iLCBsb2dpY2Fsc1tjLU9SXSk7CisJCWVtaXQoZiwgIlx0eGNoZ1x0YSxiXG4iKTsKKwkJZW1pdChmLCAiXHRwb3BcdCVzXG4iLCByZWduYW1lc1txLT5yZWddKTsKKwl9CisJZWxzZQorCXsKKwkJTk9UX0lNUCgpOworCQllbWl0KGYsIjtcdCVzXHQlcywiLGxvZ2ljYWxzW2MtT1JdLHJlZ25hbWVzW3pyZWddKTsKKwkJZW1pdF9vYmooZixxLHQpOworCQllbWl0KGYsIlxuIik7CisJfQorfQorCisvKiBlbWl0IGEgc2hpZnQgaW5zdHJ1Y3Rpb24gKi8KK3N0YXRpYyB2b2lkIGVtaXRfc2hpZnQoRklMRSAqZiwgaW50IGMsIHN0cnVjdCBvYmogKnEsIGludCB0KQoreworCWludCBsMSwgbDIsIGwzOworCWwxID0gKytsYWJlbDsKKwlsMiA9ICsrbGFiZWw7CisJbDMgPSArK2xhYmVsOworCWlmKHpyZWc9PWJhKQorCXsKKwkJZW1pdChmLCAiXHRjbXBcdCVzLDE2XG4iLHJlZ25hbWVzW3EtPnJlZ10pOyAKKwkJZW1pdChmLCAiXHRqY1x0JXMlZFxuIixsYWJwcmVmaXgsbDEpOworCQlpZihjID09IFJTSElGVCAmJiAhKHQmVU5TSUdORUQpKQorCQkJZW1pdChmLCAiXHRtb3ZcdGJhLDB4ZmZmZlxuIik7CisJCWVsc2UKKwkJCWVtaXQoZiwgIlx0bW92XHRiYSwgMFxuIik7CisJCWVtaXQoZiwgIlx0am1wXHQlcyVkXG4iLGxhYnByZWZpeCxsMyk7CisJCWVtaXQoZiwgIiVzJWQ6XG4iLGxhYnByZWZpeCxsMSk7CisJCWVtaXQoZiwgIlx0Y21wXHQlcywwXG4iLHJlZ25hbWVzW3EtPnJlZ10pOyAKKwkJZW1pdChmLCAiXHRqelx0JXMlZFxuIixsYWJwcmVmaXgsbDMpOworCQllbWl0KGYsICIlcyVkOlxuIixsYWJwcmVmaXgsbDIpOworCQlpZihjID09IExTSElGVCkKKwkJeworCQkJZW1pdChmLCAiXHRzaGxcdGFcbiIpOworCQkJZW1pdChmLCAiXHRyb2xjXHRiXG4iKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICh0JlVOU0lHTkVEKQorCQkJCWVtaXQoZiwgIlx0c2hyXHRiXG4iKTsKKwkJCWVsc2UKKwkJCQllbWl0KGYsICJcdHNhclx0YlxuIik7CisJCQllbWl0KGYsICJcdHJvcmNcdGFcbiIpOworCQl9CisJCWVtaXQoZiwgIlx0ZGVjXHQlc1xuIiwgcmVnbmFtZXNbcS0+cmVnXSk7CisJCWVtaXQoZiwgIlx0am56XHQlcyVkXG4iLGxhYnByZWZpeCxsMik7CisJCWVtaXQoZiwgIiVzJWQ6XG4iLGxhYnByZWZpeCxsMyk7CisJfQorCWVsc2UKKwl7CisJCU5PVF9JTVAoKTsKKwkJZW1pdChmLCI7XHQlc1x0JXMsIiwgYXJpdGhtZXRpY3NbYy1MU0hJRlRdLCByZWduYW1lc1t6cmVnXSk7CisJCWVtaXRfb2JqKGYscSx0KTsKKwkJZW1pdChmLCJcbiIpOworCX0KK30KK3N0YXRpYyB2b2lkIGVtaXRfbW92ZV9hcnJheShGSUxFICpmLCBzdHJ1Y3Qgb2JqICp6LCBzdHJ1Y3Qgb2JqICpxLCBpbnQgc2l6ZSkKK3sKKwlpbnQgbDE7CisJbDEgPSArK2xhYmVsOworCWVtaXQoZiwiXHRtb3ZcdGhsLCVkXG4iLCBzaXplKTsKKwlpZihyZWdzW2l4XSkKKwl7CisJCXB1c2hlZCs9MjsKKwkJZW1pdChmLCAiXHRwdXNoXHR4XG4iKTsKKwl9CisJaWYocmVnc1tpeV0pCisJeworCQlwdXNoZWQrPTI7CisJCWVtaXQoZiwgIlx0cHVzaFx0eVxuIik7CisJfQorCWxvYWRfcmVnKGYsIGl5LCBxLCBQT0lOVEVSLCAwKTsKKwl6LT5mbGFncyB8PSBWQVJBRFI7CisJbG9hZF9yZWcoZiwgaXgsIHosIFBPSU5URVIsIDApOworCXotPmZsYWdzICY9IH5WQVJBRFI7CisJCisJZW1pdChmLCAiJXMlZDpcbiIsbGFicHJlZml4LGwxKTsKKwllbWl0KGYsICJcdG1vdlx0W3hdLFt5XVxuIik7CisJZW1pdChmLCAiXHRpbmNcdHhcbiIpOworCWVtaXQoZiwgIlx0aW5jXHR5XG4iKTsKKwllbWl0KGYsICJcdGRlY1x0aGxcbiIpOworCWVtaXQoZiwgIlx0am56Ylx0JXMlZFxuIixsYWJwcmVmaXgsbDEpOworCQorCWlmKHJlZ3NbaXldKQorCXsKKwkJcHVzaGVkLT0yOworCQllbWl0KGYsICJcdHBvcFx0eVxuIik7CisJfQorCWlmKHJlZ3NbaXhdKQorCXsKKwkJcHVzaGVkLT0yOworCQllbWl0KGYsICJcdHBvcFx0eFxuIik7CisJfQorfQorCisvKiBnZW5lcmF0ZXMgdGhlIGZ1bmN0aW9uIGVudHJ5IGNvZGUgKi8KK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX3RvcChGSUxFICpmLHN0cnVjdCBWYXIgKnYsbG9uZyBvZmZzZXQpCit7CisgIGVtaXQoZiwiXG4iKTsKKyAgcnNhdmVzaXplPTA7CisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTikKKyAgeworICAgIC8qCisgICAgaWYoKHYtPmZsYWdzJihJTkxJTkVGVU5DfElOTElORUVYVCkpIT1JTkxJTkVGVU5DKQorICAgICAgZW1pdChmLCI7XHQuZ2xvYmFsXHQlcyVzXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworCSovCisgICAgZW1pdChmLCIlcyVzOlxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgfQorICBlbHNlCisgICAgZW1pdChmLCIlcyVsZDpcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgIGlmKG9mZnNldCkKKyAgICBlbWl0KGYsIlx0c3ViXHRzcCwlbGRcbiIsIG9mZnNldCk7Cit9CisKKy8qIGdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gZXhpdCBjb2RlICovCitzdGF0aWMgdm9pZCBmdW5jdGlvbl9ib3R0b20oRklMRSAqZixzdHJ1Y3QgVmFyICp2LGxvbmcgb2Zmc2V0KQoreworICBpZihvZmZzZXQpCisgICAgZW1pdChmLCJcdGFkZFx0c3AsJWxkXG4iLCBvZmZzZXQpOworICBlbWl0KGYscmV0KTsKK30KKworaW50IGFkZHJlc3NfbnVtYmVyKGNoYXIgKnN0cikKK3sKKwlpZihzdHJuY21wKHN0ciwgIjB4IiwgMik9PTApCisJCXJldHVybiBzdHJ0b2woc3RyLCAwLCAxNik7CisJZWxzZQorCQlyZXR1cm4gYXRvaShzdHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBFbmQgb2YgcHJpdmF0ZSBkYXRhIGFuZCBmdW5jdGlvbnMuICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgaGVscChjaGFyICpzdHIpCit7CisJcHJpbnRmKCJQYXJhbWV0ZXJzOlxuIik7CisJcHJpbnRmKCIgIC1oZWxwICAgICAgICAgICAgIFRoaXMgaGVscCBzY3JlZW4gXG4iKTsKKwlwcmludGYoIiAgLXJhbS12YXJzPTxBRERSPiAgQWRkcmVzcyBmcm9tIHdoaWNoIHdpbGwgc3RhcnQgcmFtIHZhcmlhYmxlcy4gXG4iKTsKKwlwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWUgaXMgMHgxNEUwIFxuIik7CisJcHJpbnRmKCIgIC1pZD08SURfU1RSPiAgICAgIElkZW50aWZpY2F0aW9yIG9mIHRoZSBnYW1lLiBNYXhpbXVtIDQgY2hhcmFjdGVycyBsb25nLlxuIik7CisJcHJpbnRmKCIgIC1uYW1lPTxOQU1FX1NUUj4gIE5hbWUgb2YgdGhlIGdhbWUuIE1heGltdW0gMTIgY2hhcmFjdGVycy4gXG4iKTsJCisJZmZsdXNoKHN0ZG91dCk7CisJZXhpdCgwKTsKK30KKworaW50IHJlZ19wYWlyKGludCByLHN0cnVjdCBycGFpciAqcCkKKy8qIFJldHVybnMgMCBpZiB0aGUgcmVnaXN0ZXIgaXMgbm8gcmVnaXN0ZXIgcGFpci4gSWYgciAgKi8KKy8qIGlzIGEgcmVnaXN0ZXIgcGFpciBub24temVybyB3aWxsIGJlIHJldHVybmVkIGFuZCB0aGUgKi8KKy8qIHN0cnVjdHVyZSBwb2ludGVkIHRvIHAgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgdHdvICAgKi8KKy8qIGVsZW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgIHJldHVybiAwOworfQorCisKK2ludCBpbml0X2NnKHZvaWQpCisvKiAgRG9lcyBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb25zIGZvciB0aGUgY29kZS1nZW5lcmF0b3IuIEdldHMgY2FsbGVkICAqLworLyogIG9uY2UgYXQgdGhlIGJlZ2lubmluZyBhbmQgc2hvdWxkIHJldHVybiAwIGluIGNhc2Ugb2YgcHJvYmxlbXMuICAgICAgKi8KK3sKKwlpbnQgaTsKKwkvKiAgSW5pdGlhbGl6ZSBzb21lIHZhbHVlcyB3aGljaCBjYW5ub3QgYmUgc3RhdGljYWxseSBpbml0aWFsaXplZCAgICovCisJLyogIGJlY2F1c2UgdGhleSBhcmUgc3RvcmVkIGluIHRoZSB0YXJnZXQncyBhcml0aG1ldGljLiAgICAgICAgICAgICAqLworCW1heGFsaWduPWwyem0oMUwpOworCWNoYXJfYml0PWwyem0oOEwpOworCWZvcihpPTA7aTw9TUFYX1RZUEU7aSsrKQorCXsKKwkJc2l6ZXRhYltpXT1sMnptKG1zaXpldGFiW2ldKTsKKwkJYWxpZ25baV09bDJ6bShtYWxpZ25baV0pOworCX0KKwlmb3IoaT0xO2k8PU1BWFI7aSsrKQorCXsKKwkJcmVnc2l6ZVtpXT1sMnptKDJMKTtyZWd0eXBlW2ldPSZpdHlwOworCX0gICAKKworCS8qICBJbml0aWFsaXplIHRoZSBtaW4vbWF4LXNldHRpbmdzLiBOb3RlIHRoYXQgdGhlIHR5cGVzIG9mIHRoZSAgICAgKi8KKwkvKiAgaG9zdCBzeXN0ZW0gbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSB0YXJnZXQgc3lzdGVtIGFuZCB5b3UgbWF5ICovCisJLyogIG9ubHkgdXNlIHRoZSBzbWFsbGVzdCBtYXhpbXVtIHZhbHVlcyBBTlNJIGd1YXJhbnRlZXMgaWYgeW91ICAgICAqLworCS8qICB3YW50IHRvIGJlIHBvcnRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiAgVGhhdCdzIHRoZSByZWFzb24gZm9yIHRoZSBzdWJ0cmFjdGlvbiBpbiB0X21pbltJTlRdLiBMb25nIGNvdWxkICovCisJLyogIGJlIHVuYWJsZSB0byByZXByZXNlbnQgLTIxNDc0ODM2NDggb24gdGhlIGhvc3Qgc3lzdGVtLiAgICAgICAgICAqLworCXRfbWluW0NIQVJdPWwyem0oLTEyOEwpOworCXRfbWluW1NIT1JUXT1sMnptKC0zMjc2OEwpOworCXRfbWluW0lOVF09dF9taW5bU0hPUlRdOworCXRfbWluW0xPTkddPXptc3ViKGwyem0oLTIxNDc0ODM2NDdMKSxsMnptKDFMKSk7CisJdF9taW5bTExPTkddPXptbHNoaWZ0KGwyem0oMUwpLGwyem0oNjNMKSk7CisJdF9taW5bTUFYSU5UXT10X21pbihMTE9ORyk7CisJdF9tYXhbQ0hBUl09dWwyenVtKDEyN0wpOworCXRfbWF4W1NIT1JUXT11bDJ6dW0oMzI3NjdVTCk7CisJdF9tYXhbSU5UXT10X21heFtTSE9SVF07CisJdF9tYXhbTE9OR109dWwyenVtKDIxNDc0ODM2NDdVTCk7CisJdF9tYXhbTExPTkddPXp1bXJzaGlmdCh6dW1rb21wbCh1bDJ6dW0oMFVMKSksdWwyenVtKDFVTCkpOworCXRfbWF4W01BWElOVF09dF9tYXgoTExPTkcpOworCXR1X21heFtDSEFSXT11bDJ6dW0oMjU1VUwpOworCXR1X21heFtTSE9SVF09dWwyenVtKDY1NTM1VUwpOworCXR1X21heFtJTlRdPXR1X21heFtTSE9SVF07CisJdHVfbWF4W0xPTkddPXVsMnp1bSg0Mjk0OTY3Mjk1VUwpOworCXR1X21heFtMTE9OR109enVta29tcGwodWwyenVtKDBVTCkpOworCXR1X21heFtNQVhJTlRdPXRfbWF4KFVOU0lHTkVEfExMT05HKTsKKworCXN0YXJ0X3JhbV92YXJzID0gUkFNX1ZBUlNfQUREUjsKKworCW1lbXNldChnYW1lX2lkLCAwLCBzaXplb2YoZ2FtZV9pZCkpOworCXN0cm5jcHkoZ2FtZV9pZCwgR0FNRV9JRCwgNCk7CisKKwltZW1zZXQoZ2FtZV9uYW1lLCAwLCBzaXplb2YoZ2FtZV9pZCkpOworCXN0cm5jcHkoZ2FtZV9uYW1lLCBHQU1FX05BTUUsIDEyKTsKKworCXRhcmdldF9tYWNyb3M9bWFycmF5OworCisJZm9yKGk9MDsgaTwyNjsgaSsrKQorCQl1c2VkX2ludGVycnVwdFtpXSA9IDA7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGRhbmdlcm91c19JQyhzdHJ1Y3QgSUMgKnApCisvKiAgUmV0dXJucyB6ZXJvIGlmIHRoZSBJQyBwIGNhbiBiZSBzYWZlbHkgZXhlY3V0ZWQgICAgICovCisvKiAgd2l0aG91dCBkYW5nZXIgb2YgZXhjZXB0aW9ucyBvciBzaW1pbGFyIHRoaW5ncy4gICAgICovCisvKiAgdmJjYyBtYXkgZ2VuZXJhdGUgY29kZSBpbiB3aGljaCBub24tZGFuZ2Vyb3VzIElDcyAgICovCisvKiAgYXJlIHNvbWV0aW1lcyBleGVjdXRlZCBhbHRob3VnaCBjb250cm9sLWZsb3cgbWF5ICAgICovCisvKiAgbmV2ZXIgcmVhY2ggdGhlbSAobWFpbmx5IHdoZW4gbW92aW5nIGNvbXB1dGF0aW9ucyAgICovCisvKiAgb3V0IG9mIGxvb3BzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVHlwaWNhbCBJQ3MgdGhhdCBnZW5lcmF0ZSBleGNlcHRpb25zIG9uIHNvbWUgICAgICAgICovCisvKiAgbWFjaGluZXMgYXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gYWNjZXNzZXMgdmlhIHBvaW50ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gZGl2aXNpb24vbW9kdWxvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gb3ZlcmZsb3cgb24gc2lnbmVkIGludGVnZXIvZmxvYXRzICAgICAgICAgICAgICovCit7CisgICBpbnQgYz1wLT5jb2RlOworICAgaWYoKHAtPnExLmZsYWdzJkRSRUZPQkopfHwocC0+cTIuZmxhZ3MmRFJFRk9CSil8fChwLT56LmZsYWdzJkRSRUZPQkopKQorICAgICAgcmV0dXJuIDE7CisgICBpZigoYz09RElWfHxjPT1NT0QpJiYhaXNjb25zdChxMikpCisgICAgICByZXR1cm4gMTsKKyAgIHJldHVybiAwOworfQorCitpbnQgZnJldHVybihzdHJ1Y3QgVHlwICp0KQorLyogIFJldHVybnMgdGhlIHJlZ2lzdGVyIGluIHdoaWNoIHZhcmlhYmxlcyBvZiB0eXBlIHQgYXJlIHJldHVybmVkLiAqLworLyogIElmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgcmV0dXJuZWQgaW4gYSByZWdpc3RlciByZXR1cm5zIDAuICAgICAgICAqLworeworICAgaW50IGY9dC0+ZmxhZ3MmTlE7CisgICBpZihJU1NDQUxBUihmKSYmKChmJk5RKT09SU5UfHwoZiZOUSk9PVNIT1JUfHxmPT1DSEFSKSkKKyAgICAgIHJldHVybiBpeDsKKyAgIHJldHVybiAwOworfQorCitpbnQgcmVnb2soaW50IHIsaW50IHQsaW50IG1vZGUpCisvKiAgUmV0dXJucyAwIGlmIHJlZ2lzdGVyIHIgY2Fubm90IHN0b3JlIHZhcmlhYmxlcyBvZiAgICovCisvKiAgdHlwZSB0LiBJZiB0PT1QT0lOVEVSIGFuZCBtb2RlIT0wIHRoZW4gaXQgcmV0dXJucyAgICovCisvKiAgbm9uLXplcm8gb25seSBpZiB0aGUgcmVnaXN0ZXIgY2FuIHN0b3JlIGEgcG9pbnRlciAgICovCisvKiAgYW5kIGRlcmVmZXJlbmNlIGEgcG9pbnRlciB0byBtb2RlLiAgICAgICAgICAgICAgICAgICovCit7CisgICBpZighSVNTQ0FMQVIodCkpIHJldHVybiAwOworICAgcmV0dXJuIDE7Cit9CisKK2ludCBzaG9ydGN1dChpbnQgYyxpbnQgdCkKK3sKKwkvKiBUT0RPICovCisJLyogZW5hYmxlIHRob3NlIGZvciBtb3JlIG9wdGltaXNlZCBjb2RlICovCisJLyppZihjPT1DT01QQVJFfHxjPT1BTkR8fGM9PU9SfHxjPT1YT1IpIHJldHVybiAxOyovCisJcmV0dXJuIDA7Cit9CisKKworaW50IG11c3RfY29udmVydChpbnQgbyxpbnQgdCxpbnQgY29uc3RfZXhwcikKKy8qICBSZXR1cm5zIHplcm8gaWYgY29kZSBmb3IgY29udmVydGluZyBucCB0byB0eXBlIHQgICAgKi8KKy8qICBjYW4gYmUgb21pdHRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgIGludCBvcD1vJk5RLHRwPXQmTlE7CisgICBpZihvcD09dHApIHJldHVybiAwOworICAgaWYoSVNIV09SRChvcCkmJklTSFdPUkQodHApKSByZXR1cm4gMDsKKyAgIGlmKElTRkxPQVQob3ApfHxJU0ZMT0FUKHRwKSkgcmV0dXJuIDE7CisgICBpZihJU0xXT1JEKG9wKSYmSVNMV09SRCh0cCkpIHJldHVybiAwOworICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgZ2VuX2RzKEZJTEUgKmYsem1heCBzaXplLHN0cnVjdCBUeXAgKnQpCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIDxzaXplPiBieXRlcyBvZiBzdG9yYWdlICovCisvKiAgaW5pdGlhbGl6ZWQgd2l0aCB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIC8qCisgIGlmKG5ld29iaiYmc2VjdGlvbiE9U1BFQ0lBTCkKKyAgICBlbWl0KGYsIiVsZFxuIix6bTJsKHNpemUpKTsKKyAgZWxzZQorICAgIGVtaXQoZiwiXHQuc3BhY2VcdCVsZFxuIix6bTJsKHNpemUpKTsKKyAgbmV3b2JqPTA7CisgICovCisgIGludCBpOworICBpbnQgbnVtX3Blcl9saW5lID0gMTY7CisgIGZvcihpPTA7IGk8c2l6ZTsgKytpKQorICB7CisgICAgIGlmKGkgJSBudW1fcGVyX2xpbmUgPT0gMCkKKyAgICAgZW1pdChmLCAiXHQuZGJcdCIpOworICAgaWYoaSAlIG51bV9wZXJfbGluZSA9PSBudW1fcGVyX2xpbmUgLSAxIHx8IGkgPT0gc2l6ZSAtIDEpCisgICAgICAgZW1pdChmLCAiMFxuIik7CisgICAgIGVsc2UKKyAgICAgICBlbWl0KGYsICIwLCAiKTsKKyAgfQorfQorCit2b2lkIGdlbl9kYyhGSUxFICpmLGludCB0LHN0cnVjdCBjb25zdF9saXN0ICpwKQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSBzdGF0aWMgc3RvcmFnZSAgICAgICAgICAqLworLyogIGluaXRpYWxpemVkIHdpdGggY29uc3QtbGlzdCBwLiAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpZigodCZOUSk9PUNIQVIgfHwgKHQmTlEpPT1TSE9SVCkKKyAgICBlbWl0KGYsIlx0LmRiXHQiKTsKKyAgZWxzZSBpZigodCZOUSk9PUlOVCB8fCAodCZOUSk9PVBPSU5URVIpCisgICAgZW1pdChmLCJcdC5kd1x0Iik7CisgIGVsc2UKKyAgICBlbWl0KGYsIjtcdGRjLiVzICVkXHQiLGR0KHQmTlEpLCB0Jk5RKTsKKyAgICAKKyAgaWYoIXAtPnRyZWUpCisgIHsKKyAgICAvKgorICAgIGlmKElTRkxPQVQodCkpCisgICAgeworICAgICAgLy8gYXVjaCB3aWVkZXIgbmljaHQgc2VociBzY2hvZW4gdW5kIElFRUUgbm9ldGlnCisgICAgICB1bnNpZ25lZCBjaGFyICppcDsKKyAgICAgIGlwPSh1bnNpZ25lZCBjaGFyICopJnAtPnZhbC52ZG91YmxlOworICAgICAgZW1pdChmLCIweCUwMnglMDJ4JTAyeCUwMngiLGlwWzBdLGlwWzFdLGlwWzJdLGlwWzNdKTsKKyAgICAgIGlmKCh0Jk5RKSE9RkxPQVQpCisgICAgICB7CisgICAgICAgIGVtaXQoZiwiLDB4JTAyeCUwMnglMDJ4JTAyeCIsaXBbNF0saXBbNV0saXBbNl0saXBbN10pOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgKi8KKwkgZW1pdHZhbChmLCZwLT52YWwsdCZOVSk7CisJIGlmKCh0Jk5RKT09Q0hBUiAmJiAweDIwIDw9IHAtPnZhbC52Y2hhciAmJiBwLT52YWwudmNoYXIgPD0weDdmKQorCQllbWl0KGYsICJcdDsgJyVjJyIsIChjaGFyKXAtPnZhbC52Y2hhcik7CisgIH0KKyAgZWxzZQorICB7CisgICAgZW1pdF9vYmooZiwmcC0+dHJlZS0+byx0Jk5VKTsKKyAgfQorICBlbWl0KGYsIlxuIik7CisgIC8vbmV3b2JqPTA7Cit9CisKK3ZvaWQgZ2VuX3Zhcl9oZWFkKEZJTEUgKmYsc3RydWN0IFZhciAqdikKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjcmVhdGUgdGhlIGhlYWQgb2YgYSB2YXJpYWJsZSAgKi8KKy8qICBkZWZpbml0aW9uLCBpLmUuIHRoZSBsYWJlbCBhbmQgaW5mb3JtYXRpb24gZm9yICAgICAgKi8KKy8qICBsaW5rYWdlIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGNvbnN0ZmxhZyA9IDA7CisgIGNoYXIgKnNlYzsKKyAgaWYodi0+Y2xpc3QpIGNvbnN0ZmxhZz1pc19jb25zdCh2LT52dHlwKTsKKyAgCisgIGlmKHYtPnRhdHRyJkFMSUdOOCkKKyAgeworCQllbWl0KGYsICJcdC5hbGlnblx0OFxuIik7CisJCS8qCisJCWVtaXQoZiwgIlx0LmVxdVx0dmJjY19fX3VuYWxpZ25lZF9hZGRyZXNzIC5cbiIpOworCQllbWl0KGYsICJcdC5lcXVcdHZiY2NfX191bmFsaWduZWRfYWRkcmVzczIgKHZiY2NfX191bmFsaWduZWRfYWRkcmVzcyArIDcpXG4iKTsKKwkJZW1pdChmLCAiXHQuZXF1XHR2YmNjX19fdW5hbGlnbmVkX2FkZHJlc3MzICh2YmNjX19fdW5hbGlnbmVkX2FkZHJlc3MyICYgNylcbiIpOworCQllbWl0KGYsICJcdC5lcXVcdHZiY2NfX191bmFsaWduZWRfYWRkcmVzczQgKHZiY2NfX191bmFsaWduZWRfYWRkcmVzczIgLSB2YmNjX19fdW5hbGlnbmVkX2FkZHJlc3MzKVxuIik7CisJCWVtaXQoZiwgIlx0Lm9yZ1x0dmJjY19fX3VuYWxpZ25lZF9hZGRyZXNzNFxuIik7CisJCSovCisgIH0KKyAgCisgIGlmKHYtPnRhdHRyJkFMSUdONjQpCisgIHsKKwkJZW1pdChmLCAiXHQuYWxpZ25cdDY0XG4iKTsKKwkJLyoKKwkJZW1pdChmLCAiXHQuZXF1XHR2YmNjX19fdW5hbGlnbmVkX2FkZHJlc3MgLlxuIik7CisJCWVtaXQoZiwgIlx0LmVxdVx0dmJjY19fX3VuYWxpZ25lZF9hZGRyZXNzMiAodmJjY19fX3VuYWxpZ25lZF9hZGRyZXNzICsgNjMpXG4iKTsKKwkJZW1pdChmLCAiXHQuZXF1XHR2YmNjX19fdW5hbGlnbmVkX2FkZHJlc3MzICh2YmNjX19fdW5hbGlnbmVkX2FkZHJlc3MyICYgNjMpXG4iKTsKKwkJZW1pdChmLCAiXHQuZXF1XHR2YmNjX19fdW5hbGlnbmVkX2FkZHJlc3M0ICh2YmNjX19fdW5hbGlnbmVkX2FkZHJlc3MyIC0gdmJjY19fX3VuYWxpZ25lZF9hZGRyZXNzMylcbiIpOworCQllbWl0KGYsICJcdC5vcmdcdHZiY2NfX191bmFsaWduZWRfYWRkcmVzczRcbiIpOworCQkqLworICB9CisgIAorICBpZigvKih2LT50YXR0ciZST00pIHx8Ki8gLypjb25zdGZsYWcqLyBpc19jb25zdCh2LT52dHlwKSkKKyAgeworCS8vZW1pdChmLCAiXG5cdDsgQ09OU1RcbiIpOworCWlmKCFsYXN0X3dhc19yb20pCisJeworCQllbWl0KGYsICJcdC5lcXVcdHZiY2NfX19zYXZlZF9yb21fc2hhZG93IC5cbiIpOworCQllbWl0KGYsICJcdC5vcmdcdHZiY2NfX19zYXZlZF9yb21fc2hhZG93IC0gJWRcbiIsIHJhbV9yb21fZGlzdGFuY2UpOworCQllbWl0KGYsICJcdC5lcXVcdHZiY2NfX19zYXZlZF9yYW1fYWRkciAuXG4iKTsKKwkJZW1pdChmLCAiXHQub3JnXHR2YmNjX19fc2F2ZWRfcm9tX2FkZHJcbiIpOworCQlsYXN0X3dhc19yb20gPSAxOworCX0KKyAgfQorICBlbHNlCisgIHsKKwkvL2VtaXQoZiwgIjsgaW4gcmFtISEhICAlcyVsZDogICVzJXM6IFxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpLCBpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKwlpZihsYXN0X3dhc19yb20pCisJeworCQllbWl0KGYsICJcdC5lcXVcdHZiY2NfX19zYXZlZF9yb21fYWRkciAuXG4iKTsKKwkJaWYoIXJhbV92YXJzX2luaXRpYWxpemVkKQorCQl7CisJCQllbWl0KGYsICJcdC5vcmdcdCVkXG4iLCBzdGFydF9yYW1fdmFycyk7CisJCQllbWl0KGYsICJcdC5lcXVcdHZiY2NfX19zYXZlZF9yYW1fYWRkciAuXG4iKTsKKwkJCXJhbV92YXJzX2luaXRpYWxpemVkID0gMTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWVtaXQoZiwgIlx0Lm9yZ1x0dmJjY19fX3NhdmVkX3JhbV9hZGRyXG4iKTsKKwkJfQorCQlsYXN0X3dhc19yb20gPSAwOworCX0KKwllbHNlCisJeworCQllbWl0KGYsICJcdC5lcXVcdHZiY2NfX19zYXZlZF9yb21fc2hhZG93IC5cbiIpOworCQllbWl0KGYsICJcdC5vcmdcdHZiY2NfX19zYXZlZF9yb21fc2hhZG93IC0gJWRcbiIsIHJhbV9yb21fZGlzdGFuY2UpOworCQllbWl0KGYsICJcdC5lcXVcdHZiY2NfX19zYXZlZF9yYW1fYWRkciAuXG4iKTsKKwl9CisgIH0KKyAgCisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQykKKyAgeworICAgIGlmKCFJU0ZVTkModi0+dnR5cC0+ZmxhZ3MpKQorCXsKKwkJLyoKKwkJaWYoIXNwZWNpYWxfc2VjdGlvbihmLHYpKXsKKwkJICBpZih2LT5jbGlzdCYmKCFjb25zdGZsYWd8fChnX2ZsYWdzWzJdJlVTRURGTEFHKSkmJnNlY3Rpb24hPURBVEEpe2VtaXQoZixkYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1EQVRBO30KKwkJICBpZih2LT5jbGlzdCYmY29uc3RmbGFnJiYhKGdfZmxhZ3NbMl0mVVNFREZMQUcpJiZzZWN0aW9uIT1ST0RBVEEpe2VtaXQoZixyb2RhdGFuYW1lKTtpZihmKSBzZWN0aW9uPVJPREFUQTt9CisJCSAgaWYoIXYtPmNsaXN0JiZzZWN0aW9uIT1CU1Mpe2VtaXQoZixic3NuYW1lKTtpZihmKSBzZWN0aW9uPUJTUzt9CisJCX0KKwkJaWYodi0+Y2xpc3R8fHNlY3Rpb249PVNQRUNJQUwpeworCQkgIGdlbl9hbGlnbihmLGZhbGlnbih2LT52dHlwKSk7CisJCSAgZW1pdChmLCIlcyVsZDpcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisJCX1lbHNlCisJCSAgZW1pdChmLCJcdC5sY29tbVx0JXMlbGQsIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKwkJbmV3b2JqPTE7CisJCSovCisJCWVtaXQoZiwiJXMlbGQ6XG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworCX0KKyAgfQorICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pCisgIHsKKyAgICAvL2VtaXQoZiwiXHQuZ2xvYmxcdCVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgaWYodi0+ZmxhZ3MmKERFRklORUR8VEVOVEFUSVZFKSl7CisgICAgICAvKgorICAgICAgaWYoIXNwZWNpYWxfc2VjdGlvbihmLHYpKXsKKyAgICAgICAgaWYodi0+Y2xpc3QmJighY29uc3RmbGFnfHwoZ19mbGFnc1syXSZVU0VERkxBRykpJiZzZWN0aW9uIT1EQVRBKXtlbWl0KGYsZGF0YW5hbWUpO2lmKGYpIHNlY3Rpb249REFUQTt9CisgICAgICAgIGlmKHYtPmNsaXN0JiZjb25zdGZsYWcmJiEoZ19mbGFnc1syXSZVU0VERkxBRykmJnNlY3Rpb24hPVJPREFUQSl7ZW1pdChmLHJvZGF0YW5hbWUpO2lmKGYpIHNlY3Rpb249Uk9EQVRBO30KKyAgICAgICAgaWYoIXYtPmNsaXN0JiZzZWN0aW9uIT1CU1Mpe2VtaXQoZixic3NuYW1lKTtpZihmKSBzZWN0aW9uPUJTUzt9CisgICAgICB9CisgICAgICBpZih2LT5jbGlzdHx8c2VjdGlvbj09U1BFQ0lBTCl7CisgICAgICAgIGdlbl9hbGlnbihmLGZhbGlnbih2LT52dHlwKSk7CisgICAgICAgIGVtaXQoZiwiJXMlczpcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgICB9ZWxzZQorICAgICAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXMlc1xuXHQuJXNjb21tXHQlcyVzLCIsaWRwcmVmaXgsdi0+aWRlbnRpZmllciwoVVNFX0NPTU1PTlM/IiI6ImwiKSxpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICAgIG5ld29iaj0xOworICAgICAgKi8KKyAgICAgIGVtaXQoZiwiJXMlczpcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgfQorICB9CisgIGlmKCFsYXN0X3dhc19yb20pCisgIHsKKwllbWl0KGYsICJcdC5vcmdcdHZiY2NfX19zYXZlZF9yYW1fYWRkciArICVkXG4iLCByYW1fcm9tX2Rpc3RhbmNlKTsJCisgIH0KK30KKworc3RhdGljIGludCBpbml0X2R1bXAgPSAwOworCisKKy8qICBUaGUgbWFpbiBjb2RlLWdlbmVyYXRpb24gcm91dGluZS4gICAgICAgICAgICAgICAgICAgKi8KKy8qICBmIGlzIHRoZSBzdHJlYW0gdGhlIGNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8uICAgICAgKi8KKy8qICBwIGlzIGEgcG9pbnRlciB0byBhIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBJQ3MgICAgICAgKi8KKy8qICBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBib2R5IHRvIGdlbmVyYXRlIGNvZGUgZm9yLiAgKi8KKy8qICB2IGlzIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBvZmZzZXQgaXMgdGhlIHNpemUgb2YgdGhlIHN0YWNrZnJhbWUgdGhlIGZ1bmN0aW9uICAgKi8KKy8qICBuZWVkcyBmb3IgbG9jYWwgdmFyaWFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ZvaWQgZ2VuX2NvZGUoRklMRSAqZixzdHJ1Y3QgSUMgKnAsc3RydWN0IFZhciAqdix6bWF4IG9mZnNldCkKK3sKKyAgICBpbnQgYywgdCwgdDIsIGksIGNtcF90eXBlID0gMDsKKyAgICBzdHJ1Y3QgSUMgKm07CisKKwlpZighaW5pdF9kdW1wKQorCXsKKwkJaW5pdF9kdW1wID0gMTsKKwkJZW1pdF9zdGFydChmKTsKKwl9CisJCisJaWYoc3RyY21wKHYtPmlkZW50aWZpZXIsIm1haW4iKT09MCkKKwl7CisJCWVtaXRfZW5kKGYpOworCX0KKwkJCisgICAgbG9jYWxzaXplPSh6bTJsKG9mZnNldCkpOworICAgIGZvcihtPXA7bTttPW0tPm5leHQpCisgICAgeworCQljPW0tPmNvZGU7dD1tLT50eXBmJk5VOworCQkvKiBjb252ZXJ0IE1VTFQvRElWL01PRCB3aXRoIHBvd2VycyBvZiB0d28gKi8KKwkJaWYoKHQmTlEpPD1MT05HJiYobS0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QmJih0Jk5RKTw9TE9ORyYmKGM9PU1VTFR8fCgoYz09RElWfHxjPT1NT0QpJiYodCZVTlNJR05FRCkpKSl7CisJCSAgZXZhbF9jb25zdCgmbS0+cTIudmFsLHQpOworCQkgIGk9cG9mMih2bWF4KTsKKwkJICBpZihpKXsKKwkJCWlmKGM9PU1PRCl7CisJCQkgIHZtYXg9em1zdWIodm1heCxsMnptKDFMKSk7CisJCQkgIG0tPmNvZGU9QU5EOworCQkJfWVsc2V7CisJCQkgIHZtYXg9bDJ6bShpLTEpOworCQkJICBpZihjPT1ESVYpIG0tPmNvZGU9UlNISUZUOyBlbHNlIG0tPmNvZGU9TFNISUZUOworCQkJfQorCQkJYz1tLT5jb2RlOworCQkJZ3ZhbC52bWF4PXZtYXg7CisJCQlldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CisJCQlpZihjPT1BTkQpeworCQkJICBpbnNlcnRfY29uc3QoJm0tPnEyLnZhbCx0KTsKKwkJCX1lbHNleworCQkJICBpbnNlcnRfY29uc3QoJm0tPnEyLnZhbCxJTlQpOworCQkJICBtLT50eXBmMj1JTlQ7CisJCQl9CisJCSAgfQorCQl9CisgICAgICAgIC8vaWYoYz09Q0FMTCYmYXJnc2l6ZTx6bTJsKG0tPnEyLnZhbC52bWF4KSkgYXJnc2l6ZT16bTJsKG0tPnEyLnZhbC52bWF4KTsKKyAgICB9CisgCS8vZW1pdChmLCAiOyVzXG4iLCB2LT5pZGVudGlmaWVyKTsKKwkKKwlpZih2LT50YXR0ciZJTlRFUlJVUFQpCisJeworCQljaGFyICpwOworCQkKKwkJZm9yKHAgPSB2LT5pZGVudGlmaWVyOyAqcDsgKytwKQorCQkJaWYoaXNkaWdpdCgqcCkpCisJCQkJYnJlYWs7CisJCWlmKCEqcCkKKwkJeworCQkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogSW50ZXJydXB0IHJvdXRpbmUgd2l0aCBubyBpbnRlcnJ1cHQgbnVtYmVyIVxuIik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpbnQgbnVtID0gYXRvaShwKTsKKwkJCWlmKHVzZWRfaW50ZXJydXB0W251bV0pCisJCQl7CisJCQkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogSW50ZXJydXB0ICVkIGRlZmluZWQgdHdpY2UhXG4iLCBudW0pOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXVzZWRfaW50ZXJydXB0W251bV0gPSAxOworCQkJCWVtaXQoZiwgIiVzJWQ6XG4iLCBpbnRfaGFuZGxlcl9wcmVmaXgsIG51bSk7CisJCQkJCisJCQkJZW1pdChmLCAiXHRwdXNoYXhcbiIpOworCQkJCXJldD0iXHRwb3BheFxuXHRyZXRpXG4iOworCQkJfQorCQl9CisJfQorCWVsc2UKKwkJcmV0PSJcdHJldFxuIjsKKyAKKyAgICBmdW5jdGlvbl90b3AoZix2LGxvY2Fsc2l6ZSk7CisgICAgcHVzaGVkPTA7CisgCQorCisgICAgZm9yKDtwO3A9cC0+bmV4dCkKKyAgICB7CisJCWlmKGRlYnVnX3ByaW50cykKKwkJeworCQkJZnByaW50ZihmLCI7Ozs7Iik7CisJCQlwcmljMihmLHApOworCQl9CisJCQorCQljPXAtPmNvZGU7CisJCXQ9cC0+dHlwZiZOVTsKKwkJdDI9cC0+dHlwZjImTlU7CisJCQorCQlpZihjPT1BTExPQ1JFRykgCisJCXsKKwkJCXJlZ3NbcC0+cTEucmVnXT0xOworCQkJY29udGludWU7CisJCX0KKwkJaWYoYz09RlJFRVJFRykgCisJCXsKKwkJCXJlZ3NbcC0+cTEucmVnXT0wOworCQkJY29udGludWU7CisJCX0KKwkJaWYoYz09QlJBKXsKKwkJICAvKgorCQkgIGlmKHQ9PWV4aXRfbGFiZWwpCisJCQllbWl0KGYscmV0KTsKKwkJICBlbHNlCisJCSAgKi8KKwkJCWVtaXQoZiwiXHRqbXBcdCVzJWRcbiIsbGFicHJlZml4LHQpOworCQkgIGNvbnRpbnVlOworCQl9CisJCWlmKGM+PUJFUSYmYzxCUkEpeworCQkJaW50IHRtcF9sYWJlbCA9ICsrbGFiZWw7CisJCQkvKiBGSVhNRSAqLworCQkJLyogc29tZSBvZiB0aGUgY29tcGFyaXNzaW9ucyBjYW4gYmUgYWxzbyAxNi1iaXQganVtcHMgKi8KKwkJCWlmKGRlYnVnX3ByaW50cykKKwkJCQllbWl0KGYsICI7IHQ6IDB4JXggKDB4JXgpICBzbzogIiwgY21wX3R5cGUsIFVOU0lHTkVEKTsKKwkJCWlmKGNtcF90eXBlJlVOU0lHTkVEKQorCQkJeworCQkJCWlmKGRlYnVnX3ByaW50cykKKwkJCQkJZW1pdChmLCAiVU5TSUdORURcbiIpOworCQkJCWlmKGMgPCBCTEUpCisJCQkJeworCQkJCQllbWl0KGYsIlx0aiVzXHQlcyVkXG4iLHVjY3MyW2MtQkVRXSxsYWJwcmVmaXgsdG1wX2xhYmVsKTsKKwkJCQkJZW1pdChmLCJcdGptcFx0JXMlZFxuIixsYWJwcmVmaXgsdCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmKGM9PUJMRSkKKwkJCQkJeworCQkJCQkJZW1pdChmLCJcdGp6XHQlcyVkXG4iLGxhYnByZWZpeCx0KTsKKwkJCQkJCWVtaXQoZiwiXHRqJXNcdCVzJWRcbiIsdWNjczJbYy1CRVFdLGxhYnByZWZpeCx0KTsKKwkJCQkJfQorCQkJCQllbHNlIC8qIEJHVCAqLworCQkJCQl7CisJCQkJCQllbWl0KGYsIlx0anpcdCVzJWRcbiIsbGFicHJlZml4LHRtcF9sYWJlbCk7CisJCQkJCQllbWl0KGYsIlx0aiVzXHQlcyVkXG4iLHVjY3MyW2MtQkVRXSxsYWJwcmVmaXgsdCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYoZGVidWdfcHJpbnRzKQorCQkJCQllbWl0KGYsICJTSUdORURcbiIpOworCQkJCWVtaXQoZiwiXHRqJXNcdCVzJWRcbiIsY2NzMltjLUJFUV0sbGFicHJlZml4LHRtcF9sYWJlbCk7CisJCQkJZW1pdChmLCJcdGptcFx0JXMlZFxuIixsYWJwcmVmaXgsdCk7CisJCQl9CisJCQllbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCx0bXBfbGFiZWwpOworCQkJY29udGludWU7CisJCX0KKwkJaWYoYz09TU9WRVRPUkVHKXsKKwkJICBsb2FkX3JlZyhmLHAtPnoucmVnLCZwLT5xMSxyZWd0eXBlW3AtPnoucmVnXS0+ZmxhZ3MsIDApOworCQkgIGNvbnRpbnVlOworCQl9CisJCWlmKGM9PU1PVkVGUk9NUkVHKXsKKwkJICBzdG9yZV9yZWcoZixwLT56LnJlZywmcC0+cTEscmVndHlwZVtwLT56LnJlZ10tPmZsYWdzKTsKKwkJICBjb250aW51ZTsKKwkJfQorCQlpZihjPT1DQUxMKXsJCQkJCQorCQkJaWYoKHAtPnExLmZsYWdzICYgKFZBUnxEUkVGT0JKKSkgPT0gVkFSICYmCisJCQkJcC0+cTEudi0+ZmkgJiYKKwkJCQlwLT5xMS52LT5maS0+aW5saW5lX2FzbSkKKwkJCXsKKwkJCQllbWl0X2lubGluZV9hc20oZixwLT5xMS52LT5maS0+aW5saW5lX2FzbSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZW1pdChmLCJcdGNhbGxcdCIpOworCQkJCWlmKHAtPnExLnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQykKKwkJCQl7CisJCQkJCWVtaXQoZiwiJXMlbGQiLGxhYnByZWZpeCx6bTJsKHAtPnExLnYtPm9mZnNldCkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQllbWl0KGYsIiVzJXMiLGlkcHJlZml4LHAtPnExLnYtPmlkZW50aWZpZXIpOworCQkJCX0KKwkJCQllbWl0KGYsIlxuIik7CisJCQl9CQkgIAorCQkJaWYocHVzaGVkICE9IDApCisJCQkJZW1pdChmLCJcdGFkZFx0c3AsJWxkXG4iLCBwdXNoZWQpOwkJCQorCQkJcHVzaGVkID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCQorCQlpZihjPT1BRERSRVNTKQorCQl7CisJCQlpZihpc3JlZyh6KSkKKwkJCQl6cmVnPXAtPnoucmVnOworCQkJZWxzZQorCQkJCXpyZWc9YmE7CisJCQlsb2FkX2FkZHJlc3MoZix6cmVnLCZwLT5xMSxQT0lOVEVSKTsKKwkJCXNhdmVfcmVzdWx0KGYscCk7CisJCQljb250aW51ZTsKKwkJfQorCQkJIAorCQlwPXByZWxvYWQoZixwKTsKKwkJYz1wLT5jb2RlOworCQkKKwkJaWYoYz09U1VCUEZQKSBjPVNVQjsKKwkJaWYoYz09QURESTJQKSBjPUFERDsKKwkJaWYoYz09U1VCSUZQKSBjPVNVQjsKKwkJCisJCWlmKGM9PUNPTlZFUlQpCisJCXsKKwkJCS8qIEZJWE1FICovCisJCQlpZihJU0ZMT0FUKHExdHlwKHApKXx8SVNGTE9BVCh6dHlwKHApKSkgaWVycm9yKDApOworCQkJbG9hZF9yZWcoZix6cmVnLCZwLT5xMSx0LCB0Mik7CisJCQlpZihzaXpldGFiW3ExdHlwKHApJk5RXTxzaXpldGFiW3p0eXAocCkmTlFdICYmICh6dHlwKHApJk5RJlBPSU5URVIpIT1QT0lOVEVSKQorCQkJeworCQkJCWlmKHpyZWcgPT0gYmEgJiYgbXNpemV0YWJbcTF0eXAocCkmTlFdID09IDEpCisJCQkJeworCQkJCQlpZihxMXR5cChwKSZVTlNJR05FRCkKKwkJCQkJCWVtaXQoZiwiXHRtb3ZcdGIsMFxuIik7CisJCQkJCWVsc2UKKwkJCQkJCWVtaXQoZiwiXHRleFx0YmEsYVxuIixkdChxMXR5cChwKSkscmVnbmFtZXNbenJlZ10pOworCQkJCX0KKwkJCQllbHNlCisJCQkJCU5PVF9JTVAoKTsKKwkJCX0KKwkJCXNhdmVfcmVzdWx0KGYscCk7CisJCQljb250aW51ZTsKKwkJfQorCQkKKwkJaWYoYz09U0VUUkVUVVJOKXsKKwkJICBsb2FkX3JlZyhmLHAtPnoucmVnLCZwLT5xMSx0LCAwKTsKKwkJICBjb250aW51ZTsKKwkJfQorCQkKKwkJaWYoYz09R0VUUkVUVVJOKXsKKwkJICBpZihwLT5xMS5yZWcpeworCQkJenJlZz1wLT5xMS5yZWc7CisJCQlzYXZlX3Jlc3VsdChmLHApOworCQkgIH1lbHNlCisJCQlwLT56LmZsYWdzPTA7CisJCSAgY29udGludWU7CisJCX0KKwkgCisJCWlmKGM9PUFTU0lHTikKKwkJeworCQkJaWYoZGVidWdfcHJpbnRzKQorCQkJCWVtaXQoZiwiOyBBU1NJR04gc3RhcnRcbiIpOworCQkJaWYodD09MCkgCisJCQkJaWVycm9yKDApOworCQkJaWYodD09QVJSQVkpCisJCQl7CisJCQkJZW1pdF9tb3ZlX2FycmF5KGYsICZwLT56LCAmcC0+cTEsIHAtPnEyLnZhbC52bWF4KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlsb2FkX3JlZyhmLHpyZWcsJnAtPnExLHQsIDApOworCQkJCXNhdmVfcmVzdWx0KGYscCk7CisJCQl9CisJCQlpZihkZWJ1Z19wcmludHMpCisJCQkJZW1pdChmLCI7IEFTU0lHTiBlbmRcbiIpOworCQkJY29udGludWU7CisJCX0KKwkJCisJCWlmKGM9PVBVU0gpCisJCXsKKwkJCWlmKHQ9PTApIGllcnJvcigwKTsKKwkJCXB1c2hlZCs9em0ybChwLT5xMi52YWwudm1heCk7CisJCQkvL2VtaXQoZiwiXHRtb3ZcdFtzcCslbGRdLCIscHVzaGVkKTsKKwkJCWVtaXQoZiwgIlx0cHVzaFx0Iik7CisJCQllbWl0X29iaihmLCZwLT5xMSx0KTsKKwkJCWVtaXQoZiwiXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCQorCQlpZihjPT1MQUJFTCkgCisJCXsKKwkJCWVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LHQpOworCQkJY29udGludWU7CisJCX0KKworCQlpZihjPT1LT01QTEVNRU5UKQorCQl7CisJCQlsb2FkX3JlZyhmLGJhLCZwLT5xMSx0LCAwKTsKKwkJCWVtaXQoZiwiXHRub3RcdGFcbiIpOworCQkJZW1pdChmLCJcdG5vdFx0YlxuIik7CisJCQlzYXZlX3Jlc3VsdChmLHApOworCQkJY29udGludWU7CisJCX0KKwkJCisJCWlmKGM9PU1JTlVTKQorCQl7CisJCQlsb2FkX3JlZyhmLGJhLCZwLT5xMSx0LCAwKTsKKwkJCWVtaXQoZiwiXHRtb3ZcdGhsLDBcbiIpOworCQkJZW1pdChmLCJcdHN1Ylx0aGwsYmFcbiIpOworCQkJZW1pdChmLCJcdG1vdlx0YmEsaGxcbiIpOworCQkJc2F2ZV9yZXN1bHQoZixwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCQorCQlpZihjPT1URVNUKQorCQl7CisJCQlpZihxMXJlZyAhPSBiYSkKKwkJCXsKKwkJCQllbWl0KGYsICJcdG1vdlx0YmEsIik7CisJCQkJZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJCQkJZW1pdChmLCAiXG4iKTsKKwkJCX0KKwkJCWVtaXQoZiwiXHRjbXBcdCVzLDBcbiIsIChtc2l6ZXRhYlsodCZOUSldPT0xKT8iYSI6ImJhIik7CisJCQljb250aW51ZTsKKwkJfQorCQkKKwkJaWYoYz09Q09NUEFSRSkKKwkJeworCQkJY21wX3R5cGUgPSB0OworCQkJaWYocTFyZWcgIT0gYmEpCisJCQl7CisJCQkJZW1pdChmLCAiXHRtb3ZcdGJhLCIpOworCQkJCWVtaXRfb2JqKGYsJnAtPnExLHQpOworCQkJCWVtaXQoZiwgIlxuIik7CisJCQl9CisJCQllbWl0KGYsIlx0Y21wXHQlcywiLCAobXNpemV0YWJbKHQmTlEpXT09MSk/ImEiOiJiYSIpOworCQkJZW1pdF9vYmooZiwmcC0+cTIsdCk7CisJCQllbWl0KGYsIlxuIik7CisJCQljb250aW51ZTsKKwkJfQorICAgIAorCQlpZigoYz49T1ImJmM8PUFORCl8fChjPj1MU0hJRlQmJmM8PU1PRCkpCisJCXsKKwkJCWxvYWRfcmVnKGYsIHpyZWcsICZwLT5xMSwgdCwgMCk7CisJCQlpZihjPj1PUiYmYzw9QU5EKQorCQkJeworCQkJCWVtaXRfbG9naWNhbChmLCBjLCAmcC0+cTIsIHQpOworCQkJfQorCQkJZWxzZSBpZihjPj1MU0hJRlQmJmM8PVJTSElGVCkKKwkJCXsKKwkJCQllbWl0X3NoaWZ0KGYsIGMsICZwLT5xMiwgdCk7CisJCQl9CisJCQllbHNlIGlmKGM9PU1VTFQpCisJCQl7CisJCQkJbG9hZF9yZWcoZiwgYmEsICZwLT5xMSwgdCwgMCk7CisJCQkJbG9hZF9yZWcoZiwgaGwsICZwLT5xMiwgdCwgMCk7CisJCQkJZW1pdChmLCAiXHRjYWxsXHR2YmNjX19fbXVsMTZ4MTZfMTZcbiIpOworCQkJfQorCQkJZWxzZSBpZihESVYgPD1jICYmIGMgPD1NT0QpCisJCQl7CisJCQkJbG9hZF9yZWcoZiwgYmEsICZwLT5xMSwgdCwgMCk7CisJCQkJbG9hZF9yZWcoZiwgaGwsICZwLT5xMiwgdCwgMCk7CisJCQkJZW1pdChmLCAiXHRjYWxsXHR2YmNjX19fZGl2X21vZDE2eDE2XzE2XG4iKTsKKwkJCQlpZihjPT1NT0QpCisJCQkJCWVtaXQoZiwgIlx0bW92XHRiYSwgaGxcbiIpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmKHpyZWcgIT0gYmEpCisJCQkJCWVtaXQoZiwgIlx0bW92XHRiYSwlc1xuIiwgcmVnbmFtZXNbenJlZ10pOworCQkJCWVtaXQoZiwiXHQlc1x0JXMsIixhcml0aG1ldGljc1tjLUxTSElGVF0scmVnbmFtZXNbYmFdKTsKKwkJCQllbWl0X29iaihmLCZwLT5xMix0KTsKKwkJCQllbWl0KGYsIlxuIik7CisJCQkJaWYoenJlZyAhPSBiYSkKKwkJCQkJZW1pdChmLCAiXHRtb3ZcdCVzLGJhXG4iLCByZWduYW1lc1t6cmVnXSk7CisJCQl9CisJCQlzYXZlX3Jlc3VsdChmLHApOworCQkJY29udGludWU7CisJCX0KKwkJIAorCQlmcHJpbnRmKGYsIjtcdE5PVCBJTVBMRU1FTlRFRCBJTlNUUlVDVElPTiA+Pj4gJXMgPDw8IChjb2RlOiVkKVxuIiwgZW5hbWVbcC0+Y29kZV0sIHAtPmNvZGUpOworCQlmcHJpbnRmKGYsIjs7OzsiKTsKKwkJcHJpYzIoZixwKTsKKyAgICB9CisKKyAgICBmdW5jdGlvbl9ib3R0b20oZix2LGxvY2Fsc2l6ZSk7Cit9CisKK3ZvaWQgY2xlYW51cF9jZyhGSUxFICpmKQoreworfQorCit2b2lkIGluaXRfZGIoRklMRSAqZikKK3sKK30KK3ZvaWQgY2xlYW51cF9kYihGSUxFICpmKQoreworfSAKZGlmZiAtLWdpdCBhL21hY2hpbmVzL3BtL21hY2hpbmUuZHQgYi9tYWNoaW5lcy9wbS9tYWNoaW5lLmR0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5MjZmNTEKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9wbS9tYWNoaW5lLmR0CkBAIC0wLDAgKzEsMTYgQEAKK1M4QlMKK1M4QlUKK1MxNkJTQkUgUzE2QlNMRQorUzE2QlVCRSBTMTZCVUxFCitTMTZCU0JFIFMxNkJTTEUKK1MxNkJVQkUgUzE2QlVMRQorUzMyQlNCRSBTMzJCU0xFCitTMzJCVUJFIFMzMkJVTEUKK1M2NEJTQkUgUzY0QlNMRQorUzY0QlVCRSBTNjRCVUxFCitTMzJCSUVFRUJFCitTNjRCSUVFRUJFCitTNjRCSUVFRUJFCitTMTZCVWJFIFMxNkJVTEUKKworCmRpZmYgLS1naXQgYS9tYWNoaW5lcy9wbS9tYWNoaW5lLmggYi9tYWNoaW5lcy9wbS9tYWNoaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmI0YmVjNgotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL3BtL21hY2hpbmUuaApAQCAtMCwwICsxLDU1IEBACisKKworI2luY2x1ZGUgImR0LmgiCisKKworCisvKiAgVGhlIG51bWJlciBvZiByZWdpc3RlcnMgb2YgdGhlIHRhcmdldCBtYWNoaW5lLiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1BWFIgMgorCisvKiAgTnVtYmVyIG9mIGNvbW1hbmRsaW5lLW9wdGlvbnMgdGhlIGNvZGUtZ2VuZXJhdG9yIGFjY2VwdHMuICAgICAgICovCisjZGVmaW5lIE1BWEdGIDQKKworCisvKiAgSWYgdGhpcyBpcyBzZXQgdG8gemVybyB2YmNjIHdpbGwgbm90IGdlbmVyYXRlIElDcyB3aGVyZSB0aGUgICAgICovCisvKiAgdGFyZ2V0IG9wZXJhbmQgaXMgdGhlIHNhbWUgYXMgdGhlIDJuZCBzb3VyY2Ugb3BlcmFuZC4gICAgICAgICAgICovCisvKiAgVGhpcyBjYW4gc29tZXRpbWVzIHNpbXBsaWZ5IHRoZSBjb2RlLWdlbmVyYXRvciwgYnV0IHVzdWFsbHkgICAgICovCisvKiAgdGhlIGNvZGUgaXMgYmV0dGVyIGlmIHRoZSBjb2RlLWdlbmVyYXRvciBhbGxvd3MgaXQuICAgICAgICAgICAgICovCisjZGVmaW5lIFVTRVEyQVNaIDEKKworLyogIFRoaXMgc3BlY2lmaWVzIHRoZSBzbWFsbGVzdCBpbnRlZ2VyIHR5cGUgdGhhdCBjYW4gYmUgYWRkZWQgdG8gYSAqLworLyogIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNSU5BRERJMlAgSU5UCisKKy8qICBJZiB0aGUgYnl0ZXMgb2YgYW4gaW50ZWdlciBhcmUgb3JkZXJlZCBtb3N0IHNpZ25pZmljYW50IGJ5dGUgICAgKi8KKy8qICBieXRlIGZpcnN0IGFuZCB0aGVuIGRlY3JlYXNpbmcgc2V0IEJJR0VORElBTiB0byAxLiAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHRU5ESUFOIDAKKworLyogIElmIHRoZSBieXRlcyBvZiBhbiBpbnRlZ2VyIGFyZSBvcmRlcmVkIGxlc3Qgc2lnbmlmaWNhbnQgYnl0ZSAgICAqLworLyogIGJ5dGUgZmlyc3QgYW5kIHRoZW4gaW5jcmVhc2luZyBzZXQgTElUVExFRU5ESUFOIHRvIDEuICAgICAgICAgICAqLworI2RlZmluZSBMSVRUTEVFTkRJQU4gMQorCisvKiAgTm90ZSB0aGF0IEJJR0VORElBTiBhbmQgTElUVExFRU5ESUFOIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICAgICovCisKKy8qICBJZiBzd2l0Y2gtc3RhdGVtZW50cyBzaG91bGQgYmUgZ2VuZXJhdGVkIGFzIGEgc2VxdWVuY2Ugb2YgICAgICAgKi8KKy8qICBTVUIsVFNULEJFUSBJQ3MgcmF0aGVyIHRoYW4gQ09NUEFSRSxCRVEgSUNzIHNldCB0aGlzIHRvIDEuICAgICAgKi8KKy8qICBUaGlzIGNhbiB5aWVsZCBiZXR0ZXIgY29kZSBvbiBzb21lIG1hY2hpbmVzLiAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1dJVENIU1VCUyAxCisKKy8qICBJbiBvcHRpbWl6aW5nIGNvbXBpbGF0aW9uIGNlcnRhaW4gbGlicmFyeSBtZW1jcHkvc3RyY3B5LWNhbGxzICAgKi8KKy8qICB3aXRoIGxlbmd0aCBrbm93biBhdCBjb21waWxlLXRpbWUgd2lsbCBiZSBpbmxpbmVkIHVzaW5nIGFuICAgICAgKi8KKy8qICBBU1NJR04tSUMgaWYgdGhlIHNpemUgaXMgbGVzcyBvciBlcXVhbCB0byBJTkxJTkVNRU1DUFkuICAgICAgICAgKi8KKy8qICBUaGUgdHlwZSB1c2VkIGZvciB0aGUgQVNTSUdOLUlDIHdpbGwgYmUgVU5TSUdORUR8Q0hBUi4gICAgICAgICAgKi8KKyNkZWZpbmUgSU5MSU5FTUVNQ1BZIDEwMjQKKworLyogc2l6ZSBvZiBidWZmZXIgZm9yIGFzbS1vdXRwdXQgKi8KKyNkZWZpbmUgRU1JVF9CVUZfTEVOIDIwMDAwIC8qIHNob3VsZCBiZSBlbm91Z2ggKi8KKworLyogbnVtYmVyIG9mIGFzbS1vdXRwdXQgbGluZXMgYnVmZmVyZWQgKi8KKyNkZWZpbmUgRU1JVF9CVUZfREVQVEggMQorCisvKiAgV2UgaGF2ZSBhc21fcGVlcGhvbGUgdG8gb3B0aW1pemUgYXNzZW1ibHktb3V0cHV0ICovCisjZGVmaW5lIEhBVkVfVEFSR0VUX1BFRVBIT0xFIDAKKworLyogIFdlIGhhdmUgc29tZSB0YXJnZXQtc3BlY2lmaWMgdmFyaWFibGUgYXR0cmlidXRlcy4gICAgICAgICAgICAgICAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9BVFRSSUJVVEVTCmRpZmYgLS1naXQgYS9tYWNoaW5lcy9wcGMvbWFjaGluZS5jIGIvbWFjaGluZXMvcHBjL21hY2hpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTQ3ZmMxCi0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvcHBjL21hY2hpbmUuYwpAQCAtMCwwICsxLDQwMTIgQEAKKy8qICBDb2RlIGdlbmVyYXRvciBmb3IgYSBQUEMgUklTQyBjcHUgd2l0aCAzMiBnZW5lcmFsIHB1cnBvc2UsICAqLworLyogIDMyIGZsb2F0aW5nIHBvaW50IGFuZCA4IGNvbmRpdGlvbiBjb2RlIHJlZ2lzdGVycy4gICAgICAgICAgICovCisKKyNpbmNsdWRlICJzdXBwLmgiCisKK3N0YXRpYyBjaGFyIEZJTEVfW109X19GSUxFX187CisKKyNpbmNsdWRlICJkd2FyZjIuYyIKKworLyogIFB1YmxpYyBkYXRhIHRoYXQgTVVTVCBiZSB0aGVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIE5hbWUgYW5kIGNvcHlyaWdodC4gKi8KK2NoYXIgY2dfY29weXJpZ2h0W109InZiY2MgY29kZS1nZW5lcmF0b3IgZm9yIFBQQyBWMC43IChjKSBpbiAxOTk3LTIwMjIgYnkgVm9sa2VyIEJhcnRoZWxtYW5uIjsKKworLyogIENvbW1hbmRsaW5lLWZsYWdzIHRoZSBjb2RlLWdlbmVyYXRvciBhY2NlcHRzICAgICAgICAgICAgICAgICovCitpbnQgZ19mbGFnc1tNQVhHRl09e1NUUklOR0ZMQUcsU1RSSU5HRkxBRywwLDAsMCwwLAorICAgICAgICAgICAgICAgICAgICAwLDAsMCwwLDAsCisgICAgICAgICAgICAgICAgICAgIDAsMCwwLDAsMCwwLAorCQkgICAgMCwwLDB9OworY2hhciAqZ19mbGFnc19uYW1lW01BWEdGXT17ImNwdSIsImZwdSIsImNvbnN0LWluLWRhdGEiLCJzZCIsIm1lcmdlLWNvbnN0YW50cyIsImZzdWItemVybyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWxmIiwiYW1pZ2EtYWxpZ24iLCJuby1yZWduYW1lcyIsIm5vLXBlZXBob2xlIiwic2V0Y2NzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UtbG13IiwicG93ZXJvcGVuIiwic2MiLCJtYWRkIiwiZWFiaSIsImdhcyIsCisJCQkgICAibm8tYWxpZ24tYXJncyIsImNvbnNlcnZhdGl2ZS1zciIsInVzZS1jb21tb25zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNlcmVsMzJvczQiLCJiYXNlcmVsMzJtb3MiLCJvbGRsaWJjYWxscyJ9OwordW5pb24gcHBpIGdfZmxhZ3NfdmFsW01BWEdGXTsKKworLyogIEFsaWdubWVudC1yZXF1aXJlbWVudHMgZm9yIGFsbCB0eXBlcyBpbiBieXRlcy4gICAgICAgICAgICAgICovCit6bWF4IGFsaWduW01BWF9UWVBFKzFdOworCisvKiAgQWxpZ25tZW50IHRoYXQgaXMgc3VmZmljaWVudCBmb3IgZXZlcnkgb2JqZWN0LiAgICAgICAgICAgICAgKi8KK3ptYXggbWF4YWxpZ247CisKKy8qICBDSEFSX0JJVCBmb3IgdGhlIHRhcmdldCBtYWNoaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworem1heCBjaGFyX2JpdDsKKworLyogIFRhYmVsbGUgZnVlciBkaWUgR3JvZXNzZSBkZXIgZWluemVsbmVuIFR5cGVuICAgICAgICAgICAgICAgICovCit6bWF4IHNpemV0YWJbTUFYX1RZUEUrMV07CisKKy8qICBNaW5pbXVtIGFuZCBNYXhpbXVtIHZhbHVlcyBlYWNoIHR5cGUgY2FuIGhhdmUuICAgICAgICAgICAgICAqLworLyogIE11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gaW5pdF9jZygpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IHRfbWluW01BWF9UWVBFKzFdOworenVtYXggdF9tYXhbTUFYX1RZUEUrMV07Cit6dW1heCB0dV9tYXhbTUFYX1RZUEUrMV07CisKKy8qICBOYW1lcyBvZiBhbGwgcmVnaXN0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworY2hhciAqcmVnbmFtZXNbTUFYUisxXT17Im5vcmVnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyMCIsInIxIiwicjIiLCJyMyIsInI0IiwicjUiLCJyNiIsInI3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyOCIsInI5IiwicjEwIiwicjExIiwicjEyIiwicjEzIiwicjE0IiwicjE1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyMTYiLCJyMTciLCJyMTgiLCJyMTkiLCJyMjAiLCJyMjEiLCJyMjIiLCJyMjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgInIyNCIsInIyNSIsInIyNiIsInIyNyIsInIyOCIsInIyOSIsInIzMCIsInIzMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZjAiLCJmMSIsImYyIiwiZjMiLCJmNCIsImY1IiwiZjYiLCJmNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZjgiLCJmOSIsImYxMCIsImYxMSIsImYxMiIsImYxMyIsImYxNCIsImYxNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZjE2IiwiZjE3IiwiZjE4IiwiZjE5IiwiZjIwIiwiZjIxIiwiZjIyIiwiZjIzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmMjQiLCJmMjUiLCJmMjYiLCJmMjciLCJmMjgiLCJmMjkiLCJmMzAiLCJmMzEiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNyMCIsImNyMSIsImNyMiIsImNyMyIsImNyNCIsImNyNSIsImNyNiIsImNyNyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY250IiwKKwkJCSJyMy9yNCIsInI1L3I2IiwicjcvcjgiLCJyOS9yMTAiLAorCQkJInIxNC9yMTUiLCJyMTYvcjE3IiwicjE4L3IxOSIsInIyMC9yMjEiLAorCQkJInIyMi9yMjMiLCJyMjQvcjI1IiwicjI2L3IyNyIsInIyOC9yMjkiLCJyMzAvcjMxIiwKKwkJCSJsciJ9OworCisvKiAgVGhlIFNpemUgb2YgZWFjaCByZWdpc3RlciBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggcmVnc2l6ZVtNQVhSKzFdOworCisvKiAgVHlwZSB3aGljaCBjYW4gc3RvcmUgZWFjaCByZWdpc3Rlci4gKi8KK3N0cnVjdCBUeXAgKnJlZ3R5cGVbTUFYUisxXTsKKworLyogIHJlZ3NhW3JlZ10hPTAgaWYgYSBjZXJ0YWluIHJlZ2lzdGVyIGlzIGFsbG9jYXRlZCBhbmQgc2hvdWxkICovCisvKiAgbm90IGJlIHVzZWQgYnkgdGhlIGNvbXBpbGVyIHBhc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2ludCByZWdzYVtNQVhSKzFdOworCisvKiAgU3BlY2lmaWVzIHdoaWNoIHJlZ2lzdGVycyBtYXkgYmUgc2NyYXRjaGVkIGJ5IGZ1bmN0aW9ucy4gICAgKi8KK2ludCByZWdzY3JhdGNoW01BWFIrMV09ezAsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwKKwkJICAgICAgICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJCSAgICAgICAgICAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLAorCQkJICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCQkJICAxLDEsMCwwLDAsMSwxLDEsMSwKKwkJCSAgMSwxLDEsMSwKKwkJCSAgMCwwLDAsMCwwLDAsMCwwLDB9OworCitpbnQgcmVnX3ByaW9bTUFYUisxXT17MCwwLDAsMCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwwLDEsMiwKKwkJICAgICAgICAzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LAorCQkgICAgICAgIDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMCwwLAorCQkgICAgICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJCSAgICAgICAgMSwxLDAsMCwwLDEsMSwxLDEsCisJCSAgICAgICAgMTksMjEsMjMsMjUsCisJCSAgICAgICAgMSwzLDUsNyw5LDExLDEzLDE1LDE3fTsKKworc3RydWN0IHJlZ19oYW5kbGUgZW1wdHlfcmVnX2hhbmRsZT17MCwwfTsKKworLyogTmFtZXMgb2YgdGFyZ2V0LXNwZWNpZmljIHZhcmlhYmxlIGF0dHJpYnV0ZXMuICAgICAgICAgICAgICAgICovCitjaGFyICpnX2F0dHJfbmFtZVtdPXsiX19mYXIiLCJfX25lYXIiLCJfX2NoaXAiLCJfX3NhdmVkcyIsIl9fcmZpIiwiX19zYXZlYWxsIiwKKwkJICAgICAiX19zeXNjYWxsIiwiX19ub3NhdmUiLCJfX2JyZWwiLDB9OworI2RlZmluZSBGQVIgMQorI2RlZmluZSBORUFSIDIKKyNkZWZpbmUgQ0hJUCA0CisjZGVmaW5lIFNBVkVEUyA4CisjZGVmaW5lIFJGSSAxNgorI2RlZmluZSBTQVZFQUxMIDMyCisjZGVmaW5lIFNZU0NBTEwgNjQKKyNkZWZpbmUgTk9TQVZFIDEyOAorI2RlZmluZSBCUkVMIDI1NgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBQcml2YXRlIGRhdGEgYW5kIGZ1bmN0aW9ucy4gICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU01BTExEQVRBIChnX2ZsYWdzWzNdJlVTRURGTEFHKQorI2RlZmluZSBQT1dFUk9QRU4gKGdfZmxhZ3NbMTJdJlVTRURGTEFHKQorI2RlZmluZSBTVE9STUMgKGdfZmxhZ3NbMTNdJlVTRURGTEFHKQorI2RlZmluZSBFQUJJIChnX2ZsYWdzWzE1XSZVU0VERkxBRykKKyNkZWZpbmUgR0FTIChnX2ZsYWdzWzE2XSZVU0VERkxBRykKKyNkZWZpbmUgTk9BTElHTkFSR1MgKGdfZmxhZ3NbMTddJlVTRURGTEFHKQorI2RlZmluZSBDT05TRVJWQVRJVkVfU1IgKGdfZmxhZ3NbMThdJlVTRURGTEFHKQorI2RlZmluZSBVU0VfQ09NTU9OUyAoZ19mbGFnc1sxOV0mVVNFREZMQUcpCisjZGVmaW5lIEJBU0VSRUxPUzQgKGdfZmxhZ3NbMjBdJlVTRURGTEFHKQorI2RlZmluZSBCQVNFUkVMTU9TIChnX2ZsYWdzWzIxXSZVU0VERkxBRykKKyNkZWZpbmUgT0xETElCQ0FMTFMgKGdfZmxhZ3NbMjJdJlVTRURGTEFHKQorCisKK3N0YXRpYyBjaGFyICptcmVnbmFtZXNbTUFYUisxXTsKKworc3RhdGljIGNoYXIgKnJldD0iXHRibHJcbiI7CisKK3N0YXRpYyBsb25nIG1hbGlnbltNQVhfVFlQRSsxXT0gIHsxLDEsMiw0LDQsOCw0LDgsOCwxLDQsMSwxLDEsNCwxfTsKK3N0YXRpYyBsb25nIG1zaXpldGFiW01BWF9UWVBFKzFdPXsxLDEsMiw0LDQsOCw0LDgsOCwwLDQsMCwwLDAsNCwwfTsKKworc3RhdGljIHN0cnVjdCBUeXAgbHR5cD17TE9OR30sbGx0eXA9e0xMT05HfSxsZGJsPXtET1VCTEV9LGxjaGFyPXtDSEFSfTsKKworc3RhdGljIGNoYXIgKm1hcnJheVtdPXsiX19zZWN0aW9uKHgseSk9X192YXR0cihcInNlY3Rpb24oXCIjeFwiLFwiI3lcIilcIikiLAorCQkgICAgICAgIl9fUFBDX18iLAorCQkgICAgICAgIl9fYW9zNGxpYmNhbGw9X19hdHRyKFwiYW9zNGxpYmNhbGw7XCIpIiwKKwkJICAgICAgICJfX2xpbmVhcnZhcmFyZ3M9X19hdHRyKFwibGluZWFydmFyYXJncztcIikiLAorCQkgICAgICAgIl9faW50ZXJydXB0PV9fcmZpIF9fc2F2ZWFsbCIsCisJCSAgICAgICAwfTsKKworY29uc3QgaW50IHI0PTUscjU9NixyNj03LHIzcjQ9NzQscjVyNj03NTsKKworCitzdGF0aWMgaW50IHIwPTE7ICAgICAgICAgICAgICAgICAgIC8qICBzcGVjaWFsIHJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIGludCByMj0zOyAgICAgICAgICAgICAgICAgICAvKiAgcmVzZXJ2ZWQgb3IgdG9jICAgICAgICAgICAgICAgICAgICAgKi8KK3N0YXRpYyBpbnQgcjM9NDsgICAgICAgICAgICAgICAgICAgLyogIHJldHVybiB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICovCitzdGF0aWMgaW50IHNwPTI7ICAgICAgICAgICAgICAgICAgIC8qICBTdGFja3BvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIGludCBmcD0yOyAgICAgICAgICAgICAgICAgICAvKiAgRnJhbWVwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0YXRpYyBpbnQgdmxhZnA9MzI7ICAgICAgICAgICAgICAgLyogIEZyYW1lcG9pbnRlciB0byB1c2Ugd2l0aCB2bGFzICAgICAgICovCitzdGF0aWMgaW50IHNkPTE0OyAgICAgICAgICAgICAgICAgIC8qICBTbWFsbERhdGFQb2ludGVyICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIGludCBzZDI9MzsgICAgICAgICAgICAgICAgICAvKiAgU21hbGxEYXRhMiAoZWFiaSkgICAgICAgICAgICAgICAgICAgKi8KK3N0YXRpYyBpbnQgdDE9MTIsdDI9MTMsdDM9MTsgICAgICAgLyogIFRlbXBvcmFyaWVzIHVzZWQgYnkgY29kZSBnZW5lcmF0b3IgICovCitzdGF0aWMgaW50IGYxPTQ1LGYyPTQ2LGYzPTMzOyAgICAgIC8qICBUZW1wb3JhcmllcyB1c2VkIGJ5IGNvZGUgZ2VuZXJhdG9yICAqLworc3RhdGljIGludCBjcjA9NjU7ICAgICAgICAgICAgICAgICAvKiAgRGVmYXVsdCBjb25kaXRpb24tY29kZS1yZWdpc3RlciAgICAgKi8KK3N0YXRpYyBpbnQgY3RyPTczOyAgICAgICAgICAgICAgICAgLyogIGN0ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdGF0aWMgaW50IGxyPTg3OyAgICAgICAgICAgICAgICAgIC8qICBsaW5rIHJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIGludCBicDMyb3M0PTM7ICAgICAgICAgICAgICAvKiAgYmFzZXJlbDMyIHBvaW50ZXIgZm9yIEFtaWdhIE9TNCAgICAgKi8KK3N0YXRpYyBpbnQgYnAzMm1vcz0xNDsgICAgICAgICAgICAgLyogIGJhc2VyZWwzMiBwb2ludGVyIGZvciBNb3JwaE9TICAgICAgICovCisKKyNkZWZpbmUgREFUQSAwCisjZGVmaW5lIEJTUyAxCisjZGVmaW5lIENPREUgMgorI2RlZmluZSBST0RBVEEgMworI2RlZmluZSBUT0MgNAorI2RlZmluZSBTREFUQSA1CisjZGVmaW5lIFNEQVRBMiA2CisjZGVmaW5lIFNCU1MgNworI2RlZmluZSBTUEVDSUFMIDgKKworI2lmIEhBVkVfT1NFSworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisKK3N0YXRpYyBsb25nIHN0YWNrOworc3RhdGljIGludCBzdGFja192YWxpZDsKK3N0YXRpYyBsb25nIHRtcG9mZjsgLyogb2Zmc2V0IGZvciBhZGRpdGlvbmFsIHRlbXBvcmFyaWVzLCB1cHBlciBlbmQhICovCitzdGF0aWMgaW50IGxhc3RsYWJlbCxleGl0X2xhYmVsOworc3RhdGljIGludCBzZHA7CitzdGF0aWMgaW50IHExbG9hZGVkLHEybG9hZGVkOworc3RhdGljIGludCBzZWN0aW9uPS0xLG5ld29iaixjcnNhdmU7CitzdGF0aWMgY2hhciAqY29kZW5hbWU9Ilx0LnRleHRcblx0LmFsaWduXHQyXG4iLAorICAqZGF0YW5hbWU9Ilx0LmRhdGFcblx0LmFsaWduXHQyXG4iLAorICAqYnNzbmFtZT0iIiwKKyAgKnJvZGF0YW5hbWU9Ilx0LnNlY3Rpb25cdC5yb2RhdGFcblx0LmFsaWduXHQyXG4iLAorICAqdG9jbmFtZT0iXHQudG9jZFxuXHQuYWxpZ25cdDJcbiIsCisgICpzZGF0YW5hbWU9Ilx0LnNlY3Rpb25cdFwiLnNkYXRhXCIsXCJhd1wiXG5cdC5hbGlnblx0MlxuIiwKKyAgKnNkYXRhMm5hbWU9Ilx0LnNlY3Rpb25cdFwiLnNkYXRhMlwiLFwiYVwiXG5cdC5hbGlnblx0MlxuIiwKKyAgKnNic3NuYW1lPSJcdC5zZWN0aW9uXHRcIi5zYnNzXCIsXCJhdXdcIlxuXHQuYWxpZ25cdDJcbiI7CisKK3N0YXRpYyBjaGFyICpsYWJwcmVmaXg9ImwiLCppZHByZWZpeD0iXyIsKnRvY3ByZWZpeD0iQF8iOworc3RhdGljIGxvbmcgZnJhbWVvZmZzZXQscHVzaGVkLG1heHB1c2hlZCxmcmFtZXNpemUsbG9jYWxvZmZzZXQsbWluZnJhbWU9ODsKK3N0YXRpYyB2b2lkIGVtaXRfb2JqKEZJTEUgKmYsc3RydWN0IG9iaiAqcCxpbnQgdCk7CisKK3N0YXRpYyBpbnQgYWxsX3JlZ3M7CisKK3N0cnVjdCBTdGF0RlB0ckxpc3QgeworICBzdHJ1Y3QgU3RhdEZQdHJMaXN0ICpuZXh0OworICBzdHJ1Y3QgVmFyICp2cHRyOworfTsKK3N0YXRpYyBzdHJ1Y3QgU3RhdEZQdHJMaXN0ICpmaXJzdGZwdHIgPSBOVUxMOworCit2b2lkIHRpdGxlKEZJTEUgKmYpCit7CisgIHN0YXRpYyBpbnQgZG9uZTsKKyAgZXh0ZXJuIGNoYXIgKmlubmFtZTsgLypncm1wZiovCisgIGlmKCFkb25lJiZmKXsKKyAgICBkb25lPTE7CisgICAgZW1pdChmLCJcdC5maWxlXHRcIiVzXCJcbiIsaW5uYW1lKTsKKyAgfQorfSAKKworc3RhdGljIGxvbmcgcmVhbF9vZmZzZXQoc3RydWN0IG9iaiAqbykKK3sKKyAgbG9uZyBvZmY7CisgIGlmKHptMmwoby0+di0+b2Zmc2V0KT49MCl7CisgICAgIHJldHVybiB6bTJsKG8tPnYtPm9mZnNldCkrZnJhbWVvZmZzZXQrem0ybChvLT52YWwudm1heCk7CisgIH1lbHNleworICAgIHJldHVybiBmcmFtZXNpemUrbWluZnJhbWUtem0ybChvLT52LT5vZmZzZXQpLXptMmwobWF4YWxpZ24pK3ptMmwoby0+dmFsLnZtYXgpOworICB9Cit9CitzdGF0aWMgbG9uZyBoaShsb25nIG9mZikKK3sKKyAgem1heCB6bT1sMnptKG9mZikscj16bXJzaGlmdCh6bSxsMnptKDE2TCkpOworICBpZighem1lcXRvKHptYW5kKHptLGwyem0oMzI3NjhMKSksbDJ6bSgwTCkpKSByPXptYWRkKHIsbDJ6bSgxTCkpOworICByZXR1cm4gem0ybCh6czJ6bSh6bTJ6cyh6bWFuZChyLGwyem0oNjU1MzVMKSkpKSk7Cit9CitzdGF0aWMgbG9uZyBsbyhsb25nIG9mZikKK3sKKyAgcmV0dXJuIHptMmwoenMyem0oem0yenMoem1hbmQobDJ6bShvZmYpLGwyem0oNjU1MzVMKSkpKSk7Cit9CitzdGF0aWMgc3RydWN0IGZwY29uc3RsaXN0IHsKKyAgc3RydWN0IGZwY29uc3RsaXN0ICpuZXh0OworICBpbnQgbGFiZWwsdHlwOworICB1bmlvbiBhdHlwcyB2YWw7Cit9ICpmaXJzdGZwYzsKKworc3RhdGljIGludCBhZGRmcGNvbnN0KHN0cnVjdCBvYmogKm8saW50IHQpCit7CisgIHN0cnVjdCBmcGNvbnN0bGlzdCAqcD1maXJzdGZwYzsKKyAgdCY9TlE7CisgIGlmKHQ9PUxET1VCTEUpIHQ9RE9VQkxFOworICBpZihnX2ZsYWdzWzRdJlVTRURGTEFHKXsKKyAgICBmb3IocD1maXJzdGZwYztwO3A9cC0+bmV4dCl7CisgICAgICBpZih0PT1wLT50eXApeworICAgICAgICBldmFsX2NvbnN0KCZwLT52YWwsdCk7CisgICAgICAgIGlmKHQ9PUZMT0FUJiZ6bGRlcXRvKHZsZG91YmxlLHpmMnpsZChvLT52YWwudmZsb2F0KSkpIHJldHVybiBwLT5sYWJlbDsKKyAgICAgICAgaWYodD09RE9VQkxFJiZ6bGRlcXRvKHZsZG91YmxlLHpkMnpsZChvLT52YWwudmRvdWJsZSkpKSByZXR1cm4gcC0+bGFiZWw7CisgICAgICB9CisgICAgfQorICB9CisgIHA9bXltYWxsb2Moc2l6ZW9mKHN0cnVjdCBmcGNvbnN0bGlzdCkpOworICBwLT5uZXh0PWZpcnN0ZnBjOworICBwLT5sYWJlbD0rK2xhYmVsOworICBwLT50eXA9dDsKKyAgcC0+dmFsPW8tPnZhbDsKKyAgZmlyc3RmcGM9cDsKKyAgcmV0dXJuIHAtPmxhYmVsOworfQorCisjZGVmaW5lIFJFR19JTkQgMQorI2RlZmluZSBJTU1fSU5EIDIKKyNkZWZpbmUgVVBEQVRFICA2NAorCitzdGF0aWMgc3RydWN0IG9iaiAqY2FtKGludCBmbGFncyxpbnQgYmFzZSxsb25nIG9mZnNldCkKKy8qICBJbml0aWFsaXplcyBhbiBhZGRyZXNzaW5nLW1vZGUgc3RydWN0dXJlIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byAgICovCisvKiAgdGhhdCBvYmplY3QuIFdpbGwgbm90IHN1cnZpdmUgYSBzZWNvbmQgY2FsbCEgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBzdGF0aWMgc3RydWN0IG9iaiBvYmo7CisgIHN0YXRpYyBzdHJ1Y3QgQWRkcmVzc2luZ01vZGUgYW07CisgIG9iai5hbT0mYW07CisgIGFtLmZsYWdzPWZsYWdzOworICBhbS5iYXNlPWJhc2U7CisgIGFtLm9mZnNldD1vZmZzZXQ7CisgIHJldHVybiAmb2JqOworfQorCitzdGF0aWMgY2hhciAqbGR0c1tdPXsiIiwiYnoiLCJoYSIsInd6Iiwid3oiLCJ3eiIsImZzIiwiZmQiLCJmZCIsIiIsInd6In07CitzdGF0aWMgY2hhciAqbGR0dVtdPXsiIiwiYnoiLCJoeiIsInd6Iiwid3oiLCJ3eiIsIj8/IiwiPz8iLCI/PyIsIj8/IiwiPz8ifTsKK3N0YXRpYyBjaGFyICpzZHRzW109eyIiLCJiIiwiaCIsInciLCJ3IiwidyIsImZzIiwiZmQiLCJmZCIsIiIsIncifTsKK3N0YXRpYyBjaGFyICpzZHR1W109eyIiLCJiIiwiaCIsInciLCJ3IiwidyIsIj8/IiwiPz8iLCI/PyIsIj8/IiwiPz8ifTsKKworI2RlZmluZSBsZHQodCkgKCh0JlVOU0lHTkVEKT9sZHR1W3QmTlFdOmxkdHNbdCZOUV0pCisjZGVmaW5lIHNkdCh0KSAoKHQmVU5TSUdORUQpP3NkdHVbdCZOUV06c2R0c1t0Jk5RXSkKKworc3RhdGljIGludCBzcGVjaWFsX3NlY3Rpb24oRklMRSAqZixzdHJ1Y3QgVmFyICp2KQoreworICBjaGFyICpzZWM7CisgIGlmKCF2LT52YXR0cikgcmV0dXJuIDA7CisgIHNlYz1zdHJzdHIodi0+dmF0dHIsInNlY3Rpb24oIik7CisgIGlmKCFzZWMpIHJldHVybiAwOworICBzZWMrPXN0cmxlbigic2VjdGlvbigiKTsKKyAgZW1pdChmLCJcdC5zZWN0aW9uXHQiKTsKKyAgd2hpbGUoKnNlYyYmKnNlYyE9JyknKSBlbWl0X2NoYXIoZiwqc2VjKyspOworICBlbWl0KGYsIlxuIik7CisgIGlmKGYpIHNlY3Rpb249U1BFQ0lBTDsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdXNlX3NkKGludCB0KQorLyogIFNoYWxsIHRoZSBvYmplY3Qgb2YgdHlwZSB0IGJlIGFkZHJlc3NlZCBpbiBzbWFsbC1kYXRhLW1vZGU/ICAqLworeworICBpbnQgcj0wOworICBpZihJU0ZVTkModCkpIHJldHVybiAwOworICBpZihnX2ZsYWdzWzNdJlVTRURGTEFHKSAKKyAgICByPXNkOworICBlbHNlIGlmKFNUT1JNQyYmKHQmTlEpPD1QT0lOVEVSKSAKKyAgICByPXNkOworICBlbHNlIGlmKEVBQkkmJklTU0NBTEFSKHQpKXsKKyAgICBpZih0JkNPTlNUKQorICAgICAgcj1zZDI7CisgICAgZWxzZQorICAgICAgcj1zZDsKKyAgfQorICByZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgbG9hZF9hZGRyZXNzKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdHlwKQorLyogIEdlbmVyYXRlcyBjb2RlIHRvIGxvYWQgdGhlIGFkZHJlc3Mgb2YgYSB2YXJpYWJsZSBpbnRvIHJlZ2lzdGVyIHIuICAgKi8KK3sKKyAgQlNFVChyZWdzX21vZGlmaWVkLHIpOworICBpZighKG8tPmZsYWdzJlZBUikpIAorICAgIGllcnJvcigwKTsKKyAgaWYoby0+di0+c3RvcmFnZV9jbGFzcz09QVVUT3x8by0+di0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpeworICAgIGxvbmcgb2ZmPXJlYWxfb2Zmc2V0KG8pOworICAgIGlmKG9mZjw9MzI3NjcpeworICAgICAgZW1pdChmLCJcdGFkZGlcdCVzLCVzLCVsZFxuIixtcmVnbmFtZXNbcl0sbXJlZ25hbWVzW2ZwXSxvZmYpOworICAgIH1lbHNleworICAgICAgaWYocj09cjApeworCUJTRVQocmVnc19tb2RpZmllZCx0Mik7CisJZW1pdChmLCJcdGFkZGlzXHQlcywlcywlbGRcbiIsbXJlZ25hbWVzW3QyXSxtcmVnbmFtZXNbZnBdLGhpKG9mZikpOworCWVtaXQoZiwiXHRhZGRpXHQlcywlcywlbGRcbiIsbXJlZ25hbWVzW3JdLG1yZWduYW1lc1t0Ml0sbG8ob2ZmKSk7CisgICAgICB9ZWxzZXsKKwllbWl0KGYsIlx0YWRkaXNcdCVzLCVzLCVsZFxuIixtcmVnbmFtZXNbcl0sbXJlZ25hbWVzW2ZwXSxoaShvZmYpKTsKKwllbWl0KGYsIlx0YWRkaVx0JXMsJXMsJWxkXG4iLG1yZWduYW1lc1tyXSxtcmVnbmFtZXNbcl0sbG8ob2ZmKSk7CisgICAgICB9CisgICAgfQorICB9ZWxzZXsKKyAgICBpZigoc2RwPXVzZV9zZChvLT52LT52dHlwLT5mbGFncykpJiYhKG8tPnYtPnRhdHRyJkZBUikKKyAgICAgICAmJnptbGVxKGwyem0oMEwpLG8tPnZhbC52bWF4KSYmIXptbGVxKHN6b2Yoby0+di0+dnR5cCksby0+dmFsLnZtYXgpKXsKKyAgICAgIGVtaXQoZiwiXHRsYVx0JXMsIixtcmVnbmFtZXNbcl0pOworICAgICAgZW1pdF9vYmooZixvLHR5cCk7CisgICAgICBpZihHQVMpCisJZW1pdChmLCJAc2RhMjEoMClcbiIpOworICAgICAgZWxzZQorCWVtaXQoZiwiKCVzKVxuIixtcmVnbmFtZXNbc2RwXSk7CisgICAgfWVsc2V7CisgICAgICBpZihQT1dFUk9QRU4peworICAgICAgICB6bWF4IG9mZnNldD1vLT52YWwudm1heDsKKwlpZihmKXsKKwkgIGlmKChvLT52LT52dHlwLT5mbGFncyZOUSk9PUZVTktUJiZvLT52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpeworCSAgICAvKiBjaGVjayBpZiBzdGF0aWMgZnVuY3Rpb24gcG9pbnRlciB3YXMgYWxyZWFkeSBjcmVhdGVkIGluIFRPQyAqLworCSAgICBzdHJ1Y3QgU3RhdEZQdHJMaXN0ICoqb2xkc2ZwPSZmaXJzdGZwdHI7CisJICAgIHN0cnVjdCBTdGF0RlB0ckxpc3QgKnNmcD1maXJzdGZwdHI7CisJICAgIHdoaWxlKHNmcCl7CisJICAgICAgaWYoc2ZwLT52cHRyPT1vLT52KSBicmVhazsKKwkgICAgICBvbGRzZnA9JnNmcC0+bmV4dDsKKwkgICAgICBzZnA9c2ZwLT5uZXh0OworCSAgICB9CisJICAgIGlmKCFzZnApeworCSAgICAgICpvbGRzZnA9c2ZwPW15bWFsbG9jKHNpemVvZihzdHJ1Y3QgU3RhdEZQdHJMaXN0KSk7CisJICAgICAgc2ZwLT5uZXh0PU5VTEw7CisJICAgICAgc2ZwLT52cHRyPW8tPnY7CisJICAgIH0KKwkgIH0KKwkgIGVtaXQoZiwiXHRsJXNcdCVzLCVzIixsZHQoTE9ORyksbXJlZ25hbWVzW3JdLHRvY3ByZWZpeCk7CisJICBvLT52YWwudm1heD1sMnptKDBMKTtlbWl0X29iaihmLG8sUE9JTlRFUik7by0+dmFsLnZtYXg9b2Zmc2V0OworCSAgZW1pdChmLCIoJXMpXG4iLG1yZWduYW1lc1tyMl0pOworCSAgaWYoaGkoem0ybChvZmZzZXQpKSkgZW1pdChmLCJcdGFkZGlzXHQlcywlcywlbGRcbiIsbXJlZ25hbWVzW3JdLG1yZWduYW1lc1tyXSxoaSh6bTJsKG9mZnNldCkpKTsKKwkgIGlmKGxvKHptMmwob2Zmc2V0KSkpIGVtaXQoZiwiXHRhZGRpXHQlcywlcywlbGRcbiIsbXJlZ25hbWVzW3JdLG1yZWduYW1lc1tyXSxsbyh6bTJsKG9mZnNldCkpKTsKKwl9CisgICAgICB9ZWxzZXsKKyAgICAgICAgaWYoQkFTRVJFTE9TNCl7CisgICAgICAgICAgZW1pdChmLCJcdGFkZGlzXHQlcywlcywiLG1yZWduYW1lc1tyXSxtcmVnbmFtZXNbYnAzMm9zNF0pOworICAgICAgICAgIGVtaXRfb2JqKGYsbyx0eXApO2VtaXQoZiwiQGJyZWxAaGFcbiIpOworICAgICAgICAgIGVtaXQoZiwiXHRhZGRpXHQlcywlcywiLG1yZWduYW1lc1tyXSxtcmVnbmFtZXNbcl0pOworICAgICAgICAgIGVtaXRfb2JqKGYsbyx0eXApO2VtaXQoZiwiQGJyZWxAbFxuIik7CisgICAgICAgIH1lbHNlIGlmKEJBU0VSRUxNT1MpeworICAgICAgICAgIGVtaXQoZiwiXHRhZGRpc1x0JXMsJXMsIixtcmVnbmFtZXNbcl0sbXJlZ25hbWVzW2JwMzJtb3NdKTsKKyAgICAgICAgICBlbWl0X29iaihmLG8sdHlwKTtlbWl0KGYsIkBkcmVsQGhhXG4iKTsKKyAgICAgICAgICBlbWl0KGYsIlx0YWRkaVx0JXMsJXMsIixtcmVnbmFtZXNbcl0sbXJlZ25hbWVzW3JdKTsKKyAgICAgICAgICBlbWl0X29iaihmLG8sdHlwKTtlbWl0KGYsIkBkcmVsQGxcbiIpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICBlbWl0KGYsIlx0bGlzXHQlcywiLG1yZWduYW1lc1tyXSk7CisgICAgICAgICAgZW1pdF9vYmooZixvLHR5cCk7ZW1pdChmLCJAaGFcbiIpOworICAgICAgICAgIGVtaXQoZiwiXHRhZGRpXHQlcywlcywiLG1yZWduYW1lc1tyXSxtcmVnbmFtZXNbcl0pOworICAgICAgICAgIGVtaXRfb2JqKGYsbyx0eXApO2VtaXQoZiwiQGxcbiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CitzdGF0aWMgdm9pZCBsb2FkX3JlZyhGSUxFICpmLGludCByLHN0cnVjdCBvYmogKm8saW50IHR5cCxpbnQgdG1wKQorLyogIEdlbmVyYXRlcyBjb2RlIHRvIGxvYWQgYSBtZW1vcnkgb2JqZWN0IGludG8gcmVnaXN0ZXIgci4gdG1wIGlzIGEgICAgKi8KKy8qICBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgd2hpY2ggbWF5IGJlIHVzZWQuIHRtcCBjYW4gYmUgci4gICAgICAgICAgICovCit7CisgIHR5cCY9TlU7CisgIEJTRVQocmVnc19tb2RpZmllZCxyKTsKKyAgaWYoby0+ZmxhZ3MmS09OU1QpeworICAgIGxvbmcgbDsKKyAgICBldmFsX2NvbnN0KCZvLT52YWwsdHlwKTsKKyAgICBpZihJU0ZMT0FUKHR5cCkpeworICAgICAgaW50IGxhYjsKKyAgICAgIGlmKChnX2ZsYWdzWzVdJlVTRURGTEFHKSYmemxkZXF0byh2bGRvdWJsZSxkMnpsZCgwLjApKSl7CisgICAgICAgIGVtaXQoZiwiXHRmc3ViXHQlcywlcywlc1xuIixtcmVnbmFtZXNbcl0sbXJlZ25hbWVzW3JdLG1yZWduYW1lc1tyXSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGxhYj1hZGRmcGNvbnN0KG8sdHlwKTsKKyAgICAgIGlmKHNkcD11c2Vfc2QodHlwKSl7CisJaWYoR0FTKQorCSAgZW1pdChmLCJcdGwlc1x0JXMsJXMlZEBzZGEyMSgwKVxuIixsZHQodHlwKSxtcmVnbmFtZXNbcl0sbGFicHJlZml4LGxhYik7CisJZWxzZQorCSAgZW1pdChmLCJcdGwlc1x0JXMsJXMlZCglcylcbiIsbGR0KHR5cCksbXJlZ25hbWVzW3JdLGxhYnByZWZpeCxsYWIsbXJlZ25hbWVzW3NkcF0pOworICAgICAgfWVsc2V7CisJQlNFVChyZWdzX21vZGlmaWVkLHRtcCk7CisgICAgICAgIGlmKFBPV0VST1BFTil7CisgICAgICAgICAgZW1pdChmLCJcdGwlc1x0JXMsJXMlcyVsZCglcylcbiIsbGR0KExPTkcpLG1yZWduYW1lc1t0bXBdLHRvY3ByZWZpeCxsYWJwcmVmaXgsKGxvbmcpbGFiLG1yZWduYW1lc1tyMl0pOworICAgICAgICAgIGVtaXQoZiwiXHRsJXNcdCVzLDAoJXMpXG4iLGxkdCh0eXApLG1yZWduYW1lc1tyXSxtcmVnbmFtZXNbdG1wXSk7CisgICAgICAgIH1lbHNleworICAgICAgICAgIGVtaXQoZiwiXHRsaXNcdCVzLCVzJWRAaGFcbiIsbXJlZ25hbWVzW3RtcF0sbGFicHJlZml4LGxhYik7CisgICAgICAgICAgZW1pdChmLCJcdGwlc1x0JXMsJXMlZEBsKCVzKVxuIixsZHQodHlwKSxtcmVnbmFtZXNbcl0sbGFicHJlZml4LGxhYixtcmVnbmFtZXNbdG1wXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYocj09MSkgaWVycm9yKDApOworICAgIGw9aGkoem0ybCh2bWF4KSk7CisgICAgaWYobCl7CisgICAgICBlbWl0KGYsIlx0bGlzXHQlcywlbGRcbiIsbXJlZ25hbWVzW3JdLGwpOworICAgICAgbD1sbyh6bTJsKHZtYXgpKTsKKyAgICAgIGlmKGwpCisJZW1pdChmLCJcdGFkZGlcdCVzLCVzLCVsZFxuIixtcmVnbmFtZXNbcl0sbXJlZ25hbWVzW3JdLGwpOworICAgIH1lbHNleworICAgICAgZW1pdChmLCJcdGxpXHQlcywlbGRcbiIsbXJlZ25hbWVzW3JdLGxvKHZtYXgpKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGlmKChvLT5mbGFncyZWQVIpJiYoby0+di0+c3RvcmFnZV9jbGFzcz09RVhURVJOfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpKXsKKyAgICBpZihvLT5mbGFncyZWQVJBRFIpeworICAgICAgbG9hZF9hZGRyZXNzKGYscixvLFBPSU5URVIpOworICAgIH1lbHNleworICAgICAgaWYoKHNkcD11c2Vfc2Qoby0+di0+dnR5cC0+ZmxhZ3MpKSYmIShvLT52LT50YXR0ciZGQVIpKXsKKyAgICAgICAgZW1pdChmLCJcdGwlc1x0JXMsIixsZHQodHlwKSxtcmVnbmFtZXNbcl0pOworICAgICAgICBlbWl0X29iaihmLG8sdHlwKTsKKwlpZihHQVMpCisJICBlbWl0KGYsIkBzZGEyMSgwKVxuIik7CisJZWxzZQorCSAgZW1pdChmLCIoJXMpXG4iLG1yZWduYW1lc1tzZHBdKTsKKyAgICAgIH1lbHNleworCUJTRVQocmVnc19tb2RpZmllZCx0bXApOworICAgICAgICBpZihQT1dFUk9QRU4peworICAgICAgICAgIHptYXggb2Zmc2V0PW8tPnZhbC52bWF4OworICAgICAgICAgIGVtaXQoZiwiXHRsJXNcdCVzLCVzIixsZHQoTE9ORyksbXJlZ25hbWVzW3RtcF0sdG9jcHJlZml4KTsKKyAgICAgICAgICBvLT52YWwudm1heD1sMnptKDBMKTtlbWl0X29iaihmLG8sUE9JTlRFUik7by0+dmFsLnZtYXg9b2Zmc2V0OworICAgICAgICAgIGVtaXQoZiwiKCVzKVxuIixtcmVnbmFtZXNbcjJdKTsKKyAgICAgICAgICBpZihoaSh6bTJsKG9mZnNldCkpKSBlbWl0KGYsIlx0YWRkaXNcdCVzLCVzLCVsZFxuIixtcmVnbmFtZXNbdG1wXSxtcmVnbmFtZXNbdG1wXSxoaSh6bTJsKG9mZnNldCkpKTsKKyAgICAgICAgICBlbWl0KGYsIlx0bCVzXHQlcywlbGQoJXMpXG4iLGxkdCh0eXApLG1yZWduYW1lc1tyXSxsbyh6bTJsKG9mZnNldCkpLG1yZWduYW1lc1t0bXBdKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgaWYoQkFTRVJFTE9TNCl7CisgICAgICAgICAgICBlbWl0KGYsIlx0YWRkaXNcdCVzLCVzLCIsbXJlZ25hbWVzW3RtcF0sbXJlZ25hbWVzW2JwMzJvczRdKTsKKyAgICAgICAgICAgIGVtaXRfb2JqKGYsbyx0eXApO2VtaXQoZiwiQGJyZWxAaGFcbiIpOworICAgICAgICAgICAgZW1pdChmLCJcdGwlc1x0JXMsIixsZHQodHlwKSxtcmVnbmFtZXNbcl0pOworICAgICAgICAgICAgZW1pdF9vYmooZixvLHR5cCk7ZW1pdChmLCJAYnJlbEBsKCVzKVxuIixtcmVnbmFtZXNbdG1wXSk7CisgICAgICAgICAgfWVsc2UgaWYoQkFTRVJFTE1PUyl7CisgICAgICAgICAgICBlbWl0KGYsIlx0YWRkaXNcdCVzLCVzLCIsbXJlZ25hbWVzW3RtcF0sbXJlZ25hbWVzW2JwMzJtb3NdKTsKKyAgICAgICAgICAgIGVtaXRfb2JqKGYsbyx0eXApO2VtaXQoZiwiQGRyZWxAaGFcbiIpOworICAgICAgICAgICAgZW1pdChmLCJcdGwlc1x0JXMsIixsZHQodHlwKSxtcmVnbmFtZXNbcl0pOworICAgICAgICAgICAgZW1pdF9vYmooZixvLHR5cCk7ZW1pdChmLCJAZHJlbEBsKCVzKVxuIixtcmVnbmFtZXNbdG1wXSk7CisgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBlbWl0KGYsIlx0bGlzXHQlcywiLG1yZWduYW1lc1t0bXBdKTsKKyAgICAgICAgICAgIGVtaXRfb2JqKGYsbyx0eXApO2VtaXQoZiwiQGhhXG4iKTsKKyAgICAgICAgICAgIGVtaXQoZiwiXHRsJXNcdCVzLCIsbGR0KHR5cCksbXJlZ25hbWVzW3JdKTsKKyAgICAgICAgICAgIGVtaXRfb2JqKGYsbyx0eXApO2VtaXQoZiwiQGwoJXMpXG4iLG1yZWduYW1lc1t0bXBdKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH1lbHNleworICAgIGlmKChvLT5mbGFncyYoRFJFRk9CSnxSRUcpKT09UkVHKXsKKyAgICAgIGlmKHIhPW8tPnJlZykKKyAgICAgICAgZW1pdChmLCJcdCVzbXJcdCVzLCVzXG4iLHI+PTMzPyJmIjoiIixtcmVnbmFtZXNbcl0sbXJlZ25hbWVzW28tPnJlZ10pOworICAgIH1lbHNlIGlmKCFvLT5hbSYmKG8tPmZsYWdzJihEUkVGT0JKfFJFRykpPT0oUkVHfERSRUZPQkopKXsKKyAgICAgIGVtaXQoZiwiXHRsJXNcdCVzLDAoJXMpXG4iLGxkdCh0eXApLG1yZWduYW1lc1tyXSxtcmVnbmFtZXNbby0+cmVnXSk7CisgICAgfWVsc2UgaWYoIW8tPmFtKXsKKyAgICAgIGxvbmcgb2ZmPXJlYWxfb2Zmc2V0KG8pOworICAgICAgaWYob2ZmPD0zMjc2Nyl7CisgICAgICAgIGVtaXQoZiwiXHRsJXNcdCVzLCVsZCglcylcbiIsbGR0KHR5cCksbXJlZ25hbWVzW3JdLG9mZixtcmVnbmFtZXNbZnBdKTsKKyAgICAgIH1lbHNleworCUJTRVQocmVnc19tb2RpZmllZCx0bXApOworICAgICAgICBlbWl0KGYsIlx0YWRkaXNcdCVzLCVzLCVsZFxuIixtcmVnbmFtZXNbdG1wXSxtcmVnbmFtZXNbZnBdLGhpKG9mZikpOworICAgICAgICBlbWl0KGYsIlx0bCVzXHQlcywlbGQoJXMpXG4iLGxkdCh0eXApLG1yZWduYW1lc1tyXSxsbyh6bTJsKG9mZikpLG1yZWduYW1lc1t0bXBdKTsKKyAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgIGVtaXQoZiwiXHRsJXMlcyVzXHQlcywiLGxkdCh0eXApLChvLT5hbS0+ZmxhZ3MmVVBEQVRFKT8idSI6IiIsKG8tPmFtLT5mbGFncyZSRUdfSU5EKT8ieCI6IiIsbXJlZ25hbWVzW3JdKTsKKyAgICAgIGVtaXRfb2JqKGYsbyx0eXApO2VtaXQoZiwiXG4iKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgc3RvcmVfcmVnKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdHlwKQorLyogIEdlbmVyYXRlcyBjb2RlIHRvIHN0b3JlIHJlZ2lzdGVyIHIgaW50byBtZW1vcnkgb2JqZWN0IG8uICAgICAgICAgICAgKi8KK3sKKyAgaW50IHRtcDsKKyAgdHlwJj1OUTsKKyAgaWYoKG8tPmZsYWdzJlZBUikmJihvLT52LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk58fG8tPnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQykpeworICAgIGludCB0bXA9dDE7CisgICAgaWYodG1wPT1yKSB0bXA9dDI7CisgICAgaWYoKHNkcD11c2Vfc2Qoby0+di0+dnR5cC0+ZmxhZ3MpKSYmIShvLT52LT50YXR0ciZGQVIpKXsKKyAgICAgIGVtaXQoZiwiXHRzdCVzXHQlcywiLHNkdCh0eXApLG1yZWduYW1lc1tyXSk7CisgICAgICBlbWl0X29iaihmLG8sdHlwKTsKKyAgICAgIGlmKEdBUykKKwllbWl0KGYsIkBzZGEyMSgwKVxuIik7CisgICAgICBlbHNlCisJZW1pdChmLCIoJXMpXG4iLG1yZWduYW1lc1tzZHBdKTsKKyAgICAgIHJldHVybjsKKyAgICB9ZWxzZXsKKyAgICAgIEJTRVQocmVnc19tb2RpZmllZCx0bXApOworICAgICAgaWYoUE9XRVJPUEVOKXsKKyAgICAgICAgem1heCBvZmZzZXQ9by0+dmFsLnZtYXg7CisgICAgICAgIGVtaXQoZiwiXHRsJXNcdCVzLCVzIixsZHQoTE9ORyksbXJlZ25hbWVzW3RtcF0sdG9jcHJlZml4KTsKKyAgICAgICAgby0+dmFsLnZtYXg9bDJ6bSgwTCk7ZW1pdF9vYmooZixvLFBPSU5URVIpO28tPnZhbC52bWF4PW9mZnNldDsKKyAgICAgICAgZW1pdChmLCIoJXMpXG4iLG1yZWduYW1lc1tyMl0pOworICAgICAgICBpZihoaSh6bTJsKG9mZnNldCkpKSBlbWl0KGYsIlx0YWRkaXNcdCVzLCVzLCVsZFxuIixtcmVnbmFtZXNbdG1wXSxtcmVnbmFtZXNbdG1wXSxoaSh6bTJsKG9mZnNldCkpKTsKKyAgICAgICAgZW1pdChmLCJcdHN0JXNcdCVzLCVsZCglcylcbiIsc2R0KHR5cCksbXJlZ25hbWVzW3JdLGxvKHptMmwob2Zmc2V0KSksbXJlZ25hbWVzW3RtcF0pOworICAgICAgICByZXR1cm47CisgICAgICB9ZWxzZXsKKyAgICAgICAgaWYoQkFTRVJFTE9TNCl7CisgICAgICAgICAgZW1pdChmLCJcdGFkZGlzXHQlcywlcywiLG1yZWduYW1lc1t0bXBdLG1yZWduYW1lc1ticDMyb3M0XSk7CisgICAgICAgICAgZW1pdF9vYmooZixvLHR5cCk7ZW1pdChmLCJAYnJlbEBoYVxuIik7CisgICAgICAgICAgZW1pdChmLCJcdHN0JXNcdCVzLCIsc2R0KHR5cCksbXJlZ25hbWVzW3JdKTsKKyAgICAgICAgICBlbWl0X29iaihmLG8sdHlwKTtlbWl0KGYsIkBicmVsQGwoJXMpXG4iLG1yZWduYW1lc1t0bXBdKTsKKyAgICAgICAgfWVsc2UgaWYoQkFTRVJFTE1PUyl7CisgICAgICAgICAgZW1pdChmLCJcdGFkZGlzXHQlcywlcywiLG1yZWduYW1lc1t0bXBdLG1yZWduYW1lc1ticDMybW9zXSk7CisgICAgICAgICAgZW1pdF9vYmooZixvLHR5cCk7ZW1pdChmLCJAZHJlbEBoYVxuIik7CisgICAgICAgICAgZW1pdChmLCJcdHN0JXNcdCVzLCIsc2R0KHR5cCksbXJlZ25hbWVzW3JdKTsKKyAgICAgICAgICBlbWl0X29iaihmLG8sdHlwKTtlbWl0KGYsIkBkcmVsQGwoJXMpXG4iLG1yZWduYW1lc1t0bXBdKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgZW1pdChmLCJcdGxpc1x0JXMsIixtcmVnbmFtZXNbdG1wXSk7CisgICAgICAgICAgZW1pdF9vYmooZixvLHR5cCk7ZW1pdChmLCJAaGFcbiIpOworICAgICAgICAgIGVtaXQoZiwiXHRzdCVzXHQlcywiLHNkdCh0eXApLG1yZWduYW1lc1tyXSk7CisgICAgICAgICAgZW1pdF9vYmooZixvLHR5cCk7ZW1pdChmLCJAbCglcylcbiIsbXJlZ25hbWVzW3RtcF0pOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIShvLT5mbGFncyZEUkVGT0JKKSYmIW8tPmFtKXsKKyAgICBsb25nIG9mZj1yZWFsX29mZnNldChvKTsKKyAgICBpZihyPT10MSkgdG1wPXQyOyBlbHNlIHRtcD10MTsKKyAgICBpZihvZmY8PTMyNzY3KXsKKyAgICAgIGVtaXQoZiwiXHRzdCVzXHQlcywlbGQoJXMpXG4iLHNkdCh0eXApLG1yZWduYW1lc1tyXSxvZmYsbXJlZ25hbWVzW2ZwXSk7CisgICAgfWVsc2V7CisKKyAgICAgIEJTRVQocmVnc19tb2RpZmllZCx0bXApOworICAgICAgZW1pdChmLCJcdGFkZGlzXHQlcywlcywlbGRcbiIsbXJlZ25hbWVzW3RtcF0sbXJlZ25hbWVzW2ZwXSxoaShvZmYpKTsKKyAgICAgIGVtaXQoZiwiXHRzdCVzXHQlcywlbGQoJXMpXG4iLHNkdCh0eXApLG1yZWduYW1lc1tyXSxsbyhvZmYpLG1yZWduYW1lc1t0bXBdKTsKKyAgICB9CisgIH1lbHNleworICAgIGlmKCFvLT5hbSl7CisgICAgICBlbWl0KGYsIlx0c3Qlc1x0JXMsIixzZHQodHlwKSxtcmVnbmFtZXNbcl0pOworICAgICAgZW1pdF9vYmooZixvLHR5cCk7ZW1pdChmLCJcbiIpOworICAgIH1lbHNleworICAgICAgZW1pdChmLCJcdHN0JXMlcyVzXHQlcywiLHNkdCh0eXApLChvLT5hbS0+ZmxhZ3MmVVBEQVRFKT8idSI6IiIsKG8tPmFtLT5mbGFncyZSRUdfSU5EKT8ieCI6IiIsbXJlZ25hbWVzW3JdKTsKKyAgICAgIGVtaXRfb2JqKGYsbyx0eXApO2VtaXQoZiwiXG4iKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGxvbmcgcG9mMih6dW1heCB4KQorLyogIFlpZWxkcyBsb2cyKHgpKzEgb2RlciAwLiAqLworeworICB6dW1heCBwO2ludCBsbj0xOworICBwPXVsMnp1bSgxTCk7CisgIHdoaWxlKGxuPD0zMiYmenVtbGVxKHAseCkpeworICAgIGlmKHp1bWVxdG8oeCxwKSkgcmV0dXJuIGxuOworICAgIGxuKys7cD16dW1hZGQocCxwKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworI2lmIDEKK3N0YXRpYyBjaGFyICpkY3RbXT17IiIsImJ5dGUiLCIyYnl0ZSIsIjRieXRlIiwiNGJ5dGUiLCI0Ynl0ZSIsIjRieXRlIiwiNGJ5dGUiLCI0Ynl0ZSJ9OworI2Vsc2UKK3N0YXRpYyBjaGFyICpkY3RbXT17IiIsImJ5dGUiLCJzaG9ydCIsImxvbmciLCJsb25nIiwibG9uZyIsImxvbmciLCJsb25nIiwibG9uZyJ9OworI2VuZGlmCitzdGF0aWMgc3RydWN0IElDICpkb19yZWZzKEZJTEUgKixzdHJ1Y3QgSUMgKik7CitzdGF0aWMgdm9pZCBwcihGSUxFICosc3RydWN0IElDICopOworc3RhdGljIHZvaWQgZnVuY3Rpb25fdG9wKEZJTEUgKixzdHJ1Y3QgVmFyICosbG9uZyk7CitzdGF0aWMgdm9pZCBmdW5jdGlvbl9ib3R0b20oRklMRSAqZixzdHJ1Y3QgVmFyICosbG9uZyk7CisKKyNkZWZpbmUgaXNyZWcoeCkgKChwLT54LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpCisKK3N0YXRpYyBpbnQgcTFyZWcscTJyZWcsenJlZzsKKworc3RhdGljIGNoYXIgKmNjc1tdPXsiZXEiLCJuZSIsImx0IiwiZ2UiLCJsZSIsImd0IiwiIn07CitzdGF0aWMgY2hhciAqbG9naWNhbHNbXT17Im9yIiwieG9yIiwiYW5kIn07CitzdGF0aWMgY2hhciAqcmVjb3JkW109eyIiLCIuIn07CitzdGF0aWMgY2hhciAqYXJpdGhtZXRpY3NbXT17InNsdyIsInNydyIsImFkZCIsInN1YiIsIm11bGx3IiwiZGl2dyIsIm1vZCJ9Oworc3RhdGljIGNoYXIgKmlzaW1tW109eyIiLCJpIn07CisKK3N0YXRpYyBzdHJ1Y3QgSUMgKmRvX3JlZnMoRklMRSAqZixzdHJ1Y3QgSUMgKnApCisvKiAgRG9lcyBzb21lIHByZS1wcm9jZXNzaW5nIGxpa2UgZmV0Y2hpbmcgb3BlcmFuZHMgZnJvbSBtZW1vcnkgdG8gICAgICAqLworLyogIHJlZ2lzdGVycyBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IHR5cCx0eXAxLHJlZyxjPWFicyhwLT5jb2RlKTsKKworICBxMWxvYWRlZD1xMmxvYWRlZD0wOworCisgIC8qIGNhbm5vdCB1c2UgcTF0eXAsIGJlY2F1c2UgcC0+Y29kZSBtYXkgaGF2ZSBiZWVuIG5lZ2F0ZWQgKi8KKyAgaWYoYz09Q09OVkVSVCkgCisgICAgdHlwPXAtPnR5cGYyOworICBlbHNlCisgICAgdHlwPXAtPnR5cGY7CisKKyAgaWYoKHR5cCZOUSk9PVBPSU5URVIpIHR5cD1VTlNJR05FRHxMT05HOworCisgIGlmKChjPT1TVUJ8fGM9PVNVQklGUCkmJihwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCYmKHR5cCZOUSk8PUxMT05HKXsKKyAgICBldmFsX2NvbnN0KCZwLT5xMi52YWwsdHlwKTsKKyAgICBpZih6bWxlcSh2bWF4LGwyem0oMzI3NjhMKSkmJnptbGVxKGwyem0oLTMyNzY3TCksdm1heCkpeworICAgICAgdW5pb24gYXR5cHMgdmFsOworICAgICAgaWYoYz09U1VCKXsKKyAgICAgICAgaWYocC0+Y29kZT09U1VCKSBwLT5jb2RlPWM9QUREOyBlbHNlIHAtPmNvZGU9Yz0tQUREOworICAgICAgfWVsc2V7CisgICAgICAgIGlmKHAtPmNvZGU9PVNVQklGUCkgcC0+Y29kZT1jPUFEREkyUDsgZWxzZSBwLT5jb2RlPWM9LUFEREkyUDsKKyAgICAgIH0KKyAgICAgIGM9YWJzKGMpOworICAgICAgdmFsLnZtYXg9em1zdWIobDJ6bSgwTCksdm1heCk7CisgICAgICBldmFsX2NvbnN0KCZ2YWwsTUFYSU5UKTsKKyAgICAgIGluc2VydF9jb25zdCgmcC0+cTIudmFsLHR5cCk7CisgICAgICBwLT50eXBmPXR5cD0odHlwJn5VTlNJR05FRCk7CisgICAgfQorICB9CisKKyAgcTFyZWc9cTJyZWc9enJlZz0wOworICBpZihwLT5xMS5mbGFncyZSRUcpIHExcmVnPXAtPnExLnJlZzsKKyAgaWYocC0+cTIuZmxhZ3MmUkVHKSBxMnJlZz1wLT5xMi5yZWc7CisgIGlmKChwLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpIHpyZWc9cC0+ei5yZWc7CisKKyAgaWYoKHAtPnExLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKyAgICBldmFsX2NvbnN0KCZwLT5xMS52YWwsdHlwKTsKKyAgICBpZihJU0ZMT0FUKHR5cCkpIHJlZz1mMTsgZWxzZSByZWc9dDE7CisgICAgaWYoYz09QVNTSUdOJiZ6cmVnKSByZWc9enJlZzsKKyAgICBpZihjPT1TRVRSRVRVUk4mJnAtPnoucmVnKSByZWc9cC0+ei5yZWc7CisgICAgaWYoYyE9U1VCfHwodHlwJk5RKT5MT05HfHwhem1sZXEodm1heCxsMnptKDMyNzY3TCkpfHwhem1sZXEobDJ6bSgtMzI3NjhMKSx2bWF4KSl7CisgICAgICBsb2FkX3JlZyhmLHJlZywmcC0+cTEsdHlwLHQxKTsKKyAgICAgIHExcmVnPXJlZzsKKyAgICAgIHExbG9hZGVkPTE7CisgICAgfQorICB9ZWxzZSBpZihjIT1BRERSRVNTKXsKKyAgICBpZihJU0ZMT0FUKHR5cCkpIHJlZz1mMTsgZWxzZSByZWc9dDE7CisgICAgaWYoKGM9PUFTU0lHTnx8KGM9PUNPTlZFUlQmJklTSU5UKHAtPnR5cGYyKSkpJiZ6cmVnPj0xJiZ6cmVnPD0zMikgcmVnPXpyZWc7CisgICAgaWYoKGM9PUFTU0lHTnx8KGM9PUNPTlZFUlQmJklTRkxPQVQocC0+dHlwZjIpKSkmJnpyZWc+PTMzJiZ6cmVnPD02NCkgcmVnPXpyZWc7CisgICAgaWYoYz09U0VUUkVUVVJOJiZwLT56LnJlZykgcmVnPXAtPnoucmVnOworICAgIGlmKHAtPnExLmFtKXsKKyAgICAgIGxvYWRfcmVnKGYscmVnLCZwLT5xMSx0eXAsdDEpOworICAgICAgcTFyZWc9cmVnOworICAgICAgcTFsb2FkZWQ9MTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKHAtPnExLmZsYWdzJiYhcTFyZWcpeworICAgICAgICBpZihwLT5xMS5mbGFncyZEUkVGT0JKKSB7dHlwMT1QT0lOVEVSO3JlZz10MTt9IGVsc2UgdHlwMT10eXA7CisgICAgICAgIGlmKCh0eXAxJk5RKTw9UE9JTlRFUil7CisgICAgICAgICAgaW50IG09cC0+cTEuZmxhZ3M7CisgICAgICAgICAgcC0+cTEuZmxhZ3MmPX5EUkVGT0JKOworICAgICAgICAgIGxvYWRfcmVnKGYscmVnLCZwLT5xMSx0eXAxLHQxKTsKKyAgICAgICAgICBwLT5xMS5mbGFncz1tOworICAgICAgICAgIHExcmVnPXJlZzsKKwkgIHExbG9hZGVkPTE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmKChwLT5xMS5mbGFncyZEUkVGT0JKKSYmKHR5cCZOUSk8PVBPSU5URVIpeworICAgICAgICBpZihJU0ZMT0FUKHR5cCkpIHJlZz1mMTsgZWxzZSByZWc9dDE7CisgICAgICAgIGlmKChjPT1BU1NJR058fChjPT1DT05WRVJUJiZJU0lOVChwLT50eXBmMikpKSYmenJlZz49MSYmenJlZzw9MzIpIHJlZz16cmVnOworCWlmKChjPT1BU1NJR058fChjPT1DT05WRVJUJiZJU0ZMT0FUKHAtPnR5cGYyKSkpJiZ6cmVnPj0zMyYmenJlZzw9NjQpIHJlZz16cmVnOworICAgICAgICBpZihjPT1TRVRSRVRVUk4mJnAtPnoucmVnKSByZWc9cC0+ei5yZWc7CisgICAgICAgIGlmKHAtPnExLmFtKQorICAgICAgICAgIGxvYWRfcmVnKGYscmVnLCZwLT5xMSx0eXAsdDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgbG9hZF9yZWcoZixyZWcsY2FtKElNTV9JTkQscTFyZWcsMCksdHlwLHQxKTsKKyAgICAgICAgcTFyZWc9cmVnOworCXExbG9hZGVkPTE7CisgICAgICB9CisgICAgfQorICB9CisgIC8qIGNhbm5vdCB1c2UgcTJ0eXAgKHNlZSBhYm92ZSkgKi8KKyAgdHlwPXAtPnR5cGY7CisgIGlmKChwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHR5cCk7CisgICAgaWYoSVNGTE9BVCh0eXApKSByZWc9ZjI7IGVsc2UgcmVnPXQyOworICAgIGlmKElTRkxPQVQodHlwKXx8Yz09RElWfHxjPT1TVUJ8fGM9PU1PRCl7CisgICAgICBsb2FkX3JlZyhmLHJlZywmcC0+cTIsdHlwLHQyKTsKKyAgICAgIHEycmVnPXJlZzsKKyAgICAgIHEybG9hZGVkPTE7CisgICAgfWVsc2V7CisgICAgICBpZigoYz49T1ImJmM8PUFORCl8fChjPT1DT01QQVJFJiYodHlwJlVOU0lHTkVEKSkpeworICAgICAgICBpZighenVtbGVxKHZ1bWF4LHVsMnp1bSg2NTUzNVVMKSkpeworICAgICAgICAgIGxvYWRfcmVnKGYscmVnLCZwLT5xMix0eXAsdDIpOworICAgICAgICAgIHEycmVnPXJlZzsKKwkgIHEybG9hZGVkPTE7CisgICAgICAgIH0KKyAgICAgIH1lbHNleworICAgICAgICBpZighem1sZXEodm1heCxsMnptKDMyNzY3TCkpfHwhem1sZXEobDJ6bSgtMzI3NjhMKSx2bWF4KSl7CisgICAgICAgICAgbG9hZF9yZWcoZixyZWcsJnAtPnEyLHR5cCx0Mik7CisgICAgICAgICAgcTJyZWc9cmVnOworCSAgcTJsb2FkZWQ9MTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfWVsc2V7CisgICAgaWYocC0+cTIuYW0peworICAgICAgaWYoSVNGTE9BVCh0eXApKSByZWc9ZjI7IGVsc2UgcmVnPXQyOworICAgICAgbG9hZF9yZWcoZixyZWcsJnAtPnEyLHR5cCx0Mik7CisgICAgICBxMnJlZz1yZWc7CisgICAgICBxMmxvYWRlZD0xOworICAgIH1lbHNleworICAgICAgaWYocC0+cTIuZmxhZ3MmJiFxMnJlZyl7CisgICAgICAgIGlmKChwLT5xMi5mbGFncyZEUkVGT0JKKSkgdHlwMT1QT0lOVEVSOyBlbHNlIHR5cDE9dHlwOworICAgICAgICBpZihJU0ZMT0FUKHR5cDEpKSByZWc9ZjI7IGVsc2UgcmVnPXQyOworICAgICAgICBpZigodHlwMSZOUSk8PVBPSU5URVIpeworICAgICAgICAgIGludCBtPXAtPnEyLmZsYWdzOworICAgICAgICAgIHAtPnEyLmZsYWdzJj1+RFJFRk9CSjsKKyAgICAgICAgICBsb2FkX3JlZyhmLHJlZywmcC0+cTIsdHlwMSx0Mik7CisgICAgICAgICAgcC0+cTIuZmxhZ3M9bTsKKyAgICAgICAgICBxMnJlZz1yZWc7CisJICBxMmxvYWRlZD0xOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZigocC0+cTIuZmxhZ3MmRFJFRk9CSikmJih0eXAmTlEpPD1QT0lOVEVSKXsKKyAgICAgICAgaWYoSVNGTE9BVCh0eXApKSByZWc9ZjI7IGVsc2UgcmVnPXQyOworICAgICAgICBpZihwLT5xMi5hbSkKKyAgICAgICAgICBsb2FkX3JlZyhmLHJlZywmcC0+cTIsdHlwLHQyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGxvYWRfcmVnKGYscmVnLGNhbShJTU1fSU5ELHEycmVnLDApLHR5cCx0Mik7CisgICAgICAgIHEycmVnPXJlZzsKKwlxMmxvYWRlZD0xOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihwLT56LmFtfHwocC0+ei5mbGFncyYmIWlzcmVnKHopKSl7CisgICAgdHlwPXAtPnR5cGY7CisgICAgaWYoYyE9QUREUkVTUyYmSVNGTE9BVCh0eXApKSB6cmVnPWYzOyBlbHNlIHpyZWc9dDM7CisgIH0KKyAgaWYocTFyZWcpe3AtPnExLmZsYWdzPVJFRztwLT5xMS5yZWc9cTFyZWc7cC0+cTEuYW09MDt9CisgIGlmKHEycmVnKXtwLT5xMi5mbGFncz1SRUc7cC0+cTIucmVnPXEycmVnO3AtPnEyLmFtPTA7fQorICByZXR1cm4gcDsKK30KK3N0YXRpYyB2b2lkIHByKEZJTEUgKmYsc3RydWN0IElDICpwKQorICAgICAvKiAgV3JpdGVzIHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbiBpZiBuZWNlc3NhcnkuICAgKi8KK3sKKyAgaW50IHR5cD1wLT50eXBmOworICBpZihwLT5jb2RlPT1BRERSRVNTKSB0eXA9UE9JTlRFUjsKKyAgaWYocC0+ei5mbGFncyl7CisgICAgaWYoenJlZz49NzQmJnpyZWc8PTg2KXtwcmludGYoImM9JWRcbiIscC0+Y29kZSk7IGllcnJvcigwKTt9CisgICAgaWYocC0+ei5hbSl7CisgICAgICBzdG9yZV9yZWcoZix6cmVnLCZwLT56LHR5cCk7CisgICAgfWVsc2UgaWYoIWlzcmVnKHopKXsKKyAgICAgIGlmKHAtPnouZmxhZ3MmRFJFRk9CSil7CisgICAgICAgIGlmKHAtPnouZmxhZ3MmUkVHKXsKKyAgICAgICAgICBpZihwLT56LmFtKQorICAgICAgICAgICAgc3RvcmVfcmVnKGYsenJlZywmcC0+eix0eXApOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0b3JlX3JlZyhmLHpyZWcsY2FtKElNTV9JTkQscC0+ei5yZWcsMCksdHlwKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgaW50IHI7CisgICAgICAgICAgaWYodDE9PXpyZWcpIHI9dDI7IGVsc2Ugcj10MTsKKyAgICAgICAgICBsb2FkX3JlZyhmLHIsJnAtPnosUE9JTlRFUixyKTsKKyAgICAgICAgICBzdG9yZV9yZWcoZix6cmVnLGNhbShJTU1fSU5ELHIsMCksdHlwKTsKKyAgICAgICAgfQorICAgICAgfWVsc2V7CisgICAgICAgIHN0b3JlX3JlZyhmLHpyZWcsJnAtPnosdHlwKTsKKyAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgIGlmKHAtPnoucmVnIT16cmVnKQorICAgICAgICBlbWl0KGYsIlx0JXNtclx0JXMsJXNcbiIsKHpyZWc+PTMzJiZ6cmVnPD02NCk/ImYiOiIiLG1yZWduYW1lc1twLT56LnJlZ10sbXJlZ25hbWVzW3pyZWddKTsKKyAgICB9CisgIH0KK30KK3N0YXRpYyBpbnQgZHdhcmYyX3JlZ251bWJlcihpbnQgcikKK3sKKyAgaWYocj09MCkgaWVycm9yKDApOworICBpZihyPD0zMikKKyAgICByZXR1cm4gci0xOworICBlbHNlIGlmKHI8PTY0KQorICAgIHJldHVybiByKzY7CisgIGVsc2UKKyAgICBpZXJyb3IoMCk7Cit9CitzdGF0aWMgem1heCBkd2FyZjJfZmJvZmZzZXQoc3RydWN0IFZhciAqdikKK3sKKyAgc3RydWN0IG9iaiBvOworICBpZighdnx8KHYtPnN0b3JhZ2VfY2xhc3MhPUFVVE8mJnYtPnN0b3JhZ2VfY2xhc3MhPVJFR0lTVEVSKSkgaWVycm9yKDApOworICBvLmZsYWdzPVZBUjsKKyAgby52PXY7CisgIG8udmFsLnZtYXg9bDJ6bSgwTCk7CisgIHJldHVybiBsMnptKHJlYWxfb2Zmc2V0KCZvKSk7Cit9CitzdGF0aWMgdm9pZCBkd2FyZjJfcHJpbnRfZnJhbWVfbG9jYXRpb24oRklMRSAqZixzdHJ1Y3QgVmFyICp2KQoreworICBzdHJ1Y3Qgb2JqIG87CisgIG8uZmxhZ3M9UkVHOworICBvLnJlZz1zcDsKKyAgby52YWwudm1heD1sMnptKDBMKTsKKyAgby52PTA7CisgIGR3YXJmMl9wcmludF9sb2NhdGlvbihmLCZvKTsKK30KK3N0YXRpYyB2b2lkIGVtaXRfb2JqKEZJTEUgKmYsc3RydWN0IG9iaiAqcCxpbnQgdCkKKy8qICBQcmludHMgYW4gb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpZihwLT5hbSl7CisgICAgaWYocC0+YW0tPmZsYWdzJlJFR19JTkQpIGVtaXQoZiwiJXMsJXMiLG1yZWduYW1lc1twLT5hbS0+b2Zmc2V0XSxtcmVnbmFtZXNbcC0+YW0tPmJhc2VdKTsKKyAgICBpZihwLT5hbS0+ZmxhZ3MmSU1NX0lORCkgZW1pdChmLCIlbGQoJXMpIixwLT5hbS0+b2Zmc2V0LG1yZWduYW1lc1twLT5hbS0+YmFzZV0pOworICAgIHJldHVybjsKKyAgfQorICAvKiAgaWYocC0+ZmxhZ3MmRFJFRk9CSikgZW1pdChmLCIoIik7Ki8KKyAgaWYocC0+ZmxhZ3MmVkFSKSB7CisgICAgaWYocC0+di0+c3RvcmFnZV9jbGFzcz09QVVUT3x8cC0+di0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpeworICAgICAgaWYocC0+ZmxhZ3MmUkVHKXsKKyAgICAgICAgZW1pdChmLCIlcyIsbXJlZ25hbWVzW3AtPnJlZ10pOworICAgICAgfWVsc2V7CisgICAgICAgIGVtaXQoZiwiJWxkKCVzKSIscmVhbF9vZmZzZXQocCksbXJlZ25hbWVzW2ZwXSk7CisgICAgICB9CisgICAgfWVsc2V7CisgICAgICBpZighem1lcXRvKGwyem0oMEwpLHAtPnZhbC52bWF4KSl7ZW1pdHZhbChmLCZwLT52YWwsTUFYSU5UKTtlbWl0KGYsIisiKTt9CisgICAgICBpZihwLT52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpeworICAgICAgICBlbWl0KGYsIiVzJWxkIixsYWJwcmVmaXgsem0ybChwLT52LT5vZmZzZXQpKTsKKyAgICAgIH1lbHNleworICAgICAgICBlbWl0KGYsIiVzJXMiLGlkcHJlZml4LHAtPnYtPmlkZW50aWZpZXIpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZigocC0+ZmxhZ3MmUkVHKSYmIShwLT5mbGFncyZWQVIpKSBlbWl0KGYsIiVzIixtcmVnbmFtZXNbcC0+cmVnXSk7CisgIGlmKHAtPmZsYWdzJktPTlNUKXsKKyAgICBlbWl0dmFsKGYsJnAtPnZhbCx0Jk5VKTsKKyAgfQorICAvKiAgaWYocC0+ZmxhZ3MmRFJFRk9CSikgZW1pdChmLCIpIik7Ki8KK30KK3N0YXRpYyBpbnQgZXhpc3RzX2ZyZWVyZWcoc3RydWN0IElDICpwLGludCByZWcpCisvKiAgVGVzdCBpZiB0aGVyZSBpcyBhIHNlcXVlbmNlIG9mIEZSRUVSRUdzIGNvbnRhaW5pbmcgRlJFRVJFRyByZWcuICovCit7CisgIHdoaWxlKHAmJihwLT5jb2RlPT1GUkVFUkVHfHxwLT5jb2RlPT1BTExPQ1JFRykpeworICAgIGlmKHAtPmNvZGU9PUZSRUVSRUcmJnAtPnExLnJlZz09cmVnKSByZXR1cm4gMTsKKyAgICBwPXAtPm5leHQ7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzaXplX3QgbHNpemU7CitzdGF0aWMgYnZ0eXBlICpvbmNlLCp0d2ljZTsKKworc3RhdGljIHZvaWQgcGVlcGhvbGUoc3RydWN0IElDICpwKQorLyogVHJ5IHRvIHVzZSBhZGRyZXNzaW5nIG1vZGVzICovCit7CisgIGludCBjLGMyLHIsY250LG1heGxhYmVsLHVzZWxyPTA7c3RydWN0IElDICpwMjtzdHJ1Y3QgQWRkcmVzc2luZ01vZGUgKmFtOworICBpZihjcm9zc19tb2R1bGUpeworICAgIGxhc3RsYWJlbD0wOworICAgIGZvcihwMj1wO3AyO3AyPXAyLT5uZXh0KXsKKyAgICAgIGlmKHAyLT5jb2RlPj1MQUJFTCYmcDItPmNvZGU8PUJSQSl7CisJaWYoIWxhc3RsYWJlbHx8cDItPnR5cGY8bGFzdGxhYmVsKSBsYXN0bGFiZWw9cDItPnR5cGY7CisJaWYocC0+dHlwZj5tYXhsYWJlbCkgbWF4bGFiZWw9cC0+dHlwZjsKKyAgICAgIH0KKyAgICB9CisgIH1lbHNleworICAgIG1heGxhYmVsPWxhYmVsOyAvKkZJWE1FKi8KKyAgfQorICAvKmxzaXplPSgobGFiZWwtbGFzdGxhYmVsKzErNykvQ0hBUl9CSVQpKkNIQVJfQklUOyovCisgIGxzaXplPUJWU0laRShsYWJlbC1sYXN0bGFiZWwrMSk7CisgIG9uY2U9bXltYWxsb2MobHNpemUpOworICB0d2ljZT1teW1hbGxvYyhsc2l6ZSk7CisgIG1lbXNldChvbmNlLDAsbHNpemUpOworICBtZW1zZXQodHdpY2UsMCxsc2l6ZSk7CisgIGZvcig7cDtwPXAtPm5leHQpeworICAgIGM9cC0+Y29kZTsKKyAgICBpZihjPT1DQUxMKXsKKyAgICAgIGlmKHAtPmNhbGxfbGlzdD09MCl7CisJdXNlbHI9MTsKKyAgICAgIH1lbHNleworCWludCBpOworCWZvcihpPTA7aTxwLT5jYWxsX2NudDtpKyspCisJICBpZighcC0+Y2FsbF9saXN0W2ldLnYtPmZpfHwKKwkgICAgICFwLT5jYWxsX2xpc3RbaV0udi0+ZmktPmlubGluZV9hc218fAorCSAgICAgIShwLT5jYWxsX2xpc3RbaV0udi0+ZmktPmZsYWdzJkFMTF9SRUdTKXx8CisJICAgICBCVFNUKHAtPmNhbGxfbGlzdFtpXS52LT5maS0+cmVnc19tb2RpZmllZCxscikpCisJICAgIHVzZWxyPTE7CisgICAgICB9CisgICAgfQorICAgIGlmKChxMXR5cChwKSZOUSk9PUxMT05HJiYoYz09TVVMVHx8Yz09RElWfHxjPT1NT0R8fGM9PUxTSElGVHx8Yz09UlNISUZUKSkgdXNlbHI9MTsKKyAgICBpZihjPT1DT05WRVJUJiYocTF0eXAocCkmTlEpPT1MTE9ORyYmSVNGTE9BVCh6dHlwKHApJk5RKSkgdXNlbHI9MTsKKyAgICBpZihjPT1DT05WRVJUJiYoenR5cChwKSZOUSk9PUxMT05HJiZJU0ZMT0FUKHExdHlwKHApJk5RKSkgdXNlbHI9MTsKKyAgICBpZihjIT1GUkVFUkVHJiZjIT1BTExPQ1JFRyYmKGMhPVNFVFJFVFVSTnx8IWlzcmVnKHExKXx8cC0+cTEucmVnIT1wLT56LnJlZykpIGV4aXRfbGFiZWw9MDsKKyAgICBpZihjPT1MQUJFTCkgZXhpdF9sYWJlbD1wLT50eXBmOworICAgIC8qIFRlc3Qgd2hpY2ggbGFiZWxzIGFyZSBqdW1wZWQgdG8gbW9yZSB0aGFuIG9uY2UuICovCisgICAgaWYoKGM+PUJFUSYmYzw9QlJBKSYmcC0+dHlwZi1sYXN0bGFiZWw+PWxzaXplKkNIQVJfQklUKXsKKyAgICAgIHByaW50ZigibHNpemU9JWx1IHAtPnR5cGY9JWQgbGFzdGxhYmVsPSVkXG4iLGxzaXplLHAtPnR5cGYsbGFzdGxhYmVsKTsKKyAgICAgIGllcnJvcigwKTsKKyAgICB9CisgICAgaWYoYz49QkVRJiZjPD1CUkEpeworICAgICAgaWYoQlRTVChvbmNlLHAtPnR5cGYtbGFzdGxhYmVsKSkKKyAgICAgICAgQlNFVCh0d2ljZSxwLT50eXBmLWxhc3RsYWJlbCk7CisgICAgICBlbHNlCisgICAgICAgIEJTRVQob25jZSxwLT50eXBmLWxhc3RsYWJlbCk7CisgICAgfQorICAgIC8qIFRyeSB0ZXN0LW9wdCAqLworICAgIGlmKGM9PVRFU1QmJiEocC0+cTEuZmxhZ3MmRFJFRk9CSikpeworICAgICAgZm9yKHAyPXAtPnByZXY7cDI7cDI9cDItPnByZXYpeworICAgICAgICBjMj1wMi0+Y29kZTsKKyAgICAgICAgaWYoYzI9PU5PUHx8YzI9PUFMTE9DUkVHfHxjMj09RlJFRVJFRykgY29udGludWU7CisgICAgICAgIGlmKGMyPT1DQUxMfHwoYzI+PUxBQkVMJiZjMjw9QlJBKSkgYnJlYWs7CisgICAgICAgIGlmKChwMi0+ei5mbGFncyZEUkVGT0JKKSYmKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpIT1SRUcpIGJyZWFrOworICAgICAgICBpZihwLT5xMS5mbGFncz09cDItPnouZmxhZ3MmJnAtPnExLmFtPT1wMi0+ei5hbSl7CisgICAgICAgICAgaWYoIShwLT5xMS5mbGFncyZWQVIpfHwocC0+cTEudj09cDItPnoudiYmem1lcXRvKHAtPnExLnZhbC52bWF4LHAyLT56LnZhbC52bWF4KSkpeworICAgICAgICAgICAgaWYoIShwLT5xMS5mbGFncyZSRUcpfHxwLT5xMS5yZWc9PXAyLT56LnJlZyl7CisgICAgICAgICAgICAgIGlmKHAtPnouZmxhZ3M9PTB8fChpc3JlZyh6KSYmcC0+ei5yZWc9PWNyMCkpeworICAgICAgICAgICAgICAgIGlmKHAtPnR5cGY9PXAyLT50eXBmJiYoIShwLT50eXBmJlVOU0lHTkVEKXx8IW11bHRpcGxlX2NjcykpeworCQkgIHAyLT5leHQuc2V0Y2M9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgLyogVHJ5IHVwZGF0ZSAqLworICAgIGlmKChjPT1BRERJMlB8fGM9PVNVQklGUCkmJmlzcmVnKHExKSYmaXNyZWcoeikmJnAtPnExLnJlZz09cC0+ei5yZWcpeworICAgICAgaWYoKHAtPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKyAgICAgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHAtPnR5cGYpOworICAgICAgICBpZihjPT1TVUJJRlApIHZtYXg9em1zdWIobDJ6bSgwTCksdm1heCk7CisgICAgICAgIGlmKHptbGVxKGwyem0oLTMyNzY4TCksdm1heCkmJnptbGVxKHZtYXgsbDJ6bSgzMjc2N0wpKSl7CisgICAgICAgICAgc3RydWN0IG9iaiAqbzsKKyAgICAgICAgICByPXAtPnExLnJlZztjbnQ9MDtvPTA7CisgICAgICAgICAgZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpeworICAgICAgICAgICAgYzI9cDItPmNvZGU7CisgICAgICAgICAgICBpZihjMj09Tk9QfHxjMj09QUxMT0NSRUd8fGMyPT1GUkVFUkVHKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmKChjMj09Q0FMTC8qJiZyZWdzY3JhdGNoW3JdKi8pfHwoYzI+PUxBQkVMJiZjMjw9QlJBKSkgYnJlYWs7CisgICAgICAgICAgICBpZigocDItPnExLmZsYWdzJihEUkVGT0JKfFJFRykpPT1SRUcmJnAyLT5xMS5yZWc9PXIpIGJyZWFrOworICAgICAgICAgICAgaWYoKHAyLT5xMi5mbGFncyYoRFJFRk9CSnxSRUcpKT09UkVHJiZwMi0+cTIucmVnPT1yKSBicmVhazsKKyAgICAgICAgICAgIGlmKChwMi0+ei5mbGFncyYoRFJFRk9CSnxSRUcpKT09UkVHJiZwMi0+ei5yZWc9PXIpIGJyZWFrOworICAgICAgICAgICAgaWYoKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnExLnJlZz09cikgY250fD0xOworICAgICAgICAgICAgaWYoKHAyLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnEyLnJlZz09cikgY250fD0yOworICAgICAgICAgICAgaWYoKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+ei5yZWc9PXIpIGNudHw9NDsKKyAgICAgICAgICAgIGlmKChjbnQmMyk9PTMpIGJyZWFrOworICAgICAgICAgICAgaWYoY250KXsKKwkgICAgICBpZihjbnQmMSl7CisJCWlmKChxMXR5cChwMikmTlEpPT1MTE9ORykgYnJlYWs7CisJCW89JnAyLT5xMTsKKwkgICAgICB9ZWxzZSBpZihjbnQmMil7CisJCWlmKChxMnR5cChwMikmTlEpPT1MTE9ORykgYnJlYWs7CisJCW89JnAyLT5xMjsKKwkgICAgICB9ZWxzZXsKKwkJaWYoKHp0eXAocDIpJk5RKT09TExPTkcpIGJyZWFrOworCQlvPSZwMi0+ejsKKwkgICAgICB9CisgICAgICAgICAgICAgIGlmKHAyLT5jb2RlPT1BU1NJR04mJigocDItPnR5cGYmTlEpPlBPSU5URVJ8fCF6bWVxdG8ocDItPnEyLnZhbC52bWF4LHNpemV0YWJbcDItPnR5cGYmTlFdKSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIG8tPmFtPWFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKKyAgICAgICAgICAgICAgby0+YW0tPmZsYWdzPShJTU1fSU5EfFVQREFURSk7CisgICAgICAgICAgICAgIG8tPmFtLT5iYXNlPXI7CisgICAgICAgICAgICAgIG8tPmFtLT5vZmZzZXQ9em0ybCh2bWF4KTsKKyAgICAgICAgICAgICAgcC0+Y29kZT1jPU5PUDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8qIFRyeSBjb25zdChyZWcpICovCisjaWZuZGVmIG9sZHBlZXAKKyAgICBpZigoYz09QURESTJQfHxjPT1TVUJJRlApJiZpc3JlZyh6KSYmKHAtPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKyAgICAgIGludCBiYXNlO3ptYXggb2Y7c3RydWN0IG9iaiAqbzsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxwLT50eXBmKTsKKyAgICAgIGlmKGM9PVNVQklGUCkgb2Y9em1zdWIobDJ6bSgwTCksdm1heCk7IGVsc2Ugb2Y9dm1heDsKKyAgICAgIGlmKHptbGVxKGwyem0oLTMyNzY4TCksdm1heCkmJnptbGVxKHZtYXgsbDJ6bSgzMjc2N0wpKSl7CisJcj1wLT56LnJlZzsKKwlpZihpc3JlZyhxMSkpIGJhc2U9cC0+cTEucmVnOyBlbHNlIGJhc2U9cjsKKwlvPTA7CisJZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpeworCSAgYzI9cDItPmNvZGU7CisJICBpZihjMj09Q0FMTHx8YzI9PUxBQkVMfHwoYzI+PUJFUSYmYzI8PUJSQSkpIGJyZWFrOworCSAgaWYoYzIhPUZSRUVSRUcmJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09cikgYnJlYWs7CisJICBpZihjMiE9RlJFRVJFRyYmKHAyLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTIucmVnPT1yKSBicmVhazsKKwkgIGlmKGMyIT1DQUxMJiYoYzI8TEFCRUx8fGMyPkJSQSkvKiYmYzIhPUFERFJFU1MqLyl7CisJICAgIGlmKCFwMi0+cTEuYW0mJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT5xMS5yZWc9PXIpeworCSAgICAgIGlmKG8pIGJyZWFrOworCSAgICAgIG89JnAyLT5xMTsKKwkgICAgfQorCSAgICBpZighcDItPnEyLmFtJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTIucmVnPT1yKXsKKwkgICAgICBpZihvKSBicmVhazsKKwkgICAgICBvPSZwMi0+cTI7CisJICAgIH0KKwkgICAgaWYoIXAyLT56LmFtJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT56LnJlZz09cil7CisJICAgICAgaWYobykgYnJlYWs7CisJICAgICAgbz0mcDItPno7CisJICAgIH0KKwkgIH0KKwkgIGlmKGMyPT1GUkVFUkVHfHwocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisJICAgIGludCBtOworCSAgICBpZihjMj09RlJFRVJFRykKKwkgICAgICBtPXAyLT5xMS5yZWc7CisJICAgIGVsc2UKKwkgICAgICBtPXAyLT56LnJlZzsKKwkgICAgaWYobT09cil7CisJICAgICAgaWYobyl7CisJCW8tPmFtPWFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKKwkJYW0tPmZsYWdzPUlNTV9JTkQ7CisJCWFtLT5iYXNlPWJhc2U7CisJCWFtLT5vZmZzZXQ9em0ybChvZik7CisJCWlmKGlzcmVnKHExKSl7CisJCSAgcC0+Y29kZT1jPU5PUDtwLT5xMS5mbGFncz1wLT5xMi5mbGFncz1wLT56LmZsYWdzPTA7CisJCX1lbHNleworCQkgIHAtPmNvZGU9Yz1BU1NJR047cC0+cTIuZmxhZ3M9MDsKKwkJICBwLT50eXBmPXAtPnR5cGYyO3AtPnEyLnZhbC52bWF4PXNpemV0YWJbcC0+dHlwZjImTlFdOworCQl9CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGlmKGMyIT1GUkVFUkVHJiZtPT1iYXNlKSBicmVhazsKKwkgICAgY29udGludWU7CisJICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIGlmKChjPT1BRERJMlB8fGM9PVNVQklGUCkmJihwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCYmaXNyZWcoeikpeworICAgICAgaW50IGJhc2U7em1heCBvZjsKKyAgICAgIHAyPXAtPm5leHQ7CisgICAgICB3aGlsZShwMiYmKHAyLT5jb2RlPT1GUkVFUkVHfHxwMi0+Y29kZT09QUxMT0NSRUcpKSBwMj1wMi0+bmV4dDsKKyAgICAgIGlmKHAyKSBjMj1wMi0+Y29kZTsgZWxzZSBjMj0wOworICAgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHAtPnR5cGYpOworICAgICAgaWYoYz09U1VCSUZQKSBvZj16bXN1YihsMnptKDBMKSx2bWF4KTsgZWxzZSBvZj12bWF4OworICAgICAgcj1wLT56LnJlZzsKKyAgICAgIGlmKGlzcmVnKHExKSkgYmFzZT1wLT5xMS5yZWc7IGVsc2UgYmFzZT1yOworICAgICAgaWYoYzImJnptbGVxKGwyem0oLTMyNzY4TCksb2YpJiZ6bWxlcShvZixsMnptKDMyNzY3TCkpJiZjMiE9Q0FMTCYmKGMyPExBQkVMfHxjMj5CUkEpCisgICAgICAgICAmJihjMiE9QVNTSUdOfHwoKHAyLT50eXBmJk5RKTw9UE9JTlRFUiYmem1lcXRvKHAyLT5xMi52YWwudm1heCxzaXpldGFiW3AyLT50eXBmJk5RXSkpKQorICAgICAgICAgJiZjMiE9QUREUkVTUyYmKCgocDItPnouZmxhZ3MmKERSRUZPQkp8UkVHKSk9PVJFRyYmcDItPnoucmVnPT1yJiZwMi0+cTIuZmxhZ3M9PTApfHxleGlzdHNfZnJlZXJlZyhwMi0+bmV4dCxyKSkpeworICAgICAgICBpZigoKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKSE9UkVHfHxwMi0+cTEucmVnIT1yKQorICAgICAgICAgICAmJigocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpIT1SRUd8fHAyLT5xMi5yZWchPXIpKXsKKyAgICAgICAgICBjbnQ9MDsKKyAgICAgICAgICBpZigocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTEucmVnPT1yKXsKKyAgICAgICAgICAgIHAyLT5xMS5hbT1hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CisgICAgICAgICAgICBwMi0+cTEuYW0tPmZsYWdzPUlNTV9JTkQ7CisgICAgICAgICAgICBwMi0+cTEuYW0tPmJhc2U9YmFzZTsKKyAgICAgICAgICAgIHAyLT5xMS5hbS0+b2Zmc2V0PXptMmwob2YpOworICAgICAgICAgICAgY250Kys7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKChwMi0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT5xMi5yZWc9PXIpeworICAgICAgICAgICAgcDItPnEyLmFtPWFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKKyAgICAgICAgICAgIHAyLT5xMi5hbS0+ZmxhZ3M9SU1NX0lORDsKKyAgICAgICAgICAgIHAyLT5xMi5hbS0+YmFzZT1iYXNlOworICAgICAgICAgICAgcDItPnEyLmFtLT5vZmZzZXQ9em0ybChvZik7CisgICAgICAgICAgICBjbnQrKzsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYoKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+ei5yZWc9PXIpeworICAgICAgICAgICAgcDItPnouYW09YW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworICAgICAgICAgICAgcDItPnouYW0tPmZsYWdzPUlNTV9JTkQ7CisgICAgICAgICAgICBwMi0+ei5hbS0+YmFzZT1iYXNlOworICAgICAgICAgICAgcDItPnouYW0tPm9mZnNldD16bTJsKG9mKTsKKyAgICAgICAgICAgIGNudCsrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZihpc3JlZyhxMSkpeworICAgICAgICAgICAgcC0+Y29kZT1OT1A7cC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgcC0+Y29kZT1BU1NJR047cC0+cTIuZmxhZ3M9MDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYoY250PT0xJiYoKHAyLT5xMS5mbGFncyYoRFJFRk9CSnxSRUcpKSE9UkVHfHxwMi0+cTEucmVnIT1iYXNlKQorICAgICAgICAgICAgICYmKChwMi0+cTIuZmxhZ3MmKERSRUZPQkp8UkVHKSkhPVJFR3x8cDItPnEyLnJlZyE9YmFzZSkKKyAgICAgICAgICAgICAmJigocDItPnouZmxhZ3MmKERSRUZPQkp8UkVHKSkhPVJFR3x8cDItPnoucmVnIT1iYXNlKSApeworICAgICAgICAgICAgLyogQ2FuIHdlIHVzZSB1cGRhdGU/ICovCisgICAgICAgICAgICBwMj1wMi0+bmV4dDsKKyAgICAgICAgICAgIHdoaWxlKHAyJiYocDItPmNvZGU9PUZSRUVSRUd8fHAyLT5jb2RlPT1BTExPQ1JFRykpIHAyPXAyLT5uZXh0OworICAgICAgICAgICAgaWYocDIpeworICAgICAgICAgICAgICBjMj1wMi0+Y29kZTsKKyAgICAgICAgICAgICAgaWYoYzI9PUFEREkyUHx8YzI9PVNVQklGUCl7CisgICAgICAgICAgICAgICAgaWYoKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1iYXNlCisgICAgICAgICAgICAgICAgICAgJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnoucmVnPT1iYXNlCisgICAgICAgICAgICAgICAgICAgJiYocDItPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUICl7CisgICAgICAgICAgICAgICAgICBldmFsX2NvbnN0KCZwMi0+cTIudmFsLHAyLT50eXBmKTsKKyAgICAgICAgICAgICAgICAgIGlmKGMyPT1TVUJJRlApIHZtYXg9em1zdWIobDJ6bSgwTCksdm1heCk7CisgICAgICAgICAgICAgICAgICBpZih6bWVxdG8odm1heCxvZikpeworICAgICAgICAgICAgICAgICAgICBhbS0+ZmxhZ3N8PVVQREFURTsKKyAgICAgICAgICAgICAgICAgICAgcDItPmNvZGU9Tk9QOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIC8qIFRyeSByZWcscmVnICovCisjaWZuZGVmIG9sZHBlZXAKKyAgICBpZihjPT1BRERJMlAmJmlzcmVnKHEyKSYmaXNyZWcoeikmJihpc3JlZyhxMSl8fHAtPnEyLnJlZyE9cC0+ei5yZWcpKXsKKyAgICAgIGludCBiYXNlLGlkeDtzdHJ1Y3Qgb2JqICpvOworICAgICAgcj1wLT56LnJlZztpZHg9cC0+cTIucmVnOworICAgICAgaWYoaXNyZWcocTEpKSBiYXNlPXAtPnExLnJlZzsgZWxzZSBiYXNlPXI7CisgICAgICBvPTA7CisgICAgICBmb3IocDI9cC0+bmV4dDtwMjtwMj1wMi0+bmV4dCl7CisgICAgICAgIGMyPXAyLT5jb2RlOworICAgICAgICBpZihjMj09Q0FMTHx8YzI9PUxBQkVMfHwoYzI+PUJFUSYmYzI8PUJSQSkpIGJyZWFrOworICAgICAgICBpZihjMiE9RlJFRVJFRyYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1yKSBicmVhazsKKyAgICAgICAgaWYoYzIhPUZSRUVSRUcmJihwMi0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnEyLnJlZz09cikgYnJlYWs7CisgICAgICAgIGlmKChwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+ei5yZWc9PWlkeCYmaWR4IT1yKSBicmVhazsKKwkKKyAgICAgICAgaWYoYzIhPUNBTEwmJihjMjxMQUJFTHx8YzI+QlJBKS8qJiZjMiE9QUREUkVTUyovKXsKKyAgICAgICAgICBpZighcDItPnExLmFtJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTEucmVnPT1yKXsKKyAgICAgICAgICAgIGlmKG98fChxMXR5cChwMikmTlEpPT1MTE9ORykgYnJlYWs7CisgICAgICAgICAgICBvPSZwMi0+cTE7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKCFwMi0+cTIuYW0mJihwMi0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT5xMi5yZWc9PXIpeworICAgICAgICAgICAgaWYob3x8KHEydHlwKHAyKSZOUSk9PUxMT05HKSBicmVhazsKKyAgICAgICAgICAgIG89JnAyLT5xMjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYoIXAyLT56LmFtJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT56LnJlZz09cil7CisgICAgICAgICAgICBpZihvfHwoenR5cChwMikmTlEpPT1MTE9ORykgYnJlYWs7CisgICAgICAgICAgICBvPSZwMi0+ejsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoYzI9PUZSRUVSRUd8fChwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKyAgICAgICAgICBpbnQgbTsKKyAgICAgICAgICBpZihjMj09RlJFRVJFRykKKyAgICAgICAgICAgIG09cDItPnExLnJlZzsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtPXAyLT56LnJlZzsKKyAgICAgICAgICBpZihtPT1yKXsKKyAgICAgICAgICAgIGlmKG8peworICAgICAgICAgICAgICBvLT5hbT1hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CisgICAgICAgICAgICAgIGFtLT5mbGFncz1SRUdfSU5EOworICAgICAgICAgICAgICBhbS0+YmFzZT1iYXNlOworICAgICAgICAgICAgICBhbS0+b2Zmc2V0PWlkeDsKKwkgICAgICBpZihpc3JlZyhxMSkpeworCQlwLT5jb2RlPWM9Tk9QO3AtPnExLmZsYWdzPXAtPnEyLmZsYWdzPXAtPnouZmxhZ3M9MDsKKwkgICAgICB9ZWxzZXsKKwkJcC0+Y29kZT1jPUFTU0lHTjtwLT5xMi5mbGFncz0wOworCQlwLT50eXBmPXAtPnR5cGYyO3AtPnEyLnZhbC52bWF4PXNpemV0YWJbcC0+dHlwZjImTlFdOworCSAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZihjMiE9RlJFRVJFRyYmbT09YmFzZSkgYnJlYWs7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIGlmKGM9PUFEREkyUCYmaXNyZWcocTIpJiZpc3JlZyh6KSYmcC0+cTIucmVnIT1wLT56LnJlZyl7CisgICAgICBpbnQgYmFzZSxpZHg7CisgICAgICBwMj1wLT5uZXh0OworICAgICAgd2hpbGUocDImJihwMi0+Y29kZT09RlJFRVJFR3x8cDItPmNvZGU9PUFMTE9DUkVHKSkgcDI9cDItPm5leHQ7CisgICAgICBpZihwMikgYzI9cDItPmNvZGU7IGVsc2UgYzI9MDsKKyAgICAgIHI9cC0+ei5yZWc7aWR4PXAtPnEyLnJlZzsKKyAgICAgIGlmKGlzcmVnKHExKSkgYmFzZT1wLT5xMS5yZWc7IGVsc2UgYmFzZT1yOworICAgICAgaWYoYzImJmMyIT1DQUxMJiYoYzI8TEFCRUx8fGMyPkJSQSkKKyAgICAgICAgICYmKGMyIT1BU1NJR058fCgocDItPnR5cGYmTlEpPD1QT0lOVEVSJiZ6bWVxdG8ocDItPnEyLnZhbC52bWF4LHNpemV0YWJbcDItPnR5cGYmTlFdKSkpCisgICAgICAgICAmJmMyIT1BRERSRVNTJiZleGlzdHNfZnJlZXJlZyhwMi0+bmV4dCxyKSl7CisgICAgICAgIGlmKCgocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpIT1SRUd8fHAyLT5xMS5yZWchPXIpCisgICAgICAgICAgICYmKChwMi0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSkhPVJFR3x8cDItPnEyLnJlZyE9cikgKXsKKyAgICAgICAgICBjbnQ9MDsKKyAgICAgICAgICBpZigocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTEucmVnPT1yKXsKKyAgICAgICAgICAgIHAyLT5xMS5hbT1hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CisgICAgICAgICAgICBwMi0+cTEuYW0tPmZsYWdzPVJFR19JTkQ7CisgICAgICAgICAgICBwMi0+cTEuYW0tPmJhc2U9YmFzZTsKKyAgICAgICAgICAgIHAyLT5xMS5hbS0+b2Zmc2V0PWlkeDsKKyAgICAgICAgICAgIGNudCsrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZigocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTIucmVnPT1yKXsKKyAgICAgICAgICAgIHAyLT5xMi5hbT1hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CisgICAgICAgICAgICBwMi0+cTIuYW0tPmZsYWdzPVJFR19JTkQ7CisgICAgICAgICAgICBwMi0+cTIuYW0tPmJhc2U9YmFzZTsKKyAgICAgICAgICAgIHAyLT5xMi5hbS0+b2Zmc2V0PWlkeDsKKyAgICAgICAgICAgIGNudCsrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZigocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT56LnJlZz09cil7CisgICAgICAgICAgICBwMi0+ei5hbT1hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CisgICAgICAgICAgICBwMi0+ei5hbS0+ZmxhZ3M9UkVHX0lORDsKKyAgICAgICAgICAgIHAyLT56LmFtLT5iYXNlPWJhc2U7CisgICAgICAgICAgICBwMi0+ei5hbS0+b2Zmc2V0PWlkeDsKKyAgICAgICAgICAgIGNudCsrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZihpc3JlZyhxMSkpeworICAgICAgICAgICAgcC0+Y29kZT1OT1A7cC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgcC0+Y29kZT1BU1NJR047cC0+cTIuZmxhZ3M9MDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYoY250PT0xJiYoKHAyLT5xMS5mbGFncyYoRFJFRk9CSnxSRUcpKSE9UkVHfHxwMi0+cTEucmVnIT1iYXNlKQorICAgICAgICAgICAgICYmKChwMi0+cTIuZmxhZ3MmKERSRUZPQkp8UkVHKSkhPVJFR3x8cDItPnEyLnJlZyE9YmFzZSkKKyAgICAgICAgICAgICAmJigocDItPnouZmxhZ3MmKERSRUZPQkp8UkVHKSkhPVJFR3x8cDItPnoucmVnIT1iYXNlKSApeworICAgICAgICAgICAgLyogQ2FuIHdlIHVzZSB1cGRhdGU/ICovCisgICAgICAgICAgICBwMj1wMi0+bmV4dDsKKyAgICAgICAgICAgIHdoaWxlKHAyJiYocDItPmNvZGU9PUZSRUVSRUd8fHAyLT5jb2RlPT1BTExPQ1JFRykpIHAyPXAyLT5uZXh0OworICAgICAgICAgICAgaWYocDIpeworICAgICAgICAgICAgICBjMj1wMi0+Y29kZTsKKyAgICAgICAgICAgICAgaWYoYzI9PUFEREkyUCl7CisgICAgICAgICAgICAgICAgaWYoKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1iYXNlCisgICAgICAgICAgICAgICAgICAgJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnoucmVnPT1iYXNlCisgICAgICAgICAgICAgICAgICAgJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMi5yZWc9PWlkeCl7CisgICAgICAgICAgICAgICAgICBhbS0+ZmxhZ3N8PVVQREFURTsKKyAgICAgICAgICAgICAgICAgIHAyLT5jb2RlPU5PUDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgfQorICBpZighdXNlbHIpIGZ1bmN0aW9uX2NhbGxzPTA7Cit9CisKK3N0YXRpYyB2b2lkIHRvY19lbnRyeShGSUxFICpmLHN0cnVjdCBWYXIgKnYpCisvKiAgQ3JlYXRlIGEgdG9jLWVudHJ5LiAgKi8KK3sKKyAgaWYoIXVzZV9zZCh2LT52dHlwLT5mbGFncyl8fCh2LT50YXR0ciZGQVIpKXsKKyAgICBpZih2LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMmJiFJU0ZVTkModi0+dnR5cC0+ZmxhZ3MpKXsKKyAgICAgIGVtaXQoZix0b2NuYW1lKTsKKyAgICAgIGVtaXQoZiwiJXMlcyVsZDpcbiIsdG9jcHJlZml4LGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICAgICAgZW1pdChmLCJcdC5sb25nXHQlcyVsZFxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKCFJU0ZVTkModi0+dnR5cC0+ZmxhZ3MpKXsKKyAgICAgICAgZW1pdChmLHRvY25hbWUpOworICAgICAgICBlbWl0KGYsIiVzJXMlczpcbiIsdG9jcHJlZml4LGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgICAgICBlbWl0KGYsIlx0LmxvbmdcdCVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgICB9CisgICAgICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pCisgICAgICAgIGVtaXQoZiwiXHQuZ2xvYmFsXHQlcyVzJXNcbiIsdG9jcHJlZml4LGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgIH0KKyAgICBpZihmKSBzZWN0aW9uPVRPQzsKKyAgfQorfQorCitzdGF0aWMgaW50IHNhdmVyZWcoc3RydWN0IFZhciAqdixpbnQgaSkKK3sKKyAgaWYodi0+dGF0dHImKFNZU0NBTEx8Tk9TQVZFKSkgcmV0dXJuIDA7CisgIGlmKHZsYXMmJmk9PWZwKSByZXR1cm4gMTsKKyAgaWYoKGk9PXNkJiYodi0+dGF0dHImU0FWRURTKSl8fChyZWd1c2VkW2ldJiYhcmVnc2NyYXRjaFtpXSYmIXJlZ3NhW2ldKQorICAgICB8fCgodi0+dGF0dHImU0FWRUFMTCkmJmk8PTMyJiYocmVnc2NyYXRjaFtpXXx8aT09dDF8fGk9PXQyfHxpPT10MykmJigoIXYtPmZpKXx8KCEodi0+ZmktPmZsYWdzJkFMTF9SRUdTKSl8fEJUU1Qodi0+ZmktPnJlZ3NfbW9kaWZpZWQsaSkpICkpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0bXcsc3RtZTsKKworc3RhdGljIHZvaWQgZnVuY3Rpb25fdG9wKEZJTEUgKmYsc3RydWN0IFZhciAqdixsb25nIG9mZnNldCkKKy8qICBHZW5lcmF0ZXMgZnVuY3Rpb24gdG9wLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGkscHJlZztsb25nIG9mOworICBpZihQT1dFUk9QRU4pIHRvY19lbnRyeShmLHYpOworICBpZihtcmVnbmFtZXNbMV0hPXJlZ25hbWVzWzFdKSBlbWl0KGYsIiN2c2MgZWxmXG4iKTsKKyAgaWYoZ19mbGFnc1swXSZVU0VERkxBRykgZW1pdChmLCIjdnNjIGNwdSAlc1xuIixnX2ZsYWdzX3ZhbFswXS5wKTsKKyAgaWYoZ19mbGFnc1sxXSZVU0VERkxBRykgZW1pdChmLCIjdnNjIGZwdSAlc1xuIixnX2ZsYWdzX3ZhbFsxXS5wKTsKKyAgaWYoIXNwZWNpYWxfc2VjdGlvbihmLHYpJiZzZWN0aW9uIT1DT0RFKXtlbWl0KGYsY29kZW5hbWUpO2lmKGYpIHNlY3Rpb249Q09ERTt9CisgIGlmKCFHQVMpIGVtaXQoZiwiXHQuc2RyZWdcdCVzXG4iLG1yZWduYW1lc1tzZF0pOworICBpZighb3B0c2l6ZSkgZW1pdChmLCJcdC5hbGlnblx0NFxuIik7CisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisgICAgaWYoKHYtPmZsYWdzJihJTkxJTkVGVU5DfElOTElORUVYVCkpIT1JTkxJTkVGVU5DKQorICAgICAgZW1pdChmLCJcdC5nbG9iYWxcdCVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgZW1pdChmLCIlcyVzOlxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgfWVsc2UKKyAgICBlbWl0KGYsIiVzJWxkOlxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKyAgZnJhbWVvZmZzZXQ9bWluZnJhbWUrbWF4cHVzaGVkOworICBmcmFtZXNpemU9ZnJhbWVvZmZzZXQrb2Zmc2V0OworICBzdG1lPTA7CisgIGZvcihpPTE7aTw9NjQ7aSsrKXsKKyAgICBpZihzYXZlcmVnKHYsaSkpeworICAgICAgaWYoaTw9MzIpIGZyYW1lc2l6ZSs9NDsgZWxzZSBmcmFtZXNpemUrPTg7CisgICAgICBpZihpPD0zMiYmc3RtZT09MCkgc3RtZT1pOworICAgIH1lbHNleworICAgICAgaWYoaTw9MzIpIHN0bWU9MDsKKyAgICB9CisgIH0KKyAgaWYoc3RtZT09MzJ8fCEoZ19mbGFnc1sxMV0mVVNFREZMQUcpKSBzdG1lPTA7CisgIGZvcihjcnNhdmU9MCxpPTY1O2k8PTcyO2krKykKKyAgICBpZigocmVndXNlZFtpXSYmIXJlZ3NjcmF0Y2hbaV0mJiFyZWdzYVtpXSkpIGNyc2F2ZT0xOworICBpZihjcnNhdmUmJiFQT1dFUk9QRU4pIGZyYW1lc2l6ZSs9NDsKKyAgaWYoZnJhbWVzaXplPT1taW5mcmFtZSYmKCh2LT50YXR0ciYoU1lTQ0FMTCkpfHwoZnVuY3Rpb25fY2FsbHM9PTAmJiFjcnNhdmUpKSkgZnJhbWVzaXplPWZyYW1lb2Zmc2V0PTA7CisgIGlmKEVBQkkpCisgICAgZnJhbWVzaXplPShmcmFtZXNpemUrNykvOCo4OworICBlbHNlCisgICAgZnJhbWVzaXplPShmcmFtZXNpemUrMTUpLzE2KjE2OworICBzdGFjaz1mcmFtZXNpemU7CisgIHN0YWNrX3ZhbGlkPTE7CisgIGlmKHYtPnRhdHRyJlNZU0NBTEwpeworICAgIGVtaXQoZiwiI2JhcnJpZXJcbiIpOworICAgIGVtaXQoZiwiXHRtdHNwclx0ODEsMFxuIik7CisgICAgZW1pdChmLCIjYmFycmllclxuIik7CisgICAgZW1pdChmLCJcdHN0d3VcdCVzLC00KCVzKVxuIixtcmVnbmFtZXNbdDFdLG1yZWduYW1lc1tzcF0pOworICAgIGVtaXQoZiwiXHRtZmxyXHQlc1xuIixtcmVnbmFtZXNbdDFdKTsKKyAgICBlbWl0KGYsIlx0c3R3dVx0JXMsLTQoJXMpXG4iLG1yZWduYW1lc1t0MV0sbXJlZ25hbWVzW3NwXSk7CisgICAgZW1pdChmLCJcdGJsXHQlc19fc3lzY2FsbF9pbml0XG4iLGlkcHJlZml4KTsKKyAgICAvKkZJWE1FOiBkYXMga29lbm50ZSBtYW4gZXZ0bC4gbm9jaCBzcGFyZW4gKi8KKyAgICBlbWl0KGYsIlx0YWRkaVx0JXMsJXMsLThcbiIsbXJlZ25hbWVzW3NwXSxtcmVnbmFtZXNbc3BdKTsKKyAgfWVsc2UgaWYodi0+dGF0dHImTk9TQVZFKXsKKyAgICAvKiBub3RoaW5nICovCisgIH1lbHNlIGlmKGZ1bmN0aW9uX2NhbGxzfHwoc3RhY2tfY2hlY2smJmZyYW1lc2l6ZSkpeworICAgIGVtaXQoZiwiXHRtZmxyXHQlc1xuIixtcmVnbmFtZXNbdDFdKTsKKyAgICBCU0VUKHJlZ3NfbW9kaWZpZWQsdDEpOworICB9CisgIGlmKHN0YWNrX2NoZWNrJiZmcmFtZXNpemUpeworICAgIEJTRVQocmVnc19tb2RpZmllZCx0Mik7CisgICAgaWYoZnJhbWVzaXplPD0zMjc2Nyl7CisgICAgICBlbWl0KGYsIlx0bGlcdCVzLCVsZFxuIixtcmVnbmFtZXNbdDJdLGZyYW1lc2l6ZSk7CisgICAgfWVsc2V7CisgICAgICBlbWl0KGYsIlx0bGlzXHQlcywlbGRcbiIsbXJlZ25hbWVzW3QyXSxoaShmcmFtZXNpemUpKTsKKyAgICAgIGVtaXQoZiwiXHRhZGRpXHQlcywlcywlbGRcbiIsbXJlZ25hbWVzW3QyXSxtcmVnbmFtZXNbdDJdLGxvKGZyYW1lc2l6ZSkpOworICAgIH0gICAgIAorICAgIGVtaXQoZiwiXHRibFx0JXNfX3N0YWNrX2NoZWNrXG4iLGlkcHJlZml4KTsKKyAgICBpZighZnVuY3Rpb25fY2FsbHMpeworICAgICAgZW1pdChmLCJcdG10bHJcdCVzXG4iLG1yZWduYW1lc1t0MV0pOworICAgICAgQlNFVChyZWdzX21vZGlmaWVkLGxyKTsKKyAgICB9CisgIH0KKyAgaWYoZnVuY3Rpb25fY2FsbHMmJiEodi0+dGF0dHImKFNZU0NBTEx8Tk9TQVZFKSkmJmZyYW1lc2l6ZT49MzI3NjApeworICAgIGlmKFBPV0VST1BFTikKKyAgICAgIGVtaXQoZiwiXHRzdCVzXHQlcyw4KCVzKVxuIixzZHQoTE9ORyksbXJlZ25hbWVzW3QxXSxtcmVnbmFtZXNbc3BdKTsKKyAgICBlbHNlCisgICAgICBlbWl0KGYsIlx0c3Qlc1x0JXMsNCglcylcbiIsc2R0KExPTkcpLG1yZWduYW1lc1t0MV0sbXJlZ25hbWVzW3NwXSk7CisgIH0KKyAgb2Y9bWluZnJhbWUrbWF4cHVzaGVkK29mZnNldDsKKyAgaWYoZnJhbWVzaXplIT0wKXsKKyAgICBpZihmcmFtZXNpemU8PTMyNzY3KXsKKyAgICAgIGVtaXQoZiwiXHRzdHd1XHQlcywtJWxkKCVzKVxuIixtcmVnbmFtZXNbc3BdLGZyYW1lc2l6ZSxtcmVnbmFtZXNbc3BdKTsKKyAgICAgIHByZWc9c3A7CisgICAgfWVsc2V7CisgICAgICBCU0VUKHJlZ3NfbW9kaWZpZWQsdDEpOworICAgICAgQlNFVChyZWdzX21vZGlmaWVkLHQyKTsKKyAgICAgIGVtaXQoZiwiXHRtclx0JXMsJXNcbiIsbXJlZ25hbWVzW3QyXSxtcmVnbmFtZXNbc3BdKTsKKyAgICAgIGVtaXQoZiwiXHRsaXNcdCVzLCVsZFxuIixtcmVnbmFtZXNbdDFdLGhpKC1mcmFtZXNpemUpKTsKKyAgICAgIGVtaXQoZiwiXHRhZGRpXHQlcywlcywlbGRcbiIsbXJlZ25hbWVzW3QxXSxtcmVnbmFtZXNbdDFdLGxvKC1mcmFtZXNpemUpKTsKKyAgICAgIGVtaXQoZiwiXHRzdHd1eFx0JXMsJXMsJXNcbiIsbXJlZ25hbWVzW3NwXSxtcmVnbmFtZXNbc3BdLG1yZWduYW1lc1t0MV0pOworICAgICAgcHJlZz10MjtvZi09ZnJhbWVzaXplOworICAgIH0KKyAgfQorICBpZihjcnNhdmUmJiEodi0+dGF0dHImTk9TQVZFKSl7CisgICAgQlNFVChyZWdzX21vZGlmaWVkLHQzKTsKKyAgICBpZihQT1dFUk9QRU4peworICAgICAgZW1pdChmLCJcdG1mY3JcdCVzXG5cdHN0JXNcdCVzLDQoJXMpXG4iLG1yZWduYW1lc1t0M10sc2R0KExPTkcpLG1yZWduYW1lc1t0M10sbXJlZ25hbWVzW3ByZWddKTsKKyAgICB9ZWxzZXsKKyAgICAgIGVtaXQoZiwiXHRtZmNyXHQlc1xuXHRzdCVzXHQlcywlbGQoJXMpXG4iLG1yZWduYW1lc1t0M10sc2R0KExPTkcpLG1yZWduYW1lc1t0M10sb2YsbXJlZ25hbWVzW3ByZWddKTsKKyAgICAgIG9mKz00OworICAgIH0KKyAgfQorICBmb3IoaT0xO2k8PTY0O2krKyl7CisgICAgaWYoc2F2ZXJlZyh2LGkpKXsKKyAgICAgIGlmKGk8PTMyKXsKKwlpZihpPT1zdG1lKXsKKyAgICAgICAgICBlbWl0KGYsIlx0c3Rtd1x0JXMsJWxkKCVzKVxuIixtcmVnbmFtZXNbc3RtZV0sb2YsbXJlZ25hbWVzW3ByZWddKTsKKyAgICAgICAgICBvZis9KDMyLXN0bWUrMSkqNDsKKyAgICAgICAgICBpPTMyOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICBlbWl0KGYsIlx0c3Qlc1x0JXMsJWxkKCVzKVxuIixzZHQoTE9ORyksbXJlZ25hbWVzW2ldLG9mLG1yZWduYW1lc1twcmVnXSk7CisgICAgICAgICAgb2YrPTQ7CisgICAgICAgIH0KKyAgICAgIH1lbHNleworICAgICAgICBlbWl0KGYsIlx0c3Qlc1x0JXMsJWxkKCVzKVxuIixzZHQoRE9VQkxFKSxtcmVnbmFtZXNbaV0sb2YsbXJlZ25hbWVzW3ByZWddKTsKKyAgICAgICAgb2YrPTg7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGZ1bmN0aW9uX2NhbGxzJiYhKHYtPnRhdHRyJihTWVNDQUxMfE5PU0FWRSkpJiZmcmFtZXNpemU8MzI3NjApeworICAgIGlmKFBPV0VST1BFTikKKyAgICAgIGVtaXQoZiwiXHRzdCVzXHQlcywlbGQoJXMpXG4iLHNkdChMT05HKSxtcmVnbmFtZXNbdDFdLGZyYW1lc2l6ZSs4LG1yZWduYW1lc1tzcF0pOworICAgIGVsc2UKKyAgICAgIGVtaXQoZiwiXHRzdCVzXHQlcywlbGQoJXMpXG4iLHNkdChMT05HKSxtcmVnbmFtZXNbdDFdLGZyYW1lc2l6ZSs0LG1yZWduYW1lc1tzcF0pOworICB9CisgIGlmKCh2LT50YXR0ciZTQVZFRFMpJiYoU01BTExEQVRBfHxCQVNFUkVMTU9TfHxQT1dFUk9QRU4pKXsKKyAgICBpZihQT1dFUk9QRU4peworICAgICAgZW1pdChmLCJcdC5nbG9iYWxcdCVzX19nZXRyMlxuIixpZHByZWZpeCk7CisgICAgICBpZighZnVuY3Rpb25fY2FsbHMpCisgICAgICAgIGVtaXQoZiwiXHRtZmxyXHQlc1xuIixtcmVnbmFtZXNbdDJdKTsKKyAgICAgIGVtaXQoZiwiXHRibFx0JXNfX2dldHIyXG4iLGlkcHJlZml4KTsKKyAgICAgIGlmKCFmdW5jdGlvbl9jYWxscyl7CisgICAgICAgIGVtaXQoZiwiXHRtdGxyXHQlc1xuIixtcmVnbmFtZXNbdDJdKTsKKwlCU0VUKHJlZ3NfbW9kaWZpZWQsbHIpOworICAgICAgfQorICAgIH1lbHNleworICAgICAgaWYoQkFTRVJFTE1PUyl7CisgICAgICAgIGVtaXQoZiwiXHQuZ2xvYmFsXHQlc19fcmVzdG9yZV9yMTNcbiIsaWRwcmVmaXgpOworICAgICAgICBlbWl0KGYsIlx0YmxcdCVzX19yZXN0b3JlX3IxM1xuIixpZHByZWZpeCk7CisgICAgICB9ZWxzZXsKKyAgICAgICAgZW1pdChmLCJcdGxpc1x0JXMsJXNfU0RBX0JBU0VfQGhhXG4iLG1yZWduYW1lc1tzZF0saWRwcmVmaXgpOworICAgICAgICBlbWl0KGYsIlx0YWRkaVx0JXMsJXMsJXNfU0RBX0JBU0VfQGxcbiIsbXJlZ25hbWVzW3NkXSxtcmVnbmFtZXNbc2RdLGlkcHJlZml4KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYodi0+dGF0dHImQlJFTCl7CisgICAgaWYoQkFTRVJFTE9TNCl7CisgICAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXNfX2Jhc2VyZWxfZ2V0X2FkZHJcbiIsaWRwcmVmaXgpOworICAgICAgZW1pdChmLCJcdGJsXHQlc19fYmFzZXJlbF9nZXRfYWRkclxuIixpZHByZWZpeCk7CisgICAgfQorICB9CisgIGlmKHZsYXMpeworICAgIGVtaXQoZiwiXHRtclx0JXMsJXNcbiIsbXJlZ25hbWVzW2ZwXSxtcmVnbmFtZXNbc3BdKTsKKyAgICBlbWl0KGYsIlx0LnNldFx0X19fX2ZvLCVsZFxuIixmcmFtZW9mZnNldCk7CisgIH0KK30KK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX2JvdHRvbShGSUxFICpmLHN0cnVjdCBWYXIgKnYsbG9uZyBvZmZzZXQpCisvKiAgR2VuZXJhdGVzIGZ1bmN0aW9uIGJvdHRvbS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBpLHByZWc7bG9uZyBvZjsKKyAgaWYodi0+dGF0dHImU1lTQ0FMTCl7CisgICAgZW1pdChmLCJcdGJcdCVzX19kaXNwYXRjaFxuIixpZHByZWZpeCk7CisgIH1lbHNleworICAgIG9mPW1pbmZyYW1lK21heHB1c2hlZCtvZmZzZXQ7CisgICAgaWYoZnJhbWVzaXplPD0zMjc2Nyl7CisgICAgICBwcmVnPXNwOworICAgIH1lbHNleworICAgICAgZW1pdChmLCJcdGx3elx0JXMsMCglcylcbiIsbXJlZ25hbWVzW3QyXSxtcmVnbmFtZXNbc3BdKTsKKyAgICAgIHByZWc9dDI7b2YtPWZyYW1lc2l6ZTsKKyAgICB9CisgICAgaWYoY3JzYXZlJiYhKHYtPnRhdHRyJk5PU0FWRSkpeworICAgICAgaWYoUE9XRVJPUEVOKXsKKwllbWl0KGYsIlx0bCVzXHQlcyw4KCVzKVxuXHRtdGNyXHQlc1xuIixsZHQoTE9ORyksbXJlZ25hbWVzW3QxXSxtcmVnbmFtZXNbcHJlZ10sbXJlZ25hbWVzW3QxXSk7CisgICAgICB9ZWxzZXsKKwllbWl0KGYsIlx0bCVzXHQlcywlbGQoJXMpXG5cdG10Y3JcdCVzXG4iLGxkdChMT05HKSxtcmVnbmFtZXNbdDFdLG9mLG1yZWduYW1lc1twcmVnXSxtcmVnbmFtZXNbdDFdKTsKKwlvZis9NDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoZnVuY3Rpb25fY2FsbHMmJiEodi0+dGF0dHImTk9TQVZFKSYmZnJhbWVzaXplPDMyNzYwKXsKKyAgICAgIEJTRVQocmVnc19tb2RpZmllZCxscik7CisgICAgICBpZihQT1dFUk9QRU4pCisJZW1pdChmLCJcdGwlc1x0JXMsJWxkKCVzKVxuIixsZHQoTE9ORyksbXJlZ25hbWVzW3QxXSxmcmFtZXNpemUrOCxtcmVnbmFtZXNbc3BdKTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIlx0bCVzXHQlcywlbGQoJXMpXG4iLGxkdChMT05HKSxtcmVnbmFtZXNbdDFdLGZyYW1lc2l6ZSs0LG1yZWduYW1lc1tzcF0pOworICAgIH0KKyAgICBmb3IoaT0xO2k8PTY0O2krKyl7CisgICAgICBpZihzYXZlcmVnKHYsaSkpeworCWlmKGk8PTMyKXsKKwkgIGlmKGk9PXN0bWUpeworCSAgICBlbWl0KGYsIlx0bG13XHQlcywlbGQoJXMpXG4iLG1yZWduYW1lc1tzdG1lXSxvZixtcmVnbmFtZXNbcHJlZ10pOworCSAgICBvZis9KDMyLXN0bWUrMSkqNDsKKwkgICAgaT0zMjsKKwkgIH1lbHNleworCSAgICBlbWl0KGYsIlx0bCVzXHQlcywlbGQoJXMpXG4iLGxkdChMT05HKSxtcmVnbmFtZXNbaV0sb2YsbXJlZ25hbWVzW3ByZWddKTsKKwkgICAgb2YrPTQ7CisJICB9CisJfWVsc2V7CisJICBlbWl0KGYsIlx0bCVzXHQlcywlbGQoJXMpXG4iLGxkdChET1VCTEUpLG1yZWduYW1lc1tpXSxvZixtcmVnbmFtZXNbcHJlZ10pOworCSAgb2YrPTg7CisJfQorICAgICAgfQorICAgIH0KKyAgICBpZihmcmFtZXNpemUpeworICAgICAgaWYoZnJhbWVzaXplPD0zMjc2NykKKwllbWl0KGYsIlx0YWRkaVx0JXMsJXMsJWxkXG4iLG1yZWduYW1lc1tzcF0sbXJlZ25hbWVzW3NwXSxmcmFtZXNpemUpOworICAgICAgZWxzZQorCWVtaXQoZiwiXHRtclx0JXMsJXNcbiIsbXJlZ25hbWVzW3NwXSxtcmVnbmFtZXNbcHJlZ10pOworICAgIH0KKyAgICBpZihmdW5jdGlvbl9jYWxscyYmISh2LT50YXR0ciZOT1NBVkUpKXsKKyAgICAgIGlmKGZyYW1lc2l6ZTwzMjc2MCl7CisJZW1pdChmLCJcdG10bHJcdCVzXG4iLG1yZWduYW1lc1t0MV0pOworICAgICAgfWVsc2V7CisJQlNFVChyZWdzX21vZGlmaWVkLGxyKTsKKwlpZihQT1dFUk9QRU4pCisJICBlbWl0KGYsIlx0bCVzXHQlcyw4KCVzKVxuXHRtdGxyXHQlc1xuIixsZHQoTE9ORyksbXJlZ25hbWVzW3QxXSxtcmVnbmFtZXNbc3BdLG1yZWduYW1lc1t0MV0pOworCWVsc2UKKwkgIGVtaXQoZiwiXHRsJXNcdCVzLDQoJXMpXG5cdG10bHJcdCVzXG4iLGxkdChMT05HKSxtcmVnbmFtZXNbdDFdLG1yZWduYW1lc1tzcF0sbXJlZ25hbWVzW3QxXSk7CisgICAgICB9CisgICAgfQorICAgIGVtaXQoZixyZXQpOworICB9CisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisgICAgZW1pdChmLCJcdC50eXBlXHQlcyVzLEBmdW5jdGlvblxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICBlbWl0KGYsIlx0LnNpemVcdCVzJXMsJC0lcyVzXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgIH1lbHNleworICAgIGVtaXQoZiwiXHQudHlwZVx0JXMlbGQsQGZ1bmN0aW9uXG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICAgIGVtaXQoZiwiXHQuc2l6ZVx0JXMlbGQsJC0lcyVsZFxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICB9ICAgIAorICBpZihhbGxfcmVncyYmdi0+ZmkpIHYtPmZpLT5mbGFnc3w9QUxMX1JFR1M7Cit9CisKK3N0YXRpYyBpbnQgYmFsaWduKHN0cnVjdCBvYmogKm8pCisvKiAgTGllZmVydCBkaWUgdW50ZXJlbiAyIEJpdHMgZGVzIE9iamVrdHMuIDEgd2VubiB1bmtsYXIuICovCit7CisgIGludCBzYzsKKyAgaWYoby0+ZmxhZ3MmRFJFRk9CSikgcmV0dXJuIDE7CisgIGlmKG8tPmFtKSBpZXJyb3IoMCk7CisgIGlmKCEoby0+ZmxhZ3MmVkFSKSkgaWVycm9yKDApOworICBzYz1vLT52LT5zdG9yYWdlX2NsYXNzOworICBpZihzYz09RVhURVJOfHxzYz09U1RBVElDKXsKKyAgICAvKiBBbGxlIHN0YXRpc2NoZW4gRGF0ZW4gd2VyZGVuIHZvbSBjZyBhdWYgMzJiaXQgYWxpZ250LiAqLworICAgIHJldHVybiB6bTJsKHptYW5kKG8tPnZhbC52bWF4LGwyem0oM0wpKSk7CisgIH0KKyAgaWYoc2M9PUFVVE98fHNjPT1SRUdJU1RFUil7CisgICAgem1heCBvZj1vLT52LT5vZmZzZXQ7CisgICAgaWYoIXptbGVxKGwyem0oMEwpLG9mKSkKKyAgICAgIG9mPXptc3ViKGwyem0oMEwpLHptYWRkKG9mLG1heGFsaWduKSk7CisgICAgcmV0dXJuIHptMmwoem1hbmQoem1hZGQob2Ysby0+dmFsLnZtYXgpLGwyem0oM0wpKSk7CisgIH0KKyAgaWVycm9yKDApOworfQorCisvKiBsb2FkIGhpd29yZCBvZiBhIGxvbmcgbG9uZyBvYmplY3QgKi8KK3N0YXRpYyB2b2lkIGxvYWRfaHdvcmQoRklMRSAqZixpbnQgcixzdHJ1Y3Qgb2JqICpvLGludCB0LGludCB0bXApCit7CisgIHN0cnVjdCBycGFpciBycDsKKyAgQlNFVChyZWdzX21vZGlmaWVkLHIpOworICBpZihvLT5mbGFncyZLT05TVCl7CisgICAgc3RhdGljIHN0cnVjdCBvYmogY29iajsKKyAgICBjb2JqLmZsYWdzPUtPTlNUOworICAgIGV2YWxfY29uc3QoJm8tPnZhbCx0KTsKKyAgICB2dW1heD16dW1hbmQoenVtcnNoaWZ0KHZ1bWF4LHVsMnp1bSgzMlVMKSksdWwyenVtKDB4ZmZmZmZmZmYpKTsgCisgICAgY29iai52YWwudnVsb25nPXp1bTJ6dWwodnVtYXgpOworICAgIGxvYWRfcmVnKGYsciwmY29iaixVTlNJR05FRHxMT05HLHRtcCk7CisgIH1lbHNlIGlmKCFvLT5hbSYmKG8tPmZsYWdzJkRSRUZPQkopKXsKKyAgICBpZighKG8tPmZsYWdzJlJFRykpIGllcnJvcigwKTsKKyAgICBlbWl0KGYsIlx0bHd6XHQlcywwKCVzKVxuIixtcmVnbmFtZXNbcl0sbXJlZ25hbWVzW28tPnJlZ10pOworICB9ZWxzZSBpZighby0+YW0mJihvLT5mbGFncyZSRUcpKXsKKyAgICBzdHJ1Y3QgcnBhaXIgcnA7CisgICAgaWYoIXJlZ19wYWlyKG8tPnJlZywmcnApKSAKKyAgICAgIGllcnJvcigwKTsKKyAgICBpZihycC5yMSE9cikKKyAgICAgIGVtaXQoZiwiXHRtclx0JXMsJXNcbiIsbXJlZ25hbWVzW3JdLG1yZWduYW1lc1tycC5yMV0pOworICB9ZWxzZXsKKyAgICBsb2FkX3JlZyhmLHIsbyxVTlNJR05FRHxMT05HLHRtcCk7CisgIH0KK30KKworLyogbG9hZCBsb3dvcmQgb2YgYSBsb25nIGxvbmcgb2JqZWN0ICovCitzdGF0aWMgdm9pZCBsb2FkX2x3b3JkKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdCxpbnQgdG1wKQoreworICBzdHJ1Y3QgcnBhaXIgcnA7CisgIEJTRVQocmVnc19tb2RpZmllZCxyKTsKKyAgaWYoby0+ZmxhZ3MmS09OU1QpeworICAgIHN0YXRpYyBzdHJ1Y3Qgb2JqIGNvYmo7CisgICAgY29iai5mbGFncz1LT05TVDsKKyAgICBldmFsX2NvbnN0KCZvLT52YWwsdCk7CisgICAgdnVtYXg9enVtYW5kKHZ1bWF4LHVsMnp1bSgweGZmZmZmZmZmKSk7IAorICAgIGNvYmoudmFsLnZ1bG9uZz16dW0yenVsKHZ1bWF4KTsKKyAgICBsb2FkX3JlZyhmLHIsJmNvYmosVU5TSUdORUR8TE9ORyx0bXApOworICB9ZWxzZSBpZihvLT5hbSl7CisgICAgaWYoby0+YW0tPmZsYWdzIT1JTU1fSU5EKSBpZXJyb3IoMCk7CisgICAgby0+YW0tPm9mZnNldCs9NDsKKyAgICBsb2FkX3JlZyhmLHIsbyxVTlNJR05FRHxMT05HLHRtcCk7CisgICAgby0+YW0tPm9mZnNldC09NDsgICAKKyAgfWVsc2UgaWYoby0+ZmxhZ3MmRFJFRk9CSil7CisgICAgaWYoIShvLT5mbGFncyZSRUcpKSBpZXJyb3IoMCk7CisgICAgZW1pdChmLCJcdGx3elx0JXMsNCglcylcbiIsbXJlZ25hbWVzW3JdLG1yZWduYW1lc1tvLT5yZWddKTsKKyAgfWVsc2UgaWYoby0+ZmxhZ3MmUkVHKXsKKyAgICBpZighcmVnX3BhaXIoby0+cmVnLCZycCkpIGllcnJvcigwKTsKKyAgICBpZihycC5yMiE9cikKKyAgICAgIGVtaXQoZiwiXHRtclx0JXMsJXNcbiIsbXJlZ25hbWVzW3JdLG1yZWduYW1lc1tycC5yMl0pOworICB9ZWxzZXsKKyAgICBvLT52YWwudm1heD16bWFkZChvLT52YWwudm1heCxsMnptKDRMKSk7CisgICAgbG9hZF9yZWcoZixyLG8sVU5TSUdORUR8TE9ORyx0bXApOworICAgIG8tPnZhbC52bWF4PXptc3ViKG8tPnZhbC52bWF4LGwyem0oNEwpKTsKKyAgfQorfSAgICAKKy8qIHN0b3JlIGhpd29yZCBvZiBhIGxvbmcgbG9uZyBvYmplY3QgKi8KK3N0YXRpYyB2b2lkIHN0b3JlX2h3b3JkKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbykKK3sKKyAgc3RydWN0IHJwYWlyIHJwOworICBpZighby0+YW0mJihvLT5mbGFncyZEUkVGT0JKKSl7CisgICAgaWYoIShvLT5mbGFncyZSRUcpKSBpZXJyb3IoMCk7CisgICAgZW1pdChmLCJcdHN0d1x0JXMsMCglcylcbiIsbXJlZ25hbWVzW3JdLG1yZWduYW1lc1tvLT5yZWddKTsKKyAgfWVsc2UgaWYoIW8tPmFtJiYoby0+ZmxhZ3MmUkVHKSl7CisgICAgaWYoIXJlZ19wYWlyKG8tPnJlZywmcnApKSBpZXJyb3IoMCk7CisgICAgaWYocnAucjEhPXIpCisgICAgICBlbWl0KGYsIlx0bXJcdCVzLCVzXG4iLG1yZWduYW1lc1tycC5yMV0sbXJlZ25hbWVzW3JdKTsKKyAgfWVsc2V7CisgICAgc3RvcmVfcmVnKGYscixvLFVOU0lHTkVEfExPTkcpOworICB9Cit9CisKKy8qIHN0b3JlIGxvd29yZCBvZiBhIGxvbmcgbG9uZyBvYmplY3QgKi8KK3N0YXRpYyB2b2lkIHN0b3JlX2x3b3JkKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbykKK3sKKyAgc3RydWN0IHJwYWlyIHJwOworICBpZihvLT5hbSl7CisgICAgaWYoby0+YW0tPmZsYWdzIT1JTU1fSU5EKSBpZXJyb3IoMCk7CisgICAgby0+YW0tPm9mZnNldCs9NDsKKyAgICBzdG9yZV9yZWcoZixyLG8sVU5TSUdORUR8TE9ORyk7CisgICAgby0+YW0tPm9mZnNldC09NDsKKyAgfWVsc2UgaWYoby0+ZmxhZ3MmRFJFRk9CSil7CisgICAgaWYoIShvLT5mbGFncyZSRUcpKSBpZXJyb3IoMCk7CisgICAgZW1pdChmLCJcdHN0d1x0JXMsNCglcylcbiIsbXJlZ25hbWVzW3JdLG1yZWduYW1lc1tvLT5yZWddKTsKKyAgfWVsc2UgaWYoby0+ZmxhZ3MmUkVHKXsKKyAgICBpZighcmVnX3BhaXIoby0+cmVnLCZycCkpIGllcnJvcigwKTsKKyAgICBpZihycC5yMiE9cikKKyAgICAgIGVtaXQoZiwiXHRtclx0JXMsJXNcbiIsbXJlZ25hbWVzW3JwLnIyXSxtcmVnbmFtZXNbcl0pOworICB9ZWxzZXsKKyAgICBvLT52YWwudm1heD16bWFkZChvLT52YWwudm1heCxsMnptKDRMKSk7CisgICAgc3RvcmVfcmVnKGYscixvLFVOU0lHTkVEfExPTkcpOworICAgIG8tPnZhbC52bWF4PXptc3ViKG8tPnZhbC52bWF4LGwyem0oNEwpKTsKKyAgfQorfQorLyogaWYgb2JqZWN0IGNhbm5vdCBiZSBkZXJlZmVyZW5jZWQgd2l0aCBhIHNpbmdsZSBsb2FkLCBsb2FkIGl0cyBhZGRyZXNzCisgICBpbiByZWdpc3RlciByICghPXIwKSBhbmQgbW9kaWZ5IHRoZSBvYmplY3QgKi8KK3N0YXRpYyB2b2lkIGNyZWF0ZV9sb2FkYWJsZShGSUxFICpmLHN0cnVjdCBvYmogKm8saW50IHIpCit7CisgIHN0cnVjdCBycGFpciBycDsKKyAgaWYoby0+YW0pIHJldHVybjsKKyAgaWYoKG8tPmZsYWdzJihSRUd8RFJFRk9CSikpPT1EUkVGT0JKKXsKKyAgICBvLT5mbGFncyY9fkRSRUZPQko7CisgICAgbG9hZF9yZWcoZixyLG8sUE9JTlRFUixyKTsKKyAgICBvLT5mbGFnc3w9KFJFR3xEUkVGT0JKKTsKKyAgICBvLT5yZWc9cjsKKyAgfQorICBpZigoby0+ZmxhZ3MmKFZBUnxSRUcpKT09VkFSKXsKKyAgICBpZigoby0+di0+c3RvcmFnZV9jbGFzcz09U1RBVElDfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pJiYoIXVzZV9zZChvLT52LT52dHlwLT5mbGFncyl8fChvLT52LT50YXR0ciZGQVIpKSl7CisgICAgICBsb2FkX2FkZHJlc3MoZixyLG8sUE9JTlRFUik7CisgICAgICBvLT5yZWc9cjsKKyAgICAgIG8tPmZsYWdzPShSRUd8RFJFRk9CSik7CisgICAgfQorICAgIGlmKChvLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikmJnJlYWxfb2Zmc2V0KG8pPjMyNzYwKXsKKyAgICAgIGxvYWRfYWRkcmVzcyhmLHIsbyxQT0lOVEVSKTsKKyAgICAgIG8tPnJlZz1yOworICAgICAgby0+ZmxhZ3M9KFJFR3xEUkVGT0JKKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGludCBnZXRfcmVnKCkKK3sKKyAgaW50IGk7CisgIGZvcihpPTI7aTw9MzI7aSsrKXsKKyAgICBpZighcmVnc1tpXSYmKHJlZ3NjcmF0Y2hbaV18fHJlZ3VzZWRbaV0pKQorICAgICAgYnJlYWs7CisgIH0KKyAgaWYoaTw9MzIpeworICAgIEJTRVQocmVnc19tb2RpZmllZCxpKTsKKyAgICByZXR1cm4gaTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfbGxvbmcoRklMRSAqZixzdHJ1Y3QgSUMgKnApCit7CisgIGludCBjPXAtPmNvZGUsdCxzYXZlbWFzaz0wO2NoYXIgKmxpYmZ1bmNuYW1lOworICBpbnQgbXNwO2xvbmcgbXRtcG9mZjsKKworICB0PSh6dHlwKHApJk5VKTsKKworICBpZihjPT1BRERSRVNTKSByZXR1cm4gMDsKKworCisgIGlmKGM9PUdFVFJFVFVSTil7CisgICAgY3JlYXRlX2xvYWRhYmxlKGYsJnAtPnosdDEpOworICAgIGlmKCFyZWdfcGFpcihwLT5xMS5yZWcsJnJwKSkgaWVycm9yKDApOworICAgIHN0b3JlX2h3b3JkKGYscnAucjEsJnAtPnopOworICAgIHN0b3JlX2x3b3JkKGYscnAucjIsJnAtPnopOworICAgIHAtPnouZmxhZ3M9MDsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmKGM9PVNFVFJFVFVSTil7CisgICAgY3JlYXRlX2xvYWRhYmxlKGYsJnAtPnExLHQxKTsKKyAgICBpZighcmVnX3BhaXIocC0+ei5yZWcsJnJwKSkgaWVycm9yKDApOworICAgIGxvYWRfaHdvcmQoZixycC5yMSwmcC0+cTEscTF0eXAocCksdDIpOworICAgIGxvYWRfbHdvcmQoZixycC5yMiwmcC0+cTEscTF0eXAocCksdDIpOworICAgIHAtPnouZmxhZ3M9MDsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmKGM9PUNPTlZFUlQmJihxMXR5cChwKSZOUSk9PUxMT05HJiYoenR5cChwKSZOUSk9PUxMT05HKXsKKyAgICBwLT5jb2RlPWM9QVNTSUdOOworICAgIHAtPnEyLnZhbC52bWF4PXNpemV0YWJbTExPTkddOworICB9CisKKyAgaWYoYz09QVNTSUdOfHxjPT1QVVNIKXsKKyAgICBpbnQgcjsKKyAgICBjcmVhdGVfbG9hZGFibGUoZiwmcC0+cTEsdDEpOworICAgIGlmKGM9PUFTU0lHTil7CisgICAgICBjcmVhdGVfbG9hZGFibGUoZiwmcC0+eix0Mik7CisgICAgfWVsc2V7CisgICAgICBwdXNoZWQ9KHB1c2hlZCszKS80KjQ7CisgICAgICBpZihhbGlnbl9hcmd1bWVudHMpCisJcHVzaGVkPShwdXNoZWQrNykvOCo4OworICAgIH0KKyAgICBpZihpc3JlZyh6KSl7CisgICAgICBpZighcmVnX3BhaXIocC0+ei5yZWcsJnJwKSkgaWVycm9yKDApOworICAgICAgbG9hZF9od29yZChmLHJwLnIxLCZwLT5xMSxxMXR5cChwKSx0MSk7CisgICAgfWVsc2V7CisgICAgICBpZihpc3JlZyhxMSkpeworCWlmKCFyZWdfcGFpcihwLT5xMS5yZWcsJnJwKSkgaWVycm9yKDApOworCXI9cnAucjE7CisgICAgICB9ZWxzZXsKKwlpZihwLT5xMS5mbGFncyZLT05TVCkKKwkgIHI9dDE7CisJZWxzZQorCSAgcj10MzsKKwlsb2FkX2h3b3JkKGYsciwmcC0+cTEscTF0eXAocCksdDEpOworICAgICAgfQorICAgICAgaWYoYz09QVNTSUdOKXsKKwlzdG9yZV9od29yZChmLHIsJnAtPnopOworICAgICAgfWVsc2V7CisJZW1pdChmLCJcdHN0d1x0JXMsJWxkKCVzKVxuIixtcmVnbmFtZXNbcl0scHVzaGVkK21pbmZyYW1lLG1yZWduYW1lc1tzcF0pOworCXB1c2hlZCs9NDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoaXNyZWcoeikpeworICAgICAgaWYoIXJlZ19wYWlyKHAtPnoucmVnLCZycCkpIGllcnJvcigwKTsKKyAgICAgIGxvYWRfbHdvcmQoZixycC5yMiwmcC0+cTEscTF0eXAocCksdDEpOworICAgIH1lbHNleworICAgICAgaWYoaXNyZWcocTEpKXsKKwlpZighcmVnX3BhaXIocC0+cTEucmVnLCZycCkpIGllcnJvcigwKTsKKwlyPXJwLnIyOworICAgICAgfWVsc2V7CisJaWYocC0+cTEuZmxhZ3MmS09OU1QpCisJICByPXQxOworCWVsc2UKKwkgIHI9dDM7CisJbG9hZF9sd29yZChmLHIsJnAtPnExLHExdHlwKHApLHQxKTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PUFTU0lHTil7CisJc3RvcmVfbHdvcmQoZixyLCZwLT56KTsKKyAgICAgIH1lbHNleworCWVtaXQoZiwiXHRzdHdcdCVzLCVsZCglcylcbiIsbXJlZ25hbWVzW3JdLHB1c2hlZCttaW5mcmFtZSxtcmVnbmFtZXNbc3BdKTsKKwlwdXNoZWQrPTQ7CisgICAgICB9ICAgIAorICAgIH0KKyAgICBwLT56LmZsYWdzPTA7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZihjPT1DT05WRVJUJiYodCZOUSk8TExPTkcpeworICAgIGlmKGlzcmVnKHExKSl7CisgICAgICBpZighcmVnX3BhaXIocC0+cTEucmVnLCZycCkpIGllcnJvcigwKTsKKyAgICAgIHpyZWc9cnAucjI7CisgICAgfWVsc2V7CisgICAgICBpbnQgcjsKKyAgICAgIGlmKCFwLT5xMS5hbSYmKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1EUkVGT0JKKQorICAgICAgICBjcmVhdGVfbG9hZGFibGUoZiwmcC0+cTEsdDEpOworICAgICAgaWYoaXNyZWcoeikpCisgICAgICAgIHI9cC0+ei5yZWc7CisgICAgICBlbHNlCisgICAgICAgIHI9dDE7CisgICAgICBsb2FkX2x3b3JkKGYsciwmcC0+cTEscTF0eXAocCksdDIpOworICAgICAgenJlZz1yOworICAgIH0KKyAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAKKyAgfQorICBpZihjPT1DT05WRVJUJiYocTF0eXAocCkmTlEpPExMT05HKXsKKyAgICBpbnQgemwsemgsdG9sZD1xMXR5cChwKTsKKyAgICBpZihpc3JlZyh6KSl7CisgICAgICBpZighcmVnX3BhaXIocC0+ei5yZWcsJnJwKSkgaWVycm9yKDApOworICAgICAgemg9cnAucjE7CisgICAgICB6bD1ycC5yMjsKKyAgICB9ZWxzZXsKKyAgICAgIHpsPXQyOworICAgICAgemg9dDM7CisgICAgfQorICAgIGlmKCFwLT5xMS5hbSYmKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1EUkVGT0JKKQorICAgICAgY3JlYXRlX2xvYWRhYmxlKGYsJnAtPnExLHQxKTsKKyAgICBsb2FkX3JlZyhmLHpsLCZwLT5xMSxxMXR5cChwKSx0MSk7CisgICAgaWYodG9sZCZVTlNJR05FRCl7CisgICAgICBpZigodG9sZCZOUSk9PUNIQVIpCisJZW1pdChmLCJcdGNscmx3aVx0JXMsJXMsMjRcbiIsbXJlZ25hbWVzW3psXSxtcmVnbmFtZXNbemxdKTsKKyAgICAgIGlmKCh0b2xkJk5RKT09U0hPUlQpCisJZW1pdChmLCJcdGNscmx3aVx0JXMsJXMsMTZcbiIsbXJlZ25hbWVzW3psXSxtcmVnbmFtZXNbemxdKTsKKyAgICAgIGVtaXQoZiwiXHRsaVx0JXMsMFxuIixtcmVnbmFtZXNbemhdKTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKCh0b2xkJk5RKT09Q0hBUikKKwllbWl0KGYsIlx0ZXh0c2JcdCVzLCVzXG4iLG1yZWduYW1lc1t6bF0sbXJlZ25hbWVzW3psXSk7CisgICAgICBpZigodG9sZCZOUSk9PVNIT1JUKQorCWVtaXQoZiwiXHRleHRzaFx0JXMsJXNcbiIsbXJlZ25hbWVzW3psXSxtcmVnbmFtZXNbemxdKTsKKyAgICAgIGVtaXQoZiwiXHRzcmF3aVx0JXMsJXMsMzFcbiIsbXJlZ25hbWVzW3poXSxtcmVnbmFtZXNbemxdKTsKKyAgICB9CisgICAgY3JlYXRlX2xvYWRhYmxlKGYsJnAtPnosdDEpOworICAgIHN0b3JlX2x3b3JkKGYsemwsJnAtPnopOworICAgIHN0b3JlX2h3b3JkKGYsemgsJnAtPnopOworICAgIHAtPnouZmxhZ3M9MDsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmKGM9PVRFU1QpeworICAgIHAtPmNvZGU9Yz1DT01QQVJFOworICAgIGlmKHAtPnR5cGYmVU5TSUdORUQpCisgICAgICBwLT5xMi52YWwudnVsbG9uZz16dW0yenVsbCh1bDJ6dW0oMFVMKSk7CisgICAgZWxzZQorICAgICAgcC0+cTIudmFsLnZsbG9uZz16bTJ6bGwobDJ6bSgwTCkpOworICAgIHAtPnEyLmZsYWdzPUtPTlNUOworICB9CisKKyAgaWYoYz09S09NUExFTUVOVCl7CisgICAgcC0+Y29kZT1jPVhPUjsKKyAgICBwLT5xMi5mbGFncz1LT05TVDsKKyAgICBpZihwLT50eXBmJlVOU0lHTkVEKQorICAgICAgcC0+cTIudmFsLnZ1bGxvbmc9dHVfbWF4W0xMT05HXTsKKyAgICBlbHNlCisgICAgICBwLT5xMi52YWwudmxsb25nPWwyem0oLTFMKTsKKyAgfQorICBpZihjPT1NSU5VUyl7CisgICAgcC0+Y29kZT1jPVNVQjsKKyAgICBwLT5xMj1wLT5xMTsKKyAgICBwLT5xMS5mbGFncz1LT05TVDsKKyAgICBwLT5xMS5hbT0wOworICAgIGlmKHAtPnR5cGYmVU5TSUdORUQpCisgICAgICBwLT5xMS52YWwudnVsbG9uZz11bDJ6dW0oMFVMKTsKKyAgICBlbHNlCisgICAgICBwLT5xMS52YWwudmxsb25nPWwyem0oMEwpOworICB9ICAgIAorCisgIHN3aXRjaF9JQyhwKTsKKworICBpZihjPT1DT01QQVJFKXsKKyAgICBpbnQgbDEsbDIsaDEsaDIsdG1wLGZhbHNlbGFiPSsrbGFiZWwsYzsKKyAgICB6dW1heCBsbyx1aGk7em1heCBzaGk7CisgICAgY2hhciAqc2g7CisgICAgc3RydWN0IElDICpiOworICAgIGlmKG11bHRpcGxlX2NjcykKKyAgICAgIGllcnJvcigwKTsgLyogc3RpbGwgbmVlZGVkPyAqLworICAgIGVsc2UKKyAgICAgIHAtPnoucmVnPWNyMDsKKyAgICBiPXAtPm5leHQ7CisgICAgd2hpbGUoYi0+Y29kZT09QUxMT0NSRUd8fGItPmNvZGU9PUZSRUVSRUcpIGI9Yi0+bmV4dDsKKyAgICBjPWItPmNvZGU7CisgICAgaWYoYzxCRVF8fGM+QkdUKSBpZXJyb3IoMCk7CisgICAgaWYocC0+dHlwZiZVTlNJR05FRCkKKyAgICAgIHNoPSJjbXBsdyI7CisgICAgZWxzZQorICAgICAgc2g9ImNtcHciOworICAgIGlmKChjPT1CTkV8fGM9PUJFUSkmJihwLT5xMi5mbGFncyZLT05TVCkmJnAtPnoucmVnPT1jcjApeworICAgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHEydHlwKHApKTsKKyAgICAgIGlmKHptZXF0byh2bWF4LGwyem0oMEwpKSYmenVtZXF0byh2dW1heCx1bDJ6dW0oMFVMKSkpeworCWlmKGlzcmVnKHExKSl7CisJICBpZighcmVnX3BhaXIocC0+cTEucmVnLCZycCkpIGllcnJvcigwKTsKKwkgIGVtaXQoZiwiXHRvci5cdCVzLCVzLCVzXG4iLG1yZWduYW1lc1t0MV0sbXJlZ25hbWVzW3JwLnIxXSxtcmVnbmFtZXNbcnAucjJdKTsKKwl9ZWxzZXsKKwkgIGNyZWF0ZV9sb2FkYWJsZShmLCZwLT5xMSx0MSk7CisJICBsb2FkX2x3b3JkKGYsdDMsJnAtPnExLHExdHlwKHApLHQyKTsKKwkgIGxvYWRfaHdvcmQoZix0MSwmcC0+cTEscTF0eXAocCksdDIpOworCSAgZW1pdChmLCJcdG9yLlx0JXMsJXMsJXNcbiIsbXJlZ25hbWVzW3QzXSxtcmVnbmFtZXNbdDNdLG1yZWduYW1lc1t0MV0pOworCX0KKwlyZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisgICAgaDE9aDI9bDE9bDI9MDsKKyAgICBpZihpc3JlZyhxMSkpeworICAgICAgaWYoIXJlZ19wYWlyKHAtPnExLnJlZywmcnApKSBpZXJyb3IoMCk7CisgICAgICBoMT1ycC5yMTsKKyAgICAgIGwxPXJwLnIyOworICAgIH1lbHNleworICAgICAgY3JlYXRlX2xvYWRhYmxlKGYsJnAtPnExLHQxKTsKKyAgICAgIGgxPWwxPXQzOworICAgIH0KKyAgICBpZihpc3JlZyhxMikpeworICAgICAgaWYoIXJlZ19wYWlyKHAtPnEyLnJlZywmcnApKSBpZXJyb3IoMCk7CisgICAgICBoMj1ycC5yMTsKKyAgICAgIGwyPXJwLnIyOyAgICAgIAorICAgIH1lbHNlIGlmKHAtPnEyLmZsYWdzJktPTlNUKXsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxxMnR5cChwKSk7CisgICAgICBsbz16dW1yc2hpZnQoenVtbHNoaWZ0KHZ1bWF4LHVsMnp1bSgzMlVMKSksdWwyenVtKDMyVUwpKTsKKyAgICAgIGlmKHp1bWxlcShsbyx1bDJ6dW0oNjU1MzVMKSkpCisJbDI9LTE7IAorICAgICAgaWYocC0+dHlwZiZVTlNJR05FRCl7CisJdWhpPXp1bXJzaGlmdCh2dW1heCx1bDJ6dW0oMzJVTCkpOworCWlmKHp1bWxlcSh1aGksdWwyenVtKDY1NTM1TCkpKQorCSAgaDI9LTE7IAorICAgICAgfWVsc2V7CisJc2hpPXptcnNoaWZ0KHZtYXgsbDJ6bSgzMkwpKTsKKwlpZih6bWxlcShzaGksbDJ6bSgzMjc2N0wpKSYmem1sZXEobDJ6bSgtMzI3NjhMKSxzaGkpKQorCSAgaDI9LTE7CisgICAgICB9CisgICAgfQorICAgIGlmKGgyPT0wfHxsMj09MCl7CisgICAgICBpZighKHAtPnExLmZsYWdzJlJFRyl8fHAtPnExLnJlZyE9dDEpeworCWNyZWF0ZV9sb2FkYWJsZShmLCZwLT5xMix0MSk7CisgICAgICB9ZWxzZSBpZih0bXA9Z2V0X3JlZygpKXsKKwljcmVhdGVfbG9hZGFibGUoZiwmcC0+cTIsdG1wKTsKKyAgICAgIH0KKyAgICAgIGlmKGgyPT0wKSBoMj10MjsKKyAgICAgIGlmKGwyPT0wKSBsMj10MjsKKyAgICB9CisgICAgbG9hZF9od29yZChmLGgxLCZwLT5xMSxxMXR5cChwKSwwKTsKKyAgICBpZihoMj09LTEpeworICAgICAgZW1pdChmLCJcdCVzaVx0JXMsJXMsIixzaCxtcmVnbmFtZXNbcC0+ei5yZWddLG1yZWduYW1lc1toMV0pOworICAgICAgaWYocC0+dHlwZiZVTlNJR05FRCkKKwllbWl0enVtKGYsdWhpKTsKKyAgICAgIGVsc2UKKwllbWl0em0oZixzaGkpOworICAgICAgZW1pdChmLCJcbiIpOworICAgIH1lbHNleworICAgICAgbG9hZF9od29yZChmLGgyLCZwLT5xMixxMnR5cChwKSx0Mik7CisgICAgICBlbWl0KGYsIlx0JXNcdCVzLCVzLCVzXG4iLHNoLG1yZWduYW1lc1twLT56LnJlZ10sbXJlZ25hbWVzW2gxXSxtcmVnbmFtZXNbaDJdKTsKKyAgICB9CisgICAgaWYoYz09QkdUfHxjPT1CR0UpeworICAgICAgZW1pdChmLCJcdGJndFx0JXMsJXMlZFxuIixtcmVnbmFtZXNbcC0+ei5yZWddLGxhYnByZWZpeCxiLT50eXBmKTsKKyAgICAgIGVtaXQoZiwiXHRibHRcdCVzLCVzJWRcbiIsbXJlZ25hbWVzW3AtPnoucmVnXSxsYWJwcmVmaXgsZmFsc2VsYWIpOworICAgIH1lbHNlIGlmKGM9PUJMVHx8Yz09QkxFKXsKKyAgICAgIGVtaXQoZiwiXHRibHRcdCVzLCVzJWRcbiIsbXJlZ25hbWVzW3AtPnoucmVnXSxsYWJwcmVmaXgsYi0+dHlwZik7CisgICAgICBlbWl0KGYsIlx0Ymd0XHQlcywlcyVkXG4iLG1yZWduYW1lc1twLT56LnJlZ10sbGFicHJlZml4LGZhbHNlbGFiKTsKKyAgICB9ZWxzZSBpZihjIT1CTkUpeworICAgICAgZW1pdChmLCJcdGJuZVx0JXMsJXMlZFxuIixtcmVnbmFtZXNbcC0+ei5yZWddLGxhYnByZWZpeCxmYWxzZWxhYik7CisgICAgfWVsc2V7CisgICAgICBlbWl0KGYsIlx0Ym5lXHQlcywlcyVkXG4iLG1yZWduYW1lc1twLT56LnJlZ10sbGFicHJlZml4LGItPnR5cGYpOworICAgIH0KKworICAgIGxvYWRfbHdvcmQoZixsMSwmcC0+cTEscTF0eXAocCksdDEpOworICAgIGlmKGwyPT0tMSl7CisgICAgICBlbWl0KGYsIlx0Y21wbHdpXHQlcywlcywiLG1yZWduYW1lc1twLT56LnJlZ10sbXJlZ25hbWVzW2wxXSk7CisgICAgICBlbWl0em0oZixsbyk7CisgICAgICBlbWl0KGYsIlxuIik7CisgICAgfWVsc2V7CisgICAgICBsb2FkX2x3b3JkKGYsbDIsJnAtPnEyLHEydHlwKHApLHQyKTsKKyAgICAgIGVtaXQoZiwiXHRjbXBsd1x0JXMsJXMsJXNcbiIsbXJlZ25hbWVzW3AtPnoucmVnXSxtcmVnbmFtZXNbbDFdLG1yZWduYW1lc1tsMl0pOworICAgIH0gICAKKyAgICBlbWl0KGYsIlx0YiVzXHQlcywlcyVkXG4iLGNjc1tjLUJFUV0sbXJlZ25hbWVzW3AtPnoucmVnXSxsYWJwcmVmaXgsYi0+dHlwZik7CisgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsZmFsc2VsYWIpOworICAgIGItPmNvZGU9Tk9QOworCSAgIAorICAgIHJldHVybiAxOworICB9CisKKyAgaWYoYz09QUREfHxjPT1TVUJ8fGM9PUFORHx8Yz09T1J8fGM9PVhPUil7CisgICAgLypGSVhNRTogcTI9PXosIHExcmVnK3EycmVnPXpyZWcgKi8KKyAgICBpbnQgemwsemgsbDEsbDIsaDEsaDIsdG1wOworICAgIGNoYXIgKnNsLCpzaDsKKyAgICBpZihjPT1BREQpeworICAgICAgc2w9ImFkZGMiOworICAgICAgc2g9ImFkZGUiOworICAgIH1lbHNlIGlmKGM9PVNVQil7CisgICAgICAvKiB0aGVyZSBpcyBubyBzdWJjLCB0aGVyZWZvcmUgd2UgYWx3YXlzIHVzZSByZXZlcnNlIG9yZGVyICovCisgICAgICBzbD0ic3ViZmMiOworICAgICAgc2g9InN1YmZlIjsKKyAgICB9ZWxzZSBpZihjPT1BTkQpeworICAgICAgc2w9c2g9ImFuZCI7CisgICAgfWVsc2UgaWYoYz09T1IpeworICAgICAgc2w9c2g9Im9yIjsKKyAgICB9ZWxzZSBpZihjPT1YT1IpeworICAgICAgc2w9c2g9InhvciI7CisgICAgfWVsc2UKKyAgICAgIGllcnJvcigwKTsKKyAgICBsMT1sMj1oMT1oMj16bD16aD0wOworICAgIGNyZWF0ZV9sb2FkYWJsZShmLCZwLT5xMSx0MSk7CisgICAgaWYoaXNyZWcocTEpKXsKKyAgICAgIGlmKCFyZWdfcGFpcihwLT5xMS5yZWcsJnJwKSkgaWVycm9yKDApOworICAgICAgaDE9cnAucjE7CisgICAgICBsMT1ycC5yMjsKKyAgICB9ZWxzZXsKKyAgICAgIGNyZWF0ZV9sb2FkYWJsZShmLCZwLT5xMSx0MSk7CisgICAgICBsMT10MzsKKyAgICAgIGgxPXQxOworICAgIH0KKyAgICBpZihpc3JlZyhxMikpeworICAgICAgaWYoIXJlZ19wYWlyKHAtPnEyLnJlZywmcnApKSBpZXJyb3IoMCk7CisgICAgICBoMj1ycC5yMTsKKyAgICAgIGwyPXJwLnIyOworICAgIH1lbHNlIGlmKHAtPnEyLmZsYWdzJktPTlNUKXsKKyAgICAgIC8qIGNoZWNrIGZvciBpbW1lZGlhdGVzICovCisgICAgICBpZihjPT1PUnx8Yz09WE9SKXsKKwkvKiBvciBhbmQgeG9yIGNhbiBhbHdheXMgYmUgZG9uZSB1c2luZyAoeClvcmkgYW5kICh4KW9yaXMgKi8KKwloMj1sMj0tMTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PUFERCl7CisJem1heCB0bXA7CisJZXZhbF9jb25zdCgmcC0+cTIudmFsLHEydHlwKHApKTsKKwl0bXA9em1yc2hpZnQodm1heCxsMnptKDMyTCkpOworCS8qIHRoZXJlIGFyZSBhZGR6ZSBhbmQgYWRkbWUgaW5zdHJ1Y3Rpb25zICovCisJaWYoem1lcXRvKHRtcCxsMnptKDBMKSl8fHptZXF0byh0bXAsbDJ6bSgtMUwpKSkKKwkgIGgyPS0xOwkKKwkvKiBhZGRpYyBzdXBwb3J0cyAxNmJpdCBzaWduZWQgdmFsdWVzICovCisJdG1wPXptcnNoaWZ0KHptbHNoaWZ0KHZtYXgsbDJ6bSgzMkwpKSxsMnptKDMyTCkpOwkKKwlpZih6bWxlcSh0bXAsbDJ6bSgzMjc2N0wpKSYmem1sZXEobDJ6bSgtMzI3NjhMKSx0bXApKQorCSAgbDI9LTE7CisgICAgICB9CisgICAgICBpZihjPT1TVUIpeworCXptYXggdG1wOworCWV2YWxfY29uc3QoJnAtPnEyLnZhbCxxMnR5cChwKSk7CisJdG1wPXptcnNoaWZ0KHZtYXgsbDJ6bSgzMkwpKTsKKwkvKiB0aGVyZSBhcmUgYWRkemUgYW5kIGFkZG1lIGluc3RydWN0aW9ucyAqLworCWlmKHptZXF0byh0bXAsbDJ6bSgwTCkpfHx6bWVxdG8odG1wLGwyem0oMUwpKSkKKwkgIGgyPS0xOwkKKwkvKiBhZGRpYyBzdXBwb3J0cyAxNmJpdCBzaWduZWQgdmFsdWVzICovCisJdG1wPXptcnNoaWZ0KHptbHNoaWZ0KHZtYXgsbDJ6bSgzMkwpKSxsMnptKDMyTCkpOwkKKwlpZih6bWxlcSh0bXAsbDJ6bSgzMjc2OEwpKSYmem1sZXEobDJ6bSgtMzI3NjdMKSx0bXApKQorCSAgbDI9LTE7CisgICAgICB9CQorICAgIH0KKyAgICBpZighbDJ8fCFoMil7CisgICAgICBpZighKHAtPnExLmZsYWdzJlJFRyl8fHAtPnExLnJlZyE9dDEpeworCWNyZWF0ZV9sb2FkYWJsZShmLCZwLT5xMix0MSk7CisgICAgICB9ZWxzZSBpZih0bXA9Z2V0X3JlZygpKXsKKwljcmVhdGVfbG9hZGFibGUoZiwmcC0+cTIsdG1wKTsKKyAgICAgIH0KKyAgICAgIGlmKGgyPT0wKSBoMj10MjsKKyAgICAgIGlmKGwyPT0wKSBsMj10MjsKKyAgICB9CisgICAgaWYoaXNyZWcoeikmJighaXNyZWcocTIpfHxwLT56LnJlZyE9cC0+cTIucmVnKSl7CisgICAgICBpZighcmVnX3BhaXIocC0+ei5yZWcsJnJwKSkgaWVycm9yKDApOworICAgICAgemg9cnAucjE7CisgICAgICB6bD1ycC5yMjsKKyAgICB9ZWxzZXsKKyAgICAgIHpsPXQzOworICAgICAgemg9dDE7CisgICAgfQorICAgIGlmKChwLT5xMS5mbGFncyZLT05TVCkmJmwxPT10Myl7CisgICAgICBsb2FkX2x3b3JkKGYsdDIsJnAtPnExLHExdHlwKHApLDApOworICAgICAgZW1pdChmLCJcdG1yXHQlcywlc1xuIixtcmVnbmFtZXNbdDNdLG1yZWduYW1lc1t0Ml0pOworICAgICAgQlNFVChyZWdzX21vZGlmaWVkLHQzKTsKKyAgICB9ZWxzZQorICAgICAgbG9hZF9sd29yZChmLGwxLCZwLT5xMSxxMXR5cChwKSwwKTsKKyAgICBpZihsMiE9LTEpeworICAgICAgbG9hZF9sd29yZChmLGwyLCZwLT5xMixxMnR5cChwKSx0Mik7CisgICAgICBlbWl0KGYsIlx0JXNcdCVzLCVzLCVzXG4iLHNsLG1yZWduYW1lc1t6bF0sbXJlZ25hbWVzW2wyXSxtcmVnbmFtZXNbbDFdKTsKKyAgICB9ZWxzZXsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxxMnR5cChwKSk7CisgICAgICBpZihjPT1BRER8fGM9PVNVQil7CisJaWYoYz09U1VCKSB2bWF4PXptc3ViKGwyem0oMEwpLHZtYXgpOworCXZtYXg9em1yc2hpZnQoem1sc2hpZnQodm1heCxsMnptKDMyTCkpLGwyem0oMzJMKSk7CisJZW1pdChmLCJcdGFkZGljXHQlcywlcywiLG1yZWduYW1lc1t6bF0sbXJlZ25hbWVzW2wxXSk7CisJZW1pdHptKGYsdm1heCk7CisJZW1pdChmLCJcbiIpOworICAgICAgfWVsc2UgaWYoYz09T1J8fGM9PVhPUil7CisJenVtYXggdG1wOworCWlmKHp1bWVxdG8oenVtYW5kKHZ1bWF4LHVsMnp1bSgweGZmZmZmZmZmVUwpKSx1bDJ6dW0oMHhmZmZmZmZmZlVMKSkpeworCSAgaWYoYz09WE9SKQorCSAgICBlbWl0KGYsIlx0bm9yXHQlcywlcywlc1xuIixtcmVnbmFtZXNbemxdLG1yZWduYW1lc1tsMV0sbXJlZ25hbWVzW2wxXSk7CisJICBlbHNlCisJICAgIGVtaXQoZiwiXHRsaVx0JXMsLTFcbiIsbXJlZ25hbWVzW3psXSk7CisJfWVsc2V7CisJICB0bXA9enVtYW5kKHZ1bWF4LHVsMnp1bSgweGZmZmZVTCkpOworCSAgaWYoIXp1bWVxdG8odG1wLHVsMnp1bSgwVUwpKSl7CisJICAgIGVtaXQoZiwiXHQlc2lcdCVzLCVzLCIsc2wsbXJlZ25hbWVzW3psXSxtcmVnbmFtZXNbbDFdKTsKKwkgICAgZW1pdHp1bShmLHRtcCk7CisJICAgIGVtaXQoZiwiXG4iKTsKKwkgICAgbDE9emw7CisJICB9CisJICB0bXA9enVtYW5kKHp1bXJzaGlmdCh2dW1heCx1bDJ6dW0oMTZVTCkpLHVsMnp1bSgweGZmZmYpKTsKKwkgIGlmKCF6dW1lcXRvKHRtcCx1bDJ6dW0oMFVMKSkpeworCSAgICBlbWl0KGYsIlx0JXNpc1x0JXMsJXMsIixzbCxtcmVnbmFtZXNbemxdLG1yZWduYW1lc1tsMV0pOworCSAgICBlbWl0enVtKGYsdG1wKTsKKwkgICAgZW1pdChmLCJcbiIpOworCSAgICBsMT16bDsKKwkgIH0KKwkgIGlmKGwxIT16bCkKKwkgICAgZW1pdChmLCJcdG1yXHQlcywlc1xuIixtcmVnbmFtZXNbemxdLG1yZWduYW1lc1tsMV0pOworCX0KKyAgICAgIH1lbHNlCisJaWVycm9yKDApOworICAgIH0KKyAgICBpZihoMiE9LTEpeworICAgICAgbG9hZF9od29yZChmLGgyLCZwLT5xMixxMnR5cChwKSx0Mik7ICAgIAorICAgICAgbG9hZF9od29yZChmLGgxLCZwLT5xMSxxMXR5cChwKSwwKTsKKyAgICAgIGVtaXQoZiwiXHQlc1x0JXMsJXMsJXNcbiIsc2gsbXJlZ25hbWVzW3poXSxtcmVnbmFtZXNbaDJdLG1yZWduYW1lc1toMV0pOworICAgIH1lbHNleworICAgICAgbG9hZF9od29yZChmLGgxLCZwLT5xMSxxMXR5cChwKSwwKTsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxxMnR5cChwKSk7CisgICAgICBpZihjPT1BRER8fGM9PVNVQil7CisJaWYoYz09U1VCKSB2bWF4PXptc3ViKGwyem0oMEwpLHZtYXgpOworCXZtYXg9em1yc2hpZnQodm1heCxsMnptKDMyTCkpOworCWlmKHptZXF0byh2bWF4LGwyem0oMEwpKSl7CisJICBlbWl0KGYsIlx0YWRkemVcdCVzLCVzXG4iLG1yZWduYW1lc1t6aF0sbXJlZ25hbWVzW2gxXSk7CisJfWVsc2UgaWYoem1lcXRvKHZtYXgsbDJ6bSgtMUwpKSl7CisJICBlbWl0KGYsIlx0YWRkbWVcdCVzLCVzXG4iLG1yZWduYW1lc1t6aF0sbXJlZ25hbWVzW2gxXSk7CisJfWVsc2UKKwkgIGllcnJvcigwKTsKKyAgICAgIH1lbHNlIGlmKGM9PU9SfHxjPT1YT1IpeworCXp1bWF4IHRtcDsKKwlpZih6dW1lcXRvKHp1bWFuZCh6dW1yc2hpZnQodnVtYXgsdWwyenVtKDMyTCkpLHVsMnp1bSgweGZmZmZmZmZmVUwpKSx1bDJ6dW0oMHhmZmZmZmZmZlVMKSkpeworCSAgaWYoYz09WE9SKQorCSAgICBlbWl0KGYsIlx0bm9yXHQlcywlcywlc1xuIixtcmVnbmFtZXNbemhdLG1yZWduYW1lc1toMV0sbXJlZ25hbWVzW2gxXSk7CisJICBlbHNlCisJICAgIGVtaXQoZiwiXHRsaVx0JXMsLTFcbiIsbXJlZ25hbWVzW3poXSk7CisJfWVsc2V7CisJICB0bXA9enVtYW5kKHp1bXJzaGlmdCh2dW1heCx1bDJ6dW0oMzJVTCkpLHVsMnp1bSgweGZmZmZVTCkpOworCSAgaWYoIXp1bWVxdG8odG1wLHVsMnp1bSgwVUwpKSl7CisJICAgIGVtaXQoZiwiXHQlc2lcdCVzLCVzLCIsc2wsbXJlZ25hbWVzW3poXSxtcmVnbmFtZXNbaDFdKTsKKwkgICAgZW1pdHp1bShmLHRtcCk7CisJICAgIGVtaXQoZiwiXG4iKTsKKwkgICAgaDE9emg7CisJICB9CisJICB0bXA9enVtYW5kKHp1bXJzaGlmdCh2dW1heCx1bDJ6dW0oNDhVTCkpLHVsMnp1bSgweGZmZmYpKTsKKwkgIGlmKCF6dW1lcXRvKHRtcCx1bDJ6dW0oMFVMKSkpeworCSAgICBlbWl0KGYsIlx0JXNpc1x0JXMsJXMsIixzbCxtcmVnbmFtZXNbemhdLG1yZWduYW1lc1toMV0pOworCSAgICBlbWl0enVtKGYsdG1wKTsKKwkgICAgZW1pdChmLCJcbiIpOworCSAgICBoMT16aDsKKwkgIH0JCisJICBpZihoMSE9emgpCisJICAgIGVtaXQoZiwiXHRtclx0JXMsJXNcbiIsbXJlZ25hbWVzW3poXSxtcmVnbmFtZXNbaDFdKTsKKwl9CisgICAgICB9CisgICAgfQorICAgIGlmKHAtPnouZmxhZ3MpeworICAgICAgY3JlYXRlX2xvYWRhYmxlKGYsJnAtPnosdDIpOworICAgICAgc3RvcmVfbHdvcmQoZix6bCwmcC0+eik7CisgICAgICBzdG9yZV9od29yZChmLHpoLCZwLT56KTsKKyAgICAgIHAtPnouZmxhZ3M9MDsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKworICBjcmVhdGVfbG9hZGFibGUoZiwmcC0+cTEsdDEpOworCisgIGlmKHRtcG9mZj49MzI3NjgmJihyZWdzW3IzXXx8cmVnc1tyNF18fHJlZ3NbcjVdfHxyZWdzW3I2XSkpeworICAgIGVtaXQoZiwiXHRhZGRpc1x0JXMsJXMsJWxkXG4iLG1yZWduYW1lc1t0Ml0sbXJlZ25hbWVzW3NwXSxoaSh0bXBvZmYpKTsKKyAgICBpZihsbyh0bXBvZmYpKSBlbWl0KGYsIlx0YWRkaVx0JXMsJXMsJWxkXG4iLG1yZWduYW1lc1t0Ml0sbXJlZ25hbWVzW3QyXSxsbyh0bXBvZmYpKTsKKyAgICBtc3A9dDI7CisgICAgbXRtcG9mZj0wOworICB9ZWxzZXsKKyAgICBtc3A9c3A7CisgICAgbXRtcG9mZj10bXBvZmY7CisgIH0KKworICBpZihyZWdzW3IzXSl7IGVtaXQoZiwiXHRzdHdcdCVzLCVsZCglcylcbiIsbXJlZ25hbWVzW3IzXSxtdG1wb2ZmLTQsbXJlZ25hbWVzW21zcF0pO3NhdmVtYXNrfD0xO30KKyAgaWYocmVnc1tyNF0peyBlbWl0KGYsIlx0c3R3XHQlcywlbGQoJXMpXG4iLG1yZWduYW1lc1tyNF0sbXRtcG9mZi04LG1yZWduYW1lc1ttc3BdKTtzYXZlbWFza3w9Mjt9CisgIGlmKHJlZ3NbcjVdKSB7ZW1pdChmLCJcdHN0d1x0JXMsJWxkKCVzKVxuIixtcmVnbmFtZXNbcjVdLG10bXBvZmYtMTIsbXJlZ25hbWVzW21zcF0pO3NhdmVtYXNrfD00O30KKyAgaWYocmVnc1tyNl0pIHtlbWl0KGYsIlx0c3R3XHQlcywlbGQoJXMpXG4iLG1yZWduYW1lc1tyNl0sbXRtcG9mZi0xNixtcmVnbmFtZXNbbXNwXSk7c2F2ZW1hc2t8PTg7fQorCisgIGlmKChwLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcC0+cTEucmVnPj1yMyYmcC0+cTEucmVnPD1yNil7CisgICAgZW1pdChmLCJcdG1yXHQlcywlc1xuIixtcmVnbmFtZXNbdDFdLG1yZWduYW1lc1twLT5xMS5yZWddKTsKKyAgICBwLT5xMS5yZWc9dDE7CisgIH0KKyAgaWYoKHAtPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwLT5xMi5yZWc+PXIzJiZwLT5xMi5yZWc8PXI2KXsKKyAgICBlbWl0KGYsIlx0bXJcdCVzLCVzXG4iLG1yZWduYW1lc1t0Ml0sbXJlZ25hbWVzW3AtPnEyLnJlZ10pOworICAgIHAtPnEyLnJlZz10MjsKKyAgfQorICAKKyAgaWYoKHExdHlwKHApJk5RKT09TExPTkcpeworICAgIGlmKHAtPnExLmFtJiZwLT5xMS5hbS0+YmFzZT09cjMpeworICAgICAgaWYocC0+cTEuYW0tPmZsYWdzPT1SRUdfSU5EJiZwLT5xMS5hbS0+b2Zmc2V0PT1yNCkgaWVycm9yKDApOworICAgICAgbG9hZF9sd29yZChmLHI0LCZwLT5xMSxxMXR5cChwKSwwKTsKKyAgICAgIGxvYWRfaHdvcmQoZixyMywmcC0+cTEscTF0eXAocCksMCk7CisgICAgfWVsc2V7CisgICAgICBpZihwLT5xMS5hbSYmcC0+cTEuYW0tPmZsYWdzPT1SRUdfSU5EJiZwLT5xMS5hbS0+b2Zmc2V0PT1yMykgaWVycm9yKDApOworICAgICAgbG9hZF9od29yZChmLHIzLCZwLT5xMSxxMXR5cChwKSwwKTsKKyAgICAgIGxvYWRfbHdvcmQoZixyNCwmcC0+cTEscTF0eXAocCksMCk7CisgICAgfQorICB9ZWxzZXsKKyAgICBpZighSVNGTE9BVChxMXR5cChwKSkpIGllcnJvcigwKTsKKyAgICBsb2FkX3JlZyhmLGYxLCZwLT5xMSxxMXR5cChwKSwwKTsgCisgIH0KKyAgCisgIGlmKHAtPnEyLmZsYWdzKXsKKyAgICBjcmVhdGVfbG9hZGFibGUoZiwmcC0+cTIsdDIpOworICAgIGlmKChxMnR5cChwKSZOUSk9PUxMT05HKXsKKyAgICAgIGlmKGlzcmVnKHEyKSYmcC0+cTIucmVnPT1yM3I0KXsKKwllbWl0KGYsIlx0bHd6XHQlcywlbGQoJXMpXG4iLG1yZWduYW1lc1tyNV0sbXRtcG9mZi00LG1yZWduYW1lc1ttc3BdKTsKKwllbWl0KGYsIlx0bHd6XHQlcywlbGQoJXMpXG4iLG1yZWduYW1lc1tyNl0sbXRtcG9mZi04LG1yZWduYW1lc1ttc3BdKTsKKyAgICAgIH1lbHNleworCWlmKHAtPnEyLmFtJiZwLT5xMi5hbS0+YmFzZT09cjUpeworCSAgaWYocC0+cTIuYW0tPmZsYWdzPT1SRUdfSU5EJiZwLT5xMi5hbS0+b2Zmc2V0PT1yNikgaWVycm9yKDApOworCSAgbG9hZF9sd29yZChmLHI2LCZwLT5xMixxMnR5cChwKSwwKTsKKwkgIGxvYWRfaHdvcmQoZixyNSwmcC0+cTIscTJ0eXAocCksMCk7CisJfWVsc2V7CisJICBpZihwLT5xMi5hbSYmcC0+cTIuYW0tPmZsYWdzPT1SRUdfSU5EJiZwLT5xMi5hbS0+b2Zmc2V0PT1yNSkgaWVycm9yKDApOworCSAgbG9hZF9od29yZChmLHI1LCZwLT5xMixxMnR5cChwKSwwKTsKKwkgIGxvYWRfbHdvcmQoZixyNiwmcC0+cTIscTJ0eXAocCksMCk7CisJfQorICAgICAgfQorICAgIH1lbHNleworICAgICAgaWYoKHEydHlwKHApJk5RKT49TExPTkcpIGllcnJvcigwKTsKKyAgICAgIGlmKGlzcmVnKHEyKSYmcC0+cTIucmVnPT1yMyl7CisJZW1pdChmLCJcdGx3elx0JXMsJWxkKCVzKVxuIixtcmVnbmFtZXNbcjVdLG10bXBvZmYtNCxtcmVnbmFtZXNbbXNwXSk7CisgICAgICB9ZWxzZXsKKwlsb2FkX3JlZyhmLHI1LCZwLT5xMixxMnR5cChwKSwwKTsKKyAgICAgIH0gICAgICAKKyAgICB9CisgIH0KKworICBpZihjPT1NVUxUKSBsaWJmdW5jbmFtZT0iX19tdWxpbnQ2NCI7CisgIGVsc2UgaWYoYz09RElWKXsKKyAgICBpZih0JlVOU0lHTkVEKQorICAgICAgbGliZnVuY25hbWU9Il9fZGl2dWludDY0IjsKKyAgICBlbHNlCisgICAgICBsaWJmdW5jbmFtZT0iX19kaXZzaW50NjQiOworICB9ZWxzZSBpZihjPT1NT0QpeworICAgIGlmKHQmVU5TSUdORUQpCisgICAgICBsaWJmdW5jbmFtZT0iX19tb2R1aW50NjQiOworICAgIGVsc2UKKyAgICAgIGxpYmZ1bmNuYW1lPSJfX21vZHNpbnQ2NCI7CisgIH1lbHNlIGlmKGM9PUNPTlZFUlQpeworICAgIHN0YXRpYyBjaGFyIHNbMzJdOworICAgIGlmKElTRkxPQVQocTF0eXAocCkpKQorICAgICAgc3ByaW50ZihzLCJfX2ZsdCVkdG8lY2ludDY0IiwocTF0eXAocCkmTlEpPT1GTE9BVD8zMjo2NCwoenR5cChwKSZVTlNJR05FRCk/J3UnOidzJyk7CisgICAgZWxzZQorICAgICAgc3ByaW50ZihzLCJfXyVjaW50NjR0b2ZsdCVkIiwocTF0eXAocCkmVU5TSUdORUQpPyd1JzoncycsKHp0eXAocCkmTlEpPT1GTE9BVD8zMjo2NCk7CisgICAgbGliZnVuY25hbWU9czsKKyAgfWVsc2UgaWYoYz09UlNISUZUKXsKKyAgICBpZih0JlVOU0lHTkVEKQorICAgICAgbGliZnVuY25hbWU9Il9fcnNodWludDY0IjsKKyAgICBlbHNlCisgICAgICBsaWJmdW5jbmFtZT0iX19yc2hzaW50NjQiOworICB9ZWxzZSBpZihjPT1MU0hJRlQpCisgICAgbGliZnVuY25hbWU9Il9fbHNoaW50NjQiOworICBlbHNleworICAgIHByaW50ZigiYz0lZFxuIixjKTsKKyAgICBpZXJyb3IoMCk7CisgIH0KKyAgZW1pdChmLCJcdC5nbG9iYWxcdCVzJXNcbiIsaWRwcmVmaXgsbGliZnVuY25hbWUpOworICBlbWl0KGYsIlx0YmxcdCVzJXNcbiIsaWRwcmVmaXgsbGliZnVuY25hbWUpOworICBzdGFja192YWxpZD0wOyAvKkZJWE1FKi8KKworICBpZigocC0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSl7CisgICAgaWYoKHAtPnoucmVnPT1yMyYmKHNhdmVtYXNrJjEpKXx8CisgICAgICAgKHAtPnoucmVnPT1yNCYmKHNhdmVtYXNrJjIpKXx8CisgICAgICAgKHAtPnoucmVnPT1yNSYmKHNhdmVtYXNrJjQpKXx8CisgICAgICAgKHAtPnoucmVnPT1yNiYmKHNhdmVtYXNrJjgpKSl7CisgICAgICBpZihwLT56LnJlZz09cjMpCisJZW1pdChmLCJcdGx3elx0JXMsJWxkKCVzKVxuIixtcmVnbmFtZXNbdDFdLG10bXBvZmYtNCxtcmVnbmFtZXNbbXNwXSk7CisgICAgICBlbHNlIGlmKHAtPnoucmVnPT1yNCkKKwllbWl0KGYsIlx0bHd6XHQlcywlbGQoJXMpXG4iLG1yZWduYW1lc1t0MV0sbXRtcG9mZi04LG1yZWduYW1lc1ttc3BdKTsKKyAgICAgIGVsc2UgaWYocC0+ei5yZWc9PXI1KQorCWVtaXQoZiwiXHRsd3pcdCVzLCVsZCglcylcbiIsbXJlZ25hbWVzW3QxXSxtdG1wb2ZmLTEyLG1yZWduYW1lc1ttc3BdKTsKKyAgICAgIGVsc2UgaWYocC0+ei5yZWc9PXI2KQorCWVtaXQoZiwiXHRsd3pcdCVzLCVsZCglcylcbiIsbXJlZ25hbWVzW3QxXSxtdG1wb2ZmLTE2LG1yZWduYW1lc1ttc3BdKTsKKyAgICAgIGVsc2UKKwlpZXJyb3IoMCk7CisgICAgICBwLT56LnJlZz10MTsKKyAgICB9CisgIH0KKworICBpZigocC0+ei5mbGFncyZSRUcpJiZwLT56LnJlZz09cjMpCisgICAgc2F2ZW1hc2smPX4xOworICBpZigocC0+ei5mbGFncyZSRUcpJiZwLT56LnJlZz09cjQpCisgICAgc2F2ZW1hc2smPX4yOworICBpZigocC0+ei5mbGFncyZSRUcpJiZwLT56LnJlZz09cjUpCisgICAgc2F2ZW1hc2smPX40OworICBpZigocC0+ei5mbGFncyZSRUcpJiZwLT56LnJlZz09cjYpCisgICAgc2F2ZW1hc2smPX44OworICBpZigocC0+ei5mbGFncyZSRUcpJiZwLT56LnJlZz09cjNyNCkKKyAgICBzYXZlbWFzayY9fjM7CisgIGlmKChwLT56LmZsYWdzJlJFRykmJnAtPnoucmVnPT1yNXI2KQorICAgIHNhdmVtYXNrJj1+MTI7CisKKworICBpZihJU0ZMT0FUKHp0eXAocCkpKXsKKyAgICB6cmVnPWYxOworICB9ZWxzZXsKKyAgICBjcmVhdGVfbG9hZGFibGUoZiwmcC0+eix0MSk7CisgICAgc3RvcmVfaHdvcmQoZixyMywmcC0+eik7CisgICAgc3RvcmVfbHdvcmQoZixyNCwmcC0+eik7CisgICAgcC0+ei5mbGFncz0wOworICB9CisKKyAgaWYoc2F2ZW1hc2smMSkKKyAgICBlbWl0KGYsIlx0bHd6XHQlcywlbGQoJXMpXG4iLG1yZWduYW1lc1tyM10sbXRtcG9mZi00LG1yZWduYW1lc1ttc3BdKTsKKyAgaWYoc2F2ZW1hc2smMikKKyAgICBlbWl0KGYsIlx0bHd6XHQlcywlbGQoJXMpXG4iLG1yZWduYW1lc1tyNF0sbXRtcG9mZi04LG1yZWduYW1lc1ttc3BdKTsKKyAgaWYoc2F2ZW1hc2smNCkKKyAgICBlbWl0KGYsIlx0bHd6XHQlcywlbGQoJXMpXG4iLG1yZWduYW1lc1tyNV0sbXRtcG9mZi0xMixtcmVnbmFtZXNbbXNwXSk7CisgIGlmKHNhdmVtYXNrJjgpCisgICAgZW1pdChmLCJcdGx3elx0JXMsJWxkKCVzKVxuIixtcmVnbmFtZXNbcjZdLG10bXBvZmYtMTYsbXJlZ25hbWVzW21zcF0pOworICAKKyAgcmV0dXJuIDE7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBFbmQgb2YgcHJpdmF0ZSBkYXRhIGFuZCBmdW5jdGlvbnMuICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW50IGluaXRfY2codm9pZCkKKy8qICBEb2VzIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbnMgZm9yIHRoZSBjb2RlLWdlbmVyYXRvci4gR2V0cyBjYWxsZWQgICovCisvKiAgb25jZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCBzaG91bGQgcmV0dXJuIDAgaW4gY2FzZSBvZiBwcm9ibGVtcy4gICAgICAqLworeworICBpbnQgaTsKKyAgLyogIEluaXRpYWxpemUgc29tZSB2YWx1ZXMgd2hpY2ggY2Fubm90IGJlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgICAqLworICAvKiAgYmVjYXVzZSB0aGV5IGFyZSBzdG9yZWQgaW4gdGhlIHRhcmdldCdzIGFyaXRobWV0aWMuICAgICAgICAgICAgICovCisgIG1heGFsaWduPWwyem0oOEwpOworICBpZihQT1dFUk9QRU4peworICAgIHN0YWNrYWxpZ249bDJ6bSg0TCk7CisgICAgYWxpZ25fYXJndW1lbnRzPTA7CisgIH1lbHNleworICAgIHRvY25hbWU9c2RhdGFuYW1lOworICAgIHN0YWNrYWxpZ249bDJ6bSg0TCk7CisgICAgaWYoTk9BTElHTkFSR1MpCisgICAgICBhbGlnbl9hcmd1bWVudHM9MDsKKyAgICBlbHNlCisgICAgICBhbGlnbl9hcmd1bWVudHM9MTsKKyAgfQorICBjaGFyX2JpdD1sMnptKDhMKTsKKyAgaWYoZ19mbGFnc1s3XSZVU0VERkxBRyl7CisgICAgbWFsaWduW0lOVF09bWFsaWduW0xPTkddPW1hbGlnbltMTE9OR109bWFsaWduW1BPSU5URVJdPW1hbGlnbltGTE9BVF09bWFsaWduW0RPVUJMRV09bWFsaWduW0xET1VCTEVdPTI7CisgIH0KKyAgZm9yKGk9MDtpPD1NQVhfVFlQRTtpKyspeworICAgIHNpemV0YWJbaV09bDJ6bShtc2l6ZXRhYltpXSk7CisgICAgYWxpZ25baV09bDJ6bShtYWxpZ25baV0pOworICB9CisgIGZvcihpPTA7aTw9TUFYUjtpKyspIG1yZWduYW1lc1tpXT1yZWduYW1lc1tpXTsKKyAgZm9yKGk9IDE7aTw9MzI7aSsrKXsKKyAgICByZWdzaXplW2ldPWwyem0oNEwpOworICAgIHJlZ3R5cGVbaV09Jmx0eXA7CisgICAgaWYoZ19mbGFnc1s4XSZVU0VERkxBRykgbXJlZ25hbWVzW2ldKys7CisgIH0KKyAgZm9yKGk9MzM7aTw9NjQ7aSsrKXsKKyAgICByZWdzaXplW2ldPWwyem0oOEwpOworICAgIHJlZ3R5cGVbaV09JmxkYmw7CisgICAgaWYoZ19mbGFnc1s4XSZVU0VERkxBRykgbXJlZ25hbWVzW2ldKys7CisgIH0KKyAgZm9yKGk9NjU7aTw9NzI7aSsrKXsKKyAgICByZWdzaXplW2ldPWwyem0oMUwpOworICAgIHJlZ3R5cGVbaV09JmxjaGFyOworICAgIGlmKGdfZmxhZ3NbOF0mVVNFREZMQUcpIG1yZWduYW1lc1tpXSs9MjsKKyAgfQorICBmb3IoaT03NDtpPD04NjtpKyspeworICAgIHJlZ3NpemVbaV09bDJ6bSg4TCk7CisgICAgcmVndHlwZVtpXT0mbGx0eXA7CisgIH0KKworICAvKiAgVXNlIG11bHRpcGxlIGNjcy4gICAqLworICBtdWx0aXBsZV9jY3M9MTsKKworICAvKiAgSW5pdGlhbGl6ZSB0aGUgbWluL21heC1zZXR0aW5ncy4gTm90ZSB0aGF0IHRoZSB0eXBlcyBvZiB0aGUgICAgICovCisgIC8qICBob3N0IHN5c3RlbSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIHRhcmdldCBzeXN0ZW0gYW5kIHlvdSBtYXkgKi8KKyAgLyogIG9ubHkgdXNlIHRoZSBzbWFsbGVzdCBtYXhpbXVtIHZhbHVlcyBBTlNJIGd1YXJhbnRlZXMgaWYgeW91ICAgICAqLworICAvKiAgd2FudCB0byBiZSBwb3J0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBUaGF0J3MgdGhlIHJlYXNvbiBmb3IgdGhlIHN1YnRyYWN0aW9uIGluIHRfbWluW0lOVF0uIExvbmcgY291bGQgKi8KKyAgLyogIGJlIHVuYWJsZSB0byByZXByZXNlbnQgLTIxNDc0ODM2NDggb24gdGhlIGhvc3Qgc3lzdGVtLiAgICAgICAgICAqLworICB0X21pbltDSEFSXT1sMnptKC0xMjhMKTsKKyAgdF9taW5bU0hPUlRdPWwyem0oLTMyNzY4TCk7CisgIHRfbWluW0lOVF09em1zdWIobDJ6bSgtMjE0NzQ4MzY0N0wpLGwyem0oMUwpKTsKKyAgdF9taW5bTE9OR109dF9taW4oSU5UKTsKKyAgdF9taW5bTExPTkddPXptbHNoaWZ0KGwyem0oMUwpLGwyem0oNjNMKSk7CisgIHRfbWluW01BWElOVF09dF9taW4oTExPTkcpOworICB0X21heFtDSEFSXT11bDJ6dW0oMTI3TCk7CisgIHRfbWF4W1NIT1JUXT11bDJ6dW0oMzI3NjdVTCk7CisgIHRfbWF4W0lOVF09dWwyenVtKDIxNDc0ODM2NDdVTCk7CisgIHRfbWF4W0xPTkddPXRfbWF4KElOVCk7CisgIHRfbWF4W0xMT05HXT16dW1yc2hpZnQoenVta29tcGwodWwyenVtKDBVTCkpLHVsMnp1bSgxVUwpKTsKKyAgdF9tYXhbTUFYSU5UXT10X21heChMTE9ORyk7CisgIHR1X21heFtDSEFSXT11bDJ6dW0oMjU1VUwpOworICB0dV9tYXhbU0hPUlRdPXVsMnp1bSg2NTUzNVVMKTsKKyAgdHVfbWF4W0lOVF09dWwyenVtKDQyOTQ5NjcyOTVVTCk7CisgIHR1X21heFtMT05HXT10X21heChVTlNJR05FRHxJTlQpOworICB0dV9tYXhbTExPTkddPXp1bWtvbXBsKHVsMnp1bSgwVUwpKTsKKyAgdHVfbWF4W01BWElOVF09dF9tYXgoVU5TSUdORUR8TExPTkcpOworCisgIC8qICBSZXNlcnZlIGEgZmV3IHJlZ2lzdGVycyBmb3IgdXNlIGJ5IHRoZSBjb2RlLWdlbmVyYXRvci4gICAgICAqLworICAvKiAgVGhpcyBpcyBub3Qgb3B0aW1hbCBidXQgc2ltcGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaWYoUE9XRVJPUEVOKXsKKyAgICBzZD1yMjsKKyAgfQorICByZWdzYVt0MV09cmVnc2FbdDJdPXJlZ3NhW3QzXT0xOworICByZWdzYVtmMV09cmVnc2FbZjJdPXJlZ3NhW2YzXT0xOworICByZWdzYVtzcF09cmVnc2FbZnBdPXJlZ3NhW3NkXT1yZWdzYVtyMl09MTsKKyAgcmVnc2NyYXRjaFt0MV09cmVnc2NyYXRjaFt0Ml09cmVnc2NyYXRjaFt0M109MDsKKyAgcmVnc2NyYXRjaFtmMV09cmVnc2NyYXRjaFtmMl09cmVnc2NyYXRjaFtmM109MDsKKyAgcmVnc2NyYXRjaFtzcF09cmVnc2NyYXRjaFtmcF09cmVnc2NyYXRjaFtzZF09cmVnc2NyYXRjaFtyMl09MDsKKworICBpZihnX2ZsYWdzWzZdJlVTRURGTEFHKSB7bWluZnJhbWU9ODtsYWJwcmVmaXg9Ii5sIjtpZHByZWZpeD0iIjt9CisgIGlmKFBPV0VST1BFTikge21pbmZyYW1lPTI0O2xhYnByZWZpeD0ibCI7aWRwcmVmaXg9Il8iO30KKworICBpZihvcHRzaXplKXsKKyAgICBkYXRhbmFtZT0iXHQuZGF0YVxuIjsKKyAgICByb2RhdGFuYW1lPSJcdC5zZWN0aW9uXHQucm9kYXRhXG4iOworICAgIHNkYXRhbmFtZT0iXHQuc2VjdGlvblx0XCIuc2RhdGFcIixcImF3XCJcbiI7CisgICAgc2RhdGEybmFtZT0iXHQuc2VjdGlvblx0XCIuc2RhdGEyXCIsXCJhXCJcbiI7CisgICAgc2Jzc25hbWU9Ilx0LnNlY3Rpb25cdFwiLnNic3NcIixcImF1d1wiXG4iOworICB9CisKKyAgaWYoQkFTRVJFTE9TNCkgYnNzbmFtZT0iXHQuYnNzXG4iOworCisgIHRhcmdldF9tYWNyb3M9bWFycmF5OworCisgIGRlY2xhcmVfYnVpbHRpbigiX19tdWxpbnQ2NCIsTExPTkcsTExPTkcscjNyNCxMTE9ORyxyNXI2LDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZzaW50NjQiLExMT05HLExMT05HLHIzcjQsTExPTkcscjVyNiwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2dWludDY0IixVTlNJR05FRHxMTE9ORyxVTlNJR05FRHxMTE9ORyxyM3I0LFVOU0lHTkVEfExMT05HLHI1cjYsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZHNpbnQ2NCIsTExPTkcsTExPTkcscjNyNCxMTE9ORyxyNXI2LDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19tb2R1aW50NjQiLFVOU0lHTkVEfExMT05HLFVOU0lHTkVEfExMT05HLHIzcjQsVU5TSUdORUR8TExPTkcscjVyNiwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbHNoaW50NjQiLExMT05HLExMT05HLHIzcjQsSU5ULHI1LDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19yc2hzaW50NjQiLExMT05HLExMT05HLHIzcjQsSU5ULHI1LDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19yc2h1aW50NjQiLExMT05HLFVOU0lHTkVEfExMT05HLHIzcjQsSU5ULHI1LDEsMCk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgaW5pdF9kYihGSUxFICpmKQoreworICBkd2FyZjJfc2V0dXAoc2l6ZXRhYltQT0lOVEVSXSwiLmJ5dGUiLCIuMmJ5dGUiLCIuNGJ5dGUiLCIuNGJ5dGUiLGxhYnByZWZpeCxpZHByZWZpeCwiLnNlY3Rpb24iKTsKKyAgZHdhcmYyX3ByaW50X2NvbXBfdW5pdF9oZWFkZXIoZik7Cit9CisKK2ludCBmcmV0dXJuKHN0cnVjdCBUeXAgKnQpCisvKiAgUmV0dXJucyB0aGUgcmVnaXN0ZXIgaW4gd2hpY2ggdmFyaWFibGVzIG9mIHR5cGUgdCBhcmUgcmV0dXJuZWQuICovCisvKiAgSWYgdGhlIHZhbHVlIGNhbm5vdCBiZSByZXR1cm5lZCBpbiBhIHJlZ2lzdGVyIHJldHVybnMgMC4gICAgICAgICovCisvKiAgQSBwb2ludGVyIE1VU1QgYmUgcmV0dXJuZWQgaW4gYSByZWdpc3Rlci4gVGhlIGNvZGUtZ2VuZXJhdG9yICAgICovCisvKiAgaGFzIHRvIHNpbXVsYXRlIGEgcHNldWRvIHJlZ2lzdGVyIGlmIG5lY2Vzc2FyeS4gICAgICAgICAgICAgICAgICovCit7CisgIGlmKElTRkxPQVQodC0+ZmxhZ3MpKSByZXR1cm4gMzQ7IC8qIGYxICovCisgICAgaWYoSVNTVFJVQ1QodC0+ZmxhZ3MpfHxJU1VOSU9OKHQtPmZsYWdzKSkgcmV0dXJuIDA7CisgICAgaWYoem1sZXEoc3pvZih0KSxsMnptKDRMKSkpIHJldHVybiByMzsgCisgICAgaWYoKHQtPmZsYWdzJk5RKT09TExPTkcpIHJldHVybiA3NDsgLyogcjMvcjQgKi8KKyAgICByZXR1cm4gMDsKK30KKworaW50IHJlZ19wYWlyKGludCByLHN0cnVjdCBycGFpciAqcCkKKy8qIFJldHVybnMgMCBpZiB0aGUgcmVnaXN0ZXIgaXMgbm8gcmVnaXN0ZXIgcGFpci4gSWYgciAgKi8KKy8qIGlzIGEgcmVnaXN0ZXIgcGFpciBub24temVybyB3aWxsIGJlIHJldHVybmVkIGFuZCB0aGUgKi8KKy8qIHN0cnVjdHVyZSBwb2ludGVkIHRvIHAgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgdHdvICAgKi8KKy8qIGVsZW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYocjw3NHx8cj44NikKKyAgICByZXR1cm4gMDsKKyAgc3dpdGNoKHIpeworICBjYXNlIDc0OiBwLT5yMT00O3AtPnIyPTU7cmV0dXJuIDE7CisgIGNhc2UgNzU6IHAtPnIxPTY7cC0+cjI9NztyZXR1cm4gMTsKKyAgY2FzZSA3NjogcC0+cjE9ODtwLT5yMj05O3JldHVybiAxOworICBjYXNlIDc3OiBwLT5yMT0xMDtwLT5yMj0xMTtyZXR1cm4gMTsKKyAgY2FzZSA3ODogcC0+cjE9MTU7cC0+cjI9MTY7cmV0dXJuIDE7CisgIGNhc2UgNzk6IHAtPnIxPTE3O3AtPnIyPTE4O3JldHVybiAxOworICBjYXNlIDgwOiBwLT5yMT0xOTtwLT5yMj0yMDtyZXR1cm4gMTsKKyAgY2FzZSA4MTogcC0+cjE9MjE7cC0+cjI9MjI7cmV0dXJuIDE7CisgIGNhc2UgODI6IHAtPnIxPTIzO3AtPnIyPTI0O3JldHVybiAxOworICBjYXNlIDgzOiBwLT5yMT0yNTtwLT5yMj0yNjtyZXR1cm4gMTsKKyAgY2FzZSA4NDogcC0+cjE9Mjc7cC0+cjI9Mjg7cmV0dXJuIDE7CisgIGNhc2UgODU6IHAtPnIxPTI5O3AtPnIyPTMwO3JldHVybiAxOworICBjYXNlIDg2OiBwLT5yMT0zMTtwLT5yMj0zMjtyZXR1cm4gMTsKKyAgfQorICBpZXJyb3IoMCk7Cit9CisKKworaW50IGNvc3Rfc2F2aW5ncyhzdHJ1Y3QgSUMgKnAsaW50IHIsc3RydWN0IG9iaiAqbykKK3sKKyAgaW50IGM9cC0+Y29kZTsKKyAgaWYoby0+ZmxhZ3MmVktPTlNUKXsKKyAgICBzdHJ1Y3Qgb2JqICpjbz0mby0+di0+Y29iajsKKyAgICBpbnQgbG9uZ2xvYWQ7CisgICAgaWYoby0+ZmxhZ3MmRFJFRk9CSikKKyAgICAgIHJldHVybiA0OworICAgIGlmKElTRkxPQVQocC0+dHlwZikpIHJldHVybiAyOworICAgIGxvbmdsb2FkPTA7CisgICAgaWYoKGNvLT5mbGFncyZWQVJBRFIpJiYhdXNlX3NkKG8tPnYtPnZ0eXAtPmZsYWdzKSkKKyAgICAgIGxvbmdsb2FkPTI7CisgICAgaWYoY28tPmZsYWdzJktPTlNUKXsKKyAgICAgIGV2YWxfY29uc3QoJmNvLT52YWwscC0+dHlwZik7CisgICAgICBpZihwLT50eXBmJlVOU0lHTkVEKXsKKwlpZighenVtbGVxKHZ1bWF4LHVsMnp1bSg2NTUzNVVMKSkpCisJICBsb25nbG9hZD0yOworICAgICAgfWVsc2V7CisJaWYoIXptbGVxKHZtYXgsbDJ6bSgzMjc2N0wpKXx8em1sZXEodm1heCxsMnptKC0zMjc2OUwpKSkKKwkgIGxvbmdsb2FkPTI7CisgICAgICB9CisgICAgfQorICAgIGlmKG89PSZwLT5xMSYmcC0+Y29kZT09QVNTSUdOJiYoKHAtPnouZmxhZ3MmRFJFRk9CSil8fHAtPnoudi0+c3RvcmFnZV9jbGFzcz09U1RBVElDfHxwLT56LnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTikpCisgICAgICByZXR1cm4gbG9uZ2xvYWQrMjsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbG9uZ2xvYWQ7CisgIH0KKyAgaWYoby0+ZmxhZ3MmRFJFRk9CSikKKyAgICByZXR1cm4gNDsKKyAgaWYoYz09U0VUUkVUVVJOJiZyPT1wLT56LnJlZyYmIShvLT5mbGFncyZEUkVGT0JKKSkgcmV0dXJuIDM7CisgIGlmKGM9PUdFVFJFVFVSTiYmcj09cC0+cTEucmVnJiYhKG8tPmZsYWdzJkRSRUZPQkopKSByZXR1cm4gMzsKKyAgcmV0dXJuIDI7Cit9CisKK2ludCByZWdvayhpbnQgcixpbnQgdCxpbnQgbW9kZSkKKy8qICBSZXR1cm5zIDAgaWYgcmVnaXN0ZXIgciBjYW5ub3Qgc3RvcmUgdmFyaWFibGVzIG9mICAgKi8KKy8qICB0eXBlIHQuIElmIHQ9PVBPSU5URVIgYW5kIG1vZGUhPTAgdGhlbiBpdCByZXR1cm5zICAgKi8KKy8qICBub24temVybyBvbmx5IGlmIHRoZSByZWdpc3RlciBjYW4gc3RvcmUgYSBwb2ludGVyICAgKi8KKy8qICBhbmQgZGVyZWZlcmVuY2UgYSBwb2ludGVyIHRvIG1vZGUuICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgICBpZihyPT0wKSByZXR1cm4gMDsKKyAgICB0Jj1OUTsKKyAgICBpZih0PT0wKXsKKyAgICAgICAgaWYocj49NjUmJnI8PTcyKSByZXR1cm4gMTsgZWxzZSByZXR1cm4gMDsKKyAgICB9CisgICAgaWYoSVNGTE9BVCh0KSYmcj49MzMmJnI8PTY0KSByZXR1cm4gMTsKKyAgICBpZih0PT1QT0lOVEVSJiZyPj0xJiZyPD0zMikgcmV0dXJuIDE7CisgICAgaWYodD49Q0hBUiYmdDw9TE9ORyYmcj49MSYmcjw9MzIpIHJldHVybiAxOworICAgIGlmKHQ9PUxMT05HJiZyPj03NCYmcjw9ODYpIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCitpbnQgZGFuZ2Vyb3VzX0lDKHN0cnVjdCBJQyAqcCkKKy8qICBSZXR1cm5zIHplcm8gaWYgdGhlIElDIHAgY2FuIGJlIHNhZmVseSBleGVjdXRlZCAgICAgKi8KKy8qICB3aXRob3V0IGRhbmdlciBvZiBleGNlcHRpb25zIG9yIHNpbWlsYXIgdGhpbmdzLiAgICAgKi8KKy8qICB2YmNjIG1heSBnZW5lcmF0ZSBjb2RlIGluIHdoaWNoIG5vbi1kYW5nZXJvdXMgSUNzICAgKi8KKy8qICBhcmUgc29tZXRpbWVzIGV4ZWN1dGVkIGFsdGhvdWdoIGNvbnRyb2wtZmxvdyBtYXkgICAgKi8KKy8qICBuZXZlciByZWFjaCB0aGVtIChtYWlubHkgd2hlbiBtb3ZpbmcgY29tcHV0YXRpb25zICAgKi8KKy8qICBvdXQgb2YgbG9vcHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUeXBpY2FsIElDcyB0aGF0IGdlbmVyYXRlIGV4Y2VwdGlvbnMgb24gc29tZSAgICAgICAgKi8KKy8qICBtYWNoaW5lcyBhcmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBhY2Nlc3NlcyB2aWEgcG9pbnRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBkaXZpc2lvbi9tb2R1bG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBvdmVyZmxvdyBvbiBzaWduZWQgaW50ZWdlci9mbG9hdHMgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGM9cC0+Y29kZTsKKyAgaWYoKHAtPnExLmZsYWdzJkRSRUZPQkopfHwocC0+cTIuZmxhZ3MmRFJFRk9CSil8fChwLT56LmZsYWdzJkRSRUZPQkopKQorICAgIHJldHVybiAxOworICBpZigoYz09RElWfHxjPT1NT0QpJiYhKHAtPnEyLmZsYWdzJktPTlNUKSkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBtdXN0X2NvbnZlcnQoaW50IG8saW50IHQsaW50IGNvbnN0X2V4cHIpCisvKiAgUmV0dXJucyB6ZXJvIGlmIGNvZGUgZm9yIGNvbnZlcnRpbmcgbnAgdG8gdHlwZSB0ICAgICovCisvKiAgY2FuIGJlIG9taXR0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgT24gdGhlIFBvd2VyUEMgY3B1IHBvaW50ZXJzIGFuZCAzMmJpdCAgICAgICAgICAgICAgICovCisvKiAgaW50ZWdlcnMgaGF2ZSB0aGUgc2FtZSByZXByZXNlbnRhdGlvbiBhbmQgY2FuIHVzZSAgICovCisvKiAgdGhlIHNhbWUgcmVnaXN0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgICAgaW50IG9wPW8mTlEsdHA9dCZOUTsKKyAgICBpZigob3A9PUlOVHx8b3A9PUxPTkd8fG9wPT1QT0lOVEVSKSYmKHRwPT1JTlR8fHRwPT1MT05HfHx0cD09UE9JTlRFUikpCisgICAgICByZXR1cm4gMDsKKyAgICBpZihvcD09RE9VQkxFJiZ0cD09TERPVUJMRSkgcmV0dXJuIDA7CisgICAgaWYob3A9PUxET1VCTEUmJnRwPT1ET1VCTEUpIHJldHVybiAwOworICAgIGlmKG9wPT10cCkgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgZ2VuX2RzKEZJTEUgKmYsem1heCBzaXplLHN0cnVjdCBUeXAgKnQpCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIDxzaXplPiBieXRlcyBvZiBzdG9yYWdlICovCisvKiAgaW5pdGlhbGl6ZWQgd2l0aCB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIHRpdGxlKGYpOworICBpZihuZXdvYmomJnNlY3Rpb24hPVRPQyYmc2VjdGlvbiE9U0JTUyYmc2VjdGlvbiE9U1BFQ0lBTCYmIUJBU0VSRUxPUzQpCisgICAgZW1pdChmLCIlbGRcbiIsem0ybChzaXplKSk7CisgIGVsc2UKKyAgICBlbWl0KGYsIlx0LnNwYWNlXHQlbGRcbiIsem0ybChzaXplKSk7CisgIG5ld29iaj0wOworfQorCit2b2lkIGdlbl9hbGlnbihGSUxFICpmLHptYXggYWxpZ24pCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gbWFrZSBzdXJlIHRoZSBuZXh0IGRhdGEgaXMgICAgICovCisvKiAgYWxpZ25lZCB0byBtdWx0aXBsZXMgb2YgPGFsaWduPiBieXRlcy4gICAgICAgICAgICAgICovCit7CisgIHRpdGxlKGYpOworICBpZighb3B0c2l6ZSYmKHptMmwoYWxpZ24pPDQpKQorICAgIGVtaXQoZiwiXHQuYWxpZ25cdDJcbiIpOworICBlbHNlCisgICAgaWYoem0ybChhbGlnbik+MSkKKyAgICAgIGVtaXQoZiwiXHQuYWxpZ25cdCVsZFxuIixwb2YyKGFsaWduKS0xKTsKK30KKwordm9pZCBnZW5fdmFyX2hlYWQoRklMRSAqZixzdHJ1Y3QgVmFyICp2KQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSB0aGUgaGVhZCBvZiBhIHZhcmlhYmxlICAqLworLyogIGRlZmluaXRpb24sIGkuZS4gdGhlIGxhYmVsIGFuZCBpbmZvcm1hdGlvbiBmb3IgICAgICAqLworLyogIGxpbmthZ2UgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgY29uc3RmbGFnO2NoYXIgKnNlYzsKKyAgdGl0bGUoZik7CisgIGlmKHYtPmNsaXN0KSBjb25zdGZsYWc9aXNfY29uc3Qodi0+dnR5cCk7CisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQyl7CisgICAgaWYoSVNGVU5DKHYtPnZ0eXAtPmZsYWdzKSkgcmV0dXJuOworICAgIGlmKCFzcGVjaWFsX3NlY3Rpb24oZix2KSl7CisgICAgICBpZih1c2Vfc2Qodi0+dnR5cC0+ZmxhZ3MpJiYhKHYtPnRhdHRyJkZBUikpeworCWlmKEVBQkkpeworCSAgaWYodi0+Y2xpc3QmJiFjb25zdGZsYWcmJnNlY3Rpb24hPVNEQVRBKXtlbWl0KGYsc2RhdGFuYW1lKTtpZihmKSBzZWN0aW9uPVNEQVRBO30KKwkgIGlmKHYtPmNsaXN0JiZjb25zdGZsYWcmJnNlY3Rpb24hPVNEQVRBMil7ZW1pdChmLHNkYXRhMm5hbWUpO2lmKGYpIHNlY3Rpb249U0RBVEEyO30KKwkgIGlmKCF2LT5jbGlzdCYmc2VjdGlvbiE9U0JTUyl7ZW1pdChmLHNic3NuYW1lKTtpZihmKSBzZWN0aW9uPVNCU1M7fQorCX1lbHNlIGlmIChQT1dFUk9QRU4peworCSAgaWYoc2VjdGlvbiE9VE9DKXtlbWl0KGYsdG9jbmFtZSk7aWYoZikgc2VjdGlvbj1UT0M7fQorCX0KKyAgICAgICAgZWxzZSB7CisJICBpZih2LT5jbGlzdCYmc2VjdGlvbiE9U0RBVEEpe2VtaXQoZixzZGF0YW5hbWUpO2lmKGYpIHNlY3Rpb249U0RBVEE7fQorCSAgaWYoIXYtPmNsaXN0JiZzZWN0aW9uIT1TQlNTKXtlbWl0KGYsc2Jzc25hbWUpO2lmKGYpIHNlY3Rpb249U0JTUzt9CisgICAgICAgIH0KKyAgICAgIH1lbHNleworICAgICAgICBpZihCQVNFUkVMT1M0KXsKKyAgICAgICAgICBpZih2LT5jbGlzdCYmc2VjdGlvbiE9REFUQSl7ZW1pdChmLGRhdGFuYW1lKTsgaWYoZikgc2VjdGlvbj1EQVRBO30KKyAgICAgICAgfWVsc2UgaWYoQkFTRVJFTE1PUyl7CisgICAgICAgICAgaWYodi0+Y2xpc3QmJnNlY3Rpb24hPVNEQVRBKXtlbWl0KGYsc2RhdGFuYW1lKTsgaWYoZikgc2VjdGlvbj1TREFUQTt9CisgICAgICAgICAgaWYoIXYtPmNsaXN0JiZzZWN0aW9uIT1TQlNTKXtlbWl0KGYsc2Jzc25hbWUpOyBpZihmKSBzZWN0aW9uPVNCU1M7fQorICAgICAgICB9ZWxzZXsKKyAgICAgICAgICBpZihQT1dFUk9QRU4pIHRvY19lbnRyeShmLHYpOworICAgICAgICAgIGlmKHYtPmNsaXN0JiYoIWNvbnN0ZmxhZ3x8KGdfZmxhZ3NbMl0mVVNFREZMQUcpKSYmc2VjdGlvbiE9REFUQSl7ZW1pdChmLGRhdGFuYW1lKTtpZihmKSBzZWN0aW9uPURBVEE7fQorICAgICAgICAgIGlmKHYtPmNsaXN0JiZjb25zdGZsYWcmJiEoZ19mbGFnc1syXSZVU0VERkxBRykmJnNlY3Rpb24hPVJPREFUQSl7ZW1pdChmLHJvZGF0YW5hbWUpO2lmKGYpIHNlY3Rpb249Uk9EQVRBO30KKwkgIGlmKCFVU0VfQ09NTU9OUyYmIXYtPmNsaXN0JiZzZWN0aW9uIT1CU1Mpe2VtaXQoZixic3NuYW1lKTtpZihmKSBzZWN0aW9uPUJTUzt9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYodi0+Y2xpc3R8fHNlY3Rpb249PVRPQ3x8c2VjdGlvbj09U0JTU3x8c2VjdGlvbj09U1BFQ0lBTCl7CisgICAgICBlbWl0KGYsIlx0LnR5cGVcdCVzJWxkLEBvYmplY3RcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgICBlbWl0KGYsIlx0LnNpemVcdCVzJWxkLCVsZFxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpLHptMmwoc3pvZih2LT52dHlwKSkpOworICAgICAgZ2VuX2FsaWduKGYsZmFsaWduKHYtPnZ0eXApKTsKKyAgICAgIGVtaXQoZiwiJXMlbGQ6XG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICAgIH1lbHNleworICAgICAgZW1pdChmLCJcdC5sY29tbVx0JXMlbGQsIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKyAgICAgIG5ld29iaj0xOworICAgIH0KKyAgfQorICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4peworICAgIGVtaXQoZiwiXHQuZ2xvYmFsXHQlcyVzXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgIGlmKFBPV0VST1BFTiYmKCF1c2Vfc2Qodi0+dnR5cC0+ZmxhZ3MpfHwodi0+dGF0dHImRkFSKSkpCisgICAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXMlcyVzXG4iLHRvY3ByZWZpeCxpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICBpZih2LT5mbGFncyYoREVGSU5FRHxURU5UQVRJVkUpKXsKKyAgICAgIGlmKCFzcGVjaWFsX3NlY3Rpb24oZix2KSl7CisJaWYodXNlX3NkKHYtPnZ0eXAtPmZsYWdzKSYmISh2LT50YXR0ciZGQVIpKXsKKwkgIGlmKEVBQkkpeworCSAgICBpZih2LT5jbGlzdCYmIWNvbnN0ZmxhZyYmc2VjdGlvbiE9U0RBVEEpe2VtaXQoZixzZGF0YW5hbWUpO2lmKGYpIHNlY3Rpb249U0RBVEE7fQorCSAgICBpZih2LT5jbGlzdCYmY29uc3RmbGFnJiZzZWN0aW9uIT1TREFUQTIpe2VtaXQoZixzZGF0YTJuYW1lKTtpZihmKSBzZWN0aW9uPVNEQVRBMjt9CisJICAgIGlmKCF2LT5jbGlzdCYmc2VjdGlvbiE9U0JTUyl7ZW1pdChmLHNic3NuYW1lKTtpZihmKSBzZWN0aW9uPVNCU1M7fQorCSAgfWVsc2UgaWYgKFBPV0VST1BFTil7CisJICAgIGlmKHNlY3Rpb24hPVRPQyl7ZW1pdChmLHRvY25hbWUpO2lmKGYpIHNlY3Rpb249VE9DO30KKwkgIH0KKyAgICAgICAgICBlbHNlIHsKKwkgICAgaWYodi0+Y2xpc3QmJnNlY3Rpb24hPVNEQVRBKXtlbWl0KGYsc2RhdGFuYW1lKTtpZihmKSBzZWN0aW9uPVNEQVRBO30KKwkgICAgaWYoIVVTRV9DT01NT05TJiYhdi0+Y2xpc3QmJnNlY3Rpb24hPVNCU1Mpe2VtaXQoZixzYnNzbmFtZSk7aWYoZikgc2VjdGlvbj1TQlNTO30KKyAgICAgICAgICB9CisJfWVsc2V7CisgICAgICAgICAgaWYoQkFTRVJFTE9TNCl7CisgICAgICAgICAgICBpZih2LT5jbGlzdCYmc2VjdGlvbiE9REFUQSl7ZW1pdChmLGRhdGFuYW1lKTsgaWYoZikgc2VjdGlvbj1EQVRBO30KKyAgICAgICAgICB9ZWxzZSBpZihCQVNFUkVMTU9TKXsKKyAgICAgICAgICAgIGlmKHYtPmNsaXN0JiZzZWN0aW9uIT1TREFUQSl7ZW1pdChmLHNkYXRhbmFtZSk7IGlmKGYpIHNlY3Rpb249U0RBVEE7fQorICAgICAgICAgICAgaWYoIVVTRV9DT01NT05TJiYhdi0+Y2xpc3QmJnNlY3Rpb24hPVNCU1Mpe2VtaXQoZixzYnNzbmFtZSk7IGlmKGYpIHNlY3Rpb249U0JTUzt9CisgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBpZihQT1dFUk9QRU4pIHRvY19lbnRyeShmLHYpOworICAgICAgICAgICAgaWYodi0+Y2xpc3QmJighY29uc3RmbGFnfHwoZ19mbGFnc1syXSZVU0VERkxBRykpJiZzZWN0aW9uIT1EQVRBKXtlbWl0KGYsZGF0YW5hbWUpO2lmKGYpIHNlY3Rpb249REFUQTt9CisgICAgICAgICAgICBpZih2LT5jbGlzdCYmY29uc3RmbGFnJiYhKGdfZmxhZ3NbMl0mVVNFREZMQUcpJiZzZWN0aW9uIT1ST0RBVEEpe2VtaXQoZixyb2RhdGFuYW1lKTtpZihmKSBzZWN0aW9uPVJPREFUQTt9CisJICAgIGlmKCFVU0VfQ09NTU9OUyYmIXYtPmNsaXN0JiZzZWN0aW9uIT1CU1Mpe2VtaXQoZixic3NuYW1lKTtpZihmKSBzZWN0aW9uPUJTUzt9CisgICAgICAgICAgfQorCX0KKyAgICAgIH0KKyAgICAgIGlmKHYtPmNsaXN0fHxzZWN0aW9uPT1UT0N8fHNlY3Rpb249PVNCU1N8fHNlY3Rpb249PVNQRUNJQUwpeworICAgICAgICBlbWl0KGYsIlx0LnR5cGVcdCVzJXMsQG9iamVjdFxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICAgICAgZW1pdChmLCJcdC5zaXplXHQlcyVzLCVsZFxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyLHptMmwoc3pvZih2LT52dHlwKSkpOworCWdlbl9hbGlnbihmLGZhbGlnbih2LT52dHlwKSk7CisgICAgICAgIGVtaXQoZiwiJXMlczpcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgICB9ZWxzZXsKKyAgICAgICAgZW1pdChmLCJcdC4lc2NvbW1cdCVzJXMsIixVU0VfQ09NTU9OUz8iIjoibCIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisJbmV3b2JqPTE7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgZ2VuX2RjKEZJTEUgKmYsaW50IHQsc3RydWN0IGNvbnN0X2xpc3QgKnApCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIHN0YXRpYyBzdG9yYWdlICAgICAgICAgICovCisvKiAgaW5pdGlhbGl6ZWQgd2l0aCBjb25zdC1saXN0IHAuICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIHRpdGxlKGYpOworICBpZigodCZOUSk9PVBPSU5URVIpIHQ9VU5TSUdORUR8TE9ORzsKKyAgZW1pdChmLCJcdC4lc1x0IixkY3RbdCZOUV0pOworICBpZighcC0+dHJlZSl7CisgICAgaWYoSVNGTE9BVCh0KSl7CisgICAgICAvKiAgYXVjaCB3aWVkZXIgbmljaHQgc2VociBzY2hvZW4gdW5kIElFRUUgbm9ldGlnICAgKi8KKyAgICAgIHVuc2lnbmVkIGNoYXIgKmlwOworICAgICAgaXA9KHVuc2lnbmVkIGNoYXIgKikmcC0+dmFsLnZkb3VibGU7CisgICAgICBlbWl0KGYsIjB4JTAyeCUwMnglMDJ4JTAyeCIsaXBbMF0saXBbMV0saXBbMl0saXBbM10pOworICAgICAgaWYoKHQmTlEpIT1GTE9BVCl7CisJZW1pdChmLCIsMHglMDJ4JTAyeCUwMnglMDJ4IixpcFs0XSxpcFs1XSxpcFs2XSxpcFs3XSk7CisgICAgICB9CisgICAgfWVsc2UgaWYoKHQmTlEpPT1MTE9ORyl7CisgICAgICB6dW1heCB0bXA7CisgICAgICBldmFsX2NvbnN0KCZwLT52YWwsdCk7CisgICAgICB0bXA9dnVtYXg7CisgICAgICB2dW1heD16dW1hbmQoenVtcnNoaWZ0KHZ1bWF4LHVsMnp1bSgzMlVMKSksdWwyenVtKDB4ZmZmZmZmZmYpKTsgCisgICAgICBndmFsLnZ1bG9uZz16dW0yenVsKHZ1bWF4KTsKKyAgICAgIGVtaXR2YWwoZiwmZ3ZhbCxVTlNJR05FRHxMT05HKTsKKyAgICAgIGVtaXQoZiwiLCIpOworICAgICAgdnVtYXg9enVtYW5kKHRtcCx1bDJ6dW0oMHhmZmZmZmZmZikpOyAKKyAgICAgIGd2YWwudnVsb25nPXp1bTJ6dWwodnVtYXgpOworICAgICAgZW1pdHZhbChmLCZndmFsLFVOU0lHTkVEfExPTkcpOworICAgIH1lbHNleworICAgICAgZW1pdHZhbChmLCZwLT52YWwsdCZOVSk7CisgICAgfQorICB9ZWxzZXsKKyAgICBlbWl0X29iaihmLCZwLT50cmVlLT5vLHQmTlUpOworICB9CisgIGVtaXQoZiwiXG4iKTtuZXdvYmo9MDsKK30KKworc3RhdGljIHZvaWQgYWxsb2NyZWcoaW50IHIpCit7CisgIGlmKHJlZ19wYWlyKHIsJnJwKSl7CisgICAgcmVnc1tycC5yMV09MTsKKyAgICByZWdzW3JwLnIyXT0xOworICB9CisgIHJlZ3Nbcl09MTsKK30KKworc3RhdGljIHZvaWQgZnJlZXJlZyhpbnQgcikKK3sKKyAgaWYocmVnX3BhaXIociwmcnApKXsKKyAgICByZWdzW3JwLnIxXT0wOworICAgIHJlZ3NbcnAucjJdPTA7CisgIH0KKyAgcmVnc1tyXT0wOworfQorCisvKiAgVGhlIG1haW4gY29kZS1nZW5lcmF0aW9uIHJvdXRpbmUuICAgICAgICAgICAgICAgICAgICovCisvKiAgZiBpcyB0aGUgc3RyZWFtIHRoZSBjb2RlIHNob3VsZCBiZSB3cml0dGVuIHRvLiAgICAgICovCisvKiAgcCBpcyBhIHBvaW50ZXIgdG8gYSBkb3VibHkgbGlua2VkIGxpc3Qgb2YgSUNzICAgICAgICovCisvKiAgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gYm9keSB0byBnZW5lcmF0ZSBjb2RlIGZvci4gICovCisvKiAgdiBpcyBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb2Zmc2V0IGlzIHRoZSBzaXplIG9mIHRoZSBzdGFja2ZyYW1lIHRoZSBmdW5jdGlvbiAgICovCisvKiAgbmVlZHMgZm9yIGxvY2FsIHZhcmlhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3ZvaWQgZ2VuX2NvZGUoRklMRSAqZixzdHJ1Y3QgSUMgKnAsc3RydWN0IFZhciAqdix6bWF4IG9mZnNldCkKKy8qICBUaGUgbWFpbiBjb2RlLWdlbmVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBjLHQsaSxhZGRidWYsdmFyYXJncz0wLGZpeGVkZ3ByLGZpeGVkZnByLHNldGNjLGNjc2V0OworICBjaGFyICpmcHA7aW50IGZwZjtzdHJ1Y3QgSUMgKm07CisgIGxvbmcgb2Y9KHptMmwob2Zmc2V0KSszKS80KjQscmVnYmFzZSx2cGFybW9zPTA7CisgIGlmKERFQlVHJjEpIHByaW50ZigiZ2VuX2NvZGUoKVxuIik7CisgIGZvcihjPTE7Yzw9TUFYUjtjKyspIHJlZ3NbY109cmVnc2FbY107CisgIGlmKHZsYXMpIGZwPXZsYWZwOyBlbHNlIGZwPXNwOworICBtYXhwdXNoZWQ9MDthZGRidWY9MDsKKyAgaWYodi0+dGF0dHImUkZJKQorICAgIHJldD0iXHRyZmlcbiI7CisgIGVsc2UKKyAgICByZXQ9Ilx0YmxyXG4iOworICBpZighdi0+ZmkpIHYtPmZpPW5ld19maSgpOworICB0aXRsZShmKTsKKyAgZm9yKG09cDttO209bS0+bmV4dCl7CisgICAgYz1tLT5jb2RlO3Q9bS0+dHlwZiZOVTsKKyAgICBtLT5leHQuc2V0Y2M9MDsKKyAgICBpZihjPT1BTExPQ1JFRyl7CisgICAgICBhbGxvY3JlZyhtLT5xMS5yZWcpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PUZSRUVSRUcpeworICAgICAgZnJlZXJlZyhtLT5xMS5yZWcpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PUNPTVBBUkUmJihtLT5xMi5mbGFncyZLT05TVCkmJih0Jk5RKSE9Q0hBUiYmKHQmTlEpIT1TSE9SVCl7CisgICAgICBldmFsX2NvbnN0KCZtLT5xMi52YWwsdCk7CisgICAgICBpZih6bWVxdG8odm1heCxsMnptKDBMKSkmJnpsZGVxdG8odmxkb3VibGUsZDJ6bGQoMC4wKSkpeworICAgICAgICBtLT5xMi5mbGFncz0wO20tPmNvZGU9Yz1URVNUOworICAgICAgfQorICAgIH0KKyAgICBpZigodCZOUSk8PUxMT05HJiYobS0+cTIuZmxhZ3MmS09OU1QpJiYodCZOUSk8PUxMT05HJiYoYz09TVVMVHx8KChjPT1ESVZ8fGM9PU1PRCkmJih0JlVOU0lHTkVEKSkpKXsKKyAgICAgIGV2YWxfY29uc3QoJm0tPnEyLnZhbCx0KTsKKyAgICAgIGk9cG9mMih2bWF4KTsKKyAgICAgIGlmKGkpeworICAgICAgICBpZihjPT1NT0QpeworICAgICAgICAgIHZtYXg9em1zdWIodm1heCxsMnptKDFMKSk7CisgICAgICAgICAgbS0+Y29kZT1BTkQ7CisgICAgICAgIH1lbHNleworICAgICAgICAgIHZtYXg9bDJ6bShpLTEpOworICAgICAgICAgIGlmKGM9PURJVikgbS0+Y29kZT1SU0hJRlQ7IGVsc2UgbS0+Y29kZT1MU0hJRlQ7CisgICAgICAgIH0KKyAgICAgICAgYz1tLT5jb2RlOworCWd2YWwudm1heD12bWF4OworCWV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKKwlpZihjPT1BTkQpeworCSAgaW5zZXJ0X2NvbnN0KCZtLT5xMi52YWwsdCk7CisJfWVsc2V7CisJICBpbnNlcnRfY29uc3QoJm0tPnEyLnZhbCxJTlQpOworCSAgbS0+dHlwZjI9SU5UOworCX0KKyAgICAgIH0KKyAgICB9CisgICAgaWYoYWRkYnVmPDE2KXsKKyAgICAgIGlmKChxMXR5cChtKSZOUSk9PUxMT05HJiYoYz09TVVMVHx8Yz09RElWfHxjPT1NT0R8fGM9PUxTSElGVHx8Yz09UlNISUZUKSkge2FkZGJ1Zj0xNjtmdW5jdGlvbl9jYWxscysrO30KKyAgICAgIGlmKGM9PUNPTlZFUlQmJihxMXR5cChtKSZOUSk9PUxMT05HJiZJU0ZMT0FUKHp0eXAobSkmTlEpKXthZGRidWY9MTY7ZnVuY3Rpb25fY2FsbHMrKzt9CisgICAgICBpZihjPT1DT05WRVJUJiYoenR5cChtKSZOUSk9PUxMT05HJiZJU0ZMT0FUKHExdHlwKG0pJk5RKSl7YWRkYnVmPTE2O2Z1bmN0aW9uX2NhbGxzKys7fQorICAgICAgaWYoYWRkYnVmPDgpeworCWlmKGM9PUNPTlZFUlQmJklTRkxPQVQobS0+dHlwZjIpJiYhSVNGTE9BVCh0KSkgYWRkYnVmPTg7CisJaWYoYz09Q09OVkVSVCYmIUlTRkxPQVQobS0+dHlwZjIpJiZJU0ZMT0FUKHQpKSBhZGRidWY9ODsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoYz09Q0FMTCYmbWF4cHVzaGVkPHptMmwobS0+cTIudmFsLnZtYXgpKSBtYXhwdXNoZWQ9em0ybChtLT5xMi52YWwudm1heCk7CisgICAgaWYoYz09Q0FMTCYmKG0tPnExLmZsYWdzJlZBUikmJiFzdHJjbXAobS0+cTEudi0+aWRlbnRpZmllciwiX192YV9zdGFydCIpKSB2YXJhcmdzPTE7CisgIH0KKyAgb25jZT10d2ljZT0wOworICBpZighKGdfZmxhZ3NbOV0mVVNFREZMQUcpKSBwZWVwaG9sZShwKTsKKyAgaWYodmFyYXJncyl7CisgICAgZml4ZWRncHI9Zml4ZWRmcHI9MDsKKyAgICBpZighZnJldHVybih2LT52dHlwLT5uZXh0KSkgZml4ZWRncHIrKzsKKyAgICBmb3IoaT0wO2k8di0+dnR5cC0+ZXhhY3QtPmNvdW50O2krKyl7CisgICAgICBjPSgqdi0+dnR5cC0+ZXhhY3QtPnNsKVtpXS5zdHlwLT5mbGFncyZOUTsKKyAgICAgIGlmKGZpeGVkZ3ByPDgmJihjPT1QT0lOVEVSfHxjPD1MT05HKSkKKwlmaXhlZGdwcisrOworICAgICAgZWxzZSBpZihmaXhlZGdwcjw3JiZjPT1MTE9ORykKKwlmaXhlZGdwcj0oZml4ZWRncHIrMykvMioyOworICAgICAgZWxzZSBpZihmaXhlZGZwcjw4JiZJU0ZMT0FUKGMpKSAKKwlmaXhlZGZwcisrOworICAgICAgZWxzZXsKKwkKKwl2cGFybW9zKz16bTJsKHN6b2YoKCp2LT52dHlwLT5leGFjdC0+c2wpW2ldLnN0eXApKTsKKwl2cGFybW9zPSh2cGFybW9zK3ptMmwoc3RhY2thbGlnbiktMSkvem0ybChzdGFja2FsaWduKSp6bTJsKHN0YWNrYWxpZ24pOworICAgICAgfQorICAgIH0KKyAgICByZWdiYXNlPW9mOworICAgIGFkZGJ1Zis9OTY7CisgIH0KKyAgZm9yKGM9MTtjPD1NQVhSO2MrKyl7CisgICAgaWYoKCFyZWdzYVtjXSkmJnJlZ3VzZWRbY10peworICAgICAgQlNFVChyZWdzX21vZGlmaWVkLGMpOworICAgIH0KKyAgfQorICBvZis9YWRkYnVmO3RtcG9mZj1taW5mcmFtZSttYXhwdXNoZWQrb2Y7CisgIGZ1bmN0aW9uX3RvcChmLHYsb2YpOworICBhbGxfcmVncz0xOworICBpZih2YXJhcmdzKXsKKyAgICByZWdiYXNlPWZyYW1lb2Zmc2V0K3JlZ2Jhc2U7CisgICAgZnBwPSIiOworICAgIGlmKCEoZ19mbGFnc1s4XSZVU0VERkxBRykpIGZwcD0iciI7CisgICAgZm9yKGk9Zml4ZWRncHI7aTw4O2krKykKKyAgICAgIGVtaXQoZiwiXHRzdHdcdCVzJWQsJWxkKCVzKVxuIixmcHAsaSszLHJlZ2Jhc2UraSo0LG1yZWduYW1lc1tzcF0pOworICAgIGlmKCEoZ19mbGFnc1s4XSZVU0VERkxBRykpIGZwcD0iZiI7CisgICAgZm9yKGk9Zml4ZWRmcHI7aTw4O2krKykKKyAgICAgIGVtaXQoZiwiXHRzdGZkXHQlcyVkLCVsZCglcylcbiIsZnBwLGkrMSxyZWdiYXNlKzMyK2kqOCxtcmVnbmFtZXNbc3BdKTsKKyAgfQorICBwdXNoZWQ9MDtjY3NldD0wOworICBmb3IoO3A7cHIoZixwKSxwPXAtPm5leHQpeworICAgIGM9cC0+Y29kZTt0PXAtPnR5cGY7CisgICAgc2V0Y2M9cC0+ZXh0LnNldGNjOworICAgIGlmKGRlYnVnX2luZm8pCisgICAgICBkd2FyZjJfbGluZV9pbmZvKGYscCk7CisgICAgaWYoYz09Tk9QKSB7cC0+ei5mbGFncz0wO2NvbnRpbnVlO30KKyAgICBpZihjPT1BTExPQ1JFRyl7CisgICAgICBhbGxvY3JlZyhwLT5xMS5yZWcpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PUZSRUVSRUcpeworICAgICAgZnJlZXJlZyhwLT5xMS5yZWcpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PUNPTVBBUkUmJihwLT5xMi5mbGFncyZLT05TVCkmJih0Jk5RKSE9TExPTkcpeworICAgICAgc3RydWN0IGNhc2VfdGFibGUgKmN0PWNhbGNfY2FzZV90YWJsZShwLEpVTVBfVEFCTEVfREVOU0lUWSk7CisgICAgICBpZihjdCYmKGN0LT5udW0+PUpVTVBfVEFCTEVfTEVOR1RIfHwoIWlzcmVnKHExKSYmY3QtPm51bT49SlVNUF9UQUJMRV9MRU5HVEgvMikpKXsKKwlpbnQgcixkZWZsLHRhYmw9KytsYWJlbDsKKwlsb25nIGw7dW5zaWduZWQgbG9uZyB1bDsKKwlzdHJ1Y3QgSUMgKm5wOworCWZvcihucD1wO25wIT1jdC0+bmV4dF9pYztucD1ucC0+bmV4dCl7CisJICBpZihucC0+Y29kZT09QUxMT0NSRUcpIGFsbG9jcmVnKG5wLT5xMS5yZWcpOworCSAgaWYobnAtPmNvZGU9PUZSRUVSRUcpIGZyZWVyZWcobnAtPnExLnJlZyk7CisJfQorCWlmKGN0LT5uZXh0X2ljLT5jb2RlPT1CUkEpCisJICBkZWZsPWN0LT5uZXh0X2ljLT50eXBmOworCWVsc2UKKwkgIGRlZmw9KytsYWJlbDsKKwlpZighaXNyZWcocTEpKXsKKwkgIGlmKCFwLT5xMS5hbSYmKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1EUkVGT0JKKXsKKwkgICAgcC0+cTEuZmxhZ3MmPX5EUkVGT0JKOworCSAgICBsb2FkX3JlZyhmLHQxLCZwLT5xMSxQT0lOVEVSLHQxKTsKKwkgICAgcC0+cTEuZmxhZ3N8PShSRUd8RFJFRk9CSik7CisJICAgIHAtPnExLmZsYWdzJj1+VkFSOworCSAgICBwLT5xMS5yZWc9dDE7CisJICB9CisJICBsb2FkX3JlZyhmLHQyLCZwLT5xMSxwLT50eXBmLHQxKTsKKwkgIHI9dDI7CisJfWVsc2UKKwkgIHI9cC0+cTEucmVnOworCWlmKHQmVU5TSUdORUQpCisJICBsPS0obG9uZyl6dW0ydWwoY3QtPm1pbi52dW1heCk7CisJZWxzZQorCSAgbD0tem0ybChjdC0+bWluLnZtYXgpOworCWlmKGw+PS0zMjc2NyYmbDw9MzI3NjcpeworCSAgZW1pdChmLCJcdGFkZGlcdCVzLCVzLCVsZFxuIixtcmVnbmFtZXNbdDJdLG1yZWduYW1lc1tyXSxsKTsKKwl9ZWxzZXsKKwkgIGVtaXQoZiwiXHRhZGRpc1x0JXMsJXMsJWxkXG4iLG1yZWduYW1lc1t0Ml0sbXJlZ25hbWVzW3JdLGhpKGwpKTsKKwkgIGlmKGxvKGwpKQorCSAgICBlbWl0KGYsIlx0YWRkaVx0JXMsJXMsJWxkXG4iLG1yZWduYW1lc1t0Ml0sbXJlZ25hbWVzW3QyXSxsbyhsKSk7CisJfQorCXVsPXp1bTJ1bChjdC0+ZGlmZik7CisJaWYocmVnc1tjcjBdKSBpZXJyb3IoMCk7CisJaWYodWw8PTY1NTM1KXsKKwkgIGVtaXQoZiwiXHRjbXBsd2lcdCVzLCVsdVxuIixtcmVnbmFtZXNbdDJdLHVsKTsKKwl9ZWxzZXsKKwkgIGVtaXQoZiwiXHRsaXNcdCVzLCVsZFxuIixtcmVnbmFtZXNbdDFdLGhpKHVsKSk7CisJICBpZihsbyh1bCkpCisJICAgIGVtaXQoZiwiXHRhZGRpXHQlcywlcywlbGRcbiIsbXJlZ25hbWVzW3QxXSxyZWduYW1lc1t0MV0sbG8odWwpKTsKKwl9CisJZW1pdChmLCJcdGJndFx0JXMsJXMlZFxuIixtcmVnbmFtZXNbY3IwXSxsYWJwcmVmaXgsZGVmbCk7CisJZW1pdChmLCJcdHNsd2lcdCVzLCVzLDJcbiIsbXJlZ25hbWVzW3QyXSxtcmVnbmFtZXNbdDJdKTsKKwkvKkZJWE1FOiBzbWFsbC1kYXRhICovCisJaWYoUE9XRVJPUEVOKXsKKwkgIGVtaXQoZiwiXHRsd3pcdCVzLCVzJXMlZCglcylcbiIsbXJlZ25hbWVzW3QxXSx0b2NwcmVmaXgsbGFicHJlZml4LHRhYmwsbXJlZ25hbWVzW3IyXSk7CisJfWVsc2V7CisJICBlbWl0KGYsIlx0bGlzXHQlcywlcyVkQGhhXG4iLG1yZWduYW1lc1t0MV0sbGFicHJlZml4LHRhYmwpOworCSAgZW1pdChmLCJcdGFkZGlcdCVzLCVzLCVzJWRAbFxuIixtcmVnbmFtZXNbdDFdLG1yZWduYW1lc1t0MV0sbGFicHJlZml4LHRhYmwpOworCX0KKwllbWl0KGYsIlx0bHd6eFx0JXMsJXMsJXNcbiIsbXJlZ25hbWVzW3QyXSxtcmVnbmFtZXNbdDFdLG1yZWduYW1lc1t0Ml0pOworCWVtaXQoZiwiXHRtdGN0clx0JXNcbiIsbXJlZ25hbWVzW3QyXSk7CisJZW1pdChmLCJcdGJjdHJcbiIpOworCUJTRVQocmVnc19tb2RpZmllZCxjdHIpOworCWlmKFBPV0VST1BFTil7CisJICBlbWl0KGYsdG9jbmFtZSk7CisJICBlbWl0KGYsIiVzJXMlZDpcbiIsdG9jcHJlZml4LGxhYnByZWZpeCx0YWJsKTsKKwkgIGVtaXQoZiwiXHQubG9uZ1x0JXMlZFxuIixsYWJwcmVmaXgsdGFibCk7CisJfQorCWVtaXQoZixyb2RhdGFuYW1lKTsKKwllbWl0KGYsIlx0LmFsaWduXHQyXG4iKTsKKwllbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCx0YWJsKTsKKwllbWl0X2p1bXBfdGFibGUoZixjdCwiXHQubG9uZ1x0IixsYWJwcmVmaXgsZGVmbCk7CisJaWYoIXNwZWNpYWxfc2VjdGlvbihmLHYpKSBlbWl0KGYsY29kZW5hbWUpOworCWlmKGN0LT5uZXh0X2ljLT5jb2RlIT1CUkEpeworCSAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsZGVmbCk7CisJICBwPWN0LT5uZXh0X2ljLT5wcmV2OworCX1lbHNlCisJICBwPWN0LT5uZXh0X2ljOworCWNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgICBpZihjPT1MQUJFTCkge2Njc2V0PTA7ZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsdCk7Y29udGludWU7fQorICAgIGlmKGM9PUJSQSl7CisgICAgICBjY3NldD0wOworICAgICAgaWYodD09ZXhpdF9sYWJlbCYmZnJhbWVzaXplPT0wKQorCWVtaXQoZixyZXQpOworICAgICAgZWxzZQorCWVtaXQoZiwiXHRiXHQlcyVkXG4iLGxhYnByZWZpeCx0KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPj1CRVEmJmM8QlJBKXsKKyAgICAgIGNjc2V0PTA7CisgICAgICBpZighKHAtPnExLmZsYWdzJlJFRykpIHAtPnExLnJlZz1jcjA7CisgICAgICBpZighKGdfZmxhZ3NbOV0mVVNFREZMQUcpJiYhQlRTVCh0d2ljZSxwLT50eXBmLWxhc3RsYWJlbCkpeworICAgICAgICBzdHJ1Y3QgSUMgKnAyLCpwMywqcDQ7aW50IGV4aXRfbGFiZWw7CisgICAgICAgIHAyPXAtPm5leHQ7CisgICAgICAgIHdoaWxlKHAyJiYocDItPmNvZGU9PUZSRUVSRUd8fHAyLT5jb2RlPT1BTExPQ1JFRykpIHAyPXAyLT5uZXh0OworICAgICAgICBpZihwMiYmcDItPmNvZGU9PVNFVFJFVFVSTiYmcDItPnoucmVnKXtwMi0+Y29kZT1BU1NJR047cDItPnouZmxhZ3M9UkVHO30KKyAgICAgICAgaWYocDImJnAyLT5jb2RlPT1BU1NJR04mJihwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+ei5yZWc8PTMyKXsKKyAgICAgICAgICBwMz1wMi0+bmV4dDsKKyAgICAgICAgICB3aGlsZShwMyYmKHAzLT5jb2RlPT1GUkVFUkVHfHxwMy0+Y29kZT09QUxMT0NSRUcpKSBwMz1wMy0+bmV4dDsKKyAgICAgICAgICBpZihwMyYmcDMtPmNvZGU9PUJSQSl7CisgICAgICAgICAgICBleGl0X2xhYmVsPXAzLT50eXBmOworICAgICAgICAgICAgcDM9cDMtPm5leHQ7CisgICAgICAgICAgICB3aGlsZShwMyYmKHAzLT5jb2RlPT1GUkVFUkVHfHxwMy0+Y29kZT09QUxMT0NSRUcpKSBwMz1wMy0+bmV4dDsKKyAgICAgICAgICAgIGlmKHAzJiZwMy0+Y29kZT09TEFCRUwmJnAzLT50eXBmPT1wLT50eXBmKXsKKyAgICAgICAgICAgICAgcDM9cDMtPm5leHQ7CisgICAgICAgICAgICAgIHdoaWxlKHAzJiYocDMtPmNvZGU9PUZSRUVSRUd8fHAzLT5jb2RlPT1BTExPQ1JFRykpIHAzPXAzLT5uZXh0OworICAgICAgICAgICAgICBpZihwMyYmcDMtPmNvZGU9PVNFVFJFVFVSTiYmcDMtPnoucmVnKXtwMy0+Y29kZT1BU1NJR047cDMtPnouZmxhZ3M9UkVHO30KKyAgICAgICAgICAgICAgaWYocDMmJnAzLT5jb2RlPT1BU1NJR04mJihwMy0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMy0+ei5yZWc9PXAyLT56LnJlZyl7CisgICAgICAgICAgICAgICAgcDQ9cDMtPm5leHQ7CisgICAgICAgICAgICAgICAgd2hpbGUocDQmJihwNC0+Y29kZT09RlJFRVJFR3x8cDQtPmNvZGU9PUFMTE9DUkVHKSkgcDQ9cDQtPm5leHQ7CisgICAgICAgICAgICAgICAgaWYocDQmJnA0LT5jb2RlPT1MQUJFTCYmcDQtPnR5cGY9PWV4aXRfbGFiZWwpeworICAgICAgICAgICAgICAgICAgaW50IGJpdD0ocC0+cTEucmVnLWNyMCkqNDsKKyAgICAgICAgICAgICAgICAgIGlmKChwMi0+cTEuZmxhZ3MmS09OU1QpJiYocDMtPnExLmZsYWdzJktPTlNUKSl7CisgICAgICAgICAgICAgICAgICAgIGV2YWxfY29uc3QoJnAyLT5xMS52YWwscDItPnR5cGYpOworICAgICAgICAgICAgICAgICAgICBpZih6bWVxdG8odm1heCxsMnptKDBMKSkpeworICAgICAgICAgICAgICAgICAgICAgIGV2YWxfY29uc3QoJnAzLT5xMS52YWwscDMtPnR5cGYpOworICAgICAgICAgICAgICAgICAgICAgIGlmKHptZXF0byh2bWF4LGwyem0oMUwpKXx8em1lcXRvKHZtYXgsbDJ6bSgtMUwpKSl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT1CTEUpe2VtaXQoZiwiXHRjcm9yXHQlZCwlZCwlZFxuIixiaXQsYml0LGJpdCsyKTt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT1CR0Upe2JpdCsrO2VtaXQoZiwiXHRjcm9yXHQlZCwlZCwlZFxuIixiaXQsYml0LGJpdCsxKTt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT1CTkUpe2JpdCs9MjtlbWl0KGYsIlx0Y3Jub3JcdCVkLCVkLCVkXG4iLGJpdCxiaXQsYml0KTt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT1CR1QpIGJpdCsrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09QkVRKSBiaXQrPTI7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsIlx0bWZjclx0JXNcbiIsbXJlZ25hbWVzW3QxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbWl0KGYsIlx0cmx3aW5tXHQlcywlcywlZCwlZCwlZFxuIixtcmVnbmFtZXNbcDItPnoucmVnXSxtcmVnbmFtZXNbdDFdLGJpdCsxLDMxLDMxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHptZXF0byh2bWF4LGwyem0oLTFMKSkpIGVtaXQoZiwiXHRuZWdcdCVzLCVzXG4iLG1yZWduYW1lc1twMi0+ei5yZWddLG1yZWduYW1lc1twMi0+ei5yZWddKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKEJUU1QodHdpY2UscDQtPnR5cGYtbGFzdGxhYmVsKSkgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgscDQtPnR5cGYpOworICAgICAgICAgICAgICAgICAgICAgICAgcD1wNDtjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgIGV2YWxfY29uc3QoJnAzLT5xMS52YWwscDMtPnR5cGYpOworICAgICAgICAgICAgICAgICAgICAgIGlmKHptZXF0byh2bWF4LGwyem0oMEwpKSl7CisgICAgICAgICAgICAgICAgICAgICAgICBldmFsX2NvbnN0KCZwMi0+cTEudmFsLHAyLT50eXBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHptZXF0byh2bWF4LGwyem0oMUwpKXx8em1lcXRvKHZtYXgsbDJ6bSgtMUwpKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PUJMRSl7ZW1pdChmLCJcdGNybm9yXHQlZCwlZCwlZFxuIixiaXQsYml0LGJpdCsyKTt9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PUJHRSl7Yml0Kys7ZW1pdChmLCJcdGNybm9yXHQlZCwlZCwlZFxuIixiaXQsYml0LGJpdCsxKTt9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PUJORSl7Yml0Kz0yO30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09QkdUKXtiaXQrKztlbWl0KGYsIlx0Y3Jub3JcdCVkLCVkLCVkXG4iLGJpdCxiaXQsYml0KTt9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PUJFUSl7Yml0Kz0yO2VtaXQoZiwiXHRjcm5vclx0JWQsJWQsJWRcbiIsYml0LGJpdCxiaXQpO30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09QkxUKXtlbWl0KGYsIlx0Y3Jub3JcdCVkLCVkLCVkXG4iLGJpdCxiaXQsYml0KTt9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQoZiwiXHRtZmNyXHQlc1xuIixtcmVnbmFtZXNbdDFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdChmLCJcdHJsd2lubVx0JXMsJXMsJWQsJWQsJWRcbiIsbXJlZ25hbWVzW3AyLT56LnJlZ10sbXJlZ25hbWVzW3QxXSxiaXQrMSwzMSwzMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHptZXF0byh2bWF4LGwyem0oLTFMKSkpIGVtaXQoZiwiXHRuZWdcdCVzLCVzXG4iLG1yZWduYW1lc1twMi0+ei5yZWddLG1yZWduYW1lc1twMi0+ei5yZWddKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQlRTVCh0d2ljZSxwNC0+dHlwZi1sYXN0bGFiZWwpKSBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxwNC0+dHlwZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHA9cDQ7Y29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZih0PT1leGl0X2xhYmVsJiZmcmFtZXNpemU9PTAmJiFzdHJjbXAocmV0LCJcdGJsclxuIikpCisJZW1pdChmLCJcdGIlc2xyXHQlc1xuIixjY3NbYy1CRVFdLG1yZWduYW1lc1twLT5xMS5yZWddKTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIlx0YiVzXHQlcywlcyVkXG4iLGNjc1tjLUJFUV0sbXJlZ25hbWVzW3AtPnExLnJlZ10sbGFicHJlZml4LHQpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PU1PVkVUT1JFRyl7CisgICAgICBpZihwLT56LnJlZzw9MzIpeworICAgICAgICBsb2FkX3JlZyhmLHAtPnoucmVnLCZwLT5xMSxJTlQsdDEpOworICAgICAgfWVsc2UgaWYocC0+ei5yZWc+PTMzJiZwLT56LnJlZzw9NjQpeworICAgICAgICBsb2FkX3JlZyhmLHAtPnoucmVnLCZwLT5xMSxET1VCTEUsdDEpOworICAgICAgfWVsc2UgaWYocmVnX3BhaXIocC0+ei5yZWcsJnJwKSl7CisJY3JlYXRlX2xvYWRhYmxlKGYsJnAtPnExLHQxKTsKKwlsb2FkX2h3b3JkKGYscnAucjEsJnAtPnExLExMT05HLHQyKTsKKwlsb2FkX2x3b3JkKGYscnAucjIsJnAtPnExLExMT05HLHQyKTsKKyAgICAgIH1lbHNlCisJaWVycm9yKDApOworICAgICAgcC0+ei5mbGFncz0wOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PU1PVkVGUk9NUkVHKXsKKyAgICAgIGlmKHAtPnExLnJlZzw9MzIpeworICAgICAgICBzdG9yZV9yZWcoZixwLT5xMS5yZWcsJnAtPnosSU5UKTsKKyAgICAgIH1lbHNlIGlmKHAtPnExLnJlZz49MzMmJnAtPnExLnJlZzw9NjQpeworICAgICAgICBzdG9yZV9yZWcoZixwLT5xMS5yZWcsJnAtPnosRE9VQkxFKTsKKyAgICAgIH1lbHNlIGlmKHJlZ19wYWlyKHAtPnExLnJlZywmcnApKXsKKwljcmVhdGVfbG9hZGFibGUoZiwmcC0+eix0MSk7CisJc3RvcmVfaHdvcmQoZixycC5yMSwmcC0+eik7CisJc3RvcmVfbHdvcmQoZixycC5yMiwmcC0+eik7CisgICAgICB9ZWxzZQorCWllcnJvcigwKTsKKyAgICAgIHAtPnouZmxhZ3M9MDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZigocC0+cTEuZmxhZ3MmJihxMXR5cChwKSZOUSk9PUxMT05HKXx8KHAtPnEyLmZsYWdzJiYocTJ0eXAocCkmTlEpPT1MTE9ORyl8fChwLT56LmZsYWdzJiYoenR5cChwKSZOUSk9PUxMT05HKSkKKyAgICAgIGlmKGhhbmRsZV9sbG9uZyhmLHApKQorCWNvbnRpbnVlOworICAgIGlmKChjPT1BU1NJR058fGM9PVBVU0gpJiYoKHQmTlEpPlBPSU5URVJ8fCgodCZOUSk9PUNIQVImJnptMmwocC0+cTIudmFsLnZtYXgpIT0xKSkpeworICAgICAgdW5zaWduZWQgbG9uZyBzaXplLGw7CisgICAgICBpbnQgYTEsYTIsYjtjaGFyICpsZCwqc3Q7CisgICAgICBzaXplPXptMmwocC0+cTIudmFsLnZtYXgpOworICAgICAgYTE9YmFsaWduKCZwLT5xMSk7CisgICAgICBpZihjPT1BU1NJR04pIGEyPWJhbGlnbigmcC0+eik7IGVsc2UgYTI9MDsKKyAgICAgIGI9MTtsZD1sZHQoQ0hBUik7c3Q9c2R0KENIQVIpOworICAgICAgaWYocC0+cTEuZmxhZ3MmVkFSKXsKKwlpZihwLT5xMS5mbGFncyZEUkVGT0JKKXsKKwkgIGlmKHAtPnExLnYtPnZ0eXAtPm5leHQmJnptZXF0byhwLT5xMi52YWwudm1heCxzem9mKHAtPnExLnYtPnZ0eXAtPm5leHQpKSYmKGExJjEpKXsKKwkgICAgYTE9em0ybChmYWxpZ24ocC0+cTEudi0+dnR5cC0+bmV4dCkpJjM7CisJICAgIGEyJj1hMTsKKwkgIH0KKwl9ZWxzZXsKKwkgIGlmKHptZXF0byhwLT5xMi52YWwudm1heCxzem9mKHAtPnExLnYtPnZ0eXApKSYmKGExJjEpKXsKKwkgICAgYTE9em0ybChmYWxpZ24ocC0+cTEudi0+dnR5cCkpJjM7CisJICAgIGEyJj1hMTsKKwkgIH0KKwl9CisgICAgICB9CisgICAgICBpZihwLT56LmZsYWdzJlZBUil7CisJaWYocC0+ei5mbGFncyZEUkVGT0JKKXsKKwkgIGlmKHAtPnoudi0+dnR5cC0+bmV4dCYmem1lcXRvKHAtPnEyLnZhbC52bWF4LHN6b2YocC0+ei52LT52dHlwLT5uZXh0KSkmJihhMiYxKSl7CisJICAgIGEyPXptMmwoZmFsaWduKHAtPnoudi0+dnR5cC0+bmV4dCkpJjM7CisJICAgIGExJj1hMjsKKwkgIH0KKwl9ZWxzZXsKKwkgIGlmKHptZXF0byhwLT5xMi52YWwudm1heCxzem9mKHAtPnoudi0+dnR5cCkpJiYoYTImMSkpeworCSAgICBhMj16bTJsKGZhbGlnbihwLT56LnYtPnZ0eXApKSYzOworCSAgICBhMSY9YTI7CisJICB9CisJfQorICAgICAgfSAKKyAgICAgIGlmKGExPj0wJiZhMj49MCl7CisgICAgICAgIGlmKGExPT0wJiZhMj09MCl7CisgICAgICAgICAgYj00O2xkPWxkdChJTlQpO3N0PXNkdChJTlQpOworICAgICAgICB9ZWxzZSBpZigoYTEmMSk9PTAmJihhMiYxKT09MCl7CisgICAgICAgICAgYj0yO2xkPWxkdChTSE9SVCk7c3Q9c2R0KFNIT1JUKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYocC0+cTEuZmxhZ3MmRFJFRk9CSil7CisgICAgICAgIGlmKHAtPnExLmFtKXsKKyAgICAgICAgICBpZihwLT5xMS5hbS0+ZmxhZ3MmUkVHX0lORCl7CisJICAgIGVtaXQoZiwiXHRhZGRcdCVzLCVzLCVzXG4iLG1yZWduYW1lc1t0MV0sbXJlZ25hbWVzW3AtPnExLmFtLT5vZmZzZXRdLG1yZWduYW1lc1twLT5xMS5hbS0+YmFzZV0pOworCSAgICBlbWl0KGYsIlx0YWRkaVx0JXMsJXMsJWRcbiIsbXJlZ25hbWVzW3QxXSxtcmVnbmFtZXNbdDFdLC1iKTsKKwkgIH0KKyAgICAgICAgICBpZihwLT5xMS5hbS0+ZmxhZ3MmSU1NX0lORCkKKwkgICAgZW1pdChmLCJcdGFkZGlcdCVzLCVzLCVsZFxuIixtcmVnbmFtZXNbdDFdLG1yZWduYW1lc1twLT5xMS5hbS0+YmFzZV0scC0+cTEuYW0tPm9mZnNldC1iKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgcC0+cTEuZmxhZ3MmPX5EUkVGT0JKOworCSAgaWYoaXNyZWcocTEpKXsKKwkgICAgZW1pdChmLCJcdGFkZGlcdCVzLCVzLCVkXG4iLG1yZWduYW1lc1t0MV0sbXJlZ25hbWVzW3AtPnExLnJlZ10sLWIpOworCSAgfWVsc2V7CisJICAgIGxvYWRfcmVnKGYsdDEsJnAtPnExLFBPSU5URVIsdDEpOworCSAgICBlbWl0KGYsIlx0YWRkaVx0JXMsJXMsJWRcbiIsbXJlZ25hbWVzW3QxXSxtcmVnbmFtZXNbdDFdLC1iKTsKKwkgIH0gICAgCisgICAgICAgICAgcC0+cTEuZmxhZ3N8PURSRUZPQko7CisgICAgICAgIH0KKyAgICAgIH1lbHNleworCXAtPnExLnZhbC52bWF4PXptc3ViKHAtPnExLnZhbC52bWF4LGwyem0oKGxvbmcpYikpOworICAgICAgICBsb2FkX2FkZHJlc3MoZix0MSwmcC0+cTEsUE9JTlRFUik7CisJcC0+cTEudmFsLnZtYXg9em1hZGQocC0+cTEudmFsLnZtYXgsbDJ6bSgobG9uZyliKSk7CisgICAgICB9CisgICAgICBpZihwLT56LmZsYWdzJkRSRUZPQkopeworICAgICAgICBpZihwLT56LmFtKXsKKyAgICAgICAgICBpZihwLT56LmFtLT5mbGFncyZSRUdfSU5EKXsKKwkgICAgZW1pdChmLCJcdGFkZFx0JXMsJXMsJXNcbiIsbXJlZ25hbWVzW3QyXSxtcmVnbmFtZXNbcC0+ei5hbS0+b2Zmc2V0XSxtcmVnbmFtZXNbcC0+ei5hbS0+YmFzZV0pOworCSAgICBlbWl0KGYsIlx0YWRkaVx0JXMsJXMsJWRcbiIsbXJlZ25hbWVzW3QyXSxtcmVnbmFtZXNbdDJdLC1iKTsKKwkgIH0KKyAgICAgICAgICBpZihwLT56LmFtLT5mbGFncyZJTU1fSU5EKSAKKwkgICAgZW1pdChmLCJcdGFkZGlcdCVzLCVzLCVsZFxuIixtcmVnbmFtZXNbdDJdLG1yZWduYW1lc1twLT56LmFtLT5iYXNlXSxwLT56LmFtLT5vZmZzZXQtYik7CisgICAgICAgIH1lbHNleworICAgICAgICAgIHAtPnouZmxhZ3MmPX5EUkVGT0JKOworCSAgaWYoaXNyZWcoeikpeworCSAgICBlbWl0KGYsIlx0YWRkaVx0JXMsJXMsJWRcbiIsbXJlZ25hbWVzW3QyXSxtcmVnbmFtZXNbcC0+ei5yZWddLC1iKTsKKwkgIH1lbHNleworCSAgICBsb2FkX3JlZyhmLHQyLCZwLT56LFBPSU5URVIsdDIpOworCSAgICBlbWl0KGYsIlx0YWRkaVx0JXMsJXMsJWRcbiIsbXJlZ25hbWVzW3QyXSxtcmVnbmFtZXNbdDJdLC1iKTsKKwkgIH0KKyAgICAgICAgICBwLT56LmZsYWdzfD1EUkVGT0JKOworICAgICAgICB9CisgICAgICB9ZWxzZXsKKyAgICAgICAgaWYoYz09UFVTSCl7CisgICAgICAgICAgcHVzaGVkPShwdXNoZWQrMykvNCo0OworCSAgaWYoYWxpZ25fYXJndW1lbnRzJiZwLT5pdHlwKXsKKwkgICAgbG9uZyBhbD1mYWxpZ24ocC0+aXR5cCk7CisJICAgIHB1c2hlZD0ocHVzaGVkK2FsLTEpL2FsKmFsOworCSAgfQorICAgICAgICAgIGVtaXQoZiwiXHRhZGRpXHQlcywlcywlbGRcbiIsbXJlZ25hbWVzW3QyXSxtcmVnbmFtZXNbc3BdLHB1c2hlZCttaW5mcmFtZS1iKTsKKyAgICAgICAgICBwdXNoZWQrPXNpemU7CisJICBzaXplPXptMmwocC0+ei52YWwudm1heCk7CisgICAgICAgIH1lbHNleworCSAgcC0+ei52YWwudm1heD16bXN1YihwLT56LnZhbC52bWF4LGwyem0oKGxvbmcpYikpOworICAgICAgICAgIGxvYWRfYWRkcmVzcyhmLHQyLCZwLT56LFBPSU5URVIpOworCSAgcC0+ei52YWwudm1heD16bXN1YihwLT56LnZhbC52bWF4LGwyem0oKGxvbmcpYikpOworICAgICAgICB9CisgICAgICB9CisgICAgICBCU0VUKHJlZ3NfbW9kaWZpZWQsdDEpOworICAgICAgQlNFVChyZWdzX21vZGlmaWVkLHQyKTsKKyAgICAgIEJTRVQocmVnc19tb2RpZmllZCx0Myk7CisgICAgICBpZihvcHRzcGVlZCkKKwlsPXNpemUvKDgqYik7CisgICAgICBlbHNlCisJbD1zaXplL2I7CisgICAgICBpZihsPjEpeworICAgICAgICBpZihoaShsKSl7CisJICBlbWl0KGYsIlx0bGlzXHQlcywlbHVcbiIsbXJlZ25hbWVzW3QzXSwobD4+MTYpJjY1NTM1KTsKKwkgIGVtaXQoZiwiXHRvcmlcdCVzLCVzLCVsdVxuIixtcmVnbmFtZXNbdDNdLG1yZWduYW1lc1t0M10sbCY2NTUzNSk7CisJfWVsc2V7CisJICBlbWl0KGYsIlx0bGlcdCVzLCVsZFxuIixtcmVnbmFtZXNbdDNdLGxvKGwpKTsKKwl9CisgICAgICAgIGVtaXQoZiwiXHRtdGN0clx0JXNcbiIsbXJlZ25hbWVzW3QzXSk7CisJQlNFVChyZWdzX21vZGlmaWVkLGN0cik7CisgICAgICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LCsrbGFiZWwpOworICAgICAgfQorICAgICAgaWYobD4wKXsKKyAgICAgICAgZm9yKGk9YjtvcHRzcGVlZCYmaTw9NypiO2krPWIpeworICAgICAgICAgIGVtaXQoZiwiXHRsJXNcdCVzLCVkKCVzKVxuIixsZCxtcmVnbmFtZXNbdDNdLGksbXJlZ25hbWVzW3QxXSk7CisgICAgICAgICAgZW1pdChmLCJcdHN0JXNcdCVzLCVkKCVzKVxuIixzdCxtcmVnbmFtZXNbdDNdLGksbXJlZ25hbWVzW3QyXSk7CisgICAgICAgIH0KKyAgICAgICAgZW1pdChmLCJcdGwlc3VcdCVzLCVkKCVzKVxuIixsZCxtcmVnbmFtZXNbdDNdLGksbXJlZ25hbWVzW3QxXSk7CisgICAgICAgIGVtaXQoZiwiXHRzdCVzdVx0JXMsJWQoJXMpXG4iLHN0LG1yZWduYW1lc1t0M10saSxtcmVnbmFtZXNbdDJdKTsKKwkKKyAgICAgIH0KKyAgICAgIGlmKGw+MSl7CisgICAgICAgIGVtaXQoZiwiXHRiZG56XHQlcyVkXG4iLGxhYnByZWZpeCxsYWJlbCk7CisgICAgICB9CisgICAgICBpZihvcHRzcGVlZCkKKwlzaXplPXNpemUlKDgqYik7CisgICAgICBlbHNlCisJc2l6ZT1zaXplJWI7CisgICAgICBmb3IoaT0wO2k8c2l6ZS9iO2krKyl7CisgICAgICAgIGVtaXQoZiwiXHRsJXN1XHQlcywlZCglcylcbiIsbGQsbXJlZ25hbWVzW3QzXSxiLG1yZWduYW1lc1t0MV0pOworICAgICAgICBlbWl0KGYsIlx0c3Qlc3VcdCVzLCVkKCVzKVxuIixzdCxtcmVnbmFtZXNbdDNdLGIsbXJlZ25hbWVzW3QyXSk7CisgICAgICB9CisgICAgICBzaXplPXNpemUlYjtpPWI7CisgICAgICBpZihzaXplJjIpeworICAgICAgICBlbWl0KGYsIlx0bCVzdVx0JXMsJWQoJXMpXG4iLGxkdChTSE9SVCksbXJlZ25hbWVzW3QzXSxiLG1yZWduYW1lc1t0MV0pOworICAgICAgICBlbWl0KGYsIlx0c3Qlc3VcdCVzLCVkKCVzKVxuIixzZHQoU0hPUlQpLG1yZWduYW1lc1t0M10sYixtcmVnbmFtZXNbdDJdKTsKKyAgICAgICAgaT0yOworICAgICAgfQorICAgICAgaWYoc2l6ZSYxKXsKKyAgICAgICAgZW1pdChmLCJcdGwlc3VcdCVzLCVkKCVzKVxuIixsZHQoQ0hBUiksbXJlZ25hbWVzW3QzXSxpLG1yZWduYW1lc1t0MV0pOworICAgICAgICBlbWl0KGYsIlx0c3Qlc3VcdCVzLCVkKCVzKVxuIixzZHQoQ0hBUiksbXJlZ25hbWVzW3QzXSxpLG1yZWduYW1lc1t0Ml0pOworICAgICAgfQorICAgICAgcC0+ei5mbGFncz0wOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PVRFU1QmJklTRkxPQVQodCkpeworICAgICAgcC0+Y29kZT1jPUNPTVBBUkU7CisgICAgICBwLT5xMi5mbGFncz1LT05TVDsKKyAgICAgIHAtPnEyLnZhbC52bGRvdWJsZT1kMnpsZCgwLjApOworICAgICAgaWYoKHQmTlEpPT1ET1VCTEUpIHAtPnEyLnZhbC52ZG91YmxlPXpsZDJ6ZChwLT5xMi52YWwudmxkb3VibGUpOworICAgICAgaWYoKHQmTlEpPT1GTE9BVCkgcC0+cTIudmFsLnZmbG9hdD16bGQyemYocC0+cTIudmFsLnZsZG91YmxlKTsKKyAgICB9CisgICAgcD1kb19yZWZzKGYscCk7CisgICAgYz1wLT5jb2RlOworICAgIHNldGNjPXAtPmV4dC5zZXRjYzsKKyAgICBpZihjPT1TVUJQRlApIGM9U1VCOworICAgIGlmKGM9PUFEREkyUCkgYz1BREQ7CisgICAgaWYoYz09U1VCSUZQKSBjPVNVQjsKKyAgICBpZihjPT1DT05WRVJUKXsKKyAgICAgIGludCB0bzsKKyAgICAgIHN0YXRpYyBzdHJ1Y3Qgb2JqIG87Y2hhciAqaXA7CisgICAgICBsb25nIG1vZmY7aW50IG9mZnJlZzsKKyAgICAgIHRvPXAtPnR5cGYyOworICAgICAgaWYoSVNGTE9BVCh0bykpeworICAgICAgICBpZihJU0ZMT0FUKHQpKXsKKyAgICAgICAgICB6cmVnPXExcmVnOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmKHRtcG9mZj4zMjc2Nyl7CisgICAgICAgICAgbW9mZj0wO29mZnJlZz10MTsKKyAgICAgICAgICBlbWl0KGYsIlx0YWRkaXNcdCVzLCVzLCVsZFxuIixtcmVnbmFtZXNbb2ZmcmVnXSxtcmVnbmFtZXNbc3BdLGhpKHRtcG9mZikpOworICAgICAgICAgIGVtaXQoZiwiXHRhZGRpXHQlcywlcywlbGRcbiIsbXJlZ25hbWVzW29mZnJlZ10sbXJlZ25hbWVzW29mZnJlZ10sbG8odG1wb2ZmKSk7CisgICAgICAgIH1lbHNleworICAgICAgICAgIG1vZmY9dG1wb2ZmOworICAgICAgICAgIG9mZnJlZz1zcDsKKyAgICAgICAgfQorICAgICAgICBpZigodCZOVSk9PShVTlNJR05FRHxJTlQpfHwodCZOVSk9PShVTlNJR05FRHxMT05HKSl7CisgICAgICAgICAgby5mbGFncz1LT05TVDsKKyAgICAgICAgICBpcD0oY2hhciAqKSZvLnZhbC52ZG91YmxlOworICAgICAgICAgIGlwWzBdPTB4NDE7CisgICAgICAgICAgaXBbMV09MHhlMDsKKyAgICAgICAgICBpcFsyXT0weDAwOworICAgICAgICAgIGlwWzNdPTB4MDA7CisgICAgICAgICAgaXBbNF09MHgwMDsKKyAgICAgICAgICBpcFs1XT0weDAwOworICAgICAgICAgIGlwWzZdPTB4MDA7CisgICAgICAgICAgaXBbN109MHgwMDsKKyAgICAgICAgICBsb2FkX3JlZyhmLGYyLCZvLERPVUJMRSx0Mik7CisgICAgICAgICAgZW1pdChmLCJcdGZjbXB1XHQlcywlcywlc1xuIixtcmVnbmFtZXNbY3IwXSxtcmVnbmFtZXNbcTFyZWddLG1yZWduYW1lc1tmMl0pOworICAgICAgICAgIGVtaXQoZiwiXHRjcm9yXHQzLDIsMVxuIik7CisgICAgICAgICAgZW1pdChmLCJcdGJzb1x0JXMsJXMlZFxuIixtcmVnbmFtZXNbY3IwXSxsYWJwcmVmaXgsKytsYWJlbCk7CisgICAgICAgICAgZW1pdChmLCJcdGZjdGl3elx0JXMsJXNcbiIsbXJlZ25hbWVzW2YyXSxtcmVnbmFtZXNbcTFyZWddKTsKKyAgICAgICAgICBlbWl0KGYsIlx0c3Qlc1x0JXMsJWxkKCVzKVxuIixzZHQoRE9VQkxFKSxtcmVnbmFtZXNbZjJdLG1vZmYtOCxtcmVnbmFtZXNbb2ZmcmVnXSk7CisgICAgICAgICAgZW1pdChmLCJcdGwlc1x0JXMsJWxkKCVzKVxuIixsZHQodCZOUSksbXJlZ25hbWVzW3pyZWddLG1vZmYtem0ybChzaXpldGFiW3QmTlFdKSxtcmVnbmFtZXNbb2ZmcmVnXSk7CisgICAgICAgICAgZW1pdChmLCJcdGJcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworICAgICAgICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsLTEpOworICAgICAgICAgIGVtaXQoZiwiXHRmc3ViXHQlcywlcywlc1xuIixtcmVnbmFtZXNbZjJdLG1yZWduYW1lc1txMXJlZ10sbXJlZ25hbWVzW2YyXSk7CisgICAgICAgICAgZW1pdChmLCJcdGZjdGl3elx0JXMsJXNcbiIsbXJlZ25hbWVzW2YyXSxtcmVnbmFtZXNbZjJdKTsKKyAgICAgICAgICBlbWl0KGYsIlx0c3Qlc1x0JXMsJWxkKCVzKVxuIixzZHQoRE9VQkxFKSxtcmVnbmFtZXNbZjJdLG1vZmYtOCxtcmVnbmFtZXNbb2ZmcmVnXSk7CisgICAgICAgICAgZW1pdChmLCJcdGwlc1x0JXMsJWxkKCVzKVxuIixsZHQoSU5UKSxtcmVnbmFtZXNbenJlZ10sbW9mZi16bTJsKHNpemV0YWJbdCZOUV0pLG1yZWduYW1lc1tvZmZyZWddKTsKKyAgICAgICAgICBlbWl0KGYsIlx0eG9yaXNcdCVzLCVzLDMyNzY4XG4iLG1yZWduYW1lc1t6cmVnXSxtcmVnbmFtZXNbenJlZ10pOworICAgICAgICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgIEJTRVQocmVnc19tb2RpZmllZCxmMik7CisJICBCU0VUKHJlZ3NfbW9kaWZpZWQsenJlZyk7CisJICBCU0VUKHJlZ3NfbW9kaWZpZWQscTFyZWcpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICBlbWl0KGYsIlx0ZmN0aXd6XHQlcywlc1xuIixtcmVnbmFtZXNbZjNdLG1yZWduYW1lc1txMXJlZ10pOworICAgICAgICAgIGVtaXQoZiwiXHRzdCVzXHQlcywlbGQoJXMpXG4iLHNkdChET1VCTEUpLG1yZWduYW1lc1tmM10sbW9mZi04LG1yZWduYW1lc1tvZmZyZWddKTsKKyAgICAgICAgICBlbWl0KGYsIlx0bCVzXHQlcywlbGQoJXMpXG4iLGxkdCh0Jk5RKSxtcmVnbmFtZXNbenJlZ10sbW9mZi16bTJsKHNpemV0YWJbdCZOUV0pLG1yZWduYW1lc1tvZmZyZWddKTsKKwkgIEJTRVQocmVnc19tb2RpZmllZCxmMyk7CisJICBCU0VUKHJlZ3NfbW9kaWZpZWQsenJlZyk7CisJICBCU0VUKHJlZ3NfbW9kaWZpZWQscTFyZWcpOworICAgICAgICB9CisgICAgICAgIGlmKHQ9PUNIQVIpIGVtaXQoZiwiXHRleHRzYlx0JXMsJXNcbiIsbXJlZ25hbWVzW3pyZWddLG1yZWduYW1lc1t6cmVnXSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoSVNGTE9BVCh0KSl7CisgICAgICAgIGlmKHRtcG9mZj4zMjc2Nyl7CisgICAgICAgICAgbW9mZj0wO29mZnJlZz10MTsKKwkgIGlmKHExcmVnPT10MSl7CisJICAgIGVtaXQoZiwiXHRtclx0JXMsJXNcbiIsbXJlZ25hbWVzW3QzXSxtcmVnbmFtZXNbcTFyZWddKTsKKwkgICAgcTFyZWc9dDM7CisJICAgIEJTRVQocmVnc19tb2RpZmllZCx0Myk7CisJICB9CisgICAgICAgICAgZW1pdChmLCJcdGFkZGlzXHQlcywlcywlbGRcbiIsbXJlZ25hbWVzW29mZnJlZ10sbXJlZ25hbWVzW3NwXSxoaSh0bXBvZmYpKTsKKyAgICAgICAgICBlbWl0KGYsIlx0YWRkaVx0JXMsJXMsJWxkXG4iLG1yZWduYW1lc1tvZmZyZWddLG1yZWduYW1lc1tvZmZyZWddLGxvKHRtcG9mZikpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICBtb2ZmPXRtcG9mZjsKKyAgICAgICAgICBvZmZyZWc9c3A7CisgICAgICAgIH0KKyAgICAgICAgby5mbGFncz1LT05TVDsKKyAgICAgICAgaXA9KGNoYXIgKikmby52YWwudmRvdWJsZTsKKyAgICAgICAgaXBbMF09MHg0MzsKKyAgICAgICAgaXBbMV09MHgzMDsKKyAgICAgICAgaXBbMl09MHgwMDsKKyAgICAgICAgaXBbM109MHgwMDsKKyAgICAgICAgaXBbNF09MHg4MDsKKyAgICAgICAgaXBbNV09MHgwMDsKKyAgICAgICAgaXBbNl09MHgwMDsKKyAgICAgICAgaXBbN109MHgwMDsKKyAgICAgICAgaWYoKHRvJk5VKT09KFVOU0lHTkVEfElOVCl8fCh0byZOVSk9PShVTlNJR05FRHxMT05HKSl7CisgICAgICAgICAgaXBbNF09MHgwMDsKKyAgICAgICAgICBsb2FkX3JlZyhmLGYyLCZvLERPVUJMRSx0Mik7CisgICAgICAgICAgZW1pdChmLCJcdGxpc1x0JXMsMTcyMDBcbiIsbXJlZ25hbWVzW3QyXSk7CisgICAgICAgICAgZW1pdChmLCJcdHN0JXNcdCVzLCVsZCglcylcbiIsc2R0KElOVCksbXJlZ25hbWVzW3ExcmVnXSxtb2ZmLTQsbXJlZ25hbWVzW29mZnJlZ10pOworICAgICAgICAgIGVtaXQoZiwiXHRzdCVzXHQlcywlbGQoJXMpXG4iLHNkdChJTlQpLG1yZWduYW1lc1t0Ml0sbW9mZi04LG1yZWduYW1lc1tvZmZyZWddKTsKKyAgICAgICAgICBlbWl0KGYsIlx0bCVzXHQlcywlbGQoJXMpXG4iLGxkdChET1VCTEUpLG1yZWduYW1lc1t6cmVnXSxtb2ZmLTgsbXJlZ25hbWVzW29mZnJlZ10pOworICAgICAgICAgIGVtaXQoZiwiXHRmc3ViXHQlcywlcywlc1xuIixtcmVnbmFtZXNbenJlZ10sbXJlZ25hbWVzW3pyZWddLG1yZWduYW1lc1tmMl0pOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICBlbWl0KGYsIlx0bGlzXHQlcywxNzIwMFxuIixtcmVnbmFtZXNbdDJdKTsKKyAgICAgICAgICBlbWl0KGYsIlx0c3Qlc1x0JXMsJWxkKCVzKVxuIixzZHQoSU5UKSxtcmVnbmFtZXNbdDJdLG1vZmYtOCxtcmVnbmFtZXNbb2ZmcmVnXSk7CisgICAgICAgICAgZW1pdChmLCJcdHhvcmlzXHQlcywlcywzMjc2OFxuIixtcmVnbmFtZXNbdDJdLG1yZWduYW1lc1txMXJlZ10pOworICAgICAgICAgIGVtaXQoZiwiXHRzdCVzXHQlcywlbGQoJXMpXG4iLHNkdChJTlQpLG1yZWduYW1lc1t0Ml0sbW9mZi00LG1yZWduYW1lc1tvZmZyZWddKTsKKyAgICAgICAgICBlbWl0KGYsIlx0bCVzXHQlcywlbGQoJXMpXG4iLGxkdChET1VCTEUpLG1yZWduYW1lc1t6cmVnXSxtb2ZmLTgsbXJlZ25hbWVzW29mZnJlZ10pOworICAgICAgICAgIGxvYWRfcmVnKGYsZjIsJm8sRE9VQkxFLHQyKTsKKyAgICAgICAgICBlbWl0KGYsIlx0ZnN1Ylx0JXMsJXMsJXNcbiIsbXJlZ25hbWVzW3pyZWddLG1yZWduYW1lc1t6cmVnXSxtcmVnbmFtZXNbZjJdKTsKKyAgICAgICAgfQorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKCh0Jk5RKT49KHRvJk5RKSl7CisJaWYoKHRvJk5VKT09Q0hBUil7CisJICBlbWl0KGYsIlx0ZXh0c2Ilc1x0JXMsJXNcbiIscmVjb3JkW3NldGNjXSxtcmVnbmFtZXNbenJlZ10sbXJlZ25hbWVzW3ExcmVnXSk7CisJICBjY3NldHw9c2V0Y2M7CisJfWVsc2UgaWYoKHRvJk5VKT09U0hPUlQmJiFxMWxvYWRlZCl7CisJICBlbWl0KGYsIlx0ZXh0c2glc1x0JXMsJXNcbiIscmVjb3JkW3NldGNjXSxtcmVnbmFtZXNbenJlZ10sbXJlZ25hbWVzW3ExcmVnXSk7CisJICBjY3NldHw9c2V0Y2M7CisJfWVsc2UgaWYoKHRvJk5VKT09KFVOU0lHTkVEfENIQVIpJiYhcTFsb2FkZWQpeworCSAgZW1pdChmLCJcdGNscmx3aSVzXHQlcywlcywyNFxuIixyZWNvcmRbc2V0Y2NdLG1yZWduYW1lc1t6cmVnXSxtcmVnbmFtZXNbcTFyZWddKTsKKwkgIGNjc2V0fD1zZXRjYzsKKwl9ZWxzZSBpZigodG8mTlUpPT0oVU5TSUdORUR8U0hPUlQpJiYhcTFsb2FkZWQpeworCSAgZW1pdChmLCJcdGNscmx3aSVzXHQlcywlcywxNlxuIixyZWNvcmRbc2V0Y2NdLG1yZWduYW1lc1t6cmVnXSxtcmVnbmFtZXNbcTFyZWddKTsKKwkgIGNjc2V0fD1zZXRjYzsKKwl9ZWxzZXsKKwkgIGlmKHNldGNjKXsKKwkgICAgZW1pdChmLCJcdG1yLlx0JXMsJXNcbiIsbXJlZ25hbWVzW3pyZWddLG1yZWduYW1lc1txMXJlZ10pOworCSAgICBjY3NldD0xOworCSAgfWVsc2V7CisJICAgIHpyZWc9cTFyZWc7CisJICB9CisJfQorCWNvbnRpbnVlOworICAgICAgfWVsc2V7CisJenJlZz1xMXJlZzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorICAgIGlmKGM9PUtPTVBMRU1FTlQpeworICAgICAgZW1pdChmLCJcdG5vciVzXHQlcywlcywlc1xuIixyZWNvcmRbc2V0Y2NdLG1yZWduYW1lc1t6cmVnXSxtcmVnbmFtZXNbcTFyZWddLG1yZWduYW1lc1txMXJlZ10pOworICAgICAgY2NzZXR8PXNldGNjOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKElTRkxPQVQodCkpIHtmcHA9ImYiO2ZwZj0xO30gZWxzZSB7ZnBwPSIiO2ZwZj0wO30KKyAgICBpZihjPT1TRVRSRVRVUk4peworICAgICAgaWYocC0+ei5yZWcpeworCWlmKCh0Jk5VKT09Q0hBUikKKwkgIGVtaXQoZiwiXHRleHRzYlx0JXMsJXNcbiIsbXJlZ25hbWVzW3AtPnoucmVnXSxtcmVnbmFtZXNbcTFyZWddKTsKKwllbHNlIGlmKCFxMWxvYWRlZCYmKHQmTlUpPT1TSE9SVCkKKwkgIGVtaXQoZiwiXHRleHRzaFx0JXMsJXNcbiIsbXJlZ25hbWVzW3AtPnoucmVnXSxtcmVnbmFtZXNbcTFyZWddKTsKKwllbHNlIGlmKCFxMWxvYWRlZCYmKHQmTlUpPT0oVU5TSUdORUR8Q0hBUikpCisJICBlbWl0KGYsIlx0Y2xybHdpXHQlcywlcywyNFxuIixtcmVnbmFtZXNbcC0+ei5yZWddLG1yZWduYW1lc1txMXJlZ10pOworCWVsc2UgaWYoIXExbG9hZGVkJiYodCZOVSk9PShVTlNJR05FRHxTSE9SVCkpCisJICBlbWl0KGYsIlx0Y2xybHdpXHQlcywlcywxNlxuIixtcmVnbmFtZXNbcC0+ei5yZWddLG1yZWduYW1lc1txMXJlZ10pOworCWVsc2UgaWYocC0+ei5yZWchPXExcmVnKQorCSAgZW1pdChmLCJcdCVzbXJcdCVzLCVzXG4iLGZwcCxtcmVnbmFtZXNbcC0+ei5yZWddLG1yZWduYW1lc1txMXJlZ10pOworCUJTRVQocmVnc19tb2RpZmllZCxwLT56LnJlZyk7CisgICAgICB9ZWxzZQorICAgICAgICBpZXJyb3IoMCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09R0VUUkVUVVJOKXsKKyAgICAgIGlmKHAtPnExLnJlZykKKyAgICAgICAgenJlZz1wLT5xMS5yZWc7CisgICAgICBlbHNlCisgICAgICAgIHAtPnouZmxhZ3M9MDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1DQUxMKXsKKyAgICAgIGNjc2V0PTA7CisgICAgICBpZihzdGFja192YWxpZCl7CisJaW50IGk7CisJaWYocC0+Y2FsbF9jbnQ8PTApeworCSAgZXJyX2ljPXA7ZXJyb3IoMzIwKTsKKwkgIHN0YWNrX3ZhbGlkPTA7CisJICB2LT5maS0+ZmxhZ3N8PShXQVJORURfU1RBQ0t8V0FSTkVEX1JFR1MpOworCX0KKwlmb3IoaT0wO2k8cC0+Y2FsbF9jbnQ7aSsrKXsKKwkgIGlmKHAtPmNhbGxfbGlzdFtpXS52LT5maSYmKHAtPmNhbGxfbGlzdFtpXS52LT5maS0+ZmxhZ3MmQUxMX1NUQUNLKSl7CisJICAgIGlmKGZyYW1lc2l6ZSt6dW0ydWwocC0+Y2FsbF9saXN0W2ldLnYtPmZpLT5zdGFjazEpPnN0YWNrKQorCSAgICAgIHN0YWNrPWZyYW1lc2l6ZSt6dW0ydWwocC0+Y2FsbF9saXN0W2ldLnYtPmZpLT5zdGFjazEpOworCSAgfWVsc2V7CisJICAgIGVycl9pYz1wOworCSAgICBpZighcC0+Y2FsbF9saXN0W2ldLnYtPmZpKSBwLT5jYWxsX2xpc3RbaV0udi0+Zmk9bmV3X2ZpKCk7CisJICAgIGlmKCEocC0+Y2FsbF9saXN0W2ldLnYtPmZpLT5mbGFncyZXQVJORURfU1RBQ0spKXsKKwkgICAgICBlcnJvcigzMTcscC0+Y2FsbF9saXN0W2ldLnYtPmlkZW50aWZpZXIpOworCSAgICAgIHAtPmNhbGxfbGlzdFtpXS52LT5maS0+ZmxhZ3N8PVdBUk5FRF9TVEFDSzsKKwkgICAgfQorCSAgICB2LT5maS0+ZmxhZ3N8PVdBUk5FRF9TVEFDSzsKKwkgICAgc3RhY2tfdmFsaWQ9MDsKKwkgIH0KKyNpZiBIQVZFX09TRUsKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorCX0KKyAgICAgIH0KKyAgICAgIGlmKCFjYWxjX3JlZ3MocCxmIT0wKSYmdi0+ZmkpIGFsbF9yZWdzPTA7CisjaWYgSEFWRV9PU0VLCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICAgIGlmKChwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiZwLT5xMS52LT5maSYmcC0+cTEudi0+ZmktPmlubGluZV9hc20peworICAgICAgICBlbWl0X2lubGluZV9hc20oZixwLT5xMS52LT5maS0+aW5saW5lX2FzbSk7CisgICAgICB9ZWxzZXsKKyAgICAgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVIpeworICAgICAgICAgIGlmKCFzdHJjbXAoIl9fdmFfc3RhcnQiLHAtPnExLnYtPmlkZW50aWZpZXIpKXsKKyAgICAgICAgICAgIGVtaXQoZiwiXHRhZGRpXHQlcywlcywlbHVcbiIsbXJlZ25hbWVzW3IzXSxtcmVnbmFtZXNbc3BdLGZyYW1lc2l6ZSttaW5mcmFtZSt6bTJsKHZhX29mZnNldCh2KSkvKit2cGFybW9zKi8pOworICAgICAgICAgICAgQlNFVChyZWdzX21vZGlmaWVkLHIzKTtjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYoIXN0cmNtcCgiX192YV9yZWdiYXNlIixwLT5xMS52LT5pZGVudGlmaWVyKSl7CisgICAgICAgICAgICBlbWl0KGYsIlx0YWRkaVx0JXMsJXMsJWxkXG4iLG1yZWduYW1lc1tyM10sbXJlZ25hbWVzW3NwXSxyZWdiYXNlKTsKKyAgICAgICAgICAgIEJTRVQocmVnc19tb2RpZmllZCxyMyk7Y29udGludWU7Y29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKCFzdHJjbXAoIl9fdmFfZml4ZWRncHIiLHAtPnExLnYtPmlkZW50aWZpZXIpKXsKKyAgICAgICAgICAgIGVtaXQoZiwiXHRsaVx0JXMsJWRcbiIsbXJlZ25hbWVzW3IzXSxmaXhlZGdwcik7CisgICAgICAgICAgICBCU0VUKHJlZ3NfbW9kaWZpZWQscjMpO2NvbnRpbnVlO2NvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBpZighc3RyY21wKCJfX3ZhX2ZpeGVkZnByIixwLT5xMS52LT5pZGVudGlmaWVyKSl7CisgICAgICAgICAgICBlbWl0KGYsIlx0bGlcdCVzLCVkXG4iLG1yZWduYW1lc1tyM10sZml4ZWRmcHIpOworICAgICAgICAgICAgQlNFVChyZWdzX21vZGlmaWVkLHIzKTtjb250aW51ZTtjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoZ19mbGFnc1sxMF0mVVNFREZMQUcpIGVtaXQoZiwiXHRjcmVxdlx0Niw2LDZcbiIpOworCS8qIHBvd2Vyb3Blbi1oYWNrISBsb29rIGlmIHNvbWUgZnAtYXJncyBoYXZlIGJlZW4gcGFzc2VkIG9uIHRoZSBzdGFjayAqLworCWlmKFBPV0VST1BFTiYmIXptZXF0byhwLT5xMi52YWwudm1heCxsMnptKDBMKSkpeworCSAgaW50IHI9NDUvKmYxMiovLG9mZj0yNDsKKwkgIGZvcihpPTA7cjw0NyYmaTxwLT5hcmdfY250O2krKyl7CisJICAgIGlmKHAtPmFyZ19saXN0W2ldLT5jb2RlPT1QVVNIKXsKKwkgICAgICBpbnQgdHlwPXAtPmFyZ19saXN0W2ldLT50eXBmOworCSAgICAgIGlmKElTRkxPQVQodHlwKSl7CisJCWVtaXQoZiwiXHRsJXNcdCVzLCVkKCVzKVxuIixsZHQodHlwJk5RKSxtcmVnbmFtZXNbcl0sb2ZmLG1yZWduYW1lc1tzcF0pOworCQlyKys7CisJICAgICAgfQorCSAgICB9CisJICAgIG9mZis9KHptMmwocC0+YXJnX2xpc3RbaV0tPnEyLnZhbC52bWF4KSszKS80KjQ7CisJICB9CisJfQorCWlmKHExcmVnKXsKKyAgICAgICAgICBlbWl0KGYsIlx0bXRsclx0JXNcbiIsbXJlZ25hbWVzW3ExcmVnXSk7CisgICAgICAgICAgZW1pdChmLCJcdGJscmxcbiIpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICBlbWl0KGYsIlx0YmxcdCIpO2VtaXRfb2JqKGYsJnAtPnExLHQpOworICAgICAgICAgIGVtaXQoZiwiXG4iKTsKKyAgICAgICAgfQorCUJTRVQocmVnc19tb2RpZmllZCxscik7CisgICAgICB9CisgICAgICBwdXNoZWQtPXptMmwocC0+cTIudmFsLnZtYXgpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PUFTU0lHTnx8Yz09UFVTSCl7CisgICAgICBpZih0PT0wKSBpZXJyb3IoMCk7CisgICAgICBpZihxMXJlZ3x8Yz09UFVTSCl7CisgICAgICAgIGlmKGM9PVBVU0gpeworCSAgcHVzaGVkPShwdXNoZWQrMykvNCo0OworCSAgaWYoYWxpZ25fYXJndW1lbnRzJiZtYWxpZ25bcC0+dHlwZiZOUV09PTgpCisJICAgIHB1c2hlZD0ocHVzaGVkKzcpLzgqODsKKyAgICAgICAgICBpZihxMXJlZykKKyAgICAgICAgICAgIGVtaXQoZiwiXHRzdCVzXHQlcywlbGQoJXMpXG4iLHNkdCh0Jk5RKSxtcmVnbmFtZXNbcTFyZWddLHB1c2hlZCttaW5mcmFtZSxtcmVnbmFtZXNbc3BdKTsKKyAgICAgICAgICBwdXNoZWQrPXptMmwocC0+cTIudmFsLnZtYXgpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmKGM9PUFTU0lHTil7CisgICAgICAgICAgaWYoc2V0Y2MmJiFmcGYmJnNpemV0YWJbdCZOUV09PXNpemV0YWJbSU5UXSl7CisgICAgICAgICAgICBlbWl0KGYsIlx0bXIuXHQlcywlc1xuIixtcmVnbmFtZXNbenJlZ10sbXJlZ25hbWVzW3ExcmVnXSk7CisgICAgICAgICAgICBjY3NldD0xOworICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgenJlZz1xMXJlZzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorICAgIGlmKGM9PUFERFJFU1MpeworICAgICAgbG9hZF9hZGRyZXNzKGYsenJlZywmcC0+cTEsUE9JTlRFUik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09TUlOVVMpeworICAgICAgZW1pdChmLCJcdCVzbmVnJXNcdCVzLCVzXG4iLGZwcCxyZWNvcmRbc2V0Y2MmJiFmcGZdLG1yZWduYW1lc1t6cmVnXSxtcmVnbmFtZXNbcTFyZWddKTsKKyAgICAgIGlmKHNldGNjJiYhZnBmKSBjY3NldD0xOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PVRFU1QpeworICAgICAgaWYoIShwLT56LmZsYWdzJlJFRykpCisgICAgICAgIHAtPnoucmVnPWNyMDsKKyAgICAgIGlmKCFtdWx0aXBsZV9jY3MmJih0JlVOU0lHTkVEKSl7CisgICAgICAgIHN0cnVjdCBJQyAqcDI9cC0+bmV4dDsKKyAgICAgICAgd2hpbGUocDImJihwMi0+Y29kZT09RlJFRVJFR3x8cDItPmNvZGU9PUFMTE9DUkVHKSkgcDI9cDItPm5leHQ7CisgICAgICAgIGlmKCFwMikgY29udGludWU7CisgICAgICAgIGlmKHAyLT5jb2RlPT1CR1QpIHAyLT5jb2RlPUJORTsKKyAgICAgICAgZWxzZSBpZihwMi0+Y29kZT09QkdFKSBwMi0+Y29kZT1CUkE7CisgICAgICAgIGVsc2UgaWYocDItPmNvZGU9PUJMVCkgcDItPmNvZGU9Tk9QOworICAgICAgICBlbHNlIGlmKHAyLT5jb2RlPT1CTEUpIHAyLT5jb2RlPUJFUTsKKyAgICAgIH0KKyAgICAgIGlmKGNjc2V0JiZwLT56LnJlZz09Y3IwKSBjb250aW51ZTsKKyAgICAgIGlmKElTRkxPQVQodCkpeworICAgICAgICBpZXJyb3IoMCk7CisgICAgICB9ZWxzZXsKKwlpZigodCZOVSk9PUNIQVIpCisJICBlbWl0KGYsIlx0ZXh0c2IuXHQlcywlc1xuIixtcmVnbmFtZXNbcC0+ei5yZWddLG1yZWduYW1lc1txMXJlZ10pOworCWVsc2UgaWYoKHQmTlUpPT1TSE9SVCkKKwkgIGVtaXQoZiwiXHRleHRzaC5cdCVzLCVzXG4iLG1yZWduYW1lc1twLT56LnJlZ10sbXJlZ25hbWVzW3ExcmVnXSk7CisJZWxzZSBpZigodCZOVSk9PShVTlNJR05FRHxDSEFSKSkKKwkgIGVtaXQoZiwiXHRhbmRpLlx0JXMsJXMsMjU1XG4iLG1yZWduYW1lc1twLT56LnJlZ10sbXJlZ25hbWVzW3ExcmVnXSk7CisJZWxzZSBpZigodCZOVSk9PShVTlNJR05FRHxTSE9SVCkpCisJICBlbWl0KGYsIlx0YW5kaS5cdCVzLCVzLDY1NTM1XG4iLG1yZWduYW1lc1twLT56LnJlZ10sbXJlZ25hbWVzW3ExcmVnXSk7CisJZWxzZQorCSAgZW1pdChmLCJcdGNtcCVzd2lcdCVzLCVzLDBcbiIsKHQmVU5TSUdORUQpPyJsIjoiIixtcmVnbmFtZXNbcC0+ei5yZWddLG1yZWduYW1lc1txMXJlZ10pOworICAgICAgfQorICAgICAgaWYocC0+ei5yZWc9PWNyMCkgY2NzZXQ9MDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1DT01QQVJFKXsKKyAgICAgIGlmKCEocC0+ei5mbGFncyZSRUcpKQorICAgICAgICBwLT56LnJlZz1jcjA7CisgICAgICBpZihJU0ZMT0FUKHQpKQorICAgICAgICBlbWl0KGYsIlx0ZmNtcHVcdCVzLCVzLCIsbXJlZ25hbWVzW3AtPnoucmVnXSxtcmVnbmFtZXNbcTFyZWddKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZW1pdChmLCJcdGNtcCVzdyVzXHQlcywlcywiLCgodCZVTlNJR05FRCl8fCgodCZOUSk9PVBPSU5URVIpKT8ibCI6IiIsaXNpbW1bcTJyZWc9PTBdLG1yZWduYW1lc1twLT56LnJlZ10sbXJlZ25hbWVzW3ExcmVnXSk7CisgICAgICBlbWl0X29iaihmLCZwLT5xMix0KTtlbWl0KGYsIlxuIik7CisgICAgICBpZihwLT56LnJlZz09Y3IwKSBjY3NldD0wOworICAgICAgY29udGludWU7CisgICAgfQorICAgIEJTRVQocmVnc19tb2RpZmllZCx6cmVnKTsKKyAgICBpZihjPT1BTkQmJnEycmVnPT0wKXsKKyAgICAgIGNjc2V0PXNldGNjOworICAgICAgZW1pdChmLCJcdGFuZGkuXHQlcywlcywiLG1yZWduYW1lc1t6cmVnXSxtcmVnbmFtZXNbcTFyZWddKTsKKyAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHR8VU5TSUdORUQpO2VtaXQoZiwiXG4iKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPj1PUiYmYzw9QU5EKXsKKyAgICAgIGVtaXQoZiwiXHQlcyVzJXNcdCVzLCVzLCIsbG9naWNhbHNbYy1PUl0saXNpbW1bcTJyZWc9PTBdLHJlY29yZFtzZXRjYyYmcTJyZWddLG1yZWduYW1lc1t6cmVnXSxtcmVnbmFtZXNbcTFyZWddKTsKKyAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHR8VU5TSUdORUQpO2VtaXQoZiwiXG4iKTsKKyAgICAgIGlmKHNldGNjJiZxMnJlZykgY2NzZXQ9MTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1TVUImJihwLT5xMS5mbGFncyZLT05TVCkpeworICAgICAgZW1pdChmLCJcdHN1YmZpY1x0JXMsJXMsIixtcmVnbmFtZXNbenJlZ10sbXJlZ25hbWVzW3EycmVnXSk7CisgICAgICBlbWl0X29iaihmLCZwLT5xMSx0Jk5RKTtlbWl0KGYsIlxuIik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz49TFNISUZUJiZjPD1NT0QpeworICAgICAgaWYoYz09UlNISUZUJiYoKHQmTlEpPD1TSE9SVCkpeworCS8qIHNwZWNpYWwgdHJlYXRtZW50IGZvciBzaG9ydCBzaGlmdHMgdXNlZCBpbiBiaXRmaWVsZHMgd2l0aAorCSAgIHN1Yi1pbnQgdHlwZTsgd2lsbCBub3QgaGFuZGxlIHRoZSBnZW5lcmFsIGNhc2UgKHdoaWNoLCBob3dldmVyLAorCSAgIHNob3VsZCBuZXZlciBvY2N1cikgKi8KKwlpbnQgd2lkdGgsc2hpZnQ7CisJd2lkdGg9c2l6ZXRhYlt0Jk5RXSo4OworCWlmKCEocC0+cTIuZmxhZ3MmS09OU1QpKSBpZXJyb3IoMCk7CisJZXZhbF9jb25zdCgmcC0+cTIudmFsLHAtPnR5cGYyJk5VKTsKKwlzaGlmdD16bTJsKHZtYXgpOworCWlmKHNoaWZ0PDB8fHNoaWZ0Pj13aWR0aCkgaWVycm9yKDApOworCWlmKHNoaWZ0PT0wKSBjb250aW51ZTsKKwlpZighKHQmVU5TSUdORUQpKXsKKwkgIGVtaXQoZiwiXHRleHRzJWNcdCVzLCVzXG4iLHdpZHRoPT04PydiJzonaCcsbXJlZ25hbWVzW3pyZWddLG1yZWduYW1lc1txMXJlZ10pOworCSAgcTFyZWc9enJlZzsKKwl9CisJZW1pdChmLCJcdHJsd2lubVx0JXMsJXMsJWQsJWQsJWRcbiIsbXJlZ25hbWVzW3pyZWddLG1yZWduYW1lc1txMXJlZ10sMzItc2hpZnQsMzItd2lkdGgrKCh0JlVOU0lHTkVEKT9zaGlmdDowKSwzMSk7CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZihjPT1SU0hJRlQmJiEodCZVTlNJR05FRCkpeworICAgICAgICBlbWl0KGYsIlx0c3JhdyVzJXNcdCVzLCVzLCIsaXNpbW1bcTJyZWc9PTBdLHJlY29yZFtzZXRjY10sbXJlZ25hbWVzW3pyZWddLG1yZWduYW1lc1txMXJlZ10pOworICAgICAgICBlbWl0X29iaihmLCZwLT5xMixxMnR5cChwKSk7CisJLyogZml4IGZvciBpbGxlZ2FsIHNoaWZ0IHZhbHVlcyAodW5kZWZpbmVkIGJlaGF2aW91cikgKi8KKwlpZighaXNyZWcocTIpKQorCSAgZW1pdChmLCImMzEiKTsKKwllbWl0KGYsIlxuIik7CisgICAgICAgIGNjc2V0fD1zZXRjYzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZihjPT1NT0QpeworICAgICAgICBpPTA7CisgICAgICAgIGlmKHpyZWc9PXExcmVnfHx6cmVnPT1xMnJlZyl7CisgICAgICAgICAgaWYodDEhPXExcmVnJiZ0MSE9cTJyZWcpIGk9dDE7CisgICAgICAgICAgaWYodDIhPXExcmVnJiZ0MiE9cTJyZWcpIGk9dDI7CisgICAgICAgIH1lbHNlIGk9enJlZzsKKyAgICAgICAgaWYoaT09MHx8aT09cTFyZWd8fGk9PXEycmVnKSBpZXJyb3IoMCk7CisgICAgICAgIGVtaXQoZiwiXHRkaXZ3JXNcdCVzLCVzLCVzXG4iLCh0JlVOU0lHTkVEKT8idSI6IiIsbXJlZ25hbWVzW2ldLG1yZWduYW1lc1txMXJlZ10sbXJlZ25hbWVzW3EycmVnXSk7CisgICAgICAgIGVtaXQoZiwiXHRtdWxsd1x0JXMsJXMsJXNcbiIsbXJlZ25hbWVzW2ldLG1yZWduYW1lc1tpXSxtcmVnbmFtZXNbcTJyZWddKTsKKyAgICAgICAgZW1pdChmLCJcdHN1YmYlc1x0JXMsJXMsJXNcbiIscmVjb3JkW3NldGNjXSxtcmVnbmFtZXNbenJlZ10sbXJlZ25hbWVzW2ldLG1yZWduYW1lc1txMXJlZ10pOworICAgICAgICBjY3NldHw9c2V0Y2M7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoYz09RElWJiYodCZVTlNJR05FRCkpeworICAgICAgICBlbWl0KGYsIlx0ZGl2d3UlcyVzXHQlcywlcywiLGlzaW1tW3EycmVnPT0wXSxyZWNvcmRbc2V0Y2MmJnEycmVnXSxtcmVnbmFtZXNbenJlZ10sbXJlZ25hbWVzW3ExcmVnXSk7CisgICAgICAgIGlmKHNldGNjJiZxMnJlZykgY2NzZXQ9MTsKKyAgICAgIH1lbHNlIGlmKGM9PU1VTFQmJklTRkxPQVQodCkpeworCWlmKGlzcmVnKHopJiYoZ19mbGFnc1sxNF0mVVNFREZMQUcpKXsKKwkgIHN0cnVjdCBJQyAqbnA9cC0+bmV4dCwqYWRkO2ludCBtYWRkOworCSAgd2hpbGUobnAmJihucC0+Y29kZT09RlJFRVJFR3x8bnAtPmNvZGU9PUFMTE9DUkVHKSkgbnA9bnAtPm5leHQ7CisJICBpZihucCYmKG5wLT5jb2RlPT1BRER8fG5wLT5jb2RlPT1TVUIpJiYobnAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJihucC0+cTEucmVnPT1wLT56LnJlZ3x8KG5wLT5jb2RlPT1BREQmJm5wLT5xMi5yZWc9PXAtPnoucmVnKSkmJihucC0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmbnAtPnExLnJlZyE9bnAtPnEyLnJlZyl7CisJICAgIGFkZD1ucDsKKwkgICAgbWFkZD0wOworCSAgICBpZigobnAtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmbnAtPnoucmVnPT1wLT56LnJlZykgbWFkZD0xOworCSAgICBucD1ucC0+bmV4dDsKKwkgICAgd2hpbGUobnAmJihucC0+Y29kZT09RlJFRVJFR3x8bnAtPmNvZGU9PUFMTE9DUkVHKSl7CisJICAgICAgaWYobnAtPmNvZGU9PUZSRUVSRUcmJm5wLT5xMS5yZWc9PXAtPnoucmVnKSBtYWRkPTE7CisJICAgICAgbnA9bnAtPm5leHQ7CisJICAgIH0KKwkgICAgaWYobWFkZCl7CisJICAgICAgaWYoKGFkZC0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKSB6cmVnPWFkZC0+ei5yZWc7CisJICAgICAgaWYoYWRkLT5jb2RlPT1BREQpeworCQlpZihhZGQtPnExLnJlZz09cC0+ei5yZWcpIG1hZGQ9YWRkLT5xMi5yZWc7IGVsc2UgbWFkZD1hZGQtPnExLnJlZzsKKwkJZW1pdChmLCJcdGZtYWRkJXNcdCVzLCVzLCVzLCVzXG4iLCh0Jk5RKT09RkxPQVQ/InMiOiIiLG1yZWduYW1lc1t6cmVnXSxtcmVnbmFtZXNbcTFyZWddLG1yZWduYW1lc1txMnJlZ10sbXJlZ25hbWVzW21hZGRdKTsKKwkgICAgICB9ZWxzZQorCQllbWl0KGYsIlx0Zm1zdWIlc1x0JXMsJXMsJXMsJXNcbiIsKHQmTlEpPT1GTE9BVD8icyI6IiIsbXJlZ25hbWVzW3pyZWddLG1yZWduYW1lc1txMXJlZ10sbXJlZ25hbWVzW3EycmVnXSxtcmVnbmFtZXNbYWRkLT5xMi5yZWddKTsKKwkgICAgICBhZGQtPmNvZGU9Tk9QOworCSAgICAgIHAtPno9YWRkLT56OworCSAgICAgIGFkZC0+ei5hbT0wOworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICB9CisJfQorCWVtaXQoZiwiXHRmbXVsJXNcdCVzLCVzLCIsKHQmTlEpPT1GTE9BVD8icyI6IiIsbXJlZ25hbWVzW3pyZWddLG1yZWduYW1lc1txMXJlZ10pOworICAgICAgfWVsc2UgaWYoYz09RElWJiZJU0ZMT0FUKHQpKXsKKyAgICAgICAgZW1pdChmLCJcdGZkaXYlc1x0JXMsJXMsIiwodCZOUSk9PUZMT0FUPyJzIjoiIixtcmVnbmFtZXNbenJlZ10sbXJlZ25hbWVzW3ExcmVnXSk7CisgICAgICB9ZWxzZSBpZihjPT1NVUxUJiZxMnJlZz09MCl7CisgICAgICAgIGVtaXQoZiwiXHRtdWxsaVx0JXMsJXMsIixtcmVnbmFtZXNbenJlZ10sbXJlZ25hbWVzW3ExcmVnXSk7CisgICAgICB9ZWxzZSBpZihjPT1BREQmJnNldGNjJiYhcTJyZWcpeworICAgICAgICBlbWl0KGYsIlx0YWRkaWMuXHQlcywlcywiLG1yZWduYW1lc1t6cmVnXSxtcmVnbmFtZXNbcTFyZWddKTsKKyAgICAgICAgY2NzZXQ9MTsKKyAgICAgIH1lbHNleworICAgICAgICBlbWl0KGYsIlx0JXMlcyVzJXMlc1x0JXMsJXMsIixmcHAsYXJpdGhtZXRpY3NbYy1MU0hJRlRdLCh0Jk5RKT09RkxPQVQ/InMiOiIiLGlzaW1tW3EycmVnPT0wXSxyZWNvcmRbc2V0Y2MmJnEycmVnJiYhZnBmXSxtcmVnbmFtZXNbenJlZ10sbXJlZ25hbWVzW3ExcmVnXSk7CisgICAgICAgIGlmKHNldGNjJiZxMnJlZyYmIWZwZikgY2NzZXQ9MTsKKyAgICAgIH0KKyAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHEydHlwKHApJk5RKTsKKyAgICAgIC8qIGZpeCBmb3IgaWxsZWdhbCBzaGlmdCB2YWx1ZXMgKHVuZGVmaW5lZCBiZWhhdmlvdXIpICovCisgICAgICBpZigoYz09TFNISUZUfHxjPT1SU0hJRlQpJiZxMnJlZz09MCkgZW1pdChmLCImMzEiKTsKKyAgICAgIGVtaXQoZiwiXG4iKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBwcmljMihzdGRvdXQscCk7CisgICAgaWVycm9yKDApOworICB9CisgIGlmKCFjcm9zc19tb2R1bGUpICBsYXN0bGFiZWw9bGFiZWw7ICAvKkZJWE1FKi8KKyAgZnJlZShvbmNlKTtmcmVlKHR3aWNlKTsKKyAgZnVuY3Rpb25fYm90dG9tKGYsdixvZik7CisjaWYgSEFWRV9PU0VLCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgaWYoc3RhY2tfdmFsaWQpeworICAgIGlmKCF2LT5maSkgdi0+Zmk9bmV3X2ZpKCk7CisgICAgaWYodi0+ZmktPmZsYWdzJkFMTF9TVEFDSyl7CisgICAgICBpZih2LT5maS0+c3RhY2sxIT1zdGFjayYmISh2LT50YXR0ciZTQVZFQUxMKSkKKwlpZihmKSBlcnJvcigzMTksIiIsc3RhY2ssdi0+ZmktPnN0YWNrMSk7CisjaWYgSEFWRV9PU0VLCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICB9ZWxzZXsKKyAgICAgIHYtPmZpLT5mbGFnc3w9QUxMX1NUQUNLOworICAgICAgdi0+ZmktPnN0YWNrMT1zdGFjazsKKyAgICB9CisgIH0KKyAgZW1pdChmLCIjIHN0YWNrc2l6ZT0lbHUlc1xuIiwodW5zaWduZWQgbG9uZylzdGFjayxzdGFja192YWxpZD8iIjoiKz8/Iik7CisgIGlmKHN0YWNrX3ZhbGlkKSBlbWl0KGYsIlx0LnNldFx0JXNfX3N0YWNrXyVzLCVsdVxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyLCh1bnNpZ25lZCBsb25nKXN0YWNrKTsKKyAgaWYoZGVidWdfaW5mbyl7CisgICAgZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisgICAgZHdhcmYyX2Z1bmN0aW9uKGYsdixsYWJlbCk7CisgICAgaWYoZikgc2VjdGlvbj0tMTsKKyAgfQorfQorCitpbnQgc2hvcnRjdXQoaW50IGNvZGUsaW50IHR5cCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK2ludCByZWdfcGFybShzdHJ1Y3QgcmVnX2hhbmRsZSAqbSwgc3RydWN0IFR5cCAqdCxpbnQgdmFyYXJnLHN0cnVjdCBUeXAgKmZ0KQoreworI2lmIEhBVkVfQU9TNAorICBleHRlcm4gaW50IGFvczRfYXR0cihzdHJ1Y3QgVHlwICosY2hhciAqKTsKKyNlbmRpZgorICBpbnQgZjsKKyAgaWYoIW0pIGllcnJvcigwKTsKKyAgaWYoIXQpIGllcnJvcigwKTsKKyAgaWYodmFyYXJnJiZQT1dFUk9QRU4pIHJldHVybiAwOworI2lmZGVmIEhBVkVfQU9TNAorICBpZih2YXJhcmcmJmZ0JiZhb3M0X2F0dHIoZnQsImxpbmVhcnZhcmFyZ3MiKSkgcmV0dXJuIDA7CisjZW5kaWYKKyAgZj10LT5mbGFncyZOUTsKKyAgaWYoZjw9TE9OR3x8Zj09UE9JTlRFUil7CisgICAgaWYobS0+Z3JlZ3M+PTgpIHJldHVybiAwOworICAgIGlmKFBPV0VST1BFTil7CisgICAgICBpZighU1RPUk1DKSBtLT5mcmVncysrOworICAgICAgcmV0dXJuIC0ocjMrbS0+Z3JlZ3MrKyk7CisgICAgfWVsc2V7CisgICAgICByZXR1cm4gcjMrbS0+Z3JlZ3MrKzsKKyAgICB9CisgIH0KKyAgaWYoZj09TExPTkcpeworICAgIGludCByOworICAgIGlmKG0tPmdyZWdzPj03KSByZXR1cm4gMDsKKyAgICBtLT5ncmVncz0obS0+Z3JlZ3MrMykvMioyOworICAgIGlmKG0tPmdyZWdzPT0yKSByPTc0OworICAgIGVsc2UgaWYobS0+Z3JlZ3M9PTQpIHI9NzU7CisgICAgZWxzZSBpZihtLT5ncmVncz09Nikgcj03NjsKKyAgICBlbHNlIGlmKG0tPmdyZWdzPT04KSByPTc3OworICAgIGVsc2UgaWVycm9yKDApOworICAgIGlmKFBPV0VST1BFTikgCisgICAgICByZXR1cm4gLXI7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHI7CisgIH0KKyAgaWYoSVNGTE9BVChmKSl7CisgICAgaWYoUE9XRVJPUEVOKXsKKyAgICAgIGlmKG0tPmZyZWdzPj0xMSkgcmV0dXJuIDA7IC8qIGhhY2shIHdlIHByZXRlbmQgZnAtYXJnIDEyLzEzIGlzIHBhc3NlZCBvbiB0aGUgc3RhY2sgKi8KKyAgICAgIGlmKCFTVE9STUMpeworICAgICAgICBpZihmIT1GTE9BVCkgbS0+Z3JlZ3MrPTI7IGVsc2UgbS0+Z3JlZ3MrKzsKKyAgICAgIH0KKyAgICAgIHJldHVybiAtKDM0K20tPmZyZWdzKyspOworICAgIH1lbHNleworICAgICAgaWYobS0+ZnJlZ3M+PTgpIHJldHVybiAwOworICAgICAgcmV0dXJuIDM0K20tPmZyZWdzKys7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitpbnQgaGFuZGxlX3ByYWdtYShjb25zdCBjaGFyICpzKQoreworICBpZighc3RybmNtcCgiYW1pZ2EtYWxpZ24iLHMsMTEpKXsKKyAgICBhbGlnbltJTlRdPWFsaWduW0xPTkddPWFsaWduW0xMT05HXT1hbGlnbltQT0lOVEVSXT1hbGlnbltGTE9BVF09YWxpZ25bRE9VQkxFXT1hbGlnbltMRE9VQkxFXT1sMnptKDJMKTsKKyAgICByZXR1cm4gMTsKKyAgfWVsc2UgaWYoIXN0cm5jbXAoIm5hdHVyYWwtYWxpZ24iLHMsMTMpKXsKKyAgICBhbGlnbltJTlRdPWFsaWduW0xPTkddPWFsaWduW1BPSU5URVJdPWFsaWduW0ZMT0FUXT1sMnptKDRMKTsKKyAgICBhbGlnbltMTE9OR109YWxpZ25bRE9VQkxFXT1hbGlnbltMRE9VQkxFXT1sMnptKDhMKTsKKyAgICByZXR1cm4gMTsKKyAgfWVsc2UgaWYoIXN0cm5jbXAoImRlZmF1bHQtYWxpZ24iLHMsMTMpKXsKKyAgICBpZihnX2ZsYWdzWzddJlVTRURGTEFHKXsKKyAgICAgIGFsaWduW0lOVF09YWxpZ25bTE9OR109YWxpZ25bTExPTkddPWFsaWduW1BPSU5URVJdPWFsaWduW0ZMT0FUXT1hbGlnbltET1VCTEVdPWFsaWduW0xET1VCTEVdPWwyem0oMkwpOworICAgIH1lbHNleworICAgICAgYWxpZ25bSU5UXT1hbGlnbltMT05HXT1hbGlnbltQT0lOVEVSXT1hbGlnbltGTE9BVF09bDJ6bSg0TCk7CisgICAgICBhbGlnbltMTE9OR109YWxpZ25bRE9VQkxFXT1hbGlnbltMRE9VQkxFXT1sMnptKDhMKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9jZyhGSUxFICpmKQoreworICBzdHJ1Y3QgZnBjb25zdGxpc3QgKnA7CisgIHVuc2lnbmVkIGNoYXIgKmlwOworICBzdHJ1Y3QgU3RhdEZQdHJMaXN0ICp0ZnAsKmZwPWZpcnN0ZnB0cjsKKworICB0aXRsZShmKTsKKworICBpZihmcCl7CisgICAgZW1pdChmLHRvY25hbWUpOworICAgIGlmKGYpIHNlY3Rpb249VE9DOworICB9CisgIHdoaWxlKHRmcD1mcCl7CisgICAgZW1pdChmLCIlcyVzJWxkOlxuXHQubG9uZ1x0JXMlbGRcbiIsCisJIHRvY3ByZWZpeCxsYWJwcmVmaXgsem0ybCh0ZnAtPnZwdHItPm9mZnNldCksCisJIGxhYnByZWZpeCx6bTJsKHRmcC0+dnB0ci0+b2Zmc2V0KSk7CisgICAgZnA9ZnAtPm5leHQ7CisgICAgZnJlZSh0ZnApOworICB9CisgIGlmKGYmJnN0YWNrX2NoZWNrKQorICAgIGVtaXQoZiwiXHQuZ2xvYmFsXHQlc19fc3RhY2tfY2hlY2tcbiIsaWRwcmVmaXgpOworICB3aGlsZShwPWZpcnN0ZnBjKXsKKyAgICBpZihmKXsKKyAgICAgIGlmKFBPV0VST1BFTiYmIXVzZV9zZChwLT50eXApKXsKKyAgICAgICAgZW1pdChmLHRvY25hbWUpOworICAgICAgICBlbWl0KGYsIiVzJXMlbGQ6XG4iLHRvY3ByZWZpeCxsYWJwcmVmaXgsem0ybChwLT5sYWJlbCkpOworICAgICAgICBlbWl0KGYsIlx0LmxvbmdcdCVzJWxkXG4iLGxhYnByZWZpeCx6bTJsKHAtPmxhYmVsKSk7CisgICAgICAgIGlmKGYpIHNlY3Rpb249VE9DOworICAgICAgfQorICAgICAgaWYodXNlX3NkKHAtPnR5cCkpeworCWlmKEVBQkkpeworCSAgaWYoc2VjdGlvbiE9U0RBVEEyKXtlbWl0KGYsc2RhdGEybmFtZSk7aWYoZikgc2VjdGlvbj1TREFUQTI7fQorCX1lbHNleworCSAgaWYoc2VjdGlvbiE9VE9DKXtlbWl0KGYsdG9jbmFtZSk7aWYoZikgc2VjdGlvbj1UT0M7fQorCX0KKyAgICAgIH1lbHNleworICAgICAgICBpZihzZWN0aW9uIT1ST0RBVEEpe2VtaXQoZixyb2RhdGFuYW1lKTtpZihmKSBzZWN0aW9uPVJPREFUQTt9CisgICAgICB9CisgICAgICBpZigocC0+dHlwJk5RKT09RE9VQkxFKQorICAgICAgICBlbWl0KGYsIlx0LmFsaWduXHQzXG4iKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZW1pdChmLCJcdC5hbGlnblx0MlxuIik7CisgICAgICBlbWl0KGYsIiVzJWQ6XG5cdC5sb25nXHQiLGxhYnByZWZpeCxwLT5sYWJlbCk7CisgICAgICBpcD0odW5zaWduZWQgY2hhciAqKSZwLT52YWwudmRvdWJsZTsKKyAgICAgIGVtaXQoZiwiMHglMDJ4JTAyeCUwMnglMDJ4IixpcFswXSxpcFsxXSxpcFsyXSxpcFszXSk7CisgICAgICBpZigocC0+dHlwJk5RKT09RE9VQkxFKXsKKyAgICAgICAgZW1pdChmLCIsMHglMDJ4JTAyeCUwMnglMDJ4IixpcFs0XSxpcFs1XSxpcFs2XSxpcFs3XSk7CisgICAgICB9CisgICAgICBlbWl0KGYsIlxuIik7CisgICAgfQorICAgIGZpcnN0ZnBjPXAtPm5leHQ7CisgICAgZnJlZShwKTsKKyAgfQorfQordm9pZCBjbGVhbnVwX2RiKEZJTEUgKmYpCit7CisgIGR3YXJmMl9jbGVhbnVwKGYpOworICBpZihmKSBzZWN0aW9uPS0xOworfQorLyogbWFyayBpbnN0cnVjdGlvbnMgd2hpY2ggY2FuIChwcm9iYWJseSkgYmUgaW1wbGVtZW50ZWQgd2l0aCBmYXN0ZXIKKyAgIG1hY2hpbmUtY29kZSB0aGFuIHRoZSBJQyBtaWdoIHN1Z2dlc3QsIGUuZy4gYW4gYWRkaXRpb24gd2hpY2ggY2FuCisgICBiZSBtZXJnZWQgd2l0aCBhIGxvYWQgYnogdXNlIG9mIHRhcmdldCBhZGRyZXNzaW5nLW1vZGVzOworICAgdGhlIG9wdGltaXplciBzaG91bGQgaGVzaXRhdGUgdG8gbW9kaWZ6IHN1Y2ggaW5zdHJ1Y3Rpb25zIGlmIGl0J3Mgbm90CisgICBhIGRlZmluaXRlIHdpbiAqLworCitzdGF0aWMgaW50IGlzX3NpbmdsZV9lZmZfaWMoc3RydWN0IElDICpwKQoreworICBzdHJ1Y3QgVmFyICp2OworICBpZihwLT5jb2RlIT1BRERJMlAmJnAtPmNvZGUhPVNVQklGUCkKKyAgICByZXR1cm4gMDsKKyAgaWYoIShwLT5xMi5mbGFncyZLT05TVCkpeworICAgIGlmKENPTlNFUlZBVElWRV9TUil7CisgICAgICBpZigocC0+cTIuZmxhZ3MmKFZBUnxEUkVGT0JKKSkhPVZBUikKKwlyZXR1cm4gMDsKKyAgICAgIGlmKHAtPnEyLnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQ3x8cC0+cTIudi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKQorCXJldHVybiAwOworICAgIH1lbHNlCisgICAgICByZXR1cm4gMDsKKyAgfQorICBpZigocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSkhPVZBUikKKyAgICByZXR1cm4gMDsKKyAgaWYocC0+cTEudi0+c3RvcmFnZV9jbGFzcz09U1RBVElDfHxwLT5xMS52LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pCisgICAgcmV0dXJuIDA7CisgIGlmKChwLT56LmZsYWdzJihWQVJ8RFJFRk9CSikpIT1WQVIpCisgICAgcmV0dXJuIDA7CisgIGlmKHAtPnoudi0+c3RvcmFnZV9jbGFzcz09U1RBVElDfHxwLT56LnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTikKKyAgICByZXR1cm4gMDsKKyAgdj1wLT56LnY7CisgIGZvcihwPXAtPm5leHQ7cDtwPXAtPm5leHQpeworICAgIGludCBjPXAtPmNvZGU7CisgICAgaWYoYz09TEFCRUx8fChjPj1CRVEmJmM8PUJSQSkpCisgICAgICByZXR1cm4gMDsKKyAgICBpZigocC0+cTEuZmxhZ3MmVkFSKSYmcC0+cTEudj09dil7CisgICAgICBpZihwLT5xMS5mbGFncyZEUkVGT0JKKQorCXJldHVybiAxOworICAgICAgZWxzZQorCXJldHVybiAwOworICAgIH0KKyAgICBpZigocC0+cTIuZmxhZ3MmVkFSKSYmcC0+cTIudj09dil7CisgICAgICBpZihwLT5xMi5mbGFncyZEUkVGT0JKKQorCXJldHVybiAxOworICAgICAgZWxzZQorCXJldHVybiAwOworICAgIH0KKyAgICBpZigocC0+ei5mbGFncyZWQVIpJiZwLT56LnY9PXYpeworICAgICAgaWYocC0+ei5mbGFncyZEUkVGT0JKKQorCXJldHVybiAxOworICAgICAgZWxzZQorCXJldHVybiAwOworICAgIH0KKyAgfQorfQordm9pZCBtYXJrX2VmZl9pY3Modm9pZCkKK3sKKyAgc3RydWN0IElDICpwOworICBmb3IocD1maXJzdF9pYztwO3A9cC0+bmV4dCl7CisgICAgaWYoaXNfc2luZ2xlX2VmZl9pYyhwKSkKKyAgICAgIHAtPmZsYWdzfD1FRkZfSUM7CisgICAgZWxzZQorICAgICAgcC0+ZmxhZ3MmPX5FRkZfSUM7CisgIH0KK30KKworY2hhciAqdXNlX2xpYmNhbGwoaW50IGMsaW50IHQsaW50IHQyKQoreworICBzdGF0aWMgY2hhciBmbmFtZVszMl07CisgIGNoYXIgKnJldD0wOworCisgIGlmKE9MRExJQkNBTExTKSByZXR1cm4gMDsKKworICBpZigodCZOUSk9PUxMT05HKXsKKyAgICByZXQ9Zm5hbWU7CisgICAgaWYoYz09TVVMVCkKKyAgICAgIHNwcmludGYoZm5hbWUsIl9fbXVsaW50NjQiKTsKKyAgICBlbHNlIGlmKGM9PURJVikKKyAgICAgIHNwcmludGYoZm5hbWUsIl9fZGl2JWNpbnQ2NCIsKHQmVU5TSUdORUQpPyd1JzoncycpOworICAgIGVsc2UgaWYoYz09TU9EKQorICAgICAgc3ByaW50ZihmbmFtZSwiX19tb2QlY2ludDY0IiwodCZVTlNJR05FRCk/J3UnOidzJyk7CisgICAgZWxzZSBpZihjPT1SU0hJRlQpCisgICAgICBzcHJpbnRmKGZuYW1lLCJfX3JzaCVjaW50NjQiLCh0JlVOU0lHTkVEKT8ndSc6J3MnKTsKKyAgICBlbHNlIGlmKGM9PUxTSElGVCkKKyAgICAgIHNwcmludGYoZm5hbWUsIl9fbHNoaW50NjQiKTsKKyAgICBlbHNlCisgICAgICByZXQ9MDsKKyAgfQorICByZXR1cm4gcmV0OworfQorCisKKworI2lmIEhBVkVfT1NFSworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9tYWNoaW5lcy9wcGMvbWFjaGluZS5kdCBiL21hY2hpbmVzL3BwYy9tYWNoaW5lLmR0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUyNmM4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9wcGMvbWFjaGluZS5kdApAQCAtMCwwICsxLDE2IEBACitTOEJTCitTOEJVCitTMTZCU0JFIFMxNkJTTEUKK1MxNkJVQkUgUzE2QlVMRQorUzMyQlNCRSBTMzJCU0xFCitTMzJCVUJFIFMzMkJVTEUKK1MzMkJTQkUgUzMyQlNMRQorUzMyQlVCRSBTMzJCVUxFCitTNjRCU0JFIFM2NEJTTEUKK1M2NEJVQkUgUzY0QlVMRQorUzMyQklFRUVCRQorUzY0QklFRUVCRQorUzY0QklFRUVCRQorUzMyQlVCRSBTMzJCVUxFCisKKwpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvcHBjL21hY2hpbmUuaCBiL21hY2hpbmVzL3BwYy9tYWNoaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjAyNjU0YwotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL3BwYy9tYWNoaW5lLmgKQEAgLTAsMCArMSwxMzcgQEAKKy8qICBFeGFtcGxlIG9mIGEgY29kZS1nZW5lcmF0b3IgZm9yIGEgUG93ZXJQQyAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2luY2x1ZGUgImR0LmgiCisKKy8qICBUaGlzIHN0cnVjdCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgbWFjaGluZS1zcGVjaWZpYyAgICAgICAgICAgKi8KKy8qICBhZGRyZXNzaW5nLW1vZGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3QgdXNlZCBpbiB0aGlzIGNvZGUtZ2VuZXJyYXRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0cnVjdCBBZGRyZXNzaW5nTW9kZXsKKyAgICBpbnQgZmxhZ3M7CisgICAgaW50IGJhc2U7CisgICAgbG9uZyBvZmZzZXQ7Cit9OworCisvKiAgVGhlIG51bWJlciBvZiByZWdpc3RlcnMgb2YgdGhlIHRhcmdldCBtYWNoaW5lLiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1BWFIgODcKKworLyogIE51bWJlciBvZiBjb21tYW5kbGluZS1vcHRpb25zIHRoZSBjb2RlLWdlbmVyYXRvciBhY2NlcHRzLiAgICAgICAqLworI2RlZmluZSBNQVhHRiAzMAorCisvKiAgSWYgdGhpcyBpcyBzZXQgdG8gemVybyB2YmNjIHdpbGwgbm90IGdlbmVyYXRlIElDcyB3aGVyZSB0aGUgICAgICovCisvKiAgdGFyZ2V0IG9wZXJhbmQgaXMgdGhlIHNhbWUgYXMgdGhlIDJuZCBzb3VyY2Ugb3BlcmFuZC4gICAgICAgICAgICovCisvKiAgVGhpcyBjYW4gc29tZXRpbWVzIHNpbXBsaWZ5IHRoZSBjb2RlLWdlbmVyYXRvciwgYnV0IHVzdWFsbHkgICAgICovCisvKiAgdGhlIGNvZGUgaXMgYmV0dGVyIGlmIHRoZSBjb2RlLWdlbmVyYXRvciBhbGxvd3MgaXQuICAgICAgICAgICAgICovCisjZGVmaW5lIFVTRVEyQVNaIDEKKworLyogIFRoaXMgc3BlY2lmaWVzIHRoZSBzbWFsbGVzdCBpbnRlZ2VyIHR5cGUgdGhhdCBjYW4gYmUgYWRkZWQgdG8gYSAqLworLyogIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNSU5BRERJMlAgSU5UCisKKy8qICBUaGlzIHNwZWNpZmllcyB0aGUgbGFyZ2VzdCBpbnRlZ2VyIHR5cGUgdGhhdCBjYW4gYmUgYWRkZWQgdG8gYSAgKi8KKy8qICBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFYQURESTJQIExPTkcKKworI2RlZmluZSBIQVZFX0lOVF9TSVpFVCAxCisKKy8qICBJZiB0aGUgYnl0ZXMgb2YgYW4gaW50ZWdlciBhcmUgb3JkZXJlZCBtb3N0IHNpZ25pZmljYW50IGJ5dGUgICAgKi8KKy8qICBieXRlIGZpcnN0IGFuZCB0aGVuIGRlY3JlYXNpbmcgc2V0IEJJR0VORElBTiB0byAxLiAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHRU5ESUFOIDEKKworLyogIElmIHRoZSBieXRlcyBvZiBhbiBpbnRlZ2VyIGFyZSBvcmRlcmVkIGxlc3Qgc2lnbmlmaWNhbnQgYnl0ZSAgICAqLworLyogIGJ5dGUgZmlyc3QgYW5kIHRoZW4gaW5jcmVhc2luZyBzZXQgTElUVExFRU5ESUFOIHRvIDEuICAgICAgICAgICAqLworI2RlZmluZSBMSVRUTEVFTkRJQU4gMAorCisvKiAgTm90ZSB0aGF0IEJJR0VORElBTiBhbmQgTElUVExFRU5ESUFOIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICAgICovCisKKy8qICBJZiBzd2l0Y2gtc3RhdGVtZW50cyBzaG91bGQgYmUgZ2VuZXJhdGVkIGFzIGEgc2VxdWVuY2Ugb2YgICAgICAgKi8KKy8qICBTVUIsVFNULEJFUSBJQ3MgcmF0aGVyIHRoYW4gQ09NUEFSRSxCRVEgSUNzIHNldCB0aGlzIHRvIDEuICAgICAgKi8KKy8qICBUaGlzIGNhbiB5aWVsZCBiZXR0ZXIgY29kZSBvbiBzb21lIG1hY2hpbmVzLiAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1dJVENIU1VCUyAwCisKKy8qICBJbiBvcHRpbWl6aW5nIGNvbXBpbGF0aW9uIGNlcnRhaW4gbGlicmFyeSBtZW1jcHkvc3RyY3B5LWNhbGxzICAgKi8KKy8qICB3aXRoIGxlbmd0aCBrbm93biBhdCBjb21waWxlLXRpbWUgd2lsbCBiZSBpbmxpbmVkIHVzaW5nIGFuICAgICAgKi8KKy8qICBBU1NJR04tSUMgaWYgdGhlIHNpemUgaXMgbGVzcyBvciBlcXVhbCB0byBJTkxJTkVNRU1DUFkuICAgICAgICAgKi8KKy8qICBUaGUgdHlwZSB1c2VkIGZvciB0aGUgQVNTSUdOLUlDIHdpbGwgYmUgVU5TSUdORUR8Q0hBUi4gICAgICAgICAgKi8KKyNkZWZpbmUgSU5MSU5FTUVNQ1BZIDI1NgorCisvKiAgUGFyYW1ldGVycyBhcmUgc29tZXRpbWVzIHBhc3NlZCBpbiByZWdpc3RlcnMgd2l0aG91dCBfX3JlZy4gICAgICovCisjZGVmaW5lIEhBVkVfUkVHUEFSTVMgMQorCisvKiAgUGFyYW1ldGVycyBvbiB0aGUgc3RhY2sgc2hvdWxkIGJlIHB1c2hlZCBpbiBvcmRlciByYXRoZXIgdGhhbiAgICovCisvKiAgaW4gcmV2ZXJzZSBvcmRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9SREVSRURfUFVTSCAxCisKKy8qICBTdHJ1Y3R1cmUgZm9yIHJlZ19wYXJtKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0cnVjdCByZWdfaGFuZGxleworICAgIHVuc2lnbmVkIGxvbmcgZ3JlZ3M7CisgICAgdW5zaWduZWQgbG9uZyBmcmVnczsKK307CisKKy8qICBXZSBoYXZlIHNvbWUgdGFyZ2V0LXNwZWNpZmljIHZhcmlhYmxlIGF0dHJpYnV0ZXMuICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9UQVJHRVRfQVRUUklCVVRFUworCisvKiBXZSBoYXZlIHRhcmdldC1zcGVjaWZpYyBwcmFnbWFzICovCisjZGVmaW5lIEhBVkVfVEFSR0VUX1BSQUdNQVMKKworLyogIFdlIGtlZXAgdHJhY2sgb2YgYWxsIHJlZ2lzdGVycyBtb2RpZmllZCBieSBhIGZ1bmN0aW9uLiAgICAgICAgICAqLworI2RlZmluZSBIQVZFX1JFR1NfTU9ESUZJRUQgMQorCisjZGVmaW5lIEhBVkVfVEFSR0VUX1JBTExPQyAxCisjZGVmaW5lIGNvc3RfbW92ZV9yZWcoeCx5KSAxCisjZGVmaW5lIGNvc3RfbG9hZF9yZWcoeCx5KSAyCisjZGVmaW5lIGNvc3Rfc2F2ZV9yZWcoeCx5KSAyCisjZGVmaW5lIGNvc3RfcHVzaHBvcF9yZWcoeCkgMworCisvKiBzaXplIG9mIGJ1ZmZlciBmb3IgYXNtLW91dHB1dCAqLworI2RlZmluZSBFTUlUX0JVRl9MRU4gMTAyNCAvKiBzaG91bGQgYmUgZW5vdWdoICovCisvKiBudW1iZXIgb2YgYXNtLW91dHB1dCBsaW5lcyBidWZmZXJlZCAqLworI2RlZmluZSBFTUlUX0JVRl9ERVBUSCA0CisKKy8qICBXZSBoYXZlIG5vIGFzbV9wZWVwaG9sZSB0byBvcHRpbWl6ZSBhc3NlbWJseS1vdXRwdXQgKi8KKyNkZWZpbmUgSEFWRV9UQVJHRVRfUEVFUEhPTEUgMAorCisvKiB3ZSBoYXZlIGEgbWFya19lZmZfaWNzIGZ1bmN0aW9uICovCisjZGVmaW5lIEhBVkVfVEFSR0VUX0VGRl9JQyAxCisKKy8qIHdlIGhhdmUgcmVnaXN0ZXItcGFpcnMgKi8KKyNkZWZpbmUgSEFWRV9SRUdQQUlSUyAxCisKKyNkZWZpbmUgSlVNUF9UQUJMRV9ERU5TSVRZIDAuOAorI2RlZmluZSBKVU1QX1RBQkxFX0xFTkdUSCAxMgorCisvKiBUaGlzIHR5cGUgd2lsbCBiZSBhZGRlZCB0byBldmVyeSBJQy4gQ2FuIGJlIHVzZWQgYnkgdGhlIGNnLiAgICAgICovCisjZGVmaW5lIEhBVkVfRVhUX0lDIDEKK3N0cnVjdCBleHRfaWMgeworICBpbnQgc2V0Y2M7Cit9OworCisvKiBPU0VLIHN1cHBvcnQgKi8KKyNkZWZpbmUgSEFWRV9PU0VLIDEKKworLyogV2UgdXNlIGJ1aWx0aW4gbGliY2FsbHMgZm9yIHNvbWUgb3BlcmF0aW9ucyAqLworI2RlZmluZSBIQVZFX0xJQkNBTExTIDEKKworLyogc3VwcG9ydCBmb3IgdmFyaWFibGUtbGVuZ3RoIGFycmF5cyAqLworI2RlZmluZSBBTExPQ1ZMQV9SRUcgNAorI2lmIDAKKyNkZWZpbmUgQUxMT0NWTEFfSU5MSU5FQVNNICJcdGx3elx0MCwwKDEpXG4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0YWRkaVx0MywzLDdcbiJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRzcndpXHQzLDMsM1xuIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdHNsd2lcdDMsMywzXG4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0bmVnXHQxMSwzXG4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0c3ViXHQzLDEsM1xuIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdHN1YmlcdDExLDExLDhcbiJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRzdHd1eFx0MCwxLDExIgorI2VuZGlmCisjZGVmaW5lIEFMTE9DVkxBX0lOTElORUFTTSAiXHRsd3pcdDAsMCgxKVxuIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdG5lZ1x0MywzXG4iXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0c3J3aVx0MywzLDNcbiJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRzbHdpXHQzLDMsM1xuIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdHN0d3V4XHQwLDEsM1xuIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdGFkZGlcdDMsMSxfX19fZm8iCisjZGVmaW5lIEZSRUVWTEFfUkVHIDYKKyNkZWZpbmUgRlJFRVZMQV9JTkxJTkVBU00gIlx0bHd6XHQwLDAoMSlcbiJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICJcdG1yXHQxLDVcbiJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICJcdHN0d1x0MCwwKDEpIgorI2RlZmluZSBPTERTUFZMQV9JTkxJTkVBU00gIlx0bXJcdDMsMSIKKyNkZWZpbmUgRlBWTEFfUkVHIDMyCmRpZmYgLS1naXQgYS9tYWNoaW5lcy9wcGMvc2NoZWR1bGUuYyBiL21hY2hpbmVzL3BwYy9zY2hlZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU3MTcyZDMKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9wcGMvc2NoZWR1bGUuYwpAQCAtMCwwICsxLDExNTggQEAKKy8qCisgKiB2c2NwcGMKKyAqCisgKiB2YmNjIFBvd2VyUEMgc2NoZWR1bGVyCisgKiAoQykxOTk4LTIwMDEgYnkgRnJhbmsgV2lsbGUgPGZyYW5rQHBob2VuaXgub3dsLmRlPgorICoKKyAqIHZzY3BwYyBpcyBmcmVld2FyZSBhbmQgcGFydCBvZiB0aGUgcG9ydGFibGUgYW5kIHJldGFyZ2V0YWJsZSBBTlNJIEMKKyAqIGNvbXBpbGVyIHZiY2MsIGNvcHlyaWdodCAoYykgMTk5NS05OCBieSBWb2xrZXIgQmFydGhlbG1hbm4uCisgKiB2c2NwcGMgbWF5IGJlIGZyZWVseSByZWRpc3RyaWJ1dGVkIGFzIGxvbmcgYXMgbm8gbW9kaWZpY2F0aW9ucyBhcmUKKyAqIG1hZGUgYW5kIG5vdGhpbmcgaXMgY2hhcmdlZCBmb3IgaXQuIE5vbi1jb21tZXJjaWFsIHVzYWdlIGlzIGFsbG93ZWQKKyAqIHdpdGhvdXQgYW55IHJlc3RyaWN0aW9ucy4KKyAqIEVWRVJZIFBST0RVQ1QgT1IgUFJPR1JBTSBERVJJVkVEIERJUkVDVExZIEZST00gTVkgU09VUkNFIE1BWSBOT1QgQkUKKyAqIFNPTEQgQ09NTUVSQ0lBTExZIFdJVEhPVVQgUEVSTUlTU0lPTiBGUk9NIFRIRSBBVVRIT1IuCisgKgorICogSGlzdG9yeToKKyAqIFYwLjUgICAxNC1GZWItMDEKKyAqICAgICAgICBGU0NQUiBpcyBubyBsb25nZXIgbWFya2VkIGFzIHVzZWQvbW9kaWZpZWQsIHdoaWNoIGFsbG93cyB0aGUKKyAqICAgICAgICBzY2hlZHVsZXIgdG8gcmVhcnJhbmdlIGFsbCBGUFUgaW5zdHJ1Y3Rpb25zLiBBcyBhIGNvbnNlcXVlbmNlLCB0aGUKKyAqICAgICAgICBvbmx5IGluc3RydWN0aW9uIHJlYWRpbmcgRlBTQ1IsIG1mZnMsIGhhcyB0byBiZSBtYXJrZWQgYXMgYmFycmllci4KKyAqIFYwLjQgICAwMS1EZWMtOTkKKyAqICAgICAgICA2MDNlIFBJRDcgc2VlbXMgdG8gaGF2ZSBhIGxhdGVuY3kgb2YgMjAgaW5zdGVhZCAzNyBmb3IKKyAqICAgICAgICB0aGUgImRpdiIgaW5zdHJ1Y3Rpb24gKHNvdXJjZTogTWljaGFsIEJhcnRjemFrKS4KKyAqIFYwLjNiICAzMC1KdWwtOTgKKyAqICAgICAgICBjcnh4eCBpbnN0cnVjdGlvbnMgdXNlZC9tb2RpZmllZCB3cm9uZyBDQ1JzLgorICogVjAuM2EgIDIxLUp1bC05OAorICogICAgICAgICJsYSIgaW5zdHJ1Y3Rpb24gd2FzIG5vdCByZWNvZ25pemVkLgorICogVjAuMyAgIDIwLUp1bC05OAorICogICAgICAgIFRhcmdldC1zcGVjaWZpYyBvcHRpb25zIHZpYSBzY2hlZF9vcHRpb24oKSByZW1vdmVkLiBPcHRpb25zCisgKiAgICAgICAgYXJlIHBhc3NlZCBpbiB0aGUgYXNzZW1ibGVyIHNvdXJjZSwgZS5nLiAiI3ZzYyBlbGYiLgorICogICAgICAgIERpZmZlcmVudGlhdGlvbiBiZXR3ZWVuIDYwMyBhbmQgNjA0IChzZWxlY3RlZCBieSAiI3ZzYyBjcHUiKS4KKyAqICAgICAgICBOb3csIHNjaGVkdWxpbmcgdGFrZXMgcGxhY2Ugd2l0aCByZWdhcmQgdG8gdGhlIHJlYWwgUG93ZXJQQworICogICAgICAgIGFyY2hpdGVjdHVyZS4KKyAqIFYwLjIgICAxMi1KdWwtOTgKKworICogICAgICAgIE9wdGlvbiAiLWVsZiIgbGV0cyB0aGUgc2NoZWR1bGVyIGFjY2VwdCBFTEYvU1ZSNCBzb3VyY2VzLAorICogICAgICAgIHdoaWNoIG9ubHkgdXNlIG51bWJlcnMgaW5zdGVhZCBvZiBmdWxsIHJlZ2lzdGVyIG5hbWVzLgorICogICAgICAgIFRhcmdldC1zcGVjaWZpYyBvcHRpb25zIHJlcXVpcmUgYSBtb2RpZmljYXRpb24gaW4gdGhlCisgKiAgICAgICAgcG9ydGFibGUgc2NoZWR1bGVyIHBhcnQgdnNjLmMuCisgKiBWMC4xICAgMTAtSnVsLTk4CisgKiAgICAgICAgdnNjcHBjIHNlZW1zIHRvIGJlIHN0YWJsZSwgYWZ0ZXIgc29tZSB0ZXN0cy4KKyAqICAgICAgICBIb3dldmVyLCBpdCBzdGlsbCBuZWVkcyBhIGxvdCBvZiBmaW5lIHR1bmluZyAobXkgUG93ZXJQQworICogICAgICAgIGRvY3MgYXJlIGF0IGhvbWUpLgorICogICAgICAgIEEgZGlmZmVyZW50aWF0aW9uIGJldHdlZW4gdGhlIFBQQyBDUFVzICg2MDNlLCA2MDRlKSBpcyBtaXNzaW5nLgorICogVjAuMCAgIDA5LUp1bC05OAorICogICAgICAgIEZpbGUgY3JlYXRlZC4KKyAqCisgKi8KKworI2luY2x1ZGUgInZzYy5oIgorCitjaGFyIHRnX2NvcHlyaWdodFtdPSJQb3dlclBDIHNjaGVkdWxlciBWMC41IChjKSBpbiAxOTk4LTIwMDEgYnkgRnJhbmsgV2lsbGUiOworCitzdGF0aWMgaW50IGVsZj0wLGNwdT02MDQ7CisKKworCitpbnQgc2NoZWRfaW5pdCh2b2lkKQoreworICByZXR1cm4gKDEpOworfQorCisKK3ZvaWQgc2NoZWRfY2xlYW51cCh2b2lkKQoreworfQorCisKK3N0YXRpYyB2b2lkIHNjaGVkX29wdGlvbihjaGFyICpzKQoreworICBpZiAoIXN0cm5jbXAocywiZWxmIiwzKSkgeworICAgIGVsZiA9IDE7CisgIH0KKyAgZWxzZSBpZiAoIXN0cm5jbXAocywiY3B1ICIsNCkpIHsKKyAgICBpZiAoIXN0cm5jbXAocys0LCI2MDMiLDMpKQorICAgICAgY3B1ID0gNjAzOworICAgIGVsc2UgaWYgKCFzdHJuY21wKHMrNCwiNjA0IiwzKSkKKyAgICAgIGNwdSA9IDYwNDsKKyAgfQorfQorCisKK3N0YXRpYyBjaGFyICpzdHJlc3QoY2hhciAqcyxpbnQgbikKKy8qIHJldHVybnMgcHRyIHRvIHRoZSBsYXN0IG4gY2hhcmFjdGVycyBvZiBzdHJpbmcgcyAqLworeworICByZXR1cm4gKHMgKyBzdHJsZW4ocykgLSBuKTsKK30KKworCitzdGF0aWMgaW50IHNldGxhYihzdHJ1Y3Qgc2luZm8gKnAsY2hhciAqbGFiKQorLyogY2hlY2sgZm9yIGEgdmFsaWQgbG9jYWwgbGFiZWwgKi8KK3sKKyAgaW50IGk7CisKKyAgaWYgKHNzY2FuZihsYWIsZWxmPyIubCVkIjoibCVkIiwmaSkgPT0gMSkgeworICAgIHAtPmxhYmVsID0gaTsKKyAgICByZXR1cm4gKDEpOworICB9CisgIHJldHVybiAoMCk7Cit9CisKKworc3RhdGljIGludCBsc3JlZyhjaGFyICpzKQorLyogY2hlY2tzIHRoZSBvcGVyYW5kIGZvciBsb2FkL3N0b3JlIGFkZHJlc3NpbmcgbW9kZSBhbmQgcmV0dXJucyAqLworLyogdGhlIGJhc2UgcmVnaXN0ZXIgb24gc3VjY2VzcywgLTEgb3RoZXJ3aXNlICovCit7CisgIGNoYXIgKnAgPSAocytzdHJsZW4ocykpLTE7CisgIGludCBxOworCisgIHdoaWxlIChwPnMgJiYgKnAhPScoJykKKyAgICAtLXA7CisgIGlmIChzc2NhbmYocCxlbGY/IiglZCkiOiIociVkKSIsJnEpID09IDEpCisgICAgcmV0dXJuIChxKTsKKyAgcmV0dXJuICgtMSk7Cit9CisKKworaW50IHNjaGVkX2luZm8oc3RydWN0IHNpbmZvICpwKQoreworICBjaGFyIGJ1ZlsxNl0sb3Blcls0MF0sYzsKKyAgaW50IHExLHEyLHEzLHosaSx4LG47CisKKyAgLyogY2hlY2sgZm9yIHZzY3BwYyBzcGVjaWZpYyBvcHRpb25zIGluIHRoZSBzb3VyY2UgKi8KKyAgaWYgKCFzdHJuY21wKHAtPnR4dCwiI3ZzYyAiLDUpKSB7CisgICAgc2NoZWRfb3B0aW9uKHAtPnR4dCs1KTsKKyAgICBwLT5mbGFncyA9IEJBUlJJRVI7CisgICAgcmV0dXJuICgxKTsKKyAgfQorCisgIGlmICghc3RybmNtcChwLT50eHQsIiNiYXJyaWVyIiw4KSkgeworICAgIC8qIGFuIGFydGlmaWNpYWwgYmFycmllciwgdXNlZCBlLmcuIGZvciBpbmxpbmUtY29kZSAqLworICAgIHAtPmZsYWdzID0gQkFSUklFUjsKKyAgICByZXR1cm4gKDEpOworICB9CisKKyAgaWYgKHNzY2FuZihwLT50eHQsIiAuJTE1cyAlMzlzIixidWYsb3BlcikgPj0gMSkgeworICAgIC8qIGFzc2VtYmxlciBkaXJlY3RpdmUgb3IgbWFjcm8gKi8KKyAgICBwLT5mbGFncyA9IEJBUlJJRVI7CisgICAgcmV0dXJuICgxKTsKKyAgfQorCisgIGlmIChzc2NhbmYocC0+dHh0LGVsZj8iLmwlZDoiOiJsJWQ6IiwmaSkgPT0gMSkgeworICAgIC8qIGEgbG9jYWwgbGFiZWwgKi8KKyAgICBwLT5sYWJlbCA9IGk7CisgICAgcC0+ZmxhZ3MgPSBMQUJFTDsKKyAgICByZXR1cm4gKDEpOworICB9CisKKyAgaWYgKHNzY2FuZihwLT50eHQsIiBtZmZzJTE1cyAlMzlzIixidWYsb3BlcikgPj0gMSkgeworICAgIC8qIG1mZnMgcmVhZHMgRlBTQ1IgYW5kIHRoZXJlZm9yZSBoYXMgdG8gYmUgdHJlYXRlZCBhcyBhIGJhcnJpZXIsICovCisgICAgLyogYmVjYXVzZSBGUFNDUiBpcyBuZXZlciBtYXJrZWQgYXMgdXNlZCBieSB0aGUgc2NoZWR1bGVyICovCisgICAgcC0+ZmxhZ3MgPSBCQVJSSUVSOworICAgIHJldHVybiAoMSk7CisgIH0KKworICBpZiAoKG4gPSBzc2NhbmYocC0+dHh0LCIgYiUxNXMgJTM5cyIsYnVmLG9wZXIpKSA+PSAxKSB7CisgICAgLyogYnJhbmNoIGluc3RydWN0aW9uICovCisgICAgcC0+bGF0ZW5jeSA9IDE7CisgICAgQlNFVChwLT5waXBlcyxCUFUpOworCisgICAgaWYgKG4gPT0gMSkgeworICAgICAgLyogYnJhbmNoIHVuY29uZGl0aW9uYWw6IGIgbGFiZWwgKi8KKyAgICAgIGlmIChzZXRsYWIocCxidWYpKSB7CisgICAgICAgIHAtPmZsYWdzID0gVU5DT05EX0JSQU5DSDsKKyAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICBjaGFyICphID0gc3RyZXN0KGJ1ZiwzKTsKKworICAgICAgLyogcmVqZWN0IGJyYW5jaCBpbnN0cnVjdGlvbnMgZW5kaW5nIHdpdGggKi8KKyAgICAgIC8qICJsciIsICJjdHIiLCAiYSIgb3IgImwiLCBidXQgYWNjZXB0ICJibmwiICovCisgICAgICBpZiAoKHN0cm5jbXAoYSsxLCJsciIsMikgJiYgc3RybmNtcChhLCJjdHIiLDMpICYmCisgICAgICAgICAgICooYSsyKSE9J2wnICYmICooYSsyKSE9J2EnKSB8fAorICAgICAgICAgICFzdHJjbXAoYnVmLCJubCIpKSB7CisKKyAgICAgICAgaWYgKCpidWYgPT0gJ2QnKSB7CisgICAgICAgICAgLyogYmR6Li4uIG9yIGJkbnouLi4gKi8KKyAgICAgICAgICBhID0gb3BlcjsKKyAgICAgICAgICBpZiAoc3RyY21wKGJ1ZiwiZHoiKSAmJiBzdHJjbXAoYnVmLCJkbnoiKSkgeworICAgICAgICAgICAgd2hpbGUgKCphICYmICphIT0nLCcpCisgICAgICAgICAgICAgIGErKzsKKyAgICAgICAgICAgIGlmICgqYSA9PSAnLCcpCisgICAgICAgICAgICAgIGErKzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgYSA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChhKSB7CisgICAgICAgICAgICBpZiAoc2V0bGFiKHAsYSkpIHsKKyAgICAgICAgICAgICAgcC0+ZmxhZ3MgPSBDT05EX0JSQU5DSDsKKyAgICAgICAgICAgICAgQlNFVChwLT5tb2RpZmllcyxDVFIpOworICAgICAgICAgICAgICAvKiBAQEAgdW5hYmxlIHRvIGRldGVybWluZSB0aGUgdXNlZCBDQ1JzIC0gc2V0IGFsbCB0byB1c2VkICovCisgICAgICAgICAgICAgIGZvciAoeD1DQ1I7IHg8KENDUis4KTsgeCsrKQorICAgICAgICAgICAgICAgIEJTRVQocC0+dXNlcyx4KTsKKyAgICAgICAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBlbHNlIGlmICgqYnVmID09ICdjJykgeworICAgICAgICAgIGlmIChzc2NhbmYob3BlciwiJWQsJWQsJXMiLCZxMSwmcTIsYnVmKSA9PSAzKSB7CisgICAgICAgICAgICAvKiBjb25kaXRpb25hbCBicmFuY2g6IGJjIG0sbixsYWJlbCAqLworICAgICAgICAgICAgaWYgKHNldGxhYihwLGJ1ZikpIHsKKyAgICAgICAgICAgICAgcC0+ZmxhZ3MgPSBDT05EX0JSQU5DSDsKKyAgICAgICAgICAgICAgQlNFVChwLT51c2VzLENDUisocTI+PjIpKTsKKyAgICAgICAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvKiBub3JtYWwgY29uZGl0aW9uYWwgYnJhbmNoOiBiPGNvbmQ+IFtjck4sXWxhYmVsICovCisgICAgICAgICAgYSA9IGJ1ZjsKKyAgICAgICAgICBpZiAoc3NjYW5mKG9wZXIsZWxmPyIlZCwlcyI6ImNyJWQsJXMiLCZpLGJ1ZikgIT0gMikgeworICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICBhID0gb3BlcjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNldGxhYihwLGEpKSB7CisgICAgICAgICAgICBwLT5mbGFncyA9IENPTkRfQlJBTkNIOworICAgICAgICAgICAgQlNFVChwLT51c2VzLENDUitpKTsKKyAgICAgICAgICAgIHJldHVybiAoMSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcC0+ZmxhZ3MgPSBCQVJSSUVSOworICAgIHJldHVybiAoMSk7CisgIH0KKworCisgIGlmIChjcHUgPT0gNjAzKSB7CisgICAgLyogc2NoZWR1bGluZyBmb3IgdGhlIFBvd2VyUEMgNjAzICovCisKKyAgICBpZiAoKCFlbGYgJiYgc3NjYW5mKHAtPnR4dCwiICUxNXMgJWMlZCwlMzlzIixidWYsJmMsJnosb3BlcikgPT0gNCkgfHwKKyAgICAgICAgKGVsZiAmJiBzc2NhbmYocC0+dHh0LCIgJTE1cyAlZCwlMzlzIixidWYsJnosb3BlcikgPT0gMykpIHsKKyAgICAgIGlmIChlbGYpIHsKKyAgICAgICAgaWYgKChidWZbMF09PSdsJyAmJiBidWZbMV09PSdmJykgfHwgKGJ1ZlswXT09J3MnICYmIGJ1ZlsyXT09J2YnKSkKKyAgICAgICAgICBjID0gJ2YnOworICAgICAgICBlbHNlCisgICAgICAgICAgYyA9ICdyJzsKKyAgICAgIH0KKyAgICAgIGlmICgocTEgPSBsc3JlZyhvcGVyKSk+PTAgJiYgKGM9PSdyJ3x8Yz09J2YnKSkgeworICAgICAgICAvKiBsb2FkL3N0b3JlIGluc3RydWN0aW9uIC4uLixkKHJRMSkgKi8KKworICAgICAgICBpZiAoIXN0cmNtcChidWYsImxhIikpIHsKKyAgICAgICAgICAvKiBsYSByWixkKHJRMSkgaXMgdGhlIHNhbWUgYXM6IGFkZGkgclosclExLGQgKi8KKyAgICAgICAgICBwLT5sYXRlbmN5ID0gMTsKKyAgICAgICAgICBCU0VUKHAtPnBpcGVzLElVKTsKKyAgICAgICAgICBCU0VUKHAtPnBpcGVzLFNSVSk7ICAvKiBhZGRpIG1heSBhbHNvIGV4ZWN1dGUgaW4gU1JVICovCisgICAgICAgICAgQlNFVChwLT51c2VzLEdQUitxMSk7CisgICAgICAgICAgQlNFVChwLT5tb2RpZmllcyxHUFIreik7CisgICAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgICAgfQorCisgICAgICAgIEJTRVQocC0+cGlwZXMsTFNVKTsKKyAgICAgICAgaWYgKCooc3RyZXN0KGJ1ZiwxKSkgPT0gJ3UnKSAgLyogdXBkYXRlIGluc3RydWN0aW9uPyAqLworICAgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsR1BSK3ExKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIEJTRVQocC0+dXNlcyxHUFIrcTEpOworCisgICAgICAgIGlmIChjID09ICdyJykgeworICAgICAgICAgIC8qIGludGVnZXIgbG9hZC9zdG9yZSAqLworCisgICAgICAgICAgaWYgKCFzdHJuY21wKHN0cmVzdChidWYsMiksIm13IiwyKSkgeworICAgICAgICAgICAgLyogbG9hZC9zdG9yZSBtdWx0aXBsZSB3b3JkIHJ6LGkocnExKSAqLworCisgICAgICAgICAgICBpZiAoKmJ1ZiA9PSAnbCcpIHsKKyAgICAgICAgICAgICAgcC0+bGF0ZW5jeSA9IDIrKDMyLXopOworICAgICAgICAgICAgICBmb3IgKHg9ejsgeDwzMjsgeCsrKQorICAgICAgICAgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsR1BSK3gpOworICAgICAgICAgICAgICBCU0VUKHAtPnVzZXMsTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBwLT5sYXRlbmN5ID0gMSsoMzIteik7CisgICAgICAgICAgICAgIGZvciAoeD16OyB4PDMyOyB4KyspCisgICAgICAgICAgICAgICAgQlNFVChwLT51c2VzLEdQUit4KTsKKyAgICAgICAgICAgICAgQlNFVChwLT5tb2RpZmllcyxNRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIGxvYWQvc3RvcmUgaW50ZWdlciByeixpKHJxMSkgKi8KKworICAgICAgICAgICAgcC0+bGF0ZW5jeSA9IDM7CisgICAgICAgICAgICBpZigqYnVmID09ICdsJykgeworICAgICAgICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLEdQUit6KTsKKyAgICAgICAgICAgICAgQlNFVChwLT51c2VzLE1FTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICBCU0VUKHAtPnVzZXMsR1BSK3opOworICAgICAgICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLE1FTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgLyogbG9hZC9zdG9yZSBmbG9hdCBmeixkKHJRMSkgKi8KKworICAgICAgICAgIHAtPmxhdGVuY3kgPSAzOworICAgICAgICAgIGlmKCpidWYgPT0gJ2wnKSB7CisgICAgICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLEZQUit6KTsKKyAgICAgICAgICAgIEJTRVQocC0+dXNlcyxNRU0pOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNleworICAgICAgICAgICAgQlNFVChwLT51c2VzLEZQUit6KTsKKyAgICAgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsTUVNKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKDEpOworICAgICAgfQorICAgIH0KKworICAgIGlmICgoIWVsZiAmJiBzc2NhbmYocC0+dHh0LCIgJTE1cyAlYyVkLHIlZCxyJWQiLGJ1ZiwmYywmeiwmcTEsJnEyKSA9PSA1KSB8fAorICAgICAgICAoZWxmICYmIHNzY2FuZihwLT50eHQsIiAlMTVzICVkLCVkLCVkIixidWYsJnosJnExLCZxMikgPT0gNCkpIHsKKyAgICAgIGlmICgqYnVmPT0nbCcgfHwgKGJ1ZlswXT09J3MnICYmIGJ1ZlsxXT09J3QnKSkgeworICAgICAgICBpZiAoZWxmKSB7CisgICAgICAgICAgaWYgKChidWZbMF09PSdsJyAmJiBidWZbMV09PSdmJykgfHwgKGJ1ZlswXT09J3MnICYmIGJ1ZlsyXT09J2YnKSkKKyAgICAgICAgICAgIGMgPSAnZic7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYyA9ICdyJzsKKyAgICAgICAgfQorCisgICAgICAgIEJTRVQocC0+cGlwZXMsTFNVKTsKKyAgICAgICAgQlNFVChwLT51c2VzLEdQUitxMik7CisgICAgICAgIGlmICghc3RybmNtcChzdHJlc3QoYnVmLDIpLCJ1eCIsMikpICAvKiB1cGRhdGUgaW5zdHJ1Y3Rpb24/ICovCisgICAgICAgICAgQlNFVChwLT5tb2RpZmllcyxHUFIrcTEpOworICAgICAgICBlbHNlCisgICAgICAgICAgQlNFVChwLT51c2VzLEdQUitxMSk7CisKKyAgICAgICAgaWYgKGMgPT0gJ3InKSB7CisgICAgICAgICAgLyogaW50ZWdlciBsb2FkL3N0b3JlICovCisKKyAgICAgICAgICBpZiAoIXN0cm5jbXAoYnVmLCJsc3ciLDMpIHx8ICFzdHJuY21wKGJ1Ziwic3RzdyIsNCkpIHsKKyAgICAgICAgICAgIC8qIGxvYWQvc3RvcmUgc3RyaW5nIHdvcmQgcnoscnExLHJxMi9pbW0gKi8KKyAgICAgICAgICAgIHAtPmZsYWdzID0gQkFSUklFUjsgIC8qIHRvbyBjb21wbGV4Li4uIDspICovCisgICAgICAgICAgICByZXR1cm4gKDEpOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIGxvYWQvc3RvcmUgaW50ZWdlciBpbmRleGVkIHJ6LHJxMSxycTIgKi8KKworICAgICAgICAgICAgcC0+bGF0ZW5jeSA9IDM7CisgICAgICAgICAgICBpZigqYnVmID09ICdsJykgeworICAgICAgICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLEdQUit6KTsKKyAgICAgICAgICAgICAgQlNFVChwLT51c2VzLE1FTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICBpZiAoIXN0cmNtcChidWYsInN0d2N4LiIpKQorICAgICAgICAgICAgICAgIHAtPmxhdGVuY3kgPSA4OworICAgICAgICAgICAgICBCU0VUKHAtPnVzZXMsR1BSK3opOworICAgICAgICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLE1FTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKDEpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGVsc2UgaWYgKGMgPT0gJ2YnKSB7CisgICAgICAgICAgLyogbG9hZC9zdG9yZSBmbG9hdCBpbmRleGVkIGZ6LHJxMSxycTIgKi8KKyAgICAgICAgICBwLT5sYXRlbmN5ID0gMzsKKyAgICAgICAgICBpZigqYnVmID09ICdsJykgeworICAgICAgICAgICAgQlNFVChwLT5tb2RpZmllcyxGUFIreik7CisgICAgICAgICAgICBCU0VUKHAtPnVzZXMsTUVNKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgIEJTRVQocC0+dXNlcyxGUFIreik7CisgICAgICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLE1FTSk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiAoMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3NjYW5mKHAtPnR4dCxlbGYgPyAiIGZjbSUxNXMgJWQsJWQsJWQiIDogIiBmY20lMTVzIGNyJWQsZiVkLGYlZCIsCisgICAgICAgICAgICAgICBidWYsJnosJnExLCZxMikgPT0gNCkgeworICAgICAgLyogZmxvYXRpbmcgcG9pbnQgY29tcGFyZSBDUjAgKi8KKyAgICAgIHAtPmxhdGVuY3kgPSAzOworICAgICAgQlNFVChwLT5waXBlcyxGUFUpOworICAgICAgQlNFVChwLT5tb2RpZmllcyxDQ1Ireik7CisgICAgICAvKkJTRVQocC0+bW9kaWZpZXMsRlBTQ1IpOyovCisgICAgICBCU0VUKHAtPnVzZXMsRlBSK3ExKTsKKyAgICAgIEJTRVQocC0+dXNlcyxGUFIrcTIpOworICAgICAgcmV0dXJuICgxKTsKKyAgICB9CisgICAgaWYgKHNzY2FuZihwLT50eHQsZWxmID8gIiBmY20lMTVzICVkLCVkIiA6ICIgZmNtJTE1cyBmJWQsZiVkIiwKKyAgICAgICAgICAgICAgIGJ1ZiwmcTEsJnEyKSA9PSAzKSB7CisgICAgICAvKiBmbG9hdGluZyBwb2ludCBjb21wYXJlICovCisgICAgICBwLT5sYXRlbmN5ID0gMzsKKyAgICAgIEJTRVQocC0+cGlwZXMsRlBVKTsKKyAgICAgIEJTRVQocC0+bW9kaWZpZXMsQ0NSKTsKKyAgICAgIC8qQlNFVChwLT5tb2RpZmllcyxGUFNDUik7Ki8KKyAgICAgIEJTRVQocC0+dXNlcyxGUFIrcTEpOworICAgICAgQlNFVChwLT51c2VzLEZQUitxMik7CisgICAgICByZXR1cm4gKDEpOworICAgIH0KKworICAgIGlmICgobiA9IHNzY2FuZihwLT50eHQsZWxmID8gIiBmJTE1cyAlZCwlZCwlZCwlZCIgOgorICAgICAgICAgICAgICAgICAgICAiIGYlMTVzIGYlZCxmJWQsZiVkLGYlZCIsYnVmLCZ6LCZxMSwmcTIsJnEzKSk+PTMpIHsKKyAgICAgIC8qIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbiB3aXRoIDIsIDMgb3IgNCBvcGVyYW5kcyAqLworCisjaWYgMAorICAgICAgaWYgKHN0cm5jbXAoYnVmLCJhYnMiLDMpICYmCisgICAgICAgICAgc3RybmNtcChidWYsIm1yIiwyKSAmJgorICAgICAgICAgIHN0cm5jbXAoYnVmLCJuYWJzIiw0KSAmJgorICAgICAgICAgIHN0cm5jbXAoYnVmLCJuZWciLDMpICYmCisgICAgICAgICAgc3RybmNtcChidWYsInNlbCIsMykpCisgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsRlBTQ1IpOyAgLyogb25seSBzb21lIGluc3RyLiBkb24ndCBhbHRlciBGUFNDUiAqLworI2VuZGlmCisKKyAgICAgIGlmICghc3RybmNtcChidWYsImRpdnMiLDQpIHx8CisgICAgICAgICAgIXN0cm5jbXAoYnVmLCJyZXMiLDMpKQorICAgICAgICBwLT5sYXRlbmN5ID0gMTg7CisgICAgICBlbHNlIGlmICghc3RybmNtcChidWYsImRpdiIsMykpCisgICAgICAgIHAtPmxhdGVuY3kgPSAzMzsKKyAgICAgIGVsc2UgaWYgKCFzdHJuY21wKGJ1ZiwibXVsIiwzKSB8fAorICAgICAgICAgICAgICAgIXN0cm5jbXAoYnVmLCJtYWRkIiw0KSB8fAorICAgICAgICAgICAgICAgIXN0cm5jbXAoYnVmLCJtc3ViIiw0KSB8fAorICAgICAgICAgICAgICAgIXN0cm5jbXAoYnVmLCJubWFkZCIsNSkgfHwKKyAgICAgICAgICAgICAgICFzdHJuY21wKGJ1Ziwibm1zdWIiLDUpKQorICAgICAgICBwLT5sYXRlbmN5ID0gNDsKKyAgICAgIGVsc2UKKyAgICAgICAgcC0+bGF0ZW5jeSA9IDM7CisKKyAgICAgIGlmICgqKHN0cmVzdChidWYsMSkpID09ICcuJykKKyAgICAgICAgQlNFVChwLT5tb2RpZmllcyxDQ1IrMSk7CisgICAgICBCU0VUKHAtPnBpcGVzLEZQVSk7CisgICAgICBCU0VUKHAtPnVzZXMsRlBSK3ExKTsKKyAgICAgIGlmIChuID49IDQpIHsKKyAgICAgICAgQlNFVChwLT51c2VzLEZQUitxMik7CisgICAgICAgIGlmIChuID09IDUpCisgICAgICAgICAgQlNFVChwLT51c2VzLEZQUitxMyk7CisgICAgICB9CisgICAgICBCU0VUKHAtPm1vZGlmaWVzLEZQUit6KTsKKyAgICAgIHJldHVybiAoMSk7CisgICAgfQorCisgICAgaWYgKHNzY2FuZihwLT50eHQsZWxmID8gIiBjbSUxNXMgJWQsJWQsJWQiIDogIiBjbSUxNXMgY3IlZCxyJWQsciVkIiwKKyAgICAgICAgYnVmLCZ6LCZxMSwmcTIpID09IDQpIHsKKyAgICAgIC8qIGludGVnZXIgY29tcGFyZSBpbnN0cnVjdGlvbiAqLworICAgICAgcC0+bGF0ZW5jeSA9IDE7CisgICAgICBCU0VUKHAtPnBpcGVzLElVKTsKKyAgICAgIEJTRVQocC0+cGlwZXMsU1JVKTsKKyAgICAgIEJTRVQocC0+bW9kaWZpZXMsQ0NSK3opOworICAgICAgQlNFVChwLT51c2VzLEdQUitxMSk7CisgICAgICBpZiAoKihzdHJlc3QoYnVmLDEpKSAhPSAnaScpCisgICAgICAgIEJTRVQocC0+dXNlcyxHUFIrcTIpOworICAgICAgcmV0dXJuICgxKTsKKyAgICB9CisgICAgaWYgKHNzY2FuZihwLT50eHQsZWxmID8gIiBjbSUxNXMgJWQsJWQiIDogIiBjbSUxNXMgciVkLHIlZCIsCisgICAgICAgIGJ1ZiwmcTEsJnEyKSA9PSAzKSB7CisgICAgICAvKiBpbnRlZ2VyIGNvbXBhcmUgaW5zdHJ1Y3Rpb24gQ1IwICovCisgICAgICBwLT5sYXRlbmN5ID0gMTsKKyAgICAgIEJTRVQocC0+cGlwZXMsSVUpOworICAgICAgQlNFVChwLT5waXBlcyxTUlUpOworICAgICAgQlNFVChwLT5tb2RpZmllcyxDQ1IpOworICAgICAgQlNFVChwLT51c2VzLEdQUitxMSk7CisgICAgICBpZiAoKihzdHJlc3QoYnVmLDEpKSAhPSAnaScpCisgICAgICAgIEJTRVQocC0+dXNlcyxHUFIrcTIpOworICAgICAgcmV0dXJuICgxKTsKKyAgICB9CisKKyAgICBpZiAoIWVsZikgeworICAgICAgaWYgKHNzY2FuZihwLT50eHQsIiBjbSUxNXMgY3IlZCxyJWQsJWQiLGJ1ZiwmeiwmcTEsJmkpID09IDQpIHsKKyAgICAgICAgLyogaW1tZWRpYXRlIGludGVnZXIgY29tcGFyZSBpbnN0cnVjdGlvbiAqLworICAgICAgICBwLT5sYXRlbmN5ID0gMTsKKyAgICAgICAgQlNFVChwLT5waXBlcyxJVSk7CisgICAgICAgIEJTRVQocC0+cGlwZXMsU1JVKTsKKyAgICAgICAgQlNFVChwLT5tb2RpZmllcyxDQ1Ireik7CisgICAgICAgIEJTRVQocC0+dXNlcyxHUFIrcTEpOworICAgICAgICByZXR1cm4gKDEpOworICAgICAgfQorICAgICAgaWYgKHNzY2FuZihwLT50eHQsIiBjbSUxNXMgciVkLCVkIixidWYsJnExLCZpKSA9PSAzKSB7CisgICAgICAgIC8qIGltbWVkaWF0ZSBpbnRlZ2VyIGNvbXBhcmUgaW5zdHJ1Y3Rpb24gQ1IwICovCisgICAgICAgIHAtPmxhdGVuY3kgPSAxOworICAgICAgICBCU0VUKHAtPnBpcGVzLElVKTsKKyAgICAgICAgQlNFVChwLT5waXBlcyxTUlUpOworICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLENDUit6KTsKKyAgICAgICAgQlNFVChwLT51c2VzLEdQUitxMSk7CisgICAgICAgIHJldHVybiAoMSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKChuID0gc3NjYW5mKHAtPnR4dCwiIGNyJTE1cyAlZCwlZCwlZCIsYnVmLCZ6LCZxMSwmcTIpKSA+PSAyKSB7CisgICAgICAvKiBjb25kaXRpb24gY29kZSByZWdpc3RlciBvcGVyYXRpb24gKHZiY2MgdXNlcyB0aGlzIHZlcnNpb24pICovCisgICAgICBwLT5sYXRlbmN5ID0gMTsKKyAgICAgIEJTRVQocC0+cGlwZXMsU1JVKTsKKyAgICAgIEJTRVQocC0+bW9kaWZpZXMsQ0NSKyh6Pj40KSk7CisgICAgICBpZiAobiA+PSAzKSB7CisgICAgICAgIEJTRVQocC0+dXNlcyxDQ1IrKHExPj40KSk7CisgICAgICAgIGlmIChuID09IDQpCisgICAgICAgICAgQlNFVChwLT51c2VzLENDUisocTI+PjQpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAoMSk7CisgICAgfQorCisgICAgaWYgKHNzY2FuZihwLT50eHQsZWxmID8gIiBybHclMTVzICVkLCVkLCVkLCVkLCVkIiA6CisgICAgICAgICAgICAgICAiIHJsdyUxNXMgciVkLHIlZCwlZCwlZCwlZCIsYnVmLCZ6LCZxMSwmaSwmbiwmeCkgPT0gNikgeworICAgICAgLyogcm90YXRlIGxlZnQ6IHJsd2ltaSwgcmx3aW5tLCBybHdubSByMSxyMix4LHkseiAqLworICAgICAgcC0+bGF0ZW5jeSA9IDE7CisgICAgICBCU0VUKHAtPnBpcGVzLElVKTsKKyAgICAgIGlmICgqKHN0cmVzdChidWYsMSkpID09ICcuJykKKyAgICAgICAgQlNFVChwLT5tb2RpZmllcyxDQ1IpOworICAgICAgQlNFVChwLT51c2VzLEdQUitxMSk7CisgICAgICBCU0VUKHAtPm1vZGlmaWVzLEdQUit6KTsKKyAgICAgIHJldHVybiAoMSk7CisgICAgfQorCisgICAgaWYgKHNzY2FuZihwLT50eHQsZWxmID8gIiAlMTVzICVkLCVkLCVjIiA6ICIgJTE1cyByJWQsciVkLCVjIiwKKyAgICAgICAgYnVmLCZ6LCZxMSwmYykgPT0gNCkgeworICAgICAgLyogb3AgcjEscjIsaW1tICovCisgICAgICBpZiAoIXN0cm5jbXAoYnVmLCJhZGRpIiw0KSB8fAorICAgICAgICAgICFzdHJuY21wKGJ1ZiwiYW5kaSIsNCkgfHwKKyAgICAgICAgICAhc3RybmNtcChidWYsIm11bGxpIiw1KSB8fAorICAgICAgICAgICFzdHJuY21wKGJ1Ziwib3JpIiwzKSB8fAorICAgICAgICAgICFzdHJuY21wKGJ1Ziwic2x3aSIsNCkgfHwKKyAgICAgICAgICAhc3RybmNtcChidWYsInNyd2kiLDQpIHx8CisgICAgICAgICAgIXN0cm5jbXAoYnVmLCJzcmF3aSIsNSkgfHwKKyAgICAgICAgICAhc3RybmNtcChidWYsInN1YmkiLDQpIHx8CisgICAgICAgICAgIXN0cm5jbXAoYnVmLCJ4b3JpIiw0KSkgeworICAgICAgICBjaGFyICphID0gc3RyZXN0KGJ1ZiwxKTsKKworICAgICAgICBpZiAoKmJ1ZiA9PSAnbScpICAvKiBtdWxsaSAqLworICAgICAgICAgIHAtPmxhdGVuY3kgPSAzOworICAgICAgICBlbHNlCisgICAgICAgICAgcC0+bGF0ZW5jeSA9IDE7CisgICAgICAgIEJTRVQocC0+cGlwZXMsSVUpOworICAgICAgICBpZiAoIXN0cm5jbXAoYnVmLCJhZGQiLDMpICYmICooYnVmKzQpIT0nYycpCisgICAgICAgICAgQlNFVChwLT5waXBlcyxTUlUpOyAgLyogYWRkaS9hZGRpcyBtYXkgYWxzbyBleGVjdXRlIGluIFNSVSAqLworICAgICAgICBpZiAoKmEgPT0gJy4nKSB7CisgICAgICAgICAgQlNFVChwLT5tb2RpZmllcyxDQ1IpOworICAgICAgICAgIC0tYTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKmEgPT0gJ2MnKQorICAgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsWEVSKTsKKyAgICAgICAgQlNFVChwLT51c2VzLEdQUitxMSk7CisgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsR1BSK3opOworICAgICAgICByZXR1cm4gKDEpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzc2NhbmYocC0+dHh0LGVsZiA/ICIgJTE1cyAlZCwwLCVkIiA6ICIgJTE1cyByJWQsMCxyJWQiLAorICAgICAgICBidWYsJnosJnEyKSA9PSAzKSB7CisgICAgICAvKiBvcCByMSwwLHIzICovCisgICAgICBpZiAoIXN0cm5jbXAoYnVmLCJhZGQiLDMpIHx8CisgICAgICAgICAgIXN0cm5jbXAoYnVmLCJzdWIiLDMpKSB7CisgICAgICAgIHAtPmxhdGVuY3kgPSAxOworICAgICAgICBCU0VUKHAtPnBpcGVzLElVKTsKKyAgICAgICAgaWYgKCooc3RyZXN0KGJ1ZiwxKSkgPT0gJy4nKQorICAgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsQ0NSKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIEJTRVQocC0+cGlwZXMsU1JVKTsgIC8qIGFkZC9hZGRvIG1heSBhbHNvIGV4ZWN1dGUgaW4gU1JVICovCisgICAgICAgIEJTRVQocC0+dXNlcyxHUFIrcTIpOworICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLEdQUit6KTsKKyAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3NjYW5mKHAtPnR4dCxlbGYgPyAiICUxNXMgJWQsJWQsJWQiIDogIiAlMTVzIHIlZCxyJWQsciVkIiwKKyAgICAgICAgYnVmLCZ6LCZxMSwmcTIpID09IDQpIHsKKyAgICAgIC8qIG9wIHIxLHIyLHIzICovCisgICAgICBpZiAoIXN0cm5jbXAoYnVmLCJhZGQiLDMpIHx8CisgICAgICAgICAgIXN0cm5jbXAoYnVmLCJhbmQiLDMpIHx8CisgICAgICAgICAgIXN0cm5jbXAoYnVmLCJkaXYiLDMpIHx8CisgICAgICAgICAgIXN0cm5jbXAoYnVmLCJlcXYiLDMpIHx8CisgICAgICAgICAgIXN0cm5jbXAoYnVmLCJtdWwiLDMpIHx8CisgICAgICAgICAgIXN0cm5jbXAoYnVmLCJuYW5kIiw0KSB8fAorICAgICAgICAgICFzdHJuY21wKGJ1Ziwibm9yIiwzKSB8fAorICAgICAgICAgICFzdHJuY21wKGJ1Ziwib3IiLDIpIHx8CisgICAgICAgICAgIXN0cm5jbXAoYnVmLCJzbCIsMikgfHwKKyAgICAgICAgICAhc3RybmNtcChidWYsInNyIiwyKSB8fAorICAgICAgICAgICFzdHJuY21wKGJ1Ziwic3ViIiwzKSB8fAorICAgICAgICAgICFzdHJuY21wKGJ1ZiwieG9yIiwzKSkgeworICAgICAgICBjaGFyICphID0gc3RyZXN0KGJ1ZiwxKTsKKworICAgICAgICBpZiAoIXN0cm5jbXAoYnVmLCJtdWwiLDMpKSB7CisgICAgICAgICAgaWYgKCooYnVmKzUpID09ICd1JykKKyAgICAgICAgICAgIHAtPmxhdGVuY3kgPSA2OyAgLyogbXVsaHd1IG5lZWRzIDYgY3ljbGVzICovCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcC0+bGF0ZW5jeSA9IDU7CisgICAgICAgICAgaWYgKCooYnVmKzMpID09ICdsJykKKyAgICAgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsWEVSKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghc3RybmNtcChidWYsImRpdiIsMykpIHsKKy8qICAgICAgICAgIHAtPmxhdGVuY3kgPSAzNzsqLworICAgICAgICAgIHAtPmxhdGVuY3kgPSAyMDsgIC8qIDYwM2UgaGFzIDIwIHNpbmNlIFBJRDcgKi8KKyAgICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLFhFUik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHAtPmxhdGVuY3kgPSAxOworICAgICAgICBCU0VUKHAtPnBpcGVzLElVKTsKKyAgICAgICAgaWYgKCFzdHJjbXAoYnVmLCJhZGQiKSB8fCAhc3RyY21wKGJ1ZiwiYWRkbyIpKQorICAgICAgICAgIEJTRVQocC0+cGlwZXMsU1JVKTsgIC8qIGFkZC9hZGRvIG1heSBhbHNvIGV4ZWN1dGUgaW4gU1JVICovCisKKyAgICAgICAgaWYgKCphID09ICcuJykgeworICAgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsQ0NSKTsKKyAgICAgICAgICAtLWE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCphID09ICdvJykgeworICAgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsWEVSKTsKKyAgICAgICAgICAtLWE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCphID09ICdjJykgeworICAgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsWEVSKTsKKyAgICAgICAgICAtLWE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCphID09ICdlJykKKyAgICAgICAgICBCU0VUKHAtPnVzZXMsWEVSKTsKKyAgICAgICAgQlNFVChwLT51c2VzLEdQUitxMSk7CisgICAgICAgIEJTRVQocC0+dXNlcyxHUFIrcTIpOworICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLEdQUit6KTsKKyAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3NjYW5mKHAtPnR4dCxlbGYgPyAiIGwlMTVzICVkLCVjIiA6ICIgbCUxNXMgciVkLCVjIiwKKyAgICAgICAgYnVmLCZ6LCZjKSA9PSAzKSB7CisgICAgICBpZiAoKmJ1ZiA9PSAnaScpIHsKKyAgICAgICAgLyogbGksIGxpcyAtPiBhZGRpLCBhZGRpcyAqLworICAgICAgICBwLT5sYXRlbmN5ID0gMTsKKyAgICAgICAgQlNFVChwLT5waXBlcyxJVSk7CisgICAgICAgIEJTRVQocC0+cGlwZXMsU1JVKTsKKyAgICAgICAgQlNFVChwLT5tb2RpZmllcyxHUFIreik7CisgICAgICAgIHJldHVybiAoMSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHNzY2FuZihwLT50eHQsZWxmID8gIiAlMTVzICVkLCVkIiA6ICIgJTE1cyByJWQsciVkIiwKKyAgICAgICAgYnVmLCZ6LCZxMSkgPT0gMykgeworICAgICAgLyogb3AgcjEscjIgKi8KKyAgICAgIGlmICghc3RybmNtcChidWYsImFkZCIsMykgfHwKKyAgICAgICAgICAhc3RybmNtcChidWYsImV4dHMiLDQpIHx8CisgICAgICAgICAgIXN0cm5jbXAoYnVmLCJtciIsMikgfHwKKyAgICAgICAgICAhc3RybmNtcChidWYsIm5lZyIsMykgfHwKKyAgICAgICAgICAhc3RybmNtcChidWYsInN1YiIsMykpIHsKKyAgICAgICAgY2hhciAqYSA9IHN0cmVzdChidWYsMSk7CisKKyAgICAgICAgcC0+bGF0ZW5jeSA9IDE7CisgICAgICAgIGlmICgqYnVmPT0nYScgfHwgKmJ1Zj09J3MnKQorICAgICAgICAgIEJTRVQocC0+dXNlcyxYRVIpOyAgLyogYWRkbWUvYWRkemUvc3ViZm1lL3N1YmZ6ZS8uLi4gKi8KKyAgICAgICAgQlNFVChwLT5waXBlcyxJVSk7CisgICAgICAgIGlmICgqYSA9PSAnLicpIHsKKyAgICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLENDUik7CisgICAgICAgICAgLS1hOworICAgICAgICB9CisgICAgICAgIGlmICgqYSA9PSAnbycpIHsKKyAgICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLFhFUik7CisgICAgICAgIH0KKyAgICAgICAgQlNFVChwLT51c2VzLEdQUitxMSk7CisgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsR1BSK3opOworICAgICAgICByZXR1cm4gKDEpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzc2NhbmYocC0+dHh0LGVsZj8iIG0lMTVzICVkIjoiIG0lMTVzIHIlZCIsYnVmLCZ6KSA9PSAyKSB7CisgICAgICAvKiBtdHh4eCwgbWZ4eHg6IG1vdmUgZnJvbS90byBzcGVjaWFsIHJlZ2lzdGVycyAqLworICAgICAgaW50IHJlZz0wOworICAKKyAgICAgIGlmICghc3RyY21wKCZidWZbMV0sInhlciIpKQorICAgICAgICByZWcgPSBYRVI7CisgICAgICBlbHNlIGlmICghc3RyY21wKCZidWZbMV0sImN0ciIpKQorICAgICAgICByZWcgPSBDVFI7CisgICAgICBlbHNlIGlmICghc3RyY21wKCZidWZbMV0sImxyIikpCisgICAgICAgIHJlZyA9IExSOworICAgICAgZWxzZSBpZiAoIXN0cm5jbXAoJmJ1ZlsxXSwiZnMiLDIpKQorICAgICAgICByZWcgPSBGUFNDUjsKKyAgICAgIGlmIChyZWcpIHsKKyAgICAgICAgaWYgKHJlZyA9PSBGUFNDUikgeworICAgICAgICAgIHAtPmxhdGVuY3kgPSAzOworICAgICAgICAgIEJTRVQocC0+cGlwZXMsRlBVKTsKKyAgICAgICAgICAvKmlmICgqYnVmID09ICdmJykgeworICAgICAgICAgICAgQlNFVChwLT51c2VzLHJlZyk7CisgICAgICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLHopOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsqLworICAgICAgICAgICAgQlNFVChwLT51c2VzLHopOworICAgICAgICAgICAgQlNFVChwLT5tb2RpZmllcyxyZWcpOworICAgICAgICAgIC8qfSovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgQlNFVChwLT5waXBlcyxTUlUpOworICAgICAgICAgIGlmICgqYnVmID09ICdmJykgeworICAgICAgICAgICAgcC0+bGF0ZW5jeSA9IDE7CisgICAgICAgICAgICBCU0VUKHAtPnVzZXMscmVnKTsKKyAgICAgICAgICAgIEJTRVQocC0+bW9kaWZpZXMseik7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcC0+bGF0ZW5jeSA9IDI7CisgICAgICAgICAgICBCU0VUKHAtPnVzZXMseik7CisgICAgICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLHJlZyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoMSk7CisgICAgICB9CisgICAgfQorICB9CisKKworICBlbHNlIGlmIChjcHUgPT0gNjA0KSB7CisgICAgLyogc2NoZWR1bGluZyBmb3IgdGhlIFBvd2VyUEMgNjA0ICovCisKKyAgICBpZiAoKCFlbGYgJiYgc3NjYW5mKHAtPnR4dCwiICUxNXMgJWMlZCwlMzlzIixidWYsJmMsJnosb3BlcikgPT0gNCkgfHwKKyAgICAgICAgKGVsZiAmJiBzc2NhbmYocC0+dHh0LCIgJTE1cyAlZCwlMzlzIixidWYsJnosb3BlcikgPT0gMykpIHsKKyAgICAgIGlmIChlbGYpIHsKKyAgICAgICAgaWYgKChidWZbMF09PSdsJyAmJiBidWZbMV09PSdmJykgfHwgKGJ1ZlswXT09J3MnICYmIGJ1ZlsyXT09J2YnKSkKKyAgICAgICAgICBjID0gJ2YnOworICAgICAgICBlbHNlCisgICAgICAgICAgYyA9ICdyJzsKKyAgICAgIH0KKyAgICAgIGlmICgocTEgPSBsc3JlZyhvcGVyKSk+PTAgJiYgKGM9PSdyJ3x8Yz09J2YnKSkgeworICAgICAgICAvKiBsb2FkL3N0b3JlIGluc3RydWN0aW9uIC4uLixkKHJRMSkgKi8KKworICAgICAgICBpZiAoIXN0cmNtcChidWYsImxhIikpIHsKKyAgICAgICAgICAvKiBsYSByWixkKHJRMSkgaXMgdGhlIHNhbWUgYXM6IGFkZGkgclosclExLGQgKi8KKyAgICAgICAgICBwLT5sYXRlbmN5ID0gMTsKKyAgICAgICAgICBCU0VUKHAtPnBpcGVzLFNDSVUxKTsKKyAgICAgICAgICBCU0VUKHAtPnBpcGVzLFNDSVUyKTsKKyAgICAgICAgICBCU0VUKHAtPnVzZXMsR1BSK3ExKTsKKyAgICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLEdQUit6KTsKKyAgICAgICAgICByZXR1cm4gKDEpOworICAgICAgICB9CisKKyAgICAgICAgQlNFVChwLT5waXBlcyxMU1UpOworICAgICAgICBpZiAoKihzdHJlc3QoYnVmLDEpKSA9PSAndScpICAvKiB1cGRhdGUgaW5zdHJ1Y3Rpb24/ICovCisgICAgICAgICAgQlNFVChwLT5tb2RpZmllcyxHUFIrcTEpOworICAgICAgICBlbHNlCisgICAgICAgICAgQlNFVChwLT51c2VzLEdQUitxMSk7CisKKyAgICAgICAgaWYgKGMgPT0gJ3InKSB7CisgICAgICAgICAgLyogaW50ZWdlciBsb2FkL3N0b3JlICovCisKKyAgICAgICAgICBpZiAoIXN0cm5jbXAoc3RyZXN0KGJ1ZiwyKSwibXciLDIpKSB7CisgICAgICAgICAgICAvKiBsb2FkL3N0b3JlIG11bHRpcGxlIHdvcmQgcnosaShycTEpICovCisKKyAgICAgICAgICAgIHAtPmxhdGVuY3kgPSAyKygzMi16KTsKKyAgICAgICAgICAgIGlmICgqYnVmID09ICdsJykgeworICAgICAgICAgICAgICBmb3IgKHg9ejsgeDwzMjsgeCsrKQorICAgICAgICAgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsR1BSK3gpOworICAgICAgICAgICAgICBCU0VUKHAtPnVzZXMsTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBmb3IgKHg9ejsgeDwzMjsgeCsrKQorICAgICAgICAgICAgICAgIEJTRVQocC0+dXNlcyxHUFIreCk7CisgICAgICAgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBsb2FkL3N0b3JlIGludGVnZXIgcnosaShycTEpICovCisKKyAgICAgICAgICAgIGlmKCpidWYgPT0gJ2wnKSB7CisgICAgICAgICAgICAgIHAtPmxhdGVuY3kgPSAyOworICAgICAgICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLEdQUit6KTsKKyAgICAgICAgICAgICAgQlNFVChwLT51c2VzLE1FTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICBwLT5sYXRlbmN5ID0gMzsKKyAgICAgICAgICAgICAgQlNFVChwLT51c2VzLEdQUit6KTsKKyAgICAgICAgICAgICAgQlNFVChwLT5tb2RpZmllcyxNRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8qIGxvYWQvc3RvcmUgZmxvYXQgZnosZChyUTEpICovCisKKyAgICAgICAgICBwLT5sYXRlbmN5ID0gMzsKKyAgICAgICAgICBpZigqYnVmID09ICdsJykgeworICAgICAgICAgICAgQlNFVChwLT5tb2RpZmllcyxGUFIreik7CisgICAgICAgICAgICBCU0VUKHAtPnVzZXMsTUVNKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgIEJTRVQocC0+dXNlcyxGUFIreik7CisgICAgICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLE1FTSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCFlbGYgJiYgc3NjYW5mKHAtPnR4dCwiICUxNXMgJWMlZCxyJWQsciVkIixidWYsJmMsJnosJnExLCZxMikgPT0gNSkgfHwKKyAgICAgICAgKGVsZiAmJiBzc2NhbmYocC0+dHh0LCIgJTE1cyAlZCwlZCwlZCIsYnVmLCZ6LCZxMSwmcTIpID09IDQpKSB7CisgICAgICBpZiAoKmJ1Zj09J2wnIHx8IChidWZbMF09PSdzJyAmJiBidWZbMV09PSd0JykpIHsKKyAgICAgICAgaWYgKGVsZikgeworICAgICAgICAgIGlmICgoYnVmWzBdPT0nbCcgJiYgYnVmWzFdPT0nZicpIHx8IChidWZbMF09PSdzJyAmJiBidWZbMl09PSdmJykpCisgICAgICAgICAgICBjID0gJ2YnOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGMgPSAncic7CisgICAgICAgIH0KKworICAgICAgICBCU0VUKHAtPnBpcGVzLExTVSk7CisgICAgICAgIEJTRVQocC0+dXNlcyxHUFIrcTIpOworICAgICAgICBpZiAoIXN0cm5jbXAoc3RyZXN0KGJ1ZiwyKSwidXgiLDIpKSAgLyogdXBkYXRlIGluc3RydWN0aW9uPyAqLworICAgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsR1BSK3ExKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIEJTRVQocC0+dXNlcyxHUFIrcTEpOworCisgICAgICAgIGlmIChjID09ICdyJykgeworICAgICAgICAgIC8qIGludGVnZXIgbG9hZC9zdG9yZSAqLworCisgICAgICAgICAgaWYgKCFzdHJuY21wKGJ1ZiwibHN3IiwzKSB8fCAhc3RybmNtcChidWYsInN0c3ciLDQpKSB7CisgICAgICAgICAgICAvKiBsb2FkL3N0b3JlIHN0cmluZyB3b3JkIHJ6LHJxMSxycTIvaW1tICovCisgICAgICAgICAgICBwLT5mbGFncyA9IEJBUlJJRVI7ICAvKiB0b28gY29tcGxleC4uLiA7KSAqLworICAgICAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBsb2FkL3N0b3JlIGludGVnZXIgaW5kZXhlZCByeixycTEscnEyICovCisKKyAgICAgICAgICAgIGlmKCpidWYgPT0gJ2wnKSB7CisgICAgICAgICAgICAgIHAtPmxhdGVuY3kgPSAyOworICAgICAgICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLEdQUit6KTsKKyAgICAgICAgICAgICAgQlNFVChwLT51c2VzLE1FTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICBwLT5sYXRlbmN5ID0gMzsKKyAgICAgICAgICAgICAgQlNFVChwLT51c2VzLEdQUit6KTsKKyAgICAgICAgICAgICAgQlNFVChwLT5tb2RpZmllcyxNRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBlbHNlIGlmIChjID09ICdmJykgeworICAgICAgICAgIC8qIGxvYWQvc3RvcmUgZmxvYXQgaW5kZXhlZCBmeixycTEscnEyICovCisgICAgICAgICAgcC0+bGF0ZW5jeSA9IDM7CisgICAgICAgICAgaWYoKmJ1ZiA9PSAnbCcpIHsKKyAgICAgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsRlBSK3opOworICAgICAgICAgICAgQlNFVChwLT51c2VzLE1FTSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICBCU0VUKHAtPnVzZXMsRlBSK3opOworICAgICAgICAgICAgQlNFVChwLT5tb2RpZmllcyxNRU0pOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gKDEpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHNzY2FuZihwLT50eHQsZWxmID8gIiBmY20lMTVzICVkLCVkLCVkIiA6ICIgZmNtJTE1cyBjciVkLGYlZCxmJWQiLAorICAgICAgICAgICAgICAgYnVmLCZ6LCZxMSwmcTIpID09IDQpIHsKKyAgICAgIC8qIGZsb2F0aW5nIHBvaW50IGNvbXBhcmUgQ1IwICovCisgICAgICBwLT5sYXRlbmN5ID0gMzsKKyAgICAgIEJTRVQocC0+cGlwZXMsRlBVKTsKKyAgICAgIEJTRVQocC0+bW9kaWZpZXMsQ0NSK3opOworICAgICAgLypCU0VUKHAtPm1vZGlmaWVzLEZQU0NSKTsqLworICAgICAgQlNFVChwLT51c2VzLEZQUitxMSk7CisgICAgICBCU0VUKHAtPnVzZXMsRlBSK3EyKTsKKyAgICAgIHJldHVybiAoMSk7CisgICAgfQorICAgIGlmIChzc2NhbmYocC0+dHh0LGVsZiA/ICIgZmNtJTE1cyAlZCwlZCIgOiAiIGZjbSUxNXMgZiVkLGYlZCIsCisgICAgICAgICAgICAgICBidWYsJnExLCZxMikgPT0gMykgeworICAgICAgLyogZmxvYXRpbmcgcG9pbnQgY29tcGFyZSAqLworICAgICAgcC0+bGF0ZW5jeSA9IDM7CisgICAgICBCU0VUKHAtPnBpcGVzLEZQVSk7CisgICAgICBCU0VUKHAtPm1vZGlmaWVzLENDUik7CisgICAgICAvKkJTRVQocC0+bW9kaWZpZXMsRlBTQ1IpOyovCisgICAgICBCU0VUKHAtPnVzZXMsRlBSK3ExKTsKKyAgICAgIEJTRVQocC0+dXNlcyxGUFIrcTIpOworICAgICAgcmV0dXJuICgxKTsKKyAgICB9CisKKyAgICBpZiAoKG4gPSBzc2NhbmYocC0+dHh0LGVsZiA/ICIgZiUxNXMgJWQsJWQsJWQsJWQiIDoKKyAgICAgICAgICAgICAgICAgICAgIiBmJTE1cyBmJWQsZiVkLGYlZCxmJWQiLGJ1ZiwmeiwmcTEsJnEyLCZxMykpPj0zKSB7CisgICAgICAvKiBmbG9hdGluZyBwb2ludCBvcGVyYXRpb24gd2l0aCAyLCAzIG9yIDQgb3BlcmFuZHMgKi8KKworI2lmIDAKKyAgICAgIGlmIChzdHJuY21wKGJ1ZiwiYWJzIiwzKSAmJgorICAgICAgICAgIHN0cm5jbXAoYnVmLCJtciIsMikgJiYKKyAgICAgICAgICBzdHJuY21wKGJ1ZiwibmFicyIsNCkgJiYKKyAgICAgICAgICBzdHJuY21wKGJ1ZiwibmVnIiwzKSAmJgorICAgICAgICAgIHN0cm5jbXAoYnVmLCJzZWwiLDMpKQorICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLEZQU0NSKTsgIC8qIG9ubHkgc29tZSBpbnN0ci4gZG9uJ3QgYWx0ZXIgRlBTQ1IgKi8KKyNlbmRpZgorCisgICAgICBpZiAoIXN0cm5jbXAoYnVmLCJkaXZzIiw0KSB8fAorICAgICAgICAgICFzdHJuY21wKGJ1ZiwicmVzIiwzKSkKKyAgICAgICAgcC0+bGF0ZW5jeSA9IDE4OworICAgICAgZWxzZSBpZiAoIXN0cm5jbXAoYnVmLCJkaXYiLDMpKQorICAgICAgICBwLT5sYXRlbmN5ID0gMzI7CisgICAgICBlbHNlCisgICAgICAgIHAtPmxhdGVuY3kgPSAzOworCisgICAgICBpZiAoKihzdHJlc3QoYnVmLDEpKSA9PSAnLicpCisgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsQ0NSKzEpOworICAgICAgQlNFVChwLT5waXBlcyxGUFUpOworICAgICAgQlNFVChwLT51c2VzLEZQUitxMSk7CisgICAgICBpZiAobiA+PSA0KSB7CisgICAgICAgIEJTRVQocC0+dXNlcyxGUFIrcTIpOworICAgICAgICBpZiAobiA9PSA1KQorICAgICAgICAgIEJTRVQocC0+dXNlcyxGUFIrcTMpOworICAgICAgfQorICAgICAgQlNFVChwLT5tb2RpZmllcyxGUFIreik7CisgICAgICByZXR1cm4gKDEpOworICAgIH0KKworICAgIGlmIChzc2NhbmYocC0+dHh0LGVsZiA/ICIgY20lMTVzICVkLCVkLCVkIiA6ICIgY20lMTVzIGNyJWQsciVkLHIlZCIsCisgICAgICAgIGJ1ZiwmeiwmcTEsJnEyKSA9PSA0KSB7CisgICAgICAvKiBpbnRlZ2VyIGNvbXBhcmUgaW5zdHJ1Y3Rpb24gKi8KKyAgICAgIHAtPmxhdGVuY3kgPSAxOworICAgICAgQlNFVChwLT5waXBlcyxTQ0lVMSk7CisgICAgICBCU0VUKHAtPnBpcGVzLFNDSVUyKTsKKyAgICAgIEJTRVQocC0+bW9kaWZpZXMsQ0NSK3opOworICAgICAgQlNFVChwLT51c2VzLEdQUitxMSk7CisgICAgICBpZiAoKihzdHJlc3QoYnVmLDEpKSAhPSAnaScpCisgICAgICAgIEJTRVQocC0+dXNlcyxHUFIrcTIpOworICAgICAgcmV0dXJuICgxKTsKKyAgICB9CisgICAgaWYgKHNzY2FuZihwLT50eHQsZWxmID8gIiBjbSUxNXMgJWQsJWQiIDogIiBjbSUxNXMgciVkLHIlZCIsCisgICAgICAgIGJ1ZiwmcTEsJnEyKSA9PSAzKSB7CisgICAgICAvKiBpbnRlZ2VyIGNvbXBhcmUgaW5zdHJ1Y3Rpb24gQ1IwICovCisgICAgICBwLT5sYXRlbmN5ID0gMTsKKyAgICAgIEJTRVQocC0+cGlwZXMsU0NJVTEpOworICAgICAgQlNFVChwLT5waXBlcyxTQ0lVMik7CisgICAgICBCU0VUKHAtPm1vZGlmaWVzLENDUik7CisgICAgICBCU0VUKHAtPnVzZXMsR1BSK3ExKTsKKyAgICAgIGlmICgqKHN0cmVzdChidWYsMSkpICE9ICdpJykKKyAgICAgICAgQlNFVChwLT51c2VzLEdQUitxMik7CisgICAgICByZXR1cm4gKDEpOworICAgIH0KKworICAgIGlmICghZWxmKSB7CisgICAgICBpZiAoc3NjYW5mKHAtPnR4dCwiIGNtJTE1cyBjciVkLHIlZCwlZCIsYnVmLCZ6LCZxMSwmaSkgPT0gNCkgeworICAgICAgICAvKiBpbW1lZGlhdGUgaW50ZWdlciBjb21wYXJlIGluc3RydWN0aW9uICovCisgICAgICAgIHAtPmxhdGVuY3kgPSAxOworICAgICAgICBCU0VUKHAtPnBpcGVzLFNDSVUxKTsKKyAgICAgICAgQlNFVChwLT5waXBlcyxTQ0lVMik7CisgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsQ0NSK3opOworICAgICAgICBCU0VUKHAtPnVzZXMsR1BSK3ExKTsKKyAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgIH0KKyAgICAgIGlmIChzc2NhbmYocC0+dHh0LCIgY20lMTVzIHIlZCwlZCIsYnVmLCZxMSwmaSkgPT0gMykgeworICAgICAgICAvKiBpbW1lZGlhdGUgaW50ZWdlciBjb21wYXJlIGluc3RydWN0aW9uIENSMCAqLworICAgICAgICBwLT5sYXRlbmN5ID0gMTsKKyAgICAgICAgQlNFVChwLT5waXBlcyxTQ0lVMSk7CisgICAgICAgIEJTRVQocC0+cGlwZXMsU0NJVTIpOworICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLENDUit6KTsKKyAgICAgICAgQlNFVChwLT51c2VzLEdQUitxMSk7CisKKyAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKG4gPSBzc2NhbmYocC0+dHh0LCIgY3IlMTVzICVkLCVkLCVkIixidWYsJnosJnExLCZxMikpID49IDIpIHsKKyAgICAgIC8qIGNvbmRpdGlvbiBjb2RlIHJlZ2lzdGVyIG9wZXJhdGlvbiAodmJjYyB1c2VzIHRoaXMgdmVyc2lvbikgKi8KKyAgICAgIHAtPmxhdGVuY3kgPSAxOworICAgICAgQlNFVChwLT5waXBlcyxDUlUpOworICAgICAgQlNFVChwLT5tb2RpZmllcyxDQ1IrKHo+PjQpKTsKKyAgICAgIGlmIChuID49IDMpIHsKKyAgICAgICAgQlNFVChwLT51c2VzLENDUisocTE+PjQpKTsKKyAgICAgICAgaWYgKG4gPT0gNCkKKyAgICAgICAgICBCU0VUKHAtPnVzZXMsQ0NSKyhxMj4+NCkpOworICAgICAgfQorICAgICAgcmV0dXJuICgxKTsKKyAgICB9CisKKyAgICBpZiAoc3NjYW5mKHAtPnR4dCxlbGYgPyAiIHJsdyUxNXMgJWQsJWQsJWQsJWQsJWQiIDoKKyAgICAgICAgICAgICAgICIgcmx3JTE1cyByJWQsciVkLCVkLCVkLCVkIixidWYsJnosJnExLCZpLCZuLCZ4KSA9PSA2KSB7CisgICAgICAvKiByb3RhdGUgbGVmdDogcmx3aW1pLCBybHdpbm0sIHJsd25tIHIxLHIyLHgseSx6ICovCisgICAgICBwLT5sYXRlbmN5ID0gMTsKKyAgICAgIEJTRVQocC0+cGlwZXMsU0NJVTEpOworICAgICAgQlNFVChwLT5waXBlcyxTQ0lVMik7CisgICAgICBpZiAoKihzdHJlc3QoYnVmLDEpKSA9PSAnLicpCisgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsQ0NSKTsKKyAgICAgIEJTRVQocC0+dXNlcyxHUFIrcTEpOworICAgICAgQlNFVChwLT5tb2RpZmllcyxHUFIreik7CisgICAgICByZXR1cm4gKDEpOworICAgIH0KKworICAgIGlmIChzc2NhbmYocC0+dHh0LGVsZiA/ICIgJTE1cyAlZCwlZCwlYyIgOiAiICUxNXMgciVkLHIlZCwlYyIsCisgICAgICAgIGJ1ZiwmeiwmcTEsJmMpID09IDQpIHsKKyAgICAgIC8qIG9wIHIxLHIyLGltbSAqLworICAgICAgaWYgKCFzdHJuY21wKGJ1ZiwiYWRkaSIsNCkgfHwKKyAgICAgICAgICAhc3RybmNtcChidWYsImFuZGkiLDQpIHx8CisgICAgICAgICAgIXN0cm5jbXAoYnVmLCJtdWxsaSIsNSkgfHwKKyAgICAgICAgICAhc3RybmNtcChidWYsIm9yaSIsMykgfHwKKyAgICAgICAgICAhc3RybmNtcChidWYsInNsd2kiLDQpIHx8CisgICAgICAgICAgIXN0cm5jbXAoYnVmLCJzcndpIiw0KSB8fAorICAgICAgICAgICFzdHJuY21wKGJ1Ziwic3Jhd2kiLDUpIHx8CisgICAgICAgICAgIXN0cm5jbXAoYnVmLCJzdWJpIiw0KSB8fAorICAgICAgICAgICFzdHJuY21wKGJ1ZiwieG9yaSIsNCkpIHsKKyAgICAgICAgY2hhciAqYSA9IHN0cmVzdChidWYsMSk7CisKKyAgICAgICAgaWYgKCpidWYgPT0gJ20nKSB7IC8qIG11bGxpICovCisgICAgICAgICAgcC0+bGF0ZW5jeSA9IDM7CisgICAgICAgICAgQlNFVChwLT5waXBlcyxNQ0lVKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBwLT5sYXRlbmN5ID0gMTsKKyAgICAgICAgICBCU0VUKHAtPnBpcGVzLFNDSVUxKTsKKyAgICAgICAgICBCU0VUKHAtPnBpcGVzLFNDSVUyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKmEgPT0gJy4nKSB7CisgICAgICAgICAgQlNFVChwLT5tb2RpZmllcyxDQ1IpOworICAgICAgICAgIC0tYTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKmEgPT0gJ2MnKQorICAgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsWEVSKTsKKyAgICAgICAgQlNFVChwLT51c2VzLEdQUitxMSk7CisgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsR1BSK3opOworICAgICAgICByZXR1cm4gKDEpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzc2NhbmYocC0+dHh0LGVsZiA/ICIgJTE1cyAlZCwwLCVkIiA6ICIgJTE1cyByJWQsMCxyJWQiLAorICAgICAgICBidWYsJnosJnEyKSA9PSAzKSB7CisgICAgICAvKiBvcCByMSwwLHIzICovCisgICAgICBpZiAoIXN0cm5jbXAoYnVmLCJhZGQiLDMpIHx8CisgICAgICAgICAgIXN0cm5jbXAoYnVmLCJzdWIiLDMpKSB7CisgICAgICAgIHAtPmxhdGVuY3kgPSAxOworICAgICAgICBCU0VUKHAtPnBpcGVzLFNDSVUxKTsKKyAgICAgICAgQlNFVChwLT5waXBlcyxTQ0lVMik7CisgICAgICAgIGlmICgqKHN0cmVzdChidWYsMSkpID09ICcuJykKKyAgICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLENDUik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBCU0VUKHAtPnBpcGVzLFNSVSk7ICAvKiBhZGQvYWRkbyBtYXkgYWxzbyBleGVjdXRlIGluIFNSVSAqLworICAgICAgICBCU0VUKHAtPnVzZXMsR1BSK3EyKTsKKyAgICAgICAgQlNFVChwLT5tb2RpZmllcyxHUFIreik7CisgICAgICAgIHJldHVybiAoMSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHNzY2FuZihwLT50eHQsZWxmID8gIiAlMTVzICVkLCVkLCVkIiA6ICIgJTE1cyByJWQsciVkLHIlZCIsCisgICAgICAgIGJ1ZiwmeiwmcTEsJnEyKSA9PSA0KSB7CisgICAgICAvKiBvcCByMSxyMixyMyAqLworICAgICAgaWYgKCFzdHJuY21wKGJ1ZiwiYWRkIiwzKSB8fAorICAgICAgICAgICFzdHJuY21wKGJ1ZiwiYW5kIiwzKSB8fAorICAgICAgICAgICFzdHJuY21wKGJ1ZiwiZGl2IiwzKSB8fAorICAgICAgICAgICFzdHJuY21wKGJ1ZiwiZXF2IiwzKSB8fAorICAgICAgICAgICFzdHJuY21wKGJ1ZiwibXVsIiwzKSB8fAorICAgICAgICAgICFzdHJuY21wKGJ1ZiwibmFuZCIsNCkgfHwKKyAgICAgICAgICAhc3RybmNtcChidWYsIm5vciIsMykgfHwKKyAgICAgICAgICAhc3RybmNtcChidWYsIm9yIiwyKSB8fAorICAgICAgICAgICFzdHJuY21wKGJ1Ziwic2wiLDIpIHx8CisgICAgICAgICAgIXN0cm5jbXAoYnVmLCJzciIsMikgfHwKKyAgICAgICAgICAhc3RybmNtcChidWYsInN1YiIsMykgfHwKKyAgICAgICAgICAhc3RybmNtcChidWYsInhvciIsMykpIHsKKyAgICAgICAgY2hhciAqYSA9IHN0cmVzdChidWYsMSk7CisKKyAgICAgICAgaWYgKCFzdHJuY21wKGJ1ZiwibXVsIiwzKSkgeworICAgICAgICAgIHAtPmxhdGVuY3kgPSA0OworICAgICAgICAgIEJTRVQocC0+cGlwZXMsTUNJVSk7CisgICAgICAgICAgaWYgKCooYnVmKzMpID09ICdsJykKKyAgICAgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsWEVSKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghc3RybmNtcChidWYsImRpdiIsMykpIHsKKyAgICAgICAgICBwLT5sYXRlbmN5ID0gMjA7CisgICAgICAgICAgQlNFVChwLT5waXBlcyxNQ0lVKTsKKyAgICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLFhFUik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgcC0+bGF0ZW5jeSA9IDE7CisgICAgICAgICAgQlNFVChwLT5waXBlcyxTQ0lVMSk7CisgICAgICAgICAgQlNFVChwLT5waXBlcyxTQ0lVMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCphID09ICcuJykgeworICAgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsQ0NSKTsKKyAgICAgICAgICAtLWE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCphID09ICdvJykgeworICAgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsWEVSKTsKKyAgICAgICAgICAtLWE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCphID09ICdjJykgeworICAgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsWEVSKTsKKyAgICAgICAgICAtLWE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCphID09ICdlJykKKyAgICAgICAgICBCU0VUKHAtPnVzZXMsWEVSKTsKKyAgICAgICAgQlNFVChwLT51c2VzLEdQUitxMSk7CisgICAgICAgIEJTRVQocC0+dXNlcyxHUFIrcTIpOworICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLEdQUit6KTsKKyAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3NjYW5mKHAtPnR4dCxlbGYgPyAiIGwlMTVzICVkLCVjIiA6ICIgbCUxNXMgciVkLCVjIiwKKyAgICAgICAgYnVmLCZ6LCZjKSA9PSAzKSB7CisgICAgICBpZiAoKmJ1ZiA9PSAnaScpIHsKKyAgICAgICAgLyogbGksIGxpcyAtPiBhZGRpLCBhZGRpcyAqLworICAgICAgICBwLT5sYXRlbmN5ID0gMTsKKyAgICAgICAgQlNFVChwLT5waXBlcyxTQ0lVMSk7CisgICAgICAgIEJTRVQocC0+cGlwZXMsU0NJVTIpOworICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLEdQUit6KTsKKyAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3NjYW5mKHAtPnR4dCxlbGYgPyAiICUxNXMgJWQsJWQiIDogIiAlMTVzIHIlZCxyJWQiLAorICAgICAgICBidWYsJnosJnExKSA9PSAzKSB7CisgICAgICAvKiBvcCByMSxyMiAqLworICAgICAgaWYgKCFzdHJuY21wKGJ1ZiwiYWRkIiwzKSB8fAorICAgICAgICAgICFzdHJuY21wKGJ1ZiwiZXh0cyIsNCkgfHwKKyAgICAgICAgICAhc3RybmNtcChidWYsIm1yIiwyKSB8fAorICAgICAgICAgICFzdHJuY21wKGJ1ZiwibmVnIiwzKSB8fAorICAgICAgICAgICFzdHJuY21wKGJ1Ziwic3ViIiwzKSkgeworICAgICAgICBjaGFyICphID0gc3RyZXN0KGJ1ZiwxKTsKKworICAgICAgICBwLT5sYXRlbmN5ID0gMTsKKyAgICAgICAgQlNFVChwLT5waXBlcyxTQ0lVMSk7CisgICAgICAgIEJTRVQocC0+cGlwZXMsU0NJVTIpOworICAgICAgICBpZiAoKmJ1Zj09J2EnIHx8ICpidWY9PSdzJykKKyAgICAgICAgICBCU0VUKHAtPnVzZXMsWEVSKTsgIC8qIGFkZG1lL2FkZHplL3N1YmZtZS9zdWJmemUvLi4uICovCisgICAgICAgIGlmICgqYSA9PSAnLicpIHsKKyAgICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLENDUik7CisgICAgICAgICAgLS1hOworICAgICAgICB9CisgICAgICAgIGlmICgqYSA9PSAnbycpIHsKKyAgICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLFhFUik7CisgICAgICAgIH0KKyAgICAgICAgQlNFVChwLT51c2VzLEdQUitxMSk7CisgICAgICAgIEJTRVQocC0+bW9kaWZpZXMsR1BSK3opOworICAgICAgICByZXR1cm4gKDEpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChzc2NhbmYocC0+dHh0LGVsZj8iIG0lMTVzICVkIjoiIG0lMTVzIHIlZCIsYnVmLCZ6KSA9PSAyKSB7CisgICAgICAvKiBtdHh4eCwgbWZ4eHg6IG1vdmUgZnJvbS90byBzcGVjaWFsIHJlZ2lzdGVycyAqLworICAgICAgaW50IHJlZz0wOworICAKKyAgICAgIGlmICghc3RyY21wKCZidWZbMV0sInhlciIpKQorICAgICAgICByZWcgPSBYRVI7CisgICAgICBlbHNlIGlmICghc3RyY21wKCZidWZbMV0sImN0ciIpKQorICAgICAgICByZWcgPSBDVFI7CisgICAgICBlbHNlIGlmICghc3RyY21wKCZidWZbMV0sImxyIikpCisgICAgICAgIHJlZyA9IExSOworICAgICAgZWxzZSBpZiAoIXN0cm5jbXAoJmJ1ZlsxXSwiZnMiLDIpKQorICAgICAgICByZWcgPSBGUFNDUjsKKyAgICAgIGlmIChyZWcpIHsKKyAgICAgICAgaWYgKHJlZyA9PSBGUFNDUikgeworICAgICAgICAgIHAtPmxhdGVuY3kgPSAzOworICAgICAgICAgIEJTRVQocC0+cGlwZXMsRlBVKTsKKyAgICAgICAgICAvKmlmICgqYnVmID09ICdmJykgeworICAgICAgICAgICAgQlNFVChwLT51c2VzLHJlZyk7CisgICAgICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLHopOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsqLworICAgICAgICAgICAgQlNFVChwLT51c2VzLHopOworICAgICAgICAgICAgQlNFVChwLT5tb2RpZmllcyxyZWcpOworICAgICAgICAgIC8qfSovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgQlNFVChwLT5waXBlcyxNQ0lVKTsKKyAgICAgICAgICBpZiAoKmJ1ZiA9PSAnZicpIHsKKyAgICAgICAgICAgIHAtPmxhdGVuY3kgPSAzOworICAgICAgICAgICAgQlNFVChwLT51c2VzLHJlZyk7CisgICAgICAgICAgICBCU0VUKHAtPm1vZGlmaWVzLHopOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHAtPmxhdGVuY3kgPSAxOworICAgICAgICAgICAgQlNFVChwLT51c2VzLHopOworICAgICAgICAgICAgQlNFVChwLT5tb2RpZmllcyxyZWcpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKDEpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHAtPmZsYWdzID0gQkFSUklFUjsKKyAgcmV0dXJuICgxKTsKK30KZGlmZiAtLWdpdCBhL21hY2hpbmVzL3BwYy9zY2hlZHVsZS5oIGIvbWFjaGluZXMvcHBjL3NjaGVkdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWQ2ZmJhOAotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL3BwYy9zY2hlZHVsZS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiB2c2NwcGMKKyAqCisgKiB2YmNjIFBvd2VyUEMgc2NoZWR1bGVyCisgKiAoQykxOTk4IGJ5IEZyYW5rIFdpbGxlIDxmcmFua0BwaG9lbml4Lm93bC5kZT4KKyAqCisgKiB2c2NwcGMgaXMgZnJlZXdhcmUgYW5kIHBhcnQgb2YgdGhlIHBvcnRhYmxlIGFuZCByZXRhcmdldGFibGUgQU5TSSBDCisgKiBjb21waWxlciB2YmNjLCBjb3B5cmlnaHQgKGMpIDE5OTUtOTggYnkgVm9sa2VyIEJhcnRoZWxtYW5uLgorICogdnNjcHBjIG1heSBiZSBmcmVlbHkgcmVkaXN0cmlidXRlZCBhcyBsb25nIGFzIG5vIG1vZGlmaWNhdGlvbnMgYXJlCisgKiBtYWRlIGFuZCBub3RoaW5nIGlzIGNoYXJnZWQgZm9yIGl0LiBOb24tY29tbWVyY2lhbCB1c2FnZSBpcyBhbGxvd2VkCisgKiB3aXRob3V0IGFueSByZXN0cmljdGlvbnMuCisgKiBFVkVSWSBQUk9EVUNUIE9SIFBST0dSQU0gREVSSVZFRCBESVJFQ1RMWSBGUk9NIE1ZIFNPVVJDRSBNQVkgTk9UIEJFCisgKiBTT0xEIENPTU1FUkNJQUxMWSBXSVRIT1VUIFBFUk1JU1NJT04gRlJPTSBUSEUgQVVUSE9SLgorICoKKyAqIEhpc3Rvcnk6CisgKiBWMC4zICAgMjAtSnVsLTk4CisgKiAgICAgICAgRGlmZmVyZW50aWF0aW9uIGJldHdlZW4gNjAzIGFuZCA2MDQuIE5vdywgc2NoZWR1bGluZyB0YWtlcworICogICAgICAgIHBsYWNlIHdpdGggcmVnYXJkIHRvIHRoZSByZWFsIFBvd2VyUEMgYXJjaGl0ZWN0dXJlLgorICogVjAuMSAgIDEwLUp1bC05OAorICogICAgICAgIHZzY3BwYyBzZWVtcyB0byBiZSBzdGFibGUgZW5vdWdoLCBhZnRlciBzb21lIHRlc3RzLgorICogICAgICAgIEhvd2V2ZXIsIGl0IHN0aWxsIG5lZWRzIGEgbG90IG9mIGZpbmUgdHVuaW5nLgorICogICAgICAgIEEgZGlmZmVyZW50aWF0aW9uIGJldHdlZW4gdGhlIFBQQyBDUFVzICg2MDNlLCA2MDRlKSBpcyBtaXNzaW5nLgorICogVjAuMCAgIDA5LUp1bC05OAorICogICAgICAgIEZpbGUgY3JlYXRlZC4KKyAqCisgKi8KKworI2RlZmluZSBQSVBFUyA3ICAgLyogdGhlIG1heC4gbnVtYmVyIG9mIHBpcGVzLCBhcyByZXF1aXJlZCBieSB0aGUgNjA0ICovCisKKy8qIFBpcGUgTmFtZXMgNjAzICovCisjZGVmaW5lIEJQVSAwICAgICAvKiBCcmFuY2ggUHJlZGljdGlvbiBVbml0ICovCisjZGVmaW5lIFNSVSAxICAgICAvKiBTcGVjaWFsIFJlZy4gVW5pdCAqLworI2RlZmluZSBJVSAyICAgICAgLyogSW50ZWdlciBVbml0ICovCisjZGVmaW5lIEZQVSA1ICAgICAvKiBGbG9hdGluZyBQb2ludCBVbml0ICovCisjZGVmaW5lIExTVSA2ICAgICAvKiBMb2FkIFN0b3JlIFVuaXQgKi8KKworLyogUGlwZSBOYW1lcyA2MDQgKi8KKyNkZWZpbmUgQ1JVIDEgICAgIC8qIENvbmRpdGlvbiBSZWdpc3RlciBVbml0ICovCisjZGVmaW5lIFNDSVUxIDIgICAvKiBTaW5nbGUgQ3ljbGUgSW50ZWdlciBVbml0ICMxICovCisjZGVmaW5lIFNDSVUyIDMgICAvKiBTaW5nbGUgQ3ljbGUgSW50ZWdlciBVbml0ICMyICovCisjZGVmaW5lIE1DSVUgNCAgICAvKiBNdWx0aXBsZSBDeWNsZSBJbnRlZ2VyIFVuaXQgKi8KKworCisjZGVmaW5lIFJFR1MgNzYgICAvKiAzMiBHUFIsIDMyIEZQUiwgOCBDQ1IsIExSLCBDVFIsIFhFUiwgRlBTQ1IgKi8KKworLyogUkVHLW9mZnNldHMgKi8KKyNkZWZpbmUgR1BSIDAKKyNkZWZpbmUgRlBSIDMyCisjZGVmaW5lIENDUiA2NAorI2RlZmluZSBYRVIgNzIKKyNkZWZpbmUgQ1RSIDczCisjZGVmaW5lIExSIDc0CisjZGVmaW5lIEZQU0NSIDc1CmRpZmYgLS1naXQgYS9tYWNoaW5lcy9xbmljZS9tYWNoaW5lLmMgYi9tYWNoaW5lcy9xbmljZS9tYWNoaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjkxOTkyNQotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL3FuaWNlL21hY2hpbmUuYwpAQCAtMCwwICsxLDI0MTIgQEAKKy8qICBDb2RlIGdlbmVyYXRvciBmb3IgcW5pY2UgY3B1LiAgICAgICAgICAgICAgICovCisKKyNpbmNsdWRlICJzdXBwLmgiCisKK3N0YXRpYyBjaGFyIEZJTEVfW109X19GSUxFX187CisvKiAgUHVibGljIGRhdGEgdGhhdCBNVVNUIGJlIHRoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogTmFtZSBhbmQgY29weXJpZ2h0LiAqLworY2hhciBjZ19jb3B5cmlnaHRbXT0idmJjYyBjb2RlLWdlbmVyYXRvciBmb3IgcW5pY2UgVjAuMSAoYykgaW4gMjAxNiBieSBWb2xrZXIgQmFydGhlbG1hbm4iOworCisvKiAgQ29tbWFuZGxpbmUtZmxhZ3MgdGhlIGNvZGUtZ2VuZXJhdG9yIGFjY2VwdHMgICAgICAgICAgICAgICAgKi8KK2ludCBnX2ZsYWdzW01BWEdGXT17VkFMRkxBRywwLDAsMCwKKyAgICAgICAgICAgICAgICAgICAgMCwwLDAsMCwKKyAgICAgICAgICAgICAgICAgICAgMCxWQUxGTEFHfTsKK2NoYXIgKmdfZmxhZ3NfbmFtZVtNQVhHRl09eyJjcHUiLCJpbnQzMiIsIm5vLWRlbGF5ZWQtcG9wcGluZyIsImNvbnN0LWluLWRhdGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lcmdlLWNvbnN0YW50cyIsIm5vLXBlZXBob2xlIiwibXRpbnkiLCJtbGFyZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1odWdlIiwicnctdGhyZXNob2xkIiwic29mdC1tdWwifTsKK3VuaW9uIHBwaSBnX2ZsYWdzX3ZhbFtNQVhHRl07CisKKy8qIFR5cGVuYW1lcyAobmVlZGVkIGJlY2F1c2Ugb2YgSEFWRV9FWFRfVFlQRVMpLiAqLworY2hhciAqdHlwbmFtZVtdPXsic3RyYW5nZSIsImJpdCIsImNoYXIiLCJzaG9ydCIsImludCIsImxvbmciLCJsb25nIGxvbmciLAorCQkgImZsb2F0IiwiZG91YmxlIiwibG9uZyBkb3VibGUiLCJ2b2lkIiwKKyAgICAgICAgICAgICAgICAgIm5lYXItcG9pbnRlciIsImZhci1wb2ludGVyIiwiaHVnZS1wb2ludGVyIiwKKwkJICJhcnJheSIsInN0cnVjdCIsInVuaW9uIiwiZW51bSIsImZ1bmN0aW9uIn07CisKKy8qICBBbGlnbm1lbnQtcmVxdWlyZW1lbnRzIGZvciBhbGwgdHlwZXMgaW4gYnl0ZXMuICAgICAgICAgICAgICAqLworem1heCBhbGlnbltNQVhfVFlQRSsxXTsKKworLyogIEFsaWdubWVudCB0aGF0IGlzIHN1ZmZpY2llbnQgZm9yIGV2ZXJ5IG9iamVjdC4gICAgICAgICAgICAgICovCit6bWF4IG1heGFsaWduOworCisvKiAgQ0hBUl9CSVQgb2YgdGhlIHRhcmdldCBtYWNoaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggY2hhcl9iaXQ7CisKKy8qICBTaXplcyBvZiBhbGwgZWxlbWVudGFyeSB0eXBlcyBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAqLworem1heCBzaXpldGFiW01BWF9UWVBFKzFdOworCisvKiAgTWluaW11bSBhbmQgTWF4aW11bSB2YWx1ZXMgZWFjaCB0eXBlIGNhbiBoYXZlLiAgICAgICAgICAgICAgKi8KKy8qICBNdXN0IGJlIGluaXRpYWxpemVkIGluIGluaXRfY2coKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworem1heCB0X21pbltNQVhfVFlQRSsxXTsKK3p1bWF4IHRfbWF4W01BWF9UWVBFKzFdOworenVtYXggdHVfbWF4W01BWF9UWVBFKzFdOworCisvKiAgTmFtZXMgb2YgYWxsIHJlZ2lzdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2NoYXIgKnJlZ25hbWVzW109eyJub3JlZyIsIlIwIiwiUjEiLCJSMiIsIlIzIiwiUjQiLCJSNSIsIlI2IiwiUjciLAorCQkgICJSOCIsIlI5IiwiUjEwIiwiUjExIiwiUjEyIiwiUjEzIiwiUjE0IiwiUjE1IiwKKwkJICAiUjAvUjEiLCJSMi9SMyIsIlI0L1I1IiwiUjYvUjciLAorCQkgICJSOC9SOSIsIlIxMS9SMTIifTsKKworLyogIFRoZSBTaXplIG9mIGVhY2ggcmVnaXN0ZXIgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IHJlZ3NpemVbTUFYUisxXTsKKworLyogIFR5cGUgd2hpY2ggY2FuIHN0b3JlIGVhY2ggcmVnaXN0ZXIuICovCitzdHJ1Y3QgVHlwICpyZWd0eXBlW01BWFIrMV07CisKKy8qICByZWdzYVtyZWddIT0wIGlmIGEgY2VydGFpbiByZWdpc3RlciBpcyBhbGxvY2F0ZWQgYW5kIHNob3VsZCAqLworLyogIG5vdCBiZSB1c2VkIGJ5IHRoZSBjb21waWxlciBwYXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitpbnQgcmVnc2FbTUFYUisxXTsKKworLyogIFNwZWNpZmllcyB3aGljaCByZWdpc3RlcnMgbWF5IGJlIHNjcmF0Y2hlZCBieSBmdW5jdGlvbnMuICAgICovCitpbnQgcmVnc2NyYXRjaFtNQVhSKzFdPXswLDAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwxLDF9OworCitpbnQgcmVnX3ByaW9bTUFYUisxXT17MCwwLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMSwxfTsKKworc3RydWN0IHJlZ19oYW5kbGUgZW1wdHlfcmVnX2hhbmRsZT17MH07CisKKy8qIE5hbWVzIG9mIHRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZSBhdHRyaWJ1dGVzLiAgICAgICAgICAgICAgICAqLworY2hhciAqZ19hdHRyX25hbWVbXT17Il9faW50ZXJydXB0IiwiX19yYmFuayIsIl9fbm9yYmFuayIsMH07CisjZGVmaW5lIElOVEVSUlVQVCAxCisjZGVmaW5lIFJCQU5LIDIKKyNkZWZpbmUgTk9SQkFOSyA0CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgU29tZSBwcml2YXRlIGRhdGEgYW5kIGZ1bmN0aW9ucy4gICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgbG9uZyBtYWxpZ25bTUFYX1RZUEUrMV09ICB7MSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDF9Oworc3RhdGljIGxvbmcgbXNpemV0YWJbTUFYX1RZUEUrMV09ezAsMSwxLDEsMSwyLDQsMiw0LDQsMCwxLDIsMiwwLDAsMCwxLDAsMSwxfTsKKworc3RydWN0IFR5cCBpdHlwPXtTSE9SVH0sbHR5cD17TE9OR307CisKKyNkZWZpbmUgSU5UMzIgKGdfZmxhZ3NbMV0mVVNFREZMQUcpCisjZGVmaW5lIE5PUEVFUCAgKGdfZmxhZ3NbNV0mVVNFREZMQUcpCisjZGVmaW5lIFRJTlkgIDEgLyooZ19mbGFnc1s2XSZVU0VERkxBRykqLworI2RlZmluZSBMQVJHRSAwIC8qKGdfZmxhZ3NbN10mVVNFREZMQUcpKi8KKyNkZWZpbmUgSFVHRSAgMCAvKihnX2ZsYWdzWzhdJlVTRURGTEFHKSovCisjZGVmaW5lIFNPRlRNVUwgIChnX2ZsYWdzWzEwXSZVU0VERkxBRykKKworCisjZGVmaW5lIE5EQVRBIDAKKyNkZWZpbmUgTkJTUyAxCisjZGVmaW5lIE5DREFUQSAyCisjZGVmaW5lIEZEQVRBIDMKKyNkZWZpbmUgRkJTUyA0CisjZGVmaW5lIEZDREFUQSA1CisjZGVmaW5lIEhEQVRBIDYKKyNkZWZpbmUgSEJTUyA3CisjZGVmaW5lIEhDREFUQSA4CisjZGVmaW5lIENPREUgOQorI2RlZmluZSBTUEVDSUFMIDEwCisjZGVmaW5lIEJJVFMgMTEKKworc3RhdGljIGludCBzZWN0aW9uPS0xLG5ld29iaixzY250Oworc3RhdGljIGNoYXIgKmNvZGVuYW1lPSJcdC50ZXh0XG4iLAorICAqbmRhdGFuYW1lPSJcdC5kYXRhXG4iLAorICAqZmRhdGFuYW1lPSJcdC5kYXRhXG4iLAorICAqaGRhdGFuYW1lPSJcdC5kYXRhXG4iLAorICAqbmJzc25hbWU9Ilx0LmJzc1xuIiwKKyAgKmZic3NuYW1lPSJcdC5ic3NcbiIsCisgICpoYnNzbmFtZT0iXHQuYnNzXG4iLAorICAqbmNkYXRhbmFtZT0iXHQudGV4dFxuIiwKKyAgKmZjZGF0YW5hbWU9Ilx0LnRleHRcbiIsCisgICpoY2RhdGFuYW1lPSJcdC50ZXh0XG4iOworCisjZGVmaW5lIFBPU1RfSU5DIDEKKyNkZWZpbmUgUFJFX0RFQyAgMgorCitleHRlcm4gaW50IHN0YXRpY19jc2UsIGRyZWZfY3NlOworCisvKiAodXNlcilzdGFjay1wb2ludGVyLCBwb2ludGVyLXRtcCwgaW50LXRtcDsgcmVzZXJ2ZWQgZm9yIGNvbXBpbGVyICovCitzdGF0aWMgY29uc3QgaW50IHNwPTE0LHNyPTE1LHBjPTE2LHQxPTEyLHQyPTEzLE1UTVAxPTIyOworc3RhdGljIGNvbnN0IGludCByOD05LHI5PTEwLHI4cjk9MjE7CitzdGF0aWMgaW50IHRtcDEsdG1wMix0bXAzLHRtcDQsdDJfdXNlZDsKK3N0YXRpYyB2b2lkIHByKEZJTEUgKixzdHJ1Y3QgSUMgKik7CitzdGF0aWMgdm9pZCBmdW5jdGlvbl90b3AoRklMRSAqLHN0cnVjdCBWYXIgKixsb25nKTsKK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX2JvdHRvbShGSUxFICpmLHN0cnVjdCBWYXIgKixsb25nKTsKK3N0YXRpYyBpbnQgc2NyYXRjaHJlZyhpbnQsc3RydWN0IElDICopOworc3RhdGljIHN0cnVjdCBWYXIgbnZhcixmdmFyOworc3RhdGljIGludCBsb2FkX2NvbnN0Oworc3RhdGljIHN0cnVjdCBJQyAqaWNwOworCitzdGF0aWMgY2hhciAqbWFycmF5W109ezAsCisgICAgICAgICAgICAgICAgICAgICAgICJfX2Zhcj1fX2F0dHIoXCJmYXJcIikiLAorCQkgICAgICAgIl9fbmVhcj1fX2F0dHIoXCJuZWFyXCIpIiwKKwkJICAgICAgICJfX2h1Z2U9X19hdHRyKFwiaHVnZVwiKSIsCisgICAgICAgICAgICAgICAgICAgICAgICJfX3NlY3Rpb24oeCx5KT1fX3ZhdHRyKFwic2VjdGlvbihcIiN4XCIsXCIjeVwiKVwiKSIsCisJCSAgICAgICAiX19pbnRlcnJ1cHQoeCk9X19pbnRlcnJ1cHQgX192YXR0cihcIml2ZWMoXCJfX3N0cih4KVwiKVwiKSIsCisJCSAgICAgICAiX19RTklDRV9fIiwKKwkJICAgICAgICJfX1NJWkVfVF9JTlQ9MSIsCisJCSAgICAgICAiX19zdHIoeCk9I3giLAorCQkgICAgICAgMH07CisKKyNkZWZpbmUgaXNyZWcoeCkgKChwLT54LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpCisjZGVmaW5lIGlzY29uc3QoeCkgKChwLT54LmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKQorCitzdGF0aWMgbG9uZyBsb2ZmLHN0YWNrLHN0YWNrb2Zmc2V0LG5vdHBvcHBlZCxkb250cG9wLG1heHB1c2hlZDsKKworc3RhdGljIGNoYXIgKmNjc1tdPXsieiIsIiF6IiwidiIsIiF2IiwiPz8iLCI/PyJ9Oworc3RhdGljIGNoYXIgKmNjdVtdPXsieiIsIiF6IiwibiIsIiFuIiwiPz8iLCI/PyJ9OworCitzdGF0aWMgY2hhciAqbG9naWNhbHNbXT17Im9yIiwieG9yIiwiYW5kIn07CitzdGF0aWMgY2hhciAqYXJpdGhtZXRpY3NbXT17InNobCIsInNociIsImFkZCIsInN1YiJ9OworCitzdGF0aWMgY2hhciAqZGN0W109eyIiLCIuYml0IiwiLnNob3J0IiwiLnNob3J0IiwiLnNob3J0IiwiLnNob3J0IiwiLnNob3J0IiwiLnNob3J0IiwiLnNob3J0IiwiLnNob3J0IiwKKwkJICAgICIodm9pZCkiLCIuc2hvcnQiLCIubG9uZyIsIi5sb25nIn07CitzdGF0aWMgaW50IHB1c2hlZHNpemUscHVzaG9yZGVyPTI7CitzdGF0aWMgY2hhciAqaWRwcmVmaXg9Il8iLCpsYWJwcmVmaXg9ImwiOworc3RhdGljIGludCBleGl0X2xhYmVsLGhhdmVfZnJhbWUsc3RhY2tjaGVja2xhYmVsLHN0YWNrX3ZhbGlkOworc3RhdGljIGNoYXIgKnJldCwqY2FsbCwqanVtcDsKK3N0YXRpYyBpbnQgZnJhbWVfdXNlZDsKK3N0YXRpYyBpbnQgcnd0aHJlc2hvbGQ7CisKKyNkZWZpbmUgU1RSX05FQVIgIm5lYXIiCisjZGVmaW5lIFNUUl9GQVIgImZhciIKKyNkZWZpbmUgU1RSX0hVR0UgImh1Z2UiCisKKyNkZWZpbmUgSVNOVUxMKCkgKHptZXF0byh2bWF4LGwyem0oMEwpKSYmenVtZXF0byh2dW1heCx1bDJ6dW0oMFVMKSkmJnpsZGVxdG8odmxkb3VibGUsZDJ6bGQoMC4wKSkpCisjZGVmaW5lIElTTFdPUkQodCkgKCh0Jk5RKT09TE9OR3x8KHQmTlEpPT1GUE9JTlRFUnx8KHQmTlEpPT1IUE9JTlRFUnx8KHQmTlEpPT1GTE9BVCkKKyNkZWZpbmUgSVNIV09SRCh0KSAoKHQmTlEpPT1JTlR8fCh0Jk5RKT09U0hPUlR8fCh0Jk5RKT09Q0hBUnx8KHQmTlEpPT1OUE9JTlRFUikKKyNkZWZpbmUgSVNTVEFUSUModikgKCh2KS0+c3RvcmFnZV9jbGFzcz09RVhURVJOfHwodiktPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQykKKworc3RhdGljIGludCBJU0ZBUihzdHJ1Y3QgVmFyICp2KQoreworICBzdHJ1Y3QgVHlwICp2dDsKKyAgaWYodj09Jm52YXIpIHJldHVybiAwOworICBpZih2PT0mZnZhcikgcmV0dXJuIDE7CisgIHZ0PXYtPnZ0eXA7CisgIHdoaWxlKElTQVJSQVkodnQtPmZsYWdzKSkgdnQ9dnQtPm5leHQ7CisgIGlmKHZ0LT5hdHRyJiZzdHJzdHIoU1RSX05FQVIsdnQtPmF0dHIpKQorICAgIHJldHVybiAwOworICBpZihIVUdFfHxMQVJHRSkKKyAgICByZXR1cm4gMTsKKyAgaWYodnQtPmF0dHImJihzdHJzdHIoU1RSX0ZBUix2dC0+YXR0cil8fHN0cnN0cihTVFJfSFVHRSx2dC0+YXR0cikpKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcGVjaWFsX3NlY3Rpb24oRklMRSAqZixzdHJ1Y3QgVmFyICp2KQoreworICBjaGFyICpzZWMsKmU7CisgIGlmKCF2LT52YXR0cikgcmV0dXJuIDA7CisgIHNlYz1zdHJzdHIodi0+dmF0dHIsInNlY3Rpb24oIik7CisgIGlmKCFzZWMpIHJldHVybiAwOworICBzZWMrPXN0cmxlbigic2VjdGlvbigiKTsKKyAgZW1pdChmLCJcdC5zZWN0aW9uXHQiKTsKKyAgd2hpbGUoKnNlYyYmKnNlYyE9JyknKSBlbWl0X2NoYXIoZiwqc2VjKyspOworICBlbWl0KGYsIlxuIik7CisgIGlmKGYpIHNlY3Rpb249U1BFQ0lBTDsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnBjb25zdGxpc3QgeworICAgIHN0cnVjdCBmcGNvbnN0bGlzdCAqbmV4dDsKKyAgICBpbnQgbGFiZWwsdHlwOworICAgIHVuaW9uIGF0eXBzIHZhbDsKK30gKmZpcnN0ZnBjOworCitzdGF0aWMgaW50IGFkZGZwY29uc3Qoc3RydWN0IG9iaiAqbyxpbnQgdCkKK3sKKyAgc3RydWN0IGZwY29uc3RsaXN0ICpwPWZpcnN0ZnBjOworICB0Jj1OUTsKKyAgaWYoZ19mbGFnc1s0XSZVU0VERkxBRyl7CisgICAgZm9yKHA9Zmlyc3RmcGM7cDtwPXAtPm5leHQpeworICAgICAgaWYodD09cC0+dHlwKXsKKwlldmFsX2NvbnN0KCZwLT52YWwsdCk7CisJaWYodD09RkxPQVQmJnpsZGVxdG8odmxkb3VibGUsemYyemxkKG8tPnZhbC52ZmxvYXQpKSkgcmV0dXJuIHAtPmxhYmVsOworCWlmKHQ9PURPVUJMRSYmemxkZXF0byh2bGRvdWJsZSx6ZDJ6bGQoby0+dmFsLnZkb3VibGUpKSkgcmV0dXJuIHAtPmxhYmVsOworCWlmKHQ9PUxET1VCTEUmJnpsZGVxdG8odmxkb3VibGUsby0+dmFsLnZsZG91YmxlKSkgcmV0dXJuIHAtPmxhYmVsOworICAgICAgfQorICAgIH0KKyAgfQorICBwPW15bWFsbG9jKHNpemVvZihzdHJ1Y3QgZnBjb25zdGxpc3QpKTsKKyAgcC0+bmV4dD1maXJzdGZwYzsKKyAgcC0+bGFiZWw9KytsYWJlbDsKKyAgcC0+dHlwPXQ7CisgIHAtPnZhbD1vLT52YWw7CisgIGZpcnN0ZnBjPXA7CisgIHJldHVybiBwLT5sYWJlbDsKK30KK3N0YXRpYyB2b2lkIGNhbGxlZV9wdXNoKGxvbmcgcHVzaCkKK3sKKyAgaWYocHVzaC1zdGFja29mZnNldD5zdGFjaykKKyAgICBzdGFjaz1wdXNoLXN0YWNrb2Zmc2V0OworfQorc3RhdGljIHZvaWQgcHVzaChsb25nIHB1c2gpCit7CisgIHN0YWNrb2Zmc2V0LT1wdXNoOworICBpZihzdGFja29mZnNldDxtYXhwdXNoZWQpIAorICAgIG1heHB1c2hlZD1zdGFja29mZnNldDsKKyAgaWYoLW1heHB1c2hlZD5zdGFjaykgc3RhY2s9LW1heHB1c2hlZDsKK30KK3N0YXRpYyB2b2lkIHBvcChsb25nIHBvcCkKK3sKKyAgc3RhY2tvZmZzZXQrPXBvcDsKK30KK2ludCBwb2ludGVyX3R5cGUoc3RydWN0IFR5cCAqcCkKK3sKKyAgc3RydWN0IFR5cCAqbWVyaz1wOworICBpZighcCkgaWVycm9yKDApOworICB3aGlsZShJU0FSUkFZKHAtPmZsYWdzKXx8SVNGVU5DKHAtPmZsYWdzKSkgcD1wLT5uZXh0OworICBpZihwLT5hdHRyKXsKKyAgICBpZihzdHJzdHIocC0+YXR0cixTVFJfSFVHRSkpIHJldHVybiBIUE9JTlRFUjsKKyAgICBpZihzdHJzdHIocC0+YXR0cixTVFJfRkFSKSkgcmV0dXJuIEZQT0lOVEVSOworICAgIGlmKHN0cnN0cihwLT5hdHRyLFNUUl9ORUFSKSkgcmV0dXJuIE5QT0lOVEVSOworICB9CisgIGlmKChtZXJrLT5mbGFncyZOUSk9PUZVTktUKXsKKyAgICBpZihUSU5ZKQorICAgICAgcmV0dXJuIE5QT0lOVEVSOworICAgIGVsc2UKKyAgICAgIHJldHVybiBIUE9JTlRFUjsKKyAgfQorICBpZihMQVJHRSkKKyAgICByZXR1cm4gRlBPSU5URVI7CisgIGVsc2UgaWYoSFVHRSkKKyAgICByZXR1cm4gSFBPSU5URVI7CisgIGVsc2UKKyAgICByZXR1cm4gTlBPSU5URVI7Cit9CisKKy8qIHJldHVybiBub24temVybyBpZiBJQyBpcyBpbXBsZW1lbnRlZCBieSBhIGZ1bmN0aW9uIGNhbGwgKi8KK3N0YXRpYyBpbnQgaXNsaWJjYWxsKHN0cnVjdCBJQyAqcCkKK3sKKyAgLyogVE9ETzogY2hlY2sgaWYgbmVjZXNzYXJ5ICovCisgIHJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyB2b2ZmKHN0cnVjdCBvYmogKnApCit7CisgIGlmKHAtPnYtPm9mZnNldDwwKQorICAgIHJldHVybiBsb2ZmLXptMmwocC0+di0+b2Zmc2V0KSt6bTJsKHAtPnZhbC52bWF4KS1zdGFja29mZnNldCtwdXNoZWRzaXplOworICByZXR1cm4gem0ybChwLT52LT5vZmZzZXQpK3ptMmwocC0+dmFsLnZtYXgpLXN0YWNrb2Zmc2V0OworfQorc3RhdGljIGludCBhbGlnbm1lbnQoc3RydWN0IG9iaiAqbykKK3sKKyAgaWYoby0+ZmxhZ3MmRFJFRk9CSikgcmV0dXJuIDE7CisgIGlmKCEoby0+ZmxhZ3MmVkFSKSkgaWVycm9yKDApOworICBpZihJU1NUQVRJQyhvLT52KSkgcmV0dXJuIHptMmwoby0+dmFsLnZtYXgpJjE7CisgIHJldHVybiB2b2ZmKG8pJjE7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfb2JqKEZJTEUgKmYsc3RydWN0IG9iaiAqcCxpbnQgdCkKKy8qICBvdXRwdXQgYW4gb3BlcmFuZCAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpZihwLT5hbSl7CisgICAgaWYocC0+YW0tPmZsYWdzPT1QT1NUX0lOQyl7CisgICAgICBlbWl0KGYsIkAlcysrIixyZWduYW1lc1twLT5hbS0+YmFzZV0pOworICAgICAgcmV0dXJuOworICAgIH1lbHNlIGlmKHAtPmFtLT5mbGFncz09UFJFX0RFQyl7CisgICAgICBlbWl0KGYsIkAtLSVzIixyZWduYW1lc1twLT5hbS0+YmFzZV0pOworICAgICAgcmV0dXJuOworICAgIH1lbHNleworICAgICAgaWVycm9yKDApOworICAgIH0KKyAgfQorICBpZigocC0+ZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09KEtPTlNUfERSRUZPQkopKXsKKyAgICBlbWl0dmFsKGYsJnAtPnZhbCxwLT5kdHlwJk5VKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYoKHAtPmZsYWdzJihEUkVGT0JKfFJFRykpPT0oRFJFRk9CSnxSRUcpKSBlbWl0KGYsIkAiKTsKKyAgLyppZihwLT5mbGFncyZWQVJBRFIpIGllcnJvcigwKTsqLworICBpZigocC0+ZmxhZ3MmKFZBUnxSRUcpKT09VkFSKXsKKyAgICBpZihwLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CisgICAgICBpZih2b2ZmKHApKQorCWVtaXQoZiwiQCVzKyMlbGQiLHJlZ25hbWVzW3NwXSx2b2ZmKHApKTsKKyAgICAgIGVsc2UgZW1pdChmLCJAJXMiLHJlZ25hbWVzW3NwXSk7CisgICAgfWVsc2V7CisgICAgICBpZihwLT52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpeworCWVtaXQoZiwiIyVzJWxkIixsYWJwcmVmaXgsem0ybChwLT52LT5vZmZzZXQpKTsKKyAgICAgIH1lbHNleworCWVtaXQoZiwiIyVzJXMiLGlkcHJlZml4LHAtPnYtPmlkZW50aWZpZXIpOworICAgICAgfQorICAgICAgaWYoIXptZXF0byhsMnptKDBMKSxwLT52YWwudm1heCkpCisJZW1pdChmLCIrJWxkIiwobG9uZyl6bTJsKHAtPnZhbC52bWF4KSoyKTsKKyAgICB9CisgIH0KKyAgaWYocC0+ZmxhZ3MmUkVHKXsKKyAgICBlbWl0KGYsIiVzIixyZWduYW1lc1twLT5yZWddKTsKKyAgfQorICAvKiBzb21ldGltZXMgd2UganVzdCBvciBhIFJFRyBpbnRvIGEgS09OU1QgKi8KKyAgaWYoKHAtPmZsYWdzJihLT05TVHxSRUcpKT09S09OU1QpeworICAgIGlmKElTRkxPQVQodCkpeworICAgICAgaWVycm9yKDApOworICAgICAgZW1pdChmLCIjJXMlZCIsbGFicHJlZml4LGFkZGZwY29uc3QocCx0KSk7CisgICAgfWVsc2V7CisgICAgICBlbWl0dmFsKGYsJnAtPnZhbCx0Jk5VKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgZW1pdF9sd29yZChGSUxFICpmLHN0cnVjdCBvYmogKnAsaW50IHQsY2hhciAqZGVmKQorLyogIG91dHB1dCBsb3ctd29yZCBvZiBhbiBvcGVyYW5kICovCit7CisgIGlmKChwLT5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisgICAgZXZhbF9jb25zdCgmcC0+dmFsLHQpOworICAgIGlmKElTRkxPQVQodCkpeworICAgICAgdW5zaWduZWQgY2hhciAqaXA9KHVuc2lnbmVkIGNoYXIgKikmdmZsb2F0OworICAgICAgZW1pdChmLCIweCUwMnglMDJ4IixpcFsxXSxpcFswXSk7CisgICAgfWVsc2V7CisgICAgICBsb25nIHY7CisgICAgICB2PXptMmwodm1heCk7CisgICAgICBlbWl0KGYsIiVsZCIsdiYweGZmZmYpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYoKHAtPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpeworICAgIGlmKCFyZWdfcGFpcihwLT5yZWcsJnJwKSkKKyAgICAgIGllcnJvcigwKTsKKyAgICBlbWl0KGYsIiVzIixyZWduYW1lc1tycC5yMV0pOworICAgIHJldHVybjsKKyAgfQorICBpZigocC0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikpeworICAgIGVtaXQoZixkZWYscmVnbmFtZXNbcC0+cmVnXSk7CisgICAgcmV0dXJuOworICB9CisgIGllcnJvcigwKTsKK30KKworc3RhdGljIHZvaWQgZW1pdF9od29yZChGSUxFICpmLHN0cnVjdCBvYmogKnAsaW50IHQsY2hhciAqZGVmKQorLyogIG91dHB1dCBoaWdoLXdvcmQgb2YgYW4gb3BlcmFuZCAqLworeworICBpZigocC0+ZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworICAgIGV2YWxfY29uc3QoJnAtPnZhbCx0KTsKKyAgICBpZihJU0ZMT0FUKHQpKXsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmlwPSh1bnNpZ25lZCBjaGFyICopJnZmbG9hdDsKKyAgICAgIGVtaXQoZiwiMHglMDJ4JTAyeCIsaXBbM10saXBbMl0pOworICAgIH1lbHNleworICAgICAgbG9uZyB2OworICAgICAgdj16bTJsKHZtYXgpOworICAgICAgZW1pdChmLCIlbGQiLCh2Pj4xNikmMHhmZmZmKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGlmKChwLT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKyAgICBpZighcmVnX3BhaXIocC0+cmVnLCZycCkpCisgICAgICBpZXJyb3IoMCk7CisgICAgZW1pdChmLCIlcyIscmVnbmFtZXNbcnAucjJdKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYoKHAtPmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopKXsKKyAgICBlbWl0KGYsZGVmLHJlZ25hbWVzW3AtPnJlZ10pOworICAgIHJldHVybjsKKyAgfQorICBpZXJyb3IoMCk7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfbHdvcmQoRklMRSAqZixzdHJ1Y3Qgb2JqICpwKQorLyogY2xlYW51cCBpbmNyZWFzZWQgYWRkcmVzcyBwb2ludGVycyBvZiBlbWl0X2hsd29yZCAqLworeworICBpZigocC0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJiFzY3JhdGNocmVnKHAtPnJlZyxpY3ApKQorICAgIGVtaXQoZiwiXHRzdWJcdDIsJXNcbiIscmVnbmFtZXNbcC0+cmVnXSk7Cit9CisKK3N0YXRpYyB2b2lkIHByKEZJTEUgKmYsc3RydWN0IElDICpwKQoreworfQorCitzdGF0aWMgdm9pZCBmdW5jdGlvbl90b3AoRklMRSAqZixzdHJ1Y3QgVmFyICp2LGxvbmcgb2Zmc2V0KQorLyogIGVyemV1Z3QgRnVua3Rpb25za29wZiAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGkscmNudDtjaGFyICp0bXA7CisKKyAgaGF2ZV9mcmFtZT0wO3N0YWNrX3ZhbGlkPTE7CisgIHB1c2hlZHNpemU9MDsKKworICBpZighc3BlY2lhbF9zZWN0aW9uKGYsdikmJnNlY3Rpb24hPUNPREUpeworICAgIGVtaXQoZixjb2RlbmFtZSk7CisgIH0KKyAgaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKKyAgICBpZigodi0+ZmxhZ3MmKElOTElORUZVTkN8SU5MSU5FRVhUKSkhPUlOTElORUZVTkMpCisgICAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXMlc1xuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICBlbWl0KGYsIiVzJXM6XG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOyAKKyAgfWVsc2V7CisgICAgZW1pdChmLCIlcyVsZDpcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7ICAKKyAgfQorICBpZihzdGFja19jaGVjayl7CisgICAgc3RhY2tjaGVja2xhYmVsPSsrbGFiZWw7CisgICAgQlNFVChyZWdzX21vZGlmaWVkLHQxKTsKKyAgICBlbWl0KGYsIlx0bW92XHQlcywjJXMlZFxuIixyZWduYW1lc1t0MV0sbGFicHJlZml4LHN0YWNrY2hlY2tsYWJlbCk7CisgICAgZW1pdChmLCJcdCVzXHQlc19fc3RhY2tfY2hlY2tcbiIsY2FsbCxpZHByZWZpeCk7LypGSVhNRTp1c3JzdGFjayovCisgIH0KKyAgZm9yKHJjbnQ9MCxpPTE7aTw9MTY7aSsrKXsKKyAgICBpZihyZWd1c2VkW2ldJiYhcmVnc2NyYXRjaFtpXSYmIXJlZ3NhW2ldKQorICAgICAgcmNudCsrOworICB9CisgIGlmKHYtPnRhdHRyJk5PUkJBTkspIHJjbnQ9MDsKKyAgaWYocmNudD4oKHYtPnRhdHRyJlJCQU5LKT8wOnJ3dGhyZXNob2xkKSl7CisgICAgLyplbWl0KGYsIlx0YWRkXHQyNTYsJXNcbiIscmVnbmFtZXNbc3JdKTsqLworICAgIGVtaXQoZiwiXHRpbmNyYlxuIik7CisgICAgaGF2ZV9mcmFtZT0zOworICB9ZWxzZXsKKyAgICBmb3IoaT0xO2k8PTE2O2krKyl7CisgICAgICBpZihyZWd1c2VkW2ldJiYhcmVnc2NyYXRjaFtpXSYmIXJlZ3NhW2ldKXsKKwllbWl0KGYsIlx0bW92ZVx0JXMsQC0tJXNcbiIscmVnbmFtZXNbaV0scmVnbmFtZXNbc3BdKTsKKwlwdXNoKDEpOworCWhhdmVfZnJhbWU9MTtwdXNoZWRzaXplKz0xOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihvZmZzZXQpeworICAgIGVtaXQoZiwiXHRzdWJcdCVsZCwlc1xuIixvZmZzZXQscmVnbmFtZXNbc3BdKTsKKyAgICBpZighaGF2ZV9mcmFtZSkgCisgICAgICBoYXZlX2ZyYW1lfD0xOworICB9Cit9CitzdGF0aWMgdm9pZCBmdW5jdGlvbl9ib3R0b20oRklMRSAqZixzdHJ1Y3QgVmFyICp2LGxvbmcgb2Zmc2V0KQorLyogIGVyemV1Z3QgRnVua3Rpb25zZW5kZSAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGk7CisgIGlmKG9mZnNldCkgZW1pdChmLCJcdGFkZFx0JWxkLCVzXG4iLG9mZnNldCxyZWduYW1lc1tzcF0pOworICBpZihoYXZlX2ZyYW1lPT0zKXsKKyAgICAvKmVtaXQoZiwiXHRzdWJcdDI1Niwlc1xuIixyZWduYW1lc1tzcl0pOyovCisgICAgZW1pdChmLCJcdGRlY3JiXG4iKTsKKyAgfWVsc2V7CisgICAgZm9yKGk9MTY7aT4wO2ktLSl7CisgICAgICBpZihyZWd1c2VkW2ldJiYhcmVnc2NyYXRjaFtpXSYmIXJlZ3NhW2ldKXsKKwllbWl0KGYsIlx0bW92ZVx0QCVzKyssJXNcbiIscmVnbmFtZXNbc3BdLHJlZ25hbWVzW2ldKTsKKwlwb3AoMSk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKHYtPnRhdHRyJklOVEVSUlVQVCl7CisgICAgZW1pdChmLCJcdHJ0aVxuIik7CisgIH1lbHNleworICAgIGlmKHJldCkgZW1pdChmLCJcdCVzXG4iLHJldCk7CisgIH0KKyAgaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKKyAgICBlbWl0KGYsIlx0LnR5cGVcdCVzJXMsQGZ1bmN0aW9uXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgIGVtaXQoZiwiXHQuc2l6ZVx0JXMlcywkLSVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgfWVsc2V7CisgICAgZW1pdChmLCJcdC50eXBlXHQlcyVsZCxAZnVuY3Rpb25cbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgZW1pdChmLCJcdC5zaXplXHQlcyVsZCwkLSVzJWxkXG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCksbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgIH0KKyAgaWYoc3RhY2tfY2hlY2spCisgICAgZW1pdChmLCIlcyVkXHRlcXVcdCVsZFxuIixsYWJwcmVmaXgsc3RhY2tjaGVja2xhYmVsLG9mZnNldCtwdXNoZWRzaXplLW1heHB1c2hlZCk7CisgIGlmKHN0YWNrX3ZhbGlkKXsKKyAgICBsb25nIHVzdGFjaz1zdGFjaytvZmZzZXQrcHVzaGVkc2l6ZTsKKyAgICBpZighdi0+ZmkpIHYtPmZpPW5ld19maSgpOworICAgIGlmKHYtPmZpLT5mbGFncyZBTExfU1RBQ0speworICAgICAgaWYodi0+ZmktPnN0YWNrMSE9c3RhY2spCisgICAgICAgIGlmKGYpIGVycm9yKDMxOSwic3RhY2siLHVzdGFjayx2LT5maS0+c3RhY2sxKTsKKyAgICB9ZWxzZXsKKyAgICAgIHYtPmZpLT5mbGFnc3w9QUxMX1NUQUNLOworICAgICAgdi0+ZmktPnN0YWNrMT1zdGFjazsKKyAgICB9CisgICAgZW1pdChmLCJcdC5lcXVcdCVzX191c3RhY2tfJXMsJWxkXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIsem0ybCh2LT5maS0+c3RhY2sxKSk7CisgIH0KK30KK3N0YXRpYyBpbnQgY29tcGFyZV9vYmplY3RzKHN0cnVjdCBvYmogKm8xLHN0cnVjdCBvYmogKm8yKQoreworICBpZigobzEtPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJihvMi0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmbzEtPnJlZz09bzItPnJlZykKKyAgICByZXR1cm4gMTsKKyAgaWYoKG8xLT5mbGFncyYoS09OU1R8VkFSfERSRUZPQkp8UkVHfFZBUkFEUikpPT0obzItPmZsYWdzJihLT05TVHxWQVJ8RFJFRk9CSnxSRUd8VkFSQURSKSkmJm8xLT5hbT09bzItPmFtKXsKKyAgICBpZighKG8xLT5mbGFncyZWQVIpfHwobzEtPnY9PW8yLT52JiZ6bWVxdG8obzEtPnZhbC52bWF4LG8yLT52YWwudm1heCkpKXsKKyAgICAgIGlmKCEobzEtPmZsYWdzJlJFRyl8fG8xLT5yZWc9PW8yLT5yZWcpeworCXJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KK3N0YXRpYyB2b2lkIGNsZWFyX2V4dF9pYyhzdHJ1Y3QgZXh0X2ljICpwKQoreworICBwLT5mbGFncz0wOworICBwLT5yPTA7CisgIHAtPm9mZnNldD0wOworfQorCitzdGF0aWMgdm9pZCBwZWVwaG9sZShzdHJ1Y3QgSUMgKnApCit7CisgIGludCBjLGMyLHIsdDtzdHJ1Y3QgSUMgKnAyOworICBzdHJ1Y3QgQWRkcmVzc2luZ01vZGUgKmFtOworICBmcmFtZV91c2VkPTA7CisgIGZvcig7cDtwPXAtPm5leHQpeworICAgIGM9cC0+Y29kZTsKKyAgICBpZighZnJhbWVfdXNlZCl7CisgICAgICBpZigocC0+cTEuZmxhZ3MmKFJFR3xWQVIpKT09VkFSJiYhSVNTVEFUSUMocC0+cTEudikpIGZyYW1lX3VzZWQ9MTsKKyAgICAgIGlmKChwLT5xMi5mbGFncyYoUkVHfFZBUikpPT1WQVImJiFJU1NUQVRJQyhwLT5xMi52KSkgZnJhbWVfdXNlZD0xOworICAgICAgaWYoKHAtPnouZmxhZ3MmKFJFR3xWQVIpKT09VkFSJiYhSVNTVEFUSUMocC0+ei52KSkgZnJhbWVfdXNlZD0xOworICAgIH0KKyAgICAvKiBsZXR6dGVzIExhYmVsIG1lcmtlbiAqLworICAgIGlmKGMhPUZSRUVSRUcmJmMhPUFMTE9DUkVHJiYoYyE9U0VUUkVUVVJOfHwhaXNyZWcocTEpfHxwLT5xMS5yZWchPXAtPnoucmVnKSkgZXhpdF9sYWJlbD0wOworICAgIGlmKGM9PUxBQkVMKSBleGl0X2xhYmVsPXAtPnR5cGY7CisKKyAgICAvKiBbUngrXSBpbiBxMSAqLworICAgIGlmKCFwLT5xMS5hbSYmKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopKXsKKyAgICAgIHI9cC0+cTEucmVnOyB0PXExdHlwKHApOworICAgICAgaWYoKCEocC0+cTIuZmxhZ3MmUkVHKXx8cC0+cTIucmVnIT1yKSYmKCEocC0+ei5mbGFncyZSRUcpfHxwLT56LnJlZyE9cikpeworCWZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKwkgIGMyPXAyLT5jb2RlOworCSAgaWYoKGMyPT1BRER8fChjMj09QURESTJQJiYocDItPnR5cGYyJk5RKSE9SFBPSU5URVIpKSYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09ciYmcDItPnoucmVnPT1yJiYocDItPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKwkgICAgZXZhbF9jb25zdCgmcDItPnEyLnZhbCxwMi0+dHlwZjIpOworCSAgICBpZih6bWVxdG8odm1heCxsMnptKDFMKSkmJklTSFdPUkQodCkpeworCSAgICAgIHAyLT5jb2RlPU5PUDsKKwkgICAgICBwMi0+cTEuZmxhZ3M9cDItPnEyLmZsYWdzPXAyLT56LmZsYWdzPTA7CisJICAgICAgcC0+cTEuYW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworCSAgICAgIHAtPnExLmFtLT5mbGFncz1QT1NUX0lOQzsKKwkgICAgICBwLT5xMS5hbS0+YmFzZT1yOworCSAgICB9ZWxzZSBicmVhazsKKwkgIH0KKwkgIGlmKGMyPT1DQUxMfHxjMj09TEFCRUx8fChjMj49QkVRJiZjMjw9QlJBKSkgYnJlYWs7CisJICBpZigoKHAyLT5xMS5mbGFncyZSRUcpJiZwMi0+cTEucmVnPT1yKXx8KChwMi0+cTIuZmxhZ3MmUkVHKSYmcDItPnEyLnJlZz09cil8fCgocDItPnouZmxhZ3MmUkVHKSYmcDItPnoucmVnPT1yKSkgYnJlYWs7CisJfQorICAgICAgfQorICAgIH0KKyAgICAvKiBbUngrXSBpbiBxMiAqLworICAgIGlmKCFwLT5xMi5hbSYmKHAtPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopKXsKKyAgICAgIHI9cC0+cTIucmVnOyB0PXEydHlwKHApOworICAgICAgaWYoKCEocC0+cTEuZmxhZ3MmUkVHKXx8cC0+cTEucmVnIT1yKSYmKCEocC0+ei5mbGFncyZSRUcpfHxwLT56LnJlZyE9cikpeworCWZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKyAgICAgICAgICBjMj1wMi0+Y29kZTsKKwkgIGlmKChjMj09QUREfHwoYzI9PUFEREkyUCYmKHAyLT50eXBmMiZOUSkhPUhQT0lOVEVSKSkmJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMS5yZWc9PXImJnAyLT56LnJlZz09ciYmKHAyLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisJICAgIGV2YWxfY29uc3QoJnAyLT5xMi52YWwscDItPnR5cGYyKTsKKwkgICAgaWYoem1lcXRvKHZtYXgsbDJ6bSgxTCkpJiZJU0hXT1JEKHQpKXsKKwkgICAgICBwMi0+Y29kZT1OT1A7CisJICAgICAgcDItPnExLmZsYWdzPXAyLT5xMi5mbGFncz1wMi0+ei5mbGFncz0wOworCSAgICAgIHAtPnEyLmFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKKwkgICAgICBwLT5xMi5hbS0+ZmxhZ3M9UE9TVF9JTkM7CisJICAgICAgcC0+cTIuYW0tPmJhc2U9cjsKKwkgICAgfWVsc2UgYnJlYWs7CisJICB9CisJICBpZihjMj09Q0FMTHx8YzI9PUxBQkVMfHwoYzI+PUJFUSYmYzI8PUJSQSkpIGJyZWFrOworCSAgaWYoKChwMi0+cTEuZmxhZ3MmUkVHKSYmcDItPnExLnJlZz09cil8fCgocDItPnEyLmZsYWdzJlJFRykmJnAyLT5xMi5yZWc9PXIpfHwoKHAyLT56LmZsYWdzJlJFRykmJnAyLT56LnJlZz09cikpIGJyZWFrOworCX0KKyAgICAgIH0KKyAgICB9CisgICAgLyogW1J4K10gaW4geiAqLworICAgIC8qIGN1cnJlbnRseSB3ZSBkbyBpdCBvbmx5IGlmIHEyIGlzIGVtcHR5OyBjb3VsZCBiZSBtb3JlIGNsZXZlciAqLworICAgIGlmKCFwLT56LmFtJiYhcC0+cTIuZmxhZ3MmJihwLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopKXsKKyAgICAgIHI9cC0+ei5yZWc7IHQ9enR5cChwKTsKKyAgICAgIGlmKCghKHAtPnExLmZsYWdzJlJFRyl8fHAtPnExLnJlZyE9cikmJighKHAtPnEyLmZsYWdzJlJFRyl8fHAtPnEyLnJlZyE9cikpeworCWZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKyAgICAgICAgICBjMj1wMi0+Y29kZTsKKwkgIGlmKChjMj09QUREfHwoYzI9PUFEREkyUCYmKHAyLT50eXBmMiZOUSkhPUhQT0lOVEVSKSkmJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMS5yZWc9PXImJnAyLT56LnJlZz09ciYmKHAyLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisJICAgIGV2YWxfY29uc3QoJnAyLT5xMi52YWwscDItPnR5cGYyKTsKKwkgICAgaWYoem1lcXRvKHZtYXgsbDJ6bSgxTCkpJiZJU0hXT1JEKHQpKXsKKwkgICAgICBwMi0+Y29kZT1OT1A7CisJICAgICAgcDItPnExLmZsYWdzPXAyLT5xMi5mbGFncz1wMi0+ei5mbGFncz0wOworCSAgICAgIHAtPnouYW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworCSAgICAgIHAtPnouYW0tPmZsYWdzPVBPU1RfSU5DOworCSAgICAgIHAtPnouYW0tPmJhc2U9cjsKKwkgICAgfWVsc2UgYnJlYWs7CisJICB9CisJICBpZihjMj09Q0FMTHx8YzI9PUxBQkVMfHwoYzI+PUJFUSYmYzI8PUJSQSkpIGJyZWFrOworCSAgaWYoKChwMi0+cTEuZmxhZ3MmUkVHKSYmcDItPnExLnJlZz09cil8fCgocDItPnEyLmZsYWdzJlJFRykmJnAyLT5xMi5yZWc9PXIpfHwoKHAyLT56LmZsYWdzJlJFRykmJnAyLT56LnJlZz09cikpIGJyZWFrOworCX0KKyAgICAgIH0KKyAgICB9CisgICAgLyogLS1AUnggKi8KKyAgICBpZihjPT1TVUJJRlAmJmlzcmVnKHExKSYmaXNyZWcoeikmJnAtPnExLnJlZz09cC0+ei5yZWcmJnAtPnExLnJlZzw9MTYmJmlzY29uc3QocTIpKXsKKyAgICAgIGxvbmcgc3o7CisgICAgICByPXAtPnExLnJlZzsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxxMnR5cChwKSk7CisgICAgICBzej16bTJsKHZtYXgpOworICAgICAgaWYoc3o9PTEpeworCWZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKwkgIGMyPXAyLT5jb2RlOworCSAgaWYoIXAyLT5xMS5hbSYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnExLnJlZz09ciYmKCEocDItPnEyLmZsYWdzJlJFRyl8fHAyLT5xMi5yZWchPXIpJiYoIShwMi0+ei5mbGFncyZSRUcpfHxwMi0+ei5yZWchPXIpJiYoYzIhPUNPTlZFUlR8fChxMXR5cChwMikmTlEpPD0oenR5cChwMikmTlEpKSl7CisJICAgIHQ9KHExdHlwKHAyKSZOUSk7CisJICAgIGlmKChJU0lOVCh0KXx8SVNQT0lOVEVSKHQpKSYmSVNIV09SRCh0KSYmem1lcXRvKHNpemV0YWJbcTF0eXAocDIpJk5RXSxsMnptKHN6KSkmJiFpc2xpYmNhbGwocDIpKXsKKwkgICAgICBwMi0+cTEuYW09YW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworCSAgICAgIHAyLT5xMS52YWwudm1heD1sMnptKDBMKTsKKwkgICAgICBhbS0+YmFzZT1yOworCSAgICAgIGFtLT5mbGFncz1QUkVfREVDOworCSAgICAgIHAtPmNvZGU9Tk9QOworCSAgICAgIHAtPnExLmZsYWdzPXAtPnEyLmZsYWdzPXAtPnouZmxhZ3M9MDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgfQorCSAgaWYoIXAyLT5xMi5hbSYmKHAyLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnEyLnJlZz09ciYmKCEocDItPnExLmZsYWdzJlJFRyl8fHAyLT5xMS5yZWchPXIpJiYoIShwMi0+ei5mbGFncyZSRUcpfHxwMi0+ei5yZWchPXIpKXsKKwkgICAgdD0ocTJ0eXAocDIpJk5RKTsKKwkgICAgaWYoKElTSU5UKHQpfHxJU1BPSU5URVIodCkpJiZJU0hXT1JEKHQpJiZ6bWVxdG8oc2l6ZXRhYltxMnR5cChwMikmTlFdLGwyem0oc3opKSYmIWlzbGliY2FsbChwMikpeworCSAgICAgIHAyLT5xMi5hbT1hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CisJICAgICAgcDItPnEyLnZhbC52bWF4PWwyem0oMEwpOworCSAgICAgIGFtLT5iYXNlPXI7CisJICAgICAgYW0tPmZsYWdzPVBSRV9ERUM7CisJICAgICAgcC0+Y29kZT1OT1A7CisJICAgICAgcC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICB9CisJICAvKiBjdXJyZW50bHkgd2UgZG8gaXQgb25seSBpZiBxMiBpcyBlbXB0eTsgcGVyaGFwcyBiZSBtb3JlIGNsZXZlciBpbiB0aGUgZnV0dXJlICovCisJICBpZighcDItPnouYW0mJiFwMi0+cTIuZmxhZ3MmJihwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnoucmVnPT1yJiYoIShwMi0+cTIuZmxhZ3MmUkVHKXx8cDItPnEyLnJlZyE9cikmJighKHAyLT5xMS5mbGFncyZSRUcpfHxwMi0+cTEucmVnIT1yKSl7CisJICAgIHQ9KHp0eXAocDIpJk5RKTsKKwkgICAgaWYoKElTSU5UKHQpfHxJU1BPSU5URVIodCkpJiZJU0hXT1JEKHQpJiZ6bWVxdG8oc2l6ZXRhYlt6dHlwKHAyKSZOUV0sbDJ6bShzeikpJiYhaXNsaWJjYWxsKHAyKSl7CisJICAgICAgcDItPnouYW09YW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworCSAgICAgIHAyLT56LnZhbC52bWF4PWwyem0oMEwpOworCSAgICAgIGFtLT5iYXNlPXI7CisJICAgICAgYW0tPmZsYWdzPVBSRV9ERUM7CisJICAgICAgcC0+Y29kZT1OT1A7CisJICAgICAgcC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICB9CisJICBpZihjMj09Q0FMTHx8YzI9PUxBQkVMfHwoYzI+PUJFUSYmYzI8PUJSQSkpIGJyZWFrOworCSAgaWYoKHAyLT5xMS5mbGFncyZSRUcpJiZwMi0+cTEucmVnPT1yKSBicmVhazsKKwkgIGlmKChwMi0+cTIuZmxhZ3MmUkVHKSYmcDItPnEyLnJlZz09cikgYnJlYWs7CisJICBpZigocDItPnouZmxhZ3MmUkVHKSYmcDItPnoucmVnPT1yKSBicmVhazsKKwl9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqICpjYW0oaW50IGZsYWdzLGludCBiYXNlLGxvbmcgb2Zmc2V0LHN0cnVjdCBWYXIgKnYpCisvKiAgSW5pdGlhbGl6ZXMgYW4gYWRkcmVzc2luZy1tb2RlIHN0cnVjdHVyZSBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gICAqLworLyogIHRoYXQgb2JqZWN0LiBXaWxsIG5vdCBzdXJ2aXZlIGEgc2Vjb25kIGNhbGwhICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgc3RhdGljIHN0cnVjdCBvYmogb2JqOworICBzdGF0aWMgc3RydWN0IEFkZHJlc3NpbmdNb2RlIGFtOworICBvYmouYW09JmFtOworICBhbS5mbGFncz1mbGFnczsKKyAgYW0uYmFzZT1iYXNlOworICByZXR1cm4gJm9iajsKK30KKworCisvKiBsb2FkIGFuIG9wZXJhbmQgaWYgbmVjZXNzYXJ5LCB1c2UgcmVnaXN0ZXIgciBpZiBuZWVkZWQgKi8KK3N0YXRpYyB2b2lkIGxvYWRfb3AoRklMRSAqZixzdHJ1Y3Qgb2JqICpvLGludCB0LGludCByKQoreworICBpZihvLT5hbSkKKyAgICByZXR1cm47CisKKyAgaWYoby0+ZmxhZ3MmKFJFR3xWQVJBRFIpKQorICAgIHJldHVybjsKKworICBpZihvLT5mbGFncyZLT05TVCl7CisgICAgaWYoKHQmTlEpPT1ET1VCTEV8fCh0Jk5RKT09TERPVUJMRSl7CisgICAgICBpbnQgbD1hZGRmcGNvbnN0KG8sdCk7CisgICAgICBlbWl0KGYsIlx0bW92ZVx0JXMlZCwlc1xuIixsYWJwcmVmaXgsbCxyZWduYW1lc1tyXSk7CisgICAgICBvLT5yZWc9cjsKKyAgICAgIG8tPmZsYWdzPVJFR3xEUkVGT0JKOworICAgIH1lbHNlIGlmKGxvYWRfY29uc3R8fChvLT5mbGFncyZEUkVGT0JKKSl7CisgICAgICBlbWl0KGYsIlx0bW92ZVx0Iik7CisgICAgICBlbWl0X29iaihmLG8sdCk7CisgICAgICBlbWl0KGYsIiwlc1xuIixyZWduYW1lc1tyXSk7CisgICAgICBvLT5mbGFnc3w9UkVHOworICAgICAgby0+ZmxhZ3MmPX5LT05TVDsKKyAgICB9ZWxzZQorICAgICAgcmV0dXJuOworICB9ZWxzZXsKKyAgICBpZihvLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CisgICAgICBpZihJU0hXT1JEKHQpJiZ2b2ZmKG8pPT0wKXsKKwlpZihvLT5mbGFncyZEUkVGT0JKKXsKKwkgIGVtaXQoZiwiXHRtb3ZlXHRAJXMsJXNcbiIscmVnbmFtZXNbc3BdLHJlZ25hbWVzW3JdKTsKKwkgIG8tPnJlZz1yOworCSAgby0+ZmxhZ3N8PVJFR3xEUkVGT0JKOworCSAgQlNFVChyZWdzX21vZGlmaWVkLHIpOworCSAgcmV0dXJuOworCX1lbHNlCisJICByPXNwOworICAgICAgfWVsc2V7CisJZW1pdChmLCJcdG1vdmVcdCVzLCVzXG4iLHJlZ25hbWVzW3NwXSxyZWduYW1lc1tyXSk7CisJaWYodm9mZihvKSkKKwkgIGVtaXQoZiwiXHRhZGRcdCVsZCwlc1xuIix2b2ZmKG8pLHJlZ25hbWVzW3JdKTsKKyAgICAgIH0KKyAgICAgIAorICAgIH1lbHNleworICAgICAgZW1pdChmLCJcdG1vdmVcdCIpOworICAgICAgZW1pdF9vYmooZixvLHQpOworICAgICAgZW1pdChmLCIsJXNcbiIscmVnbmFtZXNbcl0pOworICAgIH0KKyAgICAKKyAgICAKKyAgICBpZihvLT5mbGFncyZEUkVGT0JKKXsKKyAgICAgIGVtaXQoZiwiXHRtb3ZlXHRAJXMsJXNcbiIscmVnbmFtZXNbcl0scmVnbmFtZXNbcl0pOworICAgIH0KKyAgICAKKyAgICBvLT5mbGFnc3w9UkVHfERSRUZPQko7CisgIH0KKworICBCU0VUKHJlZ3NfbW9kaWZpZWQscik7CisgIG8tPnJlZz1yOworfQorCitzdGF0aWMgdm9pZCBtb3ZlKEZJTEUgKmYsc3RydWN0IG9iaiAqcSxpbnQgcXIsc3RydWN0IG9iaiAqeixpbnQgenIsaW50IHQpCisvKiAgR2VuZXJhdGVzIGNvZGUgdG8gbW92ZSBvYmplY3QgcSAob3IgcmVnaXN0ZXIgcXIpIGludG8gb2JqZWN0IHogKG9yICAqLworLyogIHJlZ2lzdGVyIHpyKS4gT25lIG11c3QgYmUgYSByZWdpc3RlciBhbmQgRFJFRk9CSiBvbmx5IGFsbG93ZWQgd2l0aCAgKi8KKy8qICByZWdpc3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGlmKHEmJnomJmNvbXBhcmVfb2JqZWN0cyhxLHopKQorICAgIHJldHVybjsKKworICBpZihxJiYocS0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRykgcXI9cS0+cmVnOworICBpZih6JiYoei0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRykgenI9ei0+cmVnOworCisgIGlmKHFyJiZxcj09enIpCisgICAgcmV0dXJuOworCisKKyAgaWYoSVNMV09SRCh0KSl7CisgICAgaWYoIXFyKSBsb2FkX29wKGYscSx0LHQxKTsKKyAgICBpZighenIpIGxvYWRfb3AoZix6LHQsdDIpOworICAgIAorICAgIGVtaXQoZiwiXHRtb3ZlXHQiKTsKKyAgICBpZihxciYmcmVnX3BhaXIocXIsJnJwKSkKKyAgICAgIGVtaXQoZiwiJXMiLHJlZ25hbWVzW3JwLnIxXSk7CisgICAgZWxzZQorICAgICAgZW1pdF9sd29yZChmLHEsdCwiQCVzKysiKTsKKyAgICBlbWl0KGYsIiwiKTsKKyAgICBpZih6ciYmcmVnX3BhaXIoenIsJnJwKSkKKyAgICAgIGVtaXQoZiwiJXMiLHJlZ25hbWVzW3JwLnIxXSk7CisgICAgZWxzZQorICAgICAgZW1pdF9sd29yZChmLHosdCwiQCVzKysiKTsKKyAgICBlbWl0KGYsIlxuIik7CisgICAgZW1pdChmLCJcdG1vdmVcdCIpOworICAgIGlmKHFyJiZyZWdfcGFpcihxciwmcnApKQorICAgICAgZW1pdChmLCIlcyIscmVnbmFtZXNbcnAucjJdKTsKKyAgICBlbHNlCisgICAgICBlbWl0X2h3b3JkKGYscSx0LCJAJXMrKyIpOworICAgIGVtaXQoZiwiLCIpOworICAgIGlmKHpyJiZyZWdfcGFpcih6ciwmcnApKQorICAgICAgZW1pdChmLCIlcyIscmVnbmFtZXNbcnAucjJdKTsKKyAgICBlbHNlCisgICAgICBlbWl0X2h3b3JkKGYseix0LCJAJXMrKyIpOworICAgIGVtaXQoZiwiXG4iKTsKKyAgICBpZighcXIpIGNsZWFudXBfbHdvcmQoZixxKTsKKyAgICBpZighenIpIGNsZWFudXBfbHdvcmQoZix6KTsKKyAgICByZXR1cm47CisgIH0KKworCisgIGVtaXQoZiwiXHRtb3ZlXHQiKTsKKyAgaWYocXIpIGVtaXQoZiwiJXMiLHJlZ25hbWVzW3FyXSk7IGVsc2UgZW1pdF9vYmooZixxLHQpOworICBlbWl0KGYsIiwiKTsKKyAgaWYoenIpIGVtaXQoZiwiJXMiLHJlZ25hbWVzW3pyXSk7IGVsc2UgZW1pdF9vYmooZix6LHQpOworICBlbWl0KGYsIlxuIik7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3JlZyhGSUxFICpmLHN0cnVjdCBJQyAqcCkKK3sKKyAgaW50IGk7CisgIGZvcihpPTE7aTw9MTY7aSsrKXsKKyAgICBpZighcmVnc1tpXSYmKHJlZ3NjcmF0Y2hbaV18fHJlZ3VzZWRbaV0pJiYhcmVnc2FbaV0peworICAgICAgQlNFVChyZWdzX21vZGlmaWVkLGkpOworICAgICAgcmV0dXJuIGk7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisKKworc3RhdGljIHZvaWQgc2F2ZV9yZXN1bHQoRklMRSAqZixpbnQgcixzdHJ1Y3QgSUMgKnAsaW50IHQpCisvKiAgU2F2ZXMgcmVzdWx0IGluIHJlZ2lzdGVyIHIgdG8gb2JqZWN0IG8uIE1heSB1c2UgdHAgb3IgdGkuICovIAoreworICBpZXJyb3IoMCk7Cit9CisKK3N0YXRpYyBpbnQgc2NyYXRjaHJlZyhpbnQgcixzdHJ1Y3QgSUMgKnApCit7CisgIGludCBjOworICBpZihyPT10MXx8cj09dDIpCisgICAgcmV0dXJuIDE7CisgIHdoaWxlKDEpeworICAgIHA9cC0+bmV4dDsKKyAgICBpZighcHx8KChjPXAtPmNvZGUpPT1GUkVFUkVHJiZwLT5xMS5yZWc9PXIpKSByZXR1cm4gMTsKKyAgICBpZihjPT1DQUxMfHwoYz49QkVRJiZjPD1CUkEpKSByZXR1cm4gMDsKKyAgICBpZigocC0+cTEuZmxhZ3MmUkVHKSYmcC0+cTEucmVnPT1yKSByZXR1cm4gMDsKKyAgICBpZigocC0+cTIuZmxhZ3MmUkVHKSYmcC0+cTIucmVnPT1yKSByZXR1cm4gMDsKKyAgICBpZigocC0+ei5mbGFncyZSRUcpJiZwLT56LnJlZz09cikgcmV0dXJuIDA7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgRW5kIG9mIHByaXZhdGUgZmF0YSBhbmQgZnVuY3Rpb25zLiAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgZW1pdF9wZWVwaG9sZSh2b2lkKQoreworICBpbnQgZW50cmllcyxpLHIxLHIyLHIzLHI0O2xvbmcgeCx5LHo7CisgIGNoYXIgKmFzbWxpbmVbRU1JVF9CVUZfREVQVEhdOworICBjaGFyIHMxWzE2XSxzMlsxNl07CisKKyAgaWYoTk9QRUVQKQorICAgIHJldHVybiAwOworCisgIGk9ZW1pdF9sOworICBpZihlbWl0X2Y9PTApCisgICAgZW50cmllcz1pLWVtaXRfZisxOworICBlbHNlCisgICAgZW50cmllcz1FTUlUX0JVRl9ERVBUSDsKKyAgYXNtbGluZVswXT1lbWl0X2J1ZmZlcltpXTsKKyAKKyAgaWYoZW50cmllcz49MSl7CisgICAgaWYoc3NjYW5mKGFzbWxpbmVbMF0sIlx0bW92ZVx0MCxSJWQiLCZyMSk9PTEpeworICAgICAgc3ByaW50Zihhc21saW5lWzBdLCJcdHhvclx0UiVkLFIlZFxuIixyMSxyMSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKworICBpZihlbnRyaWVzPj0yKXsKKyAgICBpLS07CisgICAgaWYoaTwwKSBpPUVNSVRfQlVGX0RFUFRILTE7CisgICAgYXNtbGluZVsxXT1lbWl0X2J1ZmZlcltpXTsKKyAgICBpZihzc2NhbmYoYXNtbGluZVswXSwiXHQlMTVzXHQlbGQsUiVkIixzMSwmeCwmcjEpPT0zJiZzc2NhbmYoYXNtbGluZVsxXSwiXHQlMTVzXHQlbGQsUiVkIixzMiwmeSwmcjIpPT0zJiZyMT09cjImJiFzdHJjbXAoczEsczIpJiYoIXN0cmNtcChzMSwiYWRkIil8fCFzdHJjbXAoczEsInN1YiIpfHwhc3RyY21wKHMxLCJzaGwiKXx8IXN0cmNtcChzMSwic2hyIikpKXsKKyAgICAgIHNwcmludGYoYXNtbGluZVsxXSwiXHQlc1x0JWxkLFIlZFxuIixzMSx4K3kscjEpOworICAgICAgcmVtb3ZlX2FzbSgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmKHNzY2FuZihhc21saW5lWzBdLCJcdCUxNXNcdCVsZCxAUiVkIixzMSwmeCwmcjEpPT0zJiZzc2NhbmYoYXNtbGluZVsxXSwiXHQlMTVzXHQlbGQsQFIlZCIsczIsJnksJnIyKT09MyYmcjE9PXIyJiYhc3RyY21wKHMxLHMyKSYmKCFzdHJjbXAoczEsImFkZCIpfHwhc3RyY21wKHMxLCJzdWIiKXx8IXN0cmNtcChzMSwic2hsIil8fCFzdHJjbXAoczEsInNociIpKSl7CisgICAgICBzcHJpbnRmKGFzbWxpbmVbMV0sIlx0JXNcdCVsZCxAUiVkXG4iLHMxLHgreSxyMSk7CisgICAgICByZW1vdmVfYXNtKCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYoc3NjYW5mKGFzbWxpbmVbMF0sIlx0bW92ZVx0UiVkLFIlZCIsJnIxLCZyMik9PTImJnNzY2FuZihhc21saW5lWzFdLCJcdG1vdmVcdFIlZCxSJWQiLCZyMywmcjQpPT0yJiZyMT09cjQmJnIyPT1yMyl7CisgICAgICByZW1vdmVfYXNtKCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYoc3NjYW5mKGFzbWxpbmVbMF0sIlx0c2hsXHQxLFIlZCIsJnIxKT09MSYmIXN0cnN0cihhc21saW5lWzBdLCJzaHIiKSl7CisgICAgICBzcHJpbnRmKGFzbWxpbmVbMF0sIlx0YWRkXHRSJWQsUiVkXG4iLHIxLHIxKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfSAKKworICByZXR1cm4gMDsKK30KKworaW50IGluaXRfY2codm9pZCkKKy8qICBEb2VzIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbnMgZm9yIHRoZSBjb2RlLWdlbmVyYXRvci4gR2V0cyBjYWxsZWQgICovCisvKiAgb25jZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCBzaG91bGQgcmV0dXJuIDAgaW4gY2FzZSBvZiBwcm9ibGVtcy4gICAgICAqLworeworICBpbnQgaTsKKyAgLyogIEluaXRpYWxpemUgc29tZSB2YWx1ZXMgd2hpY2ggY2Fubm90IGJlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgICAqLworICAvKiAgYmVjYXVzZSB0aGV5IGFyZSBzdG9yZWQgaW4gdGhlIHRhcmdldCdzIGFyaXRobWV0aWMuICAgICAgICAgICAgICovCisgIG1heGFsaWduPWwyem0oMUwpOworICBzdGFja2FsaWduPWwyem0oMUwpOworICBjaGFyX2JpdD1sMnptKDE2TCk7CisgIGZvcihpPTA7aTw9TUFYX1RZUEU7aSsrKXsKKyAgICBzaXpldGFiW2ldPWwyem0obXNpemV0YWJbaV0pOworICAgIGFsaWduW2ldPWwyem0obWFsaWduW2ldKTsKKyAgfQorICBmb3IoaT0xO2k8PU1BWFI7aSsrKXsKKyAgICBpZihpPD0xNil7CisgICAgICByZWdzaXplW2ldPWwyem0oMUwpO3JlZ3R5cGVbaV09Jml0eXA7CisgICAgfWVsc2V7CisgICAgICByZWdzaXplW2ldPWwyem0oMkwpO3JlZ3R5cGVbaV09Jmx0eXA7CisgICAgfQorICB9CQorICAKKyAgLyogIEluaXRpYWxpemUgdGhlIG1pbi9tYXgtc2V0dGluZ3MuIE5vdGUgdGhhdCB0aGUgdHlwZXMgb2YgdGhlICAgICAqLworICAvKiAgaG9zdCBzeXN0ZW0gbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSB0YXJnZXQgc3lzdGVtIGFuZCB5b3UgbWF5ICovCisgIC8qICBvbmx5IHVzZSB0aGUgc21hbGxlc3QgbWF4aW11bSB2YWx1ZXMgQU5TSSBndWFyYW50ZWVzIGlmIHlvdSAgICAgKi8KKyAgLyogIHdhbnQgdG8gYmUgcG9ydGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgVGhhdCdzIHRoZSByZWFzb24gZm9yIHRoZSBzdWJ0cmFjdGlvbiBpbiB0X21pbltJTlRdLiBMb25nIGNvdWxkICovCisgIC8qICBiZSB1bmFibGUgdG8gcmVwcmVzZW50IC0yMTQ3NDgzNjQ4IG9uIHRoZSBob3N0IHN5c3RlbS4gICAgICAgICAgKi8KKyAgdF9taW5bQ0hBUl09bDJ6bSgtMzI3NjhMKTsKKyAgdF9taW5bU0hPUlRdPWwyem0oLTMyNzY4TCk7CisgIHRfbWluW0lOVF09dF9taW5bU0hPUlRdOworICB0X21pbltMT05HXT16bXN1YihsMnptKC0yMTQ3NDgzNjQ3TCksbDJ6bSgxTCkpOworICB0X21pbltMTE9OR109em1sc2hpZnQobDJ6bSgxTCksbDJ6bSg2M0wpKTsKKyAgdF9taW5bTUFYSU5UXT10X21pbihMTE9ORyk7CisgIHRfbWF4W0NIQVJdPXVsMnp1bSgzMjc2N1VMKTsKKyAgdF9tYXhbU0hPUlRdPXVsMnp1bSgzMjc2N1VMKTsKKyAgdF9tYXhbSU5UXT10X21heFtTSE9SVF07CisgIHRfbWF4W0xPTkddPXVsMnp1bSgyMTQ3NDgzNjQ3VUwpOworICB0X21heFtMTE9OR109enVtcnNoaWZ0KHp1bWtvbXBsKHVsMnp1bSgwVUwpKSx1bDJ6dW0oMVVMKSk7CisgIHRfbWF4W01BWElOVF09dF9tYXgoTExPTkcpOworICB0dV9tYXhbQ0hBUl09dWwyenVtKDY1NTM1VUwpOworICB0dV9tYXhbU0hPUlRdPXVsMnp1bSg2NTUzNVVMKTsKKyAgdHVfbWF4W0lOVF09dHVfbWF4W1NIT1JUXTsKKyAgdHVfbWF4W0xPTkddPXVsMnp1bSg0Mjk0OTY3Mjk1VUwpOworICB0dV9tYXhbTExPTkddPXp1bWtvbXBsKHVsMnp1bSgwVUwpKTsKKyAgdHVfbWF4W01BWElOVF09dF9tYXgoVU5TSUdORUR8TExPTkcpOworCisgIC8qICBSZXNlcnZlIGEgZmV3IHJlZ2lzdGVycyBmb3IgdXNlIGJ5IHRoZSBjb2RlLWdlbmVyYXRvci4gICAgICAqLworICByZWdzYVtzcF09cmVnc2Fbc3JdPXJlZ3NhW3BjXT1yZWdzYVt0MV09cmVnc2FbdDJdPXJlZ3NhW01UTVAxXT0xOworICByZWdzY3JhdGNoW3NwXT1yZWdzY3JhdGNoW3NyXT1yZWdzY3JhdGNoW3BjXT1yZWdzY3JhdGNoW3QxXT1yZWdzY3JhdGNoW3QyXT0wOworICB0YXJnZXRfbWFjcm9zPW1hcnJheTsKKyAgaWYoVElOWSkgbWFycmF5WzBdPSJfX1RJTllfXyI7CisgIGVsc2UgaWYoTEFSR0UpIG1hcnJheVswXT0iX19MQVJHRV9fIjsKKyAgZWxzZSBpZihIVUdFKSBtYXJyYXlbMF09Il9fSFVHRV9fIjsKKyAgZWxzZSBtYXJyYXlbMF09Il9fTUVESVVNX18iOworCisgIC8qc3RhdGljX2NzZT0wOyovCisgIGRyZWZfY3NlPTA7CisKKyAgaWYoZ19mbGFnc1s5XSZVU0VERkxBRykKKyAgICByd3RocmVzaG9sZD1nX2ZsYWdzX3ZhbFs5XS5sOworICBlbHNleworICAgIGlmKG9wdHNwZWVkKQorICAgICAgcnd0aHJlc2hvbGQ9MTsKKyAgICBlbHNlCisgICAgICByd3RocmVzaG9sZD0yOworICB9CisKKyAgLyogVE9ETzogc2V0IGFyZ3VtZW50IHJlZ2lzdGVycyAqLworICBkZWNsYXJlX2J1aWx0aW4oIl9fbXVsaW50MzIiLExPTkcsTE9ORyxyOHI5LExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2aW50MzIiLExPTkcsTE9ORyxyOHI5LExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2dWludDMyIixMT05HLExPTkcscjhyOSxMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZGludDMyIixMT05HLExPTkcscjhyOSxMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZHVpbnQzMiIsTE9ORyxMT05HLHI4cjksTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19sc2xpbnQzMiIsTE9ORyxMT05HLHI4cjksSU5ULDExLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19sc3JpbnQzMiIsTE9ORyxMT05HLHI4cjksSU5ULDExLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19sc3J1aW50MzIiLExPTkcsTE9ORyxyOHI5LElOVCwxMSwxLDApOworCisgIGRlY2xhcmVfYnVpbHRpbigiX19tdWxpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19hZGRpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19zdWJpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19hbmRpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19vcmludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2VvcmludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX25lZ2ludDY0IixMTE9ORyxMTE9ORywwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbHNsaW50NjQiLExMT05HLExMT05HLDAsSU5ULDAsMSwwKTsKKworICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2aW50NjQiLExMT05HLExMT05HLDAsTExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2dWludDY0IixVTlNJR05FRHxMTE9ORyxVTlNJR05FRHxMTE9ORywwLFVOU0lHTkVEfExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZGludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZHVpbnQ2NCIsVU5TSUdORUR8TExPTkcsVU5TSUdORUR8TExPTkcsMCxVTlNJR05FRHxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19sc3JpbnQ2NCIsTExPTkcsTExPTkcsMCxJTlQsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbHNydWludDY0IixVTlNJR05FRHxMTE9ORyxVTlNJR05FRHxMTE9ORywwLElOVCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19jbXBpbnQ2NCIsSU5ULExMT05HLDAsTExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fY21wdWludDY0IixJTlQsVU5TSUdORUR8TExPTkcsMCxVTlNJR05FRHxMTE9ORywwLDEsMCk7CisKKyAgZGVjbGFyZV9idWlsdGluKCJfX3NpbnQ2NHRvZmx0MzIiLEZMT0FULExMT05HLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX191aW50NjR0b2ZsdDMyIixGTE9BVCxVTlNJR05FRHxMTE9ORywwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDY0dG9mbHQ2NCIsRE9VQkxFLExMT05HLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX191aW50NjR0b2ZsdDY0IixET1VCTEUsVU5TSUdORUR8TExPTkcsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDMydG9zaW50NjQiLExMT05HLEZMT0FULDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvdWludDY0IixVTlNJR05FRHxMTE9ORyxGTE9BVCwwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b3NpbnQ2NCIsTExPTkcsRE9VQkxFLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQ2NHRvdWludDY0IixVTlNJR05FRHxMTE9ORyxET1VCTEUsMCwwLDAsMSwwKTsKKworICBkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDMydG9mbHQzMiIsRkxPQVQsTE9ORyxyOHI5LDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fdWludDMydG9mbHQzMiIsRkxPQVQsVU5TSUdORUR8TE9ORyxyOHI5LDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDMydG9mbHQ2NCIsRE9VQkxFLExPTkcsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3VpbnQzMnRvZmx0NjQiLERPVUJMRSxVTlNJR05FRHxMT05HLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvc2ludDMyIixMT05HLEZMT0FULHI4cjksMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvdWludDMyIixVTlNJR05FRHxMT05HLEZMT0FULHI4cjksMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQ2NHRvc2ludDMyIixMT05HLERPVUJMRSwwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b3VpbnQzMiIsVU5TSUdORUR8TE9ORyxET1VCTEUsMCwwLDAsMSwwKTsKKworICBkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDE2dG9mbHQzMiIsRkxPQVQsSU5ULHI4LDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fdWludDE2dG9mbHQzMiIsRkxPQVQsVU5TSUdORUR8SU5ULHI4LDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDE2dG9mbHQ2NCIsRE9VQkxFLElOVCxyOSwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3VpbnQxNnRvZmx0NjQiLERPVUJMRSxVTlNJR05FRHxJTlQscjksMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvc2ludDE2IixJTlQsRkxPQVQscjhyOSwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDMydG91aW50MTYiLFVOU0lHTkVEfElOVCxGTE9BVCxyOHI5LDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b3NpbnQxNiIsSU5ULERPVUJMRSwwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b3VpbnQxNiIsVU5TSUdORUR8SU5ULERPVUJMRSwwLDAsMCwxLDApOworCisKKworCisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvZmx0NjQiLERPVUJMRSxGTE9BVCwwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b2ZsdDMyIixGTE9BVCxET1VCTEUsMCwwLDAsMSwwKTsKKworCisgIGRlY2xhcmVfYnVpbHRpbigiX19hZGRmbHQzMiIsRkxPQVQsRkxPQVQscjhyOSxGTE9BVCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19zdWJmbHQzMiIsRkxPQVQsRkxPQVQscjhyOSxGTE9BVCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19tdWxmbHQzMiIsRkxPQVQsRkxPQVQscjhyOSxGTE9BVCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZmbHQzMiIsRkxPQVQsRkxPQVQscjhyOSxGTE9BVCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19uZWdmbHQzMiIsRkxPQVQsRkxPQVQscjhyOSwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2NtcHNmbHQzMiIsSU5ULEZMT0FULHI4cjksRkxPQVQsMCwxLDApOworCisgIGRlY2xhcmVfYnVpbHRpbigiX19hZGRmbHQ2NCIsRE9VQkxFLERPVUJMRSwwLERPVUJMRSwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19zdWJmbHQ2NCIsRE9VQkxFLERPVUJMRSwwLERPVUJMRSwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19tdWxmbHQ2NCIsRE9VQkxFLERPVUJMRSwwLERPVUJMRSwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZmbHQ2NCIsRE9VQkxFLERPVUJMRSwwLERPVUJMRSwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19uZWdmbHQ2NCIsRE9VQkxFLERPVUJMRSwwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fY21wc2ZsdDY0IixJTlQsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKworICByZXR1cm4gMTsKK30KKworaW50IGZyZXR1cm4oc3RydWN0IFR5cCAqdCkKKy8qICBSZXR1cm5zIHRoZSByZWdpc3RlciBpbiB3aGljaCB2YXJpYWJsZXMgb2YgdHlwZSB0IGFyZSByZXR1cm5lZC4gKi8KKy8qICBJZiB0aGUgdmFsdWUgY2Fubm90IGJlIHJldHVybmVkIGluIGEgcmVnaXN0ZXIgcmV0dXJucyAwLiAgICAgICAgKi8KK3sKKyAgaW50IGY9dC0+ZmxhZ3MmTlE7CisgIGlmKGY9PUxMT05HfHxmPT1ET1VCTEV8fGY9PUxET1VCTEUpCisgICAgcmV0dXJuIDA7CisgIGlmKElTU0NBTEFSKGYpKXsKKyAgICBpZihmPT1MT05HfHxmPT1GUE9JTlRFUnx8Zj09SFBPSU5URVJ8fGY9PUZMT0FUKQorICAgICAgcmV0dXJuIHI4cjk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHI4OworICB9CisgIHJldHVybiAwOworfQorCitpbnQgcmVnb2soaW50IHIsaW50IHQsaW50IG1vZGUpCisvKiAgUmV0dXJucyAwIGlmIHJlZ2lzdGVyIHIgY2Fubm90IHN0b3JlIHZhcmlhYmxlcyBvZiAgICovCisvKiAgdHlwZSB0LiBJZiB0PT1QT0lOVEVSIGFuZCBtb2RlIT0wIHRoZW4gaXQgcmV0dXJucyAgICovCisvKiAgbm9uLXplcm8gb25seSBpZiB0aGUgcmVnaXN0ZXIgY2FuIHN0b3JlIGEgcG9pbnRlciAgICovCisvKiAgYW5kIGRlcmVmZXJlbmNlIGEgcG9pbnRlciB0byBtb2RlLiAgICAgICAgICAgICAgICAgICovCit7CisgIHQmPU5ROworICBpZihyPT0wKSByZXR1cm4oMCk7CisgIGlmKCh0PExPTkd8fHQ9PU5QT0lOVEVSKSYmcjw9MTYpIHJldHVybiAxOworICBpZih0PT1MT05HfHx0PT1GTE9BVHx8dD09RlBPSU5URVJ8fHQ9PUhQT0lOVEVSKXsKKyAgICBpZihyPjE2KSByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IHJlZ19wYWlyKGludCByLHN0cnVjdCBycGFpciAqcCkKKy8qIFJldHVybnMgMCBpZiB0aGUgcmVnaXN0ZXIgaXMgbm8gcmVnaXN0ZXIgcGFpci4gSWYgciAgKi8KKy8qIGlzIGEgcmVnaXN0ZXIgcGFpciBub24temVybyB3aWxsIGJlIHJldHVybmVkIGFuZCB0aGUgKi8KKy8qIHN0cnVjdHVyZSBwb2ludGVkIHRvIHAgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgdHdvICAgKi8KKy8qIGVsZW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYocjw9MTYpIHJldHVybiAwOworICBpZihwKXsKKyAgICBzd2l0Y2gocil7CisgICAgY2FzZSAxNzogcC0+cjE9MTtwLT5yMj0yO2JyZWFrOworICAgIGNhc2UgMTg6IHAtPnIxPTM7cC0+cjI9NDticmVhazsKKyAgICBjYXNlIDE5OiBwLT5yMT01O3AtPnIyPTY7YnJlYWs7CisgICAgY2FzZSAyMDogcC0+cjE9NztwLT5yMj04O2JyZWFrOworICAgIGNhc2UgMjE6IHAtPnIxPTk7cC0+cjI9MTA7YnJlYWs7CisgICAgY2FzZSAyMjogcC0+cjE9dDE7cC0+cjI9dDI7YnJlYWs7CisJCisgICAgZGVmYXVsdDogaWVycm9yKDApOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IGNvc3Rfc2F2aW5ncyhzdHJ1Y3QgSUMgKnAsaW50IHIsc3RydWN0IG9iaiAqbykKK3sKKyAgaW50IGM9cC0+Y29kZTsKKyAgaWYoKG8tPmZsYWdzJkRSRUZPQkopKXsKKyAgICBpZihvLT5mbGFncyZWS09OU1QpIHJldHVybiAxOworICAgIGlmKHI8PTQmJnAtPnEyLmZsYWdzJiZvIT0mcC0+eikKKyAgICAgIHJldHVybiA2OworICAgIGVsc2UKKyAgICAgIHJldHVybiA0OworICB9ZWxzZSBpZihvLT5mbGFncyZWS09OU1QpeworICAgIHN0cnVjdCBvYmogKmNvPSZvLT52LT5jb2JqOworICAgIGlmKChwLT5jb2RlPT1BU1NJR04mJihwLT56LmZsYWdzJkRSRUZPQkopKXx8cC0+Y29kZT09UFVTSCkKKyAgICAgIHJldHVybiA0OworICAgIGlmKGNvLT5mbGFncyZWQVJBRFIpCisgICAgICByZXR1cm4gNDsKKyAgICBpZihvPT0mcC0+cTEpCisgICAgICBldmFsX2NvbnN0KCZjby0+dmFsLHExdHlwKHApKTsKKyAgICBlbHNlCisgICAgICBldmFsX2NvbnN0KCZjby0+dmFsLHEydHlwKHApKTsKKyAgICAvKkZJWE1FKi8KKyAgICByZXR1cm4gMDsKKyAgfWVsc2UgaWYoYz09R0VUUkVUVVJOJiZwLT5xMS5yZWc9PXIpeworICAgIHJldHVybiA0OworICB9ZWxzZSBpZihjPT1TRVRSRVRVUk4mJnAtPnoucmVnPT1yKXsKKyAgICByZXR1cm4gNDsKKyAgfWVsc2UgaWYoYz09Q09OVkVSVCYmKChwLT50eXBmJk5RKT09Q0hBUnx8KHAtPnR5cGYyJk5RKT09Q0hBUikmJnJlZ29rKHIsQ0hBUiwwKSl7CisgICAgcmV0dXJuIDM7CisgIH0KKyAgcmV0dXJuIDI7Cit9CisKK2ludCBkYW5nZXJvdXNfSUMoc3RydWN0IElDICpwKQorLyogIFJldHVybnMgemVybyBpZiB0aGUgSUMgcCBjYW4gYmUgc2FmZWx5IGV4ZWN1dGVkICAgICAqLworLyogIHdpdGhvdXQgZGFuZ2VyIG9mIGV4Y2VwdGlvbnMgb3Igc2ltaWxhciB0aGluZ3MuICAgICAqLworLyogIHZiY2MgbWF5IGdlbmVyYXRlIGNvZGUgaW4gd2hpY2ggbm9uLWRhbmdlcm91cyBJQ3MgICAqLworLyogIGFyZSBzb21ldGltZXMgZXhlY3V0ZWQgYWx0aG91Z2ggY29udHJvbC1mbG93IG1heSAgICAqLworLyogIG5ldmVyIHJlYWNoIHRoZW0gKG1haW5seSB3aGVuIG1vdmluZyBjb21wdXRhdGlvbnMgICAqLworLyogIG91dCBvZiBsb29wcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFR5cGljYWwgSUNzIHRoYXQgZ2VuZXJhdGUgZXhjZXB0aW9ucyBvbiBzb21lICAgICAgICAqLworLyogIG1hY2hpbmVzIGFyZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtIGFjY2Vzc2VzIHZpYSBwb2ludGVycyAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtIGRpdmlzaW9uL21vZHVsbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtIG92ZXJmbG93IG9uIHNpZ25lZCBpbnRlZ2VyL2Zsb2F0cyAgICAgICAgICAgICAqLworeworICBpbnQgYz1wLT5jb2RlOworICBpZigocC0+cTEuZmxhZ3MmRFJFRk9CSil8fChwLT5xMi5mbGFncyZEUkVGT0JKKXx8KHAtPnouZmxhZ3MmRFJFRk9CSikpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitpbnQgbXVzdF9jb252ZXJ0KGludCBvLGludCB0LGludCBjb25zdF9leHByKQorLyogIFJldHVybnMgemVybyBpZiBjb2RlIGZvciBjb252ZXJ0aW5nIG5wIHRvIHR5cGUgdCAgICAqLworLyogIGNhbiBiZSBvbWl0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluIHRoaXMgZ2VuZXJpYyAzMmJpdCBSSVNDIGNwdSBwb2ludGVycyBhbmQgMzJiaXQgICAqLworLyogIGludGVnZXJzIGhhdmUgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gYW5kIGNhbiB1c2UgICAqLworLyogIHRoZSBzYW1lIHJlZ2lzdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgb3A9byZOUSx0cD10Jk5ROworICBpZihvcD09dHApIHJldHVybiAwOworICBpZihJU0hXT1JEKG9wKSYmSVNIV09SRCh0cCkpIHJldHVybiAwOworICBpZihJU0ZMT0FUKG9wKXx8SVNGTE9BVCh0cCkpIHJldHVybiAxOworICBpZihJU0xXT1JEKG9wKSYmSVNMV09SRCh0cCkpIHJldHVybiAwOworICByZXR1cm4gMTsKK30KKwordm9pZCBnZW5fZHMoRklMRSAqZix6bWF4IHNpemUsc3RydWN0IFR5cCAqdCkKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjcmVhdGUgPHNpemU+IGJ5dGVzIG9mIHN0b3JhZ2UgKi8KKy8qICBpbml0aWFsaXplZCB3aXRoIHplcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgbG9uZyBsPXptMmwoc2l6ZSkqMjsKKyAgaWYobmV3b2JqJiZzZWN0aW9uIT1TUEVDSUFMKQorICAgIGVtaXQoZiwiJWxkXG4iLGwpOworICBlbHNlCisgICAgZW1pdChmLCJcdC5zcGFjZVx0JWxkXG4iLGwpOworICBuZXdvYmo9MDsgCit9CisKK3ZvaWQgZ2VuX2FsaWduKEZJTEUgKmYsem1heCBhbGlnbikKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBtYWtlIHN1cmUgdGhlIG5leHQgZGF0YSBpcyAgICAgKi8KKy8qICBhbGlnbmVkIHRvIG11bHRpcGxlcyBvZiA8YWxpZ24+IGJ5dGVzLiAgICAgICAgICAgICAgKi8KK3sKK30KK3N0YXRpYyB2b2lkIG5ld19zZWN0aW9uKEZJTEUgKmYsaW50IG5zZWMpCit7CisgIGlmKCFmfHxzZWN0aW9uPT1uc2VjKSByZXR1cm47CisgIHNlY3Rpb249bnNlYzsKKyAgaWYobnNlYz09SERBVEEpeworICAgIGVtaXQoZixoZGF0YW5hbWUpOworICB9ZWxzZSBpZihuc2VjPT1GREFUQSl7CisgICAgZW1pdChmLGZkYXRhbmFtZSk7CisgIH1lbHNlIGlmKG5zZWM9PU5EQVRBKXsKKyAgICBlbWl0KGYsbmRhdGFuYW1lKTsKKyAgfWVsc2UgaWYobnNlYz09SENEQVRBKXsKKyAgICBlbWl0KGYsaGNkYXRhbmFtZSk7CisgIH1lbHNlIGlmKG5zZWM9PUZDREFUQSl7CisgICAgZW1pdChmLGZjZGF0YW5hbWUpOworICB9ZWxzZSBpZihuc2VjPT1OQ0RBVEEpeworICAgIGVtaXQoZixuY2RhdGFuYW1lKTsKKyAgfWVsc2UgaWYobnNlYz09SEJTUyl7CisgICAgZW1pdChmLGhic3NuYW1lKTsKKyAgfWVsc2UgaWYobnNlYz09RkJTUyl7CisgICAgZW1pdChmLGZic3NuYW1lKTsKKyAgfWVsc2UgaWYobnNlYz09TkJTUyl7CisgICAgZW1pdChmLG5ic3NuYW1lKTsKKyAgfQorfQordm9pZCBnZW5fdmFyX2hlYWQoRklMRSAqZixzdHJ1Y3QgVmFyICp2KQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSB0aGUgaGVhZCBvZiBhIHZhcmlhYmxlICAqLworLyogIGRlZmluaXRpb24sIGkuZS4gdGhlIGxhYmVsIGFuZCBpbmZvcm1hdGlvbiBmb3IgICAgICAqLworLyogIGxpbmthZ2UgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgY29uc3RmbGFnOworICBjaGFyICphdHRyO3N0cnVjdCBUeXAgKnR2OworICB0dj12LT52dHlwOworICB3aGlsZSh0di0+ZmxhZ3M9PUFSUkFZKSB0dj10di0+bmV4dDsKKyAgYXR0cj10di0+YXR0cjsKKyAgaWYodi0+Y2xpc3QpIGNvbnN0ZmxhZz1pc19jb25zdCh2LT52dHlwKTsKKyAgaWYodi0+c3RvcmFnZV9jbGFzcz09U1RBVElDKXsKKyAgICBpZihJU0ZVTkModi0+dnR5cC0+ZmxhZ3MpKSByZXR1cm47CisgICAgZW1pdChmLCJcdC50eXBlXHQlcyVsZCxAb2JqZWN0XG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICAgIGVtaXQoZiwiXHQuc2l6ZVx0JXMlbGQsJWxkXG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCksem0ybChzem9mKHYtPnZ0eXApKSoyKTsKKyAgICBpZighc3BlY2lhbF9zZWN0aW9uKGYsdikpeworICAgICAgaWYoKHYtPnZ0eXAtPmZsYWdzJk5RKT09QklUKXsKKwluZXdfc2VjdGlvbihmLEJJVFMpOworICAgICAgfWVsc2V7CisJaWYodi0+Y2xpc3QmJighY29uc3RmbGFnfHwoZ19mbGFnc1szXSZVU0VERkxBRykpKXsKKwkgIGlmKGF0dHImJnN0cnN0cihhdHRyLFNUUl9IVUdFKSkKKwkgICAgbmV3X3NlY3Rpb24oZixIREFUQSk7CisJICBlbHNlIGlmKGF0dHImJnN0cnN0cihhdHRyLFNUUl9GQVIpKQorCSAgICBuZXdfc2VjdGlvbihmLEZEQVRBKTsKKwkgIGVsc2UgaWYoYXR0ciYmc3Ryc3RyKGF0dHIsU1RSX05FQVIpKQorCSAgICBuZXdfc2VjdGlvbihmLE5EQVRBKTsKKwkgIGVsc2V7CisJICAgIGlmKEhVR0UpCisJICAgICAgbmV3X3NlY3Rpb24oZixIREFUQSk7CisJICAgIGVsc2UgaWYoTEFSR0UpCisJICAgICAgbmV3X3NlY3Rpb24oZixGREFUQSk7CisJICAgIGVsc2UKKwkgICAgICBuZXdfc2VjdGlvbihmLE5EQVRBKTsKKwkgIH0KKwl9CisJaWYodi0+Y2xpc3QmJmNvbnN0ZmxhZyYmIShnX2ZsYWdzWzNdJlVTRURGTEFHKSl7CisJICBpZihhdHRyJiZzdHJzdHIoYXR0cixTVFJfSFVHRSkpCisJICAgIG5ld19zZWN0aW9uKGYsSENEQVRBKTsKKwkgIGVsc2UgaWYoYXR0ciYmc3Ryc3RyKGF0dHIsU1RSX0ZBUikpCisJICAgIG5ld19zZWN0aW9uKGYsRkNEQVRBKTsKKwkgIGVsc2UgaWYoYXR0ciYmc3Ryc3RyKGF0dHIsU1RSX05FQVIpKQorCSAgICBuZXdfc2VjdGlvbihmLE5DREFUQSk7CisJICBlbHNleworCSAgICBpZihIVUdFKQorCSAgICAgIG5ld19zZWN0aW9uKGYsSENEQVRBKTsKKwkgICAgZWxzZSBpZihMQVJHRSkKKwkgICAgICBuZXdfc2VjdGlvbihmLEZDREFUQSk7CisJICAgIGVsc2UKKwkgICAgICBuZXdfc2VjdGlvbihmLE5DREFUQSk7CisJICB9CisJfQorCWlmKCF2LT5jbGlzdCl7CisJICBpZihhdHRyJiZzdHJzdHIoYXR0cixTVFJfSFVHRSkpCisJICAgIG5ld19zZWN0aW9uKGYsSEJTUyk7CisJICBlbHNlIGlmKGF0dHImJnN0cnN0cihhdHRyLFNUUl9GQVIpKQorCSAgICBuZXdfc2VjdGlvbihmLEZCU1MpOworCSAgZWxzZSBpZihhdHRyJiZzdHJzdHIoYXR0cixTVFJfTkVBUikpCisJICAgIG5ld19zZWN0aW9uKGYsTkJTUyk7CisJICBlbHNleworCSAgICBpZihIVUdFKQorCSAgICAgIG5ld19zZWN0aW9uKGYsSEJTUyk7CisJICAgIGVsc2UgaWYoTEFSR0UpCisJICAgICAgbmV3X3NlY3Rpb24oZixGQlNTKTsKKwkgICAgZWxzZQorCSAgICAgIG5ld19zZWN0aW9uKGYsTkJTUyk7CisJICB9CisJfQorICAgICAgfQorICAgIH0KKyAgICBnZW5fYWxpZ24oZixmYWxpZ24odi0+dnR5cCkpOworICAgIGVtaXQoZiwiJXMlbGQ6XG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICB9CisKKyAgaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKKyAgICBpZih2LT5mbGFncyYoREVGSU5FRHxURU5UQVRJVkUpKXsKKyAgICAgIGVtaXQoZiwiXHQudHlwZVx0JXMlcyxAb2JqZWN0XG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgICAgZW1pdChmLCJcdC5zaXplXHQlcyVzLCVsZFxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyLHptMmwoc3pvZih2LT52dHlwKSkqMik7CisgICAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXMlc1xuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICAgIGlmKCFzcGVjaWFsX3NlY3Rpb24oZix2KSl7CisJaWYodi0+Y2xpc3QmJighY29uc3RmbGFnfHwoZ19mbGFnc1szXSZVU0VERkxBRykpKXsKKwkgIGlmKGF0dHImJnN0cnN0cihhdHRyLFNUUl9IVUdFKSkKKwkgICAgbmV3X3NlY3Rpb24oZixIREFUQSk7CisJICBlbHNlIGlmKGF0dHImJnN0cnN0cihhdHRyLFNUUl9GQVIpKQorCSAgICBuZXdfc2VjdGlvbihmLEZEQVRBKTsKKwkgIGVsc2UgaWYoYXR0ciYmc3Ryc3RyKGF0dHIsU1RSX05FQVIpKQorCSAgICBuZXdfc2VjdGlvbihmLE5EQVRBKTsKKwkgIGVsc2V7CisJICAgIGlmKEhVR0UpCisJICAgICAgbmV3X3NlY3Rpb24oZixIREFUQSk7CisJICAgIGVsc2UgaWYoTEFSR0UpCisJICAgICAgbmV3X3NlY3Rpb24oZixGREFUQSk7CisJICAgIGVsc2UKKwkgICAgICBuZXdfc2VjdGlvbihmLE5EQVRBKTsKKwkgIH0KKwl9CisJaWYodi0+Y2xpc3QmJmNvbnN0ZmxhZyYmIShnX2ZsYWdzWzNdJlVTRURGTEFHKSl7CisJICBpZihhdHRyJiZzdHJzdHIoYXR0cixTVFJfSFVHRSkpCisJICAgIG5ld19zZWN0aW9uKGYsSENEQVRBKTsKKwkgIGVsc2UgaWYoYXR0ciYmc3Ryc3RyKGF0dHIsU1RSX0ZBUikpCisJICAgIG5ld19zZWN0aW9uKGYsRkNEQVRBKTsKKwkgIGVsc2UgaWYoYXR0ciYmc3Ryc3RyKGF0dHIsU1RSX05FQVIpKQorCSAgICBuZXdfc2VjdGlvbihmLE5DREFUQSk7CisJICBlbHNleworCSAgICBpZihIVUdFKQorCSAgICAgIG5ld19zZWN0aW9uKGYsSENEQVRBKTsKKwkgICAgZWxzZSBpZihMQVJHRSkKKwkgICAgICBuZXdfc2VjdGlvbihmLEZDREFUQSk7CisJICAgIGVsc2UKKwkgICAgICBuZXdfc2VjdGlvbihmLE5DREFUQSk7CisJICB9CisJfQorCWlmKCF2LT5jbGlzdCl7CisJICBpZihhdHRyJiZzdHJzdHIoYXR0cixTVFJfSFVHRSkpCisJICAgIG5ld19zZWN0aW9uKGYsSEJTUyk7CisJICBlbHNlIGlmKGF0dHImJnN0cnN0cihhdHRyLFNUUl9GQVIpKQorCSAgICBuZXdfc2VjdGlvbihmLEZCU1MpOworCSAgZWxzZSBpZihhdHRyJiZzdHJzdHIoYXR0cixTVFJfTkVBUikpCisJICAgIG5ld19zZWN0aW9uKGYsTkJTUyk7CisJICBlbHNleworCSAgICBpZihIVUdFKQorCSAgICAgIG5ld19zZWN0aW9uKGYsSEJTUyk7CisJICAgIGVsc2UgaWYoTEFSR0UpCisJICAgICAgbmV3X3NlY3Rpb24oZixGQlNTKTsKKwkgICAgZWxzZQorCSAgICAgIG5ld19zZWN0aW9uKGYsTkJTUyk7CisJICB9CisJfQorICAgICAgfQorICAgICAgZ2VuX2FsaWduKGYsZmFsaWduKHYtPnZ0eXApKTsKKyAgICAgIGVtaXQoZiwiJXMlczpcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgfWVsc2UgaWYoc3RyY21wKHYtPmlkZW50aWZpZXIsIl9fdmFfc3RhcnQiKSl7CisgICAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXMlc1xuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBnZW5fZGMoRklMRSAqZixpbnQgdCxzdHJ1Y3QgY29uc3RfbGlzdCAqcCkKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjcmVhdGUgc3RhdGljIHN0b3JhZ2UgICAgICAgICAgKi8KKy8qICBpbml0aWFsaXplZCB3aXRoIGNvbnN0LWxpc3QgcC4gICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYoSVNQT0lOVEVSKHQpKXsKKyAgICBpZihwLT50cmVlKQorICAgICAgZW1pdChmLCJcdCVzXHQiLGRjdFt0Jk5RXSk7IAorICAgIGlmKElTTFdPUkQodCkpCisgICAgICB0PVVOU0lHTkVEfExPTkc7CisgICAgZWxzZQorICAgICAgdD1VTlNJR05FRHxTSE9SVDsKKyAgICBpZighcC0+dHJlZSkKKyAgICAgIGVtaXQoZiwiXHQlc1x0IixkY3RbdCZOUV0pOworICB9ZWxzZXsKKyAgICBlbWl0KGYsIlx0JXNcdCIsZGN0W3QmTlFdKTsKKyAgfQorICBpZighcC0+dHJlZSl7CisgICAgaWYoSVNGTE9BVCh0KSl7CisgICAgICAvKiAgYXVjaCB3aWVkZXIgbmljaHQgc2VociBzY2hvZW4gdW5kIElFRUUgbm9ldGlnICAgKi8KKyAgICAgIHVuc2lnbmVkIGNoYXIgKmlwOworCisgICAgICBpcD0odW5zaWduZWQgY2hhciAqKSZwLT52YWwudmRvdWJsZTsKKyAgICAgIGVtaXQoZiwiMHglMDJ4JTAyeCwweCUwMnglMDJ4IixpcFsxXSxpcFswXSxpcFszXSxpcFsyXSk7CisgICAgICBpZigodCZOUSk9PURPVUJMRXx8KHQmTlEpPT1MRE9VQkxFKXsKKwllbWl0KGYsIiwweCUwMnglMDJ4LDB4JTAyeCUwMngiLGlwWzVdLGlwWzRdLGlwWzddLGlwWzZdKTsKKyAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgIGlmKElTTFdPUkQodCkpeworCWxvbmcgbDsKKwlldmFsX2NvbnN0KCZwLT52YWwsdCk7CisJbD16bTJsKHptYW5kKHAtPnZhbC52bWF4LGwyem0oNjU1MzVMKSkpOworCWVtaXQoZiwiJWxkIixsKTsKKwlsPXptMmwoem1hbmQoem1yc2hpZnQocC0+dmFsLnZtYXgsbDJ6bSgxNkwpKSxsMnptKDY1NTM1TCkpKTsKKwllbWl0KGYsIiwlbGQiLGwpOworICAgICAgfWVsc2UKKwllbWl0dmFsKGYsJnAtPnZhbCwodCZOVSl8VU5TSUdORUQpOworICAgIH0KKyAgfWVsc2V7CisgICAgaW50IG09cC0+dHJlZS0+by5mbGFnczsKKyAgICBwLT50cmVlLT5vLmZsYWdzJj1+VkFSQURSOworICAgIGVtaXRfb2JqKGYsJnAtPnRyZWUtPm8sdCZOVSk7CisgICAgcC0+dHJlZS0+by5mbGFncz1tOworICB9CisgIGVtaXQoZiwiXG4iKTsKK30KKworLyogIFRoZSBtYWluIGNvZGUtZ2VuZXJhdGlvbiByb3V0aW5lLiAgICAgICAgICAgICAgICAgICAqLworLyogIGYgaXMgdGhlIHN0cmVhbSB0aGUgY29kZSBzaG91bGQgYmUgd3JpdHRlbiB0by4gICAgICAqLworLyogIHAgaXMgYSBwb2ludGVyIHRvIGEgZG91Ymx5IGxpbmtlZCBsaXN0IG9mIElDcyAgICAgICAqLworLyogIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIGJvZHkgdG8gZ2VuZXJhdGUgY29kZSBmb3IuICAqLworLyogIHYgaXMgYSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAqLworLyogIG9mZnNldCBpcyB0aGUgc2l6ZSBvZiB0aGUgc3RhY2tmcmFtZSB0aGUgZnVuY3Rpb24gICAqLworLyogIG5lZWRzIGZvciBsb2NhbCB2YXJpYWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwordm9pZCBnZW5fY29kZShGSUxFICpmLHN0cnVjdCBJQyAqcCxzdHJ1Y3QgVmFyICp2LHptYXggb2Zmc2V0KQoreworICBpbnQgYyx0LGxhc3Rjb21wPTAsY21wemVybz0wLGVsYWI9MCxyZWcsc2hvcnRfYWRkLGJpdF9yZXZlcnNlLG5lZWRfcmV0dXJuPTA7CisgIHN0cnVjdCBvYmogKmJpdF9vYmo7Y2hhciAqYml0X3JlZzsKKyAgc3RhdGljIGludCBpZG9uZTsKKyAgc3RydWN0IG9iaiBvLCpjYz0wO2ludCBjY190OworICBzdHJ1Y3QgSUMgKnAyOworICBpZihUSU5ZKXsKKyAgICBjYWxsPSJhc3ViIjsKKyAgICBqdW1wPSJhYnJhIjsKKyAgfWVsc2V7CisgICAgY2FsbD0iYXN1YiI7CisgICAganVtcD0iYWJyYSI7CisgIH0KKyAgaWYodi0+dGF0dHImSU5URVJSVVBUKXsKKyAgICByZXQ9InJ0aSI7CisgICAgbmVlZF9yZXR1cm49MTsKKyAgfWVsc2UKKyAgICByZXQ9Im1vdmVcdEBSMTMrKyxSMTUiOworCisgIGlmKERFQlVHJjEpIHByaW50ZigiZ2VuX2NvZGUoKVxuIik7CisgIGlmKCF2LT5maSkgdi0+Zmk9bmV3X2ZpKCk7CisgIHYtPmZpLT5mbGFnc3w9QUxMX1JFR1M7CisKKyAgZm9yKHAyPXA7cDI7cDI9cDItPm5leHQpIGNsZWFyX2V4dF9pYygmcDItPmV4dCk7CisgIGlmKCEoZ19mbGFnc1s1XSZVU0VERkxBRykpeworICAgIHBlZXBob2xlKHApOworICAgIGlmKCFmcmFtZV91c2VkKSBvZmZzZXQ9bDJ6bSgwTCk7CisgIH0KKyAgZm9yKGM9MTtjPD0xNTtjKyspIHJlZ3NbY109cmVnc2FbY107CisgIHJlZ3NbMTZdPTA7CisgIGZvcihjPTE7Yzw9TUFYUjtjKyspeworICAgIGlmKHJlZ3NjcmF0Y2hbY10mJihyZWdzYVtjXXx8cmVndXNlZFtjXSkpeworICAgICAgQlNFVChyZWdzX21vZGlmaWVkLGMpOworICAgIH0KKyAgfQorICBsb2ZmPXptMmwob2Zmc2V0KTsKKyAgZnVuY3Rpb25fdG9wKGYsdixsb2ZmKTsKKyAgc3RhY2tvZmZzZXQ9bm90cG9wcGVkPWRvbnRwb3A9bWF4cHVzaGVkPTA7CisgIHN0YWNrPTA7CisgIGZvcig7cDtwcihmLHApLHA9cC0+bmV4dCl7CisgICAgYz1wLT5jb2RlO3Q9cC0+dHlwZjsKKyAgICB0Ml91c2VkPTA7IHNob3J0X2FkZD0wOworICAgIGljcD1wOworICAgIGlmKGM9PU5PUCkgY29udGludWU7CisgICAgaWYoYz09QUxMT0NSRUcpeworICAgICAgcmVnc1twLT5xMS5yZWddPTE7CisgICAgICBpZihyZWdfcGFpcihwLT5xMS5yZWcsJnJwKSkgcmVnc1tycC5yMV09cmVnc1tycC5yMl09MTsKKyAgICAgIEJTRVQocmVnc19tb2RpZmllZCxwLT5xMS5yZWcpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PUZSRUVSRUcpeworICAgICAgcmVnc1twLT5xMS5yZWddPTA7CisgICAgICBpZihyZWdfcGFpcihwLT5xMS5yZWcsJnJwKSkgcmVnc1tycC5yMV09cmVnc1tycC5yMl09MDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihub3Rwb3BwZWQmJiFkb250cG9wKXsKKyAgICAgIGludCBmbGFnPTA7CisgICAgICBpZihjPT1MQUJFTHx8Yz09Q09NUEFSRXx8Yz09VEVTVHx8Yz09QlJBKXsKKwllbWl0KGYsIlx0YWRkXHQlbGQsJXNcbiIsbm90cG9wcGVkLHJlZ25hbWVzW3NwXSk7CisJcG9wKG5vdHBvcHBlZCk7bm90cG9wcGVkPTA7Y2M9MDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoYz09TEFCRUwpIHtjYz0wO2VtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LHQpO2NvbnRpbnVlO30KKyAgICBpZihjPT1CUkEpeworICAgICAgaWYocC0+dHlwZj09ZXhpdF9sYWJlbCYmIWhhdmVfZnJhbWUpeworCWVtaXQoZiwiXHQlc1xuIixyZXQpOworICAgICAgfWVsc2V7CisJaWYodD09ZXhpdF9sYWJlbCkgbmVlZF9yZXR1cm49MTsKKwllbWl0KGYsIlx0cmJyYVx0JXMlZCwxXG4iLGxhYnByZWZpeCx0KTsKKyAgICAgIH0KKyAgICAgIGNjPTA7Y29udGludWU7CisgICAgfQorICAgIGlmKGM+PUJFUSYmYzxCUkEpeworICAgICAgY2hhciAqcz0wOworICAgICAgY2M9MDsKKyAgICAgIGlmKGNtcHplcm8peworCWNtcHplcm89MDsKKwlpZihsYXN0Y29tcCZVTlNJR05FRCl7CisJICBpZihjPT1CTFQpIGNvbnRpbnVlOworCSAgaWYoYz09QkdFKSBzPSIxIjsKKwkgIGlmKGM9PUJMRSkgcz0ieiI7CisJICBpZihjPT1CR1QpIHM9IiF6IjsKKwl9ZWxzZXsKKwkgIGlmKGM9PUJMVCkgcz0ibiI7CisJICBpZihjPT1CR0UpIHM9IiFuIjsKKwkgIGlmKGM9PUJMRSkgaWVycm9yKDApOworCSAgaWYoYz09QkdUKSBpZXJyb3IoMCk7CisJfQorICAgICAgfQorICAgICAgaWYoIXMpeworCWlmKGxhc3Rjb21wJlVOU0lHTkVEKSBzPWNjdVtjLUJFUV07IGVsc2Ugcz1jY3NbYy1CRVFdOworICAgICAgfQorICAgICAgaWYodD09ZXhpdF9sYWJlbCYmIWhhdmVfZnJhbWUpeworCWVtaXQoZiwiXHRhYnJhXHRAJXMrKywlc1xuIixyZWduYW1lc1tzcF0scyk7CisgICAgICB9ZWxzZXsKKwllbWl0KGYsIlx0cmJyYVx0JXMlZCwlc1xuIixsYWJwcmVmaXgsdCxzKTsKKwlpZih0PT1leGl0X2xhYmVsKSBuZWVkX3JldHVybj0xOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PU1PVkVUT1JFRyl7CisgICAgICBsb2FkX29wKGYsJnAtPnExLFNIT1JULHQxKTsKKyAgICAgIGlmKHAtPnoucmVnPD0xNil7CisJbW92ZShmLCZwLT5xMSwwLDAscC0+ei5yZWcsU0hPUlQpOworCWNjPSZwLT5xMTtjY190PVNIT1JUOworICAgICAgfWVsc2V7CisJbW92ZShmLCZwLT5xMSwwLDAscC0+ei5yZWcsTE9ORyk7CisJY2M9MDsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1NT1ZFRlJPTVJFRyl7CisgICAgICBsb2FkX29wKGYsJnAtPnosU0hPUlQsdDIpOworICAgICAgaWYocC0+cTEucmVnPD0xNil7CisJbW92ZShmLDAscC0+cTEucmVnLCZwLT56LDAsU0hPUlQpOworCWNjPSZwLT56O2NjX3Q9U0hPUlQ7CisgICAgICB9ZWxzZXsKKwltb3ZlKGYsMCxwLT5xMS5yZWcsJnAtPnosMCxMT05HKTsKKwljYz0wOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIGlmKGM9PVRFU1QpeworICAgICAgLyogVE9ETzogb3B0aW1pemUgaW4gQ09NUEFSRT8gKi8KKyAgICAgIGxhc3Rjb21wPXQ7CisgICAgICBpZihjYyYmKGNjX3QmTlUpPT0odCZOVSkmJmNvbXBhcmVfb2JqZWN0cyhjYywmcC0+cTEpKXsKKwljb250aW51ZTsKKyAgICAgIH0KKworICAgICAgcC0+Y29kZT1jPUNPTVBBUkU7CisgICAgICBndmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICBwLT5xMi5mbGFncz1LT05TVDsKKyAgICAgIGV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKKyAgICAgIGluc2VydF9jb25zdCgmcC0+cTIudmFsLHQpOworICAgIH0gCisgICAgLyogc3dpdGNoIG9wZXJhbmRzIHNvIHRoYXQgd2UgaGF2ZSBtYXRjaGluZyBicmFuY2ggKi8KKyAgICBpZihjPT1DT01QQVJFKXsKKyAgICAgIHAyPXAtPm5leHQ7CisgICAgICB3aGlsZShwMiYmcDItPmNvZGU9PUZSRUVSRUcpIHAyPXAyLT5uZXh0OworICAgICAgaWYoIXAyfHxwMi0+Y29kZTxCRVF8fHAyLT5jb2RlPkJHVCkgaWVycm9yKDApOworICAgICAgaWYocDItPmNvZGU9PUJHVCl7CisJbz1wLT5xMTtwLT5xMT1wLT5xMjtwLT5xMj1vOworCXAyLT5jb2RlPUJMVDsKKyAgICAgIH1lbHNlIGlmKHAyLT5jb2RlPT1CTEUpeworCW89cC0+cTE7cC0+cTE9cC0+cTI7cC0+cTI9bzsKKwlwMi0+Y29kZT1CR0U7CisgICAgICB9CisgICAgfQorCisgICAgaWYoYz09Q09NUEFSRSYmaXNjb25zdChxMikpeworICAgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHQpOworICAgICAgaWYoSVNOVUxMKCkpeworCWlmKGNjJiYoY2NfdCZOVSk9PSh0Jk5VKSYmY29tcGFyZV9vYmplY3RzKGNjLCZwLT5xMSkpeworCSAgcDI9cC0+bmV4dDsKKwkgIHdoaWxlKHAyJiZwMi0+Y29kZT09RlJFRVJFRykgcDI9cDItPm5leHQ7CisJICBpZighcDJ8fHAyLT5jb2RlPEJFUXx8cDItPmNvZGU+QkdUKSBpZXJyb3IoMCk7CisJICBpZigodCZVTlNJR05FRCl8fHAyLT5jb2RlPT1CTkV8fHAyLT5jb2RlPT1CRVF8fHAyLT5jb2RlPT1CTFR8fHAyLT5jb2RlPT1CR0UpeworCSAgICBsYXN0Y29tcD10OworCSAgICBjbXB6ZXJvPTE7CisJICAgIGNvbnRpbnVlOworCSAgfQorCX0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZihjPT1TVUJQRlApeworICAgICAgcC0+Y29kZT1jPVNVQjsKKyAgICAgIGlmKChwLT50eXBmMiZOUSk9PU5QT0lOVEVSKSBwLT50eXBmPXQ9SU5UOworICAgICAgZWxzZSBpZigocC0+dHlwZjImTlEpPT1IUE9JTlRFUikgcC0+dHlwZj10PUxPTkc7CisgICAgICBlbHNlIGllcnJvcigwKTsKKyAgICAgIGlmKChwLT50eXBmMiZOUSk9PU5QT0lOVEVSKXsKKwljYz0mcC0+ejtjY190PU5QT0lOVEVSOworICAgICAgfWVsc2V7CisJY2M9MDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZihjPT1BRERJMlB8fGM9PVNVQklGUCl7CisgICAgICAvKmlmKGM9PUFEREkyUCkgcC0+Y29kZT1jPUFERDsgZWxzZSBwLT5jb2RlPWM9U1VCOyovCisgICAgICBpZigocC0+dHlwZjImTlEpIT1IUE9JTlRFUil7CisJcC0+dHlwZj10PShVTlNJR05FRHxTSE9SVCk7CisJc2hvcnRfYWRkPTI7CisJaWYoaXNyZWcocTIpJiZyZWdfcGFpcihwLT5xMi5yZWcsJnJwKSl7CisJICAvKkZJWE1FOndhcm5pbmcqLworCSAgcC0+cTIucmVnPXJwLnIxOworCX0KKyAgICAgIH1lbHNlIGlmKElTSFdPUkQodCkpeworCXAtPnR5cGY9dD0oVU5TSUdORUR8TE9ORyk7CisJc2hvcnRfYWRkPTE7CisgICAgICB9CisgICAgICBpZigocC0+dHlwZjImTlEpPT1OUE9JTlRFUil7CisJY2M9JnAtPno7Y2NfdD1OUE9JTlRFUjsKKyAgICAgIH1lbHNleworCWNjPTA7CisgICAgICB9ICAgICAgCisgICAgfQorCisgICAgaWYoYz09Q09OVkVSVCYmIW11c3RfY29udmVydChwLT50eXBmLHAtPnR5cGYyLDApKXsKKyAgICAgIHAtPmNvZGU9Yz1BU1NJR047CisgICAgICBwLT5xMi52YWwudm1heD1zaXpldGFiW3AtPnR5cGYmTlFdOworICAgIH0KKworICAgIGlmKGM9PUNPTlZFUlQpeworICAgICAgaW50IHRvPXAtPnR5cGYyJk5VOworICAgICAgaWYodG89PUlOVHx8dG89PUNIQVIpIHRvPVNIT1JUOworICAgICAgaWYodG89PShVTlNJR05FRHxJTlQpfHx0bz09KFVOU0lHTkVEfENIQVIpfHx0bz09TlBPSU5URVIpIHRvPShVTlNJR05FRHxTSE9SVCk7CisgICAgICBpZih0bz09RlBPSU5URVJ8fHRvPT1IUE9JTlRFUikgdG89KFVOU0lHTkVEfExPTkcpOworICAgICAgaWYoKHQmTlUpPT1JTlR8fCh0Jk5VKT09Q0hBUikgdD1TSE9SVDsKKyAgICAgIGlmKCh0Jk5VKT09KFVOU0lHTkVEfElOVCl8fCh0Jk5VKT09KFVOU0lHTkVEfENIQVIpfHwodCZOVSk9PU5QT0lOVEVSKSB0PShVTlNJR05FRHxTSE9SVCk7CisgICAgICBpZigodCZOUSk9PUZQT0lOVEVSfHwodCZOUSk9PUhQT0lOVEVSKSB0PShVTlNJR05FRHxMT05HKTsKKyAgICAgIGlmKCh0byZOUSk9PUxPTkcpeworCWlmKCh0Jk5RKSE9U0hPUlQpIGllcnJvcigwKTsKKwlsb2FkX29wKGYsJnAtPnExLHRvLHQxKTsKKwlsb2FkX29wKGYsJnAtPnosdCx0Mik7CisJaWYoaXNyZWcocTEpKXsKKwkgIGlmKCFyZWdfcGFpcihwLT5xMS5yZWcsJnJwKSkKKwkgICAgaWVycm9yKDApOworCSAgbW92ZShmLDAscnAucjEsJnAtPnosMCx0KTsKKwl9ZWxzZQorCSAgbW92ZShmLCZwLT5xMSwwLCZwLT56LDAsdCk7CisJY2M9JnAtPno7Y2NfdD10OworCWNvbnRpbnVlOworICAgICAgfWVsc2UgaWYoKHQmTlEpPT1MT05HKXsKKwlpZigodG8mTlEpIT1TSE9SVCkgaWVycm9yKDApOworCWxvYWRfb3AoZiwmcC0+cTEsdG8sdDEpOworCWxvYWRfb3AoZiwmcC0+eix0LHQyKTsKKwlpZihpc3JlZyh6KSl7CisJICBpZighcmVnX3BhaXIocC0+ei5yZWcsJnJwKSkKKwkgICAgaWVycm9yKDApOworCSAgZW1pdChmLCJcdHhvclx0JXMsJXNcbiIscmVnbmFtZXNbcnAucjJdLHJlZ25hbWVzW3JwLnIyXSk7CisJICBtb3ZlKGYsJnAtPnExLDAsMCxycC5yMSx0byk7CisJICBpZighKHRvJlVOU0lHTkVEKSl7CisJICAgIGVtaXQoZiwiXHRyYnJhXHQlcyVkLCFuXG4iLGxhYnByZWZpeCwrK2xhYmVsKTsKKwkgICAgZW1pdChmLCJcdHN1Ylx0MSwlc1xuIixyZWduYW1lc1tycC5yMl0pOworCSAgICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJICB9CisJfWVsc2V7CisJICBpZih0byZVTlNJR05FRCl7CisJICAgIGVtaXQoZiwiXHRtb3ZlXHQiKTsKKwkgICAgZW1pdF9vYmooZiwmcC0+cTEsdG8pOworCSAgICBlbWl0KGYsIixAJXMrK1xuIixyZWduYW1lc1twLT56LnJlZ10pOworCSAgICBlbWl0KGYsIlx0bW92ZVx0MCxAJXNcbiIscmVnbmFtZXNbcC0+ei5yZWddKTsKKwkgIH1lbHNleworCSAgICBpZihpc3JlZyhxMSkpeworCSAgICAgIHJlZz1wLT5xMS5yZWc7CisJICAgIH1lbHNleworCSAgICAgIHJlZz10MTsKKwkgICAgICBtb3ZlKGYsJnAtPnExLDAsMCx0MSx0byk7CisJICAgIH0KKwkgICAgZW1pdChmLCJcdG1vdmVcdCVzLEAlcysrXG4iLHJlZ25hbWVzW3JlZ10scmVnbmFtZXNbcC0+ei5yZWddKTsKKwkgICAgZW1pdChmLCJcdG1vdmVcdDAsQCVzXG4iLHJlZ25hbWVzW3AtPnoucmVnXSk7CisJICAgIGVtaXQoZiwiXHRtb3ZlXHQlcywlc1xuIixyZWduYW1lc1tyZWddLHJlZ25hbWVzW3JlZ10pOworCSAgICBlbWl0KGYsIlx0cmJyYVx0JXMlZCwhblxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJICAgIGVtaXQoZiwiXHRzdWJcdDEsQCVzXG4iLHJlZ25hbWVzW3AtPnoucmVnXSk7CisJICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgIH0KKwkgIGlmKCFzY3JhdGNocmVnKHAtPnoucmVnLHApKQorCSAgICBlbWl0KGYsIlx0c3ViXHQxLCVzXG4iLHJlZ25hbWVzW3AtPnoucmVnXSk7CisJfQorCWNjPTA7CisJY29udGludWU7CisgICAgICB9ZWxzZQorCWllcnJvcigwKTsKKyAgICB9CisgICAgaWYoYz09TUlOVVMpeworICAgICAgcC0+Y29kZT1jPVNVQjsKKyAgICAgIHAtPnEyPXAtPnExOworICAgICAgZ3ZhbC52bWF4PWwyem0oMEwpOworICAgICAgZXZhbF9jb25zdCgmZ3ZhbCx0KTsKKyAgICAgIGluc2VydF9jb25zdCgmcC0+cTEudmFsLHQpOworICAgICAgcC0+cTEuZmxhZ3M9S09OU1Q7CisgICAgfQorICAgIGlmKGM9PUtPTVBMRU1FTlQpeworICAgICAgbG9hZF9vcChmLCZwLT5xMSx0LHQxKTsKKyAgICAgIGxvYWRfb3AoZiwmcC0+eix0LHQyKTsKKyAgICAgIGlmKElTTFdPUkQodCkpeworCWVtaXQoZiwiXHRub3RcdCIpOworCWVtaXRfbHdvcmQoZiwmcC0+cTEsdCwiQCVzKysiKTsKKwllbWl0KGYsIiwiKTsKKwllbWl0X2x3b3JkKGYsJnAtPnosdCwiQCVzKysiKTsKKwllbWl0KGYsIlxuIik7CisJZW1pdChmLCJcdG5vdFx0Iik7CisJZW1pdF9od29yZChmLCZwLT5xMSx0LCJAJXMrKyIpOworCWVtaXQoZiwiLCIpOworCWVtaXRfaHdvcmQoZiwmcC0+eix0LCJAJXMrKyIpOworCWVtaXQoZiwiXG4iKTsKKwljbGVhbnVwX2x3b3JkKGYsJnAtPnExKTsKKwljbGVhbnVwX2x3b3JkKGYsJnAtPnopOworCWNjPTA7CisgICAgICB9ZWxzZXsKKwllbWl0KGYsIlx0bm90XHQiKTsKKwllbWl0X29iaihmLCZwLT5xMSx0KTsKKwllbWl0KGYsIiwiKTsKKwllbWl0X29iaihmLCZwLT56LHQpOworCWVtaXQoZiwiXG4iKTsKKwljYz0mcC0+ejtjY190PXQ7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09U0VUUkVUVVJOKXsKKyAgICAgIGlmKHAtPnoucmVnKXsKKwlpZihyZWdfcGFpcihwLT56LnJlZywmcnApKQorCSAgbG9hZF9vcChmLCZwLT5xMSx0LHQxKTsKKwllbHNlCisJICBsb2FkX29wKGYsJnAtPnExLHQscC0+ei5yZWcpOworCW1vdmUoZiwmcC0+cTEsMCwwLHAtPnoucmVnLHQpOworCUJTRVQocmVnc19tb2RpZmllZCxwLT56LnJlZyk7CisgICAgICB9CisgICAgICBjYz0wOyAvKiBwcm9iYWJseSBub3QgbmVlZGVkICovCisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09R0VUUkVUVVJOKXsKKyAgICAgIGlmKHAtPnExLnJlZyl7CisJaWYoKCFpc3JlZyh6KXx8cC0+ei5yZWchPXAtPnExLnJlZykmJiFJU0xXT1JEKHQpKXsgY2M9JnAtPno7Y2NfdD10O30KKwlsb2FkX29wKGYsJnAtPnosdCx0Mik7CisJbW92ZShmLDAscC0+cTEucmVnLCZwLT56LDAsdCk7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09Q0FMTCl7CisgICAgICBpbnQgcmVnLGptcD0wO2xvbmcgY3N0YWNrPTA7CisgICAgICBjYz0wOworICAgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJiFzdHJjbXAoIl9fdmFfc3RhcnQiLHAtPnExLnYtPmlkZW50aWZpZXIpKXsKKwlsb25nIHZhX29mZj1sb2ZmLXN0YWNrb2Zmc2V0K3B1c2hlZHNpemUrem0ybCh2YV9vZmZzZXQodikpKzE7CisJZW1pdChmLCJcdG1vdmVcdCVzLCVzXG4iLHJlZ25hbWVzW3NwXSxyZWduYW1lc1tyOF0pOworCWlmKHZhX29mZikKKwkgIGVtaXQoZiwiXHRhZGRcdCVsZCwlc1xuIix2YV9vZmYscmVnbmFtZXNbcjhdKTsKKwlCU0VUKHJlZ3NfbW9kaWZpZWQscjgpOworCWlmKExBUkdFfHxIVUdFKXsKKwkgIGVtaXQoZiwiXHRtb3ZlXHQwLCVzXG4iLHJlZ25hbWVzW3I5XSk7CisJICBCU0VUKHJlZ3NfbW9kaWZpZWQscjkpOworCX0KKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKHN0YWNrX3ZhbGlkKXsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGlmKHAtPmNhbGxfY250PD0wKXsKKyAgICAgICAgICBlcnJfaWM9cDtpZihmKSBlcnJvcigzMjApOworICAgICAgICAgIHN0YWNrX3ZhbGlkPTA7CisgICAgICAgIH0KKyAgICAgICAgZm9yKGk9MDtzdGFja192YWxpZCYmaTxwLT5jYWxsX2NudDtpKyspeworICAgICAgICAgIGlmKHAtPmNhbGxfbGlzdFtpXS52LT5maSYmKHAtPmNhbGxfbGlzdFtpXS52LT5maS0+ZmxhZ3MmQUxMX1NUQUNLKSl7CisJICAgIGlmKHAtPmNhbGxfbGlzdFtpXS52LT5maS0+c3RhY2sxPmNzdGFjaykgY3N0YWNrPXAtPmNhbGxfbGlzdFtpXS52LT5maS0+c3RhY2sxOworICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgZXJyX2ljPXA7aWYoZikgZXJyb3IoMzE3LHAtPmNhbGxfbGlzdFtpXS52LT5pZGVudGlmaWVyKTsKKyAgICAgICAgICAgIHN0YWNrX3ZhbGlkPTA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZighY2FsY19yZWdzKHAsZiE9MCkmJnYtPmZpKSB2LT5maS0+ZmxhZ3MmPX5BTExfUkVHUzsKKyAgICAgIGlmKChwLT5xMS5mbGFncyZWQVIpJiZwLT5xMS52LT5maSYmcC0+cTEudi0+ZmktPmlubGluZV9hc20peworCWVtaXRfaW5saW5lX2FzbShmLHAtPnExLnYtPmZpLT5pbmxpbmVfYXNtKTsKKwljYWxsZWVfcHVzaChjc3RhY2spOworICAgICAgfWVsc2V7CisJaWYoc3RhY2tvZmZzZXQ9PTAmJiFoYXZlX2ZyYW1lJiYhKHYtPnRhdHRyJklOVEVSUlVQVCkpeworCSAgc3RydWN0IElDICpwMjsKKwkgIGptcD0xOworCSAgZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpeworCSAgICBpZihwMi0+Y29kZSE9RlJFRVJFRyYmcDItPmNvZGUhPUFMTE9DUkVHJiZwMi0+Y29kZSE9TEFCRUwmJnAyLT5jb2RlIT1OT1AmJgorCSAgICAgICAocDItPmNvZGUhPUdFVFJFVFVSTnx8KHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpIT1SRUd8fHAyLT5xMS5yZWchPXAyLT56LnJlZykmJgorCSAgICAgICAocDItPmNvZGUhPVNFVFJFVFVSTnx8KHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKSE9UkVHfHxwMi0+cTEucmVnIT1wMi0+ei5yZWcpKXsKKwkgICAgICBqbXA9MDticmVhazsKKwkgICAgfQorCSAgfQorCX0KKwlpZihwLT5xMS5mbGFncyZEUkVGT0JKKXsKKwkgIGludCBjbGFiZWw9KytsYWJlbDsKKwkgIGlmKElTTFdPUkQocC0+cTEuZHR5cCkpeworCSAgICBpZXJyb3IoMCk7CisJICB9CisJICBwLT5xMS5mbGFncyY9fkRSRUZPQko7CisJICBsb2FkX29wKGYsJnAtPnExLHQsdDEpOworCSAgaWYoIUlTTFdPUkQocC0+cTEuZHR5cCkpeworCSAgICBlbWl0KGYsIlx0JXNcdCIsam1wP2p1bXA6ImFzdWIiKTsKKwkgICAgZW1pdF9vYmooZiwmcC0+cTEscC0+cTEuZHR5cCk7CisJICAgIGVtaXQoZiwiLDFcbiIpOworCSAgICBwdXNoKDEpOworCSAgICBjYWxsZWVfcHVzaChjc3RhY2spOworCSAgICBwb3AoMSk7CisJICB9ZWxzZXsKKwkgICAgaWVycm9yKDApOworCSAgfQorCX1lbHNleworCSAgaWYoam1wKXsKKwkgICAgZW1pdChmLCJcdCVzXHQiLGp1bXApOworCSAgICBjYWxsZWVfcHVzaChjc3RhY2spOworCSAgfWVsc2V7CisJICAgIGVtaXQoZiwiXHQlc1x0IixjYWxsKTsKKwkgICAgaWYoVElOWSkKKwkgICAgICBwdXNoKDEpOworCSAgICBlbHNlCisJICAgICAgcHVzaCgyKTsKKwkgICAgY2FsbGVlX3B1c2goY3N0YWNrKTsKKwkgICAgaWYoVElOWSkKKwkgICAgICBwb3AoMSk7CisJICAgIGVsc2UKKwkgICAgICBwb3AoMik7CisJICB9CisJICBlbWl0X29iaihmLCZwLT5xMSx0KTsKKwkgIGVtaXQoZiwiLDFcbiIpOworCX0KKyAgICAgIH0KKyAgICAgIGlmKGptcCYmIW5lZWRfcmV0dXJuKSByZXQ9IiI7CisgICAgICBpZighem1lcXRvKGwyem0oMEwpLHAtPnEyLnZhbC52bWF4KSl7CisJbm90cG9wcGVkKz16bTJsKHAtPnEyLnZhbC52bWF4KTsKKwlkb250cG9wLT16bTJsKHAtPnEyLnZhbC52bWF4KTsKKwlpZighKGdfZmxhZ3NbMl0mVVNFREZMQUcpJiZzdGFja29mZnNldD09LW5vdHBvcHBlZCl7CisJICAvKiAgRW50ZmVybmVuIGRlciBQYXJhbWV0ZXIgdmVyem9lZ2VybiAgKi8KKwl9ZWxzZXsKKwkgIGVtaXQoZiwiXHRhZGRcdCVsZCwlc1xuIix6bTJsKHAtPnEyLnZhbC52bWF4KSxyZWduYW1lc1tzcF0pOworCSAgcG9wKHptMmwocC0+cTIudmFsLnZtYXgpKTsKKwkgIG5vdHBvcHBlZC09em0ybChwLT5xMi52YWwudm1heCk7Y2M9MDsKKwl9CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09QVNTSUdOfHxjPT1QVVNIKXsKKyAgICAgIGlmKGM9PVBVU0gpIGRvbnRwb3ArPXptMmwocC0+cTIudmFsLnZtYXgpOworCisgICAgICBpZihjPT1BU1NJR058fGM9PVBVU0gpeworCWxvbmcgc3o9em0ybChwLT5xMi52YWwudm1heCk7CisJaW50IHFyZWcsenJlZyxjcmVnLGk7CisJaWYoc3o9PTEpeworCSAgbG9hZF9vcChmLCZwLT5xMSx0LHQxKTsKKwkgIGlmKGM9PUFTU0lHTil7CisJICAgIGxvYWRfb3AoZiwmcC0+eix0LHQyKTsKKwkgICAgbW92ZShmLCZwLT5xMSwwLCZwLT56LDAsdCk7CisJICAgIGNjPSZwLT56O2NjX3Q9dDsKKwkgIH1lbHNleworCSAgICBlbWl0KGYsIlx0bW92ZVx0Iik7CisJICAgIGVtaXRfb2JqKGYsJnAtPnExLHQpOworCSAgICBlbWl0KGYsIixALS0lc1xuIixyZWduYW1lc1tzcF0pOworCSAgICBwdXNoKHptMmwocC0+ei52YWwudm1heCkpOwkKKwkgICAgY2M9JnAtPnExO2NjX3Q9dDsKKwkgIH0gICAgCisJICBjb250aW51ZTsKKwl9ZWxzZSBpZihJU0xXT1JEKHQpJiYoaXNyZWcocTEpfHxpc3JlZyh6KXx8KHAtPnExLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKSl7CisJICBpZihjPT1BU1NJR04peworCSAgICBtb3ZlKGYsJnAtPnExLDAsJnAtPnosMCx0KTsKKwkgIH1lbHNleworCSAgICBsb2FkX29wKGYsJnAtPnExLHQsdDEpOworCSAgICAKKwkgICAgaWYoKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopKQorCSAgICAgIGVtaXQoZiwiXHRhZGRcdDIsJXNcbiIscmVnbmFtZXNbcC0+cTEucmVnXSk7CisJICAgIAorCSAgICBlbWl0KGYsIlx0bW92ZVx0Iik7CisJICAgIGVtaXRfaHdvcmQoZiwmcC0+cTEsdCwiQC0tJXMiKTsKKwkgICAgZW1pdChmLCIsQC0tJXNcbiIscmVnbmFtZXNbc3BdKTsKKwkgICAgZW1pdChmLCJcdG1vdmVcdCIpOworCSAgICBlbWl0X2x3b3JkKGYsJnAtPnExLHQsIkAtLSVzIik7CisJICAgIGVtaXQoZiwiLEAtLSVzXG4iLHJlZ25hbWVzW3NwXSk7CisJICAgIHB1c2goMik7CisJICB9CSAgCisJICBjYz0wOworCSAgY29udGludWU7CisJfWVsc2V7CisJICBzdGF0aWMgY2hhciBjcHN0cls2NF07CisJICBjYz0wOworCSAgbG9hZF9vcChmLCZwLT5xMSx0LHQxKTsKKwkgIGlmKChwLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmc2NyYXRjaHJlZyhwLT5xMS5yZWcscCkpeworCSAgICBxcmVnPXAtPnExLnJlZzsKKwkgIH1lbHNleworCSAgICBpZighKHAtPnExLmZsYWdzJlJFRykpCisJICAgICAgaWVycm9yKDApOworCSAgICBxcmVnPXQxOworCSAgICBtb3ZlKGYsMCxwLT5xMS5yZWcsMCxxcmVnLElOVCk7CisJICB9CisJICBpZihjPT1BU1NJR04peworCSAgICBsb2FkX29wKGYsJnAtPnosdCx0Mik7CisJICAgIGlmKChwLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZzY3JhdGNocmVnKHAtPnoucmVnLHApKXsKKwkgICAgICB6cmVnPXAtPnoucmVnOworCSAgICB9ZWxzZXsKKwkgICAgICBpZighKHAtPnouZmxhZ3MmUkVHKSkKKwkJaWVycm9yKDApOworCSAgICAgIGlmKHFyZWc9PXQxKSB6cmVnPXQyOyBlbHNlIHpyZWc9dDE7CisJICAgICAgbW92ZShmLDAscC0+ei5yZWcsMCx6cmVnLElOVCk7CisJICAgIH0KKwkgICAgc3ByaW50ZihjcHN0ciwiXHRtb3ZlXHRAJXMrKyxAJXMrK1xuIixyZWduYW1lc1txcmVnXSxyZWduYW1lc1t6cmVnXSk7CisJICB9ZWxzZXsKKwkgICAgenJlZz1zcDsKKwkgICAgZW1pdChmLCJcdGFkZFx0JWxkLCVzXG4iLHN6LHJlZ25hbWVzW3FyZWddKTsKKwkgICAgc3ByaW50ZihjcHN0ciwiXHRtb3ZlXHRALS0lcyxALS0lc1xuIixyZWduYW1lc1txcmVnXSxyZWduYW1lc1t6cmVnXSk7CisJICAgIHB1c2goem0ybChwLT5xMi52YWwudm1heCkpOworCSAgfQorCSAgaWYoc3o8PTkpeworCSAgICBmb3IoaT0wO2k8c3o7aSsrKQorCSAgICAgIGVtaXQoZixjcHN0cik7CisJICB9ZWxzZXsKKwkgICAgaW50IGNudHB1c2hlZD0wOworCSAgICBpZih6cmVnIT10MikKKwkgICAgICBjcmVnPXQyOworCSAgICBlbHNleworCSAgICAgIGNyZWc9Z2V0X3JlZyhmLHApOworCSAgICAgIGlmKGM9PVBVU0gpIGllcnJvcigwKTsKKwkgICAgICBjcmVnPXI4OworCSAgICAgIGVtaXQoZiwiXHRtb3ZlXHQlcyxALS0lc1xuIixyZWduYW1lc1tjcmVnXSxyZWduYW1lc1tzcF0pOworCSAgICAgIGNudHB1c2hlZD0xOworCSAgICB9CisJICAgIGVtaXQoZiwiXHRtb3ZlXHQlbGQsJXNcbiIsc3ovNCxyZWduYW1lc1tjcmVnXSk7CisJICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCSAgICBlbWl0KGYsY3BzdHIpOworCSAgICBlbWl0KGYsY3BzdHIpOworCSAgICBlbWl0KGYsY3BzdHIpOworCSAgICBlbWl0KGYsY3BzdHIpOworCSAgICBlbWl0KGYsIlx0c3ViXHQxLCVzXG4iLHJlZ25hbWVzW2NyZWddKTsKKwkgICAgZW1pdChmLCJcdHJicmFcdCVzJWQsIXpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwkgICAgZm9yKGk9MDtpPHN6JTQ7aSsrKQorCSAgICAgIGVtaXQoZixjcHN0cik7CisJICAgIGlmKGNudHB1c2hlZCkKKwkgICAgICBlbWl0KGYsIlx0bW92ZVx0QCVzKyssJXNcbiIscmVnbmFtZXNbc3BdLHJlZ25hbWVzW2NyZWddKTsKKwkgIH0KKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgfQorICAgICAgaWVycm9yKDApOworICAgIH0KKyAgICBpZihjPT1BRERSRVNTKXsKKyAgICAgIHJlZz0wOworICAgICAgaWYoMC8qcmVnX3BhaXIocmVnLCZycCkqLyl7CisJaWVycm9yKDApOworCWVtaXQoZiwiXHRtb3ZcdCVzLCVzXG4iLHJlZ25hbWVzW3JwLnIxXSxyZWduYW1lc1tzcF0pOworCWVtaXQoZiwiXHRtb3ZcdCVzLCMwXG4iLHJlZ25hbWVzW3JwLnIyXSk7CisJaWYodm9mZigmcC0+cTEpKQorCSAgZW1pdChmLCJcdGFkZFx0JXMsIyVsZFxuIixyZWduYW1lc1tycC5yMV0sdm9mZigmcC0+cTEpJjB4ZmZmZik7CisgICAgICB9ZWxzZXsKKwlpZihpc3JlZyh6KSkKKwkgIHJlZz1wLT56LnJlZzsKKwllbHNleworCSAgbG9hZF9vcChmLCZwLT56LHQsdDIpOworCX0KKwlpZih2b2ZmKCZwLT5xMSkpeworCSAgaWYoIXJlZykgcmVnPXQxOworCSAgZW1pdChmLCJcdG1vdmVcdCVzLCVzXG4iLHJlZ25hbWVzW3NwXSxyZWduYW1lc1tyZWddKTsKKwkgIGVtaXQoZiwiXHRhZGRcdCVsZCwlc1xuIix2b2ZmKCZwLT5xMSkscmVnbmFtZXNbcmVnXSk7CisJfWVsc2UKKwkgIHJlZz1zcDsKKwltb3ZlKGYsMCxyZWcsJnAtPnosMCx6dHlwKHApKTsKKyAgICAgIH0KKyAgICAgIGNjPSZwLT56O2NjX3Q9enR5cChwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmKChjPj1MU0hJRlQmJmM8PU1PRCl8fChjPj1PUiYmYzw9QU5EKXx8Yz09Q09NUEFSRXx8Yz09QURESTJQfHxjPT1TVUJJRlApeworICAgICAgY2hhciAqczsKKworICAgICAgaWYoYz09TVVMVHx8Yz09RElWfHxjPT1NT0QpeworCWludCBjb2RlOworCWxvYWRfb3AoZiwmcC0+cTEsdCx0MSk7CisJZW1pdChmLCJcdG1vdmVcdCVsZCwlc1xuIiwobG9uZykweGZmMWIscmVnbmFtZXNbdDJdKTsKKwllbWl0KGYsIlx0bW92ZVx0Iik7CisJZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJZW1pdChmLCIsQCVzKytcbiIscmVnbmFtZXNbdDJdKTsKKwlsb2FkX29wKGYsJnAtPnEyLHQsdDEpOworCWVtaXQoZiwiXHRtb3ZlXHQiKTsKKwllbWl0X29iaihmLCZwLT5xMix0KTsKKwllbWl0KGYsIixAJXMrK1xuIixyZWduYW1lc1t0Ml0pOworCWVtaXQoZiwiXHRtb3ZlXHQlbGQsJXNcbiIsKGxvbmcpMHhmZjFmLHJlZ25hbWVzW3QxXSk7CisJaWYoYz09TVVMVCkgY29kZT0wOyBlbHNlIGNvZGU9MjsKKwlpZighKHQmVU5TSUdORUQpKSBjb2RlKys7CisJZW1pdChmLCJcdG1vdmVcdCVkLEAlc1xuIixjb2RlLHJlZ25hbWVzW3QxXSk7CisJaWYoYz09TU9EKQorCSAgZW1pdChmLCJcdG1vdmVcdCVsZCwlc1xuIiwobG9uZykweGZmMWUscmVnbmFtZXNbdDJdKTsKKwlsb2FkX29wKGYsJnAtPnosdCx0MSk7CisJZW1pdChmLCJcdG1vdmVcdEAlcywiLHJlZ25hbWVzW3QyXSk7CisJZW1pdF9vYmooZiwmcC0+eix0KTsKKwllbWl0KGYsIlxuIik7CisJY2M9JnAtPno7Y2NfdD10OworCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZihjPT1MU0hJRlQmJmlzY29uc3QocTIpJiZpc3JlZyhxMSkpeworCWV2YWxfY29uc3QoJnAtPnEyLnZhbCxJTlQpOworCWlmKHptZXF0byh2bWF4LGwyem0oMUwpKSl7CisJICBwLT5jb2RlPWM9QUREOworCSAgcC0+cTI9cC0+cTE7CisJfQorICAgICAgfQorCisgICAgICBpZihjb21wYXJlX29iamVjdHMoJnAtPnEyLCZwLT56KSl7CisJaWYoIWNvbXBhcmVfb2JqZWN0cygmcC0+cTEsJnAtPnopKXsKKwkgIGlmKGM9PUxTSElGVHx8Yz09UlNISUZUKXsKKwkgICAgcmVnPWdldF9yZWcoZixwKTsKKwkgICAgaWYocmVnKXsKKwkgICAgICBtb3ZlKGYsJnAtPnEyLDAsMCxyZWcscTJ0eXAocCkpOworCSAgICAgIHAtPnEyLmZsYWdzPVJFRzsKKwkgICAgICBwLT5xMi5yZWc9cmVnOworCSAgICB9ZWxzZXsKKwkgICAgICBlbWl0KGYsIlx0bW92ZVx0Iik7CisJICAgICAgZW1pdF9vYmooZiwmcC0+cTIscTJ0eXAocCkpOworCSAgICAgIGVtaXQoZiwiLEAtLSVzXG4iLHJlZ25hbWVzW3NwXSk7CisJICAgICAgcC0+cTIuZmxhZ3M9UkVHfERSRUZPQko7CisJICAgICAgcC0+cTIucmVnPXNwOworCSAgICAgIHAtPnEyLmFtPW15bWFsbG9jKHNpemVvZigqcC0+cTIuYW0pKTsKKwkgICAgICBwLT5xMi5hbS0+ZmxhZ3M9UE9TVF9JTkM7CisJICAgICAgcC0+cTIuYW0tPmJhc2U9c3A7CisJICAgIH0KKwkgIH1lbHNlIGlmKGM9PVNVQnx8Yz09U1VCUEZQfHxjPT1TVUJJRlApeworCSAgICAvKiBUT0RPOiBjaGVjayBwb2ludGVyIHNpemVzIHN1YmlmcC9zdWJwZnAgKi8KKwkgICAgaWYoSVNMV09SRCh0KSl7CisJICAgICAgaWYoaXNyZWcoeikpeworCQlpZighcmVnX3BhaXIocC0+ei5yZWcsJnJwKSkgaWVycm9yKDApOworCQllbWl0KGYsIlx0bm90XHQlcywlc1xuIixyZWduYW1lc1tycC5yMV0scmVnbmFtZXNbcnAucjFdKTsKKwkJZW1pdChmLCJcdG5vdFx0JXMsJXNcbiIscmVnbmFtZXNbcnAucjJdLHJlZ25hbWVzW3JwLnIyXSk7CisJCWVtaXQoZiwiXHRhZGRcdDEsJXNcbiIscmVnbmFtZXNbcnAucjFdKTsKKwkJZW1pdChmLCJcdGFkZGNcdDAsJXNcbiIscmVnbmFtZXNbcnAucjJdKTsKKwkJcC0+cTI9cC0+cTE7CisJCXAtPnExPXAtPno7CisJCXAtPmNvZGU9Yz1BREQ7CisJICAgICAgfWVsc2UKKwkJaWVycm9yKDApOworCSAgICB9ZWxzZXsKKwkgICAgICBsb2FkX29wKGYsJnAtPnosdCx0MSk7CisJICAgICAgZW1pdChmLCJcdG5vdFx0Iik7CisJICAgICAgZW1pdF9vYmooZiwmcC0+eix0KTsKKwkgICAgICBlbWl0KGYsIiwiKTsKKwkgICAgICBlbWl0X29iaihmLCZwLT56LHQpOworCSAgICAgIGVtaXQoZiwiXG4iKTsKKwkgICAgICBlbWl0KGYsIlx0YWRkXHQxLCIpOworCSAgICAgIGVtaXRfb2JqKGYsJnAtPnosdCk7CisJICAgICAgZW1pdChmLCJcbiIpOworCSAgICAgIGxvYWRfb3AoZiwmcC0+cTEsdCx0Mik7CisJICAgICAgZW1pdChmLCJcdGFkZFx0Iik7CisJICAgICAgZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJICAgICAgZW1pdChmLCIsIik7CisJICAgICAgZW1pdF9vYmooZiwmcC0+eix0KTsKKwkgICAgICBlbWl0KGYsIlxuIik7CisJICAgICAgY2M9JnAtPno7Y2NfdD10OworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICB9ZWxzZXsKKwkgICAgc3RydWN0IG9iaiBtOworCSAgICBtPXAtPnExO3AtPnExPXAtPnEyO3AtPnEyPW07CisJICB9CisJfQorICAgICAgfQorCisgICAgICBpZihjPj1PUiYmYzw9QU5EKXsKKwlzPWxvZ2ljYWxzW2MtT1JdOworICAgICAgfWVsc2V7CisJaWYoYz09QURESTJQKQorCSAgcz1hcml0aG1ldGljc1tBREQtTFNISUZUXTsKKwllbHNlIGlmKGM9PVNVQklGUCkKKwkgIHM9YXJpdGhtZXRpY3NbU1VCLUxTSElGVF07CisJZWxzZQorCSAgcz1hcml0aG1ldGljc1tjLUxTSElGVF07CisgICAgICB9CisKKyAgICAgIGlmKGM9PUNPTVBBUkUpeworCWxhc3Rjb21wPXQ7CisJbG9hZF9vcChmLCZwLT5xMSx0LHQxKTsKKwlsb2FkX29wKGYsJnAtPnEyLHQsdDIpOworCisJaWYoSVNMV09SRCh0KSl7CisJICBpZigocC0+cTEuZmxhZ3MmRFJFRk9CSikmJnAtPnExLnJlZyE9dDEpeworCSAgICBlbWl0KGYsIlx0bW92ZVx0JXMsJXNcbiIscmVnbmFtZXNbcC0+cTEucmVnXSxyZWduYW1lc1t0MV0pOworCSAgICBwLT5xMS5yZWc9dDE7CisJICB9CisJICBpZigocC0+cTIuZmxhZ3MmRFJFRk9CSikmJnAtPnEyLnJlZyE9dDIpeworCSAgICBlbWl0KGYsIlx0bW92ZVx0JXMsJXNcbiIscmVnbmFtZXNbcC0+cTIucmVnXSxyZWduYW1lc1t0Ml0pOworCSAgICBwLT5xMi5yZWc9dDI7CisJICB9CisJICBwMj1wLT5uZXh0OworCSAgd2hpbGUocDImJnAyLT5jb2RlPT1GUkVFUkVHKSBwMj1wMi0+bmV4dDsKKwkgIGlmKCFwMnx8cDItPmNvZGU8QkVRfHxwMi0+Y29kZT5CR1QpIGllcnJvcigwKTsKKwkgIGM9cDItPmNvZGU7CisJICBpZihjPT1CRVF8fGM9PUJORSl7CisJICAgIGVtaXQoZiwiXHRjbXBcdCIscyk7CisJICAgIGVtaXRfbHdvcmQoZiwmcC0+cTEsdCwiQCVzKysiKTsKKwkgICAgZW1pdChmLCIsIik7CisJICAgIGVtaXRfbHdvcmQoZiwmcC0+cTIsdCwiQCVzKysiKTsKKwkgICAgZW1pdChmLCJcbiIpOworCSAgICBpZihjPT1CRVEpCisJICAgICAgZW1pdChmLCJcdHJicmFcdCVzJWQsIXpcbiIsbGFicHJlZml4LGVsYWI9KytsYWJlbCk7CisJICAgIGVsc2UgCisJICAgICAgZW1pdChmLCJcdHJicmFcdCVzJWQsIXpcbiIsbGFicHJlZml4LHAyLT50eXBmKTsKKwkgICAgZW1pdChmLCJcdGNtcFx0IixzKTsKKwkgICAgZW1pdF9od29yZChmLCZwLT5xMSx0LCJAJXMrKyIpOworCSAgICBlbWl0KGYsIiwiKTsKKwkgICAgZW1pdF9od29yZChmLCZwLT5xMix0LCJAJXMrKyIpOworCSAgICBlbWl0KGYsIlxuIik7CisJICAgIGVtaXQoZiwiXHRyYnJhXHQlcyVkLCVzXG4iLGxhYnByZWZpeCxwMi0+dHlwZixjY3NbYy1CRVFdKTsKKwkgIH1lbHNleworCSAgICBlbGFiPSsrbGFiZWw7CisJICAgIGlmKHAtPnExLmZsYWdzJkRSRUZPQkopIGVtaXQoZiwiXHRhZGRcdDEsJXNcbiIscmVnbmFtZXNbcC0+cTEucmVnXSk7CisJICAgIGlmKHAtPnEyLmZsYWdzJkRSRUZPQkopIGVtaXQoZiwiXHRhZGRcdDEsJXNcbiIscmVnbmFtZXNbcC0+cTIucmVnXSk7CisJICAgIGVtaXQoZiwiXHRjbXBcdCIscyk7CisJICAgIGVtaXRfaHdvcmQoZiwmcC0+cTIsdCwiQCVzIik7CisJICAgIGVtaXQoZiwiLCIpOworCSAgICBlbWl0X2h3b3JkKGYsJnAtPnExLHQsIkAlcyIpOworCSAgICBlbWl0KGYsIlxuIik7CisJICAgIGVtaXQoZiwiXHRyYnJhXHQlcyVkLCVzXG4iLGxhYnByZWZpeCxjPT1CTFQ/cDItPnR5cGY6ZWxhYiwodCZVTlNJR05FRCk/Y2N1W0JMVC1CRVFdOmNjc1tCTFQtQkVRXSk7CisJICAgIC8qIHVuZm9ydHVuYXRlbHkgZmxhZ3MgYXJlIG92ZXJ3cml0dGVuLi4uICovCisJICAgIGVtaXQoZiwiXHRjbXBcdCIscyk7CisJICAgIGVtaXRfaHdvcmQoZiwmcC0+cTIsdCwiQCVzIik7CisJICAgIGVtaXQoZiwiLCIpOworCSAgICBlbWl0X2h3b3JkKGYsJnAtPnExLHQsIkAlcyIpOworCSAgICBlbWl0KGYsIlxuIik7CisJICAgIGVtaXQoZiwiXHRyYnJhXHQlcyVkLCF6XG4iLGxhYnByZWZpeCxjPT1CTFQ/ZWxhYjpwMi0+dHlwZik7CisJICAgIGlmKHAtPnExLmZsYWdzJkRSRUZPQkopIGVtaXQoZiwiXHRzdWJcdDEsJXNcbiIscmVnbmFtZXNbcC0+cTEucmVnXSk7CisJICAgIGlmKHAtPnEyLmZsYWdzJkRSRUZPQkopIGVtaXQoZiwiXHRzdWJcdDEsJXNcbiIscmVnbmFtZXNbcC0+cTIucmVnXSk7CisJICAgIGVtaXQoZiwiXHRjbXBcdCIscyk7CisJICAgIGVtaXRfbHdvcmQoZiwmcC0+cTIsdCwiQCVzIik7CisJICAgIGVtaXQoZiwiLCIpOworCSAgICBlbWl0X2x3b3JkKGYsJnAtPnExLHQsIkAlcyIpOworCSAgICBlbWl0KGYsIlxuIik7CisJICAgIGVtaXQoZiwiXHRyYnJhXHQlcyVkLCVzXG4iLGxhYnByZWZpeCxwMi0+dHlwZixjY3VbYy1CRVFdKTsKKwkgIH0KKwkgIGNjPTA7CisjaWYgMAorCSAgLyogbGFzdCBicmFuY2ggZG9uZSBpbiBicmFuY2ggSUMgKi8KKwkgIGxhc3Rjb21wPVVOU0lHTkVEfElOVDsKKyNlbHNlCisJICBpZihjIT1CTkUpCisJICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGVsYWIpOworCSAgcDItPmNvZGU9Tk9QOworI2VuZGlmCisJICBjb250aW51ZTsKKwl9ZWxzZXsKKwkgIGVtaXQoZiwiXHRjbXBcdCIscyk7CisJICBlbWl0X29iaihmLCZwLT5xMix0KTsKKwkgIGVtaXQoZiwiLCIpOworCSAgZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJICBlbWl0KGYsIlxuIik7CisJfQorCWNjPTA7CisJY29udGludWU7CisgICAgICB9CisKKworICAgICAgaWYoIWNvbXBhcmVfb2JqZWN0cygmcC0+cTEsJnAtPnopKXsKKwlsb2FkX29wKGYsJnAtPnExLHQsdDEpOworCWxvYWRfb3AoZiwmcC0+eix0LHQyKTsKKwlpZigocC0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJmlzcmVnKHopJiZwLT5xMi5yZWc9PXAtPnoucmVnKXsKKwkgIG1vdmUoZiwwLHAtPnEyLnJlZywwLHQyLE5QT0lOVEVSKTsKKwkgIHAtPnEyLnJlZz10MjsKKwl9CisJbW92ZShmLCZwLT5xMSwwLCZwLT56LDAsdCk7CisJLyogY2xlYW51cCBwb3N0aW5jIGlmIG5lY2Vzc2FyeSAobm90IGRvbmUgYnkgY2xlYW51cF9sd29yZCAqLworCWlmKHAtPnoucmVnPT10MiYmKHAtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJklTTFdPUkQodCkpCisJICBlbWl0KGYsIlx0c3ViXHQyLCVzXG4iLHJlZ25hbWVzW3QyXSk7CisgICAgICB9ZWxzZQorCWxvYWRfb3AoZiwmcC0+eix0LHQyKTsKKyAgICAgIGxvYWRfb3AoZiwmcC0+cTIsdCx0MSk7CisKKyAgICAgIGlmKElTTFdPUkQodCkpeworCisJZW1pdChmLCJcdCVzXHQiLHMpOworCWVtaXRfbHdvcmQoZiwmcC0+cTIsdCwiQCVzKysiKTsKKwllbWl0KGYsIiwiKTsKKwllbWl0X2x3b3JkKGYsJnAtPnosdCwiQCVzKysiKTsKKwllbWl0KGYsIlxuIik7CisJZW1pdChmLCJcdCVzJXNcdCIscywhc3RyY21wKHMsImFkZCIpfHwhc3RyY21wKHMsInN1YiIpPyJjIjoiIik7CisJZW1pdF9od29yZChmLCZwLT5xMix0LCJAJXMrKyIpOworCWVtaXQoZiwiLCIpOworCWVtaXRfaHdvcmQoZiwmcC0+eix0LCJAJXMrKyIpOworCWVtaXQoZiwiXG4iKTsKKwljbGVhbnVwX2x3b3JkKGYsJnAtPnEyKTsKKwljbGVhbnVwX2x3b3JkKGYsJnAtPnopOworCWNjPTA7CisKKyAgICAgIH1lbHNleworCisJLyogVE9ETzogdHJ5IHRvIGVsaW1pbmF0ZSAqLworCWlmKGM9PUxTSElGVCl7CisJICBlbWl0KGYsIlx0Y21wXHQlcywlc1xuIixyZWduYW1lc1tzcF0scmVnbmFtZXNbc3BdKTsKKwl9ZWxzZSBpZihjPT1SU0hJRlQpeworCSAgaWYodCZVTlNJR05FRCl7CisJICAgIGVtaXQoZiwiXHRvclx0JXMsJXNcbiIscmVnbmFtZXNbc3BdLHJlZ25hbWVzW3NwXSk7CisJICB9ZWxzZXsKKwkgICAgZW1pdChmLCJcdHNobFx0MSwiKTsKKwkgICAgZW1pdF9vYmooZiwmcC0+eix0KTsKKwkgICAgZW1pdChmLCJcbiIpOworCSAgICBlbWl0KGYsIlx0c2hyXHQxLCIpOworCSAgICBlbWl0X29iaihmLCZwLT56LHQpOworCSAgICBlbWl0KGYsIlxuIik7CisJICB9CisJfQorCWVtaXQoZiwiXHQlc1x0IixzKTsKKwllbWl0X29iaihmLCZwLT5xMix0KTsKKwllbWl0KGYsIiwiKTsKKwllbWl0X29iaihmLCZwLT56LHQpOworCWVtaXQoZiwiXG4iKTsKKwljYz0mcC0+ejtjY190PXQ7CisKKyAgICAgIH0KKyAgICAgIGlmKElTTFdPUkQodCkpIGNjPTA7CisKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZXJyb3IoMCk7CisgIH0KKyAgaWYobm90cG9wcGVkKXsKKyAgICBlbWl0KGYsIlx0YWRkXHQlbGQsJXNcbiIsbm90cG9wcGVkLHJlZ25hbWVzW3NwXSk7CisgICAgcG9wKG5vdHBvcHBlZCk7bm90cG9wcGVkPTA7CisgIH0KKyAgZnVuY3Rpb25fYm90dG9tKGYsdixsb2ZmKTsKK30KKworaW50IHNob3J0Y3V0KGludCBjLGludCB0KQoreworICBpZihjPT1DT01QQVJFfHxjPT1BTkR8fGM9PU9SfHxjPT1YT1IpIHJldHVybiAxOworICBpZihjPT1BRER8fGM9PVNVQikgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCit2b2lkIGNsZWFudXBfY2coRklMRSAqZikKK3sKKyAgc3RydWN0IGZwY29uc3RsaXN0ICpwOworICB1bnNpZ25lZCBjaGFyICppcDsKKyAgaWYoZiYmc3RhY2tfY2hlY2speworICAgIGVtaXQoZiwiXHQuZ2xvYmFsXHQlc19fc3RhY2tfY2hlY2tcbiIsaWRwcmVmaXgpOworICB9CisgIHdoaWxlKHA9Zmlyc3RmcGMpeworICAgIGlmKGYpeworICAgICAgbmV3X3NlY3Rpb24oZixOREFUQSk7CisgICAgICBlbWl0KGYsIiVzJWQ6XG5cdCVzXHQiLGxhYnByZWZpeCxwLT5sYWJlbCxkY3RbU0hPUlRdKTsKKyAgICAgIGlwPSh1bnNpZ25lZCBjaGFyICopJnAtPnZhbC52ZG91YmxlOworICAgICAgZW1pdChmLCIweCUwMnglMDJ4LDB4JTAyeCUwMngiLGlwWzFdLGlwWzBdLGlwWzNdLGlwWzJdKTsKKyAgICAgIGlmKChwLT50eXAmTlEpPT1ET1VCTEV8fChwLT50eXAmTlEpPT1MRE9VQkxFKXsKKwllbWl0KGYsIiwweCUwMnglMDJ4LDB4JTAyeCUwMngiLGlwWzVdLGlwWzRdLGlwWzddLGlwWzZdKTsKKyAgICAgIH0KKyAgICAgIGVtaXQoZiwiXG4iKTsKKyAgICB9CisgICAgZmlyc3RmcGM9cC0+bmV4dDsKKyAgICBmcmVlKHApOworICB9Cit9CisKK2ludCByZWdfcGFybShzdHJ1Y3QgcmVnX2hhbmRsZSAqcCxzdHJ1Y3QgVHlwICp0LGludCBtb2RlLHN0cnVjdCBUeXAgKmZrdCkKK3sKKyAgaW50IGY9dC0+ZmxhZ3MmTlE7CisgIGlmKCFJU1NDQUxBUihmKSkgcmV0dXJuIDA7CisgIGlmKHAtPmdwcj4yfHxtb2RlKSByZXR1cm4gMDsKKyAgaWYoZj09TExPTkd8fGY9PURPVUJMRXx8Zj09TERPVUJMRSkKKyAgICByZXR1cm4gMDsKKyAgZWxzZSBpZihmPT1MT05HfHxmPT1GTE9BVHx8Zj09RlBPSU5URVJ8fGY9PUhQT0lOVEVSKXsKKyAgICBpZihwLT5ncHI9PTApIHtwLT5ncHI9MjtyZXR1cm4gcjhyOTt9CisgICAgcmV0dXJuIDA7CisgIH1lbHNlCisgICAgcmV0dXJuIHI4K3AtPmdwcisrOworfQorCit2b2lkIGluc2VydF9jb25zdCh1bmlvbiBhdHlwcyAqcCxpbnQgdCkKKy8qICBUcmFlZ3QgS29uc3RhbnRlIGluIGVudHByZWNoZW5kZXMgRmVsZCBlaW4uICAgICAgICovCit7CisgIGlmKCFwKSBpZXJyb3IoMCk7CisvKiAgKnAgPSAodW5pb24gYXR5cHMpIDAgOyAvKiByZmk6IGNsZWFyIHVudXNlZCBiaXRzICovCisgIHQmPU5VOworICBpZih0PT1DSEFSKSB7cC0+dmNoYXI9dmNoYXI7cmV0dXJuO30KKyAgaWYodD09U0hPUlQpIHtwLT52c2hvcnQ9dnNob3J0O3JldHVybjt9CisgIGlmKHQ9PUlOVCkge3AtPnZpbnQ9dmludDtyZXR1cm47fQorICBpZih0PT1MT05HKSB7cC0+dmxvbmc9dmxvbmc7cmV0dXJuO30KKyAgaWYodD09TExPTkcpIHtwLT52bGxvbmc9dmxsb25nO3JldHVybjt9CisgIGlmKHQ9PU1BWElOVCkge3AtPnZtYXg9dm1heDtyZXR1cm47fQorICBpZih0PT0oVU5TSUdORUR8QklUKSkge2lmKHp1bWVxdG8oenVjMnp1bSh2dWNoYXIpLHVsMnp1bSgwVUwpKSkgcC0+dnVjaGFyPXp1bTJ6dWModWwyenVtKDBVTCkpOyBlbHNlIHAtPnZ1Y2hhcj16dW0yenVjKHVsMnp1bSgxVUwpKTtyZXR1cm47fSAgCisgIGlmKHQ9PShVTlNJR05FRHxDSEFSKSkge3AtPnZ1Y2hhcj12dWNoYXI7cmV0dXJuO30KKyAgaWYodD09KFVOU0lHTkVEfFNIT1JUKSkge3AtPnZ1c2hvcnQ9dnVzaG9ydDtyZXR1cm47fQorICBpZih0PT0oVU5TSUdORUR8SU5UKSkge3AtPnZ1aW50PXZ1aW50O3JldHVybjt9CisgIGlmKHQ9PShVTlNJR05FRHxMT05HKSkge3AtPnZ1bG9uZz12dWxvbmc7cmV0dXJuO30KKyAgaWYodD09KFVOU0lHTkVEfExMT05HKSkge3AtPnZ1bGxvbmc9dnVsbG9uZztyZXR1cm47fQorICBpZih0PT0oVU5TSUdORUR8TUFYSU5UKSkge3AtPnZ1bWF4PXZ1bWF4O3JldHVybjt9CisgIGlmKHQ9PUZMT0FUKSB7cC0+dmZsb2F0PXZmbG9hdDtyZXR1cm47fQorICBpZih0PT1ET1VCTEUpIHtwLT52ZG91YmxlPXZkb3VibGU7cmV0dXJuO30KKyAgaWYodD09TERPVUJMRSkge3AtPnZsZG91YmxlPXZsZG91YmxlO3JldHVybjt9CisgIGlmKHQ9PU5QT0lOVEVSKSB7cC0+dnVpbnQ9dnVpbnQ7cmV0dXJuO30KKyAgaWYodD09RlBPSU5URVJ8fHQ9PUhQT0lOVEVSKSB7cC0+dnVsb25nPXZ1bG9uZztyZXR1cm47fQorfQordm9pZCBldmFsX2NvbnN0KHVuaW9uIGF0eXBzICpwLGludCB0KQorLyogIFdlaXN0IGJlc3RpbW10ZW4gZ2xvYmFsZW4gVmFyaWFibGVuIFdlcnQgZWluZXIgQ0VYUFIgenUuICAgICAgICovCit7CisgIGludCBmPXQmTlE7CisgIGlmKCFwKSBpZXJyb3IoMCk7CisgIGlmKGY9PU1BWElOVHx8KGY+PUJJVCYmZjw9TExPTkcpKXsKKyAgICBpZighKHQmVU5TSUdORUQpKXsKKyAgICAgIGlmKGY9PUNIQVIpIHZtYXg9emMyem0ocC0+dmNoYXIpOworICAgICAgZWxzZSBpZihmPT1TSE9SVCl2bWF4PXpzMnptKHAtPnZzaG9ydCk7CisgICAgICBlbHNlIGlmKGY9PUlOVCkgIHZtYXg9emkyem0ocC0+dmludCk7CisgICAgICBlbHNlIGlmKGY9PUxPTkcpIHZtYXg9emwyem0ocC0+dmxvbmcpOworICAgICAgZWxzZSBpZihmPT1MTE9ORykgdm1heD16bGwyem0ocC0+dmxsb25nKTsKKyAgICAgIGVsc2UgaWYoZj09TUFYSU5UKSB2bWF4PXAtPnZtYXg7CisgICAgICBlbHNlIGllcnJvcigwKTsKKyAgICAgIHZ1bWF4PXptMnp1bSh2bWF4KTsKKyAgICAgIHZsZG91YmxlPXptMnpsZCh2bWF4KTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKGY9PUNIQVIpIHZ1bWF4PXp1YzJ6dW0ocC0+dnVjaGFyKTsKKyAgICAgIGVsc2UgaWYoZj09U0hPUlQpdnVtYXg9enVzMnp1bShwLT52dXNob3J0KTsKKyAgICAgIGVsc2UgaWYoZj09SU5UKSAgdnVtYXg9enVpMnp1bShwLT52dWludCk7CisgICAgICBlbHNlIGlmKGY9PUxPTkcpIHZ1bWF4PXp1bDJ6dW0ocC0+dnVsb25nKTsKKyAgICAgIGVsc2UgaWYoZj09TExPTkcpIHZ1bWF4PXp1bGwyenVtKHAtPnZ1bGxvbmcpOworICAgICAgZWxzZSBpZihmPT1NQVhJTlQpIHZ1bWF4PXAtPnZ1bWF4OworICAgICAgZWxzZSBpZXJyb3IoMCk7CisgICAgICB2bWF4PXp1bTJ6bSh2dW1heCk7CisgICAgICB2bGRvdWJsZT16dW0yemxkKHZ1bWF4KTsKKyAgICB9CisgIH1lbHNleworICAgIGlmKElTUE9JTlRFUihmKSl7CisgICAgICBpZihmPT1OUE9JTlRFUikKKwl2dW1heD16dWkyenVtKHAtPnZ1aW50KTsKKyAgICAgIGVsc2UKKwl2dW1heD16dWwyenVtKHAtPnZ1bG9uZyk7CisgICAgICB2bWF4PXp1bTJ6bSh2dW1heCk7dmxkb3VibGU9enVtMnpsZCh2dW1heCk7CisgICAgfWVsc2V7CisgICAgICBpZihmPT1GTE9BVCkgdmxkb3VibGU9emYyemxkKHAtPnZmbG9hdCk7CisgICAgICBlbHNlIGlmKGY9PURPVUJMRSkgdmxkb3VibGU9emQyemxkKHAtPnZkb3VibGUpOworICAgICAgZWxzZSB2bGRvdWJsZT1wLT52bGRvdWJsZTsKKyAgICAgIHZtYXg9emxkMnptKHZsZG91YmxlKTsKKyAgICAgIHZ1bWF4PXpsZDJ6dW0odmxkb3VibGUpOworICAgIH0KKyAgfQorICB2ZmxvYXQ9emxkMnpmKHZsZG91YmxlKTsKKyAgdmRvdWJsZT16bGQyemQodmxkb3VibGUpOworICB2dWNoYXI9enVtMnp1Yyh2dW1heCk7CisgIHZ1c2hvcnQ9enVtMnp1cyh2dW1heCk7CisgIHZ1aW50PXp1bTJ6dWkodnVtYXgpOworICB2dWxvbmc9enVtMnp1bCh2dW1heCk7CisgIHZ1bGxvbmc9enVtMnp1bGwodnVtYXgpOworICB2Y2hhcj16bTJ6Yyh2bWF4KTsKKyAgdnNob3J0PXptMnpzKHZtYXgpOworICB2aW50PXptMnppKHZtYXgpOworICB2bG9uZz16bTJ6bCh2bWF4KTsKKyAgdmxsb25nPXptMnpsbCh2bWF4KTsKK30KK3ZvaWQgcHJpbnR2YWwoRklMRSAqZix1bmlvbiBhdHlwcyAqcCxpbnQgdCkKKy8qICBHaWJ0IGF0eXBzIGF1cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgdCY9TlU7CisgIGlmKHQ9PUJJVCl7ZnByaW50ZihmLCJCIik7dm1heD16YzJ6bShwLT52Y2hhcik7ZnByaW50ZihmLCIlZCIsIXptZXF0byh2bWF4LGwyem0oMEwpKSk7fQorICBpZih0PT0oVU5TSUdORUR8QklUKSl7ZnByaW50ZihmLCJVQiIpO3Z1bWF4PXp1YzJ6dW0ocC0+dnVjaGFyKTtmcHJpbnRmKGYsIiVkIiwhenVtZXF0byh2bWF4LHVsMnp1bSgwVUwpKSk7fQorICBpZih0PT1DSEFSKXtmcHJpbnRmKGYsIkMiKTt2bWF4PXpjMnptKHAtPnZjaGFyKTtwcmludHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8Q0hBUikpe2ZwcmludGYoZiwiVUMiKTt2dW1heD16dWMyenVtKHAtPnZ1Y2hhcik7cHJpbnR6dW0oZix2dW1heCk7fQorICBpZih0PT1TSE9SVCl7ZnByaW50ZihmLCJTIik7dm1heD16czJ6bShwLT52c2hvcnQpO3ByaW50em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxTSE9SVCkpe2ZwcmludGYoZiwiVVMiKTt2dW1heD16dXMyenVtKHAtPnZ1c2hvcnQpO3ByaW50enVtKGYsdnVtYXgpO30KKyAgaWYodD09RkxPQVQpe2ZwcmludGYoZiwiRiIpO3ZsZG91YmxlPXpmMnpsZChwLT52ZmxvYXQpO3ByaW50emxkKGYsdmxkb3VibGUpO30KKyAgaWYodD09RE9VQkxFKXtmcHJpbnRmKGYsIkQiKTt2bGRvdWJsZT16ZDJ6bGQocC0+dmRvdWJsZSk7cHJpbnR6bGQoZix2bGRvdWJsZSk7fQorICBpZih0PT1MRE9VQkxFKXtmcHJpbnRmKGYsIkxEIik7cHJpbnR6bGQoZixwLT52bGRvdWJsZSk7fQorICBpZih0PT1JTlQpe2ZwcmludGYoZiwiSSIpO3ZtYXg9emkyem0ocC0+dmludCk7cHJpbnR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfElOVCl8fHQ9PU5QT0lOVEVSKXtmcHJpbnRmKGYsIlVJIik7dnVtYXg9enVpMnp1bShwLT52dWludCk7cHJpbnR6dW0oZix2dW1heCk7fQorICBpZih0PT1MT05HKXtmcHJpbnRmKGYsIkwiKTt2bWF4PXpsMnptKHAtPnZsb25nKTtwcmludHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8TE9ORyl8fHQ9PUZQT0lOVEVSfHx0PT1IUE9JTlRFUil7ZnByaW50ZihmLCJVTCIpO3Z1bWF4PXp1bDJ6dW0ocC0+dnVsb25nKTtwcmludHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUxMT05HKXtmcHJpbnRmKGYsIkxMIik7dm1heD16bGwyem0ocC0+dmxsb25nKTtwcmludHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8TExPTkcpKXtmcHJpbnRmKGYsIlVMTCIpO3Z1bWF4PXp1bGwyenVtKHAtPnZ1bGxvbmcpO3ByaW50enVtKGYsdnVtYXgpO30KKyAgaWYodD09TUFYSU5UKSBwcmludHptKGYscC0+dm1heCk7CisgIGlmKHQ9PShVTlNJR05FRHxNQVhJTlQpKSBwcmludHp1bShmLHAtPnZ1bWF4KTsKK30KK3ZvaWQgZW1pdHZhbChGSUxFICpmLHVuaW9uIGF0eXBzICpwLGludCB0KQorLyogIEdpYnQgYXR5cHMgYXVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICB0Jj1OVTsKKyAgaWYodD09QklUKXt2bWF4PXpjMnptKHAtPnZjaGFyKTtlbWl0KGYsIiVkIiwhem1lcXRvKHZtYXgsbDJ6bSgwTCkpKTt9CisgIGlmKHQ9PShVTlNJR05FRHxCSVQpKXt2dW1heD16dWMyenVtKHAtPnZ1Y2hhcik7ZW1pdChmLCIlZCIsIXp1bWVxdG8odnVtYXgsdWwyenVtKDBVTCkpKTt9CisgIGlmKHQ9PUNIQVIpe3ZtYXg9emMyem0ocC0+dmNoYXIpO2VtaXR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfENIQVIpKXt2dW1heD16dWMyenVtKHAtPnZ1Y2hhcik7ZW1pdHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PVNIT1JUKXt2bWF4PXpzMnptKHAtPnZzaG9ydCk7ZW1pdHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8U0hPUlQpKXt2dW1heD16dXMyenVtKHAtPnZ1c2hvcnQpO2VtaXR6dW0oZix2dW1heCk7fQorICBpZih0PT1GTE9BVCl7dmxkb3VibGU9emYyemxkKHAtPnZmbG9hdCk7ZW1pdHpsZChmLHZsZG91YmxlKTt9CisgIGlmKHQ9PURPVUJMRSl7dmxkb3VibGU9emQyemxkKHAtPnZkb3VibGUpO2VtaXR6bGQoZix2bGRvdWJsZSk7fQorICBpZih0PT1MRE9VQkxFKXtlbWl0emxkKGYscC0+dmxkb3VibGUpO30KKyAgaWYodD09SU5UKXt2bWF4PXppMnptKHAtPnZpbnQpO2VtaXR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfElOVCl8fHQ9PU5QT0lOVEVSKXt2dW1heD16dWkyenVtKHAtPnZ1aW50KTtlbWl0enVtKGYsdnVtYXgpO30KKyAgaWYodD09TE9ORyl7dm1heD16bDJ6bShwLT52bG9uZyk7ZW1pdHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8TE9ORyl8fHQ9PUZQT0lOVEVSfHx0PT1IUE9JTlRFUil7dnVtYXg9enVsMnp1bShwLT52dWxvbmcpO2VtaXR6dW0oZix2dW1heCk7fQorICBpZih0PT1MTE9ORyl7dm1heD16bGwyem0ocC0+dmxsb25nKTtlbWl0em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxMTE9ORykpe3Z1bWF4PXp1bGwyenVtKHAtPnZ1bGxvbmcpO2VtaXR6dW0oZix2dW1heCk7fQorICBpZih0PT1NQVhJTlQpIGVtaXR6bShmLHAtPnZtYXgpOworICBpZih0PT0oVU5TSUdORUR8TUFYSU5UKSkgZW1pdHp1bShmLHAtPnZ1bWF4KTsKK30KK3ZvaWQgY29udl90eXAoc3RydWN0IFR5cCAqcCkKKy8qIEVyemV1Z3QgZXh0ZW5kZWQgdHlwZXMgaW4gZWluZW0gVHlwLiAqLworeworICBjaGFyICphdHRyOworICB3aGlsZShwKXsKKyAgICBpZihJU1BPSU5URVIocC0+ZmxhZ3MpKXsKKyAgICAgIHAtPmZsYWdzPSgocC0+ZmxhZ3Mmfk5VKXxQT0lOVEVSX1RZUEUocC0+bmV4dCkpOworICAgICAgaWYoYXR0cj1wLT5uZXh0LT5hdHRyKXsKKwlpZihzdHJzdHIoYXR0cixTVFJfTkVBUikpCisJICBwLT5mbGFncz0oKHAtPmZsYWdzJn5OVSl8TlBPSU5URVIpOworCWlmKHN0cnN0cihhdHRyLFNUUl9GQVIpKQorCSAgcC0+ZmxhZ3M9KChwLT5mbGFncyZ+TlUpfEZQT0lOVEVSKTsKKwlpZihzdHJzdHIoYXR0cixTVFJfSFVHRSkpCisJICBwLT5mbGFncz0oKHAtPmZsYWdzJn5OVSl8SFBPSU5URVIpOworICAgICAgfQorICAgIH0KKyAgICBpZihJU0lOVChwLT5mbGFncykmJihhdHRyPXAtPmF0dHIpJiZzdHJzdHIoYXR0ciwiYml0IikpCisgICAgICBwLT5mbGFncz0oKHAtPmZsYWdzJn5OVSl8QklUKTsKKyAgICBwPXAtPm5leHQ7CisgIH0KK30KKwordm9pZCBpbml0X2RiKEZJTEUgKmYpCit7Cit9CisKK3ZvaWQgY2xlYW51cF9kYihGSUxFICpmKQoreworfQorCitjaGFyICp1c2VfbGliY2FsbChpbnQgYyxpbnQgdCxpbnQgdDIpCit7CisgIHN0YXRpYyBjaGFyIGZuYW1lWzE2XTsKKyAgY2hhciAqcmV0PTAsKnR0OworCisgIGlmKGM9PUNPTVBBUkUpeworICAgIGlmKCh0Jk5RKT09TExPTkd8fElTRkxPQVQodCkpeworICAgICAgc3ByaW50ZihmbmFtZSwiX19jbXAlcyVzJWxkIiwodCZVTlNJR05FRCk/InUiOiJzIixJU0ZMT0FUKHQpPyJmbHQiOiJpbnQiLHptMmwoc2l6ZXRhYlt0Jk5RXSkqMTYpOworICAgICAgcmV0PWZuYW1lOworICAgIH0KKyAgfWVsc2V7CisgICAgdCY9TlU7CisgICAgdDImPU5VOworICAgIGlmKHQ9PUxET1VCTEUpIHQ9RE9VQkxFOworICAgIGlmKHQyPT1MRE9VQkxFKSB0Mj1ET1VCTEU7CisgICAgaWYoYz09Q09OVkVSVCl7CisgICAgICBpZih0PT10MikgcmV0dXJuIDA7CisgICAgICBpZih0PT1GTE9BVCYmdDI9PURPVUJMRSkgcmV0dXJuICJfX2ZsdDY0dG9mbHQzMiI7CisgICAgICBpZih0PT1ET1VCTEUmJnQyPT1GTE9BVCkgcmV0dXJuICJfX2ZsdDMydG9mbHQ2NCI7CisKKyAgICAgIGlmKElTRkxPQVQodCkpeworICAgICAgICBzcHJpbnRmKGZuYW1lLCJfXyVjaW50JWxkdG9mbHQlZCIsKHQyJlVOU0lHTkVEKT8ndSc6J3MnLHptMmwoc2l6ZXRhYlt0MiZOUV0pKjE2LCh0PT1GTE9BVCk/MzI6NjQpOworICAgICAgICByZXQ9Zm5hbWU7CisgICAgICB9CisgICAgICBpZihJU0ZMT0FUKHQyKSl7CisgICAgICAgIHNwcmludGYoZm5hbWUsIl9fZmx0JWR0byVjaW50JWxkIiwoKHQyJk5VKT09RkxPQVQpPzMyOjY0LCh0JlVOU0lHTkVEKT8ndSc6J3MnLHptMmwoc2l6ZXRhYlt0Jk5RXSkqMTYpOworICAgICAgICByZXQ9Zm5hbWU7CisgICAgICB9CisgICAgICBpZigodCZOUSk9PUxMT05HfHwodDImTlEpPT1MTE9ORyl7CisJc3ByaW50ZihmbmFtZSwiX18lY2ludCVsZHRvJWNpbnQlbGQiLCh0MiZVTlNJR05FRCk/J3UnOidzJyx6bTJsKHNpemV0YWJbdDImTlFdKSoxNiwodCZVTlNJR05FRCk/J3UnOidzJyx6bTJsKHNpemV0YWJbdCZOUV0pKjE2KTsKKyAgICAgICAgcmV0PWZuYW1lOworICAgICAgfQorICAgIH0KKyAgICBpZihJU0lOVCh0KSYmSVNMV09SRCh0KSl7CisgICAgICBpZihjPT1NSU5VU3x8Yz09S09NUExFTUVOVHx8Yz09QUREfHxjPT1TVUJ8fGM9PU9SfHxjPT1BTkR8fGM9PVhPUikKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgaWYoKHQmTlEpPT1MT05HfHwodCZOUSk9PUxMT05HfHxJU0ZMT0FUKHQpfHwoU09GVE1VTCYmKGM9PU1VTFR8fGM9PURJVnx8Yz09TU9EKSkpeworICAgICAgaWYoKGM+PUxTSElGVCYmYzw9TU9EKXx8KGM+PU9SJiZjPD1BTkQpfHxjPT1LT01QTEVNRU5UfHxjPT1NSU5VUyl7CisJaWYoYyE9RElWJiZjIT1NT0QmJmMhPVJTSElGVCYmYyE9Q09NUEFSRSkKKwkgIHQmPX5VTlNJR05FRDsKKwlzcHJpbnRmKGZuYW1lLCJfXyVzJXMlcyVsZCIsZW5hbWVbY10sKHQmVU5TSUdORUQpPyJ1IjoiIixJU0ZMT0FUKHQpPyJmbHQiOiJpbnQiLHptMmwoc2l6ZXRhYlt0Jk5RXSkqMTYpOworCXJldD1mbmFtZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworCisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9tYWNoaW5lcy9xbmljZS9tYWNoaW5lLmR0IGIvbWFjaGluZXMvcW5pY2UvbWFjaGluZS5kdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mYTYwNjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvcW5pY2UvbWFjaGluZS5kdApAQCAtMCwwICsxLDE2IEBACitTMTZCU0xFIFMxNkJTQkUKK1MxNkJVTEUgUzE2QlVCRQorUzE2QlNMRSBTMTZCU0JFCitTMTZCVUxFIFMxNkJVQkUKK1MxNkJTTEUgUzE2QlNCRQorUzE2QlVMRSBTMTZCVUJFCitTMzJCU0xFIFMzMkJTQkUKK1MzMkJVTEUgUzMyQlVCRQorUzY0QlNMRSBTNjRCU0JFCitTNjRCVUxFIFM2NEJVQkUKK1MzMkJJRUVFTEUKK1M2NEJJRUVFTEUKK1M2NEJJRUVFTEUKK1MxNkJVTEUgUzE2QlVCRQorCisKZGlmZiAtLWdpdCBhL21hY2hpbmVzL3FuaWNlL21hY2hpbmUuaCBiL21hY2hpbmVzL3FuaWNlL21hY2hpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iOTc5NWEzCi0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvcW5pY2UvbWFjaGluZS5oCkBAIC0wLDAgKzEsMTg1IEBACisvKiAgRXhhbXBsZSBvZiBhIGNvZGUtZ2VuZXJhdG9yIGZvciBxbmljZSBjcHUuKi8KKworI2luY2x1ZGUgImR0LmgiCisKKy8qIFdlIGhhdmUgZXh0ZW5kZWQgdHlwZXMhIFdoYXQgd2UgaGF2ZSB0byBkbyB0byBzdXBwb3J0IHRoZW06ICAgICAgKi8KKy8qIC0gI2RlZmluZSBIQVZFX0VYVF9UWVBFUworICAgLSAjdW5kZWYgYWxsIHN0YW5kYXJkIHR5cGVzCisgICAtICNkZWZpbmUgYWxsIHN0YW5kYXJkIHR5cGVzIHBsdXMgbmV3IHR5cGVzCisgICAtIHdyaXRlIGV2YWxfY29uc3QgYW5kIGluc2VydF9jb25zdAorICAgLSB3cml0ZSB0eXBlZGVmcyBmb3Igem1heCBhbmQgenVtYXgKKyAgIC0gd3JpdGUgdHlwbmFtZVtdCisgICAtIHdyaXRlIGNvbnZfdHlwKCkKKyAgIC0gb3B0aW9uYWxseSAjZGVmaW5lIElTUE9JTlRFUiwgSVNBUklUSCwgSVNJTlQgZXRjLgorICAgLSBvcHRpb25hbGx5ICNkZWZpbmUgSEFWRV9UR1RfUFJJTlRWQUwgYW5kIHdyaXRlIHByaW50dmFsCisgICAtIG9wdGlvbmFsbHkgI2RlZmluZSBQT0lOVEVSX1RZUEUKKyAgIC0gb3B0aW9uYWxseSAjZGVmaW5lIEhBVkVfVEdUX0ZBTElHTiBhbmQgd3JpdGUgZmFsaWduCisgICAtIG9wdGlvbmFsbHkgI2RlZmluZSBIQVZFX1RHVF9TWk9GIGFuZCB3cml0ZSBzem9mCisgICAtIG9wdGlvbmFsbHkgYWRkIGZ1bmN0aW9ucyBmb3IgYXR0cmlidXRlLWhhbmRsaW5nCisqLworI2RlZmluZSBIQVZFX0VYVF9UWVBFUyAxCisKKyNkZWZpbmUgSEFWRV9UR1RfUFJJTlRWQUwKKworI3VuZGVmIENIQVIKKyN1bmRlZiBTSE9SVAorI3VuZGVmIElOVAorI3VuZGVmIExPTkcKKyN1bmRlZiBMTE9ORworI3VuZGVmIEZMT0FUCisjdW5kZWYgRE9VQkxFCisjdW5kZWYgTERPVUJMRQorI3VuZGVmIFZPSUQKKyN1bmRlZiBQT0lOVEVSCisjdW5kZWYgQVJSQVkKKyN1bmRlZiBTVFJVQ1QKKyN1bmRlZiBVTklPTgorI3VuZGVmIEVOVU0KKyN1bmRlZiBGVU5LVAorI3VuZGVmIEJPT0wKKyN1bmRlZiBNQVhJTlQKKyN1bmRlZiBNQVhfVFlQRQorCisjZGVmaW5lIEJJVCAxCisjZGVmaW5lIENIQVIgMgorI2RlZmluZSBTSE9SVCAzCisjZGVmaW5lIElOVCA0CisjZGVmaW5lIExPTkcgNQorI2RlZmluZSBMTE9ORyA2CisjZGVmaW5lIEZMT0FUIDcKKyNkZWZpbmUgRE9VQkxFIDgKKyNkZWZpbmUgTERPVUJMRSA5CisjZGVmaW5lIFZPSUQgMTAKKyNkZWZpbmUgTlBPSU5URVIgMTEKKyNkZWZpbmUgRlBPSU5URVIgMTIKKyNkZWZpbmUgSFBPSU5URVIgMTMKKyNkZWZpbmUgQVJSQVkgMTQKKyNkZWZpbmUgU1RSVUNUIDE1CisjZGVmaW5lIFVOSU9OIDE2CisjZGVmaW5lIEVOVU0gMTcKKyNkZWZpbmUgRlVOS1QgMTgKKyNkZWZpbmUgQk9PTCAxOQorCisjZGVmaW5lIE1BWElOVCAyMAorCisjZGVmaW5lIE1BWF9UWVBFIE1BWElOVAorCisjZGVmaW5lIFBPSU5URVJfVFlQRSh4KSBwb2ludGVyX3R5cGUoeCkKK2V4dGVybiBpbnQgcG9pbnRlcl90eXBlKCk7CisjZGVmaW5lIElTUE9JTlRFUih4KSAoKHgmTlEpPj1OUE9JTlRFUiYmKHgmTlEpPD1IUE9JTlRFUikKKyNkZWZpbmUgSVNTQ0FMQVIoeCkgKCh4Jk5RKT49QklUJiYoeCZOUSk8PUhQT0lOVEVSKQorI2RlZmluZSBJU0lOVCh4KSAoKHgmTlEpPj1CSVQmJih4Jk5RKTw9TExPTkcpCisjZGVmaW5lIFBUUkRJRkZfVCh4KSAoKHgpPT1IUE9JTlRFUj9MT05HOklOVCkKKwordHlwZWRlZiB6bGxvbmcgem1heDsKK3R5cGVkZWYgenVsbG9uZyB6dW1heDsKKwordW5pb24gYXR5cHN7CisgIHpjaGFyIHZjaGFyOworICB6dWNoYXIgdnVjaGFyOworICB6c2hvcnQgdnNob3J0OworICB6dXNob3J0IHZ1c2hvcnQ7CisgIHppbnQgdmludDsKKyAgenVpbnQgdnVpbnQ7CisgIHpsb25nIHZsb25nOworICB6dWxvbmcgdnVsb25nOworICB6bGxvbmcgdmxsb25nOworICB6dWxsb25nIHZ1bGxvbmc7CisgIHptYXggdm1heDsKKyAgenVtYXggdnVtYXg7CisgIHpmbG9hdCB2ZmxvYXQ7CisgIHpkb3VibGUgdmRvdWJsZTsKKyAgemxkb3VibGUgdmxkb3VibGU7Cit9OworCisvKiAgVGhpcyBzdHJ1Y3QgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IG1hY2hpbmUtc3BlY2lmaWMgICAgICAgICAgICovCisvKiAgYWRkcmVzc2luZy1tb2Rlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdHJ1Y3QgQWRkcmVzc2luZ01vZGV7CisgICAgaW50IGZsYWdzOworICAgIGludCBiYXNlOworfTsKKworLyogVGhpcyB0eXBlIHdpbGwgYmUgYWRkZWQgdG8gZXZlcnkgSUMuIENhbiBiZSB1c2VkIGJ5IHRoZSBjZy4gICAgICAqLworI2RlZmluZSBIQVZFX0VYVF9JQyAwCitzdHJ1Y3QgZXh0X2ljIHsKKyAgaW50IGZsYWdzOworICBpbnQgcjsKKyAgbG9uZyBvZmZzZXQ7Cit9OworCisvKiAgVGhlIG51bWJlciBvZiByZWdpc3RlcnMgb2YgdGhlIHRhcmdldCBtYWNoaW5lLiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1BWFIgMjIKKworLyogIE51bWJlciBvZiBjb21tYW5kbGluZS1vcHRpb25zIHRoZSBjb2RlLWdlbmVyYXRvciBhY2NlcHRzLiAgICAgICAqLworI2RlZmluZSBNQVhHRiAyMAorCisvKiAgSWYgdGhpcyBpcyBzZXQgdG8gemVybyB2YmNjIHdpbGwgbm90IGdlbmVyYXRlIElDcyB3aGVyZSB0aGUgICAgICovCisvKiAgdGFyZ2V0IG9wZXJhbmQgaXMgdGhlIHNhbWUgYXMgdGhlIDJuZCBzb3VyY2Ugb3BlcmFuZC4gICAgICAgICAgICovCisvKiAgVGhpcyBjYW4gc29tZXRpbWVzIHNpbXBsaWZ5IHRoZSBjb2RlLWdlbmVyYXRvciwgYnV0IHVzdWFsbHkgICAgICovCisvKiAgdGhlIGNvZGUgaXMgYmV0dGVyIGlmIHRoZSBjb2RlLWdlbmVyYXRvciBhbGxvd3MgaXQuICAgICAgICAgICAgICovCisjZGVmaW5lIFVTRVEyQVNaIDEKKworLyogIFRoaXMgc3BlY2lmaWVzIHRoZSBzbWFsbGVzdCBpbnRlZ2VyIHR5cGUgdGhhdCBjYW4gYmUgYWRkZWQgdG8gYSAqLworLyogIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNSU5BRERJMlAgQ0hBUgorCisvKiAgSWYgdGhlIGJ5dGVzIG9mIGFuIGludGVnZXIgYXJlIG9yZGVyZWQgbW9zdCBzaWduaWZpY2FudCBieXRlICAgICovCisvKiAgYnl0ZSBmaXJzdCBhbmQgdGhlbiBkZWNyZWFzaW5nIHNldCBCSUdFTkRJQU4gdG8gMS4gICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR0VORElBTiAwCisKKy8qICBJZiB0aGUgYnl0ZXMgb2YgYW4gaW50ZWdlciBhcmUgb3JkZXJlZCBsZXN0IHNpZ25pZmljYW50IGJ5dGUgICAgKi8KKy8qICBieXRlIGZpcnN0IGFuZCB0aGVuIGluY3JlYXNpbmcgc2V0IExJVFRMRUVORElBTiB0byAxLiAgICAgICAgICAgKi8KKyNkZWZpbmUgTElUVExFRU5ESUFOIDEKKworLyogIE5vdGUgdGhhdCBCSUdFTkRJQU4gYW5kIExJVFRMRUVORElBTiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAgICAqLworCisvKiAgSWYgc3dpdGNoLXN0YXRlbWVudHMgc2hvdWxkIGJlIGdlbmVyYXRlZCBhcyBhIHNlcXVlbmNlIG9mICAgICAgICovCisvKiAgU1VCLFRTVCxCRVEgSUNzIHJhdGhlciB0aGFuIENPTVBBUkUsQkVRIElDcyBzZXQgdGhpcyB0byAxLiAgICAgICovCisvKiAgVGhpcyBjYW4geWllbGQgYmV0dGVyIGNvZGUgb24gc29tZSBtYWNoaW5lcy4gICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNXSVRDSFNVQlMgMAorCisvKiAgSW4gb3B0aW1pemluZyBjb21waWxhdGlvbiBjZXJ0YWluIGxpYnJhcnkgbWVtY3B5L3N0cmNweS1jYWxscyAgICovCisvKiAgd2l0aCBsZW5ndGgga25vd24gYXQgY29tcGlsZS10aW1lIHdpbGwgYmUgaW5saW5lZCB1c2luZyBhbiAgICAgICovCisvKiAgQVNTSUdOLUlDIGlmIHRoZSBzaXplIGlzIGxlc3Mgb3IgZXF1YWwgdG8gSU5MSU5FTUVNQ1BZLiAgICAgICAgICovCisvKiAgVGhlIHR5cGUgdXNlZCBmb3IgdGhlIEFTU0lHTi1JQyB3aWxsIGJlIFVOU0lHTkVEfENIQVIuICAgICAgICAgICovCisjZGVmaW5lIElOTElORU1FTUNQWSAxMDI0CisKKyNkZWZpbmUgSEFWRV9SRUdQQVJNUyAxCisKK3N0cnVjdCByZWdfaGFuZGxlIHsKKyAgaW50IGdwcjsKK307CisKKy8qICBXZSB1c2UgdW5zaWduZWQgaW50IGFzIHNpemVfdCByYXRoZXIgdGhhbiB1bnNpZ25lZCBsb25nIHdoaWNoICAgKi8KKy8qICBpcyB0aGUgZGVmYXVsdCBzZXR0aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9JTlRfU0laRVQgMQorCisvKiAgV2UgaGF2ZSByZWdpc3RlciBwYWlycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBVkVfUkVHUEFJUlMgMQorCisvKiAgV2Uga2VlcCB0cmFjayBvZiBhbGwgcmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IGEgZnVuY3Rpb24uICAgICAgICAgICovCisjZGVmaW5lIEhBVkVfUkVHU19NT0RJRklFRCAxCisKKyNkZWZpbmUgSEFWRV9UQVJHRVRfUkFMTE9DIDEKKyNkZWZpbmUgY29zdF9sb2FkX3JlZyhyLHYpIDQKKyNkZWZpbmUgY29zdF9zYXZlX3JlZyhyLHYpIDQKKyNkZWZpbmUgY29zdF9tb3ZlX3JlZyhpLGopIDIKKyNkZWZpbmUgY29zdF9wdXNocG9wX3JlZyhyKSAyCisKKy8qIHNpemUgb2YgYnVmZmVyIGZvciBhc20tb3V0cHV0ICovCisjZGVmaW5lIEVNSVRfQlVGX0xFTiAxMDI0IC8qIHNob3VsZCBiZSBlbm91Z2ggKi8KKy8qIG51bWJlciBvZiBhc20tb3V0cHV0IGxpbmVzIGJ1ZmZlcmVkICovCisjZGVmaW5lIEVNSVRfQlVGX0RFUFRIIDQKKworLyogIFdlIGhhdmUgYXNtX3BlZXBob2xlIHRvIG9wdGltaXplIGFzc2VtYmx5LW91dHB1dCAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9QRUVQSE9MRSAxCisKKy8qICBXZSBoYXZlIHNvbWUgdGFyZ2V0LXNwZWNpZmljIHZhcmlhYmxlIGF0dHJpYnV0ZXMuICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9UQVJHRVRfQVRUUklCVVRFUyAxCisKKy8qIFdlIHVzZSBidWlsdGluIGxpYmNhbGxzIGZvciBzb21lIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgSEFWRV9MSUJDQUxMUyAxCisKKyNkZWZpbmUgSEFWRV9XQU5UQk5FIDEKKworI2RlZmluZSBIQVZFX1BPRjJPUFQgMQpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvcW5pY2Uvc3lzZGVmLmggYi9tYWNoaW5lcy9xbmljZS9zeXNkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGM3MzNlCi0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvcW5pY2Uvc3lzZGVmLmgKQEAgLTAsMCArMSw0NjEgQEAKKy8vOworLy87ICBzeXNkZWYuYXNtOiBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgdG8gc2ltcGxpZnkgYXNzZW1ibGVyIHByb2dyYW1taW5nCisvLzsgICAgICAgICAgICAgIGFuZCBmb3IgYWNjZXNzaW5nIHRoZSB2YXJpb3VzIGhhcmR3YXJlIHJlZ2lzdGVycyB2aWEgTU1JTworLy87CisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKiAgQXNzZW1ibGVyIG1hY3JvcyB3aGljaCBtYWtlIGxpZmUgbXVjaCBlYXNpZXI6CisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKworCisvLworLy8gIFNvbWUgcmVnaXN0ZXIgc2hvcnQgbmFtZXM6CisvLworCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vKiAgSU8tcGFnZSBhZGRyZXNzZXM6IERlZmF1bHQ6IDggcmVnaXN0ZXJzIHBlciBibG9jaworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisjZGVmaW5lIElPX0FSRUFfU1RBUlQgIAkweEZGMDAKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEJsb2NrIEZGMDA6IEZVTkRBTUVOVEFMIElPCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBTd2l0Y2gtcmVnaXN0ZXI6CisvLworI2RlZmluZSBJT19TV0lUQ0hfUkVHICAJMHhGRjAwIC8vIDE2IGJpbmFyeSBrZXlzCisvLworLy8gIFJlZ2lzdGVycyBmb3IgVElMLWRpc3BsYXk6CisvLworI2RlZmluZSBJT19USUxfRElTUExBWSAJMHhGRjAxIC8vIEFkZHJlc3Mgb2YgVElMLWRpc3BsYXkKKyNkZWZpbmUgSU9fVElMX01BU0sgICAgCTB4RkYwMiAvLyBNYXNrIHJlZ2lzdGVyIG9mIFRJTCBkaXNwbGF5CisvLworLy8gIFVTQi1rZXlib2FyZC1yZWdpc3RlcnM6CisvLworI2RlZmluZSBJT19LQkRfU1RBVEUgICAJMHhGRjA0IC8vIFN0YXR1cyByZWdpc3RlciBvZiBVU0Iga2V5Ym9hcmQKKy8vICAgIEJpdCAgMCAocmVhZCBvbmx5KTogICAgICBOZXcgQVNDSUkgY2hhcmFjdGVyIGF2YWlhYmxlIGZvciByZWFkaW5nCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJpdHMgNyBkb3dudG8gMCBvZiBSZWFkIHJlZ2lzdGVyKQorLy8gICAgQml0ICAxIChyZWFkIG9ubHkpOiAgICAgIE5ldyBzcGVjaWFsIGtleSBhdmFpbGFibGUgZm9yIHJlYWRpbmcKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYml0cyAxNSBkb3dudG8gOCBvZiBSZWFkIHJlZ2lzdGVyKQorLy8gICAgQml0cyAyLi40IChyZWFkL3dyaXRlKTogIExvY2FsZXM6IDAwMCA9IFVTIEVuZ2xpc2gga2V5Ym9hcmQgbGF5b3V0LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAwMSA9IEdlcm1hbiBsYXlvdXQsIG90aGVyczogcmVzZXJ2ZWQgZm9yIG1vcmUgbG9jYWxlcworLy8gICAgQml0cyA1Li43IChyZWFkIG9ubHkpOiAgIE1vZGlmaWVyczogNSA9IHNoaWZ0LCA2ID0gYWx0LCA3ID0gY3RybAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgdmFsaWQsIHdoZW4gYml0cyAwIGFuZC9vciAxIGFyZSAnMScKKy8vCisjZGVmaW5lIElPX0tCRF9EQVRBICAgIAkweEZGMDUgLy8gRGF0YSByZWdpc3RlciBvZiBVU0Iga2V5Ym9hcmQKKy8vICAgIENvbnRhaW5zIHRoZSBBU0NJSSBjaGFyYWN0ZXIgaW4gYml0cyA3IGRvd250byAwICBvciB0aGUgc3BlY2lhbCBrZXkgY29kZQorLy8gICAgaW4gMTUgZG93bnRvIDguIFRoZSAib3IiIGlzIG1lYW50IGV4Y2x1c2l2ZSwgaS5lLiBpdCBjYW5ub3QgaGFwcGVuIHRoYXQKKy8vICAgIG9uZSB0cmFuc21pc3Npb24gY29udGFpbnMgYW4gQVNDSUkgY2hhcmFjdGVyIFBMVVMgYSBzcGVjaWFsIGNoYXJhY3Rlci4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEJsb2NrIEZGMDg6IFNZU1RFTSBDT1VOVEVSUworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgQ1lDTEUtQ09VTlQtcmVnaXN0ZXJzICAgICAgIAorLy8KKyNkZWZpbmUgSU9fQ1lDX0xPICAgICAgCTB4RkYwOCAgICAgLy8gbG93IHdvcmQgb2YgNDgtYml0IGNvdW50ZXIKKyNkZWZpbmUgSU9fQ1lDX01JRCAgICAgCTB4RkYwOSAgICAgLy8gbWlkZGxlIHdvcmQgb2YgNDgtYml0IGNvdW50ZXIKKyNkZWZpbmUgSU9fQ1lDX0hJICAgICAgCTB4RkYwQSAgICAgLy8gaGlnaCB3b3JkIG9mIDQ4LWJpdCBjb3VudGVyCisjZGVmaW5lIElPX0NZQ19TVEFURSAgIAkweEZGMEIgICAgIC8vIHN0YXR1cyByZWdpc3RlcgorLy8gICAgQml0ICAwICh3cml0ZSBvbmx5KTogICAgIFJlc2V0IGNvdW50ZXIgdG8gemVybyBhbmQgc3RhcnQgY291bnRpbmcsIGkuZS4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQgMSBpcyBhdXRvbWF0aWNhbGx5IHNldCB0byAxIHdoZW4gcmVzZXR0aW5nCisvLyAgICBCaXQgIDEgKHJlYWQvd3JpdGUpOiAgICAgU3RhcnQvc3RvcCBjb3VudGVyCisvLworLy8gIElOU1RSVUNUSU9OLUNPVU5ULXJlZ2lzdGVycyAgICAgICAKKy8vCisjZGVmaW5lIElPX0lOU19MTyAgICAgIAkweEZGMEMgICAgIC8vIGxvdyB3b3JkIG9mIDQ4LWJpdCBjb3VudGVyCisjZGVmaW5lIElPX0lOU19NSUQgICAgIAkweEZGMEQgICAgIC8vIG1pZGRsZSB3b3JkIG9mIDQ4LWJpdCBjb3VudGVyCisjZGVmaW5lIElPX0lOU19ISSAgICAgIAkweEZGMEUgICAgIC8vIGhpZ2ggd29yZCBvZiA0OC1iaXQgY291bnRlcgorI2RlZmluZSBJT19JTlNfU1RBVEUgICAJMHhGRjBGICAgICAvLyBzdGF0dXMgcmVnaXN0ZXIKKy8vICAgIEJpdCAgMCAod3JpdGUgb25seSk6ICAgICBSZXNldCBjb3VudGVyIHRvIHplcm8gYW5kIHN0YXJ0IGNvdW50aW5nLCBpLmUuCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0IDEgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gMSB3aGVuIHJlc2V0dGluZworLy8gICAgQml0ICAxIChyZWFkL3dyaXRlKTogICAgIFN0YXJ0L3N0b3AgY291bnRlcgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQmxvY2sgRkYxMDogVUFSVAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgUU5JQ0UtRlBHQSBzdXBwb3J0czogSU9fVUFSVF9TUkEsIElPX1VBUlRfUkhSQSBhbmQgSU9fVUFSVF9USFJBIAorLy8gIFRoZSBvdGhlciByZWdpc3RlcnMgYXJlIG1lbnRpb25lZCBmb3IgY29tcGxldGVuZXNzIHRvIG1hcCByZWFsIGhhcmR3YXJlICgxNjU1MCkKKy8vCisjZGVmaW5lIElPX1VBUlRfQkFTRV9BRERSRVNTICAgCTB4RkYxMAorI2RlZmluZSBJT19VQVJUX01SMUEgICAJMHhGRjEwIC8vIG4vYQorI2RlZmluZSBJT19VQVJUX01SMUIgICAJMHhGRjEwIC8vIG4vYQorI2RlZmluZSBJT19VQVJUX1NSQSAgICAJMHhGRjExIC8vIFN0YXR1cyByZWdpc3RlciAocmVsYXRpdmUgdG8gYmFzZSBhZGRyZXNzKQorI2RlZmluZSBJT19VQVJUX1JIUkEgICAJMHhGRjEyIC8vIFJlY2VpdmluZyByZWdpc3RlciAocmVsYXRpdmUgdG8gYmFzZSBhZGRyZXNzKQorI2RlZmluZSBJT19VQVJUX1RIUkEgICAJMHhGRjEzIC8vIFRyYW5zbWl0dGluZyByZWdpc3RlciAocmVsYXRpdmUgdG8gYmFzZSBhZGRyZXNzKQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQmxvY2sgRkYxODogRUFFCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBFQUUgKEV4dGVuZGVkIEFyaXRobWV0aWMgRWxlbWVudCkgcmVnaXN0ZXJzOgorLy8KKyNkZWZpbmUgSU9fRUFFX09QRVJBTkRfMCAgIAkweEZGMTgKKyNkZWZpbmUgSU9fRUFFX09QRVJBTkRfMSAgIAkweEZGMTkKKyNkZWZpbmUgSU9fRUFFX1JFU1VMVF9MTyAgIAkweEZGMUEKKyNkZWZpbmUgSU9fRUFFX1JFU1VMVF9ISSAgIAkweEZGMUIKKyNkZWZpbmUgSU9fRUFFX0NTUiAgICAgICAgIAkweEZGMUMgLy8gQ29tbWFuZCBhbmQgU3RhdHVzIFJlZ2lzdGVyCisvLworLy8gIEVBRS1PcGNvZGVzIChDU1IpOiAgIDB4MDAwMCAgTVVMVSAgMzItYml0IHJlc3VsdCBpbiBMTyBISQorLy8gICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgTVVMUyAgMzItYml0IHJlc3VsdCBpbiBMTyBISQorLy8gICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgRElWVSAgcmVzdWx0IGluIExPLCBtb2R1bG8gaW4gSEkKKy8vICAgICAgICAgICAgICAgICAgICAgICAweDAwMDMgIERJVlMgIHJlc3VsdCBpbiBMTywgbW9kdWxvIGluIEhJCisvLyAgQml0IDE1IG9mIENTUiBpcyB0aGUgYnVzeSBiaXQuIElmIGl0IGlzIHNldCwgdGhlIEVBRSBpcyBzdGlsbCBidXN5IGNydW5jaGluZyBudW1iZXJzLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQmxvY2sgRkYyMDogU0QgQ0FSRAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgU0QgQ0FSRCBJTlRFUkZBQ0UgcmVnaXN0ZXJzCisvLworI2RlZmluZSBJT19TRF9CQVNFX0FERFJFU1MgCTB4RkYyMAorI2RlZmluZSBJT19TRF9BRERSX0xPICAJMHhGRjIwIC8vIGxvdyB3b3JkIG9mIDMyYml0IGxpbmVhciBTRCBjYXJkIGJsb2NrIGFkZHJlc3MKKyNkZWZpbmUgSU9fU0RfQUREUl9ISSAgCTB4RkYyMSAvLyBoaWdoIHdvcmQgb2YgMzJiaXQgbGluZWFyIFNEIGNhcmQgYmxvY2sgYWRkcmVzcworI2RlZmluZSBJT19TRF9EQVRBX1BPUyAJMHhGRjIyIC8vICJDdXJzb3IiIHRvIG5hdmlnYXRlIHRoZSA1MTItYnl0ZSBkYXRhIGJ1ZmZlcgorI2RlZmluZSBJT19TRF9EQVRBICAgICAJMHhGRjIzIC8vIHJlYWQvd3JpdGUgMSBieXRlIGZyb20vdG8gdGhlIDUxMi1ieXRlIGRhdGEgYnVmZmVyCisjZGVmaW5lIElPX1NEX0VSUk9SICAgIAkweEZGMjQgLy8gZXJyb3IgY29kZSBvZiBsYXN0IG9wZXJhdGlvbiAocmVhZCBvbmx5KQorI2RlZmluZSBJT19TRF9DU1IgICAgICAJMHhGRjI1IC8vIENvbW1hbmQgYW5kIFN0YXR1cyBSZWdpc3RlciAod3JpdGUgdG8gZXhlY3V0ZSBjb21tYW5kKQorLy8KKy8vICBTRC1PcGNvZGVzIChDU1IpOiAgICAweDAwMDAgIFJlc2V0IFNEIGNhcmQKKy8vICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIFJlYWQgNTEyIGJ5dGVzIGZyb20gdGhlIGxpbmVhciBibG9jayBhZGRyZXNzCisvLyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICBXcml0ZSA1MTIgYnl0ZXMgdG8gdGhlIGxpbmVhciBibG9jayBhZGRyZXNzCisvLyAgQml0cyAwIC4uIDIgYXJlIHdyaXRlLW9ubHkgKHJlYWRpbmcgYWx3YXlzIHJldHVybnMgMCkKKy8vICBCaXRzIDEzIC4uIDEyIHJldHVybiB0aGUgY2FyZCB0eXBlOiAwMCA9IG5vIGNhcmQgLyB1bmtub3duIGNhcmQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMSA9IFNEIFYxCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgPSBTRCBWMgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExID0gU0RIQyAgICAgICAgICAgICAgICAgICAgICAgCisvLyAgQml0IDE0IG9mIHRoZSBDU1IgaXMgdGhlIGVycm9yIGJpdDogMSwgaWYgdGhlIGxhc3Qgb3BlcmF0aW9uIGZhaWxlZC4gSW4gc3VjaAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgY2FzZSwgdGhlIGVycm9yIGNvZGUgaXMgaW4gSU9fU0RfRVJST1IgYW5kCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW91IG5lZWQgdG8gcmVzZXQgdGhlIGNvbnRyb2xsZXIgdG8gZ28gb24KKy8vICBCaXQgMTUgb2YgdGhlIENTUiBpcyB0aGUgYnVzeSBiaXQ6IDEsIGlmIGN1cnJlbnQgb3BlcmF0aW9uIGlzIHN0aWxsIHJ1bm5pbmcKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEJsb2NrIEZGMjg6IFRJTUVSIDAgYW5kIDEKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIEludGVycnVwdCB0aW1lcjogVGhlcmUgYXJlIHR3byB0aW1lcnMgY2FwYWJsZSBvZiBnZW5lcmF0aW5nIGludGVycnVwdHMuCisvLyAgICAgICAgICAgICAgICAgICBFYWNoIHRpbWVyIGlzIGNvbnRyb2xsZWQgYnkgdGhyZWUgMTYgYml0IHJlZ2lzdGVyczoKKy8vCisvLyAgSU9fVElNRVJfeF9QUkU6IFRoZSAxMDAga0h6IHRpbWVyIGNsb2NrIGlzIGRpdmlkZWQgYnkgdGhlIHZhbHVlIHN0b3JlZCBpbgorLy8gICAgICAgICAgICAgICAgICB0aGlzIGRldmljZSByZWdpc3Rlci4gMTAwICh3aGljaCBjb3JyZXNwb25kcyB0byAweDAwNjQgaW4KKy8vICAgICAgICAgICAgICAgICAgdGhlIHByZXNjYWxlciByZWdpc3RlcikgeWllbGRzIGEgMSBtaWxsaXNlY29uZCBwdWxzZSB3aGljaAorLy8gICAgICAgICAgICAgICAgICBpbiB0dXJuIGlzIGZlZCB0byB0aGUgYWN0dWFsIGNvdW50ZXIuCisvLyAgSU9fVElNRVJfeF9DTlQ6IFdoZW4gdGhlIG51bWJlciBvZiBvdXRwdXQgcHVsc2VzIGZyb20gdGhlIHByZXNjYWxlciBjaXJjdWl0IAorLy8gICAgICAgICAgICAgICAgICBlcXVhbHMgdGhlIG51bWJlciBzdG9yZWQgaW4gdGhpcyByZWdpc3RlciwgYW4gaW50ZXJydXB0IHdpbGwKKy8vICAgICAgICAgICAgICAgICAgYmUgZ2VuZXJhdGVkIChpZiB0aGUgaW50ZXJydXB0IGFkZHJlc3MgaXMgMHgwMDAwLCB0aGUKKy8vICAgICAgICAgICAgICAgICAgaW50ZXJydXB0IHdpbGwgYmUgc3VwcHJlc3NlZCkuCisvLyAgSU9fVElNRVJfeF9JTlQ6IFRoaXMgcmVnaXN0ZXIgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGRlc2lyZWQgaW50ZXJydXB0IAorLy8gICAgICAgICAgICAgICAgICBzZXJ2aWNlIHJvdXRpbmUuCisvLworI2RlZmluZSBJT19USU1FUl9CQVNFX0FERFJFU1MgIAkweEZGMjgKKyNkZWZpbmUgSU9fVElNRVJfMF9QUkUgCTB4RkYyOAorI2RlZmluZSBJT19USU1FUl8wX0NOVCAJMHhGRjI5CisjZGVmaW5lIElPX1RJTUVSXzBfSU5UIAkweEZGMkEKKyNkZWZpbmUgSU9fVElNRVJfMV9QUkUgCTB4RkYyQgorI2RlZmluZSBJT19USU1FUl8xX0NOVCAJMHhGRjJDCisjZGVmaW5lIElPX1RJTUVSXzFfSU5UIAkweEZGMkQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEJsb2NrIEZGMzA6IFZHQSAoZG91YmxlIGJsb2NrLCAxNiByZWdpc3RlcnMpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKyNkZWZpbmUgVkdBX1NUQVRFICAgICAgICAgIAkweEZGMzAgLy8gVkdBIHN0YXR1cyByZWdpc3RlcgorICAgIC8vIEJpdHMgMTEtMTA6IEhhcmR3YXJlIHNjcm9sbGluZyAvIG9mZnNldCBlbmFibGU6IEJpdCAjMTAgZW5hYmxlcyB0aGUgdXNlCisgICAgLy8gICAgICAgICAgICAgb2YgdGhlIG9mZnNldCByZWdpc3RlciAjNCAoZGlzcGxheSBvZmZzZXQpIGFuZCBiaXQgIzExCisgICAgLy8gICAgICAgICAgICAgZW5hYmxlcyB0aGUgdXNlIG9mIHJlZ2lzdGVyICM1IChyZWFkL3dyaXRlIG9mZnNldCkuCisgICAgLy8gQml0ICAgICAgOTogQnVzeTogVkdBIGlzIGN1cnJlbnRseSBidXN5LCBlLmcuIGNsZWFyaW5nIHRoZSBzY3JlZW4sCisgICAgLy8gICAgICAgICAgICAgcHJpbnRpbmcsIGV0Yy4gV2hpbGUgYnVzeSwgY29tbWFuZHMgd2lsbCBiZSBpZ25vcmVkLCBidXQKKyAgICAvLyAgICAgICAgICAgICB0aGV5IGNhbiBzdGlsbCBiZSB3cml0dGVuIGludG8gdGhlIHJlZ2lzdGVycywgdGhvdWdoCisgICAgLy8gQml0ICAgICAgODogU2V0IGJpdCB0byBjbGVhciBzY3JlZW4uIFJlYWQgYml0IHRvIGZpbmQgb3V0LCBpZiBjbGVhcgorICAgIC8vICAgICAgICAgICAgIHNjcmVlbiBpcyBzdGlsbCBhY3RpdmUKKyAgICAvLyBCaXQgICAgICA3OiBWR0EgZW5hYmxlICgxID0gb247IDA6IG5vIFZHQSBzaWduYWwgaXMgZ2VuZXJhdGVkKQorICAgIC8vIEJpdCAgICAgIDY6IEhhcmR3YXJlIGN1cnNvciBlbmFibGUKKyAgICAvLyBCaXQgICAgICA1OiBIYXJkd2FyZSBjdXJzb3IgYmxpbmsgZW5hYmxlCisgICAgLy8gQml0ICAgICAgNDogSGFyZHdhcmUgY3Vyc29yIG1vZGU6IDEgLSBzbWFsbAorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gbGFyZ2UKKyAgICAvLyBCaXRzICAgMi0wOiBPdXRwdXQgY29sb3IgZm9yIHRoZSB3aG9sZSBzY3JlZW4sIGJpdHMgKDIsIDEsIDApID0gUkdCCisjZGVmaW5lIFZHQV9DUl9YICAgICAgICAgICAJMHhGRjMxIC8vIFZHQSBjdXJzb3IgWCBwb3NpdGlvbgorI2RlZmluZSBWR0FfQ1JfWSAgICAgICAgICAgCTB4RkYzMiAvLyBWR0EgY3Vyc29yIFkgcG9zaXRpb24KKyNkZWZpbmUgVkdBX0NIQVIgICAgICAgICAgIAkweEZGMzMgLy8gd3JpdGU6IFZHQSBjaGFyYWN0ZXIgdG8gYmUgZGlzcGxheWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWQ6IGNoYXJhY3RlciAidW5kZXIiIHRoZSBjdXJzb3IKKyNkZWZpbmUgVkdBX09GRlNfRElTUExBWSAgIAkweEZGMzQgLy8gT2Zmc2V0IGluIGJ5dGVzIHRoYXQgaXMgdXNlZCB3aGVuIGRpc3BsYXlpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHZpZGVvIFJBTS4gU2Nyb2xsaW5nIGZvcndhcmQgb25lIGxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVhbnMgYWRkaW5nIDB4NTAgdG8gdGhpcyByZWdpc3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSB3b3JrcywgaWYgYml0ICMxMCBpbiBWR0FfU1RBVEUgaXMgc2V0LgorI2RlZmluZSBWR0FfT0ZGU19SVyAgICAgICAgCTB4RkYzNSAvLyBPZmZzZXQgaW4gYnl0ZXMgdGhhdCBpcyB1c2VkLCB3aGVuIHlvdSByZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHdyaXRlIHRvIHRoZSB2aWRlbyBSQU0gdXNpbmcgVkdBX0NIQVIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmtzIGluZGVwZW5kZW50bHkgZnJvbSBWR0FfT0ZGU19ESVNQTEFZLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3RpdmUsIHdoZW4gYml0ICMxMSBpbiBWR0FfU1RBVEUgaXMgc2V0LgorI2RlZmluZSBWR0FfSERNSV9IX01JTiAgICAgCTB4RkYzNiAvLyBIRE1JIERhdGEgRW5hYmxlOiBYOiBtaW5pbXVtIHZhbGlkIGNvbHVtbgorI2RlZmluZSBWR0FfSERNSV9IX01BWCAgICAgCTB4RkYzNyAvLyBIRE1JIERhdGEgRW5hYmxlOiBYOiBtYXhpbXVtIHZhbGlkIGNvbHVtbgorI2RlZmluZSBWR0FfSERNSV9WX01BWCAgICAgCTB4RkYzOCAvLyBIRE1JIERhdGEgRW5hYmxlOiBZOiBtYXhpbXVtIHJvdyAobGluZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgQmxvY2sgRkZGMDogTUVHQTY1IChkb3VibGUgYmxvY2ssIDE2IHJlZ2lzdGVycykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIEh5cGVyUkFNCisvLworI2RlZmluZSBJT19NNjVIUkFNX0xPICAgICAgCTB4RkZGMCAvLyBMb3cgd29yZCBvZiBhZGRyZXNzICAoMTUgZG93bnRvIDApCisjZGVmaW5lIElPX002NUhSQU1fSEkgICAgICAJMHhGRkYxIC8vIEhpZ2ggd29yZCBvZiBhZGRyZXNzICgyNiBkb3dudG8gMTYpCisjZGVmaW5lIElPX002NUhSQU1fREFUQTggICAJMHhGRkYyIC8vIEh5cGVyUkFNIG5hdGl2ZSA4LWJpdCBkYXRhIGluL291dAorI2RlZmluZSBJT19NNjVIUkFNX0RBVEExNiAgCTB4RkZGMyAvLyBIeXBlclJBTSAxNi1iaXQgZGF0YSBpbi9vdXQKKworLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyogQ29uc3RhbnQgZGVmaW5pdGlvbnMKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworCisvLyA9PT09PT09PT09IFZHQSA9PT09PT09PT09CisKKyNkZWZpbmUgVkdBX01BWF9YICAgICAgICAgICAgICAJNzkgICAgICAgICAgICAgICAgICAgICAgLy8gTWF4LiBYLWNvb3JkaW5hdGUgaW4gZGVjaW1hbCEKKyNkZWZpbmUgVkdBX01BWF9ZICAgICAgICAgICAgICAJMzkgICAgICAgICAgICAgICAgICAgICAgLy8gTWF4LiBZLWNvb3JkaW5hdGUgaW4gZGVjaW1hbCEKKyNkZWZpbmUgVkdBX01BWF9DSEFSUyAgICAgICAgICAJMzIwMCAgICAgICAgICAgICAgICAgICAgLy8gODAgKiA0MCBjaGFycworI2RlZmluZSBWR0FfQ0hBUlNfUEVSX0xJTkUgICAgIAk4MCAgCisKKyNkZWZpbmUgVkdBX0VOX0hXX0NVUlNPUiAgICAgICAJMHgwMDQwICAgICAgICAgICAgICAgICAgLy8gU2hvdyBoYXJkd2FyZSBjdXJzb3IKKyNkZWZpbmUgVkdBX0VOX0hXX1NDUkwgICAgICAgICAJMHgwQzAwICAgICAgICAgICAgICAgICAgLy8gSGFyZHdhcmUgc2Nyb2xsaW5nIGVuYWJsZQorI2RlZmluZSBWR0FfQ0xSX1NDUk4gICAgICAgICAgIAkweDAxMDAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBzY3JlZW4KKyNkZWZpbmUgVkdBX0JVU1kgICAgICAgICAgICAgICAJMHgwMjAwICAgICAgICAgICAgICAgICAgLy8gVkdBIGlzIGN1cnJlbnRseSBwZXJmb3JtaW5nIGEgdGFzaworCisjZGVmaW5lIFZHQV9DT0xPUl9SRUQgICAgICAgICAgCTB4MDAwNAorI2RlZmluZSBWR0FfQ09MT1JfR1JFRU4gICAgICAgIAkweDAwMDIKKyNkZWZpbmUgVkdBX0NPTE9SX0JMVUUgICAgICAgICAJMHgwMDAxCisjZGVmaW5lIFZHQV9DT0xPUl9XSElURSAgICAgICAgCTB4MDAwNworCisvLyA9PT09PT09PT09IENZQ0xFIENPVU5URVIgPT09PT09PT09PQorCisjZGVmaW5lIENZQ19SRVNFVCAgICAgICAgICAgICAgCTB4MDAwMSAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGN5Y2xlIGNvdW50ZXIKKyNkZWZpbmUgQ1lDX1JVTiAgICAgICAgICAgICAgICAJMHgwMDAyICAgICAgICAgICAgICAgICAgLy8gU3RhcnQvc3RvcCBjb3VudGVyCisKKy8vID09PT09PT09PT0gQ1lDTEUgQ09VTlRFUiA9PT09PT09PT09CisKKyNkZWZpbmUgSU5TX1JFU0VUICAgICAgICAgICAgICAJMHgwMDAxICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgaW5zdHJ1Y3Rpb24gY291bnRlcgorI2RlZmluZSBJTlNfUlVOICAgICAgICAgICAgICAgIAkweDAwMDIgICAgICAgICAgICAgICAgICAvLyBTdGFydC9zdG9wIGNvdW50ZXIKKworLy8gPT09PT09PT09PSBFQUUgPT09PT09PT09PQorCisjZGVmaW5lIEVBRV9NVUxVICAgICAgICAgICAgICAgCTB4MDAwMCAgICAgICAgICAgICAgICAgIC8vIFVuc2lnbmVkIDE2IGJpdCBtdWx0aXBsaWNhdGlvbgorI2RlZmluZSBFQUVfTVVMUyAgICAgICAgICAgICAgIAkweDAwMDEgICAgICAgICAgICAgICAgICAvLyBTaWduZWQgMTYgYml0IG11bHRpcGxpY2F0aW9uCisjZGVmaW5lIEVBRV9ESVZVICAgICAgICAgICAgICAgCTB4MDAwMiAgICAgICAgICAgICAgICAgIC8vIFVuc2lnbmVkIDE2IGJpdCBkaXZpc2lvbiB3aXRoIHJlbWFpbmRlcgorI2RlZmluZSBFQUVfRElWUyAgICAgICAgICAgICAgIAkweDAwMDMgICAgICAgICAgICAgICAgICAvLyBTaWduZWQgMTYgYml0IGRpdmlzaW9uIHdpdGggcmVtYWluZGVyCisjZGVmaW5lIEVBRV9CVVNZICAgICAgICAgICAgICAgCTB4ODAwMCAgICAgICAgICAgICAgICAgIC8vIEJ1c3kgZmxhZyAoMSA9IG9wZXJhdGlvbiBzdGlsbCBydW5uaW5nKQorCisvLyA9PT09PT09PT09IFNEIENBUkQgPT09PT09PT09PQorCisjZGVmaW5lIFNEX0NNRF9SRVNFVCAgICAgICAgICAgCTB4MDAwMCAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IFNEIGNhcmQKKyNkZWZpbmUgU0RfQ01EX1JFQUQgICAgICAgICAgICAJMHgwMDAxICAgICAgICAgICAgICAgICAgLy8gUmVhZCA1MTIgYnl0ZXMgZnJvbSBTRCB0byBpbnRlcm5hbCBidWZmZXIKKyNkZWZpbmUgU0RfQ01EX1dSSVRFICAgICAgICAgICAJMHgwMDAyICAgICAgICAgICAgICAgICAgLy8gV3JpdGUgNTEyIGJ5dGVzIGZyb20gaW50LiBidWYuIHRvIFNECisjZGVmaW5lIFNEX0JJVF9FUlJPUiAgICAgICAgICAgCTB4NDAwMCAgICAgICAgICAgICAgICAgIC8vIEVycm9yIGZsYWc6IDEsIGlmIGxhc3Qgb3BlcmF0aW9uIGZhaWxlZAorI2RlZmluZSBTRF9CSVRfQlVTWSAgICAgICAgICAgIAkweDgwMDAgICAgICAgICAgICAgICAgICAvLyBCdXN5IGZsYWc6IDEsIGlmIGN1cnJlbnQgb3AuIGlzIHN0aWxsIHJ1bm5pbmcKKyNkZWZpbmUgU0RfVElNRU9VVF9NSUQgICAgICAgICAJMHgwNDc5ICAgICAgICAgICAgICAgICAgLy8gZXF1YWxzIH43NS4wMDAuMDAwIGN5Y2xlcywgaS5lLiAxLjVzZWMgQCA1MCBNSHoKKworI2RlZmluZSBTRF9FUlJfTUFTSyAgICAgICAgICAgIAkweDAwRkYgICAgICAgICAgICAgICAgICAvLyBBTkQgbWFzayBmb3IgZXJyb3JzOiBISSBieXRlID0gc3RhdGUgbWFjaGluZSBpbmZvLCBzbyBtYXNrIGl0IGZvciBlcnJvciBjaGVja3MgCisjZGVmaW5lIFNEX0VSUl9SMV9FUlJPUiAgICAgICAgCTB4MDAwMSAgICAgICAgICAgICAgICAgIC8vIFNEIENhcmQgUjEgZXJyb3IgKFIxIGJpdCA2LTApCisjZGVmaW5lIFNEX0VSUl9DUkNfT1JfVElNRU9VVCAgCTB4MDAwMiAgICAgICAgICAgICAgICAgIC8vIFJlYWQgQ1JDIGVycm9yIG9yIFdyaXRlIFRpbWVvdXQgZXJyb3IKKyNkZWZpbmUgU0RfRVJSX1JFU1BPTlNFX1RPS0VOICAJMHgwMDAzICAgICAgICAgICAgICAgICAgLy8gRGF0YSBSZXNwb25zZSBUb2tlbiBlcnJvciAoVG9rZW4gYml0IDMpCisjZGVmaW5lIFNEX0VSUl9FUlJPUl9UT0tFTiAgICAgCTB4MDAwNCAgICAgICAgICAgICAgICAgIC8vIERhdGEgRXJyb3IgVG9rZW4gZXJyb3IgKFRva2VuIGJpdCAzLTApCisjZGVmaW5lIFNEX0VSUl9XUklURV9QUk9URUNUICAgCTB4MDAwNSAgICAgICAgICAgICAgICAgIC8vIFNEIENhcmQgV3JpdGUgUHJvdGVjdCBzd2l0Y2gKKyNkZWZpbmUgU0RfRVJSX0NBUkRfVU5VU0FCTEUgICAJMHgwMDA2ICAgICAgICAgICAgICAgICAgLy8gVW51c2FibGUgU0QgY2FyZAorI2RlZmluZSBTRF9FUlJfTk9fQ0FSRCAgICAgICAgIAkweDAwMDcgICAgICAgICAgICAgICAgICAvLyBObyBTRCBjYXJkIChubyByZXNwb25zZSBmcm9tIENNRDApCisjZGVmaW5lIFNEX0VSUl9SRUFEX1RJTUVPVVQgICAgCTB4MDAwOCAgICAgICAgICAgICAgICAgIC8vIFRpbWVvdXQgd2hpbGUgdHJ5aW5nIHRvIHJlY2VpdmUgdGhlIHJlYWQgc3RhcnQgdG9rZW4gIkZFIgorI2RlZmluZSBTRF9FUlJfVElNRU9VVCAgICAgICAgIAkweEVFRkYgICAgICAgICAgICAgICAgICAvLyBHZW5lcmFsIHRpbWVvdXQKKworI2RlZmluZSBTRF9DVF9TRF9WMSAgICAgICAgICAgIAkweDAwMDEgICAgICAgICAgICAgICAgICAvLyBDYXJkIHR5cGU6IFNEIFZlcnNpb24gMQorI2RlZmluZSBTRF9DVF9TRF9WMiAgICAgICAgICAgIAkweDAwMDIgICAgICAgICAgICAgICAgICAvLyBDYXJkIHR5cGU6IFNEIFZlcnNpb24gMgorI2RlZmluZSBTRF9DVF9TREhDICAgICAgICAgICAgIAkweDAwMDMgICAgICAgICAgICAgICAgICAvLyBDYXJkIHR5cGU6IFNESEMgKG9yIFNEWEMpCisKKy8vID09PT09PT09PT0gRkFUMzIgPT09PT09PT09PT09PQorCisvLyBGQVQzMiBFUlJPUiBDT0RFUworCisjZGVmaW5lIEZBVDMyX0VSUl9NQlIgICAgICAgICAgCTB4RUUxMCAgICAgICAgICAgICAgICAgIC8vIG5vIG9yIGlsbGVnYWwgTWFzdGVyIEJvb3QgUmVjb3JkIChNQlIpIGZvdW5kCisjZGVmaW5lIEZBVDMyX0VSUl9QQVJUSVRJT05fTk8gCTB4RUUxMSAgICAgICAgICAgICAgICAgIC8vIHRoZSBwYXJ0aXRpb24gbnVtYmVyIG5lZWRzIHRvIGJlIGluIHRoZSByYW5nZSAxIC4uIDQKKyNkZWZpbmUgRkFUMzJfRVJSX1BBUlRUQkwgICAgICAJMHhFRTEyICAgICAgICAgICAgICAgICAgLy8gbm8gb3IgaWxsZWdhbCBwYXJ0aXRpb24gdGFibGUgZW50cnkgZm91bmQgKGUuZy4gbm8gRkFUMzIgcGFydGl0aW9uKQorI2RlZmluZSBGQVQzMl9FUlJfTk9USU1QTCAgICAgIAkweEVFMTMgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBpbXBsZW1lbnRlZAorI2RlZmluZSBGQVQzMl9FUlJfU0laRSAgICAgICAgIAkweEVFMTQgICAgICAgICAgICAgICAgICAvLyBwYXJ0aXRpb24gc2l6ZSBvciB2b2x1bWUgc2l6ZSB0b28gbGFyZ2UgKHNlZSBkb2MvY29uc3RyYWludHMudHh0KQorI2RlZmluZSBGQVQzMl9FUlJfTk9GQVQzMiAgICAgIAkweEVFMTUgICAgICAgICAgICAgICAgICAvLyBpbGxlZ2FsIHZvbHVtZSBpZCAoZWl0aGVyIG5vdCA1MTIgYnl0ZXMgcGVyIHNlY3Rvciwgb3Igbm90IDIgRkFUcyBvciB3cm9uZyBtYWdpYykKKyNkZWZpbmUgRkFUMzJfRVJSX0lMTEVHQUxfU0lDICAJMHhFRTE2ICAgICAgICAgICAgICAgICAgLy8gdHJ5aW5nIHRvIHJlYWQvd3JpdGUgYSBzZWN0b3Igd2l0aGluIGEgY2x1c3RlciB0aGF0IGlzIG91dCBvZiByYW5nZQorI2RlZmluZSBGQVQzMl9FUlJfSUxMRUdBTF9DTFVTIAkweEVFMTcgICAgICAgICAgICAgICAgICAvLyB0cnlpbmcgdG8gYWNjZXNzIGFuIGlsbGVnYWwgY2x1c3RlciBudW1iZXIKKyNkZWZpbmUgRkFUMzJfRVJSX0NPUlJVUFRfREggICAJMHhFRTE4ICAgICAgICAgICAgICAgICAgLy8gY29ycnVwdCBkaXJlY3RvcnkgaGFuZGxlIChlLmcuIGJlY2F1c2UgY3VycmVudCB0by1iZS1yZWFkIG9mZnMgPiBzZWN0b3Igc2l6ZSkKKyNkZWZpbmUgRkFUMzJfRVJSX0RJUk5PVEZPVU5EICAJMHhFRTE5ICAgICAgICAgICAgICAgICAgLy8gZGlyZWN0b3J5IG5vdCBmb3VuZCAoaWxsZWdhbCBwYXRoIG5hbWUgcGFzc2VkIHRvIGNoYW5nZSBkaXJlY3RvcnkgY29tbWFuZCkKKyNkZWZpbmUgRkFUMzJfRVJSX0ZJTEVOT1RGT1VORCAJMHhFRTIwICAgICAgICAgICAgICAgICAgLy8gZmlsZSBub3QgZm91bmQKKyNkZWZpbmUgRkFUMjNfRVJSX1NFRUtUT09MQVJHRSAJMHhFRTIxICAgICAgICAgICAgICAgICAgLy8gc2VlayBwb3NpdGlvbiA+IGZpbGUgc2l6ZQorCisvLyBGQVQzMiBTVEFUVVMgQ09ERVMKKworI2RlZmluZSBGQVQzMl9FT0YgICAgICAgICAgICAgIAkweEVFRUUgICAgICAgICAgICAgICAgICAvLyBlbmQgb2YgZmlsZSByZWFjaGVkCisKKy8vIExBWU9VVCBPRiBUSEUgTU9VTlQgREFUQSBTVFJVQ1RVUkUgKERFVklDRSBIQU5ETEUpCisKKyNkZWZpbmUgRkFUMzJfREVWX1JFU0VUICAgICAgICAJMHgwMDAwICAgICAgICAgICAgICAgICAgLy8gcG9pbnRlciB0byBkZXZpY2UgcmVzZXQgZnVuY3Rpb24KKyNkZWZpbmUgRkFUMzJfREVWX0JMT0NLX1JFQUQgICAJMHgwMDAxICAgICAgICAgICAgICAgICAgLy8gcG9pbnRlciB0byA1MTItYnl0ZSBibG9jayByZWFkIGZ1bmN0aW9uCisjZGVmaW5lIEZBVDMyX0RFVl9CTE9DS19XUklURSAgCTB4MDAwMiAgICAgICAgICAgICAgICAgIC8vIHBvaW50ZXIgdG8gNTEyLWJ5dGUgYmxvY2sgd3JpdGUgZnVuY3Rpb24KKyNkZWZpbmUgRkFUMzJfREVWX0JZVEVfUkVBRCAgICAJMHgwMDAzICAgICAgICAgICAgICAgICAgLy8gcG9pbnRlciB0byAxLWJ5dGUgcmVhZCBmdW5jdGlvbiAod2l0aGluIGJsb2NrIGJ1ZmZlcikKKyNkZWZpbmUgRkFUMzJfREVWX0JZVEVfV1JJVEUgICAJMHgwMDA0ICAgICAgICAgICAgICAgICAgLy8gcG9pbnRlciB0byAxLWJ5dGUgd3JpdGUgZnVuY3Rpb24gKHdpdGhpbiBibG9jayBidWZmZXIpCisjZGVmaW5lIEZBVDMyX0RFVl9QQVJUSVRJT04gICAgCTB4MDAwNSAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBwYXJ0aXRpb24gdG8gYmUgbW91bnRlZAorI2RlZmluZSBGQVQzMl9ERVZfRlNfTE8gICAgICAgIAkweDAwMDYgICAgICAgICAgICAgICAgICAvLyBmaWxlIHN5c3RlbSBzdGFydCBhZGRyZXNzIChMQkEpOiBsb3cgd29yZAorI2RlZmluZSBGQVQzMl9ERVZfRlNfSEkgICAgICAgIAkweDAwMDcgICAgICAgICAgICAgICAgICAvLyBmaWxlIHN5c3RlbSBzdGFydCBhZGRyZXNzIChMQkEpOiBoaWdoIHdvcmQKKyNkZWZpbmUgRkFUMzJfREVWX0ZBVF9MTyAgICAgICAJMHgwMDA4ICAgICAgICAgICAgICAgICAgLy8gZmF0IHN0YXJ0IGFkZHJlc3MgKExCQSk6IGxvdyB3b3JkCisjZGVmaW5lIEZBVDMyX0RFVl9GQVRfSEkgICAgICAgCTB4MDAwOSAgICAgICAgICAgICAgICAgIC8vIGZhdCBzdGFydCBhZGRyZXNzIChMQkEpOiBoaWdoIHdvcmQKKyNkZWZpbmUgRkFUMzJfREVWX0NMVVNURVJfTE8gICAJMHgwMDBBICAgICAgICAgICAgICAgICAgLy8gY2x1c3RlciBzdGFydCBhZGRyZXNzIChMQkEpOiBsb3cgd29yZAorI2RlZmluZSBGQVQzMl9ERVZfQ0xVU1RFUl9ISSAgIAkweDAwMEIgICAgICAgICAgICAgICAgICAvLyBjbHVzdGVyIHN0YXJ0IGFkZHJlc3MgKExCQSk6IGhpZ2ggd29yZAorI2RlZmluZSBGQVQzMl9ERVZfU0VDVF9QRVJfQ0xVUwkweDAwMEMgICAgICAgICAgICAgICAgICAvLyBzZWN0b3JzIHBlciBjbHVzdGVyCisjZGVmaW5lIEZBVDMyX0RFVl9SRF8xU1RDTFVTX0xPCTB4MDAwRCAgICAgICAgICAgICAgICAgIC8vIHJvb3QgZGlyZWN0b3J5IGZpcnN0IGNsdXN0ZXI6IGxvdyB3b3JkCisjZGVmaW5lIEZBVDMyX0RFVl9SRF8xU1RDTFVTX0hJCTB4MDAwRSAgICAgICAgICAgICAgICAgIC8vIHJvb3QgZGlyZWN0b3J5IGZpcnN0IGNsdXN0ZXI6IGhpZ2ggd29yZAorI2RlZmluZSBGQVQzMl9ERVZfQURfMVNUQ0xVU19MTwkweDAwMEYgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50bHkgYWN0aXZlIGRpcmVjdG9yeSBmaXJzdCBjbHVzdGVyOiBsb3cgd29yZAorI2RlZmluZSBGQVQzMl9ERVZfQURfMVNUQ0xVU19ISQkweDAwMTAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50bHkgYWN0aXZlIGRpcmVjdG9yeSBmaXJzdCBjbHVzdGVyOiBoaWdoIHdvcmQKKyNkZWZpbmUgRkFUMzJfREVWX0JVRkZFUkVEX0ZESCAJMHgwMDExICAgICAgICAgICAgICAgICAgLy8gRkRIIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgY3VycmVudCA1MTIgYnl0ZSBoYXJkd2FyZSBidWZmZXIgZmlsbGluZworCisjZGVmaW5lIEZBVDMyX0RFVl9TVFJVQ1RfU0laRSAgCTB4MDAxMiAgICAgICAgICAgICAgICAgIC8vIHNpemUgKHdvcmRzKSBvZiB0aGUgbW91bnQgZGF0YSBzdHJ1Y3R1cmUgKGRldmljZSBoYW5kbGUpCisKKy8vIExBWU9VVCBPRiBUSEUgRklMRSBIQU5ETEUgQU5EIERJUkVDVE9SWSBIQU5ETEUgKEZESCkKKworI2RlZmluZSBGQVQzMl9GREhfREVWSUNFICAgICAgIAkweDAwMDAgICAgICAgICAgICAgICAgICAvLyBwb2ludGVyIHRvIHRoZSBkZXZpY2UgaGFuZGxlCisjZGVmaW5lIEZBVDMyX0ZESF9DTFVTVEVSX0xPICAgCTB4MDAwMSAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgY2x1c3RlciAobG93IHdvcmQpCisjZGVmaW5lIEZBVDMyX0ZESF9DTFVTVEVSX0hJICAgCTB4MDAwMiAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgY2x1c3RlciAoaGlnaCB3b3JkKQorI2RlZmluZSBGQVQzMl9GREhfU0VDVE9SICAgICAgIAkweDAwMDMgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHNlY3RvcgorI2RlZmluZSBGQVQzMl9GREhfSU5ERVggICAgICAgIAkweDAwMDQgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGJ5dGUgaW5kZXggd2l0aGluIGN1cnJlbnQgc2VjdG9yCisjZGVmaW5lIEZBVDMyX0ZESF9TSVpFX0xPICAgICAgCTB4MDAwNSAgICAgICAgICAgICAgICAgIC8vIG9ubHkgaW4gY2FzZSBGREggaXMgYSBmaWxlOiBsb3cgd29yZCBvZiBmaWxlIHNpemUsIG90aGVyd2lzZSB1bmRlZmluZWQKKyNkZWZpbmUgRkFUMzJfRkRIX1NJWkVfSEkgICAgICAJMHgwMDA2ICAgICAgICAgICAgICAgICAgLy8gb25seSBpbiBjYXNlIEZESCBpcyBhIGZpbGU6IGhpZ2ggd29yZCBvZiBmaWxlIHNpemUsIG90aGVyd2lzZSB1bmRlZmluZWQKKyNkZWZpbmUgRkFUMzJfRkRIX1JFQURfTE8gICAgICAJMHgwMDA3ICAgICAgICAgICAgICAgICAgLy8gb25seSBpbiBjYXNlIEZESCBpcyBhIGZpbGU6IGxvdyB3b3JkIG9mIGFscmVhZHkgcmVhZCBhbW91bnQgb2YgYnl0ZXMKKyNkZWZpbmUgRkFUMzJfRkRIX1JFQURfSEkgICAgICAJMHgwMDA4ICAgICAgICAgICAgICAgICAgLy8gb25seSBpbiBjYXNlIEZESCBpcyBhIGZpbGU6IGhpZ2ggd29yZCBvZiBhbHJlYWR5IHJlYWQgYW1vdW50IG9mIGJ5dGVzCisKKyNkZWZpbmUgRkFUMzJfRkRIX1NUUlVDVF9TSVpFICAJMHgwMDA5ICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBvZiB0aGUgZGlyZWN0b3J5IGhhbmRsZSBzdHJ1Y3R1cmUKKworLy8gRklMRSBBVFRSSUJVVEVTCisKKyNkZWZpbmUgRkFUMzJfRkFfUkVBRF9PTkxZICAgICAJMHgwMDAxICAgICAgICAgICAgICAgICAgLy8gcmVhZCBvbmx5IGZpbGUKKyNkZWZpbmUgRkFUMzJfRkFfSElEREVOICAgICAgICAJMHgwMDAyICAgICAgICAgICAgICAgICAgLy8gaGlkZGVuIGZpbGUKKyNkZWZpbmUgRkFUMzJfRkFfU1lTVEVNICAgICAgICAJMHgwMDA0ICAgICAgICAgICAgICAgICAgLy8gc3lzdGVtIGZpbGUKKyNkZWZpbmUgRkFUMzJfRkFfVk9MVU1FX0lEICAgICAJMHgwMDA4ICAgICAgICAgICAgICAgICAgLy8gdm9sdW1lIGlkIChuYW1lIG9mIHRoZSB2b2x1bWUpCisjZGVmaW5lIEZBVDMyX0ZBX0RJUiAgICAgICAgICAgCTB4MDAxMCAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdG9yeQorI2RlZmluZSBGQVQzMl9GQV9BUkNISVZFICAgICAgIAkweDAwMjAgICAgICAgICAgICAgICAgICAvLyBhcmNoaXZlIGZsYWcKKworI2RlZmluZSBGQVQzMl9GQV9ERUZBVUxUICAgICAgIAkweDAwMzUgICAgICAgICAgICAgICAgICAvLyBicm93c2UgZm9yIG5vbiBoaWRkZW4gZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGJ1dCBub3QgZm9yIHRoZSB2b2x1bWUgaWQKKyNkZWZpbmUgRkFUMzJfRkFfQUxMICAgICAgICAgICAJMHgwMDM3ICAgICAgICAgICAgICAgICAgLy8gYnJvd3NlIGZvciBhbGwgZmlsZXMsIGJ1dCBub3QgZm9yIHRoZSB2b2x1bWUgaWQKKworLy8gTEFZT1VUIE9GIFRIRSBESVJFQ1RPUlkgRU5UUlkgU1RSVUNUVVJFCisKKyNkZWZpbmUgRkFUMzJfREVfTkFNRSAgICAgICAgICAJMHgwMDAwICAgICAgICAgICAgICAgICAgLy8gdm9sdW1lLCBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lLCB6ZXJvIHRlcm1pbmF0ZWQgKG1heCAyNTYgY2hhcmFjdGVycykKKyNkZWZpbmUgRkFUMzJfREVfQVRUUklCICAgICAgICAJMHgwMTAxICAgICAgICAgICAgICAgICAgLy8gZmlsZSBhdHRyaWJ1dGVzIChyZWFkLW9ubHksIGhpZGRlbiwgc3lzdGVtLCB2b2x1bWUgaWQsIGRpcmVjdG9yeSwgYXJjaGl2ZSkKKyNkZWZpbmUgRkFUMzJfREVfU0laRV9MTyAgICAgICAJMHgwMTAyICAgICAgICAgICAgICAgICAgLy8gZmlsZSBzaXplOiBsb3cgd29yZAorI2RlZmluZSBGQVQzMl9ERV9TSVpFX0hJICAgICAgIAkweDAxMDMgICAgICAgICAgICAgICAgICAvLyBmaWxlIHNpemU6IGhpZ2ggd29yZAorI2RlZmluZSBGQVQzMl9ERV9ZRUFSICAgICAgICAgIAkweDAxMDQgICAgICAgICAgICAgICAgICAvLyBsYXN0IGZpbGUgd3JpdGU6IHllYXIgICAodmFsaWQgcmFuZ2UgMTk4MCAuLiAyMTA3KQorI2RlZmluZSBGQVQzMl9ERV9NT05USCAgICAgICAgIAkweDAxMDUgICAgICAgICAgICAgICAgICAvLyBsYXN0IGZpbGUgd3JpdGU6IG1vbnRoCisjZGVmaW5lIEZBVDMyX0RFX0RBWSAgICAgICAgICAgCTB4MDEwNiAgICAgICAgICAgICAgICAgIC8vIGxhc3QgZmlsZSB3cml0ZTogZGF5CisjZGVmaW5lIEZBVDMyX0RFX0hPVVIgICAgICAgICAgCTB4MDEwNyAgICAgICAgICAgICAgICAgIC8vIGxhc3QgZmlsZSB3cml0ZTogaG91cgorI2RlZmluZSBGQVQzMl9ERV9NSU5VVEUgICAgICAgIAkweDAxMDggICAgICAgICAgICAgICAgICAvLyBsYXN0IGZpbGUgd3JpdGU6IG1pbnV0ZQorI2RlZmluZSBGQVQzMl9ERV9TRUNPTkQgICAgICAgIAkweDAxMDkgICAgICAgICAgICAgICAgICAvLyBsYXN0IGZpbGUgd3JpdGU6IHNlY29uZCAoaW4gMiBzZWNvbmQgc3RlcHMsIHZhbGlkIHJhbmdlIDAgLi4gNTgpCisjZGVmaW5lIEZBVDMyX0RFX0NMVVNfTE8gICAgICAgCTB4MDEwQSAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IGNsdXN0ZXI6IGxvdyB3b3JkCisjZGVmaW5lIEZBVDMyX0RFX0NMVVNfSEkgICAgICAgCTB4MDEwQiAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IGNsdXN0ZXI6IGhpZ2ggd29yZAorCisjZGVmaW5lIEZBVDMyX0RFX1NUUlVDVF9TSVpFICAgCTB4MDEwQyAgICAgICAgICAgICAgICAgIC8vIHNpemUgKHdvcmRzKSBvZiB0aGUgZGlyZWN0b3J5IGVudHJ5IGRhdGEgc3RydWN0dXJlIG9mIHRoZQorCisvLyBESVNQTEFZIEZMQUdTIEZPUiBGSUxFIEVOVFJZIFBSRVRUWSBQUklOVEVSCisKKyNkZWZpbmUgRkFUMzJfUFJJTlRfU0hPV19ESVIgICAJMHgwMDAxICAgICAgICAgICAgICAgICAgLy8gc2hvdyAiPERJUj4iIGluZGljYXRvcgorI2RlZmluZSBGQVQzMl9QUklOVF9TSE9XX0FUVFJJQgkweDAwMDIgICAgICAgICAgICAgICAgICAvLyBzaG93IGF0dHJpYnV0ZXMgYXMgIkhSU0EiCisjZGVmaW5lIEZBVDMyX1BSSU5UX1NIT1dfU0laRSAgCTB4MDAwNCAgICAgICAgICAgICAgICAgIC8vIHNob3cgZmlsZSBzaXplCisjZGVmaW5lIEZBVDMyX1BSSU5UX1NIT1dfREFURSAgCTB4MDAwOCAgICAgICAgICAgICAgICAgIC8vIHNob3cgZmlsZSBkYXRlIGFzIFlZWVktTU0tREQKKyNkZWZpbmUgRkFUMzJfUFJJTlRfU0hPV19USU1FICAJMHgwMDEwICAgICAgICAgICAgICAgICAgLy8gc2hvdyBmaWxlIHRpbWUgYXMgSEg6TU0KKworI2RlZmluZSBGQVQzMl9QUklOVF9ERUZBVUxUICAgIAkweDAwMUQgICAgICAgICAgICAgICAgICAvLyBwcmludCA8RElSPiBpbmRpY2F0b3IsIHNpemUsIGRhdGUgYW5kIHRpbWUgKG5vIGF0dHJpYnV0ZXMpCisjZGVmaW5lIEZBVDMyX1BSSU5UX0FMTCAgICAgICAgCTB4MDAxRiAgICAgICAgICAgICAgICAgIC8vIHByaW50IGFsbCBkZXRhaWxzCisKKy8vID09PT09PT09PT0gS0VZQk9BUkQgPT09PT09PT09PQorCisvLyBTVEFUVVMgUkVHSVNURVIKKworI2RlZmluZSBLQkRfTkVXX0FTQ0lJICAgICAgICAgIAkweDAwMDEgICAgICAgICAgICAgICAgICAvLyBuZXcgYXNjaWkgY2hhcmFjdGVyIGF2YWlsYWJsZQorI2RlZmluZSBLQkRfTkVXX1NQRUNJQUwgICAgICAgIAkweDAwMDIgICAgICAgICAgICAgICAgICAvLyBuZXcgc3BlY2lhbCBrZXkgYXZhaWxhYmxlCisjZGVmaW5lIEtCRF9ORVdfQU5ZICAgICAgICAgICAgCTB4MDAwMyAgICAgICAgICAgICAgICAgIC8vIGFueSBuZXcga2V5IGF2YWlsYWJsZSAKKworI2RlZmluZSBLQkRfQVNDSUkgICAgICAgICAgICAgIAkweDAwRkYgICAgICAgICAgICAgICAgICAvLyBtYXNrIHRoZSBzcGVjaWFsIGtleXMKKyNkZWZpbmUgS0JEX1NQRUNJQUwgICAgICAgICAgICAJMHhGRjAwICAgICAgICAgICAgICAgICAgLy8gbWFzayB0aGUgYXNjaWkga2V5cworCisjZGVmaW5lIEtCRF9MT0NBTEUgICAgICAgICAgICAgCTB4MDAxQyAgICAgICAgICAgICAgICAgIC8vIGJpdCBtYXNrIGZvciBjaGVja2luZyBsb2NhbGVzCisjZGVmaW5lIEtCRF9MT0NBTEVfVVMgICAgICAgICAgCTB4MDAwMCAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQ6IFVTIGtleWJvYXJkIGxheW91dAorI2RlZmluZSBLQkRfTE9DQUxFX0RFICAgICAgICAgIAkweDAwMDQgICAgICAgICAgICAgICAgICAvLyBERTogR2VybWFuIGtleWJvYXJkIGxheW91dAorCisjZGVmaW5lIEtCRF9NT0RJRklFUlMgICAgICAgICAgCTB4MDBFMCAgICAgICAgICAgICAgICAgIC8vIGJpdCBtYXNrIGZvciBjaGVja2luZyBtb2RpZmllcnMKKyNkZWZpbmUgS0JEX1NISUZUICAgICAgICAgICAgICAJMHgwMDIwICAgICAgICAgICAgICAgICAgLy8gbW9kaWZpZXIgIlNISUZUIiBwcmVzc2VkCisjZGVmaW5lIEtCRF9BTFQgICAgICAgICAgICAgICAgCTB4MDA0MCAgICAgICAgICAgICAgICAgIC8vIG1vZGlmaWVyICJBTFQiIHByZXNzZWQKKyNkZWZpbmUgS0JEX0NUUkwgICAgICAgICAgICAgICAJMHgwMDgwICAgICAgICAgICAgICAgICAgLy8gbW9kaWZpZXIgIkNUUkwiIHByZXNzZWQKKworLy8gUkVBRCBSRUdJU1RFUjogQ09NTU9OIEFTQ0lJIENPREVTCisKKyNkZWZpbmUgS0JEX1NQQUNFICAgICAgICAgICAgICAJMHgwMDIwCisjZGVmaW5lIEtCRF9FTlRFUiAgICAgICAgICAgICAgCTB4MDAwRAorI2RlZmluZSBLQkRfRVNDICAgICAgICAgICAgICAgIAkweDAwMUIKKyNkZWZpbmUgS0JEX1RBQiAgICAgICAgICAgICAgICAJMHgwMDA5CisjZGVmaW5lIEtCRF9CQUNLU1BBQ0UgICAgICAgICAgCTB4MDAwOAorCisvLyBSRUFEIFJFR0lTVEVSOiBTUEVDSUFMIEtFWVMKKworI2RlZmluZSBLQkRfRjEgICAgICAgICAgICAgICAgIAkweDAxMDAKKyNkZWZpbmUgS0JEX0YyICAgICAgICAgICAgICAgICAJMHgwMjAwCisjZGVmaW5lIEtCRF9GMyAgICAgICAgICAgICAgICAgCTB4MDMwMAorI2RlZmluZSBLQkRfRjQgICAgICAgICAgICAgICAgIAkweDA0MDAKKyNkZWZpbmUgS0JEX0Y1ICAgICAgICAgICAgICAgICAJMHgwNTAwCisjZGVmaW5lIEtCRF9GNiAgICAgICAgICAgICAgICAgCTB4MDYwMAorI2RlZmluZSBLQkRfRjcgICAgICAgICAgICAgICAgIAkweDA3MDAKKyNkZWZpbmUgS0JEX0Y4ICAgICAgICAgICAgICAgICAJMHgwODAwCisjZGVmaW5lIEtCRF9GOSAgICAgICAgICAgICAgICAgCTB4MDkwMAorI2RlZmluZSBLQkRfRjEwICAgICAgICAgICAgICAgIAkweDBBMDAKKyNkZWZpbmUgS0JEX0YxMSAgICAgICAgICAgICAgICAJMHgwQjAwCisjZGVmaW5lIEtCRF9GMTIgICAgICAgICAgICAgICAgCTB4MEMwMAorCisjZGVmaW5lIEtCRF9DVVJfVVAgICAgICAgICAgICAgCTB4MTAwMAorI2RlZmluZSBLQkRfQ1VSX0RPV04gICAgICAgICAgIAkweDExMDAKKyNkZWZpbmUgS0JEX0NVUl9MRUZUICAgICAgICAgICAJMHgxMjAwCisjZGVmaW5lIEtCRF9DVVJfUklHSFQgICAgICAgICAgCTB4MTMwMAorI2RlZmluZSBLQkRfUEdfVVAgICAgICAgICAgICAgIAkweDE0MDAKKyNkZWZpbmUgS0JEX1BHX0RPV04gICAgICAgICAgICAJMHgxNTAwCisjZGVmaW5lIEtCRF9IT01FICAgICAgICAgICAgICAgCTB4MTYwMAorI2RlZmluZSBLQkRfRU5EICAgICAgICAgICAgICAgIAkweDE3MDAKKyNkZWZpbmUgS0JEX0lOUyAgICAgICAgICAgICAgICAJMHgxODAwCisjZGVmaW5lIEtCRF9ERUwgICAgICAgICAgICAgICAgCTB4MTkwMAorCisvLyBSRUFEIFJFR0lTVEVSOiBDVFJMICsgY2hhcmFjdGVyIGlzIGFsc28gbWFwcGVkIHRvIGFuIEFTQ0lJIGNvZGUKKworI2RlZmluZSBLQkRfQ1RSTF9BICAgICAgICAgICAgIAkweDAwMDEgCisjZGVmaW5lIEtCRF9DVFJMX0IgICAgICAgICAgICAgCTB4MDAwMiAKKyNkZWZpbmUgS0JEX0NUUkxfQyAgICAgICAgICAgICAJMHgwMDAzIAorI2RlZmluZSBLQkRfQ1RSTF9EICAgICAgICAgICAgIAkweDAwMDQgCisjZGVmaW5lIEtCRF9DVFJMX0UgICAgICAgICAgICAgCTB4MDAwNSAKKyNkZWZpbmUgS0JEX0NUUkxfRiAgICAgICAgICAgICAJMHgwMDA2IAorI2RlZmluZSBLQkRfQ1RSTF9HICAgICAgICAgICAgIAkweDAwMDcgCisjZGVmaW5lIEtCRF9DVFJMX0ggICAgICAgICAgICAgCTB4MDAwOCAKKyNkZWZpbmUgS0JEX0NUUkxfSSAgICAgICAgICAgICAJMHgwMDA5IAorI2RlZmluZSBLQkRfQ1RSTF9KICAgICAgICAgICAgIAkweDAwMEEgCisjZGVmaW5lIEtCRF9DVFJMX0sgICAgICAgICAgICAgCTB4MDAwQiAKKyNkZWZpbmUgS0JEX0NUUkxfTCAgICAgICAgICAgICAJMHgwMDBDIAorI2RlZmluZSBLQkRfQ1RSTF9NICAgICAgICAgICAgIAkweDAwMEQgCisjZGVmaW5lIEtCRF9DVFJMX04gICAgICAgICAgICAgCTB4MDAwRSAKKyNkZWZpbmUgS0JEX0NUUkxfTyAgICAgICAgICAgICAJMHgwMDBGIAorI2RlZmluZSBLQkRfQ1RSTF9QICAgICAgICAgICAgIAkweDAwMTAgCisjZGVmaW5lIEtCRF9DVFJMX1EgICAgICAgICAgICAgCTB4MDAxMSAKKyNkZWZpbmUgS0JEX0NUUkxfUiAgICAgICAgICAgICAJMHgwMDEyIAorI2RlZmluZSBLQkRfQ1RSTF9TICAgICAgICAgICAgIAkweDAwMTMgCisjZGVmaW5lIEtCRF9DVFJMX1QgICAgICAgICAgICAgCTB4MDAxNCAKKyNkZWZpbmUgS0JEX0NUUkxfVSAgICAgICAgICAgICAJMHgwMDE1IAorI2RlZmluZSBLQkRfQ1RSTF9WICAgICAgICAgICAgIAkweDAwMTYgCisjZGVmaW5lIEtCRF9DVFJMX1cgICAgICAgICAgICAgCTB4MDAxNyAKKyNkZWZpbmUgS0JEX0NUUkxfWCAgICAgICAgICAgICAJMHgwMDE4IAorI2RlZmluZSBLQkRfQ1RSTF9ZICAgICAgICAgICAgIAkweDAwMTkgCisjZGVmaW5lIEtCRF9DVFJMX1ogICAgICAgICAgICAgCTB4MDAxQSAKKworLy8KKy8vICBVc2VmdWwgQVNDSUkgY29uc3RhbnRzOgorLy8KKyNkZWZpbmUgQ0hSX0JFTEwgICAgICAgCTB4MDAwNyAvLyBBU0NJSS1CRUxMIGNoYXJhY3RlcgorI2RlZmluZSBDSFJfVEFCICAgICAgICAJMHgwMDA5IC8vIEFTQ0lJLVRBQiBjaGFyYWN0ZXIKKyNkZWZpbmUgQ0hSX1NQQUNFICAgICAgCTB4MDAyMCAvLyBBU0NJSS1TcGFjZQorI2RlZmluZSBDSFJfQ1IgICAgICAgICAJMHgwMDBkIC8vIENhcnJpYWdlIHJldHVybgorI2RlZmluZSBDSFJfTEYgICAgICAgICAJMHgwMDBhIC8vIExpbmUgZmVlZApkaWZmIC0tZ2l0IGEvbWFjaGluZXMvcmYxMi9tYWNoaW5lLmMgYi9tYWNoaW5lcy9yZjEyL21hY2hpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MGM2YmM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvcmYxMi9tYWNoaW5lLmMKQEAgLTAsMCArMSwzODA4IEBACisvKiAgQ29kZSBnZW5lcmF0b3IgZm9yIE1vdG9yb2xhIDY4aGMxMiBtaWNyb2NvbnRyb2xsZXJzLiAgICAgICAgICAgICAgICovCisKKy8qVE9ETzoKKyAgcmVnc19tb2RpZmllZCBiZWkgc3RydWN0LWNvcHkKKyAgc2F2aW5ncyB2ZXJmZWluZXJuCisgIDQtQnl0ZSBDb3B5CisgIFtzdGF0aWNdIHRlc3RlbgorICBwZWVwaG9sZS1QYXNzIHVtIEFMTE9DUkVHcyB6dSBlbnRmZXJuZW4KKyAgQUNDX0lORCAoQWNodHVuZz8pCisgIHN0cnVjdC1jb3B5IFByb2JsZW1m5GxsZQorICBiYW5rZWQKKyAgYml0CisgIGxvbmcgbG9uZywgZmxvYXQsIGRvdWJsZSwgbG9uZyBkb3VibGUKKworKi8KKworI2luY2x1ZGUgInN1cHAuaCIKKyNpbmNsdWRlICJ2YmMuaCIgLyogbmljaHQgc2Nob2VuLCBhYmVyIC4uLiAqLworCitzdGF0aWMgY2hhciBGSUxFX1tdPV9fRklMRV9fOworCisjaW5jbHVkZSAiZHdhcmYyLmMiCisKKy8qICBQdWJsaWMgZGF0YSB0aGF0IE1VU1QgYmUgdGhlcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBOYW1lIGFuZCBjb3B5cmlnaHQuICovCitjaGFyIGNnX2NvcHlyaWdodFtdPSJ2YmNjIGNvZGUtZ2VuZXJhdG9yIGZvciA2ODA5LzY4MDMvNjhoYzEyIFYwLjIgKGMpIGluIDIwMDAtMjAyMiBieSBWb2xrZXIgQmFydGhlbG1hbm4iOworCisvKiAgQ29tbWFuZGxpbmUtZmxhZ3MgdGhlIGNvZGUtZ2VuZXJhdG9yIGFjY2VwdHMgICAgICAgICAgICAgICAgKi8KK2ludCBnX2ZsYWdzW01BWEdGXT17VkFMRkxBRyxWQUxGTEFHLDAsMCwKKyAgICAgICAgICAgICAgICAgICAgMCwwLDAsMCwKKwkJICAgIDAsMH07CitjaGFyICpnX2ZsYWdzX25hbWVbTUFYR0ZdPXsiY3B1IiwiZnB1Iiwibm8tZGVsYXllZC1wb3BwaW5nIiwiY29uc3QtaW4tZGF0YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVyZ2UtY29uc3RhbnRzIiwibm8tcGVlcGhvbGUiLCJtZW0tY3NlIiwiYWNjLWdsb2IiLAorCQkJICAgInBjcmVsIiwiZHJlbCIsIm5vLWNoYXItYWRkaTJwIiwibm9keCIsIm5vdSJ9OwordW5pb24gcHBpIGdfZmxhZ3NfdmFsW01BWEdGXTsKKworLyogVHlwZW5hbWVzIChuZWVkZWQgYmVjYXVzZSBvZiBIQVZFX0VYVF9UWVBFUykuICovCitjaGFyICp0eXBuYW1lW109eyJzdHJhbmdlIiwiYml0IiwiY2hhciIsInNob3J0IiwiaW50IiwibG9uZyIsImxvbmcgbG9uZyIsCisJCSAiZmxvYXQiLCJkb3VibGUiLCJsb25nIGRvdWJsZSIsInZvaWQiLAorICAgICAgICAgICAgICAgICAibmVhci1wb2ludGVyIiwiZmFyLXBvaW50ZXIiLCJodWdlLXBvaW50ZXIiLAorCQkgImFycmF5Iiwic3RydWN0IiwidW5pb24iLCJlbnVtIiwiZnVuY3Rpb24ifTsKKworaW50IGJpdHNwZXJieXRlID0gODsKK2ludCBieXRlbWFzayA9IDB4ZmY7CitpbnQgZGJsX2J5dGVtYXNrID0gMHhmZmZmOworCisvKiAgQWxpZ25tZW50LXJlcXVpcmVtZW50cyBmb3IgYWxsIHR5cGVzIGluIGJ5dGVzLiAgICAgICAgICAgICAgKi8KK3ptYXggYWxpZ25bTUFYX1RZUEUrMV07CisKKy8qICBBbGlnbm1lbnQgdGhhdCBpcyBzdWZmaWNpZW50IGZvciBldmVyeSBvYmplY3QuICAgICAgICAgICAgICAqLworem1heCBtYXhhbGlnbjsKKworLyogIENIQVJfQklUIG9mIHRoZSB0YXJnZXQgbWFjaGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IGNoYXJfYml0OworCisvKiAgU2l6ZXMgb2YgYWxsIGVsZW1lbnRhcnkgdHlwZXMgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggc2l6ZXRhYltNQVhfVFlQRSsxXTsKKworLyogIE1pbmltdW0gYW5kIE1heGltdW0gdmFsdWVzIGVhY2ggdHlwZSBjYW4gaGF2ZS4gICAgICAgICAgICAgICovCisvKiAgTXVzdCBiZSBpbml0aWFsaXplZCBpbiBpbml0X2NnKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggdF9taW5bTUFYX1RZUEUrMV07Cit6dW1heCB0X21heFtNQVhfVFlQRSsxXTsKK3p1bWF4IHR1X21heFtNQVhfVFlQRSsxXTsKKworLyogIE5hbWVzIG9mIGFsbCByZWdpc3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitjaGFyICpyZWduYW1lc1tdPXsibm9yZWciLCJkIiwieCIsInkiLCJzcCIsInUiLCJkL3gifTsKKworLyogIFRoZSBTaXplIG9mIGVhY2ggcmVnaXN0ZXIgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IHJlZ3NpemVbTUFYUisxXTsKKworLyogIFR5cGUgd2hpY2ggY2FuIHN0b3JlIGVhY2ggcmVnaXN0ZXIuICovCitzdHJ1Y3QgVHlwICpyZWd0eXBlW01BWFIrMV07CisKKy8qICByZWdzYVtyZWddIT0wIGlmIGEgY2VydGFpbiByZWdpc3RlciBpcyBhbGxvY2F0ZWQgYW5kIHNob3VsZCAqLworLyogIG5vdCBiZSB1c2VkIGJ5IHRoZSBjb21waWxlciBwYXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitpbnQgcmVnc2FbTUFYUisxXTsKKworLyogIFNwZWNpZmllcyB3aGljaCByZWdpc3RlcnMgbWF5IGJlIHNjcmF0Y2hlZCBieSBmdW5jdGlvbnMuICAgICovCitpbnQgcmVnc2NyYXRjaFtNQVhSKzFdPXswLDEsMSwwLDEsMH07CisKK2ludCByZWdfcHJpb1tNQVhSKzFdPXswLDAsMSwxLDAsMH07CisKK3N0cnVjdCByZWdfaGFuZGxlIGVtcHR5X3JlZ19oYW5kbGU9ezB9OworCisvKiBOYW1lcyBvZiB0YXJnZXQtc3BlY2lmaWMgdmFyaWFibGUgYXR0cmlidXRlcy4gICAgICAgICAgICAgICAgKi8KK2NoYXIgKmdfYXR0cl9uYW1lW109eyJfX2ludGVycnVwdCIsIl9fZHBhZ2UiLCJfX2ZhciIsMH07CisjZGVmaW5lIElOVEVSUlVQVCAxCisjZGVmaW5lIERQQUdFICAgICAyCisjZGVmaW5lIEZBUgkJCQk0CisKK2ludCBNSU5BRERJMlA9Q0hBUjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgU29tZSBwcml2YXRlIGRhdGEgYW5kIGZ1bmN0aW9ucy4gICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgbG9uZyBtYWxpZ25bTUFYX1RZUEUrMV09ICB7MSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMX07CitzdGF0aWMgbG9uZyBtc2l6ZXRhYltNQVhfVFlQRSsxXT17MCwxLDEsMiwyLDQsNCw0LDQsNCwwLDIsNCw0LDAsMCwwLDIsMH07CisKK3N0cnVjdCBUeXAgaXR5cD17U0hPUlR9LGx0eXA9e0xPTkd9OworCisjZGVmaW5lIERBVEEgMAorI2RlZmluZSBCU1MgMQorI2RlZmluZSBDT0RFIDIKKyNkZWZpbmUgUk9EQVRBIDMKKyNkZWZpbmUgU1BFQ0lBTCA0CisKK3N0YXRpYyBpbnQgc2VjdGlvbj0tMSxuZXdvYmosc2NudCxwdXNoZWRfYWNjOworc3RhdGljIGNoYXIgKmNvZGVuYW1lPSJcdC50ZXh0XG4iLAorICAgICAgICAgICAgKmRhdGFuYW1lPSJcdC5kYXRhXG4iLAorICAgICAgICAgICAgKmJzc25hbWU9Ilx0LnNlY3Rpb25cdC5ic3NcbiIsCisgICAgICAgICAgICAqcm9kYXRhbmFtZT0iXHQuc2VjdGlvblx0LnJvZGF0YVxuIjsKKworI2RlZmluZSBJTU1fSU5EICAxCisjZGVmaW5lIFZBUl9JTkQgIDIKKyNkZWZpbmUgUE9TVF9JTkMgMworI2RlZmluZSBQT1NUX0RFQyA0CisjZGVmaW5lIFBSRV9JTkMgIDUKKyNkZWZpbmUgUFJFX0RFQyAgNgorI2RlZmluZSBBQ0NfSU5EICA3CisjZGVmaW5lIEtPTlNUSU5DIDgKKworLyogKHVzZXIpc3RhY2stcG9pbnRlciwgcG9pbnRlci10bXAsIGludC10bXA7IHJlc2VydmVkIGZvciBjb21waWxlciAqLworc3RhdGljIGludCBhY2M9MSxpeD0yLGl5PTMsc3A9NCxpdT01LGR4PTY7CitzdGF0aWMgdm9pZCBwcihGSUxFICosc3RydWN0IElDICopOworc3RhdGljIHZvaWQgZnVuY3Rpb25fdG9wKEZJTEUgKixzdHJ1Y3QgVmFyICosbG9uZyk7CitzdGF0aWMgdm9pZCBmdW5jdGlvbl9ib3R0b20oRklMRSAqZixzdHJ1Y3QgVmFyICosbG9uZyk7CisKK3N0YXRpYyBjaGFyICptYXJyYXlbXT17Il9fc2VjdGlvbih4LHkpPV9fdmF0dHIoXCJzZWN0aW9uKFwiI3hcIixcIiN5XCIpXCIpIiwKKwkJICAgICAgICJfX0hDMTJfXyIsCisJCSAgICAgICAiX19TSVpFX1RfSU5UPTEiLAorCQkgICAgICAgIl9fZGlyZWN0PV9fdmF0dHIoXCJzZWN0aW9uKFxcXCJkcGFnZVxcXCIpXCIpIiwKKwkJICAgICAgIDB9OworCisjZGVmaW5lIGlzcmVnKHgpICgocC0+eC5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKQorI2RlZmluZSBpc2NvbnN0KHgpICgocC0+eC5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCkKKworc3RhdGljIGxvbmcgbG9mZixyb2ZmLHN0YWNrb2Zmc2V0LG5vdHBvcHBlZCxkb250cG9wLG1heHB1c2hlZCxzdGFjazsKKworc3RhdGljIGNoYXIgKnhfdFtdPXsiPyIsIiIsImIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIifTsKK3N0YXRpYyBjaGFyICpjY3NbXT17ImVxIiwibmUiLCJsdCIsImdlIiwibGUiLCJndCJ9Oworc3RhdGljIGNoYXIgKnVjY3NbXT17ImVxIiwibmUiLCJsbyIsImhzIiwibHMiLCJoaSJ9Oworc3RhdGljIGNoYXIgKmxvZ2ljYWxzW109eyJvcmEiLCJlb3IiLCJhbmQifTsKK3N0YXRpYyBjaGFyICpkY3RbXT17IiIsIi5iaXQiLCIuYnl0ZSIsIi4yYnl0ZSIsIi4yYnl0ZSIsIi40Ynl0ZSIsIi44Ynl0ZSIsIi40Ynl0ZSIsIi44Ynl0ZSIsIi44Ynl0ZSIsCisJCSAgICAiKHZvaWQpIiwiLjJieXRlIiwiLjM0Ynl0ZSIsIi4zNGJ5dGUifTsKK3N0YXRpYyBjaGFyICppZHByZWZpeD0iIiwqbGFicHJlZml4PSIubCI7CitzdGF0aWMgaW50IGV4aXRfbGFiZWwsaGF2ZV9mcmFtZTsKK3N0YXRpYyBjaGFyICpyZXQ7CitzdGF0aWMgaW50IHN0YWNrY2hlY2tsYWJlbDsKK3N0YXRpYyBpbnQgZnJhbWVfdXNlZCxzdGFja192YWxpZDsKK3N0YXRpYyBpbnQgQ1BVPTY4MTI7CitzdGF0aWMgaW50IHBjcmVsLGRyZWw7CitzdGF0aWMgaW50IHNraXBfcmVsOworc3RhdGljIGNoYXIgKmpzcmluc3Q9ImpzciI7CitzdGF0aWMgY2hhciAqam1waW5zdD0iam1wIjsKK3N0YXRpYyBpbnQgbm9keCxub3U7CitpbnQgc3dpdGNoc3ViczsKKworc3RhdGljIGludCBjY190Oworc3RhdGljIHN0cnVjdCBvYmogKmNjOworCitzdGF0aWMgc3RydWN0IG9iaiBtb2JqOworCisjZGVmaW5lIFNUUl9ORUFSICJuZWFyIgorI2RlZmluZSBTVFJfRkFSICJmYXIiCisjZGVmaW5lIFNUUl9IVUdFICJodWdlIgorI2RlZmluZSBTVFJfQkFERFIgImJhZGRyIgorCisjZGVmaW5lIElTTlVMTCgpICh6bWVxdG8odm1heCxsMnptKDBMKSkmJnp1bWVxdG8odnVtYXgsdWwyenVtKDBVTCkpJiZ6bGRlcXRvKHZsZG91YmxlLGQyemxkKDAuMCkpKQorI2RlZmluZSBJU0xXT1JEKHQpICgodCZOUSk9PUxPTkd8fCh0Jk5RKT09RlBPSU5URVJ8fCh0Jk5RKT09SFBPSU5URVJ8fCh0Jk5RKT09RkxPQVQpCisjZGVmaW5lIElTSFdPUkQodCkgKCh0Jk5RKT09SU5UfHwodCZOUSk9PVNIT1JUfHwodCZOUSk9PU5QT0lOVEVSKQorI2RlZmluZSBJU0NIV09SRCh0KSAoKHQmTlEpPT1DSEFSfHxJU0hXT1JEKHQpKQorI2RlZmluZSBJU1NUQVRJQyh2KSAoKHYpLT5zdG9yYWdlX2NsYXNzPT1FWFRFUk58fCh2KS0+c3RvcmFnZV9jbGFzcz09U1RBVElDKQorI2RlZmluZSBJU0JBRERSKHYpICgodiktPnZ0eXAtPmF0dHImJnN0cnN0cihTVFJfQkFERFIsKHYpLT52dHlwLT5hdHRyKSkKKy8qRklYTUUqLworI2RlZmluZSBJU0ZBUih2KSAoKHYpLT52dHlwLT5hdHRyJiYoc3Ryc3RyKFNUUl9GQVIsKHYpLT52dHlwLT5hdHRyKXx8c3Ryc3RyKFNUUl9IVUdFLCh2KS0+dnR5cC0+YXR0cikpKQorCisjZGVmaW5lIElTQUNDKHgpICgoeCk9PWFjYykKKyNkZWZpbmUgSVNYKHgpICgoeCk9PWl4KQorI2RlZmluZSBJU1koeCkgKCh4KT09aXkpCisjZGVmaW5lIElTVSh4KSAoKHgpPT1pdSkKKyNkZWZpbmUgSVNJRFgoeCkgKElTWCh4KXx8SVNZKHgpfHwoSVNVKHgpJiZDUFUhPTY4MTIpKQorI2RlZmluZSBJU1JBQ0MoeCkgKGlzcmVnKHgpJiZJU0FDQyhwLT54LnJlZykpCisjZGVmaW5lIElTUlgoeCkgKGlzcmVnKHgpJiZJU1gocC0+eC5yZWcpKQorI2RlZmluZSBJU1JZKHgpIChpc3JlZyh4KSYmSVNZKHAtPngucmVnKSkKKyNkZWZpbmUgSVNSVSh4KSAoaXNyZWcoeCkmJklTVShwLT54LnJlZykpCisjZGVmaW5lIElTUklEWCh4KSAoaXNyZWcoeCkmJklTSURYKHAtPngucmVnKSkKKworI2RlZmluZSBDUFVPUFQgKChnX2ZsYWdzWzBdJlVTRURGTEFHKT9nX2ZsYWdzX3ZhbFswXS5sOjY4MTIpCisKKyNkZWZpbmUgU1BVU0goeCkgKENQVT09NjgxMj8iXHRwc2giIHggIlxuIjoiXHRwc2hzXHQiIHggIlxuIikKKyNkZWZpbmUgU1BVU0hEICAgKENQVT09NjgxMj8iXHRwc2hkXG4iOiJcdHBzaHNcdGIsYVxuIikKKyNkZWZpbmUgU1BVTEwoeCkgKENQVT09NjgxMj8iXHRwdWwiIHggIlxuIjoiXHRwdWxzXHQiIHggIlxuIikKKyNkZWZpbmUgU1BVTExEICAgKENQVT09NjgxMj8iXHRwdWxkXG4iOiJcdHB1bHNcdGEsYlxuIikKKyNkZWZpbmUgU0NNUCh4KSAgKENQVT09NjgxMj8iXHRjcCIgeCAiXHQiOiJcdGNtcCIgeCAiXHQiKQorI2RlZmluZSBTRVggICAgICAoQ1BVPT02ODEyPyJcdHNleFx0YixkXG4iOiJcdHNleFxuIikKKworI2RlZmluZSBTR04xNih4KSAoem0ybCh6aTJ6bSh6bTJ6aShsMnptKChsb25nKSh4KSkpKSkpCisKK2VudW0gcGVlcGYgeyBORUVEU0FNRSA9IDEsIFJFTU9WRTFTVCA9IDIsIEFMTE9XU0ZYID0gNH07CitzdHJ1Y3QgcGVlcHMge2NoYXIgKnMxLCpzMiwqcjtlbnVtIHBlZXBmIGZsYWdzO307CisKK3N0YXRpYyBpbnQgY2hlY2tfc2Z4KGNoYXIgKnMpCit7CisgIGlmKCEqcykgcmV0dXJuIDA7CisgIHMrPXN0cmxlbihzKS0xOworICBpZigqcz09JysnfHwqcz09Jy0nKSByZXR1cm4gMTsKKyAgaWYoKnMhPSdzJyYmKnMhPSd4JyYmKnMhPSd5JyYmKnMhPSd1JykgcmV0dXJuIDA7CisgIHMtLTsKKyAgaWYoKnMhPScsJykgcmV0dXJuIDA7CisgIHMtLTsKKyAgaWYoKnM9PScrJ3x8KnM9PSctJykgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldHN6ZmxhZyhjaGFyICpvcCxjaGFyIHIpCit7CisgIHN0YXRpYyBjaGFyICp6YltdPXsiYWRjYiIsImFkZGIiLCJhbmRiIiwiYXNsYiIsImFzcmIiLCJjbHJiIiwiY29tYiIsImRlY2IiLCJlb3JiIiwiaW5jYiIsCisJCSJsZGFiIiwibGRiIiwibHNsYiIsImxzcmIiLCJuZWdiIiwib3JiIiwib3JhYiIsInJvbGIiLCJyb3JiIiwic2JjYiIsCisJCSJzdGIiLCJzdGFiIiwic3ViYiIsInRzdGIifTsKKyAgc3RhdGljIGNoYXIgKnpkW109eyJhZGRkIiwibGRkIiwic2V4Iiwic3RkIiwic3ViZCJ9OworCisgIGludCBpOworCisgIGlmKHI9PSdiJyl7CisgICAgZm9yKGk9MDtpPHNpemVvZih6Yikvc2l6ZW9mKCp6Yik7aSsrKQorICAgICAgaWYoIXN0cmNtcChvcCx6YltpXSkpCisJcmV0dXJuIDE7CisgIH0KKyAgaWYocj09J2QnKXsKKyAgICBmb3IoaT0wO2k8c2l6ZW9mKHpkKS9zaXplb2YoKnpkKTtpKyspCisgICAgICBpZighc3RyY21wKG9wLHpkW2ldKSkKKwlyZXR1cm4gMTsKKyAgfQorICBpZihyPT0neCcmJighc3RyY21wKG9wLCJsZWF4Iil8fCFzdHJjbXAob3AsImxkeCIpKSkgcmV0dXJuIDE7CisgIGlmKHI9PSd5JyYmKCFzdHJjbXAob3AsImxlYXkiKXx8IXN0cmNtcChvcCwibGR5IikpKSByZXR1cm4gMTsKKyAgaWYoQ1BVPT02ODEyKXsKKyAgICBpZihyPT0neCcmJighc3RyY21wKG9wLCJkZXgiKXx8IXN0cmNtcChvcCwiaW54IikpKSByZXR1cm4gMTsKKyAgICBpZihyPT0neScmJighc3RyY21wKG9wLCJkZXkiKXx8IXN0cmNtcChvcCwiaW55IikpKSByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IGVtaXRfcGVlcGhvbGUodm9pZCkKK3sKKyAgaW50IGVudHJpZXMsaSxqLHYxLHYyOworICBjaGFyICphc21saW5lW0VNSVRfQlVGX0RFUFRIXTsKKyAgY2hhciBidWYxWzEwMjRdLGJ1ZjJbMTAyNF07CisgIGNoYXIgb3AxWzhdLG9wMls4XTsKKworCisgIC8qIFRPRE86IGFkYXB0IGJldHRlciAqLworICBzdGF0aWMgc3RydWN0IHBlZXBzIGVsaW1bXT17CisgICAgImxkYSIsInN0YSIsMCxORUVEU0FNRSwKKyAgICAibGRiIiwic3RiIiwwLE5FRURTQU1FLAorICAgICJsZGFhIiwic3RhYSIsMCxORUVEU0FNRSwKKyAgICAibGRhYiIsInN0YWIiLDAsTkVFRFNBTUUsCisgICAgImxkZCIsInN0ZCIsMCxORUVEU0FNRSwKKyAgICAibGR4Iiwic3R4IiwwLE5FRURTQU1FLAorICAgICJsZHkiLCJzdHkiLDAsTkVFRFNBTUUsCisgICAgImxkdSIsInN0dSIsMCxORUVEU0FNRSwKKyAgICAic3RhIiwic3RhIiwwLE5FRURTQU1FLAorICAgICJzdGIiLCJzdGIiLDAsTkVFRFNBTUUsCisgICAgInN0YWEiLCJzdGFhIiwwLE5FRURTQU1FLAorICAgICJzdGFiIiwic3RhYiIsMCxORUVEU0FNRSwKKyAgICAic3RkIiwic3RkIiwwLE5FRURTQU1FLAorICAgICJzdHgiLCJzdHgiLDAsTkVFRFNBTUUsCisgICAgInN0eSIsInN0eSIsMCxORUVEU0FNRSwKKyAgICAic3R1Iiwic3R1IiwwLE5FRURTQU1FLAorICAgICJzdGEiLCJsZGEiLDAsTkVFRFNBTUUsCisgICAgInN0YiIsImxkYiIsMCxORUVEU0FNRSwKKyAgICAic3RhYSIsImxkYWEiLDAsTkVFRFNBTUUsCisgICAgInN0YWIiLCJsZGFiIiwwLE5FRURTQU1FLAorICAgICJzdGQiLCJsZGQiLDAsTkVFRFNBTUUsCisgICAgInN0eCIsImxkeCIsMCxORUVEU0FNRSwKKyAgICAic3R5IiwibGR5IiwwLE5FRURTQU1FLAorICAgICJzdHUiLCJsZHUiLDAsTkVFRFNBTUUsCisjaWYgMAorICAgICJsZGEiLCJsZGEiLDAsUkVNT1ZFMVNULAorICAgICJsZGFhIiwibGRhYSIsMCxSRU1PVkUxU1QsCisgICAgImxkYWIiLCJsZGFiIiwwLFJFTU9WRTFTVCwKKyAgICAibGRiIiwibGRiIiwwLFJFTU9WRTFTVCwKKyAgICAibGRkIiwibGRkIiwwLFJFTU9WRTFTVCwKKyAgICAibGR4IiwibGR4IiwwLFJFTU9WRTFTVCwKKyAgICAibGR5IiwibGR5IiwwLFJFTU9WRTFTVCwKKyAgICAibGR1IiwibGR1IiwwLFJFTU9WRTFTVCwKKyAgICAibGRhIiwicGxhIiwwLFJFTU9WRTFTVCwKKyAgICAibGRhIiwidHhhIiwwLFJFTU9WRTFTVCwKKyAgICAibGRhIiwidHlhIiwwLFJFTU9WRTFTVCwKKyAgICAibGR4IiwidGF4IiwwLFJFTU9WRTFTVCwKKyAgICAibGR5IiwidGF5IiwwLFJFTU9WRTFTVCwKKyAgICAidGF5IiwibGR5IiwwLFJFTU9WRTFTVCwKKyAgICAidGF4IiwibGR4IiwwLFJFTU9WRTFTVCwKKyAgICAidHhhIiwibGRhIiwwLFJFTU9WRTFTVCwKKyAgICAidHlhIiwibGRhIiwwLFJFTU9WRTFTVCwKKyNlbmRpZgorICB9OworCisKKyAgaT1lbWl0X2w7CisgIGlmKGVtaXRfZj09MCkKKyAgICBlbnRyaWVzPWktZW1pdF9mKzE7CisgIGVsc2UKKyAgICBlbnRyaWVzPUVNSVRfQlVGX0RFUFRIOworICBhc21saW5lWzBdPWVtaXRfYnVmZmVyW2ldOworICBpZihzc2NhbmYoYXNtbGluZVswXSwiICU2cyAlOTk5cyIsb3AxLGJ1ZjEpPT0yJiYhc3RyY21wKG9wMSwiY21wYiIpJiYhc3RyY21wKGJ1ZjEsIiMwIikpCisgICAgc3RyY3B5KGFzbWxpbmVbMF0sIlx0dHN0YlxuIik7CisgIGlmKHNzY2FuZihhc21saW5lWzBdLCIgJTZzICU5OTlzIixvcDEsYnVmMSk9PTImJiFzdHJjbXAob3AxLCJjbXBkIikmJiFzdHJjbXAoYnVmMSwiIzAiKSkKKyAgICBzdHJjcHkoYXNtbGluZVswXSwiXHRzdWJkXHQjMFxuIik7CisKKyAgaWYoZW50cmllcz49Mil7CisgICAgaS0tOworICAgIGlmKGk8MCkgaT1FTUlUX0JVRl9ERVBUSC0xOworICAgIGFzbWxpbmVbMV09ZW1pdF9idWZmZXJbaV07CisKKyAgICBmb3Ioaj0wO2o8c2l6ZW9mKGVsaW0pL3NpemVvZihlbGltWzBdKTtqKyspeworICAgICAgaWYoZWxpbVtqXS5mbGFncyZORUVEU0FNRSl7CisJaWYoc3NjYW5mKGFzbWxpbmVbMF0sIiAlNnMgJTk5OXMiLG9wMixidWYyKT09MiYmCisJICAgc3NjYW5mKGFzbWxpbmVbMV0sIiAlNnMgJTk5OXMiLG9wMSxidWYxKT09MiYmCisJICAgIXN0cmNtcChvcDEsZWxpbVtqXS5zMSkmJiFzdHJjbXAob3AyLGVsaW1bal0uczIpJiYKKwkgICAhc3RyY21wKGJ1ZjEsYnVmMikpeworCSAgaWYoIWNoZWNrX3NmeChidWYxKSYmIWNoZWNrX3NmeChidWYyKSl7CisJICAgIGlmKGVsaW1bal0ucil7CisJICAgICAgc3RyY3B5KGFzbWxpbmVbMF0sZWxpbVtqXS5yKTsKKwkgICAgfWVsc2V7CisJICAgICAgaWYoZWxpbVtqXS5mbGFncyZSRU1PVkUxU1QpCisJCXN0cmNweShhc21saW5lWzFdLGFzbWxpbmVbMF0pOworCSAgICAgIHJlbW92ZV9hc20oKTsKKwkgICAgfQorCSAgICByZXR1cm4gMTsKKwkgIH0KKwl9CisgICAgICB9ZWxzZXsKKwkqYnVmMT0wOypidWYyPTA7CisJaWYoc3NjYW5mKGFzbWxpbmVbMV0sIiAlNnMgJTk5OXMiLG9wMSxidWYxKT49MSYmCisJICAgc3NjYW5mKGFzbWxpbmVbMF0sIiAlNnMgJTk5OXMiLG9wMixidWYyKT49MSYmCisJICAgIXN0cmNtcChvcDEsZWxpbVtqXS5zMSkmJiFzdHJjbXAob3AyLGVsaW1bal0uczIpKXsKKwkgIGlmKChlbGltW2pdLmZsYWdzJkFMTE9XU0ZYKXx8KCFjaGVja19zZngoYnVmMSkmJiFjaGVja19zZngoYnVmMikpKXsKKwkgICAgaWYoZWxpbVtqXS5mbGFncyZSRU1PVkUxU1QpCisJICAgICAgc3RyY3B5KGFzbWxpbmVbMV0sYXNtbGluZVswXSk7CisJICAgIHJlbW92ZV9hc20oKTsKKwkgICAgcmV0dXJuIDE7CisJICB9CisJfQorICAgICAgfQorICAgIH0KKworICAgIGlmKCFzdHJjbXAoYXNtbGluZVswXSwiXHRydHNcbiIpJiZzc2NhbmYoYXNtbGluZVsxXSwiICU2cyAlOTk5cyIsb3AxLGJ1ZjEpPT0yJiYhc3RyY21wKG9wMSwicHVscyIpKXsKKyAgICAgIHNwcmludGYoYXNtbGluZVsxXStzdHJsZW4oYXNtbGluZVsxXSktMSwiLHBjXG4iKTsKKyAgICAgIHJlbW92ZV9hc20oKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmKCFzdHJjbXAoYXNtbGluZVswXSwiXHRzdGJcdDAsc1xuIikmJiFzdHJjbXAoYXNtbGluZVsxXSwiXHRsZWFzXHQtMSxzXG4iKSl7CisgICAgICBzdHJjcHkoYXNtbGluZVsxXSwiXHRwc2hzXHRiXG4iKTsKKyAgICAgIHJlbW92ZV9hc20oKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmKCFzdHJjbXAoYXNtbGluZVswXSwiXHRzdGRcdDAsc1xuIikmJiFzdHJjbXAoYXNtbGluZVsxXSwiXHRsZWFzXHQtMixzXG4iKSl7CisgICAgICBzdHJjcHkoYXNtbGluZVsxXSwiXHRwc2hzXHRiLGFcbiIpOworICAgICAgcmVtb3ZlX2FzbSgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYoIXN0cmNtcChhc21saW5lWzBdLCJcdGxkYlx0MCxzXG4iKSYmIXN0cmNtcChhc21saW5lWzFdLCJcdHBzaHNcdGJcbiIpKXsKKyAgICAgIHJlbW92ZV9hc20oKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmKCFzdHJjbXAoYXNtbGluZVswXSwiXHRsZGRcdDAsc1xuIikmJiFzdHJjbXAoYXNtbGluZVsxXSwiXHRwc2hzXHRiLGFcbiIpKXsKKyAgICAgIHJlbW92ZV9hc20oKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmKCFzdHJjbXAoYXNtbGluZVswXSwiXHRwc2hzXHRiLGFcbiIpJiYhc3RyY21wKGFzbWxpbmVbMV0sIlx0cHVsc1x0YSxiXG4iKSl7CisgICAgICBzdHJjcHkoYXNtbGluZVsxXSwiXHRsZGRcdDAsc1xuIik7CisgICAgICByZW1vdmVfYXNtKCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZihzc2NhbmYoYXNtbGluZVsxXSwiIGxkZCAlOTk5cyIsb3AxKT49MSYmc3NjYW5mKGFzbWxpbmVbMF0sIiBsZGQgJTk5OXMiLG9wMik+PTEpeworICAgICAgaWYoISgob3AyWzBdPT0nYSd8fG9wMlswXT09J2InfHxvcDJbMF09PSdkJykmJm9wMlsxXT09JywnKSl7CisJc3RyY3B5KGFzbWxpbmVbMV0sYXNtbGluZVswXSk7CisJcmVtb3ZlX2FzbSgpOworCXJldHVybiAxOworICAgICAgfQorICAgIH0KKworICAgIGlmKCFzdHJjbXAoYXNtbGluZVswXSwiXHR0ZnJcdHgsZFxuIikmJiFzdHJjbXAoYXNtbGluZVsxXSwiXHR0ZnJcdGQseFxuIikpeworICAgICAgcmVtb3ZlX2FzbSgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmKCFzdHJjbXAoYXNtbGluZVswXSwiXHR0ZnJcdHksZFxuIikmJiFzdHJjbXAoYXNtbGluZVsxXSwiXHR0ZnJcdGQseVxuIikpeworICAgICAgcmVtb3ZlX2FzbSgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmKCFzdHJjbXAoYXNtbGluZVswXSwiXHRzdGRcdDAsc3BcbiIpJiYhc3RyY21wKGFzbWxpbmVbMV0sIlx0cHNoZFxuIikpeworICAgICAgcmVtb3ZlX2FzbSgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmKCFzdHJjbXAoYXNtbGluZVswXSwiXHRsZGRcdDAsc3BcbiIpJiYhc3RyY21wKGFzbWxpbmVbMV0sIlx0cHNoZFxuIikpeworICAgICAgcmVtb3ZlX2FzbSgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYoc3NjYW5mKGFzbWxpbmVbMF0sIiBsZWFzICVkLHMiLCZ2MSk9PTEmJnNzY2FuZihhc21saW5lWzFdLCIgbGVhcyAlZCxzIiwmdjIpPT0xKXsKKyAgICAgIHNwcmludGYoYXNtbGluZVsxXSwiXHRsZWFzXHQlbGQsc1xuIixTR04xNih2MSt2MikpOworICAgICAgcmVtb3ZlX2FzbSgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYoQ1BVIT02ODEyJiZzc2NhbmYoYXNtbGluZVswXSwiIHRmciAlYywlYyIsYnVmMSxidWYyKT09Mil7CisgICAgICBpZigoKmJ1ZjE9PSd4J3x8KmJ1ZjE9PSd5J3x8KmJ1ZjE9PSd1J3x8KmJ1ZjE9PSdzJykmJgorCSAoKmJ1ZjI9PSd4J3x8KmJ1ZjI9PSd5J3x8KmJ1ZjI9PSd1J3x8KmJ1ZjI9PSdzJykpeworCXNwcmludGYoYXNtbGluZVswXSwiXHRsZWElY1x0LCVjXG4iLCpidWYyLCpidWYxKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoQ1BVPT02ODEyJiYoIXN0cmNtcChhc21saW5lWzFdLCJcdGRleFxuIil8fCFzdHJjbXAoYXNtbGluZVsxXSwiXHRkZXlcbiIpfHwhc3RyY21wKGFzbWxpbmVbMV0sIlx0c3ViZFx0IzFcbiIpKSYmCisgICAgICAgKCFzdHJuY21wKGFzbWxpbmVbMF0sIlx0Ym5lXHQiLDUpfHwhc3RybmNtcChhc21saW5lWzBdLCJcdGJlcVx0Iiw1KSkpeworICAgICAgY2hhciByPWFzbWxpbmVbMV1bM107CisgICAgICBpZihyPT0nYicpIHI9J2QnOworICAgICAgc3RyY3B5KGFzbWxpbmVbMV0sIlx0ZCIpOworICAgICAgc3RybmNweShhc21saW5lWzFdKzIsYXNtbGluZVswXSsxLDQpOworICAgICAgYXNtbGluZVsxXVs2XT1yO2FzbWxpbmVbMV1bN109JywnOworICAgICAgc3RyY3B5KGFzbWxpbmVbMV0rOCxhc21saW5lWzBdKzUpOworICAgICAgcmVtb3ZlX2FzbSgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmKENQVT09NjgxMiYmKCFzdHJjbXAoYXNtbGluZVsxXSwiXHRpbnhcbiIpfHwhc3RyY21wKGFzbWxpbmVbMV0sIlx0aW55XG4iKXx8IXN0cmNtcChhc21saW5lWzFdLCJcdGFkZGRcdCMxXG4iKSkmJgorICAgICAgICghc3RybmNtcChhc21saW5lWzBdLCJcdGJuZVx0Iiw1KXx8IXN0cm5jbXAoYXNtbGluZVswXSwiXHRiZXFcdCIsNSkpKXsKKyAgICAgIGNoYXIgcj1hc21saW5lWzFdWzNdOworICAgICAgc3RyY3B5KGFzbWxpbmVbMV0sIlx0aSIpOworICAgICAgc3RybmNweShhc21saW5lWzFdKzIsYXNtbGluZVswXSsxLDQpOworICAgICAgYXNtbGluZVsxXVs2XT1yO2FzbWxpbmVbMV1bN109JywnOworICAgICAgc3RyY3B5KGFzbWxpbmVbMV0rOCxhc21saW5lWzBdKzUpOworICAgICAgcmVtb3ZlX2FzbSgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIGlmKGVudHJpZXM+PTMpeworICAgIGktLTsKKyAgICBpZihpPDApIGk9RU1JVF9CVUZfREVQVEgtMTsKKyAgICBhc21saW5lWzJdPWVtaXRfYnVmZmVyW2ldOworICAgIGlmKHNzY2FuZihhc21saW5lWzBdLCIgJTZzICU5OTlzIixvcDEsYnVmMSk9PTIpeworICAgICAgaWYoIXN0cmNtcChvcDEsImJlcSIpfHwhc3RyY21wKG9wMSwiYm5lIikpeworCWlmKCFzdHJjbXAoYXNtbGluZVsxXSwiXHR0c3RiXG4iKXx8IXN0cmNtcChhc21saW5lWzFdLCJcdGNwYlx0IzBcbiIpKXsKKwkgIGlmKHNzY2FuZihhc21saW5lWzJdLCIgJTZzICU5OTlzIixvcDIsYnVmMik+PTEmJgorCSAgICAgc2V0c3pmbGFnKG9wMiwnYicpKXsKKwkgICAgc3RyY3B5KGFzbWxpbmVbMV0sYXNtbGluZVswXSk7CisJICAgIHJlbW92ZV9hc20oKTsKKwkgICAgcmV0dXJuIDE7CisJICB9CisJfQorCWlmKHNzY2FuZihhc21saW5lWzFdLCIgJTZzICU5OTlzIixvcDIsYnVmMik9PTImJgorCSAgICghc3RyY21wKG9wMiwic3ViZCIpfHwhc3RyY21wKG9wMiwiY3BkIikpJiYhc3RyY21wKGJ1ZjIsIiMwIikpeworCSAgaWYoc3NjYW5mKGFzbWxpbmVbMl0sIiAlNnMgJTk5OXMiLG9wMixidWYyKT49MSYmCisJICAgICBzZXRzemZsYWcob3AyLCdkJykpeworCSAgICBzdHJjcHkoYXNtbGluZVsxXSxhc21saW5lWzBdKTsKKwkgICAgcmVtb3ZlX2FzbSgpOworCSAgICByZXR1cm4gMTsKKwkgIH0KKwl9CisJaWYoc3NjYW5mKGFzbWxpbmVbMV0sIiAlNnMgJTk5OXMiLG9wMixidWYyKT09MiYmCisJICAgIXN0cmNtcChvcDIsKENQVT09NjgxMik/ImNweCI6ImNtcHgiKSYmIXN0cmNtcChidWYyLCIjMCIpKXsKKwkgIGlmKHNzY2FuZihhc21saW5lWzJdLCIgJTZzICU5OTlzIixvcDIsYnVmMik+PTEmJgorCSAgICAgc2V0c3pmbGFnKG9wMiwneCcpKXsKKwkgICAgc3RyY3B5KGFzbWxpbmVbMV0sYXNtbGluZVswXSk7CisJICAgIHJlbW92ZV9hc20oKTsKKwkgICAgcmV0dXJuIDE7CisJICB9CisJfQorCWlmKHNzY2FuZihhc21saW5lWzFdLCIgJTZzICU5OTlzIixvcDIsYnVmMik9PTImJgorCSAgICFzdHJjbXAob3AyLChDUFU9PTY4MTIpPyJjcHkiOiJjbXB5IikmJiFzdHJjbXAoYnVmMiwiIzAiKSl7CisJICBpZihzc2NhbmYoYXNtbGluZVsyXSwiICU2cyAlOTk5cyIsb3AyLGJ1ZjIpPj0xJiYKKwkgICAgIHNldHN6ZmxhZyhvcDIsJ3knKSl7CisJICAgIHN0cmNweShhc21saW5lWzFdLGFzbWxpbmVbMF0pOworCSAgICByZW1vdmVfYXNtKCk7CisJICAgIHJldHVybiAxOworCSAgfQorCX0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BlY2lhbF9zZWN0aW9uKEZJTEUgKmYsc3RydWN0IFZhciAqdikKK3sKKyAgY2hhciAqc2VjOworICBpZih2LT50YXR0ciZEUEFHRSl7CisgICAgZW1pdChmLCJcdC5zZWN0aW9uXHQuZHBhZ2VcbiIpOworICB9ZWxzZXsKKyAgICBpZighdi0+dmF0dHIpIHJldHVybiAwOworICAgIHNlYz1zdHJzdHIodi0+dmF0dHIsInNlY3Rpb24oIik7CisgICAgaWYoIXNlYykgcmV0dXJuIDA7CisgICAgc2VjKz1zdHJsZW4oInNlY3Rpb24oIik7CisgICAgZW1pdChmLCJcdC5zZWN0aW9uXHQiKTsKKyAgICB3aGlsZSgqc2VjJiYqc2VjIT0nKScpIGVtaXRfY2hhcihmLCpzZWMrKyk7CisgICAgZW1pdChmLCJcbiIpOworICB9CisgIGlmKGYpIHNlY3Rpb249U1BFQ0lBTDsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnBjb25zdGxpc3QgeworICAgIHN0cnVjdCBmcGNvbnN0bGlzdCAqbmV4dDsKKyAgICBpbnQgbGFiZWwsdHlwOworICAgIHVuaW9uIGF0eXBzIHZhbDsKK30gKmZpcnN0ZnBjOworCitzdGF0aWMgaW50IGFkZGZwY29uc3Qoc3RydWN0IG9iaiAqbyxpbnQgdCkKK3sKKyAgc3RydWN0IGZwY29uc3RsaXN0ICpwPWZpcnN0ZnBjOworICB0Jj1OUTsKKyAgaWYoZ19mbGFnc1s0XSZVU0VERkxBRyl7CisgICAgZm9yKHA9Zmlyc3RmcGM7cDtwPXAtPm5leHQpeworICAgICAgaWYodD09cC0+dHlwKXsKKwlldmFsX2NvbnN0KCZwLT52YWwsdCk7CisJaWYodD09RkxPQVQmJnpsZGVxdG8odmxkb3VibGUsemYyemxkKG8tPnZhbC52ZmxvYXQpKSkgcmV0dXJuIHAtPmxhYmVsOworCWlmKHQ9PURPVUJMRSYmemxkZXF0byh2bGRvdWJsZSx6ZDJ6bGQoby0+dmFsLnZkb3VibGUpKSkgcmV0dXJuIHAtPmxhYmVsOworCWlmKHQ9PUxET1VCTEUmJnpsZGVxdG8odmxkb3VibGUsby0+dmFsLnZsZG91YmxlKSkgcmV0dXJuIHAtPmxhYmVsOworICAgICAgfQorICAgIH0KKyAgfQorICBwPW15bWFsbG9jKHNpemVvZihzdHJ1Y3QgZnBjb25zdGxpc3QpKTsKKyAgcC0+bmV4dD1maXJzdGZwYzsKKyAgcC0+bGFiZWw9KytsYWJlbDsKKyAgcC0+dHlwPXQ7CisgIHAtPnZhbD1vLT52YWw7CisgIGZpcnN0ZnBjPXA7CisgIHJldHVybiBwLT5sYWJlbDsKK30KKworaW50IHBvaW50ZXJfdHlwZShzdHJ1Y3QgVHlwICpwKQoreworICBpZighcCkgaWVycm9yKDApOworICB3aGlsZSgocC0+ZmxhZ3MmTlEpPT1BUlJBWSkgcD1wLT5uZXh0OworICBpZigocC0+ZmxhZ3MmTlEpPT1GVU5LVCkgeworICAJaWYocC0+YXR0cikKKyAgICAJaWYoc3Ryc3RyKHAtPmF0dHIsU1RSX0ZBUikpIHJldHVybiBGUE9JTlRFUjsKKyAgCWlmIChwLT5mbGFncyZGQVIpCisgIAkJcmV0dXJuIEZQT0lOVEVSOworICAJcmV0dXJuIE5QT0lOVEVSOyAvKkZJWE1FOiBiYW5rZWQqLworICB9CisgIGlmKHAtPmF0dHIpeworICAgIGlmKHN0cnN0cihwLT5hdHRyLFNUUl9IVUdFKSkgcmV0dXJuIEhQT0lOVEVSOworICAgIGlmKHN0cnN0cihwLT5hdHRyLFNUUl9GQVIpKSByZXR1cm4gRlBPSU5URVI7CisgICAgaWYoc3Ryc3RyKHAtPmF0dHIsU1RSX05FQVIpKSByZXR1cm4gTlBPSU5URVI7CisgIH0KKyAgLypGSVhNRSovCisgIHJldHVybiBOUE9JTlRFUjsKK30KK3N0YXRpYyBsb25nIHZvZmYoc3RydWN0IG9iaiAqcCkKK3sKKyAgaWYoem0ybChwLT52LT5vZmZzZXQpPDApIAorICAgIHJldHVybiBsb2ZmLXptMmwocC0+di0+b2Zmc2V0KSt6bTJsKHAtPnZhbC52bWF4KS1zdGFja29mZnNldCsxOworICBlbHNlCisgICAgcmV0dXJuIHptMmwocC0+di0+b2Zmc2V0KSt6bTJsKHAtPnZhbC52bWF4KS1zdGFja29mZnNldDsKK30KKworc3RhdGljIHZvaWQgZW1pdF9vYmooRklMRSAqZixzdHJ1Y3Qgb2JqICpwLGludCB0KQorLyogIEdpYnQgT2JqZWt0IGF1ZiBCaWxkc2NoaXJtIGF1cyAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpZihwLT5hbSl7CisgICAgaW50IGZsYWdzPXAtPmFtLT5mbGFnczsKKyAgICBpZihmbGFncz09QUNDX0lORCl7CisgICAgICBlbWl0KGYsIiVzLCVzIixyZWduYW1lc1thY2NdLHJlZ25hbWVzW3AtPmFtLT5iYXNlXSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKGZsYWdzPT1LT05TVElOQyl7CisgICAgICBldmFsX2NvbnN0KCZwLT52YWwscC0+YW0tPmJhc2UpOworICAgICAgaWYoKHQmTlEpPT1DSEFSKXsKKwl2dW1heD16dW1yc2hpZnQodnVtYXgsYml0c3BlcmJ5dGUqMy1iaXRzcGVyYnl0ZSpwLT5hbS0+b2Zmc2V0KTsKKwl2dW1heD16dW1hbmQodnVtYXgsdWwyenVtKHR1X21heFtDSEFSXSkpOworICAgICAgfWVsc2V7CisJdnVtYXg9enVtcnNoaWZ0KHZ1bWF4LGJpdHNwZXJieXRlKjItYml0c3BlcmJ5dGUqcC0+YW0tPm9mZnNldCk7CisJdnVtYXg9enVtYW5kKHZ1bWF4LHVsMnp1bSh0dV9tYXhbU0hPUlRdKSk7CisgICAgICB9CisgICAgICBlbWl0KGYsIiMlbHUiLHp1bTJ1bCh2dW1heCkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZihmbGFnczxQT1NUX0lOQ3x8ZmxhZ3M+UFJFX0RFQ3x8Q1BVPT02ODEyKQorICAgICAgZW1pdChmLCIlbGQiLHAtPmFtLT5vZmZzZXQmdHVfbWF4W1NIT1JUXSk7CisgICAgaWYocC0+YW0tPnYpeworICAgICAgaWYocC0+YW0tPnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQykKKwllbWl0KGYsIislcyVsZCIsbGFicHJlZml4LHptMmwocC0+YW0tPnYtPm9mZnNldCkpOworICAgICAgZWxzZQorCWVtaXQoZiwiKyglcyVzKSIsaWRwcmVmaXgscC0+YW0tPnYtPmlkZW50aWZpZXIpOworICAgIH0KKyAgICBlbWl0KGYsIiwiKTsKKyAgICBpZihmbGFncz09UFJFX0lOQyl7CisgICAgICBlbWl0KGYsIisiKTsKKyAgICAgIGlmKHAtPmFtLT5vZmZzZXQ9PTImJkNQVSE9NjgxMikgZW1pdChmLCIrIik7CisgICAgfWVsc2UgaWYoZmxhZ3M9PVBSRV9ERUMpeworICAgICAgZW1pdChmLCItIik7CisgICAgICBpZihwLT5hbS0+b2Zmc2V0PT0yJiZDUFUhPTY4MTIpIGVtaXQoZiwiLSIpOworICAgIH0KKyAgICBlbWl0KGYsIiVzIixyZWduYW1lc1twLT5hbS0+YmFzZV0pOworICAgIGlmKGZsYWdzPT1QT1NUX0lOQyl7CisgICAgICBlbWl0KGYsIisiKTsKKyAgICAgIGlmKHAtPmFtLT5vZmZzZXQ9PTImJkNQVSE9NjgxMikgZW1pdChmLCIrIik7CisgICAgfWVsc2UgaWYoZmxhZ3M9PVBPU1RfREVDKXsKKyAgICAgIGVtaXQoZiwiLSIpOworICAgICAgaWYocC0+YW0tPm9mZnNldD09MiYmQ1BVIT02ODEyKSBlbWl0KGYsIi0iKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGlmKChwLT5mbGFncyYoS09OU1R8RFJFRk9CSikpPT0oS09OU1R8RFJFRk9CSikpeworICAgIGVtaXR2YWwoZiwmcC0+dmFsLHAtPmR0eXAmTlUpOworICAgIHJldHVybjsKKyAgfQorICBpZihwLT5mbGFncyZWQVJBRFIpIGVtaXQoZiwiIyIpOworICBpZigocC0+ZmxhZ3MmKERSRUZPQkp8UkVHKSk9PShEUkVGT0JKfFJFRykpIGVtaXQoZiwiMCwiKTsKKyAgaWYoKHAtPmZsYWdzJihEUkVGT0JKfFJFRykpPT1EUkVGT0JKKSBlbWl0KGYsIlsiKTsKKyAgaWYoKHAtPmZsYWdzJihWQVJ8UkVHKSk9PVZBUil7CisgICAgaWYocC0+di0+c3RvcmFnZV9jbGFzcz09QVVUT3x8cC0+di0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpeworICAgICAgZW1pdChmLCIlbGQsJXMiLHZvZmYocCkscmVnbmFtZXNbc3BdKTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKCF6bWVxdG8obDJ6bSgwTCkscC0+dmFsLnZtYXgpKXsKKwllbWl0KGYsIiVsZCIsem0ybCh6aTJ6bSh6bTJ6aShwLT52YWwudm1heCkpKSk7CisJZW1pdChmLCIrIik7CisgICAgICB9CisgICAgICBpZihwLT52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpeworCWVtaXQoZiwiJXMlbGQiLGxhYnByZWZpeCx6bTJsKHAtPnYtPm9mZnNldCkpOworICAgICAgfWVsc2V7CisJZW1pdChmLCIoJXMlcykiLGlkcHJlZml4LHAtPnYtPmlkZW50aWZpZXIpOworICAgICAgfQorICAgICAgaWYocGNyZWwmJiEocC0+ZmxhZ3MmVkFSQURSKSYmSVNGVU5DKHAtPnYtPnZ0eXAtPmZsYWdzKSkKKwllbWl0KGYsIixwYyIpOworICAgICAgaWYoZHJlbCYmIShwLT5mbGFncyZWQVJBRFIpJiYhSVNGVU5DKHAtPnYtPnZ0eXAtPmZsYWdzKSl7CisJaWYoQ1BVPT02ODEyKSBpZXJyb3IoMCk7CisJZW1pdChmLCIsJXMiLHJlZ25hbWVzW2l1XSk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKHAtPmZsYWdzJlJFRyl7CisgICAgaWYoSVNBQ0MocC0+cmVnKSYmKHQmTlEpPT1DSEFSKQorICAgICAgZW1pdChmLCJiIik7CisgICAgZWxzZQorICAgICAgZW1pdChmLCIlcyIscmVnbmFtZXNbcC0+cmVnXSk7CisgIH0KKyAgaWYocC0+ZmxhZ3MmS09OU1QpeworICAgIGlmKElTRkxPQVQodCkpeworICAgICAgZW1pdChmLCIlcyVkIixsYWJwcmVmaXgsYWRkZnBjb25zdChwLHQpKTsKKyAgICB9ZWxzZXsKKyAgICAgIGVtaXQoZiwiIyIpO2VtaXR2YWwoZiwmcC0+dmFsLHQmTlUpOworICAgIH0KKyAgfQorICBpZigocC0+ZmxhZ3MmKERSRUZPQkp8UkVHKSk9PURSRUZPQkopeworICAgIGlmKHAtPnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTnx8cC0+di0+c3RvcmFnZV9jbGFzcz09U1RBVElDKXsKKyAgICAgIGlmKGlzX2NvbnN0KHAtPnYtPnZ0eXApKXsKKwlpZighcGNyZWwmJkNQVT09NjgxMikgZW1pdChmLCIscGMiKTsKKyAgICAgIH1lbHNleworCWlmKCFkcmVsJiZDUFU9PTY4MTIpIGVtaXQoZiwiLHBjIik7CisgICAgICB9CisgICAgfQorICAgIGVtaXQoZiwiXSIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGR3YXJmMl9wcmludF9mcmFtZV9sb2NhdGlvbihGSUxFICpmLHN0cnVjdCBWYXIgKnYpCit7CisgIC8qRklYTUU6IG5lZWRzIGEgbG9jYXRpb24gbGlzdCBhbmQgY29ycmVjdCByZWdpc3RlciB0cmFuc2xhdGlvbiAqLworICBzdHJ1Y3Qgb2JqIG87CisgIG8uZmxhZ3M9UkVHOworICBvLnJlZz1zcDsKKyAgby52YWwudm1heD1sMnptKDBMKTsKKyAgby52PTA7CisgIGR3YXJmMl9wcmludF9sb2NhdGlvbihmLCZvKTsKK30KK3N0YXRpYyBpbnQgZHdhcmYyX3JlZ251bWJlcihpbnQgcikKK3sKKyAgLypGSVhNRTogYWx3YXlzIHJldHVybnMgRCBhcyBhY2N1bXVsYXRvciwgZXZlbiBpZiBieXRlIHNpemUgKi8KKyAgc3RhdGljIGludCBkd2FyZl9yZWdzW01BWFIrMV09ey0xLDMsNyw4LDE1fTsKKyAgcmV0dXJuIGR3YXJmX3JlZ3Nbcl07Cit9CitzdGF0aWMgem1heCBkd2FyZjJfZmJvZmZzZXQoc3RydWN0IFZhciAqdikKK3sKKyAgLypGSVhNRSovCisgIGlmKCF2fHwodi0+c3RvcmFnZV9jbGFzcyE9QVVUTyYmdi0+c3RvcmFnZV9jbGFzcyE9UkVHSVNURVIpKSBpZXJyb3IoMCk7CisgIGlmKCF6bWxlcShsMnptKDBMKSx2LT5vZmZzZXQpKQorICAgIHJldHVybiBsMnptKChsb25nKShsb2ZmLXptMmwodi0+b2Zmc2V0KSkpOworICBlbHNlCisgICAgcmV0dXJuIHYtPm9mZnNldDsKK30gCisKKy8qIHRlc3Qgb3BlcmFuZCBmb3IgbW92IGluc3RydWN0aW9uICovCitzdGF0aWMgaW50IG1vdl9vcChzdHJ1Y3Qgb2JqICpvKQoreworICBsb25nIG9mZjsKKyAgaWYoQ1BVIT02ODEyKSByZXR1cm4gMDsKKyAgaWYoby0+YW0peworICAgIGludCBmPW8tPmFtLT5mbGFnczsKKyAgICBpZihmPT1QT1NUX0lOQ3x8Zj09UFJFX0lOQ3x8Zj09UE9TVF9ERUN8fGY9PVBSRV9ERUN8fGY9PUFDQ19JTkQpCisgICAgICByZXR1cm4gMTsKKyAgICBpZihmPT1JTU1fSU5EKXsKKyAgICAgIGlmKG8tPmFtLT52KSByZXR1cm4gMDsKKyAgICAgIG9mZj1vLT5hbS0+b2Zmc2V0OworICAgICAgaWYob2ZmPj0tMjU2JiZvZmY8PTI1NSkKKwlyZXR1cm4gMTsKKyAgICAgIGVsc2UKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgaWVycm9yKDApOworICB9CisgIGlmKG8tPmZsYWdzJihLT05TVHxWQVJBRFIpKSByZXR1cm4gMTsKKyAgaWYoKG8tPmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopKSByZXR1cm4gMTsKKyAgaWYoKG8tPmZsYWdzJihWQVJ8UkVHfERSRUZPQkopKT09VkFSKXsKKyAgICBpZihvLT52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUN8fG8tPnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTikKKyAgICAgIHJldHVybiAxOworICAgIG9mZj12b2ZmKG8pOworICAgIGlmKG9mZj49LTI1NiYmb2ZmPD0yNTUpCisgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyogYWRkIGFuIG9mZnNldCB0byBhbiBvYmplY3QgZGVzY3JpYmluZyBhIG1lbW9yeSBhZGRyZXNzICovCitzdGF0aWMgdm9pZCBpbmNfYWRkcihzdHJ1Y3Qgb2JqICpvLGxvbmcgdmFsLGludCB0KQoreworICBpZihvLT5hbSl7CisgICAgaW50IGY9by0+YW0tPmZsYWdzOworICAgIGlmKGY9PUlNTV9JTkR8fGY9PUtPTlNUSU5DKQorICAgICAgby0+YW0tPm9mZnNldCs9dmFsOworICAgIGVsc2UgaWYoZj09UE9TVF9JTkN8fGY9PVBPU1RfREVDfHxmPT1QUkVfSU5DfHxmPT1QUkVfREVDKXsKKyAgICAgIHN0cnVjdCBBZGRyZXNzaW5nTW9kZSAqb2xkPW8tPmFtOworICAgICAgby0+YW09bXltYWxsb2Moc2l6ZW9mKCpvLT5hbSkpOworICAgICAgby0+YW0tPmZsYWdzPUlNTV9JTkQ7CisgICAgICBvLT5hbS0+YmFzZT1vbGQtPmJhc2U7CisgICAgICBvLT5hbS0+dj0wOworICAgICAgaWYoZj09UE9TVF9ERUMpIG8tPmFtLT5vZmZzZXQ9b2xkLT5vZmZzZXQtdmFsOworICAgICAgZWxzZSBpZihmPT1QT1NUX0lOQykgby0+YW0tPm9mZnNldD0tb2xkLT5vZmZzZXQrdmFsOworICAgICAgZWxzZSBpZihmPT1QUkVfREVDKSBvLT5hbS0+b2Zmc2V0PXZhbDsKKyAgICAgIGVsc2Ugby0+YW0tPm9mZnNldD0tdmFsOworICAgIH1lbHNlCisgICAgICBpZXJyb3IoMCk7CisgIH1lbHNlIGlmKG8tPmZsYWdzJkRSRUZPQkopeworICAgIHN0cnVjdCBBZGRyZXNzaW5nTW9kZSAqYW07CisgICAgby0+YW09YW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworICAgIGFtLT5mbGFncz1JTU1fSU5EOworICAgIGlmKCFvLT5yZWcpIGllcnJvcigwKTsKKyAgICBhbS0+YmFzZT1vLT5yZWc7CisgICAgYW0tPm9mZnNldD16bTJsKHZhbCk7CisgICAgYW0tPnY9MDsKKyAgfWVsc2UgaWYoby0+ZmxhZ3MmS09OU1QpeworICAgIHN0cnVjdCBBZGRyZXNzaW5nTW9kZSAqYW07CisgICAgaWYoby0+YW0pIGllcnJvcigwKTsKKyAgICBvLT5hbT1hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CisgICAgYW0tPmZsYWdzPUtPTlNUSU5DOworICAgIGFtLT5vZmZzZXQ9em0ybCh2YWwpOworICAgIGFtLT5iYXNlPXQ7CisgIH1lbHNleworICAgIG8tPnZhbC52bWF4PXptYWRkKG8tPnZhbC52bWF4LHZhbCk7CisgIH0KK30KKworLyogcHVzaGVkIG9uIHRoZSBzdGFjayBieSBhIGNhbGxlZSwgbm8gcG9wIG5lZWRlZCAqLworc3RhdGljIHZvaWQgY2FsbGVlX3B1c2gobG9uZyBsKQoreworICBpZihsLXN0YWNrb2Zmc2V0PnN0YWNrKQorICAgIHN0YWNrPWwtc3RhY2tvZmZzZXQ7Cit9CitzdGF0aWMgdm9pZCBwdXNoKGxvbmcgbCkKK3sKKyAgc3RhY2tvZmZzZXQtPWw7CisgIGlmKHN0YWNrb2Zmc2V0PG1heHB1c2hlZCkgbWF4cHVzaGVkPXN0YWNrb2Zmc2V0OworICBpZigtbWF4cHVzaGVkPnN0YWNrKSBzdGFjaz0tbWF4cHVzaGVkOworfQorc3RhdGljIHZvaWQgcG9wKGxvbmcgbCkKK3sKKyAgc3RhY2tvZmZzZXQrPWw7Cit9CitzdGF0aWMgdm9pZCBnZW5fcG9wKEZJTEUgKmYsbG9uZyBsKQoreworICBpZihsPT0wKSByZXR1cm47CisgIGlmKGw9PTEmJkNQVT09NjgxMil7CisgICAgZW1pdChmLCJcdGluc1xuIik7CisjaWYgMCAvKiBtaWdodCBjbG9iYmVyIHJldHVybiByZWdpc3RlciAqLworICB9ZWxzZSBpZihsPT0yJiYhcmVnc1thY2NdKXsKKyAgICBlbWl0KGYsU1BVTExEKTsKKyAgICBCU0VUKHJlZ3NfbW9kaWZpZWQsYWNjKTsKKyAgfWVsc2UgaWYobD09MiYmIXJlZ3NbaXhdKXsKKyAgICBlbWl0KGYsU1BVTEwoIngiKSk7CisgICAgQlNFVChyZWdzX21vZGlmaWVkLGl4KTsKKyAgfWVsc2UgaWYobD09MiYmIXJlZ3NbaXldKXsKKyAgICBlbWl0KGYsU1BVTEwoInkiKSk7CisgICAgQlNFVChyZWdzX21vZGlmaWVkLGl5KTsKKyNlbmRpZgorICB9ZWxzZXsKKyAgICBlbWl0KGYsIlx0bGVhc1x0JXUsJXNcbiIsU0dOMTYobCkscmVnbmFtZXNbc3BdKTsKKyAgfQorICBwb3AobCk7Cit9CitzdGF0aWMgdm9pZCBwcihGSUxFICpmLHN0cnVjdCBJQyAqcCkKK3sKKyAgaW50IHI7CisgIGlmKHB1c2hlZF9hY2MpeworICAgIGVtaXQoZixTUFVMTEQpOworICAgIHBvcCgyKTsKKyAgICBwdXNoZWRfYWNjPTA7CisgIH0KKyAgZm9yKHI9TUFYUjtyPj0xO3ItLSl7CisgICAgaWYocmVnc1tyXSY4KXsKKyAgICAgIGVtaXQoZiwiXHQlcyVzXG4iLENQVT09NjgxMj8icHVsIjoicHVsc1x0IixyZWduYW1lc1tyXSk7CisgICAgICBwb3AoMik7CisgICAgfQorICAgIHJlZ3Nbcl0mPX4xMjsKKyAgfQorfQorc3RhdGljIHZvaWQgZnVuY3Rpb25fdG9wKEZJTEUgKmYsc3RydWN0IFZhciAqdixsb25nIG9mZnNldCkKKy8qICBlcnpldWd0IEZ1bmt0aW9uc2tvcGYgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBpOworICBlbWl0KGYsIiMgb2Zmc2V0PSVsZFxuIixvZmZzZXQpOworICBoYXZlX2ZyYW1lPTA7c3RhY2tfdmFsaWQ9MTtzdGFjaz0wOworICBpZighc3BlY2lhbF9zZWN0aW9uKGYsdikmJnNlY3Rpb24hPUNPREUpe2VtaXQoZixjb2RlbmFtZSk7aWYoZikgc2VjdGlvbj1DT0RFO30KKyAgaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKKyAgICBpZigodi0+ZmxhZ3MmKElOTElORUZVTkN8SU5MSU5FRVhUKSkhPUlOTElORUZVTkMpCisgICAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXMlc1xuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICBlbWl0KGYsIiVzJXM6XG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICB9ZWxzZXsKKyAgICBlbWl0KGYsIiVzJWxkOlxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKyAgfQorICByb2ZmPTA7CisgIGZvcihpPU1BWFI7aT4wO2ktLSl7CisgICAgaWYocmVndXNlZFtpXSYmIXJlZ3NjcmF0Y2hbaV0mJiFyZWdzYVtpXSl7CisgICAgICBoYXZlX2ZyYW1lPTE7CisgICAgICBsb2ZmKz0yOworICAgICAgcm9mZis9MjsKKyAgICAgIGlmKGk9PWl5KSBlbWl0KGYsU1BVU0goInkiKSk7CisgICAgICBlbHNlIGlmKGk9PWl1KXsKKwlpZihDUFUhPTY4MTImJnJlZ3VzZWRbaXldKXsKKwkgIGVtaXQoZiwiXHRwc2hzXHR1LHlcbiIpOworCSAgbG9mZis9Mjtyb2ZmKz0yO2k9aXk7CisJfWVsc2UKKwkgIGVtaXQoZixTUFVTSCgidSIpKTsKKyAgICAgIH1lbHNlCisJaWVycm9yKDApOworICAgIH0KKyAgfQorICBpZihzdGFja19jaGVjayl7CisgICAgc3RhY2tjaGVja2xhYmVsPSsrbGFiZWw7CisgICAgZW1pdChmLCJcdGxkeVx0IyVzJWRcbiIsbGFicHJlZml4LHN0YWNrY2hlY2tsYWJlbCk7CisgICAgLyogRklYTUU6IGJhbmtlZCAqLworICAgIGVtaXQoZiwiXHQlc1x0JXNfX3N0YWNrX2NoZWNrXG4iLGpzcmluc3QsaWRwcmVmaXgpOworICB9CisgIGlmKG9mZnNldCl7CisgICAgaWYoQ1BVPT02ODEyJiZvZmZzZXQ9PTEpCisgICAgICBlbWl0KGYsU1BVU0goImIiKSk7CisgICAgZWxzZSBpZihDUFU9PTY4MTImJm9mZnNldD09MikKKyAgICAgIGVtaXQoZixTUFVTSEQpOworICAgIGVsc2UKKyAgICAgIGVtaXQoZiwiXHRsZWFzXHQlbGQsJXNcbiIsU0dOMTYoLW9mZnNldCkscmVnbmFtZXNbc3BdKTsKKyAgICBoYXZlX2ZyYW1lPTE7CisgIH0KK30KK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX2JvdHRvbShGSUxFICpmLHN0cnVjdCBWYXIgKnYsbG9uZyBvZmZzZXQpCisvKiAgZXJ6ZXVndCBGdW5rdGlvbnNlbmRlICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgaTsKKyAgb2Zmc2V0LT1yb2ZmOworICBpZihvZmZzZXQpeworICAgIGlmKG9mZnNldD09MSYmQ1BVPT02ODEyKQorICAgICAgZW1pdChmLCJcdGluc1xuIik7CisgICAgZWxzZSBpZihvZmZzZXQ9PTImJkNQVT09NjgxMiYmIXptZXF0byhzem9mKHYtPnZ0eXAtPm5leHQpLGwyem0oNEwpKSkKKyAgICAgIGVtaXQoZixTUFVMTCgieCIpKTsKKyAgICBlbHNlIGlmKG9mZnNldD09MiYmQ1BVPT02ODEyJiZyZWd1c2VkW2l5XSkKKyAgICAgIGVtaXQoZixTUFVMTCgieSIpKTsKKyAgICBlbHNlCisgICAgICBlbWl0KGYsIlx0bGVhc1x0JWxkLCVzXG4iLFNHTjE2KG9mZnNldCkscmVnbmFtZXNbc3BdKTsKKyAgfQorICBmb3IoaT0xO2k8PU1BWFI7aSsrKXsKKyAgICBpZihyZWd1c2VkW2ldJiYhcmVnc2NyYXRjaFtpXSYmIXJlZ3NhW2ldKXsKKyAgICAgIGhhdmVfZnJhbWU9MTsKKyAgICAgIGlmKGk9PWl5KXsKKwlpZihDUFUhPTY4MTImJnJlZ3VzZWRbaXVdJiYhcmVnc2NyYXRjaFtpdV0mJiFyZWdzYVtpdV0peworCSAgZW1pdChmLCJcdHB1bHNcdHUseVxuIik7CisJICBpPWl1OworCX1lbHNlCisJICBlbWl0KGYsU1BVTEwoInkiKSk7CisgICAgICB9ZWxzZSBpZihpPT1pdSkgZW1pdChmLFNQVUxMKCJ1IikpOworICAgICAgZWxzZQorCWllcnJvcigwKTsKKyAgICB9CisgIH0KKyAgaWYocmV0KSBlbWl0KGYsIlx0JXNcbiIscmV0KTsKKyAgaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKKyAgICBlbWl0KGYsIlx0LnR5cGVcdCVzJXMsQGZ1bmN0aW9uXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgIGVtaXQoZiwiXHQuc2l6ZVx0JXMlcywkLSVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgfWVsc2V7CisgICAgZW1pdChmLCJcdC50eXBlXHQlcyVsZCxAZnVuY3Rpb25cbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgZW1pdChmLCJcdC5zaXplXHQlcyVsZCwkLSVzJWxkXG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCksbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgIH0KKyAgaWYoc3RhY2tfY2hlY2spCisgICAgZW1pdChmLCJcdC5lcXVcdCVzJWQsJWxkXG4iLGxhYnByZWZpeCxzdGFja2NoZWNrbGFiZWwsb2Zmc2V0LW1heHB1c2hlZCk7CisgIGlmKHN0YWNrX3ZhbGlkKXsKKyAgICBpZighdi0+ZmkpIHYtPmZpPW5ld19maSgpOworICAgIHYtPmZpLT5mbGFnc3w9QUxMX1NUQUNLOworICAgIHYtPmZpLT5zdGFjazE9bDJ6bShzdGFjaytvZmZzZXQpOworICAgIGVtaXQoZiwiIyBzdGFja3NpemU9JWxkXG4iLHN0YWNrK29mZnNldCk7CisgICAgZW1pdChmLCJcdC5lcXVcdCVzX19zdGFja18lcywlbGRcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcixzdGFjaytvZmZzZXQpOworICB9Cit9CitzdGF0aWMgaW50IGNvbXBhcmVfb2JqZWN0cyhzdHJ1Y3Qgb2JqICpvMSxzdHJ1Y3Qgb2JqICpvMikKK3sKKyAgaWYobzEtPmZsYWdzPT1vMi0+ZmxhZ3MmJm8xLT5hbT09bzItPmFtKXsKKyAgICBpZighKG8xLT5mbGFncyZWQVIpfHwobzEtPnY9PW8yLT52JiZ6bWVxdG8obzEtPnZhbC52bWF4LG8yLT52YWwudm1heCkpKXsKKyAgICAgIGlmKCEobzEtPmZsYWdzJlJFRyl8fG8xLT5yZWc9PW8yLT5yZWcpeworCXJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworLypGSVhNRSovCitzdGF0aWMgdm9pZCBjbGVhcl9leHRfaWMoc3RydWN0IGV4dF9pYyAqcCkKK3sKKyAgcC0+ZmxhZ3M9MDsKKyAgcC0+cj0wOworICBwLT5vZmZzZXQ9MDsKK30KK3N0YXRpYyBsb25nIHBvZjIoenVtYXggeCkKKy8qICBZaWVsZHMgbG9nMih4KSsxIG9kZXIgMC4gKi8KK3sKKyAgenVtYXggcDtpbnQgbG49MTsKKyAgcD11bDJ6dW0oMUwpOworICB3aGlsZShsbjw9MzImJnp1bWxlcShwLHgpKXsKKyAgICBpZih6dW1lcXRvKHgscCkpIHJldHVybiBsbjsKKyAgICBsbisrO3A9enVtYWRkKHAscCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CitzdGF0aWMgdm9pZCBwZWVwaG9sZShzdHJ1Y3QgSUMgKnApCit7CisgIGludCBjLGMyLHIsdDtzdHJ1Y3QgSUMgKnAyOworICBzdHJ1Y3QgQWRkcmVzc2luZ01vZGUgKmFtOworICB6bWF4IGluY21pbixpbmNtYXg7CisgIGlmKENQVT09NjgxMil7CisgICAgaW5jbWluPWwyem0oLThMKTsKKyAgICBpbmNtYXg9bDJ6bSg4TCk7CisgIH1lbHNleworICAgIGluY21pbj1sMnptKC0yTCk7CisgICAgaW5jbWF4PWwyem0oMkwpOworICB9CisgIGZyYW1lX3VzZWQ9MDsKKyAgZm9yKDtwO3A9cC0+bmV4dCl7CisgICAgYz1wLT5jb2RlOworICAgIGlmKCFmcmFtZV91c2VkKXsKKyAgICAgIGlmKChwLT5xMS5mbGFncyYoUkVHfFZBUikpPT1WQVImJiFJU1NUQVRJQyhwLT5xMS52KSkgZnJhbWVfdXNlZD0xOworICAgICAgaWYoKHAtPnEyLmZsYWdzJihSRUd8VkFSKSk9PVZBUiYmIUlTU1RBVElDKHAtPnEyLnYpKSBmcmFtZV91c2VkPTE7CisgICAgICBpZigocC0+ei5mbGFncyYoUkVHfFZBUikpPT1WQVImJiFJU1NUQVRJQyhwLT56LnYpKSBmcmFtZV91c2VkPTE7CisgICAgfQorICAgIC8qIGxldHp0ZXMgTGFiZWwgbWVya2VuICovCisgICAgaWYoYyE9RlJFRVJFRyYmYyE9QUxMT0NSRUcmJihjIT1TRVRSRVRVUk58fCFpc3JlZyhxMSl8fHAtPnExLnJlZyE9cC0+ei5yZWcpKSBleGl0X2xhYmVsPTA7CisgICAgaWYoYz09TEFCRUwpIGV4aXRfbGFiZWw9cC0+dHlwZjsKKyNpZiAwCisgICAgLyogYW5kIHgsI2NvbnN0O2JuZS9iZXEsIEZJWE1FICovCisgICAgaWYoYz09QU5EJiZpc2NvbnN0KHEyKSYmaXNyZWcoeikpeworICAgICAgbG9uZyBiaXQ7CisgICAgICBldmFsX2NvbnN0KCZwLT5xMi52YWwscC0+dHlwZik7CisgICAgICBpZihiaXQ9cG9mMih2dW1heCkpeworCXN0cnVjdCBJQyAqY21wPTA7aW50IGZyPTA7CisJZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpeworCSAgYzI9cDItPmNvZGU7CisJICBpZihjMj09VEVTVCl7CisJICAgIGlmKChwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09cC0+ei5yZWcpeworCSAgICAgIGNtcD1wMjtjb250aW51ZTsKKwkgICAgfQorCSAgfQorCSAgaWYoYzI9PUNPTVBBUkUmJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09cC0+ei5yZWcmJihwMi0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworCSAgICBldmFsX2NvbnN0KCZwMi0+cTIudmFsLHAyLT50eXBmKTsKKwkgICAgaWYoSVNOVUxMKCkpeworCSAgICAgIGNtcD1wMjtjb250aW51ZTsKKwkgICAgfQorCSAgICBicmVhazsKKwkgIH0KKwkgIGlmKGMyPT1GUkVFUkVHJiZwMi0+cTEucmVnPT1wLT56LnJlZykge2ZyKys7Y29udGludWU7fQorCSAgaWYoKGMyPT1CTkV8fGMyPT1CRVEpJiZjbXAmJmZyPT0xKXsKKwkgICAgcC0+ZXh0LmZsYWdzPUVYVF9JQ19CVFNUOworCSAgICBwMi0+ZXh0LmZsYWdzPUVYVF9JQ19CVFNUOworCSAgICBwMi0+ZXh0Lm9mZnNldD1iaXQtMTsKKwkgICAgY21wLT5jb2RlPU5PUDsKKwkgICAgY21wLT5xMS5mbGFncz1jbXAtPnEyLmZsYWdzPWNtcC0+ei5mbGFncz0wOworCSAgICBicmVhazsKKwkgIH0KKwkgIGlmKCgocDItPnExLmZsYWdzJlJFRykmJnAyLT5xMS5yZWc9PXAtPnoucmVnKXx8KChwMi0+cTIuZmxhZ3MmUkVHKSYmcDItPnEyLnJlZz09cC0+ei5yZWcpfHwoKHAyLT56LmZsYWdzJlJFRykmJnAyLT56LnJlZz09cC0+ei5yZWcpKSBicmVhazsKKwkgIGlmKGMyPT1DQUxMfHxjMj09TEFCRUx8fChjMj49QkVRJiZjMjw9QlJBKSkgYnJlYWs7CisJfQorICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIC8qIFRyeSBkLGlkeCAqLworICAgIGlmKGM9PUFEREkyUCYmSVNSQUNDKHEyKSYmSVNSSURYKHopJiYoSVNSSURYKHExKXx8cC0+cTIucmVnIT1wLT56LnJlZykpeworICAgICAgaW50IGJhc2UsaWR4O3N0cnVjdCBvYmogKm87CisgICAgICByPXAtPnoucmVnO2lkeD1wLT5xMi5yZWc7CisgICAgICBpZihpc3JlZyhxMSkpIGJhc2U9cC0+cTEucmVnOyBlbHNlIGJhc2U9cjsKKyAgICAgIG89MDsKKyAgICAgIGZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKyAgICAgICAgYzI9cDItPmNvZGU7CisgICAgICAgIGlmKGMyPT1DQUxMfHxjMj09TEFCRUx8fChjMj49QkVRJiZjMjw9QlJBKSkgYnJlYWs7CisgICAgICAgIGlmKGMyIT1GUkVFUkVHJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMS5yZWc9PXIpIGJyZWFrOworICAgICAgICBpZihjMiE9RlJFRVJFRyYmKHAyLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTIucmVnPT1yKSBicmVhazsKKyAgICAgICAgaWYoKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT56LnJlZz09aWR4JiZpZHghPXIpIGJyZWFrOworCQorICAgICAgICBpZihjMiE9Q0FMTCYmKGMyPExBQkVMfHxjMj5CUkEpLyomJmMyIT1BRERSRVNTKi8peworICAgICAgICAgIGlmKCFwMi0+cTEuYW0mJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT5xMS5yZWc9PXIpeworICAgICAgICAgICAgaWYob3x8IUlTQ0hXT1JEKHExdHlwKHAyKSkpIGJyZWFrOworICAgICAgICAgICAgbz0mcDItPnExOworICAgICAgICAgIH0KKyAgICAgICAgICBpZighcDItPnEyLmFtJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTIucmVnPT1yKXsKKwkgICAgYnJlYWs7IC8qVE9ETzogY2hlY2sgd2hhdCBpcyBwb3NzaWJsZSAqLworICAgICAgICAgICAgaWYob3x8IUlTQ0hXT1JEKHEydHlwKHAyKSkpIGJyZWFrOworICAgICAgICAgICAgbz0mcDItPnEyOworICAgICAgICAgIH0KKyAgICAgICAgICBpZighcDItPnouYW0mJihwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnoucmVnPT1yKXsKKwkgICAgYnJlYWs7IC8qVE9ETzogY2hlY2sgd2hhdCBpcyBwb3NzaWJsZSAqLworICAgICAgICAgICAgaWYob3x8IUlTQ0hXT1JEKHp0eXAocDIpKSkgYnJlYWs7CisgICAgICAgICAgICBvPSZwMi0+ejsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoYzI9PUZSRUVSRUd8fChwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKyAgICAgICAgICBpbnQgbTsKKyAgICAgICAgICBpZihjMj09RlJFRVJFRykKKyAgICAgICAgICAgIG09cDItPnExLnJlZzsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtPXAyLT56LnJlZzsKKyAgICAgICAgICBpZihtPT1yKXsKKyAgICAgICAgICAgIGlmKG8peworICAgICAgICAgICAgICBvLT5hbT1hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CisgICAgICAgICAgICAgIGFtLT5mbGFncz1BQ0NfSU5EOworICAgICAgICAgICAgICBhbS0+YmFzZT1iYXNlOworCSAgICAgIGlmKGlkeCE9YWNjKSBpZXJyb3IoMCk7CisgICAgICAgICAgICAgIGFtLT5vZmZzZXQ9aWR4OworCSAgICAgIGlmKGlzcmVnKHExKSl7CisJCXAtPmNvZGU9Yz1OT1A7cC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworCSAgICAgIH1lbHNleworCQlwLT5jb2RlPWM9QVNTSUdOO3AtPnEyLmZsYWdzPTA7CisJCXAtPnR5cGY9cC0+dHlwZjI7cC0+cTIudmFsLnZtYXg9c2l6ZXRhYltwLT50eXBmMiZOUV07CisJICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKGMyIT1GUkVFUkVHJiZtPT1iYXNlKSBicmVhazsKKwkgIGNvbnRpbnVlOworCX0KKwkvKiBiZXR0ZXIgbm8gaW5zdHJ1Y3Rpb25zIGJldHdlZW4sIGFjY3UgdXNlZCB0b28gbXVjaCAqLworCWlmKGMyIT1GUkVFUkVHJiZjMiE9QUxMT0NSRUcmJiFvKSBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgLyogUE9TVF9JTkMvREVDIGluIHExICovCisgICAgaWYoIXAtPnExLmFtJiYocC0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikpeworICAgICAgcj1wLT5xMS5yZWc7IHQ9cTF0eXAocCk7CisgICAgICBpZihJU0NIV09SRCh0KSYmSVNJRFgocikmJighKHAtPnEyLmZsYWdzJlJFRyl8fHAtPnEyLnJlZyE9cikmJighKHAtPnouZmxhZ3MmUkVHKXx8cC0+ei5yZWchPXIpKXsKKwlmb3IocDI9cC0+bmV4dDtwMjtwMj1wMi0+bmV4dCl7CisJICBjMj1wMi0+Y29kZTsKKwkgIGlmKChjMj09QUREfHxjMj09QURESTJQfHwoQ1BVPT02ODEyJiYoYzI9PVNVQnx8YzI9PVNVQklGUCkpKSYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09ciYmcDItPnoucmVnPT1yJiYocDItPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKwkgICAgZXZhbF9jb25zdCgmcDItPnEyLnZhbCxwMi0+dHlwZjIpOworCSAgICBpZihjMj09U1VCfHxjMj09U1VCSUZQKSB2bWF4PXptc3ViKGwyem0oMEwpLHZtYXgpOworCSAgICBpZih6bWxlcSh2bWF4LGluY21heCkmJnptbGVxKGluY21pbix2bWF4KSl7CisJICAgICAgcDItPmNvZGU9Tk9QOworCSAgICAgIHAyLT5xMS5mbGFncz1wMi0+cTIuZmxhZ3M9cDItPnouZmxhZ3M9MDsKKwkgICAgICBwLT5xMS5hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CisJICAgICAgcC0+cTEuYW0tPmJhc2U9cjsKKwkgICAgICBwLT5xMS5hbS0+dj0wOworCSAgICAgIGlmKHptbGVxKHZtYXgsbDJ6bSgwTCkpKXsKKwkJcC0+cTEuYW0tPmZsYWdzPVBPU1RfREVDOworCQlwLT5xMS5hbS0+b2Zmc2V0PS16bTJsKHZtYXgpOworCSAgICAgIH1lbHNleworCQlwLT5xMS5hbS0+ZmxhZ3M9UE9TVF9JTkM7CisJCXAtPnExLmFtLT5vZmZzZXQ9em0ybCh2bWF4KTsKKwkgICAgICB9CisJICAgIH1lbHNlIGJyZWFrOworCSAgfQorCSAgaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKKwkgIGlmKCgocDItPnExLmZsYWdzJlJFRykmJnAyLT5xMS5yZWc9PXIpfHwoKHAyLT5xMi5mbGFncyZSRUcpJiZwMi0+cTIucmVnPT1yKXx8KChwMi0+ei5mbGFncyZSRUcpJiZwMi0+ei5yZWc9PXIpKSBicmVhazsKKwl9CisgICAgICB9CisgICAgfQorICAgIC8qIFBPU1RfSU5DL0RFQyBpbiBxMiAqLworICAgIGlmKCFwLT5xMi5hbSYmKHAtPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopKXsKKyAgICAgIHI9cC0+cTIucmVnOyB0PXEydHlwKHApOworICAgICAgaWYoSVNDSFdPUkQodCkmJklTSURYKHIpJiYoIShwLT5xMS5mbGFncyZSRUcpfHxwLT5xMS5yZWchPXIpJiYoIShwLT56LmZsYWdzJlJFRyl8fHAtPnoucmVnIT1yKSl7CisJZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpeworCSAgYzI9cDItPmNvZGU7CisJICBpZigoYzI9PUFERHx8YzI9PUFEREkyUHx8KENQVT09NjgxMiYmKGMyPT1TVUJ8fGMyPT1TVUJJRlApKSkmJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMS5yZWc9PXImJnAyLT56LnJlZz09ciYmKHAyLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisJICAgIGV2YWxfY29uc3QoJnAyLT5xMi52YWwscDItPnR5cGYyKTsKKwkgICAgaWYoYzI9PVNVQnx8YzI9PVNVQklGUCkgdm1heD16bXN1YihsMnptKDBMKSx2bWF4KTsKKwkgICAgaWYoem1sZXEodm1heCxpbmNtYXgpJiZ6bWxlcShpbmNtaW4sdm1heCkpeworCSAgICAgIHAyLT5jb2RlPU5PUDsKKwkgICAgICBwMi0+cTEuZmxhZ3M9cDItPnEyLmZsYWdzPXAyLT56LmZsYWdzPTA7CisJICAgICAgcC0+cTIuYW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworCSAgICAgIHAtPnEyLmFtLT5iYXNlPXI7CisJICAgICAgcC0+cTIuYW0tPnY9MDsKKwkgICAgICBpZih6bWxlcSh2bWF4LGwyem0oMEwpKSl7CisJCXAtPnEyLmFtLT5mbGFncz1QT1NUX0RFQzsKKwkJcC0+cTIuYW0tPm9mZnNldD0tem0ybCh2bWF4KTsKKwkgICAgICB9ZWxzZXsKKwkJcC0+cTIuYW0tPmZsYWdzPVBPU1RfSU5DOworCQlwLT5xMi5hbS0+b2Zmc2V0PXptMmwodm1heCk7CisJICAgICAgfQorCSAgICB9ZWxzZSBicmVhazsKKwkgIH0KKwkgIGlmKGMyPT1DQUxMfHxjMj09TEFCRUx8fChjMj49QkVRJiZjMjw9QlJBKSkgYnJlYWs7CisJICBpZigoKHAyLT5xMS5mbGFncyZSRUcpJiZwMi0+cTEucmVnPT1yKXx8KChwMi0+cTIuZmxhZ3MmUkVHKSYmcDItPnEyLnJlZz09cil8fCgocDItPnouZmxhZ3MmUkVHKSYmcDItPnoucmVnPT1yKSkgYnJlYWs7CisJfQorICAgICAgfQorICAgIH0KKyAgICAvKiBQT1NUX0lOQy9ERUMgaW4geiAqLworICAgIGlmKCFwLT56LmFtJiYocC0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSl7CisgICAgICByPXAtPnoucmVnOyB0PXp0eXAocCk7CisgICAgICBpZihJU0NIV09SRCh0KSYmSVNJRFgocikmJighKHAtPnExLmZsYWdzJlJFRyl8fHAtPnExLnJlZyE9cikmJighKHAtPnEyLmZsYWdzJlJFRyl8fHAtPnEyLnJlZyE9cikpeworCWZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKwkgIGMyPXAyLT5jb2RlOworCSAgaWYoKGMyPT1BRER8fGMyPT1BRERJMlB8fChDUFU9PTY4MTImJihjMj09U1VCfHxjMj09U1VCSUZQKSkpJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJihwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1yJiZwMi0+ei5yZWc9PXImJihwMi0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworCSAgICBldmFsX2NvbnN0KCZwMi0+cTIudmFsLHAyLT50eXBmMik7CisJICAgIGlmKGMyPT1TVUJ8fGMyPT1TVUJJRlApIHZtYXg9em1zdWIobDJ6bSgwTCksdm1heCk7CisJICAgIGlmKHptbGVxKHZtYXgsaW5jbWF4KSYmem1sZXEoaW5jbWluLHZtYXgpKXsKKwkgICAgICBwMi0+Y29kZT1OT1A7CisJICAgICAgcDItPnExLmZsYWdzPXAyLT5xMi5mbGFncz1wMi0+ei5mbGFncz0wOworCSAgICAgIHAtPnouYW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworCSAgICAgIHAtPnouYW0tPmJhc2U9cjsKKwkgICAgICBwLT56LmFtLT52PTA7CisJICAgICAgaWYoem1sZXEodm1heCxsMnptKDBMKSkpeworCQlwLT56LmFtLT5mbGFncz1QT1NUX0RFQzsKKwkJcC0+ei5hbS0+b2Zmc2V0PS16bTJsKHZtYXgpOworCSAgICAgIH1lbHNleworCQlwLT56LmFtLT5mbGFncz1QT1NUX0lOQzsKKwkJcC0+ei5hbS0+b2Zmc2V0PXptMmwodm1heCk7CisJICAgICAgfQorCSAgICB9ZWxzZSBicmVhazsKKwkgIH0KKwkgIGlmKGMyPT1DQUxMfHxjMj09TEFCRUx8fChjMj49QkVRJiZjMjw9QlJBKSkgYnJlYWs7CisJICBpZigoKHAyLT5xMS5mbGFncyZSRUcpJiZwMi0+cTEucmVnPT1yKXx8KChwMi0+cTIuZmxhZ3MmUkVHKSYmcDItPnEyLnJlZz09cil8fCgocDItPnouZmxhZ3MmUkVHKSYmcDItPnoucmVnPT1yKSkgYnJlYWs7CisJfQorICAgICAgfQorICAgIH0KKworICAgIC8qIFIsI2MgKi8KKyAgICBpZigoYz09QURESTJQfHxjPT1TVUJJRlApJiZJU0hXT1JEKHAtPnR5cGYpJiYoKHAtPnR5cGYyJk5RKT09TlBPSU5URVJ8fChwLT50eXBmMiZOUSk9PUZQT0lOVEVSKSYmaXNyZWcoeikmJigocC0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1R8fCghZHJlbCYmKHAtPnExLmZsYWdzJlZBUkFEUikpKSl7CisgICAgICBpbnQgYmFzZTt6bWF4IG9mO3N0cnVjdCBvYmogKm87c3RydWN0IFZhciAqdjsKKyAgICAgIGlmKHAtPnExLmZsYWdzJlZBUkFEUil7CisJdj1wLT5xMS52OworCW9mPXAtPnExLnZhbC52bWF4OworCXI9cC0+ei5yZWc7CisJaWYoaXNyZWcocTIpJiZJU0lEWChwLT5xMi5yZWcpKQorCSAgYmFzZT1wLT5xMi5yZWc7CisJZWxzZQorCSAgYmFzZT1yOworICAgICAgfWVsc2V7CisJZXZhbF9jb25zdCgmcC0+cTIudmFsLHAtPnR5cGYpOworCWlmKGM9PVNVQklGUCkgb2Y9em1zdWIobDJ6bSgwTCksdm1heCk7IGVsc2Ugb2Y9dm1heDsKKwl2PTA7CisJcj1wLT56LnJlZzsKKwlpZihpc3JlZyhxMSkmJklTSURYKHAtPnExLnJlZykpIGJhc2U9cC0+cTEucmVnOyBlbHNlIGJhc2U9cjsKKyAgICAgIH0KKyAgICAgIG89MDsKKyAgICAgIGZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKwljMj1wMi0+Y29kZTsKKwlpZihjMj09Q0FMTHx8YzI9PUxBQkVMfHwoYzI+PUJFUSYmYzI8PUJSQSkpIGJyZWFrOworCWlmKGMyIT1GUkVFUkVHJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMS5yZWc9PXIpIGJyZWFrOworCWlmKGMyIT1GUkVFUkVHJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMi5yZWc9PXIpIGJyZWFrOworCWlmKGMyIT1DQUxMJiYoYzI8TEFCRUx8fGMyPkJSQSkvKiYmYzIhPUFERFJFU1MqLyl7CisJICBpZighcDItPnExLmFtJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTEucmVnPT1yKXsKKwkgICAgaWYob3x8IUlTSFdPUkQocTF0eXAocDIpKSkgYnJlYWs7CisJICAgIG89JnAyLT5xMTsKKwkgIH0KKwkgIGlmKCFwMi0+cTIuYW0mJihwMi0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT5xMi5yZWc9PXIpeworCSAgICBpZihvfHwhSVNIV09SRChxMnR5cChwMikpKSBicmVhazsKKwkgICAgbz0mcDItPnEyOworCSAgfQorCSAgaWYoIXAyLT56LmFtJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT56LnJlZz09cil7CisJICAgIGlmKG98fCFJU0hXT1JEKHp0eXAocDIpKSkgYnJlYWs7CisJICAgIG89JnAyLT56OworCSAgfQorCX0KKwlpZihjMj09RlJFRVJFR3x8KHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpeworCSAgaW50IG07CisJICBpZihjMj09RlJFRVJFRykgCisJICAgIG09cDItPnExLnJlZzsKKwkgIGVsc2UKKwkgICAgbT1wMi0+ei5yZWc7CisJICBpZihtPT1yKXsKKwkgICAgaWYobyl7CisJICAgICAgby0+YW09YW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworCSAgICAgIGFtLT5mbGFncz1JTU1fSU5EOworCSAgICAgIGFtLT5iYXNlPWJhc2U7CisJICAgICAgYW0tPm9mZnNldD16bTJsKG9mKTsKKwkgICAgICBhbS0+dj12OworCSAgICAgIGlmKCF2KXsKKwkJaWYoaXNyZWcocTEpJiZJU0lEWChwLT5xMS5yZWcpKXsKKwkJICBwLT5jb2RlPWM9Tk9QO3AtPnExLmZsYWdzPXAtPnEyLmZsYWdzPXAtPnouZmxhZ3M9MDsKKwkJfWVsc2V7CisJCSAgcC0+Y29kZT1jPUFTU0lHTjtwLT5xMi5mbGFncz0wOworCQkgIHAtPnR5cGY9cC0+dHlwZjI7cC0+cTIudmFsLnZtYXg9c2l6ZXRhYltwLT50eXBmMiZOUV07CisJCX0KKwkgICAgICB9ZWxzZXsKKwkJaWYoaXNyZWcocTIpJiZJU0lEWChwLT5xMi5yZWcpKXsKKwkJICBwLT5jb2RlPWM9Tk9QO3AtPnExLmZsYWdzPXAtPnEyLmZsYWdzPXAtPnouZmxhZ3M9MDsKKwkJfWVsc2V7CisJCSAgcC0+Y29kZT1jPUFTU0lHTjtwLT5xMT1wLT5xMjtwLT5xMi5mbGFncz0wOworCQkgIHAtPnEyLnZhbC52bWF4PXNpemV0YWJbcC0+dHlwZiZOUV07CisJCX0KKwkgICAgICB9CisJICAgIH0KKwkgICAgYnJlYWs7CisJICB9CisJICBpZigvKmdldF9yZWchISBjMiE9RlJFRVJFRyYmKi9tPT1iYXNlKSBicmVhazsKKwkgIGNvbnRpbnVlOworCX0KKyAgICAgIH0KKyAgICB9ICAgICAgCisgIH0KK30KKworc3RhdGljIHN0cnVjdCBvYmogKmNhbShpbnQgZmxhZ3MsaW50IGJhc2UsbG9uZyBvZmZzZXQsc3RydWN0IFZhciAqdikKKy8qICBJbml0aWFsaXplcyBhbiBhZGRyZXNzaW5nLW1vZGUgc3RydWN0dXJlIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byAgICovCisvKiAgdGhhdCBvYmplY3QuIFdpbGwgbm90IHN1cnZpdmUgYSBzZWNvbmQgY2FsbCEgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBzdGF0aWMgc3RydWN0IG9iaiBvYmo7CisgIHN0YXRpYyBzdHJ1Y3QgQWRkcmVzc2luZ01vZGUgYW07CisgIG9iai5hbT0mYW07CisgIGFtLmZsYWdzPWZsYWdzOworICBhbS5iYXNlPWJhc2U7CisgIGFtLm9mZnNldD1vZmZzZXQ7CisgIGFtLnY9djsKKyAgcmV0dXJuICZvYmo7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9hY2MoRklMRSAqZixzdHJ1Y3QgSUMgKnApCit7CisgIGlmKHJlZ3NbYWNjXSl7CisgICAgaWYocC0+cTIuYW0pCisgICAgICBpZihwLT5xMi5hbS0+ZmxhZ3M9PUFDQ19JTkQpIGllcnJvcigwKTsKKyAgICBlbHNlCisgICAgICBpZigocC0+cTIuZmxhZ3MmUkVHKSYmSVNBQ0MocC0+cTIucmVnKSkgaWVycm9yKDApOworICAgIGlmKHAtPnouYW0pCisgICAgICBpZihwLT56LmFtLT5mbGFncz09QUNDX0lORCkgaWVycm9yKDApOworICAgIGVsc2UKKyAgICAgIGlmKChwLT56LmZsYWdzJlJFRykmJklTQUNDKHAtPnoucmVnKSkgaWVycm9yKDApOworICAgIGlmKHJlZ3NbYWNjXSl7CisgICAgICBlbWl0KGYsU1BVU0hEKTsKKyAgICAgIHB1c2goMik7CisgICAgICBwdXNoZWRfYWNjPTE7CisgICAgfQorICB9Cit9CitzdGF0aWMgaW50IGdldF9pZHgoRklMRSAqZixJQyAqcCkKK3sKKyAgaW50IHI7CisgIGZvcihyPTE7cjw9TUFYUjtyKyspeworICAgIGlmKElTSURYKHIpKXsKKyAgICAgIGlmKCFyZWdzW3JdKXsKKwlyZWdzW3JdfD00OworCXJldHVybiByOworICAgICAgfQorICAgIH0KKyAgfQorICBmb3Iocj0xO3I8PU1BWFI7cisrKXsKKyAgICBpZihJU0lEWChyKSl7CisgICAgICBpZigoIShwLT5xMS5mbGFncyZSRUcpfHxwLT5xMS5yZWchPXIpJiYKKwkgKCEocC0+cTIuZmxhZ3MmUkVHKXx8cC0+cTIucmVnIT1yKSYmCisJICghKHAtPnouZmxhZ3MmUkVHKXx8cC0+ei5yZWchPXIpKXsKKwllbWl0KGYsIlx0JXMlc1xuIixDUFU9PTY4MTI/InBzaCI6InBzaHNcdCIscmVnbmFtZXNbcl0pOworCXJlZ3Nbcl18PTg7CisJcHVzaCgyKTsKKwlyZXR1cm4gcjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWVycm9yKDApOworfQorc3RhdGljIGludCBnZXRfcmVnKEZJTEUgKmYsc3RydWN0IElDICpwLGludCB0KQoreworICBpbnQgcmVnOworICBpZighcmVnc1thY2NdKQorICAgIHJlZz1hY2M7CisgIGVsc2UgaWYoSVNIV09SRCh0KSYmIXJlZ3NbaXhdKQorICAgIHJlZz1peDsKKyNpZiAwCisgIGVsc2UgaWYoSVNIV09SRCh0KSYmIXJlZ3NbaXldKQorICAgIHJlZz1peTsKKyNlbmRpZgorICBlbHNleworICAgIGdldF9hY2MoZixwKTsKKyAgICByZWc9YWNjOworICB9CisgIEJTRVQocmVnc19tb2RpZmllZCxyZWcpOworICByZXR1cm4gcmVnOworfQorc3RhdGljIHZvaWQgbG9hZF9yZWcoRklMRSAqZixpbnQgcixzdHJ1Y3Qgb2JqICpvLGludCB0KQoreworICBpZighby0+YW0peworICAgIGlmKChvLT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKyAgICAgIGlmKG8tPnJlZz09cikgcmV0dXJuOworICAgICAgZW1pdChmLCJcdHRmclx0JXMsJXNcbiIscmVnbmFtZXNbby0+cmVnXSxyZWduYW1lc1tyXSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHI9PWFjYyYmKG8tPmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKyAgICAgIGV2YWxfY29uc3QoJm8tPnZhbCx0KTsKKyAgICAgIGlmKHptZXF0byh2bWF4LGwyem0oMEwpKSYmenVtZXF0byh2dW1heCx1bDJ6dW0oMFVMKSkpeworCWlmKENQVSE9NjgxMiYmIW9wdHNpemUpCisJICBlbWl0KGYsIlx0bGRkXHQjMFxuIik7CisJZWxzZQorCSAgZW1pdChmLCJcdGNscmFcblx0Y2xyYlxuIik7IAorCWNjPW87Y2NfdD10OworCXJldHVybjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoby0+ZmxhZ3MmVkFSQURSKXsKKyAgICBjaGFyICpiYXNlPTA7CisgICAgaWYocGNyZWwmJklTRlVOQyhvLT52LT52dHlwLT5mbGFncykpCisgICAgICBiYXNlPSJwYyI7CisgICAgaWYoZHJlbCYmIUlTRlVOQyhvLT52LT52dHlwLT5mbGFncykpCisgICAgICBiYXNlPXJlZ25hbWVzW2l1XTsKKyAgICBpZihiYXNlJiYhc2tpcF9yZWwpeworICAgICAgaWYoSVNBQ0MocikpCisJZW1pdChmLCJcdHRmclx0JXMsZFxuIixiYXNlKTsKKyAgICAgIGlmKElTSURYKHIpKQorCWVtaXQoZiwiXHRsZWElc1x0IixyZWduYW1lc1tyXSk7CisgICAgICBlbHNleworCWlmKCpiYXNlPT0ncCcpIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCWVtaXQoZiwiXHRhZGRkXHQjIik7CisgICAgICB9CisgICAgICBlbWl0em0oZixvLT52YWwudm1heCk7CisgICAgICBlbWl0KGYsIisiKTsKKyAgICAgIGlmKG8tPnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTikKKwllbWl0KGYsIiVzJXMiLGlkcHJlZml4LG8tPnYtPmlkZW50aWZpZXIpOworICAgICAgZWxzZQorCWVtaXQoZiwiJXMlbGQiLGxhYnByZWZpeCx6bTJsKG8tPnYtPm9mZnNldCkpOworICAgICAgaWYoSVNJRFgocikpCisJZW1pdChmLCIsJXMiLGJhc2UpOworICAgICAgZWxzZSBpZigqYmFzZT09J3AnKQorCWVtaXQoZiwiLSVzJWQiLGxhYnByZWZpeCxsYWJlbCk7CisgICAgICBlbWl0KGYsIlxuIik7CisgICAgICBjYz1vO2NjX3Q9dDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2tpcF9yZWw9MDsKKyAgfQorICBlbWl0KGYsIlx0bGQlc1x0Iiwocj09YWNjJiYodCZOUSk9PUNIQVIpPyhDUFU9PTY4MTI/ImFiIjoiYiIpOnJlZ25hbWVzW3JdKTsKKyAgZW1pdF9vYmooZixvLHQpO2VtaXQoZiwiXG4iKTsKKyAgY2M9bztjY190PXQ7Cit9CitzdGF0aWMgdm9pZCBzdG9yZV9yZWcoRklMRSAqZixpbnQgcixzdHJ1Y3Qgb2JqICpvLGludCB0KQoreworICBpZigoby0+ZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisgICAgaWYoby0+cmVnPT1yKSByZXR1cm47CisgICAgZW1pdChmLCJcdHRmclx0JXMsJXNcbiIscmVnbmFtZXNbcl0scmVnbmFtZXNbby0+cmVnXSk7CisgIH1lbHNleworICAgIGlmKHI9PWFjYyYmKHQmTlEpPT1DSEFSKQorICAgICAgZW1pdChmLCJcdHN0JXNcdCIsKENQVT09NjgxMik/ImFiIjoiYiIpOworICAgIGVsc2UKKyAgICAgIGVtaXQoZiwiXHRzdCVzXHQiLHJlZ25hbWVzW3JdKTsKKyAgICBlbWl0X29iaihmLG8sdCk7ZW1pdChmLCJcbiIpOworICAgIGNjPW87Y2NfdD10OworICB9Cit9CitzdGF0aWMgdm9pZCBsb2FkX2FkZHIoRklMRSAqZixpbnQgcixzdHJ1Y3Qgb2JqICpvKQoreworICBpZihvLT5hbSl7CisgICAgaWYoby0+YW0tPmZsYWdzPT1JTU1fSU5EKXsKKyAgICAgIGlmKG8tPmFtLT5iYXNlPT1yJiZvLT5hbS0+b2Zmc2V0PT0wJiYhby0+YW0tPnYpIHJldHVybjsKKyAgICAgIGlmKElTSURYKHIpKXsKKwllbWl0KGYsIlx0bGVhJXNcdCIscmVnbmFtZXNbcl0pOworCWVtaXRfb2JqKGYsbywwKTsKKwllbWl0KGYsIlxuIik7CisgICAgICB9ZWxzZXsKKwlpZihyIT1hY2MpIGllcnJvcigwKTsKKwllbWl0KGYsIlx0dGZyXHQlcywlc1xuIixyZWduYW1lc1tvLT5hbS0+YmFzZV0scmVnbmFtZXNbcl0pOworCWVtaXQoZiwiXHRhZGRkXHQjJWxkXG4iLG8tPmFtLT5vZmZzZXQpOworCWlmKG8tPmFtLT52KXsKKwkgIGlmKG8tPmFtLT52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpCisJICAgIGVtaXQoZiwiKyVzJWxkIixsYWJwcmVmaXgsem0ybChvLT5hbS0+di0+b2Zmc2V0KSk7CisJICBlbHNlCisJICAgIGVtaXQoZiwiKyVzJXMiLGlkcHJlZml4LG8tPmFtLT52LT5pZGVudGlmaWVyKTsKKwl9CisJZW1pdChmLCJcbiIpOworCWNjPTA7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGllcnJvcigwKTsKKyAgfQorICBpZihvLT5mbGFncyZEUkVGT0JKKXsKKyAgICBvLT5mbGFncyY9fkRSRUZPQko7CisgICAgbG9hZF9yZWcoZixyLG8sby0+ZHR5cCk7CisgICAgby0+ZmxhZ3N8PURSRUZPQko7CisgICAgcmV0dXJuOworICB9CisgIGlmKChvLT5mbGFncyYoVkFSfFZBUkFEUikpPT1WQVIpeworICAgIGlmKG8tPnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQ3x8by0+di0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKKyAgICAgIG8tPmZsYWdzfD1WQVJBRFI7CisgICAgICBsb2FkX3JlZyhmLHIsbyxQT0lOVEVSX1RZUEUoby0+di0+dnR5cCkpOworICAgICAgby0+ZmxhZ3MmPX5WQVJBRFI7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHZvZmYobyk9PTApeworICAgICAgZW1pdChmLCJcdHRmclx0JXMsJXNcbiIscmVnbmFtZXNbc3BdLHJlZ25hbWVzW3JdKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoSVNJRFgocikpeworICAgICAgZW1pdChmLCJcdGxlYSVzXHQiLHJlZ25hbWVzW3JdKTsKKyAgICAgIGVtaXRfb2JqKGYsbywwKTsKKyAgICAgIGVtaXQoZiwiXG4iKTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKHIhPWFjYykgaWVycm9yKDApOworICAgICAgZW1pdChmLCJcdHRmclx0JXMsJXNcbiIscmVnbmFtZXNbc3BdLHJlZ25hbWVzW3JdKTsKKyAgICAgIGVtaXQoZiwiXHRhZGRkXHQjJWxkXG4iLHZvZmYobykpOworICAgICAgY2M9MDsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGllcnJvcigwKTsKK30KKworc3RhdGljIGludCBzY3JhdGNocmVnKGludCByLHN0cnVjdCBJQyAqcCkKK3sKKyAgaW50IGM7CisgIHdoaWxlKDEpeworICAgIHA9cC0+bmV4dDsKKyAgICBpZighcHx8KChjPXAtPmNvZGUpPT1GUkVFUkVHJiZwLT5xMS5yZWc9PXIpKSByZXR1cm4gMTsKKyAgICBpZihjPT1DQUxMfHwoYz49QkVRJiZjPD1CUkEpKSByZXR1cm4gMDsKKyAgICBpZigocC0+cTEuZmxhZ3MmUkVHKSYmcC0+cTEucmVnPT1yKSByZXR1cm4gMDsKKyAgICBpZigocC0+cTIuZmxhZ3MmUkVHKSYmcC0+cTIucmVnPT1yKSByZXR1cm4gMDsKKyAgICBpZigocC0+ei5mbGFncyZSRUcpJiZwLT56LnJlZz09cikgcmV0dXJuIDA7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgRW5kIG9mIHByaXZhdGUgZmF0YSBhbmQgZnVuY3Rpb25zLiAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ludCBpbml0X2NnKHZvaWQpCisvKiAgRG9lcyBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb25zIGZvciB0aGUgY29kZS1nZW5lcmF0b3IuIEdldHMgY2FsbGVkICAqLworLyogIG9uY2UgYXQgdGhlIGJlZ2lubmluZyBhbmQgc2hvdWxkIHJldHVybiAwIGluIGNhc2Ugb2YgcHJvYmxlbXMuICAgICAgKi8KK3sKKyAgaW50IGk7CisKKyAgQ1BVPUNQVU9QVDsKKworCWlmIChDUFU9PTY4MDkxMikgeworCQliaXRzcGVyYnl0ZSA9IDEyOworCQlieXRlbWFzayA9IDB4ZmZmOworCQlkYmxfYnl0ZW1hc2sgPSAweGZmZmZmZjsKKwl9CisJCisgIC8qICBJbml0aWFsaXplIHNvbWUgdmFsdWVzIHdoaWNoIGNhbm5vdCBiZSBzdGF0aWNhbGx5IGluaXRpYWxpemVkICAgKi8KKyAgLyogIGJlY2F1c2UgdGhleSBhcmUgc3RvcmVkIGluIHRoZSB0YXJnZXQncyBhcml0aG1ldGljLiAgICAgICAgICAgICAqLworICBtYXhhbGlnbj1sMnptKDFMKTsKKyAgY2hhcl9iaXQ9bDJ6bSgobG9uZyliaXRzcGVyYnl0ZSk7CisgIGZvcihpPTA7aTw9TUFYX1RZUEU7aSsrKXsKKyAgICBzaXpldGFiW2ldPWwyem0obXNpemV0YWJbaV0pOworICAgIGFsaWduW2ldPWwyem0obWFsaWduW2ldKTsKKyAgfQorICBmb3IoaT0xO2k8PWl1O2krKyl7CisgICAgcmVnc2l6ZVtpXT1sMnptKDJMKTtyZWd0eXBlW2ldPSZpdHlwOworICB9CQorICByZWdzaXplW2R4XT1sMnptKDRMKTtyZWd0eXBlW2ldPSZsdHlwOworCisgIC8qICBJbml0aWFsaXplIHRoZSBtaW4vbWF4LXNldHRpbmdzLiBOb3RlIHRoYXQgdGhlIHR5cGVzIG9mIHRoZSAgICAgKi8KKyAgLyogIGhvc3Qgc3lzdGVtIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgdGFyZ2V0IHN5c3RlbSBhbmQgeW91IG1heSAqLworICAvKiAgb25seSB1c2UgdGhlIHNtYWxsZXN0IG1heGltdW0gdmFsdWVzIEFOU0kgZ3VhcmFudGVlcyBpZiB5b3UgICAgICovCisgIC8qICB3YW50IHRvIGJlIHBvcnRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIFRoYXQncyB0aGUgcmVhc29uIGZvciB0aGUgc3VidHJhY3Rpb24gaW4gdF9taW5bSU5UXS4gTG9uZyBjb3VsZCAqLworICAvKiAgYmUgdW5hYmxlIHRvIHJlcHJlc2VudCAtMjE0NzQ4MzY0OCBvbiB0aGUgaG9zdCBzeXN0ZW0uICAgICAgICAgICovCisgIGlmIChDUFU9PTY4MDkxMikgeworCSAgdF9taW5bQ0hBUl09bDJ6bSgtMjA0OEwpOworCSAgdF9taW5bU0hPUlRdPWwyem0oLTgzODg2MDhMKTsKKwkgIHRfbWluW0lOVF09dF9taW5bU0hPUlRdOworCSAgdF9taW5bTE9OR109em1zdWIobDJ6bSgweDgwMDAwMDAwMDAwMExMKSxsMnptKDFMKSk7CisJICB0X21pbltMTE9OR109em1sc2hpZnQobDJ6bSgxTCksbDJ6bSg2M0wpKTsKKwkgIHRfbWluW01BWElOVF09dF9taW4oTExPTkcpOworCSAgdF9tYXhbQ0hBUl09dWwyenVtKDIwNDdMKTsKKwkgIHRfbWF4W1NIT1JUXT11bDJ6dW0oODM4ODYwN1VMKTsKKwkgIHRfbWF4W0lOVF09dF9tYXhbU0hPUlRdOworCSAgdF9tYXhbTE9OR109dWwyenVtKDB4N2ZmZmZmZmZmZmZmVUxMKTsKKwkgIHRfbWF4W0xMT05HXT16dW1yc2hpZnQoenVta29tcGwodWwyenVtKDBVTCkpLHVsMnp1bSgxVUwpKTsKKwkgIHRfbWF4W01BWElOVF09dF9tYXgoTExPTkcpOworCSAgdHVfbWF4W0NIQVJdPXVsMnp1bSg0MDk1VUwpOworCSAgdHVfbWF4W1NIT1JUXT11bDJ6dW0oMTY3NzcyMTVVTCk7CisJICB0dV9tYXhbSU5UXT10dV9tYXhbU0hPUlRdOworCSAgdHVfbWF4W0xPTkddPXVsMnp1bSgweGZmZmZmZmZmZmZmZlVMTCk7CisJICB0dV9tYXhbTExPTkddPXp1bWtvbXBsKHVsMnp1bSgwVUwpKTsKKwkgIHR1X21heFtNQVhJTlRdPXRfbWF4KFVOU0lHTkVEfExMT05HKTsKKwl9CisJZWxzZSB7CisJICB0X21pbltDSEFSXT1sMnptKC0xMjhMKTsKKwkgIHRfbWluW1NIT1JUXT1sMnptKC0zMjc2OEwpOworCSAgdF9taW5bSU5UXT10X21pbltTSE9SVF07CisJICB0X21pbltMT05HXT16bXN1YihsMnptKC0yMTQ3NDgzNjQ3TCksbDJ6bSgxTCkpOworCSAgdF9taW5bTExPTkddPXptbHNoaWZ0KGwyem0oMUwpLGwyem0oNjNMKSk7CisJICB0X21pbltNQVhJTlRdPXRfbWluKExMT05HKTsKKwkgIHRfbWF4W0NIQVJdPXVsMnp1bSgxMjdMKTsKKwkgIHRfbWF4W1NIT1JUXT11bDJ6dW0oMzI3NjdVTCk7CisJICB0X21heFtJTlRdPXRfbWF4W1NIT1JUXTsKKwkgIHRfbWF4W0xPTkddPXVsMnp1bSgyMTQ3NDgzNjQ3VUwpOworCSAgdF9tYXhbTExPTkddPXp1bXJzaGlmdCh6dW1rb21wbCh1bDJ6dW0oMFVMKSksdWwyenVtKDFVTCkpOworCSAgdF9tYXhbTUFYSU5UXT10X21heChMTE9ORyk7CisJICB0dV9tYXhbQ0hBUl09dWwyenVtKDI1NVVMKTsKKwkgIHR1X21heFtTSE9SVF09dWwyenVtKDY1NTM1VUwpOworCSAgdHVfbWF4W0lOVF09dHVfbWF4W1NIT1JUXTsKKwkgIHR1X21heFtMT05HXT11bDJ6dW0oNDI5NDk2NzI5NVVMKTsKKwkgIHR1X21heFtMTE9OR109enVta29tcGwodWwyenVtKDBVTCkpOworCSAgdHVfbWF4W01BWElOVF09dF9tYXgoVU5TSUdORUR8TExPTkcpOworCX0KKworICBpZihnX2ZsYWdzWzldJlVTRURGTEFHKSBkcmVsPTE7CisgIGlmKGdfZmxhZ3NbMTBdJlVTRURGTEFHKSBNSU5BRERJMlA9U0hPUlQ7CisgIGlmKGdfZmxhZ3NbMTFdJlVTRURGTEFHKSBub2R4PTE7CisgIGlmKGdfZmxhZ3NbMTJdJlVTRURGTEFHKSBub3U9MTsKKworICBpZihDUFU9PTY4MTIpIHN3aXRjaHN1YnM9MTsKKworICAvKiAgUmVzZXJ2ZSBhIGZldyByZWdpc3RlcnMgZm9yIHVzZSBieSB0aGUgY29kZS1nZW5lcmF0b3IuICAgICAgKi8KKyAgcmVnc2Fbc3BdPVJFR1NBX05FVkVSOworICByZWdzY3JhdGNoW3NwXT0wOworCisgIGlmKENQVT09NjgxMnx8ZHJlbHx8bm91KXsKKyAgICByZWdzYVtpdV09UkVHU0FfTkVWRVI7CisgICAgcmVnc2NyYXRjaFtpdV09MDsKKyAgfQorCisgIGlmKENQVSE9NjgxMil7CisgICAgcmVnbmFtZXNbc3BdPSJzIjsKKyAgICBsb2dpY2Fsc1swXT0ib3IiOworICB9CisKKyAgaWYoIShnX2ZsYWdzWzZdJlVTRURGTEFHKSl7CisgICAgZXh0ZXJuIGludCBzdGF0aWNfY3NlLGRyZWZfY3NlOworICAgIHN0YXRpY19jc2U9MDsKKyAgICBkcmVmX2NzZT0wOworICB9CisKKyAgaWYoIShnX2ZsYWdzWzddJlVTRURGTEFHKSl7CisgICAgcmVnc2FbYWNjXT1SRUdTQV9URU1QUzsKKyAgICByZWdzYVtkeF09UkVHU0FfVEVNUFM7CisgIH0KKworICBpZihnX2ZsYWdzWzhdJlVTRURGTEFHKXsKKyAgICBwY3JlbD0xOworICAgIGpzcmluc3Q9Imxic3IiOworICAgIGptcGluc3Q9ImxicmEiOworICAgIHJvZGF0YW5hbWU9Ilx0LmRhdGFcbiI7CisgIH0KKworICBpZihDUFU9PTY4MDkpCisgICAgbWFycmF5WzFdPSJfXzY4MDlfXyI7CisgIGlmKENQVT09NjMwOSkKKyAgICBtYXJyYXlbMV09Il9fNjMwOV9fIjsKKyAgaWYoQ1BVPT02ODA5MTIpCisgICAgbWFycmF5WzFdPSJfXzY4MDkxMl9fIjsKKyAgdGFyZ2V0X21hY3Jvcz1tYXJyYXk7CisKKworICBkZWNsYXJlX2J1aWx0aW4oIl9fbXVsaW50MTYiLElOVCxJTlQsYWNjLElOVCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZpbnQxNiIsSU5ULElOVCxpeCxJTlQsYWNjLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZ1aW50MTYiLFVOU0lHTkVEfElOVCxVTlNJR05FRHxJTlQsaXgsVU5TSUdORUR8SU5ULGFjYywxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbW9kaW50MTYiLElOVCxJTlQsaXgsSU5ULGFjYywxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbW9kdWludDE2IixVTlNJR05FRHxJTlQsVU5TSUdORUR8SU5ULGl4LFVOU0lHTkVEfElOVCxhY2MsMSwwKTsKKworCisgIC8qIFRPRE86IHNldCBhcmd1bWVudCByZWdpc3RlcnMgKi8KKyAgZGVjbGFyZV9idWlsdGluKCJfX211bGludDMyIixMT05HLExPTkcsMCxMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2FkZGludDMyIixMT05HLExPTkcsMCxMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3N1YmludDMyIixMT05HLExPTkcsMCxMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2FuZGludDMyIixMT05HLExPTkcsMCxMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX29yaW50MzIiLExPTkcsTE9ORywwLExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZW9yaW50MzIiLExPTkcsTE9ORywwLExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbmVnaW50MzIiLExPTkcsTE9ORywwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbHNsaW50MzIiLExPTkcsTE9ORywwLElOVCwwLDEsMCk7CisKKyAgZGVjbGFyZV9idWlsdGluKCJfX2RpdmludDMyIixMT05HLExPTkcsMCxMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2RpdnVpbnQzMiIsVU5TSUdORUR8TE9ORyxVTlNJR05FRHxMT05HLDAsVU5TSUdORUR8TE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19tb2RpbnQzMiIsTE9ORyxMT05HLDAsTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19tb2R1aW50MzIiLFVOU0lHTkVEfExPTkcsVU5TSUdORUR8TE9ORywwLFVOU0lHTkVEfExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbHNyc2ludDMyIixMT05HLExPTkcsMCxJTlQsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbHNydWludDMyIixVTlNJR05FRHxMT05HLFVOU0lHTkVEfExPTkcsMCxJTlQsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fY21wc2ludDMyIixJTlQsTE9ORywwLExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fY21wdWludDMyIixJTlQsVU5TSUdORUR8TE9ORywwLFVOU0lHTkVEfExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDMydG9mbHQzMiIsRkxPQVQsTE9ORywwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fdWludDMydG9mbHQzMiIsRkxPQVQsVU5TSUdORUR8TE9ORywwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDMydG9mbHQ2NCIsRE9VQkxFLExPTkcsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3VpbnQzMnRvZmx0NjQiLERPVUJMRSxVTlNJR05FRHxMT05HLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvc2ludDMyIixMT05HLEZMT0FULDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvdWludDMyIixVTlNJR05FRHxMT05HLEZMT0FULDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQ2NHRvc2ludDMyIixMT05HLERPVUJMRSwwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b3VpbnQzMiIsVU5TSUdORUR8TE9ORyxET1VCTEUsMCwwLDAsMSwwKTsKKworCisKKyAgZGVjbGFyZV9idWlsdGluKCJfX211bGludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2FkZGludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3N1YmludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2FuZGludDY0IixMTE9ORyxMTE9ORywwLExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX29yaW50NjQiLExMT05HLExMT05HLDAsTExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZW9yaW50NjQiLExMT05HLExMT05HLDAsTExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbmVnaW50NjQiLExMT05HLExMT05HLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19sc2xpbnQ2NCIsTExPTkcsTExPTkcsMCxJTlQsMCwxLDApOworCisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZzaW50NjQiLExMT05HLExMT05HLDAsTExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2dWludDY0IixVTlNJR05FRHxMTE9ORyxVTlNJR05FRHxMTE9ORywwLFVOU0lHTkVEfExMT05HLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZHNpbnQ2NCIsTExPTkcsTExPTkcsMCxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19tb2R1aW50NjQiLFVOU0lHTkVEfExMT05HLFVOU0lHTkVEfExMT05HLDAsVU5TSUdORUR8TExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbHNyc2ludDY0IixMTE9ORyxMTE9ORywwLElOVCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19sc3J1aW50NjQiLFVOU0lHTkVEfExMT05HLFVOU0lHTkVEfExMT05HLDAsSU5ULDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2NtcHNpbnQ2NCIsSU5ULExMT05HLDAsTExPTkcsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fY21wdWludDY0IixJTlQsVU5TSUdORUR8TExPTkcsMCxVTlNJR05FRHxMTE9ORywwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19zaW50NjR0b2ZsdDMyIixGTE9BVCxMTE9ORywwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fdWludDY0dG9mbHQzMiIsRkxPQVQsVU5TSUdORUR8TExPTkcsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3NpbnQ2NHRvZmx0NjQiLERPVUJMRSxMTE9ORywwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fdWludDY0dG9mbHQ2NCIsRE9VQkxFLFVOU0lHTkVEfExMT05HLDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvc2ludDY0IixMTE9ORyxGTE9BVCwwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0MzJ0b3VpbnQ2NCIsVU5TSUdORUR8TExPTkcsRkxPQVQsMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDY0dG9zaW50NjQiLExMT05HLERPVUJMRSwwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b3VpbnQ2NCIsVU5TSUdORUR8TExPTkcsRE9VQkxFLDAsMCwwLDEsMCk7CisKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDMydG9mbHQ2NCIsRE9VQkxFLEZMT0FULDAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQ2NHRvZmx0MzIiLEZMT0FULERPVUJMRSwwLDAsMCwxLDApOworCisKKyAgZGVjbGFyZV9idWlsdGluKCJfX2FkZGZsdDMyIixGTE9BVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3N1YmZsdDMyIixGTE9BVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX211bGZsdDMyIixGTE9BVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2RpdmZsdDMyIixGTE9BVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX25lZ2ZsdDMyIixGTE9BVCxGTE9BVCwwLEZMT0FULDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2NtcGZsdDMyIixJTlQsRkxPQVQsMCxGTE9BVCwwLDEsMCk7CisKKyAgZGVjbGFyZV9idWlsdGluKCJfX2FkZGZsdDY0IixET1VCTEUsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3N1YmZsdDY0IixET1VCTEUsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX211bGZsdDY0IixET1VCTEUsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2RpdmZsdDY0IixET1VCTEUsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX25lZ2ZsdDY0IixET1VCTEUsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2NtcGZsdDY0IixJTlQsRE9VQkxFLDAsRE9VQkxFLDAsMSwwKTsKKworCisgIHJldHVybiAxOworfQorCitpbnQgZnJldHVybihzdHJ1Y3QgVHlwICp0KQorLyogIFJldHVybnMgdGhlIHJlZ2lzdGVyIGluIHdoaWNoIHZhcmlhYmxlcyBvZiB0eXBlIHQgYXJlIHJldHVybmVkLiAqLworLyogIElmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgcmV0dXJuZWQgaW4gYSByZWdpc3RlciByZXR1cm5zIDAuICAgICAgICAqLworeworICBpbnQgZj10LT5mbGFncyZOUTsKKyAgaWYoSVNTQ0FMQVIoZikpeworICAgIGlmKElTSFdPUkQoZil8fGY9PUNIQVIpCisgICAgICByZXR1cm4gYWNjOworICAgIGVsc2UgaWYoSVNMV09SRChmKSkKKyAgICAgIHJldHVybiBkeDsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IHJlZ29rKGludCByLGludCB0LGludCBtb2RlKQorLyogIFJldHVybnMgMCBpZiByZWdpc3RlciByIGNhbm5vdCBzdG9yZSB2YXJpYWJsZXMgb2YgICAqLworLyogIHR5cGUgdC4gSWYgdD09UE9JTlRFUiBhbmQgbW9kZSE9MCB0aGVuIGl0IHJldHVybnMgICAqLworLyogIG5vbi16ZXJvIG9ubHkgaWYgdGhlIHJlZ2lzdGVyIGNhbiBzdG9yZSBhIHBvaW50ZXIgICAqLworLyogIGFuZCBkZXJlZmVyZW5jZSBhIHBvaW50ZXIgdG8gbW9kZS4gICAgICAgICAgICAgICAgICAqLworeworICBpZighSVNTQ0FMQVIodCkpIHJldHVybiAwOworICBpZihyPT1keCl7CisgICAgaWYoSVNMV09SRCh0KSYmKG9wdGZsYWdzJjIpJiYhbm9keCkgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYobW9kZT09LTEpeworICAgIGlmKElTSFdPUkQodCkpIHJldHVybiAxOworICAgIGlmKCh0Jk5RKT09Q0hBUiYmSVNBQ0MocikpIHJldHVybiAxOworICB9ZWxzZXsKKyAgICBpZihJU0lEWChyKSl7CisgICAgICBpZihJU1BPSU5URVIodCkmJklTSFdPUkQodCkpCisJcmV0dXJuIDE7CisgICAgfQorICAgIGlmKElTQUNDKHIpKXsKKyAgICAgIGlmKCh0Jk5RKT09Q0hBUikKKwlyZXR1cm4gMTsKKyAgICAgIGlmKElTSU5UKHQpJiZJU0hXT1JEKHQpKQorCXJldHVybiAxOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IHJlZ19wYWlyKGludCByLHN0cnVjdCBycGFpciAqcCkKKy8qIFJldHVybnMgMCBpZiB0aGUgcmVnaXN0ZXIgaXMgbm8gcmVnaXN0ZXIgcGFpci4gSWYgciAgKi8KKy8qIGlzIGEgcmVnaXN0ZXIgcGFpciBub24temVybyB3aWxsIGJlIHJldHVybmVkIGFuZCB0aGUgKi8KKy8qIHN0cnVjdHVyZSBwb2ludGVkIHRvIHAgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgdHdvICAgKi8KKy8qIGVsZW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYocj09ZHgpeworICAgIHAtPnIxPWFjYzsKKyAgICBwLT5yMj1peDsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IGNvc3Rfc2F2aW5ncyhzdHJ1Y3QgSUMgKnAsaW50IHIsc3RydWN0IG9iaiAqbykKK3sKKyAgLypGSVhNRSovCisgIGludCBjPXAtPmNvZGU7CisgIGlmKHI9PWR4KXsKKyAgICBpZihjPT1HRVRSRVRVUk58fGM9PVNFVFJFVFVSTnx8Yz09UFVTSHx8Yz09QVNTSUdOKSByZXR1cm4gODsKKyAgICByZXR1cm4gSU5UX01JTjsKKyAgfQorICBpZihvLT5mbGFncyZWS09OU1QpeworICAgIHN0cnVjdCBvYmogKmNvPSZvLT52LT5jb2JqOworICAgIGlmKG8tPmZsYWdzJkRSRUZPQkopCisgICAgICByZXR1cm4gMDsKKyAgICBpZihvPT0mcC0+cTEmJnAtPmNvZGU9PUFTU0lHTiYmKChwLT56LmZsYWdzJkRSRUZPQkopfHxwLT56LnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQ3x8cC0+ei52LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4pKXsKKyAgICAgIHJldHVybiAyOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorICBpZigoby0+ZmxhZ3MmRFJFRk9CSikpeworICAgIGlmKCFJU0lEWChyKSkgcmV0dXJuIElOVF9NSU47CisgICAgaWYocC0+cTIuZmxhZ3MmJm8hPSZwLT56KQorICAgICAgcmV0dXJuIDY7CisgICAgZWxzZQorICAgICAgcmV0dXJuIDY7CisgIH1lbHNlIGlmKGM9PUdFVFJFVFVSTiYmcC0+cTEucmVnPT1yKXsKKyAgICByZXR1cm4gNDsKKyAgfWVsc2UgaWYoYz09U0VUUkVUVVJOJiZwLT56LnJlZz09cil7CisgICAgcmV0dXJuIDQ7CisgIH1lbHNlIGlmKGM9PUNPTlZFUlQmJigocC0+dHlwZiZOUSk9PUNIQVJ8fChwLT50eXBmMiZOUSk9PUNIQVIpJiZyZWdvayhyLENIQVIsMCkpeworICAgIHJldHVybiAzOworICB9CisgIGlmKG89PSZwLT56JiZyPT1hY2MpeworICAgIGlmKGM9PVNVQnx8Yz09U1VCSUZQfHxjPT1TVUJQRlB8fGM9PUFORHx8Yz09T1J8fGM9PVhPUikKKyAgICAgIHJldHVybiA2OworICAgIGlmKChjPT1BRER8fGM9PUFEREkyUCkmJiEocC0+cTEuZmxhZ3MmKEtPTlNUfFZLT05TVCkpJiYhKHAtPnEyLmZsYWdzJihLT05TVHxWS09OU1QpKSkKKyAgICAgIHJldHVybiA0OworICAgIGlmKGM9PU1VTFQpIHJldHVybiA1OworICAgIGlmKGM9PUFTU0lHTiYmKHAtPnExLmZsYWdzJktPTlNUKSl7CisgICAgICBldmFsX2NvbnN0KCZwLT5xMS52YWwscC0+dHlwZik7CisgICAgICBpZih6bWVxdG8odm1heCxsMnptKDBMKSkmJnp1bWVxdG8odnVtYXgsdWwyenVtKDBVTCkpKQorCXJldHVybiAzOworICAgIH0KKyAgfQorI2lmIDEKKyAgaWYoKG89PSZwLT5xMi8qfHxvPT0mcC0+eiovKSYmIShvLT5mbGFncyZEUkVGT0JKKSYmIUlTQUNDKG8tPnJlZykmJihjPT1NVUxUfHxjPT1ESVZ8fGM9PU1PRCkpCisgICAgcmV0dXJuIElOVF9NSU47CisjZW5kaWYKKyAgaWYoYz09Q09NUEFSRXx8Yz09VEVTVCl7CisgICAgaWYocj09aXgpIHJldHVybiAzOworICAgIGlmKHI9PWl5KSByZXR1cm4gMjsKKyAgICBpZihyPT1pdSkgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDI7Cit9CisKK2ludCBkYW5nZXJvdXNfSUMoc3RydWN0IElDICpwKQorLyogIFJldHVybnMgemVybyBpZiB0aGUgSUMgcCBjYW4gYmUgc2FmZWx5IGV4ZWN1dGVkICAgICAqLworLyogIHdpdGhvdXQgZGFuZ2VyIG9mIGV4Y2VwdGlvbnMgb3Igc2ltaWxhciB0aGluZ3MuICAgICAqLworLyogIHZiY2MgbWF5IGdlbmVyYXRlIGNvZGUgaW4gd2hpY2ggbm9uLWRhbmdlcm91cyBJQ3MgICAqLworLyogIGFyZSBzb21ldGltZXMgZXhlY3V0ZWQgYWx0aG91Z2ggY29udHJvbC1mbG93IG1heSAgICAqLworLyogIG5ldmVyIHJlYWNoIHRoZW0gKG1haW5seSB3aGVuIG1vdmluZyBjb21wdXRhdGlvbnMgICAqLworLyogIG91dCBvZiBsb29wcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFR5cGljYWwgSUNzIHRoYXQgZ2VuZXJhdGUgZXhjZXB0aW9ucyBvbiBzb21lICAgICAgICAqLworLyogIG1hY2hpbmVzIGFyZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtIGFjY2Vzc2VzIHZpYSBwb2ludGVycyAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtIGRpdmlzaW9uL21vZHVsbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtIG92ZXJmbG93IG9uIHNpZ25lZCBpbnRlZ2VyL2Zsb2F0cyAgICAgICAgICAgICAqLworeworICBpbnQgYz1wLT5jb2RlOworICBpZigocC0+cTEuZmxhZ3MmRFJFRk9CSil8fChwLT5xMi5mbGFncyZEUkVGT0JKKXx8KHAtPnouZmxhZ3MmRFJFRk9CSikpCisgICAgcmV0dXJuIDE7CisgIGlmKChjPT1ESVZ8fGM9PU1PRCkmJiFpc2NvbnN0KHEyKSkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiBuYW1lIG9mIGxpYnJhcnkgZnVuY3Rpb24sIGlmIHRoaXMgbm9kZSBzaG91bGQgYmUKKyAgIGltcGxlbWVudGVkIHZpYSBsaWJjYWxsLiAqLworY2hhciAqdXNlX2xpYmNhbGwoaW50IGMsaW50IHQsaW50IHQyKQoreworICBzdGF0aWMgY2hhciBmbmFtZVsxNl07CisgIGNoYXIgKnJldD0wOworCisgIGlmKGM9PUNPTVBBUkUpeworICAgIGlmKCh0Jk5RKT09TExPTkd8fElTRkxPQVQodCkpeworICAgICAgc3ByaW50ZihmbmFtZSwiX19jbXAlcyVzJWxkIiwodCZVTlNJR05FRCk/InUiOiJzIixJU0ZMT0FUKHQpPyJmbHQiOiJpbnQiLHptMmwoc2l6ZXRhYlt0Jk5RXSkqOCk7CisgICAgICByZXQ9Zm5hbWU7CisgICAgfQorICB9ZWxzZXsKKyAgICB0Jj1OVTsKKyAgICB0MiY9TlU7CisgICAgaWYodD09TERPVUJMRSkgdD1ET1VCTEU7CisgICAgaWYodDI9PUxET1VCTEUpIHQyPURPVUJMRTsKKyAgICBpZihjPT1DT05WRVJUKXsKKyAgICAgIGlmKHQ9PXQyKSByZXR1cm4gMDsKKyAgICAgIGlmKHQ9PUZMT0FUJiZ0Mj09RE9VQkxFKSByZXR1cm4gIl9fZmx0NjR0b2ZsdDMyIjsKKyAgICAgIGlmKHQ9PURPVUJMRSYmdDI9PUZMT0FUKSByZXR1cm4gIl9fZmx0MzJ0b2ZsdDY0IjsKKworICAgICAgaWYoSVNGTE9BVCh0KSl7CisgICAgICAgIHNwcmludGYoZm5hbWUsIl9fJWNpbnQlbGR0b2ZsdCVkIiwodDImVU5TSUdORUQpPyd1Jzoncycsem0ybChzaXpldGFiW3QyJk5RXSkqOCwodD09RkxPQVQpPzMyOjY0KTsKKyAgICAgICAgcmV0PWZuYW1lOworICAgICAgfQorICAgICAgaWYoSVNGTE9BVCh0MikpeworICAgICAgICBzcHJpbnRmKGZuYW1lLCJfX2ZsdCVkdG8lY2ludCVsZCIsKCh0MiZOVSk9PUZMT0FUKT8zMjo2NCwodCZVTlNJR05FRCk/J3UnOidzJyx6bTJsKHNpemV0YWJbdCZOUV0pKjgpOworICAgICAgICByZXQ9Zm5hbWU7CisgICAgICB9CisgICAgfQorICAgIGlmKCh0Jk5RKT09TExPTkd8fElTRkxPQVQodCkpeworICAgICAgaWYoKGM+PUxTSElGVCYmYzw9TU9EKXx8KGM+PU9SJiZjPD1BTkQpfHxjPT1LT01QTEVNRU5UfHxjPT1NSU5VUyl7CisJaWYodD09KFVOU0lHTkVEfExMT05HKSYmKGM9PURJVnx8Yz09TU9EfHxjPT1SU0hJRlQpKXsKKwkgIHNwcmludGYoZm5hbWUsIl9fJXN1aW50NjQiLGVuYW1lW2NdKTsKKwkgIHJldD1mbmFtZTsKKwl9ZWxzZSBpZigodCZOUSk9PUxMT05HKXsKKyAgICAgICAgICBzcHJpbnRmKGZuYW1lLCJfXyVzaW50NjQiLGVuYW1lW2NdKTsKKyAgICAgICAgICByZXQ9Zm5hbWU7CisJfWVsc2UgaWYodD09KFVOU0lHTkVEfExPTkcpJiYoYz09RElWfHxjPT1NT0R8fGM9PVJTSElGVCkpeworCSAgc3ByaW50ZihmbmFtZSwiX18lc3VpbnQzMiIsZW5hbWVbY10pOworCSAgcmV0PWZuYW1lOworCX1lbHNlIGlmKCh0Jk5RKT09TE9ORyl7CisgICAgICAgICAgc3ByaW50ZihmbmFtZSwiX18lc2ludDMyIixlbmFtZVtjXSk7CisgICAgICAgICAgcmV0PWZuYW1lOworICAgICAgICB9ZWxzZXsKKwkgIHNwcmludGYoZm5hbWUsIl9fJXMlcyVzJWxkIixlbmFtZVtjXSwoYyE9TVVMVCYmKHQmVU5TSUdORUQpKT8idSI6IiIsSVNGTE9BVCh0KT8iZmx0IjoiaW50Iix6bTJsKHNpemV0YWJbdCZOUV0pKjgpOworICAgICAgICAgIHJldD1mbmFtZTsKKwl9CisgICAgICB9CisgICAgfQorICAgIGlmKChjPT1NVUxUJiYoQ1BVPT02ODA5fHwodCZOUSk9PUxPTkcpKXx8Yz09RElWfHxjPT1NT0QpeworICAgICAgc3ByaW50ZihmbmFtZSwiX18lcyVzJXMlbGQiLGVuYW1lW2NdLChjIT1NVUxUJiYodCZVTlNJR05FRCkpPyJ1IjoiIixJU0ZMT0FUKHQpPyJmbHQiOiJpbnQiLHptMmwoc2l6ZXRhYlt0Jk5RXSkqOCk7CisgICAgICByZXQ9Zm5hbWU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworCisKK2ludCBtdXN0X2NvbnZlcnQoaW50IG8saW50IHQsaW50IGNvbnN0X2V4cHIpCisvKiAgUmV0dXJucyB6ZXJvIGlmIGNvZGUgZm9yIGNvbnZlcnRpbmcgbnAgdG8gdHlwZSB0ICAgICovCisvKiAgY2FuIGJlIG9taXR0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBvcD1vJk5RLHRwPXQmTlE7CisgIGlmKG9wPT10cCkgcmV0dXJuIDA7CisgIGlmKElTSFdPUkQob3ApJiZJU0hXT1JEKHRwKSkgcmV0dXJuIDA7CisgIGlmKElTRkxPQVQob3ApfHxJU0ZMT0FUKHRwKSkgcmV0dXJuIDE7CisgIGlmKElTTFdPUkQob3ApJiZJU0xXT1JEKHRwKSkgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCit2b2lkIGdlbl9kcyhGSUxFICpmLHptYXggc2l6ZSxzdHJ1Y3QgVHlwICp0KQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSA8c2l6ZT4gYnl0ZXMgb2Ygc3RvcmFnZSAqLworLyogIGluaXRpYWxpemVkIHdpdGggemVyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpZihuZXdvYmomJnNlY3Rpb24hPVNQRUNJQUwpCisgICAgZW1pdChmLCIlbGRcbiIsem0ybChzaXplKSk7CisgIGVsc2UKKyAgICBlbWl0KGYsIlx0LnNwYWNlXHQlbGRcbiIsem0ybChzaXplKSk7CisgIG5ld29iaj0wOyAgCit9CisKK3ZvaWQgZ2VuX2FsaWduKEZJTEUgKmYsem1heCBhbGlnbikKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBtYWtlIHN1cmUgdGhlIG5leHQgZGF0YSBpcyAgICAgKi8KKy8qICBhbGlnbmVkIHRvIG11bHRpcGxlcyBvZiA8YWxpZ24+IGJ5dGVzLiAgICAgICAgICAgICAgKi8KK3sKKyAgLyogbm90aGluZyB0byBkbyAqLworfQorCit2b2lkIGdlbl92YXJfaGVhZChGSUxFICpmLHN0cnVjdCBWYXIgKnYpCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIHRoZSBoZWFkIG9mIGEgdmFyaWFibGUgICovCisvKiAgZGVmaW5pdGlvbiwgaS5lLiB0aGUgbGFiZWwgYW5kIGluZm9ybWF0aW9uIGZvciAgICAgICovCisvKiAgbGlua2FnZSBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBjb25zdGZsYWc7CisgIGlmKHYtPmNsaXN0KSBjb25zdGZsYWc9aXNfY29uc3Qodi0+dnR5cCk7CisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQyl7CisgICAgaWYoSVNGVU5DKHYtPnZ0eXAtPmZsYWdzKSkgcmV0dXJuOworICAgIGlmKHYtPnRhdHRyJkRQQUdFKQorICAgICAgZW1pdChmLCJcdC5kaXJlY3RcdCVzJWxkXG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICAgIGlmKCFzcGVjaWFsX3NlY3Rpb24oZix2KSl7CisgICAgICBpZih2LT5jbGlzdCYmKCFjb25zdGZsYWd8fChnX2ZsYWdzWzNdJlVTRURGTEFHKSkmJnNlY3Rpb24hPURBVEEpeworCWVtaXQoZixkYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1EQVRBOworICAgICAgfQorICAgICAgaWYodi0+Y2xpc3QmJmNvbnN0ZmxhZyYmIShnX2ZsYWdzWzNdJlVTRURGTEFHKSYmc2VjdGlvbiE9Uk9EQVRBKXsKKwllbWl0KGYscm9kYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1ST0RBVEE7CisgICAgICB9CisgICAgICBpZighdi0+Y2xpc3QmJnNlY3Rpb24hPUJTUyl7CisJZW1pdChmLGJzc25hbWUpO2lmKGYpIHNlY3Rpb249QlNTOworICAgICAgfQorICAgIH0KKyAgICBlbWl0KGYsIlx0LnR5cGVcdCVzJWxkLEBvYmplY3RcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgZW1pdChmLCJcdC5zaXplXHQlcyVsZCwlbGRcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSx6bTJsKHN6b2Yodi0+dnR5cCkpKTsKKyAgICBpZih2LT5jbGlzdHx8c2VjdGlvbj09U1BFQ0lBTCkKKyAgICAgIGVtaXQoZiwiJXMlbGQ6XG4iLGxhYnByZWZpeCx6bTJsKHYtPm9mZnNldCkpOworICAgIGVsc2UKKyAgICAgIGVtaXQoZiwiXHQubGNvbW1cdCVzJWxkLCIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgbmV3b2JqPTE7IAorICB9CisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisgICAgaWYodi0+ZmxhZ3MmKERFRklORUR8VEVOVEFUSVZFKSl7CisgICAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXMlc1xuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICAgIGlmKHYtPnRhdHRyJkRQQUdFKQorCWVtaXQoZiwiXHQuZGlyZWN0XHQlcyVzXG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgICAgaWYoIXNwZWNpYWxfc2VjdGlvbihmLHYpKXsKKwlpZih2LT5jbGlzdCYmKCFjb25zdGZsYWd8fChnX2ZsYWdzWzNdJlVTRURGTEFHKSkmJnNlY3Rpb24hPURBVEEpeworCSAgZW1pdChmLGRhdGFuYW1lKTtpZihmKSBzZWN0aW9uPURBVEE7CisJfQorCWlmKHYtPmNsaXN0JiZjb25zdGZsYWcmJiEoZ19mbGFnc1szXSZVU0VERkxBRykmJnNlY3Rpb24hPVJPREFUQSl7CisJICBlbWl0KGYscm9kYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1ST0RBVEE7CisJfQorCWlmKCF2LT5jbGlzdCYmc2VjdGlvbiE9QlNTKXsKKwkgIGVtaXQoZixic3NuYW1lKTtpZihmKSBzZWN0aW9uPUJTUzsKKwl9CisgICAgICB9CisgICAgICBlbWl0KGYsIlx0LnR5cGVcdCVzJXMsQG9iamVjdFxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICAgIGVtaXQoZiwiXHQuc2l6ZVx0JXMlcywlbGRcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcix6bTJsKHN6b2Yodi0+dnR5cCkpKTsKKyAgICAgIGlmKHYtPmNsaXN0fHxzZWN0aW9uPT1TUEVDSUFMKQorICAgICAgICBlbWl0KGYsIiVzJXM6XG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgICAgZWxzZQorICAgICAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXMlc1xuXHQubGNvbW1cdCVzJXMsIixpZHByZWZpeCx2LT5pZGVudGlmaWVyLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgICAgbmV3b2JqPTE7ICAgCisgICAgfQorICB9Cit9CisKK3ZvaWQgZ2VuX2RjKEZJTEUgKmYsaW50IHQsc3RydWN0IGNvbnN0X2xpc3QgKnApCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIHN0YXRpYyBzdG9yYWdlICAgICAgICAgICovCisvKiAgaW5pdGlhbGl6ZWQgd2l0aCBjb25zdC1saXN0IHAuICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGVtaXQoZiwiXHQlc1x0IixkY3RbdCZOUV0pOworICBpZighcC0+dHJlZSl7CisgICAgaWYoSVNGTE9BVCh0KSl7CisgICAgICAvKiAgYXVjaCB3aWVkZXIgbmljaHQgc2VociBzY2hvZW4gdW5kIElFRUUgbm9ldGlnICAgKi8KKyAgICAgIHVuc2lnbmVkIGNoYXIgKmlwOworICAgICAgaXA9KHVuc2lnbmVkIGNoYXIgKikmcC0+dmFsLnZkb3VibGU7CisgICAgICBlbWl0KGYsIjB4JTAyeCUwMnglMDJ4JTAyeCIsaXBbM10saXBbMl0saXBbMV0saXBbMF0pOworICAgICAgaWYoKHQmTlEpPT1ET1VCTEV8fCh0Jk5RKT09TERPVUJMRSl7CisJZW1pdChmLCIsMHglMDJ4JTAyeCUwMnglMDJ4IixpcFs3XSxpcFs2XSxpcFs1XSxpcFs0XSk7CisgICAgICB9CisgICAgfWVsc2V7CisgICAgICBlbWl0dmFsKGYsJnAtPnZhbCwodCZOVSl8VU5TSUdORUQpOworICAgIH0KKyAgfWVsc2V7CisgICAgaW50IG09cC0+dHJlZS0+by5mbGFncyxtZD1kcmVsLG1wPXBjcmVsOworICAgIHAtPnRyZWUtPm8uZmxhZ3MmPX5WQVJBRFI7CisgICAgZHJlbD0wO3BjcmVsPTA7CisgICAgZW1pdF9vYmooZiwmcC0+dHJlZS0+byx0Jk5VKTsKKyAgICBwLT50cmVlLT5vLmZsYWdzPW07CisgICAgZHJlbD1tZDtwY3JlbD1tcDsKKyAgfQorICBlbWl0KGYsIlxuIik7bmV3b2JqPTA7Cit9CisKKworc3RhdGljIHZvaWQgcHJlbG9hZChGSUxFICpmLElDICpwKQoreworICBpbnQgdCxyOworCisgIGlmKChwLT50eXBmJlZPTEFUSUxFKXx8KHAtPnR5cGYyJlZPTEFUSUxFKXx8CisgICAgICgocC0+cTEuZmxhZ3MmRFJFRk9CSikmJihwLT5xMS5kdHlwJihWT0xBVElMRXxQVk9MQVRJTEUpKSl8fAorICAgICAoKHAtPnEyLmZsYWdzJkRSRUZPQkopJiYocC0+cTIuZHR5cCYoVk9MQVRJTEV8UFZPTEFUSUxFKSkpfHwKKyAgICAgKChwLT56LmZsYWdzJkRSRUZPQkopJiYocC0+ei5kdHlwJihWT0xBVElMRXxQVk9MQVRJTEUpKSkpCisgICAgZW1pdChmLCI7IHZvbGF0aWxlIGJhcnJpZXJcbiIpOworCisgIHQ9cTF0eXAocCk7CisgIGlmKCFwLT5xMS5hbSYmKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSnxLT05TVCkpPT1EUkVGT0JKJiZJU0xXT1JEKHQpKXsKKyAgICByPWdldF9pZHgoZixwKTsKKyAgICBwLT5xMS5mbGFncyY9fkRSRUZPQko7CisgICAgbG9hZF9yZWcoZixyLCZwLT5xMSxJTlQpOworICAgIHAtPnExLmZsYWdzfD0oUkVHfERSRUZPQkopOworICAgIHAtPnExLnJlZz1yOworICB9CisgIHQ9cTJ0eXAocCk7CisgIGlmKCFwLT5xMi5hbSYmKHAtPnEyLmZsYWdzJihSRUd8RFJFRk9CSnxLT05TVCkpPT1EUkVGT0JKJiZJU0xXT1JEKHQpKXsKKyAgICByPWdldF9pZHgoZixwKTsKKyAgICBwLT5xMi5mbGFncyY9fkRSRUZPQko7CisgICAgbG9hZF9yZWcoZixyLCZwLT5xMixJTlQpOworICAgIHAtPnEyLmZsYWdzfD0oUkVHfERSRUZPQkopOworICAgIHAtPnEyLnJlZz1yOworICB9ZWxzZSBpZihpc3JlZyh6KSYmKCgocC0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAtPnEyLnJlZz09cC0+ei5yZWcpfHwocC0+cTIuYW0mJnAtPnEyLmFtLT5iYXNlPT1wLT56LnJlZykpKXsKKyAgICByPWdldF9pZHgoZixwKTsKKyAgICBwLT5xMi5mbGFncyY9fkRSRUZPQko7CisgICAgbG9hZF9yZWcoZixyLCZwLT5xMixJTlQpOworICAgIHAtPnEyLmZsYWdzfD0oUkVHfERSRUZPQkopOworICAgIHAtPnEyLnJlZz1yOworICB9CisgIHQ9enR5cChwKTsKKyAgaWYoIXAtPnouYW0mJihwLT56LmZsYWdzJihSRUd8RFJFRk9CSnxLT05TVCkpPT1EUkVGT0JKJiZJU0xXT1JEKHQpKXsKKyAgICByPWdldF9pZHgoZixwKTsKKyAgICBwLT56IC5mbGFncyY9fkRSRUZPQko7CisgICAgbG9hZF9yZWcoZixyLCZwLT56ICxJTlQpOworICAgIHAtPnogLmZsYWdzfD0oUkVHfERSRUZPQkopOworICAgIHAtPnogLnJlZz1yOworICB9Cit9CisKKy8qICBUaGUgbWFpbiBjb2RlLWdlbmVyYXRpb24gcm91dGluZS4gICAgICAgICAgICAgICAgICAgKi8KKy8qICBmIGlzIHRoZSBzdHJlYW0gdGhlIGNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8uICAgICAgKi8KKy8qICBwIGlzIGEgcG9pbnRlciB0byBhIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBJQ3MgICAgICAgKi8KKy8qICBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBib2R5IHRvIGdlbmVyYXRlIGNvZGUgZm9yLiAgKi8KKy8qICB2IGlzIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBvZmZzZXQgaXMgdGhlIHNpemUgb2YgdGhlIHN0YWNrZnJhbWUgdGhlIGZ1bmN0aW9uICAgKi8KKy8qICBuZWVkcyBmb3IgbG9jYWwgdmFyaWFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ZvaWQgZ2VuX2NvZGUoRklMRSAqZixzdHJ1Y3QgSUMgKmZwLHN0cnVjdCBWYXIgKnYsem1heCBvZmZzZXQpCit7CisgIGludCBjLHQsbGFzdGNvbXA9MCxyZWcsc2hvcnRfYWRkLGJpdF9yZXZlcnNlLG5lZWRfcmV0dXJuPTA7CisgIHN0cnVjdCBvYmogKmJpdF9vYmo7Y2hhciAqYml0X3JlZzsKKyAgc3RhdGljIGludCBpZG9uZTsKKyAgc3RydWN0IG9iaiBvOworICBJQyAqcCwqcDI7CisgIGlmKHYtPnRhdHRyJklOVEVSUlVQVCkKKyAgICByZXQ9InJ0aSI7CisgIGVsc2UgaWYgKHYtPnRhdHRyJkZBUikKKyAgCXJldD0icnRmIjsKKyAgZWxzZQorICAgIHJldD0icnRzIjsgLypGSVhNRTogYmFua2VkICovCisgIGlmKERFQlVHJjEpIHByaW50ZigiZ2VuX2NvZGUoKVxuIik7CisgIGZvcihwPWZwO3A7cD1wLT5uZXh0KSBjbGVhcl9leHRfaWMoJnAtPmV4dCk7CisgIGVtaXQoZiwiI29mZjE9JWxkXG4iLHptMmwob2Zmc2V0KSk7CisgIGlmKCEoZ19mbGFnc1s1XSZVU0VERkxBRykpeworICAgIHBlZXBob2xlKGZwKTsKKyAgICBpZighZnJhbWVfdXNlZCkgb2Zmc2V0PWwyem0oMEwpOworICB9CisgIGZvcihjPTE7Yzw9TUFYUjtjKyspIHJlZ3NbY109KHJlZ3NhW2NdPT1SRUdTQV9ORVZFUik/MTowOworICBmb3IoYz0xO2M8PU1BWFI7YysrKXsKKyAgICBpZihyZWdzY3JhdGNoW2NdJiYocmVnc2FbY118fHJlZ3VzZWRbY10pKXsKKyAgICAgIEJTRVQocmVnc19tb2RpZmllZCxjKTsKKyAgICB9CisgIH0KKyAgdD0wOworICBmb3IocD1mcDtwO3A9cC0+bmV4dCl7CisgICAgYz1wLT5jb2RlOworICAgIGlmKGM9PUFMTE9DUkVHKXsgcmVnc1twLT5xMS5yZWddPTE7IGlmKHAtPnExLnJlZz09ZHgpIHJlZ3NbYWNjXT1yZWdzW2l4XT0xO30KKyAgICBpZihjPT1GUkVFUkVHKXsgcmVnc1twLT5xMS5yZWddPTA7IGlmKHAtPnExLnJlZz09ZHgpIHJlZ3NbYWNjXT1yZWdzW2l4XT0wO30KKyAgICBpZigoYz09TFNISUZUfHxjPT1SU0hJRlQpJiYocC0+dHlwZiZOUSk+PUxPTkcpIHJlZ3VzZWRbaXldPTE7CisgICAgaWYoYz09UFVTSCYmKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpIT1SRUcpeworICAgICAgaWYoem1lcXRvKHAtPnEyLnZhbC52bWF4LFoxKSl7CisJaWYocmVnc1thY2NdKSB0PSh0PjIpP3Q6MjsKKyAgICAgIH1lbHNlIGlmKHptZXF0byhwLT5xMi52YWwudm1heCxsMnptKDJMKSkpeworCWlmKHJlZ3NbYWNjXSYmcmVnc1tpeF0mJnJlZ3NbaXldJiYoQ1BVPT02ODEyfHxyZWdzW2l1XSkpIHQ9KHQ+Mik/dDoyOworICAgICAgfWVsc2UgaWYoem1lcXRvKHAtPnEyLnZhbC52bWF4LGwyem0oNEwpKSl7CisJaWYocmVnc1thY2NdKSB0PSh0PjIpP3Q6MjsKKyAgICAgIH1lbHNleworCS8qIFRPRE86IGZpbmVyIGNoZWNrICovCisJaWYoZHJlbHx8IXJlZ3NhW2l1XSkKKwkgIHQ9KHQ+OCk/dDo4OworCWVsc2UKKwkgIHQ9KHQ+Nik/dDo2OworICAgICAgfQorICAgIH0KKyAgfQorICBlbWl0KGYsIiN0b2ZmPSVkXG4iLHQpOworICBsb2ZmPXptMmwob2Zmc2V0KSt0OworICBmdW5jdGlvbl90b3AoZix2LGxvZmYpOworICBzdGFja29mZnNldD1ub3Rwb3BwZWQ9ZG9udHBvcD1tYXhwdXNoZWQ9MDsKKyAgZm9yKHA9ZnA7cDtwcihmLHApLHA9cC0+bmV4dCl7CisgICAgYz1wLT5jb2RlO3Q9cC0+dHlwZjsKKyAgICBpZihkZWJ1Z19pbmZvKQorICAgICAgZHdhcmYyX2xpbmVfaW5mbyhmLHApOyAKKyAgICBzaG9ydF9hZGQ9MDsKKyAgICBpZihjPT1OT1ApIGNvbnRpbnVlOworICAgIGlmKGM9PUFMTE9DUkVHKXsKKyAgICAgIHJlZ3NbcC0+cTEucmVnXT0xOworICAgICAgaWYocC0+cTEucmVnPT1keCkgcmVnc1thY2NdPXJlZ3NbaXhdPTE7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09RlJFRVJFRyl7CisgICAgICByZWdzW3AtPnExLnJlZ109MDsKKyAgICAgIGlmKHAtPnExLnJlZz09ZHgpIHJlZ3NbYWNjXT1yZWdzW2l4XT0wOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKG5vdHBvcHBlZCYmIWRvbnRwb3ApeworICAgICAgaW50IGZsYWc9MDsKKyAgICAgIGlmKGM9PUxBQkVMfHxjPT1DT01QQVJFfHxjPT1URVNUfHxjPT1CUkEpeworCWdlbl9wb3AoZixub3Rwb3BwZWQpOworCW5vdHBvcHBlZD0wOworICAgICAgfQorICAgIH0KKyAgICBpZihjPT1MQUJFTCkge2NjPTA7ZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsdCk7Y29udGludWU7fQorICAgIGlmKGM+PUJFUSYmYzw9QkdUJiZ0PT1leGl0X2xhYmVsKSBuZWVkX3JldHVybj0xOworICAgIGlmKGM9PUJSQSl7CisgICAgICBpZihwLT50eXBmPT1leGl0X2xhYmVsJiYhaGF2ZV9mcmFtZSl7CisJZW1pdChmLCJcdCVzXG4iLHJldCk7CisgICAgICB9ZWxzZXsKKwlpZih0PT1leGl0X2xhYmVsKSBuZWVkX3JldHVybj0xOworCWVtaXQoZiwiXHRicmFcdCVzJWRcbiIsbGFicHJlZml4LHQpOworICAgICAgfQorICAgICAgY2M9MDtjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz49QkVRJiZjPEJSQSl7ICAgICAgCisgICAgICBpZigobGFzdGNvbXAmVU5TSUdORUQpfHxJU1BPSU5URVIobGFzdGNvbXApKQorICAgICAgICBlbWl0KGYsIlx0YiVzXHQlcyVkXG4iLHVjY3NbYy1CRVFdLGxhYnByZWZpeCx0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgZW1pdChmLCJcdGIlc1x0JXMlZFxuIixjY3NbYy1CRVFdLGxhYnByZWZpeCx0KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1NT1ZFVE9SRUcpeworICAgICAgbG9hZF9yZWcoZixwLT56LnJlZywmcC0+cTEsU0hPUlQpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PU1PVkVGUk9NUkVHKXsKKyAgICAgIHN0b3JlX3JlZyhmLHAtPnExLnJlZywmcC0+eixTSE9SVCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgLyppZihJU0ZMT0FUKHQpKSB7cHJpYzIoc3Rkb3V0LHApO2llcnJvcigwKTt9Ki8KKworICAgIGlmKCh0Jk5RKT09QklUKXsKKyAgICAgIGllcnJvcigwKTsKKyAgICB9CisKKyAgICBpZihjPT1DT05WRVJUJiZJU0xXT1JEKHQpJiZJU0xXT1JEKHAtPnR5cGYyKSl7CisgICAgICBwLT5jb2RlPWM9QVNTSUdOOworICAgICAgcC0+cTIudmFsLnZtYXg9bDJ6bSg0TCk7CisgICAgfQorCisgICAgaWYoKHAtPnEyLmZsYWdzJlJFRykmJklTQUNDKHAtPnEyLnJlZykmJihjPT1BRER8fGM9PU1VTFR8fGM9PUFORHx8Yz09T1J8fGM9PVhPUikpeworICAgICAgb2JqIG89cC0+cTE7CisgICAgICBwLT5xMT1wLT5xMjsKKyAgICAgIHAtPnEyPW87CisgICAgfQorCisgICAgaWYoYz09VEVTVCl7CisgICAgICBsYXN0Y29tcD10OworICAgICAgcC0+Y29kZT1jPUNPTVBBUkU7CisgICAgICBndmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICBwLT5xMi5mbGFncz1LT05TVDsKKyAgICAgIGV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKKyAgICAgIGluc2VydF9jb25zdCgmcC0+cTIudmFsLHQpOworICAgIH0KKworICAgIGlmKGM9PVNVQlBGUCl7CisgICAgICBwLT5jb2RlPWM9U1VCOworICAgICAgcC0+dHlwZj10PShVTlNJR05FRHxJTlQpOworICAgIH0KKworCisKKyAgICBpZigoYz09QVNTSUdOfHxjPT1QVVNIKSYmem1lcXRvKHAtPnEyLnZhbC52bWF4LGwyem0oNEwpKSkKKyAgICAgIHAtPnR5cGY9dD1MT05HOworCisgICAgcHJlbG9hZChmLHApOworCisgICAgaWYoYz09QURESTJQfHxjPT1TVUJJRlApeworICAgICAgaWYoKHAtPnR5cGYyJk5RKSE9SFBPSU5URVIpeworCWlmKHAtPnEyLmZsYWdzJktPTlNUKXsKKwkgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxwLT50eXBmKTsKKwkgIGluc2VydF9jb25zdCgmcC0+cTIudmFsLHAtPnR5cGYyKTsKKwkgIHAtPnR5cGY9dD0oVU5TSUdORUR8U0hPUlQpOworCX1lbHNleworCSAgaWYoSVNMV09SRCh0KSkgaW5jX2FkZHIoJnAtPnEyLDIsdCk7CisJICBpZigodCZOUSk9PUNIQVIpIHNob3J0X2FkZD10OworCSAgcC0+dHlwZj10PShVTlNJR05FRHxTSE9SVCk7CisJfQorICAgICAgfWVsc2UgaWYoSVNIV09SRCh0KSl7CisJaWYoKHQmTlEpPT1MTE9ORykgCisJICBpbmNfYWRkcigmcC0+cTIsNCx0KTsKKwllbHNlIGlmKCh0Jk5RKSE9TE9ORykgCisJICBzaG9ydF9hZGQ9dDsKKwlwLT50eXBmPXQ9KFVOU0lHTkVEfExPTkcpOworICAgICAgfQorICAgICAgcC0+Y29kZT1jPShjPT1BRERJMlApP0FERDpTVUI7CisgICAgfQorCisgICAgaWYoYz09Q09NUEFSRSYmSVNMV09SRCh0KSl7CisgICAgICBJQyAqYnJhbmNoPXAtPm5leHQ7CisgICAgICBpbnQgcjsKKyAgICAgIHdoaWxlKGJyYW5jaCYmYnJhbmNoLT5jb2RlPT1GUkVFUkVHKSBicmFuY2g9YnJhbmNoLT5uZXh0OworICAgICAgaWYoIWJyYW5jaCkgaWVycm9yKDApOworICAgICAgYz1icmFuY2gtPmNvZGU7CisgICAgICBpZihjPEJFUXx8Yz5CR1QpIGllcnJvcigwKTsKKyAgICAgIGlmKCFyZWdzW2l4XSkKKwlyPWl4OworICAgICAgZWxzZQorCXI9Z2V0X3JlZyhmLHAsSU5UKTsKKyAgICAgIAorICAgICAgaWYoYz09QkVRfHxjPT1CTkUpeworCWluY19hZGRyKCZwLT5xMSwwLHQpOworCWluY19hZGRyKCZwLT5xMiwwLHQpOworCWxvYWRfcmVnKGYsciwmcC0+cTEsSU5UKTsKKwllbWl0KGYsIlx0JXMlc1x0IixDUFU9PTY4MTI/ImNwIjoiY21wIixyZWduYW1lc1tyXSk7CisJZW1pdF9vYmooZiwmcC0+cTIsSU5UKTsKKwllbWl0KGYsIlxuIik7CisJaWYocHVzaGVkX2FjYykgZW1pdChmLFNQVUxMRCk7CisJZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsYz09QkVRPysrbGFiZWw6YnJhbmNoLT50eXBmKTsKKwlpZihwdXNoZWRfYWNjKSBlbWl0KGYsU1BVU0hEKTsKKwlpbmNfYWRkcigmcC0+cTEsMix0KTsKKwlpbmNfYWRkcigmcC0+cTIsMix0KTsKKwlsb2FkX3JlZyhmLHIsJnAtPnExLElOVCk7CisJZW1pdChmLCJcdCVzJXNcdCIsQ1BVPT02ODEyPyJjcCI6ImNtcCIscmVnbmFtZXNbcl0pOworCWVtaXRfb2JqKGYsJnAtPnEyLElOVCk7CisJZW1pdChmLCJcbiIpOworCXByKGYscCk7CisJaWYoYz09QkVRKXsKKwkgIGVtaXQoZiwiXHRiZXFcdCVzJWRcbiIsbGFicHJlZml4LGJyYW5jaC0+dHlwZik7CisJICBlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisJfWVsc2UKKwkgIGVtaXQoZiwiXHRibmVcdCVzJWRcbiIsbGFicHJlZml4LGJyYW5jaC0+dHlwZik7CisgICAgICB9ZWxzZXsKKwlpbmNfYWRkcigmcC0+cTEsMCx0KTsKKwlpbmNfYWRkcigmcC0+cTIsMCx0KTsKKwlsb2FkX3JlZyhmLHIsJnAtPnExLElOVCk7CisJZW1pdChmLCJcdCVzJXNcdCIsQ1BVPT02ODEyPyJjcCI6ImNtcCIscmVnbmFtZXNbcl0pOworCWVtaXRfb2JqKGYsJnAtPnEyLElOVCk7CisJZW1pdChmLCJcbiIpOworCWxhYmVsKys7CisJaWYocHVzaGVkX2FjYykgZW1pdChmLFNQVUxMRCk7CisJaWYodCZVTlNJR05FRCl7CisJICBpZihjPT1CTFR8fGM9PUJHVCkKKwkgICAgZW1pdChmLCJcdGIlc1x0JXMlZFxuIiwoYz09QkxUKT8ibG8iOiJoaSIsbGFicHJlZml4LGJyYW5jaC0+dHlwZik7CisJICBlbHNlCisJICAgIGVtaXQoZiwiXHRiJXNcdCVzJWRcbiIsKGM9PUJHRSk/ImxvIjoiaGkiLGxhYnByZWZpeCxsYWJlbCk7CisJfWVsc2V7CisJICBpZihjPT1CTFR8fGM9PUJHVCkKKwkgICAgZW1pdChmLCJcdGIlc1x0JXMlZFxuIiwoYz09QkxUKT8ibHQiOiJndCIsbGFicHJlZml4LGJyYW5jaC0+dHlwZik7CisJICBlbHNlCisJICAgIGVtaXQoZiwiXHRiJXNcdCVzJWRcbiIsKGM9PUJHRSk/Imx0IjoiZ3QiLGxhYnByZWZpeCxsYWJlbCk7CisJfQorCWVtaXQoZiwiXHRibmVcdCVzJWRcbiIsbGFicHJlZml4LChjPT1CTFR8fGM9PUJHVCk/bGFiZWw6YnJhbmNoLT50eXBmKTsKKwlpZihwdXNoZWRfYWNjKSBlbWl0KGYsU1BVU0hEKTsKKwlpbmNfYWRkcigmcC0+cTEsMix0KTsKKwlpbmNfYWRkcigmcC0+cTIsMix0KTsKKwlsb2FkX3JlZyhmLHIsJnAtPnExLElOVCk7CisJZW1pdChmLCJcdCVzJXNcdCIsQ1BVPT02ODEyPyJjcCI6ImNtcCIscmVnbmFtZXNbcl0pOworCWVtaXRfb2JqKGYsJnAtPnEyLElOVCk7CisJZW1pdChmLCJcbiIpOworCXByKGYscCk7CisJZW1pdChmLCJcdGIlc1x0JXMlZFxuIix1Y2NzW2MtQkVRXSxsYWJwcmVmaXgsYnJhbmNoLT50eXBmKTsKKwllbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCxsYWJlbCk7CisgICAgICB9CisgICAgICBicmFuY2gtPmNvZGU9Tk9QOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYoSVNMV09SRCh0KSYmKGM9PUxTSElGVHx8Yz09UlNISUZUKSl7CisgICAgICBpbnQgY250PS0xMDAwLGkscj0wOworICAgICAgaW50IHB4PTAscHk9MCxwYT0wOworICAgICAgaWYoaXNjb25zdChxMikpeworCWV2YWxfY29uc3QoJnAtPnEyLnZhbCxwLT50eXBmMik7CisJY250PShpbnQpem0ybCh2bWF4KTsKKwlpZihjbnQ9PTEmJmNvbXBhcmVfb2JqZWN0cygmcC0+cTEsJnAtPnopKXsKKwkgIGlmKGM9PUxTSElGVCkKKwkgICAgZW1pdChmLCJcdGxzbFx0Iik7CisJICBlbHNlCisJICAgIGVtaXQoZiwiXHQlc1x0IiwodCZVTlNJR05FRCk/ImxzciI6ImFzciIpOworCSAgaW5jX2FkZHIoJnAtPnosYz09TFNISUZUPzM6MCx0KTsKKwkgIGVtaXRfb2JqKGYsJnAtPnosdCk7CisJICBlbWl0KGYsIlxuIik7CisJICBlbWl0KGYsIlx0JXNcdCIsKGM9PUxTSElGVCk/InJvbCI6InJvciIpOworCSAgaW5jX2FkZHIoJnAtPnosYz09TFNISUZUPy0xOjEsdCk7CisJICBlbWl0X29iaihmLCZwLT56LHQpOworCSAgZW1pdChmLCJcbiIpOworCSAgZW1pdChmLCJcdCVzXHQiLChjPT1MU0hJRlQpPyJyb2wiOiJyb3IiKTsKKwkgIGluY19hZGRyKCZwLT56LGM9PUxTSElGVD8tMToxLHQpOworCSAgZW1pdF9vYmooZiwmcC0+eix0KTsKKwkgIGVtaXQoZiwiXG4iKTsKKwkgIGVtaXQoZiwiXHQlc1x0IiwoYz09TFNISUZUKT8icm9sIjoicm9yIik7CisJICBpbmNfYWRkcigmcC0+eixjPT1MU0hJRlQ/LTE6MSx0KTsKKwkgIGVtaXRfb2JqKGYsJnAtPnosdCk7CisJICBlbWl0KGYsIlxuIik7CisJICBjb250aW51ZTsKKwl9CisgICAgICB9CisgICAgICBpbmNfYWRkcigmcC0+cTEsMix0KTsKKyAgICAgIGluY19hZGRyKCZwLT56LDIsdCk7CisKKyAgICAgIGlmKElTUkFDQyhxMil8fChyZWdzW2FjY10mJiFzY3JhdGNocmVnKGFjYyxwKSkpeworCWVtaXQoZixTUFVTSEQpOworCXB1c2goMik7CisJcGE9MTsKKyAgICAgIH0KKworICAgICAgaWYoY250PDB8fChvcHRzaXplJiZjbnQ+MSl8fChjbnQ+MyYmIW9wdHNwZWVkKSl7CisJaWYocmVnc1tpeF0mJiFzY3JhdGNocmVnKGl4LHApKSB7cHg9MTtlbWl0KGYsU1BVU0goIngiKSk7cHVzaCgyKTt9CisJaWYocmVnc1tpeV0mJiFzY3JhdGNocmVnKGl5LHApKSB7cHk9MTtlbWl0KGYsU1BVU0goInkiKSk7cHVzaCgyKTt9CisgICAgICB9CisKKyAgICAgIGlmKCFjb21wYXJlX29iamVjdHMoJnAtPnExLCZwLT56KSl7CisJbG9hZF9yZWcoZixhY2MsJnAtPnExLElOVCk7CisJc3RvcmVfcmVnKGYsYWNjLCZwLT56LElOVCk7CisgICAgICB9CisgICAgICBpbmNfYWRkcigmcC0+cTEsLTIsdCk7CisgICAgICBpbmNfYWRkcigmcC0+eiwtMix0KTsKKyAgICAgIGxvYWRfcmVnKGYsYWNjLCZwLT5xMSxJTlQpOworICAgICAgaWYoY250PDB8fChvcHRzaXplJiZjbnQ+MSl8fChjbnQ+MyYmIW9wdHNwZWVkKSl7CisJaWYoKHAtPnEyLmZsYWdzJlJFRykmJnAtPnEyLnJlZz09aXgpeworCSAgaWYoKHAtPnouZmxhZ3MmUkVHKSYmcC0+ei5yZWc9PWl5KSBpZXJyb3IoMCk7CisJfWVsc2UKKwkgIGxvYWRfYWRkcihmLGl4LCZwLT56KTsKKwlpZihJU1JBQ0MocTIpKXsKKwkgIGlmKHNjcmF0Y2hyZWcoYWNjLHApJiYocHgrcHk9PTApKXsKKwkgICAgZW1pdChmLFNQVUxMKCJ5IikpOworCSAgICBwb3AoMik7cGE9MDsKKwkgIH1lbHNlCisJICAgIGVtaXQoZiwiXHRsZHlcdCVkLCVzXG4iLChweCtweSkqMixyZWduYW1lc1tzcF0pOworCX1lbHNlCisJICBsb2FkX3JlZyhmLGl5LCZwLT5xMixwLT50eXBmMik7IC8qVE9ETzogdHlwZXMhPUlOVD8/ICovCisJaWYoKHAtPnEyLmZsYWdzJlJFRykmJnAtPnEyLnJlZz09aXgpCisJICBsb2FkX2FkZHIoZixpeCwmcC0+eik7CisJaWYoYz09TFNISUZUKQorCSAgZW1pdChmLCJcdCVzXHQlc19fbHNsbFxuIixqc3JpbnN0LGlkcHJlZml4KTsKKwllbHNlCisJICBlbWl0KGYsIlx0JXNcdCVzX18lc1xuIixqc3JpbnN0LGlkcHJlZml4LCh0JlVOU0lHTkVEKT8ibHNybCI6ImFzcmwiKTsKKwlpZihweSkge2VtaXQoZixTUFVMTCgieSIpKTtwb3AoMik7fQorCWlmKHB4KSB7ZW1pdChmLFNQVUxMKCJ4IikpO3BvcCgyKTt9CisgICAgICB9ZWxzZXsKKwlpbmNfYWRkcigmcC0+eixjPT1MU0hJRlQ/MzoyLHQpOworCWZvcihpPTA7aTxjbnQ7aSsrKXsKKwkgIGlmKGM9PUxTSElGVCl7CisJICAgIGVtaXQoZiwiXHRsc2xcdCIpOworCSAgICBlbWl0X29iaihmLCZwLT56LENIQVIpOworCSAgICBlbWl0KGYsIlxuIik7CisJICAgIGluY19hZGRyKCZwLT56LC0xLHQpOworCSAgICBlbWl0KGYsIlx0cm9sXHQiKTsKKwkgICAgZW1pdF9vYmooZiwmcC0+eixDSEFSKTsKKwkgICAgZW1pdChmLCJcbiIpOworCSAgICBpbmNfYWRkcigmcC0+eiwxLHQpOworCSAgICBlbWl0KGYsIlx0cm9sYlxuIik7CisJICAgIGVtaXQoZiwiXHRyb2xhXG4iKTsKKwkgIH1lbHNleworCSAgICBlbWl0KGYsIlx0JXNcbiIsKHQmVU5TSUdORUQpPyJsc3JhIjoiYXNyYSIpOworCSAgICBlbWl0KGYsIlx0cm9yYlxuIik7CisJICAgIGVtaXQoZiwiXHRyb3JcdCIpOworCSAgICBlbWl0X29iaihmLCZwLT56LENIQVIpOworCSAgICBlbWl0KGYsIlxuIik7CisJICAgIGluY19hZGRyKCZwLT56LDEsdCk7CisJICAgIGVtaXQoZiwiXHRyb3JcdCIpOworCSAgICBlbWl0X29iaihmLCZwLT56LENIQVIpOworCSAgICBlbWl0KGYsIlxuIik7CisJICAgIGluY19hZGRyKCZwLT56LC0xLHQpOworCSAgfQorCX0KKwlpbmNfYWRkcigmcC0+eixjPT1MU0hJRlQ/LTM6LTIsdCk7CisJc3RvcmVfcmVnKGYsYWNjLCZwLT56LElOVCk7CisgICAgICB9CisgICAgICBpZihwYSkge2VtaXQoZixTUFVMTEQpO3BvcCgyKTt9CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZihJU0xXT1JEKHQpJiZjIT1HRVRSRVRVUk4mJmMhPVNFVFJFVFVSTiYmYyE9Q09NUEFSRSYmYyE9Q09OVkVSVCYmYyE9QUREUkVTUyl7CisgICAgICBpZihjPT1QVVNIJiZpc3JlZyhxMSkmJnAtPnExLnJlZz09ZHgpeworCWlmKENQVT09NjgxMil7CisJICBlbWl0KGYsIlx0cHNoZFxuIik7CisJICBlbWl0KGYsIlx0cHNoeFxuIik7CisJfWVsc2V7CisJICAvL2VtaXQoZiwiXHRwc2hzXHRhLGIseFxuIik7CisJICBlbWl0KGYsIlx0cHNoc1x0YixhXG4iKTsKKwkgIGVtaXQoZiwiXHRwc2hzXHR4XG4iKTsKKwl9CisJcHVzaCg0KTsKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PUFTU0lHTiYmaXNyZWcocTEpJiZwLT5xMS5yZWc9PWR4KXsKKwlpbmNfYWRkcigmcC0+eiwyLHQpOworCXN0b3JlX3JlZyhmLGl4LCZwLT56LElOVCk7CisJaW5jX2FkZHIoJnAtPnosLTIsdCk7CisJc3RvcmVfcmVnKGYsYWNjLCZwLT56LElOVCk7CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZihjPT1BU1NJR04mJmlzcmVnKHopJiZwLT56LnJlZz09ZHgpeworCWluY19hZGRyKCZwLT5xMSwyLHQpOworCWxvYWRfcmVnKGYsaXgsJnAtPnExLElOVCk7CisJaW5jX2FkZHIoJnAtPnExLC0yLHQpOworCWxvYWRfcmVnKGYsYWNjLCZwLT5xMSxJTlQpOworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoYz09UFVTSCl7CisJaWYocmVnc1thY2NdKSBlbWl0KGYsIlx0c3RkXHQlbGQsJXNcbiIsbG9mZi1yb2ZmLTItc3RhY2tvZmZzZXQscmVnbmFtZXNbc3BdKTsKKyAgICAgIH1lbHNlCisJZ2V0X2FjYyhmLHApOworICAgICAgLypUT0RPOiBhY2MgaW4gSUMsIGNvbnN0YW50cyAqLworICAgICAgaW5jX2FkZHIoJnAtPnExLDIsdCk7CisgICAgICBpZihjPT1NSU5VUyl7CisJaWYoQ1BVIT02ODEyJiYhb3B0c2l6ZSkKKwkgIGVtaXQoZiwiXHRsZGRcdCMwXG4iKTsKKwllbHNlCisJICBlbWl0KGYsIlx0Y2xyYVxuXHRjbHJiXG4iKTsKKyAgICAgIH1lbHNlCisJbG9hZF9yZWcoZixhY2MsJnAtPnExLElOVCk7CisgICAgICBpZihjPT1BRER8fGM9PVNVQil7CisJaW5jX2FkZHIoJnAtPnEyLDIsdCk7CisJZW1pdChmLCJcdCVzXHQiLGM9PUFERD8iYWRkZCI6InN1YmQiKTsKKwllbWl0X29iaihmLCZwLT5xMixJTlQpOworCWVtaXQoZiwiXG4iKTsKKyAgICAgIH1lbHNlIGlmKGM9PUFTU0lHTnx8Yz09UFVTSCl7CisgICAgICB9ZWxzZSBpZihjPT1NSU5VUyl7CisJZW1pdChmLCJcdHN1YmRcdCIpOworCWVtaXRfb2JqKGYsJnAtPnExLElOVCk7CisJZW1pdChmLCJcbiIpOworICAgICAgfWVsc2UgaWYoYz09S09NUExFTUVOVCl7CisJZW1pdChmLCJcdGNvbWFcbiIpOworCWVtaXQoZiwiXHRjb21iXG4iKTsKKyAgICAgIH1lbHNleworCWlmKGM9PUFORCkKKwkgIGVtaXQoZiwiXHRhbmRiXHQiKTsKKwllbHNlIGlmKGM9PU9SKQorCSAgZW1pdChmLCJcdG9yJXNiXHQiLENQVT09NjgxMj8iYSI6IiIpOworCWVsc2UgaWYoYz09WE9SKQorCSAgZW1pdChmLCJcdGVvcmJcdCIpOworCWluY19hZGRyKCZwLT5xMiwzLHQpOworCWVtaXRfb2JqKGYsJnAtPnEyLENIQVIpOworCWVtaXQoZiwiXG4iKTsKKwlpZihjPT1BTkQpCisJICBlbWl0KGYsIlx0YW5kYVx0Iik7CisJZWxzZSBpZihjPT1PUikKKwkgIGVtaXQoZiwiXHRvciVzYVx0IixDUFU9PTY4MTI/ImEiOiIiKTsKKwllbHNlIGlmKGM9PVhPUikKKwkgIGVtaXQoZiwiXHRlb3JhXHQiKTsKKwlpbmNfYWRkcigmcC0+cTIsLTEsdCk7CisJZW1pdF9vYmooZiwmcC0+cTIsQ0hBUik7CisJZW1pdChmLCJcbiIpOworICAgICAgfQorICAgICAgaWYoYz09UFVTSCl7CisJaWYoQ1BVPT02ODEyKQorCSAgZW1pdChmLCJcdHBzaGRcbiIpOworCWVsc2UKKwkgIGVtaXQoZiwiXHRwc2hzXHRiLGFcbiIpOworCXB1c2goMik7ZG9udHBvcCs9MjsKKyAgICAgIH1lbHNleworCWluY19hZGRyKCZwLT56LDIsdCk7CisJc3RvcmVfcmVnKGYsYWNjLCZwLT56LElOVCk7CisgICAgICB9CisgICAgICBpbmNfYWRkcigmcC0+cTEsLTIsdCk7CisgICAgICBpZihjPT1NSU5VUykKKwllbWl0KGYsIlx0bGRkXHQjMFxuIik7CisgICAgICBlbHNlCisJbG9hZF9yZWcoZixhY2MsJnAtPnExLElOVCk7CisgICAgICBpZihjPT1BREQpCisJZW1pdChmLCJcdGFkY2JcdCIpOworICAgICAgZWxzZSBpZihjPT1TVUIpCisJZW1pdChmLCJcdHNiY2JcdCIpOworICAgICAgZWxzZSBpZihjPT1BTkQpCisJZW1pdChmLCJcdGFuZGJcdCIpOworICAgICAgZWxzZSBpZihjPT1PUikKKwllbWl0KGYsIlx0b3Ilc2JcdCIsQ1BVPT02ODEyPyJhIjoiIik7CisgICAgICBlbHNlIGlmKGM9PVhPUikKKwllbWl0KGYsIlx0ZW9yYlx0Iik7CisgICAgICBlbHNlIGlmKGM9PUtPTVBMRU1FTlQpCisJZW1pdChmLCJcdGNvbWJcbiIpOworICAgICAgZWxzZSBpZihjPT1NSU5VUyl7CisJaW5jX2FkZHIoJnAtPnExLDEsdCk7CisJZW1pdChmLCJcdHNiY2JcdCIpOworCWVtaXRfb2JqKGYsJnAtPnExLENIQVIpOworCWVtaXQoZiwiXG4iKTsKKyAgICAgIH0KKyAgICAgIGlmKHAtPnEyLmZsYWdzKXsKKwlpbmNfYWRkcigmcC0+cTIsLTEsdCk7CisJZW1pdF9vYmooZiwmcC0+cTIsQ0hBUik7CisJZW1pdChmLCJcbiIpOworICAgICAgfQorICAgICAgaWYoYz09QUREKQorCWVtaXQoZiwiXHRhZGNhXHQiKTsKKyAgICAgIGVsc2UgaWYoYz09U1VCKQorCWVtaXQoZiwiXHRzYmNhXHQiKTsKKyAgICAgIGVsc2UgaWYoYz09QU5EKQorCWVtaXQoZiwiXHRhbmRhXHQiKTsKKyAgICAgIGVsc2UgaWYoYz09T1IpCisJZW1pdChmLCJcdG9yJXNhXHQiLENQVT09NjgxMj8iYSI6IiIpOworICAgICAgZWxzZSBpZihjPT1YT1IpCisJZW1pdChmLCJcdGVvcmFcdCIpOworICAgICAgZWxzZSBpZihjPT1LT01QTEVNRU5UKQorCWVtaXQoZiwiXHRjb21hXG4iKTsKKyAgICAgIGVsc2UgaWYoYz09TUlOVVMpeworCWluY19hZGRyKCZwLT5xMSwtMSx0KTsKKwllbWl0KGYsIlx0c2JjYVx0Iik7CisJZW1pdF9vYmooZiwmcC0+cTEsQ0hBUik7CisJZW1pdChmLCJcbiIpOworICAgICAgfQorICAgICAgaWYocC0+cTIuZmxhZ3MpeworCWluY19hZGRyKCZwLT5xMiwtMSx0KTsKKwllbWl0X29iaihmLCZwLT5xMixDSEFSKTsKKwllbWl0KGYsIlxuIik7CisgICAgICB9CisgICAgICBpZihjPT1QVVNIKXsKKwlpZihDUFU9PTY4MTIpCisJICBlbWl0KGYsIlx0cHNoZFxuIik7CisJZWxzZQorCSAgZW1pdChmLCJcdHBzaHNcdGIsYVxuIik7CisJcHVzaCgyKTtkb250cG9wKz0yOworCWlmKHJlZ3NbYWNjXSkgZW1pdChmLCJcdGxkZFx0JWxkLCVzXG4iLGxvZmYtcm9mZi0yLXN0YWNrb2Zmc2V0LHJlZ25hbWVzW3NwXSk7CisgICAgICB9ZWxzZXsKKwlpbmNfYWRkcigmcC0+eiwtMix0KTsKKwlzdG9yZV9yZWcoZixhY2MsJnAtPnosSU5UKTsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworIAorICAgIGlmKGM9PUNPTVBBUkUpeworICAgICAgaW50IHZhZHI7CisgICAgICBpZihkcmVsJiYocC0+cTEuZmxhZ3MmVkFSQURSKSYmIUlTRlVOQyhwLT5xMS52LT52dHlwLT5mbGFncykpIHZhZHI9MTsKKyAgICAgIGVsc2UgaWYoZHJlbCYmKHAtPnEyLmZsYWdzJlZBUkFEUikmJiFJU0ZVTkMocC0+cTIudi0+dnR5cC0+ZmxhZ3MpKSB2YWRyPTI7CisgICAgICBlbHNlIGlmKHBjcmVsJiYocC0+cTEuZmxhZ3MmVkFSQURSKSYmSVNGVU5DKHAtPnExLnYtPnZ0eXAtPmZsYWdzKSkgdmFkcj0xOworICAgICAgZWxzZSBpZihwY3JlbCYmKHAtPnEyLmZsYWdzJlZBUkFEUikmJklTRlVOQyhwLT5xMi52LT52dHlwLT5mbGFncykpIHZhZHI9MjsKKyAgICAgIGVsc2UgdmFkcj0wOworICAgICAgaWYodmFkciE9MSYmKHZhZHI9PTJ8fGlzY29uc3QocTEpfHxJU1JBQ0MocTIpKSl7CisJc3RydWN0IElDICpwMjsKKwlvPXAtPnExO3AtPnExPXAtPnEyO3AtPnEyPW87CisJcDI9cC0+bmV4dDsKKwl3aGlsZShwMiYmcDItPmNvZGU9PUZSRUVSRUcpIHAyPXAyLT5uZXh0OworCWlmKCFwMnx8cDItPmNvZGU8QkVRfHxwMi0+Y29kZT5CR1QpIGllcnJvcigwKTsKKwlpZihwMi0+Y29kZT09QkxUKSBwMi0+Y29kZT1CR1Q7CisJZWxzZSBpZihwMi0+Y29kZT09QkdUKSBwMi0+Y29kZT1CTFQ7CisJZWxzZSBpZihwMi0+Y29kZT09QkxFKSBwMi0+Y29kZT1CR0U7CisJZWxzZSBpZihwMi0+Y29kZT09QkdFKSBwMi0+Y29kZT1CTEU7CisgICAgICB9CisgICAgICAvKiBjYXNlIHdpdGggdHdvIHJlbGF0aXZlIGFkZHJlc3NlcyAqLworICAgICAgaWYoZHJlbCYmKHAtPnEyLmZsYWdzJlZBUkFEUikmJiFJU0ZVTkMocC0+cTIudi0+dnR5cC0+ZmxhZ3MpKSBza2lwX3JlbD0xOworICAgICAgaWYocGNyZWwmJihwLT5xMi5mbGFncyZWQVJBRFIpJiZJU0ZVTkMocC0+cTIudi0+dnR5cC0+ZmxhZ3MpKSBza2lwX3JlbD0xOworICAgIH0KKyNpZiAwCisgICAgLyogVE9ETzogZml4IGNjICovCisgICAgaWYoYz09Q09NUEFSRSYmaXNjb25zdChxMikpeworICAgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHQpOworICAgICAgaWYoSVNOVUxMKCkpeworCWlmKGNjJiYoY2NfdCZOVSk9PSh0Jk5VKSYmY29tcGFyZV9vYmplY3RzKGNjLCZwLT5xMSkpeworCSAgbGFzdGNvbXA9dDtjb250aW51ZTsKKwl9CisgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZighc2hvcnRfYWRkKQorICAgICAgc3dpdGNoX0lDKHApOworCisgICAgaWYoYz09Q09OVkVSVCl7CisgICAgICBpbnQgdG89cC0+dHlwZjImTlU7CisgICAgICBpZih0bz09SU5UKSB0bz1TSE9SVDsKKyAgICAgIGlmKHRvPT0oVU5TSUdORUR8SU5UKXx8dG89PU5QT0lOVEVSKSB0bz0oVU5TSUdORUR8U0hPUlQpOworICAgICAgaWYodG89PUZQT0lOVEVSfHx0bz09SFBPSU5URVIpIHRvPShVTlNJR05FRHxMT05HKTsKKyAgICAgIGlmKCh0Jk5VKT09SU5UKSB0PVNIT1JUOworICAgICAgaWYoKHQmTlUpPT0oVU5TSUdORUR8SU5UKXx8KHQmTlUpPT1OUE9JTlRFUikgdD0oVU5TSUdORUR8U0hPUlQpOworICAgICAgaWYoKHQmTlEpPT1GUE9JTlRFUnx8KHQmTlEpPT1IUE9JTlRFUikgdD0oVU5TSUdORUR8TE9ORyk7CisgICAgICAvKmlmKCh0Jk5RKT49TE9OR3x8KHRvJk5RKT49TE9ORykgaWVycm9yKDApOyovCisgICAgICBpZigodG8mTlEpPD1MT05HJiYodCZOUSk8PUxPTkcpeworCWlmKCh0byZOUSk8KHQmTlEpKXsKKwkgIGlmKElTTFdPUkQodCkpeworCSAgICBnZXRfYWNjKGYscCk7CisJICAgIGxvYWRfcmVnKGYsYWNjLCZwLT5xMSx0byk7CisJICAgIGlmKCh0byZOVSk9PUNIQVIpCisJICAgICAgZW1pdChmLFNFWCk7CisJICAgIGVsc2UgaWYoKHRvJk5VKT09KFVOU0lHTkVEfENIQVIpKQorCSAgICAgIGVtaXQoZiwiXHRjbHJhXG4iKTsKKwkgICAgaW5jX2FkZHIoJnAtPnosMix0KTsKKwkgICAgc3RvcmVfcmVnKGYsYWNjLCZwLT56LElOVCk7CisJICAgIGluY19hZGRyKCZwLT56LC0yLHQpOworCSAgICBpZih0byZVTlNJR05FRCl7CisJICAgICAgZW1pdChmLCJcdGNscmFcblx0Y2xyYlxuIik7CisJICAgIH1lbHNleworCSAgICAgIGlmKENQVT09NjgxMikKKwkJZW1pdChmLCJcdGV4Z1x0YSxiXG4iKTsKKwkgICAgICBlbHNlCisJCWVtaXQoZiwiXHR0ZnJcdGEsYlxuIik7CisJICAgICAgZW1pdChmLFNFWCk7CisJICAgICAgZW1pdChmLCJcdHRmclx0YSxiXG4iKTsKKwkgICAgfQorCSAgICBzdG9yZV9yZWcoZixhY2MsJnAtPnosSU5UKTsKKwkgICAgY29udGludWU7CisJICB9CisJICAvKmVtaXQoZiwiI2NvbnYgUkFDQz0lZCwgcmVncz0lZCBzY3JhdGNoPSVkXG4iLChpbnQpSVNSQUNDKHopLHJlZ3NbYWNjXSxzY3JhdGNocmVnKGFjYyxwKSk7Ki8KKwkgIGlmKCFJU1JBQ0MoeikpCisJICAgIGdldF9hY2MoZixwKTsKKwkgIGxvYWRfcmVnKGYsYWNjLCZwLT5xMSx0byk7CisJICBpZih0byZVTlNJR05FRCkKKwkgICAgZW1pdChmLCJcdGNscmFcbiIpOworCSAgZWxzZQorCSAgICBlbWl0KGYsU0VYKTsKKwkgIHN0b3JlX3JlZyhmLGFjYywmcC0+eix0KTsKKwkgIGNjPSZwLT56O2NjX3Q9dDsKKwkgIGNvbnRpbnVlOworCX1lbHNlIGlmKCh0byZOUSk+KHQmTlEpKXsKKwkgIGlmKCFJU1JBQ0MoeikmJiFJU1JBQ0MocTEpKQorCSAgICBnZXRfYWNjKGYscCk7CisJICBpZihJU0xXT1JEKHRvKSkKKwkgICAgaW5jX2FkZHIoJnAtPnExLDIsdG8pOworCSAgbG9hZF9yZWcoZixhY2MsJnAtPnExLHRvKTsKKwkgIHN0b3JlX3JlZyhmLGFjYywmcC0+eix0KTsKKwkgIGNvbnRpbnVlOworCX1lbHNleworCSAgYz1BU1NJR047CisJICBwLT5xMi52YWwudm1heD1zaXpldGFiW3QmTlFdOworCX0KKyAgICAgIH0KKyAgICB9CisgICAgaWYoYz09S09NUExFTUVOVCl7CisgICAgICBjYz0wOworICAgICAgaWYoY29tcGFyZV9vYmplY3RzKCZwLT5xMSwmcC0+eikmJiFpc3JlZyhxMSkmJihwLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKSE9RFJFRk9CSiYmKCFwLT5xMS5hbXx8cC0+cTEuYW0tPmZsYWdzIT1BQ0NfSU5EKSl7CisJZW1pdChmLCJcdGNvbVx0Iik7CisJZW1pdF9vYmooZiwmcC0+eix0KTsKKwllbWl0KGYsIlxuIik7CisJaWYoSVNIV09SRCh0KSl7CisJICBtb2JqPXAtPno7CisJICBpbmNfYWRkcigmbW9iaiwxLHQpOworCSAgZW1pdChmLCJcdGNvbVx0Iik7CisJICBlbWl0X29iaihmLCZtb2JqLElOVCk7CisJICBlbWl0KGYsIlxuIik7CisJfQorCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoKCFpc3JlZyh6KXx8cC0+ei5yZWchPWFjYykmJnJlZ3NbYWNjXSYmIXNjcmF0Y2hyZWcoYWNjLHApKQorCWdldF9hY2MoZixwKTsKKyAgICAgIGxvYWRfcmVnKGYsYWNjLCZwLT5xMSx0KTsKKyAgICAgIGVtaXQoZiwiXHRjb21hXG5cdGNvbWJcbiIpOworICAgICAgc3RvcmVfcmVnKGYsYWNjLCZwLT56LHQpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PU1JTlVTKXsKKyAgICAgIGlmKCghaXNyZWcoeil8fHAtPnoucmVnIT1hY2MpJiZyZWdzW2FjY10mJiFzY3JhdGNocmVnKGFjYyxwKSkKKwlnZXRfYWNjKGYscCk7CisgICAgICBpZihpc3JlZyhxMSkpeworCWxvYWRfcmVnKGYsYWNjLCZwLT5xMSx0KTsKKwllbWl0KGYsIlx0bmVnYVxuXHRuZWdiXG5cdHNiY2FcdCMwXG4iKTsKKyAgICAgIH1lbHNleworCWlmKENQVSE9NjgxMiYmIW9wdHNpemUpCisJICBlbWl0KGYsIlx0bGRkXHQjMFxuIik7CisJZWxzZQorCSAgZW1pdChmLCJcdGNscmFcblx0Y2xyYlxuIik7CisJZW1pdChmLCJcdHN1YmRcdCIpOworCWVtaXRfb2JqKGYsJnAtPnExLHQpOworCWVtaXQoZiwiXG4iKTsKKyAgICAgIH0KKyAgICAgIGNjPSZwLT56O2NjX3Q9dDsKKyAgICAgIHN0b3JlX3JlZyhmLGFjYywmcC0+eix0KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1TRVRSRVRVUk4peworICAgICAgaWYoaXNyZWcocTEpJiZwLT5xMS5yZWc9PXAtPnoucmVnKSBjb250aW51ZTsKKyAgICAgIGlmKHAtPnoucmVnKXsKKwlpZihJU0xXT1JEKHQpKXsKKwkgIGluY19hZGRyKCZwLT5xMSwwLHQpOworCSAgbG9hZF9yZWcoZixpeCwmcC0+cTEsSU5UKTsKKwkgIEJTRVQocmVnc19tb2RpZmllZCxpeCk7CisJICBpbmNfYWRkcigmcC0+cTEsMix0KTsKKwl9CisJbG9hZF9yZWcoZixhY2MsJnAtPnExLHQpOworCUJTRVQocmVnc19tb2RpZmllZCxhY2MpOworCisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09R0VUUkVUVVJOKXsKKyAgICAgIGlmKGlzcmVnKHopJiZwLT56LnJlZz09cC0+cTEucmVnKSBjb250aW51ZTsKKyAgICAgIGlmKHAtPnExLnJlZyl7CisJaWYoSVNMV09SRCh0KSl7CisJICBzdG9yZV9yZWcoZixpeCwmcC0+eixJTlQpOworCSAgQlNFVChyZWdzX21vZGlmaWVkLGl4KTsKKwkgIGluY19hZGRyKCZwLT56LDIsdCk7CisJfQorCXN0b3JlX3JlZyhmLGFjYywmcC0+eiwodCZOUSk9PUNIQVI/dDpJTlQpOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PUNBTEwpeworICAgICAgaW50IHJlZyxqbXA9MDsKKyAgICAgIGNjPTA7CisgICAgICBpZighY2FsY19yZWdzKHAsZiE9MCkmJnYtPmZpKSB2LT5maS0+ZmxhZ3MmPX5BTExfUkVHUzsKKyAgICAgIGlmKChwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiYhc3RyY21wKCJfX3ZhX3N0YXJ0IixwLT5xMS52LT5pZGVudGlmaWVyKSl7CisJbG9uZyBvZj12YV9vZmZzZXQodikrbG9mZisyOworCWVtaXQoZiwiXHR0ZnJcdCVzLGRcbiIscmVnbmFtZXNbc3BdKTsKKwlpZihvZikgZW1pdChmLCJcdGFkZGRcdCMlbGRcbiIsb2YpOworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoKHAtPnExLmZsYWdzJlZBUikmJnAtPnExLnYtPmZpJiZwLT5xMS52LT5maS0+aW5saW5lX2FzbSl7CisJZW1pdF9pbmxpbmVfYXNtKGYscC0+cTEudi0+ZmktPmlubGluZV9hc20pOworCWptcD0xOworICAgICAgfWVsc2V7CisJaWYoc3RhY2tvZmZzZXQ9PTAmJiFoYXZlX2ZyYW1lJiYhc3RyY21wKHJldCwicnRzIikpeworCSAgc3RydWN0IElDICpwMjsKKwkgIGptcD0xOworCSAgZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpeworCSAgICBpZihwMi0+Y29kZSE9RlJFRVJFRyYmcDItPmNvZGUhPUFMTE9DUkVHJiZwMi0+Y29kZSE9TEFCRUwpeworCSAgICAgIGptcD0wO2JyZWFrOworCSAgICB9CisJICB9CisJfQorCWlmKHAtPnExLmZsYWdzJkRSRUZPQkopeworCSAgLypGSVhNRTogdGVzdCB0aGlzKi8KKwkgIGlmKGptcCkKKwkgICAgZW1pdChmLCJcdGptcFx0Iik7CisJICBlbHNlCisJICAgIGVtaXQoZiwiXHRqc3JcdCIpOworCSAgaWYgKHAtPnExLnYtPnRhdHRyJkZBUikKKwkgIAllbWl0KGYsIlx0ZmFyXHQiKTsKKwkgIGVtaXRfb2JqKGYsJnAtPnExLHQpOworCSAgZW1pdChmLCJcbiIpOworCX1lbHNleworCSAgaWYoam1wKXsKKwkgICAgZW1pdChmLCJcdCVzXHQiLGptcGluc3QpOyAvKmVtaXQoZiwiXHRicmFcdCIpOyovCisJICAgIC8qaWYoIW5lZWRfcmV0dXJuKSByZXQ9MDsqLyAvKlRPRE86IHdvcmtzIHdpdGggb3B0aW1pemVyPyAqLworCSAgfWVsc2V7CisJICAgIGVtaXQoZiwiXHQlc1x0Iixqc3JpbnN0KTsgLyplbWl0KGYsIlx0YnNyXHQiKTsqLworCSAgfQorCSAgaWYgKHAtPnExLnYtPnRhdHRyJkZBUikKKwkgIAllbWl0KGYsIlx0ZmFyXHQiKTsKKwkgIGlmKHBjcmVsKXsKKwkgICAgcGNyZWw9MDsKKwkgICAgZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJICAgIHBjcmVsPTE7CisJICB9ZWxzZQorCSAgICBlbWl0X29iaihmLCZwLT5xMSx0KTsKKwkgIGVtaXQoZiwiXG4iKTsKKwl9CisgICAgICB9CisgICAgICBpZihzdGFja192YWxpZCl7CisgICAgICAgIGludCBpOworICAgICAgICBpZihwLT5jYWxsX2NudDw9MCl7CisgICAgICAgICAgZXJyX2ljPXA7aWYoZikgZXJyb3IoMzIwKTsKKyAgICAgICAgICBzdGFja192YWxpZD0wOworICAgICAgICB9CisgICAgICAgIGZvcihpPTA7c3RhY2tfdmFsaWQmJmk8cC0+Y2FsbF9jbnQ7aSsrKXsKKyAgICAgICAgICBpZihwLT5jYWxsX2xpc3RbaV0udi0+ZmkmJihwLT5jYWxsX2xpc3RbaV0udi0+ZmktPmZsYWdzJkFMTF9TVEFDSykpeworCSAgICAvKkZJWE1FOiBzaXplIG9mIHJldHVybiBhZGRyIGRlcGVuZHMgb24gbW9kZSAqLworCSAgICBpZigham1wKSBwdXNoKDIpOworCSAgICBjYWxsZWVfcHVzaCh6bTJsKHAtPmNhbGxfbGlzdFtpXS52LT5maS0+c3RhY2sxKSk7CisJICAgIGlmKCFqbXApIHBvcCgyKTsKKyAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGVycl9pYz1wO2lmKGYpIGVycm9yKDMxNyxwLT5jYWxsX2xpc3RbaV0udi0+aWRlbnRpZmllcik7CisgICAgICAgICAgICBzdGFja192YWxpZD0wOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYoIXptZXF0byhsMnptKDBMKSxwLT5xMi52YWwudm1heCkpeworCW5vdHBvcHBlZCs9em0ybChwLT5xMi52YWwudm1heCk7CisJZG9udHBvcC09em0ybChwLT5xMi52YWwudm1heCk7CisJaWYoIShnX2ZsYWdzWzJdJlVTRURGTEFHKSYmc3RhY2tvZmZzZXQ9PS1ub3Rwb3BwZWQpeworCSAgLyogIEVudGZlcm5lbiBkZXIgUGFyYW1ldGVyIHZlcnpvZWdlcm4gICovCisJfWVsc2V7CisJICBnZW5fcG9wKGYsem0ybChwLT5xMi52YWwudm1heCkpOworCSAgbm90cG9wcGVkLT16bTJsKHAtPnEyLnZhbC52bWF4KTsKKwl9CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09QVNTSUdOfHxjPT1QVVNIKXsKKyAgICAgIGlmKGM9PVBVU0gpIGRvbnRwb3ArPXptMmwocC0+cTIudmFsLnZtYXgpOworICAgICAgaWYoIXptbGVxKHAtPnEyLnZhbC52bWF4LGwyem0oMkwpKSl7CisJdW5zaWduZWQgbG9uZyBzaXplO2ludCBxcj0wLHpyPTAsY3I9MCxweD0wLHB5PTAscHU9MCxwZD0wLGxxPTAsbHo9MDsKKwlzaXplPXptMmwocC0+cTIudmFsLnZtYXgpOworCWlmKGM9PUFTU0lHTil7CisJICBpZighcC0+ei5hbSYmKHAtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJklTSURYKHAtPnoucmVnKSl7CisJICAgIHpyPXAtPnoucmVnO2x6PTE7CisJICB9CisJfQorCWlmKCFwLT5xMS5hbSYmKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZJU0lEWChwLT5xMS5yZWcpJiZwLT5xMS5yZWchPXpyKXsKKwkgIHFyPXAtPnExLnJlZztscT0xOworCX0KKwlpZighcXIpeworCSAgaWYoenI9PWl4KSBxcj1peTsKKwkgIGVsc2UgaWYoenI9PWl5fHx6cj09aXUpIHFyPWl4OworCSAgZWxzZXtxcj1peDt6cj1peTt9CisJfWVsc2UgaWYoIXpyKXsKKwkgIGlmKHFyPT1peCkgenI9aXk7IGVsc2UgenI9aXg7CisJfQorCWlmKENQVSE9NjgxMil7CisJICBpZihxciE9aXUmJnpyIT1pdSkgY3I9aXU7CisJICBpZihxciE9aXgmJnpyIT1peCkgY3I9aXg7CisJICBpZihxciE9aXkmJnpyIT1peSkgY3I9aXk7CisJICBpZighY3IpIGllcnJvcigwKTsKKwl9CisJaWYoYz09UFVTSCl7CisJICBlbWl0KGYsIlx0bGVhc1x0JWxkLCVzXG4iLFNHTjE2KC1zaXplKSxyZWduYW1lc1tzcF0pOworCSAgcHVzaChzaXplKTsKKwl9CisJaWYoQ1BVIT02ODEyJiYoZHJlbHx8IXJlZ3VzZWRbaXVdfHwocmVnc1tpdV0mJiFzY3JhdGNocmVnKGl1LHApKSkpeworCSAgaWYoYz09UFVTSCkKKwkgICAgZW1pdChmLCJcdHN0dVx0JWxkLCVzXG4iLGxvZmYtcm9mZi04LXN0YWNrb2Zmc2V0LHJlZ25hbWVzW3NwXSk7CisJICBlbHNleworCSAgICBlbWl0KGYsU1BVU0goInUiKSk7CisJICAgIHB1c2goMik7CisJICB9CisJICBwdT0xOworCX0KKwlpZighcmVndXNlZFtpeV18fChyZWdzW2l5XSYmIXNjcmF0Y2hyZWcoaXkscCkpKXsKKwkgIGlmKGM9PVBVU0gpCisJICAgIGVtaXQoZiwiXHRzdHlcdCVsZCwlc1xuIixsb2ZmLXJvZmYtNC1zdGFja29mZnNldCxyZWduYW1lc1tzcF0pOworCSAgZWxzZXsKKwkgICAgZW1pdChmLFNQVVNIKCJ5IikpOworCSAgICBwdXNoKDIpOworCSAgfQorCSAgcHk9MTsKKwl9CisJaWYocmVnc1tpeF0mJiFzY3JhdGNocmVnKGl4LHApKXsKKwkgIGlmKGM9PVBVU0gpCisJICAgIGVtaXQoZiwiXHRzdHhcdCVsZCwlc1xuIixsb2ZmLXJvZmYtMi1zdGFja29mZnNldCxyZWduYW1lc1tzcF0pOworCSAgZWxzZXsKKwkgICAgZW1pdChmLFNQVVNIKCJ4IikpOworCSAgICBwdXNoKDIpOworCSAgfQorCSAgcHg9MTsKKwl9CisJaWYoIWxxKSBsb2FkX2FkZHIoZixxciwmcC0+cTEpOworCWlmKGM9PVBVU0gpCisJICBlbWl0KGYsIlx0dGZyXHQlcywlc1xuIixyZWduYW1lc1tzcF0scmVnbmFtZXNbenJdKTsKKwllbHNlCisJICBpZighbHopIGxvYWRfYWRkcihmLHpyLCZwLT56KTsKKwlpZihzaXplPD02fHwoc2l6ZTw9MTYmJiFvcHRzaXplKSl7CisJICBpZihDUFUhPTY4MTIpeworCSAgICBpZighc2NyYXRjaHJlZyhhY2MscCkpeworCSAgICAgIGlmKGM9PVBVU0gpCisJCWVtaXQoZiwiXHRzdGRcdCVsZCwlc1xuIixsb2ZmLXJvZmYtNi1zdGFja29mZnNldCxyZWduYW1lc1tzcF0pOworCSAgICAgIGVsc2V7CisJCWVtaXQoZixTUFVTSEQpOworCQlwdXNoKDIpOworCSAgICAgIH0KKwkgICAgICBwZD0yOworCSAgICB9CisJICB9CisJICB3aGlsZShzaXplPjIpeworCSAgICBpZihDUFU9PTY4MTIpCisJICAgICAgZW1pdChmLCJcdG1vdndcdDIsJXMrLDIsJXMrXG4iLHJlZ25hbWVzW3FyXSxyZWduYW1lc1t6cl0pOworCSAgICBlbHNlCisJICAgICAgZW1pdChmLCJcdGxkZFx0LCVzKytcblx0c3RkXHQsJXMrK1xuIixyZWduYW1lc1txcl0scmVnbmFtZXNbenJdKTsKKwkgICAgc2l6ZS09MjsKKwkgIH0KKwkgIGlmKENQVT09NjgxMikKKwkgICAgZW1pdChmLCJcdG1vdiVjXHQwLCVzLDAsJXNcbiIsc2l6ZT09Mj8ndyc6J2InLHJlZ25hbWVzW3FyXSxyZWduYW1lc1t6cl0pOworCSAgZWxzZQorCSAgICBlbWl0KGYsIlx0bGQlY1x0LCVzXG5cdHN0JWNcdCwlc1xuIixzaXplPT0yPydkJzonYicscmVnbmFtZXNbcXJdLHNpemU9PTI/J2QnOidiJyxyZWduYW1lc1t6cl0pOworCX1lbHNleworCSAgaW50IGw9KytsYWJlbCxjbnQ9KGludCkob3B0c2l6ZT9zaXplOnNpemUvOCk7CisJICBpZihyZWdzW2FjY10mJiFzY3JhdGNocmVnKGFjYyxwKSl7CisJICAgIGlmKGM9PVBVU0gpCisJICAgICAgZW1pdChmLCJcdHN0JWNcdCVsZCwlc1xuIiwoQ1BVIT02ODEyJiZjbnQ8PWJ5dGVtYXNrKT8nYic6J2QnLGxvZmYtcm9mZi02LXN0YWNrb2Zmc2V0LHJlZ25hbWVzW3NwXSk7CisJICAgIGVsc2V7CisJICAgICAgaWYoQ1BVIT02ODEyJiZjbnQ8PWJ5dGVtYXNrKXsKKwkJZW1pdChmLFNQVVNIKCJiIikpOworCQlwdXNoKDEpOworCSAgICAgIH1lbHNleworCQllbWl0KGYsU1BVU0hEKTsKKwkJcHVzaCgyKTsKKwkgICAgICB9CisJICAgIH0KKwkgICAgcGQ9KENQVSE9NjgxMiYmY250PD1ieXRlbWFzayk/MToyOworCSAgfQorCSAgaWYoQ1BVIT02ODEyJiZjbnQ8PWJ5dGVtYXNrKQorCSAgICBlbWl0KGYsIlx0bGRiXHQjJWx1XG4iLGNudCk7CisJICBlbHNlCisJICAgIGVtaXQoZiwiXHRsZGRcdCMlbHVcbiIsY250KTsKKwkgIGNjPTA7CisjaWYgMAorCSAgaWYoQ1BVIT02ODEyJiYoKCFyZWdzYVtpdV0mJnJlZ3NbaXVdKXx8ZHJlbCkpeworCSAgICBpZihjPT1QVVNIKXsKKwkgICAgICBlbWl0KGYsIlx0c3R1XHQlbGQsJXNcbiIsbG9mZi1yb2ZmLTgtc3RhY2tvZmZzZXQscmVnbmFtZXNbc3BdKTsgCisJICAgIH1lbHNleworCSAgICAgIGVtaXQoZixTUFVTSCgidSIpKTtwdXNoKDIpOworCSAgICB9CisJICB9CisjZW5kaWYKKwkgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGwpOworCSAgaWYoQ1BVPT02ODEyKXsKKwkgICAgaWYob3B0c2l6ZSl7CisJICAgICAgZW1pdChmLCJcdG1vdmJcdDIsJXMrLDIsJXMrXG4iLHJlZ25hbWVzW3FyXSxyZWduYW1lc1t6cl0pOworCSAgICB9ZWxzZXsKKwkgICAgICBlbWl0KGYsIlx0bW92d1x0MiwlcyssMiwlcytcbiIscmVnbmFtZXNbcXJdLHJlZ25hbWVzW3pyXSk7CisJICAgICAgZW1pdChmLCJcdG1vdndcdDIsJXMrLDIsJXMrXG4iLHJlZ25hbWVzW3FyXSxyZWduYW1lc1t6cl0pOworCSAgICAgIGVtaXQoZiwiXHRtb3Z3XHQyLCVzKywyLCVzK1xuIixyZWduYW1lc1txcl0scmVnbmFtZXNbenJdKTsKKwkgICAgICBlbWl0KGYsIlx0bW92d1x0MiwlcyssMiwlcytcbiIscmVnbmFtZXNbcXJdLHJlZ25hbWVzW3pyXSk7CisJICAgICAgc2l6ZT1zaXplJjc7CisJICAgIH0KKwkgICAgZW1pdChmLCJcdGRibmVcdGQsJXMlZFxuIixsYWJwcmVmaXgsbCk7CisJICB9ZWxzZXsKKwkgICAgaWYob3B0c2l6ZSl7CisJICAgICAgZW1pdChmLCJcdGxkJXNcdCwlcytcblx0c3Qlc1x0LCVzK1xuIixyZWduYW1lc1tjcl0scmVnbmFtZXNbcXJdLHJlZ25hbWVzW2NyXSxyZWduYW1lc1t6cl0pOworCSAgICAgIHNpemUmPTE7CisJICAgIH1lbHNleworCSAgICAgIGVtaXQoZiwiXHRsZCVzXHQsJXMrK1xuXHRzdCVzXHQsJXMrK1xuIixyZWduYW1lc1tjcl0scmVnbmFtZXNbcXJdLHJlZ25hbWVzW2NyXSxyZWduYW1lc1t6cl0pOworCSAgICAgIGVtaXQoZiwiXHRsZCVzXHQsJXMrK1xuXHRzdCVzXHQsJXMrK1xuIixyZWduYW1lc1tjcl0scmVnbmFtZXNbcXJdLHJlZ25hbWVzW2NyXSxyZWduYW1lc1t6cl0pOworCSAgICAgIGVtaXQoZiwiXHRsZCVzXHQsJXMrK1xuXHRzdCVzXHQsJXMrK1xuIixyZWduYW1lc1tjcl0scmVnbmFtZXNbcXJdLHJlZ25hbWVzW2NyXSxyZWduYW1lc1t6cl0pOworCSAgICAgIGVtaXQoZiwiXHRsZCVzXHQsJXMrK1xuXHRzdCVzXHQsJXMrK1xuIixyZWduYW1lc1tjcl0scmVnbmFtZXNbcXJdLHJlZ25hbWVzW2NyXSxyZWduYW1lc1t6cl0pOworCSAgICAgIHNpemUmPTc7CisJICAgIH0KKwkgICAgaWYoY250PD1ieXRlbWFzaykKKwkgICAgICBlbWl0KGYsIlx0ZGVjYlxuIik7CisJICAgIGVsc2UKKwkgICAgICBlbWl0KGYsIlx0c3ViZFx0IzFcbiIpOworCSAgICBlbWl0KGYsIlx0Ym5lXHQlcyVkXG4iLGxhYnByZWZpeCxsKTsKKwkgIH0KKyNpZiAwCisJICBpZihDUFUhPTY4MTImJigoIXJlZ3NhW2l1XSYmcmVnc1tpdV0pfHxkcmVsKSl7CisJICAgIGlmKGM9PVBVU0gpeworCSAgICAgIGVtaXQoZiwiXHRsZHVcdCVsZCwlc1xuIixsb2ZmLXJvZmYtOC1zdGFja29mZnNldCxyZWduYW1lc1tzcF0pOworCSAgICB9ZWxzZXsKKwkgICAgICBlbWl0KGYsU1BVTEwoInUiKSk7cG9wKDIpOworCSAgICB9CisJICB9CisjZW5kaWYKKwkgIHdoaWxlKHNpemU+PTIpeworCSAgICBpZihDUFU9PTY4MTIpCisJICAgICAgZW1pdChmLCJcdG1vdndcdDIsJXMrLDIsJXMrXG4iLHJlZ25hbWVzW3FyXSxyZWduYW1lc1t6cl0pOworCSAgICBlbHNlCisJICAgICAgZW1pdChmLCJcdGxkZFx0LCVzKytcblx0c3RkXHQsJXMrK1xuIixyZWduYW1lc1txcl0scmVnbmFtZXNbenJdKTsKKwkgICAgc2l6ZS09MjsKKwkgIH0KKwkgIGlmKHNpemUpeworCSAgICBpZihDUFU9PTY4MTIpCisJICAgICAgZW1pdChmLCJcdG1vdmJcdDAsJXMsMCwlc1xuIixyZWduYW1lc1txcl0scmVnbmFtZXNbenJdKTsKKwkgICAgZWxzZQorCSAgICAgIGVtaXQoZiwiXHRsZGJcdCwlc1xuXHRzdGJcdCwlc1xuIixyZWduYW1lc1txcl0scmVnbmFtZXNbenJdKTsKKwkgIH0KKwl9CisJaWYocGQpeworCSAgaWYoYz09UFVTSCkgCisJICAgIGVtaXQoZiwiXHRsZCVjXHQlbGQsJXNcbiIsKHBkPT0xKT8nYic6J2QnLGxvZmYtcm9mZi02LXN0YWNrb2Zmc2V0LHJlZ25hbWVzW3NwXSk7CisJICBlbHNleworCSAgICBpZihwZD09MSl7CisJICAgICAgZW1pdChmLFNQVUxMKCJiIikpOworCSAgICAgIHBvcCgxKTsKKwkgICAgfWVsc2V7CisJICAgICAgZW1pdChmLFNQVUxMRCk7CisJICAgICAgcG9wKDIpOworCSAgICB9CisJICB9CisJfQorCWlmKHB4KXsKKwkgIGlmKGM9PVBVU0gpIAorCSAgICBlbWl0KGYsIlx0bGR4XHQlbGQsJXNcbiIsbG9mZi1yb2ZmLTItc3RhY2tvZmZzZXQscmVnbmFtZXNbc3BdKTsKKwkgIGVsc2V7CisJICAgIGVtaXQoZixTUFVMTCgieCIpKTsKKwkgICAgcG9wKDIpOworCSAgfQorCX0KKwlpZihweSl7CisJICBpZihjPT1QVVNIKSAKKwkgICAgZW1pdChmLCJcdGxkeVx0JWxkLCVzXG4iLGxvZmYtcm9mZi00LXN0YWNrb2Zmc2V0LHJlZ25hbWVzW3NwXSk7CisJICBlbHNleworCSAgICBlbWl0KGYsU1BVTEwoInkiKSk7CisJICAgIHBvcCgyKTsKKwkgIH0KKwl9CisJaWYocHUpeworCSAgaWYoYz09UFVTSCkgCisJICAgIGVtaXQoZiwiXHRsZHVcdCVsZCwlc1xuIixsb2ZmLXJvZmYtOC1zdGFja29mZnNldCxyZWduYW1lc1tzcF0pOworCSAgZWxzZXsKKwkgICAgZW1pdChmLFNQVUxMKCJ1IikpOworCSAgICBwb3AoMik7CisJICB9CisJfQorCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoIUlTU0NBTEFSKHQpKSB0PXptZXF0byhwLT5xMi52YWwudm1heCxsMnptKDFMKSk/Q0hBUjpJTlQ7CisgICAgICBpZigodCZOUSk9PUNIQVImJiF6bWVxdG8ocC0+cTIudmFsLnZtYXgsbDJ6bSgxTCkpKSB0PUlOVDsJCisgICAgICBpZihtb3Zfb3AoJnAtPnExKSYmKGM9PVBVU0h8fG1vdl9vcCgmcC0+eikpKXsKKwllbWl0KGYsIlx0bW92JWNcdCIsSVNIV09SRCh0KT8ndyc6J2InKTsKKwllbWl0X29iaihmLCZwLT5xMSx0KTsKKwlpZihjPT1BU1NJR04peworCSAgZW1pdChmLCIsIik7CisJICBlbWl0X29iaihmLCZwLT56LHQpOworCSAgZW1pdChmLCJcbiIpOworCX1lbHNleworCSAgZW1pdChmLCIsJWQsLSVzXG4iLElTSFdPUkQodCk/MjoxLHJlZ25hbWVzW3NwXSk7CisJICBwdXNoKElTSFdPUkQodCk/MjoxKTsKKwl9CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZigoKHJlZ3NbYWNjXSYmcmVnc1tpeF0pfHwodCZOUSk9PUNIQVIpJiYocC0+cTEuZmxhZ3MmS09OU1QpJiYhaXNyZWcoeikpeworCWV2YWxfY29uc3QoJnAtPnExLnZhbCx0KTsKKwlpZih6bWVxdG8odm1heCxsMnptKDBMKSkmJnp1bWVxdG8odnVtYXgsdWwyenVtKDBVTCkpJiYoKHAtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSkhPURSRUZPQkp8fCh0Jk5RKT09Q0hBUikmJighcC0+ei5hbXx8cC0+ei5hbS0+ZmxhZ3MhPUFDQ19JTkR8fCh0Jk5RKT09Q0hBUikpeworCSAgZW1pdChmLCJcdGNsclx0Iik7CisJICBpZihjPT1BU1NJR04peworCSAgICBlbWl0X29iaihmLCZwLT56LHQpO2VtaXQoZiwiXG4iKTsKKwkgIH1lbHNleworCSAgICBlbWl0KGYsQ1BVPT02ODEyPyIxLC1zcFxuIjoiLC1zXG4iKTsKKwkgICAgcHVzaCgxKTsKKwkgIH0KKwkgIGlmKCFJU0hXT1JEKHQpKSBjb250aW51ZTsKKwkgIGVtaXQoZiwiXHRjbHJcdCIpOworCSAgaWYoYz09QVNTSUdOKXsKKwkgICAgbW9iaj1wLT56OworCSAgICBpbmNfYWRkcigmbW9iaiwxLHQpOworCSAgICBlbWl0X29iaihmLCZtb2JqLHQpO2VtaXQoZiwiXG4iKTsKKwkgIH1lbHNleworCSAgICBlbWl0KGYsQ1BVPT02ODEyPyIxLC1zcFxuIjoiLC1zXG4iKTsKKwkgICAgcHVzaCgxKTsKKwkgIH0KKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgfQorICAgICAgaWYoYz09UFVTSCl7CisJaW50IHN0PTA7CisJaWYoaXNyZWcocTEpKXsKKwkgIHJlZz1wLT5xMS5yZWc7CisJfWVsc2V7CisJICBpZigodCZOUSk9PUNIQVJ8fCFyZWdzW2FjY118fHNjcmF0Y2hyZWcoYWNjLHApKSByZWc9YWNjOworCSAgZWxzZSBpZighcmVnc1tpeF18fHNjcmF0Y2hyZWcoaXgscCkpIHJlZz1peDsKKwkgIGVsc2UgaWYocmVndXNlZFtpeV0mJighcmVnc1tpeV18fHNjcmF0Y2hyZWcoaXkscCkpKSByZWc9aXk7CisJICBlbHNlIGlmKHJlZ3VzZWRbaXVdJiYhZHJlbCYmQ1BVIT02ODEyJiYoIXJlZ3NbaXVdfHxzY3JhdGNocmVnKGl1LHApKSkgcmVnPWl1OworCSAgZWxzZSByZWc9YWNjOworCSAgaWYocmVnc1tyZWddJiYhc2NyYXRjaHJlZyhyZWcscCkpeworCSAgICBzdD0xOworCSAgICBlbWl0KGYsIlx0c3Qlc1x0JWxkLCVzXG4iLHJlZ25hbWVzW3JlZ10sKGxvbmcpbG9mZi1yb2ZmLTItc3RhY2tvZmZzZXQscmVnbmFtZXNbc3BdKTsKKwkgIH0KKwkgIGxvYWRfcmVnKGYscmVnLCZwLT5xMSx0KTsKKwl9CisJaWYoKHQmTlEpPT1DSEFSKQorCSAgZW1pdChmLFNQVVNIKCJiIikpOworCWVsc2UgaWYocmVnPT1peCkKKwkgIGVtaXQoZixTUFVTSCgieCIpKTsKKwllbHNlIGlmKHJlZz09aXkpCisJICBlbWl0KGYsU1BVU0goInkiKSk7CisJZWxzZSBpZihyZWc9PWl1KQorCSAgZW1pdChmLFNQVVNIKCJ1IikpOworCWVsc2UKKwkgIGVtaXQoZixTUFVTSEQpOworCXB1c2goem0ybChwLT5xMi52YWwudm1heCkpOworCWlmKHN0KQorCSAgZW1pdChmLCJcdGxkJXNcdCVsZCwlc1xuIixyZWduYW1lc1tyZWddLChsb25nKWxvZmYtcm9mZi0yLXN0YWNrb2Zmc2V0LHJlZ25hbWVzW3NwXSk7CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZihjPT1BU1NJR04peworCWlmKGlzcmVnKHExKSYmaXNyZWcoeikpeworCSAgaWYocC0+cTEucmVnIT1wLT56LnJlZykKKwkgICAgZW1pdChmLCJcdHRmclx0JXMsJXNcbiIscmVnbmFtZXNbcC0+cTEucmVnXSxyZWduYW1lc1twLT56LnJlZ10pOworCX1lbHNlIGlmKGlzcmVnKHExKSl7CisJICBzdG9yZV9yZWcoZixwLT5xMS5yZWcsJnAtPnosdCk7CisJfWVsc2UgaWYoaXNyZWcoeikpeworCSAgbG9hZF9yZWcoZixwLT56LnJlZywmcC0+cTEsdCk7CisJfWVsc2V7CisJICByZWc9Z2V0X3JlZyhmLHAsdCk7CisJICBsb2FkX3JlZyhmLHJlZywmcC0+cTEsdCk7CisJICBzdG9yZV9yZWcoZixyZWcsJnAtPnosdCk7CisJfQorCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWVycm9yKDApOworICAgIH0KKyAgICBpZihjPT1BRERSRVNTKXsKKyAgICAgIGludCBweD0wOworICAgICAgaWYoaXNyZWcoeikpeworCXJlZz1wLT56LnJlZzsKKyAgICAgIH1lbHNlIGlmKCFyZWdzW2l4XSl7CisJcmVnPWl4OworICAgICAgfWVsc2UgaWYoIXJlZ3NbaXldKXsKKwlyZWc9aXk7CisgICAgICB9ZWxzZXsKKwkvKkZJWE1FOiB0ZXN0IGlmIHggdXNlZCBpbiBxMSAqLworCXB4PTE7CisJZW1pdChmLFNQVVNIKCJ4IikpOworCXJlZz1peDsKKwlwdXNoKDIpOworICAgICAgfQorICAgICAgbG9hZF9hZGRyKGYscmVnLCZwLT5xMSk7CisgICAgICBpZighKHAtPnouZmxhZ3MmUkVHKXx8cC0+ei5yZWchPXJlZykKKwlzdG9yZV9yZWcoZixyZWcsJnAtPnoscC0+dHlwZjIpOworICAgICAgaWYocHgpeworCWVtaXQoZixTUFVMTCgieCIpKTsKKwlwb3AoMik7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZigoYz09TVVMVHx8Yz09RElWfHwoYz09TU9EJiYocC0+dHlwZiZVTlNJR05FRCkpKSYmaXNjb25zdChxMikpeworICAgICAgbG9uZyBsbjsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCx0KTsKKyAgICAgIGlmKHptbGVxKGwyem0oMEwpLHZtYXgpJiZ6dW1sZXEodWwyenVtKDBVTCksdnVtYXgpKXsKKwlpZigobG49cG9mMih2dW1heCkpJiZsbjw1KXsKKwkgIGlmKGM9PU1PRCl7CisJICAgIHZtYXg9em1zdWIodm1heCxsMnptKDFMKSk7CisJICAgIGM9cC0+Y29kZT1jPUFORDsKKwkgIH1lbHNleworCSAgICB2bWF4PWwyem0obG4tMSk7CisJICAgIGlmKGM9PURJVikgcC0+Y29kZT1jPVJTSElGVDsgZWxzZSBwLT5jb2RlPWM9TFNISUZUOworCSAgfQorCSAgYz1wLT5jb2RlOworCSAgZ3ZhbC52bWF4PXZtYXg7CisJICBldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CisJICBpZihjPT1BTkQpeworCSAgICBpbnNlcnRfY29uc3QoJnAtPnEyLnZhbCx0KTsKKwkgIH1lbHNleworCSAgICBpbnNlcnRfY29uc3QoJnAtPnEyLnZhbCx0KTsKKwkgICAgcC0+dHlwZjI9SU5UOworCSAgfQorCX0KKyAgICAgIH0KKyAgICB9CisgICAgaWYoYz09TU9EfHxjPT1ESVYpeworICAgICAgaWVycm9yKDApOworICAgICAgY29udGludWU7CisgICAgfQorCisKKyAgICBpZigoYz09QUREfHxjPT1TVUIpJiYocC0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QmJihwLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKSE9UkVHJiYocC0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSkhPURSRUZPQkomJiFwLT5xMS5hbSYmIXAtPnouYW0mJmNvbXBhcmVfb2JqZWN0cygmcC0+cTEsJnAtPnopKXsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCx0KTsKKyAgICAgIGlmKGM9PVNVQikgdm1heD16bXN1YihaMCx2bWF4KTsKKyAgICAgIGlmKCh0Jk5RKT09Q0hBUiYmem1lcXRvKHZtYXgsWjEpKXsKKwllbWl0KGYsIlx0aW5jXHQiKTsKKwllbWl0X29iaihmLCZwLT56LHQpOworCWVtaXQoZiwiXG4iKTsKKwljb250aW51ZTsKKyAgICAgIH1lbHNlIGlmKCh0Jk5RKT09Q0hBUiYmem1lcXRvKHZtYXgsbDJ6bSgtMUwpKSl7CisJZW1pdChmLCJcdGRlY1x0Iik7CisJZW1pdF9vYmooZiwmcC0+eix0KTsKKwllbWl0KGYsIlxuIik7CisJY29udGludWU7CisgICAgICB9ZWxzZSBpZigoKHQmTlEpPT1TSE9SVHx8KHQmTlEpPT1JTlQpJiZ6bWVxdG8odm1heCxsMnptKDFMKSkpeworCWluY19hZGRyKCZwLT56LDEsdCk7CisJZW1pdChmLCJcdGluY1x0Iik7CisJZW1pdF9vYmooZiwmcC0+eix0KTsKKwllbWl0KGYsIlxuIik7CisJZW1pdChmLCJcdGJuZVx0JXMlZFxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisJaW5jX2FkZHIoJnAtPnosLTEsdCk7CisJZW1pdChmLCJcdGluY1x0Iik7CisJZW1pdF9vYmooZiwmcC0+eix0KTsKKwllbWl0KGYsIlxuIik7CisJZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsbGFiZWwpOworCWNvbnRpbnVlOworICAgICAgfWVsc2UgaWYocmVnc1thY2NdJiYoKHQmTlEpPT1TSE9SVHx8KHQmTlEpPT1JTlQpJiZ6bWVxdG8odm1heCxsMnptKC0xTCkpKXsKKwlpbmNfYWRkcigmcC0+eiwxLHQpOworCWVtaXQoZiwiXHR0c3RcdCIpOworCWVtaXRfb2JqKGYsJnAtPnosdCk7CisJZW1pdChmLCJcbiIpOworCWVtaXQoZiwiXHRibmVcdCVzJWRcbiIsbGFicHJlZml4LCsrbGFiZWwpOworCWluY19hZGRyKCZwLT56LC0xLHQpOworCWVtaXQoZiwiXHRkZWNcdCIpOworCWVtaXRfb2JqKGYsJnAtPnosdCk7CisJZW1pdChmLCJcbiIpOworCWVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LGxhYmVsKTsKKwlpbmNfYWRkcigmcC0+eiwxLHQpOworCWVtaXQoZiwiXHRkZWNcdCIpOworCWVtaXRfb2JqKGYsJnAtPnosdCk7CisJZW1pdChmLCJcbiIpOworCWNvbnRpbnVlOworICAgICAgfQorICAgIH0KKworICAgIGlmKChjPj1MU0hJRlQmJmM8PU1PRCl8fGM9PUFEREkyUHx8Yz09U1VCSUZQfHxjPT1TVUJQRlB8fChjPj1PUiYmYzw9QU5EKXx8Yz09Q09NUEFSRSl7CisgICAgICBjaGFyICpzOworICAgICAgLypGSVhNRTogbmljaHQgaW1tZXIgYmVzc2VyKi8KKyAgICAgIGlmKElTTFdPUkQodCkmJmM9PUxTSElGVCYmaXNjb25zdChxMikpeworCWV2YWxfY29uc3QoJnAtPnEyLnZhbCx0KTsKKwlpZih6bTJsKHZtYXgpPT0xKXsKKwkgIHAtPmNvZGU9Yz1BREQ7CisJICBwLT5xMj1wLT5xMTsKKwl9CisgICAgICB9CisgICAgICBpZigoYz09QUREfHxjPT1BRERJMlB8fGM9PU1VTFR8fChjPj1PUiYmYzw9QU5EKSkmJmlzcmVnKHEyKSYmIWlzcmVnKHExKSYmIXNob3J0X2FkZCl7CisJbz1wLT5xMTtwLT5xMT1wLT5xMjtwLT5xMj1vOworICAgICAgfQorICAgICAgaWYoKGM9PUFERHx8Yz09TVVMVHx8KGM+PU9SJiZjPD1BTkQpKSYmaXNyZWcocTIpJiZwLT5xMi5yZWc9PWFjYyYmIXNob3J0X2FkZCl7CisJbz1wLT5xMTtwLT5xMT1wLT5xMjtwLT5xMj1vOworICAgICAgfQorICAgICAgaWYoYz09TVVMVHx8Yz09TU9EKXsKKwlpZigoIWlzcmVnKHopfHxwLT56LnJlZyE9YWNjKSYmcmVnc1thY2NdJiYhc2NyYXRjaHJlZyhhY2MscCkpCisJICBnZXRfYWNjKGYscCk7CisJcmVnPWFjYzsKKwkvKkZJWE1FOiB5IGJ6dy4geC1SZWdpc3RlciovCisgICAgICB9ZWxzZSBpZihjPT1MU0hJRlR8fGM9PVJTSElGVHx8Yz09QU5EfHxjPT1PUnx8Yz09WE9SKXsKKwlpZigoIWlzcmVnKHopfHxwLT56LnJlZyE9YWNjKSYmcmVnc1thY2NdJiYhc2NyYXRjaHJlZyhhY2MscCkpCisJICBnZXRfYWNjKGYscCk7CisJcmVnPWFjYzsKKyAgICAgIH1lbHNlIGlmKGM9PURJVil7CisJcmVnPWl4OworCWllcnJvcigwKTsKKyAgICAgIH1lbHNlIGlmKGlzcmVnKHopKXsKKwlyZWc9cC0+ei5yZWc7CisgICAgICB9ZWxzZSBpZihpc3JlZyhxMSkmJihjPT1DT01QQVJFfHxzY3JhdGNocmVnKHAtPnExLnJlZyxwKSkpeworCXJlZz1wLT5xMS5yZWc7CisgICAgICB9ZWxzZXsKKwlpZihjPT1BRER8fGM9PVNVQnx8Yz09QURESTJQfHxjPT1TVUJJRlB8fGM9PUNPTVBBUkUpeworCSAgaWYoSVNSQUNDKHEyKSkKKwkgICAgcmVnPWFjYzsKKwkgIGVsc2UKKwkgICAgcmVnPWdldF9yZWcoZixwLHQpOworCX1lbHNleworCSAgZ2V0X2FjYyhmLHApOworCSAgcmVnPWFjYzsKKwl9CisgICAgICB9CisgICAgICBpZihjPT1BRER8fGM9PUFEREkyUHx8Yz09U1VCfHxjPT1TVUJJRlApeworCWludCBvcGRvbmU9MDsKKwlpZihpc3JlZyhxMSkpeworCSAgaWYoSVNJRFgocmVnKSYmSVNJRFgocC0+cTEucmVnKSYmaXNjb25zdChxMikpeworCSAgICBldmFsX2NvbnN0KCZwLT5xMi52YWwsc2hvcnRfYWRkP3Nob3J0X2FkZDpxMnR5cChwKSk7CisJICAgIGlmKENQVT09NjgxMiYmcC0+cTEucmVnPT1yZWcmJnptZXF0byh2bWF4LGwyem0oMUwpKSYmenVtZXF0byh2dW1heCx1bDJ6dW0oMVVMKSkpeworCSAgICAgIGVtaXQoZiwiXHQlcyVzXG4iLGM9PVNVQj8iZGUiOiJpbiIscmVnbmFtZXNbcmVnXSk7CisJICAgICAgLypGSVhNRTogY29uZGl0aW9uLWNvZGVzIGZvciBibmUvYmVxIGNvdWxkIGJlIHVzZWQgKi8KKwkgICAgfWVsc2V7CisJICAgICAgZW1pdChmLCJcdGxlYSVzXHQlbGQsJXNcbiIscmVnbmFtZXNbcmVnXSxjPT1TVUI/U0dOMTYoLXptMmwodm1heCkpOlNHTjE2KHptMmwodm1heCkpLHJlZ25hbWVzW3AtPnExLnJlZ10pOworCSAgICB9CisJICAgIG9wZG9uZT0xOworCSAgfWVsc2UJaWYoKGM9PUFERHx8Yz09QURESTJQKSYmSVNJRFgocmVnKSYmSVNJRFgocC0+cTEucmVnKSYmSVNSQUNDKHEyKSl7CisJICAgIGVtaXQoZiwiXHRsZWElc1x0JXMsJXNcbiIscmVnbmFtZXNbcmVnXSwoKHQmTlEpPT1DSEFSfHwoc2hvcnRfYWRkJk5RKT09Q0hBUik/ImIiOiJkIixyZWduYW1lc1twLT5xMS5yZWddKTsKKwkgICAgb3Bkb25lPTE7CisJICB9ZWxzZSBpZigoYz09QUREfHxjPT1BRERJMlApJiZJU0lEWChyZWcpJiZJU0FDQyhwLT5xMS5yZWcpJiZJU1JJRFgocTIpKXsKKwkgICAgZW1pdChmLCJcdGxlYSVzXHQlcywlc1xuIixyZWduYW1lc1tyZWddLCh0Jk5RKT09Q0hBUj8iYiI6ImQiLHJlZ25hbWVzW3AtPnEyLnJlZ10pOworCSAgICBvcGRvbmU9MTsKKwkgIH1lbHNlIGlmKChjPT1BRER8fGM9PUFEREkyUCkmJnAtPnExLnJlZz09YWNjJiZJU0lEWChyZWcpJiYhc2hvcnRfYWRkKXsKKwkgICAgbG9hZF9yZWcoZixyZWcsJnAtPnEyLHQpOworCSAgICBlbWl0KGYsIlx0bGVhJXNcdCVzLCVzXG4iLHJlZ25hbWVzW3JlZ10sKHQmTlEpPT1DSEFSPyJiIjoiZCIscmVnbmFtZXNbcmVnXSk7CisJICAgIG9wZG9uZT0xOworCSAgfWVsc2UgaWYoKGM9PUFERHx8Yz09QURESTJQKSYmcC0+cTEucmVnPT1hY2MmJklTSURYKHJlZykmJihzaG9ydF9hZGQmTlUpPT0oVU5TSUdORUR8Q0hBUikmJnNjcmF0Y2hyZWcoYWNjLHApKXsKKwkgICAgZW1pdChmLCJcdGFkZGJcdCIpOworCSAgICBlbWl0X29iaihmLCZwLT5xMixzaG9ydF9hZGQpOworCSAgICBlbWl0KGYsIlxuIik7CisJICAgIGVtaXQoZiwiXHRhZGNhXHQjMFxuIik7CisJICAgIGVtaXQoZiwiXHR0ZnJcdGQseVxuIik7CisJICAgIG9wZG9uZT0xOworCSAgfWVsc2UgaWYoKGM9PUFERHx8Yz09QURESTJQKSYmSVNBQ0MocC0+cTEucmVnKSYmSVNSQUNDKHopJiZpc3JlZyhxMikmJklTSURYKHAtPnEyLnJlZykpeworCSAgICBpZighc2NyYXRjaHJlZyhwLT5xMi5yZWcscCkpIGVtaXQoZiwiXHRleGdcdCVzLCVzXG4iLHJlZ25hbWVzW2FjY10scmVnbmFtZXNbcC0+cTIucmVnXSk7CisJICAgIGVtaXQoZiwiXHRsZWElc1x0JXMsJXNcbiIscmVnbmFtZXNbcC0+cTIucmVnXSxyZWduYW1lc1thY2NdLHJlZ25hbWVzW3AtPnEyLnJlZ10pOworCSAgICBlbWl0KGYsIlx0ZXhnXHQlcywlc1xuIixyZWduYW1lc1thY2NdLHJlZ25hbWVzW3AtPnEyLnJlZ10pOworCSAgICBvcGRvbmU9MTsKKwkgIH1lbHNlCWlmKHAtPnExLnJlZyE9cmVnKXsKKwkgICAgaWYoYz09QUREfHxjPT1BRERJMlB8fCFJU1JBQ0MocTIpKQorCSAgICAgIGVtaXQoZiwiXHR0ZnJcdCVzLCVzXG4iLHJlZ25hbWVzW3AtPnExLnJlZ10scmVnbmFtZXNbcmVnXSk7CisJICB9CisJfWVsc2UgaWYoc2hvcnRfYWRkJiZjPT1TVUImJnJlZz09YWNjJiYhKHNob3J0X2FkZCZVTlNJR05FRCkpeworCSAgbG9hZF9yZWcoZixyZWcsJnAtPnEyLHNob3J0X2FkZCk7CisJICBlbWl0KGYsIlx0Y2xyYVxuIik7CisJICBlbWl0KGYsIlx0bmVnYlxuIik7CisJICBlbWl0KGYsIlx0c2JjYVx0IzBcbiIpOworCSAgZW1pdChmLCJcdGFkZGRcdCIpOworCSAgZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJICBlbWl0KGYsIlxuIik7CisJICBzdG9yZV9yZWcoZixyZWcsJnAtPnosenR5cChwKSk7CisJICBjb250aW51ZTsKKwl9ZWxzZSBpZihzaG9ydF9hZGQmJmM9PUFERCYmcmVnPT1hY2MpeworCSAgbG9hZF9yZWcoZixyZWcsJnAtPnEyLHNob3J0X2FkZCk7CisJICBpZihzaG9ydF9hZGQmVU5TSUdORUQpCisJICAgIGVtaXQoZiwiXHRjbHJhXG4iKTsKKwkgIGVsc2UKKwkgICAgZW1pdChmLFNFWCk7CisJICBlbWl0KGYsIlx0YWRkZFx0Iik7CisJICBlbWl0X29iaihmLCZwLT5xMSx0KTsKKwkgIGVtaXQoZiwiXG4iKTsKKwkgIHN0b3JlX3JlZyhmLHJlZywmcC0+eix6dHlwKHApKTsKKwkgIGNvbnRpbnVlOworCX1lbHNleworCSAgaWYoIUlTUkFDQyhxMikpCisJICAgIGxvYWRfcmVnKGYscmVnLCZwLT5xMSxxMXR5cChwKSk7CisJfQorCWlmKCFvcGRvbmUpeworCSAgaWYocmVnPT1hY2MpeworCSAgICBpZihJU1JBQ0MocTIpKXsKKwkgICAgICBpZighSVNSQUNDKHopKSBnZXRfYWNjKGYscCk7CisJICAgICAgaWYoYz09QUREfHxjPT1BRERJMlApeworCQlpZihzaG9ydF9hZGQpeworCQkgIGlmKHNob3J0X2FkZCZVTlNJR05FRCkKKwkJICAgIGVtaXQoZiwiXHRjbHJhXG4iKTsKKwkJICBlbHNlCisJCSAgICBlbWl0KGYsU0VYKTsKKwkJICBlbWl0KGYsIlx0YWRkZFx0Iik7CisJCSAgZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJCSAgZW1pdChmLCJcbiIpOworCQl9ZWxzZXsKKwkJICBpZihDUFU9PTY4MTIpCisJCSAgICBlbWl0KGYsIlx0YXNsZFxuIik7IC8qIG9ubHkgY2FzZXMgd2l0aCBxMT1xMj1hY2Mgc2hvdWxkIHJlbWFpbiAqLworCQkgIGVsc2V7CisJCSAgICBlbWl0KGYsIlx0YXNsYlxuIik7CisJCSAgICBpZigodCZOUSkhPUNIQVIpCisJCSAgICAgIGVtaXQoZiwiXHRyb2xhXG4iKTsKKwkJICB9CisJCX0KKwkgICAgICB9ZWxzZXsKKwkJaWYoc2hvcnRfYWRkKXsKKwkJICBpZihzaG9ydF9hZGQmVU5TSUdORUQpCisJCSAgICBlbWl0KGYsIlx0bGQlc2FcdCMyNTVcbiIsKENQVT09NjgxMik/ImEiOiIiKTsKKwkJICBlbHNleworCQkgICAgZW1pdChmLFNFWCk7CisJCSAgICBlbWl0KGYsIlx0bmVnYVxuIik7CisJCSAgfQorCQkgIGVtaXQoZiwiXHRuZWdiXG5cdHNiY2FcdCMwXG4iKTsKKwkJfWVsc2UgaWYoKHQmTlEpIT1DSEFSKXsKKwkJICBlbWl0KGYsIlx0bmVnYVxuXHRuZWdiXG5cdHNiY2FcdCMwXG4iKTsKKwkJfWVsc2V7CisJCSAgZW1pdChmLCJcdG5lZ2JcbiIpOworCQl9CisJCQorCQlpZihJU1JJRFgocTEpKXsKKwkJICBlbWl0KGYsIlx0JXMlc1xuIixDUFU9PTY4MTI/InBzaCI6InBzaHNcdCIscmVnbmFtZXNbcC0+cTEucmVnXSk7CisJCSAgZW1pdChmLCJcdGFkZGRcdCVzXG4iLENQVT09NjgxMj8iMSxzKyI6IixzKysiKTsKKwkJfWVsc2V7CisJCSAgZW1pdChmLCJcdGFkZGRcdCIpOworCQkgIGVtaXRfb2JqKGYsJnAtPnExLHQpOworCQkgIGVtaXQoZiwiXG4iKTsKKwkJfQorCSAgICAgIH0KKwkgICAgfWVsc2V7CisJICAgICAgaWYoSVNSSURYKHEyKSl7CisJCWlmKENQVT09NjgxMikKKwkJICBlbWl0KGYsIlx0cHNoJXNcbiIscmVnbmFtZXNbcC0+cTIucmVnXSk7CisJCWVsc2UKKwkJICBlbWl0KGYsIlx0cHNoc1x0JXNcbiIscmVnbmFtZXNbcC0+cTIucmVnXSk7CisJCXB1c2goMik7cG9wKDIpOworCQlpZihDUFU9PTY4MTIpCisJCSAgZW1pdChmLCJcdCVzZFx0MiwlcytcbiIsKGM9PUFERHx8Yz09QURESTJQKT8iYWRkIjoic3ViIixyZWduYW1lc1tzcF0pOworCQllbHNlCisJCSAgZW1pdChmLCJcdCVzZFx0LCVzKytcbiIsKGM9PUFERHx8Yz09QURESTJQKT8iYWRkIjoic3ViIixyZWduYW1lc1tzcF0pOworCSAgICAgIH1lbHNleworCQllbWl0KGYsIlx0JXMlc1x0IiwoYz09QUREfHxjPT1BRERJMlApPyJhZGQiOiJzdWIiLChzaG9ydF9hZGR8fCh0Jk5RKT09Q0hBUik/ImIiOiJkIik7CisJCWVtaXRfb2JqKGYsJnAtPnEyLHNob3J0X2FkZD9zaG9ydF9hZGQ6dCk7ZW1pdChmLCJcbiIpOworCQlpZihzaG9ydF9hZGQpeworCQkgIGlmKHNob3J0X2FkZCZVTlNJR05FRCkKKwkJICAgIGVtaXQoZiwiXHQlc1x0IzBcbiIsYz09QUREPyJhZGNhIjoic2JjYSIpOworCQkgIGVsc2UKKwkJICAgIGllcnJvcigwKTsKKwkJfQorCQlpZihkcmVsJiYocC0+cTIuZmxhZ3MmVkFSQURSKSl7CisJCSAgaWYoQ1BVPT02ODEyKSBpZXJyb3IoMCk7CisJCSAgZW1pdChmLCJcdHBzaHNcdCVzXG4iLHJlZ25hbWVzW2l1XSk7cHVzaCgyKTsKKwkJICBlbWl0KGYsIlx0JXNkXHQsJXMrK1xuIiwoYz09QUREfHxjPT1BRERJMlApPyJhZGQiOiJzdWIiLHJlZ25hbWVzW3NwXSk7CisJCSAgcG9wKDIpOworCQl9CisJICAgICAgfQorCSAgICB9CisJICAgIGNjPSZwLT56O2NjX3Q9dDsKKwkgIH1lbHNleworCSAgICBpZihpc2NvbnN0KHEyKSl7CisJICAgICAgbG9uZyBsOworCSAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxzaG9ydF9hZGQ/c2hvcnRfYWRkOnQpOworCSAgICAgIGw9em0ybCh2bWF4KTsKKwkgICAgICBpZihjPT1TVUIpIGw9LWw7CisJICAgICAgLypGSVhNRTogY29uZGl0aW9uLWNvZGVzIGZvciBibmUvYmVxIGNvdWxkIGJlIHVzZWQgKi8KKwkgICAgICBpZihsPT0xJiZyZWc9PWl4JiZDUFU9PTY4MTIpeworCQllbWl0KGYsIlx0aW54XG4iKTsKKwkgICAgICB9ZWxzZSBpZihsPT0xJiZyZWc9PWl5JiZDUFU9PTY4MTIpeworCQllbWl0KGYsIlx0aW55XG4iKTsKKwkgICAgICB9ZWxzZSBpZihsPT0tMSYmcmVnPT1peCYmQ1BVPT02ODEyKXsKKwkJZW1pdChmLCJcdGRleFxuIik7CisJICAgICAgfWVsc2UgaWYobD09LTEmJnJlZz09aXkmJkNQVT09NjgxMil7CisJCWVtaXQoZiwiXHRkZXlcbiIpOworCSAgICAgIH1lbHNleworCQllbWl0KGYsIlx0bGVhJXNcdCVsZCwlc1xuIixyZWduYW1lc1tyZWddLFNHTjE2KGwpLHJlZ25hbWVzW3JlZ10pOworCSAgICAgIH0KKwkgICAgfWVsc2V7CisJICAgICAgaWYoYyE9QUREJiZjIT1BRERJMlApeworCQlpZighSVNSQUNDKHEyKSl7CisJCSAgaWYoIXNjcmF0Y2hyZWcoYWNjLHApKQorCQkgICAgZ2V0X2FjYyhmLHApOworCQkgIGxvYWRfcmVnKGYsYWNjLCZwLT5xMix0KTsKKwkJICBpZigodCZOUSkhPUNIQVIpeworCQkgICAgZW1pdChmLCJcdG5lZ2Fcblx0bmVnYlxuXHRzYmNhXHQjMFxuIik7CisJCSAgfWVsc2V7CisJCSAgICBlbWl0KGYsIlx0bmVnYlxuIik7CisJCSAgfQorCQkgIC8qbG9hZF9yZWcoZixyZWcsJnAtPnExLHQpOyovCisJCX1lbHNleworCQkgIGdldF9hY2MoZixwKTsKKwkJICBsb2FkX3JlZyhmLHJlZywmcC0+cTEsdCk7CisJCSAgaWYoKHQmTlEpPT1DSEFSKQorCQkgICAgZW1pdChmLCJcdG5lZ2JcbiIpOworCQkgIGVsc2UKKwkJICAgIGVtaXQoZiwiXHRuZWdhXG5cdG5lZ2Jcblx0c2JjYVx0IzBcbiIpOworCQl9ICAKKwkgICAgICB9ZWxzZSBpZighSVNSQUNDKHEyKSl7CisJCWdldF9hY2MoZixwKTsKKwkJaWYoc2hvcnRfYWRkKXsKKwkJICBsb2FkX3JlZyhmLGFjYywmcC0+cTIsc2hvcnRfYWRkKTsKKwkJICBpZihzaG9ydF9hZGQmVU5TSUdORUQpeworCQkgICAgaWYocmVnPT1peCl7CisJCSAgICAgIGVtaXQoZiwiXHRhYnhcbiIpOworCQkgICAgICBzdG9yZV9yZWcoZixyZWcsJnAtPnosenR5cChwKSk7CisJCSAgICAgIGNvbnRpbnVlOworCQkgICAgfWVsc2V7CisJCSAgICAgIGVtaXQoZiwiXHRjbHJhXG4iKTsKKwkJICAgIH0KKwkJICB9ZWxzZQorCQkgICAgdD1DSEFSOworCQl9ZWxzZQorCQkgIGxvYWRfcmVnKGYsYWNjLCZwLT5xMix0KTsKKwkgICAgICB9ZWxzZXsKKwkJbG9hZF9yZWcoZixyZWcsJnAtPnExLHQpOworCQlpZihzaG9ydF9hZGQmVU5TSUdORUQpCisJCSAgZW1pdChmLCJcdGNscmFcbiIpOworCQllbWl0KGYsIlx0bGVhJXNcdCVzLCVzXG4iLHJlZ25hbWVzW3JlZ10sKCh0Jk5VKT09Q0hBUnx8KHNob3J0X2FkZCZOVSk9PUNIQVIpPyJiIjoiZCIscmVnbmFtZXNbcmVnXSk7CisJCXN0b3JlX3JlZyhmLHJlZywmcC0+eix6dHlwKHApKTsKKwkJY29udGludWU7CisJICAgICAgfQorCSAgICAgIGVtaXQoZiwiXHRsZWElc1x0JXMsJXNcbiIscmVnbmFtZXNbcmVnXSwodCZOUSk9PUNIQVI/ImIiOiJkIixyZWduYW1lc1tyZWddKTsKKwkgICAgfQorCSAgfQorCX0KKwlzdG9yZV9yZWcoZixyZWcsJnAtPnosenR5cChwKSk7CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZihjIT1MU0hJRlQmJmMhPVJTSElGVCkKKwlsb2FkX3JlZyhmLHJlZywmcC0+cTEsdCk7CisgICAgICBpZihjPT1NVUxUKXsKKwlpZihDUFU9PTY4MTIpeworCSAgaW50IHB5PTA7CisJICBpZihyZWchPWFjYykgaWVycm9yKHJlZyk7CisJICBpZighSVNSWShxMikmJnJlZ3NbaXldKXsKKwkgICAgZW1pdChmLCJcdHBzaHlcbiIpOworCSAgICBwdXNoKDIpOworCSAgICBweT0xOworCSAgfQorCSAgbG9hZF9yZWcoZixpeSwmcC0+cTIsdCk7CisJICBlbWl0KGYsIlx0ZW11bFxuIik7CisJICBpZihweSl7CisJICAgIGVtaXQoZixTUFVMTCgieSIpKTsKKwkgICAgcG9wKDIpOworCSAgfQorCSAgc3RvcmVfcmVnKGYsYWNjLCZwLT56LHQpOworCSAgY29udGludWU7CisJfWVsc2UKKwkgIGllcnJvcigwKTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PUxTSElGVHx8Yz09UlNISUZUKXsKKwlpZihpc2NvbnN0KHEyKSl7CisJICBpbnQgbCxvbGRsOworCSAgbG9hZF9yZWcoZixhY2MsJnAtPnExLHQpOworCSAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHQpOworCSAgb2xkbD1sPXptMmwodm1heCk7CisJICBpZihsPj0yNCl7CisJICAgIGlmKENQVSE9NjgxMiYmIW9wdHNpemUpCisJICAgICAgZW1pdChmLCJcdGxkZFx0IzBcbiIpOworCSAgICBlbHNlCisJICAgICAgZW1pdChmLCJcdGNscmFcblx0Y2xyYlxuIik7CisJICAgIGw9MDsKKwkgIH0KKwkgIGlmKGw+PTgpeworCSAgICBpZihjPT1MU0hJRlQpCisJICAgICAgZW1pdChmLCJcdCVzXG5cdGNscmJcbiIsKENQVT09NjgxMik/InRiYSI6InRmclx0YixhIik7CisJICAgIGVsc2V7CisJICAgICAgaWYodCZVTlNJR05FRCkKKwkJZW1pdChmLCJcdHRmclx0YSxiXG5cdGNscmFcbiIpOworCSAgICAgIGVsc2V7CisJCWVtaXQoZiwiXHR0ZnJcdGEsYlxuIik7CisJCWVtaXQoZixTRVgpOworCSAgICAgIH0KKwkgICAgfQorCSAgICBsLT04OworCSAgfQorCSAgd2hpbGUobC0tKXsKKwkgICAgaWYoYz09UlNISUZUKXsKKwkgICAgICBpZih0JlVOU0lHTkVEKXsKKwkJaWYoKHQmTlEpPT1DSEFSKQorCQkgIGVtaXQoZiwiXHRsc3JiXG4iKTsKKwkJZWxzZQorCQkgIGVtaXQoZixDUFU9PTY4MDk/Ilx0bHNyYVxuXHRyb3JiXG4iOiJcdGxzcmRcbiIpOworCSAgICAgIH1lbHNleworCQlpZihvbGRsPjEyfHwodCZOUSk9PUNIQVIpCisJCSAgZW1pdChmLCJcdGFzcmJcbiIpOworCQllbHNlCisJCSAgZW1pdChmLCJcdGFzcmFcblx0cm9yYlxuIik7CisJICAgICAgfQorCSAgICB9ZWxzZXsKKwkgICAgICBpZigodCZOUSk9PUNIQVIpCisJCWVtaXQoZiwiXHRhc2xiXG4iKTsKKwkgICAgICBlbHNlCisJCWVtaXQoZixDUFU9PTY4MDk/Ilx0YXNsYlxuXHRyb2xhXG4iOiJcdGFzbGRcbiIpOworCSAgICB9CisJICB9CisJfWVsc2V7CisJICBpbnQgcHg7Y2hhciAqczsKKwkgIGlmKHJlZ3NbaXhdJiYhc2NyYXRjaHJlZyhpeCxwKSYmKCFpc3JlZyh6KXx8cC0+ei5yZWchPWl4KSl7CisJICAgIGVtaXQoZixTUFVTSCgieCIpKTsKKwkgICAgcHVzaCgyKTtweD0xOworCSAgfWVsc2UKKwkgICAgcHg9MDsKKwkgIGlmKChwLT50eXBmMiZOUSk9PUNIQVIpeworCSAgICBsb2FkX3JlZyhmLGFjYywmcC0+cTIscC0+dHlwZjIpOworCSAgICBlbWl0KGYsKHAtPnR5cGYyJlVOU0lHTkVEKT8iXHRjbHJhXG4iOlNFWCk7CisJICAgIGVtaXQoZiwiXHR0ZnJcdGQseFxuIik7CisJICB9ZWxzZQorCSAgICBsb2FkX3JlZyhmLGl4LCZwLT5xMix0KTsKKwkgIGxvYWRfcmVnKGYsYWNjLCZwLT5xMSxwLT50eXBmKTsKKwkgIGlmKCh0Jk5RKT09Q0hBUikKKwkgICAgZW1pdChmLChwLT50eXBmMiZVTlNJR05FRCk/Ilx0Y2xyYVxuIjpTRVgpOworCSAgaWYoYz09TFNISUZUKSBzPSJsc2wiOworCSAgZWxzZSBpZih0JlVOU0lHTkVEKSBzPSJsc3IiOworCSAgZWxzZSBzPSJhc3IiOworCSAgZW1pdChmLCJcdC5nbG9iYWxcdCVzX18lc1xuIixpZHByZWZpeCxzKTsKKwkgIGVtaXQoZiwiXHQlc1x0JXNfXyVzXG4iLGpzcmluc3QsaWRwcmVmaXgscyk7CisJICBpZihweCl7CisJICAgIGVtaXQoZixTUFVMTCgieCIpKTsKKwkgICAgLyplbWl0KGYsIlx0cHVsJXNcbiIscmVnbmFtZXNbaXhdKTsqLworCSAgICBwb3AoMik7CisJICB9CisJfQorCWNjPTA7CisJc3RvcmVfcmVnKGYsYWNjLCZwLT56LHQpOworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoYz49T1ImJmM8PUFORCl7CisJcz1sb2dpY2Fsc1tjLU9SXTsKKwlpZihwLT5xMi5hbSYmcC0+cTIuYW0tPmZsYWdzPT1BQ0NfSU5EKXsKKwkgIG1vYmo9cC0+cTE7cC0+cTE9cC0+cTI7cC0+cTI9bW9iajsKKwl9CisJaWYocC0+cTIuZmxhZ3MmS09OU1QpeworCSAgdW5zaWduZWQgbG9uZyBsLGg7CisJICBldmFsX2NvbnN0KCZwLT5xMi52YWwsdCk7CisJICBsPXp1bTJ1bCh2dW1heCk7CisJICBpZigodCZOUSkhPUNIQVIpeworCSAgICBoPShsPj5iaXRzcGVyYnl0ZSkmYnl0ZW1hc2s7CisJICAgIGlmKGM9PUFORCYmaD09MCkKKwkgICAgICBlbWl0KGYsIlx0Y2xyYVxuIik7CisJICAgIGVsc2UgaWYoYz09WE9SJiZoPT1ieXRlbWFzaykKKwkgICAgICBlbWl0KGYsIlx0Y29tYVxuIik7CisJICAgIGVsc2UgaWYoKGM9PUFORCYmaCE9Ynl0ZW1hc2spfHwoYz09T1ImJmghPTApfHwoYz09WE9SJiZoIT0wKSkKKwkgICAgICBlbWl0KGYsIlx0JXNhXHQjJWx1XG4iLHMsaCk7CisJICB9CisJICBoPWwmYnl0ZW1hc2s7CisJICBpZihjPT1BTkQmJmg9PTApCisJICAgIGVtaXQoZiwiXHRjbHJiXG4iKTsKKwkgIGVsc2UgaWYoYz09WE9SJiZoPT1ieXRlbWFzaykKKwkgICAgZW1pdChmLCJcdGNvbWJcbiIpOworCSAgZWxzZSBpZigoYz09QU5EJiZoIT1ieXRlbWFzayl8fChjPT1PUiYmaCE9MCl8fChjPT1YT1ImJmghPTApKQorCSAgICBlbWl0KGYsIlx0JXNiXHQjJWx1XG4iLHMsaCk7CisJfWVsc2V7CisJICBpZihpc3JlZyhxMikpeworCSAgICBpZihwLT5xMi5yZWc9PWFjYyl7CisJICAgICAgaWYoYz09WE9SKXsKKwkJZW1pdChmLCJcdGNscmJcbiIpOworCQlpZigodCZOUSkhPUNIQVIpIGVtaXQoZiwiXHRjbHJhXG4iKTsKKwkgICAgICB9CisJICAgIH1lbHNleworCSAgICAgIGlmKCh0Jk5RKT09Q0hBUil7CisJCWVtaXQoZixTUFVTSCgiYSIpKTsKKwkJcHVzaCgxKTsKKwkJZW1pdChmLCJcdCVzYVx0JXMsJXMrXG4iLHMsQ1BVPT02ODEyPyIxIjoiIixyZWduYW1lc1tzcF0pOworCQlwb3AoMSk7CisJICAgICAgfWVsc2V7CisJCWVtaXQoZiwiXHQlcyVzXG4iLChDUFU9PTY4MTIpPyJwc2giOiJwc2hzXHQiLHJlZ25hbWVzW3AtPnEyLnJlZ10pOworCQlwdXNoKDIpOworCQllbWl0KGYsIlx0JXNhXHQlcywlcytcbiIscyxDUFU9PTY4MTI/IjEiOiIiLHJlZ25hbWVzW3NwXSk7CisJCWVtaXQoZiwiXHQlc2JcdCVzLCVzK1xuIixzLENQVT09NjgxMj8iMSI6IiIscmVnbmFtZXNbc3BdKTsKKwkJcG9wKDIpOworCSAgICAgIH0KKwkgICAgfQorCSAgfWVsc2UgaWYoKHAtPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT1EUkVGT0JKJiYodCZOUSkhPUNIQVIpeworCSAgICBpbnQgeHI9MDsKKwkgICAgaWYoIXJlZ3NbaXhdKSB4cj1peDsKKwkgICAgZWxzZSBpZighcmVnc1tpeV0pIHhyPWl5OworCSAgICBlbHNleworCSAgICAgIHhyPWl4OworCSAgICAgIGVtaXQoZiwiXHQlcyVzXG4iLChDUFU9PTY4MTIpPyJwc2giOiJwc2hzXHQiLHJlZ25hbWVzW3hyXSk7CisJICAgICAgcHVzaCgyKTsKKworCSAgICB9CisJICAgIEJTRVQocmVnc19tb2RpZmllZCx4cik7CisJICAgIGxvYWRfYWRkcihmLHhyLCZwLT5xMik7CisJICAgIGlmKCh0Jk5RKT09Q0hBUikKKwkgICAgICBlbWl0KGYsIlx0JXNiXHQwLCVzXG4iLHMscmVnbmFtZXNbeHJdKTsKKwkgICAgZWxzZXsKKwkgICAgICBlbWl0KGYsIlx0JXNhXHQwLCVzXG4iLHMscmVnbmFtZXNbeHJdKTsKKwkgICAgICBlbWl0KGYsIlx0JXNiXHQxLCVzXG4iLHMscmVnbmFtZXNbeHJdKTsKKwkgICAgfQorCSAgICBpZihyZWdzW2l4XSYmeHI9PWl4KXsKKwkgICAgICBlbWl0KGYsU1BVTEwoIngiKSk7CisJICAgICAgcG9wKDIpOworCSAgICB9CisJICB9ZWxzZXsKKwkgICAgZW1pdChmLCJcdCVzYlx0IixzKTsKKwkgICAgaWYoKHQmTlEpIT1DSEFSKSBpbmNfYWRkcigmcC0+cTIsMSx0KTsKKwkgICAgZW1pdF9vYmooZiwmcC0+cTIsdCk7CisJICAgIGVtaXQoZiwiXG4iKTsKKwkgICAgaWYoKHQmTlEpIT1DSEFSKXsKKwkgICAgICBpbmNfYWRkcigmcC0+cTIsLTEsdCk7CisJICAgICAgZW1pdChmLCJcdCVzYVx0IixzKTsKKwkgICAgICBlbWl0X29iaihmLCZwLT5xMix0KTsKKwkgICAgICBlbWl0KGYsIlxuIik7CisJICAgIH0KKwkgIH0KKwl9CisJY2M9MDsKKwlzdG9yZV9yZWcoZixyZWcsJnAtPnosdCk7CisJY29udGludWU7CisgICAgICB9ZWxzZSBpZihjPT1DT01QQVJFKXsKKwlsYXN0Y29tcD10OworCWlmKGlzcmVnKHEyKSl7CisJICBlbWl0KGYsIlx0JXMlc1xuIiwoQ1BVPT02ODEyKT8icHNoIjoicHNoc1x0IixyZWduYW1lc1twLT5xMi5yZWddKTsKKwkgIHB1c2goMik7CisJfQorCWlmKHJlZz09YWNjKXsKKwkgIGlmKCh0Jk5RKT09Q0hBUikKKwkgICAgZW1pdChmLCJcdGNtcGJcdCIpOworCSAgZWxzZQorCSAgICBlbWl0KGYsU0NNUCgiZCIpKTsKKwl9ZWxzZSBpZihyZWc9PWl4KXsKKwkgIGVtaXQoZixTQ01QKCJ4IikpOworCX1lbHNlIGlmKHJlZz09aXkpeworCSAgZW1pdChmLFNDTVAoInkiKSk7CisJfWVsc2UgaWYocmVnPT1pdSl7CisJICBlbWl0KGYsU0NNUCgidSIpKTsKKwl9ZWxzZQorCSAgaWVycm9yKDApOworCWlmKGlzcmVnKHEyKSl7CisJICBpZihDUFU9PTY4MTIpCisJICAgIGVtaXQoZiwiMiwlcytcbiIscmVnbmFtZXNbc3BdKTsKKwkgIGVsc2UKKwkgICAgZW1pdChmLCIsJXMrK1xuIixyZWduYW1lc1tzcF0pOworCSAgcG9wKDIpOworCX1lbHNleworCSAgZW1pdF9vYmooZiwmcC0+cTIsdCk7ZW1pdChmLCJcbiIpOworCX0KKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGllcnJvcigwKTsKKyAgICB9CisgICAgcHJpYzIoc3Rkb3V0LHApOworICAgIGllcnJvcigwKTsKKyAgfQorICBpZihub3Rwb3BwZWQpeworICAgIGdlbl9wb3AoZixub3Rwb3BwZWQpOworICAgIG5vdHBvcHBlZD0wOworICB9CisgIGZ1bmN0aW9uX2JvdHRvbShmLHYsbG9mZik7CisgIGlmKGRlYnVnX2luZm8peworICAgIGVtaXQoZiwiJXMlZDpcbiIsbGFicHJlZml4LCsrbGFiZWwpOworICAgIGR3YXJmMl9mdW5jdGlvbihmLHYsbGFiZWwpOworICAgIGlmKGYpIHNlY3Rpb249LTE7CisgIH0gICAgIAorfQorCitpbnQgc2hvcnRjdXQoaW50IGMsaW50IHQpCit7CisgIGlmKGM9PUNPTVBBUkV8fGM9PUFERHx8Yz09U1VCfHxjPT1BTkR8fGM9PU9SfHxjPT1YT1IpIHJldHVybiAxOworICBpZigoYz09TFNISUZUfHxjPT1SU0hJRlQpJiZJU0NIV09SRCh0Jk5RKSkgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCit2b2lkIGNsZWFudXBfY2coRklMRSAqZikKK3sKKyAgc3RydWN0IGZwY29uc3RsaXN0ICpwOworICB1bnNpZ25lZCBjaGFyICppcDsKKyAgaWYoZiYmc3RhY2tfY2hlY2spCisgICAgZW1pdChmLCJcdC5nbG9iYWxcdCVzX19zdGFja19jaGVja1xuIixpZHByZWZpeCk7CisgIHdoaWxlKHA9Zmlyc3RmcGMpeworICAgIGlmKGYpeworICAgICAgaWYoc2VjdGlvbiE9Uk9EQVRBKXsKKwllbWl0KGYscm9kYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1ST0RBVEE7CisgICAgICB9CisgICAgICBlbWl0KGYsIiVzJWRcblx0JXNcdCIsbGFicHJlZml4LHAtPmxhYmVsLGRjdFtMT05HXSk7CisgICAgICBpcD0odW5zaWduZWQgY2hhciAqKSZwLT52YWwudmRvdWJsZTsKKyAgICAgIGVtaXQoZiwiMHglMDJ4JTAyeCUwMnglMDJ4IixpcFswXSxpcFsxXSxpcFsyXSxpcFszXSk7CisgICAgICBpZigocC0+dHlwJk5RKT09RE9VQkxFfHwocC0+dHlwJk5RKT09TERPVUJMRSl7CisJZW1pdChmLCIsMHglMDJ4JTAyeCUwMnglMDJ4IixpcFs0XSxpcFs1XSxpcFs2XSxpcFs3XSk7CisgICAgICB9CisgICAgICBlbWl0KGYsIlxuIik7CisgICAgfQorICAgIGZpcnN0ZnBjPXAtPm5leHQ7CisgICAgZnJlZShwKTsKKyAgfQorfQorCitpbnQgcmVnX3Bhcm0oc3RydWN0IHJlZ19oYW5kbGUgKnAsc3RydWN0IFR5cCAqdCxpbnQgbW9kZSxzdHJ1Y3QgVHlwICpma3QpCit7CisgIGlmKHAtPmdwcikgcmV0dXJuIDA7CisgIGlmKElTU0NBTEFSKHQtPmZsYWdzKSYmIUlTRkxPQVQodC0+ZmxhZ3MpJiYhSVNMV09SRCh0LT5mbGFncykpeworICAgIHAtPmdwcj0xOworICAgIHJldHVybiBhY2M7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgaW5zZXJ0X2NvbnN0KHVuaW9uIGF0eXBzICpwLGludCB0KQorLyogIFRyYWVndCBLb25zdGFudGUgaW4gZW50cHJlY2hlbmRlcyBGZWxkIGVpbi4gICAgICAgKi8KK3sKKyAgaWYoIXApIGllcnJvcigwKTsKKyAgdCY9TlU7CisgIGlmKHQ9PUJJVCkge2lmKHptZXF0byh6YzJ6bSh2Y2hhciksbDJ6bSgwTCkpKSBwLT52Y2hhcj16bTJ6YyhsMnptKDBMKSk7IGVsc2UgcC0+dmNoYXI9em0yemMobDJ6bSgxTCkpO3JldHVybjt9CisgIGlmKHQ9PUNIQVIpIHtwLT52Y2hhcj12Y2hhcjtyZXR1cm47fQorICBpZih0PT1TSE9SVCkge3AtPnZzaG9ydD12c2hvcnQ7cmV0dXJuO30KKyAgaWYodD09SU5UKSB7cC0+dmludD12aW50O3JldHVybjt9CisgIGlmKHQ9PUxPTkcpIHtwLT52bG9uZz12bG9uZztyZXR1cm47fQorICBpZih0PT1MTE9ORykge3AtPnZsbG9uZz12bGxvbmc7cmV0dXJuO30KKyAgaWYodD09TUFYSU5UKSB7cC0+dm1heD12bWF4O3JldHVybjt9CisgIGlmKHQ9PShVTlNJR05FRHxCSVQpKSB7aWYoenVtZXF0byh6dWMyenVtKHZ1Y2hhciksdWwyenVtKDBVTCkpKSBwLT52dWNoYXI9enVtMnp1Yyh1bDJ6dW0oMFVMKSk7IGVsc2UgcC0+dnVjaGFyPXp1bTJ6dWModWwyenVtKDFVTCkpO3JldHVybjt9ICAKKyAgaWYodD09KFVOU0lHTkVEfENIQVIpKSB7cC0+dnVjaGFyPXZ1Y2hhcjtyZXR1cm47fQorICBpZih0PT0oVU5TSUdORUR8U0hPUlQpKSB7cC0+dnVzaG9ydD12dXNob3J0O3JldHVybjt9CisgIGlmKHQ9PShVTlNJR05FRHxJTlQpKSB7cC0+dnVpbnQ9dnVpbnQ7cmV0dXJuO30KKyAgaWYodD09KFVOU0lHTkVEfExPTkcpKSB7cC0+dnVsb25nPXZ1bG9uZztyZXR1cm47fQorICBpZih0PT0oVU5TSUdORUR8TExPTkcpKSB7cC0+dnVsbG9uZz12dWxsb25nO3JldHVybjt9CisgIGlmKHQ9PShVTlNJR05FRHxNQVhJTlQpKSB7cC0+dnVtYXg9dnVtYXg7cmV0dXJuO30KKyAgaWYodD09RkxPQVQpIHtwLT52ZmxvYXQ9dmZsb2F0O3JldHVybjt9CisgIGlmKHQ9PURPVUJMRSkge3AtPnZkb3VibGU9dmRvdWJsZTtyZXR1cm47fQorICBpZih0PT1MRE9VQkxFKSB7cC0+dmxkb3VibGU9dmxkb3VibGU7cmV0dXJuO30KKyAgaWYodD09TlBPSU5URVIpIHtwLT52dWludD12dWludDtyZXR1cm47fQorICBpZih0PT1GUE9JTlRFUnx8dD09SFBPSU5URVIpIHtwLT52dWxvbmc9dnVsb25nO3JldHVybjt9Cit9Cit2b2lkIGV2YWxfY29uc3QodW5pb24gYXR5cHMgKnAsaW50IHQpCisvKiAgV2Vpc3QgYmVzdGltbXRlbiBnbG9iYWxlbiBWYXJpYWJsZW4gV2VydCBlaW5lciBDRVhQUiB6dS4gICAgICAgKi8KK3sKKyAgaW50IGY9dCZOUTsKKyAgaWYoIXApIGllcnJvcigwKTsKKyAgaWYoZj09TUFYSU5UfHwoZj49QklUJiZmPD1MTE9ORykpeworICAgIGlmKCEodCZVTlNJR05FRCkpeworICAgICAgaWYoZj09QklUKXsKKwlpZih6bWVxdG8oemMyem0ocC0+dmNoYXIpLGwyem0oMEwpKSkgdm1heD1sMnptKDBMKTsgZWxzZSB2bWF4PWwyem0oMUwpOworICAgICAgfWVsc2UgaWYoZj09Q0hBUikgdm1heD16YzJ6bShwLT52Y2hhcik7CisgICAgICBlbHNlIGlmKGY9PVNIT1JUKXZtYXg9enMyem0ocC0+dnNob3J0KTsKKyAgICAgIGVsc2UgaWYoZj09SU5UKSAgdm1heD16aTJ6bShwLT52aW50KTsKKyAgICAgIGVsc2UgaWYoZj09TE9ORykgdm1heD16bDJ6bShwLT52bG9uZyk7CisgICAgICBlbHNlIGlmKGY9PUxMT05HKSB2bWF4PXpsbDJ6bShwLT52bGxvbmcpOworICAgICAgZWxzZSBpZihmPT1NQVhJTlQpIHZtYXg9cC0+dm1heDsKKyAgICAgIGVsc2UgaWVycm9yKDApOworICAgICAgdnVtYXg9em0yenVtKHZtYXgpOworICAgICAgdmxkb3VibGU9em0yemxkKHZtYXgpOworICAgIH1lbHNleworICAgICAgaWYoZj09QklUKXsKKwlpZih6dW1lcXRvKHp1YzJ6dW0ocC0+dnVjaGFyKSx1bDJ6dW0oMFVMKSkpIHZ1bWF4PXVsMnp1bSgwVUwpOyBlbHNlIHZ1bWF4PXVsMnp1bSgxVUwpOworICAgICAgfWVsc2UgaWYoZj09Q0hBUikgdnVtYXg9enVjMnp1bShwLT52dWNoYXIpOworICAgICAgZWxzZSBpZihmPT1TSE9SVCl2dW1heD16dXMyenVtKHAtPnZ1c2hvcnQpOworICAgICAgZWxzZSBpZihmPT1JTlQpICB2dW1heD16dWkyenVtKHAtPnZ1aW50KTsKKyAgICAgIGVsc2UgaWYoZj09TE9ORykgdnVtYXg9enVsMnp1bShwLT52dWxvbmcpOworICAgICAgZWxzZSBpZihmPT1MTE9ORykgdnVtYXg9enVsbDJ6dW0ocC0+dnVsbG9uZyk7CisgICAgICBlbHNlIGlmKGY9PU1BWElOVCkgdnVtYXg9cC0+dnVtYXg7CisgICAgICBlbHNlIGllcnJvcigwKTsKKyAgICAgIHZtYXg9enVtMnptKHZ1bWF4KTsKKyAgICAgIHZsZG91YmxlPXp1bTJ6bGQodnVtYXgpOworICAgIH0KKyAgfWVsc2V7CisgICAgaWYoSVNQT0lOVEVSKGYpKXsKKyAgICAgIGlmKGY9PU5QT0lOVEVSKQorCXZ1bWF4PXp1aTJ6dW0ocC0+dnVpbnQpOworICAgICAgZWxzZQorCXZ1bWF4PXp1bDJ6dW0ocC0+dnVsb25nKTsKKyAgICAgIHZtYXg9enVtMnptKHZ1bWF4KTt2bGRvdWJsZT16dW0yemxkKHZ1bWF4KTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKGY9PUZMT0FUKSB2bGRvdWJsZT16ZjJ6bGQocC0+dmZsb2F0KTsKKyAgICAgIGVsc2UgaWYoZj09RE9VQkxFKSB2bGRvdWJsZT16ZDJ6bGQocC0+dmRvdWJsZSk7CisgICAgICBlbHNlIHZsZG91YmxlPXAtPnZsZG91YmxlOworICAgICAgdm1heD16bGQyem0odmxkb3VibGUpOworICAgICAgdnVtYXg9emxkMnp1bSh2bGRvdWJsZSk7CisgICAgfQorICB9CisgIHZmbG9hdD16bGQyemYodmxkb3VibGUpOworICB2ZG91YmxlPXpsZDJ6ZCh2bGRvdWJsZSk7CisgIHZ1Y2hhcj16dW0yenVjKHZ1bWF4KTsKKyAgdnVzaG9ydD16dW0yenVzKHZ1bWF4KTsKKyAgdnVpbnQ9enVtMnp1aSh2dW1heCk7CisgIHZ1bG9uZz16dW0yenVsKHZ1bWF4KTsKKyAgdnVsbG9uZz16dW0yenVsbCh2dW1heCk7CisgIHZjaGFyPXptMnpjKHZtYXgpOworICB2c2hvcnQ9em0yenModm1heCk7CisgIHZpbnQ9em0yemkodm1heCk7CisgIHZsb25nPXptMnpsKHZtYXgpOworICB2bGxvbmc9em0yemxsKHZtYXgpOworfQordm9pZCBwcmludHZhbChGSUxFICpmLHVuaW9uIGF0eXBzICpwLGludCB0KQorLyogIEdpYnQgYXR5cHMgYXVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICB0Jj1OVTsKKyAgaWYodD09QklUKXt2bWF4PXpjMnptKHAtPnZjaGFyKTtmcHJpbnRmKGYsIkIlZCIsIXptZXF0byh2bWF4LGwyem0oMEwpKSk7fQorICBpZih0PT0oVU5TSUdORUR8QklUKSl7dnVtYXg9enVjMnp1bShwLT52dWNoYXIpO2ZwcmludGYoZiwiVUIlZCIsIXp1bWVxdG8odm1heCx1bDJ6dW0oMFVMKSkpO30KKyAgaWYodD09Q0hBUil7dm1heD16YzJ6bShwLT52Y2hhcik7cHJpbnR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfENIQVIpKXtmcHJpbnRmKGYsIlVDIik7dnVtYXg9enVjMnp1bShwLT52dWNoYXIpO3ByaW50enVtKGYsdnVtYXgpO30KKyAgaWYodD09U0hPUlQpe2ZwcmludGYoZiwiUyIpO3ZtYXg9enMyem0ocC0+dnNob3J0KTtwcmludHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8U0hPUlQpKXtmcHJpbnRmKGYsIlVTIik7dnVtYXg9enVzMnp1bShwLT52dXNob3J0KTtwcmludHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUZMT0FUKXtmcHJpbnRmKGYsIkYiKTt2bGRvdWJsZT16ZjJ6bGQocC0+dmZsb2F0KTtwcmludHpsZChmLHZsZG91YmxlKTt9CisgIGlmKHQ9PURPVUJMRSl7ZnByaW50ZihmLCJEIik7dmxkb3VibGU9emQyemxkKHAtPnZkb3VibGUpO3ByaW50emxkKGYsdmxkb3VibGUpO30KKyAgaWYodD09TERPVUJMRSl7ZnByaW50ZihmLCJMRCIpO3ByaW50emxkKGYscC0+dmxkb3VibGUpO30KKyAgaWYodD09SU5UKXtmcHJpbnRmKGYsIkkiKTt2bWF4PXppMnptKHAtPnZpbnQpO3ByaW50em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxJTlQpfHx0PT1OUE9JTlRFUil7ZnByaW50ZihmLCJVSSIpO3Z1bWF4PXp1aTJ6dW0ocC0+dnVpbnQpO3ByaW50enVtKGYsdnVtYXgpO30KKyAgaWYodD09TE9ORyl7ZnByaW50ZihmLCJMIik7dm1heD16bDJ6bShwLT52bG9uZyk7cHJpbnR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfExPTkcpfHx0PT1GUE9JTlRFUnx8dD09SFBPSU5URVIpe2ZwcmludGYoZiwiVUwiKTt2dW1heD16dWwyenVtKHAtPnZ1bG9uZyk7cHJpbnR6dW0oZix2dW1heCk7fQorICBpZih0PT1MTE9ORyl7ZnByaW50ZihmLCJMTCIpO3ZtYXg9emxsMnptKHAtPnZsbG9uZyk7cHJpbnR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfExMT05HKSl7ZnByaW50ZihmLCJVTEwiKTt2dW1heD16dWxsMnp1bShwLT52dWxsb25nKTtwcmludHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PU1BWElOVCkgcHJpbnR6bShmLHAtPnZtYXgpOworICBpZih0PT0oVU5TSUdORUR8TUFYSU5UKSkgcHJpbnR6dW0oZixwLT52dW1heCk7Cit9IAordm9pZCBlbWl0dmFsKEZJTEUgKmYsdW5pb24gYXR5cHMgKnAsaW50IHQpCit7CisgIHQmPU5VOworICBpZigodCZOUSk9PU5QT0lOVEVSKSB0PShVTlNJR05FRHxJTlQpOworICBpZih0PT1CSVQpe3ZtYXg9emMyem0ocC0+dmNoYXIpO2VtaXQoZiwiJWQiLCF6bWVxdG8odm1heCxsMnptKDBMKSkpO30KKyAgaWYodD09KFVOU0lHTkVEfEJJVCkpe3Z1bWF4PXp1YzJ6dW0ocC0+dnVjaGFyKTtlbWl0KGYsIiVkIiwhenVtZXF0byh2bWF4LHVsMnp1bSgwVUwpKSk7fQorICBpZih0PT1DSEFSKXt2bWF4PXpjMnptKHAtPnZjaGFyKTtlbWl0em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxDSEFSKSl7dnVtYXg9enVjMnp1bShwLT52dWNoYXIpO2VtaXR6dW0oZix2dW1heCk7fQorICBpZih0PT1TSE9SVCl7dm1heD16czJ6bShwLT52c2hvcnQpO2VtaXR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfFNIT1JUKSl7dnVtYXg9enVzMnp1bShwLT52dXNob3J0KTtlbWl0enVtKGYsdnVtYXgpO30KKyAgaWYodD09RkxPQVQpe3ZsZG91YmxlPXpmMnpsZChwLT52ZmxvYXQpO2VtaXR6bGQoZix2bGRvdWJsZSk7fQorICBpZih0PT1ET1VCTEUpe3ZsZG91YmxlPXpkMnpsZChwLT52ZG91YmxlKTtlbWl0emxkKGYsdmxkb3VibGUpO30KKyAgaWYodD09TERPVUJMRSl7ZW1pdHpsZChmLHAtPnZsZG91YmxlKTt9CisgIGlmKHQ9PUlOVCl7dm1heD16aTJ6bShwLT52aW50KTtlbWl0em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxJTlQpfHx0PT1OUE9JTlRFUil7dnVtYXg9enVpMnp1bShwLT52dWludCk7ZW1pdHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUxPTkcpe3ZtYXg9emwyem0ocC0+dmxvbmcpO2VtaXR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfExPTkcpfHx0PT1GUE9JTlRFUnx8dD09SFBPSU5URVIpe3Z1bWF4PXp1bDJ6dW0ocC0+dnVsb25nKTtlbWl0enVtKGYsdnVtYXgpO30KKyAgaWYodD09TExPTkcpe3ZtYXg9emxsMnptKHAtPnZsbG9uZyk7ZW1pdHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8TExPTkcpKXt2dW1heD16dWxsMnp1bShwLT52dWxsb25nKTtlbWl0enVtKGYsdnVtYXgpO30KKyAgaWYodD09TUFYSU5UKSBlbWl0em0oZixwLT52bWF4KTsKKyAgaWYodD09KFVOU0lHTkVEfE1BWElOVCkpIGVtaXR6dW0oZixwLT52dW1heCk7Cit9CisKK3ZvaWQgY29udl90eXAoc3RydWN0IFR5cCAqcCkKKy8qIEVyemV1Z3QgZXh0ZW5kZWQgdHlwZXMgaW4gZWluZW0gVHlwLiAqLworeworICBjaGFyICphdHRyOworICB3aGlsZShwKXsKKyAgICBpZihJU1BPSU5URVIocC0+ZmxhZ3MpKXsKKyAgICAgIHAtPmZsYWdzPSgocC0+ZmxhZ3Mmfk5VKXxQT0lOVEVSX1RZUEUocC0+bmV4dCkpOworICAgICAgaWYoYXR0cj1wLT5uZXh0LT5hdHRyKXsKKwlpZihzdHJzdHIoYXR0cixTVFJfTkVBUikpCisJICBwLT5mbGFncz0oKHAtPmZsYWdzJn5OVSl8TlBPSU5URVIpOworCWlmKHN0cnN0cihhdHRyLFNUUl9GQVIpKQorCSAgcC0+ZmxhZ3M9KChwLT5mbGFncyZ+TlUpfEZQT0lOVEVSKTsKKwlpZihzdHJzdHIoYXR0cixTVFJfSFVHRSkpCisJICBwLT5mbGFncz0oKHAtPmZsYWdzJn5OVSl8SFBPSU5URVIpOworICAgICAgfQorICAgIH0KKyAgICBpZihJU0lOVChwLT5mbGFncykmJihhdHRyPXAtPmF0dHIpJiZzdHJzdHIoYXR0ciwiYml0IikpCisgICAgICBwLT5mbGFncz0oKHAtPmZsYWdzJn5OVSl8QklUKTsKKyAgICBwPXAtPm5leHQ7CisgIH0KK30KKwordm9pZCBpbml0X2RiKEZJTEUgKmYpCit7CisgIGR3YXJmMl9zZXR1cChzaXpldGFiW0hQT0lOVEVSXSwiLmJ5dGUiLCIuMmJ5dGUiLCIuNGJ5dGUiLCIuNGJ5dGUiLGxhYnByZWZpeCxpZHByZWZpeCwiLnNlY3Rpb24iKTsKKyAgZHdhcmYyX3ByaW50X2NvbXBfdW5pdF9oZWFkZXIoZik7Cit9Cit2b2lkIGNsZWFudXBfZGIoRklMRSAqZikKK3sKKyAgZHdhcmYyX2NsZWFudXAoZik7CisgIGlmKGYpIHNlY3Rpb249LTE7Cit9IApkaWZmIC0tZ2l0IGEvbWFjaGluZXMvcmYxMi9tYWNoaW5lLmR0IGIvbWFjaGluZXMvcmYxMi9tYWNoaW5lLmR0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdkNTQ1NTIKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9yZjEyL21hY2hpbmUuZHQKQEAgLTAsMCArMSwxNCBAQAorUzEyQlMKK1MxMkJVCitTMjRCUworUzI0QlUKK1MyNEJTCitTMjRCVQorUzQ4QlMKK1M0OEJVCitTNjRCU0xFIFM2NEJTQkUKK1M2NEJVTEUgUzY0QlVCRQorUzMyQklFRUVCRQorUzY0QklFRUVCRQorUzY0QklFRUVCRQorUzQ4QlUKZGlmZiAtLWdpdCBhL21hY2hpbmVzL3JmMTIvbWFjaGluZS5oIGIvbWFjaGluZXMvcmYxMi9tYWNoaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTkwYWU4ZgotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL3JmMTIvbWFjaGluZS5oCkBAIC0wLDAgKzEsMTg4IEBACisvKiAgRXhhbXBsZSBvZiBhIGNvZGUtZ2VuZXJhdG9yIGZvciBNb3Rvcm9sYSA2OGhjMTIgMTZiaXQgbWljcm9jb250cm9sbGVycy4qLworCisjaW5jbHVkZSAiZHQuaCIKKworLyogV2UgaGF2ZSBleHRlbmRlZCB0eXBlcyEgV2hhdCB3ZSBoYXZlIHRvIGRvIHRvIHN1cHBvcnQgdGhlbTogICAgICAqLworLyogLSAjZGVmaW5lIEhBVkVfRVhUX1RZUEVTCisgICAtICN1bmRlZiBhbGwgc3RhbmRhcmQgdHlwZXMKKyAgIC0gI2RlZmluZSBhbGwgc3RhbmRhcmQgdHlwZXMgcGx1cyBuZXcgdHlwZXMKKyAgIC0gd3JpdGUgZXZhbF9jb25zdCBhbmQgaW5zZXJ0X2NvbnN0CisgICAtIHdyaXRlIHR5cGVkZWZzIGZvciB6bWF4IGFuZCB6dW1heAorICAgLSB3cml0ZSB0eXBuYW1lW10KKyAgIC0gd3JpdGUgY29udl90eXAoKQorICAgLSBvcHRpb25hbGx5ICNkZWZpbmUgSVNQT0lOVEVSLCBJU0FSSVRILCBJU0lOVCBldGMuCisgICAtIG9wdGlvbmFsbHkgI2RlZmluZSBIQVZFX1RHVF9QUklOVFZBTCBhbmQgd3JpdGUgcHJpbnR2YWwKKyAgIC0gb3B0aW9uYWxseSAjZGVmaW5lIFBPSU5URVJfVFlQRQorICAgLSBvcHRpb25hbGx5ICNkZWZpbmUgSEFWRV9UR1RfRkFMSUdOIGFuZCB3cml0ZSBmYWxpZ24KKyAgIC0gb3B0aW9uYWxseSAjZGVmaW5lIEhBVkVfVEdUX1NaT0YgYW5kIHdyaXRlIHN6b2YKKyAgIC0gb3B0aW9uYWxseSBhZGQgZnVuY3Rpb25zIGZvciBhdHRyaWJ1dGUtaGFuZGxpbmcKKyovCisjZGVmaW5lIEhBVkVfRVhUX1RZUEVTIDEKKworI2RlZmluZSBIQVZFX1RHVF9QUklOVFZBTAorCisjdW5kZWYgQ0hBUgorI3VuZGVmIFNIT1JUCisjdW5kZWYgSU5UCisjdW5kZWYgTE9ORworI3VuZGVmIExMT05HCisjdW5kZWYgRkxPQVQKKyN1bmRlZiBET1VCTEUKKyN1bmRlZiBMRE9VQkxFCisjdW5kZWYgVk9JRAorI3VuZGVmIFBPSU5URVIKKyN1bmRlZiBBUlJBWQorI3VuZGVmIFNUUlVDVAorI3VuZGVmIFVOSU9OCisjdW5kZWYgRU5VTQorI3VuZGVmIEZVTktUCisjdW5kZWYgTUFYSU5UCisjdW5kZWYgTUFYX1RZUEUKKworI2RlZmluZSBCSVQgMQorI2RlZmluZSBDSEFSIDIKKyNkZWZpbmUgU0hPUlQgMworI2RlZmluZSBJTlQgNAorI2RlZmluZSBMT05HIDUKKyNkZWZpbmUgTExPTkcgNgorI2RlZmluZSBGTE9BVCA3CisjZGVmaW5lIERPVUJMRSA4CisjZGVmaW5lIExET1VCTEUgOQorI2RlZmluZSBWT0lEIDEwCisjZGVmaW5lIE5QT0lOVEVSIDExCisjZGVmaW5lIEZQT0lOVEVSIDEyCisjZGVmaW5lIEhQT0lOVEVSIDEzCisjZGVmaW5lIEFSUkFZIDE0CisjZGVmaW5lIFNUUlVDVCAxNQorI2RlZmluZSBVTklPTiAxNgorI2RlZmluZSBFTlVNIDE3CisjZGVmaW5lIEZVTktUIDE4CisKKyNkZWZpbmUgTUFYSU5UIDE5CisKKyNkZWZpbmUgTUFYX1RZUEUgTUFYSU5UCisKKyNkZWZpbmUgUE9JTlRFUl9UWVBFKHgpIHBvaW50ZXJfdHlwZSh4KQorZXh0ZXJuIGludCBwb2ludGVyX3R5cGUoKTsKKyNkZWZpbmUgSVNQT0lOVEVSKHgpICgoeCZOUSk+PU5QT0lOVEVSJiYoeCZOUSk8PUhQT0lOVEVSKQorI2RlZmluZSBJU1NDQUxBUih4KSAoKHgmTlEpPj1CSVQmJih4Jk5RKTw9SFBPSU5URVIpCisjZGVmaW5lIElTSU5UKHgpICgoeCZOUSk+PUJJVCYmKHgmTlEpPD1MTE9ORykKKyNkZWZpbmUgUFRSRElGRl9UKHgpICgoeCk9PUhQT0lOVEVSP0xPTkc6SU5UKQorCit0eXBlZGVmIHpsbG9uZyB6bWF4OwordHlwZWRlZiB6dWxsb25nIHp1bWF4OworCit1bmlvbiBhdHlwc3sKKyAgemNoYXIgdmNoYXI7CisgIHp1Y2hhciB2dWNoYXI7CisgIHpzaG9ydCB2c2hvcnQ7CisgIHp1c2hvcnQgdnVzaG9ydDsKKyAgemludCB2aW50OworICB6dWludCB2dWludDsKKyAgemxvbmcgdmxvbmc7CisgIHp1bG9uZyB2dWxvbmc7CisgIHpsbG9uZyB2bGxvbmc7CisgIHp1bGxvbmcgdnVsbG9uZzsKKyAgem1heCB2bWF4OworICB6dW1heCB2dW1heDsKKyAgemZsb2F0IHZmbG9hdDsKKyAgemRvdWJsZSB2ZG91YmxlOworICB6bGRvdWJsZSB2bGRvdWJsZTsKK307CisKKy8qICBUaGlzIHN0cnVjdCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgbWFjaGluZS1zcGVjaWZpYyAgICAgICAgICAgKi8KKy8qICBhZGRyZXNzaW5nLW1vZGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3QgdXNlZCBpbiB0aGlzIGNvZGUtZ2VuZXJyYXRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0cnVjdCBBZGRyZXNzaW5nTW9kZXsKKyAgICBpbnQgZmxhZ3M7CisgICAgaW50IGJhc2U7CisgICAgbG9uZyBvZmZzZXQ7CisgICAgc3RydWN0IFZhciAqdjsKK307CisKKy8qIFRoaXMgdHlwZSB3aWxsIGJlIGFkZGVkIHRvIGV2ZXJ5IElDLiBDYW4gYmUgdXNlZCBieSB0aGUgY2cuICAgICAgKi8KKyNkZWZpbmUgSEFWRV9FWFRfSUMgMQorc3RydWN0IGV4dF9pYyB7CisgIGludCBmbGFnczsKKyAgaW50IHI7CisgIGxvbmcgb2Zmc2V0OworfTsKKworLyogIFRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIG9mIHRoZSB0YXJnZXQgbWFjaGluZS4gICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQVhSIDYKKworLyogIE51bWJlciBvZiBjb21tYW5kbGluZS1vcHRpb25zIHRoZSBjb2RlLWdlbmVyYXRvciBhY2NlcHRzLiAgICAgICAqLworI2RlZmluZSBNQVhHRiAyMAorCisvKiAgSWYgdGhpcyBpcyBzZXQgdG8gemVybyB2YmNjIHdpbGwgbm90IGdlbmVyYXRlIElDcyB3aGVyZSB0aGUgICAgICovCisvKiAgdGFyZ2V0IG9wZXJhbmQgaXMgdGhlIHNhbWUgYXMgdGhlIDJuZCBzb3VyY2Ugb3BlcmFuZC4gICAgICAgICAgICovCisvKiAgVGhpcyBjYW4gc29tZXRpbWVzIHNpbXBsaWZ5IHRoZSBjb2RlLWdlbmVyYXRvciwgYnV0IHVzdWFsbHkgICAgICovCisvKiAgdGhlIGNvZGUgaXMgYmV0dGVyIGlmIHRoZSBjb2RlLWdlbmVyYXRvciBhbGxvd3MgaXQuICAgICAgICAgICAgICovCisjZGVmaW5lIFVTRVEyQVNaIDEKKworLyogIFRoaXMgc3BlY2lmaWVzIHRoZSBzbWFsbGVzdCBpbnRlZ2VyIHR5cGUgdGhhdCBjYW4gYmUgYWRkZWQgdG8gYSAqLworLyogIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworZXh0ZXJuIGludCBNSU5BRERJMlA7CisKKy8qICBJZiB0aGUgYnl0ZXMgb2YgYW4gaW50ZWdlciBhcmUgb3JkZXJlZCBtb3N0IHNpZ25pZmljYW50IGJ5dGUgICAgKi8KKy8qICBieXRlIGZpcnN0IGFuZCB0aGVuIGRlY3JlYXNpbmcgc2V0IEJJR0VORElBTiB0byAxLiAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHRU5ESUFOIDEKKworLyogIElmIHRoZSBieXRlcyBvZiBhbiBpbnRlZ2VyIGFyZSBvcmRlcmVkIGxlc3Qgc2lnbmlmaWNhbnQgYnl0ZSAgICAqLworLyogIGJ5dGUgZmlyc3QgYW5kIHRoZW4gaW5jcmVhc2luZyBzZXQgTElUVExFRU5ESUFOIHRvIDEuICAgICAgICAgICAqLworI2RlZmluZSBMSVRUTEVFTkRJQU4gMAorCisvKiAgTm90ZSB0aGF0IEJJR0VORElBTiBhbmQgTElUVExFRU5ESUFOIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICAgICovCisKKy8qICBJZiBzd2l0Y2gtc3RhdGVtZW50cyBzaG91bGQgYmUgZ2VuZXJhdGVkIGFzIGEgc2VxdWVuY2Ugb2YgICAgICAgKi8KKy8qICBTVUIsVFNULEJFUSBJQ3MgcmF0aGVyIHRoYW4gQ09NUEFSRSxCRVEgSUNzIHNldCB0aGlzIHRvIDEuICAgICAgKi8KKy8qICBUaGlzIGNhbiB5aWVsZCBiZXR0ZXIgY29kZSBvbiBzb21lIG1hY2hpbmVzLiAgICAgICAgICAgICAgICAgICAgKi8KK2V4dGVybiBpbnQgc3dpdGNoc3ViczsKKyNkZWZpbmUgU1dJVENIU1VCUyBzd2l0Y2hzdWJzCisKKy8qICBJbiBvcHRpbWl6aW5nIGNvbXBpbGF0aW9uIGNlcnRhaW4gbGlicmFyeSBtZW1jcHkvc3RyY3B5LWNhbGxzICAgKi8KKy8qICB3aXRoIGxlbmd0aCBrbm93biBhdCBjb21waWxlLXRpbWUgd2lsbCBiZSBpbmxpbmVkIHVzaW5nIGFuICAgICAgKi8KKy8qICBBU1NJR04tSUMgaWYgdGhlIHNpemUgaXMgbGVzcyBvciBlcXVhbCB0byBJTkxJTkVNRU1DUFkuICAgICAgICAgKi8KKy8qICBUaGUgdHlwZSB1c2VkIGZvciB0aGUgQVNTSUdOLUlDIHdpbGwgYmUgVU5TSUdORUR8Q0hBUi4gICAgICAgICAgKi8KKyNkZWZpbmUgSU5MSU5FTUVNQ1BZIDEwMjQKKworI2RlZmluZSBIQVZFX1JFR1BBUk1TIDEKKworc3RydWN0IHJlZ19oYW5kbGUgeworICBpbnQgZ3ByOworfTsKKworLyogIFdlIHVzZSB1bnNpZ25lZCBpbnQgYXMgc2l6ZV90IHJhdGhlciB0aGFuIHVuc2lnbmVkIGxvbmcgd2hpY2ggICAqLworLyogIGlzIHRoZSBkZWZhdWx0IHNldHRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQVZFX0lOVF9TSVpFVCAxCisKKy8qICBXZSBoYXZlIHJlZ2lzdGVyIHBhaXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9SRUdQQUlSUyAxCisKKy8qICBXZSBrZWVwIHRyYWNrIG9mIGFsbCByZWdpc3RlcnMgbW9kaWZpZWQgYnkgYSBmdW5jdGlvbi4gICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9SRUdTX01PRElGSUVEIDEKKworI2RlZmluZSBIQVZFX1RBUkdFVF9SQUxMT0MgMQorI2RlZmluZSBjb3N0X2xvYWRfcmVnKHIsdikgNAorI2RlZmluZSBjb3N0X3NhdmVfcmVnKHIsdikgNAorI2RlZmluZSBjb3N0X21vdmVfcmVnKGksaikgMgorI2RlZmluZSBjb3N0X3B1c2hwb3BfcmVnKHIpIDIKKworLyogc2l6ZSBvZiBidWZmZXIgZm9yIGFzbS1vdXRwdXQgKi8KKyNkZWZpbmUgRU1JVF9CVUZfTEVOIDEwMjQgLyogc2hvdWxkIGJlIGVub3VnaCAqLworLyogbnVtYmVyIG9mIGFzbS1vdXRwdXQgbGluZXMgYnVmZmVyZWQgKi8KKyNkZWZpbmUgRU1JVF9CVUZfREVQVEggNAorCisvKiAgV2UgaGF2ZSBhc21fcGVlcGhvbGUgdG8gb3B0aW1pemUgYXNzZW1ibHktb3V0cHV0ICovCisjZGVmaW5lIEhBVkVfVEFSR0VUX1BFRVBIT0xFIDEKKworLyogIFdlIGhhdmUgc29tZSB0YXJnZXQtc3BlY2lmaWMgdmFyaWFibGUgYXR0cmlidXRlcy4gICAgICAgICAgICAgICAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9BVFRSSUJVVEVTIDEKKworLyogV2UgdXNlIGJ1aWx0aW4gbGliY2FsbHMgZm9yIHNvbWUgb3BlcmF0aW9ucyAqLworI2RlZmluZSBIQVZFX0xJQkNBTExTIDEKKworLyogV2UgcHJlZmVyIEJORSByYXRoZXIgdGhhbiBCR1QuICovCisjZGVmaW5lIEhBVkVfV0FOVEJORSAxCisKKyNkZWZpbmUgSEFWRV9QT0YyT1BUIDEKZGlmZiAtLWdpdCBhL21hY2hpbmVzL3NyYy9tYWNoaW5lLmMgYi9tYWNoaW5lcy9zcmMvbWFjaGluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY0ZjI1YWYKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9zcmMvbWFjaGluZS5jCkBAIC0wLDAgKzEsMTA5MiBAQAorLyogIEMgc3JjIGJhY2tlbmQgZm9yIHZiY2MKKyAqLworCisjaW5jbHVkZSAic3VwcC5oIgorCitzdGF0aWMgY2hhciBGSUxFX1tdPV9fRklMRV9fOworCisvKiAgUHVibGljIGRhdGEgdGhhdCBNVVNUIGJlIHRoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogTmFtZSBhbmQgY29weXJpZ2h0LiAqLworY2hhciBjZ19jb3B5cmlnaHRbXT0idmJjYyBDIHNvdXJjZSBjb2RlLWdlbmVyYXRvciBWMC4xYSAoYykgaW4gMjAxMSBieSBWb2xrZXIgQmFydGhlbG1hbm4iOworCisKK2ludCBnX2ZsYWdzW01BWEdGXT17MH07CisKKy8qIHRoZSBmbGFnLW5hbWUsIGRvIG5vdCB1c2UgbmFtZXMgYmVnaW5uaW5nIHdpdGggbCwgTCwgSSwgRCBvciBVLCBiZWNhdXNlCisgICB0aGV5IGNvbGxpZGUgd2l0aCB0aGUgZnJvbnRlbmQgKi8KK2NoYXIgKmdfZmxhZ3NfbmFtZVtNQVhHRl09ezB9OworCisvKiB0aGUgcmVzdWx0cyBvZiBwYXJzaW5nIHRoZSBjb21tYW5kLWxpbmUtZmxhZ3Mgd2lsbCBiZSBzdG9yZWQgaGVyZSAqLwordW5pb24gcHBpIGdfZmxhZ3NfdmFsW01BWEdGXTsKKworLyogIEFsaWdubWVudC1yZXF1aXJlbWVudHMgZm9yIGFsbCB0eXBlcyBpbiBieXRlcy4gICAgICAgICAgICAgICovCit6bWF4IGFsaWduW01BWF9UWVBFKzFdOworCisvKiAgQWxpZ25tZW50IHRoYXQgaXMgc3VmZmljaWVudCBmb3IgZXZlcnkgb2JqZWN0LiAgICAgICAgICAgICAgKi8KK3ptYXggbWF4YWxpZ247CisKKy8qICBDSEFSX0JJVCBmb3IgdGhlIHRhcmdldCBtYWNoaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworem1heCBjaGFyX2JpdDsKKworLyogIHNpemVzIG9mIHRoZSBiYXNpYyB0eXBlcyAoaW4gYnl0ZXMpICovCit6bWF4IHNpemV0YWJbTUFYX1RZUEUrMV07CisKKy8qICBNaW5pbXVtIGFuZCBNYXhpbXVtIHZhbHVlcyBlYWNoIHR5cGUgY2FuIGhhdmUuICAgICAgICAgICAgICAqLworLyogIE11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gaW5pdF9jZygpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IHRfbWluW01BWF9UWVBFKzFdOworenVtYXggdF9tYXhbTUFYX1RZUEUrMV07Cit6dW1heCB0dV9tYXhbTUFYX1RZUEUrMV07CisKKy8qICBOYW1lcyBvZiBhbGwgcmVnaXN0ZXJzLiB3aWxsIGJlIGluaXRpYWxpemVkIGluIGluaXRfY2coKSwKKyAgICByZWdpc3RlciBudW1iZXIgMCBpcyBpbnZhbGlkLCB2YWxpZCByZWdpc3RlcnMgc3RhcnQgYXQgMSAqLworY2hhciAqcmVnbmFtZXNbTUFYUisxXTsKKworLyogIFRoZSBTaXplIG9mIGVhY2ggcmVnaXN0ZXIgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IHJlZ3NpemVbTUFYUisxXTsKKworLyogIGEgdHlwZSB3aGljaCBjYW4gc3RvcmUgZWFjaCByZWdpc3Rlci4gKi8KK3N0cnVjdCBUeXAgKnJlZ3R5cGVbTUFYUisxXTsKKworLyogIHJlZ3NhW3JlZ10hPTAgaWYgYSBjZXJ0YWluIHJlZ2lzdGVyIGlzIGFsbG9jYXRlZCBhbmQgc2hvdWxkICovCisvKiAgbm90IGJlIHVzZWQgYnkgdGhlIGNvbXBpbGVyIHBhc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2ludCByZWdzYVtNQVhSKzFdOworCisvKiAgU3BlY2lmaWVzIHdoaWNoIHJlZ2lzdGVycyBtYXkgYmUgc2NyYXRjaGVkIGJ5IGZ1bmN0aW9ucy4gICAgKi8KK2ludCByZWdzY3JhdGNoW01BWFIrMV07CisKKy8qIHNwZWNpZmllcyB0aGUgcHJpb3JpdHkgZm9yIHRoZSByZWdpc3Rlci1hbGxvY2F0b3IsIGlmIHRoZSBzYW1lCisgICBlc3RpbWF0ZWQgY29zdC1zYXZpbmcgY2FuIGJlIG9idGFpbmVkIGJ5IHNldmVyYWwgcmVnaXN0ZXJzLCB0aGUKKyAgIG9uZSB3aXRoIHRoZSBoaWdoZXN0IHByaW9yaXR5IHdpbGwgYmUgdXNlZCAqLworaW50IHJlZ19wcmlvW01BWFIrMV07CisKKy8qIE5hbWVzIG9mIHRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZSBhdHRyaWJ1dGVzLiAgICAgICAgICAgICAgICAqLworY2hhciAqZ19hdHRyX25hbWVbXT17Il9faW50ZXJydXB0IiwwfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBQcml2YXRlIGRhdGEgYW5kIGZ1bmN0aW9ucy4gICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGFsaWdubWVudCBvZiBiYXNpYyBkYXRhLXR5cGVzLCB1c2VkIHRvIGluaXRpYWxpemUgYWxpZ25bXSAqLworc3RhdGljIGxvbmcgbWFsaWduW01BWF9UWVBFKzFdPSAgezEsMSwyLDQsNCw0LDQsOCw4LDEsNCwxLDEsMSw0LDF9OworLyogc2l6ZXMgb2YgYmFzaWMgZGF0YS10eXBlcywgdXNlZCB0byBpbml0aWFsaXplIHNpemV0YWJbXSAqLworc3RhdGljIGxvbmcgbXNpemV0YWJbTUFYX1RZUEUrMV09ezEsMSwyLDQsNCw4LDQsOCw4LDAsNCwwLDAsMCw0LDB9OworCisvKiB1c2VkIHRvIGluaXRpYWxpemUgcmVndHlwW10gKi8KK3N0YXRpYyBzdHJ1Y3QgVHlwIGx0eXA9e0xPTkd9LGxkYmw9e0RPVUJMRX0sbGNoYXI9e0NIQVJ9OworCisvKiBtYWNyb3MgZGVmaW5lZCBieSB0aGUgYmFja2VuZCAqLworc3RhdGljIGNoYXIgKm1hcnJheVtdPXsiX19zZWN0aW9uKHgpPV9fdmF0dHIoXCJzZWN0aW9uKFwiI3hcIilcIikiLAorCQkgICAgICAgIl9fR0VORVJJQ19fIiwKKwkJICAgICAgIDB9OworCisKKyNkZWZpbmUgZHQodCkgKCgodCkmVU5TSUdORUQpP3VkdFsodCkmTlFdOnNkdFsodCkmTlFdKQorc3RhdGljIGNoYXIgKnNkdFtNQVhfVFlQRSsxXT17Ij8/IiwiYyIsInMiLCJpIiwibCIsImxsIiwiZiIsImQiLCJsZCIsInYiLCJwIn07CitzdGF0aWMgY2hhciAqdWR0W01BWF9UWVBFKzFdPXsiPz8iLCJ1YyIsInVzIiwidWkiLCJ1bCIsInVsbCIsImYiLCJkIiwibGQiLCJ2IiwicCJ9OworCisvKiBzZWN0aW9ucyAqLworI2RlZmluZSBEQVRBIDAKKyNkZWZpbmUgQlNTIDEKKyNkZWZpbmUgQ09ERSAyCisjZGVmaW5lIFJPREFUQSAzCisjZGVmaW5lIFNQRUNJQUwgNAorCitzdGF0aWMgbG9uZyBzdGFjazsKK3N0YXRpYyBpbnQgc3RhY2tfdmFsaWQ7CitzdGF0aWMgaW50IHNlY3Rpb249LTEsbmV3b2JqOworc3RhdGljIGNoYXIgKmNvZGVuYW1lPSJcdC50ZXh0XG4iLAorICAqZGF0YW5hbWU9Ilx0LmRhdGFcbiIsCisgICpic3NuYW1lPSIiLAorICAqcm9kYXRhbmFtZT0iXHQuc2VjdGlvblx0LnJvZGF0YVxuIjsKKworLyogcmV0dXJuLWluc3RydWN0aW9uICovCitzdGF0aWMgY2hhciAqcmV0OworCisvKiBsYWJlbCBhdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiAoaWYgYW55KSAqLworc3RhdGljIGludCBleGl0X2xhYmVsOworCisvKiBhc3NlbWJseS1wcmVmaXhlcyBmb3IgbGFiZWxzIGFuZCBleHRlcm5hbCBpZGVudGlmaWVycyAqLworc3RhdGljIGNoYXIgKmxhYnByZWZpeD0ibCIsKmlkcHJlZml4PSJfIjsKKworI2lmIEZJWEVEX1NQCisvKiB2YXJpYWJsZXMgdG8gY2FsY3VsYXRlIHRoZSBzaXplIGFuZCBwYXJ0aXRpb25pbmcgb2YgdGhlIHN0YWNrLWZyYW1lCisgICBpbiB0aGUgY2FzZSBvZiBGSVhFRF9TUCAqLworc3RhdGljIGxvbmcgZnJhbWVvZmZzZXQscHVzaGVkLG1heHB1c2hlZCxmcmFtZXNpemU7CisjZWxzZQorLyogdmFyaWFibGVzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc3RhY2stb2Zmc2V0IGluIHRoZSBjYXNlIG9mCisgICBhIG1vdmluZyBzdGFjay1wb2ludGVyICovCitzdGF0aWMgbG9uZyBub3Rwb3BwZWQsZG9udHBvcCxzdGFja29mZnNldCxtYXhwdXNoZWQ7CisjZW5kaWYKKworc3RhdGljIGxvbmcgbG9jYWxzaXplLHJzYXZlc2l6ZSxhcmdzaXplOworCitzdGF0aWMgdm9pZCBlbWl0X29iaihGSUxFICpmLHN0cnVjdCBvYmogKnAsaW50IHQpOworCisvKiBjYWxjdWxhdGUgdGhlIGFjdHVhbCBjdXJyZW50IG9mZnNldCBvZiBhbiBvYmplY3QgcmVsYXRpdiB0byB0aGUKKyAgIHN0YWNrLXBvaW50ZXI7IHdlIHVzZSBhIGxheW91dCBsaWtlIHRoaXM6CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHwgYXJndW1lbnRzIHRvIHRoaXMgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgfAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB8IHJldHVybi1hZGRyZXNzIFtzaXplPTRdICAgICAgICAgICAgICAgICAgICAgIHwKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCBjYWxsZXItc2F2ZSByZWdpc3RlcnMgW3NpemU9cnNhdmVzaXplXSAgICAgICB8CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHwgbG9jYWwgdmFyaWFibGVzIFtzaXplPWxvY2Fsc2l6ZV0gICAgICAgICAgICAgfAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB8IGFyZ3VtZW50cyB0byBjYWxsZWQgZnVuY3Rpb25zIFtzaXplPWFyZ3NpemVdIHwKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgQWxsIHNpemVzIHdpbGwgYmUgYWxpZ25lZCBhcyBuZWNlc3NhcnkuCisgICBJbiB0aGUgY2FzZSBvZiBGSVhFRF9TUCwgdGhlIHN0YWNrLXBvaW50ZXIgd2lsbCBiZSBhZGp1c3RlZCBhdAorICAgZnVuY3Rpb24tZW50cnkgdG8gbGVhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgYXJndW1lbnRzIGFuZCBoYXZlIGl0CisgICBhbGlnbmVkIHRvIDE2IGJ5dGVzLiBUaGVyZWZvcmUsIHdoZW4gY2FsbGluZyBhIGZ1bmN0aW9uLCB0aGUKKyAgIHN0YWNrLXBvaW50ZXIgaXMgYWx3YXlzIGFsaWduZWQgdG8gMTYgYnl0ZXMuCisgICBGb3IgYSBtb3Zpbmcgc3RhY2stcG9pbnRlciwgdGhlIHN0YWNrLXBvaW50ZXIgd2lsbCB1c3VhbGx5IHBvaW50CisgICB0byB0aGUgYm90dG9tIG9mIHRoZSBhcmVhIGZvciBsb2NhbCB2YXJpYWJsZXMsIGJ1dCB3aWxsIG1vdmUgd2hpbGUKKyAgIGFyZ3VtZW50cyBhcmUgcHV0IG9uIHRoZSBzdGFjay4KKworICAgVGhpcyBpcyBqdXN0IGFuIGV4YW1wbGUgbGF5b3V0LiBPdGhlciBsYXlvdXRzIGFyZSBhbHNvIHBvc3NpYmxlLgorKi8KKworc3RhdGljIGxvbmcgcmVhbF9vZmZzZXQoc3RydWN0IG9iaiAqbykKK3sKKyAgbG9uZyBvZmY9em0ybChvLT52LT5vZmZzZXQpOworICBpZihvZmY8MCl7CisgICAgLyogZnVuY3Rpb24gcGFyYW1ldGVyICovCisgICAgb2ZmPWxvY2Fsc2l6ZStyc2F2ZXNpemUrNC1vZmYtem0ybChtYXhhbGlnbik7CisgIH0KKworI2lmIEZJWEVEX1NQCisgIG9mZis9YXJnc2l6ZTsKKyNlbHNlCisgIG9mZis9c3RhY2tvZmZzZXQ7CisjZW5kaWYKKyAgb2ZmKz16bTJsKG8tPnZhbC52bWF4KTsKKyAgcmV0dXJuIG9mZjsKK30KKworLyogIEluaXRpYWxpemVzIGFuIGFkZHJlc3NpbmctbW9kZSBzdHJ1Y3R1cmUgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvCisgICAgdGhhdCBvYmplY3QuIFdpbGwgbm90IHN1cnZpdmUgYSBzZWNvbmQgY2FsbCEgKi8KK3N0YXRpYyBzdHJ1Y3Qgb2JqICpjYW0oaW50IGZsYWdzLGludCBiYXNlLGxvbmcgb2Zmc2V0KQoreworICBzdGF0aWMgc3RydWN0IG9iaiBvYmo7CisgIHN0YXRpYyBzdHJ1Y3QgQWRkcmVzc2luZ01vZGUgYW07CisgIG9iai5hbT0mYW07CisgIGFtLmZsYWdzPWZsYWdzOworICBhbS5iYXNlPWJhc2U7CisgIGFtLm9mZnNldD1vZmZzZXQ7CisgIHJldHVybiAmb2JqOworfQorCisvKiBjaGFuZ2VzIHRvIGEgc3BlY2lhbCBzZWN0aW9uLCB1c2VkIGZvciBfX3NlY3Rpb24oKSAqLworc3RhdGljIGludCBzcGVjaWFsX3NlY3Rpb24oRklMRSAqZixzdHJ1Y3QgVmFyICp2KQoreworICBjaGFyICpzZWM7CisgIGlmKCF2LT52YXR0cikgcmV0dXJuIDA7CisgIHNlYz1zdHJzdHIodi0+dmF0dHIsInNlY3Rpb24oIik7CisgIGlmKCFzZWMpIHJldHVybiAwOworICBzZWMrPXN0cmxlbigic2VjdGlvbigiKTsKKyAgZW1pdChmLCJcdC5zZWN0aW9uXHQiKTsKKyAgd2hpbGUoKnNlYyYmKnNlYyE9JyknKSBlbWl0X2NoYXIoZiwqc2VjKyspOworICBlbWl0KGYsIlxuIik7CisgIGlmKGYpIHNlY3Rpb249U1BFQ0lBTDsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIGdlbmVyYXRlIGNvZGUgdG8gbG9hZCB0aGUgYWRkcmVzcyBvZiBhIHZhcmlhYmxlIGludG8gcmVnaXN0ZXIgciAqLworc3RhdGljIHZvaWQgbG9hZF9hZGRyZXNzKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdHlwZSkKKy8qICBHZW5lcmF0ZXMgY29kZSB0byBsb2FkIHRoZSBhZGRyZXNzIG9mIGEgdmFyaWFibGUgaW50byByZWdpc3RlciByLiAgICovCit7CisgIGlmKCEoby0+ZmxhZ3MmVkFSKSkgaWVycm9yKDApOworICBpZihvLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CisgICAgbG9uZyBvZmY9cmVhbF9vZmZzZXQobyk7CisgICAgaWYoVEhSRUVfQUREUil7CisgICAgICBlbWl0KGYsIlx0YWRkLiVzXHQlcywlcywlbGRcbiIsZHQoUE9JTlRFUikscmVnbmFtZXNbcl0scmVnbmFtZXNbc3BdLG9mZik7CisgICAgfWVsc2V7CisgICAgICBlbWl0KGYsIlx0bW92LiVzXHQlcywlc1xuIixkdChQT0lOVEVSKSxyZWduYW1lc1tyXSxyZWduYW1lc1tzcF0pOworICAgICAgaWYob2ZmKQorCWVtaXQoZiwiXHRhZGQuJXNcdCVzLCVsZFxuIixkdChQT0lOVEVSKSxyZWduYW1lc1tyXSxvZmYpOworICAgIH0KKyAgfWVsc2V7CisgICAgZW1pdChmLCJcdG1vdi4lc1x0JXMsIixkdChQT0lOVEVSKSxyZWduYW1lc1tyXSk7CisgICAgZW1pdF9vYmooZixvLHR5cGUpOworICAgIGVtaXQoZiwiXG4iKTsKKyAgfQorfQorLyogR2VuZXJhdGVzIGNvZGUgdG8gbG9hZCBhIG1lbW9yeSBvYmplY3QgaW50byByZWdpc3RlciByLiB0bXAgaXMgYQorICAgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIHdoaWNoIG1heSBiZSB1c2VkLiB0bXAgY2FuIGJlIHIuICovCitzdGF0aWMgdm9pZCBsb2FkX3JlZyhGSUxFICpmLGludCByLHN0cnVjdCBvYmogKm8saW50IHR5cGUpCit7CisgIHR5cGUmPU5VOworICBpZihvLT5mbGFncyZWQVJBRFIpeworICAgIGxvYWRfYWRkcmVzcyhmLHIsbyxQT0lOVEVSKTsKKyAgfWVsc2V7CisgICAgaWYoKG8tPmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJm8tPnJlZz09cikKKyAgICAgIHJldHVybjsKKyAgICBlbWl0KGYsIlx0bW92LiVzXHQlcywiLGR0KHR5cGUpLHJlZ25hbWVzW3JdKTsKKyAgICBlbWl0X29iaihmLG8sdHlwZSk7CisgICAgZW1pdChmLCJcbiIpOworICB9Cit9CisKKy8qICBHZW5lcmF0ZXMgY29kZSB0byBzdG9yZSByZWdpc3RlciByIGludG8gbWVtb3J5IG9iamVjdCBvLiAqLworc3RhdGljIHZvaWQgc3RvcmVfcmVnKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdHlwZSkKK3sKKyAgdHlwZSY9TlE7CisgIGVtaXQoZiwiXHRtb3YuJXNcdCIsZHQodHlwZSkpOworICBlbWl0X29iaihmLG8sdHlwZSk7CisgIGVtaXQoZiwiLCVzXG4iLHJlZ25hbWVzW3JdKTsKK30KKworLyogIFlpZWxkcyBsb2cyKHgpKzEgb3IgMC4gKi8KK3N0YXRpYyBsb25nIHBvZjIoenVtYXggeCkKK3sKKyAgenVtYXggcDtpbnQgbG49MTsKKyAgcD11bDJ6dW0oMUwpOworICB3aGlsZShsbjw9MzImJnp1bWxlcShwLHgpKXsKKyAgICBpZih6dW1lcXRvKHgscCkpIHJldHVybiBsbjsKKyAgICBsbisrO3A9enVtYWRkKHAscCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgSUMgKnByZWxvYWQoRklMRSAqLHN0cnVjdCBJQyAqKTsKKworc3RhdGljIHZvaWQgZnVuY3Rpb25fdG9wKEZJTEUgKixzdHJ1Y3QgVmFyICosbG9uZyk7CitzdGF0aWMgdm9pZCBmdW5jdGlvbl9ib3R0b20oRklMRSAqZixzdHJ1Y3QgVmFyICosbG9uZyk7CisKKyNkZWZpbmUgaXNyZWcoeCkgKChwLT54LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpCisjZGVmaW5lIGlzY29uc3QoeCkgKChwLT54LmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKQorCitzdGF0aWMgaW50IHExcmVnLHEycmVnLHpyZWc7CisKK3N0YXRpYyBjaGFyICpjY3NbXT17ImVxIiwibmUiLCJsdCIsImdlIiwibGUiLCJndCIsIiJ9Oworc3RhdGljIGNoYXIgKmxvZ2ljYWxzW109eyJvciIsInhvciIsImFuZCJ9Oworc3RhdGljIGNoYXIgKmFyaXRobWV0aWNzW109eyJzbHciLCJzcnciLCJhZGQiLCJzdWIiLCJtdWxsdyIsImRpdnciLCJtb2QifTsKKworLyogRG9lcyBzb21lIHByZS1wcm9jZXNzaW5nIGxpa2UgZmV0Y2hpbmcgb3BlcmFuZHMgZnJvbSBtZW1vcnkgdG8KKyAgIHJlZ2lzdGVycyBldGMuICovCitzdGF0aWMgc3RydWN0IElDICpwcmVsb2FkKEZJTEUgKmYsc3RydWN0IElDICpwKQoreworICBpbnQgcjsKKworICBpZihpc3JlZyhxMSkpCisgICAgcTFyZWc9cC0+cTEucmVnOworICBlbHNlCisgICAgcTFyZWc9MDsKKworICBpZihpc3JlZyhxMikpCisgICAgcTJyZWc9cC0+cTIucmVnOworICBlbHNlCisgICAgcTJyZWc9MDsKKworICBpZihpc3JlZyh6KSl7CisgICAgenJlZz1wLT56LnJlZzsKKyAgfWVsc2V7CisgICAgaWYoSVNGTE9BVCh6dHlwKHApKSkKKyAgICAgIHpyZWc9ZjE7CisgICAgZWxzZQorICAgICAgenJlZz10MTsKKyAgfQorICAKKyAgaWYoKHAtPnExLmZsYWdzJihEUkVGT0JKfFJFRykpPT1EUkVGT0JKJiYhcC0+cTEuYW0peworICAgIHAtPnExLmZsYWdzJj1+RFJFRk9CSjsKKyAgICBsb2FkX3JlZyhmLHQxLCZwLT5xMSxxMXR5cChwKSk7CisgICAgcC0+cTEucmVnPXQxOworICAgIHAtPnExLmZsYWdzfD0oUkVHfERSRUZPQkopOworICB9CisgIGlmKHAtPnExLmZsYWdzJiZMT0FEX1NUT1JFJiYhaXNyZWcocTEpKXsKKyAgICBpZihJU0ZMT0FUKHExdHlwKHApKSkKKyAgICAgIHExcmVnPWYxOworICAgIGVsc2UKKyAgICAgIHExcmVnPXQxOworICAgIGxvYWRfcmVnKGYscTFyZWcsJnAtPnExLHExdHlwKHApKTsKKyAgICBwLT5xMS5yZWc9cTFyZWc7CisgICAgcC0+cTEuZmxhZ3M9UkVHOworICB9CisKKyAgaWYoKHAtPnEyLmZsYWdzJihEUkVGT0JKfFJFRykpPT1EUkVGT0JKJiYhcC0+cTIuYW0peworICAgIHAtPnEyLmZsYWdzJj1+RFJFRk9CSjsKKyAgICBsb2FkX3JlZyhmLHQxLCZwLT5xMixxMnR5cChwKSk7CisgICAgcC0+cTIucmVnPXQxOworICAgIHAtPnEyLmZsYWdzfD0oUkVHfERSRUZPQkopOworICB9CisgIGlmKHAtPnEyLmZsYWdzJiZMT0FEX1NUT1JFJiYhaXNyZWcocTIpKXsKKyAgICBpZihJU0ZMT0FUKHEydHlwKHApKSkKKyAgICAgIHEycmVnPWYyOworICAgIGVsc2UKKyAgICAgIHEycmVnPXQyOworICAgIGxvYWRfcmVnKGYscTJyZWcsJnAtPnEyLHEydHlwKHApKTsKKyAgICBwLT5xMi5yZWc9cTJyZWc7CisgICAgcC0+cTIuZmxhZ3M9UkVHOworICB9CisgIHJldHVybiBwOworfQorCisvKiBzYXZlIHRoZSByZXN1bHQgKGluIHpyZWcpIGludG8gcC0+eiAqLwordm9pZCBzYXZlX3Jlc3VsdChGSUxFICpmLHN0cnVjdCBJQyAqcCkKK3sKKyAgaWYoKHAtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PURSRUZPQkomJiFwLT56LmFtKXsKKyAgICBwLT56LmZsYWdzJj1+RFJFRk9CSjsKKyAgICBsb2FkX3JlZyhmLHQyLCZwLT56LFBPSU5URVIpOworICAgIHAtPnoucmVnPXQyOworICAgIHAtPnouZmxhZ3N8PShSRUd8RFJFRk9CSik7CisgIH0KKyAgaWYoaXNyZWcoeikpeworICAgIGlmKHAtPnoucmVnIT16cmVnKQorICAgICAgZW1pdChmLCJcdG1vdi4lc1x0JXMsJXNcbiIsZHQoenR5cChwKSkscmVnbmFtZXNbcC0+ei5yZWddLHJlZ25hbWVzW3pyZWddKTsKKyAgfWVsc2V7CisgICAgc3RvcmVfcmVnKGYsenJlZywmcC0+eix6dHlwKHApKTsKKyAgfQorfQorCisvKiBwcmludHMgYW4gb2JqZWN0ICovCitzdGF0aWMgdm9pZCBlbWl0X29iaihGSUxFICpmLHN0cnVjdCBvYmogKnAsaW50IHQpCit7CisgIGlmKHAtPmFtKXsKKyAgICBpZihwLT5hbS0+ZmxhZ3MmR1BSX0lORCkgZW1pdChmLCIoJXMsJXMpIixyZWduYW1lc1twLT5hbS0+b2Zmc2V0XSxyZWduYW1lc1twLT5hbS0+YmFzZV0pOworICAgIGlmKHAtPmFtLT5mbGFncyZJTU1fSU5EKSBlbWl0KGYsIiglbGQsJXMpIixwLT5hbS0+b2Zmc2V0LHJlZ25hbWVzW3AtPmFtLT5iYXNlXSk7CisgICAgcmV0dXJuOworICB9CisgIGlmKChwLT5mbGFncyYoS09OU1R8RFJFRk9CSikpPT0oS09OU1R8RFJFRk9CSikpeworICAgIGVtaXR2YWwoZiwmcC0+dmFsLHAtPmR0eXAmTlUpOworICAgIHJldHVybjsKKyAgfQorICBpZihwLT5mbGFncyZEUkVGT0JKKSBlbWl0KGYsIigiKTsKKyAgaWYocC0+ZmxhZ3MmUkVHKXsKKyAgICBlbWl0KGYsIiVzIixyZWduYW1lc1twLT5yZWddKTsKKyAgfWVsc2UgaWYocC0+ZmxhZ3MmVkFSKSB7CisgICAgaWYocC0+di0+c3RvcmFnZV9jbGFzcz09QVVUT3x8cC0+di0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpCisgICAgICBlbWl0KGYsIiVsZCglcykiLHJlYWxfb2Zmc2V0KHApLHJlZ25hbWVzW3NwXSk7CisgICAgZWxzZXsKKyAgICAgIGlmKCF6bWVxdG8obDJ6bSgwTCkscC0+dmFsLnZtYXgpKXtlbWl0dmFsKGYsJnAtPnZhbCxMT05HKTtlbWl0KGYsIisiKTt9CisgICAgICBpZihwLT52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpeworICAgICAgICBlbWl0KGYsIiVzJWxkIixsYWJwcmVmaXgsem0ybChwLT52LT5vZmZzZXQpKTsKKyAgICAgIH1lbHNleworICAgICAgICBlbWl0KGYsIiVzJXMiLGlkcHJlZml4LHAtPnYtPmlkZW50aWZpZXIpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihwLT5mbGFncyZLT05TVCl7CisgICAgZW1pdHZhbChmLCZwLT52YWwsdCZOVSk7CisgIH0KKyAgaWYocC0+ZmxhZ3MmRFJFRk9CSikgZW1pdChmLCIpIik7Cit9CisKKy8qICBUZXN0IGlmIHRoZXJlIGlzIGEgc2VxdWVuY2Ugb2YgRlJFRVJFR3MgY29udGFpbmluZyBGUkVFUkVHIHJlZy4KKyAgICBVc2VkIGJ5IHBlZXBob2xlLiAqLworc3RhdGljIGludCBleGlzdHNfZnJlZXJlZyhzdHJ1Y3QgSUMgKnAsaW50IHJlZykKK3sKKyAgd2hpbGUocCYmKHAtPmNvZGU9PUZSRUVSRUd8fHAtPmNvZGU9PUFMTE9DUkVHKSl7CisgICAgaWYocC0+Y29kZT09RlJFRVJFRyYmcC0+cTEucmVnPT1yZWcpIHJldHVybiAxOworICAgIHA9cC0+bmV4dDsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyogc2VhcmNoIGZvciBwb3NzaWJsZSBhZGRyZXNzaW5nLW1vZGVzICovCitzdGF0aWMgdm9pZCBwZWVwaG9sZShzdHJ1Y3QgSUMgKnApCit7CisgIGludCBjLGMyLHI7c3RydWN0IElDICpwMjtzdHJ1Y3QgQWRkcmVzc2luZ01vZGUgKmFtOworCisgIGZvcig7cDtwPXAtPm5leHQpeworICAgIGM9cC0+Y29kZTsKKyAgICBpZihjIT1GUkVFUkVHJiZjIT1BTExPQ1JFRyYmKGMhPVNFVFJFVFVSTnx8IWlzcmVnKHExKXx8cC0+cTEucmVnIT1wLT56LnJlZykpIGV4aXRfbGFiZWw9MDsKKyAgICBpZihjPT1MQUJFTCkgZXhpdF9sYWJlbD1wLT50eXBmOworCisgICAgLyogVHJ5IGNvbnN0KHJlZykgKi8KKyAgICBpZihJTU1fSU5EJiYoYz09QURESTJQfHxjPT1TVUJJRlApJiZpc3JlZyh6KSYmKHAtPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKyAgICAgIGludCBiYXNlO3ptYXggb2Y7c3RydWN0IG9iaiAqbzsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxwLT50eXBmKTsKKyAgICAgIGlmKGM9PVNVQklGUCkgb2Y9em1zdWIobDJ6bSgwTCksdm1heCk7IGVsc2Ugb2Y9dm1heDsKKyAgICAgIGlmKDEvKnptbGVxKGwyem0oLTMyNzY4TCksdm1heCkmJnptbGVxKHZtYXgsbDJ6bSgzMjc2N0wpKSovKXsKKwlyPXAtPnoucmVnOworCWlmKGlzcmVnKHExKSkgYmFzZT1wLT5xMS5yZWc7IGVsc2UgYmFzZT1yOworCW89MDsKKwlmb3IocDI9cC0+bmV4dDtwMjtwMj1wMi0+bmV4dCl7CisJICBjMj1wMi0+Y29kZTsKKwkgIGlmKGMyPT1DQUxMfHxjMj09TEFCRUx8fChjMj49QkVRJiZjMjw9QlJBKSkgYnJlYWs7CisJICBpZihjMiE9RlJFRVJFRyYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1yKSBicmVhazsKKwkgIGlmKGMyIT1GUkVFUkVHJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMi5yZWc9PXIpIGJyZWFrOworCSAgaWYoYzIhPUNBTEwmJihjMjxMQUJFTHx8YzI+QlJBKS8qJiZjMiE9QUREUkVTUyovKXsKKwkgICAgaWYoIXAyLT5xMS5hbSYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnExLnJlZz09cil7CisJICAgICAgaWYobykgYnJlYWs7CisJICAgICAgbz0mcDItPnExOworCSAgICB9CisJICAgIGlmKCFwMi0+cTIuYW0mJihwMi0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT5xMi5yZWc9PXIpeworCSAgICAgIGlmKG8pIGJyZWFrOworCSAgICAgIG89JnAyLT5xMjsKKwkgICAgfQorCSAgICBpZighcDItPnouYW0mJihwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnoucmVnPT1yKXsKKwkgICAgICBpZihvKSBicmVhazsKKwkgICAgICBvPSZwMi0+ejsKKwkgICAgfQorCSAgfQorCSAgaWYoYzI9PUZSRUVSRUd8fChwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKwkgICAgaW50IG07CisJICAgIGlmKGMyPT1GUkVFUkVHKQorCSAgICAgIG09cDItPnExLnJlZzsKKwkgICAgZWxzZQorCSAgICAgIG09cDItPnoucmVnOworCSAgICBpZihtPT1yKXsKKwkgICAgICBpZihvKXsKKwkJby0+YW09YW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworCQlhbS0+ZmxhZ3M9SU1NX0lORDsKKwkJYW0tPmJhc2U9YmFzZTsKKwkJYW0tPm9mZnNldD16bTJsKG9mKTsKKwkJaWYoaXNyZWcocTEpKXsKKwkJICBwLT5jb2RlPWM9Tk9QO3AtPnExLmZsYWdzPXAtPnEyLmZsYWdzPXAtPnouZmxhZ3M9MDsKKwkJfWVsc2V7CisJCSAgcC0+Y29kZT1jPUFTU0lHTjtwLT5xMi5mbGFncz0wOworCQkgIHAtPnR5cGY9cC0+dHlwZjI7cC0+cTIudmFsLnZtYXg9c2l6ZXRhYltwLT50eXBmMiZOUV07CisJCX0KKwkgICAgICB9CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgICAgaWYoYzIhPUZSRUVSRUcmJm09PWJhc2UpIGJyZWFrOworCSAgICBjb250aW51ZTsKKwkgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvKiBUcnkgcmVnLHJlZyAqLworICAgIGlmKEdQUl9JTkQmJmM9PUFEREkyUCYmaXNyZWcocTIpJiZpc3JlZyh6KSYmKGlzcmVnKHExKXx8cC0+cTIucmVnIT1wLT56LnJlZykpeworICAgICAgaW50IGJhc2UsaWR4O3N0cnVjdCBvYmogKm87CisgICAgICByPXAtPnoucmVnO2lkeD1wLT5xMi5yZWc7CisgICAgICBpZihpc3JlZyhxMSkpIGJhc2U9cC0+cTEucmVnOyBlbHNlIGJhc2U9cjsKKyAgICAgIG89MDsKKyAgICAgIGZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKyAgICAgICAgYzI9cDItPmNvZGU7CisgICAgICAgIGlmKGMyPT1DQUxMfHxjMj09TEFCRUx8fChjMj49QkVRJiZjMjw9QlJBKSkgYnJlYWs7CisgICAgICAgIGlmKGMyIT1GUkVFUkVHJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMS5yZWc9PXIpIGJyZWFrOworICAgICAgICBpZihjMiE9RlJFRVJFRyYmKHAyLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTIucmVnPT1yKSBicmVhazsKKyAgICAgICAgaWYoKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT56LnJlZz09aWR4JiZpZHghPXIpIGJyZWFrOworCQorICAgICAgICBpZihjMiE9Q0FMTCYmKGMyPExBQkVMfHxjMj5CUkEpLyomJmMyIT1BRERSRVNTKi8peworICAgICAgICAgIGlmKCFwMi0+cTEuYW0mJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT5xMS5yZWc9PXIpeworICAgICAgICAgICAgaWYob3x8KHExdHlwKHAyKSZOUSk9PUxMT05HKSBicmVhazsKKyAgICAgICAgICAgIG89JnAyLT5xMTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYoIXAyLT5xMi5hbSYmKHAyLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnEyLnJlZz09cil7CisgICAgICAgICAgICBpZihvfHwocTJ0eXAocDIpJk5RKT09TExPTkcpIGJyZWFrOworICAgICAgICAgICAgbz0mcDItPnEyOworICAgICAgICAgIH0KKyAgICAgICAgICBpZighcDItPnouYW0mJihwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnoucmVnPT1yKXsKKyAgICAgICAgICAgIGlmKG98fCh6dHlwKHAyKSZOUSk9PUxMT05HKSBicmVhazsKKyAgICAgICAgICAgIG89JnAyLT56OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihjMj09RlJFRVJFR3x8KHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpeworICAgICAgICAgIGludCBtOworICAgICAgICAgIGlmKGMyPT1GUkVFUkVHKQorICAgICAgICAgICAgbT1wMi0+cTEucmVnOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG09cDItPnoucmVnOworICAgICAgICAgIGlmKG09PXIpeworICAgICAgICAgICAgaWYobyl7CisgICAgICAgICAgICAgIG8tPmFtPWFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKKyAgICAgICAgICAgICAgYW0tPmZsYWdzPUdQUl9JTkQ7CisgICAgICAgICAgICAgIGFtLT5iYXNlPWJhc2U7CisgICAgICAgICAgICAgIGFtLT5vZmZzZXQ9aWR4OworCSAgICAgIGlmKGlzcmVnKHExKSl7CisJCXAtPmNvZGU9Yz1OT1A7cC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworCSAgICAgIH1lbHNleworCQlwLT5jb2RlPWM9QVNTSUdOO3AtPnEyLmZsYWdzPTA7CisJCXAtPnR5cGY9cC0+dHlwZjI7cC0+cTIudmFsLnZtYXg9c2l6ZXRhYltwLT50eXBmMiZOUV07CisJICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKGMyIT1GUkVFUkVHJiZtPT1iYXNlKSBicmVhazsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKiBnZW5lcmF0ZXMgdGhlIGZ1bmN0aW9uIGVudHJ5IGNvZGUgKi8KK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX3RvcChGSUxFICpmLHN0cnVjdCBWYXIgKnYsbG9uZyBvZmZzZXQpCit7CisgIHJzYXZlc2l6ZT0wOworICBpZighc3BlY2lhbF9zZWN0aW9uKGYsdikmJnNlY3Rpb24hPUNPREUpe2VtaXQoZixjb2RlbmFtZSk7aWYoZikgc2VjdGlvbj1DT0RFO30gCisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisgICAgaWYoKHYtPmZsYWdzJihJTkxJTkVGVU5DfElOTElORUVYVCkpIT1JTkxJTkVGVU5DKQorICAgICAgZW1pdChmLCJcdC5nbG9iYWxcdCVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgZW1pdChmLCIlcyVzOlxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgfWVsc2UKKyAgICBlbWl0KGYsIiVzJWxkOlxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKK30KKy8qIGdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gZXhpdCBjb2RlICovCitzdGF0aWMgdm9pZCBmdW5jdGlvbl9ib3R0b20oRklMRSAqZixzdHJ1Y3QgVmFyICp2LGxvbmcgb2Zmc2V0KQoreworICBlbWl0KGYscmV0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgRW5kIG9mIHByaXZhdGUgZGF0YSBhbmQgZnVuY3Rpb25zLiAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAgRG9lcyBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb25zIGZvciB0aGUgY29kZS1nZW5lcmF0b3IuIEdldHMgY2FsbGVkICAqLworLyogIG9uY2UgYXQgdGhlIGJlZ2lubmluZyBhbmQgc2hvdWxkIHJldHVybiAwIGluIGNhc2Ugb2YgcHJvYmxlbXMuICAgICAgKi8KK2ludCBpbml0X2NnKHZvaWQpCit7CisgIGludCBpOworICAvKiAgSW5pdGlhbGl6ZSBzb21lIHZhbHVlcyB3aGljaCBjYW5ub3QgYmUgc3RhdGljYWxseSBpbml0aWFsaXplZCAgICovCisgIC8qICBiZWNhdXNlIHRoZXkgYXJlIHN0b3JlZCBpbiB0aGUgdGFyZ2V0J3MgYXJpdGhtZXRpYy4gICAgICAgICAgICAgKi8KKyAgbWF4YWxpZ249bDJ6bSg4TCk7CisgIGNoYXJfYml0PWwyem0oOEwpOworCisgIGZvcihpPTA7aTw9TUFYX1RZUEU7aSsrKXsKKyAgICBzaXpldGFiW2ldPWwyem0obXNpemV0YWJbaV0pOworICAgIGFsaWduW2ldPWwyem0obWFsaWduW2ldKTsKKyAgfQorCisgIHJlZ25hbWVzWzBdPSJub3JlZyI7CisgIGZvcihpPUZJUlNUX0dQUjtpPD1MQVNUX0dQUjtpKyspeworICAgIHJlZ25hbWVzW2ldPW15bWFsbG9jKDEwKTsKKyAgICBzcHJpbnRmKHJlZ25hbWVzW2ldLCJncHIlZCIsaS1GSVJTVF9HUFIpOworICAgIHJlZ3NpemVbaV09bDJ6bSg0TCk7CisgICAgcmVndHlwZVtpXT0mbHR5cDsKKyAgfQorICBmb3IoaT1GSVJTVF9GUFI7aTw9TEFTVF9GUFI7aSsrKXsKKyAgICByZWduYW1lc1tpXT1teW1hbGxvYygxMCk7CisgICAgc3ByaW50ZihyZWduYW1lc1tpXSwiZnByJWQiLGktRklSU1RfRlBSKTsKKyAgICByZWdzaXplW2ldPWwyem0oOEwpOworICAgIHJlZ3R5cGVbaV09JmxkYmw7CisgIH0KKyAgZm9yKGk9RklSU1RfQ0NSO2k8PUxBU1RfQ0NSO2krKyl7CisgICAgcmVnbmFtZXNbaV09bXltYWxsb2MoMTApOworICAgIHNwcmludGYocmVnbmFtZXNbaV0sImNjciVkIixpLUZJUlNUX0NDUik7CisgICAgcmVnc2l6ZVtpXT1sMnptKDFMKTsKKyAgICByZWd0eXBlW2ldPSZsY2hhcjsKKyAgfQorCisgIC8qICBVc2UgbXVsdGlwbGUgY2NzLiAgICovCisgIG11bHRpcGxlX2Njcz0wOworCisgIC8qICBJbml0aWFsaXplIHRoZSBtaW4vbWF4LXNldHRpbmdzLiBOb3RlIHRoYXQgdGhlIHR5cGVzIG9mIHRoZSAgICAgKi8KKyAgLyogIGhvc3Qgc3lzdGVtIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgdGFyZ2V0IHN5c3RlbSBhbmQgeW91IG1heSAqLworICAvKiAgb25seSB1c2UgdGhlIHNtYWxsZXN0IG1heGltdW0gdmFsdWVzIEFOU0kgZ3VhcmFudGVlcyBpZiB5b3UgICAgICovCisgIC8qICB3YW50IHRvIGJlIHBvcnRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIFRoYXQncyB0aGUgcmVhc29uIGZvciB0aGUgc3VidHJhY3Rpb24gaW4gdF9taW5bSU5UXS4gTG9uZyBjb3VsZCAqLworICAvKiAgYmUgdW5hYmxlIHRvIHJlcHJlc2VudCAtMjE0NzQ4MzY0OCBvbiB0aGUgaG9zdCBzeXN0ZW0uICAgICAgICAgICovCisgIHRfbWluW0NIQVJdPWwyem0oLTEyOEwpOworICB0X21pbltTSE9SVF09bDJ6bSgtMzI3NjhMKTsKKyAgdF9taW5bSU5UXT16bXN1YihsMnptKC0yMTQ3NDgzNjQ3TCksbDJ6bSgxTCkpOworICB0X21pbltMT05HXT10X21pbihJTlQpOworICB0X21pbltMTE9OR109em1sc2hpZnQobDJ6bSgxTCksbDJ6bSg2M0wpKTsKKyAgdF9taW5bTUFYSU5UXT10X21pbihMTE9ORyk7CisgIHRfbWF4W0NIQVJdPXVsMnp1bSgxMjdMKTsKKyAgdF9tYXhbU0hPUlRdPXVsMnp1bSgzMjc2N1VMKTsKKyAgdF9tYXhbSU5UXT11bDJ6dW0oMjE0NzQ4MzY0N1VMKTsKKyAgdF9tYXhbTE9OR109dF9tYXgoSU5UKTsKKyAgdF9tYXhbTExPTkddPXp1bXJzaGlmdCh6dW1rb21wbCh1bDJ6dW0oMFVMKSksdWwyenVtKDFVTCkpOworICB0X21heFtNQVhJTlRdPXRfbWF4KExMT05HKTsKKyAgdHVfbWF4W0NIQVJdPXVsMnp1bSgyNTVVTCk7CisgIHR1X21heFtTSE9SVF09dWwyenVtKDY1NTM1VUwpOworICB0dV9tYXhbSU5UXT11bDJ6dW0oNDI5NDk2NzI5NVVMKTsKKyAgdHVfbWF4W0xPTkddPXRfbWF4KFVOU0lHTkVEfElOVCk7CisgIHR1X21heFtMTE9OR109enVta29tcGwodWwyenVtKDBVTCkpOworICB0dV9tYXhbTUFYSU5UXT10X21heChVTlNJR05FRHxMTE9ORyk7CisgIAorICAvKiAgUmVzZXJ2ZSBhIGZldyByZWdpc3RlcnMgZm9yIHVzZSBieSB0aGUgY29kZS1nZW5lcmF0b3IuICAgICAgKi8KKyAgLyogIFRoaXMgaXMgbm90IG9wdGltYWwgYnV0IHNpbXBsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHNwPUZJUlNUX0dQUjsKKyAgdDE9RklSU1RfR1BSKzE7CisgIHQyPUZJUlNUX0dQUisyOworICBmMT1GSVJTVF9GUFI7CisgIGYyPUZJUlNUX0ZQUisxOworICByZWdzYVt0MV09cmVnc2FbdDJdPTE7CisgIHJlZ3NhW2YxXT1yZWdzYVtmMl09MTsKKyAgcmVnc2Fbc3BdPTE7CisgIHJlZ3NjcmF0Y2hbdDFdPXJlZ3NjcmF0Y2hbdDJdPTA7CisgIHJlZ3NjcmF0Y2hbZjFdPXJlZ3NjcmF0Y2hbZjJdPTA7CisgIHJlZ3NjcmF0Y2hbc3BdPTA7CisKKyAgZm9yKGk9RklSU1RfR1BSO2k8PUxBU1RfR1BSLVZPTF9HUFJTO2krKykKKyAgICByZWdzY3JhdGNoW2ldPTE7CisgIGZvcihpPUZJUlNUX0ZQUjtpPD1MQVNUX0ZQUi1WT0xfRlBSUztpKyspCisgICAgcmVnc2NyYXRjaFtpXT0xOworICBmb3IoaT1GSVJTVF9DQ1I7aTw9TEFTVF9DQ1ItVk9MX0NDUlM7aSsrKQorICAgIHJlZ3NjcmF0Y2hbaV09MTsKKworICB0YXJnZXRfbWFjcm9zPW1hcnJheTsKKworCisgIHJldHVybiAxOworfQorCit2b2lkIGluaXRfZGIoRklMRSAqZikKK3sKK30KKworaW50IGZyZXR1cm4oc3RydWN0IFR5cCAqdCkKKy8qICBSZXR1cm5zIHRoZSByZWdpc3RlciBpbiB3aGljaCB2YXJpYWJsZXMgb2YgdHlwZSB0IGFyZSByZXR1cm5lZC4gKi8KKy8qICBJZiB0aGUgdmFsdWUgY2Fubm90IGJlIHJldHVybmVkIGluIGEgcmVnaXN0ZXIgcmV0dXJucyAwLiAgICAgICAgKi8KKy8qICBBIHBvaW50ZXIgTVVTVCBiZSByZXR1cm5lZCBpbiBhIHJlZ2lzdGVyLiBUaGUgY29kZS1nZW5lcmF0b3IgICAgKi8KKy8qICBoYXMgdG8gc2ltdWxhdGUgYSBwc2V1ZG8gcmVnaXN0ZXIgaWYgbmVjZXNzYXJ5LiAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYoSVNGTE9BVCh0LT5mbGFncykpIAorICAgIHJldHVybiBGSVJTVF9GUFIrMjsKKyAgaWYoSVNTVFJVQ1QodC0+ZmxhZ3MpfHxJU1VOSU9OKHQtPmZsYWdzKSkgCisgICAgcmV0dXJuIDA7CisgIGlmKHptbGVxKHN6b2YodCksbDJ6bSg0TCkpKSAKKyAgICByZXR1cm4gRklSU1RfR1BSKzM7CisgIGVsc2UKKyAgICByZXR1cm4gMDsKK30KKworaW50IHJlZ19wYWlyKGludCByLHN0cnVjdCBycGFpciAqcCkKKy8qIFJldHVybnMgMCBpZiB0aGUgcmVnaXN0ZXIgaXMgbm8gcmVnaXN0ZXIgcGFpci4gSWYgciAgKi8KKy8qIGlzIGEgcmVnaXN0ZXIgcGFpciBub24temVybyB3aWxsIGJlIHJldHVybmVkIGFuZCB0aGUgKi8KKy8qIHN0cnVjdHVyZSBwb2ludGVkIHRvIHAgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgdHdvICAgKi8KKy8qIGVsZW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qIGVzdGltYXRlIHRoZSBjb3N0LXNhdmluZyBpZiBvYmplY3QgbyBmcm9tIElDIHAgaXMgcGxhY2VkIGluCisgICByZWdpc3RlciByICovCitpbnQgY29zdF9zYXZpbmdzKHN0cnVjdCBJQyAqcCxpbnQgcixzdHJ1Y3Qgb2JqICpvKQoreworICBpbnQgYz1wLT5jb2RlOworICBpZihvLT5mbGFncyZWS09OU1QpeworICAgIGlmKCFMT0FEX1NUT1JFKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYobz09JnAtPnExJiZwLT5jb2RlPT1BU1NJR04mJihwLT56LmZsYWdzJkRSRUZPQkopKQorICAgICAgcmV0dXJuIDQ7CisgICAgZWxzZQorICAgICAgcmV0dXJuIDI7CisgIH0KKyAgaWYoby0+ZmxhZ3MmRFJFRk9CSikKKyAgICByZXR1cm4gNDsKKyAgaWYoYz09U0VUUkVUVVJOJiZyPT1wLT56LnJlZyYmIShvLT5mbGFncyZEUkVGT0JKKSkgcmV0dXJuIDM7CisgIGlmKGM9PUdFVFJFVFVSTiYmcj09cC0+cTEucmVnJiYhKG8tPmZsYWdzJkRSRUZPQkopKSByZXR1cm4gMzsKKyAgcmV0dXJuIDI7Cit9CisKK2ludCByZWdvayhpbnQgcixpbnQgdCxpbnQgbW9kZSkKKy8qICBSZXR1cm5zIDAgaWYgcmVnaXN0ZXIgciBjYW5ub3Qgc3RvcmUgdmFyaWFibGVzIG9mICAgKi8KKy8qICB0eXBlIHQuIElmIHQ9PVBPSU5URVIgYW5kIG1vZGUhPTAgdGhlbiBpdCByZXR1cm5zICAgKi8KKy8qICBub24temVybyBvbmx5IGlmIHRoZSByZWdpc3RlciBjYW4gc3RvcmUgYSBwb2ludGVyICAgKi8KKy8qICBhbmQgZGVyZWZlcmVuY2UgYSBwb2ludGVyIHRvIG1vZGUuICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYocj09MCkKKyAgICByZXR1cm4gMDsKKyAgdCY9TlE7CisgIGlmKHQ9PTAmJnI+PUZJUlNUX0NDUiYmcjw9TEFTVF9DQ1IpCisgICAgcmV0dXJuIDE7CisgIGlmKElTRkxPQVQodCkmJnI+PUZJUlNUX0ZQUiYmcjw9TEFTVF9GUFIpCisgICAgcmV0dXJuIDE7CisgIGlmKHQ9PVBPSU5URVImJnI+PUZJUlNUX0dQUiYmcjw9TEFTVF9HUFIpCisgICAgcmV0dXJuIDE7CisgIGlmKHQ+PUNIQVImJnQ8PUxPTkcmJnI+PUZJUlNUX0dQUiYmcjw9TEFTVF9HUFIpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitpbnQgZGFuZ2Vyb3VzX0lDKHN0cnVjdCBJQyAqcCkKKy8qICBSZXR1cm5zIHplcm8gaWYgdGhlIElDIHAgY2FuIGJlIHNhZmVseSBleGVjdXRlZCAgICAgKi8KKy8qICB3aXRob3V0IGRhbmdlciBvZiBleGNlcHRpb25zIG9yIHNpbWlsYXIgdGhpbmdzLiAgICAgKi8KKy8qICB2YmNjIG1heSBnZW5lcmF0ZSBjb2RlIGluIHdoaWNoIG5vbi1kYW5nZXJvdXMgSUNzICAgKi8KKy8qICBhcmUgc29tZXRpbWVzIGV4ZWN1dGVkIGFsdGhvdWdoIGNvbnRyb2wtZmxvdyBtYXkgICAgKi8KKy8qICBuZXZlciByZWFjaCB0aGVtIChtYWlubHkgd2hlbiBtb3ZpbmcgY29tcHV0YXRpb25zICAgKi8KKy8qICBvdXQgb2YgbG9vcHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUeXBpY2FsIElDcyB0aGF0IGdlbmVyYXRlIGV4Y2VwdGlvbnMgb24gc29tZSAgICAgICAgKi8KKy8qICBtYWNoaW5lcyBhcmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBhY2Nlc3NlcyB2aWEgcG9pbnRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBkaXZpc2lvbi9tb2R1bG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSBvdmVyZmxvdyBvbiBzaWduZWQgaW50ZWdlci9mbG9hdHMgICAgICAgICAgICAgKi8KK3sKKyAgaW50IGM9cC0+Y29kZTsKKyAgaWYoKHAtPnExLmZsYWdzJkRSRUZPQkopfHwocC0+cTIuZmxhZ3MmRFJFRk9CSil8fChwLT56LmZsYWdzJkRSRUZPQkopKQorICAgIHJldHVybiAxOworICBpZigoYz09RElWfHxjPT1NT0QpJiYhaXNjb25zdChxMikpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitpbnQgbXVzdF9jb252ZXJ0KGludCBvLGludCB0LGludCBjb25zdF9leHByKQorLyogIFJldHVybnMgemVybyBpZiBjb2RlIGZvciBjb252ZXJ0aW5nIG5wIHRvIHR5cGUgdCAgICAqLworLyogIGNhbiBiZSBvbWl0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE9uIHRoZSBQb3dlclBDIGNwdSBwb2ludGVycyBhbmQgMzJiaXQgICAgICAgICAgICAgICAqLworLyogIGludGVnZXJzIGhhdmUgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24gYW5kIGNhbiB1c2UgICAqLworLyogIHRoZSBzYW1lIHJlZ2lzdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgb3A9byZOUSx0cD10Jk5ROworICBpZigob3A9PUlOVHx8b3A9PUxPTkd8fG9wPT1QT0lOVEVSKSYmKHRwPT1JTlR8fHRwPT1MT05HfHx0cD09UE9JTlRFUikpCisgICAgcmV0dXJuIDA7CisgIGlmKG9wPT1ET1VCTEUmJnRwPT1MRE9VQkxFKSByZXR1cm4gMDsKKyAgaWYob3A9PUxET1VCTEUmJnRwPT1ET1VCTEUpIHJldHVybiAwOworICByZXR1cm4gMTsKK30KKwordm9pZCBnZW5fZHMoRklMRSAqZix6bWF4IHNpemUsc3RydWN0IFR5cCAqdCkKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjcmVhdGUgPHNpemU+IGJ5dGVzIG9mIHN0b3JhZ2UgKi8KKy8qICBpbml0aWFsaXplZCB3aXRoIHplcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYobmV3b2JqJiZzZWN0aW9uIT1TUEVDSUFMKQorICAgIGVtaXQoZiwiJWxkXG4iLHptMmwoc2l6ZSkpOworICBlbHNlCisgICAgZW1pdChmLCJcdC5zcGFjZVx0JWxkXG4iLHptMmwoc2l6ZSkpOworICBuZXdvYmo9MDsKK30KKwordm9pZCBnZW5fYWxpZ24oRklMRSAqZix6bWF4IGFsaWduKQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIG1ha2Ugc3VyZSB0aGUgbmV4dCBkYXRhIGlzICAgICAqLworLyogIGFsaWduZWQgdG8gbXVsdGlwbGVzIG9mIDxhbGlnbj4gYnl0ZXMuICAgICAgICAgICAgICAqLworeworICBpZih6bTJsKGFsaWduKT4xKSBlbWl0KGYsIlx0LmFsaWduXHQyXG4iKTsKK30KKwordm9pZCBnZW5fdmFyX2hlYWQoRklMRSAqZixzdHJ1Y3QgVmFyICp2KQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSB0aGUgaGVhZCBvZiBhIHZhcmlhYmxlICAqLworLyogIGRlZmluaXRpb24sIGkuZS4gdGhlIGxhYmVsIGFuZCBpbmZvcm1hdGlvbiBmb3IgICAgICAqLworLyogIGxpbmthZ2UgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgY29uc3RmbGFnO2NoYXIgKnNlYzsKKyAgaWYodi0+Y2xpc3QpIGNvbnN0ZmxhZz1pc19jb25zdCh2LT52dHlwKTsKKyAgaWYodi0+c3RvcmFnZV9jbGFzcz09U1RBVElDKXsKKyAgICBpZihJU0ZVTkModi0+dnR5cC0+ZmxhZ3MpKSByZXR1cm47CisgICAgaWYoIXNwZWNpYWxfc2VjdGlvbihmLHYpKXsKKyAgICAgIGlmKHYtPmNsaXN0JiYoIWNvbnN0ZmxhZ3x8KGdfZmxhZ3NbMl0mVVNFREZMQUcpKSYmc2VjdGlvbiE9REFUQSl7ZW1pdChmLGRhdGFuYW1lKTtpZihmKSBzZWN0aW9uPURBVEE7fQorICAgICAgaWYodi0+Y2xpc3QmJmNvbnN0ZmxhZyYmIShnX2ZsYWdzWzJdJlVTRURGTEFHKSYmc2VjdGlvbiE9Uk9EQVRBKXtlbWl0KGYscm9kYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1ST0RBVEE7fQorICAgICAgaWYoIXYtPmNsaXN0JiZzZWN0aW9uIT1CU1Mpe2VtaXQoZixic3NuYW1lKTtpZihmKSBzZWN0aW9uPUJTUzt9CisgICAgfQorICAgIGlmKHYtPmNsaXN0fHxzZWN0aW9uPT1TUEVDSUFMKXsKKyAgICAgIGdlbl9hbGlnbihmLGZhbGlnbih2LT52dHlwKSk7CisgICAgICBlbWl0KGYsIiVzJWxkOlxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKyAgICB9ZWxzZQorICAgICAgZW1pdChmLCJcdC5sY29tbVx0JXMlbGQsIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKyAgICBuZXdvYmo9MTsKKyAgfQorICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4peworICAgIGVtaXQoZiwiXHQuZ2xvYmxcdCVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgaWYodi0+ZmxhZ3MmKERFRklORUR8VEVOVEFUSVZFKSl7CisgICAgICBpZighc3BlY2lhbF9zZWN0aW9uKGYsdikpeworCWlmKHYtPmNsaXN0JiYoIWNvbnN0ZmxhZ3x8KGdfZmxhZ3NbMl0mVVNFREZMQUcpKSYmc2VjdGlvbiE9REFUQSl7ZW1pdChmLGRhdGFuYW1lKTtpZihmKSBzZWN0aW9uPURBVEE7fQorCWlmKHYtPmNsaXN0JiZjb25zdGZsYWcmJiEoZ19mbGFnc1syXSZVU0VERkxBRykmJnNlY3Rpb24hPVJPREFUQSl7ZW1pdChmLHJvZGF0YW5hbWUpO2lmKGYpIHNlY3Rpb249Uk9EQVRBO30KKwlpZighdi0+Y2xpc3QmJnNlY3Rpb24hPUJTUyl7ZW1pdChmLGJzc25hbWUpO2lmKGYpIHNlY3Rpb249QlNTO30KKyAgICAgIH0KKyAgICAgIGlmKHYtPmNsaXN0fHxzZWN0aW9uPT1TUEVDSUFMKXsKKwlnZW5fYWxpZ24oZixmYWxpZ24odi0+dnR5cCkpOworICAgICAgICBlbWl0KGYsIiVzJXM6XG4iLGlkcHJlZml4LHYtPmlkZW50aWZpZXIpOworICAgICAgfWVsc2UKKyAgICAgICAgZW1pdChmLCJcdC5nbG9iYWxcdCVzJXNcblx0LiVzY29tbVx0JXMlcywiLGlkcHJlZml4LHYtPmlkZW50aWZpZXIsKFVTRV9DT01NT05TPyIiOiJsIiksaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgICBuZXdvYmo9MTsKKyAgICB9CisgIH0KK30KKwordm9pZCBnZW5fZGMoRklMRSAqZixpbnQgdCxzdHJ1Y3QgY29uc3RfbGlzdCAqcCkKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjcmVhdGUgc3RhdGljIHN0b3JhZ2UgICAgICAgICAgKi8KKy8qICBpbml0aWFsaXplZCB3aXRoIGNvbnN0LWxpc3QgcC4gICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgZW1pdChmLCJcdGRjLiVzXHQiLGR0KHQmTlEpKTsKKyAgaWYoIXAtPnRyZWUpeworICAgIGlmKElTRkxPQVQodCkpeworICAgICAgLyogIGF1Y2ggd2llZGVyIG5pY2h0IHNlaHIgc2Nob2VuIHVuZCBJRUVFIG5vZXRpZyAgICovCisgICAgICB1bnNpZ25lZCBjaGFyICppcDsKKyAgICAgIGlwPSh1bnNpZ25lZCBjaGFyICopJnAtPnZhbC52ZG91YmxlOworICAgICAgZW1pdChmLCIweCUwMnglMDJ4JTAyeCUwMngiLGlwWzBdLGlwWzFdLGlwWzJdLGlwWzNdKTsKKyAgICAgIGlmKCh0Jk5RKSE9RkxPQVQpeworCWVtaXQoZiwiLDB4JTAyeCUwMnglMDJ4JTAyeCIsaXBbNF0saXBbNV0saXBbNl0saXBbN10pOworICAgICAgfQorICAgIH1lbHNleworICAgICAgZW1pdHZhbChmLCZwLT52YWwsdCZOVSk7CisgICAgfQorICB9ZWxzZXsKKyAgICBlbWl0X29iaihmLCZwLT50cmVlLT5vLHQmTlUpOworICB9CisgIGVtaXQoZiwiXG4iKTtuZXdvYmo9MDsKK30KKworCisvKiAgVGhlIG1haW4gY29kZS1nZW5lcmF0aW9uIHJvdXRpbmUuICAgICAgICAgICAgICAgICAgICovCisvKiAgZiBpcyB0aGUgc3RyZWFtIHRoZSBjb2RlIHNob3VsZCBiZSB3cml0dGVuIHRvLiAgICAgICovCisvKiAgcCBpcyBhIHBvaW50ZXIgdG8gYSBkb3VibHkgbGlua2VkIGxpc3Qgb2YgSUNzICAgICAgICovCisvKiAgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gYm9keSB0byBnZW5lcmF0ZSBjb2RlIGZvci4gICovCisvKiAgdiBpcyBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb2Zmc2V0IGlzIHRoZSBzaXplIG9mIHRoZSBzdGFja2ZyYW1lIHRoZSBmdW5jdGlvbiAgICovCisvKiAgbmVlZHMgZm9yIGxvY2FsIHZhcmlhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3ZvaWQgZ2VuX2NvZGUoRklMRSAqZixzdHJ1Y3QgSUMgKnAsc3RydWN0IFZhciAqdix6bWF4IG9mZnNldCkKKy8qICBUaGUgbWFpbiBjb2RlLWdlbmVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBjLHQsaTsKKyAgc3RydWN0IElDICptOworICBhcmdzaXplPTA7CisgIGlmKERFQlVHJjEpIHByaW50ZigiZ2VuX2NvZGUoKVxuIik7CisgIGZvcihjPTE7Yzw9TUFYUjtjKyspIHJlZ3NbY109cmVnc2FbY107CisgIG1heHB1c2hlZD0wOworCisgIC8qRklYTUUqLworICByZXQ9Ilx0cnRzXG4iOworCisgIGZvcihtPXA7bTttPW0tPm5leHQpeworICAgIGM9bS0+Y29kZTt0PW0tPnR5cGYmTlU7CisgICAgaWYoYz09QUxMT0NSRUcpIHtyZWdzW20tPnExLnJlZ109MTtjb250aW51ZTt9CisgICAgaWYoYz09RlJFRVJFRykge3JlZ3NbbS0+cTEucmVnXT0wO2NvbnRpbnVlO30KKworICAgIC8qIGNvbnZlcnQgTVVMVC9ESVYvTU9EIHdpdGggcG93ZXJzIG9mIHR3byAqLworICAgIGlmKCh0Jk5RKTw9TE9ORyYmKG0tPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUJiYodCZOUSk8PUxPTkcmJihjPT1NVUxUfHwoKGM9PURJVnx8Yz09TU9EKSYmKHQmVU5TSUdORUQpKSkpeworICAgICAgZXZhbF9jb25zdCgmbS0+cTIudmFsLHQpOworICAgICAgaT1wb2YyKHZtYXgpOworICAgICAgaWYoaSl7CisgICAgICAgIGlmKGM9PU1PRCl7CisgICAgICAgICAgdm1heD16bXN1Yih2bWF4LGwyem0oMUwpKTsKKyAgICAgICAgICBtLT5jb2RlPUFORDsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgdm1heD1sMnptKGktMSk7CisgICAgICAgICAgaWYoYz09RElWKSBtLT5jb2RlPVJTSElGVDsgZWxzZSBtLT5jb2RlPUxTSElGVDsKKyAgICAgICAgfQorICAgICAgICBjPW0tPmNvZGU7CisJZ3ZhbC52bWF4PXZtYXg7CisJZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworCWlmKGM9PUFORCl7CisJICBpbnNlcnRfY29uc3QoJm0tPnEyLnZhbCx0KTsKKwl9ZWxzZXsKKwkgIGluc2VydF9jb25zdCgmbS0+cTIudmFsLElOVCk7CisJICBwLT50eXBmMj1JTlQ7CisJfQorICAgICAgfQorICAgIH0KKyNpZiBGSVhFRF9TUAorICAgIGlmKGM9PUNBTEwmJmFyZ3NpemU8em0ybChtLT5xMi52YWwudm1heCkpIGFyZ3NpemU9em0ybChtLT5xMi52YWwudm1heCk7CisjZW5kaWYKKyAgfQorICBwZWVwaG9sZShwKTsKKworICBmb3IoYz0xO2M8PU1BWFI7YysrKXsKKyAgICBpZihyZWdzYVtjXXx8cmVndXNlZFtjXSl7CisgICAgICBCU0VUKHJlZ3NfbW9kaWZpZWQsYyk7CisgICAgfQorICB9CisKKyAgbG9jYWxzaXplPSh6bTJsKG9mZnNldCkrMykvNCo0OworI2lmIEZJWEVEX1NQCisgIC8qRklYTUU6IGFkanVzdCBsb2NhbHNpemUgdG8gZ2V0IGFuIGFsaWduZWQgc3RhY2stZnJhbWUgKi8KKyNlbmRpZgorCisgIGZ1bmN0aW9uX3RvcChmLHYsbG9jYWxzaXplKTsKKyAgcHVzaGVkPTA7CisKKyAgZm9yKDtwO3A9cC0+bmV4dCl7CisgICAgYz1wLT5jb2RlO3Q9cC0+dHlwZjsKKyAgICBpZihjPT1OT1ApIHtwLT56LmZsYWdzPTA7Y29udGludWU7fQorICAgIGlmKGM9PUFMTE9DUkVHKSB7cmVnc1twLT5xMS5yZWddPTE7Y29udGludWU7fQorICAgIGlmKGM9PUZSRUVSRUcpIHtyZWdzW3AtPnExLnJlZ109MDtjb250aW51ZTt9CisgICAgaWYoYz09TEFCRUwpIHtlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCx0KTtjb250aW51ZTt9CisgICAgaWYoYz09QlJBKXsKKyAgICAgIGlmKHQ9PWV4aXRfbGFiZWwmJmZyYW1lc2l6ZT09MCkKKwllbWl0KGYscmV0KTsKKyAgICAgIGVsc2UKKwllbWl0KGYsIlx0Ylx0JXMlZFxuIixsYWJwcmVmaXgsdCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz49QkVRJiZjPEJSQSl7CisgICAgICBlbWl0KGYsIlx0YiVzXHQiLGNjc1tjLUJFUV0pOworICAgICAgaWYoaXNyZWcocTEpKXsKKwllbWl0X29iaihmLCZwLT5xMSwwKTsKKwllbWl0KGYsIiwiKTsKKyAgICAgIH0KKyAgICAgIGVtaXQoZiwiJXMlZFxuIixsYWJwcmVmaXgsdCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09TU9WRVRPUkVHKXsKKyAgICAgIGxvYWRfcmVnKGYscC0+ei5yZWcsJnAtPnExLHJlZ3R5cGVbcC0+ei5yZWddLT5mbGFncyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09TU9WRUZST01SRUcpeworICAgICAgc3RvcmVfcmVnKGYscC0+ei5yZWcsJnAtPnExLHJlZ3R5cGVbcC0+ei5yZWddLT5mbGFncyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoKGM9PUFTU0lHTnx8Yz09UFVTSCkmJigodCZOUSk+UE9JTlRFUnx8KCh0Jk5RKT09Q0hBUiYmem0ybChwLT5xMi52YWwudm1heCkhPTEpKSl7CisgICAgICBpZXJyb3IoMCk7CisgICAgfQorICAgIHA9cHJlbG9hZChmLHApOworICAgIGM9cC0+Y29kZTsKKyAgICBpZihjPT1TVUJQRlApIGM9U1VCOworICAgIGlmKGM9PUFEREkyUCkgYz1BREQ7CisgICAgaWYoYz09U1VCSUZQKSBjPVNVQjsKKyAgICBpZihjPT1DT05WRVJUKXsKKyAgICAgIGlmKElTRkxPQVQocTF0eXAocCkpfHxJU0ZMT0FUKHp0eXAocCkpKSBpZXJyb3IoMCk7CisgICAgICBpZihzaXpldGFiW3ExdHlwKHApJk5RXTxzaXpldGFiW3p0eXAocCkmTlFdKXsKKwlpZihxMXR5cChwKSZVTlNJR05FRCkKKwkgIGVtaXQoZiwiXHR6ZXh0LiVzXHQlc1xuIixkdChxMXR5cChwKSkscmVnbmFtZXNbenJlZ10pOworCWVsc2UKKwkgIGVtaXQoZiwiXHRzZXh0LiVzXHQlc1xuIixkdChxMXR5cChwKSkscmVnbmFtZXNbenJlZ10pOworICAgICAgfQorICAgICAgc2F2ZV9yZXN1bHQoZixwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1LT01QTEVNRU5UKXsKKyAgICAgIGxvYWRfcmVnKGYsenJlZywmcC0+cTEsdCk7CisgICAgICBlbWl0KGYsIlx0Y3BsLiVzXHQlc1xuIixkdCh0KSxyZWduYW1lc1t6cmVnXSk7CisgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PVNFVFJFVFVSTil7CisgICAgICBsb2FkX3JlZyhmLHAtPnoucmVnLCZwLT5xMSx0KTsKKyAgICAgIEJTRVQocmVnc19tb2RpZmllZCxwLT56LnJlZyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09R0VUUkVUVVJOKXsKKyAgICAgIGlmKHAtPnExLnJlZyl7CisgICAgICAgIHpyZWc9cC0+cTEucmVnOworCXNhdmVfcmVzdWx0KGYscCk7CisgICAgICB9ZWxzZQorICAgICAgICBwLT56LmZsYWdzPTA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09Q0FMTCl7CisgICAgICBpbnQgcmVnOworICAgICAgLypGSVhNRSovCisjaWYgMCAgICAgIAorICAgICAgaWYoc3RhY2tfdmFsaWQmJihwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiZwLT5xMS52LT5maSYmKHAtPnExLnYtPmZpLT5mbGFncyZBTExfU1RBQ0spKXsKKwlpZihmcmFtZXNpemUrenVtMnVsKHAtPnExLnYtPmZpLT5zdGFjazEpPnN0YWNrKQorCSAgc3RhY2s9ZnJhbWVzaXplK3p1bTJ1bChwLT5xMS52LT5maS0+c3RhY2sxKTsKKyAgICAgIH1lbHNlCisJc3RhY2tfdmFsaWQ9MDsKKyNlbmRpZgorICAgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJnAtPnExLnYtPmZpJiZwLT5xMS52LT5maS0+aW5saW5lX2FzbSl7CisgICAgICAgIGVtaXRfaW5saW5lX2FzbShmLHAtPnExLnYtPmZpLT5pbmxpbmVfYXNtKTsKKyAgICAgIH1lbHNleworCWVtaXQoZiwiXHRjYWxsXHQiKTsKKwllbWl0X29iaihmLCZwLT5xMSx0KTsKKwllbWl0KGYsIlxuIik7CisgICAgICB9CisgICAgICAvKkZJWE1FKi8KKyNpZiBGSVhFRF9TUAorICAgICAgcHVzaGVkLT16bTJsKHAtPnEyLnZhbC52bWF4KTsKKyNlbmRpZgorICAgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJnAtPnExLnYtPmZpJiYocC0+cTEudi0+ZmktPmZsYWdzJkFMTF9SRUdTKSl7CisJYnZ1bml0ZShyZWdzX21vZGlmaWVkLHAtPnExLnYtPmZpLT5yZWdzX21vZGlmaWVkLFJTSVpFKTsKKyAgICAgIH1lbHNleworCWludCBpOworCWZvcihpPTE7aTw9TUFYUjtpKyspeworCSAgaWYocmVnc2NyYXRjaFtpXSkgQlNFVChyZWdzX21vZGlmaWVkLGkpOworCX0KKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1BU1NJR058fGM9PVBVU0gpeworICAgICAgaWYodD09MCkgaWVycm9yKDApOworICAgICAgaWYoYz09UFVTSCl7CisjaWYgRklYRURfU1AKKwllbWl0KGYsIlx0bW92LiVzXHQlbGQoJXMpLCIsZHQodCkscHVzaGVkLHJlZ25hbWVzW3NwXSk7CisJZW1pdF9vYmooZiwmcC0+cTEsdCk7CisJZW1pdChmLCJcbiIpOworCXB1c2hlZCs9em0ybChwLT5xMi52YWwudm1heCk7CisjZWxzZQorCWVtaXQoZiwiXHRwdXNoLiVzXHQiLGR0KHQpKTsKKwllbWl0X29iaihmLCZwLT5xMSx0KTsKKwllbWl0KGYsIlxuIik7CisJcHVzaCh6bTJsKHAtPnEyLnZhbC52bWF4KSk7CisjZW5kaWYKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PUFTU0lHTil7CisJbG9hZF9yZWcoZix6cmVnLCZwLT5xMSx0KTsKKwlzYXZlX3Jlc3VsdChmLHApOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PUFERFJFU1MpeworICAgICAgbG9hZF9hZGRyZXNzKGYsenJlZywmcC0+cTEsUE9JTlRFUik7CisgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PU1JTlVTKXsKKyAgICAgIGxvYWRfcmVnKGYsenJlZywmcC0+cTEsdCk7CisgICAgICBlbWl0KGYsIlx0bmVnLiVzXHQlc1xuIixkdCh0KSxyZWduYW1lc1t6cmVnXSk7CisgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PVRFU1QpeworICAgICAgZW1pdChmLCJcdHRzdC4lc1x0IixkdCh0KSk7CisgICAgICBpZihtdWx0aXBsZV9jY3MpCisJZW1pdChmLCIlcywiLHJlZ25hbWVzW3pyZWddKTsKKyAgICAgIGVtaXRfb2JqKGYsJnAtPnExLHQpOworICAgICAgZW1pdChmLCJcbiIpOworICAgICAgaWYobXVsdGlwbGVfY2NzKQorCXNhdmVfcmVzdWx0KGYscCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09Q09NUEFSRSl7CisgICAgICBlbWl0KGYsIlx0Y21wLiVzXHQiLGR0KHQpKTsKKyAgICAgIGlmKG11bHRpcGxlX2NjcykKKwllbWl0KGYsIiVzLCIscmVnbmFtZXNbenJlZ10pOworICAgICAgZW1pdF9vYmooZiwmcC0+cTEsdCk7CisgICAgICBlbWl0KGYsIiwiKTsKKyAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHQpOworICAgICAgZW1pdChmLCJcbiIpOworICAgICAgaWYobXVsdGlwbGVfY2NzKQorCXNhdmVfcmVzdWx0KGYscCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoKGM+PU9SJiZjPD1BTkQpfHwoYz49TFNISUZUJiZjPD1NT0QpKXsKKyAgICAgIGlmKCFUSFJFRV9BRERSKQorCWxvYWRfcmVnKGYsenJlZywmcC0+cTEsdCk7CisgICAgICBpZihjPj1PUiYmYzw9QU5EKQorCWVtaXQoZiwiXHQlcy4lc1x0JXMsIixsb2dpY2Fsc1tjLU9SXSxkdCh0KSxyZWduYW1lc1t6cmVnXSk7CisgICAgICBlbHNlCisJZW1pdChmLCJcdCVzLiVzXHQlcywiLGFyaXRobWV0aWNzW2MtTFNISUZUXSxkdCh0KSxyZWduYW1lc1t6cmVnXSk7CisgICAgICBpZihUSFJFRV9BRERSKXsKKwllbWl0X29iaihmLCZwLT5xMSx0KTsKKwllbWl0KGYsIiwiKTsKKyAgICAgIH0KKyAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHQpOworICAgICAgZW1pdChmLCJcbiIpOworICAgICAgc2F2ZV9yZXN1bHQoZixwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBwcmljMihzdGRvdXQscCk7CisgICAgaWVycm9yKDApOworICB9CisgIGZ1bmN0aW9uX2JvdHRvbShmLHYsbG9jYWxzaXplKTsKKyAgaWYoc3RhY2tfdmFsaWQpeworICAgIGlmKCF2LT5maSkgdi0+Zmk9bmV3X2ZpKCk7CisgICAgdi0+ZmktPmZsYWdzfD1BTExfU1RBQ0s7CisgICAgdi0+ZmktPnN0YWNrMT1zdGFjazsKKyAgfQorICBlbWl0KGYsIiMgc3RhY2tzaXplPSVsdSVzXG4iLHp1bTJ1bChzdGFjayksc3RhY2tfdmFsaWQ/IiI6Iis/PyIpOworfQorCitpbnQgc2hvcnRjdXQoaW50IGNvZGUsaW50IHR5cCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK2ludCByZWdfcGFybShzdHJ1Y3QgcmVnX2hhbmRsZSAqbSwgc3RydWN0IFR5cCAqdCxpbnQgdmFyYXJnLHN0cnVjdCBUeXAgKmQpCit7CisgIGludCBmOworICBmPXQtPmZsYWdzJk5ROworICBpZihmPD1MT05HfHxmPT1QT0lOVEVSKXsKKyAgICBpZihtLT5ncmVncz49R1BSX0FSR1MpCisgICAgICByZXR1cm4gMDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gRklSU1RfR1BSKzMrbS0+Z3JlZ3MrKzsKKyAgfQorICBpZihJU0ZMT0FUKGYpKXsKKyAgICBpZihtLT5mcmVncz49RlBSX0FSR1MpCisgICAgICByZXR1cm4gMDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gRklSU1RfRlBSKzIrbS0+ZnJlZ3MrKzsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IGhhbmRsZV9wcmFnbWEoY29uc3QgY2hhciAqcykKK3sKK30KK3ZvaWQgY2xlYW51cF9jZyhGSUxFICpmKQoreworfQordm9pZCBjbGVhbnVwX2RiKEZJTEUgKmYpCit7CisgIGlmKGYpIHNlY3Rpb249LTE7Cit9CisKZGlmZiAtLWdpdCBhL21hY2hpbmVzL3NyYy9tYWNoaW5lLmR0IGIvbWFjaGluZXMvc3JjL21hY2hpbmUuZHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2VjZTUxOAotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL3NyYy9tYWNoaW5lLmR0CkBAIC0wLDAgKzEsMTQgQEAKK1M4QlMKK1M4QlUKK1MxNkJTQkUgUzE2QlNMRQorUzE2QlVCRSBTMTZCVUxFCitTMzJCU0JFIFMzMkJTTEUKK1MzMkJVQkUgUzMyQlVMRQorUzMyQlNCRSBTMzJCU0xFCitTMzJCVUJFIFMzMkJVTEUKK1M2NEJTQkUgUzY0QlNMRQorUzY0QlVCRSBTNjRCVUxFCitTMzJCSUVFRUJFCitTNjRCSUVFRUJFCitTNjRCSUVFRUJFCitTMzJCVUJFIFMzMkJVTEUKZGlmZiAtLWdpdCBhL21hY2hpbmVzL3NyYy9tYWNoaW5lLmggYi9tYWNoaW5lcy9zcmMvbWFjaGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk4YTk0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy9zcmMvbWFjaGluZS5oCkBAIC0wLDAgKzEsMTI1IEBACisvKiAgQyBzcmMgYmFja2VuZCBmb3IgdmJjYworKi8KKworLyogYnVpbC10aW1lIGNvbmZpZ3VyYWJsZSBvcHRpb25zOiAqLworI2RlZmluZSBTQ0hBUl9SRUdTIDY0CisjZGVmaW5lIFVDSEFSX1JFR1MgNjQKKyNkZWZpbmUgU1NIT1JUX1JFR1MgNjQKKyNkZWZpbmUgVVNIT1JUX1JFR1MgNjQKKyNkZWZpbmUgU0lOVF9SRUdTIDY0CisjZGVmaW5lIFVJTlRfUkVHUyA2NAorI2RlZmluZSBTTE9OR19SRUdTIDY0CisjZGVmaW5lIFVMT05HX1JFR1MgNjQKKyNkZWZpbmUgU0xMT05HX1JFR1MgNjQKKyNkZWZpbmUgVUxMT05HX1JFR1MgNjQKKyNkZWZpbmUgRkxPQVRfUkVHUyA2NAorI2RlZmluZSBET1VCTEVfUkVHUyA2NAorI2RlZmluZSBMRE9VQkxFX1JFR1MgNjQKKyNkZWZpbmUgUE9JTlRFUl9SRUdTIDY0CisKKyNpbmNsdWRlICJkdC5oIgorCisvKiBpbnRlcm5hbGx5IHVzZWQgYnkgdGhlIGJhY2tlbmQgKi8KKyNkZWZpbmUgRklSU1RfU0NIQVIgMQorI2RlZmluZSBMQVNUX1NDSEFSIChGSVJTVF9TQ0hBUitTQ0hBUl9SRUdTKQorI2RlZmluZSBGSVJTVF9VQ0hBUiAoTEFTVF9TQ0hBUisxKQorI2RlZmluZSBMQVNUX1VDSEFSIChGSVJTVF9VQ0hBUitVQ0hBUl9SRUdTKQorCisjZGVmaW5lIEZJUlNUX1NTSE9SVCAoTEFTVF9VQ0hBUisxKQorI2RlZmluZSBMQVNUX1NTSE9SVCAoRklSU1RfU1NIT1JUK1NTSE9SVF9SRUdTKQorI2RlZmluZSBGSVJTVF9VU0hPUlQgKExBU1RfU1NIT1JUKzEpCisjZGVmaW5lIExBU1RfVVNIT1JUIChGSVJTVF9VU0hPUlQrVVNIT1JUX1JFR1MpCisKKyNkZWZpbmUgRklSU1RfU0lOVCAoTEFTVF9VU0hPUlQrMSkKKyNkZWZpbmUgTEFTVF9TSU5UIChGSVJTVF9TSU5UK1NJTlRfUkVHUykKKyNkZWZpbmUgRklSU1RfVUlOVCAoTEFTVF9TSU5UKzEpCisjZGVmaW5lIExBU1RfVUlOVCAoRklSU1RfVUlOVCtVSU5UX1JFR1MpCisKKyNkZWZpbmUgRklSU1RfU0xPTkcgKExBU1RfVUlOVCsxKQorI2RlZmluZSBMQVNUX1NMT05HIChGSVJTVF9TTE9ORytTTE9OR19SRUdTKQorI2RlZmluZSBGSVJTVF9VTE9ORyAoTEFTVF9TTE9ORysxKQorI2RlZmluZSBMQVNUX1VMT05HIChGSVJTVF9VTE9ORytVTE9OR19SRUdTKQorCisjZGVmaW5lIEZJUlNUX1NMTE9ORyAoTEFTVF9VTE9ORysxKQorI2RlZmluZSBMQVNUX1NMTE9ORyAoRklSU1RfU0xMT05HK1NMTE9OR19SRUdTKQorI2RlZmluZSBGSVJTVF9VTExPTkcgKExBU1RfU0xMT05HKzEpCisjZGVmaW5lIExBU1RfVUxMT05HIChGSVJTVF9VTExPTkcrVUxMT05HX1JFR1MpCisKKyNkZWZpbmUgRklSU1RfRkxPQVQgKExBU1RfVUxMT05HKzEpCisjZGVmaW5lIExBU1RfRkxPQVQgKEZJUlNUX0ZMT0FUK0ZMT0FUX1JFR1MpCisKKyNkZWZpbmUgRklSU1RfRE9VQkxFIChMQVNUX0ZMT0FUKzEpCisjZGVmaW5lIExBU1RfRE9VQkxFIChET1VCTEVfRkxPQVQrRE9VQkxFX1JFR1MpCisKKyNkZWZpbmUgRklSU1RfTERPVUJMRSAoTEFTVF9ET1VCTEUrMSkKKyNkZWZpbmUgTEFTVF9MRE9VQkxFIChMRE9VQkxFX0ZMT0FUK0xET1VCTEVfUkVHUykKKworI2RlZmluZSBGSVJTVF9QT0lOVEVSIChMQVNUX0xET1VCTEUrMSkKKyNkZWZpbmUgTEFTVF9QT0lOVEVSIChQT0lOVEVSX0ZMT0FUK1BPSU5URVJfUkVHUykKKworCisvKiAgVGhpcyBzdHJ1Y3QgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IG1hY2hpbmUtc3BlY2lmaWMgICAgICAgICAgICovCisvKiAgYWRkcmVzc2luZy1tb2Rlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ3VycmVudGx5IHBvc3NpYmxlIGFyZSAoY29uc3QsZ3ByKSBhbmQgKGdwcixncHIpICAgICAgICAgICAgICAgICovCitzdHJ1Y3QgQWRkcmVzc2luZ01vZGV7CisgIGludCBkdW1teTsKK307CisKKy8qICBUaGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUuICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFYUiBMQVNUX1BPSU5URVIKKworLyogIE51bWJlciBvZiBjb21tYW5kbGluZS1vcHRpb25zIHRoZSBjb2RlLWdlbmVyYXRvciBhY2NlcHRzLiAgICAgICAqLworI2RlZmluZSBNQVhHRiAyMAorCisvKiAgSWYgdGhpcyBpcyBzZXQgdG8gemVybyB2YmNjIHdpbGwgbm90IGdlbmVyYXRlIElDcyB3aGVyZSB0aGUgICAgICovCisvKiAgdGFyZ2V0IG9wZXJhbmQgaXMgdGhlIHNhbWUgYXMgdGhlIDJuZCBzb3VyY2Ugb3BlcmFuZC4gICAgICAgICAgICovCisvKiAgVGhpcyBjYW4gc29tZXRpbWVzIHNpbXBsaWZ5IHRoZSBjb2RlLWdlbmVyYXRvciwgYnV0IHVzdWFsbHkgICAgICovCisvKiAgdGhlIGNvZGUgaXMgYmV0dGVyIGlmIHRoZSBjb2RlLWdlbmVyYXRvciBhbGxvd3MgaXQuICAgICAgICAgICAgICovCisjZGVmaW5lIFVTRVEyQVNaIDEKKworLyogIFRoaXMgc3BlY2lmaWVzIHRoZSBzbWFsbGVzdCBpbnRlZ2VyIHR5cGUgdGhhdCBjYW4gYmUgYWRkZWQgdG8gYSAqLworLyogIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNSU5BRERJMlAgQ0hBUgorCisvKiAgSWYgdGhlIGJ5dGVzIG9mIGFuIGludGVnZXIgYXJlIG9yZGVyZWQgbW9zdCBzaWduaWZpY2FudCBieXRlICAgICovCisvKiAgYnl0ZSBmaXJzdCBhbmQgdGhlbiBkZWNyZWFzaW5nIHNldCBCSUdFTkRJQU4gdG8gMS4gICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR0VORElBTiAxCisKKy8qICBJZiB0aGUgYnl0ZXMgb2YgYW4gaW50ZWdlciBhcmUgb3JkZXJlZCBsZXN0IHNpZ25pZmljYW50IGJ5dGUgICAgKi8KKy8qICBieXRlIGZpcnN0IGFuZCB0aGVuIGluY3JlYXNpbmcgc2V0IExJVFRMRUVORElBTiB0byAxLiAgICAgICAgICAgKi8KKyNkZWZpbmUgTElUVExFRU5ESUFOIDAKKworLyogIE5vdGUgdGhhdCBCSUdFTkRJQU4gYW5kIExJVFRMRUVORElBTiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAgICAqLworCisvKiAgSWYgc3dpdGNoLXN0YXRlbWVudHMgc2hvdWxkIGJlIGdlbmVyYXRlZCBhcyBhIHNlcXVlbmNlIG9mICAgICAgICovCisvKiAgU1VCLFRTVCxCRVEgSUNzIHJhdGhlciB0aGFuIENPTVBBUkUsQkVRIElDcyBzZXQgdGhpcyB0byAxLiAgICAgICovCisvKiAgVGhpcyBjYW4geWllbGQgYmV0dGVyIGNvZGUgb24gc29tZSBtYWNoaW5lcy4gICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNXSVRDSFNVQlMgMAorCisvKiAgSW4gb3B0aW1pemluZyBjb21waWxhdGlvbiBjZXJ0YWluIGxpYnJhcnkgbWVtY3B5L3N0cmNweS1jYWxscyAgICovCisvKiAgd2l0aCBsZW5ndGgga25vd24gYXQgY29tcGlsZS10aW1lIHdpbGwgYmUgaW5saW5lZCB1c2luZyBhbiAgICAgICovCisvKiAgQVNTSUdOLUlDIGlmIHRoZSBzaXplIGlzIGxlc3Mgb3IgZXF1YWwgdG8gSU5MSU5FTUVNQ1BZLiAgICAgICAgICovCisvKiAgVGhlIHR5cGUgdXNlZCBmb3IgdGhlIEFTU0lHTi1JQyB3aWxsIGJlIFVOU0lHTkVEfENIQVIuICAgICAgICAgICovCisjZGVmaW5lIElOTElORU1FTUNQWSAxMDI0CisKKy8qICBQYXJhbWV0ZXJzIGFyZSBzb21ldGltZXMgcGFzc2VkIGluIHJlZ2lzdGVycyB3aXRob3V0IF9fcmVnLiAgICAgKi8KKyNkZWZpbmUgSEFWRV9SRUdQQVJNUyAwCisKKy8qICBQYXJhbWV0ZXJzIG9uIHRoZSBzdGFjayBzaG91bGQgYmUgcHVzaGVkIGluIG9yZGVyIHJhdGhlciB0aGFuICAgKi8KKy8qICBpbiByZXZlcnNlIG9yZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT1JERVJFRF9QVVNIIEZJWEVEX1NQCisKKy8qIHdlIG9ubHkgbmVlZCB0aGUgc3RhbmRhcmQgZGF0YSB0eXBlcyAobm8gYml0LXR5cGVzLCBkaWZmZXJlbnQgcG9pbnRlcnMKKyAgIGV0Yy4pICovCisjdW5kZWYgSEFWRV9FWFRfVFlQRVMKKyN1bmRlZiBIQVZFX1RHVF9QUklOVFZBTAorCisvKiB3ZSBkbyBub3QgbmVlZCBleHRyYSBlbGVtZW50cyBpbiB0aGUgSUMgKi8KKyN1bmRlZiBIQVZFX0VYVF9JQworCisvKiB3ZSBkbyBub3QgdXNlIHVuc2lnbmVkIGludCBhcyBzaXplX3QgKGJ1dCB1bnNpZ25lZCBsb25nLCB0aGUgZGVmYXVsdCkgKi8KKyN1bmRlZiBIQVZFX0lOVF9TSVpFVAorCisvKiB3ZSBkbyBub3QgbmVlZCByZWdpc3Rlci1wYWlycyAqLworI3VuZGVmIEhBVkVfUkVHUEFJUlMKKwpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvdmlkY29yZS9tYWNoaW5lLmMgYi9tYWNoaW5lcy92aWRjb3JlL21hY2hpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjBhNGQwCi0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvdmlkY29yZS9tYWNoaW5lLmMKQEAgLTAsMCArMSwxNzc0IEBACisvKiAgQmFja2VuZCBmb3IgVmlkZW9Db3JlIElWCisgICAgKGMpIGluIDIwMTMgYnkgVm9sa2VyIEJhcnRoZWxtYW5uCisqLworCisvKiBUT0RPOgorICAgLSBleHRlbmRlZCByZWdpc3RlcnMKKyAgIC0gZmxvYXRpbmcgcG9pbnQKKyAgIC0gbG9uZyBsb25nCisgICAtIG1lbWNweQorICAgLSBhZGRjbXAKKyAgIC0gYmNjIHJlZworICAgLSBjb25kLiBpbnMKKyAgIC0gdmVjdG9yCisgICAtIG5vbi1wYyBhZGRyZXNzaW5nCisqLworCisjaW5jbHVkZSAic3VwcC5oIgorCitzdGF0aWMgY2hhciBGSUxFX1tdPV9fRklMRV9fOworCisvKiAgUHVibGljIGRhdGEgdGhhdCBNVVNUIGJlIHRoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogTmFtZSBhbmQgY29weXJpZ2h0LiAqLworY2hhciBjZ19jb3B5cmlnaHRbXT0idmJjYyBWaWRlb0NvcmUgSVYgY29kZS1nZW5lcmF0b3IgVjAuMSAoYykgaW4gMjAxMyBieSBWb2xrZXIgQmFydGhlbG1hbm4iOworCisvKiB0aGUgZmxhZy1uYW1lLCBkbyBub3QgdXNlIG5hbWVzIGJlZ2lubmluZyB3aXRoIGwsIEwsIEksIEQgb3IgVSwgYmVjYXVzZQorICAgdGhleSBjb2xsaWRlIHdpdGggdGhlIGZyb250ZW5kICovCitjaGFyICpnX2ZsYWdzX25hbWVbTUFYR0ZdPXsidXNlLWNvbW1vbnMiLCJ1c2UtZnJhbWVwb2ludGVyIiwKKwkJCSAgICJzaG9ydC1kb3VibGUiLCJvbmUtc2VjdGlvbiIsCisJCQkgICAibm8tZGVsYXllZC1wb3BwaW5nIn07CisKK2ludCBnX2ZsYWdzW01BWEdGXT17MCwwLAorCQkgICAgMH07CisKKy8qIHRoZSByZXN1bHRzIG9mIHBhcnNpbmcgdGhlIGNvbW1hbmQtbGluZS1mbGFncyB3aWxsIGJlIHN0b3JlZCBoZXJlICovCit1bmlvbiBwcGkgZ19mbGFnc192YWxbTUFYR0ZdOworCisvKiAgQWxpZ25tZW50LXJlcXVpcmVtZW50cyBmb3IgYWxsIHR5cGVzIGluIGJ5dGVzLiAgICAgICAgICAgICAgKi8KK3ptYXggYWxpZ25bTUFYX1RZUEUrMV07CisKKy8qICBBbGlnbm1lbnQgdGhhdCBpcyBzdWZmaWNpZW50IGZvciBldmVyeSBvYmplY3QuICAgICAgICAgICAgICAqLworem1heCBtYXhhbGlnbjsKKworLyogIENIQVJfQklUIGZvciB0aGUgdGFyZ2V0IG1hY2hpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IGNoYXJfYml0OworCisvKiAgc2l6ZXMgb2YgdGhlIGJhc2ljIHR5cGVzIChpbiBieXRlcykgKi8KK3ptYXggc2l6ZXRhYltNQVhfVFlQRSsxXTsKKworLyogIE1pbmltdW0gYW5kIE1heGltdW0gdmFsdWVzIGVhY2ggdHlwZSBjYW4gaGF2ZS4gICAgICAgICAgICAgICovCisvKiAgTXVzdCBiZSBpbml0aWFsaXplZCBpbiBpbml0X2NnKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggdF9taW5bTUFYX1RZUEUrMV07Cit6dW1heCB0X21heFtNQVhfVFlQRSsxXTsKK3p1bWF4IHR1X21heFtNQVhfVFlQRSsxXTsKKworLyogIE5hbWVzIG9mIGFsbCByZWdpc3RlcnMuIHdpbGwgYmUgaW5pdGlhbGl6ZWQgaW4gaW5pdF9jZygpLAorICAgIHJlZ2lzdGVyIG51bWJlciAwIGlzIGludmFsaWQsIHZhbGlkIHJlZ2lzdGVycyBzdGFydCBhdCAxICovCitjaGFyICpyZWduYW1lc1tNQVhSKzFdOworCisvKiAgVGhlIFNpemUgb2YgZWFjaCByZWdpc3RlciBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ptYXggcmVnc2l6ZVtNQVhSKzFdOworCisvKiAgYSB0eXBlIHdoaWNoIGNhbiBzdG9yZSBlYWNoIHJlZ2lzdGVyLiAqLworc3RydWN0IFR5cCAqcmVndHlwZVtNQVhSKzFdOworCisvKiAgcmVnc2FbcmVnXSE9MCBpZiBhIGNlcnRhaW4gcmVnaXN0ZXIgaXMgYWxsb2NhdGVkIGFuZCBzaG91bGQgKi8KKy8qICBub3QgYmUgdXNlZCBieSB0aGUgY29tcGlsZXIgcGFzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworaW50IHJlZ3NhW01BWFIrMV07CisKKy8qICBTcGVjaWZpZXMgd2hpY2ggcmVnaXN0ZXJzIG1heSBiZSBzY3JhdGNoZWQgYnkgZnVuY3Rpb25zLiAgICAqLworaW50IHJlZ3NjcmF0Y2hbTUFYUisxXTsKKworLyogc3BlY2lmaWVzIHRoZSBwcmlvcml0eSBmb3IgdGhlIHJlZ2lzdGVyLWFsbG9jYXRvciwgaWYgdGhlIHNhbWUKKyAgIGVzdGltYXRlZCBjb3N0LXNhdmluZyBjYW4gYmUgb2J0YWluZWQgYnkgc2V2ZXJhbCByZWdpc3RlcnMsIHRoZQorICAgb25lIHdpdGggdGhlIGhpZ2hlc3QgcHJpb3JpdHkgd2lsbCBiZSB1c2VkICovCitpbnQgcmVnX3ByaW9bTUFYUisxXTsKKworLyogYW4gZW1wdHkgcmVnLWhhbmRsZSByZXByZXNlbnRpbmcgaW5pdGlhbCBzdGF0ZSAqLworc3RydWN0IHJlZ19oYW5kbGUgZW1wdHlfcmVnX2hhbmRsZT17MH07CisKKy8qIE5hbWVzIG9mIHRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZSBhdHRyaWJ1dGVzLiAgICAgICAgICAgICAgICAqLworY2hhciAqZ19hdHRyX25hbWVbXT17Il9faW50ZXJydXB0IiwwfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBQcml2YXRlIGRhdGEgYW5kIGZ1bmN0aW9ucy4gICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGFkZHJlc3NpbmcgbW9kZXMgKi8KKyNkZWZpbmUgQU1fSU1NX0lORCAxCisjZGVmaW5lIEFNX0dQUl9JTkQgMgorI2RlZmluZSBBTV9QT1NUSU5DIDMKKyNkZWZpbmUgQU1fUFJFREVDICA0CisKKyNkZWZpbmUgVVNFX0NPTU1PTlMgKGdfZmxhZ3NbMF0mVVNFREZMQUcpCisjZGVmaW5lIFVTRV9GUCAgICAgIChnX2ZsYWdzWzFdJlVTRURGTEFHKQorI2RlZmluZSBTSE9SVF9ET1VCTEUgKGdfZmxhZ3NbMl0mVVNFREZMQUcpCisjZGVmaW5lIE9ORVNFQyAgICAgIChnX2ZsYWdzWzNdJlVTRURGTEFHKQorI2RlZmluZSBOT0RFTEFZRURQT1AgKGdfZmxhZ3NbNF0mVVNFREZMQUcpCisKKworLyogYWxpZ25tZW50IG9mIGJhc2ljIGRhdGEtdHlwZXMsIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbGlnbltdICovCitzdGF0aWMgbG9uZyBtYWxpZ25bTUFYX1RZUEUrMV09ICB7MSwxLDIsNCw0LDQsNCw4LDgsMSw0LDEsMSwxLDQsMX07CisvKiBzaXplcyBvZiBiYXNpYyBkYXRhLXR5cGVzLCB1c2VkIHRvIGluaXRpYWxpemUgc2l6ZXRhYltdICovCitzdGF0aWMgbG9uZyBtc2l6ZXRhYltNQVhfVFlQRSsxXT17MSwxLDIsNCw0LDgsNCw4LDgsMCw0LDAsMCwwLDQsMH07CisKKy8qIHVzZWQgdG8gaW5pdGlhbGl6ZSByZWd0eXBbXSAqLworc3RhdGljIHN0cnVjdCBUeXAgbHR5cD17TE9OR30sbGRibD17RE9VQkxFfSxsY2hhcj17Q0hBUn07CisKKy8qIG1hY3JvcyBkZWZpbmVkIGJ5IHRoZSBiYWNrZW5kICovCitzdGF0aWMgY2hhciAqbWFycmF5W109eyJfX3NlY3Rpb24oeCk9X192YXR0cihcInNlY3Rpb24oXCIjeFwiKVwiKSIsCisJCSAgICAgICAiX19WSURFT0NPUkVfXyIsCisJCSAgICAgICAwLCAvKiBfX1NIT1JUX0RPVUJMRV9fICovCisJCSAgICAgICAwfTsKKworLyogc3BlY2lhbCByZWdpc3RlcnMgKi8KK2VudW17CisgIHIwPTEscjEscjIscjMscjQscjUscjYscjcscjgscjkscjEwLHIxMSxyMTIscjEzLHIxNCxyMTUsCisgIHIxNixyMTcscjE4LHIxOSxyMjAscjIxLHIyMixyMjMscjI0LHIyNSxyMjYscjI3LHIyOCxyMjkscjMwLHIzMSwKKyAgcjByMSxyMnIzLHI0cjUscjZyNyxyOHI5LHIxMHIxMSxyMTJyMTMscjE0cjE1LAorICByMTZyMTcscjE4cjE5LHIyMHIyMSxyMjJyMjMscjI0cjI1LHIyNnIyNyxyMjhyMjkscjMwcjMxCit9OworCitzdGF0aWMgaW50IHNkPXIyNDsKK3N0YXRpYyBpbnQgc3A9cjI1Oworc3RhdGljIGludCBscj1yMjY7CitzdGF0aWMgaW50IHNyPXIzMDsKK3N0YXRpYyBpbnQgcGM9cjMxOworc3RhdGljIGludCB0MT1yMTU7CitzdGF0aWMgaW50IHQyPXIxNDsKKworc3RhdGljIGludCBsYXN0X3NhdmVkOworCisjZGVmaW5lIGR0KHQpICgoKHQpJlVOU0lHTkVEKT91ZHRbKHQpJk5RXTpzZHRbKHQpJk5RXSkKKyNkZWZpbmUgc2R0KHQpICh1ZHRbKHQpJk5RXSkKK3N0YXRpYyBjaGFyICpzZHRbTUFYX1RZUEUrMV09eyI/PyIsImIiLCJocyIsIiIsIiIsImxsIiwiIiwiZCIsImxkIiwidiIsIiJ9Oworc3RhdGljIGNoYXIgKnVkdFtNQVhfVFlQRSsxXT17Ij8/IiwiYiIsImgiLCIiLCIiLCJ1bGwiLCIiLCJkIiwibGQiLCJ2IiwiIn07CisKK3N0YXRpYyBjaGFyICpkY3RbXT17IiIsImJ5dGUiLCIyYnl0ZSIsIjRieXRlIiwiNGJ5dGUiLCI0Ynl0ZSIsIjRieXRlIiwiNGJ5dGUiLCI0Ynl0ZSJ9OworCitzdGF0aWMgaW50IG5vX3N1ZmZpeDsKKworLyogc2VjdGlvbnMgKi8KKyNkZWZpbmUgREFUQSAwCisjZGVmaW5lIEJTUyAxCisjZGVmaW5lIENPREUgMgorI2RlZmluZSBST0RBVEEgMworI2RlZmluZSBTUEVDSUFMIDQKKworc3RhdGljIGxvbmcgc3RhY2s7CitzdGF0aWMgaW50IHN0YWNrX3ZhbGlkOworc3RhdGljIGludCBzZWN0aW9uPS0xLG5ld29iajsKK3N0YXRpYyBjaGFyICpjb2RlbmFtZT0iXHQudGV4dFxuIiwKKyAgKmRhdGFuYW1lPSJcdC5kYXRhXG4iLAorICAqYnNzbmFtZT0iIiwKKyAgKnJvZGF0YW5hbWU9Ilx0LnNlY3Rpb25cdC5yb2RhdGFcbiI7CisKKy8qIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiAqLworc3RhdGljIGNoYXIgKmNjOworCisvKiByZXR1cm4taW5zdHJ1Y3Rpb24gKi8KK3N0YXRpYyBjaGFyICpyZXQ7CisKKy8qIGxhYmVsIGF0IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uIChpZiBhbnkpICovCitzdGF0aWMgaW50IGV4aXRfbGFiZWw7CisKKy8qIGFzc2VtYmx5LXByZWZpeGVzIGZvciBsYWJlbHMgYW5kIGV4dGVybmFsIGlkZW50aWZpZXJzICovCitzdGF0aWMgY2hhciAqbGFicHJlZml4PSJsIiwqaWRwcmVmaXg9Il8iOworCisjaWYgMAorLyogdmFyaWFibGVzIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBhbmQgcGFydGl0aW9uaW5nIG9mIHRoZSBzdGFjay1mcmFtZQorICAgaW4gdGhlIGNhc2Ugb2YgRklYRURfU1AgKi8KK3N0YXRpYyBsb25nIGZyYW1lb2Zmc2V0LHB1c2hlZCxtYXhwdXNoZWQsZnJhbWVzaXplOworI2Vsc2UKKy8qIHZhcmlhYmxlcyB0byBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IHN0YWNrLW9mZnNldCBpbiB0aGUgY2FzZSBvZgorICAgYSBtb3Zpbmcgc3RhY2stcG9pbnRlciAqLworc3RhdGljIGxvbmcgbm90cG9wcGVkLGRvbnRwb3Asc3RhY2tvZmZzZXQsbWF4cHVzaGVkOworI2VuZGlmCisKK3N0YXRpYyBsb25nIGxvY2Fsc2l6ZSxyc2F2ZXNpemUsYXJnc2l6ZTsKKworc3RhdGljIHZvaWQgZW1pdF9vYmooRklMRSAqZixzdHJ1Y3Qgb2JqICpwLGludCB0KTsKKworLyogY2FsY3VsYXRlIHRoZSBhY3R1YWwgY3VycmVudCBvZmZzZXQgb2YgYW4gb2JqZWN0IHJlbGF0aXYgdG8gdGhlCisgICBzdGFjay1wb2ludGVyOyB3ZSB1c2UgYSBsYXlvdXQgbGlrZSB0aGlzOgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB8IGFyZ3VtZW50cyB0byB0aGlzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgIHwKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCByZXR1cm4tYWRkcmVzcyBbc2l6ZT00XSAgICAgICAgICAgICAgICAgICAgICB8CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHwgY2FsbGVyLXNhdmUgcmVnaXN0ZXJzIFtzaXplPXJzYXZlc2l6ZV0gICAgICAgfAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB8IGxvY2FsIHZhcmlhYmxlcyBbc2l6ZT1sb2NhbHNpemVdICAgICAgICAgICAgIHwKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCBhcmd1bWVudHMgdG8gY2FsbGVkIGZ1bmN0aW9ucyBbc2l6ZT1hcmdzaXplXSB8CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIEFsbCBzaXplcyB3aWxsIGJlIGFsaWduZWQgYXMgbmVjZXNzYXJ5LgorICAgSW4gdGhlIGNhc2Ugb2YgRklYRURfU1AsIHRoZSBzdGFjay1wb2ludGVyIHdpbGwgYmUgYWRqdXN0ZWQgYXQKKyAgIGZ1bmN0aW9uLWVudHJ5IHRvIGxlYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhlIGFyZ3VtZW50cyBhbmQgaGF2ZSBpdAorICAgYWxpZ25lZCB0byAxNiBieXRlcy4gVGhlcmVmb3JlLCB3aGVuIGNhbGxpbmcgYSBmdW5jdGlvbiwgdGhlCisgICBzdGFjay1wb2ludGVyIGlzIGFsd2F5cyBhbGlnbmVkIHRvIDE2IGJ5dGVzLgorICAgRm9yIGEgbW92aW5nIHN0YWNrLXBvaW50ZXIsIHRoZSBzdGFjay1wb2ludGVyIHdpbGwgdXN1YWxseSBwb2ludAorICAgdG8gdGhlIGJvdHRvbSBvZiB0aGUgYXJlYSBmb3IgbG9jYWwgdmFyaWFibGVzLCBidXQgd2lsbCBtb3ZlIHdoaWxlCisgICBhcmd1bWVudHMgYXJlIHB1dCBvbiB0aGUgc3RhY2suCisKKyAgIFRoaXMgaXMganVzdCBhbiBleGFtcGxlIGxheW91dC4gT3RoZXIgbGF5b3V0cyBhcmUgYWxzbyBwb3NzaWJsZS4KKyovCisKK3N0YXRpYyB2b2lkIHB1c2gobG9uZyBsKQoreworICBzdGFja29mZnNldC09bDsKKyAgaWYoc3RhY2tvZmZzZXQ8bWF4cHVzaGVkKSAKKyAgICBtYXhwdXNoZWQ9c3RhY2tvZmZzZXQ7CisgIGlmKC1tYXhwdXNoZWQ+c3RhY2spCisgICAgc3RhY2s9LW1heHB1c2hlZDsKK30KKworc3RhdGljIHZvaWQgcG9wKGxvbmcgbCkKK3sKKyAgc3RhY2tvZmZzZXQrPWw7Cit9CisKK3N0YXRpYyBsb25nIHJlYWxfb2Zmc2V0KHN0cnVjdCBvYmogKm8pCit7CisgIGxvbmcgb2ZmPXptMmwoby0+di0+b2Zmc2V0KTsKKyAgaWYob2ZmPDApeworICAgIC8qIGZ1bmN0aW9uIHBhcmFtZXRlciAqLworICAgIG9mZj1sb2NhbHNpemUrcnNhdmVzaXplLW9mZi16bTJsKG1heGFsaWduKTsKKyAgfQorCisgIG9mZi09c3RhY2tvZmZzZXQ7CisKKyAgb2ZmKz16bTJsKG8tPnZhbC52bWF4KTsKKyAgcmV0dXJuIG9mZjsKK30KKworLyogIEluaXRpYWxpemVzIGFuIGFkZHJlc3NpbmctbW9kZSBzdHJ1Y3R1cmUgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvCisgICAgdGhhdCBvYmplY3QuIFdpbGwgbm90IHN1cnZpdmUgYSBzZWNvbmQgY2FsbCEgKi8KK3N0YXRpYyBzdHJ1Y3Qgb2JqICpjYW0oaW50IGZsYWdzLGludCBiYXNlLGxvbmcgb2Zmc2V0KQoreworICBzdGF0aWMgc3RydWN0IG9iaiBvYmo7CisgIHN0YXRpYyBzdHJ1Y3QgQWRkcmVzc2luZ01vZGUgYW07CisgIG9iai5hbT0mYW07CisgIGFtLmZsYWdzPWZsYWdzOworICBhbS5iYXNlPWJhc2U7CisgIGFtLm9mZnNldD1vZmZzZXQ7CisgIHJldHVybiAmb2JqOworfQorCisvKiBjaGFuZ2VzIHRvIGEgc3BlY2lhbCBzZWN0aW9uLCB1c2VkIGZvciBfX3NlY3Rpb24oKSAqLworc3RhdGljIGludCBzcGVjaWFsX3NlY3Rpb24oRklMRSAqZixzdHJ1Y3QgVmFyICp2KQoreworICBjaGFyICpzZWM7CisgIGlmKCF2LT52YXR0cikgcmV0dXJuIDA7CisgIHNlYz1zdHJzdHIodi0+dmF0dHIsInNlY3Rpb24oIik7CisgIGlmKCFzZWMpIHJldHVybiAwOworICBzZWMrPXN0cmxlbigic2VjdGlvbigiKTsKKyAgZW1pdChmLCJcdC5zZWN0aW9uXHQiKTsKKyAgd2hpbGUoKnNlYyYmKnNlYyE9JyknKSBlbWl0X2NoYXIoZiwqc2VjKyspOworICBlbWl0KGYsIlxuIik7CisgIGlmKGYpIHNlY3Rpb249U1BFQ0lBTDsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHB1c2htYXNrOworCitzdGF0aWMgaW50IGljX3VzZXNfcmVnKHN0cnVjdCBJQyAqcCxpbnQgcixpbnQgb25seXVzZXMpCit7CisgIGlmKHJlZ19wYWlyKHIsJnJwKSl7CisgICAgcmV0dXJuIGljX3VzZXNfcmVnKHAscnAucjEsb25seXVzZXMpfHxpY191c2VzX3JlZyhwLHJwLnIyLG9ubHl1c2VzKTsKKyAgfQorICAvKkZJWE1FOiBoYW5kbGUgcmVncGFpcnMgKi8KKyAgaWYoKHAtPnExLmZsYWdzJlJFRykmJnAtPnExLnJlZz09cikgcmV0dXJuIDE7CisgIGlmKChwLT5xMi5mbGFncyZSRUcpJiZwLT5xMi5yZWc9PXIpIHJldHVybiAxOworICBpZihvbmx5dXNlcyl7CisgICAgaWYoKHAtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAtPnoucmVnPT1yKSByZXR1cm4gMTsKKyAgfWVsc2V7CisgICAgaWYoKHAtPnouZmxhZ3MmUkVHKSYmcC0+ei5yZWc9PXIpIHJldHVybiAxOworICB9CisgIGlmKHAtPnExLmFtKXsKKyAgICBpZihwLT5xMS5hbS0+YmFzZT09cikgcmV0dXJuIDE7CisgICAgaWYocC0+cTEuYW0tPmZsYWdzPT1BTV9HUFJfSU5EJiZwLT5xMS5hbS0+b2Zmc2V0PT1yKSByZXR1cm4gMTsKKyAgfQorICBpZihwLT5xMi5hbSl7CisgICAgaWYocC0+cTIuYW0tPmJhc2U9PXIpIHJldHVybiAxOworICAgIGlmKHAtPnEyLmFtLT5mbGFncz09QU1fR1BSX0lORCYmcC0+cTIuYW0tPm9mZnNldD09cikgcmV0dXJuIDE7CisgIH0KKyAgaWYocC0+ei5hbSl7CisgICAgaWYocC0+ei5hbS0+YmFzZT09cikgcmV0dXJuIDE7CisgICAgaWYocC0+ei5hbS0+ZmxhZ3M9PUFNX0dQUl9JTkQmJnAtPnouYW0tPm9mZnNldD09cikgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVnX2lzX3NjcmF0Y2hlZChzdHJ1Y3QgSUMgKnAsaW50IHIpCit7CisgIGZvcihwPXAtPm5leHQ7cDtwPXAtPm5leHQpeworICAgIGludCBjPXAtPmNvZGU7CisgICAgaWYoYz49TEFCRUwmJmM8PUJSQSkKKyAgICAgIHJldHVybiAwOworICAgIGlmKGM9PUZSRUVSRUcmJnAtPnExLnJlZz09cikKKyAgICAgIHJldHVybiAxOworICAgIGlmKGljX3VzZXNfcmVnKHAsciwxKSkKKyAgICAgIHJldHVybiAwOworICAgIGlmKChwLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwLT56LnJlZz09cikKKyAgICAgIHJldHVybiAxOworICB9ICAgIAorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfcmVnKEZJTEUgKmYsc3RydWN0IElDICpwKQoreworICBpbnQgcjsKKyAgZm9yKHI9cjA7cjw9cjMxO3IrKyl7CisgICAgaWYoIXJlZ3Nbcl0mJnJlZ3VzZWRbcl0mJiFpY191c2VzX3JlZyhwLHIsMCkpeworICAgICAgcmVnc1tyXT0xOworICAgICAgcmV0dXJuIHI7CisgICAgfQorICB9CisgIGZvcihyPXIwO3I8PXIzMTtyKyspeworICAgIGlmKCFyZWdzW3JdJiYhaWNfdXNlc19yZWcocCxyLDApKXsKKyAgICAgIHJlZ3Nbcl09MTsKKyAgICAgIHJldHVybiByOworICAgIH0KKyAgfQorICBmb3Iocj1yMDtyPD1yMzE7cisrKXsKKyAgICBpZighaWNfdXNlc19yZWcocCxyLDApKQorICAgICAgYnJlYWs7CisgIH0KKyAgYXJnc2l6ZSs9NDsKKyAgZW1pdChmLCJcdHN0XHQlcywtLSglcylcbiIscmVnbmFtZXNbcl0scmVnbmFtZXNbc3BdKTsKKyAgcHVzaCg0KTsKKyAgcHVzaG1hc2t8PSgxPDwoci0xKSk7CisgIHJlZ3Nbcl09MTsKKyAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcmVnKEZJTEUgKmYsaW50IHIpCit7CisgIGlmKHB1c2htYXNrJigxPDwoci0xKSkpeworICAgIGVtaXQoZiwiXHRsZFx0JXMsKCVzKSsrXG4iLHJlZ25hbWVzW3JdLHJlZ25hbWVzW3NwXSk7CisgICAgcG9wKDQpOworICAgIGFyZ3NpemUtPTQ7CisgIH1lbHNlCisgICAgcmVnc1tyXT0wOworICBwdXNobWFzayY9figxPDwoci0xKSk7Cit9CisKKy8qIGdlbmVyYXRlIGNvZGUgdG8gbG9hZCB0aGUgYWRkcmVzcyBvZiBhIHZhcmlhYmxlIGludG8gcmVnaXN0ZXIgciAqLworc3RhdGljIHZvaWQgbG9hZF9hZGRyZXNzKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdHlwZSkKKy8qICBHZW5lcmF0ZXMgY29kZSB0byBsb2FkIHRoZSBhZGRyZXNzIG9mIGEgdmFyaWFibGUgaW50byByZWdpc3RlciByLiAgICovCit7CisgIGlmKCEoby0+ZmxhZ3MmVkFSKSkgaWVycm9yKDApOworICBpZihvLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxvLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CisgICAgbG9uZyBvZmY9cmVhbF9vZmZzZXQobyk7CisgICAgZW1pdChmLCJcdGFkZCVzXHQlcywlcywlbGRcbiIsY2MscmVnbmFtZXNbcl0scmVnbmFtZXNbc3BdLG9mZik7CisgIH1lbHNleworICAgIGVtaXQoZiwiXHRsZWElc1x0JXMsIixjYyxyZWduYW1lc1tyXSk7CisgICAgZW1pdF9vYmooZixvLHR5cGUpOworICAgIGVtaXQoZiwiXG4iKTsKKyAgfQorfQorLyogR2VuZXJhdGVzIGNvZGUgdG8gbG9hZCBhIG1lbW9yeSBvYmplY3QgaW50byByZWdpc3RlciByLiB0bXAgaXMgYQorICAgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIHdoaWNoIG1heSBiZSB1c2VkLiB0bXAgY2FuIGJlIHIuICovCitzdGF0aWMgdm9pZCBsb2FkX3JlZyhGSUxFICpmLGludCByLHN0cnVjdCBvYmogKm8saW50IHR5cGUpCit7CisgIHR5cGUmPU5VOworICBpZihyZWdfcGFpcihyLCZycCkpIGllcnJvcigwKTsKKyAgaWYoby0+ZmxhZ3MmVkFSQURSKXsKKyAgICBsb2FkX2FkZHJlc3MoZixyLG8sUE9JTlRFUik7CisgIH1lbHNlIGlmKG8tPmZsYWdzJktPTlNUKXsKKyAgICBlbWl0KGYsIlx0bW92JXNcdCVzLCIsY2MscmVnbmFtZXNbcl0pOworICAgIGVtaXRfb2JqKGYsbyx0eXBlKTsKKyAgICBlbWl0KGYsIlxuIik7CisgIH1lbHNleworICAgIGlmKChvLT5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKyAgICAgIGlmKG8tPnJlZyE9cikKKwllbWl0KGYsIlx0bW92JXNcdCVzLCVzXG4iLGNjLHJlZ25hbWVzW3JdLHJlZ25hbWVzW28tPnJlZ10pOworICAgIH1lbHNleworICAgICAgaWYoU0hPUlRfRE9VQkxFJiZJU0ZMT0FUKHR5cGUpKSB0eXBlPUZMT0FUOworICAgICAgZW1pdChmLCJcdGxkJXMlc1x0JXMsIixkdCh0eXBlKSxjYyxyZWduYW1lc1tyXSk7CisgICAgICBlbWl0X29iaihmLG8sdHlwZSk7CisgICAgICBlbWl0KGYsIlxuIik7CisgICAgfQorICB9Cit9CisKKy8qICBHZW5lcmF0ZXMgY29kZSB0byBzdG9yZSByZWdpc3RlciByIGludG8gbWVtb3J5IG9iamVjdCBvLiAqLworc3RhdGljIHZvaWQgc3RvcmVfcmVnKEZJTEUgKmYsaW50IHIsc3RydWN0IG9iaiAqbyxpbnQgdHlwZSkKK3sKKyAgaWYocmVnX3BhaXIociwmcnApKSBpZXJyb3IoMCk7CisgIHR5cGUmPU5ROworICBpZihTSE9SVF9ET1VCTEUmJklTRkxPQVQodHlwZSkpIHR5cGU9RkxPQVQ7CisgIGVtaXQoZiwiXHRzdCVzJXNcdCVzLCIsc2R0KHR5cGUpLGNjLHJlZ25hbWVzW3JdKTsKKyAgZW1pdF9vYmooZixvLHR5cGUpOworICBlbWl0KGYsIlxuIik7Cit9CisKKy8qICBZaWVsZHMgbG9nMih4KSsxIG9yIDAuICovCitzdGF0aWMgbG9uZyBwb2YyKHp1bWF4IHgpCit7CisgIHp1bWF4IHA7aW50IGxuPTE7CisgIHA9dWwyenVtKDFMKTsKKyAgd2hpbGUobG48PTMyJiZ6dW1sZXEocCx4KSl7CisgICAgaWYoenVtZXF0byh4LHApKSByZXR1cm4gbG47CisgICAgbG4rKztwPXp1bWFkZChwLHApOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IElDICpwcmVsb2FkKEZJTEUgKixzdHJ1Y3QgSUMgKik7CisKK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX3RvcChGSUxFICosc3RydWN0IFZhciAqLGxvbmcpOworc3RhdGljIHZvaWQgZnVuY3Rpb25fYm90dG9tKEZJTEUgKmYsc3RydWN0IFZhciAqLGxvbmcpOworCisjZGVmaW5lIGlzcmVnKHgpICgocC0+eC5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKQorI2RlZmluZSBpc2NvbnN0KHgpICgocC0+eC5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCkKKworc3RhdGljIGludCBxMXJlZyxxMnJlZyx6cmVnOworCitzdGF0aWMgY2hhciAqY2NzW109eyJlcSIsIm5lIiwibHQiLCJnZSIsImxlIiwiZ3QiLCIifTsKK3N0YXRpYyBjaGFyICpjY3VbXT17ImVxIiwibmUiLCJjcyIsImNjIiwibHMiLCJoaSIsIiJ9Oworc3RhdGljIGNoYXIgKmxvZ2ljYWxzW109eyJvciIsImVvciIsImFuZCJ9Oworc3RhdGljIGNoYXIgKmFyaXRobWV0aWNzW109eyJsc2wiLCJhc3IiLCJhZGQiLCJzdWIiLCJtdWwiLCJkaXZzIiwibW9kIn07CitzdGF0aWMgY2hhciAqdWFyaXRobWV0aWNzW109eyJsc2wiLCJsc3IiLCJhZGQiLCJzdWIiLCJtdWwiLCJkaXZ1IiwibW9kIn07CitzdGF0aWMgY2hhciAqZmFyaXRobWV0aWNzW109eyItLSIsIi0tIiwiZmFkZCIsImZzdWIiLCJmbXVsIiwiZmRpdiIsIi0tIn07CisKKworLyogRG9lcyBzb21lIHByZS1wcm9jZXNzaW5nIGxpa2UgZmV0Y2hpbmcgb3BlcmFuZHMgZnJvbSBtZW1vcnkgdG8KKyAgIHJlZ2lzdGVycyBldGMuICovCitzdGF0aWMgc3RydWN0IElDICpwcmVsb2FkKEZJTEUgKmYsc3RydWN0IElDICpwKQoreworICBpbnQgcixsb2FkOworCisgIGlmKGlzcmVnKHExKSkKKyAgICBxMXJlZz1wLT5xMS5yZWc7CisgIGVsc2UKKyAgICBxMXJlZz0wOworCisgIGlmKGlzcmVnKHEyKSkKKyAgICBxMnJlZz1wLT5xMi5yZWc7CisgIGVsc2UKKyAgICBxMnJlZz0wOworCisgIGlmKGlzcmVnKHopKXsKKyAgICB6cmVnPXAtPnoucmVnOworICB9ZWxzZXsKKyAgICB6cmVnPXQxOworICB9CisgIAorICBpZigocC0+cTEuZmxhZ3MmKERSRUZPQkp8UkVHKSk9PURSRUZPQkomJiFwLT5xMS5hbSl7CisgICAgcC0+cTEuZmxhZ3MmPX5EUkVGT0JKOworICAgIGxvYWRfcmVnKGYsdDEsJnAtPnExLFBPSU5URVIpOworICAgIHAtPnExLnJlZz10MTsKKyAgICBwLT5xMS5mbGFnc3w9KFJFR3xEUkVGT0JKKTsKKyAgfQorICBpZihwLT5xMS5mbGFncyYmIWlzcmVnKHExKSYmcC0+Y29kZSE9QVNTSUdOJiZwLT5jb2RlIT1QVVNIJiZwLT5jb2RlIT1TRVRSRVRVUk4vKiYmIShwLT5xMS5mbGFncyZLT05TVCkqLyl7CisgICAgcTFyZWc9enJlZzsKKyAgICBsb2FkX3JlZyhmLHExcmVnLCZwLT5xMSxxMXR5cChwKSk7CisgICAgcC0+cTEucmVnPXExcmVnOworICAgIHAtPnExLmZsYWdzPVJFRzsKKyAgfQorCisgIGlmKChwLT5xMi5mbGFncyYoRFJFRk9CSnxSRUcpKT09RFJFRk9CSiYmIXAtPnEyLmFtKXsKKyAgICBwLT5xMi5mbGFncyY9fkRSRUZPQko7CisgICAgbG9hZF9yZWcoZix0MiwmcC0+cTIsUE9JTlRFUik7CisgICAgcC0+cTIucmVnPXQyOworICAgIHAtPnEyLmZsYWdzfD0oUkVHfERSRUZPQkopOworICB9CisKKyAgaWYocC0+cTIuZmxhZ3MpeworICAgIGxvYWQ9MTsKKyAgICBpZihpc3JlZyhxMikpIGxvYWQ9MDsKKyAgICBpZigocC0+cTIuZmxhZ3MmS09OU1QpJiYhSVNGTE9BVChwLT50eXBmKSYmKHAtPmNvZGU9PUFERHx8cC0+Y29kZT09U1VCfHxwLT5jb2RlPT1BRERJMlB8fHAtPmNvZGU9PUNPTVBBUkV8fHAtPmNvZGU9PVNVQklGUHx8cC0+Y29kZT09U1VCUEZQKSkKKyAgICAgIGxvYWQ9MDsKKyAgICBpZihwLT5jb2RlPj1PUiYmcC0+Y29kZTw9TU9EJiYocC0+cTIuZmxhZ3MmS09OU1QpJiYhSVNGTE9BVChwLT50eXBmKSl7CisgICAgICB1bnNpZ25lZCBsb25nIHY7CisgICAgICBldmFsX2NvbnN0KCZwLT5xMi52YWwscTJ0eXAocCkpOworICAgICAgdj16dW0ydWwodnVtYXgpOworICAgICAgaWYodjw9MzEpIGxvYWQ9MDsKKyAgICB9CisgICAgaWYobG9hZCl7CisgICAgICBxMnJlZz10MjsKKyAgICAgIGxvYWRfcmVnKGYscTJyZWcsJnAtPnEyLHEydHlwKHApKTsKKyAgICAgIHAtPnEyLnJlZz1xMnJlZzsKKyAgICAgIHAtPnEyLmZsYWdzPVJFRzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHA7Cit9CisKKy8qIHNhdmUgdGhlIHJlc3VsdCAoaW4genJlZykgaW50byBwLT56ICovCit2b2lkIHNhdmVfcmVzdWx0KEZJTEUgKmYsc3RydWN0IElDICpwKQoreworICBpZigocC0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09RFJFRk9CSiYmIXAtPnouYW0peworICAgIHAtPnouZmxhZ3MmPX5EUkVGT0JKOworICAgIGxvYWRfcmVnKGYsdDIsJnAtPnosUE9JTlRFUik7CisgICAgcC0+ei5yZWc9dDI7CisgICAgcC0+ei5mbGFnc3w9KFJFR3xEUkVGT0JKKTsKKyAgfQorICBpZihpc3JlZyh6KSl7CisgICAgaWYocC0+ei5yZWchPXpyZWcpCisgICAgICBlbWl0KGYsIlx0bW92JXNcdCVzLCVzXG4iLGNjLHJlZ25hbWVzW3AtPnoucmVnXSxyZWduYW1lc1t6cmVnXSk7CisgIH1lbHNleworICAgIHN0b3JlX3JlZyhmLHpyZWcsJnAtPnosenR5cChwKSk7CisgIH0KK30KKworLyogcHJpbnRzIGFuIG9iamVjdCAqLworc3RhdGljIHZvaWQgZW1pdF9vYmooRklMRSAqZixzdHJ1Y3Qgb2JqICpwLGludCB0KQoreworICBpZigocC0+ZmxhZ3MmRFJFRk9CSikmJnAtPmFtKXsKKyAgICBpZihwLT5hbS0+ZmxhZ3M9PUFNX0dQUl9JTkQpIGVtaXQoZiwiKCVzLCVzKSIscmVnbmFtZXNbcC0+YW0tPmJhc2VdLHJlZ25hbWVzW3AtPmFtLT5vZmZzZXRdKTsKKyAgICBpZihwLT5hbS0+ZmxhZ3M9PUFNX0lNTV9JTkQpIGVtaXQoZiwiJWxkKCVzKSIscC0+YW0tPm9mZnNldCxyZWduYW1lc1twLT5hbS0+YmFzZV0pOworICAgIGlmKHAtPmFtLT5mbGFncz09QU1fUE9TVElOQykgZW1pdChmLCIoJXMpKysiLHJlZ25hbWVzW3AtPmFtLT5iYXNlXSk7CisgICAgaWYocC0+YW0tPmZsYWdzPT1BTV9QUkVERUMpIGVtaXQoZiwiLS0oJXMpIixyZWduYW1lc1twLT5hbS0+YmFzZV0pOworICAgIHJldHVybjsKKyAgfQorICBpZigocC0+ZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09KEtPTlNUfERSRUZPQkopKXsKKyAgICBlbWl0dmFsKGYsJnAtPnZhbCxwLT5kdHlwJk5VKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYocC0+ZmxhZ3MmRFJFRk9CSikgZW1pdChmLCIoIik7CisgIGlmKHAtPmZsYWdzJlJFRyl7CisgICAgZW1pdChmLCIlcyIscmVnbmFtZXNbcC0+cmVnXSk7CisgIH1lbHNlIGlmKHAtPmZsYWdzJlZBUikgeworICAgIGlmKHAtPnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHAtPnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKQorICAgICAgZW1pdChmLCIlbGQoJXMpIixyZWFsX29mZnNldChwKSxyZWduYW1lc1tzcF0pOworICAgIGVsc2V7CisgICAgICBpZighem1lcXRvKGwyem0oMEwpLHAtPnZhbC52bWF4KSl7ZW1pdHZhbChmLCZwLT52YWwsTE9ORyk7ZW1pdChmLCIrIik7fQorICAgICAgaWYocC0+di0+c3RvcmFnZV9jbGFzcz09U1RBVElDKXsKKyAgICAgICAgZW1pdChmLCIlcyVsZCIsbGFicHJlZml4LHptMmwocC0+di0+b2Zmc2V0KSk7CisgICAgICB9ZWxzZXsKKyAgICAgICAgZW1pdChmLCIlcyVzIixpZHByZWZpeCxwLT52LT5pZGVudGlmaWVyKTsKKyAgICAgIH0KKyAgICAgIGlmKCFub19zdWZmaXgpCisJZW1pdChmLCIoJXMpIixyZWduYW1lc1twY10pOworICAgIH0KKyAgfQorICBpZihwLT5mbGFncyZLT05TVCl7CisgICAgaWYoSVNGTE9BVCh0KSl7CisgICAgICB1bnNpZ25lZCBjaGFyICppcDsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnZhbCx0KTsKKyAgICAgIGlwPSh1bnNpZ25lZCBjaGFyICopJnZmbG9hdDsKKyAgICAgIGVtaXQoZiwiMHglMDJ4JTAyeCUwMnglMDJ4IixpcFswXSxpcFsxXSxpcFsyXSxpcFszXSk7CisgICAgfWVsc2UKKyAgICAgIGVtaXR2YWwoZiwmcC0+dmFsLHQmTlUpOworICB9CisgIGlmKHAtPmZsYWdzJkRSRUZPQkopIGVtaXQoZiwiKSIpOworfQorCisvKiAgVGVzdCBpZiB0aGVyZSBpcyBhIHNlcXVlbmNlIG9mIEZSRUVSRUdzIGNvbnRhaW5pbmcgRlJFRVJFRyByZWcuCisgICAgVXNlZCBieSBwZWVwaG9sZS4gKi8KK3N0YXRpYyBpbnQgZXhpc3RzX2ZyZWVyZWcoc3RydWN0IElDICpwLGludCByZWcpCit7CisgIHdoaWxlKHAmJihwLT5jb2RlPT1GUkVFUkVHfHxwLT5jb2RlPT1BTExPQ1JFRykpeworICAgIGlmKHAtPmNvZGU9PUZSRUVSRUcmJnAtPnExLnJlZz09cmVnKSByZXR1cm4gMTsKKyAgICBwPXAtPm5leHQ7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIHNlYXJjaCBmb3IgcG9zc2libGUgYWRkcmVzc2luZy1tb2RlcyAqLworc3RhdGljIHZvaWQgcGVlcGhvbGUoc3RydWN0IElDICpwKQoreworICBpbnQgYyxjMixyO3N0cnVjdCBJQyAqcDI7c3RydWN0IEFkZHJlc3NpbmdNb2RlICphbTsKKworICBmb3IoO3A7cD1wLT5uZXh0KXsKKyAgICBjPXAtPmNvZGU7CisgICAgaWYoYyE9RlJFRVJFRyYmYyE9QUxMT0NSRUcmJihjIT1TRVRSRVRVUk58fCFpc3JlZyhxMSl8fHAtPnExLnJlZyE9cC0+ei5yZWcpKSBleGl0X2xhYmVsPTA7CisgICAgaWYoYz09TEFCRUwpIGV4aXRfbGFiZWw9cC0+dHlwZjsKKworICAgIC8qIC0oYXgpICovCisgICAgaWYoYz09U1VCSUZQJiZpc3JlZyhxMSkmJmlzcmVnKHopJiZwLT5xMS5yZWc9PXAtPnoucmVnJiZwLT5xMS5yZWc8PTgmJmlzY29uc3QocTIpKXsKKyAgICAgIHptYXggc3o7CisgICAgICBpbnQgdDsKKyAgICAgIHI9cC0+cTEucmVnOworICAgICAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHEydHlwKHApKTsKKyAgICAgIHN6PXptMmwodm1heCk7CisgICAgICBpZihzej09MXx8c3o9PTJ8fHN6PT00KXsKKyAgICAgICAgZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpeworICAgICAgICAgIGMyPXAyLT5jb2RlOworICAgICAgICAgIGlmKCFwMi0+cTEuYW0mJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT5xMS5yZWc9PXImJighKHAyLT5xMi5mbGFncyZSRUcpfHxwMi0+cTIucmVnIT1yKSYmKCEocDItPnouZmxhZ3MmUkVHKXx8cDItPnoucmVnIT1yKSYmKAorYzIhPUNPTlZFUlR8fChxMXR5cChwMikmTlEpPD0oenR5cChwMikmTlEpKSl7CisgICAgICAgICAgICB0PShxMXR5cChwMikmTlEpOworICAgICAgICAgICAgaWYoKElTSU5UKHQpfHxJU1BPSU5URVIodCkpJiZ0IT1MTE9ORyYmem1lcXRvKHNpemV0YWJbcTF0eXAocDIpJk5RXSxsMnptKHN6KSkpeworICAgICAgICAgICAgICBwMi0+cTEuYW09YW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworICAgICAgICAgICAgICBwMi0+cTEudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICAgICAgICAgIGFtLT5iYXNlPXI7CisgICAgICAgICAgICAgIGFtLT5mbGFncz1BTV9QUkVERUM7CisgICAgICAgICAgICAgIHAtPmNvZGU9Tk9QOworICAgICAgICAgICAgICBwLT5xMS5mbGFncz1wLT5xMi5mbGFncz1wLT56LmZsYWdzPTA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgIGlmKCFwMi0+cTIuYW0mJihwMi0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT5xMi5yZWc9PXImJighKHAyLT5xMS5mbGFncyZSRUcpfHxwMi0+cTEucmVnIT1yKSYmKCEocDItPnouZmxhZ3MmUkVHKXx8cDItPnoucmVnIT1yKSl7CisgICAgICAgICAgICB0PShxMnR5cChwMikmTlEpOworICAgICAgICAgICAgaWYoKElTSU5UKHQpfHxJU1BPSU5URVIodCkpJiZ0IT1MTE9ORyYmem1lcXRvKHNpemV0YWJbcTJ0eXAocDIpJk5RXSxsMnptKHN6KSkpeworICAgICAgICAgICAgICBwMi0+cTIuYW09YW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworICAgICAgICAgICAgICBwMi0+cTIudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICAgICAgICAgIGFtLT5iYXNlPXI7CisgICAgICAgICAgICAgIGFtLT5mbGFncz1BTV9QUkVERUM7CisgICAgICAgICAgICAgIHAtPmNvZGU9Tk9QOworICAgICAgICAgICAgICBwLT5xMS5mbGFncz1wLT5xMi5mbGFncz1wLT56LmZsYWdzPTA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZighcDItPnouYW0mJihwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnoucmVnPT1yJiYoIShwMi0+cTIuZmxhZ3MmUkVHKXx8cDItPnEyLnJlZyE9cikmJighKHAyLT5xMS5mbGFncyZSRUcpfHxwMi0+cTEucmVnIT1yKSl7CisgICAgICAgICAgICB0PSh6dHlwKHAyKSZOUSk7CisgICAgICAgICAgICBpZigoSVNJTlQodCl8fElTUE9JTlRFUih0KSkmJnQhPUxMT05HJiZ6bWVxdG8oc2l6ZXRhYlt6dHlwKHAyKSZOUV0sbDJ6bShzeikpKXsKKyAgICAgICAgICAgICAgcDItPnouYW09YW09bXltYWxsb2Moc2l6ZW9mKCphbSkpOworICAgICAgICAgICAgICBwMi0+ei52YWwudm1heD1sMnptKDBMKTsKKyAgICAgICAgICAgICAgYW0tPmJhc2U9cjsKKyAgICAgICAgICAgICAgYW0tPmZsYWdzPUFNX1BSRURFQzsKKyAgICAgICAgICAgICAgcC0+Y29kZT1OT1A7CisgICAgICAgICAgICAgIHAtPnExLmZsYWdzPXAtPnEyLmZsYWdzPXAtPnouZmxhZ3M9MDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmKGMyPT1DQUxMfHxjMj09TEFCRUx8fChjMj49QkVRJiZjMjw9QlJBKSkgYnJlYWs7CisgICAgICAgICAgaWYoKHAyLT5xMS5mbGFncyZSRUcpJiZwMi0+cTEucmVnPT1yKSBicmVhazsKKyAgICAgICAgICBpZigocDItPnEyLmZsYWdzJlJFRykmJnAyLT5xMi5yZWc9PXIpIGJyZWFrOworICAgICAgICAgIGlmKChwMi0+ei5mbGFncyZSRUcpJiZwMi0+ei5yZWc9PXIpIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLyogKGF4KSsgaW4gcTEgKi8KKyAgICBpZighcC0+cTEuYW0mJihwLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmKGMhPUNPTlZFUlR8fChxMXR5cChwKSZOUSk8PSh6dHlwKHApJk5RKSkpeworICAgICAgaW50IHQ9KHExdHlwKHApJk5RKTsKKyAgICAgIGxvbmcgc3o9em0ybChzaXpldGFiW3RdKTsKKyAgICAgIHI9cC0+cTEucmVnOworICAgICAgaWYoKHN6PT0xfHxzej09Mnx8c3o9PTQpJiYoSVNJTlQodCl8fElTUE9JTlRFUih0KXx8SVNGTE9BVCh0KSkmJighKHAtPnEyLmZsYWdzJlJFRyl8fHAtPnEyLnJlZyE9cikmJighKHAtPnouZmxhZ3MmUkVHKXx8cC0+ei5yZWchPXIpKXsKKyAgICAgICAgZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpeworICAgICAgICAgIGMyPXAyLT5jb2RlOworICAgICAgICAgIGlmKGMyPT1BRERJMlAmJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09ciYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT56LnJlZz09ciYmKHAyLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisgICAgICAgICAgICBldmFsX2NvbnN0KCZwMi0+cTIudmFsLHEydHlwKHAyKSk7CisgICAgICAgICAgICBpZih6bWVxdG8odm1heCxsMnptKHN6KSkpeworICAgICAgICAgICAgICBwLT5xMS5hbT1hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CisgICAgICAgICAgICAgIHAtPnExLnZhbC52bWF4PWwyem0oMEwpOworCSAgICAgIGFtLT5mbGFncz1BTV9QT1NUSU5DOworICAgICAgICAgICAgICBhbS0+YmFzZT1yOworICAgICAgICAgICAgICBhbS0+b2Zmc2V0PTA7CisgICAgICAgICAgICAgIHAyLT5jb2RlPU5PUDsKKyAgICAgICAgICAgICAgcDItPnExLmZsYWdzPXAyLT5xMi5mbGFncz1wMi0+ei5mbGFncz0wOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKKyAgICAgICAgICBpZigocDItPnExLmZsYWdzJlJFRykmJnAyLT5xMS5yZWc9PXIpIGJyZWFrOworICAgICAgICAgIGlmKChwMi0+cTIuZmxhZ3MmUkVHKSYmcDItPnEyLnJlZz09cikgYnJlYWs7CisgICAgICAgICAgaWYoKHAyLT56LmZsYWdzJlJFRykmJnAyLT56LnJlZz09cikgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgLyogKGF4KSsgaW4gcTIgKi8KKyAgICBpZighcC0+cTIuYW0mJihwLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmKGMhPUNPTlZFUlR8fChxMnR5cChwKSZOUSk8PSh6dHlwKHApJk5RKSkpeworICAgICAgaW50IHQ9KHEydHlwKHApJk5RKTsKKyAgICAgIGxvbmcgc3o9em0ybChzaXpldGFiW3RdKTsKKyAgICAgIHI9cC0+cTIucmVnOworICAgICAgaWYoKHN6PT0xfHxzej09Mnx8c3o9PTQpJiYoSVNJTlQodCl8fElTUE9JTlRFUih0KXx8SVNGTE9BVCh0KSkmJighKHAtPnExLmZsYWdzJlJFRyl8fHAtPnExLnJlZyE9cikmJighKHAtPnouZmxhZ3MmUkVHKXx8cC0+ei5yZWchPXIpKXsKKyAgICAgICAgZm9yKHAyPXAtPm5leHQ7cDI7cDI9cDItPm5leHQpeworICAgICAgICAgIGMyPXAyLT5jb2RlOworICAgICAgICAgIGlmKGMyPT1BRERJMlAmJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnExLnJlZz09ciYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT56LnJlZz09ciYmKHAyLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisgICAgICAgICAgICBldmFsX2NvbnN0KCZwMi0+cTIudmFsLHEydHlwKHAyKSk7CisgICAgICAgICAgICBpZih6bWVxdG8odm1heCxsMnptKHN6KSkpeworICAgICAgICAgICAgICBwLT5xMi5hbT1hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CisgICAgICAgICAgICAgIHAtPnEyLnZhbC52bWF4PWwyem0oMEwpOworCSAgICAgIGFtLT5mbGFncz1BTV9QT1NUSU5DOworICAgICAgICAgICAgICBhbS0+YmFzZT1yOworICAgICAgICAgICAgICBhbS0+b2Zmc2V0PTA7CisgICAgICAgICAgICAgIHAyLT5jb2RlPU5PUDsKKyAgICAgICAgICAgICAgcDItPnExLmZsYWdzPXAyLT5xMi5mbGFncz1wMi0+ei5mbGFncz0wOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYoYzI9PUNBTEx8fGMyPT1MQUJFTHx8KGMyPj1CRVEmJmMyPD1CUkEpKSBicmVhazsKKyAgICAgICAgICBpZigocDItPnExLmZsYWdzJlJFRykmJnAyLT5xMS5yZWc9PXIpIGJyZWFrOworICAgICAgICAgIGlmKChwMi0+cTIuZmxhZ3MmUkVHKSYmcDItPnEyLnJlZz09cikgYnJlYWs7CisgICAgICAgICAgaWYoKHAyLT56LmZsYWdzJlJFRykmJnAyLT56LnJlZz09cikgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgLyogKGF4KSsgaW4geiAqLworICAgIGlmKCFwLT56LmFtJiYocC0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcC0+ei5yZWc8PTgmJihjIT1DT05WRVJUfHwocTJ0eXAocCkmTlEpPD0oenR5cChwKSZOUSkpKXsKKyAgICAgIGludCB0PSh6dHlwKHApJk5RKTsKKyAgICAgIGxvbmcgc3o9em0ybChzaXpldGFiW3RdKTsKKyAgICAgIHI9cC0+ei5yZWc7CisgICAgICBpZigoc3o9PTF8fHN6PT0yfHxzej09NCkmJihJU0lOVCh0KXx8SVNQT0lOVEVSKHQpfHxJU0ZMT0FUKHQpKSYmKCEocC0+cTEuZmxhZ3MmUkVHKXx8cC0+cTEucmVnIT1yKSYmKCEocC0+cTIuZmxhZ3MmUkVHKXx8cC0+cTIucmVnIT1yKSl7CisgICAgICAgIGZvcihwMj1wLT5uZXh0O3AyO3AyPXAyLT5uZXh0KXsKKyAgICAgICAgICBjMj1wMi0+Y29kZTsKKyAgICAgICAgICBpZihjMj09QURESTJQJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMS5yZWc9PXImJihwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+ei5yZWc9PXImJihwMi0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QpeworICAgICAgICAgICAgZXZhbF9jb25zdCgmcDItPnEyLnZhbCxxMnR5cChwMikpOworICAgICAgICAgICAgaWYoem1lcXRvKHZtYXgsbDJ6bShzeikpKXsKKyAgICAgICAgICAgICAgcC0+ei5hbT1hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CisgICAgICAgICAgICAgIHAtPnoudmFsLnZtYXg9bDJ6bSgwTCk7CisJICAgICAgYW0tPmZsYWdzPUFNX1BPU1RJTkM7CisgICAgICAgICAgICAgIGFtLT5iYXNlPXI7CisgICAgICAgICAgICAgIGFtLT5vZmZzZXQ9MDsKKyAgICAgICAgICAgICAgcDItPmNvZGU9Tk9QOworICAgICAgICAgICAgICBwMi0+cTEuZmxhZ3M9cDItPnEyLmZsYWdzPXAyLT56LmZsYWdzPTA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZihjMj09Q0FMTHx8YzI9PUxBQkVMfHwoYzI+PUJFUSYmYzI8PUJSQSkpIGJyZWFrOworICAgICAgICAgIGlmKChwMi0+cTEuZmxhZ3MmUkVHKSYmcDItPnExLnJlZz09cikgYnJlYWs7CisgICAgICAgICAgaWYoKHAyLT5xMi5mbGFncyZSRUcpJiZwMi0+cTIucmVnPT1yKSBicmVhazsKKyAgICAgICAgICBpZigocDItPnouZmxhZ3MmUkVHKSYmcDItPnoucmVnPT1yKSBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvKiBUcnkgY29uc3QocmVnKSAqLworICAgIGlmKChjPT1BRERJMlAvKnx8Yz09U1VCSUZQKi8pJiZpc3JlZyh6KSYmKHAtPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKyAgICAgIGludCBiYXNlO3ptYXggb2Y7c3RydWN0IG9iaiAqbzsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnEyLnZhbCxwLT50eXBmKTsKKyAgICAgIGlmKGM9PVNVQklGUCkgb2Y9em1zdWIobDJ6bSgwTCksdm1heCk7IGVsc2Ugb2Y9dm1heDsKKyAgICAgIGlmKDEvKnptbGVxKGwyem0oLTMyNzY4TCksdm1heCkmJnptbGVxKHZtYXgsbDJ6bSgzMjc2N0wpKSovKXsKKwlyPXAtPnoucmVnOworCWlmKGlzcmVnKHExKSkgYmFzZT1wLT5xMS5yZWc7IGVsc2UgYmFzZT1yOworCW89MDsKKwlmb3IocDI9cC0+bmV4dDtwMjtwMj1wMi0+bmV4dCl7CisJICBjMj1wMi0+Y29kZTsKKwkgIGlmKGMyPT1DQUxMfHxjMj09TEFCRUx8fChjMj49QkVRJiZjMjw9QlJBKSkgYnJlYWs7CisJICBpZihjMiE9RlJFRVJFRyYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1yKSBicmVhazsKKwkgIGlmKGMyIT1GUkVFUkVHJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJnAyLT5xMi5yZWc9PXIpIGJyZWFrOworCSAgaWYoKGMyPT1BU1NJR058fGMyPT1QVVNIKSYmKCFJU1NDQUxBUihwMi0+dHlwZil8fCF6bWVxdG8ocDItPnEyLnZhbC52bWF4LHNpemV0YWJbcDItPnR5cGYmTlFdKSkpeworCSAgICBpZigocC0+cTEuZmxhZ3MmUkVHKSYmcC0+cTEucmVnPT1iYXNlKQorCSAgICAgIGJyZWFrOworCSAgICBpZigocC0+ei5mbGFncyZSRUcpJiZwLT56LnJlZz09YmFzZSkKKwkgICAgICBicmVhazsKKwkgIH0KKwkgIGlmKGMyIT1DQUxMJiYoYzI8TEFCRUx8fGMyPkJSQSkvKiYmYzIhPUFERFJFU1MqLyl7CisJICAgIGlmKCFwMi0+cTEuYW0mJihwMi0+cTEuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT5xMS5yZWc9PXIpeworCSAgICAgIGlmKG8pIGJyZWFrOworCSAgICAgIG89JnAyLT5xMTsKKwkgICAgfQorCSAgICBpZighcDItPnEyLmFtJiYocDItPnEyLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTIucmVnPT1yKXsKKwkgICAgICBpZihvKSBicmVhazsKKwkgICAgICBvPSZwMi0+cTI7CisJICAgIH0KKwkgICAgaWYoIXAyLT56LmFtJiYocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJnAyLT56LnJlZz09cil7CisJICAgICAgaWYobykgYnJlYWs7CisJICAgICAgbz0mcDItPno7CisJICAgIH0KKwkgIH0KKwkgIGlmKGMyPT1GUkVFUkVHfHwocDItPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyl7CisJICAgIGludCBtOworCSAgICBpZihjMj09RlJFRVJFRykKKwkgICAgICBtPXAyLT5xMS5yZWc7CisJICAgIGVsc2UKKwkgICAgICBtPXAyLT56LnJlZzsKKwkgICAgaWYobT09cil7CisJICAgICAgaWYobyl7CisJCW8tPmFtPWFtPW15bWFsbG9jKHNpemVvZigqYW0pKTsKKwkJYW0tPmZsYWdzPUFNX0lNTV9JTkQ7CisJCWFtLT5iYXNlPWJhc2U7CisJCWFtLT5vZmZzZXQ9em0ybChvZik7CisJCWlmKGlzcmVnKHExKSl7CisJCSAgcC0+Y29kZT1jPU5PUDtwLT5xMS5mbGFncz1wLT5xMi5mbGFncz1wLT56LmZsYWdzPTA7CisJCX1lbHNleworCQkgIHAtPmNvZGU9Yz1BU1NJR047cC0+cTIuZmxhZ3M9MDsKKwkJICBwLT50eXBmPXAtPnR5cGYyO3AtPnEyLnZhbC52bWF4PXNpemV0YWJbcC0+dHlwZjImTlFdOworCQl9CisJICAgICAgfQorCSAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGlmKGMyIT1GUkVFUkVHJiZtPT1iYXNlKSBicmVhazsKKwkgICAgY29udGludWU7CisJICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgLyogVHJ5IHJlZyxyZWcgKi8KKyAgICBpZihjPT1BRERJMlAmJmlzcmVnKHEyKSYmaXNyZWcoeikmJihpc3JlZyhxMSl8fHAtPnEyLnJlZyE9cC0+ei5yZWcpKXsKKyAgICAgIGludCBiYXNlLGlkeDtzdHJ1Y3Qgb2JqICpvOworICAgICAgcj1wLT56LnJlZztpZHg9cC0+cTIucmVnOworICAgICAgaWYoaXNyZWcocTEpKSBiYXNlPXAtPnExLnJlZzsgZWxzZSBiYXNlPXI7CisgICAgICBvPTA7CisgICAgICBmb3IocDI9cC0+bmV4dDtwMjtwMj1wMi0+bmV4dCl7CisgICAgICAgIGMyPXAyLT5jb2RlOworICAgICAgICBpZihjMj09Q0FMTHx8YzI9PUxBQkVMfHwoYzI+PUJFUSYmYzI8PUJSQSkpIGJyZWFrOworICAgICAgICBpZihjMiE9RlJFRVJFRyYmKHAyLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+cTEucmVnPT1yKSBicmVhazsKKyAgICAgICAgaWYoYzIhPUZSRUVSRUcmJihwMi0+cTIuZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PVJFRyYmcDItPnEyLnJlZz09cikgYnJlYWs7CisgICAgICAgIGlmKChwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHJiZwMi0+ei5yZWc9PWlkeCYmaWR4IT1yKSBicmVhazsKKwkKKyAgICAgICAgaWYoYzIhPUNBTEwmJihjMjxMQUJFTHx8YzI+QlJBKS8qJiZjMiE9QUREUkVTUyovKXsKKyAgICAgICAgICBpZighcDItPnExLmFtJiYocDItPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+cTEucmVnPT1yKXsKKyAgICAgICAgICAgIGlmKG98fChxMXR5cChwMikmTlEpIT1DSEFSKSBicmVhazsKKyAgICAgICAgICAgIG89JnAyLT5xMTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYoIXAyLT5xMi5hbSYmKHAyLT5xMi5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcDItPnEyLnJlZz09cil7CisgICAgICAgICAgICBpZihvfHwocTJ0eXAocDIpJk5RKSE9Q0hBUikgYnJlYWs7CisgICAgICAgICAgICBvPSZwMi0+cTI7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKCFwMi0+ei5hbSYmKHAyLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZwMi0+ei5yZWc9PXIpeworICAgICAgICAgICAgaWYob3x8KHp0eXAocDIpJk5RKSE9Q0hBUikgYnJlYWs7CisgICAgICAgICAgICBvPSZwMi0+ejsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoYzI9PUZSRUVSRUd8fChwMi0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09UkVHKXsKKyAgICAgICAgICBpbnQgbTsKKyAgICAgICAgICBpZihjMj09RlJFRVJFRykKKyAgICAgICAgICAgIG09cDItPnExLnJlZzsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBtPXAyLT56LnJlZzsKKyAgICAgICAgICBpZihtPT1yKXsKKyAgICAgICAgICAgIGlmKG8peworICAgICAgICAgICAgICBvLT5hbT1hbT1teW1hbGxvYyhzaXplb2YoKmFtKSk7CisgICAgICAgICAgICAgIGFtLT5mbGFncz1BTV9HUFJfSU5EOworICAgICAgICAgICAgICBhbS0+YmFzZT1iYXNlOworICAgICAgICAgICAgICBhbS0+b2Zmc2V0PWlkeDsKKwkgICAgICBpZihpc3JlZyhxMSkpeworCQlwLT5jb2RlPWM9Tk9QO3AtPnExLmZsYWdzPXAtPnEyLmZsYWdzPXAtPnouZmxhZ3M9MDsKKwkgICAgICB9ZWxzZXsKKwkJcC0+Y29kZT1jPUFTU0lHTjtwLT5xMi5mbGFncz0wOworCQlwLT50eXBmPXAtPnR5cGYyO3AtPnEyLnZhbC52bWF4PXNpemV0YWJbcC0+dHlwZjImTlFdOworCSAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZihjMiE9RlJFRVJFRyYmbT09YmFzZSkgYnJlYWs7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLyogZ2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBlbnRyeSBjb2RlICovCitzdGF0aWMgdm9pZCBmdW5jdGlvbl90b3AoRklMRSAqZixzdHJ1Y3QgVmFyICp2LGxvbmcgb2Zmc2V0KQoreworICBpbnQgaTsKKyAgcnNhdmVzaXplPTA7CisgIGlmKCFzcGVjaWFsX3NlY3Rpb24oZix2KSYmc2VjdGlvbiE9Q09ERSl7ZW1pdChmLGNvZGVuYW1lKTtpZihmKSBzZWN0aW9uPUNPREU7fSAKKyAgZW1pdChmLCJcdC5hbGlnblx0MVxuIik7CisgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisgICAgaWYoKHYtPmZsYWdzJihJTkxJTkVGVU5DfElOTElORUVYVCkpIT1JTkxJTkVGVU5DKQorICAgICAgZW1pdChmLCJcdC5nbG9iYWxcdCVzJXNcbiIsaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgZW1pdChmLCIlcyVzOlxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgfWVsc2UKKyAgICBlbWl0KGYsIiVzJWxkOlxuIixsYWJwcmVmaXgsem0ybCh2LT5vZmZzZXQpKTsKKyAgbGFzdF9zYXZlZD0wOworICBmb3IoaT1yNjtpPHQyO2krKyl7CisgICAgaWYocmVndXNlZFtpXSkKKyAgICAgIGxhc3Rfc2F2ZWQ9aTsKKyAgfQorICBpZihsYXN0X3NhdmVkKXsKKyAgICBlbWl0KGYsIlx0cHVzaFx0JXMtJXMiLHJlZ25hbWVzW3I2XSxyZWduYW1lc1tsYXN0X3NhdmVkXSk7CisgICAgcnNhdmVzaXplPShsYXN0X3NhdmVkLXI2KzEpKjQ7CisgICAgaWYoZnVuY3Rpb25fY2FsbHMpeworICAgICAgZW1pdChmLCIsbHIiKTsKKyAgICAgIHJzYXZlc2l6ZSs9NDsKKyAgICB9CisgICAgZW1pdChmLCJcbiIpOworICB9ZWxzZSBpZihmdW5jdGlvbl9jYWxscyl7CisgICAgZW1pdChmLCJcdHB1c2hcdCVzLSVzLGxyXG4iLHJlZ25hbWVzW3I2XSxyZWduYW1lc1tyNl0pOworICAgIHJzYXZlc2l6ZSs9ODsKKyAgfQorICBpZihvZmZzZXQpeworICAgIGVtaXQoZiwiXHRzdWJcdCVzLCVsZFxuIixyZWduYW1lc1tzcF0sb2Zmc2V0KTsKKyAgfQorfQorLyogZ2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBleGl0IGNvZGUgKi8KK3N0YXRpYyB2b2lkIGZ1bmN0aW9uX2JvdHRvbShGSUxFICpmLHN0cnVjdCBWYXIgKnYsbG9uZyBvZmZzZXQpCit7CisgIGlmKG9mZnNldCl7CisgICAgZW1pdChmLCJcdGFkZFx0JXMsJWxkXG4iLHJlZ25hbWVzW3NwXSxvZmZzZXQpOworICB9CisgIGlmKGxhc3Rfc2F2ZWQpeworICAgIGVtaXQoZiwiXHRwb3BcdCVzLSVzIixyZWduYW1lc1tyNl0scmVnbmFtZXNbbGFzdF9zYXZlZF0pOworICAgIGlmKGZ1bmN0aW9uX2NhbGxzKXsKKyAgICAgIGVtaXQoZiwiLHBjIik7CisgICAgfQorICAgIGVtaXQoZiwiXG4iKTsKKyAgfWVsc2UgaWYoZnVuY3Rpb25fY2FsbHMpeworICAgIGVtaXQoZiwiXHRwb3BcdCVzLSVzLHBjXG4iLHJlZ25hbWVzW3I2XSxyZWduYW1lc1tyNl0pOworICB9ICAKKyAgaWYoIWZ1bmN0aW9uX2NhbGxzKQorICAgIGVtaXQoZixyZXQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBFbmQgb2YgcHJpdmF0ZSBkYXRhIGFuZCBmdW5jdGlvbnMuICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICBEb2VzIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbnMgZm9yIHRoZSBjb2RlLWdlbmVyYXRvci4gR2V0cyBjYWxsZWQgICovCisvKiAgb25jZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCBzaG91bGQgcmV0dXJuIDAgaW4gY2FzZSBvZiBwcm9ibGVtcy4gICAgICAqLworaW50IGluaXRfY2codm9pZCkKK3sKKyAgaW50IGk7CisgIC8qICBJbml0aWFsaXplIHNvbWUgdmFsdWVzIHdoaWNoIGNhbm5vdCBiZSBzdGF0aWNhbGx5IGluaXRpYWxpemVkICAgKi8KKyAgLyogIGJlY2F1c2UgdGhleSBhcmUgc3RvcmVkIGluIHRoZSB0YXJnZXQncyBhcml0aG1ldGljLiAgICAgICAgICAgICAqLworICBtYXhhbGlnbj1sMnptKDRMKTsKKyAgY2hhcl9iaXQ9bDJ6bSg4TCk7CisgIHN0YWNrYWxpZ249bDJ6bSg0KTsKKworICBmb3IoaT0wO2k8PU1BWF9UWVBFO2krKyl7CisgICAgc2l6ZXRhYltpXT1sMnptKG1zaXpldGFiW2ldKTsKKyAgICBhbGlnbltpXT1sMnptKG1hbGlnbltpXSk7CisgIH0KKworICBpZihTSE9SVF9ET1VCTEUpeworICAgIHNpemV0YWJbRE9VQkxFXT1zaXpldGFiW0ZMT0FUXTsKKyAgICBhbGlnbltET1VCTEVdPWFsaWduW0ZMT0FUXTsKKyAgICBzaXpldGFiW0xET1VCTEVdPXNpemV0YWJbRkxPQVRdOworICAgIGFsaWduW0xET1VCTEVdPWFsaWduW0ZMT0FUXTsKKyAgfQorCisgIHJlZ25hbWVzWzBdPSJub3JlZyI7CisgIGZvcihpPTE7aTw9MzI7aSsrKXsKKyAgICByZWduYW1lc1tpXT1teW1hbGxvYygxMCk7CisgICAgc3ByaW50ZihyZWduYW1lc1tpXSwiciVkIixpLTEpOworICAgIHJlZ3NpemVbaV09bDJ6bSg0TCk7CisgICAgcmVndHlwZVtpXT0mbHR5cDsKKyAgfQorICBmb3IoaT0zMztpPD00ODtpKyspeworICAgIHJlZ25hbWVzW2ldPW15bWFsbG9jKDEwKTsKKyAgICBzcHJpbnRmKHJlZ25hbWVzW2ldLCJyJWQvciVkIixpLTMzLGktMzIpOworICAgIHJlZ3NpemVbaV09bDJ6bSg4TCk7CisgICAgcmVndHlwZVtpXT0mbGRibDsKKyAgfQorCisgIC8qICBJbml0aWFsaXplIHRoZSBtaW4vbWF4LXNldHRpbmdzLiBOb3RlIHRoYXQgdGhlIHR5cGVzIG9mIHRoZSAgICAgKi8KKyAgLyogIGhvc3Qgc3lzdGVtIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgdGFyZ2V0IHN5c3RlbSBhbmQgeW91IG1heSAqLworICAvKiAgb25seSB1c2UgdGhlIHNtYWxsZXN0IG1heGltdW0gdmFsdWVzIEFOU0kgZ3VhcmFudGVlcyBpZiB5b3UgICAgICovCisgIC8qICB3YW50IHRvIGJlIHBvcnRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIFRoYXQncyB0aGUgcmVhc29uIGZvciB0aGUgc3VidHJhY3Rpb24gaW4gdF9taW5bSU5UXS4gTG9uZyBjb3VsZCAqLworICAvKiAgYmUgdW5hYmxlIHRvIHJlcHJlc2VudCAtMjE0NzQ4MzY0OCBvbiB0aGUgaG9zdCBzeXN0ZW0uICAgICAgICAgICovCisgIHRfbWluW0NIQVJdPWwyem0oLTEyOEwpOworICB0X21pbltTSE9SVF09bDJ6bSgtMzI3NjhMKTsKKyAgdF9taW5bSU5UXT16bXN1YihsMnptKC0yMTQ3NDgzNjQ3TCksbDJ6bSgxTCkpOworICB0X21pbltMT05HXT10X21pbihJTlQpOworICB0X21pbltMTE9OR109em1sc2hpZnQobDJ6bSgxTCksbDJ6bSg2M0wpKTsKKyAgdF9taW5bTUFYSU5UXT10X21pbihMTE9ORyk7CisgIHRfbWF4W0NIQVJdPXVsMnp1bSgxMjdMKTsKKyAgdF9tYXhbU0hPUlRdPXVsMnp1bSgzMjc2N1VMKTsKKyAgdF9tYXhbSU5UXT11bDJ6dW0oMjE0NzQ4MzY0N1VMKTsKKyAgdF9tYXhbTE9OR109dF9tYXgoSU5UKTsKKyAgdF9tYXhbTExPTkddPXp1bXJzaGlmdCh6dW1rb21wbCh1bDJ6dW0oMFVMKSksdWwyenVtKDFVTCkpOworICB0X21heFtNQVhJTlRdPXRfbWF4KExMT05HKTsKKyAgdHVfbWF4W0NIQVJdPXVsMnp1bSgyNTVVTCk7CisgIHR1X21heFtTSE9SVF09dWwyenVtKDY1NTM1VUwpOworICB0dV9tYXhbSU5UXT11bDJ6dW0oNDI5NDk2NzI5NVVMKTsKKyAgdHVfbWF4W0xPTkddPXRfbWF4KFVOU0lHTkVEfElOVCk7CisgIHR1X21heFtMTE9OR109enVta29tcGwodWwyenVtKDBVTCkpOworICB0dV9tYXhbTUFYSU5UXT10X21heChVTlNJR05FRHxMTE9ORyk7CisgIAorICAvKiAgUmVzZXJ2ZSBhIGZldyByZWdpc3RlcnMgZm9yIHVzZSBieSB0aGUgY29kZS1nZW5lcmF0b3IuICAgICAgKi8KKyAgLyogIFRoaXMgaXMgbm90IG9wdGltYWwgYnV0IHNpbXBsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHJlZ3NhW3QxXT1yZWdzYVt0Ml09MTsKKyAgcmVnc2FbcGNdPXJlZ3NhW2xyXT1yZWdzYVtzcF09cmVnc2Fbc3JdPTE7CisgIHJlZ3NjcmF0Y2hbdDFdPXJlZ3NjcmF0Y2hbdDJdPTA7CisgIHJlZ3NjcmF0Y2hbcGNdPXJlZ3NjcmF0Y2hbbHJdPXJlZ3NjcmF0Y2hbc3BdPXJlZ3NjcmF0Y2hbc3JdPTE7CisKKyAgZm9yKGk9cjE2O2k8PXIzMTtpKyspCisgICAgcmVnc2NyYXRjaFtpXT1yZWdzYVtpXT0xOworICAKKyAgZm9yKGk9MTtpPD02O2krKykKKyAgICByZWdzY3JhdGNoW2ldPTE7CisKKyAgaWYoT05FU0VDKXsKKyAgICBic3NuYW1lPWNvZGVuYW1lOworICAgIGRhdGFuYW1lPWNvZGVuYW1lOworICAgIHJvZGF0YW5hbWU9Y29kZW5hbWU7CisgIH0KKworICBpZihTSE9SVF9ET1VCTEUpIG1hcnJheVsyXT0iX19TSE9SVF9ET1VCTEVfXz0xIjsKKyAgdGFyZ2V0X21hY3Jvcz1tYXJyYXk7CisKKworICBkZWNsYXJlX2J1aWx0aW4oIl9fbXVsaW50NjQiLExMT05HLExMT05HLHIwcjEsTExPTkcscjJyMywxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fYWRkaW50NjQiLExMT05HLExMT05HLHIwcjEsTExPTkcscjJyMywxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fc3ViaW50NjQiLExMT05HLExMT05HLHIwcjEsTExPTkcscjJyMywxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fYW5kaW50NjQiLExMT05HLExMT05HLHIwcjEsTExPTkcscjJyMywxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fb3JpbnQ2NCIsTExPTkcsTExPTkcscjByMSxMTE9ORyxyMnIzLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19lb3JpbnQ2NCIsTExPTkcsTExPTkcscjByMSxMTE9ORyxyMnIzLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19uZWdpbnQ2NCIsTExPTkcsTExPTkcscjByMSwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2xzbGludDY0IixMTE9ORyxMTE9ORyxyMHIxLElOVCxyMiwxLDApOworCisgIGRlY2xhcmVfYnVpbHRpbigiX19kaXZzaW50NjQiLExMT05HLExMT05HLHIwcjEsTExPTkcscjJyMywxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZGl2dWludDY0IixVTlNJR05FRHxMTE9ORyxVTlNJR05FRHxMTE9ORyxyMHIxLFVOU0lHTkVEfExMT05HLHIycjMsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX21vZHNpbnQ2NCIsTExPTkcsTExPTkcscjByMSxMTE9ORyxyMnIzLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19tb2R1aW50NjQiLFVOU0lHTkVEfExMT05HLFVOU0lHTkVEfExMT05HLHIwcjEsVU5TSUdORUR8TExPTkcscjJyMywxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbHNyc2ludDY0IixMTE9ORyxMTE9ORyxyMHIxLElOVCxyMiwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fbHNydWludDY0IixVTlNJR05FRHxMTE9ORyxVTlNJR05FRHxMTE9ORyxyMHIxLElOVCxyMiwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fY21wc2ludDY0IixJTlQsTExPTkcscjByMSxMTE9ORyxyMnIzLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19jbXB1aW50NjQiLElOVCxVTlNJR05FRHxMTE9ORyxyMHIxLFVOU0lHTkVEfExMT05HLHIycjMsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3NpbnQ2NHRvZmx0MzIiLEZMT0FULExMT05HLHIwcjEsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX191aW50NjR0b2ZsdDMyIixGTE9BVCxVTlNJR05FRHxMTE9ORyxyMHIxLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fc2ludDY0dG9mbHQ2NCIsTERPVUJMRSxMTE9ORyxyMHIxLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fdWludDY0dG9mbHQ2NCIsTERPVUJMRSxVTlNJR05FRHxMTE9ORyxyMHIxLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0MzJ0b3NpbnQ2NCIsTExPTkcsRkxPQVQscjAsMCwwLDEsMCk7CisgIGRlY2xhcmVfYnVpbHRpbigiX19mbHQzMnRvdWludDY0IixVTlNJR05FRHxMTE9ORyxGTE9BVCxyMCwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDY0dG9zaW50NjQiLExMT05HLExET1VCTEUscjByMSwwLDAsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2ZsdDY0dG91aW50NjQiLFVOU0lHTkVEfExMT05HLExET1VCTEUscjByMSwwLDAsMSwwKTsKKworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0MzJ0b2ZsdDY0IixMRE9VQkxFLEZMT0FULHIwLDAsMCwxLDApOworICBkZWNsYXJlX2J1aWx0aW4oIl9fZmx0NjR0b2ZsdDMyIixGTE9BVCxMRE9VQkxFLHIwcjEsMCwwLDEsMCk7CisKKyAgZGVjbGFyZV9idWlsdGluKCJfX2FkZGZsdDY0IixMRE9VQkxFLExET1VCTEUscjByMSxMRE9VQkxFLHIycjMsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX3N1YmZsdDY0IixMRE9VQkxFLExET1VCTEUscjByMSxMRE9VQkxFLHIycjMsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX211bGZsdDY0IixMRE9VQkxFLExET1VCTEUscjByMSxMRE9VQkxFLHIycjMsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2RpdmZsdDY0IixMRE9VQkxFLExET1VCTEUscjByMSxMRE9VQkxFLHIycjMsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX25lZ2ZsdDY0IixMRE9VQkxFLExET1VCTEUscjByMSxMRE9VQkxFLHIycjMsMSwwKTsKKyAgZGVjbGFyZV9idWlsdGluKCJfX2NtcGZsdDY0IixJTlQsTERPVUJMRSxyMHIxLExET1VCTEUscjJyMywxLDApOworCisKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgaW5pdF9kYihGSUxFICpmKQoreworfQorCitpbnQgZnJldHVybihzdHJ1Y3QgVHlwICp0KQorLyogIFJldHVybnMgdGhlIHJlZ2lzdGVyIGluIHdoaWNoIHZhcmlhYmxlcyBvZiB0eXBlIHQgYXJlIHJldHVybmVkLiAqLworLyogIElmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgcmV0dXJuZWQgaW4gYSByZWdpc3RlciByZXR1cm5zIDAuICAgICAgICAqLworLyogIEEgcG9pbnRlciBNVVNUIGJlIHJldHVybmVkIGluIGEgcmVnaXN0ZXIuIFRoZSBjb2RlLWdlbmVyYXRvciAgICAqLworLyogIGhhcyB0byBzaW11bGF0ZSBhIHBzZXVkbyByZWdpc3RlciBpZiBuZWNlc3NhcnkuICAgICAgICAgICAgICAgICAqLworeworICBpZihTSE9SVF9ET1VCTEUmJklTRkxPQVQodC0+ZmxhZ3MpKSByZXR1cm4gcjA7CisgIGlmKElTU1RSVUNUKHQtPmZsYWdzKXx8SVNVTklPTih0LT5mbGFncykpIAorICAgIHJldHVybiAwOworICBpZih6bWxlcShzem9mKHQpLGwyem0oNEwpKSkgCisgICAgcmV0dXJuIHIwOworICBpZih6bWVxdG8oc3pvZih0KSxsMnptKDhMKSkpIAorICAgIHJldHVybiByMHIxOworICByZXR1cm4gMDsKK30KKworaW50IHJlZ19wYWlyKGludCByLHN0cnVjdCBycGFpciAqcCkKKy8qIFJldHVybnMgMCBpZiB0aGUgcmVnaXN0ZXIgaXMgbm8gcmVnaXN0ZXIgcGFpci4gSWYgciAgKi8KKy8qIGlzIGEgcmVnaXN0ZXIgcGFpciBub24temVybyB3aWxsIGJlIHJldHVybmVkIGFuZCB0aGUgKi8KKy8qIHN0cnVjdHVyZSBwb2ludGVkIHRvIHAgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgdHdvICAgKi8KKy8qIGVsZW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYocj49cjByMSYmcjw9cjMwcjMxKXsKKyAgICBwLT5yMT0oci1yMHIxKSoyK3IwOworICAgIHAtPnIyPShyLXIwcjEpKjIrcjE7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIGVzdGltYXRlIHRoZSBjb3N0LXNhdmluZyBpZiBvYmplY3QgbyBmcm9tIElDIHAgaXMgcGxhY2VkIGluCisgICByZWdpc3RlciByICovCitpbnQgY29zdF9zYXZpbmdzKHN0cnVjdCBJQyAqcCxpbnQgcixzdHJ1Y3Qgb2JqICpvKQoreworICBpbnQgYz1wLT5jb2RlOworICBpZihvLT5mbGFncyZWS09OU1QpeworICAgIHJldHVybiAwOworICB9CisgIGlmKG8tPmZsYWdzJkRSRUZPQkopCisgICAgcmV0dXJuIDQ7CisgIGlmKGM9PVNFVFJFVFVSTiYmcj09cC0+ei5yZWcmJiEoby0+ZmxhZ3MmRFJFRk9CSikpIHJldHVybiAzOworICBpZihjPT1HRVRSRVRVUk4mJnI9PXAtPnExLnJlZyYmIShvLT5mbGFncyZEUkVGT0JKKSkgcmV0dXJuIDM7CisgIHJldHVybiAyOworfQorCitpbnQgcmVnb2soaW50IHIsaW50IHQsaW50IG1vZGUpCisvKiAgUmV0dXJucyAwIGlmIHJlZ2lzdGVyIHIgY2Fubm90IHN0b3JlIHZhcmlhYmxlcyBvZiAgICovCisvKiAgdHlwZSB0LiBJZiB0PT1QT0lOVEVSIGFuZCBtb2RlIT0wIHRoZW4gaXQgcmV0dXJucyAgICovCisvKiAgbm9uLXplcm8gb25seSBpZiB0aGUgcmVnaXN0ZXIgY2FuIHN0b3JlIGEgcG9pbnRlciAgICovCisvKiAgYW5kIGRlcmVmZXJlbmNlIGEgcG9pbnRlciB0byBtb2RlLiAgICAgICAgICAgICAgICAgICovCit7CisgIGlmKHI9PTApCisgICAgcmV0dXJuIDA7CisgIHQmPU5ROworICBpZihJU0lOVCh0KXx8SVNGTE9BVCh0KXx8SVNQT0lOVEVSKHQpKXsKKyAgICBpZih6bWVxdG8oc2l6ZXRhYlt0XSxsMnptKDhMKSkpeworICAgICAgaWYocj49cjByMSYmcjw9cjMwcjMxKQorCXJldHVybiAxOworICAgICAgZWxzZQorCXJldHVybiAwOworICAgIH0KKyAgICBpZihyPj1yMCYmcjw9cjMxKQorICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBkYW5nZXJvdXNfSUMoc3RydWN0IElDICpwKQorLyogIFJldHVybnMgemVybyBpZiB0aGUgSUMgcCBjYW4gYmUgc2FmZWx5IGV4ZWN1dGVkICAgICAqLworLyogIHdpdGhvdXQgZGFuZ2VyIG9mIGV4Y2VwdGlvbnMgb3Igc2ltaWxhciB0aGluZ3MuICAgICAqLworLyogIHZiY2MgbWF5IGdlbmVyYXRlIGNvZGUgaW4gd2hpY2ggbm9uLWRhbmdlcm91cyBJQ3MgICAqLworLyogIGFyZSBzb21ldGltZXMgZXhlY3V0ZWQgYWx0aG91Z2ggY29udHJvbC1mbG93IG1heSAgICAqLworLyogIG5ldmVyIHJlYWNoIHRoZW0gKG1haW5seSB3aGVuIG1vdmluZyBjb21wdXRhdGlvbnMgICAqLworLyogIG91dCBvZiBsb29wcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFR5cGljYWwgSUNzIHRoYXQgZ2VuZXJhdGUgZXhjZXB0aW9ucyBvbiBzb21lICAgICAgICAqLworLyogIG1hY2hpbmVzIGFyZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtIGFjY2Vzc2VzIHZpYSBwb2ludGVycyAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtIGRpdmlzaW9uL21vZHVsbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtIG92ZXJmbG93IG9uIHNpZ25lZCBpbnRlZ2VyL2Zsb2F0cyAgICAgICAgICAgICAqLworeworICBpbnQgYz1wLT5jb2RlOworICBpZigocC0+cTEuZmxhZ3MmRFJFRk9CSil8fChwLT5xMi5mbGFncyZEUkVGT0JKKXx8KHAtPnouZmxhZ3MmRFJFRk9CSikpCisgICAgcmV0dXJuIDE7CisgIGlmKChjPT1ESVZ8fGM9PU1PRCkmJiFpc2NvbnN0KHEyKSkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBtdXN0X2NvbnZlcnQoaW50IG8saW50IHQsaW50IGNvbnN0X2V4cHIpCisvKiAgUmV0dXJucyB6ZXJvIGlmIGNvZGUgZm9yIGNvbnZlcnRpbmcgbnAgdG8gdHlwZSB0ICAgICovCisvKiAgY2FuIGJlIG9taXR0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgT24gdGhlIFZpZGVDb3JlIElWIHBvaW50ZXJzIGFuZCAzMmJpdCAgICAgICAgICAgICAgICovCisvKiAgaW50ZWdlcnMgaGF2ZSB0aGUgc2FtZSByZXByZXNlbnRhdGlvbiBhbmQgY2FuIHVzZSAgICovCisvKiAgdGhlIHNhbWUgcmVnaXN0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBvcD1vJk5RLHRwPXQmTlE7CisgIGlmKFNIT1JUX0RPVUJMRSl7CisgICAgaWYob3A9PURPVUJMRXx8b3A9PUxET1VCTEUpIG9wPUZMT0FUOworICAgIGlmKHRwPT1ET1VCTEV8fHRwPT1MRE9VQkxFKSB0cD1GTE9BVDsKKyAgfQorICBpZigob3A9PUlOVHx8b3A9PUxPTkd8fG9wPT1QT0lOVEVSKSYmKHRwPT1JTlR8fHRwPT1MT05HfHx0cD09UE9JTlRFUikpCisgICAgcmV0dXJuIDA7CisgIGlmKG9wPT1GTE9BVCYmdHA9PUZMT0FUKSByZXR1cm4gMDsKKyAgaWYob3A9PURPVUJMRSYmdHA9PUxET1VCTEUpIHJldHVybiAwOworICBpZihvcD09TERPVUJMRSYmdHA9PURPVUJMRSkgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCit2b2lkIGdlbl9kcyhGSUxFICpmLHptYXggc2l6ZSxzdHJ1Y3QgVHlwICp0KQorLyogIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGNyZWF0ZSA8c2l6ZT4gYnl0ZXMgb2Ygc3RvcmFnZSAqLworLyogIGluaXRpYWxpemVkIHdpdGggemVyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpZihuZXdvYmomJiFPTkVTRUMmJnNlY3Rpb24hPVNQRUNJQUwpCisgICAgZW1pdChmLCIlbGRcbiIsem0ybChzaXplKSk7CisgIGVsc2UKKyAgICBlbWl0KGYsIlx0LnNwYWNlXHQlbGRcbiIsem0ybChzaXplKSk7CisgIG5ld29iaj0wOworfQorCit2b2lkIGdlbl9hbGlnbihGSUxFICpmLHptYXggYWxpZ24pCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gbWFrZSBzdXJlIHRoZSBuZXh0IGRhdGEgaXMgICAgICovCisvKiAgYWxpZ25lZCB0byBtdWx0aXBsZXMgb2YgPGFsaWduPiBieXRlcy4gICAgICAgICAgICAgICovCit7CisgIGlmKHptMmwoYWxpZ24pPjEpIGVtaXQoZiwiXHQuYWxpZ25cdDJcbiIpOworfQorCit2b2lkIGdlbl92YXJfaGVhZChGSUxFICpmLHN0cnVjdCBWYXIgKnYpCisvKiAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gY3JlYXRlIHRoZSBoZWFkIG9mIGEgdmFyaWFibGUgICovCisvKiAgZGVmaW5pdGlvbiwgaS5lLiB0aGUgbGFiZWwgYW5kIGluZm9ybWF0aW9uIGZvciAgICAgICovCisvKiAgbGlua2FnZSBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBjb25zdGZsYWc7Y2hhciAqc2VjOworICBpZih2LT5jbGlzdCkgY29uc3RmbGFnPWlzX2NvbnN0KHYtPnZ0eXApOworICBpZih2LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpeworICAgIGlmKElTRlVOQyh2LT52dHlwLT5mbGFncykpIHJldHVybjsKKyAgICBpZighc3BlY2lhbF9zZWN0aW9uKGYsdikpeworICAgICAgaWYodi0+Y2xpc3QmJighY29uc3RmbGFnfHwoZ19mbGFnc1syXSZVU0VERkxBRykpJiZzZWN0aW9uIT1EQVRBKXtlbWl0KGYsZGF0YW5hbWUpO2lmKGYpIHNlY3Rpb249REFUQTt9CisgICAgICBpZih2LT5jbGlzdCYmY29uc3RmbGFnJiYhKGdfZmxhZ3NbMl0mVVNFREZMQUcpJiZzZWN0aW9uIT1ST0RBVEEpe2VtaXQoZixyb2RhdGFuYW1lKTtpZihmKSBzZWN0aW9uPVJPREFUQTt9CisgICAgICBpZighdi0+Y2xpc3QmJnNlY3Rpb24hPUJTUyl7ZW1pdChmLGJzc25hbWUpO2lmKGYpIHNlY3Rpb249QlNTO30KKyAgICB9CisgICAgaWYodi0+Y2xpc3R8fE9ORVNFQ3x8c2VjdGlvbj09U1BFQ0lBTCl7CisgICAgICBnZW5fYWxpZ24oZixmYWxpZ24odi0+dnR5cCkpOworICAgICAgZW1pdChmLCIlcyVsZDpcbiIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgfWVsc2UKKyAgICAgIGVtaXQoZiwiXHQubGNvbW1cdCVzJWxkLCIsbGFicHJlZml4LHptMmwodi0+b2Zmc2V0KSk7CisgICAgbmV3b2JqPTE7CisgIH0KKyAgaWYodi0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKKyAgICBlbWl0KGYsIlx0Lmdsb2JhbFx0JXMlc1xuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICBpZih2LT5mbGFncyYoREVGSU5FRHxURU5UQVRJVkUpKXsKKyAgICAgIGlmKCFzcGVjaWFsX3NlY3Rpb24oZix2KSl7CisJaWYodi0+Y2xpc3QmJighY29uc3RmbGFnfHwoZ19mbGFnc1syXSZVU0VERkxBRykpJiZzZWN0aW9uIT1EQVRBKXtlbWl0KGYsZGF0YW5hbWUpO2lmKGYpIHNlY3Rpb249REFUQTt9CisJaWYodi0+Y2xpc3QmJmNvbnN0ZmxhZyYmIShnX2ZsYWdzWzJdJlVTRURGTEFHKSYmc2VjdGlvbiE9Uk9EQVRBKXtlbWl0KGYscm9kYXRhbmFtZSk7aWYoZikgc2VjdGlvbj1ST0RBVEE7fQorCWlmKCF2LT5jbGlzdCYmc2VjdGlvbiE9QlNTKXtlbWl0KGYsYnNzbmFtZSk7aWYoZikgc2VjdGlvbj1CU1M7fQorICAgICAgfQorICAgICAgaWYodi0+Y2xpc3R8fE9ORVNFQ3x8c2VjdGlvbj09U1BFQ0lBTCl7CisJZ2VuX2FsaWduKGYsZmFsaWduKHYtPnZ0eXApKTsKKyAgICAgICAgZW1pdChmLCIlcyVzOlxuIixpZHByZWZpeCx2LT5pZGVudGlmaWVyKTsKKyAgICAgIH1lbHNlCisgICAgICAgIGVtaXQoZiwiXHQuJXNjb21tXHQlcyVzLCIsKFVTRV9DT01NT05TPyIiOiJsIiksaWRwcmVmaXgsdi0+aWRlbnRpZmllcik7CisgICAgICBuZXdvYmo9MTsKKyAgICB9CisgIH0KK30KKwordm9pZCBnZW5fZGMoRklMRSAqZixpbnQgdCxzdHJ1Y3QgY29uc3RfbGlzdCAqcCkKKy8qICBUaGlzIGZ1bmN0aW9uIGhhcyB0byBjcmVhdGUgc3RhdGljIHN0b3JhZ2UgICAgICAgICAgKi8KKy8qICBpbml0aWFsaXplZCB3aXRoIGNvbnN0LWxpc3QgcC4gICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYoKHQmTlEpPT1QT0lOVEVSKSB0PVVOU0lHTkVEfExPTkc7CisgIGVtaXQoZiwiXHQuJXNcdCIsZGN0W3QmTlFdKTsKKyAgaWYoIXAtPnRyZWUpeworICAgIGlmKElTRkxPQVQodCkpeworICAgICAgLyogIGF1Y2ggd2llZGVyIG5pY2h0IHNlaHIgc2Nob2VuIHVuZCBJRUVFIG5vZXRpZyAgICovCisgICAgICB1bnNpZ25lZCBjaGFyICppcDsKKyAgICAgIGlmKFNIT1JUX0RPVUJMRSl7CisJZXZhbF9jb25zdCgmcC0+dmFsLHQpOworCWlwPSh1bnNpZ25lZCBjaGFyICopJnZmbG9hdDsKKwl0PUZMT0FUOworICAgICAgfWVsc2UKKwlpcD0odW5zaWduZWQgY2hhciAqKSZwLT52YWwudmRvdWJsZTsKKyAgICAgIGVtaXQoZiwiMHglMDJ4JTAyeCUwMnglMDJ4IixpcFswXSxpcFsxXSxpcFsyXSxpcFszXSk7CisgICAgICBpZigodCZOUSkhPUZMT0FUKXsKKyAgICAgICAgZW1pdChmLCIsMHglMDJ4JTAyeCUwMnglMDJ4IixpcFs0XSxpcFs1XSxpcFs2XSxpcFs3XSk7CisgICAgICB9CisgICAgfWVsc2UgaWYoKHQmTlEpPT1MTE9ORyl7CisgICAgICB6dW1heCB0bXA7CisgICAgICBldmFsX2NvbnN0KCZwLT52YWwsdCk7CisgICAgICB0bXA9dnVtYXg7CisgICAgICB2dW1heD16dW1hbmQoenVtcnNoaWZ0KHZ1bWF4LHVsMnp1bSgzMlVMKSksdWwyenVtKDB4ZmZmZmZmZmYpKTsgCisgICAgICBndmFsLnZ1bG9uZz16dW0yenVsKHZ1bWF4KTsKKyAgICAgIGVtaXR2YWwoZiwmZ3ZhbCxVTlNJR05FRHxMT05HKTsKKyAgICAgIGVtaXQoZiwiLCIpOworICAgICAgdnVtYXg9enVtYW5kKHRtcCx1bDJ6dW0oMHhmZmZmZmZmZikpOyAKKyAgICAgIGd2YWwudnVsb25nPXp1bTJ6dWwodnVtYXgpOworICAgICAgZW1pdHZhbChmLCZndmFsLFVOU0lHTkVEfExPTkcpOworICAgIH1lbHNleworICAgICAgZW1pdHZhbChmLCZwLT52YWwsdCZOVSk7CisgICAgfQorICB9ZWxzZXsKKyAgICBub19zdWZmaXg9MTsKKyAgICBlbWl0X29iaihmLCZwLT50cmVlLT5vLHQmTlUpOworICAgIG5vX3N1ZmZpeD0wOworICB9CisgIGVtaXQoZiwiXG4iKTtuZXdvYmo9MDsKK30KKworCisvKiAgVGhlIG1haW4gY29kZS1nZW5lcmF0aW9uIHJvdXRpbmUuICAgICAgICAgICAgICAgICAgICovCisvKiAgZiBpcyB0aGUgc3RyZWFtIHRoZSBjb2RlIHNob3VsZCBiZSB3cml0dGVuIHRvLiAgICAgICovCisvKiAgcCBpcyBhIHBvaW50ZXIgdG8gYSBkb3VibHkgbGlua2VkIGxpc3Qgb2YgSUNzICAgICAgICovCisvKiAgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gYm9keSB0byBnZW5lcmF0ZSBjb2RlIGZvci4gICovCisvKiAgdiBpcyBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb2Zmc2V0IGlzIHRoZSBzaXplIG9mIHRoZSBzdGFja2ZyYW1lIHRoZSBmdW5jdGlvbiAgICovCisvKiAgbmVlZHMgZm9yIGxvY2FsIHZhcmlhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3ZvaWQgZ2VuX2NvZGUoRklMRSAqZixzdHJ1Y3QgSUMgKnAsc3RydWN0IFZhciAqdix6bWF4IG9mZnNldCkKKy8qICBUaGUgbWFpbiBjb2RlLWdlbmVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGludCBjLHQsaSxsYXN0Y29tcDsKKyAgaW50IHExd2FzcmVnLHEyd2FzcmVnLHp3YXNyZWc7CisgIHN0cnVjdCBJQyAqbTsKKyAgYXJnc2l6ZT0wOworICBpZihERUJVRyYxKSBwcmludGYoImdlbl9jb2RlKClcbiIpOworICBmb3IoYz0xO2M8PU1BWFI7YysrKSByZWdzW2NdPXJlZ3NhW2NdOworICBzdGFja29mZnNldD1ub3Rwb3BwZWQ9ZG9udHBvcD1tYXhwdXNoZWQ9MDsKKworCisgIC8qRklYTUUqLworICByZXQ9Ilx0cnRzXG4iOworCisgIGNjPSIiOworCisgIGZvcihtPXA7bTttPW0tPm5leHQpeworICAgIGM9bS0+Y29kZTt0PW0tPnR5cGYmTlU7CisgICAgaWYoYz09QUxMT0NSRUcpIHtyZWdzW20tPnExLnJlZ109MTtjb250aW51ZTt9CisgICAgaWYoYz09RlJFRVJFRykge3JlZ3NbbS0+cTEucmVnXT0wO2NvbnRpbnVlO30KKworICAgIGlmKG5vdHBvcHBlZCYmIWRvbnRwb3ApeworICAgICAgaW50IGZsYWc9MDsKKyAgICAgIGlmKGM9PUxBQkVMfHxjPT1DT01QQVJFfHxjPT1URVNUfHxjPT1CUkEpeworICAgICAgICBlbWl0KGYsIlx0YWRkXHQlcywlbGRcbiIscmVnbmFtZXNbc3BdLG5vdHBvcHBlZCk7CisgICAgICAgIHBvcChub3Rwb3BwZWQpO25vdHBvcHBlZD0wOworICAgICAgfQorICAgIH0KKworCisgICAgLyogY29udmVydCBNVUxUL0RJVi9NT0Qgd2l0aCBwb3dlcnMgb2YgdHdvICovCisgICAgaWYoKHQmTlEpPD1MT05HJiYobS0+cTIuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QmJih0Jk5RKTw9TE9ORyYmKGM9PU1VTFR8fCgoYz09RElWfHxjPT1NT0QpJiYodCZVTlNJR05FRCkpKSl7CisgICAgICBldmFsX2NvbnN0KCZtLT5xMi52YWwsdCk7CisgICAgICBpPXBvZjIodm1heCk7CisgICAgICBpZihpKXsKKyAgICAgICAgaWYoYz09TU9EKXsKKyAgICAgICAgICB2bWF4PXptc3ViKHZtYXgsbDJ6bSgxTCkpOworICAgICAgICAgIG0tPmNvZGU9QU5EOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICB2bWF4PWwyem0oaS0xKTsKKyAgICAgICAgICBpZihjPT1ESVYpIG0tPmNvZGU9UlNISUZUOyBlbHNlIG0tPmNvZGU9TFNISUZUOworICAgICAgICB9CisgICAgICAgIGM9bS0+Y29kZTsKKwlndmFsLnZtYXg9dm1heDsKKwlldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CisJaWYoYz09QU5EKXsKKwkgIGluc2VydF9jb25zdCgmbS0+cTIudmFsLHQpOworCX1lbHNleworCSAgaW5zZXJ0X2NvbnN0KCZtLT5xMi52YWwsSU5UKTsKKwkgIHAtPnR5cGYyPUlOVDsKKwl9CisgICAgICB9CisgICAgfQorICAgIGlmKGM9PUNBTEwmJmFyZ3NpemU8em0ybChtLT5xMi52YWwudm1heCkpIGFyZ3NpemU9em0ybChtLT5xMi52YWwudm1heCk7CisgIH0KKyAgcGVlcGhvbGUocCk7CisKKyAgZm9yKGM9MTtjPD1NQVhSO2MrKyl7CisgICAgaWYocmVnc2FbY118fHJlZ3VzZWRbY10peworICAgICAgQlNFVChyZWdzX21vZGlmaWVkLGMpOworICAgIH0KKyAgfQorCisgIGxvY2Fsc2l6ZT0oem0ybChvZmZzZXQpKzMpLzQqNDsKKyNpZiBGSVhFRF9TUAorICAvKkZJWE1FOiBhZGp1c3QgbG9jYWxzaXplIHRvIGdldCBhbiBhbGlnbmVkIHN0YWNrLWZyYW1lICovCisjZW5kaWYKKworICBmdW5jdGlvbl90b3AoZix2LGxvY2Fsc2l6ZSk7CisKKyAgZm9yKDtwO3A9cC0+bmV4dCl7CisgICAgYz1wLT5jb2RlO3Q9cC0+dHlwZjsKKyAgICBpZihjPT1OT1ApIHtwLT56LmZsYWdzPTA7Y29udGludWU7fQorICAgIGlmKGM9PUFMTE9DUkVHKSB7cmVnc1twLT5xMS5yZWddPTE7Y29udGludWU7fQorICAgIGlmKGM9PUZSRUVSRUcpIHtyZWdzW3AtPnExLnJlZ109MDtjb250aW51ZTt9CisKKyAgICBpZihERUJVRyYyNTYpe2VtaXQoZiwiIyAiKTsgcHJpYzIoZixwKTt9CisgICAgaWYoREVCVUcmNTEyKSBlbWl0KGYsIiMgc3RhY2tvZmZzZXQ9JWxkLCBub3Rwb3BwZWQ9JWxkLCBkb250cG9wPSVsZFxuIixzdGFja29mZnNldCxub3Rwb3BwZWQsZG9udHBvcCk7CisgICAgaWYobm90cG9wcGVkJiYhZG9udHBvcCl7CisgICAgICBpbnQgZmxhZz0wOworICAgICAgaWYoYz09TEFCRUx8fGM9PUNPTVBBUkV8fGM9PVRFU1R8fGM9PUJSQSl7CisgICAgICAgIGVtaXQoZiwiXHRhZGRcdCVzLCVsZFxuIixyZWduYW1lc1tzcF0sbm90cG9wcGVkKTsKKyAgICAgICAgcG9wKG5vdHBvcHBlZCk7bm90cG9wcGVkPTA7CisgICAgICB9CisgICAgfQorCisgICAgaWYoYz09TEFCRUwpIHtlbWl0KGYsIiVzJWQ6XG4iLGxhYnByZWZpeCx0KTtjb250aW51ZTt9CisgICAgaWYoYz09QlJBKXsKKyAgICAgIGlmKDAvKnQ9PWV4aXRfbGFiZWwmJmZyYW1lc2l6ZT09MCovKQorCWVtaXQoZixyZXQpOworICAgICAgZWxzZQorCWVtaXQoZiwiXHRiXHQlcyVkXG4iLGxhYnByZWZpeCx0KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPj1CRVEmJmM8QlJBKXsKKyAgICAgIGlmKGxhc3Rjb21wJlVOU0lHTkVEKQorCWVtaXQoZiwiXHRiJXNcdCIsY2N1W2MtQkVRXSk7CisgICAgICBlbHNlCisJZW1pdChmLCJcdGIlc1x0IixjY3NbYy1CRVFdKTsKKyAgICAgIGlmKGlzcmVnKHExKSl7CisJZW1pdF9vYmooZiwmcC0+cTEsMCk7CisJZW1pdChmLCIsIik7CisgICAgICB9CisgICAgICBlbWl0KGYsIiVzJWRcbiIsbGFicHJlZml4LHQpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PU1PVkVUT1JFRyl7CisgICAgICBsb2FkX3JlZyhmLHAtPnoucmVnLCZwLT5xMSxyZWd0eXBlW3AtPnoucmVnXS0+ZmxhZ3MpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PU1PVkVGUk9NUkVHKXsKKyAgICAgIHN0b3JlX3JlZyhmLHAtPnExLnJlZywmcC0+eixyZWd0eXBlW3AtPnExLnJlZ10tPmZsYWdzKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1QVVNIKQorICAgICAgZG9udHBvcCs9em0ybChwLT5xMi52YWwudm1heCk7CisgICAgaWYoKGM9PUFTU0lHTnx8Yz09UFVTSCkmJigodCZOUSk+UE9JTlRFUnx8KCh0Jk5RKT09Q0hBUiYmem0ybChwLT5xMi52YWwudm1heCkhPTEpKSl7CisgICAgICBpbnQgaSxjbnQsdW5pdCxsYWIsdHJlZyxhY250PTAsYXRyZWc9MDsKKyAgICAgIGxvbmcgc2l6ZTsKKyAgICAgIGNoYXIgKnV0OworICAgICAgaWYoKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopJiZyZWdfaXNfc2NyYXRjaGVkKHAscC0+cTEucmVnKSl7CisJcTFyZWc9cC0+cTEucmVnOworCWlmKHAtPnExLmFtKSBpZXJyb3IoMCk7CisgICAgICB9ZWxzZXsKKwlxMXJlZz10MTsKKwlpZihwLT5xMS5mbGFncyYoUkVHfERSRUZPQkopKXsKKwkgIHAtPnExLmZsYWdzJj1+RFJFRk9CSjsKKwkgIGxvYWRfcmVnKGYscTFyZWcsJnAtPnExLFBPSU5URVIpOworCX1lbHNlCisJICBsb2FkX2FkZHJlc3MoZixxMXJlZywmcC0+cTEsUE9JTlRFUik7CisgICAgICB9CisgICAgICBpZigocC0+ei5mbGFncyYoUkVHfERSRUZPQkopKT09KFJFR3xEUkVGT0JKKSYmcmVnX2lzX3NjcmF0Y2hlZChwLHAtPnoucmVnKSl7CisJenJlZz1wLT56LnJlZzsKKwlpZihwLT56LmFtKSBpZXJyb3IoMCk7CisgICAgICB9ZWxzZSBpZihjPT1QVVNIKXsKKwl6cmVnPXNwOworICAgICAgfWVsc2V7CisJaWYocTFyZWc9PXQxKQorCSAgenJlZz10MjsKKwllbHNlCisJICB6cmVnPXQxOworCWlmKHAtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSl7CisJICBwLT56LmZsYWdzJj1+RFJFRk9CSjsKKwkgIGxvYWRfcmVnKGYsenJlZywmcC0+eixQT0lOVEVSKTsKKwl9ZWxzZQorCSAgbG9hZF9hZGRyZXNzKGYsenJlZywmcC0+eixQT0lOVEVSKTsKKyAgICAgIH0gICAgICAKKyAgICAgIGlmKHpyZWc9PXQyKXsKKwl0cmVnPWdldF9yZWcoZixwKTsKKwlhdHJlZz0xOworICAgICAgfWVsc2UgaWYoenJlZz09dDF8fHExcmVnPT10MSkKKwl0cmVnPXQyOworICAgICAgZWxzZQorCXRyZWc9dDE7CisKKyAgICAgIHVuaXQ9MTt1dD0iYiI7CisgICAgICBzaXplPXptMmwocC0+cTIudmFsLnZtYXgpOworCisgICAgICBpZihjPT1QVVNIKQorCWVtaXQoZiwiXHRhZGRcdCVzLCVsZFxuIixyZWduYW1lc1txMXJlZ10sc2l6ZSk7CisKKyAgICAgIGlmKHNpemUvdW5pdD49OCl7CisJaWYodHJlZyE9dDImJnpyZWchPXQyKQorCSAgY250PXQyOworCWVsc2V7CisJICBjbnQ9Z2V0X3JlZyhmLHApOworCSAgYWNudD0xOworCX0KKwllbWl0KGYsIlx0bW92XHQlcywlbGRcbiIscmVnbmFtZXNbY250XSwoc2l6ZS91bml0KT4+Mik7CisJZW1pdChmLCIlcyVkOlxuIixsYWJwcmVmaXgsKytsYWJlbCk7CisgICAgICB9CisKKyAgICAgIGZvcihpPTA7aTwoKHNpemUvdW5pdD40KT80OnNpemUvdW5pdCk7aSsrKXsKKwlpZihjIT1QVVNIKXsKKwkgIGVtaXQoZiwiXHRsZCVzXHQlcywoJXMpKytcbiIsdXQscmVnbmFtZXNbdHJlZ10scmVnbmFtZXNbcTFyZWddKTsKKwkgIGVtaXQoZiwiXHRzdCVzXHQlcywoJXMpKytcbiIsdXQscmVnbmFtZXNbdHJlZ10scmVnbmFtZXNbenJlZ10pOworCX1lbHNleworCSAgZW1pdChmLCJcdGxkJXNcdCVzLC0tKCVzKVxuIix1dCxyZWduYW1lc1t0cmVnXSxyZWduYW1lc1txMXJlZ10pOworCSAgZW1pdChmLCJcdHN0JXNcdCVzLC0tKCVzKVxuIix1dCxyZWduYW1lc1t0cmVnXSxyZWduYW1lc1t6cmVnXSk7CisJfQorICAgICAgfQorICAgICAgaWYoc2l6ZS91bml0Pj04KXsKKwllbWl0KGYsIlx0YWRkY21wYm5lXHQlcywtMSwwLCVzJWRcbiIscmVnbmFtZXNbY250XSxsYWJwcmVmaXgsbGFiZWwpOworICAgICAgfQorICAgICAgZm9yKGk9MDtpPCgoc2l6ZS91bml0KSYzKTtpKyspeworCWlmKGMhPVBVU0gpeworCSAgZW1pdChmLCJcdGxkJXNcdCVzLCglcykrK1xuIix1dCxyZWduYW1lc1t0cmVnXSxyZWduYW1lc1txMXJlZ10pOworCSAgZW1pdChmLCJcdHN0JXNcdCVzLCglcykrK1xuIix1dCxyZWduYW1lc1t0cmVnXSxyZWduYW1lc1t6cmVnXSk7CisJfWVsc2V7CisJICBlbWl0KGYsIlx0bGQlc1x0JXMsLS0oJXMpXG4iLHV0LHJlZ25hbWVzW3RyZWddLHJlZ25hbWVzW3ExcmVnXSk7CisJICBlbWl0KGYsIlx0c3Qlc1x0JXMsLS0oJXMpXG4iLHV0LHJlZ25hbWVzW3RyZWddLHJlZ25hbWVzW3pyZWddKTsKKwl9CisgICAgICB9CisgICAgICBpZihjPT1QVVNIKQorCXB1c2goc2l6ZSk7CisgICAgICBpZihhY250KSBmcmVlX3JlZyhmLGNudCk7CisgICAgICBpZihhdHJlZykgZnJlZV9yZWcoZix0cmVnKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmKGM9PUNBTEwpeworICAgICAgaW50IHJlZzsKKyAgICAgIC8qRklYTUUqLworI2lmIDAgICAgICAKKyAgICAgIGlmKHN0YWNrX3ZhbGlkJiYocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmcC0+cTEudi0+ZmkmJihwLT5xMS52LT5maS0+ZmxhZ3MmQUxMX1NUQUNLKSl7CisJaWYoZnJhbWVzaXplK3p1bTJ1bChwLT5xMS52LT5maS0+c3RhY2sxKT5zdGFjaykKKwkgIHN0YWNrPWZyYW1lc2l6ZSt6dW0ydWwocC0+cTEudi0+ZmktPnN0YWNrMSk7CisgICAgICB9ZWxzZQorCXN0YWNrX3ZhbGlkPTA7CisjZW5kaWYKKyAgICAgIC8qRklYTUU6IGRvZXMgbm90IHdvcmsgd2l0aCBmaXhlZCBwYXJhbWV0ZXJzIG9uIHN0YWNrICovCisgICAgICBpZigocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmIXN0cmNtcCgiX192YV9zdGFydCIscC0+cTEudi0+aWRlbnRpZmllcikpeworCWVtaXQoZiwiXHRhZGRcdCVzLCVzLCVsZFxuIixyZWduYW1lc1tyMF0scmVnbmFtZXNbc3BdLGxvY2Fsc2l6ZStyc2F2ZXNpemUtc3RhY2tvZmZzZXQpOworCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZigocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmcC0+cTEudi0+ZmkmJnAtPnExLnYtPmZpLT5pbmxpbmVfYXNtKXsKKyAgICAgICAgZW1pdF9pbmxpbmVfYXNtKGYscC0+cTEudi0+ZmktPmlubGluZV9hc20pOworICAgICAgfWVsc2V7CisJaWYoKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT1EUkVGT0JKKXsKKwkgIHAtPnExLmZsYWdzJj1+RFJFRk9CSjsKKwkgIGxvYWRfcmVnKGYsdDEsJnAtPnExLFBPSU5URVIpOworCSAgcC0+cTEuZmxhZ3N8PShEUkVGT0JKfFJFRyk7CisJICBwLT5xMS5yZWc9dDE7CisJfQorCWVtaXQoZiwiXHRibFx0Iik7CisJaWYoKHAtPnExLmZsYWdzJihSRUd8RFJFRk9CSikpPT0oUkVHfERSRUZPQkopKXsKKwkgIGVtaXQoZiwiJXMiLHJlZ25hbWVzW3AtPnExLnJlZ10pOworCX1lbHNleworCSAgbm9fc3VmZml4PTE7CisJICBlbWl0X29iaihmLCZwLT5xMSx0KTsKKwkgIG5vX3N1ZmZpeD0wOworCX0KKwllbWl0KGYsIlxuIik7CisgICAgICB9CisKKyAgICAgIGlmKCF6bWVxdG8ocC0+cTIudmFsLnZtYXgsbDJ6bSgwTCkpKXsKKyAgICAgICAgbm90cG9wcGVkKz16bTJsKHAtPnEyLnZhbC52bWF4KTsKKyAgICAgICAgZG9udHBvcC09em0ybChwLT5xMi52YWwudm1heCk7CisgICAgICAgIGlmKCFOT0RFTEFZRURQT1AmJiF2bGFzJiZzdGFja29mZnNldD09LW5vdHBvcHBlZCl7CisgICAgICAgICAgLyogIEVudGZlcm5lbiBkZXIgUGFyYW1ldGVyIHZlcnpvZWdlcm4gICovCisgICAgICAgIH1lbHNleworCSAgZW1pdChmLCJcdGFkZFx0JXMsJWxkXG4iLHJlZ25hbWVzW3NwXSx6bTJsKHAtPnEyLnZhbC52bWF4KSk7CisgICAgICAgICAgcG9wKHptMmwocC0+cTIudmFsLnZtYXgpKTsKKyAgICAgICAgICBub3Rwb3BwZWQtPXptMmwocC0+cTIudmFsLnZtYXgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmKChwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiZwLT5xMS52LT5maSYmKHAtPnExLnYtPmZpLT5mbGFncyZBTExfUkVHUykpeworCWJ2dW5pdGUocmVnc19tb2RpZmllZCxwLT5xMS52LT5maS0+cmVnc19tb2RpZmllZCxSU0laRSk7CisgICAgICB9ZWxzZXsKKwlpbnQgaTsKKwlmb3IoaT0xO2k8PU1BWFI7aSsrKXsKKwkgIGlmKHJlZ3NjcmF0Y2hbaV0pIEJTRVQocmVnc19tb2RpZmllZCxpKTsKKwl9CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZihjPT1BRERSRVNTKXsKKyAgICAgIGlmKGlzcmVnKHopKQorCXpyZWc9cC0+ei5yZWc7CisgICAgICBlbHNlCisJenJlZz10MTsKKyAgICAgIGxvYWRfYWRkcmVzcyhmLHpyZWcsJnAtPnExLFBPSU5URVIpOworICAgICAgc2F2ZV9yZXN1bHQoZixwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmKGlzcmVnKHExKSkgcTF3YXNyZWc9MTsgZWxzZSBxMXdhc3JlZz0wOworICAgIGlmKGlzcmVnKHEyKSkgcTJ3YXNyZWc9MTsgZWxzZSBxMndhc3JlZz0wOworICAgIGlmKGlzcmVnKHopKSB6d2FzcmVnPTE7IGVsc2Ugendhc3JlZz0wOworCisgICAgcD1wcmVsb2FkKGYscCk7CisgICAgYz1wLT5jb2RlOworICAgIGlmKGM9PVNVQlBGUCkgYz1TVUI7CisgICAgaWYoYz09QURESTJQKSBjPUFERDsKKyAgICBpZihjPT1TVUJJRlApIGM9U1VCOworICAgIGlmKGM9PUNPTlZFUlQpeworICAgICAgaWYoSVNGTE9BVChxMXR5cChwKSkpeworCWlmKHp0eXAocCkmVU5TSUdORUQpIGllcnJvcigwKTsKKwlpZihJU0ZMT0FUKHp0eXAocCkpKQorCSAgZW1pdChmLCJcdG1vdiVzXHQlcywlc1xuIixjYyxyZWduYW1lc1t6cmVnXSxyZWduYW1lc1txMXJlZ10pOworCWVsc2UKKwkgIGVtaXQoZiwiXHRmdHJ1bmMlc1x0JXMsJXNcbiIsY2MscmVnbmFtZXNbenJlZ10scmVnbmFtZXNbcTFyZWddKTsKKwlzYXZlX3Jlc3VsdChmLHApOworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoSVNGTE9BVCh6dHlwKHApKSl7CisJZW1pdChmLCJcdGZsdCVjJXNcdCVzLCVzXG4iLChxMXR5cChwKSZVTlNJR05FRCk/J3UnOidzJyxjYyxyZWduYW1lc1t6cmVnXSxyZWduYW1lc1txMXJlZ10pOworCXNhdmVfcmVzdWx0KGYscCk7CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZihzaXpldGFiW3ExdHlwKHApJk5RXTxzaXpldGFiW3p0eXAocCkmTlFdKXsKKwlpbnQgbWFzazsKKwlpZigocTF0eXAocCkmTlEpPT1DSEFSKQorCSAgbWFzaz03OworCWVsc2UKKwkgIG1hc2s9MTU7CisJaWYocTF0eXAocCkmVU5TSUdORUQpCisJICBtYXNrKys7CisJaWYocTF3YXNyZWd8fChxMXR5cChwKSZOVSk9PUNIQVIpCisJICBlbWl0KGYsIlx0ZXh0JWMlc1x0JXMsJXMsJWRcbiIsKHExdHlwKHApJlVOU0lHTkVEKT8ndSc6J3MnLGNjLHJlZ25hbWVzW3pyZWddLHJlZ25hbWVzW3ExcmVnXSxtYXNrKTsKKyAgICAgIH1lbHNleworCXpyZWc9cTFyZWc7CisgICAgICB9CSAgCisgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PUtPTVBMRU1FTlQpeworICAgICAgZW1pdChmLCJcdG12biVzXHQlcywlc1xuIixjYyxyZWduYW1lc1t6cmVnXSxyZWduYW1lc1txMXJlZ10pOworICAgICAgc2F2ZV9yZXN1bHQoZixwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1TRVRSRVRVUk4peworICAgICAgaWYoaXNyZWcocTEpKXsKKwlpZihwLT5xMS5yZWchPXAtPnoucmVnKQorCSAgZW1pdChmLCJcdG1vdiVzXHQlcywlc1xuIixjYyxyZWduYW1lc1twLT56LnJlZ10scmVnbmFtZXNbcC0+cTEucmVnXSk7CisgICAgICB9ZWxzZQorCWxvYWRfcmVnKGYscC0+ei5yZWcsJnAtPnExLHQpOworICAgICAgQlNFVChyZWdzX21vZGlmaWVkLHAtPnoucmVnKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1HRVRSRVRVUk4peworICAgICAgaWYocC0+cTEucmVnKXsKKyAgICAgICAgenJlZz1wLT5xMS5yZWc7CisJc2F2ZV9yZXN1bHQoZixwKTsKKyAgICAgIH1lbHNlCisgICAgICAgIHAtPnouZmxhZ3M9MDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmKGM9PUFTU0lHTnx8Yz09UFVTSCl7CisgICAgICBpZih0PT0wKSBpZXJyb3IoMCk7CisgICAgICBpZihjPT1QVVNIKXsKKwlpZighcTFyZWcpeworCSAgcTFyZWc9dDE7CisJICBsb2FkX3JlZyhmLHExcmVnLCZwLT5xMSx0KTsKKwl9CisJaWYoU0hPUlRfRE9VQkxFJiZJU0ZMT0FUKHQpKSB0PUZMT0FUOworCWVtaXQoZiwiXHRzdCVzJXNcdCVzLC0tKCVzKVxuIixzZHQodCksY2MscmVnbmFtZXNbcTFyZWddLHJlZ25hbWVzW3NwXSk7CisJcHVzaCh6bTJsKHAtPnEyLnZhbC52bWF4KSk7CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZihjPT1BU1NJR04peworCWlmKGlzcmVnKHExKSl7CisJICBpZihpc3JlZyh6KSkKKwkgICAgZW1pdChmLCJcdG1vdiVzXHQlcywlc1xuIixjYyxyZWduYW1lc1t6cmVnXSxyZWduYW1lc1twLT5xMS5yZWddKTsKKwkgIGVsc2UKKwkgICAgenJlZz1wLT5xMS5yZWc7CisJfWVsc2UKKwkgIGxvYWRfcmVnKGYsenJlZywmcC0+cTEsdCk7CisJc2F2ZV9yZXN1bHQoZixwKTsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihjPT1NSU5VUyl7CisgICAgICBsb2FkX3JlZyhmLHpyZWcsJnAtPnExLHQpOworICAgICAgZW1pdChmLCJcdG5lZyVzXHQlcywlc1xuIixjYyxyZWduYW1lc1t6cmVnXSxyZWduYW1lc1t6cmVnXSk7CisgICAgICBzYXZlX3Jlc3VsdChmLHApOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PVRFU1QpeworICAgICAgZW1pdChmLCJcdGNtcCVzXHQiLGNjKTsKKyAgICAgIGVtaXRfb2JqKGYsJnAtPnExLHQpOworICAgICAgZW1pdChmLCIsMFxuIik7CisgICAgICBsYXN0Y29tcD10OworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmKGM9PUNPTVBBUkUpeworICAgICAgaWYoSVNGTE9BVCh0KSkKKwllbWl0KGYsIlx0ZmNtcCVzXHQlcywiLGNjLHJlZ25hbWVzW3QxXSk7CisgICAgICBlbHNlCisJZW1pdChmLCJcdGNtcCVzXHQiLGNjKTsKKyAgICAgIGVtaXRfb2JqKGYsJnAtPnExLHQpOworICAgICAgZW1pdChmLCIsIik7CisgICAgICBlbWl0X29iaihmLCZwLT5xMix0KTsKKyAgICAgIGVtaXQoZiwiXG4iKTsKKyAgICAgIGxhc3Rjb21wPXQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoYz09TU9EKXsKKyAgICAgIC8qIFRPRE86IGlzIHRoZXJlIGEgZmFzdGVyIHdheT8gKi8KKyAgICAgIGludCBtOworICAgICAgaWYocTJyZWchPXQyKQorCW09dDI7CisgICAgICBlbHNlCisJbT1nZXRfcmVnKGYscCk7CisgICAgICBpZighaXNyZWcocTEpfHxwLT5xMS5yZWchPXpyZWcpCisJbG9hZF9yZWcoZix6cmVnLCZwLT5xMSx0KTsKKyAgICAgIGVtaXQoZiwiXHRkaXYlYyVzXHQlcywlcywiLCh0JlVOU0lHTkVEKT8ndSc6J3MnLGNjLHJlZ25hbWVzW21dLHJlZ25hbWVzW3pyZWddKTsKKyAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHQpOworICAgICAgZW1pdChmLCJcbiIpOworICAgICAgZW1pdChmLCJcdG11bCVzXHQlcywiLGNjLHJlZ25hbWVzW21dKTsKKyAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHQpOworICAgICAgZW1pdChmLCJcbiIpOworICAgICAgZW1pdChmLCJcdHN1YiVzXHQlcywlcywlc1xuIixjYyxyZWduYW1lc1t6cmVnXSxyZWduYW1lc1t6cmVnXSxyZWduYW1lc1ttXSk7CisgICAgICBmcmVlX3JlZyhmLG0pOworICAgICAgc2F2ZV9yZXN1bHQoZixwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0gICAgICAKKyAgICBpZigoYz49T1ImJmM8PUFORCl8fChjPj1MU0hJRlQmJmM8TU9EKSl7CisgICAgICBpZihjPj1PUiYmYzw9QU5EKQorCWVtaXQoZiwiXHQlcyVzXHQlcywiLGxvZ2ljYWxzW2MtT1JdLGNjLHJlZ25hbWVzW3pyZWddKTsKKyAgICAgIGVsc2V7CisJaWYoSVNGTE9BVCh0KSkKKwkgIGVtaXQoZiwiXHQlcyVzXHQlcywiLGZhcml0aG1ldGljc1tjLUxTSElGVF0sY2MscmVnbmFtZXNbenJlZ10pOworCWVsc2UKKwkgIGVtaXQoZiwiXHQlcyVzXHQlcywiLCh0JlVOU0lHTkVEKT91YXJpdGhtZXRpY3NbYy1MU0hJRlRdOmFyaXRobWV0aWNzW2MtTFNISUZUXSxjYyxyZWduYW1lc1t6cmVnXSk7CisgICAgICB9CisgICAgICBpZighaXNyZWcocTEpfHxwLT5xMS5yZWchPXpyZWd8fCpjY3x8Yz09RElWfHxJU0ZMT0FUKHQpKXsKKwllbWl0X29iaihmLCZwLT5xMSx0KTsKKwllbWl0KGYsIiwiKTsKKyAgICAgIH0KKyAgICAgIGVtaXRfb2JqKGYsJnAtPnEyLHQpOworICAgICAgZW1pdChmLCJcbiIpOworICAgICAgc2F2ZV9yZXN1bHQoZixwKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBwcmljMihzdGRvdXQscCk7CisgICAgaWVycm9yKDApOworICB9CisKKyAgaWYobm90cG9wcGVkKXsKKyAgICBlbWl0KGYsIlx0YWRkXHQlcywlbGRcbiIscmVnbmFtZXNbc3BdLG5vdHBvcHBlZCk7CisgICAgcG9wKG5vdHBvcHBlZCk7bm90cG9wcGVkPTA7CisgIH0KKworICBmdW5jdGlvbl9ib3R0b20oZix2LGxvY2Fsc2l6ZSk7CisgIGlmKHN0YWNrX3ZhbGlkKXsKKyAgICBpZighdi0+ZmkpIHYtPmZpPW5ld19maSgpOworICAgIHYtPmZpLT5mbGFnc3w9QUxMX1NUQUNLOworICAgIHYtPmZpLT5zdGFjazE9c3RhY2s7CisgIH0KKyAgLyplbWl0KGYsIiMgc3RhY2tzaXplPSVsdSVzXG4iLHp1bTJ1bChzdGFjayksc3RhY2tfdmFsaWQ/IiI6Iis/PyIpOyovCit9CisKK2ludCBzaG9ydGN1dChpbnQgY29kZSxpbnQgdHlwKQoreworICByZXR1cm4gMDsKK30KKworaW50IHJlZ19wYXJtKHN0cnVjdCByZWdfaGFuZGxlICptLCBzdHJ1Y3QgVHlwICp0LGludCB2YXJhcmcsc3RydWN0IFR5cCAqZCkKK3sKKyAgaW50IGY7CisKKyAgaWYodmFyYXJnKQorICAgIHJldHVybiAwOworCisgIGY9dC0+ZmxhZ3MmTlE7CisgIGlmKElTSU5UKGYpfHxJU0ZMT0FUKGYpfHxmPT1QT0lOVEVSKXsKKyAgICBpZih6bWVxdG8oc2l6ZXRhYltmXSxsMnptKDhMKSkpeworICAgICAgaWYobS0+Z3JlZ3M8PXI0KXsKKwltLT5ncmVncz0obS0+Z3JlZ3MrMSkmMHhmZTsKKwltLT5ncmVncys9MjsKKwlpZihtLT5ncmVncz09cjEpCisJICByZXR1cm4gcjByMTsKKwllbHNlIGlmKG0tPmdyZWdzPT1yMykKKwkgIHJldHVybiByMnIzOworCWVsc2UgaWYobS0+Z3JlZ3M9PXI1KQorCSAgcmV0dXJuIHI0cjU7CisJZWxzZQorCSAgaWVycm9yKDApOworICAgICAgfWVsc2UKKwlyZXR1cm4gMDsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKG0tPmdyZWdzPD1yNCkKKwlyZXR1cm4gKyttLT5ncmVnczsKKyAgICAgIGVsc2UKKwlyZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBoYW5kbGVfcHJhZ21hKGNvbnN0IGNoYXIgKnMpCit7Cit9Cit2b2lkIGNsZWFudXBfY2coRklMRSAqZikKK3sKK30KK3ZvaWQgY2xlYW51cF9kYihGSUxFICpmKQoreworICBpZihmKSBzZWN0aW9uPS0xOworfQorCitjaGFyICp1c2VfbGliY2FsbChpbnQgYyxpbnQgdCxpbnQgdDIpCisvKiBSZXR1cm4gbmFtZSBvZiBsaWJyYXJ5IGZ1bmN0aW9uLCBpZiB0aGlzIG5vZGUgc2hvdWxkIGJlCisgICBpbXBsZW1lbnRlZCB2aWEgbGliY2FsbC4gKi8KK3sKKyAgc3RhdGljIGNoYXIgZm5hbWVbMTZdOworICBjaGFyICpyZXQgPSBOVUxMOworCisgIGlmKGM9PUNPTVBBUkUpeworICAgIGlmKCh0Jk5RKT09RE9VQkxFKSB0PShTSE9SVF9ET1VCTEUpP0ZMT0FUOkxET1VCTEU7CisgICAgaWYoKHQmTlEpPT1MTE9OR3x8dD09TERPVUJMRSl7CisgICAgICBzcHJpbnRmKGZuYW1lLCJfX2NtcCVzJXMlbGQiLCh0JlVOU0lHTkVEKT8idSI6InMiLElTRkxPQVQodCk/ImZsdCI6ImludCIsem0ybChzaXpldGFiW3QmTlFdKSo4KTsKKyAgICAgIHJldD1mbmFtZTsKKyAgICB9CisgIH1lbHNleworICAgIHQmPU5VOworICAgIHQyJj1OVTsKKyAgICBpZihTSE9SVF9ET1VCTEUpeworICAgICAgaWYoSVNGTE9BVCh0KSkgdD1GTE9BVDsKKyAgICAgIGlmKElTRkxPQVQodDIpKSB0Mj1GTE9BVDsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKHQ9PURPVUJMRSkgdD1MRE9VQkxFOworICAgICAgaWYodDI9PURPVUJMRSkgdDI9TERPVUJMRTsKKyAgICB9CisgICAgaWYoYz09Q09OVkVSVCl7CisgICAgICBpZih0PT10MikgcmV0dXJuIDA7CisgICAgICBpZih0PT1GTE9BVCYmdDI9PUxET1VCTEUpIHJldHVybiAiX19mbHQ2NHRvZmx0MzIiOworICAgICAgaWYodD09TERPVUJMRSYmdDI9PUZMT0FUKSByZXR1cm4gIl9fZmx0MzJ0b2ZsdDY0IjsKKyAgICAgIGlmKHQhPUxET1VCTEUmJnQyIT1MRE9VQkxFJiYodCZOUSkhPUxMT05HJiYodDImTlEpIT1MTE9ORykgcmV0dXJuIDA7CisgICAgICBpZihJU0ZMT0FUKHQpKXsKKyAgICAgICAgc3ByaW50ZihmbmFtZSwiX18lY2ludCVsZHRvZmx0JWQiLCh0MiZVTlNJR05FRCk/J3UnOidzJyx6bTJsKHNpemV0YWJbdDImTlFdKSo4LCh0PT1GTE9BVCk/MzI6NjQpOworICAgICAgICByZXQ9Zm5hbWU7CisgICAgICB9CisgICAgICBpZihJU0ZMT0FUKHQyKSYmKHQmTlUpPT1MTE9ORyl7CisgICAgICAgIHNwcmludGYoZm5hbWUsIl9fZmx0JWR0byVjaW50JWxkIiwoKHQyJk5VKT09RkxPQVQpPzMyOjY0LCh0JlVOU0lHTkVEKT8ndSc6J3MnLHptMmwoc2l6ZXRhYlt0Jk5RXSkqOCk7CisgICAgICAgIHJldD1mbmFtZTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoKHQmTlEpPT1MTE9OR3x8dD09RE9VQkxFKXsKKyAgICAgIGlmKChjPj1MU0hJRlQmJmM8PU1PRCl8fChjPj1PUiYmYzw9QU5EKXx8Yz09S09NUExFTUVOVHx8Yz09TUlOVVMpeworICAgICAgICBpZih0PT0oVU5TSUdORUR8TExPTkcpJiYoYz09RElWfHxjPT1NT0R8fGM9PVJTSElGVCkpeworICAgICAgICAgIHNwcmludGYoZm5hbWUsIl9fJXN1aW50NjQiLGVuYW1lW2NdKTsKKyAgICAgICAgICByZXQ9Zm5hbWU7CisgICAgICAgIH1lbHNlIGlmKCh0Jk5RKT09TExPTkcpeworICAgICAgICAgIHNwcmludGYoZm5hbWUsIl9fJXNpbnQ2NCIsZW5hbWVbY10pOworICAgICAgICAgIHJldD1mbmFtZTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgc3ByaW50ZihmbmFtZSwiX18lcyVzJXMlbGQiLGVuYW1lW2NdLCh0JlVOU0lHTkVEKT8idSI6IiIsSVNGTE9BVCh0KT8iZmx0IjoiaW50Iix6bTJsKHNpemV0YWJbdCZOUV0pKjgpOworICAgICAgICAgIHJldD1mbmFtZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9tYWNoaW5lcy92aWRjb3JlL21hY2hpbmUuZHQgYi9tYWNoaW5lcy92aWRjb3JlL21hY2hpbmUuZHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2YzhkNAotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL3ZpZGNvcmUvbWFjaGluZS5kdApAQCAtMCwwICsxLDE2IEBACitTOEJTCitTOEJVCitTMTZCU0JFIFMxNkJTTEUKK1MxNkJVQkUgUzE2QlVMRQorUzMyQlNCRSBTMzJCU0xFCitTMzJCVUJFIFMzMkJVTEUKK1MzMkJTQkUgUzMyQlNMRQorUzMyQlVCRSBTMzJCVUxFCitTNjRCU0JFIFM2NEJTTEUKK1M2NEJVQkUgUzY0QlVMRQorUzMyQklFRUVCRQorUzY0QklFRUVCRQorUzY0QklFRUVCRQorUzMyQlVCRSBTMzJCVUxFCisKKwpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvdmlkY29yZS9tYWNoaW5lLmggYi9tYWNoaW5lcy92aWRjb3JlL21hY2hpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDhlNTgxCi0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvdmlkY29yZS9tYWNoaW5lLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qICBCYWNrZW5kIGZvciBWaWRlb0NvcmUgSVYKKyAgICAoYykgaW4gMjAxMyBieSBWb2xrZXIgQmFydGhlbG1hbm4KKyovCisKKy8qIGJ1aWwtdGltZSBjb25maWd1cmFibGUgb3B0aW9uczogKi8KKyNkZWZpbmUgTlVNX0dQUlMgNDgKKworI2luY2x1ZGUgImR0LmgiCisKKworLyogIFRoaXMgc3RydWN0IGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBtYWNoaW5lLXNwZWNpZmljICAgICAgICAgICAqLworLyogIGFkZHJlc3NpbmctbW9kZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEN1cnJlbnRseSBwb3NzaWJsZSBhcmUgKGNvbnN0LGdwcikgYW5kIChncHIsZ3ByKSAgICAgICAgICAgICAgICAqLworc3RydWN0IEFkZHJlc3NpbmdNb2RleworICAgIGludCBmbGFnczsKKyAgICBpbnQgYmFzZTsKKyAgICBsb25nIG9mZnNldDsKK307CisKKy8qICBUaGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUuICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFYUiA0OAorCisvKiAgTnVtYmVyIG9mIGNvbW1hbmRsaW5lLW9wdGlvbnMgdGhlIGNvZGUtZ2VuZXJhdG9yIGFjY2VwdHMuICAgICAgICovCisjZGVmaW5lIE1BWEdGIDIwCisKKy8qICBJZiB0aGlzIGlzIHNldCB0byB6ZXJvIHZiY2Mgd2lsbCBub3QgZ2VuZXJhdGUgSUNzIHdoZXJlIHRoZSAgICAgKi8KKy8qICB0YXJnZXQgb3BlcmFuZCBpcyB0aGUgc2FtZSBhcyB0aGUgMm5kIHNvdXJjZSBvcGVyYW5kLiAgICAgICAgICAgKi8KKy8qICBUaGlzIGNhbiBzb21ldGltZXMgc2ltcGxpZnkgdGhlIGNvZGUtZ2VuZXJhdG9yLCBidXQgdXN1YWxseSAgICAgKi8KKy8qICB0aGUgY29kZSBpcyBiZXR0ZXIgaWYgdGhlIGNvZGUtZ2VuZXJhdG9yIGFsbG93cyBpdC4gICAgICAgICAgICAgKi8KKyNkZWZpbmUgVVNFUTJBU1ogMAorCisvKiAgVGhpcyBzcGVjaWZpZXMgdGhlIHNtYWxsZXN0IGludGVnZXIgdHlwZSB0aGF0IGNhbiBiZSBhZGRlZCB0byBhICovCisvKiAgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JTkFEREkyUCBJTlQKKworLyogIFRoaXMgc3BlY2lmaWVzIHRoZSBzbWFsbGVzdCBpbnRlZ2VyIHR5cGUgdGhhdCBjYW4gYmUgYWRkZWQgdG8gYSAqLworLyogIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQVhBRERJMlAgSU5UCisKKy8qICBJZiB0aGUgYnl0ZXMgb2YgYW4gaW50ZWdlciBhcmUgb3JkZXJlZCBtb3N0IHNpZ25pZmljYW50IGJ5dGUgICAgKi8KKy8qICBieXRlIGZpcnN0IGFuZCB0aGVuIGRlY3JlYXNpbmcgc2V0IEJJR0VORElBTiB0byAxLiAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHRU5ESUFOIDAKKworLyogIElmIHRoZSBieXRlcyBvZiBhbiBpbnRlZ2VyIGFyZSBvcmRlcmVkIGxlc3Qgc2lnbmlmaWNhbnQgYnl0ZSAgICAqLworLyogIGJ5dGUgZmlyc3QgYW5kIHRoZW4gaW5jcmVhc2luZyBzZXQgTElUVExFRU5ESUFOIHRvIDEuICAgICAgICAgICAqLworI2RlZmluZSBMSVRUTEVFTkRJQU4gMQorCisvKiAgTm90ZSB0aGF0IEJJR0VORElBTiBhbmQgTElUVExFRU5ESUFOIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICAgICovCisKKy8qICBJZiBzd2l0Y2gtc3RhdGVtZW50cyBzaG91bGQgYmUgZ2VuZXJhdGVkIGFzIGEgc2VxdWVuY2Ugb2YgICAgICAgKi8KKy8qICBTVUIsVFNULEJFUSBJQ3MgcmF0aGVyIHRoYW4gQ09NUEFSRSxCRVEgSUNzIHNldCB0aGlzIHRvIDEuICAgICAgKi8KKy8qICBUaGlzIGNhbiB5aWVsZCBiZXR0ZXIgY29kZSBvbiBzb21lIG1hY2hpbmVzLiAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1dJVENIU1VCUyAxCisKKy8qICBJbiBvcHRpbWl6aW5nIGNvbXBpbGF0aW9uIGNlcnRhaW4gbGlicmFyeSBtZW1jcHkvc3RyY3B5LWNhbGxzICAgKi8KKy8qICB3aXRoIGxlbmd0aCBrbm93biBhdCBjb21waWxlLXRpbWUgd2lsbCBiZSBpbmxpbmVkIHVzaW5nIGFuICAgICAgKi8KKy8qICBBU1NJR04tSUMgaWYgdGhlIHNpemUgaXMgbGVzcyBvciBlcXVhbCB0byBJTkxJTkVNRU1DUFkuICAgICAgICAgKi8KKy8qICBUaGUgdHlwZSB1c2VkIGZvciB0aGUgQVNTSUdOLUlDIHdpbGwgYmUgVU5TSUdORUR8Q0hBUi4gICAgICAgICAgKi8KKyNkZWZpbmUgSU5MSU5FTUVNQ1BZIDEwMjQKKworLyogIFBhcmFtZXRlcnMgYXJlIHNvbWV0aW1lcyBwYXNzZWQgaW4gcmVnaXN0ZXJzIHdpdGhvdXQgX19yZWcuICAgICAqLworI2RlZmluZSBIQVZFX1JFR1BBUk1TIDEKKworLyogIFBhcmFtZXRlcnMgb24gdGhlIHN0YWNrIHNob3VsZCBiZSBwdXNoZWQgaW4gb3JkZXIgcmF0aGVyIHRoYW4gICAqLworLyogIGluIHJldmVyc2Ugb3JkZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmIE9SREVSRURfUFVTSAorCisvKiAgU3RydWN0dXJlIGZvciByZWdfcGFybSgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdHJ1Y3QgcmVnX2hhbmRsZXsKKyAgICB1bnNpZ25lZCBsb25nIGdyZWdzOworfTsKKworLyogIFdlIGhhdmUgc29tZSB0YXJnZXQtc3BlY2lmaWMgdmFyaWFibGUgYXR0cmlidXRlcy4gICAgICAgICAgICAgICAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9BVFRSSUJVVEVTCisKKy8qIFdlIGhhdmUgdGFyZ2V0LXNwZWNpZmljIHByYWdtYXMgKi8KKyNkZWZpbmUgSEFWRV9UQVJHRVRfUFJBR01BUworCisvKiAgV2Uga2VlcCB0cmFjayBvZiBhbGwgcmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IGEgZnVuY3Rpb24uICAgICAgICAgICovCisjZGVmaW5lIEhBVkVfUkVHU19NT0RJRklFRCAxCisKKy8qIFdlIGhhdmUgYSBpbXBsZW1lbnQgb3VyIG93biBjb3N0LWZ1bmN0aW9ucyB0byBhZGFwdCAKKyAgIHJlZ2lzdGVyLWFsbG9jYXRpb24gKi8KKyNkZWZpbmUgSEFWRV9UQVJHRVRfUkFMTE9DIDEKKyNkZWZpbmUgY29zdF9tb3ZlX3JlZyh4LHkpIDEKKyNkZWZpbmUgY29zdF9sb2FkX3JlZyh4LHkpIDIKKyNkZWZpbmUgY29zdF9zYXZlX3JlZyh4LHkpIDIKKyNkZWZpbmUgY29zdF9wdXNocG9wX3JlZyh4KSAzCisKKy8qIHNpemUgb2YgYnVmZmVyIGZvciBhc20tb3V0cHV0LCB0aGlzIGNhbiBiZSB1c2VkIHRvIGRvCisgICBwZWVwaG9sZS1vcHRpbWl6YXRpb25zIG9mIHRoZSBnZW5lcmF0ZWQgYXNzZW1ibHktb3V0cHV0ICovCisjZGVmaW5lIEVNSVRfQlVGX0xFTiAxMDI0IC8qIHNob3VsZCBiZSBlbm91Z2ggKi8KKy8qIG51bWJlciBvZiBhc20tb3V0cHV0IGxpbmVzIGJ1ZmZlcmVkICovCisjZGVmaW5lIEVNSVRfQlVGX0RFUFRIIDQKKworLyogIFdlIGhhdmUgbm8gYXNtX3BlZXBob2xlIHRvIG9wdGltaXplIGFzc2VtYmx5LW91dHB1dCAqLworI2RlZmluZSBIQVZFX1RBUkdFVF9QRUVQSE9MRSAwCisKKy8qIHdlIGRvIG5vdCBoYXZlIGEgbWFya19lZmZfaWNzIGZ1bmN0aW9uLCB0aGlzIGlzIHVzZWQgdG8gcHJldmVudAorICAgb3B0aW1pemF0aW9ucyBvbiBjb2RlIHdoaWNoIGNhbiBhbHJlYWR5IGJlIGltcGxlbWVudGVkIGJ5IGVmZmljaWVudAorICAgYXNzZW1ibHkgKi8KKyN1bmRlZiBIQVZFX1RBUkdFVF9FRkZfSUMKKworLyogd2Ugb25seSBuZWVkIHRoZSBzdGFuZGFyZCBkYXRhIHR5cGVzIChubyBiaXQtdHlwZXMsIGRpZmZlcmVudCBwb2ludGVycworICAgZXRjLikgKi8KKyN1bmRlZiBIQVZFX0VYVF9UWVBFUworI3VuZGVmIEhBVkVfVEdUX1BSSU5UVkFMCisKKy8qIHdlIGRvIG5vdCBuZWVkIGV4dHJhIGVsZW1lbnRzIGluIHRoZSBJQyAqLworI3VuZGVmIEhBVkVfRVhUX0lDCisKKy8qIHdlIGRvIHVzZSB1bnNpZ25lZCBpbnQgYXMgc2l6ZV90IChidXQgdW5zaWduZWQgbG9uZywgdGhlIGRlZmF1bHQpICovCisjZGVmaW5lIEhBVkVfSU5UX1NJWkVUIDEKKworLyogd2UgbmVlZCByZWdpc3Rlci1wYWlycyAqLworI2RlZmluZSBIQVZFX1JFR1BBSVJTIDEKKworCisvKiBkbyBub3QgY3JlYXRlIENPTlZFUlQgSUNzIGZyb20gaW50ZWdlcnMgc21hbGxlciB0aGFuIGludCB0byBmbG9hdHMgKi8KKyNkZWZpbmUgTUlOX0lOVF9UT19GTE9BVF9UWVBFIElOVAorCisvKiBkbyBub3QgY3JlYXRlIENPTlZFUlQgSUNzIGZyb20gZmxvYXRzIHRvIGludHMgc21hbGxlciB0aGFuIGludCAqLworI2RlZmluZSBNSU5fRkxPQVRfVE9fSU5UX1RZUEUgSU5UCisKKy8qIGRvIG5vdCBjcmVhdGUgQ09OVkVSVF9JQ3MgZnJvbSBmbG9hdHMgdG8gdW5zaWduZWQgaW50ZWdlcnMgKi8KKyNkZWZpbmUgQVZPSURfRkxPQVRfVE9fVU5TSUdORUQgMQorCisvKiBkbyBub3QgY3JlYXRlIENPTlZFUlRfSUNzIGZyb20gdW5zaWduZWQgaW50ZWdlcnMgdG8gZmxvYXRzICovCisjZGVmaW5lIEFWT0lEX1VOU0lHTkVEX1RPX0ZMT0FUIDAKKworI2RlZmluZSBIQVZFX0xJQkNBTExTIDEKZGlmZiAtLWdpdCBhL21hY2hpbmVzL3ovbWFjaGluZS5jIGIvbWFjaGluZXMvei9tYWNoaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTI0MmZmZgotLS0gL2Rldi9udWxsCisrKyBiL21hY2hpbmVzL3ovbWFjaGluZS5jCkBAIC0wLDAgKzEsMjcxOSBAQAorLyogei9tYWNoaW5lLmMKKyAqIENvZGUgZ2VuZXJhdG9yIGZvciB0aGUgWi1tYWNoaW5lLgorICogKEMpIERhdmlkIEdpdmVuIDIwMDEKKyAqIGNvbnZlcnNpb24gdG8gdmJjYyAwLjggYnkgVm9sa2VyIEJhcnRoZWxtYW5uCisgKi8KKworLyogVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3BlbiBzb3VyY2UgbGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIERhdmlkIEdpdmVuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKiBUaGlzIGNvZGUgZ2VuZXJhdG9yIHByb2R1Y2VzIGNvZGUgZm9yIHRoZSBaLW1hY2hpbmUuIFRoZSBaLW1hY2hpbmUgaXMgdGhlCisgKiBoaWdobHkgcGVjdWxpYXIgdmlydHVhbCBtYWNoaW5lIHVzZWQgZm9yIHRoZSBvbGQgSW5mb2NvbSB0ZXh0IGFkdmVudHVyZXM7CisgKiB0aGVzZSBkYXlzLCBhbiBleHRlbmRlZCBmb3JtIGlzIHN0aWxsIHVzZWQgaW4gdGhlIGludGVyYWN0aXZlIGZpY3Rpb24gZ2VucmUKKyAqIG9mIGdhbWVzLiBVc3VhbGx5LCBhIGRlZGljYXRlZCBjb21waWxlciBjYWxsZWQgSW5mb3JtIGlzIHVzZWQgdG8gZ2VuZXJhdGUKKyAqIGNvZGUsIGJ1dCBpdCB3b3VsZCBiZSBuaWNlIHRvIGJlIGFibGUgdG8gdXNlIHJlYWwgQywgc28gaGVyZSB3ZSBhcmUuCisgKgorICogVGhlIFotbWFjaGluZSBpcyAobW9zdGx5KSBhIHNlbWktc3RhY2stYmFzZWQgSGFydmFyZCBhcmNoaXRlY3R1cmUgbWFjaGluZS4KKyAqIChTcGxpdCBjb2RlIGFuZCBkYXRhIHNwYWNlLCBhbHRob3VnaCB0aGV5IGNhbiBzaGFyZSBpZiB5b3UncmUgY2xldmVyLiBBbmQKKyAqIG1hZC4pIEl0IGhhcyBubyByZWdpc3RlcnMsIGJ1dCBpdCBkb2VzIGhhdmUgcHJvY2VkdXJlIGxvY2FsIHZhcmlhYmxlcyB3aGljaAorICogd2lsbCBkbyBpbnN0ZWFkLiBJdCBoYXMgYSBkZWRpY2F0ZWQgc3RhY2sgYnV0IGFzIGl0J3Mgbm90IGFjY2Vzc2libGUgYnkKKyAqIG9yZGluYXJ5IG1lbW9yeSBpdCdzIG5vdCB1c2VmdWwgZm9yIEMuIEl0IHVzZXMgOCBhbmQgMTYgYml0IHdvcmRzLCBzbyB3ZSdsbAorICogaGF2ZSB0byBlbXVsYXRlIDMyLWJpdCBhcml0aG1ldGljLgorICoKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgY29kZSBmb3IgSW5mb3JtLCB2YXJpb3VzIGludGVycHJldGVycywgbW9yZQorICogZG9jdW1lbnRhdGlvbiB0aGFuIHlvdSBjYW4gc2hha2UgYSBzdGljayBhdCwgYW5kIHRoZSBmdWxsIHRlY2huaWNhbCByZWZlcmVuY2UKKyAqIGZvciB0aGUgWi1tYWNoaW5lLCBjaGVjayBvdXQgdGhlIEludGVyYWN0aXZlIEZpY3Rpb24gYXJjaGl2ZSwgYXQKKyAqIGh0dHA6Ly93d3cuaWZhcmNoaXZlLm9yZy4KKyAqCisgKiBUaGluZ3MgdG8gbm90ZTogdGhlcmUgaXMgbm8gWi1tYWNoaW5lIGFzc2VtYmxlci4gKFdlbGwsIHRoZXJlJ3MgemFzbSwgYnV0IGl0J3MKKyAqIHJlYWxseSBqdXN0IGEgcnVtb3VyLikgTHVja2lseSwgSW5mb3JtIGhhcyBhbiBhc3NlbWJsZXIgbW9kZSwgd2hlcmUgaXQnbGwKKyAqIGdlbmVyYXRlIHJhdyBaLW1hY2hpbmUgb3Bjb2Rlcy4gVW5sdWNraWx5LCBpdCdzIGhvcnJpYmx5IGJ1Z2d5Li4uIFNvIHdlJ3JlCisgKiBnb2luZyB0byBoYXZlIHRvIGdlbmVyYXRlIEluZm9ybSBzb3VyY2UsIHdoaWNoIHNlZW1zIGF0IGZpcnN0IHRvIGJlIHJhdGhlcgorICogc2lsbHksIGJ1dCBhcyBJbmZvcm0gaXMgcXVpdGUgYSBzaW1wbGUgY29tcGlsZXIgd2UgY2FuIG1ha2Ugc3VyZSB0aGF0IGl0J3MKKyAqIG9ubHkgZ29pbmcgdG8gZ2VuZXJhdGUgdGhlIGluc3RydWN0aW9ucyB3ZSB3YW50IGl0IHRvIGdlbmVyYXRlLgorICovCisKKy8qIHZiY2MtbWFuZGF0ZWQgaGVhZGVyLiAqLworCisjaW5jbHVkZSAic3VwcC5oIgorc3RhdGljIGNoYXIgRklMRV9bXT1fX0ZJTEVfXzsKK2NoYXIgY2dfY29weXJpZ2h0W109InZiY2MgY29kZS1nZW5lcmF0b3IgZm9yIFotbWFjaGluZSBWMC4wYSAoYykgaW4gMjAwMSBieSBEYXZpZCBHaXZlbiI7CisKKy8qIENvbW1hbmQtbGluZSBmbGFncy4gKi8KKworaW50IGdfZmxhZ3NbTUFYR0ZdID0geworCVNUUklOR0ZMQUcsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwCit9OworY2hhciAqZ19mbGFnc19uYW1lW01BWEdGXSA9IHsKKwkibW9kdWxlLW5hbWUiLAorCSJ0cmFjZS1jYWxscyIsCisJInRyYWNlLWFsbCIsCisJInNhZmUtYnJhbmNoZXMiLAorCSJjb21tZW50LWljIiwKKwkiY29tbWVudC1taXNjIgorfTsKK3VuaW9uIHBwaSBnX2ZsYWdzX3ZhbFtNQVhHRl07CisKKy8qIFR5cGUgYWxpZ25tZW50LiBNdWNoIGJldHRlciBjb2RlIGlzIGdlbmVyYXRlZCBpZiB3ZSBjYW4gdXNlIGV2ZW4gYWxpZ25tZW50LgorICovCisKK3ptYXggYWxpZ25bTUFYX1RZUEUrMV0gPSB7CisJMCwJLyogMDogdW51c2VkICovCisJMSwJLyogMTogQ0hBUiAqLworCTIsCS8qIDI6IFNIT1JUICovCisJMiwgCS8qIDM6IElOVCAqLworCTIsCS8qIDQ6IExPTkcgKi8KKwkyLCAgICAgIC8qIDU6IExMT05HICovCisJMiwJLyogNjogRkxPQVQgKi8KKwkyLAkvKiA3OiBET1VCTEUgKi8KKwkyLCAgICAgIC8qIDg6IExET1VCTEUgKi8KKwkyLAkvKiA5OiBWT0lEICovCisJMiwJLyogMTA6IFBPSU5URVIgKi8KKwkxLAkvKiAxMTogQVJSQVkgKi8KKwkxLAkvKiAxMjogU1RSVUNUICovCisJMSwJLyogMTM6IFVOSU9OICovCisJMSwJLyogMTQ6IEVOVU0gKi8KKwkxLAkvKiAxNTogRlVOS1QgKi8KK307CisKKy8qIEFsaWdubWVudCB0aGF0IGlzIHZhbGlkIGZvciBhbGwgdHlwZXMuICovCisKK3ptYXggbWF4YWxpZ24gPSAyOworCisvKiBOdW1iZXIgb2YgYml0cyBpbiBhIGNoYXIuICovCisKK3ptYXggY2hhcl9iaXQgPSA4OworCisvKiBTaXplcyBvZiBhbGwgZWxlbWVudGFyeSB0eXBlcywgaW4gYnl0ZXMuICovCisKK3ptYXggc2l6ZXRhYltNQVhfVFlQRSsxXSA9IHsKKwkwLAkvKiAwOiB1bnVzZWQgKi8KKwkxLAkvKiAxOiBDSEFSICovCisJMiwJLyogMjogU0hPUlQgKi8KKwkyLCAJLyogMzogSU5UICovCisJNCwJLyogNDogTE9ORyAqLworICAgICAgICA4LCAgICAgIC8qIDU6IExMT05HICovCisJNCwJLyogNjogRkxPQVQgKi8KKwk4LAkvKiA3OiBET1VCTEUgKi8KKwk4LCAgICAgIC8qIDg6IExET1VCTEUgKi8KKwkwLAkvKiA5OiBWT0lEICovCisJMiwJLyogMTA6IFBPSU5URVIgKi8KKwkwLAkvKiAxMTogQVJSQVkgKi8KKwkwLAkvKiAxMjogU1RSVUNUICovCisJMCwJLyogMTM6IFVOSU9OICovCisJMiwJLyogMTQ6IEVOVU0gKi8KKwkwLAkvKiAxNTogRlVOS1QgKi8KK307CisKKy8qICBNaW5pbXVtIGFuZCBNYXhpbXVtIHZhbHVlcyBlYWNoIHR5cGUgY2FuIGhhdmUuICAgICAgICAgICAgICAqLworLyogIE11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gaW5pdF9jZygpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit6bWF4IHRfbWluW01BWF9UWVBFKzFdOworenVtYXggdF9tYXhbTUFYX1RZUEUrMV07Cit6dW1heCB0dV9tYXhbTUFYX1RZUEUrMV07CisKKy8qIE5hbWVzIG9mIGFsbCB0aGUgcmVnaXN0ZXJzLgorICogV2UgY2FuIGhhdmUgMTYgbG9jYWwgdmFyaWFibGVzIHBlciByb3V0aW5lLiBWYXIgMCBpcyBhbHdheXMgdGhlIEMgc3RhY2sKKyAqIHBvaW50ZXIsIHhwLiBBbGwgdGhlIG90aGVycyBjYW4gYmUgdXNlZCBieSB0aGUgY29tcGlsZXIuIHhwIGRvZXNuJ3QgYWN0dWFsbHkKKyAqIGFwcGVhciBpbiB0aGUgcmVnaXN0ZXIgbWFwLCBzbyB3ZSBnZXQgMTUgbWFpbiByZWdpc3RlcnMuIAorICovCisKK2NoYXIqIHJlZ25hbWVzW10gPSB7CisJInNwIiwgLyogdmJjYyBkb2Vzbid0IHVzZSB0aGlzLCBidXQgd2UgZG8gKi8KKwkieHAiLCAJInIwIiwgCSJyMSIsICAJInIyIiwgCSJyMyIsIAkicjQiLCAJInI1IiwgCSJyNiIsCisJInI3IiwgCSJyOCIsIAkicjkiLAkicjEwIiwJInIxMSIsCSJyMTIifTsKKyNkZWZpbmUgWFAgMQorI2RlZmluZSBVU0VSUkVHIDIKKworLyogVGhlIHNpemUgb2YgZWFjaCByZWdpc3RlciwgaW4gYnllcy4gKi8KKworem1heCByZWdzaXplW10gPSB7CisJMCwKKwkyLAkyLAkyLAkyLAkyLAkyLAkyLAkyLAorCTIsCTIsCTIsCTIsCTIsCTJ9OworCisvKiBUeXBlIG5lZWRlZCB0byBzdG9yZSBlYWNoIHJlZ2lzdGVyLiAqLworCitzdHJ1Y3QgVHlwIGl0eXAgPSB7SU5UfTsKK3N0cnVjdCBUeXAqIHJlZ3R5cGVbXSA9IHsKKwlOVUxMLAorCSZpdHlwLAkmaXR5cCwJJml0eXAsCSZpdHlwLAkmaXR5cCwJJml0eXAsCSZpdHlwLAkmaXR5cCwKKwkmaXR5cCwJJml0eXAsCSZpdHlwLAkmaXR5cCwJJml0eXAsCSZpdHlwfTsKKwkKKy8qIFRoZXNlIHJlZ2lzdGVycyBhcmUgdGhvc2UgZGVkaWNhdGVkIGZvciB1c2UgYnkgdGhlIGJhY2tlbmQuIFRoZXNlIG9uZXMgd2lsbAorICogbm90IGJlIHVzZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yLiAqLworCitpbnQgcmVnc2FbXSA9IHsKKwkwLAorCTEsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCisJMCwJMCwJMCwJMCwJMCwJMH07CisKKy8qIFNwZWNpZmllcyB3aGljaCByZWdpc3RlcnMgbWF5IGJlIGRlc3Ryb3llZCBieSBmdW5jdGlvbiBjYWxscy4gQXMgd2UncmUKKyAqIHN0b3Jpbmcgb3VyIHJlZ2lzdGVycyBpbiBsb2NhbCB2YXJpYWJsZXMgc28gdGhleSdyZSBiZWluZyBhdXRvbWF0aWNhbGx5CisgKiBzYXZlZCBmb3IgdXMsIG5vbmUgb2YgdGhlbS4KKyAqLworCitpbnQgcmVnc2NyYXRjaFtdID0geworCTAsCisJMCwJMCwJMCwJMCwJMCwJMCwJMCwJMCwKKwkwLAkwLAkwLAkwLAkwLAkwfTsKKworLyogRGVmYXVsdCBzdGF0ZSBmb3IgcmVnaXN0ZXIgcGFyYW1ldGVyIHBhc3NpbmcuICovCisKK3N0cnVjdCByZWdfaGFuZGxlIGVtcHR5X3JlZ19oYW5kbGUgPQorCXtVU0VSUkVHfTsKKworLyogUHJlZml4IGZvciBsYWJlbHMuICovCisKK3N0YXRpYyBjaGFyKiBsYWJlbHByZWZpeCA9ICJMIjsKKworLyogTmFtZSBvZiB0aGUgY3VycmVudCBtb2R1bGU7IHVzZWQgZm9yIGdlbmVyYXRpbmcgdW5pcXVlIG5hbWVzIGZvciBzdGF0aWNzIGFuZAorICogdGhlIGNvbnN0YW50IHBvb2wuICovCisKK3N0YXRpYyBjaGFyKiBtb2R1bGVuYW1lOworCisvKiBTdGFjayBmcmFtZSBsYXlvdXQ6CisgKgorICogIC0tLS0tLS0tLS0tLS0tCisgKiAgICAgIEFyZyA0ICAgICAgICAoQXJndW1lbnRzIGJlaW5nIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uKQorICogICAgICBBcmcgMworICogICAgICBBcmcgMgorICogICAgICBBcmcgMQorICogIC0tLS0tLS0tLS0tLS0tIHhwICsgc3RhY2twYXJhbWFkanVzdCArIHN0YWNrb2Zmc2V0CisgKiAgICAgTG9jYWwgNCAgICAgICAoVGhpcyBmdW5jdGlvbidzIHRlbXAgc3BhY2UpCisgKiAgICAgTG9jYWwgMworICogICAgIExvY2FsIDIKKyAqICAgICBMb2NhbCAxCisgKiAgLS0tLS0tLS0tLS0tLS0geHAgKyBzdGFja3BhcmFtYWRqdXN0CisgKiAgICAgIEFyZyAyICAgICAgICAoQXJndW1lbnRzIHRoaXMgZnVuY3Rpb24gaGFzIHB1c2hlZCB0byBwYXNzCisgKiAgICAgIEFyZyAxICAgICAgICAgdG8gYSBjYWxsZWQgZnVuY3Rpb24pCisgKiAgLS0tLS0tLS0tLS0tLS0geHAKKyAqCisgKiBBbnkgYXJlYSBtYXkgYmUgemVybyBpbiBzaXplLiAoQWx0aG91Z2ggc3RhY2tvZmZzZXQgaXMgYWx3YXlzIGF0IGxlYXN0IDIgZm9yCisgKiBzb21lIGluYWRlcXVhdGVseSBleHBsYWluZWQgcmVhc29uLikKKyAqLworCitzdGF0aWMgaW50IHN0YWNrb2Zmc2V0Oworc3RhdGljIGludCBzdGFja3BhcmFtYWRqdXN0OworCisvKiBSZXByZXNlbnRzIHNvbWV0aGluZyB0aGUgWi1tYWNoaW5lIGNhbiB1c2UgYXMgYW4gaW5zdHJ1Y3Rpb24gb3BlcmFuZC4gKi8KKworc3RydWN0IHpvcCB7CisJaW50IHR5cGU7CisJdW5pb24geworCQlpbnQgcmVnOworCQl6bWF4IGNvbnN0YW50OworCQljaGFyKiBpZGVudGlmaWVyOworCX0gdmFsOworfTsKKworZW51bSB7CisJWk9QX1NUQUNLLAorCVpPUF9SRUcsCisJWk9QX0NPTlNUQU5ULAorCVpPUF9FWFRFUk4sCisJWk9QX1NUQVRJQywKKwlaT1BfQ09OU1RBTlRBRERSCit9OworCisvKiBTb21lIHVzZWZ1bCB6b3BzLiAqLworCitzdHJ1Y3Qgem9wIHpvcF96ZXJvID0ge1pPUF9DT05TVEFOVCwge2NvbnN0YW50OiAwfX07CitzdHJ1Y3Qgem9wIHpvcF94cCA9IHtaT1BfUkVHLCB7cmVnOiBYUH19Oworc3RydWN0IHpvcCB6b3Bfc3RhY2sgPSB7Wk9QX1NUQUNLLCAwfTsKKworLyogVGVtcG9yYXJpZXMgdXNlZCB0byBzdG9yZSBjb21wYXJpc29uIHJlZ2lzdGVyIG51bWJlcnMuICovCisKK3N0YXRpYyBzdHJ1Y3Qgem9wIGNvbXBhcmUxOworc3RhdGljIHN0cnVjdCB6b3AgY29tcGFyZTI7CisKKy8qIEtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgd2UndmUgZW1pdHRlZCBhbnl0aGluZyBvciBub3QuIFVzZWQgdG8gZGV0ZXJtaW5lCisgKiB3aGV0aGVyIHRvIGVtaXQgdGhlIHNlcGVyYXRpbmcgOyBvciBub3QuIElmIGl0J3MgMSwgd2UgaGF2ZW4ndCBlbWl0dGVkCisgKiBhbnl0aGluZy4gSWYgaXQncyAtMSwgd2UncmUgZG9pbmcgYW4gYXJyYXksIHNvIHdlIG5lZWQgdG8gZW1pdCBhIGZpbmFsICgwKQorICogdG8gZmluaXNoIGl0IG9mZiBpZiBpdCdzIG9ubHkgb25lIGJ5dGUgbG9uZy4gMCBmb3IgYW55dGhpbmcgZWxzZS4gKi8KKworc3RhdGljIGludCB2aXJnaW4gPSAxOworCisvKiBUaGUgY3VycmVudCB2YXJpYWJsZSB3ZSdyZSBlbWl0dGluZyBkYXRhIGZvci4gKi8KKworc3RydWN0IHZhcmlhYmxlIHsKKwlpbnQgdHlwZTsKKwl1bmlvbiB7CisJCWNoYXIqIGlkZW50aWZpZXI7CisJCWludCBudW1iZXI7CisJfSB2YWw7CisJemludCBvZmZzZXQ7Cit9OworCitzdHJ1Y3QgdmFyaWFibGUgY3VycmVudHZhcjsKKworLyogSW5mb3JtIGNhbid0IGVtaXQgdmFyaWFibGUgcmVmZXJlbmNlcyBpbnNpZGUgYXJyYXlzLiBTbyB3aGVuIHZiY2Mgd2FudHMgdG8KKyAqIHB1dCwgc2F5LCB0aGUgYWRkcmVzcyBvZiBzb21ldGhpbmcgaW4gYSBnbG9iYWwgdmFyaWFibGUsIHdlIGhhdmUgdG8gd3JpdGUgaXQKKyAqIGluIGxhdGVyLiBBIGxpbmtlZCBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMga2VlcHMgdHJhY2sgb2YgdGhlIGl0ZW1zIHRoYXQKKyAqIG5lZWQgZml4aW5nIHVwLiAqLworCitzdHJ1Y3QgZml4dXAgeworCXN0cnVjdCBmaXh1cCogbmV4dDsKKwlzdHJ1Y3QgdmFyaWFibGUgaWRlbnRpZmllcjsKKwlzdHJ1Y3QgdmFyaWFibGUgdmFsdWU7CisJem1heCBvZmZzZXQ7Cit9OworCitzdGF0aWMgc3RydWN0IGZpeHVwKiBmaXh1cGxpc3QgPSBOVUxMOworCQorLyogMzItYml0IHZhbHVlcyBhcmUgc3RvcmVkIGluIGEgY29uc3RhbnQgcG9vbCwgZm9yIHNpbXBsaWNpdHkuIEl0J3Mga2VwdCB0cmFjaworICogb2YgaW4gdGhpcyBsaW5rZWQgbGlzdC4gKi8KKworc3RydWN0IGNvbnN0YW50IHsKKwlzdHJ1Y3QgY29uc3RhbnQqIG5leHQ7CisJaW50IGlkOworCXptYXggdmFsdWU7Cit9OworCitzdGF0aWMgc3RydWN0IGNvbnN0YW50KiBjb25zdGFudGxpc3QgPSBOVUxMOworc3RhdGljIGludCBjb25zdGFudG51bSA9IDA7CisKKy8qIFRoZSBmdW5jdGlvbiB3ZSdyZSBjdXJyZW50bHkgY29tcGlsaW5nLiAqLworCitzdGF0aWMgc3RydWN0IFZhciogZnVuY3Rpb247CisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMuICovCisKK3N0YXRpYyB2b2lkIGVtaXRfYWRkKEZJTEUqIGZwLCBzdHJ1Y3Qgem9wKiBxMSwgc3RydWN0IHpvcCogcTIsIHN0cnVjdCB6b3AqIHopOworc3RhdGljIHZvaWQgcmVhZF9yZWcoRklMRSogZnAsIHN0cnVjdCBvYmoqIG9iaiwgaW50IHR5cGYsIGludCByZWcpOworc3RhdGljIGludCBhZGRjb25zdGFudCh6bWF4IHZhbHVlKTsKKworLyogRW1pdCBkZWJ1Z2dpbmcgaW5mby4gKi8KKworc3RhdGljIHZvaWQgZGVidWdlbWl0KEZJTEUqIGZwLCBjaGFyKiBmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJaWYgKGdfZmxhZ3NbNV0gJiBVU0VERkxBRykKKwkJdmZwcmludGYoZnAsIGZtdCwgYXApOworCXZhX2VuZChhcCk7Cit9CisKKy8qIERvIHdlIG5lZWQgdG8gZW1pdCBhIDsgYmVmb3JlIHRoZSBuZXh0IHRoaW5nPyAqLworCitzdGF0aWMgdm9pZCByZWZsb3dlcihGSUxFKiBmcCkKK3sKKwlpZiAoIXZpcmdpbikKKwkJZnByaW50ZihmcCwgIjtcbiIpOworCWlmICh2aXJnaW4gPT0gLTEpCisJeworCQlpZiAoY3VycmVudHZhci5vZmZzZXQgPT0gMSkKKwkJCWZwcmludGYoZnAsICIoMCkiKTsKKwkJZnByaW50ZihmcCwgIjsiKTsKKwl9CisJdmlyZ2luID0gMDsKK30KKworLyogRXh0cmFjdCB0aGUgc2lnbiBleHRlbmRlZCBieXRlIG4gb2YgYSB2YWx1ZS4gKi8KKworc3RhdGljIGNoYXIgeGJ5dGUoem1heCB2YWwsIGludCBieXRlKQoreworCXZhbCA8PD0gKHNpemVvZih2YWwpKjgpIC0gKGJ5dGUqOCkgLSA4OworCXZhbCA+Pj0gKHNpemVvZih2YWwpKjgpIC0gODsKKwlyZXR1cm4gKHVuc2lnbmVkIGNoYXIpIHZhbDsKK30KKworLyogRXh0cmFjdCB0aGUgc2lnbiBleHRlbmRlZCB3b3JkIG4gb2YgYSB2YWx1ZS4gKi8KKworc3RhdGljIHpzaG9ydCB4d29yZCh6bWF4IHZhbCwgaW50IHdvcmQpCit7CisJdmFsIDw8PSAoc2l6ZW9mKHZhbCkqOCkgLSAod29yZCoxNikgLSAxNjsKKwl2YWwgPj49IChzaXplb2YodmFsKSo4KSAtIDE2OworCXJldHVybiAoenNob3J0KSB2YWw7Cit9CisKKy8qIERlYnVnIGZ1bmN0aW9uOiBwcmludHMgdGhlIHRleHQgbmFtZSBvZiBhIHR5cGUuICovCisKK3N0YXRpYyB2b2lkIGR1bXBfdHlwZShGSUxFKiBmcCwgaW50IHR5cGYpCit7CisJc3dpdGNoICh0eXBmKQorCXsKKwkJY2FzZSBWT0lEOglmcHJpbnRmKGZwLCAiVk9JRCIpOyBicmVhazsKKwkJY2FzZSBDSEFSOglmcHJpbnRmKGZwLCAiQ0hBUiIpOyBicmVhazsKKwkJY2FzZSBTSE9SVDoJZnByaW50ZihmcCwgIlNIT1JUIik7IGJyZWFrOworCQljYXNlIElOVDoJZnByaW50ZihmcCwgIklOVCIpOyBicmVhazsKKwkJY2FzZSBMT05HOglmcHJpbnRmKGZwLCAiTE9ORyIpOyBicmVhazsKKwkJY2FzZSBQT0lOVEVSOglmcHJpbnRmKGZwLCAiUE9JTlRFUiIpOyBicmVhazsKKwkJY2FzZSBTVFJVQ1Q6CWZwcmludGYoZnAsICJTVFJVQ1QiKTsgYnJlYWs7CisJCWNhc2UgQVJSQVk6CWZwcmludGYoZnAsICJBUlJBWSIpOyBicmVhazsKKwkJY2FzZSBVTklPTjoJZnByaW50ZihmcCwgIlVOSU9OIik7IGJyZWFrOworCQljYXNlIEZVTktUOglmcHJpbnRmKGZwLCAiRlVOS1QiKTsgYnJlYWs7CisJCWRlZmF1bHQ6CWZwcmludGYoZnAsICJ1bmtub3duICVYIiwgdHlwZik7CisJfQorfQorCisvKiBEZWJ1ZyBmdW5jdGlvbjogb3V0cHV0cyB0aGUgb2JqLiAqLworCitzdGF0aWMgdm9pZCBkdW1wX29iaihGSUxFKiBmcCwgc3RydWN0IG9iaiogb2JqLCBpbnQgdHlwZikKK3sKKwlpbnQgZiA9IG9iai0+ZmxhZ3MgJiAoS09OU1R8UkVHfFZBUnxEUkVGT0JKfFZBUkFEUik7CisKKwlpZiAoZiA9PSAwKQorCXsKKwkJZnByaW50ZihmcCwgIltdIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZiAmIERSRUZPQkopCisJCWZwcmludGYoZnAsICIqIik7CisKKwlpZiAoZiAmIFZBUkFEUikKKwkJZnByaW50ZihmcCwgIiYiKTsKKworCWlmIChmID09IEtPTlNUKQorCXsKKwkJc3dpdGNoICh0eXBmICYgTlUpCisJCXsKKwkJCWNhc2UgQ0hBUjoKKwkJCQlmcHJpbnRmKGZwLCAiW2NoYXIgIyVkXSIsIG9iai0+dmFsLnZjaGFyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBVTlNJR05FRHxDSEFSOgorCQkJCWZwcmludGYoZnAsICJbdWNoYXIgIyV1XSIsIG9iai0+dmFsLnZ1Y2hhcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU0hPUlQ6CisJCQkJZnByaW50ZihmcCwgIltzaG9ydCAjJWRdIiwgb2JqLT52YWwudnNob3J0KTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBVTlNJR05FRHxTSE9SVDoKKwkJCQlmcHJpbnRmKGZwLCAiW3VzaG9ydCAjJXVdIiwgb2JqLT52YWwudnVzaG9ydCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSU5UOgorCQkJCWZwcmludGYoZnAsICJbaW50ICMlZF0iLCBvYmotPnZhbC52aW50KTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBVTlNJR05FRHxJTlQ6CisJCQkJZnByaW50ZihmcCwgIlt1aW50ICMlZF0iLCBvYmotPnZhbC52dWludCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgTE9ORzoKKwkJCQlmcHJpbnRmKGZwLCAiW2xvbmcgIyVkXSIsIG9iai0+dmFsLnZsb25nKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBVTlNJR05FRHxMT05HOgorCQkJCWZwcmludGYoZnAsICJbdWxvbmcgIyV1XSIsIG9iai0+dmFsLnZ1bG9uZyk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRkxPQVQ6CisJCQkJZnByaW50ZihmcCwgIltmbG9hdCAjJTA0WF0iLCBvYmotPnZhbC52ZmxvYXQpOworCQkJCWJyZWFrOworCisJCQljYXNlIERPVUJMRToKKwkJCQlmcHJpbnRmKGZwLCAiW2RvdWJsZSAjJTA4WF0iLCBvYmotPnZhbC52ZG91YmxlKTsKKwkJCQlicmVhazsKKyNpZiAwCisJCQljYXNlIFBPSU5URVI6CisJCQkJZnByaW50ZihmcCwgIltwb2ludGVyICMlMDRYXSIsIG9iai0+dmFsLnZwb2ludGVyKTsKKwkJCQlicmVhazsKKyNlbmRpZgorCQl9CisJfQorCWVsc2UgaWYgKGYgPT0gUkVHKQorCQlmcHJpbnRmKGZwLCAiW3JlZyAlc10iLCByZWduYW1lc1tvYmotPnJlZ10pOworCWVsc2UgaWYgKGYgPT0gKFJFR3xEUkVGT0JKKSkKKwkJZnByaW50ZihmcCwgIltkZXJlZiByZWcgJXNdIiwgcmVnbmFtZXNbb2JqLT5yZWddKTsKKwkvL2Vsc2UgaWYgKGYgJiBWQVIpCisJZWxzZQorCXsKKwkJZnByaW50ZihmcCwgIlt2YXIgIik7CisJCWR1bXBfdHlwZShmcCwgdHlwZik7CisJCWZwcmludGYoZnAsICIgJXMiLCBvYmotPnYtPmlkZW50aWZpZXIpOworCisJCWlmICgob2JqLT52LT5zdG9yYWdlX2NsYXNzID09IEFVVE8pIHx8CisJCSAgICAob2JqLT52LT5zdG9yYWdlX2NsYXNzID09IFJFR0lTVEVSKSkKKwkJeworCQkJem1heCBvZmZzZXQgPSBvYmotPnYtPm9mZnNldDsKKwkJCS8vaWYgKG9mZnNldCA8IDApCisJCQkvLwlvZmZzZXQgPSAtKG9mZnNldCttYXhhbGlnbik7CisJCQlmcHJpbnRmKGZwLCAiIGF0IGZwJStkIiwgb2Zmc2V0KTsKKwkJfQorCisJCWZwcmludGYoZnAsICIrJWxkIiwgb2JqLT52YWwudmxvbmcpOworCisJCWlmIChmICYgUkVHKQorCQkJZnByaW50ZihmcCwgIiBpbiAlcyIsIHJlZ25hbWVzW29iai0+cmVnXSk7CisJCWZwcmludGYoZnAsICJdIik7CisJfQorfQorCisvKiBEZWJ1ZyBmdW5jdGlvbjogb3V0cHV0cyB0aGUgaWMsIGFzIGEgY29tbWVudC4gKi8KKworc3RhdGljIHZvaWQgZHVtcF9pYyhGSUxFKiBmcCwgc3RydWN0IElDKiBpYykKK3sKKwljaGFyKiBwOworCisJaWYgKCFpYykKKwkJcmV0dXJuOworCisJaWYgKCEoZ19mbGFnc1s0XSAmIFVTRURGTEFHKSkKKwkJcmV0dXJuOworCisJaWYgKGdfZmxhZ3NbMl0gJiBVU0VERkxBRykKKwkJZnByaW50ZihmcCwgInByaW50IFwiIik7CisJZWxzZQorCQlmcHJpbnRmKGZwLCAiISAiKTsKKwkKKwlzd2l0Y2ggKGljLT5jb2RlKQorCXsKKwkJY2FzZSBBU1NJR046CQlwID0gIkFTU0lHTiI7CQlicmVhazsKKwkJY2FzZSBPUjoJCXAgPSAiT1IiOwkJYnJlYWs7CisJCWNhc2UgWE9SOgkJcCA9ICJYT1IiOwkJYnJlYWs7CisJCWNhc2UgQU5EOgkJcCA9ICJBTkQiOwkJYnJlYWs7CisJCWNhc2UgTFNISUZUOgkJcCA9ICJMU0hJRlQiOwkJYnJlYWs7CisJCWNhc2UgUlNISUZUOgkJcCA9ICJSU0hJRlQiOwkJYnJlYWs7CisJCWNhc2UgQUREOgkJcCA9ICJBREQiOwkJYnJlYWs7CisJCWNhc2UgU1VCOgkJcCA9ICJTVUIiOwkJYnJlYWs7CisJCWNhc2UgTVVMVDoJCXAgPSAiTVVMVCI7CQlicmVhazsKKwkJY2FzZSBESVY6CQlwID0gIkRJViI7CQlicmVhazsKKwkJY2FzZSBNT0Q6CQlwID0gIk1PRCI7CQlicmVhazsKKwkJY2FzZSBLT01QTEVNRU5UOglwID0gIktPTVBMRU1FTlQiOwlicmVhazsKKwkJY2FzZSBNSU5VUzoJCXAgPSAiTUlOVVMiOwkJYnJlYWs7CisJCWNhc2UgQUREUkVTUzoJCXAgPSAiQUREUkVTUyI7CQlicmVhazsKKwkJY2FzZSBDQUxMOgkJcCA9ICJDQUxMIjsJCWJyZWFrOworI2lmIDAKKwkJY2FzZSBDT05WQ0hBUjoJCXAgPSAiQ09OVkNIQVIiOwkJYnJlYWs7CisJCWNhc2UgQ09OVlNIT1JUOgkJcCA9ICJDT05WU0hPUlQiOwlicmVhazsKKwkJY2FzZSBDT05WSU5UOgkJcCA9ICJDT05WSU5UIjsJCWJyZWFrOworCQljYXNlIENPTlZMT05HOgkJcCA9ICJDT05WTE9ORyI7CQlicmVhazsKKwkJY2FzZSBDT05WRkxPQVQ6CQlwID0gIkNPTlZGTE9BVCI7CWJyZWFrOworCQljYXNlIENPTlZET1VCTEU6CXAgPSAiQ09OVkRPVUJMRSI7CWJyZWFrOworCQljYXNlIENPTlZQT0lOVEVSOglwID0gIkNPTlZQT0lOVEVSIjsJYnJlYWs7CisJCWNhc2UgQ09OVlVDSEFSOgkJcCA9ICJDT05WVUNIQVIiOwlicmVhazsKKwkJY2FzZSBDT05WVVNIT1JUOglwID0gIkNPTlZVU0hPUlQiOwlicmVhazsKKwkJY2FzZSBDT05WVUlOVDoJCXAgPSAiQ09OVlVJTlQiOwkJYnJlYWs7CisJCWNhc2UgQ09OVlVMT05HOgkJcCA9ICJDT05WVUxPTkciOwlicmVhazsKKyNlbmRpZgorCQljYXNlIEFMTE9DUkVHOgkJcCA9ICJBTExPQ1JFRyI7CQlicmVhazsKKwkJY2FzZSBGUkVFUkVHOgkJcCA9ICJGUkVFUkVHIjsJCWJyZWFrOworCQljYXNlIENPTVBBUkU6CQlwID0gIkNPTVBBUkUiOwkJYnJlYWs7CisJCWNhc2UgVEVTVDoJCXAgPSAiVEVTVCI7CQlicmVhazsKKwkJY2FzZSBMQUJFTDoJCXAgPSAiTEFCRUwiOwkJYnJlYWs7CisJCWNhc2UgQkVROgkJcCA9ICJCRVEiOwkJYnJlYWs7CisJCWNhc2UgQk5FOgkJcCA9ICJCTkUiOwkJYnJlYWs7CisJCWNhc2UgQkxUOgkJcCA9ICJCTFQiOwkJYnJlYWs7CisJCWNhc2UgQkdUOgkJcCA9ICJCR1QiOwkJYnJlYWs7CisJCWNhc2UgQkxFOgkJcCA9ICJCTEUiOwkJYnJlYWs7CisJCWNhc2UgQkdFOgkJcCA9ICJCR0UiOwkJYnJlYWs7CisJCWNhc2UgQlJBOgkJcCA9ICJCUkEiOwkJYnJlYWs7CisJCWNhc2UgUFVTSDoJCXAgPSAiUFVTSCI7CQlicmVhazsKKwkJY2FzZSBBRERJMlA6CQlwID0gIkFEREkyUCI7CQlicmVhazsKKwkJY2FzZSBTVUJJRlA6CQlwID0gIlNVQklGUCI7CQlicmVhazsKKwkJY2FzZSBTVUJQRlA6CQlwID0gIlNVQlBGUCI7CQlicmVhazsKKwkJY2FzZSBHRVRSRVRVUk46CQlwID0gIkdFVFJFVFVSTiI7CWJyZWFrOworCQljYXNlIFNFVFJFVFVSTjoJCXAgPSAiU0VUUkVUVVJOIjsJYnJlYWs7CisJCWNhc2UgTU9WRUZST01SRUc6CXAgPSAiTU9WRUZST01SRUciOwlicmVhazsKKwkJY2FzZSBNT1ZFVE9SRUc6CQlwID0gIk1PVkVUT1JFRyI7CWJyZWFrOworCQljYXNlIE5PUDoJCXAgPSAiTk9QIjsJCWJyZWFrOworCQlkZWZhdWx0OgkJcCA9ICI/Pz8iOworCX0KKworCWZwcmludGYoZnAsICIlcyAiLCBwKTsKKwlkdW1wX3R5cGUoZnAsIGljLT50eXBmKTsKKwlmcHJpbnRmKGZwLCAiICIpOworCisJc3dpdGNoIChpYy0+Y29kZSkKKwl7CisJCWNhc2UgTEFCRUw6CisJCWNhc2UgQkVROgorCQljYXNlIEJORToKKwkJY2FzZSBCTFQ6CisJCWNhc2UgQkdUOgorCQljYXNlIEJMRToKKwkJY2FzZSBCR0U6CisJCWNhc2UgQlJBOgorCQkJZnByaW50ZihmcCwgIiVkIiwgaWMtPnR5cGYpOworCQkJZ290byBlcGlsb2d1ZTsKKwl9CisJCisJZHVtcF9vYmooZnAsICZpYy0+cTEsIGljLT50eXBmKTsKKwlmcHJpbnRmKGZwLCAiICIpOworCWR1bXBfb2JqKGZwLCAmaWMtPnEyLCBpYy0+dHlwZik7CisJZnByaW50ZihmcCwgIiAtPiAiKTsKKwlkdW1wX29iaihmcCwgJmljLT56LCBpYy0+dHlwZik7CisKK2VwaWxvZ3VlOgorCWlmIChnX2ZsYWdzWzJdICYgVVNFREZMQUcpCisJCWZwcmludGYoZnAsICJeXCI7XG4iKTsKKwllbHNlCisJCWZwcmludGYoZnAsICJcbiIpOworfQorCisvKiBJbml0aWFsaXNlIHRoZSBjb2RlIGdlbmVyYXRvci4gVGhpcyBpcyBjYWxsZWQgb25jZS4gUmV0dXJucyAwIGlmIHRoaW5ncyBnbworICogd3JvbmcuICovCisKK2ludCBpbml0X2NnKHZvaWQpCit7CisJbW9kdWxlbmFtZSA9IGdfZmxhZ3NfdmFsWzBdLnA7CisJaWYgKCFtb2R1bGVuYW1lKQorCQltb2R1bGVuYW1lID0gIiI7CisKKyAgLyogIEluaXRpYWxpemUgdGhlIG1pbi9tYXgtc2V0dGluZ3MuIE5vdGUgdGhhdCB0aGUgdHlwZXMgb2YgdGhlICAgICAqLworICAvKiAgaG9zdCBzeXN0ZW0gbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSB0YXJnZXQgc3lzdGVtIGFuZCB5b3UgbWF5ICovCisgIC8qICBvbmx5IHVzZSB0aGUgc21hbGxlc3QgbWF4aW11bSB2YWx1ZXMgQU5TSSBndWFyYW50ZWVzIGlmIHlvdSAgICAgKi8KKyAgLyogIHdhbnQgdG8gYmUgcG9ydGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgVGhhdCdzIHRoZSByZWFzb24gZm9yIHRoZSBzdWJ0cmFjdGlvbiBpbiB0X21pbltJTlRdLiBMb25nIGNvdWxkICovCisgIC8qICBiZSB1bmFibGUgdG8gcmVwcmVzZW50IC0yMTQ3NDgzNjQ4IG9uIHRoZSBob3N0IHN5c3RlbS4gICAgICAgICAgKi8KKyAgdF9taW5bQ0hBUl09bDJ6bSgtMTI4TCk7CisgIHRfbWluW1NIT1JUXT1sMnptKC0zMjc2OEwpOworICB0X21pbltJTlRdPXRfbWluW1NIT1JUXTsKKyAgdF9taW5bTE9OR109em1zdWIobDJ6bSgtMjE0NzQ4MzY0N0wpLGwyem0oMUwpKTsKKyAgdF9taW5bTExPTkddPXptbHNoaWZ0KGwyem0oMUwpLGwyem0oNjNMKSk7CisgIHRfbWluW01BWElOVF09dF9taW4oTExPTkcpOworICB0X21heFtDSEFSXT11bDJ6dW0oMTI3TCk7CisgIHRfbWF4W1NIT1JUXT11bDJ6dW0oMzI3NjdVTCk7CisgIHRfbWF4W0lOVF09dF9tYXhbU0hPUlRdOworICB0X21heFtMT05HXT11bDJ6dW0oMjE0NzQ4MzY0N1VMKTsKKyAgdF9tYXhbTExPTkddPXp1bXJzaGlmdCh6dW1rb21wbCh1bDJ6dW0oMFVMKSksdWwyenVtKDFVTCkpOworICB0X21heFtNQVhJTlRdPXRfbWF4KExMT05HKTsKKyAgdHVfbWF4W0NIQVJdPXVsMnp1bSgyNTVVTCk7CisgIHR1X21heFtTSE9SVF09dWwyenVtKDY1NTM1VUwpOworICB0dV9tYXhbSU5UXT10dV9tYXhbU0hPUlRdOworICB0dV9tYXhbTE9OR109dWwyenVtKDQyOTQ5NjcyOTVVTCk7CisgIHR1X21heFtMTE9OR109enVta29tcGwodWwyenVtKDBVTCkpOworICB0dV9tYXhbTUFYSU5UXT10X21heChVTlNJR05FRHxMTE9ORyk7CisKKwlyZXR1cm4gMTsKK30KKworLyogUmV0dXJucyB0aGUgcmVnaXN0ZXIgaW4gd2hpY2ggdmFyaWFibGVzIG9mIHR5cGUgdHlwIGFyZSByZXR1cm5lZCAob3IgMCBpZiBpdAorICogY2FuJ3QgYmUgZG9uZSkuICovCisKK2ludCBmcmV0dXJuKHN0cnVjdCBUeXAgKnR5cCkKK3sKKwlpbnQgcyA9IHNpemV0YWJbdHlwLT5mbGFncyAmIE5RXTsKKwlpZiAoKHR5cC0+ZmxhZ3MgJiBOUSkgPT0gVk9JRCkKKwkJcmV0dXJuIFVTRVJSRUc7CisJaWYgKChzIDw9IHNpemV0YWJbSU5UXSkgJiYgKHMgPiAwKSkKKwkJcmV0dXJuIFVTRVJSRUc7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybnMgMSBpZiByZWdpc3RlciByZWcgY2FuIHN0b3JlIHZhcmlhYmxlcyBvZiB0eXBlIHR5cC4gbW9kZSBpcyBzZXQKKyAqIGlmIHRoZSByZWdpc3RlciBpcyBhIHBvaW50ZXIgYW5kIHRoZSByZWdpc3RlciBpcyBnb2luZyB0byBiZSBkZXJlZmVyZW5jZWQuCisgKi8KKworaW50IHJlZ29rKGludCByZWcsIGludCB0eXBmLCBpbnQgbW9kZSkKK3sKKwlpbnQgcyA9IHNpemV0YWJbdHlwZiAmIE5RXTsKKwlpZiAoKHR5cGYgJiBOUSkgPT0gVk9JRCkKKwkJcmV0dXJuIDE7CisJaWYgKChzIDw9IHNpemV0YWJbSU5UXSkgJiYgKHMgPiAwKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybnMgemVybyBpZiB0aGUgSUMgaWMgY2FuIGJlIHNhZmVseSBleGVjdXRlZCB3aXRob3V0IGRhbmdlciBvZgorICogZXhjZXB0aW9ucyBvciBzaW1pbGFyIHRoaW5nczsgZm9yIGV4YW1wbGUsIGRpdmlzaW9ucyBvciBwb2ludGVyIGRlcmVmZXJlbmNlcworICogYXJlIGRhbmdlcm91cy4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBvcHRpbWlzZXIgZm9yIGNvZGUgcmVvcmRlcmluZy4KKyAqLworCitpbnQgZGFuZ2Vyb3VzX0lDKHN0cnVjdCBJQyAqaWMpCit7CisJLyogQ2hlY2sgZm9yIGRlcmVmZXJlbmNlcy4gKi8KKworCWlmICgoaWMtPnExLmZsYWdzICYgRFJFRk9CSikgfHwKKwkgICAgKGljLT5xMi5mbGFncyAmIERSRUZPQkopIHx8CisJICAgIChpYy0+ei5mbGFncyAmIERSRUZPQkopKQorCQlyZXR1cm4gMDsKKworCS8qIERpdmlzaW9uIG9yIG1vZHVsbz8gKi8KKworCWlmICgoaWMtPmNvZGUgPT0gRElWKSB8fAorCSAgICAoaWMtPmNvZGUgPT0gTU9EKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBTYWZlLCBhcyBmYXIgYXMgd2UgY2FuIHRlbGwuICovCisKKwlyZXR1cm4gMTsKK30KKworLyogUmV0dXJucyB6ZXJvIGlmIHRoZSBjb2RlIGZvciBjb252ZXJ0aW5nIHR5cGUgcC0+bnR5cCB0byB0eXBlIHR5cCBpcyBhIG5vb3AuCisgKi8KKworaW50IG11c3RfY29udmVydChpbnQgb3R5cCwgaW50IHR5cCxpbnQgY29uc3RfZXhwcikKK3sKKwlpbnQgb2xkdHlwZSA9IG90eXAgJiBOUTsKKwlpbnQgbmV3dHlwZSA9IHR5cCAmIE5ROworCisJLyogaW50cyBhbmQgc2hvcnRzIGFyZSBlcXVpdmFsZW50LiAqLworCisJaWYgKG9sZHR5cGUgPT0gU0hPUlQpCisJCW9sZHR5cGUgPSBJTlQ7CisJaWYgKG5ld3R5cGUgPT0gU0hPUlQpCisJCW5ld3R5cGUgPSBJTlQ7CisKKwkvKiBCb3RoIHRoZSBzYW1lIHR5cGU/ICovCisKKwlpZiAob2xkdHlwZSA9PSBuZXd0eXBlKQorCQlyZXR1cm4gMDsKKworI2lmIDAKKwkvKiBDb252ZXJ0aW5nIHR3byBiYXNpYyBpbnRlZ2Vycz8gKi8KKworCWlmICgob2xkdHlwZSA8PSBJTlQpICYmIChuZXd0eXBlIDw9IElOVCkpCisJeworCQkvKiAuLi4gYnV0IGNoYXIgdG8gc2hvcnQgbmVlZHMgYW4gQU5ELiAqLworCisJCWlmICgob2xkdHlwZSA9PSBDSEFSKSAmJiAobmV3dHlwZSAhPSBDSEFSKSkKKwkJCXJldHVybiAxOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKworCS8qIFBvaW50ZXIgdG8vZnJvbSBpbnQ/ICovCisKKwlpZiAoKChvbGR0eXBlID09IElOVCkgfHwgKG9sZHR5cGUgPT0gUE9JTlRFUikpICYmCisJICAgICgobmV3dHlwZSA9PSBJTlQpIHx8IChuZXd0eXBlID09IFBPSU5URVIpKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBFdmVyeXRoaW5nIGVsc2UgbmVlZHMgY29kZS4gKi8KKworCXJldHVybiAxOworfQorCisvKiBFbnN1cmUgdGhlIG91dHB1dCBpcyBhbGlnbmVkLiBBIG5vb3Agb24gdGhlIFotbWFjaGluZS4gKi8KKwordm9pZCBnZW5fYWxpZ24oRklMRSogZnAsIHptYXggYWxpZ24pCit7Cit9CisKKy8qIEdlbmVyYXRlIHRoZSBsYWJlbCBwYXJ0IG9mIGEgdmFyaWFibGUgZGVmaW5pdGlvbi4gKi8KKwordm9pZCBnZW5fdmFyX2hlYWQoRklMRSogZnAsIHN0cnVjdCBWYXIqIHZhcikKK3sKKwlpZiAodmFyLT5zdG9yYWdlX2NsYXNzID09IEVYVEVSTikKKwkJZGVidWdlbWl0KGZwLCAiISBWYXIgJXMgJVhcbiIsIHZhci0+aWRlbnRpZmllciwgdmFyLT5mbGFncyk7CisJaWYgKHZhci0+c3RvcmFnZV9jbGFzcyA9PSBTVEFUSUMpCisJCWRlYnVnZW1pdChmcCwgIiEgVmFyIHN0YXRpYyAlbGQgJXMgJVhcbiIsIHZhci0+b2Zmc2V0LCB2YXItPmlkZW50aWZpZXIsIHZhci0+ZmxhZ3MpOworCisJLyogV2Ugb25seSB3YW50IHRvIGVtaXQgcmVjb3JkcyBmb3IgZ2VudWluZWx5IGRlZmluZWQgdmFyaWFibGVzLiBGb3IKKwkgKiBzb21lIHJlYXNvbiwgVEVOVEFUSVZFIGlzIGRlZmluZWQgZm9yIHNvbWUgb2YgdGhpcy4gKi8KKworCWlmICgodmFyLT5zdG9yYWdlX2NsYXNzID09IEVYVEVSTikgJiYKKwkgICAgISh2YXItPmZsYWdzICYgREVGSU5FRCkgJiYKKwkgICAgISh2YXItPmZsYWdzICYgVEVOVEFUSVZFKSkKKwkJcmV0dXJuOworCQorCXJlZmxvd2VyKGZwKTsKKwl2aXJnaW4gPSAtMTsKKwlzd2l0Y2ggKHZhci0+c3RvcmFnZV9jbGFzcykKKwl7CisJCWNhc2UgRVhURVJOOgorCQkJLyogVGhpcyBkb2Vzbid0IGFjdHVhbGx5IG1lYW4gZXh0ZXJuYWwgbGlua2FnZTsgaXQKKwkJCSAqIG1lYW5zIGEgbm9uLXN0YXRpYyBnbG9iYWwgdGhhdCBtYXkgYmUgcmVmZXJlbmNlZAorCQkJICogZXh0ZXJuYWxseS4gKi8KKwkJCWZwcmludGYoZnAsICJBcnJheSBfJXMgLT5cbiIsCisJCQkJdmFyLT5pZGVudGlmaWVyKTsKKwkJCWN1cnJlbnR2YXIudHlwZSA9IEVYVEVSTjsKKwkJCWN1cnJlbnR2YXIudmFsLmlkZW50aWZpZXIgPSBzdHJkdXAodmFyLT5pZGVudGlmaWVyKTsKKwkJCWN1cnJlbnR2YXIub2Zmc2V0ID0gMDsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgU1RBVElDOgorCQkJZnByaW50ZihmcCwgIkFycmF5IFNUQVRJQ18lc18lbGQgLT5cbiIsCisJCQkJbW9kdWxlbmFtZSwgdmFyLT5vZmZzZXQpOworCQkJY3VycmVudHZhci50eXBlID0gU1RBVElDOworCQkJY3VycmVudHZhci52YWwubnVtYmVyID0gdmFyLT5vZmZzZXQ7CisJCQljdXJyZW50dmFyLm9mZnNldCA9IDA7CisJCQlicmVhazsKKwl9Cit9CisKKy8qIEVtaXQgYSBjZXJ0YWluIG51bWJlciBvZiBieXRlcyBvZiBic3MgZGF0YS4gTm8gYnNzIG9uIHRoZSBaLW1hY2hpbmUsCisgKiByZW1lbWJlci4gKi8KKwordm9pZCBnZW5fZHMoRklMRSAqZnAsIHptYXggc2l6ZSwgc3RydWN0IFR5cCAqdHlwKQoreworCWZwcmludGYoZnAsICIgJWxkXG4iLCBzaXplKTsKKwljdXJyZW50dmFyLm9mZnNldCArPSBzaXplOworfQorCisvKiBFbWl0IGEgY2VydGFpbiBudW1iZXIgb2YgYnl0ZXMgb2YgaW5pdGlhbGlzZWQgZGF0YS4gKi8KKwordm9pZCBnZW5fZGMoRklMRSAqZnAsIGludCB0eXBmLCBzdHJ1Y3QgY29uc3RfbGlzdCAqcCkKK3sKKwlzd2l0Y2ggKHR5cGYgJiBOUSkKKwl7CisJCWNhc2UgQ0hBUjoKKwkJCWZwcmludGYoZnAsICIgKCVkKVxuIiwKKwkJCQlwLT52YWwudnVjaGFyKTsKKwkJCWN1cnJlbnR2YXIub2Zmc2V0ICs9IDE7CisJCQlicmVhazsKKworCQljYXNlIFNIT1JUOgorCQljYXNlIElOVDoKKwkJcmVhbGx5YW5pbnQ6CisJCQlmcHJpbnRmKGZwLCAiICglZCkgKCVkKVxuIiwKKwkJCQl4Ynl0ZShwLT52YWwudmludCwgMSksCisJCQkJeGJ5dGUocC0+dmFsLnZpbnQsIDApKTsKKwkJCWN1cnJlbnR2YXIub2Zmc2V0ICs9IDI7CisJCQlicmVhazsKKwkJCQkKKwkJY2FzZSBMT05HOgorCQkJZnByaW50ZihmcCwgIiAoJWQpICglZCkgKCVkKSAoJWQpXG4iLAorCQkJCXhieXRlKHAtPnZhbC52bG9uZywgMyksCisJCQkJeGJ5dGUocC0+dmFsLnZsb25nLCAyKSwKKwkJCQl4Ynl0ZShwLT52YWwudmxvbmcsIDEpLAorCQkJCXhieXRlKHAtPnZhbC52bG9uZywgMCkpOworCQkJY3VycmVudHZhci5vZmZzZXQgKz0gNDsKKwkJCWJyZWFrOworCisJCWNhc2UgUE9JTlRFUjoKKwkJCWlmICghcC0+dHJlZSkKKwkJCQlnb3RvIHJlYWxseWFuaW50OworCQkJeworCQkJCXN0cnVjdCBmaXh1cCogZml4dXAgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBmaXh1cCkpOworCQkJCXN0cnVjdCBvYmoqIG9iaiA9ICZwLT50cmVlLT5vOworCQkJCWZpeHVwLT5uZXh0ID0gZml4dXBsaXN0OworCQkJCWZpeHVwbGlzdCA9IGZpeHVwOworCQkJCWZpeHVwLT5pZGVudGlmaWVyID0gY3VycmVudHZhcjsKKworCQkJCXN3aXRjaCAob2JqLT52LT5zdG9yYWdlX2NsYXNzKQorCQkJCXsKKwkJCQkJY2FzZSBFWFRFUk46CisJCQkJCQlmaXh1cC0+dmFsdWUudHlwZSA9IEVYVEVSTjsKKwkJCQkJCWZpeHVwLT52YWx1ZS52YWwuaWRlbnRpZmllciA9IHN0cmR1cChvYmotPnYtPmlkZW50aWZpZXIpOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBTVEFUSUM6CisJCQkJCQlmaXh1cC0+dmFsdWUudHlwZSA9IFNUQVRJQzsKKwkJCQkJCWZpeHVwLT52YWx1ZS52YWwubnVtYmVyID0gb2JqLT52LT5vZmZzZXQ7CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0OgorCQkJCQkJaWVycm9yKDApOworCQkJCX0KKwkJCQlmaXh1cC0+dmFsdWUub2Zmc2V0ID0gMDsKKwkJCQlmaXh1cC0+b2Zmc2V0ID0gb2JqLT52YWwudmxvbmc7CisJCQkJZnByaW50ZihmcCwgIiAoMCkgKDApXG4iKTsKKwkJCQljdXJyZW50dmFyLm9mZnNldCArPSAyOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ZigidHlwZSAlZFxuIiwgdHlwZik7CisJCQlpZXJyb3IoMCk7CisJfQorfQorCisvKiBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIChTVEFUSUMgb3IgQVVUTykgZ2l2ZW4gb2JqZWN0LiAqLworCit6bWF4IHZvZmYoc3RydWN0IG9iaiogb2JqKQoreworCXptYXggb2Zmc2V0ID0gb2JqLT52LT5vZmZzZXQ7CisJaWYgKG9mZnNldCA8IDApCisJCW9mZnNldCA9IHN0YWNrcGFyYW1hZGp1c3QgKyBzdGFja29mZnNldCAtIG9mZnNldCAtIG1heGFsaWduOworCWVsc2UKKwkJb2Zmc2V0ICs9IHN0YWNrcGFyYW1hZGp1c3Q7CisKKwlvZmZzZXQgKz0gb2JqLT52YWwudmxvbmc7CisJcmV0dXJuIG9mZnNldDsKK30KKworLyogV2hlbiBhIHZhcmFyZ3MgZnVuY3Rpb24gaXMgY2FsbGVkLCB3ZSBuZWVkIHRvIGZpbmQgd2hlcmUgdGhlIHBhcmFtZXRlcnMgYXJlCisgKiBvbiB0aGUgc3RhY2sgaW4gb3JkZXIgdG8gbWFrZSB0aGUgX192YV9zdGFydCBtYWdpYyB2YXJpYWJsZSB3b3JrLiBUaGlzCisgKiBmdW5jdGlvbiBkb2VzIHRoYXQuICovCisKK3N0YXRpYyBpbnQgZmluZF92YXJhcmdzKHZvaWQpCit7CisJaW50IG9mZnNldCA9IDA7CisJc3RydWN0IHJlZ19oYW5kbGUgcmggPSBlbXB0eV9yZWdfaGFuZGxlOworCXN0cnVjdCBzdHJ1Y3RfZGVjbGFyYXRpb24qIHNkID0gZnVuY3Rpb24tPnZ0eXAtPmV4YWN0OworCWludCBzdGFja2FsaWduOworCWludCBpOworCisJZm9yIChpPTA7IGk8c2QtPmNvdW50OyBpKyspCisJeworCQkvKiBJZ25vcmUgdGhlIHBhcmFtZXRlciBpZiBpdCdzIGJlZW4gYXNzaWduZWQgYSByZWdpc3Rlci4gKi8KKworCQlpZiAoKCpzZC0+c2wpW2ldLnJlZyAhPSAwKQorCQkJY29udGludWU7CisKKwkJLyogdm9pZCBzaG91bGRuJ3QgaGFwcGVuLiAqLworCisJCWlmICgoKCpzZC0+c2wpW2ldLnN0eXAtPmZsYWdzICYgTlEpID09IFZPSUQpCisJCQlpZXJyb3IoMCk7CisKKwkJLyogRG9lcyB0aGUgYmFja2VuZCB3YW50IHRvIGFzc2lnbiBpdCB0byBhIHJlZ2lzdGVyPyAqLworCisJCWlmIChyZWdfcGFybSgmcmgsICgqc2QtPnNsKVtpXS5zdHlwLCAwLCAwKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIEFkZCBvbiB0aGUgc2l6ZSBvZiB0aGlzIHBhcmFtZXRlci4gKi8KKworCQlvZmZzZXQgKz0gc2l6ZXRhYlsoKnNkLT5zbClbaV0uc3R5cC0+ZmxhZ3MgJiBOUV07CisKKwkJLyogU3RhY2sgYWxpZ24uICovCisKKwkJc3RhY2thbGlnbiA9IGFsaWduWygqc2QtPnNsKVtpXS5zdHlwLT5mbGFncyAmIE5RXTsKKwkJb2Zmc2V0ID0gKChvZmZzZXQrMSkgLyBzdGFja2FsaWduKSAqIHN0YWNrYWxpZ247CisJfQorCisJcmV0dXJuIChvZmZzZXQgKyBzdGFja29mZnNldCk7Cit9CisKKy8qIE91dHB1dCB0aGUgbmFtZSBvZiBhIGdsb2JhbC4gKi8KKworc3RhdGljIHZvaWQgZW1pdF9pZGVudGlmaWVyKEZJTEUqIGZwLCBzdHJ1Y3Qgb2JqKiBvYmopCit7CisJc3dpdGNoIChvYmotPnYtPnN0b3JhZ2VfY2xhc3MpCisJeworCQljYXNlIFNUQVRJQzoKKwkJCWZwcmludGYoZnAsICJTVEFUSUNfJXNfJWxkIiwKKwkJCQltb2R1bGVuYW1lLCBvYmotPnYtPm9mZnNldCk7CisJCQlicmVhazsKKworCQljYXNlIEVYVEVSTjoKKwkJCWZwcmludGYoZnAsICJfJXMiLCBvYmotPnYtPmlkZW50aWZpZXIpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWllcnJvcigwKTsKKwl9Cit9CisKKy8qIFNhdmUgYSByZWdpc3Rlci4gKi8KKworc3RhdGljIHZvaWQgd3JpdGVfcmVnKEZJTEUqIGZwLCBzdHJ1Y3Qgb2JqKiBvYmosIGludCB0eXBmLCBpbnQgcmVnKQoreworCWludCBmbGFncyA9IG9iai0+ZmxhZ3MgJgorCQkoS09OU1R8UkVHfFZBUnxEUkVGT0JKfFZBUkFEUik7CisKKwkvKiBDb25zdGFudD8gKi8KKworCWlmIChmbGFncyA9PSBLT05TVCkKKwkJaWVycm9yKDApOworCQkKKwkvKiBEZXJlZmVyZW5jZT8gKi8KKworCWlmIChmbGFncyAmIERSRUZPQkopCisJCWdvdG8gZGVyZWZlcmVuY2U7CisKKwkvKiBSZWdpc3Rlcj8gKi8KKworCWlmICgoZmxhZ3MgPT0gUkVHKSB8fAorCSAgICAoKGZsYWdzICYgVkFSKSAmJiAoZmxhZ3MgJiBSRUcpICYmIChvYmotPnYtPnN0b3JhZ2VfY2xhc3MgPT0gQVVUTykpIHx8CisJICAgICgoZmxhZ3MgJiBWQVIpICYmIChmbGFncyAmIFJFRykgJiYgKG9iai0+di0+c3RvcmFnZV9jbGFzcyA9PSBSRUdJU1RFUikpKQorCXsKKwkJaWYgKGZsYWdzICYgRFJFRk9CSikKKwkJCWZwcmludGYoZnAsICJcdEBzdG9yZSVjICVzIDAgJXM7XG4iLAorCQkJCSgodHlwZiAmIE5RKSA9PSBDSEFSKSA/ICdiJyA6ICd3JywKKwkJCQlyZWduYW1lc1tvYmotPnJlZ10sIHJlZ25hbWVzW3JlZ10pOworCQllbHNlCisJCXsKKwkJCXN0cnVjdCB6b3AgaW47CisJCQlzdHJ1Y3Qgem9wIG91dDsKKwkJCWluLnR5cGUgPSBaT1BfUkVHOworCQkJaW4udmFsLnJlZyA9IHJlZzsKKwkJCW91dC50eXBlID0gWk9QX1JFRzsKKwkJCW91dC52YWwucmVnID0gb2JqLT5yZWc7CisJCQllbWl0X2FkZChmcCwgJmluLCAmem9wX3plcm8sICZvdXQpOworCQl9CisjaWYgMAorCQkJZnByaW50ZihmcCwgIlx0QGFkZCAlcyAwIC0+ICVzO1xuIiwKKwkJCQlyZWduYW1lc1tyZWddLCByZWduYW1lc1tvYmotPnJlZ10pOworI2VuZGlmCisJCXJldHVybjsKKwl9CisKKwkvKiBJdCBtdXN0IGJlIGEgdmFyaWFibGUuICovCisKKwlzd2l0Y2ggKG9iai0+di0+c3RvcmFnZV9jbGFzcykKKwl7CisJCWNhc2UgQVVUTzoKKwkJY2FzZSBSRUdJU1RFUjogLyogTG9jYWwgdmFyaWFibGUgKi8KKwkJeworCQkJem1heCBvZmZzZXQgPSB2b2ZmKG9iaik7CisKKwkJCWlmICgodHlwZiAmIE5RKSA9PSBDSEFSKQorCQkJCWZwcmludGYoZnAsICJcdEBzdG9yZWIgeHAgMCUrbGQgJXM7XG4iLAorCQkJCQlvZmZzZXQsIHJlZ25hbWVzW3JlZ10pOworCQkJZWxzZQorCQkJeworCQkJCWlmIChvZmZzZXQgJiAxKQorCQkJCXsKKwkJCQkJc3RydWN0IHpvcCBjOworCQkJCQljLnR5cGUgPSBaT1BfQ09OU1RBTlQ7CisJCQkJCWMudmFsLmNvbnN0YW50ID0gb2Zmc2V0OworCQkJCQllbWl0X2FkZChmcCwgJnpvcF94cCwgJmMsICZ6b3Bfc3RhY2spOworCQkJCQkvL2ZwcmludGYoZnAsICJcdEBhZGQgeHAgMCUrbGQgLT4gc3A7XG4iLCBvZmZzZXQpOworCQkJCQlmcHJpbnRmKGZwLCAiXHRAc3RvcmV3IHNwIDAgJXM7XG4iLCByZWduYW1lc1tyZWddKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlmcHJpbnRmKGZwLCAiXHRAc3RvcmV3IHhwIDAlK2xkICVzO1xuIiwKKwkJCQkJCW9mZnNldCA+PiAxLCByZWduYW1lc1tyZWddKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCisJCWNhc2UgRVhURVJOOgorCQljYXNlIFNUQVRJQzoKKworCQkJLyogRGVyZWZlcmVuY2Ugb2JqZWN0LiAqLworCisJCQlpZiAoKHR5cGYgJiBOUSkgPT0gQ0hBUikKKwkJCXsKKwkJCQlmcHJpbnRmKGZwLCAiXHRAc3RvcmViICIpOworCQkJCWVtaXRfaWRlbnRpZmllcihmcCwgb2JqKTsKKwkJCQlmcHJpbnRmKGZwLCAiIDAlK2xkICVzO1xuIiwKKwkJCQkJb2JqLT52YWwudmxvbmcsIHJlZ25hbWVzW3JlZ10pOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmIChvYmotPnZhbC52bG9uZyAmIDEpCisJCQkJeworCQkJCQlmcHJpbnRmKGZwLCAiXHRAYWRkICIpOworCQkJCQllbWl0X2lkZW50aWZpZXIoZnAsIG9iaik7CisJCQkJCWZwcmludGYoZnAsICIgMCUrbGQgLT4gc3A7XG4iLAorCQkJCQkJb2JqLT52YWwudmxvbmcpOworCQkJCQlmcHJpbnRmKGZwLCAiXHRAc3RvcmV3IHNwIDAgJXM7XG4iLAorCQkJCQkJcmVnbmFtZXNbcmVnXSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWZwcmludGYoZnAsICJcdEBzdG9yZXcgIik7CisJCQkJCWVtaXRfaWRlbnRpZmllcihmcCwgb2JqKTsKKwkJCQkJZnByaW50ZihmcCwgIiAwJStsZCAlcztcbiIsCisJCQkJCQlvYmotPnZhbC52bG9uZyA+PiAxLCByZWduYW1lc1tyZWddKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm47CisjaWYgMAorCQljYXNlIEVYVEVSTjogLyogRXh0ZXJuYWwgbGlua2FnZSAqLworCQkJaWYgKCh0eXBmICYgTlEpID09IENIQVIpCisJCQkJZnByaW50ZihmcCwgIlx0QHN0b3JlYiBfJXMgMCUrbGQgJXM7XG4iLAorCQkJCQlvYmotPnYtPmlkZW50aWZpZXIsIG9mZnNldCwgcmVnbmFtZXNbcmVnXSk7CisJCQllbHNlCisJCQl7CisKKwkJCQlmcHJpbnRmKGZwLCAiXHRAc3RvcmV3IF8lcyAwICVzO1xuIiwKKwkJCQkJb2JqLT52LT5pZGVudGlmaWVyLCByZWduYW1lc1tyZWddKTsKKwkJCXJldHVybjsKKworCQljYXNlIFNUQVRJQzogLyogU3RhdGljIGdsb2JhbCAqLworCQkJaWYgKCh0eXBmICYgTlEpID09IENIQVIpCisJCQkJZnByaW50ZihmcCwgIlx0QHN0b3JlYiBTVEFUSUNfJXNfJWxkIDAlK2xkICVzO1xuIiwKKwkJCQkJbW9kdWxlbmFtZSwgb2JqLT52LT5vZmZzZXQsIG9mZnNldCwgcmVnbmFtZXNbcmVnXSk7CisJCQllbHNlCisJCQkJZnByaW50ZihmcCwgIlx0QHN0b3JldyBTVEFUSUNfJXNfJWxkIDAgJXM7XG4iLAorCQkJCQltb2R1bGVuYW1lLCBvYmotPnYtPm9mZnNldCwgcmVnbmFtZXNbcmVnXSk7CisJCQlyZXR1cm47CisjZW5kaWYKKworCQlkZWZhdWx0OgorCQkJaWVycm9yKDApOworCX0KKworCWllcnJvcigwKTsgLy8gTm90IHJlYWNoZWQKK2RlcmVmZXJlbmNlOgorCS8qIFRoZXNlIGFyZSBhICpwYWluKi4KKwkgKgorCSAqIFRoZSBmaXJzdCB0aGluZyB3ZSBuZWVkIHRvIGRvIGlzIHRvIHJlYWQgdGhlIG9sZCBjb250ZW50cyBvZiB0aGUKKwkgKiBtZW1vcnkgY2VsbCwgdG8gd29yayBvdXQgdGhlIGFkZHJlc3Mgd2UgbmVlZCB0byB3cml0ZSB0bzsgYW5kIHRoZW4KKwkgKiBkbyB0aGUgd3JpdGUuIEh1cnJheSBmb3IgdGhlIFotbWFjaGluZSBzdGFjay4gKi8KKworCW9iai0+ZmxhZ3MgJj0gfkRSRUZPQko7CisJcmVhZF9yZWcoZnAsIG9iaiwgUE9JTlRFUiwgMCk7CisJZnByaW50ZihmcCwgIlx0QHN0b3JlJWMgc3AgMCAlcztcbiIsCisJCSgodHlwZiAmIE5RKSA9PSBDSEFSKSA/ICdiJyA6ICd3JywKKwkJcmVnbmFtZXNbcmVnXSk7Cit9CisKKy8qIE1vdmUgb25lIHJlZ2lzdGVyIHRvIGFub3RoZXIgcmVnaXN0ZXIuICovCisKK3N0YXRpYyB2b2lkIG1vdmVfcmVnKEZJTEUqIGZwLCBpbnQgcmVnMSwgaW50IHJlZzIpCit7CisJc3RydWN0IHpvcCByMTsKKwlzdHJ1Y3Qgem9wIHIyOworCXIxLnR5cGUgPSBaT1BfUkVHOworCXIxLnZhbC5yZWcgPSByZWcxOworCXIyLnR5cGUgPSBaT1BfUkVHOworCXIyLnZhbC5yZWcgPSByZWcyOworCWVtaXRfYWRkKGZwLCAmcjEsICZ6b3BfemVybywgJnIyKTsKK30KKy8qIExvYWQgYSB2YWx1ZSBpbnRvIGEgem9wLiAqLworCitzdGF0aWMgdm9pZCByZWFkX3JlZyhGSUxFKiBmcCwgc3RydWN0IG9iaiogb2JqLCBpbnQgdHlwZiwgaW50IHJlZykKK3sKKwlpbnQgZmxhZ3MgPSBvYmotPmZsYWdzICYKKwkJKEtPTlNUfFJFR3xWQVJ8RFJFRk9CSnxWQVJBRFIpOworCisJLyogVGhlIG9ubHkgdGhpbmcgeW91IGNhbiBkbyB3aXRoIGEgZnVuY3Rpb24gaXMgdG8gdGFrZSB0aGUgYWRkcmVzcyBvZgorCSAqIGl0LiAqLworCisJaWYgKCh0eXBmICYgTlEpID09IEZVTktUKQorCQlmbGFncyAmPSB+RFJFRk9CSiAmIH5WQVJBRFI7CisKKwkvKiBJcyB0aGlzIGEgbWVtb3J5IGRlcmVmZXJlbmNlPyAqLworCisJaWYgKGZsYWdzICYgRFJFRk9CSikKKwkJZ290byBkZXJlZmVyZW5jZTsKKwkKKwkvKiBDb25zdGFudD8gKi8KKworCWlmIChmbGFncyA9PSBLT05TVCkKKwl7CisJCXN0cnVjdCB6b3AgYzsKKwkJc3RydWN0IHpvcCByOworCQljLnR5cGUgPSBaT1BfQ09OU1RBTlQ7CisJCS8vZnByaW50ZihmcCwgIlx0QGFkZCAiKTsKKwkJc3dpdGNoICh0eXBmICYgTlEpCisJCXsKKwkJCWNhc2UgQ0hBUjoJCWMudmFsLmNvbnN0YW50ID0gb2JqLT52YWwudmNoYXI7CWJyZWFrOworCQkJY2FzZSBVTlNJR05FRHxDSEFSOgljLnZhbC5jb25zdGFudCA9IG9iai0+dmFsLnZ1Y2hhcjsJYnJlYWs7CisJCQljYXNlIFNIT1JUOgkJYy52YWwuY29uc3RhbnQgPSBvYmotPnZhbC52c2hvcnQ7CWJyZWFrOworCQkJY2FzZSBVTlNJR05FRHxTSE9SVDoJYy52YWwuY29uc3RhbnQgPSBvYmotPnZhbC52dXNob3J0OwlicmVhazsKKwkJY2FzZSBQT0lOVEVSOgkgICAgICBpZXJyb3IoMCk7CisJCQljYXNlIElOVDoJCWMudmFsLmNvbnN0YW50ID0gb2JqLT52YWwudmludDsJCWJyZWFrOworCQkJY2FzZSBVTlNJR05FRHxJTlQ6CWMudmFsLmNvbnN0YW50ID0gb2JqLT52YWwudnVpbnQ7CWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlpZXJyb3IodHlwZik7CisJCX0KKwkJci50eXBlID0gWk9QX1JFRzsKKwkJci52YWwucmVnID0gcmVnOworCQllbWl0X2FkZChmcCwgJmMsICZ6b3BfemVybywgJnIpOworCQkvL2ZwcmludGYoZnAsICIgMCAtPiAlcztcbiIsIHJlZ25hbWVzW3JlZ10pOworCX0KKwllbHNlIGlmIChmbGFncyA9PSBSRUcpIC8qIFJlZ2lzdGVyPyAqLworCXsKKwkJbW92ZV9yZWcoZnAsIG9iai0+cmVnLCByZWcpOworCQkvL2ZwcmludGYoZnAsICJcdEBhZGQgJXMgMCAtPiAlcztcbiIsIHJlZ25hbWVzW29iai0+cmVnXSwgcmVnbmFtZXNbcmVnXSk7CisJfQorCWVsc2UgaWYgKChmbGFncyAmIFJFRykgJiYgKCh0eXBmICYgTlEpID09IEZVTktUKSkgLyogRnVuY3Rpb24gcG9pbnRlcj8gKi8KKwl7CisJCW1vdmVfcmVnKGZwLCBvYmotPnJlZywgcmVnKTsKKwkJLy9mcHJpbnRmKGZwLCAiXHRAYWRkICVzIDAgLT4gJXM7XG4iLCByZWduYW1lc1tvYmotPnJlZ10sIHJlZ25hbWVzW3JlZ10pOworCX0KKwllbHNlCisJeworCQkvKiBJdCBtdXN0IGJlIGEgdmFyaWFibGUuICovCisKKwkJc3dpdGNoIChvYmotPnYtPnN0b3JhZ2VfY2xhc3MpCisJCXsKKwkJCWNhc2UgQVVUTzoKKwkJCWNhc2UgUkVHSVNURVI6IC8qIExvY2FsIHZhcmlhYmxlICovCisJCQkJaWYgKGZsYWdzICYgVkFSQURSKQorCQkJCXsKKwkJCQkJZnByaW50ZihmcCwgIlx0QGFkZCB4cCAwJStsZCAtPiAlcztcbiIsCisJCQkJCQl2b2ZmKG9iaiksIHJlZ25hbWVzW3JlZ10pOworCQkJCX0KKwkJCQllbHNlIGlmIChmbGFncyAmIFJFRykKKwkJCQl7CisJCQkJCW1vdmVfcmVnKGZwLCBvYmotPnJlZywgcmVnKTsKKwkJCQkJLy9mcHJpbnRmKGZwLCAiXHRAYWRkICVzIDAgLT4gJXM7XG4iLAorCQkJCQkvLwlyZWduYW1lc1tvYmotPnJlZ10sIHJlZ25hbWVzW3JlZ10pOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl6bWF4IG9mZnNldCA9IHZvZmYob2JqKTsKKworCQkJCQlpZiAoKHR5cGYgJiBOUSkgPT0gQ0hBUikKKwkJCQkJCWZwcmludGYoZnAsICJcdEBsb2FkYiB4cCAwJStsZCAtPiAlcztcbiIsCisJCQkJCQkJb2Zmc2V0LCByZWduYW1lc1tyZWddKTsKKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlpZiAob2Zmc2V0ICYgMSkKKwkJCQkJCXsKKwkJCQkJCQlmcHJpbnRmKGZwLCAiXHRAYWRkIHhwIDAlK2xkIC0+IHNwO1xuIiwgb2Zmc2V0KTsKKwkJCQkJCQlmcHJpbnRmKGZwLCAiXHRAbG9hZHcgc3AgMCAtPiAlcztcbiIsIHJlZ25hbWVzW3JlZ10pOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCWZwcmludGYoZnAsICJcdEBsb2FkdyB4cCAwJStsZCAtPiAlcztcbiIsCisJCQkJCQkJCW9mZnNldCA+PiAxLCByZWduYW1lc1tyZWddKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBTVEFUSUM6CisJCQljYXNlIEVYVEVSTjogLyogR2xvYmFsIHZhcmlhYmxlLiBJbXBsaWNpdCBkZXJlZmVyZW5jZSwKKwkJCQkJd2l0aCB0aGUgb2Zmc2V0IGluIG9iai0+dmFsLnZsb25nLiAqLworCisJCQkJLyogLi4uYnV0IGZ1bmN0aW9ucyBhcmUgbmV2ZXIgZGVyZWZlcmVuY2VkLiAqLworCisJCQkJaWYgKChmbGFncyAmIFZBUkFEUikgfHwKKwkJCQkgICAgKCh0eXBmICYgTlEpID09IEZVTktUKSkKKwkJCQl7CisJCQkJCS8qIEZldGNoIGFkZHJlc3Mgb2Ygb2JqZWN0LiAqLworCisJCQkJCWZwcmludGYoZnAsICJcdEBhZGQgIik7CisJCQkJCWVtaXRfaWRlbnRpZmllcihmcCwgb2JqKTsKKwkJCQkJZnByaW50ZihmcCwgIiAwJStsZCAtPiAlcztcbiIsCisJCQkJCQlvYmotPnZhbC52bG9uZywgcmVnbmFtZXNbcmVnXSk7CisJCQkJfQorCQkJCWVsc2UgaWYgKHN0cmNtcChvYmotPnYtPmlkZW50aWZpZXIsICJfX3ZhX3N0YXJ0IikgPT0gMCkKKwkJCQl7CisJCQkJCWZwcmludGYoZnAsICJcdEBhZGQgeHAgMCUrbGQgLT4gJXM7XG4iLAorCQkJCQkJZmluZF92YXJhcmdzKCksIHJlZ25hbWVzW3JlZ10pOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvKiBEZXJlZmVyZW5jZSBvYmplY3QuICovCisKKwkJCQkJaWYgKCh0eXBmICYgTlEpID09IENIQVIpCisJCQkJCXsKKwkJCQkJCWZwcmludGYoZnAsICJcdEBsb2FkYiAiKTsKKwkJCQkJCWVtaXRfaWRlbnRpZmllcihmcCwgb2JqKTsKKwkJCQkJCWZwcmludGYoZnAsICIgMCUrbGQgLT4gJXM7XG4iLAorCQkJCQkJCW9iai0+dmFsLnZsb25nLCByZWduYW1lc1tyZWddKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWlmIChvYmotPnZhbC52bG9uZyAmIDEpCisJCQkJCQl7CisJCQkJCQkJZnByaW50ZihmcCwgIlx0QGFkZCAiKTsKKwkJCQkJCQllbWl0X2lkZW50aWZpZXIoZnAsIG9iaik7CisJCQkJCQkJZnByaW50ZihmcCwgIiAwJStsZCAtPiBzcDtcbiIsCisJCQkJCQkJCW9iai0+dmFsLnZsb25nKTsKKwkJCQkJCQlmcHJpbnRmKGZwLCAiXHRAbG9hZHcgc3AgMCAtPiAlcztcbiIsCisJCQkJCQkJCXJlZ25hbWVzW3JlZ10pOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCWZwcmludGYoZnAsICJcdEBsb2FkdyAiKTsKKwkJCQkJCQllbWl0X2lkZW50aWZpZXIoZnAsIG9iaik7CisJCQkJCQkJZnByaW50ZihmcCwgIiAwJStsZCAtPiAlcztcbiIsCisJCQkJCQkJCW9iai0+dmFsLnZsb25nID4+IDEsIHJlZ25hbWVzW3JlZ10pOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWllcnJvcihvYmotPnYtPnN0b3JhZ2VfY2xhc3MpOworCQl9CisJfQorCXJldHVybjsKKworZGVyZWZlcmVuY2U6CisJLyogRG8gd2UgbmVlZCB0byBkZXJlZmVyZW5jZSB0aGUgdGhpbmcgd2UganVzdCBmZXRjaGVkPyAqLworCisJLyogRmV0Y2ggdGhlIHZhbHVlIHRvIGRlcmVmZXJlbmNlLiAqLworCW9iai0+ZmxhZ3MgJj0gfkRSRUZPQko7CisJcmVhZF9yZWcoZnAsIG9iaiwgUE9JTlRFUiwgMCk7CisJCQorCWlmIChmbGFncyAmIERSRUZPQkopCisJeworCQlzd2l0Y2ggKHR5cGYgJiBOUSkKKwkJeworCQkJY2FzZSBDSEFSOgorCQkJCWZwcmludGYoZnAsICJcdEBsb2FkYiBzcCAwIC0+ICVzO1xuIiwKKwkJCQkJcmVnbmFtZXNbcmVnXSwgcmVnbmFtZXNbcmVnXSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU0hPUlQ6CisJCQljYXNlIElOVDoKKwkJCWNhc2UgUE9JTlRFUjoKKwkJCWNhc2UgRlVOS1Q6CisJCQkJZnByaW50ZihmcCwgIlx0QGxvYWR3IHNwIDAgLT4gJXM7XG4iLAorCQkJCQlyZWduYW1lc1tyZWddLCByZWduYW1lc1tyZWddKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlpZXJyb3IodHlwZiAmIE5RKTsKKwkJfQorCX0KK30KKworLyogUmV0dXJucyB0aGUgem9wIHRvIHVzZSBmb3IgYW4gaW5wdXQgcGFyYW1ldGVyLCBwdXNoaW5nIHRoYXQgcGFyYW1ldGVyIG9udG8KKyAqIHRoZSBzdGFjayBpZiBuZWNlc3NhcnkuICovCisKK3N0YXRpYyB2b2lkIHB1c2hfdmFsdWUoRklMRSogZnAsIHN0cnVjdCBvYmoqIG9iaiwgaW50IHR5cGYsIHN0cnVjdCB6b3AqIG9wKQoreworCWludCBmbGFncyA9IG9iai0+ZmxhZ3MgJgorCQkoS09OU1R8UkVHfFZBUnxEUkVGT0JKfFZBUkFEUik7CisKKwlpZiAoZmxhZ3MgPT0gS09OU1QpCisJeworCQlvcC0+dHlwZSA9IFpPUF9DT05TVEFOVDsKKwkJc3dpdGNoICh0eXBmICYgTlUpCisJCXsKKwkJCWNhc2UgQ0hBUjoJCW9wLT52YWwuY29uc3RhbnQgPSBvYmotPnZhbC52Y2hhcjsJYnJlYWs7CisJCQljYXNlIFVOU0lHTkVEfENIQVI6CW9wLT52YWwuY29uc3RhbnQgPSBvYmotPnZhbC52dWNoYXI7CWJyZWFrOworCQkJY2FzZSBTSE9SVDoJCW9wLT52YWwuY29uc3RhbnQgPSBvYmotPnZhbC52c2hvcnQ7CWJyZWFrOworCQkJY2FzZSBVTlNJR05FRHxTSE9SVDoJb3AtPnZhbC5jb25zdGFudCA9IG9iai0+dmFsLnZ1c2hvcnQ7CWJyZWFrOworCQkJY2FzZSBJTlQ6CQlvcC0+dmFsLmNvbnN0YW50ID0gb2JqLT52YWwudmludDsJYnJlYWs7CisJCQljYXNlIFVOU0lHTkVEfElOVDoJb3AtPnZhbC5jb25zdGFudCA9IG9iai0+dmFsLnZ1aW50OwlicmVhazsKKwkJY2FzZSBQT0lOVEVSOgkJaWVycm9yKDApOworCQkJZGVmYXVsdDoKKwkJCQlmcHJpbnRmKGZwLCAiWFhYICEhISBiYWQga29uc3QgdHlwZSAlWFxuIiwgdHlwZik7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIFRoZSBvbmx5IHRoaW5nIHlvdSBjYW4gZG8gd2l0aCBhIGZ1bmN0aW9uIGlzIHRvIHRha2UgdGhlIGFkZHJlc3Mgb2YgaXQuICovCisKKwlpZiAoKHR5cGYgJiBOUSkgPT0gRlVOS1QpCisJCWZsYWdzICY9IH5EUkVGT0JKICYgflZBUkFEUjsKKworCS8qIFRoaXMgaXMgdXNlZCBieSB0aGUgbG9uZyBjb2RlLiBUaGUgbG9uZ29wIGZ1bmN0aW9ucyBjYW4gb25seSBvcGVyYXRlCisJICogb24gcG9pbnRlcnMgdG8gbG9uZ3M7IHNvIGlmIHdlIG5lZWQgdG8gcGFzcyBpbiBhIGNvbnN0YW50LCB3ZSBoYXZlCisJICogdG8gc3Rhc2ggaXQgb24gdGhlIHN0YWNrIGFuZCByZXR1cm4gYSBwb2ludGVyLiAqLworCisJaWYgKGZsYWdzID09IChLT05TVHxWQVJBRFIpKQorCXsKKwkJb3AtPnR5cGUgPSBaT1BfQ09OU1RBTlRBRERSOworCQlvcC0+dmFsLmNvbnN0YW50ID0gYWRkY29uc3RhbnQob2JqLT52YWwudmxvbmcpOworCQlyZXR1cm47CisJfQorCQorCWlmIChmbGFncyA9PSBSRUcpCisJeworCQlkZWJ1Z2VtaXQoZnAsICIhIHpvcCByZWcgJWRcbiIsIG9iai0+cmVnKTsKKwkJb3AtPnR5cGUgPSBaT1BfUkVHOworCQlvcC0+dmFsLnJlZyA9IG9iai0+cmVnOworCQlyZXR1cm47CisJfQorCisJaWYgKChmbGFncyA9PSAoVkFSfFJFRykpICYmCisJICAgICgob2JqLT52LT5zdG9yYWdlX2NsYXNzID09IEFVVE8pIHx8CisJICAgICAob2JqLT52LT5zdG9yYWdlX2NsYXNzID09IFJFR0lTVEVSKSkpCisJeworCQlkZWJ1Z2VtaXQoZnAsICIhIHpvcCB2YXIgcmVnICVkXG4iLCBvYmotPnJlZyk7CisJCW9wLT50eXBlID0gWk9QX1JFRzsKKwkJb3AtPnZhbC5yZWcgPSBvYmotPnJlZzsKKwkJcmV0dXJuOworCX0KKworCWlmICgoZmxhZ3MgPT0gKFZBUnxWQVJBRFIpKSAmJgorCSAgICAob2JqLT52LT5zdG9yYWdlX2NsYXNzID09IEVYVEVSTikgJiYKKwkgICAgKG9iai0+di0+b2Zmc2V0ID09IDApKQorCXsKKwkJZGVidWdlbWl0KGZwLCAiISB6b3AgdmFyYWRkciBleHRlcm4gJXNcbiIsIG9iai0+di0+aWRlbnRpZmllcik7CisJCW9wLT50eXBlID0gWk9QX0VYVEVSTjsKKwkJb3AtPnZhbC5pZGVudGlmaWVyID0gb2JqLT52LT5pZGVudGlmaWVyOworCQlyZXR1cm47CisJfQorCisJaWYgKChmbGFncyA9PSAoVkFSfFZBUkFEUikpICYmCisJICAgIChvYmotPnYtPnN0b3JhZ2VfY2xhc3MgPT0gU1RBVElDKSAmJgorCSAgICAob2JqLT52LT5vZmZzZXQgPT0gMCkpCisJeworCQlkZWJ1Z2VtaXQoZnAsICIhIHpvcCB2YXJhZGRyIHN0YXRpYyAlbGRcbiIsIG9iai0+di0+b2Zmc2V0KTsKKwkJb3AtPnR5cGUgPSBaT1BfU1RBVElDOworCQlvcC0+dmFsLmNvbnN0YW50ID0gb2JqLT52LT5vZmZzZXQ7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKGZsYWdzICYgVkFSKSAmJgorCSAgICAoKG9iai0+di0+dnR5cC0+ZmxhZ3MgJiBOUSkgPT0gRlVOS1QpKQorCXsKKwkJaWYgKG9iai0+di0+c3RvcmFnZV9jbGFzcyA9PSBFWFRFUk4pCisJCXsKKwkJCW9wLT50eXBlID0gWk9QX0VYVEVSTjsKKwkJCW9wLT52YWwuaWRlbnRpZmllciA9IG9iai0+di0+aWRlbnRpZmllcjsKKwkJfQorCQllbHNlCisJCXsKKwkJCW9wLT50eXBlID0gWk9QX1NUQVRJQzsKKwkJCW9wLT52YWwuY29uc3RhbnQgPSBvYmotPnYtPm9mZnNldDsKKwkJfQorCQlyZXR1cm47CisJfQorCQorCXJlYWRfcmVnKGZwLCBvYmosIHR5cGYsIDApOworCW9wLT50eXBlID0gWk9QX1NUQUNLOworfQorCisvKiBTYW1lIGFzIHB1c2hfdmFsdWUoKSwgYnV0IHJldHVybnMgYSB6b3AgZm9yIHRoZSAqYWRkcmVzcyogb2YgdGhlIG9iamVjdCwgbm90CisgKiB0aGUgb2JqZWN0IGl0c2VsZi4gVXNlZCBhIGxvdCBieSB0aGUgbG9uZyBjb2RlLiAqLworCitzdGF0aWMgdm9pZCBwdXNoX2FkZHJvZihGSUxFKiBmcCwgc3RydWN0IG9iaiogb2JqLCBpbnQgdHlwZiwgc3RydWN0IHpvcCogb3ApCit7CisJaWYgKG9iai0+ZmxhZ3MgJiBEUkVGT0JKKQorCQlvYmotPmZsYWdzICY9IH5EUkVGT0JKOworCWVsc2UKKwkJb2JqLT5mbGFncyB8PSBWQVJBRFI7CisJcHVzaF92YWx1ZShmcCwgb2JqLCBQT0lOVEVSLCBvcCk7Cit9CisKKy8qIFJldHVybnMgdGhlIHpvcCB0byB1c2UgZm9yIGFuIG91dHB1dCBwYXJhbWV0ZXIuIFVubGlrZSBwdXNoX3ZhbHVlLCB0aGlzIGRvZXMKKyAqIG5vdCBlbWl0IGEgcG9wOyB0aGF0IG11c3QgYmUgZG9uZSBsYXRlciwgaWYgdGhlIHJldHVybiBwYXJhbWV0ZXIgaXMgemVyby4gKi8KKworc3RhdGljIHZvaWQgcG9wX3ZhbHVlKEZJTEUqIGZwLCBzdHJ1Y3Qgb2JqKiBvYmosIGludCB0eXBmLCBzdHJ1Y3Qgem9wKiBvcCkKK3sKKwlpbnQgZmxhZ3MgPSBvYmotPmZsYWdzICYKKwkJKEtPTlNUfFJFR3xWQVJ8RFJFRk9CSnxWQVJBRFIpOworCisJLyogV2UgZG9uJ3QgZXZlbiAqdHJ5KiB0byBoYW5kbGUgZGVyZWZlcmVuY2VzIGhlcmUuICovCisKKwlpZiAoZmxhZ3MgJiBEUkVGT0JKKQorCQlnb3RvIHN0YWNrOworCisJaWYgKGZsYWdzID09IFJFRykKKwkJZ290byByZWc7CisKKwlpZiAoKGZsYWdzID09IChWQVJ8UkVHKSkgJiYKKwkgICAgKChvYmotPnYtPnN0b3JhZ2VfY2xhc3MgPT0gQVVUTykgfHwKKwkgICAgIChvYmotPnYtPnN0b3JhZ2VfY2xhc3MgPT0gUkVHSVNURVIpKSkKKwkJZ290byByZWc7CisKK3N0YWNrOgorCW9wLT50eXBlID0gWk9QX1NUQUNLOworCXJldHVybjsKKworcmVnOgorCW9wLT50eXBlID0gWk9QX1JFRzsKKwlvcC0+dmFsLnJlZyA9IG9iai0+cmVnOworfQorCisvKiBXcml0ZXMgY29kZSBmb3IgYSB6b3AuICovCisKK3N0YXRpYyB2b2lkIGVtaXRfem9wKEZJTEUqIGZwLCBzdHJ1Y3Qgem9wKiBvcCkKK3sKKwlzd2l0Y2ggKG9wLT50eXBlKQorCXsKKwkJY2FzZSBaT1BfU1RBQ0s6CisJCQlmcHJpbnRmKGZwLCAic3AiKTsKKwkJCXJldHVybjsKKworCQljYXNlIFpPUF9SRUc6CisJCQlmcHJpbnRmKGZwLCAiJXMiLCByZWduYW1lc1tvcC0+dmFsLnJlZ10pOworCQkJcmV0dXJuOworCisJCWNhc2UgWk9QX0NPTlNUQU5UOgorCQkJZnByaW50ZihmcCwgIjAlK2xkIiwgKHpzaG9ydClvcC0+dmFsLmNvbnN0YW50KTsKKwkJCXJldHVybjsKKworCQljYXNlIFpPUF9FWFRFUk46CisJCQlmcHJpbnRmKGZwLCAiXyVzIiwgb3AtPnZhbC5pZGVudGlmaWVyKTsKKwkJCXJldHVybjsKKworCQljYXNlIFpPUF9TVEFUSUM6CisJCQlmcHJpbnRmKGZwLCAiU1RBVElDXyVzXyVsZCIsCisJCQkJbW9kdWxlbmFtZSwgb3AtPnZhbC5jb25zdGFudCk7CisJCQlyZXR1cm47CisKKwkJY2FzZSBaT1BfQ09OU1RBTlRBRERSOgorCQkJZnByaW50ZihmcCwgIkNPTlNUQU5UXyVzXyVsZCIsCisJCQkJbW9kdWxlbmFtZSwgb3AtPnZhbC5jb25zdGFudCk7CisJCQlyZXR1cm47CisKKwkJZGVmYXVsdDoKKwkJCWllcnJvcihvcC0+dHlwZSk7CisJfQorfQorCisvKiBUaGlzIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBwb3BfdmFsdWUoKS4gcG9wX3ZhbHVlKCkgcmV0dXJucyBhIHpvcCB0aGF0CisgKiByZXByZXNlbnRzIHRoZSByZXR1cm4gdmFsdWUgZm9yIGEgZnVuY3Rpb24uIElmIHRoYXQgcmV0dXJuIHZhbHVlIGlzIHRoZQorICogc3RhY2ssIHRoZSB2YWx1ZSBvbiB0aGUgc3RhY2sgbmVlZHMgdG8gYmUgd3JpdHRlbiBiYWNrIGludG8gbWVtb3J5LiBUaGF0J3MKKyAqIHdoYXQgdGhpcyBmdW5jdGlvbiBkb2VzLiAqLworCitzdGF0aWMgdm9pZCBmaW5fem9wKEZJTEUqIGZwLCBzdHJ1Y3Qgb2JqKiBvYmosIGludCB0eXBmLCBzdHJ1Y3Qgem9wKiBvcCkKK3sKKwlzd2l0Y2ggKG9wLT50eXBlKQorCXsKKwkJY2FzZSBaT1BfU1RBQ0s6CisJCQl3cml0ZV9yZWcoZnAsIG9iaiwgdHlwZiwgMCk7CisJCQlyZXR1cm47CisKKwkJY2FzZSBaT1BfUkVHOgorCQkJcmV0dXJuOworCisJCWRlZmF1bHQ6CisJCQlpZXJyb3IoMCk7CisJfQorfQorCisvKiBFbWl0IGEgYmFzaWMgQUREIGluc3RydWN0aW9uLgorICogVGhpcyByb3V0aW5lIHRlc3RzIGZvciBhbGwgdGhlIHZhcmlvdXMgc3BlY2lhbCBjYXNlcywgb2Ygd2hpY2ggdGhlcmUgYXJlCisgKiBtYW55LCBhbmQgYXR0ZW1wdHMgdG8gcHJvZHVjZSBvcHRpbWFsIGNvZGUuCisgKi8KKworc3RhdGljIHZvaWQgZW1pdF9hZGQoRklMRSogZnAsIHN0cnVjdCB6b3AqIHExLCBzdHJ1Y3Qgem9wKiBxMiwgc3RydWN0IHpvcCogeikKK3sKKwkvKiBTb21ldGltZXMgd2UgZ2V0IFpPUF9SRUcgd2l0aCByZWc9MC4gVGhpcyBhY3R1YWxseSBtZWFucyB0aGUgc3RhY2suICovCisKKwlpZiAoKHExLT50eXBlID09IFpPUF9SRUcpICYmIChxMS0+dmFsLnJlZyA9PSAwKSkKKwkJcTEgPSAmem9wX3N0YWNrOworCWlmICgocTItPnR5cGUgPT0gWk9QX1JFRykgJiYgKHEyLT52YWwucmVnID09IDApKQorCQlxMiA9ICZ6b3Bfc3RhY2s7CisJaWYgKCh6LT50eXBlID09IFpPUF9SRUcpICYmICh6LT52YWwucmVnID09IDApKQorCQl6ID0gJnpvcF9zdGFjazsKKworCS8qIElmIHEyIGlzIGEgY29uc3RhbnQgYW5kIDAsIHRoZW4gdGhpcyBtaWdodCBiZSBhIHJlZ2lzdGVyIG1vdmUgb2YKKwkgKiBzb21lIGtpbmQuICovCisKKwlpZiAoKHEyLT50eXBlID09IFpPUF9DT05TVEFOVCkgJiYgKHEyLT52YWwuY29uc3RhbnQgPT0gMCkpCisJeworCQkvKiBMZWZ0IGlzIGEgcmVnaXN0ZXI/ICovCisJCWlmIChxMS0+dHlwZSA9PSBaT1BfUkVHKQorCQl7CisJCQkvKiBSaWdodCBpcyBhIHJlZ2lzdGVyPyAqLworCQkJaWYgKHotPnR5cGUgPT0gWk9QX1JFRykKKwkJCXsKKwkJCQkvKiBUaGV5J3JlIHRoZSAqc2FtZSogcmVnaXN0ZXI/ICovCisJCQkJaWYgKHExLT52YWwucmVnID09IHotPnZhbC5yZWcpCisJCQkJeworCQkJCQkvKiBObyBjb2RlIG5lZWQgYmUgZW1pdHRlZC4gKi8KKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCS8qIEVtaXQgYSBAc3RvcmUgaW5zdHJ1Y3Rpb24uIFVuZm9ydHVuYXRlbHksIEkKKwkJCQkgKiBjYW4ndCB3b3JrIG91dCB0aGUgc3ludGF4IGZvciBJbmZvcm0ncworCQkJCSAqIEBzdG9yZSBvcGNvZGUsIHNvIHdlIGVtaXQgYSBoaWdoLWxldmVsCisJCQkJICogYXNzaWdubWVudCBpbnN0ZWFkIGFuZCBsZXQgSW5mb3JtIHdvcmsgaXQKKwkJCQkgKiBvdXQuICovCisKKwkJCQlmcHJpbnRmKGZwLCAiXHQiKTsKKwkJCQllbWl0X3pvcChmcCwgeik7CisJCQkJZnByaW50ZihmcCwgIiA9ICIpOworCQkJCWVtaXRfem9wKGZwLCBxMSk7CisJCQkJZnByaW50ZihmcCwgIjtcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLyogUmlnaHQgaXMgdGhlIHN0YWNrPyAqLworCQkJaWYgKHotPnR5cGUgPT0gWk9QX1NUQUNLKQorCQkJeworCQkJCS8qIFdlJ3JlIHB1c2hpbmcgdGhlIHNpbmdsZSBwYXJhbWV0ZXIgb250byB0aGUKKwkJCQkgKiBzdGFjay4gKi8KKworCQkJCWZwcmludGYoZnAsICJcdEBwdXNoICIpOworCQkJCWVtaXRfem9wKGZwLCBxMSk7CisJCQkJZnByaW50ZihmcCwgIjtcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCS8qIExlZnQgaXMgdGhlIHN0YWNrPyAqLworCQlpZiAocTEtPnR5cGUgPT0gWk9QX1NUQUNLKQorCQl7CisJCQkvKiBSaWdodCBpcyBhIHJlZ2lzdGVyPyAqLworCQkJaWYgKHotPnR5cGUgPT0gWk9QX1JFRykKKwkJCXsKKwkJCQkvKiBXZSdyZSBwb3BwaW5nIHRoZSBzaW5nbGUgcGFyYW1ldGVyIG9mZiB0aGUKKwkJCQkgKiBzdGFjay4gKi8KKworCQkJCWZwcmludGYoZnAsICJcdEBwdWxsICIpOworCQkJCWVtaXRfem9wKGZwLCB6KTsKKwkJCQlmcHJpbnRmKGZwLCAiO1xuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorCisJLyogRmFsbCBiYWNrIG9uIGFuIG9yZGluYXJ5IEBhZGQuICovCisKKwlmcHJpbnRmKGZwLCAiXHRAYWRkICIpOworCWVtaXRfem9wKGZwLCBxMSk7CisJZnByaW50ZihmcCwgIiAiKTsKKwllbWl0X3pvcChmcCwgcTIpOworCWZwcmludGYoZnAsICIgLT4gIik7CisJZW1pdF96b3AoZnAsIHopOworCWZwcmludGYoZnAsICI7XG4iKTsKK30KKworLyogQ29weSBhIHZhbHVlIGZyb20gb25lIHpvcCB0byBhbm90aGVyLiBUaGlzIGlzIG5vdCBxdWl0ZSBhcyBzaW1wbGUgYXMgeW91CisgKiBtaWdodCB0aGluaywgYmVjYXVzZSB0aGVyZSBhcmUgYSBudW1iZXIgb2Ygb3B0aW1pc2F0aW9uIGNhc2VzIHRvIHRha2UgaW50bworICogYWNjb3VudC4KKyAqCisgKiBOT1RFOiBmb3Igc2ltcGxpY2l0eSwgdGhpcyBmdW5jdGlvbiB3aWxsIG5ldmVyIGVtaXQganVzdCBhIHNpbmdsZQorICogaW5zdHJ1Y3Rpb24gLS0tIHRoZSBhc3NpZ25tZW50IGlzIGFsd2F5cyBkb25lIHZpYSB0aGUgc3RhY2suIEZJWE1FLiAqLworCitzdGF0aWMgdm9pZCBtb3ZlX3ZhbHVlKEZJTEUqIGZwLCBzdHJ1Y3Qgb2JqKiBxMW8sIHN0cnVjdCBvYmoqIHpvLCBpbnQgdHlwZikKK3sKKwlzdHJ1Y3Qgem9wIHExOworCXN0cnVjdCB6b3AgejsKKworCXBvcF92YWx1ZShmcCwgem8sIHR5cGYsICZ6KTsKKwlwdXNoX3ZhbHVlKGZwLCBxMW8sIHR5cGYsICZxMSk7CisJZGVidWdlbWl0KGZwLCAiISBMPSVkIFI9JWRcbiIsIHExLnR5cGUsIHoudHlwZSk7CisJLyogSW4gYWxsIGNhc2VzIGV4Y2VwdCB3aGVuIHB1c2hfdmFsdWUoKSBhbmQgZmluX3pvcCgpICpib3RoKiBlbWl0CisJICogY29kZSwgd2UgbmVlZCB0byBpbnNlcnQgYW4gYXNzaWdubWVudCBoZXJlLiBBcyB0aGV5IG9ubHkgZW1pdCBjb2RlCisJICogaW4gdGhlIFpPUF9TVEFDSyBjYXNlLi4uICovCisJaWYgKChxMS50eXBlICE9IFpPUF9TVEFDSykgfHwgKHoudHlwZSAhPSBaT1BfU1RBQ0spKQorCXsKKwkJZW1pdF9hZGQoZnAsICZxMSwgJnpvcF96ZXJvLCAmeik7CisjaWYgMAorCQlmcHJpbnRmKGZwLCAiXHRAYWRkICIpOworCQllbWl0X3pvcChmcCwgJnExKTsKKwkJZnByaW50ZihmcCwgIiAwIC0+ICIpOworCQllbWl0X3pvcChmcCwgJnopOworCQlmcHJpbnRmKGZwLCAiO1xuIik7CisjZW5kaWYKKwl9CisJZmluX3pvcChmcCwgem8sIHR5cGYsICZ6KTsKK30KKwkKKy8qIENvcHkgYSAzMi1iaXQgdmFsdWUgZnJvbSBvbmUgb2JqIHRvIGFub3RoZXIuICovCisKK3N0YXRpYyB2b2lkIG1vdmVfbG9uZ192YWx1ZShGSUxFKiBmcCwgc3RydWN0IG9iaiogcTEsIHN0cnVjdCBvYmoqIHosIGludCB0eXBmKQoreworCWludCBmbGFncyA9IHExLT5mbGFncyAmCisJCShLT05TVHxSRUd8VkFSfERSRUZPQkp8VkFSQURSKTsKKwlzdHJ1Y3Qgem9wIHExejsKKwlzdHJ1Y3Qgem9wIHp6OworCQorCWlmIChmbGFncyA9PSBLT05TVCkKKwl7CisJCWludCBoaSA9IHh3b3JkKHExLT52YWwudmxvbmcsIDEpOworCQlpbnQgbG8gPSB4d29yZChxMS0+dmFsLnZsb25nLCAwKTsKKworCQlwdXNoX2FkZHJvZihmcCwgeiwgUE9JTlRFUiwgJnp6KTsKKwkJZnByaW50ZihmcCwgIlx0QGNhbGxfdm4gX19sb25nX2xvYWRjb25zdCAiKTsKKwkJZW1pdF96b3AoZnAsICZ6eik7CisJCWZwcmludGYoZnAsICIgMCUrbGQgMCUrbGQ7XG4iLCAoc2hvcnQpaGksIChzaG9ydClsbyk7CisJCXJldHVybjsKKwl9CisKKwlwdXNoX2FkZHJvZihmcCwgeiwgUE9JTlRFUiwgJnp6KTsKKwlwdXNoX2FkZHJvZihmcCwgcTEsIFBPSU5URVIsICZxMXopOworCWZwcmludGYoZnAsICJcdEBjb3B5X3RhYmxlICIpOworCWVtaXRfem9wKGZwLCAmcTF6KTsKKwlmcHJpbnRmKGZwLCAiICIpOworCWVtaXRfem9wKGZwLCAmenopOworCWZwcmludGYoZnAsICIgNDtcbiIpOworfQorCisvKiBUaGUgY29kZSBnZW5lcmF0b3IgaXRzZWxmLgorICogVGhpcyBiaWcsIGNvbXBsaWNhdGVkLCBoYWlyeSBhbmQgc2NhcnkgZnVuY3Rpb24gZG9lcyB0aGUgd29yayB0byBhY3R1YWxseQorICogcHJvZHVjZSB0aGUgY29kZS4gIGZwIGlzIHRoZSBvdXRwdXQgc3RyZWFtLCBpYyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpYworICogY2hhaW4sIGZ1bmMgaXMgYSBwb2ludGVyIHRvIHRoZSBhY3R1YWwgZnVuY3Rpb24gYW5kIHN0YWNrZnJhbWUgaXMgdGhlIHNpemUKKyAqIG9mIHRoZSBmdW5jdGlvbidzIHN0YWNrIGZyYW1lLgorICovCisKK3ZvaWQgZ2VuX2NvZGUoRklMRSogZnAsIHN0cnVjdCBJQyAqaWMsIHN0cnVjdCBWYXIqIGZ1bmMsIHptYXggc3RhY2tmcmFtZSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgem9wIHExOworCXN0cnVjdCB6b3AgcTI7CisJc3RydWN0IHpvcCB6OworCWludCBjb2RlLCB0eXBmOyAvLyAuLi5vZiB0aGUgSUMgdW5kZXIgY29uc2lkZXJhdGlvbgorCisgICAgaW50IGMsdCxsYXN0Y29tcD0wLHJlZzsKKwkgICAgCisgICAgCWZ1bmN0aW9uID0gZnVuYzsKKworCS8qIHIwLi5yNSBhcmUgYWx3YXlzIHVzZWQgZm9yIHBhcmFtZXRlciBwYXNzaW5nLiAqLworCisJcmVndXNlZFsyXSA9IDE7CisJcmVndXNlZFszXSA9IDE7CisJcmVndXNlZFs0XSA9IDE7CisJcmVndXNlZFs1XSA9IDE7CisJcmVndXNlZFs2XSA9IDE7CisJcmVndXNlZFs3XSA9IDE7CisKKwkvKiBUaGlzIGlzIHRoZSBvZmZzZXQgb2YgdGhlIHN0YWNrIGZyYW1lLCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBzdGFjaworCSAqIHBvaW50ZXIuICovCisKKwlzdGFja29mZnNldCA9IHN0YWNrZnJhbWU7CisKKwkvKiBObyBwYXJhbWV0ZXJzIHB1c2hlZCB5ZXQuICovCisKKwlzdGFja3BhcmFtYWRqdXN0ID0gMDsKKworCXJlZmxvd2VyKGZwKTsKKworCWlmIChmdW5jLT5zdG9yYWdlX2NsYXNzID09IFNUQVRJQykKKwkJZnByaW50ZihmcCwgIlsgU1RBVElDXyVzXyVsZCB4cFxuIiwgbW9kdWxlbmFtZSwgZnVuYy0+b2Zmc2V0KTsKKwllbHNlCisJCWZwcmludGYoZnAsICJbIF8lcyB4cFxuIiwgZnVuYy0+aWRlbnRpZmllcik7CisKKwkvKiBUZWxsIEluZm9ybSB3aGF0IHJlZ2lzdGVycyB0aGUgZnVuY3Rpb24gaXMgdXNpbmcuICovCisKKwlmb3IgKGk9MTsgaTw9TUFYUjsgaSsrKQorCXsKKwkJLy9mcHJpbnRmKGZwLCAiISBpPSVkIHVzZWQgJWQgc2NyYXRjaCAlZCBhbGxvYyAlZFxuIiwKKwkJLy8JCWksIHJlZ3VzZWRbaV0sIHJlZ3NjcmF0Y2hbaV0sIHJlZ3NhW2ldKTsKKwkJaWYgKHJlZ3VzZWRbaV0gJiYgIXJlZ3NhW2ldKQorCQkJZnByaW50ZihmcCwgIlx0JXNcbiIsIHJlZ25hbWVzW2ldKTsKKwl9CisJZnByaW50ZihmcCwgIjtcbiIpOworCisJLyogVHJhY2UgdGhlIGZ1bmN0aW9uIG5hbWUuICovCisKKwlpZiAoZ19mbGFnc1sxXSAmIFVTRURGTEFHKQorCXsKKwkJaWYgKGZ1bmMtPnN0b3JhZ2VfY2xhc3MgPT0gU1RBVElDKQorCQkJZnByaW50ZihmcCwgInByaW50IFwiU1RBVElDXyVzXyVsZF5cIjtcbiIsIG1vZHVsZW5hbWUsIGZ1bmMtPm9mZnNldCk7CisJCWVsc2UKKwkJCWZwcmludGYoZnAsICJwcmludCBcIl8lc15cIjtcbiIsIGZ1bmMtPmlkZW50aWZpZXIpOworCX0KKwkKKwkvKiBBZGp1c3Qgc3RhY2sgZm9yIGxvY2Fscy4gKi8KKworCWlmIChzdGFja2ZyYW1lKQorCQlmcHJpbnRmKGZwLCAiXHRAc3ViIHhwIDAlK2xkIC0+IHhwO1xuIiwgc3RhY2tmcmFtZSk7CisJLy9pZiAoc3RhY2tvZmZzZXQpCisJLy8JZnByaW50ZihmcCwgIlx0eHAgPSB4cCAtICVsZFxuIiwgc3RhY2tmcmFtZSk7CisKKyAgICAKKyAgICAJLyogSXRlcmF0ZSB0aHJvdWdoIGFsbCBJQ3MuICovCisKKwlmb3IgKDsgZHVtcF9pYyhmcCwgaWMpLCBpYzsgaWM9aWMtPm5leHQpCisJeworICAgICAgICBjPWljLT5jb2RlO3Q9aWMtPnR5cGY7CisJCWNvZGUgPSBpYy0+Y29kZTsKKwkJdHlwZiA9IGljLT50eXBmOworCisJCS8qIERvIG5vdGhpbmcgZm9yIE5PUHMuICovCisKKwkJaWYgKGNvZGUgPT0gTk9QKQorCQkJY29udGludWU7CisKKwkJLyogSGFzIHRoZSBzdGFjayBiZWVuIGFkanVzdGVkIGR1ZSB0byBhIGNhbGw/ICovCisKKyNpZiAwCisJCWlmIChzdGFja2NhbGxhZGp1c3RtZW50KQorCQl7CisJCQlpZiAoKGNvZGUgIT0gR0VUUkVUVVJOKSAmJgorCQkJICAgIChjb2RlICE9IEZSRUVSRUcpICYmCisJCQkgICAgKGNvZGUgIT0gQUxMT0NSRUcpKQorCQkJeworCQkJCWRlYnVnZW1pdChmcCwgIiEgc3RhY2sgcmVzZXQgJWQgJWRcbiIsCisJCQkJCXN0YWNrcGFyYW1hZGp1c3QsIHN0YWNrY2FsbHBhcmFtc2l6ZSk7CisJCQkJZnByaW50ZihmcCwgIlx0QGFkZCB4cCAlZCAtPiB4cDtcbiIsCisJCQkJCXN0YWNrcGFyYW1hZGp1c3Qrc3RhY2tjYWxscGFyYW1zaXplKTsKKwkJCQlzdGFja3BhcmFtYWRqdXN0ID0gMDsKKwkJCQlzdGFja2NhbGxwYXJhbXNpemUgPSAwOworCQkJCXN0YWNrY2FsbGFkanVzdG1lbnQgPSAwOworCQkJfQorCQl9CisjZW5kaWYKKworI2lmIDAKKyAgICAgICAgaWYobm90cG9wcGVkJiYhZG9udHBvcCl7CisgICAgICAgICAgICBpbnQgZmxhZz0wOworICAgICAgICAgICAgaWYoYz09TEFCRUx8fGM9PUNPTVBBUkV8fGM9PVRFU1R8fGM9PUJSQSl7CisgICAgICAgICAgICAgICAgZnByaW50ZihmcCwiXHRhZGRcdCVzLCMlbGRcbiIscmVnbmFtZXNbc3BdLG5vdHBvcHBlZCk7CisgICAgICAgICAgICAgICAgc3RhY2tvZmZzZXQrPW5vdHBvcHBlZDtub3Rwb3BwZWQ9MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisJCS8qIFRoZXNlIG9wY29kZXMgdHVybiBpbnRvIG90aGVyIG9wY29kZXMuICovCisKKwkJc3dpdGNoIChjb2RlKQorCQl7CisJCQljYXNlIFNVQlBGUDoKKwkJCWNhc2UgU1VCSUZQOgorCQkJCWNvZGUgPSBTVUI7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQURESTJQOgorCQkJCWNvZGUgPSBBREQ7CisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBBbmQgbm93IHRoZSBiaWcgb3Bjb2RlIHN3aXRjaC4gKi8KKworCQlzd2l0Y2ggKGNvZGUpCisJCXsKKwkJCWNhc2UgQUxMT0NSRUc6IC8qIE1hcmsgcmVnaXN0ZXIgaW4gdXNlICovCisJCQkJcmVnc1tpYy0+cTEucmVnXSA9IDE7CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgRlJFRVJFRzogLyogTWFyayByZWdpc3RlciBub3QgaW4gdXNlICovCisJCQkJcmVnc1tpYy0+cTEucmVnXSA9IDA7CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgTEFCRUw6IC8qIEVtaXQganVtcCB0YXJnZXQgKi8KKwkJCQlmcHJpbnRmKGZwLCAiLiVzJWQ7XG4iLAorCQkJCQlsYWJlbHByZWZpeCwgdHlwZik7CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgQlJBOiAvKiBVbmNvbmRpdGlvbmFsIGp1bXAgKi8KKwkJCQlmcHJpbnRmKGZwLCAiXHRqdW1wICVzJWQ7XG4iLAorCQkJCQlsYWJlbHByZWZpeCwgdHlwZik7CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgR0VUUkVUVVJOOiAvKiBSZWFkIHRoZSBsYXN0IGZ1bmN0aW9uIGNhbGwncyByZXR1cm4gcGFyYW1ldGVyICovCisJCQkJc3dpdGNoICh0eXBmICYgTlEpCisJCQkJeworCQkJCQljYXNlIENIQVI6CisJCQkJCQkvL2lmIChpYy0+cTIudmFsLnZsb25nICE9IDEpCisJCQkJCQkvLwlnb3RvIGNvcHlfc3RydWN0OworCQkJCQkJLyogZmFsbCB0aHJvdWdoICovCisJCQkJCWNhc2UgU0hPUlQ6CisJCQkJCWNhc2UgSU5UOgorCQkJCQljYXNlIFBPSU5URVI6CisJCQkJCQl3cml0ZV9yZWcoZnAsICZpYy0+eiwgdHlwZiwgMik7CisJCQkJCQlicmVhazsKKworCQkJCQkJLyogSWdub3JlIHRoZSBmb2xsb3dpbmc7IHRoZQorCQkJCQkJICogZnJvbnQtZW5kIHdpbGwgYXV0b21hdGljYWxseQorCQkJCQkJICogcGFzcyBpbiBhbiBpbXBsaWNpdAorCQkJCQkJICogcGFyYW1ldGVyIHRvIHRoZSBmdW5jdGlvbgorCQkJCQkJICogY29udGFpbmluZyB0aGUgYWRkcmVzcyBvZgorCQkJCQkJICogdGhlIHJldHVybiBwYXJhbWV0ZXIsIHNvCisJCQkJCQkgKiBHRVRSRVRVUk4gb3VnaHQgdG8gYmUgYQorCQkJCQkJICogbm9vcC4gKi8KKwkJCQkJY2FzZSBMT05HOgorCQkJCQljYXNlIFNUUlVDVDoKKwkJCQkJY2FzZSBWT0lEOgorCQkJCQljYXNlIEFSUkFZOgorCQkJCQkJYnJlYWs7CisjaWYgMAorCQkJCQljb3B5X3N0cnVjdDoKKwkJCQkJCXB1c2hfYWRkcm9mKGZwLCAmaWMtPnosIHR5cGYsICZ6KTsKKwkJCQkJCWZwcmludGYoZnAsICJcdEBjb3B5X3RhYmxlIHhwICIpOworCQkJCQkJZW1pdF96b3AoZnAsICZ6KTsKKwkJCQkJCWZwcmludGYoZnAsICIgJWxkO1xuIiwgc3pvZihpYy0+ei52LT52dHlwKSk7CisJCQkJCQlicmVhazsKKyNlbmRpZgorCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlpZXJyb3IodHlwZiAmIE5RKTsKKwkJCQl9CisJCQkJLy9mcHJpbnRmKGZwLCAiXHRyMCA9ICIpOworCQkJCS8vZW1pdF9vYmplY3QoZnAsICZpYy0+cTEsIHR5cGYpOworCQkJCS8vZnByaW50ZihmcCwgIjtcbiIpOworCQkJCS8vd3JpdGVfcmVnKGZwLCAmaWMtPnosIHR5cGYsIDIpOworCQkJCWNvbnRpbnVlOworCisJCQljYXNlIFNFVFJFVFVSTjogLyogU2V0IHRoaXMgZnVuY3Rpb24ncyByZXR1cm4gcGFyYW1ldGVyICovCisJCQkJc3dpdGNoICh0eXBmICYgTlEpCisJCQkJeworCQkJCQljYXNlIENIQVI6CisJCQkJCQkvL2lmIChpYy0+cTIudmFsLnZsb25nICE9IDEpCisJCQkJCQkvLwlnb3RvIHNldHJldHVybl9jb3B5X3N0cnVjdDsKKworCQkJCQkJLyogZmFsbCB0aHJvdWdoICovCisJCQkJCWNhc2UgU0hPUlQ6CisJCQkJCWNhc2UgSU5UOgorCQkJCQljYXNlIFBPSU5URVI6CisJCQkJCQlyZWFkX3JlZyhmcCwgJmljLT5xMSwgdHlwZiwgMik7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIExPTkc6CisJCQkJCWNhc2UgU1RSVUNUOgorCQkJCQljYXNlIFZPSUQ6CisJCQkJCWNhc2UgQVJSQVk6CisjaWYgMAorCQkJCQlzZXRyZXR1cm5fY29weV9zdHJ1Y3Q6CisJCQkJCQlmcHJpbnRmKGZwLCAiXHRAYWRkIHhwICVsZCAtPiBzcDtcbiIsCisJCQkJCQkJc3RhY2tvZmZzZXQpOworCQkJCQkJcHVzaF9hZGRyb2YoZnAsICZpYy0+cTEsIHR5cGYsICZxMSk7CisJCQkJCQlmcHJpbnRmKGZwLCAiXHRAY29weV90YWJsZSAiKTsKKwkJCQkJCWVtaXRfem9wKGZwLCAmcTEpOworCQkJCQkJZnByaW50ZihmcCwgIiBzcCAlbGQ7XG4iLCBzem9mKGljLT5xMS52LT52dHlwKSk7CisJCQkJCQlicmVhazsKKyNlbmRpZgorCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlpZXJyb3IodHlwZiAmIE5RKTsKKwkJCQl9CisJCQkJLy9mcHJpbnRmKGZwLCAiXHRyMCA9ICIpOworCQkJCS8vZW1pdF9vYmplY3QoZnAsICZpYy0+cTEsIHR5cGYpOworCQkJCS8vZnByaW50ZihmcCwgIjtcbiIpOworCQkJCWNvbnRpbnVlOworCisJCQljYXNlIE1JTlVTOiAvKiBVbmFyeSBtaW51cyAqLworCQkJCXN3aXRjaCAodHlwZiAmIE5RKQorCQkJCXsKKwkJCQkJY2FzZSBDSEFSOgorCQkJCQljYXNlIFNIT1JUOgorCQkJCQljYXNlIElOVDoKKwkJCQkJCXB1c2hfdmFsdWUoZnAsICZpYy0+cTEsIHR5cGYsICZxMSk7CisJCQkJCQlwb3BfdmFsdWUoZnAsICZpYy0+eiwgdHlwZiwgJnopOworCQkJCQkJZnByaW50ZihmcCwgIlx0QHN1YiAwICIpOworCQkJCQkJZW1pdF96b3AoZnAsICZxMSk7CisJCQkJCQlmcHJpbnRmKGZwLCAiIC0+ICIpOworCQkJCQkJZW1pdF96b3AoZnAsICZ6KTsKKwkJCQkJCWZwcmludGYoZnAsICI7XG4iKTsKKwkJCQkJCWZpbl96b3AoZnAsICZpYy0+eiwgdHlwZiwgJnopOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBMT05HOgorCQkJCQkJcHVzaF9hZGRyb2YoZnAsICZpYy0+eiwgdHlwZiwgJnopOworCQkJCQkJcHVzaF9hZGRyb2YoZnAsICZpYy0+cTEsIHR5cGYsICZxMSk7CisJCQkJCQlmcHJpbnRmKGZwLCAiXHRAY2FsbF92biBfX2xvbmdfbmVnICIpOworCQkJCQkJZW1pdF96b3AoZnAsICZxMSk7CisJCQkJCQlmcHJpbnRmKGZwLCAiICIpOworCQkJCQkJZW1pdF96b3AoZnAsICZ6KTsKKwkJCQkJCWZwcmludGYoZnAsICI7XG4iKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlpZXJyb3IoMCk7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCisJCQljYXNlIEtPTVBMRU1FTlQ6IC8qIFVuYXJ5IGtvbXBsZW1lbnQgKi8KKwkJCQkvKiBJTkZPUk0gQlVHISAqLworCQkJCS8qIFRoZSBAbm90IG9wY29kZSBkb2Vzbid0IHdvcmsuIFdlIGhhdmUgdG8gdXNlIGEKKwkJCQkgKiB3cmFwcGVyIGZ1bmN0aW9uIGluc3RlYWQuICovCisJCQkJCisJCQkJcHVzaF92YWx1ZShmcCwgJmljLT5xMSwgdHlwZiwgJnExKTsKKwkJCQlwb3BfdmFsdWUoZnAsICZpYy0+eiwgdHlwZiwgJnopOworCQkJCWZwcmludGYoZnAsICJcdEBjYWxsXzJzIF9fbm90ICIpOworCQkJCWVtaXRfem9wKGZwLCAmcTEpOworCQkJCWZwcmludGYoZnAsICIgLT4gIik7CisJCQkJZW1pdF96b3AoZnAsICZ6KTsKKwkJCQlmcHJpbnRmKGZwLCAiO1xuIik7CisJCQkJZmluX3pvcChmcCwgJmljLT56LCB0eXBmLCAmeik7CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgTU9WRUZST01SRUc6IC8qIFdyaXRlIGEgcmVnaXN0ZXIgdG8gbWVtb3J5ICovCisJCQkJd3JpdGVfcmVnKGZwLCAmaWMtPnosIHR5cGYsIGljLT5xMS5yZWcpOworCQkJCWNvbnRpbnVlOworCisJCQljYXNlIE1PVkVUT1JFRzogLyogUmVhZCBhIHJlZ2lzdGVyIGZyb20gbWVtb3J5ICovCisJCQkJcmVhZF9yZWcoZnAsICZpYy0+cTEsIHR5cGYsIGljLT56LnJlZyk7CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgQVNTSUdOOiAvKiBNb3ZlIHNvbWV0aGluZyB0byBzb21ld2hlcmUgZWxzZSAqLworCQkJCWRlYnVnZW1pdChmcCwgIiEgQVNTSUdOIHNpemUgJWQgdHlwZiAlZFxuIiwgaWMtPnEyLnZhbC52bG9uZywgdHlwZiAmIE5RKTsKKwkJCQlzd2l0Y2ggKHR5cGYgJiBOUSkKKwkJCQl7CisJCQkJCWNhc2UgQ0hBUjoKKwkJCQkJCWlmIChpYy0+cTIudmFsLnZsb25nICE9IDEpCisJCQkJCQkJZ290byBhc3NpZ25fY29weV9zdHJ1Y3Q7CisJCQkJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJCQkJY2FzZSBTSE9SVDoKKwkJCQkJY2FzZSBJTlQ6CisJCQkJCWNhc2UgUE9JTlRFUjoKKwkJCQkJCW1vdmVfdmFsdWUoZnAsICZpYy0+cTEsICZpYy0+eiwgdHlwZik7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIExPTkc6CisJCQkJCQltb3ZlX2xvbmdfdmFsdWUoZnAsICZpYy0+cTEsICZpYy0+eiwgdHlwZik7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIFNUUlVDVDoKKwkJCQkJY2FzZSBWT0lEOgorCQkJCQljYXNlIEFSUkFZOgorCQkJCQlhc3NpZ25fY29weV9zdHJ1Y3Q6CisJCQkJCQlwdXNoX2FkZHJvZihmcCwgJmljLT56LCB0eXBmLCAmeik7CisJCQkJCQlwdXNoX2FkZHJvZihmcCwgJmljLT5xMSwgdHlwZiwgJnExKTsKKwkJCQkJCWZwcmludGYoZnAsICJcdEBjb3B5X3RhYmxlICIpOworCQkJCQkJZW1pdF96b3AoZnAsICZxMSk7CisJCQkJCQlmcHJpbnRmKGZwLCAiICIpOworCQkJCQkJZW1pdF96b3AoZnAsICZ6KTsKKwkJCQkJCWZwcmludGYoZnAsICIgMCUrbGQ7XG4iLCBpYy0+cTIudmFsLnZsb25nKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlpZXJyb3IodHlwZiAmIE5RKTsKKwkJCQl9CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgQUREUkVTUzogLyogRmV0Y2ggdGhlIGFkZHJlc3Mgb2Ygc29tZXRoaW5nLCBhbHdheXMKKwkJCQkJIEFVVE8gb3IgU1RBVElDICovCisJCQkJaSA9IHZvZmYoJmljLT5xMSk7CisJCQkJcG9wX3ZhbHVlKGZwLCAmaWMtPnosIHR5cGYsICZ6KTsKKwkJCQlmcHJpbnRmKGZwLCAiXHRAYWRkIHhwIDAlK2xkIC0+ICIsIGkpOworCQkJCWVtaXRfem9wKGZwLCAmeik7CisJCQkJZnByaW50ZihmcCwgIjtcbiIpOworCQkJCWZpbl96b3AoZnAsICZpYy0+eiwgdHlwZiwgJnopOworCQkJCWNvbnRpbnVlOworCisJCQljYXNlIFBVU0g6IC8qIFB1c2ggYSB2YWx1ZSBvbnRvIHRoZSBzdGFjayAqLworCQkJCWZwcmludGYoZnAsICJcdEBzdWIgeHAgMCUrbGQgLT4geHA7XG4iLAorCQkJCQlpYy0+cTIudmFsLnZsb25nKTsKKwkJCQkvL3N0YWNrb2Zmc2V0ICs9IGljLT5xMi52YWwudmxvbmc7CisJCQkJc3RhY2twYXJhbWFkanVzdCArPSBpYy0+cTIudmFsLnZsb25nOworCisJCQkJc3dpdGNoIChpYy0+cTIudmFsLnZsb25nKQorCQkJCXsKKwkJCQkJY2FzZSAxOgorCQkJCQkJcHVzaF92YWx1ZShmcCwgJmljLT5xMSwgdHlwZiwgJnExKTsKKwkJCQkJCWZwcmludGYoZnAsICJcdEBzdG9yZWIgeHAgMCAiKTsKKwkJCQkJCWVtaXRfem9wKGZwLCAmcTEpOworCQkJCQkJZnByaW50ZihmcCwgIjtcbiIpOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSAyOgorCQkJCQkJcHVzaF92YWx1ZShmcCwgJmljLT5xMSwgdHlwZiwgJnExKTsKKwkJCQkJCWZwcmludGYoZnAsICJcdEBzdG9yZXcgeHAgMCAiKTsKKwkJCQkJCWVtaXRfem9wKGZwLCAmcTEpOworCQkJCQkJZnByaW50ZihmcCwgIjtcbiIpOworCQkJCQkJYnJlYWs7CisKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXB1c2hfYWRkcm9mKGZwLCAmaWMtPnExLCB0eXBmLCAmcTEpOworCQkJCQkJZnByaW50ZihmcCwgIlx0QGNvcHlfdGFibGUgIik7CisJCQkJCQllbWl0X3pvcChmcCwgJnExKTsKKwkJCQkJCWZwcmludGYoZnAsICIgeHAgMCUrbGQ7XG4iLCBpYy0+cTIudmFsLnZsb25nKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljb250aW51ZTsKKworCQkJY2FzZSBBREQ6IC8qIEFkZCB0d28gbnVtYmVycyAqLworCQkJY2FzZSBTVUI6IC8qIFN1YnRyYWN0IHR3byBudW1iZXJzICovCisJCQljYXNlIE1VTFQ6IC8qIE11bHRpcGx5IHR3byBudW1iZXJzICovCisJCQljYXNlIERJVjogLyogRGl2aWRlIHR3byBudW1iZXJzICovCisJCQljYXNlIE1PRDogLyogTW9kdWxvIHR3byBudW1iZXJzICovCisJCQljYXNlIE9SOiAvKiBCaXR3aXNlIG9yICovCisJCQljYXNlIFhPUjogLyogQml0d2lzZSB4b3IgKi8KKwkJCWNhc2UgQU5EOiAvKiBCaXR3aXNlIGFuZCAqLworCQkJY2FzZSBMU0hJRlQ6IC8qIFNoaWZ0IGxlZnQgKi8KKwkJCWNhc2UgUlNISUZUOiAvKiBTaGlmdCByaWdodCAqLworCQkJCXN3aXRjaCAodHlwZiAmIE5RKQorCQkJCXsKKwkJCQkJY2FzZSBDSEFSOgorCQkJCQljYXNlIFNIT1JUOgorCQkJCQljYXNlIElOVDoKKwkJCQkJY2FzZSBQT0lOVEVSOgorCQkJCQkJLyogU2Vjb25kIHBhcmFtZXRlciBmaXJzdCEgKi8KKwkJCQkJCXB1c2hfdmFsdWUoZnAsICZpYy0+cTIsIHR5cGYsICZxMik7CisKKwkJCQkJCWlmIChjb2RlID09IFJTSElGVCkKKwkJCQkJCXsKKwkJCQkJCQlmcHJpbnRmKGZwLCAiXHRAc3ViIDAgIik7CisJCQkJCQkJZW1pdF96b3AoZnAsICZxMik7CisJCQkJCQkJZnByaW50ZihmcCwgIiAtPiBzcDtcbiIpOworCQkJCQkJCXEyLnR5cGUgPSBaT1BfU1RBQ0s7CisJCQkJCQl9CisKKwkJCQkJCXB1c2hfdmFsdWUoZnAsICZpYy0+cTEsIHR5cGYsICZxMSk7CisJCQkJCQlwb3BfdmFsdWUoZnAsICZpYy0+eiwgdHlwZiwgJnopOworCQkJCQkJLy9mcHJpbnRmKGZwLCAiXHQiKTsKKwkJCQkJCS8vZW1pdF9vYmplY3QoZnAsICZpYy0+eiwgdHlwZik7CisJCQkJCQkvL2ZwcmludGYoZnAsICIgPSAiKTsKKwkJCQkJCS8vZW1pdF9vYmplY3QoZnAsICZpYy0+cTEsIHR5cGYpOworCQkJCQkJc3dpdGNoIChjb2RlKQorCQkJCQkJeworCQkJCQkJCWNhc2UgQUREOgorCQkJCQkJCQlmcHJpbnRmKGZwLCAiXHRAYWRkICIpOworCQkJCQkJCQlicmVhazsKKworCQkJCQkJCWNhc2UgU1VCOgorCQkJCQkJCQlmcHJpbnRmKGZwLCAiXHRAc3ViICIpOworCQkJCQkJCQlicmVhazsKKworCQkJCQkJCWNhc2UgTVVMVDoKKwkJCQkJCQkJZnByaW50ZihmcCwgIlx0QG11bCAiKTsKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQljYXNlIERJVjoKKwkJCQkJCQkJaWYgKHR5cGYgJiBVTlNJR05FRCkKKwkJCQkJCQkJCWZwcmludGYoZnAsICJcdEBjYWxsX3ZzIF9fdW5zaWduZWRfZGl2ICIpOworCQkJCQkJCQllbHNlCisJCQkJCQkJCQlmcHJpbnRmKGZwLCAiXHRAZGl2ICIpOworCQkJCQkJCQlicmVhazsKKworCQkJCQkJCWNhc2UgTU9EOgorCQkJCQkJCQlpZiAodHlwZiAmIFVOU0lHTkVEKQorCQkJCQkJCQkJZnByaW50ZihmcCwgIlx0QGNhbGxfdnMgX191bnNpZ25lZF9tb2QgIik7CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCWZwcmludGYoZnAsICJcdEBtb2QgIik7CisJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJY2FzZSBBTkQ6CisJCQkJCQkJCWZwcmludGYoZnAsICJcdEBhbmQgIik7CisJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJY2FzZSBYT1I6CisJCQkJCQkJCWZwcmludGYoZnAsICJcdEBjYWxsX3ZzIF9feG9yICIpOworCQkJCQkJCQlicmVhazsKKworCQkJCQkJCWNhc2UgT1I6CisJCQkJCQkJCWZwcmludGYoZnAsICJcdEBvciAiKTsKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQljYXNlIExTSElGVDoKKwkJCQkJCQljYXNlIFJTSElGVDoKKwkJCQkJCQkJaWYgKHR5cGYgJiBVTlNJR05FRCkKKwkJCQkJCQkJCWZwcmludGYoZnAsICJcdEBsb2dfc2hpZnQgIik7CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCWZwcmludGYoZnAsICJcdEBhcnRfc2hpZnQgIik7CisJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlISAqLworCQkJCQkJCQlpZXJyb3IoMCk7CisJCQkJCQl9CisJCQkJCQllbWl0X3pvcChmcCwgJnExKTsKKwkJCQkJCWZwcmludGYoZnAsICIgIik7CisJCQkJCQllbWl0X3pvcChmcCwgJnEyKTsKKwkJCQkJCWZwcmludGYoZnAsICIgLT4gIik7CisJCQkJCQllbWl0X3pvcChmcCwgJnopOworCQkJCQkJZnByaW50ZihmcCwgIjtcbiIpOworCQkJCQkJZmluX3pvcChmcCwgJmljLT56LCB0eXBmLCAmeik7CisJCQkJCQkvL2VtaXRfb2JqZWN0KGZwLCAmaWMtPnEyLCB0eXBmKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgTE9ORzoKKwkJCQkJCS8qIERlc3RpbmF0aW9uIHBhcmFtZXRlciBmaXJzdCEgKi8KKworCQkJCQkJcHVzaF9hZGRyb2YoZnAsICZpYy0+eiwgdHlwZiwgJnopOworCQkJCQkJcHVzaF9hZGRyb2YoZnAsICZpYy0+cTIsIHR5cGYsICZxMik7CisJCQkJCQlwdXNoX2FkZHJvZihmcCwgJmljLT5xMSwgdHlwZiwgJnExKTsKKworCQkJCQkJZnByaW50ZihmcCwgIlx0QGNhbGxfdm4gX19sb25nXyIpOworCQkJCQkJc3dpdGNoIChjb2RlKQorCQkJCQkJeworCQkJCQkJCWNhc2UgQUREOgorCQkJCQkJCQlmcHJpbnRmKGZwLCAiYWRkIik7CisJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJY2FzZSBTVUI6CisJCQkJCQkJCWZwcmludGYoZnAsICJzdWIiKTsKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQljYXNlIE1VTFQ6CisJCQkJCQkJCWZwcmludGYoZnAsICJtdWwiKTsKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQljYXNlIERJVjoKKwkJCQkJCQkJaWYgKHR5cGYgJiBVTlNJR05FRCkKKwkJCQkJCQkJCWZwcmludGYoZnAsICJ1bnNpZ25lZF9kaXYiKTsKKwkJCQkJCQkJZWxzZQorCQkJCQkJCQkJZnByaW50ZihmcCwgImRpdiIpOworCQkJCQkJCQlicmVhazsKKworCQkJCQkJCWNhc2UgTU9EOgorCQkJCQkJCQlpZiAodHlwZiAmIFVOU0lHTkVEKQorCQkJCQkJCQkJZnByaW50ZihmcCwgInVuc2lnbmVkX21vZCIpOworCQkJCQkJCQllbHNlCisJCQkJCQkJCQlmcHJpbnRmKGZwLCAibW9kIik7CisJCQkJCQkJCWJyZWFrOworCisJCQkJCQkJY2FzZSBBTkQ6CisJCQkJCQkJCWZwcmludGYoZnAsICJhbmQiKTsKKwkJCQkJCQkJYnJlYWs7CisKKwkJCQkJCQljYXNlIFhPUjoKKwkJCQkJCQkJZnByaW50ZihmcCwgInhvciIpOworCQkJCQkJCQlicmVhazsKKworCQkJCQkJCWNhc2UgT1I6CisJCQkJCQkJCWZwcmludGYoZnAsICJvciIpOworCQkJCQkJCQlicmVhazsKKworCQkJCQkJCWNhc2UgTFNISUZUOgorCQkJCQkJCQlmcHJpbnRmKGZwLCAibHNsIik7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCQkKKwkJCQkJCQljYXNlIFJTSElGVDoKKwkJCQkJCQkJaWYgKHR5cGYgJiBVTlNJR05FRCkKKwkJCQkJCQkJCWZwcmludGYoZnAsICJsc3IiKTsKKwkJCQkJCQkJZWxzZQorCQkJCQkJCQkJZnByaW50ZihmcCwgImFzciIpOworCQkJCQkJCQlicmVhazsKKworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCS8qIFNob3VsZCBuZXZlciBnZXQgaGVyZSEgKi8KKwkJCQkJCQkJaWVycm9yKDApOworCQkJCQkJfQorCQkJCQkJZnByaW50ZihmcCwgIiAiKTsKKwkJCQkJCWVtaXRfem9wKGZwLCAmcTEpOworCQkJCQkJZnByaW50ZihmcCwgIiAiKTsKKwkJCQkJCWVtaXRfem9wKGZwLCAmcTIpOworCQkJCQkJZnByaW50ZihmcCwgIiAiKTsKKwkJCQkJCWVtaXRfem9wKGZwLCAmeik7CisJCQkJCQlmcHJpbnRmKGZwLCAiO1xuIik7CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0OgorCQkJCQkJaWVycm9yKDApOworCQkJCX0KKwkJCQljb250aW51ZTsKKworCQljYXNlIENPTlZFUlQ6CisJCSAgaWYoKHExdHlwKGljKSZOVSk9PUNIQVIpeworCQkJCXN3aXRjaCAoenR5cChpYykgJiBOVSkKKwkJCQl7CisJCQkJCWNhc2UgQ0hBUjoKKwkJCQkJY2FzZSBVTlNJR05FRHxDSEFSOgorCQkJCQljYXNlIFVOU0lHTkVEfFNIT1JUOgorCQkJCQljYXNlIFVOU0lHTkVEfElOVDoKKwkJCQkJY2FzZSBTSE9SVDoKKwkJCQkJY2FzZSBJTlQ6CisJCQkJCQlwdXNoX3ZhbHVlKGZwLCAmaWMtPnExLCBDSEFSLCAmcTEpOworCQkJCQkJcG9wX3ZhbHVlKGZwLCAmaWMtPnosIHR5cGYsICZ6KTsKKwkJCQkJCWZwcmludGYoZnAsICJcdEBsb2dfc2hpZnQgIik7CisJCQkJCQllbWl0X3pvcChmcCwgJnExKTsKKwkJCQkJCWZwcmludGYoZnAsICIgOCAtPiBzcDtcbiIpOworCQkJCQkJZnByaW50ZihmcCwgIlx0QGFydF9zaGlmdCBzcCAwLTggLT4gIik7CisJCQkJCQllbWl0X3pvcChmcCwgJnopOworCQkJCQkJZnByaW50ZihmcCwgIjtcbiIpOworCQkJCQkJZmluX3pvcChmcCwgJmljLT56LCB0eXBmLCAmeik7CisJCQkJCQlicmVhazsKKwkJCQkJCisJCQkJCWNhc2UgTE9ORzoKKwkJCQkJCXB1c2hfdmFsdWUoZnAsICZpYy0+cTEsIElOVCwgJnExKTsKKwkJCQkJCXB1c2hfYWRkcm9mKGZwLCAmaWMtPnosIHR5cGYsICZ6KTsKKwkJCQkJCWZwcmludGYoZnAsICJcdEBjYWxsX3ZuIF9fbG9uZ19mcm9tY2hhciIpOworCQkJCQkJZW1pdF96b3AoZnAsICZ6KTsKKwkJCQkJCWZwcmludGYoZnAsICIgIik7CisJCQkJCQllbWl0X3pvcChmcCwgJnExKTsKKwkJCQkJCWZwcmludGYoZnAsICI7XG4iKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlpZXJyb3IoMCk7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkgIH0KKwkJICBpZigocTF0eXAoaWMpJk5VKT09KFVOU0lHTkVEfENIQVIpKXsKKworCQkJCXN3aXRjaCAoenR5cChpYykgJiBOUSkKKwkJCQl7CisJCQkJCWNhc2UgQ0hBUjoKKwkJCQkJY2FzZSBTSE9SVDoKKwkJCQkJY2FzZSBJTlQ6CisJCQkJCQlwdXNoX3ZhbHVlKGZwLCAmaWMtPnExLCBVTlNJR05FRHxDSEFSLCAmcTEpOworCQkJCQkJcG9wX3ZhbHVlKGZwLCAmaWMtPnosIHR5cGYsICZ6KTsKKwkJCQkJCWlmICgoei50eXBlICE9IFpPUF9TVEFDSykgfHwgKHExLnR5cGUgIT0gWk9QX1NUQUNLKSkKKwkJCQkJCXsKKwkJCQkJCQllbWl0X2FkZChmcCwgJnExLCAmem9wX3plcm8sICZ6KTsKKyNpZiAwCisJCQkJCQkJZnByaW50ZihmcCwgIlx0QGFkZCAiKTsKKwkJCQkJCQllbWl0X3pvcChmcCwgJnExKTsKKwkJCQkJCQlmcHJpbnRmKGZwLCAiIDAgLT4gIik7CisJCQkJCQkJZW1pdF96b3AoZnAsICZ6KTsKKwkJCQkJCQlmcHJpbnRmKGZwLCAiO1xuIik7CisjZW5kaWYKKwkJCQkJCX0KKwkJCQkJCWZpbl96b3AoZnAsICZpYy0+eiwgdHlwZiwgJnopOworCQkJCQkJYnJlYWs7CisJCQkJCQorCQkJCQljYXNlIExPTkc6CisJCQkJCQlwdXNoX3ZhbHVlKGZwLCAmaWMtPnExLCBVTlNJR05FRHxDSEFSLCAmcTEpOworCQkJCQkJcHVzaF9hZGRyb2YoZnAsICZpYy0+eiwgdHlwZiwgJnopOworCQkJCQkJZnByaW50ZihmcCwgIlx0QGNhbGxfdm4gX19sb25nX2Zyb21pbnQiKTsKKwkJCQkJCWVtaXRfem9wKGZwLCAmeik7CisJCQkJCQlmcHJpbnRmKGZwLCAiIDAgIik7CisJCQkJCQllbWl0X3pvcChmcCwgJnExKTsKKwkJCQkJCWZwcmludGYoZnAsICI7XG4iKTsKKwkJCQkJCWJyZWFrOworCQkJCQkJCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlpZXJyb3IoMCk7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkgIH0KKwkJICBpZigocTF0eXAoaWMpJk5VKT09U0hPUlR8fChxMXR5cChpYykmTlUpPT1JTlQpeworCQkJCXN3aXRjaCAoenR5cChpYykgJiBOVSkKKwkJCQl7CisJCQkJCWNhc2UgQ0hBUjoKKwkJCQkJY2FzZSBVTlNJR05FRHxDSEFSOgorCQkJCQljYXNlIFVOU0lHTkVEfFNIT1JUOgorCQkJCQljYXNlIFVOU0lHTkVEfElOVDoKKwkJCQkJY2FzZSBTSE9SVDoKKwkJCQkJY2FzZSBJTlQ6CisJCQkJCQlwdXNoX3ZhbHVlKGZwLCAmaWMtPnExLCBJTlQsICZxMSk7CisJCQkJCQlwb3BfdmFsdWUoZnAsICZpYy0+eiwgdHlwZiwgJnopOworCQkJCQkJaWYgKCh6LnR5cGUgIT0gWk9QX1NUQUNLKSB8fCAocTEudHlwZSAhPSBaT1BfU1RBQ0spKQorCQkJCQkJeworCQkJCQkJCWVtaXRfYWRkKGZwLCAmcTEsICZ6b3BfemVybywgJnopOworI2lmIDAKKwkJCQkJCQlmcHJpbnRmKGZwLCAiXHRAYWRkICIpOworCQkJCQkJCWVtaXRfem9wKGZwLCAmcTEpOworCQkJCQkJCWZwcmludGYoZnAsICIgMCAtPiAiKTsKKwkJCQkJCQllbWl0X3pvcChmcCwgJnopOworCQkJCQkJCWZwcmludGYoZnAsICI7XG4iKTsKKyNlbmRpZgorCQkJCQkJfQorCQkJCQkJZmluX3pvcChmcCwgJmljLT56LCB0eXBmLCAmeik7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIExPTkc6CisJCQkJCQlwdXNoX3ZhbHVlKGZwLCAmaWMtPnExLCBJTlQsICZxMSk7CisJCQkJCQlwdXNoX2FkZHJvZihmcCwgJmljLT56LCB0eXBmLCAmeik7CisJCQkJCQlmcHJpbnRmKGZwLCAiXHRAY2FsbF92biBfX2xvbmdfZnJvbWludCAiKTsKKwkJCQkJCWVtaXRfem9wKGZwLCAmeik7CisJCQkJCQlmcHJpbnRmKGZwLCAiICIpOworCQkJCQkJZW1pdF96b3AoZnAsICZxMSk7CisJCQkJCQlmcHJpbnRmKGZwLCAiO1xuIik7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIFVOU0lHTkVEfExPTkc6CisJCQkJCQlwdXNoX3ZhbHVlKGZwLCAmaWMtPnExLCBJTlQsICZxMSk7CisJCQkJCQlwdXNoX2FkZHJvZihmcCwgJmljLT56LCB0eXBmLCAmeik7CisJCQkJCQlmcHJpbnRmKGZwLCAiXHRAY2FsbF92biBfX2xvbmdfbG9hZGNvbnN0ICIpOworCQkJCQkJZW1pdF96b3AoZnAsICZ6KTsKKwkJCQkJCWZwcmludGYoZnAsICIgMCAiKTsKKwkJCQkJCWVtaXRfem9wKGZwLCAmcTEpOworCQkJCQkJZnByaW50ZihmcCwgIjtcbiIpOworCQkJCQkJYnJlYWs7CisJCQkJCQorCQkJCQlkZWZhdWx0OgorCQkJCQkJaWVycm9yKHR5cGYpOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJfQorCQlpZigocTF0eXAoaWMpJk5VKT09KFVOU0lHTkVEfFNIT1JUKXx8KHExdHlwKGljKSZOVSk9PShVTlNJR05FRHxJTlQpfHwocTF0eXAoaWMpJk5VKT09UE9JTlRFUil7CisKKwkJCQlzd2l0Y2ggKHp0eXAoaWMpICYgTlEpCisJCQkJeworCQkJCQljYXNlIENIQVI6CisJCQkJCWNhc2UgU0hPUlQ6CisJCQkJCWNhc2UgSU5UOgorCQkJCQkJcHVzaF92YWx1ZShmcCwgJmljLT5xMSwgSU5ULCAmcTEpOworCQkJCQkJcG9wX3ZhbHVlKGZwLCAmaWMtPnosIHR5cGYsICZ6KTsKKwkJCQkJCWlmICgoei50eXBlICE9IFpPUF9TVEFDSykgfHwgKHExLnR5cGUgIT0gWk9QX1NUQUNLKSkKKwkJCQkJCXsKKwkJCQkJCQllbWl0X2FkZChmcCwgJnExLCAmem9wX3plcm8sICZ6KTsKKyNpZiAwCisJCQkJCQkJZnByaW50ZihmcCwgIlx0QGFkZCAiKTsKKwkJCQkJCQllbWl0X3pvcChmcCwgJnExKTsKKwkJCQkJCQlmcHJpbnRmKGZwLCAiIDAgLT4gIik7CisJCQkJCQkJZW1pdF96b3AoZnAsICZ6KTsKKwkJCQkJCQlmcHJpbnRmKGZwLCAiO1xuIik7CisjZW5kaWYKKwkJCQkJCX0KKwkJCQkJCWZpbl96b3AoZnAsICZpYy0+eiwgdHlwZiwgJnopOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBMT05HOgorCQkJCQkJcHVzaF92YWx1ZShmcCwgJmljLT5xMSwgSU5ULCAmcTEpOworCQkJCQkJcHVzaF9hZGRyb2YoZnAsICZpYy0+eiwgdHlwZiwgJnopOworCQkJCQkJZnByaW50ZihmcCwgIlx0QGNhbGxfdm4gX19sb25nX2xvYWRjb25zdCAiKTsKKwkJCQkJCWVtaXRfem9wKGZwLCAmeik7CisJCQkJCQlmcHJpbnRmKGZwLCAiIDAgIik7CisJCQkJCQllbWl0X3pvcChmcCwgJnExKTsKKwkJCQkJCWZwcmludGYoZnAsICI7XG4iKTsKKwkJCQkJCWJyZWFrOworI2lmIDAKKwkJCQkJY2FzZSBTSE9SVDoKKwkJCQkJY2FzZSBJTlQ6CisJCQkJCQlmcHJpbnRmKGZwLCAiXHQiKTsKKwkJCQkJCWVtaXRfb2JqZWN0KGZwLCAmaWMtPnosIHR5cGYpOworCQkJCQkJZnByaW50ZihmcCwgIiA9ICgiKTsKKwkJCQkJCWVtaXRfb2JqZWN0KGZwLCAmaWMtPnExLCBDSEFSKTsKKwkJCQkJCWZwcmludGYoZnAsICIpIDw8IDggPj4gODtcbiIpOworCQkJCQkJYnJlYWs7CisjZW5kaWYKKwkJCQkJCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlwcmludGYoIiVYXG4iLCB0eXBmKTsKKwkJCQkJCWllcnJvcigwKTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCX0KKwkJaWYoKHExdHlwKGljKSZOVSk9PShVTlNJR05FRHxMT05HKXx8KHExdHlwKGljKSZOVSk9PUxPTkcpeworCisJCQkJc3dpdGNoICh6dHlwKGljKSAmIE5RKQorCQkJCXsKKwkJCQkJY2FzZSBDSEFSOgorCQkJCQkJcHVzaF9hZGRyb2YoZnAsICZpYy0+cTEsIExPTkcsICZxMSk7CisJCQkJCQlwb3BfdmFsdWUoZnAsICZpYy0+eiwgdHlwZiwgJnopOworCQkJCQkJZnByaW50ZihmcCwgIlx0QGxvYWRiICIpOworCQkJCQkJZW1pdF96b3AoZnAsICZxMSk7CisJCQkJCQlmcHJpbnRmKGZwLCAiIDMgLT4gIik7CisJCQkJCQllbWl0X3pvcChmcCwgJnopOworCQkJCQkJZnByaW50ZihmcCwgIjtcbiIpOworCQkJCQkJZmluX3pvcChmcCwgJmljLT56LCB0eXBmLCAmeik7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIFNIT1JUOgorCQkJCQljYXNlIElOVDoKKwkJCQkJCXB1c2hfYWRkcm9mKGZwLCAmaWMtPnExLCBMT05HLCAmcTEpOworCQkJCQkJcG9wX3ZhbHVlKGZwLCAmaWMtPnosIHR5cGYsICZ6KTsKKwkJCQkJCWZwcmludGYoZnAsICJcdEBsb2FkdyAiKTsKKwkJCQkJCWVtaXRfem9wKGZwLCAmcTEpOworCQkJCQkJZnByaW50ZihmcCwgIiAxIC0+ICIpOworCQkJCQkJZW1pdF96b3AoZnAsICZ6KTsKKwkJCQkJCWZwcmludGYoZnAsICI7XG4iKTsKKwkJCQkJCWZpbl96b3AoZnAsICZpYy0+eiwgdHlwZiwgJnopOworCQkJCQkJYnJlYWs7CisJCQkJCQorCQkJCQlkZWZhdWx0OgorCQkJCQkJaWVycm9yKHR5cGYgJiBOUSk7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQl9CisJCQljYXNlIENPTVBBUkU6CisJCQkJLyogQ09NUEFSRSBpcyBzcGVjaWFsLiBUaGUgbmV4dCBpbnN0cnVjdGlvbiBpcworCQkJCSAqIGFsd2F5cyBhIGJyYW5jaC4gIFRoZSBaLW1hY2hpbmUgZG9lcworCQkJCSAqIGJyYW5jaGVzIGluIHRoZSBmb3JtOgorCQkJCSAqCisJCQkJICogQGp7ZSxnLGx9IDx2YXIxPiA8dmFyMj4gW35dQDxsYWJlbD4KKwkJCQkgKgorCQkJCSAqIEhvd2V2ZXIsIHdlIGRvbid0IGtub3cgd2hhdCBzaG9ydCBvZiBicmFuY2gKKwkJCQkgKiB0byBlbWl0IHVudGlsIHRoZSBuZXh0IGluc3RydWN0aW9uICh3aGljaCBpcworCQkJCSAqIHRoZSBJQyBmb3IgYSBicmFuY2gpLiBTbyB3ZSBoYXZlIHRvIHN0YXNoCisJCQkJICogdGhlIHpvcHMgdGhhdCB3ZSdyZSB1c2luZyBmb3IgdGhlCisJCQkJICogY29tcGFyZSBoZXJlLCBmb3IgdXNlIGxhdGVyLiBUaGlzIGlzIGRvbmUKKworCQkJCSAqIHVzaW5nIHRoZSBnbG9iYWxzIGNvbXBhcmUxIGFuZCBjb21wYXJlMi4KKwkJCQkgKi8KKworCQkJCXN3aXRjaCAodHlwZiAmIE5VKQorCQkJCXsKKwkJCQkJY2FzZSBDSEFSOgorCQkJCQljYXNlIFNIT1JUOgorCQkJCQljYXNlIElOVDoKKwkJCQkJY2FzZSBQT0lOVEVSOgorCQkJCQkJLyogU2Vjb25kIHBhcmFtZXRlciBmaXJzdCEgKi8KKwkJCQkJCXB1c2hfdmFsdWUoZnAsICZpYy0+cTIsIHR5cGYsICZjb21wYXJlMik7CisJCQkJCQlwdXNoX3ZhbHVlKGZwLCAmaWMtPnExLCB0eXBmLCAmY29tcGFyZTEpOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBVTlNJR05FRHxDSEFSOgorCQkJCQljYXNlIFVOU0lHTkVEfFNIT1JUOgorCQkJCQljYXNlIFVOU0lHTkVEfElOVDoKKwkJCQkJCS8qIEJlY2F1c2UgdGhlIFotbWFjaGluZSBvbmx5CisJCQkJCQkgKiBoYXMgc2lnbmVkIGNvbXBhcmlzb25zLCB3ZQorCQkJCQkJICogbmVlZCBhIGRvZGd5IGFsZ29yaXRobSB0bworCQkJCQkJICogZG8gdGhpcywgd2hpY2ggd29ya3MgYXMKKwkJCQkJCSAqIGZvbGxvd3M6IGluIHRoZSBzaWduZWQKKwkJCQkJCSAqIGRvbWFpbiwgMC03RkZGIGNvbXBhcmVzCisJCQkJCQkgKiBncmVhdGVyIHRoYW4gODAwMC1GRkZGLiBJbgorCQkJCQkJICogdGhlIHVuc2lnbmVkIGRvbWFpbiwgaXQncworCQkJCQkJICogdGhlIG90aGVyIHdheSBhcm91bmQuIFNvLAorCQkJCQkJICogYnkgZmxpcHBpbmcgdGhlIHNpZ24gYml0cworCQkJCQkJICogd2UgZG8gdGhlIGxvZ2ljYWwKKwkJCQkJCSAqIGVxdWl2YWxlbnQgb2Ygc2hpZnRpbmcgdGhlCisJCQkJCQkgKiB1bnNpZ25lZCByYW5nZSB1cC9kb3duIGJ5CisJCQkJCQkgKiA4MDAwIHdoaWNoIG1ha2VzIGl0IGZpdAorCQkJCQkJICogdGhlIHNpZ25lZCByYW5nZS4gVGhlcmUuCisJCQkJCQkgKiBEaWQgeW91IHVuZGVyc3RhbmQgdGhhdD8KKwkJCQkJCSAqIE5laXRoZXIgZGlkIEksIHRoZSBmaXJzdAorCQkJCQkJICogZmV3IHRpbWVzIGl0IHdhcyBleHBsYWluZWQKKwkJCQkJCSAqIHRvIG1lLiAqLworCQkJCQkJcmVhZF9yZWcoZnAsICZpYy0+cTIsIHR5cGYsIDApOworCQkJCQkJZnByaW50ZihmcCwgIlx0QGFkZCBzcCAkODAwMCAtPiBzcDtcbiIpOworCQkJCQkJcmVhZF9yZWcoZnAsICZpYy0+cTEsIHR5cGYsIDApOworCQkJCQkJZnByaW50ZihmcCwgIlx0QGFkZCBzcCAkODAwMCAtPiBzcDtcbiIpOworCQkJCQkJY29tcGFyZTEudHlwZSA9IFpPUF9TVEFDSzsKKwkJCQkJCWNvbXBhcmUyLnR5cGUgPSBaT1BfU1RBQ0s7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIExPTkc6CisJCQkJCQlwdXNoX2FkZHJvZihmcCwgJmljLT5xMiwgdHlwZiwgJnEyKTsKKwkJCQkJCXB1c2hfYWRkcm9mKGZwLCAmaWMtPnExLCB0eXBmLCAmcTEpOworCQkJCQkJZnByaW50ZihmcCwgIlx0QGNhbGxfdnMgX19sb25nX2NvbXBhcmUgIik7CisJCQkJCQllbWl0X3pvcChmcCwgJnExKTsKKwkJCQkJCWZwcmludGYoZnAsICIgIik7CisJCQkJCQllbWl0X3pvcChmcCwgJnEyKTsKKwkJCQkJCWZwcmludGYoZnAsICIgLT4gc3A7XG4iKTsKKwkJCQkJCWNvbXBhcmUxLnR5cGUgPSBaT1BfU1RBQ0s7CisJCQkJCQljb21wYXJlMi50eXBlID0gWk9QX0NPTlNUQU5UOworCQkJCQkJY29tcGFyZTIudmFsLmNvbnN0YW50ID0gMDsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgVU5TSUdORUR8TE9ORzoKKwkJCQkJCXB1c2hfYWRkcm9mKGZwLCAmaWMtPnEyLCB0eXBmLCAmcTIpOworCQkJCQkJcHVzaF9hZGRyb2YoZnAsICZpYy0+cTEsIHR5cGYsICZxMSk7CisJCQkJCQlmcHJpbnRmKGZwLCAiXHRAY2FsbF92cyBfX2xvbmdfdW5zaWduZWRfY29tcGFyZSAiKTsKKwkJCQkJCWVtaXRfem9wKGZwLCAmcTEpOworCQkJCQkJZnByaW50ZihmcCwgIiAiKTsKKwkJCQkJCWVtaXRfem9wKGZwLCAmcTIpOworCQkJCQkJZnByaW50ZihmcCwgIiAtPiBzcDtcbiIpOworCQkJCQkJY29tcGFyZTEudHlwZSA9IFpPUF9TVEFDSzsKKwkJCQkJCWNvbXBhcmUyLnR5cGUgPSBaT1BfQ09OU1RBTlQ7CisJCQkJCQljb21wYXJlMi52YWwuY29uc3RhbnQgPSAwOworCQkJCQkJYnJlYWs7CisKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCWllcnJvcih0eXBmICYgTlEpOworCQkJCX0KKwkJCQljb250aW51ZTsKKworCQkJY2FzZSBURVNUOgorCQkJCS8qIFRFU1QgaXMgYSBzcGVjaWFsIENPTVBBUkUuIEl0IHRha2VzIG9uZQorCQkJCSAqIHBhcmFtZXRlciBhbmQgYWx3YXlzIHRlc3RzIGl0IGFnYWluc3QgMDsgaXQKKwkJCQkgKiBpcyBndWFyYW50ZWVkIHRvIGJlIGZvbGxvd2VkIGJ5IEJORSBvciBCRVEuCisJCQkJICogKi8KKworCQkJCXN3aXRjaCAodHlwZiAmIE5RKQorCQkJCXsKKwkJCQkJY2FzZSBDSEFSOgorCQkJCQljYXNlIFNIT1JUOgorCQkJCQljYXNlIElOVDoKKwkJCQkJY2FzZSBQT0lOVEVSOgorCQkJCQkJcHVzaF92YWx1ZShmcCwgJmljLT5xMSwgdHlwZiwgJmNvbXBhcmUxKTsKKwkJCQkJCWNvbXBhcmUyLnR5cGUgPSBaT1BfQ09OU1RBTlQ7CisJCQkJCQljb21wYXJlMi52YWwuY29uc3RhbnQgPSAwOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSBMT05HOgorCQkJCQkJcHVzaF9hZGRyb2YoZnAsICZpYy0+cTEsIHR5cGYsICZxMSk7CisJCQkJCQlmcHJpbnRmKGZwLCAiXHRAY2FsbF92cyBfX2xvbmdfY29tcGFyZSAiKTsKKwkJCQkJCWVtaXRfem9wKGZwLCAmcTEpOworCQkJCQkJZnByaW50ZihmcCwgIiAiKTsKKwkJCQkJCXEyLnR5cGUgPSBaT1BfQ09OU1RBTlRBRERSOworCQkJCQkJcTIudmFsLmNvbnN0YW50ID0gYWRkY29uc3RhbnQoMCk7CisJCQkJCQllbWl0X3pvcChmcCwgJnEyKTsKKwkJCQkJCWZwcmludGYoZnAsICIgLT4gc3A7XG4iLCBpKTsKKwkJCQkJCWNvbXBhcmUxLnR5cGUgPSBaT1BfU1RBQ0s7CisJCQkJCQljb21wYXJlMi50eXBlID0gWk9QX0NPTlNUQU5UOworCQkJCQkJY29tcGFyZTIudmFsLmNvbnN0YW50ID0gMDsKKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlpZXJyb3IodHlwZiAmIE5RKTsKKwkJCQl9CisJCQkJY29udGludWU7CisKKwkJCWNhc2UgQkVROgorCQkJY2FzZSBCTkU6CisJCQljYXNlIEJMVDoKKwkJCWNhc2UgQkdFOgorCQkJY2FzZSBCTEU6CisJCQljYXNlIEJHVDoKKwkJCXsKKwkJCQlzdGF0aWMgaW50IGJyYW5jaGxhYmVsID0gMDsKKworCQkJCWZwcmludGYoZnAsICJcdEBqIik7CisJCQkJc3dpdGNoIChjb2RlKQorCQkJCXsKKwkJCQkJY2FzZSBCTkU6CisJCQkJCWNhc2UgQkVROglmcHJpbnRmKGZwLCAiZSAiKTsJYnJlYWs7CisJCQkJCWNhc2UgQkxUOgorCQkJCQljYXNlIEJHRToJZnByaW50ZihmcCwgImwgIik7CWJyZWFrOworCQkJCQljYXNlIEJHVDoKKwkJCQkJY2FzZSBCTEU6CWZwcmludGYoZnAsICJnICIpOwlicmVhazsKKwkJCQl9CisKKwkJCQllbWl0X3pvcChmcCwgJmNvbXBhcmUxKTsKKwkJCQlmcHJpbnRmKGZwLCAiICIpOworCQkJCWVtaXRfem9wKGZwLCAmY29tcGFyZTIpOworCQkJCWZwcmludGYoZnAsICIgPyIpOworCisJCQkJaWYgKGdfZmxhZ3NbM10gJiBVU0VERkxBRykKKwkJCQl7CisJCQkJCWlmICghKChjb2RlID09IEJORSkgfHwgKGNvZGUgPT0gQkdFKSB8fCAoY29kZSA9PSBCTEUpKSkKKwkJCQkJCWZwcmludGYoZnAsICJ+Iik7CisJCQkJCWZwcmludGYoZnAsICJMTCVkO1xuIiwgYnJhbmNobGFiZWwpOworCQkJCQlmcHJpbnRmKGZwLCAiXHRqdW1wICVzJWQ7XG4iLCBsYWJlbHByZWZpeCwgdHlwZik7CisJCQkJCWZwcmludGYoZnAsICIuTEwlZDtcbiIsIGJyYW5jaGxhYmVsKyspOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpZiAoKGNvZGUgPT0gQk5FKSB8fCAoY29kZSA9PSBCR0UpIHx8IChjb2RlID09IEJMRSkpCisJCQkJCQlmcHJpbnRmKGZwLCAifiIpOworCQkJCQlmcHJpbnRmKGZwLCAiJXMlZDtcbiIsIGxhYmVscHJlZml4LCB0eXBmKTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWNhc2UgQ0FMTDoKKwkJCXsKKyNpZiAwCisJCQkJLyogQ2FsY3VsYXRlIHRoZSBhbW91bnQgb2Ygc3RhY2sgdG8gcmVzZXJ2ZSBmb3IKKwkJCQkgKiB0aGUgcmV0dXJuIHBhcmFtZXRlci4gaW50cyBhbmQgc21hbGxlciBnbyBpbgorCQkJCSAqIHRoZSByZXR1cm4gcmVnaXN0ZXIuICovCisKKwkJCQlzdGFja2NhbGxwYXJhbXNpemUgPSBzem9mKGljLT5xMS52LT52dHlwLT5uZXh0KTsKKwkJCQlpZiAoc3RhY2tjYWxscGFyYW1zaXplIDw9IHNpemV0YWJbSU5UXSkKKwkJCQkJc3RhY2tjYWxscGFyYW1zaXplID0gMDsKKworCQkJCWlmIChzdGFja2NhbGxwYXJhbXNpemUpCisJCQkJCWZwcmludGYoZnAsICJcdEBzdWIgeHAgJWQgLT4geHA7XG4iLAorCQkJCQkJc3RhY2tjYWxscGFyYW1zaXplKTsKKyNlbmRpZgorCisJCQkJLyogSXMgdGhpcyBhY3R1YWxseSBhbiBpbmxpbmUgYXNzZW1ibHkgZnVuY3Rpb24/ICovCisKKwkJCQlpZiAoKGljLT5xMS5mbGFncyAmIFZBUikgJiYKKwkJCQkgICAgaWMtPnExLnYtPmZpICYmCisJCQkJICAgIGljLT5xMS52LT5maS0+aW5saW5lX2FzbSkKKwkJCQl7CisJCQkJCS8qIFllcy4gRW1pdCB0aGUgYXNzZW1ibHkgY29kZS4gKi8KKworCQkJCQlmcHJpbnRmKGZwLCAiJXMiLCBpYy0+cTEudi0+ZmktPmlubGluZV9hc20pOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvKiBObzsgc28gZW1pdCBhIGNhbGwuICovCisJCQkJCisJCQkJCXB1c2hfdmFsdWUoZnAsICZpYy0+cTEsIHR5cGYsICZxMSk7CisJCQkJCWZwcmludGYoZnAsICJcdEBjYWxsX3ZzMiAiKTsKKwkJCQkJZW1pdF96b3AoZnAsICZxMSk7CisJCQkJCWZwcmludGYoZnAsICIgeHAgcjAgcjEgcjIgcjMgcjQgcjUgLT4gcjA7XG4iKTsKKwkJCQl9CisKKwkJCQkvL3N0YWNrY2FsbGFkanVzdG1lbnQgPSAxOworCisJCQkJLyogSWYgYW55IHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHB1c2hlZCwgYWRqdXN0CisJCQkJICogdGhlIHN0YWNrIHRvIHBvcCB0aGVtLiAqLworCisJCQkJaWYgKHN0YWNrcGFyYW1hZGp1c3QpCisJCQkJeworCQkJCQlmcHJpbnRmKGZwLCAiXHRAYWRkIHhwIDAlK2xkIC0+IHhwO1xuIiwKKwkJCQkJCXN0YWNrcGFyYW1hZGp1c3QpOworCQkJCQkvL3N0YWNrb2Zmc2V0IC09IHN0YWNrcGFyYW1hZGp1c3Q7CisJCQkJCXN0YWNrcGFyYW1hZGp1c3QgPSAwOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZGVmYXVsdDoKKwkJCQlpZXJyb3IoY29kZSk7CisJCX0KKwkJCQkJCQorCX0KKworCS8qIFdlIHJlYWxseSBvdWdodCB0byB0aWR5IHRoZSBzdGFjayB1cDsgYnV0IHRoZXJlJ3Mgbm8gbmVlZCwgYmVjYXVzZQorCSAqIHRoZSBvbGQgdmFsdWUgb2YgeHAgd2lsbCBiZSByZXN0b3JlZCB3aGVuIHRoZSBmdW5jdGlvbiBleGl0cy4gKi8KKworICAgIAkvL2lmIChzdGFja2ZyYW1lKQorCS8vCWZwcmludGYoZnAsICJcdEBhZGQgeHAgJWxkIC0+IHhwO1xuIiwgc3RhY2tmcmFtZSk7CisJCisJZnByaW50ZihmcCwgIlx0QHJldCByMDtcbiIpOworCWZwcmludGYoZnAsICJdXG4iKTsKKworLy8gICAgZnVuY3Rpb25fYm90dG9tKGZwLCBmdW5jLCBsb2ZmKTsKK30KKworaW50IHNob3J0Y3V0KGludCBjb2RlLCBpbnQgdHlwKQoreworICAgIHJldHVybigwKTsKK30KKworLy8gQWRkIGEgY29uc3RhbnQgdG8gdGhlIGNvbnN0YW50IHBvb2wuCisKK3N0YXRpYyBpbnQgYWRkY29uc3RhbnQoem1heCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgY29uc3RhbnQqIGM7CisJCisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBjb25zdGFudCdzIGFscmVhZHkgaW4gdGhlIHBvb2wuICovCisKKwljID0gY29uc3RhbnRsaXN0OworCXdoaWxlIChjKQorCXsKKwkJaWYgKGMtPnZhbHVlID09IHZhbHVlKQorCQkJcmV0dXJuIGMtPmlkOworCQljID0gYy0+bmV4dDsKKwl9CisKKwkvKiBJdCdzIG5vdDsgYWRkIGl0LiAqLworCQorCWMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb25zdGFudCkpOworCWMtPm5leHQgPSBjb25zdGFudGxpc3Q7CisJYy0+aWQgPSBjb25zdGFudG51bSsrOworCWMtPnZhbHVlID0gdmFsdWU7CisJY29uc3RhbnRsaXN0ID0gYzsKKwlyZXR1cm4gYy0+aWQ7Cit9CisKK3ZvaWQgY2xlYW51cF9jZyhGSUxFICpmcCkKK3sKKwlzdHJ1Y3QgZml4dXAqIGZpeHVwID0gZml4dXBsaXN0OworCisJLyogSGF2ZSB3ZSBhY3R1YWxseSBlbWl0dGVkIGFueXRoaW5nPyAqLworCisJaWYgKCFmcCkKKwkJcmV0dXJuOworCisJcmVmbG93ZXIoZnApOworCisJLyogRW1pdCB0aGUgY29uc3RhbnQgcG9vbC4gKi8KKworCXsKKwkJc3RydWN0IGNvbnN0YW50KiBjb25zdGFudCA9IGNvbnN0YW50bGlzdDsKKworCQl3aGlsZSAoY29uc3RhbnQpCisJCXsKKwkJCWZwcmludGYoZnAsICJBcnJheSBDT05TVEFOVF8lc18lbGQgLS0+XG4iLAorCQkJCW1vZHVsZW5hbWUsIGNvbnN0YW50LT5pZCk7CisJCQlmcHJpbnRmKGZwLCAiIDAlK2xkIDAlK2xkO1xuIiwKKwkJCQl4d29yZChjb25zdGFudC0+dmFsdWUsIDEpLAorCQkJCXh3b3JkKGNvbnN0YW50LT52YWx1ZSwgMCkpOworCQkJY29uc3RhbnQgPSBjb25zdGFudC0+bmV4dDsKKwkJfQorCX0KKworCS8qIEVtaXQgdGhlIGNvZGUgdG8gaW5pdGlhbGlzZSB0aGUgZGF0YSBhcmVhLiAqLworCisJeworCQlzdHJ1Y3QgZml4dXAqIGZpeHVwID0gZml4dXBsaXN0OworCisJCWZwcmludGYoZnAsICJbIF9faW5pdF92YXJzXyVzO1xuIiwgbW9kdWxlbmFtZSk7CisJCXdoaWxlIChmaXh1cCkKKwkJeworCQkJZnByaW50ZihmcCwgIlx0QGFkZCAwJStsZCAiLCBmaXh1cC0+b2Zmc2V0KTsKKworCQkJc3dpdGNoIChmaXh1cC0+dmFsdWUudHlwZSkKKwkJCXsKKwkJCQljYXNlIFNUQVRJQzoKKwkJCQkJZnByaW50ZihmcCwgIlNUQVRJQ18lc18lbGQgLT4gc3A7XG4iLAorCQkJCQkJbW9kdWxlbmFtZSwgZml4dXAtPnZhbHVlLnZhbC5udW1iZXIpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgRVhURVJOOgorCQkJCQlmcHJpbnRmKGZwLCAiXyVzIC0+IHNwO1xuIiwKKwkJCQkJCWZpeHVwLT52YWx1ZS52YWwuaWRlbnRpZmllcik7CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJaWVycm9yKDApOworCQkJfQorCisJCQlzd2l0Y2ggKGZpeHVwLT5pZGVudGlmaWVyLnR5cGUpCisJCQl7CisJCQkJY2FzZSBTVEFUSUM6CisJCQkJCWZwcmludGYoZnAsICJcdEBzdG9yZXcgU1RBVElDXyVzXyVsZCAwJStsZCBzcDtcbiIsCisJCQkJCQltb2R1bGVuYW1lLCBmaXh1cC0+aWRlbnRpZmllci52YWwubnVtYmVyLAorCQkJCQkJZml4dXAtPmlkZW50aWZpZXIub2Zmc2V0KTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEVYVEVSTjoKKwkJCQkJZnByaW50ZihmcCwgIlx0QHN0b3JldyBfJXMgMCUrbGQgc3A7XG4iLAorCQkJCQkJZml4dXAtPmlkZW50aWZpZXIudmFsLmlkZW50aWZpZXIsCisJCQkJCQlmaXh1cC0+aWRlbnRpZmllci5vZmZzZXQpOworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWllcnJvcigwKTsKKwkJCX0KKworCQkJZml4dXAgPSBmaXh1cC0+bmV4dDsKKwkJfQorCQlmcHJpbnRmKGZwLCAiXTtcbiIpOworCX0KK30KKworLyogVGhlIGNvZGUgZ2VuZXJhdG9yJ3MgYXNraW5nIHVzIHRvIHBhc3MgYSBwYXJhbWV0ZXIgaW4gYSByZWdpc3Rlci4gKi8KKworaW50IHJlZ19wYXJtKHN0cnVjdCByZWdfaGFuZGxlICpyaCwgc3RydWN0IFR5cCAqdHlwLCBpbnQgdmFyYXJnLCBzdHJ1Y3QgVHlwICpmdCkKK3sKKwkvKiBWYXJhcmcgcGFyYW1ldGVycyBuZXZlciBnbyBpbiByZWdpc3RlcnMuICovCisKKwlpZiAodmFyYXJnKQorCQlyZXR1cm4gMDsKKworCS8qIFdpbGwgdGhlIHBhcmFtZXRlciBmaXQ/ICovCisKKwlpZiAoc2l6ZXRhYlt0eXAtPmZsYWdzICYgTlFdID4gMikKKwkJcmV0dXJuIDA7CisKKwkvKiBTdGlsbCBlbm91Z2ggcmVnaXN0ZXJzPyAqLworCisJaWYgKHJoLT5yZWcgPj0gTlVNX1JFR1BBUk1TK1VTRVJSRUcpCisJCXJldHVybiAwOworCisJcmV0dXJuIChyaC0+cmVnKyspOworfQorCitpbnQgcmVnX3BhaXIoaW50IHIsc3RydWN0IHJwYWlyICpwKQorLyogUmV0dXJucyAwIGlmIHRoZSByZWdpc3RlciBpcyBubyByZWdpc3RlciBwYWlyLiBJZiByICAqLworLyogaXMgYSByZWdpc3RlciBwYWlyIG5vbi16ZXJvIHdpbGwgYmUgcmV0dXJuZWQgYW5kIHRoZSAqLworLyogc3RydWN0dXJlIHBvaW50ZWQgdG8gcCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSB0d28gICAqLworLyogZWxlbWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICByZXR1cm4gMDsKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit2b2lkIGluaXRfZGIoRklMRSAqZikKK3sKK30KK3ZvaWQgY2xlYW51cF9kYihGSUxFICpmKQoreworfQpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvei9tYWNoaW5lLmR0IGIvbWFjaGluZXMvei9tYWNoaW5lLmR0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxODI4YmMKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoaW5lcy96L21hY2hpbmUuZHQKQEAgLTAsMCArMSwxNCBAQAorUzhCUworUzhCVQorUzE2QlNMRSBTMTZCU0JFCitTMTZCVUxFIFMxNkJVQkUKK1MxNkJTTEUgUzE2QlNCRQorUzE2QlVMRSBTMTZCVUJFCitTMzJCU0xFIFMzMkJTQkUKK1MzMkJVTEUgUzMyQlVCRQorUzY0QlNMRSBTNjRCU0JFCitTNjRCVUxFIFM2NEJVQkUKK1MzMkJJRUVFQkUgUzMyQklFRUVMRQorUzY0QklFRUVCRSBTNjRCSUVFRUxFCitTNjRCSUVFRUJFIFM2NEJJRUVFTEUKK1MxNkJVTEUgUzE2QlVCRQpkaWZmIC0tZ2l0IGEvbWFjaGluZXMvei9tYWNoaW5lLmggYi9tYWNoaW5lcy96L21hY2hpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZjQzZmM4Ci0tLSAvZGV2L251bGwKKysrIGIvbWFjaGluZXMvei9tYWNoaW5lLmgKQEAgLTAsMCArMSw4MSBAQAorLyogWi1tYWNoaW5lIGNvZGUgZ2VuZXJhdG9yCisgKiBEYXZpZCBHaXZlbgorICovCisKKyNpbmNsdWRlICJkdC5oIgorCisvKiBNYWNoaW5lIHNwZWNpZmljIGFkZHJlc3NpbmctbW9kZXMuIE5vdCB1c2VkLiAqLworCitzdHJ1Y3QgQWRkcmVzc2luZ01vZGV7CisJaW50IG5ldmVyX3VzZWQ7Cit9OworCisvKiBUaGUgbnVtYmVyIG9mIHJlZ2lzdGVycyB3ZSBzdXBwb3J0LiBXZSBkb24ndCByZWFsbHkgaGF2ZSBhbnksIGJ1dCB3ZQorICogdXNlIGxvY2FsIHZhcmlhYmxlcyBpbnN0ZWFkOyB3ZSBoYXZlIDE0LgorICovCisKKyNkZWZpbmUgTUFYUiAxNAorCisvKiBOdW1iZXIgb2YgY29tbWFuZC1saW5lIG9wdGlvbnMgd2UgYWNjZXB0LiAqLworCisjZGVmaW5lIE1BWEdGIDYKKworLyogSWYgdGhpcyBpcyBzZXQgdG8gemVybyB2YmNjIHdpbGwgbm90IGdlbmVyYXRlIElDcyB3aGVyZSB0aGUgdGFyZ2V0IG9wZXJhbmQKKyAqIGlzIHRoZSBzYW1lIGFzIHRoZSAybmQgc291cmNlIG9wZXJhbmQuIFRoaXMgY2FuIHNvbWV0aW1lcyBzaW1wbGlmeSB0aGUKKyAqIGNvZGUtZ2VuZXJhdG9yLCBidXQgdXN1YWxseSB0aGUgY29kZSBpcyBiZXR0ZXIgaWYgdGhlIGNvZGUtZ2VuZXJhdG9yIGFsbG93cworICogaXQuIAorICovCisKKyNkZWZpbmUgVVNFUTJBU1ogMQorCisvKiBUaGUgc21hbGxlc3QgYW5kIGxhcmdlc3QgaW50ZWdlciB0eXBlIHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgcG9pbnRlci4gKi8KKworI2RlZmluZSBNSU5BRERJMlAgSU5UCisjZGVmaW5lIE1BWEFEREkyUCBJTlQKKworLyogQmlnLWVuZGlhbj8gKi8KKworI2RlZmluZSBCSUdFTkRJQU4gMQorCisvKiBMaXR0bGUtZW5kaWFuPyAqLworCisjZGVmaW5lIExJVFRMRUVORElBTiAwCisKKy8qIElmIHN3aXRjaC1zdGF0ZW1lbnRzIHNob3VsZCBiZSBnZW5lcmF0ZWQgYXMgYSBzZXF1ZW5jZSBvZiBTVUIsVFNULEJFUSBJQ3MKKyAqIHJhdGhlciB0aGFuIENPTVBBUkUsQkVRIElDcyBzZXQgdGhpcyB0byAxLiAgVGhpcyBjYW4geWllbGQgYmV0dGVyIGNvZGUgb24KKyAqIHNvbWUgbWFjaGluZXMuCisgKi8KKworI2RlZmluZSBTV0lUQ0hTVUJTIDAKKworLyogSW4gb3B0aW1pemluZyBjb21waWxhdGlvbiBjZXJ0YWluIGxpYnJhcnkgbWVtY3B5L3N0cmNweS1jYWxscyB3aXRoIGxlbmd0aAorICoga25vd24gYXQgY29tcGlsZS10aW1lIHdpbGwgYmUgaW5saW5lZCB1c2luZyBhbiBBU1NJR04tSUMgaWYgdGhlIHNpemUgaXMgbGVzcworICogb3IgZXF1YWwgdG8gSU5MSU5FTUVNQ1BZLiAgVGhlIHR5cGUgdXNlZCBmb3IgdGhlIEFTU0lHTi1JQyB3aWxsIGJlCisgKiBVTlNJR05FRHxDSEFSLiBPbiB0aGUgWi1tYWNoaW5lLCBtZW1jcHkgY2FuIGJlIGRvbmUgaW4gYGhhcmR3YXJlJyB3aXRoIHRoZQorICogQGNvcHlfdGFibGUgb3Bjb2RlLCBzbyBhbHdheXMgaW5saW5lIHRoZW0gaWYgcG9zc2libGUuCisgKi8KKworI2RlZmluZSBJTkxJTkVNRU1DUFkgNjU1MzYKKworLyogRG8gd2Ugd2FudCB0byBwYXNzIHBhcmFtZXRlcnMgdG8gZnVuY3Rpb25zIGluIHJlZ2lzdGVycz8gKi8KKworI2RlZmluZSBIQVZFX1JFR1BBUk1TIDEKKworLyogSWYgc28sIGhvdyBtYW55PyBNYXggNyBkdWUgdG8gdGhlIGFyY2hpdGVjdHVyZSwgYnV0IG9uZSBpcyBhbHdheXMgeHAuICovCisKKyNkZWZpbmUgTlVNX1JFR1BBUk1TIDYKKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoZXJlIHJlZ2lzdGVyIHBhcmFtZXRlcnMgZ28uICovCisKK3N0cnVjdCByZWdfaGFuZGxlIHsKKwlpbnQgcmVnOworfTsKKworLyogRG8gd2Ugd2FudCB0byB1c2UgenVpbnQgZm9yIHNpemVfdCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCB6dWxvbmc/ICovCisKKyNkZWZpbmUgSEFWRV9JTlRfU0laRVQgMQorCisvKiBzaXplIG9mIGJ1ZmZlciBmb3IgYXNtLW91dHB1dCAqLworI2RlZmluZSBFTUlUX0JVRl9MRU4gMTAyNCAvKiBzaG91bGQgYmUgZW5vdWdoICovCisvKiBudW1iZXIgb2YgYXNtLW91dHB1dCBsaW5lcyBidWZmZXJlZCAqLworI2RlZmluZSBFTUlUX0JVRl9ERVBUSCA0CmRpZmYgLS1naXQgYS9tYWluLmMgYi9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUxMDJmNAotLS0gL2Rldi9udWxsCisrKyBiL21haW4uYwpAQCAtMCwwICsxLDIwMTAgQEAKKy8qICAkVkVSOiB2YmNjIChtYWluLmMpICRSZXZpc2lvbjogMS42NyAkICAgICovCisjaW5jbHVkZSAidmJjY19jcHAuaCIKKyNpbmNsdWRlICJ2YmMuaCIKKyNpbmNsdWRlICJvcHQuaCIKK3N0YXRpYyBjaGFyIEZJTEVfW109X19GSUxFX187Cit2b2lkIGRvX2Z1bmN0aW9uKFZhciAqKTsKK3N0YXRpYyBmdW5jdGlvbl9pbmZvICpjdXJyZW50X2ZpOwordG9rZW4gKmN0b2s7CitsZXhlcl9zdGF0ZSBsczsKK2ludCBlbmRvaz0xOworaW50IGxpbmUsZXJyb3JzOworYnZ0eXBlIHRhc2tfcHJlZW1wdF9yZWdzW1JTSVpFL3NpemVvZihidnR5cGUpXTsKK2J2dHlwZSB0YXNrX3NjaGVkdWxlX3JlZ3NbUlNJWkUvc2l6ZW9mKGJ2dHlwZSldOworY2hhciAqbXVsdG5hbWVbXT17IiIsInMifTsKKwordHlwZWRlZiBzdHJ1Y3QgZGVwbGlzdCB7Y2hhciAqbmFtZTsgc3RydWN0IGRlcGxpc3QgKm5leHQ7fSBkZXBsaXN0OworZGVwbGlzdCAqZGVwczsKK0ZJTEUgKmRlcG91dDsKK3ZvaWQgaGFuZGxlX2RlcHMoY2hhciAqbmFtZSxpbnQgc3RyaW5nKQoreworICBkZXBsaXN0ICpwPWRlcHM7CisgIGlmKCFkZXBvdXR8fCFuYW1lfHwhKm5hbWUpIHJldHVybjsKKyAgLyogYnkgZGVmYXVsdCBvbWl0IDwuLi4+IGluY2x1ZGVzICovCisgIGlmKCFzdHJpbmcmJiEoY19mbGFnc1s1MV0mVVNFREZMQUcpKSByZXR1cm47CisgIHdoaWxlKHApeworICAgIGlmKCFzdHJjbXAocC0+bmFtZSxuYW1lKSkgcmV0dXJuOworICAgIHA9cC0+bmV4dDsKKyAgfQorICBwPW15bWFsbG9jKHNpemVvZigqcCkpOworICBwLT5uYW1lPW15bWFsbG9jKHN0cmxlbihuYW1lKSsxKTsKKyAgc3RyY3B5KHAtPm5hbWUsbmFtZSk7CisgIHAtPm5leHQ9ZGVwczsKKyAgZGVwcz1wOworICBmcHJpbnRmKGRlcG91dCwiICVzIixuYW1lKTsKK30KKwordm9pZCByYXVzKHZvaWQpCisvKiAgQmVlbmRldCBkYXMgUHJvZ3JhbW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIHN0YXRpYyBpbnQgaW5yYXVzOworICBpZihpbnJhdXMpIHJldHVybjsKKyAgaW5yYXVzID0gMTsKKyAgaWYoREVCVUcpIHByaW50ZigicmF1cygpXG4iKTsKKyAgaWYoIWVuZG9rKSBmcHJpbnRmKHN0ZGVyciwidW5leHBlY3RlZCBlbmQgb2YgZmlsZVxuIik7CisgIGlmKGVycm9ycykgZnByaW50ZihzdGRlcnIsIiVkIGVycm9yJXMgZm91bmQhXG4iLGVycm9ycyxtdWx0bmFtZVtlcnJvcnM+MV0pOworICBpZihkZWJ1Z19pbmZvJiZvdXQpCisgICAgY2xlYW51cF9kYihvdXQpOworICB3aGlsZShuZXN0aW5nPj0wKSBsZWF2ZV9ibG9jaygpOworICAvKkZJWE1FOiBkbyBJIGhhdmUgdG8gY2xvc2UgaW5wdXQtZmlsZT8gKi8KKyAgaWYoIXdwbykKKyAgICBjbGVhbnVwX2NnKG91dCk7CisgIGVtaXRfZmx1c2gob3V0KTsKKyAgaWYoY21kZmlsZSkgZmNsb3NlKGNtZGZpbGUpOworICBpZihvdXQpIGZjbG9zZShvdXQpOworICBpZihpYzEpIGZjbG9zZShpYzEpOworICBpZihpYzIpIGZjbG9zZShpYzIpOworICAvKkZJWE1FOiBuZWVkIHRvIGNsZWFudXAgc29tZXRoaW5nIGZvciB1Y3BwPyovOworICBpZihlbmRvayYmIWVycm9ycykgZXhpdChFWElUX1NVQ0NFU1MpOyBlbHNlIGV4aXQoRVhJVF9GQUlMVVJFKTsKK30KK2ludCBlb2Y7Cit2b2lkIHRyYW5zbGF0aW9uX3VuaXQodm9pZCkKKy8qICBiZWFyYmVpdGV0IHRyYW5zbGF0aW9uX3VuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoaWVyIHouWi4gbnVyIHByb3Zpc29yaXNjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgVmFyICpwOworICBpZihjcm9zc19tb2R1bGUpeworICAgIGZvcihwPWZpcnN0X2V4dDtwO3A9cC0+bmV4dCkKKyAgICAgIGlmKCEocC0+ZmxhZ3MmQlVJTFRJTikpCisJcC0+ZmxhZ3N8PU5PVElOVFU7CisgIH0KKyAgd2hpbGUoMSl7CisgICAga2lsbHNwKCk7CisgICAgaWYoZW9mfHxjdG9rLT50eXBlIT1OQU1FKXsKKyAgICAgIGlmKCFlb2YpeworCWVycm9yKDM2OSk7CisJbmV4dF90b2tlbigpOworCWNvbnRpbnVlOworICAgICAgfWVsc2V7CisJaWYoY3Jvc3NfbW9kdWxlKXsKKwkgIGludCBuPTA7CisJICBpZihsYXN0X3R1bml0KXsKKwkgICAgbGFzdF90dW5pdC0+bmV4dD1teW1hbGxvYyhzaXplb2YoKmZpcnN0X3R1bml0KSk7CisJICAgIGxhc3RfdHVuaXQ9bGFzdF90dW5pdC0+bmV4dDsKKwkgIH1lbHNleworCSAgICBmaXJzdF90dW5pdD1sYXN0X3R1bml0PW15bWFsbG9jKHNpemVvZigqZmlyc3RfdHVuaXQpKTsKKwkgIH0KKwkgIGxhc3RfdHVuaXQtPm5leHQ9MDsKKwkgIGZvcihwPWZpcnN0X3ZhclswXTtwO3A9cC0+bmV4dCl7CisJICAgIGlmKHAtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQykgbisrOworCSAgfQorCSAgbGFzdF90dW5pdC0+c3RhdGljcz1maXJzdF92YXJbMF07CisJICByZXR1cm47CisJfWVsc2V7CisJICByYXVzKCk7CisJfQorICAgICAgfQorICAgIH0KKyAgICBlbmRvaz0wOworICAgIHZhcl9kZWNsYXJhdGlvbigpOworICAgIGVuZG9rPTE7CisgIH0KK30KK3ZvaWQgcmVzZXJ2ZV9yZWcoY2hhciAqcCkKKyAgICAgLyogcmVzZXJ2aWVydCBlaW4gUmVnaXN0ZXIgKi8KK3sKKyAgaW50IGk7CisgIGlmKCpwIT0nPScpIGVycm9yKDQsIi1yZXNlcnZlLXJlZyIpOworICBmb3IoaT0xO2k8PU1BWFI7aSsrKXsKKyAgICBpZighc3RyY21wKHArMSxyZWduYW1lc1tpXSkpCisgICAgICBicmVhazsKKyAgfQorICBpZihpPk1BWFIpeworICAgIGVycm9yKDMzMSxwKzEpOworICB9ZWxzZXsKKyAgICByZWdzYVtpXT0xOworICB9Cit9CisKK3ZvaWQgZG9udHdhcm4oY2hhciAqcCkKKy8qICBzY2hhbHRldCBmbGFncyBmdWVyIE1lbGR1bmcgYXVmIERPTlRXQVJOICAgICovCit7CisgIGlmKCpwIT0nPScpIGVycm9yKDQsIi1kb250d2FybiIpOworICBkb3sKKyAgICBpbnQgaT1hdG9pKHArMSk7CisgICAgaWYoaT49ZXJyX251bSkgZXJyb3IoMTU5LGkpOworICAgIGlmKGk8MCl7CisgICAgICBmb3IoaT0wO2k8ZXJyX251bTtpKyspCisgICAgICAgIGlmKCEoZXJyX291dFtpXS5mbGFncyYoQU5TSVZ8RkFUQUwpKSkKKyAgICBlcnJfb3V0W2ldLmZsYWdzfD1ET05UV0FSTjsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoZXJyX291dFtpXS5mbGFncyYoQU5TSVZ8RkFUQUwpKSBlcnJvcigxNjAsaSk7CisgICAgZXJyX291dFtpXS5mbGFnc3w9RE9OVFdBUk47CisgICAgcD1zdHJjaHIocCsxLCcsJyk7CisgIH0gd2hpbGUocCk7Cit9CisKKworCisjZGVmaW5lIE1JU1JBXzk4X1JVTEVfTlVNQkVSCTEyNworI2RlZmluZSBNSVNSQV8wNF9DSEFQVEVSCQkJMjEKKyNkZWZpbmUgTUlTUkFfMDRfTUFYX1JVTEVfSU5fQ0hBUFRFUiAxNworCitzdGF0aWMgaW50IG1pc3JhXzk4X3dhcm5fZmxhZ1tNSVNSQV85OF9SVUxFX05VTUJFUl0gPSB7IDAgfTsKK3N0YXRpYyBpbnQgbWlzcmFfMDRfd2Fybl9mbGFnW01JU1JBXzA0X0NIQVBURVJdW01JU1JBXzA0X01BWF9SVUxFX0lOX0NIQVBURVJdID0geyAwIH07CisKK3ZvaWQgbWlzcmF3YXJuKGNoYXIgKnApIHsKKwlpbnQgcnVsZSxzdWJydWxlLG1pc3Jhb2xkcnVsZTsKKwljaGFyKiBsYXN0OworCWludCBub3RfZm91bmQ7CisJdG1pc3JhX2Vycl9vdXQqIG1pc3JfZXJyOworCXJ1bGUgPSAwOworCXN1YnJ1bGUgPSAwOworCW1pc3Jhb2xkcnVsZSA9IDA7CisgIGlmKCpwIT0nPScpIGVycm9yKDQsIi1taXNyYXdhcm4iKTsKKwlwKys7CisJaWYgKCEoc3RybmNtcCgiY2hhcHRlciIscCw2KSkpIHsKKwkJaWYgKHNzY2FuZigocCs3KSwiJWQiLCZydWxlKSAhPSAxKSB7CisJCQllcnJvcigzMjcsIi1taXNyYXdhcm4iKTsKKwkJfQorCX0gZWxzZSBpZiAoICEoc3RybmNtcCgibWlzcmE5OHJ1bGUiLHAsMTEpKSkgeworCQlpZiAoc3NjYW5mKChwKzEyKSwiJWQiLCZtaXNyYW9sZHJ1bGUpICE9IDEpIHsKKwkJCWVycm9yKDMyNywiLW1pc3Jhd2FybiIpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGxhc3QgPSBzdHJjaHIocCwnLicpKSB7CisJCQkqbGFzdCA9IDA7CisJCQlsYXN0Kys7CisJCQlpZiAoc3NjYW5mKGxhc3QsIiVkIiwmc3VicnVsZSkgIT0gMSkgZXJyb3IoMzI3LCItbWlzcmF3YXJuIik7CisJCQlpZiAoc3NjYW5mKHAsIiVkIiwmcnVsZSkgIT0gMSkgZXJyb3IoMzI3LCItbWlzcmF3YXJuIik7CisJCQlsYXN0LS07CisJCQkqbGFzdD0nLic7CisJCX0gZWxzZSBlcnJvcigzMjcsIi1taXNyYXdhcm4iKTsKKwl9CisKKwlwLS07CisJaWYgKCFtaXNyYWNoZWNrKSBtaXNyYWNoZWNrID0gMTsKKwlpZiAobWlzcmFvbGRydWxlKSB7CisJCWlmIChtaXNyYXZlcnNpb249PTIwMDQpIGVycm9yKDMyOCxtaXNyYXZlcnNpb24sIi1taXNyYXdhcm4iLHApOworCQlpZiAoIW1pc3JhdmVyc2lvbikgbWlzcmF2ZXJzaW9uPTE5OTg7CisJCWlmICgobWlzcmFvbGRydWxlIDwgMSkgfHwgKG1pc3Jhb2xkcnVsZT5NSVNSQV85OF9SVUxFX05VTUJFUikpIGVycm9yKDMyOSxtaXNyYW9sZHJ1bGUsIi1taXNyYXdhcm4iLHApOworCQltaXNyYV85OF93YXJuX2ZsYWdbbWlzcmFvbGRydWxlLTFdID0gMTsKKwl9IGVsc2UgeworCQlpZiAobWlzcmF2ZXJzaW9uPT0xOTk4KSBlcnJvcigzMjgsbWlzcmF2ZXJzaW9uLCItbWlzcmF3YXJuIixwKTsKKwkJaWYgKCFtaXNyYXZlcnNpb24pIG1pc3JhdmVyc2lvbj0yMDA0OworCQlpZiAoc3VicnVsZSkgeworCQkJbWlzcl9lcnIgPSBtaXNyYV9lcnJfb3V0OworCQkgIG5vdF9mb3VuZCA9IDE7CisJCQl3aGlsZSAoIG1pc3JfZXJyLT50ZXh0ICkgeworCQkJCWlmICgobWlzcl9lcnItPmNoYXB0ZXIgPT0gcnVsZSkgJiYgKG1pc3JfZXJyLT5ydWxlID09IHN1YnJ1bGUpKSB7CisJCQkJCW5vdF9mb3VuZCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQltaXNyX2VycisrOworCQkJfQorCQkJaWYgKG5vdF9mb3VuZCkgZXJyb3IoMzMwLHJ1bGUsc3VicnVsZSwiLW1pc3Jhd2FybiIscCk7CisJCQltaXNyYV8wNF93YXJuX2ZsYWdbcnVsZS0xXVtzdWJydWxlLTFdID0gMTsKKwkJfSBlbHNlIHsKKwkJCW1pc3JfZXJyID0gbWlzcmFfZXJyX291dDsKKwkJICBub3RfZm91bmQgPSAxOworCQkJd2hpbGUgKCBtaXNyX2Vyci0+dGV4dCApIHsKKwkJCQlpZiAobWlzcl9lcnItPmNoYXB0ZXIgPT0gcnVsZSkgeworCQkJCQlub3RfZm91bmQgPSAwOworCQkJCQltaXNyYV8wNF93YXJuX2ZsYWdbbWlzcl9lcnItPmNoYXB0ZXItMV1bbWlzcl9lcnItPnJ1bGUtMV0gPSAxOworCQkJCX0KKwkJCQltaXNyX2VycisrOworCQkJfQorCQkJaWYgKG5vdF9mb3VuZCkgZXJyb3IoMzMwLHJ1bGUsc3VicnVsZSwiLW1pc3Jhd2FybiIscCk7CisJCX0KKwl9CisKK30KKworCit2b2lkIG1pc3JhZG9udHdhcm4oY2hhciAqcCkgeworCWludCBydWxlLHN1YnJ1bGUsbWlzcmFvbGRydWxlOworCWNoYXIqIGxhc3Q7CisJaW50IG5vdF9mb3VuZDsKKwl0bWlzcmFfZXJyX291dCogbWlzcl9lcnI7CisJcnVsZSA9IDA7CisJc3VicnVsZSA9IDA7CisJbWlzcmFvbGRydWxlID0gMDsKKyAgaWYoKnAhPSc9JykgZXJyb3IoNCwiLW1pc3JhZG9udHdhcm4iKTsKKwlwKys7CisJaWYgKCEoc3RybmNtcCgiY2hhcHRlciIscCw2KSkpIHsKKwkJaWYgKHNzY2FuZigocCs3KSwiJWQiLCZydWxlKSAhPSAxKSB7CisJCQllcnJvcigzMjcsIi1taXNyYWRvbnR3YXJuIik7CisJCX0KKwl9IGVsc2UgaWYgKCAhKHN0cm5jbXAoIm1pc3JhOThydWxlIixwLDExKSkpIHsKKwkJaWYgKHNzY2FuZigocCsxMiksIiVkIiwmbWlzcmFvbGRydWxlKSAhPSAxKSB7CisJCQllcnJvcigzMjcsIi1taXNyYWRvbnR3YXJuIik7CisJCX0KKwl9IGVsc2UgeworCQlpZiAobGFzdCA9IHN0cmNocihwLCcuJykpIHsKKwkJCSpsYXN0ID0gMDsKKwkJCWxhc3QrKzsKKwkJCWlmIChzc2NhbmYobGFzdCwiJWQiLCZzdWJydWxlKSAhPSAxKSBlcnJvcigzMjcsIi1taXNyYWRvbnR3YXJuIik7CisJCQlpZiAoc3NjYW5mKHAsIiVkIiwmcnVsZSkgIT0gMSkgZXJyb3IoMzI3LCItbWlzcmFkb250d2FybiIpOworCQkJbGFzdC0tOworCQkJKmxhc3Q9Jy4nOworCQl9IGVsc2UgZXJyb3IoMzI3LCItbWlzcmFkb250d2FybiIpOworCX0KKworCXAtLTsKKwlpZiAobWlzcmFvbGRydWxlKSB7CisJCWlmIChtaXNyYXZlcnNpb249PTIwMDQpIGVycm9yKDMyOCxtaXNyYXZlcnNpb24sIi1taXNyYWRvbnR3YXJuIixwKTsKKwkJaWYgKChtaXNyYW9sZHJ1bGUgPCAxKSB8fCAobWlzcmFvbGRydWxlPk1JU1JBXzk4X1JVTEVfTlVNQkVSKSkgZXJyb3IoMzI5LG1pc3Jhb2xkcnVsZSwiLW1pc3JhZG9udHdhcm4iLHApOworCQltaXNyYV85OF93YXJuX2ZsYWdbbWlzcmFvbGRydWxlLTFdID0gLTE7CisJfSBlbHNlIHsKKwkJaWYgKG1pc3JhdmVyc2lvbj09MTk5OCkgZXJyb3IoMzI4LG1pc3JhdmVyc2lvbiwiLW1pc3JhZG9udHdhcm4iLHApOworCQlpZiAoc3VicnVsZSkgeworCQkJbWlzcl9lcnIgPSBtaXNyYV9lcnJfb3V0OworCQkgIG5vdF9mb3VuZCA9IDE7CisJCQl3aGlsZSAoIG1pc3JfZXJyLT50ZXh0ICkgeworCQkJCWlmICgobWlzcl9lcnItPmNoYXB0ZXIgPT0gcnVsZSkgJiYgKG1pc3JfZXJyLT5ydWxlID09IHN1YnJ1bGUpKSB7CisJCQkJCW5vdF9mb3VuZCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQltaXNyX2VycisrOworCQkJfQorCQkJaWYgKG5vdF9mb3VuZCkgZXJyb3IoMzMwLHJ1bGUsc3VicnVsZSwiLW1pc3JhZG9udHdhcm4iLHApOworCQkJbWlzcmFfMDRfd2Fybl9mbGFnW3J1bGUtMV1bc3VicnVsZS0xXSA9IC0xOworCQl9IGVsc2UgeworCQkJbWlzcl9lcnIgPSBtaXNyYV9lcnJfb3V0OworCQkgIG5vdF9mb3VuZCA9IDE7CisJCQl3aGlsZSAoIG1pc3JfZXJyLT50ZXh0ICkgeworCQkJCWlmIChtaXNyX2Vyci0+Y2hhcHRlciA9PSBydWxlKSB7CisJCQkJCW5vdF9mb3VuZCA9IDA7CisJCQkJCW1pc3JhXzA0X3dhcm5fZmxhZ1ttaXNyX2Vyci0+Y2hhcHRlci0xXVttaXNyX2Vyci0+cnVsZS0xXSA9IC0xOworCQkJCX0KKwkJCQltaXNyX2VycisrOworCQkJfQorCQkJaWYgKG5vdF9mb3VuZCkgZXJyb3IoMzMwLHJ1bGUsc3VicnVsZSwiLW1pc3JhZG9udHdhcm4iLHApOworCQl9CisJfQorCit9CisKKworCit2b2lkIHdhcm4oY2hhciAqcCkKKy8qICBzY2hhbHRldCBXYXJudW5nIGZ1ZXIgTWVsZHVuZyBlaW4gICAgICAgICAgICovCisvKiAgd2VubiBOdW1tZXI8MCBzaW5kIGFsbGUgV2FybnVuZ2VuIGVpbiAgICAgICAqLworeworICBpbnQgaTsKKyAgaWYoKnAhPSc9JykgZXJyb3IoNCwiLXdhcm4iKTsKKyAgaT1hdG9pKHArMSk7CisgIGlmKGk+PWVycl9udW0pIGVycm9yKDE1OSxpKTsKKyAgaWYoaTwwKXsKKyAgICBmb3IoaT0wO2k8ZXJyX251bTtpKyspIGVycl9vdXRbaV0uZmxhZ3MmPX5ET05UV0FSTjsKKyAgICByZXR1cm47CisgIH1lbHNlIGVycl9vdXRbaV0uZmxhZ3MmPX5ET05UV0FSTjsKK30KK3ZvaWQgZ2VuX2Z1bmN0aW9uKEZJTEUgKmYsVmFyICp2LGludCByZWFsX2dlbikKK3sKKyAgSUMgKnAsKm5ldztpbnQgaSxoYWRfcmVnczsKKyAgaWYoREVCVUcmMSkgcHJpbnRmKCJnZW5fZnVuY3Rpb24gPCVzPixmPSVwLHJlYWxfZ2VuPSVkXG4iLHYtPmlkZW50aWZpZXIsKHZvaWQqKWYscmVhbF9nZW4pOworICBpZighdi0+ZmkpIGllcnJvcigwKTsKKyAgaWYoZXJyb3JzIT0wKSByZXR1cm47CisgIGZpcnN0X2ljPWxhc3RfaWM9MDsKKyAgZm9yKGk9MTtpPD1NQVhSO2krKykge3JlZ3NbaV09cmVndXNlZFtpXT1yZWdzYVtpXTtyZWdzYnVmW2ldPTA7fQorICBmdW5jdGlvbl9jYWxscz0wO3ZsYXM9MDsKKyAgaWYoIXJlYWxfZ2VuKXsKKyAgICBmb3IocD12LT5maS0+Zmlyc3RfaWM7cDtwPXAtPm5leHQpeworICAgICAgbmV3PW5ld19JQygpOworICAgICAgKm5ldz0qcDsKKyAgICAgIHAtPmNvcHk9bmV3OworICAgICAgYWRkX0lDKG5ldyk7CisgICAgICBuZXctPmZpbGU9cC0+ZmlsZTsKKyAgICAgIG5ldy0+bGluZT1wLT5saW5lOworICAgICAgaWYocC0+Y29kZT09Q0FMTCl7CisJaW50IGk7CisJZnVuY3Rpb25fY2FsbHMrKzsKKwlpZigocC0+cTEuZmxhZ3MmVkFSKSYmIXN0cmNtcChwLT5xMS52LT5pZGVudGlmaWVyLCJfX2FsbG9jdmxhIikpeworICAgICAgICAgIHZsYXM9MTsKKyAgICAgICAgICB2LT5maS0+ZmxhZ3N8PVVTRVNfVkxBOworICAgICAgICB9CisJbmV3LT5hcmdfbGlzdD1teW1hbGxvYyhzaXplb2YoKm5ldy0+YXJnX2xpc3QpKm5ldy0+YXJnX2NudCk7CisJZm9yKGk9MDtpPG5ldy0+YXJnX2NudDtpKyspIG5ldy0+YXJnX2xpc3RbaV09cC0+YXJnX2xpc3RbaV0tPmNvcHk7ICAgICAgCisgICAgICB9CisgICAgfQorICB9ZWxzZXsKKyAgICBmb3IoaT0xO2k8PU1BWFI7aSsrKSByZWd1c2VkW2ldPTA7CisgICAgZm9yKHA9di0+ZmktPm9wdF9pYztwO3A9cC0+bmV4dCl7CisgICAgICBpZihwLT5jb2RlPT1BTExPQ1JFRyl7CisJcmVndXNlZFtwLT5xMS5yZWddPTE7CisJaWYocmVnX3BhaXIocC0+cTEucmVnLCZycCkpeworCSAgcmVndXNlZFtycC5yMV09MTsKKwkgIHJlZ3VzZWRbcnAucjJdPTE7CisJfQorICAgICAgfQorICAgICAgaWYocC0+Y29kZT09Q0FMTCl7CisJaWYoKHAtPnExLmZsYWdzJlZBUikmJiFzdHJjbXAocC0+cTEudi0+aWRlbnRpZmllciwiX19hbGxvY3ZsYSIpKSB2bGFzPTE7CisJZnVuY3Rpb25fY2FsbHMrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYodmxhcyYmRlBWTEFfUkVHKSByZWdzW0ZQVkxBX1JFR109cmVndXNlZFtGUFZMQV9SRUddPXJlZ3NhW0ZQVkxBX1JFR109cmVnc2NyYXRjaFtGUFZMQV9SRUddPTE7CisgICAgICAKKyAgaWYoIXJlYWxfZ2VuJiYoY19mbGFnc1syXSZVU0VERkxBRykmJmljMSl7CisgICAgZnByaW50ZihpYzEsImZ1bmN0aW9uICVzXG4iLHYtPmlkZW50aWZpZXIpOworICAgIHByaWMoaWMxLGZpcnN0X2ljKTsKKyAgfQorICB2bDA9Zmlyc3RfZXh0OworICB2bDE9di0+ZmktPnN0YXRpY3M7CisgIHZsMj0wOworICB2bDM9di0+ZmktPnZhcnM7CisgIG5lc3Rpbmc9MTsKKyAgZmlyc3RfdmFyW25lc3RpbmddPWxhc3RfdmFyW25lc3RpbmddPTA7CisgIGN1cl9mdW5jPXYtPmlkZW50aWZpZXI7CisgIGlmKCFyZWFsX2dlbil7CisgICAgb3B0aW1pemUob3B0ZmxhZ3Msdik7CisgICAgaWYoKGZvcmNlX3N0YXRpY3N8fHByZWZlcl9zdGF0aWNzKSYmZmlyc3RfdmFyW25lc3RpbmddKXsKKyAgICAgIAorICAgICAgbGFzdF92YXJbbmVzdGluZ10tPm5leHQ9di0+ZmktPnZhcnM7CisgICAgICB2LT5maS0+dmFycz1maXJzdF92YXJbbmVzdGluZ107CisgICAgfQorICAgIG1lbXNldChyZWdzX21vZGlmaWVkLDAsUlNJWkUpOworICAgIC8qIHBzZXVkZW8gZ2VuZXJhdG9yIHBhc3MgdG8gZ2V0IHJlZ3NfbW9kaWZpZWQgKi8KKyAgICB2LT5maS0+b3B0X2ljPWNsb25lX2ljKGZpcnN0X2ljKTsKKyAgICB2LT5maS0+bWF4X29mZnNldD1tYXhfb2Zmc2V0OworICAgIGlmKHYtPmZpJiYodi0+ZmktPmZsYWdzJkFMTF9SRUdTKSkKKyAgICAgIGhhZF9yZWdzPTE7CisgICAgZWxzZQorICAgICAgaGFkX3JlZ3M9MDsKKyAgICBnZW5fY29kZSgwLGZpcnN0X2ljLHYsbWF4X29mZnNldCk7CisjaWZkZWYgSEFWRV9SRUdTX01PRElGSUVECisgICAgaWYoIXYtPmZpKSB2LT5maT1uZXdfZmkoKTsKKyAgICB7CisgICAgICBpbnQgaTtJQyAqcDsKKyAgICAgIGZvcihpPTE7aTw9TUFYUjtpKyspeworCWlmKEJUU1QocmVnc19tb2RpZmllZCxpKSYmcmVnX3BhaXIoaSwmcnApKXsKKwkgIEJTRVQocmVnc19tb2RpZmllZCxycC5yMSk7CisJICBCU0VUKHJlZ3NfbW9kaWZpZWQscnAucjIpOworCX0KKyAgICAgIH0KKyNpZiAxCisgICAgICBmb3IoaT0xO2k8PU1BWFI7aSsrKXsKKwlpZihyZWdfcGFpcihpLCZycCkpeworCSAgaWYoQlRTVChyZWdzX21vZGlmaWVkLHJwLnIxKXx8QlRTVChyZWdzX21vZGlmaWVkLHJwLnIyKSkKKwkgICAgQlNFVChyZWdzX21vZGlmaWVkLGkpOworCX0KKyAgICAgIH0KKyNlbmRpZgorICAgICAgaWYoaGFkX3JlZ3MpeworCWlmKG1lbWNtcChyZWdzX21vZGlmaWVkLHYtPmZpLT5yZWdzX21vZGlmaWVkLFJTSVpFKSkKKwkgIGVycm9yKDMyMSx2LT5pZGVudGlmaWVyKTsKKyAgICAgIH1lbHNlCisJbWVtY3B5KHYtPmZpLT5yZWdzX21vZGlmaWVkLHJlZ3NfbW9kaWZpZWQsUlNJWkUpOworI2lmIDAKKyAgICAgIHByaW50ZigicmVncyBmb3IgJXMgKEFMTF9SRUdTPSVkKTpcbiIsdi0+aWRlbnRpZmllcix2LT5maS0+ZmxhZ3MmQUxMX1JFR1MpOworICAgICAgZm9yKGk9MTtpPE1BWFI7aSsrKSBpZihCVFNUKHJlZ3NfbW9kaWZpZWQsaSkpIHByaW50ZigiJXMgIixyZWduYW1lc1tpXSk7CisgICAgICBwcmludGYoIlxuIik7CisjZW5kaWYKKyAgICB9CisjZW5kaWYKKyAgICB2LT5mbGFnc3w9R0VORVJBVEVEOworICAgIGZyZWVfSUMoZmlyc3RfaWMpOworICAgIGZpcnN0X2ljPWxhc3RfaWM9MDsKKyAgICAvKmZyZWVfdmFyKGZpcnN0X3ZhcltuZXN0aW5nXSk7Ki8KKyAgICBuZXN0aW5nPTA7CisgIH1lbHNleworICAgIGlmKChjX2ZsYWdzWzNdJlVTRURGTEFHKSYmaWMyKXsKKyAgICAgIGZwcmludGYoaWMyLCJmdW5jdGlvbiAlc1xuIix2LT5pZGVudGlmaWVyKTsKKyAgICAgIHByaWMoaWMyLHYtPmZpLT5vcHRfaWMpOworICAgIH0KKyAgICBnZW5fY29kZShmLHYtPmZpLT5vcHRfaWMsdix2LT5maS0+bWF4X29mZnNldCk7CisgICAgc3RhdGljX3N0YWNrX2NoZWNrKHYpOworICB9Cit9CisvKiBoYW5kbGUgZnVuY3Rpb25zIGluIGEgY29uc3QgbGlzdCBiZWZvcmUgY2FsbGVyICovCitzdGF0aWMgdm9pZCBkb19jbGlzdF9jYWxscyhjb25zdF9saXN0ICpjbCkKK3sKKyAgd2hpbGUoY2wpeworICAgIGlmKGNsLT50cmVlJiYoY2wtPnRyZWUtPm8uZmxhZ3MmVkFSQURSKSl7CisgICAgICBWYXIgKnY9Y2wtPnRyZWUtPm8udjsKKyAgICAgIGlmKElTRlVOQyh2LT52dHlwLT5mbGFncykpeworCWlmKERFQlVHJjEpCisJICBwcmludGYoIjo6ICVzXG4iLHYtPmlkZW50aWZpZXIpOworCWRvX2Z1bmN0aW9uKHYpOworICAgICAgfQorICAgIH0KKyAgICBpZihjbC0+b3RoZXIpCisgICAgICBkb19jbGlzdF9jYWxscyhjbC0+b3RoZXIpOworICAgIGNsPWNsLT5uZXh0OworICB9Cit9Cit2b2lkIGRvX2Z1bmN0aW9uKFZhciAqdikKK3sKKyAgaW50IGk7SUMgKnA7CisgIGlmKCh2LT5mbGFncyYoR0VORVJBVEVEfERFRklORUQpKSE9REVGSU5FRCkgcmV0dXJuOworICB2LT5mbGFnc3w9R0VORVJBVEVEOworICBpZighdi0+ZmkpIHYtPmZpPW5ld19maSgpOworI2lmIDAgIAorICBmb3IoaT0wO2k8di0+ZmktPmNhbGxfY250O2krKyl7CisgICAgaWYodi0+ZmktPmNhbGxfbGlzdFtpXS52LT5mbGFncyZERUZJTkVEKQorICAgICAgZG9fZnVuY3Rpb24odi0+ZmktPmNhbGxfbGlzdFtpXS52KTsKKyAgfQorI2VuZGlmCisgIC8qIGhhbmRsZSBjYWxsZWVzIGJlZm9yZSBjYWxsZXIgKi8KKyAgZm9yKHA9di0+ZmktPmZpcnN0X2ljO3A7cD1wLT5uZXh0KXsKKyAgICAvKiBkaXJlY3QgY2FsbCAqLworICAgIGlmKHAtPmNvZGU9PUNBTEwmJihwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSKQorICAgICAgZG9fZnVuY3Rpb24ocC0+cTEudik7CisgICAgLyogZnVuY3Rpb24gYWRkcmVzcyBpcyBhbHNvIGEgY2FuZGlkYXRlICovCisgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8VkFSQURSKSkmJklTRlVOQyhwLT5xMS52LT52dHlwLT5mbGFncykpCisgICAgICBkb19mdW5jdGlvbihwLT5xMS52KTsKKyAgICBpZigocC0+cTIuZmxhZ3MmKFZBUnxWQVJBRFIpKSYmSVNGVU5DKHAtPnEyLnYtPnZ0eXAtPmZsYWdzKSkKKyAgICAgIGRvX2Z1bmN0aW9uKHAtPnEyLnYpOworICAgIGlmKChwLT56LmZsYWdzJihWQVJ8VkFSQURSKSkmJklTRlVOQyhwLT56LnYtPnZ0eXAtPmZsYWdzKSkKKyAgICAgIGRvX2Z1bmN0aW9uKHAtPnoudik7CisgICAgLyogaW5kaXJlY3QgY2FsbCwgaGFuZGxlIHNwZWNpYWwgY2FzZSAqLworICAgIGlmKHAtPmNvZGU9PUNBTEwmJihwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09KFZBUnxEUkVGT0JKKSl7CisgICAgICBWYXIgKnY9cC0+cTEudjsKKyAgICAgIGlmKHYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKXsKKwlJQyAqbT1wLT5wcmV2O1ZhciAqdG1wPTA7CisJd2hpbGUobSYmKG0tPmNvZGU8TEFCRUx8fG0tPmNvZGU+PUJSQSkpeworCSAgaWYoIXRtcCYmKG0tPnouZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmbS0+ei52PT12JiYKKwkgICAgIChtLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09KFZBUnxEUkVGT0JKKSkKKwkgICAgdG1wPW0tPnExLnY7CisJICBpZih0bXAmJihtLT56LmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJm0tPnoudj09dG1wJiYKKwkgICAgIChtLT5xMS5mbGFncyYoVkFSfFZBUkFEUikpPT0oVkFSfFZBUkFEUikmJgorCSAgICAgbS0+cTEudi0+Y2xpc3QmJmlzX2NvbnN0KG0tPnExLnYtPnZ0eXApKXsKKwkgICAgZG9fY2xpc3RfY2FsbHMobS0+cTEudi0+Y2xpc3QpOworCSAgfQorCSAgbT1tLT5wcmV2OworCX0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZ2VuX2Z1bmN0aW9uKDAsdiwwKTsKK30KKworCisKK2V4dGVybiBjaGFyICpjb3B5cmlnaHQ7CitpbnQgbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pCit7CisgIGludCBpLGosKmZuYW1lPW1hbGxvYyhhcmdjKnNpemVvZihpbnQpKSxmaWxlcz0wOworICB1bnNpZ25lZCBsb25nIHVjcHBfZmxhZ3M9TEVYRVJ8V0FSTl9UUklHUkFQSFN8V0FSTl9TVEFOREFSRHxXQVJOX0FOTk9ZSU5HLyp8Q0NIQVJTRVQqL3xIQU5ETEVfUFJBR01BfENPUFlfTElORXxXQVJOX1RSSUdSQVBIU19NT1JFfEhBTkRMRV9UUklHUkFQSFM7CisgIGlmKCFmbmFtZSkgaWVycm9yKDApOworICBtZW1zZXQoZm5hbWUsMCxhcmdjKnNpemVvZihpbnQpKTsKKyAgY19mbGFnc192YWxbOV0uZj1kb250d2FybjsKKyAgY19mbGFnc192YWxbMTBdLmY9d2FybjsKKyAgY19mbGFnc192YWxbNDJdLmY9bWlzcmF3YXJuOworICBjX2ZsYWdzX3ZhbFs0M10uZj1taXNyYWRvbnR3YXJuOworICBjX2ZsYWdzX3ZhbFs0NF0uZj1yZXNlcnZlX3JlZzsKKyAgZm9yKGk9MTtpPGFyZ2M7aSsrKXsKKyAgICBpZigqYXJndltpXSE9Jy0nKXsgIC8qICBrZWluIEZsYWcgICAqLworICAgICAgZm5hbWVbaV09MTsKKyAgICAgIGZpbGVzKys7CisgICAgICBpZighaW5uYW1lKSBpbm5hbWU9YXJndltpXTsKKyAgICB9ZWxzZXsKKyAgICAgIGludCBmbGFnPTA7CisgICAgICBpZihhcmd2W2ldWzFdPT0nRCd8fGFyZ3ZbaV1bMV09PSdJJykgZmxhZz0xOworICAgICAgZm9yKGo9MDtqPE1BWENGJiZmbGFnPT0wO2orKyl7CisJc2l6ZV90IGw7CisJaWYoIWNfZmxhZ3NfbmFtZVtqXSkgY29udGludWU7CisJbD1zdHJsZW4oY19mbGFnc19uYW1lW2pdKTsKKwlpZihsPjAmJiFzdHJuY21wKGFyZ3ZbaV0rMSxjX2ZsYWdzX25hbWVbal0sbCkmJihhcmd2W2ldWzErbF09PTB8fGFyZ3ZbaV1bMStsXT09Jz0nKSl7CisJICBmbGFnPTE7CisJICBpZigoY19mbGFnc1tqXSYoVVNFREZMQUd8RlVOQ0ZMQUcpKT09VVNFREZMQUcpe2Vycm9yKDIsYXJndltpXSk7YnJlYWs7fQorCSAgY19mbGFnc1tqXXw9VVNFREZMQUc7CisJICBpZihjX2ZsYWdzW2pdJlNUUklOR0ZMQUcpeworCSAgICBpZihhcmd2W2ldW2wrMV0hPSc9Jyl7ZXJyb3IoMyxhcmd2W2ldKTt9CisJICAgIGlmKGFyZ3ZbaV1bbCsyXXx8aT49YXJnYy0xKQorCSAgICAgIGNfZmxhZ3NfdmFsW2pdLnA9JmFyZ3ZbaV1bbCsyXTsKKwkgICAgZWxzZQorCSAgICAgIGNfZmxhZ3NfdmFsW2pdLnA9JmFyZ3ZbKytpXVswXTsKKwkgIH0KKwkgIGlmKGNfZmxhZ3Nbal0mVkFMRkxBRyl7CisJICAgIGlmKGFyZ3ZbaV1bbCsxXSE9Jz0nKXtlcnJvcig0LGFyZ3ZbaV0pO30KKwkgICAgaWYoYXJndltpXVtsKzJdfHxpPj1hcmdjLTEpCisJICAgICAgY19mbGFnc192YWxbal0ubD1hdG9sKCZhcmd2W2ldW2wrMl0pOworCSAgICBlbHNlCisJICAgICAgY19mbGFnc192YWxbal0ubD1hdG9sKCZhcmd2WysraV1bMF0pOworCSAgfQorCSAgaWYoY19mbGFnc1tqXSZGVU5DRkxBRykgY19mbGFnc192YWxbal0uZigmYXJndltpXVtsKzFdKTsKKwl9CisgICAgICB9CisgICAgICBmb3Ioaj0wO2o8TUFYR0YmJmZsYWc9PTA7aisrKXsKKwlzaXplX3QgbDsKKwlpZighZ19mbGFnc19uYW1lW2pdKSBjb250aW51ZTsKKwlsPXN0cmxlbihnX2ZsYWdzX25hbWVbal0pOworCWlmKGw+MCYmIXN0cm5jbXAoYXJndltpXSsxLGdfZmxhZ3NfbmFtZVtqXSxsKSl7CisJICBmbGFnPTE7CisJICBpZigoZ19mbGFnc1tqXSYoVVNFREZMQUd8RlVOQ0ZMQUcpKT09VVNFREZMQUcpe2Vycm9yKDIsYXJndltpXSk7YnJlYWs7fQorCSAgZ19mbGFnc1tqXXw9VVNFREZMQUc7CisJICBpZihnX2ZsYWdzW2pdJlNUUklOR0ZMQUcpeworCSAgICBpZihhcmd2W2ldW2wrMV0hPSc9Jyl7ZXJyb3IoMyxhcmd2W2ldKTt9CisJICAgIGlmKGFyZ3ZbaV1bbCsyXXx8aT49YXJnYy0xKQorCSAgICAgIGdfZmxhZ3NfdmFsW2pdLnA9JmFyZ3ZbaV1bbCsyXTsKKwkgICAgZWxzZQorCSAgICAgIGdfZmxhZ3NfdmFsW2pdLnA9JmFyZ3ZbKytpXVswXTsKKwkgIH0KKwkgIGlmKGdfZmxhZ3Nbal0mVkFMRkxBRyl7CisJICAgIGlmKGFyZ3ZbaV1bbCsxXSE9Jz0nKXtlcnJvcig0LGFyZ3ZbaV0pO30KKwkgICAgaWYoYXJndltpXVtsKzJdfHxpPj1hcmdjLTEpCisJICAgICAgZ19mbGFnc192YWxbal0ubD1hdG9sKCZhcmd2W2ldW2wrMl0pOworCSAgICBlbHNlCisJICAgICAgZ19mbGFnc192YWxbal0ubD1hdG9sKCZhcmd2WysraV1bMF0pOworCSAgfQorCSAgaWYoZ19mbGFnc1tqXSZGVU5DRkxBRykgZ19mbGFnc192YWxbal0uZigmYXJndltpXVtsKzFdKTsKKwl9CisgICAgICB9CisgICAgICBpZighZmxhZyl7ZXJyb3IoNSxhcmd2W2ldKTt9CisgICAgfQorICB9CisgIGlmKCEoY19mbGFnc1s2XSZVU0VERkxBRykpeworI2lmZGVmIFNQRUNJQUxfQ09QWVJJR0hUCisgICAgcHJpbnRmKCIlc1xuIixTUEVDSUFMX0NPUFlSSUdIVCk7CisjZWxzZQorICAgIHByaW50ZigiJXNcbiIsY29weXJpZ2h0KTsKKyAgICBwcmludGYoIiVzXG4iLGNnX2NvcHlyaWdodCk7CisjZW5kaWYKKyAgfQorICBpZihjX2ZsYWdzWzRdJlVTRURGTEFHKSBERUJVRz1jX2ZsYWdzX3ZhbFs0XS5sOyBlbHNlIERFQlVHPTA7CisgIGlmKGNfZmxhZ3NbMTNdJlVTRURGTEFHKSB1Y3BwX2ZsYWdzfD1DUExVU1BMVVNfQ09NTUVOVFM7CisgIGlmKGNfZmxhZ3NbMTRdJlVTRURGTEFHKSB1Y3BwX2ZsYWdzfD1DUExVU1BMVVNfQ09NTUVOVFM7CisgIGlmKGNfZmxhZ3NbMTVdJlVTRURGTEFHKSB1Y3BwX2ZsYWdzJj1+SEFORExFX1RSSUdSQVBIUzsKKyAgaWYoY19mbGFnc1s1Ml0mVVNFREZMQUcpIHVjcHBfZmxhZ3MmPX4oV0FSTl9TVEFOREFSRHxXQVJOX0FOTk9ZSU5HKTsKKyAgaWYoY19mbGFnc1sxNl0mVVNFREZMQUcpIG5vX2lubGluZV9wZWVwaG9sZT0xOworICBpZihjX2ZsYWdzWzE3XSZVU0VERkxBRykgZmluYWw9MTsKKyAgaWYoIShjX2ZsYWdzWzhdJlVTRURGTEFHKSkgY19mbGFnc192YWxbOF0ubD0xMDsgLyogbWF4LiBGZWhsZXJ6YWhsICovCisgIGlmKGNfZmxhZ3NbMjJdJlVTRURGTEFHKSBjX2ZsYWdzWzddfD1VU0VERkxBRzsgICAvKiAgaXNvPWFuc2kgKi8KKyAgaWYoY19mbGFnc1s3XSZVU0VERkxBRykgZXJyb3IoMjA5KTsKKyAgaWYoY19mbGFnc1swXSZVU0VERkxBRykgb3B0ZmxhZ3M9Y19mbGFnc192YWxbMF0ubDsKKyAgaWYob3B0ZmxhZ3MmMTYzODQpIGNyb3NzX21vZHVsZT0xOworICBpZihjX2ZsYWdzWzExXSZVU0VERkxBRykgbWF4b3B0cGFzc2VzPWNfZmxhZ3NfdmFsWzExXS5sOworICBpZihjX2ZsYWdzWzEyXSZVU0VERkxBRykgaW5saW5lX3NpemU9Y19mbGFnc192YWxbMTJdLmw7CisgIGlmKGNfZmxhZ3NbMjFdJlVTRURGTEFHKSBmcF9hc3NvYz0xOworICBpZihjX2ZsYWdzWzI1XSZVU0VERkxBRykgdW5yb2xsX3NpemU9Y19mbGFnc192YWxbMjVdLmw7CisgIGlmKGNfZmxhZ3NbMjNdJlVTRURGTEFHKSBub2FsaWFzb3B0PTE7CisgIGlmKGNfZmxhZ3NbMjddJlVTRURGTEFHKSBvcHRzcGVlZD0xOworICBpZihjX2ZsYWdzWzI4XSZVU0VERkxBRykgb3B0c2l6ZT0xOworICBpZihjX2ZsYWdzWzI5XSZVU0VERkxBRykgdW5yb2xsX2FsbD0xOworICBpZihjX2ZsYWdzWzMwXSZVU0VERkxBRykgc3RhY2tfY2hlY2s9MTsgIAorICBpZihjX2ZsYWdzWzMxXSZVU0VERkxBRykgaW5saW5lX2RlcHRoPWNfZmxhZ3NfdmFsWzMxXS5sOworICBpZihjX2ZsYWdzWzMyXSZVU0VERkxBRykgZGVidWdfaW5mbz0xOworICBpZihjX2ZsYWdzWzMzXSZVU0VERkxBRykgYzk5PTE7CisgIGlmKGNfZmxhZ3NbNjBdJlVTRURGTEFHKSBjOTk9MDsKKyAgaWYoY19mbGFnc1szNF0mVVNFREZMQUcpIHt3cG89MTtub19lbWl0PTE7fQorICBpZihjX2ZsYWdzWzM2XSZVU0VERkxBRykge25vaXRyYT0xO30KKyAgaWYoY19mbGFnc1szN10mVVNFREZMQUcpIHsKKwkJbWlzcmFjaGVjaz0xOworCQlpZiAoKG1pc3JhdmVyc2lvbj09MTk5OCkgJiYgKGNfZmxhZ3NfdmFsWzM3XS5sID09IDIwMDQpKSBlcnJvcigzMjgsY19mbGFnc192YWxbMzddLmwsIi1taXNyYSIsIiIpOworCQlpZiAoKG1pc3JhdmVyc2lvbj09MjAwNCkgJiYgKGNfZmxhZ3NfdmFsWzM3XS5sID09IDE5OTgpKSBlcnJvcigzMjgsY19mbGFnc192YWxbMzddLmwsIi1taXNyYSIsIiIpOworCQltaXNyYXZlcnNpb249Y19mbGFnc192YWxbMzddLmw7CisKKwkJaWYgKCEoKG1pc3JhdmVyc2lvbj09MjAwNCkgfHwgKG1pc3JhdmVyc2lvbj09MTk5OCkpKSBlcnJvcigzMjgsbWlzcmF2ZXJzaW9uLCItbWlzcmEiLCIiKTsKKwkJaWYgKG1pc3JhdmVyc2lvbj09MTk5OCkgeworCQkJaW50IG1pc3JhX3NldF9pdGVyYXRvcjsKKwkJCWZvciAobWlzcmFfc2V0X2l0ZXJhdG9yID0gMDsgbWlzcmFfc2V0X2l0ZXJhdG9yIDwgTUlTUkFfOThfUlVMRV9OVU1CRVI7IG1pc3JhX3NldF9pdGVyYXRvcisrICkgeworCQkJCWlmIChtaXNyYV85OF93YXJuX2ZsYWdbbWlzcmFfc2V0X2l0ZXJhdG9yXSAhPSAtMSkgbWlzcmFfOThfd2Fybl9mbGFnW21pc3JhX3NldF9pdGVyYXRvcl0gPSAxOworCQkJfQorCQl9IGVsc2UgeworCQkJaW50IG0xLCBtMjsKKwkJCWZvciAobTEgPSAwOyBtMSA8IE1JU1JBXzA0X0NIQVBURVI7IG0xKyspIHsKKwkJCQlmb3IgKG0yID0gMDsgbTIgPCBNSVNSQV8wNF9NQVhfUlVMRV9JTl9DSEFQVEVSOyBtMisrKSB7CisJCQkJCWlmIChtaXNyYV8wNF93YXJuX2ZsYWdbbTFdW20yXSAhPSAtMSkgbWlzcmFfMDRfd2Fybl9mbGFnW20xXVttMl0gPSAxOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKyAgaWYoY19mbGFnc1szOF0mVVNFREZMQUcpIHtjb2xvcmluZz1jX2ZsYWdzX3ZhbFszOF0ubDt9CisgIGlmKGNfZmxhZ3NbMzldJlVTRURGTEFHKSB7ZG1hbGxvYz0xO30KKyAgaWYoY19mbGFnc1s0MF0mVVNFREZMQUcpIHtkaXNhYmxlPWNfZmxhZ3NfdmFsWzQwXS5sO30KKyAgaWYoY19mbGFnc1s0MV0mVVNFREZMQUcpIHtzb2Z0ZmxvYXQ9MTt9CisgIGlmKGNfZmxhZ3NbNDVdJlVTRURGTEFHKSB7ZWNwcD0xO30KKyAgaWYoY19mbGFnc1s0Nl0mVVNFREZMQUcpIHtzaG9ydF9wdXNoPTE7fQorICBpZihjX2ZsYWdzWzQ3XSZVU0VERkxBRykge2RlZmF1bHRfdW5zaWduZWQ9MTt9CisgIGlmKGNfZmxhZ3NbNDhdJlVTRURGTEFHKSB7b3BlbmNsPTE7fQorICB7CisgICAgc2l6ZV90IGhzPTEwMDA7CisgICAgaWYoY19mbGFnc1s1M10mVVNFREZMQUcpIGhzPWNfZmxhZ3NfdmFsWzUzXS5sOworICAgIGlmKGhzIT0wKSBoYXNoX2V4dD1uZXdfaGFzaHRhYmxlKGhzKTsKKyAgfQorCisKKyAgaWYod3BvKXsKKyAgICBjcm9zc19tb2R1bGU9MTsKKyAgICBvcHRmbGFncz0tMTsKKyAgfQorICBpZihvcHRzaXplKXsKKyAgICBpZighKGNfZmxhZ3NbMjVdJlVTRURGTEFHKSkgdW5yb2xsX3NpemU9MDsKKyAgICBjbGlzdF9jb3B5X3BvaW50ZXI9Y2xpc3RfY29weV9zdGFjazsKKyAgfQorCisgIGlmKG9wdHNwZWVkKXsKKyAgICBjbGlzdF9jb3B5X3BvaW50ZXI9MjU2OworICB9CisKKyAgaWYoZWNwcCYmYzk5KXsKKwkgIGVycm9yKDMzMywgImM5OSIsICJlY3BwIik7CisgIH0KKyAgaWYoYzk5KXsKKyAgICB1Y3BwX2ZsYWdzfD1DUExVU1BMVVNfQ09NTUVOVFN8TUFDUk9fVkFBUkc7CisgICAgZXJyX291dFs2N10uZmxhZ3N8PUFOU0lWOworICAgIGVycl9vdXRbNjddLmZsYWdzJj1+RE9OVFdBUk47CisgICAgZXJyX291dFsxNjFdLmZsYWdzfD1BTlNJVjsKKyAgICBlcnJfb3V0WzE2MV0uZmxhZ3MmPX5ET05UV0FSTjsKKyAgICBlcnJfb3V0WzE1NV0uZmxhZ3N8PUFOU0lWOworICAgIGVycl9vdXRbMTU1XS5mbGFncyY9fkRPTlRXQVJOOworICAgIGVycl9vdXRbMTU2XS5mbGFnc3w9QU5TSVY7CisgICAgZXJyX291dFsxNTZdLmZsYWdzJj1+RE9OVFdBUk47CisgIH0KKyAgaWYoZWNwcCl7CisjaWZuZGVmIEhBVkVfRUNQUAorCWVycm9yKDMzNCwgIkVDKysiKTsKKyNlbmRpZgorICAgIHVjcHBfZmxhZ3N8PUNQTFVTUExVU19DT01NRU5UU3xNQUNST19WQUFSRzsKKyAgfQorICBpZighY3Jvc3NfbW9kdWxlJiZmaWxlcz4xKSBlcnJvcigxKTsKKyAgaWYoZmlsZXM8PTAmJiEoY19mbGFnc1szNV0mVVNFREZMQUcpKSBlcnJvcig2KTsKKyAgc3RhY2thbGlnbj1sMnptKDBMKTsKKyAgaWYoIWluaXRfY2coKSkgZXhpdChFWElUX0ZBSUxVUkUpOworCisgIGlmKGNfZmxhZ3NbNTVdJlVTRURGTEFHKSB7Y2xpc3RfY29weV9zdGFjaz1jX2ZsYWdzX3ZhbFs1NV0ubDt9CisgIGlmKGNfZmxhZ3NbNTZdJlVTRURGTEFHKSB7Y2xpc3RfY29weV9zdGF0aWM9Y19mbGFnc192YWxbNTZdLmw7fQorICBpZihjX2ZsYWdzWzU3XSZVU0VERkxBRykge2NsaXN0X2NvcHlfcG9pbnRlcj1jX2ZsYWdzX3ZhbFs1N10ubDt9CisgIGlmKGNfZmxhZ3NbNThdJlVTRURGTEFHKSB7aW5saW5lX21lbWNweV9zej1jX2ZsYWdzX3ZhbFs1OF0ubDt9CisgIGlmKGNfZmxhZ3NbNjFdJlVTRURGTEFHKSB7Zm9yY2Vfc3RhdGljcz0xO30KKyAgaWYoY19mbGFnc1s2Ml0mVVNFREZMQUcpIHtwcmVmZXJfc3RhdGljcz0xO30KKyAgaWYoY19mbGFnc1s2M10mVVNFREZMQUcpIHtyYW5nZV9vcHQ9MTt9CisgIGlmKGNfZmxhZ3NbNjRdJlVTRURGTEFHKSB7bWVyZ2Vfc3RyaW5ncz0xO30KKyAgaWYoY19mbGFnc1s2NV0mVVNFREZMQUcpIHtzZWNfcGVyX29iaj0xO30KKyAgaWYoY19mbGFnc1s2Nl0mVVNFREZMQUcpIHtub19lZmZfaWNzPTE7fQorICBpZihjX2ZsYWdzWzY3XSZVU0VERkxBRykge2Vhcmx5X2VmZl9pY3M9MTt9CisgIGlmKGNfZmxhZ3NbNjhdJlVTRURGTEFHKSB7bWFza19vcHQ9MTt9CisKKworICBpZighKG9wdGZsYWdzJjIpKXsKKyAgICBmb3IoaT0xO2k8PU1BWFI7aSsrKXsKKyAgICAgIHNyZWdzYVtpXT1yZWdzYVtpXTsKKyAgICAgIGlmKHJlZ3NhW2ldPT1SRUdTQV9URU1QUykgcmVnc2FbaV09MDsKKyAgICB9CisgIH0KKyAgaWYoem1lcXRvKHN0YWNrYWxpZ24sbDJ6bSgwTCkpKQorICAgIHN0YWNrYWxpZ249bWF4YWxpZ247CisgIGZvcihpPTA7aTw9TUFYX1RZUEU7aSsrKQorICAgIGlmKHptZXF0byhhbGlnbltpXSxsMnptKDBMKSkpCisgICAgICBhbGlnbltpXT1sMnptKDFMKTsKKyAgZm9yKGk9MDtpPEVNSVRfQlVGX0RFUFRIO2krKykKKyAgICBlbWl0X2J1ZmZlcltpXT1teW1hbGxvYyhFTUlUX0JVRl9MRU4pOworICBlbWl0X3A9ZW1pdF9idWZmZXJbMF07CisgIC8qRklYTUU6IG11bHRpcGxlLWNjcyBkb24ndCB3b3JrICovCisgIGlmKGNfZmxhZ3NbMjRdJlVTRURGTEFHKSBtdWx0aXBsZV9jY3M9MDsKKyAgaWYoIShjX2ZsYWdzWzVdJlVTRURGTEFHKSl7CisgICAgaWYoY19mbGFnc1sxXSZVU0VERkxBRyl7CisgICAgICBvdXQ9b3Blbl9vdXQoY19mbGFnc192YWxbMV0ucCwwKTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKHdwbykKKwlvdXQ9b3Blbl9vdXQoaW5uYW1lLCJvIik7CisgICAgICBlbHNlCisJb3V0PW9wZW5fb3V0KGlubmFtZSwiYXNtIik7CisgICAgfQorICAgIGlmKCFvdXQpeworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKyAgfQorICBpZih3cG8peworICAgIHdwb19rZXk9TUFHSUNfV1BPOworICAgIGZwcmludGYob3V0LCIlY1ZCQ0MiLDApOworICB9CisgIGlmKGRlYnVnX2luZm8pIGluaXRfZGIob3V0KTsKKyAgaWYoY19mbGFnc1syXSZVU0VERkxBRykgaWMxPW9wZW5fb3V0KGlubmFtZSwiaWMxIik7CisgIGlmKGNfZmxhZ3NbM10mVVNFREZMQUcpIGljMj1vcGVuX291dChpbm5hbWUsImljMiIpOworICBjOTlfY29tcGxpYW50PTA7CisgIGluaXRfY3BwKCk7CisgIGlmKGNfZmxhZ3NbMzVdJlVTRURGTEFHKXsKKyAgICAvKiB3ZSBoYXZlIGEgY29tbWFuZCBmaWxlICovCisgICAgY21kZmlsZT1mb3BlbihjX2ZsYWdzX3ZhbFszNV0ucCwiciIpOworICAgIGlmKCFjbWRmaWxlKSBlcnJvcig3LGNfZmxhZ3NfdmFsWzM1XS5wKTsKKyAgfQorICBmb3IoaT0xO2NtZGZpbGV8fGk8YXJnYztpKyspeworICAgIEZJTEUgKmluOworICAgIGludCBmaXJzdF9ieXRlOworICAgIGlmKGk8YXJnYyl7CisgICAgICBpZighZm5hbWVbaV0pIGNvbnRpbnVlOworICAgICAgaW5uYW1lPWFyZ3ZbaV07CisgICAgfWVsc2V7CisgICAgICBzdGF0aWMgY2hhciBuYnVmWzEwMjRdOworICAgICAgaWYoIWZnZXRzKG5idWYsMTAyMyxjbWRmaWxlKSkgYnJlYWs7CisgICAgICBpbm5hbWU9bmJ1ZjsKKyAgICAgIHdoaWxlKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKmlubmFtZSkpIGlubmFtZSsrOworICAgICAgaWYoKmlubmFtZT09J1wiJykgaW5uYW1lKys7CisgICAgICBpZihpbm5hbWVbc3RybGVuKGlubmFtZSktMV09PSdcbicpIGlubmFtZVtzdHJsZW4oaW5uYW1lKS0xXT0wOworICAgICAgaWYoaW5uYW1lW3N0cmxlbihpbm5hbWUpLTFdPT0nXCInKSBpbm5hbWVbc3RybGVuKGlubmFtZSktMV09MDsKKyAgICAgIGlmKCEqaW5uYW1lKSBicmVhazsKKyAgICB9CisgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJzdGFydGluZyB0cmFuc2xhdGlvbi11bml0IDwlcz5cbiIsaW5uYW1lKTsKKyAgICBpbj1mb3Blbihpbm5hbWUsInIiKTsKKyAgICBpZighaW4pIHtlcnJvcig3LGlubmFtZSk7fQorICAgIG1pc3JhdG9rPTA7CisgICAgZmlyc3RfYnl0ZT1mZ2V0Yyhpbik7CisgICAgaWYoZmlyc3RfYnl0ZT09MCl7CisgICAgICBpbnB1dF93cG89aW47CisgICAgICBpZihmZ2V0YyhpbikhPSdWJykgZXJyb3IoMzAwKTsKKyAgICAgIGlmKGZnZXRjKGluKSE9J0InKSBlcnJvcigzMDApOworICAgICAgaWYoZmdldGMoaW4pIT0nQycpIGVycm9yKDMwMCk7CisgICAgICBpZihmZ2V0YyhpbikhPSdDJykgZXJyb3IoMzAwKTsKKyAgICAgIHdwb19rZXk9TUFHSUNfV1BPOworICAgIH1lbHNleworICAgICAgdW5nZXRjKGZpcnN0X2J5dGUsaW4pOworICAgICAgaW5wdXRfd3BvPTA7CisgICAgfQorICAgIGlmKGNfZmxhZ3NbNTBdJlVTRURGTEFHKXsKKyAgICAgIGNoYXIgKnA7CisgICAgICBkZXBvdXQ9b3Blbl9vdXQoaW5uYW1lLCJkZXAiKTsKKyAgICAgIC8qIG5pY2h0IHN1cGVyIHNjaG9lbiAoYmVzc2VyIGxldHp0ZW4gUHVua3Qgc3RhdHQgZXJzdGVuKSwgYWJlciBrdXJ6Li4gKi8KKyAgICAgIGlmKGNfZmxhZ3NbNTldJlVTRURGTEFHKXsKKwlmcHJpbnRmKGRlcG91dCwiJXM6ICVzIixjX2ZsYWdzX3ZhbFs1OV0ucCxpbm5hbWUpOworICAgICAgfWVsc2V7CisJZm9yKHA9aW5uYW1lOypwJiYqcCE9Jy4nO3ArKykgZnByaW50ZihkZXBvdXQsIiVjIiwqcCk7CisJZnByaW50ZihkZXBvdXQsIi5vOiAlcyIsaW5uYW1lKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoY19mbGFnc1sxOF0mVVNFREZMQUcpIHBwb3V0PW9wZW5fb3V0KGlubmFtZSwiaSIpOworICAgIGlmKCFpbnB1dF93cG8peworICAgICAgaW50IG1jbWVyaz1taXNyYWNoZWNrOworICAgICAgbWlzcmFjaGVjaz0wOworICAgICAgaW5pdF90YWJsZXMoMCk7CisgICAgICBpbml0X2luY2x1ZGVfcGF0aCgwKTsKKyAgICAgIHNldF9pbml0X2ZpbGVuYW1lKGlubmFtZSwxKTsKKyAgICAgIGluaXRfbGV4ZXJfc3RhdGUoJmxzKTsKKyAgICAgIGluaXRfbGV4ZXJfbW9kZSgmbHMpOworICAgICAgbHMuZmxhZ3M9dWNwcF9mbGFnczsKKyAgICAgIGxzLmlucHV0PWluOworICAgICAgZm9yKGo9MTtqPGFyZ2M7aisrKXsKKwlpZihhcmd2W2pdWzBdPT0nLScmJmFyZ3Zbal1bMV09PSdJJykKKwkgIGFkZF9pbmNwYXRoKCZhcmd2W2pdWzJdKTsKKwlpZihhcmd2W2pdWzBdPT0nLScmJmFyZ3Zbal1bMV09PSdEJykKKwkgIGRlZmluZV9tYWNybygmbHMsJmFyZ3Zbal1bMl0pOyAgICAgIAorICAgICAgfQorICAgICAgaWYodGFyZ2V0X21hY3Jvcyl7CisJY2hhciAqKm09dGFyZ2V0X21hY3JvczsKKwl3aGlsZSgqbSkKKwkgIGRlZmluZV9tYWNybygmbHMsKm0rKyk7CisgICAgICB9CisgICAgICBkZWZpbmVfbWFjcm8oJmxzLCJfX1ZCQ0NfXyIpOworICAgICAgZGVmaW5lX21hY3JvKCZscywiX19lbnRyeT1fX3ZhdHRyKFwiZW50cnlcIikiKTsKKyAgICAgIGRlZmluZV9tYWNybygmbHMsIl9fc3RyKHgpPSN4Iik7CisgICAgICBkZWZpbmVfbWFjcm8oJmxzLCJfX2FzbSh4KT1kb3tzdGF0aWMgdm9pZCBpbmxpbmVfYXNzZW1ibHkoKT14O2lubGluZV9hc3NlbWJseSgpO313aGlsZSgwKSIpOworICAgICAgZGVmaW5lX21hY3JvKCZscywiX19yZWdzdXNlZCh4KT1fX3ZhdHRyKFwicmVndXNlZChcInhcIilcIikiKTsKKyAgICAgIGRlZmluZV9tYWNybygmbHMsIl9fdmFyc3VzZWQoeCk9X192YXR0cihcInZhcnVzZWQoXCJ4XCIpXCIpIik7CisgICAgICBkZWZpbmVfbWFjcm8oJmxzLCJfX3ZhcnNtb2RpZmllZCh4KT1fX3ZhdHRyKFwidmFyY2hhbmdlZChcInhcIilcIikiKTsKKyAgICAgIGRlZmluZV9tYWNybygmbHMsIl9fbm9yZXR1cm49X192YXR0cihcIm5vcmV0dXJuKClcIikiKTsKKyAgICAgIGRlZmluZV9tYWNybygmbHMsIl9fYWx3YXlzcmV0dXJuPV9fdmF0dHIoXCJhbHdheXNyZXR1cm4oKVwiKSIpOworICAgICAgZGVmaW5lX21hY3JvKCZscywiX19ub3NpZGVmeD1fX3ZhdHRyKFwibm9zaWRlZngoKVwiKSIpOworICAgICAgZGVmaW5lX21hY3JvKCZscywiX19zdGFjayh4KT1fX3ZhdHRyKF9fc3RyKHN0YWNrMSh4KSkpIik7CisgICAgICBkZWZpbmVfbWFjcm8oJmxzLCJfX3N0YWNrMih4KT1fX3ZhdHRyKF9fc3RyKHN0YWNrMih4KSkpIik7CisgICAgICBkZWZpbmVfbWFjcm8oJmxzLCJfX25vaW5saW5lPV9fdmF0dHIoXCJub2lubGluZSgpXCIpIik7CisgICAgICBpZihjOTkpCisJZGVmaW5lX21hY3JvKCZscywiX19TVERDX1ZFUlNJT05fXz0xOTk5MDFMIik7CisgICAgICBpZihvcHRzcGVlZCkKKwlkZWZpbmVfbWFjcm8oJmxzLCJfX09QVFNQRUVEX18iKTsKKyAgICAgIGlmKG9wdHNpemUpCisJZGVmaW5lX21hY3JvKCZscywiX19PUFRTSVpFX18iKTsKKyAgICAgIG1pc3JhY2hlY2s9bWNtZXJrOworICAgICAgZW50ZXJfZmlsZSgmbHMsbHMuZmxhZ3MpOworICAgIH0KKyAgICBmaWxlbmFtZT1jdXJyZW50X2ZpbGVuYW1lOworICAgIHN3aXRjaF9jb3VudD0wO2JyZWFrX2xhYmVsPTA7CisgICAgbGluZT0wO2VvZj0wOworICAgIG5leHRfdG9rZW4oKTsKKyAgICBraWxsc3AoKTsKKyAgICBuZXN0aW5nPS0xO2VudGVyX2Jsb2NrKCk7CisgICAgdHJhbnNsYXRpb25fdW5pdCgpOworICAgIGZjbG9zZShpbik7IC8qRklYTUU6IGRvIEkgaGF2ZSB0byBjbG9zZT8/Ki8gICAKKyAgICBpZigoY19mbGFnc1sxOF0mVVNFREZMQUcpJiZwcG91dCkgZmNsb3NlKHBwb3V0KTsKKyAgICBpZigoY19mbGFnc1s1MF0mVVNFREZMQUcpJiZkZXBvdXQpe2ZwcmludGYoZGVwb3V0LCJcbiIpO2ZjbG9zZShkZXBvdXQpO30KKyAgICBpZighaW5wdXRfd3BvKQorICAgICAgZnJlZV9sZXhlcl9zdGF0ZSgmbHMpOworICB9CisgIGlmKHdwbykKKyAgICByYXVzKCk7CisgIGlmKCFjcm9zc19tb2R1bGUpeworICAgIGllcnJvcigwKTsKKyAgfWVsc2V7CisgICAgdHVuaXQgKnQ7CisgICAgVmFyICp2LCpzZjsKKyNpZiBIQVZFX09TRUsKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgIGlmKERFQlVHJjEpIHByaW50ZigiZmlyc3Qgb3B0aW1pemluZ1xuIik7CisgICAgZm9yKHY9Zmlyc3RfZXh0O3Y7dj12LT5uZXh0KXsKKyAgICAgIGlmKElTRlVOQyh2LT52dHlwLT5mbGFncykmJih2LT5mbGFncyZERUZJTkVEKSYmKCF2LT52YXR0cnx8IXN0cnN0cih2LT52YXR0ciwidGFza3ByaW8oIikpKXsKKwlkb19mdW5jdGlvbih2KTsKKyAgICAgIH0gICAgICAKKyAgICB9CisgICAgZm9yKHQ9Zmlyc3RfdHVuaXQ7dDt0PXQtPm5leHQpeworICAgICAgZm9yKHY9dC0+c3RhdGljczt2O3Y9di0+bmV4dCl7CisJaWYoSVNGVU5DKHYtPnZ0eXAtPmZsYWdzKSYmKHYtPmZsYWdzJkRFRklORUQpKXsKKwkgIGRvX2Z1bmN0aW9uKHYpOworCX0KKyAgICAgIH0KKyAgICB9CisgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJkZXRlcm1pbmluZyB1c2VkIG9iamVjdHNcbiIpOworICAgIGZvcih2PWZpcnN0X2V4dDt2O3Y9di0+bmV4dCl7CisgICAgICBpZigodi0+ZmxhZ3MmKERFRklORUR8VEVOVEFUSVZFKSkmJih2LT5mbGFncyYoSU5MSU5FRlVOQ3xJTkxJTkVFWFQpKSE9SU5MSU5FRlVOQyl7CisJaWYoIWZpbmFsfHwhc3RyY21wKHYtPmlkZW50aWZpZXIsIm1haW4iKXx8KHYtPnZhdHRyJiZzdHJzdHIodi0+dmF0dHIsImVudHJ5IikpKXsKKyNpZm5kZWYgTk9fT1BUSU1JWkVSCisJICB1c2VkX29iamVjdHModik7CisjZW5kaWYKKwkgIGlmKElTRlVOQyh2LT52dHlwLT5mbGFncykpIGRvX2Z1bmN0aW9uKHYpOworCX0KKyAgICAgIH0KKyAgICB9CisgICAgaWYoIShjX2ZsYWdzWzVdJlVTRURGTEFHKSl7CisgICAgICBpZihERUJVRyYxKSBwcmludGYoImdlbmVyYXRpbmcgZXh0ZXJuYWwgZnVuY3Rpb25zOlxuIik7CisgICAgICBmb3Iodj1maXJzdF9leHQ7djt2PXYtPm5leHQpeworCWlmKElTRlVOQyh2LT52dHlwLT5mbGFncykmJih2LT5mbGFncyYoUkVGRVJFTkNFRHxERUZJTkVEKSk9PShSRUZFUkVOQ0VEfERFRklORUQpKXsKKwkgIGdlbl9mdW5jdGlvbihvdXQsdiwxKTsKKwl9CisgICAgICB9CisgICAgICBpZihERUJVRyYxMDI0KSBwcmludGYoImdlbmVyYXRpbmcgc3RhdGljIGZ1bmN0aW9uc1xuIik7CisgICAgICBpPTA7CisgICAgICBmb3IodD1maXJzdF90dW5pdDt0O3Q9dC0+bmV4dCl7CisJaWYoREVCVUcmMSkgcHJpbnRmKCJ0cmFuc2xhdGlvbi11bml0ICVkOlxuIiwrK2kpOworCWlmKERFQlVHJjEpIHByaW50ZigiZ2VuZXJhdGluZyBzdGF0aWNzOlxuIik7CisJZm9yKHY9dC0+c3RhdGljczt2O3Y9di0+bmV4dCl7CisJICBpZihERUJVRyYxKSBwcmludGYoIiAlc1xuIix2LT5pZGVudGlmaWVyKTsKKwkgIGlmKElTRlVOQyh2LT52dHlwLT5mbGFncykmJih2LT5mbGFncyYoUkVGRVJFTkNFRHxERUZJTkVEKSk9PShSRUZFUkVOQ0VEfERFRklORUQpKXsKKwkgICAgZ2VuX2Z1bmN0aW9uKG91dCx2LDEpOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIAorICAgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJnZW5lcmF0aW5nIHZhcnM6XG4iKTsKKyAgICAgIGdlbl92YXJzKGZpcnN0X2V4dCk7CisgICAgICBmb3IodD1maXJzdF90dW5pdDt0O3Q9dC0+bmV4dCkKKwlnZW5fdmFycyh0LT5zdGF0aWNzKTsKKyAgICAgIGZvcih2PWZpcnN0X2V4dDt2O3Y9di0+bmV4dCl7CisJaWYoSVNGVU5DKHYtPnZ0eXAtPmZsYWdzKSYmKHYtPmZsYWdzJkRFRklORUQpKQorCSAgZ2VuX3ZhcnModi0+ZmktPnZhcnMpOworICAgICAgfQorICAgICAgZm9yKHQ9Zmlyc3RfdHVuaXQ7dDt0PXQtPm5leHQpeworCWZvcih2PXQtPnN0YXRpY3M7djt2PXYtPm5leHQpeworCSAgaWYoSVNGVU5DKHYtPnZ0eXAtPmZsYWdzKSYmKHYtPmZsYWdzJkRFRklORUQpKQorCSAgICBnZW5fdmFycyh2LT5maS0+dmFycyk7CisJfQorICAgICAgfQorICAgIH0KKyAgfQorICByYXVzKCk7Cit9CitpbnQgbWNtcChjb25zdCBjaGFyICpzMSxjb25zdCBjaGFyICpzMikKKy8qICBFaW5mYWNoZXJlIHN0cmNtcC1WYXJpYW50ZS4gICAgICovCit7CisgIGNoYXIgYzsKKyAgZG97CisgICAgYz0qczErKzsKKyAgICBpZihjIT0qczIrKykgcmV0dXJuKDEpOworICB9d2hpbGUoYyk7CisgIHJldHVybiAwOworfQoraW50IGlzX2tleXdvcmQoY2hhciAqcCkKK3sKKyAgY2hhciAqbj1wKzE7CisgIHN3aXRjaCgqcCl7CisgIGNhc2UgJ2EnOgorICAgIGlmKCFtY21wKG4sInV0byIpKSByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKKyAgY2FzZSAnYic6IAorICAgIGlmKGVjcHAmJiFtY21wKG4sIm9vbCIpKSByZXR1cm4gMTsKKyAgICBpZighbWNtcChuLCJyZWFrIikpIHJldHVybiAxOworICAgIHJldHVybiAwOworICBjYXNlICdjJzogCisgICAgaWYoIW1jbXAobiwiYXNlIikpIHJldHVybiAxOworICAgIGlmKGVjcHAmJiFtY21wKG4sImF0Y2giKSkgcmV0dXJuIDE7CisgICAgaWYoIW1jbXAobiwiaGFyIikpIHJldHVybiAxOworICAgIGlmKGVjcHAmJiFtY21wKG4sImxhc3MiKSkgcmV0dXJuIDE7CisgICAgaWYoIW1jbXAobiwib25zdCIpKSByZXR1cm4gMTsKKyAgICBpZihlY3BwJiYhbWNtcChuLCJvbnNfY2FzdCIpKSByZXR1cm4gMTsKKyAgICBpZighbWNtcChuLCJvbnRpbnVlIikpIHJldHVybiAxOworICAgIHJldHVybiAwOworICBjYXNlICdkJzogCisgICAgaWYoIW1jbXAobiwiZWZhdWx0IikpIHJldHVybiAxOworICAgIGlmKGVjcHAmJiFtY21wKG4sImVsZXRlIikpIHJldHVybiAxOworICAgIGlmKCFtY21wKG4sIm8iKSkgcmV0dXJuIDE7CisgICAgaWYoIW1jbXAobiwib3VibGUiKSkgcmV0dXJuIDE7CisgICAgaWYoZWNwcCYmIW1jbXAobiwieW5hbWljX2Nhc3QiKSkgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgJ2UnOiAKKyAgICBpZighbWNtcChuLCJsc2UiKSkgcmV0dXJuIDE7CisgICAgaWYoIW1jbXAobiwibnVtIikpIHJldHVybiAxOworICAgIGlmKGVjcHAmJiFtY21wKG4sInhwbGljaXQiKSkgcmV0dXJuIDE7CisgICAgaWYoZWNwcCYmIW1jbXAobiwieHBvcnQiKSkgcmV0dXJuIDE7CisgICAgaWYoIW1jbXAobiwieHRlcm4iKSkgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgJ2YnOiAKKyAgICBpZihlY3BwJiYhbWNtcChuLCJhbHNlIikpIHJldHVybiAxOworICAgIGlmKCFtY21wKG4sImxvYXQiKSkgcmV0dXJuIDE7CisgICAgaWYoIW1jbXAobiwib3IiKSkgcmV0dXJuIDE7CisgICAgaWYoZWNwcCYmIW1jbXAobiwicmllbmQiKSkgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgJ2cnOiAKKyAgICBpZighbWNtcChuLCJvdG8iKSkgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgJ2knOgorICAgIGlmKCFtY21wKG4sImYiKSkgcmV0dXJuIDE7CisgICAgaWYoYzk5JiYhbWNtcChuLCJubGluZSIpKSByZXR1cm4gMTsKKyAgICBpZighbWNtcChuLCJudCIpKSByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKKyAgY2FzZSAnbCc6CisgICAgaWYoIW1jbXAobiwib25nIikpIHJldHVybiAxOworICAgIHJldHVybiAwOworICBjYXNlICdtJzogCisgICAgaWYoZWNwcCYmIW1jbXAobiwidXRhYmxlIikpIHJldHVybiAxOworICAgIHJldHVybiAwOworICBjYXNlICduJzogCisgICAgaWYoZWNwcCYmIW1jbXAobiwiYW1lc3BhY2UiKSkgcmV0dXJuIDE7CisgICAgaWYoZWNwcCYmIW1jbXAobiwiZXciKSkgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgJ28nOiAKKyAgICBpZihlY3BwJiYhbWNtcChuLCJwZXJhdG9yIikpIHJldHVybiAxOworICAgIHJldHVybiAwOworICBjYXNlICdwJzogCisgICAgaWYoZWNwcCYmIW1jbXAobiwicml2YXRlIikpIHJldHVybiAxOworICAgIGlmKGVjcHAmJiFtY21wKG4sInJvdGVjdGVkIikpIHJldHVybiAxOworICAgIGlmKGVjcHAmJiFtY21wKG4sInVibGljIikpIHJldHVybiAxOworICAgIHJldHVybiAwOworICBjYXNlICdyJzogCisgICAgaWYoIW1jbXAobiwiZWdpc3RlciIpKSByZXR1cm4gMTsKKyAgICBpZihlY3BwJiYhbWNtcChuLCJlaW50ZXJwcmV0X2Nhc3QiKSkgcmV0dXJuIDE7CisgICAgaWYoYzk5JiYhbWNtcChuLCJlc3RyaWN0IikpIHJldHVybiAxOworICAgIGlmKCFtY21wKG4sImV0dXJuIikpIHJldHVybiAxOworICAgIHJldHVybiAwOworICBjYXNlICdzJzoKKyAgICBpZighbWNtcChuLCJob3J0IikpIHJldHVybiAxOworICAgIGlmKCFtY21wKG4sImlnbmVkIikpIHJldHVybiAxOworICAgIGlmKCFtY21wKG4sIml6ZW9mIikpIHJldHVybiAxOworICAgIGlmKCFtY21wKG4sInRhdGljIikpIHJldHVybiAxOworICAgIGlmKGVjcHAmJiFtY21wKG4sInRhdGljX2Nhc3QiKSkgcmV0dXJuIDE7CisgICAgaWYoIW1jbXAobiwidHJ1Y3QiKSkgcmV0dXJuIDE7CisgICAgaWYoIW1jbXAobiwid2l0Y2giKSkgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgJ3QnOgorICAgIGlmKGVjcHAmJiFtY21wKG4sImVtcGxhdGUiKSkgcmV0dXJuIDE7CisgICAvKiBpZihlY3BwJiYhbWNtcChuLCJoaXMiKSkgcmV0dXJuIDE7Ki8KKyAgICBpZihlY3BwJiYhbWNtcChuLCJocm93IikpIHJldHVybiAxOworICAgIGlmKGVjcHAmJiFtY21wKG4sInJ1ZSIpKSByZXR1cm4gMTsKKyAgICBpZihlY3BwJiYhbWNtcChuLCJyeSIpKSByZXR1cm4gMTsKKyAgICBpZighbWNtcChuLCJ5cGVkZWYiKSkgcmV0dXJuIDE7CisgICAgaWYoZWNwcCYmIW1jbXAobiwieXBlaWQiKSkgcmV0dXJuIDE7CisgICAgaWYoZWNwcCYmIW1jbXAobiwieXBlbmFtZSIpKSByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKKyAgY2FzZSAndSc6IAorICAgIGlmKCFtY21wKG4sIm5pb24iKSkgcmV0dXJuIDE7CisgICAgaWYoIW1jbXAobiwibnNpZ25lZCIpKSByZXR1cm4gMTsKKyAgICBpZihlY3BwJiYhbWNtcChuLCJzaW5nIikpIHJldHVybiAxOworICAgIHJldHVybiAwOworICBjYXNlICd2JzogCisgICAgaWYoZWNwcCYmIW1jbXAobiwiaXJ0dWFsIikpIHJldHVybiAxOworICAgIGlmKCFtY21wKG4sIm9pZCIpKSByZXR1cm4gMTsKKyAgICBpZighbWNtcChuLCJvbGF0aWxlIikpIHJldHVybiAxOworICAgIHJldHVybiAwOworICBjYXNlICd3JzoKKyAgICBpZihlY3BwJiYhbWNtcChuLCJjaGFyX3QiKSkgcmV0dXJuIDE7CisgICAgaWYoIW1jbXAobiwiaGlsZSIpKSByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKKyAgY2FzZSAnXyc6IAorICAgIGlmKGM5OSYmIW1jbXAobiwiQm9vbCIpKSByZXR1cm4gMTsKKyAgICBpZihjOTkmJiFtY21wKG4sIkNvbXBsZXgiKSkgcmV0dXJuIDE7CisgICAgaWYoYzk5JiYhbWNtcChuLCJJbWFnaW5hcnkiKSkgcmV0dXJuIDE7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIDA7CisgIH0KK30KK3ZvaWQgY3BiZXooY2hhciAqbSxpbnQgY2hlY2tfa2V5d29yZCkKKy8qICBLb3BpZXJ0IGRlbiBuYWVjaHN0ZW4gQmV6ZWljaG5lciB2b24gcyBuYWNoIG0uIFdlbm4gY2hlY2tfa2V5b3JkIT0wICovCisvKiAgd2lyZCBlaW5lIEZlaGxlcm1lbGR1bmcgYXVzZ2VnZWJlbiwgZmFsbHMgZGFzIEVyZ2VibmlzIGVpbiAgICAgICAgICAqLworLyogIHJlc2VydmllcnRlcyBLZXl3b3JkIHZvbiBDIGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYoY3Rvay0+dHlwZSE9TkFNRSl7CisgICAgKm09MDsKKyAgICByZXR1cm47CisgIH0KKyAgaWYoc3RybGVuKGN0b2stPm5hbWUpPj1NQVhJKXsKKyAgICBlcnJvcigyMDYsTUFYSS0xKTsKKyAgICBzdHJuY3B5KG0sY3Rvay0+bmFtZSxNQVhJLTEpOworICAgIG1bTUFYSS0xXT0wOworICB9ZWxzZXsKKyAgICBzdHJjcHkobSxjdG9rLT5uYW1lKTsKKyAgfQorICBpZihjaGVja19rZXl3b3JkJiZpc19rZXl3b3JkKG0pKQorICAgIGVycm9yKDIxNixtKTsKK30KK3ZvaWQgY3BudW0oY2hhciAqbSkKKy8qIGtvcGllcnQgZGllIG5hZWNoc3RlIGludC1aYWhsIHZvbiBzIG5hY2ggbSAgICovCisvKiBtdXNzIG5vY2ggZXJoZWJsaWNoIGVyd2VpdGVyIHdlcmRlbiAgICAgICAgICAqLworeworICBpZihjdG9rLT50eXBlIT1OVU1CRVIpeworICAgICptPTA7CisgICAgcmV0dXJuOworICB9CisgIHN0cmNweShtLGN0b2stPm5hbWUpOworfQordm9pZCBjb3B5X3Rva2VuKHRva2VuICpkLHRva2VuICpzKQoreworICBzaXplX3QgbDsKKyAgKmQ9KnM7CisgIGlmKFNfVE9LRU4ocy0+dHlwZSkpeworICAgIGw9c3RybGVuKHMtPm5hbWUpKzE7CisgICAgZC0+bmFtZT1teW1hbGxvYyhsKTsKKyAgICBtZW1jcHkoZC0+bmFtZSxzLT5uYW1lLGwpOworICB9ZWxzZQorICAgIGQtPm5hbWU9MDsKK30KK3N0YXRpYyB0b2tlbiBiYWNrX3Rva2VuOworc3RhdGljIGludCBoYXZlX2JhY2tfdG9rZW47Cit2b2lkIHB1c2hfdG9rZW4odG9rZW4gKnQpCit7CisgIHN0YXRpYyBjaGFyIGJhY2tfbmFtZVtNQVhJKzFdOworICBpZihoYXZlX2JhY2tfdG9rZW4pIGllcnJvcigwKTsKKyAgYmFja190b2tlbj0qdDsKKyAgaWYoU19UT0tFTih0LT50eXBlKSl7CisgICAgc3RyY3B5KGJhY2tfbmFtZSx0LT5uYW1lKTsKKyAgICBiYWNrX3Rva2VuLm5hbWU9YmFja19uYW1lOworICB9ZWxzZQorICAgIGJhY2tfdG9rZW4ubmFtZT0wOworICBoYXZlX2JhY2tfdG9rZW49MTsKKyAgY3Rvaz0mYmFja190b2tlbjsKK30KK3ZvaWQgbmV4dF90b2tlbih2b2lkKQoreworICBpZihlb2YpeworICAgIGlmKCFlbmRvaykKKyAgICAgIHJhdXMoKTsKKyAgICBlbHNlCisgICAgICByZXR1cm47CisgIH0KKyAgaWYoaW5wdXRfd3BvKXsKKyAgICBpbnQgYzsKKyAgICBzdGF0aWMgdG9rZW4gd3BvX3RvazsKKyAgICBzdGF0aWMgc2l6ZV90IHN6OworICAgIGNoYXIgKnA7c2l6ZV90IGNzOworICAKKyAgICBpZihoYXZlX2JhY2tfdG9rZW4peworICAgICAgaGF2ZV9iYWNrX3Rva2VuPTA7CisgICAgICBjdG9rPSZ3cG9fdG9rOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjdG9rPSZ3cG9fdG9rOworICAgIGM9ZmdldGMoaW5wdXRfd3BvKTsKKyAgICBpZihjPT1FT0YpeworICAgICAgZW9mPTE7CisgICAgICByZXR1cm47CisgICAgfWVsc2UKKyAgICAgIGNePXdwb19rZXkrKzsKKyAgICB3cG9fdG9rLnR5cGU9KHVuc2lnbmVkIGNoYXIpYzsKKyAgICAvKnByaW50Zigid3BvZ2V0OiAlZCAoJXMpXG4iLGN0b2stPnR5cGUsb3BlcmF0b3JzX25hbWVbY3Rvay0+dHlwZV0pOyovCisgICAgaWYoU19UT0tFTih3cG9fdG9rLnR5cGUpKXsKKyAgICAgIHA9d3BvX3Rvay5uYW1lOworICAgICAgY3M9MDsKKyAgICAgIGRveworCWlmKGNzPj1zeil7CisJICBzeis9MTAwMDsKKwkgIHdwb190b2submFtZT1teXJlYWxsb2Mod3BvX3Rvay5uYW1lLHN6KTsKKwkgIHA9d3BvX3Rvay5uYW1lK2NzOworCX0KKwljPWZnZXRjKGlucHV0X3dwbyk7CisJaWYoYyE9RU9GKXsKKwkgIGNePXdwb19rZXkrKzsKKwkgICpwKys9YzsKKwkgIGNzKys7CisJfWVsc2UKKwkgIGVvZj0xOworICAgICAgfXdoaWxlKCgodW5zaWduZWQgY2hhciljKSE9MCYmYyE9RU9GKTsKKyAgICAgICpwPTA7CisgICAgICAvKnByaW50ZigibmFtZT0lc1xuIixjdG9rLT5uYW1lKTsqLworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYoaGF2ZV9iYWNrX3Rva2VuKXsKKyAgICBoYXZlX2JhY2tfdG9rZW49MDsKKyAgICBpZihTX1RPS0VOKGN0b2stPnR5cGUpJiYhY3Rvay0+bmFtZSkKKyAgICAgIGllcnJvcigwKTsKKyAgfWVsc2V7CisgICAgc3RhdGljIGludCBsYXN0X2xpbmU9MSxsYXN0X3Rva2VuPU5PTkU7CisgICAgc3RhdGljIGNoYXIgKmxhc3RfZm5hbWU7c3RhdGljIHNpemVfdCBsYXN0X3NpemU7CisgICAgZW9mPWxleCgmbHMpOworICAgIGlmKGN0b2smJlNfVE9LRU4obHMuY3Rvay0+dHlwZSkmJiFscy5jdG9rLT5uYW1lKQorICAgICAgaWVycm9yKDApOworICAgIGlmKHdwbyl7CisgICAgICBmcHJpbnRmKG91dCwiJWMiLGxzLmN0b2stPnR5cGVed3BvX2tleSsrKTsKKyAgICAgIGlmKFNfVE9LRU4obHMuY3Rvay0+dHlwZSkpeworCWNoYXIgKnA9bHMuY3Rvay0+bmFtZTsKKwl3aGlsZSgqcCl7CisJICBmcHJpbnRmKG91dCwiJWMiLCpwXndwb19rZXkrKyk7CisJICBwKys7CisJfQorCWZwcmludGYob3V0LCIlYyIsMF53cG9fa2V5KyspOworICAgICAgfQorICAgIH0KKyAgICBpZigoY19mbGFnc1sxOF0mVVNFREZMQUcpJiZwcG91dCYmIWlucHV0X3dwbyl7CisgICAgICBpZighbGFzdF9mbmFtZSl7CisJbGFzdF9mbmFtZT1teW1hbGxvYygxKTsKKwkqbGFzdF9mbmFtZT0wOworICAgICAgfQorICAgICAgaWYoc3RyY21wKGxhc3RfZm5hbWUsY3VycmVudF9maWxlbmFtZSkpeworCWZwcmludGYocHBvdXQsIlxuI2xpbmUgJWQgXCIlc1wiXG4iLChpbnQpbHMuY3Rvay0+bGluZSxjdXJyZW50X2ZpbGVuYW1lKTsKKwlsYXN0X2xpbmU9bHMuY3Rvay0+bGluZTsKKwlpZihzdHJsZW4oY3VycmVudF9maWxlbmFtZSk+PWxhc3Rfc2l6ZSkKKwkgIGxhc3RfZm5hbWU9bXlyZWFsbG9jKGxhc3RfZm5hbWUsc3RybGVuKGN1cnJlbnRfZmlsZW5hbWUpKzEpOworCXN0cmNweShsYXN0X2ZuYW1lLGN1cnJlbnRfZmlsZW5hbWUpOworICAgICAgfWVsc2V7CisJZm9yKDtsYXN0X2xpbmU8bHMuY3Rvay0+bGluZTtsYXN0X2xpbmUrKykKKwkgIGZwcmludGYocHBvdXQsIlxuIik7CisgICAgICB9CisgICAgICBpZihTX1RPS0VOKGxzLmN0b2stPnR5cGUpKXsKKwlpZihscy5jdG9rLT50eXBlPT1QUkFHTUEpCisJICBmcHJpbnRmKHBwb3V0LCIjcHJhZ21hIik7CisJZnByaW50ZihwcG91dCwiICVzIixscy5jdG9rLT5uYW1lKTsKKyAgICAgIH1lbHNlCisJZnByaW50ZihwcG91dCwiICVzIixvcGVyYXRvcnNfbmFtZVtscy5jdG9rLT50eXBlXSk7CisgICAgICBsYXN0X3Rva2VuPWxzLmN0b2stPnR5cGU7CisgICAgfQorICB9CisgIGN0b2s9bHMuY3RvazsKKyAgbGluZT1jdG9rLT5saW5lOworICBpZihtaXNyYWNoZWNrJiZjdG9rLT50eXBlIT1QUkFHTUEmJmN0b2stPnR5cGUhPU5PTkUmJmN0b2stPnR5cGUhPU5FV0xJTkUmJmN0b2stPnR5cGUhPUNPTU1FTlQpCisgICAgbWlzcmF0b2s9MTsKKyAgLypGSVhNRTogZG8gbm90IHN0b3JlIG11bHRpcGxlICovCisgIGlmKGZpbGVuYW1lIT1jdXJyZW50X2ZpbGVuYW1lJiZzdHJjbXAoZmlsZW5hbWUsY3VycmVudF9maWxlbmFtZSkpeworICAgIGZpbGVuYW1lPW15bWFsbG9jKHN0cmxlbihjdXJyZW50X2ZpbGVuYW1lKSsxKTsKKyAgICBzdHJjcHkoZmlsZW5hbWUsY3VycmVudF9maWxlbmFtZSk7CisgIH0KKyAgLypmaWxlbmFtZT1jdXJyZW50X2ZpbGVuYW1lOyovCisgIGlmKERFQlVHJjIpIHByaW50ZigiY3VycmVudCB0b2tlbiAodHlwZSAlZCk6ICVzXG4iLChpbnQpY3Rvay0+dHlwZSx1Y3BwX3Rva2VuX25hbWUoY3RvaykpOworfQorY2hhciAqcHJhZ21hX2NwYmV6KGNoYXIgKmJ1ZmYsY2hhciAqcyk7CisvKiBjYWxjdWxhdGUgZmkgZW50cmllcyAocmVnc19tb2RpZmVkLHVzZXMsY2hhbmdlcyxmbGFncyBldGMuKSBmcm9tCisgICBhdHRyaWJ1dGVzICovCit2b2lkIGZpX2Zyb21fYXR0cihWYXIgKnYpCit7CisgIGNoYXIgKmF0dHI7CisgIGF0dHI9di0+dmF0dHI7CisgIGlmKCFhdHRyKSByZXR1cm47CisgIHdoaWxlKGF0dHI9c3Ryc3RyKGF0dHIsInJlYWRtZW0oIikpeworICAgIGludCBmOworICAgIGF0dHIrPTg7CisgICAgaWYoc3NjYW5mKGF0dHIsIiVkIiwmZikhPTEpIGllcnJvcigwKTsKKyAgICBpZighdi0+ZmkpIHYtPmZpPW5ld19maSgpOworICAgIHYtPmZpLT5mbGFnc3w9QUxMX1VTRVM7CisgICAgdi0+ZmktPnVzZV9jbnQrKzsKKyAgICB2LT5maS0+dXNlX2xpc3Q9bXlyZWFsbG9jKHYtPmZpLT51c2VfbGlzdCx2LT5maS0+dXNlX2NudCpzaXplb2YodmFybGlzdCkpOworICAgIHYtPmZpLT51c2VfbGlzdFt2LT5maS0+dXNlX2NudC0xXS52PTA7CisgICAgdi0+ZmktPnVzZV9saXN0W3YtPmZpLT51c2VfY250LTFdLmZsYWdzPWY7CisgIH0KKyAgYXR0cj12LT52YXR0cjsKKyAgd2hpbGUoYXR0cj1zdHJzdHIoYXR0ciwid3JpdGVtZW0oIikpeworICAgIGludCBmOworICAgIGF0dHIrPTk7CisgICAgaWYoc3NjYW5mKGF0dHIsIiVkIiwmZikhPTEpIGllcnJvcigwKTsKKyAgICBpZighdi0+ZmkpIHYtPmZpPW5ld19maSgpOworICAgIHYtPmZpLT5mbGFnc3w9QUxMX01PRFM7CisgICAgdi0+ZmktPmNoYW5nZV9jbnQrKzsKKyAgICB2LT5maS0+Y2hhbmdlX2xpc3Q9bXlyZWFsbG9jKHYtPmZpLT5jaGFuZ2VfbGlzdCx2LT5maS0+Y2hhbmdlX2NudCpzaXplb2YodmFybGlzdCkpOworICAgIHYtPmZpLT5jaGFuZ2VfbGlzdFt2LT5maS0+Y2hhbmdlX2NudC0xXS52PTA7CisgICAgdi0+ZmktPmNoYW5nZV9saXN0W3YtPmZpLT5jaGFuZ2VfY250LTFdLmZsYWdzPWY7CisgIH0KKyAgYXR0cj12LT52YXR0cjsKKyAgd2hpbGUoYXR0cj1zdHJzdHIoYXR0ciwidmFydXNlZCgiKSl7CisgICAgVmFyICpuOworICAgIGF0dHIrPTg7CisgICAgaWYoIXYtPmZpKSB2LT5maT1uZXdfZmkoKTsKKyAgICB2LT5maS0+ZmxhZ3N8PUFMTF9VU0VTOworICAgIHdoaWxlKDEpeworICAgICAgd2hpbGUoaXNzcGFjZSgodW5zaWduZWQgY2hhcikqYXR0cikpIGF0dHIrKzsKKyAgICAgIGlmKCphdHRyPT0nKScpIGJyZWFrOworICAgICAgYXR0cj1wcmFnbWFfY3BiZXooYnVmZixhdHRyKTsKKyAgICAgIGlmKGJ1ZmZbMF09PTApeworCWVycm9yKDc2KTsKKwlicmVhazsKKyAgICAgIH0KKyAgICAgIG49ZmluZF9leHRfdmFyKGJ1ZmYpOworICAgICAgaWYoIW4peworCWVycm9yKDgyLGJ1ZmYpOworCWJyZWFrOworICAgICAgfQorICAgICAgdi0+ZmktPnVzZV9jbnQrKzsKKyAgICAgIHYtPmZpLT51c2VfbGlzdD1teXJlYWxsb2Modi0+ZmktPnVzZV9saXN0LHYtPmZpLT51c2VfY250KnNpemVvZih2YXJsaXN0KSk7CisgICAgICB2LT5maS0+dXNlX2xpc3Rbdi0+ZmktPnVzZV9jbnQtMV0udj1uOworICAgICAgdi0+ZmktPnVzZV9saXN0W3YtPmZpLT51c2VfY250LTFdLmZsYWdzPW4tPnZ0eXAtPmZsYWdzOworICAgICAgd2hpbGUoaXNzcGFjZSgodW5zaWduZWQgY2hhcikqYXR0cikpIGF0dHIrKzsKKyAgICAgIGlmKCphdHRyPT0nLCd8fCphdHRyPT0nLycpIGF0dHIrKzsKKyAgICB9CisgIH0KKyAgYXR0cj12LT52YXR0cjsKKyAgd2hpbGUoYXR0cj1zdHJzdHIoYXR0ciwidmFyY2hhbmdlZCgiKSl7CisgICAgVmFyICpuOworICAgIGF0dHIrPTExOworICAgIGlmKCF2LT5maSkgdi0+Zmk9bmV3X2ZpKCk7CisgICAgdi0+ZmktPmZsYWdzfD1BTExfTU9EUzsKKyAgICB3aGlsZSgxKXsKKyAgICAgIHdoaWxlKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKmF0dHIpKSBhdHRyKys7CisgICAgICBpZigqYXR0cj09JyknKSBicmVhazsKKyAgICAgIGF0dHI9cHJhZ21hX2NwYmV6KGJ1ZmYsYXR0cik7CisgICAgICBpZihidWZmWzBdPT0wKXsKKwllcnJvcig3Nik7CisJYnJlYWs7CisgICAgICB9CisgICAgICBuPWZpbmRfZXh0X3ZhcihidWZmKTsKKyAgICAgIGlmKCFuKXsKKwllcnJvcig4MixidWZmKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICAgIHYtPmZpLT5jaGFuZ2VfY250Kys7CisgICAgICB2LT5maS0+Y2hhbmdlX2xpc3Q9bXlyZWFsbG9jKHYtPmZpLT5jaGFuZ2VfbGlzdCx2LT5maS0+Y2hhbmdlX2NudCpzaXplb2YodmFybGlzdCkpOworICAgICAgdi0+ZmktPmNoYW5nZV9saXN0W3YtPmZpLT5jaGFuZ2VfY250LTFdLnY9bjsKKyAgICAgIHYtPmZpLT5jaGFuZ2VfbGlzdFt2LT5maS0+Y2hhbmdlX2NudC0xXS5mbGFncz1uLT52dHlwLT5mbGFnczsKKyAgICAgIHdoaWxlKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKmF0dHIpKSBhdHRyKys7CisgICAgICBpZigqYXR0cj09JywnfHwqYXR0cj09Jy8nKSBhdHRyKys7CisgICAgfQorICB9CisgIGF0dHI9di0+dmF0dHI7CisgIHdoaWxlKGF0dHI9c3Ryc3RyKGF0dHIsInJlZ3VzZWQoIikpeworICAgIGludCByLGk7CisgICAgc3RhdGljIGNoYXIgcm5hbWVbTUFYSV07CisgICAgYXR0cis9ODsKKyAgICBpZighdi0+ZmkpIHYtPmZpPW5ld19maSgpOworICAgIHYtPmZpLT5mbGFnc3w9QUxMX1JFR1M7CisgICAgd2hpbGUoMSl7CisgICAgICB3aGlsZShpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSphdHRyKSkgYXR0cisrOworICAgICAgZm9yKGk9MDtpPE1BWEktMSYmKmF0dHImJiFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSphdHRyKSYmKmF0dHIhPScsJyYmKmF0dHIhPScpJyYmKmF0dHIhPScvJztpKyspCisJcm5hbWVbaV09KmF0dHIrKzsKKyAgICAgIHJuYW1lW2ldPTA7CisgICAgICBmb3Iocj0xO3I8PU1BWFI7cisrKXsKKwlpZighcmVnX3BhaXIociwmcnApJiYhc3RyY21wKHJuYW1lLHJlZ25hbWVzW3JdKSl7CisJICBCU0VUKHYtPmZpLT5yZWdzX21vZGlmaWVkLHIpOworCSAgd2hpbGUoaXNzcGFjZSgodW5zaWduZWQgY2hhcikqYXR0cikpIGF0dHIrKzsKKwkgIGlmKCphdHRyPT0nLCd8fCphdHRyPT0nLycpIGF0dHIrKzsKKwkgIGJyZWFrOworCX0KKyAgICAgIH0KKyAgICAgIGlmKHI+TUFYUil7CisJaWYocm5hbWVbMF0pIGVycm9yKDIyMCxybmFtZSk7CisJYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIGF0dHI9di0+dmF0dHI7CisgIHdoaWxlKGF0dHI9c3Ryc3RyKGF0dHIsInN0YWNrMSgiKSl7CisgICAgdW5zaWduZWQgbG9uZyBzejsKKyAgICBpZighdi0+ZmkpIHYtPmZpPW5ld19maSgpOworICAgIHYtPmZpLT5mbGFnc3w9QUxMX1NUQUNLOworICAgIGF0dHIrPTc7CisgICAgaWYoc3NjYW5mKGF0dHIsIiVsdSIsJnN6KSE9MSkgaWVycm9yKDApOyAvKkZJWE1FKi8KKyAgICB2LT5maS0+c3RhY2sxPXVsMnp1bShzeik7CisgIH0KKyAgYXR0cj12LT52YXR0cjsKKyAgd2hpbGUoYXR0cj1zdHJzdHIoYXR0ciwic3RhY2syKCIpKXsKKyAgICB1bnNpZ25lZCBsb25nIHN6OworICAgIGlmKCF2LT5maSkgdi0+Zmk9bmV3X2ZpKCk7CisgICAgdi0+ZmktPmZsYWdzfD1BTExfU1RBQ0s7CisgICAgYXR0cis9NzsKKyAgICBpZihzc2NhbmYoYXR0ciwiJWx1Iiwmc3opIT0xKSBpZXJyb3IoMCk7IC8qRklYTUUqLworICAgIHYtPmZpLT5zdGFjazI9dWwyenVtKHN6KTsKKyAgfSAgCisgIGlmKHN0cnN0cih2LT52YXR0ciwibm9yZXR1cm4oKSIpKXsKKyAgICBpZighdi0+ZmkpIHYtPmZpPW5ld19maSgpOworICAgIHYtPmZpLT5mbGFnc3w9TkVWRVJfUkVUVVJOUzsKKyAgfQorICBpZihzdHJzdHIodi0+dmF0dHIsImFsd2F5c3JldHVybigpIikpeworICAgIGlmKCF2LT5maSkgdi0+Zmk9bmV3X2ZpKCk7CisgICAgdi0+ZmktPmZsYWdzfD1BTFdBWVNfUkVUVVJOUzsKKyAgfSAgCisgIGlmKHN0cnN0cih2LT52YXR0ciwibm9zaWRlZngoKSIpKXsKKyAgICBpZighdi0+ZmkpIHYtPmZpPW5ld19maSgpOworICAgIHYtPmZpLT5mbGFnc3w9Tk9TSURFRlg7CisgIH0KKyAgaWYoc3Ryc3RyKHYtPnZhdHRyLCJub2lubGluZSgpIikpeworICAgIGlmKCF2LT5maSkgdi0+Zmk9bmV3X2ZpKCk7CisgICAgdi0+ZmktPmZsYWdzfD1OT19JTkxJTkU7CisgIH0KK30KKyNkZWZpbmUgcHJhZ21hX2tpbGxzcCgpIHdoaWxlKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnMpKSBzKys7CitjaGFyICpwcmFnbWFfY3BiZXooY2hhciAqYnVmZixjaGFyICpzKQoreworICBpbnQgY250PTA7CisgIGlmKCpzPT0nXyd8fGlzYWxwaGEoKHVuc2lnbmVkIGNoYXIpKnMpKXsKKyAgICAqYnVmZisrPSpzKys7CisgICAgY250Kys7CisgICAgd2hpbGUoY250PE1BWEktMSYmKCpzPT0nXyd8fGlzYWxudW0oKHVuc2lnbmVkIGNoYXIpKnMpKSl7CisgICAgICAqYnVmZisrPSpzKys7CisgICAgICBjbnQrKzsKKyAgICB9CisgIH0KKyAgKmJ1ZmYrKz0wOworICByZXR1cm4gczsKK30KKyNkZWZpbmUgV0FSTlNUQUNLU0laRSAxMjgKK3N0YXRpYyBpbnQgd2lkeCx3YXJuX251bVtXQVJOU1RBQ0tTSVpFXSx3YXJuX2ZsYWdzW1dBUk5TVEFDS1NJWkVdOworI2RlZmluZSBQQUNLU1RBQ0tTSVpFIDEyOAorc3RhdGljIGludCBwaWR4LHBhY2tbUEFDS1NUQUNLU0laRV07Cit2b2lkIGRvX3ByYWdtYShjaGFyICpzKQoreworICBlcnJvcigxNjMpOworICBwcmFnbWFfa2lsbHNwKCk7CisgIGlmKCFzdHJuY21wKCJvcHQiLHMsMykpeworICAgIHMrPTM7cHJhZ21hX2tpbGxzcCgpOworICAgIGNfZmxhZ3NfdmFsWzBdLmw9b3B0ZmxhZ3M9YXRvbChzKTsKKyAgICBpZihERUJVRyYxKSBwcmludGYoIiNwcmFnbWEgb3B0ICVsZFxuIixjX2ZsYWdzX3ZhbFswXS5sKTsKKyAgfWVsc2UgaWYoIXN0cm5jbXAoImRvbnR3YXJuIixzLDgpKXsKKyAgICBpbnQgaTsKKyAgICBzKz04O3ByYWdtYV9raWxsc3AoKTsKKyAgICBpZih3aWR4Pj1XQVJOU1RBQ0tTSVpFKSBpZXJyb3IoMCk7CisgICAgaWYoc3NjYW5mKHMsIiVkIiwmaSk9PTEpeworICAgICAgaWYoaT49ZXJyX251bSkgZXJyb3IoMTU5LGkpOworICAgICAgd2Fybl9udW1bd2lkeF09aTsKKyAgICAgIHdhcm5fZmxhZ3Nbd2lkeF09ZXJyX291dFtpXS5mbGFnczsKKyAgICAgIHdpZHgrKzsKKyAgICAgIGVycl9vdXRbaV0uZmxhZ3N8PURPTlRXQVJOOworICAgIH0KKyAgfWVsc2UgaWYoIXN0cm5jbXAoIndhcm4iLHMsNCkpeworICAgIGludCBpOworICAgIHMrPTQ7cHJhZ21hX2tpbGxzcCgpOworICAgIGlmKHdpZHg+PVdBUk5TVEFDS1NJWkUpIGllcnJvcigwKTsKKyAgICBpZihzc2NhbmYocywiJWQiLCZpKT09MSl7CisgICAgICBpZihpPj1lcnJfbnVtKSBlcnJvcigxNTksaSk7CisgICAgICB3YXJuX251bVt3aWR4XT1pOworICAgICAgd2Fybl9mbGFnc1t3aWR4XT1lcnJfb3V0W2ldLmZsYWdzOworICAgICAgd2lkeCsrOworICAgICAgZXJyX291dFtpXS5mbGFncyY9fkRPTlRXQVJOOworICAgIH0KKyAgfWVsc2UgaWYoIXN0cm5jbXAoInBvcHdhcm4iLHMsNykpeworICAgIGlmKHdpZHg8PTApIGVycm9yKDMwMyk7CisgICAgd2lkeC0tOworICAgIGVycl9vdXRbd2Fybl9udW1bd2lkeF1dLmZsYWdzPXdhcm5fZmxhZ3Nbd2lkeF07CisgIH1lbHNlIGlmKCFzdHJuY21wKCJiZWdpbl9oZWFkZXIiLHMsMTIpKXsKKyAgICBoZWFkZXJfY250Kys7CisgIH1lbHNlIGlmKCFzdHJuY21wKCJlbmRfaGVhZGVyIixzLDEwKSl7CisgICAgaGVhZGVyX2NudC0tOworICB9ZWxzZSBpZighc3RybmNtcCgicGZpIixzLDMpKXsKKyAgICBWYXIgKnY7CisgICAgcys9MztwcmFnbWFfa2lsbHNwKCk7CisgICAgcHJhZ21hX2NwYmV6KGJ1ZmYscyk7CisgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJwcmludCBmdW5jdGlvbl9pbmZvICVzXG4iLGJ1ZmYpOworICAgIHY9ZmluZF92YXIoYnVmZiwwKTsKKyAgICBpZih2JiZ2LT5maSkgcHJpbnRfZmkoc3Rkb3V0LHYtPmZpKTsKKyAgfWVsc2UgaWYoIXN0cm5jbXAoImZpbmZvIixzLDUpKXsKKyAgICBWYXIgKnY7CisgICAgcys9NTtwcmFnbWFfa2lsbHNwKCk7CisgICAgcHJhZ21hX2NwYmV6KGJ1ZmYscyk7CisgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJuZXcgZnVuY3Rpb25faW5mbyAlc1xuIixidWZmKTsKKyAgICB2PWZpbmRfdmFyKGJ1ZmYsMCk7CisgICAgaWYodil7CisgICAgICBpZighdi0+ZmkpIHYtPmZpPW5ld19maSgpOworICAgICAgY3VycmVudF9maT12LT5maTsKKyAgICB9CisgIH1lbHNlIGlmKCFzdHJuY21wKCJmaV9mbGFncyIscyw4KSl7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBzKz04O3ByYWdtYV9raWxsc3AoKTsKKyAgICBzc2NhbmYocywiJWx1IiwmZmxhZ3MpOworICAgIGlmKERFQlVHJjEpIHByaW50ZigiZmlfZmxhZ3MgJWx1XG4iLGZsYWdzKTsKKyAgICBpZihjdXJyZW50X2ZpKSBjdXJyZW50X2ZpLT5mbGFncz1mbGFnczsKKyAgfWVsc2UgaWYoIXN0cm5jbXAoImZpX3VzZXMiLHMsNykpeworICAgIGludCB0O1ZhciAqdjsKKyAgICBzKz03O3ByYWdtYV9raWxsc3AoKTsKKyAgICBzPXByYWdtYV9jcGJleihidWZmLHMpOworICAgIHQ9bmVzdGluZztuZXN0aW5nPTA7CisgICAgdj1maW5kX3ZhcihidWZmLDApOworICAgIG5lc3Rpbmc9dDsKKyAgICBzc2NhbmYocywiJWQiLCZ0KTsKKyAgICBpZihERUJVRyYxKSBwcmludGYoIm5ldyBmaV91c2UgJXMsJWRcbiIsYnVmZix0KTsKKyAgICBpZihjdXJyZW50X2ZpKXsKKyAgICAgIGN1cnJlbnRfZmktPnVzZV9jbnQrKzsKKyAgICAgIGN1cnJlbnRfZmktPnVzZV9saXN0PW15cmVhbGxvYyhjdXJyZW50X2ZpLT51c2VfbGlzdCxjdXJyZW50X2ZpLT51c2VfY250KnNpemVvZih2YXJsaXN0KSk7CisgICAgICBjdXJyZW50X2ZpLT51c2VfbGlzdFtjdXJyZW50X2ZpLT51c2VfY250LTFdLnY9djsKKyAgICAgIGN1cnJlbnRfZmktPnVzZV9saXN0W2N1cnJlbnRfZmktPnVzZV9jbnQtMV0uZmxhZ3M9dDsKKyAgICB9CisgIH1lbHNlIGlmKCFzdHJuY21wKCJmaV9jaGFuZ2VzIixzLDEwKSl7CisgICAgaW50IHQ7VmFyICp2OworICAgIHMrPTEwO3ByYWdtYV9raWxsc3AoKTsKKyAgICBzPXByYWdtYV9jcGJleihidWZmLHMpOworICAgIHQ9bmVzdGluZztuZXN0aW5nPTA7CisgICAgdj1maW5kX3ZhcihidWZmLDApOworICAgIG5lc3Rpbmc9dDsKKyAgICBzc2NhbmYocywiJWQiLCZ0KTsKKyAgICBpZihERUJVRyYxKSBwcmludGYoIm5ldyBmaV9jaGFuZ2UgJXMsJWRcbiIsYnVmZix0KTsKKyAgICBpZihjdXJyZW50X2ZpKXsKKyAgICAgIGN1cnJlbnRfZmktPmNoYW5nZV9jbnQrKzsKKyAgICAgIGN1cnJlbnRfZmktPmNoYW5nZV9saXN0PW15cmVhbGxvYyhjdXJyZW50X2ZpLT5jaGFuZ2VfbGlzdCxjdXJyZW50X2ZpLT5jaGFuZ2VfY250KnNpemVvZih2YXJsaXN0KSk7CisgICAgICBjdXJyZW50X2ZpLT5jaGFuZ2VfbGlzdFtjdXJyZW50X2ZpLT5jaGFuZ2VfY250LTFdLnY9djsKKyAgICAgIGN1cnJlbnRfZmktPmNoYW5nZV9saXN0W2N1cnJlbnRfZmktPmNoYW5nZV9jbnQtMV0uZmxhZ3M9dDsKKyAgICB9CisgIH1lbHNlIGlmKCFzdHJuY21wKCJmaV9jYWxscyIscyw4KSl7CisgICAgaW50IHQ7VmFyICp2OworICAgIHMrPTg7cHJhZ21hX2tpbGxzcCgpOworICAgIHM9cHJhZ21hX2NwYmV6KGJ1ZmYscyk7CisgICAgdD1uZXN0aW5nO25lc3Rpbmc9MDsKKyAgICB2PWZpbmRfdmFyKGJ1ZmYsMCk7CisgICAgbmVzdGluZz10OworICAgIHNzY2FuZihzLCIlZCIsJnQpOworICAgIGlmKERFQlVHJjEpIHByaW50ZigibmV3IGZpX2NhbGwgJXMsJWRcbiIsYnVmZix0KTsKKyAgICBpZihjdXJyZW50X2ZpKXsKKyAgICAgIGN1cnJlbnRfZmktPmNhbGxfY250Kys7CisgICAgICBjdXJyZW50X2ZpLT5jYWxsX2xpc3Q9bXlyZWFsbG9jKGN1cnJlbnRfZmktPmNhbGxfbGlzdCxjdXJyZW50X2ZpLT5jYWxsX2NudCpzaXplb2YodmFybGlzdCkpOworICAgICAgY3VycmVudF9maS0+Y2FsbF9saXN0W2N1cnJlbnRfZmktPmNhbGxfY250LTFdLnY9djsKKyAgICAgIGN1cnJlbnRfZmktPmNhbGxfbGlzdFtjdXJyZW50X2ZpLT5jYWxsX2NudC0xXS5mbGFncz10OworICAgIH0KKyAgfWVsc2UgaWYoIXN0cm5jbXAoImZpX3JlZ3MiLHMsNykpeworICAgIGludCByOworICAgIHMrPTc7cHJhZ21hX2tpbGxzcCgpOworICAgIHByYWdtYV9jcGJleihidWZmLHMpOworICAgIGZvcihyPTE7cjw9TUFYUjtyKyspCisgICAgICBpZighc3RyY21wKGJ1ZmYscmVnbmFtZXNbcl0pKSBicmVhazsKKyAgICBpZihyPD1NQVhSJiZjdXJyZW50X2ZpKQorICAgICAgQlNFVChjdXJyZW50X2ZpLT5yZWdzX21vZGlmaWVkLHIpOworICB9ZWxzZSBpZighc3RybmNtcCgicHJpbnRmbGlrZSIscywxMCkpeworICAgIFZhciAqdjsKKyAgICBzKz0xMDtwcmFnbWFfa2lsbHNwKCk7CisgICAgcHJhZ21hX2NwYmV6KGJ1ZmYscyk7CisgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJwcmludGZsaWtlICVzXG4iLGJ1ZmYpOworICAgIHY9ZmluZF92YXIoYnVmZiwwKTsKKyAgICBpZih2KXsKKyAgICAgIHYtPmZsYWdzfD1QUklOVEZMSUtFOworICAgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJzdWNjZWVkZWRcbiIpOworICAgIH0KKyAgfWVsc2UgaWYoIXN0cm5jbXAoInNjYW5mbGlrZSIscyw5KSl7CisgICAgVmFyICp2OworICAgIHMrPTk7cHJhZ21hX2tpbGxzcCgpOworICAgIHByYWdtYV9jcGJleihidWZmLHMpOworICAgIGlmKERFQlVHJjEpIHByaW50Zigic2NhbmZsaWtlICVzXG4iLGJ1ZmYpOworICAgIHY9ZmluZF92YXIoYnVmZiwwKTsKKyAgICBpZih2KXsKKyAgICAgIHYtPmZsYWdzfD1TQ0FORkxJS0U7CisgICAgICBpZihERUJVRyYxKSBwcmludGYoInN1Y2NlZWRlZFxuIik7CisgICAgfQorICB9ZWxzZSBpZighc3RybmNtcCgib25seS1pbmxpbmUiLHMsMTEpKXsKKyAgICBzKz0xMTtwcmFnbWFfa2lsbHNwKCk7CisgICAgaWYoIXN0cm5jbXAoIm9uIixzLDIpKXsKKyAgICAgIGlmKERFQlVHJjEpIHByaW50Zigib25seS1pbmxpbmUgb25cbiIpOworICAgICAgb25seV9pbmxpbmU9MTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKERFQlVHJjEpIHByaW50Zigib25seS1pbmxpbmUgb2ZmXG4iKTsKKyAgICAgIG9ubHlfaW5saW5lPTI7CisgICAgfQorICB9ZWxzZSBpZighc3RybmNtcCgicGFjayIscyw0KSl7CisgICAgLyogcGFja2luZyBvZiBzdHJ1Y3R1cmVzICovCisgICAgcys9NDtwcmFnbWFfa2lsbHNwKCk7CisgICAgaWYoKnM9PScoJykgeyBzKys7cHJhZ21hX2tpbGxzcCgpO30KKyAgICBpZighc3RybmNtcCgicHVzaCIscyw0KSl7CisgICAgICBpZihwaWR4PT1QQUNLU1RBQ0tTSVpFKXsKKyAgICAgICAgbWVtbW92ZShwYWNrLHBhY2srMSwoUEFDS1NUQUNLU0laRS0xKSpzaXplb2YocGFja1swXSkpOworICAgICAgICBwaWR4LS07CisgICAgICB9CisgICAgICBwYWNrW3BpZHgrK109cGFja19hbGlnbjsKKyAgICAgIHMrPTQ7cHJhZ21hX2tpbGxzcCgpOworICAgICAgaWYoKnM9PScsJyl7CisgICAgICAgIHMrKztwcmFnbWFfa2lsbHNwKCk7CisgICAgICAgIHNzY2FuZihzLCIlaSIsJnBhY2tfYWxpZ24pOworICAgICAgfQorICAgIH1lbHNlIGlmKCFzdHJuY21wKCJwb3AiLHMsMykpeworICAgICAgaWYocGlkeD4wKSBwYWNrX2FsaWduPXBhY2tbLS1waWR4XTsKKyAgICAgIGVsc2UgcGFja19hbGlnbj0wOworICAgIH1lbHNlIGlmKCpzPT0nKScpCisgICAgICBwYWNrX2FsaWduPTA7CisgICAgZWxzZQorICAgICAgc3NjYW5mKHMsIiVpIiwmcGFja19hbGlnbik7CisjaWYgMAorICB9ZWxzZSBpZighc3RybmNtcCgidHlwZSIscyw0KSl7CisgICAgLyogIFR5cCBlaW5lcyBBdXNkcnVja3MgaW0gS2xhcnRleHQgYXVzZ2ViZW4gICAgKi8KKyAgICBucCB0cmVlOworICAgIHMrPTQ7c3RyY2F0KHMsIjsiKTsKKyAgICB0cmVlPWV4cHJlc3Npb24oKTsKKyAgICBpZih0cmVlJiZ0eXBlX2V4cHJlc3Npb24odHJlZSkpeworICAgICAgcHJpbnRmKCJ0eXBlIG9mICVzIGlzOlxuIixzdHJpbmcrNyk7CisgICAgICBwcmQoc3Rkb3V0LHRyZWUtPm50eXApO3ByaW50ZigiXG4iKTsKKyAgICB9CisgICAgaWYodHJlZSkgZnJlZV9leHByZXNzaW9uKHRyZWUpOworICB9ZWxzZSBpZighc3RybmNtcCgidHJlZSIscyw0KSl7CisgICAgLyogIGdpYnQgZWluZSBleHByZXNzaW9uIGF1cyAgICAqLworICAgIG5wIHRyZWU7CisgICAgcys9NDtzdHJjYXQocywiOyIpOworICAgIHRyZWU9ZXhwcmVzc2lvbigpOworICAgIGlmKHRyZWUmJnR5cGVfZXhwcmVzc2lvbih0cmVlKSl7CisgICAgICBwcmludGYoInRyZWUgb2YgJXMgaXM6XG4iLHN0cmluZys3KTsKKyAgICAgIHByZShzdGRvdXQsdHJlZSk7cHJpbnRmKCJcbiIpOworICAgIH0KKyAgICBpZih0cmVlKSBmcmVlX2V4cHJlc3Npb24odHJlZSk7CisjZW5kaWYKKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICB9ZWxzZXsKKyNpZmRlZiBIQVZFX1RBUkdFVF9QUkFHTUFTCisgICAgaGFuZGxlX3ByYWdtYShzKTsKKyNlbmRpZgorICB9Cit9Cit2b2lkIGtpbGxzcCh2b2lkKQorLyogIFVlYmVyc3ByaW5ndCBGdWVsbHplaWNoZW4gICAgICAgICAgICAgICAgICAgKi8KKy8qICBub2NoIGVpbmlnZSB1bnNjaG9lbmUgRGluZ2UgZHJpbiAgICAgICAgICAgICovCit7CisgIC8qRklYTUU6ICNwcmFnbWEgZXRjLiAqLworICB3aGlsZSghZW9mJiYodHRXSEkoY3Rvay0+dHlwZSl8fGN0b2stPnR5cGU9PVBSQUdNQXx8KCFpbnB1dF93cG8mJiFscy5jb25kY29tcCkpKXsKKyAgICBpZihjdG9rLT50eXBlPT1QUkFHTUEpCisgICAgICBkb19wcmFnbWEoY3Rvay0+bmFtZSk7CisgICAgbmV4dF90b2tlbigpOworICB9Cit9Cit2b2lkIGVudGVyX2Jsb2NrKHZvaWQpCisvKiAgU2V0enQgWmVpZ2VyL1N0cnVja3R1cmVuIGJlaSBFaW50cml0dCBpbiBuZXVlbiBCbG9jayAgICAqLworeworICAgIGlmKG5lc3Rpbmc+PU1BWE4pe2Vycm9yKDksbmVzdGluZyk7cmV0dXJuO30KKyAgICBuZXN0aW5nKys7CisgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJlbnRlciBibG9jayAlZFxuIixuZXN0aW5nKTsKKyAgICBmaXJzdF9pbGlzdFtuZXN0aW5nXT1sYXN0X2lsaXN0W25lc3RpbmddPTA7CisgICAgZmlyc3Rfc2RbbmVzdGluZ109bGFzdF9zZFtuZXN0aW5nXT0wOworICAgIGZpcnN0X3NpW25lc3RpbmddPWxhc3Rfc2lbbmVzdGluZ109MDsKKyAgICBmaXJzdF92YXJbbmVzdGluZ109bGFzdF92YXJbbmVzdGluZ109MDsKKyAgICBpZihuZXN0aW5nPT0xKXsKKyAgICAgICAgZmlyc3RfbGxpc3Q9bGFzdF9sbGlzdD0wOworICAgICAgICBmaXJzdF9jbGlzdD1sYXN0X2NsaXN0PTA7CisgICAgICAgIG1lcmtfdmFyZj1tZXJrX3Zhcmw9MDsKKyAgICAgICAgbWVya19pbGlzdGY9bWVya19pbGlzdGw9MDsKKyAgICAgICAgbWVya19zaWY9bWVya19zaWw9MDsKKy8qICBzdHJ1Y3QtZGVjbGFyYXRpb25zIGVyc3QgZ2FueiBhbSBTY2hsdXNzIGxvZXNjaGVuLiBVbSB6dSB2ZXJtZWlkZW4sICAgICAqLworLyogIGRhc3Mgc3RydWN0LWRlY2xhcmF0aW9ucyBpbiBQcm90b3R5cGVuIGZyZWkgd2VyZGVuIHVuZCBkYW5uIGVpbmUgICAgICAgICovCisvKiAgc3BhZXRlcmUgc3RydWN0LCBkaWVzZWxiZSBBZHJlc3NlIGJla29tbXQgdW5kIGRhZHVyY2ggZ2xlaWNoIHdpcmQuICAgICAgKi8KKy8qICBOaWNodCBzZWhyIHNjaG9lbiAtIHdlbm4gbW9lZ2xpY2ggbm9jaCBtYWwgYWVuZGVybi4gICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIG1lcmtfc2RmPW1lcmtfc2RsPTA7Ki8KKyAgICAgICAgYWZ0ZXJsYWJlbD0wOworICAgIH0KKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorfQordm9pZCBsZWF2ZV9ibG9jayh2b2lkKQorLyogIFNldHp0IFplaWdlci9TdHJ1Y2t0dXJlbiBiZWkgVmVybGFzc2VuIGVpbmVzIEJsb2NrcyAgICAgKi8KK3sKKyAgc3RhdGljIGludCBpbmxlYXZlOworICBpbnQgaTsKKyAgaWYoaW5sZWF2ZSkgcmV0dXJuOworICBpbmxlYXZlPTE7CisjaWZkZWYgSEFWRV9FQ1BQCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgZm9yKGk9MTtpPD1NQVhSO2krKykKKyAgICBpZihyZWdibmVzdGluZ1tpXT09bmVzdGluZykgcmVnc2J1ZltpXT0wOworICBpZihuZXN0aW5nPDApe2Vycm9yKDEwKTtpbmxlYXZlPTA7cmV0dXJuO30KKyAgaWYoREVCVUcmMSkgcHJpbnRmKCJsZWF2ZSBibG9jayAlZCB2bGE9JXBcbiIsbmVzdGluZywodm9pZCAqKWJsb2NrX3ZsYVtuZXN0aW5nXSk7CisgIGlmKGJsb2NrX3ZsYVtuZXN0aW5nXSkgY2xlYXJ2bCgpOworICBpZihuZXN0aW5nPjApeworICAgIGlmKG1lcmtfdmFybCkgbWVya192YXJsLT5uZXh0PWZpcnN0X3ZhcltuZXN0aW5nXTsgZWxzZSBtZXJrX3ZhcmY9Zmlyc3RfdmFyW25lc3RpbmddOworICAgIGlmKGxhc3RfdmFyW25lc3RpbmddKSBtZXJrX3Zhcmw9bGFzdF92YXJbbmVzdGluZ107CisgICAgaWYobWVya19zaWwpIG1lcmtfc2lsLT5uZXh0PWZpcnN0X3NpW25lc3RpbmddOyBlbHNlIG1lcmtfc2lmPWZpcnN0X3NpW25lc3RpbmddOworICAgIGlmKGxhc3Rfc2lbbmVzdGluZ10pIG1lcmtfc2lsPWxhc3Rfc2lbbmVzdGluZ107CisgICAgaWYobWVya19zZGwpIG1lcmtfc2RsLT5uZXh0PWZpcnN0X3NkW25lc3RpbmddOyBlbHNlIG1lcmtfc2RmPWZpcnN0X3NkW25lc3RpbmddOworICAgIGlmKGxhc3Rfc2RbbmVzdGluZ10pIG1lcmtfc2RsPWxhc3Rfc2RbbmVzdGluZ107CisgICAgaWYobWVya19pbGlzdGwpIG1lcmtfaWxpc3RsLT5uZXh0PWZpcnN0X2lsaXN0W25lc3RpbmddOyBlbHNlIG1lcmtfaWxpc3RmPWZpcnN0X2lsaXN0W25lc3RpbmddOworICAgIGlmKGxhc3RfaWxpc3RbbmVzdGluZ10pIG1lcmtfaWxpc3RsPWxhc3RfaWxpc3RbbmVzdGluZ107CisgIH0KKyAgaWYobmVzdGluZz09MSl7CisgICAgaWYoY3Jvc3NfbW9kdWxlKXsKKyAgICAgIC8qIGFueXRoaW5nIHRvIGRvPyAqLworICAgIH1lbHNleworICAgICAgaWYobWVya192YXJmKSBnZW5fdmFycyhtZXJrX3ZhcmYpOworICAgICAgaWYoZmlyc3RfbGxpc3QpIGZyZWVfbGxpc3QoZmlyc3RfbGxpc3QpOworICAgICAgZmlyc3RfbGxpc3Q9MDsKKyAgICAgIGlmKGZpcnN0X2NsaXN0KSBmcmVlX2NsaXN0KGZpcnN0X2NsaXN0KTsKKyAgICAgIGZpcnN0X2NsaXN0PTA7CisgICAgICBpZihtZXJrX3ZhcmYpIGZyZWVfdmFyKG1lcmtfdmFyZik7CisgICAgICBtZXJrX3ZhcmY9MDsKKyAgICAgIGlmKG1lcmtfc2lmKSBmcmVlX3NpKG1lcmtfc2lmKTsKKyAgICAgIG1lcmtfc2lmPTA7CisgICAgICAvKiAgc3RydWN0LWRlY2xhcmF0aW9ucyBlcnN0IGdhbnogYW0gU2NobHVzcyBsb2VzY2hlbi4gVW0genUgdmVybWVpZGVuLCAgICAgKi8KKyAgICAgIC8qICBkYXNzIHN0cnVjdC1kZWNsYXJhdGlvbnMgaW4gUHJvdG90eXBlbiBmcmVpIHdlcmRlbiB1bmQgZGFubiBlaW5lICAgICAgICAqLworICAgICAgLyogIHNwYWV0ZXJlIHN0cnVjdCwgZGllc2VsYmUgQWRyZXNzZSBiZWtvbW10IHVuZCBkYWR1cmNoIGdsZWljaCB3aXJkLiAgICAgICovCisgICAgICAvKiAgTmljaHQgc2VociBzY2hvZW4gLSB3ZW5uIG1vZWdsaWNoIG5vY2ggbWFsIGFlbmRlcm4uICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qICAgICAgICBpZihtZXJrX3NkZikgZnJlZV9zZChtZXJrX3NkZik7Ki8KKyAgICAgIGlmKG1lcmtfaWxpc3RmKSBmcmVlX2lsaXN0KG1lcmtfaWxpc3RmKTsKKyAgICAgIG1lcmtfaWxpc3RmPTA7CisgICAgfQorICB9CisgIGlmKG5lc3Rpbmc9PTApeworICAgIGlmKC8qZWNwcHx8Ki9jcm9zc19tb2R1bGUpeworICAgICAgLyogZG9uJ3QgZnJlZSBzdHJ1Y3RfZGVjbGFyYXRpb25zIGluIEVDKysgZm9yIG5vdywgc2luY2UgdGhleSBjYW4gYmUgKi8KKyAgICAgIC8qIHJlZmVyZW5jZWQgZXZlbiB3aGVuIHRoZXkgYXJlIG5vdCBpbiBzY29wZSAqLworICAgICAgLyogYW55dGhpbmcgdG8gZG8/ICovCisgICAgfWVsc2V7CisgICAgICAvKiAgc3RydWN0LWRlY2xhcmF0aW9ucyBlcnN0IGdhbnogYW0gU2NobHVzcyBsb2VzY2hlbi4gVW0genUgdmVybWVpZGVuLCAgICAgKi8KKyAgICAgIC8qICBkYXNzIHN0cnVjdC1kZWNsYXJhdGlvbnMgaW4gUHJvdG90eXBlbiBmcmVpIHdlcmRlbiB1bmQgZGFubiBlaW5lICAgICAgICAqLworICAgICAgLyogIHNwYWV0ZXJlIHN0cnVjdCwgZGllc2VsYmUgQWRyZXNzZSBiZWtvbW10IHVuZCBkYWR1cmNoIGdsZWljaCB3aXJkLiAgICAgICovCisgICAgICAvKiAgTmljaHQgc2VociBzY2hvZW4gLSB3ZW5uIG1vZWdsaWNoIG5vY2ggbWFsIGFlbmRlcm4uICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGlmKGZpcnN0X3NpWzBdKSBmcmVlX3NpKGZpcnN0X3NpWzBdKTsKKyAgICAgIGlmKGZpcnN0X2V4dCkKKwlnZW5fdmFycyhmaXJzdF9leHQpOworICAgICAgaWYoZmlyc3RfdmFyWzBdKQorCWdlbl92YXJzKGZpcnN0X3ZhclswXSk7CisgICAgICBpZihmaXJzdF9leHQpCisJZnJlZV92YXIoZmlyc3RfZXh0KTsKKyAgICAgIGlmKGZpcnN0X3ZhclswXSkKKwlmcmVlX3ZhcihmaXJzdF92YXJbMF0pOworICAgICAgaWYobWVya19zZGYpIGZyZWVfc2QobWVya19zZGYpOworICAgICAgaWYoZmlyc3Rfc2RbMF0pIGZyZWVfc2QoZmlyc3Rfc2RbMF0pOworICAgICAgaWYoZmlyc3RfaWxpc3RbMF0pIGZyZWVfaWxpc3QoZmlyc3RfaWxpc3RbMF0pOworICAgIH0KKyAgfQorICBuZXN0aW5nLS07CisgIGlubGVhdmU9MDsKK30KK3ZvaWQgcHJhKEZJTEUgKmYsYXJndW1lbnRfbGlzdCAqcCkKKy8qICBHaWJ0IGFyZ3VtZW50X2xpc3QgdW1nZWtlaHJ0IGF1ZiBCaWxkc2NoaXJtIGF1cyAgICAgICAgICAgICAqLworeworICAgIGlmKHAtPm5leHQpeyBwcmEoZixwLT5uZXh0KTtmcHJpbnRmKGYsIiwiKTt9CisgICAgaWYocC0+YXJnKSBwcmUoZixwLT5hcmcpOworfQordm9pZCBwcmUoRklMRSAqZixucCBwKQorLyogIEdpYnQgZXhwcmVzc2lvbiBhdWYgQmlsZHNjaGlybSBhdXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgICAgaW50IGM7CisgICAgYz1wLT5mbGFnczsKKyAgICBpZihwLT5zaWRlZngpIGZwcmludGYoZiwiLyIpOworICAgIGlmKHAtPmx2YWx1ZSkgZnByaW50ZihmLCJ8Iik7CisgICAgaWYoYz09Q0FMTCl7ZnByaW50ZihmLCJjYWxsLWZ1bmN0aW9uKCIpO3ByZShmLHAtPmxlZnQpO2ZwcmludGYoZiwiKSgiKTsKKyAgICAgICAgICAgICAgICBpZihwLT5hbGlzdCkgcHJhKGYscC0+YWxpc3QpOworICAgICAgICAgICAgICAgIGZwcmludGYoZiwiKSIpO3JldHVybjt9CisgICAgaWYoYz09Q0FTVCl7ZnByaW50ZihmLCJjYXN0KCIpO3ByZShmLHAtPmxlZnQpOworICAgICAgICAgICAgICAgIGZwcmludGYoZiwiLT4iKTtwcmQoZixwLT5udHlwKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGYsIikiKTtyZXR1cm47fQorICAgIGlmKGM9PU1FTUJFUil7aWYocC0+aWRlbnRpZmllcikgZnByaW50ZihmLCIuJXMiLHAtPmlkZW50aWZpZXIpO3JldHVybjt9CisgICAgaWYoYz09SURFTlRJRklFUil7aWYocC0+aWRlbnRpZmllcikgZnByaW50ZihmLCIlcyIscC0+aWRlbnRpZmllcik7CisgICAgICAgIGZwcmludGYoZiwiKyIpO3ByaW50dmFsKGYsJnAtPnZhbCxMT05HKTsgcmV0dXJuO30KKyAgICBmcHJpbnRmKGYsIiVzKCIsZW5hbWVbY10pOworICAgIGlmKHAtPmxlZnQpIHByZShmLHAtPmxlZnQpOworICAgIGlmKHAtPnJpZ2h0KXsKKyAgICAgICAgZnByaW50ZihmLCIsIik7CisgICAgICAgIHByZShmLHAtPnJpZ2h0KTsKKyAgICB9CisgICAgZnByaW50ZihmLCIpIik7CisgICAgaWYoYz09Q0VYUFJ8fGM9PVBDRVhQUil7ZnByaW50ZihmLCIodmFsdWU9Iik7IHByaW50dmFsKGYsJnAtPnZhbCxwLT5udHlwLT5mbGFncyk7IGZwcmludGYoZiwiKSIpO30KK30KK3N0YXRpYyBpbnQgcHBfbGluZTsKK3ZvaWQgZG9fZXJyb3IoaW50IGVycm4sdmFfbGlzdCB2bCkKKy8qICBCZWhhbmRlbHQgQXVzZ2FiZW4gd2llIEZlaGxlciB1bmQgTWVsZHVuZ2VuICovCit7CisgIGludCB0eXBlLGhhdmVfc3RhY2s9MDsKKyAgICBpbnQgdHJlYXRfd2FybmluZ19hc19lcnJvcj0wOworICAgIGNoYXIgKmVycnN0cj0iIiwqdHh0PWZpbGVuYW1lOworICAgIGlmKGNfZmxhZ3NfdmFsWzhdLmwmJmNfZmxhZ3NfdmFsWzhdLmw8PWVycm9ycykKKyAgICAgIHJldHVybjsKKyAgICBpZihlcnJuPT0tMSkgZXJybj0xNTg7CisgICAgdHlwZT1lcnJfb3V0W2Vycm5dLmZsYWdzOworICAgIHRyZWF0X3dhcm5pbmdfYXNfZXJyb3I9KHR5cGUmV0FSTklORykmJihjX2ZsYWdzWzU0XSZVU0VERkxBRyk7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgaWYodHlwZSZET05UV0FSTikgcmV0dXJuOworICAgIGlmKHR5cGUmV0FSTklORykgZXJyc3RyPSJ3YXJuaW5nIjsKKyAgICBpZih0eXBlJkVSUk9SKSBlcnJzdHI9ImVycm9yIjsKKyAgICBpZihpbnB1dF93cG8peworICAgICAgZnByaW50ZihzdGRlcnIsIiVzICVkOiAiLGVycnN0cixlcnJuKTsKKyAgICB9ZWxzZSBpZigodHlwZSZOT0xJTkUpLyp8fCgodHlwZSZQUkVQUk9DKSYmcHBfbGluZTw9MCkqLyl7CisgICAgICBmcHJpbnRmKHN0ZGVyciwiJXMgJWQ6ICIsZXJyc3RyLGVycm4pOworICAgIH1lbHNlIGlmKHR5cGUmKElORlVOQ3xJTklDKSl7CisgICAgICBpZigodHlwZSZJTklDKSYmZXJyX2ljJiZlcnJfaWMtPmxpbmUpeworCWZwcmludGYoc3RkZXJyLCIlcyAlZCBpbiBsaW5lICVkIG9mIFwiJXNcIjogIixlcnJzdHIsZXJybixlcnJfaWMtPmxpbmUsZXJyX2ljLT5maWxlKTsKKworCisgICAgICB9ZWxzZXsKKwlmcHJpbnRmKHN0ZGVyciwiJXMgJWQgaW4gZnVuY3Rpb24gXCIlc1wiOiAiLGVycnN0cixlcnJuLGN1cl9mdW5jKTsKKyAgICAgIH0KKyAgICB9ZWxzZSBpZighaW5wdXRfd3BvKXsKKyAgICAgIGludCBuOworICAgICAgaWYoZW9mKXsKKwlmcHJpbnRmKHN0ZGVyciwiPkVPRlxuIik7CisgICAgICB9ZWxzZXsKKwlpZihscy5jbGkhPTApIGxzLmNvcHlfbGluZVtscy5jbGldPTA7CisJZnByaW50ZihzdGRlcnIsIj4lc1xuIixscy5jb3B5X2xpbmUpOworICAgICAgfQorICAgICAgaWYodHlwZSZQUkVQUk9DKXsKKwkgICAgICB0eHQ9Y3VycmVudF9maWxlbmFtZTsKKwkgICAgICBuPXBwX2xpbmU7CisgICAgICB9ZWxzZXsKKwlpZihjdG9rKQorCSAgbj1jdG9rLT5saW5lOworCWVsc2UKKwkgIG49LTE7CisgICAgICB9CisgICAgICBpZihjX2ZsYWdzWzIwXSZVU0VERkxBRyl7ICAgLyogIHN0cmlwLXBhdGggZnJvbSBmaWxlbmFtZSAqLworCWNoYXIgKnA9dHh0LGM7CisJd2hpbGUoYz0qcCsrKQorCSAgaWYoYz09JzonfHxjPT0nLyd8fGM9PSdcXCcpIHR4dD1wOworICAgICAgfQorICAgICAgZnByaW50ZihzdGRlcnIsIiVzICVkIGluIGxpbmUgJWQgb2YgXCIlc1wiOiAiLGVycnN0cixlcnJuLG4sdHh0KTsKKyAgICAgIGhhdmVfc3RhY2s9MTsgLyogd2UgY2FuIHJlcG9ydCB0aGUgaW5jbHVkZSBzdGFjayAqLworICAgIH0KKyAgICB2ZnByaW50ZihzdGRlcnIsZXJyX291dFtlcnJuXS50ZXh0LHZsKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKyAgICBpZihoYXZlX3N0YWNrJiYoIShjX2ZsYWdzWzQ5XSZVU0VERkxBRykpKXsKKyAgICAgIGludCBpOworICAgICAgc3RhY2tfY29udGV4dCAqc2MgPSByZXBvcnRfY29udGV4dCgpOworICAgICAgZm9yKGk9MDs7aSsrKXsKKwlpZihzY1tpXS5saW5lPT0tMSkgYnJlYWs7CisJZnByaW50ZihzdGRlcnIsIlx0aW5jbHVkZWQgZnJvbSBmaWxlIFwiJXNcIjolbGRcbiIsc2NbaV0ubG9uZ19uYW1lP3NjW2ldLmxvbmdfbmFtZTpzY1tpXS5uYW1lLHNjW2ldLmxpbmUpOworICAgICAgfQorICAgIH0KKyAgICBpZih0cmVhdF93YXJuaW5nX2FzX2Vycm9yKXtmcHJpbnRmKHN0ZGVyciwid2FybmluZyAlZCB0cmVhdGVkIGFzIGVycm9yIFstd2FybmluZ3MtYXMtZXJyb3JzXVxuIixlcnJuKTt9CisgICAgaWYodHlwZSZFUlJPUnx8dHJlYXRfd2FybmluZ19hc19lcnJvcil7CisgICAgICBlcnJvcnMrKzsKKyAgICAgIGlmKGNfZmxhZ3NfdmFsWzhdLmwmJmNfZmxhZ3NfdmFsWzhdLmw8PWVycm9ycyYmISh0eXBlJk5PUkFVUykpCisJe2ZwcmludGYoc3RkZXJyLCJNYXhpbXVtIG51bWJlciBvZiBlcnJvcnMgcmVhY2hlZCFcbiIpO3JhdXMoKTt9CisgICAgfQorICAgIGlmKHR5cGUmRkFUQUwpe2ZwcmludGYoc3RkZXJyLCJhYm9ydGluZy4uLlxuIik7cmF1cygpO30KK30KK3ZvaWQgZXJyb3IoaW50IGVycm4sLi4uKQoreworICB2YV9saXN0IHZsOworICB2YV9zdGFydCh2bCxlcnJuKTsKKyAgZG9fZXJyb3IoZXJybix2bCk7CisgIHZhX2VuZCh2bCk7Cit9Cit2b2lkIHVjcHBfb3VjaChjaGFyICpmbXQsIC4uLikKK3sKKyAgaWVycm9yKDApOworfQordm9pZCBkb191Y3BwX2Vycm9yKGNoYXIgKmZtdCx2YV9saXN0IHZsKQoreworICBpbnQgaTsKKyAgZm9yKGk9MDtpPGVycl9udW07aSsrKXsKKyAgICBpZighc3RyY21wKGZtdCxlcnJfb3V0W2ldLnRleHQpKQorICAgICAgYnJlYWs7CisgIH0KKyAgaWYoKmZtdD09JyMnKXsKKyAgICAvKiAjZXJyb3IvI3dhcm5pbmctZGlyZWN0aXZlICovCisgICAgaT0qKGZtdCsxKT09J3cnPzMyNToyOTI7CisgIH0KKyAgaWYoaT49ZXJyX251bSl7CisgICAgcHV0cyhmbXQpOworICAgIGllcnJvcigwKTsKKyAgfQorICBkb19lcnJvcihpLHZsKTsKK30KK3ZvaWQgdWNwcF9lcnJvcihsb25nIGxpbmUsIGNoYXIgKmZtdCwgLi4uKQoreworICB2YV9saXN0IGFwOworICBwcF9saW5lPWxpbmU7CisgIHZhX3N0YXJ0KGFwLCBmbXQpOworICBkb191Y3BwX2Vycm9yKGZtdCxhcCk7CisgIHZhX2VuZChhcCk7Cit9Cit2b2lkIHVjcHBfd2FybmluZyhsb25nIGxpbmUsIGNoYXIgKmZtdCwgLi4uKQoreworICB2YV9saXN0IGFwOworICBwcF9saW5lPWxpbmU7CisgIHZhX3N0YXJ0KGFwLCBmbXQpOworICBkb191Y3BwX2Vycm9yKGZtdCxhcCk7CisgIHZhX2VuZChhcCk7Cit9CisKK3ZvaWQgbWlzcmEoaW50IG4sLi4uKQoreworICB2YV9saXN0IHZsOworICBpZighbWlzcmFjaGVjaykgcmV0dXJuOworICB2YV9zdGFydCh2bCxuKTsKKyAgZnByaW50ZihzdGRlcnIsIk1JU1JBIGVycm9yICVkXG4iLG4pOworICB2YV9lbmQodmwpOworfQorCit2b2lkIG1pc3JhX2Vycm9yKGludCBuLCBpbnQgcnVsZSwgaW50IHN1YnJ1bGUsIGludCBsaW5lLCAuLi4pIHsKKwl2YV9saXN0IHZsOworCXRtaXNyYV9lcnJfb3V0KiBtaXNyX2VycjsKKwljaGFyKiBtaXNfdmVyc19zdHJpbmc7CisJY2hhciBtaXNfbnVtYl9zdHJpbmdbMTAwXTsKKwljaGFyKiBydWxlX3RleHQ7CisJaW50IG5vdF9mb3VuZDsKKwlpZiAoIW1pc3JhY2hlY2spIHJldHVybjsKKwltaXNfdmVyc19zdHJpbmcgPSAwOworCXZhX3N0YXJ0KHZsLGxpbmUpOworCisJaWYgKGxpbmUgPT0gMCkgbGluZSA9IGN0b2stPmxpbmU7CisKKwlpZiAoKG4pICYmIChtaXNyYXZlcnNpb249PTE5OTgpKSB7CisJCWlmIChtaXNyYV85OF93YXJuX2ZsYWdbbi0xXSAhPSAxKSByZXR1cm47IC8qIFRPRE86IFpobGVyIHNldHplbiB3ZW5uIG51ciBlaW4gcGFhciBuaWNodCBhdXNnZWdlYmVuIHdlcmRlbiBzb2xsZW4gKi8KKwkJbWlzX3ZlcnNfc3RyaW5nID0gbXlzdHJkdXAoIjE5OTgiKTsKKwkJc3ByaW50ZihtaXNfbnVtYl9zdHJpbmcsIiVkIixuKTsKKwkJbWlzcl9lcnIgPSBOVUxMOwkJCQorCX0gZWxzZSBpZiAoKHJ1bGUpICYmIChtaXNyYXZlcnNpb249PTIwMDQpKSB7CisJCWlmIChtaXNyYV8wNF93YXJuX2ZsYWdbcnVsZS0xXVtzdWJydWxlLTFdICE9IDEpIHJldHVybjsvKiBUT0RPOiBaaGxlciBzZXR6ZW4gd2VubiBudXIgZWluIHBhYXIgbmljaHQgYXVzZ2VnZWJlbiB3ZXJkZW4gc29sbGVuICovCisJCW1pc192ZXJzX3N0cmluZyA9IG15c3RyZHVwKCIyMDA0Iik7CisJCXNwcmludGYobWlzX251bWJfc3RyaW5nLCJDaGFwdGVyICVkLCBSdWxlICVkIixydWxlLHN1YnJ1bGUpOworCQlpZiAoc3VicnVsZSkgeworICAJCW1pc3JfZXJyID0gbWlzcmFfZXJyX291dDsKKwkgIAlub3RfZm91bmQgPSAxOworCQkgIHdoaWxlICggbm90X2ZvdW5kICkgeworCQkJCWlmICgobWlzcl9lcnItPmNoYXB0ZXIgPT0gcnVsZSkgJiYgKG1pc3JfZXJyLT5ydWxlID09IHN1YnJ1bGUpKSB7CisJCQkJCW5vdF9mb3VuZCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQltaXNyX2VycisrOworCQkJfQorCQl9CisJfQorCWlmICghbWlzX3ZlcnNfc3RyaW5nKSByZXR1cm47CisJaWYgKG1pc3JfZXJyKSBmcHJpbnRmKHN0ZGVyciwiTUlTUkEoJXMpIFJ1bGUgdmlvbGF0aW9uICglcykgaW4gbGluZSA8JWQ+XG4lc1xuIixtaXNfdmVyc19zdHJpbmcsbWlzX251bWJfc3RyaW5nLGxpbmUsbWlzcl9lcnItPnRleHQpOworCWVsc2UgZnByaW50ZihzdGRlcnIsIk1JU1JBKCVzKSBSdWxlIHZpb2xhdGlvbiAoJXMpIGluIGxpbmUgPCVkPjogTm8gZGVzY3JpcHRpb24gZm91bmRcbiIsbWlzX3ZlcnNfc3RyaW5nLG1pc19udW1iX3N0cmluZyxsaW5lKTsKKworCWlmIChtaXNfdmVyc19zdHJpbmcpIGZyZWUobWlzX3ZlcnNfc3RyaW5nKTsKKworCXZhX2VuZCh2bCk7Cit9CisKK3ZvaWQgbWlzcmFfbmV1KGludCBuLGludCBydWxlLGludCBzdWJydWxlLCBpbnQgbGluZSwgLi4uKQoreworICB2YV9saXN0IHZsOworCWludCBtaXNfd2FybiA9IDA7CisJbWlzcmFfZXJyb3IobixydWxlLHN1YnJ1bGUsbGluZSk7CisJcmV0dXJuOworCXZhX3N0YXJ0KHZsLGxpbmUpOworICB2YV9lbmQodmwpOworCit9CisKK0ZJTEUgKm9wZW5fb3V0KGNoYXIgKm5hbWUsY2hhciAqZXh0KQorLyogIEhhZW5ndCBleHQgYW4gbmFtZSBhbiB1bmQgdmVyc3VjaHQgZGllc2UgRmlsZSBhbHMgb3V0cHV0IHp1IG9lZmZuZW4gKi8KK3sKKyAgY2hhciAqcywqcDtGSUxFICpmOworICBpZihleHQpeworICAgIHM9bXltYWxsb2Moc3RybGVuKG5hbWUpK3N0cmxlbihleHQpKzIpOworICAgIHN0cmNweShzLG5hbWUpOworICAgIHA9cytzdHJsZW4ocyk7CisgICAgd2hpbGUocD49cyl7CisgICAgICBpZigqcD09Jy4nKXsqcD0wO2JyZWFrO30KKyAgICAgIHAtLTsKKyAgICB9CisgICAgc3RyY2F0KHMsIi4iKTsKKyAgICBzdHJjYXQocyxleHQpOworICB9ZWxzZQorICAgIHM9bmFtZTsKKyAgZj1mb3BlbihzLCJ3Iik7CisgIGlmKCFmKSBmcHJpbnRmKHN0ZGVyciwiQ291bGRuJ3Qgb3BlbiA8JXM+IGZvciBvdXRwdXQhXG4iLHMpOworICBpZihleHQpIGZyZWUocyk7CisgIHJldHVybihmKTsKK30KZGlmZiAtLWdpdCBhL21iYXNpYy5jIGIvbWJhc2ljLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWQ3MzA4YQotLS0gL2Rldi9udWxsCisrKyBiL21iYXNpYy5jCkBAIC0wLDAgKzEsMjI5IEBACisvKiAgVGVzdC1sYW5ndWFnZSBmb3IgdmJjYy4gKi8KKworI2luY2x1ZGUgInN1cHAuaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RydWN0IFZhciAqZnY7CisKK3N0cnVjdCBUeXAgdGludCxtZnVuYzsKK3N0cnVjdCBzdHJ1Y3RfZGVjbGFyYXRpb24gbXNkOyAvKiBpbml0aWFsaXplZCB0byB6ZXJvICovCisKK0ZJTEUgKmZpbGU7CitjaGFyICpuZXh0OworCitzdHJ1Y3Qgb2JqIGV4cHJlc3Npb24oKSxmYWN0b3IoKSxzY2FsYXIoKTsKKwordm9pZCByYXVzKHZvaWQpCit7CisgICAgd2hpbGUoZnYpeworICAgICAgICBzdHJ1Y3QgVmFyICptPWZ2LT5uZXh0OworICAgICAgICBmcmVlKGZ2KTsKKyAgICAgICAgZnY9bTsKKyAgICB9CisgICAgd2hpbGUoZmlyc3RfaWMpeworICAgICAgICBzdHJ1Y3QgSUMgKm09Zmlyc3RfaWMtPm5leHQ7CisgICAgICAgIGZyZWUoZmlyc3RfaWMpOworICAgICAgICBmaXJzdF9pYz1tOworICAgIH0KKyAgICBleGl0KDApOworfQordm9pZCBhZGRfSUMoc3RydWN0IElDICpuZXcpCit7CisgICAgbmV3LT5uZXh0PTA7CisgICAgbmV3LT5wcmV2PWxhc3RfaWM7CisgICAgbmV3LT5jaGFuZ2VfY250PW5ldy0+dXNlX2NudD0wOworICAgIG5ldy0+Y2hhbmdlX2xpc3Q9bmV3LT51c2VfbGlzdD0wOworICAgIG5ldy0+bGluZT0wOworICAgIG5ldy0+ZmlsZT0wOworICAgIG5ldy0+cTEuYW09bmV3LT5xMi5hbT1uZXctPnouYW09MDsKKyAgICBpZighbGFzdF9pYyl7CisgICAgICAgIGZpcnN0X2ljPW5ldzsKKyAgICB9ZWxzZXsKKyAgICAgICAgbGFzdF9pYy0+bmV4dD1uZXc7CisgICAgfQorICAgIGxhc3RfaWM9bmV3OworfQorc3RydWN0IFZhciAqYWRkX3ZhcihjaGFyICpuYW1lLHN0cnVjdCBUeXAgKnQsaW50IHNjKQoreworICAgIHN0cnVjdCBWYXIgKnY9bXltYWxsb2Moc2l6ZW9mKCp2KSk7CisgICAgdi0+dnR5cD10OworICAgIHYtPnN0b3JhZ2VfY2xhc3M9c2M7CisgICAgdi0+cmVnPTA7CisgICAgdi0+aWRlbnRpZmllcj1uYW1lOworICAgIHYtPm9mZnNldD1tYXhfb2Zmc2V0OworICAgIGlmKHNjPT1BVVRPKSBtYXhfb2Zmc2V0PXptYWRkKG1heF9vZmZzZXQsc2l6ZXRhYlt0LT5mbGFncyZOUV0pOworICAgIHYtPnByaW9yaXR5PTE7CisgICAgdi0+ZmxhZ3M9MDsKKyAgICB2LT5uZXh0PWZ2OworICAgIHYtPmNsaXN0PTA7CisgICAgdi0+Zmk9MDsKKyAgICB2LT5pbmxpbmVfY29weT0wOworICAgIHYtPm5lc3Rpbmc9MTsKKyAgICBmdj12OworICAgIHJldHVybiB2OworfQorc3RydWN0IFZhciAqYWRkX3RtcF92YXIoc3RydWN0IFR5cCAqdCkKK3sKKyAgICByZXR1cm4gYWRkX3ZhcihlbXB0eSx0LEFVVE8pOworfQorc3RydWN0IFZhciAqZ2V0X3ZhcihjaGFyICpuYW1lKQoreworICAgIHN0cnVjdCBWYXIgKnY7Y2hhciAqYnVmOworICAgIHB1dHMoImdldHZhciIpOworICAgIGZvcih2PWZ2O3Y7dj12LT5uZXh0KXsKKyAgICAgICAgaWYoIXN0cmNtcChuYW1lLHYtPmlkZW50aWZpZXIpKSByZXR1cm4gdjsKKyAgICB9CisgICAgYnVmPW15bWFsbG9jKHN0cmxlbihuYW1lKSsxKTsKKyAgICBzdHJjcHkoYnVmLG5hbWUpOworICAgIHJldHVybiBhZGRfdmFyKGJ1ZiwmdGludCxBVVRPKTsKK30KKworY2hhciAqaWRlbnRpZmllcih2b2lkKQoreworICBzdGF0aWMgY2hhciBpZFsxMDI0XTsKKyAgY2hhciAqcz1pZDsKKyAgcHV0cygiaWRlbnRpZmllciIpOworICB3aGlsZShpc2FsbnVtKCpuZXh0KSkgKnMrKz0qbmV4dCsrOworICBwdXRzKCJkb25lIik7CisgIHJldHVybiBpZDsKK30KK3N0cnVjdCBvYmogc2NhbGFyKHZvaWQpCit7CisgIHN0cnVjdCBvYmogbzsKKyAgem1heCB2YWw7CisgIHB1dHMoInNjYWxhciIpOworICBpZihpc2RpZ2l0KCpuZXh0KSl7CisgICAgby5mbGFncz1LT05TVDsKKyAgICB2YWw9bDJ6bSgwTCk7CisgICAgd2hpbGUoaXNkaWdpdCgqbmV4dCkpeworICAgICAgdmFsPXptbXVsdCh2YWwsbDJ6bSgxMEwpKTsKKyAgICAgIHZhbD16bWFkZCh2YWwsbDJ6bSgobG9uZykoKm5leHQtJzAnKSkpOworICAgICAgbmV4dCsrOworICAgIH0KKyAgICBvLnZhbC52aW50PXptMnppKHZhbCk7CisgICAgcmV0dXJuIG87CisgIH0KKyAgaWYoKm5leHQ9PScoJyl7CisgICAgbmV4dCsrOworICAgIG89ZXhwcmVzc2lvbigpOworICAgIG5leHQrKzsKKyAgICByZXR1cm4gbzsKKyAgfQorICBvLmZsYWdzPVZBUjsKKyAgby52YWwudm1heD1sMnptKDBMKTsKKyAgby52PWdldF92YXIoaWRlbnRpZmllcigpKTsKKyAgcmV0dXJuIG87Cit9CitzdHJ1Y3Qgb2JqIGZhY3Rvcih2b2lkKQoreworICBzdHJ1Y3Qgb2JqIG87CisgIHN0cnVjdCBJQyAqbmV3OworICBwdXRzKCJmYWN0b3IiKTsKKyAgbz1zY2FsYXIoKTsKKyAgd2hpbGUoKm5leHQ9PScqJ3x8Km5leHQ9PScvJyl7CisgICAgbmV3PW5ld19JQygpOworICAgIGlmKCpuZXh0PT0nKicpIG5ldy0+Y29kZT1NVUxUOyBlbHNlIG5ldy0+Y29kZT1ESVY7CisgICAgbmV4dCsrOworICAgIG5ldy0+dHlwZj1JTlQ7CisgICAgbmV3LT5xMT1vOworICAgIG5ldy0+cTI9c2NhbGFyKCk7CisgICAgby5mbGFncz1WQVI7CisgICAgby52PWFkZF90bXBfdmFyKCZ0aW50KTsKKyAgICBvLnZhbC52bWF4PWwyem0oMEwpOworICAgIG5ldy0+ej1vOworICAgIGFkZF9JQyhuZXcpOworICB9CisgIHJldHVybiBvOworfQorc3RydWN0IG9iaiBleHByZXNzaW9uKHZvaWQpCit7CisgIHN0cnVjdCBvYmogbzsKKyAgc3RydWN0IElDICpuZXc7CisgIHB1dHMoImV4cHJlc3Npb24iKTsKKyAgbz1mYWN0b3IoKTsKKyAgd2hpbGUoKm5leHQ9PScrJ3x8Km5leHQ9PSctJyl7CisgICAgbmV3PW5ld19JQygpOworICAgIGlmKCpuZXh0PT0nKycpIG5ldy0+Y29kZT1BREQ7IGVsc2UgbmV3LT5jb2RlPVNVQjsKKyAgICBuZXh0Kys7CisgICAgbmV3LT50eXBmPUlOVDsKKyAgICBuZXctPnExPW87CisgICAgbmV3LT5xMj1mYWN0b3IoKTsKKyAgICBvLmZsYWdzPVZBUjsKKyAgICBvLnY9YWRkX3RtcF92YXIoJnRpbnQpOworICAgIG8udmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgbmV3LT56PW87CisgICAgYWRkX0lDKG5ldyk7CisgIH0KKyAgcmV0dXJuIG87Cit9Cit2b2lkIGNvbXBpbGUodm9pZCkKK3sKKyAgc3RydWN0IElDICpuZXc7CisgIGNoYXIgbGluZVsxMDI0XSwqczsKKyAgc3RydWN0IG9iaiBvLGxhc3Q7CisgIHB1dHMoImNvbXBpbGUiKTsKKyAgd2hpbGUoZmdldHMobGluZSwxMDIzLGZpbGUpKXsKKyAgICBuZXh0PWxpbmU7CisgICAgcz1pZGVudGlmaWVyKCk7CisgICAgaWYoKm5leHQ9PSc9Jyl7CisgICAgICBzdHJ1Y3QgVmFyICp2PWdldF92YXIocyk7CisgICAgICBuZXh0Kys7CisgICAgICBvPWV4cHJlc3Npb24oKTsKKyAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgIG5ldy0+Y29kZT1BU1NJR047CisgICAgICBuZXctPnR5cGY9SU5UOworICAgICAgbmV3LT5xMT1vOworICAgICAgbmV3LT56LmZsYWdzPVZBUjsKKyAgICAgIG5ldy0+ei52PXY7CisgICAgICBuZXctPnoudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICBuZXctPnEyLmZsYWdzPTA7CisgICAgICBuZXctPnEyLnZhbC52bWF4PXNpemV0YWJbSU5UXTsKKyAgICAgIGxhc3Q9bmV3LT56OworICAgICAgYWRkX0lDKG5ldyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgIH0KKyAgbmV3PW5ld19JQygpOworICBuZXctPmNvZGU9U0VUUkVUVVJOOworICBuZXctPnR5cGY9SU5UOworICBuZXctPnExPWxhc3Q7CisgIG5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CisgIG5ldy0+cTIudmFsLnZtYXg9c2l6ZXRhYltJTlRdOworICBuZXctPnoucmVnPWZyZXR1cm4oJnRpbnQpOworICBpZighbmV3LT56LnJlZykgcHV0cygicHJvYmxlbSEiKTsKKyAgYWRkX0lDKG5ldyk7Cit9Cit2b2lkIGVycm9yKGludCBuLC4uLikKK3sKKyAgICBwcmludGYoImVycm9yICVkXG4iLG4pOworICAgIHJhdXMoKTsKK30KK3ZvaWQgc2F2ZXNjcmF0Y2goKQore30KKworbWFpbihpbnQgYXJnYyxjaGFyICoqYXJndikKK3sKKyAgICBzdHJ1Y3QgVmFyICptYWluOworICAgIG1heF9vZmZzZXQ9bDJ6bSgwTCk7CisgICAgaWYoIWluaXRfY2coKSkgcmF1cygpOworICAgIHRpbnQuZmxhZ3M9SU5UOworICAgIHRpbnQubmV4dD0wOworICAgIG1mdW5jLmZsYWdzPUZVTktUOworICAgIG1mdW5jLm5leHQ9JnRpbnQ7CisgICAgbWZ1bmMuZXhhY3Q9Jm1zZDsKKyAgICBtYWluPWFkZF92YXIoIm1haW4iLCZtZnVuYyxFWFRFUk4pOworICAgIGZpbGU9Zm9wZW4oYXJndlsxXSwiciIpOworICAgIGlmKCFmaWxlKSB7cHJpbnRmKCJFcnJvciBvcGVuaW5nIGZpbGVcbiIpO3JhdXMoKTt9CisgICAgY29tcGlsZSgpOworICAgIHNjYW5mKCIlbGQiLCZvcHRmbGFncyk7CisgICAgcHJpYyhzdGRvdXQsZmlyc3RfaWMpOworICAgIHZsMT12bDM9MDsKKyAgICB2bDI9ZnY7CisgICAgb3B0aW1pemUob3B0ZmxhZ3MsbWFpbik7CisgICAgcHJpYyhzdGRvdXQsZmlyc3RfaWMpOworICAgIGdlbl9jb2RlKHN0ZG91dCxmaXJzdF9pYyxtYWluLG1heF9vZmZzZXQpOworICAgIHJhdXMoKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWluaWNvbXAuYyBiL21pbmljb21wLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWJmMjc0YgotLS0gL2Rldi9udWxsCisrKyBiL21pbmljb21wLmMKQEAgLTAsMCArMSw5MTMgQEAKKyNpbmNsdWRlICJtaW5pY29tcC5oIgorCisjZGVmaW5lIGNsb25lX3R5cGUgY2xvbmVfdHlwCisjZGVmaW5lIGZyZWVfdHlwZSBmcmVldHlwCisjZGVmaW5lIG5ld19pY29kZSBuZXdfSUMKKyNkZWZpbmUgYWRkX2ljb2RlIGFkZF9JQworI2RlZmluZSBmcmVlX2FsbF9pY29kZSgpIGZyZWVfSUMoZmlyc3RfaWMpCisjZGVmaW5lIGdldF9maXJzdF9pY29kZSgpIGZpcnN0X2ljCit0eXBlZGVmIHN0cnVjdCBJQyBpY29kZTsKKworc3RhdGljIGludCBlcnJvcnM7Cit2YXIgKnN0b3JlX2xvY2FsczsKKworc3RydWN0IHJwYWlyIHJwOworCitjaGFyICpjb3B5cmlnaHQ9Im1pbmljb21wL3ZiY2MgKGMpIGluIDIwMDIgVm9sa2VyIEJhcnRoZWxtYW5uIjsKK2NoYXIgKmlubmFtZSwqb3V0bmFtZTsKK3N0cnVjdCBzdHJ1Y3RfZGVjbGFyYXRpb24gKmZpcnN0X3NkOworc3RydWN0IFZhciAqZmlyc3RfZXh0LCptZXJrX3ZhcmY7CitjaGFyICoqdGFyZ2V0X21hY3JvczsKKworRklMRSAqb3V0OworCit2b2lkIHJhdXModm9pZCkKK3sKKyAgdmFyICp2OworICBmb3Iodj1maXJzdF92YXJbMF07djt2PXYtPm5leHQpCisgICAgaWYodi0+dHlwZS0+ZmxhZ3MhPUZVTkNUSU9OKXsKKyAgICAgIGdlbl9hbGlnbihvdXQsZmFsaWduKHYtPnR5cGUpKTsKKyAgICAgIGdlbl92YXJfaGVhZChvdXQsdi0+dmJjY3Zhcik7CisgICAgICBnZW5fZHMob3V0LHN6b2Yodi0+dHlwZSksdi0+dHlwZSk7CisgICAgfQorCisgIGNsZWFudXBfY2cob3V0KTsKKworICBpZihlcnJvcnM+MCkKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIGVsc2UKKyAgICBleGl0KEVYSVRfU1VDQ0VTUyk7Cit9CisKK21haW4oaW50IGFyZ2MsY2hhciAqKmFyZ3YpCit7CisgIGludCBpLGosZmxhZzsKKyAgdHlwZSAqbnQ7CisKKyAgZm9yKGk9MTtpPGFyZ2M7aSsrKXsKKyAgICBpZigqYXJndltpXSE9Jy0nKXsKKyAgICAgIGlmKGlubmFtZSkKKwllcnJvcigxOCwibXVsdGlwbGUgaW5wdXQgZmlsZXMiKTsKKyAgICAgIGlubmFtZT1hcmd2W2ldOworICAgIH1lbHNleworICAgICAgZmxhZz0wOworICAgICAgaWYoKCFzdHJjbXAoIi1vIixhcmd2W2ldKSkmJmk8YXJnYy0xKXsKKwlmbGFnPTE7CisJb3V0bmFtZT1hcmd2WysraV07CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZighc3RybmNtcCgiLWRlYnVnPSIsYXJndltpXSw3KSl7CisJZmxhZz0xOworCXNzY2FuZihhcmd2W2ldKzcsIiVkIiwmaik7CisJREVCVUc9ajsKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKCFzdHJuY21wKCItdW5yb2xsLXNpemU9Iixhcmd2W2ldLDEzKSl7CisJZmxhZz0xOworCXNzY2FuZihhcmd2W2ldKzEzLCIlZCIsJmopOworCXVucm9sbF9zaXplPWo7CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZighc3RybmNtcCgiLWlubGluZS1zaXplPSIsYXJndltpXSwxMykpeworCWZsYWc9MTsKKwlzc2NhbmYoYXJndltpXSsxMywiJWQiLCZqKTsKKwlpbmxpbmVfc2l6ZT1qOworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoIXN0cm5jbXAoIi1tYXhvcHRwYXNzZXM9Iixhcmd2W2ldLDE0KSl7CisJZmxhZz0xOworCXNzY2FuZihhcmd2W2ldKzE0LCIlZCIsJmopOworCW1heG9wdHBhc3Nlcz1qOworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgZm9yKGo9MDtqPE1BWEdGJiZmbGFnPT0wO2orKyl7CisgICAgICAgIHNpemVfdCBsOworICAgICAgICBpZighZ19mbGFnc19uYW1lW2pdKSBjb250aW51ZTsKKyAgICAgICAgbD1zdHJsZW4oZ19mbGFnc19uYW1lW2pdKTsKKyAgICAgICAgaWYobD4wJiYhc3RybmNtcChhcmd2W2ldKzEsZ19mbGFnc19uYW1lW2pdLGwpKXsKKyAgICAgICAgICBmbGFnPTE7CisgICAgICAgICAgaWYoKGdfZmxhZ3Nbal0mKFVTRURGTEFHfEZVTkNGTEFHKSk9PVVTRURGTEFHKXtlcnJvcigxOSwibXVsdGlwbGUgb3B0aW9uIik7YnJlYWs7fQorCSAgZ19mbGFnc1tqXXw9VVNFREZMQUc7CisgICAgICAgICAgaWYoZ19mbGFnc1tqXSZTVFJJTkdGTEFHKXsKKyAgICAgICAgICAgIGlmKGFyZ3ZbaV1bbCsxXSE9Jz0nKXtlcnJvcigyMSwic3RyaW5nIGV4cGVjdGVkIik7fQorICAgICAgICAgICAgaWYoYXJndltpXVtsKzJdfHxpPj1hcmdjLTEpCisgICAgICAgICAgICAgIGdfZmxhZ3NfdmFsW2pdLnA9JmFyZ3ZbaV1bbCsyXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZ19mbGFnc192YWxbal0ucD0mYXJndlsrK2ldWzBdOworICAgICAgICAgIH0KKyAgICAgICAgICBpZihnX2ZsYWdzW2pdJlZBTEZMQUcpeworICAgICAgICAgICAgaWYoYXJndltpXVtsKzFdIT0nPScpe2Vycm9yKDIwLCJ2YWx1ZSBleHBlY3RlZCIpO30KKyAgICAgICAgICAgIGlmKGFyZ3ZbaV1bbCsyXXx8aT49YXJnYy0xKQorICAgICAgICAgICAgICBnX2ZsYWdzX3ZhbFtqXS5sPWF0b2woJmFyZ3ZbaV1bbCsyXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGdfZmxhZ3NfdmFsW2pdLmw9YXRvbCgmYXJndlsrK2ldWzBdKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYoZ19mbGFnc1tqXSZGVU5DRkxBRykgZ19mbGFnc192YWxbal0uZigmYXJndltpXVtsKzFdKTsKKwl9CisgICAgICB9CisgICAgICBpZighZmxhZykgZXJyb3IoMjMsInVua25vd24gb3B0aW9uIik7CisgICAgfQorICB9CisKKyAgaWYoIWlubmFtZSkKKyAgICBlcnJvcigyMiwibm8gaW5wdXQgZmlsZSIpOworICBpbmZpbGU9Zm9wZW4oaW5uYW1lLCJyIik7CisgIGlmKCFpbmZpbGUpCisgICAgZXJyb3IoMTgsImNvdWxkIG5vdCBvcGVuIG91dHB1dCBmaWxlIik7CisgIGlmKCFvdXRuYW1lKQorICAgIGVycm9yKDIzLCJubyBvdXRwdXQgZmlsZSIpOworICBvdXQ9Zm9wZW4ob3V0bmFtZSwidyIpOworICBpZighb3V0KXsKKyAgICBlcnJvcigyNCwiY291bGQgbm90IG9wZW4gaW5wdXQgZmlsZSIpOworICB9CisgIG50PW5ld190eXBlKEZVTkNUSU9OKTsKKyAgbnQtPm5leHQ9bmV3X3R5cGUoSU5UKTsKKyAgYWRkX3ZhcigicmVhZEludCIsY2xvbmVfdHlwZShudCkpOworICBhZGRfdmFyKCJ3cml0ZUludCIsY2xvbmVfdHlwZShudCkpOworICBhZGRfdmFyKCJ3cml0ZUNoYXIiLGNsb25lX3R5cGUobnQpKTsKKyAgYWRkX3ZhcigicmVhZENoYXIiLGNsb25lX3R5cGUobnQpKTsKKyAgYWRkX3Zhcigid3JpdGVSZWFsIixudCk7CisgIG50PW5ld190eXBlKEZVTkNUSU9OKTsKKyAgbnQtPm5leHQ9bmV3X3R5cGUoUkVBTCk7CisgIGFkZF92YXIoInJlYWRSZWFsIixudCk7CisKKyAgc3RhY2thbGlnbj1sMnptKDBMKTsKKyAgaWYoIWluaXRfY2coKSkgZXhpdChFWElUX0ZBSUxVUkUpOworICBpZih6bWVxdG8oc3RhY2thbGlnbixsMnptKDBMKSkpCisgICAgc3RhY2thbGlnbj1tYXhhbGlnbjsgCisgIGZvcihpPTA7aTxFTUlUX0JVRl9ERVBUSDtpKyspCisgICAgZW1pdF9idWZmZXJbaV09bXltYWxsb2MoRU1JVF9CVUZfTEVOKTsKKyAgZW1pdF9wPWVtaXRfYnVmZmVyWzBdOworCisgIG11bHRpcGxlX2Njcz0wOworICBvcHRmbGFncz0tMTsKKyAgbWF4b3B0cGFzc2VzPTEwMDsKKworICB5eXBhcnNlKCk7CisKKyAgcmF1cygpOworfQorCit5eWVycm9yKGNoYXIgKnMpCit7CisgIGVycm9yKDEscyk7Cit9CisKK3ZvaWQgZXJyb3IoaW50IG4sLi4uKQoreworICBpZihuPT0xNzB8fG49PTE3MikgcmV0dXJuOworICBlcnJvcnMrKzsKKyAgZnByaW50ZihzdGRlcnIsImVycm9yICVkXG4iLG4pOworICByYXVzKCk7Cit9CisKK3ZvaWQgKmdldG1lbShzaXplX3QgcykKK3sKKyAgdm9pZCAqcD1tYWxsb2Mocyk7CisgIGlmKCFwKXsKKyAgICBlcnJvcigyLCJvdXQgb2YgbWVtb3J5Iik7CisgIH0KKyAgcmV0dXJuIHA7Cit9CisKKyNkZWZpbmUgTEFCRUxORVNUSU5HIDEwMjQKK3N0YXRpYyBpbnQgbGFiZWxzdGFja1tMQUJFTE5FU1RJTkddLGxhYmVsaWR4OworCit2b2lkIHB1c2hfaW50KGludCBsKQoreworICBsYWJlbHN0YWNrW2xhYmVsaWR4KytdPWw7Cit9CisKK2ludCBwb3BfaW50KCkKK3sKKyAgcmV0dXJuIGxhYmVsc3RhY2tbLS1sYWJlbGlkeF07Cit9CisKKyNkZWZpbmUgTkFNRU5FU1RJTkcgMTAyNAorc3RhdGljIGNoYXIgKm5hbWVzdGFja1tOQU1FTkVTVElOR10sbmFtZWlkeDsKKwordm9pZCBwdXNoX3B0cih2b2lkICpwdHIpCit7CisgIG5hbWVzdGFja1tuYW1laWR4KytdPXB0cjsKK30KKwordm9pZCAqcG9wX3B0cigpCit7CisgIHJldHVybiBuYW1lc3RhY2tbLS1uYW1laWR4XTsKK30KKworCitjaGFyICp0eXBlbmFtZVtdPXsiICAgICIsImludCIsInJlYWwiLCJhcnJheSIsImZ1bmN0aW9uIn07CisKKwordHlwZSAqbmV3X3R5cGUoaW50IHQpCit7CisgIHR5cGUgKm5ldz1uZXdfdHlwKCk7CisgIG5ldy0+ZmxhZ3M9dDsKKyAgbmV3LT5uZXh0PTA7CisgIHJldHVybiBuZXc7Cit9CisKK3R5cGUgKm5ld19hcnJheSh0eXBlICp0LG5vZGUgKnApCit7CisgIHR5cGUgKm5ldz1uZXdfdHlwKCk7CisgIHNpbXBsaWZ5X3RyZWUocCk7CisgIGlmKHAtPmZsYWdzIT1OTlVNQkVSKQorICAgIGVycm9yKDMsImFycmF5IHNpemUgbm90IGEgY29uc3RhbnQiKTsKKyAgaWYocC0+dHlwZS0+ZmxhZ3MhPUlOVCkKKyAgICBlcnJvcig0LCJhcnJheSBzaXplIG5vdCBhbiBpbnRlZ2VyIik7CisgIG5ldy0+ZmxhZ3M9QVJSQVk7CisgIG5ldy0+bmV4dD10OworICBuZXctPnNpemU9bDJ6bSgobG9uZylwLT5pdmFsdWUpOworICBmcmVlX3RyZWUocCk7CisgIHJldHVybiBuZXc7Cit9CisKK2ludCBuZXN0aW5nOworaW50IGxvY2FsX29mZnNldCxwYXJtX29mZnNldCxmcmFtZXNpemU7CisKKyNkZWZpbmUgTUFYTkVTVElORyAxMjgKK3ZhciAqZmlyc3RfdmFyWzEyOF07CisKK3ZvaWQgZnJlZV92YXJsaXN0KHZhciAqdikKK3sKKyAgdmFyICptOworICB3aGlsZSh2KXsKKyAgICBmcmVlX3Zhcih2LT52YmNjdmFyKTsKKyAgICBtPXYtPm5leHQ7CisgICAgZnJlZSh2KTsKKyAgICB2PW07CisgIH0KK30KKwordm9pZCBlbnRlcl9ibG9jaygpCit7CisgIG5lc3RpbmcrKzsKKyAgZmlyc3RfdmFyW25lc3RpbmddPTA7CisgIHB1c2hfaW50KGxvY2FsX29mZnNldCk7Cit9CisKK3ZvaWQgbGVhdmVfYmxvY2soKQoreworICBpZihmaXJzdF92YXJbbmVzdGluZ10peworICAgIHZhciAqcD1maXJzdF92YXJbbmVzdGluZ107CisgICAgd2hpbGUocC0+bmV4dCkKKyAgICAgIHA9cC0+bmV4dDsKKyAgICBwLT5uZXh0PXN0b3JlX2xvY2FsczsKKyAgICBwLT52YmNjdmFyLT5uZXh0PW1lcmtfdmFyZjsKKyAgICBzdG9yZV9sb2NhbHM9Zmlyc3RfdmFyW25lc3RpbmddOworICAgIG1lcmtfdmFyZj1zdG9yZV9sb2NhbHMtPnZiY2N2YXI7CisgIH0KKyAgbmVzdGluZy0tOworICBsb2NhbF9vZmZzZXQ9cG9wX2ludCgpOworfQorCit2b2lkIGdlbl9mdW5jKHZhciAqdixpY29kZSAqZmlyc3QsaW50IGZyYW1lc2l6ZSkKK3sKKyAgcHJpYyhzdGRvdXQsZ2V0X2ZpcnN0X2ljb2RlKCkpOworICB2bDE9Zmlyc3RfdmFyWzBdP2ZpcnN0X3ZhclswXS0+dmJjY3ZhcjowOworICB2bDI9Zmlyc3RfdmFyWzFdP2ZpcnN0X3ZhclsxXS0+dmJjY3ZhcjowOworICB2bDM9bWVya192YXJmOworICBvcHRpbWl6ZShvcHRmbGFncyx2LT52YmNjdmFyKTsKKyAgbWVtc2V0KHJlZ3NfbW9kaWZpZWQsMCxSU0laRSk7CisgIHByaWMoc3Rkb3V0LGdldF9maXJzdF9pY29kZSgpKTsKKyAgZ2VuX2NvZGUob3V0LGdldF9maXJzdF9pY29kZSgpLHYtPnZiY2N2YXIsbWF4X29mZnNldCk7Cit9CisKK3ZvaWQgZW50ZXJfZnVuYyhjaGFyICpuYW1lLHR5cGUgKnApCit7CisgIHR5cGUgKnQ9bmV3X3R5cGUoRlVOQ1RJT04pOworICB2YXIgKnY7CisgIHQtPm5leHQ9cDsKKyAgdC0+ZXhhY3Q9Z2V0bWVtKHNpemVvZigqdC0+ZXhhY3QpKTsKKyAgdC0+ZXhhY3QtPmNvdW50PTA7CisgIHY9YWRkX3ZhcihuYW1lLHQpOworICBsb2NhbF9vZmZzZXQ9cGFybV9vZmZzZXQ9ZnJhbWVzaXplPTA7CisgIHB1c2hfcHRyKHYpOworICBlbnRlcl9ibG9jaygpOworfQorCit2b2lkIGxlYXZlX2Z1bmMoKQoreworICBpY29kZSAqcCwqbWVyazsKKyAgbGVhdmVfYmxvY2soKTsKKyAgZ2VuX2Z1bmMocG9wX3B0cigpLGdldF9maXJzdF9pY29kZSgpLGZyYW1lc2l6ZSk7CisgIGZyZWVfYWxsX2ljb2RlKCk7CisgIGZpcnN0X2ljPWxhc3RfaWM9MDsKKyAgZnJlZV92YXJsaXN0KHN0b3JlX2xvY2Fscyk7CisgIG1lcmtfdmFyZj0wOworICBzdG9yZV9sb2NhbHM9MDsKK30KKwordmFyICpmaW5kX3ZhcihjaGFyICpwLGludCBtaW5uZXN0KQoreworICB2YXIgKnY7CisgIGludCBpOworCisgIGZvcihpPW5lc3Rpbmc7aT49bWlubmVzdDtpLS0peworICAgIGZvcih2PWZpcnN0X3ZhcltpXTt2O3Y9di0+bmV4dCkKKyAgICAgIGlmKCFzdHJjbXAodi0+bmFtZSxwKSkKKwlyZXR1cm4gdjsKKyAgfQorICByZXR1cm4gMDsKK30KKwordmFyICphZGRfdmFyKGNoYXIgKm5hbWUsdHlwZSAqdCkKK3sKKyAgdmFyICpuZXc9Z2V0bWVtKHNpemVvZigqbmV3KSk7CisgIHN0cnVjdCBWYXIgKnZ2OworICAvKkZJWE1FOiBhZGQgdmJjY3ZhciAqLyAgCisgIGlmKGZpbmRfdmFyKG5hbWUsbmVzdGluZykpCisgICAgZXJyb3IoNSwidmFyICVzIGFscmVhZHkgZGVmaW5lZCIsbmFtZSk7CisgIG5ldy0+bmVzdGluZz1uZXN0aW5nOworICBuZXctPm5hbWU9YWRkX3N0cmluZyhuYW1lKTsKKyAgbmV3LT50eXBlPXQ7CisgIGlmKCpuYW1lPT0wKXsKKyAgICBuZXctPm5leHQ9c3RvcmVfbG9jYWxzOworICB9ZWxzZXsKKyAgICBuZXctPm5leHQ9Zmlyc3RfdmFyW25lc3RpbmddOworICB9CisgIGlmKG5lc3Rpbmc9PTEpeworICAgIC8qIHBhcmFtZXRlciAqLworICAgIG5ldy0+b2Zmc2V0PXBhcm1fb2Zmc2V0OworICAgIHBhcm1fb2Zmc2V0Kz1zem9mKHQpOworICB9CisgIGlmKG5lc3Rpbmc+MSl7CisgICAgLyogbG9jYWwgdmFyaWFibGUgKi8KKyAgICBuZXctPm9mZnNldD1sb2NhbF9vZmZzZXQ7CisgICAgbG9jYWxfb2Zmc2V0Kz1zem9mKHQpOworICAgIGlmKGxvY2FsX29mZnNldD5mcmFtZXNpemUpCisgICAgICBmcmFtZXNpemU9bG9jYWxfb2Zmc2V0OworICB9ICAgIAorICAvKiBhdHRhY2ggdmJjYyB2YXJpYWJsZSAqLworICB2dj1uZXdfdmFyKCk7CisgIHZ2LT52dHlwPWNsb25lX3R5cChuZXctPnR5cGUpOworICB2di0+aWRlbnRpZmllcj1hZGRfc3RyaW5nKG5hbWUpOworICB2di0+bmVzdGluZz0oKm5hbWUhPTA/bmVzdGluZzoyKTsKKyAgdnYtPnN0b3JhZ2VfY2xhc3M9KHZ2LT5uZXN0aW5nPT0wP0VYVEVSTjpBVVRPKTsKKyAgaWYobmVzdGluZz09MSkKKyAgICB2di0+b2Zmc2V0PXptc3ViKGwyem0oMEwpLHptYWRkKG1heGFsaWduLGwyem0obmV3LT5vZmZzZXQpKSk7CisgIGVsc2UKKyAgICB2di0+b2Zmc2V0PWwyem0oKGxvbmcpbG9jYWxfb2Zmc2V0KTsKKyAgbmV3LT52YmNjdmFyPXZ2OworCisgIGlmKCpuYW1lPT0wKXsKKyAgICBzdG9yZV9sb2NhbHM9bmV3OworICAgIHZ2LT5uZXh0PW1lcmtfdmFyZjsKKyAgICBtZXJrX3ZhcmY9dnY7CisgIH1lbHNleworICAgIHZ2LT5uZXh0PWZpcnN0X3ZhcltuZXN0aW5nXT9maXJzdF92YXJbbmVzdGluZ10tPnZiY2N2YXI6MDsKKyAgICBmaXJzdF92YXJbbmVzdGluZ109bmV3OworICB9CisgIHJldHVybiBuZXc7Cit9CisKK3ZhciAqbmV3X3RlbXAoaW50IHRmbGFncykKK3sKKyAgY2hhciB0bmFtZVsxNl07CisgIHN0YXRpYyBpbnQgaXRtcHMscnRtcHMscHRtcHM7CisgIGlmKHRmbGFncz09SU5UKQorICAgIHNwcmludGYodG5hbWUsIlwwIGl0bXAlZCIsKytpdG1wcyk7CisgIGVsc2UgaWYodGZsYWdzPT1SRUFMKQorICAgIHNwcmludGYodG5hbWUsIlwwIHJ0bXAlZCIsKytydG1wcyk7CisgIGVsc2UgaWYodGZsYWdzPT1QT0lOVEVSKQorICAgIHNwcmludGYodG5hbWUsIlwwIHJ0bXAlZCIsKytwdG1wcyk7CisgIGVsc2UKKyAgICBlcnJvcigxNiwiaW50ZXJuYWwiKTsKKyAgcmV0dXJuIGFkZF92YXIodG5hbWUsbmV3X3R5cGUodGZsYWdzKSk7Cit9CisKK3N0cnVjdCBWYXIgKmFkZF90bXBfdmFyKHN0cnVjdCBUeXAgKnQpCit7CisgIAorICByZXR1cm4gbmV3X3RlbXAodC0+ZmxhZ3MpLT52YmNjdmFyOworfQorCitjaGFyICphZGRfc3RyaW5nKGNoYXIgKnMpCit7CisgIGNoYXIgKm5ldz1nZXRtZW0oc3RybGVuKHMpKzEpOworICBzdHJjcHkobmV3LHMpOworICByZXR1cm4gbmV3OworfQorCitjaGFyICpub2RlbmFtZVtdPXsKKyAgInZhciIsIm51bWJlciIsImFkZCIsIm11bCIsInN1YiIsImRpdiIsImluZGV4IiwiZXF1YWxzIiwKKyAgImx0IiwiZ3QiLCJsZXEiLCJnZXEiLCJuZXEiLCJhbmQiLCJvciIsCisgICJpbnQycmVhbCIsInJlYWwyaW50IiwiYXNzaWduIiwiY2FsbCIsImFyZ3VtZW50IgorfTsKKworbm9kZSAqbnVtYmVyX25vZGUodm9pZCkKK3sKKyAgbm9kZSAqbmV3PWdldG1lbShzaXplb2YoKm5ldykpOworICBuZXctPmZsYWdzPU5OVU1CRVI7CisgIGlmKHN0cnN0cih0a25hbWUsIi4iKSl7CisgICAgZG91YmxlIHJ2YWw7CisgICAgc3NjYW5mKHRrbmFtZSwiJWxmIiwmcnZhbCk7CisgICAgbmV3LT5ydmFsdWU9cnZhbDsKKyAgICBuZXctPnR5cGU9bmV3X3R5cGUoUkVBTCk7CisgICAgbmV3LT5sZWZ0PW5ldy0+cmlnaHQ9MDsKKyAgfWVsc2V7CisgICAgbmV3LT5pdmFsdWU9YXRvaSh0a25hbWUpOworICAgIG5ldy0+dHlwZT1uZXdfdHlwZShJTlQpOworICAgIG5ldy0+bGVmdD1uZXctPnJpZ2h0PTA7CisgIH0KKyAgcmV0dXJuIG5ldzsKK30KKworbm9kZSAqdmFyX25vZGUodm9pZCkKK3sKKyAgdmFyICp2PWZpbmRfdmFyKHRrbmFtZSwwKTsKKyAgbm9kZSAqbmV3OworICBpZighdil7CisgICAgZXJyb3IoNiwidW5rbm93biBpZGVudGlmaWVyOiAlcyIsdGtuYW1lKTsKKyAgfQorICBuZXc9Z2V0bWVtKHNpemVvZigqbmV3KSk7CisgIG5ldy0+ZmxhZ3M9TlZBUklBQkxFOworICBuZXctPnZhcj12OworICBuZXctPnR5cGU9Y2xvbmVfdHlwZSh2LT50eXBlKTsKKyAgbmV3LT5sZWZ0PW5ldy0+cmlnaHQ9MDsKKyAgcmV0dXJuIG5ldzsKK30KKworCitub2RlICpiaW5hcnlfbm9kZShlbnVtIG5vZGVmbGFncyBmbGFncyxub2RlICpsZWZ0LG5vZGUgKnJpZ2h0KQoreworICBub2RlICpuZXc9Z2V0bWVtKHNpemVvZigqbmV3KSk7CisgIG5ldy0+ZmxhZ3M9ZmxhZ3M7CisgIG5ldy0+bGVmdD1sZWZ0OworICBuZXctPnJpZ2h0PXJpZ2h0OworICBuZXctPnR5cGU9MDsKKyAgaWYoIWxlZnR8fChmbGFncyE9TkNBTEwmJiFyaWdodCkpCisgICAgZXJyb3IoNywiaW50ZXJuYWwgZXJyb3IiKTsKKyAgaWYoZmxhZ3M9PU5JTkRFWCl7CisgICAgaWYobGVmdC0+dHlwZS0+ZmxhZ3MhPUFSUkFZKQorICAgICAgZXJyb3IoOCwib3BlcmFuZCBvZiBbXSBtdXN0IGJlIGFycmF5Iik7CisgICAgbmV3LT50eXBlPWNsb25lX3R5cGUobGVmdC0+dHlwZS0+bmV4dCk7CisgIH1lbHNlIGlmKGZsYWdzPT1OQVJHKXsKKyAgICAvKiBub3RoaW5nIHRvIGRvPyAqLworICB9ZWxzZSBpZihmbGFncz09TkNBTEwpeworICAgIGlmKGxlZnQtPnR5cGUtPmZsYWdzIT1GVU5DVElPTikKKyAgICAgIGVycm9yKDksIm9ubHkgZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQiKTsKKyAgICBuZXctPnR5cGU9Y2xvbmVfdHlwZShsZWZ0LT50eXBlLT5uZXh0KTsKKyAgfWVsc2V7CisgICAgaWYobGVmdC0+dHlwZS0+ZmxhZ3M9PUFSUkFZfHxyaWdodC0+dHlwZS0+ZmxhZ3M9PUFSUkFZKQorICAgICAgZXJyb3IoMTAsImJvdGggb3BlcmFuZHMgbXVzdCBiZSByZWFsIG9yIGludCIpOworICAgIGlmKGxlZnQtPnR5cGUtPmZsYWdzPT1SRUFMfHxyaWdodC0+dHlwZS0+ZmxhZ3M9PVJFQUwpeworICAgICAgbmV3LT50eXBlPW5ld190eXBlKFJFQUwpOworICAgICAgaWYobGVmdC0+dHlwZS0+ZmxhZ3M9PUlOVCl7CisJbmV3LT5sZWZ0PWNvbnZfdHJlZShsZWZ0LFJFQUwpOworICAgICAgfQorICAgICAgaWYocmlnaHQtPnR5cGUtPmZsYWdzPT1JTlQpeworCW5ldy0+cmlnaHQ9Y29udl90cmVlKHJpZ2h0LFJFQUwpOworICAgICAgfSAgICAgIAorICAgIH1lbHNlCisgICAgICBuZXctPnR5cGU9bmV3X3R5cGUoSU5UKTsKKyAgfQorICByZXR1cm4gbmV3OworfQorCit2b2lkIHByaW50X3RyZWUobm9kZSAqcCkKK3sKKyAgcHJpbnRmKCIlcygiLG5vZGVuYW1lW3AtPmZsYWdzXSk7CisgIGlmKHAtPmxlZnQpCisgICAgcHJpbnRfdHJlZShwLT5sZWZ0KTsKKyAgaWYocC0+cmlnaHQpeworICAgIHByaW50ZigiLCIpOworICAgIHByaW50X3RyZWUocC0+cmlnaHQpOworICB9CisgIGlmKHAtPmZsYWdzPT1OTlVNQkVSKXsKKyAgICBpZihwLT50eXBlLT5mbGFncz09SU5UKQorICAgICAgcHJpbnRmKCIlZFtpbnRdIixwLT5pdmFsdWUpOworICAgIGVsc2UKKyAgICAgIHByaW50ZigiJWdbcmVhbF0iLHAtPnJ2YWx1ZSk7CisgIH0KKyAgaWYocC0+ZmxhZ3M9PU5WQVJJQUJMRSkKKyAgICBwcmludGYoIiVzWyVzXSIscC0+dmFyLT5uYW1lLHR5cGVuYW1lW3AtPnZhci0+dHlwZS0+ZmxhZ3NdKTsKKyAgcHJpbnRmKCIpIik7Cit9CisKK25vZGUgKmNvbnZfdHJlZShub2RlICpwLGludCB0ZmxhZ3MpCit7CisgIG5vZGUgKm5ldzsKKyAgaWYocC0+dHlwZS0+ZmxhZ3M9PXRmbGFncykKKyAgICByZXR1cm4gcDsKKyAgbmV3PWdldG1lbShzaXplb2YoKm5ldykpOworICBpZih0ZmxhZ3M9PVJFQUwpCisgICAgbmV3LT5mbGFncz1OSTJSOworICBlbHNlCisgICAgbmV3LT5mbGFncz1OUjJJOworICBuZXctPnR5cGU9bmV3X3R5cGUocC0+dHlwZS0+ZmxhZ3MpOworICBuZXctPmxlZnQ9cDsKKyAgbmV3LT5yaWdodD0wOworICByZXR1cm4gbmV3OworfQorCit2b2lkIGZyZWVfdHJlZShub2RlICpwKQoreworICBpZihwLT5sZWZ0KQorICAgIGZyZWVfdHJlZShwLT5sZWZ0KTsKKyAgaWYocC0+cmlnaHQpCisgICAgZnJlZV90cmVlKHAtPnJpZ2h0KTsKKyAgaWYocC0+dHlwZSkKKyAgICBmcmVlX3R5cGUocC0+dHlwZSk7CisgIGZyZWUocCk7Cit9CisKKworc3RhdGljIHZvaWQgY29uc3Rfbm9kZShub2RlICpwLGludCB2YWwpCit7CisgIHAtPmZsYWdzPU5OVU1CRVI7CisgIHAtPml2YWx1ZT12YWw7CisgIGlmKHAtPmxlZnQpCisgICAgZnJlZV90cmVlKHAtPmxlZnQpOworICBpZihwLT5yaWdodCkKKyAgICBmcmVlX3RyZWUocC0+cmlnaHQpOworICBwLT5sZWZ0PXAtPnJpZ2h0PTA7Cit9CisKK3ZvaWQgc2ltcGxpZnlfdHJlZShub2RlICpwKQoreworICBpZihwLT5sZWZ0KQorICAgIHNpbXBsaWZ5X3RyZWUocC0+bGVmdCk7CisgIGlmKHAtPnJpZ2h0KQorICAgIHNpbXBsaWZ5X3RyZWUocC0+cmlnaHQpOworICBpZihwLT50eXBlJiZwLT50eXBlLT5mbGFncz09SU5UJiZwLT5sZWZ0JiZwLT5sZWZ0LT5mbGFncz09Tk5VTUJFUiYmcC0+cmlnaHQmJnAtPnJpZ2h0LT5mbGFncz09Tk5VTUJFUil7CisgICAgc3dpdGNoKHAtPmZsYWdzKXsKKyAgICBjYXNlIE5BREQ6IGNvbnN0X25vZGUocCxwLT5sZWZ0LT5pdmFsdWUrcC0+cmlnaHQtPml2YWx1ZSk7IGJyZWFrOworICAgIGNhc2UgTk1VTDogY29uc3Rfbm9kZShwLHAtPmxlZnQtPml2YWx1ZSpwLT5yaWdodC0+aXZhbHVlKTsgYnJlYWs7CisgICAgY2FzZSBOU1VCOiBjb25zdF9ub2RlKHAscC0+bGVmdC0+aXZhbHVlLXAtPnJpZ2h0LT5pdmFsdWUpOyBicmVhazsKKyAgICBjYXNlIE5ESVY6IAorICAgICAgaWYocC0+cmlnaHQtPml2YWx1ZSE9MCkKKwljb25zdF9ub2RlKHAscC0+bGVmdC0+aXZhbHVlL3AtPnJpZ2h0LT5pdmFsdWUpOyBicmVhazsKKyAgICB9CisgIH0KK30KKwordm9pZCBhc3NpZ25fc3RhdGVtZW50KG5vZGUgKmxlZnQsbm9kZSAqcmlnaHQpCit7CisgIGlmKGxlZnQtPnR5cGUtPmZsYWdzPT1BUlJBWXx8cmlnaHQtPnR5cGUtPmZsYWdzPT1BUlJBWSkKKyAgICBlcnJvcigxMSwiYXJyYXkgdHlwZSBpbiBhc3NpZ25tZW50Iik7CisgIGlmKGxlZnQtPnR5cGUtPmZsYWdzPT1GVU5DVElPTnx8cmlnaHQtPnR5cGUtPmZsYWdzPT1GVU5DVElPTikKKyAgICBlcnJvcigxMiwiZnVuY3Rpb24gdHlwZSBpbiBhc3NpZ25tZW50Iik7CisKKyAgcmlnaHQ9Y29udl90cmVlKHJpZ2h0LGxlZnQtPnR5cGUtPmZsYWdzKTsKKyAgc2ltcGxpZnlfdHJlZShsZWZ0KTsKKyAgc2ltcGxpZnlfdHJlZShyaWdodCk7CisgIGlmKGxlZnQtPmZsYWdzPT1OSU5ERVgpeworICAgIGljb2RlICpuMSwqbjIsKm4zOworICAgIG4xPW5ld19pY29kZSgpOworICAgIG4xLT5jb2RlPU1VTFQ7CisgICAgbjEtPnR5cGY9SU5UOworICAgIG4xLT5xMT0qZ2VuX3RyZWUobGVmdC0+cmlnaHQpOworICAgIG4xLT5xMi5mbGFncz1LT05TVDsKKyAgICBuMS0+cTIudmFsLnZpbnQ9em0yemkoc2l6ZXRhYltJTlRdKTsKKyAgICBuMS0+ei5mbGFncz1WQVI7CisgICAgbjEtPnoudj1uZXdfdGVtcChJTlQpLT52YmNjdmFyOworICAgIG4xLT56LnZhbC52bWF4PWwyem0oMEwpOworICAgIG4yPW5ld19pY29kZSgpOworICAgIG4yLT5jb2RlPUFEREkyUDsKKyAgICBuMi0+dHlwZj1JTlQ7CisgICAgbjItPnR5cGYyPVBPSU5URVI7CisgICAgbjItPnExPSpnZW5fdHJlZShsZWZ0LT5sZWZ0KTsKKyAgICBuMi0+cTI9bjEtPno7CisgICAgbjItPnouZmxhZ3M9VkFSOworICAgIG4yLT56LnY9bmV3X3RlbXAoUE9JTlRFUiktPnZiY2N2YXI7CisgICAgbjItPnoudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgbjM9bmV3X2ljb2RlKCk7CisgICAgbjMtPmNvZGU9QVNTSUdOOworICAgIG4zLT50eXBmPWxlZnQtPnR5cGUtPmZsYWdzOworICAgIG4zLT5xMT0qZ2VuX3RyZWUocmlnaHQpOworICAgIG4zLT56PW4yLT56OworICAgIG4zLT56LmZsYWdzfD1EUkVGT0JKOworICAgIG4zLT56LmR0eXA9UE9JTlRFUjsKKyAgICBuMy0+cTIudmFsLnZtYXg9c3pvZihsZWZ0LT50eXBlKTsKKyAgICBhZGRfaWNvZGUobjEpOworICAgIGFkZF9pY29kZShuMik7CisgICAgYWRkX2ljb2RlKG4zKTsKKyNpZiAwICAgIAorICAgIC8qIGxlaWNodCBhbmRlcmVzIEZvcm1hdCAqLworICAgIG5ldy0+ZmxhZ3M9Q1NUT1JFOworICAgIG5ldy0+b3AxPSpnZW5fdHJlZShyaWdodCk7CisgICAgbmV3LT5vcDI9Kmdlbl90cmVlKGxlZnQtPmxlZnQpOworICAgIG5ldy0+ZGVzdD0qZ2VuX3RyZWUobGVmdC0+cmlnaHQpOworI2VuZGlmCisgIH1lbHNleworICAgIGljb2RlICpuZXc9bmV3X2ljb2RlKCk7CisgICAgbmV3LT5jb2RlPUFTU0lHTjsKKyAgICBuZXctPnExPSpnZW5fdHJlZShyaWdodCk7CisgICAgbmV3LT56PSpnZW5fdHJlZShsZWZ0KTsKKyAgICBuZXctPnEyLnZhbC52bWF4PXN6b2YobGVmdC0+dHlwZSk7CisgICAgbmV3LT50eXBmPWxlZnQtPnR5cGUtPmZsYWdzOworICAgIGFkZF9pY29kZShuZXcpOworICB9CisgIGZyZWVfdHJlZShsZWZ0KTsKKyAgZnJlZV90cmVlKHJpZ2h0KTsKK30KKwordm9pZCByZXR1cm5fc3RhdGVtZW50KG5vZGUgKnApCit7CisgIGljb2RlICpuZXc9bmV3X2ljb2RlKCk7CisgIHA9Y29udl90cmVlKHAsSU5UKTsgLypGSVhNRSovCisgIHNpbXBsaWZ5X3RyZWUocCk7CisgIG5ldy0+Y29kZT1TRVRSRVRVUk47CisgIG5ldy0+dHlwZj1wLT50eXBlLT5mbGFnczsKKyAgbmV3LT5xMT0qZ2VuX3RyZWUocCk7CisgIG5ldy0+ei5yZWc9ZnJldHVybihwLT50eXBlKTsKKyAgYWRkX2ljb2RlKG5ldyk7CisgIGZyZWVfdHJlZShwKTsKK30KKwordm9pZCB3aGlsZV9zdGF0ZW1lbnQobm9kZSAqcCkKK3sKKyAgaW50IGxvb3A9KytsYWJlbCxleGl0PSsrbGFiZWw7CisgIHNpbXBsaWZ5X3RyZWUocCk7CisgIGdlbl9jb25kKHAsbG9vcCxleGl0KTsKKyAgZ2VuX2xhYmVsKGxvb3ApOworICBsYXN0X2ljLT5mbGFnc3w9TE9PUF9DT05EX1RSVUU7CisgIHB1c2hfcHRyKHApOworICBwdXNoX2ludChsb29wKTsKKyAgcHVzaF9pbnQoZXhpdCk7CisjaWYgMAorICBnZW5fbGFiZWwobG9vcCk7CisgIGdlbl9jb25kKHAsc3RhcnQsZXhpdCk7CisgIGZyZWVfdHJlZShwKTsKKyAgZ2VuX2xhYmVsKHN0YXJ0KTsKKyAgcHVzaF9pbnQobG9vcCk7CisgIHB1c2hfaW50KGV4aXQpOworI2VuZGlmCit9CisKK3ZvaWQgd2hpbGVfZW5kKCkKK3sKKyAgaW50IGxvb3AsZXhpdDsKKyAgbm9kZSAqcDsKKyAgZXhpdD1wb3BfaW50KCk7CisgIGxvb3A9cG9wX2ludCgpOworICBwPXBvcF9wdHIoKTsKKyAgZ2VuX2NvbmQocCxsb29wLGV4aXQpOworICBnZW5fbGFiZWwoZXhpdCk7CisjaWYgMAorICBuZXc9bmV3X2ljb2RlKCk7CisgIG5ldy0+Y29kZT1CUkE7CisgIG5ldy0+dHlwZj1sb29wOworICBhZGRfaWNvZGUobmV3KTsKKyAgZ2VuX2xhYmVsKGV4aXQpOworI2VuZGlmCit9CisKK3ZvaWQgaWZfc3RhdGVtZW50KG5vZGUgKnApCit7CisgIGludCB0cnVlPSsrbGFiZWwsZmFsc2U9KytsYWJlbDsKKyAgc2ltcGxpZnlfdHJlZShwKTsKKyAgZ2VuX2NvbmQocCx0cnVlLGZhbHNlKTsKKyAgZnJlZV90cmVlKHApOworICBnZW5fbGFiZWwodHJ1ZSk7CisgIHB1c2hfaW50KGZhbHNlKTsKK30KKwordm9pZCBpZl9lbmQoKQoreworICBnZW5fbGFiZWwocG9wX2ludCgpKTsKK30KKwordm9pZCBpZl9lbHNlKCkKK3sKKyAgaW50IGVuZGxhYmVsPSsrbGFiZWw7CisgIGljb2RlICpuZXc9bmV3X2ljb2RlKCk7CisgIG5ldy0+Y29kZT1CUkE7CisgIG5ldy0+dHlwZj0rK2xhYmVsOworICBhZGRfaWNvZGUobmV3KTsKKyAgZ2VuX2xhYmVsKHBvcF9pbnQoKSk7CisgIHB1c2hfaW50KGxhYmVsKTsKK30KKworaW50IGxhYmVsOworCitvcGVyYW5kICpnZW5fdHJlZShub2RlICpwKQoreworICBpY29kZSAqbmV3OworICBzdGF0aWMgb3BlcmFuZCBvcDsKKworICBpZihwLT5mbGFncz09TlZBUklBQkxFKXsKKyAgICBpZihwLT52YXItPnR5cGUtPmZsYWdzPT1BUlJBWSl7CisgICAgICBpZihwLT52YXItPm5lc3Rpbmc9PTApeworCW9wLmZsYWdzPVZBUnxWQVJBRFI7CisJb3Audj1wLT52YXItPnZiY2N2YXI7CisJb3AudmFsLnZtYXg9bDJ6bSgwTCk7CisJcmV0dXJuICZvcDsKKyAgICAgIH1lbHNleworCWljb2RlICpuZXc9bmV3X2ljb2RlKCk7CisJbmV3LT5mbGFncz1BRERSRVNTOworCW5ldy0+cTEuZmxhZ3M9VkFSOworCW5ldy0+cTEudj1wLT52YXItPnZiY2N2YXI7CisJbmV3LT5xMS52YWwudm1heD1sMnptKDBMKTsKKwluZXctPnouZmxhZ3M9VkFSOworCW5ldy0+ei52PW5ld190ZW1wKFBPSU5URVIpLT52YmNjdmFyOworCW5ldy0+ei52YWwudm1heD1sMnptKDBMKTsKKwlhZGRfaWNvZGUobmV3KTsKKwlyZXR1cm4gJm5ldy0+ejsKKyAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgIG9wLmZsYWdzPVZBUjsKKyAgICAgIG9wLnY9cC0+dmFyLT52YmNjdmFyOworICAgICAgb3AudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICByZXR1cm4gJm9wOworICAgIH0KKyAgfQorCisgIGlmKHAtPmZsYWdzPT1OTlVNQkVSKXsKKyAgICBvcC5mbGFncz1LT05TVDsKKyAgICBpZihwLT50eXBlLT5mbGFncz09SU5UKQorICAgICAgb3AudmFsLnZpbnQ9cC0+aXZhbHVlOworICAgIGVsc2UKKyAgICAgIG9wLnZhbC52ZG91YmxlPXpsZDJ6ZChkMnpsZChwLT5ydmFsdWUpKTsKKyAgICByZXR1cm4gJm9wOworICB9CisKKyAgaWYocC0+ZmxhZ3M9PU5BRER8fHAtPmZsYWdzPT1OTVVMfHxwLT5mbGFncz09TlNVQnx8cC0+ZmxhZ3M9PU5ESVZ8fHAtPmZsYWdzPT1OSTJSfHxwLT5mbGFncz09TlIySSl7CisgICAgaW50IHR0eXA9cC0+dHlwZS0+ZmxhZ3M7CisgICAgbmV3PW5ld19pY29kZSgpOworICAgIHN3aXRjaChwLT5mbGFncyl7CisgICAgY2FzZSBOQUREOiBuZXctPmNvZGU9QUREO2JyZWFrOworICAgIGNhc2UgTk1VTDogbmV3LT5jb2RlPU1VTFQ7YnJlYWs7CisgICAgY2FzZSBOU1VCOiBuZXctPmNvZGU9U1VCO2JyZWFrOworICAgIGNhc2UgTkRJVjogbmV3LT5jb2RlPURJVjticmVhazsKKyAgICBjYXNlIE5JMlI6IG5ldy0+Y29kZT1DT05WRVJUO3R0eXA9UkVBTDtuZXctPnR5cGYyPUlOVDticmVhazsKKyAgICBjYXNlIE5SMkk6IG5ldy0+Y29kZT1DT05WRVJUO3R0eXA9SU5UO25ldy0+dHlwZjI9UkVBTDticmVhazsKKyAgICB9CisgICAgbmV3LT5xMT0qZ2VuX3RyZWUocC0+bGVmdCk7CisgICAgaWYocC0+cmlnaHQpCisgICAgICBuZXctPnEyPSpnZW5fdHJlZShwLT5yaWdodCk7CisgICAgbmV3LT56LmZsYWdzPVZBUjsKKyAgICBuZXctPnoudj1uZXdfdGVtcCh0dHlwKS0+dmJjY3ZhcjsKKyAgICBuZXctPnoudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgbmV3LT50eXBmPXR0eXA7CisgICAgYWRkX2ljb2RlKG5ldyk7CisgICAgcmV0dXJuICZuZXctPno7CisgIH0KKworICBpZihwLT5mbGFncz09TklOREVYKXsKKyAgICBpZihwLT50eXBlLT5mbGFncz09QVJSQVkpeworICAgICAgaWNvZGUgKm1lcmssKm5ldz1uZXdfaWNvZGUoKTsKKyAgICAgIG5ldy0+ZmxhZ3M9TVVMVDsKKyAgICAgIG5ldy0+dHlwZj1JTlQ7CisgICAgICBuZXctPnExPSpnZW5fdHJlZShwLT5yaWdodCk7CisgICAgICBuZXctPnEyLmZsYWdzPUtPTlNUOworICAgICAgbmV3LT5xMi52YWwudmludD1zem9mKHAtPnR5cGUpOworICAgICAgbmV3LT56LmZsYWdzPVZBUjsKKyAgICAgIG5ldy0+ei52PW5ld190ZW1wKElOVCktPnZiY2N2YXI7CisgICAgICBuZXctPnoudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICBhZGRfaWNvZGUobmV3KTsKKyAgICAgIG1lcms9bmV3OworICAgICAgbmV3PW5ld19pY29kZSgpOworICAgICAgbmV3LT5mbGFncz1BRERJMlA7CisgICAgICBuZXctPnR5cGY9SU5UOworICAgICAgbmV3LT50eXBmMj1QT0lOVEVSOworICAgICAgbmV3LT5xMT0qZ2VuX3RyZWUocC0+bGVmdCk7CisgICAgICBuZXctPnEyPW1lcmstPno7CisgICAgICBuZXctPnouZmxhZ3M9VkFSOworICAgICAgbmV3LT56LnY9bmV3X3RlbXAoUE9JTlRFUiktPnZiY2N2YXI7CisgICAgICBuZXctPnoudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICBvcD1uZXctPno7CisgICAgICBhZGRfaWNvZGUobmV3KTsKKyAgICAgIHJldHVybiAmbmV3LT56OworICAgIH1lbHNleworICAgICAgaWNvZGUgKm1lcmssKm5ldz1uZXdfaWNvZGUoKTsKKyAgICAgIG5ldy0+Y29kZT1NVUxUOworICAgICAgbmV3LT50eXBmPUlOVDsKKyAgICAgIG5ldy0+cTE9Kmdlbl90cmVlKHAtPnJpZ2h0KTsKKyAgICAgIG5ldy0+cTIuZmxhZ3M9S09OU1Q7CisgICAgICBuZXctPnEyLnZhbC52aW50PXptMnppKHNpemV0YWJbSU5UXSk7CisgICAgICBuZXctPnouZmxhZ3M9VkFSOworICAgICAgbmV3LT56LnY9bmV3X3RlbXAoSU5UKS0+dmJjY3ZhcjsKKyAgICAgIG5ldy0+ei52YWwudm1heD1sMnptKDBMKTsKKyAgICAgIGFkZF9pY29kZShuZXcpOworICAgICAgbWVyaz1uZXc7CisgICAgICBuZXc9bmV3X2ljb2RlKCk7CisgICAgICBuZXctPmNvZGU9QURESTJQOworICAgICAgbmV3LT5xMT0qZ2VuX3RyZWUocC0+bGVmdCk7CisgICAgICBuZXctPnEyPW1lcmstPno7CisgICAgICBuZXctPnR5cGY9SU5UOworICAgICAgbmV3LT50eXBmMj1QT0lOVEVSOworICAgICAgbmV3LT56LmZsYWdzPVZBUjsKKyAgICAgIG5ldy0+ei52PW5ld190ZW1wKFBPSU5URVIpLT52YmNjdmFyOworICAgICAgbmV3LT56LnZhbC52bWF4PWwyem0oMEwpOworICAgICAgb3A9bmV3LT56OworICAgICAgb3AuZmxhZ3N8PURSRUZPQko7CisgICAgICBvcC5kdHlwPVBPSU5URVI7CisgICAgICBhZGRfaWNvZGUobmV3KTsKKyAgICAgIHJldHVybiAmb3A7CisgICAgfQorICB9CisKKyAgaWYocC0+ZmxhZ3M9PU5DQUxMKXsKKyAgICBpY29kZSAqbmV3PW5ld19pY29kZSgpOworICAgIG5ldy0+Y29kZT1DQUxMOworICAgIG5ldy0+dHlwZj1GVU5LVDsKKyAgICBpZihwLT5yaWdodCkKKyAgICAgIG5ldy0+cTIudmFsLnZtYXg9bDJ6bShwdXNoX2FyZyhwLT5yaWdodCkpOworICAgIGVsc2UKKyAgICAgIG5ldy0+cTIudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgbmV3LT5xMT0qZ2VuX3RyZWUocC0+bGVmdCk7CisgICAgYWRkX2ljb2RlKG5ldyk7CisgICAgbmV3PW5ld19pY29kZSgpOworICAgIG5ldy0+Y29kZT1HRVRSRVRVUk47CisgICAgbmV3LT56LmZsYWdzPVZBUjsKKyAgICBuZXctPnR5cGY9cC0+dHlwZS0+ZmxhZ3M7CisgICAgbmV3LT56LnY9bmV3X3RlbXAocC0+dHlwZS0+ZmxhZ3MpLT52YmNjdmFyOworICAgIG5ldy0+ei52YWwudm1heD1sMnptKDBMKTsKKyAgICBuZXctPnExLnJlZz1mcmV0dXJuKHAtPnR5cGUpOworICAgIGFkZF9pY29kZShuZXcpOworICAgIHJldHVybiAmbmV3LT56OworICB9CisKKyAgZXJyb3IoMTMsIm9wZXJhdGlvbiBub3QgeWV0IHN1cHBvcnRlZCIpOworfQorCit2b2lkIGdlbl9sYWJlbChpbnQgbCkKK3sKKyAgaWNvZGUgKm5ldz1uZXdfaWNvZGUoKTsKKyAgbmV3LT5jb2RlPUxBQkVMOworICBuZXctPnR5cGY9bDsKKyAgYWRkX2ljb2RlKG5ldyk7Cit9CisKK3ZvaWQgZ2VuX2NvbmQobm9kZSAqcCxpbnQgdHJ1ZV9sYWJlbCxpbnQgZmFsc2VfbGFiZWwpCit7CisgIGljb2RlICpuZXc7CisgIGlmKHAtPmZsYWdzPT1OQU5EKXsKKyAgICBpbnQgdG1wPSsrbGFiZWw7CisgICAgZ2VuX2NvbmQocC0+bGVmdCx0bXAsZmFsc2VfbGFiZWwpOworICAgIGdlbl9sYWJlbCh0bXApOworICAgIGdlbl9jb25kKHAtPnJpZ2h0LHRydWVfbGFiZWwsZmFsc2VfbGFiZWwpOworICAgIHJldHVybjsKKyAgfQorICBpZihwLT5mbGFncz09Tk9SKXsKKyAgICBpbnQgdG1wPSsrbGFiZWw7CisgICAgZ2VuX2NvbmQocC0+bGVmdCx0cnVlX2xhYmVsLHRtcCk7CisgICAgZ2VuX2xhYmVsKHRtcCk7CisgICAgZ2VuX2NvbmQocC0+cmlnaHQsdHJ1ZV9sYWJlbCxmYWxzZV9sYWJlbCk7CisgICAgcmV0dXJuOworICB9CisgIG5ldz1uZXdfaWNvZGUoKTsKKyAgbmV3LT5jb2RlPUNPTVBBUkU7CisgIG5ldy0+dHlwZj1wLT50eXBlLT5mbGFnczsKKyAgbmV3LT5xMT0qZ2VuX3RyZWUocC0+bGVmdCk7CisgIG5ldy0+cTI9Kmdlbl90cmVlKHAtPnJpZ2h0KTsKKyAgYWRkX2ljb2RlKG5ldyk7CisgIG5ldz1uZXdfaWNvZGUoKTsKKyAgc3dpdGNoKHAtPmZsYWdzKXsKKyAgY2FzZSBORVFVQUxTOiBuZXctPmNvZGU9QkVRO2JyZWFrOworICBjYXNlIE5ORVE6IG5ldy0+Y29kZT1CTkU7YnJlYWs7CisgIGNhc2UgTkxUOiBuZXctPmNvZGU9QkxUO2JyZWFrOworICBjYXNlIE5HVDogbmV3LT5jb2RlPUJHVDticmVhazsKKyAgY2FzZSBOTEVROiBuZXctPmNvZGU9QkxFO2JyZWFrOworICBjYXNlIE5HRVE6IG5ldy0+Y29kZT1CR0U7YnJlYWs7CisgIGRlZmF1bHQ6IGVycm9yKDE0LCJpbnRlcm5hbCIpOworICB9CisgIG5ldy0+dHlwZj10cnVlX2xhYmVsOworICBhZGRfaWNvZGUobmV3KTsKKworICBuZXc9bmV3X2ljb2RlKCk7CisgIG5ldy0+Y29kZT1CUkE7CisgIG5ldy0+dHlwZj1mYWxzZV9sYWJlbDsKKyAgYWRkX2ljb2RlKG5ldyk7Cit9CisKK2ludCBwdXNoX2FyZyhub2RlICpwKQoreworICBpZihwLT5mbGFncz09TkFSRyl7CisgICAgaW50IHM7CisgICAgcz1wdXNoX2FyZyhwLT5yaWdodCk7CisgICAgcmV0dXJuIHMrcHVzaF9hcmcocC0+bGVmdCk7CisgIH1lbHNleworICAgIGljb2RlICpuZXc9bmV3X2ljb2RlKCk7CisgICAgaWYocC0+dHlwZS0+ZmxhZ3M9PUFSUkFZKQorICAgICAgZXJyb3IoMTUsImFycmF5cyBjYW5ub3QgYmUgcGFzc2VkIik7CisgICAgbmV3LT5jb2RlPVBVU0g7CisgICAgbmV3LT5xMi52YWwudm1heD1zem9mKHAtPnR5cGUpOworICAgIG5ldy0+ei52YWwudm1heD1uZXctPnEyLnZhbC52bWF4OworICAgIG5ldy0+dHlwZj1wLT50eXBlLT5mbGFnczsKKyAgICBuZXctPnExPSpnZW5fdHJlZShwKTsKKyAgICBhZGRfaWNvZGUobmV3KTsKKyAgICByZXR1cm4gc3pvZihwLT50eXBlKTsKKyAgfQorfQorCit2b2lkIGZyZWVfdmFyKHN0cnVjdCBWYXIgKnYpCit7CisgIGZyZWUodik7CisgIC8qRklYTUUqLworfQorCit2b2lkIGFkZF9JQyhpY29kZSAqbmV3KQoreworICBpZihsYXN0X2ljJiZuZXctPmNvZGU9PUFTU0lHTiYmbmV3LT5xMS5mbGFncz09VkFSJiZsYXN0X2ljLT56LmZsYWdzPT1WQVImJgorICAgICBuZXctPnExLnY9PWxhc3RfaWMtPnoudiYmem1lcXRvKG5ldy0+cTEudmFsLnZtYXgsbGFzdF9pYy0+ei52YWwudm1heCkmJgorICAgICAqbmV3LT5xMS52LT5pZGVudGlmaWVyPT0wKXsKKyAgICBsYXN0X2ljLT56PW5ldy0+ejsKKyAgICBmcmVlKG5ldyk7CisgICAgcmV0dXJuOworICB9CisgIGluc2VydF9JQyhsYXN0X2ljLG5ldyk7Cit9CmRpZmYgLS1naXQgYS9taW5pY29tcC5oIGIvbWluaWNvbXAuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNDdmMGY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWluaWNvbXAuaApAQCAtMCwwICsxLDkzIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAic3VwcC5oIgorCitleHRlcm4gRklMRSAqaW5maWxlOworI2RlZmluZSBNQVhMRU4gMTAyNAorZXh0ZXJuIGNoYXIgdGtuYW1lW01BWExFTl07CitleHRlcm4gaW50IGxhYmVsOworZXh0ZXJuIGludCBuZXN0aW5nOworZXh0ZXJuIGludCBsb2NhbF9vZmZzZXQscGFybV9vZmZzZXQsZnJhbWVzaXplOworCisjZGVmaW5lIFJFQUwgRE9VQkxFCisjZGVmaW5lIEZVTkNUSU9OIEZVTktUCisKKyNkZWZpbmUgWVlFUlJPUl9WRVJCT1NFIDEKKworZW51bSBub2RlZmxhZ3MgeworICBOVkFSSUFCTEUsTk5VTUJFUixOQURELE5NVUwsTlNVQixORElWLE5JTkRFWCwKKyAgTkVRVUFMUyxOTFQsTkdULE5MRVEsTkdFUSxOTkVRLE5BTkQsTk9SLAorICBOSTJSLE5SMkksTkFTU0dOLE5DQUxMLE5BUkcKK307CisKK2V4dGVybiBjaGFyICpub2RlbmFtZVtdOworCit0eXBlZGVmIHN0cnVjdCBUeXAgdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3Qgb2JqIG9wZXJhbmQ7CisKK3R5cGVkZWYgc3RydWN0IHZhciB7CisgIGludCBuZXN0aW5nOworICBjaGFyICpuYW1lOworICBzdHJ1Y3QgVHlwICp0eXBlOworICBzdHJ1Y3QgdmFyICpuZXh0OworICBpbnQgb2Zmc2V0OworICBzdHJ1Y3QgVmFyICp2YmNjdmFyOworfSB2YXI7CisKKyNkZWZpbmUgTUFYTkVTVElORyAxMjgKK2V4dGVybiB2YXIgKmZpcnN0X3ZhclsxMjhdOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBmbGFnczsKKyAgY2hhciAqbmFtZTsKK30gKnN0eXBlOworCit0eXBlZGVmIHN0cnVjdCBtbm9kZSB7CisgIGVudW0gbm9kZWZsYWdzIGZsYWdzOworICBzdHJ1Y3QgbW5vZGUgKmxlZnQsKnJpZ2h0OworICB0eXBlICp0eXBlOworICB2YXIgKnZhcjsKKyAgaW50IGl2YWx1ZTsKKyAgZG91YmxlIHJ2YWx1ZTsKK30gbm9kZTsKKwordm9pZCBlbnRlcl9ibG9jayh2b2lkKTsKK3ZvaWQgbGVhdmVfYmxvY2sodm9pZCk7Cit2b2lkIGVudGVyX2Z1bmMoY2hhciAqLHR5cGUgKik7Cit2b2lkIGxlYXZlX2Z1bmModm9pZCk7Cit2YXIgKmZpbmRfdmFyKGNoYXIgKixpbnQpOwordmFyICphZGRfdmFyKGNoYXIgKix0eXBlICopOwordmFyICpuZXdfdGVtcChpbnQpOworY2hhciAqYWRkX3N0cmluZyhjaGFyICopOwordm9pZCBlcnJvcihpbnQsLi4uKTsKK3ZvaWQgKmdldG1lbShzaXplX3QpOworbm9kZSAqbnVtYmVyX25vZGUodm9pZCk7Citub2RlICp2YXJfbm9kZSh2b2lkKTsKK25vZGUgKmNvbnZfdHJlZShub2RlICosaW50KTsKK25vZGUgKmJpbmFyeV9ub2RlKGVudW0gbm9kZWZsYWdzLG5vZGUgKixub2RlICopOwordm9pZCBwcmludF90cmVlKG5vZGUgKik7Cit2b2lkIHNpbXBsaWZ5X3RyZWUobm9kZSAqKTsKK3ZvaWQgZnJlZV90cmVlKG5vZGUgKik7Cit0eXBlICpuZXdfdHlwZShpbnQpOwordHlwZSAqbmV3X2FycmF5KHR5cGUgKixub2RlICopOwordm9pZCByZXR1cm5fc3RhdGVtZW50KG5vZGUgKik7Cit2b2lkIHdoaWxlX3N0YXRlbWVudChub2RlICopOwordm9pZCB3aGlsZV9lbmQodm9pZCk7Cit2b2lkIGlmX3N0YXRlbWVudChub2RlICopOwordm9pZCBpZl9lbmQodm9pZCk7Cit2b2lkIGlmX2Vsc2Uodm9pZCk7Cit2b2lkIGFzc2lnbl9zdGF0ZW1lbnQobm9kZSAqLG5vZGUgKik7Cit2b2lkIHB1c2hfaW50KGludCk7CitpbnQgcG9wX2ludCh2b2lkKTsKK3ZvaWQgcHVzaF9uYW1lKGNoYXIgKik7CitjaGFyICpwb3BfbmFtZSh2b2lkKTsKK29wZXJhbmQgKmdlbl90cmVlKG5vZGUgKik7Cit2b2lkIGdlbl9jb25kKG5vZGUgKixpbnQsaW50KTsKK3ZvaWQgZ2VuX2xhYmVsKGludCk7CitpbnQgcHVzaF9hcmcobm9kZSAqKTsKK3ZvaWQgZ2VuX2dsb2JhbChjaGFyICosaW50KTsKZGlmZiAtLWdpdCBhL21pbmljb21wLnRhYi5jIGIvbWluaWNvbXAudGFiLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjUwZGU5OQotLS0gL2Rldi9udWxsCisrKyBiL21pbmljb21wLnRhYi5jCkBAIC0wLDAgKzEsMTE4OSBAQAorCisvKiAgQSBCaXNvbiBwYXJzZXIsIG1hZGUgZnJvbSBtaW5pY29tcC55CisgYnkgIEdOVSBCaXNvbiB2ZXJzaW9uIDEuMjcKKyAgKi8KKworI2RlZmluZSBZWUJJU09OIDEgIC8qIElkZW50aWZ5IEJpc29uIG91dHB1dC4gICovCisKKyNkZWZpbmUJVEtOVU1CRVIJMjU3CisjZGVmaW5lCVRLSURFTlRJRklFUgkyNTgKKyNkZWZpbmUJVEtSRUFMCTI1OQorI2RlZmluZQlUS0lOVAkyNjAKKyNkZWZpbmUJVEtMRVEJMjYxCisjZGVmaW5lCVRLR0VRCTI2MgorI2RlZmluZQlUS05FUQkyNjMKKyNkZWZpbmUJVEtJRgkyNjQKKyNkZWZpbmUJVEtFTFNFCTI2NQorI2RlZmluZQlUS1dISUxFCTI2NgorI2RlZmluZQlUS1JFVFVSTgkyNjcKKyNkZWZpbmUJVEtBU1NJR04JMjY4CisjZGVmaW5lCVRLQU5ECTI2OQorI2RlZmluZQlUS09SCTI3MAorCisjbGluZSAxOCAibWluaWNvbXAueSIKKworI2luY2x1ZGUgIm1pbmljb21wLmgiCisKK3R5cGVkZWYgdm9pZCAqdm9pZHB0cjsKKyNkZWZpbmUgWVlTVFlQRSB2b2lkcHRyCisjaWZuZGVmIFlZU1RZUEUKKyNkZWZpbmUgWVlTVFlQRSBpbnQKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgX19TVERDX18KKyNkZWZpbmUgY29uc3QKKyNlbmRpZgorI2VuZGlmCisKKworCisjZGVmaW5lCVlZRklOQUwJCTEyMworI2RlZmluZQlZWUZMQUcJCS0zMjc2OAorI2RlZmluZQlZWU5UQkFTRQkzMgorCisjZGVmaW5lIFlZVFJBTlNMQVRFKHgpICgodW5zaWduZWQpKHgpIDw9IDI3MCA/IHl5dHJhbnNsYXRlW3hdIDogNjQpCisKK3N0YXRpYyBjb25zdCBjaGFyIHl5dHJhbnNsYXRlW10gPSB7ICAgICAwLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgIDIzLAorICAgIDI0LCAgICAyNywgICAgMjUsICAgIDI5LCAgICAyNiwgICAgIDIsICAgIDI4LCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgMTksICAgIDIxLAorICAgIDIwLCAgICAyMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgIDE3LCAgICAgMiwgICAgMTgsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgMzAsICAgICAyLCAgICAzMSwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LAorICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2Cit9OworCisjaWYgWVlERUJVRyAhPSAwCitzdGF0aWMgY29uc3Qgc2hvcnQgeXlwcmhzW10gPSB7ICAgICAwLAorICAgICAwLCAgICAgMywgICAgIDUsICAgICA3LCAgICAgOSwgICAgMTEsICAgIDEzLCAgICAxOCwgICAgMjEsICAgIDIzLAorICAgIDI3LCAgICAyOSwgICAgMzMsICAgIDM3LCAgICAzOSwgICAgNDMsICAgIDQ3LCAgICA1MSwgICAgNTUsICAgIDU5LAorICAgIDYzLCAgICA2NywgICAgNzEsICAgIDc1LCAgICA3NywgICAgODEsICAgIDg1LCAgICA4NywgICAgOTEsICAgIDkzLAorICAgIDk4LCAgIDEwMiwgICAxMDQsICAgMTA5LCAgIDExMSwgICAxMTMsICAgMTE3LCAgIDExOSwgICAxMjIsICAgMTI0LAorICAgMTI2LCAgIDEyOCwgICAxMzAsICAgMTMyLCAgIDEzNCwgICAxMzUsICAgMTM5LCAgIDE0MywgICAxNDYsICAgMTQ5LAorICAgMTUxLCAgIDE1MiwgICAxNjAsICAgMTYxLCAgIDE2MiwgICAxNjYsICAgMTY3LCAgIDE3NCwgICAxNzksICAgMTgzLAorICAgMTg2LCAgIDE5MCwgICAxOTQsICAgMTk3LCAgIDIwMSwgICAyMDMKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXJoc1tdID0geyAgICAzMiwKKyAgICAzMywgICAgIDAsICAgIDMzLCAgICAgMCwgICAgNTksICAgICAwLCAgICAzNiwgICAgIDAsICAgICA1LCAgICAgMCwKKyAgICAgNiwgICAgIDAsICAgIDM0LCAgICAxNywgICAgNDAsICAgIDE4LCAgICAgMCwgICAgMzUsICAgIDM2LCAgICAgMCwKKyAgICAzNiwgICAgIDAsICAgIDM0LCAgICAzNywgICAgMTksICAgICAwLCAgICAgNCwgICAgIDAsICAgIDM4LCAgICAxNSwKKyAgICAzOSwgICAgIDAsICAgIDM4LCAgICAxNiwgICAgMzksICAgICAwLCAgICAzOSwgICAgIDAsICAgIDQwLCAgICAyMCwKKyAgICA0MCwgICAgIDAsICAgIDQwLCAgICAgOSwgICAgNDAsICAgICAwLCAgICA0MCwgICAgMjEsICAgIDQwLCAgICAgMCwKKyAgICA0MCwgICAgMjIsICAgIDQwLCAgICAgMCwgICAgNDAsICAgICA3LCAgICA0MCwgICAgIDAsICAgIDQwLCAgICAgOCwKKyAgICA0MCwgICAgIDAsICAgIDIzLCAgICAzOCwgICAgMjQsICAgICAwLCAgICA0MCwgICAgMjUsICAgIDQxLCAgICAgMCwKKyAgICA0MCwgICAgMjYsICAgIDQxLCAgICAgMCwgICAgNDEsICAgICAwLCAgICA0MSwgICAgMjcsICAgIDQyLCAgICAgMCwKKyAgICA0MSwgICAgMjgsICAgIDQyLCAgICAgMCwgICAgNDIsICAgICAwLCAgICAyMywgICAgNDAsICAgIDI0LCAgICAgMCwKKyAgICAgMywgICAgIDAsICAgIDQ0LCAgICAyMywgICAgNDUsICAgIDI0LCAgICAgMCwgICAgNDQsICAgIDIzLCAgICAyNCwKKyAgICAgMCwgICAgNDMsICAgICAwLCAgICA0MiwgICAgMTcsICAgIDQwLCAgICAxOCwgICAgIDAsICAgIDQ0LCAgICAgMCwKKyAgICAgNCwgICAgIDAsICAgIDQ1LCAgICAyOSwgICAgNDAsICAgICAwLCAgICA0MCwgICAgIDAsICAgIDQ2LCAgICA0NywKKyAgICAgMCwgICAgNDcsICAgICAwLCAgICA1MSwgICAgIDAsICAgIDU1LCAgICAgMCwgICAgNTcsICAgICAwLCAgICA1OCwKKyAgICAgMCwgICAgNDgsICAgICAwLCAgICAgMCwgICAgMzAsICAgIDQ5LCAgICA1MCwgICAgIDAsICAgIDM1LCAgICA0NiwKKyAgICAzMSwgICAgIDAsICAgIDQ2LCAgICAzMSwgICAgIDAsICAgIDM1LCAgICAzMSwgICAgIDAsICAgIDMxLCAgICAgMCwKKyAgICAgMCwgICAgMTAsICAgIDIzLCAgICAzOCwgICAgMjQsICAgIDUyLCAgICA0OCwgICAgNTMsICAgICAwLCAgICAgMCwKKyAgICAgMCwgICAgMTEsICAgIDU0LCAgICA0OCwgICAgIDAsICAgICAwLCAgICAxMiwgICAgMjMsICAgIDM4LCAgICAyNCwKKyAgICA1NiwgICAgNDgsICAgICAwLCAgICA0MywgICAgMTQsICAgIDQwLCAgICAxOSwgICAgIDAsICAgIDEzLCAgICA0MCwKKyAgICAxOSwgICAgIDAsICAgIDYwLCAgICA2MSwgICAgIDAsICAgIDM0LCAgICAzNywgICAgMjMsICAgICAwLCAgICA2MiwKKyAgICAyNCwgICAgNDgsICAgICAwLCAgICAyNCwgICAgNDgsICAgICAwLCAgICA2MiwgICAgMjksICAgIDYzLCAgICAgMCwKKyAgICA2MywgICAgIDAsICAgIDM0LCAgICAzNywgICAgIDAKK307CisKKyNlbmRpZgorCisjaWYgWVlERUJVRyAhPSAwCitzdGF0aWMgY29uc3Qgc2hvcnQgeXlybGluZVtdID0geyAwLAorICAgIDI3LCAgICAyOSwgICAgMzIsICAgIDM0LCAgICAzNywgICAgMzksICAgIDQwLCAgICA0MywgICAgNDUsICAgIDQ4LAorICAgIDUyLCAgICA1NiwgICAgNTgsICAgIDU5LCAgICA2MiwgICAgNjQsICAgIDY1LCAgICA2NiwgICAgNjcsICAgIDY4LAorICAgIDY5LCAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NywgICAgNzgsICAgIDc5LCAgICA4MiwgICAgODQsICAgIDg1LAorICAgIDg2LCAgICA4NywgICAgOTAsICAgIDkyLCAgICA5NSwgICAgOTksICAgMTAxLCAgIDEwNCwgICAxMDYsICAgMTA5LAorICAgMTExLCAgIDExMiwgICAxMTMsICAgMTE0LCAgIDExNywgICAxMTksICAgMTIxLCAgIDEyMywgICAxMjQsICAgMTI1LAorICAgMTI5LCAgIDEzMCwgICAxMzMsICAgMTM1LCAgIDEzNSwgICAxMzksICAgMTQwLCAgIDE0MywgICAxNDcsICAgMTUxLAorICAgMTU1LCAgIDE1OSwgICAxNjEsICAgMTY0LCAgIDE2NiwgICAxNjkKK307CisjZW5kaWYKKworCisjaWYgWVlERUJVRyAhPSAwIHx8IGRlZmluZWQgKFlZRVJST1JfVkVSQk9TRSkKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB5eXRuYW1lW10gPSB7ICAgIiQiLCJlcnJvciIsIiR1bmRlZmluZWQuIiwiVEtOVU1CRVIiLAorIlRLSURFTlRJRklFUiIsIlRLUkVBTCIsIlRLSU5UIiwiVEtMRVEiLCJUS0dFUSIsIlRLTkVRIiwiVEtJRiIsIlRLRUxTRSIsIlRLV0hJTEUiLAorIlRLUkVUVVJOIiwiVEtBU1NJR04iLCJUS0FORCIsIlRLT1IiLCInWyciLCInXSciLCInOyciLCInPSciLCInPCciLCInPiciLCInKCciLAorIicpJyIsIicrJyIsIictJyIsIicqJyIsIicvJyIsIicsJyIsIid7JyIsIid9JyIsImdsb2JfZGVjbF9saXN0IiwiZ2xvYl9kZWNsIiwKKyJ0eXBlIiwiZGVjbF9saXN0IiwiZGVjbCIsImRlY2xfaWQiLCJjb25kX2V4cHIiLCJhb19leHByIiwiYXJpdGhfZXhwciIsInRlcm0iLAorImZhY3RvciIsImx2YWx1ZSIsInZhcmlhYmxlIiwiYXJnX2xpc3QiLCJzdG10X2xpc3QiLCJzdG10IiwiYmxvY2siLCJAMSIsImJsb2NrX2VuZCIsCisiaWZfc3RtdCIsIkAyIiwiZWxzZV9wYXJ0IiwiQDMiLCJ3aGlsZV9zdG10IiwiQDQiLCJhc3Nnbl9zdG10IiwicmV0dXJuX3N0bXQiLAorImZ1bmNfZGVjbCIsImZ1bmNfZGVjbF9iZWdpbiIsImZ1bmNfZGVjbF9lbmQiLCJwYXJfbGlzdCIsInBhcl9kZWNsIiwgTlVMTAorfTsKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc2hvcnQgeXlyMVtdID0geyAgICAgMCwKKyAgICAzMiwgICAgMzIsICAgIDMzLCAgICAzMywgICAgMzQsICAgIDM0LCAgICAzNCwgICAgMzUsICAgIDM1LCAgICAzNiwKKyAgICAzNywgICAgMzgsICAgIDM4LCAgICAzOCwgICAgMzksICAgIDM5LCAgICAzOSwgICAgMzksICAgIDM5LCAgICAzOSwKKyAgICAzOSwgICAgNDAsICAgIDQwLCAgICA0MCwgICAgNDEsICAgIDQxLCAgICA0MSwgICAgNDIsICAgIDQyLCAgICA0MiwKKyAgICA0MiwgICAgNDIsICAgIDQzLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NSwgICAgNDYsICAgIDQ2LCAgICA0NywKKyAgICA0NywgICAgNDcsICAgIDQ3LCAgICA0NywgICAgNDksICAgIDQ4LCAgICA1MCwgICAgNTAsICAgIDUwLCAgICA1MCwKKyAgICA1MiwgICAgNTEsICAgIDUzLCAgICA1NCwgICAgNTMsICAgIDU2LCAgICA1NSwgICAgNTcsICAgIDU4LCAgICA1OSwKKyAgICA2MCwgICAgNjEsICAgIDYxLCAgICA2MiwgICAgNjIsICAgIDYzCit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgeXlyMltdID0geyAgICAgMCwKKyAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgNCwgICAgIDIsICAgICAxLCAgICAgMywKKyAgICAgMSwgICAgIDMsICAgICAzLCAgICAgMSwgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywKKyAgICAgMywgICAgIDMsICAgICAzLCAgICAgMSwgICAgIDMsICAgICAzLCAgICAgMSwgICAgIDMsICAgICAxLCAgICAgNCwKKyAgICAgMywgICAgIDEsICAgICA0LCAgICAgMSwgICAgIDEsICAgICAzLCAgICAgMSwgICAgIDIsICAgICAxLCAgICAgMSwKKyAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDAsICAgICAzLCAgICAgMywgICAgIDIsICAgICAyLCAgICAgMSwKKyAgICAgMCwgICAgIDcsICAgICAwLCAgICAgMCwgICAgIDMsICAgICAwLCAgICAgNiwgICAgIDQsICAgICAzLCAgICAgMiwKKyAgICAgMywgICAgIDMsICAgICAyLCAgICAgMywgICAgIDEsICAgICAyCit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgeXlkZWZhY3RbXSA9IHsgICAgIDAsCisgICAgIDUsICAgICA2LCAgICAgMCwgICAgIDIsICAgICAwLCAgICAgNCwgICAgIDMsICAgICAwLCAgICAgMSwgICAgMTEsCisgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDYwLCAgICAgMCwgICAgNjUsICAgIDI5LCAgICAzNSwgICAgIDAsCisgICAgIDAsICAgIDI0LCAgICAyNywgICAgMzIsICAgIDM0LCAgICAxMCwgICAgNjEsICAgIDQ1LCAgICA2MywgICAgNjYsCisgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDcsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgIDAsICAgIDYyLCAgICA2NCwgICAgMjgsICAgIDIyLCAgICAyMywgICAgMjUsICAgIDI2LCAgICAgMCwgICAgMzEsCisgICAgMzcsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA1MCwgICAgIDAsICAgICAwLCAgICAgOSwgICAgIDAsCisgICAgMzIsICAgICAwLCAgICAzOSwgICAgNDQsICAgIDQ2LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgMzMsCisgICAgMzAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgNDksICAgICA4LCAgICAgMCwgICAgIDAsCisgICAgNDgsICAgIDM4LCAgICAzNiwgICAgIDAsICAgICAwLCAgICAxNCwgICAgIDAsICAgICAwLCAgICA1OSwgICAgNDcsCisgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA1MSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgIDAsICAgICAwLCAgICA1NiwgICAgNTgsICAgIDIxLCAgICAxMiwgICAgMTMsICAgICAwLCAgICAxOSwgICAgMjAsCisgICAgMTYsICAgIDE1LCAgICAxNywgICAgMTgsICAgICAwLCAgICA1MywgICAgNTcsICAgIDU0LCAgICA1MiwgICAgIDAsCisgICAgNTUsICAgICAwLCAgICAgMAorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHl5ZGVmZ290b1tdID0geyAgICAgMywKKyAgICAgNCwgICAgIDUsICAgIDU4LCAgICAgNiwgICAgMTIsICAgIDg1LCAgICA4NiwgICAgODcsICAgIDIyLCAgICAyMywKKyAgICAyNCwgICAgMjUsICAgIDUyLCAgICA2MiwgICAgNjMsICAgIDY0LCAgICA0MSwgICAgNjUsICAgIDY2LCAgIDEwOCwKKyAgIDExOSwgICAxMjAsICAgIDY3LCAgIDExNSwgICAgNjgsICAgIDY5LCAgICAgNywgICAgIDgsICAgIDE1LCAgICAxNiwKKyAgICAxNworfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHl5cGFjdFtdID0geyAgICAzMywKKy0zMjc2OCwtMzI3NjgsICAgMTQ4LC0zMjc2OCwgICAgMjcsLTMyNzY4LC0zMjc2OCwgICAgIDAsLTMyNzY4LC0zMjc2OCwKKyAgICA1MCwgICAgNzUsICAgLTIxLCAgICAyNywtMzI3NjgsICAgMTI4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICA1MCwKKyAgICAyNSwgICAxMDIsICAgIC01LC0zMjc2OCwgICAgMzIsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKKyAgIC0yMSwgICAgMzMsICAgMTM3LC0zMjc2OCwgICAgNTAsICAgIDUwLCAgICA1MCwgICAgNTAsICAgIDUwLCAgICA0NCwKKyAgICAxMCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAxMDIsICAgMTAyLCAgICAtNSwgICAgLTUsICAgIDQ2LC0zMjc2OCwKKyAgIDEzMywgICAxMzEsICAgIDc4LCAgICA4MSwgICAgNTAsLTMyNzY4LCAgICAyNywgICAgNTMsLTMyNzY4LCAgICAtNSwKKyAgICA1NSwgICAgOTMsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKKy0zMjc2OCwgICAgNTAsICAgIDU3LCAgICA1NywgICAgNTYsICAgIDYwLC0zMjc2OCwtMzI3NjgsICAgMTA1LCAgICA1MCwKKy0zMjc2OCwtMzI3NjgsICAgMTMzLCAgICA1NywgICAgNjIsLTMyNzY4LCAgIDEyNSwgICAgOTUsLTMyNzY4LC0zMjc2OCwKKyAgICA3NCwgICAgOTcsICAgMTE4LCAgICA1NywgICAgNTcsLTMyNzY4LCAgICA1MCwgICAgNTAsICAgIDUwLCAgICA1MCwKKyAgICA1MCwgICAgNTAsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAtMjEsICAgMTMzLCAgIDEzMywKKyAgIDEzMywgICAxMzMsICAgMTMzLCAgIDEzMywgICAtMjEsICAgMTAzLC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgIC0yMSwKKy0zMjc2OCwgICAgODUsLTMyNzY4Cit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgeXlwZ290b1tdID0gey0zMjc2OCwKKyAgIDExNywgICAgLTYsLTMyNzY4LCAgIC0yNCwgICAtMTEsICAgLTQ3LCAgICA3MCwgICAtMTAsICAgMTMyLCAgIC0zMCwKKyAgIC0zNywtMzI3NjgsLTMyNzY4LCAgICA2NCwgICAtNDMsICAgLTEzLC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKKy0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKKyAgICA5OQorfTsKKworCisjZGVmaW5lCVlZTEFTVAkJMTY4CisKKworc3RhdGljIGNvbnN0IHNob3J0IHl5dGFibGVbXSA9IHsgICAgMjksCisgICAgMjEsICAgIDE0LCAgICAzMCwgICAgNjEsICAgICAxLCAgICAgMiwgICAgNDcsICAgIDQ4LCAgICAyOCwgICAgMzMsCisgICAgNjAsICAgIDM5LCAgICAxOCwgICAgMTksICAgICAxLCAgICAgMiwgICAgNTksICAgIDQyLCAgICA4MiwgICAgNTMsCisgICAgNjEsICAgIDU0LCAgICA1NSwgICAgMTMsICAgIDYxLCAgICAxNCwgICAgODgsICAgIDYwLCAgICA0OSwgICAgNTEsCisgICAgMTAsICAgIDYwLCAgICAyMCwgICAgNzgsICAgIDU3LCAgICA4MiwgICAgOTIsICAgICAxLCAgICAgMiwgICAgMjgsCisgICAgNTYsICAgIDYxLCAgICAzNCwgICAgMTEsICAgIDc1LCAgICA3NiwgICAgMTgsICAgIDE5LCAgICA2MCwgICAgMzUsCisgICAgMzYsICAgIDU3LCAgICAxOCwgICAgMTksICAgIDQwLCAgICAxOCwgICAgMTksICAgICAxLCAgICAgMiwgICAgMTgsCisgICAgMTksICAgIDgzLCAgICA1MywgICAgNzAsICAgIDU0LCAgICA1NSwgICAgMjAsICAgIDUwLCAgICA4MCwgICAgOTEsCisgICAgMzUsICAgIDM2LCAgICAyMCwgICAgOTMsICAgIDg5LCAgICAyMCwgICAgOTQsICAgIDk1LCAgICAyNiwgICAgODQsCisgICAgMzUsICAgIDM2LCAgICAyOCwgICAgNzcsICAgMTIzLCAgICA5NiwgICAxMDksICAgMTEwLCAgIDExMSwgICAxMTIsCisgICAxMTMsICAgMTE0LCAgIDEwNCwgICAgMjYsICAgMTE2LCAgICAxOCwgICAgMTksICAgIDI3LCAgICAzNSwgICAgMzYsCisgICAgNzMsICAgMTE3LCAgICA1MywgICAgNzQsICAgIDU0LCAgICA1NSwgICAxMjEsICAgIDE4LCAgICAxOSwgICAgOTQsCisgICAgOTUsICAgIDk0LCAgICA5NSwgICAxMTgsICAgIDUzLCAgICAyMCwgICAgNTQsICAgIDU1LCAgIDEwMywgICAgIDksCisgICAxMDUsICAgIDc5LCAgICAyOCwgICAgODEsICAgIDk3LCAgICA5OCwgICAgOTksICAgIDIwLCAgICAzNywgICAgMzgsCisgICAgNDMsICAgIDk3LCAgICA5OCwgICAgOTksICAgIDI4LCAgICA5MCwgICAgIDAsICAgMTAwLCAgIDEwMSwgICAxMDIsCisgICAgIDAsICAgIDQ0LCAgICAzNSwgICAgMzYsICAgMTAwLCAgIDEwMSwgICAxMDIsICAgMTIyLCAgICAgMCwgICAgMzUsCisgICAgMzYsICAgIDMxLCAgICAgMSwgICAgIDIsICAgIDcxLCAgICAgMCwgICAgMzIsICAgIDM1LCAgICAzNiwgICAgNzIsCisgICAgNDQsICAgIDM1LCAgICAzNiwgICAxMDYsICAgMTA3LCAgICAgMCwgICAgNDUsICAgIDQ2Cit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgeXljaGVja1tdID0geyAgICAxMywKKyAgICAxMSwgICAgIDgsICAgIDE0LCAgICA0MSwgICAgIDUsICAgICA2LCAgICAzNywgICAgMzgsICAgIDMwLCAgICAyMCwKKyAgICA0MSwgICAgMTcsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICA0MSwgICAgMzEsICAgIDYyLCAgICAxMCwKKyAgICA1OCwgICAgMTIsICAgIDEzLCAgICAyNCwgICAgNjIsICAgIDMyLCAgICA3NCwgICAgNTgsICAgIDM5LCAgICA0MCwKKyAgICAgNCwgICAgNjIsICAgIDIzLCAgICA1OCwgICAgNDEsICAgIDc5LCAgICA4NCwgICAgIDUsICAgICA2LCAgICAzMCwKKyAgICAzMSwgICAgNzksICAgIDE4LCAgICAxNywgICAgNTUsICAgIDU3LCAgICAgMywgICAgIDQsICAgIDc5LCAgICAyNSwKKyAgICAyNiwgICAgNTgsICAgICAzLCAgICAgNCwgICAgMjMsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgMywKKyAgICAgNCwgICAgNzIsICAgIDEwLCAgICAxOCwgICAgMTIsICAgIDEzLCAgICAyMywgICAgMjQsICAgIDE0LCAgICA4MCwKKyAgICAyNSwgICAgMjYsICAgIDIzLCAgICA4NCwgICAgMTksICAgIDIzLCAgICAxNSwgICAgMTYsICAgIDE5LCAgICAyMywKKyAgICAyNSwgICAgMjYsICAgIDMwLCAgICAzMSwgICAgIDAsICAgIDI0LCAgICA5NywgICAgOTgsICAgIDk5LCAgIDEwMCwKKyAgIDEwMSwgICAxMDIsICAgIDE5LCAgICAxOSwgICAxMDgsICAgICAzLCAgICAgNCwgICAgMjMsICAgIDI1LCAgICAyNiwKKyAgICAyMywgICAxMTUsICAgIDEwLCAgICAyMywgICAgMTIsICAgIDEzLCAgIDEyMCwgICAgIDMsICAgICA0LCAgICAxNSwKKyAgICAxNiwgICAgMTUsICAgIDE2LCAgICAxMSwgICAgMTAsICAgIDIzLCAgICAxMiwgICAgMTMsICAgIDI0LCAgICAgMywKKyAgICAyNCwgICAgNTgsICAgIDMwLCAgICAzMSwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMjMsICAgIDI3LCAgICAyOCwKKyAgICAzMiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMzAsICAgIDMxLCAgICAtMSwgICAgMjAsICAgIDIxLCAgICAyMiwKKyAgICAtMSwgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgIDAsICAgIC0xLCAgICAyNSwKKyAgICAyNiwgICAgMjQsICAgICA1LCAgICAgNiwgICAgMjQsICAgIC0xLCAgICAyOSwgICAgMjUsICAgIDI2LCAgICAyOSwKKyAgICAyNCwgICAgMjUsICAgIDI2LCAgICA5NCwgICAgOTUsICAgIC0xLCAgICAzNSwgICAgMzYKK307CisvKiAtKi1DLSotICBOb3RlIHNvbWUgY29tcGlsZXJzIGNob2tlIG9uIGNvbW1lbnRzIG9uIGAjbGluZScgbGluZXMuICAqLworI2xpbmUgMyAiL3Vzci9zaGFyZS9iaXNvbi5zaW1wbGUiCisvKiBUaGlzIGZpbGUgY29tZXMgZnJvbSBiaXNvbi0xLjI3LiAgKi8KKworLyogU2tlbGV0b24gb3V0cHV0IHBhcnNlciBmb3IgYmlzb24sCisgICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGVuIHRoaXMgZmlsZSBpcyBjb3BpZWQgYnkgQmlzb24gaW50byBhCisgICBCaXNvbiBvdXRwdXQgZmlsZSwgeW91IG1heSB1c2UgdGhhdCBvdXRwdXQgZmlsZSB3aXRob3V0IHJlc3RyaWN0aW9uLgorICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB3YXMgYWRkZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICAgaW4gdmVyc2lvbiAxLjI0IG9mIEJpc29uLiAgKi8KKworLyogVGhpcyBpcyB0aGUgcGFyc2VyIGNvZGUgdGhhdCBpcyB3cml0dGVuIGludG8gZWFjaCBiaXNvbiBwYXJzZXIKKyAgd2hlbiB0aGUgJXNlbWFudGljX3BhcnNlciBkZWNsYXJhdGlvbiBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBncmFtbWFyLgorICBJdCB3YXMgd3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuIGJ5IHNpbXBsaWZ5aW5nIHRoZSBoYWlyeSBwYXJzZXIKKyAgdXNlZCB3aGVuICVzZW1hbnRpY19wYXJzZXIgaXMgc3BlY2lmaWVkLiAgKi8KKworI2lmbmRlZiBZWVNUQUNLX1VTRV9BTExPQ0EKKyNpZmRlZiBhbGxvY2EKKyNkZWZpbmUgWVlTVEFDS19VU0VfQUxMT0NBCisjZWxzZSAvKiBhbGxvY2Egbm90IGRlZmluZWQgKi8KKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBZWVNUQUNLX1VTRV9BTExPQ0EKKyNkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyNlbHNlIC8qIG5vdCBHTlUgQy4gICovCisjaWYgKCFkZWZpbmVkIChfX1NURENfXykgJiYgZGVmaW5lZCAoc3BhcmMpKSB8fCBkZWZpbmVkIChfX3NwYXJjX18pIHx8IGRlZmluZWQgKF9fc3BhcmMpIHx8IGRlZmluZWQgKF9fc2dpKSB8fCAoZGVmaW5lZCAoX19zdW4pICYmIGRlZmluZWQgKF9faTM4NikpCisjZGVmaW5lIFlZU1RBQ0tfVVNFX0FMTE9DQQorI2luY2x1ZGUgPGFsbG9jYS5oPgorI2Vsc2UgLyogbm90IHNwYXJjICovCisvKiBXZSB0aGluayB0aGlzIHRlc3QgZGV0ZWN0cyBXYXRjb20gYW5kIE1pY3Jvc29mdCBDLiAgKi8KKy8qIFRoaXMgdXNlZCB0byB0ZXN0IE1TRE9TLCBidXQgdGhhdCBpcyBhIGJhZCBpZGVhCisgICBzaW5jZSB0aGF0IHN5bWJvbCBpcyBpbiB0aGUgdXNlciBuYW1lc3BhY2UuICAqLworI2lmIChkZWZpbmVkIChfTVNET1MpIHx8IGRlZmluZWQgKF9NU0RPU18pKSAmJiAhZGVmaW5lZCAoX19UVVJCT0NfXykKKyNpZiAwIC8qIE5vIG5lZWQgZm9yIG1hbGxvYy5oLCB3aGljaCBwb2xsdXRlcyB0aGUgbmFtZXNwYWNlOworCSBpbnN0ZWFkLCBqdXN0IGRvbid0IHVzZSBhbGxvY2EuICAqLworI2luY2x1ZGUgPG1hbGxvYy5oPgorI2VuZGlmCisjZWxzZSAvKiBub3QgTVNET1MsIG9yIF9fVFVSQk9DX18gKi8KKyNpZiBkZWZpbmVkKF9BSVgpCisvKiBJIGRvbid0IGtub3cgd2hhdCB0aGlzIHdhcyBuZWVkZWQgZm9yLCBidXQgaXQgcG9sbHV0ZXMgdGhlIG5hbWVzcGFjZS4KKyAgIFNvIEkgdHVybmVkIGl0IG9mZi4gICBybXMsIDIgTWF5IDE5OTcuICAqLworLyogI2luY2x1ZGUgPG1hbGxvYy5oPiAgKi8KKyAjcHJhZ21hIGFsbG9jYQorI2RlZmluZSBZWVNUQUNLX1VTRV9BTExPQ0EKKyNlbHNlIC8qIG5vdCBNU0RPUywgb3IgX19UVVJCT0NfXywgb3IgX0FJWCAqLworI2lmIDAKKyNpZmRlZiBfX2hwdXggLyogaGFpYmxlQGlsb2cuZnIgc2F5cyB0aGlzIHdvcmtzIGZvciBIUFVYIDkuMDUgYW5kIHVwLAorCQkgYW5kIG9uIEhQVVggMTAuICBFdmVudHVhbGx5IHdlIGNhbiB0dXJuIHRoaXMgb24uICAqLworI2RlZmluZSBZWVNUQUNLX1VTRV9BTExPQ0EKKyNkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKyNlbmRpZiAvKiBfX2hwdXggKi8KKyNlbmRpZgorI2VuZGlmIC8qIG5vdCBfQUlYICovCisjZW5kaWYgLyogbm90IE1TRE9TLCBvciBfX1RVUkJPQ19fICovCisjZW5kaWYgLyogbm90IHNwYXJjICovCisjZW5kaWYgLyogbm90IEdOVSBDICovCisjZW5kaWYgLyogYWxsb2NhIG5vdCBkZWZpbmVkICovCisjZW5kaWYgLyogWVlTVEFDS19VU0VfQUxMT0NBIG5vdCBkZWZpbmVkICovCisKKyNpZmRlZiBZWVNUQUNLX1VTRV9BTExPQ0EKKyNkZWZpbmUgWVlTVEFDS19BTExPQyBhbGxvY2EKKyNlbHNlCisjZGVmaW5lIFlZU1RBQ0tfQUxMT0MgbWFsbG9jCisjZW5kaWYKKworLyogTm90ZTogdGhlcmUgbXVzdCBiZSBvbmx5IG9uZSBkb2xsYXIgc2lnbiBpbiB0aGlzIGZpbGUuCisgICBJdCBpcyByZXBsYWNlZCBieSB0aGUgbGlzdCBvZiBhY3Rpb25zLCBlYWNoIGFjdGlvbgorICAgYXMgb25lIGNhc2Ugb2YgdGhlIHN3aXRjaC4gICovCisKKyNkZWZpbmUgeXllcnJvawkJKHl5ZXJyc3RhdHVzID0gMCkKKyNkZWZpbmUgeXljbGVhcmluCSh5eWNoYXIgPSBZWUVNUFRZKQorI2RlZmluZSBZWUVNUFRZCQktMgorI2RlZmluZSBZWUVPRgkJMAorI2RlZmluZSBZWUFDQ0VQVAlnb3RvIHl5YWNjZXB0bGFiCisjZGVmaW5lIFlZQUJPUlQgCWdvdG8geXlhYm9ydGxhYgorI2RlZmluZSBZWUVSUk9SCQlnb3RvIHl5ZXJybGFiMQorLyogTGlrZSBZWUVSUk9SIGV4Y2VwdCBkbyBjYWxsIHl5ZXJyb3IuCisgICBUaGlzIHJlbWFpbnMgaGVyZSB0ZW1wb3JhcmlseSB0byBlYXNlIHRoZQorICAgdHJhbnNpdGlvbiB0byB0aGUgbmV3IG1lYW5pbmcgb2YgWVlFUlJPUiwgZm9yIEdDQy4KKyAgIE9uY2UgR0NDIHZlcnNpb24gMiBoYXMgc3VwcGxhbnRlZCB2ZXJzaW9uIDEsIHRoaXMgY2FuIGdvLiAgKi8KKyNkZWZpbmUgWVlGQUlMCQlnb3RvIHl5ZXJybGFiCisjZGVmaW5lIFlZUkVDT1ZFUklORygpICAoISF5eWVycnN0YXR1cykKKyNkZWZpbmUgWVlCQUNLVVAodG9rZW4sIHZhbHVlKSBcCitkbwkJCQkJCQkJXAorICBpZiAoeXljaGFyID09IFlZRU1QVFkgJiYgeXlsZW4gPT0gMSkJCQkJXAorICAgIHsgeXljaGFyID0gKHRva2VuKSwgeXlsdmFsID0gKHZhbHVlKTsJCQlcCisgICAgICB5eWNoYXIxID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7CQkJCVwKKyAgICAgIFlZUE9QU1RBQ0s7CQkJCQkJXAorICAgICAgZ290byB5eWJhY2t1cDsJCQkJCQlcCisgICAgfQkJCQkJCQkJXAorICBlbHNlCQkJCQkJCQlcCisgICAgeyB5eWVycm9yICgic3ludGF4IGVycm9yOiBjYW5ub3QgYmFjayB1cCIpOyBZWUVSUk9SOyB9CVwKK3doaWxlICgwKQorCisjZGVmaW5lIFlZVEVSUk9SCTEKKyNkZWZpbmUgWVlFUlJDT0RFCTI1NgorCisjaWZuZGVmIFlZUFVSRQorI2RlZmluZSBZWUxFWAkJeXlsZXgoKQorI2VuZGlmCisKKyNpZmRlZiBZWVBVUkUKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyNpZmRlZiBZWUxFWF9QQVJBTQorI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCwgJnl5bGxvYywgWVlMRVhfUEFSQU0pCisjZWxzZQorI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCwgJnl5bGxvYykKKyNlbmRpZgorI2Vsc2UgLyogbm90IFlZTFNQX05FRURFRCAqLworI2lmZGVmIFlZTEVYX1BBUkFNCisjZGVmaW5lIFlZTEVYCQl5eWxleCgmeXlsdmFsLCBZWUxFWF9QQVJBTSkKKyNlbHNlCisjZGVmaW5lIFlZTEVYCQl5eWxleCgmeXlsdmFsKQorI2VuZGlmCisjZW5kaWYgLyogbm90IFlZTFNQX05FRURFRCAqLworI2VuZGlmCisKKy8qIElmIG5vbnJlZW50cmFudCwgZ2VuZXJhdGUgdGhlIHZhcmlhYmxlcyBoZXJlICovCisKKyNpZm5kZWYgWVlQVVJFCisKK2ludAl5eWNoYXI7CQkJLyogIHRoZSBsb29rYWhlYWQgc3ltYm9sCQkqLworWVlTVFlQRQl5eWx2YWw7CQkJLyogIHRoZSBzZW1hbnRpYyB2YWx1ZSBvZiB0aGUJCSovCisJCQkJLyogIGxvb2thaGVhZCBzeW1ib2wJCQkqLworCisjaWZkZWYgWVlMU1BfTkVFREVECitZWUxUWVBFIHl5bGxvYzsJCQkvKiAgbG9jYXRpb24gZGF0YSBmb3IgdGhlIGxvb2thaGVhZAkqLworCQkJCS8qICBzeW1ib2wJCQkJKi8KKyNlbmRpZgorCitpbnQgeXluZXJyczsJCQkvKiAgbnVtYmVyIG9mIHBhcnNlIGVycm9ycyBzbyBmYXIgICAgICAgKi8KKyNlbmRpZiAgLyogbm90IFlZUFVSRSAqLworCisjaWYgWVlERUJVRyAhPSAwCitpbnQgeXlkZWJ1ZzsJCQkvKiAgbm9uemVybyBtZWFucyBwcmludCBwYXJzZSB0cmFjZQkqLworLyogU2luY2UgdGhpcyBpcyB1bmluaXRpYWxpemVkLCBpdCBkb2VzIG5vdCBzdG9wIG11bHRpcGxlIHBhcnNlcnMKKyAgIGZyb20gY29leGlzdGluZy4gICovCisjZW5kaWYKKworLyogIFlZSU5JVERFUFRIIGluZGljYXRlcyB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBwYXJzZXIncyBzdGFja3MJKi8KKworI2lmbmRlZglZWUlOSVRERVBUSAorI2RlZmluZSBZWUlOSVRERVBUSCAyMDAKKyNlbmRpZgorCisvKiAgWVlNQVhERVBUSCBpcyB0aGUgbWF4aW11bSBzaXplIHRoZSBzdGFja3MgY2FuIGdyb3cgdG8KKyAgICAoZWZmZWN0aXZlIG9ubHkgaWYgdGhlIGJ1aWx0LWluIHN0YWNrIGV4dGVuc2lvbiBtZXRob2QgaXMgdXNlZCkuICAqLworCisjaWYgWVlNQVhERVBUSCA9PSAwCisjdW5kZWYgWVlNQVhERVBUSAorI2VuZGlmCisKKyNpZm5kZWYgWVlNQVhERVBUSAorI2RlZmluZSBZWU1BWERFUFRIIDEwMDAwCisjZW5kaWYKKwwKKy8qIERlZmluZSBfX3l5X21lbWNweS4gIE5vdGUgdGhhdCB0aGUgc2l6ZSBhcmd1bWVudAorICAgc2hvdWxkIGJlIHBhc3NlZCB3aXRoIHR5cGUgdW5zaWduZWQgaW50LCBiZWNhdXNlIHRoYXQgaXMgd2hhdCB0aGUgbm9uLUdDQworICAgZGVmaW5pdGlvbnMgcmVxdWlyZS4gIFdpdGggR0NDLCBfX2J1aWx0aW5fbWVtY3B5IHRha2VzIGFuIGFyZworICAgb2YgdHlwZSBzaXplX3QsIGJ1dCBpdCBjYW4gaGFuZGxlIHVuc2lnbmVkIGludC4gICovCisKKyNpZiBfX0dOVUNfXyA+IDEJCS8qIEdOVSBDIGFuZCBHTlUgQysrIGRlZmluZSB0aGlzLiAgKi8KKyNkZWZpbmUgX195eV9tZW1jcHkoVE8sRlJPTSxDT1VOVCkJX19idWlsdGluX21lbWNweShUTyxGUk9NLENPVU5UKQorI2Vsc2UJCQkJLyogbm90IEdOVSBDIG9yIEMrKyAqLworI2lmbmRlZiBfX2NwbHVzcGx1cworCisvKiBUaGlzIGlzIHRoZSBtb3N0IHJlbGlhYmxlIHdheSB0byBhdm9pZCBpbmNvbXBhdGliaWxpdGllcworICAgaW4gYXZhaWxhYmxlIGJ1aWx0LWluIGZ1bmN0aW9ucyBvbiB2YXJpb3VzIHN5c3RlbXMuICAqLworc3RhdGljIHZvaWQKK19feXlfbWVtY3B5ICh0bywgZnJvbSwgY291bnQpCisgICAgIGNoYXIgKnRvOworICAgICBjaGFyICpmcm9tOworICAgICB1bnNpZ25lZCBpbnQgY291bnQ7Cit7CisgIHJlZ2lzdGVyIGNoYXIgKmYgPSBmcm9tOworICByZWdpc3RlciBjaGFyICp0ID0gdG87CisgIHJlZ2lzdGVyIGludCBpID0gY291bnQ7CisKKyAgd2hpbGUgKGktLSA+IDApCisgICAgKnQrKyA9ICpmKys7Cit9CisKKyNlbHNlIC8qIF9fY3BsdXNwbHVzICovCisKKy8qIFRoaXMgaXMgdGhlIG1vc3QgcmVsaWFibGUgd2F5IHRvIGF2b2lkIGluY29tcGF0aWJpbGl0aWVzCisgICBpbiBhdmFpbGFibGUgYnVpbHQtaW4gZnVuY3Rpb25zIG9uIHZhcmlvdXMgc3lzdGVtcy4gICovCitzdGF0aWMgdm9pZAorX195eV9tZW1jcHkgKGNoYXIgKnRvLCBjaGFyICpmcm9tLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisgIHJlZ2lzdGVyIGNoYXIgKnQgPSB0bzsKKyAgcmVnaXN0ZXIgY2hhciAqZiA9IGZyb207CisgIHJlZ2lzdGVyIGludCBpID0gY291bnQ7CisKKyAgd2hpbGUgKGktLSA+IDApCisgICAgKnQrKyA9ICpmKys7Cit9CisKKyNlbmRpZgorI2VuZGlmCisMCisjbGluZSAyMTYgIi91c3Ivc2hhcmUvYmlzb24uc2ltcGxlIgorCisvKiBUaGUgdXNlciBjYW4gZGVmaW5lIFlZUEFSU0VfUEFSQU0gYXMgdGhlIG5hbWUgb2YgYW4gYXJndW1lbnQgdG8gYmUgcGFzc2VkCisgICBpbnRvIHl5cGFyc2UuICBUaGUgYXJndW1lbnQgc2hvdWxkIGhhdmUgdHlwZSB2b2lkICouCisgICBJdCBzaG91bGQgYWN0dWFsbHkgcG9pbnQgdG8gYW4gb2JqZWN0LgorICAgR3JhbW1hciBhY3Rpb25zIGNhbiBhY2Nlc3MgdGhlIHZhcmlhYmxlIGJ5IGNhc3RpbmcgaXQKKyAgIHRvIHRoZSBwcm9wZXIgcG9pbnRlciB0eXBlLiAgKi8KKworI2lmZGVmIFlZUEFSU0VfUEFSQU0KKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBZWVBBUlNFX1BBUkFNX0FSRyB2b2lkICpZWVBBUlNFX1BBUkFNCisjZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTAorI2Vsc2UgLyogbm90IF9fY3BsdXNwbHVzICovCisjZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHIFlZUEFSU0VfUEFSQU0KKyNkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMIHZvaWQgKllZUEFSU0VfUEFSQU07CisjZW5kaWYgLyogbm90IF9fY3BsdXNwbHVzICovCisjZWxzZSAvKiBub3QgWVlQQVJTRV9QQVJBTSAqLworI2RlZmluZSBZWVBBUlNFX1BBUkFNX0FSRworI2RlZmluZSBZWVBBUlNFX1BBUkFNX0RFQ0wKKyNlbmRpZiAvKiBub3QgWVlQQVJTRV9QQVJBTSAqLworCisvKiBQcmV2ZW50IHdhcm5pbmcgaWYgLVdzdHJpY3QtcHJvdG90eXBlcy4gICovCisjaWZkZWYgX19HTlVDX18KKyNpZmRlZiBZWVBBUlNFX1BBUkFNCitpbnQgeXlwYXJzZSAodm9pZCAqKTsKKyNlbHNlCitpbnQgeXlwYXJzZSAodm9pZCk7CisjZW5kaWYKKyNlbmRpZgorCitpbnQKK3l5cGFyc2UoWVlQQVJTRV9QQVJBTV9BUkcpCisgICAgIFlZUEFSU0VfUEFSQU1fREVDTAoreworICByZWdpc3RlciBpbnQgeXlzdGF0ZTsKKyAgcmVnaXN0ZXIgaW50IHl5bjsKKyAgcmVnaXN0ZXIgc2hvcnQgKnl5c3NwOworICByZWdpc3RlciBZWVNUWVBFICp5eXZzcDsKKyAgaW50IHl5ZXJyc3RhdHVzOwkvKiAgbnVtYmVyIG9mIHRva2VucyB0byBzaGlmdCBiZWZvcmUgZXJyb3IgbWVzc2FnZXMgZW5hYmxlZCAqLworICBpbnQgeXljaGFyMSA9IDA7CQkvKiAgbG9va2FoZWFkIHRva2VuIGFzIGFuIGludGVybmFsICh0cmFuc2xhdGVkKSB0b2tlbiBudW1iZXIgKi8KKworICBzaG9ydAl5eXNzYVtZWUlOSVRERVBUSF07CS8qICB0aGUgc3RhdGUgc3RhY2sJCQkqLworICBZWVNUWVBFIHl5dnNhW1lZSU5JVERFUFRIXTsJLyogIHRoZSBzZW1hbnRpYyB2YWx1ZSBzdGFjawkJKi8KKworICBzaG9ydCAqeXlzcyA9IHl5c3NhOwkJLyogIHJlZmVyIHRvIHRoZSBzdGFja3MgdGhydSBzZXBhcmF0ZSBwb2ludGVycyAqLworICBZWVNUWVBFICp5eXZzID0geXl2c2E7CS8qICB0byBhbGxvdyB5eW92ZXJmbG93IHRvIHJlYWxsb2NhdGUgdGhlbSBlbHNld2hlcmUgKi8KKworI2lmZGVmIFlZTFNQX05FRURFRAorICBZWUxUWVBFIHl5bHNhW1lZSU5JVERFUFRIXTsJLyogIHRoZSBsb2NhdGlvbiBzdGFjawkJCSovCisgIFlZTFRZUEUgKnl5bHMgPSB5eWxzYTsKKyAgWVlMVFlQRSAqeXlsc3A7CisKKyNkZWZpbmUgWVlQT1BTVEFDSyAgICh5eXZzcC0tLCB5eXNzcC0tLCB5eWxzcC0tKQorI2Vsc2UKKyNkZWZpbmUgWVlQT1BTVEFDSyAgICh5eXZzcC0tLCB5eXNzcC0tKQorI2VuZGlmCisKKyAgaW50IHl5c3RhY2tzaXplID0gWVlJTklUREVQVEg7CisgIGludCB5eWZyZWVfc3RhY2tzID0gMDsKKworI2lmZGVmIFlZUFVSRQorICBpbnQgeXljaGFyOworICBZWVNUWVBFIHl5bHZhbDsKKyAgaW50IHl5bmVycnM7CisjaWZkZWYgWVlMU1BfTkVFREVECisgIFlZTFRZUEUgeXlsbG9jOworI2VuZGlmCisjZW5kaWYKKworICBZWVNUWVBFIHl5dmFsOwkJLyogIHRoZSB2YXJpYWJsZSB1c2VkIHRvIHJldHVybgkJKi8KKwkJCQkvKiAgc2VtYW50aWMgdmFsdWVzIGZyb20gdGhlIGFjdGlvbgkqLworCQkJCS8qICByb3V0aW5lcwkJCQkqLworCisgIGludCB5eWxlbjsKKworI2lmIFlZREVCVUcgIT0gMAorICBpZiAoeXlkZWJ1ZykKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlN0YXJ0aW5nIHBhcnNlXG4iKTsKKyNlbmRpZgorCisgIHl5c3RhdGUgPSAwOworICB5eWVycnN0YXR1cyA9IDA7CisgIHl5bmVycnMgPSAwOworICB5eWNoYXIgPSBZWUVNUFRZOwkJLyogQ2F1c2UgYSB0b2tlbiB0byBiZSByZWFkLiAgKi8KKworICAvKiBJbml0aWFsaXplIHN0YWNrIHBvaW50ZXJzLgorICAgICBXYXN0ZSBvbmUgZWxlbWVudCBvZiB2YWx1ZSBhbmQgbG9jYXRpb24gc3RhY2sKKyAgICAgc28gdGhhdCB0aGV5IHN0YXkgb24gdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIHN0YXRlIHN0YWNrLgorICAgICBUaGUgd2FzdGVkIGVsZW1lbnRzIGFyZSBuZXZlciBpbml0aWFsaXplZC4gICovCisKKyAgeXlzc3AgPSB5eXNzIC0gMTsKKyAgeXl2c3AgPSB5eXZzOworI2lmZGVmIFlZTFNQX05FRURFRAorICB5eWxzcCA9IHl5bHM7CisjZW5kaWYKKworLyogUHVzaCBhIG5ldyBzdGF0ZSwgd2hpY2ggaXMgZm91bmQgaW4gIHl5c3RhdGUgIC4gICovCisvKiBJbiBhbGwgY2FzZXMsIHdoZW4geW91IGdldCBoZXJlLCB0aGUgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrcworICAgaGF2ZSBqdXN0IGJlZW4gcHVzaGVkLiBzbyBwdXNoaW5nIGEgc3RhdGUgaGVyZSBldmVucyB0aGUgc3RhY2tzLiAgKi8KK3l5bmV3c3RhdGU6CisKKyAgKisreXlzc3AgPSB5eXN0YXRlOworCisgIGlmICh5eXNzcCA+PSB5eXNzICsgeXlzdGFja3NpemUgLSAxKQorICAgIHsKKyAgICAgIC8qIEdpdmUgdXNlciBhIGNoYW5jZSB0byByZWFsbG9jYXRlIHRoZSBzdGFjayAqLworICAgICAgLyogVXNlIGNvcGllcyBvZiB0aGVzZSBzbyB0aGF0IHRoZSAmJ3MgZG9uJ3QgZm9yY2UgdGhlIHJlYWwgb25lcyBpbnRvIG1lbW9yeS4gKi8KKyAgICAgIFlZU1RZUEUgKnl5dnMxID0geXl2czsKKyAgICAgIHNob3J0ICp5eXNzMSA9IHl5c3M7CisjaWZkZWYgWVlMU1BfTkVFREVECisgICAgICBZWUxUWVBFICp5eWxzMSA9IHl5bHM7CisjZW5kaWYKKworICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHVzZWQgc2l6ZSBvZiB0aGUgdGhyZWUgc3RhY2tzLCBpbiBlbGVtZW50cy4gICovCisgICAgICBpbnQgc2l6ZSA9IHl5c3NwIC0geXlzcyArIDE7CisKKyNpZmRlZiB5eW92ZXJmbG93CisgICAgICAvKiBFYWNoIHN0YWNrIHBvaW50ZXIgYWRkcmVzcyBpcyBmb2xsb3dlZCBieSB0aGUgc2l6ZSBvZgorCSB0aGUgZGF0YSBpbiB1c2UgaW4gdGhhdCBzdGFjaywgaW4gYnl0ZXMuICAqLworI2lmZGVmIFlZTFNQX05FRURFRAorICAgICAgLyogVGhpcyB1c2VkIHRvIGJlIGEgY29uZGl0aW9uYWwgYXJvdW5kIGp1c3QgdGhlIHR3byBleHRyYSBhcmdzLAorCSBidXQgdGhhdCBtaWdodCBiZSB1bmRlZmluZWQgaWYgeXlvdmVyZmxvdyBpcyBhIG1hY3JvLiAgKi8KKworICAgICAgeXlvdmVyZmxvdygicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKKwkJICZ5eXNzMSwgc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKKwkJICZ5eXZzMSwgc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKKwkJICZ5eWxzMSwgc2l6ZSAqIHNpemVvZiAoKnl5bHNwKSwKKwkJICZ5eXN0YWNrc2l6ZSk7CisjZWxzZQorICAgICAgeXlvdmVyZmxvdygicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKKwkJICZ5eXNzMSwgc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKKwkJICZ5eXZzMSwgc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKKwkJICZ5eXN0YWNrc2l6ZSk7CisjZW5kaWYKKworICAgICAgeXlzcyA9IHl5c3MxOyB5eXZzID0geXl2czE7CisjaWZkZWYgWVlMU1BfTkVFREVECisgICAgICB5eWxzID0geXlsczE7CisjZW5kaWYKKyNlbHNlIC8qIG5vIHl5b3ZlcmZsb3cgKi8KKyAgICAgIC8qIEV4dGVuZCB0aGUgc3RhY2sgb3VyIG93biB3YXkuICAqLworICAgICAgaWYgKHl5c3RhY2tzaXplID49IFlZTUFYREVQVEgpCisJeworCSAgeXllcnJvcigicGFyc2VyIHN0YWNrIG92ZXJmbG93Iik7CisJICBpZiAoeXlmcmVlX3N0YWNrcykKKwkgICAgeworCSAgICAgIGZyZWUgKHl5c3MpOworCSAgICAgIGZyZWUgKHl5dnMpOworI2lmZGVmIFlZTFNQX05FRURFRAorCSAgICAgIGZyZWUgKHl5bHMpOworI2VuZGlmCisJICAgIH0KKwkgIHJldHVybiAyOworCX0KKyAgICAgIHl5c3RhY2tzaXplICo9IDI7CisgICAgICBpZiAoeXlzdGFja3NpemUgPiBZWU1BWERFUFRIKQorCXl5c3RhY2tzaXplID0gWVlNQVhERVBUSDsKKyNpZm5kZWYgWVlTVEFDS19VU0VfQUxMT0NBCisgICAgICB5eWZyZWVfc3RhY2tzID0gMTsKKyNlbmRpZgorICAgICAgeXlzcyA9IChzaG9ydCAqKSBZWVNUQUNLX0FMTE9DICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSk7CisgICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eXNzLCAoY2hhciAqKXl5c3MxLAorCQkgICBzaXplICogKHVuc2lnbmVkIGludCkgc2l6ZW9mICgqeXlzc3ApKTsKKyAgICAgIHl5dnMgPSAoWVlTVFlQRSAqKSBZWVNUQUNLX0FMTE9DICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSk7CisgICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eXZzLCAoY2hhciAqKXl5dnMxLAorCQkgICBzaXplICogKHVuc2lnbmVkIGludCkgc2l6ZW9mICgqeXl2c3ApKTsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgICAgIHl5bHMgPSAoWVlMVFlQRSAqKSBZWVNUQUNLX0FMTE9DICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5bHNwKSk7CisgICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eWxzLCAoY2hhciAqKXl5bHMxLAorCQkgICBzaXplICogKHVuc2lnbmVkIGludCkgc2l6ZW9mICgqeXlsc3ApKTsKKyNlbmRpZgorI2VuZGlmIC8qIG5vIHl5b3ZlcmZsb3cgKi8KKworICAgICAgeXlzc3AgPSB5eXNzICsgc2l6ZSAtIDE7CisgICAgICB5eXZzcCA9IHl5dnMgKyBzaXplIC0gMTsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgICAgIHl5bHNwID0geXlscyArIHNpemUgLSAxOworI2VuZGlmCisKKyNpZiBZWURFQlVHICE9IDAKKyAgICAgIGlmICh5eWRlYnVnKQorCWZwcmludGYoc3RkZXJyLCAiU3RhY2sgc2l6ZSBpbmNyZWFzZWQgdG8gJWRcbiIsIHl5c3RhY2tzaXplKTsKKyNlbmRpZgorCisgICAgICBpZiAoeXlzc3AgPj0geXlzcyArIHl5c3RhY2tzaXplIC0gMSkKKwlZWUFCT1JUOworICAgIH0KKworI2lmIFlZREVCVUcgIT0gMAorICBpZiAoeXlkZWJ1ZykKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVudGVyaW5nIHN0YXRlICVkXG4iLCB5eXN0YXRlKTsKKyNlbmRpZgorCisgIGdvdG8geXliYWNrdXA7CisgeXliYWNrdXA6CisKKy8qIERvIGFwcHJvcHJpYXRlIHByb2Nlc3NpbmcgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUuICAqLworLyogUmVhZCBhIGxvb2thaGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisvKiB5eXJlc3VtZTogKi8KKworICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9va2FoZWFkIHRva2VuLiAgKi8KKworICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisgIGlmICh5eW4gPT0gWVlGTEFHKQorICAgIGdvdG8geXlkZWZhdWx0OworCisgIC8qIE5vdCBrbm93biA9PiBnZXQgYSBsb29rYWhlYWQgdG9rZW4gaWYgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisKKyAgLyogeXljaGFyIGlzIGVpdGhlciBZWUVNUFRZIG9yIFlZRU9GCisgICAgIG9yIGEgdmFsaWQgdG9rZW4gaW4gZXh0ZXJuYWwgZm9ybS4gICovCisKKyAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZKQorICAgIHsKKyNpZiBZWURFQlVHICE9IDAKKyAgICAgIGlmICh5eWRlYnVnKQorCWZwcmludGYoc3RkZXJyLCAiUmVhZGluZyBhIHRva2VuOiAiKTsKKyNlbmRpZgorICAgICAgeXljaGFyID0gWVlMRVg7CisgICAgfQorCisgIC8qIENvbnZlcnQgdG9rZW4gdG8gaW50ZXJuYWwgZm9ybSAoaW4geXljaGFyMSkgZm9yIGluZGV4aW5nIHRhYmxlcyB3aXRoICovCisKKyAgaWYgKHl5Y2hhciA8PSAwKQkJLyogVGhpcyBtZWFucyBlbmQgb2YgaW5wdXQuICovCisgICAgeworICAgICAgeXljaGFyMSA9IDA7CisgICAgICB5eWNoYXIgPSBZWUVPRjsJCS8qIERvbid0IGNhbGwgWVlMRVggYW55IG1vcmUgKi8KKworI2lmIFlZREVCVUcgIT0gMAorICAgICAgaWYgKHl5ZGVidWcpCisJZnByaW50ZihzdGRlcnIsICJOb3cgYXQgZW5kIG9mIGlucHV0LlxuIik7CisjZW5kaWYKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB5eWNoYXIxID0gWVlUUkFOU0xBVEUoeXljaGFyKTsKKworI2lmIFlZREVCVUcgIT0gMAorICAgICAgaWYgKHl5ZGVidWcpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCAiTmV4dCB0b2tlbiBpcyAlZCAoJXMiLCB5eWNoYXIsIHl5dG5hbWVbeXljaGFyMV0pOworCSAgLyogR2l2ZSB0aGUgaW5kaXZpZHVhbCBwYXJzZXIgYSB3YXkgdG8gcHJpbnQgdGhlIHByZWNpc2UgbWVhbmluZworCSAgICAgb2YgYSB0b2tlbiwgZm9yIGZ1cnRoZXIgZGVidWdnaW5nIGluZm8uICAqLworI2lmZGVmIFlZUFJJTlQKKwkgIFlZUFJJTlQgKHN0ZGVyciwgeXljaGFyLCB5eWx2YWwpOworI2VuZGlmCisJICBmcHJpbnRmIChzdGRlcnIsICIpXG4iKTsKKwl9CisjZW5kaWYKKyAgICB9CisKKyAgeXluICs9IHl5Y2hhcjE7CisgIGlmICh5eW4gPCAwIHx8IHl5biA+IFlZTEFTVCB8fCB5eWNoZWNrW3l5bl0gIT0geXljaGFyMSkKKyAgICBnb3RvIHl5ZGVmYXVsdDsKKworICB5eW4gPSB5eXRhYmxlW3l5bl07CisKKyAgLyogeXluIGlzIHdoYXQgdG8gZG8gZm9yIHRoaXMgdG9rZW4gdHlwZSBpbiB0aGlzIHN0YXRlLgorICAgICBOZWdhdGl2ZSA9PiByZWR1Y2UsIC15eW4gaXMgcnVsZSBudW1iZXIuCisgICAgIFBvc2l0aXZlID0+IHNoaWZ0LCB5eW4gaXMgbmV3IHN0YXRlLgorICAgICAgIE5ldyBzdGF0ZSBpcyBmaW5hbCBzdGF0ZSA9PiBkb24ndCBib3RoZXIgdG8gc2hpZnQsCisgICAgICAganVzdCByZXR1cm4gc3VjY2Vzcy4KKyAgICAgMCwgb3IgbW9zdCBuZWdhdGl2ZSBudW1iZXIgPT4gZXJyb3IuICAqLworCisgIGlmICh5eW4gPCAwKQorICAgIHsKKyAgICAgIGlmICh5eW4gPT0gWVlGTEFHKQorCWdvdG8geXllcnJsYWI7CisgICAgICB5eW4gPSAteXluOworICAgICAgZ290byB5eXJlZHVjZTsKKyAgICB9CisgIGVsc2UgaWYgKHl5biA9PSAwKQorICAgIGdvdG8geXllcnJsYWI7CisKKyAgaWYgKHl5biA9PSBZWUZJTkFMKQorICAgIFlZQUNDRVBUOworCisgIC8qIFNoaWZ0IHRoZSBsb29rYWhlYWQgdG9rZW4uICAqLworCisjaWYgWVlERUJVRyAhPSAwCisgIGlmICh5eWRlYnVnKQorICAgIGZwcmludGYoc3RkZXJyLCAiU2hpZnRpbmcgdG9rZW4gJWQgKCVzKSwgIiwgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKKyNlbmRpZgorCisgIC8qIERpc2NhcmQgdGhlIHRva2VuIGJlaW5nIHNoaWZ0ZWQgdW5sZXNzIGl0IGlzIGVvZi4gICovCisgIGlmICh5eWNoYXIgIT0gWVlFT0YpCisgICAgeXljaGFyID0gWVlFTVBUWTsKKworICAqKyt5eXZzcCA9IHl5bHZhbDsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgKisreXlsc3AgPSB5eWxsb2M7CisjZW5kaWYKKworICAvKiBjb3VudCB0b2tlbnMgc2hpZnRlZCBzaW5jZSBlcnJvcjsgYWZ0ZXIgdGhyZWUsIHR1cm4gb2ZmIGVycm9yIHN0YXR1cy4gICovCisgIGlmICh5eWVycnN0YXR1cykgeXllcnJzdGF0dXMtLTsKKworICB5eXN0YXRlID0geXluOworICBnb3RvIHl5bmV3c3RhdGU7CisKKy8qIERvIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUuICAqLworeXlkZWZhdWx0OgorCisgIHl5biA9IHl5ZGVmYWN0W3l5c3RhdGVdOworICBpZiAoeXluID09IDApCisgICAgZ290byB5eWVycmxhYjsKKworLyogRG8gYSByZWR1Y3Rpb24uICB5eW4gaXMgdGhlIG51bWJlciBvZiBhIHJ1bGUgdG8gcmVkdWNlIHdpdGguICAqLworeXlyZWR1Y2U6CisgIHl5bGVuID0geXlyMlt5eW5dOworICBpZiAoeXlsZW4gPiAwKQorICAgIHl5dmFsID0geXl2c3BbMS15eWxlbl07IC8qIGltcGxlbWVudCBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhY3Rpb24gKi8KKworI2lmIFlZREVCVUcgIT0gMAorICBpZiAoeXlkZWJ1ZykKKyAgICB7CisgICAgICBpbnQgaTsKKworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUmVkdWNpbmcgdmlhIHJ1bGUgJWQgKGxpbmUgJWQpLCAiLAorCSAgICAgICB5eW4sIHl5cmxpbmVbeXluXSk7CisKKyAgICAgIC8qIFByaW50IHRoZSBzeW1ib2xzIGJlaW5nIHJlZHVjZWQsIGFuZCB0aGVpciByZXN1bHQuICAqLworICAgICAgZm9yIChpID0geXlwcmhzW3l5bl07IHl5cmhzW2ldID4gMDsgaSsrKQorCWZwcmludGYgKHN0ZGVyciwgIiVzICIsIHl5dG5hbWVbeXlyaHNbaV1dKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAtPiAlc1xuIiwgeXl0bmFtZVt5eXIxW3l5bl1dKTsKKyAgICB9CisjZW5kaWYKKworCisgIHN3aXRjaCAoeXluKSB7CisKK2Nhc2UgNToKKyNsaW5lIDM4ICJtaW5pY29tcC55Igore3l5dmFsPW5ld190eXBlKERPVUJMRSk7OworICAgIGJyZWFrO30KK2Nhc2UgNjoKKyNsaW5lIDM5ICJtaW5pY29tcC55Igore3l5dmFsPW5ld190eXBlKElOVCk7OworICAgIGJyZWFrO30KK2Nhc2UgNzoKKyNsaW5lIDQwICJtaW5pY29tcC55Igore3l5dmFsPW5ld19hcnJheSh5eXZzcFstM10seXl2c3BbLTFdKTs7CisgICAgYnJlYWs7fQorY2FzZSAxMDoKKyNsaW5lIDQ5ICJtaW5pY29tcC55Igore2FkZF92YXIoeXl2c3BbLTFdLHl5dnNwWy0yXSk7OworICAgIGJyZWFrO30KK2Nhc2UgMTE6CisjbGluZSA1MyAibWluaWNvbXAueSIKK3t5eXZhbD1hZGRfc3RyaW5nKHRrbmFtZSk7OworICAgIGJyZWFrO30KK2Nhc2UgMTI6CisjbGluZSA1NyAibWluaWNvbXAueSIKK3t5eXZhbD1iaW5hcnlfbm9kZShOQU5ELHl5dnNwWy0yXSx5eXZzcFswXSk7OworICAgIGJyZWFrO30KK2Nhc2UgMTM6CisjbGluZSA1OCAibWluaWNvbXAueSIKK3t5eXZhbD1iaW5hcnlfbm9kZShOT1IseXl2c3BbLTJdLHl5dnNwWzBdKTs7CisgICAgYnJlYWs7fQorY2FzZSAxNToKKyNsaW5lIDYzICJtaW5pY29tcC55Igore3l5dmFsPWJpbmFyeV9ub2RlKE5FUVVBTFMseXl2c3BbLTJdLHl5dnNwWzBdKTs7CisgICAgYnJlYWs7fQorY2FzZSAxNjoKKyNsaW5lIDY0ICJtaW5pY29tcC55Igore3l5dmFsPWJpbmFyeV9ub2RlKE5ORVEseXl2c3BbLTJdLHl5dnNwWzBdKTs7CisgICAgYnJlYWs7fQorY2FzZSAxNzoKKyNsaW5lIDY1ICJtaW5pY29tcC55Igore3l5dmFsPWJpbmFyeV9ub2RlKE5MVCx5eXZzcFstMl0seXl2c3BbMF0pOzsKKyAgICBicmVhazt9CitjYXNlIDE4OgorI2xpbmUgNjYgIm1pbmljb21wLnkiCit7eXl2YWw9YmluYXJ5X25vZGUoTkdULHl5dnNwWy0yXSx5eXZzcFswXSk7OworICAgIGJyZWFrO30KK2Nhc2UgMTk6CisjbGluZSA2NyAibWluaWNvbXAueSIKK3t5eXZhbD1iaW5hcnlfbm9kZShOTEVRLHl5dnNwWy0yXSx5eXZzcFswXSk7OworICAgIGJyZWFrO30KK2Nhc2UgMjA6CisjbGluZSA2OCAibWluaWNvbXAueSIKK3t5eXZhbD1iaW5hcnlfbm9kZShOR0VRLHl5dnNwWy0yXSx5eXZzcFswXSk7OworICAgIGJyZWFrO30KK2Nhc2UgMjE6CisjbGluZSA2OSAibWluaWNvbXAueSIKK3t5eXZhbD15eXZzcFstMV07CisgICAgYnJlYWs7fQorY2FzZSAyMjoKKyNsaW5lIDcyICJtaW5pY29tcC55Igore3l5dmFsPWJpbmFyeV9ub2RlKE5BREQseXl2c3BbLTJdLHl5dnNwWzBdKTs7CisgICAgYnJlYWs7fQorY2FzZSAyMzoKKyNsaW5lIDczICJtaW5pY29tcC55Igore3l5dmFsPWJpbmFyeV9ub2RlKE5TVUIseXl2c3BbLTJdLHl5dnNwWzBdKTs7CisgICAgYnJlYWs7fQorY2FzZSAyNToKKyNsaW5lIDc3ICJtaW5pY29tcC55Igore3l5dmFsPWJpbmFyeV9ub2RlKE5NVUwseXl2c3BbLTJdLHl5dnNwWzBdKTs7CisgICAgYnJlYWs7fQorY2FzZSAyNjoKKyNsaW5lIDc4ICJtaW5pY29tcC55Igore3l5dmFsPWJpbmFyeV9ub2RlKE5ESVYseXl2c3BbLTJdLHl5dnNwWzBdKTs7CisgICAgYnJlYWs7fQorY2FzZSAyODoKKyNsaW5lIDgzICJtaW5pY29tcC55Igore3l5dmFsPXl5dnNwWy0xXTs7CisgICAgYnJlYWs7fQorY2FzZSAyOToKKyNsaW5lIDg0ICJtaW5pY29tcC55Igore3l5dmFsPW51bWJlcl9ub2RlKCk7OworICAgIGJyZWFrO30KK2Nhc2UgMzA6CisjbGluZSA4NSAibWluaWNvbXAueSIKK3t5eXZhbD1iaW5hcnlfbm9kZShOQ0FMTCx5eXZzcFstM10seXl2c3BbLTFdKTs7CisgICAgYnJlYWs7fQorY2FzZSAzMToKKyNsaW5lIDg2ICJtaW5pY29tcC55Igore3l5dmFsPWJpbmFyeV9ub2RlKE5DQUxMLHl5dnNwWy0yXSwwKTs7CisgICAgYnJlYWs7fQorY2FzZSAzMzoKKyNsaW5lIDkxICJtaW5pY29tcC55Igore3l5dmFsPWJpbmFyeV9ub2RlKE5JTkRFWCx5eXZzcFstM10seXl2c3BbLTFdKTs7CisgICAgYnJlYWs7fQorY2FzZSAzNToKKyNsaW5lIDk2ICJtaW5pY29tcC55Igore3l5dmFsPXZhcl9ub2RlKCk7OworICAgIGJyZWFrO30KK2Nhc2UgMzY6CisjbGluZSAxMDAgIm1pbmljb21wLnkiCit7eXl2YWw9YmluYXJ5X25vZGUoTkFSRyx5eXZzcFstMl0seXl2c3BbMF0pOzsKKyAgICBicmVhazt9CitjYXNlIDQ1OgorI2xpbmUgMTE4ICJtaW5pY29tcC55Igore2VudGVyX2Jsb2NrKCk7OworICAgIGJyZWFrO30KK2Nhc2UgNDc6CisjbGluZSAxMjIgIm1pbmljb21wLnkiCit7bGVhdmVfYmxvY2soKTs7CisgICAgYnJlYWs7fQorY2FzZSA0ODoKKyNsaW5lIDEyMyAibWluaWNvbXAueSIKK3tsZWF2ZV9ibG9jaygpOzsKKyAgICBicmVhazt9CitjYXNlIDQ5OgorI2xpbmUgMTI0ICJtaW5pY29tcC55Igore2xlYXZlX2Jsb2NrKCk7OworICAgIGJyZWFrO30KK2Nhc2UgNTA6CisjbGluZSAxMjUgIm1pbmljb21wLnkiCit7bGVhdmVfYmxvY2soKTs7CisgICAgYnJlYWs7fQorY2FzZSA1MToKKyNsaW5lIDEzMCAibWluaWNvbXAueSIKK3tpZl9zdGF0ZW1lbnQoeXl2c3BbLTFdKTs7CisgICAgYnJlYWs7fQorY2FzZSA1MzoKKyNsaW5lIDEzNCAibWluaWNvbXAueSIKK3tpZl9lbmQoKTs7CisgICAgYnJlYWs7fQorY2FzZSA1NDoKKyNsaW5lIDEzNSAibWluaWNvbXAueSIKK3tpZl9lbHNlKCk7OworICAgIGJyZWFrO30KK2Nhc2UgNTU6CisjbGluZSAxMzUgIm1pbmljb21wLnkiCit7aWZfZW5kKCk7OworICAgIGJyZWFrO30KK2Nhc2UgNTY6CisjbGluZSAxNDAgIm1pbmljb21wLnkiCit7d2hpbGVfc3RhdGVtZW50KHl5dnNwWy0xXSk7OworICAgIGJyZWFrO30KK2Nhc2UgNTc6CisjbGluZSAxNDAgIm1pbmljb21wLnkiCit7d2hpbGVfZW5kKCk7OworICAgIGJyZWFrO30KK2Nhc2UgNTg6CisjbGluZSAxNDQgIm1pbmljb21wLnkiCit7YXNzaWduX3N0YXRlbWVudCh5eXZzcFstM10seXl2c3BbLTFdKTs7CisgICAgYnJlYWs7fQorY2FzZSA1OToKKyNsaW5lIDE0OCAibWluaWNvbXAueSIKK3tyZXR1cm5fc3RhdGVtZW50KHl5dnNwWy0xXSk7OworICAgIGJyZWFrO30KK2Nhc2UgNjE6CisjbGluZSAxNTYgIm1pbmljb21wLnkiCit7ZW50ZXJfZnVuYyh5eXZzcFstMV0seXl2c3BbLTJdKTs7CisgICAgYnJlYWs7fQorY2FzZSA2MjoKKyNsaW5lIDE2MCAibWluaWNvbXAueSIKK3tsZWF2ZV9mdW5jKCk7OworICAgIGJyZWFrO30KK2Nhc2UgNjM6CisjbGluZSAxNjEgIm1pbmljb21wLnkiCit7bGVhdmVfZnVuYygpOzsKKyAgICBicmVhazt9CitjYXNlIDY2OgorI2xpbmUgMTcwICJtaW5pY29tcC55Igore2FkZF92YXIoeXl2c3BbMF0seXl2c3BbLTFdKTs7CisgICAgYnJlYWs7fQorfQorICAgLyogdGhlIGFjdGlvbiBmaWxlIGdldHMgY29waWVkIGluIGluIHBsYWNlIG9mIHRoaXMgZG9sbGFyc2lnbiAqLworI2xpbmUgNTQyICIvdXNyL3NoYXJlL2Jpc29uLnNpbXBsZSIKKwwKKyAgeXl2c3AgLT0geXlsZW47CisgIHl5c3NwIC09IHl5bGVuOworI2lmZGVmIFlZTFNQX05FRURFRAorICB5eWxzcCAtPSB5eWxlbjsKKyNlbmRpZgorCisjaWYgWVlERUJVRyAhPSAwCisgIGlmICh5eWRlYnVnKQorICAgIHsKKyAgICAgIHNob3J0ICpzc3AxID0geXlzcyAtIDE7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJzdGF0ZSBzdGFjayBub3ciKTsKKyAgICAgIHdoaWxlIChzc3AxICE9IHl5c3NwKQorCisJZnByaW50ZiAoc3RkZXJyLCAiICVkIiwgKisrc3NwMSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworICAgIH0KKyNlbmRpZgorCisgICorK3l5dnNwID0geXl2YWw7CisKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgeXlsc3ArKzsKKyAgaWYgKHl5bGVuID09IDApCisgICAgeworICAgICAgeXlsc3AtPmZpcnN0X2xpbmUgPSB5eWxsb2MuZmlyc3RfbGluZTsKKyAgICAgIHl5bHNwLT5maXJzdF9jb2x1bW4gPSB5eWxsb2MuZmlyc3RfY29sdW1uOworICAgICAgeXlsc3AtPmxhc3RfbGluZSA9ICh5eWxzcC0xKS0+bGFzdF9saW5lOworICAgICAgeXlsc3AtPmxhc3RfY29sdW1uID0gKHl5bHNwLTEpLT5sYXN0X2NvbHVtbjsKKyAgICAgIHl5bHNwLT50ZXh0ID0gMDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB5eWxzcC0+bGFzdF9saW5lID0gKHl5bHNwK3l5bGVuLTEpLT5sYXN0X2xpbmU7CisgICAgICB5eWxzcC0+bGFzdF9jb2x1bW4gPSAoeXlsc3AreXlsZW4tMSktPmxhc3RfY29sdW1uOworICAgIH0KKyNlbmRpZgorCisgIC8qIE5vdyAic2hpZnQiIHRoZSByZXN1bHQgb2YgdGhlIHJlZHVjdGlvbi4KKyAgICAgRGV0ZXJtaW5lIHdoYXQgc3RhdGUgdGhhdCBnb2VzIHRvLAorICAgICBiYXNlZCBvbiB0aGUgc3RhdGUgd2UgcG9wcGVkIGJhY2sgdG8KKyAgICAgYW5kIHRoZSBydWxlIG51bWJlciByZWR1Y2VkIGJ5LiAgKi8KKworICB5eW4gPSB5eXIxW3l5bl07CisKKyAgeXlzdGF0ZSA9IHl5cGdvdG9beXluIC0gWVlOVEJBU0VdICsgKnl5c3NwOworICBpZiAoeXlzdGF0ZSA+PSAwICYmIHl5c3RhdGUgPD0gWVlMQVNUICYmIHl5Y2hlY2tbeXlzdGF0ZV0gPT0gKnl5c3NwKQorICAgIHl5c3RhdGUgPSB5eXRhYmxlW3l5c3RhdGVdOworICBlbHNlCisgICAgeXlzdGF0ZSA9IHl5ZGVmZ290b1t5eW4gLSBZWU5UQkFTRV07CisKKyAgZ290byB5eW5ld3N0YXRlOworCit5eWVycmxhYjogICAvKiBoZXJlIG9uIGRldGVjdGluZyBlcnJvciAqLworCisgIGlmICghIHl5ZXJyc3RhdHVzKQorICAgIC8qIElmIG5vdCBhbHJlYWR5IHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVwb3J0IHRoaXMgZXJyb3IuICAqLworICAgIHsKKyAgICAgICsreXluZXJyczsKKworI2lmZGVmIFlZRVJST1JfVkVSQk9TRQorICAgICAgeXluID0geXlwYWN0W3l5c3RhdGVdOworCisgICAgICBpZiAoeXluID4gWVlGTEFHICYmIHl5biA8IFlZTEFTVCkKKwl7CisJICBpbnQgc2l6ZSA9IDA7CisJICBjaGFyICptc2c7CisJICBpbnQgeCwgY291bnQ7CisKKwkgIGNvdW50ID0gMDsKKwkgIC8qIFN0YXJ0IFggYXQgLXl5biBpZiBuZWMgdG8gYXZvaWQgbmVnYXRpdmUgaW5kZXhlcyBpbiB5eWNoZWNrLiAgKi8KKwkgIGZvciAoeCA9ICh5eW4gPCAwID8gLXl5biA6IDApOworCSAgICAgICB4IDwgKHNpemVvZih5eXRuYW1lKSAvIHNpemVvZihjaGFyICopKTsgeCsrKQorCSAgICBpZiAoeXljaGVja1t4ICsgeXluXSA9PSB4KQorCSAgICAgIHNpemUgKz0gc3RybGVuKHl5dG5hbWVbeF0pICsgMTUsIGNvdW50Kys7CisJICBtc2cgPSAoY2hhciAqKSBtYWxsb2Moc2l6ZSArIDE1KTsKKwkgIGlmIChtc2cgIT0gMCkKKwkgICAgeworCSAgICAgIHN0cmNweShtc2csICJwYXJzZSBlcnJvciIpOworCisJICAgICAgaWYgKGNvdW50IDwgNSkKKwkJeworCQkgIGNvdW50ID0gMDsKKwkJICBmb3IgKHggPSAoeXluIDwgMCA/IC15eW4gOiAwKTsKKwkJICAgICAgIHggPCAoc2l6ZW9mKHl5dG5hbWUpIC8gc2l6ZW9mKGNoYXIgKikpOyB4KyspCisJCSAgICBpZiAoeXljaGVja1t4ICsgeXluXSA9PSB4KQorCQkgICAgICB7CisJCQlzdHJjYXQobXNnLCBjb3VudCA9PSAwID8gIiwgZXhwZWN0aW5nIGAiIDogIiBvciBgIik7CisJCQlzdHJjYXQobXNnLCB5eXRuYW1lW3hdKTsKKwkJCXN0cmNhdChtc2csICInIik7CisJCQljb3VudCsrOworCQkgICAgICB9CisJCX0KKwkgICAgICB5eWVycm9yKG1zZyk7CisJICAgICAgZnJlZShtc2cpOworCSAgICB9CisJICBlbHNlCisJICAgIHl5ZXJyb3IgKCJwYXJzZSBlcnJvcjsgYWxzbyB2aXJ0dWFsIG1lbW9yeSBleGNlZWRlZCIpOworCX0KKyAgICAgIGVsc2UKKyNlbmRpZiAvKiBZWUVSUk9SX1ZFUkJPU0UgKi8KKwl5eWVycm9yKCJwYXJzZSBlcnJvciIpOworICAgIH0KKworICBnb3RvIHl5ZXJybGFiMTsKK3l5ZXJybGFiMTogICAvKiBoZXJlIG9uIGVycm9yIHJhaXNlZCBleHBsaWNpdGx5IGJ5IGFuIGFjdGlvbiAqLworCisgIGlmICh5eWVycnN0YXR1cyA9PSAzKQorICAgIHsKKyAgICAgIC8qIGlmIGp1c3QgdHJpZWQgYW5kIGZhaWxlZCB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4gYWZ0ZXIgYW4gZXJyb3IsIGRpc2NhcmQgaXQuICAqLworCisgICAgICAvKiByZXR1cm4gZmFpbHVyZSBpZiBhdCBlbmQgb2YgaW5wdXQgKi8KKyAgICAgIGlmICh5eWNoYXIgPT0gWVlFT0YpCisJWVlBQk9SVDsKKworI2lmIFlZREVCVUcgIT0gMAorICAgICAgaWYgKHl5ZGVidWcpCisJZnByaW50ZihzdGRlcnIsICJEaXNjYXJkaW5nIHRva2VuICVkICglcykuXG4iLCB5eWNoYXIsIHl5dG5hbWVbeXljaGFyMV0pOworI2VuZGlmCisKKyAgICAgIHl5Y2hhciA9IFlZRU1QVFk7CisgICAgfQorCisgIC8qIEVsc2Ugd2lsbCB0cnkgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuCisgICAgIGFmdGVyIHNoaWZ0aW5nIHRoZSBlcnJvciB0b2tlbi4gICovCisKKyAgeXllcnJzdGF0dXMgPSAzOwkJLyogRWFjaCByZWFsIHRva2VuIHNoaWZ0ZWQgZGVjcmVtZW50cyB0aGlzICovCisKKyAgZ290byB5eWVycmhhbmRsZTsKKworeXllcnJkZWZhdWx0OiAgLyogY3VycmVudCBzdGF0ZSBkb2VzIG5vdCBkbyBhbnl0aGluZyBzcGVjaWFsIGZvciB0aGUgZXJyb3IgdG9rZW4uICovCisKKyNpZiAwCisgIC8qIFRoaXMgaXMgd3Jvbmc7IG9ubHkgc3RhdGVzIHRoYXQgZXhwbGljaXRseSB3YW50IGVycm9yIHRva2VucworICAgICBzaG91bGQgc2hpZnQgdGhlbS4gICovCisgIHl5biA9IHl5ZGVmYWN0W3l5c3RhdGVdOyAgLyogSWYgaXRzIGRlZmF1bHQgaXMgdG8gYWNjZXB0IGFueSB0b2tlbiwgb2suICBPdGhlcndpc2UgcG9wIGl0LiovCisgIGlmICh5eW4pIGdvdG8geXlkZWZhdWx0OworI2VuZGlmCisKK3l5ZXJycG9wOiAgIC8qIHBvcCB0aGUgY3VycmVudCBzdGF0ZSBiZWNhdXNlIGl0IGNhbm5vdCBoYW5kbGUgdGhlIGVycm9yIHRva2VuICovCisKKyAgaWYgKHl5c3NwID09IHl5c3MpIFlZQUJPUlQ7CisgIHl5dnNwLS07CisgIHl5c3RhdGUgPSAqLS15eXNzcDsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgeXlsc3AtLTsKKyNlbmRpZgorCisjaWYgWVlERUJVRyAhPSAwCisgIGlmICh5eWRlYnVnKQorICAgIHsKKyAgICAgIHNob3J0ICpzc3AxID0geXlzcyAtIDE7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogc3RhdGUgc3RhY2sgbm93Iik7CisgICAgICB3aGlsZSAoc3NwMSAhPSB5eXNzcCkKKwlmcHJpbnRmIChzdGRlcnIsICIgJWQiLCAqKytzc3AxKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7CisgICAgfQorI2VuZGlmCisKK3l5ZXJyaGFuZGxlOgorCisgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKKyAgaWYgKHl5biA9PSBZWUZMQUcpCisgICAgZ290byB5eWVycmRlZmF1bHQ7CisKKyAgeXluICs9IFlZVEVSUk9SOworICBpZiAoeXluIDwgMCB8fCB5eW4gPiBZWUxBU1QgfHwgeXljaGVja1t5eW5dICE9IFlZVEVSUk9SKQorICAgIGdvdG8geXllcnJkZWZhdWx0OworCisgIHl5biA9IHl5dGFibGVbeXluXTsKKyAgaWYgKHl5biA8IDApCisgICAgeworICAgICAgaWYgKHl5biA9PSBZWUZMQUcpCisJZ290byB5eWVycnBvcDsKKyAgICAgIHl5biA9IC15eW47CisgICAgICBnb3RvIHl5cmVkdWNlOworICAgIH0KKyAgZWxzZSBpZiAoeXluID09IDApCisgICAgZ290byB5eWVycnBvcDsKKworICBpZiAoeXluID09IFlZRklOQUwpCisgICAgWVlBQ0NFUFQ7CisKKyNpZiBZWURFQlVHICE9IDAKKyAgaWYgKHl5ZGVidWcpCisgICAgZnByaW50ZihzdGRlcnIsICJTaGlmdGluZyBlcnJvciB0b2tlbiwgIik7CisjZW5kaWYKKworICAqKyt5eXZzcCA9IHl5bHZhbDsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgKisreXlsc3AgPSB5eWxsb2M7CisjZW5kaWYKKworICB5eXN0YXRlID0geXluOworICBnb3RvIHl5bmV3c3RhdGU7CisKKyB5eWFjY2VwdGxhYjoKKyAgLyogWVlBQ0NFUFQgY29tZXMgaGVyZS4gICovCisgIGlmICh5eWZyZWVfc3RhY2tzKQorICAgIHsKKyAgICAgIGZyZWUgKHl5c3MpOworICAgICAgZnJlZSAoeXl2cyk7CisjaWZkZWYgWVlMU1BfTkVFREVECisgICAgICBmcmVlICh5eWxzKTsKKyNlbmRpZgorICAgIH0KKyAgcmV0dXJuIDA7CisKKyB5eWFib3J0bGFiOgorICAvKiBZWUFCT1JUIGNvbWVzIGhlcmUuICAqLworICBpZiAoeXlmcmVlX3N0YWNrcykKKyAgICB7CisgICAgICBmcmVlICh5eXNzKTsKKyAgICAgIGZyZWUgKHl5dnMpOworI2lmZGVmIFlZTFNQX05FRURFRAorICAgICAgZnJlZSAoeXlscyk7CisjZW5kaWYKKyAgICB9CisgIHJldHVybiAxOworfQorI2xpbmUgMTczICJtaW5pY29tcC55IgorCisKKyNpbmNsdWRlICJtaW5pY29tcGxleGVyLmMiCisKZGlmZiAtLWdpdCBhL21pbmljb21wZy50YWIuYyBiL21pbmljb21wZy50YWIuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMjdiYWUwCi0tLSAvZGV2L251bGwKKysrIGIvbWluaWNvbXBnLnRhYi5jCkBAIC0wLDAgKzEsMTE4NyBAQAorCisvKiAgQSBCaXNvbiBwYXJzZXIsIG1hZGUgZnJvbSBtaW5pY29tcGcueQorIGJ5ICBHTlUgQmlzb24gdmVyc2lvbiAxLjI3CisgICovCisKKyNkZWZpbmUgWVlCSVNPTiAxICAvKiBJZGVudGlmeSBCaXNvbiBvdXRwdXQuICAqLworCisjZGVmaW5lCVRLTlVNQkVSCTI1NworI2RlZmluZQlUS0lERU5USUZJRVIJMjU4CisjZGVmaW5lCVRLUkVBTAkyNTkKKyNkZWZpbmUJVEtJTlQJMjYwCisjZGVmaW5lCVRLTEVRCTI2MQorI2RlZmluZQlUS0dFUQkyNjIKKyNkZWZpbmUJVEtORVEJMjYzCisjZGVmaW5lCVRLSUYJMjY0CisjZGVmaW5lCVRLRUxTRQkyNjUKKyNkZWZpbmUJVEtXSElMRQkyNjYKKyNkZWZpbmUJVEtSRVRVUk4JMjY3CisjZGVmaW5lCVRLQVNTSUdOCTI2OAorI2RlZmluZQlUS0FORAkyNjkKKyNkZWZpbmUJVEtPUgkyNzAKKworI2xpbmUgMTggIm1pbmljb21wZy55IgorCisjaW5jbHVkZSAibWluaWNvbXAuaCIKKwordHlwZWRlZiB2b2lkICp2b2lkcHRyOworI2RlZmluZSBZWVNUWVBFIHZvaWRwdHIKKyNpZm5kZWYgWVlTVFlQRQorI2RlZmluZSBZWVNUWVBFIGludAorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmbmRlZiBfX2NwbHVzcGx1cworI2lmbmRlZiBfX1NURENfXworI2RlZmluZSBjb25zdAorI2VuZGlmCisjZW5kaWYKKworCisKKyNkZWZpbmUJWVlGSU5BTAkJMTIzCisjZGVmaW5lCVlZRkxBRwkJLTMyNzY4CisjZGVmaW5lCVlZTlRCQVNFCTMyCisKKyNkZWZpbmUgWVlUUkFOU0xBVEUoeCkgKCh1bnNpZ25lZCkoeCkgPD0gMjcwID8geXl0cmFuc2xhdGVbeF0gOiA2NCkKKworc3RhdGljIGNvbnN0IGNoYXIgeXl0cmFuc2xhdGVbXSA9IHsgICAgIDAsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgMjMsCisgICAgMjQsICAgIDI3LCAgICAyNSwgICAgMjksICAgIDI2LCAgICAgMiwgICAgMjgsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAxOSwgICAgMjEsCisgICAgMjAsICAgIDIyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgMTcsICAgICAyLCAgICAxOCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAzMCwgICAgIDIsICAgIDMxLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsCisgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYKK307CisKKyNpZiBZWURFQlVHICE9IDAKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXByaHNbXSA9IHsgICAgIDAsCisgICAgIDAsICAgICAzLCAgICAgNSwgICAgIDcsICAgICA5LCAgICAxMSwgICAgMTMsICAgIDE4LCAgICAyMSwgICAgMjMsCisgICAgMjcsICAgIDI5LCAgICAzMywgICAgMzcsICAgIDM5LCAgICA0MywgICAgNDcsICAgIDUxLCAgICA1NSwgICAgNTksCisgICAgNjMsICAgIDY3LCAgICA3MSwgICAgNzUsICAgIDc3LCAgICA4MSwgICAgODUsICAgIDg3LCAgICA5MSwgICAgOTMsCisgICAgOTgsICAgMTAyLCAgIDEwNCwgICAxMDksICAgMTExLCAgIDExMywgICAxMTcsICAgMTE5LCAgIDEyMiwgICAxMjQsCisgICAxMjYsICAgMTI4LCAgIDEzMCwgICAxMzIsICAgMTM0LCAgIDEzNSwgICAxMzksICAgMTQzLCAgIDE0NiwgICAxNDksCisgICAxNTEsICAgMTUyLCAgIDE2MCwgICAxNjEsICAgMTYyLCAgIDE2NiwgICAxNjcsICAgMTc0LCAgIDE3OSwgICAxODMsCisgICAxODYsICAgMTkwLCAgIDE5NCwgICAxOTcsICAgMjAxLCAgIDIwMworfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHl5cmhzW10gPSB7ICAgIDMyLAorICAgIDMzLCAgICAgMCwgICAgMzMsICAgICAwLCAgICA1OSwgICAgIDAsICAgIDM2LCAgICAgMCwgICAgIDUsICAgICAwLAorICAgICA2LCAgICAgMCwgICAgMzQsICAgIDE3LCAgICA0MCwgICAgMTgsICAgICAwLCAgICAzNSwgICAgMzYsICAgICAwLAorICAgIDM2LCAgICAgMCwgICAgMzQsICAgIDM3LCAgICAxOSwgICAgIDAsICAgICA0LCAgICAgMCwgICAgMzgsICAgIDE1LAorICAgIDM5LCAgICAgMCwgICAgMzgsICAgIDE2LCAgICAzOSwgICAgIDAsICAgIDM5LCAgICAgMCwgICAgNDAsICAgIDIwLAorICAgIDQwLCAgICAgMCwgICAgNDAsICAgICA5LCAgICA0MCwgICAgIDAsICAgIDQwLCAgICAyMSwgICAgNDAsICAgICAwLAorICAgIDQwLCAgICAyMiwgICAgNDAsICAgICAwLCAgICA0MCwgICAgIDcsICAgIDQwLCAgICAgMCwgICAgNDAsICAgICA4LAorICAgIDQwLCAgICAgMCwgICAgMjMsICAgIDM4LCAgICAyNCwgICAgIDAsICAgIDQwLCAgICAyNSwgICAgNDEsICAgICAwLAorICAgIDQwLCAgICAyNiwgICAgNDEsICAgICAwLCAgICA0MSwgICAgIDAsICAgIDQxLCAgICAyNywgICAgNDIsICAgICAwLAorICAgIDQxLCAgICAyOCwgICAgNDIsICAgICAwLCAgICA0MiwgICAgIDAsICAgIDIzLCAgICA0MCwgICAgMjQsICAgICAwLAorICAgICAzLCAgICAgMCwgICAgNDQsICAgIDIzLCAgICA0NSwgICAgMjQsICAgICAwLCAgICA0NCwgICAgMjMsICAgIDI0LAorICAgICAwLCAgICA0MywgICAgIDAsICAgIDQyLCAgICAxNywgICAgNDAsICAgIDE4LCAgICAgMCwgICAgNDQsICAgICAwLAorICAgICA0LCAgICAgMCwgICAgNDUsICAgIDI5LCAgICA0MCwgICAgIDAsICAgIDQwLCAgICAgMCwgICAgNDYsICAgIDQ3LAorICAgICAwLCAgICA0NywgICAgIDAsICAgIDUxLCAgICAgMCwgICAgNTUsICAgICAwLCAgICA1NywgICAgIDAsICAgIDU4LAorICAgICAwLCAgICA0OCwgICAgIDAsICAgICAwLCAgICAzMCwgICAgNDksICAgIDUwLCAgICAgMCwgICAgMzUsICAgIDQ2LAorICAgIDMxLCAgICAgMCwgICAgNDYsICAgIDMxLCAgICAgMCwgICAgMzUsICAgIDMxLCAgICAgMCwgICAgMzEsICAgICAwLAorICAgICAwLCAgICAxMCwgICAgMjMsICAgIDM4LCAgICAyNCwgICAgNTIsICAgIDQ4LCAgICA1MywgICAgIDAsICAgICAwLAorICAgICAwLCAgICAxMSwgICAgNTQsICAgIDQ4LCAgICAgMCwgICAgIDAsICAgIDEyLCAgICAyMywgICAgMzgsICAgIDI0LAorICAgIDU2LCAgICA0OCwgICAgIDAsICAgIDQzLCAgICAxNCwgICAgNDAsICAgIDE5LCAgICAgMCwgICAgMTMsICAgIDQwLAorICAgIDE5LCAgICAgMCwgICAgNjAsICAgIDYxLCAgICAgMCwgICAgMzQsICAgIDM3LCAgICAyMywgICAgIDAsICAgIDYyLAorICAgIDI0LCAgICA0OCwgICAgIDAsICAgIDI0LCAgICA0OCwgICAgIDAsICAgIDYyLCAgICAyOSwgICAgNjMsICAgICAwLAorICAgIDYzLCAgICAgMCwgICAgMzQsICAgIDM3LCAgICAgMAorfTsKKworI2VuZGlmCisKKyNpZiBZWURFQlVHICE9IDAKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXJsaW5lW10gPSB7IDAsCisgICAgMjcsICAgIDI5LCAgICAzMiwgICAgMzQsICAgIDM3LCAgICAzOSwgICAgNDAsICAgIDQzLCAgICA0NSwgICAgNDgsCisgICAgNTIsICAgIDU2LCAgICA1OCwgICAgNTksICAgIDYyLCAgICA2NCwgICAgNjUsICAgIDY2LCAgICA2NywgICAgNjgsCisgICAgNjksICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgyLCAgICA4NCwgICAgODUsCisgICAgODYsICAgIDg3LCAgICA5MCwgICAgOTIsICAgIDk1LCAgICA5OSwgICAxMDEsICAgMTA0LCAgIDEwNiwgICAxMDksCisgICAxMTEsICAgMTEyLCAgIDExMywgICAxMTQsICAgMTE3LCAgIDExOSwgICAxMjEsICAgMTIzLCAgIDEyNCwgICAxMjUsCisgICAxMjksICAgMTMwLCAgIDEzMywgICAxMzUsICAgMTM1LCAgIDEzOSwgICAxNDAsICAgMTQzLCAgIDE0NywgICAxNTEsCisgICAxNTUsICAgMTU5LCAgIDE2MSwgICAxNjQsICAgMTY2LCAgIDE2OQorfTsKKyNlbmRpZgorCisKKyNpZiBZWURFQlVHICE9IDAgfHwgZGVmaW5lZCAoWVlFUlJPUl9WRVJCT1NFKQorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHl5dG5hbWVbXSA9IHsgICAiJCIsImVycm9yIiwiJHVuZGVmaW5lZC4iLCJUS05VTUJFUiIsCisiVEtJREVOVElGSUVSIiwiVEtSRUFMIiwiVEtJTlQiLCJUS0xFUSIsIlRLR0VRIiwiVEtORVEiLCJUS0lGIiwiVEtFTFNFIiwiVEtXSElMRSIsCisiVEtSRVRVUk4iLCJUS0FTU0lHTiIsIlRLQU5EIiwiVEtPUiIsIidbJyIsIiddJyIsIic7JyIsIic9JyIsIic8JyIsIic+JyIsIicoJyIsCisiJyknIiwiJysnIiwiJy0nIiwiJyonIiwiJy8nIiwiJywnIiwiJ3snIiwiJ30nIiwiZ2xvYl9kZWNsX2xpc3QiLCJnbG9iX2RlY2wiLAorInR5cGUiLCJkZWNsX2xpc3QiLCJkZWNsIiwiZGVjbF9pZCIsImNvbmRfZXhwciIsImFvX2V4cHIiLCJhcml0aF9leHByIiwidGVybSIsCisiZmFjdG9yIiwibHZhbHVlIiwidmFyaWFibGUiLCJhcmdfbGlzdCIsInN0bXRfbGlzdCIsInN0bXQiLCJibG9jayIsIkAxIiwiYmxvY2tfZW5kIiwKKyJpZl9zdG10IiwiQDIiLCJlbHNlX3BhcnQiLCJAMyIsIndoaWxlX3N0bXQiLCJANCIsImFzc2duX3N0bXQiLCJyZXR1cm5fc3RtdCIsCisiZnVuY19kZWNsIiwiZnVuY19kZWNsX2JlZ2luIiwiZnVuY19kZWNsX2VuZCIsInBhcl9saXN0IiwicGFyX2RlY2wiLCBOVUxMCit9OworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXIxW10gPSB7ICAgICAwLAorICAgIDMyLCAgICAzMiwgICAgMzMsICAgIDMzLCAgICAzNCwgICAgMzQsICAgIDM0LCAgICAzNSwgICAgMzUsICAgIDM2LAorICAgIDM3LCAgICAzOCwgICAgMzgsICAgIDM4LCAgICAzOSwgICAgMzksICAgIDM5LCAgICAzOSwgICAgMzksICAgIDM5LAorICAgIDM5LCAgICA0MCwgICAgNDAsICAgIDQwLCAgICA0MSwgICAgNDEsICAgIDQxLCAgICA0MiwgICAgNDIsICAgIDQyLAorICAgIDQyLCAgICA0MiwgICAgNDMsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ1LCAgICA0NiwgICAgNDYsICAgIDQ3LAorICAgIDQ3LCAgICA0NywgICAgNDcsICAgIDQ3LCAgICA0OSwgICAgNDgsICAgIDUwLCAgICA1MCwgICAgNTAsICAgIDUwLAorICAgIDUyLCAgICA1MSwgICAgNTMsICAgIDU0LCAgICA1MywgICAgNTYsICAgIDU1LCAgICA1NywgICAgNTgsICAgIDU5LAorICAgIDYwLCAgICA2MSwgICAgNjEsICAgIDYyLCAgICA2MiwgICAgNjMKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXIyW10gPSB7ICAgICAwLAorICAgICAyLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICA0LCAgICAgMiwgICAgIDEsICAgICAzLAorICAgICAxLCAgICAgMywgICAgIDMsICAgICAxLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLAorICAgICAzLCAgICAgMywgICAgIDMsICAgICAxLCAgICAgMywgICAgIDMsICAgICAxLCAgICAgMywgICAgIDEsICAgICA0LAorICAgICAzLCAgICAgMSwgICAgIDQsICAgICAxLCAgICAgMSwgICAgIDMsICAgICAxLCAgICAgMiwgICAgIDEsICAgICAxLAorICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMCwgICAgIDMsICAgICAzLCAgICAgMiwgICAgIDIsICAgICAxLAorICAgICAwLCAgICAgNywgICAgIDAsICAgICAwLCAgICAgMywgICAgIDAsICAgICA2LCAgICAgNCwgICAgIDMsICAgICAyLAorICAgICAzLCAgICAgMywgICAgIDIsICAgICAzLCAgICAgMSwgICAgIDIKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eWRlZmFjdFtdID0geyAgICAgMCwKKyAgICAgNSwgICAgIDYsICAgICAwLCAgICAgMiwgICAgIDAsICAgICA0LCAgICAgMywgICAgIDAsICAgICAxLCAgICAxMSwKKyAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgNjAsICAgICAwLCAgICA2NSwgICAgMjksICAgIDM1LCAgICAgMCwKKyAgICAgMCwgICAgMjQsICAgIDI3LCAgICAzMiwgICAgMzQsICAgIDEwLCAgICA2MSwgICAgNDUsICAgIDYzLCAgICA2NiwKKyAgICAgMCwgICAgIDAsICAgICAwLCAgICAgNywgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgMCwgICAgNjIsICAgIDY0LCAgICAyOCwgICAgMjIsICAgIDIzLCAgICAyNSwgICAgMjYsICAgICAwLCAgICAzMSwKKyAgICAzNywgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDUwLCAgICAgMCwgICAgIDAsICAgICA5LCAgICAgMCwKKyAgICAzMiwgICAgIDAsICAgIDM5LCAgICA0NCwgICAgNDYsICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICAzMywKKyAgICAzMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA0OSwgICAgIDgsICAgICAwLCAgICAgMCwKKyAgICA0OCwgICAgMzgsICAgIDM2LCAgICAgMCwgICAgIDAsICAgIDE0LCAgICAgMCwgICAgIDAsICAgIDU5LCAgICA0NywKKyAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDUxLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgMCwgICAgIDAsICAgIDU2LCAgICA1OCwgICAgMjEsICAgIDEyLCAgICAxMywgICAgIDAsICAgIDE5LCAgICAyMCwKKyAgICAxNiwgICAgMTUsICAgIDE3LCAgICAxOCwgICAgIDAsICAgIDUzLCAgICA1NywgICAgNTQsICAgIDUyLCAgICAgMCwKKyAgICA1NSwgICAgIDAsICAgICAwCit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgeXlkZWZnb3RvW10gPSB7ICAgICAzLAorICAgICA0LCAgICAgNSwgICAgNTgsICAgICA2LCAgICAxMiwgICAgODUsICAgIDg2LCAgICA4NywgICAgMjIsICAgIDIzLAorICAgIDI0LCAgICAyNSwgICAgNTIsICAgIDYyLCAgICA2MywgICAgNjQsICAgIDQxLCAgICA2NSwgICAgNjYsICAgMTA4LAorICAgMTE5LCAgIDEyMCwgICAgNjcsICAgMTE1LCAgICA2OCwgICAgNjksICAgICA3LCAgICAgOCwgICAgMTUsICAgIDE2LAorICAgIDE3Cit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgeXlwYWN0W10gPSB7ICAgIDMzLAorLTMyNzY4LC0zMjc2OCwgICAxNDgsLTMyNzY4LCAgICAyNywtMzI3NjgsLTMyNzY4LCAgICAgMCwtMzI3NjgsLTMyNzY4LAorICAgIDUwLCAgICA3NSwgICAtMjEsICAgIDI3LC0zMjc2OCwgICAxMjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgIDUwLAorICAgIDI1LCAgIDEwMiwgICAgLTUsLTMyNzY4LCAgICAzMiwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LAorICAgLTIxLCAgICAzMywgICAxMzcsLTMyNzY4LCAgICA1MCwgICAgNTAsICAgIDUwLCAgICA1MCwgICAgNTAsICAgIDQ0LAorICAgIDEwLC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgIDEwMiwgICAxMDIsICAgIC01LCAgICAtNSwgICAgNDYsLTMyNzY4LAorICAgMTMzLCAgIDEzMSwgICAgNzgsICAgIDgxLCAgICA1MCwtMzI3NjgsICAgIDI3LCAgICA1MywtMzI3NjgsICAgIC01LAorICAgIDU1LCAgICA5MywtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LAorLTMyNzY4LCAgICA1MCwgICAgNTcsICAgIDU3LCAgICA1NiwgICAgNjAsLTMyNzY4LC0zMjc2OCwgICAxMDUsICAgIDUwLAorLTMyNzY4LC0zMjc2OCwgICAxMzMsICAgIDU3LCAgICA2MiwtMzI3NjgsICAgMTI1LCAgICA5NSwtMzI3NjgsLTMyNzY4LAorICAgIDc0LCAgICA5NywgICAxMTgsICAgIDU3LCAgICA1NywtMzI3NjgsICAgIDUwLCAgICA1MCwgICAgNTAsICAgIDUwLAorICAgIDUwLCAgICA1MCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgIC0yMSwgICAxMzMsICAgMTMzLAorICAgMTMzLCAgIDEzMywgICAxMzMsICAgMTMzLCAgIC0yMSwgICAxMDMsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgLTIxLAorLTMyNzY4LCAgICA4NSwtMzI3NjgKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXBnb3RvW10gPSB7LTMyNzY4LAorICAgMTE3LCAgICAtNiwtMzI3NjgsICAgLTI0LCAgIC0xMSwgICAtNDcsICAgIDcwLCAgIC0xMCwgICAxMzIsICAgLTMwLAorICAgLTM3LC0zMjc2OCwtMzI3NjgsICAgIDY0LCAgIC00MywgICAtMTMsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LAorLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LAorICAgIDk5Cit9OworCisKKyNkZWZpbmUJWVlMQVNUCQkxNjgKKworCitzdGF0aWMgY29uc3Qgc2hvcnQgeXl0YWJsZVtdID0geyAgICAyOSwKKyAgICAyMSwgICAgMTQsICAgIDMwLCAgICA2MSwgICAgIDEsICAgICAyLCAgICA0NywgICAgNDgsICAgIDI4LCAgICAzMywKKyAgICA2MCwgICAgMzksICAgIDE4LCAgICAxOSwgICAgIDEsICAgICAyLCAgICA1OSwgICAgNDIsICAgIDgyLCAgICA1MywKKyAgICA2MSwgICAgNTQsICAgIDU1LCAgICAxMywgICAgNjEsICAgIDE0LCAgICA4OCwgICAgNjAsICAgIDQ5LCAgICA1MSwKKyAgICAxMCwgICAgNjAsICAgIDIwLCAgICA3OCwgICAgNTcsICAgIDgyLCAgICA5MiwgICAgIDEsICAgICAyLCAgICAyOCwKKyAgICA1NiwgICAgNjEsICAgIDM0LCAgICAxMSwgICAgNzUsICAgIDc2LCAgICAxOCwgICAgMTksICAgIDYwLCAgICAzNSwKKyAgICAzNiwgICAgNTcsICAgIDE4LCAgICAxOSwgICAgNDAsICAgIDE4LCAgICAxOSwgICAgIDEsICAgICAyLCAgICAxOCwKKyAgICAxOSwgICAgODMsICAgIDUzLCAgICA3MCwgICAgNTQsICAgIDU1LCAgICAyMCwgICAgNTAsICAgIDgwLCAgICA5MSwKKyAgICAzNSwgICAgMzYsICAgIDIwLCAgICA5MywgICAgODksICAgIDIwLCAgICA5NCwgICAgOTUsICAgIDI2LCAgICA4NCwKKyAgICAzNSwgICAgMzYsICAgIDI4LCAgICA3NywgICAxMjMsICAgIDk2LCAgIDEwOSwgICAxMTAsICAgMTExLCAgIDExMiwKKyAgIDExMywgICAxMTQsICAgMTA0LCAgICAyNiwgICAxMTYsICAgIDE4LCAgICAxOSwgICAgMjcsICAgIDM1LCAgICAzNiwKKyAgICA3MywgICAxMTcsICAgIDUzLCAgICA3NCwgICAgNTQsICAgIDU1LCAgIDEyMSwgICAgMTgsICAgIDE5LCAgICA5NCwKKyAgICA5NSwgICAgOTQsICAgIDk1LCAgIDExOCwgICAgNTMsICAgIDIwLCAgICA1NCwgICAgNTUsICAgMTAzLCAgICAgOSwKKyAgIDEwNSwgICAgNzksICAgIDI4LCAgICA4MSwgICAgOTcsICAgIDk4LCAgICA5OSwgICAgMjAsICAgIDM3LCAgICAzOCwKKyAgICA0MywgICAgOTcsICAgIDk4LCAgICA5OSwgICAgMjgsICAgIDkwLCAgICAgMCwgICAxMDAsICAgMTAxLCAgIDEwMiwKKyAgICAgMCwgICAgNDQsICAgIDM1LCAgICAzNiwgICAxMDAsICAgMTAxLCAgIDEwMiwgICAxMjIsICAgICAwLCAgICAzNSwKKyAgICAzNiwgICAgMzEsICAgICAxLCAgICAgMiwgICAgNzEsICAgICAwLCAgICAzMiwgICAgMzUsICAgIDM2LCAgICA3MiwKKyAgICA0NCwgICAgMzUsICAgIDM2LCAgIDEwNiwgICAxMDcsICAgICAwLCAgICA0NSwgICAgNDYKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eWNoZWNrW10gPSB7ICAgIDEzLAorICAgIDExLCAgICAgOCwgICAgMTQsICAgIDQxLCAgICAgNSwgICAgIDYsICAgIDM3LCAgICAzOCwgICAgMzAsICAgIDIwLAorICAgIDQxLCAgICAxNywgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgIDQxLCAgICAzMSwgICAgNjIsICAgIDEwLAorICAgIDU4LCAgICAxMiwgICAgMTMsICAgIDI0LCAgICA2MiwgICAgMzIsICAgIDc0LCAgICA1OCwgICAgMzksICAgIDQwLAorICAgICA0LCAgICA2MiwgICAgMjMsICAgIDU4LCAgICA0MSwgICAgNzksICAgIDg0LCAgICAgNSwgICAgIDYsICAgIDMwLAorICAgIDMxLCAgICA3OSwgICAgMTgsICAgIDE3LCAgICA1NSwgICAgNTcsICAgICAzLCAgICAgNCwgICAgNzksICAgIDI1LAorICAgIDI2LCAgICA1OCwgICAgIDMsICAgICA0LCAgICAyMywgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICAzLAorICAgICA0LCAgICA3MiwgICAgMTAsICAgIDE4LCAgICAxMiwgICAgMTMsICAgIDIzLCAgICAyNCwgICAgMTQsICAgIDgwLAorICAgIDI1LCAgICAyNiwgICAgMjMsICAgIDg0LCAgICAxOSwgICAgMjMsICAgIDE1LCAgICAxNiwgICAgMTksICAgIDIzLAorICAgIDI1LCAgICAyNiwgICAgMzAsICAgIDMxLCAgICAgMCwgICAgMjQsICAgIDk3LCAgICA5OCwgICAgOTksICAgMTAwLAorICAgMTAxLCAgIDEwMiwgICAgMTksICAgIDE5LCAgIDEwOCwgICAgIDMsICAgICA0LCAgICAyMywgICAgMjUsICAgIDI2LAorICAgIDIzLCAgIDExNSwgICAgMTAsICAgIDIzLCAgICAxMiwgICAgMTMsICAgMTIwLCAgICAgMywgICAgIDQsICAgIDE1LAorICAgIDE2LCAgICAxNSwgICAgMTYsICAgIDExLCAgICAxMCwgICAgMjMsICAgIDEyLCAgICAxMywgICAgMjQsICAgICAzLAorICAgIDI0LCAgICA1OCwgICAgMzAsICAgIDMxLCAgICAgNywgICAgIDgsICAgICA5LCAgICAyMywgICAgMjcsICAgIDI4LAorICAgIDMyLCAgICAgNywgICAgIDgsICAgICA5LCAgICAzMCwgICAgMzEsICAgIC0xLCAgICAyMCwgICAgMjEsICAgIDIyLAorICAgIC0xLCAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAgMCwgICAgLTEsICAgIDI1LAorICAgIDI2LCAgICAyNCwgICAgIDUsICAgICA2LCAgICAyNCwgICAgLTEsICAgIDI5LCAgICAyNSwgICAgMjYsICAgIDI5LAorICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDk0LCAgICA5NSwgICAgLTEsICAgIDM1LCAgICAzNgorfTsKKy8qIC0qLUMtKi0gIE5vdGUgc29tZSBjb21waWxlcnMgY2hva2Ugb24gY29tbWVudHMgb24gYCNsaW5lJyBsaW5lcy4gICovCisjbGluZSAzICIvdXNyL3NoYXJlL2Jpc29uLnNpbXBsZSIKKy8qIFRoaXMgZmlsZSBjb21lcyBmcm9tIGJpc29uLTEuMjcuICAqLworCisvKiBTa2VsZXRvbiBvdXRwdXQgcGFyc2VyIGZvciBiaXNvbiwKKyAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OSwgMTk5MCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHdoZW4gdGhpcyBmaWxlIGlzIGNvcGllZCBieSBCaXNvbiBpbnRvIGEKKyAgIEJpc29uIG91dHB1dCBmaWxlLCB5b3UgbWF5IHVzZSB0aGF0IG91dHB1dCBmaWxlIHdpdGhvdXQgcmVzdHJpY3Rpb24uCisgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgICBpbiB2ZXJzaW9uIDEuMjQgb2YgQmlzb24uICAqLworCisvKiBUaGlzIGlzIHRoZSBwYXJzZXIgY29kZSB0aGF0IGlzIHdyaXR0ZW4gaW50byBlYWNoIGJpc29uIHBhcnNlcgorICB3aGVuIHRoZSAlc2VtYW50aWNfcGFyc2VyIGRlY2xhcmF0aW9uIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGdyYW1tYXIuCisgIEl0IHdhcyB3cml0dGVuIGJ5IFJpY2hhcmQgU3RhbGxtYW4gYnkgc2ltcGxpZnlpbmcgdGhlIGhhaXJ5IHBhcnNlcgorICB1c2VkIHdoZW4gJXNlbWFudGljX3BhcnNlciBpcyBzcGVjaWZpZWQuICAqLworCisjaWZuZGVmIFlZU1RBQ0tfVVNFX0FMTE9DQQorI2lmZGVmIGFsbG9jYQorI2RlZmluZSBZWVNUQUNLX1VTRV9BTExPQ0EKKyNlbHNlIC8qIGFsbG9jYSBub3QgZGVmaW5lZCAqLworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIFlZU1RBQ0tfVVNFX0FMTE9DQQorI2RlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorI2Vsc2UgLyogbm90IEdOVSBDLiAgKi8KKyNpZiAoIWRlZmluZWQgKF9fU1REQ19fKSAmJiBkZWZpbmVkIChzcGFyYykpIHx8IGRlZmluZWQgKF9fc3BhcmNfXykgfHwgZGVmaW5lZCAoX19zcGFyYykgfHwgZGVmaW5lZCAoX19zZ2kpIHx8IChkZWZpbmVkIChfX3N1bikgJiYgZGVmaW5lZCAoX19pMzg2KSkKKyNkZWZpbmUgWVlTVEFDS19VU0VfQUxMT0NBCisjaW5jbHVkZSA8YWxsb2NhLmg+CisjZWxzZSAvKiBub3Qgc3BhcmMgKi8KKy8qIFdlIHRoaW5rIHRoaXMgdGVzdCBkZXRlY3RzIFdhdGNvbSBhbmQgTWljcm9zb2Z0IEMuICAqLworLyogVGhpcyB1c2VkIHRvIHRlc3QgTVNET1MsIGJ1dCB0aGF0IGlzIGEgYmFkIGlkZWEKKyAgIHNpbmNlIHRoYXQgc3ltYm9sIGlzIGluIHRoZSB1c2VyIG5hbWVzcGFjZS4gICovCisjaWYgKGRlZmluZWQgKF9NU0RPUykgfHwgZGVmaW5lZCAoX01TRE9TXykpICYmICFkZWZpbmVkIChfX1RVUkJPQ19fKQorI2lmIDAgLyogTm8gbmVlZCBmb3IgbWFsbG9jLmgsIHdoaWNoIHBvbGx1dGVzIHRoZSBuYW1lc3BhY2U7CisJIGluc3RlYWQsIGp1c3QgZG9uJ3QgdXNlIGFsbG9jYS4gICovCisjaW5jbHVkZSA8bWFsbG9jLmg+CisjZW5kaWYKKyNlbHNlIC8qIG5vdCBNU0RPUywgb3IgX19UVVJCT0NfXyAqLworI2lmIGRlZmluZWQoX0FJWCkKKy8qIEkgZG9uJ3Qga25vdyB3aGF0IHRoaXMgd2FzIG5lZWRlZCBmb3IsIGJ1dCBpdCBwb2xsdXRlcyB0aGUgbmFtZXNwYWNlLgorICAgU28gSSB0dXJuZWQgaXQgb2ZmLiAgIHJtcywgMiBNYXkgMTk5Ny4gICovCisvKiAjaW5jbHVkZSA8bWFsbG9jLmg+ICAqLworICNwcmFnbWEgYWxsb2NhCisjZGVmaW5lIFlZU1RBQ0tfVVNFX0FMTE9DQQorI2Vsc2UgLyogbm90IE1TRE9TLCBvciBfX1RVUkJPQ19fLCBvciBfQUlYICovCisjaWYgMAorI2lmZGVmIF9faHB1eCAvKiBoYWlibGVAaWxvZy5mciBzYXlzIHRoaXMgd29ya3MgZm9yIEhQVVggOS4wNSBhbmQgdXAsCisJCSBhbmQgb24gSFBVWCAxMC4gIEV2ZW50dWFsbHkgd2UgY2FuIHR1cm4gdGhpcyBvbi4gICovCisjZGVmaW5lIFlZU1RBQ0tfVVNFX0FMTE9DQQorI2RlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorI2VuZGlmIC8qIF9faHB1eCAqLworI2VuZGlmCisjZW5kaWYgLyogbm90IF9BSVggKi8KKyNlbmRpZiAvKiBub3QgTVNET1MsIG9yIF9fVFVSQk9DX18gKi8KKyNlbmRpZiAvKiBub3Qgc3BhcmMgKi8KKyNlbmRpZiAvKiBub3QgR05VIEMgKi8KKyNlbmRpZiAvKiBhbGxvY2Egbm90IGRlZmluZWQgKi8KKyNlbmRpZiAvKiBZWVNUQUNLX1VTRV9BTExPQ0Egbm90IGRlZmluZWQgKi8KKworI2lmZGVmIFlZU1RBQ0tfVVNFX0FMTE9DQQorI2RlZmluZSBZWVNUQUNLX0FMTE9DIGFsbG9jYQorI2Vsc2UKKyNkZWZpbmUgWVlTVEFDS19BTExPQyBtYWxsb2MKKyNlbmRpZgorCisvKiBOb3RlOiB0aGVyZSBtdXN0IGJlIG9ubHkgb25lIGRvbGxhciBzaWduIGluIHRoaXMgZmlsZS4KKyAgIEl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBsaXN0IG9mIGFjdGlvbnMsIGVhY2ggYWN0aW9uCisgICBhcyBvbmUgY2FzZSBvZiB0aGUgc3dpdGNoLiAgKi8KKworI2RlZmluZSB5eWVycm9rCQkoeXllcnJzdGF0dXMgPSAwKQorI2RlZmluZSB5eWNsZWFyaW4JKHl5Y2hhciA9IFlZRU1QVFkpCisjZGVmaW5lIFlZRU1QVFkJCS0yCisjZGVmaW5lIFlZRU9GCQkwCisjZGVmaW5lIFlZQUNDRVBUCWdvdG8geXlhY2NlcHRsYWIKKyNkZWZpbmUgWVlBQk9SVCAJZ290byB5eWFib3J0bGFiCisjZGVmaW5lIFlZRVJST1IJCWdvdG8geXllcnJsYWIxCisvKiBMaWtlIFlZRVJST1IgZXhjZXB0IGRvIGNhbGwgeXllcnJvci4KKyAgIFRoaXMgcmVtYWlucyBoZXJlIHRlbXBvcmFyaWx5IHRvIGVhc2UgdGhlCisgICB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgbWVhbmluZyBvZiBZWUVSUk9SLCBmb3IgR0NDLgorICAgT25jZSBHQ0MgdmVyc2lvbiAyIGhhcyBzdXBwbGFudGVkIHZlcnNpb24gMSwgdGhpcyBjYW4gZ28uICAqLworI2RlZmluZSBZWUZBSUwJCWdvdG8geXllcnJsYWIKKyNkZWZpbmUgWVlSRUNPVkVSSU5HKCkgICghIXl5ZXJyc3RhdHVzKQorI2RlZmluZSBZWUJBQ0tVUCh0b2tlbiwgdmFsdWUpIFwKK2RvCQkJCQkJCQlcCisgIGlmICh5eWNoYXIgPT0gWVlFTVBUWSAmJiB5eWxlbiA9PSAxKQkJCQlcCisgICAgeyB5eWNoYXIgPSAodG9rZW4pLCB5eWx2YWwgPSAodmFsdWUpOwkJCVwKKyAgICAgIHl5Y2hhcjEgPSBZWVRSQU5TTEFURSAoeXljaGFyKTsJCQkJXAorICAgICAgWVlQT1BTVEFDSzsJCQkJCQlcCisgICAgICBnb3RvIHl5YmFja3VwOwkJCQkJCVwKKyAgICB9CQkJCQkJCQlcCisgIGVsc2UJCQkJCQkJCVwKKyAgICB7IHl5ZXJyb3IgKCJzeW50YXggZXJyb3I6IGNhbm5vdCBiYWNrIHVwIik7IFlZRVJST1I7IH0JXAord2hpbGUgKDApCisKKyNkZWZpbmUgWVlURVJST1IJMQorI2RlZmluZSBZWUVSUkNPREUJMjU2CisKKyNpZm5kZWYgWVlQVVJFCisjZGVmaW5lIFlZTEVYCQl5eWxleCgpCisjZW5kaWYKKworI2lmZGVmIFlZUFVSRQorI2lmZGVmIFlZTFNQX05FRURFRAorI2lmZGVmIFlZTEVYX1BBUkFNCisjZGVmaW5lIFlZTEVYCQl5eWxleCgmeXlsdmFsLCAmeXlsbG9jLCBZWUxFWF9QQVJBTSkKKyNlbHNlCisjZGVmaW5lIFlZTEVYCQl5eWxleCgmeXlsdmFsLCAmeXlsbG9jKQorI2VuZGlmCisjZWxzZSAvKiBub3QgWVlMU1BfTkVFREVEICovCisjaWZkZWYgWVlMRVhfUEFSQU0KKyNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwsIFlZTEVYX1BBUkFNKQorI2Vsc2UKKyNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwpCisjZW5kaWYKKyNlbmRpZiAvKiBub3QgWVlMU1BfTkVFREVEICovCisjZW5kaWYKKworLyogSWYgbm9ucmVlbnRyYW50LCBnZW5lcmF0ZSB0aGUgdmFyaWFibGVzIGhlcmUgKi8KKworI2lmbmRlZiBZWVBVUkUKKworaW50CXl5Y2hhcjsJCQkvKiAgdGhlIGxvb2thaGVhZCBzeW1ib2wJCSovCitZWVNUWVBFCXl5bHZhbDsJCQkvKiAgdGhlIHNlbWFudGljIHZhbHVlIG9mIHRoZQkJKi8KKwkJCQkvKiAgbG9va2FoZWFkIHN5bWJvbAkJCSovCisKKyNpZmRlZiBZWUxTUF9ORUVERUQKK1lZTFRZUEUgeXlsbG9jOwkJCS8qICBsb2NhdGlvbiBkYXRhIGZvciB0aGUgbG9va2FoZWFkCSovCisJCQkJLyogIHN5bWJvbAkJCQkqLworI2VuZGlmCisKK2ludCB5eW5lcnJzOwkJCS8qICBudW1iZXIgb2YgcGFyc2UgZXJyb3JzIHNvIGZhciAgICAgICAqLworI2VuZGlmICAvKiBub3QgWVlQVVJFICovCisKKyNpZiBZWURFQlVHICE9IDAKK2ludCB5eWRlYnVnOwkJCS8qICBub256ZXJvIG1lYW5zIHByaW50IHBhcnNlIHRyYWNlCSovCisvKiBTaW5jZSB0aGlzIGlzIHVuaW5pdGlhbGl6ZWQsIGl0IGRvZXMgbm90IHN0b3AgbXVsdGlwbGUgcGFyc2VycworICAgZnJvbSBjb2V4aXN0aW5nLiAgKi8KKyNlbmRpZgorCisvKiAgWVlJTklUREVQVEggaW5kaWNhdGVzIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIHBhcnNlcidzIHN0YWNrcwkqLworCisjaWZuZGVmCVlZSU5JVERFUFRICisjZGVmaW5lIFlZSU5JVERFUFRIIDIwMAorI2VuZGlmCisKKy8qICBZWU1BWERFUFRIIGlzIHRoZSBtYXhpbXVtIHNpemUgdGhlIHN0YWNrcyBjYW4gZ3JvdyB0bworICAgIChlZmZlY3RpdmUgb25seSBpZiB0aGUgYnVpbHQtaW4gc3RhY2sgZXh0ZW5zaW9uIG1ldGhvZCBpcyB1c2VkKS4gICovCisKKyNpZiBZWU1BWERFUFRIID09IDAKKyN1bmRlZiBZWU1BWERFUFRICisjZW5kaWYKKworI2lmbmRlZiBZWU1BWERFUFRICisjZGVmaW5lIFlZTUFYREVQVEggMTAwMDAKKyNlbmRpZgorDAorLyogRGVmaW5lIF9feXlfbWVtY3B5LiAgTm90ZSB0aGF0IHRoZSBzaXplIGFyZ3VtZW50CisgICBzaG91bGQgYmUgcGFzc2VkIHdpdGggdHlwZSB1bnNpZ25lZCBpbnQsIGJlY2F1c2UgdGhhdCBpcyB3aGF0IHRoZSBub24tR0NDCisgICBkZWZpbml0aW9ucyByZXF1aXJlLiAgV2l0aCBHQ0MsIF9fYnVpbHRpbl9tZW1jcHkgdGFrZXMgYW4gYXJnCisgICBvZiB0eXBlIHNpemVfdCwgYnV0IGl0IGNhbiBoYW5kbGUgdW5zaWduZWQgaW50LiAgKi8KKworI2lmIF9fR05VQ19fID4gMQkJLyogR05VIEMgYW5kIEdOVSBDKysgZGVmaW5lIHRoaXMuICAqLworI2RlZmluZSBfX3l5X21lbWNweShUTyxGUk9NLENPVU5UKQlfX2J1aWx0aW5fbWVtY3B5KFRPLEZST00sQ09VTlQpCisjZWxzZQkJCQkvKiBub3QgR05VIEMgb3IgQysrICovCisjaWZuZGVmIF9fY3BsdXNwbHVzCisKKy8qIFRoaXMgaXMgdGhlIG1vc3QgcmVsaWFibGUgd2F5IHRvIGF2b2lkIGluY29tcGF0aWJpbGl0aWVzCisgICBpbiBhdmFpbGFibGUgYnVpbHQtaW4gZnVuY3Rpb25zIG9uIHZhcmlvdXMgc3lzdGVtcy4gICovCitzdGF0aWMgdm9pZAorX195eV9tZW1jcHkgKHRvLCBmcm9tLCBjb3VudCkKKyAgICAgY2hhciAqdG87CisgICAgIGNoYXIgKmZyb207CisgICAgIHVuc2lnbmVkIGludCBjb3VudDsKK3sKKyAgcmVnaXN0ZXIgY2hhciAqZiA9IGZyb207CisgIHJlZ2lzdGVyIGNoYXIgKnQgPSB0bzsKKyAgcmVnaXN0ZXIgaW50IGkgPSBjb3VudDsKKworICB3aGlsZSAoaS0tID4gMCkKKyAgICAqdCsrID0gKmYrKzsKK30KKworI2Vsc2UgLyogX19jcGx1c3BsdXMgKi8KKworLyogVGhpcyBpcyB0aGUgbW9zdCByZWxpYWJsZSB3YXkgdG8gYXZvaWQgaW5jb21wYXRpYmlsaXRpZXMKKyAgIGluIGF2YWlsYWJsZSBidWlsdC1pbiBmdW5jdGlvbnMgb24gdmFyaW91cyBzeXN0ZW1zLiAgKi8KK3N0YXRpYyB2b2lkCitfX3l5X21lbWNweSAoY2hhciAqdG8sIGNoYXIgKmZyb20sIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKyAgcmVnaXN0ZXIgY2hhciAqdCA9IHRvOworICByZWdpc3RlciBjaGFyICpmID0gZnJvbTsKKyAgcmVnaXN0ZXIgaW50IGkgPSBjb3VudDsKKworICB3aGlsZSAoaS0tID4gMCkKKyAgICAqdCsrID0gKmYrKzsKK30KKworI2VuZGlmCisjZW5kaWYKKwwKKyNsaW5lIDIxNiAiL3Vzci9zaGFyZS9iaXNvbi5zaW1wbGUiCisKKy8qIFRoZSB1c2VyIGNhbiBkZWZpbmUgWVlQQVJTRV9QQVJBTSBhcyB0aGUgbmFtZSBvZiBhbiBhcmd1bWVudCB0byBiZSBwYXNzZWQKKyAgIGludG8geXlwYXJzZS4gIFRoZSBhcmd1bWVudCBzaG91bGQgaGF2ZSB0eXBlIHZvaWQgKi4KKyAgIEl0IHNob3VsZCBhY3R1YWxseSBwb2ludCB0byBhbiBvYmplY3QuCisgICBHcmFtbWFyIGFjdGlvbnMgY2FuIGFjY2VzcyB0aGUgdmFyaWFibGUgYnkgY2FzdGluZyBpdAorICAgdG8gdGhlIHByb3BlciBwb2ludGVyIHR5cGUuICAqLworCisjaWZkZWYgWVlQQVJTRV9QQVJBTQorI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHIHZvaWQgKllZUEFSU0VfUEFSQU0KKyNkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMCisjZWxzZSAvKiBub3QgX19jcGx1c3BsdXMgKi8KKyNkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcgWVlQQVJTRV9QQVJBTQorI2RlZmluZSBZWVBBUlNFX1BBUkFNX0RFQ0wgdm9pZCAqWVlQQVJTRV9QQVJBTTsKKyNlbmRpZiAvKiBub3QgX19jcGx1c3BsdXMgKi8KKyNlbHNlIC8qIG5vdCBZWVBBUlNFX1BBUkFNICovCisjZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHCisjZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTAorI2VuZGlmIC8qIG5vdCBZWVBBUlNFX1BBUkFNICovCisKKy8qIFByZXZlbnQgd2FybmluZyBpZiAtV3N0cmljdC1wcm90b3R5cGVzLiAgKi8KKyNpZmRlZiBfX0dOVUNfXworI2lmZGVmIFlZUEFSU0VfUEFSQU0KK2ludCB5eXBhcnNlICh2b2lkICopOworI2Vsc2UKK2ludCB5eXBhcnNlICh2b2lkKTsKKyNlbmRpZgorI2VuZGlmCisKK2ludAoreXlwYXJzZShZWVBBUlNFX1BBUkFNX0FSRykKKyAgICAgWVlQQVJTRV9QQVJBTV9ERUNMCit7CisgIHJlZ2lzdGVyIGludCB5eXN0YXRlOworICByZWdpc3RlciBpbnQgeXluOworICByZWdpc3RlciBzaG9ydCAqeXlzc3A7CisgIHJlZ2lzdGVyIFlZU1RZUEUgKnl5dnNwOworICBpbnQgeXllcnJzdGF0dXM7CS8qICBudW1iZXIgb2YgdG9rZW5zIHRvIHNoaWZ0IGJlZm9yZSBlcnJvciBtZXNzYWdlcyBlbmFibGVkICovCisgIGludCB5eWNoYXIxID0gMDsJCS8qICBsb29rYWhlYWQgdG9rZW4gYXMgYW4gaW50ZXJuYWwgKHRyYW5zbGF0ZWQpIHRva2VuIG51bWJlciAqLworCisgIHNob3J0CXl5c3NhW1lZSU5JVERFUFRIXTsJLyogIHRoZSBzdGF0ZSBzdGFjawkJCSovCisgIFlZU1RZUEUgeXl2c2FbWVlJTklUREVQVEhdOwkvKiAgdGhlIHNlbWFudGljIHZhbHVlIHN0YWNrCQkqLworCisgIHNob3J0ICp5eXNzID0geXlzc2E7CQkvKiAgcmVmZXIgdG8gdGhlIHN0YWNrcyB0aHJ1IHNlcGFyYXRlIHBvaW50ZXJzICovCisgIFlZU1RZUEUgKnl5dnMgPSB5eXZzYTsJLyogIHRvIGFsbG93IHl5b3ZlcmZsb3cgdG8gcmVhbGxvY2F0ZSB0aGVtIGVsc2V3aGVyZSAqLworCisjaWZkZWYgWVlMU1BfTkVFREVECisgIFlZTFRZUEUgeXlsc2FbWVlJTklUREVQVEhdOwkvKiAgdGhlIGxvY2F0aW9uIHN0YWNrCQkJKi8KKyAgWVlMVFlQRSAqeXlscyA9IHl5bHNhOworICBZWUxUWVBFICp5eWxzcDsKKworI2RlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0sIHl5bHNwLS0pCisjZWxzZQorI2RlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0pCisjZW5kaWYKKworICBpbnQgeXlzdGFja3NpemUgPSBZWUlOSVRERVBUSDsKKyAgaW50IHl5ZnJlZV9zdGFja3MgPSAwOworCisjaWZkZWYgWVlQVVJFCisgIGludCB5eWNoYXI7CisgIFlZU1RZUEUgeXlsdmFsOworICBpbnQgeXluZXJyczsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgWVlMVFlQRSB5eWxsb2M7CisjZW5kaWYKKyNlbmRpZgorCisgIFlZU1RZUEUgeXl2YWw7CQkvKiAgdGhlIHZhcmlhYmxlIHVzZWQgdG8gcmV0dXJuCQkqLworCQkJCS8qICBzZW1hbnRpYyB2YWx1ZXMgZnJvbSB0aGUgYWN0aW9uCSovCisJCQkJLyogIHJvdXRpbmVzCQkJCSovCisKKyAgaW50IHl5bGVuOworCisjaWYgWVlERUJVRyAhPSAwCisgIGlmICh5eWRlYnVnKQorICAgIGZwcmludGYoc3RkZXJyLCAiU3RhcnRpbmcgcGFyc2VcbiIpOworI2VuZGlmCisKKyAgeXlzdGF0ZSA9IDA7CisgIHl5ZXJyc3RhdHVzID0gMDsKKyAgeXluZXJycyA9IDA7CisgIHl5Y2hhciA9IFlZRU1QVFk7CQkvKiBDYXVzZSBhIHRva2VuIHRvIGJlIHJlYWQuICAqLworCisgIC8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlcnMuCisgICAgIFdhc3RlIG9uZSBlbGVtZW50IG9mIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFjaworICAgICBzbyB0aGF0IHRoZXkgc3RheSBvbiB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgc3RhdGUgc3RhY2suCisgICAgIFRoZSB3YXN0ZWQgZWxlbWVudHMgYXJlIG5ldmVyIGluaXRpYWxpemVkLiAgKi8KKworICB5eXNzcCA9IHl5c3MgLSAxOworICB5eXZzcCA9IHl5dnM7CisjaWZkZWYgWVlMU1BfTkVFREVECisgIHl5bHNwID0geXlsczsKKyNlbmRpZgorCisvKiBQdXNoIGEgbmV3IHN0YXRlLCB3aGljaCBpcyBmb3VuZCBpbiAgeXlzdGF0ZSAgLiAgKi8KKy8qIEluIGFsbCBjYXNlcywgd2hlbiB5b3UgZ2V0IGhlcmUsIHRoZSB2YWx1ZSBhbmQgbG9jYXRpb24gc3RhY2tzCisgICBoYXZlIGp1c3QgYmVlbiBwdXNoZWQuIHNvIHB1c2hpbmcgYSBzdGF0ZSBoZXJlIGV2ZW5zIHRoZSBzdGFja3MuICAqLworeXluZXdzdGF0ZToKKworICAqKyt5eXNzcCA9IHl5c3RhdGU7CisKKyAgaWYgKHl5c3NwID49IHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEpCisgICAgeworICAgICAgLyogR2l2ZSB1c2VyIGEgY2hhbmNlIHRvIHJlYWxsb2NhdGUgdGhlIHN0YWNrICovCisgICAgICAvKiBVc2UgY29waWVzIG9mIHRoZXNlIHNvIHRoYXQgdGhlICYncyBkb24ndCBmb3JjZSB0aGUgcmVhbCBvbmVzIGludG8gbWVtb3J5LiAqLworICAgICAgWVlTVFlQRSAqeXl2czEgPSB5eXZzOworICAgICAgc2hvcnQgKnl5c3MxID0geXlzczsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgICAgIFlZTFRZUEUgKnl5bHMxID0geXlsczsKKyNlbmRpZgorCisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgdXNlZCBzaXplIG9mIHRoZSB0aHJlZSBzdGFja3MsIGluIGVsZW1lbnRzLiAgKi8KKyAgICAgIGludCBzaXplID0geXlzc3AgLSB5eXNzICsgMTsKKworI2lmZGVmIHl5b3ZlcmZsb3cKKyAgICAgIC8qIEVhY2ggc3RhY2sgcG9pbnRlciBhZGRyZXNzIGlzIGZvbGxvd2VkIGJ5IHRoZSBzaXplIG9mCisJIHRoZSBkYXRhIGluIHVzZSBpbiB0aGF0IHN0YWNrLCBpbiBieXRlcy4gICovCisjaWZkZWYgWVlMU1BfTkVFREVECisgICAgICAvKiBUaGlzIHVzZWQgdG8gYmUgYSBjb25kaXRpb25hbCBhcm91bmQganVzdCB0aGUgdHdvIGV4dHJhIGFyZ3MsCisJIGJ1dCB0aGF0IG1pZ2h0IGJlIHVuZGVmaW5lZCBpZiB5eW92ZXJmbG93IGlzIGEgbWFjcm8uICAqLworICAgICAgeXlvdmVyZmxvdygicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKKwkJICZ5eXNzMSwgc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKKwkJICZ5eXZzMSwgc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKKwkJICZ5eWxzMSwgc2l6ZSAqIHNpemVvZiAoKnl5bHNwKSwKKwkJICZ5eXN0YWNrc2l6ZSk7CisjZWxzZQorICAgICAgeXlvdmVyZmxvdygicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKKwkJICZ5eXNzMSwgc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKKwkJICZ5eXZzMSwgc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKKwkJICZ5eXN0YWNrc2l6ZSk7CisjZW5kaWYKKworICAgICAgeXlzcyA9IHl5c3MxOyB5eXZzID0geXl2czE7CisjaWZkZWYgWVlMU1BfTkVFREVECisgICAgICB5eWxzID0geXlsczE7CisjZW5kaWYKKyNlbHNlIC8qIG5vIHl5b3ZlcmZsb3cgKi8KKyAgICAgIC8qIEV4dGVuZCB0aGUgc3RhY2sgb3VyIG93biB3YXkuICAqLworICAgICAgaWYgKHl5c3RhY2tzaXplID49IFlZTUFYREVQVEgpCisJeworCSAgeXllcnJvcigicGFyc2VyIHN0YWNrIG92ZXJmbG93Iik7CisJICBpZiAoeXlmcmVlX3N0YWNrcykKKwkgICAgeworCSAgICAgIGZyZWUgKHl5c3MpOworCSAgICAgIGZyZWUgKHl5dnMpOworI2lmZGVmIFlZTFNQX05FRURFRAorCSAgICAgIGZyZWUgKHl5bHMpOworI2VuZGlmCisJICAgIH0KKwkgIHJldHVybiAyOworCX0KKyAgICAgIHl5c3RhY2tzaXplICo9IDI7CisgICAgICBpZiAoeXlzdGFja3NpemUgPiBZWU1BWERFUFRIKQorCXl5c3RhY2tzaXplID0gWVlNQVhERVBUSDsKKyNpZm5kZWYgWVlTVEFDS19VU0VfQUxMT0NBCisgICAgICB5eWZyZWVfc3RhY2tzID0gMTsKKyNlbmRpZgorICAgICAgeXlzcyA9IChzaG9ydCAqKSBZWVNUQUNLX0FMTE9DICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSk7CisgICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eXNzLCAoY2hhciAqKXl5c3MxLAorCQkgICBzaXplICogKHVuc2lnbmVkIGludCkgc2l6ZW9mICgqeXlzc3ApKTsKKyAgICAgIHl5dnMgPSAoWVlTVFlQRSAqKSBZWVNUQUNLX0FMTE9DICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSk7CisgICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eXZzLCAoY2hhciAqKXl5dnMxLAorCQkgICBzaXplICogKHVuc2lnbmVkIGludCkgc2l6ZW9mICgqeXl2c3ApKTsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgICAgIHl5bHMgPSAoWVlMVFlQRSAqKSBZWVNUQUNLX0FMTE9DICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5bHNwKSk7CisgICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eWxzLCAoY2hhciAqKXl5bHMxLAorCQkgICBzaXplICogKHVuc2lnbmVkIGludCkgc2l6ZW9mICgqeXlsc3ApKTsKKyNlbmRpZgorI2VuZGlmIC8qIG5vIHl5b3ZlcmZsb3cgKi8KKworICAgICAgeXlzc3AgPSB5eXNzICsgc2l6ZSAtIDE7CisgICAgICB5eXZzcCA9IHl5dnMgKyBzaXplIC0gMTsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgICAgIHl5bHNwID0geXlscyArIHNpemUgLSAxOworI2VuZGlmCisKKyNpZiBZWURFQlVHICE9IDAKKyAgICAgIGlmICh5eWRlYnVnKQorCWZwcmludGYoc3RkZXJyLCAiU3RhY2sgc2l6ZSBpbmNyZWFzZWQgdG8gJWRcbiIsIHl5c3RhY2tzaXplKTsKKyNlbmRpZgorCisgICAgICBpZiAoeXlzc3AgPj0geXlzcyArIHl5c3RhY2tzaXplIC0gMSkKKwlZWUFCT1JUOworICAgIH0KKworI2lmIFlZREVCVUcgIT0gMAorICBpZiAoeXlkZWJ1ZykKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVudGVyaW5nIHN0YXRlICVkXG4iLCB5eXN0YXRlKTsKKyNlbmRpZgorCisgIGdvdG8geXliYWNrdXA7CisgeXliYWNrdXA6CisKKy8qIERvIGFwcHJvcHJpYXRlIHByb2Nlc3NpbmcgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUuICAqLworLyogUmVhZCBhIGxvb2thaGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisvKiB5eXJlc3VtZTogKi8KKworICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9va2FoZWFkIHRva2VuLiAgKi8KKworICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisgIGlmICh5eW4gPT0gWVlGTEFHKQorICAgIGdvdG8geXlkZWZhdWx0OworCisgIC8qIE5vdCBrbm93biA9PiBnZXQgYSBsb29rYWhlYWQgdG9rZW4gaWYgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisKKyAgLyogeXljaGFyIGlzIGVpdGhlciBZWUVNUFRZIG9yIFlZRU9GCisgICAgIG9yIGEgdmFsaWQgdG9rZW4gaW4gZXh0ZXJuYWwgZm9ybS4gICovCisKKyAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZKQorICAgIHsKKyNpZiBZWURFQlVHICE9IDAKKyAgICAgIGlmICh5eWRlYnVnKQorCWZwcmludGYoc3RkZXJyLCAiUmVhZGluZyBhIHRva2VuOiAiKTsKKyNlbmRpZgorICAgICAgeXljaGFyID0gWVlMRVg7CisgICAgfQorCisgIC8qIENvbnZlcnQgdG9rZW4gdG8gaW50ZXJuYWwgZm9ybSAoaW4geXljaGFyMSkgZm9yIGluZGV4aW5nIHRhYmxlcyB3aXRoICovCisKKyAgaWYgKHl5Y2hhciA8PSAwKQkJLyogVGhpcyBtZWFucyBlbmQgb2YgaW5wdXQuICovCisgICAgeworICAgICAgeXljaGFyMSA9IDA7CisgICAgICB5eWNoYXIgPSBZWUVPRjsJCS8qIERvbid0IGNhbGwgWVlMRVggYW55IG1vcmUgKi8KKworI2lmIFlZREVCVUcgIT0gMAorICAgICAgaWYgKHl5ZGVidWcpCisJZnByaW50ZihzdGRlcnIsICJOb3cgYXQgZW5kIG9mIGlucHV0LlxuIik7CisjZW5kaWYKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB5eWNoYXIxID0gWVlUUkFOU0xBVEUoeXljaGFyKTsKKworI2lmIFlZREVCVUcgIT0gMAorICAgICAgaWYgKHl5ZGVidWcpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCAiTmV4dCB0b2tlbiBpcyAlZCAoJXMiLCB5eWNoYXIsIHl5dG5hbWVbeXljaGFyMV0pOworCSAgLyogR2l2ZSB0aGUgaW5kaXZpZHVhbCBwYXJzZXIgYSB3YXkgdG8gcHJpbnQgdGhlIHByZWNpc2UgbWVhbmluZworCSAgICAgb2YgYSB0b2tlbiwgZm9yIGZ1cnRoZXIgZGVidWdnaW5nIGluZm8uICAqLworI2lmZGVmIFlZUFJJTlQKKwkgIFlZUFJJTlQgKHN0ZGVyciwgeXljaGFyLCB5eWx2YWwpOworI2VuZGlmCisJICBmcHJpbnRmIChzdGRlcnIsICIpXG4iKTsKKwl9CisjZW5kaWYKKyAgICB9CisKKyAgeXluICs9IHl5Y2hhcjE7CisgIGlmICh5eW4gPCAwIHx8IHl5biA+IFlZTEFTVCB8fCB5eWNoZWNrW3l5bl0gIT0geXljaGFyMSkKKyAgICBnb3RvIHl5ZGVmYXVsdDsKKworICB5eW4gPSB5eXRhYmxlW3l5bl07CisKKyAgLyogeXluIGlzIHdoYXQgdG8gZG8gZm9yIHRoaXMgdG9rZW4gdHlwZSBpbiB0aGlzIHN0YXRlLgorICAgICBOZWdhdGl2ZSA9PiByZWR1Y2UsIC15eW4gaXMgcnVsZSBudW1iZXIuCisgICAgIFBvc2l0aXZlID0+IHNoaWZ0LCB5eW4gaXMgbmV3IHN0YXRlLgorICAgICAgIE5ldyBzdGF0ZSBpcyBmaW5hbCBzdGF0ZSA9PiBkb24ndCBib3RoZXIgdG8gc2hpZnQsCisgICAgICAganVzdCByZXR1cm4gc3VjY2Vzcy4KKyAgICAgMCwgb3IgbW9zdCBuZWdhdGl2ZSBudW1iZXIgPT4gZXJyb3IuICAqLworCisgIGlmICh5eW4gPCAwKQorICAgIHsKKyAgICAgIGlmICh5eW4gPT0gWVlGTEFHKQorCWdvdG8geXllcnJsYWI7CisgICAgICB5eW4gPSAteXluOworICAgICAgZ290byB5eXJlZHVjZTsKKyAgICB9CisgIGVsc2UgaWYgKHl5biA9PSAwKQorICAgIGdvdG8geXllcnJsYWI7CisKKyAgaWYgKHl5biA9PSBZWUZJTkFMKQorICAgIFlZQUNDRVBUOworCisgIC8qIFNoaWZ0IHRoZSBsb29rYWhlYWQgdG9rZW4uICAqLworCisjaWYgWVlERUJVRyAhPSAwCisgIGlmICh5eWRlYnVnKQorICAgIGZwcmludGYoc3RkZXJyLCAiU2hpZnRpbmcgdG9rZW4gJWQgKCVzKSwgIiwgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKKyNlbmRpZgorCisgIC8qIERpc2NhcmQgdGhlIHRva2VuIGJlaW5nIHNoaWZ0ZWQgdW5sZXNzIGl0IGlzIGVvZi4gICovCisgIGlmICh5eWNoYXIgIT0gWVlFT0YpCisgICAgeXljaGFyID0gWVlFTVBUWTsKKworICAqKyt5eXZzcCA9IHl5bHZhbDsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgKisreXlsc3AgPSB5eWxsb2M7CisjZW5kaWYKKworICAvKiBjb3VudCB0b2tlbnMgc2hpZnRlZCBzaW5jZSBlcnJvcjsgYWZ0ZXIgdGhyZWUsIHR1cm4gb2ZmIGVycm9yIHN0YXR1cy4gICovCisgIGlmICh5eWVycnN0YXR1cykgeXllcnJzdGF0dXMtLTsKKworICB5eXN0YXRlID0geXluOworICBnb3RvIHl5bmV3c3RhdGU7CisKKy8qIERvIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUuICAqLworeXlkZWZhdWx0OgorCisgIHl5biA9IHl5ZGVmYWN0W3l5c3RhdGVdOworICBpZiAoeXluID09IDApCisgICAgZ290byB5eWVycmxhYjsKKworLyogRG8gYSByZWR1Y3Rpb24uICB5eW4gaXMgdGhlIG51bWJlciBvZiBhIHJ1bGUgdG8gcmVkdWNlIHdpdGguICAqLworeXlyZWR1Y2U6CisgIHl5bGVuID0geXlyMlt5eW5dOworICBpZiAoeXlsZW4gPiAwKQorICAgIHl5dmFsID0geXl2c3BbMS15eWxlbl07IC8qIGltcGxlbWVudCBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhY3Rpb24gKi8KKworI2lmIFlZREVCVUcgIT0gMAorICBpZiAoeXlkZWJ1ZykKKyAgICB7CisgICAgICBpbnQgaTsKKworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUmVkdWNpbmcgdmlhIHJ1bGUgJWQgKGxpbmUgJWQpLCAiLAorCSAgICAgICB5eW4sIHl5cmxpbmVbeXluXSk7CisKKyAgICAgIC8qIFByaW50IHRoZSBzeW1ib2xzIGJlaW5nIHJlZHVjZWQsIGFuZCB0aGVpciByZXN1bHQuICAqLworICAgICAgZm9yIChpID0geXlwcmhzW3l5bl07IHl5cmhzW2ldID4gMDsgaSsrKQorCWZwcmludGYgKHN0ZGVyciwgIiVzICIsIHl5dG5hbWVbeXlyaHNbaV1dKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAtPiAlc1xuIiwgeXl0bmFtZVt5eXIxW3l5bl1dKTsKKyAgICB9CisjZW5kaWYKKworCisgIHN3aXRjaCAoeXluKSB7CisKK2Nhc2UgNToKKyNsaW5lIDM4ICJtaW5pY29tcGcueSIKK3t5eXZhbD1uZXdfdHlwZShET1VCTEUpOzsKKyAgICBicmVhazt9CitjYXNlIDY6CisjbGluZSAzOSAibWluaWNvbXBnLnkiCit7eXl2YWw9bmV3X3R5cGUoSU5UKTs7CisgICAgYnJlYWs7fQorY2FzZSA3OgorI2xpbmUgNDAgIm1pbmljb21wZy55Igore3l5dmFsPW5ld19hcnJheSh5eXZzcFstM10seXl2c3BbLTFdKTs7CisgICAgYnJlYWs7fQorY2FzZSAxMDoKKyNsaW5lIDQ5ICJtaW5pY29tcGcueSIKK3thZGRfdmFyKHl5dnNwWy0xXSx5eXZzcFstMl0pOzsKKyAgICBicmVhazt9CitjYXNlIDExOgorI2xpbmUgNTMgIm1pbmljb21wZy55Igore3l5dmFsPWFkZF9zdHJpbmcodGtuYW1lKTs7CisgICAgYnJlYWs7fQorY2FzZSAxMjoKKyNsaW5lIDU3ICJtaW5pY29tcGcueSIKK3t5eXZhbD1iaW5hcnlfbm9kZShOQU5ELHl5dnNwWy0yXSx5eXZzcFswXSk7OworICAgIGJyZWFrO30KK2Nhc2UgMTM6CisjbGluZSA1OCAibWluaWNvbXBnLnkiCit7eXl2YWw9YmluYXJ5X25vZGUoTk9SLHl5dnNwWy0yXSx5eXZzcFswXSk7OworICAgIGJyZWFrO30KK2Nhc2UgMTU6CisjbGluZSA2MyAibWluaWNvbXBnLnkiCit7eXl2YWw9YmluYXJ5X25vZGUoTkVRVUFMUyx5eXZzcFstMl0seXl2c3BbMF0pOzsKKyAgICBicmVhazt9CitjYXNlIDE2OgorI2xpbmUgNjQgIm1pbmljb21wZy55Igore3l5dmFsPWJpbmFyeV9ub2RlKE5ORVEseXl2c3BbLTJdLHl5dnNwWzBdKTs7CisgICAgYnJlYWs7fQorY2FzZSAxNzoKKyNsaW5lIDY1ICJtaW5pY29tcGcueSIKK3t5eXZhbD1iaW5hcnlfbm9kZShOTFQseXl2c3BbLTJdLHl5dnNwWzBdKTs7CisgICAgYnJlYWs7fQorY2FzZSAxODoKKyNsaW5lIDY2ICJtaW5pY29tcGcueSIKK3t5eXZhbD1iaW5hcnlfbm9kZShOR1QseXl2c3BbLTJdLHl5dnNwWzBdKTs7CisgICAgYnJlYWs7fQorY2FzZSAxOToKKyNsaW5lIDY3ICJtaW5pY29tcGcueSIKK3t5eXZhbD1iaW5hcnlfbm9kZShOTEVRLHl5dnNwWy0yXSx5eXZzcFswXSk7OworICAgIGJyZWFrO30KK2Nhc2UgMjA6CisjbGluZSA2OCAibWluaWNvbXBnLnkiCit7eXl2YWw9YmluYXJ5X25vZGUoTkdFUSx5eXZzcFstMl0seXl2c3BbMF0pOzsKKyAgICBicmVhazt9CitjYXNlIDIxOgorI2xpbmUgNjkgIm1pbmljb21wZy55Igore3l5dmFsPXl5dnNwWy0xXTsKKyAgICBicmVhazt9CitjYXNlIDIyOgorI2xpbmUgNzIgIm1pbmljb21wZy55Igore3l5dmFsPWJpbmFyeV9ub2RlKE5BREQseXl2c3BbLTJdLHl5dnNwWzBdKTs7CisgICAgYnJlYWs7fQorY2FzZSAyMzoKKyNsaW5lIDczICJtaW5pY29tcGcueSIKK3t5eXZhbD1iaW5hcnlfbm9kZShOU1VCLHl5dnNwWy0yXSx5eXZzcFswXSk7OworICAgIGJyZWFrO30KK2Nhc2UgMjU6CisjbGluZSA3NyAibWluaWNvbXBnLnkiCit7eXl2YWw9YmluYXJ5X25vZGUoTk1VTCx5eXZzcFstMl0seXl2c3BbMF0pOzsKKyAgICBicmVhazt9CitjYXNlIDI2OgorI2xpbmUgNzggIm1pbmljb21wZy55Igore3l5dmFsPWJpbmFyeV9ub2RlKE5ESVYseXl2c3BbLTJdLHl5dnNwWzBdKTs7CisgICAgYnJlYWs7fQorY2FzZSAyODoKKyNsaW5lIDgzICJtaW5pY29tcGcueSIKK3t5eXZhbD15eXZzcFstMV07OworICAgIGJyZWFrO30KK2Nhc2UgMjk6CisjbGluZSA4NCAibWluaWNvbXBnLnkiCit7eXl2YWw9bnVtYmVyX25vZGUoKTs7CisgICAgYnJlYWs7fQorY2FzZSAzMDoKKyNsaW5lIDg1ICJtaW5pY29tcGcueSIKK3t5eXZhbD1iaW5hcnlfbm9kZShOQ0FMTCx5eXZzcFstM10seXl2c3BbLTFdKTs7CisgICAgYnJlYWs7fQorY2FzZSAzMToKKyNsaW5lIDg2ICJtaW5pY29tcGcueSIKK3t5eXZhbD1iaW5hcnlfbm9kZShOQ0FMTCx5eXZzcFstMl0sMCk7OworICAgIGJyZWFrO30KK2Nhc2UgMzM6CisjbGluZSA5MSAibWluaWNvbXBnLnkiCit7eXl2YWw9YmluYXJ5X25vZGUoTklOREVYLHl5dnNwWy0zXSx5eXZzcFstMV0pOzsKKyAgICBicmVhazt9CitjYXNlIDM1OgorI2xpbmUgOTYgIm1pbmljb21wZy55Igore3l5dmFsPXZhcl9ub2RlKCk7OworICAgIGJyZWFrO30KK2Nhc2UgMzY6CisjbGluZSAxMDAgIm1pbmljb21wZy55Igore3l5dmFsPWJpbmFyeV9ub2RlKE5BUkcseXl2c3BbLTJdLHl5dnNwWzBdKTs7CisgICAgYnJlYWs7fQorY2FzZSA0NToKKyNsaW5lIDExOCAibWluaWNvbXBnLnkiCit7ZW50ZXJfYmxvY2soKTs7CisgICAgYnJlYWs7fQorY2FzZSA0NzoKKyNsaW5lIDEyMiAibWluaWNvbXBnLnkiCit7bGVhdmVfYmxvY2soKTs7CisgICAgYnJlYWs7fQorY2FzZSA0ODoKKyNsaW5lIDEyMyAibWluaWNvbXBnLnkiCit7bGVhdmVfYmxvY2soKTs7CisgICAgYnJlYWs7fQorY2FzZSA0OToKKyNsaW5lIDEyNCAibWluaWNvbXBnLnkiCit7bGVhdmVfYmxvY2soKTs7CisgICAgYnJlYWs7fQorY2FzZSA1MDoKKyNsaW5lIDEyNSAibWluaWNvbXBnLnkiCit7bGVhdmVfYmxvY2soKTs7CisgICAgYnJlYWs7fQorY2FzZSA1MToKKyNsaW5lIDEzMCAibWluaWNvbXBnLnkiCit7aWZfc3RhdGVtZW50KHl5dnNwWy0xXSk7OworICAgIGJyZWFrO30KK2Nhc2UgNTM6CisjbGluZSAxMzQgIm1pbmljb21wZy55Igore2lmX2VuZCgpOzsKKyAgICBicmVhazt9CitjYXNlIDU0OgorI2xpbmUgMTM1ICJtaW5pY29tcGcueSIKK3tpZl9lbHNlKCk7OworICAgIGJyZWFrO30KK2Nhc2UgNTU6CisjbGluZSAxMzUgIm1pbmljb21wZy55Igore2lmX2VuZCgpOzsKKyAgICBicmVhazt9CitjYXNlIDU2OgorI2xpbmUgMTQwICJtaW5pY29tcGcueSIKK3t3aGlsZV9zdGF0ZW1lbnQoeXl2c3BbLTFdKTs7CisgICAgYnJlYWs7fQorY2FzZSA1NzoKKyNsaW5lIDE0MCAibWluaWNvbXBnLnkiCit7d2hpbGVfZW5kKCk7OworICAgIGJyZWFrO30KK2Nhc2UgNTg6CisjbGluZSAxNDQgIm1pbmljb21wZy55Igore2Fzc2lnbl9zdGF0ZW1lbnQoeXl2c3BbLTNdLHl5dnNwWy0xXSk7OworICAgIGJyZWFrO30KK2Nhc2UgNTk6CisjbGluZSAxNDggIm1pbmljb21wZy55Igore3JldHVybl9zdGF0ZW1lbnQoeXl2c3BbLTFdKTs7CisgICAgYnJlYWs7fQorY2FzZSA2MToKKyNsaW5lIDE1NiAibWluaWNvbXBnLnkiCit7ZW50ZXJfZnVuYyh5eXZzcFstMV0seXl2c3BbLTJdKTs7CisgICAgYnJlYWs7fQorY2FzZSA2MjoKKyNsaW5lIDE2MCAibWluaWNvbXBnLnkiCit7bGVhdmVfZnVuYygpOzsKKyAgICBicmVhazt9CitjYXNlIDYzOgorI2xpbmUgMTYxICJtaW5pY29tcGcueSIKK3tsZWF2ZV9mdW5jKCk7OworICAgIGJyZWFrO30KK2Nhc2UgNjY6CisjbGluZSAxNzAgIm1pbmljb21wZy55Igore2FkZF92YXIoeXl2c3BbMF0seXl2c3BbLTFdKTs7CisgICAgYnJlYWs7fQorfQorICAgLyogdGhlIGFjdGlvbiBmaWxlIGdldHMgY29waWVkIGluIGluIHBsYWNlIG9mIHRoaXMgZG9sbGFyc2lnbiAqLworI2xpbmUgNTQyICIvdXNyL3NoYXJlL2Jpc29uLnNpbXBsZSIKKwwKKyAgeXl2c3AgLT0geXlsZW47CisgIHl5c3NwIC09IHl5bGVuOworI2lmZGVmIFlZTFNQX05FRURFRAorICB5eWxzcCAtPSB5eWxlbjsKKyNlbmRpZgorCisjaWYgWVlERUJVRyAhPSAwCisgIGlmICh5eWRlYnVnKQorICAgIHsKKyAgICAgIHNob3J0ICpzc3AxID0geXlzcyAtIDE7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJzdGF0ZSBzdGFjayBub3ciKTsKKyAgICAgIHdoaWxlIChzc3AxICE9IHl5c3NwKQorCWZwcmludGYgKHN0ZGVyciwgIiAlZCIsICorK3NzcDEpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKKyAgICB9CisjZW5kaWYKKworICAqKyt5eXZzcCA9IHl5dmFsOworCisjaWZkZWYgWVlMU1BfTkVFREVECisgIHl5bHNwKys7CisgIGlmICh5eWxlbiA9PSAwKQorICAgIHsKKyAgICAgIHl5bHNwLT5maXJzdF9saW5lID0geXlsbG9jLmZpcnN0X2xpbmU7CisgICAgICB5eWxzcC0+Zmlyc3RfY29sdW1uID0geXlsbG9jLmZpcnN0X2NvbHVtbjsKKyAgICAgIHl5bHNwLT5sYXN0X2xpbmUgPSAoeXlsc3AtMSktPmxhc3RfbGluZTsKKyAgICAgIHl5bHNwLT5sYXN0X2NvbHVtbiA9ICh5eWxzcC0xKS0+bGFzdF9jb2x1bW47CisgICAgICB5eWxzcC0+dGV4dCA9IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgeXlsc3AtPmxhc3RfbGluZSA9ICh5eWxzcCt5eWxlbi0xKS0+bGFzdF9saW5lOworICAgICAgeXlsc3AtPmxhc3RfY29sdW1uID0gKHl5bHNwK3l5bGVuLTEpLT5sYXN0X2NvbHVtbjsKKyAgICB9CisjZW5kaWYKKworICAvKiBOb3cgInNoaWZ0IiB0aGUgcmVzdWx0IG9mIHRoZSByZWR1Y3Rpb24uCisgICAgIERldGVybWluZSB3aGF0IHN0YXRlIHRoYXQgZ29lcyB0bywKKyAgICAgYmFzZWQgb24gdGhlIHN0YXRlIHdlIHBvcHBlZCBiYWNrIHRvCisgICAgIGFuZCB0aGUgcnVsZSBudW1iZXIgcmVkdWNlZCBieS4gICovCisKKyAgeXluID0geXlyMVt5eW5dOworCisgIHl5c3RhdGUgPSB5eXBnb3RvW3l5biAtIFlZTlRCQVNFXSArICp5eXNzcDsKKyAgaWYgKHl5c3RhdGUgPj0gMCAmJiB5eXN0YXRlIDw9IFlZTEFTVCAmJiB5eWNoZWNrW3l5c3RhdGVdID09ICp5eXNzcCkKKyAgICB5eXN0YXRlID0geXl0YWJsZVt5eXN0YXRlXTsKKyAgZWxzZQorICAgIHl5c3RhdGUgPSB5eWRlZmdvdG9beXluIC0gWVlOVEJBU0VdOworCisgIGdvdG8geXluZXdzdGF0ZTsKKworeXllcnJsYWI6ICAgLyogaGVyZSBvbiBkZXRlY3RpbmcgZXJyb3IgKi8KKworICBpZiAoISB5eWVycnN0YXR1cykKKyAgICAvKiBJZiBub3QgYWxyZWFkeSByZWNvdmVyaW5nIGZyb20gYW4gZXJyb3IsIHJlcG9ydCB0aGlzIGVycm9yLiAgKi8KKyAgICB7CisgICAgICArK3l5bmVycnM7CisKKyNpZmRlZiBZWUVSUk9SX1ZFUkJPU0UKKyAgICAgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKKworICAgICAgaWYgKHl5biA+IFlZRkxBRyAmJiB5eW4gPCBZWUxBU1QpCisJeworCSAgaW50IHNpemUgPSAwOworCSAgY2hhciAqbXNnOworCSAgaW50IHgsIGNvdW50OworCisJICBjb3VudCA9IDA7CisJICAvKiBTdGFydCBYIGF0IC15eW4gaWYgbmVjIHRvIGF2b2lkIG5lZ2F0aXZlIGluZGV4ZXMgaW4geXljaGVjay4gICovCisJICBmb3IgKHggPSAoeXluIDwgMCA/IC15eW4gOiAwKTsKKwkgICAgICAgeCA8IChzaXplb2YoeXl0bmFtZSkgLyBzaXplb2YoY2hhciAqKSk7IHgrKykKKwkgICAgaWYgKHl5Y2hlY2tbeCArIHl5bl0gPT0geCkKKwkgICAgICBzaXplICs9IHN0cmxlbih5eXRuYW1lW3hdKSArIDE1LCBjb3VudCsrOworCSAgbXNnID0gKGNoYXIgKikgbWFsbG9jKHNpemUgKyAxNSk7CisJICBpZiAobXNnICE9IDApCisJICAgIHsKKwkgICAgICBzdHJjcHkobXNnLCAicGFyc2UgZXJyb3IiKTsKKworCSAgICAgIGlmIChjb3VudCA8IDUpCisJCXsKKwkJICBjb3VudCA9IDA7CisJCSAgZm9yICh4ID0gKHl5biA8IDAgPyAteXluIDogMCk7CisJCSAgICAgICB4IDwgKHNpemVvZih5eXRuYW1lKSAvIHNpemVvZihjaGFyICopKTsgeCsrKQorCQkgICAgaWYgKHl5Y2hlY2tbeCArIHl5bl0gPT0geCkKKwkJICAgICAgeworCQkJc3RyY2F0KG1zZywgY291bnQgPT0gMCA/ICIsIGV4cGVjdGluZyBgIiA6ICIgb3IgYCIpOworCQkJc3RyY2F0KG1zZywgeXl0bmFtZVt4XSk7CisJCQlzdHJjYXQobXNnLCAiJyIpOworCQkJY291bnQrKzsKKwkJICAgICAgfQorCQl9CisJICAgICAgeXllcnJvcihtc2cpOworCSAgICAgIGZyZWUobXNnKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB5eWVycm9yICgicGFyc2UgZXJyb3I7IGFsc28gdmlydHVhbCBtZW1vcnkgZXhjZWVkZWQiKTsKKwl9CisgICAgICBlbHNlCisjZW5kaWYgLyogWVlFUlJPUl9WRVJCT1NFICovCisJeXllcnJvcigicGFyc2UgZXJyb3IiKTsKKyAgICB9CisKKyAgZ290byB5eWVycmxhYjE7Cit5eWVycmxhYjE6ICAgLyogaGVyZSBvbiBlcnJvciByYWlzZWQgZXhwbGljaXRseSBieSBhbiBhY3Rpb24gKi8KKworICBpZiAoeXllcnJzdGF0dXMgPT0gMykKKyAgICB7CisgICAgICAvKiBpZiBqdXN0IHRyaWVkIGFuZCBmYWlsZWQgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuIGFmdGVyIGFuIGVycm9yLCBkaXNjYXJkIGl0LiAgKi8KKworICAgICAgLyogcmV0dXJuIGZhaWx1cmUgaWYgYXQgZW5kIG9mIGlucHV0ICovCisgICAgICBpZiAoeXljaGFyID09IFlZRU9GKQorCVlZQUJPUlQ7CisKKyNpZiBZWURFQlVHICE9IDAKKyAgICAgIGlmICh5eWRlYnVnKQorCWZwcmludGYoc3RkZXJyLCAiRGlzY2FyZGluZyB0b2tlbiAlZCAoJXMpLlxuIiwgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKKyNlbmRpZgorCisgICAgICB5eWNoYXIgPSBZWUVNUFRZOworICAgIH0KKworICAvKiBFbHNlIHdpbGwgdHJ5IHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbgorICAgICBhZnRlciBzaGlmdGluZyB0aGUgZXJyb3IgdG9rZW4uICAqLworCisgIHl5ZXJyc3RhdHVzID0gMzsJCS8qIEVhY2ggcmVhbCB0b2tlbiBzaGlmdGVkIGRlY3JlbWVudHMgdGhpcyAqLworCisgIGdvdG8geXllcnJoYW5kbGU7CisKK3l5ZXJyZGVmYXVsdDogIC8qIGN1cnJlbnQgc3RhdGUgZG9lcyBub3QgZG8gYW55dGhpbmcgc3BlY2lhbCBmb3IgdGhlIGVycm9yIHRva2VuLiAqLworCisjaWYgMAorICAvKiBUaGlzIGlzIHdyb25nOyBvbmx5IHN0YXRlcyB0aGF0IGV4cGxpY2l0bHkgd2FudCBlcnJvciB0b2tlbnMKKyAgICAgc2hvdWxkIHNoaWZ0IHRoZW0uICAqLworICB5eW4gPSB5eWRlZmFjdFt5eXN0YXRlXTsgIC8qIElmIGl0cyBkZWZhdWx0IGlzIHRvIGFjY2VwdCBhbnkgdG9rZW4sIG9rLiAgT3RoZXJ3aXNlIHBvcCBpdC4qLworICBpZiAoeXluKSBnb3RvIHl5ZGVmYXVsdDsKKyNlbmRpZgorCit5eWVycnBvcDogICAvKiBwb3AgdGhlIGN1cnJlbnQgc3RhdGUgYmVjYXVzZSBpdCBjYW5ub3QgaGFuZGxlIHRoZSBlcnJvciB0b2tlbiAqLworCisgIGlmICh5eXNzcCA9PSB5eXNzKSBZWUFCT1JUOworICB5eXZzcC0tOworICB5eXN0YXRlID0gKi0teXlzc3A7CisjaWZkZWYgWVlMU1BfTkVFREVECisgIHl5bHNwLS07CisjZW5kaWYKKworI2lmIFlZREVCVUcgIT0gMAorICBpZiAoeXlkZWJ1ZykKKyAgICB7CisgICAgICBzaG9ydCAqc3NwMSA9IHl5c3MgLSAxOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6IHN0YXRlIHN0YWNrIG5vdyIpOworICAgICAgd2hpbGUgKHNzcDEgIT0geXlzc3ApCisJZnByaW50ZiAoc3RkZXJyLCAiICVkIiwgKisrc3NwMSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworICAgIH0KKyNlbmRpZgorCit5eWVycmhhbmRsZToKKworICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisgIGlmICh5eW4gPT0gWVlGTEFHKQorICAgIGdvdG8geXllcnJkZWZhdWx0OworCisgIHl5biArPSBZWVRFUlJPUjsKKyAgaWYgKHl5biA8IDAgfHwgeXluID4gWVlMQVNUIHx8IHl5Y2hlY2tbeXluXSAhPSBZWVRFUlJPUikKKyAgICBnb3RvIHl5ZXJyZGVmYXVsdDsKKworICB5eW4gPSB5eXRhYmxlW3l5bl07CisgIGlmICh5eW4gPCAwKQorICAgIHsKKyAgICAgIGlmICh5eW4gPT0gWVlGTEFHKQorCWdvdG8geXllcnJwb3A7CisgICAgICB5eW4gPSAteXluOworICAgICAgZ290byB5eXJlZHVjZTsKKyAgICB9CisgIGVsc2UgaWYgKHl5biA9PSAwKQorICAgIGdvdG8geXllcnJwb3A7CisKKyAgaWYgKHl5biA9PSBZWUZJTkFMKQorICAgIFlZQUNDRVBUOworCisjaWYgWVlERUJVRyAhPSAwCisgIGlmICh5eWRlYnVnKQorICAgIGZwcmludGYoc3RkZXJyLCAiU2hpZnRpbmcgZXJyb3IgdG9rZW4sICIpOworI2VuZGlmCisKKyAgKisreXl2c3AgPSB5eWx2YWw7CisjaWZkZWYgWVlMU1BfTkVFREVECisgICorK3l5bHNwID0geXlsbG9jOworI2VuZGlmCisKKyAgeXlzdGF0ZSA9IHl5bjsKKyAgZ290byB5eW5ld3N0YXRlOworCisgeXlhY2NlcHRsYWI6CisgIC8qIFlZQUNDRVBUIGNvbWVzIGhlcmUuICAqLworICBpZiAoeXlmcmVlX3N0YWNrcykKKyAgICB7CisgICAgICBmcmVlICh5eXNzKTsKKyAgICAgIGZyZWUgKHl5dnMpOworI2lmZGVmIFlZTFNQX05FRURFRAorICAgICAgZnJlZSAoeXlscyk7CisjZW5kaWYKKyAgICB9CisgIHJldHVybiAwOworCisgeXlhYm9ydGxhYjoKKyAgLyogWVlBQk9SVCBjb21lcyBoZXJlLiAgKi8KKyAgaWYgKHl5ZnJlZV9zdGFja3MpCisgICAgeworICAgICAgZnJlZSAoeXlzcyk7CisgICAgICBmcmVlICh5eXZzKTsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgICAgIGZyZWUgKHl5bHMpOworI2VuZGlmCisgICAgfQorICByZXR1cm4gMTsKK30KKyNsaW5lIDE3MyAibWluaWNvbXBnLnkiCisKKworI2luY2x1ZGUgIm1pbmljb21wbGV4ZXIuYyIKKwpkaWZmIC0tZ2l0IGEvbWluaWNvbXBsZXhlci5jIGIvbWluaWNvbXBsZXhlci5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIzMzc5OTUKLS0tIC9kZXYvbnVsbAorKysgYi9taW5pY29tcGxleGVyLmMKQEAgLTAsMCArMSw3OSBAQAorCitGSUxFICppbmZpbGU7CitzdGF0aWMgaW50IGN1cl9jaGFyPScgJzsKKworY2hhciB0a25hbWVbTUFYTEVOXTsKKworaW50IHl5bGV4KCkKK3sKKyAgY2hhciAqcD10a25hbWU7CisgIGludCB0bXA7CisKKyAgd2hpbGUoaXNzcGFjZShjdXJfY2hhcikpCisgICAgY3VyX2NoYXI9Z2V0YyhpbmZpbGUpOworCisgIGlmKGlzZGlnaXQoY3VyX2NoYXIpKXsKKyAgICBkb3sKKyAgICAgICpwKys9Y3VyX2NoYXI7CisgICAgICBjdXJfY2hhcj1nZXRjKGluZmlsZSk7CisgICAgfXdoaWxlKGlzZGlnaXQoY3VyX2NoYXIpKTsKKyAgICBpZihjdXJfY2hhcj09Jy4nKXsKKyAgICAgICpwKys9Y3VyX2NoYXI7CisgICAgICBjdXJfY2hhcj1nZXRjKGluZmlsZSk7CisgICAgICB3aGlsZShpc2RpZ2l0KGN1cl9jaGFyKSl7CisJKnArKz1jdXJfY2hhcjsKKwljdXJfY2hhcj1nZXRjKGluZmlsZSk7CisgICAgICB9CisgICAgfQorICAgICpwKys9MDsKKyAgICByZXR1cm4gVEtOVU1CRVI7CisgIH0KKyAgaWYoaXNhbHBoYShjdXJfY2hhcikpeworICAgIGRveworICAgICAgKnArKz1jdXJfY2hhcjsKKyAgICAgIGN1cl9jaGFyPWdldGMoaW5maWxlKTsKKyAgICB9d2hpbGUoaXNhbG51bShjdXJfY2hhcikpOworICAgICpwKys9MDsKKyAgICBpZighc3RyY21wKHRrbmFtZSwiaW50IikpCisgICAgICByZXR1cm4gVEtJTlQ7CisgICAgaWYoIXN0cmNtcCh0a25hbWUsInJlYWwiKSkKKyAgICAgIHJldHVybiBUS1JFQUw7CisgICAgaWYoIXN0cmNtcCh0a25hbWUsImlmIikpCisgICAgICByZXR1cm4gVEtJRjsKKyAgICBpZighc3RyY21wKHRrbmFtZSwiZWxzZSIpKQorICAgICAgcmV0dXJuIFRLRUxTRTsKKyAgICBpZighc3RyY21wKHRrbmFtZSwid2hpbGUiKSkKKyAgICAgIHJldHVybiBUS1dISUxFOworICAgIGlmKCFzdHJjbXAodGtuYW1lLCJyZXR1cm4iKSkKKyAgICAgIHJldHVybiBUS1JFVFVSTjsKKyAgICByZXR1cm4gVEtJREVOVElGSUVSOworICB9CisgIHRtcD1jdXJfY2hhcjsKKyAgY3VyX2NoYXI9Z2V0YyhpbmZpbGUpOworICBpZih0bXA9PSchJyYmY3VyX2NoYXI9PSc9Jyl7CisgICAgY3VyX2NoYXI9Z2V0YyhpbmZpbGUpOworICAgIHJldHVybiBUS05FUTsKKyAgfQorICBpZih0bXA9PSc8JyYmY3VyX2NoYXI9PSc9Jyl7CisgICAgY3VyX2NoYXI9Z2V0YyhpbmZpbGUpOworICAgIHJldHVybiBUS0xFUTsKKyAgfQorICBpZih0bXA9PSc+JyYmY3VyX2NoYXI9PSc9Jyl7CisgICAgY3VyX2NoYXI9Z2V0YyhpbmZpbGUpOworICAgIHJldHVybiBUS0dFUTsKKyAgfQorICBpZih0bXA9PScmJyYmY3VyX2NoYXI9PScmJyl7CisgICAgY3VyX2NoYXI9Z2V0YyhpbmZpbGUpOworICAgIHJldHVybiBUS0FORDsKKyAgfQorICBpZih0bXA9PSd8JyYmY3VyX2NoYXI9PSd8Jyl7CisgICAgY3VyX2NoYXI9Z2V0YyhpbmZpbGUpOworICAgIHJldHVybiBUS09SOworICB9CisgIGlmKHRtcD09JzonJiZjdXJfY2hhcj09Jz0nKXsKKyAgICBjdXJfY2hhcj1nZXRjKGluZmlsZSk7CisgICAgcmV0dXJuIFRLQVNTSUdOOworICB9CisgIHJldHVybiB0bXA7Cit9CisKZGlmZiAtLWdpdCBhL21pc3JhX2Vycm9ycy5oIGIvbWlzcmFfZXJyb3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDlhMTI4ZQotLS0gL2Rldi9udWxsCisrKyBiL21pc3JhX2Vycm9ycy5oCkBAIC0wLDAgKzEsMzgwIEBACisvKiBLYXBpdGVsIDEgKi8KKzEsMSwiQWxsIGNvZGUgc2hhbGwgY29uZm9ybSB0byBJU08gOTg5OToxOTkwIFwiUHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIC0gQ+JcIiwgYW1lbmRlZCBhbmQgIgorImNvcnJlY3RlZCBieSBJU08vSUVDIDk4OTkvQ09SMToxOTk1LCBJU08vSUVDIDk4OTkvQU1EMToxOTk1LCBhbmQgSVNPL0lFQyA5ODk5L0NPUjI6MTk5Ni4iLE1JU1JBfE1JU1JBXzIwMDQsCisKKzEsMiwiTm8gcmVsaWFuY2Ugc2hhbGwgYmUgcGxhY2VkIG9uIHVuZGVmaW5lZCBvciB1bnNwZWNpZmllZCBiZWhhdmlvdXIuIixNSVNSQXxNSVNSQV8yMDA0LAorCisxLDMsIk11bHRpcGxlIGNvbXBpbGVycyBhbmQvb3IgbGFuZ3VhZ2VzIHNoYWxsIG9ubHkgYmUgdXNlZCBpZiB0aGVyZSBpcyBhIGNvbW1vbiBkZWZpbmVkICIKKyJpbnRlcmZhY2Ugc3RhbmRhcmQgZm9yIG9iamVjdCBjb2RlIHRvIHdoaWNoIHRoZSBsYW5ndWFnZXMvY29tcGlsZXJzL2Fzc2VtYmxlciBjb25mb3JtcyIsTUlTUkF8TUlTUkFfMjAwNCwKKworMSw0LCJUaGUgY29tcGlsZXIvbGlua2VyIHNoYWxsIGJlIGNoZWNrZWQgdG8gZW5zdXJlIHRoYXQgMzEgY2hhcmFjdGVyIHNpZ25pZmljYW5jZSBhbmQgIgorImNhc2Ugc2Vuc2l0aXZpdHkgYXJlIHN1cHBvcnRlZCBmb3IgZXh0ZXJuYWwgaWRlbnRpZmllcnMiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzEsNSwiRmxvYXRpbmcgcG9pbnQgaW1wbGVtZW50YXRpb25zIHNob3VsZCBjb21wbHkgd2l0aCBhIGRlZmluZWQgZmxvYXRpbmctcG9pbnQgc3RhbmRhcmQiLE1JU1JBfE1JU1JBXzIwMDQsCisKKy8qIEthcGl0ZWwgMiAqLworMiwxLCJBc3NlbWJseSBsYW5ndWFnZSBzaGFsbCBiZSBlbmNhcHN1bGF0ZWQgYW5kIGlzb2xhdGVkIixNSVNSQXxNSVNSQV8yMDA0LAorCisyLDIsIlNvdXJjZSBjb2RlIHNoYWxsIG9ubHkgdXNlIC8qIC4uLiAqLyBzdHlsZSBjb21tZW50cyIsTUlTUkF8TUlTUkFfMjAwNCwKKworMiwzLCJUaGUgY2hhcmFjdGVyIHNlcXVlbmNlIC8qIHNoYWxsIG5vdCBiZSB1c2VkIHdpdGhpbiBhIGNvbW1lbnQiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzIsNCwiU2VjdGlvbnMgb2YgY29kZSBzaG91bGQgbm90IGJlIFwiY29tbWVudGVkIG91dFwiIixNSVNSQXxNSVNSQV8yMDA0LAorCisKKy8qIEthcGl0ZWwgMyAqLworMywxLCJBbGwgdXNhZ2Ugb2YgaW1wbGVtZW50YXRpb24tZGVmaW5lZCBiZWhhdmlvdXIgc2hhbGwgYmUgZG9jdW1lbnRlZCAiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzMsMiwiVGhlIGNoYXJhY3RlciBzZXQgYW5kIGNvcnJlc3BvbmRpbmcgZW5jb2Rpbmcgc2hhbGwgYmUgZG9jdW1lbnRlZCIsTUlTUkF8TUlTUkFfMjAwNCwKKworMywzLCJUaGUgaW1wbGVtZW50YXRpb24gb2YgaW50ZWdlciBkaXZpc2lvbiBpbiB0aGUgY2hvc2VuIGNvbXBpbGVyIHNob3VsZCAiCisiYmUgZGV0ZXJtaW5lZCwgZG9jdW1lbnRlZCBhbmQgdGFrZW4gaW50byBhY2NvdW50IixNSVNSQXxNSVNSQV8yMDA0LAorCiszLDQsIkFsbCB1c2Ugb2YgdGhlICNwcmFnbWEgZGlyZWN0aXZlIHNoYWxsIGJlIGRvY3VtZW50ZWQgYW5kIGV4cGxhaW5lZCIsTUlTUkF8TUlTUkFfMjAwNCwKKworMyw1LCJJZiBpdCBpcyBiZWluZyByZWxpZWQgdXBvbiwgdGhlIGltcGxlbWVudGF0aW9uLWRlZmluZWQgYmVoYXZpb3VyIGFuZCAiCisicGFja2luZyBvZiBiaXRmaWVsZHMgc2hhbGwgYmUgZG9jdW1lbnRlZCIsTUlTUkF8TUlTUkFfMjAwNCwKKworMyw2LCJBbGwgbGlicmFyaWVzIHVzZWQgaW4gcHJvZHVjdGlvbiBjb2RlIHNoYWxsIGJlIHdyaXR0ZW4gdG8gY29tcGx5IHdpdGggIgorInRoZSBwcm92aXNpb25zIG9mIHRoaXMgZG9jdW1lbnQsIGFuZCBzaGFsbCBoYXZlIGJlZW4gc3ViamVjdCB0byBhcHByb3ByaWF0ZSB2YWxpZGF0aW9uIixNSVNSQXxNSVNSQV8yMDA0LAorCisKKy8qIEthcGl0ZWwgNCAqLworNCwxLCJPbmx5IHRob3NlIGVzY2FwZSBzZXF1ZW5jZXMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgSVNPIEMgc3RhbmRhcmQgc2hhbGwgYmUgdXNlZCIsTUlTUkF8TUlTUkFfMjAwNHxNSVNSQV9QUkVQUk9DLAorCis0LDIsIlRyaWdyYXBocyBzaGFsbCBub3QgYmUgdXNlZCIsTUlTUkF8TUlTUkFfMjAwNCwKKworCisvKiBLYXBpdGVsIDUqLworNSwxLCJJZGVudGlmaWVycyAoaW50ZXJuYWwgYW5kIGV4dGVybmFsKSBzaGFsbCBub3QgcmVseSBvbiB0aGUgc2lnbmlmaWNhbmNlICIKKyJvZiBtb3JlIHRoYW4gMzEgY2hhcmFjdGVycyIsTUlTUkF8TUlTUkFfMjAwNCwKKworNSwyLCJJZGVudGlmaWVycyBpbiBhbiBpbm5lciBzY29wZSBzaGFsbCBub3QgdXNlIHRoZSBzYW1lIG5hbWUgYXMgYW4gaWRlbnRpZmllciAiCisiaW4gYW4gb3V0ZXIgc2NvcGUsIGFuZCB0aGVyZWZvciBoaWRlIHRoYXQgaWRlbnRpZmllciIsTUlTUkF8TUlTUkFfMjAwNCwKKworNSwzLCJBIHR5cGVkZWYgbmFtZSBzaGFsbCBiZSBhIHVuaXF1ZSBpZGVudGlmaWVyIixNSVNSQXxNSVNSQV8yMDA0LAorCis1LDQsIkEgdGFnIG5hbWUgc2hhbGwgYmUgYSB1bmlxdWUgaWRlbnRpZmllciIsTUlTUkF8TUlTUkFfMjAwNCwKKworNSw1LCJObyBvYmplY3Qgb3IgZnVuY3Rpb24gaWRlbnRpZmllciB3aXRoIHN0YXRpYyBzdG9yYWdlIGR1cmF0aW9uIHNob3VsZCBiZSByZXVzZWQiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzUsNiwiTm8gaWRlbnRpZmllciBpbiBvbmUgbmFtZSBzcGFjZSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBzcGVsbGluZyBhcyBhbiBpZGVudGlmaWVyICIKKyJpbiBhbm90aGVyIG5hbWUgc3BhY2UsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBzdHJ1Y3R1cmUgYW5kIHVuaW9uIG1lbWJlciBuYW1lcyIsTUlTUkF8TUlTUkFfMjAwNCwKKworNSw3LCJObyBpZGVudGlmaWVyIG5hbWUgc2hvdWxkIGJlIHJldXNlZCIsTUlTUkF8TUlTUkFfMjAwNCwKKworCisvKiBLYXBpdGVsIDYgKi8KKzYsMSwiVGhlIHBsYWluIGNoYXIgdHlwZSBzaGFsbCBiZSB1c2VkIG9ubHkgZm9yIHRoZSBzdG9yYWdlIGFuZCB1c2Ugb2YgY2hhcmFjdGVyIHZhbHVlcyIsTUlTUkF8TUlTUkFfMjAwNCwKKworNiwyLCJzaWduZWQgYW5kIHVuc2lnbmVkIGNoYXIgdHlwZSBzaGFsbCBiZSB1c2VkIG9ubHkgZm9yIHRoZSBzdG9yYWdlIGFuZCB1c2Ugb2YgbnVtZXJpYyB2YWx1ZXMiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzYsMywidHlwZWRlZnMgdGhhdCBpbmRpY2F0ZSBzaXplIGFuZCBzaWduZWRuZXNzIHNob3VsZCBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZSBiYXNpYyB0eXBlcyIsTUlTUkF8TUlTUkFfMjAwNCwKKworNiw0LCJCaXQgZmllbGRzIHNoYWxsIG9ubHkgYmUgZGVmaW5lZCB0byBiZSBvZiB0eXBlIHVuc2lnbmVkIGludCBvciBzaWduZWQgaW50IixNSVNSQXxNSVNSQV8yMDA0LAorCis2LDUsIkJpdCBmaWVsZHMgb2YgdHlwZSBzaWduZWQgaW50IHNoYWxsIGJlIGF0IGxlYXN0IDIgYml0IGxvbmciLE1JU1JBfE1JU1JBXzIwMDQsCisKKworLyogS2FwaXRlbCA3ICovCis3LDEsIk9jdGFsIGNvbnN0YW50cyAob3RoZXIgdGhhbiB6ZXJvKSBhbmQgb2N0YWwgZXNjYXBlIHNlcXVlbmNlcyBzaGFsbCBub3QgYmUgdXNlZCIsTUlTUkF8TUlTUkFfMjAwNCwKKworCisvKiBLYXBpdGVsIDggKi8KKzgsMSwiRnVuY3Rpb25zIHNoYWxsIGhhdmUgcHJvdG90eXBlIGRlY2xhcmF0aW9uIGFuZCB0aGUgcHJvdG90eXBlIHNoYWxsICIKKyJiZSB2aXNpYmxlIGF0IGJvdGggdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gYW5kIGNhbGwiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzgsMiwiV2hlbmV2ZXIgYW4gb2JqZWN0IG9yIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIG9yIGRlZmluZWQsIGl0cyB0eXBlIHNoYWxsICIKKyJiZSBleHBsaWNpdGx5IHN0YXRlZCIsTUlTUkF8TUlTUkFfMjAwNCwKKworOCwzLCJGb3IgZWFjaCBmdW5jdGlvbiBwYXJhbWV0ZXIgdGhlIHR5cGUgZ2l2ZW4gaW4gdGhlIGRlY2xhcmF0aW9uIGFuZCAiCisiZGVmaW5pdGlvbiBzaGFsbCBiZSBpZGVudGljYWwsIGFuZCB0aGUgcmV0dXJuIHR5cGUgc2hhbGwgYWxzbyBiZSBpZGVudGljYWwiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzgsNCwiSWYgb2JqZWN0cyBvciBmdW5jdGlvbnMgYXJlIGRlY2xhcmVkIG1vcmUgdGhhbiBvbmNlIHRoZWlyIHR5cGUgc2hhbGwgYmUgY29tcGF0aWJsZSIsTUlTUkF8TUlTUkFfMjAwNCwKKworOCw1LCJUaGVyZSBzaGFsbCBiZSBubyBkZWZpbml0aW9uIG9mIG9iamVjdHMgb3IgZnVuY3Rpb25zIGluIGEgaGVhZGVyIGZpbGUiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzgsNiwiRnVuY3Rpb25zIHNoYWxsIGJlIGRlY2xhcmVkIGF0IGZpbGUgc2NvcGUiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzgsNywiT2JqZWN0cyBzaGFsbCBiZSBkZWZpbmVkIGF0IGJsb2NrIHNjb3BlIGlmIHRoZXkgYXJlIG9ubHkgYWNjZXNzZWQgZnJvbSAiCisid2l0aGluIGEgc2luZ2xlIGZ1bmN0aW9uIixNSVNSQXxNSVNSQV8yMDA0LAorCis4LDgsIkFuIGV4dGVybmFsIG9iamVjdCBvciBmdW5jdGlvbiBzaGFsbCBiZSBkZWNsYXJlZCBpbiBvbmUgYW5kIG9ubHkgb25lIGZpbGUiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzgsOSwiQW4gaWRlbnRpZmllciB3aXRoIGV4dGVybmFsIGxpbmthZ2Ugc2hhbGwgaGF2ZSBleGNhY3RseSBvbmUgZXh0ZXJuYWwgZGVmaW5pdGlvbiIsTUlTUkF8TUlTUkFfMjAwNCwKKworOCwxMCwiQWxsIGRlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMgb2Ygb2JqZWN0cyBhbmQgZnVuY3Rpb25zIGF0IGZpbGUgc2NvcGUgc2hhbGwgIgorImhhdmUgaW50ZXJuYWwgbGlua2FnZSAgdW5sZXNzIGV4dGVybmFsIGxpbmthZ2UgaXMgcmVxdWlyZWQiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzgsMTEsIlRoZSBzdGF0aWMgc3RvcmFnZSBjbGFzcyBzcGVjaWZpZXIgc2hhbGwgYmUgdXNlZCBpbiBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zICIKKyJvZiBvYmplY3RzIGFuZCBmdW5jdGlvbnMgdGhhdCBoYXZlIGludGVybmFsIGxpbmthZ2UiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzgsMTIsIldoZW4gYW4gYXJyYXkgaXMgZGVjbGFyZWQgd2l0aCBleHRlcm5hbCBsaW5rYWdlLCBpdHMgc2l6ZSBzaGFsbCBiZSBzdGF0ZWQgIgorIm9yIGRlZmluZWQgaW1wbGljaXRseSBiZSBpbml0aWFsaXNhdGlvbiIsTUlTUkF8TUlTUkFfMjAwNCwKKworCisvKiBLYXBpdGVsIDkgKi8KKzksMSwiQWxsIGF1dG9tYXRpYyB2YXJpYWJsZXMgc2hhbGwgaGF2ZSBiZWVuIGFzc2lnbmVkIGEgdmFsdWUgYmVmb3JlIGJlaW5nIHVzZWQiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzksMiwiQnJhY2VzIHNoYWxsIGJlIHVzZWQgdG8gaW5kaWNhdGUgYW5kIG1hdGNoIHRoZSBzdHJ1Y3R1cmUgaW4gdGhlIG5vbi16ZXJvICIKKyJpbml0aWFsaXNhdGlvbiBvZiBhcnJheXMgYW5kIHN0cnVjdHVyZXMiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzksMywiSW4gYW4gZW51bWVyYXRvciBsaXN0LCB0aGUgXCI9XCIgY29uc3RydWN0IHNoYWxsIG5vdCBiZSB1c2VkIHRvIGV4cGxpY2l0bHkgIgorImluaXRpYWxpc2UgbWVtYmVycyBvdGhlciB0aGFuIHRoZSBmaXJzdCwgdW5sZXNzIGFsbCBpdGVtcyBhcmUgZXhwbGljaXRseSBpbml0aWFsaXNlZCIsTUlTUkF8TUlTUkFfMjAwNCwKKworCisvKiBLYXBpdGVsIDEwICovCisxMCwxLCJUaGUgdmFsdWUgb2YgYW4gZXhwcmVzc2lvbiBvZiBpbnRlZ2VyIHR5cGUgc2hhbGwgbm90IGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIGEgZGlmZmVyZW50IHVuZGVybHlpbmcgdHlwZSBpZjogXG4iCisiICBhKSBpdCBpcyBub3QgYSBjb252ZXJzaW9uIHRvIGEgd2lkZXIgaW50ZWdlciB0eXBlIG9mIHRoZSBzYW1lIHNpZ25lZG5lc3MsIG9yXG4iCisiICBiKSB0aGUgZXhwcmVzc2lvbiBpcyBjb21wbGV4LCBvclxuIgorIiAgYykgdGhlIGV4cHJlc3Npb24gaXMgbm90IGNvbnN0YW50IGFuZCBpcyBhIGZ1bmN0aW9uIGFyZ3VtZW50LCBvclxuIgorIiAgZCkgdGhlIGV4cHJlc3Npb24gaXMgbm90IGNvbnN0YW50IGFuZCBpcyBhIHJldHVybiBleHByZXNzaW9uIixNSVNSQXxNSVNSQV8yMDA0LAorCisxMCwyLCJUaGUgdmFsdWUgb2YgYW4gZXhwcmVzc2lvbiBvZiBmbG9hdGluZyB0eXBlIHNoYWxsIG5vdCBiZSBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBhIGRpZmZlcmVudCB0eXBlIGlmOlxuIgorIiAgYSkgaXQgaXMgbm90IGEgY29udmVyc2lvbiB0byBhIHdpZGVyIGZsb2F0aW5nIHR5cGUsIG9yXG4iCisiICBiKSB0aGUgZXhwcmVzc2lvbiBpcyBjb21wbGV4LCBvclxuIgorIiAgYykgdGhlIGV4cHJlc3Npb24gaXMgYSBmdW5jdGlvbiBhcmd1bWVudCwgb3JcbiIKKyIgIGQpIHRoZSBleHByZXNzaW9uIGlzIGEgcmV0dXJuIGV4cHJlc3Npb25cbiIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTAsMywiVGhlIHZhbHVlIG9mIGEgY29tcGxleCBleHByZXNzaW9uIG9mIGludGVnZXIgdHlwZSBtYXkgb25seSBiZSBjYXN0ICIKKyJ0byBhIGF0eXBlIHRoYXQgaXMgbmFycm93ZXIgYW5kIG9mIHRoZSBzYW1lIHNpZ25lZG5lc3MgYXMgdGhlICIKKyJ1bmRlcmx5aW5nIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24iLE1JU1JBfE1JU1JBXzIwMDQsCisKKzEwLDQsIlRoZSB2YWx1ZSBvZiBhIGNvbXBsZXggZXhwcmVzc2lvbiBvZiBmbG9hdGluZyB0eXBlIG1heSBvbmx5IGJlIGNhc3QgIgorInRvIGEgbmFycm93ZXIgZmxvYXRpbmcgdHlwZSIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTAsNSwiSWYgdGhlIGJpdHdpc2Ugb3BlcmF0b3JzIH4gYW5kIDw8IGFyZSBhcHBsaWVkIHRvIGFuIG9wZXJhbmQgb2YgIgorInVuZGVybHlpbmcgdHlwZSB1bnNpZ25lZCBjaGFyIG9yIHVuc2lnbmVkIHNob3J0LCB0aGUgcmVzdWx0ICIKKyJzaGFsbCBiZSBpbW1lZGlhdGVseSBjYXN0IHRvIHRoZSB1bmRlcmx5aW5nIHR5cGUgb2YgdGhlIG9wZXJhbmQiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzEwLDYsIkEgXCJVXCIgc3VmZml4IHNoYWxsIGJlIGFwcGxpZWQgdG8gYWxsIGNvbnN0YW50cyBvZiB1bnNpZ25lZCB0eXBlIixNSVNSQXxNSVNSQV8yMDA0LAorCisvKiBLYXBpdGVsIDExICovCisxMSwxLCJDb252ZXJzaW9ucyBzaGFsbCBub3QgYmUgcGVyZm9ybWVkIGJldHdlZW4gYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gYW5kIGFueSB0eXBlICIKKyJvdGhlciB0aGFuIGFuIGludGVncmFsIHR5cGUiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzExLDIsIkNvbnZlcnNpb25zIHNoYWxsIG5vdCBiZSBwZXJmb3JtZWQgYmV0d2VlbiBhIHBvaW50ZXIgdG8gb2JqZWN0IGFuZCBhbnkgdHlwZSAiCisib3RoZXIgdGhhbiBhbiBpbnRlZ3JhbCB0eXBlLCBhbm90aGVyIHBvaW50ZXIgdG8gb2JqZWN0IHR5cGUgb3IgYSBwb2ludGVyIHRvIHZvaWQiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzExLDMsIkEgY2FzdCBzaG91bGQgbm90IGJlIHBlcmZvcm1lZCBiZXR3ZWVuIGEgcG9pbnRlciB0eXBlIGFuZCBhbiBpbnRlZ3JhbCB0eXBlIixNSVNSQXxNSVNSQV8yMDA0LAorCisxMSw0LCJBIGNhc3Qgc2hvdWxkIG5vdCBiZSBwZXJmb3JtZWQgYmV0d2VlbiBhIHBvaW50ZXIgdG8gb2JqZWN0IHR5cGUgYW5kIGEgIgorImRpZmZlcmVudCBwb2ludGVyIHRvIG9iamVjdCB0eXBlLiIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTEsNSwiQSBjYXN0IHNoYWxsIG5vdCBiZSBwZXJmb3JtZWQgdGhhdCByZW1vdmVzIGFueSBjb25zdCBvciB2b2xhdGlsZSBxdWFsaWZpY2F0aW9uICIKKyJmcm9tIHRoZSB0eXBlIGFkZHJlc3NlcyBieSBhIHBvaW50ZXIiLE1JU1JBfE1JU1JBXzIwMDQsCisKKworLyogS2FwaXRlbCAxMiAqLworMTIsMSwiTGltaXRlZCBkZXBlbmRlbmNlIHNob3VsZCBiZSBwbGFjZWQgb24gQydzIG9wZXJhdG9yIHByZWNlZGVuY2UgcnVsZXMgaW4gZXhwcmVzc2lvbnMiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzEyLDIsIlRoZSB2YWx1ZSBvZiBhbiBleHByZXNzaW9uIHNoYWxsIGJlIHRoZSBzYW1lIHVuZGVyIGFueSBvcmRlciBvZiAiCisiZXZhbHVhdGlvbiB0aGF0IHRoZSBzdGFuZGFyZCBwZXJtaXRzIixNSVNSQXxNSVNSQV8yMDA0LAorCisxMiwzLCJUaGUgc2l6ZW9mIG9wZXJhdG9yIHNoYWxsIG5vdCBiZSB1c2VkIG9uIGV4cHJlc3Npb25zIHRoYXQgY29udGFpbiBzaWRlIGVmZmVjdHMiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzEyLDQsIlRoZSByaWdodC1oYW5kIG9wZXJhbmQgb2YgYSBsb2dpY2FsICYmIG9yIHx8IG9wZXJhdG9yIHNoYWxsIG5vdCAiCisiY29udGFpbiBzaWRlIGVmZmVjdHMiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzEyLDUsIlRoZSBvcGVyYW5kcyBvZiBhIGxvZ2ljYWwgJiYgb3IgfHwgc2hhbGwgYmUgcHJpbWFyeS1leHByZXNzaW9ucyIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTIsNiwiVGhlIG9wZXJhbmRzIG9mIGxvZ2ljYWwgb3BlcmF0b3JzICgmJiwgfHwgYW5kICEpIHNob3VsZCBiZSBlZmZlY3RpdmVseSBCb29sZWFuLCAiCisiRXhwcmVzc2lvbnMgdGhhdCBhcmUgZWZmZWN0aXZlbHkgQm9vbGVhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGFzIG9wZXJhbmRzIHRvICIKKyJlcGVyYXRvcnMgb3RoZXIgdGhhbigmJiwgfHwgYW5kICEpIixNSVNSQXxNSVNSQV8yMDA0LAorCisxMiw3LCJCaXR3ZWlzZSBvcGVyYXRvcnMgc2hhbGwgbm90IGJlIGFwcGxpZWQgdG8gb3BlcmFuZHMgd2hvc2UgdW5kZXJseWluZyB0eXBlIGlzIHNpZ25lZCIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTIsOCwiVGhlIHJpZ2h0LWhhbmQgb3BlcmFuZCBvZiBhIHNoaWZ0IG9wZXJhdG9yIHNoYWxsIGxpZSBiZXR3ZWVuIHplcm8gYW5kIG9uZSBsZXNzICIKKyJ0aGFuIHRoZSB3aWR0aCBpbiBiaXRzIG9mIHRoZXIgdW5kZXJseWluZyB0eXBlIG9mIHRoZSBsZWZ0LWhhbmQgb3BlcmFuZC4iLE1JU1JBfE1JU1JBXzIwMDQsCisKKzEyLDksIlRoZSB1bmFyeSBtaW51cyBvcGVyYXRvciBzaGFsbCBub3QgYmUgYXBwbGllZCB0byBhbiBleHByZXNzaW9uIHdob3NlIHVuZGVybHlpbmcgdHlwZSBpcyB1bnNpZ25lZCIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTIsMTAsIlRoZSBjb21tYSBvcGVyYXRvciBzaGFsbCBub3QgYmUgdXNlZCIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTIsMTEsIkV2YWx1YXRpb24gb2YgY29uc3RhbnQgdW5zaWduZWQgaW50ZWdlciBleHByZXNzaW9ucyBzaG91bGQgbm90IGxlYWQgdG8gd3JhcC1hcm91bmQiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzEyLDEyLCJUaGUgdW5kZXJseWluZyBiaXQgcmVwcmVzZW50YXRpb24gb2YgZmxvYXRpbmctcG9pbnQgdmFsdWVzIHNoYWxsIG5vdCBiZSB1c2VkIixNSVNSQXxNSVNSQV8yMDA0LAorCisxMiwxMywiVGhlIGluY3JlbWVudCAoKyspIGFuZCBkZWNyZW1lbnQgKC0tKSBvcGVyYXRvcnMgc2hvdWxkIG5vdCBiZSBtaXhlZCB3aXRoIG90aGVyICIKKyJvcGVyYXRvcnMgaW4gYW4gZXhwcmVzc2lvbiIsTUlTUkF8TUlTUkFfMjAwNCwKKworCisvKiBLYXBpdGVsIDEzICovCisxMywxLCJBc3NpZ25tZW50IG9wZXRhb3JzIHNoYWxsIG5vdCBiZSB1c2VkIGluIGV4cHJlc3Npb25zIHRoYXQgeWllbGQgYSBCb29sZWFuIHZhbHVlIixNSVNSQXxNSVNSQV8yMDA0LAorCisxMywyLCJUZXN0cyBvZiBhIHZhbHVlIGFnYWluc3QgemVybyBzaG91bGQgYmUgbWFkZSBleHBsaWNpdCwgdW5sZXNzIHRoZSBvcGVyYW5kIGlzIGVmZmVjdGl2ZWx5IEJvb2xlYW4iLE1JU1JBfE1JU1JBXzIwMDQsCisKKzEzLDMsIkZsb2F0aW5nLXBvaW50IGV4cHJlc3Npb25zIHNoYWxsIG5vdCBiZSB0ZXN0ZWQgZm9yIGVxdWFsaXR5IG9yIGluZXF1YWxpdHkiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzEzLDQsIlRoZSBjb250cm9sbGluZyBleHByZXNzaW9uIG9mIGEgZm9yIHN0YXRlbWVudCBzaGFsbCBub3QgY29udGFpbiBhbnkgb2JqZWN0cyBvZiBmbG9hdGluZyB0eXBlLiIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTMsNSwiVGhlIHRocmVlIGV4cHJlc3Npb25zIG9mIGEgZm9yIHN0YXRlbWVudCBzaGFsbCBiZSBjb25jZXJuZWQgb25seSB3aXRoIGxvb3AgY29udHJvbCIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTMsNiwiTnVtZXJpYyB2YXJpYWJsZXMgYmVpbmcgdXNlZCB3aXRoaW4gYSBmb3IgbG9vcCBmb3IgaXRlcmF0aW9uIGNvdW50aW5nIHNoYWxsIG5vdCBiZSBtb2RpZmllZCBpbiB0aGUgYm9keSBvZiB0aGUgbG9vcCIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTMsNywiQm9vbGVhbiBvcGVyYXRpb25zIHdob3NlIHJlc3VsdHMgYXJlIGludmFyaWFudCBzaGFsbCBub3QgYmUgcGVybWl0dGVkIixNSVNSQXxNSVNSQV8yMDA0LAorCisKKy8qIEthcGl0ZWwgMTQgKi8KKzE0LDEsIlRoZXJlIHNoYWxsIGJlIG5vIHVucmVhY2hhYmxlIGNvZGUiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzE0LDIsIkFsbCBub24tbnVsbCBzdGF0ZW1lbnRzIHNoYWxsIGVpdGhlcjpcbiIKKyIgIGEpIGhhdmUgYXQgbGVhc3Qgb25lIHNpZGUtZWZmZWN0IGhvd2V2ZXIgZXhlY3V0ZWQsIG9yXG4iCisiICBiKSBjYXVzZSBjb250cm9sIGZsb3cgdG8gY2hhbmdlIixNSVNSQXxNSVNSQV8yMDA0LAorCisxNCwzLCJCZWZvcmUgcHJlcHJvY2Vzc2luZywgYSBudWxsIHN0YXRlbWVudCBzaGFsbCBvbmx5IG9jY3VyIG9uIGEgbGluZSBieSBpdHNlbGY7IGl0IG1heSBiZSAiCisiZm9sbG93ZWQgYnkgYSBjb21tZW50IHByb3ZpZGVkIHRoYXQgdGhlIGZpcnN0IGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlIG51bGwgc3RhdGVtZW50ICIKKyJpcyBhIHdoaXRlLXNwYWNlIGNoYXJhY3Rlci4iLE1JU1JBfE1JU1JBXzIwMDQsCisKKzE0LDQsIlRoZSBnb3RvIHN0YXRlbWVudCBzaGFsbCBub3QgYmUgdXNlZCIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTQsNSwiVGhlIGNvbnRpbnVlIHN0YXRlbWVudCBzaGFsbCBub3QgYmUgdXNlZCIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTQsNiwiRm9yIGFueSBpbnRlcmF0aW9uIHN0YXRlbWVudCB0aGVyZSBzaGFsbCBiZSBhdCBtb3N0IG9uZSBicmFlayBzdGF0ZW1lbnQgdXNlZCBmb3IgbG9vcCB0ZXJtaW5hdGlvbiIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTQsNywiQSBmdW5jdGlvbiBzaGFsbCBoYXZlIGEgc2luZ2xlIHBvaW50IG9mIGV4aXQgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24iLE1JU1JBfE1JU1JBXzIwMDQsCisKKzE0LDgsIlRoZSBzdGF0ZW1lbnQgZm9ybWluZyB0aGUgYm9keSBvZiBhIHN3aXRjaCwgd2hpbGUsIGRvIC4uLiB3aGlsZSBvciBmb3Igc3RhdGVtZW50ICIKKyJzaGFsbCBiZSBhIGNvbXBvdW5kIHN0YXRlbWVudCIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTQsOSwiQW4gaWYgKGV4cHJlc3Npb24pIGNvbnN0cnVjdCBzaGFsbCBiZSBmb2xsb3dlZCBieSBhIGNvbXBvdW5kIHN0YXRlbWVudC4gVGhlIGVsc2UgIgorImtleXdvcmQgc2hhbGwgYmUgZm9sbG93ZWQgYnkgZWl0aGVyIGEgY29tcG91bmQgc3RhdGVtZW50LCBvciBhbm90aGVyIGlmIHN0YXRlbWVudCIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTQsMTAsIkFsbCBpZiAuLi4gZWxzZSBpZiBjb25zdHJ1Y3RzIHNoYWxsIGJlIHRlcm1pbmF0ZWQgd2l0aCBhbiBlbHNlIGNsYXVzZSIsTUlTUkF8TUlTUkFfMjAwNCwKKworCisvKiBLYXBpdGVsIDE1ICovCisxNSwxLCJBIHN3aXRjaCBsYWJlbCBzaGFsbCBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgbW9zdCBjbG9zZWx5LWVuY2xvc2luZyBjb21wb3VuZCBzdGF0ZW1lbnQgaXMgdGhlIGJvZHkgb2YgYSBzd2l0Y2ggc3RhdGVtZW50IixNSVNSQXxNSVNSQV8yMDA0LAorCisxNSwyLCJBbiB1bmNvbmRpdGlvbmFsIGJyZWFrIHN0YXRlbWVudCBzaGFsbCB0ZXJtaW5hdGUgZXZlcnkgbm9uLWVtcHR5IHN3aXRjaCBjbGF1c2UiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzE1LDMsIlRoZSBmaW5hbCBjbGF1c2Ugb2YgYSBzd2l0Y2ggc3RhdGVtZW50IHNoYWxsIGJlIHRoZSBkZWZhdWx0IGNsYXVzZSIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTUsNCwiQSBTd2l0Y2ggZXhwcmVzc2lvbiBzaGFsbCBub3QgcmVwcmVzZW50IGEgdmFsdWUgdGhhdCBpcyBlZmZlY3RpdmVseSBCb29sZWFuIixNSVNSQXxNSVNSQV8yMDA0LAorCisxNSw1LCJFdmVyeSBzd2l0Y2ggc3RhdGVtZW50IHNoYWxsIGhhdmUgYXQgbGVhc3Qgb25lIGNhc2UgY2xhdXNlIixNSVNSQXxNSVNSQV8yMDA0LAorCisKKy8qIEthcGl0ZWwgMTYgKi8KKzE2LDEsIkZ1bmN0aW9ucyBzaGFsbCBub3QgYmUgZGVmaW5lZCB3aXRoIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTYsMiwiRnVuY3Rpb25zIHNoYWxsIG5vdCBjYWxsIHRoZW1zZWx2ZXMsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5IixNSVNSQXxNSVNSQV8yMDA0LAorCisxNiwzLCJJZGVudGlmaWVycyBzaGFsbCBiZSBnaXZlbiBmb3IgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIGluIGEgZnVuY3Rpb24gcHJvdG90eXBlIGRlY2xhcmF0aW9uIixNSVNSQXxNSVNSQV8yMDA0LAorCisxNiw0LCJUaGUgaWRlbnRpZmllcnMgdXNlZCBpbiB0aGUgZGVjbGFyYXRpb24gYW5kIGRlZmluaXRpb24gb2YgYSBmdW5jdGlvbiBzaGFsbCBiZSBpZGVudGljYWwiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzE2LDUsIkZ1bmN0aW9ucyB3aXRoIG5vIHBhcmFtZXRlcnMgc2hhbGwgYmUgZGVjbGFyZWQgd2l0aCBwYXJhbWV0ZXIgdHlwZSB2b2lkIixNSVNSQXxNSVNSQV8yMDA0LAorCisxNiw2LCJUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gYSBmdW5jdGlvbiBzaGFsbCBtYXRjaCB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzE2LDcsIkEgcG9pbnRlciBwYXJhbWV0ZXIgaW4gYSBmdW5jdGlvbiBwcm90b3R5cGUgc2hvdWxkIGJlIGRlY2xhcmVkIGFzIHBvaW50ZXIgdG8gIGNvbnN0ICIKKyJpZiB0aGUgcG9pbnRlciBpcyBub3QgdXNlZCB0byBtb2RpZnkgdGhlIGFkZHJlc3NlZCBvYmplY3QiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzE2LDgsIkFsbCBleGl0IHBhdGhzIGZyb20gYSBmdW5jdGlvbiB3aXRoIG5vbi12b2lkIHJldHVybiB0eXBlIHNoYWxsIGhhdmUgYW4gZXhwbGljaXQgIgorInJldHVybiBzdGF0ZW1lbnQgd2l0aCBhbiBleHByZXNzaW9uIixNSVNSQXxNSVNSQV8yMDA0LAorCisxNiw5LCJBIGZ1bmN0aW9uIGlkZW50aWZpZXIgc2hhbGwgb25seSBiZSB1c2VkIHdpdGggZWl0aGVyIGEgcHJlY2VkaW5nICYsIG9yIHdpdGggYSAiCisicGFyZW50aGVzaXNlZCBwYXJhbWV0ZXIgbGlzdCwgd2hpY2ggbWF5IGJlIGVtcHR5IixNSVNSQXxNSVNSQV8yMDA0LAorCisxNiwxMCwiSWYgYSBmdW5jdGlvbiByZXR1cm5zIGVycm9yIGluZm9ybWF0aW9uLCB0aGVuIHRoYXQgZXJyb3IgaW5mb3JtYXRpb24gc2hhbGwgYmUgdGVzdGVkIixNSVNSQXxNSVNSQV8yMDA0LAorCisKKy8qIEthcGl0ZWwgMTcgKi8KKzE3LDEsIlBvaW50ZXIgYXJpdGhtZXRpYyBzaGFsbCBvbmx5IGJlIGFwcGxpZWQgdG8gcG9pbnRlcnMgdGhhdCBhZGRyZXNzIGFuIGFycmF5IG9yIGFycmF5IGVsZW1lbnQiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzE3LDIsIlBvaW50ZXIgc3VidHJhY3Rpb24gc2hhbGwgb25seSBiZSBhcGxsaWVkIHRvIHBvaW50ZXJzIHRoYXQgYWRkcmVzcyBlbGVtZW50cyBvZiB0aGUgc2FtZSBhcnJheSIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTcsMywiPiwgPj0sIDwsIDw9IHNoYWxsIG5vdCBiZSBhcHBsaWVkIHRvIHBvaW50ZXIgdHlwZXMgZXhjZXB0IHdoZXJlIHRoZXkgcG9pbnQgdG8gdGhlIHNhbWUgYXJyYXkiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzE3LDQsIkFycmF5IGluZGV4aW5nIHNoYWxsIGJlIHRoZSBvbmx5IGFsbG93ZWQgZm9ybSBvZiBwb2ludGVyIGFyaXRobWV0aWMiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzE3LDUsIlRoZSBkZWNsYXJhdGlvbiBvZiBvYmplY3RzIHNob3VsZCBjb250YWluIG5vIG1vcmUgdGhhbiAyIGxldmVscyBvZiBwb2ludGVyIGluZGlyZWN0aW9uIixNSVNSQXxNSVNSQV8yMDA0LAorCisxNyw2LCJUaGUgYWRkcmVzcyBvZiBhbiBvYmplY3Qgd2l0aCBhdXRvbWF0aWMgc3RvcmFnZSBzaGFsbCBub3QgYmUgYXNzaWduZWQgdG8gYW4gb3RoZXIgIgorIm9iamVjdCB0aGF0IG1heSBwZXJzaXN0IGFmdGVyIHRoZSBmaXJzdCBvYmplY3QgaGFzIGNlYXNlZCB0byBleGlzdCIsTUlTUkF8TUlTUkFfMjAwNCwKKworCisvKiBLYXBpdGVsIDE4ICovCisxOCwxLCJBbGwgc3RydWN0dXJlIGFuZCB1bmlvbiB0eXBlcyBzaGFsbCBiZSBjb21wbGV0ZSBhdCB0aGUgZW5kIG9mIGEgdHJhbnNsYXRpb24gdW5pdCIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTgsMiwiQW4gb2JqZWN0IHNoYWxsIG5vdCBiZSBhc3NpZ25lZCB0byBhbiBvdmVybGFwcGluZyBvYmplY3QiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzE4LDMsIkFuIGFyZWEgb2YgbWVtb3J5IHNoYWxsIG5vdCBiZSByZXVzZWQgZm9yIHVucmVsYXRlZCBwdXJwb3NlcyIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTgsNCwiVW5pb25zIHNoYWxsIG5vdCBiZSB1c2VkIixNSVNSQXxNSVNSQV8yMDA0LAorCisKKy8qIEthcGl0ZWwgMTkgKi8KKzE5LDEsIiNpbmNsdWRlIHN0YXRlbWVudHMgaW4gYSBmaWxlIHNob3VsZCBvbmx5IGJlIHByZWNlZGVkIGJ5IG90aGVyIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIG9yIGNvbW1lbnRzIixNSVNSQXxNSVNSQV8yMDA0LAorCisxOSwyLCJOb24tc3RhbmRhcmQgY2hhcmFjdGVycyBzaG91bGQgbm90IG9jY3VyIGluIGhlYWRlciBmaWxlIG5hbWVzIGluICNpbmNsdWRlIGRpcmVjdGl2ZXMiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzE5LDMsIlRoZSAjaW5jbHVkZSBkaXJlY3RpdmUgc2hhbGwgYmUgZm9sbG93ZWQgYnkgZWl0aGVyIGEgPGZpbGVuYW1lPiBvciBcImZpbGVuYW1lXCIgc2VxdWVuY2UiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzE5LDQsIkMgbWFjcm9zIHNoYWxsIG9ubHkgZXhwYW5kIHRvIGEgYnJhY2VkIGluaXRpYWxpc2VyLCBhIGNvbnN0YW50LCBhIHBhcmVudGhlc2lzZWQgIgorImV4cHJlc3Npb24sIGEgdHlwZSBxdWFsaWZpZXIsIGEgc3RvcmFnZSBjbGFzcyBzcGVjaWZpZXIsIG9yIGEgZG8td2hpbGUtemVybyBjb25zdHJ1Y3QiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzE5LDUsIk1hY3JvcyBzaGFsbCBub3QgYmUgI2RlZmluZWQnZCBvciAjdW5kZWYnZCB3aXRoaW4gYSBibG9jayIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTksNiwiI3VuZGVmIHNoYWxsIG5vdCBiZSB1c2VkIixNSVNSQXxNSVNSQV8yMDA0LAorCisxOSw3LCJBIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIGluIHByZWZlcmVuY2UgdG8gYSBmdW5jdGlvbi1saWtlIG1hY3JvIixNSVNSQXxNSVNSQV8yMDA0LAorCisxOSw4LCJBIGZ1bmN0aW9uLWxpa2UgbWFjcm8gc2hhbGwgbm90IGJlIGludm9rZWQgd2l0aG91dCBhbGwgb2YgaXRzIGFyZ3VtZW50cyIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTksOSwiQXJndW1lbnRzIHRvIGEgZnVuY3Rpb24tbGlrZSBtYWNybyBzaGFsbCBub3QgY29udGFpbiB0b2tlbnMgdGhhdCBsb29rIGxpa2UgcHJlcHJvY2Vzc2luZyBkaXJlY3RpdmVzIixNSVNSQXxNSVNSQV8yMDA0LAorCisxOSwxMCwiSW4gdGhlIGRlZmluaXRpb24gb2YgYSBmdW5jdGlvbi1saWtlIG1hY3JvIGVhY2ggaW5zdGFuY2Ugb2YgYSBwYXJhbWV0ZXIgc2hhbGwgYmUgZW5jbG9zZWQgIgorImluIHBhcmVudGhlc2VzIHVubGVzcyBpdCBpcyB1c2VkIGFzIHRoZSBvcGVyYW5kIG9mICMgb3IgIyMiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzE5LDExLCJBbGwgbWFjcm8gaWRlbnRpZmllcnMgaW4gcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgc2hhbGwgYmUgZGVmaW5lZCBiZWZvcmUgdXNlLCBleGNlcHQgIgorImluICNpZmRlZiBhbmQgI2lmbmRlZiBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBhbmQgdGhlIGRlZmluZWQoKSBvcGVyYXRvciIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTksMTIsIlRoZXJlIHNoYWxsIGJlIGF0IG1vc3Qgb25lIG9jY3VycmVuY2Ugb2YgdGhlICMgb3IgIyMgcHJlcHJvY2Vzc29yIG9wZXJhdG9ycyBpbiBhICIKKyJzaW5nbGUgbWFjcm8gZGVmaW5pdGlvbiIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTksMTMsIlRoZSAjIGFuZCAjIyBwcmVwcm9jZXNzb3Igb3BlcmF0b3JzIHNob3VsZCBub3QgYmUgdXNlZCIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTksMTQsIlRoZSBkZWZpbmVkIHByZXByb2Nlc3NvciBvcGVyYXRvciBzaGFsbCBvbmx5IGJlIHVzZWQgaW4gb25lIG9mIHRoZSB0d28gc3RhbmRhcmQgZm9ybXMiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzE5LDE1LCJQcmVjYXV0aW9ucyBzaGFsbCBiZSB0YWtlbiBpbiBvcmRlciB0byBwcmV2ZW50IHRoZSBjb250ZW50cyBvZiBhIGhlYWRlciBmaWxlIGJlaW5nIGluY2x1ZGVkIHR3aWNlIixNSVNSQXxNSVNSQV8yMDA0LAorCisxOSwxNiwiUHJlcHJvY2Vzc2luZyBkaXJlY3RpdmVzIHNoYWxsIGJlIHN5bnRhY3RpY2FsbHkgbWVhbmluZ2Z1bCBldmVuIHdoZW4gZXhjbHVkZWQgYnkgdGhlIHByZXByb2Nlc3NvciIsTUlTUkF8TUlTUkFfMjAwNCwKKworMTksMTcsIkFsbCAjZWxzZSwgI2VsaWYgYW5kICNlbmRpZiBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBzaGFsbCByZXNpZGUgaW4gdGhlIHNhbWUgZmlsZSBhcyAiCisidGhlICNpZiBvciAjaWZkZWYgZGlyZWN0aXZlIHRvIHdoaWNoIHRoZXkgYXJlIHJlbGF0ZWQiLE1JU1JBfE1JU1JBXzIwMDQsCisKKworLyogS2FwaXRlbCAyMCAqLworMjAsMSwiUmVzZXJ2ZWQgIGlkZW50aWZpZXJzLCBtYWNyb3MgYW5kIGZ1bmN0aW9ucyBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeSwgc2hhbGwgbm90ICIKKyJiZSBkZWZpbmVkLCByZWRlZmluZWQgb3IgdW5kZWZpbmVkIixNSVNSQXxNSVNSQV8yMDA0LAorCisyMCwyLCJUaGUgbmFtZXMgb2Ygc3RhbmRhcmQgbGlicmFyeSBtYWNyb3MsIG9iamVjdHMgYW5kIGZ1bmN0aW9ucyBzaGFsbCBub3QgYmUgcmV1c2VkIixNSVNSQXxNSVNSQV8yMDA0LAorCisyMCwzLCJUaGUgdmFsaWRpdHkgb2YgdmFsdWVzIHBhc3NlZCB0byBsaWJyYXJ5IGZ1bmN0aW9ucyBzaGFsbCBiZSBjaGVja2VkIixNSVNSQXxNSVNSQV8yMDA0LAorCisyMCw0LCJEeW5hbWljIGhlYXAgbWVtb3J5IGFsbG9jYXRpb24gc2hhbGwgbm90IGJlIHVzZWQiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzIwLDUsIlRoZSBlcnJvciBpbmRpY2F0b3IgZXJybm8gc2hhbGwgbm90IGJlIHVzZWQiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzIwLDYsIlRoZSBtYWNybyBvZmZzZXRvZiwgaW4gbGlicmFyeSA8c3RkZGVmLmg+LCBzaGFsbCBub3QgYmUgdXNlZCIsTUlTUkF8TUlTUkFfMjAwNCwKKworMjAsNywiVGhlIHNldGptcCBtYWNybyBhbmQgdGhlIGxvbmdqbXAgZnVuY3Rpb24gc2hhbGwgbm90IGJlIHVzZWQiLE1JU1JBfE1JU1JBXzIwMDQsCisKKzIwLDgsIlRoZSBzaWduYWwgaGFuZGxpbmcgZmFjaWxpdGllcyBvZiA8c2lnbmFsLmg+IHNoYWxsIG5vdCBiZSB1c2VkIixNSVNSQXxNSVNSQV8yMDA0LAorCisyMCw5LCJUaGUgaW5wdXQvb3V0cHV0IGxpYnJhcnkgPHN0ZGlvLmg+IHNoYWxsIG5vdCBiZSB1c2VkIGluIHByb2R1Y3Rpb24gY29kZSIsTUlTUkF8TUlTUkFfMjAwNCwKKworMjAsMTAsIlRoZSBsaWJyYXJ5IGZ1bmN0aW9ucyBhdG9mLCBhdG9pIGFuZCBhdG9sIGZyb20gbGlicmFyeSA8c3RkbGliLmg+IHNoYWxsIG5vdCBiZSB1c2VkIixNSVNSQXxNSVNSQV8yMDA0LAorCisyMCwxMSwiVGhlIGxpYnJhcnkgZnVuY3Rpb25zIGFib3J0LCBleGl0LCBnZXRlbnYgYW5kIHN5c3RlbSBmcm9tIGxpYnJhcnkgPHN0ZGxpYi5oPiBzaGFsbCBub3QgYmUgdXNlZC4iLE1JU1JBfE1JU1JBXzIwMDQsCisKKzIwLDEyLCJUaGUgdGltZSBoYW5kbGluZyBmdW5jdGlvbnMgb2YgbGlicmFyeSA8dGltZS5oPiBzaGFsbCBub3QgYmUgdXNlZCIsTUlTUkF8TUlTUkFfMjAwNCwKKworCisvKiBLYXBpdGVsIDIxICovCisyMSwxLCJNaW5pbWlzYXRpb24gb2YgcnVuLXRpbWUgZmFpbHVyZXMgc2hhbGwgYmUgZW5zdXJlZCBieSB0aGUgdXNlIG9mIGF0IGxlYXN0IG9uZSBvZjpcbiIKKyIgIGEpIHN0YXRpYyBhbmFseXNpcyB0b29scy90ZWNobmlxdWVzXG4iCisiICBiKSBkeW5hbWljIGFuYWx5c2lzIHRvb2xzL3RlY2huaXF1ZXNcbiIKKyIgIGMpIGV4cGxpY2l0IGNvZGluZyBvZiBjaGVja3MgdG8gaGFuZGxlIHJ1bi10aW1lIGZhdWx0cyIsTUlTUkF8TUlTUkFfMjAwNCwKZGlmZiAtLWdpdCBhL29wdC5jIGIvb3B0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNjZWM3NwotLS0gL2Rldi9udWxsCisrKyBiL29wdC5jCkBAIC0wLDAgKzEsMjMwMCBAQAorLyogICRWRVI6IHZiY2MgKG9wdC5jKSAkUmV2aXNpb246IDEuNTIgJCAgICAqLworLyogIGFsbGdlbWVpbmUgUm91dGluZW4gZnVlciBkZW4gT3B0aW1pemVyIHVuZCBTdGV1ZXJ1bmcgZGVyIGVpbnplbG5lbiAgKi8KKy8qICBMYWV1ZmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpbmNsdWRlICJvcHQuaCIKKyNpbmNsdWRlICJ2YmMuaCIKKworc3RhdGljIGNoYXIgRklMRV9bXT1fX0ZJTEVfXzsKKworLyogIGRpZSBuYWVjaHN0ZW4gRnVua3Rpb25lbiBzb2xsdGVuIGV2dGwuIGluIGljLmMgICAgICAgICAgICAgICAgICAqLworCisvKiAgU2luZCB1c2UvY2hhbmdlLUxpc3RlbiBpbml0aWFsaXNpZXJ0PyAgICovCitpbnQgaGF2ZV9hbGlhczsKKworaW50IHN0YXRpY19jc2U9MSxkcmVmX2NzZT0xOworaW50IG5vX2VmZl9pY3MsZWFybHlfZWZmX2ljczsKKworI2lmZGVmIEFMRVhfUkVHCitleHRlcm4gZmxvd2dyYXBoICpwRmc7CisjZW5kaWYKKwordm9pZCBpbnNlcnRfSUMoSUMgKnAsSUMgKm5ldykKKy8qICBmdWVndCBuZXcgaGludGVyIHAgZWluOyBwIGRhcmYgMCBzZWluICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYoKG5ldy0+Y29kZT09QURESTJQfHxuZXctPmNvZGU9PVNVQklGUHx8bmV3LT5jb2RlPT1TVUJQRlApJiYhSVNQT0lOVEVSKG5ldy0+dHlwZjIpKQorICAgIGllcnJvcigwKTsKKyAgbmV3LT5wcmV2PXA7CisgIGlmKHApeworICAgIG5ldy0+bmV4dD1wLT5uZXh0OyBwLT5uZXh0PW5ldzsKKyAgfWVsc2V7CisgICAgbmV3LT5uZXh0PWZpcnN0X2ljOyBmaXJzdF9pYz1uZXc7IAorICB9CisgIGlmKG5ldy0+bmV4dCkgCisgICAgbmV3LT5uZXh0LT5wcmV2PW5ldzsgCisgIGVsc2UgCisgICAgbGFzdF9pYz1uZXc7CisgIG5ldy0+cTEuYW09bmV3LT5xMi5hbT1uZXctPnouYW09MDsKK30KKworI2lmbmRlZiBOT19PUFRJTUlaRVIKKworaW50IGdjaGFuZ2VkOyAgIC8qICBNZXJrZXIsIG9iIE9wdGltaWVydW5nc2xhdWYgZXR3YXMgZ2VhZW5kZXJ0IGhhdCAqLworaW50IG5vcmVrOyAgICAgIC8qICBkaWVzZSBGdW5rdGlvbiB3aXJkIG5pY2h0IHJla3Vyc2l2IGF1ZiAgICAgICAgICAqLworaW50IG5vY2FsbDsgICAgIC8qICBkaWVzZSBGdW5rdGlvbiBrZWhydCBuaWNodCB6dW0gQ2FsbGVyIHp1cnVlY2sgICAqLworCit2b2lkIGZpeF9zaG9ydG9wKGZsb3dncmFwaCAqZmcsSUMgKnApCit7CisgIGlmKChwLT50eXBmJk5RKTxJTlQmJiFzaG9ydGN1dChwLT5jb2RlLHAtPnR5cGYpKXsKKyAgICBzdGF0aWMgdHlwZSB0YTsKKyAgICB0eXBlICp0OworICAgIElDICpuZXc7CisgICAgaWYoREVCVUcmMTAyNCl7cHV0cygiZml4IHNob3J0b3AiKTtwcmljMihzdGRvdXQscCk7cHV0cygidG87Iik7fQorICAgIHRhLmZsYWdzPWludF9lcncocC0+dHlwZik7CisgICAgdD1hcml0aF90eXAoJnRhLCZ0YSk7CisgICAgbmV3PW5ld19JQygpOworICAgIG5ldy0+Y29kZT1DT05WRVJUOworICAgIG5ldy0+cTE9cC0+cTE7CisgICAgbmV3LT56LmZsYWdzPVZBUjsKKyAgICBuZXctPnoudj1hZGRfdG1wX3ZhcihjbG9uZV90eXAodCkpOworICAgIG5ldy0+dHlwZjI9cC0+dHlwZnxVTlNJR05FRDsKKyAgICBuZXctPnR5cGY9dC0+ZmxhZ3N8VU5TSUdORUQ7CisgICAgcC0+cTE9bmV3LT56OworICAgIGluc2VydF9JQ19mZyhmZyxwLT5wcmV2LG5ldyk7CisgICAgbmV3PW5ld19JQygpOworICAgIG5ldy0+Y29kZT1DT05WRVJUOworICAgIG5ldy0+cTE9cC0+cTI7CisgICAgbmV3LT56LmZsYWdzPVZBUjsKKyAgICBuZXctPnoudj1hZGRfdG1wX3ZhcihjbG9uZV90eXAodCkpOworICAgIG5ldy0+dHlwZjI9cC0+dHlwZnxVTlNJR05FRDsKKyAgICBuZXctPnR5cGY9dC0+ZmxhZ3N8VU5TSUdORUQ7CisgICAgcC0+cTI9bmV3LT56OworICAgIGluc2VydF9JQ19mZyhmZyxwLT5wcmV2LG5ldyk7CisgICAgbmV3PW5ld19JQygpOworICAgIG5ldy0+Y29kZT1DT05WRVJUOworICAgIG5ldy0+ej1wLT56OworICAgIG5ldy0+cTEuZmxhZ3M9VkFSOworICAgIG5ldy0+cTEudj1hZGRfdG1wX3Zhcih0KTsKKyAgICBuZXctPnR5cGY9cC0+dHlwZnxVTlNJR05FRDsKKyAgICBuZXctPnR5cGYyPXQtPmZsYWdzfFVOU0lHTkVEOworICAgIHAtPno9bmV3LT5xMTsKKyAgICBpbnNlcnRfSUNfZmcoZmcscCxuZXcpOyAgIAorICAgIHAtPnR5cGY9dC0+ZmxhZ3N8VU5TSUdORUQ7CisgICAgaWYoREVCVUcmMTAyNCl7CisgICAgICBwcmljMihzdGRvdXQscC0+cHJldi0+cHJldik7CisgICAgICBwcmljMihzdGRvdXQscC0+cHJldik7CisgICAgICBwcmljMihzdGRvdXQscCk7CisgICAgICBwcmljMihzdGRvdXQscC0+bmV4dCk7CisgICAgfQorICB9Cit9CisKKyNpZiBIQVZFX0xJQkNBTExTCitleHRlcm4gbnAgZ2VuX2xpYmNhbGwoY2hhciAqZm5hbWUsbnAgYXJnMSx0eXBlICp0MSxucCBhcmcyLHR5cGUgKnQyKTsKKworCisvKiBpbnNlcnQgbGliY2FsbHMganVzdCBiZWZvcmUgcmVnaXN0ZXIgYWxsb2NhdGlvbiAqLworc3RhdGljIGludCBpbnNlcnRfbGliY2FsbHMoZmxvd2dyYXBoICpmZykKK3sKKyAgSUMgKnAsKm5leHQsKmFkZDsKKyAgaW50IHJlcGxhY2VkPTA7CisgIHN0YXRpYyBub2RlIG4sbmwsbnI7CisgIHN0YXRpYyB0eXBlIHQsdGwsdHI7CisgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiaW5zZXJ0X2xpYmNhbGxzXG4iKTsKKyAgd2hpbGUoZmcpeworICAgIGZvcihwPWZnLT5zdGFydDtwO3A9bmV4dCl7CisgICAgICBpbnQgYz1wLT5jb2RlLGVuZD0wOworICAgICAgY2hhciAqbGlibmFtZTsKKyAgICAgIG5leHQ9cC0+bmV4dDsKKyAgICAgIGlmKChjPj1PUiYmYzw9QU5EKXx8KGM+PUxTSElGVCYmYzw9S09NUExFTUVOVCl8fGM9PUNPTVBBUkV8fGM9PUNPTlZFUlR8fGM9PU1JTlVTfHxjPT1URVNUKXsKKwlpZihsaWJuYW1lPXVzZV9saWJjYWxsKGMscC0+dHlwZixwLT50eXBmMikpeworCSAgSUMgKm1lcmtfZmlyc3QsKm1lcmtfbGFzdDsKKwkgIHN0YXRpYyBub2RlIG4xLG4yOworCSAgc3RhdGljIHR5cGUgdDEsdDI7CisJICBpZihERUJVRyYxMDI0KXsKKwkgICAgcHJpbnRmKCJjb252ZXJ0aW5nIElDIHRvIGxpYmNhbGw6XG4iKTsKKwkgICAgcHJpYzIoc3Rkb3V0LHApOworCSAgfQorI2lmIEZJWEVEX1NQCisJICB7CisJICAgIC8qIG1vdmUgbmVzdGVkIHB1c2hzICovCisJICAgIElDICptO2Zsb3dncmFwaCAqZz1mZztpbnQgZmQ9MCxpOworCSAgICBmb3IoaT0wO2k8cC0+YXJnX2NudDtpKyspeworCSAgICAgIG09cC0+YXJnX2xpc3RbaV07CisJICAgICAgaWYobS0+Y29kZT09UFVTSCl7CisJCVZhciAqdjt0eXBlICp0O0lDICpuZXc7CisJCWZkPTE7CisJCWlmKERFQlVHJjEwMjQpeworCQkgIHByaW50ZigibW92aW5nIHB1c2hcbiIpOworCQkgIHByaWMyKHN0ZG91dCxtKTsKKwkJfQorCQlpZigobS0+dHlwZiZOUSk9PVNUUlVDVCkgaWVycm9yKDApOworCQlpZigobS0+dHlwZiZOUSk9PUNIQVImJiF6bWVxdG8obS0+cTIudmFsLnZtYXgsWjEpKSBpZXJyb3IoMCk7CisJCXQ9bmV3X3R5cCgpOworCQl0LT5mbGFncz1tLT50eXBmOworCQl2PWFkZF90bXBfdmFyKHQpOworCQluZXc9bmV3X0lDKCk7CisJCW5ldy0+Y29kZT1QVVNIOworCQluZXctPnEyLnZhbC52bWF4PW0tPnEyLnZhbC52bWF4OworCQluZXctPnR5cGY9bS0+dHlwZjsKKwkJbmV3LT5xMS5mbGFncz1WQVI7CisJCW5ldy0+cTEudj12OworCQluZXctPnExLnZhbC52bWF4PVowOworCQltLT56PW5ldy0+cTE7CisJCW0tPmNvZGU9QVNTSUdOOworCQlpbnNlcnRfSUNfZmcoZyxwLG5ldyk7CisJCWlmKERFQlVHJjEwMjQpeworCQkgIHByaWMyKHN0ZG91dCxtKTsKKwkJICBwcmljMihzdGRvdXQsbmV3KTsKKwkJfQorCQlwLT5hcmdfbGlzdFtpXT1uZXc7CisJICAgICAgfQorCSAgICB9CisJICB9CisjZW5kaWYJICAKKwkgIHJlcGxhY2VkPTE7CisJICBtZXJrX2xhc3Q9bGFzdF9pYzsKKwkgIG1lcmtfZmlyc3Q9Zmlyc3RfaWM7CisJICBmaXJzdF9pYz1sYXN0X2ljPTA7CisJICBuMS5mbGFncz1SRUlOVEVSUFJFVDsKKwkgIG4xLm89cC0+cTE7CisJICBuMS5udHlwPSZ0MTsKKwkgIHQxLmZsYWdzPXExdHlwKHApOworCSAgaWYocC0+cTIuZmxhZ3MpeworCSAgICBuMi5mbGFncz1SRUlOVEVSUFJFVDsKKwkgICAgbjIubz1wLT5xMjsKKwkgICAgbjIubnR5cD0mdDI7CisJICAgIHQyLmZsYWdzPXEydHlwKHApOworCSAgICBnZW5fbGliY2FsbChsaWJuYW1lLCZuMSwmdDEsJm4yLCZ0Mik7CisJICB9ZWxzZQorCSAgICBnZW5fbGliY2FsbChsaWJuYW1lLCZuMSwmdDEsMCwwKTsKKwkgIGlmKCFsYXN0X2ljfHxsYXN0X2ljLT5jb2RlIT1HRVRSRVRVUk4pIGllcnJvcigwKTsKKwkgIGxhc3RfaWMtPno9cC0+ejsKKwkgIGFkZD1maXJzdF9pYzsKKwkgIGxhc3RfaWM9bWVya19sYXN0OworCSAgZmlyc3RfaWM9bWVya19maXJzdDsKKwkgIGZvcig7YWRkO2FkZD1uZXh0KXsKKwkgICAgbmV4dD1hZGQtPm5leHQ7CisJICAgIGluc2VydF9JQ19mZyhmZyxwLT5wcmV2LGFkZCk7CisJICB9CisJICBuZXh0PXAtPm5leHQ7CisJICBpZihmZy0+ZW5kPT1wKSBlbmQ9MTsKKwkgIGlmKHAtPnouZmxhZ3MpeworCSAgICByZW1vdmVfSUNfZmcoZmcscCk7CisJICB9ZWxzZXsKKwkgICAgdHlwZSAqdD1uZXdfdHlwKCk7CisJICAgIHQtPmZsYWdzPUxJQkNBTExfQ01QVFlQRTsKKwkgICAgcC0+Y29kZT1DT01QQVJFOworCSAgICBwLT5xMi5mbGFncz1LT05TVDsKKwkgICAgZ3ZhbC52bWF4PVowOworCSAgICBldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CisJICAgIGluc2VydF9jb25zdCgmcC0+cTIudmFsLExJQkNBTExfQ01QVFlQRSk7CisJICAgIHAtPnR5cGY9TElCQ0FMTF9DTVBUWVBFOworCSAgICBwLT5xMS5mbGFncz1WQVI7CisJICAgIHAtPnExLnY9YWRkX3RtcF92YXIodCk7CisJICAgIHAtPnExLnZhbC52bWF4PWwyem0oMEwpOworCSAgICBwLT5wcmV2LT56PXAtPnExOworCSAgICBwLT56LmZsYWdzPTA7CisJICB9CisJfQorICAgICAgfQorICAgICAgaWYoZW5kfHxwPT1mZy0+ZW5kKSBicmVhazsKKyAgICB9CisgICAgZmc9ZmctPm5vcm1hbG91dDsKKyAgfQorICByZXR1cm4gcmVwbGFjZWQ7Cit9CisjZW5kaWYKKworLyogIHRlbXBvcmFyeSBmdWVyIHZlcnNjaGllZGVuZSBCaXR2ZWt0b3JlbiAqLworYnZ0eXBlICp0bXA7CisKK2ludCBpbl92YXJsaXN0KHZhcmxpc3QgKnZsLGludCBjbnQsVmFyICp2LGludCBmbGFncykKK3sKKyAgaW50IGk7CisgIC8qRklYTUU6IHNsb3cgKi8KKyAgZm9yKGk9MDtpPGNudDtpKyspeworICAgIGlmKHZsW2ldLnY9PXYmJnZsW2ldLmZsYWdzPT1mbGFncykgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9jYWxsX2xpc3Qodm9pZCkKK3sKKyAgSUMgKnA7CisgIGZvcihwPWZpcnN0X2ljO3A7cD1wLT5uZXh0KXsKKyAgICBpZihwLT5jb2RlPT1DQUxMJiZwLT5jYWxsX2NudD09MCl7CisgICAgICBpZigocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUil7CisJcC0+Y2FsbF9jbnQ9MTsKKwlwLT5jYWxsX2xpc3Q9bXltYWxsb2Moc2l6ZW9mKCpwLT5jYWxsX2xpc3QpKTsKKwlwLT5jYWxsX2xpc3RbMF0udj1wLT5xMS52OworCXAtPmNhbGxfbGlzdFswXS5mbGFncz0wOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIGNhbGNfZmluZm8oVmFyICp2LGludCBmbGFncykKK3sKKyAgSUMgKnA7aW50IGksa25vd24sbWF4dHlwLHQsYzsKKyAgLyogMTI4IHR5cGVzIHNob3VsZCBiZSBlbm91Z2ggZm9yIGV2ZXJ5b25lIDotKSAqLworICAjZGVmaW5lIFRTSVpFIEJWU0laRSgxMjgpCisgIHN0YXRpYyBidnR5cGUgdGZbVFNJWkVdOworICBpZighdi0+ZmkpIGllcnJvcigwKTsKKyAgaWYoZmxhZ3MmQ0FMQ19VU0VTKXsKKyAgICBpZih2LT5maS0+ZmxhZ3MmQUxMX1VTRVMpIHJldHVybjsKKyAgICBmcmVlKHYtPmZpLT51c2VfbGlzdCk7CisgICAgdi0+ZmktPnVzZV9jbnQ9MDsKKyAgICB2LT5maS0+dXNlX2xpc3Q9MDsKKyAgICBtZW1zZXQodGYsMCxUU0laRSk7CisgICAga25vd249MTttYXh0eXA9LTE7CisgICAgZm9yKHA9Zmlyc3RfaWM7cDtwPXAtPm5leHQpeworICAgICAgYz1wLT5jb2RlOworICAgICAgaWYocC0+cTEuZmxhZ3MmRFJFRk9CSil7CisJdD0ocTF0eXAocCkmTlEpOworCWlmKHQ+bWF4dHlwKSBtYXh0eXA9dDsKKwlCU0VUKHRmLHQpOworICAgICAgfQorICAgICAgaWYocC0+cTIuZmxhZ3MmRFJFRk9CSil7CisJdD0ocTJ0eXAocCkmTlEpOworCWlmKHQ+bWF4dHlwKSBtYXh0eXA9dDsKKwlCU0VUKHRmLHQpOworICAgICAgfQorICAgICAgaWYoYz09Q0FMTCl7CisJaWYoKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpIT1WQVJ8fCFwLT5xMS52LT5maXx8IShwLT5xMS52LT5maS0+ZmxhZ3MmQUxMX1VTRVMpKXsKKwkgIGZyZWUodi0+ZmktPnVzZV9saXN0KTsKKwkgIHYtPmZpLT51c2VfY250PTA7CisJICB2LT5maS0+dXNlX2xpc3Q9MDsKKwkgIGtub3duPTA7CisJICBicmVhazsKKwl9ZWxzZXsKKwkgIGZvcihpPTA7aTxwLT5xMS52LT5maS0+dXNlX2NudDtpKyspeworCSAgICBpZihwLT5xMS52LT5maS0+dXNlX2xpc3RbaV0udil7CisJICAgICAgaWYoIWluX3Zhcmxpc3Qodi0+ZmktPnVzZV9saXN0LHYtPmZpLT51c2VfY250LHAtPnExLnYtPmZpLT51c2VfbGlzdFtpXS52LHAtPnExLnYtPmZpLT51c2VfbGlzdFtpXS5mbGFncykpeworCQl2LT5maS0+dXNlX2NudCsrOworCQl2LT5maS0+dXNlX2xpc3Q9bXlyZWFsbG9jKHYtPmZpLT51c2VfbGlzdCx2LT5maS0+dXNlX2NudCpzaXplb2YodmFybGlzdCkpOworCQl2LT5maS0+dXNlX2xpc3Rbdi0+ZmktPnVzZV9jbnQtMV09cC0+cTEudi0+ZmktPnVzZV9saXN0W2ldOworCSAgICAgIH0KKwkgICAgfWVsc2V7CisJICAgICAgQlNFVCh0ZixwLT5xMS52LT5maS0+dXNlX2xpc3RbaV0uZmxhZ3MmTlEpOworCSAgICB9CisJICB9CisJfQorICAgICAgfWVsc2V7CisJZm9yKGk9MDtpPHAtPnVzZV9jbnQ7aSsrKXsKKwkgIGlmKHAtPnVzZV9saXN0W2ldLnYtPm5lc3RpbmchPTApIGNvbnRpbnVlOworCSAgaWYoIWluX3Zhcmxpc3Qodi0+ZmktPnVzZV9saXN0LHYtPmZpLT51c2VfY250LHAtPnVzZV9saXN0W2ldLnYscC0+dXNlX2xpc3RbaV0uZmxhZ3MpKXsKKwkgICAgdi0+ZmktPnVzZV9jbnQrKzsKKwkgICAgdi0+ZmktPnVzZV9saXN0PW15cmVhbGxvYyh2LT5maS0+dXNlX2xpc3Qsdi0+ZmktPnVzZV9jbnQqc2l6ZW9mKHZhcmxpc3QpKTsKKwkgICAgdi0+ZmktPnVzZV9saXN0W3YtPmZpLT51c2VfY250LTFdPXAtPnVzZV9saXN0W2ldOworCSAgfQorCX0KKyAgICAgIH0KKyAgICB9CisgICAgZm9yKGM9MDtjPD1tYXh0eXA7YysrKXsKKyAgICAgIGlmKEJUU1QodGYsYykpeworCXYtPmZpLT51c2VfY250Kys7CisJdi0+ZmktPnVzZV9saXN0PW15cmVhbGxvYyh2LT5maS0+dXNlX2xpc3Qsdi0+ZmktPnVzZV9jbnQqc2l6ZW9mKHZhcmxpc3QpKTsKKwl2LT5maS0+dXNlX2xpc3Rbdi0+ZmktPnVzZV9jbnQtMV0udj0wOworCXYtPmZpLT51c2VfbGlzdFt2LT5maS0+dXNlX2NudC0xXS5mbGFncz1jOworICAgICAgfQorICAgIH0KKyAgICBpZihrbm93bikgdi0+ZmktPmZsYWdzfD1BTExfVVNFUzsKKyAgfQorICBpZihmbGFncyZDQUxDX0NIQU5HRVMpeworICAgIGlmKHYtPmZpLT5mbGFncyZBTExfTU9EUykgcmV0dXJuOworICAgIGZyZWUodi0+ZmktPmNoYW5nZV9saXN0KTsKKyAgICB2LT5maS0+Y2hhbmdlX2NudD0wOworICAgIHYtPmZpLT5jaGFuZ2VfbGlzdD0wOworICAgIG1lbXNldCh0ZiwwLFRTSVpFKTsKKyAgICBrbm93bj0xO21heHR5cD0tMTsKKyAgICBmb3IocD1maXJzdF9pYztwO3A9cC0+bmV4dCl7CisgICAgICBjPXAtPmNvZGU7CisgICAgICBpZihwLT56LmZsYWdzJkRSRUZPQkopeworCXQ9KHp0eXAocCkmTlEpOworCWlmKHQ+bWF4dHlwKSBtYXh0eXA9dDsKKwlCU0VUKHRmLHQpOworICAgICAgfQorICAgICAgaWYoYz09Q0FMTCl7CisJaWYoKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpIT1WQVJ8fCFwLT5xMS52LT5maXx8IShwLT5xMS52LT5maS0+ZmxhZ3MmQUxMX01PRFMpKXsKKwkgIGZyZWUodi0+ZmktPmNoYW5nZV9saXN0KTsKKwkgIHYtPmZpLT5jaGFuZ2VfY250PTA7CSAgCisJICB2LT5maS0+Y2hhbmdlX2xpc3Q9MDsKKwkgIGtub3duPTA7CisJICBicmVhazsKKwl9ZWxzZXsKKwkgIGZvcihpPTA7aTxwLT5xMS52LT5maS0+Y2hhbmdlX2NudDtpKyspeworCSAgICBpZihwLT5xMS52LT5maS0+Y2hhbmdlX2xpc3RbaV0udil7CisJICAgICAgaWYoIWluX3Zhcmxpc3Qodi0+ZmktPmNoYW5nZV9saXN0LHYtPmZpLT5jaGFuZ2VfY250LHAtPnExLnYtPmZpLT5jaGFuZ2VfbGlzdFtpXS52LHAtPnExLnYtPmZpLT5jaGFuZ2VfbGlzdFtpXS5mbGFncykpeworCQl2LT5maS0+Y2hhbmdlX2NudCsrOworCQl2LT5maS0+Y2hhbmdlX2xpc3Q9bXlyZWFsbG9jKHYtPmZpLT5jaGFuZ2VfbGlzdCx2LT5maS0+Y2hhbmdlX2NudCpzaXplb2YodmFybGlzdCkpOworCQl2LT5maS0+Y2hhbmdlX2xpc3Rbdi0+ZmktPmNoYW5nZV9jbnQtMV09cC0+cTEudi0+ZmktPmNoYW5nZV9saXN0W2ldOworCSAgICAgIH0KKwkgICAgfWVsc2V7CisJICAgICAgQlNFVCh0ZixwLT5xMS52LT5maS0+Y2hhbmdlX2xpc3RbaV0uZmxhZ3MmTlEpOworCSAgICB9CisJICB9CisJfQorICAgICAgfWVsc2V7CisJZm9yKGk9MDtpPHAtPmNoYW5nZV9jbnQ7aSsrKXsKKwkgIGlmKHAtPmNoYW5nZV9saXN0W2ldLnYtPm5lc3RpbmchPTApIGNvbnRpbnVlOworCSAgaWYoIWluX3Zhcmxpc3Qodi0+ZmktPmNoYW5nZV9saXN0LHYtPmZpLT5jaGFuZ2VfY250LHAtPmNoYW5nZV9saXN0W2ldLnYscC0+Y2hhbmdlX2xpc3RbaV0uZmxhZ3MpKXsKKwkgICAgdi0+ZmktPmNoYW5nZV9jbnQrKzsKKwkgICAgdi0+ZmktPmNoYW5nZV9saXN0PW15cmVhbGxvYyh2LT5maS0+Y2hhbmdlX2xpc3Qsdi0+ZmktPmNoYW5nZV9jbnQqc2l6ZW9mKHZhcmxpc3QpKTsKKwkgICAgdi0+ZmktPmNoYW5nZV9saXN0W3YtPmZpLT5jaGFuZ2VfY250LTFdPXAtPmNoYW5nZV9saXN0W2ldOworCSAgfQorCX0KKyAgICAgIH0KKyAgICB9CisgICAgZm9yKGM9MDtjPD1tYXh0eXA7YysrKXsKKyAgICAgIGlmKEJUU1QodGYsYykpeworCXYtPmZpLT5jaGFuZ2VfY250Kys7CisJdi0+ZmktPmNoYW5nZV9saXN0PW15cmVhbGxvYyh2LT5maS0+Y2hhbmdlX2xpc3Qsdi0+ZmktPmNoYW5nZV9jbnQqc2l6ZW9mKHZhcmxpc3QpKTsKKwl2LT5maS0+Y2hhbmdlX2xpc3Rbdi0+ZmktPmNoYW5nZV9jbnQtMV0udj0wOworCXYtPmZpLT5jaGFuZ2VfbGlzdFt2LT5maS0+Y2hhbmdlX2NudC0xXS5mbGFncz1jOworICAgICAgfQorICAgIH0KKyAgICBpZihrbm93bikgdi0+ZmktPmZsYWdzfD1BTExfTU9EUzsKKyAgfQorICBpZihmbGFncyZDQUxDX0NBTExTKXsKKyAgICBpZih2LT5maS0+ZmxhZ3MmQUxMX0NBTExTKSByZXR1cm47CisgICAgZnJlZSh2LT5maS0+Y2FsbF9saXN0KTsKKyAgICB2LT5maS0+Y2FsbF9saXN0PTA7CisgICAgdi0+ZmktPmNhbGxfY250PTA7CisgICAgcD12LT5maS0+b3B0X2ljOworICAgIGlmKCFwKQorICAgICAgcD12LT5maS0+Zmlyc3RfaWM7CisgICAgZm9yKDtwO3A9cC0+bmV4dCl7CisgICAgICBpZihwLT5jb2RlPT1DQUxMKXsKKwlpZihwLT5xMS5mbGFncyZEUkVGT0JKKSByZXR1cm47CisJaWYoIWluX3Zhcmxpc3Qodi0+ZmktPmNhbGxfbGlzdCx2LT5maS0+Y2FsbF9jbnQscC0+cTEudiwwKSl7CisJICB2LT5maS0+Y2FsbF9jbnQrKzsKKwkgIHYtPmZpLT5jYWxsX2xpc3Q9bXlyZWFsbG9jKHYtPmZpLT5jYWxsX2xpc3Qsdi0+ZmktPmNhbGxfY250KnNpemVvZih2YXJsaXN0KSk7CisJICB2LT5maS0+Y2FsbF9saXN0W3YtPmZpLT5jYWxsX2NudC0xXS52PXAtPnExLnY7CisJICB2LT5maS0+Y2FsbF9saXN0W3YtPmZpLT5jYWxsX2NudC0xXS5mbGFncz0wOworCX0KKyAgICAgIH0KKyAgICB9CisgICAgdi0+ZmktPmZsYWdzfD1BTExfQ0FMTFM7CisgIH0KK30KKwordm9pZCB1c2VkX2NsaXN0KHR5cGUgKnQsY29uc3RfbGlzdCAqY2wpCit7CisgIGludCBpO3ptYXggbDsKKworICBpZihJU0FSUkFZKHQtPmZsYWdzKSl7CisgICAgZm9yKGw9bDJ6bSgwTCk7IXptbGVxKHQtPnNpemUsbCkmJmNsO2w9em1hZGQobCxsMnptKDFMKSksY2w9Y2wtPm5leHQpeworICAgICAgaWYoIWNsLT5vdGhlcil7aWVycm9yKDApO3JldHVybjt9CisgICAgICB1c2VkX2NsaXN0KHQtPm5leHQsY2wtPm90aGVyKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGlmKElTVU5JT04odC0+ZmxhZ3MpJiYhY2wtPnRyZWUpeworICAgIHVzZWRfY2xpc3QoKCp0LT5leGFjdC0+c2wpW3ptMmwoY2wtPmlkeCldLnN0eXAsY2wtPm90aGVyKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYoSVNTVFJVQ1QodC0+ZmxhZ3MpKXsKKyAgICB0eXBlICpzdDsKKyAgICBpZighY2x8fCFjbC0+dHJlZSl7CisgICAgICBmb3IoaT0wO2k8dC0+ZXhhY3QtPmNvdW50JiZjbDtpKyspeworCXN0PSgqdC0+ZXhhY3QtPnNsKVtpXS5zdHlwOworCWlmKCEoKnQtPmV4YWN0LT5zbClbaV0uaWRlbnRpZmllcikgaWVycm9yKDApOworCWlmKHptZXF0byhsMnptKChsb25nKWkpLGNsLT5pZHgpKXsKKwkgIGlmKCgqdC0+ZXhhY3QtPnNsKVtpXS5pZGVudGlmaWVyWzBdKXsKKwkgICAgaWYoY2wtPm90aGVyKSB1c2VkX2NsaXN0KHN0LGNsLT5vdGhlcik7CisJICAgIGNsPWNsLT5uZXh0OworCSAgfQorCX0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGlmKGNsLT50cmVlJiYoY2wtPnRyZWUtPm8uZmxhZ3MmVkFSKSkKKyAgICB1c2VkX29iamVjdHMoY2wtPnRyZWUtPm8udik7CisgIHJldHVybjsKK30KKwordm9pZCB1c2VkX29iamVjdHMoVmFyICp2KQoreworICBpbnQgaTsKKyAgaWYodi0+ZmxhZ3MmUkVGRVJFTkNFRCkgcmV0dXJuOworICB2LT5mbGFnc3w9UkVGRVJFTkNFRDsKKyAgaWYoSVNGVU5DKHYtPnZ0eXAtPmZsYWdzKSl7CisgICAgSUMgKnA7CisgICAgaWYoISh2LT5mbGFncyZERUZJTkVEKSkgcmV0dXJuOworICAgIGlmKCF2LT5maSkgaWVycm9yKDApOworICAgIGZvcihpPTA7aTx2LT5maS0+Y2FsbF9jbnQ7aSsrKXsKKyAgICAgIGlmKHYtPmZpLT5jYWxsX2xpc3RbaV0udi0+ZmxhZ3MmREVGSU5FRCkKKwl1c2VkX29iamVjdHModi0+ZmktPmNhbGxfbGlzdFtpXS52KTsKKyAgICB9CisgICAgLypGSVhNRTogdXNlL2NoYW5nZSBhdXMgZmkgKi8KKyAgICBmb3IocD12LT5maS0+b3B0X2ljO3A7cD1wLT5uZXh0KXsKKyAgICAgIGlmKHAtPnExLmZsYWdzJlZBUikgdXNlZF9vYmplY3RzKHAtPnExLnYpOworICAgICAgaWYocC0+cTIuZmxhZ3MmVkFSKSB1c2VkX29iamVjdHMocC0+cTIudik7CisgICAgICBpZihwLT56LmZsYWdzJlZBUikgdXNlZF9vYmplY3RzKHAtPnoudik7CisgICAgfQorICB9ZWxzZXsKKyAgICBpZih2LT5jbGlzdCkgdXNlZF9jbGlzdCh2LT52dHlwLHYtPmNsaXN0KTsKKyAgfQorfQorCit6bWF4IHJlY2FsY19zdGFydF9vZmZzZXQ7CisKK3N0YXRpYyB2b2lkIG1hcmtfbmEoYnZ0eXBlICp0bXAsaW50IHIsaW50ICplcXRvKQoreworICBpbnQgaTsKKyAgaWYocjwwfHxyPj12Y291bnQtcmNvdW50fHxCVFNUKHRtcCxyKSkgcmV0dXJuOworICAvKmlmKERFQlVHJjEwMjQpIHByaW50ZigibWFya19uYSAlcyglcCk6XG4iLHZpbGlzdFtyXS0+aWRlbnRpZmllciwodm9pZCopdmlsaXN0W3JdKTsqLworICBCU0VUKHRtcCxyKTsKKyAgZm9yKGk9MDtpPHZjb3VudC1yY291bnQ7aSsrKXsKKyAgICBpZihlcXRvW2ldIT1yJiZlcXRvW3JdIT1pKSBjb250aW51ZTsKKyAgICAvKmlmKChERUJVRyYxMDI0KSYmIUJUU1QodG1wLGkpKSBwcmludGYoIiAgbWFya19uYSAlcyglcClcbiIsdmlsaXN0W2ldLT5pZGVudGlmaWVyLCh2b2lkKil2aWxpc3RbaV0pOyovCisgICAgbWFya19uYSh0bXAsaSxlcXRvKTsKKyAgfQorfQorCisvKiBUT0RPOiByZW1vdmUgdWdseSBoYWNrIGJ5IGRlY2VudCBleGl0IGNyaXRlcmlhICovCitzdGF0aWMgaW50IHJlY2NoZWNrX21heGNudDsKKworLyogY2hlY2sgaWYgZnVuY3Rpb24gdiBjYW4gbm90IGNhbGwgY2FsbGVlICovCitzdGF0aWMgaW50IGNoZWNrX25vbnJlY3Vyc2l2ZShWYXIgKnYsVmFyICpjYWxsZWUpCit7CisgIGludCBpOworICBWYXIgKmY7CisgIGlmKC0tcmVjY2hlY2tfbWF4Y250PT0wKSByZXR1cm4gMDsKKyAgaWYodi0+ZmkmJih2LT5maS0+ZmxhZ3MmQUxMX0NBTExTKSl7CisgICAgZm9yKGk9MDtpPHYtPmZpLT5jYWxsX2NudDtpKyspeworICAgICAgZj12LT5maS0+Y2FsbF9saXN0W2ldLnY7CisgICAgICBpZihmPT12KQorCXJldHVybiAwOworICAgICAgaWYoIWNoZWNrX25vbnJlY3Vyc2l2ZShmLGNhbGxlZSkpCisJcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbnZfc3RhdGljKFZhciAqdikKK3sKKyAgaWYoKHYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKSYmem1sZXEoWjAsdi0+b2Zmc2V0KSYmdi0+cmVnPT0wLyomJiEodi0+ZmxhZ3MmQ09OVlBBUkFNRVRFUikqLyl7CisgICAgdi0+c3RvcmFnZV9jbGFzcz1TVEFUSUM7CisgICAgdi0+b2Zmc2V0PSsrbGFiZWw7CisgICAgdi0+ZmxhZ3N8PShVU0VEQVNTT1VSQ0V8VVNFREFTREVTVHxERUZJTkVEfFNUQVRJQ0FVVE8pOworICAgIGlmKHYtPmNsaXN0KXtmcmVlX2NsaXN0KHYtPmNsaXN0KTt2LT5jbGlzdD0wO30KKyAgICBpZihERUJVRyYxMDI0KSBwcmludGYoImNoYW5naW5nICVzKCVwKSB0byBzdGF0aWMgKEwlbGQpXG4iLHYtPmlkZW50aWZpZXIsdix6bTJsKHYtPm9mZnNldCkpOworICB9Cit9CisKKy8qIHJlcGxhY2UgYXV0byB2YXJpYWJsZXMgYnkgc3RhdGljcyBpZiBwb3NzaWJsZSAqLwordm9pZCByZXBsYWNlX3N0YXRpY3MoVmFyICp2KQoreworICBJQyAqcDsKKyAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJyZXBsYWNlX3N0YXRpY3MoKVxuIik7CisgIGlmKGZvcmNlX3N0YXRpY3N8fCh2LT5maSYmKHYtPmZpLT5mbGFncyZBTExfQ0FMTFMpKSl7CisgICAgaWYoIWZvcmNlX3N0YXRpY3MpeworICAgICAgcmVjY2hlY2tfbWF4Y250PTEwMDsKKyAgICAgIGlmKCFjaGVja19ub25yZWN1cnNpdmUodix2KSkKKwlyZXR1cm47CisgICAgICBpZihERUJVRyYxMDI0KSBwcmludGYoIm5vbi1yZWN1cnNpdmVcbiIpOworICAgIH0KKworICAgIGZvcihwPWZpcnN0X2ljO3A7cD1wLT5uZXh0KXsKKyAgICAgIGlmKChwLT5xMS5mbGFncyYoVkFSfFJFRykpPT1WQVIpIGNudl9zdGF0aWMocC0+cTEudik7CisgICAgICBpZigocC0+cTIuZmxhZ3MmKFZBUnxSRUcpKT09VkFSKSBjbnZfc3RhdGljKHAtPnEyLnYpOworICAgICAgaWYoKHAtPnouZmxhZ3MmKFZBUnxSRUcpKT09VkFSKSBjbnZfc3RhdGljKHAtPnoudik7CisKKyAgICAgIGlmKHAtPmNvZGU9PUFERFJFU1MmJnAtPnExLnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQyl7CisJcC0+Y29kZT1BU1NJR047CisJcC0+cTEuZmxhZ3N8PVZBUkFEUjsKKwlwLT5xMi52YWwudm1heD1zaXpldGFiW3AtPnR5cGYyJk5RXTsKKwlwLT50eXBmPXAtPnR5cGYyOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK3ZvaWQgcmVjYWxjX29mZnNldHMoZmxvd2dyYXBoICpnKQorLyogIGJlcmVjaG5ldCBPZmZzZXRzIGZ1ZXIgYXV0by1WYXJpYWJsZW4gbmV1IHVuZCB2ZXJzdWNodCwgZnVlciBWYXJpYWJsZW4sICovCisvKiAgZGllIG5pY2h0IGdsZWljaHplaXRpZyBha3RpdiBzaW5kLCBkZW4gZ2xlaWNoZW4gUGxhdHogenUgYmVsZWdlbiAgICAgICAgKi8KK3sKKyAgaW50IGksaixiLGJjbnQsciwqZXF0byxwYXNzO3NpemVfdCBic2l6ZSx2c2l6ZTt6bWF4ICphbCwqc3o7CisgIGJ2dHlwZSAqKnVzZWQsKnRtcCwqZW1wdHksKnZ0bXAsKnZwb3M7CisgIElDICpwOworICBmbG93Z3JhcGggKmZnOworCisgIGlmKERFQlVHJjEwMjQpIHByaW50ZigicmVjYWxjdWxhdGluZyBvZmZzZXRzXG4iKTsKKyAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJzZXR0aW5nIHVwIGFycmF5c1xuIik7CisgIC8qYnNpemU9KGJhc2ljX2Jsb2NrcytDSEFSX0JJVC0xKS9DSEFSX0JJVDsgLyogd2UgZG9uJ3MgdXNlIGZnLT5pbmRleCBidXQgY291bnQgZnJvbSAwICovCisgIGJzaXplPUJWU0laRShiYXNpY19ibG9ja3MpOworICBpZihERUJVRyYxMDI0KSBwcmludGYoImJzaXplPSVsdVxuIiwodW5zaWduZWQgbG9uZylic2l6ZSk7CisgIHRtcD1teW1hbGxvYyhic2l6ZSk7CisgIGFsPW15bWFsbG9jKHNpemVvZigqYWwpKih2Y291bnQtcmNvdW50KSk7CisgIGVxdG89bXltYWxsb2Moc2l6ZW9mKGludCkqKHZjb3VudC1yY291bnQpKTsKKyAgc3o9bXltYWxsb2Moc2l6ZW9mKCpzeikqKHZjb3VudC1yY291bnQpKTsKKyAgZW1wdHk9bXltYWxsb2MoYnNpemUpOworICBtZW1zZXQoZW1wdHksMCxic2l6ZSk7CisgIHVzZWQ9bXltYWxsb2Moc2l6ZW9mKGJ2dHlwZSAqKSoodmNvdW50LXJjb3VudCkpOworICAvKiAgVGFiZWxsZSwgd2VsY2hlIFZhcmlhYmxlIGluIHdlbGNoZW0gQmxvY2sgYmVsZWd0IGlzdCwgYXVmYmF1ZW4gICovCisgIGZvcihpPTA7aTx2Y291bnQtcmNvdW50O2krKyl7CisgICAgaWYoKHZpbGlzdFtpXS0+c3RvcmFnZV9jbGFzcz09QVVUT3x8dmlsaXN0W2ldLT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikmJnptbGVxKGwyem0oMEwpLHZpbGlzdFtpXS0+b2Zmc2V0KSl7CisgICAgICBpZihERUJVRyYyMDQ4KSBwcmludGYoInNldHRpbmcgdXAgZm9yICVzLCVsZFxuIix2aWxpc3RbaV0tPmlkZW50aWZpZXIsem0ybCh2aWxpc3RbaV0tPm9mZnNldCkpOworICAgICAgdXNlZFtpXT1teW1hbGxvYyhic2l6ZSk7CisgICAgICBtZW1zZXQodXNlZFtpXSwwLGJzaXplKTsKKyAgICB9ZWxzZXsKKyAgICAgIHVzZWRbaV09MDsKKyAgICB9CisgICAgc3pbaV09c3pvZih2aWxpc3RbaV0tPnZ0eXApOworICAgIGFsW2ldPWZhbGlnbih2aWxpc3RbaV0tPnZ0eXApOworICAgIGVxdG9baV09LTE7CisgIH0KKyAgYj0wOyBmZz1nOworICB3aGlsZShmZyl7CisgICAgaWYoYj49YmFzaWNfYmxvY2tzKSBpZXJyb3IoMCk7CisgICAgZm9yKGk9MDtpPHZjb3VudC1yY291bnQ7aSsrKXsKKyAgICAgIGlmKHVzZWRbaV0mJihCVFNUKGZnLT5hdl9pbixpKXx8QlRTVChmZy0+YXZfb3V0LGkpKSl7CisJQlNFVCh1c2VkW2ldLGIpOworCWZvcihyPTE7cjw9TUFYUjtyKyspCisJICBpZihmZy0+cmVndltyXSYmZmctPnJlZ3Zbcl0tPmluZGV4PT1pKSBCQ0xSKHVzZWRbaV0sYik7CisgICAgICB9CisgICAgfQorICAgIGZvcihwPWZnLT5zdGFydDtwO3A9cC0+bmV4dCl7CisgICAgICBpZigocC0+cTEuZmxhZ3MmKFZBUnxSRUcpKT09VkFSKXsKKwlpPXAtPnExLnYtPmluZGV4OworCWlmKGkhPS0xJiZpPHZjb3VudC1yY291bnQpeworCSAgaWYoaTwwfHxpPj12Y291bnQpIGllcnJvcigwKTsKKwkgIGlmKGk+PTAmJnVzZWRbaV0peworCSAgICBCU0VUKHVzZWRbaV0sYik7CisJICB9CisJfQorICAgICAgfQorICAgICAgaWYoKHAtPnEyLmZsYWdzJihWQVJ8UkVHKSk9PVZBUil7CisJaT1wLT5xMi52LT5pbmRleDsKKwlpZihpIT0tMSYmaTx2Y291bnQtcmNvdW50KXsKKwkgIGlmKGk8MHx8aT49dmNvdW50KSBpZXJyb3IoMCk7CisJICBpZihpPj0wJiZ1c2VkW2ldKXsKKwkgICAgQlNFVCh1c2VkW2ldLGIpOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGlmKChwLT56LmZsYWdzJihWQVJ8UkVHKSk9PVZBUil7CisJaT1wLT56LnYtPmluZGV4OworCWlmKGkhPS0xKXsKKwkgIGlmKGk8MHx8aT49dmNvdW50KSBpZXJyb3IoMCk7CisJICBpZihpPj0wJiZ1c2VkW2ldKXsKKwkgICAgQlNFVCh1c2VkW2ldLGIpOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGlmKHA9PWZnLT5lbmQpIGJyZWFrOworICAgIH0KKyAgICBmZz1mZy0+bm9ybWFsb3V0OworICAgIGIrKzsKKyAgfQorICBiY250PWI7CisKKyAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJsb2NhbCByZWNhbGNcbiIpOworICB2c2l6ZT1CVlNJWkUodmNvdW50LXJjb3VudCk7CisgIHZ0bXA9bXltYWxsb2ModnNpemUpOworICB2cG9zPW15bWFsbG9jKHZzaXplKTsKKyAgaj0wOworICBmb3IoZmc9ZztmZztmZz1mZy0+bm9ybWFsb3V0KXsKKyAgICBidmNvcHkodnRtcCxmZy0+YXZfaW4sdnNpemUpOworICAgIGJ2dW5pdGUodnRtcCxmZy0+YXZfb3V0LHZzaXplKTsKKyAgICBmb3Iocj0xO3I8PU1BWFI7cisrKQorICAgICAgaWYoZmctPnJlZ3Zbcl0mJmZnLT5yZWd2W3JdLT5pbmRleDx2Y291bnQtcmNvdW50KSBCU0VUKHZ0bXAsZmctPnJlZ3Zbcl0tPmluZGV4KTsKKyAgICBmb3IoaT0wO2k8dmNvdW50LXJjb3VudDtpKyspeworICAgICAgaWYoIUJUU1QodnRtcCxpKSl7CisJaWYoIXVzZWRbaV18fCFCVFNUKHVzZWRbaV0sail8fCh2aWxpc3RbaV0tPnN0b3JhZ2VfY2xhc3MhPUFVVE8mJnZpbGlzdFtpXS0+c3RvcmFnZV9jbGFzcyE9UkVHSVNURVIpKQorCSAgQlNFVCh2dG1wLGkpOworCWVsc2V7CisJICBmb3Iocj0wO3I8YmNudDtyKyspCisJICAgIGlmKHIhPWomJkJUU1QodXNlZFtpXSxyKSkKKwkgICAgICBCU0VUKHZ0bXAsaSk7CisJfQorICAgICAgfQorICAgIH0KKyNpZiAxCisgICAgaWYoREVCVUcmMTAyNCl7CisgICAgICBwcmludGYoInBvc3NpYmxlIGZvciBsb2NhbCByZWNhbGMgYmxvY2sgJWQgKCVkKTpcbiIsaixmZy0+aW5kZXgpOworICAgICAgZm9yKGk9MDtpPHZjb3VudC1yY291bnQ7aSsrKQorCWlmKCFCVFNUKHZ0bXAsaSkpCisJICBwcmludGYoIiAgJXMoJXApXG4iLHZpbGlzdFtpXS0+aWRlbnRpZmllciwodm9pZCopdmlsaXN0W2ldKTsKKyAgICB9CisjZW5kaWYKKyAgICBmb3IocD1mZy0+c3RhcnQ7cDtwPXAtPm5leHQpeworICAgICAgaWYoKHAtPnouZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUil7CisJYj1wLT56LnYtPmluZGV4OworCWlmKGI+PTAmJmI8dmNvdW50LXJjb3VudCYmZXF0b1tiXTwwJiYhQlRTVCh2dG1wLGIpKXsKKwkgIC8qIGltcHJlY2lzZSwgYnV0IHNob3VsZCBkbyB0aGUgam9iICovCisJICBJQyAqbTsKKwkgIC8qaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJjaGVja2luZyAlcyglcClcbiIsdmlsaXN0W2JdLT5pZGVudGlmaWVyLCh2b2lkKil2aWxpc3RbYl0pOyovCisJICBidmNvcHkodnBvcyx2dG1wLHZzaXplKTsKKwkgIGZvcihtPXAtPm5leHQ7bTttPW0tPm5leHQpeworCSAgICBpZihtLT5xMS5mbGFncyZWQVIpIG1hcmtfbmEodnBvcyxtLT5xMS52LT5pbmRleCxlcXRvKTsKKwkgICAgaWYobS0+cTIuZmxhZ3MmVkFSKSBtYXJrX25hKHZwb3MsbS0+cTIudi0+aW5kZXgsZXF0byk7CisJICAgIGlmKG0tPnouZmxhZ3MmVkFSKXsKKwkgICAgICBtYXJrX25hKHZwb3MsbS0+ei52LT5pbmRleCxlcXRvKTsKKwkgICAgICBpZihtLT56LnYtPmluZGV4PT1iKSBCU0VUKHZ0bXAsYik7CisJICAgIH0KKwkgICAgaWYobT09ZmctPmVuZCkgYnJlYWs7CisJICB9CisJICBmb3IoaT12Y291bnQtcmNvdW50LTE7aT49MDtpLS0peworCSAgICBpZighQlRTVCh2cG9zLGkpJiZpIT1iKXsKKwkgICAgICBpZihERUJVRyYxMDI0KSBwcmludGYoImxvY2FsIG1lbW9yeSBmb3IgJXMoJXApIGFuZCAlcyglcCkgZXF1YWwiLHZpbGlzdFtpXS0+aWRlbnRpZmllciwodm9pZCAqKXZpbGlzdFtpXSx2aWxpc3RbYl0tPmlkZW50aWZpZXIsKHZvaWQgKil2aWxpc3RbYl0pOworCSAgICAgIGVxdG9bYl09aTsKKwkgICAgICBpZighem1sZXEoYWxbYl0sYWxbaV0pKSBhbFtpXT1hbFtiXTsKKwkgICAgICBpZighem1sZXEoc3pbYl0sc3pbaV0pKSBzeltpXT1zeltiXTsKKwkgICAgICBpZighem1sZXEoYWxbaV0sYWxbYl0pKSBhbFtiXT1hbFtpXTsKKwkgICAgICBpZighem1sZXEoc3pbaV0sc3pbYl0pKSBzeltiXT1zeltpXTsKKwkgICAgICBpZihERUJVRyYxMDI0KSBwcmludGYoIiBzej0lbGQgYWw9JWxkXG4iLChsb25nKXptMmwoYWxbaV0pLChsb25nKXptMmwoc3pbaV0pKTsKKwkgICAgICBCU0VUKHZ0bXAsaSk7CisJICAgICAgLypidnVuaXRlKHVzZWRbaV0sdXNlZFtiXSxic2l6ZSk7Ki8KKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGlmKHA9PWZnLT5lbmQpIGJyZWFrOworICAgIH0KKyAgICBqKys7CisgIH0KKyAgZnJlZSh2dG1wKTsKKyAgZnJlZSh2cG9zKTsKKworCisgIC8qICBzY2hhdWVuLCBvYiBWYXJpYWJsZW4gaW4gZ2xlaWNoZW4gU3BlaWNoZXIga29lbm5lbiAgKi8KKyAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJsb29raW5nIGZvciBkaXN0aW5jdCB2YXJpYWJsZXNcbiIpOworICBmb3IoaT0wO2k8dmNvdW50LXJjb3VudDtpKyspeworCisgICAgaWYoIXVzZWRbaV18fGVxdG9baV0+PTApIGNvbnRpbnVlOworICAgIGlmKCFtZW1jbXAodXNlZFtpXSxlbXB0eSxic2l6ZSkpeyBmcmVlKHVzZWRbaV0pO3VzZWRbaV09MDtjb250aW51ZTt9CisgICAgZm9yKGI9aSsxO2I8dmNvdW50LXJjb3VudDtiKyspeworICAgICAgaWYoIXVzZWRbYl18fGVxdG9bYl0+PTApIGNvbnRpbnVlOworICAgICAgaWYoIW1lbWNtcCh1c2VkW2JdLGVtcHR5LGJzaXplKSl7IGZyZWUodXNlZFtiXSk7dXNlZFtiXT0wO2NvbnRpbnVlO30KKyAgICAgIGlmKERFQlVHJjIwNDgpIHByaW50ZigiY29tcGFyaW5nICVzKCVwKSBhbmQgJXMoJXApXG4iLHZpbGlzdFtpXS0+aWRlbnRpZmllciwodm9pZCAqKXZpbGlzdFtpXSx2aWxpc3RbYl0tPmlkZW50aWZpZXIsKHZvaWQgKil2aWxpc3RbYl0pOworICAgICAgCisgICAgICBtZW1jcHkodG1wLHVzZWRbaV0sYnNpemUpOworICAgICAgYnZpbnRlcnNlY3QodG1wLHVzZWRbYl0sYnNpemUpOworICAgICAgaWYoIW1lbWNtcCh0bXAsZW1wdHksYnNpemUpKXsKKwlpZihERUJVRyYxMDI0KSBwcmludGYoIm1lbW9yeSBmb3IgJXMoJXApIGFuZCAlcyglcCkgZXF1YWxcbiIsdmlsaXN0W2ldLT5pZGVudGlmaWVyLCh2b2lkICopdmlsaXN0W2ldLHZpbGlzdFtiXS0+aWRlbnRpZmllciwodm9pZCAqKXZpbGlzdFtiXSk7CisJZXF0b1tiXT1pOworCWlmKCF6bWxlcShhbFtiXSxhbFtpXSkpIGFsW2ldPWFsW2JdOworCWlmKCF6bWxlcShzeltiXSxzeltpXSkpIHN6W2ldPXN6W2JdOworCWlmKCF6bWxlcShhbFtpXSxhbFtiXSkpIGFsW2JdPWFsW2ldOworCWlmKCF6bWxlcShzeltpXSxzeltiXSkpIHN6W2JdPXN6W2ldOworCWJ2dW5pdGUodXNlZFtpXSx1c2VkW2JdLGJzaXplKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZihERUJVRyYxMDI0KSBwcmludGYoInByb3BhZ2F0aW5nIHN6L2FsXG4iKTsKKyAgZG97CisgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJwcGFzc1xuIik7CisgICAgYj0wOworICAgIGZvcihpPTA7aTx2Y291bnQtcmNvdW50O2krKyl7CisgICAgICBqPWk7CisgICAgICB3aGlsZSgoaj1lcXRvW2pdKT49MCl7CisJaWYoIXptbGVxKHN6W2pdLHN6W2ldKSl7c3pbaV09c3pbal07Yj0xO2o9aTtpZihERUJVRyYxMDI0KSBwcmludGYoImxtc2V0ICVkKCVwKSB0byBzeiAlbGRcbiIsaSx2aWxpc3RbaV0sem0ybChzeltpXSkpO30KKwlpZighem1sZXEoc3pbaV0sc3pbal0pKXtzeltqXT1zeltpXTtiPTE7aWYoREVCVUcmMTAyNCkgcHJpbnRmKCJsbXNldCAlZCglcCkgdG8gc3ogJWxkXG4iLGosdmlsaXN0W2pdLHptMmwoc3pbal0pKTt9CisJaWYoIXptbGVxKGFsW2pdLGFsW2ldKSl7YWxbaV09YWxbal07Yj0xO2o9aTtpZihERUJVRyYxMDI0KSBwcmludGYoImxtc2V0ICVkKCVwKSB0byBhbCAlbGRcbiIsaSx2aWxpc3RbaV0sem0ybChhbFtpXSkpO30KKwlpZighem1sZXEoYWxbaV0sYWxbal0pKXthbFtqXT1hbFtpXTtiPTE7aWYoREVCVUcmMTAyNCkgcHJpbnRmKCJsbXNldCAlZCglcCkgdG8gYWwgJWxkXG4iLGosdmlsaXN0W2pdLHptMmwoYWxbal0pKTt9CisKKyAgICAgIH0KKyAgICB9CisgIH13aGlsZShiKTsKKworICBpZihERUJVRyYxMDI0KSBwcmludGYoImZpbmFsIHJlY2FsY3VsYXRpbmdcbiIpOworICBtYXhfb2Zmc2V0PXJlY2FsY19zdGFydF9vZmZzZXQ7CisgIGZvcihwYXNzPTA7cGFzczwzO3Bhc3MrKyl7CisgICAgem1heCBhOworICAgIGZvcihhPW1heGFsaWduOyF6bWVxdG8oYSxaMCk7YT16bXN1YihhLFoxKSl7CisgICAgICBmb3IoaT0wO2k8dmNvdW50LXJjb3VudDtpKyspeworCWlmKCF1c2VkW2ldKSBjb250aW51ZTsKKwlpZighem1lcXRvKGEsYWxbaV0pKSBjb250aW51ZTsKKwlpZihlcXRvW2ldPj0wJiZwYXNzPDIpIGNvbnRpbnVlOworCisJaWYocGFzcz09MCl7CisJICBpZighem1sZXEoc3pbaV0sc2l6ZXRhYltNQVhJTlRdKSYmIXptbGVxKHN6W2ldLHNpemV0YWJbTERPVUJMRV0pKSBjb250aW51ZTsKKwl9CisJZnJlZSh1c2VkW2ldKTsKKwl1c2VkW2ldPTA7CisJaWYoREVCVUcmMjA0OCkgcHJpbnRmKCJhZGp1c3Rpbmcgb2Zmc2V0IGZvciAlcywlbGQoJXApXG4iLHZpbGlzdFtpXS0+aWRlbnRpZmllcix6bTJsKHZpbGlzdFtpXS0+b2Zmc2V0KSwodm9pZCopdmlsaXN0W2ldKTsKKwlpZihlcXRvW2ldPj0wKXsKKwkgIGo9ZXF0b1tpXTsKKwkgIGRveworCSAgfXdoaWxlKHVzZWRbal0mJihqPWVxdG9bal0pPj0wKTsKKwkgIGlmKGo8MCkgaWVycm9yKDApOworCSAgaWYoIXptbGVxKHN6W2ldLHN6W2pdKSkgCisJICAgIHtwcmludGYoIiVkKCVwKSAlZCglcCkgJWxkICVsZFxuIixpLHZpbGlzdFtpXSxqLHZpbGlzdFtqXSx6bTJsKHN6W2ldKSx6bTJsKHN6W2pdKSk7aWVycm9yKDApO30KKwkgIGlmKCF6bWxlcShhbFtpXSxhbFtqXSkpCisJICAgIHtwcmludGYoIiVkKCVwKSAlZCglcCkgJWxkICVsZFxuIixpLHZpbGlzdFtpXSxqLHZpbGlzdFtqXSx6bTJsKGFsW2ldKSx6bTJsKGFsW2pdKSk7aWVycm9yKDApO30KKwkgIHZpbGlzdFtpXS0+b2Zmc2V0PXZpbGlzdFtqXS0+b2Zmc2V0OworCSAgaWYoREVCVUcmMjA0OCkgcHJpbnRmKCJzZXQgdG8gJWxkIChlcXRvKVxuIiwobG9uZyl6bTJsKHZpbGlzdFtpXS0+b2Zmc2V0KSk7CisJICBjb250aW51ZTsKKwl9CisJdmlsaXN0W2ldLT5vZmZzZXQ9em1tdWx0KHptZGl2KHptYWRkKG1heF9vZmZzZXQsem1zdWIoYWxbaV0sbDJ6bSgxTCkpKSxhbFtpXSksYWxbaV0pOworCW1heF9vZmZzZXQ9em1hZGQodmlsaXN0W2ldLT5vZmZzZXQsc3pbaV0pOworCWlmKERFQlVHJjIwNDgpIHByaW50Zigic2V0IHRvICVsZCAoc3RkKVxuIiwobG9uZyl6bTJsKHZpbGlzdFtpXS0+b2Zmc2V0KSk7CisgICAgICB9CisgICAgfQorICB9CisgIHJlY2FsY19zdGFydF9vZmZzZXQ9bDJ6bSgwTCk7CisgIGZyZWUodXNlZCk7CisgIGZyZWUoc3opOworICBmcmVlKGFsKTsKKyAgZnJlZSh0bXApOworICBmcmVlKGVtcHR5KTsKKyAgZnJlZShlcXRvKTsKK30KK3ZvaWQgcmVtb3ZlX0lDX2ZnKGZsb3dncmFwaCAqZyxJQyAqcCkKKy8qICBFbnRmZXJudCBJQyBwIHVuZCBiZWFjaHRldCBGbHVzc2dyYXBoLiBBdXNzZXJkZW0gd2VyZGVuICAgICAgICAgICAgICovCisvKiAgdXNlL2NoYW5nZS1MaXN0ZW4gZnJlaWdlZ2ViZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpZihwLT5xMS5hbXx8cC0+cTIuYW18fHAtPnouYW0pIGllcnJvcigwKTsKKyAgaWYoaGF2ZV9hbGlhcyl7CisgICAgZnJlZShwLT51c2VfbGlzdCk7CisgICAgZnJlZShwLT5jaGFuZ2VfbGlzdCk7CisgIH0KKyAgaWYoZy0+c3RhcnQ9PWctPmVuZCl7CisgICAgZy0+c3RhcnQ9Zy0+ZW5kPTA7CisgIH1lbHNleworICAgIGlmKHA9PWctPmVuZCkgZy0+ZW5kPXAtPnByZXY7CisgICAgaWYocD09Zy0+c3RhcnQpIGctPnN0YXJ0PXAtPm5leHQ7CisgIH0KKyAgcmVtb3ZlX0lDKHApOworfQorCisvKiBmdW5jdGlvbiB0byBkZWNpZGUgd2hldGhlciBhIHBvc3NpYmxlIGNvbnN0IG1lbWNweSBzaGFsbAorICAgYmUgaW1wbGVtZW50ZWQgdXNpbmcgdHlwIHQ7IGlmIG5vcHRyIGlzIG5vbi16ZXJvIGRlY2lkZQorICAgaWYgbm90IGludHJvZHVjaW5nIGEgcG9pbnRlciBpcyBwcmVmZXJhYmxlICovCitpbnQgZGVjaWRlX2NvbnN0X21lbWNweShJQyAqcCxpbnQgdHlwLGludCBub3B0cikKK3sKKyAgem1heCBjbnQ7CisKKyAgLyogdXN1YWxseSBpbnQgaXMgdGhlIG1vc3QgZWZmaWNpZW50ICovCisgIGlmKHR5cD09Q0hBUil7CisgIH1lbHNlIGlmKHR5cD09QkVTVENPUFlUKXsKKyAgICBpZigocC0+ei5mbGFncyYoVkFSfERSRUZPQkopKSE9VkFSKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYoIXptbGVxKGFsaWduW3R5cF0sZmFsaWduKHAtPnoudi0+dnR5cCkpKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYoIXptZXF0byh6bW1vZChwLT56LnZhbC52bWF4LGFsaWduW3R5cF0pLFowKSkKKyAgICAgIHJldHVybiAwOworICB9ZWxzZQorICAgIHJldHVybiAwOworICAKKyAgY250PXptZGl2KHAtPnEyLnZhbC52bWF4LHNpemV0YWJbdHlwXSk7CisKKyAgaWYoKHAtPnouZmxhZ3MmKERSRUZPQkp8S09OU1QpKSE9RFJFRk9CSil7CisgICAgaW50IHNjOworICAgIGlmKHAtPnouZmxhZ3MmRFJFRk9CSikKKyAgICAgIHNjPVNUQVRJQzsKKyAgICBlbHNlCisgICAgICBzYz1wLT56LnYtPnN0b3JhZ2VfY2xhc3M7CisgICAgaWYoc2M9PUFVVE98fHNjPT1SRUdJU1RFUil7CisgICAgICAvKiB3ZSBhc3N1bWUgdGhhdCB3cml0ZXMgb24gdGhlIHN0YWNrIGNhbiBiZSBjb21iaW5lZCAqLworICAgICAgaWYodHlwPT1DSEFSJiZub3B0cikKKwlpZih6bWxlcShjbnQsem1tdWx0KGNsaXN0X2NvcHlfcG9pbnRlcixzaXpldGFiW0JFU1RDT1BZVF0pKSkKKwkgIHJldHVybiAxOworICAgICAgaWYoem1sZXEoY250LGwyem0oY2xpc3RfY29weV9zdGFjaykpKQorCXJldHVybiAxOworICAgIH1lbHNleworICAgICAgaWYoem1sZXEoY250LGwyem0oY2xpc3RfY29weV9zdGF0aWMpKSkKKwlyZXR1cm4gMTsKKyAgICB9CisgIH0KKworICBpZihub3B0cj09MCYmem1sZXEoY250LGwyem0oY2xpc3RfY29weV9wb2ludGVyKSkpCisgICAgcmV0dXJuIDE7CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBpbnNlcnRfY29uc3RfbWVtY3B5KGZsb3dncmFwaCAqZmcpCit7CisgIGludCBjaGFuZ2VkID0wOworICBmbG93Z3JhcGggKmc7CisgIGZvcihnPWZnO2c7Zz1nLT5ub3JtYWxvdXQpeworICAgIElDICpwOworICAgIGZvcihwPWctPnN0YXJ0O3A7cD1wLT5uZXh0KXsKKyAgICAgIGludCBjPXAtPmNvZGU7CisgICAgICAKKyAgICAgIC8qIFRPRE86IGZpbmlzaCBzdXBwb3J0IGZvciBQVVNIICovCisgICAgICBpZigoYz09QVNTSUdOLyp8fGM9PVBVU0gqLykmJihwLT5xMS5mbGFncyYoVkFSfFZBUkFEUnxEUkVGT0JKKSk9PVZBUiYmcC0+cTEudi0+Y2xpc3QmJmlzX2NvbnN0KHAtPnExLnYtPnZ0eXApKXsKKwl6bWF4IGksc3o9cC0+cTIudmFsLnZtYXg7CisJenVjaGFyIHp1YzsKKwlWYXIgKnY9cC0+cTEudjsKKwl0eXBlICp0PXYtPnZ0eXA7CisJaW50IG9rPTE7CisKKwlmb3IoaT1aMDt6bWxlcShpLHN6KTtpPXptYWRkKGksWjEpKXsKKwkgIGlmKCFnZXRfY2xpc3RfYnl0ZSh0LHYtPmNsaXN0LGksJnp1YykpCisJICAgIG9rPTA7CisJfQorCQorCWlmKG9rPT0xKXsKKwkgIGludCB0eXA9MCxub3B0cj0xOworCSAgaW50IGExLGEyOworCSAgaWYoREVCVUcmMTAyNCkge3ByaW50ZigiY2FuIHJlcGxhY2UgY29uc3QgbWVtY3B5OlxuIik7cHJpYzIoc3Rkb3V0LHApO30KKwkgIAorCSAgaWYoYz09QVNTSUdOJiYocC0+ei5mbGFncyYoRFJFRk9CSnxLT05TVCkpIT1EUkVGT0JKKXsKKwkgICAgaWYoZGVjaWRlX2NvbnN0X21lbWNweShwLEJFU1RDT1BZVCxub3B0cikpCisJICAgICAgdHlwPUJFU1RDT1BZVDsKKwkgICAgZWxzZSBpZihkZWNpZGVfY29uc3RfbWVtY3B5KHAsQ0hBUixub3B0cikpCisJICAgICAgdHlwPUNIQVI7CisJICB9CisJICBpZih0eXA9PTApeworCSAgICBub3B0cj0wOworCSAgICBpZihkZWNpZGVfY29uc3RfbWVtY3B5KHAsQkVTVENPUFlULG5vcHRyKSkKKwkgICAgICB0eXA9QkVTVENPUFlUOworCSAgICBlbHNlIGlmKGRlY2lkZV9jb25zdF9tZW1jcHkocCxDSEFSLG5vcHRyKSkKKwkgICAgICB0eXA9Q0hBUjsKKwkgIH0KKwkgIAorCSAgaWYodHlwKXsKKwkgICAgVmFyICpwdHI7CisJICAgIElDICpuZXc7CisKKwkgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJ3aWxsIGRvIGl0ICh0eXA9JWQgbm9wdHI9JWQpXG4iLHR5cCxub3B0cik7CisJICAgIGlmKCFub3B0cil7CisJICAgICAgdHlwZSAqcHQ7CisJICAgICAgaWYocC0+ei5mbGFncyZWQVIpeworCQlpZihwLT56LmZsYWdzJkRSRUZPQkopeworCQkgIHR5cGUgKm5ldz1uZXdfdHlwKCk7CisJCSAgbmV3LT5mbGFncz1wLT56LmR0eXAmTlE7CisJCSAgbmV3LT5uZXh0PW5ld190eXAoKTsKKwkJICBuZXctPm5leHQtPmZsYWdzPXR5cDsKKwkJICBwdD1uZXc7CisJCX1lbHNleworCQkgIHB0PW5ld190eXAoKTsKKwkJICBwdC0+ZmxhZ3M9UE9JTlRFUl9UWVBFKHAtPnoudi0+dnR5cCk7CisJCSAgcHQtPm5leHQ9Y2xvbmVfdHlwKHAtPnoudi0+dnR5cCk7CisJCX0KKwkgICAgICB9ZWxzZXsKKwkJc3RhdGljIHR5cGUgY3Q9e0NIQVJ9OworCQl0eXBlICpuZXc7CisJCWN0LmZsYWdzPXR5cDsKKwkJbmV3PW5ld190eXAoKTsKKwkJbmV3LT5mbGFncz1QT0lOVEVSX1RZUEUoJmN0KTsKKwkJbmV3LT5uZXh0PW5ld190eXAoKTsKKwkJbmV3LT5uZXh0LT5mbGFncz10eXA7CisJCXB0PW5ldzsKKwkgICAgICB9CisKKwkgICAgICBwdHI9YWRkX3RtcF92YXIocHQpOworCSAgICAgIG5ldz1uZXdfSUMoKTsKKwkgICAgICBuZXctPnouZmxhZ3M9VkFSOworCSAgICAgIG5ldy0+ei52PXB0cjsKKwkgICAgICBuZXctPnExPXAtPno7CisJICAgICAgaWYocC0+ei5mbGFncyZEUkVGT0JKKXsKKwkJbmV3LT5jb2RlPUFTU0lHTjsKKwkJbmV3LT5xMS5mbGFncyY9fkRSRUZPQko7CisJCW5ldy0+dHlwZj1wdHItPnZ0eXAtPmZsYWdzOworCSAgICAgIH1lbHNlIGlmKHAtPnoudi0+c3RvcmFnZV9jbGFzcz09U1RBVElDfHxwLT56LnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisJCW5ldy0+Y29kZT1BU1NJR047CisJCW5ldy0+cTEuZmxhZ3N8PVZBUkFEUjsKKwkJbmV3LT50eXBmPXB0ci0+dnR5cC0+ZmxhZ3M7CisJICAgICAgfWVsc2UgaWYocC0+ei52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT56LnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKXsKKwkJbmV3LT5jb2RlPUFERFJFU1M7CisJCW5ldy0+dHlwZj1wLT56LnYtPnZ0eXAtPmZsYWdzOworCQluZXctPnR5cGYyPXB0ci0+dnR5cC0+ZmxhZ3M7CisJICAgICAgfWVsc2UKKwkJaWVycm9yKDApOworCSAgICAgIG5ldy0+cTIudmFsLnZtYXg9c2l6ZXRhYltuZXctPnR5cGZdOworCSAgICAgIGluc2VydF9JQ19mZyhnLHAtPnByZXYsbmV3KTsKKwkgICAgfQorCSAgICBpPVowOworCSAgICB3aGlsZSghem1sZXEoc3osaSkpeworCSAgICAgIC8qIHVzZSBDSEFSIGZvciBwb3NzaWJseSByZW1haW5pbmcgYnl0ZXMgKi8KKwkgICAgICBpZighem1sZXEoem1hZGQoc2l6ZXRhYlt0eXBdLGkpLHN6KSkKKwkJdHlwPUNIQVI7CisJICAgICAgbmV3PW5ld19JQygpOworCSAgICAgIG5ldy0+Y29kZT1wLT5jb2RlOworCSAgICAgIG5ldy0+dHlwZj10eXA7CisJICAgICAgbmV3LT5xMS5mbGFncz1LT05TVDsKKwkgICAgICBpZih0eXA9PUNIQVIpeworCQlpZighZ2V0X2NsaXN0X2J5dGUodCx2LT5jbGlzdCx6bWFkZChpLHAtPnExLnZhbC52bWF4KSwmenVjKSkKKwkJICBpZXJyb3IoMCk7CisJCW5ldy0+cTEudmFsLnZ1Y2hhcj16dWM7CisJICAgICAgfWVsc2V7CisJCWludCBzdGF0ZTsKKwkJZ3ZhbC52bWF4PWdldF9jbGlzdF9pbnQodCx2LT5jbGlzdCx6bWFkZChpLHAtPnExLnZhbC52bWF4KSx6bTJsKHNpemV0YWJbdHlwXSksJnN0YXRlKTsKKwkJaWYoIXN0YXRlKSBpZXJyb3IoMCk7CisJCWV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKKwkJaW5zZXJ0X2NvbnN0KCZuZXctPnExLnZhbCx0eXApOworCSAgICAgIH0KKwkgICAgICBuZXctPnEyLnZhbC52bWF4PXNpemV0YWJbbmV3LT50eXBmXTsKKwkgICAgICBpZihuZXctPmNvZGU9PUFTU0lHTil7CisJCWlmKG5vcHRyKXsKKwkJICBuZXctPno9cC0+ejsKKwkJICBuZXctPnoudmFsLnZtYXg9em1hZGQobmV3LT56LnZhbC52bWF4LGkpOworCQl9ZWxzZXsKKwkJICBuZXctPnouZmxhZ3M9VkFSfERSRUZPQko7CisJCSAgbmV3LT56LnY9cHRyOworCQkgIG5ldy0+ei5kdHlwPXB0ci0+dnR5cC0+ZmxhZ3M7CisJCX0KKwkgICAgICB9ZWxzZQorCQlpZXJyb3IoMCk7IC8qIFRPRE86IFBVU0ggKi8KKwkgICAgICBpbnNlcnRfSUNfZmcoZyxwLT5wcmV2LG5ldyk7CisJICAgICAgaWYoIW5vcHRyKXsKKwkJbmV3PW5ld19JQygpOworCQluZXctPmNvZGU9QURESTJQOworCQluZXctPnExLmZsYWdzPVZBUjsKKwkJbmV3LT5xMS52PXB0cjsKKwkJbmV3LT56PW5ldy0+cTE7CisJCW5ldy0+cTIuZmxhZ3M9S09OU1Q7CisJCW5ldy0+cTIudmFsLnZpbnQ9em0yemkoc2l6ZXRhYlt0eXBdKTsKKwkJbmV3LT50eXBmPUlOVDsKKwkJbmV3LT50eXBmMj1wdHItPnZ0eXAtPmZsYWdzOworCQlpbnNlcnRfSUNfZmcoZyxwLT5wcmV2LG5ldyk7CisJICAgICAgfQkKKwkgICAgICBpPXptYWRkKGksc2l6ZXRhYlt0eXBdKTsKKwkJCisJICAgIH0KKwkgICAgcmVtb3ZlX0lDX2ZnKGcscCk7CisJICAgIHA9bmV3OworCSAgICBjaGFuZ2VkPTE7CisJICB9CisJfQorICAgICAgfQorICAgICAgCisgICAgICBpZihwPT1nLT5lbmQpIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gY2hhbmdlZDsKK30KKworLyogY29tYmluZXMgYXNzaWdubWVudHMgb2YgY29uc3RhbnRzIGludG8gYSBsYXJnZXIgdHlwZSAqLwordm9pZCBjb21iaW5lX2NvbnN0X2Fzc2lnbnModm9pZCkKK3sKKyAgc3RhdGljIGludCBjdHlwZVtCRVNUQ09QWVRdLGksajsKKyAgSUMgKnA9Zmlyc3RfaWM7CisKKyAgLyogY2FsY3VsYXRlIHRhYmxlIG9mIGNvbWJpbmUgdHlwZXMgKi8KKyAgZm9yKGk9Q0hBUjtpPEJFU1RDT1BZVDtpKyspeworICAgIGN0eXBlW2ldPTA7CisgICAgZm9yKGo9QkVTVENPUFlUO2o+Q0hBUjtqLS0peworICAgICAgaWYoem1lcXRvKHNpemV0YWJbal0sem1hZGQoc2l6ZXRhYltpXSxzaXpldGFiW2ldKSkpeworCWlmKERFQlVHJjEwMjQpIHByaW50ZigicG9zc2libGUgY29tYmluZSB0eXBlICVzPT4lc1xuIix0eXBuYW1lW2ldLHR5cG5hbWVbal0pOworCWN0eXBlW2ldPWo7CisJYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHdoaWxlKHApeworICAgIGlmKHAtPmNvZGU9PUFTU0lHTiYmKHAtPnExLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUJiYocC0+ei5mbGFncyYoRFJFRk9CSnxWQVIpKT09VkFSKXsKKyAgICAgIElDICpwMj1wLT5uZXh0OworICAgICAgaWYocDImJnAyLT5jb2RlPT1BU1NJR04mJihwMi0+cTEuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QmJihwMi0+ei5mbGFncyYoRFJFRk9CSnxWQVIpKT09VkFSJiZwLT56LnY9PXAyLT56LnYmJnAtPnR5cGY9PXAyLT50eXBmJiZ6bWVxdG8ocC0+cTIudmFsLnZtYXgscDItPnEyLnZhbC52bWF4KSYmem1lcXRvKHAyLT56LnZhbC52bWF4LHptYWRkKHAtPnoudmFsLnZtYXgsc2l6ZXRhYltwLT50eXBmJk5RXSkpKXsKKwlpbnQgZHQsdD1wLT50eXBmJk5RLHNjPXAtPnoudi0+c3RvcmFnZV9jbGFzczsKKwlpZih0PEJFU1RDT1BZVCYmKGR0PWN0eXBlW3RdKSl7CisJICB6bWF4IG9zOworCSAgLyogZm9yIHN0YWNrIHZhcmlhYmxlcyB3ZSBjYW4gdXNlIHRoZSBhY3R1YWwgb2Zmc2V0LCBmb3Igc3RhdGljcworCSAgICAgd2UgcmVseSBvbiB0aGUgdHlwZSBhbGlnbm1lbnQgKi8KKwkgIGlmKHNjPT1BVVRPfHxzYz09UkVHSVNURVIpCisJICAgIG9zPXptYWRkKHAtPnoudi0+b2Zmc2V0LHAtPnoudmFsLnZtYXgpOworCSAgZWxzZXsKKwkgICAgaWYoem1lcXRvKHptbW9kKGZhbGlnbihwLT56LnYtPnZ0eXApLGFsaWduW2R0XSksWjApKQorCSAgICAgIG9zPXAtPnoudmFsLnZtYXg7CisJICAgIGVsc2UKKwkgICAgICBvcz1aMTsKKwkgIH0KKwkgIGlmKHptZXF0byh6bW1vZChvcyxhbGlnbltkdF0pLFowKSl7CisJICAgIHp1bWF4IHYxLHYyOworCSAgICBpZihERUJVRyYxMDI0KXsKKwkgICAgICBwcmludGYoImNvbWJpbmUgY29uc3QgYXNzaWdubWVudDpcbiIpOworCSAgICAgIHByaWMyKHN0ZG91dCxwKTsKKwkgICAgICBwcmljMihzdGRvdXQscDIpOworCSAgICB9CisJICAgIHAtPnR5cGY9ZHQ7CisJICAgIHAtPnEyLnZhbC52bWF4PXNpemV0YWJbZHRdOworCSAgICBldmFsX2NvbnN0KCZwLT5xMS52YWwsdHxVTlNJR05FRCk7CisJICAgIHYxPXZtYXg7CisJICAgIGV2YWxfY29uc3QoJnAyLT5xMS52YWwsdHxVTlNJR05FRCk7CisJICAgIHYyPXZtYXg7CisJICAgIGlmKEJJR0VORElBTikKKwkgICAgICB2MT16bWxzaGlmdCh2MSx6bW11bHQoc2l6ZXRhYlt0XSxjaGFyX2JpdCkpOworCSAgICBlbHNlCisJICAgICAgdjI9em1sc2hpZnQodjIsem1tdWx0KHNpemV0YWJbdF0sY2hhcl9iaXQpKTsKKwkgICAgZ3ZhbC52bWF4PXptb3IodjEsdjIpOworCSAgICBldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CisJICAgIGluc2VydF9jb25zdCgmcC0+cTEudmFsLGR0KTsKKwkgICAgaWYoREVCVUcmMTAyNCl7cHJpbnRmKCJ0bzpcbiIpOyBwcmljMihzdGRvdXQscCk7fQorCSAgICByZW1vdmVfSUMocDIpOworCSAgICBpZihwLT5wcmV2KSBwPXAtPnByZXY7IC8qIHJldHJ5IGZvciBtb3JlIGNvbWJpbmluZyAqLworCSAgICBjb250aW51ZTsKKwkgIH0KKwl9CisgICAgICB9CisgICAgfQorICAgIHA9cC0+bmV4dDsKKyAgfQorfQorICAgICAgCisKKy8qIGFsbG93ZWQgdG8gY3JlYXRlIG5ldyB2YXJpYWJsZXMgKi8KK2ludCBlYXJseV9wZWVwaG9sZSh2b2lkKQoreworICBJQyAqcDsKKyAgaW50IGNoYW5nZWQsZ2NoYW5nZWQ9MCxjLHQ7CisgIGRveworICAgIGNoYW5nZWQ9MDsKKyAgICBwPWZpcnN0X2ljOworICAgIHdoaWxlKHApeworICAgICAgYz1wLT5jb2RlOworICAgICAgdD1wLT50eXBmOworICAgICBpZihjPT1DT01QQVJFJiYocC0+cTIuZmxhZ3MmS09OU1QpJiZJU0lOVChwLT50eXBmKSl7CisJY2FzZV90YWJsZSAqY3Q7CisJLyogVE9ETzogc3VwcG9ydCBtdWx0aXBsZV9jY3MgKi8KKwlpZighbXVsdGlwbGVfY2NzJiYoY3Q9Y2FsY19jYXNlX3RhYmxlKHAsSlVNUF9UQUJMRV9ERU5TSVRZKSkmJmN0LT5udW0+MSYmY3QtPmRlbnNpdHk9PTEpeworCSAgaW50IGk7CisJICBmb3IoaT0wO2k8Y3QtPm51bTtpKyspeworCSAgICBpZihjdC0+bGFiZWxzW2ldIT1jdC0+bGFiZWxzWzBdKQorCSAgICAgIGJyZWFrOworCSAgfQorCSAgaWYoaT49Y3QtPm51bSl7CisJICAgIElDICpuZXc7CisJICAgIHN0YXRpYyB0eXBlIGl0eXA7CisJICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiY29udmVydGluZyBjYXNlcyB0byByYW5nZS1jaGVja1xuIik7CisJICAgIGlmKG11bHRpcGxlX2NjcykgaWVycm9yKDApOworCSAgICBuZXc9bmV3X0lDKCk7CisJICAgIG5ldy0+Y29kZT1TVUI7CisJICAgIG5ldy0+dHlwZj1jdC0+dHlwZjsKKwkgICAgbmV3LT5xMT1wLT5xMTsKKwkgICAgbmV3LT5xMi5mbGFncz1LT05TVDsKKwkgICAgaWYoY3QtPnR5cGYmVU5TSUdORUQpCisJICAgICAgZXZhbF9jb25zdCgmY3QtPm1pbixVTlNJR05FRHxNQVhJTlQpOworCSAgICBlbHNlCisJICAgICAgZXZhbF9jb25zdCgmY3QtPm1pbixNQVhJTlQpOworCSAgICBpbnNlcnRfY29uc3QoJm5ldy0+cTIudmFsLGN0LT50eXBmKTsKKwkgICAgbmV3LT56LmZsYWdzPVZBUjsKKwkgICAgaXR5cC5mbGFncz1jdC0+dHlwZjsKKwkgICAgbmV3LT56LnY9YWRkX3RtcF92YXIoY2xvbmVfdHlwKCZpdHlwKSk7CisJICAgIG5ldy0+ei52YWwudm1heD1sMnptKDBMKTsKKwkgICAgaW5zZXJ0X0lDKHAtPnByZXYsbmV3KTsKKwkgICAgbmV3PW5ld19JQygpOworCSAgICBuZXctPmNvZGU9Q09NUEFSRTsKKwkgICAgbmV3LT5xMT1wLT5wcmV2LT56OworCSAgICBuZXctPnouZmxhZ3M9MDsKKwkgICAgbmV3LT5xMi5mbGFncz1LT05TVDsKKwkgICAgbmV3LT50eXBmPShjdC0+dHlwZnxVTlNJR05FRCk7CisJICAgIGd2YWwudnVtYXg9Y3QtPmRpZmY7CisJICAgIGV2YWxfY29uc3QoJmd2YWwsVU5TSUdORUR8TUFYSU5UKTsKKwkgICAgaW5zZXJ0X2NvbnN0KCZuZXctPnEyLnZhbCxuZXctPnR5cGYpOworCSAgICBpbnNlcnRfSUMocC0+cHJldixuZXcpOworCSAgICBuZXc9bmV3X0lDKCk7CisJICAgIG5ldy0+Y29kZT1CTEU7CisJICAgIG5ldy0+dHlwZj1jdC0+bGFiZWxzWzBdOworCSAgICBpbnNlcnRfSUMocC0+cHJldixuZXcpOworIAkgICAgd2hpbGUocCE9Y3QtPm5leHRfaWMpeworCSAgICAgIElDICptPXAtPm5leHQ7CisJICAgICAgcmVtb3ZlX0lDKHApOworCSAgICAgIHA9bTsKKwkgICAgfQorCSAgICBjaGFuZ2VkPTE7CisJICAgIGNvbnRpbnVlOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIHA9cC0+bmV4dDsKKyAgICB9CisgICAgZ2NoYW5nZWR8PWNoYW5nZWQ7CisgIH13aGlsZShjaGFuZ2VkKTsKKyAgcmV0dXJuIGdjaGFuZ2VkOworfQorCitpbnQgcGVlcGhvbGUoKQorLyogIG1hY2h0IGFsbGUgbW9lZ2xpY2hlbiBWZXJlaW5mYWNodW5nZW4vVmVyZWluaGVpdGxpY2h1bmdlbiAgICovCit7CisgIElDICpwO29iaiBvO2ludCB0LGMsbnVsbCxlaW5zLGNoYW5nZWQsZG9uZT0wOworICBmdW5jdGlvbl9jYWxscz0wOworICBkb3sKKyAgICBpZihERUJVRyYxMDI0KSBwcmludGYoInNlYXJjaGluZyBmb3IgcGVlcGhvbGUgb3B0aW1pemF0aW9uc1xuIik7CisgICAgY2hhbmdlZD0wO2ljX2NvdW50PTA7CisgICAgcD1maXJzdF9pYzsKKyAgICB3aGlsZShwKXsKKyAgICAgIGM9cC0+Y29kZTsKKyAgICAgIHQ9cC0+dHlwZjsKKyAgICAgIGlmKGM9PU5PUCYmIXAtPnExLmZsYWdzJiYhcC0+cTIuZmxhZ3MmJiFwLT56LmZsYWdzKXsKKwlJQyAqbTsKKwlpZihERUJVRyYxMDI0KSBwcmludGYoInJlbW92aW5nIG5vcFxuIik7CisJbT1wO3A9cC0+bmV4dDsKKwlyZW1vdmVfSUMobSk7CisJY29udGludWU7CisgICAgICB9CisgICAgICBpY19jb3VudCsrOworICAgICAgaWYoYz09TEFCRUwmJnJlcG9ydF9zdXNwaWNpb3VzX2xvb3BzJiZwLT5uZXh0JiZwLT5uZXh0LT5jb2RlPT1CUkEmJnAtPm5leHQtPnR5cGY9PXQpeworCWVycm9yKDIwOCk7cmVwb3J0X3N1c3BpY2lvdXNfbG9vcHM9MDsKKyAgICAgIH0KKyAgICAgIGlmKGM9PUNPTVBBUkUmJihwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisJZXZhbF9jb25zdCgmcC0+cTIudmFsLHQpOworCWlmKElTSU5UKHQpJiZ6bWVxdG8odm1heCxsMnptKDFMKSkmJnp1bWVxdG8odnVtYXgsdWwyenVtKDFVTCkpKXsKKwkgIElDICpwMj1wLT5uZXh0OworCSAgaWYocDItPmNvZGU9PUJHRSl7CisJICAgIHZtYXg9bDJ6bSgwTCk7aW5zZXJ0X2NvbnN0KCZndmFsLE1BWElOVCk7CisJICAgIHAtPnEyLnZhbD1ndmFsO3AyLT5jb2RlPUJHVDtjaGFuZ2VkPTE7CisJICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiY21wICMxIHJlcGxhY2VkIGJ5IGNtcCAjMCgxKVxuIik7CisJICB9ZWxzZSBpZihwMi0+Y29kZT09QkxUKXsKKwkgICAgdm1heD1sMnptKDBMKTtpbnNlcnRfY29uc3QoJmd2YWwsTUFYSU5UKTsKKwkgICAgcC0+cTIudmFsPWd2YWw7cDItPmNvZGU9QkxFO2NoYW5nZWQ9MTsKKwkgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJjbXAgIzEgcmVwbGFjZWQgYnkgY21wICMwKDIpXG4iKTsKKwkgIH0KKwl9ZWxzZSBpZihJU0lOVCh0KSYmISh0JlVOU0lHTkVEKSYmem1lcXRvKHZtYXgsbDJ6bSgtMUwpKSl7CisJICBJQyAqcDI9cC0+bmV4dDsKKwkgIGlmKHAyLT5jb2RlPT1CR1QpeworCSAgICB2bWF4PWwyem0oMEwpO2luc2VydF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworCSAgICBwLT5xMi52YWw9Z3ZhbDtwMi0+Y29kZT1CR0U7Y2hhbmdlZD0xOworCSAgICBpZihERUJVRyYxMDI0KSBwcmludGYoImNtcCAjLTEgcmVwbGFjZWQgYnkgY21wICMwKDEpXG4iKTsKKwkgIH1lbHNlIGlmKHAyLT5jb2RlPT1CTEUpeworCSAgICB2bWF4PWwyem0oMEwpO2luc2VydF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworCSAgICBwLT5xMi52YWw9Z3ZhbDtwMi0+Y29kZT1CTFQ7Y2hhbmdlZD0xOworCSAgICBpZihERUJVRyYxMDI0KSBwcmludGYoImNtcCAjLTEgcmVwbGFjZWQgYnkgY21wICMwXG4oMikiKTsKKwkgIH0KKwl9ZWxzZSBpZigodCZVTlNJR05FRCkmJnptZXF0byh2bWF4LFowKSl7CisJICBJQyAqcDI9cC0+bmV4dDsKKwkgIGlmKHAyLT5jb2RlPT1CTFQpeworCSAgICBpZihERUJVRyYxMDI0KXtwcmludGYoImNtcCB1bnMsIzA7IGJsdCBlbGltaW5hdGVkXG4iKTtwcmljMihzdGRvdXQscCk7fQorCSAgICByZW1vdmVfSUMocCk7CisJICAgIHA9cDItPm5leHQ7CisJICAgIHJlbW92ZV9JQyhwMik7CisJICAgIGNvbnRpbnVlOworCSAgfQorCSAgaWYocDItPmNvZGU9PUJHRSl7CisJICAgIGlmKERFQlVHJjEwMjQpe3ByaW50ZigiY21wIHVucywjMDsgYmdlIHRvIGJyYVxuIik7cHJpYzIoc3Rkb3V0LHApO30KKwkgICAgcmVtb3ZlX0lDKHApOworCSAgICBwMi0+Y29kZT1CUkE7CisJICAgIHA9cDI7CisJICAgIGNvbnRpbnVlOworCSAgfQorCSAgaWYocDItPmNvZGU9PUJMRSl7CisJICAgIGlmKERFQlVHJjEwMjQpe3ByaW50ZigiY21wIHVucywjMDsgYmxlIHRvIGJlcVxuIik7cHJpYzIoc3Rkb3V0LHApO30KKwkgICAgcDItPmNvZGU9QkVROworCSAgfWVsc2UgaWYocDItPmNvZGU9PUJHVCl7CisJICAgIGlmKERFQlVHJjEwMjQpe3ByaW50ZigiY21wIHVucywjMDsgYmd0IHRvIGJuZVxuIik7cHJpYzIoc3Rkb3V0LHApO30KKwkgICAgcDItPmNvZGU9Qk5FOworCSAgfQorCX1lbHNlIGlmKCh0JlVOU0lHTkVEKSYmem1lcXRvKHZtYXgsWjEpKXsKKwkgIElDICpwMj1wLT5uZXh0OworCSAgaWYocDItPmNvZGU9PUJMVCl7CisJICAgIGlmKERFQlVHJjEwMjQpe3ByaW50ZigiY21wIHVucywjMTsgYmx0IHRvIGNtcCAjMDtiZXFcbiIpO3ByaWMyKHN0ZG91dCxwKTt9CisJICAgIGd2YWwudm1heD1aMDsKKwkgICAgZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworCSAgICBpbnNlcnRfY29uc3QoJnAtPnEyLnZhbCxwLT50eXBmKTsKKwkgICAgcDItPmNvZGU9QkVROworCSAgfWVsc2UgaWYocDItPmNvZGU9PUJHRSl7CisJICAgIGlmKERFQlVHJjEwMjQpe3ByaW50ZigiY21wIHVucywjMTsgYmdlIHRvIGNtcCAjMDtibmVcbiIpO3ByaWMyKHN0ZG91dCxwKTt9CisJICAgIGd2YWwudm1heD1aMDsKKwkgICAgZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworCSAgICBpbnNlcnRfY29uc3QoJnAtPnEyLnZhbCxwLT50eXBmKTsKKwkgICAgcDItPmNvZGU9Qk5FOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGlmKGM+PUJFUSYmYzxCUkEmJnAtPm5leHQmJnAtPm5leHQtPmNvZGU9PUJSQSYmcC0+dHlwZj09cC0+bmV4dC0+dHlwZil7CisJSUMgKnAyLCptOworCWlmKERFQlVHJjEwMjQpeworCSAgcHJpbnRmKCJyZW1vdmluZyBiY2MgZm9sbG93ZWQgYnkgYnJhXG4iKTsKKwkgIHByaWMyKHN0ZG91dCxwKTsKKwl9CisJbT1wLT5uZXh0OworCXAyPXAtPnByZXY7CisJcmVtb3ZlX0lDKHApOworCWlmKHAyJiYocDItPmNvZGU9PVRFU1R8fHAyLT5jb2RlPT1DT01QQVJFKSYmcDItPnouZmxhZ3M9PTApeworCSAgaWYoREVCVUcmMTAyNCl7CisJICAgIHByaW50ZigicmVtb3ZpbmcgY29tcGFyaXNvbjpcbiIpOworCSAgICBwcmljMihzdGRvdXQscDIpOworCSAgfQorCSAgcmVtb3ZlX0lDKHAyKTsKKwl9CisJcD1tOworCWNoYW5nZWQ9MTsKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKGM9PUNBTEwpIGZ1bmN0aW9uX2NhbGxzKys7CisgICAgICBpZihwLT5jb2RlPT1DT01QQVJFJiYocC0+cTEuZmxhZ3MmKFZBUnxWQVJBRFIpKT09KFZBUnxWQVJBRFIpJiYocC0+cTIuZmxhZ3MmKFZBUnxWQVJBRFIpKT09KFZBUnxWQVJBRFIpJiZwLT5xMS52PT1wLT5xMi52KXsKKwlJQyAqb2xkPXAtPnByZXY7CisJaWYoZm9sZChwKSl7IGNoYW5nZWQ9MTsgcD1vbGQ7Y29udGludWU7fQorCXA9cC0+bmV4dDtjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKChwLT5xMS5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisJaWYoKChwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl8fCFwLT5xMi5mbGFncyl7CisJICBJQyAqb2xkPXAtPnByZXY7CisJICBpZihmb2xkKHApKXsgY2hhbmdlZD0xOyBwPW9sZDtjb250aW51ZTt9CisJICBwPXAtPm5leHQ7Y29udGludWU7CisJfWVsc2V7CisJICBpZihjPT1BRER8fGM9PU1VTFR8fChjPj1PUiYmYzw9QU5EKXx8KGM9PUNPTVBBUkUmJiEocC0+ei5mbGFncykmJnAtPm5leHQmJnAtPm5leHQtPmNvZGU+PUJFUSYmcC0+bmV4dC0+Y29kZTxCUkEpKXsgLyogIGNvbnN0IG5hY2ggcmVjaHRzICAgKi8KKwkgICAgaWYoREVCVUcmMTAyNCl7IHByaW50Zigic3dhcHBlZCBjb21tdXRhdGl2ZSBvcDpcbiIpO3ByaWMyKHN0ZG91dCxwKTt9CisJICAgIG89cC0+cTE7cC0+cTE9cC0+cTI7cC0+cTI9bzsKKwkgICAgaWYoYz09Q09NUEFSRSl7CisJICAgICAgSUMgKmJyPXAtPm5leHQ7CisJICAgICAgaWYoYnItPmNvZGU9PUJMVCkgYnItPmNvZGU9QkdUOworCSAgICAgIGVsc2UgaWYoYnItPmNvZGU9PUJMRSkgYnItPmNvZGU9QkdFOworCSAgICAgIGVsc2UgaWYoYnItPmNvZGU9PUJHVCkgYnItPmNvZGU9QkxUOworCSAgICAgIGVsc2UgaWYoYnItPmNvZGU9PUJHRSkgYnItPmNvZGU9QkxFOworCSAgICB9CisJICB9CisJfQorICAgICAgfQorICAgICAgaWYoKHAtPnEyLmZsYWdzJihLT05TVHxEUkVGT0JKKSk9PUtPTlNUKXsKKwkvKiAgYWxnZWJyYWlzY2hlIE9wdGltaWVydW5nZW4gICovCisJZXZhbF9jb25zdCgmcC0+cTIudmFsLHEydHlwKHApKTsKKwlpZih6bWVxdG8odm1heCxsMnptKDBMKSkmJnp1bWVxdG8odnVtYXgsdWwyenVtKDBVTCkpJiZ6bGRlcXRvKHZsZG91YmxlLGQyemxkKDAuMCkpKSBudWxsPTE7IGVsc2UgbnVsbD0wOworCWlmKHptZXF0byh2bWF4LGwyem0oMUwpKSYmenVtZXF0byh2dW1heCx1bDJ6dW0oMVVMKSkmJnpsZGVxdG8odmxkb3VibGUsZDJ6bGQoMS4wKSkpIGVpbnM9MTsgZWxzZSBlaW5zPTA7CisJaWYoem1lcXRvKHZtYXgsbDJ6bSgtMUwpKSYmemxkZXF0byh2bGRvdWJsZSxkMnpsZCgtMS4wKSkpIGVpbnM9LTE7CisJaWYoZWluczwwJiYoYz09TVVMVHx8Yz09RElWKSl7CisJICBpZihERUJVRyYxMDI0KXsgcHJpbnRmKCJNVUxUL0RJViB3aXRoICgtMSkgY29udmVydGVkIHRvIE1JTlVTOlxuIik7cHJpYzIoc3Rkb3V0LHApO30KKwkgIHAtPmNvZGU9Yz1NSU5VUztwLT5xMi5mbGFncz0wOworCSAgY2hhbmdlZD0xOworCX0KKyNpZiBIQVZFX1BPRjJPUFQKKwlpZigoKGM9PU1VTFQpfHwoKGM9PURJVnx8Yz09TU9EKSYmKHQmVU5TSUdORUQpKSkmJklTSU5UKHQpKXsKKwkgIC8qICBlcnNldHp0IG11bCBldGMuIG1pdCBad2VpZXJwb3RlbnplbiAgICAgKi8KKwkgIGxvbmcgbG47CisJICBpZih6bWxlcShsMnptKDBMKSx2bWF4KSYmenVtbGVxKHVsMnp1bSgwVUwpLHZ1bWF4KSl7CisJICAgIGlmKGxuPWdldF9wb2YyKHZ1bWF4KSl7CisJICAgICAgaWYoYz09TU9EKXsKKwkJdm1heD16bXN1Yih2bWF4LGwyem0oMUwpKTsKKwkJcC0+Y29kZT1jPUFORDsKKwkgICAgICB9ZWxzZXsKKwkJaWYoYz09RElWKSBwLT5jb2RlPVJTSElGVDsgZWxzZSBwLT5jb2RlPUxTSElGVDsKKwkJdm1heD1sMnptKGxuLTEpOworCSAgICAgIH0KKwkgICAgICBndmFsLnZtYXg9dm1heDsKKwkgICAgICBldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CisJICAgICAgaW5zZXJ0X2NvbnN0KCZwLT5xMi52YWwsdCk7CisJICAgICAgcC0+dHlwZjI9cC0+dHlwZjsKKwkgICAgICBjaGFuZ2VkPTE7CisJICAgIH0KKwkgIH0KKwl9CisjZW5kaWYKKwlpZihjPT1MU0hJRlR8fGM9PVJTSElGVCl7CisJICB6bWF4IHNpemU7CisJICBzaXplPXptbXVsdChzaXpldGFiW3ExdHlwKHApJk5RXSxjaGFyX2JpdCk7CisJICBpZih6bWxlcShzaXplLHZtYXgpKXsKKwkgICAgaWYoYz09TFNISUZUfHwocTF0eXAocCkmVU5TSUdORUQpKXsKKwkgICAgICBpZihERUJVRyYxMDI0KXsgcHJpbnRmKCJsc2hpZnQgY29udmVydGVkIHRvIEFTU0lHTiAwOlxuIik7cHJpYzIoc3Rkb3V0LHApO30KKwkgICAgICBvLnZhbC52bWF4PWwyem0oMEwpO2V2YWxfY29uc3QoJm8udmFsLE1BWElOVCk7CisJICAgICAgaW5zZXJ0X2NvbnN0KCZwLT5xMS52YWwsdCk7cC0+cTEuZmxhZ3M9S09OU1Q7CisJICAgICAgcC0+Y29kZT1jPUFTU0lHTjtwLT5xMi5mbGFncz0wO3AtPnEyLnZhbC52bWF4PXNpemV0YWJbdCZOUV07CisJICAgICAgY2hhbmdlZD0xOworCSAgICB9ZWxzZXsKKwkgICAgICBpZihERUJVRyYxMDI0KXsgcHJpbnRmKCJyc2hpZnQgY2hhbmdlZCB0byBtYXhsZW5ndGg6XG4iKTtwcmljMihzdGRvdXQscCk7fQorCSAgICAgIG8udmFsLnZtYXg9em1zdWIoc2l6ZSxsMnptKDFMKSk7ZXZhbF9jb25zdCgmby52YWwsTUFYSU5UKTsKKwkgICAgICBpbnNlcnRfY29uc3QoJnAtPnEyLnZhbCx0KTsKKwkgICAgICBjaGFuZ2VkPTE7CSAgICAgIAorCSAgICB9CisJICB9CisJfQorCisJaWYoKGM9PVNVQnx8Yz09QUREfHxjPT1BRERJMlB8fGM9PVNVQklGUCkmJiEocTJ0eXAocCkmVU5TSUdORUQpJiZ6bWxlcSh2bWF4LGwyem0oMEwpKSYmemxkbGVxKHZsZG91YmxlLGQyemxkKDAuMCkpKXsKKwkgIG9iaiBvO2ludCBjdD1xMnR5cChwKTsKKwkgIG89cC0+cTI7CisJICBjYWxjKE1JTlVTLGN0LCZvLnZhbCwwLCZvLnZhbCwwKTsKKwkgIGV2YWxfY29uc3QoJm8udmFsLGN0KTsKKwkgIGlmKCF6bWxlcSh2bWF4LGwyem0oMEwpKSYmIXpsZGxlcSh2bGRvdWJsZSxkMnpsZCgwLjApKSl7CisJICAgIGNhbGMoTUlOVVMsY3QsJm8udmFsLDAsJm8udmFsLDApOworCSAgICBpZighY29tcGFyZV9vYmpzKCZwLT5xMiwmbyxjdCkpeworCSAgICAgIGlmKERFQlVHJjEwMjQpeyBwcmludGYoIlNVQiBjb252ZXJ0ZWQgdG8gQUREOlxuIik7cHJpYzIoc3Rkb3V0LHApO30KKwkgICAgICBjYWxjKE1JTlVTLGN0LCZwLT5xMi52YWwsMCwmcC0+cTIudmFsLDApOworCSAgICAgIGlmKHAtPmNvZGU9PUFERCkgcC0+Y29kZT1TVUI7CisJICAgICAgZWxzZSBpZihwLT5jb2RlPT1TVUIpIHAtPmNvZGU9QUREOworCSAgICAgIGVsc2UgaWYocC0+Y29kZT09QURESTJQKSBwLT5jb2RlPVNVQklGUDsKKwkgICAgICBlbHNlIGlmKHAtPmNvZGU9PVNVQklGUCkgcC0+Y29kZT1BRERJMlA7CisJICAgICAgYz1wLT5jb2RlOworCSAgICAgIGNoYW5nZWQ9MTsKKwkgICAgfQorCSAgfQorCX0KKwlpZigoZWlucz4wJiYoYz09TVVMVHx8Yz09RElWKSl8fChudWxsJiYoYz09QUREfHxjPT1TVUJ8fGM9PUFEREkyUHx8Yz09U1VCSUZQfHxjPT1MU0hJRlR8fGM9PVJTSElGVHx8Yz09T1J8fGM9PVhPUikpKXsKKwkgIGlmKERFQlVHJjEwMjQpeyBwcmludGYoIm9wZXJhdGlvbiBjb252ZXJ0ZWQgdG8gc2ltcGxlIGFzc2lnbm1lbnQ6XG4iKTtwcmljMihzdGRvdXQscCk7fQorCSAgaWYoYz09QURESTJQfHxjPT1TVUJJRlApIHAtPnR5cGY9dD1wLT50eXBmMjsKKwkgIHAtPmNvZGU9Yz1BU1NJR047cC0+cTIuZmxhZ3M9MDtwLT5xMi52YWwudm1heD1zaXpldGFiW3QmTlFdOworCSAgY2hhbmdlZD0xOworCX0KKwlpZihudWxsJiYoYz09TVVMVHx8Yz09RElWfHxjPT1NT0R8fGM9PUFORCkpeworCSAgaWYoYz09RElWfHxjPT1NT0QpeyBlcnJfaWM9cDtlcnJvcigyMTApO2Vycl9pYz0wO30KKwkgIGlmKERFQlVHJjEwMjQpeyBwcmludGYoIm9wZXJhdGlvbiBjb252ZXJ0ZWQgdG8gQVNTSUdOIDA6XG4iKTtwcmljMihzdGRvdXQscCk7fQorCSAgby52YWwudm1heD1sMnptKDBMKTtldmFsX2NvbnN0KCZvLnZhbCxNQVhJTlQpOworCSAgaW5zZXJ0X2NvbnN0KCZwLT5xMS52YWwsdCk7cC0+cTEuZmxhZ3M9S09OU1Q7CisJICBwLT5jb2RlPWM9QVNTSUdOO3AtPnEyLmZsYWdzPTA7cC0+cTIudmFsLnZtYXg9c2l6ZXRhYlt0Jk5RXTsKKwkgIGNoYW5nZWQ9MTsKKwl9CisJaWYoKElTSU5UKHQpfHxmcF9hc3NvYykmJihjPT1BRER8fGM9PVNVQnx8Yz09QURESTJQfHxjPT1TVUJJRlB8fGM9PU1VTFR8fGM9PUxTSElGVHx8Yz09UlNISUZUfHxjPT1PUnx8Yz09QU5EKSl7CisJICAvKiAgYXNzb3ppYXRpdmUgT3BlcmF0b3JlbiAgKi8KKwkgIElDICpuPXAtPm5leHQ7CisJICBpbnQgbmMsdHAsdG47CisJICB0cD1xMnR5cChwKTsKKwkgIGlmKG4peworCSAgICBuYz1uLT5jb2RlOworCSAgICB0bj1xMnR5cChuKTsKKwkgICAgaWYoYz09QUREJiZuYz09U1VCKSBuYz1BREQ7CisJICAgIGlmKGM9PUFEREkyUCYmbmM9PVNVQklGUCkgbmM9QURESTJQOworCSAgICBpZihjPT1TVUImJm5jPT1BREQpIG5jPVNVQjsKKwkgICAgaWYoYz09U1VCSUZQJiZuYz09QURESTJQKSBuYz1TVUJJRlA7CisJICB9CisJICBpZihuJiZuYz09YyYmKG4tPnEyLmZsYWdzJktPTlNUKSYmdG49PXRwJiYoISh0biZWT0xBVElMRSkpJiYocC0+ei5mbGFncyZWQVIpJiZuLT5xMS5mbGFncz09cC0+ei5mbGFncyYmbi0+cTEudj09cC0+ei52JiZ6bWVxdG8obi0+cTEudmFsLnZtYXgscC0+ei52YWwudm1heCkmJiFpc192b2xhdGlsZV9vYmooJm4tPnExKSYmIWlzX3ZvbGF0aWxlX29iaigmcC0+eikpeworCSAgICBpZihwLT5xMS5mbGFncz09cC0+ei5mbGFncyYmcC0+cTEudj09cC0+ei52JiZ6bWVxdG8ocC0+cTEudmFsLnZtYXgscC0+ei52YWwudm1heCkmJiFpc192b2xhdGlsZV9vYmooJnAtPnExKSl7CisJICAgICAgaWYobi0+cTEuZmxhZ3M9PW4tPnouZmxhZ3MmJm4tPnExLnY9PW4tPnoudiYmem1lcXRvKG4tPnExLnZhbC52bWF4LG4tPnoudmFsLnZtYXgpKXsKKwkJaWYoREVCVUcmMTAyNCl7IHByaW50ZigidXNpbmcgYXNzb2NpYXRpdml0eSgxKSB3aXRoOlxuIik7cHJpYzIoc3Rkb3V0LHApO3ByaWMyKHN0ZG91dCxwLT5uZXh0KTt9CisJCW4tPnExPXAtPnExOworCQlpZihuYyE9bi0+Y29kZSl7CisJCSAgZ3ZhbC52bWF4PWwyem0oMEwpOworCQkgIGV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKKwkJICBpbnNlcnRfY29uc3QoJmd2YWwsdCk7CisJCSAgY2FsYyhTVUIsdG4sJmd2YWwsJm4tPnEyLnZhbCwmbi0+cTIudmFsLDApOworCQkgIG4tPmNvZGU9bmM7CisJCX0KKwkJaWYoYz09TFNISUZUfHxjPT1SU0hJRlR8fGM9PUFEREkyUHx8Yz09U1VCfHxjPT1TVUJJRlApCisJCSAgY2FsYyhBREQsdHAsJnAtPnEyLnZhbCwmbi0+cTIudmFsLCZuLT5xMi52YWwsMCk7CisJCWVsc2UKKwkJICBjYWxjKGMsdHAsJnAtPnEyLnZhbCwmbi0+cTIudmFsLCZuLT5xMi52YWwsMCk7CisJCWNoYW5nZWQ9MTsKKwkJaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJtdXN0IHJlbW92ZSBmaXJzdCBvcGVyYXRpb25cbiIpOworCQluPXA7cD1wLT5uZXh0OworCQlpZihoYXZlX2FsaWFzKXsgZnJlZShuLT51c2VfbGlzdCk7IGZyZWUobi0+Y2hhbmdlX2xpc3QpOyB9CisJCXJlbW92ZV9JQyhuKTsKKwkJY29udGludWU7CisJICAgICAgfQorCSAgICB9ZWxzZXsKKwkgICAgICBpZihERUJVRyYxMDI0KXsgcHJpbnRmKCJ1c2luZyBhc3NvY2lhdGl2aXR5KDIpIHdpdGg6XG4iKTtwcmljMihzdGRvdXQscCk7cHJpYzIoc3Rkb3V0LHAtPm5leHQpO30KKwkgICAgICBuLT5xMT1wLT5xMTsKKwkgICAgICBpZihuYyE9bi0+Y29kZSl7CisJCWd2YWwudm1heD1sMnptKDBMKTsKKwkJZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworCQlpbnNlcnRfY29uc3QoJmd2YWwsdCk7CisJCWNhbGMoU1VCLHRuLCZndmFsLCZuLT5xMi52YWwsJm4tPnEyLnZhbCwwKTsKKwkJbi0+Y29kZT1uYzsKKwkgICAgICB9CisJICAgICAgaWYoYz09TFNISUZUfHxjPT1SU0hJRlR8fGM9PUFEREkyUHx8Yz09U1VCfHxjPT1TVUJJRlApCisJCWNhbGMoQURELHRwLCZwLT5xMi52YWwsJm4tPnEyLnZhbCwmbi0+cTIudmFsLDApOworCSAgICAgIGVsc2UKKwkJY2FsYyhjLHRwLCZwLT5xMi52YWwsJm4tPnEyLnZhbCwmbi0+cTIudmFsLDApOworCSAgICAgIGNoYW5nZWQ9MTsKKwkgICAgfQorCSAgfQorCX0KKwlpZigoYz09QURESTJQfHxjPT1TVUJJRlApJiYocC0+cTEuZmxhZ3MmVkFSQURSKSl7CisJICAvKiAgYWRkICN2YXIsI2NvbnN0IC0+IG1vdmUgI3Zhcitjb25zdCAgICAgICovCisJICB1bmlvbiBhdHlwcyB2YWw7CisJICBpZihERUJVRyYxMDI0KXtwcmludGYoImFkZC9zdWIgI3ZhciwjY29uc3QgY2hhbmdlZCB0byBhc3NpZ246XG4iKTtwcmljMihzdGRvdXQscCk7fQorCSAgZXZhbF9jb25zdCgmcC0+cTIudmFsLHQpOworCSAgaW5zZXJ0X2NvbnN0KCZ2YWwsTUFYSU5UKTsKKwkgIGlmKGM9PUFEREkyUCkKKwkgICAgY2FsYyhBREQsTUFYSU5ULCZwLT5xMS52YWwsJnZhbCwmcC0+cTEudmFsLDApOworCSAgZWxzZQorCSAgICBjYWxjKFNVQixNQVhJTlQsJnAtPnExLnZhbCwmdmFsLCZwLT5xMS52YWwsMCk7CisJICBwLT5jb2RlPWM9QVNTSUdOOworCSAgcC0+cTIuZmxhZ3M9MDsKKwkgIHAtPnR5cGY9dD1wLT50eXBmMjsKKwkgIHAtPnEyLnZhbC52bWF4PXNpemV0YWJbdCZOUV07CisJICBjaGFuZ2VkPTE7CisJfQorCWlmKChjPT1BRER8fGM9PVNVQikmJklTSU5UKHQpJiZwLT5uZXh0JiZwLT5uZXh0LT5uZXh0KXsKKwkgIC8qRklYTUU6IHVzaW5nIFNDUkFUQ0ggaXMgbm90IG5pY2UgKi8KKwkgIElDICpwMT1wLT5uZXh0LCpwMj1wMS0+bmV4dDsKKwkgIGlmKHAxLT5jb2RlPT1NVUxUJiZwMi0+Y29kZT09QURESTJQJiYKKwkgICAgIHAxLT50eXBmPT10JiZwMi0+dHlwZj09dCYmCisJICAgICAocDEtPnEyLmZsYWdzJktPTlNUKSYmKHAtPnouZmxhZ3MmKFNDUkFUQ0h8RFJFRk9CSikpPT1TQ1JBVENIJiYocDEtPnouZmxhZ3MmKFNDUkFUQ0h8RFJFRk9CSikpPT1TQ1JBVENIJiYKKwkgICAgICFjb21wYXJlX29ianMoJnAtPnosJnAxLT5xMSx0KSYmCisJICAgICAhY29tcGFyZV9vYmpzKCZwMS0+eiwmcDItPnEyLHQpKXsKKworCSAgICBpZihERUJVRyYxMDI0KXsgcHJpbnRmKCJyZWFycmFuZ2luZyBhcnJheS1hY2Nlc3MoMSk6XG4iKTtwcmljMihzdGRvdXQscCk7cHJpYzIoc3Rkb3V0LHAxKTtwcmljMihzdGRvdXQscDIpO30KKwkgICAgcDEtPnExPXAtPnExOworCSAgICBwLT5xMT1wMi0+cTE7CisJICAgIHAyLT5xMT1wMi0+ejsKKwkgICAgcC0+ej1wMi0+ejsKKwkgICAgY2FsYyhNVUxULHQsJnAtPnEyLnZhbCwmcDEtPnEyLnZhbCwmcC0+cTIudmFsLDApOworCSAgICBpZihjPT1BREQpIHAtPmNvZGU9QURESTJQOyBlbHNlIHAtPmNvZGU9U1VCSUZQOworCSAgICBwLT50eXBmMj1wMi0+dHlwZjI7CisJICAgIGlmKCEocC0+cTEuZmxhZ3MmVkFSQURSKSl7CisJICAgICAgLyogZm9yIHN0YXRpYyBhZGRyZXNzZXMgaXQgaXMgYmVzdCB0byBhZGQgdGhlIGNvbnN0YW50CisJCSBwYXJ0IG9mIHRoZSBvZmZzZXQgZmlyc3QgKGNhbiBiZSBmb2xkZWQpOyBmb3Igb3RoZXJzCisJCSB0aGUgY29uc3RhbnQgcGFydCBtaWdodCBiZXR0ZXIgYmUgdGhlIGxhc3QsIGFzIGl0IGNhbgorCQkgZnJlcXVlbnRseiBiZSByZWR1Y2VkIGJ6IGFkZHJlc3NpbmctbW9kZXMgKi8KKwkgICAgICBpZihERUJVRyYxMDI0KSBwcmludGYoInJldmVyc2luZ1xuIik7CisJICAgICAgcDItPnExPXAtPnExOworCSAgICAgIHAtPnExPXAtPno7CisJICAgICAgaWYocC0+cHJldikgcC0+cHJldi0+bmV4dD1wMTsKKwkgICAgICBwMS0+cHJldj1wLT5wcmV2OworCSAgICAgIGlmKHA9PWZpcnN0X2ljKSBmaXJzdF9pYz1wMTsKKwkgICAgICBwLT5uZXh0PXAyLT5uZXh0OworCSAgICAgIGlmKHAtPm5leHQpIHAtPm5leHQtPnByZXY9cDsKKwkgICAgICBwLT5wcmV2PXAyOworCSAgICAgIHAyLT5uZXh0PXA7CisJICAgICAgcD1wMTsKKwkgICAgfQorCSAgICBjaGFuZ2VkPTE7Y29udGludWU7CisJICB9CisJfQorICAgICAgfQorICAgICAgaWYocC0+cTEuZmxhZ3MmS09OU1QpeworCS8qICBhbGdlYnJhaXNjaGUgT3B0aW1pZXJ1bmdlbiAgKi8KKwlldmFsX2NvbnN0KCZwLT5xMS52YWwsdCk7CisJaWYoem1lcXRvKHZtYXgsbDJ6bSgwTCkpJiZ6dW1lcXRvKHZ1bWF4LHVsMnp1bSgwVUwpKSYmemxkZXF0byh2bGRvdWJsZSxkMnpsZCgwLjApKSkgbnVsbD0xOyBlbHNlIG51bGw9MDsKKwlpZihudWxsJiYoYz09RElWfHxjPT1NT0R8fGM9PUxTSElGVHx8Yz09UlNISUZUKSl7CisJICBpZihERUJVRyYxMDI0KXsgcHJpbnRmKCJvcGVyYXRpb24gY29udmVydGVkIHRvIEFTU0lHTiAwOlxuIik7cHJpYzIoc3Rkb3V0LHApO30KKwkgIG8udmFsLnZtYXg9bDJ6bSgwTCk7ZXZhbF9jb25zdCgmby52YWwsTUFYSU5UKTsKKwkgIGluc2VydF9jb25zdCgmcC0+cTEudmFsLHQpO3AtPnExLmZsYWdzPUtPTlNUOworCSAgcC0+Y29kZT1jPUFTU0lHTjtwLT5xMi5mbGFncz0wO3AtPnEyLnZhbC52bWF4PXNpemV0YWJbdCZOUV07CisJICBjaGFuZ2VkPTE7CisJfQorICAgICAgfQorICAgICAgaWYoIVVTRVEyQVNaJiZwLT56LmZsYWdzJiYhY29tcGFyZV9vYmpzKCZwLT5xMiwmcC0+eixwLT50eXBmKSl7CisJaWYoYz09QUREfHxjPT1NVUxUfHwoYz49T1ImJmM8PUFORCkpeworCSAgb2JqIG87CisJICBpZihERUJVRyYxMDI0KXtwcmludGYoInN3YXBwaW5nIG9ianMgYmVjYXVzZSBVU0VRMkFTWlxuIik7cHJpYzIoc3Rkb3V0LHApO30KKwkgIG89cC0+cTI7cC0+cTI9cC0+cTE7cC0+cTE9bzsKKwkgIC8qICBrZWluIGNoYW5nZWQgaGllciEgICovCisJfWVsc2V7cHJpYzIoc3Rkb3V0LHApOyBpZXJyb3IoMCk7fQorICAgICAgfQorICAgICAgaWYoKGM9PUFERHx8Yz09U1VCKSYmcC0+bmV4dCl7CisJLypGSVhNRTogdXNpbmcgU0NSQVRDSCBpcyBub3QgbmljZSAqLworCUlDICpwMT1wLT5uZXh0OworCWlmKHAxLT5jb2RlPT1BRERJMlAmJnAxLT50eXBmPT10JiYocC0+ei5mbGFncyYoU0NSQVRDSHxEUkVGT0JKKSk9PVNDUkFUQ0gmJiFjb21wYXJlX29ianMoJnAtPnosJnAxLT5xMix0KSYmem1sZXEoc2l6ZXRhYltwMS0+dHlwZjImTlFdLHNpemV0YWJbcDEtPnR5cGYmTlFdKSl7CisJICBpZihERUJVRyYxMDI0KXsgcHJpbnRmKCJyZWFycmFuZ2luZyBhcnJheS1hY2Nlc3MoMik6XG4iKTtwcmljMihzdGRvdXQscCk7cHJpYzIoc3Rkb3V0LHAxKTt9CisJICBwMS0+cTI9cC0+cTE7CisJICBwLT5xMT1wMS0+cTE7CisJICBwLT56PXAxLT56OworCSAgcDEtPnExPXAxLT56OworCSAgaWYoYz09QUREKSBwLT5jb2RlPWM9QURESTJQOyBlbHNlIHAtPmNvZGU9Yz1TVUJJRlA7CisJICBwLT50eXBmMj1wMS0+dHlwZjI7CisJICBjaGFuZ2VkPTE7Y29udGludWU7CisJfQorICAgICAgfQorICAgICAgaWYoKGM9PVNVQnx8Yz09RElWfHxjPT1NT0QpJiYhY29tcGFyZV9vYmpzKCZwLT5xMSwmcC0+cTIscC0+dHlwZikpeworCS8qICB4LXg9MCwgeC94PTEsIHgleD0wICovCisJaWYoREVCVUcmMTAyNCl7IHByaW50ZigiaS1pLCBpL2ksIGklJWkgY29udmVydGVkIHRvIEFTU0lHTiAwLzE6XG4iKTtwcmljMihzdGRvdXQscCk7fQorCWlmKGM9PURJVikgby52YWwudm1heD1sMnptKDFMKTsgZWxzZSBvLnZhbC52bWF4PWwyem0oMEwpOworCWV2YWxfY29uc3QoJm8udmFsLE1BWElOVCk7aW5zZXJ0X2NvbnN0KCZwLT5xMS52YWwsdCk7cC0+cTEuZmxhZ3M9S09OU1Q7CisJcC0+Y29kZT1jPUFTU0lHTjtwLT5xMi5mbGFncz0wO3AtPnEyLnZhbC52bWF4PXNpemV0YWJbdCZOUV07CisJY2hhbmdlZD0xOworICAgICAgfQorICAgICAgaWYoYz09QVNTSUdOJiYocC0+ei5mbGFncyZWQVIpJiZwLT56LmZsYWdzPT1wLT5xMS5mbGFncyYmcC0+ei52PT1wLT5xMS52JiZ6bWVxdG8ocC0+ei52YWwudm1heCxwLT5xMS52YWwudm1heCkpeworCUlDICpkOworCWlmKERFQlVHJjEwMjQpeyBwcmludGYoInJlbW92aW5nIHJlZHVuZGFudCBtb3ZlOlxuIik7cHJpYzIoc3Rkb3V0LHApO30KKwljaGFuZ2VkPTE7CisJZD1wOyBwPXAtPm5leHQ7CisJaWYoaGF2ZV9hbGlhcyl7IGZyZWUoZC0+dXNlX2xpc3QpOyBmcmVlKGQtPmNoYW5nZV9saXN0KTt9CisJcmVtb3ZlX0lDKGQpOyBjb250aW51ZTsKKyAgICAgIH0KKyNpZiAxCisgICAgICAvKiBUT0RPOiBiZXR0ZXIgZGVjaXNpb24gd2hlbiB0byB1c2UgZm9yIHdoaWNoIHRhcmdldHM/ICovCisgICAgICBpZihjPT1DT05WRVJUJiYocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmKHAtPnouZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmIWlzX3ZvbGF0aWxlX2ljKHApKXsKKwlJQyAqcDE9cC0+bmV4dDsKKwlpZihwMSYmcDEtPmNvZGU9PUNPTlZFUlQmJihwLT50eXBmMiZOUSk9PShwMS0+dHlwZiZOUSkmJihwLT50eXBmJk5RKT09KHAxLT50eXBmMiZOUSkmJnptbGVxKHNpemV0YWJbcC0+dHlwZjImTlFdLHNpemV0YWJbcC0+dHlwZiZOUV0pJiYhY29tcGFyZV9vYmpzKCZwLT56LCZwMS0+cTEscC0+dHlwZjIpJiYhaXNfdm9sYXRpbGVfaWMocDEpJiZJU0ZMT0FUKHAtPnR5cGYpPT1JU0ZMT0FUKHAtPnR5cGYyKSl7CisJICBpZihERUJVRyYxMDI0KXtwcmludGYoInByb3BhZ2F0aW5nIENPTlZFUlRTOlxuIik7cHJpYzIoc3Rkb3V0LHApO3ByaWMyKHN0ZG91dCxwMSk7fQorCSAgcDEtPnExPXAtPnExOworCSAgcDEtPmNvZGU9QVNTSUdOOworCSAgcDEtPnEyLnZhbC52bWF4PXNpemV0YWJbcDEtPnR5cGYmTlFdOworCSAgY29udGludWU7CisJfQorCS8qIFRPRE86IGJldHRlciBkZWNpc2lvbiB3aGVuIHRvIHVzZSBmb3Igd2hpY2ggdGFyZ2V0cz8gKi8KKwlpZihwMSYmKHAxLT5jb2RlPT1BRERJMlB8fHAxLT5jb2RlPT1TVUJJRlApJiYocDEtPnR5cGYmTlUpPT0ocC0+dHlwZiZOVSkmJiFjb21wYXJlX29ianMoJnAtPnosJnAxLT5xMixwMS0+dHlwZikmJiFpc192b2xhdGlsZV9pYyhwMSkmJihwLT50eXBmMiZOUSk+PU1JTkFEREkyUCYmKHAtPnR5cGYyJk5RKTw9TUFYQURESTJQJiZ6bWxlcShzaXpldGFiW3AtPnR5cGYyJk5RXSxzaXpldGFiW3AtPnR5cGYmTlFdKSl7CisJICBpZigocC0+dHlwZjImVU5TSUdORUQpJiYocC0+dHlwZjImTlUpPj1NSU5BRERVSTJQKXsKKwkgICAgaWYoREVCVUcmMTAyNCl7cHJpbnRmKCJwcm9wYWdhdGluZyBDT05WRVJUL0FEREkyUDpcbiIpO3ByaWMyKHN0ZG91dCxwKTtwcmljMihzdGRvdXQscDEpO30KKwkgICAgcDEtPnEyPXAtPnExOworCSAgICBwMS0+dHlwZj1wLT50eXBmMjsKKwkgICAgY29udGludWU7CisJICB9CisJfQorICAgICAgfQorI2VuZGlmCisgICAgICBpZihjPj1CRVEmJmM8PUJHVCl7CisJSUMgKnAyPXAtPnByZXY7CisJaWYocDImJnAyLT5jb2RlPT1DT01QQVJFJiYhY29tcGFyZV9vYmpzKCZwLT5xMSwmcDItPnosMCkpeworCSAgSUMgKnAzPXAyLT5wcmV2OworCSAgaWYocDMmJnAzLT5jb2RlPT1jKXsKKwkgICAgSUMgKnA0PXAzLT5wcmV2OworCSAgICBpZihwNC0+Y29kZT09Q09NUEFSRSYmIWNvbXBhcmVfb2JqcygmcDMtPnExLCZwNC0+eiwwKQorCSAgICAgICAmJiFjb21wYXJlX29ianMoJnAyLT5xMSwmcDQtPnExLHA0LT50eXBmKSYmIWNvbXBhcmVfb2JqcygmcDItPnEyLCZwNC0+cTIscDQtPnR5cGYpKXsKKwkgICAgICBpZihERUJVRyYxMDI0KXtwcmludGYoInJlbW92aW5nIHJlZHVuZGFudCBjb21wYXJlXG4iKTtwcmljMihzdGRvdXQscDIpO3ByaWMyKHN0ZG91dCxwKTt9CisJICAgICAgcC0+Y29kZT1OT1A7CisJICAgICAgcC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworCSAgICAgIHAtPnR5cGY9MDsKKwkgICAgICBwMi0+Y29kZT1OT1A7CisJICAgICAgcDItPnR5cGY9MDsKKwkgICAgICBwMi0+cTEuZmxhZ3M9cDItPnEyLmZsYWdzPXAyLT56LmZsYWdzPTA7CisJICAgICAgY2hhbmdlZD0xOworCSAgICB9CisJICB9CisJfQorICAgICAgfQorCisgICAgICBpZigoYz09QURESTJQfHxjPT1TVUJJRlApJiYocC0+cTEuZmxhZ3MmKFZBUkFEUnxEUkVGT0JKKSk9PVZBUkFEUil7CisJSUMgKnAyPXAtPm5leHQ7CisJaWYocDItPmNvZGU9PUFEREkyUCYmcC0+dHlwZjI9PXAyLT50eXBmMiYmIWNvbXBhcmVfb2JqcygmcC0+eiwmcDItPnExLHAtPnR5cGYyKSYmKHAyLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisJICBpZihERUJVRyYxMDI0KXtwcmludGYoInJlYXJyYW5naW5nIEFEREkyUCB0byBmb2xkIFZBUkFEUitjb25zdFxuIik7cHJpYzIoc3Rkb3V0LHApO3ByaWMyKHN0ZG91dCxwMik7fQorCSAgZXZhbF9jb25zdCgmcDItPnEyLnZhbCxwMi0+dHlwZik7CisJICBwLT5xMS52YWwudm1heD16bWFkZChwLT5xMS52YWwudm1heCx2bWF4KTsKKwkgIHAyLT5jb2RlPUFTU0lHTjsKKwkgIHAyLT50eXBmPXAyLT50eXBmMjsKKwkgIHAyLT5xMi52YWwudm1heD1zaXpldGFiW3AyLT50eXBmJk5RXTsKKwl9CisgICAgICB9CisKKyAgICAgIHA9cC0+bmV4dDsKKyAgICB9CisgICAgaWYoY2hhbmdlZCkgZG9uZXw9Y2hhbmdlZDsKKyAgICBnY2hhbmdlZHw9Y2hhbmdlZDsKKyAgfXdoaWxlKGNoYW5nZWQpOworICByZXR1cm4gZG9uZTsKK30KKwordm9pZCBpbnNlcnRfbG9hZHMoKQorLyogIExhZWR0IFNwZWljaGVyIGluIHRlbXBvcmFlcmUgVmFyaWFibGVuICovCit7CisgIElDICpwLCpuZXc7CisgIHR5cGUgdD17MH0sdj17Vk9JRH07CisgIGludCBjOworICBpZihERUJVRyYxMDI0KSBwcmludGYoImluc2VydF9sb2FkcygpXG4iKTsKKyAgZm9yKHA9Zmlyc3RfaWM7cDtwPXAtPm5leHQpeworICAgIGM9cC0+Y29kZTsKKyAgICBpZihwLT50eXBmJlZPTEFUSUxFKSBjb250aW51ZTsKKyAgICBpZihwLT50eXBmMiZWT0xBVElMRSkgY29udGludWU7CisgICAgaWYocC0+cTIuZmxhZ3N8fGM9PVBVU0gpeworICAgICAgaWYoKGRyZWZfY3NlJiYocC0+cTEuZmxhZ3MmRFJFRk9CSikmJiEocC0+cTEuZHR5cCYoUFZPTEFUSUxFfFZPTEFUSUxFKSkpfHwoc3RhdGljX2NzZSYmKHAtPnExLmZsYWdzJihWQVJ8VkFSQURSKSk9PVZBUiYmKHAtPnExLnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTnx8cC0+cTEudi0+c3RvcmFnZV9jbGFzcz09U1RBVElDKSkpeworICAgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICAgIG5ldy0+Y29kZT1BU1NJR047CisJbmV3LT50eXBmPXExdHlwKHApOworCWlmKElTU0NBTEFSKG5ldy0+dHlwZikpeworCSAgbmV3LT5xMS5hbT1uZXctPnEyLmFtPW5ldy0+ei5hbTsKKwkgIG5ldy0+cTE9cC0+cTE7CisJICBuZXctPnEyLmZsYWdzPTA7CisJICBuZXctPnEyLnZhbC52bWF4PXNpemV0YWJbbmV3LT50eXBmJk5RXTsKKwkgIG5ldy0+ei5mbGFncz1WQVI7CisJICBuZXctPnoudmFsLnZtYXg9bDJ6bSgwTCk7CisJICB0LmZsYWdzPW5ldy0+dHlwZjsKKwkgIGlmKElTUE9JTlRFUihuZXctPnR5cGYpKSB0Lm5leHQ9JnY7IGVsc2UgdC5uZXh0PTA7CisJICBuZXctPnoudj1hZGRfdG1wX3ZhcihjbG9uZV90eXAoJnQpKTsKKwkgIGluc2VydF9JQyhwLT5wcmV2LG5ldyk7CisJICBwLT5xMT1uZXctPno7CisJfWVsc2UKKwkgIGZyZWUobmV3KTsKKyAgICAgIH0KKyAgICAgIGlmKChkcmVmX2NzZSYmKHAtPnEyLmZsYWdzJkRSRUZPQkopJiYhKHAtPnEyLmR0eXAmKFBWT0xBVElMRXxWT0xBVElMRSkpKXx8KHN0YXRpY19jc2UmJihwLT5xMi5mbGFncyYoVkFSfFZBUkFEUikpPT1WQVImJihwLT5xMi52LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk58fHAtPnEyLnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQykpKXsKKyAgICAgICAgbmV3PW5ld19JQygpOworICAgICAgICBuZXctPmNvZGU9QVNTSUdOOworCW5ldy0+dHlwZj1xMnR5cChwKTsKKwlpZihJU1NDQUxBUihuZXctPnR5cGYpKXsKKwkgIG5ldy0+cTEuYW09bmV3LT5xMi5hbT1uZXctPnouYW07CisJICBuZXctPnExPXAtPnEyOworCSAgbmV3LT5xMi5mbGFncz0wOworCSAgbmV3LT5xMi52YWwudm1heD1zaXpldGFiW25ldy0+dHlwZiZOUV07CisJICBuZXctPnouZmxhZ3M9VkFSOworCSAgbmV3LT56LnZhbC52bWF4PWwyem0oMEwpOworCSAgdC5mbGFncz1uZXctPnR5cGY7CisJICBpZihJU1BPSU5URVIobmV3LT50eXBmKSkgdC5uZXh0PSZ2OyBlbHNlIHQubmV4dD0wOworCSAgbmV3LT56LnY9YWRkX3RtcF92YXIoY2xvbmVfdHlwKCZ0KSk7CisJICBpbnNlcnRfSUMocC0+cHJldixuZXcpOworCSAgcC0+cTI9bmV3LT56OworCX1lbHNlCisJICBmcmVlKG5ldyk7CisgICAgICB9CisgICAgICBpZihwLT5xMi5mbGFncyYmKChkcmVmX2NzZSYmKHAtPnouZmxhZ3MmRFJFRk9CSikmJiEocC0+ei5kdHlwJihQVk9MQVRJTEV8Vk9MQVRJTEUpKSl8fChzdGF0aWNfY3NlJiYocC0+ei5mbGFncyYoVkFSfFZBUkFEUikpPT1WQVImJihwLT56LnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTnx8cC0+ei52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpKSkpeworCS8qIHRyYW5zbGF0ZSB4IG9wIHkgLT4gbWVtIHRvIHggb3AgeSAtPiB0bXA7IG1vdmUgdG1wIC0+IG1lbSAqLworICAgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICAgIG5ldy0+Y29kZT1BU1NJR047CisJbmV3LT50eXBmPXp0eXAocCk7CisJaWYoSVNTQ0FMQVIobmV3LT50eXBmKSl7CisJICBuZXctPnExLmFtPW5ldy0+cTIuYW09bmV3LT56LmFtOworCSAgbmV3LT56PXAtPno7CisJICBuZXctPnEyLmZsYWdzPTA7CisJICBuZXctPnEyLnZhbC52bWF4PXNpemV0YWJbbmV3LT50eXBmJk5RXTsKKwkgIG5ldy0+cTEuZmxhZ3M9VkFSOworCSAgbmV3LT5xMS52YWwudm1heD1sMnptKDBMKTsKKwkgIHQuZmxhZ3M9bmV3LT50eXBmOworCSAgaWYoSVNQT0lOVEVSKG5ldy0+dHlwZikpIHQubmV4dD0mdjsgZWxzZSB0Lm5leHQ9MDsKKwkgIG5ldy0+cTEudj1hZGRfdG1wX3ZhcihjbG9uZV90eXAoJnQpKTsKKwkgIGluc2VydF9JQyhwLG5ldyk7CisJICBwLT56PW5ldy0+cTE7CisJfWVsc2UKKwkgIGZyZWUobmV3KTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBpbnNlcnRfY2NzKHZvaWQpCisvKiAgRnVlZ3QgVmFyaWFibGVuIGZ1ZXIgY2NzIGVpbi4gICAqLworeworICAgIElDICpwOyBWYXIgKnY7IHR5cGUgKnQ7CisgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJpbnNlcnRfY2NzKClcbiIpOworICAgIGZvcihwPWZpcnN0X2ljO3A7cD1wLT5uZXh0KXsKKyAgICAgICAgaWYocC0+Y29kZT09Q09NUEFSRXx8cC0+Y29kZT09VEVTVCl7CisgICAgICAgICAgICBwLT56LmZsYWdzPVZBUjsKKyAgICAgICAgICAgIHAtPnoudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICAgICAgICB0PW5ld190eXAoKTsKKyAgICAgICAgICAgIHQtPmZsYWdzPTA7CisgICAgICAgICAgICB2PWFkZF90bXBfdmFyKHQpOworICAgICAgICAgICAgcC0+ei52PXY7CisgICAgICAgICAgICBwPXAtPm5leHQ7CisgICAgICAgICAgICBpZihwLT5jb2RlPEJFUXx8cC0+Y29kZT5CR1QpeworICAgICAgICAgICAgICAgIHA9cC0+cHJldjsKKyAgICAgICAgICAgICAgICBwLT5jb2RlPU5PUDsKKyAgICAgICAgICAgICAgICBwLT5xMS5mbGFncz1wLT5xMi5mbGFncz1wLT56LmZsYWdzPTA7CisJCXAtPnR5cGY9MDsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIHAtPnExLmZsYWdzPVZBUjsKKyAgICAgICAgICAgICAgICBwLT5xMS52YWwudm1heD1sMnptKDBMKTsKKyAgICAgICAgICAgICAgICBwLT5xMS52PXY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgdG9fYmVfaW5saW5lZChWYXIgKnYpCit7CisgIC8qIGRlY2lkZSB3aGV0aGVyIGZ1bmN0aW9uIHNob3VsZCBiZSBpbmxpbmVkICovCisgIGludCBjO0lDICpwOworICAvKiBubyBjb2RlIGF2YWlsYWJsZSAqLworICBpZighdi0+Zml8fCF2LT5maS0+Zmlyc3RfaWMpIHJldHVybiAwOworICAvKiBtYXJrZWQgYXMgbm9pbmxpbmUgKi8KKyAgaWYodi0+ZmktPmZsYWdzJk5PX0lOTElORSkgcmV0dXJuIDA7CisgIC8qIHJldHVybnMgc29tZXRoaW5nIG5vdCBpbiBhIHJlZ2lzdGVyIChGSVhNRSkgKi8KKyAgaWYoIWZmcmV0dXJuKHYtPnZ0eXAtPm5leHQpJiYodi0+dnR5cC0+bmV4dC0+ZmxhZ3MmTlEpIT1WT0lEKSByZXR1cm4gMDsKKyAgLyogdmFyYXJncyBmdW5jdGlvbiAqLworICBpZigoYz12LT52dHlwLT5leGFjdC0+Y291bnQpIT0wJiYoKnYtPnZ0eXAtPmV4YWN0LT5zbClbYy0xXS5zdHlwLT5mbGFncyE9Vk9JRCkKKyAgICByZXR1cm4gMDsKKyAgLyogdXNlcyB2YXJpYWJsZSBsZW5ndGggYXJyYXlzICovCisgIGlmKHYtPmZpLT5mbGFncyZVU0VTX1ZMQSkgcmV0dXJuIDA7CisgIGlmKHYtPmZpLT5pbmxpbmVfc2l6ZT49MCl7CisgICAgYz12LT5maS0+aW5saW5lX3NpemU7CisgIH1lbHNleworICAgIGZvcihjPTAscD12LT5maS0+Zmlyc3RfaWM7cDtwPXAtPm5leHQpIGMrKzsKKyAgfQorICAvKiB0cnkgdG8gYWx3YXlzIGlubGluZSBmdW5jdGlvbnMgc3BlY2lmaWVkIGFzIGlubGluZSAqLworICBpZih2LT5mbGFncyZJTkxJTkVGVU5DKQorICAgIHJldHVybiAxOworICBpZihjPmlubGluZV9zaXplKSByZXR1cm4gMDsKKyAgLyogd2UgYXNzdW1lIHRoYXQgaW5saW5pbmcgc2F2ZXMgc2l6ZSBpZiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cworICAgICBpcyBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIElDcyArIENBTEwgK1NFVFJFVFVSTiAgKi8KKyAgaWYob3B0c2l6ZSYmYy0yPih2LT52dHlwLT5leGFjdC0+Y291bnQpKSByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZGVwdGhfcmVhY2hlZDsKKworc3RhdGljIGludCBjcm9zc19tb2R1bGVfaW5saW5lKGludCBvbmx5X2Z1bGwpCit7CisgIElDICpwLCpucCwqbmV3LCppcCwqY3AsKmdldHJldHVybjsKKyAgVmFyICp2LCp2cDsKKyAgaW50IGksYyxmaXJzdGwsbGFzdGwsbW9yZV9wYXNzZXM9MDsKKyAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJjcm9zc19tb2R1bGVfaW5saW5lKG9ubHlfZnVsbD0lZClcbiIsb25seV9mdWxsKTsKKyAgZm9yKHA9Zmlyc3RfaWM7cDspeworICAgIG5wPXAtPm5leHQ7CisgICAgaWYocC0+Y29kZT09Q0FMTCYmKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJnRvX2JlX2lubGluZWQocC0+cTEudikpeworICAgICAgem1heCBwdXNoZWQ9cC0+cTIudmFsLnZtYXg7CisgICAgICBJQyAqZ3I7CisgICAgICB2PXAtPnExLnY7CisgICAgICBpZihvbmx5X2Z1bGwmJigocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSkhPVZBUnx8IXAtPnExLnYtPmZpfHwhKHAtPnExLnYtPmZpLT5mbGFncyZGVUxMX0lOTElORSkpKXsKKwlkZXB0aF9yZWFjaGVkPTE7CisgICAgICB9ZWxzZXsKKwltb3JlX3Bhc3Nlcz0xOworCWlmKERFQlVHJjEwMjQpeworCSAgcHJpbnRmKCJpbmxpbmluZyBjYWxsIHRvICVzXG4iLHAtPnExLnYtPmlkZW50aWZpZXIpOworCSAgZm9yKHZwPXYtPmZpLT52YXJzO3ZwO3ZwPXZwLT5uZXh0KQorCSAgICBwcmludGYoIiVzKCVsZCkvJXBcbiIsdnAtPmlkZW50aWZpZXIsem0ybCh2cC0+b2Zmc2V0KSwodm9pZCopdnApOworCX0KKwlncj1wLT5uZXh0OworCXdoaWxlKGdyJiZnci0+Y29kZT09Tk9QKSBncj1nci0+bmV4dDsKKwlpZihnciYmZ3ItPmNvZGU9PUdFVFJFVFVSTil7CisJICBnZXRyZXR1cm49Z3I7CisJICBucD1nZXRyZXR1cm4tPm5leHQ7CisJfWVsc2V7CisJICBnZXRyZXR1cm49MDsKKwl9CisJLyogIEtvcGllbiBkZXIgVmFyaWFibGVuIGVyemV1Z2VuICAgKi8KKwlmb3IodnA9di0+ZmktPnZhcnM7dnA7dnA9dnAtPm5leHQpeworCSAgdnAtPmlubGluZV9jb3B5PTA7CisJfQorCWNwPXA7CisJLyogZmluZCBmaXJzdCBhbmQgbGFzdCBsYWJlbCB1c2VkICovCisJZmlyc3RsPWxhc3RsPTA7CisJZm9yKGlwPXYtPmZpLT5maXJzdF9pYztpcDtpcD1pcC0+bmV4dCl7CisJICBpZihpcC0+Y29kZT49TEFCRUwmJmlwLT5jb2RlPD1CUkEpeworCSAgICBpZihmaXJzdGw9PTB8fGlwLT50eXBmPGZpcnN0bCkgZmlyc3RsPWlwLT50eXBmOworCSAgICBpZihsYXN0bD09MHx8aXAtPnR5cGY+bGFzdGwpIGxhc3RsPWlwLT50eXBmOworCSAgfQorCX0KKwkvKiBBcmd1bWVudGUgZWluZnVlZ2VuICovCisJdnA9di0+ZmktPnZhcnM7CisJZm9yKGk9MDtpPHAtPmFyZ19jbnQ7aSsrKXsKKwkgIHdoaWxlKHZwJiYoISp2cC0+aWRlbnRpZmllcnx8KHptbGVxKGwyem0oMEwpLHZwLT5vZmZzZXQpJiYhdnAtPnJlZyl8fCh2cC0+c3RvcmFnZV9jbGFzcyE9UkVHSVNURVImJnZwLT5zdG9yYWdlX2NsYXNzIT1BVVRPKSkpIHZwPXZwLT5uZXh0OworCSAgaWYoIXZwKQorCSAgICBjb250aW51ZTsKKwkgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiYXJnIG5yLiAlZCB0byB2YXIgPCVzPlxuIixpLHZwLT5pZGVudGlmaWVyKTsKKwkgIHZwLT5pbmxpbmVfY29weT1hZGRfdG1wX3ZhcihjbG9uZV90eXAodnAtPnZ0eXApKTsKKwkgIGlwPXAtPmFyZ19saXN0W2ldOworCSAgaWYoaXAtPmNvZGU9PUFTU0lHTil7CisJICAgIC8qIGZpbmQgYW5kIGRlbGV0ZSBub3AgZm9yIHJlZ2lzdGVyIHBhc3NpbmcgKi8KKwkgICAgSUMgKm5vcDsKKwkgICAgaWYoIShpcC0+ei5mbGFncyZWQVIpfHxpcC0+ei52LT5yZWc9PTApIGllcnJvcigwKTsKKwkgICAgZm9yKG5vcD1pcC0+bmV4dDtub3A7bm9wPW5vcC0+bmV4dCl7CisJICAgICAgaWYobm9wLT5jb2RlPT1OT1AmJihub3AtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJm5vcC0+cTEudj09aXAtPnoudikKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYoIW5vcCkgaWVycm9yKDApOworCSAgICBpZihucD09bm9wKSBucD1ub3AtPm5leHQ7CisJICAgIHJlbW92ZV9JQyhub3ApOworCSAgfWVsc2UgaWYoaXAtPmNvZGU9PVBVU0gpeworCSAgICBpcC0+Y29kZT1BU1NJR047CisJICAgIHB1c2hlZD16bXN1YihwdXNoZWQsaXAtPnEyLnZhbC52bWF4KTsKKwkgIH1lbHNleworCSAgICBwcmljMihzdGRvdXQsaXApOworCSAgICBpZXJyb3IoMCk7CisJICB9CisJICBpcC0+dHlwZiY9flZPTEFUSUxFOworCSAgaXAtPnouZmxhZ3M9VkFSOworCSAgaXAtPnoudj12cC0+aW5saW5lX2NvcHk7CisJICBpZigoaXAtPnoudi0+dnR5cC0+ZmxhZ3MmTlUpIT0oaXAtPnR5cGYmTlUpKXsKKwkgICAgLyogaGF2ZSB0byBjb252ZXJ0ICovCisJICAgIGlwLT50eXBmMj1pcC0+dHlwZjsKKwkgICAgaXAtPnR5cGY9aXAtPnoudi0+dnR5cC0+ZmxhZ3M7CisJICAgIGlwLT5jb2RlPUNPTlZFUlQ7CisJICB9CSAgCisJICBpcC0+ei52YWwudm1heD1sMnptKDBMKTsKKwkgIHZwPXZwLT5uZXh0OworCX0KKwkKKwlpZighem1lcXRvKHB1c2hlZCxsMnptKDBMKSkpeworCSAgLyogdWViZXJmbHVlc3NpZ2UgUFVTSHMgZW50ZmVybmVuICovCisJICBJQyAqbTsKKwkgIGlwPXAtPnByZXY7CisJICB3aGlsZSgxKXsKKwkgICAgbT1pcC0+cHJldjsKKwkgICAgaWYoaXAtPmNvZGU9PVBVU0gpeworCSAgICAgIGlmKDAvKiEoY19mbGFnc1syNl0mVVNFREZMQUcpJiZpcC0+cTEuZmxhZ3MqLykgaWVycm9yKDApOworCSAgICAgIGlmKCF6bWxlcShpcC0+cTIudmFsLnZtYXgscHVzaGVkKSkgaWVycm9yKDApOworCSAgICAgIHB1c2hlZD16bXN1YihwdXNoZWQsaXAtPnEyLnZhbC52bWF4KTsKKwkgICAgICBpZihucD09aXApIG5wPW5wLT5uZXh0OworCSAgICAgIHJlbW92ZV9JQyhpcCk7CisJICAgICAgaWYoem1lcXRvKHB1c2hlZCxsMnptKDBMKSkpIGJyZWFrOworCSAgICB9CisJICAgIGlmKCFtKSBpZXJyb3IoMCk7CisJICAgIGlwPW07CisJICB9CisJfQorCQorCS8qICBDb2RlIGVpbmZ1ZWdlbiB1bmQgTGFiZWxzIHVtc2NocmVpYmVuICAgKi8KKwlpcD12LT5maS0+Zmlyc3RfaWM7CisJd2hpbGUoaXApeworCSAgVmFyICppdjsKKwkgIGludCBjOworCSAgaWYoaXAtPmNvZGU9PUNPTlZFUlQmJihpcC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmKGlwLT5xMS52LT5mbGFncyZDT05WUEFSQU1FVEVSKSYmKGlwLT56LmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJmlwLT5xMS52PT1pcC0+ei52KXsKKwkgICAgaWYoREVCVUcmMTAyNCkge3ByaW50ZigiZWxpbWluYXRlIG9sZHN0eWxlIENPTlZFUlQ6XG4iKTtwcmljMihzdGRvdXQsaXApO30KKwkgICAgaXA9aXAtPm5leHQ7CisJICAgIGNvbnRpbnVlOworCSAgfQorCSAgbmV3PW5ld19JQygpOworCSAgKm5ldz0qaXA7CisJICBpcC0+Y29weT1uZXc7CisJICBjPWlwLT5jb2RlOworCSAgLyogIGV2dGwuIGlzdCBlaW4gSUMgcHJha3Rpc2NoIGVpbiBTRVRSRVRVUk4sIGZhbGxzIGRhcyAqLworCSAgLyogIFJ1ZWNrZ2FiZXppZWwgdWViZXIgUGFyYW1ldGVyemVpZ2VyIGFuZ2VzcHIuIHdpcmQgICAqLworCSAgaWYoaXAtPnouZmxhZ3MmVkFSKXsKKwkgICAgaXY9aXAtPnoudjsKKwkgICAgaWYoaXYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fGl2LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUnx8KGl2LT5mbGFncyZTVEFUSUNBVVRPKSl7CisJICAgICAgaWYoMC8qISppdi0+aWRlbnRpZmllciYmem1lcXRvKGl2LT5vZmZzZXQsbDJ6bSgwTCkpKi8peworCQlpZihnZXRyZXR1cm4peworCQkgIG5ldy0+ej1nZXRyZXR1cm4tPno7CisJCX1lbHNleworCQkgIG5ldy0+Y29kZT1OT1A7CisJCSAgbmV3LT5xMS5mbGFncz1uZXctPnEyLmZsYWdzPW5ldy0+ei5mbGFncz0wOworCQkgIG5ldy0+dHlwZj0wOworCQl9CisJICAgICAgfWVsc2V7CisJCWlmKCFpdi0+aW5saW5lX2NvcHkpeworCQkgIGl2LT5pbmxpbmVfY29weT1hZGRfdG1wX3ZhcihjbG9uZV90eXAoaXYtPnZ0eXApKTsKKwkJICBpdi0+aW5saW5lX2NvcHktPnJlZz1pdi0+cmVnOworCQl9CisJCW5ldy0+ei52PWl2LT5pbmxpbmVfY29weTsKKwkgICAgICB9LyplbHNlIGlmKGl2LT5pbmxpbmVfY29weSkgaWVycm9yKDApOyovCisJICAgIH0KKwkgIH0KKwkgIC8qIHJlY3JlYXRlIEFERFJFU1Mgd2hlbiBpbmxpbmluZyBTVEFUSUNBVVRPICovCisJICBpZigobmV3LT5xMS5mbGFncyYoVkFSfFZBUkFEUikpPT0oVkFSfFZBUkFEUikmJihuZXctPnExLnYtPmZsYWdzJlNUQVRJQ0FVVE8pKXsKKwkgICAgaWYobmV3LT5jb2RlIT1BU1NJR04pIGllcnJvcigwKTsKKwkgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJyZWNyZWF0aW5nIEFERFJFU1MgZnJvbSBTVEFUSUNBVVRPOlxuIik7CisJICAgIGlmKERFQlVHJjEwMjQpIHByaWMyKHN0ZG91dCxuZXcpOworCSAgICBuZXctPmNvZGU9QUREUkVTUzsKKwkgICAgbmV3LT5xMS5mbGFncyY9flZBUkFEUjsKKwkgICAgbmV3LT50eXBmMj1uZXctPnR5cGY7CisJICAgIG5ldy0+dHlwZj1DSEFSOyAvKiBUT0RPOiBEbyB3ZSByZXN0b3JlIHRoZSBvbGQgdHlwZT8gKi8KKwkgICAgaWYoREVCVUcmMTAyNCkgcHJpYzIoc3Rkb3V0LG5ldyk7CisJICB9CisJICAvKiAgS29waWVuIGFsbGVyIGF1dG8vcmVnaXN0ZXIgVmFyaWFibGVuIGVyemV1Z2VuICAgKi8KKwkgIGlmKGlwLT5xMS5mbGFncyZWQVIpeworCSAgICBpdj1pcC0+cTEudjsKKwkgICAgaWYoaXYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fGl2LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUnx8KGl2LT5mbGFncyZTVEFUSUNBVVRPKSl7CisJICAgICAgaWYoIWl2LT5pbmxpbmVfY29weSl7CisJCWl2LT5pbmxpbmVfY29weT1hZGRfdG1wX3ZhcihjbG9uZV90eXAoaXYtPnZ0eXApKTsKKwkJaXYtPmlubGluZV9jb3B5LT5yZWc9aXYtPnJlZzsKKwkgICAgICB9CisJICAgICAgbmV3LT5xMS52PWl2LT5pbmxpbmVfY29weTsKKwkgICAgICBpZihjPT1BRERSRVNTKSBuZXctPnExLnYtPmZsYWdzfD1VU0VEQVNBRFI7CisJICAgIH0vKmVsc2UgaWYoaXYtPmlubGluZV9jb3B5KSBpZXJyb3IoMCk7Ki8KKwkgIH0KKwkgIGlmKGlwLT5xMi5mbGFncyZWQVIpeworCSAgICBpdj1pcC0+cTIudjsKKwkgICAgaWYoaXYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fGl2LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUnx8KGl2LT5mbGFncyZTVEFUSUNBVVRPKSl7CisJICAgICAgaWYoIWl2LT5pbmxpbmVfY29weSl7CisJCWl2LT5pbmxpbmVfY29weT1hZGRfdG1wX3ZhcihjbG9uZV90eXAoaXYtPnZ0eXApKTsKKwkJaXYtPmlubGluZV9jb3B5LT5yZWc9aXYtPnJlZzsKKwkgICAgICB9CisJICAgICAgbmV3LT5xMi52PWl2LT5pbmxpbmVfY29weTsKKwkgICAgfS8qZWxzZSBpZihpdi0+aW5saW5lX2NvcHkpIGllcnJvcigwKTsqLworCSAgfQorCSAgaWYoYz09Q0FMTCl7CisJICAgIGludCBpOworCSAgICBmdW5jdGlvbl9jYWxscys9MTsKKwkgICAgbmV3LT5hcmdfbGlzdD1teW1hbGxvYyhzaXplb2YoKm5ldy0+YXJnX2xpc3QpKm5ldy0+YXJnX2NudCk7CisJICAgIGZvcihpPTA7aTxuZXctPmFyZ19jbnQ7aSsrKSBuZXctPmFyZ19saXN0W2ldPWlwLT5hcmdfbGlzdFtpXS0+Y29weTsKKwkgIH0KKwkgIGlmKGM+PUxBQkVMJiZjPD1CUkEpeworCSAgICBuZXctPnR5cGYrPWxhYmVsKzEtZmlyc3RsOworCSAgfQorCSAgaWYoYz09U0VUUkVUVVJOKXsKKwkgICAgaWYoZ2V0cmV0dXJuKXsKKwkgICAgICBuZXctPmNvZGU9QVNTSUdOOworCSAgICAgIG5ldy0+ej1nZXRyZXR1cm4tPno7CisJICAgIH1lbHNleworCSAgICAgIG5ldy0+Y29kZT1OT1A7CisJICAgICAgbmV3LT5xMS5mbGFncz1uZXctPnEyLmZsYWdzPW5ldy0+ei5mbGFncz0wOworCSAgICAgIG5ldy0+dHlwZj0wOworCSAgICB9CisJICB9CisJICBuZXctPnExLmZsYWdzJj1+U0NSQVRDSDsKKwkgIG5ldy0+cTIuZmxhZ3MmPX5TQ1JBVENIOworCSAgbmV3LT56LmZsYWdzJj1+U0NSQVRDSDsKKwkgIGlmKG5ldy0+Y29kZT09QVNTSUdOJiYhbmV3LT5xMS5mbGFncykgaWVycm9yKDApOworCSAgaW5zZXJ0X0lDKGNwLG5ldyk7CisJICBjcD1uZXc7CisJICBpcD1pcC0+bmV4dDsKKwl9CisJCisJbGFiZWwrPWxhc3RsLWZpcnN0bCsxOworCXJlbW92ZV9JQyhwKTsKKwlpZihnZXRyZXR1cm4pIHJlbW92ZV9JQyhnZXRyZXR1cm4pOworICAgICAgfQorICAgIH0KKyAgICBwPW5wOworICB9CisgIAorICByZXR1cm4gbW9yZV9wYXNzZXM7Cit9CisKKyNlbmRpZgorI2RlZmluZSBGUkVFQVYgZnJlZShhdl9nbG9iYWxzKTtmcmVlKGF2X3N0YXRpY3MpO2ZyZWUoYXZfZHJlZnMpO2ZyZWUoYXZfYWRkcmVzcyk7Cit2b2lkIG9wdGltaXplKGxvbmcgZmxhZ3MsVmFyICpmdW5jdGlvbikKKy8qICBmbGFnczogICAxPVJlZ2lzdGVyLCAyPW9wdGltaXplLCA0PWNzZS9jcCwgOD1jb25zdGFudF9wcm9wYWdhdGlvbiwgICovCisvKiAgICAgICAgICAxNj1kZWFkX2Fzc2lnbm1lbnRzLCAzMj1nbG9iYWwtb3B0aW1pemF0aW9ucyAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgNjQ9YmxvY2t3ZWlzZSBSZWdpc3RlcnZlcmdhYmUsIDEyOD1sb29wX29wdGltaXphdGlvbnMgKG51ciAgKi8KKy8qICAgICAgICAgICAgIGluIFZlcmJpbmR1bmcgbWl0IDMyKSwgMjU2PXJlY2FsY19vZmZzZXRzICAgICAgICAgICAgICAgICovCit7CisjaWZuZGVmIE5PX09QVElNSVpFUgorICBmbG93Z3JhcGggKmcsKmZnPTA7CisgIGludCByLGkscGFzcz0wLG11c3RyZXBlYXQsaW50YXNrOworICBpbnQgbGNfZnJlZWQsbGNfZG9uZT0wOworICBpZighZnVuY3Rpb24pIGllcnJvcigwKTsKKyAgbm9yZWs9bm9jYWxsPTA7CisgIHJlcG9ydF9zdXNwaWNpb3VzX2xvb3BzPXJlcG9ydF93ZWlyZF9jb2RlPTE7CisgIGlmKCFzdHJjbXAoZnVuY3Rpb24tPmlkZW50aWZpZXIsIm1haW4iKSl7bm9yZWs9MTtub2NhbGw9MTt9CisgIC8qICBmYWxscyBtYWluKCkgcmVrdXJzaXYgYXVmZ2VydWZlbiB3ZXJkZW4ga2FubiwgbXVzcyBub21haW49PTAgc2VpbiAgICovCisKKyAgaW50YXNrPShmdW5jdGlvbi0+dmF0dHImJnN0cnN0cihmdW5jdGlvbi0+dmF0dHIsInRhc2twcmlvKCIpKTsKKworICAKKyNlbHNlCisKKyAgZmxhZ3MmPTE7CisKKyNlbmRpZgorCisKKyAgaWYoZmxhZ3MmMil7CisjaWZuZGVmIE5PX09QVElNSVpFUgorICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiXG5PcHRpbWl6aW5nIGZ1bmN0aW9uICVzXG4iLGZ1bmN0aW9uLT5pZGVudGlmaWVyKTsKKyAgICAvKiAgVmFyaWFibGVuIGZ1ZXIgY2NzIGVpbnNldHplbi4gICAqLworICAgIGlmKGNyb3NzX21vZHVsZSYmKGZsYWdzJjQwOTYpKXsKKyAgICAgIGludCBpLG5vdGRvbmU9MTsKKyAgICAgIGZvcihpPTA7bm90ZG9uZTtpKyspeworCWRlcHRoX3JlYWNoZWQ9MDsKKwlub3Rkb25lPWNyb3NzX21vZHVsZV9pbmxpbmUoaT49aW5saW5lX2RlcHRoKTsKKyAgICAgIH0KKyAgICAgIGlmKCFkZXB0aF9yZWFjaGVkKXsKKwlpZighZnVuY3Rpb24tPmZpKSBmdW5jdGlvbi0+Zmk9bmV3X2ZpKCk7CisJZnVuY3Rpb24tPmZpLT5mbGFnc3w9RlVMTF9JTkxJTkU7CisJaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJmdW5jdGlvbiAlcyBzZXQgdG8gZnVsbC1pbmxpbmVcbiIsZnVuY3Rpb24tPmlkZW50aWZpZXIpOworICAgICAgfQorICAgIH0KKyAgICBpZihtdWx0aXBsZV9jY3MpIGluc2VydF9jY3MoKTsKKyAgICAvKiAgU3BlaWNoZXJ6dWdyaWZmZSBpbiBleHRyYSB0bXAtVmFycyB1bWxlaXRlbiwgd2VnZW4gY3NlICovCisgICAgaWYoZmxhZ3MmNCkgaW5zZXJ0X2xvYWRzKCk7CisgICAgLyogIG51ciBlaW4gcGFzcywgd2VubiBudXIgbG9rYWxlIE9wdGltaWVydW5nZW4gKi8KKyAgICBpZighKGZsYWdzJjMyKSkgbWF4b3B0cGFzc2VzPTE7CisgICAgZG97CisgICAgICBnY2hhbmdlZD0wO3Bhc3MrKzsKKyAgICAgIGF2X2dsb2JhbHM9YXZfc3RhdGljcz1hdl9hZGRyZXNzPWF2X2RyZWZzPTA7CisgICAgICBhZV9nbG9iYWxzPWFlX3N0YXRpY3M9YWVfYWRkcmVzcz1hZV9kcmVmcz0wOworICAgICAgY3BfZ2xvYmFscz1jcF9zdGF0aWNzPWNwX2FkZHJlc3M9Y3BfZHJlZnM9MDsKKyAgICAgIGRsaXN0PTA7dmlsaXN0PTA7ZWxpc3Q9MDsKKyAgICAgIAorICAgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJcbm9wdGltaXplciAoZnVuY3Rpb24gJXMpIHBhc3MgJWRcbiIsZnVuY3Rpb24tPmlkZW50aWZpZXIscGFzcyk7CisgICAgICBlYXJseV9wZWVwaG9sZSgpOworICAgICAgbnVtX3ZhcnMoKTsKKyAgICAgIHBlZXBob2xlKCk7CisgICAgICBmZz1qdW1wX29wdGltaXphdGlvbigpOworICAgICAgY3JlYXRlX2FsaWFzKGZnKTsKKyAgICAgIGlmKERFQlVHJjIwNDgpIHByaW50X3ZpKCk7CisKKyNpZiAwCisgICAgICBpZihERUJVRyYxMDI0KSBwcmludGYoInJhbmdlIGFuYWx5c2lzXG4iKTsKKyAgICAgIHJhbmdlX2FuYWx5c2lzKGZnKTsKKyAgICAgIG15ZnJlZShyYW5nZWJ1Zik7CisgICAgICByYW5nZWJ1Zj0wOworI2VuZGlmCisKKyAgICAgIGlmKGZsYWdzJjgpeworI2lmIDAKKwlkb3sKKwkgIG51bV9kZWZzKCk7CisJICBpZihmbGFncyYzMil7CisJICAgIHJlYWNoaW5nX2RlZmluaXRpb25zKGZnKTsKKwkgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRfZmxvd2dyYXBoKGZnKTsKKwkgICAgcj1jb25zdGFudF9wcm9wYWdhdGlvbihmZywxKTsKKwkgIH1lbHNleworCSAgICByPWNvbnN0YW50X3Byb3BhZ2F0aW9uKGZnLDApOworCSAgfQorCSAgaWYoREVCVUcmMTAyNCkge3ByaW50ZigiY29uc3RhbnRfcHJvcGFnYXRpb24gcmV0dXJuZWQgJWRcbiIscik7cHJpbnRfZmxvd2dyYXBoKGZnKTt9CisJICBpZihyKXsKKwkgICAgaWYocGVlcGhvbGUoKSl7ZnJlZV9mbG93Z3JhcGgoZmcpO2ZnPWp1bXBfb3B0aW1pemF0aW9uKCk7fQorCSAgfQorCSAgaWYociYyKXsKKwkgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJtdXN0IHJlcGVhdCBudW1fdmFyc1xuIik7CisJICAgIGZyZWUodmlsaXN0KTsKKwkgICAgRlJFRUFWOworCSAgICBudW1fdmFycygpOworCSAgfQorCX13aGlsZShyKTsKKyNlbmRpZgorCW51bV9kZWZzKCk7CisJbXVzdHJlcGVhdD0wOworCisKKwlpZihERUJVRyYxMDI0KSBwcmludGYoInRyeWluZyBjb25zdGFudCBwcm9wYWdhdGlvblxuIik7CisJaWYoREVCVUcmMTAyNCkgcHJpbnRfZmxvd2dyYXBoKGZnKTsKKwlpZigoZmxhZ3MmMzIpJiYhKGRpc2FibGUmNCkpCisJICByZWFjaGluZ19kZWZpbml0aW9ucyhmZyk7CisJZm9yKGc9Zmc7ZztnPWctPm5vcm1hbG91dCl7CisJICBkb3sKKwkgICAgcj1jb25zdGFudF9wcm9wYWdhdGlvbihnLChmbGFncyYzMikmJiEoZGlzYWJsZSY0KSk7CisJICAgIGdjaGFuZ2VkfD1yOworCSAgICBpZihyKXsKKwkgICAgICBJQyAqcDsKKwkgICAgICBpZihyJjIpIG11c3RyZXBlYXQ9MTsKKwkgICAgICByPTA7CisJICAgICAgZm9yKHA9Zy0+c3RhcnQ7cDtwPXAtPm5leHQpeworCQlpZigocC0+cTEuZmxhZ3MmKEtPTlNUfERSRUZPQkopKT09S09OU1QmJighcC0+cTIuZmxhZ3N8fChwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCkpeworCQkgIGlmKHAtPmNvZGUhPVRFU1QmJnAtPmNvZGUhPUNPTVBBUkUmJmZvbGQocCkpIHI9MTsKKwkJfQorCQlpZihwPT1nLT5lbmQpIGJyZWFrOworCSAgICAgIH0KKwkgICAgfQorCSAgfXdoaWxlKHIpOworCX0KKwlpZihERUJVRyYxMDI0KSBwcmludF9mbG93Z3JhcGgoZmcpOworCWZyZWUocmRfbWF0cml4KTsKKwlmcmVlKHZhcl9kZWZzKTsKKwlmcmVlKGRlZnNfa2lsbCk7CisJZnJlZShkZWZzX2dlbik7CisJZnJlZShkbGlzdCk7CisJZnJlZV9mbG93Z3JhcGgoZmcpOworCWlmKG11c3RyZXBlYXQpeworCSAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJtdXN0IHJlcGVhdCBudW1fdmFycygpXG4iKTsKKwkgIGZyZWUodmlsaXN0KTsKKwkgIEZSRUVBVjsKKwkgIGVhcmx5X3BlZXBob2xlKCk7CisJICBudW1fdmFycygpOworCX0KKwlwZWVwaG9sZSgpOworCWZnPWp1bXBfb3B0aW1pemF0aW9uKCk7CisgICAgICB9CisgICAgICBpZihmbGFncyY0KXsKKwlpbnQgcmVwZWF0OworCisJaWYoZWFybHlfZWZmX2ljcyYmIW5vX2VmZl9pY3MpCisJICBtYXJrX2VmZl9pY3MoKTsKKworCWRveworCSAgZG97CisJICAgIG51bV9leHAoKTsKKwkgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRfZmxvd2dyYXBoKGZnKTsKKwkgICAgaWYoZGlzYWJsZSYzMikKKwkgICAgICByZXBlYXQ9cj0wOworCSAgICBlbHNlCisJICAgICAgcmVwZWF0PXI9Y3NlKGZnLDApOyAgICAvKiAgbG9jYWwgY3NlICAgKi8KKwkgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJsb2NhbCBjc2UgcmV0dXJuZWQgJWRcbiIscik7CisJICAgIGdjaGFuZ2VkfD1yOworCSAgICBpZihyKXsgIC8qICBuZXVlIFZhcmlhYmxlbiBlaW5nZWZ1ZWd0ICAgKi8KKwkgICAgICBpZihERUJVRyYxMDI0KSBwcmludGYoIm11c3QgcmVwZWF0IG51bV92YXJzXG4iKTsKKwkgICAgICBmcmVlKHZpbGlzdCk7CisJICAgICAgRlJFRUFWOworCSAgICAgIG51bV92YXJzKCk7CisJICAgIH0KKwkgICAgZG97CisJICAgICAgbnVtX2NvcGllcygpOworCSAgICAgIGlmKERFQlVHJjEwMjQpIHByaW50X2Zsb3dncmFwaChmZyk7CisJICAgICAgaWYoZGlzYWJsZSYxMjgpCisJCXI9MDsKKwkgICAgICBlbHNlCisJCXI9Y29weV9wcm9wYWdhdGlvbihmZywwKTsgICAvKiAgY29weSBwcm9wYWdhdGlvbiAgICAqLworCSAgICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigibG9jYWwgY29weSBwcm9wYWdhdGlvbiByZXR1cm5lZCAlZFxuIixyKTsKKwkgICAgICBpZihyJjIpeworCQlpZihERUJVRyYxMDI0KSBwcmludGYoIm11c3QgcmVwZWF0IG51bV92YXJzXG4iKTsKKwkJZnJlZSh2aWxpc3QpOworCQlGUkVFQVY7CisJCW51bV92YXJzKCk7CisJICAgICAgfQorCSAgICAgIGdjaGFuZ2VkfD1yO3JlcGVhdHw9cjsKKwkgICAgfXdoaWxlKHIpOworCSAgfXdoaWxlKHJlcGVhdCk7CisJICByZXBlYXQ9MDsKKwkgIGlmKGZsYWdzJjMyKXsKKwkgICAgbnVtX2V4cCgpOworCSAgICBpZihERUJVRyYxMDI0KSBwcmludF9mbG93Z3JhcGgoZmcpOworCSAgICBhdmFpbGFibGVfZXhwcmVzc2lvbnMoZmcpOworCSAgICBpZihERUJVRyYxMDI0KSBwcmludF9mbG93Z3JhcGgoZmcpOworCSAgICBpZihkaXNhYmxlJjQ4KQorCSAgICAgIHI9MDsKKwkgICAgZWxzZQorCSAgICAgIHI9Y3NlKGZnLDEpOworCSAgICBnY2hhbmdlZHw9cjtyZXBlYXR8PXI7CisJICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiZ2xvYmFsIGNzZSByZXR1cm5lZCAlZFxuIixyKTsKKwkgICAgaWYocil7ICAvKiAgbmV1ZSBWYXJpYWJsZW4gZWluZ2VmdWVndCAgICovCisJICAgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJtdXN0IHJlcGVhdCBudW1fdmFyc1xuIik7CisJICAgICAgZnJlZSh2aWxpc3QpOworCSAgICAgIEZSRUVBVjsKKwkgICAgICBudW1fdmFycygpOworCSAgICAgIGdjaGFuZ2VkfD1yO3JlcGVhdHw9cjsKKwkgICAgICBkb3sKKwkJbnVtX2NvcGllcygpOworCQlpZihERUJVRyYxMDI0KSBwcmludF9mbG93Z3JhcGgoZmcpOworCQlpZihkaXNhYmxlJjEyOCkKKwkJICByPTA7CisJCWVsc2UKKwkJICByPWNvcHlfcHJvcGFnYXRpb24oZmcsMCk7ICAgLyogIGNvcHkgcHJvcGFnYXRpb24gICAgKi8KKwkJaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJsb2NhbCBjb3B5IHByb3BhZ2F0aW9uIHJldHVybmVkICVkXG4iLHIpOworCQlpZihyJjIpeworCQkgIGlmKERFQlVHJjEwMjQpIHByaW50ZigibXVzdCByZXBlYXQgbnVtX3ZhcnNcbiIpOworCQkgIGZyZWUodmlsaXN0KTsKKwkJICBGUkVFQVY7CisJCSAgbnVtX3ZhcnMoKTsKKwkJfQorCQlnY2hhbmdlZHw9cjtyZXBlYXR8PXI7CisJICAgICAgfXdoaWxlKHIpOworCSAgICB9CisJICAgIG51bV9jb3BpZXMoKTsKKwkgICAgYXZhaWxhYmxlX2NvcGllcyhmZyk7CisJICAgIGlmKERFQlVHJjEwMjQpIHByaW50X2Zsb3dncmFwaChmZyk7CisJICAgIGlmKGRpc2FibGUmMTkyKQorCSAgICAgIHI9MDsKKwkgICAgZWxzZQorCSAgICAgIHI9Y29weV9wcm9wYWdhdGlvbihmZywxKTsgICAvKiAgY29weSBwcm9wYWdhdGlvbiAgICAqLworCSAgICBpZihERUJVRyYxMDI0KSBwcmludGYoImdsb2JhbCBjb3B5IHByb3BhZ2F0aW9uIHJldHVybmVkICVkXG4iLHIpOworCSAgICBpZihyJjIpeworCSAgICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigibXVzdCByZXBlYXQgbnVtX3ZhcnNcbiIpOworCSAgICAgIGZyZWUodmlsaXN0KTsKKwkgICAgICBGUkVFQVY7CisJICAgICAgbnVtX3ZhcnMoKTsKKwkgICAgfQorCSAgICBnY2hhbmdlZHw9cjtyZXBlYXR8PXI7CisJICB9CisJfXdoaWxlKDAvKnJlcGVhdCovKTsKKyAgICAgIH0KKyAgICAgIGlmKChmbGFncyYxNjApPT0xNjApeworCWlmKCFub19lZmZfaWNzKQorCSAgbWFya19lZmZfaWNzKCk7CisKKwlyPWxvb3Bfb3B0aW1pemF0aW9ucyhmZyk7CisJZ2NoYW5nZWR8PXI7CisJZmc9anVtcF9vcHRpbWl6YXRpb24oKTsKKyAgICAgIH0KKyAgICAgIGlmKChmbGFncyYxNil8fCgoZmxhZ3MmMSkmJnBhc3M+PW1heG9wdHBhc3NlcykpeworCS8qICAgICAgICAgICAgICAgIG51bV92YXJzKCk7Ki8KKwlmcmVlX2FsaWFzKGZnKTsKKwljcmVhdGVfYWxpYXMoZmcpOworCWFjdGl2ZV92YXJzKGZnKTsKKwlpZihERUJVRyYxMDI0KSBwcmludF9mbG93Z3JhcGgoZmcpOworCWlmKChmbGFncyYxNikmJnBhc3M8PW1heG9wdHBhc3Nlcyl7CisJICByPWRlYWRfYXNzaWdubWVudHMoZmcpOworCSAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJkZWFkX2Fzc2lnbm1lbnRzIHJldHVybmVkICVkXG4iLHIpOworCSAgZ2NoYW5nZWR8PXI7CisJfQorICAgICAgfQorCisgICAgICBpZighZ2NoYW5nZWQpeworCWludCByOworCXI9aW5zZXJ0X2NvbnN0X21lbWNweShmZyk7CisJaWYocil7CisJICBnY2hhbmdlZHw9MTsKKwkgIHBhc3MtLTsKKwl9CisgICAgICB9ICAgICAgCisKKyNpZiBIQVZFX0xJQkNBTExTCisgICAgICAvKiBpZiBubyBmdXJ0aGVyIG9wdGltaXphdGlvbnMgYXJlIGZvdW5kLCBpbnNlcnQgbGliY2FsbHMKKwkgYW5kIGxvb2sgc29tZSBtb3JlICovCisgICAgICBpZighbGNfZG9uZSYmKCFnY2hhbmdlZHx8cGFzcz49bWF4b3B0cGFzc2VzKSl7CisJaW50IHI7CisJcj1pbnNlcnRfbGliY2FsbHMoZmcpOworCWxjX2RvbmU9MTsKKwlpZihyKXsKKwkgIGdjaGFuZ2VkfD0xOworCSAgcGFzcy0tOworCX0KKyAgICAgIH0KKyNlbmRpZgorICAgICAgCisgICAgICBpZigoIWdjaGFuZ2VkfHxwYXNzPj1tYXhvcHRwYXNzZXMpKXsKKwkvKiAgRnVua3Rpb24gZXZ0bC4gZnVlciBpbmxpbmluZyB2b3JiZXJlaXRlbiB1bmQgICAgKi8KKwkvKiAgUmVnaXN0ZXJ2ZXJnYWJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpbnQgdmFyYXJncz0wLGM7CisJaWYoKGM9ZnVuY3Rpb24tPnZ0eXAtPmV4YWN0LT5jb3VudCkhPTAmJigqZnVuY3Rpb24tPnZ0eXAtPmV4YWN0LT5zbClbYy0xXS5zdHlwLT5mbGFncyE9Vk9JRCkKKwkgIHZhcmFyZ3M9MTsKKwkKKwkvKiAgZGVmYXVsdC1XZXJ0IGZ1ZXIgaW5saW5lLUVudHNjaGVpZHVuZyAgICovCisJaWYoIWNyb3NzX21vZHVsZSYmIXZhcmFyZ3MmJihmbGFncyY0MDk2KSYmKG9ubHlfaW5saW5lfHxpY19jb3VudDw9aW5saW5lX3NpemUpKXsKKwkgIC8qICBmdWVyIGZ1bmN0aW9uIGlubGluaW5nIHZvcmJlcmVpdGVuICAgKi8KKwkgIElDICpwLCpuZXc7CisJICBpZihERUJVRyYxMDI0KSBwcmludGYoImZ1bmN0aW9uIDwlcz4gcHJlcGFyZWQgZm9yIGlubGluaW5nKGljX2NvdW50PSVkKVxuIixmdW5jdGlvbi0+aWRlbnRpZmllcixpY19jb3VudCk7CisJICBpZighZnVuY3Rpb24tPmZpKSBmdW5jdGlvbi0+Zmk9bmV3X2ZpKCk7CisJICBmdW5jdGlvbi0+ZmktPmZpcnN0X2ljPWZpcnN0X2ljOworCSAgZnVuY3Rpb24tPmZpLT5sYXN0X2ljPWxhc3RfaWM7CisJICBmaXJzdF9pYz1sYXN0X2ljPTA7CisJICBwPWZ1bmN0aW9uLT5maS0+Zmlyc3RfaWM7CisJICB3aGlsZShwKXsKKwkgICAgbmV3PW5ld19JQygpOworCSAgICBtZW1jcHkobmV3LHAsSUNTKTsKKwkgICAgcC0+Y29weT1uZXc7CisJICAgIGlmKChwLT5jb2RlPj1CRVEmJnAtPmNvZGU8PUJSQSl8fHAtPmNvZGU9PUxBQkVMKQorCSAgICAgIG5ldy0+dHlwZi09bGFzdGxhYmVsOworCSAgICBuZXctPnExLmZsYWdzJj1+U0NSQVRDSDsKKwkgICAgbmV3LT5xMi5mbGFncyY9flNDUkFUQ0g7CisJICAgIG5ldy0+ei5mbGFncyY9flNDUkFUQ0g7CisJICAgIGFkZF9JQyhuZXcpOworCSAgICBuZXctPmZpbGU9cC0+ZmlsZTsKKwkgICAgbmV3LT5saW5lPXAtPmxpbmU7CisJICAgIGlmKG5ldy0+Y29kZT09Q0FMTCl7CisJICAgICAgaW50IGk7CisJICAgICAgbmV3LT5hcmdfbGlzdD1teW1hbGxvYyhzaXplb2YoKm5ldy0+YXJnX2xpc3QpKm5ldy0+YXJnX2NudCk7CisJICAgICAgZm9yKGk9MDtpPG5ldy0+YXJnX2NudDtpKyspIG5ldy0+YXJnX2xpc3RbaV09cC0+YXJnX2xpc3RbaV0tPmNvcHk7CisJICAgIH0KKwkgICAgcD1wLT5uZXh0OworCSAgfQorCSAgcD1maXJzdF9pYztmaXJzdF9pYz1mdW5jdGlvbi0+ZmktPmZpcnN0X2ljO2Z1bmN0aW9uLT5maS0+Zmlyc3RfaWM9cDsKKwkgIHA9bGFzdF9pYztsYXN0X2ljPWZ1bmN0aW9uLT5maS0+bGFzdF9pYztmdW5jdGlvbi0+ZmktPmxhc3RfaWM9cDsKKwkgIGZ1bmN0aW9uLT5maS0+dmFycz0wOworCX0KKwkKKwlpZihjcm9zc19tb2R1bGUpIGNhbGNfZmluZm8oZnVuY3Rpb24sQ0FMQ19VU0VTfENBTENfQ0hBTkdFU3wocHJlZmVyX3N0YXRpY3M/Q0FMQ19DQUxMUzowKSk7CisgICAgICAgCisKKwlpZihmbGFncyYxKXsKKwkgIGxvY2FsX2NvbWJpbmUoZmcpOworCSAgaWYoREVCVUcmMTAyNCkgcHJpbnRfZmxvd2dyYXBoKGZnKTsKKwkgIGlmKGNvbG9yaW5nKXsKKyNpZmRlZiBBTEVYX1JFRworCSAgICBpZihERUJVRyYxMDI0KSBwcmludF9mbG93Z3JhcGgoZmcpOworCSAgICBsb29wcyhmZywxKTsKKwkgICAgbnVtX2RlZnMoKTsKKwkgICAgcmVhY2hpbmdfZGVmaW5pdGlvbnMoZmcpOworCSAgICBHQ0Fzc2lnblJlZ3MoZmcsZnVuY3Rpb24tPmlkZW50aWZpZXIpOworCSAgICB7IAorCSAgICAgIGludCBzdGFja191c2VkO0lDICpwOworI2lmIDEKKwkgICAgICBmb3IocD1wRmctPnN0YXJ0O3A7cD1wLT5uZXh0KXsKKwkJaWYoKHAtPnExLmZsYWdzJihSRUd8VkFSKSk9PVZBUiYmem1sZXEobDJ6bSgwTCkscC0+cTEudi0+b2Zmc2V0KSkKKwkJICBicmVhazsKKwkJaWYoKHAtPnEyLmZsYWdzJihSRUd8VkFSKSk9PVZBUiYmem1sZXEobDJ6bSgwTCkscC0+cTIudi0+b2Zmc2V0KSkKKwkJICBicmVhazsKKwkJaWYoKHAtPnouZmxhZ3MmKFJFR3xWQVIpKT09VkFSJiZ6bWxlcShsMnptKDBMKSxwLT56LnYtPm9mZnNldCkpCisJCSAgYnJlYWs7CisJICAgICAgfQorCSAgICAgIGlmKCFwKSBtYXhfb2Zmc2V0PWwyem0oMEwpOworI2VuZGlmCisJICAgIH0KKwkgICAgICAKKwkgICAgZmcgPSBwRmc7CisjZWxzZQorCSAgICBpZXJyb3IoMCk7CisjZW5kaWYKKwkgIH1lbHNleworCSAgICBsb2NhbF9yZWdzKGZnKTsKKwkgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRfZmxvd2dyYXBoKGZnKTsKKwkgICAgbG9vcHMoZmcsMSk7CisJICAgIGlmKERFQlVHJjEwMjQpIHByaW50X2Zsb3dncmFwaChmZyk7CisJICAgIGZnPWNyZWF0ZV9sb29wX2hlYWRlcnMoZmcsMSk7CisJICAgIGlmKERFQlVHJjEwMjQpIHByaW50X2Zsb3dncmFwaChmZyk7CisJICAgIGZnPWNyZWF0ZV9sb29wX2Zvb3RlcnMoZmcsMSk7CisJICAgIGlmKERFQlVHJjEwMjQpIHByaW50X2Zsb3dncmFwaChmZyk7CisJICAgIGlmKCEoZGlzYWJsZSY4MTkyKSkKKwkgICAgICBjcmVhdGVfY29uc3RfdmFycyhmZyk7CisJICAgIGxvb3BfcmVncyhmZyxpbnRhc2spOworCSAgICBpZihERUJVRyYxMDI0KSBwcmludF9mbG93Z3JhcGgoZmcpOworI2lmIDAKKwkgICAgaWYoZmxhZ3MmNjQpeworCSAgICAgIGJsb2NrX3JlZ3MoZmcpOworCSAgICAgIGlmKERFQlVHJjEwMjQpIHByaW50X2Zsb3dncmFwaChmZyk7CisJICAgIH0KKyNlbmRpZgorCSAgICAvKiBjYWxjdWxhdGUgb3B0aW1pemVkIHNpemUgZm9yIGNyb3NzLW1vZHVsZS1pbmxpbmluZyAqLworCSAgICB7CisJICAgICAgSUMgKnA7CisJICAgICAgaWYoIWZ1bmN0aW9uLT5maSkgZnVuY3Rpb24tPmZpPW5ld19maSgpOworCSAgICAgIGZ1bmN0aW9uLT5maS0+aW5saW5lX3NpemU9MDsKKwkgICAgICBmb3IocD1maXJzdF9pYztwO3A9cC0+bmV4dCkgZnVuY3Rpb24tPmZpLT5pbmxpbmVfc2l6ZSsrOworCSAgICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiaW5saW5lX3NpemU9JWxkXG4iLGZ1bmN0aW9uLT5maS0+aW5saW5lX3NpemUpOworCSAgICB9CisKKwkgICAgaW5zZXJ0X3JlZ3MoZmcpOworCSAgICBpbnNlcnRfc2F2ZXMoZmcpOworCSAgICBpZihwcmVmZXJfc3RhdGljc3x8Zm9yY2Vfc3RhdGljcykgcmVwbGFjZV9zdGF0aWNzKGZ1bmN0aW9uKTsKKwkgICAgCisJICAgIGlmKGZsYWdzJjI1NikgcmVjYWxjX29mZnNldHMoZmcpOworCSAgICBmcmVlX2NvbnN0X3ZhcnMoKTsKKwkgIH0KKwl9CisgICAgICB9CisKKyAgICAgIGZyZWVfYWxpYXMoZmcpOworICAgICAgZnJlZV9mbG93Z3JhcGgoZmcpOworICAgICAgZnJlZSh2aWxpc3QpOworICAgICAgRlJFRUFWOworCisgICAgICBpZigoZmxhZ3MmMzIpJiZnY2hhbmdlZCYmcGFzcz49bWF4b3B0cGFzc2VzKSBlcnJvcigxNzIsbWF4b3B0cGFzc2VzKTsKKworICAgIH13aGlsZShnY2hhbmdlZCYmcGFzczxtYXhvcHRwYXNzZXMpOworICAgIC8qICBudXIsIHVtIG5vY2htYWwgdWViZXJmbHVlc3NpZ2UgTGFiZWxzIHp1IGVudGZlcm5lbiAgKi8KKyAgICBmZz1jb25zdHJ1Y3RfZmxvd2dyYXBoKCk7CisgICAgZnJlZV9mbG93Z3JhcGgoZmcpOworICAgIGNvbWJpbmVfY29uc3RfYXNzaWducygpOworICAgIAorI2VuZGlmCisKKyAgfWVsc2V7CisgICAgLyogIGtlaW5lIE9wdGltaWVydW5nZW4gICAgICovCisgICAgaWYoZmxhZ3MmMSkgc2ltcGxlX3JlZ3MoKTsKKyAgICBsb2FkX3NpbXBsZV9yZWdfcGFybXMoKTsKKyAgfQorI2lmbmRlZiBOT19PUFRJTUlaRVIKKyAgYWRkX2NhbGxfbGlzdCgpOworI2VuZGlmCisKKyAgbGFzdGxhYmVsPWxhYmVsOworfQorCisKKwpkaWZmIC0tZ2l0IGEvb3B0LmggYi9vcHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjhlZmRmCi0tLSAvZGV2L251bGwKKysrIGIvb3B0LmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qICAkVkVSOiB2YmNjIChvcHQuaCkgJFJldmlzaW9uOiAxLjQgJCAgICAqLworCisjaW5jbHVkZSAic3VwcC5oIgorCitleHRlcm4gaW50IGdjaGFuZ2VkOyAgIC8qICBNZXJrZXIsIG9iIE9wdGltaWVydW5nc2xhdWYgZXR3YXMgZ2VhZW5kZXJ0IGhhdCAqLworZXh0ZXJuIGludCBub3JlazsgICAgICAvKiAgZGllc2UgRnVua3Rpb24gd2lyZCBuaWNodCByZWt1cnNpdiBhdWYgICAgICAgICAgKi8KK2V4dGVybiBpbnQgbm9jYWxsOyAgICAgLyogIGRpZXNlIEZ1bmt0aW9uIGtlaHJ0IG5pY2h0IHp1bSBDYWxsZXIgenVydWVjayAgICovCitleHRlcm4gaW50IGlucjsgICAgICAgIC8qICBudW1iZXIgb2YgbnVtX1ZhcnMgaXRlcmF0aW9uICovCisKKy8qICB0ZW1wb3JhcnkgZnVlciB2ZXJzY2hpZWRlbmUgQml0dmVrdG9yZW4gKi8KK2V4dGVybiBidnR5cGUgKnRtcDsKKworLyogIGZ1ZXIgYWt0aXZlIFZhcmlhYmxlbiAgICovCitleHRlcm4gVmFyICoqdmlsaXN0OworZXh0ZXJuIHVuc2lnbmVkIGludCB2Y291bnQ7ICAgIC8qICAwLi52Y291bnQtcmNvdW50LTE6IHZhcnMsIHZjb3VudC1yY291bnQuLnZjb3VudDogRFJFRk9CSnMgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgcmNvdW50OworZXh0ZXJuIHNpemVfdCB2c2l6ZTsKK2V4dGVybiBidnR5cGUgKmF2X2dsb2JhbHMsKmF2X2FkZHJlc3MsKmF2X3N0YXRpY3MsKmF2X2RyZWZzOworZXh0ZXJuIGludCByZXBvcnRfZGVhZF9zdGF0ZW1lbnRzOworCisvKiAgZnVlciB2ZXJmdWVnYmFyZSBEZWZpbml0aW9uZW4gICAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBkY291bnQ7CitleHRlcm4gc2l6ZV90IGRzaXplOworZXh0ZXJuIElDICoqZGxpc3Q7CitleHRlcm4gYnZ0eXBlICoqdmFyX2RlZnMsKip2YXJfdW5kZWZzOworZXh0ZXJuIGJ2dHlwZSAqKmRlZnNfa2lsbCwqKmRlZnNfZ2VuOworZXh0ZXJuIGJ2dHlwZSAqcmRfZGVmcywqcmRfdG1wOworZXh0ZXJuIGJ2dHlwZSAqcmRfbWF0cml4OworI2RlZmluZSBVTkRFRih4KSAoeCtkY291bnQpCisKKy8qICBmdWVyIHZlcmZ1ZWdiYXJlIEF1c2RydWVja2UgKi8KK2V4dGVybiBJQyAqKmVsaXN0OworZXh0ZXJuIHVuc2lnbmVkIGludCBlY291bnQ7CitleHRlcm4gc2l6ZV90IGVzaXplOworZXh0ZXJuIGJ2dHlwZSAqYWVfZ2xvYmFscywqYWVfYWRkcmVzcywqYWVfc3RhdGljcywqYWVfZHJlZnM7CisKKy8qICBmdWVyIHZlcmZ1ZWdiYXJlIEtvcGllbiAqLworZXh0ZXJuIHVuc2lnbmVkIGludCBjY291bnQ7CitleHRlcm4gc2l6ZV90IGNzaXplOworZXh0ZXJuIElDICoqY2xpc3Q7CisKKy8qICBmdWVyIGZyZXF1ZW5jeS1yZWR1Y3Rpb24gICAgKi8KK2V4dGVybiBidnR5cGUgKmlubG9vcCwqaW52YXJpYW50OworCisvKiAgYWxsZSBBc3NpZ25tZW50cywgZ2xvYmFsZXIgb2RlciBBZHIuIGZ1ZXIgcHJvcGFnYXRpb24gZXRjLiAgICAgICAgICovCitleHRlcm4gYnZ0eXBlICpjcF9nbG9iYWxzLCpjcF9hZGRyZXNzLCpjcF9zdGF0aWNzLCpjcF9kcmVmcywqY3BfYWN0LCpjcF9kZXN0OworLyogIGFsbGUgS29waWVyYW53ZWlzdW5nZW4sIGRpZSBlaW5lIGJlc3QuIFZhcmlhYmxlIGFscyBRdWVsbGUgaGFiZW4gICAgKi8KK2V4dGVybiBidnR5cGUgKipjb3BpZXM7CisKK2V4dGVybiBpbnQgaGF2ZV9hbGlhczsKK2V4dGVybiBpbnQgc3RhdGljX2NzZSxkcmVmX2NzZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bmlvbiBhdHlwcyBtaW4sbWF4OworfSByYW5nZTsKKworZXh0ZXJuIHJhbmdlICpyYW5nZWJ1ZjsKKwordHlwZWRlZiBzdHJ1Y3QgZmxvd2dyYXBoeworICBJQyAqc3RhcnQsKmVuZDsKKyAgc3RydWN0IGZsb3dncmFwaCAqbm9ybWFsb3V0LCpicmFuY2hvdXQ7CisgIHN0cnVjdCBmbG93bGlzdCAqaW47CisgIGludCBpbmRleDsKKyAgLyogIExldHp0ZXIgQmxvY2sgZGVyIFNjaGxlaWZlLCBmYWxscyBCbG9jayBTdGFydCBlaW5lciBTY2hsZWlmZSBpc3QgICAgKi8KKyAgc3RydWN0IGZsb3dncmFwaCAqbG9vcGVuZDsKKyAgLyogIEFuemFobCBGdW5rdGlvbnNhdWZydWZlIGltIEJsb2NrL2RlciBTY2hsZWlmZSAgICovCisgIGludCBjYWxscyxsb29wX2NhbGxzOworICAvKiAgQml0dmVrdG9yZW4gZnVlciBha3RpdmUgVmFyaWFibGVuLCByZWFjaGluZy1kZWZpbml0aW9ucywKKyAgICAgIGF2YWlsYWJsZS1leHByZXNzaW9ucyB1bmQgYXZhaWxhYmxlLWNvcGllcyAqLworICBidnR5cGUgKmF2X2luLCphdl9vdXQsKmF2X2dlbiwqYXZfa2lsbDsKKyAgYnZ0eXBlICpyZF9pbiwqcmRfb3V0LCpyZF9nZW4sKnJkX2tpbGw7CisgIGJ2dHlwZSAqYWVfaW4sKmFlX291dCwqYWVfZ2VuLCphZV9raWxsOworICBidnR5cGUgKmNwX2luLCpjcF9vdXQsKmNwX2dlbiwqY3Bfa2lsbDsKKyAgLyogcG9pbnRzLXRvLWluZm8gKi8KKyAgYnZ0eXBlICoqcHQ7CisgIC8qIHJhbmdlLWluZm8gKi8KKyAgcmFuZ2UgKnJhX25vcm1hbG91dCwqcmFfYnJhbmNob3V0OworICAvKiAgUmVnaXN0ZXJ2YXJpYWJsZW4gICAqLworICBWYXIgKnJlZ3ZbTUFYUisxXTsKKyAgLyogIE1lcmtlciwgb2IgUmVnaXN0ZXIgZ2VicmF1Y2h0IHd1cmRlOyBNQUNSKzEgQml0cyAgICAqLworICBidnR5cGUgcmVndXNlZFtSU0laRS9zaXplb2YoYnZ0eXBlKV07CisjaWZkZWYgQUxFWF9SRUcKKyAgaW50IGxvb3BfZGVwdGg7IC8qIHNjaGxlaWZlbnRpZWZlIGRlcyBibG9ja3MuIFdpcmQgbnVyIGZ1ZXIgZWNodGUgU2NobGVpZmVuIGdlemFlaGx0LiAqLworI2VuZGlmCit9IGZsb3dncmFwaDsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBiYXNpY19ibG9ja3M7CisKK3R5cGVkZWYgc3RydWN0IGZsb3dsaXN0eworICAgIGZsb3dncmFwaCAqZ3JhcGg7CisgICAgc3RydWN0IGZsb3dsaXN0ICpuZXh0OworfSBmbG93bGlzdDsKKworaW50IGNvbXBhcmVfY29uc3QodW5pb24gYXR5cHMgKnExLHVuaW9uIGF0eXBzICpxMixpbnQgdCk7CitpbnQgY29tcGFyZV9vYmpzKG9iaiAqbzEsb2JqICpvMixpbnQgdCk7Cit2b2lkIHNpbXBsZV9yZWdzKHZvaWQpOwordm9pZCBsb2FkX3NpbXBsZV9yZWdfcGFybXModm9pZCk7Cit2b2lkIHJlbW92ZV9JQ19mZyhmbG93Z3JhcGggKmcsSUMgKnApOworCitleHRlcm4gaW50IGxhc3RsYWJlbDsKKworZmxvd2dyYXBoICpuZXdfZmxvd2dyYXBoKHZvaWQpOworZmxvd2dyYXBoICpjb25zdHJ1Y3RfZmxvd2dyYXBoKHZvaWQpOwordm9pZCBwcmludF9hdihidnR5cGUgKmJpdHZlY3Rvcik7Cit2b2lkIHByaW50X3JkKGJ2dHlwZSAqYml0dmVjdG9yKTsKK3ZvaWQgcHJpbnRfYWUoYnZ0eXBlICpiaXR2ZWN0b3IpOwordm9pZCBwcmludF9jcChidnR5cGUgKmJpdHZlY3Rvcik7Cit2b2lkIHByaW50X2Zsb3dncmFwaChmbG93Z3JhcGggKmcpOwordm9pZCBmcmVlX2Zsb3dncmFwaChmbG93Z3JhcGggKmcpOwordm9pZCBudW1fdmFycyh2b2lkKTsKK3ZvaWQgcHJpbnRfdmkodm9pZCk7Cit2b2lkIGF2X2NoYW5nZShJQyAqcCxidnR5cGUgKnVzZSxidnR5cGUgKmRlZik7Cit2b2lkIGF2X3VwZGF0ZShJQyAqLGJ2dHlwZSAqKTsKK3ZvaWQgYWN0aXZlX3ZhcnMoZmxvd2dyYXBoICpmZyk7CitpbnQgZGVhZF9hc3NpZ25tZW50cyhmbG93Z3JhcGggKmZnKTsKK3ZvaWQgaW5zZXJ0X0lDKElDICpwLElDICpuZXcpOwordm9pZCBpbnNlcnRfSUNfZmcoZmxvd2dyYXBoICpmZyxJQyAqcCxJQyAqbmV3KTsKK3ZvaWQgaW5zZXJ0X2FsbG9jcmVnKGZsb3dncmFwaCAqZmcsSUMgKnAsaW50IGNvZGUsaW50IHJlZyk7Cit2b2lkIHVzZWRfb2JqZWN0cyhWYXIgKik7Cit2b2lkIHVzZWRfY2xpc3QodHlwZSAqLGNvbnN0X2xpc3QgKik7Cit2b2lkIGZpeF9zaG9ydG9wKGZsb3dncmFwaCAqLElDICopOworCitleHRlcm4gVmFyICpscmVndltNQVhSKzFdLCpmaXJzdF9jb25zdCwqbGFzdF9jb25zdDsKK2V4dGVybiBmbG93Z3JhcGggKmxmZzsKKworZXh0ZXJuIGludCByZXBvcnRfd2VpcmRfY29kZSxyZXBvcnRfc3VzcGljaW91c19sb29wcyxwb2ludGVyX2NhbGw7CisKK2ludCByZXBsYWNlX2xvY2FsX3JlZyhvYmogKik7Cit2b2lkIGxvY2FsX3JlZ3MoZmxvd2dyYXBoICopOwordm9pZCBsb2NhbF9jb21iaW5lKGZsb3dncmFwaCAqKTsKK3ZvaWQgY3JlYXRlX2NvbnN0X3ZhcnMoZmxvd2dyYXBoICopOwordm9pZCBmcmVlX2NvbnN0X3ZhcnModm9pZCk7Cit2b2lkIGxvb3BfcmVncyhmbG93Z3JhcGggKixpbnQpOwordm9pZCBibG9ja19yZWdzKGZsb3dncmFwaCAqKTsKK3ZvaWQgaW5zZXJ0X3NhdmVzKGZsb3dncmFwaCAqKTsKK2Zsb3dncmFwaCAqanVtcF9vcHRpbWl6YXRpb24odm9pZCk7Cit2b2lkIG51bV9kZWZzKHZvaWQpOwordm9pZCByZWFjaGluZ19kZWZpbml0aW9ucyhmbG93Z3JhcGggKik7Cit2b2lkIHJkX2NoYW5nZShJQyAqKTsKK3ZvaWQgY2FsYyhpbnQgYyxpbnQgdCx1bmlvbiBhdHlwcyAqcTEsdW5pb24gYXR5cHMgKnEyLHVuaW9uIGF0eXBzICp6LElDICpwKTsKK2ludCBmb2xkKElDICpwKTsKK2ludCBwZWVwaG9sZSh2b2lkKTsKK2ludCBwcm9wYWdhdGUoSUMgKnAsb2JqICpvLGludCByZXBsYWNlLGludCBnbG9iYWwpOworaW50IGNvbnN0YW50X3Byb3BhZ2F0aW9uKGZsb3dncmFwaCAqZmcsaW50IGdsb2JhbCk7CitpbnQgY29tcGFyZV9leHAoY29uc3Qgdm9pZCAqYTEsY29uc3Qgdm9pZCAqYTIpOwordm9pZCBudW1fZXhwKHZvaWQpOwordm9pZCBhdmFpbGFibGVfZXhwcmVzc2lvbnMoZmxvd2dyYXBoICpmZyk7Cit2b2lkIGF2YWlsYWJsZV9jb3BpZXMoZmxvd2dyYXBoICpmZyk7CitpbnQgY3NlKGZsb3dncmFwaCAqZmcsaW50IGdsb2JhbCk7Cit2b2lkIG51bV9jb3BpZXModm9pZCk7CitpbnQgY29weV9wcm9wYWdhdGlvbihmbG93Z3JhcGggKmZnLGludCBnbG9iYWwpOworaW50IGxvb3BzKGZsb3dncmFwaCAqZmcsaW50IG1vZGUpOworZmxvd2dyYXBoICpjcmVhdGVfbG9vcF9oZWFkZXJzKGZsb3dncmFwaCAqZmcsaW50IGF2KTsKK2Zsb3dncmFwaCAqY3JlYXRlX2xvb3BfZm9vdGVycyhmbG93Z3JhcGggKmZnLGludCBhdik7Cit2b2lkIGluc2VydF9yZWdzKGZsb3dncmFwaCAqZmcpOwordm9pZCByZWNhbGNfb2Zmc2V0cyhmbG93Z3JhcGggKmZnKTsKK3ZvaWQgb3B0aW1pemUobG9uZyBmbGFncyxWYXIgKmZ1bmN0aW9uKTsKK2ludCBsb29wX29wdGltaXphdGlvbnMoZmxvd2dyYXBoICpmZyk7CitpbnQgZGVjaWRlX3JldmVyc2Uoem1heCk7Cit2b2lkIHJhbmdlX2FuYWx5c2lzKGZsb3dncmFwaCAqZmcpOwordm9pZCBpY191c2VzKElDICpwLGJ2dHlwZSAqcmVzdWx0KTsKK3ZvaWQgaWNfY2hhbmdlcyhJQyAqcCxidnR5cGUgKnJlc3VsdCk7Cit2b2lkIGNyZWF0ZV9hbGlhcyhmbG93Z3JhcGggKmZnKTsKK3ZvaWQgZnJlZV9hbGlhcyhmbG93Z3JhcGggKmZnKTsKK3ZvaWQgdXBkYXRlX2FsaWFzKFZhciAqb2xkLFZhciAqbmV3KTsKK3ZvaWQgcHJpbnRfcHQoYnZ0eXBlICoqKTsKK3ZvaWQgZnJlZV9wdChidnR5cGUgKiopOworI2RlZmluZSBDQUxDX0NBTExTIDEKKyNkZWZpbmUgQ0FMQ19VU0VTICAyCisjZGVmaW5lIENBTENfQ0hBTkdFUyA0Cit2b2lkIGNhbGNfZmluZm8oVmFyICosaW50KTsKZGlmZiAtLWdpdCBhL29zZWtfc3VwcC5oIGIvb3Nla19zdXBwLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmRhOGQzMgotLS0gL2Rldi9udWxsCisrKyBiL29zZWtfc3VwcC5oCkBAIC0wLDAgKzEsMTMgQEAKKy8qIHVzZWQgZm9yIHNwZWNpYWwgb3BlcmF0aW5nIHN5c3RlbSBzdXBwb3J0ICovCitleHRlcm4gYnZ0eXBlIHRhc2tfcHJlZW1wdF9yZWdzW10sdGFza19zY2hlZHVsZV9yZWdzW107Cit0eXBlZGVmIHN0cnVjdCB0YXNrbGlzdCB7CisgIHN0cnVjdCBWYXIgKnY7CisgIGludCBwcmlvOworICBpbnQgdGFza2lkOworICBlbnVtIHtOT05fUFJFRU1QVElWRT0xLERPRVNfQkxPQ0s9MixDQUxMU19TQ0hFRD00LElTUj04fSBmbGFnczsKKyAgYnZ0eXBlIGNvbnRleHRbQlZTSVpFKE1BWFIrMSkvc2l6ZW9mKGJ2dHlwZSldOworICBidnR5cGUgcHJlZW1wdF9jb250ZXh0W0JWU0laRShNQVhSKzEpL3NpemVvZihidnR5cGUpXTsKKyAgYnZ0eXBlIHNjaGVkdWxlX2NvbnRleHRbQlZTSVpFKE1BWFIrMSkvc2l6ZW9mKGJ2dHlwZSldOworICBidnR5cGUgdW5zYXZlZF9jb250ZXh0W0JWU0laRShNQVhSKzEpL3NpemVvZihidnR5cGUpXTsKK30gdGFza2xpc3Q7CisKZGlmZiAtLWdpdCBhL29zZWtybS5jIGIvb3Nla3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJjNTUyOAotLS0gL2Rldi9udWxsCisrKyBiL29zZWtybS5jCkBAIC0wLDAgKzEsMzMgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIEJTSVpFIDQxOTYKK2NoYXIgYnVmW0JTSVpFXTsKKworaW50IG1haW4oKQoreworICBpbnQgbmVzdD0wOworICB3aGlsZShmZ2V0cyhidWYsQlNJWkUsc3RkaW4pKXsKKyAgICBpZihuZXN0PT0wKXsKKyAgICAgIGZwdXRzKGJ1ZixzdGRvdXQpOworICAgICAgaWYoIXN0cm5jbXAoYnVmLCIjaWYgSEFWRV9PU0VLIiwxMil8fCFzdHJuY21wKGJ1ZiwiI2lmZGVmIEhBVkVfTUlTUkEiLDE3KXx8IXN0cm5jbXAoYnVmLCIjaWZkZWYgSEFWRV9FQ1BQIiwxNikpCisJbmVzdCsrOworICAgIH1lbHNleworICAgICAgaWYoIXN0cm5jbXAoYnVmLCIjZW5kaWYiLDYpKQorCW5lc3QtLTsKKyAgICAgIGlmKCFzdHJuY21wKGJ1ZiwiI2lmIiwzKSkKKwluZXN0Kys7CisgICAgICBpZihuZXN0PT0xJiYhc3RybmNtcChidWYsIiNlbHNlIiw1KSkKKwlmcHV0cygiaWxsZWdhbCAjZWxzZSBmb3VuZCIsc3RkZXJyKTsKKyAgICAgIGlmKG5lc3Q9PTEmJiFzdHJuY21wKGJ1ZiwiI2VsaWYiLDUpKQorCWZwdXRzKCJpbGxlZ2FsICNlbGlmIGZvdW5kIixzdGRlcnIpOworICAgICAgaWYobmVzdD09MCkKKwlmcHV0cyhidWYsc3Rkb3V0KTsKKyAgICAgIGVsc2UKKwlwdXRzKCIvKiByZW1vdmVkICovIik7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9wYXJzZV9leHByLmMgYi9wYXJzZV9leHByLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2OWMwNwotLS0gL2Rldi9udWxsCisrKyBiL3BhcnNlX2V4cHIuYwpAQCAtMCwwICsxLDEwNTAgQEAKKy8qICAkVkVSOiB2YmNjIChwYXJzZV9leHByLmMpICRSZXZpc2lvbjogMS4yMiAkICAqLworCisjaW5jbHVkZSAidmJjY19jcHAuaCIKKyNpbmNsdWRlICJ2YmMuaCIKKworc3RhdGljIGNoYXIgRklMRV9bXT1fX0ZJTEVfXzsKKworbnAgbmV3X25vZGUodm9pZCkKK3sKKyAgbnAgcD1teW1hbGxvYyhOT0RFUyk7CisgIHAtPmZsYWdzPTA7CisgIHAtPmx2YWx1ZT0wOworICBwLT5zaWRlZng9MDsKKyAgcC0+bnR5cD0wOworICBwLT5sZWZ0PTA7CisgIHAtPnJpZ2h0PTA7CisgIHAtPmFsaXN0PTA7CisgIHAtPmlkZW50aWZpZXI9MDsKKyAgcC0+by5mbGFncz0wOworICByZXR1cm4gcDsKK30KKworbnAgZXhwcmVzc2lvbih2b2lkKQorLyogIEtvbW1hLUF1c2RydWVja2UgICovCit7CisgIG5wIGxlZnQscmlnaHQsbmV3OworICBsZWZ0PWFzc2lnbm1lbnRfZXhwcmVzc2lvbigpOworICBpZighbGVmdC0+ZmxhZ3MpIHJldHVybiAwOworICBraWxsc3AoKTsKKyAgd2hpbGUoY3Rvay0+dHlwZT09Q09NTUEpeworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgIG5leHRfdG9rZW4oKTsKKyAgICBraWxsc3AoKTsKKyAgICByaWdodD1hc3NpZ25tZW50X2V4cHJlc3Npb24oKTsKKyAgICBuZXc9bmV3X25vZGUoKTsKKyAgICBuZXctPmxlZnQ9bGVmdDsKKyAgICBuZXctPnJpZ2h0PXJpZ2h0OworICAgIG5ldy0+bnR5cD0wOworICAgIG5ldy0+ZmxhZ3M9S09NTUE7CisgICAgbGVmdD1uZXc7CisgICAga2lsbHNwKCk7CisgIH0KKyAgcmV0dXJuIGxlZnQ7Cit9CitucCBhc3NpZ25tZW50X2V4cHJlc3Npb24odm9pZCkKKy8qICBadXdlaXN1bmdzYXVzZHJ1ZWNrZSAgKi8KK3sKKyAgbnAgbGVmdCxuZXc7aW50IGM9QVNTSUdOT1Asb3A7CisgIGxlZnQ9Y29uZGl0aW9uYWxfZXhwcmVzc2lvbigpOworICBraWxsc3AoKTsKKyAgc3dpdGNoKGN0b2stPnR5cGUpeworICBjYXNlIEFTR046IGM9QVNTSUdOO2JyZWFrOworICBjYXNlIEFTU1RBUjogb3A9TVVMVDticmVhazsKKyAgY2FzZSBBU1NMQVNIOiBvcD1ESVY7YnJlYWs7CisgIGNhc2UgQVNQQ1Q6IG9wPU1PRDticmVhazsKKyAgY2FzZSBBU1BMVVM6IG9wPUFERDticmVhazsKKyAgY2FzZSBBU01JTlVTOiBvcD1TVUI7YnJlYWs7CisgIGNhc2UgQVNBTkQ6IG9wPUFORDticmVhazsKKyAgY2FzZSBBU0NJUkM6IG9wPVhPUjticmVhazsKKyAgY2FzZSBBU09SOiBvcD1PUjticmVhazsKKyAgY2FzZSBBU0xTSDogb3A9TFNISUZUO2JyZWFrOworICBjYXNlIEFTUlNIOiBvcD1SU0hJRlQ7YnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGxlZnQ7CisgIH0KKyAgbmV4dF90b2tlbigpOworICBuZXc9bmV3X25vZGUoKTsKKyAgbmV3LT5sZWZ0PWxlZnQ7CisgIG5ldy0+bnR5cD0wOworICBpZihjPT1BU1NJR04peworICAgIG5ldy0+cmlnaHQ9YXNzaWdubWVudF9leHByZXNzaW9uKCk7CisgICAgbmV3LT5mbGFncz1BU1NJR047CisgIH1lbHNleworICAgIC8qICBBU1NJR05PUChhLGIpLT5BU1NJR04oYSxPUChhLGIpKSAgICAqLworICAgIG5ldy0+ZmxhZ3M9QVNTSUdOT1A7ICAgIC8qIG51ciB1bSB6dW0gTWVya2VuLCBkYXNzIG51ciBlaW5tYWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhdXNnZXdlcnRldCB3ZXJkZW4gZGFyZiAgICAgICAgICAgICovCisgICAgbmV3LT5yaWdodD1uZXdfbm9kZSgpOworICAgIG5ldy0+cmlnaHQtPmxlZnQ9bGVmdDsKKyAgICBuZXctPnJpZ2h0LT5yaWdodD1hc3NpZ25tZW50X2V4cHJlc3Npb24oKTsKKyAgICBuZXctPnJpZ2h0LT5udHlwPTA7CisgICAgbmV3LT5yaWdodC0+ZmxhZ3M9b3A7CisgIH0KKyAgcmV0dXJuIG5ldzsKK30KK25wIGNvbmRpdGlvbmFsX2V4cHJlc3Npb24odm9pZCkKKy8qICBFcmxlZGlndCA/IDogICAqLworeworICBucCBsZWZ0LG5ldzsKKyAgbGVmdD1sb2dpY2FsX29yX2V4cHJlc3Npb24oKTsKKyAga2lsbHNwKCk7CisgIGlmKGN0b2stPnR5cGU9PVFVRVNUKXsgICAKKyAgICBuZXh0X3Rva2VuKCk7a2lsbHNwKCk7CisgICAgbmV3PW5ld19ub2RlKCk7CisgICAgbmV3LT5mbGFncz1DT05EOworICAgIG5ldy0+bnR5cD0wOworICAgIG5ldy0+bGVmdD1sZWZ0OworICAgIG5ldy0+cmlnaHQ9bmV3X25vZGUoKTsKKyAgICBuZXctPnJpZ2h0LT5mbGFncz1DT0xPTjsKKyAgICBuZXctPnJpZ2h0LT5udHlwPTA7CisgICAgbmV3LT5yaWdodC0+bGVmdD1leHByZXNzaW9uKCk7CisgICAga2lsbHNwKCk7CisgICAgaWYoY3Rvay0+dHlwZT09VF9DT0xPTil7bmV4dF90b2tlbigpO2tpbGxzcCgpO30gZWxzZSBlcnJvcig3MCk7CisgICAgbmV3LT5yaWdodC0+cmlnaHQ9Y29uZGl0aW9uYWxfZXhwcmVzc2lvbigpOworICAgIGxlZnQ9bmV3OworICAgIGtpbGxzcCgpOworICB9CisgIHJldHVybiBsZWZ0OworfQorbnAgbG9naWNhbF9vcl9leHByZXNzaW9uKHZvaWQpCisvKiAgRXJsZWRpZ3QgfHwgICovCit7CisgIG5wIGxlZnQscmlnaHQsbmV3O2ludCBicmE7CisgIGlmKGN0b2stPnR5cGU9PUxQQVIpIGJyYT0xOyBlbHNlIGJyYT0wOworICBsZWZ0PWxvZ2ljYWxfYW5kX2V4cHJlc3Npb24oKTsKKyAga2lsbHNwKCk7CisgIHdoaWxlKGN0b2stPnR5cGU9PVRfTE9SKXsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICBuZXh0X3Rva2VuKCk7CisgICAga2lsbHNwKCk7CisgICAgaWYoY3Rvay0+dHlwZT09TFBBUikgYnJhPTE7IGVsc2UgYnJhPTA7CisgICAgcmlnaHQ9bG9naWNhbF9hbmRfZXhwcmVzc2lvbigpOworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgIG5ldz1uZXdfbm9kZSgpOworICAgIG5ldy0+bGVmdD1sZWZ0OworICAgIG5ldy0+cmlnaHQ9cmlnaHQ7CisgICAgbmV3LT5mbGFncz1MT1I7CisgICAgbmV3LT5udHlwPTA7CisgICAgbGVmdD1uZXc7CisgICAga2lsbHNwKCk7CisgICAgaWYoY3Rvay0+dHlwZT09VF9MQU5EKSBlcnJvcigyMjIpOworICB9CisgIHJldHVybiBsZWZ0OworfQorbnAgbG9naWNhbF9hbmRfZXhwcmVzc2lvbih2b2lkKQorLyogIEVybGVkaWd0ICYmICAqLworeworICBucCBsZWZ0LHJpZ2h0LG5ldztpbnQgYnJhOworICBpZihjdG9rLT50eXBlPT1MUEFSKSBicmE9MTsgZWxzZSBicmE9MDsKKyAgbGVmdD1pbmNsdXNpdmVfb3JfZXhwcmVzc2lvbigpOworICBraWxsc3AoKTsKKyAgd2hpbGUoY3Rvay0+dHlwZT09VF9MQU5EKXsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICBuZXh0X3Rva2VuKCk7CisgICAga2lsbHNwKCk7CisgICAgaWYoY3Rvay0+dHlwZT09TFBBUikgYnJhPTE7IGVsc2UgYnJhPTA7CisgICAgcmlnaHQ9aW5jbHVzaXZlX29yX2V4cHJlc3Npb24oKTsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICBuZXc9bmV3X25vZGUoKTsKKyAgICBuZXctPmxlZnQ9bGVmdDsKKyAgICBuZXctPnJpZ2h0PXJpZ2h0OworICAgIG5ldy0+ZmxhZ3M9TEFORDsKKyAgICBuZXctPm50eXA9MDsKKyAgICBsZWZ0PW5ldzsKKyAgICBraWxsc3AoKTsKKyAgICBpZihjdG9rLT50eXBlPT1UX0xPUikgZXJyb3IoMjIyKTsKKyAgfQorICByZXR1cm4gbGVmdDsKK30KK25wIGluY2x1c2l2ZV9vcl9leHByZXNzaW9uKHZvaWQpCisvKiAgRXJsZWRpZ3QgfCAgKi8KK3sKKyAgbnAgbGVmdCxyaWdodCxuZXc7CisgIGxlZnQ9ZXhjbHVzaXZlX29yX2V4cHJlc3Npb24oKTsKKyAga2lsbHNwKCk7CisgIHdoaWxlKGN0b2stPnR5cGU9PVRfT1IpeworICAgIG5leHRfdG9rZW4oKTsKKyAgICBraWxsc3AoKTsKKyAgICByaWdodD1leGNsdXNpdmVfb3JfZXhwcmVzc2lvbigpOworICAgIG5ldz1uZXdfbm9kZSgpOworICAgIG5ldy0+bGVmdD1sZWZ0OworICAgIG5ldy0+cmlnaHQ9cmlnaHQ7CisgICAgbmV3LT5mbGFncz1PUjsKKyAgICBuZXctPm50eXA9MDsKKyAgICBsZWZ0PW5ldzsKKyAgICBraWxsc3AoKTsKKyAgfQorICByZXR1cm4gbGVmdDsKK30KK25wIGV4Y2x1c2l2ZV9vcl9leHByZXNzaW9uKHZvaWQpCisvKiAgRXJsZWRpZ3QgXiAgKi8KK3sKKyAgbnAgbGVmdCxyaWdodCxuZXc7CisgIGxlZnQ9YW5kX2V4cHJlc3Npb24oKTsKKyAga2lsbHNwKCk7CisgIHdoaWxlKGN0b2stPnR5cGU9PUNJUkMpeworICAgIG5leHRfdG9rZW4oKTsKKyAgICBraWxsc3AoKTsKKyAgICByaWdodD1hbmRfZXhwcmVzc2lvbigpOworICAgIG5ldz1uZXdfbm9kZSgpOworICAgIG5ldy0+bGVmdD1sZWZ0OworICAgIG5ldy0+cmlnaHQ9cmlnaHQ7CisgICAgbmV3LT5mbGFncz1YT1I7CisgICAgbmV3LT5udHlwPTA7CisgICAgbGVmdD1uZXc7CisgICAga2lsbHNwKCk7CisgIH0KKyAgcmV0dXJuIGxlZnQ7Cit9CitucCBhbmRfZXhwcmVzc2lvbih2b2lkKQorCisvKiAgRXJsZWRpZ3QgJiAgKi8KK3sKKyAgbnAgbGVmdCxyaWdodCxuZXc7CisgIGxlZnQ9ZXF1YWxpdHlfZXhwcmVzc2lvbigpOworICBraWxsc3AoKTsKKyAgd2hpbGUoY3Rvay0+dHlwZT09VF9BTkQpeworICAgIG5leHRfdG9rZW4oKTsKKyAgICBraWxsc3AoKTsKKyAgICByaWdodD1lcXVhbGl0eV9leHByZXNzaW9uKCk7CisgICAgbmV3PW5ld19ub2RlKCk7CisgICAgbmV3LT5sZWZ0PWxlZnQ7CisgICAgbmV3LT5yaWdodD1yaWdodDsKKyAgICBuZXctPmZsYWdzPUFORDsKKyAgICBuZXctPm50eXA9MDsKKyAgICBsZWZ0PW5ldzsKKyAgICBraWxsc3AoKTsKKyAgfQorICByZXR1cm4gbGVmdDsKK30KK25wIGVxdWFsaXR5X2V4cHJlc3Npb24odm9pZCkKKy8qICBFcmxlZGlndCA9PSB1bmQgIT0gICovCit7CisgIG5wIGxlZnQscmlnaHQsbmV3O2ludCBjOworICBsZWZ0PXJlbGF0aW9uYWxfZXhwcmVzc2lvbigpOworICBraWxsc3AoKTsKKyAgd2hpbGUoY3Rvay0+dHlwZT09U0FNRXx8Y3Rvay0+dHlwZT09TkVRKXsKKyAgICBpZihjdG9rLT50eXBlPT1ORVEpIGM9SU5FUVVBTDsgZWxzZSBjPUVRVUFMOworICAgIG5leHRfdG9rZW4oKTsKKyAgICBraWxsc3AoKTsKKyAgICByaWdodD1yZWxhdGlvbmFsX2V4cHJlc3Npb24oKTsKKyAgICBuZXc9bmV3X25vZGUoKTsKKyAgICBuZXctPmxlZnQ9bGVmdDsKKyAgICBuZXctPnJpZ2h0PXJpZ2h0OworICAgIG5ldy0+ZmxhZ3M9YzsKKyAgICBuZXctPm50eXA9MDsKKyAgICBsZWZ0PW5ldzsKKyAgICBraWxsc3AoKTsKKyAgfQorICByZXR1cm4gbGVmdDsKK30KK25wIHJlbGF0aW9uYWxfZXhwcmVzc2lvbih2b2lkKQorLyogIEVybGVkaWd0IDwsPiw8PSw+PSAgKi8KK3sKKyAgbnAgbGVmdCxyaWdodCxuZXc7aW50IGM7CisgIGxlZnQ9c2hpZnRfZXhwcmVzc2lvbigpOworICBraWxsc3AoKTsKKyAgd2hpbGUoY3Rvay0+dHlwZT09TFR8fGN0b2stPnR5cGU9PUdUfHxjdG9rLT50eXBlPT1MRVF8fGN0b2stPnR5cGU9PUdFUSl7CisgICAgaWYoY3Rvay0+dHlwZT09TFQpIGM9TEVTUzsKKyAgICBlbHNlIGlmKGN0b2stPnR5cGU9PUdUKSBjPUdSRUFURVI7CisgICAgZWxzZSBpZihjdG9rLT50eXBlPT1MRVEpIGM9TEVTU0VROworICAgIGVsc2UgYz1HUkVBVEVSRVE7CisgICAgbmV4dF90b2tlbigpOworICAgIGtpbGxzcCgpOworICAgIHJpZ2h0PXNoaWZ0X2V4cHJlc3Npb24oKTsKKyAgICBuZXc9bmV3X25vZGUoKTsKKyAgICBuZXctPmxlZnQ9bGVmdDsKKyAgICBuZXctPnJpZ2h0PXJpZ2h0OworICAgIG5ldy0+ZmxhZ3M9YzsKKyAgICBuZXctPm50eXA9MDsKKyAgICBsZWZ0PW5ldzsKKyAgICBraWxsc3AoKTsKKyAgfQorICByZXR1cm4gbGVmdDsKK30KK25wIHNoaWZ0X2V4cHJlc3Npb24odm9pZCkKKy8qICBFcmxlZGlndCA8PCw+PiAgKi8KK3sKKyAgbnAgbGVmdCxyaWdodCxuZXc7aW50IGM7CisgIGxlZnQ9YWRkaXRpdmVfZXhwcmVzc2lvbigpOworICBraWxsc3AoKTsKKyAgd2hpbGUoY3Rvay0+dHlwZT09TFNIfHxjdG9rLT50eXBlPT1SU0gpeworICAgIGlmKGN0b2stPnR5cGU9PUxTSCkKKyAgICAgIGM9TFNISUZUOyAKKyAgICBlbHNlCisgICAgICBjPVJTSElGVDsKKyAgICBuZXh0X3Rva2VuKCk7CisgICAga2lsbHNwKCk7CisgICAgcmlnaHQ9YWRkaXRpdmVfZXhwcmVzc2lvbigpOworICAgIG5ldz1uZXdfbm9kZSgpOworICAgIG5ldy0+bGVmdD1sZWZ0OworICAgIG5ldy0+cmlnaHQ9cmlnaHQ7CisgICAgbmV3LT5mbGFncz1jOworICAgIG5ldy0+bnR5cD0wOworICAgIGxlZnQ9bmV3OworICAgIGtpbGxzcCgpOworICB9CisgIHJldHVybiBsZWZ0OworfQorbnAgYWRkaXRpdmVfZXhwcmVzc2lvbih2b2lkKQorLyogIEVybGVkaWd0ICssLSAgKi8KK3sKKyAgbnAgbGVmdCxyaWdodCxuZXc7aW50IGM7CisgIGxlZnQ9bXVsdGlwbGljYXRpdmVfZXhwcmVzc2lvbigpOworICBraWxsc3AoKTsKKyAgd2hpbGUoY3Rvay0+dHlwZT09UExVU3x8Y3Rvay0+dHlwZT09VF9NSU5VUyl7CisgICAgaWYoY3Rvay0+dHlwZT09UExVUykgYz1BREQ7IGVsc2UgYz1TVUI7CisgICAgbmV4dF90b2tlbigpO2tpbGxzcCgpOworICAgIHJpZ2h0PW11bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24oKTsKKyAgICBuZXc9bmV3X25vZGUoKTsKKyAgICBuZXctPmxlZnQ9bGVmdDsKKyAgICBuZXctPnJpZ2h0PXJpZ2h0OworICAgIG5ldy0+ZmxhZ3M9YzsKKyAgICBuZXctPm50eXA9MDsKKyAgICBsZWZ0PW5ldzsKKyAgICBraWxsc3AoKTsKKyAgfQorICByZXR1cm4gbGVmdDsKK30KK25wIG11bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24odm9pZCkKKy8qICBFcmxlZGlndCAqLC8sJSAgKi8KK3sKKyAgbnAgbGVmdCxyaWdodCxuZXc7aW50IGM7CisgIGxlZnQ9Y2FzdF9leHByZXNzaW9uKCk7CisgIGtpbGxzcCgpOworICB3aGlsZShjdG9rLT50eXBlPT1TVEFSfHxjdG9rLT50eXBlPT1TTEFTSHx8Y3Rvay0+dHlwZT09UENUKXsKKyAgICBpZihjdG9rLT50eXBlPT1TVEFSKSBjPU1VTFQ7IAorICAgIGVsc2UgaWYoY3Rvay0+dHlwZT09U0xBU0gpIGM9RElWOyAKKyAgICBlbHNlIGM9TU9EOworICAgIG5leHRfdG9rZW4oKTtraWxsc3AoKTsKKyAgICByaWdodD1jYXN0X2V4cHJlc3Npb24oKTsKKyAgICBuZXc9bmV3X25vZGUoKTsKKyAgICBuZXctPmxlZnQ9bGVmdDsKKyAgICBuZXctPnJpZ2h0PXJpZ2h0OworICAgIG5ldy0+ZmxhZ3M9YzsKKyAgICBuZXctPm50eXA9MDsKKyAgICBsZWZ0PW5ldzsKKyAgICBraWxsc3AoKTsKKyAgfQorICByZXR1cm4gbGVmdDsKK30KK25wIGNhc3RfZXhwcmVzc2lvbih2b2lkKQorLyogIEVybGVkaWd0ICh0eXApICAqLworeworICBucCBuZXc7Y2hhciAqaW1lcmssYnVmZltNQVhJXTsKKyAga2lsbHNwKCk7CisgIGlmKGN0b2stPnR5cGUhPUxQQVJ8fCFkZWNsYXJhdGlvbigxKSkgcmV0dXJuIHVuYXJ5X2V4cHJlc3Npb24oKTsKKyAgbmV4dF90b2tlbigpO2tpbGxzcCgpOworICBuZXc9bmV3X25vZGUoKTsKKyAgbmV3LT5yaWdodD0wOworICBidWZmWzBdPTA7CisgIGltZXJrPWlkZW50O2lkZW50PWJ1ZmY7CisgIG5ldy0+bnR5cD1kZWNsYXJhdG9yKGRlY2xhcmF0aW9uX3NwZWNpZmllcnMoKSk7CisgIGlkZW50PWltZXJrOworICBpZihidWZmWzBdKSBlcnJvcigzNTYpOworICBraWxsc3AoKTsKKyAgaWYoY3Rvay0+dHlwZSE9UlBBUikgZXJyb3IoNTkpOyBlbHNlIG5leHRfdG9rZW4oKTsKKyAga2lsbHNwKCk7CisgIGlmKGM5OSYmY3Rvay0+dHlwZT09TEJSQSl7CisgICAgLyogY29tcHVuZCBsaXRlcmFscyAqLworICAgIGluaXRfZHluX2NudD0wOworICAgIG5ldy0+Y2w9aW5pdGlhbGl6YXRpb24obmV3LT5udHlwLG5lc3RpbmchPTAsMCwwLDAsMCk7CisgICAga2lsbHNwKCk7CisgICAgaWYobmV3LT5jbCl7CisgICAgICBpZihJU0FSUkFZKG5ldy0+bnR5cC0+ZmxhZ3MpJiZ6bWVxdG8obmV3LT5udHlwLT5zaXplLGwyem0oMEwpKSl7CisJY29uc3RfbGlzdCAqcD1uZXctPmNsOworCXdoaWxlKHApe25ldy0+bnR5cC0+c2l6ZT16bWFkZChwLT5pZHgsbDJ6bSgxTCkpO3A9cC0+bmV4dDt9CisgICAgICB9CisgICAgfQorICAgIG5ldy0+ZmxhZ3M9TElURVJBTDsKKyAgICBuZXctPmxlZnQ9MDsKKyAgICBuZXctPnZhbC52bWF4PWwyem0oKGxvbmcpaW5pdF9keW5fY250KTsKKyAgfWVsc2V7CisgICAgbmV3LT5mbGFncz1DQVNUOworICAgIG5ldy0+bGVmdD1jYXN0X2V4cHJlc3Npb24oKTsKKyAgfQorICByZXR1cm4gbmV3OworfQorbnAgdW5hcnlfZXhwcmVzc2lvbih2b2lkKQorLyogIEVybGVkaWd0ICEsfiwrKywtLSwrLC0sKiwmLHNpemVvZixfX3R5cGVvZiAgKi8KK3sKKyAgbnAgbmV3O2NoYXIgKm1lcms7CisgIGtpbGxzcCgpOworICBpZihjdG9rLT50eXBlIT1OQU1FJiZjdG9rLT50eXBlIT1QTFVTJiZjdG9rLT50eXBlIT1QUExVUyYmY3Rvay0+dHlwZSE9VF9NSU5VUyYmY3Rvay0+dHlwZSE9TU1JTlVTJiZjdG9rLT50eXBlIT1UX0FORCYmY3Rvay0+dHlwZSE9U1RBUiYmY3Rvay0+dHlwZSE9Tk9UJiZjdG9rLT50eXBlIT1MTk9UKQorICAgIHJldHVybiBwb3N0Zml4X2V4cHJlc3Npb24oKTsKKyAgaWYoY3Rvay0+dHlwZT09TkFNRSl7CisgICAgZW51bSB7U0laRU9GLFRZUEVPRixBTElHTk9GLE9GRlNFVE9GfSBvcDsKKyAgICBpZihzdHJjbXAoInNpemVvZiIsY3Rvay0+bmFtZSkmJnN0cmNtcCgiX190eXBlb2YiLGN0b2stPm5hbWUpJiZzdHJjbXAoIl9fYWxpZ25vZiIsY3Rvay0+bmFtZSkmJnN0cmNtcCgiX19vZmZzZXRvZiIsY3Rvay0+bmFtZSkpeworICAgICAgcmV0dXJuIHBvc3RmaXhfZXhwcmVzc2lvbigpOworICAgIH1lbHNleworICAgICAgaWYoKmN0b2stPm5hbWU9PSdzJykgCisJb3A9U0laRU9GOyAKKyAgICAgIGVsc2UgaWYoY3Rvay0+bmFtZVsyXT09J2EnKSAKKwlvcD1BTElHTk9GOworICAgICAgZWxzZSBpZihjdG9rLT5uYW1lWzJdPT0ndCcpCisJb3A9VFlQRU9GOworICAgICAgZWxzZQorCW9wPU9GRlNFVE9GOworICAgICAgbmV4dF90b2tlbigpOworICAgICAga2lsbHNwKCk7CisgICAgICBuZXc9bmV3X25vZGUoKTsKKyAgICAgIG5ldy0+ZmxhZ3M9Q0VYUFI7CisgICAgICBuZXctPm50eXA9bmV3X3R5cCgpOworICAgICAgaWYob3A9PVNJWkVPRnx8b3A9PU9GRlNFVE9GKXsKKwlpZihIQVZFX0lOVF9TSVpFVCkKKwkgIG5ldy0+bnR5cC0+ZmxhZ3M9KFVOU0lHTkVEfElOVCk7CisJZWxzZQorCSAgbmV3LT5udHlwLT5mbGFncz0oVU5TSUdORUR8TE9ORyk7CisgICAgICB9ZWxzZQorCW5ldy0+bnR5cC0+ZmxhZ3M9SU5UOworICAgICAgbmV3LT5yaWdodD0wOworICAgICAgbmV3LT5sZWZ0PTA7CisgICAgICAKKyAgICAgIGlmKGN0b2stPnR5cGU9PUxQQVImJmRlY2xhcmF0aW9uKDEpKXsKKwl0eXBlICp0OworCW5leHRfdG9rZW4oKTtraWxsc3AoKTsKKwlidWZmWzBdPTA7CisJbWVyaz1pZGVudDtpZGVudD1idWZmOworCXQ9ZGVjbGFyYXRvcihkZWNsYXJhdGlvbl9zcGVjaWZpZXJzKCkpOworCWlmKHR5cGVfdW5jb21wbGV0ZSh0KSkgZXJyb3IoMTc2KTsKKwlpZGVudD1tZXJrOworCWlmKGJ1ZmZbMF0pIGVycm9yKDM1Nik7CisJaWYob3A9PU9GRlNFVE9GKXsKKwkgIGlmKGN0b2stPnR5cGU9PUNPTU1BKQorCSAgICBuZXh0X3Rva2VuKCk7CisJICBlbHNlCisJICAgIGVycm9yKDU3KTsKKwkgIGlmKGN0b2stPnR5cGUhPU5BTUUpIGVycm9yKDc2KTsKKwkgIGlmKHQtPmZsYWdzIT1TVFJVQ1QpeworCSAgICBlcnJvcigzMTApOworCSAgICB2dW1heD11bDJ6dW0oMFVMKTsKKwkgIH1lbHNlCisJICAgIHZ1bWF4PXptMnp1bShzdHJ1Y3Rfb2Zmc2V0KHQtPmV4YWN0LGN0b2stPm5hbWUpKTsKKwkgIG5leHRfdG9rZW4oKTsKKwkgIGlmKEhBVkVfSU5UX1NJWkVUKQorCSAgICBuZXctPnZhbC52dWludD16dW0yenVpKHZ1bWF4KTsKKwkgIGVsc2UKKwkgICAgbmV3LT52YWwudnVsb25nPXp1bTJ6dWwodnVtYXgpOworCX1lbHNlIGlmKG9wPT1TSVpFT0YpeworCSAgaWYoaXNfdmxlbmd0aCh0KSl7CisJICAgIG5ldy0+ZHNpemU9dmxlbmd0aF9zem9mKHQpOworCSAgICBuZXctPmZsYWdzPUlERU5USUZJRVI7CisJICAgIG5ldy0+dmFsLnZtYXg9bDJ6bSgwTCk7CisJICAgIG5ldy0+c2lkZWZ4PTA7CisJICAgIG5ldy0+aWRlbnRpZmllcj1lbXB0eTsKKwkgIH1lbHNleworCSAgICBpZihIQVZFX0lOVF9TSVpFVCkKKwkgICAgICBuZXctPnZhbC52dWludD16dW0yenVpKHptMnp1bShzem9mKHQpKSk7CisJICAgIGVsc2UKKwkgICAgICBuZXctPnZhbC52dWxvbmc9enVtMnp1bCh6bTJ6dW0oc3pvZih0KSkpOworCSAgfQorCX1lbHNlIGlmKG9wPT1BTElHTk9GKXsKKwkgIG5ldy0+dmFsLnZpbnQ9em0yemkoZmFsaWduKHQpKTsKKwl9ZWxzZSBpZihvcD09VFlQRU9GKXsKKwkgIG5ldy0+dmFsLnZpbnQ9em0yemkobDJ6bSh0LT5mbGFncykpOworCX0KKwlmcmVldHlwKHQpOworCWtpbGxzcCgpOworCWlmKGN0b2stPnR5cGUhPVJQQVIpIGVycm9yKDU5KTsgZWxzZSBuZXh0X3Rva2VuKCk7CisgICAgICB9ZWxzZXsKKwlucCB0cmVlOworCWlmKG9wPT1PRkZTRVRPRikgZXJyb3IoMCk7CisJa2lsbHNwKCk7CisJdHJlZT11bmFyeV9leHByZXNzaW9uKCk7CisJaWYoIXRyZWV8fCF0eXBlX2V4cHJlc3Npb24odHJlZSwwKSl7CisJICBpZihvcD09U0laRU9GKXsKKwkgICAgaWYoSEFWRV9JTlRfU0laRVQpCisJICAgICAgbmV3LT52YWwudnVpbnQ9enVtMnp1aSh1bDJ6dW0oMFVMKSk7CisJICAgIGVsc2UKKwkgICAgICBuZXctPnZhbC52dWxvbmc9enVtMnp1bCh1bDJ6dW0oMFVMKSk7CisJICAgIGVycm9yKDczKTsKKwkgIH1lbHNleworCSAgICBuZXctPnZhbC52aW50PXptMnppKGwyem0oLTFMKSk7CisJICB9CisJfWVsc2V7CisJICBpZihvcD09U0laRU9GKXsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKwkJaWYodHlwZV91bmNvbXBsZXRlKHRyZWUtPm50eXApKSBlcnJvcigxNzYpOworCSAgICBpZihpc192bGVuZ3RoKHRyZWUtPm50eXApKXsKKwkgICAgICBuZXctPmRzaXplPXZsZW5ndGhfc3pvZih0cmVlLT5udHlwKTsKKwkgICAgICBuZXctPmZsYWdzPUlERU5USUZJRVI7CisJICAgICAgbmV3LT52YWwudm1heD1sMnptKDBMKTsKKwkgICAgICBuZXctPnNpZGVmeD0wOworCSAgICAgIG5ldy0+aWRlbnRpZmllcj1lbXB0eTsKKwkgICAgfWVsc2V7CisJICAgICAgaWYoSEFWRV9JTlRfU0laRVQpCisJCW5ldy0+dmFsLnZ1aW50PXp1bTJ6dWkoem0yenVtKHN6b2YodHJlZS0+bnR5cCkpKTsKKwkgICAgICBlbHNlCisJCW5ldy0+dmFsLnZ1bG9uZz16dW0yenVsKHptMnp1bShzem9mKHRyZWUtPm50eXApKSk7CisJICAgIH0KKwkgIH1lbHNleworCSAgICBpZihvcD09QUxJR05PRikKKwkgICAgICBuZXctPnZhbC52aW50PXptMnppKGZhbGlnbih0cmVlLT5udHlwKSk7CisJICAgIGVsc2UKKwkgICAgICBuZXctPnZhbC52aW50PXptMnppKGwyem0odHJlZS0+bnR5cC0+ZmxhZ3MpKTsKKwkgIH0KKwl9CisJaWYodHJlZSkgZnJlZV9leHByZXNzaW9uKHRyZWUpO2tpbGxzcCgpOworICAgICAgfQorICAgICAgcmV0dXJuIG5ldzsKKyAgICB9CisgIH0KKyAgbmV3PW5ld19ub2RlKCk7CisgIG5ldy0+cmlnaHQ9MDsKKyAgbmV3LT5udHlwPTA7CisgIGlmKGN0b2stPnR5cGU9PVBMVVMpeworICAgIG5leHRfdG9rZW4oKTsKKyAgICBmcmVlKG5ldyk7CisgICAgcmV0dXJuIGNhc3RfZXhwcmVzc2lvbigpOworICB9ZWxzZSBpZihjdG9rLT50eXBlPT1UX01JTlVTKXsKKyAgICBuZXh0X3Rva2VuKCk7CisgICAgbmV3LT5sZWZ0PWNhc3RfZXhwcmVzc2lvbigpOworICAgIG5ldy0+ZmxhZ3M9TUlOVVM7ICAgIAorICB9ZWxzZSBpZihjdG9rLT50eXBlPT1QUExVUyl7CisgICAgbmV4dF90b2tlbigpOworICAgIG5ldy0+bGVmdD11bmFyeV9leHByZXNzaW9uKCk7CisgICAgbmV3LT5mbGFncz1QUkVJTkM7CisgIH1lbHNlIGlmKGN0b2stPnR5cGU9PU1NSU5VUyl7CisgICAgbmV4dF90b2tlbigpOworICAgIG5ldy0+bGVmdD11bmFyeV9leHByZXNzaW9uKCk7CisgICAgbmV3LT5mbGFncz1QUkVERUM7CisgIH1lbHNlIGlmKGN0b2stPnR5cGU9PVRfQU5EKXsKKyAgICBuZXh0X3Rva2VuKCk7CisgICAgbmV3LT5sZWZ0PWNhc3RfZXhwcmVzc2lvbigpOworICAgIG5ldy0+ZmxhZ3M9QUREUkVTUzsKKyAgfWVsc2UgaWYoY3Rvay0+dHlwZT09U1RBUil7CisgICAgbmV4dF90b2tlbigpOworICAgIG5ldy0+bGVmdD1jYXN0X2V4cHJlc3Npb24oKTsKKyAgICBuZXctPmZsYWdzPUNPTlRFTlQ7CisgIH1lbHNlIGlmKGN0b2stPnR5cGU9PU5PVCl7CisgICAgbmV4dF90b2tlbigpOworICAgIG5ldy0+bGVmdD1jYXN0X2V4cHJlc3Npb24oKTsKKyAgICBuZXctPmZsYWdzPUtPTVBMRU1FTlQ7CisgIH1lbHNlIGlmKGN0b2stPnR5cGU9PUxOT1QpeworICAgIG5leHRfdG9rZW4oKTsKKyAgICBuZXctPmxlZnQ9Y2FzdF9leHByZXNzaW9uKCk7CisgICAgbmV3LT5mbGFncz1ORUdBVElPTjsKKyAgfQorICBuZXctPnJpZ2h0PTA7CisgIG5ldy0+bnR5cD0wOworICByZXR1cm4gbmV3OworfQorbnAgcG9zdGZpeF9leHByZXNzaW9uKHZvaWQpCisvKiAgRXJsZWRpZ3QgW10sKCksLiwtPiwrKywtLSAgKi8KK3sKKyAgbnAgbmV3LGxlZnQ7CisgIGxlZnQ9cHJpbWFyeV9leHByZXNzaW9uKCk7CisgIGtpbGxzcCgpOworICB3aGlsZShjdG9rLT50eXBlPT1MQlJLfHxjdG9rLT50eXBlPT1MUEFSfHxjdG9rLT50eXBlPT1ET1R8fGN0b2stPnR5cGU9PUFSUk9XfHxjdG9rLT50eXBlPT1QUExVU3x8Y3Rvay0+dHlwZT09TU1JTlVTKXsKKyAgICBuZXc9bmV3X25vZGUoKTsKKyAgICBuZXctPm50eXA9MDsKKyAgICBuZXctPnJpZ2h0PTA7CisgICAgbmV3LT5sZWZ0PWxlZnQ7CisgICAgaWYoY3Rvay0+dHlwZT09TU1JTlVTKXsKKyAgICAgIG5leHRfdG9rZW4oKTsKKyAgICAgIG5ldy0+ZmxhZ3M9UE9TVERFQzsKKyAgICB9ZWxzZSBpZihjdG9rLT50eXBlPT1BUlJPVyl7CisgICAgICBuZXh0X3Rva2VuKCk7IGtpbGxzcCgpOworICAgICAgbmV3LT5mbGFncz1EU1RSVUNUOworICAgICAgbmV3LT5yaWdodD1pZGVudGlmaWVyX2V4cHJlc3Npb24oKTsKKyAgICAgIG5ldy0+cmlnaHQtPmZsYWdzPU1FTUJFUjsKKyAgICAgIG5ldy0+bGVmdD1uZXdfbm9kZSgpOworICAgICAgbmV3LT5sZWZ0LT5udHlwPTA7CisgICAgICBuZXctPmxlZnQtPmxlZnQ9bGVmdDsKKyAgICAgIG5ldy0+bGVmdC0+cmlnaHQ9MDsKKyAgICAgIG5ldy0+bGVmdC0+ZmxhZ3M9Q09OVEVOVDsKKyAgICB9ZWxzZSBpZihjdG9rLT50eXBlPT1MQlJLKXsKKyAgICAgIG5leHRfdG9rZW4oKTsga2lsbHNwKCk7CisgICAgICBuZXctPmZsYWdzPUNPTlRFTlQ7CisgICAgICBuZXctPmxlZnQ9bmV3X25vZGUoKTsKKyAgICAgIG5ldy0+bGVmdC0+ZmxhZ3M9QUREOworICAgICAgbmV3LT5sZWZ0LT5udHlwPTA7CisgICAgICBuZXctPmxlZnQtPmxlZnQ9bGVmdDsKKyAgICAgIG5ldy0+bGVmdC0+cmlnaHQ9ZXhwcmVzc2lvbigpOworICAgICAga2lsbHNwKCk7CisgICAgICBpZihjdG9rLT50eXBlIT1SQlJLKSBlcnJvcig2Mik7IGVsc2UgbmV4dF90b2tlbigpOworICAgIH1lbHNlIGlmKGN0b2stPnR5cGU9PVBQTFVTKXsKKyAgICAgIG5leHRfdG9rZW4oKTsKKyAgICAgIG5ldy0+ZmxhZ3M9UE9TVElOQzsKKyAgICB9ZWxzZSBpZihjdG9rLT50eXBlPT1ET1QpeworICAgICAgbmV4dF90b2tlbigpO2tpbGxzcCgpOworICAgICAgbmV3LT5yaWdodD1pZGVudGlmaWVyX2V4cHJlc3Npb24oKTsKKyAgICAgIG5ldy0+ZmxhZ3M9RFNUUlVDVDsKKyAgICAgIG5ldy0+cmlnaHQtPmZsYWdzPU1FTUJFUjsKKyAgICB9ZWxzZSBpZihjdG9rLT50eXBlPT1MUEFSKXsKKyAgICAgIGFyZ3VtZW50X2xpc3QgKmFsLCpmaXJzdF9hbGlzdD0wLCpsYXN0X2FsaXN0PTA7bnAgbjsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICAgIG5ldy0+bGVmdD1sZWZ0OworICAgICAgbmV3LT5mbGFncz1DQUxMOworICAgICAgbmV3LT5yaWdodD0wOworICAgICAgbmV3LT5hbGlzdD1hcmd1bWVudF9saXN0X2V4cHJlc3Npb24oKTsKKyAgICB9CisgICAgbGVmdD1uZXc7CisgICAga2lsbHNwKCk7CisgIH0KKyAgcmV0dXJuIGxlZnQ7Cit9Cithcmd1bWVudF9saXN0ICphcmd1bWVudF9saXN0X2V4cHJlc3Npb24odm9pZCkKKy8qIHJldHVybnMgQ0FMTCBub2RlIHdpdGggYWxpc3QgYXR0YWNoZWQsIGJ1dCB3aXRob3V0IGlkZW50aWZpZXIgKi8KK3sKKyAgYXJndW1lbnRfbGlzdCAqYWwsKmZpcnN0X2FsaXN0PTAsKmxhc3RfYWxpc3Q9MDtucCBuOworICBpZihjdG9rLT50eXBlIT1MUEFSKWllcnJvcigwKTsKKyAgbmV4dF90b2tlbigpO2tpbGxzcCgpOworICB3aGlsZShjdG9rLT50eXBlIT1SUEFSKXsKKyAgICBuPWFzc2lnbm1lbnRfZXhwcmVzc2lvbigpOworICAgIGFsPW15bWFsbG9jKHNpemVvZihhcmd1bWVudF9saXN0KSk7CisgICAgYWwtPmFyZz1uO2FsLT5uZXh0PTA7CisgICAgaWYobGFzdF9hbGlzdCl7CisgICAgICBsYXN0X2FsaXN0LT5uZXh0PWFsOworICAgICAgbGFzdF9hbGlzdD1hbDsKKyAgICB9ZWxzZXsKKyAgICAgIGxhc3RfYWxpc3Q9Zmlyc3RfYWxpc3Q9YWw7CisgICAgfQorICAgIGtpbGxzcCgpOworICAgIGlmKGN0b2stPnR5cGU9PUNPTU1BKXsKKyAgICAgIG5leHRfdG9rZW4oKTtraWxsc3AoKTsKKyAgICAgIGlmKGN0b2stPnR5cGU9PVJQQVIpIGVycm9yKDU5KTsKKyAgICB9ZWxzZSBpZihjdG9rLT50eXBlIT1SUEFSKSBlcnJvcig1Nyk7CisgIH0KKyAgaWYoY3Rvay0+dHlwZSE9UlBBUikgZXJyb3IoNTkpOyBlbHNlIG5leHRfdG9rZW4oKTsKKyAgcmV0dXJuIGZpcnN0X2FsaXN0OworfQorbnAgcHJpbWFyeV9leHByZXNzaW9uKHZvaWQpCisvKiAgcHJpbWFyeS1leHByZXNzaW9ucyAoS29uc3RhbnRlbixTdHJpbmdzLChleHByKSxJZGVudGlmaWVyKSAgKi8KK3sKKyAgbnAgbmV3O3Rva2VuIG10b2s7CisgIGlmKGN0b2stPnR5cGU9PU5VTUJFUikgcmV0dXJuIGNvbnN0YW50X2V4cHJlc3Npb24oKTsKKyAgaWYoY3Rvay0+dHlwZT09VF9TVFJJTkd8fGN0b2stPnR5cGU9PVRfQ0hBUikgcmV0dXJuIHN0cmluZ19leHByZXNzaW9uKCk7CisgIGlmKGN0b2stPnR5cGU9PUxQQVIpeworICAgIG5leHRfdG9rZW4oKTtraWxsc3AoKTsKKyAgICBuZXc9ZXhwcmVzc2lvbigpOworICAgIGtpbGxzcCgpOworICAgIGlmKGN0b2stPnR5cGUhPVJQQVIpIGVycm9yKDU5KTsgZWxzZSBuZXh0X3Rva2VuKCk7CisgICAgcmV0dXJuIG5ldzsKKyAgfQorICByZXR1cm4gaWRlbnRpZmllcl9leHByZXNzaW9uKCk7Cit9CisKK2NvbnN0X2xpc3QgKmNsX2Zyb21fc3RyaW5nKGNoYXIgKnN0YXJ0LCBjaGFyICplbmQpCit7CisgIGNvbnN0X2xpc3QgKnIsKmNsLCoqcHJldjtpbnQgaTsKKyAgcHJldj0mcjsKKyAgZm9yKGk9MDtpPGVuZC1zdGFydCsxO2krKyl7CisgICAgY2w9bXltYWxsb2MoQ0xTKTsKKyAgICBjbC0+bmV4dD0wOworICAgIGNsLT50cmVlPTA7CisgICAgY2wtPmlkeD1sMnptKChsb25nKWkpOworICAgIGNsLT52YWwudm1heD1sMnptKDBMKTsKKyAgICBjbC0+b3RoZXI9bXltYWxsb2MoQ0xTKTsKKyAgICBjbC0+b3RoZXItPm5leHQ9Y2wtPm90aGVyLT5vdGhlcj0wOworICAgIGNsLT5vdGhlci0+dHJlZT0wOworICAgIGNsLT5vdGhlci0+aWR4PWwyem0oMEwpOworICAgIGNsLT5vdGhlci0+dmFsLnZjaGFyPXptMnpjKGwyem0oKGxvbmcpc3RhcnRbaV0pKTsKKyAgICAqcHJldj1jbDsKKyAgICBwcmV2PSZjbC0+bmV4dDsKKyAgfQorICByZXR1cm4gcjsKK30KKworbnAgc3RyaW5nX2V4cHJlc3Npb24odm9pZCkKKy8qICBHaWJ0IFplaWdlciBhdWYgc3RyaW5nIG9kZXIgWmVpY2hlbmtvbnN0YW50ZSB6dXJ1ZWNrICAqLworeworICBucCBuZXc7IGNoYXIgZiwqcywqcDtpbnQgZmxhZyx2YWw7CisgIHptYXggem07enVtYXggenVtOworICBzdGF0aWMgY2hhciAqc3RyaW5nOworICBzdGF0aWMgc2l6ZV90IHNsZW47CisgIHA9c3RyaW5nOworICB3aGlsZSgxKXsKKyAgICBzPWN0b2stPm5hbWU7CisgICAgaWYoKnM9PSdMJykgeworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorCQlzKys7fSAgICAvKiAgTm9jaCBrZWluZSBlcndlaXRlcnRlbiBaZWljaGVuICAqLworICAgIGlmKGN0b2stPnR5cGU9PVRfU1RSSU5HJiYqcyE9J1wiJykgaWVycm9yKDApOworICAgIGlmKGN0b2stPnR5cGU9PVRfQ0hBUiYmKnMhPSdcJycpIGllcnJvcigwKTsKKyAgICBmPSpzKys7CisgICAgd2hpbGUoKnMhPWYmJipzIT0wKXsKKyAgICAgIHNpemVfdCBwb3M9cC1zdHJpbmc7CisgICAgICBpZihzbGVuPD1wb3MrMSl7CisJc2xlbis9MTI4OworCXN0cmluZz1teXJlYWxsb2Moc3RyaW5nLHNsZW4pOworCXA9c3RyaW5nK3BvczsKKyAgICAgIH0KKyAgICAgIGlmKCpzPT0nXFwnKXsKKwlzKys7CisJaWYoKnM9PSdcXCcpeypwKys9Q0hBUkNPTlYoJ1xcJyk7cysrO2NvbnRpbnVlO30KKwlpZigqcz09J24nKXsqcCsrPUNIQVJDT05WKCdcbicpO3MrKztjb250aW51ZTt9CisJaWYoKnM9PSd0Jyl7KnArKz1DSEFSQ09OVignXHQnKTtzKys7Y29udGludWU7fQorCWlmKCpzPT0ncicpeypwKys9Q0hBUkNPTlYoJ1xyJyk7cysrO2NvbnRpbnVlO30KKwlpZigqcz09J3YnKXsqcCsrPUNIQVJDT05WKCdcdicpO3MrKztjb250aW51ZTt9CisJaWYoKnM9PSdiJyl7KnArKz1DSEFSQ09OVignXGInKTtzKys7Y29udGludWU7fQorCWlmKCpzPT0nZicpeypwKys9Q0hBUkNPTlYoJ1xmJyk7cysrO2NvbnRpbnVlO30KKwlpZigqcz09J2EnKXsqcCsrPUNIQVJDT05WKCdcYScpO3MrKztjb250aW51ZTt9CisJaWYoKnM9PSdcPycpeypwKys9Q0hBUkNPTlYoJ1w/Jyk7cysrO2NvbnRpbnVlO30KKwlpZigqcz09J1wnJyl7KnArKz1DSEFSQ09OVignXCcnKTtzKys7Y29udGludWU7fQorCWlmKCpzPT0nXCInKXsqcCsrPUNIQVJDT05WKCdcIicpO3MrKztjb250aW51ZTt9CisJZmxhZz12YWw9MDsKKwl3aGlsZSgqcz49JzAnJiYqczw9JzcnJiZmbGFnPDMpeworCSAgdmFsPXZhbCo4KypzLScwJzsKKwkgIHMrKztmbGFnKys7CisJfQorCWlmKGZsYWcpeypwKys9dmFsO2NvbnRpbnVlO30KKwlpZigqcz09J3gnKXsKKwkgIGludCB3YXJuZWQ9MDsKKwkgIHMrKzt2YWw9MDsKKwkgIHdoaWxlKCgqcz49JzAnJiYqczw9JzknKXx8KCpzPj0nYScmJipzPD0nZicpfHwoKnM+PSdBJyYmKnM8PSdGJykpeworCSAgICB2YWw9dmFsKjE2OworCSAgICBpZigqcz49JzAnJiYqczw9JzknKSB2YWwrPSpzLScwJzsKKwkgICAgaWYoKnM+PSdhJyYmKnM8PSdmJykgdmFsKz0qcy0nYScrMTA7CisJICAgIGlmKCpzPj0nQScmJipzPD0nRicpIHZhbCs9KnMtJ0EnKzEwOworCSAgICBpZighd2FybmVkJiYoKHVuc2lnbmVkIGxvbmcpdmFsKT56dW0ydWwodHVfbWF4W0NIQVJdKSl7CisJICAgICAgZXJyb3IoMzY0KTsKKwkgICAgICB3YXJuZWQ9MTsKKwkgICAgfQorCSAgICBzKys7CisJICB9CisJICAqcCsrPXZhbDtjb250aW51ZTsKKwl9CisJZXJyb3IoNzEpOworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgICAgfQorICAgICAgKnArKz1DSEFSQ09OVigqcyk7CisgICAgICBzKys7CisgICAgfQorICAgIGlmKCpzIT1mKSBlcnJvcig3NCk7CisgICAgbmV4dF90b2tlbigpOworICAgIGtpbGxzcCgpOworICAgIGlmKGYhPSdcIid8fGN0b2stPnR5cGUhPVRfU1RSSU5HKSBicmVhazsKKyAgfQorICBpZighc3RyaW5nKXsKKyAgICBzbGVuKz0xMjg7CisgICAgc3RyaW5nPW15cmVhbGxvYyhzdHJpbmcsc2xlbik7CisgICAgcD1zdHJpbmc7CisgIH0KKyAgKnA9MDsKKyAgbmV3PW5ld19ub2RlKCk7CisgIG5ldy0+bnR5cD1uZXdfdHlwKCk7CisgIGlmKGY9PSdcIicpeworICAgIG5ldy0+bnR5cC0+ZmxhZ3M9QVJSQVk7CisgICAgbmV3LT5udHlwLT5zaXplPWwyem0oKGxvbmcpKHAtc3RyaW5nKSsxKTsKKyAgICBuZXctPm50eXAtPm5leHQ9bmV3X3R5cCgpOworICAgIG5ldy0+bnR5cC0+bmV4dC0+ZmxhZ3M9U1RSSU5HQ09OU1R8Q0hBUjsKKyAgICBuZXctPm50eXAtPm5leHQtPm5leHQ9MDsKKyAgICBuZXctPmZsYWdzPVNUUklORzsKKyAgICBuZXctPmNsPWNsX2Zyb21fc3RyaW5nKHN0cmluZyxwKTsKKyAgICAvKiAgICAgICAgbmV3LT5pZGVudGlmaWVyPWFkZF9pZGVudGlmaWVyKHN0cmluZyxwLXN0cmluZyk7Ki8KKyAgICBuZXctPnZhbC52bWF4PWwyem0oMEwpOworICB9ZWxzZXsKKyAgICBjaGFyICpsOworICAgIGlmKGVjcHApbmV3LT5udHlwLT5mbGFncz1DT05TVHxDSEFSOworICAgIGVsc2UgbmV3LT5udHlwLT5mbGFncz1DT05TVHxJTlQ7CisgICAgbmV3LT5udHlwLT5uZXh0PTA7CisgICAgbmV3LT5mbGFncz1DRVhQUjsKKwkJLyogVE9ETzogSGllciBldmVudHVlbGwgd2FzIG1pdHNwZWljaGVybiBkYXMgY2hhciAqLworICAgIHptPWwyem0oMEwpO3p1bT11bDJ6dW0oMFVMKTsKKyAgICBwLS07CisgICAgaWYocD5zdHJpbmcpeyBlcnJvcig3Mik7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisJfSAKKyAgICBmb3IoQklHRU5ESUFOPyhsPXN0cmluZyk6KGw9cCk7QklHRU5ESUFOPyhsPD1wKToobD49c3RyaW5nKTtCSUdFTkRJQU4/KGwrKyk6KGwtLSkpeworICAgICAgLyogIHptPXptPDxDSEFSX0JJVCsqcCAgKi8KKyAgICAgIGlmKGRlZmF1bHRfdW5zaWduZWQpeworCXp1bT16dW1sc2hpZnQoenVtLGNoYXJfYml0KTsKKwl6dW09em1hZGQoenVtLHVsMnp1bSgqKHVuc2lnbmVkIGNoYXIgKilsKSk7CisJbmV3LT52YWwudmludD16bTJ6aSh6dW0yem0oenVtKSk7CisgICAgICB9ZWxzZXsKKwl6bT16bWxzaGlmdCh6bSxjaGFyX2JpdCk7CisJem09em1hZGQoem0sbDJ6bSgobG9uZykqbCkpOworCW5ldy0+dmFsLnZpbnQ9em0yemkoem0pOworICAgICAgfQorICAgIH0KKyAgfQorICBuZXctPmxlZnQ9bmV3LT5yaWdodD0wOworICByZXR1cm4gbmV3OworfQorbnAgY29uc3RhbnRfZXhwcmVzc2lvbih2b2lkKQorLyogIEdpYnQgWmVpZ2VyIGF1ZiBlcnpldWd0IFN0cnVrdHVyIGZ1ZXIgS29uc3RhbnRlIHp1cnVlY2sgKi8KK3sKKyAgbnAgbmV3OyB6bGRvdWJsZSBkYjsKKyAgenVtYXggdmFsdWUsemJhc2UsZGlnaXQ7dW5zaWduZWQgbG9uZyBiYXNlPTEwLHQ7CisgIGNoYXIgKnMsKm1lcms7aW50IHdhcm5lZD0wLHRtPTA7CisgIG1lcms9cz1jdG9rLT5uYW1lOworICB2YWx1ZT11bDJ6dW0oMEwpOworICBuZXc9bmV3X25vZGUoKTsKKyAgbmV3LT5udHlwPW5ld190eXAoKTsKKyAgbmV3LT5udHlwLT5mbGFncz0wOworICBuZXctPmZsYWdzPUNFWFBSOworICBuZXctPmxlZnQ9bmV3LT5yaWdodD0wOworICBuZXctPnNpZGVmeD0wOworICBpZigqcz09JzAnKXsKKyAgICBzKys7CisgICAgaWYoKnM9PSd4J3x8KnM9PSdYJyl7cysrO2Jhc2U9MTY7fSBlbHNlIGJhc2U9ODsKKyAgfQorICB6YmFzZT11bDJ6dW0oYmFzZSk7CisgIGlmKCpzPj0nMCcmJipzPD0nOScpIHQ9KnMtJzAnOyAKKyAgZWxzZSBpZigqcz49J2EnJiYqczw9J2YnKSB0PSpzLSdhJysxMDsgCisgIGVsc2UgaWYoKnM+PSdBJyYmKnM8PSdGJykgdD0qcy0nQScrMTA7CisgIGVsc2UgdD0yMDsKKyAgd2hpbGUodDxiYXNlKXsKKyAgICBkaWdpdD11bDJ6dW0odCk7CisgICAgaWYoIXdhcm5lZCl7CisgICAgICBpZighYzk5JiYhenVtbGVxKHZhbHVlLHp1bWRpdih6dW1zdWIodF9tYXgoVU5TSUdORUR8TE9ORyksZGlnaXQpLHpiYXNlKSkpCisJd2FybmVkPTE7CisgICAgICBpZihjOTkmJiF6dW1sZXEodmFsdWUsenVtZGl2KHp1bXN1Yih0X21heChVTlNJR05FRHxMTE9ORyksZGlnaXQpLHpiYXNlKSkpCisJd2FybmVkPTE7ICAgICAgCisgICAgfQorICAgIHZhbHVlPXp1bWFkZCh6dW1tdWx0KHZhbHVlLHpiYXNlKSxkaWdpdCk7CisgICAgcysrOworICAgIGlmKCpzPj0nMCcmJipzPD0nOScpIHQ9KnMtJzAnOyAKKyAgICBlbHNlIGlmKCpzPj0nYScmJipzPD0nZicpIHQ9KnMtJ2EnKzEwOyAKKyAgICBlbHNlIGlmKCpzPj0nQScmJipzPD0nRicpIHQ9KnMtJ0EnKzEwOyAKKyAgICBlbHNlIHQ9MjA7CisgIH0KKyAgd2hpbGUoKCEodG0mVU5TSUdORUQpJiYoKnM9PSd1J3x8KnM9PSdVJykpfHwoKHRtJk5RKT09MCYmKCpzPT0nbCd8fCpzPT0nTCcpKSl7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgaWYoISh0bSZVTlNJR05FRCkmJigqcz09J3UnfHwqcz09J1UnKSl7CisgICAgICBpZigodG0mTlEpPT1MT05HKXsKKwlpZighYzk5fHx6dW1sZXEodmFsdWUsdF9tYXgoVU5TSUdORUR8TE9ORykpKQorCSAgbmV3LT5udHlwLT5mbGFncz0oVU5TSUdORUR8TE9ORyk7CisJZWxzZQorCSAgbmV3LT5udHlwLT5mbGFncz0oVU5TSUdORUR8TExPTkcpOworICAgICAgfWVsc2UgaWYoKHRtJk5RKT09TExPTkcpCisJbmV3LT5udHlwLT5mbGFncz0oVU5TSUdORUR8TExPTkcpOworICAgICAgZWxzZSBpZih6dW1sZXEodmFsdWUsdF9tYXgoVU5TSUdORUR8SU5UKSkpCisJbmV3LT5udHlwLT5mbGFncz1VTlNJR05FRHxJTlQ7CisgICAgICBlbHNlIGlmKCFjOTl8fHp1bWxlcSh2YWx1ZSx0X21heChVTlNJR05FRHxMT05HKSkpCisJbmV3LT5udHlwLT5mbGFncz1VTlNJR05FRHxMT05HOworICAgICAgZWxzZQorCW5ldy0+bnR5cC0+ZmxhZ3M9VU5TSUdORUR8TExPTkc7CisgICAgICB0bXw9VU5TSUdORUQ7CisgICAgfWVsc2V7CisgICAgICBpZihjOTkmJnNbMV09PXNbMF0peworCXMrKzsKKwlpZih0bSZVTlNJR05FRCkKKwkgIG5ldy0+bnR5cC0+ZmxhZ3M9KFVOU0lHTkVEfExMT05HKTsKKwllbHNlIGlmKGJhc2U9PTEwfHx6dW1sZXEodmFsdWUsdF9tYXgoTExPTkcpKSkKKwkgIG5ldy0+bnR5cC0+ZmxhZ3M9TExPTkc7CisJZWxzZQorCSAgbmV3LT5udHlwLT5mbGFncz1VTlNJR05FRHxMTE9ORzsKKwl0bXw9TExPTkc7CisgICAgICB9ZWxzZXsKKwlpZih0bSZVTlNJR05FRCl7CisJICBpZighYzk5fHx6dW1sZXEodmFsdWUsdF9tYXgoVU5TSUdORUR8TE9ORykpKQorCSAgICBuZXctPm50eXAtPmZsYWdzPShVTlNJR05FRHxMT05HKTsKKwkgIGVsc2UKKwkgICAgbmV3LT5udHlwLT5mbGFncz0oVU5TSUdORUR8TExPTkcpOworCX1lbHNleworCSAgaWYoIWM5OSl7CisJICAgIGlmKGJhc2U9PTEwfHx6dW1sZXEodmFsdWUsdF9tYXgoTE9ORykpKQorCSAgICAgIG5ldy0+bnR5cC0+ZmxhZ3M9TE9ORzsKKwkgICAgZWxzZQorCSAgICAgIG5ldy0+bnR5cC0+ZmxhZ3M9VU5TSUdORUR8TE9ORzsKKwkgIH1lbHNleyAKKwkgICAgaWYoenVtbGVxKHZhbHVlLHRfbWF4KExPTkcpKSkKKwkgICAgICBuZXctPm50eXAtPmZsYWdzPUxPTkc7CisJICAgIGVsc2UgaWYoYmFzZSE9MTAmJnp1bWxlcSh2YWx1ZSx0X21heChVTlNJR05FRHxMT05HKSkpCisJICAgICAgbmV3LT5udHlwLT5mbGFncz1VTlNJR05FRHxMT05HOworCSAgICBlbHNlIGlmKGJhc2U9PTEwfHx6dW1sZXEodmFsdWUsdF9tYXgoTExPTkcpKSkKKwkgICAgICBuZXctPm50eXAtPmZsYWdzPUxMT05HOworCSAgICBlbHNlCisJICAgICAgbmV3LT5udHlwLT5mbGFncz1VTlNJR05FRHxMTE9ORzsKKwkgIH0KKwl9CisJdG18PUxPTkc7CisgICAgICB9CQorICAgIH0KKyAgICBzKys7CisgIH0KKyAgaWYoKnM9PScuJ3x8KnM9PSdlJ3x8KnM9PSdFJyl7CisgICAgLyogIEZsaWVzc2tvbW1ha29uc3RhbnRlLCBpZ25vcmllcnQgdm9yaGVyIGJlcmVjaG5ldGVuIFdlcnQsIGZhbGxzIGVyICAgKi8KKyAgICAvKiAgbmljaHQgZGV6aW1hbCB1bmQgbmljaHQgMCB3YXIgKGRhIGVyIGRhbm4gb2t0YWwgd2FyKSAgICAgICAgICAgICAgICAqLworICAgIGlmKCptZXJrPT0nMCcmJiF6dW1lcXRvKHZhbHVlLHVsMnp1bSgwVUwpKSl7CisgICAgICB2YWx1ZT11bDJ6dW0oMFVMKTt6YmFzZT11bDJ6dW0oMTBVTCk7CisgICAgICB3aGlsZSgqbWVyaz49JzAnJiYqbWVyazw9JzknKXsKKwlkaWdpdD11bDJ6dW0oKHVuc2lnbmVkIGxvbmcpKCptZXJrLScwJykpOworCXZhbHVlPXp1bWFkZCh6dW1tdWx0KHZhbHVlLHpiYXNlKSxkaWdpdCk7CisJbWVyaysrOworICAgICAgfQorICAgICAgaWYobWVyayE9cykgZXJyb3IoNzUpOworICAgIH0KKyAgICBkYj16dW0yemxkKHZhbHVlKTsKKyAgICBpZigqcz09Jy4nKXsKKyAgICAgIC8qICBUZWlsIGhpbnRlciBLb21tYXN0ZWxsZW4gICAgKi8KKyAgICAgIHpsZG91YmxlIHpkaXYsemJhc2VkLHpzdW0sZGlnaXQ7CisgICAgICBpbnQgY250PTA7CisgICAgICBzKys7CisgICAgICB6YmFzZWQ9ZDJ6bGQoMTAuMCk7emRpdj1kMnpsZCgxLjApO3pzdW09ZDJ6bGQoMC4wKTsKKyAgICAgIHdoaWxlKCpzPj0nMCcmJipzPD0nOScpeworICAgICAgICBpZiAoY250PDM1KXsKKwkgIGNudCsrOworICAgICAgICAgIGRpZ2l0PWQyemxkKChkb3VibGUpKCpzLScwJykpOworICAgICAgICAgIHpzdW09emxkYWRkKHpsZG11bHQoenN1bSx6YmFzZWQpLGRpZ2l0KTsKKyAgICAgICAgICB6ZGl2PXpsZG11bHQoemRpdix6YmFzZWQpOworICAgICAgICB9CisgICAgICAgIHMrKzsKKyAgICAgIH0KKyAgICAgIGRiPXpsZGFkZChkYix6bGRkaXYoenN1bSx6ZGl2KSk7CisgICAgICAKKyAgICB9CisgICAgaWYoKnM9PSdlJ3x8KnM9PSdFJyl7CisgICAgICAvKiAgRXhwb25lbnRpYWxkYXJzdGVsbHVuZyAgKi8KKyAgICAgIGludCBleHAsdm9yeixpO3psZG91YmxlIHpiYXNlZDsKKyAgICAgIHpiYXNlZD1kMnpsZCgoZG91YmxlKTEwKTsKKyAgICAgIHMrKzsKKyAgICAgIGlmKCpzPT0nLScpeworCXMrKzt2b3J6PS0xOworICAgICAgfWVsc2V7CisJdm9yej0xO2lmKCpzPT0nKycpIHMrKzsKKyAgICAgIH0KKyAgICAgIGV4cD0wOworICAgICAgd2hpbGUoKnM+PScwJyYmKnM8PSc5JykgZXhwPWV4cCoxMCsqcysrLScwJzsKKyAgICAgIGZvcihpPTA7aTxleHA7aSsrKXsKKwlpZih2b3J6PjApIGRiPXpsZG11bHQoZGIsemJhc2VkKTsKKwllbHNlICAgZGI9emxkZGl2KGRiLHpiYXNlZCk7CisgICAgICB9CisgICAgfQorICAgIG5ldy0+bnR5cC0+ZmxhZ3M9RE9VQkxFOworICAgIGlmKCpzPT0nZid8fCpzPT0nRicpeworICAgICAgbmV3LT5udHlwLT5mbGFncz1GTE9BVDtzKys7CisgICAgfWVsc2UgaWYoKnM9PSdsJ3x8KnM9PSdMJyl7CisgICAgICBuZXctPm50eXAtPmZsYWdzPUxET1VCTEU7cysrOworICAgIH0KKyAgfWVsc2V7CisgICAgaWYod2FybmVkKSBlcnJvcigyMTEpOworICAgIGlmKG5ldy0+bnR5cC0+ZmxhZ3M9PTApeworICAgICAgaWYoYmFzZT09MTApeworCWlmKHp1bWxlcSh2YWx1ZSx0X21heChJTlQpKSkgCisJICBuZXctPm50eXAtPmZsYWdzPUlOVDsKKwllbHNlIGlmKCFjOTl8fHp1bWxlcSh2YWx1ZSx0X21heChMT05HKSkpCisJICBuZXctPm50eXAtPmZsYWdzPUxPTkc7IAorICAgICAgICBlbHNlCisJICBuZXctPm50eXAtPmZsYWdzPUxMT05HOworICAgICAgfWVsc2V7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisJaWYoenVtbGVxKHZhbHVlLHRfbWF4KElOVCkpKQorCSAgbmV3LT5udHlwLT5mbGFncz1JTlQ7IAorCWVsc2UgCisJICBpZih6dW1sZXEodmFsdWUsdF9tYXgoVU5TSUdORUR8SU5UKSkpCisJICAgIG5ldy0+bnR5cC0+ZmxhZ3M9VU5TSUdORUR8SU5UOworCWVsc2UgaWYoenVtbGVxKHZhbHVlLHRfbWF4KExPTkcpKSkKKwkgIG5ldy0+bnR5cC0+ZmxhZ3M9TE9ORzsKKwllbHNlIGlmKCFjOTl8fHp1bWxlcSh2YWx1ZSx0X21heChVTlNJR05FRHxMT05HKSkpeworCSAgbmV3LT5udHlwLT5mbGFncz1VTlNJR05FRHxMT05HO2Vycm9yKDIxMik7CisJfWVsc2UgaWYoenVtbGVxKHZhbHVlLHRfbWF4KExMT05HKSkpCisJICBuZXctPm50eXAtPmZsYWdzPUxMT05HOworCWVsc2UKKwkgIG5ldy0+bnR5cC0+ZmxhZ3M9VU5TSUdORUR8TExPTkc7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYoKnMpIGVycm9yKDIzMik7CisgIAorICBpZihuZXctPm50eXAtPmZsYWdzPT1GTE9BVCkgbmV3LT52YWwudmZsb2F0PXpsZDJ6ZihkYik7CisgIGVsc2UgaWYobmV3LT5udHlwLT5mbGFncz09RE9VQkxFKSBuZXctPnZhbC52ZG91YmxlPXpsZDJ6ZChkYik7CisgIGVsc2UgaWYobmV3LT5udHlwLT5mbGFncz09TERPVUJMRSkgbmV3LT52YWwudmxkb3VibGU9ZGI7CisgIGVsc2UgaWYobmV3LT5udHlwLT5mbGFncz09SU5UKSBuZXctPnZhbC52aW50PXptMnppKHp1bTJ6bSh2YWx1ZSkpOworICBlbHNlIGlmKG5ldy0+bnR5cC0+ZmxhZ3M9PShVTlNJR05FRHxJTlQpKSBuZXctPnZhbC52dWludD16dW0yenVpKHZhbHVlKTsKKyAgZWxzZSBpZihuZXctPm50eXAtPmZsYWdzPT1MT05HKSBuZXctPnZhbC52bG9uZz16bTJ6bCh6dW0yem0odmFsdWUpKTsKKyAgZWxzZSBpZihuZXctPm50eXAtPmZsYWdzPT0oVU5TSUdORUR8TE9ORykpIG5ldy0+dmFsLnZ1bG9uZz16dW0yenVsKHZhbHVlKTsKKyAgZWxzZSBpZihuZXctPm50eXAtPmZsYWdzPT1MTE9ORykgbmV3LT52YWwudmxsb25nPXptMnpsbCh6dW0yem0odmFsdWUpKTsKKyAgZWxzZSBpZihuZXctPm50eXAtPmZsYWdzPT0oVU5TSUdORUR8TExPTkcpKSBuZXctPnZhbC52dWxsb25nPXp1bTJ6dWxsKHZhbHVlKTsKKyAgZWxzZSBpZXJyb3IoMCk7CisgIG5leHRfdG9rZW4oKTsKKyAgcmV0dXJuIG5ldzsKK30KK25wIGlkZW50aWZpZXJfZXhwcmVzc2lvbih2b2lkKQorLyogIEVyemV1Z3QgSWRlbnRpZmllciBtaXQgS25vdGVuICAqLworeworICBucCBuZXc7Y2hhciBidWZmW01BWEldOworICBraWxsc3AoKTsKKyAgaWYoY3Rvay0+dHlwZT09TkFNRSl7CisgICAgaWYoaXNfa2V5d29yZChjdG9rLT5uYW1lKSkgZXJyb3IoMjE2LGN0b2stPm5hbWUpOworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgIG5ldz1uZXdfbm9kZSgpOworICAgIG5ldy0+ZmxhZ3M9SURFTlRJRklFUjsKKyAgICBuZXctPmxlZnQ9bmV3LT5yaWdodD0wOworICAgIG5ldy0+aWRlbnRpZmllcj1hZGRfaWRlbnRpZmllcihjdG9rLT5uYW1lLHN0cmxlbihjdG9rLT5uYW1lKSk7CisgICAgaWYoIXN0cm5jbXAoY3Rvay0+bmFtZSwiX19tYXNrbV8iLDgpKXsKKyAgICAgIHVuc2lnbmVkIGxvbmcgbWFzazsKKyAgICAgIGlmKHNzY2FuZihjdG9rLT5uYW1lLCJfX21hc2ttXyVsdV8lcyIsJm1hc2ssbmV3LT5pZGVudGlmaWVyKSE9MikgaWVycm9yKDApOworICAgICAgc3ByaW50ZihuZXctPmlkZW50aWZpZXIrc3RybGVuKG5ldy0+aWRlbnRpZmllciksIi4lbHUiLG1hc2spOworICAgIH0KKyAgICBuZXctPm50eXA9MDsKKyAgICBuZXctPnNpZGVmeD0wOworICAgIG5ldy0+dmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgbmV3LT5vLnY9MDsKKyAgICBuZXh0X3Rva2VuKCk7CisgIH1lbHNleworICAgIGVycm9yKDc2KTsKKyAgICBuZXc9MDsKKyAgfQorICByZXR1cm4gbmV3OworfQordm9pZCBmcmVlX2FsaXN0KGFyZ3VtZW50X2xpc3QgKnApCisvKiAgR2lidCBhcmd1bWVudF9saXN0IGlua2wuIGV4cHJlc3Npb25zIGZyZWkgICovCit7CisgIGFyZ3VtZW50X2xpc3QgKm1lcms7CisgIHdoaWxlKHApeworICAgIG1lcms9cC0+bmV4dDsKKyAgICBpZihwLT5hcmcpIGZyZWVfZXhwcmVzc2lvbihwLT5hcmcpOworICAgIGZyZWUocCk7CisgICAgcD1tZXJrOworICB9Cit9Cit2b2lkIGZyZWVfZXhwcmVzc2lvbihucCBwKQorLyogIEdpYnQgZXhwcmVzc2lvbiBtaXQgYWxsZW4gVHlwZW4gZXRjLiBmcmVpICAqLworeworICBpZighcCkgcmV0dXJuOworICBpZihwLT5mbGFncz09QVNTSUdOT1ApeworICAgIGlmKCFwLT5yaWdodCl7aWVycm9yKDApO3JldHVybjt9CisgICAgaWYocC0+cmlnaHQtPmxlZnQ9PXAtPmxlZnQpICBwLT5sZWZ0PTA7CisgICAgaWYocC0+cmlnaHQtPnJpZ2h0PT1wLT5sZWZ0KSBwLT5sZWZ0PTA7CisgIH0KKyAgaWYocC0+ZmxhZ3M9PUNBTEwmJnAtPmFsaXN0KSBmcmVlX2FsaXN0KHAtPmFsaXN0KTsKKyAgaWYocC0+bnR5cCkgZnJlZXR5cChwLT5udHlwKTsKKyAgaWYocC0+bGVmdCkgZnJlZV9leHByZXNzaW9uKHAtPmxlZnQpOworICBpZihwLT5yaWdodCkgZnJlZV9leHByZXNzaW9uKHAtPnJpZ2h0KTsKKyAgZnJlZShwKTsKK30KKwpkaWZmIC0tZ2l0IGEvcHAuYyBiL3BwLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzg1Y2IxZAotLS0gL2Rldi9udWxsCisrKyBiL3BwLmMKQEAgLTAsMCArMSw5NzUgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK0ZJTEUgKmluZmlsZTsKK2ludCBsaW5lPTE7CisKKyNkZWZpbmUgSU5DU0laRSAxNgorRklMRSAqKmluY2ZpbGU7CitjaGFyICoqaW5jbmFtZTsKK2ludCAqaW5jbGluZTsKK2ludCBpbmNuLGluY3NpemU7CisKKyNkZWZpbmUgUFBfVFNJWkUgMTAyNAorCisvKkZJWE1FKi8KKyNkZWZpbmUgaWVycm9yKHgpIGFib3J0KCk7CisjZGVmaW5lIG15bWFsbG9jKHgpIG1hbGxvYyh4KQorI2RlZmluZSBteXJlYWxsb2MoeCx5KSByZWFsbG9jKHgseSkKKworLyogbXVzdCBub3QgY29sbGlkZSB3aXRoIHNvdXJjZSBjaGFyYWN0ZXItc2V0ICovCitlbnVtIHsKKyAgVEtLRVlXT1JEPS0zMiwKKyAgVEtNQVJHLAorICBUS0lERU5USUZJRVIsCisgIFRLTlVNQkVSLAorICBUS1BMVVNQTFVTLAorICBUS01JTk1JTiwKKyAgVEtFT0wsCisgIFRLTFRMVCwKKyAgVEtHVEdULAorICBUS1NSRUYsCisgIFRLTEUsCisgIFRLR0UsCisgIFRLRVEsCisgIFRLTkUsCisgIFRLTEFORCwKKyAgVEtMT1IsCisgIFRLTVVMRVEsCisgIFRLRElWRVEsCisgIFRLTU9ERVEsCisgIFRLUExVU0VRLAorICBUS01JTkVRLAorICBUS0xUTFRFUSwKKyAgVEtHVEdURVEsCisgIFRLQU5ERVEsCisgIFRLT1JFUSwKKyAgVEtYT1JFUSwKKyAgVEtEREQsCisgIFRLTlVNTlVNCit9OworCitzdGF0aWMgY2hhciAqdG9rb3V0W109eyJlcnIiLCJlcnIiLCJlcnIiLCJlcnIiLCIrKyIsIi0tIiwiIiwiPDwiLCI+PiIsIi0+IiwiPD0iLCI+PSIsIj09IiwKKwkJICAgICAgICIhPSIsIiYmIiwifHwiLCIqPSIsIi89IiwiJT0iLCIrPSIsIi09IiwiPDw9IiwiPj49IiwiJj0iLAorCQkgICAgICAgInw9IiwiXj0iLCIuLi4iLCIjIyIKK307CisKK3N0YXRpYyBjaGFyICpkZXNjW109eworICAiVEtLRVlXT1JEIiwKKyAgIlRLTUFSRyIsCisgICJUS0lERU5USUZJRVIiLAorICAiVEtOVU1CRVIiLAorICAiVEtQTFVTUExVUyIsCisgICJUS01JTk1JTiIsCisgICJUS0VPTCIsCisgICJUS0xUTFQiLAorICAiVEtHVEdUIiwKKyAgIlRLU1JFRiIsCisgICJUS0xFIiwKKyAgIlRLR0UiLAorICAiVEtFUSIsCisgICJUS05FIiwKKyAgIlRLTEFORCIsCisgICJUS0xPUiIsCisgICJUS01VTEVRIiwKKyAgIlRLRElWRVEiLAorICAiVEtNT0RFUSIsCisgICJUS1BMVVNFUSIsCisgICJUS01JTkVRIiwKKyAgIlRLTFRMVEVRIiwKKyAgIlRLR1RHVEVRIiwKKyAgIlRLQU5ERVEiLAorICAiVEtPUkVRIiwKKyAgIlRLWE9SRVEiLAorICAiVEtEREQiLAorICAiVEtOVU1OVU0iCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBzaXplOworICBpbnQgbmV4dDsKKyAgaW50ICp0b2tlbnM7Cit9IHRva2VubGlzdDsKKworI2lmbmRlZiBPQkZVU0NBVE9SCisKKyNkZWZpbmUgVkFSQVJHX01BQ1JPICAxCisjZGVmaW5lIEJVSUxUSU5fTUFDUk8gMgorI2RlZmluZSBORUVEX1BBUkVOICAgIDQKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyICpuYW1lOworICBpbnQgZmxhZ3M7CisgIGludCBuYXJnczsKKyAgdG9rZW5saXN0IHJlcGw7Cit9IG1hY3JvOworCisjZGVmaW5lIFBQX0hTSVpFIDE2Mzg0CitzdGF0aWMgaW50ICoqaGFzaF90YWJsZTsKKworI2RlZmluZSBQUF9NU0laRSAxMjgKK3N0YXRpYyBtYWNybyAqbWFjcm9fdGFibGU7CitzdGF0aWMgaW50IG1hY3JvX2NudD0xLG1hY3JvX3NpemU7CisKK3ZvaWQgcHJpbnRfdG9rZW5saXN0KEZJTEUgKix0b2tlbmxpc3QgKik7CisKK3N0YXRpYyB2b2lkIGNvcHlfdG9rZW5saXN0KHRva2VubGlzdCAqbmV3LHRva2VubGlzdCAqb2xkKQoreworICBpZihuZXctPnNpemU8b2xkLT5uZXh0K25ldy0+bmV4dCl7CisgICAgbmV3LT5zaXplPW9sZC0+bmV4dCtuZXctPm5leHQ7CisgICAgbmV3LT50b2tlbnM9bXlyZWFsbG9jKG5ldy0+dG9rZW5zLG5ldy0+c2l6ZSpzaXplb2YoKm5ldy0+dG9rZW5zKSk7CisgIH0KKyAgbWVtY3B5KG5ldy0+dG9rZW5zK25ldy0+bmV4dCxvbGQtPnRva2VucyxvbGQtPm5leHQqc2l6ZW9mKCpuZXctPnRva2VucykpOworICBuZXctPm5leHQrPW9sZC0+bmV4dDsKK30KKworc3RhdGljIGludCBuZXdfbWFjcm8oY2hhciAqbmFtZSxpbnQgZmxhZ3MsaW50IG5hcmdzLHRva2VubGlzdCAqcmVwbCkKK3sKKyAgaW50IGksKnA7CisgIGlmKG1hY3JvX2NudD49bWFjcm9fc2l6ZSl7CisgICAgbWFjcm9fc2l6ZSs9UFBfTVNJWkU7CisgICAgbWFjcm9fdGFibGU9bXlyZWFsbG9jKG1hY3JvX3RhYmxlLG1hY3JvX3NpemUqc2l6ZW9mKCptYWNyb190YWJsZSkpOworICAgIG1hY3JvX3RhYmxlWzBdLm5hbWU9MDsgLyogZHVtbXkgKi8KKyAgfQorICBtYWNyb190YWJsZVttYWNyb19jbnRdLm5hbWU9bXltYWxsb2Moc3RybGVuKG5hbWUpKzEpOworICBzdHJjcHkobWFjcm9fdGFibGVbbWFjcm9fY250XS5uYW1lLG5hbWUpOworICBtYWNyb190YWJsZVttYWNyb19jbnRdLmZsYWdzPWZsYWdzOworICBtYWNyb190YWJsZVttYWNyb19jbnRdLm5hcmdzPW5hcmdzOworICBtYWNyb190YWJsZVttYWNyb19jbnRdLnJlcGwuc2l6ZT0wOworICBtYWNyb190YWJsZVttYWNyb19jbnRdLnJlcGwubmV4dD0wOworICBtYWNyb190YWJsZVttYWNyb19jbnRdLnJlcGwudG9rZW5zPTA7ICAKKyAgY29weV90b2tlbmxpc3QoJm1hY3JvX3RhYmxlW21hY3JvX2NudF0ucmVwbCxyZXBsKTsKKyAgcmV0dXJuIG1hY3JvX2NudCsrOworfQorCitzdGF0aWMgdm9pZCBmcmVlX21hY3JvKGludCBuKQoreworICBmcmVlKG1hY3JvX3RhYmxlW25dLm5hbWUpOworICBmcmVlKG1hY3JvX3RhYmxlW25dLnJlcGwudG9rZW5zKTsKKyAgbWFjcm9fdGFibGVbbl0ubmFtZT0wOworfQorCitzdGF0aWMgaW50IGhhc2goY2hhciAqcCkKK3sKKyAgaW50IHM9MDsKKyAgd2hpbGUoKnApCisgICAgcys9KnArKzsKKyAgcmV0dXJuIHMlUFBfSFNJWkU7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9tYWNybyhjaGFyICpuYW1lKQoreworICBpbnQgaT1oYXNoKG5hbWUpLG4sKnA7CisgIGlmKCEocD1oYXNoX3RhYmxlW2ldKSkgcmV0dXJuIDA7CisgIG49cFswXTsKKyAgZm9yKGk9MTtpPD1uO2krKykKKyAgICBpZihtYWNyb190YWJsZVtwW2ldXS5uYW1lJiYhc3RyY21wKG1hY3JvX3RhYmxlW3BbaV1dLm5hbWUsbmFtZSkpCisgICAgICByZXR1cm4gcFtpXTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9tYWNybyhpbnQgbikKK3sKKyAgaW50IGk9aGFzaChtYWNyb190YWJsZVtuXS5uYW1lKSwqcDsKKyAgaWYoIShwPWhhc2hfdGFibGVbaV0pKXsKKyAgICBoYXNoX3RhYmxlW2ldPXA9bXltYWxsb2MoMipzaXplb2YoKmhhc2hfdGFibGVbaV0pKTsKKyAgICBwWzBdPTE7CisgICAgcFsxXT1uOworICB9ZWxzZXsKKyAgICBwPWhhc2hfdGFibGVbaV09bXlyZWFsbG9jKHAsKHBbMF0rMSkqc2l6ZW9mKCpwKSk7CisgICAgcFswXSsrOworICAgIHBbcFswXV09bjsKK3ByaW50ZigiaGFzaF9jb2xsaXNpbywgZGVwdGg9JWRcbiIscFswXSk7CisgIH0KK30KKworI2VuZGlmIC8qIE9CRlVTQ0FUT1IgKi8KKworc3RhdGljIEZJTEUgKmluY2x1ZGVfZmlsZShjb25zdCBjaGFyICpuYW1lKQoreworICAgIGlmKGluY24+PWluY3NpemUpeworCWluY3NpemUrPUlOQ1NJWkU7CisJaW5jZmlsZT1teXJlYWxsb2MoaW5jZmlsZSxpbmNzaXplKnNpemVvZigqaW5jZmlsZSkpOworCWluY25hbWU9bXlyZWFsbG9jKGluY25hbWUsaW5jc2l6ZSpzaXplb2YoKmluY25hbWUpKTsKKwlpbmNsaW5lPW15cmVhbGxvYyhpbmNsaW5lLGluY3NpemUqc2l6ZW9mKCppbmNsaW5lKSk7CisgICAgfQorICAgIGlmKCFuYW1lKXsKKwlpbmNmaWxlW2luY25dPXN0ZGluOworCW5hbWU9IjxzdGRpbj4iOworICAgIH1lbHNleworCWluY2ZpbGVbaW5jbl09Zm9wZW4obmFtZSwiciIpOworICAgIH0KK3ByaW50ZigiaW5jbHVkZSBmaWxlICVzXG4iLG5hbWUpOworICAgIGluY25hbWVbaW5jbl09bXltYWxsb2Moc3RybGVuKG5hbWUpKzEpOworICAgIHN0cmNweShpbmNuYW1lW2luY25dLG5hbWUpOworICAgIGluY24rKzsKKyAgICByZXR1cm4gaW5jZmlsZVtpbmNuLTFdOworfQorCitzdGF0aWMgRklMRSAqY2xvc2VfZmlsZSh2b2lkKQoreworICAgIC0taW5jbjsKKyAgICBmcmVlKGluY25hbWVbaW5jbl0pOworICAgIGlmKGluY2ZpbGVbaW5jbl0pCisgICAgICBmY2xvc2UoaW5jZmlsZVtpbmNuXSk7CisgICAgaWYoaW5jbjw9MCkKKwlyZXR1cm4gMDsKKyAgICByZXR1cm4gaW5jZmlsZVtpbmNuLTFdOworfQorCitzdGF0aWMgdm9pZCBhZGRfdG9rZW4odG9rZW5saXN0ICpwLGludCBjKQoreworICBpZihwLT5uZXh0Pj1wLT5zaXplKXsKKyAgICBwLT5zaXplKz1QUF9UU0laRTsKKyAgICBwLT50b2tlbnM9bXlyZWFsbG9jKHAtPnRva2VucyxwLT5zaXplKnNpemVvZigqcC0+dG9rZW5zKSk7CisgIH0KKyAgcC0+dG9rZW5zW3AtPm5leHRdPWM7CisgIHAtPm5leHQrKzsKK30KKworaW50IHJlYWRfY2hhcih2b2lkKQorLyogUmVhZCBuZXh0IGlucHV0IGNoYXJhY3Rlci4gQ291bnRzIGxpbmUgbnVtYmVycy4gKi8KK3sKKyAgaW50IHRtcD1nZXRjKGluZmlsZSk7CisgIGlmKHRtcD09J1xuJykgbGluZSsrOworICByZXR1cm4gdG1wOworfQorCitzdGF0aWMgaW50IHB1c2hfYmFjaz1FT0Y7CisKK3N0YXRpYyBpbnQgZ2V0X25leHRfY2hhcih2b2lkKQorLyogUmVhZCBuZXh0IGNoYXJhY3Rlci4gSGFuZGxlcyB0cmlncmFwaHMgYW5kIGxpbmUtY29uY2F0ZW5hdGlvbi4gKi8KK3sKKyAgc3RhdGljIGludCBidWZbMl0saW5idWY7CisgIGludCB0bXAsdG1wMjsKKyAgaWYocHVzaF9iYWNrIT1FT0YpeworICAgIHRtcD1wdXNoX2JhY2s7CisgICAgcHVzaF9iYWNrPUVPRjsKKyAgICByZXR1cm4gdG1wOworICB9CisgIGlmKGluYnVmPT0wKXsKKyAgICB0bXA9cmVhZF9jaGFyKCk7CisgICAgaWYodG1wIT0nXFwnJiZ0bXAhPSc/Jyl7CisgICAgICByZXR1cm4gdG1wOworICAgIH1lbHNleworICAgICAgYnVmWzBdPXRtcDsKKyAgICAgIGluYnVmPTE7CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICB9CisgIH0KKyAgaWYoaW5idWY9PTEpeworICAgIGlmKGJ1ZlswXSE9Jz8nJiZidWZbMF0hPSdcXCcpeworICAgICAgaW5idWY9MDsKKyAgICAgIHJldHVybiBidWZbMF07CisgICAgfWVsc2V7CisgICAgICB0bXA9cmVhZF9jaGFyKCk7CisgICAgICBpZihidWZbMF09PSdcXCcpeworCWlmKHRtcD09J1xuJyl7CisJICBpbmJ1Zj0wOworCSAgcmV0dXJuIGdldF9uZXh0X2NoYXIoKTsKKwl9ZWxzZXsKKwkgIGJ1ZlswXT10bXA7CisJICByZXR1cm4gJ1xcJzsKKwl9CisgICAgICB9ZWxzZXsKKwlpZih0bXA9PSc/Jyl7CisJICBidWZbMV09Jz8nOworCSAgaW5idWY9MjsKKwkgIC8qIGZhbGwgdGhyb3VnaCAqLworCX1lbHNleworCSAgYnVmWzBdPXRtcDsKKwkgIHJldHVybiAnPyc7CisJfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZihpbmJ1Zj09Mil7CisgICAgaWYoYnVmWzBdIT0nPycpIGllcnJvcigwKTsKKyAgICBpZihidWZbMV0hPSc/Jyl7CisgICAgICBpbmJ1Zj0xOworICAgICAgdG1wPWJ1ZlswXTsKKyAgICAgIGJ1ZlswXT1idWZbMV07CisgICAgICByZXR1cm4gdG1wOworICAgIH1lbHNleworICAgICAgdG1wMj10bXA9cmVhZF9jaGFyKCk7OworICAgICAgLyogRklYTUU6IG9ubHkgaWYgb24gKi8KKyAgICAgIGlmKHRtcD09Jz0nKSB0bXAyPScjJzsKKyAgICAgIGVsc2UgaWYodG1wPT0nKCcpIHRtcDI9J1snOworICAgICAgZWxzZSBpZih0bXA9PScvJykgdG1wMj0nXFwnOworICAgICAgZWxzZSBpZih0bXA9PScpJykgdG1wMj0nXSc7CisgICAgICBlbHNlIGlmKHRtcD09J1wnJykgdG1wMj0nXic7CisgICAgICBlbHNlIGlmKHRtcD09JzwnKSB0bXAyPSd7JzsKKyAgICAgIGVsc2UgaWYodG1wPT0nIScpIHRtcDI9J3wnOworICAgICAgZWxzZSBpZih0bXA9PSc+JykgdG1wMj0nfSc7CisgICAgICBlbHNlIGlmKHRtcD09Jy0nKSB0bXAyPSd+JzsKKyAgICAgIGlmKHRtcCE9dG1wMil7CisJLyogRklYTUU6IHdhcm5pbmcgKi8KKwlpZih0bXAyIT0nXFwnKXsKKwkgIGluYnVmPTA7CisJICByZXR1cm4gdG1wMjsKKwl9ZWxzZXsKKwkgIGluYnVmPTE7CisJICBidWZbMF09dG1wMjsKKwkgIHJldHVybiBnZXRfbmV4dF9jaGFyKCk7CisJfQorICAgICAgfWVsc2V7CisJdG1wPWJ1ZlswXTsKKwlidWZbMF09YnVmWzFdOworCWJ1ZlsxXT10bXAyOworCXJldHVybiB0bXA7CisgICAgICB9CisgICAgfQorICB9CisgIGllcnJvcigwKTsKK30KKworc3RhdGljIGludCBnZXRfbmV4dF90b2tlbih0b2tlbmxpc3QgKnApCit7CisgIGludCBjLHosdG1wLCpjbnQ7CisgIHdoaWxlKDEpeworICAgIGM9Z2V0X25leHRfY2hhcigpOworICAgIGlmKGM9PSciJ3x8Yz09J1wnJyl7CisgICAgICBpbnQgdGVybT1jLGVzY2FwZT0wOworICAgICAgYWRkX3Rva2VuKHAsYyk7ICAgICAgCisgICAgICB6PXAtPm5leHQ7CisgICAgICBhZGRfdG9rZW4ocCwwKTsKKyAgICAgIHdoaWxlKDEpeworCWM9Z2V0X25leHRfY2hhcigpOworCS8qIEZJWE1FICovCisJaWYoYz09RU9GfHxjPT0nXG4nKXsKKwkgIHB1dHMoInVudGVybWluYXRlZCBzdHJpbmciKTsKKwkgIHJldHVybiAwOworCX0KKwlpZihjPT10ZXJtJiYhZXNjYXBlKSByZXR1cm4gMDsKKwlpZihlc2NhcGUmJmM9PSdcXCcpCisJICAgIGVzY2FwZT0wOworCWVsc2UKKwkgICAgZXNjYXBlPShjPT0nXFwnKTsKKwlhZGRfdG9rZW4ocCxjKTsKKwlwLT50b2tlbnNbel0rKzsKKyAgICAgIH0KKyAgICB9ZWxzZSBpZihjPT0nXyd8fGlzYWxwaGEoKHVuc2lnbmVkIGNoYXIpYykpeworICAgICAgYWRkX3Rva2VuKHAsVEtJREVOVElGSUVSKTsKKyAgICAgIHo9cC0+bmV4dDsKKyAgICAgIGFkZF90b2tlbihwLDEpOworICAgICAgYWRkX3Rva2VuKHAsYyk7CisgICAgICB3aGlsZSgoYz1nZXRfbmV4dF9jaGFyKCkpPT0nXyd8fGlzYWxudW0oKHVuc2lnbmVkIGNoYXIpYykpeworCWFkZF90b2tlbihwLGMpOworCXAtPnRva2Vuc1t6XSsrOworICAgICAgfQorICAgICAgcHVzaF9iYWNrPWM7CisgICAgICByZXR1cm4gMDsKKyAgICB9ZWxzZSBpZihpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKWMpKXsKKyAgICAgIHRtcD1jOworICAgICAgYz1US05VTUJFUjsKKyAgICB9ZWxzZSBpZihjPT0nLicpeworICAgICAgdG1wPWdldF9uZXh0X2NoYXIoKTsKKyAgICAgIGlmKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpdG1wKSl7CisJcHVzaF9iYWNrPXRtcDsKKwl0bXA9Jy4nOworCWM9VEtOVU1CRVI7CisgICAgICB9ZWxzZSBpZih0bXA9PScuJyl7CisJYz1nZXRfbmV4dF9jaGFyKCk7CisJaWYoYyE9Jy4nKXtwdXRzKCIuLngtdG9rZW4iKTtyZXR1cm4gMDt9LypGSVhNRSovCisJYWRkX3Rva2VuKHAsVEtEREQpOworCXJldHVybiAwOworICAgICAgfWVsc2UKKwlwdXNoX2JhY2s9dG1wOworICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgfWVsc2UgaWYoYz09JysnKXsKKyAgICAgIGM9Z2V0X25leHRfY2hhcigpOworICAgICAgaWYoYz09JysnKXsKKwlhZGRfdG9rZW4ocCxUS1BMVVNQTFVTKTsKKyAgICAgIH1lbHNlIGlmKGM9PSc9Jyl7CisJYWRkX3Rva2VuKHAsVEtQTFVTRVEpOworICAgICAgfWVsc2V7CisJYWRkX3Rva2VuKHAsJysnKTsKKwlwdXNoX2JhY2s9YzsKKyAgICAgIH0KKyAgICAgIHJldHVybiAwOworICAgIH1lbHNlIGlmKGM9PSctJyl7CisgICAgICBjPWdldF9uZXh0X2NoYXIoKTsKKyAgICAgIGlmKGM9PSctJyl7CisJYWRkX3Rva2VuKHAsVEtNSU5NSU4pOworICAgICAgfWVsc2UgaWYoYz09Jz0nKXsKKwlhZGRfdG9rZW4ocCxUS01JTkVRKTsKKyAgICAgIH1lbHNlIGlmKGM9PSc+Jyl7CisJYWRkX3Rva2VuKHAsVEtTUkVGKTsKKyAgICAgIH1lbHNleworCWFkZF90b2tlbihwLCctJyk7CisJcHVzaF9iYWNrPWM7CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9ZWxzZSBpZihjPT0nfCcpeworICAgICAgYz1nZXRfbmV4dF9jaGFyKCk7CisgICAgICBpZihjPT0nfCcpeworCWFkZF90b2tlbihwLFRLTE9SKTsKKyAgICAgIH1lbHNlIGlmKGM9PSc9Jyl7CisJYWRkX3Rva2VuKHAsVEtPUkVRKTsKKyAgICAgIH1lbHNleworCWFkZF90b2tlbihwLCd8Jyk7CisJcHVzaF9iYWNrPWM7CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9ZWxzZSBpZihjPT0nJicpeworICAgICAgYz1nZXRfbmV4dF9jaGFyKCk7CisgICAgICBpZihjPT0nJicpeworCWFkZF90b2tlbihwLFRLTEFORCk7CisgICAgICB9ZWxzZSBpZihjPT0nPScpeworCWFkZF90b2tlbihwLFRLQU5ERVEpOworICAgICAgfWVsc2V7CisJYWRkX3Rva2VuKHAsJyYnKTsKKwlwdXNoX2JhY2s9YzsKKyAgICAgIH0KKyAgICAgIHJldHVybiAwOworICAgIH1lbHNlIGlmKGM9PSc8Jyl7CisgICAgICBjPWdldF9uZXh0X2NoYXIoKTsKKyAgICAgIGlmKGM9PSc8Jyl7CisJYz1nZXRfbmV4dF9jaGFyKCk7CisJaWYoYz09Jz0nKXsKKwkgIGFkZF90b2tlbihwLFRLTFRMVEVRKTsKKwl9ZWxzZXsKKwkgIGFkZF90b2tlbihwLFRLTFRMVCk7CisJICBwdXNoX2JhY2s9YzsKKwl9CisgICAgICB9ZWxzZSBpZihjPT0nPScpeworCWFkZF90b2tlbihwLFRLTEUpOworICAgICAgfWVsc2V7CisJYWRkX3Rva2VuKHAsJzwnKTsKKwlwdXNoX2JhY2s9YzsKKyAgICAgIH0KKyAgICAgIHJldHVybiAwOworICAgIH1lbHNlIGlmKGM9PSc+Jyl7CisgICAgICBjPWdldF9uZXh0X2NoYXIoKTsKKyAgICAgIGlmKGM9PSc+Jyl7CisJYz1nZXRfbmV4dF9jaGFyKCk7CisJaWYoYz09Jz0nKQorCSAgYWRkX3Rva2VuKHAsVEtHVEdURVEpOworCWVsc2V7CisJICBhZGRfdG9rZW4ocCxUS0dUR1QpOworCSAgcHVzaF9iYWNrPWM7CisJfQorICAgICAgfWVsc2UgaWYoYz09Jz0nKXsKKwlhZGRfdG9rZW4ocCxUS0dFKTsKKyAgICAgIH1lbHNleworCWFkZF90b2tlbihwLCc+Jyk7CisJcHVzaF9iYWNrPWM7CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9ZWxzZSBpZihjPT0nIScpeworICAgICAgYz1nZXRfbmV4dF9jaGFyKCk7CisgICAgICBpZihjPT0nPScpeworCWFkZF90b2tlbihwLFRLTkUpOworICAgICAgfWVsc2V7CisJYWRkX3Rva2VuKHAsJyEnKTsKKwlwdXNoX2JhY2s9YzsKKyAgICAgIH0KKyAgICAgIHJldHVybiAwOworICAgIH1lbHNlIGlmKGM9PScqJyl7CisgICAgICBjPWdldF9uZXh0X2NoYXIoKTsKKyAgICAgIGlmKGM9PSc9Jyl7CisJYWRkX3Rva2VuKHAsVEtNVUxFUSk7CisgICAgICB9ZWxzZXsKKwlhZGRfdG9rZW4ocCwnKicpOworCXB1c2hfYmFjaz1jOworICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfWVsc2UgaWYoYz09JyUnKXsKKyAgICAgIGM9Z2V0X25leHRfY2hhcigpOworICAgICAgaWYoYz09Jz0nKXsKKwlhZGRfdG9rZW4ocCxUS01PREVRKTsKKyAgICAgIH1lbHNleworCWFkZF90b2tlbihwLCclJyk7CisJcHVzaF9iYWNrPWM7CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9ZWxzZSBpZihjPT0nIycpeworICAgICAgYz1nZXRfbmV4dF9jaGFyKCk7CisgICAgICBpZihjPT0nIycpeworCWFkZF90b2tlbihwLFRLTlVNTlVNKTsKKyAgICAgIH1lbHNleworCWFkZF90b2tlbihwLCcjJyk7CisJcHVzaF9iYWNrPWM7CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9ZWxzZSBpZihjPT0nLycpeworICAgICAgLypGSVhNRSovCisgICAgICBjPWdldF9uZXh0X2NoYXIoKTsKKyAgICAgIGlmKGM9PScqJyl7CisJaW50IGNzdGF0ZT0wOworCXdoaWxlKDEpeworCSAgYz1nZXRfbmV4dF9jaGFyKCk7CisJICBpZihjPT0nKicpeworCSAgICBpZihjc3RhdGU9PTIpIC8qRklYTUUqLzsKKwkgICAgY3N0YXRlPTE7CisJICB9ZWxzZSBpZihjPT0nLycpeworCSAgICBpZihjc3RhdGU9PTEpIGJyZWFrOworCSAgICBjc3RhdGU9MjsKKwkgIH1lbHNlIGNzdGF0ZT0wOworCX0KKwlpZihwLT5uZXh0Pj0xJiZwLT50b2tlbnNbcC0+bmV4dC0xXSE9JyAnKXsKKwkgICAgYWRkX3Rva2VuKHAsJyAnKTsKKwkgICAgcmV0dXJuIDA7CisJfWVsc2UKKwkgICAgY29udGludWU7CisgICAgICB9ZWxzZSBpZihjPT0nLycvKkZJWE1FKi8peworCXdoaWxlKChjPWdldF9uZXh0X2NoYXIoKSkhPUVPRiYmYyE9J1xuJyk7CisJaWYoYz09RU9GKSBpZXJyb3IoMCk7IC8qRklYTUUqLworCWFkZF90b2tlbihwLCdcbicpOworCXJldHVybiAwOworICAgICAgfWVsc2UgaWYoYz09Jz0nKXsKKwlhZGRfdG9rZW4ocCxUS0RJVkVRKTsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIHB1c2hfYmFjaz1jOworICAgICAgYz0nLyc7CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICB9CisgICAgaWYoYz09VEtOVU1CRVIpeworICAgICAgYWRkX3Rva2VuKHAsVEtOVU1CRVIpOworICAgICAgej1wLT5uZXh0OworICAgICAgYWRkX3Rva2VuKHAsMSk7CisgICAgICBhZGRfdG9rZW4ocCx0bXApOworICAgICAgd2hpbGUoMSl7CisJYz1nZXRfbmV4dF9jaGFyKCk7CisJaWYoYz09J2UnfHxjPT0nRSd8fC8qRklYTUU/Ki9jPT0ncCd8fGM9PSdQJyl7CisJICBhZGRfdG9rZW4ocCxjKTsKKwkgIHAtPnRva2Vuc1t6XSsrOworCSAgdG1wPWdldF9uZXh0X2NoYXIoKTsKKwkgIGlmKHRtcD09JysnfHx0bXA9PSctJyl7CisJICAgIGFkZF90b2tlbihwLHRtcCk7CisJICAgIHAtPnRva2Vuc1t6XSsrOworCSAgfWVsc2V7CisJICAgIHB1c2hfYmFjaz10bXA7CisJICB9CisJfWVsc2UgaWYoYz09Jy4nfHxjPT0nXyd8fGlzYWxudW0oKHVuc2lnbmVkIGNoYXIpYykpeworCSAgYWRkX3Rva2VuKHAsYyk7CisJICBwLT50b2tlbnNbel0rKzsKKwl9ZWxzZXsKKwkgIHB1c2hfYmFjaz1jOworCSAgYnJlYWs7CisJfQorICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmKGM9PUVPRnx8Yz09J1xuJyl7CisgICAgICBhZGRfdG9rZW4ocCxjKTsKKyAgICAgIHJldHVybiBjOworICAgIH0KKyAgICBpZighaXNzcGFjZSgodW5zaWduZWQgY2hhciljKSl7CisgICAgICBhZGRfdG9rZW4ocCxjKTsKKyAgICAgIHJldHVybiAwOworICAgIH1lbHNleworICAgICAgaWYocC0+bmV4dD49MSYmcC0+dG9rZW5zW3AtPm5leHQtMV0hPScgJykKKwlhZGRfdG9rZW4ocCwnICcpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9Cit9CisKK3ZvaWQgcHJpbnRfdG9rZW5saXN0KEZJTEUgKmYsdG9rZW5saXN0ICpwKQoreworICBpbnQgaSwqdHI9cC0+dG9rZW5zLCplbmQ9dHIrcC0+bmV4dDsKKyAgd2hpbGUodHI8ZW5kKXsKKyAgICBpZigqdHI9PSciJ3x8KnRyPT0nXCcnfHwqdHI9PVRLSURFTlRJRklFUnx8KnRyPT1US05VTUJFUil7CisgICAgICBpbnQgbjsKKyAgICAgIGlmKCp0cj09JyInKQorCWZwcmludGYoZiwiU1RSSU5HOiAiKTsKKyAgICAgIGVsc2UgaWYoKnRyPT0nXCcnKQorCWZwcmludGYoZiwiQ0NPTlNUOiAiKTsKKyAgICAgIGVsc2UgaWYoKnRyPT1US05VTUJFUikKKwlmcHJpbnRmKGYsIk5VTUJFUjogIik7CisgICAgICBlbHNlCisJZnByaW50ZihmLCJJREVOVDogIik7CisgICAgICB0cisrOworICAgICAgbj0qdHIrKzsKKyAgICAgIGZvcihpPTA7aTxuO2krKykKKwlmcHJpbnRmKGYsIiVjIiwqdHIrKyk7CisgICAgICBmcHJpbnRmKGYsIlxuIik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoKnRyPT1US01BUkcpeworICAgICAgZnByaW50ZihmLCJBUkcgJWRcbiIsdHJbMV0pOworICAgICAgdHIrPTI7IGNvbnRpbnVlOworICAgIH0KKyAgICBpZigqdHI9PUVPRil7CisgICAgICBmcHJpbnRmKGYsIkVPRlxuIik7CisgICAgICB0cisrOyBjb250aW51ZTsKKyAgICB9CisgICAgaWYoKnRyPT0nXG4nKXsKKyAgICAgIGZwcmludGYoZiwiTkVXTElORVxuIik7CisgICAgICB0cisrOyBjb250aW51ZTsKKyAgICB9CisgICAgaWYoKnRyPj1US1BMVVNQTFVTJiYqdHI8PVRLTlVNTlVNKXsKKyAgICAgIGZwcmludGYoZiwiJXNcbiIsZGVzY1sqdHItVEtLRVlXT1JEXSk7CisgICAgICB0cisrOyBjb250aW51ZTsKKyAgICB9CisgICAgZnByaW50ZihmLCJPVEhFUjogJWQoJWMpXG4iLCp0ciwqdHIpOworICAgIHRyKys7CisgIH0KK30KKwordm9pZCBwcmludF9jb2RlKEZJTEUgKmYsdG9rZW5saXN0ICpwKQoreworICBpbnQgaSwqdHI9cC0+dG9rZW5zLCplbmQ9dHIrcC0+bmV4dDsKKyAgd2hpbGUodHI8ZW5kKXsKKyAgICBpZigqdHI9PSciJ3x8KnRyPT0nXCcnfHwqdHI9PVRLSURFTlRJRklFUnx8KnRyPT1US05VTUJFUil7CisgICAgICBpbnQgbixjOworICAgICAgaWYoKnRyPT1US0lERU5USUZJRVJ8fCp0cj09VEtOVU1CRVIpCisJYz0wOworICAgICAgZWxzZQorCWM9KnRyOworICAgICAgdHIrKzsKKyAgICAgIGlmKGMpCisJICBmcHJpbnRmKGYsIiVjIixjKTsKKyAgICAgIG49KnRyKys7CisgICAgICBmb3IoaT0wO2k8bjtpKyspCisJZnByaW50ZihmLCIlYyIsKnRyKyspOworICAgICAgaWYoYykKKwlmcHJpbnRmKGYsIiVjIixjKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZigqdHI9PUVPRil7CisJcmV0dXJuOworICAgIH0KKyAgICBpZigqdHI9PSdcbicpeworICAgICAgZnByaW50ZihmLCJcbiIpOworICAgICAgdHIrKzsgY29udGludWU7CisgICAgfQorICAgIGlmKCp0cj49VEtQTFVTUExVUyYmKnRyPD1US05VTU5VTSl7CisgICAgICBmcHJpbnRmKGYsIiVzIix0b2tvdXRbKnRyLVRLS0VZV09SRF0pOworICAgICAgdHIrKzsgY29udGludWU7CisgICAgfQorICAgIGZwcmludGYoZiwiJWMiLCp0cik7CisgICAgdHIrKzsKKyAgfQorfQorCitjaGFyICp0b2tlbjJzdHJpbmcoaW50ICpwKQoreworICBpbnQgbj1wWzFdO2NoYXIgKnM7CisgIHN0YXRpYyBjaGFyICpidWYsbGVuOworICBpZihuKzE+bGVuKXsKKyAgICBsZW49bisxOworICAgIGJ1Zj1teW1hbGxvYyhsZW4pOworICB9CisgIHM9YnVmOworICBwKz0yOworICB3aGlsZSgtLW4+PTApICpzKys9KnArKzsKKyAgKnM9MDsKKyAgcmV0dXJuIGJ1ZjsKK30KKworI2lmbmRlZiBPQkZVU0NBVE9SCisKK3N0YXRpYyBpbnQgKmdldF9tYWNyb19hcmcodG9rZW5saXN0ICphcmcsaW50ICpwLGludCB2YXJhcmcpCit7CisgIGludCBwYXI9MDsKKyAgd2hpbGUoMSl7CisgICAgaWYoKnA9PUVPRnx8KnA9PSdcbicpIHB1dHMoInVudGVybWluYXRlZCBtYWNybyBpbnZvY2F0aW9uIik7IC8qRklYTUUqLworICAgIGlmKCpwPT0nLCcmJnBhcj09MCYmIXZhcmFyZykgcmV0dXJuIHA7CisgICAgaWYoKnA9PScpJyl7CisgICAgICBpZihwYXI+MCl7CisJYWRkX3Rva2VuKGFyZywqcCsrKTsKKwlwYXItLTsKKwljb250aW51ZTsKKyAgICAgIH1lbHNlCisJcmV0dXJuIHA7CisgICAgfQorICAgIGlmKCpwPT1US0lERU5USUZJRVJ8fCpwPT1US05VTUJFUnx8KnA9PSciJ3x8KnA9PSdcJycpeworICAgICAgaW50IG47CisgICAgICBhZGRfdG9rZW4oYXJnLCpwKyspOworICAgICAgbj0qcDsKKyAgICAgIGFkZF90b2tlbihhcmcsKnArKyk7CisgICAgICB3aGlsZSgtLW4+PTApIGFkZF90b2tlbihhcmcsKnArKyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYoKnA9PScoJykgcGFyKys7CisgICAgYWRkX3Rva2VuKGFyZywqcCsrKTsKKyAgfQorfQorCit2b2lkIHN0cmluZ2l6ZSh0b2tlbmxpc3QgKm5ldyx0b2tlbmxpc3QgKnNyYykKK3sKKyAgaW50IHosZixuOworICBpbnQgKnA9c3JjLT50b2tlbnMsKmVuZD1wK3NyYy0+bmV4dDsKK3B1dHMoIjEiKTsKKyAgYWRkX3Rva2VuKG5ldywnIicpOworICB6PW5ldy0+bmV4dDsKKyAgYWRkX3Rva2VuKG5ldywwKTsKKyAgd2hpbGUocDxlbmQpeworcHV0cygiMiIpOworICAgIGY9KnA7CisgICAgaWYoZj09VEtJREVOVElGSUVSfHxmPT1US05VTUJFUnx8Zj09JyInfHxmPT0nXCcnKXsKKyAgICAgIGlmKGY9PSciJyl7CisJYWRkX3Rva2VuKG5ldywnXFwnKTsKKwlhZGRfdG9rZW4obmV3LCciJyk7CisJbmV3LT50b2tlbnNbel0rPTI7CisgICAgICB9ZWxzZSBpZihmPT0nXCcnKXsKKwlhZGRfdG9rZW4obmV3LCdcJycpOworCW5ldy0+dG9rZW5zW3pdKys7CisgICAgICB9CisgICAgICBwKys7CisgICAgICBuPSpwKys7CisgICAgICB3aGlsZSgtLW4+PTApeworCWlmKChmPT0nIid8fGY9PSdcJycpJiYoKnA9PSdcXCd8fCpwPT0nIicpKXsKKwkgIGFkZF90b2tlbihuZXcsJ1xcJyk7CisJICBuZXctPnRva2Vuc1t6XSsrOworCX0KKwlhZGRfdG9rZW4obmV3LCpwKyspOworCW5ldy0+dG9rZW5zW3pdKys7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CitwdXRzKCIzYiIpOworICAgIGFkZF90b2tlbihuZXcsKnArKyk7CisgICAgbmV3LT50b2tlbnNbel0rKzsKKyAgfQorfQorCitpbnQgZXhwYW5kKHRva2VubGlzdCAqZGVzdCx0b2tlbmxpc3QgKm9sZCx0b2tlbmxpc3QgKnNjcmF0Y2gxLHRva2VubGlzdCAqc2NyYXRjaDIpCit7CisgIGludCBuLGksKnAsKmVuZDsKKyAgaW50IGRpZF9yZXBsYWNlPTAsbm90ZG9uZTsKKyAgdG9rZW5saXN0ICpuZXc9c2NyYXRjaDEsKnNyYz1vbGQsdDE9ezB9LHQyPXswfTsKKyAgZG97CitwdXRzKCJzdGFydGluZyBleHBhbmQgaXRlcmF0aW9uIik7CisgICAgbm90ZG9uZT0wOworICAgIHA9c3JjLT50b2tlbnM7CisgICAgZW5kPXArc3JjLT5uZXh0OworICAgIHdoaWxlKHA8ZW5kKXsKKyAgICAgIGlmKCpwPT1US0lERU5USUZJRVJ8fCpwPT1US05VTUJFUnx8KnA9PSciJ3x8KnA9PSdcJycpeworCWlmKCpwPT1US0lERU5USUZJRVImJihuPWZpbmRfbWFjcm8odG9rZW4yc3RyaW5nKHApKSkhPTApeworCSAgdG9rZW5saXN0ICpyZXBsPSZtYWNyb190YWJsZVtuXS5yZXBsOworCSAgaWYoIShtYWNyb190YWJsZVtuXS5mbGFncyZORUVEX1BBUkVOKSl7CisJICAgIG49cmVwbC0+bmV4dDsKKwkgICAgZm9yKGk9MDtpPG47aSsrKSBhZGRfdG9rZW4obmV3LHJlcGwtPnRva2Vuc1tpXSk7CisJICAgIHArPXBbMV0rMjsKKwkgICAgZGlkX3JlcGxhY2U9bm90ZG9uZT0xOworCSAgICBjb250aW51ZTsKKwkgIH1lbHNlIGlmKHBbcFsxXSsyXT09JygnKXsKKwkgICAgdG9rZW5saXN0ICoqYXJncz1teW1hbGxvYygobWFjcm9fdGFibGVbbl0ubmFyZ3MrMSkqc2l6ZW9mKCphcmdzKSk7CisJICAgIC8qCSAgdG9rZW5saXN0ICpzY3JhdGNoPW15bWFsbG9jKHNpemVvZigqc2NyYXRjaCkpOyovCisJICAgIGludCAqciwqZW5kOworCSAgICBwKz1wWzFdKzM7CisJICAgIGZvcihpPTA7aTxtYWNyb190YWJsZVtuXS5uYXJncztpKyspeworCSAgICAgIGlmKGkhPTApeworCQlpZigqcD09JywnKSBwKys7IGVsc2UgcHV0cygiLCBleHBlY3QiKTsvKkZJWE1FKi8KKwkgICAgICB9CisJICAgICAgYXJnc1tpXT1teW1hbGxvYyhzaXplb2YoKiphcmdzKSk7CisJICAgICAgYXJnc1tpXS0+c2l6ZT0wOworCSAgICAgIGFyZ3NbaV0tPm5leHQ9MDsKKwkgICAgICBhcmdzW2ldLT50b2tlbnM9MDsKKwkgICAgICBwPWdldF9tYWNyb19hcmcoYXJnc1tpXSxwLDApOworCSAgICAgIHByaW50ZigiYXJnICVkOlxuIixpKTsKKwkgICAgICBwcmludF90b2tlbmxpc3Qoc3Rkb3V0LGFyZ3NbaV0pOworCSAgICB9CisJICAgIGlmKG1hY3JvX3RhYmxlW25dLmZsYWdzJlZBUkFSR19NQUNSTyl7CisJICAgICAgYXJnc1tpXT1teW1hbGxvYyhzaXplb2YoKiphcmdzKSk7CisJICAgICAgYXJnc1tpXS0+c2l6ZT0wOworCSAgICAgIGFyZ3NbaV0tPm5leHQ9MDsKKwkgICAgICBhcmdzW2ldLT50b2tlbnM9MDsKKwkgICAgICBpZigqcD09JywnKSBwKys7IGVsc2UgcHV0cygiLCBleHBlY3QiKTsvKkZJWE1FKi8KKwkgICAgICBwPWdldF9tYWNyb19hcmcoYXJnc1tpXSxwLDEpOworCSAgICAgIHByaW50ZigidmFyYXJnOlxuIik7CisJICAgICAgcHJpbnRfdG9rZW5saXN0KHN0ZG91dCxhcmdzW2ldKTsKKwkgICAgfQorCSAgICBpZigqcD09JyknKSBwKys7IGVsc2UgcHV0cygiKSBleHBlY3QiKTsvKkZJWE1FKi8KKwkgICAgCisJICAgIHI9bWFjcm9fdGFibGVbbl0ucmVwbC50b2tlbnM7CisJICAgIGVuZD1yK21hY3JvX3RhYmxlW25dLnJlcGwubmV4dDsKKwkgICAgd2hpbGUocjxlbmQpeworCSAgICAgIGlmKCpyPT1US0lERU5USUZJRVJ8fCpyPT1US05VTUJFUnx8KnI9PSciJ3x8KnI9PSdcJycpeworCQluPXJbMV07CisJCXB1dHMoImluc2VydCBpZG50Iik7CisJCXIrPTI7CisJCXdoaWxlKC0tbj49MCkgYWRkX3Rva2VuKG5ldywqcisrKTsKKwkJY29udGludWU7CisJICAgICAgfQorCSAgICAgIGlmKCpyPT0nIycpeworCQlyKys7CisJCWlmKCpyIT1US01BUkcpIHtwdXRzKCJodWNoPyIpO2llcnJvcigwKTsvKkZJWE1FKi99CisJCXIrKzsKKwkJbj0qcisrOworCQlzdHJpbmdpemUobmV3LGFyZ3Nbbl0pOworCQljb250aW51ZTsKKwkgICAgICB9CisJICAgICAgaWYoKnI9PVRLTUFSRyl7CisJCXQxLm5leHQ9dDIubmV4dD0wOworCQlleHBhbmQobmV3LGFyZ3NbclsxXV0sJnQxLCZ0Mik7CisJCXIrPTI7CisJCWNvbnRpbnVlOworCSAgICAgIH0KKwkgICAgICBwdXRzKCJpbnNlcnQgb3RoZXIiKTsKKwkgICAgICBhZGRfdG9rZW4obmV3LCpyKyspOworCSAgICB9CisJICAgIAorCSAgICBmb3IoaT0wO2k8bWFjcm9fdGFibGVbbl0ubmFyZ3M7aSsrKSBmcmVlKGFyZ3NbaV0pOworCSAgICBpZihtYWNyb190YWJsZVtuXS5mbGFncyZWQVJBUkdfTUFDUk8pIGZyZWUoYXJnc1tpXSk7CisJICAgIGZyZWUoYXJncyk7CisJICAgIGRpZF9yZXBsYWNlPW5vdGRvbmU9MTsKKwkgICAgY29udGludWU7CisJICB9CisJfQorCWFkZF90b2tlbihuZXcsKnArKyk7CisJbj0qcCsrOworCWFkZF90b2tlbihuZXcsbik7CisJZm9yKGk9MDtpPG47aSsrKSBhZGRfdG9rZW4obmV3LCpwKyspOworICAgICAgfWVsc2UKKwlhZGRfdG9rZW4obmV3LCpwKyspOworICAgIH0KKyAgICBpZighbm90ZG9uZSl7CitwdXRzKCJleHBhbmQgZG9uZSwgY29weWluZyIpOworcHJpbnRfdG9rZW5saXN0KHN0ZG91dCxuZXcpOworICAgICAgY29weV90b2tlbmxpc3QoZGVzdCxuZXcpOworcHV0cygiY29weSBkb25lIik7CisgICAgfWVsc2V7CitwdXRzKCJuZWVkIGFub3RoZXIgaXRlcmF0aW9uIik7CisgICAgICBzcmM9bmV3OworICAgICAgaWYobmV3PT1zY3JhdGNoMSkKKwluZXc9c2NyYXRjaDI7CisgICAgICBlbHNlCisJbmV3PXNjcmF0Y2gxOworICAgICAgbmV3LT5uZXh0PTA7CisgICAgfQorICB9d2hpbGUobm90ZG9uZSk7CisgIHJldHVybiBkaWRfcmVwbGFjZTsKK30KKworI2VuZGlmIC8qIE9CRlVTQ0FUT1IgKi8KKworbWFpbigpCit7CisgIGludCBpLGxhc3RsaW5lPWxpbmUsKnA7CisgIHRva2VubGlzdCB0bD17MH0sdDI9ezB9LHQzPXswfSx0ND17MH07CisgIGluZmlsZT1pbmNsdWRlX2ZpbGUoMCk7CisjaWZuZGVmIE9CRlVTQ0FUT1IgIAorICBoYXNoX3RhYmxlPW15bWFsbG9jKFBQX0hTSVpFKnNpemVvZigqaGFzaF90YWJsZSkpOworICBmb3IoaT0wO2k8UFBfSFNJWkU7aSsrKSBoYXNoX3RhYmxlW2ldPTA7CisjZW5kaWYgIAorICB3aGlsZSgxKXsKKyAgICB0bC5uZXh0PTA7CisgICAgd2hpbGUoIShpPWdldF9uZXh0X3Rva2VuKCZ0bCkpKTsKKyAgICBhZGRfdG9rZW4oJnRsLFRLRU9MKTsKKyAgICBwcmludF9jb2RlKHN0ZG91dCwmdGwpOworICAgIGlmKGk9PUVPRil7CisJaW5maWxlPWNsb3NlX2ZpbGUoKTsKKwlpZighaW5maWxlKSBleGl0KDApOworICAgIH0KKyNpZm5kZWYgT0JGVVNDQVRPUgorICAgIHA9JnRsLnRva2Vuc1swXTsKKyAgICB3aGlsZSgqcD09JyAnKSBwKys7CisgICAgaWYoKnA9PScjJyYmKHBbMV09PVRLSURFTlRJRklFUnx8KHBbMV09PScgJyYmcFsyXT09VEtJREVOVElGSUVSKSkpeworICAgICAgY2hhciAqczsKKyAgICAgIHArKzsKKyAgICAgIGlmKCpwIT1US0lERU5USUZJRVIpIHArKzsKKyAgICAgIHM9dG9rZW4yc3RyaW5nKHApOworICAgICAgaWYoIXN0cmNtcChzLCJpbmNsdWRlIikpeworCXB1dHMoImluY2x1ZGUgZm91bmQiKTsKKwkqcD1US05VTUJFUjsgLyogcHJldmVudCBleHBhbnNpb24gKi8KKwlwKz0yK3BbMV07CisJaT1wLSZ0bC50b2tlbnNbMF07CisJdDIubmV4dD0wOworCXQzLm5leHQ9MDsKKwl0NC5uZXh0PTA7CisJZXhwYW5kKCZ0MiwmdGwsJnQzLCZ0NCk7CisJcD0mdDIudG9rZW5zW2ldOworCXdoaWxlKCpwPT0nICcpIHArKzsKK3ByaW50ZigiKnA9JWRcbiIsKnApOworCWlmKCpwPT0nXCInKXsKKwkgIHM9dG9rZW4yc3RyaW5nKHApOworCSAgaW5maWxlPWluY2x1ZGVfZmlsZShzKTsKKwkgIGlmKCFpbmZpbGUpIGluZmlsZT1jbG9zZV9maWxlKCk7CisJICBpZighaW5maWxlKSB7ZXhpdChFWElUX0ZBSUxVUkUpOy8qRklYTUUqL30KKwl9CisJCisJY29udGludWU7CisgICAgICB9ZWxzZSBpZighc3RyY21wKHMsImRlZmluZSIpKXsKKwlwdXRzKCJkZWZpbmUgZm91bmQiKTsKKwlwKz0yK3BbMV07CisJd2hpbGUoKnA9PScgJykgcCsrOworCWlmKCpwIT1US0lERU5USUZJRVIpeworCSAgcHV0cygiI2RlZmluZSBuZWVkcyBJRCIpOworCX1lbHNleworCSAgY2hhciAqbW5hbWU7CisJICBpbnQgZmxhZ3M9MCxuYXJncz0wOworCSAgc3RhdGljIGNoYXIgKipwbmFtZXM7CisJICBzdGF0aWMgaW50IHBuc2l6ZTsKKworCSAgcz10b2tlbjJzdHJpbmcocCk7CisJICBwKz0yK3BbMV07CisJICBtbmFtZT1teW1hbGxvYyhzdHJsZW4ocykrMSk7CisJICBzdHJjcHkobW5hbWUscyk7CisJICBwcmludGYoImlkPSVzXG4iLG1uYW1lKTsKKwkgIHdoaWxlKCpwPT0nICcpIHArKzsKKwkgIGlmKCpwPT0nKCcpeworCSAgICBwdXRzKCJmdW5jdGlvbi1saWtlIik7CisJICAgIHArKzsKKwkgICAgd2hpbGUoKnA9PScgJykgcCsrOworCSAgICB3aGlsZSgqcD09VEtJREVOVElGSUVSKXsKKwkgICAgICBmbGFncz0wOworCSAgICAgIHM9dG9rZW4yc3RyaW5nKHApOworCSAgICAgIHArPXBbMV0rMjsKKwkgICAgICBwcmludGYoInBhcmFtZXRlciAlc1xuIixzKTsKKwkgICAgICBpZihuYXJncz49cG5zaXplKXsKKwkJcG5zaXplKz1QUF9NU0laRTsKKwkJcG5hbWVzPW15cmVhbGxvYyhwbmFtZXMscG5zaXplKnNpemVvZigqcG5hbWVzKSk7CisJICAgICAgfQorCSAgICAgIGZvcihpPTA7aTxuYXJncztpKyspCisJCWlmKCFzdHJjbXAocG5hbWVzW2ldLHMpKSBwdXRzKCJkb3VibGUgcGFyYW1ldGVyIik7CisJICAgICAgcG5hbWVzW25hcmdzXT1teW1hbGxvYyhzdHJsZW4ocykrMSk7CisJICAgICAgc3RyY3B5KHBuYW1lc1tuYXJnc10scyk7CisJICAgICAgbmFyZ3MrKzsKKwkgICAgICB3aGlsZSgqcD09JyAnKSBwKys7CisJICAgICAgaWYoKnA9PScsJyl7IHArKztmbGFncz0xO30KKwkgICAgICB3aGlsZSgqcD09JyAnKSBwKys7CisJICAgIH0KKwkgICAgaWYoZmxhZ3MpeworCSAgICAgIGZsYWdzPU5FRURfUEFSRU47CisJICAgICAgaWYoKnA9PVRLREREKXtwKys7ZmxhZ3N8PVZBUkFSR19NQUNSTzt9ZWxzZSBwdXRzKCIuLi4vLCIpOy8qRklYTUUqLworCSAgICAgIHdoaWxlKCpwPT0nICcpIHArKzsKKwkgICAgICBpZigqcD09JyknKSBwKys7IGVsc2UgcHV0cygiKSBleHBlY3QiKTsvKkZJWE1FKi8KKwkgICAgfWVsc2V7CisJICAgICAgZmxhZ3M9TkVFRF9QQVJFTjsKKwkgICAgICBpZigqcD09JyknKSBwKys7IGVsc2UgcHV0cygiKSBleHBlY3QiKTsvKkZJWE1FKi8KKwkgICAgfQorCSAgfQorCSAgLypGSVhNRTogIyBtdXN0IGJlIGZvbGxvd2VkIGJ5IHBhcmFtZXRlciAqLworCSAgdDIubmV4dD0wOworCSAgd2hpbGUoKnA9PScgJykgcCsrOworCSAgd2hpbGUocDx0bC50b2tlbnMrdGwubmV4dCYmKnAhPSdcbicpeworCSAgICBpZigqcD09VEtJREVOVElGSUVSKXsKKwkgICAgICBzPXRva2VuMnN0cmluZyhwKTsKKwkgICAgICBmb3IoaT0wO2k8bmFyZ3M7aSsrKXsKKwkJaWYoIXN0cmNtcChwbmFtZXNbaV0scykpIGJyZWFrOworCSAgICAgIH0KKwkgICAgICBpZihpPG5hcmdzfHwoKGZsYWdzJlZBUkFSR19NQUNSTykmJiFzdHJjbXAoIl9fVkFfQVJHU19fIixzKSkpeworCQlwKz1wWzFdKzI7CisJCWFkZF90b2tlbigmdDIsVEtNQVJHKTsKKwkJYWRkX3Rva2VuKCZ0MixpKTsKKwkJY29udGludWU7CisJICAgICAgfQorCSAgICB9CisJICAgIGFkZF90b2tlbigmdDIsKnArKyk7CisJICB9CisJICBmb3IoaT0wO2k8bmFyZ3M7aSsrKSBmcmVlKHBuYW1lc1tpXSk7CisJICBpPW5ld19tYWNybyhtbmFtZSxmbGFncyxuYXJncywmdDIpOworCSAgYWRkX21hY3JvKGkpOworCSAgcHJpbnRmKCJyZXBsYWNlbWVudC1saXN0IGZvciAlc1xuIixtbmFtZSk7CisJICBwcmludF90b2tlbmxpc3Qoc3Rkb3V0LCZ0Mik7CisJfQorICAgICAgfQorICAgIH1lbHNleworICAgICAgdDIubmV4dD0wOworICAgICAgdDMubmV4dD0wOworICAgICAgdDQubmV4dD0wOworICAgICAgZXhwYW5kKCZ0MiwmdGwsJnQzLCZ0NCk7CisgICAgICAvKiAgICAgIHByaW50X3Rva2VubGlzdChzdGRvdXQsJnQyKTsqLworICAgICAgcHJpbnRfY29kZShzdGRvdXQsJnQyKTsKKyAgICB9CisjZW5kaWYgLyogT0JGVVNDQVRPUiAqLyAgICAKKyAgfQorfQpkaWZmIC0tZ2l0IGEvcHB0c3QuaCBiL3BwdHN0LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzg4ZmI0NQotLS0gL2Rldi9udWxsCisrKyBiL3BwdHN0LmgKQEAgLTAsMCArMSwzNCBAQAordGVzdAoraGVsbG8KK2NvblwKK2NhdGVuYXRlZAorbm90XCAKK2NvbmNhdGVuYXRlZAorPz89IAorPz8oIAorPz8vIAorPz8pIAorPz8nIAorPz88IAorPz8hIAorPz8+IAorPz8tIAorRnJvbSBzdGFuZGFyZDogcHJpbnRmKCJFaD8/Py9uIik7Citjb24/Py8KK2NhdGVuYXRlZCB3aXRoIHRyaWdyYXBoCisKKyMgLyogICAqLyBkZWZpbmUgZmFpbCBzdWNjZWVkCitmYWlsCisjdW5kZWYgZmFpbAorICNkZWZpbmUgZmFpbCBzdWNjZWVkCitmYWlsCisKKyNkZWZpbmUgeChhLGIpIGErYgorCit4KDEyCisyMworLAorMzQKKzQ1CispCisKZGlmZiAtLWdpdCBhL3ByZXByb2MuYyBiL3ByZXByb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NGY2NzAxCi0tLSAvZGV2L251bGwKKysrIGIvcHJlcHJvYy5jCkBAIC0wLDAgKzEsMjUwNiBAQAorLyogVE9ETzoKKworICAgLS0tLSBISUdIRVNUIFBSSU9SSVRZIC0tLS0KKworICAgKiAjaWZuZGVmCisKKyAgICogI2lmLyNlbGlmIC0gQmVhcmJlaXR1bmcKKworICAgKiBsZWVyZSBhcmd1bWVudC0vdG9rZW5saXN0cyBlcmxhdWJlbgorCisgICAqIEFuemFobCBkZXIgQXJndW1lbnRlIGNoZWNrZW4gKGF1Y2ggenV2aWVsZSBlcmdlYmVuIGVpbmVuIEVycm9yKQorCisgICAqIGJlaSBSRURFRklOSU5HIHVuZCBhbGxvd3JlZGVmaW5pdGlvbj0wIHRva2VubGlzdCBnZW5hdSB1ZWJlcnBydWVmZW4KKworICAgKiBBdWZ0ZWlsZW4gaW4gbWVocmVyZSBTb3VyY2VuIG1haW4uYyBwcGxpc3RzLmMgZXRjLgorICAgKiBFaW5pZ2UgVmFyaWFibGVuIHVtYmVuZW5uZW4gKHgseSxpLGosbCxuIGV0YyA9OCkKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgKiBWZXJiZXNzZXJ1bmdlbjoKKyAgICogLSBOYWNoIG1hbGxvYygpL3ZvciBmcmVlKCkgdWViZXJwcnVlZmVuIG9iIE5VTEwtUG9pbnRlcgorICAgKiAtIFN0YXR0IHBlciBkbGVuIHBlciBQdHIyRU9MIGFiZnJhZ2VuLi4KKworICAgKiBGcmFnZW4gYW4gVm9sa2VyOgorICAgKiAtIF8gYWxsZWluZSBlaW4gSWRlbnRpZmllciA/IEphCisKKyAgIC0tLS0gTE9XRVNUIFBSSU9SSVRZIC0tLS0KKworICAgKiAtIFRva2VuIGxvZXNjaGVuLCB3ZW5uIG51ciBub2NoIFRva2VuTGlzdCBiZW51dHp0IHdpcmQuCisKKyAgICogLSBQYXJzZUlkZW50Li4gb3B0aW1pZXJlbgorCisgICAqIC0gUmVzdCBvcHRpbWllcmVuID04KQorCisgICAqIC0gUHJlUGFyc2luZyB1bXNjaHJlaWJlbi4uIF9fTElORV9fIG11c3MgbWl0IGRlciBlY2h0ZW4KKyAgICogICAgWmVpbGVubnVtbWVyIHVlYmVyZWluc3RpbW1lbiAoZGllIExGcyBkcmlubGFzc2VuKQorICovCisKKy8qCisgKiBQcmVQcm9jZXNzb3IKKyAqICRWRVI6IFZCUFAgVjAuMDAgKDE5IFNlcCAxOTk1KQorICogKHcpIDE5OTUgYnkgVGhvcnN0ZW4gU2NoYWFwcworICovCisKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJ2YmMuaCIKKyNpbmNsdWRlICJ2YnBwLmgiCisKKy8qdmI6ICAgKi8KK3N0YXRpYyBjaGFyIEZJTEVfW109X19GSUxFX187CisKKy8qdmI6ICAgKi8KK2NoYXIgcHBfdmVyc2lvbltdID0gInZicHAgVjAuMDAgKHcpIDE5OTUgYnkgVGhvcnN0ZW4gU2NoYWFwcyI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogI2RlZmluZSBNQVhJRk5FU1RJTkcgMTAyNCAqLy8qdmI6IGlmbmVzdGluZz09aW5jbmVzdGluZyAqLworCitGSUxFICppbltNQVhJTkNORVNUSU5HXTsgICAgICAgIC8qICBTb3VyY2VmaWxlcyAgICAgKi8KK2ludCB6bltNQVhJTkNORVNUSU5HXTsgICAgICAgICAgLyogIFplaWxlbm51bW1lcm4gICAqLworY2hhciAqZmlsZW5hbWVzW01BWElOQ05FU1RJTkddOyAgLyogIEZpbGVuYW1lbiAgICovCitpbnQgaW5jbmVzdGluZzsgICAgICAgICAgICAgICAgIC8qICBha3R1ZWxsZSBWZXJzY2hhY2h0ZWx1bmdzdGllZmUgICovCit1bnNpZ25lZCBsb25nIGxpbmVucjsgICAgICAgICAgIC8qICBaZWlsZW5udW1tZXIgKi8KKworY2hhciAqaW5jcGF0aFtNQVhJTkNQQVRIU10gPQoreyJ2aW5jbHVkZToifTsgICAgICAgICAgICAgICAgICAvKiAgSW5jbHVkZXBmYWRlICAgICovCisKK2ludCBpbmNwYXRoYyA9IDE7ICAgICAgICAgICAgICAgLyogIEFuemFobCBkZXIgSW5jbHVkZXBmYWRlICAgICAqLworCitjaGFyIHBwc3RyaW5nW01BWFBQSU5QVVRdOworCitpbnQgY210bmVzdGluZyA9IDA7ICAgICAgICAgICAgIC8qICBha3R1ZWxsZSBLb21tZW50YXItVmVyc2NoLi1UaWVmZSAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmludCBpZm5lc3Rpbmc7ICovLyp2YjogKi8vKiAgYWt0dWVsbGUgSUYtVGllZmUgKi8KKy8qdmI6IGlmbmVzdGluZz09aW5jbmVzdGluZyAqLworc2hvcnQgaWZzdGF0dXNbTUFYSU5DTkVTVElOR107ICAvKiBBcnJheSBmdWVyIFN0YXR1cy1WZXJzY2hhY2h0ZWx1bmcgKi8KK2ludCBpZl9jbnQ7ICAgICAgICAgICAgICAgICAgICAgLyogWmFlaGxlciBmdWVyICNpZidzIHdhZWhyZW5kIGRvX291dHB1dD0wICovCitpbnQgYWJzX2lmX2NudDsgICAgICAgICAgICAgICAgIC8qIHphZWhsdCBhdWNoIHdhZWhyZW5kIGRvX291dHB1dCAqLworCitpbnQgZG9fb3V0cHV0ID0gMTsgICAgICAgICAgICAgIC8qIEZsYWcgenVyIEVyemV1Z3VuZyBlaW5lcyBPdXRwdXRzICovCisKK3N0cnVjdCBzdHJub2RlICpzdHJsaXN0OworCitzdHJ1Y3QgbW5vZGUgKm1saXN0OworCitpbnQgZGlkX2V4cGFuZDsKKworLyogVGVtcG9yYWVyZSBEZWJ1Z2dpbmctUm91dGluZW4gKi8KK3ZvaWQgUHJpbnRTTihzdHJ1Y3Qgc3Rybm9kZSAqdGwpCit7CisgICAgc3dpdGNoICh0bC0+dHlwZSkgeworICAgIGNhc2UgTk9STUFMOgorICAgICAgICBwcmludGYoIiBOb3JtYWwuLi4uLi4uLjoiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQUF9JREVOVDoKKyAgICAgICAgcHJpbnRmKCIgSWRlbnRpZmllci4uLi46Iik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVJHVU1FTlQ6CisgICAgICAgIHByaW50ZigiIEFyZ3VtZW50IE5yLiUyZDoiLCB0bC0+bnVtYmVyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOVU1CRVI6CisgICAgICAgIHByaW50ZigiIE51bWJlci4uLi4uLi4uOiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBQX1NUUjoKKyAgICAgICAgcHJpbnRmKCIgU3RyaW5nLi4uLi4uLi46Iik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1BBQ0U6CisgICAgICAgIHByaW50ZigiIFNwYWNlLi4uLi4uLi4uOiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNQRUNJQUw6CisgICAgICAgIHByaW50ZigiIFNwZWNpYWwuLk5yLiUyZDoiLCB0bC0+ZmxhZ3MpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBwcmludGYoIiB1bmtub3duLi5Oci4lMmQ6IiwgdGwtPnR5cGUpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcHJpbnRmKCIgJXNcbiIsIHRsLT5zdHIpOworfQordm9pZCBQcmludFRMKHN0cnVjdCBzdHJub2RlICp0bCkKK3sKKworI2lmZGVmIGJsYQorCisgICAgaWYgKHRsKSB7CisgICAgICAgIHByaW50ZigiVG9rZW5MaXN0OlxuIik7CisgICAgICAgIHdoaWxlICh0bCkgeworICAgICAgICAgICAgUHJpbnRTTih0bCk7CisgICAgICAgICAgICB0bCA9IHRsLT5uZXh0OworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKK30KKworCisvKiAqKioqKioqIExpc3Rlbi1GdW5rdGlvbmVuICoqKioqKiogKi8KKworLyogQWRkTWFrcm9Ob2RlIC0gRnVlZ3QgZWluZSBOb2RlIGFuIGRlbiBBbmZhbmcgZWluZXIgTGlzdGUgZWluICovCit2b2lkIEFkZE1ha3JvTm9kZShzdHJ1Y3QgbW5vZGUgKipsaXN0LCBzdHJ1Y3QgbW5vZGUgKm5vZGUpCit7CisKKyAgICBpZiAoREVCVUcgJiAzMikKKyAgICAgICAgcHV0cygiQWRkTWFrcm9Ob2RlIik7CisKKyAgICBpZiAobm9kZSkgeworICAgICAgICBub2RlLT5wcmV2ID0gTlVMTDsKKyAgICAgICAgbm9kZS0+bmV4dCA9ICpsaXN0OworICAgICAgICAqbGlzdCA9IG5vZGU7CisgICAgICAgIGlmIChub2RlLT5uZXh0KQorICAgICAgICAgICAgbm9kZS0+bmV4dC0+cHJldiA9IG5vZGU7CisgICAgfQorfQorCisKKy8qIEFkZFN0ck5vZGUgLSBGdWVndCBlaW5lIE5vZGUgaW4gZGllIExpc3RlIGVpbiAqLwordm9pZCBBZGRTdHJOb2RlKHN0cnVjdCBzdHJub2RlICoqbGlzdCwgc3RydWN0IHN0cm5vZGUgKm5vZGUsIGNoYXIgKnN0cikKK3sKKworICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICBwdXRzKCJBZGRTdHJOb2RlIik7CisKKworICAgIGlmIChub2RlIHx8IHN0cikgeworICAgICAgICBpZiAoIW5vZGUpCisgICAgICAgICAgICBub2RlID0gKHN0cnVjdCBzdHJub2RlICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IHN0cm5vZGUpKTsKKyAgICAgICAgLyogSElFUjogUnVlY2tnYWJld2VydCB3ZWdlbiBGZWhsZXIgISAqLworICAgICAgICBpZiAoIW5vZGUpIHsKKyAgICAgICAgICAgIGVycm9yKDE5Nik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub2RlLT5wcmV2ID0gTlVMTDsKKyAgICAgICAgICAgIG5vZGUtPm5leHQgPSAqbGlzdDsKKyAgICAgICAgICAgIGlmIChzdHIpCisgICAgICAgICAgICAgICAgbm9kZS0+c3RyID0gc3RyOworICAgICAgICAgICAgKmxpc3QgPSBub2RlOworICAgICAgICAgICAgaWYgKG5vZGUtPm5leHQpCisgICAgICAgICAgICAgICAgbm9kZS0+bmV4dC0+cHJldiA9IG5vZGU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyogQWRkU3RyTm9kZUJlaGluZCAtIEZ1ZWd0IGVpbmUgTm9kZSBhbnMgRW5kZSBkZXIgTGlzdGUgZWluICovCit2b2lkIEFkZFN0ck5vZGVCZWhpbmQoc3RydWN0IHN0cm5vZGUgKipsaXN0LCBzdHJ1Y3Qgc3Rybm9kZSAqbm9kZSwgY2hhciAqc3RyKQoreworICAgIHN0cnVjdCBzdHJub2RlICpsaXN0bm9kZTsKKworICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICBwdXRzKCJBZGRTdHJOb2RlQmVoaW5kIik7CisKKworICAgIGlmIChub2RlIHx8IHN0cikgeworICAgICAgICBpZiAoIW5vZGUpCisgICAgICAgICAgICBub2RlID0gKHN0cnVjdCBzdHJub2RlICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IHN0cm5vZGUpKTsKKyAgICAgICAgaWYgKCFub2RlKSB7CisgICAgICAgICAgICBlcnJvcigxOTYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCEqbGlzdCkgeworICAgICAgICAgICAgICAgIG5vZGUtPnByZXYgPSBOVUxMOworICAgICAgICAgICAgICAgIG5vZGUtPm5leHQgPSBOVUxMOworICAgICAgICAgICAgICAgICpsaXN0ID0gbm9kZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGlzdG5vZGUgPSAqbGlzdDsKKyAgICAgICAgICAgICAgICB3aGlsZSAobGlzdG5vZGUtPm5leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdG5vZGUgPSBsaXN0bm9kZS0+bmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9kZS0+cHJldiA9IGxpc3Rub2RlOworICAgICAgICAgICAgICAgIG5vZGUtPm5leHQgPSBOVUxMOworICAgICAgICAgICAgICAgIGxpc3Rub2RlLT5uZXh0ID0gbm9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHIpCisgICAgICAgICAgICAgICAgbm9kZS0+c3RyID0gc3RyOworICAgICAgICB9CisgICAgfQorfQorCisKKy8qIFJlbU1ha3JvTm9kZSAtIEVudGZlcm50IGVpbmUgTm9kZSBhdXMgZGVyIExpc3RlIG9obmUgc2llIHp1IGxvZXNjaGVuICovCit2b2lkIFJlbU1ha3JvTm9kZShzdHJ1Y3QgbW5vZGUgKipsaXN0LCBzdHJ1Y3QgbW5vZGUgKm5vZGUpCit7CisKKyAgICBpZiAoREVCVUcgJiAzMikKKyAgICAgICAgcHV0cygiUmVtTWFrcm9Ob2RlIik7CisKKworICAgIGlmIChub2RlLT5wcmV2KSB7CisgICAgICAgIGlmIChub2RlLT5uZXh0KQorICAgICAgICAgICAgbm9kZS0+bmV4dC0+cHJldiA9IG5vZGUtPnByZXY7CisgICAgICAgIG5vZGUtPnByZXYtPm5leHQgPSBub2RlLT5uZXh0OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChub2RlLT5uZXh0KQorICAgICAgICAgICAgbm9kZS0+bmV4dC0+cHJldiA9IE5VTEw7CisgICAgICAgICpsaXN0ID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgbm9kZS0+bmV4dCA9IG5vZGUtPnByZXYgPSBOVUxMOworfQorCisvKiBJbnNlcnRNYWtyb05vZGUgLSBTZXR6dCBlaW5lIE5vZGUgaGludGVyIGVpbmVyIGFuZGVyZW4gZWluICovCit2b2lkIEluc2VydE1ha3JvTm9kZShzdHJ1Y3QgbW5vZGUgKipsaXN0LCBzdHJ1Y3QgbW5vZGUgKm5vZGUsIHN0cnVjdCBtbm9kZSAqYmVoaW5kKQoreworCisgICAgaWYgKERFQlVHICYgMzIpCisgICAgICAgIHB1dHMoIkluc2VydE1ha3JvTm9kZSIpOworCisKKyAgICBpZiAoYmVoaW5kKSB7CisgICAgICAgIG5vZGUtPnByZXYgPSBiZWhpbmQ7CisgICAgICAgIG5vZGUtPm5leHQgPSBiZWhpbmQtPm5leHQ7CisgICAgICAgIGJlaGluZC0+bmV4dCA9IG5vZGU7CisgICAgICAgIGlmIChub2RlLT5uZXh0KQorICAgICAgICAgICAgbm9kZS0+bmV4dC0+cHJldiA9IG5vZGU7CisgICAgfSBlbHNlCisgICAgICAgIEFkZE1ha3JvTm9kZShsaXN0LCBub2RlKTsKK30KKworLyogUmVtU3RyTm9kZSAtIEVudGZlcm50IGVpbmUgTm9kZSBhdXMgZGVyIExpc3RlIG9obmUgc2llIHp1IGxvZXNjaGVuICovCit2b2lkIFJlbVN0ck5vZGUoc3RydWN0IHN0cm5vZGUgKipsaXN0LCBzdHJ1Y3Qgc3Rybm9kZSAqbm9kZSkKK3sKKworICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICBwdXRzKCJSZW1TdHJOb2RlIik7CisKKworICAgIGlmIChub2RlLT5wcmV2KSB7CisgICAgICAgIGlmIChub2RlLT5uZXh0KQorICAgICAgICAgICAgbm9kZS0+bmV4dC0+cHJldiA9IG5vZGUtPnByZXY7CisgICAgICAgIG5vZGUtPnByZXYtPm5leHQgPSBub2RlLT5uZXh0OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChub2RlLT5uZXh0KQorICAgICAgICAgICAgbm9kZS0+bmV4dC0+cHJldiA9IE5VTEw7CisgICAgICAgICpsaXN0ID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgbm9kZS0+bmV4dCA9IG5vZGUtPnByZXYgPSBOVUxMOworfQorCisKKy8qIEZpbmRNYWtyb05vZGUgLSBzdWNodCBkZW4gcGFzc2VuZGVuIEVpbnRyYWcgaW4gZGVyIExpc3RlCisgKiAgICAgICAgICAgICAgICAgbGVuPTAgLSBkZXIgZ2VzYW10ZSBTdHJpbmcgbXVzcyB1ZWJlcmVpbnN0aW1tZW4KKyAqICAgICAgICAgICAgICAgICBsZW4+MCAtIGRpZSBlcnN0ZW4gbGVuIFplaWNoZW4gbXVlc3NlbiBzdGltbWVuCisgKi8KK3N0cnVjdCBtbm9kZSAqRmluZE1ha3JvTm9kZShzdHJ1Y3QgbW5vZGUgKmxpc3QsIGNoYXIgKnN0ciwgaW50IGxlbikKK3sKKworICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICBwdXRzKCJGaW5kTWFrcm9Ob2RlIik7CisKKyAgICB3aGlsZSAobGlzdCkgeworICAgICAgICBpZiAobGVuKSB7CisgICAgICAgICAgICBpZiAoKHN0cmxlbihsaXN0LT5uYW1lKSA9PSBsZW4pICYmICghc3RybmNtcChsaXN0LT5uYW1lLCBzdHIsIGxlbikpKQorICAgICAgICAgICAgICAgIHJldHVybiAobGlzdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChsaXN0LT5uYW1lLCBzdHIpKQorICAgICAgICAgICAgICAgIHJldHVybiAobGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CisgICAgfQorICAgIHJldHVybiAoMCk7Cit9CisKKworLyogRGVsTWFrcm9Ob2RlIC0gZ2lidCBkZW4gZ2VzYW10ZW4gU3BlaWNoZXIgZWluZXIgTm9kZSBmcmVpLCBpc3QgbGlzdCNOVUxMCisgKiAgICAgICAgICAgICAgICB3aXJkIGRpZSBOb2RlIHZvcmhlciBhdXMgZGVyIExpc3RlIGVudGZlcm50CisgKi8KK3ZvaWQgRGVsTWFrcm9Ob2RlKHN0cnVjdCBtbm9kZSAqKmxpc3QsIHN0cnVjdCBtbm9kZSAqbm9kZSkKK3sKKworICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICBwdXRzKCJEZWxNYWtyb05vZGUiKTsKKworCisgICAgaWYgKG5vZGUpIHsKKyAgICAgICAgaWYgKGxpc3QgJiYgKmxpc3QpCisgICAgICAgICAgICBSZW1NYWtyb05vZGUobGlzdCwgbm9kZSk7CisgICAgICAgIGlmIChub2RlLT5uYW1lKQorICAgICAgICAgICAgZnJlZShub2RlLT5uYW1lKTsKKyAgICAgICAgaWYgKG5vZGUtPmFyZ3MpCisgICAgICAgICAgICBmcmVlKG5vZGUtPmFyZ3MpOworICAgICAgICBpZiAobm9kZS0+dG9rZW4pCisgICAgICAgICAgICBmcmVlKG5vZGUtPnRva2VuKTsKKyAgICAgICAgaWYgKG5vZGUtPnRva2VubGlzdCkKKyAgICAgICAgICAgIERlbFN0ckxpc3QoJm5vZGUtPnRva2VubGlzdCk7CisgICAgICAgIGZyZWUobm9kZSk7CisgICAgfQorfQorCisKKy8qIERlbFN0ck5vZGUgLSBnaWJ0IGRlbiBnZXNhbXRlbiBTcGVpY2hlciBlaW5lciBOb2RlIGZyZWksIGlzdCBsaXN0I05VTEwKKyAqICAgICAgICAgICAgICB3aXJkIGRpZSBOb2RlIHZvcmhlciBhdXMgZGVyIExpc3RlIGVudGZlcm50CisgKi8KK3ZvaWQgRGVsU3RyTm9kZShzdHJ1Y3Qgc3Rybm9kZSAqKmxpc3QsIHN0cnVjdCBzdHJub2RlICpub2RlKQoreworCisgICAgaWYgKERFQlVHICYgMzIpCisgICAgICAgIHB1dHMoIkRlbFN0ck5vZGUiKTsKKworCisgICAgaWYgKG5vZGUpIHsKKyAgICAgICAgaWYgKGxpc3QgJiYgKmxpc3QpCisgICAgICAgICAgICBSZW1TdHJOb2RlKGxpc3QsIG5vZGUpOworICAgICAgICBpZiAobm9kZS0+c3RyKQorICAgICAgICAgICAgZnJlZShub2RlLT5zdHIpOworICAgICAgICBmcmVlKG5vZGUpOworICAgIH0KK30KKwordm9pZCBNZXJnZVN0ck5vZGVzKHN0cnVjdCBzdHJub2RlICpwcmV2LCBzdHJ1Y3Qgc3Rybm9kZSAqbmV4dCkKK3sKKyAgICAvKiBuZXh0IHdpbGwgbm93IGJlIGRlbGV0ZWQgYW5kIHByZXYtPnN0ciB3aWxsIGJlICovCisgICAgLyogdGhlIGpvaW5lZCBzdHJpbmdzIGZyb20gcHJldiZuZXh0ICovCisgICAgY2hhciAqbmV3c3RyOworLyp2YjogICAqLworICAgIGNoYXIgYywgKnMsICpkOworCisgICAgaWYgKERFQlVHICYgMzIpCisgICAgICAgIHB1dHMoIk1lcmdlU3RyTm9kZXMiKTsKKworCisgICAgbmV3c3RyID0gKGNoYXIgKikgbWFsbG9jKHByZXYtPmxlbiArIG5leHQtPmxlbiArIDEpOworLyp2Yjogc3RyaW5nLVJvdXRpbmVuIGVyc2V0enQgKGhvZmZlbnRsaWNoIHNjaG5lbGxlcikKKyAgIHN0cmNweShuZXdzdHIscHJldi0+c3RyKTsKKyAgIHN0cmNhdChuZXdzdHIsbmV4dC0+c3RyKTsKKyAqLworICAgIGQgPSBuZXdzdHI7CisgICAgcyA9IHByZXYtPnN0cjsKKyAgICBkbyB7CisgICAgICAgIGMgPSAqcysrOworICAgICAgICAqZCsrID0gYzsKKyAgICB9IHdoaWxlIChjKTsKKyAgICBkLS07CisgICAgcyA9IG5leHQtPnN0cjsKKyAgICBkbyB7CisgICAgICAgIGMgPSAqcysrOworICAgICAgICAqZCsrID0gYzsKKyAgICB9IHdoaWxlIChjKTsKKworICAgIGlmIChwcmV2LT5zdHIpCisgICAgICAgIGZyZWUocHJldi0+c3RyKTsgICAgICAgIC8qdmI6IHdlbm4gcHJldi0+c3RyPT0wIGtuYWxsdHMgZG9jaCBzY2hvbiBvYmVuPyAqLworICAgIHByZXYtPnN0ciA9IG5ld3N0cjsKKyAgICBwcmV2LT5sZW4gKz0gbmV4dC0+bGVuOworICAgIERlbFN0ck5vZGUoTlVMTCwgbmV4dCk7Cit9CisKKy8qIERlbE1ha3JvTGlzdCAtIGxvZXNjaHQgZWluZSBnZXNhbXRlIExpc3RlICovCit2b2lkIERlbE1ha3JvTGlzdChzdHJ1Y3QgbW5vZGUgKipsaXN0KQoreworCisgICAgaWYgKERFQlVHICYgMzIpCisgICAgICAgIHB1dHMoIkRlbE1ha3JvTGlzdCIpOworCisKKyAgICB3aGlsZSAoKmxpc3QpCisgICAgICAgIERlbE1ha3JvTm9kZShsaXN0LCAqbGlzdCk7CisgICAgLyogICpsaXN0PU5VTEw7ICovLyp2YjogKmxpc3Q9PTAgKi8KK30KKworCisvKiBEZWxTdHJMaXN0IC0gbG9lc2NodCBlaW5lIGdlc2FtdGUgTGlzdGUgc2FtdCBkZXIgTm9kZXMvU3RyaW5ncyAqLwordm9pZCBEZWxTdHJMaXN0KHN0cnVjdCBzdHJub2RlICoqbGlzdCkKK3sKKworICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICBwdXRzKCJEZWxTdHJMaXN0Iik7CisKKworICAgIHdoaWxlICgqbGlzdCkKKyAgICAgICAgRGVsU3RyTm9kZShsaXN0LCAqbGlzdCk7CisgICAgLyogICpsaXN0PU5VTEw7ICovLyp2YjogKmxpc3Q9PTAgKi8KK30KKworLyogQWxsb2NTcGFjZSAtIGVyemV1Z3QgZWluZSBTdHJOb2RlIHZvbSBUeXAgU3BhY2UgKi8KK3N0cnVjdCBzdHJub2RlICpBbGxvY1NwYWNlKCkKK3sKKyAgICBzdHJ1Y3Qgc3Rybm9kZSAqbmV3bm9kZTsKKyAgICBjaGFyICpuZXdzdHI7CisKKworICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICBwdXRzKCJBbGxvY1NwYWNlIik7CisKKworICAgIG5ld3N0ciA9IChjaGFyICopIG1hbGxvYygyKTsKKyAgICBpZiAobmV3c3RyKSB7CisgICAgICAgIG5ld3N0clswXSA9ICcgJzsKKyAgICAgICAgbmV3c3RyWzFdID0gMDsKKyAgICAgICAgbmV3bm9kZSA9IChzdHJ1Y3Qgc3Rybm9kZSAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdHJub2RlKSk7CisgICAgICAgIGlmIChuZXdub2RlKSB7CisgICAgICAgICAgICBuZXdub2RlLT5zdHIgPSBuZXdzdHI7CisgICAgICAgICAgICBuZXdub2RlLT50eXBlID0gU1BBQ0U7CisgICAgICAgICAgICBuZXdub2RlLT5sZW4gPSAxOworICAgICAgICAgICAgbmV3bm9kZS0+bmV4dCA9IG5ld25vZGUtPnByZXYgPSBOVUxMOworICAgICAgICAgICAgbmV3bm9kZS0+ZmxhZ3MgPSBuZXdub2RlLT5udW1iZXIgPSAwOworICAgICAgICAgICAgcmV0dXJuIChuZXdub2RlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKE5VTEwpOworfQorCisKKy8qIENsb25lU3RyTGlzdCAtIGVyc3RlbGx0IGVpbmUgZXhha3RlIEtvcGllIGRlciBMaXN0ZSBvZGVyIGVpbmVzIEF1c3NjaG5pdHRlcyAqLworLyogICAgICAgICAgICAgICAgd2VubiBsaXN0ZW5kI05VTEwgKi8KK3N0cnVjdCBzdHJub2RlICpDbG9uZVN0ckxpc3Qoc3RydWN0IHN0cm5vZGUgKmxpc3QsIHN0cnVjdCBzdHJub2RlICpsaXN0ZW5kKQoreworICAgIHN0cnVjdCBzdHJub2RlICpwcmV2bm9kZSA9IE5VTEwsICpuZXdub2RlLCAqbmV3bGlzdCA9IE5VTEw7CisgICAgY2hhciAqbmV3c3RyOworCisgICAgaWYgKERFQlVHICYgMzIpCisgICAgICAgIHB1dHMoIkNsb25lU3RyTGlzdCIpOworCisKKyAgICB3aGlsZSAobGlzdCkgeworICAgICAgICBuZXdub2RlID0gKHN0cnVjdCBzdHJub2RlICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IHN0cm5vZGUpKTsKKyAgICAgICAgaWYgKCFuZXdub2RlKSB7CisgICAgICAgICAgICBEZWxTdHJMaXN0KCZuZXdsaXN0KTsKKyAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgbmV3c3RyID0gKGNoYXIgKikgbWFsbG9jKGxpc3QtPmxlbiArIDEpOworICAgICAgICBpZiAoIW5ld3N0cikgeworICAgICAgICAgICAgZnJlZShuZXdub2RlKTsKKyAgICAgICAgICAgIERlbFN0ckxpc3QoJm5ld2xpc3QpOworICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBzdHJjcHkobmV3c3RyLCBsaXN0LT5zdHIpOworICAgICAgICBuZXdub2RlLT5zdHIgPSBuZXdzdHI7CisgICAgICAgIG5ld25vZGUtPmxlbiA9IGxpc3QtPmxlbjsKKyAgICAgICAgbmV3bm9kZS0+ZmxhZ3MgPSBsaXN0LT5mbGFnczsKKyAgICAgICAgbmV3bm9kZS0+dHlwZSA9IGxpc3QtPnR5cGU7CisgICAgICAgIG5ld25vZGUtPm51bWJlciA9IGxpc3QtPm51bWJlcjsKKyAgICAgICAgbmV3bm9kZS0+bmV4dCA9IE5VTEw7CisgICAgICAgIG5ld25vZGUtPnByZXYgPSBwcmV2bm9kZTsKKworICAgICAgICBpZiAocHJldm5vZGUpCisgICAgICAgICAgICBwcmV2bm9kZS0+bmV4dCA9IG5ld25vZGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG5ld2xpc3QgPSBuZXdub2RlOworICAgICAgICBwcmV2bm9kZSA9IG5ld25vZGU7CisKKyAgICAgICAgaWYgKGxpc3RlbmQgJiYgbGlzdCA9PSBsaXN0ZW5kKQorICAgICAgICAgICAgbGlzdCA9IE5VTEw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gKG5ld2xpc3QpOworfQorCisKKy8qIERvTWFrcm9GdW5jdGlvbiAtIGVyc3RlbGx0IGVpbmUgU3RyTGlzdCBlbnRzcHJlY2hlbmQgZGVzIEZ1bmN0aW9uLU1ha3JvcyAqLworc3RydWN0IHN0cm5vZGUgKkRvTWFrcm9GdW5jdGlvbihzdHJ1Y3QgbW5vZGUgKm1ha3JvKQoreworICAgIHN0cnVjdCBzdHJub2RlICpyZXN1bHQgPSBOVUxMOworICAgIGNoYXIgKm5ld3N0ciA9IE5VTEwsICp0aW1lc3RyID0gTlVMTDsKKyAgICBpbnQgbGVuLCB0eXBlOworICAgIHRpbWVfdCB0aW1ldmFsdWU7CisKKyAgICBpZiAoREVCVUcgJiAzMikKKyAgICAgICAgcHV0cygiRG9NYWtyb0Z1bmN0aW9uIik7CisKKworICAgIGlmIChtYWtyby0+ZmxhZ3MgJiBGVU5DVElPTikgeworICAgICAgICBzd2l0Y2ggKG1ha3JvLT5mdW5jbnVtKSB7CisgICAgICAgIGNhc2UgRlVOQ0xJTkU6CisgICAgICAgICAgICBuZXdzdHIgPSAoY2hhciAqKSBtYWxsb2MoMTEpOworICAgICAgICAgICAgaWYgKCFuZXdzdHIpCisgICAgICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKKyAgICAgICAgICAgIHNwcmludGYobmV3c3RyLCAiJWx1IiwgbGluZW5yKTsKKyAgICAgICAgICAgIGxlbiA9IHN0cmxlbihuZXdzdHIpOworICAgICAgICAgICAgdHlwZSA9IE5VTUJFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZVTkNGSUxFOgorICAgICAgICAgICAgbGVuID0gc3RybGVuKGZpbGVuYW1lc1tpbmNuZXN0aW5nXSk7CisgICAgICAgICAgICBuZXdzdHIgPSAoY2hhciAqKSBtYWxsb2MobGVuICsgMSArIDIpOworICAgICAgICAgICAgaWYgKCFuZXdzdHIpCisgICAgICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKKyAgICAgICAgICAgICpuZXdzdHIgPSAnXCInOworICAgICAgICAgICAgc3RyY3B5KChuZXdzdHIgKyAxKSwgZmlsZW5hbWVzW2luY25lc3RpbmddKTsKKyAgICAgICAgICAgIHN0cmNhdChuZXdzdHIsICJcIiIpOworICAgICAgICAgICAgdHlwZSA9IFBQX1NUUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZVTkNEQVRFOgorICAgICAgICAgICAgdHlwZSA9IFBQX1NUUjsKKyAgICAgICAgICAgIG5ld3N0ciA9IChjaGFyICopIG1hbGxvYygxNCk7CisgICAgICAgICAgICBpZiAoIW5ld3N0cikKKyAgICAgICAgICAgICAgICByZXR1cm4gKE5VTEwpOworICAgICAgICAgICAgdGltZXZhbHVlID0gdGltZSgwKTsKKyAgICAgICAgICAgIHRpbWVzdHIgPSBjdGltZSgmdGltZXZhbHVlKTsKKyAgICAgICAgICAgIG5ld3N0clswXSA9ICdcIic7CisgICAgICAgICAgICBzdHJuY3B5KG5ld3N0ciArIDEsIHRpbWVzdHIgKyA0LCA3KTsgICAgICAgIC8qIGNvcHkgJ01tbSBkZCAnICovCisgICAgICAgICAgICBzdHJjcHkobmV3c3RyICsgOCwgdGltZXN0ciArIDIwKTsgICAvKiBjb3B5ICd5eXl5JyAqLworICAgICAgICAgICAgbmV3c3RyWzEyXSA9ICdcIic7CisgICAgICAgICAgICBuZXdzdHJbMTNdID0gMDsKKyAgICAgICAgICAgIGxlbiA9IDEzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRlVOQ1RJTUU6CisgICAgICAgICAgICB0eXBlID0gUFBfU1RSOworICAgICAgICAgICAgbmV3c3RyID0gKGNoYXIgKikgbWFsbG9jKDExKTsKKyAgICAgICAgICAgIGlmICghbmV3c3RyKQorICAgICAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CisgICAgICAgICAgICB0aW1ldmFsdWUgPSB0aW1lKDApOworICAgICAgICAgICAgdGltZXN0ciA9IGN0aW1lKCZ0aW1ldmFsdWUpOworICAgICAgICAgICAgbmV3c3RyWzBdID0gJ1wiJzsKKyAgICAgICAgICAgIHN0cm5jcHkobmV3c3RyICsgMSwgdGltZXN0ciArIDExLCA4KTsgICAgICAgLyogY29weSAnaGg6bW06c3MnICovCisgICAgICAgICAgICBuZXdzdHJbOV0gPSAnXCInOworICAgICAgICAgICAgbmV3c3RyWzEwXSA9IDA7CisgICAgICAgICAgICBsZW4gPSAxMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCA9IChzdHJ1Y3Qgc3Rybm9kZSAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdHJub2RlKSk7CisgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICBpZiAobmV3c3RyKQorICAgICAgICAgICAgICAgIGZyZWUobmV3c3RyKTsKKyAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LT5wcmV2ID0gcmVzdWx0LT5uZXh0ID0gTlVMTDsKKyAgICAgICAgcmVzdWx0LT5zdHIgPSBuZXdzdHI7CisgICAgICAgIHJlc3VsdC0+bGVuID0gbGVuOworICAgICAgICByZXN1bHQtPm51bWJlciA9IHJlc3VsdC0+ZmxhZ3MgPSAwOworICAgICAgICByZXN1bHQtPnR5cGUgPSB0eXBlOworICAgIH0KKyAgICByZXR1cm4gKHJlc3VsdCk7Cit9CisKKworLyogKioqKioqKiAgU3RyaW5nLUZ1bmt0aW9uZW4gKioqKioqICovCisKKy8qIFN0cjJMaXN0IC0gcGFyc2VkIGVpbmVuIFN0cmluZyBpbiBlaW5lIFN0ckxpc3QgKi8KK3N0cnVjdCBzdHJub2RlICpTdHIyTGlzdChjaGFyICpzdHIpCit7CisgICAgc3RydWN0IHN0cm5vZGUgKm5ld2xpc3QgPSBOVUxMLCAqbmV3bm9kZSA9IE5VTEw7CisgICAgY2hhciAqdGVtcCwgKnN0cmluZzsKKyAgICBpbnQgbGVuZ3RoLCB0eXBlLCBmbGFnczsKKworICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICBwdXRzKCJTdHIyTGlzdCIpOworCisgICAgd2hpbGUgKCpzdHIpIHsKKyAgICAgICAgZmxhZ3MgPSAwOworLyp2YjogY2FzdHMgZWluZ2VmdWVndCAgICovCisgICAgICAgIGlmIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqc3RyKSkgeyAgICAvKiBTcGFjZXMgcGFyc2VuICovCisgICAgICAgICAgICB0ZW1wID0gc3RyICsgMTsKKyAgICAgICAgICAgIGxlbmd0aCA9IDE7CisgICAgICAgICAgICB3aGlsZSAoKnRlbXAgJiYgaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnRlbXApKSB7CisgICAgICAgICAgICAgICAgdGVtcCsrOworICAgICAgICAgICAgICAgIGxlbmd0aCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHlwZSA9IFNQQUNFOworICAgICAgICB9IGVsc2UgaWYgKCpzdHIgPT0gJ1wiJykgeyAgICAgIC8qIFN0cmluZyBwYXJzZW4gKi8KKyAgICAgICAgICAgIHRlbXAgPSBzdHIgKyAxOworICAgICAgICAgICAgbGVuZ3RoID0gMjsKKyAgICAgICAgICAgIHdoaWxlICgqdGVtcCAmJiAqdGVtcCAhPSAnXCInKQorICAgICAgICAgICAgICAgIGlmICgqdGVtcCA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXAgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoICs9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCsrOworICAgICAgICAgICAgICAgICAgICBsZW5ndGgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB0eXBlID0gUFBfU1RSOworICAgICAgICB9IGVsc2UgaWYgKCpzdHIgPT0gJ1wnJykgeyAgICAgIC8qIFN0cmluZyBwYXJzZW4gKi8KKyAgICAgICAgICAgIHRlbXAgPSBzdHIgKyAxOworICAgICAgICAgICAgbGVuZ3RoID0gMjsKKyAgICAgICAgICAgIHdoaWxlICgqdGVtcCAmJiAqdGVtcCAhPSAnXCcnKQorICAgICAgICAgICAgICAgIGlmICgqdGVtcCA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXAgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoICs9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCsrOworICAgICAgICAgICAgICAgICAgICBsZW5ndGgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB0eXBlID0gUFBfU1RSOworICAgICAgICB9IGVsc2UgaWYgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpICpzdHIpIHx8ICgqc3RyID09ICcuJyAmJiBpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSAqKHN0ciArIDEpKSkpIHsKKyAgICAgICAgICAgIC8qIFphaGxlbiBwYXJzZW4gKi8KKyAgICAgICAgICAgIHRlbXAgPSBzdHI7CisgICAgICAgICAgICBsZW5ndGggPSAwOworICAgICAgICAgICAgd2hpbGUgKCp0ZW1wICYmIChpc2FsbnVtKCh1bnNpZ25lZCBjaGFyKSAqdGVtcCkgfHwgKnRlbXAgPT0gJ18nKSkgeworICAgICAgICAgICAgICAgIHRlbXArKzsKKyAgICAgICAgICAgICAgICBsZW5ndGgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqdGVtcCA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICB0ZW1wKys7CisgICAgICAgICAgICAgICAgbGVuZ3RoKys7CisgICAgICAgICAgICAgICAgaWYgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpICp0ZW1wKSB8fCAqdGVtcCA9PSAnZScgfHwgKnRlbXAgPT0gJ0UnKQorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKnRlbXAgJiYgKGlzYWxudW0oKHVuc2lnbmVkIGNoYXIpICp0ZW1wKSB8fCAqdGVtcCA9PSAnXycpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wKys7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCoodGVtcCAtIDEpID09ICdlJyB8fCAqKHRlbXAgLSAxKSA9PSAnRScpCisgICAgICAgICAgICAgICAgaWYgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpICp0ZW1wKSB8fCAqdGVtcCA9PSAnKycgfHwgKnRlbXAgPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXArKzsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKys7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgqdGVtcCAmJiAoaXNhbG51bSgodW5zaWduZWQgY2hhcikgKnRlbXApIHx8ICp0ZW1wID09ICdfJykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgdHlwZSA9IE5VTUJFUjsKKyAgICAgICAgfSBlbHNlIGlmIChpc2FscGhhKCh1bnNpZ25lZCBjaGFyKSAqc3RyKSB8fCAqc3RyID09ICdfJykgeyAgICAgIC8qIG1vZWdsLiBJZGVudGlmaWVyIHBhcnNlbiAqLworICAgICAgICAgICAgdGVtcCA9IHN0ciArIDE7CisgICAgICAgICAgICBsZW5ndGggPSAxOworICAgICAgICAgICAgd2hpbGUgKCp0ZW1wICYmIChpc2FsbnVtKCh1bnNpZ25lZCBjaGFyKSAqdGVtcCkgfHwgKnRlbXAgPT0gJ18nKSkgeworICAgICAgICAgICAgICAgIHRlbXArKzsKKyAgICAgICAgICAgICAgICBsZW5ndGgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR5cGUgPSBQUF9JREVOVDsKKyAgICAgICAgfSBlbHNlIGlmICgqc3RyKSB7ICAgICAgLyogYWxsZXMgYW5kZXJlIGFscyBlaW56ZWxuZSBaZWljaGVuICovCisgICAgICAgICAgICBsZW5ndGggPSAxOworICAgICAgICAgICAgdHlwZSA9IE5PUk1BTDsKKyAgICAgICAgfQorICAgICAgICBzdHJpbmcgPSAoY2hhciAqKSBtYWxsb2MobGVuZ3RoICsgMSk7CisgICAgICAgIGlmICghc3RyaW5nKSB7CisgICAgICAgICAgICBlcnJvcigxOTYpOworICAgICAgICAgICAgRGVsU3RyTGlzdCgmbmV3bGlzdCk7CisgICAgICAgICAgICByZXR1cm4gKE5VTEwpOworICAgICAgICB9CisgICAgICAgIHN0cm5jcHkoc3RyaW5nLCBzdHIsIGxlbmd0aCk7CisgICAgICAgIHN0cmluZ1tsZW5ndGhdID0gMDsKKyAgICAgICAgc3RyICs9IGxlbmd0aDsKKworICAgICAgICBuZXdub2RlID0gKHN0cnVjdCBzdHJub2RlICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IHN0cm5vZGUpKTsKKyAgICAgICAgaWYgKCFuZXdub2RlKSB7CisgICAgICAgICAgICBlcnJvcigxOTYpOworICAgICAgICAgICAgaWYgKHN0cmluZykKKyAgICAgICAgICAgICAgICBmcmVlKHN0cmluZyk7CisgICAgICAgICAgICByZXR1cm4gKE5VTEwpOworICAgICAgICB9CisgICAgICAgIG5ld25vZGUtPnN0ciA9IHN0cmluZzsKKyAgICAgICAgbmV3bm9kZS0+bGVuID0gbGVuZ3RoOworICAgICAgICBuZXdub2RlLT5mbGFncyA9IGZsYWdzOworICAgICAgICBuZXdub2RlLT50eXBlID0gdHlwZTsKKworICAgICAgICBBZGRTdHJOb2RlQmVoaW5kKCZuZXdsaXN0LCBuZXdub2RlLCBOVUxMKTsKKyAgICB9CisgICAgcmV0dXJuIChuZXdsaXN0KTsKK30KKworLyogTGlzdDJTdHIgLSBzY2hyZWlidCBlaW5lIExpc3RlIGFscyBTdHJpbmcgenVydWVjayAqLworaW50IExpc3QyU3RyKHN0cnVjdCBzdHJub2RlICpsaXN0LCBjaGFyICpzdHIsIGludCBtYXhjaGFycykKK3sKKyAgICBpbnQgbGVuID0gMDsKKyAgICBjaGFyIGMsICpwOworCisgICAgaWYgKERFQlVHICYgMzIpCisgICAgICAgIHB1dHMoIkxpc3QyU3RyIik7CisKKworICAgICpzdHIgPSAwOworICAgIGlmIChsaXN0KSB7CisgICAgICAgIHdoaWxlIChsaXN0KSB7CisgICAgICAgICAgICBpZiAoKGxlbiArIChsaXN0LT5sZW4pKSA+IChtYXhjaGFycyAtIDEpKSB7CisgICAgICAgICAgICAgICAgZXJyb3IoMTc3KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKnZiOiAgICovCisgICAgICAgICAgICAgICAgcCA9IGxpc3QtPnN0cjsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGMgPSAqcCsrOworICAgICAgICAgICAgICAgICAgICAqc3RyKysgPSBjOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGMpOworICAgICAgICAgICAgICAgIHN0ci0tOworLyogICAgICAgIHN0cmNhdChzdHIsbGlzdC0+c3RyKTsgKi8KKyAgICAgICAgICAgICAgICBsZW4gKz0gbGlzdC0+bGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChsZW4gKyAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICAqc3RyID0gMDsKKyAgICAgICAgcmV0dXJuICgxKTsKKyAgICB9Cit9CisKKy8qIExpc3RMZW4gLSBlcm1pdHRlbHQgZGllIExhZW5nZSBlaW5lciBTdHItTGlzdGUgKGluIFplaWNoZW4pICovCitpbnQgTGlzdExlbihzdHJ1Y3Qgc3Rybm9kZSAqbGlzdCkKK3sKKyAgICBpbnQgbGVuID0gMDsKKyAgICB3aGlsZSAobGlzdCkgeworICAgICAgICBsZW4gKz0gbGlzdC0+bGVuOworICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIChsZW4pOworfQorCisvKiBMaXN0U3RyTGVuIC0gZXJtaXR0ZWx0IGRpZSBMYWVuZ2UgZWluZXIgU3RyLUxpc3QgYWxzIFN0cmluZyAgICovCisvKiAgICAgICAgICAgICAgZC5oLiBtaXQgIiBhbSBBbmZhbmcgdW5kIEVuZGUsIHNvd2llIGVpbmVtIFwgdm9yICovCisvKiAgICAgICAgICAgICAgamVkZW0gXCB1bmQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitpbnQgTGlzdFN0ckxlbihzdHJ1Y3Qgc3Rybm9kZSAqbGlzdCkKK3sKKyAgICBpbnQgbGVuID0gMjsKKyAgICB3aGlsZSAobGlzdCkgeworICAgICAgICBpZiAobGlzdC0+dHlwZSA9PSBTUEFDRSkKKyAgICAgICAgICAgIGxlbisrOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGxlbiArPSBsaXN0LT5sZW47CisgICAgICAgICAgICBpZiAobGlzdC0+dHlwZSA9PSBQUF9TVFIgJiYgbGlzdC0+c3RyWzBdID09ICdcIicpCisgICAgICAgICAgICAgICAgbGVuICs9IDI7CisgICAgICAgICAgICBlbHNlIGlmIChsaXN0LT50eXBlID09IE5PUk1BTCAmJiBsaXN0LT5zdHJbMF0gPT0gJ1xcJykKKyAgICAgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgfQorICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIChsZW4pOworfQorCisvKiBDb3B5TGlzdDJTdHJTdHIgLSBrb3BpZXJ0IGVpbmUgU3RyLUxpc3QgYWxzIFN0cmluZyB1bSAgICAgICAgICovCisvKiAgICAgICAgICAgICAgZC5oLiBtaXQgIiBhbSBBbmZhbmcgdW5kIEVuZGUsIHNvd2llIGVpbmVtIFwgdm9yICovCisvKiAgICAgICAgICAgICAgamVkZW0gXCB1bmQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitDb3B5TGlzdDJTdHJTdHIoc3RydWN0IHN0cm5vZGUgKiBsaXN0LCBjaGFyICpzdHIpCit7CisgICAgaW50IGxlbjsKKworICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICBwdXRzKCJDb3B5TGlzdDJTdHJTdHIiKTsKKworCisgICAgc3RyWzBdID0gMDsKKyAgICBpZiAobGlzdCkgeworICAgICAgICBzdHJjcHkoc3RyLCAiXCIiKTsKKyAgICAgICAgbGVuID0gMTsKKyAgICAgICAgd2hpbGUgKGxpc3QpIHsKKyAgICAgICAgICAgIGlmIChsaXN0LT50eXBlID09IFNQQUNFKSB7CisgICAgICAgICAgICAgICAgbGVuKys7CisgICAgICAgICAgICAgICAgc3RyY2F0KHN0ciwgIiAiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGVuICs9IGxpc3QtPmxlbjsKKyAgICAgICAgICAgICAgICBpZiAobGlzdC0+dHlwZSA9PSBQUF9TVFIgJiYgbGlzdC0+c3RyWzBdID09ICdcIicpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyY2F0KHN0ciwgIlxcIik7CisgICAgICAgICAgICAgICAgICAgIHN0cm5jYXQoc3RyLCBsaXN0LT5zdHIsIGxpc3QtPmxlbiAtIDEpOworICAgICAgICAgICAgICAgICAgICBzdHJjYXQoc3RyLCAiXFxcIiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGlzdC0+dHlwZSA9PSBOT1JNQUwgJiYgbGlzdC0+c3RyWzBdID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyY2F0KHN0ciwgIlxcIik7CisgICAgICAgICAgICAgICAgICAgIHN0cmNhdChzdHIsIGxpc3QtPnN0cik7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN0cmNhdChzdHIsIGxpc3QtPnN0cik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBzdHJjYXQoc3RyLCAiXCIiKTsKKyAgICAgICAgbGVuKys7CisgICAgfQorICAgIHJldHVybiAobGVuKTsKK30KKworLyogTmV4dFRvU3BlY2lhbCAtIGNoZWNrZWQsIG9iIGRpZSBTdHJOb2RlIG5lYmVuIGVpbmVtICMgb2RlciAjIyBzdGVodCAqLworaW50IE5leHRUb1NwZWNpYWwoc3RydWN0IHN0cm5vZGUgKm5vZGUpCit7CisgICAgc3RydWN0IHN0cm5vZGUgKnNlYXJjaDsKKworICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICBwdXRzKCJOZXh0VG9TcGVjaWFsIik7CisKKworICAgIGlmIChub2RlLT5wcmV2KSB7CisgICAgICAgIHNlYXJjaCA9IG5vZGUtPnByZXY7CisgICAgICAgIHdoaWxlIChzZWFyY2ggJiYgc2VhcmNoLT50eXBlID09IFNQQUNFKQorICAgICAgICAgICAgc2VhcmNoID0gc2VhcmNoLT5wcmV2OworICAgICAgICBpZiAoc2VhcmNoICYmIHNlYXJjaC0+dHlwZSA9PSBTUEVDSUFMKQorICAgICAgICAgICAgcmV0dXJuIChzZWFyY2gtPmZsYWdzKTsKKyAgICB9CisgICAgaWYgKG5vZGUtPm5leHQpIHsKKyAgICAgICAgc2VhcmNoID0gbm9kZS0+bmV4dDsKKyAgICAgICAgd2hpbGUgKHNlYXJjaCAmJiBzZWFyY2gtPnR5cGUgPT0gU1BBQ0UpCisgICAgICAgICAgICBzZWFyY2ggPSBzZWFyY2gtPm5leHQ7CisgICAgICAgIC8qIEhpbnRlciBkZXIgTm9kZSBpc3QgZWluICMgKFRvU3RyaW5nKSBvaG5lIEJlZGV1dHVuZyAqLworICAgICAgICBpZiAoc2VhcmNoICYmIHNlYXJjaC0+dHlwZSA9PSBTUEVDSUFMCisgICAgICAgICAgICAmJiBzZWFyY2gtPmZsYWdzID09IEtJTExTUEFDRVMpCisgICAgICAgICAgICByZXR1cm4gKEtJTExTUEFDRVMpOworICAgIH0KKyAgICByZXR1cm4gKE5PTkUpOworfQorCisvKiBGaW5kQnJhY2tldCAtIHN1Y2h0IGRhcyBwYXNzZW5kZSBHZWdlbnN0dWVjayB6dSBkZXIgKCwgYXVmIGRpZSBOb2RlIHplaWd0ICovCisvKiAgICAgICAgICAgICAgIGRhYmVpIHdlcmRlbiB2ZXJzY2hhY2h0ZWx0ZSBLbGFtbWVybiBiZWFjaHRldCAgICAgICAgICAgICAgICovCitzdHJ1Y3Qgc3Rybm9kZSAqRmluZEJyYWNrZXQoc3RydWN0IHN0cm5vZGUgKm5vZGUpCit7CisKKyAgICBpZiAoREVCVUcgJiAzMikKKyAgICAgICAgcHV0cygiRmluZEJyYWNrZXQiKTsKKworCisgICAgaWYgKG5vZGUgJiYgbm9kZS0+bmV4dCAmJiBub2RlLT50eXBlID09IE5PUk1BTCAmJiBub2RlLT5zdHJbMF0gPT0gJygnKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICAgICAgaWYgKG5vZGUgJiYgbm9kZS0+dHlwZSA9PSBOT1JNQUwpIHsKKyAgICAgICAgICAgICAgICBpZiAobm9kZS0+c3RyWzBdID09ICcpJykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChub2RlKTsKKyAgICAgICAgICAgICAgICBpZiAobm9kZS0+c3RyWzBdID09ICcoJykKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IEZpbmRCcmFja2V0KG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChub2RlKTsKKyAgICAgICAgcmV0dXJuIChOVUxMKTsKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIChOVUxMKTsKK30KKworLyogQ2xvbmVBcmcgLSBnaWJ0IGVpbmUgTGlzdGUgenVydWVjaywgZGllIGRhcyBuLiBBcmd1bWVudCBkZXMgTWFrcm9zIGVudGhhZWx0ICovCitzdHJ1Y3Qgc3Rybm9kZSAqQ2xvbmVBcmcoc3RydWN0IHN0cm5vZGUgKmxpc3QsIGludCBuLCBpbnQgKmVycm9yKQoreworICAgIGludCBhcmdudW0gPSAwOworICAgIHN0cnVjdCBzdHJub2RlICpzdGFydDsKKworICAgIGlmIChlcnJvcikKKyAgICAgICAgKmVycm9yID0gT0s7CisKKyAgICBpZiAobGlzdCkgeworICAgICAgICBpZiAoREVCVUcgJiAzMikKKyAgICAgICAgICAgIHByaW50ZigiQ2xvbmVBcmdcbiIpOworICAgICAgICBpZiAobGlzdC0+dHlwZSA9PSBQUF9JREVOVCkKKyAgICAgICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgICAgICB3aGlsZSAobGlzdCAmJiBsaXN0LT50eXBlID09IFNQQUNFKQorICAgICAgICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CisKKyAgICAgICAgaWYgKGxpc3QgJiYgbGlzdC0+dHlwZSA9PSBOT1JNQUwgJiYgbGlzdC0+c3RyWzBdID09ICcoJykgeworICAgICAgICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7ICAvKiBTa2lwICggKi8KKworICAgICAgICAgICAgaWYgKERFQlVHICYgMzIpCisgICAgICAgICAgICAgICAgcHJpbnRmKCItIElERU5UIHNraXBwZWQsICggZm91bmRcbiIpOworCisgICAgICAgICAgICB3aGlsZSAobGlzdCAmJiAoYXJnbnVtIDwgbikpIHsKKyAgICAgICAgICAgICAgICBpZiAobGlzdC0+dHlwZSA9PSBOT1JNQUwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3QtPnN0clswXSA9PSAnKScpCisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3QgJiYgbGlzdC0+c3RyWzBdID09ICcoJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QgPSAoRmluZEJyYWNrZXQobGlzdCkpLT5uZXh0OworICAgICAgICAgICAgICAgICAgICBpZiAobGlzdCAmJiBsaXN0LT5zdHJbMF0gPT0gJywnKQorICAgICAgICAgICAgICAgICAgICAgICAgYXJnbnVtKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsaXN0KQorICAgICAgICAgICAgICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUgKGxpc3QgJiYgbGlzdC0+dHlwZSA9PSBTUEFDRSkKKyAgICAgICAgICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKworICAgICAgICAgICAgaWYgKGxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAobGlzdC0+dHlwZSA9PSBOT1JNQUwgJiYgKGxpc3QtPnN0clswXSA9PSAnKScgfHwgbGlzdC0+c3RyWzBdID09ICcsJykpIHsgICAgIC8qIEhJRVIgZXZ0bC4gZWluIFNwYWNlIGVyemV1Z2VuICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gbGlzdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGVycm9yKQorICAgICAgICAgICAgICAgICAgICAqZXJyb3IgPSBBUkdfRVhQRUNURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKERFQlVHICYgMzIpCisgICAgICAgICAgICAgICAgcHJpbnRmKCItIE9rYXksIEFyZy1TdGFydCBmb3VuZDogJXNcbiIsIHN0YXJ0LT5zdHIpOworCisgICAgICAgICAgICB3aGlsZSAobGlzdCAmJiAoYXJnbnVtID09IG4pKSB7CisgICAgICAgICAgICAgICAgaWYgKGxpc3QtPnR5cGUgPT0gTk9STUFMKSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobGlzdC0+c3RyWzBdKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJyknOgorICAgICAgICAgICAgICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ251bSsrOworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCA9IGxpc3QtPnByZXY7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnKCc6CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ID0gRmluZEJyYWNrZXQobGlzdCk7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaXN0KQorICAgICAgICAgICAgICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUgKGxpc3QgJiYgbGlzdC0+dHlwZSA9PSBTUEFDRSkKKyAgICAgICAgICAgICAgICBsaXN0ID0gbGlzdC0+cHJldjsKKworICAgICAgICAgICAgaWYgKERFQlVHICYgMzIpCisgICAgICAgICAgICAgICAgcHJpbnRmKCItIE9rYXksIEFyZy1FbmQgZm91bmQ6ICVzXG4iLCBsaXN0LT5zdHIpOworICAgICAgICAgICAgcmV0dXJuIChDbG9uZVN0ckxpc3Qoc3RhcnQsIGxpc3QpKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGVycm9yKQorICAgICAgICAgICAgICAgICplcnJvciA9IEFSR19FWFBFQ1RFRDsKKyAgICAgICAgICAgIHJldHVybiAoTlVMTCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIChOVUxMKTsKK30KKworLyogRXhwYW5kQXJnTWFrcm8gLSBlcnNldHp0IGVpbiBNYWtybyBtaXQgQXJndW1lbnRlbiAqLworaW50IEV4cGFuZEFyZ01ha3JvKHN0cnVjdCBtbm9kZSAqbWFrcm8sIHN0cnVjdCBzdHJub2RlICoqbGlzdCwKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3Rybm9kZSAqKnBvcykKK3sKKyAgICBzdHJ1Y3Qgc3Rybm9kZSAqY2xvbmUsICp0ZW1wLCAqdGVtcDEsICphcmcsICpuZXc7CisgICAgc3RydWN0IHN0cm5vZGUgKnByZXYsICpuZXh0OworICAgIHN0cnVjdCBtbm9kZSAqcHJldm1ha3JvOworICAgIGNoYXIgKm5ld3N0cjsKKyAgICBpbnQgc3BlYywgbGVuLCB4OworCisgICAgY2xvbmUgPSBDbG9uZVN0ckxpc3QobWFrcm8tPnRva2VubGlzdCwgTlVMTCk7CisgICAgaWYgKCFjbG9uZSkKKyAgICAgICAgcmV0dXJuIChPVVRfT0ZfTUVNKTsKKworICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICBwcmludGYoIkV4cGFuZEFyZ01ha3JvIC0gQ2xvbmUgYnVpbGQuXG4iKTsKKworICAgIHRlbXAgPSBjbG9uZTsKKyAgICB3aGlsZSAodGVtcCkgeworICAgICAgICBpZiAodGVtcC0+dHlwZSA9PSBBUkdVTUVOVCkgeworICAgICAgICAgICAgYXJnID0gQ2xvbmVBcmcoKnBvcywgdGVtcC0+bnVtYmVyLCAmeCk7CisgICAgICAgICAgICBpZiAoIWFyZykgeworICAgICAgICAgICAgICAgIERlbFN0ckxpc3QoJmNsb25lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKERFQlVHICYgMzIpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkFSR1VNRU5UOlxuIik7CisgICAgICAgICAgICAgICAgUHJpbnRUTChhcmcpOworICAgICAgICAgICAgICAgIHByaW50ZigiQXJndW1lbnQgZm91bmQgLSAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzcGVjID0gTmV4dFRvU3BlY2lhbCh0ZW1wKSkgeworICAgICAgICAgICAgICAgIC8qIG5pY2h0IGV4cGFuZGllcmVuLCBudXIgZWluc2V0emVuICovCisgICAgICAgICAgICAgICAgaWYgKHNwZWMgPT0gVE9TVFJJTkcpIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcgJiAzMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigibmV4dCB0byAjXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgLyogYWxzIFN0cmluZyBlaW5zZXR6ZW4gKi8KKyAgICAgICAgICAgICAgICAgICAgbmV3ID0gKHN0cnVjdCBzdHJub2RlICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IHN0cm5vZGUpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERlbFN0ckxpc3QoJmNsb25lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERlbFN0ckxpc3QoJmFyZyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE9VVF9PRl9NRU0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IExpc3RTdHJMZW4oYXJnKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3c3RyID0gKGNoYXIgKikgbWFsbG9jKGxlbiArIDEpOworICAgICAgICAgICAgICAgICAgICBpZiAoIW5ld3N0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgRGVsU3RyTGlzdCgmY2xvbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgRGVsU3RyTGlzdCgmYXJnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShuZXcpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChPVVRfT0ZfTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBDb3B5TGlzdDJTdHJTdHIoYXJnLCBuZXdzdHIpOworICAgICAgICAgICAgICAgICAgICBEZWxTdHJMaXN0KCZhcmcpOworICAgICAgICAgICAgICAgICAgICBuZXctPmxlbiA9IGxlbiArIDI7CisgICAgICAgICAgICAgICAgICAgIG5ldy0+ZmxhZ3MgPSBuZXctPm51bWJlciA9IDA7CisgICAgICAgICAgICAgICAgICAgIG5ldy0+dHlwZSA9IFBQX1NUUjsKKyAgICAgICAgICAgICAgICAgICAgbmV3LT5zdHIgPSBuZXdzdHI7CisKKyAgICAgICAgICAgICAgICAgICAgcHJldiA9IHRlbXAtPnByZXY7CisgICAgICAgICAgICAgICAgICAgIG5leHQgPSB0ZW1wLT5uZXh0OworICAgICAgICAgICAgICAgICAgICBEZWxTdHJOb2RlKE5VTEwsIHRlbXApOyAgICAgLyogQXJndW1lbnQgKi8KKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAocHJldiAmJiBwcmV2LT50eXBlID09IFNQQUNFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gcHJldi0+cHJldjsKKyAgICAgICAgICAgICAgICAgICAgICAgIERlbFN0ck5vZGUoJmNsb25lLCBwcmV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSB0ZW1wOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYgJiYgcHJldi0+dHlwZSA9PSBTUEVDSUFMICYmIHByZXYtPmZsYWdzID09IFRPU1RSSU5HKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gcHJldi0+cHJldjsKKyAgICAgICAgICAgICAgICAgICAgICAgIERlbFN0ck5vZGUoJmNsb25lLCBwcmV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSB0ZW1wOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGllcnJvcigwKTsKKworICAgICAgICAgICAgICAgICAgICBuZXctPnByZXYgPSBwcmV2OworICAgICAgICAgICAgICAgICAgICBpZiAocHJldikKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPm5leHQgPSBuZXc7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lID0gbmV3OworICAgICAgICAgICAgICAgICAgICBuZXctPm5leHQgPSBuZXh0OworICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQtPnByZXYgPSBuZXc7CisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBuZXc7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRWluZmFjaCBudXIgZWluc2V0emVuICovCisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJuZXh0IHRvICMjXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcHJldiA9IHRlbXAtPnByZXY7CisgICAgICAgICAgICAgICAgICAgIG5leHQgPSB0ZW1wLT5uZXh0OworICAgICAgICAgICAgICAgICAgICBEZWxTdHJOb2RlKE5VTEwsIHRlbXApOworICAgICAgICAgICAgICAgICAgICBhcmctPnByZXYgPSBwcmV2OworICAgICAgICAgICAgICAgICAgICBpZiAocHJldikKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPm5leHQgPSBhcmc7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lID0gYXJnOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYXJnLT5uZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJnLT5uZXh0OworICAgICAgICAgICAgICAgICAgICBhcmctPm5leHQgPSBuZXh0OworICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQtPnByZXYgPSBhcmc7CisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBhcmc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBleHBhbmRpZXJlbiB1bmQgZWluc2V0emVuICovCisgICAgICAgICAgICAgICAgaWYgKERFQlVHICYgMzIpCisgICAgICAgICAgICAgICAgICAgIHByaW50Zigibm9ybWFsIGFyZ1xuIik7CisgICAgICAgICAgICAgICAgaWYgKHggPSBFeHBhbmRMaXN0KCZhcmcpKSB7CisgICAgICAgICAgICAgICAgICAgIERlbFN0ckxpc3QoJmNsb25lKTsKKyAgICAgICAgICAgICAgICAgICAgRGVsU3RyTGlzdCgmYXJnKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKERFQlVHICYgMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJleHBhbmRlZCBhcmc6XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUTChhcmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmV2ID0gdGVtcC0+cHJldjsKKyAgICAgICAgICAgICAgICBuZXh0ID0gdGVtcC0+bmV4dDsKKyAgICAgICAgICAgICAgICBEZWxTdHJOb2RlKE5VTEwsIHRlbXApOworICAgICAgICAgICAgICAgIGFyZy0+cHJldiA9IHByZXY7CisgICAgICAgICAgICAgICAgaWYgKHByZXYpCisgICAgICAgICAgICAgICAgICAgIHByZXYtPm5leHQgPSBhcmc7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjbG9uZSA9IGFyZzsKKyAgICAgICAgICAgICAgICB3aGlsZSAoYXJnLT5uZXh0KQorICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmctPm5leHQ7CisgICAgICAgICAgICAgICAgYXJnLT5uZXh0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICBpZiAobmV4dCkKKyAgICAgICAgICAgICAgICAgICAgbmV4dC0+cHJldiA9IGFyZzsKKyAgICAgICAgICAgICAgICB0ZW1wID0gYXJnOworICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKiBvZiBOMlNwZWNpYWwgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAodGVtcCkKKyAgICAgICAgICAgIHRlbXAgPSB0ZW1wLT5uZXh0OworICAgIH0KKworICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICBwcmludGYoIkFyZ3VtZW50cyBleHBhbmRlZC5cbiIpOworCisgICAgdGVtcCA9IGNsb25lOworICAgIHdoaWxlICh0ZW1wKSB7CisgICAgICAgIGlmICh0ZW1wLT50eXBlID09IFNQRUNJQUwgJiYgdGVtcC0+ZmxhZ3MgPT0gS0lMTFNQQUNFUykgeworICAgICAgICAgICAgcHJldiA9IHRlbXAtPnByZXY7CisgICAgICAgICAgICBuZXh0ID0gdGVtcC0+bmV4dDsKKyAgICAgICAgICAgIGlmICgocHJldi0+dHlwZSA9PSBQUF9JREVOVCB8fCBwcmV2LT50eXBlID09IE5VTUJFUikpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG5leHQtPnR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5VTUJFUjogICAgLyogbWVyZ2UgLT4gaWRlbnQgKi8KKyAgICAgICAgICAgICAgICBjYXNlIFBQX0lERU5UOgorICAgICAgICAgICAgICAgICAgICBSZW1TdHJOb2RlKCZjbG9uZSwgbmV4dCk7CisgICAgICAgICAgICAgICAgICAgIE1lcmdlU3RyTm9kZXMocHJldiwgbmV4dCk7CisgICAgICAgICAgICAgICAgICAgIG5leHQgPSB0ZW1wLT5uZXh0OworICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IHdpbGwgbm93IGJlIGRlbGV0ZWQgYW5kIHByZXYtPnN0ciB3aWxsIGJlICovCisgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBqb2luZWQgc3RyaW5ncyBmcm9tIHByZXYmbmV4dCAqLworICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAvKiBubyBtZXJnZSAvIGRlbCAjIyAqLworICAgICAgICAgICAgICAgICAgICBEZWxTdHJOb2RlKCZjbG9uZSwgdGVtcCk7CisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBuZXh0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgLyogb2Ygc3dpdGNoICovCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIERlbFN0ck5vZGUoJmNsb25lLCB0ZW1wKTsKKyAgICAgICAgICAgICAgICB0ZW1wID0gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodGVtcCkKKyAgICAgICAgICAgIHRlbXAgPSB0ZW1wLT5uZXh0OworICAgIH0KKworICAgIC8qICdtYWtybycgYXVzIG1saXN0IGF1c2tsaW5rZW4gKi8KKyAgICBwcmV2bWFrcm8gPSBtYWtyby0+cHJldjsKKyAgICBSZW1NYWtyb05vZGUoJm1saXN0LCBtYWtybyk7CisKKyAgICAvKiBhbGxlcyBleHBhbmRpZXJlbiAqLworICAgIGlmICghKHggPSBFeHBhbmRMaXN0KCZjbG9uZSkpKSB7CisgICAgICAgIC8qIGFrdC4gU3RyTm9kZSBkdXJjaCBjbG9uZS1MaXN0ZSBlcnNldHplbiAqLworCisgICAgICAgIGlmIChERUJVRyAmIDMyKSB7CisgICAgICAgICAgICBwcmludGYoIkNvbXBsZXRlIE1ha3JvIGV4cGFuZGVkXG4iKTsKKyAgICAgICAgICAgIFByaW50VEwoY2xvbmUpOworICAgICAgICB9CisgICAgICAgIC8qIGNsb25lIGFuc3RlbGxlIHZvbiBwb3MgaW4gbGlzdCBlaW5zZXR6ZW4gKi8KKyAgICAgICAgcHJldiA9ICgqcG9zKS0+cHJldjsKKyAgICAgICAgbmV4dCA9ICgqcG9zKS0+bmV4dDsKKworICAgICAgICBEZWxTdHJOb2RlKE5VTEwsICpwb3MpOworCisjaWZkZWYgYmxhCisgICAgICAgIHdoaWxlIChuZXh0ICYmIG5leHQtPnR5cGUgPT0gU1BBQ0UpIHsKKyAgICAgICAgICAgIHRlbXAgPSBuZXh0LT5uZXh0OworICAgICAgICAgICAgRGVsU3RyTm9kZShOVUxMLCBuZXh0KTsgICAgIC8qIFNQQUNFIHp3aXNjaGVuIE1ha3JvIHVuZCBBcmdzIGxvZXNjaGVuICovCisgICAgICAgICAgICBuZXh0ID0gdGVtcDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHdoaWxlIChuZXh0ICYmIG5leHQtPnR5cGUgPT0gU1BBQ0UpCisgICAgICAgICAgICBuZXh0ID0gbmV4dC0+bmV4dDsKKyAgICAgICAgLyogU1BBQ0UgaGludGVyIE1ha3JvIHVlYmVyc3ByaW5nZW4gKi8KKworICAgICAgICBpZiAobmV4dCAmJiBuZXh0LT50eXBlID09IE5PUk1BTCAmJiBuZXh0LT5zdHJbMF0gPT0gJygnKSB7CisgICAgICAgICAgICB0ZW1wID0gbmV4dDsKKyAgICAgICAgICAgIG5leHQgPSBGaW5kQnJhY2tldCh0ZW1wKTsKKyAgICAgICAgICAgIGlmIChuZXh0KQorICAgICAgICAgICAgICAgIG5leHQgPSBuZXh0LT5uZXh0OworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHRlbXAxID0gdGVtcC0+bmV4dDsKKyAgICAgICAgICAgICAgICBEZWxTdHJOb2RlKE5VTEwsIHRlbXApOyAgICAgICAgIC8qIEFSRy1MaXN0IGhpbnRlciBNYWtybyBsb2VzY2hlbiAqLworICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wMTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHRlbXAgIT0gbmV4dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZXJyb3IoMCk7CisgICAgICAgIH0KKworCisgICAgICAgIC8qIHZvciBjbG9uZSBlaW4gU1BBQ0UgZWluc2V0emVuLCB3ZW5uIG5pY2h0IFBSRVY9PVNQQUNFICovCisvKnZiOiAgIGhpZXIgIXByZXZ8fCB3ZWdlbiBFbmZvcmNlcmhpdCBlaW5nZXNldHp0OyB3YWVyZSBwcmV2JiYgYmVzc2VyPyAqLworICAgICAgICBpZiAoIXByZXYgfHwgcHJldi0+dHlwZSAhPSBTUEFDRSkgeworICAgICAgICAgICAgaWYgKHRlbXAgPSBBbGxvY1NwYWNlKCkpIHsKKyAgICAgICAgICAgICAgICB0ZW1wLT5uZXh0ID0gY2xvbmU7CisgICAgICAgICAgICAgICAgaWYgKGNsb25lKQorICAgICAgICAgICAgICAgICAgICBjbG9uZS0+cHJldiA9IHRlbXA7CisgICAgICAgICAgICAgICAgY2xvbmUgPSB0ZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNsb25lLT5wcmV2ID0gcHJldjsKKyAgICAgICAgaWYgKHByZXYpCisgICAgICAgICAgICBwcmV2LT5uZXh0ID0gY2xvbmU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpsaXN0ID0gY2xvbmU7CisKKyAgICAgICAgd2hpbGUgKGNsb25lLT5uZXh0KQorICAgICAgICAgICAgY2xvbmUgPSBjbG9uZS0+bmV4dDsKKyAgICAgICAgLyogbmFjaCBjbG9uZSBlaW4gU1BBQ0UgZWluc2V0emVuLCB3ZW5uIG5pY2h0IE5FWFQ9PVNQQUNFICovCisvKnZiOiAgIGhpZXIgIW5leHR8fCB3ZWdlbiBFbmZvcmNlcmhpdCBlaW5nZXNldHp0OyB3YWVyZSBuZXh0JiYgYmVzc2VyPyAqLworICAgICAgICBpZiAoIW5leHQgfHwgbmV4dC0+dHlwZSAhPSBTUEFDRSkgeworICAgICAgICAgICAgaWYgKHRlbXAgPSBBbGxvY1NwYWNlKCkpIHsKKyAgICAgICAgICAgICAgICB0ZW1wLT5wcmV2ID0gY2xvbmU7CisgICAgICAgICAgICAgICAgaWYgKGNsb25lKQorICAgICAgICAgICAgICAgICAgICBjbG9uZS0+bmV4dCA9IHRlbXA7CisgICAgICAgICAgICAgICAgY2xvbmUgPSB0ZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICpwb3MgPSBjbG9uZTsKKyAgICAgICAgY2xvbmUtPm5leHQgPSBuZXh0OworICAgICAgICBpZiAobmV4dCkKKyAgICAgICAgICAgIG5leHQtPnByZXYgPSBjbG9uZTsKKworICAgICAgICAvKiAnbWFrcm8nIHdpZWRlciBlaW5zZXR6ZW4gKi8KKyAgICAgICAgSW5zZXJ0TWFrcm9Ob2RlKCZtbGlzdCwgbWFrcm8sIHByZXZtYWtybyk7CisgICAgICAgIHJldHVybiAoT0spOworICAgIH0gZWxzZSB7CisgICAgICAgIEluc2VydE1ha3JvTm9kZSgmbWxpc3QsIG1ha3JvLCBwcmV2bWFrcm8pOworICAgICAgICByZXR1cm4gKHgpOworICAgIH0KKworfQorCisvKiBFeHBhbmRMaXN0IC0gZXJzZXR6dCBhbGxlIE1ha3JvcyBpbiBkZXIgTGlzdGUgKi8KK2ludCBFeHBhbmRMaXN0KHN0cnVjdCBzdHJub2RlICoqbGlzdCkKK3sKKyAgICBzdHJ1Y3QgbW5vZGUgKmZvdW5kLCAqYmVmb3JlOworICAgIHN0cnVjdCBzdHJub2RlICpjbG9uZSwgKmJlZm9yZXN0ciwgKmFmdGVyc3RyLCAqbGlzdHRlbXAsICp0ZW1wMiwKKyAgICAqdGVtcDM7CisgICAgaW50IHJlc3VsdCA9IE9LOworCisgICAgaWYgKERFQlVHICYgMzIpCisgICAgICAgIHB1dHMoIkV4cGFuZExpc3QiKTsKKworCisgICAgbGlzdHRlbXAgPSAqbGlzdDsKKyAgICB3aGlsZSAobGlzdHRlbXApIHsKKworICAgICAgICBpZiAobGlzdHRlbXAtPnR5cGUgPT0gUFBfSURFTlQpIHsKKworICAgICAgICAgICAgZm91bmQgPSBGaW5kTWFrcm9Ob2RlKG1saXN0LCBsaXN0dGVtcC0+c3RyLCAwKTsKKyAgICAgICAgICAgIGlmIChmb3VuZCkgeworLyp2YjogbWVya2VuLCBvYiBtaW5kLiBlaW4gTWFrcm8gZXhwYW5kaWVydCB3dXJkZSAgICovCisgICAgICAgICAgICAgICAgZGlkX2V4cGFuZCA9IDE7CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kLT5mbGFncyAmIFBBUkFNRVRFUikgeworICAgICAgICAgICAgICAgICAgICAvKiBNYWtybyBtaXQgQXJndW1lbnQoZW4pICovCisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJNYWtybyB3aXRoIGFyZ3NcbiIpOworCisgICAgICAgICAgICAgICAgICAgIHRlbXAyID0gbGlzdHRlbXAtPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0ZW1wMiAmJiB0ZW1wMi0+dHlwZSA9PSBTUEFDRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAyID0gdGVtcDItPm5leHQ7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAyICYmIHRlbXAyLT50eXBlID09IE5PUk1BTCAmJiB0ZW1wMi0+c3RyWzBdID09ICcoJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPSBFeHBhbmRBcmdNYWtybyhmb3VuZCwgbGlzdCwgJmxpc3R0ZW1wKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJlc3VsdCk7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIC8qIE1ha3JvIG9obmUgQXJndW1lbnQgKi8KKworICAgICAgICAgICAgICAgICAgICAvKiBFeHBhbmROb3JtTWFrcm8gLSBleHBhbmRpZXJ0IGVpbiBNYWtybyBvaG5lIEFyZ3VtZW50ZSAqLworICAgICAgICAgICAgICAgICAgICAvKiBQYXJhbWV0ZXI6IHMuby4gKi8KKworICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQtPmZsYWdzICYgRlVOQ1RJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lID0gRG9NYWtyb0Z1bmN0aW9uKGZvdW5kKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lID0gQ2xvbmVTdHJMaXN0KGZvdW5kLT50b2tlbmxpc3QsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghY2xvbmUpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE9VVF9PRl9NRU0pOworICAgICAgICAgICAgICAgICAgICAvKiBha3QuIE1ha3JvTm9kZSBhdXNrbGlua2VuIHVtIHJla3Vyc2l2ZSBFeHAuIHp1IHZlcmhpbmRlcm4gKi8KKyAgICAgICAgICAgICAgICAgICAgYmVmb3JlID0gZm91bmQtPnByZXY7CisgICAgICAgICAgICAgICAgICAgIFJlbU1ha3JvTm9kZSgmbWxpc3QsIGZvdW5kKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEocmVzdWx0ID0gRXhwYW5kTGlzdCgmY2xvbmUpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogYWt0LiBTdHJOb2RlIGR1cmNoIGNsb25lLUxpc3RlIGVyc2V0emVuICovCisgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVzdHIgPSBsaXN0dGVtcC0+cHJldjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyc3RyID0gbGlzdHRlbXAtPm5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBEZWxTdHJOb2RlKE5VTEwsIGxpc3R0ZW1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3R0ZW1wID0gYWZ0ZXJzdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZS0+cHJldiA9IGJlZm9yZXN0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiZWZvcmVzdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3Jlc3RyLT5uZXh0ID0gY2xvbmU7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxpc3QgPSBjbG9uZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjbG9uZS0+bmV4dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZSA9IGNsb25lLT5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUtPm5leHQgPSBhZnRlcnN0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlcnN0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlcnN0ci0+cHJldiA9IGNsb25lOworICAgICAgICAgICAgICAgICAgICAgICAgLyogYWt0LiBNYWtyb25vZGUgd2llZGVyIGVpbnNldHplbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0TWFrcm9Ob2RlKCZtbGlzdCwgZm91bmQsIGJlZm9yZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBha3QuIE1ha3Jvbm9kZSB3aWVkZXIgZWluc2V0emVuICovCisgICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRNYWtyb05vZGUoJm1saXN0LCBmb3VuZCwgYmVmb3JlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobGlzdHRlbXApCisgICAgICAgICAgICBsaXN0dGVtcCA9IGxpc3R0ZW1wLT5uZXh0OworICAgIH0KKworICAgIHJldHVybiAoT0spOworfQorCisKKy8qIFBhcnNlSWRlbnRpZmllciAtIHBhcnNlZCBkZW4gSW5wdXQtRGVmaW5lLVN0cmluZyB1bmQgaGFlbmd0IGRhcyBNYWtybyAqLworLyogICAgICAgICAgICAgICAgICAgaW4gZGllIExpc3RlICovCisKK3N0cnVjdCBtbm9kZSAqUGFyc2VJZGVudGlmaWVyKGNoYXIgKnN0cikKK3sKKyAgICBpbnQgeCwgbnVtYXJncyA9IDAsIGZsYWdzID0gMCwgbGVuID0gMDsKKyAgICBjaGFyICpuYW1lID0gTlVMTCwgKmFyZ3MgPSBOVUxMLCAqdG9rZW4gPSBOVUxMLCAqdGVtcCwgKnRlbXAyLCAqYXJndGVtcDsKKyAgICBzdHJ1Y3QgbW5vZGUgKm5ld21ha3JvLCAqZm91bmQ7CisgICAgc3RydWN0IHN0cm5vZGUgKnRva2VubGlzdCA9IE5VTEwsICp0ZW1wbGlzdCwgKmFyZ2xpc3QgPSBOVUxMLCAqdGVtcGxpc3QyOworICAgIHN0cnVjdCBzdHJub2RlICpuZXh0LCAqcHJldjsKKworICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICBwdXRzKCJQYXJzZUlkZW50aWZpZXIiKTsKKworLyp2YjogY2FzdHMgZWluZ2VmdWVndCAgKi8KKyAgICB3aGlsZSAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnN0cikpIHsKKyAgICAgICAgc3RyKys7CisgICAgfQorICAgIGlmICghKGlzYWxwaGEoKHVuc2lnbmVkIGNoYXIpICpzdHIpIHx8ICpzdHIgPT0gJ18nKSkgeworICAgICAgICBlcnJvcigxNzgpOworICAgICAgICByZXR1cm4gKDApOworICAgIH0KKyAgICB0ZW1wID0gc3RyOworICAgIHdoaWxlIChpc2FsbnVtKCh1bnNpZ25lZCBjaGFyKSAqdGVtcCkgfHwgKCp0ZW1wID09ICdfJykpIHsKKyAgICAgICAgdGVtcCsrOworICAgICAgICBsZW4rKzsKKyAgICB9CisKKyAgICAvKiBhdWYgc2Nob24gdm9yaGFuZGVuZSAoZXZ0bC4gRkVTVEUpIERlZmluaXRpb24gc3VjaGVuICovCisgICAgZm91bmQgPSBGaW5kTWFrcm9Ob2RlKG1saXN0LCBzdHIsIGxlbik7CisgICAgaWYgKGZvdW5kICYmIChmb3VuZC0+ZmxhZ3MgJiBOT1JFREVGKSkgeworICAgICAgICBlcnJvcigxNzkpOworICAgICAgICByZXR1cm4gKDApOworICAgIH0KKy8qdmI6ICAgKi8KKyAgICBpZiAoMSkgeworICAgICAgICAvKiBPa2F5LCBpc3QgZWdhbCwgd2llIGRhcyBhbHRlIE1ha3JvIGF1c3NhaCAqLworCisvKnZiOiAgICovCisgICAgICAgIGlmIChmb3VuZCAmJiAhKGNfZmxhZ3NbMTVdICYgVVNFREZMQUcpKSB7CisgICAgICAgICAgICBlcnJvcigxOTcpOworICAgICAgICB9CisgICAgICAgIHRlbXAgPSBuYW1lID0gKGNoYXIgKikgbWFsbG9jKGxlbiArIDEpOyAgICAgICAgIC8qIFNwZWljaGVyIGZ1ZXIgTmFtZS1TdHJpbmcgYmVsZWdlbiAqLworICAgICAgICBpZiAoIW5hbWUpIHsKKyAgICAgICAgICAgIGVycm9yKDE5Nik7CisgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBsZW47IHgrKykgeworICAgICAgICAgICAgKnRlbXArKyA9ICpzdHIrKzsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogTmFtZW4ga29waWVyZW4gKi8KKyAgICAgICAgKnRlbXAgPSAwOworCisgICAgICAgIGlmICgqc3RyID09ICcoJykgeworICAgICAgICAgICAgZmxhZ3MgfD0gUEFSQU1FVEVSOworICAgICAgICAgICAgc3RyKys7ICAgICAgICAgICAgICAvKiBqdW1wIG92ZXIgJygnICovCisgICAgICAgICAgICB0ZW1wID0gc3RyOworICAgICAgICAgICAgbGVuID0gMDsKKy8qdmI6IGNhc3RzIGVpbmdlZnVlZ3QgICovCisgICAgICAgICAgICB3aGlsZSAoKnRlbXAgJiYgKCp0ZW1wICE9ICcpJykpCisgICAgICAgICAgICAgICAgaWYgKCEoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnRlbXApKSkgeworICAgICAgICAgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXArKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKnRlbXAgPT0gMCkgeworICAgICAgICAgICAgICAgIGVycm9yKDE4MCk7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGZyZWUobmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFyZ3MgPSB0ZW1wID0gKGNoYXIgKikgbWFsbG9jKGxlbiArIDEpOworICAgICAgICAgICAgaWYgKCFhcmdzKSB7CisgICAgICAgICAgICAgICAgZXJyb3IoMTk2KTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZnJlZShuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGxlbjspCisgICAgICAgICAgICAgICAgaWYgKCEoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnN0cikpKSB7CisgICAgICAgICAgICAgICAgICAgIHgrKzsKKyAgICAgICAgICAgICAgICAgICAgKnRlbXArKyA9ICpzdHIrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdHIrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAqdGVtcCA9IDA7CisgICAgICAgICAgICBzdHIrKzsgICAgICAgICAgICAgIC8qIGp1bXAgb3ZlciAnKScgKi8KKworICAgICAgICAgICAgLyogQXJndW1lbnRsaXN0ZSBwYXJzZW4gdW5kIGF1ZiBGZWhsZXIgcHJ1ZWZlbiAqLworICAgICAgICAgICAgdGVtcCA9IGFyZ3M7CisgICAgICAgICAgICB3aGlsZSAoKnRlbXAgJiYgKGlzYWxwaGEoKHVuc2lnbmVkIGNoYXIpICp0ZW1wKSB8fCAqdGVtcCA9PSAnXycpKSB7CisgICAgICAgICAgICAgICAgdGVtcCsrOworICAgICAgICAgICAgICAgIHdoaWxlICgqdGVtcCAmJiAoaXNhbG51bSgodW5zaWduZWQgY2hhcikgKnRlbXApIHx8ICp0ZW1wID09ICdfJykpIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoISgqdGVtcCkgfHwgKnRlbXAgPT0gJywnKSB7CisgICAgICAgICAgICAgICAgICAgIG51bWFyZ3MrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgqdGVtcCA9PSAnLCcpICYmIChpc2FscGhhKCh1bnNpZ25lZCBjaGFyKSAqKHRlbXAgKyAxKSkgfHwgKih0ZW1wICsgMSkgPT0gJ18nKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXArKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKnRlbXApIHsKKyAgICAgICAgICAgICAgICBpZiAoYXJncykKKyAgICAgICAgICAgICAgICAgICAgZnJlZShhcmdzKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZnJlZShuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoKnRlbXAgPT0gJywnKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yKDE4MSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IoMTgyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnN0cikpCisgICAgICAgICAgICBzdHIrKzsgICAgICAgICAgICAgIC8qIFNraXAgU3BhY2VzICovCisgICAgICAgIC8qIEhJRVI6IHBydWVmZW4sIG9iIHRva2VubGlzdCBlcnN0ZWxsdCB3ZXJkZW4ga29ubnRlIChsZWVyZSB0b2tlbmxpc3QtPm9rKSAqLworICAgICAgICB0b2tlbmxpc3QgPSBTdHIyTGlzdChzdHIpOworICAgICAgICBpZiAoREVCVUcgJiAzMikKKyAgICAgICAgICAgIHByaW50ZigiIC0gYnVpbGQgVG9rZW5MaXN0XG4iKTsKKyAgICAgICAgdGVtcGxpc3QgPSB0b2tlbmxpc3Q7CisgICAgICAgIHdoaWxlICh0ZW1wbGlzdCkgeworICAgICAgICAgICAgaWYgKCh0ZW1wbGlzdC0+dHlwZSA9PSBOT1JNQUwpICYmICghc3RyY21wKHRlbXBsaXN0LT5zdHIsICIjIikpKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoKHRlbXBsaXN0LT5uZXh0KSAmJiAodGVtcGxpc3QtPm5leHQtPnR5cGUgPT0gTk9STUFMKQorICAgICAgICAgICAgICAgICAgICAmJiAoIXN0cmNtcCh0ZW1wbGlzdC0+bmV4dC0+c3RyLCAiIyIpKSkgeworICAgICAgICAgICAgICAgICAgICAvKiAjIyBLSUxMU1BBQ0VTICovCisgICAgICAgICAgICAgICAgICAgIGlmICgodGVtcGxpc3QtPnByZXYpICYmICh0ZW1wbGlzdC0+bmV4dC0+bmV4dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsaXN0LT50eXBlID0gU1BFQ0lBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsaXN0LT5mbGFncyA9IEtJTExTUEFDRVM7CisgICAgICAgICAgICAgICAgICAgICAgICBEZWxTdHJOb2RlKCZ0b2tlbmxpc3QsIHRlbXBsaXN0LT5uZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKDE4Myk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbmxpc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsU3RyTGlzdCgmdG9rZW5saXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ZW1wbGlzdCA9IHRlbXBsaXN0LT5uZXh0OworICAgICAgICB9CisKKyAgICAgICAgLyogVG9rZW4gcGFyc2VuL2tvcGllcmVuICovCisgICAgICAgIGlmICgoZmxhZ3MgJiBQQVJBTUVURVIpKSB7ICAgICAgLyogQXJndW1lbnRlIHBhcnNlbiAqLworICAgICAgICAgICAgYXJnbGlzdCA9IE5VTEw7CisgICAgICAgICAgICB0ZW1wID0gdGVtcDIgPSBhcmdzOworICAgICAgICAgICAgd2hpbGUgKCp0ZW1wKSB7CisgICAgICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKnRlbXAgJiYgKnRlbXAgIT0gJywnKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXArKzsKKyAgICAgICAgICAgICAgICAgICAgbGVuKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgqdGVtcCA9PSAnLCcpCisgICAgICAgICAgICAgICAgICAgIHRlbXArKzsKKyAgICAgICAgICAgICAgICBhcmd0ZW1wID0gKGNoYXIgKikgbWFsbG9jKGxlbiArIDEpOworICAgICAgICAgICAgICAgIGlmICghYXJndGVtcCkgeworICAgICAgICAgICAgICAgICAgICBlcnJvcigxOTYpOworICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ2xpc3QpCisgICAgICAgICAgICAgICAgICAgICAgICBEZWxTdHJMaXN0KCZhcmdsaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VubGlzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIERlbFN0ckxpc3QoJnRva2VubGlzdCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0cm5jcHkoYXJndGVtcCwgdGVtcDIsIGxlbik7CisgICAgICAgICAgICAgICAgdGVtcDIgPSB0ZW1wOworICAgICAgICAgICAgICAgICooYXJndGVtcCArIGxlbikgPSAwOworICAgICAgICAgICAgICAgIEFkZFN0ck5vZGVCZWhpbmQoJmFyZ2xpc3QsIE5VTEwsIGFyZ3RlbXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGVtcGxpc3QgPSB0b2tlbmxpc3Q7CisgICAgICAgICAgICB3aGlsZSAodGVtcGxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAodGVtcGxpc3QtPnR5cGUgPT0gUFBfSURFTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHRlbXBsaXN0MiA9IGFyZ2xpc3Q7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0ZW1wbGlzdDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyY21wKHRlbXBsaXN0LT5zdHIsIHRlbXBsaXN0Mi0+c3RyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsaXN0LT50eXBlID0gQVJHVU1FTlQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxpc3QtPm51bWJlciA9IHg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB4Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGlzdDIgPSB0ZW1wbGlzdDItPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGVtcGxpc3QgPSB0ZW1wbGlzdC0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERlbFN0ckxpc3QoJmFyZ2xpc3QpOworICAgICAgICAgICAgaWYgKERFQlVHICYgMzIpCisgICAgICAgICAgICAgICAgcHJpbnRmKCIgLSBBcmd1bWVudHMgZm91bmQuXG4iKTsKKyAgICAgICAgICAgIC8qICMtU3BlY2lhbHMga29ycmlnaWVyZW4sIG5hY2hkZW0gZGllIEFyZ3VtZW50ZSBlcmthbm50IHd1cmRlbiAqLworICAgICAgICAgICAgdGVtcGxpc3QgPSB0b2tlbmxpc3Q7CisgICAgICAgICAgICB3aGlsZSAodGVtcGxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRlbXBsaXN0LT50eXBlID09IE5PUk1BTCkgJiYgKCFzdHJjbXAodGVtcGxpc3QtPnN0ciwgIiMiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0ZW1wbGlzdC0+bmV4dCkgJiYgKHRlbXBsaXN0LT5uZXh0LT50eXBlID09IEFSR1VNRU5UKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxpc3QtPnR5cGUgPSBTUEVDSUFMOworICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxpc3QtPmZsYWdzID0gVE9TVFJJTkc7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigxODQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoYXJncyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnbGlzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxTdHJMaXN0KCZhcmdsaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbmxpc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsU3RyTGlzdCgmdG9rZW5saXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGVtcGxpc3QgPSB0ZW1wbGlzdC0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICAgICAgICAgIHByaW50ZigiIC0gU3BlY2lhbC0jIGNvcnJlY3RlZC5cbiIpOworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAvKiBUb2tlbiBrb3BpZXJlbiAqLworICAgICAgICAgICAgdGVtcCA9IHN0cjsKKyAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICB3aGlsZSAoKCp0ZW1wKSAmJiAoKnRlbXAgIT0gJ1xuJykpIHsKKyAgICAgICAgICAgICAgICB0ZW1wKys7CisgICAgICAgICAgICAgICAgbGVuKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ZW1wID0gdG9rZW4gPSAoY2hhciAqKSBtYWxsb2MobGVuICsgMSk7CisgICAgICAgICAgICBpZiAoIXRva2VuKSB7CisgICAgICAgICAgICAgICAgZXJyb3IoMTk2KTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZnJlZShuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJncykKKyAgICAgICAgICAgICAgICAgICAgZnJlZShhcmdzKTsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW5saXN0KQorICAgICAgICAgICAgICAgICAgICBEZWxTdHJMaXN0KCZ0b2tlbmxpc3QpOworICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgbGVuOyB4KyspIHsKKyAgICAgICAgICAgICAgICAqdGVtcCsrID0gKnN0cisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnRlbXAgPSAwOworICAgICAgICB9CisKKworICAgICAgICB0ZW1wbGlzdCA9IHRva2VubGlzdDsKKyAgICAgICAgd2hpbGUgKHRlbXBsaXN0KSB7CisgICAgICAgICAgICBpZiAodGVtcGxpc3QtPnR5cGUgPT0gU1BFQ0lBTCAmJiB0ZW1wbGlzdC0+ZmxhZ3MgPT0gS0lMTFNQQUNFUykgeworICAgICAgICAgICAgICAgIG5leHQgPSB0ZW1wbGlzdC0+bmV4dDsKKyAgICAgICAgICAgICAgICBwcmV2ID0gdGVtcGxpc3QtPnByZXY7CisKKyAgICAgICAgICAgICAgICAvKiBLaWxsIFNwYWNlcyBiZWZvcmUvYWZ0ZXIgIyMgKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAocHJldiAmJiBwcmV2LT50eXBlID09IFNQQUNFKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBsaXN0MiA9IHByZXYtPnByZXY7CisgICAgICAgICAgICAgICAgICAgIERlbFN0ck5vZGUoJnRva2VubGlzdCwgcHJldik7CisgICAgICAgICAgICAgICAgICAgIHByZXYgPSB0ZW1wbGlzdDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0ICYmIG5leHQtPnR5cGUgPT0gU1BBQ0UpIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcGxpc3QyID0gbmV4dC0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgRGVsU3RyTm9kZSgmdG9rZW5saXN0LCBuZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHRlbXBsaXN0MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCghbmV4dCkgfHwgKCFwcmV2KSkKKyAgICAgICAgICAgICAgICAgICAgaWVycm9yKDApOworCisgICAgICAgICAgICAgICAgaWYgKG5leHQtPnR5cGUgIT0gQVJHVU1FTlQgJiYgcHJldi0+dHlwZSAhPSBBUkdVTUVOVCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHByZXYtPnR5cGUgPT0gUFBfSURFTlQgfHwgcHJldi0+dHlwZSA9PSBOVU1CRVIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG5leHQtPnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTlVNQkVSOiAgICAvKiBtZXJnZSAtPiBpZGVudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQUF9JREVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1TdHJOb2RlKCZ0b2tlbmxpc3QsIG5leHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lcmdlU3RyTm9kZXMocHJldiwgbmV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHRlbXBsaXN0LT5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgd2lsbCBub3cgYmUgZGVsZXRlZCBhbmQgcHJldi0+c3RyIHdpbGwgYmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgam9pbmVkIHN0cmluZ3MgZnJvbSBwcmV2Jm5leHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAvKiBubyBtZXJnZSAvIGRlbCAjIyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbFN0ck5vZGUoJnRva2VubGlzdCwgdGVtcGxpc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsaXN0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgLyogb2Ygc3dpdGNoICovCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBEZWxTdHJOb2RlKCZ0b2tlbmxpc3QsIHRlbXBsaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsaXN0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0ZW1wbGlzdCkKKyAgICAgICAgICAgICAgICB0ZW1wbGlzdCA9IHRlbXBsaXN0LT5uZXh0OworICAgICAgICB9CisKKworLyogZXJzdCBISUVSIGJlaSBhbGxvd3JlZGVmaW5pdGlvbj0wIGFiZnJhZ2VuID8/ICovCisKKyAgICAgICAgaWYgKG5ld21ha3JvID0gKHN0cnVjdCBtbm9kZSAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBtbm9kZSkpKSB7CisgICAgICAgICAgICBuZXdtYWtyby0+bmFtZSA9IG5hbWU7CisgICAgICAgICAgICBuZXdtYWtyby0+YXJncyA9IGFyZ3M7CisgICAgICAgICAgICBuZXdtYWtyby0+dG9rZW4gPSB0b2tlbjsKKyAgICAgICAgICAgIG5ld21ha3JvLT50b2tlbmxpc3QgPSB0b2tlbmxpc3Q7CisgICAgICAgICAgICBuZXdtYWtyby0+ZmxhZ3MgPSBmbGFnczsKKyAgICAgICAgICAgIG5ld21ha3JvLT5mdW5jbnVtID0gMDsKKyAgICAgICAgICAgIEFkZE1ha3JvTm9kZSgmbWxpc3QsIG5ld21ha3JvKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVycm9yKDE5Nik7CisgICAgICAgICAgICBpZiAobmFtZSkKKyAgICAgICAgICAgICAgICBmcmVlKG5hbWUpOworICAgICAgICAgICAgaWYgKHRva2VuKQorICAgICAgICAgICAgICAgIGZyZWUodG9rZW4pOworICAgICAgICAgICAgaWYgKGFyZ3MpCisgICAgICAgICAgICAgICAgZnJlZShhcmdzKTsKKyAgICAgICAgICAgIGlmICh0b2tlbmxpc3QpCisgICAgICAgICAgICAgICAgRGVsU3RyTGlzdCgmdG9rZW5saXN0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG5ld21ha3JvKTsKKworICAgIH0gZWxzZSB7CisvKnZiOiAgIGRhcyBpc3QgaXJnZW5kd2llIFVuc2lubiBoaWVyLCBnbGF1YmUgaWNoICAgKi8KKyAgICAgICAgaWVycm9yKDApOworICAgICAgICAvKiBISUVSOiB1ZWJlcnBydWVmZW4sIG9iIE1hY3JvZGVmaW5pdGlvbmVuIHVlYmVyZWluc3RpbW1lbiwgc29uc3QgRXJyb3IgKi8KKyAgICAgICAgaWYgKCp0ZW1wID09ICcoJykgeworICAgICAgICAgICAgaWYgKGZvdW5kLT5mbGFncyAmIFBBUkFNRVRFUikgeworICAgICAgICAgICAgICAgIHRlbXArKzsgICAgICAgICAvKiBza2lwICggKi8KKworCisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyb3IoMTg1KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIEhJRVIgbnVyIG5vY2ggdG9rZW5saXN0ZW4gdmVyZ2xlaWNoZW4gKi8KKworICAgIH0KKyAgICBpZiAoREVCVUcgJiAzMikKKyAgICAgICAgcHJpbnRmKCJQYXJzZUlkZW50IGZhbGxzIG9mXG4iKTsKK30KKworCisvKiBQcmVQYXJzZSAtIDMtWmVpY2hlbi1Gb2xnZW4gZXJzZXR6ZW4sIFwrQ1IgWmVpbGVuIGFuaGFlbmdlbiwgdXN3Li4gKi8KKworaW50IFByZVBhcnNlKCkKK3sKKyAgICBjaGFyICpzcmMsICpkZXN0LCAqZGVzdDI7CisgICAgaW50IHNsZW4sIGRsZW4gPSAwOworICAgIGludCBjYXQgPSAwOyAgICAgICAgICAgICAgICAvKnZiOiB1bSB6dSBtZXJrZW4sIG9iIFplaWxlbiBtaXQgXCB2ZXJidW5kZW4gd2VyZGVuICovCisgICAgZGVzdDIgPSBzdHJpbmc7CisKKyAgICBpZiAoREVCVUcgJiAzMikKKyAgICAgICAgcHV0cygiUHJlUGFyc2UiKTsKKworCisgICAgaWYgKCFmZ2V0cyhwcHN0cmluZywgTUFYUFBJTlBVVCwgaW5baW5jbmVzdGluZ10pKSB7CisgICAgICAgIGlmIChjbXRuZXN0aW5nKQorICAgICAgICAgICAgZXJyb3IoMTg2KTsKKy8qdmI6ICAgKi8KKy8qICAgICAgaWYoaWZzdGF0dXNbaW5jbmVzdGluZ10pIGVycm9yKDE4Nik7ICovCisvKiAgICAgIGlmbmVzdGluZy0tOyAqLworICAgICAgICBpZiAoREVCVUcgJiAzMikKKyAgICAgICAgICAgIHByaW50ZigiLS0gZW5kIG9mIGZpbGUgIGlmbmVzdGluZy0xOiVkXG5cbiIsIGluY25lc3RpbmcpOworICAgICAgICBpZiAoaW5jbmVzdGluZykgeworICAgICAgICAgICAgZmNsb3NlKGluW2luY25lc3RpbmddKTsKKyAgICAgICAgICAgIGluY25lc3RpbmctLTsKKyAgICAgICAgICAgIHJldHVybiAocHBfbmV4dGxpbmUoKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9IGVsc2UgaWYgKERFQlVHICYgMzIpCisgICAgICAgIHByaW50ZigiZ2V0czE6JXNcbiIsIHBwc3RyaW5nKTsgICAgICAgICAvKnZiOiAqLworCisgICAgaWYgKChzdHJsZW4ocHBzdHJpbmcpID09IChNQVhQUElOUFVUIC0gMSkpICYmIChwcHN0cmluZ1tNQVhQUElOUFVUIC0gMl0gIT0gJ1xuJykpIHsKKyAgICAgICAgZXJyb3IoMTc3KTsKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisgICAgem5baW5jbmVzdGluZ10rKzsKKyAgICBsaW5lbnIgPSB6bltpbmNuZXN0aW5nXTsKKworICAgIGRvIHsKKyAgICAgICAgLyogWmVpbGVuIGVpbmxlc2VuLCBiaXMga2VpbiBLb21tZW50YXIgbWVociAqLworCisgICAgICAgIC8qIFplaWxlbiBlaW5sZXNlbiBiaXMga2VpbiBcIG1laHIgYW0gRW5kZSAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICAvKiBTb3VyY2UtU3RyaW5nIGFuIERlc3QtU3RyaW5nIGFuaGFlbmdlbiB1bmQgPz94LUZvbGdlbiBlcnNldHplbiAqLworLyp2YjogZGFzIGtpbGx0IHNvbnN0IGRhcyBhbmdlaGFlbmd0ZSB3aWVkZXIgICAqLworICAgICAgICAgICAgaWYgKGNhdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgZGVzdCA9IHNyYyA9IHBwc3RyaW5nOworICAgICAgICAgICAgICAgIHNsZW4gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmICgqc3JjICE9ICdcbicpIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAoKCpzcmMgPT0gJz8nKSAmJiAoKihzcmMgKyAxKSA9PSAnPycpICYmICEoY19mbGFnc1sxNl0gJiBVU0VERkxBRykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKihzcmMgKyAyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICcjJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAnXFwnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAnXic7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcoJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gJ1snOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICddJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyEnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAnfCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc8JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gJ3snOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICd9JzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAnfic7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAqc3JjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAvKiBvZiBzd2l0Y2ggKi8KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAqc3JjOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNsZW4gPCBNQVhQUElOUFVUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbGVuKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigxNzcpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKCpzcmMrKyk7CisKKyAgICAgICAgICAgIHNyYyA9IGRlc3Q7CisgICAgICAgICAgICAvKiBkZXN0LT5sYXN0Y2hhcisyL05VTEwrMSAoZGVzdC0xKS0+IDAgKGRlc3QtMiktPmxhc3RjaGFyICovCisgICAgICAgICAgICBpZiAoKihkZXN0IC0gMikgPT0gJ1xcJykgeworICAgICAgICAgICAgICAgIC8qdmI6IHNvbGx0ZSBkYXMgc2xlbiBzdGF0dCBkbGVuIHNlaW4/ICAqLworICAgICAgICAgICAgICAgIGlmIChmZ2V0cyhzcmMsIE1BWFBQSU5QVVQgLSBkbGVuLCBpbltpbmNuZXN0aW5nXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHICYgMzIpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImdldHMyOiVzXG4iLCBzcmMpOyAgICAgIC8qdmI6ICAqLworLyogSGllciBhdWYgTEYrMCBhYmZyYWdlbiAqLworICAgICAgICAgICAgICAgICAgICBkZXN0IC09IDI7CisgICAgICAgICAgICAgICAgICAgIHpuW2luY25lc3RpbmddKys7CisgICAgICAgICAgICAgICAgICAgIGNhdCA9IDE7ICAgIC8qdmI6IG1lcmtlbiwgZGFzcyBaZWlsZW4gdmVyYnVuZGVuIHd1cmRlbiAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoKmRlc3QgPT0gJ1xcJyk7CisKKyAgICAgICAgc3JjID0gcHBzdHJpbmc7CisgICAgICAgIHdoaWxlICgqc3JjKSB7CisgICAgICAgICAgICAvKiAnIFN0cmluZ3MgdWViZXJsZXNlbiAqLworICAgICAgICAgICAgaWYgKCgqc3JjID09ICdcJycpICYmICghY210bmVzdGluZykpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGxlbiA8IE1BWElOUFVUKSB7CisgICAgICAgICAgICAgICAgICAgICpkZXN0MisrID0gKnNyYysrOworICAgICAgICAgICAgICAgICAgICBkbGVuKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IoMTc3KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKCpzcmMgJiYgKnNyYyAhPSAnXCcnKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqc3JjID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0MisrID0gKnNyYysrOworICAgICAgICAgICAgICAgICAgICAgICAgZGxlbisrOworICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICBpZiAoZGxlbiA8IE1BWElOUFVUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdDIrKyA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRsZW4rKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKDE3Nyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChkbGVuIDwgTUFYSU5QVVQpIHsKKyAgICAgICAgICAgICAgICAgICAgKmRlc3QyKysgPSAqc3JjKys7CisgICAgICAgICAgICAgICAgICAgIGRsZW4rKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlcnJvcigxNzcpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qICIgU3RyaW5ncyB1ZWJlcmxlc2VuICovCisgICAgICAgICAgICBpZiAoKCpzcmMgPT0gJ1wiJykgJiYgKCFjbXRuZXN0aW5nKSkgeworICAgICAgICAgICAgICAgICpkZXN0MisrID0gKnNyYysrOworICAgICAgICAgICAgICAgIGRsZW4rKzsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKnNyYyAmJiAqc3JjICE9ICdcIicpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpzcmMgPT0gJ1xcJykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QyKysgPSAqc3JjKys7CisgICAgICAgICAgICAgICAgICAgICAgICBkbGVuKys7CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIGlmIChkbGVuIDwgTUFYSU5QVVQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0MisrID0gKnNyYysrOworICAgICAgICAgICAgICAgICAgICAgICAgZGxlbisrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoMTc3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRsZW4gPCBNQVhJTlBVVCkgeworICAgICAgICAgICAgICAgICAgICAqZGVzdDIrKyA9ICpzcmMrKzsKKyAgICAgICAgICAgICAgICAgICAgZGxlbisrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yKDE3Nyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogS29tbWVudGFyZSB3ZWdsYXNzZW4gKi8KKyAgICAgICAgICAgIGlmICgoKnNyYyA9PSAnLycpICYmICgqKHNyYyArIDEpID09ICcqJykpIHsKKyAgICAgICAgICAgICAgICBzcmMgKz0gMjsKKyAgICAgICAgICAgICAgICBpZiAoZGxlbiA8IE1BWElOUFVUKSB7CisgICAgICAgICAgICAgICAgICAgICpkZXN0MisrID0gJyAnOworICAgICAgICAgICAgICAgICAgICBkbGVuKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IoMTc3KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChjbXRuZXN0aW5nICYmIChjX2ZsYWdzWzEzXSAmIFVTRURGTEFHKSkgfHwgKCFjbXRuZXN0aW5nKSkKKyAgICAgICAgICAgICAgICAgICAgY210bmVzdGluZysrOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IoMTk4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCgqc3JjID09ICcqJykgJiYgKCooc3JjICsgMSkgPT0gJy8nKSAmJiBjbXRuZXN0aW5nKSB7CisgICAgICAgICAgICAgICAgICAgIHNyYyArPSAyOworICAgICAgICAgICAgICAgICAgICBjbXRuZXN0aW5nLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDKystQ29tbWVudCB3ZWdsYXNzZW4gKi8KKyAgICAgICAgICAgIGlmICgoIWNtdG5lc3RpbmcpICYmICgqc3JjID09ICcvJykgJiYgKCooc3JjICsgMSkgPT0gJy8nKSAmJiAoY19mbGFnc1sxNF0gJiBVU0VERkxBRykpCisgICAgICAgICAgICAgICAgKnNyYyA9IDA7CisKKyAgICAgICAgICAgIGlmICghY210bmVzdGluZykgeworICAgICAgICAgICAgICAgIGlmICgqc3JjKSB7CisgICAgICAgICAgICAgICAgICAgICpkZXN0MisrID0gKnNyYysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZGxlbiA8IE1BWElOUFVUKSB7CisgICAgICAgICAgICAgICAgICAgIGRsZW4rKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlcnJvcigxNzcpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCpzcmMpCisgICAgICAgICAgICAgICAgICAgIHNyYysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNtdG5lc3RpbmcpIHsKKyAgICAgICAgICAgIGlmICghZmdldHMocHBzdHJpbmcsIE1BWFBQSU5QVVQsIGluW2luY25lc3RpbmddKSkgeworICAgICAgICAgICAgICAgIGlmIChjbXRuZXN0aW5nKQorICAgICAgICAgICAgICAgICAgICBlcnJvcigxODYpOworICAgICAgICAgICAgICAgIGlmIChpbmNuZXN0aW5nKSB7CisgICAgICAgICAgICAgICAgICAgIGZjbG9zZShpbltpbmNuZXN0aW5nXSk7CisgICAgICAgICAgICAgICAgICAgIGluY25lc3RpbmctLTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwcF9uZXh0bGluZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoREVCVUcgJiAzMikKKyAgICAgICAgICAgICAgICBwcmludGYoImdldHMyOiVzXG4iLCBwcHN0cmluZyk7ICAgICAgICAgLyp2YjogICAqLworCisgICAgICAgICAgICBpZiAoKHN0cmxlbihwcHN0cmluZykgPT0gKE1BWFBQSU5QVVQgLSAxKSkgJiYgKHBwc3RyaW5nW01BWFBQSU5QVVQgLSAyXSAhPSAnXG4nKSkgeworICAgICAgICAgICAgICAgIGVycm9yKDE3Nyk7CisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHpuW2luY25lc3RpbmddKys7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChjbXRuZXN0aW5nKTsKKworLyp2YjogZGFzIHVlYmVyc2NocmVpYnQgZGVuIFNwZWljaGVyICovCisjaWYgMAorICAgICpkZXN0Mi0tID0gMDsKKyAgICB3aGlsZSAoaXNzcGFjZSgqZGVzdDIpKQorICAgICAgICAqZGVzdDItLSA9IDA7ICAgICAgICAgICAvKiBTcGFjZXMga2lsbGVuICovCisjZW5kaWYKKworLyp2YjogaG9mZmUsIGRhcyBpc3QgYmVzc2VyICovCisgICAgKmRlc3QyID0gMDsKKyAgICB3aGlsZSAoZGVzdDIgPiBzdHJpbmcgJiYgaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKi0tZGVzdDIpKQorICAgICAgICAqZGVzdDIgPSAwOworCisKKyAgICByZXR1cm4gKDEpOworfQorCisvKiAqKioqKioqKioqKioqKioqIFByZVByb2Nlc3NvciAqKioqKioqKioqKioqKioqKiAqLworCitpbnQgcHBfaW5pdCh2b2lkKQoreworICAgIGNoYXIgKm1hY3JvbmFtZTsKKyAgICBzdHJ1Y3QgbW5vZGUgKm1hY3Jvbm9kZTsKKworICAgIGlmICghKGNfZmxhZ3NbNl0gJiBVU0VERkxBRykpCisgICAgICAgIHByaW50ZigiJXNcbiIsIHBwX3ZlcnNpb24pOworCisgICAgaW5jbmVzdGluZyA9IC8qaWZuZXN0aW5nPSAqLyAtMTsgICAgLyp2YjogICovCisgICAgY210bmVzdGluZyA9IGlmX2NudCA9IGFic19pZl9jbnQgPSAwOworICAgIG1saXN0ID0gTlVMTDsKKyAgICBzdHJsaXN0ID0gTlVMTDsKKworICAgIG1hY3JvbmFtZSA9IChjaGFyICopIG1hbGxvYyg5KTsKKyAgICBpZiAoIW1hY3JvbmFtZSkKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICBzdHJjcHkobWFjcm9uYW1lLCAiX19MSU5FX18iKTsKKyAgICBtYWNyb25vZGUgPSAoc3RydWN0IG1ub2RlICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IG1ub2RlKSk7CisgICAgaWYgKCFtYWNyb25vZGUpIHsKKyAgICAgICAgaWYgKG1hY3JvbmFtZSkKKyAgICAgICAgICAgIGZyZWUobWFjcm9uYW1lKTsKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisgICAgbWFjcm9ub2RlLT5uYW1lID0gbWFjcm9uYW1lOworICAgIG1hY3Jvbm9kZS0+YXJncyA9IG1hY3Jvbm9kZS0+dG9rZW4gPSBOVUxMOworICAgIG1hY3Jvbm9kZS0+dG9rZW5saXN0ID0gTlVMTDsKKyAgICBtYWNyb25vZGUtPmZsYWdzID0gRlVOQ1RJT04gfCBOT0RFTEVURSB8IE5PUkVERUY7CisgICAgbWFjcm9ub2RlLT5mdW5jbnVtID0gRlVOQ0xJTkU7CisgICAgQWRkTWFrcm9Ob2RlKCZtbGlzdCwgbWFjcm9ub2RlKTsKKworICAgIG1hY3JvbmFtZSA9IChjaGFyICopIG1hbGxvYyg5KTsKKyAgICBpZiAoIW1hY3JvbmFtZSkKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICBzdHJjcHkobWFjcm9uYW1lLCAiX19GSUxFX18iKTsKKyAgICBtYWNyb25vZGUgPSAoc3RydWN0IG1ub2RlICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IG1ub2RlKSk7CisgICAgaWYgKCFtYWNyb25vZGUpIHsKKyAgICAgICAgaWYgKG1hY3JvbmFtZSkKKyAgICAgICAgICAgIGZyZWUobWFjcm9uYW1lKTsKKyAgICAgICAgRGVsTWFrcm9MaXN0KCZtbGlzdCk7CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorICAgIG1hY3Jvbm9kZS0+bmFtZSA9IG1hY3JvbmFtZTsKKyAgICBtYWNyb25vZGUtPmFyZ3MgPSBtYWNyb25vZGUtPnRva2VuID0gTlVMTDsKKyAgICBtYWNyb25vZGUtPnRva2VubGlzdCA9IE5VTEw7CisgICAgbWFjcm9ub2RlLT5mbGFncyA9IEZVTkNUSU9OIHwgTk9ERUxFVEUgfCBOT1JFREVGOworICAgIG1hY3Jvbm9kZS0+ZnVuY251bSA9IEZVTkNGSUxFOworICAgIEFkZE1ha3JvTm9kZSgmbWxpc3QsIG1hY3Jvbm9kZSk7CisKKyAgICBtYWNyb25hbWUgPSAoY2hhciAqKSBtYWxsb2MoOSk7CisgICAgaWYgKCFtYWNyb25hbWUpCisgICAgICAgIHJldHVybiAoMCk7CisgICAgc3RyY3B5KG1hY3JvbmFtZSwgIl9fREFURV9fIik7CisgICAgbWFjcm9ub2RlID0gKHN0cnVjdCBtbm9kZSAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBtbm9kZSkpOworICAgIGlmICghbWFjcm9ub2RlKSB7CisgICAgICAgIGlmIChtYWNyb25hbWUpCisgICAgICAgICAgICBmcmVlKG1hY3JvbmFtZSk7CisgICAgICAgIERlbE1ha3JvTGlzdCgmbWxpc3QpOworICAgICAgICByZXR1cm4gKDApOworICAgIH0KKyAgICBtYWNyb25vZGUtPm5hbWUgPSBtYWNyb25hbWU7CisgICAgbWFjcm9ub2RlLT5hcmdzID0gbWFjcm9ub2RlLT50b2tlbiA9IE5VTEw7CisgICAgbWFjcm9ub2RlLT50b2tlbmxpc3QgPSBOVUxMOworICAgIG1hY3Jvbm9kZS0+ZmxhZ3MgPSBGVU5DVElPTiB8IE5PREVMRVRFIHwgTk9SRURFRjsKKyAgICBtYWNyb25vZGUtPmZ1bmNudW0gPSBGVU5DREFURTsKKyAgICBBZGRNYWtyb05vZGUoJm1saXN0LCBtYWNyb25vZGUpOworCisgICAgbWFjcm9uYW1lID0gKGNoYXIgKikgbWFsbG9jKDkpOworICAgIGlmICghbWFjcm9uYW1lKQorICAgICAgICByZXR1cm4gKDApOworICAgIHN0cmNweShtYWNyb25hbWUsICJfX1RJTUVfXyIpOworICAgIG1hY3Jvbm9kZSA9IChzdHJ1Y3QgbW5vZGUgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgbW5vZGUpKTsKKyAgICBpZiAoIW1hY3Jvbm9kZSkgeworICAgICAgICBpZiAobWFjcm9uYW1lKQorICAgICAgICAgICAgZnJlZShtYWNyb25hbWUpOworICAgICAgICBEZWxNYWtyb0xpc3QoJm1saXN0KTsKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisgICAgbWFjcm9ub2RlLT5uYW1lID0gbWFjcm9uYW1lOworICAgIG1hY3Jvbm9kZS0+YXJncyA9IG1hY3Jvbm9kZS0+dG9rZW4gPSBOVUxMOworICAgIG1hY3Jvbm9kZS0+dG9rZW5saXN0ID0gTlVMTDsKKyAgICBtYWNyb25vZGUtPmZsYWdzID0gRlVOQ1RJT04gfCBOT0RFTEVURSB8IE5PUkVERUY7CisgICAgbWFjcm9ub2RlLT5mdW5jbnVtID0gRlVOQ1RJTUU7CisgICAgQWRkTWFrcm9Ob2RlKCZtbGlzdCwgbWFjcm9ub2RlKTsKKworICAgIG1hY3JvbmFtZSA9IChjaGFyICopIG1hbGxvYyg5KTsKKyAgICBpZiAoIW1hY3JvbmFtZSkKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICBzdHJjcHkobWFjcm9uYW1lLCAiX19TVERDX18iKTsKKyAgICBtYWNyb25vZGUgPSAoc3RydWN0IG1ub2RlICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IG1ub2RlKSk7CisgICAgaWYgKCFtYWNyb25vZGUpIHsKKyAgICAgICAgaWYgKG1hY3JvbmFtZSkKKyAgICAgICAgICAgIGZyZWUobWFjcm9uYW1lKTsKKyAgICAgICAgRGVsTWFrcm9MaXN0KCZtbGlzdCk7CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorICAgIG1hY3Jvbm9kZS0+bmFtZSA9IG1hY3JvbmFtZTsKKyAgICBtYWNyb25vZGUtPmFyZ3MgPSBOVUxMOworICAgIG1hY3JvbmFtZSA9IChjaGFyICopIG1hbGxvYygyKTsKKyAgICBpZiAoIW1hY3JvbmFtZSkgeworICAgICAgICBpZiAobWFjcm9ub2RlLT5uYW1lKQorICAgICAgICAgICAgZnJlZShtYWNyb25vZGUtPm5hbWUpOworICAgICAgICBpZiAobWFjcm9ub2RlKQorICAgICAgICAgICAgZnJlZShtYWNyb25vZGUpOworICAgICAgICBEZWxNYWtyb0xpc3QoJm1saXN0KTsKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisgICAgc3RyY3B5KG1hY3JvbmFtZSwgIjEiKTsKKyAgICBtYWNyb25vZGUtPnRva2VuID0gbWFjcm9uYW1lOworICAgIG1hY3Jvbm9kZS0+dG9rZW5saXN0ID0gU3RyMkxpc3QobWFjcm9uYW1lKTsKKyAgICBpZiAoIW1hY3Jvbm9kZS0+dG9rZW5saXN0KSB7CisgICAgICAgIGlmIChtYWNyb25vZGUtPm5hbWUpCisgICAgICAgICAgICBmcmVlKG1hY3Jvbm9kZS0+bmFtZSk7CisgICAgICAgIGlmIChtYWNyb25vZGUtPnRva2VuKQorICAgICAgICAgICAgZnJlZShtYWNyb25vZGUtPnRva2VuKTsKKyAgICAgICAgaWYgKG1hY3Jvbm9kZSkKKyAgICAgICAgICAgIGZyZWUobWFjcm9ub2RlKTsKKyAgICAgICAgRGVsTWFrcm9MaXN0KCZtbGlzdCk7CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorICAgIG1hY3Jvbm9kZS0+ZmxhZ3MgPSBOT0RFTEVURTsKKyAgICBtYWNyb25vZGUtPmZ1bmNudW0gPSAwOworICAgIEFkZE1ha3JvTm9kZSgmbWxpc3QsIG1hY3Jvbm9kZSk7CisKKyAgICByZXR1cm4gKDEpOworfQorCisKK3ZvaWQgcHBfZnJlZSh2b2lkKQoreworICAgIGludCBpOworCisgICAgaWYgKERFQlVHICYgMzIpCisgICAgICAgIHB1dHMoInBwX2ZyZWUiKTsKKworLyp2YjogU2NobGVpZmVuaW5kZXgga29ycmVrdCBnZXNldHp0ICAgICovCisgICAgZm9yIChpID0gaW5jbmVzdGluZzsgaSA+PSAwOyBpLS0pCisgICAgICAgIGlmIChpbltpXSkKKyAgICAgICAgICAgIGZjbG9zZShpbltpXSk7CisgICAgRGVsTWFrcm9MaXN0KCZtbGlzdCk7CisgICAgRGVsU3RyTGlzdCgmc3RybGlzdCk7Cit9CisKK2ludCBwcF9pbmNsdWRlKGNoYXIgKmYpCit7CisgICAgaWYgKERFQlVHICYgMzIpCisgICAgICAgIHByaW50ZigidHJ5aW5nIHRvIGluY2x1ZGUgJXNcbiIsIGYpOyAgICAvKnZiOiAgKi8KKworICAgIGlmIChpbmNuZXN0aW5nID49IE1BWElOQ05FU1RJTkcgLSAxKSB7CisgICAgICAgIGVycm9yKDE4Nyk7CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorLyp2YjogICAqLworLyogICAgaWYoaWZuZXN0aW5nPj1NQVhJRk5FU1RJTkctMSkgICB7ZXJyb3IoIlRvbyBtYW55IG5lc3RlZCAjaWZzIG9yICNpbmNsdWRlcyIsMCk7cmV0dXJuKDApO30gKi8KKyAgICBpbmNuZXN0aW5nKys7CisgICAgLyogICAgaWZuZXN0aW5nKys7ICovLyp2YjogICAqLworICAgIGlmc3RhdHVzW2luY25lc3RpbmddID0gMDsgICAvKnZiOiAgICovCisKKyAgICBpZiAoREVCVUcgJiAzMikKKyAgICAgICAgcHJpbnRmKCItLSBpbmNsdWRlOiBpZm5lc3Rpbmc6JWQgaWZzdGF0dXM6MCBcblxuIiwgaW5jbmVzdGluZyk7CisKKyAgICBpbltpbmNuZXN0aW5nXSA9IGZvcGVuKGYsICJyIik7CisgICAgaWYgKCFpbltpbmNuZXN0aW5nXSkgeworICAgICAgICBpbmNuZXN0aW5nLS07CisgICAgICAgIHJldHVybiAoMCk7CisgICAgfQorICAgIGZpbGVuYW1lc1tpbmNuZXN0aW5nXSA9IGY7CisgICAgem5baW5jbmVzdGluZ10gPSBsaW5lbnIgPSAwOworICAgIHJldHVybiAoMSk7Cit9CisKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqIE1haW4tRnVuY3Rpb24gKioqKioqKioqKioqKioqKioqKiAqLworaW50IHBwX25leHRsaW5lKHZvaWQpCit7CisgICAgY2hhciAqc3JjLCAqZGVzdCwgKnRlbXA7CisgICAgaW50IGNvbXBsZXRlX2xlbiwgbGVuLCBpLCByZXN1bHQ7CisgICAgc3RydWN0IG1ub2RlICptYWtybzsKKyAgICBzdHJ1Y3Qgc3Rybm9kZSAqbGluZWxpc3QsICppbmNsaW5lbGlzdDsKKworICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICBwdXRzKCJwcF9uZXh0bGluZSIpOworCisgICAgZGVzdCA9IHN0cmluZzsKKyAgICBkZXN0WzBdID0gMDsKKworICAgIC8qIFN0cmluZyB2b3JiZXJlaXRlbiwgM1pGIGVyc2V0emVuLCBcLVplaWxlbiBhbmhhZW5nZW4sIEtvbW1lbnRhcmUgbG9lc2NoZW4gKi8KKyAgICBpZiAoIVByZVBhcnNlKCkpCisgICAgICAgIHJldHVybiAoMCk7CisKKyAgICAvKiBVZWJlcnBydWVmdW5nIGF1ZiBQcmVQcm9jZXNzb3ItQ29tbWFuZHMgKi8KKyAgICBzcmMgPSBzdHJpbmc7CisvKnZiOiBjYXN0cyBlaW5nZWZ1ZWd0ICAqLworICAgIHdoaWxlIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqc3JjKSkgeworICAgICAgICBzcmMrKzsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2tpcFNwYWNlcyAqLworCisgICAgaWYgKCpzcmMgPT0gJyMnKSB7ICAgICAgICAgIC8qICMtRGlyZWt0aXZlIGdlZnVuZGVuICovCisgICAgICAgIHNyYysrOyAgICAgICAgICAgICAgICAgIC8qICMgdWViZXJsZXNlbiAqLworCisgICAgICAgIHdoaWxlIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqc3JjKSkgeworICAgICAgICAgICAgc3JjKys7CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIFNraXBTcGFjZXMgKi8KKworLyp2YjogICBEaXJla3RpdmVuLCBkaWUgbmljaHRzIG1pdCAjaWYgZXRjLiB6dSB0dW4gaGFiZW4sIG5hY2ggaGludGVuICAgKi8KKworCisvKiBJRkRFRiAqLworICAgICAgICBpZiAoIXN0cm5jbXAoc3JjLCAiaWZkZWYiLCA1KSkgeworICAgICAgICAgICAgc3JjICs9IDU7CisgICAgICAgICAgICBhYnNfaWZfY250Kys7ICAgICAgIC8qdmI6ICovCisgICAgICAgICAgICBpZiAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnNyYykpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnNyYykpIHsKKyAgICAgICAgICAgICAgICAgICAgc3JjKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGlkZW50aWZpZXIgc3VjaGVuICovCisgICAgICAgICAgICAgICAgaWYgKGRvX291dHB1dCkgeworLyp2YjogICAqLworLyogICAgICAgICAgICBpZihpZm5lc3Rpbmc+PU1BWElGTkVTVElORy0xKSB7ZXJyb3IoIlRvbyBtYW55IG5lc3RlZCAjaWYncyIsMCk7IHJldHVybigwKTt9ICovCisvKiAgICAgICAgICAgIGlmbmVzdGluZysrOyAqLworICAgICAgICAgICAgICAgICAgICB0ZW1wID0gc3JjOworICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGlzYWxudW0oKHVuc2lnbmVkIGNoYXIpICp0ZW1wKSkgfHwgKCp0ZW1wID09ICdfJykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbisrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1ha3JvID0gRmluZE1ha3JvTm9kZShtbGlzdCwgc3JjLCBsZW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcgJiAzMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLS0gI2lmZGVmIGZvdW5kLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ha3JvKSB7CisvKnZiOiAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZnN0YXR1c1tpbmNuZXN0aW5nXSA9IDE7ICAgICAgIC8qIEJlZGluZ3VuZyA9PSBUUlVFICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcgJiAzMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiBjb25kaXRpb24gJyVzJyBmb3VuZCAgICAgKFRSVUUpXG4iLCBtYWtyby0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisvKnZiOiAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZnN0YXR1c1tpbmNuZXN0aW5nXSA9IDI7ICAgICAgIC8qIEJlZGluZ3VuZyA9PSBGQUxTRSAqLworICAgICAgICAgICAgICAgICAgICAgICAgZG9fb3V0cHV0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiIGNvbmRpdGlvbiBub3QgZm91bmQgKEZBTFNFKVxuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmX2NudCsrOworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcgJiAzMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLS0gI2lmZGVmIGZvdW5kIGFuZCBpZl9jbnQgaW5jcmVhc2VkXG5cbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJpbmdbMF0gPSAwOyAgLyp2YjogeW8gICAqLworICAgICAgICAgICAgICAgIHJldHVybiAoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIEVPIElGREVGICovCisgICAgICAgIC8qIElGTkRFRiAqLworICAgICAgICBpZiAoIXN0cm5jbXAoc3JjLCAiaWZuZGVmIiwgNikpIHsKKyAgICAgICAgICAgIHNyYyArPSA2OworICAgICAgICAgICAgYWJzX2lmX2NudCsrOyAgICAgICAvKnZiOiAqLworICAgICAgICAgICAgaWYgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpICpzcmMpKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpICpzcmMpKSB7CisgICAgICAgICAgICAgICAgICAgIHNyYysrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGlkZW50aWZpZXIgc3VjaGVuICovCisgICAgICAgICAgICAgICAgaWYgKGRvX291dHB1dCkgeworLyp2YjogICAqLworLyogICAgICAgICAgICBpZihpZm5lc3Rpbmc+PU1BWElGTkVTVElORy0xKSB7ZXJyb3IoIlRvbyBtYW55IG5lc3RlZCAjaWYncyIsMCk7IHJldHVybigwKTt9ICovCisvKiAgICAgICAgICAgIGlmbmVzdGluZysrOyAqLworICAgICAgICAgICAgICAgICAgICB0ZW1wID0gc3JjOworICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGlzYWxudW0oKHVuc2lnbmVkIGNoYXIpICp0ZW1wKSkgfHwgKCp0ZW1wID09ICdfJykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbisrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCItLSBGaW5kTWFrcm9Ob2RlOiBsZW49JWQgdGVtcD0lcFxuIiwgbGVuLCAodm9pZCopdGVtcCk7CisgICAgICAgICAgICAgICAgICAgIG1ha3JvID0gRmluZE1ha3JvTm9kZShtbGlzdCwgc3JjLCBsZW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcgJiAzMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLS0gI2lmbmRlZiBmb3VuZCwgIik7CisgICAgICAgICAgICAgICAgICAgIGlmICghbWFrcm8pIHsKKy8qdmI6ICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmc3RhdHVzW2luY25lc3RpbmddID0gMTsgICAgICAgLyogQmVkaW5ndW5nID09IFRSVUUgKE1ha3JvIG5vdCBleGlzdGluZykgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiIGNvbmRpdGlvbiBub3QgZm91bmQgIChUUlVFKVxuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKy8qdmI6ICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmc3RhdHVzW2luY25lc3RpbmddID0gMjsgICAgICAgLyogQmVkaW5ndW5nID09IEZBTFNFICovCisgICAgICAgICAgICAgICAgICAgICAgICBkb19vdXRwdXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHICYgMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgY29uZGl0aW9uICclcycgICAgIGZvdW5kIChGQUxTRSlcblxuIiwgbWFrcm8tPm5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIEhJRVI6IHN0cmluZ1swXT0wOyAqLworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmX2NudCsrOworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcgJiAzMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLS0gI2lmbmRlZiBmb3VuZCBhbmQgaWZfY250IGluY3JlYXNlZFxuXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RyaW5nWzBdID0gMDsgIC8qdmI6ICAgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gKDEpOworICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBFTyBJRk5ERUYgKi8KKyAgICAgICAgLyogSUYgKi8KKyAgICAgICAgaWYgKCFzdHJuY21wKHNyYywgImlmIiwgMikpIHsKKyAgICAgICAgICAgIHNyYyArPSAyOworICAgICAgICAgICAgYWJzX2lmX2NudCsrOyAgICAgICAvKnZiOiAgICovCisgICAgICAgICAgICBpZiAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnNyYykpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnNyYykpIHsKKyAgICAgICAgICAgICAgICAgICAgc3JjKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEJlZGluZ3VuZyBhdXN3ZXJ0ZW4gKi8KKworCisKKyAgICAgICAgICAgICAgICBwcmludGYoIioqKioqKiBXQVJOSU5HICoqKioqKiogI2lmIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcbiIpOworCisKKyAgICAgICAgICAgICAgICBzdHJpbmdbMF0gPSAwOyAgLyp2YjogICAqLworICAgICAgICAgICAgICAgIHJldHVybiAoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIEVPIElGICovCisgICAgICAgIC8qIEVMSUYgKi8KKyAgICAgICAgaWYgKCFzdHJuY21wKHNyYywgImVsaWYiLCA0KSkgeworICAgICAgICAgICAgc3JjICs9IDQ7CisgICAgICAgICAgICBpZiAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnNyYykpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnNyYykpIHsKKyAgICAgICAgICAgICAgICAgICAgc3JjKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEJlZGluZ3VuZyBhdXN3ZXJ0ZW4gKi8KKworCisKKworCisgICAgICAgICAgICAgICAgcHJpbnRmKCIqKioqKiogV0FSTklORyAqKioqKioqICNlbGlmIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcbiIpOworCisKKworCisgICAgICAgICAgICAgICAgc3RyaW5nWzBdID0gMDsgIC8qdmI6ICAgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gKDEpOworICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBFTyBFTElGICovCisgICAgICAgIC8qIEVMU0UgKi8KKyAgICAgICAgaWYgKCFzdHJuY21wKHNyYywgImVsc2UiLCA0KSkgeworICAgICAgICAgICAgc3JjICs9IDQ7CisgICAgICAgICAgICBpZiAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnNyYykgfHwgKnNyYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpICpzcmMpKSB7CisgICAgICAgICAgICAgICAgICAgIHNyYysrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghaWZfY250KSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaWZzdGF0dXNbaW5jbmVzdGluZ10pIHsgICAgIC8qdmI6ICAgKi8KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoMTg4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgZG9fb3V0cHV0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhJRVI6IGF1ZiAjZW5kaWYgc3VjaGVuIFNlYXJjaEVORElGKCk7ICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBISUVSOiBpZm5lc3RpbmctLTsgZG9fb3V0cHV0PTE7ICovCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgaWZzdGF0dXNbaW5jbmVzdGluZ10gPSAzOyAgICAgICAvKnZiOiAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBkb19vdXRwdXQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKDE4OSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RyaW5nWzBdID0gMDsgIC8qdmI6ICAgICovCisgICAgICAgICAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogRU8gRUxTRSAqLworICAgICAgICAvKiBFTkRJRiAqLworICAgICAgICBpZiAoIXN0cm5jbXAoc3JjLCAiZW5kaWYiLCA1KSkgeworICAgICAgICAgICAgc3JjICs9IDU7CisgICAgICAgICAgICBhYnNfaWZfY250LS07ICAgICAgIC8qdmI6ICAgKi8KKyAgICAgICAgICAgIGlmIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqc3JjKSB8fCAqc3JjID09IDApIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnNyYykpIHsKKyAgICAgICAgICAgICAgICAgICAgc3JjKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEhJRVI6IEF1ZiBaZWlsZW5lbmRlIHRlc3RlbiAqLworCisgICAgICAgICAgICAgICAgaWYgKERFQlVHICYgMzIpCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLS0gI2VuZGlmIGZvdW5kLCAiKTsKKworICAgICAgICAgICAgICAgIGlmIChpZl9jbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWZfY250LS07CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJpZl9jbnQgZGVjcmVhc2VkICh0byAlZClcbiIsIGlmX2NudCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHICYgMzIpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImlmbmVzdGluZzogJWQgIGlmc3RhdHVzOiAlZFxuIiwgaW5jbmVzdGluZywgaWZzdGF0dXNbaW5jbmVzdGluZ10pOworICAgICAgICAgICAgICAgICAgICBpZiAoYWJzX2lmX2NudCA8IDAgLyooaW5jbmVzdGluZz09LTEpfHxpZnN0YXR1c1tpbmNuZXN0aW5nXT09MCAqLyApIHsgICAgICAgLyp2YjogICAqLworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoMTkwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICBpZm5lc3RpbmctLTsgKi8vKnZiOiAgICovCisgICAgICAgICAgICAgICAgICAgIC8qIEhJRVI6IGV2dGwuIGRvX291dHB1dCBlbnRzcHJlY2hlbmQgaWZzdGF0dXNbXSBzZXR6ZW4gKi8KKyAgICAgICAgICAgICAgICAgICAgLyp2YjogbmF0dWVybGljaCAgICAqLworICAgICAgICAgICAgICAgICAgICBkb19vdXRwdXQgPSAxOworICAgICAgICAgICAgICAgICAgICBpZnN0YXR1c1tpbmNuZXN0aW5nXSA9IGFic19pZl9jbnQgPiAwOyAgICAgIC8qdmI6IDEgb2RlciAwICAgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RyaW5nWzBdID0gMDsgIC8qdmI6IGphICovCisgICAgICAgICAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogRU8gRU5ESUYgKi8KKyAgICAgICAgLyp2YjogYW5kZXJlIERpcmVrdGl2ZW4gZ2VnZWJlbmVuZmFsbHMgdWViZXJzcHJpbmdlbiAgICAqLworICAgICAgICBpZiAoIWRvX291dHB1dCkgeworICAgICAgICAgICAgaWYgKERFQlVHICYgMzIpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJkb19vdXRwdXQ9PTAgPT4gc2tpcHBpbmc6ICVzXG4iLCBzcmMpOworICAgICAgICAgICAgc3RyaW5nWzBdID0gMDsKKyAgICAgICAgICAgIHJldHVybiAoMSk7CisgICAgICAgIH0KKy8qIERFRklORSAqLworICAgICAgICBpZiAoIC8qKGRvX291dHB1dCkmJiAqLyAoIXN0cm5jbXAoc3JjLCAiZGVmaW5lIiwgNikpKSB7ICAgICAgICAgLyp2YjogICAqLworICAgICAgICAgICAgaWYgKERFQlVHICYgMzIpCisgICAgICAgICAgICAgICAgcHJpbnRmKCIjZGVmaW5lIGZvdW5kXG4iKTsKKyAgICAgICAgICAgIHNyYyArPSA2OworICAgICAgICAgICAgaWYgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpICpzcmMpKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpICpzcmMpKSB7CisgICAgICAgICAgICAgICAgICAgIHNyYysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoUGFyc2VJZGVudGlmaWVyKHNyYykpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nWzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcgJiAzMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiUGFyc2VJZGVudCByZXR1cm5lZCAwXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIEVPIERFRklORSAqLworICAgICAgICAvKiBVTkRFRiAqLworICAgICAgICBpZiAoIC8qKGRvX291dHB1dCkmJiAqLyAoIXN0cm5jbXAoc3JjLCAidW5kZWYiLCA1KSkpIHsgIC8qdmI6ICAgKi8KKyAgICAgICAgICAgIHNyYyArPSA1OworICAgICAgICAgICAgaWYgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpICpzcmMpKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpICpzcmMpKSB7CisgICAgICAgICAgICAgICAgICAgIHNyYysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ZW1wID0gc3JjOworICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKChpc2FsbnVtKCh1bnNpZ25lZCBjaGFyKSAqdGVtcCkpIHx8ICgqdGVtcCA9PSAnXycpKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXArKzsKKyAgICAgICAgICAgICAgICAgICAgbGVuKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1ha3JvID0gRmluZE1ha3JvTm9kZShtbGlzdCwgc3JjLCBsZW4pOworICAgICAgICAgICAgICAgIGlmIChtYWtyby0+ZmxhZ3MgJiBOT0RFTEVURSkgeworICAgICAgICAgICAgICAgICAgICBlcnJvcigxOTkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIERlbE1ha3JvTm9kZSgmbWxpc3QsIG1ha3JvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpICp0ZW1wKSkgeworICAgICAgICAgICAgICAgICAgICB0ZW1wKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgqdGVtcCAhPSAwICYmICp0ZW1wICE9ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IoMjAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RyaW5nWzBdID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gKDEpOworICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBFTyBVTkRFRiAqLworICAgICAgICAvKiBJTkNMVURFICovCisgICAgICAgIGlmICggLyooZG9fb3V0cHV0KSYmICovICghc3RybmNtcChzcmMsICJpbmNsdWRlIiwgNykpKSB7ICAgICAgICAvKnZiOiAgICovCisgICAgICAgICAgICBzcmMgKz0gNzsKKyAgICAgICAgICAgIGlmIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqc3JjKSkgeworICAgICAgICAgICAgICAgIHdoaWxlIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqc3JjKSkgeworICAgICAgICAgICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCpzcmMgIT0gJzwnICYmICpzcmMgIT0gJ1wiJykgeworICAgICAgICAgICAgICAgICAgICAvKiBWZXJzdWNoZW4gZGVuIFJlc3QgenUgZXhwYW5kaWVyZW4gKi8KKyAgICAgICAgICAgICAgICAgICAgaW5jbGluZWxpc3QgPSBTdHIyTGlzdChzcmMpOworICAgICAgICAgICAgICAgICAgICBpZiAoIUV4cGFuZExpc3QoJmluY2xpbmVsaXN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExpc3QyU3RyKGluY2xpbmVsaXN0LCBzcmMsIE1BWElOUFVUIC0gKHNyYyAtIHN0cmluZykpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSElFUiBleGl0ID8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKDE5MSk7ICAgICAvKiBISUVSIGV4aXQgPyAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorLyp2YjogZ2VhZW5kZXJ0LCBzbyBkYXNzICNpbmNsdWRlICIuLi4iIGF1Y2ggbm9jaCBpbSBTdGFuZGFyZHBmYWQgc3VjaHQgKi8KKyAgICAgICAgICAgICAgICBpZiAoREVCVUcgJiAzMikKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJpbmNsdWRlbmFtZT0lc1xuIiwgc3JjKTsKKyAgICAgICAgICAgICAgICBpZiAoKnNyYyA9PSAnPCcgfHwgKnNyYyA9PSAnXCInKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKm0gPSBzcmMsIGM7CisgICAgICAgICAgICAgICAgICAgIGlmICgqc3JjID09ICc8JykKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAnPic7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAnXCInOworICAgICAgICAgICAgICAgICAgICBpZiAoKnNyYyA9PSAnXCInKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbSBha3R1ZWxsZW4gVmVyemVpY2huaXMgc3VjaGVuIHVuZCBpbmNsdWRlbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3JjKys7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gc3JjOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgqdGVtcCAhPSAnXCInKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbisrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCsrOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpICp0ZW1wKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKnRlbXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcigyMDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IChjaGFyICopIG1hbGxvYyhsZW4gKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNweSh0ZW1wLCBzcmMsIGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih0ZW1wICsgbGVuKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBwX2luY2x1ZGUodGVtcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkU3RyTm9kZSgmc3RybGlzdCwgTlVMTCwgdGVtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1swXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHRlbXApOworLyp2YjoKKyAgIGVycm9yKCJwcDogY2Fubm90IG9wZW4gZmlsZSB0byBpbmNsdWRlIiwwKTsKKyAgIHJldHVybigwKTsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKDE5Nik7CisgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgIC8qIEhJRVI6IEV4aXQ/ICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogaW4gZGVuIFN0YW5kYXJkLVZlcnplaWNobmlzc2VuIHN1Y2hlbiB1bmQgaW5jbHVkZW4gKi8KKyAgICAgICAgICAgICAgICAgICAgc3JjID0gbTsKKyAgICAgICAgICAgICAgICAgICAgc3JjKys7CisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBzcmM7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgqdGVtcCAhPSBjICYmICp0ZW1wICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbisrOworICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAvKnZiOiBzaWNoZXJlciAqLworICAgICAgICAgICAgICAgICAgICB0ZW1wKys7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSAqdGVtcCkpCisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wKys7CisgICAgICAgICAgICAgICAgICAgIGlmICgqdGVtcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoMjAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0ZW1wID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGluY3BhdGhjOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlX2xlbiA9IHN0cmxlbihpbmNwYXRoW2ldKSArIGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAoY2hhciAqKSBtYWxsb2MoY29tcGxldGVfbGVuICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSh0ZW1wLCBpbmNwYXRoW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJuY2F0KHRlbXAsIHNyYywgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHRlbXAgKyBjb21wbGV0ZV9sZW4pID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHBfaW5jbHVkZSh0ZW1wKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRTdHJOb2RlKCZzdHJsaXN0LCBOVUxMLCB0ZW1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHICYgMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImluY2x1ZGUgPCVzPiBmb3VuZFxuIiwgdGVtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1swXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHRlbXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoMTk2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgLyogSElFUjogRXhpdCA/ICovCisgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgIC8qIG9mIEZPUiBpICovCisgICAgICAgICAgICAgICAgICAgIGVycm9yKDE5MSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IoMTkyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVycm9yKDE5Myk7CisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogRU8gSU5DTFVERSAqLworICAgICAgICAvKiBMSU5FICovCisgICAgICAgIGlmICghc3RybmNtcChzcmMsICJsaW5lIiwgNCkpIHsKKyAgICAgICAgICAgIHNyYyArPSA0OworICAgICAgICAgICAgaWYgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpICpzcmMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgxKTsgICAgIC8qIElnbm9yaWVyZW4gdW5kIGFuIENvbXBpbGVyIHdlaXRlcnJlaWNoZW4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogRU8gTElORSAqLworICAgICAgICAvKiBFUlJPUiAqLworICAgICAgICBpZiAoIXN0cm5jbXAoc3JjLCAiZXJyb3IiLCA1KSkgeworICAgICAgICAgICAgc3JjICs9IDU7CisgICAgICAgICAgICBpZiAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnNyYykpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnNyYykpIHsKKyAgICAgICAgICAgICAgICAgICAgc3JjKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogRU8gRVJST1IgKi8KKyAgICAgICAgLyogUFJBR01BICovCisgICAgICAgIGlmICghc3RybmNtcChzcmMsICJwcmFnbWEiLCA2KSkgeworICAgICAgICAgICAgc3JjICs9IDY7CisgICAgICAgICAgICBpZiAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnNyYykpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnNyYykpIHsKKyAgICAgICAgICAgICAgICAgICAgc3JjKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogRU8gUFJBR01BICovCisgICAgICAgIC8qIFVua25vd24gKi8KKyAgICAgICAgLyogICAgaWYoZG9fb3V0cHV0KXsgKi8KKyAgICAgICAgLyp2YjogICAqLworICAgICAgICBlcnJvcigxOTMpOworICAgICAgICByZXR1cm4gKDApOworICAgICAgICAvKiAgICB9ICovLyp2YjogICAqLworICAgIH0gZWxzZSBpZiAoZG9fb3V0cHV0KSB7CisgICAgICAgIC8qIE5vcm1hbGUgQW53ZWlzdW5nLiBLb21wbGV0dGUgWmVpbGUgZXhwYW5kaWVyZW4gKi8KKworLyp2YjogICAqLworCisgICAgICAgIGxpbmVsaXN0ID0gU3RyMkxpc3Qoc3RyaW5nKTsKKworICAgICAgICBpZiAoREVCVUcgJiAzMikKKyAgICAgICAgICAgIFByaW50VEwobGluZWxpc3QpOworCisvKnZiOiAqLworICAgICAgICBkaWRfZXhwYW5kID0gMDsKKworICAgICAgICBpZiAocmVzdWx0ID0gRXhwYW5kTGlzdCgmbGluZWxpc3QpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHJlc3VsdCkgeworICAgICAgICAgICAgY2FzZSBPVVRfT0ZfTUVNOgorICAgICAgICAgICAgICAgIGVycm9yKDE5Nik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5VTV9PRl9BUkdTOgorICAgICAgICAgICAgICAgIGVycm9yKDE5NCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFSR19FWFBFQ1RFRDoKKyAgICAgICAgICAgICAgICBlcnJvcigxOTUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZXJyb3IoMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEZWxTdHJMaXN0KCZsaW5lbGlzdCk7CisgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisgICAgICAgIGlmIChERUJVRyAmIDMyKQorICAgICAgICAgICAgUHJpbnRUTChsaW5lbGlzdCk7CisKKy8qdmI6IExpc3QyU3RyIG51ciBhdWZydWZlbiwgZmFsbHMgZXR3YXMgZXhwYW5kaWVydCB3dXJkZSAgICovCisgICAgICAgIGlmIChkaWRfZXhwYW5kICYmICFMaXN0MlN0cihsaW5lbGlzdCwgc3RyaW5nLCBNQVhJTlBVVCkpIHsKKyAgICAgICAgICAgIERlbFN0ckxpc3QoJmxpbmVsaXN0KTsKKyAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KKyAgICAgICAgRGVsU3RyTGlzdCgmbGluZWxpc3QpOworCisvKnZiOiAgICovCisgICAgfSBlbHNlCisgICAgICAgIHN0cmluZ1swXSA9IDA7CisgICAgcmV0dXJuICgxKTsKK30KZGlmZiAtLWdpdCBhL3JhbmdlLmMgYi9yYW5nZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OTZmOTUKLS0tIC9kZXYvbnVsbAorKysgYi9yYW5nZS5jCkBAIC0wLDAgKzEsMzIyIEBACisvKiAgJFZFUjogdmJjYyAocmFuZ2UuYykgJFJldmlzaW9uOiAxLjEgJCAgICAqLworLyogIHJhbmdlIGFuYWx5c2lzIGFuZCByZWxhdGVkIG9wdGltaXphdGlvbnMgKi8KKworI2luY2x1ZGUgIm9wdC5oIgorCitzdGF0aWMgY2hhciBGSUxFX1tdPV9fRklMRV9fOworCisKKyNkZWZpbmUgUkFOR0VTSVpFIChzaXplb2YocmFuZ2UpKih2Y291bnQrMSkpCisKK3JhbmdlICpyYW5nZWJ1ZjsKKworc3RhdGljIHZvaWQgY2xlYXJfcmFuZ2UocmFuZ2UgKnAsaW50IGkpCit7CisgIFZhciAqdjsKKyAgaW50IHQ7CisKKyAgdj12aWxpc3RbaV07CisgIHQ9di0+dnR5cC0+ZmxhZ3M7CisgIGlmKElTSU5UKHQpKXsKKyAgICBpZih0JlVOU0lHTkVEKXsKKyAgICAgIHBbaV0ubWluLnZ1bWF4PVowOworICAgICAgcFtpXS5tYXgudnVtYXg9dHVfbWF4W3QmTlFdOworICAgIH1lbHNleworICAgICAgcFtpXS5taW4udm1heD10X21pblt0Jk5RXTsKKyAgICAgIHBbaV0ubWF4LnZtYXg9dF9tYXhbdCZOUV07CisgICAgfQorICB9Cit9CisKK3ZvaWQgcHJpbnRfcmFuZ2VzKEZJTEUgKmYscmFuZ2UgKnApCit7CisgIGludCBpLHQ7CisgIFZhciAqdjsKKyAgZm9yKGk9MDtpPHZjb3VudC1yY291bnQ7aSsrKXsKKyAgICB2PXZpbGlzdFtpXTsKKyAgICB0PXYtPnZ0eXAtPmZsYWdzOworICAgIGlmKElTSU5UKHQpKXsKKyAgICAgIGZwcmludGYoZiwiJTAzZCAlcyAoJXApOiAiLGksdi0+aWRlbnRpZmllcix2KTsKKyAgICAgIGlmKHQmVU5TSUdORUQpeworCXByaW50enVtKGYscFtpXS5taW4udnVtYXgpOworCWZwcmludGYoZiwiLi4uIik7CisJcHJpbnR6dW0oZixwW2ldLm1heC52dW1heCk7CisgICAgICB9ZWxzZXsKKwlwcmludHptKGYscFtpXS5taW4udm1heCk7CisJZnByaW50ZihmLCIuLi4iKTsKKwlwcmludHptKGYscFtpXS5tYXgudm1heCk7CisgICAgICB9CisgICAgICBmcHJpbnRmKGYsIlxuIik7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvbWJpbmVfcmFuZ2VzKHJhbmdlICpkLHJhbmdlICpuKQoreworICBpbnQgaSx0OworICBWYXIgKnY7CisgIGZvcihpPTA7aTx2Y291bnQtcmNvdW50O2krKyl7CisgICAgdj12aWxpc3RbaV07CisgICAgdD12LT52dHlwLT5mbGFnczsKKyAgICBpZihJU0lOVCh0KSl7CisgICAgICBpZih0JlVOU0lHTkVEKXsKKwlpZih6dW1sZXEobltpXS5taW4udnVtYXgsZFtpXS5taW4udnVtYXgpKQorCSAgZFtpXS5taW4udnVtYXg9bltpXS5taW4udnVtYXg7CisJaWYoenVtbGVxKGRbaV0ubWF4LnZ1bWF4LG5baV0ubWF4LnZ1bWF4KSkKKwkgIGRbaV0ubWF4LnZ1bWF4PW5baV0ubWF4LnZ1bWF4OworICAgICAgfWVsc2V7CisJaWYoem1sZXEobltpXS5taW4udm1heCxkW2ldLm1pbi52bWF4KSkKKwkgIGRbaV0ubWluLnZtYXg9bltpXS5taW4udm1heDsKKwlpZih6bWxlcShkW2ldLm1heC52bWF4LG5baV0ubWF4LnZtYXgpKQorCSAgZFtpXS5tYXgudm1heD1uW2ldLm1heC52bWF4OworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgaW50IHVwZGF0ZV9yYW5nZXMocmFuZ2UgKmQscmFuZ2UgKm4pCit7CisgIGludCBpLHQsY2hhbmdlPTA7CisgIFZhciAqdjsKKyAgZm9yKGk9MDtpPHZjb3VudC1yY291bnQ7aSsrKXsKKyAgICB2PXZpbGlzdFtpXTsKKyAgICB0PXYtPnZ0eXAtPmZsYWdzOworICAgIGlmKElTSU5UKHQpKXsKKyAgICAgIGlmKHQmVU5TSUdORUQpeworCWlmKCF6dW1lcXRvKG5baV0ubWluLnZ1bWF4LGRbaV0ubWluLnZ1bWF4KSl7CisJICBkW2ldLm1pbi52dW1heD1uW2ldLm1pbi52dW1heDsKKwkgIGNoYW5nZT0xOworCX0KKwlpZighenVtZXF0byhkW2ldLm1heC52dW1heCxuW2ldLm1heC52dW1heCkpeworCSAgZFtpXS5tYXgudnVtYXg9bltpXS5tYXgudnVtYXg7CisJICBjaGFuZ2U9MTsKKwl9CisgICAgICB9ZWxzZXsKKwlpZighem1lcXRvKG5baV0ubWluLnZtYXgsZFtpXS5taW4udm1heCkpeworCSAgZFtpXS5taW4udm1heD1uW2ldLm1pbi52bWF4OworCSAgY2hhbmdlPTE7CisJfQorCWlmKCF6bWVxdG8oZFtpXS5tYXgudm1heCxuW2ldLm1heC52bWF4KSl7CisJICBkW2ldLm1heC52bWF4PW5baV0ubWF4LnZtYXg7CisJICBjaGFuZ2U9MTsKKwl9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBjaGFuZ2U7Cit9CisKK3ZvaWQgZG9fcmFuZ2VzKHJhbmdlICpkLElDICpwKQoreworICBpbnQgaSxqLHQsYz1wLT5jb2RlOworICBpZigocC0+ei5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSKXsKKyAgICBpPXAtPnoudi0+aW5kZXg7CisgICAgdD1wLT56LnYtPnZ0eXAtPmZsYWdzOworICAgIGlmKGM9PUFTU0lHTil7CisgICAgICBpZigocC0+dHlwZiZOVSkhPSh0Jk5VKSl7CisJY2xlYXJfcmFuZ2UoZCxpKTsKKyAgICAgIH1lbHNlIGlmKChwLT5xMS5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCl7CisJZXZhbF9jb25zdCgmcC0+cTEudmFsLHQpOworCWlmKHQmVU5TSUdORUQpCisJICBkW2ldLm1pbi52dW1heD1kW2ldLm1heC52dW1heD12dW1heDsgCisJZWxzZQorCSAgZFtpXS5taW4udm1heD1kW2ldLm1heC52bWF4PXZtYXg7IAorICAgICAgfWVsc2UgaWYoKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJihwLT5xMS52LT52dHlwLT5mbGFncyZOVSk9PSh0Jk5VKSl7CisJaj1wLT5xMS52LT5pbmRleDsKKwlkW2ldLm1pbj1kW2pdLm1pbjsKKwlkW2ldLm1heD1kW2pdLm1heDsKKyAgICAgIH1lbHNlCisJY2xlYXJfcmFuZ2UoZCxpKTsKKyAgICB9ZWxzZXsKKyAgICAgIGNsZWFyX3JhbmdlKGQsaSk7CisgICAgfQorICB9ZWxzZXsKKyAgICBqPXAtPmNoYW5nZV9jbnQ7CisgICAgZm9yKGk9MDtpPGo7aSsrKXsKKyAgICAgIGlmKCEocC0+Y2hhbmdlX2xpc3RbaV0uZmxhZ3MmRFJFRk9CSikpCisJY2xlYXJfcmFuZ2UoZCxwLT5jaGFuZ2VfbGlzdFtpXS52LT5pbmRleCk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIGluc2VydF9tYXgocmFuZ2UgKnAsaW50IHQpCit7CisgIGlmKHQmVU5TSUdORUQpeworICAgIGlmKCF6dW1sZXEocC0+bWF4LnZ1bWF4LHZ1bWF4KSkKKyAgICAgIHAtPm1heC52dW1heD12dW1heDsKKyAgICBpZighenVtbGVxKHAtPm1pbi52dW1heCxwLT5tYXgudnVtYXgpKQorICAgICAgcC0+bWluLnZ1bWF4PXZ1bWF4OworICB9ZWxzZXsKKyAgICBpZighem1sZXEocC0+bWF4LnZtYXgsdm1heCkpCisgICAgICBwLT5tYXgudm1heD12bWF4OworICAgIGlmKCF6bWxlcShwLT5taW4udm1heCxwLT5tYXgudm1heCkpCisgICAgICBwLT5taW4udm1heD12bWF4OworICB9Cit9CisKK3N0YXRpYyB2b2lkIGluc2VydF9taW4ocmFuZ2UgKnAsaW50IHQpCit7CisgIGlmKHQmVU5TSUdORUQpeworICAgIGlmKCF6dW1sZXEodnVtYXgscC0+bWluLnZ1bWF4KSkKKyAgICAgIHAtPm1pbi52dW1heD12dW1heDsKKyAgICBpZighenVtbGVxKHAtPm1pbi52dW1heCxwLT5tYXgudnVtYXgpKQorICAgICAgcC0+bWF4LnZ1bWF4PXZ1bWF4OworICB9ZWxzZXsKKyAgICBpZighem1sZXEodm1heCxwLT5taW4udm1heCkpCisgICAgICBwLT5taW4udm1heD12bWF4OworICAgIGlmKCF6bWxlcShwLT5taW4udm1heCxwLT5tYXgudm1heCkpCisgICAgICBwLT5tYXgudm1heD12bWF4OworICB9Cit9CisKK3N0YXRpYyB2b2lkIGluY192YWwoaW50IHQpCit7CisgIGlmKHQmVU5TSUdORUQpeworICAgIGlmKCF6dW1lcXRvKHZ1bWF4LHR1X21heFt0Jk5VXSkpCisgICAgICB2dW1heD16dW1hZGQodnVtYXgsWlUxKTsKKyAgfWVsc2V7CisgICAgaWYoIXptZXF0byh2bWF4LHRfbWF4W3QmTlVdKSkKKyAgICAgIHZtYXg9em1hZGQodm1heCxaMSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgZGVjX3ZhbChpbnQgdCkKK3sKKyAgaWYodCZVTlNJR05FRCl7CisgICAgaWYoIXp1bWVxdG8odnVtYXgsWlUwKSkKKyAgICAgIHZ1bWF4PXp1bXN1Yih2dW1heCxaVTEpOworICB9ZWxzZXsKKyAgICBpZighem1lcXRvKHZtYXgsdF9taW5bdCZOVV0pKQorICAgICAgdm1heD16bXN1Yih2bWF4LFoxKTsKKyAgfQorfQorCit2b2lkIHJhbmdlX2FuYWx5c2lzKGZsb3dncmFwaCAqZmcpCit7CisgIGZsb3dncmFwaCAqZzsKKyAgcmFuZ2UgKmJwLCplcmFuZ2UsKmNyYW5nZTsKKyAgVmFyICp2OworICBpbnQgaSx0LGRvbmUscGFzczsKKyAgcmFuZ2VidWY9bXltYWxsb2MoUkFOR0VTSVpFKigyKmJhc2ljX2Jsb2NrcyszKSk7CisgIGJwPXJhbmdlYnVmOworICBmb3IoaT0wO2k8dmNvdW50LXJjb3VudDtpKyspCisgICAgY2xlYXJfcmFuZ2UoYnAsaSk7CisgIGVyYW5nZT1icDsKKyAgYnArPVJBTkdFU0laRTsKKyAgZm9yKGc9Zmc7ZztnPWctPm5vcm1hbG91dCl7CisgICAgZy0+cmFfbm9ybWFsb3V0PWJwOworICAgIG1lbWNweShicCxlcmFuZ2UsUkFOR0VTSVpFKTsKKyAgICBicCs9UkFOR0VTSVpFOworICAgIGctPnJhX2JyYW5jaG91dD1icDsKKyAgICBtZW1jcHkoYnAsZXJhbmdlLFJBTkdFU0laRSk7CisgICAgYnArPVJBTkdFU0laRTsKKyAgfQorICBjcmFuZ2U9YnA7CisKKyAgcGFzcz0xOworICBkb3sKKyAgICBpZihERUJVRyYxMDI0KSBwcmludGYoInJhbmdlIGFuYWx5c2lzIHBhc3MgJWRcbiIscGFzcyk7CisgICAgZG9uZT0xOworICAgIGZvcihnPWZnO2c7Zz1nLT5ub3JtYWxvdXQpeworICAgICAgZmxvd2xpc3QgKmxwOworICAgICAgSUMgKnA7CisgICAgICBpbnQgYyxmaXJzdD0xOworICAgICAgbWVtY3B5KGNyYW5nZSxlcmFuZ2UsUkFOR0VTSVpFKTsKKyAgICAgIGZvcihscD1nLT5pbjtscDtscD1scC0+bmV4dCl7CisJaWYobHAtPmdyYXBoLT5ub3JtYWxvdXQ9PWcmJighbHAtPmdyYXBoLT5lbmR8fGxwLT5ncmFwaC0+ZW5kLT5jb2RlIT1CUkEpKXsKKwkgIGlmKGZpcnN0KXsKKwkgICAgbWVtY3B5KGNyYW5nZSxscC0+Z3JhcGgtPnJhX25vcm1hbG91dCxSQU5HRVNJWkUpOworCSAgICBmaXJzdD0wOworCSAgfWVsc2UKKwkgICAgY29tYmluZV9yYW5nZXMoY3JhbmdlLGxwLT5ncmFwaC0+cmFfbm9ybWFsb3V0KTsKKwl9CisJaWYobHAtPmdyYXBoLT5icmFuY2hvdXQ9PWcpeworCSAgaWYoZmlyc3QpIHsKKwkgICAgbWVtY3B5KGNyYW5nZSxscC0+Z3JhcGgtPnJhX2JyYW5jaG91dCxSQU5HRVNJWkUpOworCSAgICBmaXJzdD0wOworCSAgfWVsc2UKKwkgICAgY29tYmluZV9yYW5nZXMoY3JhbmdlLGxwLT5ncmFwaC0+cmFfYnJhbmNob3V0KTsKKwl9CisgICAgICB9CisgICAgICBpZihERUJVRyYxMzEwNzIpeworCXByaW50ZigiYmxvY2sgJWQsIGlucHV0OlxuIixnLT5pbmRleCk7CisJcHJpbnRfcmFuZ2VzKHN0ZG91dCxjcmFuZ2UpOworICAgICAgfQorICAgICAgZm9yKHA9Zy0+c3RhcnQ7cDtwPXAtPm5leHQpeworCWRvX3JhbmdlcyhjcmFuZ2UscCk7CisJaWYocD09Zy0+ZW5kfHxwLT5jb2RlPT1URVNUfHxwLT5jb2RlPT1DT01QQVJFKSBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmKHApIGM9cC0+Y29kZTsgZWxzZSBjPTA7CisgICAgICBpZihjPT1DT01QQVJFfHxjPT1URVNUKXsKKwlpZigocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmKGM9PVRFU1R8fChwLT5xMi5mbGFncyYoS09OU1R8RFJFRk9CSikpPT1LT05TVCkpeworCSAgSUMgKmI9cC0+bmV4dDsKKwkgIHJhbmdlIHRtcDsKKwkgIHdoaWxlKGImJmItPmNvZGU8QkVRfHxiLT5jb2RlPkJHVCkgYj1iLT5uZXh0OworCSAgaWYoIWIpIGllcnJvcigwKTsKKwkgIGlmKGM9PVRFU1QpeworCSAgICB2bWF4PVowOworCSAgICB2dW1heD1aVTA7CisJICB9ZWxzZQorCSAgICBldmFsX2NvbnN0KCZwLT5xMi52YWwscC0+dHlwZik7CisJICBpPXAtPnExLnYtPmluZGV4OworCSAgdD1wLT5xMS52LT52dHlwLT5mbGFnczsKKwkgIGlmKGItPmNvZGU9PUJFUSl7CisJICAgIGlmKHVwZGF0ZV9yYW5nZXMoZy0+cmFfbm9ybWFsb3V0LGNyYW5nZSkpIGRvbmU9MDsKKwkgICAgaWYodCZVTlNJR05FRCkKKwkgICAgICBjcmFuZ2VbaV0ubWluLnZ1bWF4PWNyYW5nZVtpXS5tYXgudnVtYXg9dnVtYXg7CisJICAgIGVsc2UKKwkgICAgICBjcmFuZ2VbaV0ubWluLnZtYXg9Y3JhbmdlW2ldLm1heC52bWF4PXZtYXg7CisJICAgIGlmKHVwZGF0ZV9yYW5nZXMoZy0+cmFfYnJhbmNob3V0LGNyYW5nZSkpIGRvbmU9MDsKKwkgIH1lbHNlIGlmKGItPmNvZGU9PUJORSl7CisJICAgIGlmKHVwZGF0ZV9yYW5nZXMoZy0+cmFfYnJhbmNob3V0LGNyYW5nZSkpIGRvbmU9MDsKKwkgICAgaWYodCZVTlNJR05FRCkKKwkgICAgICBjcmFuZ2VbaV0ubWluLnZ1bWF4PWNyYW5nZVtpXS5taW4udnVtYXg9dnVtYXg7CisJICAgIGVsc2UKKwkgICAgICBjcmFuZ2VbaV0ubWF4LnZ1bWF4PWNyYW5nZVtpXS5tYXgudnVtYXg9dnVtYXg7CisJICAgIGlmKHVwZGF0ZV9yYW5nZXMoZy0+cmFfbm9ybWFsb3V0LGNyYW5nZSkpIGRvbmU9MDsKKwkgIH1lbHNlIGlmKGItPmNvZGU9PUJMVHx8Yi0+Y29kZT09QkxFKXsKKwkgICAgdG1wPWNyYW5nZVtpXTsKKwkgICAgaWYoYi0+Y29kZT09QkxUKSBkZWNfdmFsKHQpOworCSAgICBpbnNlcnRfbWF4KCZjcmFuZ2VbaV0sdCk7CisJICAgIGlmKHVwZGF0ZV9yYW5nZXMoZy0+cmFfYnJhbmNob3V0LGNyYW5nZSkpIGRvbmU9MDsKKwkgICAgY3JhbmdlW2ldPXRtcDsKKwkgICAgaW5jX3ZhbCh0KTsKKwkgICAgaW5zZXJ0X21pbigmY3JhbmdlW2ldLHQpOworCSAgICBpZih1cGRhdGVfcmFuZ2VzKGctPnJhX25vcm1hbG91dCxjcmFuZ2UpKSBkb25lPTA7CisJICB9ZWxzZSBpZihiLT5jb2RlPT1CR0V8fGItPmNvZGU9PUJHVCl7CisJICAgIHRtcD1jcmFuZ2VbaV07CisJICAgIGlmKGItPmNvZGU9PUJHVCkgaW5jX3ZhbCh0KTsKKwkgICAgaW5zZXJ0X21pbigmY3JhbmdlW2ldLHQpOworCSAgICBpZih1cGRhdGVfcmFuZ2VzKGctPnJhX2JyYW5jaG91dCxjcmFuZ2UpKSBkb25lPTA7CisJICAgIGNyYW5nZVtpXT10bXA7CisJICAgIGRlY192YWwodCk7CisJICAgIGluc2VydF9tYXgoJmNyYW5nZVtpXSx0KTsKKwkgICAgaWYodXBkYXRlX3JhbmdlcyhnLT5yYV9ub3JtYWxvdXQsY3JhbmdlKSkgZG9uZT0wOworCSAgfWVsc2UKKwkgICAgaWVycm9yKDApOworCX1lbHNleworCSAgaWYodXBkYXRlX3JhbmdlcyhnLT5yYV9icmFuY2hvdXQsY3JhbmdlKSkgZG9uZT0wOworCSAgaWYodXBkYXRlX3JhbmdlcyhnLT5yYV9ub3JtYWxvdXQsY3JhbmdlKSkgZG9uZT0wOworCX0KKyAgICAgIH1lbHNleworCWlmKGctPmJyYW5jaG91dCl7CisJICAvKiBtdXN0IGJlIEJSQSBhcyB3ZSBjaGVja2VkIGZvciBDT01QQVJFL1RFU1QgYWJvdmUgKi8KKwkgIGlmKHVwZGF0ZV9yYW5nZXMoZy0+cmFfYnJhbmNob3V0LGNyYW5nZSkpCisJICAgIGRvbmU9MDsKKwl9ZWxzZXsKKwkgIGlmKHVwZGF0ZV9yYW5nZXMoZy0+cmFfbm9ybWFsb3V0LGNyYW5nZSkpCisJICAgIGRvbmU9MDsKKwl9CisgICAgICB9CisgICAgICBpZihERUJVRyYxMzEwNzIpeworCXByaW50ZigicmFfYnJhbmNob3V0OlxuIik7CisJcHJpbnRfcmFuZ2VzKHN0ZG91dCxnLT5yYV9icmFuY2hvdXQpOworCXByaW50ZigicmFfbm9ybWFsb3V0OlxuIik7CisJcHJpbnRfcmFuZ2VzKHN0ZG91dCxnLT5yYV9ub3JtYWxvdXQpOworICAgICAgfQorICAgIH0KKyAgICBwYXNzKys7CisgIH13aGlsZSghZG9uZSk7CisgIAorICAKK30KZGlmZiAtLWdpdCBhL3JkLmMgYi9yZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YWQ1MTMKLS0tIC9kZXYvbnVsbAorKysgYi9yZC5jCkBAIC0wLDAgKzEsNjQ1IEBACisvKiAgJFZFUjogdmJjYyAocmQuYykgJFJldmlzaW9uOiAxLjE2ICQgICAgKi8KKy8qICByZWFjaGluZyBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnQgcHJvcGFnYXRpb24gICAqLworCisjaW5jbHVkZSAib3B0LmgiCisKK3N0YXRpYyBjaGFyIEZJTEVfW109X19GSUxFX187CisKK3Vuc2lnbmVkIGludCBkY291bnQ7CitzaXplX3QgZHNpemU7CitJQyAqKmRsaXN0OworYnZ0eXBlICpyZF9kZWZzOworYnZ0eXBlICoqZGVmc19raWxsOyAgICAvKiBkZWZpbml0aW9ucyBraWxsZWQgKi8KK2J2dHlwZSAqKmRlZnNfZ2VuOyAgICAgLyogZGVmaW5pdGlvbnMgdW5kZWZpbmVkICovCitidnR5cGUgKip2YXJfZGVmczsgICAgIC8qIGRlZmluaXRpb25zIG9mIGEgdmFyaWFibGUgKi8KK2J2dHlwZSAqKnZhcl91bmRlZnM7ICAgLyogZGVmaW5pdGlvbnMgd2hpY2ggYXJlIHVuZGVmaW5lZCBieSB3cml0aW5nIHRvIHRoaXMgdmFyICovCitidnR5cGUgKnJkX21hdHJpeDsKKworaW50IGRlZl9vdmVyd3JpdGVzKElDICpuZXcsSUMgKm9sZCk7CisjZGVmaW5lIE5PX09WRVJXUklURSAwCisjZGVmaW5lIEZVTExfT1ZFUldSSVRFIDEKKyNkZWZpbmUgUEFSVElBTF9PVkVSV1JJVEUgMgorI2RlZmluZSBFWEFDVF9PVkVSV1JJVEUgMworCisvKiAgY29tcGFyZXMgdHdvIGNvbnN0YW50czsgLTEsIGlmIHExPHEyOyAwLCBpZiBxMT09cTE7IDEgb3RoZXJ3aXNlICAqLworaW50IGNvbXBhcmVfY29uc3QodW5pb24gYXR5cHMgKnExLHVuaW9uIGF0eXBzICpxMixpbnQgdCkKK3sKKyAgemxkb3VibGUgZDEsZDI7em1heCBsMSxsMjt6dW1heCB1MSx1MjsKKyAgdCY9TlU7CisgIGV2YWxfY29uc3QocTEsdCk7ZDE9dmxkb3VibGU7bDE9dm1heDt1MT12dW1heDsKKyAgZXZhbF9jb25zdChxMix0KTtkMj12bGRvdWJsZTtsMj12bWF4O3UyPXZ1bWF4OworICBpZihJU0ZMT0FUKHQpKSByZXR1cm4oemxkbGVxKGQyLGQxKT8hemxkZXF0byhkMSxkMik6LTEpOworICBpZihJU1BPSU5URVIodCl8fCh0JlVOU0lHTkVEKSkgcmV0dXJuKHp1bWxlcSh1Mix1MSk/IXp1bWVxdG8odTEsdTIpOi0xKTsKKyAgcmV0dXJuKHptbGVxKGwyLGwxKT8hem1lcXRvKGwxLGwyKTotMSk7Cit9CisKKy8qIHByaW50cyBkZWZpbml0aW9ucyBpbiBhIGJpdHZlY3RvciAqLwordm9pZCBwcmludF9yZChidnR5cGUgKmJpdHZlY3RvcikKK3sKKyAgdW5zaWduZWQgaW50IGk7CisgIGlmKCFiaXR2ZWN0b3IpIHtwcmludGYoInJlYWNoaW5nIGRlZmluaXRpb25zIG5vdCBhdmFpbGFibGVcbiIpO3JldHVybjt9CisgIGZvcihpPTE7aTw9ZGNvdW50O2krKyl7CisgICAgaWYoQlRTVChiaXR2ZWN0b3IsaSkpIHtwcmludGYoIiUzdToiLGkpO3ByaWMyKHN0ZG91dCxkbGlzdFtpXSk7fQorICAgIGlmKEJUU1QoYml0dmVjdG9yLFVOREVGKGkpKSkge3ByaW50ZigiJTN1KHVkKToiLGkpO3ByaWMyKHN0ZG91dCxkbGlzdFtpXSk7fQorICB9Cit9CisKKy8qIG51bWJlcnMgYWxsIGRlZmluaXRpb25zIGFuZCBjcmVhdGVzIHNvbWUgYml0dmVjdG9ycyAqLwordm9pZCBudW1fZGVmcyh2b2lkKQoreworICBpbnQgaSxqO0lDICpwOworICBzaXplX3QgbWF0cml4X3NpemU7CisgIGJ2dHlwZSAqYnA7CisgIHVuc2lnbmVkIGxvbmcgaGVhcHNpemU9MDsKKyAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJudW1lcmF0aW5nIGRlZmluaXRpb25zXG4iKTsKKyAgaT0wOworICBmb3IocD1maXJzdF9pYztwO3A9cC0+bmV4dCl7CisgICAgaWYoIShwLT56LmZsYWdzJihWQVJ8RFJFRk9CSikpJiZwLT5jb2RlIT1DQUxMKXtwLT5kZWZpbmRleD0wO2NvbnRpbnVlO30KKyAgICBwLT5kZWZpbmRleD0rK2k7CisgIH0KKyAgZGNvdW50PWk7CisgIC8qZHNpemU9KDIqZGNvdW50KzErQ0hBUl9CSVQpL0NIQVJfQklUOyAgICAvKiArMSwgZGEgYmVpIDEgYW5mYWVuZ3QgKi8KKyAgZHNpemU9QlZTSVpFKDIqKGRjb3VudCsxKSk7CisgIGlmKERFQlVHJigxNjM4NHwxMDI0KSkgcHJpbnRmKCIlbHUgZGVmaW5pdGlvbnMsIGRzaXplPSVsdVxuIiwodW5zaWduZWQgbG9uZylkY291bnQsKHVuc2lnbmVkIGxvbmcpZHNpemUpOworICAKKyAgLyogZ2V0IGJpZyBtZW1vcnkgYmxvY2sgdG8gc3RvcmUgZGVmc19raWxsLCBkZWZzX2dlbiwgdmFycywgdmFyX2RlZnMgYW5kIHZhcl91bmRlZnMgKi8KKyAgbWF0cml4X3NpemU9KDIqKGRjb3VudCt2Y291bnQpKmRzaXplKTsKKyAgcmRfbWF0cml4PWJwPW15bWFsbG9jKG1hdHJpeF9zaXplKTsKKyAgbWVtc2V0KGJwLDAsbWF0cml4X3NpemUpOworICBoZWFwc2l6ZSs9bWF0cml4X3NpemU7CisKKyAgLyogY2FsY3VsYXRlIGJpdC12ZWN0b3Igd2hpY2ggY29udGFpbnMgYWxsIGRlZmluaXRpb25zIGtpbGxlZCBvciAqLworICAvKiB1bmRlZmluZWQgKD1wYXJ0aWFsbHkgb3ZlcndyaXR0ZW4pIGJ5IHRoaXMgZGVmaW5pdGlvbiAgICAgICAgICovCisgIGRlZnNfa2lsbD1teW1hbGxvYyhzaXplb2YoKmRlZnNfa2lsbCkqKGRjb3VudCsxKSk7CisgIGRlZnNfZ2VuPW15bWFsbG9jKHNpemVvZigqZGVmc19nZW4pKihkY291bnQrMSkpOworICBoZWFwc2l6ZSs9MipzaXplb2YoKmRlZnNfa2lsbCkqKGRjb3VudCsxKTsKKworICBmb3IoaT0xO2k8PWRjb3VudDtpKyspeworICAgIGRlZnNfa2lsbFtpXT1icDsKKyAgICBicCs9ZHNpemUvc2l6ZW9mKGJ2dHlwZSk7CisgICAgZGVmc19nZW5baV09YnA7CisgICAgYnArPWRzaXplL3NpemVvZihidnR5cGUpOworICB9CisgIAorICAvKiBjYWxjdWxhdGUgYml0IHZlY3RvciB3aXRoIGFsbCB1bmRlZmluZWQgZGVmaW5pdGlvbnMgb2YgZWFjaCB2YXJpYWJsZSAqLworICB2YXJfZGVmcz1teW1hbGxvYyhzaXplb2YoKnZhcl9kZWZzKSp2Y291bnQpOworICBoZWFwc2l6ZSs9c2l6ZW9mKCp2YXJfZGVmcykqdmNvdW50OworICB2YXJfdW5kZWZzPW15bWFsbG9jKHNpemVvZigqdmFyX3VuZGVmcykqdmNvdW50KTsKKyAgaGVhcHNpemUrPXNpemVvZigqdmFyX3VuZGVmcykqdmNvdW50OworICBmb3IoaT0wO2k8dmNvdW50O2krKyl7CisgICAgdmFyX2RlZnNbaV09YnA7CisgICAgYnArPWRzaXplL3NpemVvZihidnR5cGUpOworICAgIHZhcl91bmRlZnNbaV09YnA7CisgICAgYnArPWRzaXplL3NpemVvZihidnR5cGUpOworICB9CisgIAorICAvKiBjYWxjdWxhdGUgcG9pbnRlcnMgdG8gSUMgZm9yIGV2ZXJ5IGRlZmluaXRpb24gKi8KKyAgZGxpc3Q9bXltYWxsb2MoKGRjb3VudCsxKSpzaXplb2YoKmRsaXN0KSk7CisgIGhlYXBzaXplKz0oZGNvdW50KzEpKnNpemVvZigqZGxpc3QpOworCisgIGZvcihwPWZpcnN0X2ljO3A7cD1wLT5uZXh0KXsKKyAgICBpZihwLT5kZWZpbmRleCl7CisgICAgICBkbGlzdFtwLT5kZWZpbmRleF09cDsKKyAgICAgIGlmKHAtPnouZmxhZ3MmVkFSKXsKKyAgICAgICAgVmFyICp2PXAtPnoudjsKKyAgICAgICAgaT12LT5pbmRleDsKKyAgICAgICAgaWYocC0+ei5mbGFncyZEUkVGT0JKKSBpKz12Y291bnQtcmNvdW50OworICAgICAgICBCU0VUKHZhcl9kZWZzW2ldLHAtPmRlZmluZGV4KTsKKwlCU0VUKHZhcl9kZWZzW2ldLFVOREVGKHAtPmRlZmluZGV4KSk7CisJaWYoaTxyY291bnQpeworCSAgQlNFVCh2YXJfZGVmc1tpK3Zjb3VudC1yY291bnRdLHAtPmRlZmluZGV4KTsKKwkgIEJTRVQodmFyX2RlZnNbaSt2Y291bnQtcmNvdW50XSxVTkRFRihwLT5kZWZpbmRleCkpOworCX0KKyAgICAgICAgQlNFVCh2YXJfdW5kZWZzW2ldLFVOREVGKHAtPmRlZmluZGV4KSk7CisgICAgICB9CisgICAgfQorICB9CisgIAorICBmb3IoaT0xO2k8PWRjb3VudDtpKyspeworICAgIHA9ZGxpc3RbaV07CisgICAgZm9yKGo9MDtqPHAtPmNoYW5nZV9jbnQ7aisrKXsKKyAgICAgIGludCBpZHg7CisgICAgICBpZHg9cC0+Y2hhbmdlX2xpc3Rbal0udi0+aW5kZXg7CisgICAgICBpZihwLT5jaGFuZ2VfbGlzdFtqXS5mbGFncyZEUkVGT0JKKSBpZHgrPXZjb3VudC1yY291bnQ7CisgICAgICBpZihpZHg+PXZjb3VudCkgY29udGludWU7CQorICAgICAgQlNFVCh2YXJfZGVmc1tpZHhdLGkpOworICAgICAgYnZ1bml0ZShkZWZzX2dlbltpXSx2YXJfdW5kZWZzW2lkeF0sZHNpemUpOworICAgIH0KKyAgICBpZihwLT56LmZsYWdzJlZBUil7CisgICAgICBmb3Ioaj0xO2o8PWRjb3VudDtqKyspeworCWludCBvdzsKKwlJQyAqcDI7CisJaWYoaT09aikgY29udGludWU7CisJcDI9ZGxpc3Rbal07CisJaWYoIShwMi0+ei5mbGFncyZWQVIpfHxwLT56LnYhPXAyLT56LnZ8fHAtPnouZmxhZ3MhPXAyLT56LmZsYWdzKQorCSAgY29udGludWU7CisJb3c9ZGVmX292ZXJ3cml0ZXMocCxwMik7CisJaWYob3c9PUZVTExfT1ZFUldSSVRFfHxvdz09RVhBQ1RfT1ZFUldSSVRFKXsKKwkgIEJTRVQoZGVmc19raWxsW2ldLGopOworCSAgQlNFVChkZWZzX2tpbGxbaV0sVU5ERUYoaikpOworCX0KKwlpZihvdz09RVhBQ1RfT1ZFUldSSVRFfHxvdz09Tk9fT1ZFUldSSVRFKXsKKwkgIEJDTFIoZGVmc19nZW5baV0saik7CisJICBCQ0xSKGRlZnNfZ2VuW2ldLFVOREVGKGopKTsKKwl9CisgICAgICB9CisgICAgfQorICAgIC8qIGV2ZXJ5IGRlZmluaXRpb24gZGVmaW5lcyBpdHNlbGYpICovCisgICAgQlNFVChkZWZzX2dlbltpXSxpKTsKKyAgICBCQ0xSKGRlZnNfZ2VuW2ldLFVOREVGKGkpKTsKKyAgICBCU0VUKGRlZnNfa2lsbFtpXSxVTkRFRihpKSk7CisgIH0KKyAgCisgIGlmKERFQlVHJjIwNDgpeworICAgIGZvcihpPTA7aTx2Y291bnQ7aSsrKXsKKyAgICAgIHByaW50ZigidmFyX2RlZnMgZm9yIHZhciAlaSAlcyglcCk6XG4iLGksdmlsaXN0W2ldLT5pZGVudGlmaWVyLHZpbGlzdFtpXSk7CisgICAgICBwcmludF9yZCh2YXJfZGVmc1tpXSk7CisgICAgfQorCQorICAgIGZvcihpPTE7aTw9ZGNvdW50O2krKyl7CisgICAgICBwcmludGYoIkRlZiUzZDogIixpKTtwcmljMihzdGRvdXQsZGxpc3RbaV0pOworICAgICAgcHJpbnRmKCIga2lsbHM6XG4iKTsKKyAgICAgIGZvcihqPTE7ajw9ZGNvdW50O2orKyl7CisJaWYoQlRTVChkZWZzX2tpbGxbaV0saikpIHtwcmludGYoIiAgIik7cHJpYzIoc3Rkb3V0LGRsaXN0W2pdKTt9CisJaWYoQlRTVChkZWZzX2tpbGxbaV0sVU5ERUYoaikpKSB7cHJpbnRmKCIgICh1ZCkiKTtwcmljMihzdGRvdXQsZGxpc3Rbal0pO30KKyAgICAgIH0KKyAgICAgIHByaW50ZigiIGdlbnM6XG4iKTsKKyAgICAgIGZvcihqPTE7ajw9ZGNvdW50O2orKyl7CisJaWYoQlRTVChkZWZzX2dlbltpXSxqKSkge3ByaW50ZigiICAiKTtwcmljMihzdGRvdXQsZGxpc3Rbal0pO30KKwlpZihCVFNUKGRlZnNfZ2VuW2ldLFVOREVGKGopKSkge3ByaW50ZigiICAodWQpIik7cHJpYzIoc3Rkb3V0LGRsaXN0W2pdKTt9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYoREVCVUcmMTYzODQpIHByaW50ZigibnVtX2RlZnMgaGVhcHNpemU9JWx1XG4iLGhlYXBzaXplKTsKKworICBmcmVlKHZhcl91bmRlZnMpOworfQorCisvKiByZXR1cm5zIHdoZXRoZXIgbiBvdmVyd3JpdGVzIHRoZSBkZWZpbml0aW9uIHAgKi8KK2ludCBkZWZfb3ZlcndyaXRlcyhJQyAqbixJQyAqbykKK3sKKyAgem1heCBuc3RhcnQsbmVuZCxvc3RhcnQsb2VuZCxuc2l6ZSxvc2l6ZTsKKyAgaWYoIShuLT56LmZsYWdzJlZBUikpIGllcnJvcigwKTsKKyAgaWYoIShvLT56LmZsYWdzJlZBUikpIGllcnJvcigwKTsKKyAgaWYoKG4tPnouZmxhZ3MmRFJFRk9CSikhPShvLT56LmZsYWdzJkRSRUZPQkopKSBpZXJyb3IoMCk7CisgIGlmKG4tPmNvZGU9PUFTU0lHTil7CisgICAgbnNpemU9bi0+cTIudmFsLnZtYXg7CisgIH1lbHNleworICAgIG5zaXplPXNpemV0YWJbenR5cChuKSZOUV07CisgIH0KKyAgaWYoby0+Y29kZT09QVNTSUdOKXsKKyAgICBvc2l6ZT1vLT5xMi52YWwudm1heDsKKyAgfWVsc2V7CisgICAgb3NpemU9c2l6ZXRhYlt6dHlwKG8pJk5RXTsKKyAgfQorICBpZihuLT56LmZsYWdzJkRSRUZPQkopCisgICAgcmV0dXJuIHptbGVxKG9zaXplLG5zaXplKTsKKworICBuc3RhcnQ9bi0+ei52YWwudm1heDsKKyAgbmVuZD16bXN1Yih6bWFkZChuc3RhcnQsbnNpemUpLGwyem0oMUwpKTsKKyAgb3N0YXJ0PW8tPnoudmFsLnZtYXg7CisgIG9lbmQ9em1zdWIoem1hZGQob3N0YXJ0LG9zaXplKSxsMnptKDFMKSk7CisKKyAgaWYoem1lcXRvKG5zdGFydCxvc3RhcnQpJiZ6bWVxdG8obmVuZCxvZW5kKSkKKyAgICByZXR1cm4gRVhBQ1RfT1ZFUldSSVRFOworCisgIGlmKHptbGVxKG5zdGFydCxvc3RhcnQpJiZ6bWxlcShvZW5kLG5lbmQpKQorICAgIHJldHVybiBGVUxMX09WRVJXUklURTsKKworICBpZih6bWxlcShvc3RhcnQsbnN0YXJ0KSYmem1sZXEobnN0YXJ0LG9lbmQpKQorICAgIHJldHVybiBQQVJUSUFMX09WRVJXUklURTsKKyAgaWYoem1sZXEob3N0YXJ0LG5lbmQpJiZ6bWxlcShuZW5kLG9lbmQpKQorICAgIHJldHVybiBQQVJUSUFMX09WRVJXUklURTsKKworICByZXR1cm4gTk9fT1ZFUldSSVRFOworfQorCisvKiBwZXJmb3JtcyBkYXRhIGZsb3cgYW5hbHlzaXMgZm9yIHJlYWNoaW5nIGRlZmluaXRpb25zICovCit2b2lkIHJlYWNoaW5nX2RlZmluaXRpb25zKGZsb3dncmFwaCAqZmcpCit7CisgIGZsb3dncmFwaCAqZztJQyAqcDtidnR5cGUgKnRtcCwqaW5pdDsKKyAgaW50IGNoYW5nZWQscGFzcyxpLGo7CisgIHVuc2lnbmVkIGxvbmcgaGVhcHNpemU9MDsKKyAgLyogIHJkX2dlbiB1bmQgcmRfa2lsbCBmdWVyIGplZGVuIEJsb2NrIGJlcmVjaG5lbiAgICovCisgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiYW5hbHlzaW5nIHJlYWNoaW5nIGRlZmluaXRpb25zXG4iKTsKKyAgdG1wPW15bWFsbG9jKGRzaXplKTsKKyAgaW5pdD1teW1hbGxvYyhkc2l6ZSk7CisgIGhlYXBzaXplKz0yKmRzaXplOworICBtZW1zZXQoaW5pdCwwLGRzaXplKTsKKyAgZm9yKGk9MTtpPD1kY291bnQ7aSsrKXsKKyAgICBwPWRsaXN0W2ldOworICAgIGlmKHAtPnouZmxhZ3MmVkFSKXsKKyAgICAgIFZhciAqdj1wLT56LnY7CisgICAgICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk58fHYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQ3x8di0+cmVnIT0wfHwhem1sZXEobDJ6bSgwTCksdi0+b2Zmc2V0KSl7CisJQlNFVChpbml0LFVOREVGKGkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZz1mZzsKKyAgd2hpbGUoZyl7CisgICAgZy0+cmRfaW49bXltYWxsb2MoZHNpemUpOworICAgIG1lbXNldChnLT5yZF9pbiwwLGRzaXplKTsKKyAgICBnLT5yZF9vdXQ9bXltYWxsb2MoZHNpemUpOworICAgIG1lbXNldChnLT5yZF9vdXQsMCxkc2l6ZSk7CisgICAgZy0+cmRfZ2VuPW15bWFsbG9jKGRzaXplKTsKKyAgICBtZW1zZXQoZy0+cmRfZ2VuLDAsZHNpemUpOworICAgIGctPnJkX2tpbGw9bXltYWxsb2MoZHNpemUpOworICAgIG1lbXNldChnLT5yZF9raWxsLDAsZHNpemUpOworICAgIGhlYXBzaXplKz00KmRzaXplOworICAgIHA9Zy0+ZW5kOworICAgIHdoaWxlKHApeworICAgICAgaWYocC0+ZGVmaW5kZXgpeworCWJ2dW5pdGUoZy0+cmRfZ2VuLGRlZnNfZ2VuW3AtPmRlZmluZGV4XSxkc2l6ZSk7CisJYnZkaWZmKGctPnJkX2dlbixnLT5yZF9raWxsLGRzaXplKTsKKwlidnVuaXRlKGctPnJkX2tpbGwsZGVmc19raWxsW3AtPmRlZmluZGV4XSxkc2l6ZSk7CisJYnZkaWZmKGctPnJkX2tpbGwsZy0+cmRfZ2VuLGRzaXplKTsKKyAgICAgIH0KKyAgICAgIGlmKHA9PWctPnN0YXJ0KSBicmVhazsKKyAgICAgIHA9cC0+cHJldjsKKyAgICB9CisgICAgbWVtY3B5KGctPnJkX291dCxnLT5yZF9nZW4sZHNpemUpOworICAgIGc9Zy0+bm9ybWFsb3V0OworICB9CisKKyAgLyogIHJkX2luIHVuZCByZF9vdXQgZnVlciBqZWRlbiBCbG9jayBiZXJlY2huZW4gKi8KKyAgLyogIG91dChiKT1nZW4oQikgdm9yaW5pdGlhbGlzaWVydCAgICAgICAgICAgICAgKi8KKyAgaWYoREVCVUcmMTAyNCkge3ByaW50ZigicGFzczoiKTtwYXNzPTA7fQorICBkb3sKKyAgICBpZihERUJVRyYxMDI0KSB7cHJpbnRmKCIgJWQiLCsrcGFzcyk7ZmZsdXNoKHN0ZG91dCk7fQorICAgIGNoYW5nZWQ9MDsKKyAgICBnPWZnOworICAgIHdoaWxlKGcpeworICAgICAgZmxvd2xpc3QgKmxwOworICAgICAgLyogIGluKEIpPVUgb3V0KEMpIDogQyBWb3JnYWVuZ2VyIHZvbiBCICovCisgICAgICBpZihnPT1mZykKKwltZW1jcHkoZy0+cmRfaW4saW5pdCxkc2l6ZSk7CisgICAgICBlbHNlCisJbWVtc2V0KGctPnJkX2luLDAsZHNpemUpOworICAgICAgbHA9Zy0+aW47CisgICAgICB3aGlsZShscCl7CisJaWYoIWxwLT5ncmFwaCkgaWVycm9yKDApOworCWlmKGxwLT5ncmFwaC0+YnJhbmNob3V0PT1nfHwhbHAtPmdyYXBoLT5lbmR8fGxwLT5ncmFwaC0+ZW5kLT5jb2RlIT1CUkEpCisJICBidnVuaXRlKGctPnJkX2luLGxwLT5ncmFwaC0+cmRfb3V0LGRzaXplKTsKKwlscD1scC0+bmV4dDsKKyAgICAgIH0KKyAgICAgIC8qICBvdXQoYik9Z2VuKEIpIFUgKGluKEIpLWtpbGwoQikgICovCisgICAgICBtZW1jcHkodG1wLGctPnJkX2luLGRzaXplKTsKKyAgICAgIGJ2ZGlmZih0bXAsZy0+cmRfa2lsbCxkc2l6ZSk7CisgICAgICBidnVuaXRlKHRtcCxnLT5yZF9nZW4sZHNpemUpOworICAgICAgaWYoIWJ2Y21wKHRtcCxnLT5yZF9vdXQsZHNpemUpKXtjaGFuZ2VkPTE7bWVtY3B5KGctPnJkX291dCx0bXAsZHNpemUpO30KKyAgICAgIGc9Zy0+bm9ybWFsb3V0OworICAgIH0KKyAgfXdoaWxlKGNoYW5nZWQpOworICBpZihERUJVRyYxMDI0KSBwcmludGYoIlxuIik7CisgIGlmKERFQlVHJjE2Mzg0KSBwcmludGYoInJlYWNoaW5nX2RlZnMgaGVhcHNpemU9JWx1XG4iLGhlYXBzaXplKTsKKyAgZnJlZSh0bXApOworICBmcmVlKGluaXQpOworfQorCisvKiBjYWxjdWxhdGVzIHo6PXExIG9wIHEyIHdpdGggY29uc3RhbnRzICovCisvKiBpZiBwIGlzIG5vbi16ZXJvIHExdHlwLHEydHlwIGZyb20gcCB3aWxsIGJlIHVzZWQgKi8KK3ZvaWQgY2FsYyhpbnQgYyxpbnQgdCx1bmlvbiBhdHlwcyAqcTEsdW5pb24gYXR5cHMgKnEyLHVuaW9uIGF0eXBzICp6LElDICpwKQoreworICB6bGRvdWJsZSBkMSxkMjt6bWF4IGwxLGwyO3p1bWF4IHUxLHUyOworICBpZihwKSB0PXExdHlwKHApOworICBldmFsX2NvbnN0KHExLHQpOworICBkMT12bGRvdWJsZTtsMT12bWF4O3UxPXZ1bWF4OworICBpZihjIT1NSU5VUyYmYyE9S09NUExFTUVOVCl7CisgICAgaWYocCkKKyAgICAgIGV2YWxfY29uc3QocTIscTJ0eXAocCkpOworICAgIGVsc2UKKyAgICAgIGV2YWxfY29uc3QocTIsdCk7CisgICAgZDI9dmxkb3VibGU7bDI9dm1heDt1Mj12dW1heDsKKyAgfQorICBpZihjPT1BREQpeyB2bGRvdWJsZT16bGRhZGQoZDEsZDIpO3ZtYXg9em1hZGQobDEsbDIpO3Z1bWF4PXp1bWFkZCh1MSx1Mik7fQorICBpZihjPT1TVUIpeyB2bGRvdWJsZT16bGRzdWIoZDEsZDIpO3ZtYXg9em1zdWIobDEsbDIpO3Z1bWF4PXp1bXN1Yih1MSx1Mik7fQorICBpZihjPT1BRERJMlApeyB2bWF4PXptYWRkKGwxLGwyKTt2dW1heD16dW1hZGQodTEsdTIpO30KKyAgaWYoYz09U1VCSUZQKXsgdm1heD16bXN1YihsMSxsMik7dnVtYXg9enVtc3ViKHUxLHUyKTt9CisgIGlmKGM9PU1VTFQpeyB2bGRvdWJsZT16bGRtdWx0KGQxLGQyKTt2bWF4PXptbXVsdChsMSxsMik7dnVtYXg9enVtbXVsdCh1MSx1Mik7fQorICBpZihjPT1ESVZ8fGM9PU1PRCl7CisgICAgaWYoemxkZXF0byhkMixkMnpsZCgwLjApKSYmem1lcXRvKGwyLGwyem0oMEwpKSYmenVtZXF0byh1Mix1bDJ6dW0oMFVMKSkpeworICAgICAgZXJyX2ljPXA7ZXJyb3IoMjEwKTtlcnJfaWM9MDsKKyAgICAgIHZtYXg9bDJ6bSgwTCk7dnVtYXg9dWwyenVtKDBMKTt2bGRvdWJsZT1kMnpsZCgwLjApOworICAgIH1lbHNleworICAgICAgaWYoYz09RElWKXsKKwl2bGRvdWJsZT16bGRkaXYoZDEsZDIpOworCWlmKCF6bWVxdG8obDIsbDJ6bSgwTCkpKSB2bWF4PXptZGl2KGwxLGwyKTsKKwlpZighenVtZXF0byh1Mix1bDJ6dW0oMFVMKSkpIHZ1bWF4PXp1bWRpdih1MSx1Mik7CisgICAgICB9ZWxzZXsKKwlpZighem1lcXRvKGwyLGwyem0oMEwpKSkgdm1heD16bW1vZChsMSxsMik7CisJaWYoIXp1bWVxdG8odTIsdWwyenVtKDBVTCkpKSB2dW1heD16dW1tb2QodTEsdTIpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihjPT1BTkQpeyB2bWF4PXptYW5kKGwxLGwyKTt2dW1heD16dW1hbmQodTEsdTIpO30KKyAgaWYoYz09T1IpeyB2bWF4PXptb3IobDEsbDIpO3Z1bWF4PXp1bW9yKHUxLHUyKTt9CisgIGlmKGM9PVhPUil7IHZtYXg9em14b3IobDEsbDIpO3Z1bWF4PXp1bXhvcih1MSx1Mik7fQorICBpZihjPT1MU0hJRlQpeyB2bWF4PXptbHNoaWZ0KGwxLGwyKTt2dW1heD16dW1sc2hpZnQodTEsbDIpO30KKyAgaWYoYz09UlNISUZUKXsgdm1heD16bXJzaGlmdChsMSxsMik7dnVtYXg9enVtcnNoaWZ0KHUxLGwyKTt9CisgIGlmKGM9PU1JTlVTKXsgdmxkb3VibGU9emxkc3ViKGQyemxkKDAuMCksZDEpO3ZtYXg9em1zdWIobDJ6bSgwTCksbDEpO3Z1bWF4PXp1bXN1Yih1bDJ6dW0oMFVMKSx1MSk7fQorICBpZihjPT1LT01QTEVNRU5UKXsgdm1heD16bWtvbXBsKGwxKTt2dW1heD16dW1rb21wbCh1MSk7fQorCisgIGlmKElTRkxPQVQodCkpeworICAgIGd2YWwudmxkb3VibGU9dmxkb3VibGU7CisgICAgZXZhbF9jb25zdCgmZ3ZhbCxMRE9VQkxFKTsKKyAgfWVsc2UgaWYodCZVTlNJR05FRCl7CisgICAgZ3ZhbC52dW1heD12dW1heDsKKyAgICBldmFsX2NvbnN0KCZndmFsLChVTlNJR05FRHxNQVhJTlQpKTsKKyAgfWVsc2V7CisgICAgZ3ZhbC52bWF4PXZtYXg7CisgICAgZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworICB9CisgIGlmKHApIHQ9enR5cChwKTsKKyAgaW5zZXJ0X2NvbnN0KHosdCk7Cit9CisKKy8qIGZvbGRzIGNvbnN0YW50IElDcyAqLworaW50IGZvbGQoSUMgKnApCit7CisgIGludCBjOworICBpZighcCkgaWVycm9yKDApOworICBjPXAtPmNvZGU7CisgIGlmKGM9PVNVQlBGUHx8Yz09QVNTSUdOfHxjPT1QVVNIfHxjPT1TRVRSRVRVUk4pIHJldHVybiAwOworICBpZihERUJVRyYxMDI0KSB7cHJpbnRmKCJmb2xkaW5nIElDOlxuIik7cHJpYzIoc3Rkb3V0LHApO30KKyAgaWYoYz09VEVTVHx8Yz09Q09NUEFSRSl7CisgICAgdW5pb24gYXR5cHMgdmFsO2ludCBjYzsgLyogIGNvbmRpdGlvbiBjb2RlcyAqLworICAgIElDICpicDsKKyAgICBpZihjPT1URVNUKXsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnExLnZhbCxwLT50eXBmKTsKKyAgICAgIGlmKHptZXF0byh2bWF4LGwyem0oMEwpKSYmenVtZXF0byh2dW1heCx1bDJ6dW0oMFVMKSkmJnpsZGVxdG8odmxkb3VibGUsZDJ6bGQoMC4wKSkpCisJY2M9MDsgCisgICAgICBlbHNlCisJY2M9MTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKHAtPnExLmZsYWdzJlZBUkFEUikKKwljYz1jb21wYXJlX2NvbnN0KCZwLT5xMS52YWwsJnAtPnEyLnZhbCxVTlNJR05FRHxNQVhJTlQpOworICAgICAgZWxzZQorCWNjPWNvbXBhcmVfY29uc3QoJnAtPnExLnZhbCwmcC0+cTIudmFsLHAtPnR5cGYpOworICAgIH0KKyAgICBicD1wLT5uZXh0OworICAgIGlmKGJwLT5jb2RlPj1CRVEmJmJwLT5jb2RlPD1CR1QmJighcC0+ei5mbGFnc3x8cC0+ei52PT1icC0+cTEudikpeworICAgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCIoY2M9JWQ7IGNvbXBhcmlzb24gZWxpbWluYXRlZClcbiIsY2MpOworICAgICAgaWYoaGF2ZV9hbGlhcyl7IGZyZWUocC0+dXNlX2xpc3QpO2ZyZWUocC0+Y2hhbmdlX2xpc3QpO30KKyAgICAgIHJlbW92ZV9JQyhwKTsKKyAgICAgIHdoaWxlKDEpeyAgIC8qICB6dWdlaG9lcmlnZW4gQnJhbmNoIHN1Y2hlbiAgKi8KKwlpZighYnB8fGJwLT5jb2RlPT1MQUJFTHx8YnAtPmNvZGU9PUJSQSkgaWVycm9yKDApOworCWM9YnAtPmNvZGU7CisJaWYoYz49QkVRJiZjPD1CR1QpIGJyZWFrOworCWJwPWJwLT5uZXh0OworICAgICAgfQorICAgICAgaWYoKGM9PUJFUSYmY2M9PTApfHwoYz09Qk5FJiZjYyE9MCl8fChjPT1CTFQmJmNjPDApfHwoYz09QkdUJiZjYz4wKXx8KGM9PUJMRSYmY2M8PTApfHwoYz09QkdFJiZjYz49MCkpeworCWlmKERFQlVHJjEwMjQpeyBwcmludGYoImNoYW5nZWQgZm9sbG93aW5nIGJyYW5jaCB0byBCUkE6XG4iKTtwcmljMihzdGRvdXQsYnApO30KKwlicC0+Y29kZT1CUkE7YnAtPnExLmZsYWdzPTA7CisgICAgICB9ZWxzZXsKKwlpZihERUJVRyYxMDI0KXsgcHJpbnRmKCJyZW1vdmVkIGZvbGxvd2luZyBicmFuY2g6XG4iKTtwcmljMihzdGRvdXQsYnApO30KKwlpZihoYXZlX2FsaWFzKXsgZnJlZShicC0+dXNlX2xpc3QpO2ZyZWUoYnAtPmNoYW5nZV9saXN0KTt9CisJcmVtb3ZlX0lDKGJwKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZihwLT56LmZsYWdzPT0wKXsKKyAgICAgIHAtPmNvZGU9Tk9QOworICAgICAgcC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworICAgICAgcmV0dXJuIDE7CisgICAgfWVsc2UKKyAgICAgIHJldHVybiAwOworICB9CisgIGlmKGM9PUNPTlZFUlQpeworICAgIGV2YWxfY29uc3QoJnAtPnExLnZhbCxwLT50eXBmMik7CisgICAgaW5zZXJ0X2NvbnN0KCZwLT5xMS52YWwscC0+dHlwZik7CisgIH1lbHNlCisgICAgY2FsYyhjLHAtPnR5cGYsJnAtPnExLnZhbCwmcC0+cTIudmFsLCZwLT5xMS52YWwscCk7CisgIHAtPnEyLmZsYWdzPTA7CisgIGlmKHAtPmNvZGU9PUFEREkyUHx8cC0+Y29kZT09U1VCSUZQKQorICAgIHAtPnR5cGY9cC0+dHlwZjI7CisgIHAtPnEyLnZhbC52bWF4PXNpemV0YWJbcC0+dHlwZiZOUV07CisgIHAtPmNvZGU9QVNTSUdOOworICBpZihERUJVRyYxMDI0KXtwcmludGYoImJlY29tZXNcbiIpO3ByaWMyKHN0ZG91dCxwKTt9CisgIHJldHVybiAxOworfQorCisvKiB0cmllcyB0byByZXBsYWNlIG9iamVjdHMgYnkgY29uc3RhbnRzIGFuZCBkZXRlY3RzIHNvbWUgdW5pbml0aWFsaXplZCAqLworLyogdmFyaWFibGVzOyBpZiBjcG9ubHk9PTAsIGFkZHJlc3MtY29uc3RhbnRzIHdpbGwgYmUgcmVwbGFjZWQsICovCisvKiBvdGhlcndpc2Ugb25seSByZWFsIGNvbnN0YW50cyBhcmUgcmVwbGFjZWQsIHNpYyBwb2ludHMgdG8gdGhlIElDICovCisvKiBjb250YWluaW5nIHRoZSBvYmplY3QgcG9pbnRlZCB0byBieSBvICovCitpbnQgcHJvcGFnYXRlKElDICpzaWMsb2JqICpvLGludCBjcG9ubHksaW50IGdsb2JhbCkKK3sKKyAgdW5zaWduZWQgaW50IGksaix0LGZvdW5kO3VuaW9uIGF0eXBzICp2YWw9MDsKKyAgVmFyICp2LCp2YWRkcj0wO0lDICpwOworICB6bWF4IHZvZmY7CisgIGlmKCFvfHwhby0+dikgaWVycm9yKDApOworICBpZihjcG9ubHkpeworICAgIGlmKGlzX3ZvbGF0aWxlX29iaihvKSkKKyAgICAgIHJldHVybiAwOworICB9ZWxzZXsKKyAgICBpZigoby0+ZmxhZ3MmVkFSKSYmKG8tPnYtPnZ0eXAtPmZsYWdzJlZPTEFUSUxFKSkKKyAgICAgIHJldHVybiAwOworICB9CisgIGlmKGRpc2FibGUmOCkgcmV0dXJuIDA7CisgIHY9by0+djsKKyAgaT12LT5pbmRleDsKKyAgLyogZG8gbm90IHJlcGxhY2UgaW4gSUNzIG9mIHRoZSBmb3JtIG1vdmUgY2hhciB3aXRoIHNpemUhPTEsCisgICAgIGJlY2F1c2UgdGhlc2UgYXJlIGJ1aWx0aW4gbWVtY3B5ICovCisgIGlmKGNwb25seSYmc2ljLT5jb2RlPT1BU1NJR04mJihzaWMtPnR5cGYmTlEpPT1DSEFSJiYhem1lcXRvKHNpYy0+cTIudmFsLnZtYXgsbDJ6bSgxTCkpKQorICAgIHJldHVybiAwOworICBpZihjcG9ubHkmJihvLT5mbGFncyZEUkVGT0JKKSkgaSs9dmNvdW50LXJjb3VudDsKKyAgaWYoREVCVUcmMjA0OCl7CisgICAgcHJpbnRmKCJwcm9wYWdhdGUoY3Bvbmx5PSVkKSA8JXM+KCVwKVxuIixjcG9ubHksby0+di0+aWRlbnRpZmllciwodm9pZCAqKXYpOworICAgIGlmKG8tPmZsYWdzJkRSRUZPQkopIHByaW50ZigiKERSRUZPQkopIik7CisgICAgcHJpbnRmKCJcbmFsbCByZWFjaGluZyBkZWZpbml0aW9uczpcbiIpO3ByaW50X3JkKHJkX2RlZnMpOworICAgIHByaW50ZigiZGVmcyBmb3IgdmFyOlxuIik7CisgICAgcHJpbnRfcmQodmFyX2RlZnNbaV0pOworICB9CisgIGlmKHYtPm5lc3Rpbmc9PTB8fHYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQ3x8di0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKKyAgICAvKiAgV2VubiBtb2VnbGljaCBiZWkgc3RhdGlzY2hlbiBWYXJpYWJsZW4gZGVuIFdlcnQgYmVpIGRlciAgICAgICAgICovCisgICAgLyogIEluaXRpYWxpc2llcnVuZyBlcm1pdHRlbG4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qaWYoY3Bvbmx5JiZJU0FSSVRIKHYtPnZ0eXAtPmZsYWdzKSYmKCh2LT52dHlwLT5mbGFncyZDT05TVCl8fCh2LT5uZXN0aW5nPjAmJiEodi0+ZmxhZ3MmKFVTRURBU0FEUnxVU0VEQVNERVNUKSkpKSl7Ki8KKyAgICBpZihjcG9ubHkmJmlzX2NvbnN0KHYtPnZ0eXApKXsKKyAgICAgIC8qICBWYXJpYWJsZSBoYXQgbm9jaCBkZW4gV2VydCBkZXIgSW5pdGlhbGlzaWVydW5nLiAgICAgICAgICovCisgICAgICBpZih2LT5jbGlzdCl7CisJaW50IHQ7CisJaWYobz09JnNpYy0+cTEpIHQ9cTF0eXAoc2ljKTsKKwllbHNlIGlmKG89PSZzaWMtPnEyKSB0PXEydHlwKHNpYyk7CisJZWxzZSBpZihvPT0mc2ljLT56KSB0PXp0eXAoc2ljKTsKKwllbHNlIGllcnJvcigwKTsKKwlpZihJU0FSSVRIKHYtPnZ0eXAtPmZsYWdzKSl7CisJICAvKiAgRGVyIFdlcnQgZGVyIEluaXRpYWxpc2llcnVuZyBpc3Qgbm9jaCBnZXNwZWljaGVydC4gICovCisJICBpZihERUJVRyYxMDI0KSBwcmludGYoInVzaW5nIHN0YXRpYyBpbml0aWFsaXplclxuIik7CisJICBvLT52YWw9di0+Y2xpc3QtPnZhbDsKKwkgIG8tPmZsYWdzPUtPTlNUOworCSAgcmV0dXJuIDE7CisJfWVsc2UgaWYoSVNJTlQodCZOUSkpeworCSAgaW50IHN0YXRlOworCSAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJ1c2luZyBzdGF0aWMgaW5pdGlhbGl6ZXIgKG5ldyB2ZXJzaW9uKVxuIik7CisJICBndmFsLnZ1bWF4PWdldF9jbGlzdF9pbnQodi0+dnR5cCx2LT5jbGlzdCxvLT52YWwudm1heCxzaXpldGFiW3QmTlFdLCZzdGF0ZSk7CisJICBpZihzdGF0ZSl7CisJICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigidXNpbmcgc3RhdGljIGluaXRpYWxpemVyIChuZXcgdmVyc2lvbilcbiIpOworCSAgICBldmFsX2NvbnN0KCZndmFsLFVOU0lHTkVEfE1BWElOVCk7CisJICAgIGluc2VydF9jb25zdCgmby0+dmFsLHQpOworCSAgICBvLT5mbGFncz1LT05TVDsKKwkgICAgcmV0dXJuIDE7CisJICB9CisJfQorICAgICAgfWVsc2V7CisJLyogIEhpZXIgZXZ0bC4gZWluZSBpbXBsaXppdGUgMCBlcmtlbm5lbi4gICAgICAgICAgICAgICAqLworICAgICAgfQorICAgIH0KKyAgfQorICBmb3VuZD0wOworICBmb3Ioaj0xO2o8PWRjb3VudDtqKyspeworICAgIGlmKCghQlRTVChyZF9kZWZzLFVOREVGKGopKXx8IUJUU1QodmFyX2RlZnNbaV0sVU5ERUYoaikpKSYmCisgICAgICAgKCFCVFNUKHJkX2RlZnMsail8fCFCVFNUKHZhcl9kZWZzW2ldLGopKSkgY29udGludWU7CisgICAgZm91bmQ9MTsKKyAgICBwPWRsaXN0W2pdOworICAgIGlmKCEocC0+ei5mbGFncyZWQVIpKSByZXR1cm4gMDsKKyAgICBpZihwLT56LnYhPW8tPnYpIGNvbnRpbnVlOworICAgIHQ9enR5cChwKSZOVTsKKyAgICBpZihjcG9ubHkmJiFJU1NDQUxBUih0KSkgY29udGludWU7CisgICAgaWYoIXptZXF0byhwLT56LnZhbC52bWF4LG8tPnZhbC52bWF4KSkgY29udGludWU7CisgICAgaWYoY3Bvbmx5KXsKKyAgICAgIGlmKHAtPnouZmxhZ3MhPW8tPmZsYWdzKSBjb250aW51ZTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKChwLT56LmZsYWdzfERSRUZPQkopIT1vLT5mbGFncykgY29udGludWU7CisgICAgICBpZihwLT56LmZsYWdzJkRSRUZPQkopIGNvbnRpbnVlOworICAgIH0KKyAgICBpZihCVFNUKHJkX2RlZnMsVU5ERUYoaikpJiZCVFNUKHZhcl9kZWZzW2ldLFVOREVGKGopKSkgcmV0dXJuIDA7CisgICAgaWYoQlRTVChyZF9kZWZzLFVOREVGKGopKSYmQlRTVCh2YXJfZGVmc1tpXSxqKSkgcmV0dXJuIDA7CisKKyAgICBpZigocC0+Y29kZSE9QVNTSUdOfHwoKHAtPnExLmZsYWdzJihLT05TVHxEUkVGT0JKKSkhPUtPTlNUJiYocC0+cTEuZmxhZ3MmKFZBUkFEUnxEUkVGT0JKKSkhPVZBUkFEUikpCisgICAgICAgJiYocC0+Y29kZSE9QUREUkVTU3x8IShvLT5mbGFncyZEUkVGT0JKKSkpIHJldHVybiAwOworICAgIGlmKHAtPnExLmZsYWdzJktPTlNUKXsKKyAgICAgIGlmKHZhZGRyKSByZXR1cm4gMDsKKyAgICAgIGlmKHZhbCl7CisJaWYoKHAtPnR5cGYmTlEpIT0odCZOUSkpIHJldHVybiAwOworCWlmKGNvbXBhcmVfY29uc3QoJnAtPnExLnZhbCx2YWwsdCkpIHJldHVybiAwOworICAgICAgfWVsc2V7CisJdmFsPSZwLT5xMS52YWw7dD1wLT50eXBmJk5VOworICAgICAgfQorICAgIH0KKyAgICBpZihwLT5jb2RlPT1BRERSRVNTfHwocC0+cTEuZmxhZ3MmVkFSQURSKSl7CisgICAgICBpZih2YWwpIHJldHVybiAwOworICAgICAgaWYodmFkZHIpeworCWlmKHAtPnExLnYhPXZhZGRyfHwhem1lcXRvKHAtPnExLnZhbC52bWF4LHZvZmYpKSByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIHZhZGRyPXAtPnExLnY7CisgICAgICB2b2ZmPXAtPnExLnZhbC52bWF4OworICAgIH0KKyAgfQorCisgIC8qIGZvdW5kIGNvbnN0YW50ICovCisgIGlmKHZhbCl7CisgICAgaWYoY3Bvbmx5KXsKKyAgICAgIGlmKG89PSZzaWMtPnExJiYocTF0eXAoc2ljKSZOUSkhPSh0Jk5RKSkgcmV0dXJuIDA7CisgICAgICBpZihvPT0mc2ljLT5xMiYmKHEydHlwKHNpYykmTlEpIT0odCZOUSkpIHJldHVybiAwOworICAgICAgaWYobz09JnNpYy0+eiYmKHp0eXAoc2ljKSZOUSkhPSh0Jk5RKSkgcmV0dXJuIDA7CisgICAgICAKKyAgICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiY2FuIHJlcGxhY2UgJWxkKzwlcz4oJXApIGJ5IGNvbnN0YW50XG4iLHptMmwoby0+dmFsLnZtYXgpLG8tPnYtPmlkZW50aWZpZXIsby0+dik7CisgICAgICAvKiBUT0RPOiBkbyB3ZSBuZWVkIGV2YWxfY29uc3QvaW5zZXJ0X2NvbnN0IChpZiByZXByZXNlbnRhdGlvbiBvZiB1bnNpZ25lZCBpcyBkaWZmZXJlbnQ/ICovCisgICAgICBvLT52YWw9KnZhbDsKKyAgICAgIG8tPmZsYWdzPUtPTlNUOworICAgIH1lbHNleworICAgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJjYW4gcmVwbGFjZSA8JXM+IGJ5IGNvbnN0YW50IGFkZHJlc3NcbiIsby0+di0+aWRlbnRpZmllcik7CisgICAgICBvLT52YWw9KnZhbDsKKyAgICAgIG8tPmZsYWdzfD1LT05TVDsKKyAgICAgIG8tPmZsYWdzJj1+VkFSOworICAgICAgby0+dj0wOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorICBpZih2YWRkciYmKHZhZGRyLT5zdG9yYWdlX2NsYXNzPT1FWFRFUk58fHZhZGRyLT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpKXsKKyAgICBpZihERUJVRyYxMDI0KSBwcmludGYoImNhbiByZXBsYWNlIDwlcz4gYnkgdmFyYWRyXG4iLG8tPnYtPmlkZW50aWZpZXIpOworICAgIG8tPnY9dmFkZHI7CisgICAgby0+dmFsLnZtYXg9dm9mZjsKKyAgICBpZigoby0+ZmxhZ3MmRFJFRk9CSikmJiFjcG9ubHkpCisgICAgICBvLT5mbGFncz1WQVI7CisgICAgZWxzZQorICAgICAgby0+ZmxhZ3M9VkFSfFZBUkFEUjsKKyAgICByZXR1cm4gMjsKKyAgfQorICBpZih2YWRkciYmKG8tPmZsYWdzJkRSRUZPQkopKXsKKyAgICB0PXZhZGRyLT52dHlwLT5mbGFncyZOVTsKKyAgICBpZihvPT0mc2ljLT5xMSYmKHExdHlwKHNpYykmTlUpIT10KSByZXR1cm4gMDsKKyAgICBpZihvPT0mc2ljLT5xMiYmKHEydHlwKHNpYykmTlUpIT10KSByZXR1cm4gMDsKKyAgICBpZihvPT0mc2ljLT56JiYoenR5cChzaWMpJk5VKSE9dCkgcmV0dXJuIDA7CisgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJjYW4gcmVwbGFjZSAqPCVzPiBieSBhZGRyZXNzXG4iLG8tPnYtPmlkZW50aWZpZXIpOworICAgIG8tPnY9dmFkZHI7CisgICAgby0+dmFsLnZtYXg9dm9mZjsKKyAgICBvLT5mbGFncyY9fkRSRUZPQko7CisgICAgcmV0dXJuIDI7CisgIH0KKyAgLyogbm8gZGVmaW5pdGlvbiBmb3VuZCAqLworICBpZighZm91bmQmJmdsb2JhbCYmdi0+c3RvcmFnZV9jbGFzcyE9RVhURVJOJiZ2LT5zdG9yYWdlX2NsYXNzIT1TVEFUSUMmJiEodi0+ZmxhZ3MmVVNFREJFRk9SRSkmJnYtPnJlZz09MCYmem1sZXEobDJ6bSgwTCksdi0+b2Zmc2V0KSl7CisgICAgaWYoKnYtPmlkZW50aWZpZXJ8fCEob3B0ZmxhZ3MmNDA5NikpeworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgICAgZXJyb3IoMTcxLHYtPmlkZW50aWZpZXIpO3YtPmZsYWdzfD1VU0VEQkVGT1JFOworICAgICAgaWYoISp2LT5pZGVudGlmaWVyKSB7cHJpbnRmKCI8JXA+XG4iLCh2b2lkICopdik7aWVycm9yKDApO30KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIHNlYXJjaGVzIGZvciBjb25zdGFudCBvYmplY3RzIGFuZCB1bmluaXRpYWxpemVkIHZhcmlhYmxlczsgaWYgICovCisvKiBnbG9iYWwhPTAsIHJlYWNoaW5nIGRlZmluaXRpb25zIGFyZSB1c2VkLCBvdGhlcndpc2Ugb25seSBsb2NhbCAqLworLyogY29uc3RhbnQgcHJvcGFnYXRpb24gd2lsbCBiZSBkb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK2ludCBjb25zdGFudF9wcm9wYWdhdGlvbihmbG93Z3JhcGggKmZnLGludCBnbG9iYWwpCit7CisgIElDICpwO2ludCBjaGFuZ2VkPTAsaSx0O2Zsb3dncmFwaCAqZzsKKyAgcmRfZGVmcz1teW1hbGxvYyhkc2l6ZSk7CisgIGc9Zmc7CisgIHdoaWxlKGcpeworICAgIGlmKGdsb2JhbCkKKyAgICAgIG1lbWNweShyZF9kZWZzLGctPnJkX2luLGRzaXplKTsKKyAgICBlbHNlCisgICAgICBtZW1zZXQocmRfZGVmcywwLGRzaXplKTsKKyAgICBwPWctPnN0YXJ0OworICAgIHdoaWxlKHApeworICAgICAgaW50IGM9cC0+Y29kZTsKKyAgICAgIC8qIGlmKERFQlVHJjEwMjQpe3ByaW50X3JkKHJkX2RlZnMpO3ByaWMyKHN0ZG91dCxwKTt9Ki8KKyAgICAgIGlmKGMhPUFERFJFU1MmJmMhPU5PUCYmSVNTQ0FMQVIocC0+dHlwZikmJihjPExBQkVMfHxjPkJSQSkpeworCWlmKChwLT5xMS5mbGFncyYoVkFSfFZBUkFEUikpPT1WQVIpeworCSAgaWYoIShxMXR5cChwKSZWT0xBVElMRSkmJiFpc192b2xhdGlsZV9vYmooJnAtPnExKSkKKwkgICAgY2hhbmdlZHw9cHJvcGFnYXRlKHAsJnAtPnExLDEsZ2xvYmFsKTsKKwkgIGlmKChwLT5xMS5mbGFncyZEUkVGT0JKKSYmIShwLT5xMS52LT52dHlwLT5mbGFncyZWT0xBVElMRSkpCisJICAgIGNoYW5nZWR8PXByb3BhZ2F0ZShwLCZwLT5xMSwwLGdsb2JhbCk7CisJfQorCWlmKChwLT5xMi5mbGFncyYoVkFSfFZBUkFEUikpPT1WQVIpeworCSAgaWYoIShxMnR5cChwKSZWT0xBVElMRSkmJiFpc192b2xhdGlsZV9vYmooJnAtPnEyKSkKKwkgICAgY2hhbmdlZHw9cHJvcGFnYXRlKHAsJnAtPnEyLDEsZ2xvYmFsKTsKKwkgIGlmKChwLT5xMi5mbGFncyZEUkVGT0JKKSYmIShwLT5xMi52LT52dHlwLT5mbGFncyZWT0xBVElMRSkpCisJICAgIGNoYW5nZWR8PXByb3BhZ2F0ZShwLCZwLT5xMiwwLGdsb2JhbCk7CisJfQorICAgICAgfQorICAgICAgLyogb25seSB0aGVyZSB0byBkZXRlY3QgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgKi8KKyAgICAgIGlmKCgocC0+ei5mbGFncyYoVkFSfERSRUZPQkopKT09KFZBUnxEUkVGT0JKKSkpeworCWlmKCEocC0+ei52LT52dHlwLT5mbGFncyZWT0xBVElMRSkpCisJICBjaGFuZ2VkfD1wcm9wYWdhdGUocCwmcC0+eiwwLGdsb2JhbCk7CisgICAgICB9CisgICAgICByZF9jaGFuZ2UocCk7CisgICAgICAKKyAgICAgIGlmKHA9PWctPmVuZCkgYnJlYWs7CisgICAgICBwPXAtPm5leHQ7CisgICAgfQorICAgIGJyZWFrOworICAgIGc9Zy0+bm9ybWFsb3V0OworICB9CisgIAorICBnY2hhbmdlZHw9Y2hhbmdlZDsKKyAgCisgIGZyZWUocmRfZGVmcyk7CisgIHJldHVybiBjaGFuZ2VkOworfQorCisvKiBwZXJmb3JtcyBjaGFuZ2VzIHRvIHJkX2RlZnMgd2hpY2ggYXJlIGNhdXNlZCBieSBJQyBwICovCit2b2lkIHJkX2NoYW5nZShJQyAqcCkKK3sKKyAgaWYoREVCVUcmNDA5NikgcHJpbnRfcmQocmRfZGVmcyk7CisgIGlmKHAtPmRlZmluZGV4KXsKKyAgICBidmRpZmYocmRfZGVmcyxkZWZzX2tpbGxbcC0+ZGVmaW5kZXhdLGRzaXplKTsKKyAgICBidnVuaXRlKHJkX2RlZnMsZGVmc19nZW5bcC0+ZGVmaW5kZXhdLGRzaXplKTsKKyAgfQorICBpZihERUJVRyY0MDk2KSBwcmljMihzdGRvdXQscCk7Cit9CisKZGlmZiAtLWdpdCBhL3JkX3RzdC5jIGIvcmRfdHN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0ZGU0ZgotLS0gL2Rldi9udWxsCisrKyBiL3JkX3RzdC5jCkBAIC0wLDAgKzEsNjQ3IEBACisvKiAgJFZFUjogdmJjYyAocmQuYykgJFJldmlzaW9uOiAxLjE2ICQgICAgKi8KKy8qICByZWFjaGluZyBkZWZpbml0aW9ucyBhbmQgY29uc3RhbnQgcHJvcGFnYXRpb24gICAqLworCisjaW5jbHVkZSAib3B0LmgiCisKK3N0YXRpYyBjaGFyIEZJTEVfW109X19GSUxFX187CisKK3Vuc2lnbmVkIGludCBkY291bnQ7CitzaXplX3QgZHNpemU7CitJQyAqKmRsaXN0OworYnZ0eXBlICpyZF9kZWZzOworYnZ0eXBlICoqZGVmc19raWxsOyAgICAvKiBkZWZpbml0aW9ucyBraWxsZWQgKi8KK2J2dHlwZSAqKmRlZnNfZ2VuOyAgICAgLyogZGVmaW5pdGlvbnMgdW5kZWZpbmVkICovCitidnR5cGUgKip2YXJfZGVmczsgICAgIC8qIGRlZmluaXRpb25zIG9mIGEgdmFyaWFibGUgKi8KK2J2dHlwZSAqKnZhcl91bmRlZnM7ICAgLyogZGVmaW5pdGlvbnMgd2hpY2ggYXJlIHVuZGVmaW5lZCBieSB3cml0aW5nIHRvIHRoaXMgdmFyICovCitidnR5cGUgKnJkX21hdHJpeDsKKworaW50IGRlZl9vdmVyd3JpdGVzKElDICpuZXcsSUMgKm9sZCk7CisjZGVmaW5lIE5PX09WRVJXUklURSAwCisjZGVmaW5lIEZVTExfT1ZFUldSSVRFIDEKKyNkZWZpbmUgUEFSVElBTF9PVkVSV1JJVEUgMgorI2RlZmluZSBFWEFDVF9PVkVSV1JJVEUgMworCisvKiAgY29tcGFyZXMgdHdvIGNvbnN0YW50czsgLTEsIGlmIHExPHEyOyAwLCBpZiBxMT09cTE7IDEgb3RoZXJ3aXNlICAqLworaW50IGNvbXBhcmVfY29uc3QodW5pb24gYXR5cHMgKnExLHVuaW9uIGF0eXBzICpxMixpbnQgdCkKK3sKKyAgemxkb3VibGUgZDEsZDI7em1heCBsMSxsMjt6dW1heCB1MSx1MjsKKyAgdCY9TlU7CisgIGV2YWxfY29uc3QocTEsdCk7ZDE9dmxkb3VibGU7bDE9dm1heDt1MT12dW1heDsKKyAgZXZhbF9jb25zdChxMix0KTtkMj12bGRvdWJsZTtsMj12bWF4O3UyPXZ1bWF4OworICBpZihJU0ZMT0FUKHQpKSByZXR1cm4oemxkbGVxKGQyLGQxKT8hemxkZXF0byhkMSxkMik6LTEpOworICBpZihJU1BPSU5URVIodCl8fCh0JlVOU0lHTkVEKSkgcmV0dXJuKHp1bWxlcSh1Mix1MSk/IXp1bWVxdG8odTEsdTIpOi0xKTsKKyAgcmV0dXJuKHptbGVxKGwyLGwxKT8hem1lcXRvKGwxLGwyKTotMSk7Cit9CisKKy8qIHByaW50cyBkZWZpbml0aW9ucyBpbiBhIGJpdHZlY3RvciAqLwordm9pZCBwcmludF9yZChidnR5cGUgKmJpdHZlY3RvcikKK3sKKyAgdW5zaWduZWQgaW50IGk7CisgIGlmKCFiaXR2ZWN0b3IpIHtwcmludGYoInJlYWNoaW5nIGRlZmluaXRpb25zIG5vdCBhdmFpbGFibGVcbiIpO3JldHVybjt9CisgIGZvcihpPTE7aTw9ZGNvdW50O2krKyl7CisgICAgaWYoQlRTVChiaXR2ZWN0b3IsaSkpIHtwcmludGYoIiUzdToiLGkpO3ByaWMyKHN0ZG91dCxkbGlzdFtpXSk7fQorICAgIGlmKEJUU1QoYml0dmVjdG9yLFVOREVGKGkpKSkge3ByaW50ZigiJTN1KHVkKToiLGkpO3ByaWMyKHN0ZG91dCxkbGlzdFtpXSk7fQorICB9Cit9CisKKy8qIG51bWJlcnMgYWxsIGRlZmluaXRpb25zIGFuZCBjcmVhdGVzIHNvbWUgYml0dmVjdG9ycyAqLwordm9pZCBudW1fZGVmcyh2b2lkKQoreworICBpbnQgaSxqO0lDICpwOworICBzaXplX3QgbWF0cml4X3NpemU7CisgIGJ2dHlwZSAqYnA7CisgIHVuc2lnbmVkIGxvbmcgaGVhcHNpemU9MDsKKyAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJudW1lcmF0aW5nIGRlZmluaXRpb25zXG4iKTsKKyAgaT0wOworICBmb3IocD1maXJzdF9pYztwO3A9cC0+bmV4dCl7CisgICAgaWYoIShwLT56LmZsYWdzJihWQVJ8RFJFRk9CSikpJiZwLT5jb2RlIT1DQUxMKXtwLT5kZWZpbmRleD0wO2NvbnRpbnVlO30KKyAgICBwLT5kZWZpbmRleD0rK2k7CisgIH0KKyAgZGNvdW50PWk7CisgIC8qZHNpemU9KDIqZGNvdW50KzErQ0hBUl9CSVQpL0NIQVJfQklUOyAgICAvKiArMSwgZGEgYmVpIDEgYW5mYWVuZ3QgKi8KKyAgZHNpemU9QlZTSVpFKDIqKGRjb3VudCsxKSk7CisgIGlmKERFQlVHJigxNjM4NHwxMDI0KSkgcHJpbnRmKCIlbHUgZGVmaW5pdGlvbnMsIGRzaXplPSVsdVxuIiwodW5zaWduZWQgbG9uZylkY291bnQsKHVuc2lnbmVkIGxvbmcpZHNpemUpOworICAKKyAgLyogZ2V0IGJpZyBtZW1vcnkgYmxvY2sgdG8gc3RvcmUgZGVmc19raWxsLCBkZWZzX2dlbiwgdmFycywgdmFyX2RlZnMgYW5kIHZhcl91bmRlZnMgKi8KKyAgbWF0cml4X3NpemU9KDIqKGRjb3VudCt2Y291bnQpKmRzaXplKTsKKyAgcmRfbWF0cml4PWJwPW15bWFsbG9jKG1hdHJpeF9zaXplKTsKKyAgbWVtc2V0KGJwLDAsbWF0cml4X3NpemUpOworICBoZWFwc2l6ZSs9bWF0cml4X3NpemU7CisKKyAgLyogY2FsY3VsYXRlIGJpdC12ZWN0b3Igd2hpY2ggY29udGFpbnMgYWxsIGRlZmluaXRpb25zIGtpbGxlZCBvciAqLworICAvKiB1bmRlZmluZWQgKD1wYXJ0aWFsbHkgb3ZlcndyaXR0ZW4pIGJ5IHRoaXMgZGVmaW5pdGlvbiAgICAgICAgICovCisgIGRlZnNfa2lsbD1teW1hbGxvYyhzaXplb2YoKmRlZnNfa2lsbCkqKGRjb3VudCsxKSk7CisgIGRlZnNfZ2VuPW15bWFsbG9jKHNpemVvZigqZGVmc19nZW4pKihkY291bnQrMSkpOworICBoZWFwc2l6ZSs9MipzaXplb2YoKmRlZnNfa2lsbCkqKGRjb3VudCsxKTsKKworICBmb3IoaT0xO2k8PWRjb3VudDtpKyspeworICAgIGRlZnNfa2lsbFtpXT1icDsKKyAgICBicCs9ZHNpemUvc2l6ZW9mKGJ2dHlwZSk7CisgICAgZGVmc19nZW5baV09YnA7CisgICAgYnArPWRzaXplL3NpemVvZihidnR5cGUpOworICB9CisgIAorICAvKiBjYWxjdWxhdGUgYml0IHZlY3RvciB3aXRoIGFsbCB1bmRlZmluZWQgZGVmaW5pdGlvbnMgb2YgZWFjaCB2YXJpYWJsZSAqLworICB2YXJfZGVmcz1teW1hbGxvYyhzaXplb2YoKnZhcl9kZWZzKSp2Y291bnQpOworICBoZWFwc2l6ZSs9c2l6ZW9mKCp2YXJfZGVmcykqdmNvdW50OworICB2YXJfdW5kZWZzPW15bWFsbG9jKHNpemVvZigqdmFyX3VuZGVmcykqdmNvdW50KTsKKyAgaGVhcHNpemUrPXNpemVvZigqdmFyX3VuZGVmcykqdmNvdW50OworICBmb3IoaT0wO2k8dmNvdW50O2krKyl7CisgICAgdmFyX2RlZnNbaV09YnA7CisgICAgYnArPWRzaXplL3NpemVvZihidnR5cGUpOworICAgIHZhcl91bmRlZnNbaV09YnA7CisgICAgYnArPWRzaXplL3NpemVvZihidnR5cGUpOworICB9CisgIAorICAvKiBjYWxjdWxhdGUgcG9pbnRlcnMgdG8gSUMgZm9yIGV2ZXJ5IGRlZmluaXRpb24gKi8KKyAgZGxpc3Q9bXltYWxsb2MoKGRjb3VudCsxKSpzaXplb2YoKmRsaXN0KSk7CisgIGhlYXBzaXplKz0oZGNvdW50KzEpKnNpemVvZigqZGxpc3QpOworCisgIGZvcihwPWZpcnN0X2ljO3A7cD1wLT5uZXh0KXsKKyAgICBpZihwLT5kZWZpbmRleCl7CisgICAgICBkbGlzdFtwLT5kZWZpbmRleF09cDsKKyAgICAgIGlmKHAtPnouZmxhZ3MmVkFSKXsKKyAgICAgICAgVmFyICp2PXAtPnoudjsKKyAgICAgICAgaT12LT5pbmRleDsKKyAgICAgICAgaWYocC0+ei5mbGFncyZEUkVGT0JKKSBpKz12Y291bnQtcmNvdW50OworICAgICAgICBCU0VUKHZhcl9kZWZzW2ldLHAtPmRlZmluZGV4KTsKKwlCU0VUKHZhcl9kZWZzW2ldLFVOREVGKHAtPmRlZmluZGV4KSk7CisJaWYoaTxyY291bnQpeworCSAgQlNFVCh2YXJfZGVmc1tpK3Zjb3VudC1yY291bnRdLHAtPmRlZmluZGV4KTsKKwkgIEJTRVQodmFyX2RlZnNbaSt2Y291bnQtcmNvdW50XSxVTkRFRihwLT5kZWZpbmRleCkpOworCX0KKyAgICAgICAgQlNFVCh2YXJfdW5kZWZzW2ldLFVOREVGKHAtPmRlZmluZGV4KSk7CisgICAgICB9CisgICAgfQorICB9CisgIAorICBmb3IoaT0xO2k8PWRjb3VudDtpKyspeworICAgIHA9ZGxpc3RbaV07CisgICAgZm9yKGo9MDtqPHAtPmNoYW5nZV9jbnQ7aisrKXsKKyAgICAgIGludCBpZHg7CisgICAgICBpZHg9cC0+Y2hhbmdlX2xpc3Rbal0udi0+aW5kZXg7CisgICAgICBpZihwLT5jaGFuZ2VfbGlzdFtqXS5mbGFncyZEUkVGT0JKKSBpZHgrPXZjb3VudC1yY291bnQ7CisgICAgICBpZihpZHg+PXZjb3VudCkgY29udGludWU7CQorICAgICAgQlNFVCh2YXJfZGVmc1tpZHhdLGkpOworICAgICAgYnZ1bml0ZShkZWZzX2dlbltpXSx2YXJfdW5kZWZzW2lkeF0sZHNpemUpOworICAgIH0KKyAgICBpZihwLT56LmZsYWdzJlZBUil7CisgICAgICBmb3Ioaj0xO2o8PWRjb3VudDtqKyspeworCWludCBvdzsKKwlJQyAqcDI7CisJaWYoaT09aikgY29udGludWU7CisJcDI9ZGxpc3Rbal07CisJaWYoIShwMi0+ei5mbGFncyZWQVIpfHxwLT56LnYhPXAyLT56LnZ8fHAtPnouZmxhZ3MhPXAyLT56LmZsYWdzKQorCSAgY29udGludWU7CisJb3c9ZGVmX292ZXJ3cml0ZXMocCxwMik7CisJaWYob3c9PUZVTExfT1ZFUldSSVRFfHxvdz09RVhBQ1RfT1ZFUldSSVRFKXsKKwkgIEJTRVQoZGVmc19raWxsW2ldLGopOworCSAgQlNFVChkZWZzX2tpbGxbaV0sVU5ERUYoaikpOworCX0KKwlpZihvdz09RVhBQ1RfT1ZFUldSSVRFfHxvdz09Tk9fT1ZFUldSSVRFKXsKKwkgIEJDTFIoZGVmc19nZW5baV0saik7CisJICBCQ0xSKGRlZnNfZ2VuW2ldLFVOREVGKGopKTsKKwl9CisgICAgICB9CisgICAgfQorICAgIC8qIGV2ZXJ5IGRlZmluaXRpb24gZGVmaW5lcyBpdHNlbGYpICovCisgICAgQlNFVChkZWZzX2dlbltpXSxpKTsKKyAgICBCQ0xSKGRlZnNfZ2VuW2ldLFVOREVGKGkpKTsKKyAgICBCU0VUKGRlZnNfa2lsbFtpXSxVTkRFRihpKSk7CisgIH0KKyAgCisgIGlmKERFQlVHJjIwNDgpeworICAgIGZvcihpPTA7aTx2Y291bnQ7aSsrKXsKKyAgICAgIHByaW50ZigidmFyX2RlZnMgZm9yIHZhciAlaSAlcyglcCk6XG4iLGksdmlsaXN0W2ldLT5pZGVudGlmaWVyLHZpbGlzdFtpXSk7CisgICAgICBwcmludF9yZCh2YXJfZGVmc1tpXSk7CisgICAgfQorCQorICAgIGZvcihpPTE7aTw9ZGNvdW50O2krKyl7CisgICAgICBwcmludGYoIkRlZiUzZDogIixpKTtwcmljMihzdGRvdXQsZGxpc3RbaV0pOworICAgICAgcHJpbnRmKCIga2lsbHM6XG4iKTsKKyAgICAgIGZvcihqPTE7ajw9ZGNvdW50O2orKyl7CisJaWYoQlRTVChkZWZzX2tpbGxbaV0saikpIHtwcmludGYoIiAgIik7cHJpYzIoc3Rkb3V0LGRsaXN0W2pdKTt9CisJaWYoQlRTVChkZWZzX2tpbGxbaV0sVU5ERUYoaikpKSB7cHJpbnRmKCIgICh1ZCkiKTtwcmljMihzdGRvdXQsZGxpc3Rbal0pO30KKyAgICAgIH0KKyAgICAgIHByaW50ZigiIGdlbnM6XG4iKTsKKyAgICAgIGZvcihqPTE7ajw9ZGNvdW50O2orKyl7CisJaWYoQlRTVChkZWZzX2dlbltpXSxqKSkge3ByaW50ZigiICAiKTtwcmljMihzdGRvdXQsZGxpc3Rbal0pO30KKwlpZihCVFNUKGRlZnNfZ2VuW2ldLFVOREVGKGopKSkge3ByaW50ZigiICAodWQpIik7cHJpYzIoc3Rkb3V0LGRsaXN0W2pdKTt9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYoREVCVUcmMTYzODQpIHByaW50ZigibnVtX2RlZnMgaGVhcHNpemU9JWx1XG4iLGhlYXBzaXplKTsKKworICBmcmVlKHZhcl91bmRlZnMpOworfQorCisvKiByZXR1cm5zIHdoZXRoZXIgbiBvdmVyd3JpdGVzIHRoZSBkZWZpbml0aW9uIHAgKi8KK2ludCBkZWZfb3ZlcndyaXRlcyhJQyAqbixJQyAqbykKK3sKKyAgem1heCBuc3RhcnQsbmVuZCxvc3RhcnQsb2VuZCxuc2l6ZSxvc2l6ZTsKKyAgaWYoIShuLT56LmZsYWdzJlZBUikpIGllcnJvcigwKTsKKyAgaWYoIShvLT56LmZsYWdzJlZBUikpIGllcnJvcigwKTsKKyAgaWYoKG4tPnouZmxhZ3MmRFJFRk9CSikhPShvLT56LmZsYWdzJkRSRUZPQkopKSBpZXJyb3IoMCk7CisgIGlmKG4tPmNvZGU9PUFTU0lHTil7CisgICAgbnNpemU9bi0+cTIudmFsLnZtYXg7CisgIH1lbHNleworICAgIG5zaXplPXNpemV0YWJbenR5cChuKSZOUV07CisgIH0KKyAgaWYoby0+Y29kZT09QVNTSUdOKXsKKyAgICBvc2l6ZT1vLT5xMi52YWwudm1heDsKKyAgfWVsc2V7CisgICAgb3NpemU9c2l6ZXRhYlt6dHlwKG8pJk5RXTsKKyAgfQorICBpZihuLT56LmZsYWdzJkRSRUZPQkopCisgICAgcmV0dXJuIHptbGVxKG9zaXplLG5zaXplKTsKKworICBuc3RhcnQ9bi0+ei52YWwudm1heDsKKyAgbmVuZD16bXN1Yih6bWFkZChuc3RhcnQsbnNpemUpLGwyem0oMUwpKTsKKyAgb3N0YXJ0PW8tPnoudmFsLnZtYXg7CisgIG9lbmQ9em1zdWIoem1hZGQob3N0YXJ0LG9zaXplKSxsMnptKDFMKSk7CisKKyAgaWYoem1lcXRvKG5zdGFydCxvc3RhcnQpJiZ6bWVxdG8obmVuZCxvZW5kKSkKKyAgICByZXR1cm4gRVhBQ1RfT1ZFUldSSVRFOworCisgIGlmKHptbGVxKG5zdGFydCxvc3RhcnQpJiZ6bWxlcShvZW5kLG5lbmQpKQorICAgIHJldHVybiBGVUxMX09WRVJXUklURTsKKworICBpZih6bWxlcShvc3RhcnQsbnN0YXJ0KSYmem1sZXEobnN0YXJ0LG9lbmQpKQorICAgIHJldHVybiBQQVJUSUFMX09WRVJXUklURTsKKyAgaWYoem1sZXEob3N0YXJ0LG5lbmQpJiZ6bWxlcShuZW5kLG9lbmQpKQorICAgIHJldHVybiBQQVJUSUFMX09WRVJXUklURTsKKworICByZXR1cm4gTk9fT1ZFUldSSVRFOworfQorCisvKiBwZXJmb3JtcyBkYXRhIGZsb3cgYW5hbHlzaXMgZm9yIHJlYWNoaW5nIGRlZmluaXRpb25zICovCit2b2lkIHJlYWNoaW5nX2RlZmluaXRpb25zKGZsb3dncmFwaCAqZmcpCit7CisgIGZsb3dncmFwaCAqZztJQyAqcDtidnR5cGUgKnRtcCwqaW5pdDsKKyAgaW50IGNoYW5nZWQscGFzcyxpLGo7CisgIHVuc2lnbmVkIGxvbmcgaGVhcHNpemU9MDsKKyAgLyogIHJkX2dlbiB1bmQgcmRfa2lsbCBmdWVyIGplZGVuIEJsb2NrIGJlcmVjaG5lbiAgICovCisgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiYW5hbHlzaW5nIHJlYWNoaW5nIGRlZmluaXRpb25zXG4iKTsKKyAgdG1wPW15bWFsbG9jKGRzaXplKTsKKyAgaW5pdD1teW1hbGxvYyhkc2l6ZSk7CisgIGhlYXBzaXplKz0yKmRzaXplOworICBtZW1zZXQoaW5pdCwwLGRzaXplKTsKKyAgZm9yKGk9MTtpPD1kY291bnQ7aSsrKXsKKyAgICBwPWRsaXN0W2ldOworICAgIGlmKHAtPnouZmxhZ3MmVkFSKXsKKyAgICAgIFZhciAqdj1wLT56LnY7CisgICAgICBpZih2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk58fHYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQ3x8di0+cmVnIT0wfHwhem1sZXEobDJ6bSgwTCksdi0+b2Zmc2V0KSl7CisJQlNFVChpbml0LFVOREVGKGkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZz1mZzsKKyAgd2hpbGUoZyl7CisgICAgZy0+cmRfaW49bXltYWxsb2MoZHNpemUpOworICAgIG1lbXNldChnLT5yZF9pbiwwLGRzaXplKTsKKyAgICBnLT5yZF9vdXQ9bXltYWxsb2MoZHNpemUpOworICAgIG1lbXNldChnLT5yZF9vdXQsMCxkc2l6ZSk7CisgICAgZy0+cmRfZ2VuPW15bWFsbG9jKGRzaXplKTsKKyAgICBtZW1zZXQoZy0+cmRfZ2VuLDAsZHNpemUpOworICAgIGctPnJkX2tpbGw9bXltYWxsb2MoZHNpemUpOworICAgIG1lbXNldChnLT5yZF9raWxsLDAsZHNpemUpOworICAgIGhlYXBzaXplKz00KmRzaXplOworICAgIHA9Zy0+ZW5kOworICAgIHdoaWxlKHApeworICAgICAgaWYocC0+ZGVmaW5kZXgpeworCWJ2dW5pdGUoZy0+cmRfZ2VuLGRlZnNfZ2VuW3AtPmRlZmluZGV4XSxkc2l6ZSk7CisJYnZkaWZmKGctPnJkX2dlbixnLT5yZF9raWxsLGRzaXplKTsKKwlidnVuaXRlKGctPnJkX2tpbGwsZGVmc19raWxsW3AtPmRlZmluZGV4XSxkc2l6ZSk7CisJYnZkaWZmKGctPnJkX2tpbGwsZy0+cmRfZ2VuLGRzaXplKTsKKyAgICAgIH0KKyAgICAgIGlmKHA9PWctPnN0YXJ0KSBicmVhazsKKyAgICAgIHA9cC0+cHJldjsKKyAgICB9CisgICAgbWVtY3B5KGctPnJkX291dCxnLT5yZF9nZW4sZHNpemUpOworICAgIGc9Zy0+bm9ybWFsb3V0OworICB9CisKKyAgLyogIHJkX2luIHVuZCByZF9vdXQgZnVlciBqZWRlbiBCbG9jayBiZXJlY2huZW4gKi8KKyAgLyogIG91dChiKT1nZW4oQikgdm9yaW5pdGlhbGlzaWVydCAgICAgICAgICAgICAgKi8KKyAgaWYoREVCVUcmMTAyNCkge3ByaW50ZigicGFzczoiKTtwYXNzPTA7fQorICBkb3sKKyAgICBpZihERUJVRyYxMDI0KSB7cHJpbnRmKCIgJWQiLCsrcGFzcyk7ZmZsdXNoKHN0ZG91dCk7fQorICAgIGNoYW5nZWQ9MDsKKyAgICBnPWZnOworICAgIHdoaWxlKGcpeworICAgICAgZmxvd2xpc3QgKmxwOworICAgICAgLyogIGluKEIpPVUgb3V0KEMpIDogQyBWb3JnYWVuZ2VyIHZvbiBCICovCisgICAgICBpZihnPT1mZykKKwltZW1jcHkoZy0+cmRfaW4saW5pdCxkc2l6ZSk7CisgICAgICBlbHNlCisJbWVtc2V0KGctPnJkX2luLDAsZHNpemUpOworICAgICAgbHA9Zy0+aW47CisgICAgICB3aGlsZShscCl7CisJaWYoIWxwLT5ncmFwaCkgaWVycm9yKDApOworCWlmKGxwLT5ncmFwaC0+YnJhbmNob3V0PT1nfHwhbHAtPmdyYXBoLT5lbmR8fGxwLT5ncmFwaC0+ZW5kLT5jb2RlIT1CUkEpCisJICBidnVuaXRlKGctPnJkX2luLGxwLT5ncmFwaC0+cmRfb3V0LGRzaXplKTsKKwlscD1scC0+bmV4dDsKKyAgICAgIH0KKyAgICAgIC8qICBvdXQoYik9Z2VuKEIpIFUgKGluKEIpLWtpbGwoQikgICovCisgICAgICBtZW1jcHkodG1wLGctPnJkX2luLGRzaXplKTsKKyAgICAgIGJ2ZGlmZih0bXAsZy0+cmRfa2lsbCxkc2l6ZSk7CisgICAgICBidnVuaXRlKHRtcCxnLT5yZF9nZW4sZHNpemUpOworICAgICAgaWYoIWJ2Y21wKHRtcCxnLT5yZF9vdXQsZHNpemUpKXtjaGFuZ2VkPTE7bWVtY3B5KGctPnJkX291dCx0bXAsZHNpemUpO30KKyAgICAgIGc9Zy0+bm9ybWFsb3V0OworICAgIH0KKyAgfXdoaWxlKGNoYW5nZWQpOworICBpZihERUJVRyYxMDI0KSBwcmludGYoIlxuIik7CisgIGlmKERFQlVHJjE2Mzg0KSBwcmludGYoInJlYWNoaW5nX2RlZnMgaGVhcHNpemU9JWx1XG4iLGhlYXBzaXplKTsKKyAgZnJlZSh0bXApOworICBmcmVlKGluaXQpOworfQorCisvKiBjYWxjdWxhdGVzIHo6PXExIG9wIHEyIHdpdGggY29uc3RhbnRzICovCisvKiBpZiBwIGlzIG5vbi16ZXJvIHExdHlwLHEydHlwIGZyb20gcCB3aWxsIGJlIHVzZWQgKi8KK3ZvaWQgY2FsYyhpbnQgYyxpbnQgdCx1bmlvbiBhdHlwcyAqcTEsdW5pb24gYXR5cHMgKnEyLHVuaW9uIGF0eXBzICp6LElDICpwKQoreworICB6bGRvdWJsZSBkMSxkMjt6bWF4IGwxLGwyO3p1bWF4IHUxLHUyOworICBpZihwKSB0PXExdHlwKHApOworICBldmFsX2NvbnN0KHExLHQpOworICBkMT12bGRvdWJsZTtsMT12bWF4O3UxPXZ1bWF4OworICBpZihjIT1NSU5VUyYmYyE9S09NUExFTUVOVCl7CisgICAgaWYocCkKKyAgICAgIGV2YWxfY29uc3QocTIscTJ0eXAocCkpOworICAgIGVsc2UKKyAgICAgIGV2YWxfY29uc3QocTIsdCk7CisgICAgZDI9dmxkb3VibGU7bDI9dm1heDt1Mj12dW1heDsKKyAgfQorICBpZihjPT1BREQpeyB2bGRvdWJsZT16bGRhZGQoZDEsZDIpO3ZtYXg9em1hZGQobDEsbDIpO3Z1bWF4PXp1bWFkZCh1MSx1Mik7fQorICBpZihjPT1TVUIpeyB2bGRvdWJsZT16bGRzdWIoZDEsZDIpO3ZtYXg9em1zdWIobDEsbDIpO3Z1bWF4PXp1bXN1Yih1MSx1Mik7fQorICBpZihjPT1BRERJMlApeyB2bWF4PXptYWRkKGwxLGwyKTt2dW1heD16dW1hZGQodTEsdTIpO30KKyAgaWYoYz09U1VCSUZQKXsgdm1heD16bXN1YihsMSxsMik7dnVtYXg9enVtc3ViKHUxLHUyKTt9CisgIGlmKGM9PU1VTFQpeyB2bGRvdWJsZT16bGRtdWx0KGQxLGQyKTt2bWF4PXptbXVsdChsMSxsMik7dnVtYXg9enVtbXVsdCh1MSx1Mik7fQorICBpZihjPT1ESVZ8fGM9PU1PRCl7CisgICAgaWYoemxkZXF0byhkMixkMnpsZCgwLjApKSYmem1lcXRvKGwyLGwyem0oMEwpKSYmenVtZXF0byh1Mix1bDJ6dW0oMFVMKSkpeworICAgICAgZXJyX2ljPXA7ZXJyb3IoMjEwKTtlcnJfaWM9MDsKKyAgICAgIHZtYXg9bDJ6bSgwTCk7dnVtYXg9dWwyenVtKDBMKTt2bGRvdWJsZT1kMnpsZCgwLjApOworICAgIH1lbHNleworICAgICAgaWYoYz09RElWKXsKKwl2bGRvdWJsZT16bGRkaXYoZDEsZDIpOworCWlmKCF6bWVxdG8obDIsbDJ6bSgwTCkpKSB2bWF4PXptZGl2KGwxLGwyKTsKKwlpZighenVtZXF0byh1Mix1bDJ6dW0oMFVMKSkpIHZ1bWF4PXp1bWRpdih1MSx1Mik7CisgICAgICB9ZWxzZXsKKwlpZighem1lcXRvKGwyLGwyem0oMEwpKSkgdm1heD16bW1vZChsMSxsMik7CisJaWYoIXp1bWVxdG8odTIsdWwyenVtKDBVTCkpKSB2dW1heD16dW1tb2QodTEsdTIpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihjPT1BTkQpeyB2bWF4PXptYW5kKGwxLGwyKTt2dW1heD16dW1hbmQodTEsdTIpO30KKyAgaWYoYz09T1IpeyB2bWF4PXptb3IobDEsbDIpO3Z1bWF4PXp1bW9yKHUxLHUyKTt9CisgIGlmKGM9PVhPUil7IHZtYXg9em14b3IobDEsbDIpO3Z1bWF4PXp1bXhvcih1MSx1Mik7fQorICBpZihjPT1MU0hJRlQpeyB2bWF4PXptbHNoaWZ0KGwxLGwyKTt2dW1heD16dW1sc2hpZnQodTEsbDIpO30KKyAgaWYoYz09UlNISUZUKXsgdm1heD16bXJzaGlmdChsMSxsMik7dnVtYXg9enVtcnNoaWZ0KHUxLGwyKTt9CisgIGlmKGM9PU1JTlVTKXsgdmxkb3VibGU9emxkc3ViKGQyemxkKDAuMCksZDEpO3ZtYXg9em1zdWIobDJ6bSgwTCksbDEpO3Z1bWF4PXp1bXN1Yih1bDJ6dW0oMFVMKSx1MSk7fQorICBpZihjPT1LT01QTEVNRU5UKXsgdm1heD16bWtvbXBsKGwxKTt2dW1heD16dW1rb21wbCh1MSk7fQorCisgIGlmKElTRkxPQVQodCkpeworICAgIGd2YWwudmxkb3VibGU9dmxkb3VibGU7CisgICAgZXZhbF9jb25zdCgmZ3ZhbCxMRE9VQkxFKTsKKyAgfWVsc2UgaWYodCZVTlNJR05FRCl7CisgICAgZ3ZhbC52dW1heD12dW1heDsKKyAgICBldmFsX2NvbnN0KCZndmFsLChVTlNJR05FRHxNQVhJTlQpKTsKKyAgfWVsc2V7CisgICAgZ3ZhbC52bWF4PXZtYXg7CisgICAgZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworICB9CisgIGlmKHApIHQ9enR5cChwKTsKKyAgaW5zZXJ0X2NvbnN0KHosdCk7Cit9CisKKy8qIGZvbGRzIGNvbnN0YW50IElDcyAqLworaW50IGZvbGQoSUMgKnApCit7CisgIGludCBjOworICBpZighcCkgaWVycm9yKDApOworICBjPXAtPmNvZGU7CisgIGlmKGM9PVNVQlBGUHx8Yz09QVNTSUdOfHxjPT1QVVNIfHxjPT1TRVRSRVRVUk4pIHJldHVybiAwOworICBpZihERUJVRyYxMDI0KSB7cHJpbnRmKCJmb2xkaW5nIElDOlxuIik7cHJpYzIoc3Rkb3V0LHApO30KKyAgaWYoYz09VEVTVHx8Yz09Q09NUEFSRSl7CisgICAgdW5pb24gYXR5cHMgdmFsO2ludCBjYzsgLyogIGNvbmRpdGlvbiBjb2RlcyAqLworICAgIElDICpicDsKKyAgICBpZihjPT1URVNUKXsKKyAgICAgIGV2YWxfY29uc3QoJnAtPnExLnZhbCxwLT50eXBmKTsKKyAgICAgIGlmKHptZXF0byh2bWF4LGwyem0oMEwpKSYmenVtZXF0byh2dW1heCx1bDJ6dW0oMFVMKSkmJnpsZGVxdG8odmxkb3VibGUsZDJ6bGQoMC4wKSkpCisJY2M9MDsgCisgICAgICBlbHNlCisJY2M9MTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKHAtPnExLmZsYWdzJlZBUkFEUikKKwljYz1jb21wYXJlX2NvbnN0KCZwLT5xMS52YWwsJnAtPnEyLnZhbCxVTlNJR05FRHxNQVhJTlQpOworICAgICAgZWxzZQorCWNjPWNvbXBhcmVfY29uc3QoJnAtPnExLnZhbCwmcC0+cTIudmFsLHAtPnR5cGYpOworICAgIH0KKyAgICBicD1wLT5uZXh0OworICAgIGlmKGJwLT5jb2RlPj1CRVEmJmJwLT5jb2RlPD1CR1QmJighcC0+ei5mbGFnc3x8cC0+ei52PT1icC0+cTEudikpeworICAgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCIoY2M9JWQ7IGNvbXBhcmlzb24gZWxpbWluYXRlZClcbiIsY2MpOworICAgICAgaWYoaGF2ZV9hbGlhcyl7IGZyZWUocC0+dXNlX2xpc3QpO2ZyZWUocC0+Y2hhbmdlX2xpc3QpO30KKyAgICAgIHJlbW92ZV9JQyhwKTsKKyAgICAgIHdoaWxlKDEpeyAgIC8qICB6dWdlaG9lcmlnZW4gQnJhbmNoIHN1Y2hlbiAgKi8KKwlpZighYnB8fGJwLT5jb2RlPT1MQUJFTHx8YnAtPmNvZGU9PUJSQSkgaWVycm9yKDApOworCWM9YnAtPmNvZGU7CisJaWYoYz49QkVRJiZjPD1CR1QpIGJyZWFrOworCWJwPWJwLT5uZXh0OworICAgICAgfQorICAgICAgaWYoKGM9PUJFUSYmY2M9PTApfHwoYz09Qk5FJiZjYyE9MCl8fChjPT1CTFQmJmNjPDApfHwoYz09QkdUJiZjYz4wKXx8KGM9PUJMRSYmY2M8PTApfHwoYz09QkdFJiZjYz49MCkpeworCWlmKERFQlVHJjEwMjQpeyBwcmludGYoImNoYW5nZWQgZm9sbG93aW5nIGJyYW5jaCB0byBCUkE6XG4iKTtwcmljMihzdGRvdXQsYnApO30KKwlicC0+Y29kZT1CUkE7YnAtPnExLmZsYWdzPTA7CisgICAgICB9ZWxzZXsKKwlpZihERUJVRyYxMDI0KXsgcHJpbnRmKCJyZW1vdmVkIGZvbGxvd2luZyBicmFuY2g6XG4iKTtwcmljMihzdGRvdXQsYnApO30KKwlpZihoYXZlX2FsaWFzKXsgZnJlZShicC0+dXNlX2xpc3QpO2ZyZWUoYnAtPmNoYW5nZV9saXN0KTt9CisJcmVtb3ZlX0lDKGJwKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZihwLT56LmZsYWdzPT0wKXsKKyAgICAgIHAtPmNvZGU9Tk9QOworICAgICAgcC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworICAgICAgcmV0dXJuIDE7CisgICAgfWVsc2UKKyAgICAgIHJldHVybiAwOworICB9CisgIGlmKGM9PUNPTlZFUlQpeworICAgIGV2YWxfY29uc3QoJnAtPnExLnZhbCxwLT50eXBmMik7CisgICAgaW5zZXJ0X2NvbnN0KCZwLT5xMS52YWwscC0+dHlwZik7CisgIH1lbHNlCisgICAgY2FsYyhjLHAtPnR5cGYsJnAtPnExLnZhbCwmcC0+cTIudmFsLCZwLT5xMS52YWwscCk7CisgIHAtPnEyLmZsYWdzPTA7CisgIGlmKHAtPmNvZGU9PUFEREkyUHx8cC0+Y29kZT09U1VCSUZQKQorICAgIHAtPnR5cGY9cC0+dHlwZjI7CisgIHAtPnEyLnZhbC52bWF4PXNpemV0YWJbcC0+dHlwZiZOUV07CisgIHAtPmNvZGU9QVNTSUdOOworICBpZihERUJVRyYxMDI0KXtwcmludGYoImJlY29tZXNcbiIpO3ByaWMyKHN0ZG91dCxwKTt9CisgIHJldHVybiAxOworfQorCisvKiB0cmllcyB0byByZXBsYWNlIG9iamVjdHMgYnkgY29uc3RhbnRzIGFuZCBkZXRlY3RzIHNvbWUgdW5pbml0aWFsaXplZCAqLworLyogdmFyaWFibGVzOyBpZiBjcG9ubHk9PTAsIGFkZHJlc3MtY29uc3RhbnRzIHdpbGwgYmUgcmVwbGFjZWQsICovCisvKiBvdGhlcndpc2Ugb25seSByZWFsIGNvbnN0YW50cyBhcmUgcmVwbGFjZWQsIHNpYyBwb2ludHMgdG8gdGhlIElDICovCisvKiBjb250YWluaW5nIHRoZSBvYmplY3QgcG9pbnRlZCB0byBieSBvICovCitpbnQgcHJvcGFnYXRlKElDICpzaWMsb2JqICpvLGludCBjcG9ubHksaW50IGdsb2JhbCkKK3sKKyAgdW5zaWduZWQgaW50IGksaix0LGZvdW5kO3VuaW9uIGF0eXBzICp2YWw9MDsKKyAgVmFyICp2LCp2YWRkcj0wO0lDICpwOworICB6bWF4IHZvZmY7CisgIGlmKCFvfHwhby0+dikgaWVycm9yKDApOworICBpZihjcG9ubHkpeworICAgIGlmKGlzX3ZvbGF0aWxlX29iaihvKSkKKyAgICAgIHJldHVybiAwOworICB9ZWxzZXsKKyAgICBpZigoby0+ZmxhZ3MmVkFSKSYmKG8tPnYtPnZ0eXAtPmZsYWdzJlZPTEFUSUxFKSkKKyAgICAgIHJldHVybiAwOworICB9CisgIGlmKGRpc2FibGUmOCkgcmV0dXJuIDA7CisgIHY9by0+djsKKyAgaT12LT5pbmRleDsKKyAgLyogZG8gbm90IHJlcGxhY2UgaW4gSUNzIG9mIHRoZSBmb3JtIG1vdmUgY2hhciB3aXRoIHNpemUhPTEsCisgICAgIGJlY2F1c2UgdGhlc2UgYXJlIGJ1aWx0aW4gbWVtY3B5ICovCisgIGlmKGNwb25seSYmc2ljLT5jb2RlPT1BU1NJR04mJihzaWMtPnR5cGYmTlEpPT1DSEFSJiYhem1lcXRvKHNpYy0+cTIudmFsLnZtYXgsbDJ6bSgxTCkpKQorICAgIHJldHVybiAwOworICBpZihjcG9ubHkmJihvLT5mbGFncyZEUkVGT0JKKSkgaSs9dmNvdW50LXJjb3VudDsKKyAgaWYoREVCVUcmMjA0OCl7CisgICAgcHJpbnRmKCJwcm9wYWdhdGUoY3Bvbmx5PSVkKSA8JXM+KCVwKVxuIixjcG9ubHksby0+di0+aWRlbnRpZmllciwodm9pZCAqKXYpOworICAgIGlmKG8tPmZsYWdzJkRSRUZPQkopIHByaW50ZigiKERSRUZPQkopIik7CisgICAgcHJpbnRmKCJcbmFsbCByZWFjaGluZyBkZWZpbml0aW9uczpcbiIpO3ByaW50X3JkKHJkX2RlZnMpOworICAgIHByaW50ZigiZGVmcyBmb3IgdmFyOlxuIik7CisgICAgcHJpbnRfcmQodmFyX2RlZnNbaV0pOworICB9CisgIGlmKHYtPm5lc3Rpbmc9PTB8fHYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQ3x8di0+c3RvcmFnZV9jbGFzcz09RVhURVJOKXsKKyAgICAvKiAgV2VubiBtb2VnbGljaCBiZWkgc3RhdGlzY2hlbiBWYXJpYWJsZW4gZGVuIFdlcnQgYmVpIGRlciAgICAgICAgICovCisgICAgLyogIEluaXRpYWxpc2llcnVuZyBlcm1pdHRlbG4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qaWYoY3Bvbmx5JiZJU0FSSVRIKHYtPnZ0eXAtPmZsYWdzKSYmKCh2LT52dHlwLT5mbGFncyZDT05TVCl8fCh2LT5uZXN0aW5nPjAmJiEodi0+ZmxhZ3MmKFVTRURBU0FEUnxVU0VEQVNERVNUKSkpKSl7Ki8KKyAgICBwcmludGYoInZhcjEoJXMpICVkXG4iLHYtPmlkZW50aWZpZXIsY3Bvbmx5KTsKKyAgICBpZihjcG9ubHkmJmlzX2NvbnN0KHYtPnZ0eXApKXsKKyAgICAgIC8qICBWYXJpYWJsZSBoYXQgbm9jaCBkZW4gV2VydCBkZXIgSW5pdGlhbGlzaWVydW5nLiAgICAgICAgICovCisgICAgICBpZih2LT5jbGlzdCl7CisJaW50IHQ7CisJaWYobz09JnNpYy0+cTEpIHQ9cTF0eXAoc2ljKTsKKwllbHNlIGlmKG89PSZzaWMtPnEyKSB0PXEydHlwKHNpYyk7CisJZWxzZSBpZihvPT0mc2ljLT56KSB0PXp0eXAoc2ljKTsKKwllbHNlIGllcnJvcigwKTsKKwlwcmludGYoInZhcjIoJXMpXG4iLHYtPmlkZW50aWZpZXIpOworCWlmKElTQVJJVEgodi0+dnR5cC0+ZmxhZ3MpfHxJU1BPSU5URVIodi0+dnR5cC0+ZmxhZ3MpKXsKKwkgIC8qICBEZXIgV2VydCBkZXIgSW5pdGlhbGlzaWVydW5nIGlzdCBub2NoIGdlc3BlaWNoZXJ0LiAgKi8KKwkgIGlmKERFQlVHJjEwMjQpIHByaW50ZigidXNpbmcgc3RhdGljIGluaXRpYWxpemVyXG4iKTsKKwkgIG8tPnZhbD12LT5jbGlzdC0+dmFsOworCSAgby0+ZmxhZ3M9S09OU1Q7CisJICByZXR1cm4gMTsKKwl9ZWxzZSBpZihJU0lOVCh0Jk5RKSl7CisJICBpbnQgc3RhdGU7CisJICBpZihERUJVRyYxMDI0KSBwcmludGYoInVzaW5nIHN0YXRpYyBpbml0aWFsaXplciAobmV3IHZlcnNpb24pXG4iKTsKKwkgIGd2YWwudnVtYXg9Z2V0X2NsaXN0X2ludCh2LT52dHlwLHYtPmNsaXN0LG8tPnZhbC52bWF4LHNpemV0YWJbdCZOUV0sJnN0YXRlKTsKKwkgIGlmKHN0YXRlKXsKKwkgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJ1c2luZyBzdGF0aWMgaW5pdGlhbGl6ZXIgKG5ldyB2ZXJzaW9uKVxuIik7CisJICAgIGV2YWxfY29uc3QoJmd2YWwsVU5TSUdORUR8TUFYSU5UKTsKKwkgICAgaW5zZXJ0X2NvbnN0KCZvLT52YWwsdCk7CisJICAgIG8tPmZsYWdzPUtPTlNUOworCSAgICByZXR1cm4gMTsKKwkgIH0KKwl9CisgICAgICB9ZWxzZXsKKwkvKiAgSGllciBldnRsLiBlaW5lIGltcGxpeml0ZSAwIGVya2VubmVuLiAgICAgICAgICAgICAgICovCisgICAgICB9CisgICAgfQorICB9CisgIGZvdW5kPTA7CisgIGZvcihqPTE7ajw9ZGNvdW50O2orKyl7CisgICAgaWYoKCFCVFNUKHJkX2RlZnMsVU5ERUYoaikpfHwhQlRTVCh2YXJfZGVmc1tpXSxVTkRFRihqKSkpJiYKKyAgICAgICAoIUJUU1QocmRfZGVmcyxqKXx8IUJUU1QodmFyX2RlZnNbaV0saikpKSBjb250aW51ZTsKKyAgICBmb3VuZD0xOworICAgIHA9ZGxpc3Rbal07CisgICAgaWYoIShwLT56LmZsYWdzJlZBUikpIHJldHVybiAwOworICAgIGlmKHAtPnoudiE9by0+dikgY29udGludWU7CisgICAgdD16dHlwKHApJk5VOworICAgIGlmKGNwb25seSYmIUlTU0NBTEFSKHQpKSBjb250aW51ZTsKKyAgICBpZighem1lcXRvKHAtPnoudmFsLnZtYXgsby0+dmFsLnZtYXgpKSBjb250aW51ZTsKKyAgICBpZihjcG9ubHkpeworICAgICAgaWYocC0+ei5mbGFncyE9by0+ZmxhZ3MpIGNvbnRpbnVlOworICAgIH1lbHNleworICAgICAgaWYoKHAtPnouZmxhZ3N8RFJFRk9CSikhPW8tPmZsYWdzKSBjb250aW51ZTsKKyAgICAgIGlmKHAtPnouZmxhZ3MmRFJFRk9CSikgY29udGludWU7CisgICAgfQorICAgIGlmKEJUU1QocmRfZGVmcyxVTkRFRihqKSkmJkJUU1QodmFyX2RlZnNbaV0sVU5ERUYoaikpKSByZXR1cm4gMDsKKyAgICBpZihCVFNUKHJkX2RlZnMsVU5ERUYoaikpJiZCVFNUKHZhcl9kZWZzW2ldLGopKSByZXR1cm4gMDsKKworICAgIGlmKChwLT5jb2RlIT1BU1NJR058fCgocC0+cTEuZmxhZ3MmKEtPTlNUfERSRUZPQkopKSE9S09OU1QmJihwLT5xMS5mbGFncyYoVkFSQURSfERSRUZPQkopKSE9VkFSQURSKSkKKyAgICAgICAmJihwLT5jb2RlIT1BRERSRVNTfHwhKG8tPmZsYWdzJkRSRUZPQkopKSkgcmV0dXJuIDA7CisgICAgaWYocC0+cTEuZmxhZ3MmS09OU1QpeworICAgICAgaWYodmFkZHIpIHJldHVybiAwOworICAgICAgaWYodmFsKXsKKwlpZigocC0+dHlwZiZOUSkhPSh0Jk5RKSkgcmV0dXJuIDA7CisJaWYoY29tcGFyZV9jb25zdCgmcC0+cTEudmFsLHZhbCx0KSkgcmV0dXJuIDA7CisgICAgICB9ZWxzZXsKKwl2YWw9JnAtPnExLnZhbDt0PXAtPnR5cGYmTlU7CisgICAgICB9CisgICAgfQorICAgIGlmKHAtPmNvZGU9PUFERFJFU1N8fChwLT5xMS5mbGFncyZWQVJBRFIpKXsKKyAgICAgIGlmKHZhbCkgcmV0dXJuIDA7CisgICAgICBpZih2YWRkcil7CisJaWYocC0+cTEudiE9dmFkZHJ8fCF6bWVxdG8ocC0+cTEudmFsLnZtYXgsdm9mZikpIHJldHVybiAwOworICAgICAgfQorICAgICAgdmFkZHI9cC0+cTEudjsKKyAgICAgIHZvZmY9cC0+cTEudmFsLnZtYXg7CisgICAgfQorICB9CisKKyAgLyogZm91bmQgY29uc3RhbnQgKi8KKyAgaWYodmFsKXsKKyAgICBpZihjcG9ubHkpeworICAgICAgaWYobz09JnNpYy0+cTEmJihxMXR5cChzaWMpJk5RKSE9KHQmTlEpKSByZXR1cm4gMDsKKyAgICAgIGlmKG89PSZzaWMtPnEyJiYocTJ0eXAoc2ljKSZOUSkhPSh0Jk5RKSkgcmV0dXJuIDA7CisgICAgICBpZihvPT0mc2ljLT56JiYoenR5cChzaWMpJk5RKSE9KHQmTlEpKSByZXR1cm4gMDsKKyAgICAgIAorICAgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJjYW4gcmVwbGFjZSAlbGQrPCVzPiglcCkgYnkgY29uc3RhbnRcbiIsem0ybChvLT52YWwudm1heCksby0+di0+aWRlbnRpZmllcixvLT52KTsKKyAgICAgIC8qIFRPRE86IGRvIHdlIG5lZWQgZXZhbF9jb25zdC9pbnNlcnRfY29uc3QgKGlmIHJlcHJlc2VudGF0aW9uIG9mIHVuc2lnbmVkIGlzIGRpZmZlcmVudD8gKi8KKyAgICAgIG8tPnZhbD0qdmFsOworICAgICAgby0+ZmxhZ3M9S09OU1Q7CisgICAgfWVsc2V7CisgICAgICBpZihERUJVRyYxMDI0KSBwcmludGYoImNhbiByZXBsYWNlIDwlcz4gYnkgY29uc3RhbnQgYWRkcmVzc1xuIixvLT52LT5pZGVudGlmaWVyKTsKKyAgICAgIG8tPnZhbD0qdmFsOworICAgICAgby0+ZmxhZ3N8PUtPTlNUOworICAgICAgby0+ZmxhZ3MmPX5WQVI7CisgICAgICBvLT52PTA7CisgICAgfQorICAgIHJldHVybiAxOworICB9CisgIGlmKHZhZGRyJiYodmFkZHItPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTnx8dmFkZHItPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQykpeworICAgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiY2FuIHJlcGxhY2UgPCVzPiBieSB2YXJhZHJcbiIsby0+di0+aWRlbnRpZmllcik7CisgICAgby0+dj12YWRkcjsKKyAgICBvLT52YWwudm1heD12b2ZmOworICAgIGlmKChvLT5mbGFncyZEUkVGT0JKKSYmIWNwb25seSkKKyAgICAgIG8tPmZsYWdzPVZBUjsKKyAgICBlbHNlCisgICAgICBvLT5mbGFncz1WQVJ8VkFSQURSOworICAgIHJldHVybiAyOworICB9CisgIGlmKHZhZGRyJiYoby0+ZmxhZ3MmRFJFRk9CSikpeworICAgIHQ9dmFkZHItPnZ0eXAtPmZsYWdzJk5VOworICAgIGlmKG89PSZzaWMtPnExJiYocTF0eXAoc2ljKSZOVSkhPXQpIHJldHVybiAwOworICAgIGlmKG89PSZzaWMtPnEyJiYocTJ0eXAoc2ljKSZOVSkhPXQpIHJldHVybiAwOworICAgIGlmKG89PSZzaWMtPnomJih6dHlwKHNpYykmTlUpIT10KSByZXR1cm4gMDsKKyAgICBpZihERUJVRyYxMDI0KSBwcmludGYoImNhbiByZXBsYWNlICo8JXM+IGJ5IGFkZHJlc3NcbiIsby0+di0+aWRlbnRpZmllcik7CisgICAgby0+dj12YWRkcjsKKyAgICBvLT52YWwudm1heD12b2ZmOworICAgIG8tPmZsYWdzJj1+RFJFRk9CSjsKKyAgICByZXR1cm4gMjsKKyAgfQorICAvKiBubyBkZWZpbml0aW9uIGZvdW5kICovCisgIGlmKCFmb3VuZCYmZ2xvYmFsJiZ2LT5zdG9yYWdlX2NsYXNzIT1FWFRFUk4mJnYtPnN0b3JhZ2VfY2xhc3MhPVNUQVRJQyYmISh2LT5mbGFncyZVU0VEQkVGT1JFKSYmdi0+cmVnPT0wJiZ6bWxlcShsMnptKDBMKSx2LT5vZmZzZXQpKXsKKyAgICBpZigqdi0+aWRlbnRpZmllcnx8IShvcHRmbGFncyY0MDk2KSl7CisjaWZkZWYgSEFWRV9NSVNSQQorICAgICAgbWlzcmFfbmV1KDMwLDksMSwwLHYtPmlkZW50aWZpZXIpOworI2VuZGlmCisgICAgICBlcnJvcigxNzEsdi0+aWRlbnRpZmllcik7di0+ZmxhZ3N8PVVTRURCRUZPUkU7CisgICAgICBpZighKnYtPmlkZW50aWZpZXIpIHtwcmludGYoIjwlcD5cbiIsKHZvaWQgKil2KTtpZXJyb3IoMCk7fQorICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworLyogc2VhcmNoZXMgZm9yIGNvbnN0YW50IG9iamVjdHMgYW5kIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzOyBpZiAgKi8KKy8qIGdsb2JhbCE9MCwgcmVhY2hpbmcgZGVmaW5pdGlvbnMgYXJlIHVzZWQsIG90aGVyd2lzZSBvbmx5IGxvY2FsICovCisvKiBjb25zdGFudCBwcm9wYWdhdGlvbiB3aWxsIGJlIGRvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworaW50IGNvbnN0YW50X3Byb3BhZ2F0aW9uKGZsb3dncmFwaCAqZmcsaW50IGdsb2JhbCkKK3sKKyAgSUMgKnA7aW50IGNoYW5nZWQ9MCxpLHQ7Zmxvd2dyYXBoICpnOworICByZF9kZWZzPW15bWFsbG9jKGRzaXplKTsKKyAgZz1mZzsKKyAgd2hpbGUoZyl7CisgICAgaWYoZ2xvYmFsKQorICAgICAgbWVtY3B5KHJkX2RlZnMsZy0+cmRfaW4sZHNpemUpOworICAgIGVsc2UKKyAgICAgIG1lbXNldChyZF9kZWZzLDAsZHNpemUpOworICAgIHA9Zy0+c3RhcnQ7CisgICAgd2hpbGUocCl7CisgICAgICBpbnQgYz1wLT5jb2RlOworICAgICAgLyogaWYoREVCVUcmMTAyNCl7cHJpbnRfcmQocmRfZGVmcyk7cHJpYzIoc3Rkb3V0LHApO30qLworICAgICAgaWYoYyE9QUREUkVTUyYmYyE9Tk9QJiZJU1NDQUxBUihwLT50eXBmKSYmKGM8TEFCRUx8fGM+QlJBKSl7CisJaWYoKHAtPnExLmZsYWdzJihWQVJ8VkFSQURSKSk9PVZBUil7CisJICBpZighKHExdHlwKHApJlZPTEFUSUxFKSYmIWlzX3ZvbGF0aWxlX29iaigmcC0+cTEpKQorCSAgICBjaGFuZ2VkfD1wcm9wYWdhdGUocCwmcC0+cTEsMSxnbG9iYWwpOworCSAgaWYoKHAtPnExLmZsYWdzJkRSRUZPQkopJiYhKHAtPnExLnYtPnZ0eXAtPmZsYWdzJlZPTEFUSUxFKSkKKwkgICAgY2hhbmdlZHw9cHJvcGFnYXRlKHAsJnAtPnExLDAsZ2xvYmFsKTsKKwl9CisJaWYoKHAtPnEyLmZsYWdzJihWQVJ8VkFSQURSKSk9PVZBUil7CisJICBpZighKHEydHlwKHApJlZPTEFUSUxFKSYmIWlzX3ZvbGF0aWxlX29iaigmcC0+cTIpKQorCSAgICBjaGFuZ2VkfD1wcm9wYWdhdGUocCwmcC0+cTIsMSxnbG9iYWwpOworCSAgaWYoKHAtPnEyLmZsYWdzJkRSRUZPQkopJiYhKHAtPnEyLnYtPnZ0eXAtPmZsYWdzJlZPTEFUSUxFKSkKKwkgICAgY2hhbmdlZHw9cHJvcGFnYXRlKHAsJnAtPnEyLDAsZ2xvYmFsKTsKKwl9CisgICAgICB9CisgICAgICAvKiBvbmx5IHRoZXJlIHRvIGRldGVjdCB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyAqLworICAgICAgaWYoKChwLT56LmZsYWdzJihWQVJ8RFJFRk9CSikpPT0oVkFSfERSRUZPQkopKSl7CisJaWYoIShwLT56LnYtPnZ0eXAtPmZsYWdzJlZPTEFUSUxFKSkKKwkgIGNoYW5nZWR8PXByb3BhZ2F0ZShwLCZwLT56LDAsZ2xvYmFsKTsKKyAgICAgIH0KKyAgICAgIHJkX2NoYW5nZShwKTsKKyAgICAgIAorICAgICAgaWYocD09Zy0+ZW5kKSBicmVhazsKKyAgICAgIHA9cC0+bmV4dDsKKyAgICB9CisgICAgYnJlYWs7CisgICAgZz1nLT5ub3JtYWxvdXQ7CisgIH0KKyAgCisgIGdjaGFuZ2VkfD1jaGFuZ2VkOworICAKKyAgZnJlZShyZF9kZWZzKTsKKyAgcmV0dXJuIGNoYW5nZWQ7Cit9CisKKy8qIHBlcmZvcm1zIGNoYW5nZXMgdG8gcmRfZGVmcyB3aGljaCBhcmUgY2F1c2VkIGJ5IElDIHAgKi8KK3ZvaWQgcmRfY2hhbmdlKElDICpwKQoreworICBpZihERUJVRyY0MDk2KSBwcmludF9yZChyZF9kZWZzKTsKKyAgaWYocC0+ZGVmaW5kZXgpeworICAgIGJ2ZGlmZihyZF9kZWZzLGRlZnNfa2lsbFtwLT5kZWZpbmRleF0sZHNpemUpOworICAgIGJ2dW5pdGUocmRfZGVmcyxkZWZzX2dlbltwLT5kZWZpbmRleF0sZHNpemUpOworICB9CisgIGlmKERFQlVHJjQwOTYpIHByaWMyKHN0ZG91dCxwKTsKK30KKwpkaWZmIC0tZ2l0IGEvcmVncy5jIGIvcmVncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZWRkY2QKLS0tIC9kZXYvbnVsbAorKysgYi9yZWdzLmMKQEAgLTAsMCArMSwyMTAyIEBACisvKiAgJFZFUjogdmJjYyAocmVncy5jKSAkUmV2aXNpb246IDEuMzEgJCAgICovCisvKiAgUmVnaXN0ZXJ6dXRlaWx1bmcgICAgICAgICAgICovCisKKyNpbmNsdWRlICJvcHQuaCIKKworc3RhdGljIGNoYXIgRklMRV9bXT1fX0ZJTEVfXzsKKwordHlwZWRlZiBzdHJ1Y3QgcmVncCB7aW50IHRyZWc7VmFyICp0dmFyLCp0bXA7fSByZWdwOworaW50IHNyZWdzYVtNQVhSKzFdOworCit2b2lkIGRvX2xvYWRfcGFybXMocmVncCBbXSxmbG93Z3JhcGggKik7Cit2b2lkIGxvYWRfb25lX3Bhcm0oaW50LGludCxWYXIgKixWYXIgKixmbG93Z3JhcGggKik7CisKKyNpZm5kZWYgTk9fT1BUSU1JWkVSCisKK2ludCAoKnNhdmluZ3MpW01BWFIrMV0scmVndVtNQVhSKzFdOworaW50ICpydmxpc3Q7CisKK3N0YXRpYyBpbnQgY29uc3RfdmFyczsKKworc3RhdGljIGJ2dHlwZSBicmVnc1tCVlNJWkUoTUFYUisxKS9zaXplb2YoYnZ0eXBlKV07CitzdGF0aWMgYnZ0eXBlIGJyZWdzbVtCVlNJWkUoTUFYUisxKS9zaXplb2YoYnZ0eXBlKV07CisKK1ZhciAqbHBhcm1zW01BWFIrMV07CisKK3N0YXRpYyB2b2lkIGluc2VydF9jb2JqKG9iaiAqbyxvYmogKmNvKTsKKworI2lmbmRlZiBIQVZFX1RBUkdFVF9SQUxMT0MKK2ludCByZWdfcHJpb1tNQVhSKzFdOworI2RlZmluZSBjb3N0X21vdmVfcmVnKHgseSkgMQorI2RlZmluZSBjb3N0X2xvYWRfcmVnKHgseSkgMgorI2RlZmluZSBjb3N0X3NhdmVfcmVnKHgseSkgMgorI2RlZmluZSBjb3N0X3B1c2hwb3BfcmVnKHgpIDQKKworaW50IGNvc3Rfc2F2aW5ncyhJQyAqcCxpbnQgcixvYmogKm8pCit7CisgIGludCBjPXAtPmNvZGU7CisgIGlmKG8tPmZsYWdzJlZLT05TVCkgcmV0dXJuIDA7CisgIGlmKG8tPmZsYWdzJkRSRUZPQkopeworICAgIGludCB0OworICAgIGlmKG89PSZwLT5xMSl7CisgICAgICB0PXExdHlwKHApOworICAgIH1lbHNlIGlmKG89PSZwLT5xMil7CisgICAgICB0PXEydHlwKHApOworICAgIH1lbHNleworICAgICAgdD16dHlwKHApOworICAgIH0KKyAgICBpZihyZWdvayhyLG8tPnYtPnZ0eXAtPmZsYWdzLHQpKSByZXR1cm4gNDsKKyAgfQorICBpZihjPT1TRVRSRVRVUk4mJnI9PXAtPnoucmVnJiYhKG8tPmZsYWdzJkRSRUZPQkopKSByZXR1cm4gMzsKKyAgaWYoYz09R0VUUkVUVVJOJiZyPT1wLT5xMS5yZWcmJiEoby0+ZmxhZ3MmRFJFRk9CSikpIHJldHVybiAzOworICByZXR1cm4gMjsKK30KKyNlbmRpZgorCitpbnQgY21wX3NhdmluZ3MoY29uc3Qgdm9pZCAqdjEsY29uc3Qgdm9pZCAqdjIpCisvKiAgVmVyZ2xlaWNoc2ZrdCwgdW0gcnZsaXN0IG5hY2ggc2F2aW5ncyB6dSBzb3J0aWVyZW4gICovCit7CisgICAgcmV0dXJuIHNhdmluZ3NbKihpbnQgKil2Ml1bMF0tc2F2aW5nc1sqKGludCAqKXYxXVswXTsKK30KK2ludCBlbnRyeV9sb2FkKGZsb3dncmFwaCAqZmcsaW50IGkpCisvKiAgVGVzdGV0LCBvYiBkaWUgVmFyaWFibGUgaW4gUmVnaXN0ZXIgaSBhbSBBbmZhbmcgdm9uIEJsb2NrIGZnIGdlbGFkZW4gICAgKi8KKy8qICB3ZXJkZW4gbXVzcywgZC5oLiBlaW4gVm9yZ2FlbmdlciBzaWUgbmljaHQgaW0gc2VsYmVuIFJlZ2lzdGVyIGhhdC4gICAgICAqLworeworICAgIGZsb3dsaXN0ICpscDsKKyAgICBWYXIgKnY9ZmctPnJlZ3ZbaV07CisgICAgaW50IHZpPXYtPmluZGV4OworICAgIGxwPWZnLT5pbjsKKworICAgIHdoaWxlKGxwKXsKKyAgICAgICAgaWYobHAtPmdyYXBoJiZscC0+Z3JhcGgtPnJlZ3ZbaV0hPXYmJih2aT49dmNvdW50LXJjb3VudHx8QlRTVChscC0+Z3JhcGgtPmF2X291dCx2aSkpKSByZXR1cm4gMTsKKyAgICAgICAgbHA9bHAtPm5leHQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBjaGVja3MgaWYgdmFyaWFibGUgaSBjYW4gYmUgaGVsZCBpbiBhIHJlZ2lzdGVyIGluIGxvb3Agc3RhcnQtZW5kICovCisvKiBjdXJyZW50bHkgd2UgY2hlY2sgd2hldGhlciBhbiBJQyB1c2VzL21vZGlmaWVzIHRoZSB2YXJpYWJsZSBhbmQgKi8KKy8qIGhhcyBhIGNvcnJlc3BvbmRpbmcgZHJlZm9iaiB3aGljaCBtaWdodCBhbGlhcyB0aGUgdmFyaWFibGUgKi8KK2ludCBjaGVja19jYWNoZWFibGUoaW50IGksZmxvd2dyYXBoICpzdGFydCxmbG93Z3JhcGggKmVuZCkKK3sKKyAgaW50IGosazsKKyAgSUMgKnA7VmFyICp2OworICBmbG93Z3JhcGggKmc7CisgIC8qIGNvbnN0YW50cyBhcmUgYWx3YXlzIGNhY2hlYWJsZSAqLworICBpZih2aWxpc3RbaV0tPmlkZW50aWZpZXJbMF09PScgJykKKyAgICByZXR1cm4gMTsKKyAgaWYoaTx2Y291bnQtcmNvdW50KXsKKyAgICAvKiBzaW1wbGUgbG9jYWwgdmFyaWFibGVzIGFyZSBhbHNvIGVhc3kgKi8KKyAgICB2PXZpbGlzdFtpXTsKKyAgICBpZih2LT5zdG9yYWdlX2NsYXNzIT1TVEFUSUMmJnYtPnN0b3JhZ2VfY2xhc3MhPUVYVEVSTiYmISh2LT5mbGFncyZVU0VEQVNBRFIpKQorICAgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYoZGlzYWJsZSYxNjM4NCkgcmV0dXJuIDA7CisgIGZvcihnPXN0YXJ0O2c7Zz1nLT5ub3JtYWxvdXQpeworICAgIGZvcihwPWctPnN0YXJ0O3A7cD1wLT5uZXh0KXsKKyAgICAgIGZvcihqPTA7ajxwLT51c2VfY250O2orKyl7CisJaz1wLT51c2VfbGlzdFtqXS52LT5pbmRleDsKKwlpZihwLT51c2VfbGlzdFtqXS5mbGFncyZEUkVGT0JKKQorCSAgays9dmNvdW50LXJjb3VudDsKKwlpZihrPT1pJiYocC0+Y29kZT09Q0FMTHx8KHAtPnExLmZsYWdzJkRSRUZPQkopfHwocC0+cTIuZmxhZ3MmRFJFRk9CSikpKQorCSAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBmb3Ioaj0wO2o8cC0+Y2hhbmdlX2NudDtqKyspeworCWs9cC0+Y2hhbmdlX2xpc3Rbal0udi0+aW5kZXg7CisJaWYocC0+Y2hhbmdlX2xpc3Rbal0uZmxhZ3MmRFJFRk9CSikKKwkgIGsrPXZjb3VudC1yY291bnQ7CisJaWYoaz09aSYmKHAtPmNvZGU9PUNBTEx8fChwLT56LmZsYWdzJkRSRUZPQkopKSkKKwkgIHJldHVybiAwOworICAgICAgfQorICAgICAgaWYocD09Zy0+ZW5kKSBicmVhazsKKyAgICB9CisgICAgaWYoZz09ZW5kKSBicmVhazsKKyAgfQorICAvKnByaW50ZigiYXNzaWduZWQgc3RhdGljICVzIHRvIHJlZ1xuIix2aWxpc3RbaV0tPmlkZW50aWZpZXIpOyovCisgIHJldHVybiAxOworfQoraW50IGV4aXRfc2F2ZShmbG93Z3JhcGggKmZnLGludCBpKQorLyogIFRlc3RldCwgb2IgZGllIFZhcmlhYmxlIGluIFJlZ2lzdGVyIGkgYW0gRW5kZSB2b24gQmxvY2sgZmcgZ2VzcGVpY2hlcnQgICovCisvKiAgd2VyZGVuIG11c3MsIGQuaC4gZGVyIFZvcmdhZW5nZXIgZWluZXMgTmFjaGZvbGdlcnMgbmljaHQgZGllc2VsYmUgICAgICAgKi8KKy8qICBWYXJpYWJsZSBpbSBzZWxiZW4gUmVnaXN0ZXIgaGF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICAgIGZsb3dsaXN0ICpscDsKKyAgICAvKiBLb25zdGFudGVuIG11ZXNzZW4gbmllIGdlc3BlaWNoZXJ0IHdlcmRlbiAqLworICAgIGlmKGZnLT5yZWd2W2ldLT5pbmRleD49dmNvdW50LXJjb3VudCkgcmV0dXJuIDA7CisgICAgaWYoIWZnLT5ub3JtYWxvdXQpeworICAgICAgLyogbGV0enRlciBCbG9jaywgc3RhdGlzY2hlIFZhcmlhYmxlbiB1bmQgZHJlZm9ianMgYWt0aXYgKi8KKyAgICAgIGludCBzYz1mZy0+cmVndltpXS0+c3RvcmFnZV9jbGFzczsKKyAgICAgIHJldHVybiBzYz09U1RBVElDfHxzYz09RVhURVJOOworICAgIH0KKyAgICBpZigoZmctPm5vcm1hbG91dCYmKCFmZy0+ZW5kfHxmZy0+ZW5kLT5jb2RlIT1CUkEpKSYmQlRTVChmZy0+bm9ybWFsb3V0LT5hdl9pbixmZy0+cmVndltpXS0+aW5kZXgpKXsKKyAgICAgICAgaWYoZmctPm5vcm1hbG91dC0+cmVndltpXSE9ZmctPnJlZ3ZbaV0pIHJldHVybiAxOworICAgICAgICBscD1mZy0+bm9ybWFsb3V0LT5pbjsKKyAgICAgICAgd2hpbGUobHApeworICAgICAgICAgICAgaWYobHAtPmdyYXBoJiZscC0+Z3JhcGgtPnJlZ3ZbaV0hPWZnLT5yZWd2W2ldKSByZXR1cm4gMTsKKyAgICAgICAgICAgIGxwPWxwLT5uZXh0OworICAgICAgICB9CisgICAgfQorICAgIGlmKGZnLT5icmFuY2hvdXQmJkJUU1QoZmctPmJyYW5jaG91dC0+YXZfaW4sZmctPnJlZ3ZbaV0tPmluZGV4KSl7CisgICAgICAgIGlmKGZnLT5icmFuY2hvdXQtPnJlZ3ZbaV0hPWZnLT5yZWd2W2ldKSByZXR1cm4gMTsKKyAgICAgICAgbHA9ZmctPmJyYW5jaG91dC0+aW47CisgICAgICAgIHdoaWxlKGxwKXsKKyAgICAgICAgICAgIGlmKGxwLT5ncmFwaCYmbHAtPmdyYXBoLT5yZWd2W2ldIT1mZy0+cmVndltpXSkgcmV0dXJuIDE7CisgICAgICAgICAgICBscD1scC0+bmV4dDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KK3ZvaWQgbG9hZF9yZWdfcGFybXMoZmxvd2dyYXBoICpmZykKKy8qICBMYWVkdCBSZWdpc3RlcnBhcmFtZXRlciwgZmFsbHMgbm9ldGlnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgICAgaW50IGksajsgVmFyICp2OworICAgIHJlZ3AgcmVncFtNQVhSKzFdPXswfTsKKy8qICAgICBmb3IoaT0xO2k8PU1BWFI7aSsrKXsgcmVncFtpXS50cmVnPTA7cmVncFtpXS50dmFyPTA7fSAqLworICAgIGZvcihpPTA7aTx2Y291bnQtcmNvdW50O2krKyl7CisgICAgICAgIHY9dmlsaXN0W2ldOworICAgICAgICBpZigodi0+ZmxhZ3MmUkVHUEFSTSkmJihmZy0+cmVndlthYnModi0+cmVnKV0hPXZ8fCh2LT5mbGFncyZDT05WUEFSQU1FVEVSKSkmJihCVFNUKGZnLT5hdl9pbixpKXx8KHYtPmZsYWdzJlVTRURBU0FEUikpKXsKKwkgIHJlZ3BbYWJzKHYtPnJlZyldLnR2YXI9djsKKwkgIGZvcihqPTE7ajw9TUFYUjtqKyspCisJICAgIGlmKGZnLT5yZWd2W2pdPT12fHxscGFybXNbal09PXYpIHJlZ3BbYWJzKHYtPnJlZyldLnRyZWc9ajsKKwl9CisgICAgfQorICAgIGRvX2xvYWRfcGFybXMocmVncCxmZyk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfcmV0cmVnKGZsb3dncmFwaCAqZmcpCit7CisgIElDICpwO2ludCByZXRyZWc9MDsKKyAgZm9yKHA9ZmctPnN0YXJ0O3A7cD1wLT5uZXh0KXsKKyAgICBpZihwLT5jb2RlPT1TRVRSRVRVUk4mJnAtPnoucmVnPj0wKXsKKyAgICAgIHJldHJlZz1wLT56LnJlZzsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBmb3IocD1sYXN0X2ljO3JldHJlZyYmcDtwPXAtPnByZXYpeworICAgIGlmKHAtPmNvZGU9PUZSRUVSRUcpeworICAgICAgaWYocC0+cTEucmVnPT1yZXRyZWcpCisJcmV0cmVnPTA7CisgICAgfWVsc2UKKyAgICAgIGJyZWFrOworICB9CisgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiY2hlY2tfcmV0cmVnOiAlc1xuIixyZWduYW1lc1tyZXRyZWddKTsKKyAgcmV0dXJuIHJldHJlZzsKK30KK3ZvaWQgaW5zZXJ0X3JlZ3MoZmxvd2dyYXBoICpmZzEpCisvKiAgRnVlZ3QgUmVnaXN0ZXJ2YXJpYWJsZW4gaW4gZGllIElDcyBlaW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgaSxleGl0X2Jsb2NrO0lDICpwLCpsaWM9MCwqbmV3O2Zsb3dncmFwaCAqbGZnPTAsKmZnOworICAgIGlmKERFQlVHJjkyMTYpIHByaW50ZigiaW5zZXJ0aW5nIHJlZ2lzdGVyIHZhcmlhYmxlc1xuIik7CisgICAgZmc9ZmcxOworICAgIHdoaWxlKGZnKXsKKyAgICAgICAgaWYoREVCVUcmODE5MikgcHJpbnRmKCJibG9jayAlZDpcbiIsZmctPmluZGV4KTsKKwlpZihmZyE9ZmcxJiYhZmctPmJyYW5jaG91dCYmIWZnLT5ub3JtYWxvdXQmJmZnLT5zdGFydD09ZmctPmVuZCkKKwkgIGV4aXRfYmxvY2s9MTsKKwllbHNlCisJICBleGl0X2Jsb2NrPTA7CisgICAgICAgIHA9ZmctPnN0YXJ0OworICAgICAgICB3aGlsZShwKXsKKyAgICAgICAgICAgIGZvcihpPTE7aTw9TUFYUjtpKyspeworICAgICAgICAgICAgICAgIGlmKCFmZy0+cmVndltpXSkgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYocC0+Y29kZT09QUxMT0NSRUcmJnAtPnExLnJlZz09aSkgaWVycm9yKDApOworICAgICAgICAgICAgICAgIGlmKChwLT5xMS5mbGFncyYoVkFSfFJFR3xET05UUkVHSVNURVJJWkUpKT09VkFSJiZwLT5xMS52PT1mZy0+cmVndltpXSYmKHAtPnExLnYtPmluZGV4PHZjb3VudC1yY291bnR8fGNvc3Rfc2F2aW5ncyhwLGksJnAtPnExKT4wKSl7CisJCSAgICBpZihwLT5xMS52LT5pbmRleD49dmNvdW50LXJjb3VudCkKKwkJICAgICAgcC0+cTEuZmxhZ3MmPX4oS09OU1R8VkFSfFZBUkFEUik7CisJCSAgICBwLT5xMS5mbGFnc3w9UkVHOworICAgICAgICAgICAgICAgICAgICBwLT5xMS5yZWc9aTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoKHAtPnEyLmZsYWdzJihWQVJ8UkVHfERPTlRSRUdJU1RFUklaRSkpPT1WQVImJnAtPnEyLnY9PWZnLT5yZWd2W2ldJiYocC0+cTIudi0+aW5kZXg8dmNvdW50LXJjb3VudHx8Y29zdF9zYXZpbmdzKHAsaSwmcC0+cTIpPjApKXsKKwkJICAgIGlmKHAtPnEyLnYtPmluZGV4Pj12Y291bnQtcmNvdW50KQorCQkgICAgICBwLT5xMi5mbGFncyY9fihLT05TVHxWQVJ8VkFSQURSKTsKKwkJICAgIHAtPnEyLmZsYWdzfD1SRUc7CisgICAgICAgICAgICAgICAgICAgIHAtPnEyLnJlZz1pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZigocC0+ei5mbGFncyYoVkFSfFJFR3xET05UUkVHSVNURVJJWkUpKT09VkFSJiZwLT56LnY9PWZnLT5yZWd2W2ldJiYocC0+ei52LT5pbmRleDx2Y291bnQtcmNvdW50fHxjb3N0X3NhdmluZ3MocCxpLCZwLT56KT4wKSl7CisJCSAgaWYocC0+ei52LT5pbmRleD49dmNvdW50LXJjb3VudCkKKwkJICAgIHAtPnouZmxhZ3MmPX4oS09OU1R8VkFSfFZBUkFEUik7CisJCSAgcC0+ei5mbGFnc3w9UkVHOworCQkgIHAtPnoucmVnPWk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCSAgICAvKiBldnRsLiBjb25zdC1WYXJpYWJsZW4gcnVlY2tzdWJzdGl0dWllcmVuICovCisJICAgIGlmKChwLT5xMS5mbGFncyZWQVIpJiZwLT5xMS52LT5pbmRleD49dmNvdW50LXJjb3VudCl7CisJICAgICAgaW5zZXJ0X2NvYmooJnAtPnExLCZwLT5xMS52LT5jb2JqKTsKKwkgICAgfQorCSAgICBpZigocC0+cTIuZmxhZ3MmVkFSKSYmcC0+cTIudi0+aW5kZXg+PXZjb3VudC1yY291bnQpeworCSAgICAgIGluc2VydF9jb2JqKCZwLT5xMiwmcC0+cTIudi0+Y29iaik7CisJICAgIH0KKwkgICAgaWYoKHAtPnouZmxhZ3MmVkFSKSYmcC0+ei52LT5pbmRleD49dmNvdW50LXJjb3VudCl7CisJICAgICAgaW5zZXJ0X2NvYmooJnAtPnosJnAtPnoudi0+Y29iaik7CisJICAgIH0KKyAgICAgICAgICAgIGlmKERFQlVHJjgxOTIpIHByaWMyKHN0ZG91dCxwKTsKKyAgICAgICAgICAgIGlmKHA9PWZnLT5lbmQpIGJyZWFrOworICAgICAgICAgICAgcD1wLT5uZXh0OworICAgICAgICB9CisgICAgICAgIGlmKGZnLT5zdGFydCYmZmctPnN0YXJ0LT5jb2RlPT1MQUJFTCYmZmchPWZnMSkgbGljPWZnLT5zdGFydDsKKyAgICAgICAgZm9yKGk9MTtpPD1NQVhSO2krKyl7CisgICAgICAgICAgICBpZihmZy0+cmVndltpXSl7CisgICAgICAgICAgICAgICAgaWYoREVCVUcmODE5Mil7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiKCVzKSwlbGQoJXApIGFzc2lnbmVkIHRvICVzXG4iLGZnLT5yZWd2W2ldLT5pZGVudGlmaWVyLHptMmwoZmctPnJlZ3ZbaV0tPm9mZnNldCksKHZvaWQgKilmZy0+cmVndltpXSxyZWduYW1lc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIGlmKGZnLT5yZWd2W2ldLT5pbmRleD49dmNvdW50LXJjb3VudHx8QlRTVChmZy0+YXZfaW4sZmctPnJlZ3ZbaV0tPmluZGV4KSkgcHJpbnRmKCJhY3RpdmUgYXQgdGhlIHN0YXJ0IG9mIGJsb2NrXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoZmctPnJlZ3ZbaV0tPmluZGV4PHZjb3VudC1yY291bnQmJkJUU1QoZmctPmF2X291dCxmZy0+cmVndltpXS0+aW5kZXgpKSBwcmludGYoImFjdGl2ZSBhdCB0aGUgZW5kIG9mIGJsb2NrXG4iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZihmZy0+cmVndltpXS0+aW5kZXg8dmNvdW50LXJjb3VudCYmQlRTVChmZy0+YXZfb3V0LGZnLT5yZWd2W2ldLT5pbmRleCkpeworICAgICAgICAgICAgICAgIC8qICBWYXJpYWJsZSBiZWltIEF1c3RyaXR0IGFrdGl2PyAgICovCisgICAgICAgICAgICAgICAgICAgIGlmKGV4aXRfc2F2ZShmZyxpKSl7CisJCSAgICAgIElDICp0cDtpbnQgbWFya19yZXRyZWc9MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKERFQlVHJjgxOTIpIHByaW50ZigiXHRoYXZlIHRvIHNhdmUgaXQgYXQgZW5kIG9mIGJsb2NrXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+bGluZT0wOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3LT5maWxlPTA7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXctPmNvZGU9QVNTSUdOOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3LT50eXBmPWZnLT5yZWd2W2ldLT52dHlwLT5mbGFnczsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZsYSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYoSVNBUlJBWShuZXctPnR5cGYpKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3LT50eXBmPVBPSU5URVJfVFlQRShmZy0+cmVndltpXS0+dnR5cC0+bmV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiAgY2MgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZihuZXctPnR5cGY9PTApIGllcnJvcigwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+cTEuZmxhZ3M9VkFSfFJFRzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+cTEudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXctPnExLnY9ZmctPnJlZ3ZbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBuZXctPnExLnJlZz1pOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3LT5xMi5mbGFncz0wOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3LT5xMi52YWwudm1heD1zem9mKGZnLT5yZWd2W2ldLT52dHlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+ei5mbGFncz1WQVJ8RE9OVFJFR0lTVEVSSVpFOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3LT56LnZhbC52bWF4PWwyem0oMEwpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3LT56LnY9ZmctPnJlZ3ZbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBuZXctPnExLmFtPW5ldy0+cTIuYW09bmV3LT56LmFtPTA7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXctPnVzZV9jbnQ9bmV3LT5jaGFuZ2VfY250PTA7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXctPnVzZV9saXN0PW5ldy0+Y2hhbmdlX2xpc3Q9MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qICBWb3IgRlJFRVJFR3MgdW5kIGV2dGwuIEJyYW5jaCtDT01QQVJFL1RFU1Qgc2V0emVuICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZnLT5lbmQpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwPWZnLT5lbmQ7CisJCQkgICAgaWYoIXRwLT5uZXh0KXsKKwkJCSAgICAgIG1hcmtfcmV0cmVnPWNoZWNrX3JldHJlZyhmZzEpOworCQkJICAgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJzYXZlIGF0IGVuZCwgbWFya3JldHJlZz0lc1xuIixyZWduYW1lc1ttYXJrX3JldHJlZ10pOworCQkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSh0cCE9ZmctPnN0YXJ0JiYodHAtPmNvZGU9PUZSRUVSRUd8fHRwLT5jb2RlPT1TRVRSRVRVUk58fHRwLT5jb2RlPT1OT1ApKXsKKwkJCSAgICAgIGlmKHRwLT5jb2RlPT1TRVRSRVRVUk4pIG1hcmtfcmV0cmVnPTA7CisJCQkgICAgICB0cD10cC0+cHJldjsKKwkJCSAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHAmJnRwLT5jb2RlPj1CRVEmJnRwLT5jb2RlPD1CUkEpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0cC0+Y29kZTxCUkEpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cD10cC0+cHJldjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjPXRwLT5jb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGMhPUZSRUVSRUcmJmMhPUNPTVBBUkUmJmMhPVRFU1QpIGllcnJvcigwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZShjIT1DT01QQVJFJiZjIT1URVNUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cD10cC0+cHJldjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSB0cD1saWM7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRfSUNfZmcoZmcsdHAsbmV3KTsKKwkJCWlmKG1hcmtfcmV0cmVnKXsKKwkJCSAgSUMgKm5vcDsKKwkJCSAgaW5zZXJ0X2FsbG9jcmVnKGZnLHRwLEFMTE9DUkVHLG1hcmtfcmV0cmVnKTsKKwkJCSAgaW5zZXJ0X2FsbG9jcmVnKGZnLG5ldyxGUkVFUkVHLG1hcmtfcmV0cmVnKTsKKwkJCSAgbm9wPW5ld19JQygpOworCQkJICBub3AtPmNvZGU9Tk9QOworCQkJICBub3AtPnExLmZsYWdzPVJFRzsKKwkJCSAgbm9wLT5xMS5yZWc9bWFya19yZXRyZWc7CisJCQkgIGluc2VydF9JQ19mZyhmZyxuZXcsbm9wKTsKKwkJCX0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihmZy0+cmVndltpXS0+aW5kZXg+PXZjb3VudC1yY291bnR8fEJUU1QoZmctPmF2X2luLGZnLT5yZWd2W2ldLT5pbmRleCkpeworCQkgIGlmKCFleGl0X2Jsb2NrJiYoZmc9PWZnMXx8ZW50cnlfbG9hZChmZyxpKSkmJihmZyE9ZmcxfHwhKGZnLT5yZWd2W2ldLT5mbGFncyZSRUdQQVJNKSkpeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoREVCVUcmODE5MikgcHJpbnRmKCJcdGhhdmUgdG8gbG9hZCBpdCBhdCBzdGFydCBvZiBibG9ja1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXctPmxpbmU9MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+ZmlsZT0wOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3LT5jb2RlPUFTU0lHTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+dHlwZj1mZy0+cmVndltpXS0+dnR5cC0+ZmxhZ3M7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB2bGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKElTQVJSQVkobmV3LT50eXBmKSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+dHlwZj1QT0lOVEVSX1RZUEUoZmctPnJlZ3ZbaV0tPnZ0eXAtPm5leHQpOworICAgICAgICAgICAgICAgICAgICAgICAgLyogIGNjICAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYobmV3LT50eXBmPT0wKSBpZXJyb3IoMCk7CisJCQlpZihmZy0+cmVndltpXS0+aW5kZXg+PXZjb3VudC1yY291bnQpeworCQkJICBpbnNlcnRfY29iaigmbmV3LT5xMSwmZmctPnJlZ3ZbaV0tPmNvYmopOworCQkJfWVsc2V7CisJCQkgIG5ldy0+cTEuZmxhZ3M9VkFSfERPTlRSRUdJU1RFUklaRTsKKwkJCSAgbmV3LT5xMS52YWwudm1heD1sMnptKDBMKTsKKwkJCSAgbmV3LT5xMS52PWZnLT5yZWd2W2ldOworCQkJfQorCQkJbmV3LT5xMi5mbGFncz0wOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3LT5xMi52YWwudm1heD1zem9mKGZnLT5yZWd2W2ldLT52dHlwKTsKKwkJCWlmKGZnLT5yZWd2W2ldLT5pbmRleD49dmNvdW50LXJjb3VudCkKKwkJCSAgbmV3LT56LmZsYWdzPVJFRzsKKwkJCWVsc2UKKwkJCSAgbmV3LT56LmZsYWdzPVZBUnxSRUc7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXctPnoudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXctPnoudj1mZy0+cmVndltpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+ei5yZWc9aTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+cTEuYW09bmV3LT5xMi5hbT1uZXctPnouYW09MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+dXNlX2NudD1uZXctPmNoYW5nZV9jbnQ9MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+dXNlX2xpc3Q9bmV3LT5jaGFuZ2VfbGlzdD0wOworICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0X0lDX2ZnKGZnLGxpYyxuZXcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCFsZmd8fCFsZmctPnJlZ3ZbaV0pIGluc2VydF9hbGxvY3JlZyhmZyxsaWMsQUxMT0NSRUcsaSk7CisgICAgICAgICAgICAgICAgaWYoIWZnLT5ub3JtYWxvdXR8fCFmZy0+bm9ybWFsb3V0LT5yZWd2W2ldKQorICAgICAgICAgICAgICAgICAgICBpbnNlcnRfYWxsb2NyZWcoZmcsZmctPmVuZD9mZy0+ZW5kOmxpYyxGUkVFUkVHLGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKGZnLT5lbmQpIGxpYz1mZy0+ZW5kOworICAgICAgICBsZmc9Zmc7CisgICAgICAgIGZnPWZnLT5ub3JtYWxvdXQ7CisgICAgfQorICAgIGxvYWRfcmVnX3Bhcm1zKGZnMSk7Cit9CisKK3ZvaWQgZG9fbG9vcF9yZWdzKGZsb3dncmFwaCAqc3RhcnQsZmxvd2dyYXBoICplbmQsaW50IGludGFzaykKKy8qICBNYWNodCBkaWUgVmFyaWFibGVuenV3ZWlzdW5nIGluIFNjaGxlaWZlIHN0YXJ0LWVuZC4gICAgICAgICAgICAgICAgICovCisvKiAgV2VubiBlbmQ9PTAgUmVnaXN0ZXJ6dXdlaXN1bmcgZnVlciBkaWUgZ2FuemUgRnVua3Rpb24sIGFuc29uc3RlbiAgICAqLworLyogIGZ1ZXIgZGllIFNjaGxlaWZlLCBkaWUgenVtIEhlYWRlciBzdGFydCBnZWhvZXJ0LiAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgZmxvd2dyYXBoICpnLCpsZW5kOworICBpbnQgaSxyLGl0ZXJhdGlvbnM7CisgIFZhciAqbHJlZ3NbTUFYUisxXT17MH07CisgIHVuc2lnbmVkIGNoYXIgcmVndVtNQVhSKzFdPXswfTsKKyAgYnZ0eXBlICppc3VzZWQ9bXltYWxsb2ModnNpemUpOworICAvKiAgQmVyZWNobmVuLCB3aWV2aWVsIHVuZ2VmYWVociBlaW5nZXNwYXJ0IHdpcmQsIHdlbm4gZWluZSBWYXJpYWJsZSAgICAqLworICAvKiAgZnVlciBkaWVzZSBTY2hsZWlmZSBpbiBlaW5lbSBiZXN0LiBSZWdpc3RlciBnZWhhbHRlbiB3aXJkLiAgICAgICAgICAqLworICAvKiAgRGllIHNhdmluZ3MgaW4gZWluZXIgU2NobGVpZmUgd2VyZGVuIG11bHRpcGxpemllcnQsIHVtIGRhcyAgICAgICAgICAqLworICAvKiAgTGFkZW4vU3BlaWNoZXJuIGF1c3NlcmhhbGIgZGVyIFNjaGxlaWZlIGdlcmluZ2VyIHp1IHdpY2h0ZW4uICAgICAgICAqLworICAvKiAgICBpZihlbmQmJighZy0+bm9ybWFsb3V0fHwhZy0+bm9ybWFsb3V0LT5sb29wZW5kfHxnLT5ub3JtYWxvdXQtPmxvb3BlbmQtPm5vcm1hbG91dC0+aW5kZXghPS0yKSkgaWVycm9yKDApOyovCisgIC8qICBhbGxlIGF1ZiAwICAqLworCisgIGZvcihpPTA7aTx2Y291bnQtcmNvdW50K2NvbnN0X3ZhcnM7aSsrKXsKKyAgICBpZihpPHZjb3VudC1yY291bnQmJih2aWxpc3RbaV0tPnZ0eXAtPmZsYWdzJlZPTEFUSUxFKSl7CisgICAgICBmb3Iocj0xO3I8PU1BWFI7cisrKXsKKwlzYXZpbmdzW2ldW3JdPUlOVF9NSU47CisgICAgICB9CisgICAgfWVsc2V7CisgICAgICBmb3Iocj0xO3I8PU1BWFI7cisrKXsKKwlzYXZpbmdzW2ldW3JdPTA7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGVuZCl7CisgICAgVmFyICp2OworICAgIC8qIGVzdGltYXRlZCBudW1iZXIgb2YgaXRlcmF0aW9ucywgYXZvaWQgdG9vIGJpZyB2YWx1ZXMgKi8KKyAgICBpZihvcHRzaXplKQorICAgICAgaXRlcmF0aW9ucz0xOworICAgIGVsc2UKKyAgICAgIGl0ZXJhdGlvbnM9NDsKKyAgICAvKiAgRXZ0bC4gS29zdGVuIGZ1ZXJzIExhZGVuL1NwZWljaGVybiBiZWltIEVpbi0vQXVzdHJpdHQgaW4gZGllICAgICovCisgICAgLyogIFNjaGxlaWZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGVuZD1zdGFydC0+bm9ybWFsb3V0LT5sb29wZW5kOworICAgIGc9ZW5kLT5ub3JtYWxvdXQ7CisgICAgaWYoREVCVUcmOTIxNikgcHJpbnRmKCJhc3NpZ25pbmcgcmVncyB0byBibG9ja3MgJWQgdG8gJWRcbiIsc3RhcnQtPm5vcm1hbG91dC0+aW5kZXgsZW5kLT5pbmRleCk7CisgICAgLyogIFdlcnRlIG1vZGlmaXppZXJlbiwgZmFsbHMgVmFyaWFibGUgYW0gQW5mYW5nL0VuZGUgZGVyIFNjaGxlaWZlICAqLworICAgIC8qICBnZWxhZGVuL2dlc3BlaWNoZXJ0IHdlcmRlbiBtdXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgRklYTUU6IEV2dGwuIG5vZXRpZ2Ugc3RvcmVzL2xvYWRzIGluIGFuZGVyZW4gQmxvZWNrZW4hICAgICAgICAgICovCisgICAgZm9yKGk9MDtpPHZjb3VudC1yY291bnQrY29uc3RfdmFycztpKyspeworICAgICAgdj12aWxpc3RbaV07CisgICAgICBpZihpPj12Y291bnQtcmNvdW50fHxCVFNUKHN0YXJ0LT5hdl9pbixpKSl7CisgCWZvcihyPTE7cjw9TUFYUjtyKyspCisJICBpZihzdGFydC0+cmVndltyXSE9diYmc2F2aW5nc1tpXVtyXSE9SU5UX01JTikKKwkgICAgc2F2aW5nc1tpXVtyXS09Y29zdF9sb2FkX3JlZyhyLHYpOworICAgICAgfQorICAgICAgaWYoaTx2Y291bnQtcmNvdW50JiZCVFNUKGctPmF2X291dCxpKSl7CisJZm9yKHI9MTtyPD1NQVhSO3IrKykKKwkgIGlmKGctPnJlZ3Zbcl0hPXYmJnNhdmluZ3NbaV1bcl0hPUlOVF9NSU4pCisJICAgIHNhdmluZ3NbaV1bcl0tPWNvc3Rfc2F2ZV9yZWcocix2KTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogIFdlcnRlIG1vZGlmaXppZXJlbiwgZmFsbHMgZWluZSBhbmRlcmUgVmFyaWFibGUgZ2VzcGVpY2hlcnQgb2RlciAqLworICAgIC8qICBnZWxhZGVuIHdlcmRlbiBtdXNzLiBIbW0uLnN0aW1tdCBkYXMgc28/ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBmb3Iocj0xO3I8PU1BWFI7cisrKXsKKyAgICAgIHY9c3RhcnQtPnJlZ3Zbcl07CisgICAgICBpZih2JiZ2LT5pbmRleDx2Y291bnQtcmNvdW50JiZCVFNUKHN0YXJ0LT5hdl9pbix2LT5pbmRleCkpeworCWZvcihpPTA7aTx2Y291bnQtcmNvdW50O2krKykKKwkgIGlmKHYtPmluZGV4IT1pJiZzYXZpbmdzW2ldW3JdIT1JTlRfTUlOKQorCSAgICBzYXZpbmdzW2ldW3JdLT1jb3N0X2xvYWRfcmVnKHIsdmlsaXN0W2ldKTsKKyAgICAgIH0KKyAgICAgIGlmKHYmJnYtPmluZGV4PHZjb3VudC1yY291bnQmJkJUU1QoZy0+YXZfb3V0LHYtPmluZGV4KSl7CisJZm9yKGk9MDtpPHZjb3VudC1yY291bnQ7aSsrKQorCSAgaWYodi0+aW5kZXghPWkmJnNhdmluZ3NbaV1bcl0hPUlOVF9NSU4pCisJICAgIHNhdmluZ3NbaV1bcl0tPWNvc3Rfc2F2ZV9yZWcocix2aWxpc3RbaV0pOworICAgICAgfQorICAgIH0KKyAgICBnPXN0YXJ0LT5ub3JtYWxvdXQ7CisgIH1lbHNleworICAgIGl0ZXJhdGlvbnM9MTsKKyAgICAvKiAgQmVpIFJlZ2lzdGVydmVyZ2FiZSBmdWVyIGRpZSBnYW56ZSBGdW5rdGlvbiBtdWVzc2VuIGFsbGUgYmVpbSAgICovCisgICAgLyogIEVpbnRyaXR0IGRlciBGdW5rdGlvbiBha3RpdmVuIFZhcmlhYmxlbiBnZWxhZGVuIHdlcmRlbi4gICAgICAgICAqLworICAgIC8qIHN0YXRpY3MgaGF2ZSB0byBiZSBzYXZlZCBhdCB0aGUgZW5kICovCisgICAgaWYoREVCVUcmOTIxNikgcHJpbnRmKCJhc3NpZ25pbmcgcmVncyB0byB3aG9sZSBmdW5jdGlvblxuIik7CisgICAgZm9yKGk9MDtpPHZjb3VudC1yY291bnQrY29uc3RfdmFycztpKyspeworICAgICAgaWYoaTx2Y291bnQtcmNvdW50JiYodmlsaXN0W2ldLT5zdG9yYWdlX2NsYXNzPT1TVEFUSUN8fHZpbGlzdFtpXS0+c3RvcmFnZV9jbGFzcz09RVhURVJOKSl7CisJZm9yKHI9MTtyPD1NQVhSO3IrKykKKwkgIGlmKHNhdmluZ3NbaV1bcl0hPUlOVF9NSU4pCisJICAgIHNhdmluZ3NbaV1bcl0tPWNvc3Rfc2F2ZV9yZWcocix2aWxpc3RbaV0pOworICAgICAgfQorICAgICAgaWYoaT49dmNvdW50LXJjb3VudHx8QlRTVChzdGFydC0+YXZfaW4saSkpeworCWludCBwcj1hYnModmlsaXN0W2ldLT5yZWcpOworCWZvcihyPTE7cjw9TUFYUjtyKyspeworCSAgaWYoc2F2aW5nc1tpXVtyXSE9SU5UX01JTil7CisJICAgIGlmKHByPT0wKXsKKwkgICAgICBzYXZpbmdzW2ldW3JdLT1jb3N0X2xvYWRfcmVnKHIsdmlsaXN0W2ldKTsKKwkgICAgfWVsc2UgaWYoIXJlZ3NhW3JdKXsKKwkgICAgICBpZihyPT1wcikKKwkJc2F2aW5nc1tpXVtyXSs9Y29zdF9zYXZlX3JlZyhyLHZpbGlzdFtpXSk7CisJICAgICAgZWxzZQorCQkvKiBmYWN0b3Igb2YgMiwgYmVjYXVzZSBsb2FkX3Bhcm1zIGlzIG5vdCBhbHdheXMgb3B0aW1hbCAqLworCQlzYXZpbmdzW2ldW3JdKz0oY29zdF9zYXZlX3JlZyhyLHZpbGlzdFtpXSktY29zdF9tb3ZlX3JlZyhwcixyKSkvMjsKKwkgICAgfQorCSAgfQorCX0KKyAgICAgIH0KKyAgICB9CisgICAgLyogIE5vbnNjcmF0Y2hyZWdpc3RlciBtdWVzc2VuIGdlbGFkZW4vZ2VzaWNoZXJ0IHdlcmRlbi4gKi8KKyAgICAvKkZJWE1FOiBlaW5pZ2UgdW5zY2hvZW5lIEVmZmVrdGUoPykgKi8KKyAgICBpZighaW50YXNrKXsKKyAgICAgIGZvcihyPTE7cjw9TUFYUjtyKyspeworCWlmKCFyZWdzY3JhdGNoW3JdJiYhcmVnc2Fbcl0peworCSAgZm9yKGk9MDtpPHZjb3VudC1yY291bnQrY29uc3RfdmFycztpKyspCisJICAgIGlmKHNhdmluZ3NbaV1bcl0hPUlOVF9NSU4pCisJICAgICAgc2F2aW5nc1tpXVtyXS09Y29zdF9wdXNocG9wX3JlZyhyKTsKKwl9CisgICAgICB9CisgICAgfQorICAgIGc9c3RhcnQ7CisgIH0KKyAgaWYoREVCVUcmOTIxNikgcHJpbnRmKCJjYWxjdWxhdGluZyBhcHByb3hpbWF0ZSBzYXZpbmdzXG4iKTsKKworICBsZW5kPTA7CisgIGZvcig7ZztnPWctPm5vcm1hbG91dCl7CisgICAgSUMgKnA7VmFyICp2OworICAgIGludCB0LHZ0OworICAgIGlmKCFlbmQmJiFsZW5kKXsKKyAgICAgIGxlbmQ9Zy0+bG9vcGVuZDsKKyAgICAgIGlmKGxlbmQmJml0ZXJhdGlvbnM9PTEmJiFvcHRzaXplKSBpdGVyYXRpb25zPTQ7CisgICAgfQorCisgICAgLyogIFdlbm4gZGFzIFJlZ2lzdGVyIGluIGRlbSBCbG9jayBiZW51dHp0IHdpcmQsIG11c3MgbWFuIGVzIHJldHRlbiAqLworICAgIGZvcihyPTE7cjw9TUFYUjtyKyspeworICAgICAgaWYoQlRTVChnLT5yZWd1c2VkLHIpfHwocmVnX3BhaXIociwmcnApJiYoQlRTVChnLT5yZWd1c2VkLHJwLnIxKXx8QlRTVChnLT5yZWd1c2VkLHJwLnIyKSkpKXsKKwlpbnQgdmk7CisJaWYoZy0+cmVndltyXSkgdmk9Zy0+cmVndltyXS0+aW5kZXg7IGVsc2Ugdmk9LTE7CisJZm9yKGk9MDtpPHZjb3VudC1yY291bnQrY29uc3RfdmFycztpKyspeworCSAgaWYoaT49dmNvdW50LXJjb3VudHx8QlRTVChnLT5hdl9vdXQsaSl8fEJUU1QoZy0+YXZfZ2VuLGkpKQorCSAgICBpZih2aSE9aSYmc2F2aW5nc1tpXVtyXSE9SU5UX01JTikKKwkgICAgICBzYXZpbmdzW2ldW3JdLT1pdGVyYXRpb25zKihjb3N0X2xvYWRfcmVnKHIsdmlsaXN0W2ldKStjb3N0X3NhdmVfcmVnKHIsdmlsaXN0W2ldKSk7CisJfQorICAgICAgfQorICAgIH0KKyAgICBtZW1jcHkoaXN1c2VkLGctPmF2X291dCx2c2l6ZSk7CisgICAgcD1nLT5lbmQ7CisgICAgd2hpbGUocCl7CisgICAgICBpZigocC0+cTEuZmxhZ3MmKFZBUnxWQVJBRFJ8UkVHKSk9PVZBUil7CisJdj1wLT5xMS52O3Z0PXYtPnZ0eXAtPmZsYWdzOworICAgICAgICAvKiB2bGEgKi8KKyAgICAgICAgaWYoSVNBUlJBWSh2dCkmJmlzX3ZsZW5ndGgodi0+dnR5cCkpCisgICAgICAgICAgdnQ9UE9JTlRFUl9UWVBFKHYtPnZ0eXAtPm5leHQpOworCWlmKChvcHRmbGFncyYxMDI0KXx8KCh2LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHx2LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikmJiEodi0+ZmxhZ3MmVVNFREFTQURSKSkpeworCSAgaT12LT5pbmRleDsKKwkgIGlmKHAtPmNvZGU9PUFERFJFU1N8fCgocC0+Y29kZT09QVNTSUdOfHxwLT5jb2RlPT1QVVNIKSYmKHExdHlwKHApJk5RKT09KENIQVIpJiYhem1lcXRvKHAtPnEyLnZhbC52bWF4LGwyem0oMUwpKSkpeworCSAgICBmb3Iocj0xO3I8PU1BWFI7cisrKQorCSAgICAgIHNhdmluZ3NbaV1bcl09SU5UX01JTjsKKwkgIH1lbHNleworCSAgICBmb3Iocj0xO3I8PU1BWFI7cisrKXsKKwkgICAgICBpZighcmVnc2Fbcl0mJiFCVFNUKGctPnJlZ3VzZWQscikmJnNhdmluZ3NbaV1bcl0hPUlOVF9NSU4mJnJlZ29rKHIsdnQsLTEpJiYoIXJlZ19wYWlyKHIsJnJwKXx8KCFyZWdzYVtycC5yMV0mJiFyZWdzYVtycC5yMl0mJiFCVFNUKGctPnJlZ3VzZWQscnAucjEpJiYhQlRTVChnLT5yZWd1c2VkLHJwLnIyKSkpKXsKKwkJaW50IHM9Y29zdF9zYXZpbmdzKHAsciwmcC0+cTEpOworCQlpZihzPT1JTlRfTUlOfHxzYXZpbmdzW2ldW3JdPT1JTlRfTUlOKQorCQkgIHNhdmluZ3NbaV1bcl09SU5UX01JTjsKKwkJZWxzZQorCQkgIHNhdmluZ3NbaV1bcl0rPWl0ZXJhdGlvbnMqczsKKwkgICAgICB9CisJICAgIH0KKwkgIH0KKwl9CisgICAgICB9CisgICAgICBpZigocC0+cTIuZmxhZ3MmKFZBUnxWQVJBRFJ8UkVHKSk9PVZBUil7CisJdj1wLT5xMi52O3Z0PXYtPnZ0eXAtPmZsYWdzOworICAgICAgICAvKiB2bGEgKi8KKyAgICAgICAgaWYoSVNBUlJBWSh2dCkmJmlzX3ZsZW5ndGgodi0+dnR5cCkpCisgICAgICAgICAgdnQ9UE9JTlRFUl9UWVBFKHYtPnZ0eXAtPm5leHQpOworCWlmKChvcHRmbGFncyYxMDI0KXx8KCh2LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHx2LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikmJiEodi0+ZmxhZ3MmVVNFREFTQURSKSkpeworCSAgaT12LT5pbmRleDsKKwkgIGZvcihyPTE7cjw9TUFYUjtyKyspeworCSAgICBpZighcmVnc2Fbcl0mJiFCVFNUKGctPnJlZ3VzZWQscikmJnNhdmluZ3NbaV1bcl0hPUlOVF9NSU4mJnJlZ29rKHIsdnQsLTEpJiYoIXJlZ19wYWlyKHIsJnJwKXx8KCFyZWdzYVtycC5yMV0mJiFyZWdzYVtycC5yMl0mJiFCVFNUKGctPnJlZ3VzZWQscnAucjEpJiYhQlRTVChnLT5yZWd1c2VkLHJwLnIyKSkpKXsKKwkgICAgICBpbnQgcz1jb3N0X3NhdmluZ3MocCxyLCZwLT5xMik7CisJICAgICAgaWYocz09SU5UX01JTnx8c2F2aW5nc1tpXVtyXT09SU5UX01JTikKKwkJc2F2aW5nc1tpXVtyXT1JTlRfTUlOOworCSAgICAgIGVsc2UKKwkJc2F2aW5nc1tpXVtyXSs9aXRlcmF0aW9ucypzOworCSAgICB9CisJICB9CisJfQorICAgICAgfQorICAgICAgaWYoKHAtPnouZmxhZ3MmKFZBUnxWQVJBRFJ8UkVHKSk9PVZBUil7CisJdj1wLT56LnY7dnQ9di0+dnR5cC0+ZmxhZ3M7CisgICAgICAgIGlmKElTQVJSQVkodnQpJiZpc192bGVuZ3RoKHYtPnZ0eXApKQorICAgICAgICAgIHZ0PVBPSU5URVJfVFlQRSh2LT52dHlwLT5uZXh0KTsKKwlpZigob3B0ZmxhZ3MmMTAyNCl8fCgodi0+c3RvcmFnZV9jbGFzcz09QVVUT3x8di0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpJiYhKHYtPmZsYWdzJlVTRURBU0FEUikpKXsKKwkgIGk9di0+aW5kZXg7CisJICBpZihwLT5jb2RlPT1BU1NJR04mJih6dHlwKHApJk5RKT09KENIQVIpJiYhem1lcXRvKHAtPnEyLnZhbC52bWF4LGwyem0oMUwpKSl7CisJICAgIGZvcihyPTE7cjw9TUFYUjtyKyspCisJICAgICAgc2F2aW5nc1tpXVtyXT1JTlRfTUlOOworCSAgfQorCSAgZm9yKHI9MTtyPD1NQVhSO3IrKyl7CisJICAgIGlmKCFyZWdzYVtyXSYmIUJUU1QoZy0+cmVndXNlZCxyKSYmc2F2aW5nc1tpXVtyXSE9SU5UX01JTiYmcmVnb2socix2dCwtMSkmJighcmVnX3BhaXIociwmcnApfHwoIXJlZ3NhW3JwLnIxXSYmIXJlZ3NhW3JwLnIyXSYmIUJUU1QoZy0+cmVndXNlZCxycC5yMSkmJiFCVFNUKGctPnJlZ3VzZWQscnAucjIpKSkpeworCSAgICAgIGludCBzPWNvc3Rfc2F2aW5ncyhwLHIsJnAtPnopOworCSAgICAgIGlmKHM9PUlOVF9NSU58fHNhdmluZ3NbaV1bcl09PUlOVF9NSU4pCisJCXNhdmluZ3NbaV1bcl09SU5UX01JTjsKKwkgICAgICBlbHNlCisJCXNhdmluZ3NbaV1bcl0rPWl0ZXJhdGlvbnMqczsKKwkgICAgfQorCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIC8qIGJlaSBGdW5rdGlvbnNhdWZydWYgemVyc3RvZXJ0Li4uICovCisgICAgICBpZihwLT5jb2RlPT1DQUxMKXsKKwlpZigocC0+cTEuZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUiYmcC0+cTEudi0+ZmkmJihwLT5xMS52LT5maS0+ZmxhZ3MmQUxMX1JFR1MpJiYhKGRpc2FibGUmMjA0OCkpeworCSAgZm9yKGk9MDtpPHZjb3VudC1yY291bnQrY29uc3RfdmFycztpKyspeworCSAgICBpZihpPj12Y291bnQtcmNvdW50fHxCVFNUKGlzdXNlZCxpKSl7CisJICAgICAgZm9yKHI9MTtyPD1NQVhSO3IrKyl7CisJCWlmKHJlZ3NjcmF0Y2hbcl0mJnNhdmluZ3NbaV1bcl0hPUlOVF9NSU4mJkJUU1QocC0+cTEudi0+ZmktPnJlZ3NfbW9kaWZpZWQscikpCisJCSAgc2F2aW5nc1tpXVtyXS09aXRlcmF0aW9ucyooY29zdF9sb2FkX3JlZyhyLHZpbGlzdFtpXSkrY29zdF9zYXZlX3JlZyhyLHZpbGlzdFtpXSkpOworCSAgICAgIH0KKwkgICAgfQkgIAorCSAgfQorCX1lbHNleworCSAgZm9yKGk9MDtpPHZjb3VudC1yY291bnQrY29uc3RfdmFycztpKyspeworCSAgICBpZihpPj12Y291bnQtcmNvdW50fHxCVFNUKGlzdXNlZCxpKSl7CisJICAgICAgZm9yKHI9MTtyPD1NQVhSO3IrKyl7CisJCWlmKHJlZ3NjcmF0Y2hbcl0mJnNhdmluZ3NbaV1bcl0hPUlOVF9NSU4pCisJCSAgc2F2aW5nc1tpXVtyXS09aXRlcmF0aW9ucyooY29zdF9sb2FkX3JlZyhyLHZpbGlzdFtpXSkrY29zdF9zYXZlX3JlZyhyLHZpbGlzdFtpXSkpOworCSAgICAgIH0KKwkgICAgfQorCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGlmKHA9PWctPnN0YXJ0KSBicmVhazsKKyAgICAgIGlmKHAtPmNoYW5nZV9jbnQhPTB8fHAtPnVzZV9jbnQhPTApCisJYXZfdXBkYXRlKHAsaXN1c2VkKTsKKyAgICAgIHA9cC0+cHJldjsKKyAgICB9CisgICAgaWYoZz09ZW5kKSBicmVhazsKKyAgICBpZighZW5kKXsKKyAgICAgIGlmKGc9PWxlbmQpIHtsZW5kPTA7aXRlcmF0aW9ucz0xO30KKyAgICB9CisgIH0KKyAgLyogIE1heGltdW0gZXJtaXR0ZWxuICAgKi8KKyAgbWVtc2V0KGJyZWdzLDAsc2l6ZW9mKGJyZWdzKSk7CisgIGZvcihpPTA7aTx2Y291bnQtcmNvdW50K2NvbnN0X3ZhcnM7aSsrKXsKKyAgICBpbnQgbT0wLHQ7VmFyICp2OworICAgIHY9dmlsaXN0W2ldO3Q9di0+dnR5cC0+ZmxhZ3M7CisgICAgaWYoSVNBUlJBWSh0KSYmaXNfdmxlbmd0aCh2LT52dHlwKSkKKyAgICAgIHQ9UE9JTlRFUl9UWVBFKHYtPnZ0eXAtPm5leHQpOworICAgIGlmKCEob3B0ZmxhZ3MmMTAyNCkmJigodi0+c3RvcmFnZV9jbGFzcyE9QVVUTyYmdi0+c3RvcmFnZV9jbGFzcyE9UkVHSVNURVIpfHwodi0+ZmxhZ3MmVVNFREFTQURSKSkpeworICAgICAgZm9yKHI9MDtyPD1NQVhSO3IrKykKKwlzYXZpbmdzW2ldW3JdPUlOVF9NSU47CisgICAgfWVsc2V7CisgICAgICBpbnQgb25lPTA7CisgICAgICBmb3Iocj0xO3I8PU1BWFI7cisrKXsKKwkvKiAgVmFyaWFibGVzIHNob3VsZCBoYXZlIGJlZW4gcHV0IHRvIGFyZ3VtZW50IHJlZ2lzdGVycyBieSBsb2NhbF9yZWdzKCkgICovCisJLyppZihyPT1hYnModi0+cmVnKSYmISh2LT5mbGFncyZSRUdQQVJNKSkgc2F2aW5nc1tpXVtyXT1JTlRfTUFYOyovCisJaWYocmVnc2Fbcl18fCFyZWdvayhyLHQsLTEpKSBzYXZpbmdzW2ldW3JdPUlOVF9NSU47CisJaWYoc2F2aW5nc1tpXVtyXT5tKXsKKwkgIG09c2F2aW5nc1tpXVtyXTsKKwkgIG9uZT1yOworCX1lbHNlIGlmKHNhdmluZ3NbaV1bcl09PW0peworCSAgb25lPTA7CisJfQorICAgICAgfQorICAgICAgc2F2aW5nc1tpXVswXT1tOworICAgICAgaWYob25lKSBCU0VUKGJyZWdzLG9uZSk7IC8qIG1hcmsgb25lIHJlZ2lzdGVyIGhhcyB1bmlxdWUgdmFsdWUgKi8KKyAgICB9CisgIH0KKyAgaWYoREVCVUcmODE5Mil7CisgICAgZm9yKGk9MDtpPHZjb3VudC1yY291bnQrY29uc3RfdmFycztpKyspeworICAgICAgcHJpbnRmKCIoJXMpLCVsZChiZXN0PSVkKTpcbiIsdmlsaXN0W2ldLT5pZGVudGlmaWVyLHptMmwodmlsaXN0W2ldLT5vZmZzZXQpLHNhdmluZ3NbaV1bMF0pOworICAgICAgZm9yKHI9MTtyPD1NQVhSO3IrKykKKwlwcmludGYoIiVzPSVkICIscmVnbmFtZXNbcl0sc2F2aW5nc1tpXVtyXSk7CisgICAgICBwcmludGYoIlxuIik7CisgICAgfQorICAgIGZvcihyPTA7cjw9TUFYUjtyKyspCisgICAgICBpZihCVFNUKGJyZWdzLHIpKQorCXByaW50ZigicmVnICVzIHVuaXF1ZVxuIixyZWduYW1lc1tyXSk7CisgIH0KKyAgLyogIFN1Y2hlbiwgd2VsY2hlIFZhcmlhYmxlbi9SZWdpc3RlcmtvbWJpbmF0aW9uIGRhcyBiZXN0ZSBFcmdlYm5pcyAqLworICAvKiAgbGllZmVydC4gTnVyIGFuZ2VuYWVoZXJ0LCBkYSBzb25zdCB3b2hsIHp1IGF1ZndlbmRpZy4gU2ltcGxleD8gICovCisgIGZvcihpPTA7aTx2Y291bnQtcmNvdW50K2NvbnN0X3ZhcnM7aSsrKSBydmxpc3RbaV09aTsKKyAgdnFzb3J0KHJ2bGlzdCx2Y291bnQtcmNvdW50K2NvbnN0X3ZhcnMsc2l6ZW9mKCpydmxpc3QpLGNtcF9zYXZpbmdzKTsKKyAgZm9yKGk9MDtpPHZjb3VudC1yY291bnQrY29uc3RfdmFycztpKyspeworICAgIGludCB1c2U9MCxtPTAscHJpbz0wLHZpOworICAgIHZpPXJ2bGlzdFtpXTsKKyAgICAvKmlmKHZpbGlzdFt2aV0tPmZsYWdzJlVTRURBU0FEUikgY29udGludWU7Ki8KKyAgICBpZihERUJVRyY4MTkyKSBwcmludGYoIiVkOiAoJXMpLCVsZChiZXN0PSVkKVxuIixpLHZpbGlzdFt2aV0tPmlkZW50aWZpZXIsem0ybCh2aWxpc3RbdmldLT5vZmZzZXQpLHNhdmluZ3NbdmldWzBdKTsKKyAgICBmb3Iocj0xO3I8PU1BWFI7cisrKXsKKyAgICAgIGlmKCFscmVnc1tyXSYmIXJlZ3Vbcl0mJnNhdmluZ3NbdmldW3JdPj1tJiYoIXJlZ19wYWlyKHIsJnJwKXx8KCFyZWd1W3JwLnIxXSYmIXJlZ3VbcnAucjJdKSkpeworCWludCBiZXR0ZXI9MDsKKwlpZihzYXZpbmdzW3ZpXVtyXT5tKXsKKwkgIGJldHRlcj0xOworCX1lbHNlIGlmKHNhdmluZ3NbdmldW3JdPT1tKXsKKwkgIGlmKHJlZ19wcmlvW3JdPnByaW8peworCSAgICBiZXR0ZXI9MTsKKwkgIH1lbHNlIGlmKEJUU1QoYnJlZ3MsdXNlKSYmIUJUU1QoYnJlZ3MscikpeworCSAgICBiZXR0ZXI9MTsKKwkgIH0KKwl9CisJaWYoYmV0dGVyKXsKKwkgIG09c2F2aW5nc1t2aV1bcl07cHJpbz1yZWdfcHJpb1tyXTsKKwkgIHVzZT1yOworCX0KKyAgICAgIH0KKyAgICB9CisgICAgaWYobT4wJiZjaGVja19jYWNoZWFibGUodmksc3RhcnQsZW5kKSl7CisgICAgICBpZihERUJVRyY5MjE2KSBwcmludGYoImFzc2lnbmVkICglcyksJWxkKCVwKSB0byAlcywgc2F2aW5nPSVkXG4iLHZpbGlzdFt2aV0tPmlkZW50aWZpZXIsem0ybCh2aWxpc3RbdmldLT5vZmZzZXQpLCh2b2lkICopdmlsaXN0W3ZpXSxyZWduYW1lc1t1c2VdLG0pOworICAgICAgbHJlZ3NbdXNlXT12aWxpc3RbdmldOworICAgICAgcmVndVt1c2VdPTE7CisgICAgICBpZihyZWdfcGFpcih1c2UsJnJwKSkKKwlyZWd1W3JwLnIxXT1yZWd1W3JwLnIyXT0xOworICAgIH0KKyAgfQorICAvKiAgUmVnaXN0ZXJ2YXJpYWJsZW4gaW4gYWxsZSBCbG9lY2tlIGRlciBTY2hsZWlmZSBlaW50cmFnZW4gICAgKi8KKyAgLyogIGRhYmVpIGJlcnVlY2tzaWNodGlnZW4sIGRhc3Mgc2llIGluIG1hbmNoZW4gQmxvZWNrZW4gbmljaHQgICovCisgIC8qICBpbiBSZWdpc3RlciBrb21tZW4ga29lbm5lbiwgd2VubiBkYXMgUmVnaXN0ZXIgZGEgc2Nob24gdm9uICAqLworICAvKiAgbG9jYWxfcmVncyBiZW51dHp0IHdpcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIEdlZ2ViZW5lbmZhbGxzIGF1Y2ggaW4gSGVhZGVyL0Zvb3RlciBlaW5lciBTY2hsZWlmZSAgICAgICAgICovCisgIC8qICBlaW50cmFnZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBpZihERUJVRyY5MjE2KSBwcmludGYoInByb3BhZ2F0ZSByZWdpc3RlciB2YXJzXG4iKTsKKyAgZm9yKGc9c3RhcnQ7ZztnPWctPm5vcm1hbG91dCl7CisgICAgZm9yKHI9MTtyPD1NQVhSO3IrKyl7CisgICAgICBpZihscmVnc1tyXSYmIUJUU1QoZy0+cmVndXNlZCxyKSYmKCFyZWdfcGFpcihyLCZycCl8fCghQlRTVChnLT5yZWd1c2VkLHJwLnIxKSYmIUJUU1QoZy0+cmVndXNlZCxycC5yMikpKSl7CisJLyogIEZhbGxzIFZhcmlhYmxlIHNjaG9uIGluIGFuZGVyZW0gUmVnaXN0ZXIsIGxvZXNjaGVuICAqLworCWZvcihpPTE7aTw9TUFYUjtpKyspeworCSAgaWYoZy0+cmVndltpXT09bHJlZ3Nbcl0pIGctPnJlZ3ZbaV09MDsKKwkgIGlmKHJlZ19wYWlyKGksJnJwKSl7CisJICAgIGlmKHJwLnIxPT1yfHxycC5yMj09cikgZy0+cmVndltpXT0wOworCSAgfQorCX0KKwlnLT5yZWd2W3JdPWxyZWdzW3JdOworCWlmKHJlZ19wYWlyKHIsJnJwKSkgZy0+cmVndltycC5yMV09Zy0+cmVndltycC5yMl09MDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoZW5kJiZnPT1lbmQtPm5vcm1hbG91dCkgYnJlYWs7CisgIH0KK30KK3ZvaWQgYmxvY2tfcmVncyhmbG93Z3JhcGggKmZnKQorLyogIG1hY2h0IGRpZSBWYXJpYWJsZW56dXdlaXN1bmcgZnVlciBlaW56ZWxuZSBCbG9lY2tlICAqLworeworICAgIGZsb3dncmFwaCAqZywqKmZncDsKKyAgICBpbnQgaSxyLGNoYW5nZWQsZmd6OworICAgIGlmKERFQlVHJjkyMTYpIHByaW50ZigiYmxvY2tfcmVnc1xuIik7CisKKyAgICBzYXZpbmdzPW15bWFsbG9jKCh2Y291bnQtcmNvdW50KSpzaXplb2YoKnNhdmluZ3MpKTsKKyAgICBydmxpc3Q9bXltYWxsb2MoKHZjb3VudC1yY291bnQpKnNpemVvZigqcnZsaXN0KSk7CisKKyAgICAvKiAgQXJyYXkgYXVmIEJsb2Vja2UgaW0gRmx1c3NncmFwaGVuIG1hbmdlbHMgZG9wcGVsdGVyIFZlcmtldHR1bmcgICovCisgICAgZmdwPW15bWFsbG9jKGJhc2ljX2Jsb2NrcypzaXplb2YoKmZncCkpOworICAgIGc9Zmc7Zmd6PTA7CisgICAgd2hpbGUoZyl7CisgICAgICAgIGZncFtmZ3pdPWc7Zmd6Kys7CisgICAgICAgIGc9Zy0+bm9ybWFsb3V0OworICAgIH0KKyAgICBpZihmZ3o+YmFzaWNfYmxvY2tzKSBpZXJyb3IoMCk7IGVsc2UgYmFzaWNfYmxvY2tzPWZnejsKKyAgICAvKiAgYWxsZSBhdWYgMCAgKi8KKyAgICBkb3sKKyAgICAgICAgY2hhbmdlZD0wOworICAgICAgICBpZihERUJVRyY5MjE2KSBwcmludGYoImJsb2NrX3JlZ3MgcGFzc1xuIik7CisgICAgICAgIGZvcihmZ3o9YmFzaWNfYmxvY2tzLTE7Zmd6Pj0wO2Znei0tKXsKKyAgICAgICAgICAgIElDICpwO1ZhciAqdjtmbG93bGlzdCAqbHA7CisgICAgICAgICAgICBpbnQgdCx2dDsKKyAgICAgICAgICAgIGc9ZmdwW2Znel07CisgICAgICAgICAgICBpZihERUJVRyY4MTkyKSBwcmludGYoImFzc2lnbmluZyByZWdzIHRvIGJsb2NrICVkXG4iLGctPmluZGV4KTsKKyAgICAgICAgICAgIC8qICBiZXJlY2huZW4sIHdpZXZpZWwgdW5nZWZhZWhyIGVpbmdlc3BhcnQgd2lyZCwgd2VubiBlaW5lIFZhcmlhYmxlICAgICovCisgICAgICAgICAgICAvKiAgZnVlciBkaWVzZW4gQmxvY2sgaW4gZWluZW0gYmVzdC4gUmVnaXN0ZXIgZ2VoYWx0ZW4gd2lyZCAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYoREVCVUcmODE5MikgcHJpbnRmKCJjYWxjdWxhdGluZyBhcHByb3hpbWF0ZSBzYXZpbmdzXG4iKTsKKworICAgICAgICAgICAgZm9yKGk9MDtpPHZjb3VudC1yY291bnQ7aSsrKXsKKyAgICAgICAgICAgICAgICBmb3Iocj0xO3I8PU1BWFI7cisrKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoIWctPnJlZ3Zbcl18fGctPnJlZ3Zbcl0tPmluZGV4IT1pKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3PTA7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiAgVmFyaWFibGUgbXVzcyBldnRsLiBnZWxhZGVuL2dlc3BlaWNoZXJ0IHdlcmRlbiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKEJUU1QoZy0+YXZfaW4saSkpIHctLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKEJUU1QoZy0+YXZfb3V0LGkpKSB3LS07CisgICAgICAgICAgICAgICAgICAgICAgICBzYXZpbmdzW2ldW3JdPXc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihnLT5jYWxscz4wKXsKKyAgICAgICAgICAgIC8qICBiZWkgRnVua3Rpb25zYXVmcnVmZW4gbXVlc3NlbiBTY3JhdGNocmVnaXN0ZXIgZ2VzcGVpY2hlcnQgd2VyZGVuICovCisgICAgICAgICAgICAgICAgZm9yKHI9MTtyPD1NQVhSO3IrKykKKyAgICAgICAgICAgICAgICAgICAgaWYocmVnc2NyYXRjaFtyXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpPTA7aTx2Y291bnQtcmNvdW50O2krKykgc2F2aW5nc1tpXVtyXS09Zy0+Y2FsbHMqMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qICBXZW5uIFZvcmdhZW5nZXIvTmFjaGZvbGdlciBzZWxiZSBWYXJpYWJsZSBpbSBzZWxiZW4gKi8KKyAgICAgICAgICAgIC8qICBSZWdpc3RlciBoYXQsIGVudGZhZWxsdCBMYWRlbi9TcGVpY2hlcm4gaW4gZGllc2VtICAgKi8KKyAgICAgICAgICAgIC8qICBCbG9jayB1bmQgdmVybXV0bGljaCBhdWNoIGltIFZvcmdhZW5nZXIvTmFjaGZvbGdlciAgKi8KKyAgICAgICAgICAgIC8qICBuaWNodCBpbW1lciwgYWJlciBuYWVoZXJ1bmdzd2Vpc2UuLi4gICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGxwPWctPmluOworICAgICAgICAgICAgd2hpbGUobHApeworICAgICAgICAgICAgICAgIGlmKGxwLT5ncmFwaCl7CisgICAgICAgICAgICAgICAgICAgIGZvcihyPTE7cjw9TUFYUjtyKyspeworICAgICAgICAgICAgICAgICAgICAgICAgaWYobHAtPmdyYXBoLT5yZWd2W3JdJiZCVFNUKGctPmF2X2luLGxwLT5ncmFwaC0+cmVndltyXS0+aW5kZXgpKSBzYXZpbmdzW2xwLT5ncmFwaC0+cmVndltyXS0+aW5kZXhdW3JdKz0yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxwPWxwLT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoZy0+YnJhbmNob3V0KXsKKyAgICAgICAgICAgICAgICBmb3Iocj0xO3I8PU1BWFI7cisrKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoZy0+YnJhbmNob3V0LT5yZWd2W3JdJiZCVFNUKGctPmF2X291dCxnLT5icmFuY2hvdXQtPnJlZ3Zbcl0tPmluZGV4KSkgc2F2aW5nc1tnLT5icmFuY2hvdXQtPnJlZ3Zbcl0tPmluZGV4XVtyXSs9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihnLT5ub3JtYWxvdXQmJighZy0+bm9ybWFsb3V0LT5lbmR8fGctPm5vcm1hbG91dC0+ZW5kLT5jb2RlIT1CUkEpKXsKKyAgICAgICAgICAgICAgICBmb3Iocj0xO3I8PU1BWFI7cisrKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoZy0+bm9ybWFsb3V0LT5yZWd2W3JdJiZCVFNUKGctPmF2X291dCxnLT5ub3JtYWxvdXQtPnJlZ3Zbcl0tPmluZGV4KSkgc2F2aW5nc1tnLT5ub3JtYWxvdXQtPnJlZ3Zbcl0tPmluZGV4XVtyXSs9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHA9Zy0+c3RhcnQ7CisgICAgICAgICAgICB3aGlsZShwKXsKKyAgICAgICAgICAgICAgICBpZigocC0+cTEuZmxhZ3MmKFZBUnxWQVJBRFJ8UkVHKSk9PVZBUil7CisgICAgICAgICAgICAgICAgICAgIHY9cC0+cTEudjsKKyAgICAgICAgICAgICAgICAgICAgaWYoKHYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKSYmISh2LT5mbGFncyZVU0VEQVNBRFIpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZ0PXYtPnZ0eXAtPmZsYWdzJk5VOworICAgICAgICAgICAgICAgICAgICAgICAgaT12LT5pbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHAtPnExLmZsYWdzJkRSRUZPQkopIHQ9cC0+dHlwZiZOVTsgZWxzZSB0PTA7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3Iocj0xO3I8PU1BWFI7cisrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighcmVnc2Fbcl0mJiFCVFNUKGctPnJlZ3VzZWQscikpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgZXh0cmEgc2F2aW5nLCBmYWxscyBwYXNzZW5kZXMgUmVnIGZ1ZXIgRFJFRiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0JiZyZWdvayhyLHZ0LHQpKSBzYXZpbmdzW2ldW3JdKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlZ29rKHIsdnQsMCkpIHNhdmluZ3NbaV1bcl0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoKHAtPnEyLmZsYWdzJihWQVJ8VkFSQURSfFJFRykpPT1WQVIpeworICAgICAgICAgICAgICAgICAgICB2PXAtPnEyLnY7CisgICAgICAgICAgICAgICAgICAgIGlmKCh2LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHx2LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUikmJiEodi0+ZmxhZ3MmVVNFREFTQURSKSl7CisgICAgICAgICAgICAgICAgICAgICAgICB2dD12LT52dHlwLT5mbGFncyZOVTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGk9di0+aW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihwLT5xMi5mbGFncyZEUkVGT0JKKSB0PXAtPnR5cGYmTlU7IGVsc2UgdD0wOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHI9MTtyPD1NQVhSO3IrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXJlZ3NhW3JdJiYhQlRTVChnLT5yZWd1c2VkLHIpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGV4dHJhIHNhdmluZywgZmFsbHMgcGFzc2VuZGVzIFJlZyBmdWVyIERSRUYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodCYmcmVnb2socix2dCx0KSkgc2F2aW5nc1tpXVtyXSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZWdvayhyLHZ0LDApKSBzYXZpbmdzW2ldW3JdKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKChwLT56LmZsYWdzJihWQVJ8VkFSQURSfFJFRykpPT1WQVIpeworICAgICAgICAgICAgICAgICAgICB2PXAtPnoudjsKKyAgICAgICAgICAgICAgICAgICAgaWYoKHYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKSYmISh2LT5mbGFncyZVU0VEQVNBRFIpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZ0PXYtPnZ0eXAtPmZsYWdzJk5VOworICAgICAgICAgICAgICAgICAgICAgICAgaT12LT5pbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHAtPnouZmxhZ3MmRFJFRk9CSikgdD1wLT50eXBmJk5VOyBlbHNlIHQ9MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcihyPTE7cjw9TUFYUjtyKyspeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFyZWdzYVtyXSYmIUJUU1QoZy0+cmVndXNlZCxyKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBleHRyYSBzYXZpbmcsIGZhbGxzIHBhc3NlbmRlcyBSZWcgZnVlciBEUkVGICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHQmJnJlZ29rKHIsdnQsdCkpIHNhdmluZ3NbaV1bcl0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVnb2socix2dCwwKSkgc2F2aW5nc1tpXVtyXSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihwPT1nLT5lbmQpIGJyZWFrOworICAgICAgICAgICAgICAgIHA9cC0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qICBtb2VnbGljaGUgS2FuZGlkYXRlbiBzdWNoZW47IG11c3MgbmljaHQgaW1tZXIgZGllIGJlc3RlICovCisgICAgICAgICAgICAvKiAgS29tYmluYXRpb24gZmluZGVuLCBzb2xsdGUgYWJlciBiZWkgbG9rYWxlciBWZXJnYWJlICAgICAqLworICAgICAgICAgICAgLyogIHNlbHRlbiBlaW5lbiBVbnRlcnNjaGllZCBtYWNoZW4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZvcihyPTE7cjw9TUFYUjtyKyspeworICAgICAgICAgICAgICAgIGlmKGctPnJlZ3Zbcl18fEJUU1QoZy0+cmVndXNlZCxyKSkgY29udGludWU7CisgICAgICAgICAgICAgICAgZm9yKGk9MDtpPHZjb3VudC1yY291bnQ7aSsrKXsKKyAgICAgICAgICAgICAgICAgICAgaWYoc2F2aW5nc1tpXVtyXT4wKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnO1ZhciAqdj12aWxpc3RbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAvKiAgVmFyaWFibGUgc2Nob24gaW4gYW5kZXJlbSBSZWdpc3Rlcj8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcihmbGFnPTE7ZmxhZzw9TUFYUjtmbGFnKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZy0+cmVndltmbGFnXT09dil7ZmxhZz0tMTticmVhazt9CisgICAgICAgICAgICAgICAgICAgICAgICBpZihmbGFnPjApeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKERFQlVHJjkyMTYpIHByaW50ZigiYXNzaWduZWQgKCVzKSwlbGQoJXApIHRvICVzOyBzYXZpbmc9JWRcbiIsdmlsaXN0W2ldLT5pZGVudGlmaWVyLHptMmwodmlsaXN0W2ldLT5vZmZzZXQpLCh2b2lkICopdmlsaXN0W2ldLHJlZ25hbWVzW3JdLHNhdmluZ3NbaV1bcl0pOworCQkJICAgIGlmKHZpbGlzdFtpXSYmIXZpbGlzdFtpXS0+dnR5cC0+ZmxhZ3MpIGllcnJvcigwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLT5yZWd2W3JdPXZpbGlzdFtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkPTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9d2hpbGUoY2hhbmdlZCk7CisgICAgLyogIGpldHp0IG5vY2htYWwgZ2xvYmFsZSBSZWdpc3RlciB2ZXJnZWJlbiAqLworLyogICAgZG9fbG9vcF9yZWdzKGZncFswXSxmZ3BbYmFzaWNfYmxvY2tzLTFdKTsqLworCisgICAgZnJlZShmZ3ApOworICAgIGZyZWUocnZsaXN0KTsKKyAgICBmcmVlKHNhdmluZ3MpOworfQorCit2b2lkIGxvb3BfcmVncyhmbG93Z3JhcGggKmZnLGludCBpbnRhc2spCisvKiAgd2Vpc3QgVmFyaWFibGVuIGluIFNjaGxlaWZlbiBSZWdpc3RlciB6dSAgICAqLworeworICAgIGZsb3dncmFwaCAqZzsKKyAgICBpZihkaXNhYmxlJjQwOTYpIHJldHVybjsKKyAgICBpZihERUJVRyY5MjE2KSBwcmludGYoImFzc2lnbmluZyByZWdzIHRvIGZ1bmN0aW9uXG4iKTsKKyAgICBzYXZpbmdzPW15bWFsbG9jKCh2Y291bnQtcmNvdW50K2NvbnN0X3ZhcnMpKnNpemVvZigqc2F2aW5ncykpOworICAgIHJ2bGlzdD1teW1hbGxvYygodmNvdW50LXJjb3VudCtjb25zdF92YXJzKSpzaXplb2YoKnJ2bGlzdCkpOworICAgIGRvX2xvb3BfcmVncyhmZywwLGludGFzayk7CisgICAgaWYoREVCVUcmOTIxNikgcHJpbnRmKCJhc3NpZ25pbmcgcmVncyBpbiBsb29wc1xuIik7CisgICAgZm9yKGc9Zmc7ZztnPWctPm5vcm1hbG91dCl7CisgICAgICAgIGlmKGctPmluZGV4PT0tMSYmIShkaXNhYmxlJjMyNzY4KSkgZG9fbG9vcF9yZWdzKGcsZywwKTsKKyAgICB9CisgICAgZnJlZShydmxpc3QpOworICAgIGZyZWUoc2F2aW5ncyk7Cit9Cit2b2lkIGluc2VydF9hbGxvY3JlZyhmbG93Z3JhcGggKmZnLElDICpwLGludCBjb2RlLGludCByZWcpCisvKiAgRnVlZ3QgZWluIEFMTE9DUkVHL0ZSRUVSRUcgKGluIGNvZGUpIGhpbnRlciBwIGVpbiAtIGJlaSBwPT0wIGluICovCisvKiAgZmlyc3RfaWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgICAgSUMgKm5ldz1uZXdfSUMoKTsKKyAgICAvKiAgICBwcmludGYoIiVzICVzIixjb2RlPT1GUkVFUkVHPyJmcmVlcmVnIjoiYWxsb2NyZWciLHJlZ25hbWVzW3JlZ10pO3ByaWMyKHN0ZG91dCxwKTsqLworICAgIG5ldy0+bGluZT0wOworICAgIG5ldy0+ZmlsZT0wOworICAgIEJTRVQoZmctPnJlZ3VzZWQscmVnKTsKKyAgICBpZihyZWdfcGFpcihyZWcsJnJwKSl7CisJQlNFVChmZy0+cmVndXNlZCxycC5yMSk7CisJQlNFVChmZy0+cmVndXNlZCxycC5yMik7CisJcmVndXNlZFtycC5yMV09cmVndXNlZFtycC5yMl09MTsKKyAgICB9CisgICAgcmVndXNlZFtyZWddPTE7CisgICAgbmV3LT5jb2RlPWNvZGU7CisgICAgbmV3LT50eXBmPTA7CisgICAgbmV3LT5xMS5hbT1uZXctPnEyLmFtPW5ldy0+ei5hbT0wOworICAgIG5ldy0+cTEuZmxhZ3M9UkVHOworICAgIG5ldy0+cTEucmVnPXJlZzsKKyAgICBuZXctPnEyLmZsYWdzPW5ldy0+ei5mbGFncz0wOworICAgIG5ldy0+dXNlX2NudD1uZXctPmNoYW5nZV9jbnQ9MDsKKyAgICBuZXctPnVzZV9saXN0PW5ldy0+Y2hhbmdlX2xpc3Q9MDsKKyAgICBpbnNlcnRfSUNfZmcoZmcscCxuZXcpOworfQorCitWYXIgKmxyZWd2W01BWFIrMV0sKmZpcnN0X2NvbnN0LCpsYXN0X2NvbnN0OworZmxvd2dyYXBoICpsZmc7CitzdGF0aWMgaW50IGlzX2hlYWRlcjsKKworLyogcmUtaW5zZXJ0cyBhIGNvYmogaW50byBhbiBvYmogKi8KK3N0YXRpYyB2b2lkIGluc2VydF9jb2JqKG9iaiAqbyxvYmogKmNvKQoreworICBpbnQgZHQ9by0+ZHR5cCxkZj1vLT5mbGFncyZEUkVGT0JKOworICAqbz0qY287CisgIG8tPmZsYWdzfD1kZjsKKyAgby0+ZHR5cD1kdDsKK30KKworc3RhdGljIFZhciAqZmluZF9jb25zdF92YXIob2JqICpvLGludCB0KQoreworICBWYXIgKnY7CisgIGZvcih2PWZpcnN0X2NvbnN0O3Y7dj12LT5uZXh0KXsKKyAgICBpZigodi0+Y3R5cCZOUSk9PSh0Jk5RKSYmIWNvbXBhcmVfb2JqcyhvLCZ2LT5jb2JqLHQpKQorICAgICAgcmV0dXJuIHY7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIGNpZHg7CisKK3N0YXRpYyBWYXIgKmFkZF9jb25zdF92YXIob2JqICpvLGludCB0KQoreworICBWYXIgKnY7CisgIHN0YXRpYyB0eXBlIHZ0PXtWT0lEfSx0dDsKKyAgaW50IG09by0+ZmxhZ3M7CisgIGlmKG8tPmZsYWdzJkRSRUZPQkopeworICAgIHQ9by0+ZHR5cDsKKyAgICBvLT5mbGFncyY9fkRSRUZPQko7CisgIH0KKyAgaWYodj1maW5kX2NvbnN0X3ZhcihvLHQpKXsKKyAgICBvLT5mbGFncz1tOworICAgIHJldHVybiB2OworICB9CisgIHY9bXltYWxsb2Moc2l6ZW9mKCp2KSk7CisgIHYtPnN0b3JhZ2VfY2xhc3M9QVVUTzsKKyAgdi0+Y29iaj0qbzsKKyAgdi0+Y3R5cD10OworICB0dC5mbGFncz10OworICBpZihJU1BPSU5URVIodCkpIHR0Lm5leHQ9JnZ0OworICB2LT52dHlwPWNsb25lX3R5cCgmdHQpOworICB2LT5uZXh0PTA7CisgIHYtPmlkZW50aWZpZXI9IiBjb25zdGFudCI7CisgIHYtPmZsYWdzPTA7CisgIHYtPnJlZz0wOworI2lmZGVmIEhBVkVfVEFSR0VUX0FUVFJJQlVURVMKKyAgdi0+dGF0dHI9MDsKKyNlbmRpZgorICBjaWR4Kys7CisgIHYtPm9mZnNldD1sMnptKGNpZHgpOworICBpZihsYXN0X2NvbnN0KXsKKyAgICAgIGxhc3RfY29uc3QtPm5leHQ9djsKKyAgfWVsc2V7CisgICAgICBmaXJzdF9jb25zdD12OworICAgICAgY29uc3RfdmFycz0wOworICB9CisgIGxhc3RfY29uc3Q9djsKKyAgdi0+aW5kZXg9dmNvdW50LXJjb3VudCtjb25zdF92YXJzOworICBjb25zdF92YXJzKys7CisgIC8qIFdpciB1ZWJlcnNjaHJlaWJlbiBkaWUgRWludHJhZWdlIHZvbiB2Y291bnQtcmNvdW50IGJpcyB2Y291bnQuICovCisgIC8qIERhIHNpZSBuaWNodCBtZWhyIGJlbnV0enQgd2VyZGVuLCBzb2xsdGUgZGFzIG9rIHNlaW4uICAgICAgICAgICovCisgIHZpbGlzdD1teXJlYWxsb2ModmlsaXN0LHNpemVvZigqdmlsaXN0KSoodmNvdW50LXJjb3VudCtjb25zdF92YXJzKSk7CisgIHZpbGlzdFt2Y291bnQtcmNvdW50K2NvbnN0X3ZhcnMtMV09djsKKyAgby0+ZmxhZ3M9bTsKKyAgcmV0dXJuIHY7Cit9CisKK3ZvaWQgY3JlYXRlX2NvbnN0X3ZhcnMoZmxvd2dyYXBoICpmZykKK3sKKyAgSUMgKnA7aW50IHQ7CisgIFZhciAqdjsKKyAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJjcmVhdGluZyBjb25zdC12YXJzXG4iKTsKKyAgY2lkeD0wOworICBjb25zdF92YXJzPTA7CisgIGZpcnN0X2NvbnN0PWxhc3RfY29uc3Q9MDsKKyAgZm9yKDtmZztmZz1mZy0+bm9ybWFsb3V0KXsKKyAgICBmb3IocD1mZy0+c3RhcnQ7cDtwPXAtPm5leHQpeworICAgICAgaWYocC0+cTEuZmxhZ3MmKEtPTlNUfFZBUkFEUikpeworCXQ9cTF0eXAocCk7CisJdj1hZGRfY29uc3RfdmFyKCZwLT5xMSx0KTsKKwlwLT5xMS5mbGFncyY9fihLT05TVHxWQVJBRFIpOworCXAtPnExLmZsYWdzfD0oVkFSfFZLT05TVCk7CisJcC0+cTEudj12OworCXAtPnExLnZhbC52bWF4PWwyem0oMEwpOworICAgICAgfQorICAgICAgaWYocC0+cTIuZmxhZ3MmKEtPTlNUfFZBUkFEUikpeworCXQ9cTJ0eXAocCk7CisJdj1hZGRfY29uc3RfdmFyKCZwLT5xMix0KTsKKwlwLT5xMi5mbGFncyY9fihLT05TVHxWQVJBRFIpOworCXAtPnEyLmZsYWdzfD0oVkFSfFZLT05TVCk7CisJcC0+cTIudj12OworCXAtPnEyLnZhbC52bWF4PWwyem0oMEwpOworICAgICAgfQorICAgICAgaWYocC0+ei5mbGFncyYoS09OU1R8VkFSQURSKSl7CisJdD16dHlwKHApOworCXY9YWRkX2NvbnN0X3ZhcigmcC0+eix0KTsKKwlwLT56LmZsYWdzJj1+KEtPTlNUfFZBUkFEUik7CisJcC0+ei5mbGFnc3w9KFZBUnxWS09OU1QpOworCXAtPnoudj12OworCXAtPnoudmFsLnZtYXg9bDJ6bSgwTCk7CisgICAgICB9CisgICAgICBpZihwPT1mZy0+ZW5kKSBicmVhazsKKyAgICB9CisgIH0KKyAgaWYoREVCVUcmMTAyNCl7CisgICAgVmFyICp2OworICAgIHByaW50ZigiY29uc3QtdmFyczpcbiIpOworICAgIGZvcih2PWZpcnN0X2NvbnN0O3Y7dj12LT5uZXh0KXsKKyAgICAgIHByaW50ZigiJWQ6ICIsdi0+aW5kZXgpOworICAgICAgcHJvYmooc3Rkb3V0LCZ2LT5jb2JqLHYtPmN0eXApOworICAgICAgcHJpbnRmKCIgKHQ9JWQpXG4iLHYtPmN0eXApOworICAgIH0KKyAgfQorfQorCit2b2lkIGZyZWVfY29uc3RfdmFycyh2b2lkKQoreworICBWYXIgKnYsKm07CisgIGlmKERFQlVHJjEwMjQpIHByaW50ZigiZnJlZV9jb25zdF92YXJzKClcbiIpOworICBmb3Iodj1maXJzdF9jb25zdDt2Oyl7CisgICAgbT12LT5uZXh0OworICAgIGZyZWUodik7CisgICAgdj1tOworICB9Cit9CisKKyNpZiAwCitpbnQgZnJlZV9ocmVnKGZsb3dncmFwaCAqZmcsSUMgKnAsaW50IHJlZyxpbnQgbXVzdHIpCisvKiAgTWFjaHQgZGFzIFJlZ2lzdGVyIHJlZyBmcmVpLCBkYW1pdCBlcyBhbHMgbG9rYWxlIFZhcmlhYmxlIGltIElDIHAgICAqLworLyogIHp1ciBWZXJmdWVndW5nIHN0ZWh0LiBXZW5uIG11c3RyIT0wLCBtdXNzIGRhcyBSZWdpc3RlciB1bmJlZGluZ3QgICAgKi8KKy8qICBmcmVpZ2VtYWNodCB3ZXJkZW4sIGFuc29uc3RlbiBrYW5uIGRhdm9uIGFiZ2VzZWhlbiB3ZXJkZW4uICAgICAgICAgICovCit7CisgICAgSUMgKm0sKmZpcnN0O1ZhciAqdjsKKyAgICBpbnQgcHJlZ1tNQVhSKzFdPXswfSxjYWxsc1tNQVhSKzFdPXswfSxycmVnLGk7CisgICAgZmlyc3Q9MDsKKyAgICB2PWxyZWd2W3JlZ107CisgICAgaWYoIXYpCisgICAgICBpZXJyb3IoMCk7CisgICAgaWYoREVCVUcmODE5MikgcHJpbnRmKCJmcmVlX2hyZWcgJXMsJXMsJWRcbiIscmVnbmFtZXNbcmVnXSx2LT5pZGVudGlmaWVyLG11c3RyKTsKKyAgICBpZih2LT5yZWcmJiEqdi0+aWRlbnRpZmllcikgaWVycm9yKDApOworICAgIGZvcihtPXA7bTttPW0tPm5leHQpeworICAgICAgaWYobS0+Y29kZT09Q0FMTCl7CisJaWYoKG0tPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJm0tPnExLnYtPmZpJiYobS0+cTEudi0+ZmktPmZsYWdzJkFMTF9SRUdTKSl7CisJICBmb3IoaT0xO2k8PU1BWFI7aSsrKQorCSAgICBpZihCVFNUKG0tPnExLnYtPmZpLT5yZWdzX21vZGlmaWVkLGkpKSBjYWxsc1tpXSsrOworCX1lbHNleworCSAgZm9yKGk9MTtpPD1NQVhSO2krKykKKwkgICAgaWYocmVnc2NyYXRjaFtpXSkgY2FsbHNbaV0rKzsKKwl9CisgICAgICB9CisgICAgICBpZihtLT5jb2RlPT1BTExPQ1JFRyl7CisJcHJlZ1ttLT5xMS5yZWddPTE7CisJaWYobS0+cTEucmVnPT1yZWcpIGllcnJvcigwKTsKKyAgICAgIH0KKyAgICAgIGlmKG0tPmNvZGU9PUZSRUVSRUcpeworCXByZWdbbS0+cTEucmVnXT0xOworCWlmKG0tPnExLnJlZz09cmVnKSBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmKCFVU0VRMkFTWil7CisJaWYoKG0tPnEyLmZsYWdzJlZBUikmJm0tPnEyLnY9PXYmJihtLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJgorCSAgICghKG0tPnouZmxhZ3MmVkFSKXx8bS0+ei52IT12KSkKKwkgIHByZWdbbS0+ei5yZWddPTE7CisgICAgICB9CisgICAgICBpZigoKG0tPnExLmZsYWdzJlZBUikmJm0tPnExLnY9PXYpfHwKKwkgKChtLT5xMi5mbGFncyZWQVIpJiZtLT5xMi52PT12KXx8CisJICgobS0+ei5mbGFncyYoVkFSfERSRUZPQkopKT09KFZBUnxEUkVGT0JKKSYmbS0+ei52PT12KSkKKwlmaXJzdD1tOworICAgICAgLyogICAgICAgIGlmKChtLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcmJm0tPnoucmVnPT1yZWcpIGJyZWFrOyovCisgICAgfQorICAgIGlmKCFmaXJzdCkge3ByaWMoc3Rkb3V0LHApO2llcnJvcigwKTt9CisgICAgcnAucjE9cnAucjI9MDsKKyAgICBmb3IocnJlZz0wLGk9MTtpPD1NQVhSO2krKyl7CisgICAgICAgIGlmKHByZWdbaV18fHJlZ3VbaV18fHJlZ3NhW2ldfHwhcmVnb2soaSx2LT52dHlwLT5mbGFncywwKSkgY29udGludWU7CisJaWYocmVnX3BhaXIoaSwmcnApJiYocHJlZ1tycC5yMV18fHByZWdbcnAucjJdfHxyZWd1W3JwLnIxXXx8cmVndVtycC5yMl18fHJlZ3NhW3JwLnIxXXx8cmVnc2FbcnAucjJdKSkgY29udGludWU7CisgICAgICAgIGlmKGNhbGxzW2ldPT0wJiZyZWdzY3JhdGNoW2ldKXtycmVnPWk7YnJlYWs7fQorCWlmKGNhbGxzW2ldPT0wKSBycmVnPWk7CisgICAgfQorICAgIGlmKCFycmVnJiYhbXVzdHIpIHJldHVybiAwOworICAgIGZvcihtPXA7bSE9Zmlyc3QtPm5leHQ7bT1tLT5uZXh0KXsKKyAgICAgICAgaWYoKG0tPnExLmZsYWdzJlZBUikmJm0tPnExLnY9PXYpCisgICAgICAgICAgICB7aWYoIXJyZWcpIG0tPnExLmZsYWdzJj1+UkVHOyBlbHNlIG0tPnExLnJlZz1ycmVnO30KKyAgICAgICAgaWYoKG0tPnEyLmZsYWdzJlZBUikmJm0tPnEyLnY9PXYpCisgICAgICAgICAgICB7aWYoIXJyZWcpIG0tPnEyLmZsYWdzJj1+UkVHOyBlbHNlIG0tPnEyLnJlZz1ycmVnO30KKwlpZigobS0+ei5mbGFncyZWQVIpJiZtLT56LnY9PXYpCisJICB7aWYoIXJyZWcpIG0tPnouZmxhZ3MmPX5SRUc7IGVsc2UgbS0+ei5yZWc9cnJlZzt9IAorI2lmIDAKKwlpZigobS0+ei5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiZtLT56LnY9PXYpCisJICBicmVhazsKKyNlbmRpZgorICAgIH0KKyAgICBpZihycmVnKXsKKwlscmVndltycmVnXT1scmVndltyZWddOworCXJlZ3VzZWRbcnJlZ109MTtyZWd1W3JyZWddPTE7QlNFVChmZy0+cmVndXNlZCxycmVnKTsKKwlpZihyZWdfcGFpcihycmVnLCZycCkpeworCSAgICByZWd1c2VkW3JwLnIxXT0xO3JlZ3VbcnAucjFdPTE7QlNFVChmZy0+cmVndXNlZCxycC5yMSk7CisJICAgIHJlZ3VzZWRbcnAucjJdPTE7cmVndVtycC5yMl09MTtCU0VUKGZnLT5yZWd1c2VkLHJwLnIyKTsKKwl9CisgICAgfQorICAgIGxyZWd2W3JlZ109MDtyZWd1W3JlZ109MDsKKyAgICBpZihyZWdfcGFpcihyZWcsJnJwKSkKKwlyZWd1W3JwLnIxXT1yZWd1W3JwLnIyXT0wOworCisgICAgZm9yKG09Zmlyc3QtPm5leHQ7bSYmbS0+Y29kZT09RlJFRVJFRzttPW0tPm5leHQpeworICAgICAgICBpZihtLT5xMS5yZWc9PXJlZyl7CisgICAgICAgICAgICBpZighcnJlZykgcmVtb3ZlX0lDX2ZnKGZnLG0pOyBlbHNlIG0tPnExLnJlZz1ycmVnOworLyogICAgICAgICAgICBpZihycmVnKSBpbnNlcnRfYWxsb2NyZWcoZmcsZmlyc3QsRlJFRVJFRyxycmVnKTsqLworICAgICAgICAgICAgcmV0dXJuIHJyZWc7CisgICAgICAgIH0KKyAgICB9CisgICAgaW5zZXJ0X2FsbG9jcmVnKGZnLGZpcnN0LT5wcmV2LEFMTE9DUkVHLHJlZyk7CisgICAgaWYocnJlZykKKyAgICAgIGluc2VydF9hbGxvY3JlZyhmZyxmaXJzdCxGUkVFUkVHLHJyZWcpOworICAgIHJldHVybiBycmVnOworfQorI2VuZGlmCitpbnQgcmVwbGFjZV9sb2NhbF9yZWcob2JqICpvKQorLyogIHRlc3RlZCwgb2IgbyBlaW5lIFNjcmF0Y2gtVmFyaWFibGUgaXN0IHVuZCBlcnNldHp0IHNpZSBnZWdlYmVuZW5mYWxscyAgICovCit7CisgICAgaW50IGk7VmFyICp2OworICAgIGlmKChvLT5mbGFncyYoVkFSfFJFR3xWQVJBRFIpKT09VkFSKXsKKyAgICAgICAgdj1vLT52O2k9di0+aW5kZXg7CisgICAgICAgIGlmKChCVFNUKGxmZy0+YXZfa2lsbCxpKXx8aXNfaGVhZGVyKSYmIUJUU1QobGZnLT5hdl9vdXQsaSkpeworICAgICAgICAgICAgZm9yKGk9MTtpPD1NQVhSO2krKyl7CisgICAgICAgICAgICAgICAgaWYobHJlZ3ZbaV09PXYpeworICAgICAgICAgICAgICAgICAgICBvLT5mbGFnc3w9KFJFR3xTQ1JBVENIKTsKKy8qICAgICAgICAgICAgICAgICAgICBvLT5mbGFncyY9flZBUjsqLworICAgICAgICAgICAgICAgICAgICBvLT5yZWc9aTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQordm9pZCBsb2NhbF9jb21iaW5lKGZsb3dncmFwaCAqZmcpCisvKiAgVmVyc3VjaHQsIFp1d2Vpc3VuZ2VuIGRlciBGb3JtICh4KS0+dG1wIGluIGVpbiBkaXJla3QgZm9sZ2VuZGVzIElDICovCisvKiAgZWluenVnbGllZGVybi4gTnVyIGVpbmZhY2hlIFRlc3RzLCBkYSBudXIgbG9hZHMgZWxpbWluaWVydCB3ZXJkZW4gICovCisvKiAgc29sbGVuLCBkaWUgenVtIGxlaWNodGVuIEVya2VubmVuIHBlciBjc2UgZXhwbGl6aXQgd3VyZGVuLiAgICAgICAgICovCit7CisgIElDICpwLCpwcHJldjtpbnQgaSxjbDsKKyAgYnZ0eXBlICp1c2VkPW15bWFsbG9jKHZzaXplKTsKKyAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJsb2NhbCBjb21iaW5pbmdcbiIpOworICBmb3IoO2ZnO2ZnPWZnLT5ub3JtYWxvdXQpeworICAgIG1lbWNweSh1c2VkLGZnLT5hdl9vdXQsdnNpemUpOworICAgIGZvcihwPWZnLT5lbmQ7cDspeworICAgICAgaWYocC0+Y29kZT09Tk9QfHwoIXAtPnExLmZsYWdzJiYhcC0+cTIuZmxhZ3MpKXsKKwlpZihwPT1mZy0+c3RhcnQpIGJyZWFrOworCWlmKHAtPnouZmxhZ3MmVkFSKSBCU0VUKHVzZWQscC0+ei52LT5pbmRleCk7CisJcD1wLT5wcmV2OworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgcHByZXY9cC0+cHJldjsKKyAgICAgIHdoaWxlKHBwcmV2JiZwcHJldi0+Y29kZT09Tk9QKSBwcHJldj1wcHJldi0+cHJldjsKKyAgICAgIGlmKHBwcmV2JiZwLT5jb2RlPT1BU1NJR04mJnptZXF0byhwLT5xMi52YWwudm1heCxzaXpldGFiW3AtPnR5cGYmTlFdKSYmKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJnBwcmV2LT56LmZsYWdzPT1wLT5xMS5mbGFncyYmcC0+cTEudj09cHByZXYtPnoudiYmKCEocC0+ei5mbGFncyZWQVIpfHxwLT56LnYhPXAtPnExLnYpJiZ6dHlwKHBwcmV2KT09cTF0eXAocCkmJiFCVFNUKHVzZWQscC0+cTEudi0+aW5kZXgpJiYocHByZXYtPmNvZGUhPUFTU0lHTnx8em1lcXRvKHBwcmV2LT5xMi52YWwudm1heCxzaXpldGFiW3BwcmV2LT50eXBmJk5RXSkpKXsKKwkvKiB4IG9wIHkgLT50bXA7IG1vdmUgdG1wLT4qcCA9PiB4IG9wIHkgLT4qcCAqLworCWlmKERFQlVHJjEwMjQpeworCSAgcHJpbnRmKCJsb2NhbCBjb21iaW5lKDMpOlxuIik7CisJICBwcmljMihzdGRvdXQscHByZXYpO3ByaWMyKHN0ZG91dCxwKTsKKwl9CisJcHByZXYtPno9cC0+ejsKKwlwcHJldi0+Y2hhbmdlX2NudD1wLT5jaGFuZ2VfY250OworCXBwcmV2LT5jaGFuZ2VfbGlzdD1wLT5jaGFuZ2VfbGlzdDsKKwlwLT5jaGFuZ2VfY250PTA7CisJcC0+Y2hhbmdlX2xpc3Q9MDsKKwlwcHJldi0+dXNlX2xpc3Q9bXlyZWFsbG9jKHBwcmV2LT51c2VfbGlzdCwocHByZXYtPnVzZV9jbnQrcC0+dXNlX2NudCkqVkxTKTsKKwltZW1jcHkoJnBwcmV2LT51c2VfbGlzdFtwcHJldi0+dXNlX2NudF0scC0+dXNlX2xpc3QscC0+dXNlX2NudCpWTFMpOworCXBwcmV2LT51c2VfY250Kz1wLT51c2VfY250OworCXAtPnExLmZsYWdzPXAtPnouZmxhZ3M9MDsKKwlwLT5jb2RlPU5PUDsKKwkvKiByZXN0YXJ0ICovCisJbWVtY3B5KHVzZWQsZmctPmF2X291dCx2c2l6ZSk7CisJcD1mZy0+ZW5kOworCWNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoKHBwcmV2KSYmcHByZXYtPmNvZGU9PUFTU0lHTiYmem1lcXRvKHBwcmV2LT5xMi52YWwudm1heCxzaXpldGFiW3BwcmV2LT50eXBmJk5RXSkKKwkgJiZ6bWVxdG8ocHByZXYtPnEyLnZhbC52bWF4LHNpemV0YWJbcC0+dHlwZiZOUV0pCisJICYmKChwcHJldi0+cTEuZmxhZ3MmRFJFRk9CSil8fChzdGF0aWNfY3NlJiYocHByZXYtPnExLmZsYWdzJihWQVJ8VkFSQURSKSk9PVZBUiYmKHBwcmV2LT5xMS52LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk58fHBwcmV2LT5xMS52LT5zdG9yYWdlX2NsYXNzPT1TVEFUSUMpKSkmJihwcHJldi0+ei5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSCisJICYmIUJUU1QodXNlZCxwcHJldi0+ei52LT5pbmRleCkmJnBwcmV2LT56LnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE8KKwkgJiYhKHBwcmV2LT56LnYtPmZsYWdzJlVTRURBU0FEUikKKwkgJiYoKHAtPmNvZGUhPUFTU0lHTiYmcC0+Y29kZSE9UFVTSCl8fHptZXF0byhwLT5xMi52YWwudm1heCxzaXpldGFiW3AtPnR5cGYmTlFdKSkpeworCWNsPTA7CisJaT1wcHJldi0+ei52LT5pbmRleDsKKwlpZigocC0+ei5mbGFncyZWQVIpJiZwLT56LnYtPmluZGV4PT1pKSBjbD00OworCWlmKChwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSKXsKKwkgIGlmKHAtPnExLnYtPmluZGV4PT1pJiZ6bWVxdG8ocC0+cTEudmFsLnZtYXgscHByZXYtPnoudmFsLnZtYXgpKQorCSAgICBjbHw9MTsKKwl9CisJaWYoKHAtPnEyLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVIpeworCSAgaWYocC0+cTIudi0+aW5kZXg9PWkmJnptZXF0byhwLT5xMi52YWwudm1heCxwcHJldi0+ei52YWwudm1heCkpCisJICAgIGNsfD0yOworCX0KKwlpZihjbD09MXx8Y2w9PTIpeworCSAgaWYoY2whPTJ8fFVTRVEyQVNafHxjb21wYXJlX29ianMoJnBwcmV2LT5xMSwmcC0+eixwLT50eXBmKSl7CisJICAgIGlmKERFQlVHJjEwMjQpe3ByaW50ZigibG9jYWwgY29tYmluZTpcbiIpO3ByaWMyKHN0ZG91dCxwcHJldik7cHJpYzIoc3Rkb3V0LHApO30KKwkgICAgaWYoY2w9PTEpCisJICAgICAgcC0+cTE9cHByZXYtPnExOworCSAgICBlbHNlCisJICAgICAgcC0+cTI9cHByZXYtPnExOworCSAgICBwLT51c2VfbGlzdD1teXJlYWxsb2MocC0+dXNlX2xpc3QsKHAtPnVzZV9jbnQrcHByZXYtPnVzZV9jbnQpKlZMUyk7CisJICAgIG1lbWNweSgmcC0+dXNlX2xpc3RbcC0+dXNlX2NudF0scHByZXYtPnVzZV9saXN0LHBwcmV2LT51c2VfY250KlZMUyk7CisJICAgIHAtPnVzZV9jbnQrPXBwcmV2LT51c2VfY250OworCSAgICBwcHJldi0+Y29kZT1OT1A7CisJICAgIHBwcmV2LT5xMS5mbGFncz1wcHJldi0+ei5mbGFncz0wOworCSAgICBwcHJldi0+dHlwZj0wOworCSAgICAvKiByZXN0YXJ0ICovCisJICAgIG1lbWNweSh1c2VkLGZnLT5hdl9vdXQsdnNpemUpOworCSAgICBwPWZnLT5lbmQ7CisJICAgIGNvbnRpbnVlOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGlmKHA9PWZnLT5zdGFydCkgYnJlYWs7CisgICAgICBpZihwLT5xMS5mbGFncyZWQVIpIEJTRVQodXNlZCxwLT5xMS52LT5pbmRleCk7CisgICAgICBpZihwLT5xMi5mbGFncyZWQVIpIEJTRVQodXNlZCxwLT5xMi52LT5pbmRleCk7CisgICAgICBpZihwLT56LmZsYWdzJlZBUikgQlNFVCh1c2VkLHAtPnoudi0+aW5kZXgpOworICAgICAgcD1wLT5wcmV2OworICAgIH0KKyAgfQorICBmcmVlKHVzZWQpOworfQorCisvKiBGdWVndCBldnRsLiBub2V0aWdlIGFsbG9jcmVnL2ZyZWVyZWcgbmFjaCBsb2NhbF9yZWdzIGluIEJsb2NrIGVpbi4gKi8KKy8qIEthbm4gZHVyY2ggZnJlZV9ocmVnIG5vZXRpZyB3ZXJkZW4uICovCit2b2lkIGZpeF9sb2NhbF9hbGxvY3JlZyhmbG93Z3JhcGggKmZnKQoreworICBjaGFyIHJlZ3NbTUFYUisxXT17MH07CisgIElDICpwPWZnLT5lbmQ7CisgIHdoaWxlKHApeworICAgIGlmKHAtPmNvZGU9PUFMTE9DUkVHKXsKKyAgICAgIGlmKCFyZWdzW3AtPnExLnJlZ10pIGllcnJvcigwKTsKKyAgICAgIHJlZ3NbcC0+cTEucmVnXT0wOworICAgIH1lbHNlIGlmKHAtPmNvZGU9PUZSRUVSRUcpeworICAgICAgaWYocmVnc1twLT5xMS5yZWddKXsKKwlpZXJyb3IoMCk7CisgICAgICB9CisgICAgICByZWdzW3AtPnExLnJlZ109MTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKChwLT5xMS5mbGFncyZSRUcpJiYhcmVnc1twLT5xMS5yZWddKXsKKwlpbnNlcnRfYWxsb2NyZWcoZmcscCxGUkVFUkVHLHAtPnExLnJlZyk7CisJcmVnc1twLT5xMS5yZWddPTE7CisgICAgICB9CisgICAgICBpZigocC0+cTIuZmxhZ3MmUkVHKSYmIXJlZ3NbcC0+cTIucmVnXSl7CisJaW5zZXJ0X2FsbG9jcmVnKGZnLHAsRlJFRVJFRyxwLT5xMi5yZWcpOworCXJlZ3NbcC0+cTIucmVnXT0xOworICAgICAgfQorICAgICAgaWYoKHAtPnouZmxhZ3MmKFJFR3xEUkVGT0JKKSk9PShSRUd8RFJFRk9CSikmJiFyZWdzW3AtPnoucmVnXSl7CisJaW5zZXJ0X2FsbG9jcmVnKGZnLHAsRlJFRVJFRyxwLT56LnJlZyk7CisJcmVnc1twLT56LnJlZ109MTsKKyAgICAgIH0KKyAgICAgIGlmKChwLT56LmZsYWdzJihSRUd8RFJFRk9CSikpPT1SRUcpeworCWlmKCEocC0+cTEuZmxhZ3MmUkVHKXx8cC0+cTEucmVnIT1wLT56LnJlZyl7CisJICBpZighKHAtPnEyLmZsYWdzJlJFRyl8fHAtPnEyLnJlZyE9cC0+ei5yZWcpeworCSAgICBJQyAqcDI7CisJICAgIGZvcihwMj1wLT5wcmV2O3AyO3AyPXAyLT5wcmV2KXsKKwkgICAgICBpZihwMi0+Y29kZT09QUxMT0NSRUcmJnAyLT5xMS5yZWc9PXAtPnoucmVnKSBicmVhazsKKwkgICAgICBpZihwMi0+Y29kZSE9QUxMT0NSRUcmJnAyLT5jb2RlIT1GUkVFUkVHKSBicmVhazsKKwkgICAgfQorCSAgICBpZihwMi0+Y29kZSE9QUxMT0NSRUd8fHAyLT5xMS5yZWchPXAtPnoucmVnKXsKKwkgICAgICBpbnNlcnRfYWxsb2NyZWcoZmcscC0+cHJldixBTExPQ1JFRyxwLT56LnJlZyk7CisJICAgIH0KKwkgIH0KKwl9CisgICAgICB9CisgICAgfQorICAgIGlmKHA9PWZnLT5zdGFydCkgcmV0dXJuOworICAgIHA9cC0+cHJldjsKKyAgfQorfQorCisvKiBzZWFyY2hlcyBiYWNrIHRvIGRldGVybWluZSB0aGUgYmVzdCBsb2NhbCByZWdpc3RlciBmb3IgdiAKKyAgIHJlZ2lzdGVyLXBhaXJzIG11c3Qgbm90IGJlIGFsaXZlIGluIHRoZSBzYW1lIGluc3RydWN0aW9uIGFzCisgICBvbmUgb2YgdGhlIGhhbHZlcyAqLworaW50IGZpbmRfYmVzdF9sb2NhbF9yZWcoSUMgKmZwLFZhciAqdixpbnQgcHJlZmVycmVkKQoreworICBpbnQgcix1c2VkLHRtcCxzYXZpbmdzW01BWFIrMV09ezB9OworICBJQyAqcD1mcDsKKworICBpZih2LT5yZWcmJiEqdi0+aWRlbnRpZmllcikKKyAgICByZXR1cm4gYWJzKHYtPnJlZyk7CisgIGlmKHYtPnZ0eXAtPmZsYWdzJlZPTEFUSUxFKQorICAgIHJldHVybiAwOworICBpZighVVNFUTJBU1omJihwLT5xMi5mbGFncyZWQVIpJiZwLT5xMi52PT12KQorICAgIHNhdmluZ3NbcHJlZmVycmVkXT1JTlRfTUlOOworICBlbHNlCisgICAgc2F2aW5nc1twcmVmZXJyZWRdPTE7CisgIGlmKHJlZ19wYWlyKHByZWZlcnJlZCwmcnApKXsKKyAgICBzYXZpbmdzW3JwLnIxXT1JTlRfTUlOOworICAgIHNhdmluZ3NbcnAucjJdPUlOVF9NSU47CisgIH0KKyAgZm9yKHI9MTtyPD1NQVhSO3IrKyl7CisgICAgaWYocmVndVtyXXx8cmVnc2Fbcl09PVJFR1NBX05FVkVSKXsKKyAgICAgIHNhdmluZ3Nbcl09SU5UX01JTjsKKyAgICAgIGlmKHJlZ19wYWlyKHIsJnJwKSl7CisJc2F2aW5nc1tycC5yMV09SU5UX01JTjsKKwlzYXZpbmdzW3JwLnIyXT1JTlRfTUlOOworICAgICAgfQorICAgIH1lbHNlIGlmKHJlZ19wYWlyKHIsJnJwKSl7CisgICAgICBpZihycC5yMT09cHJlZmVycmVkfHxycC5yMj09cHJlZmVycmVkfHxyZWd1W3JwLnIxXXx8cmVnc2FbcnAucjFdPT1SRUdTQV9ORVZFUnx8cmVndVtycC5yMl18fHJlZ3NhW3JwLnIyXT09UkVHU0FfTkVWRVIpCisJc2F2aW5nc1tyXT1JTlRfTUlOOworICAgIH0KKyAgICBpZihzYXZpbmdzW3JdIT1JTlRfTUlOJiYhcmVnb2socix2LT52dHlwLT5mbGFncywtMSkpCisgICAgICBzYXZpbmdzW3JdPUlOVF9NSU47CisgIH0KKyAgZm9yKHI9MTtyPD1NQVhSO3IrKyl7CisgICAgaWYoc2F2aW5nc1tyXSE9SU5UX01JTiYmcmVnX3BhaXIociwmcnApKXsKKyAgICAgIGlmKHJlZ3VbcnAucjFdfHxyZWd1W3JwLnIyXXx8cmVnc2FbcnAucjFdPT1SRUdTQV9ORVZFUnx8cmVnc2FbcnAucjJdPT1SRUdTQV9ORVZFUikKKwlzYXZpbmdzW3JdPUlOVF9NSU47CisgICAgfQorICB9CisgIHdoaWxlKDEpeworICAgIGlmKCFwKXsKKyAgICAgIGlmKCFpc19oZWFkZXIpCisJaWVycm9yKDApOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmKCFwfHwocCE9ZnAmJnAtPmNvZGU+PUxBQkVMJiZwLT5jb2RlPD1CUkEpKSByZXR1cm4gMDsKKyAgICBpZihwIT1mcCl7CisgICAgICBpZigocC0+ei5mbGFncyZWQVIpJiZwLT56LnYtPnJlZyYmISpwLT56LnYtPmlkZW50aWZpZXIpeworCWlmKHAtPnoudj09dikKKwkgIHJldHVybiBhYnMocC0+ei52LT5yZWcpOworCWVsc2UKKwkgIHNhdmluZ3NbYWJzKHAtPnoudi0+cmVnKV09SU5UX01JTjsKKyAgICAgIH0KKyAgICB9CisgICAgdXNlZD0wOworICAgIGlmKChwLT5xMS5mbGFncyZWQVIpJiZwLT5xMS52PT12KXsKKyAgICAgIGlmKHAtPmNvZGU9PUFERFJFU1MpIHJldHVybiAwOworICAgICAgaWYoKHAtPmNvZGU9PUFTU0lHTnx8cC0+Y29kZT09UFVTSCkmJihxMXR5cChwKSZOUSk9PShDSEFSKSYmIXptZXF0byhwLT5xMi52YWwudm1heCxsMnptKDFMKSkpCisJcmV0dXJuIDA7CisgICAgICB1c2VkPTE7CisgICAgICBmb3Iocj0xO3I8PU1BWFI7cisrKXsKKwlpZihzYXZpbmdzW3JdIT1JTlRfTUlOKXsKKwkgIHRtcD1jb3N0X3NhdmluZ3MocCxyLCZwLT5xMSk7CisJICBpZih0bXA9PUlOVF9NSU4pCisJICAgIHNhdmluZ3Nbcl09SU5UX01JTjsKKwkgIGVsc2UKKwkgICAgc2F2aW5nc1tyXSs9dG1wOworCX0KKyAgICAgIH0KKyAgICB9CisgICAgaWYoKHAtPnEyLmZsYWdzJlZBUikmJnAtPnEyLnY9PXYpeworICAgICAgdXNlZD0xOworICAgICAgZm9yKHI9MTtyPD1NQVhSO3IrKyl7CisJaWYoc2F2aW5nc1tyXSE9SU5UX01JTil7CisJICB0bXA9Y29zdF9zYXZpbmdzKHAsciwmcC0+cTIpOworCSAgaWYodG1wPT1JTlRfTUlOKQorCSAgICBzYXZpbmdzW3JdPUlOVF9NSU47CisJICBlbHNlCisJICAgIHNhdmluZ3Nbcl0rPXRtcDsKKwl9CisgICAgICB9CisgICAgfQorICAgIGlmKChwLT56LmZsYWdzJlZBUikmJnAtPnoudj09dil7CisgICAgICBpZihwLT5jb2RlPT1BU1NJR04mJih6dHlwKHApJk5RKT09KENIQVIpJiYhem1lcXRvKHAtPnEyLnZhbC52bWF4LGwyem0oMUwpKSkKKwlyZXR1cm4gMDsKKyAgICAgIGZvcihyPTE7cjw9TUFYUjtyKyspeworCWlmKHNhdmluZ3Nbcl0hPUlOVF9NSU4peworCSAgdG1wPWNvc3Rfc2F2aW5ncyhwLHIsJnAtPnopOworCSAgaWYodG1wPT1JTlRfTUlOKQorCSAgICBzYXZpbmdzW3JdPUlOVF9NSU47CisJICBlbHNlCisJICAgIHNhdmluZ3Nbcl0rPXRtcDsKKwl9CisgICAgICB9CisgICAgICBpZih1c2VkPT0wJiYhKHAtPnouZmxhZ3MmRFJFRk9CSikpCisJYnJlYWs7CisgICAgfQorICAgIGlmKHAtPmNvZGU9PUNBTEwpeworICAgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJnAtPnExLnYtPmZpJiYocC0+cTEudi0+ZmktPmZsYWdzJkFMTF9SRUdTKSYmIShkaXNhYmxlJjIwNDgpKXsKKwlmb3Iocj0xO3I8PU1BWFI7cisrKXsKKwkgIGlmKHJlZ3NjcmF0Y2hbcl0mJkJUU1QocC0+cTEudi0+ZmktPnJlZ3NfbW9kaWZpZWQscikpCisJICAgIHNhdmluZ3Nbcl09SU5UX01JTjsKKwl9CisgICAgICB9ZWxzZXsKKwlmb3Iocj0xO3I8PU1BWFI7cisrKXsKKwkgIGlmKHJlZ3NjcmF0Y2hbcl0pCisJICAgIHNhdmluZ3Nbcl09SU5UX01JTjsKKwl9CisgICAgICB9CisgICAgfQorCisgICAgLyogY2hlY2sgZm9yIHJlZ2lzdGVyIGFyZ3VtZW50cyAqLworICAgIGlmKChwLT56LmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJiEqcC0+ei52LT5pZGVudGlmaWVyJiZwLT56LnYtPnJlZyl7CisgICAgICBpZihwLT5jb2RlPT1BU1NJR04mJihwLT5xMS5mbGFncyYoVkFSfERSRUZPQkopKT09VkFSJiZwLT5xMS52PT12KXsKKwlzYXZpbmdzW2FicyhwLT56LnYtPnJlZyldKys7CisgICAgICB9ZWxzZXsKKwlzYXZpbmdzW2FicyhwLT56LnYtPnJlZyldPUlOVF9NSU47CisJaWYocmVnX3BhaXIoYWJzKHAtPnoudi0+cmVnKSwmcnApKXsKKwkgIHNhdmluZ3NbcnAucjFdPUlOVF9NSU47CisJICBzYXZpbmdzW3JwLnIyXT1JTlRfTUlOOworCX0KKyAgICAgIH0KKyAgICB9CisKKyAgICBwPXAtPnByZXY7CisgIH0KKyAgcj0wOworICBzYXZpbmdzWzBdPTA7CisgIGZvcih0bXA9MTt0bXA8PU1BWFI7dG1wKyspeworICAgIGlmKHNhdmluZ3NbdG1wXT5zYXZpbmdzW3JdKXsKKyAgICAgIHI9dG1wOworICAgIH1lbHNlIGlmKHNhdmluZ3NbdG1wXT09c2F2aW5nc1tyXSl7CisgICAgICBpZihyZWdfcHJpb1t0bXBdPnJlZ19wcmlvW3JdKQorCXI9dG1wOworICAgICAgZWxzZSBpZihyZWdfcHJpb1t0bXBdPT1yZWdfcHJpb1tyXSl7CisJaWYocmVnc2NyYXRjaFt0bXBdJiYhcmVnc2NyYXRjaFtyXSkKKwkgIHI9dG1wOworCWVsc2UgaWYocmVnc2NyYXRjaFt0bXBdPT1yZWdzY3JhdGNoW3JdJiZCVFNUKGJyZWdzLHIpJiYhQlRTVChicmVncyx0bXApKQorCSAgLyogaWYgZXF1YWwsIHByZWZlciB0byBsZWF2ZSByZWdpc3RlcnMgdXNlZCBieSBwYXJhbWV0ZXJzICovCisJICByPXRtcDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBidnR5cGUgKmxhdGVfY2hhbmdlczsKKwordm9pZCBzZWFyY2hfbGF0ZV9vcHQoZmxvd2dyYXBoICpmZyxJQyAqbixvYmogKm8pCit7CisgIFZhciAqdj1vLT52OworICBJQyAqcD1uLT5wcmV2LCpjcDsKKyAgaWYoIXptZXF0byhvLT52YWwudm1heCxaMCkpIHJldHVybjsKKyAgaWYoby0+di0+cmVnIT0wKSByZXR1cm47CisgIHdoaWxlKDEpeworICAgIGlmKCFwKSBpZXJyb3IoMCk7CisgICAgaWYocC0+Y29kZT09TEFCRUwpIGllcnJvcigwKTsKKyAgICBpZigocC0+cTEuZmxhZ3MmVkFSKSYmcC0+cTEudj09dikgcmV0dXJuOworICAgIGlmKChwLT5xMi5mbGFncyZWQVIpJiZwLT5xMi52PT12KSByZXR1cm47CisgICAgaWYoKHAtPnouZmxhZ3MmVkFSKSYmcC0+ei52PT12KXsKKyAgICAgIGlmKHAtPnouZmxhZ3MmRFJFRk9CSikgcmV0dXJuOworICAgICAgaWYocC0+Y29kZT09Q09OVkVSVCYmIW11c3RfY29udmVydChwLT50eXBmLHAtPnR5cGYyLDApKXsKKwlpbnQgdWNudD0wOworCWlmKChwLT5xMS5mbGFncyZEUkVGT0JKKSYmKG8tPmZsYWdzJkRSRUZPQkopKSByZXR1cm47CisJaWYocC0+cTEuZmxhZ3MmVkFSQURSKSByZXR1cm47CisJaWYoKG4tPnExLmZsYWdzJlZBUikmJm4tPnExLnY9PW8tPnYpIHVjbnQrKzsKKwlpZigobi0+cTIuZmxhZ3MmVkFSKSYmbi0+cTIudj09by0+dikgdWNudCsrOworCWlmKChuLT56LmZsYWdzJihWQVJ8RFJFRk9CSikpPT0oVkFSfERSRUZPQkopJiZuLT5xMS52PT1vLT52KSB1Y250Kys7CisJaWYodWNudCE9MSkgcmV0dXJuOworCW1lbXNldChsYXRlX2NoYW5nZXMsdnNpemUsMCk7CisJaWYoKHAtPnExLmZsYWdzJihWQVJ8VkFSQURSKSk9PVZBUil7CisJICBpbnQgaT1wLT5xMS52LT5pbmRleDsKKwkgIGlmKHAtPnExLmZsYWdzJkRSRUZPQkopIGkrPXZjb3VudC1yY291bnQ7CisJICBmb3IoY3A9cDtjcCYmY3AhPW47Y3A9Y3AtPm5leHQpeworCSAgICBpY19jaGFuZ2VzKGNwLGxhdGVfY2hhbmdlcyk7CisJICAgIGlmKEJUU1QobGF0ZV9jaGFuZ2VzLGkpKSByZXR1cm47CisJICB9CisJfQorCWlmKERFQlVHJjEwMjQpe3ByaW50ZigicmVtb3ZpbmcgQ09OVkVSVCAoIW11c3RfY29udmVydClcbiIpO3ByaWMyKHN0ZG91dCxwKTtwcmljMihzdGRvdXQsbik7fQorCW8tPnY9cC0+cTEudjsKKwlvLT52YWwudm1heD1wLT5xMS52YWwudm1heDsKKwlpZihwLT5xMS5mbGFncyZEUkVGT0JKKXsKKwkgIG8tPmZsYWdzfD1EUkVGT0JKOworCSAgby0+ZHR5cD1wLT5xMS5kdHlwOworCX0KKwluLT51c2VfbGlzdD1teXJlYWxsb2Mobi0+dXNlX2xpc3QsVkxTKihuLT51c2VfY250K3AtPnVzZV9jbnQpKTsKKwltZW1jcHkoJm4tPnVzZV9saXN0W24tPnVzZV9jbnRdLCZwLT51c2VfbGlzdFswXSxwLT51c2VfY250KlZMUyk7CisJbi0+dXNlX2NudCs9cC0+dXNlX2NudDsKKwlyZW1vdmVfSUNfZmcoZmcscCk7CisgICAgICB9CisjaWYgMC8qIEJJR0VORElBTnx8TElUVExFRU5ESUFOKi8KKyAgICAgIGlmKHAtPmNvZGU9PUNPTlZFUlQmJklTSU5UKHAtPnR5cGYpJiZJU0lOVChwLT50eXBmMikmJihwLT50eXBmJk5RKTw9KHAtPnR5cGYyJk5RKSl7CisJaWYoKHAtPnExLmZsYWdzJkRSRUZPQkopJiYoby0+ZmxhZ3MmRFJFRk9CSikpIHJldHVybjsKKwlpZihERUJVRyYxMDI0KXtwcmludGYoInJlbW92aW5nIENPTlZFUlQgKGludD0+c21hbGxpbnQpXG4iKTtwcmljMihzdGRvdXQscCk7cHJpYzIoc3Rkb3V0LG4pO30KKwlvLT52PXAtPnExLnY7CisJby0+dmFsLnZtYXg9cC0+cTEudmFsLnZtYXg7CisJaWYocC0+cTEuZmxhZ3MmRFJFRk9CSil7CisJICBvLT5mbGFnc3w9RFJFRk9CSjsKKwkgIG8tPmR0eXA9cC0+cTEuZHR5cDsKKwl9CisjaWYgQklHRU5ESUFOCisJby0+dmFsLnZtYXg9em1hZGQoby0+dmFsLnZtYXgsem1zdWIoc2l6ZXRhYltwLT50eXBmMiZOUV0sc2l6ZXRhYltwLT50eXBmJk5RXSkpOworI2VuZGlmCisJcmVtb3ZlX0lDX2ZnKGZnLHApOworICAgICAgfQorI2VuZGlmCisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKHA9PWZnLT5zdGFydCkge3ByaWMyKHN0ZG91dCxuKTtpZXJyb3IoMCk7fQorICAgIHA9cC0+cHJldjsKKyAgfQorfQorCisKK3ZvaWQgbGF0ZV9vcHQoZmxvd2dyYXBoICpmZykKK3sKKyAgSUMgKnA7aW50IGo7YnZ0eXBlICppc3VzZWQ7CisgIGlzdXNlZD1teW1hbGxvYyh2c2l6ZSk7CisgIGxhdGVfY2hhbmdlcz1teW1hbGxvYyh2c2l6ZSk7CisgIHdoaWxlKGZnKXsKKyAgICBpZihERUJVRyYxMDI0KSBwcmludGYoImxhdGUgb3B0IHBhc3MgYmxvY2sgJWRcbiIsZmctPmluZGV4KTsKKyAgICBtZW1jcHkoaXN1c2VkLGZnLT5hdl9vdXQsdnNpemUpOworICAgIGZvcihwPWZnLT5lbmQ7cDtwPXAtPnByZXYpeworICAgICAgaWYocC0+Y29kZSE9Tk9QJiZwLT5jb2RlIT1BRERSRVNTJiYocC0+cTEuZmxhZ3MmKFZBUnxWQVJBRFIpKT09VkFSKXsKKwlqPXAtPnExLnYtPmluZGV4OworCWlmKEJUU1QoZmctPmF2X2tpbGwsaikmJiFCVFNUKGZnLT5hdl9vdXQsaikmJiFCVFNUKGlzdXNlZCxqKSkKKwkgIHNlYXJjaF9sYXRlX29wdChmZyxwLCZwLT5xMSk7CisgICAgICB9CisgICAgICBpZihwLT5jb2RlIT1OT1AmJihwLT5xMi5mbGFncyYoVkFSfFZBUkFEUikpPT1WQVIpeworCWo9cC0+cTIudi0+aW5kZXg7CisJaWYoQlRTVChmZy0+YXZfa2lsbCxqKSYmIUJUU1QoZmctPmF2X291dCxqKSYmIUJUU1QoaXN1c2VkLGopKQorCSAgc2VhcmNoX2xhdGVfb3B0KGZnLHAsJnAtPnEyKTsKKyAgICAgIH0KKyAgICAgIGlmKChwLT56LmZsYWdzJihWQVJ8RFJFRk9CSikpPT0oVkFSfERSRUZPQkopKXsKKwlqPXAtPnoudi0+aW5kZXg7CisJaWYoQlRTVChmZy0+YXZfa2lsbCxqKSYmIUJUU1QoZmctPmF2X291dCxqKSYmIUJUU1QoaXN1c2VkLGopKQorCSAgc2VhcmNoX2xhdGVfb3B0KGZnLHAsJnAtPnopOworICAgICAgfQorICAgICAgaWYocD09ZmctPnN0YXJ0KSBicmVhazsKKyAgICAgIGlmKHAtPmNoYW5nZV9jbnR8fHAtPnVzZV9jbnQpCisJYXZfdXBkYXRlKHAsaXN1c2VkKTsKKyAgICB9CisgICAgZmc9ZmctPm5vcm1hbG91dDsKKyAgfQorICBmcmVlKGlzdXNlZCk7CisgIGZyZWUobGF0ZV9jaGFuZ2VzKTsKK30KKwordm9pZCBsb2NhbF9yZWdzKGZsb3dncmFwaCAqZmcpCisvKiAgdmVyc3VjaHQgVmFyaWFibGVuLCBkaWUgbnVyIGlubmVyaGFsYiBlaW5lcyBCYXNpYyBCbG9ja3MgYmVudXR6dCAgICAqLworLyogIHdlcmRlbiAoa2lsbD09dHJ1ZSB1bmQgb3V0PT1mYWxzZSksIFJlZ2lzdGVyIHp1enV3ZWlzZW4uICAgICAgICAgICAgKi8KK3sKKyAgSUMgKnA7CisgIGludCBpLGosdCxyLG5yLG11c3RhbGxvYyxzYXZpbmdzLHByaW8sbnIxLG5yMjsKKyAgbGF0ZV9vcHQoZmcpOworICBpZihERUJVRyYxMDI0KSBwcmludF9mbG93Z3JhcGgoZmcpOworICBidnR5cGUgKmlubWVtPW15bWFsbG9jKHZzaXplKTsKKyAgaWYoREVCVUcmOTIxNikgcHJpbnRmKCJhc3NpZ25pbmcgdGVtcG9yYXJ5IHZhcmlhYmxlcyB0byByZWdpc3RlcnNcbiIpOworICBtZW1zZXQoaW5tZW0sMCx2c2l6ZSk7CisgIG1lbXNldChicmVncywwLHNpemVvZihicmVncykpOworICBmb3IoaT0wO2k8PU1BWFI7aSsrKSBscGFybXNbaV09MDsKKyAgLyogbWFyayByZWdpc3RlcnMgdXNlZCBieSBwYXJhbWV0ZXJzICovCisgIGZvcihwPWZpcnN0X2ljO3A7cD1wLT5uZXh0KXsKKyAgICBpZigocC0+cTEuZmxhZ3MmVkFSKSYmcC0+cTEudi0+cmVnKSBCU0VUKGJyZWdzLGFicyhwLT5xMS52LT5yZWcpKTsKKyAgICBpZigocC0+cTIuZmxhZ3MmVkFSKSYmcC0+cTIudi0+cmVnKSBCU0VUKGJyZWdzLGFicyhwLT5xMi52LT5yZWcpKTsKKyAgICBpZigocC0+ei5mbGFncyZWQVIpJiZwLT56LnYtPnJlZykgQlNFVChicmVncyxhYnMocC0+ei52LT5yZWcpKTsKKyAgfQorICBtZW1jcHkoYnJlZ3NtLGJyZWdzLHNpemVvZihicmVncykpOworICBsZmc9Zmc7CisgIHdoaWxlKGxmZyl7CisgICAgaWYoREVCVUcmMTAyNCkgcHJpbnRmKCJibG9jayAlZFxuIixsZmctPmluZGV4KTsKKyAgICBmb3IoaT0xO2k8PU1BWFI7aSsrKXtscmVndltpXT0wOyByZWd1W2ldPShyZWdzYVtpXT09UkVHU0FfTkVWRVIpOyBsZmctPnJlZ3ZbaV09MDt9CisgICAgbWVtc2V0KCZsZmctPnJlZ3VzZWQsMCxSU0laRSk7CisgICAgbGZnLT5jYWxscz0wOworICAgIC8vICAgIGlmKGxmZz09ZmcmJiFsZmctPmluKSBpc19oZWFkZXI9MTsgZWxzZSBpc19oZWFkZXI9MDsKKyAgICAvKiB1bm1hcmsgcmVnaXN0ZXJzIHVzZWQgYXMgcmVnaXN0ZXIgYXJndW1lbnRzICovCisgICAgbWVtY3B5KGJyZWdzLGJyZWdzbSxzaXplb2YoYnJlZ3MpKTsKKyAgICBmb3IocD1sZmctPnN0YXJ0O3A7cD1wLT5uZXh0KXsKKyAgICAgIGlmKChwLT56LmZsYWdzJlZBUikmJiEqcC0+ei52LT5pZGVudGlmaWVyJiZwLT56LnYtPnJlZyE9MCkgQkNMUihicmVncyxhYnMocC0+ei52LT5yZWcpKTsKKyAgICAgIGlmKHA9PWxmZy0+ZW5kKSBicmVhazsKKyAgICB9CisgICAgcD1sZmctPmVuZDsKKyAgICB3aGlsZShwKXsKKyAgICAgIG5yPW5yMT1ucjI9MDsKKyAgICAgIGk9cmVwbGFjZV9sb2NhbF9yZWcoJnAtPnopOworICAgICAgaWYoKHAtPnouZmxhZ3MmKFZBUnxEUkVGT0JKKSk9PVZBUil7CisJaWYoaSl7CisJICBscmVndltpXT0wO3JlZ3VbaV09MDsKKwkgIGlmKHJlZ19wYWlyKGksJnJwKSl7CisJICAgIG5yMT1ycC5yMTsKKwkgICAgbnIyPXJwLnIyOworCSAgICByZWd1W25yMV09cmVndVtucjJdPTA7CisJICB9CisJICBucj1pO211c3RhbGxvYz0xOworCSAgaWYoREVCVUcmODE5MikgcHJpbnRmKCJyZWd1WyVzXSBkZWNyZW1lbnRlZCB0byAlZFxuIixyZWduYW1lc1tpXSxyZWd1W2ldKTsKKwl9ZWxzZXsKKwkgIEJDTFIoaW5tZW0scC0+ei52LT5pbmRleCk7CisJfQorICAgICAgfQorICAgICAgaWYocC0+Y29kZSE9QUREUkVTUyl7CisJaWYocmVwbGFjZV9sb2NhbF9yZWcoJnAtPnExKT09bnIpIG11c3RhbGxvYz0wOworCWlmKHJlcGxhY2VfbG9jYWxfcmVnKCZwLT5xMik9PW5yKSBtdXN0YWxsb2M9MDsKKyAgICAgIH0KKyAgICAgIGlmKChwLT5xMS5mbGFncyYoVkFSfFJFR3xWQVJBRFIpKT09VkFSJiYhKHAtPnExLnYtPmZsYWdzJlVTRURBU0FEUikmJighKHAtPnExLnYtPnZ0eXAtPmZsYWdzJlZPTEFUSUxFKXx8cC0+cTEudi0+cmVnKSYmKHAtPnExLnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHAtPnExLnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKSl7CisJaj1wLT5xMS52LT5pbmRleDsKKwlpZigoQlRTVChsZmctPmF2X2tpbGwsail8fGlzX2hlYWRlcikmJiFCVFNUKGxmZy0+YXZfb3V0LGopJiYhQlRTVChpbm1lbSxqKSl7CisJICByPWZpbmRfYmVzdF9sb2NhbF9yZWcocCxwLT5xMS52LG5yKTsKKwkgIGlmKHIpeworCSAgICBpZihyIT1ucikgCisJICAgICAgaW5zZXJ0X2FsbG9jcmVnKGxmZyxwLEZSRUVSRUcscik7CisJICAgIGVsc2UKKwkgICAgICBtdXN0YWxsb2M9MDsKKwkgICAgbHJlZ3Zbcl09cC0+cTEudjtyZWd1c2VkW3JdPXJlZ3Vbcl09MTsKKwkgICAgaWYocmVnX3BhaXIociwmcnApKXsKKwkgICAgICByZWd1W3JwLnIxXT1yZWd1W3JwLnIyXT0xOworCSAgICAgIHJlZ3VzZWRbcnAucjFdPXJlZ3VzZWRbcnAucjJdPTE7CisJICAgIH0KKwkgICAgaWYocmVwbGFjZV9sb2NhbF9yZWcoJnAtPnExKSE9cikgaWVycm9yKDApOworCSAgICByZXBsYWNlX2xvY2FsX3JlZygmcC0+cTIpOworCSAgICByZXBsYWNlX2xvY2FsX3JlZygmcC0+eik7CisJICAgIGlmKChERUJVRyY5MjE2KSYmKnAtPnExLnYtPmlkZW50aWZpZXIpIHByaW50ZigidGVtcG9yYXJ5IDwlcz4gYXNzaWduZWQgdG8gJXMgKHYzKVxuIixwLT5xMS52LT5pZGVudGlmaWVyLHJlZ25hbWVzW3JdKTsKKwkgICAgaWYoREVCVUcmODE5MikgcHJpbnRmKCJ0ZW1wb3JhcnkgPCVzPiglcCkgYXNzaWduZWQgdG8gJXMgKHYzKVxuIixwLT5xMS52LT5pZGVudGlmaWVyLCh2b2lkICopcC0+cTEudixyZWduYW1lc1tyXSk7CisJICB9ZWxzZSBCU0VUKGlubWVtLGopOworCX0KKyAgICAgIH0KKyAgICAgIC8qICBoaWVyIHdlZ2VuIFVTRVEyQVNaIGF1ZnBhc3Nlbjsga29tbXV0YXRpdmUgSUNzIHNvbGx0ZW4gc28gICAqLworICAgICAgLyogIGFuZ2VvcmRuZXQgd2VyZGVuLCBkYXNzIGVpbiBldnRsLiBSZWdpc3RlciByZWNodHMgc3RlaHQgICAgICovCisgICAgICBpZigocC0+cTIuZmxhZ3MmKFZBUnxSRUd8VkFSQURSKSk9PVZBUiYmIShwLT5xMi52LT5mbGFncyZVU0VEQVNBRFIpJiYhKHAtPnEyLnYtPnZ0eXAtPmZsYWdzJlZPTEFUSUxFKSYmKHAtPnEyLnYtPnN0b3JhZ2VfY2xhc3M9PUFVVE98fHAtPnEyLnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKSl7CisJaj1wLT5xMi52LT5pbmRleDsKKwlpZigoQlRTVChsZmctPmF2X2tpbGwsail8fGlzX2hlYWRlcikmJiFCVFNUKGxmZy0+YXZfb3V0LGopJiYhQlRTVChpbm1lbSxqKSl7CisJICByPWZpbmRfYmVzdF9sb2NhbF9yZWcocCxwLT5xMi52LG5yKTsKKwkgIGlmKHIpeworCSAgICBpZihyIT1ucikgaW5zZXJ0X2FsbG9jcmVnKGxmZyxwLEZSRUVSRUcscik7CisJICAgIGVsc2UgbXVzdGFsbG9jPTA7CisJICAgIGxyZWd2W3JdPXAtPnEyLnY7cmVndXNlZFtyXT1yZWd1W3JdPTE7CisJICAgIGlmKHJlZ19wYWlyKHIsJnJwKSl7CisJICAgICAgcmVndVtycC5yMV09cmVndVtycC5yMl09MTsKKwkgICAgICByZWd1c2VkW3JwLnIxXT1yZWd1c2VkW3JwLnIyXT0xOworCSAgICB9CisJICAgIGlmKHJlcGxhY2VfbG9jYWxfcmVnKCZwLT5xMikhPXIpIGllcnJvcigwKTsKKwkgICAgcmVwbGFjZV9sb2NhbF9yZWcoJnAtPnopOworCSAgICBpZigoREVCVUcmOTIxNikmJipwLT5xMi52LT5pZGVudGlmaWVyKSBwcmludGYoInRlbXBvcmFyeSA8JXM+IGFzc2lnbmVkIHRvICVzICh2MSlcbiIscC0+cTIudi0+aWRlbnRpZmllcixyZWduYW1lc1tyXSk7CisJICAgIGlmKERFQlVHJjgxOTIpIHByaW50ZigidGVtcG9yYXJ5IDwlcz4oJXApIGFzc2lnbmVkIHRvICVzICh2MSlcbiIscC0+cTIudi0+aWRlbnRpZmllciwodm9pZCAqKXAtPnEyLnYscmVnbmFtZXNbcl0pOworCSAgfWVsc2UgQlNFVChpbm1lbSxqKTsKKwl9CisgICAgICB9CisgICAgICBpZigocC0+ei5mbGFncyYoVkFSfFJFR3xEUkVGT0JKKSk9PShWQVJ8RFJFRk9CSikmJiEocC0+ei52LT5mbGFncyZVU0VEQVNBRFIpJiYhKHAtPnoudi0+dnR5cC0+ZmxhZ3MmVk9MQVRJTEUpJiYocC0+ei52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT56LnYtPnN0b3JhZ2VfY2xhc3M9PVJFR0lTVEVSKSl7CisJaj1wLT56LnYtPmluZGV4OworCWlmKChCVFNUKGxmZy0+YXZfa2lsbCxqKXx8aXNfaGVhZGVyKSYmIUJUU1QobGZnLT5hdl9vdXQsaikmJiFCVFNUKGlubWVtLGopKXsKKwkgIHI9ZmluZF9iZXN0X2xvY2FsX3JlZyhwLHAtPnoudixucik7CisJICBpZihyKXsKKwkgICAgaW5zZXJ0X2FsbG9jcmVnKGxmZyxwLEZSRUVSRUcscik7CisJICAgIGxyZWd2W3JdPXAtPnoudjtyZWd1c2VkW3JdPXJlZ3Vbcl09MTsKKwkgICAgaWYocmVnX3BhaXIociwmcnApKXsKKwkgICAgICByZWd1W3JwLnIxXT1yZWd1W3JwLnIyXT0xOworCSAgICAgIHJlZ3VzZWRbcnAucjFdPXJlZ3VzZWRbcnAucjJdPTE7CisJICAgIH0KKwkgICAgaWYocmVwbGFjZV9sb2NhbF9yZWcoJnAtPnopIT1yKXsKKwkgICAgICBmb3IoaT0xO2k8PU1BWFI7aSsrKSBpZihscmVndltpXSkgcHJpbnRmKCIlZDolcz0lcyglcClcbiIsaSxyZWduYW1lc1tpXSxscmVndltpXS0+aWRlbnRpZmllciwodm9pZCopbHJlZ3ZbaV0pOworCSAgICAgIGllcnJvcihyKTt9CisJICAgIGlmKChERUJVRyY5MjE2KSYmKnAtPnoudi0+aWRlbnRpZmllcikgcHJpbnRmKCJ0ZW1wb3JhcnkgPCVzPiBhc3NpZ25lZCB0byAlcyAodjIpXG4iLHAtPnoudi0+aWRlbnRpZmllcixyZWduYW1lc1tyXSk7CisJICAgIGlmKERFQlVHJjgxOTIpIHByaW50ZigidGVtcG9yYXJ5IDwlcz4oJXApIGFzc2lnbmVkIHRvICVzICh2MilcbiIscC0+ei52LT5pZGVudGlmaWVyLCh2b2lkICopcC0+ei52LHJlZ25hbWVzW3JdKTsKKwkgIH1lbHNlIEJTRVQoaW5tZW0saik7CisJfQorICAgICAgfQorICAgICAgaWYocC0+Y29kZT09Q0FMTCl7CisJbGZnLT5jYWxscysrOworI2lmIDAKKwkvKiAgZmFsbHMgU2NyYXRjaHJlZ2lzdGVyIGJlaSBGdW5rdGlvbnNhdWZydWYgYmVudXR6dCAgICovCisJLyogIHdpcmQsIG1vZWdsaWNoc3QgYXVmIGVpbiBhbmRlcmVzIGF1c3dlaWNoZW4gICAgICAgICAqLworCWZvcihpPTE7aTw9TUFYUjtpKyspeworCSAgaWYoKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJnAtPnExLnYtPmZpJiYocC0+cTEudi0+ZmktPmZsYWdzJkFMTF9SRUdTKSl7CisJICAgIGlmKGxyZWd2W2ldJiZyZWdzY3JhdGNoW2ldJiZCVFNUKHAtPnExLnYtPmZpLT5yZWdzX21vZGlmaWVkLGkpKXsKKwkgICAgICBpbnQgaj1scmVndltpXS0+aW5kZXg7CisJICAgICAgaWYobHJlZ3ZbaV0tPnJlZyYmISpscmVndltpXS0+aWRlbnRpZmllcikgaWVycm9yKDApOworCSAgICAgIGlmKGZyZWVfaHJlZyhsZmcscCxpLDEvKjAqLyk9PTApIEJTRVQoaW5tZW0saik7CisJICAgIH0JCSAgICAKKwkgIH1lbHNleworCSAgICBpZihscmVndltpXSYmcmVnc2NyYXRjaFtpXSl7CisJICAgICAgaW50IGo9bHJlZ3ZbaV0tPmluZGV4OworCSAgICAgIGlmKGxyZWd2W2ldLT5yZWcmJiEqbHJlZ3ZbaV0tPmlkZW50aWZpZXIpIGllcnJvcigwKTsKKwkgICAgICBpZihmcmVlX2hyZWcobGZnLHAsaSwxLyowKi8pPT0wKSBCU0VUKGlubWVtLGopOworCSAgICB9CisJICB9CisJfQorI2VuZGlmCisgICAgICB9CisgICAgICAvKiAgZGllIEZhZWxsZSBiZWFjaHRlbiwgd2VubiBzY2hvbiBpbSBJQyBlaW4gUmVnaXN0ZXIgICAgICAgICAgKi8KKyAgICAgIC8qICBhbmdlc3Byb2NoZW4gd2lyZCAoc29sbHRlIG51ciBiZWkgQ0FMTCB1bmQgcmV0dXJuIGF1ZnRyZXRlbiAqLworICAgICAgaWYocC0+Y29kZT09RlJFRVJFRyl7CisJaWVycm9yKDApOworICAgICAgfQorICAgICAgaWYocC0+Y29kZT09QUxMT0NSRUcpeworCWllcnJvcigwKTsKKyAgICAgIH0KKyAgICAgIGlmKHA9PWxmZy0+c3RhcnQpIGk9MTsgZWxzZSBpPTA7CisgICAgICBwPXAtPnByZXY7CisgICAgICBpZihuciYmbXVzdGFsbG9jKSBpbnNlcnRfYWxsb2NyZWcobGZnLHAsQUxMT0NSRUcsbnIpOworICAgICAgaWYoaSkgYnJlYWs7CisgICAgfQorICAgIGZpeF9sb2NhbF9hbGxvY3JlZyhsZmcpOworICAgIGxmZz1sZmctPm5vcm1hbG91dDsKKyAgICBpZihpc19oZWFkZXIpeworICAgICAgZm9yKGk9MTtpPD1NQVhSO2krKykKKwlscGFybXNbaV09bHJlZ3ZbaV07CisgICAgfQorICB9CisgIGZyZWUoaW5tZW0pOworfQordm9pZCBpbnNlcnRfc2F2ZXMoZmxvd2dyYXBoICpmZykKKy8qICBmdWVndCBzcGVpY2hlcm4gdm9uIFJlZ2lzdGVybiBiZWkgRnVua3Rpb25zYXVmcnVmZW4gZWluICovCit7CisgIGludCByLGMsaTtJQyAqcCwqbmV3LCpuLCpiZWZvcmUsKmFmdGVyO1ZhciAqdjsKKyAgYnZ0eXBlICppc3VzZWQ9bXltYWxsb2ModnNpemUpOworICBpZihERUJVRyY5MjE2KSBwcmludGYoImluc2VydF9zYXZlc1xuIik7CisgIGZvcig7Zmc7Zmc9ZmctPm5vcm1hbG91dCl7CisgICBtZW1jcHkoaXN1c2VkLGZnLT5hdl9vdXQsdnNpemUpOworICAgIHA9ZmctPmVuZDsKKyAgICB3aGlsZShwKXsKKyAgICAgIGM9cC0+Y29kZTsKKyAgICAgIGlmKGM9PUNBTEwpeworCWlmKHA9PWZnLT5zdGFydCkgbj0wOyBlbHNlIG49cC0+cHJldjsKKwlmb3Iocj0xO3I8PU1BWFI7cisrKXsKKwkgIGk9MDsKKwkgIGlmKCh2PWZnLT5yZWd2W3JdKSYmKHYtPmluZGV4Pj12Y291bnQtcmNvdW50fHxCVFNUKGlzdXNlZCx2LT5pbmRleCkpKXsKKwkgICAgaWYoKHAtPnExLmZsYWdzJihWQVJ8RFJFRk9CSikpPT1WQVImJnAtPnExLnYtPmZpJiYocC0+cTEudi0+ZmktPmZsYWdzJkFMTF9SRUdTKSYmIShkaXNhYmxlJjIwNDgpKXsKKwkgICAgICBpZihyZWdzY3JhdGNoW3JdJiZCVFNUKHAtPnExLnYtPmZpLT5yZWdzX21vZGlmaWVkLHIpKSBpPTE7CisJICAgIH1lbHNleworCSAgICAgIGlmKHJlZ3NjcmF0Y2hbcl0pIGk9MTsKKwkgICAgfQorCSAgfQorCSAgaWYoaSl7CisJICAgIGlmKCFuKSBiZWZvcmU9ZmctPnN0YXJ0LT5wcmV2OyBlbHNlIGJlZm9yZT1uOworCSAgICBhZnRlcj1wLT5uZXh0OworCSAgICB3aGlsZShhZnRlciYmKGFmdGVyLT5jb2RlPT1GUkVFUkVHfHxhZnRlci0+Y29kZT09QUxMT0NSRUd8fGFmdGVyLT5jb2RlPT1OT1ApKQorCSAgICAgIGFmdGVyPWFmdGVyLT5uZXh0OworCSAgICBpZighYWZ0ZXJ8fGFmdGVyLT5jb2RlIT1HRVRSRVRVUk4peworCSAgICAgIGFmdGVyPXA7CisJICAgIH1lbHNleworCSAgICAgIGlmKChhZnRlci0+ei5mbGFncyZSRUcpJiZhZnRlci0+ei5yZWc9PXIpIGFmdGVyLT56LmZsYWdzJj1+UkVHOworCSAgICB9CisJICAgIGlmKHYtPmluZGV4Pj12Y291bnQtcmNvdW50KXsKKwkgICAgICAvKiBpdCBpcyBhIGNvbnN0X3ZhcjsgcmVsb2FkIGluc3RlYWQgb2Ygc3RvcmUgKi8KKwkgICAgICBuZXc9bmV3X0lDKCk7CisJICAgICAgbmV3LT5jb2RlPUFTU0lHTjsKKwkgICAgICBuZXctPnR5cGY9di0+dnR5cC0+ZmxhZ3M7CisJICAgICAgaW5zZXJ0X2NvYmooJm5ldy0+cTEsJnYtPmNvYmopOworCSAgICAgIG5ldy0+cTIuZmxhZ3M9MDsKKwkgICAgICBuZXctPnEyLnZhbC52bWF4PXN6b2Yodi0+dnR5cCk7CisJICAgICAgbmV3LT56LmZsYWdzPVJFRzsKKwkgICAgICBuZXctPnoucmVnPXI7CisJICAgICAgbmV3LT56LnZhbC52bWF4PWwyem0oMEwpOworCSAgICAgIG5ldy0+ei52PXY7CisJICAgICAgbmV3LT5maWxlPXAtPmZpbGU7CisJICAgICAgbmV3LT5saW5lPXAtPmxpbmU7CisJICAgICAgLyogZmFrZSwgd2UgZG8gbm90aGluZyB3aXRoIHRoaXMgYWZ0ZXJ3YXJkcyAqLworCSAgICAgIG5ldy0+dXNlX2NudD1uZXctPmNoYW5nZV9jbnQ9MDsKKwkgICAgICBuZXctPmNoYW5nZV9saXN0PW5ldy0+dXNlX2xpc3Q9MDsKKwkgICAgICBpbnNlcnRfSUNfZmcoZmcsYWZ0ZXIsbmV3KTsKKwkgICAgfWVsc2V7CisJICAgICAgbmV3PW5ld19JQygpOworCSAgICAgIG5ldy0+Y29kZT1BU1NJR047CisJICAgICAgbmV3LT50eXBmPXYtPnZ0eXAtPmZsYWdzOworICAgICAgICAgICAgICAvKiB2bGEgKi8KKyAgICAgICAgICAgICAgaWYoSVNBUlJBWShuZXctPnR5cGYpKQorICAgICAgICAgICAgICAgIG5ldy0+dHlwZj1QT0lOVEVSX1RZUEUodi0+dnR5cC0+bmV4dCk7CisJICAgICAgbmV3LT5xMS5mbGFncz1WQVJ8UkVHOworCSAgICAgIG5ldy0+cTEudj12OworCSAgICAgIG5ldy0+cTEudmFsLnZtYXg9bDJ6bSgwTCk7CisJICAgICAgbmV3LT5xMS5yZWc9cjsKKwkgICAgICBuZXctPnEyLmZsYWdzPTA7CisJICAgICAgbmV3LT5xMi52YWwudm1heD1zem9mKHYtPnZ0eXApOworCSAgICAgIG5ldy0+ei5mbGFncz1WQVI7CisJICAgICAgbmV3LT56LnZhbC52bWF4PWwyem0oMEwpOworCSAgICAgIG5ldy0+ei52PXY7CisJICAgICAgbmV3LT5maWxlPXAtPmZpbGU7CisJICAgICAgbmV3LT5saW5lPXAtPmxpbmU7CisJICAgICAgLyogZmFrZSwgd2UgZG8gbm90aGluZyB3aXRoIHRoaXMgYWZ0ZXJ3YXJkcyAqLworCSAgICAgIG5ldy0+dXNlX2NudD1uZXctPmNoYW5nZV9jbnQ9MDsKKwkgICAgICBuZXctPmNoYW5nZV9saXN0PW5ldy0+dXNlX2xpc3Q9MDsKKwkgICAgICBpbnNlcnRfSUNfZmcoZmcsYmVmb3JlLG5ldyk7CisJICAgICAgbmV3PW5ld19JQygpOworCSAgICAgIG5ldy0+Y29kZT1BU1NJR047CisJICAgICAgbmV3LT50eXBmPXYtPnZ0eXAtPmZsYWdzOworICAgICAgICAgICAgICAvKiB2bGEgKi8KKyAgICAgICAgICAgICAgaWYoSVNBUlJBWShuZXctPnR5cGYpKQorICAgICAgICAgICAgICAgIG5ldy0+dHlwZj1QT0lOVEVSX1RZUEUodi0+dnR5cC0+bmV4dCk7CisJICAgICAgbmV3LT5xMS5mbGFncz1WQVI7CisJICAgICAgbmV3LT5xMS52PXY7CisJICAgICAgbmV3LT5xMS52YWwudm1heD1sMnptKDBMKTsKKwkgICAgICBuZXctPnEyLmZsYWdzPTA7CisJICAgICAgbmV3LT5xMi52YWwudm1heD1zem9mKHYtPnZ0eXApOworCSAgICAgIG5ldy0+ei5mbGFncz1WQVJ8UkVHOworCSAgICAgIG5ldy0+ei52PXY7CisJICAgICAgbmV3LT56LnZhbC52bWF4PWwyem0oMEwpOworCSAgICAgIG5ldy0+ei5yZWc9cjsKKwkgICAgICBuZXctPmZpbGU9cC0+ZmlsZTsKKwkgICAgICBuZXctPmxpbmU9cC0+bGluZTsKKwkgICAgICAvKiBmYWtlLCB3ZSBkbyBub3RoaW5nIHdpdGggdGhpcyBhZnRlcndhcmRzICovCisJICAgICAgbmV3LT51c2VfY250PW5ldy0+Y2hhbmdlX2NudD0wOworCSAgICAgIG5ldy0+Y2hhbmdlX2xpc3Q9bmV3LT51c2VfbGlzdD0wOworCSAgICAgIGluc2VydF9JQ19mZyhmZyxhZnRlcixuZXcpOworCSAgICB9CisJICB9CisJfQorCWlmKHAtPmNoYW5nZV9jbnQhPTB8fHAtPnVzZV9jbnQhPTApCisJICBhdl91cGRhdGUocCxpc3VzZWQpOworCXA9bjsKKwljb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKHA9PWZnLT5zdGFydCkgYnJlYWs7CisgICAgICBpZihwLT5jaGFuZ2VfY250IT0wfHxwLT51c2VfY250IT0wKQorCWF2X3VwZGF0ZShwLGlzdXNlZCk7CisgICAgICBwPXAtPnByZXY7CisgICAgfQorICB9CisgIGZyZWUoaXN1c2VkKTsKK30KKworCisjZW5kaWYKKwordm9pZCBpbnNlcnRfc2ltcGxlX2FsbG9jcmVnKElDICpwLGludCBjb2RlLGludCByZWcpCisvKiAgRnVlZ3QgZWluIEFMTE9DUkVHL0ZSRUVSRUcgKGluIGNvZGUpIGhpbnRlciBwIGVpbiAtIGJlaSBwPT0wIGluICovCisvKiAgZmlyc3RfaWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgICAgSUMgKm5ldz1uZXdfSUMoKTsKKyAgICBuZXctPmxpbmU9MDsKKyAgICBuZXctPmZpbGU9MDsKKyAgICByZWd1c2VkW3JlZ109MTsKKyAgICBpZihyZWdfcGFpcihyZWcsJnJwKSkKKwlyZWd1c2VkW3JwLnIxXT1yZWd1c2VkW3JwLnIyXT0xOworICAgIG5ldy0+Y29kZT1jb2RlOworICAgIG5ldy0+dHlwZj0wOworICAgIG5ldy0+cTEuYW09bmV3LT5xMi5hbT1uZXctPnouYW09MDsKKyAgICBuZXctPnExLmZsYWdzPVJFRzsKKyAgICBuZXctPnExLnJlZz1yZWc7CisgICAgbmV3LT5xMi5mbGFncz1uZXctPnouZmxhZ3M9MDsKKyAgICBuZXctPnVzZV9jbnQ9bmV3LT5jaGFuZ2VfY250PTA7CisgICAgbmV3LT51c2VfbGlzdD1uZXctPmNoYW5nZV9saXN0PTA7CisgICAgaW5zZXJ0X0lDKHAsbmV3KTsKK30KKwordm9pZCBsb2FkX3NpbXBsZV9yZWdfcGFybXModm9pZCkKKy8qICBMYWVkdCBSZWdpc3RlcnBhcmFtZXRlciwgZmFsbHMgbm9ldGlnLiBOaWNodC1vcHRpbWllcmVuZGUgVmVyc2lvbi4gICovCit7CisgIGludCBpLGo7IFZhciAqdjsKKyAgcmVncCByZWdwW01BWFIrMV09ezB9OworLyogICBmb3IoaT0xO2k8PU1BWFI7aSsrKSB7cmVncFtpXS50cmVnPTA7cmVncFtpXS50dmFyPTA7fSAqLworICBmb3IoaT0wO2k8PTE7aSsrKXsKKyAgICBpZihpPT0wKSB2PXZsMzsgZWxzZSB2PXZsMjsKKyAgICBmb3IoO3Y7dj12LT5uZXh0KXsKKyAgICAgIGlmKCh2LT5mbGFncyZSRUdQQVJNKSYmKHJlZ3N2W2Ficyh2LT5yZWcpXSE9dnx8KHYtPmZsYWdzJkNPTlZQQVJBTUVURVIpKSl7CisJcmVncFthYnModi0+cmVnKV0udHZhcj12OworCWZvcihqPTE7ajw9TUFYUjtqKyspCisJICBpZihyZWdzdltqXT09dikgcmVncFthYnModi0+cmVnKV0udHJlZz1qOworICAgICAgfQorICAgIH0KKyAgfQorICBkb19sb2FkX3Bhcm1zKHJlZ3AsMCk7Cit9CisKK2V4dGVybiB6bWF4IHJlY2FsY19zdGFydF9vZmZzZXQ7CisKK3ZvaWQgZG9fbG9hZF9wYXJtcyhyZWdwIHJlZ3BbXSxmbG93Z3JhcGggKmZnKQoreworICBpbnQgaSxpMSxpMixqLGoxLGoyLGMsayxub3Rkb25lOworICBzdHJ1Y3Qge2ludCBmcmVnLHRyZWc7VmFyICp0dmFyLCp0bXA7fSBvcmRlcltNQVhSXT17MH07CisgIGlmKERFQlVHJjEpeworICAgIHByaW50ZigiZG9fbG9hZF9wYXJtczpcbiIpOworICAgIGZvcihpPTE7aTw9TUFYUjtpKyspCisgICAgICBpZihyZWdwW2ldLnR2YXIpCisJcHJpbnRmKCIlcy0+JXMoJXMpXG4iLHJlZ25hbWVzW2ldLHJlZ25hbWVzW3JlZ3BbaV0udHJlZ10scmVncFtpXS50dmFyLT5pZGVudGlmaWVyKTsKKyAgfQorICBkb3sKKyAgICBjPTA7CisgICAgZG97CisgICAgICBub3Rkb25lPTA7CisgICAgICBmb3IoaT0xO2k8PU1BWFI7aSsrKXsKKwlpbnQgbm90ZnJlZTsKKwlpZihyZWdfcGFpcihpLCZycCkpeworCSAgaTE9cnAucjE7CisJICBpMj1ycC5yMjsKKwl9ZWxzZQorCSAgaTE9aTI9MDsKKwlpZighcmVncFtpXS50dmFyKSBjb250aW51ZTsKKwlqPXJlZ3BbaV0udHJlZzsKKwlpZihqJiZyZWdfcGFpcihqLCZycCkpeworCSAgajE9cnAucjE7CisJICBqMj1ycC5yMjsKKwl9ZWxzZQorCSAgajE9ajI9MDsKKwlub3RmcmVlPTA7CisJZm9yKGs9MTtrPD1NQVhSO2srKyl7CisJICBpZihyZWdwW2tdLnR2YXImJnJlZ19wYWlyKGssJnJwKSYmKHJwLnIxPT1qfHxycC5yMT09ajF8fHJwLnIxPT1qMnx8cnAucjI9PWp8fHJwLnIyPT1qMXx8cnAucjI9PWoyKSl7CisJICAgIG5vdGZyZWU9MTsKKwkgICAgYnJlYWs7CisJICB9CisJfQorCWlmKGo9PTB8fCghbm90ZnJlZSYmIXJlZ3Bbal0udHZhciYmKCFqMXx8IXJlZ3BbajFdLnR2YXIpJiYoIWoyfHwhcmVncFtqMl0udHZhcikpfHxpPT1qfHxyZWdwW2ldLnRtcCl7CisJICBvcmRlcltjXS5mcmVnPWk7CisJICBvcmRlcltjXS50cmVnPWo7CisJICBvcmRlcltjXS50dmFyPXJlZ3BbaV0udHZhcjsKKwkgIGlmKHJlZ3BbaV0udG1wKXtvcmRlcltjXS50cmVnPTA7b3JkZXJbY10udHZhcj1yZWdwW2ldLnRtcDt9CisJICBjKys7IG5vdGRvbmU9MTsKKwkgIHJlZ3BbaV0udHJlZz0wOworCSAgcmVncFtpXS50dmFyPTA7CisJfQorICAgICAgfQorICAgIH13aGlsZShub3Rkb25lKTsKKyAgICBmb3IoaT1jLTE7aT49MDtpLS0pCisgICAgICBsb2FkX29uZV9wYXJtKG9yZGVyW2ldLmZyZWcsb3JkZXJbaV0udHJlZywwLG9yZGVyW2ldLnR2YXIsZmcpOworICAgIG5vdGRvbmU9MDsKKyAgICAvKiBmaXJzdCB0cnkgdG8gc3BpbGwgcmVnaXN0ZXItcGFpciAocHJvYmFibHkgc3Vib3B0aW1hbCwgYnV0IHNob3VsZAorICAgICAgIGF2b2lkIGEgZGVhZGxvY2spICovCisgICAgZm9yKGk9MTtpPD1NQVhSO2krKyl7CisgICAgICBpZihyZWdwW2ldLnR2YXImJnJlZ19wYWlyKGksJnJwKSkKKwlicmVhazsKKyAgICB9CisgICAgaWYoaT5NQVhSKXsKKyAgICAgIGZvcihpPTE7aTw9TUFYUjtpKyspeworCWlmKHJlZ3BbaV0udHZhcikKKwkgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZihpPD1NQVhSKXsKKyAgICAgIHN0YXRpYyB0eXBlIGR0eXA9e0RPVUJMRX07CisgICAgICBpZighcmVncFtpXS50dmFyKSBpZXJyb3IoMCk7CisgICAgICBpZihyZWdwW2ldLnR2YXItPmZsYWdzJkNPTlZQQVJBTUVURVIpCisJcmVncFtpXS50bXA9YWRkX3RtcF92YXIoY2xvbmVfdHlwKCZkdHlwKSk7CisgICAgICBlbHNlCisJcmVncFtpXS50bXA9YWRkX3RtcF92YXIoY2xvbmVfdHlwKHJlZ3BbaV0udHZhci0+dnR5cCkpOworICAgICAgLyogbnVtX3ZhcnMgaXMgYWxyZWFkeSBkb25lLCBzbyBtYXJrIGl0IGJ5IC0xICovCisgICAgICByZWdwW2ldLnRtcC0+aW5kZXg9LTE7CisgICAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlY2FsY19vZmZzZXRzICovCisjaWZuZGVmIE5PX09QVElNSVpFUgorICAgICAgaWYoZmcpeworCXJlZ3BbaV0udG1wLT5vZmZzZXQ9bDJ6bSgwTCk7CisJaWYoem1sZXEocmVjYWxjX3N0YXJ0X29mZnNldCxyZWdzaXplW2ldKSkKKwkgIHJlY2FsY19zdGFydF9vZmZzZXQ9cmVnc2l6ZVtpXTsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgbG9hZF9vbmVfcGFybSgwLHJlZ3BbaV0udHJlZyxyZWdwW2ldLnRtcCxyZWdwW2ldLnR2YXIsZmcpOworICAgICAgbm90ZG9uZT0xOworICAgIH0KKyAgfXdoaWxlKG5vdGRvbmUpOworfQordm9pZCBsb2FkX29uZV9wYXJtKGludCBmcmVnLGludCB0cmVnLFZhciAqZnZhcixWYXIgKnR2YXIsZmxvd2dyYXBoICpmZykKK3sKKyAgSUMgKm5ldzsKKyAgaWYoREVCVUcmMSkgcHJpbnRmKCJsb3A6ICVzKCVzKS0+JXMoJXMpXG4iLHJlZ25hbWVzW2ZyZWddLGZ2YXI/ZnZhci0+aWRlbnRpZmllcjplbXB0eSxyZWduYW1lc1t0cmVnXSx0dmFyP3R2YXItPmlkZW50aWZpZXI6ZW1wdHkpOworICBpZihmcmVnJiZmcmVnIT10cmVnKXsKKyAgICBpZihmZyl7CisjaWZuZGVmIE5PX09QVElNSVpFUgorICAgICAgaW5zZXJ0X2FsbG9jcmVnKGZnLDAsRlJFRVJFRyxmcmVnKTsKKyNlbmRpZgorICAgIH1lbHNlCisgICAgICBpbnNlcnRfc2ltcGxlX2FsbG9jcmVnKDAsRlJFRVJFRyxmcmVnKTsKKyAgfQorICBuZXc9bmV3X0lDKCk7CisgIG5ldy0+bGluZT0wOworICBuZXctPmZpbGU9MDsKKyAgaWYodHZhci0+ZmxhZ3MmQ09OVlBBUkFNRVRFUil7CisgICAgbmV3LT5jb2RlPUNPTlZFUlQ7CisgICAgbmV3LT50eXBmPXR2YXItPnZ0eXAtPmZsYWdzOworICAgIG5ldy0+dHlwZjI9RE9VQkxFOworICB9ZWxzZXsKKyAgICBuZXctPmNvZGU9QVNTSUdOOworICAgIG5ldy0+dHlwZj10dmFyLT52dHlwLT5mbGFnczsKKyAgfQorICBpZihJU0ZMT0FUKG5ldy0+dHlwZikpIGZsb2F0X3VzZWQ9MTsKKyAgaWYoZnZhcil7CisgICAgbmV3LT5xMS5mbGFncz1WQVI7CisgICAgbmV3LT5xMS52PWZ2YXI7CisgICAgbmV3LT5xMS52YWwudm1heD1sMnptKDBMKTsKKyAgfWVsc2V7CisgICAgbmV3LT5xMS5mbGFncz1SRUc7CisgICAgbmV3LT5xMS5yZWc9ZnJlZzsKKyAgfQorICBuZXctPnEyLmZsYWdzPTA7CisgIG5ldy0+cTIudmFsLnZtYXg9c3pvZih0dmFyLT52dHlwKTsKKyAgaWYodHJlZykKKyAgICBuZXctPnouZmxhZ3M9UkVHfFZBUjsKKyAgZWxzZQorICAgIG5ldy0+ei5mbGFncz1WQVI7CisgIG5ldy0+ei52YWwudm1heD1sMnptKDBMKTsKKyAgbmV3LT56LnY9dHZhcjsKKyAgbmV3LT56LnJlZz10cmVnOworICBuZXctPnExLmFtPW5ldy0+cTIuYW09bmV3LT56LmFtPTA7CisgIG5ldy0+dXNlX2NudD1uZXctPmNoYW5nZV9jbnQ9MDsKKyAgbmV3LT51c2VfbGlzdD1uZXctPmNoYW5nZV9saXN0PTA7CisgIGlmKChuZXctPnR5cGYmTlEpPT1DSEFSJiYhcmVnb2sobmV3LT5xMS5yZWcsbmV3LT50eXBmLDApKXsKKyAgICBuZXctPmNvZGU9Q09OVkVSVDsKKyAgICBuZXctPnR5cGYyPUlOVDsKKyAgfQorICBpZihmZyl7CisjaWZuZGVmIE5PX09QVElNSVpFUgorICAgIGluc2VydF9JQ19mZyhmZywwLG5ldyk7CisgICAgaWYoZnJlZyYmZnJlZyE9dHJlZykgaW5zZXJ0X2FsbG9jcmVnKGZnLDAsQUxMT0NSRUcsZnJlZyk7CisjZW5kaWYKKyAgfWVsc2V7CisgICAgaW5zZXJ0X0lDKDAsbmV3KTsKKyAgICBpZihmcmVnJiZmcmVnIT10cmVnKSBpbnNlcnRfc2ltcGxlX2FsbG9jcmVnKDAsQUxMT0NSRUcsZnJlZyk7CisgIH0KKyAgaWYobmV3LT56LmZsYWdzJlJFRyl7CisgICAgLyogIEFMTE9DUkVHIHZlcnNjaGllYmVuICAgICovCisgICAgSUMgKnA7CisgICAgaWYoZmcpeworI2lmbmRlZiBOT19PUFRJTUlaRVIKKyAgICAgIGluc2VydF9hbGxvY3JlZyhmZywwLEFMTE9DUkVHLHRyZWcpOworI2VuZGlmCisgICAgfWVsc2UKKyAgICAgIGluc2VydF9zaW1wbGVfYWxsb2NyZWcoMCxBTExPQ1JFRyx0cmVnKTsKKyAgICBmb3IocD1uZXctPm5leHQ7cDtwPXAtPm5leHQpeworICAgICAgaWYocC0+Y29kZT09QUxMT0NSRUcmJnAtPnExLnJlZz09dHJlZyl7CisJaWYoZmcpeworI2lmbmRlZiBOT19PUFRJTUlaRVIKKwkgIHJlbW92ZV9JQ19mZyhmZyxwKTsKKyNlbmRpZgorCX1lbHNlCisJICByZW1vdmVfSUMocCk7CisJYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmKCFwKSBpZXJyb3IoMCk7CisgIH0KK30KKwordm9pZCBzaW1wbGVfcmVncyh2b2lkKQorLyogIGhhZWx0IFZhcmlhYmxlbiBpbiBSZWdpc3Rlcm4sIHNpbXBsZSBWZXJzaW9uICAgICAgICAgICAgKi8KK3sKKyAgaW50IGkyLGksajtpbnQgcHJpO1ZhciAqdjsKKyAgSUMgKmljcCwqc3RhcnQ9Zmlyc3RfaWM7CisgIGlmKCFmaXJzdF9pYykgcmV0dXJuOworICBmb3IoaT0xO2k8PU1BWFI7aSsrKSByZWdzdltpXT0wOworICBmb3IoaTI9MDtpMjw9TUFYUio0O2kyKyspeworICAgIGludCBvbmx5X2Jlc3QscG9pbnRlcnR5cGU9MDsKKyAgICBpZihpMjw9TUFYUioyKXtpPWkyO29ubHlfYmVzdD0xO30gZWxzZSB7aT1pMi8yO3BvaW50ZXJ0eXBlPW9ubHlfYmVzdD0wO30KKyAgICBpZihpPD1NQVhSJiZyZWdzdltpXSkgY29udGludWU7CisgICAgaWYoaT5NQVhSJiZyZWdzdltpLU1BWFJdKSBjb250aW51ZTsKKyAgICBpZihpPk1BWFJ8fCFyZWdzdltpXSl7CisgICAgICBpZihpPk1BWFIpeworCWktPU1BWFI7CisJaWYocmVnc3ZbaV0pIGNvbnRpbnVlOworICAgICAgfWVsc2V7CisJLyogIFppZWhlIFNjcmF0Y2hyZWdpc3RlciB2b3IsIHdlbm4ga2VpbiBGdW5rdGlvbnNhdWZydWYgKi8KKwkvKiAgZXJmb2xndCwgc29uc3QgZXJzdCBhbmRlcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWlmKCFyZWdzY3JhdGNoW2ldKSBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmKHJlZ3VzZWRbaV0pIGNvbnRpbnVlOworICAgICAgaWYoc3JlZ3NhW2ldPT1SRUdTQV9URU1QUykgY29udGludWU7CisgICAgICBpZihyZWdfcGFpcihpLCZycCkpeworCWlmKHJlZ3VzZWRbcnAucjFdfHxyZWd1c2VkW3JwLnIyXSkgY29udGludWU7CisgICAgICB9CisgICAgICBpZihzaW1wbGVfc2NyYXRjaFtpXSkgY29udGludWU7CisgICAgICAvKnByaT0yOyovIHByaT0wOworICAgICAgZm9yKGo9MDtqPD0xO2orKyl7CisJaWYoaj09MCkgdj12bDM7IGVsc2Ugdj12bDI7CisJd2hpbGUodil7CisJICBpZih2LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHx2LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CisJICAgIGlmKCEodi0+ZmxhZ3MmVVNFREFTQURSKSYmISh2LT52dHlwLT5mbGFncyZWT0xBVElMRSkpeworICAgICAgICAgICAgICBpbnQgdnQ9di0+dnR5cC0+ZmxhZ3MmTlU7CisgICAgICAgICAgICAgIC8qIHZsYSAqLworICAgICAgICAgICAgICBpZihJU0FSUkFZKHZ0KSYmaXNfdmxlbmd0aCh2LT52dHlwKSkKKyAgICAgICAgICAgICAgICB2dD1QT0lOVEVSX1RZUEUodi0+dnR5cC0+bmV4dCk7CisJICAgICAgaWYob25seV9iZXN0JiZ2LT52dHlwLT5uZXh0KSBwb2ludGVydHlwZT12LT52dHlwLT5uZXh0LT5mbGFnczsKKwkgICAgICBpZih2LT5wcmlvcml0eT5wcmkmJnJlZ29rKGksdnQscG9pbnRlcnR5cGUpKXsKKwkJcmVnc3ZbaV09djtwcmk9di0+cHJpb3JpdHk7CisJICAgICAgfQorCSAgICB9CisJICB9CisJICB2PXYtPm5leHQ7CisJfQorICAgICAgfQorICAgIH0KKyAgICBpZihyZWdzdltpXSl7CisgICAgICBpZihERUJVRyYxKSBwcmludGYoIkFzc2lnbmVkIDwlcz4oJXApIHRvICVzLCVkXG4iLHJlZ3N2W2ldLT5pZGVudGlmaWVyLCh2b2lkICopcmVnc3ZbaV0scmVnbmFtZXNbaV0saSk7CisgICAgICByZWdzdltpXS0+cHJpb3JpdHk9MDtyZWd1c2VkW2ldPTE7CisgICAgICBpZihyZWdfcGFpcihpLCZycCkpIHtyZWd1c2VkW3JwLnIxXT1yZWd1c2VkW3JwLnIyXT0xO30KKyAgICAgIGlmKCF6bWxlcShsMnptKDBMKSxyZWdzdltpXS0+b2Zmc2V0KSYmIShyZWdzdltpXS0+ZmxhZ3MmKENPTlZQQVJBTUVURVJ8UkVHUEFSTSkpKXsKKwlpY3A9bmV3X0lDKCk7CisJaWNwLT5saW5lPTA7CisJaWNwLT5maWxlPTA7CisJaWNwLT5xMS5hbT1pY3AtPnEyLmFtPWljcC0+ei5hbT0wOworCWljcC0+Y29kZT1BU1NJR047CisJaWNwLT50eXBmPXJlZ3N2W2ldLT52dHlwLT5mbGFncyZOVTsKKwlpY3AtPnExLmZsYWdzPVZBUjsKKwlpY3AtPnExLnY9cmVnc3ZbaV07CisJaWNwLT5xMS52YWwudm1heD1sMnptKDBMKTsKKwlpY3AtPnEyLmZsYWdzPTA7CisJaWNwLT5xMi52YWwudm1heD1zem9mKHJlZ3N2W2ldLT52dHlwKTsKKwlpY3AtPnouZmxhZ3M9UkVHOworCWljcC0+ei5yZWc9aTsKKwlpY3AtPm5leHQ9Zmlyc3RfaWM7CisJaWNwLT5wcmV2PTA7CisJZmlyc3RfaWMtPnByZXY9aWNwOworCWZpcnN0X2ljPWljcDsKKyAgICAgIH0KKyAgICAgIGljcD1uZXdfSUMoKTsKKyAgICAgIGljcC0+bGluZT0wOworICAgICAgaWNwLT5maWxlPTA7CisgICAgICBpY3AtPnExLmFtPWljcC0+cTIuYW09aWNwLT56LmFtPTA7CisgICAgICBpY3AtPmNvZGU9QUxMT0NSRUc7CisgICAgICBpY3AtPnExLmZsYWdzPVJFRzsKKyAgICAgIGljcC0+cTEucmVnPWk7CisgICAgICBpY3AtPnEyLmZsYWdzPWljcC0+ei5mbGFncz1pY3AtPnR5cGY9MDsKKyAgICAgIGljcC0+bmV4dD1maXJzdF9pYzsKKyAgICAgIGljcC0+cHJldj0wOworICAgICAgZmlyc3RfaWMtPnByZXY9aWNwOworICAgICAgZmlyc3RfaWM9aWNwOworICAgICAgaWNwPW5ld19JQygpOworICAgICAgaWNwLT5xMS5hbT1pY3AtPnEyLmFtPWljcC0+ei5hbT0wOworICAgICAgaWNwLT5jb2RlPUZSRUVSRUc7CisgICAgICBpY3AtPnExLmZsYWdzPVJFRzsKKyAgICAgIGljcC0+cTEucmVnPWk7CisgICAgICBpY3AtPnEyLmZsYWdzPWljcC0+ei5mbGFncz1pY3AtPnR5cGY9MDsKKyAgICAgIGljcC0+bmV4dD0wOworICAgICAgYWRkX0lDKGljcCk7CisgICAgfQorICB9CisgIGljcD1zdGFydDsKKyAgd2hpbGUoaWNwKXsKKyAgICBpZigoaWNwLT5jb2RlPT1BTExPQ1JFR3x8aWNwLT5jb2RlPT1GUkVFUkVHKSYmcmVnc3ZbaWNwLT5xMS5yZWddKXsKKyAgICAgIC8qICBpcmdlbmR3ZWxjaGUgYWxsb2NyZWcvZnJlZXJlZyBpbSBDb2RlIGVudGZlcm5lbiAgICAgKi8KKyAgICAgIC8qICBzb2xsdGUgbnVyIGJlaW0gUmV0dXJucmVnaXN0ZXIgdm9ya29tbWVuICAgICAgICAgICAgKi8KKyAgICAgIElDICptPWljcC0+bmV4dDsKKyAgICAgIHJlbW92ZV9JQyhpY3ApOworICAgICAgaWNwPW07Y29udGludWU7CisgICAgfQorICAgIGZvcihpPTE7aTw9TUFYUjtpKyspeworICAgICAgaWYoIXJlZ3N2W2ldKSBjb250aW51ZTsKKyAgICAgIGlmKChpY3AtPnExLmZsYWdzJihWQVJ8RE9OVFJFR0lTVEVSSVpFKSk9PVZBUiYmaWNwLT5xMS52PT1yZWdzdltpXSl7CisJaWNwLT5xMS5mbGFnc3w9UkVHOworCWljcC0+cTEucmVnPWk7CisgICAgICB9CisgICAgICBpZigoaWNwLT5xMi5mbGFncyYoVkFSfERPTlRSRUdJU1RFUklaRSkpPT1WQVImJmljcC0+cTIudj09cmVnc3ZbaV0peworCWljcC0+cTIuZmxhZ3N8PVJFRzsKKwlpY3AtPnEyLnJlZz1pOworICAgICAgfQorICAgICAgaWYoKGljcC0+ei5mbGFncyYoVkFSfERPTlRSRUdJU1RFUklaRSkpPT1WQVImJmljcC0+ei52PT1yZWdzdltpXSl7CisJaWNwLT56LmZsYWdzfD1SRUc7CisJaWNwLT56LnJlZz1pOworICAgICAgfQorICAgIH0KKyAgICBpY3A9aWNwLT5uZXh0OworICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvc3RhdGVtZW50cy5jIGIvc3RhdGVtZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NzljZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGF0ZW1lbnRzLmMKQEAgLTAsMCArMSwxMjg4IEBACisvKiAgJFZFUjogdmJjYyAoc3RhdGVtZW50cy5jKSAgJFJldmlzaW9uOiAxLjMwICQgICovCisKKyNpbmNsdWRlICJ2YmNjX2NwcC5oIgorI2luY2x1ZGUgInZiYy5oIgorCitzdGF0aWMgY2hhciBGSUxFX1tdPV9fRklMRV9fOworCitpbnQgY29udF9sYWJlbD0wOworaW50IHRlc3RfYXNzaWdubWVudCh0eXBlICosbnApOworCitzdGF0aWMgaW50IHN3aXRjaGJyZWFrOworCisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisKKyNkZWZpbmUgY3IoKQorI2lmbmRlZiBjcgordm9pZCBjcih2b2lkKQorLyogIHRlc3RlZCBSZWdpc3RlcmJlbGVndW5nICovCit7CisgIGludCBpOworICBmb3IoaT0wO2k8PU1BWFI7aSsrKQorICAgIGlmKHJlZ3NbaV0hPXJlZ3NhW2ldKSB7ZXJyb3IoMTQ5LHJlZ25hbWVzW2ldKTtyZWdzW2ldPXJlZ3NhW2ldO30KK30KKyNlbmRpZgorCisKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKwordm9pZCBzdGF0ZW1lbnQodm9pZCkKKy8qICBiZWFyYmVpdGV0IGVpbiBzdGF0ZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICB0b2tlbiBtdG9rOworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICBjcigpOworICBraWxsc3AoKTsKKyAgaWYoY3Rvay0+dHlwZT09TEJSQSl7CisgICAgZW50ZXJfYmxvY2soKTsKKyAgICBpZihuZXN0aW5nPjApIGxvY2FsX29mZnNldFtuZXN0aW5nXT1sb2NhbF9vZmZzZXRbbmVzdGluZy0xXTsKKyAgICBjb21wb3VuZF9zdGF0ZW1lbnQoKTsKKyAgICBsZWF2ZV9ibG9jaygpOworICAgIHJldHVybjsKKyAgfQorICBpZihjdG9rLT50eXBlPT1OQU1FKXsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyNpZm5kZWYgSEFWRV9NSVNSQQorICAgIGlmKCFzdHJjbXAoImlmIixjdG9rLT5uYW1lKSl7bmV4dF90b2tlbigpO2lmX3N0YXRlbWVudCgpOyByZXR1cm47fQorICAgIGlmKCFzdHJjbXAoInN3aXRjaCIsY3Rvay0+bmFtZSkpe25leHRfdG9rZW4oKTtzd2l0Y2hfc3RhdGVtZW50KCk7IHJldHVybjt9CisgICAgaWYoIXN0cmNtcCgiZm9yIixjdG9rLT5uYW1lKSl7bmV4dF90b2tlbigpO2Zvcl9zdGF0ZW1lbnQoKTsgcmV0dXJuO30KKyAgICBpZighc3RyY21wKCJ3aGlsZSIsY3Rvay0+bmFtZSkpe25leHRfdG9rZW4oKTt3aGlsZV9zdGF0ZW1lbnQoKTsgcmV0dXJuO30KKyAgICBpZighc3RyY21wKCJkbyIsY3Rvay0+bmFtZSkpe25leHRfdG9rZW4oKTtkb19zdGF0ZW1lbnQoKTsgcmV0dXJuO30KKyAgICBpZighc3RyY21wKCJnb3RvIixjdG9rLT5uYW1lKSl7bmV4dF90b2tlbigpO2dvdG9fc3RhdGVtZW50KCk7IHJldHVybjt9CisgICAgaWYoIXN0cmNtcCgiY29udGludWUiLGN0b2stPm5hbWUpKXtuZXh0X3Rva2VuKCk7Y29udGludWVfc3RhdGVtZW50KCk7IHJldHVybjt9CisgICAgaWYoIXN0cmNtcCgiYnJlYWsiLGN0b2stPm5hbWUpKXtuZXh0X3Rva2VuKCk7YnJlYWtfc3RhdGVtZW50KCk7IHJldHVybjt9CisgICAgaWYoIXN0cmNtcCgicmV0dXJuIixjdG9rLT5uYW1lKSl7bmV4dF90b2tlbigpO3JldHVybl9zdGF0ZW1lbnQoKTsgcmV0dXJuO30KKyAgICBpZighc3RyY21wKCJjYXNlIixjdG9rLT5uYW1lKSl7bmV4dF90b2tlbigpOyBsYWJlbGVkX3N0YXRlbWVudCgpOyByZXR1cm47fQorICAgIGlmKCFzdHJjbXAoImRlZmF1bHQiLGN0b2stPm5hbWUpKXtjcGJleihidWZmLDApO25leHRfdG9rZW4oKTtsYWJlbGVkX3N0YXRlbWVudCgpOyByZXR1cm47fQorI2VuZGlmCisJfQorICBjcGJleihidWZmLDEpOworICBjb3B5X3Rva2VuKCZtdG9rLGN0b2spOworICBuZXh0X3Rva2VuKCk7a2lsbHNwKCk7CisgIGlmKGN0b2stPnR5cGU9PVRfQ09MT04pe2xhYmVsZWRfc3RhdGVtZW50KCk7cmV0dXJuO30KKyAgcHVzaF90b2tlbigmbXRvayk7CisgIGZyZWUobXRvay5uYW1lKTsKKyAgZXhwcmVzc2lvbl9zdGF0ZW1lbnQoKTsgLyogaWYgdGhlcmUgaXMgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQgc2V0IG1pc3JhX2xhc3RfYnJlYWsgdG8gZmFsc2UgKi8KK30KK3ZvaWQgbGFiZWxlZF9zdGF0ZW1lbnQodm9pZCkKKy8qICBiZWFyYmVpdGV0IGxhYmVsZWRfc3RhdGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBsbGlzdCAqbHA7aW50IGRlZj0wOworICBub2NvZGU9MDsKKyAgaWYoY3Rvay0+dHlwZT09VF9DT0xPTil7CisgICAgbmV4dF90b2tlbigpOworICAgIGlmKCEqYnVmZil7CisgICAgICBlcnJvcigxMzApOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZighc3RyY21wKCJkZWZhdWx0IixidWZmKSl7CisgICAgICBkZWY9MTsKKyAgICAgIGxwPTA7CisgICAgfSBlbHNlIGxwPWZpbmRfbGFiZWwoYnVmZik7CisgICAgaWYobHAmJmxwLT5mbGFncyZMQUJFTERFRklORUQpeworICAgICAgZXJyb3IoMTMxLGJ1ZmYpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZighbHApIGxwPWFkZF9sYWJlbChidWZmKTsKKyAgICBscC0+ZmxhZ3N8PUxBQkVMREVGSU5FRDsKKyAgICBscC0+c3dpdGNoX2NvdW50PTA7CisgICAgaWYoZGVmKXsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICAgIGlmKHN3aXRjaF9hY3Q9PTApIGVycm9yKDE1MCk7CisgICAgICBscC0+ZmxhZ3N8PUxBQkVMREVGQVVMVDsKKyAgICAgIGxwLT5zd2l0Y2hfY291bnQ9c3dpdGNoX2FjdDsKKyAgICB9ZWxzZSB7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisJCX0KKyAgICBnZW5fbGFiZWwobHAtPmxhYmVsKTsKKyAgICBhZnRlcmxhYmVsPTA7CisgIH1lbHNleworICAgIC8qICBjYXNlICAgICovCisgICAgbnAgdHJlZTtsbGlzdCAqbHA7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgdHJlZT1leHByZXNzaW9uKCk7CisgICAga2lsbHNwKCk7CisgICAgaWYoY3Rvay0+dHlwZT09VF9DT0xPTil7CisgICAgICBuZXh0X3Rva2VuKCk7CisgICAgICBraWxsc3AoKTsKKyAgICB9IGVsc2UgZXJyb3IoNzApOworICAgIGlmKCFzd2l0Y2hfY291bnQpeworICAgICAgZXJyb3IoMTMyKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYoIXRyZWV8fCF0eXBlX2V4cHJlc3Npb24odHJlZSwwKSkKKwl7CisJfSBlbHNlIHsKKwlpZih0cmVlLT5mbGFncyE9Q0VYUFJ8fHRyZWUtPnNpZGVmeCl7CisJICBlcnJvcigxMzMpOworCX0gZWxzZSB7CisJICBpZighSVNJTlQodHJlZS0+bnR5cC0+ZmxhZ3MpKXsKKwkgICAgZXJyb3IoMTM0KTsKKwkgIH0gZWxzZSB7CisJICAgIGxwPWFkZF9sYWJlbChlbXB0eSk7CisJICAgIGxwLT5mbGFncz1MQUJFTERFRklORUQ7CisJICAgIGxwLT5zd2l0Y2hfY291bnQ9c3dpdGNoX2FjdDsKKwkgICAgZXZhbF9jb25zdG4odHJlZSk7CisJICAgIGluc2VydF9jb25zdCgmbHAtPnZhbCxzd2l0Y2hfdHlwKTsKKwkgICAgZ2VuX2xhYmVsKGxwLT5sYWJlbCk7CisJICB9CisJfQorICAgICAgfQorICAgIH0KKyAgICBpZih0cmVlKSBmcmVlX2V4cHJlc3Npb24odHJlZSk7CisgIH0KKyAgY3IoKTsKKyAga2lsbHNwKCk7CisgIGlmKGN0b2stPnR5cGUhPVJCUkEpIHN0YXRlbWVudCgpOworfQordm9pZCBpZl9zdGF0ZW1lbnQodm9pZCkKKy8qICBiZWFyYmVpdGV0IGlmX3N0YXRlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBpbnQgbHRydWUsbGZhbHNlLGxvdXQsY2V4cHI9MCxjbSx0bSxtZXJrX2Vsc2VuZWVkOworICBucCB0cmVlO0lDICpuZXc7CisgIHN0YXRpYyBpbnQgZWxzZW5lZWQ7CisgIG1lcmtfZWxzZW5lZWQ9ZWxzZW5lZWQ7CisgIGVsc2VuZWVkPTA7CisgIGtpbGxzcCgpOworICBpZihjdG9rLT50eXBlPT1MUEFSKSBuZXh0X3Rva2VuKCk7IGVsc2UgZXJyb3IoMTUxKTsKKyAga2lsbHNwKCk7Y209bm9jb2RlOworICB0cmVlPWV4cHJlc3Npb24oKTsKKyAgaWYoIXRyZWUpeworICAgIGVycm9yKDEzNSk7CisgIH1lbHNleworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgIGx0cnVlPSsrbGFiZWw7bGZhbHNlPSsrbGFiZWw7CisgICAgc2ltcGxlX2FsZ19vcHQodHJlZSk7CisgICAgaWYodHlwZV9leHByZXNzaW9uKHRyZWUsYW5kY29tcCh0cmVlLDApKSl7CisgICAgICB0cmVlPW1ha2Vwb2ludGVyKHRyZWUpOworICAgICAgaWYoIUlTQVJJVEgodHJlZS0+bnR5cC0+ZmxhZ3MpJiYhSVNQT0lOVEVSKHRyZWUtPm50eXAtPmZsYWdzKSl7CisJZXJyb3IoMTM2KTsKKyAgICAgIH1lbHNleworCWlmKHRyZWUtPmZsYWdzPT1BU1NJR04mJnRyZWUtPnJpZ2h0LT5mbGFncyE9Q0FMTCkgZXJyb3IoMTY0KTsKKwlnZW5fSUModHJlZSxsdHJ1ZSxsZmFsc2UpOworCWlmKHRyZWUtPmZsYWdzPT1DRVhQUil7CisJICBldmFsX2NvbnN0KCZ0cmVlLT52YWwsdHJlZS0+bnR5cC0+ZmxhZ3MmTlUpOworCSAgaWYoemxkZXF0byh2bGRvdWJsZSxkMnpsZCgwLjApKSYmem1lcXRvKHZtYXgsbDJ6bSgwTCkpJiZ6dW1lcXRvKHZ1bWF4LHVsMnp1bSgwVUwpKSkgY2V4cHI9MjsgZWxzZSBjZXhwcj0xOworCX1lbHNlCisJICBjZXhwcj0wOworCWlmKCh0cmVlLT5vLmZsYWdzJihTQ1JBVENIfFJFRykpPT0oU0NSQVRDSHxSRUcpJiZjZXhwcikgZnJlZV9yZWcodHJlZS0+by5yZWcpOworCWlmKHRyZWUtPm8uZmxhZ3MmJiFjZXhwcil7CisJICBnZW5fdGVzdCgmdHJlZS0+byx0cmVlLT5udHlwLT5mbGFncyxCRVEsbGZhbHNlKTsKKyNpZiAwCisJICBuZXc9bmV3X0lDKCk7CisJICBuZXctPmNvZGU9VEVTVDsKKwkgIG5ldy0+cTE9dHJlZS0+bzsKKwkgIG5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CisJICBuZXctPnR5cGY9dHJlZS0+bnR5cC0+ZmxhZ3M7CisJICBhZGRfSUMobmV3KTsKKwkgIG5ldz1uZXdfSUMoKTsKKwkgIG5ldy0+Y29kZT1CRVE7CisJICBuZXctPnR5cGY9bGZhbHNlOworCSAgYWRkX0lDKG5ldyk7CisjZW5kaWYKKwl9CisJaWYoY2V4cHI9PTIpeworCSAgbmV3PW5ld19JQygpOworCSAgbmV3LT5jb2RlPUJSQTsKKwkgIG5ldy0+dHlwZj1sZmFsc2U7CisJICBhZGRfSUMobmV3KTsKKwl9CisgICAgICB9CisgICAgfQorICAgIHRtPXRyZWUtPm8uZmxhZ3M7CisgICAgZnJlZV9leHByZXNzaW9uKHRyZWUpOworICB9CisgIGtpbGxzcCgpOyBpZihjdG9rLT50eXBlPT1SUEFSKSBuZXh0X3Rva2VuKCk7IGVsc2UgZXJyb3IoNTkpOworICBpZihjZXhwcj09Mikgbm9jb2RlPTE7CisgIGlmKCFjZXhwciYmIXRtKSBnZW5fbGFiZWwobHRydWUpOworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICBzdGF0ZW1lbnQoKTsKKyAga2lsbHNwKCk7CisgIGlmKGN0b2stPnR5cGUhPU5BTUV8fHN0cmNtcCgiZWxzZSIsY3Rvay0+bmFtZSkpeworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgIG5vY29kZT1jbTsKKyAgICBpZihjZXhwciE9MSkgZ2VuX2xhYmVsKGxmYWxzZSk7CisgICAgZWxzZW5lZWQ9bWVya19lbHNlbmVlZDsKKyAgICByZXR1cm47CisgIH0KKyAgbmV4dF90b2tlbigpOworICBsb3V0PSsrbGFiZWw7CisgIGlmKGNleHByIT0yKXsKKyAgICBuZXc9bmV3X0lDKCk7CisgICAgbmV3LT5jb2RlPUJSQTsKKyAgICBuZXctPnR5cGY9bG91dDsKKyAgICBhZGRfSUMobmV3KTsKKyAgfQorICBpZihjZXhwciE9MSkge25vY29kZT1jbTtnZW5fbGFiZWwobGZhbHNlKTt9CisgIGlmKGNleHByPT0xKSBub2NvZGU9MTsgZWxzZSBub2NvZGU9Y207CisgIGlmKGN0b2stPnR5cGUhPUxCUkEpeworCSAgaWYoY3Rvay0+dHlwZSE9TkFNRXx8c3RyY21wKCJpZiIsY3Rvay0+bmFtZSkpIHsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKwkgIH0KKyAgICBlbHNlCisgICAgICBlbHNlbmVlZD0xOworICB9CisgIHN0YXRlbWVudCgpOworICBlbHNlbmVlZD1tZXJrX2Vsc2VuZWVkOworICBub2NvZGU9Y207CisgIGlmKGNleHByIT0yKSBnZW5fbGFiZWwobG91dCk7CisgIGNyKCk7Cit9CisKKwordm9pZCBzd2l0Y2hfc3RhdGVtZW50KHZvaWQpCisvKiAgYmVhcmJlaXRldCBzd2l0Y2hfc3RhdGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgbnAgdHJlZTtpbnQgbWVya190eXAsbWVya19jb3VudCxtZXJrX2JyZWFrLG51bV9jYXNlczsKKwlJQyAqbWVya19maWMsKm1lcmtfbGljLCpuZXc7bGxpc3QgKmxwLCpsMSwqbDI7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgIG5vY29kZT0wOworICBraWxsc3AoKTsKKyAgaWYoY3Rvay0+dHlwZT09TFBBUil7CisJCW5leHRfdG9rZW4oKTtraWxsc3AoKTsKKwl9IGVsc2UgZXJyb3IoMTUxKTsKKyAgdHJlZT1leHByZXNzaW9uKCk7IGtpbGxzcCgpOworICBpZihjdG9rLT50eXBlPT1SUEFSKXsKKwkJbmV4dF90b2tlbigpO2tpbGxzcCgpOworCX0gZWxzZSBlcnJvcig1OSk7CisgIG1lcmtfdHlwPXN3aXRjaF90eXA7bWVya19jb3VudD1zd2l0Y2hfYWN0O21lcmtfYnJlYWs9YnJlYWtfbGFiZWw7CisgIGlmKCF0cmVlKXsKKyAgICBlcnJvcigxMzcpOworICB9IGVsc2UgeworICAgIGlmKCF0eXBlX2V4cHJlc3Npb24odHJlZSwwKSl7CisgICAgfWVsc2V7CisgICAgICBpZighSVNJTlQodHJlZS0+bnR5cC0+ZmxhZ3MpKXsKKwllcnJvcigxMzgpOworICAgICAgfSBlbHNlIHsKKwlpbnQgbTEsbTIsbTMsZGVmPTAscm0scm0xLHJtMixtaW5mbGFnOworCXptYXggbCxtbCxzO3p1bWF4IHVsLG11bCx1czsKKwlpZih0cmVlLT5mbGFncz09QVNTSUdOJiZ0cmVlLT5yaWdodC0+ZmxhZ3MhPUNBTEwpIGVycm9yKDE2NCk7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmIAorCW0zPWJyZWFrX2xhYmVsPSsrbGFiZWw7bTE9c3dpdGNoX2FjdD0rK3N3aXRjaF9jb3VudDsKKwltMj1zd2l0Y2hfdHlwPXRyZWUtPm50eXAtPmZsYWdzJk5VOworCWdlbl9JQyh0cmVlLDAsMCk7CisJaWYoKFNXSVRDSFNVQlMmJiFzaG9ydGN1dChTVUIsbTIpKXx8KCFTV0lUQ0hTVUJTJiYhc2hvcnRjdXQoQ09NUEFSRSxtMikpKXsKKwkgIHN3aXRjaF90eXA9bTI9aW50X2VydyhtMik7CisJICBjb252ZXJ0KHRyZWUsbTIpOworCX0KKwlpZigodHJlZS0+by5mbGFncyYoRFJFRk9CSnxTQ1JBVENIKSkhPVNDUkFUQ0gpeworCSAgbmV3PW5ld19JQygpOworCSAgbmV3LT5jb2RlPUFTU0lHTjsKKwkgIG5ldy0+cTE9dHJlZS0+bzsKKwkgIG5ldy0+cTIuZmxhZ3M9MDsKKwkgIG5ldy0+cTIudmFsLnZtYXg9c2l6ZXRhYlttMiZOUV07CisJICBnZXRfc2NyYXRjaCgmbmV3LT56LG0yLDAsMCk7CisJICBuZXctPnR5cGY9bTI7CisJICB0cmVlLT5vPW5ldy0+ejsKKwkgIGFkZF9JQyhuZXcpOworCX0KKwlpZigodHJlZS0+by5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSl7CisJICBpbnQgcj10cmVlLT5vLnJlZzsKKwkgIHJtPXJlZ3Nbcl07CisJICByZWdzW3JdPXJlZ3NhW3JdOworCSAgaWYocmVnX3BhaXIociwmcnApKXsKKwkgICAgcm0xPXJlZ3NbcnAucjFdOworCSAgICBybTI9cmVnc1tycC5yMl07CisJICAgIHJlZ3NbcnAucjFdPXJlZ3NhW3JwLnIxXTsKKwkgICAgcmVnc1tycC5yMl09cmVnc2FbcnAucjJdOworCSAgfQorCX0KKwltZXJrX2ZpYz1maXJzdF9pYzttZXJrX2xpYz1sYXN0X2ljOworCQorCWZpcnN0X2ljPWxhc3RfaWM9MDsKKwl7CisJICBpbnQgbWVya19zYj1zd2l0Y2hicmVhazsKKwkgIHN3aXRjaGJyZWFrPTE7CisJICBzdGF0ZW1lbnQoKTsKKwkgIHN3aXRjaGJyZWFrPW1lcmtfc2I7CisJfQorCQorCWlmKCh0cmVlLT5vLmZsYWdzJihTQ1JBVENIfFJFRykpPT0oU0NSQVRDSHxSRUcpKXsKKwkgIGludCByPXRyZWUtPm8ucmVnOworCSAgcmVnc1tyXT1ybTsKKwkgIGlmKHJlZ19wYWlyKHIsJnJwKSl7CisJICAgIHJlZ3NbcnAucjFdPXJtMTsKKwkgICAgcmVnc1tycC5yMl09cm0yOworCSAgfQorCX0KKwltaW5mbGFnPTA7cz1sMnptKDBMKTt1cz11bDJ6dW0oMFVMKTsKKwludW1fY2FzZXM9MDsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKwlmb3IobDE9Zmlyc3RfbGxpc3Q7bDE7bDE9bDEtPm5leHQpCisJICBpZihsMS0+c3dpdGNoX2NvdW50PT1tMSkgbnVtX2Nhc2VzKys7CisJZm9yKGwxPWZpcnN0X2xsaXN0O2wxO2wxPWwxLT5uZXh0KXsKKwkgIGlmKGwxLT5zd2l0Y2hfY291bnQhPW0xKSBjb250aW51ZTsKKwkgIGlmKGwxLT5mbGFncyZMQUJFTERFRkFVTFQpeworCSAgICBpZihkZWYpIGVycm9yKDEzOSk7CisJICAgIGRlZj1sMS0+bGFiZWw7CisJICAgIGNvbnRpbnVlOworCSAgfQorCSAgbHA9MDttaW5mbGFnJj1+MTsKKwkgIGZvcihsMj1maXJzdF9sbGlzdDtsMjtsMj1sMi0+bmV4dCl7CisJICAgIGlmKGwyLT5zd2l0Y2hfY291bnQhPW0xKSBjb250aW51ZTsKKwkgICAgaWYobDItPmZsYWdzJkxBQkVMREVGQVVMVCkgY29udGludWU7CisJICAgIGV2YWxfY29uc3QoJmwyLT52YWwsbTIpOworCSAgICBpZihtaW5mbGFnJjIpeworCSAgICAgIGlmKG0yJlVOU0lHTkVEKXsKKwkJaWYoenVtbGVxKHZ1bWF4LG11bCl8fHp1bWVxdG8odnVtYXgsbXVsKSkgY29udGludWU7CisJICAgICAgfWVsc2V7CisJCWlmKHptbGVxKHZtYXgsbWwpfHx6bWVxdG8odm1heCxtbCkpIGNvbnRpbnVlOworCSAgICAgIH0KKwkgICAgfQorCSAgICBpZihtaW5mbGFnJjEpeworCSAgICAgIGlmKG0yJlVOU0lHTkVEKXsKKwkJaWYoIShtaW5mbGFnJjQpJiZ6dW1lcXRvKHZ1bWF4LHVsKSl7IAorCQkgIGVycm9yKDIwMSk7CisJCSAgbWluZmxhZ3w9NDsKKwkJfQorCQlpZih6dW1sZXEodnVtYXgsdWwpKXsKKwkJICBscD1sMjsKKwkJICB1bD12dW1heDsKKwkJfQorCSAgICAgIH1lbHNleworCQlpZighKG1pbmZsYWcmNCkmJnptZXF0byh2bWF4LGwpKXsgZXJyb3IoMjAxKTttaW5mbGFnfD00O30KKwkJaWYoem1sZXEodm1heCxsKSl7bHA9bDI7bD12bWF4O30KKwkgICAgICB9CisJICAgIH1lbHNleworCSAgICAgIG1pbmZsYWd8PTE7CisJICAgICAgbD12bWF4OworCSAgICAgIHVsPXZ1bWF4OworCSAgICAgIGxwPWwyOworCSAgICB9CisJICB9CisJICBpZighbHApIGNvbnRpbnVlOworCSAgbWw9bDttdWw9dWw7bWluZmxhZ3w9MjsKKwkgIGlmKFNXSVRDSFNVQlMmJm51bV9jYXNlczxKVU1QX1RBQkxFX0xFTkdUSCl7CisJICAgIG5ldz1uZXdfSUMoKTsKKwkgICAgbmV3LT5saW5lPTA7CisJICAgIG5ldy0+ZmlsZT0wOworCSAgICBuZXctPnR5cGY9bTI7CisJICAgIG5ldy0+Y29kZT1TVUI7CisJICAgIG5ldy0+cTE9dHJlZS0+bzsKKwkgICAgbmV3LT56PXRyZWUtPm87CisJICAgIG5ldy0+cTIuZmxhZ3M9S09OU1Q7CisJICAgIGV2YWxfY29uc3QoJmxwLT52YWwsbTIpOworCSAgICBpZihtMiZVTlNJR05FRCl7CisJICAgICAgZ3ZhbC52dW1heD16dW1zdWIodnVtYXgsdXMpOworCSAgICAgIGV2YWxfY29uc3QoJmd2YWwsVU5TSUdORUR8TUFYSU5UKTsKKwkgICAgfWVsc2V7CisJICAgICAgZ3ZhbC52bWF4PXptc3ViKHZtYXgscyk7CisJICAgICAgZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworCSAgICB9CisJICAgIGluc2VydF9jb25zdCgmbmV3LT5xMi52YWwsbTIpOworCSAgICBuZXctPnExLmFtPW5ldy0+cTIuYW09bmV3LT56LmFtPTA7CisJICAgIHM9bDt1cz11bDsKKwkgICAgbmV3LT5wcmV2PW1lcmtfbGljOworCSAgICBpZihtZXJrX2xpYykgbWVya19saWMtPm5leHQ9bmV3OyBlbHNlIG1lcmtfZmljPW5ldzsKKwkgICAgbWVya19saWM9bmV3OworCSAgICBuZXc9bmV3X0lDKCk7CisJICAgIG5ldy0+bGluZT0wOworCSAgICBuZXctPmZpbGU9MDsKKwkgICAgbmV3LT50eXBmPW0yOworCSAgICBuZXctPmNvZGU9VEVTVDsKKwkgICAgbmV3LT5xMT10cmVlLT5vOworCSAgICBuZXctPnEyLmZsYWdzPW5ldy0+ei5mbGFncz0wOworCSAgICBuZXctPnByZXY9bWVya19saWM7CisJICAgIG5ldy0+cTEuYW09bmV3LT5xMi5hbT1uZXctPnouYW09MDsKKwkgICAgaWYobWVya19saWMpIG1lcmtfbGljLT5uZXh0PW5ldzsgZWxzZSBtZXJrX2ZpYz1uZXc7CisJICAgIG1lcmtfbGljPW5ldzsKKwkgIH1lbHNleworCSAgICBuZXc9bmV3X0lDKCk7CisJICAgIG5ldy0+bGluZT0wOworCSAgICBuZXctPmZpbGU9MDsKKwkgICAgbmV3LT5jb2RlPUNPTVBBUkU7CisJICAgIG5ldy0+dHlwZj1tMjsKKwkgICAgbmV3LT5xMT10cmVlLT5vOworCSAgICBuZXctPnEyLmZsYWdzPUtPTlNUOworCSAgICBuZXctPnEyLnZhbD1scC0+dmFsOworCSAgICBuZXctPnouZmxhZ3M9MDsKKwkgICAgbmV3LT5wcmV2PW1lcmtfbGljOworCSAgICBuZXctPnExLmFtPW5ldy0+cTIuYW09bmV3LT56LmFtPTA7CisJICAgIGlmKG1lcmtfbGljKSBtZXJrX2xpYy0+bmV4dD1uZXc7IGVsc2UgbWVya19maWM9bmV3OworCSAgICBtZXJrX2xpYz1uZXc7CisJICB9CisJICBuZXc9bmV3X0lDKCk7CisJICBuZXctPmxpbmU9MDsKKwkgIG5ldy0+ZmlsZT0wOworCSAgbmV3LT5jb2RlPUJFUTsKKwkgIG5ldy0+dHlwZj1scC0+bGFiZWw7CisJICBuZXctPnExLmZsYWdzPW5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CisJICBuZXctPnByZXY9bWVya19saWM7CisJICBuZXctPnExLmFtPW5ldy0+cTIuYW09bmV3LT56LmFtPTA7CisJICBtZXJrX2xpYy0+bmV4dD1uZXc7CisJICBtZXJrX2xpYz1uZXc7CisJfQorCWlmKCh0cmVlLT5vLmZsYWdzJihTQ1JBVENIfFJFRykpPT0oU0NSQVRDSHxSRUcpKXsgICAvKiBmcmVlX3JlZyh0cmVlLT5vLnJlZyk7ICovCisJICBuZXc9bmV3X0lDKCk7CisJICBuZXctPmxpbmU9MDsKKwkgIG5ldy0+ZmlsZT0wOworCSAgbmV3LT5jb2RlPUZSRUVSRUc7bmV3LT50eXBmPTA7CisJICBuZXctPnEyLmZsYWdzPW5ldy0+ei5mbGFncz0wOworCSAgbmV3LT5xMS5mbGFncz1SRUc7CisJICBuZXctPnExLnJlZz10cmVlLT5vLnJlZzsKKwkgIG5ldy0+cHJldj1tZXJrX2xpYzsKKwkgIG5ldy0+cTEuYW09bmV3LT5xMi5hbT1uZXctPnouYW09MDsKKwkgIGlmKG1lcmtfbGljKSBtZXJrX2xpYy0+bmV4dD1uZXc7IGVsc2UgbWVya19maWM9bmV3OworCSAgbWVya19saWM9bmV3OworCSAgcmVnc1t0cmVlLT5vLnJlZ109cmVnc2FbdHJlZS0+by5yZWddOworCSAgaWYocmVnX3BhaXIodHJlZS0+by5yZWcsJnJwKSl7IHJlZ3NbcnAucjFdPXJlZ3NhW3JwLnIxXTtyZWdzW3JwLnIyXT1yZWdzYVtycC5yMl07fQorCX0KKwluZXc9bmV3X0lDKCk7CisJbmV3LT5saW5lPTA7CisJbmV3LT5maWxlPTA7CisJbmV3LT5jb2RlPUJSQTsKKwlpZihkZWYpIG5ldy0+dHlwZj1kZWY7IGVsc2UgeworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorCSAgbmV3LT50eXBmPW0zOworCX0KKwluZXctPnExLmZsYWdzPW5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CisJaWYobWVya19saWMpIG1lcmtfbGljLT5uZXh0PW5ldzsgZWxzZSBtZXJrX2ZpYz1uZXc7CisJbmV3LT5wcmV2PW1lcmtfbGljOworCWlmKGZpcnN0X2ljKXsKKwkgIGZpcnN0X2ljLT5wcmV2PW5ldzsKKwkgIG5ldy0+bmV4dD1maXJzdF9pYzsKKwl9ZWxzZXsKKwkgIGxhc3RfaWM9bmV3OworCSAgbmV3LT5uZXh0PWZpcnN0X2ljOworCX0KKwluZXctPnExLmFtPW5ldy0+cTIuYW09bmV3LT56LmFtPTA7CisJZmlyc3RfaWM9bWVya19maWM7CisJZ2VuX2xhYmVsKG0zKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgc3dpdGNoX3R5cD1tZXJrX3R5cDtzd2l0Y2hfYWN0PW1lcmtfY291bnQ7YnJlYWtfbGFiZWw9bWVya19icmVhazsKKyAgaWYodHJlZSkgZnJlZV9leHByZXNzaW9uKHRyZWUpOworICBjcigpOworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorfQordm9pZCByZXBhaXJfdHJlZShucCBwKQorLyogIEJlYXJiZWl0ZXQgZWluZW4gQXVzZHJ1Y2tiYXVtIHNvLCBkYXNzIGVyIGVpbiB6d2VpdGVzIE1hbCAgICovCisvKiAgbWl0IGdlbl9JQyBlcnpldWd0IHdlcmRlbiBrYW5uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYocC0+bGVmdCkgcmVwYWlyX3RyZWUocC0+bGVmdCk7CisgIGlmKHAtPnJpZ2h0KSByZXBhaXJfdHJlZShwLT5yaWdodCk7CisgIGlmKHAtPmZsYWdzPT1JREVOVElGSUVSfHxwLT5mbGFncz09KElERU5USUZJRVJ8MjU2KSkKKyAgICBwLT5vLnY9ZmluZF92YXIocC0+aWRlbnRpZmllciwwKTsKKyAgaWYocC0+ZmxhZ3M9PUNBTEwpeworICAgIGFyZ3VtZW50X2xpc3QgKmFsPXAtPmFsaXN0OworICAgIHdoaWxlKGFsKXsKKyAgICAgIHJlcGFpcl90cmVlKGFsLT5hcmcpOworICAgICAgYWw9YWwtPm5leHQ7CisgICAgfQorICB9Cit9Cit2b2lkIHdoaWxlX3N0YXRlbWVudCh2b2lkKQorLyogIGJlYXJiZWl0ZXQgd2hpbGVfc3RhdGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIG5wIHRyZWU7aW50IGxsb29wLGxpbixsb3V0LGNtLGNleHByLGNvbnRtLGJyZWFrbTsKKyAgSUMgKm5ldywqbWljOyBpbnQgbGluZSx0dmFsaWQ7Y2hhciAqZmlsZTsKKyAga2lsbHNwKCk7CisgIGlmKGN0b2stPnR5cGU9PUxQQVIpIHtuZXh0X3Rva2VuKCk7a2lsbHNwKCk7fSBlbHNlIGVycm9yKDE1MSk7CisgIHRyZWU9ZXhwcmVzc2lvbigpOworICBjZXhwcj0wOworICBpZih0cmVlKXsKKyAgICBzaW1wbGVfYWxnX29wdCh0cmVlKTsKKyAgICBpZih0dmFsaWQ9dHlwZV9leHByZXNzaW9uKHRyZWUsYW5kY29tcCh0cmVlLDApKSl7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgICB0cmVlPW1ha2Vwb2ludGVyKHRyZWUpOworICAgICAgaWYoIUlTQVJJVEgodHJlZS0+bnR5cC0+ZmxhZ3MpJiYhSVNQT0lOVEVSKHRyZWUtPm50eXAtPmZsYWdzKSl7CisJZXJyb3IoMTQwKTsKKwljZXhwcj0tMTsKKyAgICAgIH1lbHNleworCWlmKHRyZWUtPmZsYWdzPT1BU1NJR04mJnRyZWUtPnJpZ2h0LT5mbGFncyE9Q0FMTCkgZXJyb3IoMTY0KTsKKwlpZih0cmVlLT5mbGFncz09Q0VYUFIpeworCSAgZXZhbF9jb25zdCgmdHJlZS0+dmFsLHRyZWUtPm50eXAtPmZsYWdzKTsKKwkgIGlmKHpsZGVxdG8odmxkb3VibGUsZDJ6bGQoMC4wKSkmJnptZXF0byh2bWF4LGwyem0oMEwpKSYmenVtZXF0byh2dW1heCx1bDJ6dW0oMFVMKSkpIGNleHByPTE7IGVsc2UgY2V4cHI9MjsKKwkgIGlmKGNleHByPT0xKSBlcnJvcigxNTIpOworCX0KKyAgICAgIH0KKyAgICB9ZWxzZSBjZXhwcj0tMTsKKyAgfSBlbHNlIGVycm9yKDE0MSk7CisgIGxsb29wPSsrbGFiZWw7bGluPSsrbGFiZWw7bG91dD0rK2xhYmVsO2NtPW5vY29kZTsKKyAgY29udG09Y29udF9sYWJlbDticmVha209YnJlYWtfbGFiZWw7CisgIGlmKCFjZXhwcnx8dHJlZS0+c2lkZWZ4KSBjb250X2xhYmVsPWxpbjsgZWxzZSBjb250X2xhYmVsPWxsb29wOworICBpZighY2V4cHJ8fHRyZWUtPnNpZGVmeCl7CisgICAgaWYoY19mbGFnc192YWxbMF0ubCYyKXsgLyogIGJlaSBPcHRpbWllcnVuZyAqLworICAgICAgaWYodHZhbGlkKXsKKwlnZW5fSUModHJlZSxsbG9vcCxsb3V0KTsKKwlpZih0cmVlLT5vLmZsYWdzKXsKKwkgIGdlbl90ZXN0KCZ0cmVlLT5vLHRyZWUtPm50eXAtPmZsYWdzLEJFUSxsb3V0KTsKKyNpZiAwCisJICBuZXc9bmV3X0lDKCk7CisJICBuZXctPmNvZGU9VEVTVDsKKwkgIG5ldy0+dHlwZj10cmVlLT5udHlwLT5mbGFnczsKKwkgIG5ldy0+cTE9dHJlZS0+bzsKKwkgIG5ldy0+cTIuZmxhZ3M9bmV3LT56LmZsYWdzPTA7CisJICBhZGRfSUMobmV3KTsKKwkgIG5ldz1uZXdfSUMoKTsKKwkgIG5ldy0+Y29kZT1CRVE7CisJICBuZXctPnR5cGY9bG91dDsKKwkgIGFkZF9JQyhuZXcpOworI2VuZGlmCisJfQorCXJlcGFpcl90cmVlKHRyZWUpOworICAgICAgfQorICAgIH1lbHNleworICAgICAgbmV3PW5ld19JQygpOworICAgICAgbmV3LT5jb2RlPUJSQTsKKyAgICAgIG5ldy0+dHlwZj1saW47CisgICAgICBuZXctPmZsYWdzfD1MT09QX0NPTkRfVFJVRTsKKyAgICAgIGFkZF9JQyhuZXcpOworICAgIH0KKyAgfQorICBpZihjZXhwcj09MSl7CisgICAgbmV3PW5ld19JQygpOworICAgIG5ldy0+Y29kZT1CUkE7CisgICAgbmV3LT50eXBmPWxvdXQ7CisgICAgYWRkX0lDKG5ldyk7CisgIH1lbHNleworICAgIGdlbl9sYWJlbChsbG9vcCk7CisgICAgbGFzdF9pYy0+ZmxhZ3N8PUxPT1BfQ09ORF9UUlVFOworICB9CisgIGxpbmU9bGFzdF9pYy0+bGluZTtmaWxlPWxhc3RfaWMtPmZpbGU7CisgIGNtPW5vY29kZTticmVha19sYWJlbD1sb3V0OworICBpZihjZXhwcj09MSkgbm9jb2RlPTE7CisgIGN1cnJlbnRwcmkqPWxvb3Bwcmk7CisgIGtpbGxzcCgpOworICBpZihjdG9rLT50eXBlPT1SUEFSKSB7bmV4dF90b2tlbigpO2tpbGxzcCgpO30gZWxzZSBlcnJvcig1OSk7CisgIHsKKyAgICBpbnQgbWVya19zYj1zd2l0Y2hicmVhazsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICBzd2l0Y2hicmVhaz0wOworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgIHN0YXRlbWVudCgpOworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgIHN3aXRjaGJyZWFrPW1lcmtfc2I7CisgIH0KKyAgbWljPWxhc3RfaWM7CisgIG5vY29kZT1jbTtjb250X2xhYmVsPWNvbnRtO2JyZWFrX2xhYmVsPWJyZWFrbTsKKyAgaWYoIWNleHByfHx0cmVlLT5zaWRlZngpIGdlbl9sYWJlbChsaW4pOworICAvKiBjb3JyZWN0IGlmIG1pYyB3YXMgYSBicmFuY2ggdG8gbGFiZWwgbGluIGFuZCBlbGltaW5hdGVkICovCisgIGlmKGxhc3RfaWMtPnByZXYhPW1pYykgbWljPWxhc3RfaWM7CisgIGlmKHRyZWUmJmNleHByPj0wKXsKKyAgICBpZihjZXhwciE9MXx8dHJlZS0+c2lkZWZ4KXsKKyAgICAgIGdlbl9JQyh0cmVlLGxsb29wLGxvdXQpOworICAgICAgaWYoKHRyZWUtPm8uZmxhZ3MmKFNDUkFUQ0h8UkVHKSk9PShTQ1JBVENIfFJFRykmJmNleHByKSBmcmVlX3JlZyh0cmVlLT5vLnJlZyk7CisgICAgfQorICAgIGlmKHRyZWUtPm8uZmxhZ3MmJiFjZXhwcil7CisgICAgICBnZW5fdGVzdCgmdHJlZS0+byx0cmVlLT5udHlwLT5mbGFncyxCTkUsbGxvb3ApOworI2lmIDAKKyAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgIG5ldy0+Y29kZT1URVNUOworICAgICAgbmV3LT50eXBmPXRyZWUtPm50eXAtPmZsYWdzOworICAgICAgbmV3LT5xMT10cmVlLT5vOworICAgICAgbmV3LT5xMi5mbGFncz1uZXctPnouZmxhZ3M9MDsKKyAgICAgIGFkZF9JQyhuZXcpOworICAgICAgbmV3PW5ld19JQygpOworICAgICAgbmV3LT5jb2RlPUJORTsKKyAgICAgIG5ldy0+dHlwZj1sbG9vcDsKKyAgICAgIGFkZF9JQyhuZXcpOworI2VuZGlmCisgICAgfQorICAgIGlmKGNleHByPT0yKXsKKyAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgIG5ldy0+Y29kZT1CUkE7CisgICAgICBuZXctPnR5cGY9bGxvb3A7CisgICAgICBhZGRfSUMobmV3KTsKKyAgICB9CisgIH0KKyAgaWYodHJlZSkgZnJlZV9leHByZXNzaW9uKHRyZWUpOworICBmb3IobWljPW1pYy0+bmV4dDttaWM7bWljPW1pYy0+bmV4dCl7CisgICAgbWljLT5saW5lPWxpbmU7bWljLT5maWxlPWZpbGU7CisgIH0KKyAgZ2VuX2xhYmVsKGxvdXQpOworICBjdXJyZW50cHJpLz1sb29wcHJpOworICBjcigpOworfQordm9pZCBmb3Jfc3RhdGVtZW50KHZvaWQpCisvKiAgYmVhcmJlaXRldCBmb3Jfc3RhdGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgbnAgdHJlZTE9MCx0cmVlMj0wLHRyZWUzPTA7aW50IGxsb29wLGxpbixsb3V0LGNtLGNleHByPTAsY29udG0sYnJlYWttLHdpdGhfZGVjbCx0dmFsaWQ7CisgIElDICpuZXcsKm1pYztpbnQgbGluZTtjaGFyICpmaWxlOworICBraWxsc3AoKTsKKyAgaWYoY3Rvay0+dHlwZT09TFBBUikge25leHRfdG9rZW4oKTtraWxsc3AoKTt9IGVsc2UgZXJyb3IoNTkpOworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICBpZihjOTkmJmRlY2xhcmF0aW9uKDApKXsKKyAgICB3aXRoX2RlY2w9MTsKKyAgICBlbnRlcl9ibG9jaygpOworICAgIGlmKG5lc3Rpbmc+MCkgbG9jYWxfb2Zmc2V0W25lc3RpbmddPWxvY2FsX29mZnNldFtuZXN0aW5nLTFdOworICAgIGZvcl9kZWNsPTE7CisgICAgdmFyX2RlY2xhcmF0aW9uKCk7CisgICAgZm9yX2RlY2w9MDsKKyAgfWVsc2V7CisgICAgd2l0aF9kZWNsPTA7CisgICAgaWYoY3Rvay0+dHlwZSE9U0VNSUMpIHRyZWUxPWV4cHJlc3Npb24oKTsKKyAgICBpZih0cmVlMSl7CisgICAgICBpZih0cmVlMS0+ZmxhZ3M9PVBPU1RJTkMpIHRyZWUxLT5mbGFncz1QUkVJTkM7CisgICAgICBpZih0cmVlMS0+ZmxhZ3M9PVBPU1RERUMpIHRyZWUxLT5mbGFncz1QUkVERUM7CisgICAgICBpZih0eXBlX2V4cHJlc3Npb24odHJlZTEsMCkpeworCWlmKHRyZWUxLT5zaWRlZngpeworCSAgZ2VuX0lDKHRyZWUxLDAsMCk7CisJICBpZih0cmVlMSYmKHRyZWUxLT5vLmZsYWdzJihTQ1JBVENIfFJFRykpPT0oU0NSQVRDSHxSRUcpKSBmcmVlX3JlZyh0cmVlMS0+by5yZWcpOworCX1lbHNleworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorCQllcnJvcigxNTMpOworCX0KKyAgICAgIH0KKyAgICAgIGZyZWVfZXhwcmVzc2lvbih0cmVlMSk7CisgICAgfQorICAgIGtpbGxzcCgpOworICAgIGlmKGN0b2stPnR5cGU9PVNFTUlDKSB7bmV4dF90b2tlbigpO2tpbGxzcCgpO30gZWxzZSBlcnJvcig1NCk7CisgIH0KKyAgaWYoY3Rvay0+dHlwZSE9U0VNSUMpIHt0cmVlMj1leHByZXNzaW9uKCk7a2lsbHNwKCk7fSBlbHNlIHtjZXhwcj0yO30KKyAgaWYoY3Rvay0+dHlwZT09U0VNSUMpIHtuZXh0X3Rva2VuKCk7a2lsbHNwKCk7fSBlbHNlIGVycm9yKDU0KTsKKyAgaWYoY3Rvay0+dHlwZSE9UlBBUikgdHJlZTM9ZXhwcmVzc2lvbigpOworICBraWxsc3AoKTsKKyAgaWYoY3Rvay0+dHlwZT09UlBBUikge25leHRfdG9rZW4oKTtraWxsc3AoKTt9IGVsc2UgZXJyb3IoNTkpOworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICBpZih0cmVlMyl7CisgICAgaWYoIXR5cGVfZXhwcmVzc2lvbih0cmVlMywwKSl7CisgICAgICBmcmVlX2V4cHJlc3Npb24odHJlZTMpOworICAgICAgdHJlZTM9MDsKKyAgICB9CisgIH0KKyAgaWYodHJlZTIpeworICAgIHNpbXBsZV9hbGdfb3B0KHRyZWUyKTsKKyAgICBpZih0dmFsaWQ9dHlwZV9leHByZXNzaW9uKHRyZWUyLGFuZGNvbXAodHJlZTIsMCkpKXsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICAgIHRyZWUyPW1ha2Vwb2ludGVyKHRyZWUyKTsKKyAgICAgIGlmKCFJU0FSSVRIKHRyZWUyLT5udHlwLT5mbGFncykmJiFJU1BPSU5URVIodHJlZTItPm50eXAtPmZsYWdzKSl7CisJZXJyb3IoMTQyKTsKKwljZXhwcj0tMTsKKyAgICAgIH1lbHNleworCWlmKHRyZWUyLT5mbGFncz09QVNTSUdOJiZ0cmVlMi0+cmlnaHQtPmZsYWdzIT1DQUxMKSBlcnJvcigxNjQpOworCWlmKHRyZWUyLT5mbGFncz09Q0VYUFIpeworCSAgZXZhbF9jb25zdCgmdHJlZTItPnZhbCx0cmVlMi0+bnR5cC0+ZmxhZ3MpOworCSAgaWYoemxkZXF0byh2bGRvdWJsZSxkMnpsZCgwLjApKSYmem1lcXRvKHZtYXgsbDJ6bSgwTCkpJiZ6dW1lcXRvKHZ1bWF4LHVsMnp1bSgwVUwpKSkgY2V4cHI9MTsgZWxzZSBjZXhwcj0yOworCSAgaWYoY2V4cHI9PTEpIGVycm9yKDE1Mik7CisJfQorICAgICAgfQorICAgIH1lbHNlIGNleHByPS0xOworICB9CisgIGxsb29wPSsrbGFiZWw7bGluPSsrbGFiZWw7bG91dD0rK2xhYmVsO2NtPW5vY29kZTsKKyAgY29udG09Y29udF9sYWJlbDticmVha209YnJlYWtfbGFiZWw7CisgIGNvbnRfbGFiZWw9KytsYWJlbDticmVha19sYWJlbD1sb3V0OworICBpZighY2V4cHJ8fCh0cmVlMiYmdHJlZTItPnNpZGVmeCkpeworICAgIGlmKGNfZmxhZ3NfdmFsWzBdLmwmMil7IC8qICBiZWkgT3B0aW1pZXJ1bmcgKi8KKyAgICAgIGlmKHR2YWxpZCl7CisJZ2VuX0lDKHRyZWUyLGxsb29wLGxvdXQpOworCWlmKHRyZWUyLT5vLmZsYWdzKXsKKwkgIGdlbl90ZXN0KCZ0cmVlMi0+byx0cmVlMi0+bnR5cC0+ZmxhZ3MsQkVRLGxvdXQpOworI2lmIDAKKwkgIG5ldz1uZXdfSUMoKTsKKwkgIG5ldy0+Y29kZT1URVNUOworCSAgbmV3LT50eXBmPXRyZWUyLT5udHlwLT5mbGFnczsKKwkgIG5ldy0+cTE9dHJlZTItPm87CisJICBuZXctPnEyLmZsYWdzPW5ldy0+ei5mbGFncz0wOworCSAgYWRkX0lDKG5ldyk7CisJICBuZXc9bmV3X0lDKCk7CisJICBuZXctPmNvZGU9QkVROworCSAgbmV3LT50eXBmPWxvdXQ7CisJICBhZGRfSUMobmV3KTsKKyNlbmRpZgorCX0KKwlyZXBhaXJfdHJlZSh0cmVlMik7CisgICAgICB9CisgICAgfWVsc2V7CisgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICBuZXctPmNvZGU9QlJBOworICAgICAgbmV3LT50eXBmPWxpbjsKKyAgICAgIG5ldy0+ZmxhZ3N8PUxPT1BfQ09ORF9UUlVFOworICAgICAgYWRkX0lDKG5ldyk7CisgICAgfQorICB9CisgIGlmKGNleHByPT0xKXsKKyAgICBuZXc9bmV3X0lDKCk7CisgICAgbmV3LT5jb2RlPUJSQTsKKyAgICBuZXctPnR5cGY9bG91dDsKKyAgICBhZGRfSUMobmV3KTsKKyAgfWVsc2V7CisgICAgZ2VuX2xhYmVsKGxsb29wKTsKKyAgICBsYXN0X2ljLT5mbGFnc3w9TE9PUF9DT05EX1RSVUU7CisgIH0KKyAgbGluZT1sYXN0X2ljLT5saW5lO2ZpbGU9bGFzdF9pYy0+ZmlsZTsKKyAgY209bm9jb2RlOworICBpZihjZXhwcj09MSkgbm9jb2RlPTE7CisgIGN1cnJlbnRwcmkqPWxvb3Bwcmk7CisgIHsKKyAgICBpbnQgbWVya19zYj1zd2l0Y2hicmVhazsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICBzd2l0Y2hicmVhaz0wOworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgIHN0YXRlbWVudCgpOworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgIHN3aXRjaGJyZWFrPW1lcmtfc2I7CisgIH0KKyAgbWljPWxhc3RfaWM7CisgIG5vY29kZT1jbTsKKyAgZ2VuX2xhYmVsKGNvbnRfbGFiZWwpOworICBjb250X2xhYmVsPWNvbnRtO2JyZWFrX2xhYmVsPWJyZWFrbTsKKyAgaWYodHJlZTMpeworICAgIGlmKHRyZWUzLT5mbGFncz09UE9TVElOQykgdHJlZTMtPmZsYWdzPVBSRUlOQzsKKyAgICBpZih0cmVlMy0+ZmxhZ3M9PVBPU1RERUMpIHRyZWUzLT5mbGFncz1QUkVERUM7CisgICAgaWYodHJlZTMtPnNpZGVmeCl7CisgICAgICBnZW5fSUModHJlZTMsMCwwKTsKKyAgICAgIGlmKHRyZWUzJiYodHJlZTMtPm8uZmxhZ3MmKFNDUkFUQ0h8UkVHKSk9PShTQ1JBVENIfFJFRykpIGZyZWVfcmVnKHRyZWUzLT5vLnJlZyk7CisgICAgfWVsc2V7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisJCWVycm9yKDE1Myk7fQorICAgIGZyZWVfZXhwcmVzc2lvbih0cmVlMyk7CisgIH0KKyAgaWYoIWNleHByfHwodHJlZTImJnRyZWUyLT5zaWRlZngpKSBnZW5fbGFiZWwobGluKTsKKyAgaWYodHJlZTImJmNleHByPj0wKXsKKyAgICBpZihjZXhwciE9MXx8dHJlZTItPnNpZGVmeCl7CisgICAgICBnZW5fSUModHJlZTIsbGxvb3AsbG91dCk7CisgICAgICBpZigodHJlZTItPm8uZmxhZ3MmKFNDUkFUQ0h8UkVHKSk9PShTQ1JBVENIfFJFRykmJmNleHByKSBmcmVlX3JlZyh0cmVlMi0+by5yZWcpOworICAgIH0KKyAgICBpZih0cmVlMi0+by5mbGFncyYmIWNleHByKXsKKyAgICAgIGdlbl90ZXN0KCZ0cmVlMi0+byx0cmVlMi0+bnR5cC0+ZmxhZ3MsQk5FLGxsb29wKTsKKyNpZiAwCisgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICBuZXctPmNvZGU9VEVTVDsKKyAgICAgIG5ldy0+dHlwZj10cmVlMi0+bnR5cC0+ZmxhZ3M7CisgICAgICBuZXctPnExPXRyZWUyLT5vOworICAgICAgbmV3LT5xMi5mbGFncz1uZXctPnouZmxhZ3M9MDsKKyAgICAgIGFkZF9JQyhuZXcpOworICAgICAgbmV3PW5ld19JQygpOworICAgICAgbmV3LT5jb2RlPUJORTsKKyAgICAgIG5ldy0+dHlwZj1sbG9vcDsKKyAgICAgIGFkZF9JQyhuZXcpOworI2VuZGlmCisgICAgfQorICAgIGlmKGNleHByPT0yKXsKKyAgICAgIG5ldz1uZXdfSUMoKTsKKyAgICAgIG5ldy0+Y29kZT1CUkE7CisgICAgICBuZXctPnR5cGY9bGxvb3A7CisgICAgICBhZGRfSUMobmV3KTsKKyAgICB9CisgIH0KKyAgaWYoIXRyZWUyJiZjZXhwcj09Mil7CisgICAgbmV3PW5ld19JQygpOworICAgIG5ldy0+Y29kZT1CUkE7CisgICAgbmV3LT50eXBmPWxsb29wOworICAgIGFkZF9JQyhuZXcpOworICB9CisgIGlmKHRyZWUyKSBmcmVlX2V4cHJlc3Npb24odHJlZTIpOworICBmb3IobWljPW1pYy0+bmV4dDttaWM7bWljPW1pYy0+bmV4dCl7CisgICAgbWljLT5saW5lPWxpbmU7bWljLT5maWxlPWZpbGU7CisgIH0KKyAgZ2VuX2xhYmVsKGxvdXQpOworICBjdXJyZW50cHJpLz1sb29wcHJpOworICBjcigpOworICBpZih3aXRoX2RlY2wpCisgICAgbGVhdmVfYmxvY2soKTsKK30KK3ZvaWQgZG9fc3RhdGVtZW50KHZvaWQpCisvKiAgYmVhcmJlaXRldCBkb19zdGF0ZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgbnAgdHJlZTtpbnQgbGxvb3AsbG91dCxjb250bSxicmVha207CisgIElDICpuZXc7CisgIGxsb29wPSsrbGFiZWw7bG91dD0rK2xhYmVsO2N1cnJlbnRwcmkqPWxvb3Bwcmk7CisgIGdlbl9sYWJlbChsbG9vcCk7CisgIGJyZWFrbT1icmVha19sYWJlbDtjb250bT1jb250X2xhYmVsO2NvbnRfbGFiZWw9KytsYWJlbDticmVha19sYWJlbD1sb3V0OworICB7CisgICAgaW50IG1lcmtfc2I9c3dpdGNoYnJlYWs7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgc3dpdGNoYnJlYWs9MDsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICBzdGF0ZW1lbnQoKTsKKworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgIHN3aXRjaGJyZWFrPW1lcmtfc2I7CisgIH0KKyAga2lsbHNwKCk7CisgIGdlbl9sYWJlbChjb250X2xhYmVsKTtjb250X2xhYmVsPWNvbnRtO2JyZWFrX2xhYmVsPWJyZWFrbTsKKyAgaWYoY3Rvay0+dHlwZSE9TkFNRXx8c3RyY21wKCJ3aGlsZSIsY3Rvay0+bmFtZSkpIGVycm9yKDE1NCk7CisgIG5leHRfdG9rZW4oKTtraWxsc3AoKTsKKyAgaWYoY3Rvay0+dHlwZT09TFBBUikge25leHRfdG9rZW4oKTtraWxsc3AoKTt9IGVsc2UgZXJyb3IoMTUxKTsKKyAgdHJlZT1leHByZXNzaW9uKCk7CisgIGlmKHRyZWUpeworICAgIHNpbXBsZV9hbGdfb3B0KHRyZWUpOworICAgIGlmKHR5cGVfZXhwcmVzc2lvbih0cmVlLGFuZGNvbXAodHJlZSwwKSkpeworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgICAgdHJlZT1tYWtlcG9pbnRlcih0cmVlKTsKKyAgICAgIGlmKElTQVJJVEgodHJlZS0+bnR5cC0+ZmxhZ3MpfHxJU1BPSU5URVIodHJlZS0+bnR5cC0+ZmxhZ3MpKXsKKwlpZih0cmVlLT5mbGFncz09QVNTSUdOJiZ0cmVlLT5yaWdodC0+ZmxhZ3MhPUNBTEwpIGVycm9yKDE2NCk7CisJaWYodHJlZS0+ZmxhZ3M9PUNFWFBSKXsKKwkgIGV2YWxfY29uc3QoJnRyZWUtPnZhbCx0cmVlLT5udHlwLT5mbGFncyk7CisJICBpZih0cmVlLT5zaWRlZngpIGdlbl9JQyh0cmVlLDAsMCk7CisJICBpZighemxkZXF0byh2bGRvdWJsZSxkMnpsZCgwLjApKSl7CisJICAgIG5ldz1uZXdfSUMoKTsKKwkgICAgbmV3LT5jb2RlPUJSQTsKKwkgICAgbmV3LT50eXBmPWxsb29wOworCSAgICBhZGRfSUMobmV3KTsKKwkgIH0KKwl9ZWxzZXsKKwkgIGdlbl9JQyh0cmVlLGxsb29wLGxvdXQpOworCSAgaWYodHJlZS0+by5mbGFncyl7CisJICAgIGdlbl90ZXN0KCZ0cmVlLT5vLHRyZWUtPm50eXAtPmZsYWdzLEJORSxsbG9vcCk7CisjaWYgMAorCSAgICBuZXc9bmV3X0lDKCk7CisJICAgIG5ldy0+Y29kZT1URVNUOworCSAgICBuZXctPnR5cGY9dHJlZS0+bnR5cC0+ZmxhZ3M7CisJICAgIG5ldy0+cTE9dHJlZS0+bzsKKwkgICAgbmV3LT5xMi5mbGFncz1uZXctPnouZmxhZ3M9MDsKKwkgICAgYWRkX0lDKG5ldyk7CisJICAgIG5ldz1uZXdfSUMoKTsKKwkgICAgbmV3LT5jb2RlPUJORTsKKwkgICAgbmV3LT50eXBmPWxsb29wOworCSAgICBhZGRfSUMobmV3KTsKKyNlbmRpZgorCSAgfQorCX0KKyAgICAgIH1lbHNlIGVycm9yKDE0Myk7CisgICAgfQorICAgIGZyZWVfZXhwcmVzc2lvbih0cmVlKTsKKyAgfQorICBraWxsc3AoKTsKKyAgaWYoY3Rvay0+dHlwZT09UlBBUikge25leHRfdG9rZW4oKTtraWxsc3AoKTt9IGVsc2UgZXJyb3IoNTkpOworICBpZihjdG9rLT50eXBlPT1TRU1JQykge25leHRfdG9rZW4oKTtraWxsc3AoKTt9IGVsc2UgZXJyb3IoNTQpOworICBnZW5fbGFiZWwobG91dCk7CisgIGN1cnJlbnRwcmkvPWxvb3Bwcmk7CisgIGNyKCk7Cit9Cit2b2lkIGdvdG9fc3RhdGVtZW50KHZvaWQpCisvKiAgYmVhcmJlaXRldCBnb3RvX3N0YXRlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgbGxpc3QgKmxwOworICBJQyAqbmV3OworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICBraWxsc3AoKTsKKyAgaWYoY3Rvay0+dHlwZSE9TkFNRSl7CisgICAgZXJyb3IoMTQ0KTsKKyAgfWVsc2V7CisgICAgaWYoaXNfa2V5d29yZChjdG9rLT5uYW1lKSkgZXJyb3IoMjE2LGN0b2stPm5hbWUpOworICAgIGxwPWZpbmRfbGFiZWwoY3Rvay0+bmFtZSk7CisgICAgaWYoIWxwKXsKKyAgICAgIGxwPWFkZF9sYWJlbChjdG9rLT5uYW1lKTsKKyAgICAgIGxwLT5zd2l0Y2hfY291bnQ9MDsKKyAgICB9CisgICAgbHAtPmZsYWdzfD1MQUJFTFVTRUQ7CisgICAgbmV3PW5ld19JQygpOworICAgIG5ldy0+dHlwZj1scC0+bGFiZWw7CisgICAgbmV3LT5jb2RlPUJSQTsKKyAgICBuZXctPnR5cGY9bHAtPmxhYmVsOworICAgIGFkZF9JQyhuZXcpOworICAgIG5leHRfdG9rZW4oKTsKKyAgICBraWxsc3AoKTsKKyAgICBpZihjdG9rLT50eXBlPT1TRU1JQyl7bmV4dF90b2tlbigpO2tpbGxzcCgpO30gZWxzZSBlcnJvcig1NCk7CisgICAgY3IoKTsKKyAgICBnb3RvX3VzZWQ9MTsKKyAgfQorfQordm9pZCBjb250aW51ZV9zdGF0ZW1lbnQodm9pZCkKKy8qICBiZWFyYmVpdGV0IGNvbnRpbnVlX3N0YXRlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBJQyAqbmV3OworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICBpZihjb250X2xhYmVsPT0wKXtlcnJvcigxNDUpO3JldHVybjt9CisgIC8vaWYoYmxvY2tfdmxhW25lc3RpbmddKSBmcmVldmwoKTsKKyAgbmV3PW5ld19JQygpOworICBuZXctPmNvZGU9QlJBOworICBuZXctPnR5cGY9Y29udF9sYWJlbDsKKyAgYWRkX0lDKG5ldyk7CisgIGtpbGxzcCgpOworICBpZihjdG9rLT50eXBlPT1TRU1JQykge25leHRfdG9rZW4oKTtraWxsc3AoKTt9IGVsc2UgZXJyb3IoNTQpOworICBjcigpOworfQordm9pZCBicmVha19zdGF0ZW1lbnQodm9pZCkKKy8qICBiZWFyYmVpdGV0IGJyZWFrX3N0YXRlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworeworICBJQyAqbmV3OworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICBpZihicmVha19sYWJlbD09MCl7ZXJyb3IoMTQ2KTtyZXR1cm47fQorICAvL2lmKGJsb2NrX3ZsYVtuZXN0aW5nXSkgZnJlZXZsKCk7CisgIG5ldz1uZXdfSUMoKTsKKyAgbmV3LT5jb2RlPUJSQTsKKyAgbmV3LT50eXBmPWJyZWFrX2xhYmVsOworICBhZGRfSUMobmV3KTsKKyAga2lsbHNwKCk7CisgIGlmKGN0b2stPnR5cGU9PVNFTUlDKSB7bmV4dF90b2tlbigpO2tpbGxzcCgpO30gZWxzZSBlcnJvcig1NCk7CisgIGNyKCk7Cit9CitzdGF0aWMgdm9pZCBjaGVja19hdXRvX3JldHVybihucCB0cmVlKQorLyogIFRlc3RldCwgb2IgS25vdGVuIEFkcmVzc2UgZWluZXIgYXV0b21hdGlzY2hlbiBWYXJpYWJsZSBpc3QuICovCit7CisgIGlmKCh0cmVlLT5mbGFncz09QUREUkVTU3x8dHJlZS0+ZmxhZ3M9PUFERFJFU1NTfHx0cmVlLT5mbGFncz09QUREUkVTU0EpJiZ0cmVlLT5sZWZ0LT5mbGFncz09SURFTlRJRklFUil7CisgICAgVmFyICp2OworICAgIGlmKHY9ZmluZF92YXIodHJlZS0+bGVmdC0+aWRlbnRpZmllciwwKSl7CisgICAgICBpZih2LT5zdG9yYWdlX2NsYXNzPT1BVVRPKSBlcnJvcigyMjQpOworICAgIH0KKyAgfQorfQorZXh0ZXJuIGludCBoYXNfcmV0dXJuOworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgordm9pZCByZXR1cm5fc3RhdGVtZW50KHZvaWQpCisvKiAgYmVhcmJlaXRldCByZXR1cm5fc3RhdGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTRVRSRVRVUk4gaGF0IEdyb2Vzc2UgaW4gcTIucmVnIHVuZCB6LnJlZz09ZmZyZXR1cm4ocnR5cCkgICAgKi8KK3sKKyAgbnAgdHJlZTsKKyAgSUMgKm5ldzsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgaGFzX3JldHVybj0xOworICBraWxsc3AoKTsKKyAgaWYoY3Rvay0+dHlwZSE9U0VNSUMpeworICAgIGlmKHRyZWU9ZXhwcmVzc2lvbigpKXsKKyAgICAgIGlmKCFyZXR1cm5fdHlwKXsKKwlpZih0eXBlX2V4cHJlc3Npb24odHJlZSwwKSl7CisJICB0cmVlPW1ha2Vwb2ludGVyKHRyZWUpOworCSAgaWYoKHRyZWUtPm50eXAtPmZsYWdzJk5RKSE9Vk9JRCkKKwkgICAgZXJyb3IoMTU1KTsKKwkgIGVsc2V7CisJICAgIGVycm9yKDIyNSk7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisJICB9CisJICBnZW5fSUModHJlZSwwLDApOworCSAgaWYoKHRyZWUtPm8uZmxhZ3MmKFNDUkFUQ0h8UkVHKSk9PShTQ1JBVENIfFJFRykpIGZyZWVfcmVnKHRyZWUtPm8ucmVnKTsKKwl9CisgICAgICB9ZWxzZXsKKwlpZih0eXBlX2V4cHJlc3Npb24odHJlZSxyZXR1cm5fdHlwKSl7CisJICB0cmVlPW1ha2Vwb2ludGVyKHRyZWUpOworCSAgaWYodHJlZS0+ZmxhZ3M9PUFERHx8KHRyZWUtPmZsYWdzPT1TVUImJklTUE9JTlRFUih0cmVlLT5udHlwLT5mbGFncykpKXsKKwkgICAgY2hlY2tfYXV0b19yZXR1cm4odHJlZS0+bGVmdCk7CisJICAgIGNoZWNrX2F1dG9fcmV0dXJuKHRyZWUtPnJpZ2h0KTsKKwkgIH1lbHNleworCSAgICBjaGVja19hdXRvX3JldHVybih0cmVlKTsKKwkgIH0KKwkgIGlmKCF0ZXN0X2Fzc2lnbm1lbnQocmV0dXJuX3R5cCx0cmVlKSl7ZnJlZV9leHByZXNzaW9uKHRyZWUpO3JldHVybjt9CisJICBnZW5fSUModHJlZSwwLDApOworCSAgY29udmVydCh0cmVlLHJldHVybl90eXAtPmZsYWdzKTsKKyNpZmRlZiBPTERQQVJNUyAgIC8qICBhbHRlIENBTEwvUkVUVVJOLU1ldGhvZGUgICAgKi8KKwkgIG5ldz1uZXdfSUMoKTsKKwkgIG5ldy0+Y29kZT1BU1NJR047CisJICBuZXctPnR5cGY9cmV0dXJuX3R5cC0+ZmxhZ3MmTlU7CisJICBuZXctPnExPXRyZWUtPm87CisJICBuZXctPnEyLmZsYWdzPTA7CisJICBuZXctPnEyLnZhbC52bWF4PXN6b2YocmV0dXJuX3R5cCk7CisJICBpZihmZnJldHVybihyZXR1cm5fdHlwKSl7CisJICAgIG5ldy0+ei5mbGFncz1TQ1JBVENIfFJFRzsKKwkgICAgbmV3LT56LnJlZz1mZnJldHVybihyZXR1cm5fdHlwKTsKKwkgICAgaWYoIXJlZ3NbbmV3LT56LnJlZ10peworCSAgICAgIElDICphbGxvYz1uZXdfSUMoKTsKKwkgICAgICBhbGxvYy0+Y29kZT1BTExPQ1JFRzsKKwkgICAgICBhbGxvYy0+cTEuZmxhZ3M9UkVHOworCSAgICAgIGFsbG9jLT5xMi5mbGFncz1hbGxvYy0+ei5mbGFncz0wOworCSAgICAgIGFsbG9jLT5xMS5yZWc9bmV3LT56LnJlZzsKKwkgICAgICByZWdzW25ldy0+ei5yZWddPTE7CisJICAgICAgYWRkX0lDKGFsbG9jKTsKKwkgICAgfQorCSAgfWVsc2V7CisJICAgIG5ldy0+ei5yZWc9MDsKKwkgICAgbmV3LT56LnY9cmV0dXJuX3ZhcjsKKwkgICAgbmV3LT56LmZsYWdzPVNDUkFUQ0h8VkFSOworCSAgICBuZXctPnoudmFsLnZtYXg9bDJ6bSgwTCk7CisJICB9CisJICBhZGRfSUMobmV3KTsKKwkgIC8qICBkYXMgaGllciBpc3QgbmljaHQgc2VociBzY2hvZW4sIGFiZXIgd2llIHNvbnN0PyAqLworCSAgaWYoKG5ldy0+ei5mbGFncyYoU0NSQVRDSHxSRUcpKT09KFNDUkFUQ0h8UkVHKSYmcmVnc1tuZXctPnoucmVnXSkgZnJlZV9yZWcobmV3LT56LnJlZyk7CisjZWxzZQorCSAgbmV3PW5ld19JQygpOworCSAgaWYocmV0dXJuX3Zhcil7IC8qICBSZXR1cm53ZXJ0IHVlYmVyIFplaWdlciAqLworCSAgICBuZXctPmNvZGU9QVNTSUdOOworCSAgICBuZXctPnouZmxhZ3M9VkFSfERSRUZPQko7CisJICAgIG5ldy0+ei5kdHlwPVBPSU5URVJfVFlQRShyZXR1cm5fdHlwKTsKKwkgICAgbmV3LT56LnZhbC52bWF4PWwyem0oMEwpOworCSAgICBuZXctPnoudj1yZXR1cm5fdmFyOworCSAgICBuZXctPnoucmVnPTA7CisJICB9ZWxzZXsKKwkgICAgbmV3LT5jb2RlPVNFVFJFVFVSTjsKKwkgICAgbmV3LT56LnJlZz1mZnJldHVybihyZXR1cm5fdHlwKTsKKwkgICAgbmV3LT56LmZsYWdzPTA7CisJICB9CisJICBuZXctPnR5cGY9cmV0dXJuX3R5cC0+ZmxhZ3M7CisJICAvKm5ldy0+dHlwZj10cmVlLT5udHlwLT5mbGFnczsqLworCSAgbmV3LT5xMT10cmVlLT5vOworCSAgbmV3LT5xMi5mbGFncz0wOworCSAgbmV3LT5xMi52YWwudm1heD1zem9mKHJldHVybl90eXApOworCSAgYWRkX0lDKG5ldyk7CisjZW5kaWYKKwl9CisgICAgICB9CisgICAgICBmcmVlX2V4cHJlc3Npb24odHJlZSk7CisgICAgICBraWxsc3AoKTsKKyAgICAgIGlmKGN0b2stPnR5cGU9PVNFTUlDKSB7bmV4dF90b2tlbigpO2tpbGxzcCgpO30gZWxzZSBlcnJvcig1NCk7CisgICAgfWVsc2V7CisgICAgICBpZihyZXR1cm5fdHlwKSBlcnJvcigxNTYpOworICAgIH0KKyAgfWVsc2V7IAorICAgIG5leHRfdG9rZW4oKTsgCisgICAgaWYocmV0dXJuX3R5cCkgZXJyb3IoMTU2KTsKKyAgfQorICBuZXc9bmV3X0lDKCk7CisgIG5ldy0+Y29kZT1CUkE7CisgIG5ldy0+dHlwZj1yZXR1cm5fbGFiZWw7CisgIGFkZF9JQyhuZXcpOworICBjcigpOworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorfQorCit2b2lkIGV4cHJlc3Npb25fc3RhdGVtZW50KHZvaWQpCisvKiAgYmVhcmJlaXRldCBleHByZXNzaW9uX3N0YXRlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgbnAgdHJlZTsKKyAga2lsbHNwKCk7CisgIGlmKGN0b2stPnR5cGU9PVNFTUlDKXsKKyAgICBpbnQgb2xpbmU9Y3Rvay0+bGluZTsKKyAgICBuZXh0X3Rva2VuKCk7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgcmV0dXJuOworICB9CisgIGlmKHRyZWU9ZXhwcmVzc2lvbigpKXsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICBpZih0cmVlLT5mbGFncz09UE9TVElOQykgdHJlZS0+ZmxhZ3M9UFJFSU5DOworICAgIGlmKHRyZWUtPmZsYWdzPT1QT1NUREVDKSB0cmVlLT5mbGFncz1QUkVERUM7CisgICAgaWYodHlwZV9leHByZXNzaW9uKHRyZWUsMCkpeworICAgICAgaWYoREVCVUcmMil7CisJcHJlKHN0ZG91dCx0cmVlKTsKKwlwcmludGYoIlxuIik7CisgICAgICB9CisgICAgICBpZih0cmVlLT5zaWRlZngpeworCWdlbl9JQyh0cmVlLDAsMCk7CisJaWYoKHRyZWUtPm8uZmxhZ3MmKFNDUkFUQ0h8UkVHKSk9PVJFRykgaWVycm9yKDApOworCWlmKHRyZWUmJih0cmVlLT5vLmZsYWdzJihTQ1JBVENIfFJFRykpPT0oU0NSQVRDSHxSRUcpKSBmcmVlX3JlZyh0cmVlLT5vLnJlZyk7CisgICAgICB9ZWxzZXsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKwllcnJvcigxNTMpOworCWlmKERFQlVHJjIpIHByZChzdGRvdXQsdHJlZS0+bnR5cCk7CisgICAgICB9CisgICAgfQorICAgIGZyZWVfZXhwcmVzc2lvbih0cmVlKTsKKyAgfQorICBraWxsc3AoKTsKKyAgaWYoY3Rvay0+dHlwZT09U0VNSUMpIG5leHRfdG9rZW4oKTsgZWxzZSBlcnJvcig1NCk7CisgIGNyKCk7Cit9Cit2b2lkIGNvbXBvdW5kX3N0YXRlbWVudCh2b2lkKQorLyogIGJlYXJiZWl0ZXQgY29tcG91bmRfc3RhdGVtZW50IChibG9jaykgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIGtpbGxzcCgpOworICBpZihjdG9rLT50eXBlPT1MQlJBKSBuZXh0X3Rva2VuKCk7IGVsc2UgZXJyb3IoMTU3KTsKKyAgaWYoYzk5fHxlY3BwKXsKKyAgICBraWxsc3AoKTsKKyAgICB3aGlsZShjdG9rLT50eXBlIT1SQlJBKXsKKyAgICAgIGlmKGRlY2xhcmF0aW9uKDApKQorCXZhcl9kZWNsYXJhdGlvbigpOworICAgICAgZWxzZQorCXN0YXRlbWVudCgpOworICAgICAga2lsbHNwKCk7CisgICAgfQorICB9ZWxzZXsKKyAgICBraWxsc3AoKTsKKyAgICB3aGlsZShkZWNsYXJhdGlvbigwKSl7CisgICAgICB2YXJfZGVjbGFyYXRpb24oKTsKKyAgICAgIGtpbGxzcCgpOworICAgIH0KKyAgICB3aGlsZShjdG9rLT50eXBlIT1SQlJBKXsKKyAgICAgIHN0YXRlbWVudCgpOworICAgICAga2lsbHNwKCk7CisgICAgfQorICB9CisgIG5leHRfdG9rZW4oKTsvKmtpbGxzcCgpOyovCit9CitsbGlzdCAqYWRkX2xhYmVsKGNoYXIgKmlkZW50aWZpZXIpCisvKiAgRnVlZ3QgbGFiZWwgaW4gTGlzdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgbGxpc3QgKm5ldzsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgbmV3PW15bWFsbG9jKExTSVpFKTsKKyAgbmV3LT5uZXh0PTA7bmV3LT5sYWJlbD0rK2xhYmVsO25ldy0+ZmxhZ3M9MDsKKyAgbmV3LT5pZGVudGlmaWVyPWFkZF9pZGVudGlmaWVyKGlkZW50aWZpZXIsc3RybGVuKGlkZW50aWZpZXIpKTsKKyAgaWYoZmlyc3RfbGxpc3Q9PTApeworICAgIGZpcnN0X2xsaXN0PWxhc3RfbGxpc3Q9bmV3OworICB9ZWxzZXsKKyAgICBsYXN0X2xsaXN0LT5uZXh0PW5ldzsKKyAgICBsYXN0X2xsaXN0PW5ldzsKKyAgfQorICByZXR1cm4gbGFzdF9sbGlzdDsgLyogcmV0dXJuKG5ldykgc29sbHRlIGFlcXVpdi4gc2VpbiAqLworfQorbGxpc3QgKmZpbmRfbGFiZWwoY2hhciAqaWRlbnRpZmllcikKKy8qICBTdWNodCBMYWJlbCwgZ2lidCBaZWlnZXIgYXVmIGxsaXN0IG9kZXIgMCBiZWkgRmVobGVyIHp1cnVlY2sgICAgKi8KK3sKKyAgbGxpc3QgKnA7CisgIHA9Zmlyc3RfbGxpc3Q7CisgIHdoaWxlKHApeworICAgIGlmKCFzdHJjbXAocC0+aWRlbnRpZmllcixpZGVudGlmaWVyKSkgcmV0dXJuIHA7CisgICAgcD1wLT5uZXh0OworICB9CisgIHJldHVybiAwOworfQordm9pZCBmcmVlX2xsaXN0KGxsaXN0ICpwKQorLyogIEdpYnQgbGxpc3QgZnJlaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3sKKyAgbGxpc3QgKm1lcms7CisgIHdoaWxlKHApeworICAgIG1lcms9cC0+bmV4dDsKKyAgICBpZighKHAtPmZsYWdzJkxBQkVMREVGSU5FRCkpIGVycm9yKDE0NyxwLT5pZGVudGlmaWVyKTsKKyAgICBpZighKHAtPmZsYWdzJkxBQkVMVVNFRCkmJiFwLT5zd2l0Y2hfY291bnQpIGVycm9yKDE0OCxwLT5pZGVudGlmaWVyKTsKKyAgICBmcmVlKHApOworICAgIHA9bWVyazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3VwcC5jIGIvc3VwcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMTAwMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zdXBwLmMKQEAgLTAsMCArMSwyMDEyIEBACisvKiAgJFZFUjogdmJjYyAoc3VwcC5jKSAkUmV2aXNpb246IDEuNDkgJCAgICAgKi8KKworI2luY2x1ZGUgInN1cHAuaCIKKyNpbmNsdWRlICJvcHQuaCIKKworc3RhdGljIGNoYXIgRklMRV9bXT1fX0ZJTEVfXzsKKworI2lmbmRlZiBIQVZFX0VYVF9UWVBFUworY2hhciAqdHlwbmFtZVtdPXsic3RyYW5nZSIsImNoYXIiLCJzaG9ydCIsImludCIsImxvbmciLCJsb25nIGxvbmciLAorICAgICAgICAgICAgICAgICAiZmxvYXQiLCJkb3VibGUiLCJsb25nIGRvdWJsZSIsInZvaWQiLAorICAgICAgICAgICAgICAgICAicG9pbnRlciIsImFycmF5Iiwic3RydWN0IiwidW5pb24iLCJlbnVtIiwiZnVuY3Rpb24iLAorICAgICAgICAgICAgICAgICAiYm9vbCIsInZlY3RvciJ9OworI2VuZGlmCisKK2NoYXIgKnN0b3JhZ2VfY2xhc3NfbmFtZVtdPXsic3RyYW5nZSIsImF1dG8iLCJyZWdpc3RlciIsInN0YXRpYyIsImV4dGVybiIsInR5cGVkZWYifTsKKworY2hhciAqZW5hbWVbXT17InN0cmFuZ2UiLCJzZXF1ZW5jZSIsIm1vdmUiLCJzZXQrIiwic2V0LSIsInNldCoiLCJzZXQvIiwic2V0JSIsCisgICAgICAgICAgICAgICAic2V0JiIsInNldF4iLCJzZXR8Iiwic2V0PDwiLCJzZXQ+PiIsIj86IiwibG9yIiwibGFuZCIsIm9yIiwKKyAgICAgICAgICAgICAgICJlb3IiLCJhbmQiLCJlcSIsIm5lcSIsImx0IiwibGUiLCJndCIsImdlIiwibHNsIiwKKyAgICAgICAgICAgICAgICJsc3IiLCJhZGQiLCJzdWIiLCJtdWwiLCJkaXYiLCJtb2QiLCJuZWdhdGUiLAorICAgICAgICAgICAgICAgIm5vdCIsInByZWluYyIsInBvc3RpbmMiLCJwcmVkZWMiLCJwb3N0ZGVjIiwibmVnIiwKKyAgICAgICAgICAgICAgICJkcmVmLXBvaW50ZXIiLCJhZGRyZXNzLW9mIiwiY2FzdCIsImNhbGwiLCJpbmRleCIsCisgICAgICAgICAgICAgICAiZHJlZi1zdHJ1Y3QtcG9pbnRlciIsImRyZWYtc3RydWN0IiwiaWRlbnRpZmllciIsImNvbnN0YW50IiwKKyAgICAgICAgICAgICAgICJzdHJpbmciLCJtZW1iZXIiLAorICAgICAgICAgICAgICAgICJjb252ZXJ0IiwiY29udmVydC1zaG9ydCIsImNvbnZlcnQtaW50IiwiY29udmVydC1sb25nIiwKKyAgICAgICAgICAgICAgICAiY29udmVydC1mbG9hdCIsImNvbnZlcnQtZG91YmxlIiwiY29udmVydC12b2lkIiwiY29udmVydC1wb2ludGVyIiwKKyAgICAgICAgICAgICAgICAiY29udmVydC11Y2hhciIsImNvbnZlcnQtdXNob3J0IiwiY29udmVydC11aW50IiwiY29udmVydC11bG9uZyIsCisgICAgICAgICAgICAgICAgImFkZHJlc3Mtb2YtYXJyYXkiLCJmaXJzdC1lbGVtZW50LW9mLWFycmF5IiwicG11bHQiLAorICAgICAgICAgICAgICAgICJhbGxvY3JlZyIsImZyZWVyZWciLCJwY29uc3RhbnQiLCJ0ZXN0IiwibGFiZWwiLCJiZXEiLCJibmUiLAorICAgICAgICAgICAgICAgICJibHQiLCJiZ2UiLCJibGUiLCJiZ3QiLCJicmEiLCJjb21wYXJlIiwicHVzaCIsInBvcCIsCisgICAgICAgICAgICAgICAgImFkZHJlc3Mtb2Ytc3RydWN0IiwiYWRkLWludC10by1wb2ludGVyIiwic3ViLWludC1mcm9tLXBvaW50ZXIiLAorICAgICAgICAgICAgICAgICJzdWItcG9pbnRlci1mcm9tLXBvaW50ZXIiLCJwdXNoLXJlZyIsInBvcC1yZWciLCJwb3AtYXJncyIsCisgICAgICAgICAgICAgICAgInNhdmUtcmVncyIsInJlc3RvcmUtcmVncyIsImlkZW50aWZpZXItbGFiZWwiLCJkYyIsImFsaWduIiwKKyAgICAgICAgICAgICAgICAiY29sb24iLCJnZXQtcmV0dXJuIiwic2V0LXJldHVybiIsIm1vdmUtZnJvbS1yZWciLCJtb3ZlLXRvLXJlZyIsCisgICAgICAgICAgICAgICAgIm5vcCIsImJpdGZpZWxkIn07CisKK2NoYXIgKmVtcHR5PSIiOworemNoYXIgdmNoYXI7IHp1Y2hhciB2dWNoYXI7Cit6c2hvcnQgdnNob3J0OyB6dXNob3J0IHZ1c2hvcnQ7Cit6aW50IHZpbnQ7IHp1aW50IHZ1aW50Oworemxvbmcgdmxvbmc7IHp1bG9uZyB2dWxvbmc7Cit6bGxvbmcgdmxsb25nOyB6dWxsb25nIHZ1bGxvbmc7Cit6bWF4IHZtYXg7IHp1bWF4IHZ1bWF4OworemZsb2F0IHZmbG9hdDsgemRvdWJsZSB2ZG91YmxlOworemxkb3VibGUgdmxkb3VibGU7CisKK3VuaW9uIGF0eXBzIGd2YWw7CisKKyNpZm5kZWYgREVCVUcKK2ludCBERUJVRzsKKyNlbmRpZgorCitpbnQgbGFiZWw7CisKK2ludCByZWdzW01BWFIrMV0scmVndXNlZFtNQVhSKzFdLHNpbXBsZV9zY3JhdGNoW01BWFIrMV07CitWYXIgKnJlZ3N2W01BWFIrMV07CitpbnQgZ290b191c2VkOworaW50IGljX2NvdW50Oworem1heCBtYXhfb2Zmc2V0OworaW50IGZ1bmN0aW9uX2NhbGxzLHZsYXM7CitpbnQgY29sb3Jpbmc7CitpbnQgZG1hbGxvYzsKK2ludCBkaXNhYmxlOworaW50IG11bHRpcGxlX2NjczsKK2ludCBsYXN0bGFiZWwscmV0dXJuX2xhYmVsOworaW50IG9ubHlfaW5saW5lOworSUMgKmVycl9pYzsKK2xvbmcgbWF4b3B0cGFzc2VzPTMwOworbG9uZyBvcHRmbGFnczsKK2ludCBvcHRzaXplLG9wdHNwZWVkLHVucm9sbF9hbGwsc3RhY2tfY2hlY2s7CitpbnQgY3Jvc3NfbW9kdWxlLGZpbmFsLG5vX2VtaXQ7CitpbnQgZGVidWdfaW5mbzsKK2xvbmcgaW5saW5lX3NpemU9MTAwOworbG9uZyBpbmxpbmVfZGVwdGg9MTsKK2xvbmcgdW5yb2xsX3NpemU9MjAwOworbG9uZyBjbGlzdF9jb3B5X3N0YWNrPTY7Citsb25nIGNsaXN0X2NvcHlfc3RhdGljPTY7Citsb25nIGNsaXN0X2NvcHlfcG9pbnRlcj0yMDsKK2xvbmcgaW5saW5lX21lbWNweV9zej1JTkxJTkVNRU1DUFk7CitpbnQgZnBfYXNzb2Msbm9hbGlhc29wdCxub2l0cmE7CitjaGFyICpmaWxlbmFtZTsKK0lDICpmaXJzdF9pYywqbGFzdF9pYzsKK2ludCBmbG9hdF91c2VkOworYnZ0eXBlIHJlZ3NfbW9kaWZpZWRbUlNJWkUvc2l6ZW9mKGJ2dHlwZSldOworLyogIERhcyBoYWV0dGUgaWNoIGdlcm4gd29hbmRlcnMgICAgKi8KK1ZhciAqdmwwLCp2bDEsKnZsMiwqdmwzOworaW50IGFsaWduX2FyZ3VtZW50cz0xOworem1heCBzdGFja2FsaWduOworaW50IG1pc3JhY2hlY2ssbWlzcmF2ZXJzaW9uLG1pc3JhY29tbWEsbWlzcmF0b2s7CitpbnQgcGFja19hbGlnbjsKK2ludCBzaG9ydF9wdXNoOworaW50IGRlZmF1bHRfdW5zaWduZWQ7CitWYXIgKmFkZF9hdHRyX2hhZGRlY2w7CisKK2NoYXIgKmVtaXRfYnVmZmVyW0VNSVRfQlVGX0RFUFRIXTsKK2NoYXIgKmVtaXRfcDsKK2ludCBlbWl0X2YsZW1pdF9sOworaW50IG5vX2lubGluZV9wZWVwaG9sZTsKKworc3RhdGljIGludCBnZXRfc2NhbGFyX2J5dGUoaW50IGYsdW5pb24gYXR5cHMgKnYsem1heCBuLCB6dWNoYXIgKm91dCkKKy8qIFlpZWxkcyBieXRlIG4gb2YgYSBjb25zdGFudCAqLworeworICBpZighem1sZXEobDJ6bSgwTCksbikpIGllcnJvcigwKTsKKyAgZiY9TlE7CisgIGlmKGY+PUNIQVImJmY8PUxMT05HKXsKKyAgICBpbnQgajsKKyAgICBldmFsX2NvbnN0KHYsZik7CisgICAgaWYoTElUVExFRU5ESUFOKQorICAgICAgaj16bTJsKG4pOworICAgIGVsc2UKKyAgICAgIGo9KGludClzaXpldGFiW2ZdLShpbnQpem0ybChuKS0xOworICAgIHdoaWxlKGopeworICAgICAgdnVtYXg9enVtcnNoaWZ0KHZ1bWF4LGNoYXJfYml0KTsKKyAgICAgIGotLTsKKyAgICB9CisgICAgKm91dD16dW0yenVjKHZ1bWF4KTsKKyAgICByZXR1cm4gMTsKKyAgfWVsc2UKKyAgICByZXR1cm4gMDsKK30KKworenVtYXggZ2V0X2NsaXN0X2ludCh0eXBlICp0LCBjb25zdF9saXN0ICpjbCwgem1heCBuLCBpbnQgc3osaW50ICpzdGF0ZSkKKy8qIHlpZWxkcyBhbiBpbnRlZ2VyIG9mIHNpemUgc3ogZnJvbSBvZmZzZXQgbiAqLworeworICB6dWNoYXIgenVjOworICB6dW1heCB2YWwgPSBaVTA7CisKKyAgaWYoTElUVExFRU5ESUFOKQorICAgIG49em1hZGQobixsMnptKChsb25nKShzei0xKSkpOworICAKKyAgd2hpbGUoc3opeworICAgIHZhbD16dW1sc2hpZnQodmFsLGNoYXJfYml0KTsKKyAgICBpZighZ2V0X2NsaXN0X2J5dGUodCxjbCxuLCZ6dWMpKSB7KnN0YXRlPTA7cmV0dXJuIFpVMDt9CisgICAgdmFsPXp1bWFkZCh2YWwsenVjMnp1bSh6dWMpKTsKKyAgICBzei0tOworICAgIG49TElUVExFRU5ESUFOP3ptc3ViKG4sWjEpOnptYWRkKG4sWjEpOworICB9CisgICpzdGF0ZT0xOworICByZXR1cm4gdmFsOworfQorCitpbnQgZ2V0X2NsaXN0X2J5dGUodHlwZSAqdCxjb25zdF9saXN0ICpjbCwgem1heCBuLCB6dWNoYXIgKm91dCkKKy8qIFlpZWxkcyBieXRlIG4gZnJvbSBhIGNvbnN0IGxpc3QgKi8KK3sKKyAgaWYoIWNsKXsKKyAgICAqb3V0PXp1bTJ6dWModWwyenVtKDBVTCkpOworICAgIHJldHVybiAxOworICB9CisKKyAgaWYoSVNBUlJBWSh0LT5mbGFncykpeworICAgIHptYXggaSxqLHg7CisgICAgeD1zem9mKHQtPm5leHQpOworICAgIGk9em1kaXYobix4KTsKKyAgICB3aGlsZSgxKXsKKyAgICAgIGlmKCFjbCkgYnJlYWs7CisgICAgICBpZih6bWxlcShpLGNsLT5pZHgpKSBicmVhazsKKyAgICAgIGNsPWNsLT5uZXh0OworICAgIH0KKyAgICBpZighY2x8fCF6bWVxdG8oY2wtPmlkeCxpKSl7CisgICAgICAqb3V0PXp1bTJ6dWModWwyenVtKDBVTCkpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiBnZXRfY2xpc3RfYnl0ZSh0LT5uZXh0LGNsLT5vdGhlcix6bW1vZChuLHgpLG91dCk7CisgIH0KKyAgaWYoSVNVTklPTih0LT5mbGFncykpeworICAgIGludCBpPXptMmwoY2wtPmlkeCk7CisgICAgaWYoY2wtPnRyZWUpIHJldHVybiAwOworICAgIHJldHVybiBnZXRfY2xpc3RfYnl0ZSgoKnQtPmV4YWN0LT5zbClbaV0uc3R5cCxjbC0+b3RoZXIsbixvdXQpOworICB9CisgIGlmKElTU1RSVUNUKHQtPmZsYWdzKSl7CisgICAgem1heCBhbDtpbnQgZmw7dHlwZSAqc3Q7CisgICAgaW50IGksYmZvLGJmczt6bWF4IHN6O3p1bWF4IGJmdmFsPXVsMnp1bSgwVUwpOworCisgICAgc3o9bDJ6bSgwTCk7CisgICAgaWYoY2wmJmNsLT50cmVlKXsKKyAgICAgIC8qIGluaXRpYWxpemVkIGJ5IGFub3RoZXIgKi8KKyAgICAgIHJldHVybiAwOworICAgIH1lbHNleworICAgICAgZm9yKGk9MDtpPHQtPmV4YWN0LT5jb3VudCYmY2w7aSsrKXsKKwlpZighY2wtPm90aGVyKXtpZXJyb3IoMCk7fQorCXN0PSgqdC0+ZXhhY3QtPnNsKVtpXS5zdHlwOworCWFsPSgqdC0+ZXhhY3QtPnNsKVtpXS5hbGlnbjsKKwlpZighKCp0LT5leGFjdC0+c2wpW2ldLmlkZW50aWZpZXIpIGllcnJvcigwKTsKKwliZm89KCp0LT5leGFjdC0+c2wpW2ldLmJmb2Zmc2V0OworCWlmKCF6bWVxdG8oem1tb2Qoc3osYWwpLGwyem0oMEwpKSl7CisJICBzej16bWFkZChzeix6bXN1YihhbCx6bW1vZChzeixhbCkpKTsKKwkgIGlmKCF6bWxlcShzeixuKSl7CisJICAgICpvdXQ9enVtMnp1Yyh1bDJ6dW0oMEwpKTsKKwkgICAgcmV0dXJuIDE7CisJICB9CisJfQorCWlmKGJmbz49MCl7CisJICAvKiBiaXRmaWVsZCAqLworCisJICBpZigoKnQtPmV4YWN0LT5zbClbaV0uaWRlbnRpZmllclswXSl7CisJICAgIGJmcz0oKnQtPmV4YWN0LT5zbClbaV0uYmZzaXplOworCSAgICBpZih6bWVxdG8obDJ6bSgobG9uZylpKSxjbC0+aWR4KSl7CisJICAgICAgZXZhbF9jb25zdCgmY2wtPm90aGVyLT52YWwsc3QtPmZsYWdzKTsKKwkgICAgICBjbD1jbC0+bmV4dDsKKwkgICAgfWVsc2V7CisJICAgICAgdnVtYXg9dWwyenVtKDBVTCk7CisJICAgIH0KKwkgICAgdnVtYXg9enVtYW5kKHZ1bWF4LHp1bXN1Yih6dW1sc2hpZnQodWwyenVtKDFVTCksdWwyenVtKCh1bnNpZ25lZCBsb25nKWJmcykpLHVsMnp1bSgxVUwpKSk7CisJICAgIGJmdmFsPXp1bW9yKGJmdmFsLHp1bWxzaGlmdCh2dW1heCx1bDJ6dW0oKHVuc2lnbmVkIGxvbmcpYmZsYXlvdXQoYmZvLGJmcyxzdC0+ZmxhZ3MpKSkpOworCSAgfSAgICAgICAgICAKKwkgIGlmKGkrMT49dC0+ZXhhY3QtPmNvdW50fHwoKnQtPmV4YWN0LT5zbClbaSsxXS5iZm9mZnNldDw9MHx8IWNsKXsKKwkgICAgLyogbGFzdCBiaXRmaWVsZCBpbiBpbnRlZ2VyICovCisJICAgIGd2YWwudnVtYXg9YmZ2YWw7CisJICAgIGV2YWxfY29uc3QoJmd2YWwsVU5TSUdORUR8TUFYSU5UKTsKKwkgICAgaW5zZXJ0X2NvbnN0KCZndmFsLHN0LT5mbGFncyZOVSk7CisJICAgIGJmdmFsPXVsMnp1bSgwTCk7CisJICAgIHN6PXptYWRkKHN6LHN6b2Yoc3QpKTsKKwkgICAgaWYoIXptbGVxKHN6LG4pKQorCSAgICAgIHJldHVybiBnZXRfc2NhbGFyX2J5dGUoc3QtPmZsYWdzLCZndmFsLHptc3ViKG4sem1zdWIoc3osc3pvZihzdCkpKSxvdXQpOworCSAgfQorCX1lbHNleworCSAgc3o9em1hZGQoc3osc3pvZihzdCkpOworCSAgaWYoIXptbGVxKHN6LG4pKXsKKwkgICAgaWYoem1lcXRvKGwyem0oKGxvbmcpaSksY2wtPmlkeCkpeworCSAgICAgIHJldHVybiBnZXRfY2xpc3RfYnl0ZShzdCxjbC0+b3RoZXIsem1zdWIobix6bXN1Yihzeixzem9mKHN0KSkpLG91dCk7CisJICAgIH1lbHNleworCSAgICAgICpvdXQ9enVtMnp1Yyh1bDJ6dW0oMFVMKSk7CisJICAgICAgcmV0dXJuIDE7CisJICAgIH0KKwkgIH0KKwkgIGlmKHptZXF0byhsMnptKChsb25nKWkpLGNsLT5pZHgpKQorCSAgICBjbD1jbC0+bmV4dDsKKwl9CisgICAgICB9CisgICAgfQorICAgICpvdXQ9enVtMnp1Yyh1bDJ6dW0oMFVMKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZih6bWVxdG8oY2wtPmlkeCxsMnptKC0xTCkpKQorICAgIHJldHVybiAwOworICBlbHNleworICAgIGlmKGNsLT50cmVlKQorICAgICAgcmV0dXJuIDA7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGdldF9zY2FsYXJfYnl0ZSh0LT5mbGFncywmY2wtPnZhbCxuLG91dCk7CisKKyAgfQorICBpZXJyb3IoMCk7Cit9CisKK3R5cGUgKm5ld190eXAodm9pZCkKKy8qICBFcnplaWd0IG5ldWVuIChsZWVyZW4pIFR5cC4gICovCit7CisgIHR5cGUgKm5ldz1teW1hbGxvYyhUWVBTKTsKKyAgbmV3LT5mbGFncz0wOworICBuZXctPm5leHQ9MDsKKyAgbmV3LT5leGFjdD0wOworICBuZXctPmF0dHI9MDsKKyAgbmV3LT5kc2l6ZT0wOworICBuZXctPnJlZz0wOworI2lmZGVmIEhBVkVfRUNQUAorLyogcmVtb3ZlZCAqLworI2VuZGlmCisgIHJldHVybiBuZXc7Cit9CisKK3R5cGUgKmNsb25lX3R5cCh0eXBlICpvbGQpCisvKiAgRXJ6ZXVndCBLb3BpZSBlaW5lcyBUeXBzIHVuZCBsaWVmZXJ0IFplaWdlciBhdWYgS29waWUuICAqLworeworICB0eXBlICpuZXc7CisgIGlmKCFvbGQpIHJldHVybiAwOworICBuZXc9bmV3X3R5cCgpOworICAqbmV3PSpvbGQ7CisgIGlmKG9sZC0+YXR0cil7CisgICAgbmV3LT5hdHRyPW15bWFsbG9jKHN0cmxlbihvbGQtPmF0dHIpKzEpOworICAgIHN0cmNweShuZXctPmF0dHIsb2xkLT5hdHRyKTsKKyAgfQorICBpZihuZXctPm5leHQpIG5ldy0+bmV4dD1jbG9uZV90eXAobmV3LT5uZXh0KTsKKyAgcmV0dXJuIG5ldzsKK30KK1ZhciAqbmV3X3Zhcih2b2lkKQoreworICBWYXIgKm5ldz1teW1hbGxvYyhzaXplb2YoKm5ldykpOworICBuZXctPmNsaXN0PTA7CisgIG5ldy0+dnR5cD0wOworICBuZXctPnN0b3JhZ2VfY2xhc3M9MDsKKyAgbmV3LT5yZWc9MDsKKyAgbmV3LT52YXR0cj0wOworICBuZXctPm5leHQ9MDsKKyAgbmV3LT5mbGFncz0wOworICBuZXctPmZpPTA7CisgIG5ldy0+bmVzdGluZz0wOworICBuZXctPmZpbGVuYW1lPTA7CisgIG5ldy0+bGluZT0wOworICBuZXctPmRmaWxlbmFtZT0wOworICBuZXctPmRsaW5lPTA7CisgIG5ldy0+ZGVzY3JpcHRpb249MDsKKyAgbmV3LT50dW5pdD0wOworICBuZXctPm9mZnNldD1sMnptKDBMKTsKKyAgbmV3LT5pZGVudGlmaWVyPTA7CisjaWZkZWYgSEFWRV9UQVJHRVRfQVRUUklCVVRFUworICBuZXctPnRhdHRyPTA7CisjZW5kaWYgCisjaWZkZWYgQUxFWF9SRUcKKyAgbmV3LT5pUmVnQ29weU5yID0gLTE7CisgIG5ldy0+aVJlZ0NvcHlOckhjMTJWID0gLTE7CisjZW5kaWYKKyAgcmV0dXJuIG5ldzsKK30gIAorCitJQyAqbmV3X0lDKHZvaWQpCit7CisgIElDICpwPW15bWFsbG9jKElDUyk7CisgIHAtPmNoYW5nZV9jbnQ9MDsKKyAgcC0+dXNlX2NudD0wOworICBwLT5jYWxsX2NudD0wOworICBwLT5hcmdfY250PTA7CisgIHAtPnVzZV9saXN0PTA7CisgIHAtPmNoYW5nZV9saXN0PTA7CisgIHAtPmNhbGxfbGlzdD0wOworICBwLT5hcmdfbGlzdD0wOworICBwLT5saW5lPTA7CisgIHAtPmZpbGU9MDsKKyAgcC0+ZmxhZ3M9MDsKKyAgcC0+cTEuZmxhZ3M9cC0+cTIuZmxhZ3M9cC0+ei5mbGFncz0wOworICBwLT5xMS5hbT1wLT5xMi5hbT1wLT56LmFtPTA7CisgIHAtPnExLnZhbC52bWF4PXAtPnEyLnZhbC52bWF4PXAtPnoudmFsLnZtYXg9bDJ6bSgwTCk7CisgIHAtPnNhdmVkc3A9MDsKKyAgcC0+dHlwZj1wLT50eXBmMj0wOworI2lmZGVmIEFMRVhfUkVHCisgIHAtPmlaV2ViSW5kZXggPSAtMTsKKyAgcC0+aVExV2ViSW5kZXggPSAtMTsKKyAgcC0+aVEyV2ViSW5kZXggPSAtMTsKKyAgcC0+cEZsb3cgPSBOVUxMOworI2VuZGlmIC8qIEdDX1JBTExPQyAqLworCisgIHJldHVybiBwOworfQorLyogKHBhcnRpYWxseSkgY2xvbmVzIGFuIElDIGxpc3QgKi8KK0lDICpjbG9uZV9pYyhJQyAqcCkKK3sKKyAgSUMgKm5ldywqZmlyc3QsKmxhc3Q7CisgIGZpcnN0PWxhc3Q9bmV3PTA7CisgIHdoaWxlKHApeworICAgIG5ldz1teW1hbGxvYyhzaXplb2YoKm5ldykpOworICAgICpuZXc9KnA7CisgICAgcC0+Y29weT1uZXc7CisKKyAgICBpZihwLT5xMS5hbXx8cC0+cTIuYW18fHAtPnouYW0pIGllcnJvcigwKTsKKyAgICAKKyAgICBpZihuZXctPmNvZGU9PUNBTEwpeworICAgICAgaW50IGk7CisgICAgICBuZXctPmFyZ19saXN0PW15bWFsbG9jKHNpemVvZigqbmV3LT5hcmdfbGlzdCkqbmV3LT5hcmdfY250KTsKKyAgICAgIGZvcihpPTA7aTxuZXctPmFyZ19jbnQ7aSsrKXsKKwlpZighcC0+YXJnX2xpc3RbaV0pCisJICBpZXJyb3IoMCk7CisJaWYoIXAtPmFyZ19saXN0W2ldLT5jb3B5KQorCSAgaWVycm9yKDApOworICAgICAgICBuZXctPmFyZ19saXN0W2ldPXAtPmFyZ19saXN0W2ldLT5jb3B5OworICAgICAgfQorICAgIH0KKyAgICBuZXctPnByZXY9bGFzdDsKKyAgICBuZXctPm5leHQ9MDsKKyAgICBpZighZmlyc3QpIGZpcnN0PW5ldzsKKyAgICBpZihsYXN0KSBsYXN0LT5uZXh0PW5ldzsKKyAgICBsYXN0PW5ldzsKKyAgICBwPXAtPm5leHQ7CisgIH0KKyAgcmV0dXJuIGZpcnN0OworfSAgICAKK3ZvaWQgZnJlZV9JQyhJQyAqcCkKKy8qICBHaWJ0IElDLUxpc3RlIGlua2wuIFR5cGVuIGZyZWkuICAgICAgICAgICAgICAgICAqLworeworICBJQyAqbWVyazsKKyAgaWYoREVCVUcmMSkgcHJpbnRmKCJmcmVlX0lDKClcbiIpOworICB3aGlsZShwKXsKKyAgICAvKmlmKHAtPnExLmFtJiYhcC0+cTEuZmxhZ3MpIGllcnJvcigwKTsKKyAgICBpZihwLT5xMi5hbSYmIXAtPnEyLmZsYWdzKSBpZXJyb3IoMCk7CisgICAgaWYocC0+ei5hbSYmIXAtPnouZmxhZ3MpIGllcnJvcigwKTsqLworCisgICAgaWYocC0+cTEuYW0mJnAtPnExLmFtPT1wLT5xMi5hbSkKKyAgICAgIGllcnJvcigwKTsKKworICAgIGlmKHAtPnExLmFtKSBmcmVlKHAtPnExLmFtKTsKKyAgICBpZihwLT5xMi5hbSkgZnJlZShwLT5xMi5hbSk7CisgICAgaWYocC0+ei5hbSkgZnJlZShwLT56LmFtKTsKKyAgICBpZihwLT5jb2RlPT1DQUxMKSBmcmVlKHAtPmFyZ19saXN0KTsKKyAgICBtZXJrPXAtPm5leHQ7CisgICAgZnJlZShwKTsKKyAgICBwPW1lcms7CisgIH0KK30KK3ZvaWQgbW92ZV9JQyhJQyAqYWZ0ZXIsSUMgKnApCit7CisgIGlmKHAtPnByZXYpCisgICAgcC0+cHJldi0+bmV4dD1wLT5uZXh0OworICBlbHNlCisgICAgZmlyc3RfaWM9cC0+bmV4dDsKKyAgaWYocC0+bmV4dCkKKyAgICBwLT5uZXh0LT5wcmV2PXAtPnByZXY7CisgIGVsc2UKKyAgICBsYXN0X2ljPXAtPnByZXY7CisgIGluc2VydF9JQyhhZnRlcixwKTsKK30KK3ZvaWQgcmVtb3ZlX0lDKElDICpwKQorLyogIEVudGZlcm50IElDIHAgYXVzIExpc3RlLiAqLworeworICBpZihwLT5wcmV2KSBwLT5wcmV2LT5uZXh0PXAtPm5leHQ7IGVsc2UgZmlyc3RfaWM9cC0+bmV4dDsKKyAgaWYocC0+bmV4dCkgcC0+bmV4dC0+cHJldj1wLT5wcmV2OyBlbHNlIGxhc3RfaWM9cC0+cHJldjsKKyAgaWYocC0+cTEuYW0pIGZyZWUocC0+cTEuYW0pOworICBpZihwLT5xMi5hbSkgZnJlZShwLT5xMi5hbSk7CisgIGlmKHAtPnouYW0pIGZyZWUocC0+ei5hbSk7CisgIGZyZWUocCk7Cit9Cit2b2lkIGZyZWV0eXAodHlwZSAqcCkKKy8qIEdpYnQgZWluZSBUeXAtTGlzdGUgZnJlaSwgYWJlciBrZWluZSBzdHJ1Y3RfZGVjbGFyYXRpb24gb2RlciBzby4gKi8KK3sKKyAgaW50IGY7dHlwZSAqbWVyazsKKyAgaWYoREVCVUcmOCl7cHJpbnRmKCJmcmVldHlwOiAiKTtwcmQoc3Rkb3V0LHApO3ByaW50ZigiXG4iKTt9CisgIHdoaWxlKHApeworICAgIG1lcms9cC0+bmV4dDsKKyAgICBmPXAtPmZsYWdzJk5ROworICAgIGlmKG1lcmsmJiFJU0FSUkFZKGYpJiYhSVNQT0lOVEVSKGYpJiYhSVNGVU5DKGYpJiYhSVNWRUNUT1IoZikpIAorICAgICAgaWVycm9yKDApOworICAgIGZyZWUocC0+YXR0cik7CisgICAgZnJlZShwKTsKKyAgICBwPW1lcms7CisgIH0KK30KKworI2lmbmRlZiBIQVZFX1RHVF9GQUxJR04KK3ptYXggZmFsaWduKHR5cGUgKnQpCisvKiAgTGllZmVydCBBbGlnbm1lbnQgZWluZXMgVHlwcy4gRnVua3Rpb25pZXJ0IGltIEdlZ2Vuc2F0eiB6dW0gICovCisvKiAgYWxpZ25bXS1BcnJheSBhdWNoIG1pdCB6dXNhbW1lbmdlc2V0enRlbiBUeXBlbi4gICAgICAgICAgICAgICovCit7CisgIGludCBpLGY7IHptYXggYWwsYWx0OworICBmPXQtPmZsYWdzJk5ROworICBpZihJU1ZFQ1RPUihmKSkgcmV0dXJuIHN6b2YodCk7CisgIGFsPWFsaWduW2ZdOworICBpZihJU1NDQUxBUihmKSkgcmV0dXJuIGFsOworICBpZihJU0FSUkFZKGYpKXsKKyAgICBkb3sgCisgICAgICB0PXQtPm5leHQ7IAorICAgICAgZj10LT5mbGFncyZOUTsKKyAgICB9d2hpbGUoSVNBUlJBWShmKXx8SVNWRUNUT1IoZikpOworICAgIGFsdD1mYWxpZ24odCk7CisgICAgaWYoem1sZXEoYWwsYWx0KSkgcmV0dXJuIGFsdDsgZWxzZSByZXR1cm4gYWw7CisgIH0KKyAgaWYoSVNVTklPTihmKXx8SVNTVFJVQ1QoZikpeworICAgIGlmKCF0LT5leGFjdCkgaWVycm9yKDApOworICAgIGZvcihpPTA7aTx0LT5leGFjdC0+Y291bnQ7aSsrKXsKKyAgICAgIGFsdD0oKnQtPmV4YWN0LT5zbClbaV0uYWxpZ247CisgICAgICBpZighem1sZXEoYWx0LGFsKSkgYWw9YWx0OworICAgIH0KKyAgfQorICByZXR1cm4gYWw7Cit9CisjZW5kaWYKKworLyogY2hlY2ssIHdoZXRoZXIgdCBpcyBhIHZhcmlhYmxlIGxlbmd0aCBhcnJheSAqLworaW50IGlzX3ZsZW5ndGgodHlwZSAqdCkKK3sKKyAgaWYoIUlTQVJSQVkodC0+ZmxhZ3MpKQorICAgIHJldHVybiAwOworICBpZih0LT5kc2l6ZSkKKyAgICByZXR1cm4gMTsKKyAgZWxzZSAKKyAgICByZXR1cm4gaXNfdmxlbmd0aCh0LT5uZXh0KTsKK30KKworLyogY2FsY3VsYXRlIHNpemUgb2YgYSB2YXJpYWJsZSBsZW5ndGggYXJyYXkgKi8KK1ZhciAqdmxlbmd0aF9zem9mKHR5cGUgKnQpCit7CisgIElDICpuZXc7dHlwZSAqbnQ7CisgIGlmKCFJU0FSUkFZKHQtPmZsYWdzKSkKKyAgICBpZXJyb3IoMCk7CisgIG5ldz1uZXdfSUMoKTsKKyAgbmV3LT5jb2RlPU1VTFQ7CisgIG5ldy0+dHlwZj1IQVZFX0lOVF9TSVpFVD8oVU5TSUdORUR8SU5UKTooVU5TSUdORUR8TE9ORyk7CisgIGlmKHQtPmRzaXplKXsKKyAgICBuZXctPnExLmZsYWdzPVZBUjsKKyAgICBuZXctPnExLnY9dC0+ZHNpemU7CisgICAgbmV3LT5xMS52YWwudm1heD1sMnptKDBMKTsKKyAgfWVsc2V7CisgICAgbmV3LT5xMS5mbGFncz1LT05TVDsKKyNpZiBIQVZFX0lOVF9TSVpFVAorICAgIG5ldy0+cTEudmFsLnZ1aW50PXp1bTJ6dWkoem0yenVtKHQtPnNpemUpKTsKKyNlbHNlCisgICAgbmV3LT5xMS52YWwudnVsb25nPXp1bTJ6dWwoem0yenVtKHQtPnNpemUpKTsKKyNlbmRpZgorICB9CisgIG5ldy0+ei5mbGFncz1WQVI7CisgIG50PW5ld190eXAoKTsKKyAgbnQtPmZsYWdzPW5ldy0+dHlwZjsKKyAgbmV3LT56LnY9YWRkX3RtcF92YXIobnQpOworICBuZXctPnoudmFsLnZtYXg9bDJ6bSgwTCk7CisgIGlmKGlzX3ZsZW5ndGgodC0+bmV4dCkpeworICAgIG5ldy0+cTIuZmxhZ3M9VkFSOworICAgIG5ldy0+cTIudj12bGVuZ3RoX3N6b2YodC0+bmV4dCk7CisgICAgbmV3LT5xMi52YWwudm1heD1sMnptKDBMKTsKKyAgfWVsc2V7CisgICAgbmV3LT5xMi5mbGFncz1LT05TVDsKKyNpZiBIQVZFX0lOVF9TSVpFVAorICAgIG5ldy0+cTIudmFsLnZ1aW50PXp1bTJ6dWkoem0yenVtKHN6b2YodC0+bmV4dCkpKTsKKyNlbHNlCisgICAgbmV3LT5xMi52YWwudnVsb25nPXp1bTJ6dWwoem0yenVtKHN6b2YodC0+bmV4dCkpKTsKKyNlbmRpZgorICB9CisgIGFkZF9JQyhuZXcpOworICByZXR1cm4gbmV3LT56LnY7Cit9CisKKy8qIHJldHVybiB0aGUgdHlwZSBvZiBhIGQtZGltIHZlY3RvciBvZiBiYXNlIHR5cGUgeCAqLworaW50IG1rdmVjKGludCB4LGludCBkKQoreworICBpbnQgdD14Jk5RLHI7CisgIGlmKGQhPTImJmQhPTMmJmQhPTQmJmQhPTgmJmQhPTE2KSBpZXJyb3IoMCk7CisgIHN3aXRjaCh0KXsKKyAgY2FzZSBCT09MOgorICAgIHI9VkVDQk9PTDticmVhazsKKyAgY2FzZSBDSEFSOgorICAgIHI9VkVDQ0hBUjticmVhazsKKyAgY2FzZSBTSE9SVDoKKyAgICByPVZFQ1NIT1JUO2JyZWFrOworICBjYXNlIElOVDoKKyAgICByPVZFQ0lOVDticmVhazsKKyAgY2FzZSBMT05HOgorICAgIHI9VkVDTE9ORzticmVhazsKKyAgY2FzZSBGTE9BVDoKKyAgICByPVZFQ0ZMT0FUO2JyZWFrOworICBkZWZhdWx0OgorICAgIGllcnJvcigwKTsKKyAgfQorICByZXR1cm4gKHIrZC0xKXwoeCZ+TlEpOworfQorCisvKiByZXR1cm4gdGhlIGJhc2UgdHlwZSBvZiBhIHZlY3RvciAqLworaW50IFZFQ1RZUEUoaW50IHgpCit7CisgIGludCB0PXgmTlEscj0wOworICBpZih0Pj1WRUNCT09MJiZ0PD1WRUNCT09MK01BWFZFQ0RJTSkKKyAgICByPUJPT0w7CisgIGlmKHQ+PVZFQ0NIQVImJnQ8PVZFQ0NIQVIrTUFYVkVDRElNKQorICAgIHI9Q0hBUjsKKyAgaWYodD49VkVDU0hPUlQmJnQ8PVZFQ1NIT1JUK01BWFZFQ0RJTSkKKyAgICByPVNIT1JUOworICBpZih0Pj1WRUNJTlQmJnQ8PVZFQ0lOVCtNQVhWRUNESU0pCisgICAgcj1JTlQ7CisgIGlmKHQ+PVZFQ0xPTkcmJnQ8PVZFQ0xPTkcrTUFYVkVDRElNKQorICAgIHI9TE9ORzsKKyAgaWYodD49VkVDRkxPQVQmJnQ8PVZFQ0ZMT0FUK01BWFZFQ0RJTSkKKyAgICByPUZMT0FUOworICBpZighcikgaWVycm9yKDApOworICByZXR1cm4gcnwoeCZ+TlEpOworfQorCisKKyNpZm5kZWYgSEFWRV9UR1RfU1pPRgorem1heCBzem9mKHR5cGUgKnQpCisvKiAgTGllZmVydCBkaWUgYmVub2V0aWd0ZSBHcm9lc3NlIGVpbmVzIFR5cHMgaW4gQnl0ZXMuICAgICAqLworeworICBpbnQgaT10LT5mbGFncyZOUSxqO3ptYXggc2l6ZSxtOworI2lmZGVmIEhBVkVfRUNQUAorLyogcmVtb3ZlZCAqLworI2VuZGlmCisKKyAgaWYoSVNTQ0FMQVIoaSkpIHJldHVybiBzaXpldGFiW2ldOworICBpZihJU0FSUkFZKGkpKXsKKyAgICBpZihpc192bGVuZ3RoKHQpKQorICAgICAgcmV0dXJuIHNpemV0YWJbUE9JTlRFUl9UWVBFKHQtPm5leHQpXTsKKyAgICBzaXplPXptbXVsdCgodC0+c2l6ZSksc3pvZih0LT5uZXh0KSk7CisgICAgbT1hbGlnbltBUlJBWV07CisgICAgcmV0dXJuIHptbXVsdCh6bWRpdih6bWFkZChzaXplLHptc3ViKG0sbDJ6bSgxTCkpKSxtKSxtKTsgLyogYWxpZ24gKi8KKyAgfQorICBpZihJU1ZFQ1RPUihpKSl7CisgICAgem1heCBkaW09VkVDRElNKGkpOworICAgIGlmKHptZXF0byhkaW0sbDJ6bSgzTCkpKSBkaW09bDJ6bSg0TCk7CisgICAgcmV0dXJuIHptbXVsdChkaW0sc2l6ZXRhYltWRUNUWVBFKGkpJk5RXSk7CisgIH0KKyAgaWYoSVNVTklPTihpKSl7CisgICAgZm9yKGo9MCxzaXplPWwyem0oMEwpO2o8dC0+ZXhhY3QtPmNvdW50O2orKyl7CisgICAgICBtPXN6b2YoKCp0LT5leGFjdC0+c2wpW2pdLnN0eXApOworICAgICAgaWYoem1lcXRvKG0sbDJ6bSgwTCkpKSByZXR1cm4gbDJ6bSgwTCk7CisgICAgICBpZighem1sZXEobSxzaXplKSkgc2l6ZT1tOworICAgIH0KKyAgICBtPWZhbGlnbih0KTsKKyAgICByZXR1cm4gem1tdWx0KHptZGl2KHptYWRkKHNpemUsem1zdWIobSxsMnptKDFMKSkpLG0pLG0pOyAvKiBhbGlnbiAqLworICB9CisgIGlmKElTU1RSVUNUKGkpKXsKKyAgICBzaXplPWwyem0oMEwpOworI2lmZGVmIEhBVkVfRUNQUAorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgZm9yKGo9MDtqPHQtPmV4YWN0LT5jb3VudDtqKyspeworICAgICAgdHlwZSAqaD0oKnQtPmV4YWN0LT5zbClbal0uc3R5cDsKKyAgICAgIGlmKCgqdC0+ZXhhY3QtPnNsKVtqXS5iZm9mZnNldDw9MCl7CisJaW50IG47c2l6ZV90IGFsOworICAgICAgICBhbD0oKnQtPmV4YWN0LT5zbClbal0uYWxpZ247CisjaWZkZWYgSEFWRV9FQ1BQCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICAgICAgaWYoem1lcXRvKGFsLGwyem0oMEwpKSkge3ByZChzdGRvdXQsaCk7aWVycm9yKDApO30KKyAgICAgICAgbT1zem9mKGgpOworCS8qIGZpbmQgdGhlIGxhcmdlc3QgdHlwZSBpbiBhIGJpdGZpZWxkICovCisJZm9yKG49aisxO248dC0+ZXhhY3QtPmNvdW50JiYoKnQtPmV4YWN0LT5zbClbbl0uYmZvZmZzZXQ+MDtuKyspeworCSAgc2l6ZV90IHRtcD1zem9mKCgqdC0+ZXhhY3QtPnNsKVtuXS5zdHlwKTsKKwkgIGlmKHptbGVxKG0sdG1wKSkKKwkgICAgbT10bXA7CisJfQorICAgICAgICBzaXplPXptbXVsdCh6bWRpdih6bWFkZChzaXplLHptc3ViKGFsLGwyem0oMUwpKSksYWwpLGFsKTsKKyAgICAgICAgLyppZih6bWVxdG8obSxsMnptKDBMKSkpIHJldHVybiBsMnptKDBMKTsqLworICAgICAgICBzaXplPXptYWRkKHNpemUsbSk7CisgICAgICB9CisgICAgfQorICAgIG09ZmFsaWduKHQpOworICAgIHJldHVybiB6bW11bHQoem1kaXYoem1hZGQoc2l6ZSx6bXN1YihtLGwyem0oMUwpKSksbSksbSk7IC8qIGFsaWduICovCisgIH0KKyAgcmV0dXJuIHNpemV0YWJbaV07Cit9Cit6bWF4IHN0cnVjdF9vZmZzZXQoc3RydWN0X2RlY2xhcmF0aW9uICpzZCxjb25zdCBjaGFyICppZGVudGlmaWVyKQoreworICBpbnQgaT0wLGludGJpdGZpZWxkPS0xO3ptYXggb2Zmc2V0PWwyem0oMCksYWw7CisgIHdoaWxlKGk8c2QtPmNvdW50JiZzdHJjbXAoKCpzZC0+c2wpW2ldLmlkZW50aWZpZXIsaWRlbnRpZmllcikpeworICAgIGlmKCgqc2QtPnNsKVtpXS5iZm9mZnNldD49MCl7CisgICAgICBpZihpKzE8c2QtPmNvdW50JiYoKnNkLT5zbClbaSsxXS5iZm9mZnNldD4wKXsKKyAgICAgICAgaSsrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisgICAgYWw9KCpzZC0+c2wpW2ldLmFsaWduOworICAgIG9mZnNldD16bW11bHQoem1kaXYoem1hZGQob2Zmc2V0LHptc3ViKGFsLGwyem0oMUwpKSksYWwpLGFsKTsKKyAgICBvZmZzZXQ9em1hZGQob2Zmc2V0LHN6b2YoKCpzZC0+c2wpW2ldLnN0eXApKTsKKyAgICBpKys7CisgIH0KKyAgaWYoaT49c2QtPmNvdW50KSB7ZXJyb3IoMjMsaWRlbnRpZmllcik7cmV0dXJuIGwyem0oMEwpO30KKyAgYWw9KCpzZC0+c2wpW2ldLmFsaWduOworICBvZmZzZXQ9em1tdWx0KHptZGl2KHptYWRkKG9mZnNldCx6bXN1YihhbCxsMnptKDFMKSkpLGFsKSxhbCk7CisgIHJldHVybiBvZmZzZXQ7Cit9CisjaWZkZWYgSEFWRV9FQ1BQCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfVEdUX1BSSU5UVkFMCit2b2lkIHByaW50dmFsKEZJTEUgKmYsdW5pb24gYXR5cHMgKnAsaW50IHQpCisvKiAgR2lidCBhdHlwcyBhdXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIHQmPU5VOworICBpZih0PT1DSEFSKXtmcHJpbnRmKGYsIkMiKTt2bWF4PXpjMnptKHAtPnZjaGFyKTtwcmludHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8Q0hBUikpe2ZwcmludGYoZiwiVUMiKTt2dW1heD16dWMyenVtKHAtPnZ1Y2hhcik7cHJpbnR6dW0oZix2dW1heCk7fQorICBpZih0PT1TSE9SVCl7ZnByaW50ZihmLCJTIik7dm1heD16czJ6bShwLT52c2hvcnQpO3ByaW50em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxTSE9SVCkpe2ZwcmludGYoZiwiVVMiKTt2dW1heD16dXMyenVtKHAtPnZ1c2hvcnQpO3ByaW50enVtKGYsdnVtYXgpO30KKyAgaWYodD09RkxPQVQpe2ZwcmludGYoZiwiRiIpO3ZsZG91YmxlPXpmMnpsZChwLT52ZmxvYXQpO3ByaW50emxkKGYsdmxkb3VibGUpO30KKyAgaWYodD09RE9VQkxFKXtmcHJpbnRmKGYsIkQiKTt2bGRvdWJsZT16ZDJ6bGQocC0+dmRvdWJsZSk7cHJpbnR6bGQoZix2bGRvdWJsZSk7fQorICBpZih0PT1MRE9VQkxFKXtmcHJpbnRmKGYsIkxEIik7cHJpbnR6bGQoZixwLT52bGRvdWJsZSk7fQorICBpZih0PT1JTlQpe2ZwcmludGYoZiwiSSIpO3ZtYXg9emkyem0ocC0+dmludCk7cHJpbnR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfElOVCkpe2ZwcmludGYoZiwiVUkiKTt2dW1heD16dWkyenVtKHAtPnZ1aW50KTtwcmludHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUxPTkcpe2ZwcmludGYoZiwiTCIpO3ZtYXg9emwyem0ocC0+dmxvbmcpO3ByaW50em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxMT05HKSl7ZnByaW50ZihmLCJVTCIpO3Z1bWF4PXp1bDJ6dW0ocC0+dnVsb25nKTtwcmludHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PUxMT05HKXtmcHJpbnRmKGYsIkxMIik7dm1heD16bGwyem0ocC0+dmxsb25nKTtwcmludHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8TExPTkcpKXtmcHJpbnRmKGYsIlVMTCIpO3Z1bWF4PXp1bGwyenVtKHAtPnZ1bGxvbmcpO3ByaW50enVtKGYsdnVtYXgpO30KKyAgaWYodD09TUFYSU5UKXtmcHJpbnRmKGYsIk0iKTtwcmludHptKGYscC0+dm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8TUFYSU5UKSl7ZnByaW50ZihmLCJVTSIpO3ByaW50enVtKGYscC0+dnVtYXgpO30KKyAgLypGSVhNRSovCisgIGlmKHQ9PVBPSU5URVIpe2ZwcmludGYoZiwiUCIpO3Z1bWF4PXp1bDJ6dW0ocC0+dnVsb25nKTtwcmludHp1bShmLHZ1bWF4KTt9Cit9Cit2b2lkIGVtaXR2YWwoRklMRSAqZix1bmlvbiBhdHlwcyAqcCxpbnQgdCkKKy8qICBHaWJ0IGF0eXBzIGF1cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgdCY9TlU7CisgIGlmKHQ9PUNIQVIpe3ZtYXg9emMyem0ocC0+dmNoYXIpO2VtaXR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfENIQVIpKXt2dW1heD16dWMyenVtKHAtPnZ1Y2hhcik7ZW1pdHp1bShmLHZ1bWF4KTt9CisgIGlmKHQ9PVNIT1JUKXt2bWF4PXpzMnptKHAtPnZzaG9ydCk7ZW1pdHptKGYsdm1heCk7fQorICBpZih0PT0oVU5TSUdORUR8U0hPUlQpKXt2dW1heD16dXMyenVtKHAtPnZ1c2hvcnQpO2VtaXR6dW0oZix2dW1heCk7fQorICBpZih0PT1GTE9BVCl7dmxkb3VibGU9emYyemxkKHAtPnZmbG9hdCk7ZW1pdHpsZChmLHZsZG91YmxlKTt9CisgIGlmKHQ9PURPVUJMRSl7dmxkb3VibGU9emQyemxkKHAtPnZkb3VibGUpO2VtaXR6bGQoZix2bGRvdWJsZSk7fQorICBpZih0PT1MRE9VQkxFKXtlbWl0emxkKGYscC0+dmxkb3VibGUpO30KKyAgaWYodD09SU5UKXt2bWF4PXppMnptKHAtPnZpbnQpO2VtaXR6bShmLHZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfElOVCkpe3Z1bWF4PXp1aTJ6dW0ocC0+dnVpbnQpO2VtaXR6dW0oZix2dW1heCk7fQorICBpZih0PT1MT05HKXt2bWF4PXpsMnptKHAtPnZsb25nKTtlbWl0em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxMT05HKSl7dnVtYXg9enVsMnp1bShwLT52dWxvbmcpO2VtaXR6dW0oZix2dW1heCk7fQorICBpZih0PT1MTE9ORyl7dm1heD16bGwyem0ocC0+dmxsb25nKTtlbWl0em0oZix2bWF4KTt9CisgIGlmKHQ9PShVTlNJR05FRHxMTE9ORykpe3Z1bWF4PXp1bGwyenVtKHAtPnZ1bGxvbmcpO2VtaXR6dW0oZix2dW1heCk7fQorICBpZih0PT1NQVhJTlQpe2VtaXR6bShmLHAtPnZtYXgpO30KKyAgaWYodD09KFVOU0lHTkVEfE1BWElOVCkpe2VtaXR6dW0oZixwLT52dW1heCk7fQorICAvKkZJWE1FKi8KKyAgaWYodD09UE9JTlRFUil7dnVtYXg9enVsMnp1bShwLT52dWxvbmcpO2VtaXR6dW0oZix2dW1heCk7fQorfQorI2VuZGlmCisKK3ZvaWQgcHJpYzIoRklMRSAqZixJQyAqcCkKKy8qICBHaWJ0IGVpbiBJQyBhdXMuICAqLworeworICBpZihwLT5jb2RlPk5PUCkgaWVycm9yKDApOworICBpZihwLT5uZXh0JiZwLT5uZXh0LT5wcmV2IT1wKSBpZXJyb3IoMCk7CisgIGlmKHAtPmNvZGU+PUxBQkVMJiZwLT5jb2RlPD1CUkEpeworICAgIGlmKHAtPmNvZGU9PUxBQkVMKQorICAgICAgZnByaW50ZihmLCJMJWQiLHAtPnR5cGYpOworICAgIGVsc2V7CisgICAgICBmcHJpbnRmKGYsIlx0JXMgTCVkIixlbmFtZVtwLT5jb2RlXSxwLT50eXBmKTsKKyAgICAgIGlmKHAtPnExLmZsYWdzKXsgZnByaW50ZihmLCIsIik7cHJvYmooZiwmcC0+cTEsMCk7fQorICAgIH0KKyAgICBpZihwLT5jb2RlPT1MQUJFTCYmKHAtPmZsYWdzJkxPT1BfQ09ORF9UUlVFKSkgZnByaW50ZihmLCIgKHdoaWxlLWxvb3ApIik7CisgICAgaWYocC0+Y29kZT09QlJBJiYocC0+ZmxhZ3MmTE9PUF9DT05EX1RSVUUpKSBmcHJpbnRmKGYsIiAodG8tbG9vcC10ZXN0KSIpOworICB9ZWxzZXsKKyAgICBmcHJpbnRmKGYsIlx0JXMgIixlbmFtZVtwLT5jb2RlXSk7CisgICAgaWYocC0+dHlwZiZWT0xBVElMRSkgZnByaW50ZihmLCJ2b2xhdGlsZSAiKTsKKyAgICBpZihwLT50eXBmJkNPTlNUKSBmcHJpbnRmKGYsImNvbnN0ICIpOworICAgIGlmKHAtPnR5cGYmVU5TSUdORUQpIGZwcmludGYoZiwidW5zaWduZWQgIik7CisgICAgaWYocC0+dHlwZil7CisgICAgICBpZihJU1ZFQ1RPUihwLT50eXBmKSkKKwlmcHJpbnRmKGYsIiVzJWQgIix0eXBuYW1lW1ZFQ1RZUEUocC0+dHlwZikmTlFdLFZFQ0RJTShwLT50eXBmKSk7CisgICAgICBlbHNlCisJZnByaW50ZihmLCIlcyAiLHR5cG5hbWVbcC0+dHlwZiZOUV0pOworICAgIH0KKyAgICBwcm9iaihmLCZwLT5xMSxxMXR5cChwKSk7CisgICAgaWYocC0+cTIuZmxhZ3Mpe2ZwcmludGYoZiwiLCIpO3Byb2JqKGYsJnAtPnEyLHEydHlwKHApKTt9CisgICAgaWYocC0+ei5mbGFncyl7ZnByaW50ZihmLCItPiIpO3Byb2JqKGYsJnAtPnosenR5cChwKSk7fQorICAgIGlmKHAtPmNvZGU9PUFTU0lHTnx8cC0+Y29kZT09UFVTSHx8cC0+Y29kZT09UE9QfHxwLT5jb2RlPT1DQUxMKQorICAgICAgZnByaW50ZihmLCIgc2l6ZT0lbGQiLHptMmwocC0+cTIudmFsLnZtYXgpKTsKKyAgICBpZigocC0+Y29kZT09U0FWRVJFR1N8fHAtPmNvZGU9PVJFU1RPUkVSRUdTKSYmcC0+cTEucmVnKQorICAgICAgZnByaW50ZihmLCIgZXhjZXB0ICVzIixyZWduYW1lc1twLT5xMS5yZWddKTsKKyAgICBpZihwLT5jb2RlPT1DT05WRVJUKQorICAgICAgZnByaW50ZihmLCIgZnJvbSAlcyVzIiwocC0+dHlwZjImVU5TSUdORUQpPyJ1bnNpZ25lZCAiOiIiLHR5cG5hbWVbcC0+dHlwZjImTlFdKTsKKyAgICBpZihwLT5jb2RlPT1MU0hJRlR8fHAtPmNvZGU9PVJTSElGVCkKKyAgICAgIGZwcmludGYoZiwiIHNoaWZ0LXR5cGUgJXMlcyIsKHAtPnR5cGYyJlVOU0lHTkVEKT8idW5zaWduZWQgIjoiIix0eXBuYW1lW3AtPnR5cGYyJk5RXSk7CisgICAgaWYocC0+Y29kZT09QURESTJQfHxwLT5jb2RlPT1TVUJJRlB8fHAtPmNvZGU9PVNVQlBGUHx8cC0+Y29kZT09QUREUkVTUykKKyAgICAgIGZwcmludGYoZiwiIHB0eXBlPSVzJXMiLChwLT50eXBmMiZVTlNJR05FRCk/InVuc2lnbmVkICI6IiIsdHlwbmFtZVtwLT50eXBmMiZOUV0pOworICAgIGlmKHAtPmNvZGU9PUFTU0lHTnx8cC0+Y29kZT09UFVTSCkKKyAgICAgIGlmKHAtPnR5cGYyKSBmcHJpbnRmKGYsIiBhbGlnbj0lZFxuIixwLT50eXBmMik7CisgIH0KKyAgaWYocC0+Y29kZT09Q0FMTCl7CisgICAgZnByaW50ZihmLCIgPT4iKTsKKyAgICBpZihwLT5jYWxsX2NudD09MCkKKyAgICAgIGZwcmludGYoZiwiKHVua25vd24pIik7CisgICAgZWxzZXsKKyAgICAgIGludCBpOworICAgICAgZm9yKGk9MDtpPHAtPmNhbGxfY250O2krKykKKyAgICAgICAgZnByaW50ZihmLCIgJXMiLHAtPmNhbGxfbGlzdFtpXS52LT5pZGVudGlmaWVyKTsKKyAgICB9CisgICAgCisgIH0KKyAgaWYocC0+ZmxhZ3MmRUZGX0lDKSBmcHJpbnRmKGYsIiAoZWZmX2ljKSIpOworICBmcHJpbnRmKGYsIlxuIik7CisjaWYgMAorICBpZihwLT5jb2RlPT1DQUxMKXsKKyAgICBpbnQgaTsKKyAgICAvL2ZwcmludGYoZiwiYz0lcFxuIixwKTsKKyAgICBmb3IoaT0wO2k8cC0+YXJnX2NudDtpKyspeworICAgICAgLy9mcHJpbnRmKGYsIiVwIVxuIixwLT5hcmdfbGlzdFtpXSk7CisgICAgICBmcHJpbnRmKGYsIiUwMmQ6IixpKTsKKyAgICAgIHByaWMyKGYscC0+YXJnX2xpc3RbaV0pOworICAgIH0KKyAgfQorI2VuZGlmCit9Cit2b2lkIHByaWMoRklMRSAqZixJQyAqcCkKKy8qICBHaWJ0IElDLUxpc3RlIGF1ZiBkZW0gQmlsZHNjaGlybSBhdXMuICAgICAgICAgICAgICovCit7CisgIHdoaWxlKHApeworICAgIHByaWMyKGYscCk7CisvKiAgICAgICAgaWYocC0+cTEuYW18fHAtPnEyLmFtfHxwLT56LmFtKSBpZXJyb3IoMCk7Ki8KKyAgICBwPXAtPm5leHQ7CisgIH0KK30KK3ZvaWQgcHJpbnR6bShGSUxFICpmLHptYXggeCkKKy8qICBLb252ZXJ0aWVydCB6bWF4IG5hY2ggQVNDSUkuICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEJhc2llcnQgbm9jaCBlaW5pZ2VybWFzc2VuIGF1ZiAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFp3ZWllcmtvbXBsZW1lbnRkYXJzdGVsbHVuZyAoZC5oLiAtTUlOPk1BWCkuICAgICAgICAqLworLyogIEF1c3NlcmRlbSBtdXNzIG1heChhYnMobWF4KSk8PW1heCh1bnNpZ25lZCBtYXgpLiAgKi8KK3sKKyAgem1heCB6bTt6dW1heCB6dW07CisgIHptPWwyem0oMEwpOworICBpZih6bWxlcSh4LHptKSYmIXptZXF0byh4LHptKSl7CisgICAgZnByaW50ZihmLCItIik7em09enVtMnptKHRfbWF4KE1BWElOVCkpOworICAgIGlmKHptbGVxKHgsem1zdWIobDJ6bSgwTCksem0pKSYmIXptZXF0byh4LHptc3ViKGwyem0oMEwpLHptKSkpeworICAgICAgLyogIGF1ZnBhc3NlbiwgZGEgLXggZXZ0bC4gPkxPTkdfTUFYICAgICovCisgICAgICB6dW09dF9tYXgoTUFYSU5UKTsKKyAgICAgIHg9em1hZGQoeCx6bSk7CisgICAgfWVsc2UgCisgICAgICB6dW09dWwyenVtKDBVTCk7CisgICAgeD16bXN1YihsMnptKDBMKSx4KTsKKyAgICB2dW1heD16bTJ6dW0oeCk7CisgICAgenVtPXp1bWFkZCh6dW0sdnVtYXgpOworICB9ZWxzZQorICAgIHp1bT16bTJ6dW0oeCk7CisgIHByaW50enVtKGYsenVtKTsKK30KK3ZvaWQgcHJpbnR6dW0oRklMRSAqZix6dW1heCB4KQorLyogIEtvbnZlcnRpZXJ0IHp1bWF4IG5hY2ggQVNDSUkuICAgICAgICAgICAgICAgICAgICAgICovCit7CisgIHp1bWF4IHp1bTt1bnNpZ25lZCBsb25nIGw7CisgIHp1bT11bDJ6dW0oMTBVTCk7CisgIGlmKCF6dW1lcXRvKHp1bWRpdih4LHp1bSksdWwyenVtKDBVTCkpKSBwcmludHp1bShmLHp1bWRpdih4LHp1bSkpOworICB6dW09enVtbW9kKHgsenVtKTtsPXp1bTJ1bCh6dW0pOworICBmcHJpbnRmKGYsIiVjIiwoaW50KShsKycwJykpOworfQorCit2b2lkIHByaW50emxkKEZJTEUgKmYsemxkb3VibGUgeCkKKy8qICBLb252ZXJ0aWVydCB6ZG91YmxlIG5hY2ggQVNDSUksIG5vY2ggbmljaHQgZmVydGlnLiAgKi8KK3sKKyAgZnByaW50ZihmLCJmcC1jb25zdGFudCIpOworfQordm9pZCBlbWl0em0oRklMRSAqZix6bWF4IHgpCisvKiAgS29udmVydGllcnQgem1heCBuYWNoIEFTQ0lJLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBCYXNpZXJ0IG5vY2ggZWluaWdlcm1hc3NlbiBhdWYgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBad2VpZXJrb21wbGVtZW50ZGFyc3RlbGx1bmcgKGQuaC4gLU1JTj5NQVgpLiAgICAgICAgKi8KKy8qICBBdXNzZXJkZW0gbXVzcyBtYXgoYWJzKG1heCkpPD1tYXgodW5zaWduZWQgbWF4KS4gICovCit7CisgIHptYXggem07enVtYXggenVtOworICB6bT1sMnptKDBMKTsKKyAgaWYoem1sZXEoeCx6bSkmJiF6bWVxdG8oeCx6bSkpeworICAgIGVtaXQoZiwiLSIpO3ptPXp1bTJ6bSh0X21heChNQVhJTlQpKTsKKyAgICBpZih6bWxlcSh4LHptc3ViKGwyem0oMEwpLHptKSkmJiF6bWVxdG8oeCx6bXN1YihsMnptKDBMKSx6bSkpKXsKKyAgICAgIC8qICBhdWZwYXNzZW4sIGRhIC14IGV2dGwuID5MT05HX01BWCAgICAqLworICAgICAgenVtPXRfbWF4KE1BWElOVCk7CisgICAgICB4PXptYWRkKHgsem0pOworICAgIH1lbHNlIAorICAgICAgenVtPXVsMnp1bSgwVUwpOworICAgIHg9em1zdWIobDJ6bSgwTCkseCk7CisgICAgdnVtYXg9em0yenVtKHgpOworICAgIHp1bT16dW1hZGQoenVtLHZ1bWF4KTsKKyAgfWVsc2UKKyAgICB6dW09em0yenVtKHgpOworICBlbWl0enVtKGYsenVtKTsKK30KK3ZvaWQgZW1pdHp1bShGSUxFICpmLHp1bWF4IHgpCisvKiAgS29udmVydGllcnQgenVtYXggbmFjaCBBU0NJSS4gICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgenVtYXggenVtO3Vuc2lnbmVkIGxvbmcgbDsKKyAgenVtPXVsMnp1bSgxMFVMKTsKKyAgaWYoIXp1bWVxdG8oenVtZGl2KHgsenVtKSx1bDJ6dW0oMFVMKSkpIGVtaXR6dW0oZix6dW1kaXYoeCx6dW0pKTsKKyAgenVtPXp1bW1vZCh4LHp1bSk7bD16dW0ydWwoenVtKTsKKyAgZW1pdChmLCIlYyIsKGludCkobCsnMCcpKTsKK30KKwordm9pZCBlbWl0emxkKEZJTEUgKmYsemxkb3VibGUgeCkKKy8qICBLb252ZXJ0aWVydCB6ZG91YmxlIG5hY2ggQVNDSUksIG5vY2ggbmljaHQgZmVydGlnLiAgKi8KK3sKKyAgZW1pdChmLCJmcC1jb25zdGFudCIpOworfQorCit0eXBlZGVmIHN0cnVjdCBtZW1ibG9jayB7c3RydWN0IG1lbWJsb2NrICpuZXh0O3ZvaWQgKnA7fSBtZW1ibG9jazsKK3N0YXRpYyBtZW1ibG9jayAqZmlyc3RfbWI7CisKK3N0YXRpYyB2b2lkIGFkZF9tYih2b2lkICpwKQoreworICBtZW1ibG9jayAqbWJfc2Vjb25kPWZpcnN0X21iOworICBtZW1ibG9jayAqbWI9bWFsbG9jKHNpemVvZigqbWIpKTsKKyAgaWYoIW1iKXsKKyAgICBlcnJvcigxMik7CisgICAgcmF1cygpOworICB9CisgIGZpcnN0X21iPW1iOworICBtYi0+bmV4dD1tYl9zZWNvbmQ7CisgIG1iLT5wPXA7Cit9ICAKKworc3RhdGljIHZvaWQgcmVtb3ZlX21iKHZvaWQgKnApCit7CisgIG1lbWJsb2NrICptYl9wcmV2PTA7CisgIG1lbWJsb2NrICptYj1maXJzdF9tYjsKKyAgd2hpbGUobWIpeworICAgIGlmKG1iLT5wPT1wKXsKKyAgICAgIGlmKG1iX3ByZXY9PTApIGZpcnN0X21iPW1iLT5uZXh0OworICAgICAgZWxzZSBtYl9wcmV2LT5uZXh0PW1iLT5uZXh0OworICAgICAgKGZyZWUpKG1iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWJfcHJldj1tYjsKKyAgICBtYj1tYi0+bmV4dDsKKyAgfQorICBpZXJyb3IoMCk7Cit9CisKK3ZvaWQgKm15bWFsbG9jKHNpemVfdCBzaXplKQorLyogIEFsbG9jYXRlIG1lbW9yeSBhbmQgcXVpdCBvbiBmYWlsdXJlLiAgKi8KK3sKKyAgdm9pZCAqcDsKKyAgaWYoZG1hbGxvYykKKyAgICBzaXplKz1zaXplb2Yoc2l6ZSk7CisgIGVsc2UgaWYoc2l6ZT09MCkKKyAgICAvKiBOb3QgdmVyeSBuaWNlLCBidXQgc2ltcGxlc3Qgd2F5IHRvIGF2b2lkIGEgZmFpbHVyZSB3aGVuIHNpemU9PTAuICovCisgICAgc2l6ZT0xOworICBpZighKHA9bWFsbG9jKHNpemUpKSl7CisgICAgZXJyb3IoMTIpOworICAgIHJhdXMoKTsKKyAgfQorICBpZihERUJVRyYzMjc2OCl7CisgICAgcHJpbnRmKCJtYWxsb2MgJXAgKHM9JWx1KVxuIixwLCh1bnNpZ25lZCBsb25nKXNpemUpOworICAgIGZmbHVzaChzdGRvdXQpOworICB9CisgIGlmKERFQlVHJjY1NTM2KSBhZGRfbWIocCk7CisgIGlmKGRtYWxsb2MpeworICAgICooc2l6ZV90ICopcD1zaXplOworICAgIHA9KChjaGFyICopcCkrc2l6ZW9mKHNpemUpOworICAgIG1lbXNldChwLDB4YWEsc2l6ZS1zaXplb2Yoc2l6ZSkpOworICB9IAorICByZXR1cm4gcDsKK30KKwordm9pZCAqbXlyZWFsbG9jKHZvaWQgKnAsc2l6ZV90IHNpemUpCisvKiAgUmVhbGxvY2F0ZSBtZW1vcnkgYW5kIHF1aXQgb24gZmFpbHVyZS4gICovCit7CisgIHZvaWQgKm5ldzsKKyAgaWYoIXApIHJldHVybiBteW1hbGxvYyhzaXplKTsKKyAgaWYoZG1hbGxvYyl7CisgICAgc2l6ZSs9c2l6ZW9mKHNpemUpOworICAgIG5ldz1yZWFsbG9jKCgoY2hhciAqKXApLXNpemVvZihzaXplKSxzaXplKTsKKyAgICBpZighbmV3KXsKKyAgICAgIGVycm9yKDEyKTsKKyAgICAgIHJhdXMoKTsKKyAgICB9CisgICAgaWYoREVCVUcmMzI3NjgpeworICAgICAgcHJpbnRmKCJyZWFsbG9jICVwIHRvICVwIChzPSVsdSlcbiIscCxuZXcsKHVuc2lnbmVkIGxvbmcpc2l6ZSk7CisgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICB9CisgICAgaWYoREVCVUcmNjU1MzYpeworICAgICAgcmVtb3ZlX21iKHApOworICAgICAgYWRkX21iKG5ldyk7CisgICAgfQorICAgICooc2l6ZV90ICopbmV3PXNpemU7CisgICAgbmV3PSgoY2hhciAqKW5ldykrc2l6ZW9mKHNpemUpOworICAgIHJldHVybiBuZXc7CisgIH1lbHNleworICAgIG5ldz1yZWFsbG9jKHAsc2l6ZSk7CisgICAgaWYoIW5ldyl7CisgICAgICBlcnJvcigxMik7CisgICAgICByYXVzKCk7CisgICAgfQorICAgIGlmKERFQlVHJjMyNzY4KXsKKyAgICAgIHByaW50ZigicmVhbGxvYyAlcCB0byAlcCAocz0lbHUpXG4iLHAsbmV3LCh1bnNpZ25lZCBsb25nKXNpemUpOworICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgfQorICAgIGlmKERFQlVHJjY1NTM2KXsKKyAgICAgIHJlbW92ZV9tYihwKTsKKyAgICAgIGFkZF9tYihuZXcpOworICAgIH0KKyAgICByZXR1cm4gbmV3OworICB9Cit9CisKK3ZvaWQgbXlmcmVlKHZvaWQgKnApCit7CisgIGlmKHAmJmRtYWxsb2MpeworICAgIHA9KChjaGFyKilwKS1zaXplb2Yoc2l6ZV90KTsKKyAgICBtZW1zZXQocCwweGJiLCooc2l6ZV90ICopKHApKTsKKyAgfQorICBpZihERUJVRyYzMjc2OCl7CisgICAgcHJpbnRmKCJmcmVlICVwXG4iLHApOworICAgIGZmbHVzaChzdGRvdXQpOworICB9CisgIGlmKChERUJVRyY2NTUzNikmJnApIHJlbW92ZV9tYihwKTsKKyAgKGZyZWUpKHApOyAgLyogc3VwcC5oIGhhcyAjZGVmaW5lIGZyZWUoeCkgbXlmcmVlKHgpICovCit9CisKK2NoYXIgKm15c3RyZHVwKGNoYXIgKnApCit7CisgIGNoYXIgKm5ldz1teW1hbGxvYyhzdHJsZW4ocCkrMSk7CisgIHN0cmNweShuZXcscCk7CisgIHJldHVybiBuZXc7Cit9CisKKy8qIFRlc3RldCwgb2IgendlaSBvYmpzIGRpZXNlbGJlbiBSZWdpc3RlciBiZWxlZ2VuLiAqLworaW50IGNvbGxpZGVzKG9iaiAqeCxvYmogKnkpCit7CisgICAgaW50IHgxLHgyLHkxLHkyOworICAgIGlmKCEoeC0+ZmxhZ3MmUkVHKXx8ISh5LT5mbGFncyZSRUcpKSByZXR1cm4gMDsKKyAgICBpZihyZWdfcGFpcih4LT5yZWcsJnJwKSl7CisgICAgICAgIHgxPXJwLnIxO3gyPXJwLnIyOworICAgIH1lbHNleworICAgICAgICB4MT14LT5yZWc7eDI9LTE7CisgICAgfQorICAgIGlmKHJlZ19wYWlyKHktPnJlZywmcnApKXsKKyAgICAgICAgeTE9cnAucjE7eTI9cnAucjI7CisgICAgfWVsc2V7CisgICAgICAgIHkxPXktPnJlZzt5Mj0tMjsKKyAgICB9CisgICAgaWYoeDE9PXkxfHx4MT09eTJ8fHgyPT15MXx8eDI9PXkyKQorICAgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCisvKiBWZXJzdWNodCwgZWluIElDIHNvIHp1IGRyZWhlbiwgZGFzcyBxMiB1bmQgeiBrZWluIGdlbWVpbnNhbWVzICovCisvKiBSZWdpc3RlciBiZWxlZ2VuLiBMaWVmZXJ0IE51bGwsIHdlbm4gZGFzIG5pY2h0IG1vZWdsaWNoIGlzdC4gICovCitpbnQgc3dpdGNoX0lDKElDICpwKQoreworICAgIGludCBjOworICAgIG9iaiBvOworICAgIGlmKCFjb2xsaWRlcygmcC0+cTIsJnAtPnopKSByZXR1cm4gMTsKKyAgICBjPXAtPmNvZGU7CisgICAgaWYoKGM8T1J8fGM+QU5EKSYmYyE9QUREJiZjIT1NVUxUJiZjIT1BRERJMlApIHJldHVybiAwOworICAgIGlmKGM9PUFEREkyUCYmbXVzdF9jb252ZXJ0KHExdHlwKHApLHEydHlwKHApLDApKSByZXR1cm4gMDsKKyAgICBpZihjb2xsaWRlcygmcC0+cTEsJnAtPnopKSByZXR1cm4gMDsKKyAgICBvPXAtPnEyO3AtPnEyPXAtPnExO3AtPnExPW87CisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgcHJvYmooRklMRSAqZixvYmogKnAsaW50IHQpCisvKiAgR2lidCBPYmpla3QgYXVmIEJpbGRzY2hpcm0gYXVzLiAgICAgICAgICAgICAgICAgICAgKi8KK3sKKyAgaWYocC0+YW0peyBmcHJpbnRmKGYsIlt0Z3QtYWRkcmVzc2luZy1tb2RlXSIpO3JldHVybjt9CisgIGlmKHAtPmZsYWdzJkRSRUZPQkopeworICAgIGZwcmludGYoZiwiKFsiKTsKKyAgICBpZihwLT5kdHlwJkNPTlNUKSBmcHJpbnRmKGYsImNvbnN0ICIpOworICAgIGlmKHAtPmR0eXAmVk9MQVRJTEUpIGZwcmludGYoZiwidm9sYXRpbGUgIik7CisgICAgaWYocC0+ZHR5cCZQVk9MQVRJTEUpIGZwcmludGYoZiwicHZvbGF0aWxlICIpOworICAgIGZwcmludGYoZiwiJXNdIix0eXBuYW1lW3AtPmR0eXAmTlFdKTsKKyAgfQorICBpZihwLT5mbGFncyZWQVJBRFIpIGZwcmludGYoZiwiIyIpOworICBpZihwLT5mbGFncyZWQVIpIHsKKyAgICBpZighKHAtPmZsYWdzJlJFRykpCisgICAgICBwcmludHZhbChmLCZwLT52YWwsTUFYSU5UKTsKKyAgICBpZihwLT5mbGFncyZSRUcpeworICAgICAgICBmcHJpbnRmKGYsIiVzIixyZWduYW1lc1twLT5yZWddKTsKKyAgICB9ZWxzZSBpZihwLT52LT5zdG9yYWdlX2NsYXNzPT1BVVRPfHxwLT52LT5zdG9yYWdlX2NsYXNzPT1SRUdJU1RFUil7CisgICAgICAgIGZwcmludGYoZiwiKyVsZChGUCkiLCB6bTJsKHAtPnYtPm9mZnNldCkpOworICAgIH1lbHNleworICAgICAgaWYocC0+di0+c3RvcmFnZV9jbGFzcz09U1RBVElDKXsKKyAgICAgICAgZnByaW50ZihmLCIrTCVsZCIsem0ybChwLT52LT5vZmZzZXQpKTsKKyAgICAgIH1lbHNleworICAgICAgICBmcHJpbnRmKGYsIitfJXMiLHAtPnYtPmlkZW50aWZpZXIpOworICAgICAgfQorICAgIH0KKyAgICBpZigqcC0+di0+aWRlbnRpZmllcikKKyAgICAgIGZwcmludGYoZiwiKCVzKSIscC0+di0+aWRlbnRpZmllcik7CisgICAgZWxzZSBpZihwLT52LT5kZXNjcmlwdGlvbikKKyAgICAgIGZwcmludGYoZiwiKCVzKSIscC0+di0+ZGVzY3JpcHRpb24pOworICAgIGVsc2UKKyAgICAgIGZwcmludGYoZiwiKCVwKSIsKHZvaWQgKilwLT52KTsKKyAgICBpZihwLT52LT5yZWcpIGZwcmludGYoZiwiOiVzIixyZWduYW1lc1thYnMocC0+di0+cmVnKV0pOworICB9CisgIGlmKChwLT5mbGFncyZSRUcpJiYhKHAtPmZsYWdzJlZBUikpIGZwcmludGYoZiwiJXMiLHJlZ25hbWVzW3AtPnJlZ10pOworICBpZihwLT5mbGFncyZLT05TVCl7CisgICAgZnByaW50ZihmLCIjIik7CisgICAgaWYocC0+ZmxhZ3MmRFJFRk9CSikKKyAgICAgIHByaW50dmFsKGYsJnAtPnZhbCxwLT5kdHlwJk5VKTsKKyAgICBlbHNlCisgICAgICBwcmludHZhbChmLCZwLT52YWwsdCZOVSk7CisgIH0KKyAgaWYocC0+ZmxhZ3MmU0NSQVRDSCkgZnByaW50ZihmLCJbU10iKTsKKyAgaWYocC0+ZmxhZ3MmRFJFRk9CSikgZnByaW50ZihmLCIpIik7Cit9Cit2b2lkIHBybChGSUxFICpvLHN0cnVjdF9kZWNsYXJhdGlvbiAqcCkKKy8qIEdpYnQgZWluZSBzdHJ1Y3RfZGVjbGFyYXRpb24gYXVmIGRlbSBCaWxkc2NoaXJtIGF1cy4gKi8KK3sKKyAgaW50IGk7CisgIHN0YXRpYyBpbnQgcmVjdXJzZT0yOworICBpbnQgbWVya19yZWN1cnNlPXJlY3Vyc2U7CisgIC0tcmVjdXJzZTsKKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICBmb3IoaT0wO2k8cC0+Y291bnQ7aSsrKXsKKyAgICBmcHJpbnRmKG8sIiAlZC46IixpKTsKKyAgICBpZihyZWN1cnNlPj0wKXsKKyAgICAgIGlmKCgqcC0+c2wpW2ldLmlkZW50aWZpZXIpZnByaW50ZihvLCIgaWRlbnQ6ICVzOyAiLCgqcC0+c2wpW2ldLmlkZW50aWZpZXIpOworICAgICAgcHJkKG8sKCpwLT5zbClbaV0uc3R5cCk7CisgICAgfQorICB9CisgIHJlY3Vyc2U9bWVya19yZWN1cnNlOworfQordm9pZCBwcmQoRklMRSAqbyx0eXBlICpwKQorLyogR2lidCBlaW5lbiBUeXAgYXVmIGRlbSBCaWxkc2NoaXJtIGF1cy4gICAgKi8KK3sKKyAgaW50IGY7CisgIGlmKCFwKSB7ZnByaW50ZihvLCJlbXB0eSB0eXBlICIpO3JldHVybjt9CisgICAgZj1wLT5mbGFnczsKKy8qICAgIGZwcmludGYobywiKFNpemVvZj0lbGQsZmxhZ3M9JWQpIix6bDJsKHN6b2YocCkpLGYpOyovCisvKiAgICBpZih0eXBlX3VuY29tcGxldGUocCkpIHtmcHJpbnRmKG8sImluY29tcGxldGUgIik7fSovCisgIGlmKGYmQ09OU1QpIHtmcHJpbnRmKG8sImNvbnN0ICIpO2YmPX5DT05TVDt9CisgIGlmKGYmU1RSSU5HQ09OU1QpIHtmcHJpbnRmKG8sInN0cmluZy1jb25zdCAiKTtmJj1+U1RSSU5HQ09OU1Q7fQorICBpZihmJlZPTEFUSUxFKSB7ZnByaW50ZihvLCJ2b2xhdGlsZSAiKTtmJj1+Vk9MQVRJTEU7fQorICBpZihmJlVOU0lHTkVEKSB7ZnByaW50ZihvLCJ1bnNpZ25lZCAiKTtmJj1+VU5TSUdORUQ7fQorICBpZihwLT5hdHRyKSBmcHJpbnRmKG8sImF0dHIoJXMpICIscC0+YXR0cik7CisgIGlmKHAtPnJlZykgZnByaW50ZihvLCJyZWcoJXMpICIscmVnbmFtZXNbcC0+cmVnXSk7CisgIGlmKElTRlVOQyhmKSl7CisgICAgZnByaW50ZihvLCIlcyB3aXRoIHBhcmFtZXRlcnMgKCIsdHlwbmFtZVtmJk5RXSk7CisgICAgcHJsKG8scC0+ZXhhY3QpOworICAgIGZwcmludGYobywiKSByZXR1cm5pbmcgIik7cHJkKG8scC0+bmV4dCk7cmV0dXJuOworICB9CisgIGlmKElTU1RSVUNUKGYpfHxJU1VOSU9OKGYpKXsKKyAgICBmcHJpbnRmKG8sIiVzIHdpdGggY29tcG9uZW50cyB7Iix0eXBuYW1lW2YmTlFdKTsKKyAgICBwcmwobyxwLT5leGFjdCk7IGZwcmludGYobywifSAiKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYoSVNQT0lOVEVSKGYpKSB7ZnByaW50ZihvLCIlcyB0byAiLHR5cG5hbWVbZiZOUV0pO3ByZChvLHAtPm5leHQpO3JldHVybjt9CisgIGlmKElTQVJSQVkoZikpIHtmcHJpbnRmKG8sIiVzIFtzaXplICVsZF0gb2YgIix0eXBuYW1lW2YmTlFdLHptMmwocC0+c2l6ZSkpO3ByZChvLHAtPm5leHQpO3JldHVybjt9CisgIGlmKElTVkVDVE9SKGYpKSB7ZnByaW50ZihvLCJ2ZWN0b3IgW3NpemUgJWxkXSBvZiAlcyIsem0ybChwLT5zaXplKSx0eXBuYW1lW1ZFQ1RZUEUoZikmTlFdKTtyZXR1cm47fQorCisgIGZwcmludGYobywiJXMiLHR5cG5hbWVbZiZOUV0pOworfQordm9pZCBwcmludF92YXIoRklMRSAqbyxWYXIgKnApCisvKiBHaWJ0IGVpbmUgVmFyaWFibGUgYXVzLiAqLworeworICBpZihwLT5pZGVudGlmaWVyJiYqcC0+aWRlbnRpZmllcil7CisgICAgZnByaW50ZihvLCAiaWRlbnQ6ICVzOiAiLCBwLT5pZGVudGlmaWVyKTsKKyAgfQorICBwcmQobywgcC0+dnR5cCk7Cit9CisKKy8qIHJldHVybnMgdGhlIGZpcnN0IGJhc2UgVHlwZSBpbiBhbiBjb21wb3VuZCB0eXBlICovCitpbnQgZ2V0X2ZpcnN0X2Jhc2VfdHlwZSh0eXBlICp0KSAKK3sKKyAgaWYgKCF0KSByZXR1cm4gMDsKKyAgaWYgKElTQVJSQVkodC0+ZmxhZ3MpKSB7CisgICAgICAgIHJldHVybiBnZXRfZmlyc3RfYmFzZV90eXBlKHQtPm5leHQpOworICB9IGVsc2UgaWYgKChJU1NUUlVDVCh0LT5mbGFncykpIHx8IChJU1VOSU9OKHQtPmZsYWdzKSkpIHsKKyAgICByZXR1cm4gZ2V0X2ZpcnN0X2Jhc2VfdHlwZSgoKnQtPmV4YWN0LT5zbClbMF0uc3R5cCk7CisgIH0gZWxzZSByZXR1cm4gdC0+ZmxhZ3M7Cit9CisKKworI2lmbmRlZiBIQVZFX0VYVF9UWVBFUworCit2b2lkIGluc2VydF9jb25zdCh1bmlvbiBhdHlwcyAqcCxpbnQgdCkKKy8qICBUcmFlZ3QgS29uc3RhbnRlIGluIGVudHByZWNoZW5kZXMgRmVsZCBlaW4uICAgICAgICovCit7CisgIGlmKCFwKSBpZXJyb3IoMCk7CisgIHQmPU5VOworICBpZih0PT1DSEFSKSB7cC0+dmNoYXI9dmNoYXI7cmV0dXJuO30KKyAgaWYodD09U0hPUlQpIHtwLT52c2hvcnQ9dnNob3J0O3JldHVybjt9CisgIGlmKHQ9PUlOVCkge3AtPnZpbnQ9dmludDtyZXR1cm47fQorICBpZih0PT1MT05HKSB7cC0+dmxvbmc9dmxvbmc7cmV0dXJuO30KKyAgaWYodD09TExPTkcpIHtwLT52bGxvbmc9dmxsb25nO3JldHVybjt9CisgIGlmKHQ9PU1BWElOVCkge3AtPnZtYXg9dm1heDtyZXR1cm47fQorICBpZih0PT0oVU5TSUdORUR8Q0hBUikpIHtwLT52dWNoYXI9dnVjaGFyO3JldHVybjt9CisgIGlmKHQ9PShVTlNJR05FRHxTSE9SVCkpIHtwLT52dXNob3J0PXZ1c2hvcnQ7cmV0dXJuO30KKyAgaWYodD09KFVOU0lHTkVEfElOVCkpIHtwLT52dWludD12dWludDtyZXR1cm47fQorICBpZih0PT0oVU5TSUdORUR8TE9ORykpIHtwLT52dWxvbmc9dnVsb25nO3JldHVybjt9CisgIGlmKHQ9PShVTlNJR05FRHxMTE9ORykpIHtwLT52dWxsb25nPXZ1bGxvbmc7cmV0dXJuO30KKyAgaWYodD09KFVOU0lHTkVEfE1BWElOVCkpIHtwLT52dW1heD12dW1heDtyZXR1cm47fQorICBpZih0PT1GTE9BVCkge3AtPnZmbG9hdD12ZmxvYXQ7cmV0dXJuO30KKyAgaWYodD09RE9VQkxFKSB7cC0+dmRvdWJsZT12ZG91YmxlO3JldHVybjt9CisgIGlmKHQ9PUxET1VCTEUpIHtwLT52bGRvdWJsZT12bGRvdWJsZTtyZXR1cm47fQorICBpZih0PT1QT0lOVEVSKSB7cC0+dnVsb25nPXZ1bG9uZztyZXR1cm47fQorfQordm9pZCBldmFsX2NvbnN0KHVuaW9uIGF0eXBzICpwLGludCB0KQorLyogIFdlaXN0IGJlc3RpbW10ZW4gZ2xvYmFsZW4gVmFyaWFibGVuIFdlcnQgZWluZXIgQ0VYUFIgenUuICAgICAgICovCit7CisgIGludCBmPXQmTlE7CisgIGlmKCFwKSBpZXJyb3IoMCk7CisgIGlmKGY9PU1BWElOVHx8KGY+PUNIQVImJmY8PUxMT05HKSl7CisgICAgaWYoISh0JlVOU0lHTkVEKSl7CisgICAgICBpZihmPT1DSEFSKSB2bWF4PXpjMnptKHAtPnZjaGFyKTsKKyAgICAgIGVsc2UgaWYoZj09U0hPUlQpdm1heD16czJ6bShwLT52c2hvcnQpOworICAgICAgZWxzZSBpZihmPT1JTlQpICB2bWF4PXppMnptKHAtPnZpbnQpOworICAgICAgZWxzZSBpZihmPT1MT05HKSB2bWF4PXpsMnptKHAtPnZsb25nKTsKKyAgICAgIGVsc2UgaWYoZj09TExPTkcpIHZtYXg9emxsMnptKHAtPnZsbG9uZyk7CisgICAgICBlbHNlIGlmKGY9PU1BWElOVCkgdm1heD1wLT52bWF4OworICAgICAgZWxzZSBpZXJyb3IoMCk7CisgICAgICB2dW1heD16bTJ6dW0odm1heCk7CisgICAgICB2bGRvdWJsZT16bTJ6bGQodm1heCk7CisgICAgfWVsc2V7CisgICAgICBpZihmPT1DSEFSKSB2dW1heD16dWMyenVtKHAtPnZ1Y2hhcik7CisgICAgICBlbHNlIGlmKGY9PVNIT1JUKXZ1bWF4PXp1czJ6dW0ocC0+dnVzaG9ydCk7CisgICAgICBlbHNlIGlmKGY9PUlOVCkgIHZ1bWF4PXp1aTJ6dW0ocC0+dnVpbnQpOworICAgICAgZWxzZSBpZihmPT1MT05HKSB2dW1heD16dWwyenVtKHAtPnZ1bG9uZyk7CisgICAgICBlbHNlIGlmKGY9PUxMT05HKSB2dW1heD16dWxsMnp1bShwLT52dWxsb25nKTsKKyAgICAgIGVsc2UgaWYoZj09TUFYSU5UKSB2dW1heD1wLT52dW1heDsKKyAgICAgIGVsc2UgaWVycm9yKDApOworICAgICAgdm1heD16dW0yem0odnVtYXgpOworICAgICAgdmxkb3VibGU9enVtMnpsZCh2dW1heCk7CisgICAgfQorICB9ZWxzZXsKKyAgICBpZihJU1BPSU5URVIoZikpeworICAgICAgdnVtYXg9enVsMnp1bShwLT52dWxvbmcpOworICAgICAgdm1heD16dW0yem0odnVtYXgpO3ZsZG91YmxlPXp1bTJ6bGQodnVtYXgpOworICAgIH1lbHNleworICAgICAgaWYoZj09RkxPQVQpIHZsZG91YmxlPXpmMnpsZChwLT52ZmxvYXQpOworICAgICAgZWxzZSBpZihmPT1ET1VCTEUpIHZsZG91YmxlPXpkMnpsZChwLT52ZG91YmxlKTsKKyAgICAgIGVsc2Ugdmxkb3VibGU9cC0+dmxkb3VibGU7CisgICAgICB2bWF4PXpsZDJ6bSh2bGRvdWJsZSk7CisgICAgICB2dW1heD16bGQyenVtKHZsZG91YmxlKTsKKyAgICB9CisgIH0KKyAgdmZsb2F0PXpsZDJ6Zih2bGRvdWJsZSk7CisgIHZkb3VibGU9emxkMnpkKHZsZG91YmxlKTsKKyAgdnVjaGFyPXp1bTJ6dWModnVtYXgpOworICB2dXNob3J0PXp1bTJ6dXModnVtYXgpOworICB2dWludD16dW0yenVpKHZ1bWF4KTsKKyAgdnVsb25nPXp1bTJ6dWwodnVtYXgpOworICB2dWxsb25nPXp1bTJ6dWxsKHZ1bWF4KTsKKyAgdmNoYXI9em0yemModm1heCk7CisgIHZzaG9ydD16bTJ6cyh2bWF4KTsKKyAgdmludD16bTJ6aSh2bWF4KTsKKyAgdmxvbmc9em0yemwodm1heCk7CisgIHZsbG9uZz16bTJ6bGwodm1heCk7Cit9CisjZW5kaWYKKworZnVuY3Rpb25faW5mbyAqbmV3X2ZpKHZvaWQpCisvKiAgQmVsZWd0IG5ldWUgZnVuY3Rpb25faW5mby1TdHJ1a3R1ciB1bmQgaW5pdGlhbGlzaWVydCBzaWUuICAqLworeworICBmdW5jdGlvbl9pbmZvICpuZXc7CisgIG5ldz1teW1hbGxvYyhzaXplb2YoKm5ldykpOworICBuZXctPmZpcnN0X2ljPW5ldy0+bGFzdF9pYz1uZXctPm9wdF9pYz0wOworICBuZXctPnZhcnM9MDsKKyAgbmV3LT5zdGF0aWNzPTA7CisgIG5ldy0+aW5saW5lX2FzbT0wOworICBuZXctPmZsYWdzPTA7CisgIG5ldy0+Y2FsbF9jbnQ9bmV3LT51c2VfY250PW5ldy0+Y2hhbmdlX2NudD0wOworICBuZXctPmNhbGxfbGlzdD1uZXctPnVzZV9saXN0PW5ldy0+Y2hhbmdlX2xpc3Q9MDsKKyAgbWVtc2V0KG5ldy0+cmVnc19tb2RpZmllZCwwLHNpemVvZihuZXctPnJlZ3NfbW9kaWZpZWQpKTsKKyNpZiBIQVZFX09TRUsKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICBuZXctPnN0YWNrMT11bDJ6dW0oMFVMKTsKKyAgbmV3LT5zdGFjazI9dWwyenVtKDBVTCk7CisgIG5ldy0+aW5saW5lX3NpemU9LTE7CisgIG5ldy0+aW5saW5lX2RlcHRoPTA7CisgIHJldHVybiBuZXc7Cit9Cit2b2lkIGZyZWVfZmkoZnVuY3Rpb25faW5mbyAqcCkKKy8qICBHaWJ0IGVpbiBmdW5jdGlvbl9pbmZvIG1pdCBJbmhhbHQgZnJlaS4gICAgICAgICAgICAgICAgICAgICAqLworeworICBpZihwLT5maXJzdF9pYykgZnJlZV9JQyhwLT5maXJzdF9pYyk7CisgIGlmKHAtPm9wdF9pYykgZnJlZV9JQyhwLT5vcHRfaWMpOworICBpZihwLT52YXJzKSBmcmVlX3ZhcihwLT52YXJzKTsKKyAgLyogZG8gbm90IGZyZWUgc3RhdGljcyAqLworICBmcmVlKHAtPmNhbGxfbGlzdCk7CisgIGZyZWUocC0+dXNlX2xpc3QpOworICBmcmVlKHAtPmNoYW5nZV9saXN0KTsKKyAgZnJlZShwLT5pbmxpbmVfYXNtKTsKKyAgZnJlZShwKTsKK30KKwordm9pZCBwcmludF9maShGSUxFICpmLGZ1bmN0aW9uX2luZm8gKnApCisvKiAgR2lidCBmdW5jdGlvbl9pbmZvIGF1cy4gKi8KK3sKKyAgaW50IGk7CisgIGZwcmludGYoZiwiZnVuY3Rpb25faW5mbzpcbiIpOworICBpZihwLT5maXJzdF9pYyl7CisgICAgSUMgKmljPXAtPmZpcnN0X2ljOworICAgIGZwcmludGYoZiwiIGlubGluZV9jb2RlOlxuIik7CisgICAgcHJpYzIoZixpYyk7CisgICAgd2hpbGUoaWMhPXAtPmxhc3RfaWMpeworICAgICAgaWM9aWMtPm5leHQ7CisgICAgICBwcmljMihmLGljKTsKKyAgICB9CisgIH0KKyAgaWYocC0+aW5saW5lX2FzbSkKKyAgICBmcHJpbnRmKGYsIiBpbmxpbmVfYXNtOlxuJXNcbiIscC0+aW5saW5lX2FzbSk7CisgIGlmKHAtPmZsYWdzJkFMTF9DQUxMUykKKyAgICBmcHJpbnRmKGYsIiBhbGwgY2FsbHMgaGF2ZSBiZWVuIGV2YWx1YXRlZFxuIik7CisgIGlmKHAtPmZsYWdzJkFMTF9VU0VTKQorICAgIGZwcmludGYoZiwiIGFsbCB1c2VzIGhhdmUgYmVlbiBldmFsdWF0ZWRcbiIpOworICBpZihwLT5mbGFncyZBTExfTU9EUykKKyAgICBmcHJpbnRmKGYsIiBhbGwgY2hhbmdlcyBoYXZlIGJlZW4gZXZhbHVhdGVkXG4iKTsKKyAgaWYocC0+ZmxhZ3MmQUxMX1JFR1MpeworICAgIGZwcmludGYoZiwiIGFsbCByZWctY2hhbmdlcyBoYXZlIGJlZW4gZXZhbHVhdGVkXG4iKTsKKyAgICBmb3IoaT0xO2k8PU1BWFI7aSsrKQorICAgICAgaWYoQlRTVChwLT5yZWdzX21vZGlmaWVkLGkpKSBmcHJpbnRmKGYsIiAgJXNcbiIscmVnbmFtZXNbaV0pOworICB9CisgIGZwcmludGYoZiwiIGNhbGxfbGlzdDpcbiIpO3ByaW50X3Zhcmxpc3QoZixwLT5jYWxsX2xpc3QscC0+Y2FsbF9jbnQpOworICBmcHJpbnRmKGYsIiB1c2VfbGlzdDpcbiIpO3ByaW50X3Zhcmxpc3QoZixwLT51c2VfbGlzdCxwLT51c2VfY250KTsKKyAgZnByaW50ZihmLCIgY2hhbmdlX2xpc3Q6XG4iKTtwcmludF92YXJsaXN0KGYscC0+Y2hhbmdlX2xpc3QscC0+Y2hhbmdlX2NudCk7CisgIGlmKHAtPmZsYWdzJkFMTF9TVEFDSyl7CisgICAgZnByaW50ZihmLCJzdGFjazE6ICIpO3ByaW50enVtKGYscC0+c3RhY2sxKTtmcHJpbnRmKGYsIlxuIik7CisgICAgZnByaW50ZihmLCJzdGFjazI6ICIpO3ByaW50enVtKGYscC0+c3RhY2syKTtmcHJpbnRmKGYsIlxuIik7CisgIH0KKyAgaWYocC0+ZmxhZ3MmTkVWRVJfUkVUVVJOUykKKyAgICBmcHJpbnRmKGYsIiBuZXZlciByZXR1cm5zXG4iKTsKKyAgaWYocC0+ZmxhZ3MmQUxXQVlTX1JFVFVSTlMpCisgICAgZnByaW50ZihmLCIgYWx3YXlzIHJldHVybnNcbiIpOworICBpZihwLT5mbGFncyZOT1NJREVGWCkKKyAgICBmcHJpbnRmKGYsIiBubyBzaWRlIGVmZmVjdHNcbiIpOworfQorCit2b2lkIHByaW50X3Zhcmxpc3QoRklMRSAqZix2YXJsaXN0ICpwLGludCBuKQoreworICBpbnQgaTsKKyAgY2hhciAqczsKKyAgZm9yKGk9MDtpPG47aSsrKXsKKyAgICBpZihwW2ldLnYpIHM9cFtpXS52LT5pZGVudGlmaWVyOyBlbHNlIHM9Ijx1bmtub3duPiI7CisgICAgZnByaW50ZihmLCIgICVzKCVwKSwgZmxhZ3M9JWRcbiIscywodm9pZCopcFtpXS52LHBbaV0uZmxhZ3MpOworICB9Cit9CisKK2ludCBpc19jb25zdCh0eXBlICp0KQorLyogIHRlc3RlZCwgb2IgZWluIFR5cCBrb25zdGFudCAodW5kIGRhbWl0IGV2dGwuIGluIGRlciBDb2RlLVNlY3Rpb24pIGlzdCAgICovCit7CisgIGlmKCEodC0+ZmxhZ3MmKENPTlNUfFNUUklOR0NPTlNUKSkpeworICAgIGRveworICAgICAgaWYodC0+ZmxhZ3MmKENPTlNUfFNUUklOR0NPTlNUKSkgcmV0dXJuKDEpOworICAgICAgaWYoKHQtPmZsYWdzJk5RKSE9QVJSQVkpIHJldHVybiAwOworICAgICAgdD10LT5uZXh0OworICAgIH13aGlsZSgxKTsKKyAgfWVsc2UgcmV0dXJuIDE7Cit9CisKKy8qIGlzIG9iamVjdCB2b2xhdGlsZT8gKi8KK2ludCBpc192b2xhdGlsZV9vYmoob2JqICpvKQoreworICBpZihvLT5mbGFncyZEUkVGT0JKKXsKKyAgICBpZihvLT5kdHlwJihWT0xBVElMRXxQVk9MQVRJTEUpKXsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZigoby0+ZmxhZ3MmVkFSKSYmSVNQT0lOVEVSKG8tPnYtPnZ0eXAtPmZsYWdzKSYmKG8tPnYtPnZ0eXAtPm5leHQtPmZsYWdzJlZPTEFUSUxFKSl7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgaWYoby0+ZmxhZ3MmVkFSKXsKKyAgICByZXR1cm4gby0+di0+dnR5cC0+ZmxhZ3MmVk9MQVRJTEU7CisgIH1lbHNleworICAgIHJldHVybiAwOworICB9Cit9CisKKy8qIGlzIElDIHZvbGF0aWxlPyAqLworaW50IGlzX3ZvbGF0aWxlX2ljKElDICpwKQoreworICBpZihwLT5xMS5mbGFncyl7CisgICAgaWYoaXNfdm9sYXRpbGVfb2JqKCZwLT5xMSl8fChxMXR5cChwKSZWT0xBVElMRSkpIHJldHVybiAxOworICB9CisgIGlmKHAtPnEyLmZsYWdzKXsKKyAgICBpZihpc192b2xhdGlsZV9vYmooJnAtPnEyKXx8KHEydHlwKHApJlZPTEFUSUxFKSkgcmV0dXJuIDE7CisgIH0KKyAgaWYocC0+ei5mbGFncyl7CisgICAgaWYoaXNfdm9sYXRpbGVfb2JqKCZwLT56KXx8KHp0eXAocCkmVk9MQVRJTEUpKSByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyogcmVtb3ZlcyBsYXN0IGFzbS1saW5lIGZyb20gZW1pdC1idWZmZXIgKi8KK3ZvaWQgcmVtb3ZlX2FzbSh2b2lkKQoreworICBlbWl0X2wtLTsKKyAgaWYoZW1pdF9sPDApIGVtaXRfbD1FTUlUX0JVRl9ERVBUSC0xOworfQorCisvKiBmbHVzaCB0aGUgYXNtLW91dHB1dCBidWZmZXIgKi8KK3ZvaWQgZW1pdF9mbHVzaChGSUxFICpmKQoreworICBpZighZnx8bm9fZW1pdCkgcmV0dXJuOworICB3aGlsZShlbWl0X2YhPWVtaXRfbCl7CisgICAgZnB1dHMoZW1pdF9idWZmZXJbZW1pdF9mXSxmKTsKKyAgICBlbWl0X2YrKzsKKyAgICBpZihlbWl0X2Y+PUVNSVRfQlVGX0RFUFRIKSBlbWl0X2Y9MDsKKyAgfQorICBlbWl0X2w9ZW1pdF9mPTA7CisgIGVtaXRfcD1lbWl0X2J1ZmZlclswXTsKK30KKworLyogZW1pdCBpbmxpbmUtYXNtLCBkZXBlbmRpbmcgb24gbm9faW5saW5lX3BlZXBob2xlLCBmZWVkIGl0IHRocm91Z2gKKyAgIGFzbV9wZWVwaG9sZSgpIG9yIGZsdXNoIHRoZSBidWZmZXIgYW5kIHByaW50IGl0IGRpcmVjdGx5IHRvIHRoZSBmaWxlICovCit2b2lkIGVtaXRfaW5saW5lX2FzbShGSUxFICpmLGNoYXIgKnApCit7CisgIGlmKCFmfHxub19lbWl0KSByZXR1cm47CisgIGlmKG5vX2lubGluZV9wZWVwaG9sZSl7CisgICAgZW1pdF9mbHVzaChmKTsKKyAgICBmcHJpbnRmKGYsIiVzXG4iLHApOworICB9ZWxzZXsKKyAgICB3aGlsZSgqcCl7CisgICAgICBlbWl0KGYsIiVjIiwqcCsrKTsKKyAgICB9CisgICAgZW1pdChmLCJcbiIpOworICB9Cit9CisKKy8qIHByaW50IG91dHB1dDsgdGhpcyBpcyBvbmx5IHRvIGJlIHVzZWQgZm9yIGFzc2VtYmx5IG91dHB1dCEgKi8KK3ZvaWQgZW1pdChGSUxFICpmLGNvbnN0IGNoYXIgKmZtdCwuLi4pCit7CisgIHN0YXRpYyBjaGFyIHRtcFtFTUlUX0JVRl9MRU5dOworICBjaGFyICpwOworICB2YV9saXN0IHZsOworICBpZighZnx8bm9fZW1pdCkgcmV0dXJuOworICB2YV9zdGFydCh2bCxmbXQpOworICB2c3ByaW50Zih0bXAsZm10LHZsKTsKKyAgcD10bXA7CisgIHdoaWxlKCpwKXsKKyAgICAqZW1pdF9wKys9KnArKzsKKyAgICBpZihwWy0xXT09J1xuJyl7CisgICAgICAqZW1pdF9wPTA7CisjaWYgSEFWRV9UQVJHRVRfUEVFUEhPTEUKKyAgICAgIHdoaWxlKGVtaXRfcGVlcGhvbGUoKSk7CisjZW5kaWYKKyAgICAgIGVtaXRfbCsrOworICAgICAgaWYoZW1pdF9sPj1FTUlUX0JVRl9ERVBUSCkgZW1pdF9sPTA7CisgICAgICBlbWl0X3A9ZW1pdF9idWZmZXJbZW1pdF9sXTsKKyAgICAgIGlmKGVtaXRfbD09ZW1pdF9mKXsKKyAgICAgICAgLyogRklYTUU6IGVycm9yIGNoZWNrICovCisgICAgICAgIGZwdXRzKGVtaXRfYnVmZmVyW2VtaXRfZl0sZik7CisgICAgICAgIGVtaXRfZisrOworICAgICAgICBpZihlbWl0X2Y+PUVNSVRfQlVGX0RFUFRIKSBlbWl0X2Y9MDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgKmVtaXRfcD0wOworfQorCit2b2lkIGVtaXRfY2hhcihGSUxFICpmLGludCBjKQoreworICBzdGF0aWMgY2hhciB0bXBbMl07CisgIHRtcFswXT1jOworICBlbWl0KGYsdG1wKTsKK30KKworLyogZGV0ZWN0IHdoZXRoZXIgdGhlIGZvbGxvd2luZyBjb2RlIHJlc2VtYmxlcyBhIHN3aXRjaC1jYXNlLXN0YXRlbWVudCAqLworLyogd2lsbCByZXR1cm4gdGhlIGxvbmdlc3Qgc2VxdWVuY2Ugd2hpY2ggaGFzIGF0IGxlYXN0IG1pbl9kZW5zaXR5ICovCitjYXNlX3RhYmxlICpjYWxjX2Nhc2VfdGFibGUoSUMgKnAsZG91YmxlIG1pbl9kZW5zaXR5KQoreworICBzdGF0aWMgY2FzZV90YWJsZSBjdDsKKyAgb2JqICpvLCpjY3I7CisgIHN0YXRpYyB1bmlvbiBhdHlwcyAqdmFsczsKKyAgdW5pb24gYXR5cHMgbWluLG1heDsKKyAgenVtYXggZGlmZjsKKyAgc3RhdGljIGludCAqbGFiZWxzLGN1cl9zaXplOworICBkb3VibGUgY3VyX2RlbnNpdHk7CisgIGludCB0LGosbnVtOworICBpZihwLT5jb2RlIT1DT01QQVJFfHwhKHAtPnEyLmZsYWdzJktPTlNUKSkKKyAgICByZXR1cm4gMDsKKyAgbz0mcC0+cTE7dD1wLT50eXBmOworICBpZighSVNJTlQodCl8fCh0JlZPTEFUSUxFKSkgcmV0dXJuIDA7CisgIG51bT0wOworICBjdC5udW09MDsKKyAgaWYodCZVTlNJR05FRCl7CisgICAgbWF4LnZ1bWF4PXRfbWluKFVOU0lHTkVEfE1BWElOVCk7CisgICAgbWluLnZ1bWF4PXRfbWF4KFVOU0lHTkVEfE1BWElOVCk7CisgIH1lbHNleworICAgIG1heC52bWF4PXRfbWluKE1BWElOVCk7CisgICAgbWluLnZtYXg9dF9tYXgoTUFYSU5UKTsKKyAgfQorICB3aGlsZShwJiZwLT5jb2RlPT1DT01QQVJFJiYocC0+cTIuZmxhZ3MmS09OU1QpJiZwLT50eXBmPT10JiZvYmpzX2VxdWFsKG8sJnAtPnExLHQpKXsKKyAgICB6dW1heCB6dW07em1heCB6bTsKKyAgICBpZihtdWx0aXBsZV9jY3MpIGNjcj0mcC0+ejsKKyAgICBpZihudW0+PWN1cl9zaXplKXsKKyAgICAgIGN1cl9zaXplKz02NDsKKyAgICAgIGxhYmVscz1teXJlYWxsb2MobGFiZWxzLGN1cl9zaXplKnNpemVvZigqbGFiZWxzKSk7CisgICAgICB2YWxzPW15cmVhbGxvYyh2YWxzLGN1cl9zaXplKnNpemVvZigqdmFscykpOworICAgIH0KKyAgICBmb3Ioaj0wO2o8bnVtO2orKyl7CisgICAgICBpZighY29tcGFyZV9jb25zdCgmdmFsc1tqXSwmcC0+cTIudmFsLHQpKXsKKyAgICAgICAgcmV0dXJuIDA7IC8qIEZJWE1FPyBDb3VsZCBzaW1wbHkgaWdub3JlPyAqLworICAgICAgfQorICAgIH0KKyAgICB2YWxzW251bV09cC0+cTIudmFsOworICAgIHA9cC0+bmV4dDsKKyAgICB3aGlsZShwJiYocC0+Y29kZT09Tk9QfHxwLT5jb2RlPT1BTExPQ1JFR3x8cC0+Y29kZT09RlJFRVJFRykpIHA9cC0+bmV4dDsKKyAgICBpZihwLT5jb2RlIT1CRVF8fChtdWx0aXBsZV9jY3MmJiFvYmpzX2VxdWFsKGNjciwmcC0+cTEsMCkpKSBicmVhazsKKyAgICBsYWJlbHNbbnVtXT1wLT50eXBmOworICAgIHA9cC0+bmV4dDsKKyAgICB3aGlsZShwJiYocC0+Y29kZT09Tk9QfHxwLT5jb2RlPT1BTExPQ1JFR3x8cC0+Y29kZT09RlJFRVJFRykpIHA9cC0+bmV4dDsKKyAgICBldmFsX2NvbnN0KCZ2YWxzW251bV0sdCk7CisgICAgbnVtKys7CisgICAgaWYodCZVTlNJR05FRCl7CisgICAgICBpZih6dW1sZXEodnVtYXgsbWluLnZ1bWF4KSkKKyAgICAgICAgaW5zZXJ0X2NvbnN0KCZtaW4sVU5TSUdORUR8TUFYSU5UKTsKKyAgICAgIGlmKHp1bWxlcShtYXgudnVtYXgsdnVtYXgpKQorICAgICAgICBpbnNlcnRfY29uc3QoJm1heCxVTlNJR05FRHxNQVhJTlQpOworICAgICAgY3VyX2RlbnNpdHk9bnVtLygxK3psZDJkKHp1bTJ6bGQoenVtc3ViKG1heC52dW1heCxtaW4udnVtYXgpKSkpOworICAgICAgaWYoY3VyX2RlbnNpdHk+PW1pbl9kZW5zaXR5KXsKKyAgICAgICAgY3QubnVtPW51bTsKKyAgICAgICAgY3QubmV4dF9pYz1wOworICAgICAgICBjdC5taW49bWluOworICAgICAgICBjdC5tYXg9bWF4OworICAgICAgICBjdC5kaWZmPXp1bXN1YihtYXgudnVtYXgsbWluLnZ1bWF4KTsKKyAgICAgICAgY3QuZGVuc2l0eT1jdXJfZGVuc2l0eTsKKyAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgIGlmKHptbGVxKHZtYXgsbWluLnZtYXgpKQorICAgICAgICBpbnNlcnRfY29uc3QoJm1pbixNQVhJTlQpOworICAgICAgaWYoem1sZXEobWF4LnZtYXgsdm1heCkpCisgICAgICAgIGluc2VydF9jb25zdCgmbWF4LE1BWElOVCk7CisgICAgICBjdXJfZGVuc2l0eT1udW0vemxkMmQoenVtMnpsZCgoMSt6dW1zdWIoem0yenVtKG1heC52bWF4KSx6bTJ6dW0obWluLnZtYXgpKSkpKTsKKyAgICAgIGlmKGN1cl9kZW5zaXR5Pj1taW5fZGVuc2l0eSl7CisgICAgICAgIGN0Lm51bT1udW07CisgICAgICAgIGN0Lm5leHRfaWM9cDsKKyAgICAgICAgY3QubWluPW1pbjsKKyAgICAgICAgY3QubWF4PW1heDsKKyAgICAgICAgY3QuZGlmZj16dW1zdWIoem0yenVtKG1heC52bWF4KSx6bTJ6dW0obWluLnZtYXgpKTsKKyAgICAgICAgY3QuZGVuc2l0eT1jdXJfZGVuc2l0eTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgY3QudmFscz12YWxzOworICBjdC5sYWJlbHM9bGFiZWxzOworICBjdC50eXBmPXQ7CisgIHJldHVybiAmY3Q7Cit9CisKKy8qIGVtaXQgYSBsaXN0IG9mIGp1bXAtdGFibGUgZW50cmllcyAqLwordm9pZCBlbWl0X2p1bXBfdGFibGUoRklMRSAqZixjYXNlX3RhYmxlICpjdCxjaGFyICpkYSxjaGFyICpsYWJwcmVmaXgsaW50IGRlZmwpCit7CisgIHVuc2lnbmVkIGxvbmcgbCxlOworICBpbnQgaTsKKyAgem1heCB6bTt6dW1heCB6dW07CisgIGlmKGN0LT50eXBmJlVOU0lHTkVEKXsKKyAgICB6dW09Y3QtPm1pbi52dW1heDsKKyAgICB6bT16dW0yem0oenVtKTsKKyAgfWVsc2V7CisgICAgem09Y3QtPm1pbi52bWF4OworICAgIHp1bT16bTJ6dW0oem0pOworICB9CisgIGU9enVtMnVsKGN0LT5kaWZmKTsKKyAgZm9yKGw9MDtsPD1lO2wrKyl7CisgICAgZW1pdChmLCIlcyIsZGEpOworICAgIGZvcihpPTA7aTxjdC0+bnVtO2krKyl7CisgICAgICBldmFsX2NvbnN0KCZjdC0+dmFsc1tpXSxjdC0+dHlwZik7CisgICAgICBpZih6bWVxdG8odm1heCx6bSkmJnp1bWVxdG8odnVtYXgsenVtKSl7CisgICAgICAgIGVtaXQoZiwiJXMlZFxuIixsYWJwcmVmaXgsY3QtPmxhYmVsc1tpXSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZihpPj1jdC0+bnVtKQorICAgICAgZW1pdChmLCIlcyVkXG4iLGxhYnByZWZpeCxkZWZsKTsKKyAgICB6bT16bWFkZCh6bSxsMnptKDFMKSk7CisgICAgenVtPXp1bWFkZCh6dW0sdWwyenVtKDFVTCkpOworICB9Cit9CisvKiBkaXNwbGF5IHdhcm5pbmdzIGlmIHNwZWNpZmllZCBzdGFjay1zaXplIGNhbm5vdCBiZSBndWFyYW50ZWVkICovCit2b2lkIHN0YXRpY19zdGFja19jaGVjayhWYXIgKnYpCit7CisgIC8qRklYTUUqLworfQorCisjaWZkZWYgSEFWRV9SRUdQQVJNUworLyogcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IHZhcmlhYmxlLWFyZ3VtZW50LW1hY3JvIHRvIHRoZQorICAgYmVnaW5uaW5nIG9mIHRoZSBhcmd1bWVudC1hcmVhIChpLmUuIHRoZSBzcGFjZSBvY2N1cGllZCBieQorICAgbm9ybWFsIGFyZ3VtZW50cyBvbiB0aGUgc3RhY2sgKi8KK3ptYXggdmFfb2Zmc2V0KFZhciAqdikKK3sKKyAgaW50IGk7CisgIHptYXggb2Zmc2V0PWwyem0oMEwpOworICBzdGF0aWMgdHlwZSBycD17MH07CisgIHRyZWdfaGFuZGxlIHJoPWVtcHR5X3JlZ19oYW5kbGU7CisgIGlmKCh2LT52dHlwLT5uZXh0LT5mbGFncyZOUSkhPVZPSUQmJiFmcmV0dXJuKHYtPnZ0eXAtPm5leHQpKXsKKyAgICBycC5uZXh0PXYtPnZ0eXAtPm5leHQ7CisgICAgcnAuZmxhZ3M9UE9JTlRFUl9UWVBFKHYtPnZ0eXAtPm5leHQpOworICAgIGlmKCFyZWdfcGFybSgmcmgsJnJwLDAsdi0+dnR5cCkpeworICAgICAgaWVycm9yKDApOworICAgIH0KKyAgfQorICBmb3IoaT0wO2k8di0+dnR5cC0+ZXhhY3QtPmNvdW50O2krKyl7CisjaWYgMAorICAgIGlmKCgqdi0+dnR5cC0+ZXhhY3QtPnNsKVtpXS5yZWchPTApCisgICAgICBjb250aW51ZTsKKyNlbmRpZgorICAgIGlmKCgoKnYtPnZ0eXAtPmV4YWN0LT5zbClbaV0uc3R5cC0+ZmxhZ3MmTlEpPT1WT0lEKQorICAgICAgaWVycm9yKDApOworICAgIGlmKHJlZ19wYXJtKCZyaCwoKnYtPnZ0eXAtPmV4YWN0LT5zbClbaV0uc3R5cCwwLHYtPnZ0eXApIT0wKQorICAgICAgY29udGludWU7CisgICAgb2Zmc2V0PXptYWRkKG9mZnNldCxzem9mKCgqdi0+dnR5cC0+ZXhhY3QtPnNsKVtpXS5zdHlwKSk7CisgICAgb2Zmc2V0PXptbXVsdCh6bWRpdih6bWFkZChvZmZzZXQsem1zdWIoc3RhY2thbGlnbixsMnptKDFMKSkpLHN0YWNrYWxpZ24pLHN0YWNrYWxpZ24pOyAKKyAgfQorICByZXR1cm4gb2Zmc2V0OworfQorI2VuZGlmCisKKy8qIFdlIHByb3ZpZGUgYW4gb3duIHFzb3J0IHRvIGdldCByZXByb2R1Y2FibGUgcmVzdWx0cy4gKi8KK3ZvaWQgdnFzb3J0ICh2b2lkICpiYXNlLHNpemVfdCBubWVtYixzaXplX3Qgc2l6ZSxpbnQgKCpjb21wYXIpKGNvbnN0IHZvaWQgKixjb25zdCB2b2lkICopKQoreyBjaGFyICpiYXNlMj0oY2hhciAqKWJhc2U7CisgIGNoYXIgdG1wOworICBzaXplX3QgaSxhLGIsYzsKKyAgd2hpbGUobm1lbWI+MSkKKyAgeyBhPTA7CisgICAgYj1ubWVtYi0xOworICAgIGM9KGErYikvMjsgLyogTWlkZGxlIGVsZW1lbnQgKi8KKyAgICBmb3IoOzspCisgICAgeyB3aGlsZSgoKmNvbXBhcikoJmJhc2UyW3NpemUqY10sJmJhc2UyW3NpemUqYV0pPjApCisgICAgICAgIGErKzsgLyogTG9vayBmb3Igb25lID49IG1pZGRsZSAqLworICAgICAgd2hpbGUoKCpjb21wYXIpKCZiYXNlMltzaXplKmNdLCZiYXNlMltzaXplKmJdKTwwKQorICAgICAgICBiLS07IC8qIExvb2sgZm9yIG9uZSA8PSBtaWRkbGUgKi8KKyAgICAgIGlmKGE+PWIpCisgICAgICAgIGJyZWFrOyAvKiBXZSBmb3VuZCBubyBwYWlyICovCisgICAgICBmb3IoaT0wO2k8c2l6ZTtpKyspIC8qIHN3YXAgdGhlbSAqLworICAgICAgeyB0bXA9YmFzZTJbc2l6ZSphK2ldOworICAgICAgICBiYXNlMltzaXplKmEraV09YmFzZTJbc2l6ZSpiK2ldOworICAgICAgICBiYXNlMltzaXplKmIraV09dG1wOyB9CisgICAgICBpZihjPT1hKSAvKiBLZWVwIHRyYWNrIG9mIG1pZGRsZSBlbGVtZW50ICovCisgICAgICAgIGM9YjsKKyAgICAgIGVsc2UgaWYoYz09YikKKyAgICAgICAgYz1hOworICAgICAgYSsrOyAvKiBUaGVzZSB0d28gYXJlIGFscmVhZHkgc29ydGVkICovCisgICAgICBiLS07CisgICAgfSAvKiBhIHBvaW50cyB0byBmaXJzdCBlbGVtZW50IG9mIHJpZ2h0IGludGVydmFsbCBub3cgKGIgdG8gbGFzdCBvZiBsZWZ0KSAqLworICAgIGIrKzsKKyAgICBpZihiPG5tZW1iLWIpIC8qIGRvIHJlY3Vyc2lvbiBvbiBzbWFsbGVyIGludGVydmFsbCBhbmQgaXRlcmF0aW9uIG9uIGxhcmdlciBvbmUgKi8KKyAgICB7IHZxc29ydChiYXNlMixiLHNpemUsY29tcGFyKTsKKyAgICAgIGJhc2UyPSZiYXNlMltzaXplKmJdOworICAgICAgbm1lbWI9bm1lbWItYjsKKyAgICB9CisgICAgZWxzZQorICAgIHsgdnFzb3J0KCZiYXNlMltzaXplKmJdLG5tZW1iLWIsc2l6ZSxjb21wYXIpOworICAgICAgbm1lbWI9YjsgfQorICB9CisgIHJldHVybjsKK30KKworLyogY2FsY3VsYXRlcyByZWdpc3RlcnMgdXNlZCBieSB0aGlzIGNhbGwgSUMKKyAgIHJldHVybnMgMCBpZiBub3QgcG9zc2libGUgKi8KK2ludCBjYWxjX3JlZ3MoSUMgKnAsaW50IHNob3d3YXJuaW5ncykKK3sKKyAgaW50IGk7CisgIGlmKHAtPmNhbGxfY250KXsKKyAgICBmb3IoaT0wO2k8cC0+Y2FsbF9jbnQ7aSsrKXsKKyAgICAgIGlmKHAtPmNhbGxfbGlzdFtpXS52LT5maSYmKHAtPmNhbGxfbGlzdFtpXS52LT5maS0+ZmxhZ3MmQUxMX1JFR1MpKXsKKyAgICAgICAgYnZ1bml0ZShyZWdzX21vZGlmaWVkLHAtPmNhbGxfbGlzdFtpXS52LT5maS0+cmVnc19tb2RpZmllZCxSU0laRSk7CisjaWYgSEFWRV9PU0VLCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICAgIH1lbHNleworICAgICAgICBpbnQgcjsKKyAgICAgICAgZm9yKHI9MTtyPD1NQVhSO3IrKykgaWYocmVnc2NyYXRjaFtyXSkgQlNFVChyZWdzX21vZGlmaWVkLHIpOworICAgICAgICBlcnJfaWM9cDsKKyAgICAgICAgaWYoIXAtPmNhbGxfbGlzdFtpXS52LT5maSkgcC0+Y2FsbF9saXN0W2ldLnYtPmZpPW5ld19maSgpOworICAgICAgICBpZighKHAtPmNhbGxfbGlzdFtpXS52LT5maS0+ZmxhZ3MmV0FSTkVEX1JFR1MpKXsKKyAgICAgICAgICBlcnJvcigzMTgscC0+Y2FsbF9saXN0W2ldLnYtPmlkZW50aWZpZXIpOworICAgICAgICAgIHAtPmNhbGxfbGlzdFtpXS52LT5maS0+ZmxhZ3N8PVdBUk5FRF9SRUdTOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorICBlcnJfaWM9cDtpZihzaG93d2FybmluZ3MpIGVycm9yKDMyMCk7CisgIHJldHVybiAwOworfQorCisKKworI2lmbmRlZiBIQVZFX1RBUkdFVF9CRkxBWU9VVAoraW50IGJmbGF5b3V0KGludCBiZm9mZnNldCxpbnQgYmZzaXplLGludCB0KQoreworICBpZihCSUdFTkRJQU4pCisgICAgcmV0dXJuIChpbnQpem0ybCh6bW11bHQoc2l6ZXRhYlt0Jk5RXSxjaGFyX2JpdCkpLWJmb2Zmc2V0LWJmc2l6ZTsKKyAgZWxzZQorICAgIHJldHVybiBiZm9mZnNldDsKK30KKyNlbmRpZgorCitsb25nIGdldF9wb2YyKHp1bWF4IHgpCisvKiAgWWllbGRzIGxvZzIoeCkrMSBvZGVyIDAuICovCit7CisgIHp1bWF4IHA7aW50IGxuPTEsbWF4PShpbnQpem0ybCh6bW11bHQoc2l6ZXRhYltMTE9OR10sY2hhcl9iaXQpKTsKKyAgcD11bDJ6dW0oMUwpOworICB3aGlsZShsbjw9bWF4JiZ6dW1sZXEocCx4KSl7CisgICAgaWYoenVtZXF0byh4LHApKSByZXR1cm4gbG47CisgICAgbG4rKztwPXp1bWFkZChwLHApOworICB9CisgIHJldHVybiAwOworfQorCisvKiBjaGVjayBpZiB0eXBlIGlzIGEgdmFyYXJncyBmdW5jdGlvbiAqLworaW50IGlzX3ZhcmFyZ3ModHlwZSAqdCkKK3sKKyAgaW50IGM7CisgIGlmKHQtPmV4YWN0JiYoYz10LT5leGFjdC0+Y291bnQpIT0wJiYoKnQtPmV4YWN0LT5zbClbYy0xXS5zdHlwLT5mbGFncyE9Vk9JRCkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorCisvKiBhZGQgc3RyaW5nIHRvIHR5cGUtIG9kZXIgdmFyaWFibGUtYWF0cmlidXRlICovCit2b2lkIGFkZF9hdHRyKGNoYXIgKiphdHRyLGNoYXIgKm5ldykKK3sKKyAgaW50IGxuLGxvOworICBpZighbmV3KSByZXR1cm47CisgIGlmKCphdHRyJiZzdHJzdHIoKmF0dHIsbmV3KSkgcmV0dXJuOworICBpZihhZGRfYXR0cl9oYWRkZWNsJiYoISphdHRyfHwhc3Ryc3RyKCphdHRyLG5ldykpKSBlcnJvcigzNzEsYWRkX2F0dHJfaGFkZGVjbC0+aWRlbnRpZmllcixuZXcpOworICBsbj1zdHJsZW4obmV3KTsKKyAgaWYoKmF0dHIpeworICAgIGxvPXN0cmxlbigqYXR0cik7CisgICAgKmF0dHI9bXlyZWFsbG9jKCphdHRyLGxvK2xuKzIpOworICB9ZWxzZXsKKyAgICBsbz0wOworICAgICphdHRyPW15bWFsbG9jKGxuKzIpOworICB9CisgICgqYXR0cilbbG9dPSc7JzsKKyAgc3RyY3B5KCphdHRyK2xvKzEsbmV3KTsKK30KKworCitoYXNodGFibGUgKm5ld19oYXNodGFibGUoc2l6ZV90IHNpemUpCit7CisgIGhhc2h0YWJsZSAqbmV3ID0gbXltYWxsb2Moc2l6ZW9mKCpuZXcpKTsKKworICBuZXctPnNpemUgPSBzaXplOworICBuZXctPmNvbGxpc2lvbnMgPSAwOworICBuZXctPmVudHJpZXMgPSBteW1hbGxvYyhzaXplKnNpemVvZigqbmV3LT5lbnRyaWVzKSk7CisgIG1lbXNldChuZXctPmVudHJpZXMsMCxzaXplKnNpemVvZigqbmV3LT5lbnRyaWVzKSk7CisgIHJldHVybiBuZXc7Cit9CisKK3NpemVfdCBoYXNoY29kZShjaGFyICpuYW1lKQoreworICBzaXplX3QgaCA9IDUzODE7CisgIGludCBjOworCisgIHdoaWxlIChjID0gKHVuc2lnbmVkIGNoYXIpKm5hbWUrKykKKyAgICBoID0gKChoIDw8IDUpICsgaCkgKyBjOworICByZXR1cm4gaDsKK30KKworLyogYWRkIHRvIGhhc2h0YWJsZTsgbmFtZSBtdXN0IGJlIHVuaXF1ZSAqLwordm9pZCBhZGRfaGFzaGVudHJ5KGhhc2h0YWJsZSAqaHQsY2hhciAqbmFtZSxoYXNoZGF0YSBkYXRhKQoreworICBzaXplX3QgaT0oaGFzaGNvZGUobmFtZSklaHQtPnNpemUpOworICBoYXNoZW50cnkgKm5ldz1teW1hbGxvYyhzaXplb2YoKm5ldykpOworICBuZXctPm5hbWU9bmFtZTsKKyAgbmV3LT5kYXRhPWRhdGE7CisgIGlmKERFQlVHJjEpeworICAgIGlmKGh0LT5lbnRyaWVzW2ldKQorICAgICAgaHQtPmNvbGxpc2lvbnMrKzsKKyAgfQorICBuZXctPm5leHQ9aHQtPmVudHJpZXNbaV07CisgIGh0LT5lbnRyaWVzW2ldPW5ldzsKK30KKworLyogZmluZHMgdW5pcXVlIGVudHJ5IGluIGhhc2h0YWJsZSAqLworaGFzaGRhdGEgZmluZF9uYW1lKGhhc2h0YWJsZSAqaHQsY2hhciAqbmFtZSkKK3sKKyAgc2l6ZV90IGk9aGFzaGNvZGUobmFtZSklaHQtPnNpemU7CisgIGhhc2hlbnRyeSAqcDsKKyAgZm9yKHA9aHQtPmVudHJpZXNbaV07cDtwPXAtPm5leHQpeworICAgIGlmKCFzdHJjbXAobmFtZSxwLT5uYW1lKSl7CisgICAgICByZXR1cm4gcC0+ZGF0YTsKKyAgICB9ZWxzZQorICAgICAgaHQtPmNvbGxpc2lvbnMrKzsKKyAgfQorICByZXR1cm4gMDsKK30KKworI2lmbmRlZiBDSEFSQkFDSwordW5zaWduZWQgY2hhciBDSEFSQkFDSyh1bnNpZ25lZCBjaGFyIHgpCit7CisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRhYlsyNTZdLGluaXQ9MDsKKyAgaWYoIWluaXQpeworICAgIGludCBpLGo7CisgICAgZm9yKGk9MDtpPDI1NjtpKyspCisgICAgICBmb3Ioaj0wO2o8MjU2O2orKykKKwlpZih0YWJbal09PTAmJkNIQVJDT05WKGkpPT1qKXsKKwkgIHRhYltqJjI1NV09aTsKKwkgIGJyZWFrOworCX0KKyAgICBpbml0PTE7CisgIH0KKyAgcmV0dXJuIHRhYlt4JjI1NV07Cit9CisKK3ZvaWQgU1RSQkFDSyh1bnNpZ25lZCBjaGFyICpwKQoreworICB3aGlsZShwJiYqcCl7CisgICAgKnA9Q0hBUkJBQ0soKnApOworICAgIHArKzsKKyAgfQorfQorI2VuZGlmCisKK2ludCBvYmpzX2VxdWFsKG9iaiAqbzEsb2JqICpvMixpbnQgdCkKKy8qICBWZXJnbGVpY2h0IGRpZSBiZWlkZW4gT2JqZWt0ZTsgbGllZmVydCAxLCB3ZW5uIHNpZSBnbGVpY2ggc2luZCwgc29uc3QgMCAqLworeworICAgIGludCBpMSxpMjsKKyAgICBpMT1vMS0+ZmxhZ3MmflNDUkFUQ0g7aTI9bzItPmZsYWdzJn5TQ1JBVENIOworICAgIGlmKGkxIT1pMikgcmV0dXJuIDA7CisgICAgaWYoaTEmRFJFRk9CSil7CisgICAgICBpZihvMS0+ZHR5cCE9bzItPmR0eXApIHJldHVybiAwOworICAgIH0KKyAgICBpZihpMSZLT05TVCkgcmV0dXJuKCFjb21wYXJlX2NvbnN0KCZvMS0+dmFsLCZvMi0+dmFsLHQpKTsKKyAgICBpZihpMSZWQVIpeworICAgICAgaWYobzEtPnYhPW8yLT52KSByZXR1cm4gMDsKKyAgICAgIGlmKCF6bWVxdG8obzEtPnZhbC52bWF4LG8yLT52YWwudm1heCkpIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworCisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9zdXBwLmggYi9zdXBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMxM2ZjZQotLS0gL2Rldi9udWxsCisrKyBiL3N1cHAuaApAQCAtMCwwICsxLDg4MCBAQAorLyogICRWRVI6IHZiY2MgKHN1cHAuaCkgJFJldmlzaW9uOiAxLjU4ICQgICAgICovCisKKworI2lmbmRlZiBTVVBQX0gKKyNkZWZpbmUgU1VQUF9IIDEKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisvKiB0eXBlbmFtZXMgKi8KKyNkZWZpbmUgQ0hBUiAxCisjZGVmaW5lIFNIT1JUIDIKKyNkZWZpbmUgSU5UIDMKKyNkZWZpbmUgTE9ORyA0CisjZGVmaW5lIExMT05HIDUKKyNkZWZpbmUgRkxPQVQgNgorI2RlZmluZSBET1VCTEUgNworI2RlZmluZSBMRE9VQkxFIDgKKyNkZWZpbmUgVk9JRCA5CisjZGVmaW5lIFBPSU5URVIgMTAKKyNkZWZpbmUgQVJSQVkgMTEKKyNkZWZpbmUgU1RSVUNUIDEyCisjZGVmaW5lIFVOSU9OIDEzCisjZGVmaW5lIEVOVU0gMTQKKyNkZWZpbmUgRlVOS1QgMTUKKyNkZWZpbmUgQk9PTCAxNgorI2RlZmluZSBNQVhJTlQgMTcgLyogc2hvdWxkIG5vdCBiZSBhY2Nlc3NpYmxlIHRvIGFwcGxpY2F0aW9uICovCisjZGVmaW5lIE1BWF9UWVBFIE1BWElOVAorI2RlZmluZSBNQVhWRUNESU0gMTYKKyNkZWZpbmUgVkVDQk9PTCAoTUFYSU5UKzEpCisjZGVmaW5lIFZFQ0NIQVIgKFZFQ0JPT0wrTUFYVkVDRElNKQorI2RlZmluZSBWRUNTSE9SVCAoVkVDQ0hBUitNQVhWRUNESU0pCisjZGVmaW5lIFZFQ0lOVCAoVkVDU0hPUlQrTUFYVkVDRElNKQorI2RlZmluZSBWRUNMT05HIChWRUNJTlQrTUFYVkVDRElNKQorI2RlZmluZSBWRUNGTE9BVCAoVkVDTE9ORytNQVhWRUNESU0pCisjZGVmaW5lIFZFQ0xBU1QgKFZFQ0ZMT0FUK01BWFZFQ0RJTSkKKyNkZWZpbmUgTlEgMjU1ICAgLyogZiZOUSBnaXZlcyB0eXBlIHdpdGhvdXQgYW55IHF1YWxpZmllcnMgKi8KKyNkZWZpbmUgTlUgNTExICAgLyogZiZOVSBnaXZlcyB0eXBlIHdpdGhvdXQgYW55IHF1YWxpZmllcnMgYnV0IFVOU0lHTkVEICovCisjZGVmaW5lIHExdHlwKHApICgocC0+Y29kZT09QURESTJQfHxwLT5jb2RlPT1TVUJJRlB8fHAtPmNvZGU9PUNPTlZFUlR8fHAtPmNvZGU9PVNVQlBGUCk/cC0+dHlwZjI6cC0+dHlwZikKKyNkZWZpbmUgcTJ0eXAocCkgKChwLT5jb2RlPT1TVUJQRlB8fHAtPmNvZGU9PUxTSElGVHx8cC0+Y29kZT09UlNISUZUKT9wLT50eXBmMjpwLT50eXBmKQorI2RlZmluZSB6dHlwKHApICgocC0+Y29kZT09QURESTJQfHxwLT5jb2RlPT1TVUJJRlB8fHAtPmNvZGU9PUFERFJFU1MpP3AtPnR5cGYyOnAtPnR5cGYpCisjZGVmaW5lIGljbGFiZWwocCkgKHAtPnR5cGYpCisjZGVmaW5lIG9wc2l6ZShwKSAocC0+cTIudmFsLnZtYXgpCisjZGVmaW5lIHB1c2hzaXplKHApIChwLT56LnZhbC52bWF4KQorI2RlZmluZSBwdXNoZWRhcmdzaXplKHApIChwLT5xMi52YWwudm1heCkKKyNkZWZpbmUgaXNzdGF0aWMoeCkgKCh4KT09U1RBVElDKQorI2RlZmluZSBpc2V4dGVybih4KSAoKHgpPT1FWFRFUk4pCisjZGVmaW5lIGlzYXV0byh4KSAgICgoeCk9PUFVVE98fCh4KT09UkVHSVNURVIpCisvKiBvcGVyYXRpb25zIG9uIGJpdC12ZWN0b3JzICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBidnR5cGU7CisjZGVmaW5lIEJWQklUUyAoc2l6ZW9mKGJ2dHlwZSkqQ0hBUl9CSVQpCisjZGVmaW5lIEJWU0laRSh4KSAoKCgoeCkrQlZCSVRTLTEpL0JWQklUUykqc2l6ZW9mKGJ2dHlwZSkpCisjZGVmaW5lIEJTRVQoYXJyYXksYml0KSAoYXJyYXkpWyhiaXQpL0JWQklUU118PTE8PCgoYml0KSVCVkJJVFMpCisjZGVmaW5lIEJDTFIoYXJyYXksYml0KSAoYXJyYXkpWyhiaXQpL0JWQklUU10mPX4oMTw8KChiaXQpJUJWQklUUykpCisjZGVmaW5lIEJUU1QoYXJyYXksYml0KSAoKGFycmF5KVsoYml0KS9CVkJJVFNdJigxPDwoKGJpdCklQlZCSVRTKSkpCisvKiB0eXBlLXF1YWxpZmllcnMgKi8KKyNkZWZpbmUgVU5TSUdORUQgKE5RKzEpCisjZGVmaW5lIENPTlNUIChVTlNJR05FRDw8MSkKKyNkZWZpbmUgVk9MQVRJTEUgKENPTlNUPDwxKQorI2RlZmluZSBSRVNUUklDVCAoVk9MQVRJTEU8PDEpCisjZGVmaW5lIFVOQ09NUExFVEUgKFJFU1RSSUNUPDwxKQorI2RlZmluZSBTVFJJTkdDT05TVCAoVU5DT01QTEVURTw8MSkKKyNkZWZpbmUgQk9PTEVBTiAoU1RSSU5HQ09OU1Q8PDEpCisjZGVmaW5lIFNJR05FRF9DSEFSQUNURVIgKEJPT0xFQU48PDEpCisjZGVmaW5lIFBWT0xBVElMRSAoU0lHTkVEX0NIQVJBQ1RFUjw8MSkKKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorI2RlZmluZSB0X21pbih4KSAoKCh4KSZVTlNJR05FRCk/bDJ6bSgwTCk6dF9taW5bKHgpJk5RXSkKKyNkZWZpbmUgdF9tYXgoeCkgKCgoeCkmVU5TSUdORUQpP3R1X21heFsoeCkmTlFdOnRfbWF4Wyh4KSZOUV0pCisvKiAgbWFjcm8gZm9yIGludGVybmFsIGVycm9ycyAqLworI2RlZmluZSBpZXJyb3IoYSkgZXJyb3IoLTEsKGEpLF9fTElORV9fLEZJTEVfKQorLyogbWFjcm9zIGZvciB0YXJnZXQgZXJyb3JzICovCisjZGVmaW5lIHR3YXJuaW5nKHgpIGVycm9yKDMyMyx4KTsKKyNkZWZpbmUgdGVycm9yKHgpIGVycm9yKDMyNCx4KTsKKy8qIHRoaXMgaGVhZGVyIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb2RlIGdlbmVyYXRvciAqLworI2luY2x1ZGUgIm1hY2hpbmUuaCIKKyNkZWZpbmUgWjAgbDJ6bSgwTCkKKyNkZWZpbmUgWjEgbDJ6bSgxTCkKKyNkZWZpbmUgWlUwIHVsMnp1bSgwVUwpCisjZGVmaW5lIFpVMSB1bDJ6dW0oMVVMKQorCisjaWZuZGVmIEhBVkVfRVhUX1RZUEVTCit0eXBlZGVmIHpsbG9uZyB6bWF4OwordHlwZWRlZiB6dWxsb25nIHp1bWF4OworI2VuZGlmCisjaWZuZGVmIElTUE9JTlRFUgorI2RlZmluZSBJU1BPSU5URVIoeCkgKCh4Jk5RKT09UE9JTlRFUikKKyNlbmRpZgorI2lmbmRlZiBJU0lOVAorI2RlZmluZSBJU0lOVCh4KSAoKHgmTlEpPj1DSEFSJiYoeCZOUSk8PUxMT05HKQorI2VuZGlmCisjaWZuZGVmIElTRkxPQVQKKyNkZWZpbmUgSVNGTE9BVCh4KSAoKHgmTlEpPj1GTE9BVCYmKHgmTlEpPD1MRE9VQkxFKQorI2VuZGlmCisjaWZuZGVmIElTRlVOQworI2RlZmluZSBJU0ZVTkMoeCkgKCh4Jk5RKT09RlVOS1QpCisjZW5kaWYKKyNpZm5kZWYgSVNTVFJVQ1QKKyNkZWZpbmUgSVNTVFJVQ1QoeCkgKCh4Jk5RKT09U1RSVUNUKQorI2VuZGlmCisjaWZuZGVmIElTVU5JT04KKyNkZWZpbmUgSVNVTklPTih4KSAoKHgmTlEpPT1VTklPTikKKyNlbmRpZgorI2lmbmRlZiBJU0FSUkFZCisjZGVmaW5lIElTQVJSQVkoeCkgKCh4Jk5RKT09QVJSQVkpCisjZW5kaWYKKyNpZm5kZWYgSVNWRUNUT1IKKyNkZWZpbmUgSVNWRUNUT1IoeCkgKCh4Jk5RKT49VkVDQk9PTCYmKHgmTlEpPD1WRUNMQVNUKQorI2VuZGlmCisjaWZuZGVmIFZFQ0RJTQorI2RlZmluZSBWRUNESU0oeCkgKCgoKHgmTlEpLVZFQ0JPT0wpJjE1KSsxKQorI2VuZGlmCisjaWZuZGVmIElTU0NBTEFSCisjZGVmaW5lIElTU0NBTEFSKHgpICgoeCZOUSk+PUNIQVImJih4Jk5RKTw9UE9JTlRFUikKKyNlbmRpZgorI2lmbmRlZiBJU0FSSVRICisjZGVmaW5lIElTQVJJVEgoeCkgKElTSU5UKHgpfHxJU0ZMT0FUKHgpKQorI2VuZGlmCisjaWZuZGVmIFBPSU5URVJfVFlQRQorI2RlZmluZSBQT0lOVEVSX1RZUEUoeCkgUE9JTlRFUgorI2VuZGlmCisjaWZuZGVmIE1BWElOVAorI2RlZmluZSBNQVhJTlQgTExPTkcKKyNlbmRpZgorI2lmbmRlZiBIQVZFX0lOVF9TSVpFVAorI2RlZmluZSBIQVZFX0lOVF9TSVpFVCAwCisjZW5kaWYKKyNpZm5kZWYgUFRSRElGRl9UCisjZGVmaW5lIFBUUkRJRkZfVCh4KSBJTlQKKyNlbmRpZgorI2lmbmRlZiBNQVhBRERJMlAKKyNkZWZpbmUgTUFYQURESTJQIExMT05HCisjZW5kaWYKKyNpZm5kZWYgTUlOQUREVUkyUAorI2RlZmluZSBNSU5BRERVSTJQIChNSU5BRERJMlB8VU5TSUdORUQpCisjZW5kaWYKKyNpZm5kZWYgTUFYQUREVUkyUAorI2RlZmluZSBNQVhBRERVSTJQIChNQVhBRERJMlB8VU5TSUdORUQpCisjZW5kaWYKKyNpZm5kZWYgQkVTVENPUFlUCisjZGVmaW5lIEJFU1RDT1BZVCBJTlQKKyNlbmRpZgorI2RlZmluZSBSU0laRSBCVlNJWkUoTUFYUisxKQorI2RlZmluZSBBTExfQ0FMTFMgMQorI2RlZmluZSBBTExfUkVHUyAgMgorI2RlZmluZSBBTExfVVNFUyAgNAorI2RlZmluZSBBTExfTU9EUyAgOAorI2RlZmluZSBBTExfU1RBQ0sgMTYKKyNkZWZpbmUgQUxXQVlTX1JFVFVSTlMgMzIKKyNkZWZpbmUgTkVWRVJfUkVUVVJOUyA2NAorI2RlZmluZSBOT1NJREVGWCAxMjgKKyNkZWZpbmUgV0FSTkVEX1NUQUNLIDI1NgorI2RlZmluZSBXQVJORURfUkVHUyA1MTIKKyNkZWZpbmUgVVNFU19WTEEgMTAyNAorI2RlZmluZSBOT19JTkxJTkUgMjA0OAorI2RlZmluZSBGVUxMX0lOTElORSA0MDk2Cit0eXBlZGVmIHN0cnVjdCByZWdfaGFuZGxlIHRyZWdfaGFuZGxlOwordHlwZWRlZiBzdHJ1Y3QgdHVuaXR7CisgIHN0cnVjdCBWYXIgKnN0YXRpY3M7CisgIHN0cnVjdCB0dW5pdCAqbmV4dDsKK30gdHVuaXQ7CisvKiAgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgZnVuY3Rpb25zOyB1c2VkIGJ5IHRoZSBvcHRpbWl6ZXIgICovCit0eXBlZGVmIHN0cnVjdCBmdW5jdGlvbl9pbmZveworICBzdHJ1Y3QgSUMgKmZpcnN0X2ljOyAgICAvKiBpbmxpbmUgY29weSBvZiBmdW5jdGlvbiBzdGFydHMgaGVyZSAqLworICBzdHJ1Y3QgSUMgKmxhc3RfaWM7ICAgICAvKiAgIiAgICAgICAiICAgICAgICIgICAgICBlbmRzIGhlcmUgICAqLworICBzdHJ1Y3QgSUMgKm9wdF9pYzsgICAgICAvKiBjb2RlIGFmdGVyIG9wdGltaXppbmcgKi8KKyAgc3RydWN0IFZhciAqdmFyczsgICAgICAgLyogcG9pbnRlciB0byBsaXN0IG9mIHZhcnMgb2YgdGhhdCBmdW5jdGlvbiAqLworICBzdHJ1Y3QgVmFyICpzdGF0aWNzOyAgICAvKiBzdGF0aWMgdmFyaWFibGVzIG9mIHRyYW5zbGF0aW9uLXVuaXQgKi8KKyAgY2hhciAqaW5saW5lX2FzbTsgICAgICAgLyogcG9pbnRlciB0byBjb2RlIGZvciBpbmxpbmUgYXNzZW1ibGVyICovCisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7ICAgIC8qIG1pc2MgZmxhZ3MsIHNlZSBhYm92ZSAqLworICAvKiBmdW5jdGlvbnMgY2FsbGVkLCB2YXJpYWJsZXMgdXNlZCBhbmQgY2hhbmdlZCAqLworICBpbnQgY2FsbF9jbnQsdXNlX2NudCxjaGFuZ2VfY250OworICBzdHJ1Y3QgdmFybGlzdCAqY2FsbF9saXN0OworICBzdHJ1Y3QgdmFybGlzdCAqdXNlX2xpc3Q7CisgIHN0cnVjdCB2YXJsaXN0ICpjaGFuZ2VfbGlzdDsKKyAgem1heCBtYXhfb2Zmc2V0OworICAvKiByZWdpc3RlcnMgdXNlZCBhbmQgbW9kaWZpZWQgYnkgdGhhdCBmdW5jdGlvbiAqLworICBidnR5cGUgcmVnc19tb2RpZmllZFtSU0laRS9zaXplb2YoYnZ0eXBlKV07CisjaWYgSEFWRV9PU0VLCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgenVtYXggc3RhY2sxOworICB6dW1heCBzdGFjazI7CisgIGxvbmcgaW5saW5lX3NpemU7ICAvKiBzaXplIGFmdGVyIGlubGluaW5nL29wdGltaXppbmcgZm9yIGNyb3NzLW1vZHVsZSAqLworICBpbnQgaW5saW5lX2RlcHRoOyAgLyogbWluaW11bSBkZXB0aCBmb3IgY3Jvc3MtbW9kdWxlLWlubGluaW5nICovCit9IGZ1bmN0aW9uX2luZm87Cit0eXBlZGVmIGludCB0eXBmbDsKKyNpZiBQVk9MQVRJTEUgPj0gSU5UX01BWAorI2Vycm9yICJuZWVkIGhvc3Qgd2l0aCBsYXJnZXIgaW50IHNpemUiCisjZW5kaWYKKy8qICBzdHJ1Y3QgZm9yIHR5cGVzLiAgICAqLwordHlwZWRlZiBzdHJ1Y3QgVHlweworICB0eXBmbCBmbGFnczsgIC8qICBzZWUgYWJvdmUgICAqLworICBzdHJ1Y3QgVHlwICpuZXh0OworICBzdHJ1Y3Qgc3RydWN0X2RlY2xhcmF0aW9uICpleGFjdDsgICAvKiB1c2VkIGZvciBTVFJVQ1QvVU5JT04vRlVOS1QgICovCisgIHptYXggc2l6ZTsgICAgIC8qICB1c2VkIGZvciBBUlJBWSAgKi8KKyAgc3RydWN0IFZhciAqZHNpemU7IC8qIHVzZWQgZm9yIHZhcmlhYmxlLWxlbmd0aCBhcnJheXMgKi8KKyAgY2hhciAqYXR0cjsKKyAgaW50IHJlZzsKKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorfSB0eXBlOworI2RlZmluZSBUWVBTIHNpemVvZih0eXBlKQorI2lmbmRlZiBIQVZFX0VYVF9UWVBFUwordHlwZWRlZiB1bmlvbiBhdHlwc3sKKyAgemNoYXIgdmNoYXI7CisgIHp1Y2hhciB2dWNoYXI7CisgIHpzaG9ydCB2c2hvcnQ7CisgIHp1c2hvcnQgdnVzaG9ydDsKKyAgemludCB2aW50OworICB6dWludCB2dWludDsKKyAgemxvbmcgdmxvbmc7CisgIHp1bG9uZyB2dWxvbmc7CisgIHpsbG9uZyB2bGxvbmc7CisgIHp1bGxvbmcgdnVsbG9uZzsKKyAgem1heCB2bWF4OworICB6dW1heCB2dW1heDsKKyAgemZsb2F0IHZmbG9hdDsKKyAgemRvdWJsZSB2ZG91YmxlOworICB6bGRvdWJsZSB2bGRvdWJsZTsKK30gYXR5cHM7CisjZW5kaWYKKy8qIFRoaXMgc3RydWN0IHJlcHJlc2VudHMgb2JqZWN0cyBpbiB0aGUgaW50ZXJtZWRpYXRlIGNvZGUuICovCit0eXBlZGVmIHN0cnVjdCBvYmp7CisgIGludCBmbGFnczsgICAgICAvKiBzZWUgYmVsb3cgKi8KKyAgaW50IHJlZzsgICAgICAgIC8qIG51bWJlciBvZiByZWcgaWYgZmxhZ3MmUkVHICovCisgIGludCBkdHlwOyAgICAgICAvKiB0eXBlIG9mIHBvaW50ZXIgZm9yIERSRUZPQkogKi8KKyAgc3RydWN0IFZhciAqdjsKKyAgc3RydWN0IEFkZHJlc3NpbmdNb2RlICphbTsKKyAgdW5pb24gYXR5cHMgdmFsOworfSBvYmo7CisvKiAgQXZhaWxhYmxlIGZsYWdzIGluIHN0cnVjdCBvYmouICAqLworICAgICAgICAgICAgICAgICAgICAvKiAgS09OU1QgbXVzcyBpbW1lciBhbSBrbGVpbnN0ZW4gc2VpbiwgdW0gYmVpbSBTd2FwcGVuICovCisgICAgICAgICAgICAgICAgICAgIC8qICBmdWVyIGF2YWlsYWJsZV9leHByZXNzaW9ucyB1bmQgS29uc3RhbnRlbiBuYWNoICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogIHJlY2h0cyBuaWNodCBpbiBlaW5lIEVuZGxvc3NjaGxlaWZlIHp1IGtvbW1lbi4gICAgICAqLworI2RlZmluZSBLT05TVCAxICAgICAvKiAgVGhlIG9iamVjdCBpcyBhIGNvbnN0YW50LiBJdHMgdmFsdWUgaXMgc3RvcmVkIGluICAgICovCisgICAgICAgICAgICAgICAgICAgIC8qICB2YWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkFSIDIgICAgICAgLyogIFRoZSBvYmplY3QgaXMgYSB2YXJpYWJsZSAoc3RvcmVkIGluIHYpLiAgICAgICAgICAgICAqLworI2RlZmluZSBTQ1JBVENIIDggICAvKiAgVGhlIG9iamVjdCBpcyBhIHRlbXBvcmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNUQUNLIDE2ICAgIC8qICBvYnNvbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRFJFRk9CSiAzMiAgLyogIFRoZSBvYmplY3QgbXVzdCBiZSBkZXJlZmVyZW5jZWQuICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSRUcgNjQgICAgICAvKiAgVGhlIG9iamVjdCBpcyBjb250YWluZWQgaW4gYSBoYXJkd2FyZSByZWdpc3Rlci4gICAgICovCisjZGVmaW5lIFZBUkFEUiAxMjggIC8qICBUaGUgb2JqZWN0IGlzIHRoZSBhZGRyZXNzIG9mIGEgc3RhdGljIHZhcmlhYmxlLiAgICAgKi8KKyNkZWZpbmUgRE9OVFJFR0lTVEVSSVpFIDI1NiAvKiAgRG8gbm90IHB1dCB0aGlzIG9iamVjdCBpbnRvIGEgcmVnaXN0ZXIuICAgICAqLworI2RlZmluZSBWS09OU1QgNTEyICAvKiAgVmFyaWFibGUgY29udGFpbmluZyBhIGNvbnN0YW50IChmb3IgcmVnLWFsbG9jKS4gICAgICovCit0eXBlZGVmIHN0cnVjdCBWYXJ7CisgIGludCBzdG9yYWdlX2NsYXNzOyAgLyogc2VlIGJlbG93ICAgICovCisgIGludCByZWc7ICAgICAgICAgICAgLyogVmFyIGlzIGFzc2lnbmVkIHRvIHRoaXMgaGFyZC1yZWcgKi8KKyAgaW50IHByaW9yaXR5OyAgICAgICAvKiBQcmlvcml0eSB0byBiZSB1c2VkIGluIHNpbXBsZV9yZWdzKCkgKi8KKyAgbG9uZyBmbGFnczsgICAgICAgICAvKiBzZWUgYmVsb3cgKi8KKyAgY2hhciAqaWRlbnRpZmllcjsgICAvKiBuYW1lIG9mIHRoZSB2YXJpYWJsZSAqLworICBpbnQgbmVzdGluZzsgICAgICAgIC8qIGNhbiBiZSBmcmVlbHkgdXNlZCBieSB0aGUgZnJvbnRlbmQgKi8KKyAgaW50IGluZGV4OyAgICAgICAgICAvKiB1c2VkIGJ5IHRoZSBvcHRpbWl6ZXIgKi8KKyAgaW50IGlucjsgICAgICAgICAgICAvKiBjb3VudGVyIGZvciBudW1fdmFycyAqLworICB6bWF4IG9mZnNldDsgICAgICAgIC8qIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgc3RhY2sgZnJhbWUgKi8KKyAgaW50IGxpbmU7ICAgICAgICAgICAvKiBsaW5lIG51bWJlciBvZiBmaXJzdCBkZWNsYXJhdGlvbiAqLworICBjaGFyICpmaWxlbmFtZTsgICAgIC8qIGZpbGVuYW1lIG9mIGZpcnN0IGRlY2xhcmF0aW9uICovCisgIGludCBkbGluZTsgICAgICAgICAgLyogbGluZSBudW1iZXIgb2YgZGVmaW5pdGlvbiAqLworICBjaGFyICpkZmlsZW5hbWU7ICAgIC8qIGZpbGVuYW1lIG9mIGRlZmluaXRpb24gKi8KKyAgdHlwZSAqdnR5cDsgICAvKiB0eXBlIG9mIHRoZSB2YXJpYWJsZSAqLworICBzdHJ1Y3QgY29uc3RfbGlzdCAqY2xpc3Q7ICAgLyogaW5pdGlhbGl6ZWQ/ICovCisgIHN0cnVjdCBWYXIgKm5leHQ7ICAgLyogcG9pbnRlciB0byBuZXh0IHZhcmlhYmxlICovCisgIHN0cnVjdCBmdW5jdGlvbl9pbmZvICpmaTsgICAvKiB1c2VkIGJ5IHRoZSBvcHRpbWl6ZXIgKi8KKyAgc3RydWN0IFZhciAqaW5saW5lX2NvcHk7ICAgIC8qIHVzZWQgZm9yIGZ1bmN0aW9uLWlubGluaW5nICovCisgIHN0cnVjdCB0dW5pdCAqdHVuaXQ7IC8qIHRyYW5zbGF0aW9uIHVuaXQgdGhlIHZhcmlhYmxlIGJlbG9uZ3MgdG8gKi8KKyAgY2hhciAqdmF0dHI7ICAgICAgICAgLyogZXh0ZW5kZWQgdmFyaWFibGUgYXR0cmlidXRlcyAqLworICBjaGFyICpkZXNjcmlwdGlvbjsgICAvKiBkZXNjcmlwdGlvbiBvZiB2YXJpYWJsZSBtZWFuaW5nICovCisgIHN0cnVjdCBvYmogY29iajsgICAgIC8qIHVzZWQgZm9yIHJlZ2lzdGVyLWFsbG9jYXRpb24gb2YgY29uc3RhbnRzICovCisgIGludCBjdHlwOyAgICAgICAgICAgIC8qICAgLS0tLS0tLS0tLS0tLS0tLS0gIiAtLS0tLS0tLS0tLS0tLS0tLSAgICovCisjaWZkZWYgSEFWRV9UQVJHRVRfQVRUUklCVVRFUworICB1bnNpZ25lZCBsb25nIHRhdHRyOyAgICAgICAgLyogdGFyZ2V0LXNwZWNpZmljIGF0dHJpYnV0ZXMgKi8KKyNlbmRpZgorI2lmZGVmIEFMRVhfUkVHCisgIGludCBpUmVnQ29weU5yOworICBpbnQgaVJlZ0NvcHlOckhjMTJWOworI2VuZGlmCit9IFZhcjsKKy8qIGF2YWlsYWJsZSBzdG9yYWdlLWNsYXNzZXMgKi8KKyNkZWZpbmUgQVVUTyAxICAgICAgICAgIC8qIHZhciBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrICovCisjZGVmaW5lIFJFR0lTVEVSIDIgICAgICAvKiBiYXNpY2FsbHkgdGhlIHNhbWUgYXMgQVVUTyAoQy1vbmx5KSAqLworI2RlZmluZSBTVEFUSUMgMyAgICAgICAgLyogdmFyIGlzIHN0YXRpYyBidXQgaGFzIG5vIGV4dGVybmFsIGxpbmthZ2UgKi8KKyNkZWZpbmUgRVhURVJOICA0ICAgICAgIC8qIHZhciBpcyBzdGF0aWMgYW5kIGhhcyBleHRlcm5hbCBsaW5rYWdlICovCisjZGVmaW5lIFRZUEVERUYgNSAgICAgICAvKiBDLW9ubHkgKi8KKy8qIGF2YWlsYWJsZSBmbGFncyBpbiBzdHJ1Y3QgVmFyICovCisjZGVmaW5lIFVTRURBU1NPVVJDRSAxICAgICAgLyogdGhlIHZhciBoYXMgYmVlbiByZWFkICovCisjZGVmaW5lIFVTRURBU0RFU1QgMiAgICAgICAgLyogdGhlIHZhciBoYXMgYmVlbiB3cml0dGVuICovCisjZGVmaW5lIERFRklORUQgNCAgICAgICAgICAgLyogdGhlIHZhciBoYXMgYmVlbiBkZWZpbmVkIChpLmUuIHN0b3JhZ2Ugd2lsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGFsbG9jYXRlZCBpbiB0aGUgY3VycmVudCBmaWxlKSAqLworI2RlZmluZSBVU0VEQVNBRFIgOCAgICAgICAgIC8qIHRoZSBhZGRyZXNzIG9mIHRoZSB2YXIgaGFzIGJlZW4gdGFrZW4gKi8KKyNkZWZpbmUgR0VORVJBVEVEIDE2ICAgICAgICAvKiBjb2RlIGZvciBzdGF0aWMgdmFycyBoYXMgYmVlbiBnZW5lcmF0ZWQgKi8KKyNkZWZpbmUgQ09OVlBBUkFNRVRFUiAzMgorI2RlZmluZSBURU5UQVRJVkUgNjQgICAgICAgIC8qIEMtb25seSAqLworI2RlZmluZSBVU0VEQkVGT1JFIDEyOCAgICAgIC8qIHVzZWQgYnkgdGhlIG9wdGltaXplciAqLworI2RlZmluZSBJTkxJTkVWIDI1NiAgICAgICAgIC8qICAiICAgICAgICAgICAgICAgIiAgICAqLworI2RlZmluZSBQUklOVEZMSUtFIDUxMiAgICAgIC8qIEMtb25seSAqLworI2RlZmluZSBTQ0FORkxJS0UgMTAyNCAgICAgIC8qIEMtb25seSAqLworI2RlZmluZSBOT1RUWVBFU0FGRSAyMDQ4ICAgIC8qIHVzZWQgYnkgdGhlIG9wdGltaXplciAqLworI2RlZmluZSBETk9UVFlQRVNBRkUgNDA5NiAgIC8qICAiICAgICAgICAgICAgICAgIiAgICAqLworI2RlZmluZSBSRUdQQVJNIDgxOTIgICAgICAgIC8qIHRoZSB2YXIgaXMgYSByZWdpc3RlciBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgREJMUFVTSCAxNjM4NCAgICAgICAvKiBwYXJhbWV0ZXIgaXMgYWxzbyBvbiB0aGUgc3RhY2sgKi8KKyNkZWZpbmUgTk9USU5UVSAzMjc2OCAgICAgICAvKiB2YXJpYWJsZSBub3QgKHlldCkgZGVmaW5lZCBpbiB0aGlzIHRyYW5zbGF0aW9uLXVuaXQgKi8KKyNkZWZpbmUgUkVGRVJFTkNFRCA2NTUzNiAgICAvKiB2YXJpYWJsZSByZWZlcmVuY2VkICovCisjZGVmaW5lIFNUQVRJQ0FVVE8gMTMxMDcyICAgLyogYXV0byB2YXJpYWJsZSBjb252ZXJ0ZWQgdG8gc3RhdGljICovCisjZGVmaW5lIElOTElORUZVTkMgKFNUQVRJQ0FVVE8qMikKKyNkZWZpbmUgSU5MSU5FRVhUIChJTkxJTkVGVU5DKjIpCisjZGVmaW5lIEJVSUxUSU4gKElOTElORUVYVCoyKQorI2RlZmluZSBORUVEUyAoQlVJTFRJTioyKQorCisvKiBDLW9ubHkgKi8KK3R5cGVkZWYgc3RydWN0IHN0cnVjdF9saXN0eworICBjaGFyICppZGVudGlmaWVyOyAgIC8qIG5hbWUgb2YgdGhlIHN0cnVjdC91bmlvbi10YWcgKi8KKyAgdHlwZSAqc3R5cDsgICAvKiB0eXBlIG9mIHRoZSBtZW1iZXIvcGFyYW1ldGVyICovCisgIHptYXggYWxpZ247ICAgICAgICAgLyogYWxpZ25tZW50IG9mIHN0cnVjdC1tZW1iZXIgKi8KKyAgaW50IGJmb2Zmc2V0OyAgICAgICAvKiBiaXRmaWVsZC1vZmZzZXQgKi8KKyAgaW50IGJmc2l6ZTsgICAgICAgICAvKiBiaXRmaWVsZC1zaXplICovCisgIGludCBzdG9yYWdlX2NsYXNzOyAgLyogc3RvcmFnZS1jbGFzcyBvZiBmdW5jdGlvbi1wYXJhbWV0ZXIgKi8KKyAgaW50IHJlZzsgICAgICAgICAgICAvKiByZWdpc3RlciB0byBwYXNzIGZ1bmN0aW9uLXBhcmFtZXRlciAqLworI2lmZGVmIEhBVkVfRUNQUAorLyogcmVtb3ZlZCAqLworI2VuZGlmCit9IHN0cnVjdF9saXN0OworCisjZGVmaW5lIFNMU0laRSAzMiAgIC8qIHJlYWxsb2Mgc3RydWN0X2xpc3RzIGluIHRob3NlIHN0ZXBzICovCisvKiAgVGhlc2Ugc3RydWN0cyBhcmUgdXNlZCB0byBkZXNjcmliZSBtZW1iZXJzIG9mIFNUUlVDVC9VTklPTiBvciAgICovCisvKiAgcGFyYW1ldGVycyBvZiBGVU5LVC4gU29tZSBvZiB0aGUgZW50cmllcyBpbiBzdHJ1Y3RfbGlzdCBhcmUgbm90ICovCisvKiAgcmVsZXZhbnQgZm9yIGJvdGggYWx0ZXJuYXRpdmVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit0eXBlZGVmIHN0cnVjdCBzdHJ1Y3RfZGVjbGFyYXRpb257CisgIGludCBjb3VudDsgIC8qIG51bWJlciBvZiBtZW1iZXJzL3BhcmFtZXRlcnMgKi8KKyAgaW50IGxhYmVsOyAvKiB1c2VkIGZvciBkZWJ1ZyBvdXRwdXQgKi8KKyAgaW50IHR5cDsKKyAgc3RydWN0IHR1bml0ICp0dW5pdDsKKyAgc3RydWN0IHN0cnVjdF9kZWNsYXJhdGlvbiAqbmV4dDsKKyAgc3RydWN0IHN0cnVjdF9saXN0ICgqc2wpW107CisgIGNoYXIgKmlkZW50aWZpZXI7CisjaWZkZWYgSEFWRV9FQ1BQCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKK30gc3RydWN0X2RlY2xhcmF0aW9uOworCisvKiAgVGhlIHF1YWRzIGluIHRoZSBpbnRlcm1lZGlhdGUgY29kZS4gKi8KK3R5cGVkZWYgc3RydWN0IElDeworICBzdHJ1Y3QgSUMgKnByZXY7ICAgIC8qIHBvaW50ZXIgdG8gdGhlIG5leHQgSUMgKi8KKyAgc3RydWN0IElDICpuZXh0OyAgICAvKiBwb2ludGVyIHRvIHRoZSBwcmV2aW91cyBJQyAqLworICBpbnQgY29kZTsgICAgICAgICAgIC8qIHNlZSBiZWxvdyAqLworICBpbnQgdHlwZjsgICAgICAgICAgIC8qIHVzdWFsbHkgdHlwZSBvZiB0aGUgb3BlcmFuZHMsIHNlZSBpbnRlcmZhY2UuZG9jICovCisgIGludCB0eXBmMjsgICAgICAgICAgLyogdXNlZCBmb3IgQ09OVkVSVCxBRERJMlAsU1VCSUZQLFNVQlBGUCAqLworICBpbnQgZGVmaW5kZXg7ICAgICAgIC8qIHVzZWQgYnkgb3B0aW1pemVyICovCisgIGludCBleHBpbmRleDsKKyAgaW50IGNvcHlpbmRleDsKKyAgaW50IGNoYW5nZV9jbnQ7CisgIGludCB1c2VfY250OworICBpbnQgY2FsbF9jbnQ7CisgIGludCBsaW5lOyAgICAgICAgICAgLyogY29ycmVzcG9uZGluZyBsaW5lIGluIHNvdXJjZSBmaWxlIChvciAwKSAqLworICBzdHJ1Y3QgdmFybGlzdCAqY2hhbmdlX2xpc3Q7ICAgIC8qIHVzZWQgYnkgb3B0aW1pemVyICovCisgIHN0cnVjdCB2YXJsaXN0ICp1c2VfbGlzdDsKKyAgc3RydWN0IHZhcmxpc3QgKmNhbGxfbGlzdDsKKyAgc3RydWN0IG9iaiBxMTsgICAgICAvKiBzb3VyY2UgMSAqLworICBzdHJ1Y3Qgb2JqIHEyOyAgICAgIC8qIHNvdXJjZSAyICovCisgIHN0cnVjdCBvYmogejsgICAgICAgLyogdGFyZ2V0ICovCisgIGNoYXIgKmZpbGU7ICAgICAgICAgLyogZmlsZW5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlICovCisgIGludCBhcmdfY250OworICBzdHJ1Y3QgSUMgKiphcmdfbGlzdDsgLyogcG9pbnRlcnMgdG8gZnVuY3Rpb24gYXJndW1lbnQgSUNzIChvbmx5IGZvciBjb2RlPT1DQUxMKSAqLworICBzdHJ1Y3QgSUMgKmNvcHk7ICAgIC8qIGZvciBjb3B5aW5nL2lubGluaW5nICovCisgIHR5cGUgKml0eXA7CisgIGxvbmcgZmxhZ3M7CisgIHN0cnVjdCBWYXIgKnNhdmVkc3A7IC8qIG9ubHkgZm9yIGJyYW5jaCBpbnN0cnVjdGlvbnMgYW5kIHZsYXMgKi8KKyNpZmRlZiBIQVZFX0VYVF9JQworICBzdHJ1Y3QgZXh0X2ljIGV4dDsKKyNlbmRpZgorI2lmZGVmIEFMRVhfUkVHCisgIGludCBpWldlYkluZGV4OyAvKiB3ZWIgZm9yIHogaW4gY2FzZSB6IGlzIGEgcG9pbnRlciBhbmQgaXRzIHZhbHVlIGlzIGRlZmVkKi8KKyAgaW50IGlRMVdlYkluZGV4OyAvKiB3ZWIgZm9yIGFyZ3VtZW50IHExICovCisgIGludCBpUTJXZWJJbmRleDsgLyogd2ViIGZvciBhcmd1bWVudCBxMiAqLworICB2b2lkICpwRmxvdzsgICAgICAgICAgIC8qIGZsb3dncmFwaCByZXZlcnNlIGxvb2t1cCAqLworI2VuZGlmCit9IElDOworI2RlZmluZSBJQ1Mgc2l6ZW9mKHN0cnVjdCBJQykKKy8qIGZsYWdzIGZvciBJQ3MgKi8KKyNkZWZpbmUgTE9PUF9DT05EX1RSVUUgMSAgLyogbG9vcCBjb25kaXRpb24gaXMgdHJ1ZSBhdCBmaXJzdCBpdGVyYXRpb24gKi8KKyNkZWZpbmUgRUZGX0lDIDIgICAgICAgICAgLyogZG8gbm90IHRyYW5zZm9ybSBJQyB3aXRoIGRvdWJ0ZnVsIG9wdGltaXphdGlvbnMgKi8KKyNkZWZpbmUgT1JERVJFRF9QVVNIX0NPUFkgNCAvKiBtYXJrIGEgY29weSBvZiBhbiBvcmRlcmVkIHB1c2ggKi8KKworLyogIEF2YWlsYWJsZSBjb2RlcyBmb3Igc3RydWN0IElDLiBTZWUgaW50ZXJmYWNlLmRvYy4gKi8KKyNkZWZpbmUgS09NTUEgMQorI2RlZmluZSBBU1NJR04gMgorI2RlZmluZSBBU1NJR05PUCAzCisKKyNpZiAwCisvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBBU1NJR05BREQgMworI2RlZmluZSBBU1NJR05TVUIgNAorI2RlZmluZSBBU1NJR05NVUxUIDUKKyNkZWZpbmUgQVNTSUdORElWIDYKKyNkZWZpbmUgQVNTSUdOTU9EIDcKKyNkZWZpbmUgQVNTSUdOQU5EIDgKKyNkZWZpbmUgQVNTSUdOWE9SIDkKKyNkZWZpbmUgQVNTSUdOT1IgMTAKKyNkZWZpbmUgQVNTSUdOTFNISUZUIDExCisjZGVmaW5lIEFTU0lHTlJTSElGVCAxMgorI2VuZGlmCisKKyNkZWZpbmUgQ09ORCAxMworI2RlZmluZSBMT1IgMTQKKyNkZWZpbmUgTEFORCAxNQorI2RlZmluZSBPUiAxNgorI2RlZmluZSBYT1IgMTcKKyNkZWZpbmUgQU5EIDE4CisjZGVmaW5lIEVRVUFMIDE5CisjZGVmaW5lIElORVFVQUwgMjAKKyNkZWZpbmUgTEVTUyAyMQorI2RlZmluZSBMRVNTRVEgMjIKKyNkZWZpbmUgR1JFQVRFUiAyMworI2RlZmluZSBHUkVBVEVSRVEgMjQKKyNkZWZpbmUgTFNISUZUIDI1CisjZGVmaW5lIFJTSElGVCAyNgorI2RlZmluZSBBREQgMjcKKyNkZWZpbmUgU1VCIDI4CisjZGVmaW5lIE1VTFQgMjkKKyNkZWZpbmUgRElWIDMwCisjZGVmaW5lIE1PRCAzMQorI2RlZmluZSBORUdBVElPTiAzMgorI2RlZmluZSBLT01QTEVNRU5UIDMzCisjZGVmaW5lIFBSRUlOQyAzNAorI2RlZmluZSBQT1NUSU5DIDM1CisjZGVmaW5lIFBSRURFQyAzNgorI2RlZmluZSBQT1NUREVDIDM3CisjZGVmaW5lIE1JTlVTIDM4CisjZGVmaW5lIENPTlRFTlQgMzkKKyNkZWZpbmUgQUREUkVTUyA0MAorI2RlZmluZSBDQVNUIDQxCisjZGVmaW5lIENBTEwgNDIKKyNkZWZpbmUgSU5ERVggNDMKKyNkZWZpbmUgRFBTVFJVQ1QgNDQKKyNkZWZpbmUgRFNUUlVDVCA0NQorI2RlZmluZSBJREVOVElGSUVSIDQ2CisjZGVmaW5lIENFWFBSIDQ3CisjZGVmaW5lIFNUUklORyA0OAorI2RlZmluZSBNRU1CRVIgNDkKKyNkZWZpbmUgQ09OVkVSVCA1MAorI2lmIDAKKyNkZWZpbmUgQ09OVkNIQVIgNTAKKyNkZWZpbmUgQ09OVlNIT1JUIDUxCisjZGVmaW5lIENPTlZJTlQgNTIKKyNkZWZpbmUgQ09OVkxPTkcgNTMKKyNkZWZpbmUgQ09OVkZMT0FUIDU0CisjZGVmaW5lIENPTlZET1VCTEUgNTUKKyNkZWZpbmUgQ09OVlZPSUQgNTYKKyNkZWZpbmUgQ09OVlBPSU5URVIgNTcKKyNkZWZpbmUgQ09OVlVDSEFSIDU4CisjZGVmaW5lIENPTlZVU0hPUlQgNTkKKyNkZWZpbmUgQ09OVlVJTlQgNjAKKyNkZWZpbmUgQ09OVlVMT05HIDYxCisjZW5kaWYKKyNkZWZpbmUgQUREUkVTU0EgNjIKKyNkZWZpbmUgRklSU1RFTEVNRU5UIDYzCisjZGVmaW5lIFBNVUxUIDY0CisjZGVmaW5lIEFMTE9DUkVHIDY1CisjZGVmaW5lIEZSRUVSRUcgNjYKKyNkZWZpbmUgUENFWFBSIDY3CisjZGVmaW5lIFRFU1QgNjgKKyNkZWZpbmUgTEFCRUwgNjkKKyNkZWZpbmUgQkVRIDcwCisjZGVmaW5lIEJORSA3MQorI2RlZmluZSBCTFQgNzIKKyNkZWZpbmUgQkdFIDczCisjZGVmaW5lIEJMRSA3NAorI2RlZmluZSBCR1QgNzUKKyNkZWZpbmUgQlJBIDc2CisjZGVmaW5lIENPTVBBUkUgNzcKKyNkZWZpbmUgUFVTSCA3OAorI2RlZmluZSBQT1AgNzkKKyNkZWZpbmUgQUREUkVTU1MgODAKKyNkZWZpbmUgQURESTJQIDgxCisjZGVmaW5lIFNVQklGUCA4MgorI2RlZmluZSBTVUJQRlAgODMKKyNkZWZpbmUgUFVTSFJFRyA4NAorI2RlZmluZSBQT1BSRUcgODUKKyNkZWZpbmUgUE9QQVJHUyA4NgorI2RlZmluZSBTQVZFUkVHUyA4NworI2RlZmluZSBSRVNUT1JFUkVHUyA4OAorI2RlZmluZSBJTEFCRUwgODkKKyNkZWZpbmUgREMgOTAKKyNkZWZpbmUgQUxJR04gOTEKKyNkZWZpbmUgQ09MT04gOTIKKyNkZWZpbmUgR0VUUkVUVVJOIDkzCisjZGVmaW5lIFNFVFJFVFVSTiA5NAorI2RlZmluZSBNT1ZFRlJPTVJFRyA5NQorI2RlZmluZSBNT1ZFVE9SRUcgOTYKKyNkZWZpbmUgTk9QIDk3CisjZGVmaW5lIEJJVEZJRUxEIDk4CisjZGVmaW5lIExJVEVSQUwgOTkKKyNkZWZpbmUgUkVJTlRFUlBSRVQgMTAwCitleHRlcm4gY2hhciAqdHlwbmFtZVtdOworZXh0ZXJuIHptYXggc2l6ZXRhYltdOworZXh0ZXJuIGNoYXIgKnN0b3JhZ2VfY2xhc3NfbmFtZVtdOworZXh0ZXJuIGNoYXIgKmVuYW1lW107CitleHRlcm4gaW50IGFsaWduX2FyZ3VtZW50czsgLyogYXJndW1lbnRzIGNvcnJlY3RseSBhbGlnbmVkIG9uIHN0YWNrIG9yCisJCQkgICAgICAganVzdCBzdGFja2FsaWduPyAqLworZXh0ZXJuIHptYXggYWxpZ25bXSxtYXhhbGlnbixzdGFja2FsaWduOworLyogIGFuIGVtcHR5IHN0cmluZyAqLworZXh0ZXJuIGNoYXIgKmVtcHR5OworZXh0ZXJuIHpjaGFyIHZjaGFyOyBleHRlcm4genVjaGFyIHZ1Y2hhcjsKK2V4dGVybiB6c2hvcnQgdnNob3J0OyBleHRlcm4genVzaG9ydCB2dXNob3J0OworZXh0ZXJuIHppbnQgdmludDsgZXh0ZXJuIHp1aW50IHZ1aW50OworZXh0ZXJuIHpsb25nIHZsb25nOyBleHRlcm4genVsb25nIHZ1bG9uZzsKK2V4dGVybiB6bGxvbmcgdmxsb25nOyBleHRlcm4genVsbG9uZyB2dWxsb25nOworZXh0ZXJuIHptYXggdm1heDsgZXh0ZXJuIHp1bWF4IHZ1bWF4OworZXh0ZXJuIHpmbG9hdCB2ZmxvYXQ7IGV4dGVybiB6ZG91YmxlIHZkb3VibGU7CitleHRlcm4gemxkb3VibGUgdmxkb3VibGU7CitleHRlcm4gdW5pb24gYXR5cHMgZ3ZhbDsKKyNpZm5kZWYgREVCVUcKK2V4dGVybiBpbnQgREVCVUc7CisjZW5kaWYKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKy8qICB1c2VkIGJ5IHRoZSBvcHRpbWl6ZXIgKi8KKy8qIGZvciBsaXN0cyBpbiBJQ3MgZmxhZ3MgbWF5IGJlIERSRUZPQkogdG8gbWFyayBkZXJlZmVyZW5jZXMgKi8KKy8qIGZvciBsaXN0cyBpbiBmdW5jdGlvbiBpbmZvcyBmbGFncyBpcyB0aGUgdHlwZSBvZiBhY2Nlc3MgKi8KK3R5cGVkZWYgc3RydWN0IHZhcmxpc3R7CisgIHN0cnVjdCBWYXIgKnY7CisgIGludCBmbGFnczsKK30gdmFybGlzdDsKKyNkZWZpbmUgVkxTIHNpemVvZihzdHJ1Y3QgdmFybGlzdCkKK2V4dGVybiBzdHJ1Y3QgSUMgKmZpcnN0X2ljLCpsYXN0X2ljOworI2RlZmluZSBSRUdTQV9ORVZFUiAxCisjZGVmaW5lIFJFR1NBX1RFTVBTIDIKK2V4dGVybiBpbnQgcmVnc1tNQVhSKzFdLHJlZ3NhW01BWFIrMV0scmVndXNlZFtNQVhSKzFdLHNpbXBsZV9zY3JhdGNoW01BWFIrMV07CitleHRlcm4gaW50IHNyZWdzYVtNQVhSKzFdOworZXh0ZXJuIGludCByZWdfcHJpb1tNQVhSKzFdLHJlZ3NjcmF0Y2hbTUFYUisxXTsKK2V4dGVybiB6bWF4IHJlZ3NpemVbTUFYUisxXTsKK2V4dGVybiB0eXBlICpyZWd0eXBlW01BWFIrMV07CitleHRlcm4gc3RydWN0IFZhciAqcmVnc3ZbTUFYUisxXTsKK2V4dGVybiBjaGFyICpyZWduYW1lc1tdOworZXh0ZXJuIGJ2dHlwZSByZWdzX21vZGlmaWVkW1JTSVpFL3NpemVvZihidnR5cGUpXTsKK2V4dGVybiBpbnQgb3B0c3BlZWQsb3B0c2l6ZSx1bnJvbGxfYWxsLHN0YWNrX2NoZWNrOworZXh0ZXJuIGludCBjcm9zc19tb2R1bGUsZmluYWwsbm9fZW1pdDsKK2V4dGVybiBpbnQgZGVidWdfaW5mbzsKK2V4dGVybiBpbnQgbGFiZWwscmV0dXJuX2xhYmVsOworLyogVGhlIHN0cnVjdHVyZXMgdXNlZCBmb3IgYXZhaWxhYmxlIG9wdGlvbnMgb2YgdGhlIGNvZGUgZ2VuZXJhdG9yLiAqLwordW5pb24gcHBpIHtjaGFyICpwO2xvbmcgbDt2b2lkICgqZikoY2hhciAqKTt9OworI2RlZmluZSBVU0VERkxBRyAxCisjZGVmaW5lIFNUUklOR0ZMQUcgMgorI2RlZmluZSBWQUxGTEFHIDQKKyNkZWZpbmUgRlVOQ0ZMQUcgOAorZXh0ZXJuIGludCBnX2ZsYWdzW01BWEdGXTsKK2V4dGVybiBjaGFyICpnX2ZsYWdzX25hbWVbTUFYR0ZdOworZXh0ZXJuIHVuaW9uIHBwaSBnX2ZsYWdzX3ZhbFtNQVhHRl07CitleHRlcm4gem1heCBtYXhfb2Zmc2V0OworZXh0ZXJuIGludCBmdW5jdGlvbl9jYWxscyx2bGFzOworZXh0ZXJuIGludCBjb2xvcmluZzsKK2V4dGVybiBpbnQgZG1hbGxvYzsKK2V4dGVybiBpbnQgc2VjX3Blcl9vYmo7CitleHRlcm4gaW50IGRpc2FibGU7CitleHRlcm4gaW50IG1pc3JhY2hlY2ssbWlzcmF2ZXJzaW9uLG1pc3JhY29tbWEsbWlzcmF0b2s7CitleHRlcm4gaW50IHBhY2tfYWxpZ247CitleHRlcm4gaW50IHNob3J0X3B1c2g7CitleHRlcm4gaW50IHN0YXRpY19jc2UsZHJlZl9jc2U7CitleHRlcm4gaW50IG5vX2VmZl9pY3MsZWFybHlfZWZmX2ljczsKK2V4dGVybiBpbnQgZm9yY2Vfc3RhdGljcyxwcmVmZXJfc3RhdGljczsKK2V4dGVybiBpbnQgcmFuZ2Vfb3B0OworZXh0ZXJuIGludCBkZWZhdWx0X3Vuc2lnbmVkOworZXh0ZXJuIFZhciAqYWRkX2F0dHJfaGFkZGVjbDsKKworLyogIERhcyBoYWV0dGUgaWNoIGdlcm4gd29hbmRlcnMgICAgKi8KK2V4dGVybiBzdHJ1Y3Qgc3RydWN0X2RlY2xhcmF0aW9uICphZGRfc2Qoc3RydWN0IHN0cnVjdF9kZWNsYXJhdGlvbiAqLGludCk7Cit0eXBlZGVmIHN0cnVjdCBub2RleworICBpbnQgZmxhZ3MsbHZhbHVlLHNpZGVmeDsKKyAgaW50IGJmcyxiZm87CisgIHR5cGUgKm50eXA7CisgIHN0cnVjdCBub2RlICpsZWZ0OworICBzdHJ1Y3Qgbm9kZSAqcmlnaHQ7CisgIHN0cnVjdCBhcmd1bWVudF9saXN0ICphbGlzdDsKKyAgY2hhciAqaWRlbnRpZmllcjsKKyAgc3RydWN0IGNvbnN0X2xpc3QgKmNsOworICBzdHJ1Y3QgVmFyICpkc2l6ZTsKKyAgdW5pb24gYXR5cHMgdmFsOworICBzdHJ1Y3Qgb2JqIG87Cit9IG5vZGU7Cit0eXBlZGVmIG5vZGUgKm5wOworI2RlZmluZSBOT0RFUyBzaXplb2Yoc3RydWN0IG5vZGUpCit0eXBlZGVmIHN0cnVjdCBjb25zdF9saXN0eworICB1bmlvbiBhdHlwcyB2YWw7CisgIG5wIHRyZWU7CisgIHptYXggaWR4OworICBzdHJ1Y3QgY29uc3RfbGlzdCAqb3RoZXIsKm5leHQ7Cit9IGNvbnN0X2xpc3Q7CisjZGVmaW5lIENMUyBzaXplb2Yoc3RydWN0IGNvbnN0X2xpc3QpCit0eXBlZGVmIHN0cnVjdCBjYXNlX3RhYmxleworICBpbnQgbnVtLHR5cGY7CisgIHN0cnVjdCBJQyAqbmV4dF9pYzsKKyAgZG91YmxlIGRlbnNpdHk7CisgIHVuaW9uIGF0eXBzICp2YWxzOworICBpbnQgKmxhYmVsczsKKyAgdW5pb24gYXR5cHMgbWluLG1heDsKKyAgenVtYXggZGlmZjsKK30gY2FzZV90YWJsZTsKK2V4dGVybiB6bWF4IHRfbWluW107CitleHRlcm4genVtYXggdF9tYXhbXTsKK2V4dGVybiB6dW1heCB0dV9tYXhbXTsKK2V4dGVybiB6bWF4IGNoYXJfYml0OworZXh0ZXJuIGNoYXIgY2dfY29weXJpZ2h0W107CisjaWZkZWYgSEFWRV9UQVJHRVRfQVRUUklCVVRFUworZXh0ZXJuIGNoYXIgKmdfYXR0cl9uYW1lW107CisjZW5kaWYKK2V4dGVybiBjaGFyICoqdGFyZ2V0X21hY3JvczsKK2V4dGVybiBpbnQgZ290b191c2VkOworZXh0ZXJuIGludCBpY19jb3VudDsKK2V4dGVybiBpbnQgb25seV9pbmxpbmU7CitleHRlcm4gaW50IG11bHRpcGxlX2NjczsKK2V4dGVybiBpbnQgZmxvYXRfdXNlZDsKK2V4dGVybiBJQyAqZXJyX2ljOworZXh0ZXJuIGxvbmcgbWF4b3B0cGFzc2VzLG9wdGZsYWdzLGlubGluZV9zaXplLHVucm9sbF9zaXplLGlubGluZV9kZXB0aDsKK2V4dGVybiBsb25nIGNsaXN0X2NvcHlfc3RhY2s7CitleHRlcm4gbG9uZyBjbGlzdF9jb3B5X3N0YXRpYzsKK2V4dGVybiBsb25nIGNsaXN0X2NvcHlfcG9pbnRlcjsKK2V4dGVybiBsb25nIGlubGluZV9tZW1jcHlfc3o7CitleHRlcm4gaW50IG5vYWxpYXNvcHQsZnBfYXNzb2Msbm9pdHJhOworZXh0ZXJuIFZhciAqdmwwLCp2bDEsKnZsMiwqdmwzOworZXh0ZXJuIGNoYXIgKmZpbGVuYW1lOworZXh0ZXJuIGNoYXIgKmVtaXRfYnVmZmVyW0VNSVRfQlVGX0RFUFRIXTsKK2V4dGVybiBjaGFyICplbWl0X3A7CitleHRlcm4gaW50IGVtaXRfZixlbWl0X2w7CitleHRlcm4gaW50IG5vX2lubGluZV9wZWVwaG9sZTsKK2V4dGVybiBpbnQgZWNwcDsKKy8qIGZ1bmN0aW9ucyB3aGljaCBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBmcm9udGVuZCAqLworZXh0ZXJuIHZvaWQgYWRkX0lDKElDICopOworZXh0ZXJuIHZvaWQgZXJyb3IoaW50LC4uLik7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCitleHRlcm4gVmFyICphZGRfdG1wX3Zhcih0eXBlICopOworZXh0ZXJuIHZvaWQgZnJlZV92YXIoVmFyICopOworZXh0ZXJuIHZvaWQgcmF1cyh2b2lkKTsKKy8qIGZ1bmN0aW9ucyBwcm92aWRlZCBieSBzdXBwLmMgKi8KKyNkZWZpbmUgcHJpbnR0eXBlIHByZAorI2RlZmluZSBwcmludG9iaiBwcm9iagorI2RlZmluZSBwcmludGljIHByaWMyCisjZGVmaW5lIHByaW50aWNsaXN0IHByaWMKK2V4dGVybiB2b2lkIGZyZWVfSUMoSUMgKik7CitleHRlcm4gdm9pZCBpbnNlcnRfSUMoSUMgKixJQyAqKTsKK2V4dGVybiB2b2lkIG1vdmVfSUMoSUMgKixJQyAqKTsKK2V4dGVybiB2b2lkIHByaWMoRklMRSAqLElDICopOworZXh0ZXJuIHZvaWQgcHJpYzIoRklMRSAqLElDICopOworZXh0ZXJuIHZvaWQgcHJvYmooRklMRSAqLG9iaiAqLGludCk7CitleHRlcm4gdm9pZCBlbWl0KEZJTEUgKixjb25zdCBjaGFyICosLi4uKTsKK2V4dGVybiB2b2lkIGVtaXRfY2hhcihGSUxFICosaW50KTsKK3ZvaWQgZW1pdF9mbHVzaChGSUxFICopOwordm9pZCByZW1vdmVfYXNtKHZvaWQpOworI2lmIEhBVkVfVEFSR0VUX1BFRVBIT0xFCitleHRlcm4gaW50IGVtaXRfcGVlcGhvbGUodm9pZCk7CisjZW5kaWYKK2V4dGVybiB2b2lkIGVtaXRfcmVtb3ZlKHZvaWQpOworZXh0ZXJuIHZvaWQgZW1pdF9pbmxpbmVfYXNtKEZJTEUgKixjaGFyICopOworZXh0ZXJuIHZvaWQgZW1pdHptKEZJTEUgKix6bWF4KTsKK2V4dGVybiB2b2lkIGVtaXR6dW0oRklMRSAqLHp1bWF4KTsKK2V4dGVybiB2b2lkIGVtaXR6bGQoRklMRSAqLHpsZG91YmxlKTsKK2V4dGVybiB2b2lkIGVtaXR2YWwoRklMRSAqLHVuaW9uIGF0eXBzICosaW50KTsKK2V4dGVybiB2b2lkIHByaW50em0oRklMRSAqLHptYXgpOworZXh0ZXJuIHZvaWQgcHJpbnR6dW0oRklMRSAqLHp1bWF4KTsKK2V4dGVybiB2b2lkIHByaW50emxkKEZJTEUgKix6bGRvdWJsZSk7CitleHRlcm4gdm9pZCBwcmludHZhbChGSUxFICosdW5pb24gYXR5cHMgKixpbnQpOworZXh0ZXJuIHZvaWQgaW5zZXJ0X2NvbnN0KHVuaW9uIGF0eXBzICosaW50KTsKK2V4dGVybiB2b2lkIHByZChGSUxFICosdHlwZSAqKTsKK2V4dGVybiB2b2lkIHByaW50X3ZhcihGSUxFICosVmFyICopOworZXh0ZXJuIHZvaWQgZnJlZXR5cCh0eXBlICopOworZXh0ZXJuIHR5cGUgKm5ld190eXAodm9pZCk7CitleHRlcm4gdHlwZSAqY2xvbmVfdHlwKHR5cGUgKik7CisjaWZkZWYgSEFWRV9FWFRfVFlQRVMKK2V4dGVybiB2b2lkIGNvbnZfdHlwKHR5cGUgKik7CisjZW5kaWYKK2V4dGVybiBpbnQgVkVDVFlQRShpbnQpOworZXh0ZXJuIGludCBta3ZlYyhpbnQsaW50KTsKK2V4dGVybiB6bWF4IHN6b2YodHlwZSAqKTsKK2V4dGVybiBpbnQgaXNfdmxlbmd0aCh0eXBlICopOworZXh0ZXJuIFZhciAqdmxlbmd0aF9zem9mKHR5cGUgKik7CitleHRlcm4gem1heCBzdHJ1Y3Rfb2Zmc2V0KHN0cnVjdF9kZWNsYXJhdGlvbiAqLGNvbnN0IGNoYXIgKik7CitleHRlcm4gem1heCBmYWxpZ24odHlwZSAqKTsKK2ludCBnZXRfZmlyc3RfYmFzZV90eXBlKHR5cGUgKik7CitleHRlcm4gaW50IG9ianNfZXF1YWwob2JqICosb2JqICosaW50KTsKK2V4dGVybiB2b2lkIGV2YWxfY29uc3QodW5pb24gYXR5cHMgKixpbnQpOworZXh0ZXJuIGludCBnZXRfY2xpc3RfYnl0ZSh0eXBlICosY29uc3RfbGlzdCAqLCB6bWF4LCB6dWNoYXIgKik7CitleHRlcm4genVtYXggZ2V0X2NsaXN0X2ludCh0eXBlICosIGNvbnN0X2xpc3QgKiwgem1heCwgaW50LCBpbnQgKik7CitleHRlcm4gZnVuY3Rpb25faW5mbyAqbmV3X2ZpKHZvaWQpOworZXh0ZXJuIHZvaWQgZnJlZV9maShmdW5jdGlvbl9pbmZvICopOworZXh0ZXJuIHZvaWQgcHJpbnRfZmkoRklMRSAqLGZ1bmN0aW9uX2luZm8gKik7CitleHRlcm4gdm9pZCBzdGF0aWNfc3RhY2tfY2hlY2soVmFyICopOworI2lmZGVmIEhBVkVfUkVHUEFSTVMKK2V4dGVybiB6bWF4IHZhX29mZnNldChWYXIgKik7CisjZW5kaWYKK2V4dGVybiB2b2lkIHByaW50X3Zhcmxpc3QoRklMRSAqZix2YXJsaXN0ICosaW50KTsKK2V4dGVybiB2b2lkIGFkZF9hdHRyKGNoYXIgKiosY2hhciAqKTsKK2V4dGVybiBpbnQgc3dpdGNoX0lDKElDICopOworZXh0ZXJuIGludCBjb2xsaWRlcyhvYmogKixvYmogKik7CitleHRlcm4gaW50IGlzX2NvbnN0KHR5cGUgKik7CitleHRlcm4gaW50IGlzX3ZvbGF0aWxlX29iaihvYmogKik7CitleHRlcm4gaW50IGlzX3ZvbGF0aWxlX2ljKElDICopOworZXh0ZXJuIGNhc2VfdGFibGUgKmNhbGNfY2FzZV90YWJsZShJQyAqLGRvdWJsZSk7CitpbnQgY2FsY19yZWdzKElDICosaW50KTsKK1ZhciAqZGVjbGFyZV9idWlsdGluKGNoYXIgKm5hbWUsaW50IHp0eXAsaW50IHExdHlwLGludCBxMXJlZyxpbnQgcTJ0eXAsaW50IHEycmVnLGludCBub3NpZGVmeCxjaGFyICphc20pOworZXh0ZXJuIHZvaWQgZW1pdF9qdW1wX3RhYmxlKEZJTEUgKixjYXNlX3RhYmxlICosY2hhciAqLGNoYXIgKixpbnQpOworZXh0ZXJuIHZvaWQgb3B0aW1pemUobG9uZywgVmFyICopOworaW50IGJ2Y21wKGJ2dHlwZSAqZGVzdCxidnR5cGUgKnNyYyxzaXplX3QgbGVuKTsKK2ludCBidmRvaW50ZXJzZWN0KGJ2dHlwZSAqLGJ2dHlwZSAqLHNpemVfdCBsZW4pOwordm9pZCBidnVuaXRlKGJ2dHlwZSAqZGVzdCxidnR5cGUgKnNyYyxzaXplX3QgbGVuKTsKK3ZvaWQgYnZpbnRlcnNlY3QoYnZ0eXBlICpkZXN0LGJ2dHlwZSAqc3JjLHNpemVfdCBsZW4pOwordm9pZCBidmRpZmYoYnZ0eXBlICpkZXN0LGJ2dHlwZSAqc3JjLHNpemVfdCBsZW4pOwordm9pZCB2cXNvcnQgKHZvaWQgKixzaXplX3Qsc2l6ZV90LGludCAoKikoY29uc3Qgdm9pZCAqLGNvbnN0IHZvaWQgKikpOworI2RlZmluZSBidmNvcHkoZGVzdCxzcmMsbGVuKSBtZW1jcHkoZGVzdCxzcmMsbGVuKQorI2RlZmluZSBidmNsZWFyKGRlc3QsbGVuKSBtZW1zZXQoZGVzdCwwLGxlbikKKyNkZWZpbmUgYnZzZXRhbGwoZGVzdCxsZW4pIG1lbXNldChkZXN0LC0xLGxlbikKK2V4dGVybiB2b2lkIHJlbW92ZV9JQyhJQyAqKTsKK2V4dGVybiBJQyAqY2xvbmVfaWMoSUMgKik7CitleHRlcm4gSUMgKm5ld19JQyh2b2lkKTsKK2V4dGVybiBWYXIgKm5ld192YXIodm9pZCk7CitleHRlcm4gdm9pZCBpbnNlcnRfYml0ZmllbGQob2JqICosb2JqICosb2JqICosaW50LGludCxpbnQsaW50KTsKK2V4dGVybiB2b2lkICpteW1hbGxvYyhzaXplX3QpOworZXh0ZXJuIHZvaWQgKm15cmVhbGxvYyh2b2lkICosc2l6ZV90KTsKK2V4dGVybiB2b2lkIG15ZnJlZSh2b2lkICpwKTsKKyNkZWZpbmUgZnJlZSh4KSBteWZyZWUoeCkKK2V4dGVybiBjaGFyICpteXN0cmR1cChjaGFyICopOworZXh0ZXJuIHZvaWQgc2ltcGxlX3JlZ3Modm9pZCk7CitleHRlcm4gaW50IGJmbGF5b3V0KGludCxpbnQsaW50KTsKKy8qICBmdW5jdGlvbnMgcHJvdmlkZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yICovCitleHRlcm4gaW50IHJlZ29rKGludCxpbnQsaW50KTsKK3R5cGVkZWYgc3RydWN0IHJwYWlyIHtpbnQgcjEscjI7fSBycGFpcjsKK2ludCByZWdfcGFpcihpbnQscnBhaXIgKik7CitleHRlcm4gcnBhaXIgcnA7CitleHRlcm4gaW50IGZyZXR1cm4odHlwZSAqKTsKKyNkZWZpbmUgZmZyZXR1cm4oeCkgKCh4KS0+cmVnPyh4KS0+cmVnOmZyZXR1cm4oeCkpCitleHRlcm4gdm9pZCBnZW5fY29kZShGSUxFICosSUMgKixWYXIgKix6bWF4KTsKK2V4dGVybiBpbnQgaW5pdF9jZyh2b2lkKTsKK2V4dGVybiB2b2lkIGNsZWFudXBfY2coRklMRSAqKTsKK2V4dGVybiB2b2lkIGluaXRfZGIoRklMRSAqKTsKK3ZvaWQgY2xlYW51cF9kYihGSUxFICopOworZXh0ZXJuIGludCBkYW5nZXJvdXNfSUMoSUMgKik7CitleHRlcm4gdm9pZCBnZW5fZGMoRklMRSAqLGludCxjb25zdF9saXN0ICopOworZXh0ZXJuIHZvaWQgZ2VuX2RzKEZJTEUgKix6bWF4LHR5cGUgKik7CitleHRlcm4gdm9pZCBnZW5fdmFyX2hlYWQoRklMRSAqLFZhciAqKTsKK2V4dGVybiB2b2lkIGdlbl9hbGlnbihGSUxFICosem1heCk7CitleHRlcm4gaW50IHNob3J0Y3V0KGludCwgaW50KTsKK2V4dGVybiBpbnQgbXVzdF9jb252ZXJ0KGludCxpbnQsaW50KTsKK2xvbmcgZ2V0X3BvZjIoenVtYXgpOworaW50IGlzX3ZhcmFyZ3ModHlwZSAqKTsKKwordHlwZWRlZiB2b2lkICpoYXNoZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgaGFzaGVudHJ5IHsKKyAgY2hhciAqbmFtZTsKKyAgaGFzaGRhdGEgZGF0YTsKKyAgc3RydWN0IGhhc2hlbnRyeSAqbmV4dDsKK30gaGFzaGVudHJ5OworCit0eXBlZGVmIHN0cnVjdCBoYXNodGFibGUgeworICBoYXNoZW50cnkgKiplbnRyaWVzOworICBzaXplX3Qgc2l6ZTsKKyAgaW50IGNvbGxpc2lvbnM7Cit9IGhhc2h0YWJsZTsKKworaGFzaHRhYmxlICpuZXdfaGFzaHRhYmxlKHNpemVfdCk7CitzaXplX3QgaGFzaGNvZGUoY2hhciAqKTsKK3ZvaWQgYWRkX2hhc2hlbnRyeShoYXNodGFibGUgKixjaGFyICosaGFzaGRhdGEpOworaGFzaGRhdGEgZmluZF9uYW1lKGhhc2h0YWJsZSAqLGNoYXIgKik7CisKKyNpZmRlZiBIQVZFX1RBUkdFVF9QUkFHTUFTCitleHRlcm4gaW50IGhhbmRsZV9wcmFnbWEoY29uc3QgY2hhciAqKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfTElCQ0FMTFMKK2V4dGVybiBjaGFyICp1c2VfbGliY2FsbChpbnQgY29kZSxpbnQgdDEsaW50IHQyKTsKKyNpZm5kZWYgTElCQ0FMTF9DTVBUWVBFCisjZGVmaW5lIExJQkNBTExfQ01QVFlQRSBJTlQKKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgSEFWRV9UQVJHRVRfVkFSSE9PS19QUkUKK2V4dGVybiB2b2lkIGFkZF92YXJfaG9va19wcmUoY29uc3QgY2hhciAqLHR5cGUgKixpbnQsY29uc3RfbGlzdCAqKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfVEFSR0VUX1ZBUkhPT0tfUE9TVAorZXh0ZXJuIHZvaWQgYWRkX3Zhcl9ob29rX3Bvc3QoVmFyICopOworI2VuZGlmCitleHRlcm4gaW50IGNvc3Rfc2F2aW5ncyhJQyAqLGludCxvYmogKik7CisvKiBhZGRpdGlvbmFsIGRlY2xhcmF0aW9ucyBmb3IgdGFyZ2V0cyB3aGljaCBwYXNzIGFyZ3VtZW50cyBpbiAqLworLyogcmVnaXN0ZXJzIGJ5IGRlZmF1bHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBIQVZFX1JFR1BBUk1TCitleHRlcm4gdHJlZ19oYW5kbGUgZW1wdHlfcmVnX2hhbmRsZTsKKy8qIGxhc3QgcGFyYW1ldGVyIGlzIGZ1bmN0aW9uIHR5cGUgb3IgcmV0dXJuIHR5cGUgb3IgcG9pbnRlciB0byBmdW5jdGlvbiB0eXBlICovCitleHRlcm4gaW50IHJlZ19wYXJtKHRyZWdfaGFuZGxlICosIHR5cGUgKixpbnQsdHlwZSAqKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfVEFSR0VUX0VGRl9JQworZXh0ZXJuIHZvaWQgbWFya19lZmZfaWNzKHZvaWQpOworI2Vsc2UKKyNkZWZpbmUgbWFya19lZmZfaWNzKCkKKyNlbmRpZgorI2lmbmRlZiBKVU1QX1RBQkxFX0RFTlNJVFkKKyNkZWZpbmUgSlVNUF9UQUJMRV9ERU5TSVRZIDEKKyNlbmRpZgorI2lmbmRlZiBKVU1QX1RBQkxFX0xFTkdUSAorI2RlZmluZSBKVU1QX1RBQkxFX0xFTkdUSCAxMDAwCisjZW5kaWYKKyNpZm5kZWYgQUxMT0NWTEFfUkVHCisjZGVmaW5lIEFMTE9DVkxBX1JFRyAwCisjZW5kaWYKKyNpZm5kZWYgQUxMT0NWTEFfSU5MSU5FQVNNCisjZGVmaW5lIEFMTE9DVkxBX0lOTElORUFTTSAwCisjZW5kaWYKKyNpZm5kZWYgRlJFRVZMQV9SRUcKKyNkZWZpbmUgRlJFRVZMQV9SRUcgMAorI2VuZGlmCisjaWZuZGVmIEZSRUVWTEFfSU5MSU5FQVNNCisjZGVmaW5lIEZSRUVWTEFfSU5MSU5FQVNNIDAKKyNlbmRpZgorI2lmbmRlZiBPTERTUFZMQV9JTkxJTkVBU00KKyNkZWZpbmUgT0xEU1BWTEFfSU5MSU5FQVNNIDAKKyNlbmRpZgorI2lmbmRlZiBGUFZMQV9SRUcKKyNkZWZpbmUgRlBWTEFfUkVHIDAKKyNlbmRpZgorI2lmbmRlZiBNSU5fSU5UX1RPX0ZMT0FUX1RZUEUKKyNkZWZpbmUgTUlOX0lOVF9UT19GTE9BVF9UWVBFIENIQVIKKyNlbmRpZgorI2lmbmRlZiBNSU5fRkxPQVRfVE9fSU5UX1RZUEUKKyNkZWZpbmUgTUlOX0ZMT0FUX1RPX0lOVF9UWVBFIENIQVIKKyNlbmRpZgorI2lmbmRlZiBBVk9JRF9GTE9BVF9UT19VTlNJR05FRAorI2RlZmluZSBBVk9JRF9GTE9BVF9UT19VTlNJR05FRCAwCisjZW5kaWYKKyNpZm5kZWYgQVZPSURfVU5TSUdORURfVE9fRkxPQVQKKyNkZWZpbmUgQVZPSURfVU5TSUdORURfVE9fRkxPQVQgMAorI2VuZGlmCisjaWZuZGVmIENIQVJDT05WCisjZGVmaW5lIENIQVJDT05WKHgpICh4KQorI2RlZmluZSBDSEFSQkFDSyh4KSAoeCkKKyNkZWZpbmUgU1RSQkFDSyh4KQorI2Vsc2UKK3Vuc2lnbmVkIGNoYXIgQ0hBUkJBQ0sodW5zaWduZWQgY2hhcik7Cit2b2lkIFNUUkJBQ0sodW5zaWduZWQgY2hhciAqKTsKKyNlbmRpZgorCisjaWYgSEFWRV9PU0VLCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKworCisjZW5kaWYgLyogU1VQUF9IICovCmRpZmYgLS1naXQgYS90MS5oIGIvdDEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmY4YjU3Ci0tLSAvZGV2L251bGwKKysrIGIvdDEuaApAQCAtMCwwICsxLDQgQEAKKy8qICRSZXZpc2lvbjogMS4yICQgKi8KKworI2luY2x1ZGUgInQyLmgiCisKZGlmZiAtLWdpdCBhL3QyLmggYi90Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhmZmUxZTMKLS0tIC9kZXYvbnVsbAorKysgYi90Mi5oCkBAIC0wLDAgKzEsMiBAQAordDIgaXMgaGVyZQorCmRpZmYgLS1naXQgYS90YXNtLmMgYi90YXNtLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmI2Mzc0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rhc20uYwpAQCAtMCwwICsxLDEyOCBAQAorLyogIFRlc3QtbGFuZ3VhZ2UgZm9yIHZiY2MuICovCisKKyNpbmNsdWRlICJzdXBwLmgiCisKK3N0cnVjdCBWYXIgKmZ2OworCitzdHJ1Y3QgVHlwIHRpbnQsbWZ1bmM7CitzdHJ1Y3Qgc3RydWN0X2RlY2xhcmF0aW9uIG1zZDsgLyogaW5pdGlhbGl6ZWQgdG8gemVybyAqLworCit2b2lkIHJhdXModm9pZCkKK3sKKyAgICB3aGlsZShmdil7CisgICAgICAgIHN0cnVjdCBWYXIgKm09ZnYtPm5leHQ7CisgICAgICAgIGZyZWUoZnYpOworICAgICAgICBmdj1tOworICAgIH0KKyAgICB3aGlsZShmaXJzdF9pYyl7CisgICAgICAgIHN0cnVjdCBJQyAqbT1maXJzdF9pYy0+bmV4dDsKKyAgICAgICAgZnJlZShmaXJzdF9pYyk7CisgICAgICAgIGZpcnN0X2ljPW07CisgICAgfQorICAgIGV4aXQoMCk7Cit9Cit2b2lkIGFkZF9JQyhzdHJ1Y3QgSUMgKm5ldykKK3sKKyAgICBuZXctPm5leHQ9MDsKKyAgICBuZXctPnByZXY9bGFzdF9pYzsKKyAgICBuZXctPmNoYW5nZV9jbnQ9bmV3LT51c2VfY250PTA7CisgICAgbmV3LT5jaGFuZ2VfbGlzdD1uZXctPnVzZV9saXN0PTA7CisgICAgbmV3LT5saW5lPTA7CisgICAgbmV3LT5maWxlPTA7CisgICAgaWYoIWxhc3RfaWMpeworICAgICAgICBmaXJzdF9pYz1uZXc7CisgICAgfWVsc2V7CisgICAgICAgIGxhc3RfaWMtPm5leHQ9bmV3OworICAgIH0KKyAgICBsYXN0X2ljPW5ldzsKK30KK3N0cnVjdCBWYXIgKmFkZF92YXIoY2hhciAqbmFtZSxzdHJ1Y3QgVHlwICp0LGludCBzYykKK3sKKyAgICBzdHJ1Y3QgVmFyICp2PW15bWFsbG9jKHNpemVvZigqdikpOworICAgIHYtPnZ0eXA9dDsKKyAgICB2LT5zdG9yYWdlX2NsYXNzPXNjOworICAgIHYtPnJlZz0wOworICAgIHYtPmlkZW50aWZpZXI9bmFtZTsKKyAgICB2LT5vZmZzZXQ9bWF4X29mZnNldDsKKyAgICBpZihzYz09QVVUTykgbWF4X29mZnNldD16bWFkZChtYXhfb2Zmc2V0LHNpemV0YWJbdC0+ZmxhZ3MmTlFdKTsKKyAgICB2LT5wcmlvcml0eT0xOworICAgIHYtPmZsYWdzPTA7CisgICAgdi0+bmV4dD1mdjsKKyAgICB2LT5jbGlzdD0wOworICAgIHYtPmZpPTA7CisgICAgdi0+aW5saW5lX2NvcHk9MDsKKyAgICBmdj12OworICAgIHJldHVybiB2OworfQorc3RydWN0IFZhciAqYWRkX3RtcF92YXIoc3RydWN0IFR5cCAqdCkKK3sKKyAgICByZXR1cm4gYWRkX3ZhcihlbXB0eSx0LEFVVE8pOworfQorc3RydWN0IFZhciAqZ2V0X3ZhcihjaGFyICpuYW1lKQoreworICAgIHN0cnVjdCBWYXIgKnY7Y2hhciAqYnVmOworICAgIGZvcih2PWZ2O3Y7dj12LT5uZXh0KXsKKyAgICAgICAgaWYoIXN0cmNtcChuYW1lLHYtPmlkZW50aWZpZXIpKSByZXR1cm4gdjsKKyAgICB9CisgICAgYnVmPW15bWFsbG9jKHN0cmxlbihuYW1lKSsxKTsKKyAgICBzdHJjcHkoYnVmLG5hbWUpOworICAgIHJldHVybiBhZGRfdmFyKGJ1ZiwmdGludCxBVVRPKTsKK30KKwordm9pZCByZWFkX2ljcygpCit7CisgICAgY2hhciBzWzQwMF0scTFbMTAwXSxxMlsxMDBdLHpbMTAwXSxvcDsKKyAgICBzdHJ1Y3QgSUMgKm5ldzsKKyAgICBnZXRzKHMpOworICAgIHdoaWxlKHNzY2FuZihzLCIlOTlzID0gJTk5cyAlYyAlOTlzIix6LHExLCZvcCxxMik9PTQpeworICAgICAgICBuZXc9bmV3X0lDKCk7CisgICAgICAgIHN3aXRjaChvcCl7CisgICAgICAgICAgICBjYXNlICcrJzogbmV3LT5jb2RlPUFERDticmVhazsKKyAgICAgICAgICAgIGNhc2UgJyonOiBuZXctPmNvZGU9TVVMVDticmVhazsKKyAgICAgICAgICAgIGNhc2UgJy0nOiBuZXctPmNvZGU9U1VCO2JyZWFrOworICAgICAgICAgICAgY2FzZSAnLyc6IG5ldy0+Y29kZT1ESVY7YnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbmV3LT50eXBmPUlOVDsKKyAgICAgICAgbmV3LT5xMS5mbGFncz1uZXctPnEyLmZsYWdzPW5ldy0+ei5mbGFncz1WQVI7CisgICAgICAgIG5ldy0+cTEuYW09bmV3LT5xMi5hbT1uZXctPnouYW09MDsKKyAgICAgICAgbmV3LT5xMS52YWwudm1heD1sMnptKDBMKTsKKyAgICAgICAgbmV3LT5xMi52YWwudm1heD1sMnptKDBMKTsKKyAgICAgICAgbmV3LT56LnZhbC52bWF4PWwyem0oMEwpOworICAgICAgICBuZXctPnExLnY9Z2V0X3ZhcihxMSk7CisgICAgICAgIG5ldy0+cTIudj1nZXRfdmFyKHEyKTsKKyAgICAgICAgbmV3LT56LnY9Z2V0X3Zhcih6KTsKKyAgICAgICAgYWRkX0lDKG5ldyk7CisgICAgICAgIGdldHMocyk7CisgICAgfQorfQordm9pZCBlcnJvcihpbnQgbiwuLi4pCit7CisgICAgcHJpbnRmKCJlcnJvciAlZFxuIixuKTsKKyAgICByYXVzKCk7Cit9Cit2b2lkIHNhdmVzY3JhdGNoKCkKK3t9CisKK21haW4oKQoreworICAgIHN0cnVjdCBWYXIgKm1haW47CisgICAgbWF4X29mZnNldD1sMnptKDBMKTsKKyAgICBpZighaW5pdF9jZygpKSByYXVzKCk7CisgICAgdGludC5mbGFncz1JTlQ7CisgICAgdGludC5uZXh0PTA7CisgICAgbWZ1bmMuZmxhZ3M9RlVOS1Q7CisgICAgbWZ1bmMubmV4dD0mdGludDsKKyAgICBtZnVuYy5leGFjdD0mbXNkOworICAgIG1haW49YWRkX3ZhcigibWFpbiIsJm1mdW5jLEVYVEVSTik7CisgICAgcmVhZF9pY3MoKTsKKyAgICBwcmludGYoIm9wdGZsYWdzOiAiKTsKKyAgICBzY2FuZigiJWxkIiwmb3B0ZmxhZ3MpOworICAgIHByaWMoc3Rkb3V0LGZpcnN0X2ljKTsKKyAgICB2bDE9dmwzPTA7CisgICAgdmwyPWZ2OworICAgIG9wdGltaXplKG9wdGZsYWdzLG1haW4pOworICAgIHByaWMoc3Rkb3V0LGZpcnN0X2ljKTsKKyAgICBnZW5fY29kZShzdGRvdXQsZmlyc3RfaWMsbWFpbixtYXhfb2Zmc2V0KTsKKyAgICByYXVzKCk7Cit9CmRpZmYgLS1naXQgYS90dC5oIGIvdHQuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZGU2ZDU1Ci0tLSAvZGV2L251bGwKKysrIGIvdHQuaApAQCAtMCwwICsxLDMgQEAKK3Rlc3QxCit0ZXN0MgorCmRpZmYgLS1naXQgYS90eXBlX2V4cHIuYyBiL3R5cGVfZXhwci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNjg4MDUKLS0tIC9kZXYvbnVsbAorKysgYi90eXBlX2V4cHIuYwpAQCAtMCwwICsxLDMwOTAgQEAKKy8qICAkVkVSOiB2YmNjICh0eXBlX2V4cHIuYykgJFJldmlzaW9uOiAxLjY0ICQgICAqLworCisjaW5jbHVkZSAidmJjLmgiCisKK3N0YXRpYyBjaGFyIEZJTEVfW109X19GSUxFX187CisKKyNkZWZpbmUgQ09OU1RBRERSIDI1NgorCisKKy8qIGlmIE1BU0sgaXMgc2V0LCBhIHNwZWNpYWxpemVkIHZlcnNpb24gd2lsbCBiZSBnZW5lcmF0ZWQgKi8KKyNkZWZpbmUgVVNFSEFMRiAgKDFMPDwxKQorI2RlZmluZSBVU0VMT05HICAoMUw8PDIpCisjZGVmaW5lIFVTRUxMT05HICgxTDw8MykKKyNkZWZpbmUgVVNFRkxPQVQgKDFMPDw0KQorI2RlZmluZSBVU0VIRVhMICAoMUw8PDUpCisjZGVmaW5lIFVTRUhFWFUgICgxTDw8NikKKyNkZWZpbmUgVVNFREVDICAgKDFMPDw3KQorI2RlZmluZSBVU0VPQ1QgICAoMUw8PDgpCisjZGVmaW5lIFVTRUlOVCAgICgxTDw8OSkKKyNkZWZpbmUgVVNFVU5TICAgKDFMPDwxMCkKKyNkZWZpbmUgVVNFU1RSICAgKDFMPDwxMSkKKyNkZWZpbmUgVVNFQ0hBUiAgKDFMPDwxMikKKyNkZWZpbmUgVVNFUEVSQyAgKDFMPDwxMykKKyNkZWZpbmUgVVNFQ05UICAgKDFMPDwxNCkKKyNkZWZpbmUgVVNFQUxUICAgKDFMPDwxNSkKKyNkZWZpbmUgVVNFWlBBRCAgKDFMPDwxNikKKyNkZWZpbmUgVVNFTEFMR04gKDFMPDwxNykKKyNkZWZpbmUgVVNFQkxBTksgKDFMPDwxOCkKKyNkZWZpbmUgVVNFU0lHTiAgKDFMPDwxOSkKKyNkZWZpbmUgVVNFV0lEVEggKDFMPDwyMCkKKyNkZWZpbmUgVVNFQVNUICAgKDFMPDwyMSkKKyNkZWZpbmUgVVNFUFJFQyAgKDFMPDwyMikKKyNkZWZpbmUgVVNFU1BFQyAgKDFMPDwyMykKKyNkZWZpbmUgVVNFUkVYUCAgKDFMPDwyNCkKKworaW50IGFsZ19vcHQobnAsdHlwZSAqKTsKK3ZvaWQgc2ltcGxlX2FsZ19vcHQobnApOworaW50IHRlc3RfYXNzaWdubWVudCh0eXBlICosbnApOworaW50IHR5cGVfZXhwcmVzc2lvbjIobnAsdHlwZSAqKTsKK3ZvaWQgbWFrZV9jZXhwcihucCk7CisKK2ludCBkb250b3B0OworaW50IG5vX2Nhc3RfZnJlZTsKKwordHlwZSB1Y3Q9e1VOU0lHTkVEfENIQVJ9OwordHlwZSB1c3Q9e1VOU0lHTkVEfFNIT1JUfTsKK3R5cGUgdWl0PXtVTlNJR05FRHxJTlR9OwordHlwZSB1bHQ9e1VOU0lHTkVEfExPTkd9OworCisjaWZkZWYgSEFWRV9FQ1BQCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorCisKKworCisKK3ZvaWQgaW5zZXJ0X2NvbnN0bihucCBwKQorLyogIFNwZXppYWxmYWxsIGZ1ZXIgbnAgKi8KK3sKKyAgICBpZighcHx8IXAtPm50eXApIGllcnJvcigwKTsKKyAgICBpbnNlcnRfY29uc3QoJnAtPnZhbCxwLT5udHlwLT5mbGFncyk7Cit9CitpbnQgY29uc3RfdHlwKHR5cGUgKnApCisvKiAgVGVzdGV0LCBvYiBUeXAga29uc3RhbnQgaXN0IG9kZXIga29uc3RhbnRlIEVsZW1lbnRlIGVudGhhZWx0ICAgICovCit7CisgICAgaW50IGk7c3RydWN0X2RlY2xhcmF0aW9uICpzZDsKKyAgICBpZihwLT5mbGFncyZDT05TVCkgcmV0dXJuKDEpOworICAgIGlmKElTU1RSVUNUKHAtPmZsYWdzKXx8SVNVTklPTihwLT5mbGFncykpCisgICAgICAgIGZvcihpPTA7aTxwLT5leGFjdC0+Y291bnQ7aSsrKQorICAgICAgICAgICAgaWYoY29uc3RfdHlwKCgqcC0+ZXhhY3QtPnNsKVtpXS5zdHlwKSkgcmV0dXJuKDEpOworICAgIHJldHVybiAwOworfQoraW50IGFyaXRoX2ZsYWcoaW50IHRhLGludCB0YikKK3sKKyAgLyogVE9ETzogdm9sYXRpbGU/ICovCisgIHRhJj1OVTt0YiY9TlU7CisgIGlmKHRhPT1MRE9VQkxFfHx0Yj09TERPVUJMRSkgcmV0dXJuIExET1VCTEU7CisgIGlmKHRhPT1ET1VCTEV8fHRiPT1ET1VCTEUpIHJldHVybiBET1VCTEU7CisgIGlmKHRhPT1GTE9BVHx8dGI9PUZMT0FUKSByZXR1cm4gRkxPQVQ7CisgIHRhPWludF9lcncodGEpO3RiPWludF9lcncodGIpOworICBpZih0YT09KFVOU0lHTkVEfExMT05HKXx8dGI9PShVTlNJR05FRHxMTE9ORykpIHJldHVybiBVTlNJR05FRHxMTE9ORzsKKyAgaWYodGE9PUxMT05HfHx0Yj09TExPTkcpIHJldHVybiBMTE9ORzsKKyAgaWYodGE9PShVTlNJR05FRHxMT05HKXx8dGI9PShVTlNJR05FRHxMT05HKSkgcmV0dXJuIFVOU0lHTkVEfExPTkc7CisgIGlmKCh0YT09TE9ORyYmdGI9PShVTlNJR05FRHxJTlQpKXx8KHRhPT0oVU5TSUdORUR8SU5UKSYmdGI9PUxPTkcpKXsKKyAgICBpZih6dW1sZXEodF9tYXgoVU5TSUdORUR8SU5UKSx0X21heChMT05HKSkpIAorICAgICAgcmV0dXJuIExPTkc7CisgICAgZWxzZQorICAgICAgcmV0dXJuIFVOU0lHTkVEfExPTkc7CisgIH0KKyAgaWYodGE9PUxPTkd8fHRiPT1MT05HKSByZXR1cm4gTE9ORzsKKyAgaWYodGE9PShVTlNJR05FRHxJTlQpfHx0Yj09KFVOU0lHTkVEfElOVCkpIHJldHVybiBVTlNJR05FRHxJTlQ7CisgIHJldHVybiBJTlQ7Cit9CisKK3R5cGUgKmFyaXRoX3R5cCh0eXBlICphLHR5cGUgKmIpCisvKiAgRXJ6ZXVndCBUeXAgZnVlciBhcml0aG1ldGlzY2hlIFVtd2FuZGx1bmcgdm9uIHp3ZWkgT3BlcmFuZGVuICAgICovCit7CisgIGludCB0YSx0Yix2YSx2b2w7dHlwZSAqbmV3OworICAgIG5ldz1uZXdfdHlwKCk7CisgICAgdGE9YS0+ZmxhZ3MmTlU7dGI9Yi0+ZmxhZ3MmTlU7CisgICAgdm9sPShhLT5mbGFncyZWT0xBVElMRSl8KGItPmZsYWdzJlZPTEFUSUxFKTsKKyAgICBpZih0YT09TERPVUJMRXx8dGI9PUxET1VCTEUpe25ldy0+ZmxhZ3M9TERPVUJMRXx2b2w7cmV0dXJuIG5ldzt9CisgICAgaWYodGE9PURPVUJMRXx8dGI9PURPVUJMRSl7bmV3LT5mbGFncz1ET1VCTEV8dm9sO3JldHVybiBuZXc7fQorICAgIGlmKHRhPT1GTE9BVHx8dGI9PUZMT0FUKXtuZXctPmZsYWdzPUZMT0FUfHZvbDtyZXR1cm4gbmV3O30KKyAgICB0YT1pbnRfZXJ3KHRhKTt0Yj1pbnRfZXJ3KHRiKTsKKyAgICBpZih0YT09KFVOU0lHTkVEfExMT05HKXx8dGI9PShVTlNJR05FRHxMTE9ORykpe25ldy0+ZmxhZ3M9VU5TSUdORUR8TExPTkd8dm9sO3JldHVybiBuZXc7fQorICAgIGlmKHRhPT1MTE9OR3x8dGI9PUxMT05HKXtuZXctPmZsYWdzPUxMT05HfHZvbDtyZXR1cm4gbmV3O30KKyAgICBpZih0YT09KFVOU0lHTkVEfExPTkcpfHx0Yj09KFVOU0lHTkVEfExPTkcpKXtuZXctPmZsYWdzPVVOU0lHTkVEfExPTkd8dm9sO3JldHVybiBuZXc7fQorICAgIGlmKCh0YT09TE9ORyYmdGI9PShVTlNJR05FRHxJTlQpKXx8KHRhPT0oVU5TSUdORUR8SU5UKSYmdGI9PUxPTkcpKXsKKyAgICAgICAgaWYoenVtbGVxKHRfbWF4KFVOU0lHTkVEfElOVCksdF9tYXgoTE9ORykpKSBuZXctPmZsYWdzPUxPTkd8dm9sOyBlbHNlIG5ldy0+ZmxhZ3M9VU5TSUdORUR8TE9OR3x2b2w7CisgICAgICAgIHJldHVybiBuZXc7CisgICAgfQorICAgIGlmKHRhPT1MT05HfHx0Yj09TE9ORyl7bmV3LT5mbGFncz1MT05HfHZvbDtyZXR1cm4gbmV3O30KKyAgICBpZih0YT09KFVOU0lHTkVEfElOVCl8fHRiPT0oVU5TSUdORUR8SU5UKSl7bmV3LT5mbGFncz1VTlNJR05FRHxJTlR8dm9sO3JldHVybiBuZXc7fQorICAgIG5ldy0+ZmxhZ3M9SU5UfHZvbDsKKyAgICByZXR1cm4gbmV3OworfQoraW50IGludF9lcncoaW50IHQpCisvKiAgRnVlaHJ0IEludGVnZXJfRXJ3ZWl0ZXJ1bmcgZWluZXMgVHlwZW4gZHVyY2ggICAgICAgICAgICAgICAgKi8KK3sKKyAgICBpZigodCZOUSk+PUlOVCkgcmV0dXJuIHQ7CisgICAgaWYodCZVTlNJR05FRCl7CisgICAgICBpZigodCZOUSk8PUNIQVImJnp1bWxlcSh0X21heChVTlNJR05FRHxDSEFSKSx0X21heChJTlQpKSkgcmV0dXJuIElOVDsKKyAgICAgIGlmKCh0Jk5RKTw9U0hPUlQmJnp1bWxlcSh0X21heChVTlNJR05FRHxTSE9SVCksdF9tYXgoSU5UKSkpIHJldHVybiBJTlQ7CisgICAgICByZXR1cm4gVU5TSUdORUR8SU5UOworICAgIH0KKyAgICByZXR1cm4gSU5UOworfQorI2lmIEhBVkVfQU9TNAorc3RhdGljIGludCBhb3M0ZXJyOworaW50IGFvczRfYXR0cih0eXBlICpwLGNoYXIgKnMpCit7CisgIGlmKHAtPmF0dHImJnN0cnN0cihwLT5hdHRyLHMpKQorICAgIHJldHVybiAxOworICBpZihwLT5uZXh0KQorICAgIHJldHVybiBhb3M0X2F0dHIocC0+bmV4dCxzKTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorc3RhdGljIG5wIGFvczRfY2xvbmVfdHJlZShucCBwKQoreworICBucCBuZXc7CisgIGlmKCFwKSByZXR1cm4gMDsKKyAgbmV3PW5ld19ub2RlKCk7CisgICpuZXc9KnA7CisgIG5ldy0+bnR5cD1jbG9uZV90eXAocC0+bnR5cCk7CisgIG5ldy0+bGVmdD1hb3M0X2Nsb25lX3RyZWUocC0+bGVmdCk7CisgIG5ldy0+cmlnaHQ9YW9zNF9jbG9uZV90cmVlKHAtPnJpZ2h0KTsKKyAgbmV3LT5hbGlzdD0wO25ldy0+Y2w9MDtuZXctPmRzaXplPTA7CisgIGlmKHAtPmZsYWdzPT1DQUxMLyp8fHAtPmNsfHxwLT5kc2l6ZSovKSBhb3M0ZXJyPTE7CisgIHJldHVybiBuZXc7Cit9CisjZW5kaWYKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKK2ludCB0eXBlX2V4cHJlc3Npb24obnAgcCx0eXBlICp0dHlwKQorLyogIEFydCBGcm9udGVuZCBmdWVyIHR5cGVfZXhwcmVzc2lvbjIoKS4gU2V0enQgZG9udG9wdCBhdWYgMCAgICovCit7CisJCWludCByZXRfdmFsOworICAgIGRvbnRvcHQ9MDsKKyAgICBzaW1wbGVfYWxnX29wdChwKTsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgIHJldF92YWwgPSB0eXBlX2V4cHJlc3Npb24yKHAsdHR5cCk7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisJCXJldHVybiByZXRfdmFsOworCit9CisKK3N0YXRpYyB2b2lkIGZpeF9hZGRyX3B0eXBlKG5wIG9wKQoreworICBucCBwPW9wOworICB3aGlsZShwLT5mbGFncz09RklSU1RFTEVNRU5UKSBwPXAtPmxlZnQ7CisgIGlmKHAtPmxlZnQtPmZsYWdzPT1DT05URU5UKXsKKyAgICBpbnQgcHQ9cC0+bGVmdC0+bGVmdC0+bnR5cC0+ZmxhZ3M7CisgICAgaWYoIUlTUE9JTlRFUihwdCkpIGllcnJvcigwKTsKKyAgICBpZighSVNQT0lOVEVSKG9wLT5udHlwLT5mbGFncykpIGllcnJvcigwKTsKKyAgICBvcC0+bnR5cC0+ZmxhZ3M9cHQ7CisgIH0KK30KKworc3RhdGljIGludCBwdHlwZShucCBvcCkKK3sKKyNpZmRlZiBQT0lOVEVSX1ZBUkFEUgorICBWYXIgKnY9MDsKKyAgbnAgcD1vcDsKKworICB3aGlsZShwLT5mbGFncz09RklSU1RFTEVNRU5ULyp8fHAtPmZsYWdzPT1DT05URU5UKi8pIHA9cC0+bGVmdDsKKyAgCisgIGlmKHAtPmZsYWdzPT1JREVOVElGSUVSKQorICAgIHY9ZmluZF92YXIocC0+aWRlbnRpZmllciwwKTsKKyAgaWYodikgCisgICAgcmV0dXJuIFBPSU5URVJfVkFSQURSKHYpOworICBlbHNlCisgICAgcmV0dXJuIFBPSU5URVJfVFlQRShvcC0+bnR5cCk7CisjZWxzZQorICByZXR1cm4gUE9JTlRFUl9UWVBFKG9wLT5udHlwKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGRlY2lkZV9zaG9ydGN1dChucCBwLHR5cGUgKnR0eXApCit7CisgIGludCB0dGY9dHR5cC0+ZmxhZ3MsZj1wLT5mbGFnczsKKyAgaWYoZj09UE1VTFQpIGY9TVVMVDsKKyAgaWYoIXNob3J0Y3V0KGYsdHR5cC0+ZmxhZ3MmTlUpfHwKKyAgICAgSVNGTE9BVCh0dGYpfHxJU0ZMT0FUKHAtPmxlZnQtPm50eXAtPmZsYWdzKXx8SVNGTE9BVChwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpCisgICAgICkKKyAgICByZXR1cm4gMDsKKyAgdHRmJj1OUTsKKyAgaWYodHRmPElOVCkgcmV0dXJuIDE7CisgIGlmKHptMmwoc2l6ZXRhYlt0dGZdKTx6bTJsKHNpemV0YWJbKHAtPmxlZnQtPm50eXAtPmZsYWdzJk5RKV0pKSByZXR1cm4gMTsKKyAgaWYoem0ybChzaXpldGFiW3R0Zl0pPHptMmwoc2l6ZXRhYlsocC0+cmlnaHQtPm50eXAtPmZsYWdzJk5RKV0pKSByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgdHlwZSAqYmVzdF9hZGRpMnB0KHptYXggc3opCit7CisgIGlmKCF6bWVxdG8oc2l6ZXRhYltDSEFSXSxzaXpldGFiW0lOVF0pJiYhem1lcXRvKHN6LFowKSYmTUlOQURESTJQPD1DSEFSJiZ6dW1sZXEoem0yenVtKHN6KSx6dW1hZGQodHVfbWF4W0NIQVJdLFpVMSkpKXsKKyAgICByZXR1cm4gJnVjdDsKKyAgfWVsc2UgaWYoIXptZXF0byhzaXpldGFiW1NIT1JUXSxzaXpldGFiW0lOVF0pJiYhem1lcXRvKHN6LFowKSYmTUlOQURESTJQPD1TSE9SVCYmenVtbGVxKHptMnp1bShzeiksenVtYWRkKHR1X21heFtTSE9SVF0sWlUxKSkpeworICAgIHJldHVybiAmdXN0OworICB9CisgIHJldHVybiAwOworfQorCit0eXBlICphbmRjb21wKG5wIGFuZCxucCBjbXApCit7CisgIGludCBpPTA7em1heCBzdmFsO3p1bWF4IHV2YWw7CisgIGlmKGNtcCl7CisgICAgaWYoKGNtcC0+ZmxhZ3M9PUNFWFBSfHxjbXAtPmZsYWdzPT1QQ0VYUFIpKXtpPTE7ZXZhbF9jb25zdG4oY21wKTtzdmFsPXZtYXg7dXZhbD12dW1heDt9CisgIH1lbHNleworICAgIHN2YWw9WjA7dXZhbD1aVTA7CisgICAgaT0xOworICB9CisgIGlmKGFuZC0+ZmxhZ3M9PUFORCYmKGFuZC0+bGVmdC0+ZmxhZ3M9PUNFWFBSfHxhbmQtPmxlZnQtPmZsYWdzPT1QQ0VYUFIpKXtpfD0yO2V2YWxfY29uc3RuKGFuZC0+bGVmdCk7fQorICBpZihhbmQtPmZsYWdzPT1BTkQmJihhbmQtPnJpZ2h0LT5mbGFncz09Q0VYUFJ8fGFuZC0+cmlnaHQtPmZsYWdzPT1QQ0VYUFIpKXtpfD0yO2V2YWxfY29uc3RuKGFuZC0+cmlnaHQpO30KKyAgaWYoaSYyKXsKKyAgICAvKnByaW50ZigiQ0hFQ0s6IHgmJWxkID09LyE9ICVsZFxuIix6bTJsKHZtYXgpLChpJjEpP3ptMmwoc3ZhbCk6LTFMKTsqLworICAgIGlmKHNob3J0Y3V0KENPTVBBUkUsVU5TSUdORUR8Q0hBUikmJnNob3J0Y3V0KEFORCxVTlNJR05FRHxDSEFSKSYmIXptZXF0byhzaXpldGFiW0NIQVJdLHNpemV0YWJbU0hPUlRdKSl7CisgICAgICBpZih6bWxlcSh2bWF4LHRfbWF4W0NIQVJdKSkKKwlyZXR1cm4gJnVjdDsKKyAgICAgIGVsc2UgaWYoKGkmMSkmJnp1bWxlcSh2dW1heCx0dV9tYXhbQ0hBUl0pJiZ6dW1sZXEodXZhbCx0dV9tYXhbQ0hBUl0pKQorCXJldHVybiAmdWN0OworICAgIH0KKyAgICBpZihzaG9ydGN1dChDT01QQVJFLFVOU0lHTkVEfFNIT1JUKSYmc2hvcnRjdXQoQU5ELFVOU0lHTkVEfFNIT1JUKSYmIXptZXF0byhzaXpldGFiW1NIT1JUXSxzaXpldGFiW0lOVF0pKXsKKyAgICAgIGlmKHptbGVxKHZtYXgsdF9tYXhbU0hPUlRdKSkKKwlyZXR1cm4gJnVzdDsKKyAgICAgIGVsc2UgaWYoKGkmMSkmJnp1bWxlcSh2dW1heCx0dV9tYXhbU0hPUlRdKSYmenVtbGVxKHV2YWwsdHVfbWF4W1NIT1JUXSkpCisJcmV0dXJuICZ1c3Q7CisgICAgfQorICAgIGlmKCF6bWVxdG8oc2l6ZXRhYltJTlRdLHNpemV0YWJbTE9OR10pKXsKKyAgICAgIGlmKHptbGVxKHZtYXgsdF9tYXhbSU5UXSkpCisJcmV0dXJuICZ1aXQ7CisgICAgICBlbHNlIGlmKChpJjEpJiZ6dW1sZXEodnVtYXgsdHVfbWF4W0lOVF0pJiZ6dW1sZXEodXZhbCx0dV9tYXhbSU5UXSkpCisJcmV0dXJuICZ1aXQ7CisgICAgfQorICAgIGlmKCF6bWVxdG8oc2l6ZXRhYltMT05HXSxzaXpldGFiW0xMT05HXSkpeworICAgICAgaWYoem1sZXEodm1heCx0X21heFtMT05HXSkpCisJcmV0dXJuICZ1bHQ7CisgICAgICBlbHNlIGlmKChpJjEpJiZ6dW1sZXEodnVtYXgsdHVfbWF4W0xPTkddKSYmenVtbGVxKHV2YWwsdHVfbWF4W0xPTkddKSkKKwlyZXR1cm4gJnVsdDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnVsbHBvaW50ZXIobnAgcCkKK3sKKyAgaWYocC0+ZmxhZ3MhPUNFWFBSKSByZXR1cm4gMDsKKyAgZXZhbF9jb25zdG4ocCk7IC8qIFRPRE86IGRvIHdlIG5lZWQgdG8gdXNlIG90aGVyIG1lYXN1cmUgdG8gdmVyaWZ5IG51bGwgcG9pbnRlcj8gKi8KKyAgaWYoem1lcXRvKFowLHZtYXgpKSByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCB0eXBlX2V4cHJlc3Npb24yKG5wIHAsdHlwZSAqdHR5cCkKKy8qICBFcnpldWd0IFR5cC1TdHJ1a3R1cmVuIGZ1ZXIgamVkZW4gS25vdGVuIGRlcyBCYXVtZXMgdW5kICAgICAqLworLyogIGxpZWZlcnQgZWlucyB6dXJ1ZWNrLCB3ZW5uIGRlciBCYXVtIG9rIGlzdCwgc29uc3QgMCAgICAgICAgICovCisvKiAgRGllIEJlcmVjaG51bmcgdm9uIEtvbnN0YW50ZW4gdW5kIGFuZGVyZSBWZXJlaW5mYWNodW5nZW4gICAgKi8KKy8qICBzb2xsdGVuIHZpZWxsZWljaHQgaW4gZWlnZW5lIEZ1bmt0aW9uIGtvbW1lbiAgICAgICAgICAgICAgICAqLworeworICBpbnQgb2ssZj1wLT5mbGFncyxtb3B0PWRvbnRvcHQsdHRmOworICB0eXBlICpzaG9ydHR5cDsKKyAgc3RhdGljIGludCBhc3NpZ25vcDsKKyAgaW50IGFvZmxhZzsKKyNpZiBIQVZFX0FPUzQKKyAgbnAgdGhpc3A9MDsKKyNlbmRpZgorI2lmZGVmIEhBVkVfRUNQUAorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgIGlmKCFwKXtpZXJyb3IoMCk7cmV0dXJuKDEpO30KKyAgaWYodHR5cCkgdHRmPXR0eXAtPmZsYWdzJk5ROworICAvKiAgICBpZihwLT5udHlwKSBwcmludGYoIldhcm51bmc6IG50eXAhPTBcbiIpOyovCisgIHAtPmx2YWx1ZT0wOworICBwLT5zaWRlZng9MDsKKyAgb2s9MTsKKyAgaWYoIWVjcHAmJmY9PUNBTEwmJnAtPmxlZnQtPmZsYWdzPT1JREVOVElGSUVSJiYhZmluZF92YXIocC0+bGVmdC0+aWRlbnRpZmllciwwKSl7CisgICAgLyogIGltcGxpeml0ZSBEZWtsYXJhdGlvbiBiZWkgQXVmcnVmIGVpbmVyIEZ1bmt0aW9uICAgICAqLworICAgIHN0cnVjdF9kZWNsYXJhdGlvbiAqc2Q7dHlwZSAqdDtWYXIgKnY7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgZXJyb3IoMTYxLHAtPmxlZnQtPmlkZW50aWZpZXIpOworICAgIGlmKHY9ZmluZF9leHRfdmFyKHAtPmxlZnQtPmlkZW50aWZpZXIpKXsKKyAgICAgIGlmKCFJU0ZVTkModi0+dnR5cC0+ZmxhZ3MpfHx2LT52dHlwLT5uZXh0LT5mbGFncyE9SU5UKXsKKwllcnJvcig2OCxwLT5sZWZ0LT5pZGVudGlmaWVyKTsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICAgIH0KKyAgICAgIHYtPmZsYWdzJj1+Tk9USU5UVTsKKyAgICB9ZWxzZXsJCisgICAgICBzZD1teW1hbGxvYyhzaXplb2YoKnNkKSk7CisgICAgICBzZC0+Y291bnQ9MDsKKyAgICAgIHQ9bmV3X3R5cCgpOworICAgICAgdC0+ZmxhZ3M9RlVOS1Q7CisgICAgICB0LT5leGFjdD1hZGRfc2Qoc2QsRlVOS1QpOworICAgICAgdC0+bmV4dD1uZXdfdHlwKCk7CisgICAgICB0LT5uZXh0LT5mbGFncz1JTlQ7CisgICAgICBhZGRfdmFyKHAtPmxlZnQtPmlkZW50aWZpZXIsdCxFWFRFUk4sMCk7CisgICAgfQorICB9CisjaWYgSEFWRV9BT1M0CisgIGlmKGY9PUNBTEwmJnAtPmxlZnQtPmZsYWdzPT1EU1RSVUNUKXsKKyAgICB0aGlzcD1uZXdfbm9kZSgpOworICAgIHRoaXNwLT5mbGFncz1BRERSRVNTOworICAgIGFvczRlcnI9MDsKKyAgICB0aGlzcC0+bGVmdD1hb3M0X2Nsb25lX3RyZWUocC0+bGVmdC0+bGVmdCk7CisgICAgdGhpc3AtPnJpZ2h0PTA7CisgICAgdGhpc3AtPmFsaXN0PTA7dGhpc3AtPmNsPTA7dGhpc3AtPmRzaXplPTA7dGhpc3AtPm50eXA9MDsKKyAgfQorI2VuZGlmCisjaWYgSEFWRV9FQ1BQCisgIGlmKGVjcHAmJmY9PUNBTEwpeworICAgIGFyZ3VtZW50X2xpc3QgKmFsPXAtPmFsaXN0OworICAgIGlmKGFsLyomJiFhbC0+YXJnLT5udHlwKi8peworICAgICAgd2hpbGUoYWwpeworICAgICAgICBpZighYWwtPmFyZykgaWVycm9yKDApOworICAgICAgICBpZighdHlwZV9leHByZXNzaW9uMihhbC0+YXJnLDApKSByZXR1cm4gMDsKKyAgICAgICAgYWwtPmFyZz1tYWtlcG9pbnRlcihhbC0+YXJnKTsKKyAgICAgICAgaWYodHlwZV91bmNvbXBsZXRlKGFsLT5hcmctPm50eXApKSBlcnJvcigzOSk7CisgICAgICAgIGFsPWFsLT5uZXh0OworICAgICAgfQorICAgIH0KKyAgfQorICBpZihlY3BwJiZmPT1DQUxMKXsKKyAgICBlY3BwX21lcmtfYWw9ZWNwcF9hbDsKKyAgICBlY3BwX2FsPXAtPmFsaXN0OworICB9CisjZW5kaWYKKyAgZG9udG9wdD0wOworICBpZihmPT1BRERSRVNTJiZwLT5sZWZ0LT5mbGFncz09SURFTlRJRklFUikge3AtPmxlZnQtPmZsYWdzfD1DT05TVEFERFI7LypwdXRzKCImY29uc3QiKTsqL30KKyAgaWYodHR5cCYmKGY9PU9SfHxmPT1BTkR8fGY9PVhPUnx8Zj09QUREfHxmPT1TVUJ8fGY9PU1VTFR8fGY9PVBNVUxUfHxmPT1ESVZ8fGY9PU1PRHx8Zj09S09NUExFTUVOVHx8Zj09TUlOVVMpJiYhSVNQT0lOVEVSKHR0eXAtPmZsYWdzKSYmc2hvcnRjdXQoZj09UE1VTFQ/TVVMVDpmLHR0eXAtPmZsYWdzJk5VKSkKKyAgICBzaG9ydHR5cD10dHlwOworICBlbHNlCisgICAgc2hvcnR0eXA9MDsKKyAgaWYoYXNzaWdub3ApeworICAgIGFvZmxhZz0xOworICAgIGFzc2lnbm9wPTA7CisgIH1lbHNlCisgICAgYW9mbGFnPTA7CisKKyAgaWYoIXNob3J0dHlwKXsKKyAgICBpZihmPT1FUVVBTHx8Zj09SU5FUVVBTCl7CisgICAgICBpZihwLT5sZWZ0LT5mbGFncz09QU5EKSBzaG9ydHR5cD1hbmRjb21wKHAtPmxlZnQscC0+cmlnaHQpOworICAgICAgaWYocC0+cmlnaHQtPmZsYWdzPT1BTkQpIHNob3J0dHlwPWFuZGNvbXAocC0+cmlnaHQscC0+bGVmdCk7CisgICAgfQorICB9CisgIGlmKCFzaG9ydHR5cCYmKGY9PUxBTkR8fGY9PUxPUikmJnAtPmxlZnQtPmZsYWdzPT1BTkQpIHNob3J0dHlwPWFuZGNvbXAocC0+bGVmdCwwKTsKKyAgaWYocC0+bGVmdCYmcC0+ZmxhZ3MhPUFTU0lHTk9QKXsKKyAgICBzdHJ1Y3RfZGVjbGFyYXRpb24gKnNkOworICAgIC8qICBiZWkgQVNTSUdOT1Agd2lyZCBkZXIgbGlua2UgWndlaWcgZHVyY2ggZGVuIExpbmsgYmV3ZXJ0ZXQgICovCisgICAgaWYoIXAtPmxlZnQpIGllcnJvcigwKTsKKyAgICBpZihwLT5mbGFncz09Q0FTVCkKKyAgICAgIG9rJj10eXBlX2V4cHJlc3Npb24yKHAtPmxlZnQscC0+bnR5cCk7CisgICAgZWxzZQorICAgICAgb2smPXR5cGVfZXhwcmVzc2lvbjIocC0+bGVmdCxzaG9ydHR5cCk7CisgICAgaWYocC0+bGVmdCkgcC0+c2lkZWZ4fD1wLT5sZWZ0LT5zaWRlZng7CisgICAgaWYoIW9rKSByZXR1cm4gMDsKKyAgfQorICBpZihhb2ZsYWcpeworICAgIGlmKCFwLT5sZWZ0fHwhcC0+cmlnaHQpIGllcnJvcigwKTsKKyAgICBzaG9ydHR5cD1wLT5sZWZ0LT5udHlwOworICAgIHR0eXA9c2hvcnR0eXA7CisgICAgdHRmPXR0eXAtPmZsYWdzJk5ROworICB9CisKKyAgaWYoZj09TEFORHx8Zj09TE9SKXsKKyAgICBzaG9ydHR5cD0wOworICAgIGlmKHAtPnJpZ2h0LT5mbGFncz09QU5EKSBzaG9ydHR5cD1hbmRjb21wKHAtPnJpZ2h0LDApOworICB9CisKKyAgaWYoZj09QUREKXsKKyAgICBpZihwLT5sZWZ0LT5mbGFncz09QUREUkVTU1N8fHAtPmxlZnQtPmZsYWdzPT1BRERSRVNTQXx8cC0+bGVmdC0+ZmxhZ3M9PUFERFJFU1NTKXsKKyAgICAgIHptYXggc3o9c3pvZihwLT5sZWZ0LT5sZWZ0LT5udHlwKTsKKyAgICAgIHNob3J0dHlwPWJlc3RfYWRkaTJwdChzeik7CisgICAgfQorICAgIGlmKChwLT5sZWZ0LT5udHlwLT5mbGFncyZOUSk9PUFSUkFZKXsKKyAgICAgIHptYXggc3o9c3pvZihwLT5sZWZ0LT5udHlwKTsKKyAgICAgIHNob3J0dHlwPWJlc3RfYWRkaTJwdChzeik7CisgICAgICBpZihzaG9ydHR5cCl7CisJbnAgbmV3PW5ld19ub2RlKCk7CisJbmV3LT5mbGFncz1DQVNUOworCW5ldy0+bnR5cD1jbG9uZV90eXAoc2hvcnR0eXApOworCW5ldy0+bGVmdD1wLT5yaWdodDsKKwlwLT5yaWdodD1uZXc7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKHAtPnJpZ2h0JiZwLT5yaWdodC0+ZmxhZ3MhPU1FTUJFUil7CisgICAgc3RydWN0X2RlY2xhcmF0aW9uICpzZDsKKyAgICBpZihwLT5mbGFncz09QVNTSUdOT1ApeworICAgICAgZG9udG9wdD0xOworICAgICAgYXNzaWdub3A9MTsKKyAgICB9ZWxzZQorICAgICAgZG9udG9wdD0wOworICAgIGlmKHAtPmZsYWdzPT1BU1NJR04pCisgICAgICBvayY9dHlwZV9leHByZXNzaW9uMihwLT5yaWdodCxwLT5sZWZ0LT5udHlwKTsKKyAgICBlbHNlCisgICAgICBvayY9dHlwZV9leHByZXNzaW9uMihwLT5yaWdodCxzaG9ydHR5cCk7CisgICAgcC0+c2lkZWZ4fD1wLT5yaWdodC0+c2lkZWZ4OworICAgIGlmKCFvaykgcmV0dXJuIDA7CisgIH0KKyNpZiBIQVZFX0FPUzQKKyAgaWYodGhpc3ApeworICAgIGlmKGFvczRfYXR0cihwLT5sZWZ0LT5udHlwLCJsaWJjYWxsIikpeworICAgICAgYXJndW1lbnRfbGlzdCAqbj1teW1hbGxvYyhzaXplb2YoKm4pKTsKKyAgICAgIG4tPmFyZz10aGlzcDsKKyAgICAgIG4tPm5leHQ9cC0+YWxpc3Q7CisgICAgICBuLT5wdXNoaWM9MDsKKyAgICAgIHAtPmFsaXN0PW47CisgICAgICBpZihhb3M0ZXJyKSB7cHJlKHN0ZG91dCx0aGlzcCk7aWVycm9yKDApO30KKyAgICB9ZWxzZXsKKyAgICAgIGZyZWVfZXhwcmVzc2lvbih0aGlzcCk7CisgICAgfQorICB9CisjZW5kaWYKKyNpZiBIQVZFX0VDUFAKKyAgaWYoZWNwcCYmZj09Q0FMTCl7CisgICAgZWNwcF9hbD1lY3BwX21lcmtfYWw7CisgIH0KKyNlbmRpZgorLyogICAgcHJpbnRmKCJiZWFyYmVpdGUgJXNcbiIsZW5hbWVbcC0+ZmxhZ3NdKTsqLworLyogIEVyemV1Z3VuZyB2b24gWmVpZ2VybiBhdXMgQXJyYXlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSGllciBtdXNzIG5vY2ggZWluaWdlcyBnZW5hdWVyIHdlcmRlbiAod2llIGdlaG9lcnQgZGFzPykgICAgKi8KKyAgaWYocC0+bGVmdCYmZiE9UENFWFBSJiYoSVNBUlJBWShwLT5sZWZ0LT5udHlwLT5mbGFncyl8fElTRlVOQyhwLT5sZWZ0LT5udHlwLT5mbGFncykpKXsKKyAgICBpZihmIT1BRERSRVNTJiZmIT1BRERSRVNTQSYmZiE9QUREUkVTU1MmJmYhPUZJUlNURUxFTUVOVCYmZiE9RFNUUlVDVCYmKGY8UFJFSU5DfHxmPlBPU1RERUMpJiYoZjxBU1NJR058fGY+QVNTSUdOT1ApKXsKKyAgICAgIG5wIG5ldz1uZXdfbm9kZSgpOworICAgICAgem1heCBzej1zem9mKHAtPmxlZnQtPm50eXApOworICAgICAgaWYoKHAtPmxlZnQtPm50eXAtPmZsYWdzJk5RKT09QVJSQVkpIG5ldy0+ZmxhZ3M9QUREUkVTU0E7CisgICAgICBlbHNlIG5ldy0+ZmxhZ3M9QUREUkVTUzsKKyAgICAgIG5ldy0+bnR5cD0wOworICAgICAgbmV3LT5sZWZ0PXAtPmxlZnQ7CisgICAgICBuZXctPnJpZ2h0PTA7bmV3LT5sdmFsdWU9MDtuZXctPnNpZGVmeD0wOyAvKiBzaW5kIHNpZGVmeCBpbW1lciAwPyAqLworICAgICAgcC0+bGVmdD1uZXc7CisgICAgICBvayY9dHlwZV9leHByZXNzaW9uMihwLT5sZWZ0LDApOworICAgIH0KKyAgfQorICBpZihwLT5yaWdodCYmZiE9UENFWFBSJiZmIT1GSVJTVEVMRU1FTlQmJmYhPURTVFJVQ1QmJmYhPUFERFJFU1NTJiZwLT5yaWdodC0+bnR5cCYmKElTQVJSQVkocC0+cmlnaHQtPm50eXAtPmZsYWdzKXx8SVNGVU5DKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpKXsKKyAgICBucCBuZXc9bmV3X25vZGUoKTsKKyAgICBpZihJU0FSUkFZKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpIG5ldy0+ZmxhZ3M9QUREUkVTU0E7CisgICAgZWxzZSBuZXctPmZsYWdzPUFERFJFU1M7CisgICAgbmV3LT5udHlwPTA7CisgICAgbmV3LT5sZWZ0PXAtPnJpZ2h0OworICAgIG5ldy0+cmlnaHQ9MDtuZXctPmx2YWx1ZT0wO25ldy0+c2lkZWZ4PTA7IC8qIHNpbmQgc2lkZWZ4IGltbWVyIDA/ICovCisgICAgcC0+cmlnaHQ9bmV3OworICAgIG9rJj10eXBlX2V4cHJlc3Npb24yKHAtPnJpZ2h0LDApOworICB9CisKKyAgaWYoZj09SURFTlRJRklFUnx8Zj09KElERU5USUZJRVJ8Q09OU1RBRERSKSl7CisgICAgaW50IGZmO1ZhciAqdjsKKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgIGlmKCFlY3BwKXsKKyAgICAgIGlmKHAtPmlkZW50aWZpZXI9PWVtcHR5KQorCS8qIHZhcmlhYmxlIHNpemVvZi1leHByZXNzaW9uICovCisJdj1wLT5kc2l6ZTsKKyAgICAgIGVsc2V7CisJY2hhciBidWZbMjBdOworCXY9ZmluZF92YXIocC0+aWRlbnRpZmllciwwKTsKKwlpZih2JiZ2LT5zdG9yYWdlX2NsYXNzPT1FWFRFUk4peworCSAgaWYoIXN0cmNtcChwLT5pZGVudGlmaWVyLCJzdHJ0b2QiKSl7c3ByaW50ZihidWYsInZmc2NhbmYuJWxkIiwxfFVTRUZMT0FUKTtuZWVkcyhidWYpO30KKwkgIGlmKCFzdHJjbXAocC0+aWRlbnRpZmllciwic3RydG9mIikpe3NwcmludGYoYnVmLCJ2c2NhbmYuJWxkIiwxfFVTRUZMT0FUKTtuZWVkcyhidWYpO30KKwkgIGlmKCFzdHJjbXAocC0+aWRlbnRpZmllciwiYXRvZiIpKXtzcHJpbnRmKGJ1ZiwidnNjYW5mLiVsZCIsMXxVU0VGTE9BVCk7bmVlZHMoYnVmKTt9CisJICBpZighc3RyY21wKHAtPmlkZW50aWZpZXIsInRtcG5hbSIpKXtzcHJpbnRmKGJ1ZiwidmZwcmludGYuJWxkIiwxfFVTRURFQyk7bmVlZHMoYnVmKTt9CisJICBpZighc3RyY21wKHAtPmlkZW50aWZpZXIsImZvcGVuIikpeworCSAgICBuZWVkcygiX19yZWFkLjIiKTsKKwkgICAgbmVlZHMoIl9fd3JpdGUuMiIpOworCSAgICBuZWVkcygic3RkaW4uMiIpOworCSAgICBuZWVkcygic3Rkb3V0LjIiKTsKKwkgICAgbmVlZHMoInN0ZGVyci4yIik7CisJICB9CisJfQorICAgICAgfQorICAgIH0KKyAgICBpZih2PT0wKXtlcnJvcig4MixwLT5pZGVudGlmaWVyKTtyZXR1cm4oMCk7fQorICAgIGlmKGRpc2FsbG93X3N0YXRpY3MmJnYtPnN0b3JhZ2VfY2xhc3M9PVNUQVRJQyYmdi0+bmVzdGluZz09MCYmKnYtPmlkZW50aWZpZXIpeworICAgICAgZXJyb3IoMzAyLHYtPmlkZW50aWZpZXIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGZmPXYtPnZ0eXAtPmZsYWdzJk5ROworICAgIGlmKElTQVJJVEgoZmYpfHxJU1BPSU5URVIoZmYpfHxJU1NUUlVDVChmZil8fElTVU5JT04oZmYpfHxJU1ZFQ1RPUihmZikpIHAtPmx2YWx1ZT0xOworICAgIHAtPm50eXA9Y2xvbmVfdHlwKHYtPnZ0eXApOworICAgIC8qICBhcml0aG1ldGlzY2hlbiBjb25zdCBUeXAgYWxzIEtvbnN0YW50ZSBiZWhhbmRlbG4sIGRhcyBtdXNzIG5vY2gKKwlkZXV0bGljaCBhbmRlcnMgd2VyZGVuLCBiZXZvciBtYW4gZXMgd2lya2xpY2ggc28gbWFjaGVuIGthbm4KKyAgICAgICAgaWYoKHAtPm50eXAtPmZsYWdzJkNPTlNUKSYmSVNBUklUSChwLT5udHlwLT5mbGFncykmJnYtPmNsaXN0JiYhKGYmQ09OU1RBRERSKSl7CisJcC0+ZmxhZ3M9Q0VYUFI7CisJcC0+dmFsPXYtPmNsaXN0LT52YWw7CisJdi0+ZmxhZ3N8PVVTRURBU1NPVVJDRTsKKyAgICAgICAgfSovCisgICAgcC0+ZmxhZ3MmPX5DT05TVEFERFI7CisgICAgaWYoKHAtPm50eXAtPmZsYWdzJk5RKT09RU5VTSl7CisgICAgICAvKiAgZW51bWVyYXRpb25zIGF1Y2ggYWxzIEtvbnN0YW50ZSAoaW50KSBiZWhhbmRlbG4gKi8KKyAgICAgIHAtPmZsYWdzPUNFWFBSOworICAgICAgaWYoIXYtPmNsaXN0KSBpZXJyb3IoMCk7CisgICAgICBwLT52YWw9di0+Y2xpc3QtPnZhbDsKKyAgICAgIHAtPm50eXAtPmZsYWdzPUNPTlNUfElOVDsKKyAgICB9CisgICAgcC0+by52PXY7CisgICAgaWYgKHAtPm50eXAtPmZsYWdzJlZPTEFUSUxFKSBwLT5zaWRlZng9MTsgLyogVG91Y2hpbmcgYSB2b2xhdGlsZSBtYXkgaGF2ZSBzaWRlIGVmZmVjdHMgKi8KKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmKGY9PUNFWFBSfHxmPT1QQ0VYUFJ8fGY9PVNUUklORykgcmV0dXJuIDE7CisKKyAgaWYoZj09UkVJTlRFUlBSRVQpeworICAgIC8qIHRvZG86IGFkZCBjaGVja3MgKi8KKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmKGY9PUJJVEZJRUxEKSByZXR1cm4gMTsKKworICBpZihmPT1MSVRFUkFMKXsKKyAgICBwLT5sdmFsdWU9MTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmKGY9PUtPTU1BKXsKKyAgICBpZihjb25zdF9leHByKXtlcnJvcig0Nik7cmV0dXJuIDA7fQorICAgIHAtPm50eXA9Y2xvbmVfdHlwKHAtPnJpZ2h0LT5udHlwKTsKKyAgICBpZihmPT1DRVhQUikgcC0+dmFsPXAtPnJpZ2h0LT52YWw7CisgICAgcmV0dXJuIG9rOworICB9CisgIGlmKGY9PUFTU0lHTnx8Zj09QVNTSUdOT1ApeworICAgIGlmKCFwKSBpZXJyb3IoMCk7CisgICAgaWYoIXAtPmxlZnQpIGllcnJvcigwKTsKKyAgICBpZihwLT5sZWZ0LT5sdmFsdWU9PTApIHtlcnJvcig4Nik7LypwcmQocC0+bGVmdC0+bnR5cCk7Ki9yZXR1cm4gMDt9CisgICAgaWYoY29uc3RfdHlwKHAtPmxlZnQtPm50eXApKSB7ZXJyb3IoODcpO3JldHVybiAwO30KKyAgICBpZih0eXBlX3VuY29tcGxldGUocC0+bGVmdC0+bnR5cCkpIHtlcnJvcig4OCk7cmV0dXJuIDA7fQorICAgIGlmKHR5cGVfdW5jb21wbGV0ZShwLT5yaWdodC0+bnR5cCkpIHtlcnJvcig4OCk7cmV0dXJuIDA7fQorICAgIHAtPm50eXA9Y2xvbmVfdHlwKHAtPmxlZnQtPm50eXApOworICAgIHAtPnNpZGVmeD0xOworICAgIHJldHVybih0ZXN0X2Fzc2lnbm1lbnQocC0+bGVmdC0+bnR5cCxwLT5yaWdodCkpOworICB9CisgIGlmKGY9PUxPUnx8Zj09TEFORCl7CisgICAgaW50IGExPS0xLGEyPS0xLG07CisgICAgaWYoSVNWRUNUT1IocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXsKKyAgICAgIGlmKElTVkVDVE9SKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpeworCWlmKChwLT5sZWZ0LT5udHlwLT5mbGFncyZOVSkhPShwLT5yaWdodC0+bnR5cC0+ZmxhZ3MmTlUpKXtlcnJvcig4OSk7cmV0dXJuIDA7fQorICAgICAgfWVsc2V7CisJaWYoIUlTSU5UKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpe2Vycm9yKDg5KTtyZXR1cm4gMDt9CisgICAgICB9CisgICAgICBwLT5udHlwPW5ld190eXAoKTsKKyAgICAgIHAtPm50eXAtPmZsYWdzPXAtPmxlZnQtPm50eXAtPmZsYWdzJk5ROworICAgICAgcmV0dXJuIG9rOworICAgIH0KKyAgICBpZihJU1ZFQ1RPUihwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpKXsKKyAgICAgIGlmKCFJU0lOVChwLT5sZWZ0LT5udHlwLT5mbGFncykpe2Vycm9yKDg5KTtyZXR1cm4gMDt9CisgICAgICBwLT5udHlwLT5mbGFncz1wLT5yaWdodC0+bnR5cC0+ZmxhZ3MmTlE7CisgICAgICByZXR1cm4gb2s7CisgICAgfQorICAgIGlmKGY9PUxBTkQpIG09MTsgZWxzZSBtPTA7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgcC0+bnR5cD1uZXdfdHlwKCk7CisgICAgcC0+bnR5cC0+ZmxhZ3M9SU5UOworICAgIGlmKCFJU0FSSVRIKHAtPmxlZnQtPm50eXAtPmZsYWdzKSYmIUlTUE9JTlRFUihwLT5sZWZ0LT5udHlwLT5mbGFncykpCisgICAgICB7ZXJyb3IoODkpO29rPTA7fQorICAgIGlmKCFJU0FSSVRIKHAtPnJpZ2h0LT5udHlwLT5mbGFncykmJiFJU1BPSU5URVIocC0+cmlnaHQtPm50eXAtPmZsYWdzKSkKKyAgICAgIHtlcnJvcig4OSk7b2s9MDt9CisgICAgaWYocC0+bGVmdC0+ZmxhZ3M9PUNFWFBSKXsKKyAgICAgIGV2YWxfY29uc3RuKHAtPmxlZnQpOworICAgICAgaWYoIXpsZGVxdG8odmxkb3VibGUsZDJ6bGQoMC4wKSl8fCF6dW1lcXRvKHZ1bWF4LHVsMnp1bSgwVUwpKXx8IXptZXF0byh2bWF4LGwyem0oMEwpKSkgYTE9MTsgZWxzZSBhMT0wOworICAgIH0KKyAgICBpZihwLT5yaWdodC0+ZmxhZ3M9PUNFWFBSKXsKKyAgICAgIGV2YWxfY29uc3RuKHAtPnJpZ2h0KTsKKyAgICAgIGlmKCF6bGRlcXRvKHZsZG91YmxlLGQyemxkKDAuMCkpfHwhenVtZXF0byh2dW1heCx1bDJ6dW0oMFVMKSl8fCF6bWVxdG8odm1heCxsMnptKDBMKSkpIGEyPTE7IGVsc2UgYTI9MDsKKyAgICB9CisgICAgaWYoYTE9PTEtbXx8YTI9PTEtbXx8KGExPT1tJiZhMj09bSkpeworICAgICAgcC0+ZmxhZ3M9Q0VYUFI7cC0+c2lkZWZ4PTA7CisgICAgICBpZighcC0+bGVmdC0+c2lkZWZ4KSB7ZnJlZV9leHByZXNzaW9uKHAtPmxlZnQpO3AtPmxlZnQ9MDt9IGVsc2UgcC0+c2lkZWZ4PTE7CisgICAgICBpZighcC0+cmlnaHQtPnNpZGVmeHx8YTE9PTEtbSkge2ZyZWVfZXhwcmVzc2lvbihwLT5yaWdodCk7cC0+cmlnaHQ9MDt9IGVsc2UgcC0+c2lkZWZ4PTA7CisgICAgICBpZihhMT09MS1tfHxhMj09MS1tKSB7cC0+dmFsLnZpbnQ9em0yemkobDJ6bSgobG9uZykoMS1tKSkpO30KKyAgICAgIGVsc2Uge3AtPnZhbC52aW50PXptMnppKGwyem0oKGxvbmcpbSkpO30KKyAgICB9CisgICAgcmV0dXJuIG9rOworICB9CisgIGlmKGY9PU9SfHxmPT1BTkR8fGY9PVhPUil7CisgICAgaWYoSVNWRUNUT1IocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXsKKyAgICAgIGlmKCFJU0lOVChWRUNUWVBFKHAtPmxlZnQtPm50eXAtPmZsYWdzKSkpe2Vycm9yKDkwKTtyZXR1cm4gMDt9CisgICAgICBpZihJU1ZFQ1RPUihwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpKXsKKwlpZigocC0+bGVmdC0+bnR5cC0+ZmxhZ3MmTlUpIT0ocC0+cmlnaHQtPm50eXAtPmZsYWdzJk5VKSl7ZXJyb3IoOTgpO3JldHVybiAwO30KKyAgICAgIH1lbHNleworCWlmKCFJU0lOVChwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpKXtlcnJvcig5MCk7cmV0dXJuIDA7fQorICAgICAgfQorICAgICAgcC0+bnR5cD1jbG9uZV90eXAocC0+bGVmdC0+bnR5cCk7CisgICAgICByZXR1cm4gb2s7CisgICAgfQorICAgIGlmKElTVkVDVE9SKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpeworICAgICAgaWYoIUlTSU5UKFZFQ1RZUEUocC0+cmlnaHQtPm50eXAtPmZsYWdzKSkpe2Vycm9yKDkwKTtyZXR1cm4gMDt9CisgICAgICBpZighSVNJTlQocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXtlcnJvcig5MCk7cmV0dXJuIDA7fQorICAgICAgcC0+bnR5cD1jbG9uZV90eXAocC0+cmlnaHQtPm50eXApOworICAgICAgcmV0dXJuIG9rOworICAgIH0KKyAgICBpZighSVNJTlQocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXtlcnJvcig5MCk7cmV0dXJuIDA7fQorICAgIGlmKCFJU0lOVChwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpKXtlcnJvcig5MCk7cmV0dXJuIDA7fQorI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgIGlmKHR0eXAmJmRlY2lkZV9zaG9ydGN1dChwLHR0eXApKQorICAgICAgcC0+bnR5cD1jbG9uZV90eXAodHR5cCk7CisgICAgZWxzZQorICAgICAgcC0+bnR5cD1hcml0aF90eXAocC0+bGVmdC0+bnR5cCxwLT5yaWdodC0+bnR5cCk7CisgICAgaWYoIW1vcHQpeworICAgICAgaWYoIWFsZ19vcHQocCx0dHlwKSkgaWVycm9yKDApOworICAgIH0KKyAgICByZXR1cm4gb2s7CisgIH0KKyAgaWYoZj09TEVTU3x8Zj09TEVTU0VRfHxmPT1HUkVBVEVSfHxmPT1HUkVBVEVSRVF8fGY9PUVRVUFMfHxmPT1JTkVRVUFMKXsKKyAgICAvKiAgaGllciBub2NoIGVpbmlnZSBBYmZyYWdlbiBmdWVyIHNpY2hlcmUgRW50c2NoZWlkdW5nZW4gZWluYmF1ZW4gICovCisgICAgLyogIHouQi4gdW5pZ25lZC9zaWduZWQtVmVyZ2xlaWNoZSBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICBkaWUgdmFsLnZpbnQ9MC8xLVp1d2Vpc3VuZ2VuIG11ZXNzZW4gbm9jaCBhbiB6aW50IGFuZ2VwYXNzdCAgICAgKi8KKyAgICAvKiAgd2VyZGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgem1heCBzMSxzMjt6dW1heCB1MSx1Mjt6bGRvdWJsZSBkMSxkMjtpbnQgYz0wOworICAgIHR5cGUgKnQ7CisgICAgaWYoSVNWRUNUT1IocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXsKKyAgICAgIGlmKElTVkVDVE9SKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpeworCWlmKChwLT5sZWZ0LT5udHlwLT5mbGFncyZOVSkhPShwLT5yaWdodC0+bnR5cC0+ZmxhZ3MmTlUpKXtlcnJvcig4OSk7cmV0dXJuIDA7fQorICAgICAgfQorICAgICAgcC0+bnR5cD1uZXdfdHlwKCk7CisgICAgICBpZihJU0ZMT0FUKFZFQ1RZUEUocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKSkKKwlwLT5udHlwLT5mbGFncz1ta3ZlYyhJTlQsVkVDRElNKHAtPmxlZnQtPm50eXAtPmZsYWdzKSk7CisgICAgICBlbHNlCisJcC0+bnR5cC0+ZmxhZ3M9cC0+bGVmdC0+bnR5cC0+ZmxhZ3MmTlE7CisgICAgICByZXR1cm4gb2s7CisgICAgfQorICAgIGlmKElTVkVDVE9SKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpeworICAgICAgcC0+bnR5cD1uZXdfdHlwKCk7CisgICAgICBpZihJU0ZMT0FUKFZFQ1RZUEUocC0+cmlnaHQtPm50eXAtPmZsYWdzKSkpCisJcC0+bnR5cC0+ZmxhZ3M9bWt2ZWMoSU5ULFZFQ0RJTShwLT5sZWZ0LT5udHlwLT5mbGFncykpOworICAgICAgZWxzZQorCXAtPm50eXAtPmZsYWdzPXAtPnJpZ2h0LT5udHlwLT5mbGFncyZOUTsKKyAgICAgIHJldHVybiBvazsKKyAgICB9CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgaWYoIUlTQVJJVEgocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpfHwhSVNBUklUSChwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpKXsKKyAgICAgIGlmKCFJU1BPSU5URVIocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpfHwhSVNQT0lOVEVSKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpeworCWlmKGYhPUVRVUFMJiZmIT1JTkVRVUFMKXsKKwkgIGVycm9yKDkyKTtyZXR1cm4gMDsKKwl9ZWxzZXsKKwkgIGlmKCghSVNQT0lOVEVSKHAtPmxlZnQtPm50eXAtPmZsYWdzKXx8cC0+cmlnaHQtPmZsYWdzIT1DRVhQUikmJgorCSAgICAgKCFJU1BPSU5URVIocC0+cmlnaHQtPm50eXAtPmZsYWdzKXx8cC0+bGVmdC0+ZmxhZ3MhPUNFWFBSKSl7CisJICAgIGVycm9yKDkzKTtyZXR1cm4gMDsKKwkgIH1lbHNleworCSAgICBpZihwLT5sZWZ0LT5mbGFncz09Q0VYUFIpIGV2YWxfY29uc3RuKHAtPmxlZnQpOworCSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgZXZhbF9jb25zdG4ocC0+cmlnaHQpOworCSAgICBpZighemxkZXF0byh2bGRvdWJsZSxkMnpsZCgwLjApKXx8IXptZXF0byh2bWF4LGwyem0oMEwpKXx8IXp1bWVxdG8odnVtYXgsdWwyenVtKDBVTCkpKQorCSAgICAgIHtlcnJvcig0MCk7cmV0dXJuIDA7fQorCSAgfQorCX0KKyAgICAgIH1lbHNleworCWlmKGNvbXBhdGlibGVfdHlwZXMocC0+bGVmdC0+bnR5cC0+bmV4dCxwLT5yaWdodC0+bnR5cC0+bmV4dCxOUSkpeworCX1lbHNleworCSAgaWYoZiE9RVFVQUwmJmYhPUlORVFVQUwpIGVycm9yKDQxKTsKKwkgIGlmKChwLT5sZWZ0LT5udHlwLT5uZXh0LT5mbGFncyZOUSkhPVZPSUQmJihwLT5yaWdodC0+bnR5cC0+bmV4dC0+ZmxhZ3MmTlEpIT1WT0lEKQorCSAgICB7ZXJyb3IoNDEpO30KKwl9CisgICAgICB9CisgICAgfQorICAgIGlmKHAtPmxlZnQtPmZsYWdzPT1DRVhQUil7CisgICAgICBldmFsX2NvbnN0bihwLT5sZWZ0KTsKKyAgICAgIGQxPXZsZG91YmxlO3UxPXZ1bWF4O3MxPXZtYXg7Y3w9MTsKKyAgICAgIGlmKChwLT5yaWdodC0+bnR5cC0+ZmxhZ3MmVU5TSUdORUQpJiYhKHAtPmxlZnQtPm50eXAtPmZsYWdzJlVOU0lHTkVEKSl7CisJaWYoemxkbGVxKGQxLGQyemxkKDAuMCkpJiZ6bWxlcShzMSxsMnptKDBMKSkpeworCSAgaWYoIXpsZGVxdG8oZDEsZDJ6bGQoMC4wKSl8fCF6bWVxdG8oczEsbDJ6bSgwTCkpKXsKKwkgICAgaWYoenVtbGVxKHR1X21heFtwLT5yaWdodC0+bnR5cC0+ZmxhZ3MmTlFdLHRfbWF4W3AtPmxlZnQtPm50eXAtPmZsYWdzJk5RXSkpCisJICAgICAgZXJyb3IoMTY1KTsKKwkgIH1lbHNleworCSAgICBpZihmPT1HUkVBVEVSfHxmPT1MRVNTRVEpIGVycm9yKDE2NSk7CisJICB9CisJfQorICAgICAgfQorICAgIH0KKyAgICBpZihwLT5yaWdodC0+ZmxhZ3M9PUNFWFBSKXsKKyAgICAgIGV2YWxfY29uc3RuKHAtPnJpZ2h0KTsKKyAgICAgIGQyPXZsZG91YmxlO3UyPXZ1bWF4O3MyPXZtYXg7Y3w9MjsKKyAgICAgIGlmKChwLT5sZWZ0LT5udHlwLT5mbGFncyZVTlNJR05FRCkmJiEocC0+cmlnaHQtPm50eXAtPmZsYWdzJlVOU0lHTkVEKSl7CisJaWYoemxkbGVxKGQyLGQyemxkKDAuMCkpJiZ6bWxlcShzMixsMnptKDBMKSkpeworCSAgaWYoIXpsZGVxdG8oZDIsZDJ6bGQoMC4wKSl8fCF6bWVxdG8oczIsbDJ6bSgwTCkpKXsKKwkgICAgaWYoenVtbGVxKHR1X21heFtwLT5sZWZ0LT5udHlwLT5mbGFncyZOUV0sdF9tYXhbcC0+cmlnaHQtPm50eXAtPmZsYWdzJk5RXSkpCisJICAgICAgZXJyb3IoMTY1KTsKKwkgIH1lbHNleworCSAgICBpZihmPT1MRVNTfHxmPT1HUkVBVEVSRVEpIGVycm9yKDE2NSk7CisJICB9CisJfQorICAgICAgfQorICAgIH0KKyAgICBwLT5udHlwPW5ld190eXAoKTsKKyAgICBwLT5udHlwLT5mbGFncz1JTlQ7CisgICAgaWYoYz09Myl7CisgICAgICBwLT5mbGFncz1DRVhQUjsKKyAgICAgIHQ9YXJpdGhfdHlwKHAtPmxlZnQtPm50eXAscC0+cmlnaHQtPm50eXApOworICAgICAgaWYoIXAtPmxlZnQtPnNpZGVmeCkge2ZyZWVfZXhwcmVzc2lvbihwLT5sZWZ0KTtwLT5sZWZ0PTA7fQorICAgICAgaWYoIXAtPnJpZ2h0LT5zaWRlZngpIHtmcmVlX2V4cHJlc3Npb24ocC0+cmlnaHQpO3AtPnJpZ2h0PTA7fQorICAgICAgaWYoSVNGTE9BVCh0LT5mbGFncykpeworCWlmKGY9PUVRVUFMKSBwLT52YWwudmludD16bTJ6aShsMnptKChsb25nKXpsZGVxdG8oZDEsZDIpKSk7CisJaWYoZj09SU5FUVVBTCkgcC0+dmFsLnZpbnQ9em0yemkobDJ6bSgobG9uZykhemxkZXF0byhkMSxkMikpKTsKKwlpZihmPT1MRVNTRVEpIHAtPnZhbC52aW50PXptMnppKGwyem0oKGxvbmcpemxkbGVxKGQxLGQyKSkpOworCWlmKGY9PUdSRUFURVIpIHAtPnZhbC52aW50PXptMnppKGwyem0oKGxvbmcpIXpsZGxlcShkMSxkMikpKTsKKwlpZihmPT1MRVNTKXsKKwkgIGlmKHpsZGxlcShkMSxkMikmJiF6bGRlcXRvKGQxLGQyKSkKKwkgICAgcC0+dmFsLnZpbnQ9em0yemkobDJ6bSgxTCkpOworCSAgZWxzZQorCSAgICBwLT52YWwudmludD16bTJ6aShsMnptKDBMKSk7CisJfQorCWlmKGY9PUdSRUFURVJFUSl7CisJICBpZighemxkbGVxKGQxLGQyKXx8emxkZXF0byhkMSxkMikpCisJICAgIHAtPnZhbC52aW50PXptMnppKGwyem0oMUwpKTsKKwkgIGVsc2UKKwkgICAgcC0+dmFsLnZpbnQ9em0yemkobDJ6bSgwTCkpOworCX0KKyAgICAgIH1lbHNleworCWlmKHQtPmZsYWdzJlVOU0lHTkVEKXsKKwkgIGlmKGY9PUVRVUFMKSBwLT52YWwudmludD16bTJ6aShsMnptKChsb25nKXp1bWVxdG8odTEsdTIpKSk7CisJICBpZihmPT1JTkVRVUFMKSBwLT52YWwudmludD16bTJ6aShsMnptKChsb25nKSF6dW1lcXRvKHUxLHUyKSkpOworCSAgaWYoZj09TEVTU0VRKSBwLT52YWwudmludD16bTJ6aShsMnptKChsb25nKXp1bWxlcSh1MSx1MikpKTsKKwkgIGlmKGY9PUdSRUFURVIpIHAtPnZhbC52aW50PXptMnppKGwyem0oKGxvbmcpIXp1bWxlcSh1MSx1MikpKTsKKwkgIGlmKGY9PUxFU1MpeworCSAgICBpZih6dW1sZXEodTEsdTIpJiYhenVtZXF0byh1MSx1MikpCisJICAgICAgcC0+dmFsLnZpbnQ9em0yemkobDJ6bSgxTCkpOworCSAgICBlbHNlCisJICAgICAgcC0+dmFsLnZpbnQ9em0yemkobDJ6bSgwTCkpOworCSAgfQorCSAgaWYoZj09R1JFQVRFUkVRKXsKKwkgICAgaWYoIXp1bWxlcSh1MSx1Mil8fHp1bWVxdG8odTEsdTIpKQorCSAgICAgIHAtPnZhbC52aW50PXptMnppKGwyem0oMUwpKTsKKwkgICAgZWxzZSAKKwkgICAgICBwLT52YWwudmludD16bTJ6aShsMnptKDBMKSk7CisJICB9CisJfWVsc2V7CisJICBpZihmPT1FUVVBTCkgcC0+dmFsLnZpbnQ9em0yemkobDJ6bSgobG9uZyl6bWVxdG8oczEsczIpKSk7CisJICBpZihmPT1JTkVRVUFMKSBwLT52YWwudmludD16bTJ6aShsMnptKChsb25nKSF6bWVxdG8oczEsczIpKSk7CisJICBpZihmPT1MRVNTRVEpIHAtPnZhbC52aW50PXptMnppKGwyem0oKGxvbmcpem1sZXEoczEsczIpKSk7CisJICBpZihmPT1HUkVBVEVSKSBwLT52YWwudmludD16bTJ6aShsMnptKChsb25nKSF6bWxlcShzMSxzMikpKTsKKwkgIGlmKGY9PUxFU1MpeworCSAgICBpZih6bWxlcShzMSxzMikmJiF6bWVxdG8oczEsczIpKQorCSAgICAgIHAtPnZhbC52aW50PXptMnppKGwyem0oMUwpKTsKKwkgICAgZWxzZSAKKwkgICAgICBwLT52YWwudmludD16bTJ6aShsMnptKDBMKSk7CisJICB9CisJICBpZihmPT1HUkVBVEVSRVEpeworCSAgICBpZighem1sZXEoczEsczIpfHx6bWVxdG8oczEsczIpKQorCSAgICAgIHAtPnZhbC52aW50PXptMnppKGwyem0oMUwpKTsKKwkgICAgZWxzZSAKKwkgICAgICBwLT52YWwudmludD16bTJ6aShsMnptKDBMKSk7CisJICB9CisJfQorICAgICAgfQorICAgICAgZnJlZXR5cCh0KTsKKyAgICB9CisgICAgcmV0dXJuIG9rOworICB9CisgIGlmKGY9PUFERHx8Zj09U1VCfHxmPT1NVUxUfHxmPT1ESVZ8fGY9PU1PRHx8Zj09TFNISUZUfHxmPT1SU0hJRlR8fGY9PVBNVUxUKXsKKyAgICBpZihJU1ZFQ1RPUihwLT5sZWZ0LT5udHlwLT5mbGFncykpeworICAgICAgaWYoKGY9PU1PRHx8Zj09TFNISUZUfHxmPT1SU0hJRlQpJiZJU0ZMT0FUKFZFQ1RZUEUocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKSl7CisJZXJyb3IoOTgpOworCXJldHVybiAwOworICAgICAgfQorICAgICAgaWYoSVNBUklUSChwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpKXsKKwlwLT5udHlwPWNsb25lX3R5cChwLT5sZWZ0LT5udHlwKTsKKwlyZXR1cm4gb2s7CisgICAgICB9CisgICAgICBpZigocC0+bGVmdC0+bnR5cC0+ZmxhZ3MmTlUpPT0ocC0+cmlnaHQtPm50eXAtPmZsYWdzJk5VKSl7CisJcC0+bnR5cD1jbG9uZV90eXAocC0+bGVmdC0+bnR5cCk7CisJcmV0dXJuIG9rOworICAgICAgfQorICAgICAgZXJyb3IoOTgpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmKElTVkVDVE9SKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpeworICAgICAgaWYoKGY9PU1PRHx8Zj09TFNISUZUfHxmPT1SU0hJRlQpJiZJU0ZMT0FUKFZFQ1RZUEUocC0+cmlnaHQtPm50eXAtPmZsYWdzKSkpeworCWVycm9yKDk4KTsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGlmKElTQVJJVEgocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXsKKwlwLT5udHlwPWNsb25lX3R5cChwLT5yaWdodC0+bnR5cCk7CisJcmV0dXJuIG9rOworICAgICAgfQorICAgICAgZXJyb3IoOTgpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmKCFJU0FSSVRIKHAtPmxlZnQtPm50eXAtPmZsYWdzKXx8IUlTQVJJVEgocC0+cmlnaHQtPm50eXAtPmZsYWdzKSl7CisgICAgICBucCBuZXc7em1heCBzejsgaW50IHR5cGY9MDsKKyNpZmRlZiBNQVhBRERJMlAKKyAgICAgIHN0YXRpYyB0eXBlIHBtdD17TUFYQURESTJQfTsKKyNlbmRpZgorICAgICAgaWYoZiE9QUREJiZmIT1TVUIpe2Vycm9yKDk0KTtyZXR1cm4gMDt9CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgICBpZihJU1BPSU5URVIocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXsKKwlpZigocC0+bGVmdC0+bnR5cC0+bmV4dC0+ZmxhZ3MmTlEpPT1WT0lEKQorCSAge2Vycm9yKDk1KTtyZXR1cm4gMDt9CisJaWYoSVNQT0lOVEVSKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpeworCSAgaWYoKHAtPnJpZ2h0LT5udHlwLT5uZXh0LT5mbGFncyZOUSk9PVZPSUQpCisJICAgIHtlcnJvcig5NSk7cmV0dXJuIDA7fQorCSAgaWYoIWNvbXBhdGlibGVfdHlwZXMocC0+bGVmdC0+bnR5cC0+bmV4dCxwLT5yaWdodC0+bnR5cC0+bmV4dCxOUSkpCisJICAgIHtlcnJvcig0MSk7fQorCSAgaWYoZiE9U1VCKXsKKwkgICAgZXJyb3IoOTYpOworCSAgICByZXR1cm4gMDsKKwkgIH1lbHNleworCSAgICB0eXBmPTM7CisJICB9CisJfWVsc2V7CisJICBpZighSVNJTlQocC0+cmlnaHQtPm50eXAtPmZsYWdzKSkKKwkgICAge2Vycm9yKDk3LGVuYW1lW2ZdKTtyZXR1cm4gMDt9CisJICBpZihwLT5yaWdodC0+ZmxhZ3MhPVBNVUxUJiZwLT5yaWdodC0+ZmxhZ3MhPVBDRVhQUil7CisJICAgIG5ldz1uZXdfbm9kZSgpOworCSAgICBuZXctPmZsYWdzPVBNVUxUOworCSAgICBuZXctPm50eXA9MDsKKwkgICAgbmV3LT5sZWZ0PXAtPnJpZ2h0OworCSAgICBuZXctPnJpZ2h0PW5ld19ub2RlKCk7CisJICAgIGlmKGlzX3ZsZW5ndGgocC0+bGVmdC0+bnR5cC0+bmV4dCkpeworCSAgICAgIG5ldy0+cmlnaHQtPmZsYWdzPUlERU5USUZJRVI7CisJICAgICAgbmV3LT5yaWdodC0+aWRlbnRpZmllcj1lbXB0eTsKKwkgICAgICBuZXctPnJpZ2h0LT5kc2l6ZT12bGVuZ3RoX3N6b2YocC0+bGVmdC0+bnR5cC0+bmV4dCk7CisJICAgICAgbmV3LT5yaWdodC0+dmFsLnZtYXg9bDJ6bSgwTCk7CisJICAgICAgbmV3LT5yaWdodC0+c2lkZWZ4PTA7CisJICAgIH1lbHNleworCSAgICAgIG5ldy0+cmlnaHQtPmZsYWdzPVBDRVhQUjsKKwkgICAgICBzej1zem9mKHAtPmxlZnQtPm50eXAtPm5leHQpOworCSAgICAgIGlmKHptZXF0byhsMnptKDBMKSxzeikpIGVycm9yKDc4KTsKKyNpZiBIQVZFX0lOVF9TSVpFVAorCSAgICAgIG5ldy0+cmlnaHQtPnZhbC52aW50PXptMnppKHN6KTsKKyNlbHNlCisJICAgICAgbmV3LT5yaWdodC0+dmFsLnZsb25nPXptMnpsKHN6KTsKKyNlbmRpZgorCSAgICB9CisJICAgIG5ldy0+cmlnaHQtPmxlZnQ9bmV3LT5yaWdodC0+cmlnaHQ9MDsKKwkgICAgbmV3LT5yaWdodC0+bnR5cD1uZXdfdHlwKCk7CisjaWYgSEFWRV9JTlRfU0laRVQKKwkgICAgbmV3LT5yaWdodC0+bnR5cC0+ZmxhZ3M9SU5UOworI2Vsc2UKKwkgICAgbmV3LT5yaWdodC0+bnR5cC0+ZmxhZ3M9TE9ORzsKKyNlbmRpZgorCSAgICBwLT5yaWdodD1uZXc7CisjaWZkZWYgTUFYQURESTJQCisJICAgIG9rJj10eXBlX2V4cHJlc3Npb24yKG5ldywoc2hvcnR0eXAmJihzaG9ydHR5cC0+ZmxhZ3MmTlEpPE1BWEFEREkyUCk/c2hvcnR0eXA6JnBtdCk7CisjZWxzZQorCSAgICBvayY9dHlwZV9leHByZXNzaW9uMihuZXcsc2hvcnR0eXApOworI2VuZGlmCisJICB9CisJICB0eXBmPTE7CisJfQorICAgICAgfWVsc2V7CisJbnAgbWVyazsKKwlpZighSVNQT0lOVEVSKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpCisJICB7ZXJyb3IoOTgpO3JldHVybiAwO30KKwlpZigocC0+cmlnaHQtPm50eXAtPm5leHQtPmZsYWdzJk5RKT09Vk9JRCkKKwkgIHtlcnJvcig5NSk7cmV0dXJuIDA7fQorCWlmKCFJU0lOVChwLT5sZWZ0LT5udHlwLT5mbGFncykpCisJICB7ZXJyb3IoOTgpO3JldHVybiAwO30KKwlpZihwLT5mbGFncz09U1VCKXtlcnJvcig5OSk7cmV0dXJuIDA7fQorCWlmKHAtPmxlZnQtPmZsYWdzIT1QTVVMVCYmcC0+bGVmdC0+ZmxhZ3MhPVBDRVhQUil7CisJICBuZXc9bmV3X25vZGUoKTsKKwkgIG5ldy0+ZmxhZ3M9UE1VTFQ7CisJICBuZXctPm50eXA9MDsKKwkgIG5ldy0+bGVmdD1wLT5sZWZ0OworCSAgbmV3LT5yaWdodD1uZXdfbm9kZSgpOworCSAgaWYoaXNfdmxlbmd0aChwLT5yaWdodC0+bnR5cC0+bmV4dCkpeworCSAgICBuZXctPnJpZ2h0LT5mbGFncz1JREVOVElGSUVSOworCSAgICBuZXctPnJpZ2h0LT5pZGVudGlmaWVyPWVtcHR5OworCSAgICBuZXctPnJpZ2h0LT5kc2l6ZT12bGVuZ3RoX3N6b2YocC0+cmlnaHQtPm50eXAtPm5leHQpOworCSAgICBuZXctPnJpZ2h0LT52YWwudm1heD1sMnptKDBMKTsKKwkgICAgbmV3LT5yaWdodC0+c2lkZWZ4PTA7CisJICB9ZWxzZXsKKwkgICAgbmV3LT5yaWdodC0+ZmxhZ3M9UENFWFBSOworCSAgICBzej1zem9mKHAtPnJpZ2h0LT5udHlwLT5uZXh0KTsKKwkgICAgaWYoem1lcXRvKGwyem0oMEwpLHN6KSkgZXJyb3IoNzgpOworI2lmIEhBVkVfSU5UX1NJWkVUCisJICAgIG5ldy0+cmlnaHQtPnZhbC52aW50PXptMnppKHN6KTsKKyNlbHNlCisJICAgIG5ldy0+cmlnaHQtPnZhbC52bG9uZz16bTJ6bChzeik7CisjZW5kaWYKKwkgIH0KKwkgIG5ldy0+cmlnaHQtPmxlZnQ9bmV3LT5yaWdodC0+cmlnaHQ9MDsKKwkgIG5ldy0+cmlnaHQtPm50eXA9bmV3X3R5cCgpOworI2lmIEhBVkVfSU5UX1NJWkVUCisJICBuZXctPnJpZ2h0LT5udHlwLT5mbGFncz1JTlQ7CisjZWxzZQorCSAgbmV3LT5yaWdodC0+bnR5cC0+ZmxhZ3M9TE9ORzsKKyNlbmRpZgorCSAgcC0+bGVmdD1uZXc7CisjaWZkZWYgTUFYQURESTJQCisJICBvayY9dHlwZV9leHByZXNzaW9uMihuZXcsJnBtdCk7CisjZWxzZQorCSAgb2smPXR5cGVfZXhwcmVzc2lvbjIobmV3LDApOworI2VuZGlmCisJfQorCXR5cGY9MjsKKwltZXJrPXAtPmxlZnQ7cC0+bGVmdD1wLT5yaWdodDtwLT5yaWdodD1tZXJrOworICAgICAgfQorICAgICAgaWYodHlwZj09MCl7aWVycm9yKDApO3JldHVybigwKTt9CisgICAgICBlbHNleworCWlmKHR5cGY9PTMpeworCSAgcC0+bnR5cD1uZXdfdHlwKCk7CisJICBwLT5udHlwLT5mbGFncz1QVFJESUZGX1QocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpOworCX1lbHNleworCSAgLyppZih0eXBmPT0xKSovIHAtPm50eXA9Y2xvbmVfdHlwKHAtPmxlZnQtPm50eXApOworCSAgLyogZWxzZSAgICAgICBwLT5udHlwPWNsb25lX3R5cChwLT5yaWdodC0+bnR5cCk7Ki8KKwkgIC8qICBBYmZyYWdlIHdlZ2VuIFZlcnRhdXNjaGVuIGRlciBLbm90ZW4gdW5ub2V0aWcgICAqLworCX0KKyAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgIGlmKGY9PUxTSElGVHx8Zj09UlNISUZUKXsKKwlpZih0dHlwJiZmPT1MU0hJRlQmJih0dGY8PUlOVHx8dHRmPChwLT5sZWZ0LT5udHlwLT5mbGFncyZOUSkpJiZzaG9ydGN1dChmLHR0eXAtPmZsYWdzJk5VKSl7CisJICBwLT5udHlwPWNsb25lX3R5cCh0dHlwKTsKKwl9ZWxzZSBpZih0dHlwJiZmPT1SU0hJRlQmJnR0Zjw9SU5UJiZ0dGY8PShwLT5sZWZ0LT5udHlwLT5mbGFncyZOUSkmJnNob3J0Y3V0KGYscC0+bGVmdC0+bnR5cC0+ZmxhZ3MmTlUpKXsKKwkgIHAtPm50eXA9Y2xvbmVfdHlwKHAtPmxlZnQtPm50eXApOworCX1lbHNleworCSAgcC0+bnR5cD1hcml0aF90eXAocC0+bGVmdC0+bnR5cCxwLT5sZWZ0LT5udHlwKTsKKwkgIHAtPm50eXAtPmZsYWdzJj1+TlE7CisJICBwLT5udHlwLT5mbGFnc3w9aW50X2VydyhwLT5sZWZ0LT5udHlwLT5mbGFncyk7CisJfQorCWlmKHAtPnJpZ2h0LT5mbGFncz09Q0VYUFIpeworCSAgZXZhbF9jb25zdG4ocC0+cmlnaHQpOworCSAgaWYoIXptbGVxKGwyem0oMEwpLHZtYXgpKSBlcnJvcigzNjYpOworCSAgaWYoem1sZXEoem1tdWx0KHNpemV0YWJbcC0+bnR5cC0+ZmxhZ3MmTlFdLGNoYXJfYml0KSx2bWF4KSYmem1sZXEoem1tdWx0KHNpemV0YWJbcC0+bGVmdC0+bnR5cC0+ZmxhZ3MmTlFdLGNoYXJfYml0KSx2bWF4KSkgZXJyb3IoMzY3KTsKKwl9CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgICB9ZWxzZXsKKwkvKiBnZ2ZzLiBpbiBrbGVpbmVyZW0gWmllbHR5cCBhdXN3ZXJ0ZW4gLSBiZWkgZmxvYXQga2VpbmVuIHNob3J0Y3V0ICh35HJlIGV2dGwuIGRvdWJsZT0+ZmxvYXQgdW5rcml0aXNjaD8pICovCisJaWYodHR5cCYmZGVjaWRlX3Nob3J0Y3V0KHAsdHR5cCkpCisJICBwLT5udHlwPWNsb25lX3R5cCh0dHlwKTsKKwllbHNlCisJICBwLT5udHlwPWFyaXRoX3R5cChwLT5sZWZ0LT5udHlwLHAtPnJpZ2h0LT5udHlwKTsKKwlpZighSVNJTlQocC0+bnR5cC0+ZmxhZ3MpJiYoZj09TU9EfHxmPT1MU0hJRlR8fGY9PVJTSElGVCkpCisJICB7ZXJyb3IoMTAxKTtvaz0wO30KKyAgICAgIH0KKyAgICB9CisgICAgLyogIGZ1ZWd0ICZhK3ggenVzYW1tZW4sIG5vY2ggc3ViIHVuZCBsZWZ0PC0+cmlnaHQgbWFjaGVuICAgKi8KKyAgICAvKiAgQmVpIENFWFBSIHN0YXR0IFBDRVhQUiBhdWNoIG1hY2hlbj8gICAgICAgICAgICAgICAgICAgICAqLworICAgIGlmKChwLT5mbGFncz09QUREfHxwLT5mbGFncz09U1VCKSl7CisgICAgICBucCBtLGM9MCxhPTA7CisgICAgICBpZihwLT5sZWZ0LT5mbGFncz09UENFWFBSJiZwLT5mbGFncz09QUREKSBjPXAtPmxlZnQ7CisgICAgICBpZihwLT5yaWdodC0+ZmxhZ3M9PVBDRVhQUikgYz1wLT5yaWdodDsKKyAgICAgIGlmKHAtPmxlZnQtPmZsYWdzPT1BRERSRVNTfHxwLT5sZWZ0LT5mbGFncz09QUREUkVTU0F8fHAtPmxlZnQtPmZsYWdzPT1BRERSRVNTUykgYT1wLT5sZWZ0OworICAgICAgaWYocC0+cmlnaHQtPmZsYWdzPT1BRERSRVNTfHxwLT5yaWdodC0+ZmxhZ3M9PUFERFJFU1NBfHxwLT5yaWdodC0+ZmxhZ3M9PUFERFJFU1NTKSBhPXAtPnJpZ2h0OworICAgICAgaWYoYyYmYSl7CisJbT1hLT5sZWZ0OworCS8qICBrYW5uIG1hbiBkYXMgaGllciBzbyBtYWNoZW4gb2RlciBtdXNzIG1hbiBkYSBtZWhyIHRlc3RlbiA/ICAqLworCXdoaWxlKG0tPmZsYWdzPT1GSVJTVEVMRU1FTlR8fG0tPmZsYWdzPT1BRERSRVNTfHxtLT5mbGFncz09QUREUkVTU0F8fG0tPmZsYWdzPT1BRERSRVNTUykgbT1tLT5sZWZ0OworCWlmKChtLT5mbGFncz09SURFTlRJRklFUnx8bS0+ZmxhZ3M9PVNUUklORykmJiFpc192bGVuZ3RoKG0tPm50eXApKXsKKwkgIGlmKERFQlVHJjEpIHByaW50ZigiJmEreCB3aXRoICVzIGNvbWJpbmVkXG4iLGVuYW1lW3AtPmxlZnQtPmZsYWdzXSk7CisJICBldmFsX2NvbnN0KCZjLT52YWwsYy0+bnR5cC0+ZmxhZ3MpOworCSAgaWYocC0+ZmxhZ3M9PUFERCkKKwkgICAgbS0+dmFsLnZtYXg9enVtYWRkKG0tPnZhbC52bWF4LHZtYXgpOworCSAgZWxzZSAKKwkgICAgbS0+dmFsLnZtYXg9em1zdWIobS0+dmFsLnZtYXgsdm1heCk7CisJICB2bWF4PXN6b2YobS0+bnR5cCk7CisJICBpZighem1lcXRvKHZtYXgsbDJ6bSgwTCkpJiZ6dW1sZXEodm1heCxtLT52YWwudm1heCkpeworCSAgICBpZih6dW1lcXRvKHZtYXgsbS0+dmFsLnZtYXgpKQorCSAgICAgIGVycm9yKDc5KTsKKwkgICAgZWxzZQorCSAgICAgIGVycm9yKDgwKTsKKwkgIH0KKwkgIHZtYXg9bDJ6bSgwTCk7CisJICBpZighem1lcXRvKG0tPnZhbC52bWF4LGwyem0oMEwpKSYmenVtbGVxKG0tPnZhbC52bWF4LHZtYXgpKSBlcnJvcig4MCk7CisJICBmcmVlX2V4cHJlc3Npb24oYyk7CisJICBpZihwLT5udHlwKSBmcmVldHlwKHAtPm50eXApOworCSAgKnA9KmE7CisJICBmcmVlKGEpOworCSAgcmV0dXJuIHR5cGVfZXhwcmVzc2lvbjIocCwwKTsKKwl9CisgICAgICB9CisgICAgfQorICAgIGlmKCFtb3B0KXsKKyAgICAgIGlmKCFhbGdfb3B0KHAsdHR5cCkpIGllcnJvcigwKTsKKyAgICB9CisgICAgcmV0dXJuIG9rOworICB9CisgIGlmKGY9PUNBU1QpeworICAgIGludCBmcm9tPShwLT5sZWZ0LT5udHlwLT5mbGFncyksdG89KHAtPm50eXAtPmZsYWdzKTsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICBmcm9tJj1OUTt0byY9TlE7CisgICAgaWYodG89PVZPSUQpIHJldHVybiBvazsKKyAgICBpZihmcm9tPT1WT0lEKQorICAgICAge2Vycm9yKDEwMik7cmV0dXJuIDA7fQorICAgIGlmKCghSVNBUklUSCh0byl8fCFJU0FSSVRIKGZyb20pKSYmCisgICAgICAgKCFJU1BPSU5URVIodG8pfHwhSVNQT0lOVEVSKGZyb20pKSl7CisgICAgICBpZihJU1BPSU5URVIodG8pKXsKKwlpZihJU0lOVChmcm9tKSl7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisJICBpZighem1sZXEoc2l6ZXRhYltmcm9tXSxzaXpldGFiW3RvXSkpeworCSAgICBlcnJvcigxMDMpOworCSAgfQorCX1lbHNleworCSAgZXJyb3IoMTA0KTtyZXR1cm4gMDsKKwl9CisgICAgICB9ZWxzZXsKKwlpZighSVNQT0lOVEVSKGZyb20pKQorCSAge2Vycm9yKDEwNSk7cmV0dXJuIDA7fQorCWlmKElTSU5UKHRvKSl7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisJICBpZighem1sZXEoc2l6ZXRhYltmcm9tXSxzaXpldGFiW3RvXSkpeworCSAgICBlcnJvcigxMDYpOworCSAgfQorCX1lbHNleworCSAgZXJyb3IoMTA0KTtyZXR1cm4gMDsKKwl9CisgICAgICB9CisgICAgfQorICAgIGlmKElTSU5UKGZyb20pJiZJU0lOVCh0bykmJiF6bWxlcShzaXpldGFiW2Zyb21dLHNpemV0YWJbdG9dKSYmcC0+bGVmdC0+ZmxhZ3MhPUNFWFBSKSBlcnJvcigxNjYpOworICAgIGlmKElTUE9JTlRFUih0bykmJklTUE9JTlRFUihmcm9tKSYmIXptbGVxKGZhbGlnbihwLT5udHlwLT5uZXh0KSxmYWxpZ24ocC0+bGVmdC0+bnR5cC0+bmV4dCkpKQorICAgICAgZXJyb3IoMTY3KTsKKyAgICBpZihwLT5sZWZ0LT5mbGFncz09Q0VYUFIpeworICAgICAgZXZhbF9jb25zdG4ocC0+bGVmdCk7CisgICAgICBpZihJU1BPSU5URVIocC0+bnR5cC0+ZmxhZ3MpKQorCWlmKCF6dW1lcXRvKHZ1bWF4LHVsMnp1bSgwVUwpKXx8IXptZXF0byh2bWF4LGwyem0oMEwpKXx8IXpsZGVxdG8odmxkb3VibGUsZDJ6bGQoMC4wKSkpCisJICBlcnJvcig4MSk7CisgICAgICBpbnNlcnRfY29uc3RuKHApOworICAgICAgcC0+ZmxhZ3M9Q0VYUFI7CisgICAgICBpZighcC0+bGVmdC0+c2lkZWZ4KXsKKwlpZighbm9fY2FzdF9mcmVlKSAKKwkgIGZyZWVfZXhwcmVzc2lvbihwLT5sZWZ0KTsKKwlwLT5sZWZ0PTA7CisgICAgICB9CisgICAgfQorI2lmZGVmIEhBVkVfRUNQUAorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgcmV0dXJuIG9rOworICB9CisgIGlmKGY9PU1JTlVTfHxmPT1LT01QTEVNRU5UfHxmPT1ORUdBVElPTil7CisgICAgaWYoSVNWRUNUT1IocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXsKKyAgICAgIGlmKGY9PU5FR0FUSU9OKXsKKwlpZihJU0ZMT0FUKFZFQ1RZUEUocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKSl7ZXJyb3IoOTgpO3JldHVybiAwO30KKwlwLT5udHlwPW5ld190eXAoKTsKKwlwLT5udHlwLT5mbGFncz1wLT5sZWZ0LT5udHlwLT5mbGFncyZOUTsKKwlyZXR1cm4gb2s7CisgICAgICB9CisgICAgICBpZihmPT1LT01QTEVNRU5UJiZJU0ZMT0FUKFZFQ1RZUEUocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKSl7ZXJyb3IoMTA5KTtyZXR1cm4gMDt9CisgICAgICBwLT5udHlwPWNsb25lX3R5cChwLT5sZWZ0LT5udHlwKTsKKyAgICAgIHJldHVybiBvazsKKyAgICB9CisgICAgaWYoIUlTQVJJVEgocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXsKKyAgICAgIGlmKGYhPU5FR0FUSU9OKXsKKwllcnJvcigxMDcpO3JldHVybiAwOworICAgICAgfWVsc2V7CisJaWYoIUlTUE9JTlRFUihwLT5sZWZ0LT5udHlwLT5mbGFncykpCisJICB7ZXJyb3IoMTA4KTtyZXR1cm4gMDt9CisgICAgICB9CisgICAgfQorI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgIGlmKGY9PUtPTVBMRU1FTlQmJiFJU0lOVChwLT5sZWZ0LT5udHlwLT5mbGFncykpCisgICAgICB7ZXJyb3IoMTA5KTtyZXR1cm4gMDt9CisgICAgaWYoZj09TkVHQVRJT04peworICAgICAgcC0+bnR5cD1uZXdfdHlwKCk7CisgICAgICBwLT5udHlwLT5mbGFncz1JTlQ7CisgICAgfWVsc2V7CisgICAgICBpZighcC0+bGVmdC0+bnR5cCkgaWVycm9yKDApOworICAgICAgcC0+bnR5cD1jbG9uZV90eXAocC0+bGVmdC0+bnR5cCk7CisgICAgICBpZihJU0lOVChwLT5udHlwLT5mbGFncykpeworCWlmKCF0dHlwfHwhc2hvcnRjdXQoZix0dHlwLT5mbGFncyZOVSkpeworCSAgcC0+bnR5cC0+ZmxhZ3M9aW50X2VydyhwLT5udHlwLT5mbGFncyk7CisJfWVsc2V7IAorCSAgaWYoKGY9PU1JTlVTJiYhem1sZXEoc2l6ZXRhYlt0dHlwLT5mbGFncyZOUV0sc2l6ZXRhYltwLT5udHlwLT5mbGFncyZOUV0pKXx8CisJICAgICAoZj09S09NUExFTUVOVCYmIXptbGVxKHNpemV0YWJbdHR5cC0+ZmxhZ3MmTlFdLHNpemV0YWJbcC0+bnR5cC0+ZmxhZ3MmTlFdKSYmKHAtPm50eXAtPmZsYWdzJlVOU0lHTkVEKSkpCisJICAgIHAtPm50eXAtPmZsYWdzPWludF9lcncocC0+bnR5cC0+ZmxhZ3MpOworCX0KKyAgICAgIH0KKyAgICB9CisgICAgaWYocC0+bGVmdC0+ZmxhZ3M9PUNFWFBSKXsKKyAgICAgIGV2YWxfY29uc3RuKHAtPmxlZnQpOworICAgICAgaWYoZj09S09NUExFTUVOVCl7CisJaWYocC0+bnR5cC0+ZmxhZ3MmVU5TSUdORUQpeworCSAgZ3ZhbC52dW1heD16dW1rb21wbCh2dW1heCk7CisJICBldmFsX2NvbnN0KCZndmFsLChVTlNJR05FRHxNQVhJTlQpKTsKKwl9ZWxzZXsKKwkgIGd2YWwudm1heD16bWtvbXBsKHZtYXgpOworCSAgZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworCX0KKyAgICAgIH0KKyAgICAgIGlmKGY9PU1JTlVTKXsKKwlpZihJU0ZMT0FUKHAtPm50eXAtPmZsYWdzKSl7CisJICBndmFsLnZsZG91YmxlPXpsZHN1YihkMnpsZCgwLjApLHZsZG91YmxlKTsKKwkgIGV2YWxfY29uc3QoJmd2YWwsTERPVUJMRSk7CisJfWVsc2V7CisJICBpZihwLT5udHlwLT5mbGFncyZVTlNJR05FRCl7CisJICAgIGd2YWwudnVtYXg9enVtc3ViKHVsMnp1bSgwVUwpLHZ1bWF4KTsKKwkgICAgZXZhbF9jb25zdCgmZ3ZhbCwoVU5TSUdORUR8TUFYSU5UKSk7CisJICB9ZWxzZXsKKwkgICAgZ3ZhbC52bWF4PXptc3ViKGwyem0oMEwpLHZtYXgpOworCSAgICBldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CisJICB9CisJfQorICAgICAgfQorICAgICAgaWYoZj09TkVHQVRJT04peworCWlmKHpsZGVxdG8odmxkb3VibGUsZDJ6bGQoMC4wKSkmJnp1bWVxdG8odnVtYXgsdWwyenVtKDBVTCkpJiZ6bWVxdG8odm1heCxsMnptKDBMKSkpCisJICBndmFsLnZtYXg9bDJ6bSgxTCk7IAorCWVsc2UgCisJICBndmFsLnZtYXg9bDJ6bSgwTCk7CisJZXZhbF9jb25zdCgmZ3ZhbCxNQVhJTlQpOworICAgICAgfQorICAgICAgaW5zZXJ0X2NvbnN0bihwKTsKKyAgICAgIHAtPmZsYWdzPUNFWFBSOworICAgICAgaWYoIXAtPmxlZnQtPnNpZGVmeCYmcC0+bGVmdCkge2ZyZWVfZXhwcmVzc2lvbihwLT5sZWZ0KTtwLT5sZWZ0PTA7fQorICAgIH0KKyAgICByZXR1cm4gb2s7CisgIH0KKyAgaWYoZj09Q09OVEVOVCl7CisgICAgaWYoIUlTUE9JTlRFUihwLT5sZWZ0LT5udHlwLT5mbGFncykpCisgICAgICB7ZXJyb3IoMTExKTtyZXR1cm4gMDt9CisgICAgaWYoIUlTQVJSQVkocC0+bGVmdC0+bnR5cC0+bmV4dC0+ZmxhZ3MpJiZ0eXBlX3VuY29tcGxldGUocC0+bGVmdC0+bnR5cC0+bmV4dCkpCisgICAgICB7ZXJyb3IoMTEyKTtyZXR1cm4gMDt9CisgICAgcC0+bnR5cD1jbG9uZV90eXAocC0+bGVmdC0+bnR5cC0+bmV4dCk7CisgICAgaWYoIUlTQVJSQVkocC0+bnR5cC0+ZmxhZ3MpKSBwLT5sdmFsdWU9MTsKKyAgICBpZihwLT5sZWZ0LT5mbGFncz09QUREUkVTUyYmenVtZXF0byhwLT5sZWZ0LT52YWwudnVtYXgsdWwyenVtKDBVTCkpKXsKKyAgICAgIC8qICAqJnggZHVyY2ggeCBlcnNldHplbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIG5wIG1lcms7CisgICAgICBtZXJrPXAtPmxlZnQ7CisgICAgICBpZihwLT5udHlwKSBmcmVldHlwKHAtPm50eXApOworICAgICAgaWYocC0+bGVmdC0+bnR5cCkgZnJlZXR5cChwLT5sZWZ0LT5udHlwKTsKKyAgICAgICpwPSpwLT5sZWZ0LT5sZWZ0OworICAgICAgZnJlZShtZXJrLT5sZWZ0KTsKKyAgICAgIGZyZWUobWVyayk7CisgICAgICByZXR1cm4gb2s7CisgICAgfQorICAgIC8qICAqJmF4IGR1cmNoIGZpcnN0ZWxlbWVudC1vZih4KSBlcnNldHplbiAgKi8KKyAgICBpZihwLT5sZWZ0LT5mbGFncz09QUREUkVTU0F8fHAtPmxlZnQtPmZsYWdzPT1BRERSRVNTUyl7CisgICAgICBpZighaXNfdmxlbmd0aChwLT5sZWZ0LT5sZWZ0LT5udHlwKSl7CisJbnAgbWVyazsKKwlpZihERUJVRyYxKSBwcmludGYoInN1YnN0aXR1dGV0ICogYW5kICVzIHdpdGggRklSU1RFTEVNRU5UXG4iLGVuYW1lW3AtPmxlZnQtPmZsYWdzXSk7CisJcC0+ZmxhZ3M9RklSU1RFTEVNRU5UOworCXAtPmx2YWx1ZT0xOyAgICAvKiAgZXZ0bC4gaGllciBlcnN0IEFiZnJhZ2UgPyAgICovCisJbWVyaz1wLT5sZWZ0OworCXAtPmxlZnQ9bWVyay0+bGVmdDsKKwlwLT5yaWdodD1tZXJrLT5yaWdodDsKKwlpZihtZXJrLT5udHlwKSBmcmVldHlwKG1lcmstPm50eXApOworCWZyZWUobWVyayk7CisgICAgICB9CisgICAgfQorICAgIGlmIChwLT5udHlwLT5mbGFncyZWT0xBVElMRSkgcC0+c2lkZWZ4PTE7CisgICAgcmV0dXJuIG9rOworICB9CisgIGlmKGY9PUZJUlNURUxFTUVOVCl7CisgICAgaWYoSVNBUlJBWShwLT5sZWZ0LT5udHlwLT5mbGFncykpeworICAgICAgcC0+bnR5cD1jbG9uZV90eXAocC0+bGVmdC0+bnR5cC0+bmV4dCk7CisgICAgfWVsc2V7CisgICAgICBpbnQgaSxuPS0xOworICAgICAgZm9yKGk9MDtpPHAtPmxlZnQtPm50eXAtPmV4YWN0LT5jb3VudDtpKyspCisJaWYoIXN0cmNtcCgoKnAtPmxlZnQtPm50eXAtPmV4YWN0LT5zbClbaV0uaWRlbnRpZmllcixwLT5yaWdodC0+aWRlbnRpZmllcikpIG49aTsKKyAgICAgIGlmKG48MCkgaWVycm9yKDApOworICAgICAgcC0+bnR5cD1jbG9uZV90eXAoKCpwLT5sZWZ0LT5udHlwLT5leGFjdC0+c2wpW25dLnN0eXApOworICAgIH0KKyAgICBwLT5sdmFsdWU9MTsgICAgLyogIGhpZXIgbm9jaCBnZW5hdWVyIHRlc3RlbiA/ICAqLworICAgIHJldHVybiBvazsKKyAgfQorICBpZihmPT1BRERSRVNTKXsKKyAgICBpZighSVNGVU5DKHAtPmxlZnQtPm50eXAtPmZsYWdzKSYmIUlTQVJSQVkocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXsKKyAgICAgIGlmKCFwLT5sZWZ0LT5sdmFsdWUpe2Vycm9yKDExNSk7cmV0dXJuIDA7fQorICAgICAgaWYocC0+bGVmdC0+ZmxhZ3M9PUlERU5USUZJRVIpeworCVZhciAqdjsKKwl2PWZpbmRfdmFyKHAtPmxlZnQtPmlkZW50aWZpZXIsMCk7CisJaWYoIXYpe2Vycm9yKDExNixwLT5sZWZ0LT5pZGVudGlmaWVyKTtyZXR1cm4gMDt9CisJaWYodi0+c3RvcmFnZV9jbGFzcz09UkVHSVNURVIpCisJICB7ZXJyb3IoMTE3KTtyZXR1cm4gMDt9CisgICAgICB9CisgICAgfQorICAgIHAtPm50eXA9bmV3X3R5cCgpOworICAgIHAtPm50eXAtPmZsYWdzPXB0eXBlKHAtPmxlZnQpOworICAgIHAtPm50eXAtPm5leHQ9Y2xvbmVfdHlwKHAtPmxlZnQtPm50eXApOworICAgIGZpeF9hZGRyX3B0eXBlKHApOworICAgIHJldHVybiBvazsKKyAgfQorICBpZihmPT1BRERSRVNTQSl7CisgICAgcC0+bnR5cD1jbG9uZV90eXAocC0+bGVmdC0+bnR5cCk7CisgICAgcC0+bnR5cC0+ZmxhZ3M9cHR5cGUocC0+bGVmdCk7CisgICAgZml4X2FkZHJfcHR5cGUocCk7CisgICAgcmV0dXJuIG9rOworICB9CisgIGlmKGY9PUFERFJFU1NTKXsKKyAgICBpbnQgaSxuPS0xOworICAgIHN0cnVjdF9saXN0ICpzbD0wOworICAgIGlmKCFlY3BwKXsKKyAgICAgIGZvcihpPTA7aTxwLT5sZWZ0LT5udHlwLT5leGFjdC0+Y291bnQ7aSsrKQorCWlmKCFzdHJjbXAoKCpwLT5sZWZ0LT5udHlwLT5leGFjdC0+c2wpW2ldLmlkZW50aWZpZXIscC0+cmlnaHQtPmlkZW50aWZpZXIpKSBuPWk7CisgICAgICBpZihuPDApCisgICAgICAgIHJldHVybiAwOworICAgICAgZWxzZQorICAgICAgICBzbD0mKCpwLT5sZWZ0LT5udHlwLT5leGFjdC0+c2wpW25dOworICAgIH0KKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgIHAtPm50eXA9bmV3X3R5cCgpOworICAgIGlmKCFwLT5sZWZ0LT5udHlwKSBpZXJyb3IoMCk7CisgICAgaWYoIXAtPmxlZnQtPm50eXAtPmV4YWN0KSBpZXJyb3IoMCk7CisgICAgaWYoIXNsLT5zdHlwKSBpZXJyb3IoMCk7CisgICAgcC0+bnR5cC0+bmV4dD1jbG9uZV90eXAoc2wtPnN0eXApOworICAgIHAtPm50eXAtPmZsYWdzPXB0eXBlKHAtPmxlZnQpOworICAgIGZpeF9hZGRyX3B0eXBlKHApOworICAgIHJldHVybiBvazsKKyAgfQorICBpZihmPT1EU1RSVUNUKXsKKyAgICBzdHJ1Y3RfZGVjbGFyYXRpb24gKnNkPXAtPmxlZnQtPm50eXAtPmV4YWN0OworICAgIGNoYXIgKmlkZW50aWZpZXI9cC0+cmlnaHQtPmlkZW50aWZpZXI7CisgICAgaW50IGk9MCxmLGJmcz0tMSxiZm89LTE7dHlwZSAqdDtucCBuZXc7em1heCBvZmZzZXQ9bDJ6bSgwTCk7CisgICAgaWYoIUlTU1RSVUNUKHAtPmxlZnQtPm50eXAtPmZsYWdzKSYmIUlTVU5JT04ocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKQorICAgICAge2Vycm9yKDgpO3JldHVybiAwO30KKyAgICBpZih0eXBlX3VuY29tcGxldGUocC0+bGVmdC0+bnR5cCkpe2Vycm9yKDExKTtyZXR1cm4gMDt9CisgICAgaWYocC0+cmlnaHQtPmZsYWdzIT1NRU1CRVIpIGllcnJvcigwKTsKKyAgICBpZihpPj1wLT5sZWZ0LT5udHlwLT5leGFjdC0+Y291bnQpIHtlcnJvcigyMyxwLT5yaWdodC0+aWRlbnRpZmllcik7cmV0dXJuIDA7fQorICAgIGlmKCFlY3BwKXsKKyAgICAgIG9mZnNldD1zdHJ1Y3Rfb2Zmc2V0KHNkLGlkZW50aWZpZXIpOworICAgIH0KKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgIGlmKElTVU5JT04ocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKSBvZmZzZXQ9bDJ6bSgwTCk7CisgICAgcC0+ZmxhZ3M9Q09OVEVOVDsKKyAgICBpZihwLT5udHlwKSB7ZnJlZXR5cChwLT5udHlwKTtwLT5udHlwPTA7fQorICAgIG5ldz1uZXdfbm9kZSgpOworICAgIG5ldy0+ZmxhZ3M9QUREOworICAgIG5ldy0+bnR5cD0wOworICAgIG5ldy0+cmlnaHQ9bmV3X25vZGUoKTsKKyAgICBuZXctPnJpZ2h0LT5sZWZ0PW5ldy0+cmlnaHQtPnJpZ2h0PTA7CisgICAgbmV3LT5yaWdodC0+ZmxhZ3M9UENFWFBSOworICAgIG5ldy0+cmlnaHQtPm50eXA9bmV3X3R5cCgpOworICAgIGlmKC8qTUlOQURESTJQPD1JTlQmJiovenVtbGVxKHptMnp1bShvZmZzZXQpLHRfbWF4KElOVCkpKXsKKyAgICAgIG5ldy0+cmlnaHQtPm50eXAtPmZsYWdzPUlOVDsKKyAgICAgIG5ldy0+cmlnaHQtPnZhbC52aW50PXptMnppKG9mZnNldCk7CisgICAgfWVsc2V7CisgICAgICBuZXctPnJpZ2h0LT5udHlwLT5mbGFncz1MT05HOworICAgICAgbmV3LT5yaWdodC0+bnR5cC0+bmV4dD0wOworICAgICAgbmV3LT5yaWdodC0+dmFsLnZsb25nPXptMnpsKG9mZnNldCk7CisgICAgfQorICAgIG5ldy0+bGVmdD1uZXdfbm9kZSgpOworICAgIG5ldy0+bGVmdC0+ZmxhZ3M9QUREUkVTU1M7CisgICAgbmV3LT5sZWZ0LT5sZWZ0PXAtPmxlZnQ7CisgICAgbmV3LT5sZWZ0LT5yaWdodD1wLT5yaWdodDsKKyAgICBuZXctPmxlZnQtPm50eXA9MDsKKyAgICBwLT5sZWZ0PW5ldztwLT5yaWdodD0wOworCisgICAgLyogQ2hlY2sgZm9yIGJpdGZpZWxkcyAqLworICAgIGk9MDsKKyAgICB3aGlsZShpPHNkLT5jb3VudCYmc3RyY21wKCgqc2QtPnNsKVtpXS5pZGVudGlmaWVyLGlkZW50aWZpZXIpKXsKKyAgICAgIGkrKzsKKyAgICB9CisgICAgaWYoaTxzZC0+Y291bnQpeworICAgICAgYmZvPSgqc2QtPnNsKVtpXS5iZm9mZnNldDsKKyAgICAgIGJmcz0oKnNkLT5zbClbaV0uYmZzaXplOworICAgIH1lbHNlCisgICAgICBiZnM9LTE7CisgICAgaWYoYmZzIT0tMSl7CisgICAgICAvKiBjcmVhdGUgYSBzcGVjaWFsIG5vZGUgZm9yIGJpdGZpZWxkcyAqLworICAgICAgb2t8PXR5cGVfZXhwcmVzc2lvbjIocCwwKTsKKyAgICAgIG5ldz1uZXdfbm9kZSgpOworICAgICAgKm5ldz0qcDsKKyAgICAgIHAtPmZsYWdzPUJJVEZJRUxEOworICAgICAgcC0+bGVmdD1uZXc7CisgICAgICBwLT5yaWdodD0wOworICAgICAgcC0+c2lkZWZ4PTA7CisgICAgICBwLT5iZnM9YmZzOworICAgICAgcC0+YmZvPWJmbzsKKyAgICAgIHAtPm50eXA9Y2xvbmVfdHlwKG5ldy0+bnR5cCk7CisgICAgICByZXR1cm4gb2s7CisgICAgfQorICAgIHJldHVybiB0eXBlX2V4cHJlc3Npb24yKHAsMCk7CisgIH0KKyAgaWYoZj09UFJFSU5DfHxmPT1QT1NUSU5DfHxmPT1QUkVERUN8fGY9PVBPU1RERUMpeworICAgIGlmKCFwLT5sZWZ0LT5sdmFsdWUpe2Vycm9yKDg2KTtyZXR1cm4gMDt9CisgICAgaWYocC0+bGVmdC0+bnR5cC0+ZmxhZ3MmQ09OU1Qpe2Vycm9yKDg3KTtyZXR1cm4gMDt9CisgICAgaWYoIUlTQVJJVEgocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXsKKyAgICAgIGlmKCFJU1BPSU5URVIocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpKXsKKwllcnJvcigyNCk7CisJcmV0dXJuIDA7CisgICAgICB9ZWxzZXsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKwlpZigocC0+bGVmdC0+bnR5cC0+bmV4dC0+ZmxhZ3MmTlEpPT1WT0lEKQorCSAge2Vycm9yKDk1KTtyZXR1cm4gMDt9CisgICAgICB9CisgICAgfQorICAgIHAtPm50eXA9Y2xvbmVfdHlwKHAtPmxlZnQtPm50eXApOworICAgIHAtPnNpZGVmeD0xOworICAgIHJldHVybiBvazsKKyAgfQorICBpZihmPT1DQUxMKXsKKyAgICBhcmd1bWVudF9saXN0ICphbDtpbnQgaSxmbGFncz0wO2NoYXIgKnM9MDsKKyAgICBzdHJ1Y3RfZGVjbGFyYXRpb24gKnNkOworI2lmZGVmIEhBVkVfRUNQUAorLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgYWw9cC0+YWxpc3Q7CisgICAgaWYoIUlTUE9JTlRFUihwLT5sZWZ0LT5udHlwLT5mbGFncyl8fCFJU0ZVTkMocC0+bGVmdC0+bnR5cC0+bmV4dC0+ZmxhZ3MpKQorICAgICAge2Vycm9yKDI2KTtyZXR1cm4gMDt9CisgICAgaWYob2smJnAtPmxlZnQtPmxlZnQmJnAtPmxlZnQtPmxlZnQtPmZsYWdzPT1JREVOVElGSUVSJiZwLT5sZWZ0LT5sZWZ0LT5vLnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisgICAgICBzPXAtPmxlZnQtPmxlZnQtPm8udi0+aWRlbnRpZmllcjsKKyAgICAgIGZsYWdzPXAtPmxlZnQtPmxlZnQtPm8udi0+ZmxhZ3M7CisgICAgfQorICAgIHNkPXAtPmxlZnQtPm50eXAtPm5leHQtPmV4YWN0OworICAgIGlmKCFzZCkgaWVycm9yKDApOworICAgIGlmKHNkLT5jb3VudD09MCl7CisjaWZkZWYgSEFWRV9NSVNSQQorLyogcmVtb3ZlZCAqLworI2VuZGlmCisgICAgICBlcnJvcigxNjIpOworICAgICAgaWYocyl7CisJaWYoIXN0cmNtcChzLCJwcmludGYiKXx8IXN0cmNtcChzLCJmcHJpbnRmIil8fCFzdHJjbXAocywic3ByaW50ZiIpfHwKKwkgICAhc3RyY21wKHMsInNjYW5mIil8fCAhc3RyY21wKHMsImZzY2FuZiIpfHwgIXN0cmNtcChzLCJzc2NhbmYiKSkKKwkgIGVycm9yKDIxMyk7CisgICAgICB9CisgICAgfQorICAgIGlmKCEoZWNwcCYmYWwmJmFsLT5hcmctPm50eXApKXsKKyAgICAgIGk9MDsKKyAgICAgIHdoaWxlKGFsKXsKKwlpZighYWwtPmFyZykgaWVycm9yKDApOworCWlmKCF0eXBlX2V4cHJlc3Npb24yKGFsLT5hcmcsKHNob3J0X3B1c2gmJmk8c2QtPmNvdW50KT8oKnNkLT5zbClbaV0uc3R5cDowKSkgcmV0dXJuIDA7CisJYWwtPmFyZz1tYWtlcG9pbnRlcihhbC0+YXJnKTsKKwlpZih0eXBlX3VuY29tcGxldGUoYWwtPmFyZy0+bnR5cCkpIGVycm9yKDM5KTsKKwlhbD1hbC0+bmV4dDsKKwlpKys7CisgICAgICB9CisgICAgfQorICAgIHAtPnNpZGVmeD0xOworICAgIHAtPm50eXA9Y2xvbmVfdHlwKHAtPmxlZnQtPm50eXAtPm5leHQtPm5leHQpOworICAgIGk9MDthbD1wLT5hbGlzdDsKKyAgICB3aGlsZShhbCl7CisgICAgICBpZihpPj1zZC0+Y291bnQpIHJldHVybiBvazsKKyAgICAgIGlmKCEoKnNkLT5zbClbaV0uc3R5cCkgcmV0dXJuIG9rOyAvKiBudXIgQmV6ZWljaG5lciwgYWJlciBrZWluIFR5cCBpbSBQcm90b3R5cGUgKi8KKyAgICAgIGlmKCF0ZXN0X2Fzc2lnbm1lbnQoKCpzZC0+c2wpW2ldLnN0eXAsYWwtPmFyZykpIHJldHVybiAwOworI2lmZGVmIEhBVkVfTUlTUkEKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgorICAgICAgaWYoaT09c2QtPmNvdW50LTEmJihmbGFncyYoUFJJTlRGTElLRXxTQ0FORkxJS0UpKSl7CisJaWYoYWwtPmFyZy0+bGVmdCYmYWwtPmFyZy0+bGVmdC0+ZmxhZ3M9PVNUUklORyl7CisJICAvKiAgQXJndW1lbnRlIGFuaGFuZCBkZXMgRm9ybWF0c3RyaW5ncyB1ZWJlcnBydWVmZW4gKi8KKwkgIGNvbnN0X2xpc3QgKmNsPWFsLT5hcmctPmxlZnQtPmNsOworCSAgaW50IGZ1c2VkPTA7bG9uZyBtYXNrPTE7CisJICBhbD1hbC0+bmV4dDsKKwkgIHdoaWxlKGNsJiZjbC0+b3RoZXIpeworCSAgICBpbnQgYyxmZmxhZ3M9JyAnLGF0LGxmbGFnOworCSAgICB0eXBlICp0OworCSAgICBlbnVte0xMPTEsSEh9OworCSAgICBjPShpbnQpem0ybCh6YzJ6bShjbC0+b3RoZXItPnZhbC52Y2hhcikpOworIAkgICAgY2w9Y2wtPm5leHQ7CisJICAgIGlmKGM9PTApeworCSAgICAgIGlmKGNsKSBlcnJvcigyMTUpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGM9Q0hBUkJBQ0soYyk7CisJICAgIGlmKGMhPSclJykgY29udGludWU7CisJICAgIGlmKCFjbCl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQorCSAgICBsZmxhZz0wOworCSAgICBjPShpbnQpem0ybCh6YzJ6bShjbC0+b3RoZXItPnZhbC52Y2hhcikpOworCSAgICBjPUNIQVJCQUNLKGMpOworCSAgICBjbD1jbC0+bmV4dDsKKwkgICAgd2hpbGUoaXNkaWdpdCgodW5zaWduZWQgY2hhciljKXx8CisJCSAgYz09Jy0nfHxjPT0nKyd8fGM9PScgJ3x8Yz09JyMnfHxjPT0nLid8fAorCQkgIGM9PSdoJ3x8Yz09J2wnfHxjPT0nTCd8fGM9PSd6J3x8Yz09J2onfHxjPT0ndCd8fGM9PScqJyl7CisJICAgICAgaWYoYz09Jy0nKSBtYXNrfD1VU0VMQUxHTjsKKwkgICAgICBpZihjPT0nKycpIG1hc2t8PVVTRVNJR047CisJICAgICAgaWYoYz09JyMnKSBtYXNrfD1VU0VBTFQ7CisJICAgICAgaWYoYz09Jy4nKSBtYXNrfD1VU0VQUkVDOworCSAgICAgIGlmKGM9PScgJykgbWFza3w9VVNFQkxBTks7CisJICAgICAgaWYoYz09JzAnJiYhKG1hc2smVVNFUFJFQykmJiEobWFzayZVU0VXSURUSCkpIG1hc2t8PVVTRVpQQUQ7CisJICAgICAgaWYoaXNkaWdpdCgodW5zaWduZWQgY2hhciljKSYmIShtYXNrJlVTRVBSRUMpKSBtYXNrfD1VU0VXSURUSDsKKwkgICAgICBmdXNlZHw9MzsKKwkgICAgICBpZihjPT0nKicmJihmbGFncyZQUklOVEZMSUtFKSl7CisJCW1hc2t8PVVTRUFTVDsKKwkJaWYoIWFsKSB7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQorCQlhdD1hbC0+YXJnLT5udHlwLT5mbGFncyZOUTsKKwkJYWw9YWwtPm5leHQ7CisJCWlmKGF0PklOVCkge2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KKwkgICAgICB9CisJICAgICAgaWYoKGZmbGFncyE9JyonfHwoZmxhZ3MmUFJJTlRGTElLRSkpJiYoYz09J2gnfHxjPT0nbCd8fGM9PSdMJ3x8Yz09JyonfHxjPT0ndCd8fGM9PSd6J3x8Yz09J2onKSl7CisJCWlmKGM9PSdsJyYmZmZsYWdzPT0nbCcpCisJCSAgZmZsYWdzPUxMOworCQllbHNlIGlmKGM9PSdoJyYmZmZsYWdzPT0naCcpCisJCSAgZmZsYWdzPUhIOworCQllbHNlCisJCSAgZmZsYWdzPWM7CisJICAgICAgfQorCSAgICAgIGM9KGludCl6bTJsKHpjMnptKGNsLT5vdGhlci0+dmFsLnZjaGFyKSk7CisJICAgICAgYz1DSEFSQkFDSyhjKTsKKwkgICAgICBjbD1jbC0+bmV4dDsKKwkgICAgICBpZighY2wpe2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KKwkgICAgfQorCSAgICAvKkZJWE1FOiBhc3N1bWVzIGludG1heF90PT1sb25nIGxvbmcgKi8KKwkgICAgaWYoZmZsYWdzPT0naicpIHttYXNrfD1VU0VTUEVDO2ZmbGFncz1MTDt9CisjaWYgSEFWRV9JTlRfU0laRVQJICAgIAorCSAgICBpZihmZmxhZ3M9PSd6Jykge21hc2t8PVVTRVNQRUM7ZmZsYWdzPScgJzt9CisjZWxzZQorCSAgICBpZihmZmxhZ3M9PSd6Jykge21hc2t8PVVTRVNQRUM7ZmZsYWdzPSdsJzt9CisjZW5kaWYKKwkgICAgaWYoZmZsYWdzPT0ndCcpeworCSAgICAgIG1hc2t8PVVTRVNQRUM7CisJICAgICAgaWYoUFRSRElGRl9UKENIQVIpPT1MTE9ORykKKwkJZmZsYWdzPUxMOworCSAgICAgIGVsc2UgaWYoUFRSRElGRl9UKENIQVIpPT1MT05HKQorCQlmZmxhZ3M9J2wnOworCSAgICAgIGVsc2UKKwkJZmZsYWdzPScgJzsKKwkgICAgfQorCSAgICBpZihmZmxhZ3M9PUhIKSBsZmxhZ3w9VVNFU1BFQzsKKwkgICAgaWYoZmZsYWdzPT0naCcpIGxmbGFnfD1VU0VIQUxGOworCSAgICBpZihmZmxhZ3M9PSdsJykgbGZsYWd8PVVTRUxPTkc7CisJICAgIGlmKGZmbGFncz09TEwpIGxmbGFnfD1VU0VMTE9ORzsKKwkgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJmb3JtYXQ9JWMlY1xuIixmZmxhZ3MsYyk7CisJICAgIGlmKGZmbGFncz09JyonJiYoZmxhZ3MmU0NBTkZMSUtFKSkgY29udGludWU7CisJICAgIGlmKGMhPSclJyl7CisJICAgICAgaWYoIWFsKXtlcnJvcigyMTQpO3JldHVybiBvazt9CisJICAgICAgdD1hbC0+YXJnLT5udHlwOworCSAgICAgIGlmKERFQlVHJjEpeyBwcmQoc3Rkb3V0LHQpO3ByaW50ZigiXG4iKTt9CisJICAgICAgaWYoKGZsYWdzJlNDQU5GTElLRSkpeworCQlpZighSVNQT0lOVEVSKHQtPmZsYWdzKSl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQorCQl0PXQtPm5leHQ7CisJICAgICAgfQorCSAgICAgIGF0PXQtPmZsYWdzJk5VOworCSAgICB9CisJICAgIGlmKGZsYWdzJlBSSU5URkxJS0UpeworCSAgICAgIHN3aXRjaChjKXsKKwkgICAgICBjYXNlICclJzoKKwkJbWFza3w9VVNFUEVSQzsKKwkJZnVzZWR8PTE7CisJCWJyZWFrOworCSAgICAgIGNhc2UgJ28nOgorCSAgICAgIGNhc2UgJ3gnOgorCSAgICAgIGNhc2UgJ1gnOgorCSAgICAgIGNhc2UgJ2MnOgorCQlhdCY9TlE7ICAgICAvKiAgZmFsbCB0aHJvdWdoICAgICovCisJICAgICAgY2FzZSAnaSc6CisJICAgICAgY2FzZSAnZCc6CisJCWZ1c2VkfD0xOworCQlpZihhdD09TExPTkcmJmZmbGFncyE9TEwpe2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KKwkJaWYoYXQ9PUxPTkcmJmZmbGFncyE9J2wnKXtlcnJvcigyMTQpO3JldHVybiBvazt9CisJCWlmKGZmbGFncz09J2wnJiZhdCE9TE9ORyl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQorCQlpZihhdDxDSEFSfHxhdD5MTE9ORyl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQorCQlpZihjPT0nbycpIG1hc2t8PVVTRU9DVDsKKwkJaWYoYz09J3gnKSBtYXNrfD1VU0VIRVhMOworCQlpZihjPT0nWCcpIG1hc2t8PVVTRUhFWFU7CisJCWlmKGM9PSdpJykgbWFza3w9VVNFSU5UOworCQlpZihjPT0nZCcpIG1hc2t8PVVTRURFQzsKKwkJaWYoYz09J2MnKSBtYXNrfD1VU0VDSEFSOworCQltYXNrfD1sZmxhZzsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAndSc6CisJCW1hc2t8PVVTRVVOUzsKKwkJZnVzZWR8PTE7CisJCWlmKGFsLT5hcmctPmZsYWdzPT1DRVhQUikgYXR8PVVOU0lHTkVEOworCQlpZihhdD09KFVOU0lHTkVEfExMT05HKSYmZmZsYWdzIT1MTCl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQorCQlpZihhdD09KFVOU0lHTkVEfExPTkcpJiZmZmxhZ3MhPSdsJyl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQorCQlpZihmZmxhZ3M9PSdsJyYmYXQhPShVTlNJR05FRHxMT05HKSl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQorCQlpZihhdDwoVU5TSUdORUR8Q0hBUil8fGF0PihVTlNJR05FRHxMTE9ORykpe2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KKwkJbWFza3w9bGZsYWc7CisJCWJyZWFrOworCSAgICAgIGNhc2UgJ3MnOgorCQltYXNrfD1VU0VTVFI7CisJCWZ1c2VkfD0xOworCQlpZighSVNQT0lOVEVSKGF0KXx8KHQtPm5leHQtPmZsYWdzJk5RKSE9Q0hBUil7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQorCQlicmVhazsKKwkgICAgICBjYXNlICdmJzoKKwkgICAgICBjYXNlICdlJzoKKwkgICAgICBjYXNlICdFJzoKKwkgICAgICBjYXNlICdnJzoKKwkgICAgICBjYXNlICdHJzoKKwkJbWFza3w9VVNFRkxPQVQ7CisJCWZ1c2VkfD03OworCQlpZihmZmxhZ3M9PSdMJyl7CisJCSAgaWYoYXQhPUxET1VCTEUpe2Vycm9yKDIxNCk7IHJldHVybiBvazt9CisJCX1lbHNleworCQkgIGlmKGF0IT1GTE9BVCYmYXQhPURPVUJMRSl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQorCQl9CisJCWJyZWFrOworCSAgICAgIGNhc2UgJ3AnOgorCQltYXNrfD1VU0VTUEVDOworCQlmdXNlZHw9MzsKKwkJaWYoIUlTUE9JTlRFUihhdCl8fCh0LT5uZXh0LT5mbGFncykhPVZPSUQpe2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KKwkJYnJlYWs7CisJICAgICAgY2FzZSAnbic6CisJCW1hc2t8PVVTRUNOVDsKKwkJZnVzZWR8PTM7CisJCWlmKCFJU1BPSU5URVIoYXQpKXtlcnJvcigyMTQpO3JldHVybiBvazt9CisJCWF0PXQtPm5leHQtPmZsYWdzJk5VOworCQlpZihmZmxhZ3M9PUhIJiZhdCE9Q0hBUil7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQorCQlpZihmZmxhZ3M9PSdoJyYmYXQhPVNIT1JUKXtlcnJvcigyMTQpO3JldHVybiBvazt9CisJCWlmKGZmbGFncz09JyAnJiZhdCE9SU5UKXtlcnJvcigyMTQpO3JldHVybiBvazt9CisJCWlmKGZmbGFncz09J2wnJiZhdCE9TE9ORyl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQorCQlpZihmZmxhZ3M9PUxMJiZhdCE9TExPTkcpe2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KKwkJYnJlYWs7CisJICAgICAgZGVmYXVsdDoKKwkJZXJyb3IoMjE0KTtyZXR1cm4gb2s7CisJICAgICAgfQorCSAgICB9ZWxzZXsKKwkgICAgICBpZihjPT0ncycpIG1hc2t8PVVTRVNUUjsKKwkgICAgICBpZihjPT0nYycpIG1hc2t8PVVTRUNIQVI7CisJICAgICAgaWYoYz09J24nKSBtYXNrfD1VU0VDTlQ7CisJICAgICAgaWYoYz09J2QnKSBtYXNrfD1VU0VERUM7CisJICAgICAgaWYoYz09J2knKSBtYXNrfD1VU0VJTlQ7CisJICAgICAgaWYoYz09J28nKSBtYXNrfD1VU0VPQ1Q7CisJICAgICAgaWYoYz09J3gnKSBtYXNrfD1VU0VIRVhMOworCSAgICAgIGlmKGM9PSd1JykgbWFza3w9VVNFVU5TOworCisJICAgICAgc3dpdGNoKGMpeworCSAgICAgIGNhc2UgJyUnOgorCQltYXNrfD1VU0VQRVJDOworCQlmdXNlZHw9MTsKKwkJYnJlYWs7CisJICAgICAgY2FzZSAnWyc6CisJCW1hc2t8PVVTRVJFWFA7CisJCWZ1c2VkfD0zOworCQlkb3sKKwkJICBjPShpbnQpem0ybCh6YzJ6bShjbC0+b3RoZXItPnZhbC52Y2hhcikpOworCQkgIGM9Q0hBUkJBQ0soYyk7CisJCSAgY2w9Y2wtPm5leHQ7CisJCSAgaWYoIWNsKXtlcnJvcigyMTQpO3JldHVybiBvazt9CisJCX13aGlsZShjIT0nXScpOyAgICAgLyogIGZhbGwgdGhyb3VnaCAgICAqLworCSAgICAgIGNhc2UgJ3MnOgorCSAgICAgIGNhc2UgJ2MnOgorCQlmdXNlZHw9MTsKKwkJaWYoKGF0Jk5RKSE9Q0hBUil7ZXJyb3IoMjE0KTtyZXR1cm4ob2spO30KKwkJYnJlYWs7CisJICAgICAgY2FzZSAnbic6CisJCWZ1c2VkfD0zOyAgICAgICAvKiAgZmFsbCB0aHJvdWdoICAgICovCisJICAgICAgY2FzZSAnZCc6CisJICAgICAgY2FzZSAnaSc6CisJICAgICAgY2FzZSAnbyc6CisJCWZ1c2VkfD0xOworCQlpZihmZmxhZ3M9PUhIJiZhdCE9Q0hBUil7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQorCQlpZihmZmxhZ3M9PSdoJyYmYXQhPVNIT1JUKXtlcnJvcigyMTQpO3JldHVybiBvazt9CisJCWlmKGZmbGFncz09JyAnJiZhdCE9SU5UKXtlcnJvcigyMTQpO3JldHVybiBvazt9CisJCWlmKGZmbGFncz09J2wnJiZhdCE9TE9ORyl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQorCQlpZihmZmxhZ3M9PUxMJiZhdCE9TExPTkcpe2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KKwkJYnJlYWs7CisJICAgICAgY2FzZSAneCc6CisJICAgICAgY2FzZSAndSc6CisJCWZ1c2VkfD0xOworCQlpZihmZmxhZ3M9PUhIJiZhdCE9Q0hBUil7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQorCQlpZihmZmxhZ3M9PSdoJyYmYXQhPShVTlNJR05FRHxTSE9SVCkpe2Vycm9yKDIxNCk7cmV0dXJuIG9rO30KKwkJaWYoZmZsYWdzPT0nICcmJmF0IT0oVU5TSUdORUR8SU5UKSl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQorCQlpZihmZmxhZ3M9PSdsJyYmYXQhPShVTlNJR05FRHxMT05HKSl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQorCQlpZihmZmxhZ3M9PUxMJiZhdCE9KFVOU0lHTkVEfExMT05HKSl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQorCQlicmVhazsKKwkgICAgICBjYXNlICdlJzoKKwkgICAgICBjYXNlICdmJzoKKwkgICAgICBjYXNlICdnJzoKKwkJbWFza3w9VVNFRkxPQVQ7CisJCWZ1c2VkfD03OworCQlpZihmZmxhZ3M9PScgJyYmYXQhPUZMT0FUKXtlcnJvcigyMTQpO3JldHVybiBvazt9CisJCWlmKGZmbGFncz09J2wnJiZhdCE9RE9VQkxFKXtlcnJvcigyMTQpO3JldHVybiBvazt9CisJCWlmKGZmbGFncz09J0wnJiZhdCE9TERPVUJMRSl7ZXJyb3IoMjE0KTtyZXR1cm4gb2s7fQorCQlicmVhazsKKwkgICAgICBjYXNlICdwJzoKKwkJbWFza3w9VVNFU1BFQzsKKwkJZnVzZWR8PTM7CisJCWlmKCFJU1BPSU5URVIoYXQpfHwodC0+bmV4dC0+ZmxhZ3MmTlEpIT1WT0lEKXtlcnJvcigyMTQpO3JldHVybiBvazt9CisJCWJyZWFrOworCSAgICAgIGRlZmF1bHQ6CisJCWVycm9yKDIxNCk7cmV0dXJuIG9rOworCSAgICAgIH0KKwkgICAgfQorCSAgICBpZihjIT0nJScpIGFsPWFsLT5uZXh0OworCSAgfQorCSAgaWYoYWwpeyBlcnJvcigyMTQpO3JldHVybiBvazt9IC8qIHp1IHZpZWxlICovCisJICBpZihERUJVRyYxKSBwcmludGYoImZ1c2VkPSVkXG4iLGZ1c2VkKTsKKwkgIGlmKG1hc2tfb3B0KXsKKwkgICAgVmFyICp2O2NoYXIgcmVwbFtNQVhJKzE2XTsKKwkgICAgaWYobWFzayl7CisJICAgICAgc3ByaW50ZihyZXBsLCIlcy4lbHUiLHMsMUwpOworCSAgICAgIHY9ZmluZF92YXIocmVwbCwwKTsKKwkgICAgICBpZighdil7CisJCXR5cGUgKnQ7CisJCXY9ZmluZF92YXIocywwKTsKKwkJaWYoIXYpIGllcnJvcigwKTsKKwkJdj1hZGRfdmFyKHJlcGwsY2xvbmVfdHlwKHYtPnZ0eXApLEVYVEVSTiwwKTsKKwkgICAgICB9CisJICAgIH0KKwkgICAgaWYobWFzaykKKwkgICAgICBzcHJpbnRmKHJlcGwsIiVzLiVsdSIsKGZsYWdzJlBSSU5URkxJS0UpPyJ2ZnByaW50ZiI6InZmc2NhbmYiLG1hc2spOworCSAgICBlbHNlCisJICAgICAgc3ByaW50ZihyZXBsLCIlcyIsKGZsYWdzJlBSSU5URkxJS0UpPyJ2ZnByaW50ZiI6InZmc2NhbmYiKTsKKwkgICAgbmVlZHMocmVwbCk7CisJICAgIHAtPmxlZnQtPmxlZnQtPm8udj12OworCSAgICBpZihERUJVRyYxKSBwcmludGYoInJlcGw9JXNcbiIscmVwbCk7CisJICB9ZWxzZSBpZihmdXNlZCE9NyYmcyl7CisJICAgIC8qICBXZW5uIGtlaW4gRm9ybWF0IGJlbnV0enQgd2lyZCwga2FubiBtYW4gcHJpbnRmLCAqLworCSAgICAvKiAgc2NhbmYgZXRjLiBkdXJjaCBhZWhubGljaGVzIGVyc2V0emVuLiAgICAgICAgICAgKi8KKwkgICAgVmFyICp2O2NoYXIgcmVwbFtNQVhJKzZdPSJfX3YiOworCSAgICBpZihmdXNlZD09MykgZnVzZWQ9MjsKKwkgICAgcmVwbFszXT1mdXNlZCsnMCc7cmVwbFs0XT0wOworCSAgICBzdHJjYXQocmVwbCxzKTsKKwkgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJyZXBsPSVzXG4iLHJlcGwpOworCSAgICB3aGlsZShmdXNlZDw9Mil7CisJICAgICAgdj1maW5kX3ZhcihyZXBsLDApOworCSAgICAgIGlmKHYmJnYtPnN0b3JhZ2VfY2xhc3M9PUVYVEVSTil7CisJCXAtPmxlZnQtPmxlZnQtPm8udj12OworCQlicmVhazsKKwkgICAgICB9CisJICAgICAgZnVzZWQrKztyZXBsWzNdKys7CisJICAgIH0KKwkgIH0KKwkgIHJldHVybiBvazsKKwl9CisgICAgICB9CisgICAgICBpKys7YWw9YWwtPm5leHQ7CisgICAgfQorICAgIGlmKGk+PXNkLT5jb3VudCkgcmV0dXJuIG9rOworICAgIGlmKCgqc2QtPnNsKVtpXS5zdHlwJiYoKCpzZC0+c2wpW2ldLnN0eXAtPmZsYWdzJk5RKSE9Vk9JRCl7ZXJyb3IoODMpOy8qcHJpbnRmKCJzZC0+Y291bnQ9JWRcbiIsc2QtPmNvdW50KTsqL30KKyAgICByZXR1cm4gb2s7CisgIH0KKyAgaWYoZj09Q09ORCl7CisgICAgaWYoIUlTQVJJVEgocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpJiYhSVNQT0lOVEVSKHAtPmxlZnQtPm50eXAtPmZsYWdzKSl7CisgICAgICBlcnJvcigyOSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYocC0+bGVmdC0+ZmxhZ3M9PUNFWFBSJiYhcC0+bGVmdC0+c2lkZWZ4KXsKKyAgICAgIGludCBudWxsO25wIG1lcms7CisgICAgICBpZihERUJVRyYxKSBwcmludGYoImNvbnN0YW50IGNvbmRpdGlvbmFsLWV4cHJlc3Npb24gc2ltcGxpZmllZFxuIik7CisgICAgICBldmFsX2NvbnN0bihwLT5sZWZ0KTsKKyAgICAgIGlmKHptZXF0byh2bWF4LGwyem0oMEwpKSYmenVtZXF0byh2dW1heCx1bDJ6dW0oMFVMKSkmJnpsZGVxdG8odmxkb3VibGUsZDJ6bGQoMC4wKSkpCisJbnVsbD0xOyAKKyAgICAgIGVsc2UgCisJbnVsbD0wOworICAgICAgZnJlZV9leHByZXNzaW9uKHAtPmxlZnQpOworICAgICAgbWVyaz1wLT5yaWdodDsKKyAgICAgIGlmKG51bGwpeworCWZyZWVfZXhwcmVzc2lvbihwLT5yaWdodC0+bGVmdCk7CisJKnA9KnAtPnJpZ2h0LT5yaWdodDsKKyAgICAgIH1lbHNleworCWZyZWVfZXhwcmVzc2lvbihwLT5yaWdodC0+cmlnaHQpOworCSpwPSpwLT5yaWdodC0+bGVmdDsKKyAgICAgIH0KKyAgICAgIGlmKG1lcmstPm50eXApIGZyZWV0eXAobWVyay0+bnR5cCk7CisgICAgICBmcmVlKG1lcmspOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmKGNvbnN0X2V4cHIpe2Vycm9yKDQ2KTtyZXR1cm4gMDt9CisgICAgcC0+bnR5cD1jbG9uZV90eXAocC0+cmlnaHQtPm50eXApOworICAgIHJldHVybiAxOworICB9CisgIGlmKGY9PUNPTE9OKXsKKyAgICAvKiAgSGllciBmZWhsdCBub2NoIGtvcnJla3RlIEJlaGFuZGx1bmcgZGVyIFR5cGF0dHJpYnV0ZSAgICAqLworICAgIGlmKElTQVJJVEgocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpJiZJU0FSSVRIKHAtPnJpZ2h0LT5udHlwLT5mbGFncykpeworICAgICAgcC0+bnR5cD1hcml0aF90eXAocC0+bGVmdC0+bnR5cCxwLT5yaWdodC0+bnR5cCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYoY29tcGF0aWJsZV90eXBlcyhwLT5sZWZ0LT5udHlwLHAtPnJpZ2h0LT5udHlwLE5RKSl7CisgICAgICBwLT5udHlwPWNsb25lX3R5cChwLT5sZWZ0LT5udHlwKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZihJU1BPSU5URVIocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpJiZJU1BPSU5URVIocC0+cmlnaHQtPm50eXAtPmZsYWdzKSl7CisgICAgICBpZigocC0+bGVmdC0+bnR5cC0+bmV4dC0+ZmxhZ3MmTlEpPT1WT0lEKXsKKwlpZihudWxscG9pbnRlcihwLT5sZWZ0KSkKKwkgIHAtPm50eXA9Y2xvbmVfdHlwKHAtPnJpZ2h0LT5udHlwKTsKKwllbHNlCisJICBwLT5udHlwPWNsb25lX3R5cChwLT5sZWZ0LT5udHlwKTsKKwlyZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGlmKChwLT5yaWdodC0+bnR5cC0+bmV4dC0+ZmxhZ3MmTlEpPT1WT0lEKXsKKwlpZihudWxscG9pbnRlcihwLT5yaWdodCkpCisJICBwLT5udHlwPWNsb25lX3R5cChwLT5sZWZ0LT5udHlwKTsKKwllbHNlCisJICBwLT5udHlwPWNsb25lX3R5cChwLT5yaWdodC0+bnR5cCk7CisJcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICAgIGlmKElTUE9JTlRFUihwLT5sZWZ0LT5udHlwLT5mbGFncykmJnAtPnJpZ2h0LT5mbGFncz09Q0VYUFIpeworICAgICAgZXZhbF9jb25zdG4ocC0+cmlnaHQpOworICAgICAgaWYoem1lcXRvKHZtYXgsbDJ6bSgwTCkpJiZ6dW1lcXRvKHVsMnp1bSgwVUwpLHZ1bWF4KSYmemxkZXF0byhkMnpsZCgwLjApLHZsZG91YmxlKSl7CisJcC0+bnR5cD1jbG9uZV90eXAocC0+bGVmdC0+bnR5cCk7CisJcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICAgIGlmKElTUE9JTlRFUihwLT5yaWdodC0+bnR5cC0+ZmxhZ3MpJiZwLT5sZWZ0LT5mbGFncz09Q0VYUFIpeworICAgICAgZXZhbF9jb25zdG4ocC0+bGVmdCk7CisgICAgICBpZih6bWVxdG8obDJ6bSgwTCksdm1heCkmJnp1bWVxdG8odWwyenVtKDBVTCksdnVtYXgpJiZ6bGRlcXRvKGQyemxkKDAuMCksdmxkb3VibGUpKXsKKwlwLT5udHlwPWNsb25lX3R5cChwLT5yaWdodC0+bnR5cCk7CisJcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICAgIGVycm9yKDMxKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZihmKSBwcmludGYoInR5cGVfdGVzdGluZyBmdWVyIGRpZXNlbiBPcGVyYXRvciAoJWQpIG5vY2ggbmljaHQgaW1wbGVtZW50aWVydFxuIixmKTsKKyAgcmV0dXJuIDA7Cit9CisKK25wIG1ha2Vwb2ludGVyKG5wIHApCisvKiAgRnVlaHJ0IGF1dG9tYXRpc2NoZSBaZWlnZXJlcnpldWd1bmcgZnVlciBCYXVtd3VyemVsIGR1cmNoICAgKi8KKy8qICBEdXJjaCBtZWhybWFsaWdlbiBBdWZydWYgdm9uIHR5cGVfZXhwcmVzc2lvbigpIGluZWZmaXppZW50ICAqLworeworICAgIHN0cnVjdF9kZWNsYXJhdGlvbiAqc2Q7CisgICAgaWYoSVNBUlJBWShwLT5udHlwLT5mbGFncyl8fElTRlVOQyhwLT5udHlwLT5mbGFncykpeworICAgICAgbnAgbmV3PW5ld19ub2RlKCk7CisgICAgICAgIGlmKElTQVJSQVkocC0+bnR5cC0+ZmxhZ3MpKXsKKyAgICAgICAgICAgIG5ldy0+ZmxhZ3M9QUREUkVTU0E7CisgICAgICAgICAgICBuZXctPm50eXA9Y2xvbmVfdHlwKHAtPm50eXApOworICAgICAgICAgICAgbmV3LT5udHlwLT5mbGFncz1QT0lOVEVSX1RZUEUobmV3LT5udHlwLT5uZXh0KTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBuZXctPmZsYWdzPUFERFJFU1M7CisgICAgICAgICAgICBuZXctPm50eXA9bmV3X3R5cCgpOworICAgICAgICAgICAgbmV3LT5udHlwLT5mbGFncz1QT0lOVEVSX1RZUEUocC0+bnR5cCk7CisgICAgICAgICAgICBuZXctPm50eXAtPm5leHQ9Y2xvbmVfdHlwKHAtPm50eXApOworICAgICAgICB9CisgICAgICAgIG5ldy0+bGVmdD1wOworICAgICAgICBuZXctPnJpZ2h0PTA7CisgICAgICAgIG5ldy0+bHZhbHVlPTA7ICAvKiBpbW1lciBrb3JyZWt0ID8gICovCisgICAgICAgIG5ldy0+c2lkZWZ4PXAtPnNpZGVmeDsKKy8qICAgICAgICB0eXBlX2V4cHJlc3Npb24obmV3KTsqLworICAgICAgICByZXR1cm4gbmV3OworICAgIH1lbHNlIAorICAgICAgcmV0dXJuIHA7Cit9CisKK3ZvaWQgc2ltcGxlX2FsZ19vcHQobnAgcCkKK3sKKyAgaW50IGM9MCxmLHQ9MDsKKyAgemxkb3VibGUgZDEsZDI7CisgIHp1bWF4IHUxLHUyO3ptYXggczEsczI7CisgIFZhciAqdjsKKworICBpZighcCkgcmV0dXJuOworCisgIGY9cC0+ZmxhZ3M7CisKKyAgaWYoZj09SURFTlRJRklFUiYmKHY9ZmluZF92YXIocC0+aWRlbnRpZmllciwwKSkmJih2LT52dHlwLT5mbGFncyZOUSk9PUVOVU0peworICAgIC8qICBlbnVtZXJhdGlvbnMgYXVjaCBhbHMgS29uc3RhbnRlIChpbnQpIGJlaGFuZGVsbiAqLworICAgIHAtPmZsYWdzPUNFWFBSOworICAgIGlmKCF2LT5jbGlzdCkgaWVycm9yKDApOworICAgIHAtPnZhbD12LT5jbGlzdC0+dmFsOworICAgIGlmKCFwLT5udHlwKSBwLT5udHlwPW5ld190eXAoKTsKKyAgICBwLT5udHlwLT5mbGFncz1DT05TVHxJTlQ7CisgICAgcmV0dXJuOworICB9CisKKworICBpZihwLT5sZWZ0KQorICAgIHNpbXBsZV9hbGdfb3B0KHAtPmxlZnQpOworICBlbHNlCisgICAgcmV0dXJuOworICBpZihwLT5yaWdodCkKKyAgICBzaW1wbGVfYWxnX29wdChwLT5yaWdodCk7CisKKyAgaWYocC0+bGVmdC0+ZmxhZ3M9PUNFWFBSfHxwLT5sZWZ0LT5mbGFncz09UENFWFBSKXsKKyAgICBldmFsX2NvbnN0bihwLT5sZWZ0KTsKKyAgICBkMT12bGRvdWJsZTt1MT12dW1heDtzMT12bWF4O2N8PTE7CisgIH0KKyAgaWYocC0+cmlnaHQmJihwLT5yaWdodC0+ZmxhZ3M9PUNFWFBSfHxwLT5yaWdodC0+ZmxhZ3M9PVBDRVhQUikpeworICAgIGV2YWxfY29uc3RuKHAtPnJpZ2h0KTsKKyAgICBkMj12bGRvdWJsZTt1Mj12dW1heDtzMj12bWF4O2N8PTI7CisgIH0KKworICBpZihwLT5udHlwKSB0PXAtPm50eXAtPmZsYWdzOworCisgIGlmKGM9PTMmJigoZj49T1ImJmY8PUFORCl8fChmPj1MU0hJRlQmJmY8PU1PRCkpKXsKKyAgICBpZihERUJVRyYxKSBwcmludGYoImRpZCBzaW1wbGVfYWxnIGNvbnN0YW50IGZvbGRpbmdcbiIpOworICAgIGlmKCF0KSB0PWFyaXRoX2ZsYWcocC0+bGVmdC0+bnR5cC0+ZmxhZ3MscC0+cmlnaHQtPm50eXAtPmZsYWdzKTsKKyAgICBpZihERUJVRyYxKSBwcmludGYoImRpZCBzaW1wbGUgY29uc3RhbnQgZm9sZGluZ1xuIik7CisKKyAgICBpZihmPT1BTkQmJklTSU5UKHQpKXsKKyAgICAgIHZ1bWF4PXp1bWFuZCh1MSx1Mik7CisgICAgICB2bWF4PXptYW5kKHMxLHMyKTsKKyAgICB9CisgICAgaWYoZj09T1ImJklTSU5UKHQpKXsKKyAgICAgIHZ1bWF4PXp1bW9yKHUxLHUyKTsKKyAgICAgIHZtYXg9em1vcihzMSxzMik7CisgICAgfQorICAgIGlmKGY9PVhPUiYmSVNJTlQodCkpeworICAgICAgdnVtYXg9enVteG9yKHUxLHUyKTsKKyAgICAgIHZtYXg9em14b3IoczEsczIpOworICAgIH0KKyAgICBpZihmPT1BREQpeworICAgICAgdnVtYXg9enVtYWRkKHUxLHUyKTsKKyAgICAgIHZtYXg9em1hZGQoczEsczIpOworICAgICAgdmxkb3VibGU9emxkYWRkKGQxLGQyKTsKKyAgICB9CisgICAgaWYoZj09U1VCKXsKKyAgICAgIHZ1bWF4PXp1bXN1Yih1MSx1Mik7CisgICAgICB2bWF4PXptc3ViKHMxLHMyKTsKKyAgICAgIHZsZG91YmxlPXpsZHN1YihkMSxkMik7CisgICAgfQorICAgIGlmKGY9PU1VTFR8fGY9PVBNVUxUKXsKKyAgICAgIHZ1bWF4PXp1bW11bHQodTEsdTIpOworICAgICAgdm1heD16bW11bHQoczEsczIpOworICAgICAgdmxkb3VibGU9emxkbXVsdChkMSxkMik7CisgICAgICBpZihmPT1QTVVMVCkgcC0+ZmxhZ3M9UENFWFBSOworICAgIH0KKyAgICBpZihmPT1ESVYpeworICAgICAgaWYoem1lcXRvKGwyem0oMEwpLHMyKSYmenVtZXF0byh1bDJ6dW0oMFVMKSx1MikmJnpsZGVxdG8oZDJ6bGQoMC4wKSxkMikpeworCWVycm9yKDg0KTsKKwl2bWF4PWwyem0oMEwpO3Z1bWF4PXVsMnp1bSgwVUwpO3ZsZG91YmxlPWQyemxkKDAuMCk7CisgICAgICB9ZWxzZXsKKwlpZighenVtZXF0byh1bDJ6dW0oMFVMKSx1MikpIHZ1bWF4PXp1bWRpdih1MSx1Mik7CisJaWYoIXptZXF0byhsMnptKDBMKSxzMikpIHZtYXg9em1kaXYoczEsczIpOworCWlmKCF6bGRlcXRvKGQyemxkKDAuMCksZDIpKSB2bGRvdWJsZT16bGRkaXYoZDEsZDIpOworICAgICAgfQorICAgIH0KKyAgICBpZihmPT1NT0QmJklTSU5UKHQpKXsKKyAgICAgIGlmKHptZXF0byhsMnptKDBMKSxzMikmJnp1bWVxdG8odWwyenVtKDBVTCksdTIpKXsKKwllcnJvcig4NCk7CisJdm1heD1sMnptKDBMKTt2dW1heD16bTJ6dW0odm1heCk7CisgICAgICB9ZWxzZXsKKwlpZighenVtZXF0byh1bDJ6dW0oMFVMKSx1MikpIHZ1bWF4PXp1bW1vZCh1MSx1Mik7CisJaWYoIXptZXF0byhsMnptKDBMKSxzMikpIHZtYXg9em1tb2QoczEsczIpOworICAgICAgfQorICAgIH0KKyAgICBpZihmPT1MU0hJRlQmJklTSU5UKHQpKXsKKyAgICAgIHZ1bWF4PXp1bWxzaGlmdCh1MSx1Mik7CisgICAgICB2bWF4PXptbHNoaWZ0KHMxLHMyKTsKKyAgICB9CisgICAgaWYoZj09UlNISUZUJiZJU0lOVCh0KSl7CisgICAgICB2dW1heD16dW1yc2hpZnQodTEsdTIpOworICAgICAgdm1heD16bXJzaGlmdChzMSxzMik7CisgICAgfQorICB9ZWxzZSBpZihjPT0xJiZmPT1NSU5VUyl7CisgICAgaWYoIXQpIHQ9YXJpdGhfZmxhZyhwLT5sZWZ0LT5udHlwLT5mbGFncyxwLT5sZWZ0LT5udHlwLT5mbGFncyk7CisgICAgdm1heD16bXN1YihaMCxzMSk7CisgICAgdnVtYXg9enVtc3ViKFpVMCx1MSk7CisgICAgdmxkb3VibGU9emxkc3ViKGQyemxkKDAuMCksZDEpOworICB9ZWxzZSBpZihjPT0xJiZmPT1LT01QTEVNRU5UKXsKKyAgICBpZighdCkgdD1hcml0aF9mbGFnKHAtPmxlZnQtPm50eXAtPmZsYWdzLHAtPmxlZnQtPm50eXAtPmZsYWdzKTsKKyAgICBpZighSVNJTlQodCkpIHJldHVybjsKKyAgICB2bWF4PXpta29tcGwoczEpOworICAgIHZ1bWF4PXp1bWtvbXBsKHUxKTsKKyAgfWVsc2UgaWYoYz09MSYmZj09TkVHQVRJT04peworICAgIGlmKCFwLT5sZWZ0LT5udHlwKSByZXR1cm47CisgICAgdD1JTlQ7CisgICAgaWYoIUlTSU5UKHAtPmxlZnQtPm50eXAtPmZsYWdzKSl7CisgICAgICBpZih6bGRlcXRvKGQxLGQyemxkKDAuMCkpKSB2bWF4PVoxOyBlbHNlIHZtYXg9WjA7CisgICAgfWVsc2UgaWYocC0+bGVmdC0+bnR5cC0+ZmxhZ3MmVU5TSUdORUQpeworICAgICAgaWYoenVtZXF0byh1MSxaVTApKSB2bWF4PVoxOyBlbHNlIHZtYXg9WjA7CisgICAgfWVsc2UKKyAgICAgIGlmKHptZXF0byhzMSxaMCkpIHZtYXg9WjE7IGVsc2Ugdm1heD1aMDsKKyAgfWVsc2UKKyAgICByZXR1cm47CisKKyAgcC0+ZmxhZ3M9Q0VYUFI7CisgIGlmKHAtPmxlZnQmJiFwLT5sZWZ0LT5zaWRlZngpIHtmcmVlX2V4cHJlc3Npb24ocC0+bGVmdCk7cC0+bGVmdD0wO30KKyAgaWYocC0+cmlnaHQmJnAtPnJpZ2h0LT5zaWRlZngpIHtmcmVlX2V4cHJlc3Npb24ocC0+cmlnaHQpO3AtPnJpZ2h0PTA7fQorCisgIGlmKElTRkxPQVQodCkpeworICAgIGd2YWwudmxkb3VibGU9dmxkb3VibGU7CisgICAgZXZhbF9jb25zdCgmZ3ZhbCxMRE9VQkxFKTsKKyAgfWVsc2V7CisgICAgaWYodCZVTlNJR05FRCl7CisgICAgICBndmFsLnZ1bWF4PXZ1bWF4OworICAgICAgZXZhbF9jb25zdCgmZ3ZhbCwoVU5TSUdORUR8TUFYSU5UKSk7CisgICAgfWVsc2V7CisgICAgICBndmFsLnZtYXg9dm1heDsKKyAgICAgIGV2YWxfY29uc3QoJmd2YWwsTUFYSU5UKTsKKyAgICB9CisgIH0KKyAgaW5zZXJ0X2NvbnN0KCZwLT52YWwsdCk7CisgIGlmKCFwLT5udHlwKXtwLT5udHlwPW5ld190eXAoKTtwLT5udHlwLT5mbGFncz10O30KK30KKworCitpbnQgYWxnX29wdChucCBwLHR5cGUgKnR0eXApCisvKiAgZnVlaHJ0IGFsZ2VicmFpc2NoZSBWZXJlaW5mYWNodW5nZW4gZHVyY2ggICAgICAgICAgICAgICAgICAgKi8KKy8qICBoaWVyIG5vY2ggZ2VuYXUgdGVzdGVuLCB3YXMgQU5TSS1nZW1hZXNzIGVybGF1YnQgaXN0IGV0Yy4gICAqLworLyogIHYuYS4gRmxvYXRpbmctUG9pbnQgaXN0IGV2dGwuIGtyaXRpc2NoICAgICAgICAgICAgICAgICAgICAgICovCit7CisgICAgaW50IGM9MCxmLGtvbW0sbnVsbDEsbnVsbDIsZWluczEsZWluczI7bnAgbWVyazsKKyAgICB6bGRvdWJsZSBkMSxkMjt6dW1heCB1MSx1Mjt6bWF4IHMxLHMyOworICAgIGY9cC0+ZmxhZ3M7CisgICAgCisgICAgLyogZG8gbm90IG9wdGltemUgcG9pbnRlci1wb2ludGVyICovCisgICAgaWYoZj09U1VCJiZJU1BPSU5URVIocC0+bGVmdC0+bnR5cC0+ZmxhZ3MpJiZJU1BPSU5URVIocC0+cmlnaHQtPm50eXAtPmZsYWdzKSkKKyAgICAgIHJldHVybiAxOworCisgICAgLyogIGtvbW11dGF0aXY/ICovCisgICAgaWYoZj09QUREfHxmPT1NVUxUfHxmPT1QTVVMVHx8KGY+PU9SJiZmPD1BTkQpKSBrb21tPTE7IGVsc2Uga29tbT0wOworICAgIC8qICBCZXJlY2huZXQgV2VydCwgd2VubiBiZWlkZXMgS29uc3RhbnRlbiBzaW5kICAgICAqLworICAgIGlmKHAtPmxlZnQtPmZsYWdzPT1DRVhQUnx8cC0+bGVmdC0+ZmxhZ3M9PVBDRVhQUil7CisgICAgICAgIGV2YWxfY29uc3RuKHAtPmxlZnQpOworICAgICAgICBkMT12bGRvdWJsZTt1MT12dW1heDtzMT12bWF4O2N8PTE7CisgICAgfQorICAgIGlmKHAtPnJpZ2h0LT5mbGFncz09Q0VYUFJ8fHAtPnJpZ2h0LT5mbGFncz09UENFWFBSKXsKKyAgICAgICAgZXZhbF9jb25zdG4ocC0+cmlnaHQpOworICAgICAgICBkMj12bGRvdWJsZTt1Mj12dW1heDtzMj12bWF4O2N8PTI7CisgICAgfQorICAgIGlmKGM9PTMpeworICAgICAgICBwLT5mbGFncz1DRVhQUjsKKyAgICAgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJkaWQgc2ltcGxlIGNvbnN0YW50IGZvbGRpbmdcbiIpOworICAgICAgICBpZighcC0+bGVmdC0+c2lkZWZ4KSB7ZnJlZV9leHByZXNzaW9uKHAtPmxlZnQpO3AtPmxlZnQ9MDt9CisgICAgICAgIGlmKCFwLT5yaWdodC0+c2lkZWZ4KSB7ZnJlZV9leHByZXNzaW9uKHAtPnJpZ2h0KTtwLT5yaWdodD0wO30KKyAgICAgICAgaWYoZj09QU5EKXsKKwkgIHZ1bWF4PXp1bWFuZCh1MSx1Mik7CisJICB2bWF4PXptYW5kKHMxLHMyKTsKKyAgICAgICAgfQorICAgICAgICBpZihmPT1PUil7CisJICB2dW1heD16dW1vcih1MSx1Mik7CisJICB2bWF4PXptb3IoczEsczIpOworICAgICAgICB9CisgICAgICAgIGlmKGY9PVhPUil7CisJICB2dW1heD16dW14b3IodTEsdTIpOworCSAgdm1heD16bXhvcihzMSxzMik7CisgICAgICAgIH0KKyAgICAgICAgaWYoZj09QUREKXsKKwkgIHZ1bWF4PXp1bWFkZCh1MSx1Mik7CisJICB2bWF4PXptYWRkKHMxLHMyKTsKKwkgIHZsZG91YmxlPXpsZGFkZChkMSxkMik7CisgICAgICAgIH0KKyAgICAgICAgaWYoZj09U1VCKXsKKwkgIHZ1bWF4PXp1bXN1Yih1MSx1Mik7CisJICB2bWF4PXptc3ViKHMxLHMyKTsKKwkgIHZsZG91YmxlPXpsZHN1YihkMSxkMik7CisgICAgICAgIH0KKyAgICAgICAgaWYoZj09TVVMVHx8Zj09UE1VTFQpeworCSAgdnVtYXg9enVtbXVsdCh1MSx1Mik7CisJICB2bWF4PXptbXVsdChzMSxzMik7CisJICB2bGRvdWJsZT16bGRtdWx0KGQxLGQyKTsKKwkgIGlmKGY9PVBNVUxUKSBwLT5mbGFncz1QQ0VYUFI7CisgICAgICAgIH0KKyAgICAgICAgaWYoZj09RElWKXsKKwkgIGlmKHptZXF0byhsMnptKDBMKSxzMikmJnp1bWVxdG8odWwyenVtKDBVTCksdTIpJiZ6bGRlcXRvKGQyemxkKDAuMCksZDIpKXsKKwkgICAgZXJyb3IoODQpOworCSAgICB2bWF4PWwyem0oMEwpO3Z1bWF4PXVsMnp1bSgwVUwpO3ZsZG91YmxlPWQyemxkKDAuMCk7CisJICB9ZWxzZXsKKwkgICAgaWYoIXp1bWVxdG8odWwyenVtKDBVTCksdTIpKSB2dW1heD16dW1kaXYodTEsdTIpOworCSAgICBpZighem1lcXRvKGwyem0oMEwpLHMyKSkgdm1heD16bWRpdihzMSxzMik7CisJICAgIGlmKCF6bGRlcXRvKGQyemxkKDAuMCksZDIpKSB2bGRvdWJsZT16bGRkaXYoZDEsZDIpOworCSAgfQorICAgICAgICB9CisgICAgICAgIGlmKGY9PU1PRCl7CisJICBpZih6bWVxdG8obDJ6bSgwTCksczIpJiZ6dW1lcXRvKHVsMnp1bSgwVUwpLHUyKSl7CisJICAgIGVycm9yKDg0KTsKKwkgICAgdm1heD1sMnptKDBMKTt2dW1heD16bTJ6dW0odm1heCk7CisJICB9ZWxzZXsKKwkgICAgaWYoIXp1bWVxdG8odWwyenVtKDBVTCksdTIpKSB2dW1heD16dW1tb2QodTEsdTIpOworCSAgICBpZighem1lcXRvKGwyem0oMEwpLHMyKSkgdm1heD16bW1vZChzMSxzMik7CisJICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoZj09TFNISUZUKXsKKwkgIHZ1bWF4PXp1bWxzaGlmdCh1MSx1Mik7CisJICB2bWF4PXptbHNoaWZ0KHMxLHMyKTsKKyAgICAgICAgfQorICAgICAgICBpZihmPT1SU0hJRlQpeworCSAgdnVtYXg9enVtcnNoaWZ0KHUxLHUyKTsKKwkgIHZtYXg9em1yc2hpZnQoczEsczIpOworICAgICAgICB9CisJaWYoSVNGTE9BVChwLT5udHlwLT5mbGFncykpeworCSAgZ3ZhbC52bGRvdWJsZT12bGRvdWJsZTsKKwkgIGV2YWxfY29uc3QoJmd2YWwsTERPVUJMRSk7CisJfWVsc2V7CisJICBpZihwLT5udHlwLT5mbGFncyZVTlNJR05FRCl7CisJICAgIGd2YWwudnVtYXg9dnVtYXg7CisJICAgIGV2YWxfY29uc3QoJmd2YWwsKFVOU0lHTkVEfE1BWElOVCkpOworCSAgfWVsc2V7CisJICAgIGd2YWwudm1heD12bWF4OworCSAgICBldmFsX2NvbnN0KCZndmFsLE1BWElOVCk7CisJICB9CisJfQorCWluc2VydF9jb25zdG4ocCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAvKiAgS29uc3RhbnRlbiBuYWNoIHJlY2h0cywgd2VubiBtb2VnbGljaCAgICAgICAqLworICAgIGlmKGM9PTEmJmtvbW0peworICAgICAgICBpZihERUJVRyYxKSBwcmludGYoImV4Y2hhbmdlZCBjb21tdXRhdGl2ZSBjb25zdGFudCBvcGVyYW5kXG4iKTsKKyAgICAgICAgbWVyaz1wLT5sZWZ0O3AtPmxlZnQ9cC0+cmlnaHQ7cC0+cmlnaHQ9bWVyazsKKyAgICAgICAgYz0yOworICAgICAgICBkMj1kMTt1Mj11MTtzMj1zMTsKKyAgICB9CisgICAgLyogIFZlcnRhdXNjaHQgZGllIEtub3RlbiwgdW0gS29uc3RhbnRlbiAgICAgICAgICAgICAgICAqLworICAgIC8qICBiZXNzZXIgenVzYW1tZW56dWZhc3NlbiAoYmVpIGFsbGVuIFR5cGUgZXJsYXVidD8pICAgKi8KKyAgICAvKiAgSGllciBtdXNzIG5vY2ggZWluaWdlcyBrb250cm9sbGllcnQgd2VyZGVuICAgICAgICAgICovCisgICAgaWYoa29tbSYmYz09MiYmcC0+ZmxhZ3M9PXAtPmxlZnQtPmZsYWdzJiYoSVNJTlQocC0+bnR5cC0+ZmxhZ3MpfHxjX2ZsYWdzWzIxXSZVU0VERkxBRykpeworICAgICAgICBpZihwLT5sZWZ0LT5yaWdodC0+ZmxhZ3M9PUNFWFBSfHxwLT5sZWZ0LT5yaWdodC0+ZmxhZ3M9PVBDRVhQUil7CisgICAgICAgICAgICBucCBtZXJrOworICAgICAgICAgICAgbWVyaz1wLT5yaWdodDtwLT5yaWdodD1wLT5sZWZ0LT5sZWZ0O3AtPmxlZnQtPmxlZnQ9bWVyazsKKyAgICAgICAgICAgIGlmKERFQlVHJjEpIHByaW50ZigiVmVydGF1c2NoZSBBZGQtTm9kZXNcbiIpOworCSAgICBkb250b3B0PTA7CisgICAgICAgICAgICByZXR1cm4gdHlwZV9leHByZXNzaW9uMihwLHR0eXApOworICAgICAgICB9CisgICAgfQorICAgIG51bGwxPW51bGwyPWVpbnMxPWVpbnMyPTA7CisgICAgaWYoYyYxKXsKKyAgICAgIGlmKHpsZGVxdG8oZDEsZDJ6bGQoMC4wKSkmJnp1bWVxdG8odTEsdWwyenVtKDBVTCkpJiZ6bWVxdG8oczEsbDJ6bSgwTCkpKSBudWxsMT0xOyAgIAorICAgICAgaWYoemxkZXF0byhkMSxkMnpsZCgxLjApKSYmenVtZXF0byh1MSx1bDJ6dW0oMVVMKSkmJnptZXF0byhzMSxsMnptKDFMKSkpIGVpbnMxPTE7CisgICAgICBpZighKHAtPm50eXAtPmZsYWdzJlVOU0lHTkVEKSYmemxkZXF0byhkMSxkMnpsZCgtMS4wKSkmJnptZXF0byhzMSxsMnptKC0xTCkpKSBlaW5zMT0tMTsKKyAgICB9CisgICAgaWYoYyYyKXsKKyAgICAgIGlmKHpsZGVxdG8oZDIsZDJ6bGQoMC4wKSkmJnp1bWVxdG8odTIsdWwyenVtKDBVTCkpJiZ6bWVxdG8oczIsbDJ6bSgwTCkpKSBudWxsMj0xOyAKKyAgICAgIGlmKHpsZGVxdG8oZDIsZDJ6bGQoMS4wKSkmJnp1bWVxdG8odTIsdWwyenVtKDFVTCkpJiZ6bWVxdG8oczIsbDJ6bSgxTCkpKSBlaW5zMj0xOyAKKyAgICAgIGlmKCEocC0+bnR5cC0+ZmxhZ3MmVU5TSUdORUQpJiZ6bGRlcXRvKGQyLGQyemxkKC0xLjApKSYmem1lcXRvKHMyLGwyem0oLTFMKSkpIGVpbnMyPS0xOworICAgIH0KKyAgICBpZihjPT0yKXsKKyAgICAgICAgLyogIGErMD1hLTA9YV4wPWE+PjA9YTw8MD1hKjE9YS8xPWEgICAqLworICAgICAgICBpZigoKGVpbnMyPT0xJiYoZj09TVVMVHx8Zj09UE1VTFR8fGY9PURJVikpfHwobnVsbDImJihmPT1BRER8fGY9PVNVQnx8Zj09T1J8fGY9PVhPUnx8Zj09TFNISUZUfHxmPT1SU0hJRlQpKSkmJiFwLT5yaWdodC0+c2lkZWZ4KXsKKyAgICAgICAgICAgIGlmKERFQlVHJjEpe2lmKGY9PU1VTFR8fGY9PVBNVUxUfHxmPT1ESVYpIHByaW50ZigiYSovMS0+YVxuIik7IGVsc2UgcHJpbnRmKCJhKy1eMC0+YVxuIik7fQorICAgICAgICAgICAgZnJlZV9leHByZXNzaW9uKHAtPnJpZ2h0KTsKKyAgICAgICAgICAgIG1lcms9cC0+bGVmdDsKKyAgICAgICAgICAgICpwPSpwLT5sZWZ0OworLyogICAgICAgICAgICBmcmVldHlwKG1lcmstPm50eXApOyAgZGFzIHdhciBGZWhsZXIgICovCisgICAgICAgICAgICBmcmVlKG1lcmspOworCSAgICBkb250b3B0PTA7CisgICAgICAgICAgICByZXR1cm4gdHlwZV9leHByZXNzaW9uMihwLHR0eXApOworICAgICAgICB9CisgICAgICAgIC8qICBhKjA9MCAgICovCisgICAgICAgIGlmKG51bGwyJiYoZj09TVVMVHx8Zj09UE1VTFR8fGY9PUFORHx8Zj09RElWfHxmPT1NT0QpKXsKKyAgICAgICAgICAgIGlmKERFQlVHJjEpIHByaW50ZigiYSomLyUlMC0+MFxuIik7CisgICAgICAgICAgICBpZihudWxsMiYmKGY9PURJVnx8Zj09TU9EKSkgZXJyb3IoODQpOworICAgICAgICAgICAgaWYocC0+ZmxhZ3M9PVBNVUxUKSBwLT5mbGFncz1QQ0VYUFI7IGVsc2UgcC0+ZmxhZ3M9Q0VYUFI7CisJICAgIGd2YWwudmludD16bTJ6aShsMnptKDBMKSk7CisJICAgIGV2YWxfY29uc3QoJmd2YWwsSU5UKTsKKyAgICAgICAgICAgIC8qICBoaWVyIG51ciBpbnQsbG9uZyxmbG9hdCxkb3VibGUgbW9lZ2xpY2gsIGhvZmZlIGljaCAgKi8KKyAgICAgICAgICAgIGluc2VydF9jb25zdG4ocCk7CisgICAgICAgICAgICBpZighcC0+bGVmdC0+c2lkZWZ4KXtmcmVlX2V4cHJlc3Npb24ocC0+bGVmdCk7cC0+bGVmdD0wO30gZWxzZSBtYWtlX2NleHByKHAtPmxlZnQpOworICAgICAgICAgICAgaWYoIXAtPnJpZ2h0LT5zaWRlZngpe2ZyZWVfZXhwcmVzc2lvbihwLT5yaWdodCk7cC0+cmlnaHQ9MDt9IGVsc2UgbWFrZV9jZXhwcihwLT5yaWdodCk7CisKKy8qICAgICAgICAgICAgcmV0dXJuKHR5cGVfZXhwcmVzc2lvbjIocCx0dHlwKSk7ICAgKi8KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmKGVpbnMyPT0tMSYmKGY9PU1VTFR8fGY9PVBNVUxUfHxmPT1ESVYpJiYhcC0+cmlnaHQtPnNpZGVmeCl7CisgICAgICAgICAgICBpZihERUJVRyYxKSBwcmludGYoImEqLygtMSktPi1hXG4iKTsKKyAgICAgICAgICAgIGZyZWVfZXhwcmVzc2lvbihwLT5yaWdodCk7CisgICAgICAgICAgICBwLT5yaWdodD0wOworICAgICAgICAgICAgcC0+ZmxhZ3M9TUlOVVM7CisJICAgIGRvbnRvcHQ9MDsKKyAgICAgICAgICAgIHJldHVybiB0eXBlX2V4cHJlc3Npb24yKHAsdHR5cCk7CisgICAgICAgIH0KKwkvKiBjaGVjayB2b2xhdGlsZSAqLworCWlmKDApIC8qIFRPRE86IG1ha2UgdGhpcyBlZmZpY2llbnQgKi8KKwl7CisJICB0eXBlIHN0PXswfTsKKwkgIGlmKCF6bWVxdG8oc2l6ZXRhYltDSEFSXSxzaXpldGFiW1NIT1JUXSkpeworCSAgICAvL2lmKGY9PUFORCYmKCF0dHlwfHwodHR5cC0+ZmxhZ3MmTlEpPkNIQVIpJiZzaG9ydGN1dChBTkQsQ0hBUikmJnp1bWxlcSh1Mix0X21heFtDSEFSXSkpCisJICAgIC8vc3QuZmxhZ3M9Q0hBUjsKKwkgICAgaWYoZj09QU5EJiYoIXR0eXB8fCh0dHlwLT5mbGFncyZOUSk+Q0hBUikvKiYmKHAtPm50eXAtPmZsYWdzJlVOU0lHTkVEKSovJiZzaG9ydGN1dChBTkQsVU5TSUdORUR8Q0hBUikmJnp1bWxlcSh1Mix0dV9tYXhbQ0hBUl0pKQorCSAgICAgIHN0LmZsYWdzPVVOU0lHTkVEfENIQVI7CisJICB9CisJICBpZighem1lcXRvKHNpemV0YWJbU0hPUlRdLHNpemV0YWJbSU5UXSkpeworCSAgICAvL2lmKGY9PUFORCYmKCF0dHlwfHwodHR5cC0+ZmxhZ3MmTlEpPlNIT1JUKSYmc2hvcnRjdXQoQU5ELFNIT1JUKSYmenVtbGVxKHMyLHRfbWF4W1NIT1JUXSkpCisJICAgIC8vc3QuZmxhZ3M9U0hPUlQ7CisJICAgIGlmKGY9PUFORCYmKCF0dHlwfHwodHR5cC0+ZmxhZ3MmTlEpPlNIT1JUKS8qJiYocC0+bnR5cC0+ZmxhZ3MmVU5TSUdORUQpKi8mJnNob3J0Y3V0KEFORCxVTlNJR05FRHxTSE9SVCkmJnp1bWxlcSh1Mix0dV9tYXhbU0hPUlRdKSkKKwkgICAgICBzdC5mbGFncz1VTlNJR05FRHxTSE9SVDsKKwkgIH0KKwkgIC8vaWYoIXR0eXAmJihwLT5sZWZ0LT5udHlwLT5mbGFncyZOUSk+SU5UKSBzdC5mbGFncz0wOworCSAgaWYoc3QuZmxhZ3MpeworCSAgICBpbnQgcmV0O3R5cGUgKm90eXA7bnAgbjsKKwkgICAgaWYoIXAtPm50eXApIGllcnJvcigwKTsKKwkgICAgb3R5cD1jbG9uZV90eXAocC0+bnR5cCk7CisJICAgIG49bmV3X25vZGUoKTsKKwkgICAgbi0+bGVmdD1wLT5sZWZ0OworCSAgICBuLT5yaWdodD0wOworCSAgICBuLT5mbGFncz1DQVNUOworCSAgICBuLT5udHlwPWNsb25lX3R5cCgmc3QpOworCSAgICBldmFsX2NvbnN0KCZwLT5yaWdodC0+dmFsLHAtPnJpZ2h0LT5udHlwLT5mbGFncyk7CisJICAgIHAtPnJpZ2h0LT5udHlwLT5mbGFncz1zdC5mbGFnczsKKwkgICAgaW5zZXJ0X2NvbnN0KCZwLT5yaWdodC0+dmFsLHN0LmZsYWdzKTsKKwkgICAgcC0+bGVmdD1uOworCSAgICBuPW5ld19ub2RlKCk7CisJICAgICpuPSpwOworCSAgICBwLT5sZWZ0PW47CisJICAgIHAtPnJpZ2h0PTA7CisJICAgIHAtPmZsYWdzPUNBU1Q7CisJICAgIHAtPm50eXA9b3R5cDsKKwkgICAgcmV0PXR5cGVfZXhwcmVzc2lvbjIocC0+bGVmdCwmc3QpOworCisJICAgIHJldHVybiByZXQ7CisJICB9CisJfQorCQorICAgIH0KKyAgICBpZihjPT0xKXsKKyAgICAgICAgLyogIDAtYT0tYSAgKi8KKyAgICAgICAgaWYoZj09U1VCJiZudWxsMSYmIXAtPmxlZnQtPnNpZGVmeCl7CisgICAgICAgICAgICBpZihERUJVRyYxKSBwcmludGYoIjAtYS0+LWFcbiIpOworICAgICAgICAgICAgZnJlZV9leHByZXNzaW9uKHAtPmxlZnQpOworICAgICAgICAgICAgcC0+ZmxhZ3M9TUlOVVM7CisgICAgICAgICAgICBwLT5sZWZ0PXAtPnJpZ2h0OworICAgICAgICAgICAgcC0+cmlnaHQ9MDsKKwkgICAgZG9udG9wdD0wOworICAgICAgICAgICAgcmV0dXJuIHR5cGVfZXhwcmVzc2lvbjIocCx0dHlwKTsKKyAgICAgICAgfQorICAgICAgICAvKiAgMC9hPTAgICAqLworICAgICAgICBpZihudWxsMSYmKGY9PURJVnx8Zj09TU9EfHxmPT1MU0hJRlR8fGY9PVJTSElGVCkpeworICAgICAgICAgICAgaWYoREVCVUcmMSkgcHJpbnRmKCIwLyUlPDw+PmEtPjBcbiIpOworICAgICAgICAgICAgcC0+ZmxhZ3M9Q0VYUFI7CisJICAgIGd2YWwudmludD16bTJ6aShsMnptKDBMKSk7CisJICAgIGV2YWxfY29uc3QoJmd2YWwsSU5UKTsKKyAgICAgICAgICAgIGluc2VydF9jb25zdG4ocCk7CisgICAgICAgICAgICBpZighcC0+bGVmdC0+c2lkZWZ4KXtmcmVlX2V4cHJlc3Npb24ocC0+bGVmdCk7cC0+bGVmdD0wO31lbHNlIG1ha2VfY2V4cHIocC0+bGVmdCk7CisgICAgICAgICAgICBpZighcC0+cmlnaHQtPnNpZGVmeCl7ZnJlZV9leHByZXNzaW9uKHAtPnJpZ2h0KTtwLT5yaWdodD0wO30gZWxzZSBtYWtlX2NleHByKHAtPnJpZ2h0KTsKKwkgICAgZG9udG9wdD0wOworICAgICAgICAgICAgcmV0dXJuIHR5cGVfZXhwcmVzc2lvbjIocCx0dHlwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKK30KK3ZvaWQgbWFrZV9jZXhwcihucCBwKQorLyogIE1hY2h0IGF1cyBlaW5lbSBLbm90ZW4sIGRlciBkdXJjaCBjb25zdGFudC1mb2xkaW5nIHVlYmVyZmx1ZXNzaWcgICAgKi8KKy8qICB3dXJkZSwgZWluZSBQQ0VYUFIsIHNvZmVybiBlciBrZWluZSBOZWJlbndpcmt1bmdlbiB2b24gc2ljaCBhdXMgICAgICovCisvKiAgZXJ6ZXVndC4gSGllciBub2NoIHVlYmVycHJ1ZWZlbiwgb2IgQ0VYUFIgYmVzc2VyIHdhZXJlLiAgICAgICAgICAgICAqLworLyogIEZ1ZWhydCByZWt1cnNpdmVuIEFic3RpZWcgZHVyY2guIElzdCBkYXMgc28ga29ycmVrdD8gICAgICAgICAgICAgICAgKi8KK3sKKyAgICBpbnQgZj1wLT5mbGFnczsKKyAgICBpZihmIT1BU1NJR04mJmYhPUFTU0lHTk9QJiZmIT1DQUxMJiZmIT1QT1NUSU5DJiZmIT1QT1NUREVDJiZmIT1QUkVJTkMmJmYhPVBSRURFQyYmZiE9TEFORCYmZiE9TE9SKXsKKyAgICAgICAgcC0+ZmxhZ3M9UENFWFBSOworICAgICAgICBpZihwLT5sZWZ0KSBtYWtlX2NleHByKHAtPmxlZnQpOworICAgICAgICBpZihwLT5yaWdodCkgbWFrZV9jZXhwcihwLT5yaWdodCk7CisgICAgfQorfQoraW50IHRlc3RfYXNzaWdubWVudCh0eXBlICp6dCxucCBxKQorLyogIHRlc3RldCwgb2IgcSBhbiBUeXAgeiB6dWdld2llc2VuIHdlcmRlbiBkYXJmICAgICovCit7CisgIHR5cGUgKnF0PXEtPm50eXA7CisgIGlmKElTQVJJVEgoenQtPmZsYWdzKSYmSVNBUklUSChxdC0+ZmxhZ3MpKXsKKyAgICBpZihJU0lOVCh6dC0+ZmxhZ3MpJiZJU0lOVChxdC0+ZmxhZ3MpJiYKKyAgICAgICF6bWxlcShzaXpldGFiW3F0LT5mbGFncyZOUV0sc2l6ZXRhYlt6dC0+ZmxhZ3MmTlFdKSYmcS0+ZmxhZ3MhPUNFWFBSKXsKKyNpZmRlZiBIQVZFX01JU1JBCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICAgIGVycm9yKDE2Nik7CisgICAgfQorICAgIGlmKHEtPmZsYWdzPT1DRVhQUil7CisgICAgICB6bWF4IG1zLG5zO3p1bWF4IG11LG51OworICAgICAgZXZhbF9jb25zdG4ocSk7CisgICAgICBtcz12bWF4O211PXZ1bWF4OworICAgICAgaW5zZXJ0X2NvbnN0KCZndmFsLHp0LT5mbGFncyZ+VU5TSUdORUQpOworICAgICAgZXZhbF9jb25zdCgmZ3ZhbCx6dC0+ZmxhZ3MmflVOU0lHTkVEKTsKKyAgICAgIG5zPXZtYXg7CisgICAgICBldmFsX2NvbnN0bihxKTsKKyAgICAgIGluc2VydF9jb25zdCgmZ3ZhbCx6dC0+ZmxhZ3N8VU5TSUdORUQpOworICAgICAgZXZhbF9jb25zdCgmZ3ZhbCx6dC0+ZmxhZ3N8VU5TSUdORUQpOworICAgICAgbnU9dnVtYXg7CisgICAgICBpZighenVtZXF0byhudSxtdSkmJiF6bWVxdG8obnMsbXMpKSAKKwllcnJvcigzNjMpOworICAgICAgZWxzZXsKKwlpZih6dC0+ZmxhZ3MmVU5TSUdORUQpeworCSAgaWYoIXp1bWVxdG8obnUsbXUpKQorCSAgICBlcnJvcigzNjIpOworCX1lbHNleworCSAgaWYoIXptZXF0byhucyxtcykpCisJICAgIGVycm9yKDM2Mik7CisJfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorICBpZigoSVNTVFJVQ1QoenQtPmZsYWdzKSYmSVNTVFJVQ1QocXQtPmZsYWdzKSl8fAorICAgIChJU1VOSU9OKHp0LT5mbGFncykmJklTVU5JT04ocXQtPmZsYWdzKSkpeworICAgICAgaWYoIWNvbXBhdGlibGVfdHlwZXMoenQscXQsTlUpKXsKKyAgICAgICAgZXJyb3IoMzgpOworICAgICAgcmV0dXJuIDA7CisgICAgfWVsc2UgCisgIHJldHVybiAxOworICB9CisgIGlmKElTVkVDVE9SKHp0LT5mbGFncykmJih6dC0+ZmxhZ3MmTlUpPT0ocXQtPmZsYWdzJk5VKSl7CisgICAgICByZXR1cm4gMTsKKyAgfQorICBpZihJU1BPSU5URVIoenQtPmZsYWdzKSYmSVNQT0lOVEVSKHF0LT5mbGFncykpeworICAgIGlmKCh6dC0+bmV4dC0+ZmxhZ3MmTlEpPT1WT0lEJiYhSVNGVU5DKHF0LT5uZXh0LT5mbGFncykpIHJldHVybiAxOworICAgIGlmKChxdC0+bmV4dC0+ZmxhZ3MmTlEpPT1WT0lEJiYhSVNGVU5DKHF0LT5uZXh0LT5mbGFncykpIHJldHVybiAxOworICAgIGlmKCFjb21wYXRpYmxlX3R5cGVzKHp0LT5uZXh0LHF0LT5uZXh0LChjX2ZsYWdzWzddJlVTRURGTEFHKT9OVTpOUSkpeworICAgICAgaWYoIWVjcHApeworICAgICAgICBlcnJvcig4NSk7CisgICAgICB9CisjaWZkZWYgSEFWRV9FQ1BQCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisvKiByZW1vdmVkICovCisjZW5kaWYKKyAgICB9ZWxzZXsKKyAgICAgIGlmKChxdC0+bmV4dC0+ZmxhZ3MmQ09OU1QpJiYhKHp0LT5uZXh0LT5mbGFncyZDT05TVCkpCisgICAgICAgIGVycm9yKDkxKTsKKyAgICAgIGlmKChxdC0+bmV4dC0+ZmxhZ3MmVk9MQVRJTEUpJiYhKHp0LT5uZXh0LT5mbGFncyZWT0xBVElMRSkpCisgICAgICAgIGVycm9yKDEwMCk7CisgICAgICBpZigocXQtPm5leHQtPmZsYWdzJlJFU1RSSUNUKSYmISh6dC0+bmV4dC0+ZmxhZ3MmUkVTVFJJQ1QpKQorICAgICAgICBlcnJvcigyOTgpOworICAgICAgaWYocXQtPm5leHQtPm5leHQmJnp0LT5uZXh0LT5uZXh0JiYhY29tcGF0aWJsZV90eXBlcyh6dC0+bmV4dC0+bmV4dCxxdC0+bmV4dC0+bmV4dCxOVSkpCisgICAgICAgIGVycm9yKDExMCk7CisgICAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYoSVNQT0lOVEVSKHp0LT5mbGFncykmJnEtPmZsYWdzPT1DRVhQUil7CisgICAgZXZhbF9jb25zdG4ocSk7CisgICAgaWYoISh6bGRlcXRvKGQyemxkKDAuMCksdmxkb3VibGUpJiZ6bWVxdG8obDJ6bSgwTCksdm1heCkmJnp1bWVxdG8odWwyenVtKDBVTCksdnVtYXgpKSkKKyAgICAgIGVycm9yKDExMyk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZXJyb3IoMzkpOworICByZXR1cm4gMDsKK30KKyNpZmRlZiBIQVZFX0VDUFAKKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKy8qIHJlbW92ZWQgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdWNwcC9SRUFETUUgYi91Y3BwL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NGNlMmFjCi0tLSAvZGV2L251bGwKKysrIGIvdWNwcC9SRUFETUUKQEAgLTAsMCArMSw3NTIgQEAKK3VjcHAtMS4wIGlzIGEgQyBwcmVwcm9jZXNzb3IgbW9zdGx5IGNvbXBsaWFudCB0byBJU08tQzk5LgorCitBdXRob3I6IFRob21hcyBQb3JuaW4gPHRob21hcy5wb3JuaW5AZW5zLmZyPgorTWFpbiBzaXRlOiBodHRwOi8vd3d3LmRpLmVucy5mci9+cG9ybmluL3VjcHAvCisKKworCitJTlRST0RVQ1RJT04KKy0tLS0tLS0tLS0tLQorCitBIEMgcHJlcHJvY2Vzc29yIGlzIGEgcGFydCBvZiBhIEMgY29tcGlsZXIgcmVzcG9uc2libGUgZm9yIG1hY3JvCityZXBsYWNlbWVudCwgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gYW5kIGluY2x1c2lvbiBvZiBoZWFkZXIgZmlsZXMuCitJdCBpcyBvZnRlbiBmb3VuZCBhcyBhIHN0YW5kLWFsb25lIHByb2dyYW0gb24gVW5peCBzeXN0ZW1zLgorCitVY3BwIGlzIHN1Y2ggYSBwcmVwcm9jZXNzb3I7IGl0IGlzIGRlc2lnbmVkIHRvIGJlIHF1aWNrIGFuZCBsaWdodCwKK2J1dCBhbnl3YXkgZnVsbHkgY29tcGxpYW50IHRvIHRoZSBJU08gc3RhbmRhcmQgOTg5OToxOTk5LCBhbHNvIGtub3duCithcyBDOTkuIFVjcHAgY2FuIGJlIGNvbXBpbGVkIGFzIGEgc3RhbmQtYWxvbmUgcHJvZ3JhbSwgb3IgbGlua2VkIHRvCitzb21lIG90aGVyIGNvZGU7IGluIHRoZSBsYXR0ZXIgY2FzZSwgdWNwcCB3aWxsIG91dHB1dCB0b2tlbnMsIG9uZQorYXQgYSB0aW1lLCBvbiBkZW1hbmQsIGFzIGFuIGludGVncmF0ZWQgbGV4ZXIuCisKK1VjcHAgb3BlcmF0ZXMgaW4gdHdvIG1vZGVzOgorLS0gbGV4ZXIgbW9kZTogdWNwcCBpcyBsaW5rZWQgdG8gc29tZSBvdGhlciBjb2RlIGFuZCBvdXRwdXRzIGEgc3RyZWFtIG9mCit0b2tlbnMgKGVhY2ggY2FsbCB0byB0aGUgbGV4KCkgZnVuY3Rpb24gd2lsbCBnaXZlIG9uZSB0b2tlbikKKy0tIG5vbi1sZXhlciBtb2RlOiB1Y3BwIHByZXByb2Nlc3NlcyB0ZXh0IGFuZCBvdXRwdXRzIHRoZSByZXN1bHRpbmcgdGV4dAorb24gYSBmaWxlIGRlc2NyaXB0b3I7IGlmIGxpbmtlZCB0byBzb21lIG90aGVyIGNvZGUsIHRoZSBjcHAoKSBmdW5jdGlvbgorbXVzdCBiZSBjYWxsZWQgcmVwZWF0ZWRseSwgb3RoZXJ3aXNlIHVjcHAgaXMgYSBzdGFuZC1hbG9uZSBiaW5hcnkuCisKKworCitJTlNUQUxMQVRJT04KKy0tLS0tLS0tLS0tLQorCisxLiBVbmNvbXByZXNzIHRoZSBhcmNoaXZlIGZpbGUgYW5kIGV4dHJhY3QgdGhlIHNvdXJjZSBmaWxlcy4KKworMi4gRWRpdCB0dW5lLmguIEhlcmUgaXMgYSBzaG9ydCBleHBsYW5hdGlvbiBvZiBjb21waWxlLXRpbWUgb3B0aW9uczoKKworICBMT1dfTUVNCisgICAgIEVuYWJsZSBtZW1vcnktc2F2aW5nIGZ1bmN0aW9uczsgdGhpcyBpcyBmb3IgbG93LWVuZCBhbmQgb2xkIHN5c3RlbXMsCisgICAgIGJ1dCBzZWVtcyB0byBiZSBnb29kIGZvciBsYXJnZXIgc3lzdGVtcyB0b28uIEtlZXAgaXQuCisgIE5PX0xJQkNfQlVGCisgIE5PX1VDUFBfQlVGCisgICAgIFR3byBvcHRpb25zIHVzZWQgdG8gZGlzYWJsZSB0aGUgdHdvIGJ1ZmZlcmluZ3MgaW5zaWRlIHVjcHAuIERlZmluZQorICAgICBib3RoIG9wdGlvbnMgZm9yIG1heGltdW0gbWVtb3J5IHNhdmluZyBidXQgeW91IHdpbGwgcHJvYmFibHkgd2FudAorICAgICB0byBrZWVwIGxpYmMgYnVmZmVyaW5nIGlmIHlvdSB3YW50IGRlY2VudCBwZXJmb3JtYW5jZS4gRGVmaW5lIG5vbmUKKyAgICAgb24gbGFyZ2Ugc3lzdGVtcyAobW9kZXJuIDMyIG9yIDY0LWJpdCBzeXN0ZW1zKS4KKyAgVUNQUF9NTUFQCisgICAgIFdpdGggdGhpcyBvcHRpb24sIGlmIHVjcHAgaW50ZXJuYWwgYnVmZmVyaW5nIGlzIGFjdGl2ZSwgdWNwcCB3aWxsCisgICAgIHRyeSB0byBtbWFwKCkgdGhlIGlucHV0IGZpbGVzLiBUaGlzIG1pZ2h0IGdpdmUgYSBzbGlnaHQgcGVyZm9ybWFuY2UKKyAgICAgaW1wcm92ZW1lbnQsIGJ1dCB3aWxsIHdvcmsgb25seSBvbiBhIGxpbWl0ZWQgc2V0IG9mIGFyY2hpdGVjdHVyZXMuCisgIFBSQUdNQV9UT0tFTklaRQorICAgICBNYWtlIHVjcHAgZ2VuZXJhdGUgdG9rZW5pemVkIFBSQUdNQSB0b2tlbnMgb24gI3ByYWdtYSBhbmQgX1ByYWdtYSgpOworICAgICB0b2tlbml6YXRpb24gaXMgbWFkZSB0aGlzIHdheTogdG9rZW5zIGFyZSBhc3NlbWJsZWQgYXMgYSBudWxsCisgICAgIHRlcm1pbmF0ZWQgYXJyYXkgb2YgdW5zaWduZWQgY2hhcnM7IGlmIGEgdG9rZW4gaGFzIGEgc3RyaW5nIHZhbHVlCisgICAgIChhcyBkZWZpbmVkIGJ5IHRoZSBTVFJJTkdfVE9LRU4gbWFjcm8pLCB0aGUgdmFsdWUgZm9sbG93cyB0aGUgdG9rZW4sCisgICAgIHRlcm1pbmF0ZWQgYnkgUFJBR01BX1RPS0VOX0VORCAoYnkgZGVmYXVsdCwgYSBuZXdsaW5lIGNoYXJhY3RlciBjYXN0CisgICAgIHRvIHVuc2lnbmVkIGNoYXIpLiBXaGl0ZXNwYWNlIHRva2VucyBhcmUgc2tpcHBlZC4gVGhlICJuYW1lIiB2YWx1ZQorICAgICBvZiB0aGUgUFJBR01BIHRva2VuIGlzIGEgcG9pbnRlciB0byB0aGF0IGFycmF5LiBUaGlzIHNldHRpbmcgaXMKKyAgICAgaXJyZWxldmFudCBpbiBub24tbGV4ZXIgbW9kZS4KKyAgUFJBR01BX0RVTVAKKyAgICAgSW4gbm9uLWxleGVyIG1vZGUsIGtlZXAgI3ByYWdtYSBpbiBvdXRwdXQ7IG5vbi12b2lkIF9QcmFnbWEoKSBhcmUKKyAgICAgdHJhbnNsYXRlZCB0byB0aGUgZXF1aXZhbGVudCAjcHJhZ21hLiBJcnJlbGV2YW50IGluIGxleGVyIG1vZGUuCisgIE5PX1BSQUdNQV9JTl9ESVJFQ1RJVkUKKyAgICAgRG8gbm90IGV2YWx1YXRlIF9QcmFnbWEoKSBpbnNpZGUgI2lmLCAjaW5jbHVkZSwgI2luY2x1ZGVfbmV4dCBhbmQgI2xpbmUKKyAgICAgZGlyZWN0aXZlczsgaW5zdGVhZCwgZW1pdCBhbiBlcnJvciAoc2luY2UgdGhlIHJlbWFpbmluZyBfUHJhZ21hIHdpbGwKKyAgICAgc3VyZWx5IGltcGx5IGEgc3ludGF4IGVycm9yKS4KKyAgSU5NQUNST19GTEFHCisgICAgIEluIGxleGVyIG1vZGUsIHNldCB0aGUgaW5tYWNybyBmbGFnIHRvIDEgaWYgdGhlIGN1cnJlbnQgdG9rZW4gY29tZXMKKyAgICAgZnJvbSBhIG1hY3JvIHJlcGxhY2VtZW50LCAwIG90aGVyd2lzZS4gbWFjcm9fY291bnQgbWFpbnRhaW5zIGFuCisgICAgIGluY3JlYXNpbmcgY291bnRlciBvZiBzdWNoIHJlcGxhY2VtZW50cy4gQ09OVEVYVCB0b2tlbnMgY291bnQgYXMKKyAgICAgb25lIG1hY3JvIHJlcGxhY2VtZW50IGVhY2guICNwcmFnbWEsIGFuZCBfUHJhZ21hKCkgdGhhdCBkbyBub3QgY29tZQorICAgICBmcm9tIGEgbWFjcm8gcmVwbGFjZW1lbnQsIGFsc28gY291bnQgYXMgb25lIG1hY3JvIHJlcGxhY2VtZW50IGVhY2guCisgICAgIFRoaXMgc2V0dGluZyBpcyBpcnJlbGV2YW50IGluIG5vbi1sZXhlciBtb2RlLgorICBTVERfSU5DTFVERV9QQVRICisgICAgIERlZmF1bHQgaW5jbHVkZSBwYXRoIGluIHN0YW5kLWFsb25lIHVjcHAuCisgIFNURF9NQUNST1MKKyAgICAgRGVmYXVsdCBwcmVkZWZpbmVkIG1hY3JvcyBpbiBzdGFuZC1hbG9uZSB1Y3BwLgorICBTVERfQVNTRVJUCisgICAgIERlZmF1bHQgYXNzZXJ0aW9ucyBpbiBzdGFuZC1hbG9uZSB1Y3BwLgorICBOQVRJVkVfSU5UTUFYCisgIE5BVElWRV9VSU5UTUFYCisgIFNJTVVMX1VJTlRNQVgKKyAgV0NIQVJfU0lHTkVETkVTUworICAgICBUaG9zZSBvcHRpb25zIGRlZmluZSBob3cgI2lmIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQ7IHNlZSB0aGUKKyAgICAgY3Jvc3MtY29tcGlsYXRpb24gc2VjdGlvbiBvZiB0aGlzIGZpbGUgZm9yIG1vcmUgaW5mby4KKyAgREVGQVVMVF9MRVhFUl9GTEFHUworICBERUZBVUxUX0NQUF9GTEFHUworICAgICBEZWZhdWx0IGZsYWdzIGluIHJlc3BlY3RpdmVseSBsZXhlciBhbmQgbm9uLWxleGVyIG1vZGVzLgorICBQT1NJWF9KTVAKKyAgICAgRGVmaW5lIHRoaXMgaWYgeW91ciBhcmNoaXRlY3R1cmUgZGVmaW5lcyBzaWdzZXRqbXAoKSBhbmQKKyAgICAgc2lnbG9uZ2ptcCgpOyBpdCBpcyBrbm93biB0byAodmVyeSBzbGlnaHRseSkgaW1wcm92ZSBwZXJmb3JtYW5jZQorICAgICBvbiBBSVggc3lzdGVtcy4KKyAgTUFYX0NIQVJfVkFMCisgICAgIFVjcHAgd2lsbCBjb25zaWRlciBjaGFyYWN0ZXJzIHdob3NlIHZhbHVlIGlzIGVxdWFsIG9yIGFib3ZlCisgICAgIE1BWF9DSEFSX1ZBTCBhcyBvdXRzaWRlIHRoZSBDIHNvdXJjZSBjaGFyc2V0IChzbyB0aGV5IHdpbGwgYmUKKyAgICAgdHJlYXRlZCBqdXN0IGxpa2UgJ0AnLCBmb3IgaW5zdGFuY2UpLiBGb3IgQVNDSUkgc3lzdGVtcywgMTI4CisgICAgIGlzIGZpbmUuIDI1NiBpcyBhIHNhZmVyIHZhbHVlLCBidXQgdXNlcyBtb3JlIChzdGF0aWMpIG1lbW9yeS4KKyAgICAgRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHVzZSBhIHBvd2VyIG9mIHR3by4gSWYgTUFYX0NIQVJfVkFMIGlzCisgICAgIGNvcnJlY3RseSBhZGp1c3RlZCwgdWNwcCBzaG91bGQgYmUgY29tcGF0aWJsZSB3aXRoIGFueSBjaGFyYWN0ZXIKKyAgICAgc2V0LgorICBVTkJSRUFLQUJMRV9TUEFDRQorICAgICBJZiB5b3Ugd2FudCBhbiBleHRyYS13aGl0ZXNwYWNlIGNoYXJhY3RlciwgZGVmaW5lIHRoaXMgbWFjcm8gdG8gdGhhdAorICAgICBjaGFyYWN0ZXIuIEZvciBpbnN0YW5jZSwgZGVmaW5lIHRoaXMgdG8gMTYwIG9uIGFuIElTTy04ODU5LTEgc3lzdGVtCisgICAgIGlmIHlvdSB3YW50IHRoZSAndW5icmVha2FibGUgc3BhY2UnIHRvIGJlIGNvbnNpZGVyZWQgYXMgd2hpdGVzcGFjZS4KKyAgU0VNUEVSX0ZJREVMSVMKKyAgICAgV2l0aCB0aGlzIG9wdGlvbiBzZXQsIHVjcHAsIHdoZW4gdXNlZCBhcyBhIGxleGVyLCB3aWxsIHBhc3MKKyAgICAgd2hpdGVzcGFjZSB0b2tlbnMgdG8gaXRzIGNhbGxlciwgYW5kIHRob3NlIHRva2VucyB3aWxsIGhhdmUgdGhlaXIKKyAgICAgdHJ1ZSBjb250ZW50OyB0aGlzIGlzIGludGVuZGVkIGZvciByZWNvbnN0cnVjdGlvbiBvZiB0aGUgc291cmNlCisgICAgIGxpbmUuIEJld2FyZSB0aGF0IHNvbWUgY29tbWVudHMgbWF5IGhhdmUgZW1iZWRkZWQgbmV3bGluZXMuCisgIENPUFlfTElORV9MRU5HVEgKKyAgICAgVWNwcCBjYW4gbWFpbnRhaW4gYSBjb3B5IG9mIHRoZSBjdXJyZW50IHNvdXJjZSBsaW5lLCB1cCB0byB0aGF0CisgICAgIGxlbmd0aC4gSXJyZWxldmFudCB0byBzdGFuZC1hbG9uZSB2ZXJzaW9uLgorICAqX01FTUcKKyAgICAgVGhvc2Ugc2V0dGluZ3MgbW9kaWZ5IHVjcHAgYmVoYXZpb3VyLCB3cnQgbWVtb3J5IGFsbG9jYXRpb25zLiBXaXRoCisgICAgIGhpZ2hlciB2YWx1ZXMsIHVjcHAgd2lsbCBwZXJmb3JtIGxlc3MgbWFsbG9jKCkgY2FsbHMgYW5kIHdpbGwgcnVuCisgICAgIGZhc3RlciwgYnV0IGl0IHdpbGwgdXNlIG1vcmUgbWVtb3J5LiBSZWR1Y2UgSU5QVVRfQlVGX01FTUcgYW5kCisgICAgIE9VVFBVVF9CVUZfTUVNRyBvbiBsb3ctbWVtb3J5IHN5c3RlbXMsIGlmIHlvdSBrZXB0IHVjcHAgYnVmZmVyaW5nCisgICAgIChzZWUgTk9fVUNQUF9CVUYgb3B0aW9uKS4KKworMy4gRWRpdCB0aGUgTWFrZWZpbGUuIFlvdSBzaG91bGQgZGVmaW5lIHRoZSB2YXJpYWJsZXMgQ0MgYW5kIEZMQUdTOworICAgdGhlcmUgYXJlIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKworICAtREFVRElUCisgICAgIEVuYWJsZSBpbnRlcm5hbCBzYW5pdHkgY2hlY2tzOyB0aGlzIHNsb3dzIGRvd24gYSBiaXQgdWNwcC4gRG8gbm90CisgICAgIGRlZmluZSB1bmxlc3MgeW91IHBsYW4gdG8gZGVidWcgdWNwcC4KKyAgLURNRU1fQ0hFQ0sKKyAgICAgV2l0aCB0aGlzIHNldHRpbmcsIHVjcHAgd2lsbCBjaGVjayBmb3IgdGhlIHJldHVybiB2YWx1ZSBvZiBtYWxsb2MoKQorICAgICBhbmQgZXhpdCB3aXRoIGEgZGlhZ25vc3RpYyB3aGVuIG91dCBvZiBtZW1vcnkuIE1FTV9DSEVDSyBpcyBpbXBsaWVkCisgICAgIGJ5IEFVRElULgorICAtRElOTElORT1mb29iYXIKKyAgICAgVGhlIHVjcHAgY29kZSB1c2VzICJpbmxpbmUiIHF1YWxpZmllciBmb3Igc29tZSBmdW5jdGlvbnM7IGJ5CisgICAgIGRlZmF1bHQsIHRoYXQgcXVhbGlmaWVyIGlzIG1hY3JvLXJlcGxhY2VkIHdpdGggbm90aGluZy4gRGVmaW5lCisgICAgIElOTElORSB0byB0aGUgY29ycmVjdCByZXBsYWNlbWVudCBmb3IgeW91ciBjb21waWxlciwgaWYgc3VwcG9ydGVkLgorICAgICBOb3RlIHRoYXQgYWxsICJpbmxpbmUiIGZ1bmN0aW9ucyBpbiB1Y3BwIGFyZSBhbHNvICJzdGF0aWMiLiBGb3IgYW55CisgICAgIEM5OS1jb21wbGlhbnQgY29tcGlsZXIsIHRoZSBHTlUgY29tcGlsZXIgKGdjYyksIGFuZCB0aGUgQ29tcGFxIEMKKyAgICAgY29tcGlsZXIgdW5kZXIgTGludXgvQWxwaGEsIG5vIC1ESU5MSU5FIGlzIG5lZWRlZCAoc2VlIHR1bmUuaCBmb3IKKyAgICAgZGV0YWlscykuCisKKzQuIENvbXBpbGUgYnkgdHlwaW5nICJtYWtlIi4gVGhpcyBzaG91bGQgcHJvZHVjZSB0aGUgdWNwcCBleGVjdXRhYmxlCisgICBmaWxlLgorCis1LiBJbnN0YWxsIHdoZXJldmVyIHlvdSB3YW50IHRoZSBiaW5hcnkgYW5kIHRoZSBtYW4gcGFnZSB1Y3BwLjEuCisKKzYuIElmIHlvdSBkbyBub3QgaGF2ZSB0aGUgbWFrZSB1dGlsaXR5LCBjb21waWxlIGVhY2ggZmlsZSBzZXBlcmF0ZWx5CisgICBhbmQgbGluayB0aGVtIHRvZ2V0aGVyLiBUaGUgZXhhY3QgZGV0YWlscyBkZXBlbmQgb24geW91ciBjb21waWxlci4KKyAgIFlvdSBtdXN0IGRlZmluZSB0aGUgbWFjcm8gU1RBTkRfQUxPTkUgd2hlbiBjb21waWxpbmcgY3BwLmMgKHRoZXJlCisgICBpcyBzdWNoIGEgZGVmaW5pdGlvbiwgY29tbWVudGVkIG91dCwgaW4gY3BwLmMsIGxpbmUgMzQpLgorCitUaGVyZSBpcyBubyAiY29uZmlndXJlIiBzY3JpcHQgc2luY2U6CistLSBJIGRvIG5vdCBsaWtlIHRoZSB2ZXJ5IGlkZWEgb2YgYSAiY29uZmlndXJlIiBzY3JpcHQuCistLSBVY3BwIGlzIHdyaXR0ZW4gaW4gQU5TSS1DIGFuZCBzaG91bGQgYmUgZmFpcmx5IHBvcnRhYmxlLgorLS0gVGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyAic3RhbmRhcmQiIHNldHRpbmdzIGZvciBhIEMgcHJlcHJvY2Vzc29yLgorICAgVGhlIHByZWRlZmluZWQgc3lzdGVtIG1hY3Jvcywgc3RhbmRhcmQgYXNzZXJ0aW9ucywuLi4gbXVzdCBiZSB0dW5lZAorICAgYnkgdGhlIHN5c2FkbWluLgorLS0gVGhlIHByaW1hcnkgZ29hbCBvZiB1Y3BwIGlzIHRvIGJlIGluY2x1ZGVkIGluIGNvbXBpbGVycy4gVGhlCisgICBzdGFuZC1hbG9uZSB2ZXJzaW9uIGlzIG1haW5seSBhIGRlYnVnZ2luZyB0b29sLgorCitQbGVhc2Ugbm90ZSB0aGF0IHlvdSBuZWVkIGFuIElTTy1DOTAgKGZvcm1lcmx5IEFOU0kpIEMgY29tcGlsZXIgc3VpdGUKKyhpbmNsdWRpbmcgdGhlIHN0YW5kYXJkIGxpYnJhcnkpIHRvIGNvbXBpbGUgdWNwcC4gSWYgeW91ciBjb21waWxlciBpcworbm90IEM5OSAob3IgbGF0ZXIpLCByZWFkIHRoZSBjcm9zcy1jb21waWxhdGlvbiBzZWN0aW9uIGluIHRoaXMgUkVBRE1FCitmaWxlLgorCitUaGUgQzkwIGFuZCBDOTkgc3RhbmRhcmRzIHN0YXRlIHRoYXQgZXh0ZXJuYWwgbGlua2FnZSBuYW1lcyBtaWdodAorYmUgY29uc2lkZXJlZCBlcXVhbCBvciBkaWZmZXJlbnQgYmFzZWQgdXBvbiBvbmx5IHRoZWlyIGZpcnN0IDYKK2NoYXJhY3RlcnM7IHRoaXMgcnVsZSBtaWdodCBtYWtlIHVjcHAgbm90IHRvIGNvbXBpbGUgb24gYSBjb25mb3JtYW50IEMKK2ltcGxlbWVudGF0aW9uLiBJIGhhdmUgeWV0IHRvIHNlZSBzdWNoIGFuIGltcGxlbWVudGF0aW9uLCBob3dldmVyLgorCitJZiB5b3Ugd2FudCB0byB1c2UgdWNwcCBhcyBhbiBpbnRlZ3JhdGVkIHByZXByb2Nlc3NvciBhbmQgbGV4ZXIsIHNlZSB0aGUKK3NlY3Rpb24gUkVVU0UuIENvbXBpbGluZyB1Y3BwIGFzIGEgbGlicmFyeSBpcyBhbiBleGVyY2lzZSBsZWZ0IHRvIHRoZQorcmVhZGVyLgorCitXaXRoIHRoZSBMT1dfTUVNIGNvZGUgZW5hYmxlZCwgdWNwcCBjYW4gcnVuIG9uIGEgTWluaXgtODYgb3IgTXNkb3MKKzE2LWJpdCBzbWFsbC1tZW1vcnktbW9kZWwgbWFjaGluZS4gSXQgd2lsbCBub3QgYmUgZnVsbHkgY29tcGxpYW50CitvbiBzdWNoIGFuIGFyY2hpdGVjdHVyZSB0byBDOTksIHNpbmNlIEM5OSBzdGF0ZXMgdGhhdCBhdCBsZWFzdCBvbmUKK3NvdXJjZSBjb2RlIHdpdGggNDA5NSBzaW11bHRhbmVvdXNseSBkZWZpbmVkIG1hY3JvcyBtdXN0IGJlIHByb2Nlc3NlZDsKK3VjcHAgd2lsbCBiZSBsaW1pdGVkIHRvIGFib3V0IDE1MDAgbWFjcm9zIChhdCBtb3N0KSBkdWUgdG8gbWVtb3J5CityZXN0cmljdGlvbnMuIEF0IGxlYXN0IHVjcHAgY2FuIHByZXByb2Nlc3MgaXRzIG93biBjb2RlIGluIHRoZXNlCitjb25kaXRpb25zLiBMT1dfTUVNIGlzIG9uIGJ5IGRlZmF1bHQgYmVjYXVzZSBpdCBzZWVtcyB0byBpbXByb3ZlCitwZXJmb3JtYW5jZSBvbiBsYXJnZSBzeXN0ZW1zLgorCisKKworTElDRU5TRQorLS0tLS0tLQorCitUaGUgY29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZSBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBNYWtlZmlsZSBhbmQKK2VhY2ggc291cmNlIGZpbGUuIEl0IGlzIGJhc2ljYWxseSBhIEJTRCBsaWNlbnNlLCB3aXRob3V0IHRoZSBhZHZlcnRpc2luZworc3ViY2xhdXNlICh3aGljaCBCU0QgZHJvcHBlZCByZWNlbnRseSBhbnl3YXkpIGFuZCB3aXRoIG5vIHJlZmVyZW5jZSB0bworQmVya2VsZXkgKHNpbmNlIHRoZSBjb2RlIGlzIGFsbCBtaW5lLCB3cml0dGVuIGZyb20gc2NyYXRjaCkuIEluZm9ybWFsbHksCit0aGlzIG1lYW5zIHRoYXQgeW91IGNhbiByZXVzZSBhbmQgcmVkaXN0cmlidXRlIHRoZSBjb2RlIGFzIHlvdSB3YW50LAorcHJvdmlkZWQgdGhhdCB5b3Ugc3RhdGVzIGluIHRoZSBkb2N1bWVudGF0aW9uIChvciBhbnkgc3Vic3RhbnRpYWwgcGFydAorb2YgdGhlIHNvZnR3YXJlKSBvZiByZWRpc3RyaWJ1dGVkIGNvZGUgdGhhdCBJIGFtIHRoZSBvcmlnaW5hbCBhdXRob3IuCisoSWYgeW91IHByZXNzIGEgY2Ryb20gd2l0aCAyMDAgc29mdHdhcmUgcGFja2FnZXMsIEkgZG8gbm90IGluc2lzdCBvbgoraGF2aW5nIG15IG5hbWUgb24gdGhlIGNvdmVyIG9mIHRoZSBjZHJvbSAtLSBqdXN0IGtlZXAgYSBSZWFkbWUgZmlsZQorc29tZXdoZXJlIG9uIHRoZSBjZHJvbSwgd2l0aCB0aGUgY29weXJpZ2h0IG5vdGljZSBpbmNsdWRlZCkKKworQXMgYSBjb3VydGVvdXMgZ2VzdHVyZSwgaWYgeW91IHJldXNlIG15IGNvZGUsIHBsZWFzZSBkcm9wIG1lIGEgbWFpbC4KK0l0IHJhaXNlcyBteSBzZWxmLWVzdGVlbS4KKworCisKK1JFVVNFCistLS0tLQorCitUaGUgY29kZSBoYXMgYmVlbiB0aG91Z2h0IGFzIHBhcnQgb2YgYSBiaWdnZXIgcHJvamVjdDsgaXQgbWlnaHQgYmUKK3VzZWQgYXMgYW4gaW50ZWdyYXRlZCBsZXhlciwgdGhhdCB3aWxsIHJlYWQgZmlsZXMsIHByb2Nlc3MgdGhlbSBhcyBhCitDIHByZXByb2Nlc3NvciwgYW5kIG91dHB1dCBhIHN0cmVhbSBvZiBDIHRva2Vucy4gVG8gaW5jbHVkZSB0aGlzIGNvZGUKK2ludG8gYSBwcm9qZWN0LCBjb21waWxlIHdpdGggU1RBTkRfQUxPTkUgdW5kZWZpbmVkLgorCitUbyB1c2UgdGhlIHByZXByb2Nlc3NvciBhbmQgbGV4ZXIsIHNldmVyYWwgc3RlcHMgc2hvdWxkIGJlIHBlcmZvcm1lZC4KK1NlZSB0aGUgZmlsZSAnc2FtcGxlLmMnIGZvciBhbiBleGFtcGxlLgorCisxLiBjYWxsIGluaXRfY3BwKCkuIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGxleGVyIGF1dG9tYXRvbi4KKworMi4gc2V0IHRoZSBmb2xsb3dpbmcgZ2xvYmFsIHZhcmlhYmxlczoKKwlub19zcGVjaWFsX21hY3JvcworCQlub24temVybyBpZiB0aGUgc3BlY2lhbCBtYWNyb3MgKF9fRklMRV9fIGFuZCBvdGhlcnMpCisJCXNob3VsZCBub3QgYmUgZGVmaW5lZC4gVGhpcyBpcyBhIGdsb2JhbCBmbGFnIHNpbmNlCisJCWl0IGFmZmVjdHMgdGhlIHJlZGVmaW5pdGlvbiBvZiBzdWNoIG1hY3JvcyAod2hpY2ggYXJlCisJCWFsbG93ZWQgaWYgdGhlIHNwZWNpYWwgbWFjcm9zIGFyZSBub3QgZGVmaW5lZCkKKwljOTlfY29tcGxpYW50CisJCWlmIG5vbi16ZXJvLCBkZWZpbmUgX19TVERDX1ZFUlNJT05fXyB0byAxOTk5MDFMOyB0aGlzCisJCWlzIHRoZSBkZWZhdWx0OyBvdGhlcndpc2UsIGRvIG5vdCBkZWZpbmUgX19TVERDX1ZFUlNJT05fXy4KKwkJTm90ZSB0aGF0IHVjcHAgd2lsbCBhY2NlcHQgdG8gdW5kZWZpbmUgX19TVERDX1ZFUlNJT05fXworCQl3aXRoIGEgI3VuZGVmIGRpcmVjdGl2ZS4KKwljOTlfaG9zdGVkCisJCWlmIHN0cmljdGx5IHBvc2l0aXZlLCBkZWZpbmUgX19TVERDX0hPU1RFRF9fIHRvIDEuCisJCUlmIHplcm8sIGRlZmluZSBfX1NURENfSE9TVEVEX18gdG8gMC4gSWYgbmVnYXRpdmUsCisJCWRvIG5vdCBkZWZpbmUgX19TVERDX0hPU1RFRF9fLiBUaGUgZGVmYXVsdCBpcyAxLgorCWVtaXRfZGVmaW5lcyBhbmQgZW1pdF9hc3NlcnRpb25zIHNob3VsZCBiZSBzZXQgdG8gMCBmb3IKKwl0aGUgc3RlcCAzLgorCiszLiBjYWxsIGluaXRfdGFibGVzKCkuIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIG1hY3JvIHRhYmxlCisgICBhbmQgb3RoZXIgdGhpbmdzOyBpdCB3aWxsIGludGlhbGl6ZSBhc3NlcnRpb25zIGlmIGl0IGhhcyBhIG5vbi16ZXJvCisgICBhcmd1bWVudC4KKworNC4gY2FsbCBpbml0X2luY2x1ZGVfcGF0aCgpLiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzZXQgdGhlIGluY2x1ZGUKKyAgIHBhdGggdG8gdGhlIGxpc3Qgb2YgcGF0aHMgZ2l2ZW4gYXMgYXJndW1lbnQuCisKKzUuIHNldCB0aGUgZm9sbG93aW5nIGdsb2JhbCB2YXJpYWJsZXMKKwllbWl0X2RlcGVuZGVuY2llcworCQlzZXQgdG8gMSBpZiBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIGVtaXR0ZWQgZHVyaW5nCisJCXByZXByb2Nlc3NpbmcKKwkJc2V0IHRvIDIgaWYgZGVwZW5kZW5jaWVzIHNob3VsZCBhbHNvIGJlIGVtaXR0ZWQgZm9yCisJCXN5c3RlbSBpbmNsdWRlIGZpbGVzCisJZW1pdF9kZWZpbmVzCisJCXNldCB0byBub24temVybyBpZiAjZGVmaW5lIG1hY3JvIGRlZmluaXRpb25zIHNob3VsZCBiZQorCQllbWl0dGVkIHdoZW4gbWFjcm9zIGFyZSBkZWZpbmVkCisJZW1pdF9hc3NlcnRpb25zCisJCXNldCB0byBub24temVybyBpZiAjZGVmaW5lIG1hY3JvIGRlZmluaXRpb25zIHNob3VsZCBiZQorCQllbWl0dGVkIHdoZW4gbWFjcm9zIGFyZSBkZWZpbmVkCisJZW1pdF9vdXRwdXQKKwkJdGhlIEZJTEUgKiB3aGVyZSB0aGUgYWJvdmUgaXRlbXMgYXJlIHNlbnQgaWYgb25lIG9mIHRoZQorCQl0aHJlZSBlbWl0XyB2YXJpYWJsZXMgaXMgc2V0IHRvIG5vbiB6ZXJvCisJdHJhbnNpZW50X2NoYXJhY3RlcnMKKwkJdGhpcyBpcyBmb3Igc29tZSBjcm9zcy1jb21waWxhdGlvbjsgc2VlIHRoZSByZWxldmFudAorCQlwYXJ0IGluIHRoaXMgUkVBRE1FIGZpbGUgZm9yIGRldGFpbHMKKworNi4gY2FsbCBzZXRfaW5pdF9maWxlbmFtZSgpIHdpdGggdGhlIGluaXRpYWwgZmlsZW5hbWUgYXMgYXJndW1lbnQ7CisgICB0aGUgc2Vjb25kIGFyZ3VtZW50IGluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWxlbmFtZSBpcyByZWFsIG9yCisgICBjb252ZW50aW9uYWwgKCJyZWFsIiBtZWFucyAiYW4gZm9wZW4oKSBvbiBpdCB3aWxsIHdvcmsiKS4KKworNy4gaW5pdGlhbGl6ZSB5b3VyIHN0cnVjdCBsZXhlcl9zdGF0ZToKKwljYWxsIGluaXRfbGV4ZXJfc3RhdGUoKQorCWNhbGwgaW5pdF9sZXhlcl9tb2RlKCkgaWYgdGhlIHByZXByb2Nlc3NvciBpcyBzdXBwb3NlZCB0bworCSAgIG91dHB1dCBhIGxpc3Qgb2YgdG9rZW5zLCBvdGhlcndpc2Ugc2V0IHRoZSBmbGFncyBmaWVsZAorCSAgIHRvIERFRkFVTFRfQ1BQX0ZMQUdTIGFuZCBzZXQgdGhlIG91dHB1dCBmaWVsZCB0byB0aGUKKwkgICBGSUxFICogd2hlcmUgb3V0cHV0IHNob3VsZCBiZSBzZW50CisJKGluaXRfbGV4ZXJfbW9kZSgpLCBpZiBjYWxsZWQgYXQgYWxsLCBtdXN0IGJlIGNhbGxlZCBhZnRlcgorCSBpbml0X2xleGVyX3N0YXRlKCkpCisJYWRqdXN0IHRoZSBmbGFncyBmaWVsZDsgaGVyZSBpcyB0aGUgbWVhbmluZyBvZiBmbGFnczoKKworV0FSTl9TVEFOREFSRAorCWVtaXQgdGhlIHN0YW5kYXJkIHdhcm5pbmdzCitXQVJOX0FOTk9ZSU5HCisJZW1pdCB0aGUgdXNlbGVzcyBhbmQgYW5ub3lpbmcgd2FybmluZ3MKK1dBUk5fVFJJR1JBUEhTCisJY291bnQgdHJpZ3JhcGhzIGVuY291bnRlcmVkOyBpdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGVtaXQKKwlhIHdhcm5pbmcgaWYgc29tZSB0cmlncmFwaHMgd2VyZSBpbmRlZWQgZW5jb3VudGVyZWQ7IHRoZSBjb3VudAorCWlzIHN0b3JlZCBpbiB0aGUgY291bnRfdHJpZ3JhcGhzIGZpZWxkIG9mIHRoZSBzdHJ1Y3QgbGV4ZXJfc3RhdGUKK1dBUk5fVFJJR1JBUEhTX01PUkUKKwllbWl0IGEgd2FybmluZyBmb3IgZXZlcnkgdHJpZ3JhcGggZW5jb3VudGVyZWQKK1dBUk5fUFJBR01BCisJZW1pdCBhIHdhcm5pbmcgZm9yIGVhY2ggbm9uLXZvaWQgX1ByYWdtYSBlbmNvdW50ZXJlZCBpbiBub24tbGV4ZXIKKwltb2RlIChiZWNhdXNlIHRoZXNlIGFyZSBub3QgZHVtcGVkIGluIHRoZSBvdXRwdXQpIGFuZCBmb3IgZWFjaAorCSNwcmFnbWEgdG9vLCBpZiB1Y3BwIHdhcyBjb21waWxlZCB3aXRob3V0IFBSQUdNQV9EVU1QCitGQUlMX1NIQVJQCisJZW1pdCBlcnJvcnMgb24gJyMnIHRva2VucyBiZWdpbm5pbmcgYSBsaW5lIGFuZCBub3QgZm9sbG93ZWQKKwlieSBhIHZhbGlkIGNwcCBkaXJlY3RpdmUKK0NDSEFSU0VUCisJZW1pdCBlcnJvcnMgd2hlbiBub24tQyBjaGFyYWN0ZXJzIGFyZSBlbmNvdW50ZXJlZDsgaWYgdGhpcyBmbGFnCisJaXMgbm90IHNldCwgZWFjaCBub24tQyBjaGFyYWN0ZXIgd2lsbCBiZSBjb25zaWRlcmVkIGFzIGEgQlVOQ0gKKwl0b2tlbiAoc2luY2UgQzk5IHN0YXRlcyB0aGF0IG5vbi1DIGNoYXJhY3RlcnMgYXJlIGFsbG93ZWQgYXMKKwlsb25nIGFzIHRoZXkgImRpc2FwcGVhciIgZHVyaW5nIHByZXByb2Nlc3NpbmcgW3Rocm91Z2ggbWFjcm8KKwlyZXBsYWNlbWVudCBhbmQgc3RyaW5naWZpY2F0aW9uIGZvciBpbnN0YW5jZV0sIHRoaXMgZmxhZyBtdXN0CisJbm90IGJlIHNldCwgZm9yIG1heGltdW0gQzk5IGNvbXBsaWFuY2UpCitESVNDQVJEX0NPTU1FTlRTCisJZG8gbm90IGtlZXAgY29tbWVudHMgaW4gb3V0cHV0IChpcnJlbGV2YW50IGluIGxleGVyIG1vZGUpCitDUExVU1BMVVNfQ09NTUVOVFMKKwl1bmRlcnN0YW5kIG5ldyBzdHlsZSBjb21tZW50cyAoLy8pIChtYW5kYXRvcnkgZm9yIEM5OSkKK0xJTkVfTlVNCisJZW1pdCAjbGluZSBkaXJlY3RpdmVzIHdoZW4gZW50ZXJpbmcgYSBmaWxlLCBpZiBub3QgaW4gbGV4ZXIgbW9kZTsKKwllbWl0IENPTlRFWFQgdG9rZW4gaW4gbGV4ZXIgbW9kZSBmb3IgI2xpbmUgYW5kIG5ldyBmaWxlcworR0NDX0xJTkVfTlVNCisJaWYgTElORV9OVU0gaXMgc2V0LCBlbWl0IGdjYy1saWtlIGRpcmVjdGl2ZXMgaW5zdGVhZCBvZiAjbGluZQorSEFORExFX0FTU0VSVElPTlMKKwl1bmRlcnN0YW5kIGFzc2VydGlvbnMgaW4gI2lmIGV4cHJlc3Npb25zIChhbmQgI2Fzc2VydCwgI3VuYXNzZXJ0KQorSEFORExFX1BSQUdNQQorCW1ha2UgUFJBR01BIHRva2VucyBmb3IgI3ByYWdtYTsgaXJyZWxldmFudCBpbiBub24tbGV4ZXIgbW9kZQorCShoYW5kbGluZyBvZiBzb21lIHByYWdtYXMgaXMgcmVxdWlyZWQgaW4gQzk5IGJ1dCBpcyBub3Qgb2YKKwl0aGUgY29tcGV0ZW5jZSBvZiB0aGUgcHJlcHJvY2Vzc29yOyB3aXRob3V0IHRoaXMgZmxhZywgdWNwcCB3aWxsCisJaWdub3JlIHRoZSBjb250ZW50cyBvZiAjcHJhZ21hIGFuZCBfUHJhZ21hIGRpcmVjdGl2ZXMpCitNQUNST19WQUFSRworCXVuZGVyc3RhbmQgbWFjcm9zIHdpdGggYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzIChtYW5kYXRvcnkKKwlmb3IgQzk5KQorVVRGOF9TT1VSQ0UKKwl1bmRlcnN0YW5kIFVURi04IGVuY29kaW5nOiBtdWx0aWJ5dGUgY2hhcmFjdGVycyBhcmUgY29uc2lkZXJlZAorCWVxdWl2YWxlbnQgdG8gbGV0dGVycyBhcyBmYXIgYXMgc3ludGF4IGlzIGNvbmNlcm5lZCAodGhleSBjYW4KKwliZSB1c2VkIGluIGlkZW50aWZpZXJzKQorTEVYRVIKKwlhY3QgYXMgYSBsZXhlciwgb3V0cHV0dGluZyB0b2tlbnMKK1RFWFRfT1VUUFVUCisJdGhpcyBmbGFnIHNob3VsZCBiZSBzZXQgdG8gMCBpZiB1Y3BwIHdvcmtzIGFzIGEgbGV4ZXIsIDEgb3RoZXJ3aXNlLgorCUl0IGlzIHNvbWVob3cgcmVkdW5kYW50IHdpdGggdGhlIExFWEVSIGZsYWcsIGJ1dCB0aGUgcHJlc2VuY2Ugb2YKKwl0aG9zZSB0d28gZGlmZmVyZW50IGZsYWdzIGlzIG5lZWRlZCBpbiB1Y3BwLgorS0VFUF9PVVRQVVQKKwlpbiBub24tbGV4ZXIgbW9kZSwgZW1pdCB0aGUgcmVzdWx0IG9mIHByZXByb2Nlc3NpbmcKK0NPUFlfTElORQorCW1haW50YWluIGEgY29weSBvZiB0aGUgbGFzdCByZWFkIGxpbmUgaW4gdGhlIGNvcHlfbGluZSBmaWVsZCBvZgorCXRoZSBzdHJ1Y3QgbGV4ZXJfc3RhdGUgOyBzZWUgYmVsb3cgZm9yIGhvdyB0byB1c2UgdGhpcyBidWZmZXIKK0hBTkRMRV9UUklHUkFQSFMKKwl1bmRlcnN0YW5kIHRyaWdyYXBocywgc3VjaCBhcyA/Py8gZm9yIFwuIFRoaXMgb3B0aW9uIHNob3VsZCBiZQorCXNldCBieSBkZWZhdWx0LCBleGNlcHQgZm9yIHNvbWUgbGVnYWN5IGNvZGUuCisKKwlUaGVyZSBhcmUgb3RoZXIgZmxhZ3MsIGJ1dCB0aGV5IGFyZSBmb3IgcHJpdmF0ZSB1c2FnZSBvZiB1Y3BwLgorCis4LiBhZGp1c3QgdGhlIGlucHV0IGZpZWxkIGluIHRoZSBsZXhlcl9zdGF0ZSB0byB0aGUgRklMRSAqIGZyb20gd2hlcmUKKyAgIHNvdXJjZSBmaWxlIGlzIHJlYWQuIElmIHlvdSB1c2UgdGhlIFVDUFBfTU1BUCBjb21waWxlLXRpbWUgb3B0aW9uLAorICAgYW5kIHlvdXIgaW5wdXQgZmlsZSBpcyBlbGlnaWJsZSB0byBtbWFwKCksIHRoZW4geW91IGNhbiBjYWxsCisgICBmb3Blbl9tbWFwX2ZpbGUoKSB0byBvcGVuIGl0LCB0aGVuIHNldF9pbnB1dF9maWxlKCkgdG8gc2V0IGxzLT5pbnB1dAorICAgYW5kIHNvbWUgb3RoZXIgaW50ZXJuYWwgb3B0aW9ucy4gRG8gbm90IGNhbGwgc2V0X2lucHV0X2ZpbGUoKSB1bmxlc3MKKyAgIHlvdSBqdXN0IGNhbGxlZCBmb3Blbl9tbWFwX2ZpbGUoKSBqdXN0IGJlZm9yZSBvbiB0aGUgc2FtZSBmaWxlLgorCis5LiBjYWxsIGFkZF9pbmNwYXRoKCkgdG8gYWRkIGFuIGluY2x1ZGUgcGF0aCwgZGVmaW5lX21hY3JvKCkgYW5kCisgICB1bmRlZl9tYWNybygpIHRvIGFkZCBvciByZW1vdmUgbWFjcm9zLCBtYWtlX2Fzc2VydGlvbigpIGFuZAorICAgZGVzdHJveV9hc3NlcnRpb24oKSB0byBhZGQgb3IgcmVtb3ZlIGFzc2VydGlvbnMuCisKKzEwLiBjYWxsIGVudGVyX2ZpbGUoKSAodGhpcyBpcyBuZWVkZWQgb25seSBpbiBub24tbGV4ZXIgbW9kZSwgb3IgaWYKKyAgICBMSU5FX05VTSBpcyBzZXQpLgorCisKK0FmdGVyd2FyZHM6CistLSBpZiB5b3UgYXJlIGluIGxleGVyIG1vZGUsIGNhbGwgbGV4KCk7IGVhY2ggY2FsbCB3aWxsIG1ha2UgdGhlIGN0b2sKKyAgIGZpZWxkIHBvaW50IHRvIHRoZSBuZXh0IHRva2VuLiBBIG5vbi16ZXJvIHJldHVybiB2YWx1ZSBpcyBhbiBlcnJvci4KKyAgIGxleCgpIHNraXBzIHdoaXRlc3BhY2UgdG9rZW5zLiBUaGUgbWVtb3J5IHVzZWQgYnkgdGhlIHN0cmluZyB2YWx1ZQorICAgb2Ygc29tZSB0b2tlbnMgKGlkZW50aWZpZXJzLCBudW1iZXJzLi4uKSBpcyBhdXRvbWF0aWNhbGx5IGZyZWVkLAorICAgc28gY29weSB0aGUgY29udGVudHMgb2YgZWFjaCBzdWNoIHRva2VuIGlmIHlvdSB3YW50IHRvIGtlZXAgaXQKKyAgICh0b2tlbnMgd2l0aCBhIHN0cmluZyBjb250ZW50IGFyZSBpZGVudGlmaWVkIGJ5IHRoZSBTVFJJTkdfVE9LRU4KKyAgIG1hY3JvIGFwcGxpZWQgdG8gdGhlaXIgdHlwZSkuCisgICBXaGVuIGxleCgpIHJldHVybmVkIGEgbm9uLXplcm8gdmFsdWU6IGlmIGl0IGlzIENQUEVSUl9FT0YsIHRoZW4KKyAgIGVuZC1vZi1pbnB1dCB3YXMgcmVhY2hlZC4gT3RoZXJ3aXNlLCBpdCBpcyBhIGdlbnVpbmUgZXJyb3IgYW5kCisgICBscy0+Y3RvayBpcyBhbiB1bmRlZmluZWQgdG9rZW47IHNraXAgaXQgYW5kIGNhbGwgbGV4KCkgYWdhaW4gdG8KKyAgIGlnbm9yZSB0aGUgZXJyb3IuCisKKy0tIG90aGVyd2lzZSwgY2FsbCBjcHAoKTsgZWFjaCBjYWxsIHdpbGwgYW5hbHl6ZSBvbmUgb3IgbW9yZSB0b2tlbnMKKyAgIChvbmUgdG9rZW4gaWYgaXQgZGlkIG5vdCBmb3VuZCBhIGNwcCBkaXJlY3RpdmUsIG9yIGEgbWFjcm8gbmFtZSkuCisgICBBIHBvc2l0aXZlIHJldHVybiB2YWx1ZSBpcyBhbiBlcnJvci4KKworRm9yIGJvdGggZnVuY3Rpb25zLCBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIENQUEVSUl9FT0YgKHdoaWNoIGlzIGEKK3N0cmljdGx5IHBvc2l0aXZlIHZhbHVlKSwgdGhlbiBpdCBtZWFucyB0aGF0IHRoZSBlbmQgb2YgZmlsZSB3YXMKK3JlYWNoZWQuIENhbGwgY2hlY2tfY3BwX2Vycm9ycygpIGFmdGVyIGVuZCBvZiBmaWxlIGZvciBwZW5kaW5nIGVycm9ycworKHVuZmluaXNoZWQgI2lmIGNvbnN0cnVjdGlvbnMgZm9yIGluc3RhbmNlKS4gSW4gbm9uLWxleGVyIG1vZGUsCitjYWxsIGZsdXNoX291dHB1dCgpLgorCitJbiB0aGUgc3RydWN0IGxleGVyX3N0YXRlLCB0aGUgZm9sbG93aW5nIGZpZWxkcyBtaWdodCBiZSByZWFkOgorCWxpbmUJCSAgIHRoZSBjdXJyZW50IGlucHV0IGxpbmUgbnVtYmVyCisJb2xpbmUJCSAgIHRoZSBjdXJyZW50IG91dHB1dCBsaW5lIG51bWJlciAoaW4gbm9uLWxleGVyIG1vZGUpCisJZmxhZ3MJCSAgIHRoZSBmbGFncyBkZXNjcmliZWQgYWJvdmUKKwljb3VudF90cmlncmFwaHMJICAgdGhlIG51bWJlciBvZiB0cmlncmFwaHMgZW5jb3VudGVyZWQKKwlpbm1hY3JvCQkgICB0aGUgY3VycmVudCB0b2tlbiBjb21lcyBmcm9tIGEgbWFjcm8KKwltYWNyb19jb3VudAkgICB0aGUgY3VycmVudCBtYWNybyBjb3VudGVyCisiZmxhZ3MiIGlzIGFuIHVuc2lnbmVkIGxvbmcgYW5kIG1pZ2h0IGJlIG1vZGlmaWVkOyB0aGUgdGhyZWUgb3RoZXJzCithcmUgb2YgbG9uZyB0eXBlLgorCisKK1RvIHBlcmZvcm0gYW5vdGhlciBwcmVwcm9jZXNzaW5nOiB1c2UgZnJlZV9sZXhlcl9zdGF0ZSgpIHRvIHJlbGVhc2UKK21lbW9yeSB1c2VkIGJ5IHRoZSBidWZmZXJzIHJlZmVyZW5jZWQgaW4gbGV4ZXJfc3RhdGUsIGFuZCBnbyBiYWNrIHRvCitzdGVwIDIuIFRoZSBkaWZmZXJlbnQgdGFibGVzIChtYWNyb3MsIGFzc2VydGlvbnMuLi4pIHNob3VsZCBiZSByZXNldCB0bwordGhlaXIgcmVzcGVjdGl2ZSBpbml0aWFsIGNvbnRlbnRzLiAoV2FybmluZzogdGhpcyBpcyBjdXJyZW50bHkgdW50ZXN0ZWQpCisKKworVGhlIENPUFlfTElORSBidWZmZXI6IHRoZSBzdHJ1Y3QgbGV4ZXJfc3RhdGUgY29udGFpbnMgdHdvIGludGVyZXN0aW5nCitmaWVsZHMsIGNvcHlfbGluZVtdIGFuZCBjbGkuIElmIHRoZSBDT1BZX0xJTkUgZmxhZyBpcyBvbiwgZWFjaCByZWFkCitsaW5lIGlzIHN0b3JlZCBpbiB0aGlzIGJ1ZmZlciwgdXAgdG8gKGF0IG1vc3QpIENPUFlfTElORV9MRU5HVEggLSAxCitjaGFyYWN0ZXJzIChDT1BZX0xJTkVfTEVOR1RIIGlzIGRlZmluZWQgaW4gdHVuZS5oKS4gVGhlIGxhc3QgY2hhcmFjdGVyCitvZiB0aGUgYnVmZmVyIGlzIGFsd2F5cyBhIHplcm8sIGFuZCBpZiB0aGUgbGluZSB3YXMgcmVhZCBlbnRpcmVseSwgaXQgaXMKK3plcm8gdGVybWluYXRlZDsgdGhlIHRyYWlsaW5nIG5ld2xpbmUgaXMgbm90IGluY2x1ZGVkLgorCitUaGUgcHVycG9zZSBvZiB0aGlzIGJ1ZmZlciBpcyBlcnJvci1yZXBvcnRpbmcuIFdoZW4gYW4gZXJyb3Igb2NjdXJzCisoY3BwKCkgcmV0dXJucyBhIHN0cmljdGx5IHBvc2l0aXZlIHZhbHVlLCBvciBsZXgoKSByZXR1cm5zIGEgbm9uLXplcm8KK3ZhbHVlKSwgaWYgeW91ciBzdHJ1Y3QgbGV4ZXJfc3RhdGUgaXMgY2FsbGVkIGxzLCB1c2UgdGhpcyBjb2RlOgorCisJaWYgKGxzLmNsaSAhPSAwKSBscy5jb3B5X2xpbmVbbHMuY2xpXSA9IDA7CisKK1RoaXMgd2lsbCBhZGQgYSB0cmFpbGluZyAwIGlmIHRoZSBsaW5lIHdhcyBub3QgcmVhZCBlbnRpcmVseS4KKworCisKK0NPTVBBVElCSUxJVFkgTk9URVMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIEMgbGFuZ3VhZ2UgaGFzIGEgbGVuZ3RoZW5pbmcgaGlzdG9yeS4gTm93YWRheXMsIEMgY29tZXMgaW4gdGhyZWUKK2ZsYXZvdXJzOgorCistLSBUcmFkaXRpb25hbCBDLCBha2EgIksmUiIuIFRoaXMgaXMgdGhlIGxhbmd1YWdlIGZpcnN0IGRlc2NyaWJlZCBieQorQnJpYW4gS2VybmlnaGFuIGFuZCBEZW5uaXMgUml0Y2hpZSwgYW5kIGltcGxlbWVudGVkIGluIHRoZSBmaXJzdCBDCitjb21waWxlciB0aGF0IHdhcyBldmVyIGNvZGVkLiBUaGVyZSBhcmUgYWN0dWFsbHkgc2V2ZXJhbCBkaWFsZWN0cyBvZgorSyZSLCBhbmQgYWxsIG9mIHRoZW0gYXJlIGNvbnNpZGVyZWQgYXMgZGVwcmVjYXRlZC4KKworLS0gSVNPIDk4OTk6MTk5MCwgYWthIEM5MCwgYWthIEM4OSwgYWthIEFOU0ktQy4gRm9ybWFsaXplZCBieSBBTlNJCitpbiAxOTg5IGFuZCBhZG9wdGVkIGJ5IElTTyB0aGUgbmV4dCB5ZWFyLCBpdCBpcyB0aGUgQyBmbGF2b3VyIG1hbnkgQworY29tcGlsZXJzIHVuZGVyc3RhbmQuIEl0IGlzIG1vc3RseSBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggSyZSIEMsIGJ1dAord2l0aCBlbmhhbmNlbWVudHMsIGNsYXJpZmljYXRpb25zIGFuZCBzZXZlcmFsIG5ldyBmZWF0dXJlcy4KKworLS0gSVNPIDk4OTk6MTk5OSwgYWthIEM5OS4gVGhpcyBpcyBhbiBldm9sdXRpb24gb24gQzkwLCBhbG1vc3QgZnVsbHkKK2JhY2t3YXJkIGNvbXBhdGlibGUgd2l0aCBDOTAgKGV4aGliaXR0aW5nIGEgY29kZSB0aGF0IG1ha2VzIGEgZGlmZmVyZW5jZQoraXMgYSB0cmlja3kgZXhlcmNpc2UpLiBDOTkgaW50cm9kdWNlcyBtYW55IG5ldyBhbmQgdXNlZnVsIGZlYXR1cmVzLAoraG93ZXZlciwgaW5jbHVkaW5nIGluIHRoZSBwcmVwcm9jZXNzb3IuCisKK1RoZXJlIHdhcyBhbHNvIGEgbm9ybWF0aXZlIGFkZGVuZHVtIGluIDE5OTUsIHRoYXQgYWRkZWQgYSBmZXcgZmVhdHVyZXMKK3RvIEM5MCAoZm9yIGluc3RhbmNlLCBkaWdyYXBocykgdGhhdCBhcmUgYWxzbyBwcmVzZW50IGluIEM5OS4KKworCitVY3BwIGltcGxlbWVudHMgdGhlIEM5OSBzdGFuZGFyZCwgYnV0IGNhbiBiZSB1c2VkIGluIGEgc3RyaWN0ZXIgbW9kZSwKK3RvIGVuZm9yY2UgQzkwIGNvbXBhdGliaWxpdHkgKGl0IHdpbGwsIGhvd2V2ZXIsIHN0aWxsIHJlY29nbml6ZSBzb21lCitjb25zdHJ1Y3Rpb25zIHRoYXQgYXJlIG5vdCBpbiBwbGFpbiBDOTApLgorCitVY3BwIGFsc28ga25vd3Mgc2V2ZXJhbCBleHRlbnNpb25zIHRvIEM5OToKKworLS0gQXNzZXJ0aW9uczogdGhpcyBpcyBhbiBleHRlbnNpb24gdG8gdGhlIGRlZmluZWQoKSBvcGVyYXRvciwgd2l0aAorICAgaXRzIG93biBuYW1lc3BhY2UuIEFzc2VydGlvbnMgc2VlbSB0byBiZSB1c2VkIGluIHNldmVyYWwgcGxhY2VzLAorICAgdGhlcmVmb3JlIHVjcHAga25vd3MgYWJvdXQgdGhlbS4gSXQgaXMgcmVjb21tZW5kZWQgdG8gZW5hYmxlCisgICBhc3NlcnRpb25zIGJ5IGRlZmF1bHQgb24gU29sYXJpcyBzeXN0ZW1zLgorLS0gVW5pY29kZTogdGhlIEM5OSBub3JtIHNwZWNpZmllcyB0aGF0IGV4dGVuZGVkIGNoYXJhY3RlcnMsIGZyb20KKyAgIHRoZSBJU08tMTA2NDYgY2hhcnNldCAoYWthICJ1bmljb2RlIikgY2FuIGJlIHVzZWQgaW4gaWRlbnRpZmllcnMKKyAgIHdpdGggdGhlIG5vdGF0aW9ucyBcdSBhbmQgXFUuIHVjcHAgYWxzbyBhY2NlcHRzICh3aXRoIHRoZSBwcm9wZXIKKyAgIGZsYWcpIHRoZSBVVEYtOCBlbmNvZGluZyBpbiB0aGUgc291cmNlIGZpbGUgZm9yIHN1Y2ggY2hhcmFjdGVycy4KKy0tICNpbmNsdWRlX25leHQgZGlyZWN0aXZlOiBpdCB3b3JrcyBhcyBhICNpbmNsdWRlLCBidXQgd2lsbCBsb29rCisgICBmb3IgZmlsZXMgb25seSBpbiB0aGUgZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGluIHRoZSBpbmNsdWRlIHBhdGgKKyAgIGFmdGVyIHRoZSBvbmUgdGhlIGN1cnJlbnQgZmlsZSB3YXMgZm91bmQuIFRoaXMgaXMgYSBHTlUtaXNtIHRoYXQKKyAgIGlzIHVzZWZ1bCBmb3Igd3JpdGluZyB0cmFuc3BhcmVudCB3cmFwcGVycyBhcm91bmQgaGVhZGVyIGZpbGVzLgorCitBc3NlcnRpb25zIGFuZCB1bmljb2RlIGFyZSBhY3RpdmF0ZWQgYnkgc3BlY2lmaWMgZmxhZ3M7IHRoZSAjaW5jbHVkZV9uZXh0CitzdXBwb3J0IGlzIGFsd2F5cyBhY3RpdmUuCisKK1RoZSB1Y3BwIGNvZGUgaXRzZWxmIHNob3VsZCBiZSBjb21wYXRpYmxlIHdpdGggYW55IElTTy1DOTAgY29tcGlsZXIuCitUaGUgY3BwLmMgZmlsZSBpcyByYXRoZXIgYmlnICh+IDUza0IpLCBpdCBtaWdodCBjb25mdXNlIG9sZCAxNi1iaXQgQworY29tcGlsZXJzOyB0aGUgbWFjcm8uYyBmaWxlIGlzIHNvbWV3aGF0IGxhcmdlIGFsc28gKH4gNDNrQikuCisKK1RoZSBldmFsdWF0aW9uIG9mICNpZiBleHByZXNzaW9ucyBpcyBzdWJqZWN0IHRvIHNvbWUgc3VidGxldGllcywgc2VlIHRoZQorc2VjdGlvbiAiY3Jvc3MtY29tcGlsYXRpb24iLgorCitUaGUgbGV4ZXIgY29kZSBtYWtlcyBubyBhc3N1bXB0aW9uIGFib3V0IHRoZSBzb3VyY2UgY2hhcmFjdGVyIHNldCwgYnV0Cit0aGUgZm9sbG93aW5nOiBzb3VyY2UgY2hhcmFjdGVycyAodGhvc2Ugd2hpY2ggaGF2ZSBhIHN5bnRhY3RpYyB2YWx1ZSBpbgorQzsgY29tbWVudCBhbmQgc3RyaW5nIGxpdGVyYWwgY29udGVudHMgYXJlIG5vdCBjb25jZXJuZWQpIG11c3QgaGF2ZSBhCitzdHJpY3RseSBwb3NpdGl2ZSB2YWx1ZSB0aGF0IGlzIHN0cmljdGx5IGxvd2VyIHRoYW4gTUFYX0NIQVJfVkFMLiBUaGUKK3N0cmljdCBwb3NpdGl2aXR5IGlzIGFscmVhZHkgYXNzdXJlZCBieSB0aGUgQyBzdGFuZGFyZCwgc28geW91IGp1c3QgbmVlZAordG8gYWRqdXN0IE1BWF9DSEFSX1ZBTC4KKworVWNwcCBoYXMgYmVlbiB0ZXN0ZWQgc3VjY2VzZnVsbHkgb24gQVNDSUkvSVNPLTg4NTktMSBhbmQgRUJDRElDIHN5c3RlbXMuCitCZXdhcmUgdGhhdCBVVEYtOCBpcyBOT1QgY29tcGF0aWJsZSB3aXRoIEVCQ0RJQy4KKworUHJhZ21hIGhhbmRsaW5nOiB3aGVuIHVzZWQgaW4gbm9uLWxleGVyIG1vZGUsIHVjcHAgdHJpZXMgdG8gb3V0cHV0CithIHNvdXJjZSB0ZXh0IHRoYXQsIHJlYWQgYWdhaW4sIHdpbGwgZ2l2ZSB0aGUgZXhhY3Qgc2FtZSBzdHJlYW0gb2YKK3Rva2Vucy4gVGhpcyBpcyBub3QgY29tcGxldGVseSB0cnVlIHdpdGggcmVnYXJkcyB0byBsaW5lIG51bWJlcmluZyBpbgorc29tZSB0cmlja3kgbWFjcm8gcmVwbGFjZW1lbnRzLCBidXQgaXQgc2hvdWxkIHdvcmsgY29ycmVjdGx5IG90aGVyd2lzZSwKK2VzcGVjaWFsbHkgd2l0aCBwcmFnbWEgZGlyZWN0aXZlcyBpZiB0aGUgY29tcGlsZS10aW1lIG9wdGlvbiBQUkFHTUFfRFVNUAord2FzIHNldDogI3ByYWdtYSBhcmUgZHVtcGVkLCBub24tdm9pZCBfUHJhZ21hKCkgYXJlIGNvbnZlcnRlZCB0byB0aGUKK2NvcnJlc3BvbmRpbmcgI3ByYWdtYSBhbmQgZHVtcGVkIGFsc28uCisKK1VjcHAgZG9lcyBub3QgbWFjcm8tcmVwbGFjZSB0aGUgY29udGVudHMgb2YgI3ByYWdtYSBhbmQgX1ByYWdtYSgpOworSWYgeW91IHdhbnQgYSBtYWNyby1yZXBsYWNlZCBwcmFnbWEsIHVzZSB0aGlzOgorCisjZGVmaW5lIHByYWdtYV8oeCkJX1ByYWdtYSgjeCkKKyNkZWZpbmUgcHJhZ21hKHgpCXByYWdtYV8oeCkKKworQW55d2F5LCBwcmFnbWFzIGRvIG5vdCBuZXN0IChhbiBfUHJhZ21hKCkgY2Fubm90IGJlIGV2YWx1YXRlZCBpZiBpdCBpcworaW5zaWRlIGEgI3ByYWdtYSBvciBhbm90aGVyIF9QcmFnbWEpLgorCisKK0kgd3JvdGUgdWNwcCBhY2NvcmRpbmcgdG8gd2hhdCBpcyBmb3VuZCBpbiAiVGhlIExhbmd1YWdlIEMiIGZyb20gQnJpYW4KK0tlcm5pZ2hhbiBhbmQgRGVubmlzIFJpdGNoaWUgKDJuZCBlZGl0aW9uKSBhbmQgdGhlIEM5OSBzdGFuZGFyZDsgYnV0IEkKK2NvdWxkIGhhdmUgbWlzaW50ZXJwcmV0ZWQgc29tZSBwb2ludHMuIE9uIHNvbWUgdHJpY2t5IHBvaW50cyBJIGdvdCBoZWxwCitmcm9tIHRoZSBoZWxwZnVsIHBlb3BsZSBmcm9tIHRoZSBjb21wLnN0ZC5jIG5ld3Nncm91cC4gRm9yIGFzc2VydGlvbnMKK2FuZCAjaW5jbHVkZV9uZXh0LCBJIG1pbWlja2VkIHRoZSBiZWhhdmlvdXIgb2YgR05VIGNwcCwgYXMgaXMgc3RhdGVkCitpbiB0aGUgR05VIGNwcCBpbmZvIGRvY3VtZW50YXRpb24uIEFuIG9wZW4gcXVlc3Rpb24gaXMgcmVsYXRlZCB0byB0aGUKK2ZvbGxvd2luZyBjb2RlOgorCisjZGVmaW5lIHVuZGVmaW5lZAkhCisjZGVmaW5lIG1ha2V1bih4KQl1biAjIyB4CisjaWYgbWFrZXVuKGRlZmluZWQgZm9vKQorcXV4CisjZWxzZQorYmFyCisjZW5kaWYKKworVWNwcCB3aWxsIHJlcGxhY2UgJ2RlZmluZWQgZm9vJyB3aXRoIDAgZmlyc3QgKHNpbmNlIGZvbyBpcyBub3QgZGVmaW5lZCksCit0aGVuIGl0IHdpbGwgcmVwbGFjZSB0aGUgbWFjcm8gbWFrZXVuLCBhbmQgdGhlIGV4cHJlc3Npb24gd2lsbCBiZWNvbWUKKyd1bjAnLCB3aGljaCBpcyByZXBsYWNlZCBieSAwIHNpbmNlIHRoaXMgaXMgYSByZW1haW5pbmcgaWRlbnRpZmllci4gVGhlCitleHByZXNzaW9uIGV2YWx1YXRlcyB0byBmYWxzZSwgYW5kICdiYXInIGlzIGVtaXR0ZWQuCitIb3dldmVyLCBzb21lIG90aGVyIHByZXByb2Nlc3NvcnMgd2lsbCByZXBsYWNlIG1ha2V1biBmaXJzdCwgY29uc2lkZXJpbmcKK3RoYXQgaXQgaXMgbm90IHBhcnQgb2YgYSAnZGVmaW5lZCcgb3BlcmF0b3IgYXBwbGljYXRpb247IHRoaXMgd2lsbAorcHJvZHVjZSB0aGUgbWFjcm8gJ3VuZGVmaW5lZCcsIHdoaWNoIGlzIHJlcGxhY2VkLCBhbmQgdGhlIGV4cHJlc3Npb24KK2JlY29tZXMgJyFmb28nLiAnZm9vJyBpcyByZXBsYWNlZCBieSAwLCB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8KK3RydWUsIGFuZCAncXV4JyBpcyBlbWl0dGVkLgorCitNeSBvcGluaW9uIGlzIHRoYXQgdGhlIGJlaGF2aW91ciBpcyB1bmRlZmluZWQsIGJlY2F1c2UgdXNlIG9mIHRoZQorJ2RlZmluZWQnIG9wZXJhdG9yIGRvZXMgbm90IG1hdGNoIGFuIGFsbG93ZWQgZm9ybSBwcmlvciB0byBtYWNybworcmVwbGFjZW1lbnQgKEkgbWVhbiwgaXRzIHN5bnRheCBtYXRjaGVzLCBidXQgaXRzIHVzZSBpcyByZWNvbnZlcnRlZAordG8gaW5leGlzdGFudCBhbmQgdGhlcmVmb3JlIGlzIG5vdCBhbnltb3JlIG1hdGNoaW5nKS4gT3RoZXIgcGVvcGxlCit0aGluayB0aGF0IHRoZSBiZWhhdmlvdXIgaXMgd2VsbC1zcGVjaWZpZWQsIGFuZCBjb250cmFyeSB0byB3aGF0IHVjcHAKK2RvZXMuIFRoZSBvbmx5IHRoaW5nIGNsZWFyIHRvIG1lIGlzIHRoYXQgdGhlIHdvcmRpbmcgb2YgdGhlIHN0YW5kYXJkCisocGFyYWdyYXBoIDYuMTAuMS4zKSBpcyB1bmNsZWFyLgorCitTaW5jZSB0aGUgdWNwcCBiZWhhdmlvdXIgbWFrZXMgdWNwcCBjb2RlIHNpbXBsZXIgYW5kIGNsZWFuZXIsIGFuZAordGhhdCBpdCBpcyB1bmxpa2VseSB0aGF0IGFueSByZWFsLWxpZmUgY29kZSB3b3VsZCBldmVyIGJlIGRpc3R1cmJlZAorYnkgdGhhdCBpbnRlcnByZXRhdGlvbiBvZiB0aGUgc3RhbmRhcmQsIHVjcHAgd2lsbCBrZWVwIGl0cyBjdXJyZW50CitiZWhhdmlvdXIgdW50aWwgY29udmluY2luZyBldmlkZW5jZSBvZiBteSBtaXNpbnRlcnByZXRhdGlvbiBvZiB0aGUKK3N0YW5kYXJkIGlzIGdpdmVuIHRvIG1lLiBUaGUgcHJvYmxlbSBjYW4gb25seSBvY2N1ciBpcyBvbmUgdXNlcyAjIyB0bworbWFrZSBhICdkZWZpbmVkJyBvcGVyYXRvciBkaXNhcHBlYXIgZnJvbSBhICNpZiBleHByZXNzaW9uIChldmVyeWJvZHkKK2FncmVlcyB0aGF0IHRoZSBnZW5lcmF0aW9uIG9mIGEgJ2RlZmluZWQnIG9wZXJhdG9yIHRyaWdnZXJzIHVuZGVmaW5lZAorYmVoYXZpb3VyKS4KKworCitBYm91dCBfUHJhZ21hOiB0aGUgc3RhbmRhcmQgaXMgbm90IGNsZWFyIGFib3V0IHdoZW4gdGhpcyBvcGVyYXRvciBpcworZXZhbHVhdGVkLCBhbmQgaWYgaXQgaXMgYWxsb3dlZCBpbnNpZGUgI2lmIGRpcmVjdGl2ZXMgYW5kIHN1Y2guIEZvcgordWNwcCwgSSBjb2RlZCBfUHJhZ21hIGFzIGEgc3BlY2lhbCBtYWNybyB3aXRoIGxhenkgcmVwbGFjZW1lbnQ6IGl0IHdpbGwKK2JlIGV2YWx1YXRlZCB3aGVyZXZlciBhIG1hY3JvIGNvdWxkIGJlIHJlcGxhY2VkLCBhbmQgb25seSBhdCB0aGUgZW5kIG9mCit0aGUgbWFjcm8gcmVwbGFjZW1lbnQgKGZvciBwcmFjdGljYWwgcHVycG9zZXMsIF9QcmFnbWEgY2FuIGJlIGNvbnNpZGVyZWQKK2FzIGEgbWFjcm8gdGFraW5nIG9uZSBhcmd1bWVudCwgYW5kIGJlaW5nIHJlcGxhY2VkIGJ5IG5vdGhpbmcsIGV4Y2VwdAorZm9yIHNvbWUgdHJpY2t5IHVzZXMgb2YgdGhlICMgYW5kICMjIG9wZXJhdG9ycykuIFRoaXMgbWVhbnMgdGhhdCwgYnkKK2RlZmF1bHQsIHVjcHAgd2lsbCBldmFsdWF0ZSBfUHJhZ21hIGluc2lkZSBzb21lIGRpcmVjdGl2ZXMgKG1haW5seSwgI2lmLAorI2luY2x1ZGUsICNpbmNsdWRlX25leHQgYW5kICNsaW5lKSwgYnV0IGl0IGNhbiBiZSB0YXVnaHQgbm90IHRvIGRvIHNvIGJ5CitkZWZpbmluZyBOT19QUkFHTUFfSU5fRElSRUNUSVZFIGluIHR1bmUuaC4KKworCisKK0NST1NTLUNPTVBJTEFUSU9OCistLS0tLS0tLS0tLS0tLS0tLQorCitJZiBjb21waWxlZCB3aXRoIGEgQzk5IGRldmVsb3BtZW50IHN1aXRlLCB1Y3BwIHNob3VsZCBiZSBmdWxseQorQzk5LWNvbXBsaWFudCBvbiB0aGUgaG9zdCBwbGF0Zm9ybSAodXAgdG8gbXkgb3duIHVuZGVyc3RhbmRpbmcgb2YgdGhlCitzdGFuZGFyZCAtLSByZW1lbWJlciB0aGF0IHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgYXMtaXMsIHdpdGhvdXQKK2FueSBndWFyYW50ZWUpLiBIb3dldmVyLCBpZiBhIHByZS1DOTkgY29tcGlsZXIgaXMgdXNlZCwgb3IgaWYgdGhlCit0YXJnZXQgbWFjaGluZSBpcyBub3QgdGhlIGhvc3QgbWFjaGluZSAoZm9yIGluc3RhbmNlIHdoZW4geW91IGJ1aWxkIGEKK2Nyb3NzLWNvbXBpbGVyKSwgdGhlIGV2YWx1YXRpb24gb2YgI2lmIGV4cHJlc3Npb25zIGlzIHN1YmplY3QgdG8gc29tZQorY3Jvc3MtY29tcGlsaW5nIGlzc3VlczoKKworCistLSBjaGFyYWN0ZXIgY29uc3RhbnRzOiB3aGVuIGV2YWx1YXRpbmcgZXhwcmVzc2lvbnMsIGNoYXJhY3RlciBjb25zdGFudHMKK2FyZSBpbnRlcnByZXRlZCBpbiB0aGUgc291cmNlIGNoYXJhY3RlciBzZXQgY29udGV4dDsgdGhpcyBpcyBhbGxvd2VkCitieSB0aGUgc3RhbmRhcmQgYnV0IHRoaXMgY2FuIGxlYWQgdG8gcHJvYmxlbXMgd2l0aCBjb2RlIHRoYXQgZXhwZWN0cwordGhpcyBpbnRlcnByZXRhdGlvbiB0byBtYXRjaCB0aGUgb25lIG1hZGUgaW4gdGhlIEMgY29kZS4gVG8gZWFzZQorY3Jvc3MtY29tcGlsYXRpb24sIHlvdSBjYW4gZGVmaW5lIGEgY29udmVyc2lvbiBhcnJheSwgYW5kIG1ha2UgdGhlCitnbG9iYWwgdmFyaWFibGUgdHJhbnNpZW50X2NoYXJhY3RlcnMgcG9pbnQgdG8gaXQuIFRoZSBhcnJheSBzaG91bGQKK2NvbnRhaW4gMjU2IGludDsgdHJhbnNpZW50X2NoYXJhY3RlcnNbeF0gaXMgdGhlIHZhbHVlIG9mIHRoZSBjaGFyYWN0ZXIKK3dob3NlIHZhbHVlIGlzIHggaW4gdGhlIHNvdXJjZSBjaGFyYWN0ZXIgc2V0LgorCitUaGlzIGZhY2lsaXR5IGlzIHByb3ZpZGVkIGZvciBpbmNsdXNpb24gb2YgdWNwcCBpbnNpZGUgYW5vdGhlciBjb2RlOworaWYgeW91IHdhbnQgYSBzdGFuZC1hbG9uZSB1Y3BwIHdpdGggdGhhdCBjb252ZXJzaW9uLCBoYXJkLWNvZGUgdGhlCitjb252ZXJzaW9uIHRhYmxlIGludG8gZXZhbC5jIGFuZCBtYWtlIHRyYW5zaWVudF9jaGFyYWN0ZXJzW10gc3RhdGljYWxseQorcG9pbnQgdG8gaXQuIEFsdGVybmF0aXZlbHksIHlvdSBjb3VsZCBwcm92aWRlIGFuIG9wdGlvbiBzeW50YXggdG8KK3Byb3ZpZGUgc3VjaCBhIHRhYmxlIG9uIGNvbW1hbmQtbGluZSwgaWYgeW91IGZlZWwgbGlrZSBpdC4KKworCistLSB3aWRlIGNoYXJhY3RlciBjb25zdGFudHMgc2lnbmVkbmVzczogYnkgZGVmYXVsdCwgdWNwcCBtYWtlcyB3aWRlCitjaGFyYWN0ZXJzIGFzIHNpZ25lZCBhcyB3aGF0IHBsYWluIGNoYXJzIGFyZSBvbiB0aGUgYnVpbGQgaG9zdC4gVG8KK2ZvcmNlIHdpZGUgY2hhcmFjdGVyIGNvbnN0YW50IHNpZ25lZG5lc3MsIGRlZmluZSBXQ0hBUl9TSUdORURORVNTIHRvIDAKKyhmb3IgdW5zaWduZWQpIG9yIDEgKGZvciBzaWduZWQpLiBCZXdhcmUsIGhvd2V2ZXIsIHRoYXQgIm5hdGl2ZSIgd2lkZQorY2hhcmFjdGVyIGNvbnN0YW50cywgZXZlbiBzaWduZWQsIGFyZSBjb25zaWRlcmVkIHBvc2l0aXZlLiBOb24td2lkZQorY2hhcmFjdGVyIGNvbnN0YW50cyBhcmUsIGFjY29yZGluZyB0byB0aGUgQzk5IHN0YW5kYXJkLCBvZiB0eXBlIGludCwgYW5kCit0aGVyZWZvcmUgYWx3YXlzIHNpZ25lZC4KKworCistLSBldmFsdWF0aW9uIHR5cGU6IEM5MCBzdGF0ZXMgdGhhdCBhbGwgY29uc3RhbnRzIGluICNpZiBleHByZXNzaW9ucworYXJlIGNvbnNpZGVyZWQgYXMgZWl0aGVyIGxvbmcgb3IgdW5zaWduZWQgbG9uZywgYW5kIHRoYXQgdGhlIGV2YWx1YXRpb24KK2lzIHBlcmZvcm1lZCB3aXRoIG9wZXJhbmRzIG9mIHRoYXQgc2l6ZS4gSW4gQzk5LCB0aGUgc2l0dWF0aW9uIGlzCitlcXVpdmFsZW50LCBleGNlcHQgdGhhdCB0aGUgdHlwZXMgdXNlZCBhcmUgaW50bWF4X3QgYW5kIHVpbnRtYXhfdCwgYXMKK2RlZmluZWQgaW4gPHN0ZGludC5oPi4KKworVWNwcCBjYW4gdXNlIHR3byBleHByZXNzaW9uIGV2YWx1YXRvcnM6IG9uZSB1c2VzIG5hdGl2ZSBpbnRlZ2VyIHR5cGVzCisob25lIHNpZ25lZCBhbmQgb25lIHVuc2lnbmVkKSwgdGhlIG90aGVyIGV2YWx1YXRvciBlbXVsYXRlcyBiaWcgaW50ZWdlcgorbnVtYmVycyBieSByZXByZXNlbnRpbmcgdGhlbSB3aXRoIHR3byAidW5zaWduZWQgbG9uZyIuIEJ5IGRlZmF1bHQsIGl0Cit3aWxsIHVzZSB0aGUgZmlyc3QgZXZhbHVhdG9yLCB1c2luZyAodSlpbnRtYXhfdCBhcyBuYXRpdmUgdHlwZXMgaWYgdGhlCitjb21waWxlciBpcyBDOTktY29tcGxpYW50LCBvciAodW5zaWduZWQpIGxvbmcgb3RoZXJ3aXNlLiBJZiB5b3Ugd2FudAorYW5vdGhlciBiZWhhdmlvdXIsIG1vZGlmeSB0aGUgcmVsZXZhbnQgc2VjdGlvbiBpbiB0dW5lLmguIEhlcmUgYXJlCitleGFtcGxlcyBvZiBkZWZpbml0aW9uczoKKworLyogZXZhbHVhdGUgbmF0aXZlbHkgd2l0aCB0eXBlICJsb25nIGxvbmciICovCisjZGVmaW5lIE5BVElWRV9VSU5UTUFYCXVuc2lnbmVkIGxvbmcgbG9uZworI2RlZmluZSBOQVRJVkVfSU5UTUFYCWxvbmcgbG9uZworCisvKiBldmFsdWF0ZSBuYXRpdmVseSB3aXRoIHR5cGUgImxvbmciIChldmVuIGlmIGJpZ2dlciBpcyBhdmFpbGFibGUpICovCisjZGVmaW5lIE1BVElWRV9VSU5UTUFYCXVuc2lnbmVkIGxvbmcKKyNkZWZpbmUgTUFUSVZFX0lOVE1BWAlsb25nCisKKy8qIGV2YWx1YXRlIHdpdGggYmlnbnVtIGV2YWx1YXRpb24gKi8KKyN1bmRlZiBOQVRJVkVfVUlOVE1BWAorI2RlZmluZSBTSU1VTF9VSU5UTUFYCisKK1RoZSBiaWdudW0gZXZhbHVhdGlvbiBoYW5kbGVzIHNpZ25lZCBpbnRlZ2VycyBpbiB0d28ncyBjb21wbGVtZW50CityZXByZXNlbnRhdGlvbiwgd2hldGhlciB0aGlzIGlzIHRoZSBuYXRpdmUgaW50ZWdlciByZXByZXNlbnRhdGlvbiBvcgorbm90LiBUaGUgY29kZSBtYWtlcyB0aGUgbm9uLXN0YW5kYXJkIGFzc3VtcHRpb24gdGhhdCB1bnNpZ25lZCBsb25nIGFyZQorcmVwcmVzZW50ZWQgdW5wYWRkZWQgaW4gbWVtb3J5LCB0aGF0IGlzLCB1bnNpZ25lZCBsb25nIGFyZSBtYWRlIHVwIG9mCitleGFjdGx5IHNpemVvZih1bnNpZ25lZCBsb25nKSAqIENIQVJfQklUIGJpdHMuIEkgaGF2ZSBuZXZlciBoZWFyZCBvZiBhbnkKK2FyY2hpdGVjdHVyZSB3aGVyZSB0aGlzIGFzc3VtcHRpb24gd291bGQgYmUgZmFsc2UuCisKKworCitGVVRVUkUgRVZPTFVUSU9OUworLS0tLS0tLS0tLS0tLS0tLS0KKworVWNwcCBpcyBxdWl0ZSBjb21wbGV0ZSBub3cuIFRoZXJlIHdhcyBhIGxvbmdzdGFuZGluZyBwcm9qZWN0IG9mCisidHJhZGl0aW9uYWwiIHByZXByb2Nlc3NpbmcsIGJ1dCBJIGRyb3BwZWQgaXQgYmVjYXVzZSBpdCB3b3VsZCBub3QKK21hcCBjbGVhbmx5IG9uIHRoZSB0b2tlbi1iYXNlZCB1Y3BwIHN0cnVjdHVyZS4gTWF5YmUgSSB3aWxsIGNvZGUgYQorc3RyaW5nLWJhc2VkIHByZXByb2Nlc3NvciBvbmUgZGF5OyBpdCB3b3VsZCBjZXJ0YWlubHkgdXNlIHNvbWUgb2YgdGhlCitjb2RlIGZyb20gbGV4ZXIuYywgZXZhbC5jLCBtZW0uYyBhbmQgaGFzaC5jLiBIb3dldmVyLCBtYWtpbmcgc3VjaCBhIHRvb2wKK2lzIGFsbW9zdCBpcnJlbGV2YW50IG5vd2FkYXlzLiBJZiBvbmUgd2FudHMgdG8gaGFuZGxlIHN1Y2ggcHJvamVjdCwKK3VzaW5nIHVjcHAgYXMgY29kZSBiYXNlLCBJIHdvdWxkIGhhcHBpbHkgcHJvdmlkZSBzb21lIGhlbHAsIGlmIG5lZWRlZC4KKworCisKK0NIQU5HRVMKKy0tLS0tLS0KKworRnJvbSAwLjkgdG8gMS4wOgorCisqIGJ1Z2ZpeDogY3Jhc2ggYWZ0ZXIgZXJyb25lb3VzICNhc3NlcnQKKyogY2hhbmdlZCBFUlJfU0hBUlAgdG8gRkFJTF9TSEFSUCwgRU1VTF9VSU5UTUFYIHRvIFNJTVVMX1VJTlRNQVgKKyogbWFkZSAiaW5saW5lIiBkZWZhdWx0IG9uIGdjYyBhbmQgREVDIGNjYyAoTGludXgvQWxwaGEpCisqIHNlbWFudGljIG9mIC1JIGlzIG5vdyBVbml4LWxpa2UgKGFkZGVkIGRpcmVjdG9yaWVzIGFyZSBsb29rZWQgZmlyc3QpCisqIGFkZGVkIC1KIGZsYWcgKHRvIGFkZCBpbmNsdWRlIGRpcmVjdG9yaWVzIGFmdGVyIHRoZSBzeXN0ZW0gb25lcykKKyogY2xlYW5lZCB1cCBub24tYXNjaWkgaXNzdWVzCisqIGJ1Z2ZpeDogbWlzc2luZyBicmFjZSBpbiBuby1MT1dfTUVNIGNvZGUKKyogYnVnZml4OiBhcmd1bWVudCBudW1iZXIgY2hlY2sgaW4gdmFyaWFkaWMgbWFjcm9zCisqIGJ1Z2ZpeDogY3Jhc2ggaW4gbm9uLWxleGVyIG1vZGUgYWZ0ZXIgc29tZSBjYXNlcyBvZiB1bnJlcGxhY2VkIG1hY3JvCisqIGJ1Z2ZpeDogX1ByYWdtYSgpIGhhbmRsaW5nIHdydCAjIGFuZCAjIworKiBtYWRlIGV2YWx1YXRpb24gb2YgX1ByYWdtYSgpIG9wdGlvbmFsIGluICNpZiwgI2luY2x1ZGUgYW5kICNsaW5lCisqIGJ1Z2ZpeDogcmUtZHVtcCBvZiBtdWx0aWxpbmUgI3ByYWdtYQorKiBhZGRlZCB0aGUgaW5tYWNybyBhbmQgbWFjcm9fY291bnQgZmxhZ3MKKyogYWRkZWQgbW1hcCgpIHN1cHBvcnQKKyogYWRkZWQgb3B0aW9uIHRvIHJldGFpbiB3aGl0ZXNwYWNlIGNvbnRlbnQgaW4gbGV4ZXIgbW9kZQorCitGcm9tIDAuOCB0byAwLjk6CisKKyogYWRkZWQgY2hlY2sgZm9yIGRpdmlzaW9uIGJ5IDAgaW4gI2lmIGV2YWx1YXRpb24KKyogYWRkZWQgY2hlY2sgZm9yIG5vbi1zdGFuZGFyZCBsaW5lIG51bWJlcnMKKyogYWRkZWQgY2hlY2sgZm9yIHRyYWlsaW5nIGdhcmJhZ2UgaW4gbW9zdCBkaXJlY3RpdmVzCisqIGNvcnJlY3RlZCBzaWduZWRuZXNzIG9mIGNoYXIgY29uc3RhbnRzIChhbHdheXMgaW50LCB0aGVyZWZvcmUgYWx3YXlzIHNpZ25lZCkKKyogbWFkZSBMT1dfTUVNIGNvZGUsIHNvIHRoYXQgdWNwcCBydW5zIHNtb290aGx5IG9uIGxvdyBtZW1vcnkgYXJjaGl0ZWN0dXJlcworKiBtdWx0aXBsZSBidWdmaXhlcyAodXNpbmcgdGhlIEdOVSBjcHAgdGVzdHN1aXRlKQorKiBhZGRlZCBoYW5kbGluZyBvZiBfUHJhZ21hIChhcyBhIG1hY3JvKQorKiBhZGRlZCB0b2tlbml6YXRpb24gb2YgcHJhZ21hIGRpcmVjdGl2ZXMKKyogYWRkZWQgY29uc2VydmF0aW9uIG9mIHByYWdtYSBkaXJlY3RpdmVzIGluIHRleHQgb3V0cHV0CisqIHByb2R1Y2VkIE1zZG9zIDE2LWJpdCBzbWFsbCBtZW1vcnkgbW9kZWwgZXhlY3V0YWJsZQorKiBwcm9kdWNlZCBNaW5peC04NiBleGVjdXRhYmxlCisKK0Zyb20gMC43IHRvIDAuODoKKworKiBhZGRlZCBzb21lIHN1cHBvcnQgZm9yIEFtaWdhIHN5c3RlbXMKKyogZml4ZWQgZXh0cmEgc3BhY2luZyBpbiBzdHJpbmdpZmllZCB0b2tlbnMKKyogZml4ZWQgYnVnIHJlbGF0ZWQgdG8gJTolIGFuZCB0b2xlcmF0ZWQgcm9ndWUgc2hhcnBzCisqIG5hbWVzcGFjZSBjbGVhbnVwCisqIGJ1Z2ZpeCBmb3IgbWFjcm8gcmVkZWZpbml0aW9uCisqIGFkZGVkIHdhcm5pbmcgZm9yIGV2YWx1YXRlZCBjb21tYSBvcGVyYXRvcnMgaW4gI2lmIChJU08gcmVxdWlyZW1lbnQpCisqIC1EZm9vIG5vdyBkZWZpbmVzIGZvbyB3aXRoIGNvbnRlbnQgMSAoYW5kIG5vdCB2b2lkIGNvbnRlbnQpCisqIHRyaWdyYXBocyBjYW4gYmUgZGlzYWJsZWQgKGZvciBpbmNvcnJlY3QgYnV0IGxlZ2FjeSBjb2RlKQorKiBmaXhlZCBzZW1hbnRpY3MgZm9yICNpbmNsdWRlICJmaWxlIiAobG9jYWwgZGlyZWN0b3J5KQorKiBmaXhlZCBkZXRlY3Rpb24gb2YgcHJvdGVjdGVkIGZpbGVzCisqIHByb2R1Y2VkIGEgTXNkb3MgMTYtYml0IGV4ZWN1dGFibGUKKworRnJvbSAwLjYgdG8gMC43OgorCisqIG9mZmljaWFsbHkgY2hhbmdlZCB0aGUgZ29hbCB0byBmdWxsIEM5OSBjb21wbGlhbmNlCisqIGFkZGVkIHRoZSBDT05URVhUIHRva2VuIGFuZCBsZXQgTkVXTElORSB0b2tlbnMgZ28KKyogYWRkZWQgcmVwb3J0X2NvbnRleHQoKSBmb3IgZXJyb3IgcmVwb3J0aW5nCisqIGVuZm9yY2VkIG1hdGNoaW5nIG9mICNpZi8jZW5kaWYgKGZpbGUtZ2xvYmFsIG5lc3RpbmcgbGV2ZWwgPSAwKQorKiBhZGRlZCBzdXBwb3J0IG9mIEM5OSBkaWdyYXBocworKiBhZGRlZCBVVEYtOCBlbmNvZGluZyBzdXBwb3J0CisqIGFkZGVkIHVuaXZlcnNhbCBjaGFyYWN0ZXIgbmFtZXMKKyogcmV3cm90ZSAjaWYgZXhwcmVzc2lvbnMgKHNpemVzIGZpeGVkLCBiaWdudW0sIHNpZ25lZC91bnNpZ25lZCBmaXhlZCkKKyogZml4ZWQgaW5jb21wbGV0ZSBldmFsdWF0aW9uIG9mICNpZiBleHByZXNzaW9ucworKiBhZGRlZCB0cmFuc2llbnRfY2hhcmFjdGVyc1tdCisKK0Zyb20gMC41IHRvIDAuNjoKKworKiBkaXNhcHBlYXJhbmNlIG9mIGVycm9yX25vbmwoKQorKiBhZGRlZCBleHRyYSBvcHRpb25hbCB3YXJuaW5ncyBmb3IgdHJpZ3JhcGhzCisqIHNvbWUgYnVnZml4ZXMsIGVzcGVjaWFsbHkgaW4gbGV4ZXIgbW9kZQorKiBoYW5kbGVkIE1hY0ludG9zaCBmaWxlcyBjb3JyZWN0bHkKKworRnJvbSAwLjQgdG8gMC41OgorCisqIG5pY2VyICNwcmFnbWEgaGFuZGxpbmcgKGEgdG9rZW4gY2FuIGJlIGVtaXR0ZWQpCisqIGJ1Z2ZpeCBpbiBsZXhlciBtb2RlIGFmdGVyICNsaW5lIGFuZCAjZXJyb3IKKyogc2FtcGxlLmMgICBhbiBleGFtcGxlIG9mIGNvZGUgbGlua2VkIHdpdGggdWNwcAorKiBtYWRlICNpZiBleHByZXNzaW9ucyBjb25mb3JtaW5nIHRvIHN0YW5kYXJkIHNpZ25lZC91bnNpZ25lZCBoYW5kbGluZworKiBhZGRlZCB0aGUgY29weV9saW5lW10gYnVmZmVyIGZlYXR1cmUKKworRnJvbSAwLjMgdG8gMC40OgorCisqIHJlbGF4ZWQgaW50ZXJwcmV0YXRpb24gb2YgJyNpbmNsdWRlIGZvbycgd2hlbiBmb28gZW5kcyB1cCwgYWZ0ZXIgbWFjcm8KKyAgc3Vic3RpdHV0aW9uLCB3aXRoIGEgJzxiYXI+JyBjb250ZW50CisqIGNvcnJlY3RlZCB0aGUgJ2RvdWJsZS1kb3QnIGJ1ZworKiBjb3JyZWN0ZWQgdHdvIGJ1Z3MgcmVsYXRlZCB0byB0aGUgdHJlYXRtZW50IG9mIG1hY3JvIGFib3J0ZWQgY2FsbHMgKGR1ZQorICB0byBsYWNrIG9mIGFyZ3VtZW50cykKKyogc29tZSBuYW1lc3BhY2VzIGNsZWFudXAsIHRvIGVhc2UgaW50ZWdyYXRpb24gaW50byBvdGhlciBjb2RlCisqIGRvY3VtZW50ZWQgdGhlIHdheSB0byBpbmNsdWRlIHVjcHAgaW50byBhbm90aGVyIHByb2dyYW0KKyogbWFkZSBuZXdsaW5lcyBlbWJlZGRlZCBpbnRvIHN0cmluZ3MgaWxsZWdhbCAoYW5kIHJlcG9ydGVkIGFzIHN1Y2gpCisKK0Zyb20gMC4yIHRvIDAuMzoKKworKiBhZGRlZCBzdXBwb3J0IGZvciBzeXN0ZW0gcHJlZGVmaW5lZCBtYWNyb3MKKyogbWFkZSBzZXZlcmFsIGJ1Z2ZpeGVzCisqIGNoZWNrZWQgQzk5IGNvbXBsaWFuY2UgZm9yIG1vc3Qgb2YgdGhlIGZlYXR1cmVzCisqIHVjcHAgbm93IGFjY2VwdHMgbm9uLUMgY2hhcmFjdGVycyBvbiBzdGFuZGFyZCB3aGVuIHVzZWQgc3RhbmQtYWxvbmUKKyogcmVtb3ZlZCBtYW55IHVzZWxlc3Mgc3BhY2VzIGluIHRoZSBvdXRwdXQKKworRnJvbSAwLjEgdG8gMC4yOgorCisqIGFkZGVkIHN1cHBvcnQgZm9yIGFzc2VydGlvbnMKKyogYWRkZWQgc3VwcG9ydCBmb3IgbWFjcm9zIHdpdGggdmFyaWFibGUgYXJndW1lbnRzCisqIHNwbGl0IHRoZSBwaGFyYW9uaWMgY3BwLmMgZmlsZSBpbnRvIG1hbnkKKyogbWFkZSBzZXZlcmFsIGJ1Z2ZpeGVzCisqIHJlbGF4ZWQgdGhlIGJlaGF2aW91ciB3aXRoIHJlZ2FyZHMgdG8gdGhlIHZvaWQgYXJndW1lbnRzCisqIG1hZGUgQysrLWxpa2UgY29tbWVudHMgYW4gb3B0aW9uCisKKworCitUSEFOS1MgVE8KKy0tLS0tLS0tLQorCitWb2xrZXIgQmFydGhlbG1hbm4sIE5laWwgQm9vdGgsIFN06XBoYW5lIEVjb2xpdmV0LCBBbnRvaW5lIExlY2EsIEN5cmlsbGUKK0xlZmV2cmUsIERhdmUgUml2ZXJzLCBMb2ljIFRvcnRheSBhbmQgTGF1cmVudCBXYWNyZW5pZXIsIGZvciBzdWdnZXN0aW9ucworYW5kIGJldGEtdGVzdGluZy4KKworUGF1bCBFZ2dlcnQsIERvdWdsYXMgQS4gR3d5biwgQ2xpdmUgRC5XLiBGZWF0aGVyLCBhbmQgdGhlIG90aGVyIGd1eXMgZnJvbQorY29tcC5zdGQuYywgZm9yIGV4cGxhbmF0aW9ucyBhYm91dCB0aGUgc3RhbmRhcmQuCisKK0RhdmUgQnJvbGxleSwgSmFtaWUgTG9raWVyIGFuZCBOZWlsIEJvb3RoLCBmb3IgZGlzY3Vzc2lvbiBhYm91dCB0cmlja3kKK3BvaW50cyBvbiBuZXN0aW5nIG1hY3Jvcy4KKworQnJpYW4gS2VybmlnaGFuIGFuZCBEZW5uaXMgUml0Y2hpZSwgZm9yIGJyaW5naW5nIEMgdG8gbW9ydGFsIE1lbi4KZGlmZiAtLWdpdCBhL3VjcHAvYXNzZXJ0LmMgYi91Y3BwL2Fzc2VydC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUxZjU3MTAKLS0tIC9kZXYvbnVsbAorKysgYi91Y3BwL2Fzc2VydC5jCkBAIC0wLDAgKzEsMzk3IEBACisvKgorICogKGMpIFRob21hcyBQb3JuaW4gMTk5OSwgMjAwMAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAorICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgInVjcHBpLmgiCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSAiaGFzaC5oIgorI2luY2x1ZGUgInR1bmUuaCIKKworLyoKKyAqIEFzc2VydGlvbiBzdXBwb3J0LiBFYWNoIGFzc2VydGlvbiBpcyBpbmRleGVkIGJ5IGl0cyBwcmVkaWNhdGUsIGFuZAorICogdGhlIGxpc3Qgb2YgJ3F1ZXN0aW9ucycgd2hpY2ggeWllbGQgYSB0cnVlIGFuc3dlci4KKyAqLworCitzdGF0aWMgc3RydWN0IEhUICphc3NlcnRpb25zOworCitzdGF0aWMgc3RydWN0IGFzc2VydCAqbmV3X2Fzc2VydGlvbih2b2lkKQoreworCXN0cnVjdCBhc3NlcnQgKmEgPSBnZXRtZW0oc2l6ZW9mKHN0cnVjdCBhc3NlcnQpKTsKKworCWEtPm5idmFsID0gMDsKKwlyZXR1cm4gYTsKK30KKworc3RhdGljIHZvaWQgZGVsX2Fzc2VydGlvbih2b2lkICp2YSkKK3sKKwlzdHJ1Y3QgYXNzZXJ0ICphID0gdmE7CisJc2l6ZV90IGksIGo7CisKKwlpZiAoYS0+bmFtZSkgZnJlZW1lbShhLT5uYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgYS0+bmJ2YWw7IGkgKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IGEtPnZhbFtpXS5udDsgaiArKykKKwkJCWlmIChTX1RPS0VOKGEtPnZhbFtpXS50W2pdLnR5cGUpKQorCQkJCWZyZWVtZW0oYS0+dmFsW2ldLnRbal0ubmFtZSk7CisJCWlmIChhLT52YWxbaV0ubnQpIGZyZWVtZW0oYS0+dmFsW2ldLnQpOworCX0KKwlpZiAoYS0+bmJ2YWwpIGZyZWVtZW0oYS0+dmFsKTsKK30KKworLyoKKyAqIHByaW50IHRoZSBjb250ZW50cyBvZiBhIHRva2VuIGxpc3QKKyAqLworc3RhdGljIHZvaWQgcHJpbnRfdG9rZW5fZmlmbyhzdHJ1Y3QgdG9rZW5fZmlmbyAqdGYpCit7CisJc2l6ZV90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGYtPm50OyBpICsrKQorCQlpZiAodHRNV1ModGYtPnRbaV0udHlwZSkpIGZwdXRjKCcgJywgZW1pdF9vdXRwdXQpOworCQllbHNlIGZwdXRzKHRva2VuX25hbWUodGYtPnQgKyBpKSwgZW1pdF9vdXRwdXQpOworfQorCisvKgorICogcHJpbnQgYWxsIGFzc2VydGlvbnMgcmVsYXRlZCB0byBhIGdpdmVuIG5hbWUKKyAqLworc3RhdGljIHZvaWQgcHJpbnRfYXNzZXJ0KHZvaWQgKnZhKQoreworCXN0cnVjdCBhc3NlcnQgKmEgPSB2YTsKKwlzaXplX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhLT5uYnZhbDsgaSArKykgeworCQlmcHJpbnRmKGVtaXRfb3V0cHV0LCAiI2Fzc2VydCAlcygiLCBhLT5uYW1lKTsKKwkJcHJpbnRfdG9rZW5fZmlmbyhhLT52YWwgKyBpKTsKKwkJZnByaW50ZihlbWl0X291dHB1dCwgIilcbiIpOworCX0KK30KKworLyoKKyAqIGNvbXBhcmUgdHdvIHRva2VuX2ZpZm8sIHJldHVybiAwIGlmIHRoZXkgYXJlIGlkZW50aWNhbCwgMSBvdGhlcndpc2UuCisgKiBBbGwgd2hpdGVzcGFjZSB0b2tlbnMgYXJlIGNvbnNpZGVyZWQgaWRlbnRpY2FsLCBidXQgc2VxdWVuY2VzIG9mCisgKiB3aGl0ZXNwYWNlIGFyZSBub3Qgc2hyaW5rZWQuCisgKi8KK2ludCBjbXBfdG9rZW5fbGlzdChzdHJ1Y3QgdG9rZW5fZmlmbyAqZjEsIHN0cnVjdCB0b2tlbl9maWZvICpmMikKK3sKKwlzaXplX3QgaTsKKworCWlmIChmMS0+bnQgIT0gZjItPm50KSByZXR1cm4gMTsKKwlmb3IgKGkgPSAwOyBpIDwgZjEtPm50OyBpICsrKSB7CisJCWlmICh0dE1XUyhmMS0+dFtpXS50eXBlKSAmJiB0dE1XUyhmMi0+dFtpXS50eXBlKSkgY29udGludWU7CisJCWlmIChmMS0+dFtpXS50eXBlICE9IGYyLT50W2ldLnR5cGUpIHJldHVybiAxOworCQlpZiAoZjEtPnRbaV0udHlwZSA9PSBNQUNST0FSRworCQkJJiYgZjEtPnRbaV0ubGluZSAhPSBmMi0+dFtpXS5saW5lKSByZXR1cm4gMTsKKwkJaWYgKFNfVE9LRU4oZjEtPnRbaV0udHlwZSkKKwkJCSYmIHN0cmNtcChmMS0+dFtpXS5uYW1lLCBmMi0+dFtpXS5uYW1lKSkgcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogZm9yICNhc3NlcnQKKyAqIEFzc2VydGlvbnMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBJU08tQzg5IHN0YW5kYXJkLCBidXQgdGhleSBhcmUgc29tZXRpbWVzCisgKiBlbmNvdW50ZXJlZCwgZm9yIGluc3RhbmNlIGluIFNvbGFyaXMgc3RhbmRhcmQgaW5jbHVkZSBmaWxlcy4KKyAqLworaW50IGhhbmRsZV9hc3NlcnQoc3RydWN0IGxleGVyX3N0YXRlICpscykKK3sKKwlpbnQgaW5hID0gMCwgbHR3dzsKKwlzdHJ1Y3QgdG9rZW4gdDsKKwlzdHJ1Y3QgdG9rZW5fZmlmbyAqYXRsID0gMDsKKwlzdHJ1Y3QgYXNzZXJ0ICphOworCWludCByZXQgPSAtMTsKKwlsb25nIGwgPSBscy0+bGluZTsKKwlpbnQgbm5wOworCXNpemVfdCBpOworCisJd2hpbGUgKCFuZXh0X3Rva2VuKGxzKSkgeworCQlpZiAobHMtPmN0b2stPnR5cGUgPT0gTkVXTElORSkgYnJlYWs7CisJCWlmICh0dE1XUyhscy0+Y3Rvay0+dHlwZSkpIGNvbnRpbnVlOworCQlpZiAobHMtPmN0b2stPnR5cGUgPT0gTkFNRSkgeworCQkJaWYgKCEoYSA9IGdldEhUKGFzc2VydGlvbnMsICYobHMtPmN0b2stPm5hbWUpKSkpIHsKKwkJCQlhID0gbmV3X2Fzc2VydGlvbigpOworCQkJCWEtPm5hbWUgPSBzZHVwKGxzLT5jdG9rLT5uYW1lKTsKKwkJCQlpbmEgPSAxOworCQkJfQorCQkJZ290byBoYW5kbGVfYXNzZXJ0X25leHQ7CisJCX0KKwkJZXJyb3IobCwgImlsbGVnYWwgYXNzZXJ0aW9uIG5hbWUgZm9yICNhc3NlcnQiKTsKKwkJZ290byBoYW5kbGVfYXNzZXJ0X3dhcnBfaWduOworCX0KKwlnb3RvIGhhbmRsZV9hc3NlcnRfdHJ1bmM7CisKK2hhbmRsZV9hc3NlcnRfbmV4dDoKKwl3aGlsZSAoIW5leHRfdG9rZW4obHMpKSB7CisJCWlmIChscy0+Y3Rvay0+dHlwZSA9PSBORVdMSU5FKSBicmVhazsKKwkJaWYgKHR0TVdTKGxzLT5jdG9rLT50eXBlKSkgY29udGludWU7CisJCWlmIChscy0+Y3Rvay0+dHlwZSAhPSBMUEFSKSB7CisJCQllcnJvcihsLCAic3ludGF4IGVycm9yIGluICNhc3NlcnQiKTsKKwkJCWdvdG8gaGFuZGxlX2Fzc2VydF93YXJwX2lnbjsKKwkJfQorCQlnb3RvIGhhbmRsZV9hc3NlcnRfbmV4dDI7CisJfQorCWdvdG8gaGFuZGxlX2Fzc2VydF90cnVuYzsKKworaGFuZGxlX2Fzc2VydF9uZXh0MjoKKwlhdGwgPSBnZXRtZW0oc2l6ZW9mKHN0cnVjdCB0b2tlbl9maWZvKSk7CisJYXRsLT5hcnQgPSBhdGwtPm50ID0gMDsKKwlmb3IgKG5ucCA9IDEsIGx0d3cgPSAxOyBubnAgJiYgIW5leHRfdG9rZW4obHMpOykgeworCQlpZiAobHMtPmN0b2stPnR5cGUgPT0gTkVXTElORSkgYnJlYWs7CisJCWlmIChsdHd3ICYmIHR0TVdTKGxzLT5jdG9rLT50eXBlKSkgY29udGludWU7CisJCWx0d3cgPSB0dE1XUyhscy0+Y3Rvay0+dHlwZSk7CisJCWlmIChscy0+Y3Rvay0+dHlwZSA9PSBMUEFSKSBubnAgKys7CisJCWVsc2UgaWYgKGxzLT5jdG9rLT50eXBlID09IFJQQVIpIHsKKwkJCWlmICghKC0tIG5ucCkpIGdvdG8gaGFuZGxlX2Fzc2VydF9uZXh0MzsKKwkJfQorCQl0LnR5cGUgPSBscy0+Y3Rvay0+dHlwZTsKKwkJaWYgKFNfVE9LRU4odC50eXBlKSkgdC5uYW1lID0gc2R1cChscy0+Y3Rvay0+bmFtZSk7CisJCWFvbChhdGwtPnQsIGF0bC0+bnQsIHQsIFRPS0VOX0xJU1RfTUVNRyk7CisJfQorCWdvdG8gaGFuZGxlX2Fzc2VydF90cnVuYzsKKworaGFuZGxlX2Fzc2VydF9uZXh0MzoKKwl3aGlsZSAoIW5leHRfdG9rZW4obHMpICYmIGxzLT5jdG9rLT50eXBlICE9IE5FV0xJTkUpIHsKKwkJaWYgKCF0dFdISShscy0+Y3Rvay0+dHlwZSkgJiYgKGxzLT5mbGFncyAmIFdBUk5fU1RBTkRBUkQpKSB7CisJCQl3YXJuaW5nKGwsICJ0cmFpbGluZyBnYXJiYWdlIGluICNhc3NlcnQiKTsKKwkJfQorCX0KKwlpZiAoYXRsLT5udCAmJiB0dE1XUyhhdGwtPnRbYXRsLT5udCAtIDFdLnR5cGUpICYmICgtLSBhdGwtPm50KSA9PSAwKQorCQlmcmVlbWVtKGF0bC0+dCk7CisJaWYgKGF0bC0+bnQgPT0gMCkgeworCQllcnJvcihsLCAidm9pZCBhc3NlcnRpb24gaW4gI2Fzc2VydCIpOworCQlmcmVlbWVtKGF0bCk7CisJCXJldHVybiByZXQ7CisJfQorCWZvciAoaSA9IDA7IGkgPCBhLT5uYnZhbCAmJiBjbXBfdG9rZW5fbGlzdChhdGwsIGEtPnZhbCArIGkpOyBpICsrKTsKKwlpZiAoaSAhPSBhLT5uYnZhbCkgeworCQkvKiB3ZSBhbHJlYWR5IGhhdmUgaXQgKi8KKwkJcmV0ID0gMDsKKwkJZ290byBoYW5kbGVfYXNzZXJ0X2Vycm9yOworCX0KKworCS8qIFRoaXMgaXMgYSBuZXcgYXNzZXJ0aW9uLiBMZXQncyBrZWVwIGl0LiAqLworCWFvbChhLT52YWwsIGEtPm5idmFsLCAqYXRsLCBUT0tFTl9MSVNUX01FTUcpOworCWlmIChpbmEpIHB1dEhUKGFzc2VydGlvbnMsIGEpOworCWlmIChlbWl0X2Fzc2VydGlvbnMpIHsKKwkJZnByaW50ZihlbWl0X291dHB1dCwgIiNhc3NlcnQgJXMoIiwgYS0+bmFtZSk7CisJCXByaW50X3Rva2VuX2ZpZm8oYXRsKTsKKwkJZnB1dHMoIilcbiIsIGVtaXRfb3V0cHV0KTsKKwl9CisJcmV0dXJuIDA7CisKK2hhbmRsZV9hc3NlcnRfdHJ1bmM6CisJZXJyb3IobCwgInVuZmluaXNoZWQgI2Fzc2VydCIpOworaGFuZGxlX2Fzc2VydF9lcnJvcjoKKwlpZiAoYXRsICYmIGF0bC0+bnQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGF0bC0+bnQ7IGkgKyspCisJCQlpZiAoU19UT0tFTihhdGwtPnRbaV0udHlwZSkpIGZyZWVtZW0oYXRsLT50W2ldLm5hbWUpOworCQlmcmVlbWVtKGF0bC0+dCk7CisJfQorCXJldHVybiByZXQ7CitoYW5kbGVfYXNzZXJ0X3dhcnBfaWduOgorCXdoaWxlICghbmV4dF90b2tlbihscykgJiYgbHMtPmN0b2stPnR5cGUgIT0gTkVXTElORSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGZvciAjdW5hc3NlcnQKKyAqLworaW50IGhhbmRsZV91bmFzc2VydChzdHJ1Y3QgbGV4ZXJfc3RhdGUgKmxzKQoreworCWludCBsdHd3OworCXN0cnVjdCB0b2tlbiB0OworCXN0cnVjdCB0b2tlbl9maWZvICphdGwgPSAwOworCXN0cnVjdCBhc3NlcnQgKmE7CisJaW50IHJldCA9IC0xOworCWxvbmcgbCA9IGxzLT5saW5lOworCWludCBubnA7CisJc2l6ZV90IGk7CisKKwl3aGlsZSAoIW5leHRfdG9rZW4obHMpKSB7CisJCWlmIChscy0+Y3Rvay0+dHlwZSA9PSBORVdMSU5FKSBicmVhazsKKwkJaWYgKHR0TVdTKGxzLT5jdG9rLT50eXBlKSkgY29udGludWU7CisJCWlmIChscy0+Y3Rvay0+dHlwZSA9PSBOQU1FKSB7CisJCQlpZiAoIShhID0gZ2V0SFQoYXNzZXJ0aW9ucywgJihscy0+Y3Rvay0+bmFtZSkpKSkgeworCQkJCXJldCA9IDA7CisJCQkJZ290byBoYW5kbGVfdW5hc3NlcnRfd2FycDsKKwkJCX0KKwkJCWdvdG8gaGFuZGxlX3VuYXNzZXJ0X25leHQ7CisJCX0KKwkJZXJyb3IobCwgImlsbGVnYWwgYXNzZXJ0aW9uIG5hbWUgZm9yICN1bmFzc2VydCIpOworCQlnb3RvIGhhbmRsZV91bmFzc2VydF93YXJwOworCX0KKwlnb3RvIGhhbmRsZV91bmFzc2VydF90cnVuYzsKKworaGFuZGxlX3VuYXNzZXJ0X25leHQ6CisJd2hpbGUgKCFuZXh0X3Rva2VuKGxzKSkgeworCQlpZiAobHMtPmN0b2stPnR5cGUgPT0gTkVXTElORSkgYnJlYWs7CisJCWlmICh0dE1XUyhscy0+Y3Rvay0+dHlwZSkpIGNvbnRpbnVlOworCQlpZiAobHMtPmN0b2stPnR5cGUgIT0gTFBBUikgeworCQkJZXJyb3IobCwgInN5bnRheCBlcnJvciBpbiAjdW5hc3NlcnQiKTsKKwkJCWdvdG8gaGFuZGxlX3VuYXNzZXJ0X3dhcnA7CisJCX0KKwkJZ290byBoYW5kbGVfdW5hc3NlcnRfbmV4dDI7CisJfQorCWlmIChlbWl0X2Fzc2VydGlvbnMpIGZwcmludGYoZW1pdF9vdXRwdXQsICIjdW5hc3NlcnQgJXNcbiIsIGEtPm5hbWUpOworCWRlbEhUKGFzc2VydGlvbnMsIGEpOworCXJldHVybiAwOworCitoYW5kbGVfdW5hc3NlcnRfbmV4dDI6CisJYXRsID0gZ2V0bWVtKHNpemVvZihzdHJ1Y3QgdG9rZW5fZmlmbykpOworCWF0bC0+YXJ0ID0gYXRsLT5udCA9IDA7CisJZm9yIChubnAgPSAxLCBsdHd3ID0gMTsgbm5wICYmICFuZXh0X3Rva2VuKGxzKTspIHsKKwkJaWYgKGxzLT5jdG9rLT50eXBlID09IE5FV0xJTkUpIGJyZWFrOworCQlpZiAobHR3dyAmJiB0dE1XUyhscy0+Y3Rvay0+dHlwZSkpIGNvbnRpbnVlOworCQlsdHd3ID0gdHRNV1MobHMtPmN0b2stPnR5cGUpOworCQlpZiAobHMtPmN0b2stPnR5cGUgPT0gTFBBUikgbm5wICsrOworCQllbHNlIGlmIChscy0+Y3Rvay0+dHlwZSA9PSBSUEFSKSB7CisJCQlpZiAoISgtLSBubnApKSBnb3RvIGhhbmRsZV91bmFzc2VydF9uZXh0MzsKKwkJfQorCQl0LnR5cGUgPSBscy0+Y3Rvay0+dHlwZTsKKwkJaWYgKFNfVE9LRU4odC50eXBlKSkgdC5uYW1lID0gc2R1cChscy0+Y3Rvay0+bmFtZSk7CisJCWFvbChhdGwtPnQsIGF0bC0+bnQsIHQsIFRPS0VOX0xJU1RfTUVNRyk7CisJfQorCWdvdG8gaGFuZGxlX3VuYXNzZXJ0X3RydW5jOworCitoYW5kbGVfdW5hc3NlcnRfbmV4dDM6CisJd2hpbGUgKCFuZXh0X3Rva2VuKGxzKSAmJiBscy0+Y3Rvay0+dHlwZSAhPSBORVdMSU5FKSB7CisJCWlmICghdHRXSEkobHMtPmN0b2stPnR5cGUpICYmIChscy0+ZmxhZ3MgJiBXQVJOX1NUQU5EQVJEKSkgeworCQkJd2FybmluZyhsLCAidHJhaWxpbmcgZ2FyYmFnZSBpbiAjdW5hc3NlcnQiKTsKKwkJfQorCX0KKwlpZiAoYXRsLT5udCAmJiB0dE1XUyhhdGwtPnRbYXRsLT5udCAtIDFdLnR5cGUpICYmICgtLSBhdGwtPm50KSA9PSAwKQorCQlmcmVlbWVtKGF0bC0+dCk7CisJaWYgKGF0bC0+bnQgPT0gMCkgeworCQllcnJvcihsLCAidm9pZCBhc3NlcnRpb24gaW4gI3VuYXNzZXJ0Iik7CisJCWZyZWVtZW0oYXRsKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJZm9yIChpID0gMDsgaSA8IGEtPm5idmFsICYmIGNtcF90b2tlbl9saXN0KGF0bCwgYS0+dmFsICsgaSk7IGkgKyspOworCWlmIChpICE9IGEtPm5idmFsKSB7CisJCS8qIHdlIGhhdmUgaXQsIHVuZGVmaW5lIGl0ICovCisJCWlmIChpIDwgKGEtPm5idmFsIC0gMSkpCisJCQltbXZ3byhhLT52YWwgKyBpLCBhLT52YWwgKyBpICsgMSwgKGEtPm5idmFsIC0gaSAtIDEpCisJCQkJKiBzaXplb2Yoc3RydWN0IHRva2VuX2ZpZm8pKTsKKwkJYS0+bmJ2YWwgLS07CisJCWlmIChlbWl0X2Fzc2VydGlvbnMpIHsKKwkJCWZwcmludGYoZW1pdF9vdXRwdXQsICIjdW5hc3NlcnQgJXMoIiwgYS0+bmFtZSk7CisJCQlwcmludF90b2tlbl9maWZvKGF0bCk7CisJCQlmcHV0cygiKVxuIiwgZW1pdF9vdXRwdXQpOworCQl9CisJfQorCXJldCA9IDA7CisJZ290byBoYW5kbGVfdW5hc3NlcnRfZmluaXNoOworCitoYW5kbGVfdW5hc3NlcnRfdHJ1bmM6CisJZXJyb3IobCwgInVuZmluaXNoZWQgI3VuYXNzZXJ0Iik7CitoYW5kbGVfdW5hc3NlcnRfZmluaXNoOgorCWlmIChhdGwgJiYgYXRsLT5udCkgeworCQlmb3IgKGkgPSAwOyBpIDwgYXRsLT5udDsgaSArKykKKwkJCWlmIChTX1RPS0VOKGF0bC0+dFtpXS50eXBlKSkgZnJlZW1lbShhdGwtPnRbaV0ubmFtZSk7CisJCWZyZWVtZW0oYXRsLT50KTsKKwl9CisJcmV0dXJuIHJldDsKK2hhbmRsZV91bmFzc2VydF93YXJwOgorCXdoaWxlICghbmV4dF90b2tlbihscykgJiYgbHMtPmN0b2stPnR5cGUgIT0gTkVXTElORSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEFkZCB0aGUgZ2l2ZW4gYXNzZXJ0aW9uIChhcyBzdHJpbmcpLgorICovCitpbnQgbWFrZV9hc3NlcnRpb24oY2hhciAqYXZhbCkKK3sKKwlzdHJ1Y3QgbGV4ZXJfc3RhdGUgbGxzOworCXNpemVfdCBuID0gc3RybGVuKGF2YWwpICsgMTsKKwljaGFyICpjID0gc2R1cChhdmFsKTsKKwlpbnQgcmV0OworCisJKihjICsgbiAtIDEpID0gJ1xuJzsKKwlpbml0X2J1Zl9sZXhlcl9zdGF0ZSgmbGxzLCAwKTsKKwlsbHMuZmxhZ3MgPSBERUZBVUxUX0xFWEVSX0ZMQUdTOworCWxscy5pbnB1dCA9IDA7CisJbGxzLmlucHV0X3N0cmluZyA9ICh1bnNpZ25lZCBjaGFyICopYzsKKwlsbHMucGJ1ZiA9IDA7CisJbGxzLmVidWYgPSBuOworCWxscy5saW5lID0gLTE7CisJcmV0ID0gaGFuZGxlX2Fzc2VydCgmbGxzKTsKKwlmcmVlbWVtKGMpOworCWZyZWVfbGV4ZXJfc3RhdGUoJmxscyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlbW92ZSB0aGUgZ2l2ZW4gYXNzZXJ0aW9uIChhcyBzdHJpbmcpLgorICovCitpbnQgZGVzdHJveV9hc3NlcnRpb24oY2hhciAqYXZhbCkKK3sKKwlzdHJ1Y3QgbGV4ZXJfc3RhdGUgbGxzOworCXNpemVfdCBuID0gc3RybGVuKGF2YWwpICsgMTsKKwljaGFyICpjID0gc2R1cChhdmFsKTsKKwlpbnQgcmV0OworCisJKihjICsgbiAtIDEpID0gJ1xuJzsKKwlpbml0X2J1Zl9sZXhlcl9zdGF0ZSgmbGxzLCAwKTsKKwlsbHMuZmxhZ3MgPSBERUZBVUxUX0xFWEVSX0ZMQUdTOworCWxscy5pbnB1dCA9IDA7CisJbGxzLmlucHV0X3N0cmluZyA9ICh1bnNpZ25lZCBjaGFyICopYzsKKwlsbHMucGJ1ZiA9IDA7CisJbGxzLmVidWYgPSBuOworCWxscy5saW5lID0gLTE7CisJcmV0ID0gaGFuZGxlX3VuYXNzZXJ0KCZsbHMpOworCWZyZWVtZW0oYyk7CisJZnJlZV9sZXhlcl9zdGF0ZSgmbGxzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogaW5pdGlhbGl6ZSB0aGUgYXNzZXJ0aW9uIHRhYmxlCisgKi8KK3ZvaWQgaW5pdF9hc3NlcnRpb25zKHZvaWQpCit7CisJaWYgKGFzc2VydGlvbnMpIGtpbGxIVChhc3NlcnRpb25zKTsKKwlhc3NlcnRpb25zID0gbmV3SFQoMTI4LCBjbXBfc3RydWN0LCBoYXNoX3N0cnVjdCwgZGVsX2Fzc2VydGlvbik7Cit9CisKKy8qCisgKiByZXRyaWV2ZSBhbiBhc3NlcnRpb24gZnJvbSB0aGUgaGFzaCB0YWJsZQorICovCitzdHJ1Y3QgYXNzZXJ0ICpnZXRfYXNzZXJ0aW9uKGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIGdldEhUKGFzc2VydGlvbnMsICZuYW1lKTsKK30KKworLyoKKyAqIHByaW50IGFscmVhZHkgZGVmaW5lZCBhc3NlcnRpb25zCisgKi8KK3ZvaWQgcHJpbnRfYXNzZXJ0aW9ucyh2b2lkKQoreworCXNjYW5IVChhc3NlcnRpb25zLCBwcmludF9hc3NlcnQpOworfQpkaWZmIC0tZ2l0IGEvdWNwcC9jcHAuYyBiL3VjcHAvY3BwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRjY2ExMwotLS0gL2Rldi9udWxsCisrKyBiL3VjcHAvY3BwLmMKQEAgLTAsMCArMSwyMjY1IEBACisvKgorICogQyBhbmQgVCBwcmVwcm9jZXNzb3IsIGFuZCBpbnRlZ3JhdGVkIGxleGVyCisgKiAoYykgVGhvbWFzIFBvcm5pbiAxOTk5LCAyMDAwCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsCisgKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisvKnZiKi8KKyNpZmRlZiBIQVZFX01JU1JBCit2b2lkIG1pc3JhKGludCwuLi4pOworI2VuZGlmCitleHRlcm4gdm9pZCBoYW5kbGVfZGVwcyhjaGFyICosaW50KTsKKworI2RlZmluZSBWRVJTX01BSgkxCisjZGVmaW5lIFZFUlNfTUlOCTAKKy8qIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGlmIHlvdSBjYW5ub3Qgc2V0IGl0IHdpdGggYSBjb21waWxlciBmbGFnICovCisvKiAjZGVmaW5lIFNUQU5EX0FMT05FICovCisKKyNpbmNsdWRlICJ0dW5lLmgiCisjaWZkZWYgVUNQUF9NTUFQCisjaWZuZGVmIF9QT1NJWF9TT1VSQ0UKKyNkZWZpbmUgX1BPU0lYX1NPVVJDRQkxCisjZW5kaWYKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgInVjcHBpLmgiCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSAiaGFzaC5oIgorI2lmZGVmIFVDUFBfTU1BUAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNlbmRpZgorCisvKgorICogVGhlIHN0YW5kYXJkIHBhdGggd2hlcmUgaW5jbHVkZXMgYXJlIGxvb2tlZCBmb3IuCisgKi8KKyNpZmRlZiBTVEFORF9BTE9ORQorc3RhdGljIGNoYXIgKmluY2x1ZGVfcGF0aF9zdGRbXSA9IHsgU1REX0lOQ0xVREVfUEFUSCwgMCB9OworI2VuZGlmCitzdGF0aWMgY2hhciAqKmluY2x1ZGVfcGF0aDsKK3N0YXRpYyBzaXplX3QgaW5jbHVkZV9wYXRoX25iID0gMDsKKworaW50IG5vX3NwZWNpYWxfbWFjcm9zID0gMDsKK2ludCBlbWl0X2RlcGVuZGVuY2llcyA9IDAsIGVtaXRfZGVmaW5lcyA9IDAsIGVtaXRfYXNzZXJ0aW9ucyA9IDA7CitGSUxFICplbWl0X291dHB1dDsKKworI2lmZGVmIFNUQU5EX0FMT05FCitzdGF0aWMgY2hhciAqc3lzdGVtX21hY3Jvc19kZWZbXSA9IHsgU1REX01BQ1JPUywgMCB9Oworc3RhdGljIGNoYXIgKnN5c3RlbV9hc3NlcnRpb25zX2RlZltdID0geyBTVERfQVNTRVJULCAwIH07CisjZW5kaWYKKworY2hhciAqY3VycmVudF9maWxlbmFtZSwgKmN1cnJlbnRfbG9uZ19maWxlbmFtZSA9IDA7CitzdGF0aWMgaW50IGN1cnJlbnRfaW5jZGlyID0gLTE7CisKKyNpZm5kZWYgTk9fVUNQUF9FUlJPUl9GVU5DVElPTlMKKy8qCisgKiAib3VjaCIgaXMgdGhlIG5hbWUgZm9yIGFuIGludGVybmFsIHVjcHAgZXJyb3IuIElmIEFVRElUIGlzIG5vdCBkZWZpbmVkLAorICogbm8gY29kZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBnZW5lcmF0ZWQ7IGEgIm91Y2giIG1heSBzdGlsbCBiZQorICogZW1pdHRlZCBieSBnZXRtZW0oKSAoaW4gbWVtLmMpIGlmIE1FTV9DSEVDSyBpcyBkZWZpbmVkLCBidXQgdGhpcyAib3VjaCIKKyAqIGRvZXMgbm90IHVzZSB0aGlzIGZ1bmN0aW9uLgorICovCisjZW5kaWYJLyogTk9fVUNQUF9FUlJPUl9GVU5DVElPTlMgKi8KKworLyoKKyAqIFNvbWUgbWVtb3J5IGFsbG9jYXRpb25zIGFyZSBtYW51YWxseSBnYXJiYWdlLWNvbGxlY3RlZDsgZXNzZW50aWFsbHksCisgKiBzdHJpbmdzIGR1cGxpY2F0ZWQgaW4gdGhlIHByb2Nlc3Mgb2YgbWFjcm8gcmVwbGFjZW1lbnQuIEVhY2ggc3VjaAorICogc3RyaW5nIGlzIHJlZmVyZW5jZWQgaW4gdGhlIGdhcmJhZ2VfZmlmbywgd2hpY2ggaXMgY2xlYXJlZCB3aGVuIGFsbAorICogbmVzdGVkIG1hY3JvcyBoYXZlIGJlZW4gcmVzb2x2ZWQuCisgKi8KKworc3RydWN0IGdhcmJhZ2VfZmlmbyB7CisJY2hhciAqKmdhcmJhZ2U7CisJc2l6ZV90IG5nYXJiLCBtZW1nYXJiOworfTsKKworLyoKKyAqIHRocm93X2F3YXkoKSBtYXJrcyBhIHN0cmluZyB0byBiZSBjb2xsZWN0ZWQgbGF0ZXIKKyAqLwordm9pZCB0aHJvd19hd2F5KHN0cnVjdCBnYXJiYWdlX2ZpZm8gKmdmLCBjaGFyICpuKQoreworCXdhbihnZi0+Z2FyYmFnZSwgZ2YtPm5nYXJiLCBuLCBnZi0+bWVtZ2FyYik7Cit9CisKKy8qCisgKiBmcmVlIG1hcmtlZCBzdHJpbmdzCisgKi8KK3ZvaWQgZ2FyYmFnZV9jb2xsZWN0KHN0cnVjdCBnYXJiYWdlX2ZpZm8gKmdmKQoreworCXNpemVfdCBpOworCisJZm9yIChpID0gMDsgaSA8IGdmLT5uZ2FyYjsgaSArKykgZnJlZW1lbShnZi0+Z2FyYmFnZVtpXSk7CisJZ2YtPm5nYXJiID0gMDsKK30KKworc3RhdGljIHZvaWQgaW5pdF9nYXJiYWdlX2ZpZm8oc3RydWN0IGdhcmJhZ2VfZmlmbyAqZ2YpCit7CisJZ2YtPmdhcmJhZ2UgPSBnZXRtZW0oKGdmLT5tZW1nYXJiID0gR0FSQkFHRV9MSVNUX01FTUcpCisJCSogc2l6ZW9mKGNoYXIgKikpOworCWdmLT5uZ2FyYiA9IDA7Cit9CisKKy8qCisgKiBvcmRlciBpcyBpbXBvcnRhbnQ6IGl0IG11c3QgbWF0Y2ggdGhlIHRva2VuLWNvbnN0YW50cyBkZWNsYXJlZCBhcyBhbgorICogZW51bSBpbiB0aGUgaGVhZGVyIGZpbGUuCisgKi8KK2NoYXIgKm9wZXJhdG9yc19uYW1lW10gPSB7CisJIiAiLCAiXG4iLCAiICIsCisJIjAwMDAiLCAibmFtZSIsICJidW5jaCIsICJwcmFnbWEiLCAiY29udGV4dCIsCisJIlwiZHVtbXkgc3RyaW5nXCIiLCAiJ2R1bW15IGNoYXInIiwKKwkiLyIsICIvPSIsICItIiwgIi0tIiwgIi09IiwgIi0+IiwgIisiLCAiKysiLCAiKz0iLCAiPCIsICI8PSIsICI8PCIsCisJIjw8PSIsICI+IiwgIj49IiwgIj4+IiwgIj4+PSIsICI9IiwgIj09IiwKKyNpZmRlZiBDQVNUX09QCisJIj0+IiwKKyNlbmRpZgorCSJ+IiwgIiE9IiwgIiYiLCAiJiYiLCAiJj0iLCAifCIsICJ8fCIsICJ8PSIsICIlIiwgIiU9IiwgIioiLCAiKj0iLAorCSJeIiwgIl49IiwgIiEiLCAifj0iLCAieyIsICJ9IiwgIlsiLCAiXSIsICIoIiwgIikiLCAiLCIsICI/IiwgIjsiLAorCSI6IiwgIi4iLCAiLi4uIiwgIiMiLCAiIyMiLCAiICIsICJvdWNoIiwgIjw6IiwgIjo+IiwgIjwlIiwgIiU+IiwKKwkiJToiLCAiJTolOiIKK307CisKKy8qIHRoZSBhc2NpaSByZXByZXNlbnRhdGlvbiBvZiBhIHRva2VuICovCisjaWZkZWYgU0VNUEVSX0ZJREVMSVMKKyNkZWZpbmUgdG5hbWUoeCkJKHR0V0hJKCh4KS50eXBlKSA/ICIgIiA6IFNfVE9LRU4oKHgpLnR5cGUpIFwKKwkJCT8gKHgpLm5hbWUgOiBvcGVyYXRvcnNfbmFtZVsoeCkudHlwZV0pCisjZWxzZQorI2RlZmluZSB0bmFtZSh4KQkoU19UT0tFTigoeCkudHlwZSkgPyAoeCkubmFtZSBcCisJCQk6IG9wZXJhdG9yc19uYW1lWyh4KS50eXBlXSkKKyNlbmRpZgorCitjaGFyICp0b2tlbl9uYW1lKHN0cnVjdCB0b2tlbiAqdCkKK3sKKwlyZXR1cm4gdG5hbWUoKnQpOworfQorCisvKgorICogVG8gc3BlZWQgdXAgZGVlcGx5IG5lc3RlZCBhbmQgcmVwZWF0ZWQgaW5jbHVzaW9ucywgd2U6CisgKiAtLSB1c2UgYSBoYXNoIHRhYmxlIHRvIHJlbWVtYmVyIHdoZXJlIHdlIGZvdW5kIGVhY2ggZmlsZQorICogLS0gcmVtZW1iZXIgd2hlbiB0aGUgZmlsZSBpcyBwcm90ZWN0ZWQgYnkgYSAjaWZuZGVmLyNkZWZpbmUvI2VuZGlmCisgKiAgICBjb25zdHJ1Y3Rpb247IHdlIGNhbiB0aGVuIGF2b2lkIGluY2x1ZGluZyBzZXZlcmFsIHRpbWVzIGEgZmlsZQorICogICAgd2hlbiB0aGlzIGlzIG5vdCBuZWNlc3NhcnkuCisgKiAtLSByZW1lbWJlciBpbiB3aGljaCBkaXJlY3RvcnksIGluIHRoZSBpbmNsdWRlIHBhdGgsIHRoZSBmaWxlIHdhcyBmb3VuZC4KKyAqLworc3RydWN0IGZvdW5kX2ZpbGUgeworCWNoYXIgKm5hbWU7CQkvKiBmaXJzdCBmaWVsZCAqLworCWNoYXIgKmxvbmdfbmFtZTsKKwljaGFyICpwcm90ZWN0OworCWludCBpbmNkaXI7Cit9OworCitzdGF0aWMgc3RydWN0IEhUICpmb3VuZF9maWxlcyA9IDAsICpmb3VuZF9maWxlc19sb2MgPSAwOworCitzdGF0aWMgc3RydWN0IGZvdW5kX2ZpbGUgKm5ld19mb3VuZF9maWxlKHZvaWQpCit7CisJc3RydWN0IGZvdW5kX2ZpbGUgKmZmID0gZ2V0bWVtKHNpemVvZihzdHJ1Y3QgZm91bmRfZmlsZSkpOworCisJZmYtPnByb3RlY3QgPSAwOworCWZmLT5pbmNkaXIgPSAtMTsKKwlyZXR1cm4gZmY7Cit9CisKK3N0YXRpYyB2b2lkIGRlbF9mb3VuZF9maWxlKHZvaWQgKm0pCit7CisJc3RydWN0IGZvdW5kX2ZpbGUgKmZmID0gKHN0cnVjdCBmb3VuZF9maWxlICopbTsKKworCWZyZWVtZW0oZmYtPm5hbWUpOworCWZyZWVtZW0oZmYtPmxvbmdfbmFtZSk7CisJaWYgKGZmLT5wcm90ZWN0KSBmcmVlbWVtKGZmLT5wcm90ZWN0KTsKK30KKworLyoKKyAqIFRvIGtlZXAgdXAgd2l0aCB0aGUgI2lmbmRlZi8jZGVmaW5lLyNlbmRpZiBwcm90ZWN0aW9uIG1lY2hhbmlzbQorICogZGV0ZWN0aW9uLgorICovCitzdHJ1Y3QgcHJvdGVjdCBwcm90ZWN0X2RldGVjdDsKK3N0YXRpYyBzdHJ1Y3QgcHJvdGVjdCAqcHJvdGVjdF9kZXRlY3Rfc3RhY2sgPSAwOworCisvKgorICogImN1cnJlbnRfZmlsZW5hbWUiIGlzIHVzZWQgZm9yIGVycm9yIHJlcG9ydGluZywgYW5kIHRoZSBfX0ZJTEVfXyBtYWNybworICovCitzdGF0aWMgdm9pZCBzZXRfY3VycmVudF9maWxlbmFtZShjaGFyICp4KQoreworCWN1cnJlbnRfZmlsZW5hbWUgPSB4OworfQorCit2b2lkIHNldF9pbml0X2ZpbGVuYW1lKGNoYXIgKngsIGludCByZWFsX2ZpbGUpCit7CisJc2V0X2N1cnJlbnRfZmlsZW5hbWUoc2R1cCh4KSk7CisJY3VycmVudF9sb25nX2ZpbGVuYW1lID0gMDsKKwljdXJyZW50X2luY2RpciA9IC0xOworCWlmIChyZWFsX2ZpbGUpIHsKKwkJcHJvdGVjdF9kZXRlY3QubWFjcm8gPSAwOworCQlwcm90ZWN0X2RldGVjdC5zdGF0ZSA9IDE7CisJCXByb3RlY3RfZGV0ZWN0LmZmID0gbmV3X2ZvdW5kX2ZpbGUoKTsKKwkJcHJvdGVjdF9kZXRlY3QuZmYtPm5hbWUgPSBzZHVwKHgpOworCQlwcm90ZWN0X2RldGVjdC5mZi0+bG9uZ19uYW1lID0gc2R1cCh4KTsKKwkJcHV0SFQoZm91bmRfZmlsZXNfbG9jLCBwcm90ZWN0X2RldGVjdC5mZik7CisJfSBlbHNlIHsKKwkJcHJvdGVjdF9kZXRlY3Quc3RhdGUgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgaW5pdF9mb3VuZF9maWxlcyh2b2lkKQoreworCWlmIChmb3VuZF9maWxlcykga2lsbEhUKGZvdW5kX2ZpbGVzKTsKKwlmb3VuZF9maWxlcyA9IG5ld0hUKDEyOCwgY21wX3N0cnVjdCwgaGFzaF9zdHJ1Y3QsIGRlbF9mb3VuZF9maWxlKTsKKwlpZiAoZm91bmRfZmlsZXNfbG9jKSBraWxsSFQoZm91bmRfZmlsZXNfbG9jKTsKKwlmb3VuZF9maWxlc19sb2MgPSBuZXdIVCgxMjgsIGNtcF9zdHJ1Y3QsIGhhc2hfc3RydWN0LCBkZWxfZm91bmRfZmlsZSk7Cit9CisKKy8qCisgKiBjb252ZXJ0IGEgVW5peC1zdHlsZSBwYXRoIGZvciB0aGUgaG9zdCBhcmNoaXRlY3R1cmUKKyAqLworI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoQVRBUkkpIHx8IGRlZmluZWQoX1dJTjMyKQorc3RhdGljIGNoYXIgKmNvbnZlcnRfcGF0aChjaGFyICpwYXRoKQoreworCS8qIG9uIG1zZG9zIHN5c3RlbXMsIHJlcGxhY2UgYWxsIC8gYnkgXCAqLworCWNoYXIgKmMsICpuZXdwID0gc2R1cChwYXRoKTsKKworCWZvciAoYyA9IG5ld3A7ICpjOyBjICsrKSBpZiAoKmMgPT0gJy8nKSAqYyA9ICdcXCc7CisJcmV0dXJuIG5ld3A7Cit9CisKKyNlbGlmIGRlZmluZWQgQU1JR0EKK3N0YXRpYyBjaGFyICpjb252ZXJ0X3BhdGgoY2hhciAqcGF0aCkKK3sKKwljaGFyICpuZXdwID0gZ2V0bWVtKDEgKyBzdHJsZW4ocGF0aCkpOworCWNoYXIgKnMgPSBwYXRoLCAqZCA9IG5ld3A7CisKKwlpZiAoKnMgPT0gJy4nKSB7CQkJCQkvKiBjb252ZXJ0ICIuIiB0byAiIiAqLworCQlpZiAoKihzKzEpID09ICdcMCcpCisJCQlzKys7CisJfQorCXdoaWxlICgqcykgeworCQlpZiAoKnMgPT0gJy4nKSB7CisJCQlpZiAoKihzKzEpID09ICcvJykgeworCQkJCXMgKz0gMjsJCQkJCQkJLyogIi4vIiBpcyBkaXNjYXJkZWQgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWVsc2UgaWYgKCoocysxKSA9PSAnLicpIHsKKwkJCQlpZiAoKihzKzIpID09ICcvJykKKwkJCQkJcyArPSAyOwkJCQkJCS8qICIuLi8iIGlzIGNvbnZlcnRlZCB0byAiLyIgKi8KKwkJCX0KKwkJfQorCQkqZCsrID0gKnMrKzsKKwl9CisJKmQgPSAnXDAnOworCisJcmV0dXJuIG5ld3A7Cit9CisKKyNlbHNlICAvKiBubyBjb252ZXJzaW9uICovCitzdGF0aWMgY2hhciAqY29udmVydF9wYXRoKGNoYXIgKnBhdGgpCit7CisJcmV0dXJuIHNkdXAocGF0aCk7Cit9CisjZW5kaWYKKworLyoKKyAqIFNldCB0aGUgbGV4ZXIgc3RhdGUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGZpbGUuCisgKi8KK3N0YXRpYyB2b2lkIHJlaW5pdF9sZXhlcl9zdGF0ZShzdHJ1Y3QgbGV4ZXJfc3RhdGUgKmxzLCBpbnQgd2IpCit7CisjaWZuZGVmIE5PX1VDUFBfQlVGCisJbHMtPmlucHV0X2J1ZiA9IHdiID8gZ2V0bWVtKElOUFVUX0JVRl9NRU1HKSA6IDA7CisjaWZkZWYgVUNQUF9NTUFQCisJbHMtPmZyb21fbW1hcCA9IDA7CisjZW5kaWYKKyNlbmRpZgorCWxzLT5lYnVmID0gbHMtPnBidWYgPSAwOworCWxzLT5ubGthID0gMDsKKwlscy0+bWFjZmlsZSA9IDA7CisJbHMtPmRpc2NhcmQgPSAxOworCWxzLT5sYXN0ID0gMDsJCS8qIHdlIHN1cHBvc2UgJ1xuJyBpcyBub3QgMCAqLworCWxzLT5saW5lID0gMTsKKwlscy0+bHR3bmwgPSAxOworCWxzLT5vbGluZSA9IDE7CisJbHMtPnBlbmRpbmdfdG9rZW4gPSAwOworCWxzLT5jbGkgPSAwOworCWxzLT5jb3B5X2xpbmVbQ09QWV9MSU5FX0xFTkdUSCAtIDFdID0gMDsKKwlscy0+aWZuZXN0ID0gMDsKKwlscy0+Y29uZGZbMF0gPSBscy0+Y29uZGZbMV0gPSAwOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgc3RydWN0IGxleGVyX3N0YXRlLCB3aXRoIG9wdGlvbmFsIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycy4KKyAqLwordm9pZCBpbml0X2J1Zl9sZXhlcl9zdGF0ZShzdHJ1Y3QgbGV4ZXJfc3RhdGUgKmxzLCBpbnQgd2IpCit7CisJcmVpbml0X2xleGVyX3N0YXRlKGxzLCB3Yik7CisjaWZuZGVmIE5PX1VDUFBfQlVGCisJbHMtPm91dHB1dF9idWYgPSB3YiA/IGdldG1lbShPVVRQVVRfQlVGX01FTUcpIDogMDsKKyNlbmRpZgorCWxzLT5zYnVmID0gMDsKKworCWxzLT5jdG9rID0gZ2V0bWVtKHNpemVvZihzdHJ1Y3QgdG9rZW4pKTsKKwlscy0+Y3Rvay0+bmFtZSA9IGdldG1lbShscy0+dGtubCA9IFRPS0VOX05BTUVfTUVNRyk7CisJbHMtPnBlbmRpbmdfdG9rZW4gPSAwOworCisJbHMtPmZsYWdzID0gMDsKKwlscy0+Y291bnRfdHJpZ3JhcGhzID0gMDsKKwlscy0+Z2YgPSBnZXRtZW0oc2l6ZW9mKHN0cnVjdCBnYXJiYWdlX2ZpZm8pKTsKKwlpbml0X2dhcmJhZ2VfZmlmbyhscy0+Z2YpOworCWxzLT5jb25kY29tcCA9IDE7CisJbHMtPmNvbmRuZXN0ID0gMDsKKyNpZmRlZiBJTk1BQ1JPX0ZMQUcKKwlscy0+aW5tYWNybyA9IDA7CisJbHMtPm1hY3JvX2NvdW50ID0gMDsKKyNlbmRpZgorfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgKGNvbXBsZXgpIHN0cnVjdCBsZXhlcl9zdGF0ZS4KKyAqLwordm9pZCBpbml0X2xleGVyX3N0YXRlKHN0cnVjdCBsZXhlcl9zdGF0ZSAqbHMpCit7CisJaW5pdF9idWZfbGV4ZXJfc3RhdGUobHMsIDEpOworfQorCisvKgorICogUmVzdG9yZSB3aGF0IGlzIG5lZWRlZCBmcm9tIGEgbGV4ZXJfc3RhdGUuIFRoaXMgaXMgdXNlZCBmb3IgI2luY2x1ZGUuCisgKi8KK3N0YXRpYyB2b2lkIHJlc3RvcmVfbGV4ZXJfc3RhdGUoc3RydWN0IGxleGVyX3N0YXRlICpscywKKwlzdHJ1Y3QgbGV4ZXJfc3RhdGUgKmxzYmFrKQoreworI2lmbmRlZiBOT19VQ1BQX0JVRgorCWZyZWVtZW0obHMtPmlucHV0X2J1Zik7CisJbHMtPmlucHV0X2J1ZiA9IGxzYmFrLT5pbnB1dF9idWY7CisjaWZkZWYgVUNQUF9NTUFQCisJbHMtPmZyb21fbW1hcCA9IGxzYmFrLT5mcm9tX21tYXA7CisJbHMtPmlucHV0X2J1Zl9zYXYgPSBsc2Jhay0+aW5wdXRfYnVmX3NhdjsKKyNlbmRpZgorI2VuZGlmCisJbHMtPmlucHV0ID0gbHNiYWstPmlucHV0OworCWxzLT5lYnVmID0gbHNiYWstPmVidWY7CisJbHMtPnBidWYgPSBsc2Jhay0+cGJ1ZjsKKwlscy0+bmxrYSA9IGxzYmFrLT5ubGthOworCWxzLT5tYWNmaWxlID0gbHNiYWstPm1hY2ZpbGU7CisJbHMtPmRpc2NhcmQgPSBsc2Jhay0+ZGlzY2FyZDsKKwlscy0+bGluZSA9IGxzYmFrLT5saW5lOworCWxzLT5vbGluZSA9IGxzYmFrLT5vbGluZTsKKwlscy0+aWZuZXN0ID0gbHNiYWstPmlmbmVzdDsKKwlscy0+Y29uZGZbMF0gPSBsc2Jhay0+Y29uZGZbMF07CisJbHMtPmNvbmRmWzFdID0gbHNiYWstPmNvbmRmWzFdOworfQorCisvKgorICogZmlsZV9jb250ZXh0IChhbmQgdGhlIHR3byBmdW5jdGlvbnMgcHVzaF8gYW5kIHBvcF8pIGFyZSB1c2VkIHRvIHNhdmUKKyAqIGFsbCB0aGF0IGlzIG5lZWRlZCB3aGVuIGluY2x1ZGluZyBhIGZpbGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZmlsZV9jb250ZXh0IHsKKwlzdHJ1Y3QgbGV4ZXJfc3RhdGUgbHM7CisJY2hhciAqbmFtZSwgKmxvbmdfbmFtZTsKKwlpbnQgaW5jZGlyOworfSAqbHNfc3RhY2s7CitzdGF0aWMgc2l6ZV90IGxzX2RlcHRoID0gMDsKKworc3RhdGljIHZvaWQgcHVzaF9maWxlX2NvbnRleHQoc3RydWN0IGxleGVyX3N0YXRlICpscykKK3sKKwlzdHJ1Y3QgZmlsZV9jb250ZXh0IGZjOworCisJaWYgKGxzX2RlcHRoID4gMTAyMykKKwkJZXJyb3IobHMtPmxpbmUgLSAxLCAidG9vIG1hbnkgbmVzdGVkIGluY2x1ZGVzIik7CisJZmMubmFtZSA9IGN1cnJlbnRfZmlsZW5hbWU7CisJZmMubG9uZ19uYW1lID0gY3VycmVudF9sb25nX2ZpbGVuYW1lOworCWZjLmluY2RpciA9IGN1cnJlbnRfaW5jZGlyOworCW1tdigmKGZjLmxzKSwgbHMsIHNpemVvZihzdHJ1Y3QgbGV4ZXJfc3RhdGUpKTsKKwlhb2wobHNfc3RhY2ssIGxzX2RlcHRoLCBmYywgTFNfU1RBQ0tfTUVNRyk7CisJbHNfZGVwdGggLS07CisJYW9sKHByb3RlY3RfZGV0ZWN0X3N0YWNrLCBsc19kZXB0aCwgcHJvdGVjdF9kZXRlY3QsIExTX1NUQUNLX01FTUcpOworCXByb3RlY3RfZGV0ZWN0Lm1hY3JvID0gMDsKK30KKworc3RhdGljIHZvaWQgcG9wX2ZpbGVfY29udGV4dChzdHJ1Y3QgbGV4ZXJfc3RhdGUgKmxzKQoreworI2lmZGVmIEFVRElUCisJaWYgKGxzX2RlcHRoIDw9IDApIG91Y2goInByZXBhcmUgdG8gbWVldCB0aHkgY3JlYXRvciIpOworI2VuZGlmCisJcmVzdG9yZV9sZXhlcl9zdGF0ZShscywgJihsc19zdGFja1stLSBsc19kZXB0aF0ubHMpKTsKKwlpZiAocHJvdGVjdF9kZXRlY3QubWFjcm8pIGZyZWVtZW0ocHJvdGVjdF9kZXRlY3QubWFjcm8pOworCXByb3RlY3RfZGV0ZWN0ID0gcHJvdGVjdF9kZXRlY3Rfc3RhY2tbbHNfZGVwdGhdOworCXNldF9jdXJyZW50X2ZpbGVuYW1lKGxzX3N0YWNrW2xzX2RlcHRoXS5uYW1lKTsKKwljdXJyZW50X2xvbmdfZmlsZW5hbWUgPSBsc19zdGFja1tsc19kZXB0aF0ubG9uZ19uYW1lOworCWN1cnJlbnRfaW5jZGlyID0gbHNfc3RhY2tbbHNfZGVwdGhdLmluY2RpcjsKK30KKworLyoKKyAqIHJlcG9ydF9jb250ZXh0KCkgcmV0dXJucyB0aGUgbGlzdCBvZiBzdWNjZXNzaXZlIGluY2x1ZGVycyBvZiB0aGUKKyAqIGN1cnJlbnQgZmlsZSwgZW5kaW5nIHdpdGggYSBkdW1teSBlbnRyeSB3aXRoIGEgbmVnYXRpdmUgbGluZSBudW1iZXIuCisgKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHRoZSByZXR1cm5lZCBwb2ludGVyLgorICovCitzdHJ1Y3Qgc3RhY2tfY29udGV4dCAqcmVwb3J0X2NvbnRleHQodm9pZCkKK3sKKwlzdHJ1Y3Qgc3RhY2tfY29udGV4dCAqc2M7CisJc2l6ZV90IGk7CisKKwlzYyA9IGdldG1lbSgobHNfZGVwdGggKyAxKSAqIHNpemVvZihzdHJ1Y3Qgc3RhY2tfY29udGV4dCkpOworCWZvciAoaSA9IDA7IGkgPCBsc19kZXB0aDsgaSArKykgeworCQlzY1tpXS5uYW1lID0gbHNfc3RhY2tbbHNfZGVwdGggLSBpIC0gMV0ubmFtZTsKKwkJc2NbaV0ubG9uZ19uYW1lID0gbHNfc3RhY2tbbHNfZGVwdGggLSBpIC0gMV0ubG9uZ19uYW1lOworCQlzY1tpXS5saW5lID0gbHNfc3RhY2tbbHNfZGVwdGggLSBpIC0gMV0ubHMubGluZSAtIDE7CisJfQorCXNjW2xzX2RlcHRoXS5saW5lID0gLTE7CisJcmV0dXJuIHNjOworfQorCisvKgorICogaW5pdF9sZXhlcl9tb2RlKCkgaXMgdXNlZCB0byBlbmQgaW5pdGlhbGl6YXRpb24gb2YgYSBzdHJ1Y3QgbGV4ZXJfc3RhdGUKKyAqIGlmIGl0IG11c3QgYmUgdXNlZCBmb3IgYSBsZXhlcgorICovCit2b2lkIGluaXRfbGV4ZXJfbW9kZShzdHJ1Y3QgbGV4ZXJfc3RhdGUgKmxzKQoreworCWxzLT5mbGFncyA9IERFRkFVTFRfTEVYRVJfRkxBR1M7CisJbHMtPm91dHB1dF9maWZvID0gZ2V0bWVtKHNpemVvZihzdHJ1Y3QgdG9rZW5fZmlmbykpOworCWxzLT5vdXRwdXRfZmlmby0+YXJ0ID0gbHMtPm91dHB1dF9maWZvLT5udCA9IDA7CisJbHMtPnRvcGxldmVsX29mID0gbHMtPm91dHB1dF9maWZvOworCWxzLT5zYXZlX2N0b2sgPSBscy0+Y3RvazsKK30KKworLyoKKyAqIHJlbGVhc2UgbWVtb3J5IHVzZWQgYnkgYSBzdHJ1Y3QgbGV4ZXJfc3RhdGUKKyAqLwordm9pZCBmcmVlX2xleGVyX3N0YXRlKHN0cnVjdCBsZXhlcl9zdGF0ZSAqbHMpCit7CisjaWZuZGVmIE5PX1VDUFBfQlVGCisJaWYgKGxzLT5pbnB1dF9idWYpIGZyZWVtZW0obHMtPmlucHV0X2J1Zik7CisJaWYgKGxzLT5vdXRwdXRfYnVmKSBmcmVlbWVtKGxzLT5vdXRwdXRfYnVmKTsKKyNlbmRpZgorCWZyZWVtZW0obHMtPmN0b2stPm5hbWUpOworCWZyZWVtZW0obHMtPmN0b2spOworCWlmICghKGxzLT5mbGFncyAmIExFWEVSKSkgZ2FyYmFnZV9jb2xsZWN0KGxzLT5nZik7CisJZnJlZW1lbShscy0+Z2YpOworfQorCisvKgorICogUHJpbnQgbGluZSBpbmZvcm1hdGlvbi4KKyAqLworc3RhdGljIHZvaWQgcHJpbnRfbGluZV9pbmZvKHN0cnVjdCBsZXhlcl9zdGF0ZSAqbHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJY2hhciAqZm4gPSBjdXJyZW50X2xvbmdfZmlsZW5hbWUgPworCQljdXJyZW50X2xvbmdfZmlsZW5hbWUgOiBjdXJyZW50X2ZpbGVuYW1lOworCWNoYXIgKmIsICpkOworCisJYiA9IGdldG1lbSg1MCArIHN0cmxlbihmbikpOworCWlmIChmbGFncyAmIEdDQ19MSU5FX05VTSkgeworCQlzcHJpbnRmKGIsICIjICVsZCBcIiVzXCJcbiIsIGxzLT5saW5lLCBmbik7CisJfSBlbHNlIHsKKwkJc3ByaW50ZihiLCAiI2xpbmUgJWxkIFwiJXNcIlxuIiwgbHMtPmxpbmUsIGZuKTsKKwl9CisJZm9yIChkID0gYjsgKmQ7IGQgKyspIHB1dF9jaGFyKGxzLCAodW5zaWduZWQgY2hhcikoKmQpKTsKKwlmcmVlbWVtKGIpOworfQorCisvKgorICogRW50ZXIgYSBmaWxlOyB0aGlzIGltcGxpZXMgdGhlIHBvc3NpYmxlIGVtaXNzaW9uIG9mIGEgI2xpbmUgZGlyZWN0aXZlLgorICogVGhlIGZsYWdzIHVzZWQgYXJlIHBhc3NlZCBhcyBzZWNvbmQgcGFyYW1ldGVyIGluc3RlYWQgb2YgYmVpbmcKKyAqIGV4dHJhY3RlZCBmcm9tIHRoZSBzdHJ1Y3QgbGV4ZXJfc3RhdGUuCisgKgorICogQXMgYSBjb21tYW5kLWxpbmUgb3B0aW9uLCBnY2MtbGlrZSBkaXJlY3RpdmVzICh3aXRoIG9ubHkgYSAnIycsCisgKiB3aXRob3V0ICdsaW5lJykgbWF5IGJlIHByb2R1Y2VkLgorICovCit2b2lkIGVudGVyX2ZpbGUoc3RydWN0IGxleGVyX3N0YXRlICpscywgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwljaGFyICpmbiA9IGN1cnJlbnRfbG9uZ19maWxlbmFtZSA/CisJCWN1cnJlbnRfbG9uZ19maWxlbmFtZSA6IGN1cnJlbnRfZmlsZW5hbWU7CisKKwlpZiAoIShmbGFncyAmIExJTkVfTlVNKSkgcmV0dXJuOworCWlmICgoZmxhZ3MgJiBMRVhFUikgJiYgIShmbGFncyAmIFRFWFRfT1VUUFVUKSkgeworCQlzdHJ1Y3QgdG9rZW4gdDsKKworCQl0LnR5cGUgPSBDT05URVhUOworCQl0LmxpbmUgPSBscy0+bGluZTsKKwkJdC5uYW1lID0gZm47CisJCXByaW50X3Rva2VuKGxzLCAmdCwgMCk7CisJCXJldHVybjsKKwl9CisJcHJpbnRfbGluZV9pbmZvKGxzLCBmbGFncyk7CisJbHMtPm9saW5lIC0tOwkvKiBlbWl0dGVkICNsaW5lIHRyb3VibGVkIG9saW5lICovCit9CisKKyNpZmRlZiBVQ1BQX01NQVAKKy8qCisgKiBXZSBvcGVuKCkgdGhlIGZpbGUsIHRoZW4gZmRvcGVuKCkgaXQgYW5kIGZzZWVrKCkgdG8gaXRzIGVuZC4gSWYgdGhlCisgKiBmc2VlaygpIHdvcmtlZCwgd2UgdHJ5IHRvIG1tYXAoKSB0aGUgZmlsZSwgdXAgdG8gdGhlIHBvaW50IHdoZXJlIHdlCisgKiBhcnJpdmVkLgorICogT24gYW4gYXJjaGl0ZWN0dXJlIHdoZXJlIGVuZC1vZi1saW5lcyBhcmUgbXVsdGlieXRlcyBhbmQgdHJhbnNsYXRlZAorICogaW50byBzaW5nbGUgJ1xuJywgYmFkIHRoaW5ncyBjb3VsZCBoYXBwZW4uIFdlIHN0cm9uZ2x5IGhvcGUgdGhhdCwgaWYKKyAqIHdlIGNvdWxkIGZzZWVrKCkgdG8gdGhlIGVuZCBidXQgY291bGQgbm90IG1tYXAoKSwgdGhlbiB3ZSBjYW4gZ2V0IGJhY2suCisgKi8KK3N0YXRpYyB2b2lkICpmaW5kX2ZpbGVfbWFwOworc3RhdGljIHNpemVfdCBtYXBfbGVuZ3RoOworCitGSUxFICpmb3Blbl9tbWFwX2ZpbGUoY2hhciAqbmFtZSkKK3sKKwlGSUxFICpmOworCWludCBmZDsKKwlsb25nIGw7CisKKwlmaW5kX2ZpbGVfbWFwID0gMDsKKwlmZCA9IG9wZW4obmFtZSwgT19SRE9OTFksIDApOworCWlmIChmZCA8IDApIHJldHVybiAwOworCWwgPSBsc2VlayhmZCwgMCwgU0VFS19FTkQpOworCWYgPSBmZG9wZW4oZmQsICJyIik7CisJaWYgKCFmKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChsIDwgMCkgcmV0dXJuIGY7CS8qIG5vdCBzZWVrYWJsZSAqLworCW1hcF9sZW5ndGggPSBsOworCWlmICgoZmluZF9maWxlX21hcCA9IG1tYXAoMCwgbWFwX2xlbmd0aCwgUFJPVF9SRUFELAorCQlNQVBfUFJJVkFURSwgZmQsIDApKSA9PSBNQVBfRkFJTEVEKSB7CisJCS8qIHdlIGNvdWxkIG5vdCBtbWFwKCkgdGhlIGZpbGU7IGdldCBiYWNrICovCisJCWZpbmRfZmlsZV9tYXAgPSAwOworCQlpZiAoZnNlZWsoZiwgMCwgU0VFS19TRVQpKSB7CisJCQkvKiBid2FhaC4uLiBjYW4ndCBnZXQgYmFjay4gVGhpcyBmaWxlIGlzIGN1cnNlZC4gKi8KKwkJCWZjbG9zZShmKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiBmOworfQorCit2b2lkIHNldF9pbnB1dF9maWxlKHN0cnVjdCBsZXhlcl9zdGF0ZSAqbHMsIEZJTEUgKmYpCit7CisJbHMtPmlucHV0ID0gZjsKKwlpZiAoZmluZF9maWxlX21hcCkgeworCQlscy0+ZnJvbV9tbWFwID0gMTsKKwkJbHMtPmlucHV0X2J1Zl9zYXYgPSBscy0+aW5wdXRfYnVmOworCQlscy0+aW5wdXRfYnVmID0gZmluZF9maWxlX21hcDsKKwkJbHMtPnBidWYgPSAwOworCQlscy0+ZWJ1ZiA9IG1hcF9sZW5ndGg7CisJfSBlbHNlIHsKKwkJbHMtPmZyb21fbW1hcCA9IDA7CisJfQorfQorI2VuZGlmCisKKy8qCisgKiBGaW5kIGEgZmlsZSBieSBsb29raW5nIHRocm91Z2ggdGhlIGluY2x1ZGUgcGF0aC4KKyAqIHJldHVybiB2YWx1ZTogYSBGSUxFICogb24gdGhlIGZpbGUsIG9wZW5lZCBpbiAiciIgbW9kZSwgb3IgMC4KKyAqCisgKiBmaW5kX2ZpbGVfZXJyb3Igd2lsbCBjb250YWluOgorICogICBGRl9FUlJPUiAgICAgIG9uIGVycm9yIChmaWxlIG5vdCBmb3VuZCBvciBpbXBvc3NpYmxlIHRvIHJlYWQpCisgKiAgIEZGX1BST1RFQ1QgICAgZmlsZSBpcyBwcm90ZWN0ZWQgYW5kIHRoZXJlZm9yZSB1c2VsZXNzIHRvIHJlYWQKKyAqICAgRkZfS05PV04gICAgICBmaWxlIGlzIGFscmVhZHkga25vd24KKyAqICAgRkZfVU5LTk9XTiAgICBmaWxlIHdhcyBub3QgYWxyZWFkeSBrbm93bgorICovCitzdGF0aWMgaW50IGZpbmRfZmlsZV9lcnJvcjsKKworZW51bSB7IEZGX0VSUk9SLCBGRl9QUk9URUNULCBGRl9LTk9XTiwgRkZfVU5LTk9XTiB9OworCitzdGF0aWMgRklMRSAqZmluZF9maWxlKGNoYXIgKm5hbWUsIGludCBsb2NhbGRpcikKK3sKKwlGSUxFICpmOworCWludCBpLCBpbmNkaXIgPSAtMTsKKwlzaXplX3QgbmwgPSBzdHJsZW4obmFtZSk7CisJY2hhciAqcyA9IDA7CisJc3RydWN0IGZvdW5kX2ZpbGUgKmZmID0gMDsKKwlpbnQgbGYgPSAwOworCisJZmluZF9maWxlX2Vycm9yID0gRkZfRVJST1I7CisJcHJvdGVjdF9kZXRlY3Quc3RhdGUgPSAtMTsKKwlwcm90ZWN0X2RldGVjdC5tYWNybyA9IDA7CisJaWYgKGxvY2FsZGlyKSB7CisJCWludCBpOworCQljaGFyICpyZm4gPSBjdXJyZW50X2xvbmdfZmlsZW5hbWUgPyBjdXJyZW50X2xvbmdfZmlsZW5hbWUKKwkJCTogY3VycmVudF9maWxlbmFtZTsKKworCQlmb3IgKGkgPSBzdHJsZW4ocmZuKSAtIDE7IGkgPj0gMDsgaSAtLSkKKyNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKEFUQVJJKSB8fCBkZWZpbmVkKF9XSU4zMikKKwkJCWlmIChyZm5baV0gPT0gJ1xcJykgYnJlYWs7CisjZWxpZiBkZWZpbmVkIEFNSUdBCisJCQlpZiAocmZuW2ldID09ICcvJyB8fCByZm5baV0gPT0gJzonKSBicmVhazsKKyNlbHNlCisJCQlpZiAocmZuW2ldID09ICcvJykgYnJlYWs7CisjZW5kaWYKKworI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoQVRBUkkpIHx8IGRlZmluZWQoX1dJTjMyKQorCQlpZiAoaSA+PSAwICYmICpuYW1lICE9ICdcXCcgJiYgKG5sIDwgMiB8fCBuYW1lWzFdICE9ICc6JykpCisjZWxpZiBkZWZpbmVkIEFNSUdBCisJCWlmIChpID49IDAgJiYgc3RyY2hyKG5hbWUsJzonKSA9PSAwKQorI2Vsc2UKKwkJaWYgKGkgPj0gMCAmJiAqbmFtZSAhPSAnLycpCisjZW5kaWYKKwkJeworCQkJLyoKKwkJCSAqIGN1cnJlbnQgZmlsZSBpcyBzb21ld2hlcmUgZWxzZSwgYW5kIHRoZSBwcm92aWRlZAorCQkJICogZmlsZSBuYW1lIGlzIG5vdCBhYnNvbHV0ZSwgc28gd2UgbXVzdCBhZGp1c3QgdGhlCisJCQkgKiBiYXNlIGZvciBsb29raW5nIGZvciB0aGUgZmlsZTsgYmVzaWRlcywKKwkJCSAqIGZvdW5kX2ZpbGVzIGFuZCBmb3VuZF9maWxlc19sb2MgYXJlIGlycmVsZXZhbnQKKwkJCSAqIGZvciB0aGlzIHNlYXJjaC4KKwkJCSAqLworCQkJcyA9IGdldG1lbShpICsgMiArIG5sKTsKKwkJCW1tdihzLCByZm4sIGkgKyAxKTsKKwkJCW1tdihzICsgaSArIDEsIG5hbWUsIG5sKTsKKwkJCXNbaSArIDEgKyBubF0gPSAwOworCQkJZmYgPSBnZXRIVChmb3VuZF9maWxlc19sb2MsICZzKTsKKwkJfSBlbHNlIGZmID0gZ2V0SFQoZm91bmRfZmlsZXNfbG9jLCAmbmFtZSk7CisKKwkJaWYgKCFmZikgeworI2lmZGVmIFVDUFBfTU1BUAorCQkJaWYgKGYgPSBmb3Blbl9tbWFwX2ZpbGUocyA/IHMgOiBuYW1lKSkgeworI2Vsc2UKKwkJCWlmIChmID0gZm9wZW4ocyA/IHMgOiBuYW1lLCAiciIpKSB7CisjZW5kaWYKKwkJCQlsZiA9IDE7CisJCQkJcHJvdGVjdF9kZXRlY3QuZmYgPSBuZXdfZm91bmRfZmlsZSgpOworCQkJCWdvdG8gZm91bmRfZmlsZTsKKwkJCX0KKwkJfQorCX0KKworCWlmICghZmYpIGZmID0gZ2V0SFQoZm91bmRfZmlsZXMsIHMgPyAmcyA6ICZuYW1lKTsKKwlpZiAoZmYpIHsKKwkJaWYgKGZmLT5wcm90ZWN0ICYmIGdldF9tYWNybyhmZi0+cHJvdGVjdCkpIHsKKwkJCS8qIGZpbGUgaXMgcHJvdGVjdGVkLCBkbyBub3QgaW5jbHVkZSBpdCAqLworCQkJZmluZF9maWxlX2Vycm9yID0gRkZfUFJPVEVDVDsKKwkJCXJldHVybiAwOworCQl9CisJCXByb3RlY3RfZGV0ZWN0LmZmID0gZmY7CisjaWZkZWYgVUNQUF9NTUFQCisJCWYgPSBmb3Blbl9tbWFwX2ZpbGUoZmYtPmxvbmdfbmFtZSk7CisjZWxzZQorCQlmID0gZm9wZW4oZmYtPmxvbmdfbmFtZSwgInIiKTsKKyNlbmRpZgorCQlpZiAoIWYpIHJldHVybiAwOworCQlnb3RvIGZvdW5kX2ZpbGVfMjsKKwl9IGVsc2UgeworCQlwcm90ZWN0X2RldGVjdC5mZiA9IG5ld19mb3VuZF9maWxlKCk7CisJfQorCS8qCisJICogVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBmaW5kIHRoZSBmaWxlLCBvciBpdCB3YXMgbm90IHByb3RlY3RlZC4KKwkgKi8KKwlpZiAocykgZnJlZW1lbShzKTsKKwlmb3IgKGkgPSAwOyBpIDwgaW5jbHVkZV9wYXRoX25iOyBpICsrKSB7CisJCXNpemVfdCBuaSA9IHN0cmxlbihpbmNsdWRlX3BhdGhbaV0pOworCisJCXMgPSBnZXRtZW0obmkgKyBubCArIDIpOworCQltbXYocywgaW5jbHVkZV9wYXRoW2ldLCBuaSk7CisjaWZkZWYgQU1JR0EKKwkJLyogY29udHJpYnV0ZWQgYnkgVm9sa2VyIEJhcnRoZWxtYW5uICovCisJCWlmIChuaSA+IDAgJiYgc1tuaSAtIDFdICE9ICc6JyAmJiBzW25pIC0gMV0gIT0gJy8nKSB7CisJCQlzW25pXSA9ICcvJzsKKwkJCW1tdihzICsgbmkgKyAxLCBuYW1lLCBubCArIDEpOworCQl9IGVsc2UgeworCQkJbW12KHMgKyBuaSwgbmFtZSwgbmwgKyAxKTsKKwkJfQorI2Vsc2UKKwkJc1tuaV0gPSAnLyc7CisJCW1tdihzICsgbmkgKyAxLCBuYW1lLCBubCArIDEpOworI2VuZGlmCisJCWluY2RpciA9IGk7CisjaWZkZWYgVUNQUF9NTUFQCisJCWYgPSBmb3Blbl9tbWFwX2ZpbGUocyk7CisjZWxzZQorCQlmID0gZm9wZW4ocywgInIiKTsKKyNlbmRpZgorCQlpZiAoZikgZ290byBmb3VuZF9maWxlOworCQlmcmVlbWVtKHMpOworCX0KKwlyZXR1cm4gMDsKK2ZvdW5kX2ZpbGU6CisJaWYgKGYgJiYgKChlbWl0X2RlcGVuZGVuY2llcyA9PSAxICYmIGxmKQorCQl8fCBlbWl0X2RlcGVuZGVuY2llcyA9PSAyKSkgeworCQlmcHJpbnRmKGVtaXRfb3V0cHV0LCAiICVzIiwgcyA/IHMgOiBuYW1lKTsKKwl9CisJaWYgKCFmZikgeworCQlzdHJ1Y3QgZm91bmRfZmlsZSAqbmZmID0gcHJvdGVjdF9kZXRlY3QuZmY7CisKKwkJbmZmLT5uYW1lID0gc2R1cChuYW1lKTsKKwkJbmZmLT5sb25nX25hbWUgPSBzID8gcyA6IHNkdXAobmFtZSk7CisJCW5mZi0+aW5jZGlyID0gaW5jZGlyOworI2lmIDAKKwkJcHV0SFQobGYgPyBmb3VuZF9maWxlc19sb2MgOiBmb3VuZF9maWxlcywgbmZmKTsKKyNlbmRpZgorCQlzID0gMDsKKwkJZmluZF9maWxlX2Vycm9yID0gRkZfVU5LTk9XTjsKKwkJZmYgPSBuZmY7CisJfSBlbHNlIGZpbmRfZmlsZV9lcnJvciA9IEZGX0tOT1dOOworZm91bmRfZmlsZV8yOgorCWlmIChzKSBmcmVlbWVtKHMpOworCWN1cnJlbnRfbG9uZ19maWxlbmFtZSA9IGZmLT5sb25nX25hbWU7CisjaWZkZWYgTk9fTElCQ19CVUYKKwlzZXRidWYoZiwgMCk7CisjZW5kaWYKKwljdXJyZW50X2luY2RpciA9IGZmLT5pbmNkaXI7CisJcmV0dXJuIGY7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBuYW1lZCBmaWxlIGJ5IGxvb2tpbmcgdGhyb3VnaCB0aGUgZW5kIG9mIHRoZSBpbmNsdWRlIHBhdGguCisgKiBUaGlzIG9uZSBpcyBub3QgYXMgb3B0aW1pemVkIGFzIGZpbmRfZmlsZSgpIHNpbmNlIGl0IGlzIHJhcmVseSB1c2VkLgorICovCitzdGF0aWMgRklMRSAqZmluZF9maWxlX25leHQoY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsKKwlzaXplX3QgbmwgPSBzdHJsZW4obmFtZSk7CisJRklMRSAqZjsKKworCWZvciAoaSA9IGN1cnJlbnRfaW5jZGlyICsgMTsgaSA8IGluY2x1ZGVfcGF0aF9uYjsgaSArKykgeworCQljaGFyICpzOworCQlzaXplX3QgbmkgPSBzdHJsZW4oaW5jbHVkZV9wYXRoW2ldKTsKKworCQlzID0gZ2V0bWVtKG5pICsgbmwgKyAyKTsKKwkJbW12KHMsIGluY2x1ZGVfcGF0aFtpXSwgbmkpOworI2lmZGVmIEFNSUdBCisJCS8qIGNvbnRyaWJ1dGVkIGJ5IFZvbGtlciBCYXJ0aGVsbWFubiAqLworCQlpZiAobmkgPiAwICYmIHNbbmkgLSAxXSAhPSAnOicgJiYgc1tuaSAtIDFdICE9ICcvJykgeworCQkJc1tuaV0gPSAnLyc7CisJCQltbXYocyArIG5pICsgMSwgbmFtZSwgbmwgKyAxKTsKKwkJfSBlbHNlIHsKKwkJCW1tdihzICsgbmksIG5hbWUsIG5sICsgMSk7CisJCX0KKyNlbHNlCisJCXNbbmldID0gJy8nOworCQltbXYocyArIG5pICsgMSwgbmFtZSwgbmwgKyAxKTsKKyNlbmRpZgorCisjaWZkZWYgVUNQUF9NTUFQCisJCWYgPSBmb3Blbl9tbWFwX2ZpbGUocyk7CisjZWxzZQorCQlmID0gZm9wZW4ocywgInIiKTsKKyNlbmRpZgorCQlpZiAoZikgeworCQkJaWYgKGVtaXRfZGVwZW5kZW5jaWVzID09IDIpIHsKKwkJCQlmcHJpbnRmKGVtaXRfb3V0cHV0LCAiICVzIiwgcyA/IHMgOiBuYW1lKTsKKwkJCX0KKwkJCWN1cnJlbnRfbG9uZ19maWxlbmFtZSA9IHM7CisJCQljdXJyZW50X2luY2RpciA9IGk7CisJCQlyZXR1cm4gZjsKKwkJfQorCQlmcmVlbWVtKHMpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZSAjaWYgZGlyZWN0aXZlLiBUaGlzIGZ1bmN0aW9uIHBhcnNlIHRoZSBleHByZXNzaW9uLCBwZXJmb3JtcyBtYWNybworICogZXhwYW5zaW9uIChhbmQgaGFuZGxlcyB0aGUgImRlZmluZWQiIG9wZXJhdG9yKSwgYW5kIGNhbGwgZXZhbF9leHByLgorICogcmV0dXJuIHZhbHVlOiAxIGlmIHRoZSBleHByZXNzaW9uIGlzIHRydWUsIDAgaWYgaXQgaXMgZmFsc2UsIC0xIG9uIGVycm9yLgorICovCitzdGF0aWMgaW50IGhhbmRsZV9pZihzdHJ1Y3QgbGV4ZXJfc3RhdGUgKmxzKQoreworCXN0cnVjdCB0b2tlbl9maWZvIHRmLCB0ZjEsIHRmMiwgdGYzLCAqc2F2ZV90ZjsKKwlsb25nIGwgPSBscy0+bGluZTsKKwl1bnNpZ25lZCBsb25nIHo7CisJaW50IHJldCA9IDAsIGx0d3cgPSAxOworCisJLyogZmlyc3QsIGdldCB0aGUgd2hvbGUgbGluZSAqLworCXRmLmFydCA9IHRmLm50ID0gMDsKKwl3aGlsZSAoIW5leHRfdG9rZW4obHMpICYmIGxzLT5jdG9rLT50eXBlICE9IE5FV0xJTkUpIHsKKwkJc3RydWN0IHRva2VuIHQ7CisKKwkJaWYgKGx0d3cgJiYgdHRNV1MobHMtPmN0b2stPnR5cGUpKSBjb250aW51ZTsKKwkJbHR3dyA9IHR0TVdTKGxzLT5jdG9rLT50eXBlKTsKKwkJdC50eXBlID0gbHMtPmN0b2stPnR5cGU7CisJCXQubGluZSA9IGw7CisJCWlmIChTX1RPS0VOKGxzLT5jdG9rLT50eXBlKSkgeworCQkJdC5uYW1lID0gc2R1cChscy0+Y3Rvay0+bmFtZSk7CisJCQl0aHJvd19hd2F5KGxzLT5nZiwgdC5uYW1lKTsKKwkJfQorCQlhb2wodGYudCwgdGYubnQsIHQsIFRPS0VOX0xJU1RfTUVNRyk7CisJfQorCWlmIChsdHd3ICYmIHRmLm50KSBpZiAoKC0tIHRmLm50KSA9PSAwKSBmcmVlbWVtKHRmLnQpOworCWlmICh0Zi5udCA9PSAwKSB7CisJCWVycm9yKGwsICJ2b2lkIGNvbmRpdGlvbiBmb3IgYSAjaWYvI2VsaWYiKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvKiBoYW5kbGUgdGhlICJkZWZpbmVkIiBvcGVyYXRvciAqLworCXRmMS5hcnQgPSB0ZjEubnQgPSAwOworCXdoaWxlICh0Zi5hcnQgPCB0Zi5udCkgeworCQlzdHJ1Y3QgdG9rZW4gKmN0LCBydDsKKwkJc3RydWN0IG1hY3JvICptOworCQlzaXplX3QgbmlkeCwgZWlkeDsKKworCQljdCA9IHRmLnQgKyAodGYuYXJ0ICsrKTsKKwkJaWYgKGN0LT50eXBlID09IE5BTUUgJiYgIXN0cmNtcChjdC0+bmFtZSwgImRlZmluZWQiKSkgeworCQkJaWYgKHRmLmFydCA+PSB0Zi5udCkgZ290byBzdG9yZV90b2tlbjsKKwkJCW5pZHggPSB0Zi5hcnQ7CisJCQlpZiAodHRNV1ModGYudFtuaWR4XS50eXBlKSkKKwkJCSAgaWYgKCsrIG5pZHggPj0gdGYubnQpIGdvdG8gc3RvcmVfdG9rZW47CisJCQlpZiAodGYudFtuaWR4XS50eXBlID09IE5BTUUpIHsKKwkJCQllaWR4ID0gbmlkeDsKKwkJCQlnb3RvIGNoZWNrX21hY3JvOworCQkJfQorCQkJaWYgKHRmLnRbbmlkeF0udHlwZSAhPSBMUEFSKSB7CisjaWZkZWYgSEFWRV9NSVNSQQorCQkJCW1pc3JhX25ldSgxMDAsMTksMTQsMCk7CisjZW5kaWYKKwkJCQlnb3RvIHN0b3JlX3Rva2VuO30KKwkJCWlmICgrKyBuaWR4ID49IHRmLm50KSBnb3RvIHN0b3JlX3Rva2VuOworCQkJaWYgKHR0TVdTKHRmLnRbbmlkeF0udHlwZSkpCisJCQkJaWYgKCsrIG5pZHggPj0gdGYubnQpIGdvdG8gc3RvcmVfdG9rZW47CisJCQlpZiAodGYudFtuaWR4XS50eXBlICE9IE5BTUUpIHsKKyNpZmRlZiBIQVZFX01JU1JBCisJCQkJbWlzcmFfbmV1KDEwMCwxOSwxNCwwKTsKKyNlbmRpZgorCQkJCWdvdG8gc3RvcmVfdG9rZW47fQorCQkJZWlkeCA9IG5pZHggKyAxOworCQkJaWYgKGVpZHggPj0gdGYubnQpIGdvdG8gc3RvcmVfdG9rZW47CisJCQlpZiAodHRNV1ModGYudFtlaWR4XS50eXBlKSkKKwkJCQlpZiAoKysgZWlkeCA+PSB0Zi5udCkgZ290byBzdG9yZV90b2tlbjsKKwkJCWlmICh0Zi50W2VpZHhdLnR5cGUgIT0gUlBBUikgZ290byBzdG9yZV90b2tlbjsKKwkJCWdvdG8gY2hlY2tfbWFjcm87CisJCX0KKwlzdG9yZV90b2tlbjoKKwkJYW9sKHRmMS50LCB0ZjEubnQsICpjdCwgVE9LRU5fTElTVF9NRU1HKTsKKwkJY29udGludWU7CisKKwljaGVja19tYWNybzoKKwkJbSA9IGdldF9tYWNybyh0Zi50W25pZHhdLm5hbWUpOworCQlydC50eXBlID0gTlVNQkVSOworCQlydC5uYW1lID0gbSA/ICIxTCIgOiAiMEwiOworCQlhb2wodGYxLnQsIHRmMS5udCwgcnQsIFRPS0VOX0xJU1RfTUVNRyk7CisJCXRmLmFydCA9IGVpZHggKyAxOworCX0KKwlmcmVlbWVtKHRmLnQpOworCWlmICh0ZjEubnQgPT0gMCkgeworCQllcnJvcihsLCAidm9pZCBjb25kaXRpb24gKGFmdGVyIGV4cGFuc2lvbikgZm9yIGEgI2lmLyNlbGlmIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBwZXJmb3JtIGFsbCBtYWNybyBzdWJzdGl0dXRpb25zICovCisJdGYyLmFydCA9IHRmMi5udCA9IDA7CisJc2F2ZV90ZiA9IGxzLT5vdXRwdXRfZmlmbzsKKwlscy0+b3V0cHV0X2ZpZm8gPSAmdGYyOworCXdoaWxlICh0ZjEuYXJ0IDwgdGYxLm50KSB7CisJCXN0cnVjdCB0b2tlbiAqY3Q7CisKKwkJY3QgPSB0ZjEudCArICh0ZjEuYXJ0ICsrKTsKKwkJaWYgKGN0LT50eXBlID09IE5BTUUpIHsKKwkJCXN0cnVjdCBtYWNybyAqbSA9IGdldF9tYWNybyhjdC0+bmFtZSk7CisKKwkJCWlmIChtKSB7CisJCQkJaWYgKHN1YnN0aXR1dGVfbWFjcm8obHMsIG0sICZ0ZjEsIDAsCisjaWZkZWYgTk9fUFJBR01BX0lOX0RJUkVDVElWRQorCQkJCQkxLAorI2Vsc2UKKwkJCQkJMCwKKyNlbmRpZgorCQkJCQljdC0+bGluZSkpIHsKKwkJCQkJbHMtPm91dHB1dF9maWZvID0gc2F2ZV90ZjsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfSBlbHNlIGlmICgoY3QtPnR5cGUgPT0gU0hBUlAgfHwgY3QtPnR5cGUgPT0gRElHX1NIQVJQKQorCQkJJiYgKGxzLT5mbGFncyAmIEhBTkRMRV9BU1NFUlRJT05TKSkgeworCQkJLyogd2UgaGF2ZSBhbiBhc3NlcnRpb247IHBhcnNlIGl0ICovCisJCQlpbnQgbm5wLCBsdHd3ID0gMTsKKwkJCXNpemVfdCBpID0gdGYxLmFydDsKKwkJCXN0cnVjdCB0b2tlbl9maWZvIGF0bDsKKwkJCWNoYXIgKmFuYW1lOworCQkJc3RydWN0IGFzc2VydCAqYTsKKwkJCWludCBhdiA9IDA7CisJCQlzdHJ1Y3QgdG9rZW4gcnQ7CisKKwkJCWF0bC5hcnQgPSBhdGwubnQgPSAwOworCQkJd2hpbGUgKGkgPCB0ZjEubnQgJiYgdHRNV1ModGYxLnRbaV0udHlwZSkpIGkgKys7CisJCQlpZiAoaSA+PSB0ZjEubnQpIGdvdG8gYXNzZXJ0X2Vycm9yOworCQkJaWYgKHRmMS50W2ldLnR5cGUgIT0gTkFNRSkgZ290byBhc3NlcnRfZXJyb3I7CisJCQlhbmFtZSA9IHRmMS50W2kgKytdLm5hbWU7CisJCQl3aGlsZSAoaSA8IHRmMS5udCAmJiB0dE1XUyh0ZjEudFtpXS50eXBlKSkgaSArKzsKKwkJCWlmIChpID49IHRmMS5udCkgZ290byBhc3NlcnRfZ2VuZXJpYzsKKwkJCWlmICh0ZjEudFtpXS50eXBlICE9IExQQVIpIGdvdG8gYXNzZXJ0X2dlbmVyaWM7CisJCQlpICsrOworCQkJZm9yIChubnAgPSAxOyBubnAgJiYgaSA8IHRmMS5udDsgaSArKykgeworCQkJCWlmIChsdHd3ICYmIHR0TVdTKHRmMS50W2ldLnR5cGUpKSBjb250aW51ZTsKKwkJCQlpZiAodGYxLnRbaV0udHlwZSA9PSBMUEFSKSBubnAgKys7CisJCQkJZWxzZSBpZiAodGYxLnRbaV0udHlwZSA9PSBSUEFSCisJCQkJCSYmICgtLSBubnApID09IDApIHsKKwkJCQkJdGYxLmFydCA9IGkgKyAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJbHR3dyA9IHR0TVdTKHRmMS50W2ldLnR5cGUpOworCQkJCWFvbChhdGwudCwgYXRsLm50LCB0ZjEudFtpXSwgVE9LRU5fTElTVF9NRU1HKTsKKwkJCX0KKwkJCWlmIChubnApIGdvdG8gYXNzZXJ0X2Vycm9yOworCQkJaWYgKGx0d3cgJiYgYXRsLm50ICYmICgtLSBhdGwubnQpID09IDApIGZyZWVtZW0oYXRsLnQpOworCQkJaWYgKGF0bC5udCA9PSAwKSBnb3RvIGFzc2VydF9lcnJvcjsKKworCQkJLyogdGhlIGFzc2VydGlvbiBpcyBpbiBhbmFtZSBhbmQgYXRsOyBjaGVjayBpdCAqLworCQkJYSA9IGdldF9hc3NlcnRpb24oYW5hbWUpOworCQkJaWYgKGEpIGZvciAoaSA9IDA7IGkgPCBhLT5uYnZhbDsgaSArKykKKwkJCQlpZiAoIWNtcF90b2tlbl9saXN0KCZhdGwsIGEtPnZhbCArIGkpKSB7CisJCQkJCWF2ID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJcnQudHlwZSA9IE5VTUJFUjsKKwkJCXJ0Lm5hbWUgPSBhdiA/ICIxIiA6ICIwIjsKKwkJCWFvbCh0ZjIudCwgdGYyLm50LCBydCwgVE9LRU5fTElTVF9NRU1HKTsKKwkJCWNvbnRpbnVlOworCisJCWFzc2VydF9nZW5lcmljOgorCQkJdGYxLmFydCA9IGk7CisJCQlydC50eXBlID0gTlVNQkVSOworCQkJcnQubmFtZSA9IGdldF9hc3NlcnRpb24oYW5hbWUpID8gIjEiIDogIjAiOworCQkJYW9sKHRmMi50LCB0ZjIubnQsIHJ0LCBUT0tFTl9MSVNUX01FTUcpOworCQkJY29udGludWU7CisKKwkJYXNzZXJ0X2Vycm9yOgorCQkJZXJyb3IobCwgInN5bnRheCBlcnJvciBmb3IgYXNzZXJ0aW9uIGluICNpZiIpOworCQkJbHMtPm91dHB1dF9maWZvID0gc2F2ZV90ZjsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlhb2wodGYyLnQsIHRmMi5udCwgKmN0LCBUT0tFTl9MSVNUX01FTUcpOworCX0KKwlscy0+b3V0cHV0X2ZpZm8gPSBzYXZlX3RmOworCWZyZWVtZW0odGYxLnQpOworCWlmICh0ZjIubnQgPT0gMCkgeworCQllcnJvcihsLCAidm9pZCBjb25kaXRpb24gKGFmdGVyIGV4cGFuc2lvbikgZm9yIGEgI2lmLyNlbGlmIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIHN1cHByZXNzIHdoaXRlc3BhY2UgYW5kIHJlcGxhY2Ugcm9ndWUgaWRlbnRpZmllcnMgYnkgMAorCSAqLworCXRmMy5hcnQgPSB0ZjMubnQgPSAwOworCXdoaWxlICh0ZjIuYXJ0IDwgdGYyLm50KSB7CisJCXN0cnVjdCB0b2tlbiAqY3QgPSB0ZjIudCArICh0ZjIuYXJ0ICsrKTsKKworCQlpZiAodHRNV1MoY3QtPnR5cGUpKSBjb250aW51ZTsKKwkJaWYgKGN0LT50eXBlID09IE5BTUUpIHsKKwkJCS8qCisJCQkgKiBhIHJvZ3VlIGlkZW50aWZpZXI7IHdlIHJlcGxhY2UgaXQgd2l0aCAiMCIuCisJCQkgKi8KKwkJCXN0cnVjdCB0b2tlbiBydDsKKyNpZmRlZiBIQVZFX01JU1JBCisJCQltaXNyYV9uZXUoOTcsMTksMTEsMCk7CisjZW5kaWYKKworCQkJcnQudHlwZSA9IE5VTUJFUjsKKwkJCXJ0Lm5hbWUgPSAiMCI7CisJCQlhb2wodGYzLnQsIHRmMy5udCwgcnQsIFRPS0VOX0xJU1RfTUVNRyk7CisJCQljb250aW51ZTsKKwkJfQorCQlhb2wodGYzLnQsIHRmMy5udCwgKmN0LCBUT0tFTl9MSVNUX01FTUcpOworCX0KKwlmcmVlbWVtKHRmMi50KTsKKworCWlmICh0ZjMubnQgPT0gMCkgeworCQllcnJvcihsLCAidm9pZCBjb25kaXRpb24gKGFmdGVyIGV4cGFuc2lvbikgZm9yIGEgI2lmLyNlbGlmIik7CisJCXJldHVybiAtMTsKKwl9CisJZXZhbF9saW5lID0gbDsKKwl6ID0gZXZhbF9leHByKCZ0ZjMsICZyZXQsIChscy0+ZmxhZ3MgJiBXQVJOX1NUQU5EQVJEKSAhPSAwKTsKKwlmcmVlbWVtKHRmMy50KTsKKwlpZiAocmV0KSByZXR1cm4gLTE7CisJcmV0dXJuICh6ICE9IDApOworfQorCisvKgorICogQSAjaW5jbHVkZSB3YXMgZm91bmQ7IHBhcnNlIHRoZSBlbmQgb2YgbGluZSwgcmVwbGFjZSBtYWNyb3MgaWYKKyAqIG5lY2Vzc2FyeS4KKyAqCisgKiBJZiBuZXggaXMgc2V0IHRvIG5vbi16ZXJvLCB0aGUgZGlyZWN0aXZlIGlzIGNvbnNpZGVyZWQgYXMgYSAjaW5jbHVkZV9uZXh0CisgKiAoZXh0ZW5zaW9uIHRvIEM5OSkKKyAqLworc3RhdGljIGludCBoYW5kbGVfaW5jbHVkZShzdHJ1Y3QgbGV4ZXJfc3RhdGUgKmxzLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgbmV4KQoreworCWludCBjLCBzdHJpbmdfZm5hbWUgPSAwOworCWNoYXIgKmZuYW1lOworCXNpemVfdCBmbmFtZV9wdHIgPSAwOworCWxvbmcgbCA9IGxzLT5saW5lOworCWludCB4LCB5OworCUZJTEUgKmY7CisJc3RydWN0IHRva2VuX2ZpZm8gdGYsIHRmMiwgKnNhdmVfdGY7CisJc2l6ZV90IG5sOworCWludCB0Z2Q7CisKKyNkZWZpbmUgbGVmdF9hbmdsZSh0KQkoKHQpID09IExUIHx8ICh0KSA9PSBMRVEgfHwgKHQpID09IExTSCBcCisJCQl8fCAodCkgPT0gQVNMU0ggfHwgKHQpID09IERJR19MQlJLIHx8ICh0KSA9PSBMQlJBKQorI2RlZmluZSByaWdodF9hbmdsZSh0KQkoKHQpID09IEdUIHx8ICh0KSA9PSBSU0ggfHwgKHQpID09IEFSUk9XIFwKKwkJCXx8ICh0KSA9PSBESUdfUkJSSyB8fCAodCkgPT0gRElHX1JCUkEpCisKKyNpZmRlZiBIQVZFX01JU1JBCisJZXh0ZXJuIGludCBtaXNyYWNoZWNrLG1pc3JhdG9rOworCisJaWYobWlzcmFjaGVjayYmbWlzcmF0b2spIG1pc3JhX25ldSg4NywxOSwxLDApOworI2VuZGlmCisJdGYudD0wOyAvKnZiKi8KKwl3aGlsZSAoKGMgPSBncmFwX2NoYXIobHMpKSA+PSAwICYmIGMgIT0gJ1xuJykgeworCQlpZiAoc3BhY2VfY2hhcihjKSkgeworCQkJZGlzY2FyZF9jaGFyKGxzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID09ICc8JykgeworCQkJZGlzY2FyZF9jaGFyKGxzKTsKKwkJCXdoaWxlICgoYyA9IGdyYXBfY2hhcihscykpID49IDApIHsKKwkJCQlkaXNjYXJkX2NoYXIobHMpOworCQkJCWlmIChjID09ICdcbicpIGdvdG8gaW5jbHVkZV9lcnJvcjsKKwkJCQlpZiAoYyA9PSAnPicpIGJyZWFrOworCQkJCWFvbChmbmFtZSwgZm5hbWVfcHRyLCAoY2hhciljLCBGTkFNRV9NRU1HKTsKKwkJCX0KKwkJCWFvbChmbmFtZSwgZm5hbWVfcHRyLCAoY2hhcikwLCBGTkFNRV9NRU1HKTsKKwkJCXN0cmluZ19mbmFtZSA9IDA7CisJCQlnb3RvIGRvX2luY2x1ZGU7CisJCX0gZWxzZSBpZiAoYyA9PSAnIicpIHsKKwkJCWRpc2NhcmRfY2hhcihscyk7CisJCQl3aGlsZSAoKGMgPSBncmFwX2NoYXIobHMpKSA+PSAwKSB7CisJCQkJZGlzY2FyZF9jaGFyKGxzKTsKKwkJCQlpZiAoYyA9PSAnXG4nKSBnb3RvIGluY2x1ZGVfZXJyb3I7CisJCQkJaWYgKGMgPT0gJyInKSBicmVhazsKKwkJCQlhb2woZm5hbWUsIGZuYW1lX3B0ciwgKGNoYXIpYywgRk5BTUVfTUVNRyk7CisJCQl9CisJCQlhb2woZm5hbWUsIGZuYW1lX3B0ciwgKGNoYXIpMCwgRk5BTUVfTUVNRyk7CisJCQlzdHJpbmdfZm5hbWUgPSAxOworCQkJZ290byBkb19pbmNsdWRlOworCQl9CisJCWdvdG8gaW5jbHVkZV9tYWNybzsKKwl9CisKK2luY2x1ZGVfZXJyb3I6CisJZXJyb3IobCwgImludmFsaWQgJyNpbmNsdWRlJyIpOworCXJldHVybiAxOworCitpbmNsdWRlX21hY3JvOgorI2lmZGVmIEhBVkVfTUlTUkEKKwltaXNyYSg5MCk7CisjZW5kaWYKKwl0Zi5hcnQgPSB0Zi5udCA9IDA7CisJd2hpbGUgKCFuZXh0X3Rva2VuKGxzKSAmJiBscy0+Y3Rvay0+dHlwZSAhPSBORVdMSU5FKSB7CisJCWlmICghdHRNV1MobHMtPmN0b2stPnR5cGUpKSB7CisJCQlzdHJ1Y3QgdG9rZW4gdDsKKworCQkJdC50eXBlID0gbHMtPmN0b2stPnR5cGU7CisJCQl0LmxpbmUgPSBsOworCQkJaWYgKFNfVE9LRU4obHMtPmN0b2stPnR5cGUpKSB7CisJCQkJdC5uYW1lID0gc2R1cChscy0+Y3Rvay0+bmFtZSk7CisJCQkJdGhyb3dfYXdheShscy0+Z2YsIHQubmFtZSk7CisJCQl9CisJCQlhb2wodGYudCwgdGYubnQsIHQsIFRPS0VOX0xJU1RfTUVNRyk7CisJCX0KKwl9CisJdGYyLmFydCA9IHRmMi5udCA9IDA7CisJc2F2ZV90ZiA9IGxzLT5vdXRwdXRfZmlmbzsKKwlscy0+b3V0cHV0X2ZpZm8gPSAmdGYyOworCXdoaWxlICh0Zi5hcnQgPCB0Zi5udCkgeworCQlzdHJ1Y3QgdG9rZW4gKmN0OworCisJCWN0ID0gdGYudCArICh0Zi5hcnQgKyspOworCQlpZiAoY3QtPnR5cGUgPT0gTkFNRSkgeworCQkJc3RydWN0IG1hY3JvICptID0gZ2V0X21hY3JvKGN0LT5uYW1lKTsKKwkJCWlmIChtKSB7CisJCQkJaWYgKHN1YnN0aXR1dGVfbWFjcm8obHMsIG0sICZ0ZiwgMCwKKyNpZmRlZiBOT19QUkFHTUFfSU5fRElSRUNUSVZFCisJCQkJCTEsCisjZWxzZQorCQkJCQkwLAorI2VuZGlmCisJCQkJCWN0LT5saW5lKSkgeworCQkJCQlscy0+b3V0cHV0X2ZpZm8gPSBzYXZlX3RmOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWFvbCh0ZjIudCwgdGYyLm50LCAqY3QsIFRPS0VOX0xJU1RfTUVNRyk7CisJfQorCWZyZWVtZW0odGYudCk7CisJbHMtPm91dHB1dF9maWZvID0gc2F2ZV90ZjsKKwlmb3IgKHggPSAwOyB4IDwgdGYyLm50ICYmIHR0V0hJKHRmMi50W3hdLnR5cGUpOyB4ICsrKTsKKwlmb3IgKHkgPSB0ZjIubnQgLSAxOyB5ID49IDAgJiYgdHRXSEkodGYyLnRbeV0udHlwZSk7IHkgLS0pOworCWlmICh4ID49IHRmMi5udCkgZ290byBpbmNsdWRlX21hY3JvX2VycjsKKwlpZiAodGYyLnRbeF0udHlwZSA9PSBTVFJJTkcpIHsKKwkJaWYgKHkgIT0geCkgZ290byBpbmNsdWRlX21hY3JvX2VycjsKKwkJaWYgKHRmMi50W3hdLm5hbWVbMF0gPT0gJ0wnKSB7CisJCQlpZiAobHMtPmZsYWdzICYgV0FSTl9TVEFOREFSRCkKKwkJCQl3YXJuaW5nKGwsICJ3aWRlIHN0cmluZyBmb3IgI2luY2x1ZGUiKTsKKwkJCWZuYW1lID0gc2R1cCh0ZjIudFt4XS5uYW1lKTsKKwkJCW5sID0gc3RybGVuKGZuYW1lKTsKKwkJCSooZm5hbWUgKyBubCAtIDEpID0gMDsKKwkJCW1tdndvKGZuYW1lLCBmbmFtZSArIDIsIG5sIC0gMik7CisJCX0gZWxzZSB7CisJCQlmbmFtZSA9IHNkdXAodGYyLnRbeF0ubmFtZSk7CisJCQlubCA9IHN0cmxlbihmbmFtZSk7CisJCQkqKGZuYW1lICsgbmwgLSAxKSA9IDA7CisJCQltbXZ3byhmbmFtZSwgZm5hbWUgKyAxLCBubCAtIDEpOworCQl9CisJCXN0cmluZ19mbmFtZSA9IDE7CisJfSBlbHNlIGlmIChsZWZ0X2FuZ2xlKHRmMi50W3hdLnR5cGUpICYmIHJpZ2h0X2FuZ2xlKHRmMi50W3ldLnR5cGUpKSB7CisJCWludCBpLCBqOworCisJCWlmIChscy0+ZmxhZ3MgJiBXQVJOX0FOTk9ZSU5HKSB3YXJuaW5nKGwsICJyZWNvbnN0cnVjdGlvbiAiCisJCQkib2YgPGZvbz4gaW4gI2luY2x1ZGUiKTsKKwkJZm9yIChqID0gMCwgaSA9IHg7IGkgPD0geTsgaSArKykgaWYgKCF0dFdISSh0ZjIudFtpXS50eXBlKSkKKwkJCWogKz0gc3RybGVuKHRuYW1lKHRmMi50W2ldKSk7CisJCWZuYW1lID0gZ2V0bWVtKGogKyAxKTsKKwkJZm9yIChqID0gMCwgaSA9IHg7IGkgPD0geTsgaSArKykgeworCQkJaWYgKHR0V0hJKHRmMi50W2ldLnR5cGUpKSBjb250aW51ZTsKKwkJCXN0cmNweShmbmFtZSArIGosIHRuYW1lKHRmMi50W2ldKSk7CisJCQlqICs9IHN0cmxlbih0bmFtZSh0ZjIudFtpXSkpOworCQl9CisJCSooZm5hbWUgKyBqIC0gMSkgPSAwOworCQltbXZ3byhmbmFtZSwgZm5hbWUgKyAxLCBqKTsKKwkJc3RyaW5nX2ZuYW1lID0gMDsKKwl9IGVsc2UgZ290byBpbmNsdWRlX21hY3JvX2VycjsKKwlmcmVlbWVtKHRmMi50KTsKKwlnb3RvIGRvX2luY2x1ZGVfbmV4dDsKKworaW5jbHVkZV9tYWNyb19lcnI6CisJZXJyb3IobCwgIm1hY3JvIGV4cGFuc2lvbiBkaWQgbm90IHByb2R1Y2UgYSB2YWxpZCBmaWxlbmFtZSAiCisJCSJmb3IgI2luY2x1ZGUiKTsKKwlpZiAodGYyLm50KSBmcmVlbWVtKHRmMi50KTsKKwlyZXR1cm4gMTsKKworZG9faW5jbHVkZToKKwl0Z2QgPSAxOworCXdoaWxlICghbmV4dF90b2tlbihscykpIHsKKwkJaWYgKHRnZCAmJiAhdHRXSEkobHMtPmN0b2stPnR5cGUpCisJCQkmJiAobHMtPmZsYWdzICYgV0FSTl9TVEFOREFSRCkpIHsKKwkJCXdhcm5pbmcobCwgInRyYWlsaW5nIGdhcmJhZ2UgaW4gI2luY2x1ZGUiKTsKKwkJCXRnZCA9IDA7CisJCX0KKwkJaWYgKGxzLT5jdG9rLT50eXBlID09IE5FV0xJTkUpIGJyZWFrOworCX0KKworCS8qIHRoZSBpbmNyZW1lbnQgb2YgbHMtPmxpbmUgaXMgaW50ZW5kZWQgc28gdGhhdCB0aGUgbGluZQorCSAgIG51bWJlcmluZyBpcyByZXBvcnRlZCBjb3JyZWN0bHkgaW4gcmVwb3J0X2NvbnRleHQoKSBldmVuIGlmCisJICAgdGhlICNpbmNsdWRlIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgd2l0aCBubyB0cmFpbGluZyBuZXdsaW5lICovCisJaWYgKGxzLT5jdG9rLT50eXBlICE9IE5FV0xJTkUpIGxzLT5saW5lICsrOworZG9faW5jbHVkZV9uZXh0OgorCWlmICghKGxzLT5mbGFncyAmIExFWEVSKSAmJiAobHMtPmZsYWdzICYgS0VFUF9PVVRQVVQpKQorCQlwdXRfY2hhcihscywgJ1xuJyk7CisJcHVzaF9maWxlX2NvbnRleHQobHMpOworCXJlaW5pdF9sZXhlcl9zdGF0ZShscywgMSk7CisjaWZkZWYgSEFWRV9NSVNSQQorCWlmKG1pc3JhY2hlY2speworCSAgY2hhciAqcDsKKwkgIGZvcihwPWZuYW1lOypwO3ArKykKKwkgICAgaWYoKnA9PSdcJyd8fCpwPT0nXFwnfHwqcD09J1wiJ3x8KCpwPT0nLycmJnBbMV09PScqJykpCisJICAgICAgbWlzcmFfbmV1KDg4LDE5LDIsLTEpOworCX0KKyNlbmRpZgorCXsKKwkJY2hhciAqY29udl9mbmFtZSA9IGNvbnZlcnRfcGF0aChmbmFtZSk7CisJCWZyZWVtZW0oZm5hbWUpOworCQlmbmFtZSA9IGNvbnZfZm5hbWU7CisJfQorCWYgPSBuZXggPyBmaW5kX2ZpbGVfbmV4dChmbmFtZSkgOiBmaW5kX2ZpbGUoZm5hbWUsIHN0cmluZ19mbmFtZSk7CisJaWYgKCFmKSB7CisJCXBvcF9maWxlX2NvbnRleHQobHMpOworCQlpZiAoZmluZF9maWxlX2Vycm9yID09IEZGX0VSUk9SKSB7CisJCQllcnJvcihsLCAiZmlsZSAnJXMnIG5vdCBmb3VuZCIsIGZuYW1lKTsKKwkJCXJldHVybiAxOworCQl9CisJCS8qIGZpbGUgd2FzIGZvdW5kLCBidXQgaXQgaXMgdXNlbGVzcyB0byBpbmNsdWRlIGl0IGFnYWluICovCisJCXJldHVybiAwOworCX0KKyNpZmRlZiBVQ1BQX01NQVAKKwlzZXRfaW5wdXRfZmlsZShscywgZik7CisjZWxzZQorCWxzLT5pbnB1dCA9IGY7CisjZW5kaWYKKyNpZmRlZiBIQVZFX01JU1JBCisJaWYgKCFzdHJjbXAoInNpZ25hbC5oIixmbmFtZSkpIG1pc3JhX25ldSgxMjMsMjAsOCwtMSk7CisJaWYgKCFzdHJjbXAoInN0ZGlvLmgiLGZuYW1lKSkgbWlzcmFfbmV1KDEyNCwyMCw5LC0xKTsKKwlpZiAoIXN0cmNtcCgidGltZS5oIixmbmFtZSkpIG1pc3JhKDEyNywyMCwxMiwtMSk7CisjZW5kaWYKKwlzZXRfY3VycmVudF9maWxlbmFtZShmbmFtZSk7CisJaGFuZGxlX2RlcHMoY3VycmVudF9sb25nX2ZpbGVuYW1lLHN0cmluZ19mbmFtZSk7CisJZW50ZXJfZmlsZShscywgZmxhZ3MpOworCXJldHVybiAwOworCisjdW5kZWYgbGVmdF9hbmdsZQorI3VuZGVmIHJpZ2h0X2FuZ2xlCit9CisKKy8qCisgKiBmb3IgI2xpbmUgZGlyZWN0aXZlcworICovCitzdGF0aWMgaW50IGhhbmRsZV9saW5lKHN0cnVjdCBsZXhlcl9zdGF0ZSAqbHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJY2hhciAqZm5hbWU7CisJbG9uZyBsID0gbHMtPmxpbmU7CisJc3RydWN0IHRva2VuX2ZpZm8gdGYsIHRmMiwgKnNhdmVfdGY7CisJc2l6ZV90IG5sLCBqOworCXVuc2lnbmVkIGxvbmcgejsKKworCXRmLmFydCA9IHRmLm50ID0gMDsKKwl3aGlsZSAoIW5leHRfdG9rZW4obHMpICYmIGxzLT5jdG9rLT50eXBlICE9IE5FV0xJTkUpIHsKKwkJaWYgKCF0dE1XUyhscy0+Y3Rvay0+dHlwZSkpIHsKKwkJCXN0cnVjdCB0b2tlbiB0OworCisJCQl0LnR5cGUgPSBscy0+Y3Rvay0+dHlwZTsKKwkJCXQubGluZSA9IGw7CisJCQlpZiAoU19UT0tFTihscy0+Y3Rvay0+dHlwZSkpIHsKKwkJCQl0Lm5hbWUgPSBzZHVwKGxzLT5jdG9rLT5uYW1lKTsKKwkJCQl0aHJvd19hd2F5KGxzLT5nZiwgdC5uYW1lKTsKKwkJCX0KKwkJCWFvbCh0Zi50LCB0Zi5udCwgdCwgVE9LRU5fTElTVF9NRU1HKTsKKwkJfQorCX0KKwl0ZjIuYXJ0ID0gdGYyLm50ID0gMDsKKwlzYXZlX3RmID0gbHMtPm91dHB1dF9maWZvOworCWxzLT5vdXRwdXRfZmlmbyA9ICZ0ZjI7CisJd2hpbGUgKHRmLmFydCA8IHRmLm50KSB7CisJCXN0cnVjdCB0b2tlbiAqY3Q7CisKKwkJY3QgPSB0Zi50ICsgKHRmLmFydCArKyk7CisJCWlmIChjdC0+dHlwZSA9PSBOQU1FKSB7CisJCQlzdHJ1Y3QgbWFjcm8gKm0gPSBnZXRfbWFjcm8oY3QtPm5hbWUpOworCQkJaWYgKG0pIHsKKwkJCQlpZiAoc3Vic3RpdHV0ZV9tYWNybyhscywgbSwgJnRmLCAwLAorI2lmZGVmIE5PX1BSQUdNQV9JTl9ESVJFQ1RJVkUKKwkJCQkJMSwKKyNlbHNlCisJCQkJCTAsCisjZW5kaWYKKwkJCQkJY3QtPmxpbmUpKSB7CisJCQkJCWxzLT5vdXRwdXRfZmlmbyA9IHNhdmVfdGY7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJYW9sKHRmMi50LCB0ZjIubnQsICpjdCwgVE9LRU5fTElTVF9NRU1HKTsKKwl9CisJZnJlZW1lbSh0Zi50KTsKKwlmb3IgKHRmMi5hcnQgPSAwOyB0ZjIuYXJ0IDwgdGYyLm50ICYmIHR0V0hJKHRmMi50W3RmMi5hcnRdLnR5cGUpOworCQl0ZjIuYXJ0ICsrKTsKKwlscy0+b3V0cHV0X2ZpZm8gPSBzYXZlX3RmOworCWlmICh0ZjIuYXJ0ID09IHRmMi5udCB8fCAodGYyLnRbdGYyLmFydF0udHlwZSAhPSBOVU1CRVIKKwkJJiYgdGYyLnRbdGYyLmFydF0udHlwZSAhPSBDSEFSKSkgeworCQllcnJvcihsLCAibm90IGEgdmFsaWQgbnVtYmVyIGZvciAjbGluZSIpOworCQlnb3RvIGxpbmVfbWFjcm9fZXJyOworCX0KKwlmb3IgKGogPSAwOyB0ZjIudFt0ZjIuYXJ0XS5uYW1lW2pdOyBqICsrKQorCQlpZiAodGYyLnRbdGYyLmFydF0ubmFtZVtqXSA8ICcwJworCQkJfHwgdGYyLnRbdGYyLmFydF0ubmFtZVtqXSA+ICc5JykKKwkJCWlmIChscy0+ZmxhZ3MgJiBXQVJOX1NUQU5EQVJEKQorCQkJCXdhcm5pbmcobCwgIm5vbi1zdGFuZGFyZCBsaW5lIG51bWJlciBpbiAjbGluZSIpOworCWlmIChjYXRjaChldmFsX2V4Y2VwdGlvbikpIGdvdG8gbGluZV9tYWNyb19lcnI7CisJeiA9IHN0cnRvY29uc3QodGYyLnRbdGYyLmFydF0ubmFtZSk7CisJaWYgKGogPiAxMCB8fCB6ID4gMjE0NzQ4MzY0N1UpIHsKKwkJZXJyb3IobCwgIm91dC1vZi1ib3VuZCBsaW5lIG51bWJlciBmb3IgI2xpbmUiKTsKKwkJZ290byBsaW5lX21hY3JvX2VycjsKKwl9CisJbHMtPm9saW5lID0gbHMtPmxpbmUgPSB6OworCWlmICgoKysgdGYyLmFydCkgPCB0ZjIubnQpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gdGYyLmFydDsgaSA8IHRmMi5udCAmJiB0dE1XUyh0ZjIudFtpXS50eXBlKTsgaSArKyk7CisJCWlmIChpIDwgdGYyLm50KSB7CisJCQlpZiAodGYyLnRbaV0udHlwZSAhPSBTVFJJTkcpIHsKKwkJCQllcnJvcihsLCAibm90IGEgdmFsaWQgZmlsZW5hbWUgZm9yICNsaW5lIik7CisJCQkJZ290byBsaW5lX21hY3JvX2VycjsKKwkJCX0KKwkJCWlmICh0ZjIudFtpXS5uYW1lWzBdID09ICdMJykgeworCQkJCWlmIChscy0+ZmxhZ3MgJiBXQVJOX1NUQU5EQVJEKSB7CisJCQkJCXdhcm5pbmcobCwgIndpZGUgc3RyaW5nIGZvciAjbGluZSIpOworCQkJCX0KKwkJCQlmbmFtZSA9IHNkdXAodGYyLnRbaV0ubmFtZSk7CisJCQkJbmwgPSBzdHJsZW4oZm5hbWUpOworCQkJCSooZm5hbWUgKyBubCAtIDEpID0gMDsKKwkJCQltbXZ3byhmbmFtZSwgZm5hbWUgKyAyLCBubCAtIDIpOworCQkJfSBlbHNlIHsKKwkJCQlmbmFtZSA9IHNkdXAodGYyLnRbaV0ubmFtZSk7CisJCQkJbmwgPSBzdHJsZW4oZm5hbWUpOworCQkJCSooZm5hbWUgKyBubCAtIDEpID0gMDsKKwkJCQltbXZ3byhmbmFtZSwgZm5hbWUgKyAxLCBubCAtIDEpOworCQkJfQorCQkJc2V0X2N1cnJlbnRfZmlsZW5hbWUoZm5hbWUpOworCQl9CisJCWZvciAoaSArKzsgaSA8IHRmMi5udCAmJiB0dE1XUyh0ZjIudFtpXS50eXBlKTsgaSArKyk7CisJCWlmIChpIDwgdGYyLm50ICYmIChscy0+ZmxhZ3MgJiBXQVJOX1NUQU5EQVJEKSkgeworCQkJd2FybmluZyhsLCAidHJhaWxpbmcgZ2FyYmFnZSBpbiAjbGluZSIpOworCQl9CisJfQorCWZyZWVtZW0odGYyLnQpOworCWVudGVyX2ZpbGUobHMsIGZsYWdzKTsKKwlyZXR1cm4gMDsKKworbGluZV9tYWNyb19lcnI6CisJaWYgKHRmMi5udCkgZnJlZW1lbSh0ZjIudCk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBhICNlcnJvciBvciAjd2FybmluZyBkaXJlY3RpdmU6IHdlIGVtaXQgdGhlIG1lc3NhZ2Ugd2l0aG91dCBhbnkKKyAqIG1vZGlmaWNhdGlvbiAoZXhjZXB0IHRoZSB1c3VhbCBiYWNrc2xhc2grbmV3bGluZSBhbmQgdHJpZ3JhcGhzKQorICovCitzdGF0aWMgdm9pZCBoYW5kbGVfZXJyb3Ioc3RydWN0IGxleGVyX3N0YXRlICpscyxpbnQgd2FybmZsYWcpCit7CisJaW50IGM7CisJc2l6ZV90IHAgPSAwLCBscCA9IDEyODsKKwlsb25nIGwgPSBscy0+bGluZTsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSBnZXRtZW0obHApOworCisJd2hpbGUgKChjID0gZ3JhcF9jaGFyKGxzKSkgPj0gMCAmJiBjICE9ICdcbicpIHsKKwkJZGlzY2FyZF9jaGFyKGxzKTsKKwkJd2FuKGJ1ZiwgcCwgKHVuc2lnbmVkIGNoYXIpYywgbHApOworCX0KKwl3YW4oYnVmLCBwLCAwLCBscCk7CisJaWYgKHdhcm5mbGFnKQorCQl3YXJuaW5nKGwsICIjd2FybmluZyVzIiwgYnVmKTsKKwllbHNlCisJCWVycm9yKGwsICIjZXJyb3IlcyIsIGJ1Zik7CisJZnJlZW1lbShidWYpOworfQorCisvKgorICogY29udmVydCBkaWdyYXBoIHRva2VucyB0byB0aGVpciBzdGFuZGFyZCBlcXVpdmFsZW50LgorICovCitzdGF0aWMgaW50IHVuZGlnKGludCB0eXBlKQoreworCXN0YXRpYyBpbnQgdWRbNl0gPSB7IExCUkssIFJCUkssIExCUkEsIFJCUkEsIFNIQVJQLCBEU0hBUlAgfTsKKworCXJldHVybiB1ZFt0eXBlIC0gRElHX0xCUktdOworfQorCisjaWZkZWYgUFJBR01BX1RPS0VOSVpFCisvKgorICogTWFrZSBhIGNvbXByZXNzZWQgcmVwcmVzZW50YXRpb24gb2YgYSB0b2tlbiBsaXN0OyB0aGUgY29udGVudHMgb2YKKyAqIHRoZSB0b2tlbl9maWZvIGFyZSBmcmVlZC4gVmFsdWVzIGVxdWFsIHRvIDAgYXJlIHJlcGxhY2VkIGJ5CisgKiBQUkFHTUFfVE9LRU5fRU5EIChieSBkZWZhdWx0LCAodW5zaWduZWQgY2hhciknXG4nKSBhbmQgdGhlIGNvbXByZXNzZWQKKyAqIHN0cmluZyBpcyBwYWRkZWQgYnkgYSAwIChzbyB0aGF0IGl0IG1heSBiZSAqIGhhbmRsZWQgbGlrZSBhIHN0cmluZykuCisgKiBEaWdyYXBoIHRva2VucyBhcmUgcmVwbGFjZWQgYnkgdGhlaXIgbm9uLWRpZ3JhcGggZXF1aXZhbGVudHMuCisgKi8KK3N0cnVjdCBjb21wX3Rva2VuX2ZpZm8gY29tcHJlc3NfdG9rZW5fbGlzdChzdHJ1Y3QgdG9rZW5fZmlmbyAqdGYpCit7CisJc3RydWN0IGNvbXBfdG9rZW5fZmlmbyBjdDsKKwlzaXplX3QgbDsKKworCWZvciAobCA9IDAsIHRmLT5hcnQgPSAwOyB0Zi0+YXJ0IDwgdGYtPm50OyB0Zi0+YXJ0ICsrKSB7CisJCWwgKys7CisJCWlmIChTX1RPS0VOKHRmLT50W3RmLT5hcnRdLnR5cGUpKQorCQkJbCArPSBzdHJsZW4odGYtPnRbdGYtPmFydF0ubmFtZSkgKyAxOworCX0KKwljdC50ID0gZ2V0bWVtKChjdC5sZW5ndGggPSBsKSArIDEpOworCWZvciAobCA9IDAsIHRmLT5hcnQgPSAwOyB0Zi0+YXJ0IDwgdGYtPm50OyB0Zi0+YXJ0ICsrKSB7CisJCWludCB0dCA9IHRmLT50W3RmLT5hcnRdLnR5cGU7CisKKwkJaWYgKHR0ID09IDApIHR0ID0gUFJBR01BX1RPS0VOX0VORDsKKwkJaWYgKHR0ID4gRElHUkFQSF9UT0tFTlMgJiYgdHQgPCBESUdSQVBIX1RPS0VOU19FTkQpCisJCQl0dCA9IHVuZGlnKHR0KTsKKwkJY3QudFtsICsrXSA9IHR0OworCQlpZiAoU19UT0tFTih0dCkpIHsKKwkJCWNoYXIgKnRuID0gdGYtPnRbdGYtPmFydF0ubmFtZTsKKwkJCXNpemVfdCBzbCA9IHN0cmxlbih0bik7CisKKwkJCW1tdihjdC50ICsgbCwgdG4sIHNsKTsKKwkJCWwgKz0gc2w7CisJCQljdC50W2wgKytdID0gUFJBR01BX1RPS0VOX0VORDsKKwkJCWZyZWVtZW0odG4pOworCQl9CisJfQorCWN0LnRbbF0gPSAwOworCWlmICh0Zi0+bnQpIGZyZWVtZW0odGYtPnQpOworCWN0LnJwID0gMDsKKwlyZXR1cm4gY3Q7Cit9CisjZW5kaWYKKworLyoKKyAqIEEgI3ByYWdtYSBkaXJlY3RpdmU6IHdlIG1ha2UgYSBQUkFHTUEgdG9rZW4gY29udGFpbmluZyB0aGUgcmVzdCBvZgorICogdGhlIGxpbmUuCisgKgorICogV2Ugc3Ryb25nbHkgaG9wZSB0aGF0IHdlIGFyZSBjYWxsZWQgb25seSBpbiBMRVhFUiBtb2RlLgorICovCitzdGF0aWMgdm9pZCBoYW5kbGVfcHJhZ21hKHN0cnVjdCBsZXhlcl9zdGF0ZSAqbHMpCit7CisJdW5zaWduZWQgY2hhciAqYnVmOworCXN0cnVjdCB0b2tlbiB0OworCWxvbmcgbCA9IGxzLT5saW5lOworCisjaWZkZWYgUFJBR01BX1RPS0VOSVpFCisJc3RydWN0IHRva2VuX2ZpZm8gdGY7CisKKwl0Zi5hcnQgPSB0Zi5udCA9IDA7CisJd2hpbGUgKCFuZXh0X3Rva2VuKGxzKSAmJiBscy0+Y3Rvay0+dHlwZSAhPSBORVdMSU5FKQorCQlpZiAoIXR0TVdTKGxzLT5jdG9rLT50eXBlKSkgYnJlYWs7CisJaWYgKGxzLT5jdG9rLT50eXBlICE9IE5FV0xJTkUpIHsKKwkJZG8geworCQkJc3RydWN0IHRva2VuIHQ7CisKKwkJCXQudHlwZSA9IGxzLT5jdG9rLT50eXBlOworCQkJaWYgKHR0TVdTKHQudHlwZSkpIGNvbnRpbnVlOworCQkJaWYgKFNfVE9LRU4odC50eXBlKSkgdC5uYW1lID0gc2R1cChscy0+Y3Rvay0+bmFtZSk7CisJCQlhb2wodGYudCwgdGYubnQsIHQsIFRPS0VOX0xJU1RfTUVNRyk7CisJCX0gd2hpbGUgKCFuZXh0X3Rva2VuKGxzKSAmJiBscy0+Y3Rvay0+dHlwZSAhPSBORVdMSU5FKTsKKwl9CisJaWYgKHRmLm50ID09IDApIHsKKwkJLyogdm9pZCBwcmFnbWEgYXJlIHNpbGVudGx5IGlnbm9yZWQgKi8KKwkJcmV0dXJuOworCX0KKwlidWYgPSAoY29tcHJlc3NfdG9rZW5fbGlzdCgmdGYpKS50OworI2Vsc2UKKwlpbnQgYywgeCA9IDEsIHkgPSAzMjsKKworCXdoaWxlICgoYyA9IGdyYXBfY2hhcihscykpID49IDAgJiYgYyAhPSAnXG4nKSB7CisJCWRpc2NhcmRfY2hhcihscyk7CisJCWlmICghc3BhY2VfY2hhcihjKSkgYnJlYWs7CisJfQorCS8qIHZvaWQgI3ByYWdtYSBhcmUgaWdub3JlZCAqLworCWlmIChjID09ICdcbicpIHJldHVybjsKKwlidWYgPSBnZXRtZW0oeSk7CisJYnVmWzBdID0gYzsKKwl3aGlsZSAoKGMgPSBncmFwX2NoYXIobHMpKSA+PSAwICYmIGMgIT0gJ1xuJykgeworCQlkaXNjYXJkX2NoYXIobHMpOworCQl3YW4oYnVmLCB4LCBjLCB5KTsKKwl9CisJZm9yICh4IC0tOyB4ID49IDAgJiYgc3BhY2VfY2hhcihidWZbeF0pOyB4IC0tKTsKKwl4ICsrOworCXdhbihidWYsIHgsIDAsIHkpOworI2VuZGlmCisJdC50eXBlID0gUFJBR01BOworCXQubGluZSA9IGw7CisJdC5uYW1lID0gKGNoYXIgKilidWY7CisJYW9sKGxzLT5vdXRwdXRfZmlmby0+dCwgbHMtPm91dHB1dF9maWZvLT5udCwgdCwgVE9LRU5fTElTVF9NRU1HKTsKKwl0aHJvd19hd2F5KGxzLT5nZiwgKGNoYXIgKilidWYpOworfQorCisvKgorICogV2Ugc2F3IGEgIyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSAob3IgcHJlY2VlZGVkIG9ubHkgYnkgd2hpdGVzcGFjZSkuCisgKiBXZSBjaGVjayB0aGUgZGlyZWN0aXZlIG5hbWUgYW5kIGFjdCBhY2NvcmRpbmdseS4KKyAqLworc3RhdGljIGludCBoYW5kbGVfY3BwKHN0cnVjdCBsZXhlcl9zdGF0ZSAqbHMsIGludCBzaGFycF90eXBlKQoreworI2RlZmluZSBjb25kZnNldCh4KQlkbyB7IFwKKwkJbHMtPmNvbmRmWyh4KSAvIDMyXSB8PSAxVUwgPDwgKCh4KSAlIDMyKTsgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIGNvbmRmY2xyKHgpCWRvIHsgXAorCQlscy0+Y29uZGZbKHgpIC8gMzJdICY9IH4oMVVMIDw8ICgoeCkgJSAzMikpOyBcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgY29uZGZ2YWwoeCkJKChscy0+Y29uZGZbKHgpIC8gMzJdICYgKDFVTCA8PCAoKHgpICUgMzIpKSkgIT0gMCkKKworCWxvbmcgbCA9IGxzLT5saW5lOworCXVuc2lnbmVkIGxvbmcgc2F2ZV9mbGFncyA9IGxzLT5mbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCXNhdmVfZmxhZ3MgPSBscy0+ZmxhZ3M7CisJbHMtPmZsYWdzIHw9IExFWEVSOworCXdoaWxlICghbmV4dF90b2tlbihscykpIHsKKwkJaW50IHQgPSBscy0+Y3Rvay0+dHlwZTsKKworCQlzd2l0Y2ggKHQpIHsKKwkJY2FzZSBDT01NRU5UOgorCQkJaWYgKGxzLT5mbGFncyAmIFdBUk5fQU5OT1lJTkcpIHsKKwkJCQl3YXJuaW5nKGwsICJjb21tZW50IGluIHRoZSBtaWRkbGUgb2YgIgorCQkJCQkiYSBjcHAgZGlyZWN0aXZlIik7CisJCQl9CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBOT05FOgorCQkJY29udGludWU7CisJCWNhc2UgTkVXTElORToKKwkJCS8qIG51bGwgZGlyZWN0aXZlICovCisJCQlpZiAobHMtPmZsYWdzICYgV0FSTl9BTk5PWUlORykgeworCQkJCS8qIHRydWx5IGFuIGFubm95aW5nIHdhcm5pbmc7IG51bGwgZGlyZWN0aXZlcworCQkJCSAgIGFyZSByYXJlIGJ1dCBtYXkgaW5jcmVhc2UgcmVhZGFiaWxpdHkgb2YKKwkJCQkgICBzb21lIHNvdXJjZSBmaWxlcywgYW5kIHRoZXkgYXJlIGxlZ2FsICovCisJCQkJd2FybmluZyhsLCAibnVsbCBjcHAgZGlyZWN0aXZlIik7CisJCQl9CisJCQlpZiAoIShscy0+ZmxhZ3MgJiBMRVhFUikpIHB1dF9jaGFyKGxzLCAnXG4nKTsKKwkJCWdvdG8gaGFuZGxlX2V4aXQyOworCQljYXNlIE5BTUU6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmIChscy0+ZmxhZ3MgJiBGQUlMX1NIQVJQKSB7CisJCQkJaWYgKGxzLT5jb25kY29tcCkgeworCQkJCQllcnJvcihsLCAicm9ndWUgJyMnIik7CisJCQkJCXJldCA9IDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGxzLT5mbGFncyAmIFdBUk5fU1RBTkRBUkQpIHsKKwkJCQkJCXdhcm5pbmcobCwgInJvZ3VlICcjJyBpbiBjb2RlICIKKwkJCQkJCQkiY29tcGlsZWQgb3V0Iik7CisJCQkJCQlyZXQgPSAwOworCQkJCQl9CisJCQkJfQorCQkJCWxzLT5mbGFncyA9IHNhdmVfZmxhZ3M7CisJCQkJZ290byBoYW5kbGVfd2FycF9pZ247CisJCQl9IGVsc2UgeworCQkJCXN0cnVjdCB0b2tlbiB1OworCisJCQkJdS50eXBlID0gc2hhcnBfdHlwZTsKKwkJCQl1LmxpbmUgPSBsOworCQkJCWxzLT5mbGFncyA9IHNhdmVfZmxhZ3M7CisJCQkJcHJpbnRfdG9rZW4obHMsICZ1LCAwKTsKKwkJCQlwcmludF90b2tlbihscywgbHMtPmN0b2ssIDApOworCQkJCWlmIChscy0+ZmxhZ3MgJiBXQVJOX0FOTk9ZSU5HKSB7CisJCQkJCXdhcm5pbmcobCwgInJvZ3VlICcjJyBkdW1wZWQiKTsKKwkJCQl9CisJCQkJZ290byBoYW5kbGVfZXhpdDM7CisJCQl9CisJCX0KKwkJaWYgKGxzLT5jb25kY29tcCkgeworCQkJaWYgKCFzdHJjbXAobHMtPmN0b2stPm5hbWUsICJkZWZpbmUiKSkgeworCQkJCXJldCA9IGhhbmRsZV9kZWZpbmUobHMpOworCQkJCWdvdG8gaGFuZGxlX2V4aXQ7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAobHMtPmN0b2stPm5hbWUsICJ1bmRlZiIpKSB7CisJCQkJcmV0ID0gaGFuZGxlX3VuZGVmKGxzKTsKKwkJCQlnb3RvIGhhbmRsZV9leGl0OworCQkJfSBlbHNlIGlmICghc3RyY21wKGxzLT5jdG9rLT5uYW1lLCAiaWYiKSkgeworCQkJCWlmICgoKysgbHMtPmlmbmVzdCkgPiA2MykgZ290byB0b29fbWFueV9pZjsKKwkJCQljb25kZmNscihscy0+aWZuZXN0IC0gMSk7CisJCQkJcmV0ID0gaGFuZGxlX2lmKGxzKTsKKwkJCQlpZiAocmV0ID4gMCkgcmV0ID0gMDsKKwkJCQllbHNlIGlmIChyZXQgPT0gMCkgeworCQkJCQlscy0+Y29uZGNvbXAgPSAwOworCQkJCQlscy0+Y29uZG1ldCA9IDA7CisJCQkJCWxzLT5jb25kbmVzdCA9IGxzLT5pZm5lc3QgLSAxOworCQkJCX0KKwkJCQllbHNlIHJldCA9IDE7CisJCQkJZ290byBoYW5kbGVfZXhpdDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChscy0+Y3Rvay0+bmFtZSwgImlmZGVmIikpIHsKKwkJCQlpZiAoKCsrIGxzLT5pZm5lc3QpID4gNjMpIGdvdG8gdG9vX21hbnlfaWY7CisJCQkJY29uZGZjbHIobHMtPmlmbmVzdCAtIDEpOworCisJCQkJcmV0ID0gaGFuZGxlX2lmZGVmKGxzKTsKKwkJCQlpZiAocmV0ID4gMCkgcmV0ID0gMDsKKwkJCQllbHNlIGlmIChyZXQgPT0gMCkgeworCQkJCQlscy0+Y29uZGNvbXAgPSAwOworCQkJCQlscy0+Y29uZG1ldCA9IDA7CisJCQkJCWxzLT5jb25kbmVzdCA9IGxzLT5pZm5lc3QgLSAxOworCQkJCX0KKwkJCQllbHNlIHJldCA9IDE7CisJCQkJZ290byBoYW5kbGVfZXhpdDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChscy0+Y3Rvay0+bmFtZSwgImlmbmRlZiIpKSB7CisJCQkJaWYgKCgrKyBscy0+aWZuZXN0KSA+IDYzKSBnb3RvIHRvb19tYW55X2lmOworCQkJCWNvbmRmY2xyKGxzLT5pZm5lc3QgLSAxKTsKKwkJCQlyZXQgPSBoYW5kbGVfaWZuZGVmKGxzKTsKKwkJCQlpZiAocmV0ID4gMCkgcmV0ID0gMDsKKwkJCQllbHNlIGlmIChyZXQgPT0gMCkgeworCQkJCQlscy0+Y29uZGNvbXAgPSAwOworCQkJCQlscy0+Y29uZG1ldCA9IDA7CisJCQkJCWxzLT5jb25kbmVzdCA9IGxzLT5pZm5lc3QgLSAxOworCQkJCX0KKwkJCQllbHNlIHJldCA9IDE7CisJCQkJZ290byBoYW5kbGVfZXhpdDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChscy0+Y3Rvay0+bmFtZSwgImVsc2UiKSkgeworCQkJCWlmIChscy0+aWZuZXN0ID09IDAKKwkJCQkJfHwgY29uZGZ2YWwobHMtPmlmbmVzdCAtIDEpKSB7CisJCQkJCWVycm9yKGwsICJyb2d1ZSAjZWxzZSIpOworCQkJCQlyZXQgPSAxOworCQkJCQlnb3RvIGhhbmRsZV93YXJwOworCQkJCX0KKwkJCQljb25kZnNldChscy0+aWZuZXN0IC0gMSk7CisJCQkJaWYgKGxzLT5pZm5lc3QgPT0gMSkgcHJvdGVjdF9kZXRlY3Quc3RhdGUgPSAwOworCQkJCWxzLT5jb25kY29tcCA9IDA7CisJCQkJbHMtPmNvbmRtZXQgPSAxOworCQkJCWxzLT5jb25kbmVzdCA9IGxzLT5pZm5lc3QgLSAxOworCQkJCWdvdG8gaGFuZGxlX3dhcnA7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAobHMtPmN0b2stPm5hbWUsICJlbGlmIikpIHsKKwkJCQlpZiAobHMtPmlmbmVzdCA9PSAwCisJCQkJCXx8IGNvbmRmdmFsKGxzLT5pZm5lc3QgLSAxKSkgeworCQkJCQllcnJvcihsLCAicm9ndWUgI2VsaWYiKTsKKwkJCQkJcmV0ID0gMTsKKwkJCQkJZ290byBoYW5kbGVfd2FycF9pZ247CisJCQkJfQorCQkJCWlmIChscy0+aWZuZXN0ID09IDEpIHByb3RlY3RfZGV0ZWN0LnN0YXRlID0gMDsKKwkJCQlscy0+Y29uZGNvbXAgPSAwOworCQkJCWxzLT5jb25kbWV0ID0gMTsKKwkJCQlscy0+Y29uZG5lc3QgPSBscy0+aWZuZXN0IC0gMTsKKwkJCQlnb3RvIGhhbmRsZV93YXJwX2lnbjsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChscy0+Y3Rvay0+bmFtZSwgImVuZGlmIikpIHsKKwkJCQlpZiAobHMtPmlmbmVzdCA9PSAwKSB7CisJCQkJCWVycm9yKGwsICJ1bm1hdGNoZWQgI2VuZGlmIik7CisJCQkJCXJldCA9IDE7CisJCQkJCWdvdG8gaGFuZGxlX3dhcnA7CisJCQkJfQorCQkJCWlmICgoLS0gbHMtPmlmbmVzdCkgPT0gMAorCQkJCQkmJiBwcm90ZWN0X2RldGVjdC5zdGF0ZSA9PSAyKSB7CisJCQkJCXByb3RlY3RfZGV0ZWN0LnN0YXRlID0gMzsKKwkJCQl9CisJCQkJZ290byBoYW5kbGVfd2FycDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChscy0+Y3Rvay0+bmFtZSwgImluY2x1ZGUiKSkgeworCQkJCXJldCA9IGhhbmRsZV9pbmNsdWRlKGxzLCBzYXZlX2ZsYWdzLCAwKTsKKwkJCQlnb3RvIGhhbmRsZV9leGl0MzsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChscy0+Y3Rvay0+bmFtZSwgImluY2x1ZGVfbmV4dCIpKSB7CisJCQkJcmV0ID0gaGFuZGxlX2luY2x1ZGUobHMsIHNhdmVfZmxhZ3MsIDEpOworCQkJCWdvdG8gaGFuZGxlX2V4aXQzOworCQkJfSBlbHNlIGlmICghc3RyY21wKGxzLT5jdG9rLT5uYW1lLCAicHJhZ21hIikpIHsKKwkJCQlpZiAoIShzYXZlX2ZsYWdzICYgTEVYRVIpKSB7CisjaWZkZWYgUFJBR01BX0RVTVAKKwkJCQkJLyogZHVtcCAjcHJhZ21hIGluIG91dHB1dCAqLworCQkJCQlzdHJ1Y3QgdG9rZW4gdTsKKworCQkJCQl1LnR5cGUgPSBzaGFycF90eXBlOworCQkJCQl1LmxpbmUgPSBsOworCQkJCQlscy0+ZmxhZ3MgPSBzYXZlX2ZsYWdzOworCQkJCQlwcmludF90b2tlbihscywgJnUsIDApOworCQkJCQlwcmludF90b2tlbihscywgbHMtPmN0b2ssIDApOworCQkJCQl3aGlsZSAobHMtPmZsYWdzIHw9IExFWEVSLAorCQkJCQkJIW5leHRfdG9rZW4obHMpKSB7CisJCQkJCQlsb25nIHNhdmVfbGluZTsKKworCQkJCQkJbHMtPmZsYWdzICY9IH5MRVhFUjsKKwkJCQkJCXNhdmVfbGluZSA9IGxzLT5saW5lOworCQkJCQkJbHMtPmxpbmUgPSBsOworCQkJCQkJcHJpbnRfdG9rZW4obHMsIGxzLT5jdG9rLCAwKTsKKwkJCQkJCWxzLT5saW5lID0gc2F2ZV9saW5lOworCQkJCQkJaWYgKGxzLT5jdG9rLT50eXBlID09IE5FV0xJTkUpCisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZ290byBoYW5kbGVfZXhpdDM7CisjZWxzZQorCQkJCQlpZiAobHMtPmZsYWdzICYgV0FSTl9QUkFHTUEpCisJCQkJCQl3YXJuaW5nKGwsICIjcHJhZ21hIGlnbm9yZWQgIgorCQkJCQkJCSJhbmQgbm90IGR1bXBlZCIpOworCQkJCQlnb3RvIGhhbmRsZV93YXJwX2lnbjsKKyNlbmRpZgorCQkJCX0KKwkJCQlpZiAoIShscy0+ZmxhZ3MgJiBIQU5ETEVfUFJBR01BKSkKKwkJCQkJZ290byBoYW5kbGVfd2FycF9pZ247CisJCQkJaGFuZGxlX3ByYWdtYShscyk7CisJCQkJZ290byBoYW5kbGVfZXhpdDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChscy0+Y3Rvay0+bmFtZSwgImVycm9yIikpIHsKKwkJCQlyZXQgPSAxOworCQkJCWhhbmRsZV9lcnJvcihscywwKTsKKwkJCQlnb3RvIGhhbmRsZV9leGl0OworCQkJfSBlbHNlIGlmICghc3RyY21wKGxzLT5jdG9rLT5uYW1lLCAid2FybmluZyIpKSB7CisJCQkJcmV0ID0gMDsKKwkJCQloYW5kbGVfZXJyb3IobHMsMSk7CisJCQkJZ290byBoYW5kbGVfZXhpdDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChscy0+Y3Rvay0+bmFtZSwgImxpbmUiKSkgeworCQkJCXJldCA9IGhhbmRsZV9saW5lKGxzLCBzYXZlX2ZsYWdzKTsKKwkJCQlnb3RvIGhhbmRsZV9leGl0OworCQkJfSBlbHNlIGlmICgobHMtPmZsYWdzICYgSEFORExFX0FTU0VSVElPTlMpCisJCQkJJiYgIXN0cmNtcChscy0+Y3Rvay0+bmFtZSwgImFzc2VydCIpKSB7CisJCQkJcmV0ID0gaGFuZGxlX2Fzc2VydChscyk7CisJCQkJZ290byBoYW5kbGVfZXhpdDsKKwkJCX0gZWxzZSBpZiAoKGxzLT5mbGFncyAmIEhBTkRMRV9BU1NFUlRJT05TKQorCQkJCSYmICFzdHJjbXAobHMtPmN0b2stPm5hbWUsICJ1bmFzc2VydCIpKSB7CisJCQkJcmV0ID0gaGFuZGxlX3VuYXNzZXJ0KGxzKTsKKwkJCQlnb3RvIGhhbmRsZV9leGl0OworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCFzdHJjbXAobHMtPmN0b2stPm5hbWUsICJlbHNlIikpIHsKKwkJCQlpZiAoY29uZGZ2YWwobHMtPmlmbmVzdCAtIDEpCisJCQkJCSYmIChscy0+ZmxhZ3MgJiBXQVJOX1NUQU5EQVJEKSkgeworCQkJCQl3YXJuaW5nKGwsICJyb2d1ZSAjZWxzZSBpbiBjb2RlICIKKwkJCQkJCSJjb21waWxlZCBvdXQiKTsKKwkJCQl9CisJCQkJaWYgKGxzLT5jb25kbmVzdCA9PSBscy0+aWZuZXN0IC0gMSkgeworCQkJCQlpZiAoIWxzLT5jb25kbWV0KSBscy0+Y29uZGNvbXAgPSAxOworCQkJCX0KKwkJCQljb25kZnNldChscy0+aWZuZXN0IC0gMSk7CisJCQkJaWYgKGxzLT5pZm5lc3QgPT0gMSkgcHJvdGVjdF9kZXRlY3Quc3RhdGUgPSAwOworCQkJCWdvdG8gaGFuZGxlX3dhcnA7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAobHMtPmN0b2stPm5hbWUsICJlbGlmIikpIHsKKwkJCQlpZiAoY29uZGZ2YWwobHMtPmlmbmVzdCAtIDEpCisJCQkJCSYmIChscy0+ZmxhZ3MgJiBXQVJOX1NUQU5EQVJEKSkgeworCQkJCQl3YXJuaW5nKGwsICJyb2d1ZSAjZWxpZiBpbiBjb2RlICIKKwkJCQkJCSJjb21waWxlZCBvdXQiKTsKKwkJCQl9CisJCQkJaWYgKGxzLT5jb25kbmVzdCAhPSBscy0+aWZuZXN0IC0gMQorCQkJCQl8fCBscy0+Y29uZG1ldCkKKwkJCQkJZ290byBoYW5kbGVfd2FycF9pZ247CisJCQkJaWYgKGxzLT5pZm5lc3QgPT0gMSkgcHJvdGVjdF9kZXRlY3Quc3RhdGUgPSAwOworCQkJCXJldCA9IGhhbmRsZV9pZihscyk7CisJCQkJaWYgKHJldCA+IDApIHsKKwkJCQkJbHMtPmNvbmRjb21wID0gMTsKKwkJCQkJbHMtPmNvbmRtZXQgPSAxOworCQkJCQlyZXQgPSAwOworCQkJCX0gZWxzZSBpZiAocmV0IDwgMCkgcmV0ID0gMTsKKwkJCQlnb3RvIGhhbmRsZV9leGl0OworCQkJfSBlbHNlIGlmICghc3RyY21wKGxzLT5jdG9rLT5uYW1lLCAiZW5kaWYiKSkgeworCQkJCWlmICgoLS0gbHMtPmlmbmVzdCkgPT0gbHMtPmNvbmRuZXN0KSB7CisJCQkJCWlmIChscy0+aWZuZXN0ID09IDAgJiYKKwkJCQkJCXByb3RlY3RfZGV0ZWN0LnN0YXRlID09IDIpCisJCQkJCQlwcm90ZWN0X2RldGVjdC5zdGF0ZSA9IDM7CisJCQkJCWxzLT5jb25kY29tcCA9IDE7CisJCQkJfQorCQkJCWdvdG8gaGFuZGxlX3dhcnA7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAobHMtPmN0b2stPm5hbWUsICJpZiIpCisJCQkJfHwgIXN0cmNtcChscy0+Y3Rvay0+bmFtZSwgImlmZGVmIikKKwkJCQl8fCAhc3RyY21wKGxzLT5jdG9rLT5uYW1lLCAiaWZuZGVmIikpIHsKKwkJCQlpZiAoKCsrIGxzLT5pZm5lc3QpID4gNjMpIGdvdG8gdG9vX21hbnlfaWY7CisJCQkJY29uZGZjbHIobHMtPmlmbmVzdCAtIDEpOworCQkJfQorCQkJZ290byBoYW5kbGVfd2FycF9pZ247CisJCX0KKwkJLyoKKwkJICogVW5yZWNvZ25pemVkIGRpcmVjdGl2ZS4gV2UgZW1pdCBlaXRoZXIgYW4gZXJyb3Igb3IKKwkJICogYW4gYW5ub3lpbmcgd2FybmluZywgZGVwZW5kaW5nIG9uIGEgY29tbWFuZC1saW5lIHN3aXRjaC4KKwkJICovCisJCWlmIChscy0+ZmxhZ3MgJiBGQUlMX1NIQVJQKSB7CisJCQllcnJvcihsLCAidW5rbm93biBjcHAgZGlyZWN0aXZlICcjJXMnIiwKKwkJCQlscy0+Y3Rvay0+bmFtZSk7CisJCQlnb3RvIGhhbmRsZV93YXJwX2lnbjsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCB0b2tlbiB1OworCisJCQl1LnR5cGUgPSBzaGFycF90eXBlOworCQkJdS5saW5lID0gbDsKKwkJCWxzLT5mbGFncyA9IHNhdmVfZmxhZ3M7CisJCQlwcmludF90b2tlbihscywgJnUsIDApOworCQkJcHJpbnRfdG9rZW4obHMsIGxzLT5jdG9rLCAwKTsKKwkJCWlmIChscy0+ZmxhZ3MgJiBXQVJOX0FOTk9ZSU5HKSB7CisJCQkJd2FybmluZyhsLCAicm9ndWUgJyMnIGR1bXBlZCIpOworCQkJfQorCQl9CisJfQorCXJldHVybiAxOworCitoYW5kbGVfd2FycF9pZ246CisJd2hpbGUgKCFuZXh0X3Rva2VuKGxzKSkgaWYgKGxzLT5jdG9rLT50eXBlID09IE5FV0xJTkUpIGJyZWFrOworCWdvdG8gaGFuZGxlX2V4aXQ7CitoYW5kbGVfd2FycDoKKwl3aGlsZSAoIW5leHRfdG9rZW4obHMpKSB7CisJCWlmICghdHRXSEkobHMtPmN0b2stPnR5cGUpICYmIChscy0+ZmxhZ3MgJiBXQVJOX1NUQU5EQVJEKSkgeworCQkJd2FybmluZyhsLCAidHJhaWxpbmcgZ2FyYmFnZSBpbiAiCisJCQkJInByZXByb2Nlc3NpbmcgZGlyZWN0aXZlIik7CisJCX0KKwkJaWYgKGxzLT5jdG9rLT50eXBlID09IE5FV0xJTkUpIGJyZWFrOworCX0KK2hhbmRsZV9leGl0OgorCWlmICghKGxzLT5mbGFncyAmIExFWEVSKSkgcHV0X2NoYXIobHMsICdcbicpOworaGFuZGxlX2V4aXQzOgorCWlmIChwcm90ZWN0X2RldGVjdC5zdGF0ZSA9PSAxKSB7CisJCXByb3RlY3RfZGV0ZWN0LnN0YXRlID0gMDsKKwl9IGVsc2UgaWYgKHByb3RlY3RfZGV0ZWN0LnN0YXRlID09IC0xKSB7CisJCS8qIGp1c3QgYWZ0ZXIgdGhlICNpbmNsdWRlICovCisJCXByb3RlY3RfZGV0ZWN0LnN0YXRlID0gMTsKKwl9CitoYW5kbGVfZXhpdDI6CisJbHMtPmZsYWdzID0gc2F2ZV9mbGFnczsKKwlyZXR1cm4gcmV0OwordG9vX21hbnlfaWY6CisJZXJyb3IobCwgInRvbyBtYW55IGxldmVscyBvZiBjb25kaXRpb25hbCBpbmNsdXNpb24gKG1heCA2MykiKTsKKwlyZXQgPSAxOworCWdvdG8gaGFuZGxlX3dhcnA7CisjdW5kZWYgY29uZGZzZXQKKyN1bmRlZiBjb25kZmNscgorI3VuZGVmIGNvbmRmdmFsCit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IGZ1bmN0aW9uLiBJdCBtYWludGFpbnMgY291bnQgb2YgIywgYW5kIGNhbGwgdGhlCisgKiBhcHByb3ByaWF0ZSBmdW5jdGlvbnMgd2hlbiBpdCBlbmNvdW50ZXJzIGEgY3BwIGRpcmVjdGl2ZSBvciBhIG1hY3JvCisgKiBuYW1lLgorICogcmV0dXJuIHZhbHVlOiBwb3NpdGl2ZSBvbiBlcnJvcjsgQ1BQRVJSX0VPRiBtZWFucyAiZW5kIG9mIGlucHV0IHJlYWNoZWQiCisgKi8KK2ludCBjcHAoc3RydWN0IGxleGVyX3N0YXRlICpscykKK3sKKwlpbnQgciA9IDA7CisKKwl3aGlsZSAobmV4dF90b2tlbihscykpIHsKKwkJaWYgKHByb3RlY3RfZGV0ZWN0LnN0YXRlID09IDMpIHsKKwkJCS8qIENvb2wgISBBIHByb3RlY3Rpb24gbWVjaGFuaXNtIGhhcyBiZWVuIGRldGVjdGVkICovCisJCQlwcm90ZWN0X2RldGVjdC5mZi0+cHJvdGVjdCA9IHByb3RlY3RfZGV0ZWN0Lm1hY3JvOworCQkJcHJvdGVjdF9kZXRlY3QubWFjcm8gPSAwOworCQl9CisJCWlmIChscy0+aWZuZXN0KSB7CisJCQllcnJvcihscy0+bGluZSwgInVudGVybWluYXRlZCAjaWYgY29uc3RydWN0aW9uICIKKwkJCQkiKGRlcHRoICVsZCkiLCAobG9uZylscy0+aWZuZXN0KTsKKwkJCXIgPSBDUFBFUlJfTkVTVDsKKwkJfQorCQlpZiAobHNfZGVwdGggPT0gMCkgcmV0dXJuIENQUEVSUl9FT0Y7CisJCWZjbG9zZShscy0+aW5wdXQpOworCQlmcmVlbWVtKGN1cnJlbnRfZmlsZW5hbWUpOworCQlwb3BfZmlsZV9jb250ZXh0KGxzKTsKKwkJaWYgKCEobHMtPmZsYWdzICYgTEVYRVIpICYmICFscy0+bHR3bmwpIHB1dF9jaGFyKGxzLCAnXG4nKTsKKwkJZW50ZXJfZmlsZShscywgbHMtPmZsYWdzKTsKKwl9CisJaWYgKCEobHMtPmx0d25sICYmIChscy0+Y3Rvay0+dHlwZSA9PSBTSEFSUAorCQl8fCBscy0+Y3Rvay0+dHlwZSA9PSBESUdfU0hBUlApKQorCQkmJiBwcm90ZWN0X2RldGVjdC5zdGF0ZSA9PSAxICYmICF0dFdISShscy0+Y3Rvay0+dHlwZSkpIHsKKwkJLyogdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIHRva2VuIGVuY291bnRlcmVkIGlzIG5vdAorCQkgICBhIHNoYXJwIGludHJvZHVjaW5nIGEgY3BwIGRpcmVjdGl2ZSAqLworCQlwcm90ZWN0X2RldGVjdC5zdGF0ZSA9IDA7CisJfQorCWlmIChwcm90ZWN0X2RldGVjdC5zdGF0ZSA9PSAzICYmICF0dFdISShscy0+Y3Rvay0+dHlwZSkpIHsKKwkJLyogYSBub24td2hpdGVzcGFjZSB0b2tlbiBlbmNvdW50ZXJlZCBhZnRlciB0aGUgI2VuZGlmICovCisJCXByb3RlY3RfZGV0ZWN0LnN0YXRlID0gMDsKKwl9CisJaWYgKGxzLT5jb25kY29tcCkgeworCQlpZiAobHMtPmx0d25sICYmIChscy0+Y3Rvay0+dHlwZSA9PSBTSEFSUAorCQkJfHwgbHMtPmN0b2stPnR5cGUgPT0gRElHX1NIQVJQKSkgeworCQkJaW50IHggPSBoYW5kbGVfY3BwKGxzLCBscy0+Y3Rvay0+dHlwZSk7CisKKwkJCWxzLT5sdHdubCA9IDE7CisJCQlyZXR1cm4gciA/IHIgOiB4OworCQl9CisJCWlmIChscy0+Y3Rvay0+dHlwZSA9PSBOQU1FKSB7CisJCQlzdHJ1Y3QgbWFjcm8gKm07CisKKwkJCWlmICgobSA9IGdldF9tYWNybyhscy0+Y3Rvay0+bmFtZSkpICE9IDApIHsKKwkJCQlpbnQgeDsKKworCQkJCXggPSBzdWJzdGl0dXRlX21hY3JvKGxzLCBtLCAwLCAxLCAwLAorCQkJCQlscy0+Y3Rvay0+bGluZSk7CisJCQkJaWYgKCEobHMtPmZsYWdzICYgTEVYRVIpKQorCQkJCQlnYXJiYWdlX2NvbGxlY3QobHMtPmdmKTsKKwkJCQlyZXR1cm4gciA/IHIgOiB4OworCQkJfQorCQkJaWYgKCEobHMtPmZsYWdzICYgTEVYRVIpKQorCQkJCXByaW50X3Rva2VuKGxzLCBscy0+Y3RvaywgMCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAobHMtPmx0d25sICYmIChscy0+Y3Rvay0+dHlwZSA9PSBTSEFSUAorCQkJfHwgbHMtPmN0b2stPnR5cGUgPT0gRElHX1NIQVJQKSkgeworCQkJaW50IHggPSBoYW5kbGVfY3BwKGxzLCBscy0+Y3Rvay0+dHlwZSk7CisKKwkJCWxzLT5sdHdubCA9IDE7CisJCQlyZXR1cm4gciA/IHIgOiB4OworCQl9CisJfQorCWlmIChscy0+Y3Rvay0+dHlwZSA9PSBORVdMSU5FKSBscy0+bHR3bmwgPSAxOworCWVsc2UgaWYgKCF0dFdISShscy0+Y3Rvay0+dHlwZSkpIGxzLT5sdHdubCA9IDA7CisJcmV0dXJuIHIgPyByIDogLTE7Cit9CisKKyNpZm5kZWYgU1RBTkRfQUxPTkUKKy8qCisgKiBsbGV4KCkgYW5kIGxleCgpIGFyZSB0aGUgbGV4aW5nIGZ1bmN0aW9ucywgd2hlbiB0aGUgcHJlcHJvY2Vzc29yIGlzCisgKiBsaW5rZWQgdG8gYW5vdGhlciBjb2RlLiBsbGV4KCkgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGJ5IGxleCgpLgorICovCitzdGF0aWMgaW50IGxsZXgoc3RydWN0IGxleGVyX3N0YXRlICpscykKK3sKKwlzdHJ1Y3QgdG9rZW5fZmlmbyAqdGYgPSBscy0+b3V0cHV0X2ZpZm87CisJaW50IHI7CisKKwlpZiAodGYtPm50ICE9IDApIHsKKwkJaWYgKHRmLT5hcnQgPCB0Zi0+bnQpIHsKKyNpZmRlZiBJTk1BQ1JPX0ZMQUcKKwkJCWlmICghbHMtPmlubWFjcm8pIHsKKwkJCQlscy0+aW5tYWNybyA9IDE7CisJCQkJbHMtPm1hY3JvX2NvdW50ICsrOworCQkJfQorI2VuZGlmCisJCQlscy0+Y3RvayA9IHRmLT50ICsgKHRmLT5hcnQgKyspOworCQkJaWYgKGxzLT5jdG9rLT50eXBlID4gRElHUkFQSF9UT0tFTlMKKwkJCQkmJiBscy0+Y3Rvay0+dHlwZSA8IERJR1JBUEhfVE9LRU5TX0VORCkgeworCQkJCWxzLT5jdG9rLT50eXBlID0gdW5kaWcobHMtPmN0b2stPnR5cGUpOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisjaWZkZWYgSU5NQUNST19GTEFHCisJCQlscy0+aW5tYWNybyA9IDA7CisjZW5kaWYKKwkJCWlmICh0Zi0+bnQpIGZyZWVtZW0odGYtPnQpOworCQkJdGYtPmFydCA9IHRmLT5udCA9IDA7CisJCQlnYXJiYWdlX2NvbGxlY3QobHMtPmdmKTsKKwkJCWxzLT5jdG9rID0gbHMtPnNhdmVfY3RvazsKKwkJfQorCisJfQorCXIgPSBjcHAobHMpOworCWlmIChscy0+Y3Rvay0+dHlwZSA+IERJR1JBUEhfVE9LRU5TCisJCSYmIGxzLT5jdG9rLT50eXBlIDwgTEFTVF9NRUFOSU5HRlVMX1RPS0VOKSB7CisJCWxzLT5jdG9rLT50eXBlID0gdW5kaWcobHMtPmN0b2stPnR5cGUpOworCX0KKwlpZiAociA+IDApIHJldHVybiByOworCWlmIChyIDwgMCkgcmV0dXJuIDA7CisJcmV0dXJuIGxsZXgobHMpOworfQorCisvKgorICogbGV4KCkgcmVhZHMgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgcHJvY2Vzc2VkIHN0cmVhbSBhbmQgc3RvcmVzIGl0CisgKiBpbnRvIGxzLT5jdG9rLgorICogcmV0dXJuIHZhbHVlOiBub24gemVybyBvbiBlcnJvciAoaW5jbHVkaW5nIENQUEVSUl9FT0YsIHdoaWNoIGlzIG5vdAorICogcXVpdGUgYW4gZXJyb3IpCisgKi8KK2ludCBsZXgoc3RydWN0IGxleGVyX3N0YXRlICpscykKK3sKKwlpbnQgcjsKKworCWRvIHsKKwkJciA9IGxsZXgobHMpOworI2lmZGVmIFNFTVBFUl9GSURFTElTCisJfSB3aGlsZSAoIXIgJiYgIWxzLT5jb25kY29tcCk7CisjZWxzZQorCX0gd2hpbGUgKCFyICYmICghbHMtPmNvbmRjb21wIHx8ICh0dFdISShscy0+Y3Rvay0+dHlwZSkgJiYKKwkJKCEobHMtPmZsYWdzICYgTElORV9OVU0pIHx8IGxzLT5jdG9rLT50eXBlICE9IE5FV0xJTkUpKSkpOworI2VuZGlmCisJcmV0dXJuIHI7Cit9CisjZW5kaWYKKworLyoKKyAqIGNoZWNrX2NwcF9lcnJvcnMoKSBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBlbmQgb2YgaW5wdXQgaXMgcmVhY2hlZDsKKyAqIGl0IGNoZWNrcyBwZW5kaW5nIGVycm9ycyBkdWUgdG8gdHJ1bmNhdGVkIGNvbnN0cnVjdHMgKGFjdHVhbGx5IG5vbmUsCisgKiB0aGlzIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXZvbHV0aW9ucykuCisgKi8KK2ludCBjaGVja19jcHBfZXJyb3JzKHN0cnVjdCBsZXhlcl9zdGF0ZSAqbHMpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpbml0X2NwcCgpIGluaXRpYWxpemVzIGV2ZXJ5dGhpbmcgdGhhdCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQuCisgKiBJZiBzdGFuZGFyZF9pbmMgaXMgbm9uLXplcm8sIHRoZSBzdGFuZGFyZCBpbmNsdWRlIGRpcmVjdG9yaWVzIGFyZQorICogYWRkZWQgdG8gdGhlIHNlYXJjaCBwYXRoLgorICovCit2b2lkIGluaXRfY3BwKHZvaWQpCit7CisJaW5pdF9jcHBtKCk7CisJaW5pdF9idWZfbGV4ZXJfc3RhdGUoJmRzaGFycF9sZXhlciwgMCk7CisjaWZkZWYgUFJBR01BX1RPS0VOSVpFCisJaW5pdF9idWZfbGV4ZXJfc3RhdGUoJnRva2VuaXplX2xleGVyLCAwKTsKKyNlbmRpZgorfQorCisvKgorICogKHJlKWluaXQgdGhlIGdsb2JhbCB0YWJsZXMuCisgKiBJZiBzdGFuZGFyZF9hc3NlcnRpb25zIGlzIG5vbiAwLCBpbml0IHRoZSBhc3NlcnRpb25zIHRhYmxlLgorICovCit2b2lkIGluaXRfdGFibGVzKGludCB3aXRoX2Fzc2VydGlvbnMpCit7CisJdGltZV90IHQ7CisJc3RydWN0IHRtICpjdDsKKworCXRpbWUoJnQpOworCWN0ID0gbG9jYWx0aW1lKCZ0KTsKKyNpZmRlZiBNU0RPUworCS8qIG5vIGZ1bmN0aW9uIHN0cmZ0aW1lKCkgaW4gVHVyYm9DIDIuMDEgKi8KKwl7CisJCWNoYXIgKmMgPSBhc2N0aW1lKGN0KTsKKworCQljb21waWxlX3RpbWVbMF0gPSAnIic7CisJCW1tdihjb21waWxlX3RpbWUgKyAxLCBjICsgMTEsIDgpOworCQljb21waWxlX3RpbWVbOV0gPSAnIic7CisJCWNvbXBpbGVfdGltZVsxMF0gPSAwOworCQljb21waWxlX2RhdGVbMF0gPSAnIic7CisJCW1tdihjb21waWxlX2RhdGUgKyAxLCBjICsgNCwgNyk7CisJCW1tdihjb21waWxlX2RhdGUgKyA4LCBjICsgMjAsIDQpOworCQljb21waWxlX2RhdGVbMTJdID0gJyInOworCQljb21waWxlX2RhdGVbMTNdID0gMDsKKwl9CisjZWxzZQorCXN0cmZ0aW1lKGNvbXBpbGVfdGltZSwgMTIsICJcIiVIOiVNOiVTXCIiLCBjdCk7CisJc3RyZnRpbWUoY29tcGlsZV9kYXRlLCAyNCwgIlwiJWIgJWQgJVlcIiIsIGN0KTsKKyNlbmRpZgorICBzcHJpbnRmKGNvbXBpbGVfYWRhdGUsIlwiKCUwMmQuJTAyZC4lMDJkKVwiIiwKKyAgICAgICAgICBjdC0+dG1fbWRheSxjdC0+dG1fbW9uKzEsY3QtPnRtX3llYXIlMTAwKTsKKyAgaW5pdF9tYWNyb3MoKTsKKwlpZiAod2l0aF9hc3NlcnRpb25zKSBpbml0X2Fzc2VydGlvbnMoKTsKKwlpbml0X2ZvdW5kX2ZpbGVzKCk7Cit9CisKKy8qCisgKiBSZXNldHMgdGhlIGluY2x1ZGUgcGF0aC4KKyAqLwordm9pZCBpbml0X2luY2x1ZGVfcGF0aChjaGFyICppbmNwYXRoW10pCit7CisJaWYgKGluY2x1ZGVfcGF0aF9uYikgeworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgaW5jbHVkZV9wYXRoX25iOyBpICsrKQorCQkJZnJlZW1lbShpbmNsdWRlX3BhdGhbaV0pOworCQlmcmVlbWVtKGluY2x1ZGVfcGF0aCk7CisJCWluY2x1ZGVfcGF0aF9uYiA9IDA7CisJfQorCWlmIChpbmNwYXRoKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGluY3BhdGhbaV07IGkgKyspCisJCQlhb2woaW5jbHVkZV9wYXRoLCBpbmNsdWRlX3BhdGhfbmIsIGNvbnZlcnRfcGF0aChpbmNwYXRoW2ldKSwgSU5DUEFUSF9NRU1HKTsKKwl9Cit9CisKKy8qCisgKiBhZGRfaW5jcGF0aCgpIGFkZHMgInBhdGgiIHRvIHRoZSBzdGFuZGFyZCBpbmNsdWRlIHBhdGguCisgKi8KK3ZvaWQgYWRkX2luY3BhdGgoY2hhciAqcGF0aCkKK3sKKwlhb2woaW5jbHVkZV9wYXRoLCBpbmNsdWRlX3BhdGhfbmIsIGNvbnZlcnRfcGF0aChwYXRoKSwgSU5DUEFUSF9NRU1HKTsKK30KKworI2lmZGVmIFNUQU5EX0FMT05FCisvKgorICogcHJpbnQgc29tZSBoZWxwCisgKi8KK3N0YXRpYyB2b2lkIHVzYWdlKGNoYXIgKmNvbW1hbmRfbmFtZSkKK3sKKwlmcHJpbnRmKHN0ZGVyciwKKwkiVXNhZ2U6ICVzIFtvcHRpb25zXSBbZmlsZV1cbiIKKwkibGFuZ3VhZ2Ugb3B0aW9uczpcbiIKKwkiICAtQyAgICAgICAgICAgICAga2VlcCBjb21tZW50cyBpbiBvdXRwdXRcbiIKKwkiICAtcyAgICAgICAgICAgICAga2VlcCAnIycgd2hlbiBubyBjcHAgZGlyZWN0aXZlIGlzIHJlY29nbml6ZWRcbiIKKwkiICAtbCAgICAgICAgICAgICAgZG8gbm90IGVtaXQgbGluZSBudW1iZXJzXG4iCisJIiAgLWxnICAgICAgICAgICAgIGVtaXQgZ2NjLWxpa2UgbGluZSBudW1iZXJzXG4iCisJIiAgLUNDICAgICAgICAgICAgIGRpc2FibGUgQysrLWxpa2UgY29tbWVudHNcbiIKKwkiICAtYSwgLW5hLCAtYTAgICAgaGFuZGxlIChvciBub3QpIGFzc2VydGlvbnNcbiIKKwkiICAtViAgICAgICAgICAgICAgZGlzYWJsZSBtYWNyb3Mgd2l0aCBleHRyYSBhcmd1bWVudHNcbiIKKwkiICAtdSAgICAgICAgICAgICAgdW5kZXJzdGFuZCBVVEYtOCBpbiBzb3VyY2VcbiIKKwkiICAtWCAgICAgICAgICAgICAgZW5hYmxlIC1hLCAtdSBhbmQgLVlcbiIKKwkiICAtYzkwICAgICAgICAgICAgbWltaWMgQzkwIGJlaGF2aW91clxuIgorCSIgIC10ICAgICAgICAgICAgICBkaXNhYmxlIHRyaWdyYXBoIHN1cHBvcnRcbiIKKwkid2FybmluZyBvcHRpb25zOlxuIgorCSIgIC13dCAgICAgICAgICAgICBlbWl0IGEgZmluYWwgd2FybmluZyB3aGVuIHRyaWdhcGhzIGFyZSBlbmNvdW50ZXJlZFxuIgorCSIgIC13dHQgICAgICAgICAgICBlbWl0IHdhcm5pbmdzIGZvciBlYWNoIHRyaWdhcGggZW5jb3VudGVyZWRcbiIKKwkiICAtd2EgICAgICAgICAgICAgZW1pdCB3YXJuaW5ncyB0aGF0IGFyZSB1c3VhbGx5IHVzZWxlc3NcbiIKKwkiICAtdzAgICAgICAgICAgICAgZGlzYWJsZSBzdGFuZGFyZCB3YXJuaW5nc1xuIgorCSJkaXJlY3Rvcnkgb3B0aW9uczpcbiIKKwkiICAtSSBkaXJlY3RvcnkgICAgYWRkICdkaXJlY3RvcnknIGJlZm9yZSB0aGUgc3RhbmRhcmQgaW5jbHVkZSBwYXRoXG4iCisJIiAgLUogZGlyZWN0b3J5ICAgIGFkZCAnZGlyZWN0b3J5JyBhZnRlciB0aGUgc3RhbmRhcmQgaW5jbHVkZSBwYXRoXG4iCisJIiAgLXpJICAgICAgICAgICAgIGRvIG5vdCB1c2UgdGhlIHN0YW5kYXJkIGluY2x1ZGUgcGF0aFxuIgorCSIgIC1NICAgICAgICAgICAgICBlbWl0IE1ha2VmaWxlLWxpa2UgZGVwZW5kZW5jaWVzIGluc3RlYWQgb2Ygbm9ybWFsICIKKwkJCSJvdXRwdXRcbiIKKwkiICAtTWEgICAgICAgICAgICAgZW1pdCBhbHNvIGRlcGVuZGFuY2llcyBmb3Igc3lzdGVtIGZpbGVzXG4iCisJIiAgLW8gZmlsZSAgICAgICAgIHN0b3JlIG91dHB1dCBpbiBmaWxlXG4iCisJIm1hY3JvIGFuZCBhc3NlcnRpb24gb3B0aW9uczpcbiIKKwkiICAtRG1hY3JvICAgICAgICAgcHJlZGVmaW5lICdtYWNybydcbiIKKwkiICAtRG1hY3JvPWRlZiAgICAgcHJlZGVmaW5lICdtYWNybycgd2l0aCAnZGVmJyBjb250ZW50XG4iCisJIiAgLVVtYWNybyAgICAgICAgIHVuZGVmaW5lICdtYWNybydcbiIKKwkiICAtQWZvbyhiYXIpICAgICAgYXNzZXJ0IGZvbyhiYXIpXG4iCisJIiAgLUJmb28oYmFyKSAgICAgIHVuYXNzZXJ0IGZvbyhiYXIpXG4iCisJIiAgLVkgICAgICAgICAgICAgIHByZWRlZmluZSBzeXN0ZW0tZGVwZW5kYW50IG1hY3Jvc1xuIgorCSIgIC1aICAgICAgICAgICAgICBkbyBub3QgcHJlZGVmaW5lIHNwZWNpYWwgbWFjcm9zXG4iCisJIiAgLWQgICAgICAgICAgICAgIGVtaXQgZGVmaW5lZCBtYWNyb3NcbiIKKwkiICAtZSAgICAgICAgICAgICAgZW1pdCBhc3NlcnRpb25zXG4iCisJIm1pc2Mgb3B0aW9uczpcbiIKKwkiICAtdiAgICAgICAgICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIHNldHRpbmdzXG4iCisJIiAgLWggICAgICAgICAgICAgIHNob3cgdGhpcyBoZWxwXG4iLAorCWNvbW1hbmRfbmFtZSk7Cit9CisKKy8qCisgKiBwcmludCB2ZXJzaW9uIGFuZCBjb21waWxlLXRpbWUgc2V0dGluZ3MKKyAqLworc3RhdGljIHZvaWQgdmVyc2lvbih2b2lkKQoreworCXNpemVfdCBpOworCisJZnByaW50ZihzdGRlcnIsICJ1Y3BwIHZlcnNpb24gJWQuJWRcbiIsIFZFUlNfTUFKLCBWRVJTX01JTik7CisJZnByaW50ZihzdGRlcnIsICJzZWFyY2ggcGF0aDpcbiIpOworCWZvciAoaSA9IDA7IGkgPCBpbmNsdWRlX3BhdGhfbmI7IGkgKyspCisJCWZwcmludGYoc3RkZXJyLCAiICAlc1xuIiwgaW5jbHVkZV9wYXRoW2ldKTsKK30KKworLyoKKyAqIHBhcnNlX29wdCgpIGluaXRpYWxpemVzIG1hbnkgdGhpbmdzIGFjY29yZGluZyB0byB0aGUgY29tbWFuZC1saW5lCisgKiBvcHRpb25zLgorICogUmV0dXJuIHZhbHVlczoKKyAqIDAgIG9uIHN1Y2Nlc3MKKyAqIDEgIG9uIHNlbWFudGljIGVycm9yIChyZWRlZmluaXRpb24gb2YgYSBzcGVjaWFsIG1hY3JvLCBmb3IgaW5zdGFuY2UpCisgKiAyICBvbiBzeW50YXhpYyBlcnJvciAodW5rbm93biBvcHRpb25zIGZvciBpbnN0YW5jZSkKKyAqLworc3RhdGljIGludCBwYXJzZV9vcHQoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgc3RydWN0IGxleGVyX3N0YXRlICpscykKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKwljaGFyICpmaWxlbmFtZSA9IDA7CisJaW50IHdpdGhfc3RkX2luY3BhdGggPSAxOworCWludCBwcmludF92ZXJzaW9uID0gMCwgcHJpbnRfZGVmcyA9IDAsIHByaW50X2Fzc2VydHMgPSAwOworCWludCBzeXN0ZW1fbWFjcm9zID0gMCwgc3RhbmRhcmRfYXNzZXJ0aW9ucyA9IDE7CisKKwlpbml0X2xleGVyX3N0YXRlKGxzKTsKKwlscy0+ZmxhZ3MgPSBERUZBVUxUX0NQUF9GTEFHUzsKKwllbWl0X291dHB1dCA9IGxzLT5vdXRwdXQgPSBzdGRvdXQ7CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkgKyspIGlmIChhcmd2W2ldWzBdID09ICctJykgeworCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWgiKSkgeworCQkJcmV0dXJuIDI7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLUMiKSkgeworCQkJbHMtPmZsYWdzICY9IH5ESVNDQVJEX0NPTU1FTlRTOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1DQyIpKSB7CisJCQlscy0+ZmxhZ3MgJj0gfkNQTFVTUExVU19DT01NRU5UUzsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItYSIpKSB7CisJCQlscy0+ZmxhZ3MgfD0gSEFORExFX0FTU0VSVElPTlM7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLW5hIikpIHsKKwkJCWxzLT5mbGFncyB8PSBIQU5ETEVfQVNTRVJUSU9OUzsKKwkJCXN0YW5kYXJkX2Fzc2VydGlvbnMgPSAwOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1hMCIpKSB7CisJCQlscy0+ZmxhZ3MgJj0gfkhBTkRMRV9BU1NFUlRJT05TOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1WIikpIHsKKwkJCWxzLT5mbGFncyAmPSB+TUFDUk9fVkFBUkc7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXUiKSkgeworCQkJbHMtPmZsYWdzIHw9IFVURjhfU09VUkNFOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1YIikpIHsKKwkJCWxzLT5mbGFncyB8PSBIQU5ETEVfQVNTRVJUSU9OUzsKKwkJCWxzLT5mbGFncyB8PSBVVEY4X1NPVVJDRTsKKwkJCXN5c3RlbV9tYWNyb3MgPSAxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1jOTAiKSkgeworCQkJbHMtPmZsYWdzICY9IH5NQUNST19WQUFSRzsKKwkJCWxzLT5mbGFncyAmPSB+Q1BMVVNQTFVTX0NPTU1FTlRTOworCQkJYzk5X2NvbXBsaWFudCA9IDA7CisJCQljOTlfaG9zdGVkID0gLTE7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXQiKSkgeworCQkJbHMtPmZsYWdzICY9IH5IQU5ETEVfVFJJR1JBUEhTOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi13dCIpKSB7CisJCQlscy0+ZmxhZ3MgfD0gV0FSTl9UUklHUkFQSFM7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXd0dCIpKSB7CisJCQlscy0+ZmxhZ3MgfD0gV0FSTl9UUklHUkFQSFNfTU9SRTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItd2EiKSkgeworCQkJbHMtPmZsYWdzIHw9IFdBUk5fQU5OT1lJTkc7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXcwIikpIHsKKwkJCWxzLT5mbGFncyAmPSB+V0FSTl9TVEFOREFSRDsKKwkJCWxzLT5mbGFncyAmPSB+V0FSTl9QUkFHTUE7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXMiKSkgeworCQkJbHMtPmZsYWdzICY9IH5GQUlMX1NIQVJQOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1sIikpIHsKKwkJCWxzLT5mbGFncyAmPSB+TElORV9OVU07CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWxnIikpIHsKKwkJCWxzLT5mbGFncyB8PSBHQ0NfTElORV9OVU07CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLU0iKSkgeworCQkJbHMtPmZsYWdzICY9IH5LRUVQX09VVFBVVDsKKwkJCWVtaXRfZGVwZW5kZW5jaWVzID0gMTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItTWEiKSkgeworCQkJbHMtPmZsYWdzICY9IH5LRUVQX09VVFBVVDsKKwkJCWVtaXRfZGVwZW5kZW5jaWVzID0gMjsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItWSIpKSB7CisJCQlzeXN0ZW1fbWFjcm9zID0gMTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItWiIpKSB7CisJCQlub19zcGVjaWFsX21hY3JvcyA9IDE7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWQiKSkgeworCQkJbHMtPmZsYWdzICY9IH5LRUVQX09VVFBVVDsKKwkJCXByaW50X2RlZnMgPSAxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1lIikpIHsKKwkJCWxzLT5mbGFncyAmPSB+S0VFUF9PVVRQVVQ7CisJCQlwcmludF9hc3NlcnRzID0gMTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItekkiKSkgeworCQkJd2l0aF9zdGRfaW5jcGF0aCA9IDA7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLUkiKSB8fCAhc3RyY21wKGFyZ3ZbaV0sICItSiIpKSB7CisJCQlpICsrOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1vIikpIHsKKwkJCWlmICgoKysgaSkgPj0gYXJnYykgeworCQkJCWVycm9yKC0xLCAibWlzc2luZyBmaWxlbmFtZSBhZnRlciAtbyIpOworCQkJCXJldHVybiAyOworCQkJfQorCQkJaWYgKGFyZ3ZbaV1bMF0gPT0gJy0nICYmIGFyZ3ZbaV1bMV0gPT0gMCkgeworCQkJCWVtaXRfb3V0cHV0ID0gbHMtPm91dHB1dCA9IHN0ZG91dDsKKwkJCX0gZWxzZSB7CisJCQkJbHMtPm91dHB1dCA9IGZvcGVuKGFyZ3ZbaV0sICJ3Iik7CisJCQkJaWYgKCFscy0+b3V0cHV0KSB7CisJCQkJCWVycm9yKC0xLCAiZmFpbGVkIHRvIG9wZW4gZm9yICIKKwkJCQkJCSJ3cml0aW5nOiAlcyIsIGFyZ3ZbaV0pOworCQkJCQlyZXR1cm4gMjsKKwkJCQl9CisJCQkJZW1pdF9vdXRwdXQgPSBscy0+b3V0cHV0OworCQkJfQorCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi12IikpIHsKKwkJCXByaW50X3ZlcnNpb24gPSAxOworCQl9IGVsc2UgaWYgKGFyZ3ZbaV1bMV0gIT0gJ0knICYmIGFyZ3ZbaV1bMV0gIT0gJ0onCisJCQkmJiBhcmd2W2ldWzFdICE9ICdEJyAmJiBhcmd2W2ldWzFdICE9ICdVJworCQkJJiYgYXJndltpXVsxXSAhPSAnQScgJiYgYXJndltpXVsxXSAhPSAnQicpCisJCQl3YXJuaW5nKC0xLCAidW5rbm93biBvcHRpb24gJyVzJyIsIGFyZ3ZbaV0pOworCX0gZWxzZSB7CisJCWlmIChmaWxlbmFtZSAhPSAwKSB7CisJCQllcnJvcigtMSwgInNwdXJpb3VzIGZpbGVuYW1lICclcyciLCBhcmd2W2ldKTsKKwkJCXJldHVybiAyOworCQl9CisJCWZpbGVuYW1lID0gYXJndltpXTsKKwl9CisJaW5pdF90YWJsZXMobHMtPmZsYWdzICYgSEFORExFX0FTU0VSVElPTlMpOworCWluaXRfaW5jbHVkZV9wYXRoKDApOworCWlmIChmaWxlbmFtZSkgeworI2lmZGVmIFVDUFBfTU1BUAorCQlGSUxFICpmID0gZm9wZW5fbW1hcF9maWxlKGZpbGVuYW1lKTsKKworCQlscy0+aW5wdXQgPSAwOworCQlpZiAoZikgc2V0X2lucHV0X2ZpbGUobHMsIGYpOworI2Vsc2UKKwkJbHMtPmlucHV0ID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisjZW5kaWYKKwkJaWYgKCFscy0+aW5wdXQpIHsKKwkJCWVycm9yKC0xLCAiZmlsZSAnJXMnIG5vdCBmb3VuZCIsIGZpbGVuYW1lKTsKKwkJCXJldHVybiAxOworCQl9CisjaWZkZWYgTk9fTElCQ19CVUYKKwkJc2V0YnVmKGxzLT5pbnB1dCwgMCk7CisjZW5kaWYKKwkJc2V0X2luaXRfZmlsZW5hbWUoZmlsZW5hbWUsIDEpOworCX0gZWxzZSB7CisJCWxzLT5pbnB1dCA9IHN0ZGluOworCQlzZXRfaW5pdF9maWxlbmFtZSgiPHN0ZGluPiIsIDApOworCX0KKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSArKykKKwkJaWYgKGFyZ3ZbaV1bMF0gPT0gJy0nICYmIGFyZ3ZbaV1bMV0gPT0gJ0knKQorCQkJYWRkX2luY3BhdGgoYXJndltpXVsyXSA/IGFyZ3ZbaV0gKyAyIDogYXJndltpICsgMV0pOworCWlmIChzeXN0ZW1fbWFjcm9zKSBmb3IgKGkgPSAwOyBzeXN0ZW1fbWFjcm9zX2RlZltpXTsgaSArKykKKwkJcmV0ID0gcmV0IHx8IGRlZmluZV9tYWNybyhscywgc3lzdGVtX21hY3Jvc19kZWZbaV0pOworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpICsrKQorCQlpZiAoYXJndltpXVswXSA9PSAnLScgJiYgYXJndltpXVsxXSA9PSAnRCcpCisJCQlyZXQgPSByZXQgfHwgZGVmaW5lX21hY3JvKGxzLCBhcmd2W2ldICsgMik7CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkgKyspCisJCWlmIChhcmd2W2ldWzBdID09ICctJyAmJiBhcmd2W2ldWzFdID09ICdVJykKKwkJCXJldCA9IHJldCB8fCB1bmRlZl9tYWNybyhscywgYXJndltpXSArIDIpOworCWlmIChscy0+ZmxhZ3MgJiBIQU5ETEVfQVNTRVJUSU9OUykgeworCQlpZiAoc3RhbmRhcmRfYXNzZXJ0aW9ucykKKwkJCWZvciAoaSA9IDA7IHN5c3RlbV9hc3NlcnRpb25zX2RlZltpXTsgaSArKykKKwkJCQltYWtlX2Fzc2VydGlvbihzeXN0ZW1fYXNzZXJ0aW9uc19kZWZbaV0pOworCQlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSArKykKKwkJCWlmIChhcmd2W2ldWzBdID09ICctJyAmJiBhcmd2W2ldWzFdID09ICdBJykKKwkJCQlyZXQgPSByZXQgfHwgbWFrZV9hc3NlcnRpb24oYXJndltpXSArIDIpOworCQlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSArKykKKwkJCWlmIChhcmd2W2ldWzBdID09ICctJyAmJiBhcmd2W2ldWzFdID09ICdCJykKKwkJCQlyZXQgPSByZXQgfHwgZGVzdHJveV9hc3NlcnRpb24oYXJndltpXSArIDIpOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpICsrKQorCQkJaWYgKGFyZ3ZbaV1bMF0gPT0gJy0nCisJCQkJJiYgKGFyZ3ZbaV1bMV0gPT0gJ0EnIHx8IGFyZ3ZbaV1bMV0gPT0gJ0InKSkKKwkJCQl3YXJuaW5nKC0xLCAiYXNzZXJ0aW9ucyBkaXNhYmxlZCIpOworCX0KKwlpZiAod2l0aF9zdGRfaW5jcGF0aCkgeworCQlmb3IgKGkgPSAwOyBpbmNsdWRlX3BhdGhfc3RkW2ldOyBpICsrKQorCQkJYWRkX2luY3BhdGgoaW5jbHVkZV9wYXRoX3N0ZFtpXSk7CisJfQorCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpICsrKQorCQlpZiAoYXJndltpXVswXSA9PSAnLScgJiYgYXJndltpXVsxXSA9PSAnSicpCisJCQlhZGRfaW5jcGF0aChhcmd2W2ldWzJdID8gYXJndltpXSArIDIgOiBhcmd2W2kgKyAxXSk7CisKKwlpZiAocHJpbnRfdmVyc2lvbikgeworCQl2ZXJzaW9uKCk7CisJCXJldHVybiAxOworCX0KKwlpZiAocHJpbnRfZGVmcykgeworCQlwcmludF9kZWZpbmVzKCk7CisJCWVtaXRfZGVmaW5lcyA9IDE7CisJfQorCWlmIChwcmludF9hc3NlcnRzICYmIChscy0+ZmxhZ3MgJiBIQU5ETEVfQVNTRVJUSU9OUykpIHsKKwkJcHJpbnRfYXNzZXJ0aW9ucygpOworCQllbWl0X2Fzc2VydGlvbnMgPSAxOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXN0cnVjdCBsZXhlcl9zdGF0ZSBsczsKKwlpbnQgciwgZnIgPSAwOworCisJaW5pdF9jcHAoKTsKKwlpZiAoKHIgPSBwYXJzZV9vcHQoYXJnYywgYXJndiwgJmxzKSkgIT0gMCkgeworCQlpZiAociA9PSAyKSB1c2FnZShhcmd2WzBdKTsKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisJZW50ZXJfZmlsZSgmbHMsIGxzLmZsYWdzKTsKKwl3aGlsZSAoKHIgPSBjcHAoJmxzKSkgPCBDUFBFUlJfRU9GKSBmciA9IGZyIHx8IChyID4gMCk7CisJZnIgPSBmciB8fCBjaGVja19jcHBfZXJyb3JzKCZscyk7CisJaWYgKGxzLmZsYWdzICYgS0VFUF9PVVRQVVQpIHsKKwkJLyogd2hpbGUgKGxzLmxpbmUgPiBscy5vbGluZSkgcHV0X2NoYXIoJmxzLCAnXG4nKTsgKi8KKwkJcHV0X2NoYXIoJmxzLCAnXG4nKTsKKwl9CisJaWYgKGVtaXRfZGVwZW5kZW5jaWVzKSBmcHV0YygnXG4nLCBlbWl0X291dHB1dCk7CisjaWZuZGVmIE5PX1VDUFBfQlVGCisJaWYgKCEobHMuZmxhZ3MgJiBMRVhFUikpIHsKKwkJZmx1c2hfb3V0cHV0KCZscyk7CisJfQorI2VuZGlmCisJaWYgKGxzLmZsYWdzICYgV0FSTl9UUklHUkFQSFMgJiYgbHMuY291bnRfdHJpZ3JhcGhzKQorCQl3YXJuaW5nKDAsICIlbGQgdHJpZ3JhcGhzIGVuY291bnRlcmVkIiwgbHMuY291bnRfdHJpZ3JhcGhzKTsKKwlyZXR1cm4gZnIgPyBFWElUX0ZBSUxVUkUgOiBFWElUX1NVQ0NFU1M7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3VjcHAvY3BwLmggYi91Y3BwL2NwcC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmMGE3MDkKLS0tIC9kZXYvbnVsbAorKysgYi91Y3BwL2NwcC5oCkBAIC0wLDAgKzEsMzE2IEBACisvKgorICogKGMpIFRob21hcyBQb3JuaW4gMTk5OSwgMjAwMAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIAorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiAKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAorICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBVQ1BQX19DUFBfXworI2RlZmluZSBVQ1BQX19DUFBfXworCisvKgorICogVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgaWYgeW91IHdhbnQgdWNwcCB0byB1c2UgZXh0ZXJuYWxseSBwcm92aWRlZAorICogZXJyb3ItcmVwb3J0aW5nIGZ1bmN0aW9ucyAodWNwcF93YXJuaW5nKCksIHVjcHBfZXJyb3IoKSBhbmQgdWNwcF9vdWNoKCkpCisgKi8KKy8qICNkZWZpbmUgTk9fVUNQUF9FUlJPUl9GVU5DVElPTlMgKi8KKworLyoKKyAqIFRva2VucyAoZG8gbm90IGNoYW5nZSB0aGUgb3JkZXIgdW5sZXNzIGNoZWNraW5nIG9wZXJhdG9yc19uYW1lW10gaW4gY3BwLmMpCisgKgorICogSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIHRva2VuIE5PTkUgaXMgMAorICogQ2hlY2sgdGhlIFNUUklOR19UT0tFTiBtYWNybworICovCisjZGVmaW5lIENQUEVSUgk1MTIKK2VudW0geworCU5PTkUsCQkvKiB3aGl0ZXNwYWNlICovCisJTkVXTElORSwJLyogbmV3bGluZSAqLworCUNPTU1FTlQsCS8qIGNvbW1lbnQgKi8KKwlOVU1CRVIsCQkvKiBudW1iZXIgY29uc3RhbnQgKi8KKwlOQU1FLAkJLyogaWRlbnRpZmllciAqLworCUJVTkNILAkJLyogbm9uLUMgY2hhcmFjdGVycyAqLworCVBSQUdNQSwJCS8qIGEgI3ByYWdtYSBkaXJlY3RpdmUgKi8KKwlDT05URVhULAkvKiBuZXcgZmlsZSBvciAjbGluZSAqLworCVNUUklORywJCS8qIGNvbnN0YW50ICJ4eHgiICovCisJQ0hBUiwJCS8qIGNvbnN0YW50ICd4eHgnICovCisJU0xBU0gsCQkvKgkvCSovCisJQVNTTEFTSCwJLyoJLz0JKi8KKwlNSU5VUywJCS8qCS0JKi8KKwlNTUlOVVMsCQkvKgktLQkqLworCUFTTUlOVVMsCS8qCS09CSovCisJQVJST1csCQkvKgktPgkqLworCVBMVVMsCQkvKgkrCSovCisJUFBMVVMsCQkvKgkrKwkqLworCUFTUExVUywJCS8qCSs9CSovCisJTFQsCQkvKgk8CSovCisJTEVRLAkJLyoJPD0JKi8KKwlMU0gsCQkvKgk8PAkqLworCUFTTFNILAkJLyoJPDw9CSovCisJR1QsCQkvKgk+CSovCisJR0VRLAkJLyoJPj0JKi8KKwlSU0gsCQkvKgk+PgkqLworCUFTUlNILAkJLyoJPj49CSovCisJQVNHTiwJCS8qCT0JKi8KKwlTQU1FLAkJLyoJPT0JKi8KKyNpZmRlZiBDQVNUX09QCisJQ0FTVCwJCS8qCT0+CSovCisjZW5kaWYKKwlOT1QsCQkvKgl+CSovCisJTkVRLAkJLyoJIT0JKi8KKwlBTkQsCQkvKgkmCSovCisJTEFORCwJCS8qCSYmCSovCisJQVNBTkQsCQkvKgkmPQkqLworCU9SLAkJLyoJfAkqLworCUxPUiwJCS8qCXx8CSovCisJQVNPUiwJCS8qCXw9CSovCisJUENULAkJLyoJJQkqLworCUFTUENULAkJLyoJJT0JKi8KKwlTVEFSLAkJLyoJKgkqLworCUFTU1RBUiwJCS8qCSo9CSovCisJQ0lSQywJCS8qCV4JKi8KKwlBU0NJUkMsCQkvKglePQkqLworCUxOT1QsCQkvKgkhCSovCisJQVNOT1QsCQkvKgl+PQkqLworCUxCUkEsCQkvKgl7CSovCisJUkJSQSwJCS8qCX0JKi8KKwlMQlJLLAkJLyoJWwkqLworCVJCUkssCQkvKgldCSovCisJTFBBUiwJCS8qCSgJKi8KKwlSUEFSLAkJLyoJKQkqLworCUNPTU1BLAkJLyoJLAkqLworCVFVRVNULAkJLyoJPwkqLworCVNFTUlDLAkJLyoJOwkqLworCUNPTE9OLAkJLyoJOgkqLworCURPVCwJCS8qCS4JKi8KKwlNRE9UUywJCS8qCS4uLgkqLworCVNIQVJQLAkJLyoJIwkqLworCURTSEFSUCwJCS8qCSMjCSovCisKKwlPUFRfTk9ORSwJLyogb3B0aW9uYWwgc3BhY2UgdG8gc2VwYXJhdGUgdG9rZW5zIGluIHRleHQgb3V0cHV0ICovCisKKwlESUdSQVBIX1RPS0VOUywJCQkvKiB0aGVyZSBiZWdpbiBkaWdyYXBoIHRva2VucyAqLworCisJLyogZm9yIERJR18qLCBkbyBub3QgY2hhbmdlIG9yZGVyLCB1bmxlc3MgY2hlY2tpbmcgdW5kaWcoKSBpbiBjcHAuYyAqLworCURJR19MQlJLLAkvKgk8OgkqLworCURJR19SQlJLLAkvKgk6PgkqLworCURJR19MQlJBLAkvKgk8JQkqLworCURJR19SQlJBLAkvKgklPgkqLworCURJR19TSEFSUCwJLyoJJToJKi8KKwlESUdfRFNIQVJQLAkvKgklOiU6CSovCisKKwlESUdSQVBIX1RPS0VOU19FTkQsCQkvKiBkaWdyYXBoIHRva2VucyBlbmQgaGVyZSAqLworCisJTEFTVF9NRUFOSU5HRlVMX1RPS0VOLAkJLyogcmVzZXJ2ZWQgd29yZHMgd2lsbCBnbyB0aGVyZSAqLworCisJTUFDUk9BUkcsCS8qIHNwZWNpYWwgdG9rZW4gZm9yIHJlcHJlc2VudGluZyBtYWNybyBhcmd1bWVudHMgKi8KKworCVVQTFVTID0gQ1BQRVJSLAkvKiB1bmFyeSArICovCisJVU1JTlVTCQkvKiB1bmFyeSAtICovCit9OworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlICJ0dW5lLmgiCisKK3N0cnVjdCB0b2tlbiB7CisJaW50IHR5cGU7CisJbG9uZyBsaW5lOworCWNoYXIgKm5hbWU7Cit9OworCitzdHJ1Y3QgdG9rZW5fZmlmbyB7CisJc3RydWN0IHRva2VuICp0OworCXNpemVfdCBudCwgYXJ0OworfTsKKworc3RydWN0IGxleGVyX3N0YXRlIHsKKwkvKiBpbnB1dCBjb250cm9sICovCisJRklMRSAqaW5wdXQ7CisjaWZuZGVmIE5PX1VDUFBfQlVGCisJdW5zaWduZWQgY2hhciAqaW5wdXRfYnVmOworI2lmZGVmIFVDUFBfTU1BUAorCWludCBmcm9tX21tYXA7CisJdW5zaWduZWQgY2hhciAqaW5wdXRfYnVmX3NhdjsKKyNlbmRpZgorI2VuZGlmCisJdW5zaWduZWQgY2hhciAqaW5wdXRfc3RyaW5nOworCXNpemVfdCBlYnVmOworCXNpemVfdCBwYnVmOworCWludCBsa2FbMl07CisJaW50IG5sa2E7CisJaW50IG1hY2ZpbGU7CisJaW50IGxhc3Q7CisJaW50IGRpc2NhcmQ7CisJdW5zaWduZWQgbG9uZyB1dGY4OworCXVuc2lnbmVkIGNoYXIgY29weV9saW5lW0NPUFlfTElORV9MRU5HVEhdOworCWludCBjbGk7CisKKwkvKiBvdXRwdXQgY29udHJvbCAqLworCisJRklMRSAqb3V0cHV0OworCXN0cnVjdCB0b2tlbl9maWZvICpvdXRwdXRfZmlmbywgKnRvcGxldmVsX29mOworI2lmbmRlZiBOT19VQ1BQX0JVRgorCXVuc2lnbmVkIGNoYXIgKm91dHB1dF9idWY7CisjZW5kaWYKKwlzaXplX3Qgc2J1ZjsKKworCS8qIHRva2VuIGNvbnRyb2wgKi8KKwlzdHJ1Y3QgdG9rZW4gKmN0b2s7CisJc3RydWN0IHRva2VuICpzYXZlX2N0b2s7CisJaW50IHRrbmw7CisJaW50IGx0d25sOworCWludCBwZW5kaW5nX3Rva2VuOworI2lmZGVmIElOTUFDUk9fRkxBRworCWludCBpbm1hY3JvOworCWxvbmcgbWFjcm9fY291bnQ7CisjZW5kaWYKKworCS8qIGxleGVyIG9wdGlvbnMgKi8KKwlsb25nIGxpbmU7CisJbG9uZyBvbGluZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWxvbmcgY291bnRfdHJpZ3JhcGhzOworCXN0cnVjdCBnYXJiYWdlX2ZpZm8gKmdmOworCWludCBpZm5lc3Q7CisJaW50IGNvbmRuZXN0OworCWludCBjb25kY29tcDsKKwlpbnQgY29uZG1ldDsKKwl1bnNpZ25lZCBsb25nIGNvbmRmWzJdOworfTsKKworLyoKKyAqIEZsYWdzIGZvciBzdHJ1Y3QgbGV4ZXJfc3RhdGUKKyAqLworLyogd2FybmluZyBmbGFncyAqLworI2RlZmluZSBXQVJOX1NUQU5EQVJECSAgICAgMHgwMDAwMDFVTAkvKiBlbWl0IHN0YW5kYXJkIHdhcm5pbmdzICovCisjZGVmaW5lIFdBUk5fQU5OT1lJTkcJICAgICAweDAwMDAwMlVMCS8qIGVtaXQgYW5ub3lpbmcgd2FybmluZ3MgKi8KKyNkZWZpbmUgV0FSTl9UUklHUkFQSFMJICAgICAweDAwMDAwNFVMCS8qIHdhcm4gd2hlbiB0cmlncmFwaHMgYXJlIHVzZWQgKi8KKyNkZWZpbmUgV0FSTl9UUklHUkFQSFNfTU9SRSAgMHgwMDAwMDhVTAkvKiBleHRyYS13YXJuIGZvciB0cmlncmFwaHMgKi8KKyNkZWZpbmUgV0FSTl9QUkFHTUEJICAgICAweDAwMDAxMFVMCS8qIHdhcm4gZm9yIHByYWdtYXMgaW4gbm9uLWxleGVyIG1vZGUgKi8KKworLyogZXJyb3IgZmxhZ3MgKi8KKyNkZWZpbmUgRkFJTF9TSEFSUAkgICAgIDB4MDAwMDIwVUwJLyogZW1pdCBlcnJvcnMgb24gcm9ndWUgJyMnICovCisjZGVmaW5lIENDSEFSU0VUCSAgICAgMHgwMDAwNDBVTAkvKiBlbWl0IGVycm9ycyBvbiBub24tQyBjaGFyYWN0ZXJzICovCisKKy8qIGVtaXNzaW9uIGZsYWdzICovCisjZGVmaW5lIERJU0NBUkRfQ09NTUVOVFMgICAgIDB4MDAwMDgwVUwJLyogZGlzY2FyZCBjb21tZW50cyBmcm9tIHRleHQgb3V0cHV0ICovCisjZGVmaW5lIENQTFVTUExVU19DT01NRU5UUyAgIDB4MDAwMTAwVUwJLyogdW5kZXJzdGFuZCBDKystbGlrZSBjb21tZW50cyAqLworI2RlZmluZSBMSU5FX05VTQkgICAgIDB4MDAwMjAwVUwJLyogZW1pdCAjbGluZSBkaXJlY3RpdmVzIGluIG91dHB1dCAqLworI2RlZmluZSBHQ0NfTElORV9OVU0JICAgICAweDAwMDQwMFVMCS8qIHNhbWUgYXMgI2xpbmUsIHdpdGggZ2NjLXN5bnRheCAqLworCisvKiBsYW5ndWFnZSBmbGFncyAqLworI2RlZmluZSBIQU5ETEVfQVNTRVJUSU9OUyAgICAweDAwMDgwMFVMCS8qIHVuZGVyc3RhbmQgYXNzZXJ0aW9ucyAqLworI2RlZmluZSBIQU5ETEVfUFJBR01BCSAgICAgMHgwMDEwMDBVTAkvKiBlbWl0IFBSQUdNQSB0b2tlbnMgaW4gbGV4ZXIgbW9kZSAqLworI2RlZmluZSBNQUNST19WQUFSRwkgICAgIDB4MDAyMDAwVUwJLyogdW5kZXJzdGFuZCBtYWNyb3Mgd2l0aCAnLi4uJyAqLworI2RlZmluZSBVVEY4X1NPVVJDRQkgICAgIDB4MDA0MDAwVUwJLyogaWRlbnRpZmllcnMgYXJlIGluIFVURjggZW5jb2RpbmcgKi8KKyNkZWZpbmUgSEFORExFX1RSSUdSQVBIUyAgICAgMHgwMDgwMDBVTAkvKiBoYW5kbGUgdHJpZ3JhcGhzICovCisKKy8qIGdsb2JhbCB1Y3BwIGJlaGF2aW91ciAqLworI2RlZmluZSBMRVhFUgkJICAgICAweDAxMDAwMFVMCS8qIGJlaGF2ZSBhcyBhIGxleGVyICovCisjZGVmaW5lIEtFRVBfT1VUUFVUCSAgICAgMHgwMjAwMDBVTAkvKiBlbWl0IHRoZSByZXN1bHQgb2YgcHJlcHJvY2Vzc2luZyAqLworI2RlZmluZSBDT1BZX0xJTkUJICAgICAweDA0MDAwMFVMIC8qIG1ha2UgYSBjb3B5IG9mIHRoZSBwYXJzZWQgbGluZSAqLworCisvKiBpbnRlcm5hbCBmbGFncyAqLworI2RlZmluZSBSRUFEX0FHQUlOCSAgICAgMHgwODAwMDBVTAkvKiBlbWl0IGFnYWluIHRoZSBsYXN0IHRva2VuICovCisjZGVmaW5lIFRFWFRfT1VUUFVUCSAgICAgMHgxMDAwMDBVTAkvKiBvdXRwdXQgdGV4dCAqLworCisvKgorICogUHVibGljIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLworCisjaWZuZGVmIE5PX1VDUFBfQlVGCit2b2lkIGZsdXNoX291dHB1dChzdHJ1Y3QgbGV4ZXJfc3RhdGUgKik7CisjZW5kaWYKKwordm9pZCBpbml0X2Fzc2VydGlvbnModm9pZCk7CitpbnQgbWFrZV9hc3NlcnRpb24oY2hhciAqKTsKK2ludCBkZXN0cm95X2Fzc2VydGlvbihjaGFyICopOwordm9pZCBwcmludF9hc3NlcnRpb25zKHZvaWQpOworCit2b2lkIGluaXRfbWFjcm9zKHZvaWQpOworaW50IGRlZmluZV9tYWNybyhzdHJ1Y3QgbGV4ZXJfc3RhdGUgKiwgY2hhciAqKTsKK2ludCB1bmRlZl9tYWNybyhzdHJ1Y3QgbGV4ZXJfc3RhdGUgKiwgY2hhciAqKTsKK3ZvaWQgcHJpbnRfZGVmaW5lcyh2b2lkKTsKKwordm9pZCBzZXRfaW5pdF9maWxlbmFtZShjaGFyICosIGludCk7Cit2b2lkIGluaXRfY3BwKHZvaWQpOwordm9pZCBpbml0X2luY2x1ZGVfcGF0aChjaGFyICpbXSk7Cit2b2lkIGluaXRfbGV4ZXJfc3RhdGUoc3RydWN0IGxleGVyX3N0YXRlICopOwordm9pZCBpbml0X2xleGVyX21vZGUoc3RydWN0IGxleGVyX3N0YXRlICopOwordm9pZCBmcmVlX2xleGVyX3N0YXRlKHN0cnVjdCBsZXhlcl9zdGF0ZSAqKTsKK2ludCBsZXgoc3RydWN0IGxleGVyX3N0YXRlICopOworaW50IGNoZWNrX2NwcF9lcnJvcnMoc3RydWN0IGxleGVyX3N0YXRlICopOwordm9pZCBhZGRfaW5jcGF0aChjaGFyICopOwordm9pZCBpbml0X3RhYmxlcyhpbnQpOwordm9pZCBlbnRlcl9maWxlKHN0cnVjdCBsZXhlcl9zdGF0ZSAqLCB1bnNpZ25lZCBsb25nKTsKK2ludCBjcHAoc3RydWN0IGxleGVyX3N0YXRlICopOworCisjaWZkZWYgVUNQUF9NTUFQCitGSUxFICpmb3Blbl9tbWFwX2ZpbGUoY2hhciAqKTsKK3ZvaWQgc2V0X2lucHV0X2ZpbGUoc3RydWN0IGxleGVyX3N0YXRlICosIEZJTEUgKik7CisjZW5kaWYKKworc3RydWN0IHN0YWNrX2NvbnRleHQgeworCWNoYXIgKmxvbmdfbmFtZSwgKm5hbWU7CisJbG9uZyBsaW5lOworfTsKK3N0cnVjdCBzdGFja19jb250ZXh0ICpyZXBvcnRfY29udGV4dCh2b2lkKTsKKworZXh0ZXJuIGludCBub19zcGVjaWFsX21hY3Jvcywgc3lzdGVtX21hY3JvcywKKwllbWl0X2RlcGVuZGVuY2llcywgZW1pdF9kZWZpbmVzLCBlbWl0X2Fzc2VydGlvbnM7CitleHRlcm4gaW50IGM5OV9jb21wbGlhbnQsIGM5OV9ob3N0ZWQ7CitleHRlcm4gRklMRSAqZW1pdF9vdXRwdXQ7CitleHRlcm4gY2hhciAqY3VycmVudF9maWxlbmFtZSwgKmN1cnJlbnRfbG9uZ19maWxlbmFtZTsKK2V4dGVybiBjaGFyICpvcGVyYXRvcnNfbmFtZVtdOworZXh0ZXJuIHN0cnVjdCBwcm90ZWN0IHsKKwljaGFyICptYWNybzsKKwlpbnQgc3RhdGU7CisJc3RydWN0IGZvdW5kX2ZpbGUgKmZmOworfSBwcm90ZWN0X2RldGVjdDsKKwordm9pZCB1Y3BwX291Y2goY2hhciAqLCAuLi4pOwordm9pZCB1Y3BwX2Vycm9yKGxvbmcsIGNoYXIgKiwgLi4uKTsKK3ZvaWQgdWNwcF93YXJuaW5nKGxvbmcsIGNoYXIgKiwgLi4uKTsKKworZXh0ZXJuIGludCAqdHJhbnNpZW50X2NoYXJhY3RlcnM7CisKKy8qCisgKiBFcnJvcnMgZnJvbSBDUFBFUlJfRU9GIGFuZCBhYm92ZSBhcmUgbm90IHJlYWwgZXJyb3MsIG9ubHkgc2hvdy1zdG9wcGVycy4KKyAqIEVycm9ycyBiZWxvdyBDUFBFUlJfRU9GIGFyZSByZWFsIG9uZXMuCisgKi8KKyNkZWZpbmUgQ1BQRVJSX05FU1QJIDkwMAorI2RlZmluZSBDUFBFUlJfRU9GCTEwMDAKKworLyoKKyAqIFRoaXMgbWFjcm8gdGVsbHMgd2hldGhlciB0aGUgbmFtZSBmaWVsZCBvZiBhIGdpdmVuIHRva2VuIHR5cGUgaXMKKyAqIHJlbGV2YW50LCBvciBub3QuIElycmVsZXZhbnQgbmFtZSBmaWVsZCBtZWFucyB0aGF0IGl0IG1pZ2h0IHBvaW50CisgKiB0byBvdXRlcnNwYWNlLgorICovCisjaWZkZWYgU0VNUEVSX0ZJREVMSVMKKyNkZWZpbmUgU1RSSU5HX1RPS0VOKHgpICAgICgoeCkgPT0gTk9ORSB8fCAoKHgpID49IENPTU1FTlQgJiYgKHgpIDw9IENIQVIpKQorI2Vsc2UKKyNkZWZpbmUgU1RSSU5HX1RPS0VOKHgpICAgICgoeCkgPj0gTlVNQkVSICYmICh4KSA8PSBDSEFSKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdWNwcC9ldmFsLmMgYi91Y3BwL2V2YWwuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MzE5YjA5Ci0tLSAvZGV2L251bGwKKysrIGIvdWNwcC9ldmFsLmMKQEAgLTAsMCArMSwxMDg3IEBACisvKgorICogKGMpIFRob21hcyBQb3JuaW4gMTk5OSwgMjAwMAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAorICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAidWNwcGkuaCIKKyNpbmNsdWRlICJ0dW5lLmgiCisjaW5jbHVkZSAibWVtLmgiCisKK0pNUF9CVUYgZXZhbF9leGNlcHRpb247Citsb25nIGV2YWxfbGluZTsKK3N0YXRpYyBpbnQgZW1pdF9ldmFsX3dhcm5pbmdzOworCisvKgorICogSWYgeW91IHdhbnQgdG8gaGFyZGNvZGUgYSBjb252ZXJzaW9uIHRhYmxlLCBkZWZpbmUgYSBzdGF0aWMgYXJyYXkKKyAqIG9mIDI1NiBpbnQsIGFuZCBtYWtlIHRyYW5zaWVudF9jaGFyYWN0ZXJzIHBvaW50IHRvIGl0LgorICovCitpbnQgKnRyYW5zaWVudF9jaGFyYWN0ZXJzID0gMDsKKworI2RlZmluZSBPQ1RBTCh4KQkoKHgpID49ICcwJyAmJiAoeCkgPD0gJzcnKQorI2RlZmluZSBERUNJTSh4KQkoKHgpID49ICcwJyAmJiAoeCkgPD0gJzknKQorI2RlZmluZSBIRVhBRCh4KQkoKCh4KSA+PSAnMCcgJiYgKHgpIDw9ICc5JykgXAorCQkJfHwgKHgpID09ICdhJyB8fCAoeCkgPT0gJ2InIHx8ICh4KSA9PSAnYycgXAorCQkJfHwgKHgpID09ICdkJyB8fCAoeCkgPT0gJ2UnIHx8ICh4KSA9PSAnZicgXAorCQkJfHwgKHgpID09ICdBJyB8fCAoeCkgPT0gJ0InIHx8ICh4KSA9PSAnQycgXAorCQkJfHwgKHgpID09ICdEJyB8fCAoeCkgPT0gJ0UnIHx8ICh4KSA9PSAnRicpCisjZGVmaW5lIE9WQUwoeCkJCSgoaW50KSgoeCkgLSAnMCcpKQorI2RlZmluZSBEVkFMKHgpCQkoKGludCkoKHgpIC0gJzAnKSkKKyNkZWZpbmUgSFZBTCh4KQkJKERFQ0lNKHgpID8gRFZBTCh4KSBcCisJCQk6ICh4KSA9PSAnYScgfHwgKHgpID09ICdBJyA/IDEwIFwKKwkJCTogKHgpID09ICdiJyB8fCAoeCkgPT0gJ0InID8gMTEgXAorCQkJOiAoeCkgPT0gJ2MnIHx8ICh4KSA9PSAnQycgPyAxMiBcCisJCQk6ICh4KSA9PSAnZCcgfHwgKHgpID09ICdEJyA/IDEzIFwKKwkJCTogKHgpID09ICdlJyB8fCAoeCkgPT0gJ0UnID8gMTQgOiAxNSkKKworI2lmICFkZWZpbmVkKE5BVElWRV9VSU5UTUFYKSAmJiAhZGVmaW5lZChTSU1VTF9VSU5UTUFYKQorIyAgaWYgX19TVERDX18gJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjICAgIGluY2x1ZGUgPHN0ZGludC5oPgorIyAgICBkZWZpbmUgTkFUSVZFX1VJTlRNQVggdWludG1heF90CisjICAgIGRlZmluZSBOQVRJVkVfSU5UTUFYIGludG1heF90CisjICBlbHNlCisjICAgIGRlZmluZSBOQVRJVkVfVUlOVE1BWCB1bnNpZ25lZCBsb25nCisjICAgIGRlZmluZSBOQVRJVkVfSU5UTUFYIGxvbmcKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIE5BVElWRV9VSU5UTUFYCisKK3R5cGVkZWYgTkFUSVZFX1VJTlRNQVggdWNwcHVsb25nOwordHlwZWRlZiBOQVRJVkVfSU5UTUFYIHVjcHBzbG9uZzsKKworI2RlZmluZSB0b191bG9uZyh4KQkJKCh1Y3BwdWxvbmcpKHgpKQorI2RlZmluZSB0b19zbG9uZyh4KQkJKCh1Y3Bwc2xvbmcpKHgpKQorCisjZGVmaW5lIG9wX3N0YXJfdSh4LCB5KQkJKCh4KSAqICh5KSkKKworc3RhdGljIGlubGluZSB1Y3BwdWxvbmcgb3Bfc2xhc2hfdSh1Y3BwdWxvbmcgeCwgdWNwcHVsb25nIHkpCit7CisJaWYgKHkgPT0gMCkgeworCQllcnJvcihldmFsX2xpbmUsICJkaXZpc2lvbiBieSAwIik7CisJCXRocm93KGV2YWxfZXhjZXB0aW9uKTsKKwl9CisJcmV0dXJuIHggLyB5OworfQorCitzdGF0aWMgaW5saW5lIHVjcHB1bG9uZyBvcF9wY3RfdSh1Y3BwdWxvbmcgeCwgdWNwcHVsb25nIHkpCit7CisJaWYgKHkgPT0gMCkgeworCQllcnJvcihldmFsX2xpbmUsICJkaXZpc2lvbiBieSAwIik7CisJCXRocm93KGV2YWxfZXhjZXB0aW9uKTsKKwl9CisJcmV0dXJuIHggJSB5OworfQorCisjZGVmaW5lIG9wX3BsdXNfdSh4LCB5KQkJKCh4KSArICh5KSkKKyNkZWZpbmUgb3BfbWludXNfdSh4LCB5KQkoKHgpIC0gKHkpKQorI2RlZmluZSBvcF9uZWdfdSh4KQkJKC0oeCkpCisjZGVmaW5lIG9wX2xzaF91KHgsIHkpCQkoKHgpIDw8ICh5KSkKKyNkZWZpbmUgb3BfcnNoX3UoeCwgeSkJCSgoeCkgPj4gKHkpKQorI2RlZmluZSBvcF9sdF91KHgsIHkpCQkoKHgpIDwgKHkpKQorI2RlZmluZSBvcF9sZXFfdSh4LCB5KQkJKCh4KSA8PSAoeSkpCisjZGVmaW5lIG9wX2d0X3UoeCwgeSkJCSgoeCkgPiAoeSkpCisjZGVmaW5lIG9wX2dlcV91KHgsIHkpCQkoKHgpID49ICh5KSkKKyNkZWZpbmUgb3Bfc2FtZV91KHgsIHkpCQkoKHgpID09ICh5KSkKKyNkZWZpbmUgb3BfbmVxX3UoeCwgeSkJCSgoeCkgIT0gKHkpKQorI2RlZmluZSBvcF9hbmRfdSh4LCB5KQkJKCh4KSAmICh5KSkKKyNkZWZpbmUgb3BfY2lyY191KHgsIHkpCQkoKHgpIF4gKHkpKQorI2RlZmluZSBvcF9vcl91KHgsIHkpCQkoKHgpIHwgKHkpKQorI2RlZmluZSBvcF9sdmFsX3UoeCkJCSgoeCkgIT0gMCkKKyNkZWZpbmUgb3BfbG5vdF91KHgpCQkoISh4KSkKKyNkZWZpbmUgb3Bfbm90X3UoeCkJCSh+KHgpKQorI2RlZmluZSBvcF91cGx1c191KHgpCQkoeCkKKyNkZWZpbmUgb3BfdW1pbnVzX3UoeCkJCW9wX25lZ191KHgpCisKKyNkZWZpbmUgb3Bfc3Rhcl9zKHgsIHkpCQkoKHgpICogKHkpKQorCitzdGF0aWMgaW5saW5lIHVjcHBzbG9uZyBvcF9zbGFzaF9zKHVjcHBzbG9uZyB4LCB1Y3Bwc2xvbmcgeSkKK3sKKwlpZiAoeSA9PSAwKSB7CisJCWVycm9yKGV2YWxfbGluZSwgImRpdmlzaW9uIGJ5IDAiKTsKKwkJdGhyb3coZXZhbF9leGNlcHRpb24pOworCX0KKwlyZXR1cm4geCAvIHk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWNwcHNsb25nIG9wX3BjdF9zKHVjcHBzbG9uZyB4LCB1Y3Bwc2xvbmcgeSkKK3sKKwlpZiAoeSA9PSAwKSB7CisJCWVycm9yKGV2YWxfbGluZSwgImRpdmlzaW9uIGJ5IDAiKTsKKwkJdGhyb3coZXZhbF9leGNlcHRpb24pOworCX0KKwlyZXR1cm4geCAlIHk7Cit9CisKKyNkZWZpbmUgb3BfcGx1c19zKHgsIHkpCQkoKHgpICsgKHkpKQorI2RlZmluZSBvcF9taW51c19zKHgsIHkpCSgoeCkgLSAoeSkpCisjZGVmaW5lIG9wX25lZ19zKHgpCQkoLSh4KSkKKyNkZWZpbmUgb3BfbHNoX3MoeCwgeSkJCSgoeCkgPDwgKHkpKQorI2RlZmluZSBvcF9yc2hfcyh4LCB5KQkJKCh4KSA+PiAoeSkpCisjZGVmaW5lIG9wX2x0X3MoeCwgeSkJCSgoeCkgPCAoeSkpCisjZGVmaW5lIG9wX2xlcV9zKHgsIHkpCQkoKHgpIDw9ICh5KSkKKyNkZWZpbmUgb3BfZ3Rfcyh4LCB5KQkJKCh4KSA+ICh5KSkKKyNkZWZpbmUgb3BfZ2VxX3MoeCwgeSkJCSgoeCkgPj0gKHkpKQorI2RlZmluZSBvcF9zYW1lX3MoeCwgeSkJCSgoeCkgPT0gKHkpKQorI2RlZmluZSBvcF9uZXFfcyh4LCB5KQkJKCh4KSAhPSAoeSkpCisjZGVmaW5lIG9wX2FuZF9zKHgsIHkpCQkoKHgpICYgKHkpKQorI2RlZmluZSBvcF9jaXJjX3MoeCwgeSkJCSgoeCkgXiAoeSkpCisjZGVmaW5lIG9wX29yX3MoeCwgeSkJCSgoeCkgfCAoeSkpCisjZGVmaW5lIG9wX2x2YWxfcyh4KQkJKCh4KSAhPSAwKQorI2RlZmluZSBvcF9sbm90X3MoeCkJCSghKHgpKQorI2RlZmluZSBvcF9ub3Rfcyh4KQkJKH4oeCkpCisjZGVmaW5lIG9wX3VwbHVzX3MoeCkJCSh4KQorI2RlZmluZSBvcF91bWludXNfcyh4KQkJb3BfbmVnX3MoeCkKKworI2RlZmluZSBvcF9wcm9tbyh4KQkJKCh1Y3BwdWxvbmcpeCkKKyNkZWZpbmUgYmFja191bG9uZyh4KQkJKCh1bnNpZ25lZCBsb25nKXgpCisKKyNlbHNlCisKKy8qCisgKiBXZSBzdXBwb3NlIHRoYXQgdGhlIHVuc2lnbmVkIGxvbmcgaXMgbm90IHBhZGRlZCBpbiBpdHMgbWVtb3J5CisgKiByZXByZXNlbnRhdGlvbiwgYW5kIHRoYXQgaXQgaGFzIGFuIGV2ZW4gYmluYXJ5IGxlbmd0aC4KKyAqCisgKiBXZSBjb3VsZCBleHBsb3JlIHRoZSBzaXplIG9mIFVMT05HX01BWCB3aXRoIHNvbWUgZGljaG90b21pYworICogdHJpY2sgdXNpbmcgYSByZWN1cnNpdmUgI2luY2x1ZGUsIGJ1dCB0aGlzIHdvdWxkIGJlIHJlYWxseSB1Z2x5LgorICovCisjZGVmaW5lIExPTkdTSVpFCShDSEFSX0JJVCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkKKyNkZWZpbmUgSEFMRkxPTkdTSVpFCShMT05HU0laRSAvIDIpCisjZGVmaW5lIEhVTF9NQVNLCSgoMVVMIDw8IEhBTEZMT05HU0laRSkgLSAxKQorI2RlZmluZSBVTF9NUyh4KQkoKCh4KSA+PiBIQUxGTE9OR1NJWkUpICYgSFVMX01BU0spCisjZGVmaW5lIFVMX0xTKHgpCSgoeCkgJiBIVUxfTUFTSykKKyNkZWZpbmUgU0lHTkJJVCh4KQkoKHgpICYgKDFVTCA8PCAoTE9OR1NJWkUgLSAxKSkpCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIG1zdywgbHN3OworfSB1Y3BwdWxvbmc7CisKKyNkZWZpbmUgdWNwcHNsb25nCXVjcHB1bG9uZworCitzdGF0aWMgdWNwcHVsb25nIHRvX3Vsb25nKHVuc2lnbmVkIGxvbmcgeCkKK3sKKwl1Y3BwdWxvbmcgeTsKKworCXkubXN3ID0gMDsKKwl5LmxzdyA9IHg7CisJcmV0dXJuIHk7Cit9CisKK3N0YXRpYyB1Y3Bwc2xvbmcgdG9fc2xvbmcobG9uZyB4KQoreworCXVjcHBzbG9uZyB5OworCisJeS5sc3cgPSB4OworCXkubXN3ID0geCA+PSAwID8gMCA6ICh1bnNpZ25lZCBsb25nKSgtMSk7CisJcmV0dXJuIHk7Cit9CisKK3N0YXRpYyB1Y3BwdWxvbmcgb3BfcGx1c191KHVjcHB1bG9uZyB4LCB1Y3BwdWxvbmcgeSkKK3sKKwl1Y3BwdWxvbmcgejsKKworCXoubHN3ID0geC5sc3cgKyB5LmxzdzsKKwl6Lm1zdyA9IHgubXN3ICsgeS5tc3c7CisJaWYgKHoubHN3IDwgeC5sc3cpIHoubXN3ICsrOworCXJldHVybiB6OworfQorCitzdGF0aWMgdWNwcHVsb25nIG9wX25lZ191KHVjcHB1bG9uZyB4KQoreworCXVjcHB1bG9uZyB6OworCisJei5sc3cgPSB+eC5sc3c7CisJei5tc3cgPSB+eC5tc3c7CisJaWYgKCEoKysgei5sc3cpKSB6Lm1zdyArKzsKKwlyZXR1cm4gejsKK30KKworI2RlZmluZSBvcF9taW51c191KHgsIHkpCW9wX3BsdXNfdSh4LCBvcF9uZWdfdSh5KSkKKworc3RhdGljIHVjcHB1bG9uZyBvcF9sc2hfdSh1Y3BwdWxvbmcgeCwgaW50IHMpCit7CisJdWNwcHVsb25nIHo7CisKKwlzICU9ICgyICogTE9OR1NJWkUpOworCWlmIChzID09IDApIHJldHVybiB4OworCWlmIChzID49IExPTkdTSVpFKSB7CisJCXoubHN3ID0gMDsKKwkJei5tc3cgPSB4LmxzdzsKKwkJcmV0dXJuIG9wX2xzaF91KHosIHMgLSBMT05HU0laRSk7CisJfQorCXoubHN3ID0gKHgubHN3IDw8IHMpOworCXoubXN3ID0gKHgubXN3IDw8IHMpIHwgKHgubHN3ID4+IChMT05HU0laRSAtIHMpKTsKKwlyZXR1cm4gejsKK30KKworc3RhdGljIHVjcHB1bG9uZyBvcF9yc2hfdSh1Y3BwdWxvbmcgeCwgaW50IHMpCit7CisJdWNwcHVsb25nIHo7CisKKwlzICU9ICgyICogTE9OR1NJWkUpOworCWlmIChzID09IDApIHJldHVybiB4OworCWlmIChzID49IExPTkdTSVpFKSB7CisJCXoubXN3ID0gMDsKKwkJei5sc3cgPSB4Lm1zdzsKKwkJcmV0dXJuIG9wX3JzaF91KHosIHMgLSBMT05HU0laRSk7CisJfQorCXoubHN3ID0gKHgubHN3ID4+IHMpIHwgKHgubXN3IDw8IChMT05HU0laRSAtIHMpKTsKKwl6Lm1zdyA9ICh4Lm1zdyA+PiBzKTsKKwlyZXR1cm4gejsKK30KKworc3RhdGljIGludCBvcF9sdF91KHVjcHB1bG9uZyB4LCB1Y3BwdWxvbmcgeSkKK3sKKwlpZiAoeC5tc3cgPCB5Lm1zdykgcmV0dXJuIDE7CisJaWYgKHgubXN3ID4geS5tc3cpIHJldHVybiAwOworCWlmICh4LmxzdyA8IHkubHN3KSByZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcF9sZXFfdSh1Y3BwdWxvbmcgeCwgdWNwcHVsb25nIHkpCit7CisJaWYgKHgubXN3IDwgeS5tc3cpIHJldHVybiAxOworCWlmICh4Lm1zdyA+IHkubXN3KSByZXR1cm4gMDsKKwlpZiAoeC5sc3cgPD0geS5sc3cpIHJldHVybiAxOworCXJldHVybiAwOworfQorCisjZGVmaW5lIG9wX2d0X3UoeCwgeSkJb3BfbHRfdSh5LCB4KQorI2RlZmluZSBvcF9nZXFfdSh4LCB5KQlvcF9sZXFfdSh5LCB4KQorCitzdGF0aWMgaW50IG9wX3NhbWVfdSh1Y3BwdWxvbmcgeCwgdWNwcHVsb25nIHkpCit7CisJcmV0dXJuIHgubXN3ID09IHkubXN3ICYmIHgubHN3ID09IHkubHN3OworfQorCisjZGVmaW5lIG9wX25lcV91KHgsIHkpCSghb3Bfc2FtZV91KHgsIHkpKQorCitzdGF0aWMgdWNwcHVsb25nIG9wX2FuZF91KHVjcHB1bG9uZyB4LCB1Y3BwdWxvbmcgeSkKK3sKKwl1Y3BwdWxvbmcgejsKKworCXoubHN3ID0geC5sc3cgJiB5LmxzdzsKKwl6Lm1zdyA9IHgubXN3ICYgeS5tc3c7CisJcmV0dXJuIHo7Cit9CisKK3N0YXRpYyB1Y3BwdWxvbmcgb3BfY2lyY191KHVjcHB1bG9uZyB4LCB1Y3BwdWxvbmcgeSkKK3sKKwl1Y3BwdWxvbmcgejsKKworCXoubHN3ID0geC5sc3cgXiB5LmxzdzsKKwl6Lm1zdyA9IHgubXN3IF4geS5tc3c7CisJcmV0dXJuIHo7Cit9CisKK3N0YXRpYyB1Y3BwdWxvbmcgb3Bfb3JfdSh1Y3BwdWxvbmcgeCwgdWNwcHVsb25nIHkpCit7CisJdWNwcHVsb25nIHo7CisKKwl6LmxzdyA9IHgubHN3IHwgeS5sc3c7CisJei5tc3cgPSB4Lm1zdyB8IHkubXN3OworCXJldHVybiB6OworfQorCisjZGVmaW5lIG9wX2x2YWxfdSh4KQlvcF9uZXFfdSh4LCB0b191bG9uZygwKSkKKyNkZWZpbmUgb3BfbG5vdF91KHgpCSghb3BfbHZhbF91KHgpKQorCitzdGF0aWMgdWNwcHVsb25nIG9wX25vdF91KHVjcHB1bG9uZyB4KQoreworCXVjcHB1bG9uZyB6OworCisJei5sc3cgPSB+eC5sc3c7CisJei5tc3cgPSB+eC5tc3c7CisJcmV0dXJuIHo7Cit9CisKKyNkZWZpbmUgb3BfdXBsdXNfdSh4KQkoeCkKKyNkZWZpbmUgb3BfdW1pbnVzX3UoeCkJb3BfbmVnX3UoeCkKKworc3RhdGljIHVjcHB1bG9uZyB1bXVsKHVuc2lnbmVkIGxvbmcgeCwgdW5zaWduZWQgbG9uZyB5KQoreworCXVjcHB1bG9uZyB6OworCXVuc2lnbmVkIGxvbmcgdDAwLCB0MDEsIHQxMCwgdDExLCBjID0gMCwgdDsKKworCXQwMCA9IFVMX0xTKHgpICogVUxfTFMoeSk7CisJdDAxID0gVUxfTFMoeCkgKiBVTF9NUyh5KTsKKwl0MTAgPSBVTF9NUyh4KSAqIFVMX0xTKHkpOworCXQxMSA9IFVMX01TKHgpICogVUxfTVMoeSk7CisJdCA9IHoubHN3ID0gdDAwOworCWlmICh0ID4gKHoubHN3ICs9IChVTF9MUyh0MDEpIDw8IEhBTEZMT05HU0laRSkpKSBjICsrOworCXQgPSB6LmxzdzsKKwlpZiAodCA+ICh6LmxzdyArPSAoVUxfTFModDEwKSA8PCBIQUxGTE9OR1NJWkUpKSkgYyArKzsKKwl6Lm1zdyA9IHQxMSArIFVMX01TKHQxMCkgKyBVTF9NUyh0MDEpICsgYzsKKwlyZXR1cm4gejsKK30KKworc3RhdGljIHVjcHB1bG9uZyBvcF9zdGFyX3UodWNwcHVsb25nIHgsIHVjcHB1bG9uZyB5KQoreworCXVjcHB1bG9uZyB6MSwgejI7CisKKwl6MS5sc3cgPSB6Mi5sc3cgPSAwOworCXoxLm1zdyA9IHgubHN3ICogeS5tc3c7CisJejIubXN3ID0geC5tc3cgKiB5LmxzdzsKKwlyZXR1cm4gb3BfcGx1c191KHVtdWwoeC5sc3csIHkubHN3KSwgb3BfcGx1c191KHoxLCB6MikpOworfQorCitzdGF0aWMgdm9pZCB1ZGl2KHVjcHB1bG9uZyB4LCB1Y3BwdWxvbmcgeSwgdWNwcHVsb25nICpxLCB1Y3BwdWxvbmcgKnIpCit7CisJaW50IGksIGo7CisKKwkqcSA9IHRvX3Vsb25nKDApOworCWZvciAoaSA9IDIgKiBMT05HU0laRSAtIDE7IGkgPj0gMDsgaSAtLSkgeworCQlpZiAoaSA+PSBMT05HU0laRSAmJiAoeS5tc3cgJiAoMVVMIDw8IChpIC0gTE9OR1NJWkUpKSkpIGJyZWFrOworCQlpZiAoaSA8IExPTkdTSVpFICYmICh5LmxzdyAmICgxVUwgPDwgaSkpKSBicmVhazsKKwl9CisJaWYgKGkgPCAwKSB7CisJCWVycm9yKGV2YWxfbGluZSwgImRpdmlzaW9uIGJ5IDAiKTsKKwkJdGhyb3coZXZhbF9leGNlcHRpb24pOworCX0KKwlmb3IgKGogPSAyICogTE9OR1NJWkUgLSAxIC0gaTsgaiA+PSAwOyBqIC0tKSB7CisJCXVjcHB1bG9uZyBhID0gb3BfbHNoX3UoeSwgaik7CisKKwkJaWYgKG9wX2xlcV91KGEsIHgpKSB7CisJCQl4ID0gb3BfbWludXNfdSh4LCBhKTsKKwkJCWlmIChqID49IExPTkdTSVpFKQorCQkJCXEtPm1zdyB8PSAoMVVMIDw8IChqIC0gTE9OR1NJWkUpKTsKKwkJCWVsc2UKKwkJCQlxLT5sc3cgfD0gKDFVTCA8PCBqKTsKKwkJfQorCX0KKwkqciA9IHg7Cit9CisKK3N0YXRpYyB1Y3BwdWxvbmcgb3Bfc2xhc2hfdSh1Y3BwdWxvbmcgeCwgdWNwcHVsb25nIHkpCit7CisJdWNwcHVsb25nIHEsIHI7CisKKwl1ZGl2KHgsIHksICZxLCAmcik7CisJcmV0dXJuIHE7Cit9CisKK3N0YXRpYyB1Y3BwdWxvbmcgb3BfcGN0X3UodWNwcHVsb25nIHgsIHVjcHB1bG9uZyB5KQoreworCXVjcHB1bG9uZyBxLCByOworCisJdWRpdih4LCB5LCAmcSwgJnIpOworCXJldHVybiByOworfQorCisKK3N0YXRpYyB1Y3Bwc2xvbmcgb3Bfc3Rhcl9zKHVjcHBzbG9uZyB4LCB1Y3Bwc2xvbmcgeSkKK3sKKwl1Y3BwdWxvbmcgYSA9IHgsIGIgPSB5LCBjOworCWludCB4biA9IDAsIHluID0gMDsKKworCWlmIChTSUdOQklUKHgubXN3KSkgeyBhID0gb3BfbmVnX3UoeCk7IHhuID0gMTsgfQorCWlmIChTSUdOQklUKHkubXN3KSkgeyBiID0gb3BfbmVnX3UoeSk7IHluID0gMTsgfQorCWMgPSBvcF9zdGFyX3UoYSwgYik7CisJLyogVHVyYm8gQyBzZWVtcyB0byBtaXNjb21waWxlIHRoZSA/OiBvcGVyYXRvcnMgd2hlbiBvcGVyYW5kcworCSAgIGFyZSB1bG9uZy9zbG9uZyBzdHJ1Y3R1cmVzICovCisJaWYgKHhuIF4geW4pIHJldHVybiBvcF9uZWdfdShjKTsKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIHZvaWQgc2Rpdih1Y3Bwc2xvbmcgeCwgdWNwcHNsb25nIHksIHVjcHBzbG9uZyAqcSwgdWNwcHNsb25nICpyKQoreworCXVjcHB1bG9uZyBhID0geCwgYiA9IHksIGMsIGQ7CisJaW50IHhuID0gMCwgeW4gPSAwOworCisJaWYgKFNJR05CSVQoeC5tc3cpKSB7IGEgPSBvcF9uZWdfdSh4KTsgeG4gPSAxOyB9CisJaWYgKFNJR05CSVQoeS5tc3cpKSB7IGIgPSBvcF9uZWdfdSh5KTsgeW4gPSAxOyB9CisJdWRpdihhLCBiLCAmYywgJmQpOworCWlmICh4biBeIHluKSAqcSA9IG9wX25lZ191KGMpOyBlbHNlICpxID0gYzsKKwlpZiAoeG4gXiB5bikgKnIgPSBvcF9uZWdfdShkKTsgZWxzZSAqciA9IGQ7Cit9CisKK3N0YXRpYyB1Y3Bwc2xvbmcgb3Bfc2xhc2hfcyh1Y3Bwc2xvbmcgeCwgdWNwcHNsb25nIHkpCit7CisJdWNwcHNsb25nIHEsIHI7CisKKwlzZGl2KHgsIHksICZxLCAmcik7CisJcmV0dXJuIHE7Cit9CisKK3N0YXRpYyB1Y3Bwc2xvbmcgb3BfcGN0X3ModWNwcHNsb25nIHgsIHVjcHBzbG9uZyB5KQoreworCXVjcHBzbG9uZyBxLCByOworCisJc2Rpdih4LCB5LCAmcSwgJnIpOworCXJldHVybiByOworfQorCisjZGVmaW5lIG9wX3BsdXNfcyh4LCB5KQkJb3BfcGx1c191KHgsIHkpCisjZGVmaW5lIG9wX21pbnVzX3MoeCwgeSkJb3BfbWludXNfdSh4LCB5KQorI2RlZmluZSBvcF9uZWdfcyh4KQkJb3BfbmVnX3UoeCkKKyNkZWZpbmUgb3BfbHNoX3MoeCwgeSkJCW9wX2xzaF91KHgsIHkpCisKKy8qCisgKiBXaGF0IGhhcHBlbnMgaWYgeCByZXByZXNlbnRzIGEgbmVnYXRpdmUgdmFsdWUsIGlzIGltcGxlbWVudGF0aW9uCisgKiBzcGVjaWZpZWQuIFdlIGVtaXQgYSB3YXJuaW5nLCBhbmQgZXh0ZW5kIHRoZSBzaWduICh3aGljaCBpcyB3aGF0CisgKiBtb3N0IGltcGxlbWVudGF0aW9ucyBkbykuCisgKi8KK3N0YXRpYyB1Y3Bwc2xvbmcgb3BfcnNoX3ModWNwcHNsb25nIHgsIGludCB5KQoreworCWludCB4biA9IChTSUdOQklUKHgubXN3KSAhPSAwKTsKKwl1Y3BwdWxvbmcgcSA9IG9wX3JzaF91KHgsIHkpOworCisJaWYgKHhuICYmIHkgPiAwKSB7CisJCWlmIChlbWl0X2V2YWxfd2FybmluZ3MpCisJCQl3YXJuaW5nKGV2YWxfbGluZSwgInJpZ2h0IHNoaWZ0IG9mIGEgc2lnbmVkIG5lZ2F0aXZlICIKKwkJCQkidmFsdWUgaW4gI2lmIik7CisJCXEgPSBvcF9vcl91KHEsIG9wX2xzaF91KG9wX25vdF91KHRvX3Vsb25nKDApKSwKKwkJCTIgKiBMT05HU0laRSAtIHkpKTsKKwl9CisJcmV0dXJuIHE7Cit9CisKK3N0YXRpYyBpbnQgb3BfbHRfcyh1Y3Bwc2xvbmcgeCwgdWNwcHNsb25nIHkpCit7CisJaW50IHhuID0gKFNJR05CSVQoeC5tc3cpICE9IDApOworCWludCB5biA9IChTSUdOQklUKHkubXN3KSAhPSAwKTsKKworCWlmICh4biAmJiAheW4pIHJldHVybiAxOworCWlmICgheG4gJiYgeW4pIHJldHVybiAwOworCWlmICh4bikgcmV0dXJuIG9wX2x0X3Uob3BfbmVnX3UoeSksIG9wX25lZ191KHgpKTsKKwlyZXR1cm4gb3BfbHRfdSh4LCB5KTsKK30KKworc3RhdGljIGludCBvcF9sZXFfcyh1Y3Bwc2xvbmcgeCwgdWNwcHNsb25nIHkpCit7CisJaW50IHhuID0gKFNJR05CSVQoeC5tc3cpICE9IDApOworCWludCB5biA9IChTSUdOQklUKHkubXN3KSAhPSAwKTsKKworCWlmICh4biAmJiAheW4pIHJldHVybiAxOworCWlmICgheG4gJiYgeW4pIHJldHVybiAwOworCWlmICh4bikgcmV0dXJuIG9wX2xlcV91KG9wX25lZ191KHkpLCBvcF9uZWdfdSh4KSk7CisJcmV0dXJuIG9wX2xlcV91KHgsIHkpOworfQorCisjZGVmaW5lIG9wX2d0X3MoeCwgeSkJCW9wX2x0X3MoeSwgeCkKKyNkZWZpbmUgb3BfZ2VxX3MoeCwgeSkJCW9wX2xlcV9zKHksIHgpCisjZGVmaW5lIG9wX3NhbWVfcyh4LCB5KQkJb3Bfc2FtZV91KHgsIHkpCisjZGVmaW5lIG9wX25lcV9zKHgsIHkpCQkoIW9wX3NhbWVfcyh4LCB5KSkKKworI2RlZmluZSBvcF9hbmRfcyh4LCB5KQkJb3BfYW5kX3UoeCwgeSkKKyNkZWZpbmUgb3BfY2lyY19zKHgsIHkpCQlvcF9jaXJjX3UoeCwgeSkKKyNkZWZpbmUgb3Bfb3Jfcyh4LCB5KQkJb3Bfb3JfdSh4LCB5KQorCisjZGVmaW5lIG9wX2x2YWxfcyh4KQkJb3BfbmVxX3MoeCwgdG9fc2xvbmcoMCkpCisjZGVmaW5lIG9wX2xub3Rfcyh4KQkJKCFvcF9sdmFsX3MoeCkpCisjZGVmaW5lIG9wX25vdF9zKHgpCQlvcF9ub3RfdSh4KQorI2RlZmluZSBvcF91cGx1c19zKHgpCQkoeCkKKyNkZWZpbmUgb3BfdW1pbnVzX3MoeCkJCW9wX25lZ19zKHgpCisKKyNkZWZpbmUgb3BfcHJvbW8oeCkJCSh4KQorI2RlZmluZSBiYWNrX3Vsb25nKHgpCQkoKHgpLmxzdykKKworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgc2lnbjsKKwl1bmlvbiB7CisJCXVjcHB1bG9uZyB1djsKKwkJdWNwcHNsb25nIHN2OworCX0gdTsKK30gcHB2YWw7CisKK3N0YXRpYyBpbnQgYm9vbHZhbChwcHZhbCB4KQoreworCXJldHVybiB4LnNpZ24gPyBvcF9sdmFsX3MoeC51LnN2KSA6IG9wX2x2YWxfdSh4LnUudXYpOworfQorCisjaWYgIWRlZmluZWQoV0NIQVJfU0lHTkVETkVTUykKKyMgIGlmIENIQVJfTUlOID09IDAKKyMgICAgZGVmaW5lIFdDSEFSX1NJR05FRE5FU1MJMAorIyAgZWxzZQorIyAgICBkZWZpbmUgV0NIQVJfU0lHTkVETkVTUwkxCisjICBlbmRpZgorI2VuZGlmCisKKy8qCisgKiBDaGVjayB0aGUgc3VmZml4LCByZXR1cm4gMSBpZiBpdCBpcyBzaWduZWQsIDAgb3RoZXJ3aXNlLgorICogdSwgbCwgbGwsIHVsLCBsdSwgdWxsLCBsbHUsIGFuZCB2YXJpYXRpb25zIHdpdGggdXBwZXJjYXNlIGxldHRlcnMKKyAqIGFyZSBsZWdhbCwgbm8gc3VmZml4IGVpdGhlcjsgb3RoZXIgc3VmZml4ZXMgYXJlIG5vdCBsZWdhbC4KKyAqLworc3RhdGljIGludCBwcF9zdWZmaXgoY2hhciAqZCwgY2hhciAqcmVmYykKK3sKKwlpZiAoISpkKSByZXR1cm4gMTsKKwlpZiAoKmQgPT0gJ3UnIHx8ICpkID09ICdVJykgeworCQlkICsrOworCQlpZiAoISpkKSByZXR1cm4gMDsKKwkJaWYgKCpkID09ICdsJyB8fCAqZCA9PSAnTCcpIHsKKwkJCWQgKys7CisJCQlpZiAoKmQgPT0gJ2wnIHx8ICpkID09ICdMJykgZCArKzsKKwkJCWlmICghKmQpIHJldHVybiAwOworCQkJZ290byBzdWZmaXhfZXJyb3I7CisJCX0KKwkJZ290byBzdWZmaXhfZXJyb3I7CisJfQorCWlmICgqZCA9PSAnbCcgfHwgKmQgPT0gJ0wnKSB7CisJCWQgKys7CisJCWlmICgqZCA9PSAnbCcgfHwgKmQgPT0gJ0wnKSBkICsrOworCQlpZiAoISpkKSByZXR1cm4gMTsKKwkJaWYgKCpkID09ICd1JyB8fCAqZCA9PSAnVScpIHsKKwkJCWQgKys7CisJCQlpZiAoISpkKSByZXR1cm4gMDsKKwkJfQorCQlnb3RvIHN1ZmZpeF9lcnJvcjsKKwl9CitzdWZmaXhfZXJyb3I6CisJZXJyb3IoZXZhbF9saW5lLCAiaW52YWxpZCBpbnRlZ2VyIGNvbnN0YW50ICclcyciLCByZWZjKTsKKwl0aHJvdyhldmFsX2V4Y2VwdGlvbik7CisJcmV0dXJuIDY2NjsKK30KKworc3RhdGljIHBwdmFsIHBwX2RlY2NvbnN0KGNoYXIgKmMsIGludCBzaWduLCBjaGFyICpyZWZjKQoreworCXBwdmFsIHE7CisKKwlxLnNpZ24gPSBzaWduOworCWlmIChxLnNpZ24pIHsKKwkJcS51LnN2ID0gdG9fc2xvbmcoMCk7CisJCWZvciAoOyBERUNJTSgqYyk7IGMgKyspIHsKKwkJCXEudS5zdiA9IG9wX3N0YXJfcyhxLnUuc3YsIHRvX3Nsb25nKDEwKSk7CisJCQlxLnUuc3YgPSBvcF9wbHVzX3MocS51LnN2LCB0b19zbG9uZyhEVkFMKCpjKSkpOworCQl9CisJCWlmIChIRVhBRCgqYykgfHwgKmMgPT0gJ3gnIHx8ICpjID09ICdYJykgZ290byBjb25zdF9lcnJvcjsKKwl9IGVsc2UgeworCQlxLnUudXYgPSB0b191bG9uZygwKTsKKwkJZm9yICg7IERFQ0lNKCpjKTsgYyArKykgeworCQkJcS51LnV2ID0gb3Bfc3Rhcl91KHEudS51diwgdG9fdWxvbmcoMTApKTsKKwkJCXEudS51diA9IG9wX3BsdXNfdShxLnUudXYsIHRvX3Vsb25nKERWQUwoKmMpKSk7CisJCX0KKwkJaWYgKEhFWEFEKCpjKSB8fCAqYyA9PSAneCcgfHwgKmMgPT0gJ1gnKSBnb3RvIGNvbnN0X2Vycm9yOworCX0KKwlyZXR1cm4gcTsKK2NvbnN0X2Vycm9yOgorCWVycm9yKGV2YWxfbGluZSwgImludmFsaWQgaW50ZWdlciBjb25zdGFudCAnJXMnIiwgcmVmYyk7CisJdGhyb3coZXZhbF9leGNlcHRpb24pOworCXJldHVybiBxOworfQorCitzdGF0aWMgcHB2YWwgcHBfb2N0Y29uc3QoY2hhciAqYywgaW50IHNpZ24sIGNoYXIgKnJlZmMpCit7CisJcHB2YWwgcTsKKworCXEuc2lnbiA9IHNpZ247CisJaWYgKHEuc2lnbikgeworCQlxLnUuc3YgPSB0b19zbG9uZygwKTsKKwkJZm9yICg7IE9DVEFMKCpjKTsgYyArKykgeworCQkJcS51LnN2ID0gb3Bfc3Rhcl9zKHEudS5zdiwgdG9fc2xvbmcoOCkpOworCQkJcS51LnN2ID0gb3BfcGx1c19zKHEudS5zdiwgdG9fc2xvbmcoT1ZBTCgqYykpKTsKKwkJfQorCQlpZiAoSEVYQUQoKmMpIHx8ICpjID09ICd4JyB8fCAqYyA9PSAnWCcpIGdvdG8gY29uc3RfZXJyb3I7CisJfSBlbHNlIHsKKwkJcS51LnV2ID0gdG9fdWxvbmcoMCk7CisJCWZvciAoOyBPQ1RBTCgqYyk7IGMgKyspIHsKKwkJCXEudS51diA9IG9wX3N0YXJfdShxLnUudXYsIHRvX3Vsb25nKDgpKTsKKwkJCXEudS51diA9IG9wX3BsdXNfdShxLnUudXYsIHRvX3Vsb25nKE9WQUwoKmMpKSk7CisJCX0KKwkJaWYgKEhFWEFEKCpjKSB8fCAqYyA9PSAneCcgfHwgKmMgPT0gJ1gnKSBnb3RvIGNvbnN0X2Vycm9yOworCX0KKwlyZXR1cm4gcTsKK2NvbnN0X2Vycm9yOgorCWVycm9yKGV2YWxfbGluZSwgImludmFsaWQgaW50ZWdlciBjb25zdGFudCAnJXMnIiwgcmVmYyk7CisJdGhyb3coZXZhbF9leGNlcHRpb24pOworCXJldHVybiBxOworfQorCitzdGF0aWMgcHB2YWwgcHBfaGV4Y29uc3QoY2hhciAqYywgaW50IHNpZ24sIGNoYXIgKnJlZmMpCit7CisJcHB2YWwgcTsKKworCXEuc2lnbiA9IHNpZ247CisJaWYgKHEuc2lnbikgeworCQlxLnUuc3YgPSB0b19zbG9uZygwKTsKKwkJZm9yICg7IEhFWEFEKCpjKTsgYyArKykgeworCQkJcS51LnN2ID0gb3Bfc3Rhcl9zKHEudS5zdiwgdG9fc2xvbmcoMTYpKTsKKwkJCXEudS5zdiA9IG9wX3BsdXNfcyhxLnUuc3YsIHRvX3Nsb25nKEhWQUwoKmMpKSk7CisJCX0KKwkJaWYgKEhFWEFEKCpjKSB8fCAqYyA9PSAneCcgfHwgKmMgPT0gJ1gnKSBnb3RvIGNvbnN0X2Vycm9yOworCX0gZWxzZSB7CisJCXEudS51diA9IHRvX3Vsb25nKDApOworCQlmb3IgKDsgSEVYQUQoKmMpOyBjICsrKSB7CisJCQlxLnUudXYgPSBvcF9zdGFyX3UocS51LnV2LCB0b191bG9uZygxNikpOworCQkJcS51LnV2ID0gb3BfcGx1c191KHEudS51diwgdG9fdWxvbmcoSFZBTCgqYykpKTsKKwkJfQorCQlpZiAoSEVYQUQoKmMpIHx8ICpjID09ICd4JyB8fCAqYyA9PSAnWCcpIGdvdG8gY29uc3RfZXJyb3I7CisJfQorCXJldHVybiBxOworY29uc3RfZXJyb3I6CisJZXJyb3IoZXZhbF9saW5lLCAiaW52YWxpZCBpbnRlZ2VyIGNvbnN0YW50ICclcyciLCByZWZjKTsKKwl0aHJvdyhldmFsX2V4Y2VwdGlvbik7CisJcmV0dXJuIHE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBwX2NoYXIoY2hhciAqYywgY2hhciAqcmVmYykKK3sKKwl1bnNpZ25lZCBsb25nIHIgPSAwOworCisJYyArKzsKKwlpZiAoKmMgPT0gJ1xcJykgeworCQlpbnQgaTsKKworCQljICsrOworCQlzd2l0Y2ggKCpjKSB7CisJCWNhc2UgJ24nOiByID0gJ1xuJzsgYyArKzsgYnJlYWs7CisJCWNhc2UgJ3QnOiByID0gJ1x0JzsgYyArKzsgYnJlYWs7CisJCWNhc2UgJ3YnOiByID0gJ1x2JzsgYyArKzsgYnJlYWs7CisJCWNhc2UgJ2InOiByID0gJ1xiJzsgYyArKzsgYnJlYWs7CisJCWNhc2UgJ3InOiByID0gJ1xyJzsgYyArKzsgYnJlYWs7CisJCWNhc2UgJ2YnOiByID0gJ1xmJzsgYyArKzsgYnJlYWs7CisJCWNhc2UgJ2EnOiByID0gJ1xhJzsgYyArKzsgYnJlYWs7CisJCWNhc2UgJ1xcJzogciA9ICdcXCc7IGMgKys7IGJyZWFrOworCQljYXNlICdcPyc6IHIgPSAnXD8nOyBjICsrOyBicmVhazsKKwkJY2FzZSAnXCcnOiByID0gJ1wnJzsgYyArKzsgYnJlYWs7CisJCWNhc2UgJ1wiJzogciA9ICdcIic7IGMgKys7IGJyZWFrOworCQljYXNlICd1JzoKKwkJCWZvciAoaSA9IDAsIGMgKys7IGkgPCA0ICYmIEhFWEFEKCpjKTsgaSArKywgYyArKykgeworCQkJCXIgPSAociAqIDE2KSArIEhWQUwoKmMpOworCQkJfQorCQkJaWYgKGkgIT0gNCkgeworCQkJCWVycm9yKGV2YWxfbGluZSwgIm1hbGZvcm1lZCBVQ04gaW4gJXMiLCByZWZjKTsKKwkJCQl0aHJvdyhldmFsX2V4Y2VwdGlvbik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnVSc6CisJCQlmb3IgKGkgPSAwLCBjICsrOyBpIDwgOCAmJiBIRVhBRCgqYyk7IGkgKyssIGMgKyspIHsKKwkJCQlyID0gKHIgKiAxNikgKyBIVkFMKCpjKTsKKwkJCX0KKwkJCWlmIChpICE9IDgpIHsKKwkJCQllcnJvcihldmFsX2xpbmUsICJtYWxmb3JtZWQgVUNOIGluICVzIiwgcmVmYyk7CisJCQkJdGhyb3coZXZhbF9leGNlcHRpb24pOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ3gnOgorCQkJZm9yIChjICsrOyBIRVhBRCgqYyk7IGMgKyspIHIgPSAociAqIDE2KSArIEhWQUwoKmMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoT0NUQUwoKmMpKSB7CisJCQkJciA9IE9WQUwoKihjICsrKSk7CisJCQkJaWYgKE9DVEFMKCpjKSkgciA9IChyICogOCkgKyBPVkFMKCooYyArKykpOworCQkJCWlmIChPQ1RBTCgqYykpIHIgPSAociAqIDgpICsgT1ZBTCgqKGMgKyspKTsKKwkJCX0gZWxzZSB7CisJCQkJZXJyb3IoZXZhbF9saW5lLCAiaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgIgorCQkJCQkiJ1xcJWMnIiwgKmMpOworCQkJCXRocm93KGV2YWxfZXhjZXB0aW9uKTsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoKmMgPT0gJ1wnJykgeworCQllcnJvcihldmFsX2xpbmUsICJlbXB0eSBjaGFyYWN0ZXIgY29uc3RhbnQiKTsKKwkJdGhyb3coZXZhbF9leGNlcHRpb24pOworCX0gZWxzZSB7CisJCXIgPSAqKCh1bnNpZ25lZCBjaGFyICopKGMgKyspKTsKKwl9CisKKwlpZiAodHJhbnNpZW50X2NoYXJhY3RlcnMgJiYgciA8IDI1NikgeworCQlyID0gdHJhbnNpZW50X2NoYXJhY3RlcnNbKHNpemVfdClyXTsKKwl9CisKKwlpZiAoKmMgIT0gJ1wnJyAmJiBlbWl0X2V2YWxfd2FybmluZ3MpIHsKKwkJd2FybmluZyhldmFsX2xpbmUsICJtdWx0aWNoYXJhY3RlciBjb25zdGFudCIpOworCX0KKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHBwdmFsIHBwX3N0cnRvY29uc3QoY2hhciAqcmVmYykKK3sKKwlwcHZhbCBxOworCWNoYXIgKmMgPSByZWZjLCAqZDsKKwlpbnQgc2lnbiA9IDE7CisKKwlpZiAoKmMgPT0gJ1wnJyB8fCAqYyA9PSAnTCcpIHsKKwkJcS5zaWduID0gKCpjID09ICdMJykgPyBXQ0hBUl9TSUdORURORVNTIDogMTsKKwkJaWYgKCpjID09ICdMJykgYyArKzsKKwkJaWYgKHEuc2lnbikgeworCQkJcS51LnN2ID0gdG9fc2xvbmcocHBfY2hhcihjLCByZWZjKSk7CisJCX0gZWxzZSB7CisJCQlxLnUudXYgPSB0b191bG9uZyhwcF9jaGFyKGMsIHJlZmMpKTsKKwkJfQorCQlyZXR1cm4gcTsKKwl9CisJZm9yIChkID0gYzsgKmQ7IGQgKyspIHsKKwkJaWYgKCFIRVhBRCgqZCkgJiYgKmQgIT0gJ3gnICYmICpkICE9ICdYJykgeworCQkJc2lnbiA9IHBwX3N1ZmZpeChkLCByZWZjKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICgqYyA9PSAnMCcpIHsKKwkJYyArKzsKKwkJaWYgKCpjID09ICd4JyB8fCAqYyA9PSAnWCcpIHsKKwkJCS8qIGhleGFkZWNpbWFsIGNvbnN0YW50ICovCisJCQljICsrOworCQkJcmV0dXJuIHBwX2hleGNvbnN0KGMsIHNpZ24sIHJlZmMpOworCQl9CisJCXJldHVybiBwcF9vY3Rjb25zdChjLCBzaWduLCByZWZjKTsKKwl9CisJcmV0dXJuIHBwX2RlY2NvbnN0KGMsIHNpZ24sIHJlZmMpOworfQorCisvKgorICogVXNlZCBieSAjbGluZSBkaXJlY3RpdmVzIC0tIGFueXRoaW5nIGJleW9uZCB3aGF0IGNhbiBiZSBwdXQgaW4gYW4KKyAqIHVuc2lnbmVkIGxvbmcsIGlzIGNvbnNpZGVyZWQgYWJzdXJkLgorICovCit1bnNpZ25lZCBsb25nIHN0cnRvY29uc3QoY2hhciAqYykKK3sKKwlwcHZhbCBxID0gcHBfc3RydG9jb25zdChjKTsKKworCWlmIChxLnNpZ24pIHEudS51diA9IG9wX3Byb21vKHEudS5zdik7CisJcmV0dXJuIGJhY2tfdWxvbmcocS51LnV2KTsKK30KKworI2RlZmluZSBPUF9VTih4KQkoKHgpID09IExOT1QgfHwgKHgpID09IE5PVCB8fCAoeCkgPT0gVVBMVVMgXAorCQkJfHwgKHgpID09IFVNSU5VUykKKworc3RhdGljIHBwdmFsIGV2YWxfb3B1bihpbnQgb3AsIHBwdmFsIHYpCit7CisJaWYgKG9wID09IExOT1QpIHsKKwkJdi5zaWduID0gMTsKKwkJdi51LnN2ID0gdG9fc2xvbmcob3BfbG5vdF9zKHYudS5zdikpOworCQlyZXR1cm4gdjsKKwl9CisJaWYgKHYuc2lnbikgeworCQlzd2l0Y2ggKG9wKSB7CisJCWNhc2UgTk9UOiB2LnUuc3YgPSBvcF9ub3Rfcyh2LnUuc3YpOyBicmVhazsKKwkJY2FzZSBVUExVUzogdi51LnN2ID0gb3BfdXBsdXNfcyh2LnUuc3YpOyBicmVhazsKKwkJY2FzZSBVTUlOVVM6IHYudS5zdiA9IG9wX3VtaW51c19zKHYudS5zdik7IGJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChvcCkgeworCQljYXNlIE5PVDogdi51LnV2ID0gb3Bfbm90X3Uodi51LnV2KTsgYnJlYWs7CisJCWNhc2UgVVBMVVM6IHYudS51diA9IG9wX3VwbHVzX3Uodi51LnV2KTsgYnJlYWs7CisJCWNhc2UgVU1JTlVTOiB2LnUudXYgPSBvcF91bWludXNfdSh2LnUudXYpOyBicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gdjsKK30KKworI2RlZmluZSBPUF9CSU4oeCkJKCh4KSA9PSBTVEFSIHx8ICh4KSA9PSBTTEFTSCB8fCAoeCkgPT0gUENUIFwKKwkJCXx8ICh4KSA9PSBQTFVTIHx8ICh4KSA9PSBNSU5VUyB8fCAoeCkgPT0gTFNIIFwKKwkJCXx8ICh4KSA9PSBSU0ggfHwgKHgpID09IExUIHx8ICh4KSA9PSBMRVEgXAorCQkJfHwgKHgpID09IEdUIHx8ICh4KSA9PSBHRVEgfHwgKHgpID09IFNBTUUgXAorCQkJfHwgKHgpID09IE5FUSB8fCAoeCkgPT0gQU5EIHx8ICh4KSA9PSBDSVJDIFwKKwkJCXx8ICh4KSA9PSBPUiB8fCAoeCkgPT0gTEFORCB8fCAoeCkgPT0gTE9SIFwKKwkJCXx8ICh4KSA9PSBDT01NQSkKK3N0YXRpYyBwcHZhbCBldmFsX29wYmluKGludCBvcCwgcHB2YWwgdjEsIHBwdmFsIHYyKQoreworCXBwdmFsIHI7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBTVEFSOgljYXNlIFNMQVNIOgljYXNlIFBDVDoKKwljYXNlIFBMVVM6CWNhc2UgTUlOVVM6CWNhc2UgQU5EOgorCWNhc2UgQ0lSQzoJY2FzZSBPUjoKKwkJLyogcHJvbW90ZSBvcGVyYW5kcywgYWRqdXN0IHNpZ25lZG5lc3Mgb2YgcmVzdWx0ICovCisJCWlmICghdjEuc2lnbiB8fCAhdjIuc2lnbikgeworCQkJaWYgKHYxLnNpZ24pIHsKKwkJCQl2MS51LnV2ID0gb3BfcHJvbW8odjEudS5zdik7CisJCQkJdjEuc2lnbiA9IDA7CisJCQl9IGVsc2UgaWYgKHYyLnNpZ24pIHsKKwkJCQl2Mi51LnV2ID0gb3BfcHJvbW8odjIudS5zdik7CisJCQkJdjIuc2lnbiA9IDA7CisJCQl9CisJCQlyLnNpZ24gPSAwOworCQl9IGVsc2UgeworCQkJci5zaWduID0gMTsKKwkJfQorCQlicmVhazsKKwljYXNlIExUOgljYXNlIExFUToJY2FzZSBHVDoKKwljYXNlIEdFUToJY2FzZSBTQU1FOgljYXNlIE5FUToKKwkJLyogcHJvbW90ZSBvcGVyYW5kcyAqLworCQlpZiAoIXYxLnNpZ24gfHwgIXYyLnNpZ24pIHsKKwkJCWlmICh2MS5zaWduKSB7CisJCQkJdjEudS51diA9IG9wX3Byb21vKHYxLnUuc3YpOworCQkJCXYxLnNpZ24gPSAwOworCQkJfSBlbHNlIGlmICh2Mi5zaWduKSB7CisJCQkJdjIudS51diA9IG9wX3Byb21vKHYyLnUuc3YpOworCQkJCXYyLnNpZ24gPSAwOworCQkJfQorCQl9CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgTEFORDoKKwljYXNlIExPUjoKKwkJLyogcmVzdWx0IGlzIHNpZ25lZCBhbnl3YXkgKi8KKwkJci5zaWduID0gMTsKKwkJYnJlYWs7CisJY2FzZSBMU0g6CisJY2FzZSBSU0g6CisJCS8qIHJlc3VsdCBpcyBhcyBzaWduZWQgYXMgbGVmdCBvcGVyYW5kOyBwcm9tb3RlIHJpZ2h0CisJCSAgIG9wZXJhbmQgdG8gdW5zaWduZWQgKHRoaXMgaXMgbm90IHJlcXVpcmVkIGJ5IHRoZQorCQkgICBzdGFuZGFyZCkgKi8KKwkJci5zaWduID0gdjEuc2lnbjsKKwkJaWYgKHYyLnNpZ24pIHsKKwkJCXYyLnUudXYgPSBvcF9wcm9tbyh2Mi51LnN2KTsKKwkJCXYyLnNpZ24gPSAwOworCQl9CisJCWJyZWFrOworCWNhc2UgQ09NTUE6CisJCWlmIChlbWl0X2V2YWxfd2FybmluZ3MpIHsKKwkJCXdhcm5pbmcoZXZhbF9saW5lLCAiSVNPIEMgZm9yYmlkcyBldmFsdWF0ZWQgY29tbWEgIgorCQkJCSJvcGVyYXRvcnMgaW4gI2lmIGV4cHJlc3Npb25zIik7CisJCX0KKwkJci5zaWduID0gdjIuc2lnbjsKKwkJYnJlYWs7CisjaWZkZWYgQVVESVQKKwlkZWZhdWx0OiBvdWNoKCJhIGdvb2Qgb3BlcmF0b3IgaXMgYSBkZWFkIG9wZXJhdG9yIik7CisjZW5kaWYKKwl9CisKKyNkZWZpbmUgU0JJTk9QKHgpCWlmIChyLnNpZ24pIHIudS5zdiA9IG9wXyAjIyB4ICMjIF9zKHYxLnUuc3YsIHYyLnUuc3YpOyBcCisJCQllbHNlIHIudS51diA9IG9wXyAjIyB4ICMjIF91KHYxLnUudXYsIHYyLnUudXYpOworCisjZGVmaW5lIE5TU0JJTk9QKHgpCWlmICh2MS5zaWduKSByLnUuc3YgPSB0b19zbG9uZyhvcF8gIyMgeCAjIyBfcyh2MS51LnN2LCBcCisJCQl2Mi51LnN2KSk7IGVsc2Ugci51LnN2ID0gdG9fc2xvbmcob3BfICMjIHggIyMgX3UgXAorCQkJKHYxLnUudXYsIHYyLnUudXYpKTsKKworI2RlZmluZSBMQklOT1AoeCkJaWYgKHYxLnNpZ24pIHIudS5zdiA9IHRvX3Nsb25nKG9wX2x2YWxfcyh2MS51LnN2KSB4IFwKKwkJCW9wX2x2YWxfcyh2Mi51LnN2KSk7IGVsc2Ugci51LnN2ID0gXAorCQkJdG9fc2xvbmcob3BfbHZhbF91KHYxLnUudXYpIHggb3BfbHZhbF91KHYyLnUudXYpKTsKKworI2RlZmluZSBBQklOT1AoeCkJaWYgKHIuc2lnbikgci51LnN2ID0gb3BfICMjIHggIyMgX3ModjEudS5zdiwgXAorCQkJYmFja191bG9uZyh2Mi51LnV2KSk7IGVsc2Ugci51LnV2ID0gXAorCQkJb3BfICMjIHggIyMgX3UodjEudS51diwgYmFja191bG9uZyh2Mi51LnV2KSk7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBTVEFSOiBTQklOT1Aoc3Rhcik7IGJyZWFrOworCWNhc2UgU0xBU0g6IFNCSU5PUChzbGFzaCk7IGJyZWFrOworCWNhc2UgUENUOiBTQklOT1AocGN0KTsgYnJlYWs7CisJY2FzZSBQTFVTOiBTQklOT1AocGx1cyk7IGJyZWFrOworCWNhc2UgTUlOVVM6IFNCSU5PUChtaW51cyk7IGJyZWFrOworCWNhc2UgTFNIOiBBQklOT1AobHNoKTsgYnJlYWs7CisJY2FzZSBSU0g6IEFCSU5PUChyc2gpOyBicmVhazsKKwljYXNlIExUOiBOU1NCSU5PUChsdCk7IGJyZWFrOworCWNhc2UgTEVROiBOU1NCSU5PUChsZXEpOyBicmVhazsKKwljYXNlIEdUOiBOU1NCSU5PUChndCk7IGJyZWFrOworCWNhc2UgR0VROiBOU1NCSU5PUChnZXEpOyBicmVhazsKKwljYXNlIFNBTUU6IE5TU0JJTk9QKHNhbWUpOyBicmVhazsKKwljYXNlIE5FUTogTlNTQklOT1AobmVxKTsgYnJlYWs7CisJY2FzZSBBTkQ6IFNCSU5PUChhbmQpOyBicmVhazsKKwljYXNlIENJUkM6IFNCSU5PUChjaXJjKTsgYnJlYWs7CisJY2FzZSBPUjogU0JJTk9QKG9yKTsgYnJlYWs7CisJY2FzZSBMQU5EOiBMQklOT1AoJiYpOyBicmVhazsKKwljYXNlIExPUjogTEJJTk9QKHx8KTsgYnJlYWs7CisJY2FzZSBDT01NQTogciA9IHYyOyBicmVhazsKKwl9CisJcmV0dXJuIHI7Cit9CisKKyNkZWZpbmUgdHRPUCh4KQkJKE9QX1VOKHgpIHx8IE9QX0JJTih4KSB8fCAoeCkgPT0gUVVFU1QgfHwgKHgpID09IENPTE9OKQorCitzdGF0aWMgaW50IG9wX3ByZWMoaW50IG9wKQoreworCXN3aXRjaCAob3ApIHsKKwljYXNlIExOT1Q6CisJY2FzZSBOT1Q6CisJY2FzZSBVUExVUzoKKwljYXNlIFVNSU5VUzoKKwkJcmV0dXJuIDEzOworCWNhc2UgU1RBUjoKKwljYXNlIFNMQVNIOgorCWNhc2UgUENUOgorCQlyZXR1cm4gMTI7CisJY2FzZSBQTFVTOgorCWNhc2UgTUlOVVM6CisJCXJldHVybiAxMTsKKwljYXNlIExTSDoKKwljYXNlIFJTSDoKKwkJcmV0dXJuIDEwOworCWNhc2UgTFQ6CisJY2FzZSBMRVE6CisJY2FzZSBHVDoKKwljYXNlIEdFUToKKwkJcmV0dXJuIDk7CisJY2FzZSBTQU1FOgorCWNhc2UgTkVROgorCQlyZXR1cm4gODsKKwljYXNlIEFORDoKKwkJcmV0dXJuIDc7CisJY2FzZSBDSVJDOgorCQlyZXR1cm4gNjsKKwljYXNlIE9SOgorCQlyZXR1cm4gNTsKKwljYXNlIExBTkQ6CisJCXJldHVybiA0OworCWNhc2UgTE9SOgorCQlyZXR1cm4gMzsKKwljYXNlIFFVRVNUOgorCQlyZXR1cm4gMjsKKwljYXNlIENPTU1BOgorCQlyZXR1cm4gMTsKKwl9CisjaWZkZWYgQVVESVQKKwlvdWNoKCJhbiB1bmtub3duIHNwZWNpZXMgc2hvdWxkIGhhdmUgYSBoaWdoZXIgcHJlY2VkZW5jZSIpOworI2VuZGlmCisJcmV0dXJuIDY2NjsKK30KKworLyoKKyAqIFBlcmZvcm0gdGhlIGhhcmQgd29yayBvZiBldmFsdWF0aW9uLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd29ya3MgYmVjYXVzZToKKyAqIC0tIGFsbCB1bmFyeSBvcGVyYXRvcnMgYXJlIHJpZ2h0IHRvIGxlZnQgYXNzb2NpYXRpdmUsIGFuZCB3aXRoCisgKiAgICBpZGVudGljYWwgcHJlY2VkZW5jZQorICogLS0gYWxsIGJpbmFyeSBvcGVyYXRvcnMgYXJlIGxlZnQgdG8gcmlnaHQgYXNzb2NpYXRpdmUKKyAqIC0tIHRoZXJlIGlzIG9ubHkgb25lIG5vbi11bmFyeSBhbmQgbm9uLWJpbmFyeSBvcGVyYXRvcjogdGhlIHF1ZXN0LWNvbG9uCisgKgorICogSWYgZG9fZXZhbCBpcyAwLCB0aGUgZXZhbHVhdGlvbiBvZiBvcGVyYXRvcnMgaXMgbm90IGRvbmUuIFRoaXMgaXMKKyAqIGZvciBzZXF1ZW5jZSBwb2ludCBvcGVyYXRvcnMgKCYmLCB8fCBhbmQgPzopLgorICovCitzdGF0aWMgcHB2YWwgZXZhbF9zaHJkKHN0cnVjdCB0b2tlbl9maWZvICp0ZiwgaW50IG1pbnByZWMsIGludCBkb19ldmFsKQoreworCXBwdmFsIHRvcDsKKwlzdHJ1Y3QgdG9rZW4gKmN0OworCisJdG9wLnNpZ24gPSAxOworCWlmICh0Zi0+YXJ0ID09IHRmLT5udCkgZ290byB0cnVuY19lcnI7CisJY3QgPSB0Zi0+dCArICh0Zi0+YXJ0ICsrKTsKKwlpZiAoY3QtPnR5cGUgPT0gTFBBUikgeworCQl0b3AgPSBldmFsX3NocmQodGYsIDAsIGRvX2V2YWwpOworCQlpZiAodGYtPmFydCA9PSB0Zi0+bnQpIGdvdG8gdHJ1bmNfZXJyOworCQljdCA9IHRmLT50ICsgKHRmLT5hcnQgKyspOworCQlpZiAoY3QtPnR5cGUgIT0gUlBBUikgeworCQkJZXJyb3IoZXZhbF9saW5lLCAiYSByaWdodCBwYXJlbnRoZXNpcyB3YXMgZXhwZWN0ZWQiKTsKKwkJCXRocm93KGV2YWxfZXhjZXB0aW9uKTsKKwkJfQorCX0gZWxzZSBpZiAoY3QtPnR5cGUgPT0gTlVNQkVSIHx8IGN0LT50eXBlID09IENIQVIpIHsKKwkJdG9wID0gcHBfc3RydG9jb25zdChjdC0+bmFtZSk7CisJfSBlbHNlIGlmIChPUF9VTihjdC0+dHlwZSkpIHsKKwkJdG9wID0gZXZhbF9vcHVuKGN0LT50eXBlLCBldmFsX3NocmQodGYsCisJCQlvcF9wcmVjKGN0LT50eXBlKSwgZG9fZXZhbCkpOworCQlnb3RvIGV2YWxfbG9vcDsKKwl9IGVsc2UgaWYgKHR0T1AoY3QtPnR5cGUpKSBnb3RvIHJvZ3VlX29wX2VycjsKKwllbHNlIHsKKwkJZ290byBpbnZhbGlkX3Rva2VuX2VycjsKKwl9CisKK2V2YWxfbG9vcDoKKwlpZiAodGYtPmFydCA9PSB0Zi0+bnQpIHsKKwkJcmV0dXJuIHRvcDsKKwl9CisJY3QgPSB0Zi0+dCArICh0Zi0+YXJ0ICsrKTsKKwlpZiAoT1BfQklOKGN0LT50eXBlKSkgeworCQlpbnQgYnAgPSBvcF9wcmVjKGN0LT50eXBlKTsKKworCQlpZiAoYnAgPiBtaW5wcmVjKSB7CisJCQlwcHZhbCB0cjsKKworCQkJaWYgKChjdC0+dHlwZSA9PSBMT1IgJiYgYm9vbHZhbCh0b3ApKQorCQkJCXx8IChjdC0+dHlwZSA9PSBMQU5EICYmICFib29sdmFsKHRvcCkpKSB7CisJCQkJdHIgPSBldmFsX3NocmQodGYsIGJwLCAwKTsKKwkJCQlpZiAoZG9fZXZhbCkgeworCQkJCQl0b3Auc2lnbiA9IDE7CisJCQkJCWlmIChjdC0+dHlwZSA9PSBMT1IpCisJCQkJCQl0b3AudS5zdiA9IHRvX3Nsb25nKDEpOworCQkJCQlpZiAoY3QtPnR5cGUgPT0gTEFORCkKKwkJCQkJCXRvcC51LnN2ID0gdG9fc2xvbmcoMCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQl0ciA9IGV2YWxfc2hyZCh0ZiwgYnAsIGRvX2V2YWwpOworCQkJCWlmIChkb19ldmFsKQorCQkJCQl0b3AgPSBldmFsX29wYmluKGN0LT50eXBlLCB0b3AsIHRyKTsKKwkJCX0KKwkJCWdvdG8gZXZhbF9sb29wOworCQl9CisJfSBlbHNlIGlmIChjdC0+dHlwZSA9PSBRVUVTVCkgeworCQlpbnQgYnAgPSBvcF9wcmVjKFFVRVNUKTsKKwkJcHB2YWwgcjEsIHIyOworCisJCWlmIChicCA+PSBtaW5wcmVjKSB7CisJCQlpbnQgcXYgPSBib29sdmFsKHRvcCk7CisKKwkJCXIxID0gZXZhbF9zaHJkKHRmLCBicCwgcXYgPyBkb19ldmFsIDogMCk7CisJCQlpZiAodGYtPmFydCA9PSB0Zi0+bnQpIGdvdG8gdHJ1bmNfZXJyOworCQkJY3QgPSB0Zi0+dCArICh0Zi0+YXJ0ICsrKTsKKwkJCWlmIChjdC0+dHlwZSAhPSBDT0xPTikgeworCQkJCWVycm9yKGV2YWxfbGluZSwgImEgY29sb24gd2FzIGV4cGVjdGVkIik7CisJCQkJdGhyb3coZXZhbF9leGNlcHRpb24pOworCQkJfQorCQkJcjIgPSBldmFsX3NocmQodGYsIGJwLCBxdiA/IDAgOiBkb19ldmFsKTsKKwkJCWlmIChkb19ldmFsKSB7CisJCQkJaWYgKHF2KSB0b3AgPSByMTsgZWxzZSB0b3AgPSByMjsKKwkJCX0KKwkJCWdvdG8gZXZhbF9sb29wOworCQl9CisJfQorCXRmLT5hcnQgLS07CisJcmV0dXJuIHRvcDsKKwordHJ1bmNfZXJyOgorCWVycm9yKGV2YWxfbGluZSwgInRydW5jYXRlZCBjb25zdGFudCBpbnRlZ3JhbCBleHByZXNzaW9uIik7CisJdGhyb3coZXZhbF9leGNlcHRpb24pOworcm9ndWVfb3BfZXJyOgorCWVycm9yKGV2YWxfbGluZSwgInJvZ3VlIG9wZXJhdG9yICclcycgaW4gY29uc3RhbnQgaW50ZWdyYWwgIgorCQkiZXhwcmVzc2lvbiIsIG9wZXJhdG9yc19uYW1lW2N0LT50eXBlXSk7CisJdGhyb3coZXZhbF9leGNlcHRpb24pOworaW52YWxpZF90b2tlbl9lcnI6CisJZXJyb3IoZXZhbF9saW5lLCAiaW52YWxpZCB0b2tlbiBpbiBjb25zdGFudCBpbnRlZ3JhbCBleHByZXNzaW9uIik7CisJdGhyb3coZXZhbF9leGNlcHRpb24pOworfQorCisjZGVmaW5lIFVOQVJZKHgpCSgoeCkgIT0gTlVNQkVSICYmICh4KSAhPSBOQU1FICYmICh4KSAhPSBDSEFSIFwKKwkJCSYmICh4KSAhPSBSUEFSKQorCisvKgorICogRXZhbHVhdGUgdGhlIGludGVnZXIgZXhwcmVzc2lvbiBjb250YWluZWQgaW4gdGhlIGdpdmVuIHRva2VuX2ZpZm8uCisgKiBFdmFsdWF0aW9uIGlzIG1hZGUgYnkgcHJlY2VkZW5jZSBvZiBvcGVyYXRvcnMsIGFzIGRlc2NyaWJlZCBpbiB0aGUKKyAqIERyYWdvbiBCb29rLiBUaGUgdW5hcnkgKyBhbmQgLSBhcmUgZGlzdGluZ3Vpc2hlZCBmcm9tIHRoZWlyIGJpbmFyeQorICogY291bnRlcnBhcnRzIHVzaW5nIHRoZSBGb3J0cmFuIHdheTogYSArIG9yIGEgLSBpcyBjb25zaWRlcmVkIHVuYXJ5CisgKiBpZiBpdCBkb2VzIG5vdCBmb2xsb3cgYSBjb25zdGFudCwgYW4gaWRlbnRpZmllciBvciBhIHJpZ2h0IHBhcmVudGhlc2lzLgorICovCit1bnNpZ25lZCBsb25nIGV2YWxfZXhwcihzdHJ1Y3QgdG9rZW5fZmlmbyAqdGYsIGludCAqcmV0LCBpbnQgZXcpCit7CisJc2l6ZV90IHNhcnQ7CisJcHB2YWwgcjsKKworCWVtaXRfZXZhbF93YXJuaW5ncyA9IGV3OworCWlmIChjYXRjaChldmFsX2V4Y2VwdGlvbikpIGdvdG8gZXZhbF9lcnI7CisJLyogZmlyc3QsIGRpc3Rpbmd1aXNoIHVuYXJ5ICsgYW5kIC0gZnJvbSBiaW5hcnkgKyBhbmQgLSAqLworCWZvciAoc2FydCA9IHRmLT5hcnQ7IHRmLT5hcnQgPCB0Zi0+bnQ7IHRmLT5hcnQgKyspIHsKKwkJaWYgKHRmLT50W3RmLT5hcnRdLnR5cGUgPT0gUExVUykgeworCQkJaWYgKHNhcnQgPT0gdGYtPmFydCB8fCBVTkFSWSh0Zi0+dFt0Zi0+YXJ0IC0gMV0udHlwZSkpCisJCQkJdGYtPnRbdGYtPmFydF0udHlwZSA9IFVQTFVTOworCQl9IGVsc2UgaWYgKHRmLT50W3RmLT5hcnRdLnR5cGUgPT0gTUlOVVMpIHsKKwkJCWlmIChzYXJ0ID09IHRmLT5hcnQgfHwgVU5BUlkodGYtPnRbdGYtPmFydCAtIDFdLnR5cGUpKQorCQkJCXRmLT50W3RmLT5hcnRdLnR5cGUgPSBVTUlOVVM7CisJCX0KKwl9CisJdGYtPmFydCA9IHNhcnQ7CisJciA9IGV2YWxfc2hyZCh0ZiwgMCwgMSk7CisJaWYgKHRmLT5hcnQgPCB0Zi0+bnQpIHsKKwkJZXJyb3IoZXZhbF9saW5lLCAidHJhaWxpbmcgZ2FyYmFnZSBpbiBjb25zdGFudCBpbnRlZ3JhbCAiCisJCQkiZXhwcmVzc2lvbiIpOworCQlnb3RvIGV2YWxfZXJyOworCX0KKwkqcmV0ID0gMDsKKwlyZXR1cm4gYm9vbHZhbChyKTsKK2V2YWxfZXJyOgorCSpyZXQgPSAxOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdWNwcC9oYXNoLmMgYi91Y3BwL2hhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZTE2NjljCi0tLSAvZGV2L251bGwKKysrIGIvdWNwcC9oYXNoLmMKQEAgLTAsMCArMSwzMDEgQEAKKy8qCisgKiBHZW5lcmljIGhhc2ggdGFibGUgcm91dGluZXMuCisgKiAoYykgVGhvbWFzIFBvcm5pbiAxOTk4LCAxOTk5LCAyMDAwCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIAorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSAKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsCisgKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiaGFzaC5oIgorI2luY2x1ZGUgIm1lbS5oIgorCisvKgorICogaGFzaF9zdHJpbmcoKSBpcyBhIHNhbXBsZSBoYXNoIGZ1bmN0aW9uIGZvciBzdHJpbmdzCisgKi8KK2ludCBoYXNoX3N0cmluZyhjaGFyICpzKQoreworCXVuc2lnbmVkIGNoYXIgaCA9IDA7CisKKwlmb3IgKDsgKnM7IHMgKyspIGggXj0gKHVuc2lnbmVkIGNoYXIpKCpzKTsKKwlyZXR1cm4gKChpbnQpaCk7Cit9CisKKy8qCisgKiBzdHJ1Y3QgaGFzaF9pdGVtIGlzIHRoZSBiYXNpYyBkYXRhIHR5cGUgdG8gaW50ZXJuYWxseSBoYW5kbGUgaGFzaCB0YWJsZXMKKyAqLworc3RydWN0IGhhc2hfaXRlbSB7CisJdm9pZCAqZGF0YTsKKwlzdHJ1Y3QgaGFzaF9pdGVtICpuZXh0OworfTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gYWRkcyBhbiBlbnRyeSB0byB0aGUgc3RydWN0IGhhc2hfaXRlbSBsaXN0CisgKi8KK3N0YXRpYyBzdHJ1Y3QgaGFzaF9pdGVtICphZGRfZW50cnkoc3RydWN0IGhhc2hfaXRlbSAqYmxpc3QsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGhhc2hfaXRlbSAqdCA9IGdldG1lbShzaXplb2Yoc3RydWN0IGhhc2hfaXRlbSkpOworCisJdC0+ZGF0YSA9IGRhdGE7CisJdC0+bmV4dCA9IGJsaXN0OworCXJldHVybiB0OworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBmaW5kcyBhIHN0cnVjdCBoYXNoX2l0ZW0gaW4gYSBsaXN0LCB1c2luZyB0aGUKKyAqIGNvbXBhcmlzb24gZnVuY3Rpb24gcHJvdmlkZWQgYXMgY21wZGF0YSAoKmNtcGRhdGEoKSByZXR1cm5zCisgKiBub24temVybyBpZiB0aGUgdHdvIHBhcmFtZXRlcnMgYXJlIHRvIGJlIGNvbnNpZGVyZWQgaWRlbnRpY2FsKS4KKyAqCisgKiBJdCByZXR1cm5zIDAgaWYgdGhlIGl0ZW0gaXMgbm90IGZvdW5kLgorICovCitzdGF0aWMgc3RydWN0IGhhc2hfaXRlbSAqZ2V0X2VudHJ5KHN0cnVjdCBoYXNoX2l0ZW0gKmJsaXN0LCB2b2lkICpkYXRhLAorCWludCAoKmNtcGRhdGEpKHZvaWQgKiwgdm9pZCAqKSkKK3sKKwl3aGlsZSAoYmxpc3QpIHsKKwkJaWYgKCgqY21wZGF0YSkoZGF0YSwgYmxpc3QtPmRhdGEpKSByZXR1cm4gYmxpc3Q7CisJCWJsaXN0ID0gYmxpc3QtPm5leHQ7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBhY3RzIGxpa2UgZ2V0X2VudHJ5IGJ1dCBkZWxldGVzIHRoZSBmb3VuZCBpdGVtLCB1c2luZworICogdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGRlbGRhdGEoKTsgaXQgcmV0dXJucyAwIGlmIHRoZSBnaXZlbiBkYXRhIHdhcworICogbm90IGZvdW5kLgorICovCitzdGF0aWMgc3RydWN0IGhhc2hfaXRlbSAqZGVsX2VudHJ5KHN0cnVjdCBoYXNoX2l0ZW0gKmJsaXN0LCB2b2lkICpkYXRhLAorCWludCAoKmNtcGRhdGEpKHZvaWQgKiwgdm9pZCAqKSwgdm9pZCAoKmRlbGRhdGEpKHZvaWQgKikpCit7CisJc3RydWN0IGhhc2hfaXRlbSAqcHJldiA9IDAsICpzYXZlID0gYmxpc3Q7CisKKwl3aGlsZSAoYmxpc3QpIHsKKwkJaWYgKCgqY21wZGF0YSkoZGF0YSwgYmxpc3QtPmRhdGEpKSB7CisJCQkoKmRlbGRhdGEpKGJsaXN0LT5kYXRhKTsKKwkJCWlmIChwcmV2KSBwcmV2LT5uZXh0ID0gYmxpc3QtPm5leHQ7CisJCQlpZiAoc2F2ZSA9PSBibGlzdCkgc2F2ZSA9IGJsaXN0LT5uZXh0OworCQkJZnJlZW1lbShibGlzdCk7CisJCQlyZXR1cm4gc2F2ZTsKKwkJfQorCQlwcmV2ID0gYmxpc3Q7CisJCWJsaXN0ID0gYmxpc3QtPm5leHQ7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgbmV3IGhhc2h0YWJsZSwgd2l0aCB0aGUgaGFzaGluZyBhbmQgY29tcGFyaXNvbgorICogZnVuY3Rpb25zIGdpdmVuIGFzIHBhcmFtZXRlcnMKKyAqLworc3RydWN0IEhUICpuZXdIVChpbnQgbiwgaW50ICgqY21wZGF0YSkodm9pZCAqLCB2b2lkICopLCBpbnQgKCpoYXNoKSh2b2lkICopLAorCXZvaWQgKCpkZWxkYXRhKSh2b2lkICopKQoreworCXN0cnVjdCBIVCAqdCA9IGdldG1lbShzaXplb2Yoc3RydWN0IEhUKSk7CisJaW50IGk7CisKKwl0LT5saXN0cyA9IGdldG1lbShuICogc2l6ZW9mKHN0cnVjdCBoYXNoX2l0ZW0gKikpOworCWZvciAoaSA9IDA7IGkgPCBuOyBpICsrKSB0LT5saXN0c1tpXSA9IDA7CisJdC0+bmJfbGlzdHMgPSBuOworCXQtPmNtcGRhdGEgPSBjbXBkYXRhOworCXQtPmhhc2ggPSBoYXNoOworCXQtPmRlbGRhdGEgPSBkZWxkYXRhOworCXJldHVybiB0OworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBhZGRzIGEgbmV3IGVudHJ5IGluIHRoZSBoYXNodGFibGUgaHQ7IGl0IHJldHVybnMgMAorICogb24gc3VjY2Vzcywgb3IgYSBwb2ludGVyIHRvIHRoZSBhbHJlYWR5IHByZXNlbnQgaXRlbSBvdGhlcndpc2UuCisgKi8KK3ZvaWQgKnB1dEhUKHN0cnVjdCBIVCAqaHQsIHZvaWQgKmRhdGEpCit7CisJaW50IGg7CisJc3RydWN0IGhhc2hfaXRlbSAqZDsKKworCWggPSAoKCooaHQtPmhhc2gpKShkYXRhKSkgJSBodC0+bmJfbGlzdHM7CisJaWYgKChkID0gZ2V0X2VudHJ5KGh0LT5saXN0c1toXSwgZGF0YSwgaHQtPmNtcGRhdGEpKSkKKwkJcmV0dXJuIGQtPmRhdGE7CisJaHQtPmxpc3RzW2hdID0gYWRkX2VudHJ5KGh0LT5saXN0c1toXSwgZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGFkZHMgYSBuZXcgZW50cnkgaW4gdGhlIGhhc2h0YWJsZSBodCwgZXZlbiBpZiBhbiBlcXVhbAorICogZW50cnkgaXMgYWxyZWFkeSB0aGVyZS4gRXhlcmNpc2UgY2F1dGlvbiAhCisgKiBUaGUgbmV3IGVudHJ5IHdpbGwgImhpZGUiIHRoZSBvbGQgb25lLCB3aGljaCBtZWFucyB0aGF0IHRoZSBuZXcgd2lsbCBiZQorICogZm91bmQgdXBvbiBsb29rdXAvZGVsZXRlLCBub3QgdGhlIG9sZCBvbmUuCisgKi8KK3ZvaWQgKmZvcmNlcHV0SFQoc3RydWN0IEhUICpodCwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgaDsKKworCWggPSAoKCooaHQtPmhhc2gpKShkYXRhKSkgJSBodC0+bmJfbGlzdHM7CisJaHQtPmxpc3RzW2hdID0gYWRkX2VudHJ5KGh0LT5saXN0c1toXSwgZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBlbnRyeSBjb3JyZXNwb25kaW5nIHRvICpkYXRhIGluIHRoZQorICogaGFzaHRhYmxlIGh0ICh1c2luZyB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbiBnaXZlbiBhcyBhcmd1bWVudAorICogdG8gbmV3SFQpCisgKi8KK3ZvaWQgKmdldEhUKHN0cnVjdCBIVCAqaHQsIHZvaWQgKmRhdGEpCit7CisJaW50IGg7CisJc3RydWN0IGhhc2hfaXRlbSAqdDsKKworCWggPSAoKCooaHQtPmhhc2gpKShkYXRhKSkgJSBodC0+bmJfbGlzdHM7CisJaWYgKCh0ID0gZ2V0X2VudHJ5KGh0LT5saXN0c1toXSwgZGF0YSwgaHQtPmNtcGRhdGEpKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKHQtPmRhdGEpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBmaW5kcyBhbmQgZGVsZXRlIHRoZSBlbnRyeSBjb3JyZXNwb25kaW5nIHRvICpkYXRhCisgKiBpbiB0aGUgaGFzaHRhYmxlIGh0ICh1c2luZyB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbiBnaXZlbiBhcworICogYXJndW1lbnQgdG8gbmV3SFQpLgorICovCisKK2ludCBkZWxIVChzdHJ1Y3QgSFQgKmh0LCB2b2lkICpkYXRhKQoreworCWludCBoOworCisJaCA9ICgoKihodC0+aGFzaCkpKGRhdGEpKSAlIGh0LT5uYl9saXN0czsKKwlodC0+bGlzdHNbaF0gPSBkZWxfZW50cnkoaHQtPmxpc3RzW2hdLCBkYXRhLCBodC0+Y21wZGF0YSwgaHQtPmRlbGRhdGEpOworCXJldHVybiAxOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBkdXBsaWNhdGVzIGEgZ2l2ZW4gaGFzaCB0YWJsZTsgdGhlIGRhdGEgaXMgbm90IGNvcGllZAorICovCitzdHJ1Y3QgSFQgKmNvcHlIVChzdHJ1Y3QgSFQgKmh0KQoreworCXN0cnVjdCBIVCAqbmh0ID0gbmV3SFQoaHQtPm5iX2xpc3RzLCBodC0+Y21wZGF0YSwgaHQtPmhhc2gsCisJCWh0LT5kZWxkYXRhKTsKKwlzdHJ1Y3QgaGFzaF9pdGVtICp0OworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IG5odC0+bmJfbGlzdHM7IGkgKyspIHsKKwkJaiA9IDA7CisJCXQgPSBodC0+bGlzdHNbaV07CisJCXdoaWxlICh0KSB7CisJCQl0ID0gdC0+bmV4dDsKKwkJCWogKys7CisJCX0KKwkJaWYgKGogIT0gMCkgeworCQkJbmh0LT5saXN0c1tpXSA9IGdldG1lbShqICogc2l6ZW9mKHN0cnVjdCBoYXNoX2l0ZW0pKTsKKwkJCW1tdihuaHQtPmxpc3RzW2ldLCBodC0+bGlzdHNbaV0sCisJCQkJaiAqIHNpemVvZihzdHJ1Y3QgaGFzaF9pdGVtKSk7CisJCX0KKwl9CisJcmV0dXJuIG5odDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY29tcGxldGVseSBlcmFkaWNhdGVzIGZyb20gbWVtb3J5IGEgZ2l2ZW4gaGFzaCB0YWJsZSwKKyAqIHJlbGVhc2luZyBhbGwgb2JqZWN0cworICovCit2b2lkIGtpbGxIVChzdHJ1Y3QgSFQgKmh0KQoreworCWludCBpOworCXN0cnVjdCBoYXNoX2l0ZW0gKnQsICpuOworCisJZm9yIChpID0gMDsgaSA8IGh0LT5uYl9saXN0czsgaSArKykgZm9yICh0ID0gaHQtPmxpc3RzW2ldOyB0OykgeworCQluID0gdC0+bmV4dDsKKwkJKCooaHQtPmRlbGRhdGEpKSh0LT5kYXRhKTsKKwkJZnJlZW1lbSh0KTsKKwkJdCA9IG47CisJfQorCWZyZWVtZW0oaHQpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBzdG9yZXMgYSBiYWNrdXAgb2YgdGhlIGhhc2ggdGFibGUsIGZvciBjb250ZXh0IHN0YWNraW5nCisgKi8KK3ZvaWQgc2F2ZUhUKHN0cnVjdCBIVCAqaHQsIHZvaWQgKipidWZmZXIpCit7CisJc3RydWN0IGhhc2hfaXRlbSAqKmIgPSAoc3RydWN0IGhhc2hfaXRlbSAqKilidWZmZXI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaHQtPm5iX2xpc3RzOyBpICsrKSBiW2ldID0gaHQtPmxpc3RzW2ldOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiByZXN0b3JlcyB0aGUgc2F2ZWQgc3RhdGUgb2YgdGhlIGhhc2ggdGFibGUuCisgKiBEbyBOT1QgdXNlIGlmIHNvbWUgb2YgdGhlIGVudHJpZXMgdGhhdCB3ZXJlIHByZXNlbnQgYmVmb3JlIHRoZSBiYWNrdXAKKyAqIGhhdmUgYmVlbiByZW1vdmVkIChldmVuIHRlbXBvcmFyaWx5KS4KKyAqLwordm9pZCByZXN0b3JlSFQoc3RydWN0IEhUICpodCwgdm9pZCAqKmJ1ZmZlcikKK3sKKwlzdHJ1Y3QgaGFzaF9pdGVtICoqYiA9IChzdHJ1Y3QgaGFzaF9pdGVtICoqKWJ1ZmZlcjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBodC0+bmJfbGlzdHM7IGkgKyspIHsKKwkJc3RydWN0IGhhc2hfaXRlbSAqdCA9IGh0LT5saXN0c1tpXSwgKm47CisKKwkJd2hpbGUgKHQgIT0gYltpXSkgeworCQkJbiA9IHQtPm5leHQ7CisJCQkoKihodC0+ZGVsZGF0YSkpKHQtPmRhdGEpOworCQkJZnJlZW1lbSh0KTsKKwkJCXQgPSBuOworCQl9CisJCWh0LT5saXN0c1tpXSA9IGJbaV07CisJfQorfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBzY2FucyB0aGUgd2hvbGUgdGFibGUgYW5kIGNhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiBvbgorICogZWFjaCBlbnRyeS4KKyAqLwordm9pZCBzY2FuSFQoc3RydWN0IEhUICpodCwgdm9pZCAoKmFjdGlvbikodm9pZCAqKSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBodC0+bmJfbGlzdHM7IGkgKyspIHsKKwkJc3RydWN0IGhhc2hfaXRlbSAqdCA9IGh0LT5saXN0c1tpXTsKKworCQl3aGlsZSAodCkgeworCQkJKCphY3Rpb24pKHQtPmRhdGEpOworCQkJdCA9IHQtPm5leHQ7CisJCX0KKwl9Cit9CisKKy8qCisgKiBUaGUgdHdvIGZvbGxvd2luZyBmb25jdGlvbnMgYXJlIGdlbmVyaWMgZm9yIHN0b3Jpbmcgc3RydWN0dXJlcworICogdW5pcXVlbHkgaWRlbnRpZmllZCBieSB0aGVpciBuYW1lLCB3aGljaCBtdXN0IGJlIHRoZSBmaXJzdAorICogZmllbGQgb2YgdGhlIHN0cnVjdHVyZS4KKyAqLworaW50IGhhc2hfc3RydWN0KHZvaWQgKm0pCit7CisJY2hhciAqbiA9ICooY2hhciAqKiltOworCisJcmV0dXJuIGhhc2hfc3RyaW5nKG4pICYgMTI3OworfQorCitpbnQgY21wX3N0cnVjdCh2b2lkICptMSwgdm9pZCAqbTIpCit7CisJY2hhciAqbjEgPSAqKGNoYXIgKiopbTEsICpuMiA9ICooY2hhciAqKiltMjsKKworCXJldHVybiAhc3RyY21wKG4xLCBuMik7Cit9CmRpZmYgLS1naXQgYS91Y3BwL2hhc2guaCBiL3VjcHAvaGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQxNWNiY2EKLS0tIC9kZXYvbnVsbAorKysgYi91Y3BwL2hhc2guaApAQCAtMCwwICsxLDU4IEBACisvKgorICogKGMpIFRob21hcyBQb3JuaW4gMTk5OCwgMTk5OSwgMjAwMAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIAorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiAKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAorICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBVQ1BQX19IQVNIX18KKyNkZWZpbmUgVUNQUF9fSEFTSF9fCisKK3N0cnVjdCBoYXNoX2l0ZW07CisKK3N0cnVjdCBIVCB7CisJc3RydWN0IGhhc2hfaXRlbSAqKmxpc3RzOworCWludCBuYl9saXN0czsKKwlpbnQgKCpjbXBkYXRhKSh2b2lkICosIHZvaWQgKik7CisJaW50ICgqaGFzaCkodm9pZCAqKTsKKwl2b2lkICgqZGVsZGF0YSkodm9pZCAqKTsKK307CisKK2ludCBoYXNoX3N0cmluZyhjaGFyICopOworc3RydWN0IEhUICpuZXdIVChpbnQsIGludCAoKikodm9pZCAqLCB2b2lkICopLCBpbnQgKCopKHZvaWQgKiksCisJdm9pZCAoKikodm9pZCAqKSk7Cit2b2lkICpwdXRIVChzdHJ1Y3QgSFQgKiwgdm9pZCAqKTsKK3ZvaWQgKmZvcmNlcHV0SFQoc3RydWN0IEhUICosIHZvaWQgKik7Cit2b2lkICpnZXRIVChzdHJ1Y3QgSFQgKiwgdm9pZCAqKTsKK2ludCBkZWxIVChzdHJ1Y3QgSFQgKiwgdm9pZCAqKTsKK3N0cnVjdCBIVCAqY29weUhUKHN0cnVjdCBIVCAqKTsKK3ZvaWQga2lsbEhUKHN0cnVjdCBIVCAqKTsKK3ZvaWQgc2F2ZUhUKHN0cnVjdCBIVCAqLCB2b2lkICoqKTsKK3ZvaWQgcmVzdG9yZUhUKHN0cnVjdCBIVCAqLCB2b2lkICoqKTsKK3ZvaWQgc2NhbkhUKHN0cnVjdCBIVCAqLCB2b2lkICgqKSh2b2lkICopKTsKK2ludCBoYXNoX3N0cnVjdCh2b2lkICopOworaW50IGNtcF9zdHJ1Y3Qodm9pZCAqLCB2b2lkICopOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3VjcHAvbGV4ZXIuYyBiL3VjcHAvbGV4ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZTVlYmFlCi0tLSAvZGV2L251bGwKKysrIGIvdWNwcC9sZXhlci5jCkBAIC0wLDAgKzEsMTA1MCBAQAorLyoKKyAqIChjKSBUaG9tYXMgUG9ybmluIDE5OTksIDIwMDAKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwKKyAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKy8qdmIqLworI2lmZGVmIEhBVkVfTUlTUkEKK2V4dGVybiBpbnQgbWlzcmFjaGVjazsKK3ZvaWQgbWlzcmEoaW50LC4uLik7Cit2b2lkIG1pc3JhX25ldShpbnQsIGludCwgaW50LCBpbnQsIC4uLik7CisjZW5kaWYKKworI2luY2x1ZGUgInR1bmUuaCIKKyNpZmRlZiBVQ1BQX01NQVAKKyNpZm5kZWYgX1BPU0lYX1NPVVJDRQorI2RlZmluZSBfUE9TSVhfU09VUkNFCTEKKyNlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgInVjcHBpLmgiCisjaW5jbHVkZSAibWVtLmgiCisjaWZkZWYgVUNQUF9NTUFQCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNlbmRpZgorCisvKgorICogQ2hhcmFjdGVyIGNsYXNzZXMgZm9yIGRlc2NyaXB0aW9uIG9mIHRoZSBhdXRvbWF0b24uCisgKiBUaGUgY2hhcmFjdGVycyB1c2VkIGZvciByZXByZXNlbnRpbmcgY2xhc3NlcyBzaG91bGQgbm90IGFwcGVhcgorICogZXhwbGljaXRlbHkgaW4gYW4gYXV0b21hdG9uIHJ1bGUuCisgKi8KKyNkZWZpbmUgU1BDCScgJwkvKiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgKi8KKyNkZWZpbmUgQUxQCSdaJwkvKiBBLVosIGEteiwgXyAqLworI2RlZmluZSBOVU0JJzknCS8qIDAtOSAqLworI2RlZmluZSBBTlkJJ1knCS8qIGFueSBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgVkNICSdGJwkvKiB2b2lkIGNoYXJhY3RlciAoZm9yIGVuZCBvZiBpbnB1dCkgKi8KKworLyoKKyAqIGZsYWdzIGFuZCBtYWNyb3MgdG8gdGVzdCB0aG9zZSBmbGFncworICogU1RPOiB0aGUgY3VycmVudGx5IHJlYWQgc3RyaW5nIGlzIGEgY29tcGxldGUgdG9rZW4KKyAqIFBVVDogdGhlIGN1cnJlbnRseSByZWFkIGNoYXJhY3RlciBtdXN0IGJlIGFkZGVkIHRvIHRoZSBzdHJpbmcKKyAqIEZSWjogdGhlIGN1cnJlbnRseSByZWFkIGNoYXJhY3RlciBtdXN0IGJlIGtlcHQgYW5kIHJlYWQgYWdhaW4KKyAqLworI2RlZmluZSBNT0RfTUsJCTI1NQorI2RlZmluZSBub01PRCh4KQkoKHgpICYgMjU1KQorI2RlZmluZSBTVE8oeCkJCSgoeCkgfCAyNTYpCisjZGVmaW5lIHR0U1RPKHgpCSgoeCkgJiAyNTYpCisjZGVmaW5lIEZSWih4KQkJKCh4KSB8IDUxMikKKyNkZWZpbmUgdHRGUlooeCkJKCh4KSAmIDUxMikKKyNkZWZpbmUgUFVUKHgpCQkoKHgpIHwgMTAyNCkKKyNkZWZpbmUgdHRQVVQoeCkJKCh4KSAmIDEwMjQpCisKKy8qIG9yZGVyIGlzIGltcG9ydGFudCAqLworZW51bSB7CisJU19TVEFSVCwgU19TUEFDRSwgU19CQU5HLCBTX1NUUklORywgU19TVFJJTkcyLCBTX0NPTE9OLAorCVNfU0hBUlAsIFNfUENULCBTX1BDVDIsIFNfUENUMywgU19BTVBFUiwgU19DSEFSLCBTX0NIQVIyLCBTX1NUQVIsCisJU19QTFVTLCBTX01JTlVTLCBTX0RPVCwgU19ET1QyLCBTX1NMQVNILCBTX05VTUJFUiwgU19OVU1CRVIyLCBTX0xULAorCVNfTFQyLCBTX0VRLCBTX0dULCBTX0dUMiwgU19DSVJDLCBTX1BJUEUsIFNfVElMREUsIFNfQkFDS1NMQVNILAorCVNfQ09NTUVOVCwgU19DT01NRU5UMiwgU19DT01NRU5UMywgU19DT01NRU5UNCwgU19DT01NRU5UNSwKKwlTX05BTUUsIFNfTkFNRV9CUywgU19MQ0hBUiwKKwlNU1RBVEUsCisJU19JTEwsIFNfRERPVCwgU19ERFNIQVJQLCBTX0JTLCBTX1JPR1VFX0JTLCBTX0JFSEVBRCwgU19ERUNBWSwKKwlTX1RSVU5DLCBTX1RSVU5DQywgU19PVUNICit9OworCisjZGVmaW5lIENNVCh4KQkJKCh4KSA+PSBTX0NPTU1FTlQgJiYgKHgpIDw9IFNfQ09NTUVOVDUpCisKKyNkZWZpbmUgQ01DUgkyCisKKy8qCisgKiBUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYXV0b21hdG9uLiBJdCBpcyBub3QgdXNlZCAiYXMgaXMiCisgKiBidXQgY29waWVkIGF0IGV4ZWN1dGlvbiB0aW1lIGludG8gYSB0YWJsZS4KKyAqCisgKiBUbyBteSB1dG1vc3QgZGlzcGxlYXN1cmUsIHRoZXJlIGFyZSBhIGZldyBoYWNrcyBpbiByZWFkX3Rva2VuKCkKKyAqICh3aGljaCB1c2VzIHRoZSB0cmFuc2Zvcm1lZCBhdXRvbWF0b24pIGFib3V0IHRoZSBzcGVjaWFsIGhhbmRsaW5nCisgKiBvZiBzbGFzaGVzLCBzaGFycHMsIGFuZCB0aGUgbGV0dGVyIEwuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbWFjaGluZV9zdGF0ZSB7CisJaW50IHN0YXRlOworCXVuc2lnbmVkIGNoYXIgaW5wdXRbQ01DUl07CisJaW50IG5ld19zdGF0ZTsKK30gY3BwbXNbXSA9IHsKKwkvKiBTX1NUQVJUIGlzIHRoZSBnZW5lcmljIGJlZ2lubmluZyBzdGF0ZSAqLworCXsgU19TVEFSVCwJeyBBTlkgfSwJU19JTEwJCQl9LAorI2lmZGVmIFNFTVBFUl9GSURFTElTCisJeyBTX1NUQVJULAl7IFNQQyB9LAlQVVQoU19TUEFDRSkJCX0sCisjZWxzZQorCXsgU19TVEFSVCwJeyBTUEMgfSwJU19TUEFDRQkJCX0sCisjZW5kaWYKKwl7IFNfU1RBUlQsCXsgJ1xuJyB9LAlTVE8oTkVXTElORSkJCX0sCisJeyBTX1NUQVJULAl7ICchJyB9LAlTX0JBTkcJCQl9LAorCXsgU19TVEFSVCwJeyAnIicgfSwJUFVUKFNfU1RSSU5HKQkJfSwKKwl7IFNfU1RBUlQsCXsgJyMnIH0sCVNfU0hBUlAJCQl9LAorCXsgU19TVEFSVCwJeyAnJScgfSwJU19QQ1QJCQl9LAorCXsgU19TVEFSVCwJeyAnJicgfSwJU19BTVBFUgkJCX0sCisJeyBTX1NUQVJULAl7ICdcJycgfSwJUFVUKFNfQ0hBUikJCX0sCisJeyBTX1NUQVJULAl7ICcoJyB9LAlTVE8oTFBBUikJCX0sCisJeyBTX1NUQVJULAl7ICcpJyB9LAlTVE8oUlBBUikJCX0sCisJeyBTX1NUQVJULAl7ICcqJyB9LAlTX1NUQVIJCQl9LAorCXsgU19TVEFSVCwJeyAnKycgfSwJU19QTFVTCQkJfSwKKwl7IFNfU1RBUlQsCXsgJywnIH0sCVNUTyhDT01NQSkJCX0sCisJeyBTX1NUQVJULAl7ICctJyB9LAlTX01JTlVTCQkJfSwKKwl7IFNfU1RBUlQsCXsgJy4nIH0sCVBVVChTX0RPVCkJCX0sCisjaWZkZWYgU0VNUEVSX0ZJREVMSVMKKwl7IFNfU1RBUlQsCXsgJy8nIH0sCVBVVChTX1NMQVNIKQkJfSwKKyNlbHNlCisJeyBTX1NUQVJULAl7ICcvJyB9LAlTX1NMQVNICQkJfSwKKyNlbmRpZgorCXsgU19TVEFSVCwJeyBOVU0gfSwJUFVUKFNfTlVNQkVSKQkJfSwKKyNpZmRlZiBIQVZFX0VDUFAKKwl7IFNfU1RBUlQsCXsgJ0AnIH0sCVNfQ09MT04JCQl9LAorCXsgU19TVEFSVCwJeyAnOicgfSwJUFVUKFNfTkFNRSkJCX0sCisjZWxzZQorCXsgU19TVEFSVCwJeyAnOicgfSwJU19DT0xPTgkJCX0sCisjZW5kaWYKKwl7IFNfU1RBUlQsCXsgJzsnIH0sCVNUTyhTRU1JQykJCX0sCisJeyBTX1NUQVJULAl7ICc8JyB9LAlTX0xUCQkJfSwKKwl7IFNfU1RBUlQsCXsgJz0nIH0sCVNfRVEJCQl9LAorCXsgU19TVEFSVCwJeyAnPicgfSwJU19HVAkJCX0sCisJeyBTX1NUQVJULAl7ICc/JyB9LAlTVE8oUVVFU1QpCQl9LAorCXsgU19TVEFSVCwJeyBBTFAgfSwJUFVUKFNfTkFNRSkJCX0sCisJeyBTX1NUQVJULAl7ICdMJyB9LAlQVVQoU19MQ0hBUikJCX0sCisJeyBTX1NUQVJULAl7ICdbJyB9LAlTVE8oTEJSSykJCX0sCisJeyBTX1NUQVJULAl7ICddJyB9LAlTVE8oUkJSSykJCX0sCisJeyBTX1NUQVJULAl7ICdeJyB9LAlTX0NJUkMJCQl9LAorCXsgU19TVEFSVCwJeyAneycgfSwJU1RPKExCUkEpCQl9LAorCXsgU19TVEFSVCwJeyAnfCcgfSwJU19QSVBFCQkJfSwKKwl7IFNfU1RBUlQsCXsgJ30nIH0sCVNUTyhSQlJBKQkJfSwKKwl7IFNfU1RBUlQsCXsgJ34nIH0sCVNfVElMREUJCQl9LAorCXsgU19TVEFSVCwJeyAnXFwnIH0sCVNfQkFDS1NMQVNICQl9LAorCisJLyogYWZ0ZXIgYSBzcGFjZSAqLworCXsgU19TUEFDRSwJeyBBTlkgfSwJRlJaKFNUTyhOT05FKSkJCX0sCisjaWZkZWYgU0VNUEVSX0ZJREVMSVMKKwl7IFNfU1BBQ0UsCXsgU1BDIH0sCVBVVChTX1NQQUNFKQkJfSwKKyNlbHNlCisJeyBTX1NQQUNFLAl7IFNQQyB9LAlTX1NQQUNFCQkJfSwKKyNlbmRpZgorCisJLyogYWZ0ZXIgYSAhICovCisJeyBTX0JBTkcsCXsgQU5ZIH0sCUZSWihTVE8oTE5PVCkpCQl9LAorCXsgU19CQU5HLAl7ICc9JyB9LAlTVE8oTkVRKQkJfSwKKworCS8qIGFmdGVyIGEgIiAqLworCXsgU19TVFJJTkcsCXsgQU5ZIH0sCVBVVChTX1NUUklORykJCX0sCisJeyBTX1NUUklORywJeyBWQ0ggfSwJRlJaKFNfVFJVTkMpCQl9LAorCXsgU19TVFJJTkcsCXsgJ1xuJyB9LAlGUlooU19CRUhFQUQpCQl9LAorCXsgU19TVFJJTkcsCXsgJ1xcJyB9LAlQVVQoU19TVFJJTkcyKQkJfSwKKwl7IFNfU1RSSU5HLAl7ICciJyB9LAlQVVQoU1RPKFNUUklORykpCX0sCisKKwl7IFNfU1RSSU5HMiwJeyBBTlkgfSwJUFVUKFNfU1RSSU5HKQkJfSwKKwl7IFNfU1RSSU5HMiwJeyBWQ0ggfSwJRlJaKFNfVFJVTkMpCQl9LAorCisJLyogYWZ0ZXIgYSAjICovCisJeyBTX1NIQVJQLAl7IEFOWSB9LAlGUlooU1RPKFNIQVJQKSkJCX0sCisJeyBTX1NIQVJQLAl7ICcjJyB9LAlTVE8oRFNIQVJQKQkJfSwKKworCS8qIGFmdGVyIGEgOiAqLworCXsgU19DT0xPTiwJeyBBTlkgfSwJRlJaKFNUTyhDT0xPTikpCQl9LAorCXsgU19DT0xPTiwJeyAnPicgfSwJU1RPKERJR19SQlJLKQkJfSwKKworCS8qIGFmdGVyIGEgJSAqLworCXsgU19QQ1QsCXsgQU5ZIH0sCUZSWihTVE8oUENUKSkJCX0sCisJeyBTX1BDVCwJeyAnPScgfSwJU1RPKEFTUENUKQkJfSwKKwl7IFNfUENULAl7ICc+JyB9LAlTVE8oRElHX1JCUkEpCQl9LAorCXsgU19QQ1QsCXsgJzonIH0sCVNfUENUMgkJCX0sCisKKwkvKiBhZnRlciBhICU6ICovCisJeyBTX1BDVDIsCXsgQU5ZIH0sCUZSWihTVE8oRElHX1NIQVJQKSkJfSwKKwl7IFNfUENUMiwJeyAnJScgfSwJU19QQ1QzCQkJfSwKKworCS8qIGFmdGVyIGEgJTolICovCisJeyBTX1BDVDMsCXsgQU5ZIH0sCUZSWihTX0REU0hBUlApCQl9LAorCXsgU19QQ1QzLAl7ICc6JyB9LAlTVE8oRElHX0RTSEFSUCkJCX0sCisKKwkvKiBhZnRlciBhICYgKi8KKwl7IFNfQU1QRVIsCXsgQU5ZIH0sCUZSWihTVE8oQU5EKSkJCX0sCisJeyBTX0FNUEVSLAl7ICc9JyB9LAlTVE8oQVNBTkQpCQl9LAorCXsgU19BTVBFUiwJeyAnJicgfSwJU1RPKExBTkQpCQl9LAorCisJLyogYWZ0ZXIgYSAnICovCisJeyBTX0NIQVIsCXsgQU5ZIH0sCVBVVChTX0NIQVIpCQl9LAorCXsgU19DSEFSLAl7IFZDSCB9LAlGUlooU19UUlVOQykJCX0sCisJeyBTX0NIQVIsCXsgJ1wnJyB9LAlQVVQoU1RPKENIQVIpKQkJfSwKKwl7IFNfQ0hBUiwJeyAnXFwnIH0sCVBVVChTX0NIQVIyKQkJfSwKKworCS8qIGFmdGVyIGEgXCBpbiBhIGNoYXJhY3RlciBjb25zdGFudAorCSAgIHVzZWZ1bCBvbmx5IGZvciAnXCcnICovCisJeyBTX0NIQVIyLAl7IEFOWSB9LAlQVVQoU19DSEFSKQkJfSwKKwl7IFNfQ0hBUjIsCXsgVkNIIH0sCUZSWihTX1RSVU5DKQkJfSwKKworCS8qIGFmdGVyIGEgKiAqLworCXsgU19TVEFSLAl7IEFOWSB9LAlGUlooU1RPKFNUQVIpKQkJfSwKKwl7IFNfU1RBUiwJeyAnPScgfSwJU1RPKEFTU1RBUikJCX0sCisKKwkvKiBhZnRlciBhICsgKi8KKwl7IFNfUExVUywJeyBBTlkgfSwJRlJaKFNUTyhQTFVTKSkJCX0sCisJeyBTX1BMVVMsCXsgJysnIH0sCVNUTyhQUExVUykJCX0sCisJeyBTX1BMVVMsCXsgJz0nIH0sCVNUTyhBU1BMVVMpCQl9LAorCisJLyogYWZ0ZXIgYSAtICovCisJeyBTX01JTlVTLAl7IEFOWSB9LAlGUlooU1RPKE1JTlVTKSkJCX0sCisJeyBTX01JTlVTLAl7ICctJyB9LAlTVE8oTU1JTlVTKQkJfSwKKwl7IFNfTUlOVVMsCXsgJz0nIH0sCVNUTyhBU01JTlVTKQkJfSwKKwl7IFNfTUlOVVMsCXsgJz4nIH0sCVNUTyhBUlJPVykJCX0sCisKKwkvKiBhZnRlciBhIC4gKi8KKwl7IFNfRE9ULAl7IEFOWSB9LAlGUlooU1RPKERPVCkpCQl9LAorCXsgU19ET1QsCXsgTlVNIH0sCVBVVChTX05VTUJFUikJCX0sCisJeyBTX0RPVCwJeyAnLicgfSwJU19ET1QyCQkJfSwKKworCS8qIGFmdGVyIC4uICovCisJeyBTX0RPVDIsCXsgQU5ZIH0sCUZSWihTX0RET1QpCQl9LAorCXsgU19ET1QyLAl7ICcuJyB9LAlTVE8oTURPVFMpCQl9LAorCisJLyogYWZ0ZXIgYSAvICovCisJeyBTX1NMQVNILAl7IEFOWSB9LAlGUlooU1RPKFNMQVNIKSkJCX0sCisJeyBTX1NMQVNILAl7ICc9JyB9LAlTVE8oQVNTTEFTSCkJCX0sCisjaWZkZWYgU0VNUEVSX0ZJREVMSVMKKwl7IFNfU0xBU0gsCXsgJyonIH0sCVBVVChTX0NPTU1FTlQpCQl9LAorCXsgU19TTEFTSCwJeyAnLycgfSwJUFVUKFNfQ09NTUVOVDUpCQl9LAorI2Vsc2UKKwl7IFNfU0xBU0gsCXsgJyonIH0sCVNfQ09NTUVOVAkJfSwKKwl7IFNfU0xBU0gsCXsgJy8nIH0sCVNfQ09NTUVOVDUJCX0sCisjZW5kaWYKKwkvKgorCSAqIFRoZXJlIGlzIGEgbGl0dGxlIGhhY2sgaW4gcmVhZF90b2tlbigpIHRvIGRpc2FibGUKKwkgKiB0aGlzIGxhc3QgcnVsZSwgaWYgQysrIChDOTkpIGNvbW1lbnRzIGFyZSBub3QgZW5hYmxlZC4KKwkgKi8KKworCS8qIGFmdGVyIGEgbnVtYmVyICovCisJeyBTX05VTUJFUiwJeyBBTlkgfSwJRlJaKFNUTyhOVU1CRVIpKQl9LAorCXsgU19OVU1CRVIsCXsgQUxQLCBOVU0gfSwJUFVUKFNfTlVNQkVSKQkJfSwKKwl7IFNfTlVNQkVSLAl7ICcuJyB9LAlQVVQoU19OVU1CRVIpCQl9LAorCXsgU19OVU1CRVIsCXsgJ0UnLCAnZScgfSwJUFVUKFNfTlVNQkVSMikJCX0sCisJeyBTX05VTUJFUiwJeyAnUCcsICdwJyB9LAlQVVQoU19OVU1CRVIyKQkJfSwKKworCXsgU19OVU1CRVIyLAl7IEFOWSB9LAlGUlooU1RPKE5VTUJFUikpCX0sCisJeyBTX05VTUJFUjIsCXsgQUxQLCBOVU0gfSwJUFVUKFNfTlVNQkVSKQkJfSwKKwl7IFNfTlVNQkVSMiwJeyAnKycsICctJyB9LAlQVVQoU19OVU1CRVIpCQl9LAorCisJLyogYWZ0ZXIgYSA8ICovCisJeyBTX0xULAkJeyBBTlkgfSwJRlJaKFNUTyhMVCkpCQl9LAorCXsgU19MVCwJCXsgJz0nIH0sCVNUTyhMRVEpCQl9LAorCXsgU19MVCwJCXsgJzwnIH0sCVNfTFQyCQkJfSwKKwl7IFNfTFQsCQl7ICc6JyB9LAlTVE8oRElHX0xCUkspCQl9LAorCXsgU19MVCwJCXsgJyUnIH0sCVNUTyhESUdfTEJSQSkJCX0sCisKKwl7IFNfTFQyLAl7IEFOWSB9LAlGUlooU1RPKExTSCkpCQl9LAorCXsgU19MVDIsCXsgJz0nIH0sCVNUTyhBU0xTSCkJCX0sCisKKwkvKiBhZnRlciBhID4gKi8KKwl7IFNfR1QsCQl7IEFOWSB9LAlGUlooU1RPKEdUKSkJCX0sCisJeyBTX0dULAkJeyAnPScgfSwJU1RPKEdFUSkJCX0sCisJeyBTX0dULAkJeyAnPicgfSwJU19HVDIJCQl9LAorCisJeyBTX0dUMiwJeyBBTlkgfSwJRlJaKFNUTyhSU0gpKQkJfSwKKwl7IFNfR1QyLAl7ICc9JyB9LAlTVE8oQVNSU0gpCQl9LAorCisJLyogYWZ0ZXIgYSA9ICovCisJeyBTX0VRLAkJeyBBTlkgfSwJRlJaKFNUTyhBU0dOKSkJCX0sCisJeyBTX0VRLAkJeyAnPScgfSwJU1RPKFNBTUUpCQl9LAorI2lmZGVmIENBU1RfT1AKKwl7IFNfRVEsCQl7ICc+JyB9LAlTVE8oQ0FTVCkJCX0sCisjZW5kaWYKKworCS8qIGFmdGVyIGEgXCAqLworCXsgU19CQUNLU0xBU0gsCXsgQU5ZIH0sCUZSWihTX0JTKQkJfSwKKwl7IFNfQkFDS1NMQVNILAl7ICdVJywgJ3UnIH0sCUZSWihTX05BTUVfQlMpCQl9LAorCisJLyogYWZ0ZXIgYSBsZXR0ZXIgKi8KKwl7IFNfTkFNRSwJeyBBTlkgfSwJRlJaKFNUTyhOQU1FKSkJCX0sCisJeyBTX05BTUUsCXsgQUxQLCBOVU0gfSwJUFVUKFNfTkFNRSkJCX0sCisJeyBTX05BTUUsCXsgJ1xcJyB9LAlTX05BTUVfQlMJCX0sCisjaWZkZWYgSEFWRV9FQ1BQCisJeyBTX05BTUUsCXsgJzonIH0sCVBVVChTX05BTUUpCQl9LAorI2VuZGlmCisKKwkvKiBhZnRlciBhIFwgaW4gYW4gaWRlbnRpZmllciAqLworCXsgU19OQU1FX0JTLAl7IEFOWSB9LAlGUlooU19ST0dVRV9CUykJCX0sCisJeyBTX05BTUVfQlMsCXsgJ3UnLCAnVScgfSwJUFVUKFNfTkFNRSkJCX0sCisKKwkvKiBhZnRlciBhIEwgKi8KKwl7IFNfTENIQVIsCXsgQU5ZIH0sCUZSWihTX05BTUUpCQl9LAorCXsgU19MQ0hBUiwJeyAnIicgfSwJUFVUKFNfU1RSSU5HKQkJfSwKKwl7IFNfTENIQVIsCXsgJ1wnJyB9LAlQVVQoU19DSEFSKQkJfSwKKworCS8qIGFmdGVyIGEgXiAqLworCXsgU19DSVJDLAl7IEFOWSB9LAlGUlooU1RPKENJUkMpKQkJfSwKKwl7IFNfQ0lSQywJeyAnPScgfSwJU1RPKEFTQ0lSQykJCX0sCisKKwkvKiBhZnRlciBhIHwgKi8KKwl7IFNfUElQRSwJeyBBTlkgfSwJRlJaKFNUTyhPUikpCQl9LAorCXsgU19QSVBFLAl7ICc9JyB9LAlTVE8oQVNPUikJCX0sCisJeyBTX1BJUEUsCXsgJ3wnIH0sCVNUTyhMT1IpCQl9LAorCisJLyogYWZ0ZXIgYSB+ICovCisJeyBTX1RJTERFLAl7IEFOWSB9LAlGUlooU1RPKE5PVCkpCQl9LAorCXsgU19USUxERSwJeyAnPScgfSwJU1RPKEFTTk9UKQkJfSwKKworCS8qIGFmdGVyIGEgLyBhbmQgKiAqLworI2lmZGVmIFNFTVBFUl9GSURFTElTCisJeyBTX0NPTU1FTlQsCXsgQU5ZIH0sCVBVVChTX0NPTU1FTlQpCQl9LAorCXsgU19DT01NRU5ULAl7IFZDSCB9LAlGUlooU19UUlVOQ0MpCQl9LAorCXsgU19DT01NRU5ULAl7ICcqJyB9LAlQVVQoU19DT01NRU5UMikJCX0sCisKKwl7IFNfQ09NTUVOVDIsCXsgQU5ZIH0sCUZSWihTX0NPTU1FTlQpCQl9LAorCXsgU19DT01NRU5UMiwJeyBWQ0ggfSwJRlJaKFNfVFJVTkNDKQkJfSwKKwl7IFNfQ09NTUVOVDIsCXsgJyonIH0sCVBVVChTX0NPTU1FTlQyKQkJfSwKKwl7IFNfQ09NTUVOVDIsCXsgJy8nIH0sCVNUTyhQVVQoQ09NTUVOVCkpCX0sCisKKwl7IFNfQ09NTUVOVDUsCXsgQU5ZIH0sCVBVVChTX0NPTU1FTlQ1KQkJfSwKKwl7IFNfQ09NTUVOVDUsCXsgVkNIIH0sCUZSWihTX0RFQ0FZKQkJfSwKKwl7IFNfQ09NTUVOVDUsCXsgJ1xuJyB9LAlGUlooU1RPKENPTU1FTlQpKQl9LAorI2Vsc2UKKwl7IFNfQ09NTUVOVCwJeyBBTlkgfSwJU19DT01NRU5UCQl9LAorCXsgU19DT01NRU5ULAl7IFZDSCB9LAlGUlooU19UUlVOQ0MpCQl9LAorCXsgU19DT01NRU5ULAl7ICcqJyB9LAlTX0NPTU1FTlQyCQl9LAorCisJeyBTX0NPTU1FTlQyLAl7IEFOWSB9LAlGUlooU19DT01NRU5UKQkJfSwKKwl7IFNfQ09NTUVOVDIsCXsgVkNIIH0sCUZSWihTX1RSVU5DQykJCX0sCisJeyBTX0NPTU1FTlQyLAl7ICcqJyB9LAlTX0NPTU1FTlQyCQl9LAorCXsgU19DT01NRU5UMiwJeyAnLycgfSwJU1RPKENPTU1FTlQpCQl9LAorCisJeyBTX0NPTU1FTlQ1LAl7IEFOWSB9LAlTX0NPTU1FTlQ1CQl9LAorCXsgU19DT01NRU5UNSwJeyBWQ0ggfSwJRlJaKFNfREVDQVkpCQl9LAorCXsgU19DT01NRU5UNSwJeyAnXG4nIH0sCUZSWihTVE8oQ09NTUVOVCkpCX0sCisjZW5kaWYKKworCS8qIGR1bW15IGVuZCBvZiBtYWNoaW5lIGRlc2NyaXB0aW9uICovCisJeyAwLAkJeyAwIH0sCQkwCQkJfQorfTsKKworLyoKKyAqIGNwcG0gaXMgdGhlIHRhYmxlIHVzZWQgdG8gc3RvcmUgdGhlIGF1dG9tYXRvbjogaWYgd2UgYXJlIGluIHN0YXRlIHMKKyAqIGFuZCB3ZSByZWFkIGNoYXJhY3RlciBjLCB3ZSBhcHBseSB0aGUgYWN0aW9uIGNwcG1bc11bY10gKGp1bXBpbmcgdG8KKyAqIGFub3RoZXIgc3RhdGUsIG9yIGVtaXR0aW5nIGEgdG9rZW4pLgorICogY3BwbV92Y2ggaXMgdGhlIHRhYmxlIGZvciB0aGUgc3BlY2lhbCB2aXJ0dWFsIGNoYXJhY3RlciAiZW5kIG9mIGlucHV0IgorICovCitzdGF0aWMgaW50IGNwcG1bTVNUQVRFXVtNQVhfQ0hBUl9WQUxdOworc3RhdGljIGludCBjcHBtX3ZjaFtNU1RBVEVdOworCisvKgorICogaW5pdF9jcHBtKCkgZmlsbHMgY3BwbVtdW10gd2l0aCB0aGUgaW5mb3JtYXRpb24gc3RvcmVkIGluIGNwcG1zW10uCisgKiBJdCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYmVnaW5uaW5nIHRoZSBsZXhpbmcgcHJvY2Vzcy4KKyAqLwordm9pZCBpbml0X2NwcG0odm9pZCkKK3sKKwlpbnQgaSwgaiwgaywgYzsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciB1cHBlcltdID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBsb3dlcltdID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKKwl1bnNpZ25lZCBjaGFyICpjcDsKKworCWZvciAoaSA9IDA7IGkgPCBNU1RBVEU7IGkgKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IE1BWF9DSEFSX1ZBTDsgaiArKykgY3BwbVtpXVtqXSA9IFNfT1VDSDsKKwkJY3BwbV92Y2hbaV0gPSBTX09VQ0g7CisJfQorCWZvciAoaSA9IDA7IGNwcG1zW2ldLmlucHV0WzBdOyBpICsrKSBmb3IgKGsgPSAwOyBrIDwgQ01DUjsgayArKykgeworCQlpbnQgcyA9IGNwcG1zW2ldLnN0YXRlOworCQlpbnQgbnMgPSBjcHBtc1tpXS5uZXdfc3RhdGU7CisKKwkJc3dpdGNoIChjID0gY3BwbXNbaV0uaW5wdXRba10pIHsKKwkJY2FzZSAwOgorCQkJYnJlYWs7CisJCWNhc2UgU1BDOgorCQkJLyogc2VlIHNwYWNlX2NoYXIoKSBhbHNvICovCisJCQljcHBtW3NdWycgJ10gPSBuczsKKwkJCWNwcG1bc11bJ1x0J10gPSBuczsKKwkJCWNwcG1bc11bJ1x2J10gPSBuczsKKwkJCWNwcG1bc11bJ1xmJ10gPSBuczsKKyNpZmRlZiBVTkJSRUFLQUJMRV9TUEFDRQorCQkJaWYgKE1BWF9DSEFSX1ZBTCA+IFVOQlJFQUtBQkxFX1NQQUNFKQorCQkJCWNwcG1bc11bVU5CUkVBS0FCTEVfU1BBQ0VdID0gbnM7CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlIEFMUDoKKwkJCWZvciAoY3AgPSB1cHBlcjsgKmNwOyBjcCArKykgY3BwbVtzXVsoaW50KSpjcF0gPSBuczsKKwkJCWZvciAoY3AgPSBsb3dlcjsgKmNwOyBjcCArKykgY3BwbVtzXVsoaW50KSpjcF0gPSBuczsKKwkJCWNwcG1bc11bJ18nXSA9IG5zOworCQkJYnJlYWs7CisJCWNhc2UgTlVNOgorCQkJZm9yIChqID0gJzAnOyBqIDw9ICc5JzsgaiArKykgY3BwbVtzXVtqXSA9IG5zOworCQkJYnJlYWs7CisJCWNhc2UgQU5ZOgorCQkJZm9yIChqID0gMDsgaiA8IE1BWF9DSEFSX1ZBTDsgaiArKykgY3BwbVtzXVtqXSA9IG5zOworCQkJY3BwbV92Y2hbc10gPSBuczsKKwkJCWJyZWFrOworCQljYXNlIFZDSDoKKwkJCWNwcG1fdmNoW3NdID0gbnM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNwcG1bc11bY10gPSBuczsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitpbnQgc3BhY2VfY2hhcihpbnQgYykKK3sKKwlpZiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IGMgPT0gJ1x2JyB8fCBjID09ICdcZicKKyNpZmRlZiBVTkJSRUFLQUJMRV9TUEFDRQorCQl8fCBjID09IFVOQlJFQUtBQkxFX1NQQUNFCisjZW5kaWYKKwkJKSByZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworI2lmbmRlZiBOT19VQ1BQX0JVRgorLyoKKyAqIG91ciBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwsIGZsdXNoIGl0CisgKi8KK3ZvaWQgZmx1c2hfb3V0cHV0KHN0cnVjdCBsZXhlcl9zdGF0ZSAqbHMpCit7CisJc2l6ZV90IHggPSBscy0+c2J1ZiwgeSA9IDAsIHo7CisKKwlpZiAobHMtPnNidWYgPT0gMCkgcmV0dXJuOworCWRvIHsKKwkJeiA9IGZ3cml0ZShscy0+b3V0cHV0X2J1ZiArIHksIDEsIHgsIGxzLT5vdXRwdXQpOworCQl4IC09IHo7CisJCXkgKz0gejsKKwl9IHdoaWxlICh6ICYmIHggPiAwKTsKKwlpZiAoIXkpIHsKKwkJZXJyb3IobHMtPmxpbmUsICJjb3VsZCBub3QgZmx1c2ggb3V0cHV0IChkaXNrIGZ1bGwgPykiKTsKKwkJZGllKCk7CisJfQorCWxzLT5zYnVmID0gMDsKK30KKyNlbmRpZgorCisvKgorICogT3V0cHV0IG9uZSBjaGFyYWN0ZXI7IGZsdXNoIHRoZSBidWZmZXIgaWYgbmVlZGVkLgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCwgZXhjZXB0IGJ5IHB1dF9jaGFyKCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9jaGFyKHN0cnVjdCBsZXhlcl9zdGF0ZSAqbHMsIHVuc2lnbmVkIGNoYXIgYykKK3sKKyNpZm5kZWYgTk9fVUNQUF9CVUYKKwlscy0+b3V0cHV0X2J1Zltscy0+c2J1ZiArK10gPSBjOworCWlmIChscy0+c2J1ZiA9PSBPVVRQVVRfQlVGX01FTUcpIGZsdXNoX291dHB1dChscyk7CisjZWxzZQorCWlmIChwdXRjKChpbnQpYywgbHMtPm91dHB1dCkgPT0gRU9GKSB7CisJCWVycm9yKGxzLT5saW5lLCAib3V0cHV0IHdyaXRlIGVycm9yIChkaXNrIGZ1bGwgPykiKTsKKwkJZGllKCk7CisJfQorI2VuZGlmCisJaWYgKGMgPT0gJ1xuJykgeworCQlscy0+b2xpbmUgKys7CisJfQorfQorCisvKgorICogc2NoZWR1bGUgYSBjaGFyYWN0ZXIgZm9yIG91dHB1dAorICovCit2b2lkIHB1dF9jaGFyKHN0cnVjdCBsZXhlcl9zdGF0ZSAqbHMsIHVuc2lnbmVkIGNoYXIgYykKK3sKKwlpZiAobHMtPmZsYWdzICYgS0VFUF9PVVRQVVQpIHdyaXRlX2NoYXIobHMsIGMpOworfQorCisvKgorICogZ2V0IG5leHQgcmF3IGlucHV0IGNoYXJhY3RlcgorICovCitzdGF0aWMgaW5saW5lIGludCByZWFkX2NoYXIoc3RydWN0IGxleGVyX3N0YXRlICpscykKK3sKKwl1bnNpZ25lZCBjaGFyIGM7CisKKwlpZiAoIWxzLT5pbnB1dCkgeworCQlyZXR1cm4gKChscy0+cGJ1ZiArKykgPCBscy0+ZWJ1ZikgPworCQkJbHMtPmlucHV0X3N0cmluZ1tscy0+cGJ1ZiAtIDFdIDogLTE7CisJfQorCXdoaWxlICgxKSB7CisjaWZuZGVmIE5PX1VDUFBfQlVGCisJCWlmIChscy0+cGJ1ZiA9PSBscy0+ZWJ1ZikgeworI2lmZGVmIFVDUFBfTU1BUAorCQkJaWYgKGxzLT5mcm9tX21tYXApIHsKKwkJCQltdW5tYXAoKHZvaWQgKilscy0+aW5wdXRfYnVmLCBscy0+ZWJ1Zik7CisJCQkJbHMtPmZyb21fbW1hcCA9IDA7CisJCQkJbHMtPmlucHV0X2J1ZiA9IGxzLT5pbnB1dF9idWZfc2F2OworCQkJfQorI2VuZGlmCisJCQlscy0+ZWJ1ZiA9IGZyZWFkKGxzLT5pbnB1dF9idWYsIDEsCisJCQkJSU5QVVRfQlVGX01FTUcsIGxzLT5pbnB1dCk7CisJCQlscy0+cGJ1ZiA9IDA7CisJCX0KKwkJaWYgKGxzLT5lYnVmID09IDApIHJldHVybiAtMTsKKwkJYyA9IGxzLT5pbnB1dF9idWZbbHMtPnBidWYgKytdOworI2Vsc2UKKwkJaW50IHggPSBnZXRjKGxzLT5pbnB1dCk7CisKKwkJaWYgKHggPT0gRU9GKSByZXR1cm4gLTE7CisJCWMgPSB4OworI2VuZGlmCisJCWlmIChscy0+ZmxhZ3MgJiBDT1BZX0xJTkUpIHsKKwkJCWlmIChjID09ICdcbicpIHsKKwkJCQlscy0+Y29weV9saW5lW2xzLT5jbGldID0gMDsKKwkJCQlscy0+Y2xpID0gMDsKKwkJCX0gZWxzZSBpZiAobHMtPmNsaSA8IChDT1BZX0xJTkVfTEVOR1RIIC0gMSkpIHsKKwkJCQlscy0+Y29weV9saW5lW2xzLT5jbGkgKytdID0gYzsKKwkJCX0KKwkJfQorCQlpZiAobHMtPm1hY2ZpbGUgJiYgYyA9PSAnXG4nKSB7CisJCQlscy0+bWFjZmlsZSA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlscy0+bWFjZmlsZSA9IDA7CisJCWlmIChjID09ICdccicpIHsKKwkJCS8qCisJCQkgKiBXZSBmb3VuZCBhICdccic7IHdlIGhhbmRsZSBpdCBhcyBhIG5ld2xpbmUKKwkJCSAqIGFuZCBpZ25vcmUgdGhlIG5leHQgbmV3bGluZS4gVGhpcyBzaG91bGQgd29yaworCQkJICogd2l0aCBhbGwgY29tYmluYXRpb25zIG9mIE1zZG9zLCBNYWNJbnRvc2ggYW5kCisJCQkgKiBVbml4IGZpbGVzIG9uIHRoZXNlIHRocmVlIHBsYXRmb3Jtcy4gT24gb3RoZXIKKwkJCSAqIHBsYXRmb3JtcywgbmF0aXZlIGZpbGUgZm9ybWF0cyBhcmUgYWx3YXlzCisJCQkgKiBzdXBwb3J0ZWQuCisJCQkgKi8KKwkJCWxzLT5tYWNmaWxlID0gMTsKKwkJCWMgPSAnXG4nOworCQl9CisJCWJyZWFrOworCX0KKwkvKnZiKi8KKyNpZmRlZiBIQVZFX01JU1JBCisJaWYobWlzcmFjaGVjayl7CisJICBpZighaXNzcGFjZSgodW5zaWduZWQgY2hhciljKSYmCisJICAgICAoYzwnQSd8fGM+J1onKSYmCisJICAgICAoYzwnYSd8fGM+J3onKSYmCisJICAgICAoYzwnMCd8fGM+JzknKSYmCisJICAgICBjIT0nIScmJmMhPSdcIicmJmMhPScjJyYmYyE9JyUnJiZjIT0nJicmJmMhPSdcJycmJmMhPScoJyYmYyE9JyknJiYKKwkgICAgIGMhPScqJyYmYyE9JysnJiZjIT0nLCcmJmMhPSctJyYmYyE9Jy4nJiZjIT0nLycmJmMhPSc6JyYmCisJICAgICBjIT0nOycmJmMhPSc8JyYmYyE9Jz0nJiZjIT0nPicmJmMhPSc/JyYmYyE9J1snJiZjIT0nXScmJgorCSAgICAgYyE9J14nJiZjIT0nXycmJmMhPSd7JyYmYyE9J3wnJiZjIT0nfScmJmMhPSd+JyYmYyE9J1xcJworCSAgICAgKQorCSAgICBtaXNyYV9uZXUoNSw0LDEsbHMtPmxpbmUsYywnICcpOworCX0KKyNlbmRpZgorCXJldHVybiBjOworfQorCisvKgorICogbmV4dF9maWZvX2NoYXIoKSwgY2hhcl9sa2ExKCkgYW5kIGNoYXJfbGthMigpIGdpdmUgYSB0d28gY2hhcmFjdGVyCisgKiBsb29rLWFoZWFkIG9uIHRoZSBpbnB1dCBzdHJlYW07IHRoaXMgaXMgbmVlZGVkIGZvciB0cmlncmFwaHMKKyAqLworc3RhdGljIGlubGluZSBpbnQgbmV4dF9maWZvX2NoYXIoc3RydWN0IGxleGVyX3N0YXRlICpscykKK3sKKwlpbnQgYzsKKworCWlmIChscy0+bmxrYSAhPSAwKSB7CisJCWMgPSBscy0+bGthWzBdOworCQlscy0+bGthWzBdID0gbHMtPmxrYVsxXTsKKwkJbHMtPm5sa2EgLS07CisJfSBlbHNlIGMgPSByZWFkX2NoYXIobHMpOworCXJldHVybiBjOworfQorCitzdGF0aWMgaW5saW5lIGludCBjaGFyX2xrYTEoc3RydWN0IGxleGVyX3N0YXRlICpscykKK3sKKwlpZiAobHMtPm5sa2EgPT0gMCkgeworCQlscy0+bGthWzBdID0gcmVhZF9jaGFyKGxzKTsKKwkJbHMtPm5sa2EgKys7CisJfQorCXJldHVybiBscy0+bGthWzBdOworfQorCitzdGF0aWMgaW5saW5lIGludCBjaGFyX2xrYTIoc3RydWN0IGxleGVyX3N0YXRlICpscykKK3sKKyNpZmRlZiBBVURJVAorCWlmIChscy0+bmxrYSA9PSAwKSBvdWNoKCJhbHdheXMgaW4gbW90aW9uIGZ1dHVyZSBpcyIpOworI2VuZGlmCisJaWYgKGxzLT5ubGthID09IDEpIHsKKwkJbHMtPmxrYVsxXSA9IHJlYWRfY2hhcihscyk7CisJCWxzLT5ubGthICsrOworCX0KKwlyZXR1cm4gbHMtPmxrYVsxXTsKK30KKworc3RhdGljIHN0cnVjdCB0cmlncmFwaCB7CisJaW50IG9sZCwgbmV3OworfSB0cmlnWzldID0geworCXsgJz0nLCAnIycgfSwKKwl7ICcvJywgJ1xcJyB9LAorCXsgJ1wnJywgJ14nIH0sCisJeyAnKCcsICdbJyB9LAorCXsgJyknLCAnXScgfSwKKwl7ICchJywgJ3wnIH0sCisJeyAnPCcsICd7JyB9LAorCXsgJz4nLCAnfScgfSwKKwl7ICctJywgJ34nIH0KK307CisKKy8qCisgKiBSZXR1cm5zIHRoZSBuZXh0IGNoYXJhY3RlciwgYWZ0ZXIgdHJlYXRtZW50IG9mIHRyaWdyYXBocyBhbmQgdGVybWluYXRpbmcKKyAqIGJhY2tzbGFzaGVzLiBSZXR1cm4gdmFsdWUgaXMgLTEgaWYgdGhlcmUgaXMgbm8gbW9yZSBpbnB1dC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbmV4dF9jaGFyKHN0cnVjdCBsZXhlcl9zdGF0ZSAqbHMpCit7CisJaW50IGM7CisKKwlpZiAoIWxzLT5kaXNjYXJkKSByZXR1cm4gbHMtPmxhc3Q7CisJbHMtPmRpc2NhcmQgPSAwOworCWRvIHsKKwkJYyA9IG5leHRfZmlmb19jaGFyKGxzKTsKKyNpZmRlZiBIQVZFX0VDUFAKKwkJaWYoYz09JzonKXsKKwkJCWlmKGNoYXJfbGthMShscyk9PSc6Jyl7CisJCQkJbmV4dF9maWZvX2NoYXIobHMpOworCQkJfWVsc2V7CisJCQkJYz0nQCc7CisJCQl9CisJCX0KKyNlbmRpZgorCQkvKiBjaGVjayB0cmlncmFwaHMgKi8KKwkJaWYgKGMgPT0gJz8nICYmIGNoYXJfbGthMShscykgPT0gJz8nCisJCQkmJiAobHMtPmZsYWdzICYgSEFORExFX1RSSUdSQVBIUykpIHsKKwkJCWludCBpLCBkOworCisJCQlkID0gY2hhcl9sa2EyKGxzKTsKKwkJCWZvciAoaSA9IDA7IGkgPCA5OyBpICsrKSBpZiAoZCA9PSB0cmlnW2ldLm9sZCkgeworCQkJCWlmIChscy0+ZmxhZ3MgJiBXQVJOX1RSSUdSQVBIUykgeworCQkJCQlscy0+Y291bnRfdHJpZ3JhcGhzICsrOworCQkJCX0KKwkJCQlpZiAobHMtPmZsYWdzICYgV0FSTl9UUklHUkFQSFNfTU9SRSkgeworCQkJCQl3YXJuaW5nKGxzLT5saW5lLCAidHJpZ3JhcGggPyIiPyVjICIKKwkJCQkJCSJlbmNvdW50ZXJlZCIsIGQpOworCQkJCQkvKnZiKi8KKyNpZmRlZiBIQVZFX01JU1JBCisJCQkJCW1pc3JhX25ldSg3LDQsMiwtMSxkKTsKKyNlbmRpZgorCQkJCX0KKwkJCQluZXh0X2ZpZm9fY2hhcihscyk7CisJCQkJbmV4dF9maWZvX2NoYXIobHMpOworCQkJCWMgPSB0cmlnW2ldLm5ldzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoYyA9PSAnXFwnICYmIGNoYXJfbGthMShscykgPT0gJ1xuJykgeworCQkJbHMtPmxpbmUgKys7CisJCQluZXh0X2ZpZm9fY2hhcihscyk7CisJCX0gZWxzZSB7CisJCQlscy0+bGFzdCA9IGM7CisJCQlyZXR1cm4gYzsKKwkJfQorCX0gd2hpbGUgKDEpOworfQorCisvKgorICogd3JhcHBlciBmb3IgbmV4dF9jaGFyKCksIHRvIGJlIGNhbGxlZCBmcm9tIG91dHNpZGUKKyAqICh1c2VkIGJ5ICNlcnJvciwgI2luY2x1ZGUgZGlyZWN0aXZlcykKKyAqLworaW50IGdyYXBfY2hhcihzdHJ1Y3QgbGV4ZXJfc3RhdGUgKmxzKQoreworCXJldHVybiBuZXh0X2NoYXIobHMpOworfQorCisvKgorICogRGlzY2FyZCB0aGUgY3VycmVudCBjaGFyYWN0ZXIsIHNvIHRoYXQgdGhlIG5leHQgY2FsbCB0byBuZXh0X2NoYXIoKQorICogd2lsbCBzdGVwIGludG8gdGhlIGlucHV0IHN0cmVhbS4KKyAqLwordm9pZCBkaXNjYXJkX2NoYXIoc3RydWN0IGxleGVyX3N0YXRlICpscykKK3sKKyNpZmRlZiBBVURJVAorCWlmIChscy0+ZGlzY2FyZCkgb3VjaCgib3ZlcmNvbGxlY3RpbmcgZ2FyYmFnZSIpOworI2VuZGlmCisJbHMtPmRpc2NhcmQgPSAxOworCWxzLT51dGY4ID0gMDsKKwlpZiAobHMtPmxhc3QgPT0gJ1xuJykgbHMtPmxpbmUgKys7Cit9CisKKy8qCisgKiBDb252ZXJ0IGFuIFVURi04IGVuY29kZWQgY2hhcmFjdGVyIHRvIGEgVW5pdmVyc2FsIENoYXJhY3RlciBOYW1lCisgKiB1c2luZyBcdSAob3IgXFUgd2hlbiBhcHByb3ByaWF0ZSkuCisgKi8KK3N0YXRpYyBpbnQgdXRmOF90b19zdHJpbmcodW5zaWduZWQgY2hhciBidWZbXSwgdW5zaWduZWQgbG9uZyB1dGY4KQoreworCXVuc2lnbmVkIGxvbmcgdmFsID0gMDsKKwlzdGF0aWMgY2hhciBoZXhbMTZdID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCisJaWYgKHV0ZjggJiAweDgwVUwpIHsKKwkJdW5zaWduZWQgbG9uZyB4MSwgeDIsIHgzLCB4NDsKKworCQl4MSA9ICh1dGY4ID4+IDI0KSAmIDB4N2ZVTDsKKwkJeDIgPSAodXRmOCA+PiAxNikgJiAweDdmVUw7CisJCXgzID0gKHV0ZjggPj4gOCkgJiAweDdmVUw7CisJCXg0ID0gKHV0ZjgpICYgMHgzZlVMOworCQl4MSAmPSAweDA3VUw7CisJCWlmICh4MiAmIDB4NDBVTCkgeDIgJj0gMHgwZlVMOworCQlpZiAoeDMgJiAweDQwVUwpIHgzICY9IDB4MWZVTDsKKwkJdmFsID0geDQgfCAoeDMgPDwgNikgfCAoeDIgPDwgMTIpIHwgKHgxIDw8IDE2KTsKKwl9IGVsc2UgdmFsID0gdXRmODsKKwlpZiAodmFsIDwgMTI4KSB7CisJCWJ1ZlswXSA9IHZhbDsKKwkJYnVmWzFdID0gMDsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIGlmICh2YWwgPCAweGZmZmZVTCkgeworCQlidWZbMF0gPSAnXFwnOworCQlidWZbMV0gPSAndSc7CisJCWJ1ZlsyXSA9IGhleFsoc2l6ZV90KSh2YWwgPj4gMTIpXTsKKwkJYnVmWzNdID0gaGV4WyhzaXplX3QpKCh2YWwgPj4gOCkgJiAweGZVKV07CisJCWJ1Zls0XSA9IGhleFsoc2l6ZV90KSgodmFsID4+IDQpICYgMHhmVSldOworCQlidWZbNV0gPSBoZXhbKHNpemVfdCkodmFsICYgMHhmVSldOworCQlidWZbNl0gPSAwOworCQlyZXR1cm4gNjsKKwl9CisJYnVmWzBdID0gJ1xcJzsKKwlidWZbMV0gPSAnVSc7CisJYnVmWzJdID0gJzAnOworCWJ1ZlszXSA9ICcwJzsKKwlidWZbNF0gPSBoZXhbKHNpemVfdCkodmFsID4+IDIwKV07CisJYnVmWzVdID0gaGV4WyhzaXplX3QpKCh2YWwgPj4gMTYpICYgMHhmVSldOworCWJ1Zls2XSA9IGhleFsoc2l6ZV90KSgodmFsID4+IDEyKSAmIDB4ZlUpXTsKKwlidWZbN10gPSBoZXhbKHNpemVfdCkoKHZhbCA+PiA4KSAmIDB4ZlUpXTsKKwlidWZbOF0gPSBoZXhbKHNpemVfdCkoKHZhbCA+PiA0KSAmIDB4ZlUpXTsKKwlidWZbOV0gPSBoZXhbKHNpemVfdCkodmFsICYgMHhmVSldOworCWJ1ZlsxMF0gPSAwOworCXJldHVybiAxMDsKK30KKworLyoKKyAqIFNjYW4gdGhlIGlkZW50aWZpZXIgYW5kIHB1dCBpdCBpbiBjYW5vbmljYWwgZm9ybToKKyAqICAtLSB0cmFuZm9ybSBcVTAwMDB4eHh4IGludG8gXHV4eHh4CisgKiAgLS0gaW5zaWRlIFx1IGFuZCBcVSwgbWFrZSBsZXR0ZXJzIGxvdyBjYXNlCisgKiAgLS0gcmVwb3J0IChzb21lKSBpbmNvcnJlY3QgdXNlIG9mIFVDTgorICovCitzdGF0aWMgdm9pZCBjYW5vbml6ZV9pZChzdHJ1Y3QgbGV4ZXJfc3RhdGUgKmxzLCBjaGFyICppZCkKK3sKKwljaGFyICpjLCAqZDsKKworCWZvciAoYyA9IGQgPSBpZDsgKmM7KSB7CisJCWlmICgqYyA9PSAnXFwnKSB7CisJCQlpbnQgaTsKKworCQkJaWYgKCEqKGMgKyAxKSkgZ290byBjYW5vbl9lcnJvcjsKKwkJCWlmICgqKGMgKyAxKSA9PSAnVScpIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgOCAmJiAqKGMgKyBpICsgMik7IGkgKyspOworCQkJCWlmIChpICE9IDgpIGdvdG8gY2Fub25fZXJyb3I7CisJCQkJKihkICsrKSA9ICdcXCc7CisJCQkJYyArPSAyOworCQkJCWZvciAoaSA9IDA7IGkgPCA0ICYmICooYyArIGkpID09ICcwJzsgaSArKyk7CisJCQkJaWYgKGkgPT0gNCkgeworCQkJCQkqKGQgKyspID0gJ3UnOworCQkJCQljICs9IDQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJKihkICsrKSA9ICdVJzsKKwkJCQkJaSA9IDg7CisJCQkJfQorCQkJCWZvciAoOyBpID4gMDsgaSAtLSkgeworCQkJCQlzd2l0Y2ggKCpjKSB7CisJCQkJCWNhc2UgJ0EnOiAqKGQgKyspID0gJ2EnOyBicmVhazsKKwkJCQkJY2FzZSAnQic6ICooZCArKykgPSAnYic7IGJyZWFrOworCQkJCQljYXNlICdDJzogKihkICsrKSA9ICdjJzsgYnJlYWs7CisJCQkJCWNhc2UgJ0QnOiAqKGQgKyspID0gJ2QnOyBicmVhazsKKwkJCQkJY2FzZSAnRSc6ICooZCArKykgPSAnZSc7IGJyZWFrOworCQkJCQljYXNlICdGJzogKihkICsrKSA9ICdmJzsgYnJlYWs7CisJCQkJCWRlZmF1bHQ6ICooZCArKykgPSAqYzsgYnJlYWs7CisJCQkJCX0KKwkJCQkJYyArKzsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKCooYyArIDEpID09ICd1JykgeworCQkJCWZvciAoaSA9IDA7IGkgPCA0ICYmICooYyArIGkgKyAyKTsgaSArKyk7CisJCQkJaWYgKGkgIT0gNCkgZ290byBjYW5vbl9lcnJvcjsKKwkJCQkqKGQgKyspID0gJ1xcJzsKKwkJCQkqKGQgKyspID0gJ3UnOworCQkJCWMgKz0gMjsKKwkJCQlmb3IgKDsgaSA+IDA7IGkgLS0pIHsKKwkJCQkJc3dpdGNoICgqYykgeworCQkJCQljYXNlICdBJzogKihkICsrKSA9ICdhJzsgYnJlYWs7CisJCQkJCWNhc2UgJ0InOiAqKGQgKyspID0gJ2InOyBicmVhazsKKwkJCQkJY2FzZSAnQyc6ICooZCArKykgPSAnYyc7IGJyZWFrOworCQkJCQljYXNlICdEJzogKihkICsrKSA9ICdkJzsgYnJlYWs7CisJCQkJCWNhc2UgJ0UnOiAqKGQgKyspID0gJ2UnOyBicmVhazsKKwkJCQkJY2FzZSAnRic6ICooZCArKykgPSAnZic7IGJyZWFrOworCQkJCQlkZWZhdWx0OiAqKGQgKyspID0gKmM7IGJyZWFrOworCQkJCQl9CisJCQkJCWMgKys7CisJCQkJfQorCQkJfSBlbHNlIGdvdG8gY2Fub25fZXJyb3I7CisJCQljb250aW51ZTsKKwkJfQorCQkqKGQgKyspID0gKihjICsrKTsKKwl9CisJKmQgPSAwOworCXJldHVybjsKKworY2Fub25fZXJyb3I6CisJZm9yICg7ICpjOyAqKGQgKyspID0gKihjICsrKSk7CisJaWYgKGxzLT5mbGFncyAmIFdBUk5fU1RBTkRBUkQpIHsKKwkJd2FybmluZyhscy0+bGluZSwgIm1hbGZvcm1lZCBpZGVudGlmaWVyIHdpdGggVUNOOiAnJXMnIiwgaWQpOworCX0KKwkqZCA9IDA7Cit9CisKKy8qCisgKiBSdW4gdGhlIGF1dG9tYXRvbiwgaW4gb3JkZXIgdG8gZ2V0IHRoZSBuZXh0IHRva2VuLgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCwgZXhjZXB0IGJ5IG5leHRfdG9rZW4oKQorICoKKyAqIHJldHVybiB2YWx1ZTogMSBvbiBlcnJvciwgMiBvbiBlbmQtb2YtZmlsZSwgMCBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJlYWRfdG9rZW4oc3RydWN0IGxleGVyX3N0YXRlICpscykKK3sKKwlpbnQgY3N0YXQgPSBTX1NUQVJULCBuc3RhdDsKKwlzaXplX3QgbHRvayA9IDA7CisJaW50IGMsIG91dGMgPSAwLCB1Y25faW5faWQgPSAwOworCWludCBzaGlmdF9zdGF0ZTsKKwl1bnNpZ25lZCBsb25nIHV0Zjg7CisJbG9uZyBsID0gbHMtPmxpbmU7CisKKwlscy0+Y3Rvay0+bGluZSA9IGw7CisJaWYgKGxzLT5wZW5kaW5nX3Rva2VuKSB7CisJCWlmICgobHMtPmN0b2stPnR5cGUgPSBscy0+cGVuZGluZ190b2tlbikgPT0gQlVOQ0gpIHsKKwkJCWxzLT5jdG9rLT5uYW1lWzBdID0gJ1xcJzsKKwkJCWxzLT5jdG9rLT5uYW1lWzFdID0gMDsKKwkJfQorCQlscy0+cGVuZGluZ190b2tlbiA9IDA7CisJCXJldHVybiAwOworCX0KKwlpZiAobHMtPmZsYWdzICYgVVRGOF9TT1VSQ0UpIHsKKwkJdXRmOCA9IGxzLT51dGY4OworCQlzaGlmdF9zdGF0ZSA9IDA7CisJfQorCWlmICghKGxzLT5mbGFncyAmIExFWEVSKSAmJiAobHMtPmZsYWdzICYgS0VFUF9PVVRQVVQpKQorCQlmb3IgKDsgbHMtPmxpbmUgPiBscy0+b2xpbmU7KSBwdXRfY2hhcihscywgJ1xuJyk7CisJZG8geworCQljID0gbmV4dF9jaGFyKGxzKTsKKwkJaWYgKGMgPCAwKSB7CisJCQlpZiAoKGxzLT5mbGFncyAmIFVURjhfU09VUkNFKSAmJiBzaGlmdF9zdGF0ZSkgeworCQkJCWlmIChscy0+ZmxhZ3MgJiBXQVJOX1NUQU5EQVJEKQorCQkJCQl3YXJuaW5nKGxzLT5saW5lLCAidHJ1bmNhdGVkIFVURi04ICIKKwkJCQkJCSJjaGFyYWN0ZXIiKTsKKwkJCQlzaGlmdF9zdGF0ZSA9IDA7CisJCQkJdXRmOCA9IDA7CisJCQl9CisJCQlpZiAoY3N0YXQgPT0gU19TVEFSVCkgcmV0dXJuIDI7CisJCQluc3RhdCA9IGNwcG1fdmNoW2NzdGF0XTsKKwkJfSBlbHNlIHsKKwkJCWlmIChscy0+ZmxhZ3MgJiBVVEY4X1NPVVJDRSkgeworCQkJCWlmIChzaGlmdF9zdGF0ZSkgeworCQkJCQlpZiAoKGMgJiAweGMwKSAhPSAweDgwKSB7CisJCQkJCQlpZiAobHMtPmZsYWdzICYgV0FSTl9TVEFOREFSRCkKKwkJCQkJCQl3YXJuaW5nKGxzLT5saW5lLAorCQkJCQkJCQkidHJ1bmNhdGVkICIKKwkJCQkJCQkJIlVURi04ICIKKwkJCQkJCQkJImNoYXJhY3RlciIpOworCQkJCQkJc2hpZnRfc3RhdGUgPSAwOworCQkJCQkJdXRmOCA9IDA7CisJCQkJCQljID0gJ18nOworCQkJCQl9IGVsc2UgeworCQkJCQkJdXRmOCA9ICh1dGY4IDw8IDgpIHwgYzsKKwkJCQkJCWlmICgtLSBzaGlmdF9zdGF0ZSkgeworCQkJCQkJCWxzLT5kaXNjYXJkID0gMTsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJCWMgPSAnXyc7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKChjICYgMHhjMCkgPT0gMHhjMCkgeworCQkJCQlpZiAoKGMgJiAweDMwKSA9PSAweDMwKSB7CisJCQkJCQlzaGlmdF9zdGF0ZSA9IDM7CisJCQkJCX0gZWxzZSBpZiAoYyAmIDB4MjApIHsKKwkJCQkJCXNoaWZ0X3N0YXRlID0gMjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXNoaWZ0X3N0YXRlID0gMTsKKwkJCQkJfQorCQkJCQl1dGY4ID0gYzsKKwkJCQkJbHMtPmRpc2NhcmQgPSAxOworCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UgdXRmOCA9IDA7CisJCQl9CisJCQluc3RhdCA9IGNwcG1bY3N0YXRdW2MgPCBNQVhfQ0hBUl9WQUwgPyBjIDogMF07CisJCX0KKyNpZmRlZiBBVURJVAorCQlpZiAobnN0YXQgPT0gU19PVUNIKSB7CisJCQlvdWNoKCJiYWQgbW92ZS4uLiIpOworCQl9CisjZW5kaWYKKwkJLyoKKwkJICogZGlzYWJsZSBDKystbGlrZSBjb21tZW50cworCQkgKi8KKwkJaWYgKG5zdGF0ID09IFNfQ09NTUVOVDUgJiYgIShscy0+ZmxhZ3MgJiBDUExVU1BMVVNfQ09NTUVOVFMpKQorCQkJbnN0YXQgPSBGUlooU1RPKFNMQVNIKSk7CisKKwkJaWYgKG5vTU9EKG5zdGF0KSA+PSBNU1RBVEUgJiYgIXR0U1RPKG5zdGF0KSkKKwkJCXN3aXRjaCAobm9NT0QobnN0YXQpKSB7CisJCWNhc2UgU19JTEw6CisJCQlpZiAobHMtPmZsYWdzICYgQ0NIQVJTRVQpIHsKKwkJCQllcnJvcihscy0+bGluZSwgImlsbGVnYWwgY2hhcmFjdGVyICclYyciLCBjKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCW5zdGF0ID0gUFVUKFNUTyhCVU5DSCkpOworCQkJYnJlYWs7CisJCWNhc2UgU19CUzoKKwkJCWxzLT5jdG9rLT5uYW1lWzBdID0gJ1xcJzsKKwkJCWx0b2sgKys7CisJCQluc3RhdCA9IEZSWihTVE8oQlVOQ0gpKTsKKwkJCWlmICghKGxzLT5mbGFncyAmIExFWEVSKSkgcHV0X2NoYXIobHMsICdcXCcpOworCQkJYnJlYWs7CisJCWNhc2UgU19ST0dVRV9CUzoKKwkJCWxzLT5wZW5kaW5nX3Rva2VuID0gQlVOQ0g7CisJCQluc3RhdCA9IEZSWihTVE8oTkFNRSkpOworCQkJYnJlYWs7CisJCWNhc2UgU19ERE9UOgorCQkJbHMtPnBlbmRpbmdfdG9rZW4gPSBET1Q7CisJCQluc3RhdCA9IEZSWihTVE8oRE9UKSk7CisJCQlicmVhazsKKwkJY2FzZSBTX0REU0hBUlA6CisJCQlscy0+cGVuZGluZ190b2tlbiA9IFBDVDsKKwkJCW5zdGF0ID0gRlJaKFNUTyhESUdfU0hBUlApKTsKKwkJCWJyZWFrOworCQljYXNlIFNfQkVIRUFEOgorCQkJZXJyb3IobCwgInVuZmluaXNoZWQgc3RyaW5nIGF0IGVuZCBvZiBsaW5lIik7CisJCQlyZXR1cm4gMTsKKwkJY2FzZSBTX0RFQ0FZOgorCQkJd2FybmluZyhsLCAidW50ZXJtaW5hdGVkIC8vIGNvbW1lbnQiKTsKKwkJCW5zdGF0ID0gRlJaKFNUTyhDT01NRU5UKSk7CisJCQlicmVhazsKKwkJY2FzZSBTX1RSVU5DOgorCQkJZXJyb3IobCwgInRydW5jYXRlZCB0b2tlbiIpOworCQkJcmV0dXJuIDE7CisJCWNhc2UgU19UUlVOQ0M6CisJCQllcnJvcihsLCAidHJ1bmNhdGVkIGNvbW1lbnQiKTsKKwkJCXJldHVybiAxOworI2lmZGVmIEFVRElUCisJCWNhc2UgU19PVUNIOgorCQkJb3VjaCgibWFjaGluZSB3ZW50IG91dCBvZiBjb250cm9sIik7CisJCQlicmVhazsKKyNlbmRpZgorCQl9CisJCWlmICghdHRGUloobnN0YXQpKSB7CisJCQlkaXNjYXJkX2NoYXIobHMpOworCQkJaWYgKCEobHMtPmZsYWdzICYgTEVYRVIpICYmIGxzLT5jb25kY29tcCkgeworCQkJCWludCB6ID0gdHRTVE8obnN0YXQpID8gU19JTEwgOiBub01PRChuc3RhdCk7CisKKwkJCQlpZiAoY3N0YXQgPT0gU19OQU1FIHx8IHogPT0gU19OQU1FCisJCQkJCXx8ICgoQ01UKGNzdGF0KSB8fCBDTVQoeikpCisJCQkJCSYmIChscy0+ZmxhZ3MgJiBESVNDQVJEX0NPTU1FTlRTKSkpIHsKKwkJCQkJb3V0YyA9IDA7CisJCQkJfSBlbHNlIGlmICh6ID09IFNfTENIQVIgfHwgeiA9PSBTX1NMQVNICisJCQkJCXx8ICh6ID09IFNfU0hBUlAgJiYgbHMtPmx0d25sKQorCQkJCQl8fCAoeiA9PSBTX1BDVCAmJiBscy0+bHR3bmwpCisJCQkJCXx8ICh6ID09IFNfQkFDS1NMQVNIKSkgeworCQkJCQlvdXRjID0gYzsKKwkJCQl9IGVsc2UgaWYgKHogPT0gU19QQ1QyICYmIGxzLT5sdHdubCkgeworCQkJCQlvdXRjID0gLTE7CisJCQkJfSBlbHNlIGlmICh6ID09IFNfUENUMyAmJiBscy0+bHR3bmwpIHsKKwkJCQkJLyogd2UgaGF2ZSAlOiUgYnV0IHRoaXMgc3RpbGwgbWlnaHQKKwkJCQkJICAgbm90IGJlIGEgJTolOiAqLworCQkJCQlvdXRjID0gLTI7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKG91dGMgPCAwKSB7CisJCQkJCQlwdXRfY2hhcihscywgJyUnKTsKKwkJCQkJCXB1dF9jaGFyKGxzLCAnOicpOworCQkJCQkJaWYgKG91dGMgPT0gLTIpCisJCQkJCQkJcHV0X2NoYXIobHMsICclJyk7CisJCQkJCQlvdXRjID0gMDsKKwkJCQkJfSBlbHNlIGlmIChvdXRjKSB7CisJCQkJCQlwdXRfY2hhcihscywgb3V0Yyk7CisJCQkJCQlvdXRjID0gMDsKKwkJCQkJfQorCQkJCQlwdXRfY2hhcihscywgYyk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKG91dGMgPT0gJy8nICYmICEobHMtPmZsYWdzICYgTEVYRVIpCisJCQkmJiBscy0+Y29uZGNvbXApIHsKKwkJCS8qIHRoaXMgaXMgYSBoYWNrOiB3ZSBuZWVkIHRvIGR1bXAgYSBwZW5kaW5nIHNsYXNoICovCisJCQlwdXRfY2hhcihscywgb3V0Yyk7CisJCQlvdXRjID0gMDsKKwkJfQorCQlpZiAodHRQVVQobnN0YXQpKSB7CisJCQlpZiAoY3N0YXQgPT0gU19OQU1FX0JTKSB7CisJCQkJdWNuX2luX2lkID0gMTsKKwkJCQl3YW4obHMtPmN0b2stPm5hbWUsIGx0b2ssICdcXCcsIGxzLT50a25sKTsKKwkJCX0KKwkJCWlmICgobHMtPmZsYWdzICYgVVRGOF9TT1VSQ0UpICYmIHV0ZjgpIHsKKwkJCQl1bnNpZ25lZCBjaGFyIGJ1ZlsxMV07CisJCQkJaW50IGksIGo7CisKKwkJCQlmb3IgKGkgPSAwLCBqID0gdXRmOF90b19zdHJpbmcoYnVmLCB1dGY4KTsKKwkJCQkJaSA8IGo7IGkgKyspCisJCQkJCXdhbihscy0+Y3Rvay0+bmFtZSwgbHRvaywgYnVmW2ldLAorCQkJCQkJbHMtPnRrbmwpOworCQkJCS8qIGlmIChqID4gMSkgdWNuX2luX2lkID0gMTsgKi8KKwkJCX0gZWxzZSB3YW4obHMtPmN0b2stPm5hbWUsIGx0b2ssCisJCQkJKHVuc2lnbmVkIGNoYXIpYywgbHMtPnRrbmwpOworCQl9CisJCWlmICh0dFNUTyhuc3RhdCkpIHsKKwkJCWlmIChTX1RPS0VOKG5vTU9EKG5zdGF0KSkpIHsKKwkJCQl3YW4obHMtPmN0b2stPm5hbWUsIGx0b2ssCisJCQkJCSh1bnNpZ25lZCBjaGFyKTAsIGxzLT50a25sKTsKKwkJCX0KKwkJCWxzLT5jdG9rLT50eXBlID0gbm9NT0QobnN0YXQpOworCQkJYnJlYWs7CisJCX0KKwkJY3N0YXQgPSBub01PRChuc3RhdCk7CisJfSB3aGlsZSAoMSk7CisJaWYgKCEobHMtPmZsYWdzICYgTEVYRVIpICYmIChscy0+ZmxhZ3MgJiBESVNDQVJEX0NPTU1FTlRTKQorCQkJJiYgbHMtPmN0b2stPnR5cGUgPT0gQ09NTUVOVCkgcHV0X2NoYXIobHMsICcgJyk7CisJaWYgKHVjbl9pbl9pZCAmJiBscy0+Y3Rvay0+dHlwZSA9PSBOQU1FKQorCQljYW5vbml6ZV9pZChscywgbHMtPmN0b2stPm5hbWUpOworCXJldHVybiAwOworfQorCisvKgorICogZmlsbHMgbHMtPmN0b2sgd2l0aCB0aGUgbmV4dCB0b2tlbgorICovCitpbnQgbmV4dF90b2tlbihzdHJ1Y3QgbGV4ZXJfc3RhdGUgKmxzKQoreworCWlmIChscy0+ZmxhZ3MgJiBSRUFEX0FHQUlOKSB7CisJCWxzLT5mbGFncyAmPSB+UkVBRF9BR0FJTjsKKwkJaWYgKCEobHMtPmZsYWdzICYgTEVYRVIpKSB7CisJCQljaGFyICpjID0gU19UT0tFTihscy0+Y3Rvay0+dHlwZSkgPworCQkJCWxzLT5jdG9rLT5uYW1lIDogdG9rZW5fbmFtZShscy0+Y3Rvayk7CisJCQlpZiAobHMtPmN0b2stPnR5cGUgPT0gT1BUX05PTkUpIHsKKwkJCQlscy0+Y3Rvay0+dHlwZSA9IE5PTkU7CisjaWZkZWYgU0VNUEVSX0ZJREVMSVMKKwkJCQlscy0+Y3Rvay0+bmFtZVswXSA9ICcgJzsKKwkJCQlscy0+Y3Rvay0+bmFtZVsxXSA9IDA7CisjZW5kaWYKKwkJCQlwdXRfY2hhcihscywgJyAnKTsKKwkJCX0gZWxzZSBpZiAobHMtPmN0b2stPnR5cGUgIT0gTkFNRSAmJgorCQkJCSEobHMtPmx0d25sICYmIChscy0+Y3Rvay0+dHlwZSA9PSBTSEFSUAorCQkJCQl8fCBscy0+Y3Rvay0+dHlwZSA9PSBESUdfU0hBUlApKSkKKwkJCQlmb3IgKDsgKmM7IGMgKyspIHB1dF9jaGFyKGxzLCAqYyk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiByZWFkX3Rva2VuKGxzKTsKK30KZGlmZiAtLWdpdCBhL3VjcHAvbWFjcm8uYyBiL3VjcHAvbWFjcm8uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNDJlMDA2Ci0tLSAvZGV2L251bGwKKysrIGIvdWNwcC9tYWNyby5jCkBAIC0wLDAgKzEsMTg3MCBAQAorLyoKKyAqIChjKSBUaG9tYXMgUG9ybmluIDE5OTksIDIwMDAKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQKKyAqIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwKKyAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKy8qdmIqLworI2lmZGVmIEhBVkVfTUlTUkEKK3ZvaWQgbWlzcmEoaW50LC4uLik7Cit2b2lkIG1pc3JhX25ldShpbnQsIGludCwgaW50LCBpbnQsIC4uLik7CitpbnQgbWlzcmFfaXNfcmVzZXJ2ZWQoY29uc3QgY2hhciopOworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAidWNwcGkuaCIKKyNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSAidHVuZS5oIgorCisvKnZiKi8KK2V4dGVybiBpbnQgbmVzdGluZzsKKyNpZmRlZiBIQVZFX01JU1JBCitleHRlcm4gaW50IG1pc3JhY2hlY2s7CisjZW5kaWYKKworLyoKKyAqIHdlIHN0b3JlIG1hY3JvcyBpbiBhIGhhc2ggdGFibGUsIGFuZCByZXRyaWV2ZSB0aGVtIHVzaW5nIHRoZWlyIG5hbWUKKyAqIGFzIGlkZW50aWZpZXIuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgSFQgKm1hY3JvcyA9IDA7CisKK3N0YXRpYyB2b2lkIGRlbF9tYWNybyh2b2lkICptKQoreworCXN0cnVjdCBtYWNybyAqbiA9IG07CisJaW50IGk7CisKKwlpZiAobi0+bmFtZSkgZnJlZW1lbShuLT5uYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgbi0+bmFyZzsgaSArKykgZnJlZW1lbShuLT5hcmdbaV0pOworCWlmIChuLT5uYXJnID4gMCkgZnJlZW1lbShuLT5hcmcpOworI2lmZGVmIExPV19NRU0KKwlpZiAobi0+Y3ZhbC5sZW5ndGgpIGZyZWVtZW0obi0+Y3ZhbC50KTsKKyNlbHNlCisJaWYgKG4tPnZhbC5udCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbi0+dmFsLm50OyBpICsrKQorCQkJaWYgKFNfVE9LRU4obi0+dmFsLnRbaV0udHlwZSkpCisJCQkJZnJlZW1lbShuLT52YWwudFtpXS5uYW1lKTsKKwkJZnJlZW1lbShuLT52YWwudCk7CisJfQorI2VuZGlmCisJZnJlZW1lbShuKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbWFjcm8gKm5ld19tYWNybyh2b2lkKQoreworCXN0cnVjdCBtYWNybyAqbSA9IGdldG1lbShzaXplb2Yoc3RydWN0IG1hY3JvKSk7CisKKwltLT5uYW1lID0gMDsKKwltLT5uYXJnID0gLTE7CisJbS0+bmVzdCA9IDA7CisjaWZkZWYgTE9XX01FTQorCW0tPmN2YWwubGVuZ3RoID0gMDsKKyNlbHNlCisJbS0+dmFsLm50ID0gbS0+dmFsLmFydCA9IDA7CisjZW5kaWYKKwltLT52YWFyZyA9IDA7CisJcmV0dXJuIG07Cit9CisKKy8qCisgKiBmb3Igc3BlY2lhbCBtYWNyb3MsIGFuZCB0aGUgImRlZmluZWQiIG9wZXJhdG9yCisgKi8KK2VudW0geworCU1BQ19OT05FLCBNQUNfREVGSU5FRCwKKwlNQUNfTElORSwgTUFDX0ZJTEUsIE1BQ19EQVRFLCBNQUNfQURBVEUsIE1BQ19USU1FLCBNQUNfU1REQywgTUFDX1BSQUdNQQorfTsKKyNkZWZpbmUgTUFDX1NQRUNJQUwJTUFDX0xJTkUKKworLyoKKyAqIHJldHVybnMgMSBmb3IgImRlZmluZWQiCisgKiByZXR1cm5zIHggPiAxIGZvciBhIHNwZWNpYWwgbWFjcm8gc3VjaCBhcyBfX0ZJTEVfXworICogcmV0dXJucyAwIG90aGVyd2lzZQorICovCitzdGF0aWMgaW5saW5lIGludCBjaGVja19zcGVjaWFsX21hY3JvKGNoYXIgKm5hbWUpCit7CisJaWYgKCFzdHJjbXAobmFtZSwgImRlZmluZWQiKSkgcmV0dXJuIE1BQ19ERUZJTkVEOworCWlmICgqbmFtZSAhPSAnXycpIHJldHVybiBNQUNfTk9ORTsKKwlpZiAoKihuYW1lICsgMSkgPT0gJ1AnKSB7CisJCWlmICghc3RyY21wKG5hbWUsICJfUHJhZ21hIikpIHJldHVybiBNQUNfUFJBR01BOworCQlyZXR1cm4gTUFDX05PTkU7CisJfSBlbHNlIGlmICgqKG5hbWUgKyAxKSAhPSAnXycpIHJldHVybiBNQUNfTk9ORTsKKwlpZiAobm9fc3BlY2lhbF9tYWNyb3MpIHJldHVybiBNQUNfTk9ORTsKKwlpZiAoIXN0cmNtcChuYW1lLCAiX19MSU5FX18iKSkgcmV0dXJuIE1BQ19MSU5FOworCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIl9fRklMRV9fIikpIHJldHVybiBNQUNfRklMRTsKKwllbHNlIGlmICghc3RyY21wKG5hbWUsICJfX0RBVEVfXyIpKSByZXR1cm4gTUFDX0RBVEU7CisJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiX19BTUlHQURBVEVfXyIpKSByZXR1cm4gTUFDX0FEQVRFOworCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIl9fVElNRV9fIikpIHJldHVybiBNQUNfVElNRTsKKwllbHNlIGlmICghc3RyY21wKG5hbWUsICJfX1NURENfXyIpKSByZXR1cm4gTUFDX1NUREM7CisJcmV0dXJuIE1BQ19OT05FOworfQorCitpbnQgYzk5X2NvbXBsaWFudCA9IDE7CitpbnQgYzk5X2hvc3RlZCA9IDE7CisKKy8qCisgKiBhZGQgdGhlIHNwZWNpYWwgbWFjcm9zIHRvIHRoZSBtYWNybyB0YWJsZQorICovCitzdGF0aWMgdm9pZCBhZGRfc3BlY2lhbF9tYWNyb3Modm9pZCkKK3sKKwlzdHJ1Y3QgbWFjcm8gKm07CisKKwltID0gbmV3X21hY3JvKCk7IG0tPm5hbWUgPSBzZHVwKCJfX0xJTkVfXyIpOyBwdXRIVChtYWNyb3MsIG0pOworCW0gPSBuZXdfbWFjcm8oKTsgbS0+bmFtZSA9IHNkdXAoIl9fRklMRV9fIik7IHB1dEhUKG1hY3JvcywgbSk7CisJbSA9IG5ld19tYWNybygpOyBtLT5uYW1lID0gc2R1cCgiX19EQVRFX18iKTsgcHV0SFQobWFjcm9zLCBtKTsKKwltID0gbmV3X21hY3JvKCk7IG0tPm5hbWUgPSBzZHVwKCJfX0FNSUdBREFURV9fIik7IHB1dEhUKG1hY3JvcywgbSk7CisJbSA9IG5ld19tYWNybygpOyBtLT5uYW1lID0gc2R1cCgiX19USU1FX18iKTsgcHV0SFQobWFjcm9zLCBtKTsKKwltID0gbmV3X21hY3JvKCk7IG0tPm5hbWUgPSBzZHVwKCJfX1NURENfXyIpOyBwdXRIVChtYWNyb3MsIG0pOworCW0gPSBuZXdfbWFjcm8oKTsgbS0+bmFtZSA9IHNkdXAoIl9QcmFnbWEiKTsgbS0+bmFyZyA9IDE7CisJbS0+YXJnID0gZ2V0bWVtKHNpemVvZihjaGFyICopKTsgbS0+YXJnWzBdID0gc2R1cCgiZm9vIik7CisJcHV0SFQobWFjcm9zLCBtKTsKKwlpZiAoYzk5X2NvbXBsaWFudCkgeworI2lmbmRlZiBMT1dfTUVNCisJCXN0cnVjdCB0b2tlbiB0OworI2VuZGlmCisKKwkJbSA9IG5ld19tYWNybygpOworCQltLT5uYW1lID0gc2R1cCgiX19TVERDX1ZFUlNJT05fXyIpOworI2lmZGVmIExPV19NRU0KKwkJbS0+Y3ZhbC50ID0gZ2V0bWVtKDkpOworCQltLT5jdmFsLnRbMF0gPSBOVU1CRVI7CisJCW1tdihtLT5jdmFsLnQgKyAxLCAiMTk5OTAxTCIsIDgpOworCQltLT5jdmFsLmxlbmd0aCA9IDk7CisjZWxzZQorCQl0LnR5cGUgPSBOVU1CRVI7CisJCXQubGluZSA9IDA7CisJCXQubmFtZSA9IHNkdXAoIjE5OTkwMUwiKTsKKwkJYW9sKG0tPnZhbC50LCBtLT52YWwubnQsIHQsIFRPS0VOX0xJU1RfTUVNRyk7CisjZW5kaWYKKwkJcHV0SFQobWFjcm9zLCBtKTsKKwl9CisJaWYgKGM5OV9ob3N0ZWQpIHsKKyNpZm5kZWYgTE9XX01FTQorCQlzdHJ1Y3QgdG9rZW4gdDsKKyNlbmRpZgorCisJCW0gPSBuZXdfbWFjcm8oKTsKKwkJbS0+bmFtZSA9IHNkdXAoIl9fU1REQ19IT1NURURfXyIpOworI2lmZGVmIExPV19NRU0KKwkJbS0+Y3ZhbC50ID0gZ2V0bWVtKDMpOworCQltLT5jdmFsLnRbMF0gPSBOVU1CRVI7CisJCW1tdihtLT5jdmFsLnQgKyAxLCAiMSIsIDIpOworCQltLT5jdmFsLmxlbmd0aCA9IDM7CisjZWxzZQorCQl0LnR5cGUgPSBOVU1CRVI7CisJCXQubGluZSA9IDA7CisJCXQubmFtZSA9IHNkdXAoIjEiKTsKKwkJYW9sKG0tPnZhbC50LCBtLT52YWwubnQsIHQsIFRPS0VOX0xJU1RfTUVNRyk7CisjZW5kaWYKKwkJcHV0SFQobWFjcm9zLCBtKTsKKwl9Cit9CisKKy8qCisgKiBwcmludCB0aGUgY29udGVudCBvZiBhIG1hY3JvLCBpbiAjZGVmaW5lIGZvcm0KKyAqLworc3RhdGljIHZvaWQgcHJpbnRfbWFjcm8odm9pZCAqdm0pCit7CisJc3RydWN0IG1hY3JvICptID0gdm07CisJaW50IHggPSBjaGVja19zcGVjaWFsX21hY3JvKG0tPm5hbWUpOworCWludCBpOworCisJaWYgKHggIT0gTUFDX05PTkUpIHsKKwkJZnByaW50ZihlbWl0X291dHB1dCwgIi8qICNkZWZpbmUgJXMgKi8gLyogc3BlY2lhbCAqL1xuIiwKKwkJCW0tPm5hbWUpOworCQlyZXR1cm47CisJfQorCWZwcmludGYoZW1pdF9vdXRwdXQsICIjZGVmaW5lICVzIiwgbS0+bmFtZSk7CisJaWYgKG0tPm5hcmcgPj0gMCkgeworCQlmcHJpbnRmKGVtaXRfb3V0cHV0LCAiKCIpOworCQlmb3IgKGkgPSAwOyBpIDwgbS0+bmFyZzsgaSArKykgeworCQkJZnByaW50ZihlbWl0X291dHB1dCwgaSA/ICIsICVzIiA6ICIlcyIsIG0tPmFyZ1tpXSk7CisJCX0KKwkJaWYgKG0tPnZhYXJnKSB7CisJCQlmcHV0cyhtLT5uYXJnID8gIiwgLi4uIiA6ICIuLi4iLCBlbWl0X291dHB1dCk7CisJCX0KKwkJZnByaW50ZihlbWl0X291dHB1dCwgIikiKTsKKwl9CisjaWZkZWYgTE9XX01FTQorCWlmIChtLT5jdmFsLmxlbmd0aCA9PSAwKSB7CisJCWZwdXRjKCdcbicsIGVtaXRfb3V0cHV0KTsKKwkJcmV0dXJuOworCX0KKwlmcHV0YygnICcsIGVtaXRfb3V0cHV0KTsKKwlmb3IgKGkgPSAwOyBpIDwgbS0+Y3ZhbC5sZW5ndGg7KSB7CisJCWludCB0dCA9IG0tPmN2YWwudFtpICsrXTsKKworCQlpZiAodHQgPT0gTUFDUk9BUkcpIHsKKwkJCWlmIChtLT5jdmFsLnRbaV0gPT0gbS0+bmFyZykKKwkJCQlmcHV0cygiX19WQV9BUkdTX18iLCBlbWl0X291dHB1dCk7CisJCQllbHNlCisJCQkJZnB1dHMobS0+YXJnWyhzaXplX3QpKG0tPmN2YWwudFtpXSldLAorCQkJCQllbWl0X291dHB1dCk7CisJCQlpICsrOworCQl9CisJCWVsc2UgaWYgKFNfVE9LRU4odHQpKSB7CisJCQlmcHV0cygoY2hhciAqKShtLT5jdmFsLnQgKyBpKSwgZW1pdF9vdXRwdXQpOworCQkJaSArPSAxICsgc3RybGVuKChjaGFyICopKG0tPmN2YWwudCArIGkpKTsKKwkJfSBlbHNlIGZwdXRzKG9wZXJhdG9yc19uYW1lW3R0XSwgZW1pdF9vdXRwdXQpOworCX0KKyNlbHNlCisJaWYgKG0tPnZhbC5udCA9PSAwKSB7CisJCWZwdXRjKCdcbicsIGVtaXRfb3V0cHV0KTsKKwkJcmV0dXJuOworCX0KKwlmcHV0YygnICcsIGVtaXRfb3V0cHV0KTsKKwlmb3IgKGkgPSAwOyBpIDwgbS0+dmFsLm50OyBpICsrKSB7CisJCWlmIChtLT52YWwudFtpXS50eXBlID09IE1BQ1JPQVJHKSB7CisJCQlpZiAobS0+dmFsLnRbaV0ubGluZSA9PSBtLT5uYXJnKQorCQkJCWZwdXRzKCJfX1ZBX0FSR1NfXyIsIGVtaXRfb3V0cHV0KTsKKwkJCWVsc2UKKwkJCQlmcHV0cyhtLT5hcmdbKHNpemVfdCkobS0+dmFsLnRbaV0ubGluZSldLAorCQkJCQllbWl0X291dHB1dCk7CisJCX0gZWxzZSBmcHV0cyh0b2tlbl9uYW1lKG0tPnZhbC50ICsgaSksIGVtaXRfb3V0cHV0KTsKKwl9CisjZW5kaWYKKwlmcHV0YygnXG4nLCBlbWl0X291dHB1dCk7Cit9CisKKy8qCisgKiBTZW5kIGEgdG9rZW4gdG8gdGhlIG91dHB1dCAoYSB0b2tlbl9maWZvIGluIGxleGVyIG1vZGUsIHRoZSBvdXRwdXQKKyAqIGJ1ZmZlciBpbiBzdGFuZCBhbG9uZSBtb2RlKS4KKyAqLwordm9pZCBwcmludF90b2tlbihzdHJ1Y3QgbGV4ZXJfc3RhdGUgKmxzLCBzdHJ1Y3QgdG9rZW4gKnQsIGxvbmcgdXpfbGluZSkKK3sKKwljaGFyICp4ID0gdC0+bmFtZTsKKworCWlmICh1el9saW5lICYmIHQtPmxpbmUgPCAwKSB0LT5saW5lID0gdXpfbGluZTsKKwlpZiAobHMtPmZsYWdzICYgTEVYRVIpIHsKKwkJc3RydWN0IHRva2VuIGF0OworCisJCWF0ID0gKnQ7CisJCWlmIChTX1RPS0VOKHQtPnR5cGUpKSB7CisJCQlhdC5uYW1lID0gc2R1cChhdC5uYW1lKTsKKwkJCXRocm93X2F3YXkobHMtPmdmLCBhdC5uYW1lKTsKKwkJfQorCQlhb2wobHMtPm91dHB1dF9maWZvLT50LCBscy0+b3V0cHV0X2ZpZm8tPm50LCBhdCwKKwkJCVRPS0VOX0xJU1RfTUVNRyk7CisJCXJldHVybjsKKwl9CisJaWYgKGxzLT5mbGFncyAmIEtFRVBfT1VUUFVUKSB7CisJCWZvciAoOyBscy0+b2xpbmUgPCBscy0+bGluZTspIHB1dF9jaGFyKGxzLCAnXG4nKTsKKwl9CisJaWYgKCFTX1RPS0VOKHQtPnR5cGUpKSB4ID0gb3BlcmF0b3JzX25hbWVbdC0+dHlwZV07CisJZm9yICg7ICp4OyB4ICsrKSBwdXRfY2hhcihscywgKngpOworfQorCisvKgorICogc2VuZCBhIHJlZHVjZWQgd2hpdGVzcGFjZSB0b2tlbiB0byB0aGUgb3V0cHV0CisgKi8KKyNkZWZpbmUgcHJpbnRfc3BhY2UobHMpCWRvIHsgXAorCQlzdHJ1Y3QgdG9rZW4gbHQ7IFwKKwkJbHQudHlwZSA9IE9QVF9OT05FOyBcCisJCWx0LmxpbmUgPSAobHMpLT5saW5lOyBcCisJCXByaW50X3Rva2VuKChscyksICZsdCwgMCk7IFwKKwl9IHdoaWxlICgwKQorCisvKgorICogV2UgZm91bmQgYSAjZGVmaW5lIGRpcmVjdGl2ZTsgcGFyc2UgdGhlIGVuZCBvZiB0aGUgbGluZSwgcGVyZm9ybQorICogc2FuaXR5IGNoZWNrcywgc3RvcmUgdGhlIG5ldyBtYWNybyBpbnRvIHRoZSAibWFjcm9zIiBoYXNoIHRhYmxlLgorICoKKyAqIEluIGNhc2Ugb2YgYSByZWRlZmluaXRpb24gb2YgYSBtYWNybzogd2UgZW5mb3JjZSB0aGUgcnVsZSB0aGF0IGEKKyAqIG1hY3JvIHNob3VsZCBiZSByZWRlZmluZWQgaWRlbnRpY2FsbHksIGluY2x1ZGluZyB0aGUgc3BlbGxpbmcgb2YKKyAqIHBhcmFtZXRlcnMuIFdlIGVtaXQgYW4gZXJyb3Igb24gb2ZmZW5kaW5nIGNvZGU7IGR1cmEgbGV4LCBzZWQgbGV4LgorICogQWZ0ZXIgYWxsLCBpdCBpcyBlYXN5IHRvIGF2b2lkIHN1Y2ggcHJvYmxlbXMsIHdpdGggYSAjdW5kZWYgZGlyZWN0aXZlLgorICovCitpbnQgaGFuZGxlX2RlZmluZShzdHJ1Y3QgbGV4ZXJfc3RhdGUgKmxzKQoreworCXN0cnVjdCBtYWNybyAqbSwgKm47CisjaWZkZWYgTE9XX01FTQorCXN0cnVjdCB0b2tlbl9maWZvIG12OworI2VuZGlmCisJaW50IGx0d3dzID0gMSwgcmVkZWYgPSAwOworCWNoYXIgKm1uYW1lID0gMDsKKwlpbnQgbmFyZzsKKwlzaXplX3QgbnQ7CisJbG9uZyBsID0gbHMtPmxpbmU7CisJCisJLyp2YiovCisjaWZkZWYgSEFWRV9NSVNSQQorCWlmKG5lc3RpbmchPTApIG1pc3JhX25ldSg5MSwxOSw1LDApOworI2VuZGlmCisKKwkvKiBmaW5kIHRoZSBuZXh0IG5vbi13aGl0ZSB0b2tlbiBvbiB0aGUgbGluZSwgdGhpcyBzaG91bGQgYmUKKwkgICB0aGUgbWFjcm8gbmFtZSAqLworCXdoaWxlICghbmV4dF90b2tlbihscykgJiYgbHMtPmN0b2stPnR5cGUgIT0gTkVXTElORSkgeworCQlpZiAodHRNV1MobHMtPmN0b2stPnR5cGUpKSBjb250aW51ZTsKKwkJaWYgKGxzLT5jdG9rLT50eXBlID09IE5BTUUpIG1uYW1lID0gc2R1cChscy0+Y3Rvay0+bmFtZSk7CisJCWJyZWFrOworCX0KKwlpZiAobW5hbWUgPT0gMCkgeworCQllcnJvcihsLCAibWlzc2luZyBtYWNybyBuYW1lIik7CisJCXJldHVybiAxOworCX0KKwlpZiAoY2hlY2tfc3BlY2lhbF9tYWNybyhtbmFtZSkpIHsKKwkJZXJyb3IobCwgInRyeWluZyB0byByZWRlZmluZSB0aGUgc3BlY2lhbCBtYWNybyAlcyIsIG1uYW1lKTsKKwkJZ290byB3YXJwX2Vycm9yOworCX0KKwkvKgorCSAqIElmIGEgbWFjcm8gd2l0aCB0aGlzIG5hbWUgd2FzIGFscmVhZHkgZGVmaW5lZDogdGhlIEsmUgorCSAqIHN0YXRlcyB0aGF0IHRoZSBuZXcgbWFjcm8gc2hvdWxkIGJlIGlkZW50aWNhbCB0byB0aGUgb2xkIG9uZQorCSAqICh3aXRoIHNvbWUgYXJjYW5lIHJ1bGUgb2YgZXF1aXZhbGVuY2Ugb2Ygd2hpdGVzcGFjZSk7IG90aGVyd2lzZSwKKwkgKiByZWRlZmluaW5nIHRoZSBtYWNybyBpcyBhbiBlcnJvci4gTW9zdCBwcmVwcm9jZXNzb3JzIHdvdWxkCisJICogb25seSBlbWl0IGEgd2FybmluZyAob3Igbm90aGluZyBhdCBhbGwpIG9uIGFuIHVuaWRlbnRpY2FsCisJICogcmVkZWZpbml0aW9uLgorCSAqCisJICogU2luY2UgaXQgaXMgZWFzeSB0byBhdm9pZCB0aGlzIGVycm9yICh3aXRoIGEgI3VuZGVmIGRpcmVjdGl2ZSksCisJICogd2UgY2hvb3NlIHRvIGVuZm9yY2UgdGhlIHJ1bGUgYW5kIGVtaXQgYW4gZXJyb3IuCisJICovCisKKyNpZmRlZiBIQVZFX01JU1JBCisJCWlmIChtaXNyYV9pc19yZXNlcnZlZChtbmFtZSkpIG1pc3JhX25ldSgxMTQsMjAsMSwtMSk7CisjZW5kaWYKKworCWlmICgobiA9IGdldEhUKG1hY3JvcywgJm1uYW1lKSkgIT0gMCkgeworCQkvKiByZWRlZmluaXRpb24gb2YgYSBtYWNybzogd2UgbXVzdCBjaGVjayB0aGF0IHdlIGRlZmluZQorCQkgICBpdCBpZGVudGljYWwgKi8KKwkJcmVkZWYgPSAxOworI2lmZGVmIExPV19NRU0KKwkJbi0+Y3ZhbC5ycCA9IDA7CisjZW5kaWYKKwkJZnJlZW1lbShtbmFtZSk7CisJfQorCWlmICghcmVkZWYpIHsKKwkJbSA9IG5ld19tYWNybygpOworCQltLT5uYW1lID0gbW5hbWU7CisJCW0tPm5hcmcgPSAtMTsKKyNpZmRlZiBMT1dfTUVNCisJCW12LmFydCA9IG12Lm50ID0gMDsKKyNkZWZpbmUgbXZhbAltdgorI2Vsc2UKKyNkZWZpbmUgbXZhbAkobS0+dmFsKQorI2VuZGlmCisJfQorCWlmIChuZXh0X3Rva2VuKGxzKSkgZ290byBkZWZpbmVfZW5kOworCS8qCisJICogQ2hlY2sgaWYgdGhlIHRva2VuIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgbWFjcm8gbmFtZSBpcworCSAqIGEgbGVmdCBwYXJlbnRoZXNpczsgaWYgc28sIHRoZW4gdGhpcyBpcyBhIG1hY3JvIHdpdGggYXJndW1lbnRzLgorCSAqIENvbGxlY3QgdGhlaXIgbmFtZXMgYW5kIHRyeSB0byBtYXRjaCB0aGUgbmV4dCBwYXJlbnRoZXNpcy4KKwkgKi8KKwlpZiAobHMtPmN0b2stPnR5cGUgPT0gTFBBUikgeworCQlpbnQgaSwgajsKKwkJaW50IG5lZWRfY29tbWEgPSAwLCBzYXdfbWRvdHMgPSAwOworCisJCW5hcmcgPSAwOworCQl3aGlsZSAoIW5leHRfdG9rZW4obHMpKSB7CisJCQlpZiAobHMtPmN0b2stPnR5cGUgPT0gTkVXTElORSkgeworCQkJCWVycm9yKGwsICJ0cnVuY2F0ZWQgbWFjcm8gZGVmaW5pdGlvbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJaWYgKGxzLT5jdG9rLT50eXBlID09IENPTU1BKSB7CisJCQkJaWYgKHNhd19tZG90cykgeworCQkJCQllcnJvcihsLCAiJy4uLicgbXVzdCBlbmQgdGhlIG1hY3JvICIKKwkJCQkJCSJhcmd1bWVudCBsaXN0Iik7CisJCQkJCWdvdG8gd2FycF9lcnJvcjsKKwkJCQl9CisJCQkJaWYgKCFuZWVkX2NvbW1hKSB7CisJCQkJCWVycm9yKGwsICJ2b2lkIG1hY3JvIGFyZ3VtZW50Iik7CisJCQkJCWdvdG8gd2FycF9lcnJvcjsKKwkJCQl9CisJCQkJbmVlZF9jb21tYSA9IDA7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKGxzLT5jdG9rLT50eXBlID09IE5BTUUpIHsKKwkJCQlpZiAoc2F3X21kb3RzKSB7CisJCQkJCWVycm9yKGwsICInLi4uJyBtdXN0IGVuZCB0aGUgbWFjcm8gIgorCQkJCQkJImFyZ3VtZW50IGxpc3QiKTsKKwkJCQkJZ290byB3YXJwX2Vycm9yOworCQkJCX0KKwkJCQlpZiAobmVlZF9jb21tYSkgeworCQkJCQllcnJvcihsLCAibWlzc2luZyBjb21tYSBpbiAiCisJCQkJCQkibWFjcm8gYXJndW1lbnQgbGlzdCIpOworCQkJCQlnb3RvIHdhcnBfZXJyb3I7CisJCQkJfQorCQkJCWlmICghcmVkZWYpIHsKKwkJCQkJYW9sKG0tPmFyZywgbmFyZywKKwkJCQkJCXNkdXAobHMtPmN0b2stPm5hbWUpLCA4KTsKKwkJCQkJaWYgKG5hcmcgPT0gMTI4CisJCQkJCQkmJiAobHMtPmZsYWdzICYgV0FSTl9TVEFOREFSRCkpCisJCQkJCQl3YXJuaW5nKGwsICJtb3JlIGFyZ3VtZW50cyB0byAiCisJCQkJCQkJIm1hY3JvIHRoYW4gdGhlIElTTyAiCisJCQkJCQkJImxpbWl0ICgxMjcpIik7CisjaWZkZWYgTE9XX01FTQorCQkJCQlpZiAobmFyZyA9PSAyNTQpIHsKKwkJCQkJCWVycm9yKGwsICJ0b28gbWFueSBhcmd1bWVudHMgIgorCQkJCQkJCSJpbiBtYWNybyBkZWZpbml0aW9uICIKKwkJCQkJCQkiKG1heCAyNTMpIik7CisJCQkJCQlnb3RvIHdhcnBfZXJyb3I7CisJCQkJCX0KKyNlbmRpZgorCQkJCX0gZWxzZSB7CisJCQkJCS8qIHRoaXMgaXMgYSByZWRlZmluaXRpb24gb2YgdGhlCisJCQkJCSAgIG1hY3JvOyBjaGVjayBlcXVhbGl0eSBiZXR3ZWVuCisJCQkJCSAgIG9sZCBhbmQgbmV3IGRlZmluaXRpb25zICovCisJCQkJCWlmIChuYXJnID49IG4tPm5hcmcpIGdvdG8gcmVkZWZfZXJyb3I7CisJCQkJCWlmIChzdHJjbXAobHMtPmN0b2stPm5hbWUsCisJCQkJCQluLT5hcmdbbmFyZyArK10pKQorCQkJCQkJZ290byByZWRlZl9lcnJvcjsKKwkJCQl9CisJCQkJbmVlZF9jb21tYSA9IDE7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKChscy0+ZmxhZ3MgJiBNQUNST19WQUFSRykKKwkJCQkmJiBscy0+Y3Rvay0+dHlwZSA9PSBNRE9UUykgeworCQkJCWlmIChuZWVkX2NvbW1hKSB7CisJCQkJCWVycm9yKGwsICJtaXNzaW5nIGNvbW1hIGJlZm9yZSAnLi4uJyIpOworCQkJCQlnb3RvIHdhcnBfZXJyb3I7CisJCQkJfQorCQkJCWlmIChyZWRlZiAmJiAhbi0+dmFhcmcpIGdvdG8gcmVkZWZfZXJyb3I7CisJCQkJaWYgKCFyZWRlZikgbS0+dmFhcmcgPSAxOworCQkJCXNhd19tZG90cyA9IDE7CisJCQkJbmVlZF9jb21tYSA9IDE7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKGxzLT5jdG9rLT50eXBlID09IFJQQVIpIHsKKwkJCQlpZiAobmFyZyA+IDAgJiYgIW5lZWRfY29tbWEpIHsKKwkJCQkJZXJyb3IobCwgInZvaWQgbWFjcm8gYXJndW1lbnQiKTsKKwkJCQkJZ290byB3YXJwX2Vycm9yOworCQkJCX0KKwkJCQlpZiAocmVkZWYgJiYgbi0+dmFhcmcgJiYgIXNhd19tZG90cykKKwkJCQkJZ290byByZWRlZl9lcnJvcjsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAodHRNV1MobHMtPmN0b2stPnR5cGUpKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQllcnJvcihsLCAiaW52YWxpZCBtYWNybyBhcmd1bWVudCIpOworCQkJZ290byB3YXJwX2Vycm9yOworCQl9CisJCWlmICghcmVkZWYpIHsKKwkJCWZvciAoaSA9IDE7IGkgPCBuYXJnOyBpICsrKSBmb3IgKGogPSAwOyBqIDwgaTsgaiArKykKKwkJCQlpZiAoIXN0cmNtcChtLT5hcmdbaV0sIG0tPmFyZ1tqXSkpIHsKKwkJCQkJZXJyb3IobCwgImR1cGxpY2F0ZSBtYWNybyAiCisJCQkJCQkiYXJndW1lbnQiKTsKKwkJCQkJZ290byB3YXJwX2Vycm9yOworCQkJCX0KKwkJfQorCQlpZiAoIXJlZGVmKSBtLT5uYXJnID0gbmFyZzsKKwl9IGVsc2UgeworCQlpZiAoIXR0V0hJKGxzLT5jdG9rLT50eXBlKSAmJiAobHMtPmZsYWdzICYgV0FSTl9TVEFOREFSRCkpCisJCQl3YXJuaW5nKGxzLT5saW5lLCAiaWRlbnRpZmllciBub3QgZm9sbG93ZWQgYnkgIgorCQkJCSJ3aGl0ZXNwYWNlIGluICNkZWZpbmUiKTsKKwkJbHMtPmZsYWdzIHw9IFJFQURfQUdBSU47CisJCW5hcmcgPSAwOworCX0KKwlpZiAocmVkZWYpIG50ID0gMDsKKworCS8qIG5vdywgd2UgaGF2ZSB0aGUgYXJndW1lbnRzLiBMZXQncyBnZXQgdGhlIG1hY3JvIGNvbnRlbnRzLiAqLworCXdoaWxlICghbmV4dF90b2tlbihscykgJiYgbHMtPmN0b2stPnR5cGUgIT0gTkVXTElORSkgeworCQlzdHJ1Y3QgdG9rZW4gdDsKKworCQl0LnR5cGUgPSBscy0+Y3Rvay0+dHlwZTsKKwkJaWYgKGx0d3dzICYmIHR0TVdTKHQudHlwZSkpIGNvbnRpbnVlOworCQl0LmxpbmUgPSAwOworCQlpZiAodC50eXBlID09IE5BTUUpIHsKKwkJCWludCBpOworCisJCQlpZiAoKGxzLT5mbGFncyAmIE1BQ1JPX1ZBQVJHKQorCQkJCSYmICFzdHJjbXAobHMtPmN0b2stPm5hbWUsICJfX1ZBX0FSR1NfXyIpKSB7CisJCQkJaWYgKHJlZGVmKSB7CisJCQkJCWlmICghbi0+dmFhcmcpIGdvdG8gcmVkZWZfZXJyb3I7CisJCQkJfSBlbHNlIGlmICghbS0+dmFhcmcpIHsKKwkJCQkJZXJyb3IobCwgIidfX1ZBX0FSR1NfXycgaXMgZm9yYmlkZGVuICIKKwkJCQkJCSJpbiBtYWNyb3Mgd2l0aCBhIGZpeGVkICIKKwkJCQkJCSJudW1iZXIgb2YgYXJndW1lbnRzIik7CisJCQkJCWdvdG8gd2FycF9lcnJvcjsKKwkJCQl9CisJCQkJdC50eXBlID0gTUFDUk9BUkc7CisJCQkJdC5saW5lID0gcmVkZWYgPyBuLT5uYXJnIDogbS0+bmFyZzsKKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCBuYXJnOyBpICsrKQorCQkJCWlmICghc3RyY21wKHJlZGVmID8gbi0+YXJnW2ldIDogbS0+YXJnW2ldLAorCQkJCQlscy0+Y3Rvay0+bmFtZSkpIHsKKwkJCQkJdC50eXBlID0gTUFDUk9BUkc7CisJCQkJCS8qIHRoaXMgaXMgYSBoYWNrOiB3ZSBzdG9yZSB0aGUKKwkJCQkJICAgYXJndW1lbnQgbnVtYmVyIGluIHRoZSBsaW5lIGZpZWxkICovCisJCQkJCXQubGluZSA9IGk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJfQorCQlpZiAoIXJlZGVmICYmIFNfVE9LRU4odC50eXBlKSkgdC5uYW1lID0gc2R1cChscy0+Y3Rvay0+bmFtZSk7CisJCWlmICh0dE1XUyh0LnR5cGUpKSB7CisJCQlpZiAobHR3d3MpIGNvbnRpbnVlOworI2lmZGVmIFNFTVBFUl9GSURFTElTCisJCQl0LnR5cGUgPSBPUFRfTk9ORTsKKyNlbHNlCisJCQl0LnR5cGUgPSBOT05FOworI2VuZGlmCisJCQlsdHd3cyA9IDE7CisJCX0gZWxzZSBsdHd3cyA9IDA7CisJCWlmICghcmVkZWYpIHsKKwkJCS8qIHdlIGVuc3VyZSB0aGF0IGVhY2ggbWFjcm8gdG9rZW4gaGFzIGEgY29ycmVjdAorCQkJICAgbGluZSBudW1iZXIgKi8KKwkJCWlmICh0LnR5cGUgIT0gTUFDUk9BUkcpIHQubGluZSA9IGw7CisJCQlhb2wobXZhbC50LCBtdmFsLm50LCB0LCBUT0tFTl9MSVNUX01FTUcpOworCQl9IGVsc2UgeworI2lmZGVmIExPV19NRU0KKwkJCWludCB0dDsKKworCQkJaWYgKG4tPmN2YWwucnAgPj0gbi0+Y3ZhbC5sZW5ndGgpIHsKKyNpZmRlZiBTRU1QRVJfRklERUxJUworCQkJCWlmICh0LnR5cGUgIT0gT1BUX05PTkUpIGdvdG8gcmVkZWZfZXJyb3I7CisjZWxzZQorCQkJCWlmICh0LnR5cGUgIT0gTk9ORSkgZ290byByZWRlZl9lcnJvcjsKKyNlbmRpZgorCQkJfSBlbHNlIGlmICh0LnR5cGUgIT0gbi0+Y3ZhbC50W24tPmN2YWwucnBdCisJCQkJfHwgKHQudHlwZSA9PSBNQUNST0FSRworCQkJCSAgICAmJiB0LmxpbmUgIT0gbi0+Y3ZhbC50W24tPmN2YWwucnAgKyAxXSkKKwkJCQl8fCAoU19UT0tFTih0LnR5cGUpICYmIHN0cmNtcChscy0+Y3Rvay0+bmFtZSwKKwkJCQkgICAoY2hhciAqKShuLT5jdmFsLnQgKyBuLT5jdmFsLnJwICsgMSkpKSkgeworCQkJCWdvdG8gcmVkZWZfZXJyb3I7CisJCQl9CisJCQl0dCA9IG4tPmN2YWwudFtuLT5jdmFsLnJwICsrXTsKKwkJCWlmIChTX1RPS0VOKHR0KSkgbi0+Y3ZhbC5ycCArPSAxCisJCQkJKyBzdHJsZW4oKGNoYXIgKikobi0+Y3ZhbC50ICsgbi0+Y3ZhbC5ycCkpOworCQkJZWxzZSBpZiAodHQgPT0gTUFDUk9BUkcpIG4tPmN2YWwucnAgKys7CisjZWxzZQorCQkJaWYgKG50ID49IG4tPnZhbC5udCkgeworI2lmZGVmIFNFTVBFUl9GSURFTElTCisJCQkJaWYgKHQudHlwZSAhPSBPUFRfTk9ORSkgZ290byByZWRlZl9lcnJvcjsKKyNlbHNlCisJCQkJaWYgKHQudHlwZSAhPSBOT05FKSBnb3RvIHJlZGVmX2Vycm9yOworI2VuZGlmCisJCQl9IGVsc2UgaWYgKHQudHlwZSAhPSBuLT52YWwudFtudF0udHlwZQorCQkJCXx8ICh0LnR5cGUgPT0gTUFDUk9BUkcKKwkJCQkgICAgJiYgdC5saW5lICE9IG4tPnZhbC50W250XS5saW5lKQorCQkJCXx8IChTX1RPS0VOKHQudHlwZSkgJiYgc3RyY21wKGxzLT5jdG9rLT5uYW1lLAorCQkJCSAgIG4tPnZhbC50W250XS5uYW1lKSkpIHsKKwkJCQlnb3RvIHJlZGVmX2Vycm9yOworCQkJfQorI2VuZGlmCisJCQludCArKzsKKwkJfQorCX0KKworCWlmIChyZWRlZikgeworI2lmZGVmIExPV19NRU0KKwkJaWYgKG4tPmN2YWwucnAgPCBuLT5jdmFsLmxlbmd0aCkgZ290byByZWRlZl9lcnJvcl8yOworI2Vsc2UKKwkJaWYgKG50IDwgbi0+dmFsLm50KSBnb3RvIHJlZGVmX2Vycm9yXzI7CisjZW5kaWYKKwkJcmV0dXJuIDA7CisJfQorCisJLyogbm93IHdlIGhhdmUgdGhlIGNvbXBsZXRlIG1hY3JvOyBwZXJmb3JtIHNvbWUgY2hlY2tzIGFib3V0CisJICAgdGhlIG9wZXJhdG9ycyAjIGFuZCAjIywgYW5kLCBpZiBldmVyeXRoaW5nIGlzIG9rLAorCSAgIHN0b3JlIHRoZSBtYWNybyBpbnRvIHRoZSBoYXNoIHRhYmxlICovCitkZWZpbmVfZW5kOgorI2lmZGVmIFNFTVBFUl9GSURFTElTCisJaWYgKG12YWwubnQgJiYgbXZhbC50W212YWwubnQgLSAxXS50eXBlID09IE9QVF9OT05FKSB7CisjZWxzZQorCWlmIChtdmFsLm50ICYmIG12YWwudFttdmFsLm50IC0gMV0udHlwZSA9PSBOT05FKSB7CisjZW5kaWYKKwkJbXZhbC5udCAtLTsKKwkJaWYgKG12YWwubnQgPT0gMCkgZnJlZW1lbShtdmFsLnQpOworCX0KKwlpZiAobXZhbC5udCAhPSAwKSB7CisJCXNpemVfdCBpOworCisJCS8qIHNvbWUgY2hlY2tzIGFib3V0IHRoZSBtYWNybyAqLworCQlpZiAobXZhbC50WzBdLnR5cGUgPT0gRFNIQVJQCisJCQl8fCBtdmFsLnRbMF0udHlwZSA9PSBESUdfRFNIQVJQCisJCQl8fCBtdmFsLnRbbXZhbC5udCAtIDFdLnR5cGUgPT0gRFNIQVJQCisJCQl8fCBtdmFsLnRbbXZhbC5udCAtIDFdLnR5cGUgPT0gRElHX0RTSEFSUCkgeworCQkJZXJyb3IobCwgIm9wZXJhdG9yICcjIycgbWF5IG5laXRoZXIgYmVnaW4gIgorCQkJCSJub3IgZW5kIGEgbWFjcm8iKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChtLT5uYXJnID49IDApIGZvciAoaSA9IDA7IGkgPCBtdmFsLm50OyBpICsrKQorCQkJaWYgKChtdmFsLnRbaV0udHlwZSA9PSBTSEFSUAorCQkJCXx8IG12YWwudFtpXS50eXBlID09IERJR19TSEFSUCkgJiYKKwkJCQkoaSA9PSAobXZhbC5udCAtIDEpCisJCQkJfHwgKHR0TVdTKG12YWwudFtpICsgMV0udHlwZSkgJiYKKwkJCQkgICAgKGkgPT0gbXZhbC5udCAtIDIKKwkJCQkgICAgIHx8IG12YWwudFtpICsgMl0udHlwZSAhPSBNQUNST0FSRykpCisJCQkJfHwgKCF0dE1XUyhtdmFsLnRbaSArIDFdLnR5cGUpCisJCQkJICAgICAmJiBtdmFsLnRbaSArIDFdLnR5cGUgIT0gTUFDUk9BUkcpKSkgeworCQkJCWVycm9yKGwsICJvcGVyYXRvciAnIycgbm90IGZvbGxvd2VkICIKKwkJCQkJImJ5IGEgbWFjcm8gYXJndW1lbnQiKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwl9CisjaWZkZWYgTE9XX01FTQorCXsKKwkJc2l6ZV90IGksIGw7CisKKwkJZm9yIChpID0gMCwgbCA9IDA7IGkgPCBtdmFsLm50OyBpICsrKSB7CisJCQlsICsrOworCQkJaWYgKFNfVE9LRU4obXZhbC50W2ldLnR5cGUpKQorCQkJCWwgKz0gMSArIHN0cmxlbihtdmFsLnRbaV0ubmFtZSk7CisJCQllbHNlIGlmIChtdmFsLnRbaV0udHlwZSA9PSBNQUNST0FSRykgbCArKzsKKwkJfQorCQltLT5jdmFsLmxlbmd0aCA9IGw7CisJCWlmIChsKSBtLT5jdmFsLnQgPSBnZXRtZW0obCk7CisJCWZvciAoaSA9IDAsIGwgPSAwOyBpIDwgbXZhbC5udDsgaSArKykgeworCQkJbS0+Y3ZhbC50W2wgKytdID0gbXZhbC50W2ldLnR5cGU7CisJCQlpZiAoU19UT0tFTihtdmFsLnRbaV0udHlwZSkpIHsKKwkJCQlzaXplX3QgeCA9IDEgKyBzdHJsZW4obXZhbC50W2ldLm5hbWUpOworCisJCQkJbW12KG0tPmN2YWwudCArIGwsIG12YWwudFtpXS5uYW1lLCB4KTsKKwkJCQlsICs9IHg7CisJCQkJZnJlZW1lbShtdmFsLnRbaV0ubmFtZSk7CisJCQl9CisJCQllbHNlIGlmIChtdmFsLnRbaV0udHlwZSA9PSBNQUNST0FSRykKKwkJCQltLT5jdmFsLnRbbCArK10gPSBtdmFsLnRbaV0ubGluZTsKKwkJfQorCQlpZiAobXZhbC5udCkgZnJlZW1lbShtdmFsLnQpOworCX0KKyNlbmRpZgorCisKKyNpZmRlZiBMT1dfTUVNCisJLyp2YiovCisjaWZkZWYgSEFWRV9NSVNSQQorCWlmKG1pc3JhY2hlY2spCisJeworCSAgaW50IGksbHA9MDsKKwkgIGZvcihpPTA7aTxtLT5jdmFsLmxlbmd0aDspeworCSAgICBpbnQgdHQ9bS0+Y3ZhbC50W2krK107CisJICAgIGlmKHR0PT1NQUNST0FSRyl7CisJICAgICAgaSsrOworCSAgICAgIGlmKCFscHx8bS0+Y3ZhbC50W2ldIT1SUEFSKSBtaXNyYV9uZXUoOTYsMTksMTAsMCk7CisJICAgIH1lbHNlIGlmKFNfVE9LRU4odHQpKXsKKwkgICAgICBpICs9IDEgKyBzdHJsZW4oKGNoYXIgKikobS0+Y3ZhbC50ICsgaSkpOworCSAgICB9ZWxzZXsKKwkgICAgICBpZih0dD09TFBBUikgbHA9MTsgZWxzZSBscD0wOworCSAgICB9CisJICB9CisJfQorI2VuZGlmCisjZWxzZQorI2Vycm9yIG5vdCBzdXBwb3J0ZWQKKyNlbmRpZgorCisJcHV0SFQobWFjcm9zLCBtKTsKKwlpZiAoZW1pdF9kZWZpbmVzKSBwcmludF9tYWNybyhtKTsKKwlyZXR1cm4gMDsKKworcmVkZWZfZXJyb3I6CisJd2hpbGUgKGxzLT5jdG9rLT50eXBlICE9IE5FV0xJTkUgJiYgIW5leHRfdG9rZW4obHMpKTsKK3JlZGVmX2Vycm9yXzI6CisJZXJyb3IobCwgIm1hY3JvICclcycgcmVkZWZpbmVkIHVuaWRlbnRpY2FsbHkiLCBuLT5uYW1lKTsKKwlyZXR1cm4gMTsKK3dhcnBfZXJyb3I6CisJd2hpbGUgKGxzLT5jdG9rLT50eXBlICE9IE5FV0xJTkUgJiYgIW5leHRfdG9rZW4obHMpKTsKKwlyZXR1cm4gMTsKKyN1bmRlZiBtdmFsCit9CisKKy8qCisgKiBHZXQgdGhlIGFyZ3VtZW50cyBmb3IgYSBtYWNyby4gVGhpcyBjb2RlIGlzIHRyaWNreSBiZWNhdXNlIHRoZXJlIGNhbgorICogYmUgbXVsdGlwbGUgc291cmNlcyBmb3IgdGhlc2UgYXJndW1lbnRzLCBpZiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZgorICogYSBtYWNybyByZXBsYWNlbWVudDsgYXJndW1lbnRzIGFyZSBtYWNyby1yZXBsYWNlZCBiZWZvcmUgaW5jbHVzaW9uCisgKiBpbnRvIHRoZSBtYWNybyByZXBsYWNlbWVudC4KKyAqCisgKiByZXR1cm4gdmFsdWU6CisgKiAxCW5vIGFyZ3VtZW50IChsYXN0IHRva2VuIHJlYWQgZnJvbSBuZXh0X3Rva2VuKCkpCisgKiAyICAgIG5vIGFyZ3VtZW50IChsYXN0IHRva2VuIHJlYWQgZnJvbSB0ZmkpCisgKiAzICAgIG5vIGFyZ3VtZW50IChub3RoaW5nIHJlYWQpCisgKiA0CWVycm9yCisgKgorICogVm9pZCBhcmd1bWVudHMgYXJlIGFsbG93ZWQgaW4gQzk5LgorICovCitzdGF0aWMgaW50IGNvbGxlY3RfYXJndW1lbnRzKHN0cnVjdCBsZXhlcl9zdGF0ZSAqbHMsIHN0cnVjdCB0b2tlbl9maWZvICp0ZmksCisJaW50IHBlbnVyeSwgc3RydWN0IHRva2VuX2ZpZm8gKmF0bCwgaW50IG5hcmcsIGludCB2YWFyZywgaW50ICp3cikKK3sKKwlpbnQgbHR3d3MgPSAxLCBucGFyID0gMCwgaTsKKwlzdHJ1Y3QgdG9rZW4gKmN0ID0gMDsKKwlpbnQgcmVhZF9mcm9tX2ZpZm8gPSAwOworCWxvbmcgYmVnaW5fbGluZSA9IGxzLT5saW5lOworCisjZGVmaW5lIHVucmF2ZWwobHMpCShyZWFkX2Zyb21fZmlmbyA9IDAsICEoKHRmaSAmJiB0ZmktPmFydCA8IHRmaS0+bnQgXAorCSYmIChyZWFkX2Zyb21fZmlmbyA9IDEpICYmIChjdCA9IHRmaS0+dCArICh0ZmktPmFydCArKykpKSBcCisJfHwgKCghdGZpIHx8IHBlbnVyeSkgJiYgIW5leHRfdG9rZW4obHMpICYmIChjdCA9IChscyktPmN0b2spKSkpCisKKwkvKgorCSAqIGNvbGxlY3RfYXJndW1lbnRzKCkgaXMgYXNzdW1lZCB0byBzZXR1cCBjb3JyZWN0bHkgYXRsCisJICogKHRoaXMgaXMgbm90IGVsZWdhbnQsIGJ1dCBpdCB3b3JrcykKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbmFyZzsgaSArKykgYXRsW2ldLmFydCA9IGF0bFtpXS5udCA9IDA7CisJaWYgKHZhYXJnKSBhdGxbbmFyZ10uYXJ0ID0gYXRsW25hcmddLm50ID0gMDsKKwkqd3IgPSAwOworCXdoaWxlICghdW5yYXZlbChscykpIHsKKwkJaWYgKCFyZWFkX2Zyb21fZmlmbyAmJiBjdC0+dHlwZSA9PSBORVdMSU5FKSBscy0+bHR3bmwgPSAxOworCQlpZiAodHRXSEkoY3QtPnR5cGUpKSB7CisJCQkqd3IgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGN0LT50eXBlID09IExQQVIpIHsKKwkJCW5wYXIgPSAxOworCQl9CisJCWJyZWFrOworCX0KKwlpZiAoIW5wYXIpIHsKKwkJaWYgKGN0ID09IGxzLT5jdG9rKSByZXR1cm4gMTsKKwkJaWYgKHJlYWRfZnJvbV9maWZvKSByZXR1cm4gMjsKKwkJcmV0dXJuIDM7CisJfQorCWlmICghcmVhZF9mcm9tX2ZpZm8gJiYgY3QgPT0gbHMtPmN0b2spIGxzLT5sdHdubCA9IDA7CisJaSA9IDA7CisJaWYgKChuYXJnICsgdmFhcmcpID09IDApIHsKKwkJd2hpbGUoIXVucmF2ZWwobHMpKSB7CisJCQlpZiAodHRXSEkoY3QtPnR5cGUpKSBjb250aW51ZTsKKwkJCWlmIChjdC0+dHlwZSA9PSBSUEFSKSBnb3RvIGhhcnZlc3RlZDsKKwkJCW5wYXIgPSAxOworCQkJZ290byB0b29fbWFueV9hcmdzOworCQl9CisJfQorCXdoaWxlICghdW5yYXZlbChscykpIHsKKwkJc3RydWN0IHRva2VuIHQ7CisKKwkJaWYgKGN0LT50eXBlID09IExQQVIpIG5wYXIgKys7CisJCWVsc2UgaWYgKGN0LT50eXBlID09IFJQQVIgJiYgKC0tIG5wYXIpID09IDApIHsKKwkJCWlmIChhdGxbaV0ubnQgIT0gMAorCQkJCSYmIHR0TVdTKGF0bFtpXS50W2F0bFtpXS5udCAtIDFdLnR5cGUpKQorCQkJCQlhdGxbaV0ubnQgLS07CisJCQlpICsrOworCQkJLyoKKwkJCSAqIEM5OSBzdGFuZGFyZCBzdGF0ZXMgdGhhdCBhdCBsZWFzdCBvbmUgYXJndW1lbnQKKwkJCSAqIHNob3VsZCBiZSBwcmVzZW50IGZvciB0aGUgLi4uIHBhcnQ7IHRvIHJlbGF4CisJCQkgKiB0aGlzIGJlaGF2aW91ciwgY2hhbmdlICduYXJnICsgdmFhcmcnIHRvICduYXJnJy4KKwkJCSAqLworCQkJaWYgKGkgPCAobmFyZyArIHZhYXJnKSkgeworCQkJCWVycm9yKGJlZ2luX2xpbmUsICJub3QgZW5vdWdoIGFyZ3VtZW50cyAiCisJCQkJCSJ0byBtYWNybyIpOworI2lmZGVmIEhBVkVfTUlTUkEKKwkJCQltaXNyYV9uZXUoOTQsMTksOCwwKTsKKyNlbmRpZgorCQkJCXJldHVybiA0OworCQkJfQorCQkJaWYgKGkgPiBuYXJnKSB7CisJCQkJaWYgKCEobHMtPmZsYWdzICYgTUFDUk9fVkFBUkcpIHx8ICF2YWFyZykKKwkJCQkJZ290byB0b29fbWFueV9hcmdzOworCQkJfQorCQkJZ290byBoYXJ2ZXN0ZWQ7CisJCX0gZWxzZSBpZiAoY3QtPnR5cGUgPT0gQ09NTUEgJiYgbnBhciA8PSAxICYmIGkgPCBuYXJnKSB7CisJCQlpZiAoYXRsW2ldLm50ICE9IDAKKwkJCQkmJiB0dE1XUyhhdGxbaV0udFthdGxbaV0ubnQgLSAxXS50eXBlKSkKKwkJCQkJYXRsW2ldLm50IC0tOworCQkJaWYgKCsrIGkgPT0gbmFyZykgeworCQkJCWlmICghKGxzLT5mbGFncyAmIE1BQ1JPX1ZBQVJHKSB8fCAhdmFhcmcpCisJCQkJCWdvdG8gdG9vX21hbnlfYXJnczsKKwkJCX0KKwkJCWlmIChpID4gMzAwMDApIGdvdG8gdG9vX21hbnlfYXJnczsKKwkJCWx0d3dzID0gMTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKGx0d3dzICYmIHR0V0hJKGN0LT50eXBlKSkgY29udGludWU7CisKKwkJdC50eXBlID0gY3QtPnR5cGU7CisJCWlmICghcmVhZF9mcm9tX2ZpZm8pIHQubGluZSA9IGxzLT5saW5lOyBlbHNlIHQubGluZSA9IGN0LT5saW5lOworCQkvKgorCQkgKiBTdHJpbmdpZmljYXRpb24gYXBwbGllcyBvbmx5IG9uIG1hY3JvIGFyZ3VtZW50czsKKwkJICogc28gd2UgaGFuZGxlIGhlcmUgT1BUX05PTkUuCisJCSAqIE9QVF9OT05FIGlzIGtlcHQsIGJ1dCBkb2VzIG5vdCBjb3VudCBhcyB3aGl0ZXNwYWNlLAorCQkgKiBhbmQgbWVyZ2VzIHdpdGggb3RoZXIgd2hpdGVzcGFjZSB0byBnaXZlIGEgZnVsbHkKKwkJICogcXVhbGlmaWVkIE5PTkUgdG9rZW4uIFR3byBPUFRfTk9ORSB0b2tlbnMgbWVyZ2UuCisJCSAqIEluaXRpYWwgYW5kIGZpbmFsIE9QVF9OT05FIGFyZSBkaXNjYXJkZWQgKGluaXRpYWwKKwkJICogaXMgYWxyZWFkeSBkb25lLCBhcyBPUFRfTk9ORSBpcyBtYXRjaGVkIGJ5IHR0V0hJKS4KKwkJICovCisKKwkJaWYgKHR0V0hJKHQudHlwZSkpIHsKKwkJCWlmICh0LnR5cGUgIT0gT1BUX05PTkUpIHsKKwkJCQl0LnR5cGUgPSBOT05FOworCQkJCWx0d3dzID0gMTsKKwkJCX0KKwkJCWlmIChhdGxbaV0ubnQgPiAwCisJCQkJJiYgYXRsW2ldLnRbYXRsW2ldLm50IC0gMV0udHlwZSA9PSBPUFRfTk9ORSkKKwkJCQkJYXRsW2ldLm50IC0tOworCQl9IGVsc2UgbHR3d3MgPSAwOworCQlpZiAoU19UT0tFTih0LnR5cGUpKSB7CisJCQl0Lm5hbWUgPSBjdC0+bmFtZTsKKwkJCWlmIChjdCA9PSAobHMpLT5jdG9rKSB7CisJCQkJdC5uYW1lID0gc2R1cCh0Lm5hbWUpOworCQkJCXRocm93X2F3YXkobHMtPmdmLCB0Lm5hbWUpOworCQkJfQorCQl9CisJCWFvbChhdGxbaV0udCwgYXRsW2ldLm50LCB0LCBUT0tFTl9MSVNUX01FTUcpOworCX0KKwllcnJvcihiZWdpbl9saW5lLCAidW5maW5pc2hlZCBtYWNybyBjYWxsIik7CisJcmV0dXJuIDQ7Cit0b29fbWFueV9hcmdzOgorCWVycm9yKGJlZ2luX2xpbmUsICJ0b28gbWFueSBhcmd1bWVudHMgdG8gbWFjcm8iKTsKKwl3aGlsZSAobnBhciAmJiAhdW5yYXZlbChscykpIHsKKwkJaWYgKGN0LT50eXBlID09IExQQVIpIG5wYXIgKys7CisJCWVsc2UgaWYgKGN0LT50eXBlID09IFJQQVIpIG5wYXIgLS07CisJfQorCXJldHVybiA0OworaGFydmVzdGVkOgorCWlmIChpID4gMTI3ICYmIChscy0+ZmxhZ3MgJiBXQVJOX1NUQU5EQVJEKSkKKwkJd2FybmluZyhiZWdpbl9saW5lLCAibWFjcm8gY2FsbCB3aXRoICVkIGFyZ3VtZW50cyAoSVNPICIKKwkJCSJzcGVjaWZpZXMgMTI3IG1heCkiLCBpKTsKKwlyZXR1cm4gMDsKKyN1bmRlZiB1bnJhdmVsCit9CisKKy8qCisgKiBjb25jYXRfdG9rZW4oKSBpcyBjYWxsZWQgd2hlbiB0aGUgIyMgb3BlcmF0b3IgaXMgdXNlZC4gSXQgdXNlcworICogdGhlIHN0cnVjdCBsZXhlcl9zdGF0ZSBkc2hhcnBfbGV4ZXIgdG8gcGFyc2UgdGhlIHJlc3VsdCBvZiB0aGUKKyAqIGNvbmNhdGVuYXRpb24uCisgKgorICogTGF3IGVuZm9yY2VtZW50OiBpZiB0aGUgd2hvbGUgc3RyaW5nIGRvZXMgbm90IHByb2R1Y2UgYSB2YWxpZAorICogdG9rZW4sIHJlcG9ydCBhbiBlcnJvci4gVGhpcyBhbHNvIGFwcGxpZXMgaWYgb25seSB0aGUgYmVnaW5uaW5nCisgKiBvZiB0aGUgc3RyaW5nIGdpdmVzIGEgc3RhdGVtZW50LiBGb3IgaW5zdGFuY2UsICcoICMjICknIHdpbGwKKyAqIHByb2R1Y2UgYW4gZXJyb3IsIHNpbmNlICcoKScgaXMgbm90IGEgdmFsaWQgQyB0b2tlbi4gT3RoZXIKKyAqIHByZXByb2Nlc3NvcnMgd291bGQgaWdub3JlIHRoZSAjIyBvcGVyYXRvciBpbiBzdWNoIGluc3RhbmNlLgorICovCitzdHJ1Y3QgbGV4ZXJfc3RhdGUgZHNoYXJwX2xleGVyOworCitzdGF0aWMgaW5saW5lIGludCBjb25jYXRfdG9rZW4oc3RydWN0IHRva2VuICp0MSwgc3RydWN0IHRva2VuICp0MikKK3sKKwljaGFyICpuMSA9IHRva2VuX25hbWUodDEpLCAqbjIgPSB0b2tlbl9uYW1lKHQyKTsKKwlzaXplX3QgbDEgPSBzdHJsZW4objEpLCBsMiA9IHN0cmxlbihuMik7CisJdW5zaWduZWQgY2hhciAqeCA9IGdldG1lbShsMSArIGwyICsgMSk7CisJaW50IHI7CisKKwltbXYoeCwgbjEsIGwxKTsKKwltbXYoeCArIGwxLCBuMiwgbDIpOworCXhbbDEgKyBsMl0gPSAwOworCWRzaGFycF9sZXhlci5pbnB1dCA9IDA7CisJZHNoYXJwX2xleGVyLmlucHV0X3N0cmluZyA9IHg7CisJZHNoYXJwX2xleGVyLnBidWYgPSAwOworCWRzaGFycF9sZXhlci5lYnVmID0gbDEgKyBsMjsKKwlkc2hhcnBfbGV4ZXIuZGlzY2FyZCA9IDE7CisJZHNoYXJwX2xleGVyLmZsYWdzID0gREVGQVVMVF9MRVhFUl9GTEFHUzsKKwlkc2hhcnBfbGV4ZXIucGVuZGluZ190b2tlbiA9IDA7CisJciA9IG5leHRfdG9rZW4oJmRzaGFycF9sZXhlcik7CisJZnJlZW1lbSh4KTsKKwlyZXR1cm4gKHIgPT0gMSB8fCBkc2hhcnBfbGV4ZXIucGJ1ZiA8IChsMSArIGwyKQorCQl8fCBkc2hhcnBfbGV4ZXIucGVuZGluZ190b2tlbgorCQl8fCAoZHNoYXJwX2xleGVyLnBidWYgPT0gKGwxICsgbDIpICYmICFkc2hhcnBfbGV4ZXIuZGlzY2FyZCkpOworfQorCisjaWZkZWYgUFJBR01BX1RPS0VOSVpFCisvKgorICogdG9rZW5pemVfc3RyaW5nKCkgdGFrZXMgYSBzdHJpbmcgYXMgaW5wdXQsIGFuZCBzcGxpdCBpdCBpbnRvIHRva2VucywKKyAqIHJlYXNzZW1ibGluZyB0aGUgdG9rZW5zIGludG8gYSBzaW5nbGUgY29tcHJlc3NlZCBzdHJpbmcgZ2VuZXJhdGVkIGJ5CisgKiBjb21wcmVzc190b2tlbl9saXN0KCk7IHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgX1ByYWdtYSBwcm9jZXNzaW5nLgorICovCitzdHJ1Y3QgbGV4ZXJfc3RhdGUgdG9rZW5pemVfbGV4ZXI7CisKK3N0YXRpYyBjaGFyICp0b2tlbml6ZV9zdHJpbmcoc3RydWN0IGxleGVyX3N0YXRlICpscywgY2hhciAqYnVmKQoreworCXN0cnVjdCB0b2tlbl9maWZvIHRmOworCXNpemVfdCBibCA9IHN0cmxlbihidWYpOworCWludCByOworCisJdG9rZW5pemVfbGV4ZXIuaW5wdXQgPSAwOworCXRva2VuaXplX2xleGVyLmlucHV0X3N0cmluZyA9ICh1bnNpZ25lZCBjaGFyICopYnVmOworCXRva2VuaXplX2xleGVyLnBidWYgPSAwOworCXRva2VuaXplX2xleGVyLmVidWYgPSBibDsKKwl0b2tlbml6ZV9sZXhlci5kaXNjYXJkID0gMTsKKwl0b2tlbml6ZV9sZXhlci5mbGFncyA9IGxzLT5mbGFncyB8IExFWEVSOworCXRva2VuaXplX2xleGVyLnBlbmRpbmdfdG9rZW4gPSAwOworCXRmLmFydCA9IHRmLm50ID0gMDsKKwl3aGlsZSAoIShyID0gbmV4dF90b2tlbigmdG9rZW5pemVfbGV4ZXIpKSkgeworCQlzdHJ1Y3QgdG9rZW4gdCwgKmN0ID0gdG9rZW5pemVfbGV4ZXIuY3RvazsKKworCQlpZiAodHRXSEkoY3QtPnR5cGUpKSBjb250aW51ZTsKKwkJdCA9ICpjdDsKKwkJaWYgKFNfVE9LRU4odC50eXBlKSkgdC5uYW1lID0gc2R1cCh0Lm5hbWUpOworCQlhb2wodGYudCwgdGYubnQsIHQsIFRPS0VOX0xJU1RfTUVNRyk7CisJfQorCWlmICh0b2tlbml6ZV9sZXhlci5wYnVmIDwgYmwpIGdvdG8gdG9rZW5pemVfZXJyb3I7CisJcmV0dXJuIChjaGFyICopKChjb21wcmVzc190b2tlbl9saXN0KCZ0ZikpLnQpOworCit0b2tlbml6ZV9lcnJvcjoKKwlpZiAodGYubnQpIHsKKwkJZm9yICh0Zi5hcnQgPSAwOyB0Zi5hcnQgPCB0Zi5udDsgdGYuYXJ0ICsrKQorCQkJaWYgKFNfVE9LRU4odGYudFt0Zi5hcnRdLnR5cGUpKQorCQkJCWZyZWVtZW0odGYudFt0Zi5hcnRdLm5hbWUpOworCQlmcmVlbWVtKHRmLnQpOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKgorICogc3RyaW5naWZ5X3N0cmluZygpIGhhcyBhIHNlbGYtZXhwbGFuYXRvcnkgbmFtZS4gSXQgaXMgY2FsbGVkIHdoZW4KKyAqIHRoZSAjIG9wZXJhdG9yIGlzIHVzZWQgaW4gYSBtYWNybyBhbmQgYSBzdHJpbmcgY29uc3RhbnQgbXVzdCBiZQorICogc3RyaW5naWZpZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgY2hhciAqc3RyaW5naWZ5X3N0cmluZyhjaGFyICp4KQoreworCXNpemVfdCBsOworCWludCBpLCBpbnNpZGVfc3RyID0gMCwgaW5zaWRlX2NjID0gMCwgbXVzdF9xdW90ZSwgaGFzX3F1b3RlZCA9IDA7CisJY2hhciAqeSwgKmQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSArKykgeworCQlpZiAoaSkgZFswXSA9ICciJzsKKwkJZm9yIChsID0gMSwgeSA9IHg7ICp5OyB5ICsrLCBsICsrKSB7CisJCQltdXN0X3F1b3RlID0gMDsKKwkJCWlmIChpbnNpZGVfY2MpIHsKKwkJCQlpZiAoKnkgPT0gJ1xcJykgeworCQkJCQltdXN0X3F1b3RlID0gMTsKKwkJCQkJaGFzX3F1b3RlZCA9IDE7CisJCQkJfSBlbHNlIGlmICghaGFzX3F1b3RlZCAmJiAqeSA9PSAnXCcnKQorCQkJCQlpbnNpZGVfY2MgPSAwOworCQkJfSBlbHNlIGlmIChpbnNpZGVfc3RyKSB7CisJCQkJaWYgKCp5ID09ICciJyB8fCAqeSA9PSAnXFwnKSBtdXN0X3F1b3RlID0gMTsKKwkJCQlpZiAoKnkgPT0gJ1xcJykgaGFzX3F1b3RlZCA9IDE7CisJCQkJZWxzZSBpZiAoIWhhc19xdW90ZWQgJiYgKnkgPT0gJyInKQorCQkJCQlpbnNpZGVfc3RyID0gMDsKKwkJCX0gZWxzZSBpZiAoKnkgPT0gJyInKSB7CisJCQkJaW5zaWRlX3N0ciA9IDE7CisJCQkJbXVzdF9xdW90ZSA9IDE7CisJCQl9IGVsc2UgaWYgKCp5ID09ICdcJycpIHsKKwkJCQlpbnNpZGVfY2MgPSAxOworCQkJfQorCQkJaWYgKG11c3RfcXVvdGUpIHsKKwkJCQlpZiAoaSkgZFtsXSA9ICdcXCc7CisJCQkJbCArKzsKKwkJCX0KKwkJCWlmIChpKSBkW2xdID0gKnk7CisJCX0KKwkJaWYgKCFpKSBkID0gZ2V0bWVtKGwgKyAyKTsKKwkJaWYgKGkpIHsKKwkJCWRbbF0gPSAnIic7CisJCQlkW2wgKyAxXSA9IDA7CisJCX0KKwl9CisJcmV0dXJuIGQ7Cit9CisKKy8qCisgKiBzdHJpbmdpZnkoKSBwcm9kdWNlcyBhIGNvbnN0YW50IHN0cmluZywgcmVzdWx0IG9mIHRoZSAjIG9wZXJhdG9yCisgKiBvbiBhIGxpc3Qgb2YgdG9rZW5zLgorICovCitzdGF0aWMgY2hhciAqc3RyaW5naWZ5KHN0cnVjdCB0b2tlbl9maWZvICp0ZikKK3sKKwlzaXplX3QgdGxlbjsKKwlzaXplX3QgaTsKKwljaGFyICp4LCAqeTsKKworCWZvciAodGxlbiA9IDAsIGkgPSAwOyBpIDwgdGYtPm50OyBpICsrKQorCQlpZiAodGYtPnRbaV0udHlwZSA8IENQUEVSUiAmJiB0Zi0+dFtpXS50eXBlICE9IE9QVF9OT05FKQorCQkJdGxlbiArPSBzdHJsZW4odG9rZW5fbmFtZSh0Zi0+dCArIGkpKTsKKwlpZiAodGxlbiA9PSAwKSByZXR1cm4gc2R1cCgiXCJcIiIpOworCXggPSBnZXRtZW0odGxlbiArIDEpOworCWZvciAodGxlbiA9IDAsIGkgPSAwOyBpIDwgdGYtPm50OyBpICsrKSB7CisJCWlmICh0Zi0+dFtpXS50eXBlID49IENQUEVSUiB8fCB0Zi0+dFtpXS50eXBlID09IE9QVF9OT05FKQorCQkJY29udGludWU7CisJCXN0cmNweSh4ICsgdGxlbiwgdG9rZW5fbmFtZSh0Zi0+dCArIGkpKTsKKwkJdGxlbiArPSBzdHJsZW4odG9rZW5fbmFtZSh0Zi0+dCArIGkpKTsKKwl9CisJLyogbm8gbmVlZCB0byBhZGQgYSB0cmFpbGluZyAwOiBzdHJjcHkoKSBkaWQgdGhhdCAoYW5kIHRoZSBzdHJpbmcKKwkgICBpcyBub3QgZW1wdHkpICovCisJeSA9IHN0cmluZ2lmeV9zdHJpbmcoeCk7CisJZnJlZW1lbSh4KTsKKwlyZXR1cm4geTsKK30KKworLyoKKyAqIFR3byBzdHJpbmdzIGV2YWx1YXRlZCBhdCBpbml0aWFsaXphdGlvbiB0aW1lLCB0byBoYW5kbGUgdGhlIF9fVElNRV9fCisgKiBhbmQgX19EQVRFX18gc3BlY2lhbCBtYWNyb3MuCisgKgorICogQzk5IHNwZWNpZmllcyB0aGF0IHRoZXNlIG1hY3JvcyBzaG91bGQgcmVtYWluIGNvbnN0YW50IHRocm91Z2hvdXQKKyAqIHRoZSB3aG9sZSBwcmVwcm9jZXNzaW5nLgorICovCitjaGFyIGNvbXBpbGVfdGltZVsxMl0sIGNvbXBpbGVfZGF0ZVsyNF0sIGNvbXBpbGVfYWRhdGVbMTZdOworCisvKgorICogc3Vic3RpdHV0ZV9tYWNybygpIHBlcmZvcm1zIHRoZSBtYWNybyBzdWJzdGl0dXRpb24uIEl0IGlzIGNhbGxlZCB3aGVuCisgKiBhbiBpZGVudGlmaWVyIHJlY29nbml6ZWQgYXMgYSBtYWNybyBuYW1lIGhhcyBiZWVuIGZvdW5kOyB0aGlzIGZ1bmN0aW9uCisgKiB0cmllcyB0byBjb2xsZWN0IHRoZSBhcmd1bWVudHMgKGlmIG5lZWRlZCksIGFwcGxpZXMgIyBhbmQgIyMgb3BlcmF0b3JzCisgKiBhbmQgcGVyZm9ybSByZWN1cnNpdmUgYW5kIG5lc3RlZCBtYWNybyBleHBhbnNpb25zLgorICoKKyAqIEluIHRoZSBzdWJzdGl0dXRpb24gb2YgYSBtYWNybywgd2UgcmVtb3ZlIGFsbCBuZXdsaW5lcyB0aGF0IHdlcmUgaW4gdGhlCisgKiBhcmd1bWVudHMuIFRoaXMgbWlnaHQgY29uZnVzZSBlcnJvciByZXBvcnRpbmcgKHdoaWNoIGNvdWxkIHJlcG9ydAorICogZXJyb25lb3VzIGxpbmUgbnVtYmVycykgb3IgaGF2ZSB3b3JzZSBlZmZlY3QgaXMgdGhlIHByZXByb2Nlc3NvciBpcworICogdXNlZCBmb3IgYW5vdGhlciBsYW5ndWFnZSBwaWNraWVyIHRoYW4gQy4gU2luY2UgdGhlIGludGVyZmFjZSBiZXR3ZWVuCisgKiB0aGUgcHJlcHJvY2Vzc29yIGFuZCB0aGUgY29tcGlsZXIgaXMgbm90IGZ1bGx5IHNwZWNpZmllZCwgSSBiZWxpZXZlCisgKiB0aGF0IHRoaXMgaXMgbm8gdmlvbGF0aW9uIG9mIHRoZSBzdGFuZGFyZC4gQ29tbWVudHMgd2VsY29tZS4KKyAqCisgKiBXZSB0YWtlIHRva2VucyBmcm9tIHRmaS4gSWYgdGZpIGhhcyBubyBtb3JlIHRva2VucyB0byBnaXZlOiB3ZSBtYXkKKyAqIHRha2Ugc29tZSB0b2tlbnMgZnJvbSBscyB0byBjb21wbGV0ZSBhIGNhbGwgKGZldGNoIGFyZ3VtZW50cykgaWYKKyAqIGFuZCBvbmx5IGlmIHBlbnVyeSBpcyBub24gemVyby4KKyAqLworaW50IHN1YnN0aXR1dGVfbWFjcm8oc3RydWN0IGxleGVyX3N0YXRlICpscywgc3RydWN0IG1hY3JvICptLAorCXN0cnVjdCB0b2tlbl9maWZvICp0ZmksIGludCBwZW51cnksIGludCByZWplY3RfbmVzdGVkLCBsb25nIGwpCit7CisJc3RydWN0IHRva2VuX2ZpZm8gKmF0bCwgZXRsOworCXN0cnVjdCB0b2tlbiB0LCAqY3Q7CisJaW50IGksIHNhdmVfbmVzdCA9IG0tPm5lc3Q7CisJc2l6ZV90IHNhdmVfYXJ0LCBzYXZlX3RmaSwgZXRsX2xpbWl0OworCWludCBsdHdkcywgbnR3ZHMsIGx0d3dzOworCWludCBwcmFnbWFfb3AgPSAwOworCisJLyoKKwkgKiBSZWplY3QgdGhlIHJlcGxhY2VtZW50LCBpZiB3ZSBhcmUgYWxyZWFkeSBpbnNpZGUgdGhlIG1hY3JvLgorCSAqLworCWlmIChtLT5uZXN0ID4gcmVqZWN0X25lc3RlZCkgeworCQl0LnR5cGUgPSBOQU1FOworCQl0LmxpbmUgPSBscy0+bGluZTsKKwkJdC5uYW1lID0gbS0+bmFtZTsKKwkJcHJpbnRfdG9rZW4obHMsICZ0LCAwKTsKKwkJcmV0dXJuIDA7CisJfQorI2lmZGVmIEhBVkVfTUlTUkEKKwlpZiAoIXN0cmNtcChtLT5uYW1lLCJvZmZzZXRvZiIpKSBtaXNyYV9uZXUoMTIwLDIwLDYsLTEpOworCWlmICghc3RyY21wKG0tPm5hbWUsInNldGptcCIpKSBtaXNyYV9uZXUoMTIyLDIwLDcsLTEpOworI2VuZGlmCisJLyoKKwkgKiBwdXQgYSBzZXBhcmF0aW9uIGZyb20gcHJlY2VlZGluZyB0b2tlbnMKKwkgKi8KKwlwcmludF9zcGFjZShscyk7CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBtYWNybyBpcyBhIHNwZWNpYWwgb25lLgorCSAqLworCWlmICgoaSA9IGNoZWNrX3NwZWNpYWxfbWFjcm8obS0+bmFtZSkpID49IE1BQ19TUEVDSUFMKSB7CisJCS8qIHdlIGhhdmUgYSBzcGVjaWFsIG1hY3JvICovCisJCXN3aXRjaCAoaSkgeworCQkJY2hhciBidWZbMzBdLCAqYmJ1ZiwgKmNmbjsKKworCQljYXNlIE1BQ19MSU5FOgorCQkJdC50eXBlID0gTlVNQkVSOworCQkJdC5saW5lID0gbDsKKwkJCXNwcmludGYoYnVmLCAiJWxkIiwgbCk7CisJCQl0Lm5hbWUgPSBidWY7CisJCQlwcmludF9zcGFjZShscyk7CisJCQlwcmludF90b2tlbihscywgJnQsIDApOworCQkJYnJlYWs7CisJCWNhc2UgTUFDX0ZJTEU6CisJCQl0LnR5cGUgPSBTVFJJTkc7CisJCQl0LmxpbmUgPSBsOworCQkJY2ZuID0gY3VycmVudF9sb25nX2ZpbGVuYW1lID8KKwkJCQljdXJyZW50X2xvbmdfZmlsZW5hbWUgOiBjdXJyZW50X2ZpbGVuYW1lOworCQkJYmJ1ZiA9IGdldG1lbSgyICogc3RybGVuKGNmbikgKyAzKTsKKwkJCXsKKwkJCQljaGFyICpjLCAqZDsKKwkJCQlpbnQgbGN3YiA9IDA7CisKKwkJCQliYnVmWzBdID0gJyInOworCQkJCWZvciAoYyA9IGNmbiwgZCA9IGJidWYgKyAxOyAqYzsgYyArKykgeworCQkJCQlpZiAoKmMgPT0gJ1xcJykgeworCQkJCQkJaWYgKGxjd2IpIGNvbnRpbnVlOworCQkJCQkJKihkICsrKSA9ICdcXCc7CisJCQkJCQlsY3diID0gMTsKKwkJCQkJfSBlbHNlIGxjd2IgPSAwOworCQkJCQkqKGQgKyspID0gKmM7CisJCQkJfQorCQkJCSooZCArKykgPSAnIic7CisJCQkJKihkICsrKSA9IDA7CisJCQl9CisJCQl0Lm5hbWUgPSBiYnVmOworCQkJcHJpbnRfc3BhY2UobHMpOworCQkJcHJpbnRfdG9rZW4obHMsICZ0LCAwKTsKKwkJCWZyZWVtZW0oYmJ1Zik7CisJCQlicmVhazsKKwkJY2FzZSBNQUNfREFURToKKwkJCXQudHlwZSA9IFNUUklORzsKKwkJCXQubGluZSA9IGw7CisJCQl0Lm5hbWUgPSBjb21waWxlX2RhdGU7CisJCQlwcmludF9zcGFjZShscyk7CisJCQlwcmludF90b2tlbihscywgJnQsIDApOworCQkJYnJlYWs7CisJCWNhc2UgTUFDX0FEQVRFOgorCQkJdC50eXBlID0gU1RSSU5HOworCQkJdC5saW5lID0gbDsKKwkJCXQubmFtZSA9IGNvbXBpbGVfYWRhdGU7CisJCQlwcmludF9zcGFjZShscyk7CisJCQlwcmludF90b2tlbihscywgJnQsIDApOworCQkJYnJlYWs7CisJCWNhc2UgTUFDX1RJTUU6CisJCQl0LnR5cGUgPSBTVFJJTkc7CisJCQl0LmxpbmUgPSBsOworCQkJdC5uYW1lID0gY29tcGlsZV90aW1lOworCQkJcHJpbnRfc3BhY2UobHMpOworCQkJcHJpbnRfdG9rZW4obHMsICZ0LCAwKTsKKwkJCWJyZWFrOworCQljYXNlIE1BQ19TVERDOgorCQkJdC50eXBlID0gTlVNQkVSOworCQkJdC5saW5lID0gbDsKKwkJCXQubmFtZSA9ICIxIjsKKwkJCXByaW50X3NwYWNlKGxzKTsKKwkJCXByaW50X3Rva2VuKGxzLCAmdCwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBNQUNfUFJBR01BOgorCQkJaWYgKHJlamVjdF9uZXN0ZWQgPiAwKSB7CisJCQkJLyogZG8gbm90IHJlcGxhY2UgX1ByYWdtYSgpIHVubGVzcyB0b3BsZXZlbCAqLworCQkJCXQudHlwZSA9IE5BTUU7CisJCQkJdC5saW5lID0gbHMtPmxpbmU7CisJCQkJdC5uYW1lID0gbS0+bmFtZTsKKwkJCQlwcmludF90b2tlbihscywgJnQsIDApOworCQkJCXJldHVybiAwOworCQkJfQorCQkJcHJhZ21hX29wID0gMTsKKwkJCWdvdG8gY29sbGVjdF9hcmdzOworI2lmZGVmIEFVRElUCisJCWRlZmF1bHQ6CisJCQlvdWNoKCJ1bmJla2FubnRlcyBmbGllZ2VuZGVzIG1hY3JvIik7CisjZW5kaWYKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBtYWNybyBoYXMgYXJndW1lbnRzLCBjb2xsZWN0IHRoZW0uCisJICovCitjb2xsZWN0X2FyZ3M6CisJaWYgKG0tPm5hcmcgPj0gMCkgeworCQl1bnNpZ25lZCBsb25nIHNhdmVfZmxhZ3MgPSBscy0+ZmxhZ3M7CisJCWludCB3ciA9IDA7CisKKwkJbHMtPmZsYWdzIHw9IExFWEVSOworCQlpZiAobS0+bmFyZyA+IDAgfHwgbS0+dmFhcmcpCisJCQlhdGwgPSBnZXRtZW0oKG0tPm5hcmcgKyBtLT52YWFyZykKKwkJCQkqIHNpemVvZihzdHJ1Y3QgdG9rZW5fZmlmbykpOworCQlzd2l0Y2ggKGNvbGxlY3RfYXJndW1lbnRzKGxzLCB0ZmksIHBlbnVyeSwgYXRsLAorCQkJbS0+bmFyZywgbS0+dmFhcmcsICZ3cikpIHsKKwkJY2FzZSAxOgorCQkJLyogdGhlIG1hY3JvIGV4cGVjdGVkIGFyZ3VtZW50cywgYnV0IHdlIGRpZCBub3QKKwkJCSAgIGZpbmQgYW55OyB0aGUgbGFzdCByZWFkIHRva2VuIHNob3VsZCBiZSByZWFkCisJCQkgICBhZ2Fpbi4gKi8KKwkJCWxzLT5mbGFncyA9IHNhdmVfZmxhZ3MgfCBSRUFEX0FHQUlOOworCQkJZ290byBub19hcmd1bWVudF9uZXh0OworCQljYXNlIDI6CisJCQl0ZmktPmFydCAtLTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIDM6CisJCQlscy0+ZmxhZ3MgPSBzYXZlX2ZsYWdzOworCQlub19hcmd1bWVudF9uZXh0OgorCQkJdC50eXBlID0gTkFNRTsKKwkJCXQubGluZSA9IGw7CisJCQl0Lm5hbWUgPSBtLT5uYW1lOworCQkJcHJpbnRfdG9rZW4obHMsICZ0LCAwKTsKKwkJCWlmICh3cikgeworCQkJCXQudHlwZSA9IE5PTkU7CisJCQkJdC5saW5lID0gbDsKKyNpZmRlZiBTRU1QRVJfRklERUxJUworCQkJCXQubmFtZSA9ICIgIjsKKyNlbmRpZgorCQkJCXByaW50X3Rva2VuKGxzLCAmdCwgMCk7CisJCQkJZ290byBleGl0X21hY3JvXzI7CisJCQl9CisJCQlnb3RvIGV4aXRfbWFjcm9fMTsKKwkJY2FzZSA0OgorCQkJbHMtPmZsYWdzID0gc2F2ZV9mbGFnczsKKwkJCXJldHVybiAxOworCQl9CisJCWxzLT5mbGFncyA9IHNhdmVfZmxhZ3M7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgbWFjcm8gaXMgX1ByYWdtYSwgYW5kIHdlIGdvdCBoZXJlLCB0aGVuIHdlIGhhdmUKKwkgKiBleGFjdGx5IG9uZSBhcmd1bWVudC4gV2UgY2hlY2sgaXQsIHVuc3RyaW5naXplIGl0LCBhbmQKKwkgKiBlbWl0IGEgUFJBR01BIHRva2VuLgorCSAqLworCWlmIChwcmFnbWFfb3ApIHsKKwkJY2hhciAqcG47CisKKwkJaWYgKGF0bFswXS5udCAhPSAxIHx8IGF0bFswXS50WzBdLnR5cGUgIT0gU1RSSU5HKSB7CisJCQllcnJvcihscy0+bGluZSwgImludmFsaWQgYXJndW1lbnQgdG8gX1ByYWdtYSIpOworCQkJaWYgKGF0bFswXS5udCkgZnJlZW1lbShhdGxbMF0udCk7CisJCQlmcmVlbWVtKGF0bCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlwbiA9IGF0bFswXS50WzBdLm5hbWU7CisJCWlmICgocG5bMF0gPT0gJyInICYmIHBuWzFdID09ICciJykgfHwgKHBuWzBdID09ICdMJworCQkJJiYgcG5bMV0gPT0gJyInICYmIHBuWzJdID09ICciJykpIHsKKwkJCS8qIHZvaWQgcHJhZ21hIC0tIGp1c3QgaWdub3JlIGl0ICovCisJCQlmcmVlbWVtKGF0bFswXS50KTsKKwkJCWZyZWVtZW0oYXRsKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChscy0+ZmxhZ3MgJiBURVhUX09VVFBVVCkgeworI2lmZGVmIFBSQUdNQV9EVU1QCisJLyoKKwkgKiBUaGlzIGNvZGUgd29ya3MgYmVjYXVzZSB3ZSBhY3R1YWxseSBldmFsdWF0ZSBhcmd1bWVudHMgaW4gYQorCSAqIGxhenkgd2F5OiB3ZSBzY2FuIGEgbWFjcm8gYXJndW1lbnQgb25seSBpZiBpdCBhcHBlYXJzIGluIHRoZQorCSAqIG91dHB1dCwgYW5kIGV4YWN0bHkgYXMgbWFueSB0aW1lcyBhcyBpdCBhcHBlYXJzLiBUaGVyZWZvcmUsCisJICogX1ByYWdtYSgpIHdpbGwgZ2V0IGV2YWx1YXRlZCBqdXN0IGxpa2UgdGhleSBzaG91bGQuCisJICovCisJCQljaGFyICpjID0gYXRsWzBdLnRbMF0ubmFtZSwgKmQ7CisKKwkJCWZvciAoZCA9ICJcbiNwcmFnbWEgIjsgKmQ7IGQgKyspIHB1dF9jaGFyKGxzLCAqZCk7CisJCQlkID0gKCpjID09ICdMJykgPyBjICsgMiA6IGMgKyAxOworCQkJZm9yICg7ICpkICE9ICciJzsgZCArKykgeworCQkJCWlmICgqZCA9PSAnXFwnICYmICgqKGQgKyAxKSA9PSAnXFwnCisJCQkJCXx8ICooZCArIDEpID09ICciJykpIHsKKwkJCQkJZCArKzsKKwkJCQl9CisJCQkJcHV0X2NoYXIobHMsICpkKTsKKwkJCX0KKwkJCXB1dF9jaGFyKGxzLCAnXG4nKTsKKwkJCWxzLT5vbGluZSA9IGxzLT5saW5lOworCQkJZW50ZXJfZmlsZShscywgbHMtPmZsYWdzKTsKKyNlbHNlCisJCQlpZiAobHMtPmZsYWdzICYgV0FSTl9QUkFHTUEpCisJCQkJd2FybmluZyhscy0+bGluZSwKKwkJCQkJIl9QcmFnbWEoKSBpZ25vcmVkIGFuZCBub3QgZHVtcGVkIik7CisjZW5kaWYKKwkJfSBlbHNlIGlmIChscy0+ZmxhZ3MgJiBIQU5ETEVfUFJBR01BKSB7CisJCQljaGFyICpjID0gYXRsWzBdLnRbMF0ubmFtZSwgKmQsICpidWY7CisJCQlzdHJ1Y3QgdG9rZW4gdDsKKworCQkJLyogYSB3aWRlIHN0cmluZyBpcyBhIHN0cmluZyAqLworCQkJaWYgKCpjID09ICdMJykgYyArKzsKKwkJCWMgKys7CisJCQlmb3IgKGJ1ZiA9IGQgPSBnZXRtZW0oc3RybGVuKGMpKTsgKmMgIT0gJyInOyBjICsrKSB7CisJCQkJaWYgKCpjID09ICdcXCcgJiYgKCooYyArIDEpID09ICdcXCcKKwkJCQkJfHwgKihjICsgMSkgPT0gJyInKSkgeworCQkJCQkqKGQgKyspID0gKigrKyBjKTsKKwkJCQl9IGVsc2UgKihkICsrKSA9ICpjOworCQkJfQorCQkJKmQgPSAwOworCQkJdC50eXBlID0gUFJBR01BOworCQkJdC5saW5lID0gbHMtPmxpbmU7CisjaWZkZWYgUFJBR01BX1RPS0VOSVpFCisJCQl0Lm5hbWUgPSB0b2tlbml6ZV9zdHJpbmcobHMsIGJ1Zik7CisJCQlmcmVlbWVtKGJ1Zik7CisJCQlidWYgPSB0Lm5hbWU7CisJCQlpZiAoIWJ1ZikgeworCQkJCWZyZWVtZW0oYXRsWzBdLnQpOworCQkJCWZyZWVtZW0oYXRsKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKyNlbHNlCisJCQl0Lm5hbWUgPSBidWY7CisjZW5kaWYKKwkJCWFvbChscy0+dG9wbGV2ZWxfb2YtPnQsIGxzLT50b3BsZXZlbF9vZi0+bnQsCisJCQkJdCwgVE9LRU5fTElTVF9NRU1HKTsKKwkJCXRocm93X2F3YXkobHMtPmdmLCBidWYpOworCQl9CisJCWZyZWVtZW0oYXRsWzBdLnQpOworCQlmcmVlbWVtKGF0bCk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogTm93IHdlIGV4cGFuZCBhbmQgcmVwbGFjZSB0aGUgYXJndW1lbnRzIGluIHRoZSBtYWNybzsgd2UKKwkgKiBhbHNvIGhhbmRsZSAnIycgYW5kICcjIycuIElmIHdlIGZpbmQgYW4gYXJndW1lbnQsIHRoYXQgaGFzCisJICogdG8gYmUgcmVwbGFjZWQsIHdlIGV4cGFuZCBpdCBpbiBpdHMgb3duIHRva2VuIGxpc3QsIHRoZW4gcGFzdGUKKwkgKiBpdC4gVHJpY2t5IHBvaW50OiB3aGVuIHdlIHBhc3RlIGFuIGFyZ3VtZW50LCB3ZSBtdXN0IHNjYW4KKwkgKiBhZ2FpbiB0aGUgcmVzdWx0aW5nIGxpc3QgZm9yIGZ1cnRoZXIgcmVwbGFjZW1lbnRzLiBUaGlzCisJICogaW1wbGllcyBwcm9ibGVtcyB3aXRoIHJlZ2FyZHMgdG8gbmVzdGluZyBzZWxmLXJlZmVyZW5jaW5nCisJICogbWFjcm9zLgorCSAqCisJICogV2UgZG8gdGhlbiBZQVVIICh5ZXQgYW5vdGhlciB1Z2x5IGhhY2spOiBpZiBhIG1hY3JvIGlzIHJlcGxhY2VkLAorCSAqIGFuZCBuZXN0ZWQgcmVwbGFjZW1lbnQgZXhoaWJpdCB0aGUgc2FtZSBtYWNybywgd2UgbWFyayBpdCB3aXRoCisJICogYSBuZWdhdGl2ZSBsaW5lIG51bWJlci4gQWxsIHByb2R1Y2VkIG5lZ2F0aXZlIGxpbmUgbnVtYmVycworCSAqIG11c3QgYmUgY2xlYW5lZCBpbiB0aGUgZW5kLgorCSAqLworCisjZGVmaW5lIFpBUF9MSU5FKHQpCWRvIHsgXAorCQlpZiAoKHQpLnR5cGUgPT0gTkFNRSkgeyBcCisJCQlzdHJ1Y3QgbWFjcm8gKnpsbSA9IGdldEhUKG1hY3JvcywgJigodCkubmFtZSkpOyBcCisJCQlpZiAoemxtICYmIHpsbS0+bmVzdCA+IHJlamVjdF9uZXN0ZWQpIFwKKwkJCQkodCkubGluZSA9IC0xIC0gKHQpLmxpbmU7IFwKKwkJfSBcCisJfSB3aGlsZSAoMCkKKworI2lmZGVmIExPV19NRU0KKwlzYXZlX2FydCA9IG0tPmN2YWwucnA7CisJbS0+Y3ZhbC5ycCA9IDA7CisjZWxzZQorCXNhdmVfYXJ0ID0gbS0+dmFsLmFydDsKKwltLT52YWwuYXJ0ID0gMDsKKyNlbmRpZgorCWV0bC5hcnQgPSBldGwubnQgPSAwOworCW0tPm5lc3QgPSByZWplY3RfbmVzdGVkICsgMTsKKwlsdHdkcyA9IG50d2RzID0gMDsKKyNpZmRlZiBMT1dfTUVNCisJd2hpbGUgKG0tPmN2YWwucnAgPCBtLT5jdmFsLmxlbmd0aCkgeworI2Vsc2UKKwl3aGlsZSAobS0+dmFsLmFydCA8IG0tPnZhbC5udCkgeworI2VuZGlmCisJCXNpemVfdCBuZXh0LCB6OworI2lmZGVmIExPV19NRU0KKwkJc3RydWN0IHRva2VuIHV1OworCisJCWN0ID0gJnV1OworCQljdC0+bGluZSA9IDE7CisJCXQudHlwZSA9IGN0LT50eXBlID0gbS0+Y3ZhbC50W20tPmN2YWwucnAgKytdOworCQlpZiAoY3QtPnR5cGUgPT0gTUFDUk9BUkcpIHsKKwkJCWN0LT5saW5lID0gbS0+Y3ZhbC50W20tPmN2YWwucnAgKytdOworCQl9IGVsc2UgaWYgKFNfVE9LRU4oY3QtPnR5cGUpKSB7CisJCQl0Lm5hbWUgPSBjdC0+bmFtZSA9IChjaGFyICopKG0tPmN2YWwudCArIG0tPmN2YWwucnApOworCQkJbS0+Y3ZhbC5ycCArPSAxICsgc3RybGVuKGN0LT5uYW1lKTsKKwkJfQorI2lmZGVmIFNFTVBFUl9GSURFTElTCisJCWVsc2UgaWYgKGN0LT50eXBlID09IE9QVF9OT05FKSB7CisJCQl0LnR5cGUgPSBjdC0+dHlwZSA9IE5PTkU7CisJCQl0Lm5hbWUgPSBjdC0+bmFtZSA9ICIgIjsKKwkJfQorI2VuZGlmCisJCXQubGluZSA9IGxzLT5saW5lOworCQluZXh0ID0gbS0+Y3ZhbC5ycDsKKwkJaWYgKChuZXh0IDwgbS0+Y3ZhbC5sZW5ndGggJiYgKG0tPmN2YWwudFt6ID0gbmV4dF0gPT0gRFNIQVJQCisJCQl8fCBtLT5jdmFsLnRbeiA9IG5leHRdID09IERJR19EU0hBUlApKQorCQkJfHwgKChuZXh0ICsgMSkgPCBtLT5jdmFsLmxlbmd0aAorCQkJICAgJiYgdHRXSEkobS0+Y3ZhbC50W25leHRdKQorCQkJICAgJiYgKG0tPmN2YWwudFt6ID0gbmV4dCArIDFdID09IERTSEFSUAorCQkJICAgIHx8IG0tPmN2YWwudFt6ID0gbmV4dCArIDFdID09IERJR19EU0hBUlApKSkgeworCQkJbnR3ZHMgPSAxOworCQkJbS0+Y3ZhbC5ycCA9IHo7CisJCX0gZWxzZSBudHdkcyA9IDA7CisjZWxzZQorCQljdCA9IG0tPnZhbC50ICsgKG0tPnZhbC5hcnQgKyspOworCQluZXh0ID0gbS0+dmFsLmFydDsKKwkJdC50eXBlID0gY3QtPnR5cGU7CisJCXQubGluZSA9IGxzLT5saW5lOworI2lmZGVmIFNFTVBFUl9GSURFTElTCisJCWlmICh0LnR5cGUgPT0gT1BUX05PTkUpIHsKKwkJCXQudHlwZSA9IE5PTkU7CisJCQl0Lm5hbWUgPSAiICI7CisJCX0gZWxzZQorI2Vsc2UKKwkJdC5uYW1lID0gY3QtPm5hbWU7CisjZW5kaWYKKwkJaWYgKChuZXh0IDwgbS0+dmFsLm50ICYmIChtLT52YWwudFt6ID0gbmV4dF0udHlwZSA9PSBEU0hBUlAKKwkJCXx8IG0tPnZhbC50W3ogPSBuZXh0XS50eXBlID09IERJR19EU0hBUlApKQorCQkJfHwgKChuZXh0ICsgMSkgPCBtLT52YWwubnQKKwkJCSAgICYmIHR0V0hJKG0tPnZhbC50W25leHRdLnR5cGUpCisJCQkgICAmJiAobS0+dmFsLnRbeiA9IG5leHQgKyAxXS50eXBlID09IERTSEFSUAorCQkJICAgIHx8IG0tPnZhbC50W3ogPSBuZXh0ICsgMV0udHlwZSA9PSBESUdfRFNIQVJQKSkpIHsKKwkJCW50d2RzID0gMTsKKwkJCW0tPnZhbC5hcnQgPSB6OworCQl9IGVsc2UgbnR3ZHMgPSAwOworI2VuZGlmCisJCWlmIChjdC0+dHlwZSA9PSBNQUNST0FSRykgeworCQkJeiA9IGN0LT5saW5lOwkvKiB0aGUgYXJndW1lbnQgbnVtYmVyIGlzIHRoZXJlICovCisJCQlpZiAobHR3ZHMgJiYgYXRsW3pdLm50ICE9IDAgJiYgZXRsLm50KSB7CisJCQkJaWYgKGNvbmNhdF90b2tlbihldGwudCArICgtLSBldGwubnQpLAorCQkJCQlhdGxbel0udCkpIHsKKwkJCQkJZXJyb3IobHMtPmxpbmUsICJvcGVyYXRvciAnIyMnICIKKwkJCQkJCSJwcm9kdWNlZCB0aGUgaW52YWxpZCB0b2tlbiAiCisJCQkJCQkiJyVzJXMnIiwKKwkJCQkJCXRva2VuX25hbWUoZXRsLnQgKyBldGwubnQpLAorCQkJCQkJdG9rZW5fbmFtZShhdGxbel0udCkpOworCQkJCQltLT5uZXN0ID0gc2F2ZV9uZXN0OworI2lmZGVmIExPV19NRU0KKwkJCQkJbS0+Y3ZhbC5ycCA9IHNhdmVfYXJ0OworI2Vsc2UKKwkJCQkJbS0+dmFsLmFydCA9IHNhdmVfYXJ0OworI2VuZGlmCisJCQkJCXJldHVybiAxOworCQkJCX0KKwkJCQlpZiAoZXRsLm50ID09IDApIGZyZWVtZW0oZXRsLnQpOworCQkJCWVsc2UgaWYgKCF0dFdISShldGwudFtldGwubnQgLSAxXS50eXBlKSkgeworCQkJCQl0LnR5cGUgPSBPUFRfTk9ORTsKKwkJCQkJdC5saW5lID0gbHMtPmxpbmU7CisJCQkJCWFvbChldGwudCwgZXRsLm50LCB0LCBUT0tFTl9MSVNUX01FTUcpOworCQkJCX0KKwkJCQl0LnR5cGUgPSBkc2hhcnBfbGV4ZXIuY3Rvay0+dHlwZTsKKwkJCQl0LmxpbmUgPSBscy0+bGluZTsKKwkJCQlpZiAoU19UT0tFTih0LnR5cGUpKSB7CisJCQkJCXQubmFtZSA9IHNkdXAoZHNoYXJwX2xleGVyLmN0b2stPm5hbWUpOworCQkJCQl0aHJvd19hd2F5KGxzLT5nZiwgdC5uYW1lKTsKKwkJCQl9CisJCQkJWkFQX0xJTkUodCk7CisJCQkJYW9sKGV0bC50LCBldGwubnQsIHQsIFRPS0VOX0xJU1RfTUVNRyk7CisJCQkJYXRsW3pdLmFydCA9IDE7CisJCQl9IGVsc2UgYXRsW3pdLmFydCA9IDA7CisJCQlpZiAoYXRsW3pdLmFydCA8IGF0bFt6XS5udCAmJiAoIWV0bC5udAorCQkJCXx8ICF0dFdISShldGwudFtldGwubnQgLSAxXS50eXBlKSkpIHsKKwkJCQl0LnR5cGUgPSBPUFRfTk9ORTsKKwkJCQl0LmxpbmUgPSBscy0+bGluZTsKKwkJCQlhb2woZXRsLnQsIGV0bC5udCwgdCwgVE9LRU5fTElTVF9NRU1HKTsKKwkJCX0KKwkJCWlmIChsdHdkcyB8fCBudHdkcykgeworCQkJCXdoaWxlIChhdGxbel0uYXJ0IDwgYXRsW3pdLm50KSB7CisJCQkJCXQgPSBhdGxbel0udFthdGxbel0uYXJ0ICsrXTsKKwkJCQkJdC5saW5lID0gbHMtPmxpbmU7CisJCQkJCVpBUF9MSU5FKHQpOworCQkJCQlhb2woZXRsLnQsIGV0bC5udCwgdCwgVE9LRU5fTElTVF9NRU1HKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN0cnVjdCB0b2tlbl9maWZvICpzYXZlX3RmOworCQkJCXVuc2lnbmVkIGxvbmcgc2F2ZV9mbGFnczsKKwkJCQlpbnQgcmV0ID0gMDsKKworCQkJCWF0bFt6XS5hcnQgPSAwOworCQkJCXNhdmVfdGYgPSBscy0+b3V0cHV0X2ZpZm87CisJCQkJbHMtPm91dHB1dF9maWZvID0gJmV0bDsKKwkJCQlzYXZlX2ZsYWdzID0gbHMtPmZsYWdzOworCQkJCWxzLT5mbGFncyB8PSBMRVhFUjsKKwkJCQl3aGlsZSAoYXRsW3pdLmFydCA8IGF0bFt6XS5udCkgeworCQkJCQlzdHJ1Y3QgbWFjcm8gKm5tOworCQkJCQlzdHJ1Y3QgdG9rZW4gKmNjdDsKKworCQkJCQljY3QgPSBhdGxbel0udCArIChhdGxbel0uYXJ0ICsrKTsKKwkJCQkJaWYgKGNjdC0+dHlwZSA9PSBOQU1FCisJCQkJCQkmJiBjY3QtPmxpbmUgPj0gMAorCQkJCQkJJiYgKG5tID0gZ2V0SFQobWFjcm9zLAorCQkJCQkJICAgICYoY2N0LT5uYW1lKSkpCisJCQkJCQkmJiBubS0+bmVzdCA8PQorCQkJCQkJICAgIChyZWplY3RfbmVzdGVkICsgMSkpIHsKKwkJCQkJCXJldCB8PSBzdWJzdGl0dXRlX21hY3JvKGxzLAorCQkJCQkJCW5tLCBhdGwgKyB6LCAwLAorCQkJCQkJCXJlamVjdF9uZXN0ZWQgKyAxLCBsKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCVpBUF9MSU5FKHQpOworCQkJCQlhb2woZXRsLnQsIGV0bC5udCwgKmNjdCwKKwkJCQkJCVRPS0VOX0xJU1RfTUVNRyk7CisJCQkJfQorCQkJCWxzLT5vdXRwdXRfZmlmbyA9IHNhdmVfdGY7CisJCQkJbHMtPmZsYWdzID0gc2F2ZV9mbGFnczsKKwkJCQlpZiAocmV0KSB7CisJCQkJCW0tPm5lc3QgPSBzYXZlX25lc3Q7CisjaWZkZWYgTE9XX01FTQorCQkJCQltLT5jdmFsLnJwID0gc2F2ZV9hcnQ7CisjZWxzZQorCQkJCQltLT52YWwuYXJ0ID0gc2F2ZV9hcnQ7CisjZW5kaWYKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisJCQl9CisJCQlpZiAoIW50d2RzICYmICghZXRsLm50CisJCQkJfHwgIXR0V0hJKGV0bC50W2V0bC5udCAtIDFdLnR5cGUpKSkgeworCQkJCXQudHlwZSA9IE9QVF9OT05FOworCQkJCXQubGluZSA9IGxzLT5saW5lOworCQkJCWFvbChldGwudCwgZXRsLm50LCB0LCBUT0tFTl9MSVNUX01FTUcpOworCQkJfQorCQkJbHR3ZHMgPSAwOworCQkJY29udGludWU7CisJCX0KKwkJLyoKKwkJICogVGhpcyBjb2RlIGlzIGRlZmluaXRlbHkgY3Vyc2VkLgorCQkgKgorCQkgKiBGb3IgdGhlIGV4dHJlbWVseSBicmF2ZSByZWFkZXIgd2hvIHRyaWVzIHRvIHVuZGVyc3RhbmQKKwkJICogd2hhdCBpcyBoYXBwZW5pbmc6IGx0d2RzIGlzIGEgZmxhZyBtZWFuaW5nICJsYXN0IHRva2VuCisJCSAqIHdhcyBkb3VibGUtc2hhcnAiIGFuZCBudHdkcyBtZWFucyAibmV4dCB0b2tlbiB3aWxsIGJlCisJCSAqIGRvdWJsZS1zaGFyIi4gVGhlIHRva2VucyBhcmUgZnJvbSB0aGUgbWFjcm8gZGVmaW5pdGlvbiwKKwkJICogYW5kIHNjYW5uZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LiBBcmd1bWVudHMgdGhhdCBhcmUKKwkJICogbm90IGltcGxpZWQgaW50byBhICMvIyMgY29uc3RydWN0aW9uIGFyZSBtYWNyby1leHBhbmRlZAorCQkgKiBzZXBlcmF0ZWx5LCB0aGVuIGluY2x1ZGVkIGludG8gdGhlIHRva2VuIHN0cmVhbS4KKwkJICovCisJCWlmIChjdC0+dHlwZSA9PSBEU0hBUlAgfHwgY3QtPnR5cGUgPT0gRElHX0RTSEFSUCkgeworCQkJaWYgKGx0d2RzKSB7CisJCQkJZXJyb3IobHMtPmxpbmUsICJxdWFkIHNoYXJwIik7CisJCQkJbS0+bmVzdCA9IHNhdmVfbmVzdDsKKyNpZmRlZiBMT1dfTUVNCisJCQkJbS0+Y3ZhbC5ycCA9IHNhdmVfYXJ0OworI2Vsc2UKKwkJCQltLT52YWwuYXJ0ID0gc2F2ZV9hcnQ7CisjZW5kaWYKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKyNpZmRlZiBMT1dfTUVNCisJCQlpZiAobS0+Y3ZhbC5ycCA8IG0tPmN2YWwubGVuZ3RoCisJCQkJJiYgdHRNV1MobS0+Y3ZhbC50W20tPmN2YWwucnBdKSkKKwkJCQkJbS0+Y3ZhbC5ycCArKzsKKyNlbHNlCisJCQlpZiAobS0+dmFsLmFydCA8IG0tPnZhbC5udAorCQkJCSYmIHR0TVdTKG0tPnZhbC50W20tPnZhbC5hcnRdLnR5cGUpKQorCQkJCQltLT52YWwuYXJ0ICsrOworI2VuZGlmCisJCQlsdHdkcyA9IDE7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChsdHdkcyAmJiBldGwubnQgIT0gMCkgeworCQkJaWYgKGNvbmNhdF90b2tlbihldGwudCArICgtLSBldGwubnQpLCBjdCkpIHsKKwkJCQllcnJvcihscy0+bGluZSwgIm9wZXJhdG9yICcjIycgcHJvZHVjZWQgIgorCQkJCQkidGhlIGludmFsaWQgdG9rZW4gJyVzJXMnIiwKKwkJCQkJdG9rZW5fbmFtZShldGwudCArIGV0bC5udCksCisJCQkJCXRva2VuX25hbWUoY3QpKTsKKwkJCQltLT5uZXN0ID0gc2F2ZV9uZXN0OworI2lmZGVmIExPV19NRU0KKwkJCQltLT5jdmFsLnJwID0gc2F2ZV9hcnQ7CisjZWxzZQorCQkJCW0tPnZhbC5hcnQgPSBzYXZlX2FydDsKKyNlbmRpZgorCQkJCXJldHVybiAxOworCQkJfQorCQkJaWYgKGV0bC5udCA9PSAwKSBmcmVlbWVtKGV0bC50KTsKKwkJCXQudHlwZSA9IGRzaGFycF9sZXhlci5jdG9rLT50eXBlOworCQkJdC5saW5lID0gbHMtPmxpbmU7CisJCQlpZiAoU19UT0tFTih0LnR5cGUpKSB7CisJCQkJdC5uYW1lID0gc2R1cChkc2hhcnBfbGV4ZXIuY3Rvay0+bmFtZSk7CisJCQkJdGhyb3dfYXdheShscy0+Z2YsIHQubmFtZSk7CisJCQl9CisJCQljdCA9ICZ0OworCQl9CisJCWx0d2RzID0gMDsKKyNpZmRlZiBMT1dfTUVNCisJCWlmICgoY3QtPnR5cGUgPT0gU0hBUlAgfHwgY3QtPnR5cGUgPT0gRElHX1NIQVJQKQorCQkJJiYgbmV4dCA8IG0tPmN2YWwubGVuZ3RoCisJCQkmJiAobS0+Y3ZhbC50W25leHRdID09IE1BQ1JPQVJHCisJCQl8fCAodHRNV1MobS0+Y3ZhbC50W25leHRdKQorCQkJJiYgKG5leHQgKyAxKSA8IG0tPmN2YWwubGVuZ3RoCisJCQkmJiBtLT5jdmFsLnRbbmV4dCArIDFdID09IE1BQ1JPQVJHKSkpIHsKKyNlbHNlCisJCWlmICgoY3QtPnR5cGUgPT0gU0hBUlAgfHwgY3QtPnR5cGUgPT0gRElHX1NIQVJQKQorCQkJJiYgbmV4dCA8IG0tPnZhbC5udAorCQkJJiYgKG0tPnZhbC50W25leHRdLnR5cGUgPT0gTUFDUk9BUkcKKwkJCXx8ICh0dE1XUyhtLT52YWwudFtuZXh0XS50eXBlKQorCQkJJiYgKG5leHQgKyAxKSA8IG0tPnZhbC5udAorCQkJJiYgbS0+dmFsLnRbbmV4dCArIDFdLnR5cGUgPT0gTUFDUk9BUkcpKSkgeworI2VuZGlmCisJCQkvKgorCQkJICogV2UgaGF2ZSBhICMgb3BlcmF0b3IgZm9sbG93ZWQgYnkgKGFuIG9wdGlvbmFsCisJCQkgKiB3aGl0ZXNwYWNlIGFuZCkgYSBtYWNybyBhcmd1bWVudDsgdGhpcyBtZWFucworCQkJICogc3RyaW5naWZpY2F0aW9uLiBTbyBiZSBpdC4KKwkJCSAqLworI2lmZGVmIExPV19NRU0KKwkJCWlmICh0dE1XUyhtLT5jdmFsLnRbbmV4dF0pKSBtLT5jdmFsLnJwICsrOworI2Vsc2UKKwkJCWlmICh0dE1XUyhtLT52YWwudFtuZXh0XS50eXBlKSkgbS0+dmFsLmFydCArKzsKKyNlbmRpZgorCQkJdC50eXBlID0gU1RSSU5HOworI2lmZGVmIExPV19NRU0KKwkJCW0tPmN2YWwucnAgKys7CisJCQl0Lm5hbWUgPSBzdHJpbmdpZnkoYXRsICsKKwkJCQkoc2l6ZV90KShtLT5jdmFsLnRbbS0+Y3ZhbC5ycCArK10pKTsKKyNlbHNlCisJCQl0Lm5hbWUgPSBzdHJpbmdpZnkoYXRsICsKKwkJCQkoc2l6ZV90KShtLT52YWwudFttLT52YWwuYXJ0ICsrXS5saW5lKSk7CisjZW5kaWYKKwkJCXRocm93X2F3YXkobHMtPmdmLCB0Lm5hbWUpOworCQkJY3QgPSAmdDsKKwkJCS8qCisJCQkgKiBUaGVyZSBpcyBubyBuZWVkIGZvciBleHRyYSBzcGFjZXMgaGVyZS4KKwkJCSAqLworCQl9CisJCXQgPSAqY3Q7CisJCVpBUF9MSU5FKHQpOworCQlhb2woZXRsLnQsIGV0bC5udCwgdCwgVE9LRU5fTElTVF9NRU1HKTsKKwl9CisjaWZkZWYgTE9XX01FTQorCW0tPmN2YWwucnAgPSBzYXZlX2FydDsKKyNlbHNlCisJbS0+dmFsLmFydCA9IHNhdmVfYXJ0OworI2VuZGlmCisKKworCS8qCisJICogTm93IGV0bCBjb250YWlucyB0aGUgZXhwYW5kZWQgbWFjcm8sIHRvIGJlIHBhcnNlZCBhZ2FpbiBmb3IKKwkgKiBmdXJ0aGVyIGV4cGFuc2lvbnMgLS0gbXVjaCBlYXNpZXIsIHNpbmNlICcjJyBhbmQgJyMjJyBoYXZlCisJICogYWxyZWFkeSBiZWVuIGhhbmRsZWQuCisJICogSG93ZXZlciwgd2UgbWlnaHQgbmVlZCBzb21lIGlucHV0IGZyb20gdGZpLiBTbywgd2UgcGFzdGUKKwkgKiB0aGUgY29udGVudHMgb2YgdGZpIGFmdGVyIGV0bCwgYW5kIHdlIHB1dCBiYWNrIHdoYXQgd2FzCisJICogbm90IHVzZWQuCisJICoKKwkgKiBTb21lIGFkamFjZW50IHNwYWNlcyBhcmUgbWVyZ2VkOyBvbmx5IHVuaXF1ZSBOT05FLCBvciBzZXF1ZW5jZXMKKwkgKiBPUFRfTk9ORSBOT05FIGFyZSBlbWl0dGVkLgorCSAqLworCWV0bF9saW1pdCA9IGV0bC5udDsKKwlpZiAodGZpKSB7CisJCXNhdmVfdGZpID0gdGZpLT5hcnQ7CisJCXdoaWxlICh0ZmktPmFydCA8IHRmaS0+bnQpIGFvbChldGwudCwgZXRsLm50LAorCQkJdGZpLT50W3RmaS0+YXJ0ICsrXSwgVE9LRU5fTElTVF9NRU1HKTsKKwl9CisJbHR3d3MgPSAwOworCXdoaWxlIChldGwuYXJ0IDwgZXRsX2xpbWl0KSB7CisJCXN0cnVjdCBtYWNybyAqbm07CisKKwkJY3QgPSBldGwudCArIChldGwuYXJ0ICsrKTsKKwkJaWYgKGN0LT50eXBlID09IE5BTUUgJiYgY3QtPmxpbmUgPj0gMAorCQkJJiYgKG5tID0gZ2V0SFQobWFjcm9zLCAmKGN0LT5uYW1lKSkpKSB7CisJCQlpZiAoc3Vic3RpdHV0ZV9tYWNybyhscywgbm0sICZldGwsCisJCQkJcGVudXJ5LCByZWplY3RfbmVzdGVkLCBsKSkgeworCQkJCW0tPm5lc3QgPSBzYXZlX25lc3Q7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlsdHd3cyA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAodHRNV1MoY3QtPnR5cGUpKSB7CisJCQlpZiAobHR3d3MgPT0gMSkgeworCQkJCWlmIChjdC0+dHlwZSA9PSBPUFRfTk9ORSkgY29udGludWU7CisJCQkJbHR3d3MgPSAyOworCQkJfSBlbHNlIGlmIChsdHd3cyA9PSAyKSBjb250aW51ZTsKKwkJCWVsc2UgaWYgKGN0LT50eXBlID09IE9QVF9OT05FKSBsdHd3cyA9IDE7CisJCQllbHNlIGx0d3dzID0gMjsKKwkJfSBlbHNlIGx0d3dzID0gMDsKKwkJaWYgKGN0LT5saW5lID49IDApIGN0LT5saW5lID0gbDsKKwkJcHJpbnRfdG9rZW4obHMsIGN0LCByZWplY3RfbmVzdGVkID8gMCA6IGwpOworCX0KKwlpZiAoZXRsLm50KSBmcmVlbWVtKGV0bC50KTsKKwlpZiAodGZpKSB7CisJCXRmaS0+YXJ0ID0gc2F2ZV90ZmkgKyAoZXRsLmFydCAtIGV0bF9saW1pdCk7CisJfQorCitleGl0X21hY3JvXzE6CisJcHJpbnRfc3BhY2UobHMpOworZXhpdF9tYWNyb18yOgorCWZvciAoaSA9IDA7IGkgPCBtLT5uYXJnOyBpICsrKSBpZiAoYXRsW2ldLm50KSBmcmVlbWVtKGF0bFtpXS50KTsKKwlpZiAobS0+bmFyZyA+IDApIGZyZWVtZW0oYXRsKTsKKwltLT5uZXN0ID0gc2F2ZV9uZXN0OworCXJldHVybiAwOworfQorCisvKgorICogcHJpbnQgYWxyZWFkeSBkZWZpbmVkIG1hY3JvcworICovCit2b2lkIHByaW50X2RlZmluZXModm9pZCkKK3sKKwlzY2FuSFQobWFjcm9zLCBwcmludF9tYWNybyk7Cit9CisKKy8qCisgKiBkZWZpbmVfbWFjcm8oKSBkZWZpbmVzIGEgbmV3IG1hY3JvLCB3aG9tIGRlZmluaXRpb24gaXMgZ2l2ZW4gaW4KKyAqIHRoZSBjb21tYW5kLWxpbmUgc3ludGF4OiBtYWNybz1kZWYKKyAqIFRoZSAnPWRlZicgcGFydCBpcyBvcHRpb25hbC4KKyAqCisgKiBJdCByZXR1cm5zIG5vbi16ZXJvIG9uIGVycm9yLgorICovCitpbnQgZGVmaW5lX21hY3JvKHN0cnVjdCBsZXhlcl9zdGF0ZSAqbHMsIGNoYXIgKmRlZikKK3sKKwljaGFyICpjID0gc2R1cChkZWYpLCAqZDsKKwlpbnQgd2l0aF9kZWYgPSAwOworCWludCByZXQgPSAwOworCisJZm9yIChkID0gYzsgKmQgJiYgKmQgIT0gJz0nOyBkICsrKTsKKwlpZiAoKmQpIHsKKwkJKmQgPSAnICc7CisJCXdpdGhfZGVmID0gMTsKKwl9CisJaWYgKHdpdGhfZGVmKSB7CisJCXN0cnVjdCBsZXhlcl9zdGF0ZSBsbHM7CisJCXNpemVfdCBuID0gc3RybGVuKGMpICsgMTsKKworCQlpZiAoYyA9PSBkKSB7CisJCQllcnJvcigtMSwgInZvaWQgbWFjcm8gbmFtZSIpOworCQkJcmV0ID0gMTsKKwkJfSBlbHNlIHsKKwkJCSooYyArIG4gLSAxKSA9ICdcbic7CisJCQlpbml0X2J1Zl9sZXhlcl9zdGF0ZSgmbGxzLCAwKTsKKwkJCWxscy5mbGFncyA9IGxzLT5mbGFncyB8IExFWEVSOworCQkJbGxzLmlucHV0ID0gMDsKKwkJCWxscy5pbnB1dF9zdHJpbmcgPSAodW5zaWduZWQgY2hhciAqKWM7CisJCQlsbHMucGJ1ZiA9IDA7CisJCQlsbHMuZWJ1ZiA9IG47CisJCQlsbHMubGluZSA9IC0xOworCQkJcmV0ID0gaGFuZGxlX2RlZmluZSgmbGxzKTsKKwkJCWZyZWVfbGV4ZXJfc3RhdGUoJmxscyk7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3QgbWFjcm8gKm07CisKKwkJaWYgKCEqYykgeworCQkJZXJyb3IoLTEsICJ2b2lkIG1hY3JvIG5hbWUiKTsKKwkJCXJldCA9IDE7CisJCX0gZWxzZSBpZiAoKG0gPSBnZXRIVChtYWNyb3MsICZjKSkKKyNpZmRlZiBMT1dfTUVNCisJCQkmJiAobS0+Y3ZhbC5sZW5ndGggIT0gMworCQkJfHwgbS0+Y3ZhbC50WzBdICE9IE5VTUJFUgorCQkJfHwgc3RyY21wKChjaGFyICopKG0tPmN2YWwudCArIDEpLCAiMSIpKSkgeworI2Vsc2UKKwkJCSYmIChtLT52YWwubnQgIT0gMQorCQkJfHwgbS0+dmFsLnRbMF0udHlwZSAhPSBOVU1CRVIKKwkJCXx8IHN0cmNtcChtLT52YWwudFswXS5uYW1lLCAiMSIpKSkgeworI2VuZGlmCisJCQllcnJvcigtMSwgIm1hY3JvICVzIGFscmVhZHkgZGVmaW5lZCIsIGMpOworCQkJcmV0ID0gMTsKKwkJfSBlbHNlIHsKKyNpZm5kZWYgTE9XX01FTQorCQkJc3RydWN0IHRva2VuIHQ7CisjZW5kaWYKKworCQkJbSA9IG5ld19tYWNybygpOworCQkJbS0+bmFtZSA9IHNkdXAoYyk7CisjaWZkZWYgTE9XX01FTQorCQkJbS0+Y3ZhbC5sZW5ndGggPSAzOworCQkJbS0+Y3ZhbC50ID0gZ2V0bWVtKDMpOworCQkJbS0+Y3ZhbC50WzBdID0gTlVNQkVSOworCQkJbS0+Y3ZhbC50WzFdID0gJzEnOworCQkJbS0+Y3ZhbC50WzJdID0gMDsKKyNlbHNlCisJCQl0LnR5cGUgPSBOVU1CRVI7CisJCQl0Lm5hbWUgPSBzZHVwKCIxIik7CisJCQlhb2wobS0+dmFsLnQsIG0tPnZhbC5udCwgdCwgVE9LRU5fTElTVF9NRU1HKTsKKyNlbmRpZgorCQkJcHV0SFQobWFjcm9zLCBtKTsKKwkJfQorCX0KKwlmcmVlbWVtKGMpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB1bmRlZl9tYWNybygpIHVuZGVmaW5lcyB0aGUgbWFjcm8gd2hvbSBuYW1lIGlzIGdpdmVuIGFzICJkZWYiOworICogaXQgaXMgbm90IGFuIGVycm9yIHRvIHRyeSB0byB1bmRlZiBhIG1hY3JvIHRoYXQgZG9lcyBub3QgZXhpc3QuCisgKgorICogSXQgcmV0dXJucyBub24temVybyBvbiBlcnJvciAodW5kZWZpbml0aW9uIG9mIGEgc3BlY2lhbCBtYWNybywKKyAqIHZvaWQgbWFjcm8gbmFtZSkuCisgKi8KK2ludCB1bmRlZl9tYWNybyhzdHJ1Y3QgbGV4ZXJfc3RhdGUgKmxzLCBjaGFyICpkZWYpCit7CisJY2hhciAqYyA9IGRlZjsKKworCWlmICghKmMpIHsKKwkJZXJyb3IoLTEsICJ2b2lkIG1hY3JvIG5hbWUiKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChnZXRIVChtYWNyb3MsICZjKSkgeworCQlpZiAoY2hlY2tfc3BlY2lhbF9tYWNybyhjKSkgeworCQkJZXJyb3IoLTEsICJ0cnlpbmcgdG8gdW5kZWYgc3BlY2lhbCBtYWNybyAlcyIsIGMpOworCQkJcmV0dXJuIDE7CisJCX0gZWxzZSBkZWxIVChtYWNyb3MsICZjKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXZSBzYXcgYSAjaWZkZWYgZGlyZWN0aXZlLiBQYXJzZSB0aGUgbGluZS4KKyAqIHJldHVybiB2YWx1ZTogMSBpZiB0aGUgbWFjcm8gaXMgZGVmaW5lZCwgMCBpZiBpdCBpcyBub3QsIC0xIG9uIGVycm9yCisgKi8KK2ludCBoYW5kbGVfaWZkZWYoc3RydWN0IGxleGVyX3N0YXRlICpscykKK3sKKwl3aGlsZSAoIW5leHRfdG9rZW4obHMpKSB7CisJCWludCB0Z2QgPSAxOworCisJCWlmIChscy0+Y3Rvay0+dHlwZSA9PSBORVdMSU5FKSBicmVhazsKKwkJaWYgKHR0TVdTKGxzLT5jdG9rLT50eXBlKSkgY29udGludWU7CisJCWlmIChscy0+Y3Rvay0+dHlwZSA9PSBOQU1FKSB7CisJCQlpbnQgeCA9IChnZXRIVChtYWNyb3MsICYobHMtPmN0b2stPm5hbWUpKSAhPSAwKTsKKwkJCXdoaWxlICghbmV4dF90b2tlbihscykgJiYgbHMtPmN0b2stPnR5cGUgIT0gTkVXTElORSkKKwkJCQlpZiAodGdkICYmICF0dFdISShscy0+Y3Rvay0+dHlwZSkKKwkJCQkJJiYgKGxzLT5mbGFncyAmIFdBUk5fU1RBTkRBUkQpKSB7CisJCQkJCXdhcm5pbmcobHMtPmxpbmUsICJ0cmFpbGluZyBnYXJiYWdlICIKKwkJCQkJCSJpbiAjaWZkZWYiKTsKKwkJCQkJdGdkID0gMDsKKwkJCQl9CisJCQlyZXR1cm4geDsKKwkJfQorCQllcnJvcihscy0+bGluZSwgImlsbGVnYWwgbWFjcm8gbmFtZSBmb3IgI2lmZGVmIik7CisJCXdoaWxlICghbmV4dF90b2tlbihscykgJiYgbHMtPmN0b2stPnR5cGUgIT0gTkVXTElORSkKKwkJCWlmICh0Z2QgJiYgIXR0V0hJKGxzLT5jdG9rLT50eXBlKQorCQkJCSYmIChscy0+ZmxhZ3MgJiBXQVJOX1NUQU5EQVJEKSkgeworCQkJCXdhcm5pbmcobHMtPmxpbmUsICJ0cmFpbGluZyBnYXJiYWdlIGluICIKKwkJCQkJIiNpZmRlZiIpOworCQkJCXRnZCA9IDA7CisJCQl9CisJCXJldHVybiAtMTsKKwl9CisJZXJyb3IobHMtPmxpbmUsICJ1bmZpbmlzaGVkICNpZmRlZiIpOworCXJldHVybiAtMTsKK30KKworLyoKKyAqIGZvciAjdW5kZWYKKyAqIHJldHVybiB2YWx1ZTogMSBvbiBlcnJvciwgMCBvbiBzdWNjZXNzLiBVbmRlZmluaW5nIGEgbWFjcm8gdGhhdCB3YXMKKyAqIGFscmVhZHkgbm90IGRlZmluZWQgaXMgbm90IGFuIGVycm9yLgorICovCitpbnQgaGFuZGxlX3VuZGVmKHN0cnVjdCBsZXhlcl9zdGF0ZSAqbHMpCit7CisgIC8qdmIqLworI2lmZGVmIEhBVkVfTUlTUkEKKyAgaWYobmVzdGluZyE9MCkgbWlzcmFfbmV1KDkxLDE5LDUsMCk7CisgIG1pc3JhX25ldSg5MiwxOSw2LDApOworI2VuZGlmCisKKwl3aGlsZSAoIW5leHRfdG9rZW4obHMpKSB7CisJCWlmIChscy0+Y3Rvay0+dHlwZSA9PSBORVdMSU5FKSBicmVhazsKKwkJaWYgKHR0TVdTKGxzLT5jdG9rLT50eXBlKSkgY29udGludWU7CisJCWlmIChscy0+Y3Rvay0+dHlwZSA9PSBOQU1FKSB7CisJCQlzdHJ1Y3QgbWFjcm8gKm0gPSBnZXRIVChtYWNyb3MsICYobHMtPmN0b2stPm5hbWUpKTsKKwkJCWludCB0Z2QgPSAxOworCisJCQlpZiAobSAhPSAwKSB7CisJCQkJaWYgKGNoZWNrX3NwZWNpYWxfbWFjcm8obHMtPmN0b2stPm5hbWUpKSB7CisJCQkJCWVycm9yKGxzLT5saW5lLCAidHJ5aW5nIHRvIHVuZGVmICIKKwkJCQkJCSJzcGVjaWFsIG1hY3JvICVzIiwKKwkJCQkJCWxzLT5jdG9rLT5uYW1lKTsKKwkJCQkJZ290byB1bmRlZl9lcnJvcjsKKwkJCQl9CisJCQkJaWYgKGVtaXRfZGVmaW5lcykKKwkJCQkJZnByaW50ZihlbWl0X291dHB1dCwgIiN1bmRlZiAlc1xuIiwKKwkJCQkJCW0tPm5hbWUpOworCQkJCWRlbEhUKG1hY3JvcywgJihscy0+Y3Rvay0+bmFtZSkpOworCQkJfQorCQkJd2hpbGUgKCFuZXh0X3Rva2VuKGxzKSAmJiBscy0+Y3Rvay0+dHlwZSAhPSBORVdMSU5FKQorCQkJCWlmICh0Z2QgJiYgIXR0V0hJKGxzLT5jdG9rLT50eXBlKQorCQkJCQkmJiAobHMtPmZsYWdzICYgV0FSTl9TVEFOREFSRCkpIHsKKwkJCQkJd2FybmluZyhscy0+bGluZSwgInRyYWlsaW5nIGdhcmJhZ2UgIgorCQkJCQkJImluICN1bmRlZiIpOworCQkJCQl0Z2QgPSAwOworCQkJCX0KKwkJCXJldHVybiAwOworCQl9CisJCWVycm9yKGxzLT5saW5lLCAiaWxsZWdhbCBtYWNybyBuYW1lIGZvciAjdW5kZWYiKTsKKwl1bmRlZl9lcnJvcjoKKwkJd2hpbGUgKCFuZXh0X3Rva2VuKGxzKSAmJiBscy0+Y3Rvay0+dHlwZSAhPSBORVdMSU5FKTsKKwkJcmV0dXJuIDE7CisJfQorCWVycm9yKGxzLT5saW5lLCAidW5maW5pc2hlZCAjdW5kZWYiKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIGZvciAjaWZuZGVmCisgKiByZXR1cm4gdmFsdWU6IDAgaWYgdGhlIG1hY3JvIGlzIGRlZmluZWQsIDEgaWYgaXQgaXMgbm90LCAtMSBvbiBlcnJvci4KKyAqLworaW50IGhhbmRsZV9pZm5kZWYoc3RydWN0IGxleGVyX3N0YXRlICpscykKK3sKKwl3aGlsZSAoIW5leHRfdG9rZW4obHMpKSB7CisJCWludCB0Z2QgPSAxOworCisJCWlmIChscy0+Y3Rvay0+dHlwZSA9PSBORVdMSU5FKSBicmVhazsKKwkJaWYgKHR0TVdTKGxzLT5jdG9rLT50eXBlKSkgY29udGludWU7CisJCWlmIChscy0+Y3Rvay0+dHlwZSA9PSBOQU1FKSB7CisJCQlpbnQgeCA9IChnZXRIVChtYWNyb3MsICYobHMtPmN0b2stPm5hbWUpKSA9PSAwKTsKKworCQkJd2hpbGUgKCFuZXh0X3Rva2VuKGxzKSAmJiBscy0+Y3Rvay0+dHlwZSAhPSBORVdMSU5FKQorCQkJCWlmICh0Z2QgJiYgIXR0V0hJKGxzLT5jdG9rLT50eXBlKQorCQkJCQkmJiAobHMtPmZsYWdzICYgV0FSTl9TVEFOREFSRCkpIHsKKwkJCQkJd2FybmluZyhscy0+bGluZSwgInRyYWlsaW5nIGdhcmJhZ2UgIgorCQkJCQkJImluICNpZm5kZWYiKTsKKwkJCQkJdGdkID0gMDsKKwkJCQl9CisJCQlpZiAocHJvdGVjdF9kZXRlY3Quc3RhdGUgPT0gMSkgeworCQkJCXByb3RlY3RfZGV0ZWN0LnN0YXRlID0gMjsKKwkJCQlwcm90ZWN0X2RldGVjdC5tYWNybyA9IHNkdXAobHMtPmN0b2stPm5hbWUpOworCQkJfQorCQkJcmV0dXJuIHg7CisJCX0KKwkJZXJyb3IobHMtPmxpbmUsICJpbGxlZ2FsIG1hY3JvIG5hbWUgZm9yICNpZm5kZWYiKTsKKwkJd2hpbGUgKCFuZXh0X3Rva2VuKGxzKSAmJiBscy0+Y3Rvay0+dHlwZSAhPSBORVdMSU5FKQorCQkJaWYgKHRnZCAmJiAhdHRXSEkobHMtPmN0b2stPnR5cGUpCisJCQkJJiYgKGxzLT5mbGFncyAmIFdBUk5fU1RBTkRBUkQpKSB7CisJCQkJd2FybmluZyhscy0+bGluZSwgInRyYWlsaW5nIGdhcmJhZ2UgaW4gIgorCQkJCQkiI2lmbmRlZiIpOworCQkJCXRnZCA9IDA7CisJCQl9CisJCXJldHVybiAtMTsKKwl9CisJZXJyb3IobHMtPmxpbmUsICJ1bmZpbmlzaGVkICNpZm5kZWYiKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBpbml0aWFsaXplIHRoZSBtYWNybyB0YWJsZQorICovCit2b2lkIGluaXRfbWFjcm9zKHZvaWQpCit7CisJaWYgKG1hY3Jvcykga2lsbEhUKG1hY3Jvcyk7CisJbWFjcm9zID0gbmV3SFQoMTI4LCBjbXBfc3RydWN0LCBoYXNoX3N0cnVjdCwgZGVsX21hY3JvKTsKKwlpZiAoIW5vX3NwZWNpYWxfbWFjcm9zKSBhZGRfc3BlY2lhbF9tYWNyb3MoKTsKK30KKworLyoKKyAqIGZpbmQgYSBtYWNybyBmcm9tIGl0cyBuYW1lCisgKi8KK3N0cnVjdCBtYWNybyAqZ2V0X21hY3JvKGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIGdldEhUKG1hY3JvcywgJm5hbWUpOworfQpkaWZmIC0tZ2l0IGEvdWNwcC9tZW0uYyBiL3VjcHAvbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGI2MjFkNQotLS0gL2Rldi9udWxsCisrKyBiL3VjcHAvbWVtLmMKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBNZW1vcnkgbWFuaXB1bGF0aW9uIHJvdXRpbmVzCisgKiAoYykgVGhvbWFzIFBvcm5pbiAxOTk4LCAxOTk5LCAyMDAwCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIAorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSAKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsCisgKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIEFVRElUCit2b2lkIGRpZSh2b2lkKQoreworCWFib3J0KCk7Cit9CisKK3N0YXRpYyB2b2lkIHN1aWNpZGUodW5zaWduZWQgbG9uZyBlKQoreworCWZwcmludGYoc3RkZXJyLCAib3VjaDogU2Nocm9kaW5nZXIncyBiZWVmIGlzIG5vdCBkZWFkICEgJWx4XG4iLCBlKTsKKwlkaWUoKTsKK30KKyNlbHNlCit2b2lkIGRpZSh2b2lkKQoreworCWV4aXQoMSk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQgQVVESVQgfHwgZGVmaW5lZCBNRU1fQ0hFQ0sKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYSBtYWxsb2MoKSwgYnV0IHdpbGwgZGlzcGxheSBhbiBlcnJvcgorICogbWVzc2FnZSBhbmQgZXhpdCBpZiB0aGUgd2FudGVkIG1lbW9yeSBpcyBub3QgYXZhaWxhYmxlCisgKi8KK3ZvaWQgKmdldG1lbShzaXplX3QgeCkKK3sKKwl2b2lkICptOworCisjaWZkZWYgQVVESVQKKwltID0gbWFsbG9jKHggKyA4KTsKKyNlbHNlCisJbSA9IG1hbGxvYyh4KTsKKyNlbmRpZgorCWlmIChtID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJvdWNoOiBtYWxsb2MoKSBmYWlsZWRcbiIpOworCQlkaWUoKTsKKwl9CisjaWZkZWYgQVVESVQKKwkqKCh1bnNpZ25lZCBsb25nICopbSkgPSAweGRlYWRiZWVmVUw7CisJcmV0dXJuICh2b2lkICopKCgoY2hhciAqKW0pICsgOCk7CisjZWxzZQorCXJldHVybiBtOworI2VuZGlmCit9CisjZW5kaWYKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBhIHJlYWxsb2MoKTsgaWYgdGhlIHJlYWxsb2MoKSBjYWxsCisgKiBmYWlscywgaXQgd2lsbCB0cnkgYSBtYWxsb2MoKSBhbmQgYSBtZW1jcHkoKS4gSWYgbm90IGVub3VnaCBtZW1vcnkgaXMKKyAqIGF2YWlsYWJsZSwgdGhlIHByb2dyYW0gZXhpdHMgd2l0aCBhbiBlcnJvciBtZXNzYWdlCisgKi8KK3ZvaWQgKmluY21lbSh2b2lkICptLCBzaXplX3QgeCwgc2l6ZV90IG54KQoreworCXZvaWQgKm5tOworCisjaWZkZWYgQVVESVQKKwltID0gKHZvaWQgKikoKChjaGFyICopbSkgLSA4KTsKKwlpZiAoKigodW5zaWduZWQgbG9uZyAqKW0pICE9IDB4ZGVhZGJlZWZVTCkKKwkJc3VpY2lkZSgqKCh1bnNpZ25lZCBsb25nICopbSkpOworCXggKz0gODsgbnggKz0gODsKKyNlbmRpZgorCWlmICghKG5tID0gcmVhbGxvYyhtLCBueCkpKSB7CisJCWlmICh4ID4gbngpIHggPSBueDsKKwkJbm0gPSBnZXRtZW0obngpOworCQltZW1jcHkobm0sIG0sIHgpOworCQkvKiBmcmVlKCkgYW5kIG5vdCBmcmVlbWVtKCksIGJlY2F1c2Ugb2YgdGhlIFNjaHJvZGluZ2VyIGJlZWYgKi8KKwkJZnJlZShtKTsKKwl9CisjaWZkZWYgQVVESVQKKwlyZXR1cm4gKHZvaWQgKikoKChjaGFyICopbm0pICsgOCk7CisjZWxzZQorCXJldHVybiBubTsKKyNlbmRpZgorfQorCisjaWZkZWYgQVVESVQKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGZyZWVzIHRoZSBnaXZlbiBibG9jaworICovCit2b2lkIGZyZWVtZW0odm9pZCAqeCkKK3sKKyNpZmRlZiBBVURJVAorCXZvaWQgKnkgPSAodm9pZCAqKSgoKGNoYXIgKil4KSAtIDgpOworCisJaWYgKCgqKCh1bnNpZ25lZCBsb25nICopeSkpICE9IDB4ZGVhZGJlZWZVTCkKKwkJc3VpY2lkZSgqKCh1bnNpZ25lZCBsb25nICopeSkpOworCSooKHVuc2lnbmVkIGxvbmcgKil5KSA9IDB4ZmVlZGJhYmVVTDsKKwlmcmVlKHkpOworI2Vsc2UKKwlmcmVlKHgpOworI2VuZGlmCit9CisjZW5kaWYKKworI2lmZGVmIEFVRElUCisvKgorICogVGhpcyBmdW5jdGlvbiBjb3BpZXMgbiBieXRlcyBmcm9tIHNyYyB0byBkZXN0CisgKi8KK3ZvaWQgKm1tdih2b2lkICpkZXN0LCB2b2lkICpzcmMsIHNpemVfdCBuKQoreworCXJldHVybiBtZW1jcHkoZGVzdCwgc3JjLCBuKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY29waWVzIG4gYnl0ZXMgZnJvbSBzcmMgdG8gZGVzdAorICovCit2b2lkICptbXZ3byh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHNpemVfdCBuKQoreworCXJldHVybiBtZW1tb3ZlKGRlc3QsIHNyYywgbik7Cit9CisjZW5kaWYKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIG5ldyBjaGFyICogYW5kIGZpbGxzIGl0IHdpdGggYSBjb3B5IG9mIHNyYworICovCitjaGFyICpzZHVwKGNoYXIgKnNyYykKK3sKKwlzaXplX3QgbiA9IDEgKyBzdHJsZW4oc3JjKTsKKwljaGFyICp4ID0gZ2V0bWVtKG4pOworCisJbW12KHgsIHNyYywgbik7CisJcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS91Y3BwL21lbS5oIGIvdWNwcC9tZW0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZDY0NmI3Ci0tLSAvZGV2L251bGwKKysrIGIvdWNwcC9tZW0uaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIChjKSBUaG9tYXMgUG9ybmluIDE5OTgsIDE5OTksIDIwMDAKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiAKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIAorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwKKyAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgVUNQUF9fTUVNX18KKyNkZWZpbmUgVUNQUF9fTUVNX18KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCit2b2lkIGRpZSh2b2lkKTsKK3ZvaWQgKmluY21lbSh2b2lkICosIHNpemVfdCwgc2l6ZV90KTsKK2NoYXIgKnNkdXAoY2hhciAqKTsKKworI2lmIGRlZmluZWQgQVVESVQgfHwgZGVmaW5lZCBNRU1fQ0hFQ0sKK3ZvaWQgKmdldG1lbShzaXplX3QpOworI2Vsc2UKKyNkZWZpbmUgZ2V0bWVtCQltYWxsb2MKKyNlbmRpZgorCisjaWZkZWYgQVVESVQKK3ZvaWQgZnJlZW1lbSh2b2lkICopOworI2Vsc2UKKyNkZWZpbmUgZnJlZW1lbQkJZnJlZQorI2VuZGlmCisKKyNpZmRlZiBBVURJVAordm9pZCAqbW12KHZvaWQgKiwgdm9pZCAqLCBzaXplX3QpOwordm9pZCAqbW12d28odm9pZCAqLCB2b2lkICosIHNpemVfdCk7CisjZWxzZQorI2RlZmluZSBtbXYJbWVtY3B5CisjZGVmaW5lIG1tdndvCW1lbW1vdmUKKyNlbmRpZgorCisvKgorICogdGhpcyBtYWNybyBhZGRzIHRoZSBvYmplY3Qgb2JqIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5IGxpc3QsIGhhbmRsaW5nCisgKiBtZW1vcnkgYWxsb2NhdGlvbiB3aGVuIG5lZWRlZDsgcHRyIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4KKyAqIHRoZSBhcnJheSwgYW5kIG1lbWcgaXMgdGhlIGdyYW51bGFyaXR5IG9mIG1lbW9yeSBhbGxvY2F0aW9ucyAoYSBwb3dlcgorICogb2YgMiBpcyByZWNvbW1hbmRlZCwgZm9yIG9wdGltaXphdGlvbiByZWFzb25zKQorICoKKyAqIGxpc3QgYW5kIHB0ciBtYXkgYmUgdXBkYXRlZCwgYW5kIHRodXMgbmVlZCB0byBiZSBsdmFsdWVzCisgKi8KKyNkZWZpbmUgYW9sKGxpc3QscHRyLG9iaixtZW1nKSBkbyB7IFwKKwkJaWYgKCgocHRyKSAlIChtZW1nKSkgPT0gMCkgeyBcCisJCQlpZiAoKHB0cikgIT0gMCkgeyBcCisJCQkJKGxpc3QpID0gaW5jbWVtKChsaXN0KSwgKHB0cikgKiBzaXplb2Yob2JqKSwgXAorCQkJCQkoKHB0cikgKyAobWVtZykpICogc2l6ZW9mKG9iaikpOyBcCisJCQl9IGVsc2UgeyBcCisJCQkJKGxpc3QpID0gZ2V0bWVtKChtZW1nKSAqIHNpemVvZihvYmopKTsgXAorCQkJfSBcCisJCX0gXAorCQkobGlzdClbKHB0cikgKytdID0gKG9iaik7IFwKKwl9IHdoaWxlICgwKQorCisvKgorICogYm9sKCkgZG9lcyB0aGUgc2FtZSBhcyBhb2woKSwgYnV0IGFkZHMgdGhlIG5ldyBpdGVtIGF0IHRoZSBiZWdpbm5pbmcKKyAqIG9mIHRoZSBsaXN0OyBiZXdhcmUsIHRoZSBjb21wdXRhdGlvbmFsIGNvc3QgaXMgZ3JlYXRlci4KKyAqLworI2RlZmluZSBib2wobGlzdCxwdHIsb2JqLG1lbWcpIGRvIHsgXAorCQlpZiAoKChwdHIpICUgKG1lbWcpKSA9PSAwKSB7IFwKKwkJCWlmICgocHRyKSAhPSAwKSB7IFwKKwkJCQkobGlzdCkgPSBpbmNtZW0oKGxpc3QpLCAocHRyKSAqIHNpemVvZihvYmopLCBcCisJCQkJCSgocHRyKSArIChtZW1nKSkgKiBzaXplb2Yob2JqKSk7IFwKKwkJCX0gZWxzZSB7IFwKKwkJCQkobGlzdCkgPSBnZXRtZW0oKG1lbWcpICogc2l6ZW9mKG9iaikpOyBcCisJCQl9IFwKKwkJfSBcCisJCWlmICgocHRyKSAhPSAwKSBcCisJCQltbXZ3bygobGlzdCkgKyAxLCAobGlzdCksIChwdHIpICogc2l6ZW9mKG9iaikpOyBcCisJCShwdHIpICsrOyBcCisJCShsaXN0KVswXSA9IChvYmopOyBcCisJfSB3aGlsZSAoMCkKKworLyoKKyAqIG1ib2woKSBkb2VzIHRoZSBzYW1lIGFzIGJvbCgpLCBidXQgYWRkcyB0aGUgbmV3IGl0ZW0gYXQgdGhlIGdpdmVuCisgKiBlbXBsYWNlbWVudDsgYm9sKCkgaXMgZXF1aXZhbGVudCB0byBtYm9sIHdpdGggMCBhcyBsYXN0IGFyZ3VtZW50LgorICovCisjZGVmaW5lIG1ib2wobGlzdCxwdHIsb2JqLG1lbWcsbikgZG8geyBcCisJCWlmICgoKHB0cikgJSAobWVtZykpID09IDApIHsgXAorCQkJaWYgKChwdHIpICE9IDApIHsgXAorCQkJCShsaXN0KSA9IGluY21lbSgobGlzdCksIChwdHIpICogc2l6ZW9mKG9iaiksIFwKKwkJCQkJKChwdHIpICsgKG1lbWcpKSAqIHNpemVvZihvYmopKTsgXAorCQkJfSBlbHNlIHsgXAorCQkJCShsaXN0KSA9IGdldG1lbSgobWVtZykgKiBzaXplb2Yob2JqKSk7IFwKKwkJCX0gXAorCQl9IFwKKwkJaWYgKChwdHIpID4gbikgXAorCQkJbW12d28oKGxpc3QpICsgbiArIDEsIChsaXN0KSArIG4sIFwKKwkJCQkoKHB0cikgLSBuKSAqIHNpemVvZihvYmopKTsgXAorCQkocHRyKSArKzsgXAorCQkobGlzdClbbl0gPSAob2JqKTsgXAorCX0gd2hpbGUgKDApCisKKy8qCisgKiB0aGlzIG1hY3JvIGFkZHMgdGhlIG9iamVjdCBvYmogYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXkgbGlzdCwgZG91YmxpbmcKKyAqIHRoZSBzaXplIG9mIGxpc3Qgd2hlbiBuZWVkZWQ7IGFzIGZvciBhb2woKSwgcHRyIGFuZCBsaXN0IG11c3QgYmUKKyAqIGx2YWx1ZXMsIGFuZCBzbyBtdXN0IGJlIGxsbmcKKyAqLworCisjZGVmaW5lIHdhbihsaXN0LHB0cixvYmosbGxuZykgZG8geyBcCisJCWlmICgocHRyKSA9PSAobGxuZykpIHsgXAorCQkJKGxsbmcpICs9IChsbG5nKTsgXAorCQkJKGxpc3QpID0gaW5jbWVtKChsaXN0KSwgKHB0cikgKiBzaXplb2Yob2JqKSwgXAorCQkJCShsbG5nKSAqIHNpemVvZihvYmopKTsgXAorCQl9IFwKKwkJKGxpc3QpWyhwdHIpICsrXSA9IChvYmopOyBcCisJfSB3aGlsZSAoMCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS91Y3BwL3NhbXBsZS5jIGIvdWNwcC9zYW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43OTAzMTg0Ci0tLSAvZGV2L251bGwKKysrIGIvdWNwcC9zYW1wbGUuYwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIFNhbXBsZSBjb2RlIHNob3dpbmcgaG93IHRvIHVzZSB1Y3BwIGFzIGFuIGludGVncmF0ZWQgbGV4ZXIuCisgKiBUaGlzIGZpbGUgaXMgcHVibGljIGRvbWFpbi4KKyAqLworCisvKgorICogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgdWNwcCBhcyBhIHByZXByb2Nlc3NvciBhbmQgbGV4ZXIKKyAqIGludG8gYW5vdGhlciBwcm9qZWN0LiBUaGUgc3RlcHMgYXJlIHRob3NlIGRlc2NyaWJlZCBpbiB1Y3BwIFJFQURNRQorICogZmlsZS4gVG8gdXNlIHRoaXMgY29kZSwgY29tcGlsZSB0aGUgdWNwcCBzb3VyY2UgZmlsZXMgd2l0aAorICogU1RBTkRfQUxPTkUgbm90IGRlZmluZWQsIGFuZCBsaW5rIHRoZW0gd2l0aCB0aGlzIGNvZGUuIFRoZSByZXN1bHRpbmcKKyAqIGJpbmFyeSB3aWxsIHRha2UgYSBDIHNvdXJjZSBmaWxlIGFzIHN0YW5kYXJkIGlucHV0LCBwcmVwcm9jZXNzIGl0LAorICogYW5kIG91dHB1dCBlYWNoIG5vbi13aGl0ZXNwYWNlIHRva2VuIG9uIHN0ZG91dCwgd2l0aCBpdHMgbnVtZXJpY2FsCisgKiB2YWx1ZSAoZGVmaW5lZCBhcyBhbiBlbnVtIGluIGNwcC5oKSBhbmQgaXRzIGNvbnRlbnRzLiBUaGlzIGNvZGUKKyAqIGRlZmluZXMgbm8gc3lzdGVtIGluY2x1ZGUgcGF0aC4KKyAqCisgKiBUaGlzIGNvZGUgc3VwcG9zZXMgdGhhdCB0aGUgdWNwcCBmaWxlcyBhcmUgY29tcGlsZWQgd2l0aCBQUkFHTUFfVE9LRU5JWkUKKyAqIGVuYWJsZWQgKHNlZSB0aGUgdHVuZS5oIGZpbGUpLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgIm1lbS5oIgorI2luY2x1ZGUgImNwcC5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBpLCByOworCXN0cnVjdCBsZXhlcl9zdGF0ZSBsczsKKworCS8qIHN0ZXAgMSAqLworCWluaXRfY3BwKCk7CisKKwkvKiBzdGVwIDIgKi8KKwlub19zcGVjaWFsX21hY3JvcyA9IDA7CisJZW1pdF9kZWZpbmVzID0gZW1pdF9hc3NlcnRpb25zID0gMDsKKworCS8qIHN0ZXAgMyAtLSB3aXRoIGFzc2VydGlvbnMgKi8KKwlpbml0X3RhYmxlcygxKTsKKworCS8qIHN0ZXAgNCAtLSBubyBkZWZhdWx0IGluY2x1ZGUgcGF0aCAqLworCWluaXRfaW5jbHVkZV9wYXRoKDApOworCisJLyogc3RlcCA1IC0tIG5vIG5lZWQgdG8gcmVzZXQgdGhlIHR3byBlbWl0XyogdmFyaWFibGVzIHNldCBpbiAyICovCisJZW1pdF9kZXBlbmRlbmNpZXMgPSAwOworCisJLyogc3RlcCA2IC0tIHdlIHdvcmsgd2l0aCBzdGRpbiwgdGhpcyBpcyBub3QgYSByZWFsIGZpbGVuYW1lICovCisJc2V0X2luaXRfZmlsZW5hbWUoIltzdGRpbl0iLCAwKTsKKworCS8qIHN0ZXAgNyAtLSB3ZSBtYWtlIHN1cmUgdGhhdCBhc3NlcnRpb25zIGFyZSBvbiwgYW5kIHByYWdtYSBhcmUKKwkgICBoYW5kbGVkICovCisJaW5pdF9sZXhlcl9zdGF0ZSgmbHMpOworCWluaXRfbGV4ZXJfbW9kZSgmbHMpOworCWxzLmZsYWdzIHw9IEhBTkRMRV9BU1NFUlRJT05TIHwgSEFORExFX1BSQUdNQSB8IExJTkVfTlVNOworCisJLyogc3RlcCA4IC0tIGlucHV0IGlzIGZyb20gc3RkaW4gKi8KKwlscy5pbnB1dCA9IHN0ZGluOworCisJLyogc3RlcCA5IC0tIHdlIGRvIG5vdCBoYXZlIGFueSBtYWNybyB0byBkZWZpbmUsIGJ1dCB3ZSBhZGQgYW55CisJICAgYXJndW1lbnQgYXMgYW4gaW5jbHVkZSBwYXRoICovCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkgKyspIGFkZF9pbmNwYXRoKGFyZ3ZbaV0pOworCisJLyogc3RlcCAxMCAtLSB3ZSBhcmUgYSBsZXhlciBhbmQgd2Ugd2FudCBDT05URVhUIHRva2VucyAqLworCWVudGVyX2ZpbGUoJmxzLCBscy5mbGFncyk7CisKKwkvKiByZWFkIHRva2VucyB1bnRpbCBlbmQtb2YtaW5wdXQgaXMgcmVhY2hlZCAtLSBlcnJvcnMgKG5vbi16ZXJvCisJICAgcmV0dXJuIHZhbHVlcyBkaWZmZXJlbnQgZnJvbSBDUFBFUlJfRU9GKSBhcmUgaWdub3JlZCAqLworCXdoaWxlICgociA9IGxleCgmbHMpKSA8IENQUEVSUl9FT0YpIHsKKwkJaWYgKHIpIHsKKwkJCS8qIGVycm9yIGNvbmRpdGlvbiAtLSBubyB0b2tlbiB3YXMgcmV0cmlldmVkICovCisJCQljb250aW51ZTsKKwkJfQorCQkvKiB3ZSBwcmludCBlYWNoIHRva2VuOiBpdHMgbnVtZXJpY2FsIHZhbHVlLCBhbmQgaXRzCisJCSAgIHN0cmluZyBjb250ZW50OyBpZiB0aGlzIGlzIGEgUFJBR01BIHRva2VuLCB0aGUKKwkJICAgc3RyaW5nIGNvbnRlbnQgaXMgaW4gZmFjdCBhIGNvbXByZXNzZWQgdG9rZW4gbGlzdCwKKwkJICAgdGhhdCB3ZSB1bmNvbXByZXNzIGFuZCBwcmludC4gKi8KKwkJaWYgKGxzLmN0b2stPnR5cGUgPT0gUFJBR01BKSB7CisJCQl1bnNpZ25lZCBjaGFyICpjID0gKHVuc2lnbmVkIGNoYXIgKikobHMuY3Rvay0+bmFtZSk7CisKKwkJCXByaW50ZigibGluZSAlbGQ6IDwjcHJhZ21hPlxuIiwgbHMubGluZSk7CisJCQlmb3IgKDsgKmM7IGMgKyspIHsKKwkJCQlpbnQgdCA9ICpjOworCisJCQkJaWYgKFNUUklOR19UT0tFTih0KSkgeworCQkJCQlwcmludGYoIiAgPCUyZD4gICIsIHQpOworCQkJCQlmb3IgKGMgKys7ICpjICE9IFBSQUdNQV9UT0tFTl9FTkQ7CisJCQkJCQljICsrKSBwdXRjaGFyKCpjKTsKKwkJCQkJcHV0Y2hhcignXG4nKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGYoIiAgPCUyZD4gIGAlcydcbiIsIHQsCisJCQkJCQlvcGVyYXRvcnNfbmFtZVt0XSk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKGxzLmN0b2stPnR5cGUgPT0gQ09OVEVYVCkgeworCQkJcHJpbnRmKCJuZXcgY29udGV4dDogZmlsZSAnJXMnLCBsaW5lICVsZFxuIiwKKwkJCQlscy5jdG9rLT5uYW1lLCBscy5jdG9rLT5saW5lKTsKKwkJfSBlbHNlIGlmIChscy5jdG9rLT50eXBlID09IE5FV0xJTkUpIHsKKwkJCXByaW50ZigiW25ld2xpbmVdXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigibGluZSAlbGQ6IDwlMmQ+ICBgJXMnXG4iLCBscy5jdG9rLT5saW5lLAorCQkJCWxzLmN0b2stPnR5cGUsCisJCQkJU1RSSU5HX1RPS0VOKGxzLmN0b2stPnR5cGUpID8gbHMuY3Rvay0+bmFtZQorCQkJCTogb3BlcmF0b3JzX25hbWVbbHMuY3Rvay0+dHlwZV0pOworCQl9CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdWNwcC90dW5lLmggYi91Y3BwL3R1bmUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZWI2Mjc1Ci0tLSAvZGV2L251bGwKKysrIGIvdWNwcC90dW5lLmgKQEAgLTAsMCArMSwzMDggQEAKKy8qCisgKiAoYykgVGhvbWFzIFBvcm5pbiAxOTk5LCAyMDAwCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9ycyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVAorICogT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIAorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSAKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsCisgKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIFVDUFBfX1RVTkVfXworI2RlZmluZSBVQ1BQX19UVU5FX18KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyoKKyAqIERlZmluZSBMT1dfTUVNIGZvciBsb3cgbWVtb3J5IG1hY2hpbmVzLiBJdCBzZWVtcyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlCisgKiBvbiBsYXJnZXIgc3lzdGVtcywgc28gdGhpcyBpcyBvbiBieSBkZWZhdWx0LgorICovCisjZGVmaW5lIExPV19NRU0KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyoKKyAqIERlZmluZSBBTUlHQSBmb3Igc3lzdGVtcyB1c2luZyAiZHJpdmUgbGV0dGVycyIgYXQgdGhlIGJlZ2lubmluZyBvZgorICogc29tZSBwYXRoczsgZGVmaW5lIE1TRE9TIG9uIHN5c3RlbXMgd2l0aCBkcml2ZSBsZXR0ZXJzIGFuZCB1c2luZworICogYmFja3NsYXNoZXMgdG8gc2VwZXJhdGUgZGlyZWN0b3J5IGNvbXBvbmVudHMuIEFUQVJJIGlzIHNhbWUgYXMgTVNET1MKKyAqIGJ1dCBkb2VzIG5vdCB1c2UgJVZBUiUgbm90YXRpb24gYW5kIFR1cmJvIEMgc3BlY2lmaWMgY29kZS4KKyAqLworLyogI2RlZmluZSBBTUlHQSAqLworLyogI2RlZmluZSBNU0RPUyAqLworLyogI2RlZmluZSBBVEFSSSAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKgorICogQnVmZmVyaW5nOiB0aGVyZSBhcmUgdHdvIGxldmVscyBvZiBidWZmZXJpbmcgb24gaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zOgorICogdGhlIHN0YW5kYXJkIGxpYmMgYnVmZmVyaW5nIChtYW5hZ2VhYmxlIHdpdGggc2V0YnVmKCkgYW5kIHNldHZidWYoKSkKKyAqIGFuZCBzb21lIGJ1ZmZlcmluZyBwcm92aWRlZCBieSB1Y3BwIGl0c2VsZi4gVGhlIHVjcHAgYnVmZmVyaW5nIHVzZXMKKyAqIHR3byBidWZmZXJzLCBvZiBzaXplIHJlc3BlY3RpdmVseSBJTlBVVF9CVUZfTUVNRyBhbmQgT1VUUFVUX0JVRl9NRU1HCisgKiAoYXMgZGVmaW5lZCBiZWxvdykuCisgKiBZb3UgY2FuIGRpc2FibGUgb25lIG9yIGJvdGggb2YgdGhlc2UgYnVmZmVyaW5ncyBieSBkZWZpbmluZyB0aGUgbWFjcm9zCisgKiBOT19MSUJDX0JVRiBhbmQgTk9fVUNQUF9CVUYuCisgKgorICogUGVyZm9ybWFuY2UgbWF5IHZhcnksIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gT24gYQorICogTGludXgvQWxwaGEgd29ya3N0YXRpb24sIHVzZSBib3RoIGJ1ZmZlcmluZ3MgKHRoYXQgbWVhbnMsIGRpc2FibGUgbm9uZQorICogb2YgdGhlbSkgZm9yIG1heGltdW0gcGVyZm9ybWFuY2UuIE9uIGEgTWluaXgtODYgbWFjaGluZSwgZGlzYWJsaW5nCisgKiB1Y3BwIGJ1ZmZlcmluZyBzYXZlcyBzb21lIG1lbW9yeSBhbmQgZG9lcyBub3Qgc2VlbSB0byBpbXBhY3QgcGVyZm9ybWFuY2UuCisgKi8KKy8qICNkZWZpbmUgTk9fTElCQ19CVUYgKi8KKy8qICNkZWZpbmUgTk9fVUNQUF9CVUYgKi8KKworLyoKKyAqIE9uIFVuaXggc3RhdGlvbnMsIHRoZSBzeXN0ZW0gY2FsbCBtbWFwKCkgbWlnaHQgYmUgdXNlZCBvbiBpbnB1dCBmaWxlcy4KKyAqIFRoaXMgb3B0aW9uIGlzIGEgc3ViY2xhdXNlIG9mIHVjcHAgaW50ZXJuYWwgYnVmZmVyaW5nLiBPbiBvbmUgc3RhdGlvbiwKKyAqIGEgMTAlIHNwZWVkIGltcHJvdmVtZW50IHdhcyBvYnNlcnZlLiBEbyBub3QgZGVmaW5lIHRoaXMgdW5sZXNzIHRoZQorICogaG9zdCBhcmNoaXRlY3R1cmUgaGFzIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyaXN0aWNzOgorICogIC0tIFBvc2l4IGNvbXBsaWFuY2UKKyAqICAtLSBUZXh0IGZpbGVzIGNvcnJlc3BvbmQgb25lIHRvIG9uZSB3aXRoIG1lbW9yeSByZXByZXNlbnRhdGlvbgorICogSWYgYSBmaWxlIGlzIG5vdCBzZWVrYWJsZSBvciBub3QgbW1hcGFibGUsIHVjcHAgd2lsbCByZXZlcnQgdG8gdGhlCisgKiBzdGFuZGFyZCBmcmVhZCgpIHNvbHV0aW9uLgorICoKKyAqIFRoaXMgZmVhdHVyZSBpcyBzdGlsbCBjb25zaWRlcmVkIGJldGEgcXVhbGl0eS4gT24gc29tZSBzeXN0ZW1zIHdoZXJlCisgKiBmaWxlcyBjYW4gYmUgYmlnZ2VyIHRoYW4gbWVtb3J5IGFkZHJlc3Mgc3BhY2UgKG1haW5seSwgMzItYml0IHN5c3RlbXMKKyAqIHdpdGggZmlsZXMgYmlnZ2VyIHRoYW4gNCBHQiksIHRoaXMgb3B0aW9uIG1ha2VzIHVjcHAgZmFpbCB0byBvcGVyYXRlCisgKiBvbiB0aG9zZSBleHRyZW1lbHkgbGFyZ2UgZmlsZXMuCisgKi8KKy8qICNkZWZpbmUgVUNQUF9NTUFQICovCisKKy8qIFRvIHByb3RlY3QgdGhlIGlubm9jZW50LiAqLworI2lmIGRlZmluZWQoTk9fVUNQUF9CVUYpICYmIGRlZmluZWQoVUNQUF9NTUFQKQorI3VuZGVmIFVDUFBfTU1BUAorI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qCisgKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB1Y3BwIHRvIGdlbmVyYXRlIHRva2VuaXplZCBQUkFHTUEgdG9rZW5zOworICogb3RoZXJ3aXNlLCBpdCB3aWxsIGdlbmVyYXRlIHJhdyBzdHJpbmcgY29udGVudHMuIFRoaXMgc2V0dGluZyBpcworICogaXJyZWxldmFudCB0byB0aGUgc3RhbmQtYWxvbmUgdmVyc2lvbiBvZiB1Y3BwLgorICovCisvKiNkZWZpbmUgUFJBR01BX1RPS0VOSVpFKi8KKworLyoKKyAqIERlZmluZSB0aGlzIHRvIHRoZSBzcGVjaWFsIGNoYXJhY3RlciB0aGF0IG1hcmtzIHRoZSBlbmQgb2YgdG9rZW5zIHdpdGgKKyAqIGEgc3RyaW5nIHZhbHVlIGluc2lkZSBhIHRva2VuaXplZCBQUkFHTUEgdG9rZW4uIFRoZSAjcHJhZ21hIGFuZCBfUHJhZ21hKCkKKyAqIGRpcmVjdGl2ZXMgd2hpY2ggdXNlIHRoaXMgY2hhcmFjdGVyIHdpbGwgYmUgYSBiaXQgbW9yZSBkaWZmaWN1bHQgdG8KKyAqIGRlY29kZSAoYnV0IHVjcHAgd2lsbCBub3QgbWluZCkuIDAgY2Fubm90IGJlIHVzZWQuICdcbicgaXMgZmluZSBiZWNhdXNlCisgKiBpdCBjYW5ub3QgYXBwZWFyIGluc2lkZSBhICNwcmFnbWEgb3IgX1ByYWdtYSgpLCBzaW5jZSBuZXdsaW5lcyBjYW5ub3QgYmUKKyAqIGVtYmVkZGVkIGluc2lkZSB0b2tlbnMsIG5laXRoZXIgZGlyZWN0bHkgbm9yIGJ5IG1hY3JvIHN1YnN0aXR1dGlvbiBhbmQKKyAqIHN0cmluZ2l6YXRpb24uIEJlc2lkZXMsICdcbicgaXMgcG9ydGFibGUuCisgKi8KKyNkZWZpbmUgUFJBR01BX1RPS0VOX0VORAkoKHVuc2lnbmVkIGNoYXIpJ1xuJykKKworLyoKKyAqIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHVjcHAgdG8gaW5jbHVkZSBlbmNvdW50ZXJlZCAjcHJhZ21hIGRpcmVjdGl2ZXMKKyAqIGluIGl0cyBvdXRwdXQgaW4gbm9uLWxleGVyIG1vZGU7IF9QcmFnbWEoKSBhcmUgdHJhbnNsYXRlZCB0byBlcXVpdmFsZW50CisgKiAjcHJhZ21hIGRpcmVjdGl2ZXMuCisgKi8KKyNkZWZpbmUgUFJBR01BX0RVTVAKKworLyoKKyAqIEFjY29yZGluZyB0byBtYXkgaW50ZXJwcmV0YXRpb24gb2YgdGhlIEM5OSBzdGFuZGFyZCwgX1ByYWdtYSgpIGFyZQorICogZXZhbHVhdGVkIHdoZXJldmVyIG1hY3JvIGV4cGFuc2lvbiBjb3VsZCB0YWtlIHBsYWNlLiBIb3dldmVyLCBOZWlsIEJvb3RoLAorICogd2hvc2UgbW90aGVyIGxhbmd1YWdlIGlzIEVuZ2xpc2ggKGNvbnRyYXJ5IHRvIG1lKSBhbmQgd2hvIGlzIHdlbGwgYXdhcmUKKyAqIG9mIHRoZSBDOTkgc3RhbmRhcmQgKGFuZCBlc3BlY2lhbGx5IHRoZSBDIHByZXByb2Nlc3NvcikgdG9sZCBtZSB0aGF0CisgKiBpdCB3YXMgdW5jbGVhciB3aGV0aGVyIF9QcmFnbWEoKSBhcmUgZXZhbHVhdGVkIGluc2lkZSBkaXJlY3RpdmVzIHN1Y2gKKyAqIGFzICNpZiwgI2luY2x1ZGUgYW5kICNsaW5lLiBJZiB5b3Ugd2FudCB0byBkaXNhYmxlIHRoZSBldmFsdWF0aW9uIG9mCisgKiBfUHJhZ21hKCkgaW5zaWRlIHN1Y2ggZGlyZWN0aXZlcywgZGVmaW5lIHRoZSBmb2xsb3dpbmcgbWFjcm8uCisgKi8KKy8qICNkZWZpbmUgTk9fUFJBR01BX0lOX0RJUkVDVElWRSAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKgorICogRGVmaW5lIElOTUFDUk9fRkxBRyB0byBpbmNsdWRlIHR3byBmbGFncyB0byB0aGUgc3RydWN0dXJlIGxleGVyX3N0YXRlLAorICogdGhhdCB0ZWxsIHdoZXRoZXIgdG9rZW5zIGNvbWUgZnJvbSBhIG1hY3JvLXJlcGxhY2VtZW50LCBhbmQgY291bnQgdGhvc2UKKyAqIG1hY3JvLXJlcGxhY2VtZW50cy4KKyAqLworLyogI2RlZmluZSBJTk1BQ1JPX0ZMQUcgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyoKKyAqIFBhdGhzIHdoZXJlIGZpbGVzIGFyZSBsb29rZWQgZm9yIGJ5IGRlZmF1bHQsIHdoZW4gI2luY2x1ZGUgaXMgdXNlZC4KKyAqIFR5cGljYWwgcGF0aCBpcyAvdXNyL2xvY2FsL2luY2x1ZGUgYW5kIC91c3IvaW5jbHVkZSwgaW4gdGhhdCBvcmRlci4KKyAqIElmIHlvdSB3YW50IHRvIHNldCB1cCBubyBwYXRoLCBkZWZpbmUgdGhlIG1hY3JvIHRvIDAuCisgKgorICogRm9yIExpbnV4LCBnZXQgZ2NjIGluY2x1ZGVzIHRvbywgb3IgeW91IHdpbGwgbWlzcyB0aGluZ3MgbGlrZSBzdGRkZWYuaC4KKyAqIFRoZSBleGFjdCBwYXRoIHZhcmllcyBtdWNoLCBkZXBlbmRpbmcgb24gdGhlIGRpc3RyaWJ1dGlvbi4KKyAqLworI2RlZmluZSBTVERfSU5DTFVERV9QQVRICSIvdXNyL2xvY2FsL2luY2x1ZGUiLCAiL3Vzci9pbmNsdWRlIiwgXAorCSIvdXNyL2xpYi9nY2MtbGliL2FscGhhZXY1Ni11bmtub3duLWxpbnV4LWdudS8yLjk1LjIvaW5jbHVkZSIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyoKKyAqIEZvciB0aGUgZXZhbHVhdGlvbiBvZiAjaWYgZXhwcmVzc2lvbi4gSWYgTkFUSVZFX1VJTlRNQVggaXMgZGVmaW5lZCwKKyAqIHRoZSBldmFsdWF0aW9uIGlzIGRvbmUgd2l0aCBOQVRJVkVfVUlOVE1BWCBhcyB1bnNpZ25lZCB0eXBlLCBhbmQKKyAqIE5BVElWRV9JTlRNQVggYXMgc2lnbmVkIHR5cGUuIElmIE5BVElWRV9VSU5UTUFYIGlzIG5vdCBkZWZpbmVkIGJ1dAorICogU0lNVUxfVUlOVE1BWCBpcyBkZWZpbmVkLCBldmFsdWF0aW9uIGlzIHBlcmZvcm1lZCB3aXRoIGEgYmlnIGludGVnZXIKKyAqIHR5cGUsIHdob20gc2l6ZSBpcyB0d2ljZSB0aGUgc2l6ZSBvZiB1bnNpZ25lZCBsb25nLiBJZiBuZWl0aGVyIGlzCisgKiBkZWZpbmVkLCB1Y3BwIHdpbGwgdXNlIHVpbnRtYXhfdCBhbmQgaW50bWF4X3QgaWYgYXZhaWxhYmxlLCB1bnNpZ25lZAorICogbG9uZyBhbmQgbG9uZyBvdGhlcndpc2UuCisgKiBTZWUgdGhlIFJFQURNRSBmaWxlIGZvciBkZXRhaWxzLgorICovCisvKgorICogdW5jb21tZW50IHRoZXNlIHR3byBsaW5lcyBpZiB5b3Ugd2FudCBldmFsdWF0aW9uIHdpdGggYSAibG9uZyBsb25nIiB0eXBlCisjZGVmaW5lIE5BVElWRV9VSU5UTUFYCXVuc2lnbmVkIGxvbmcgbG9uZworI2RlZmluZSBOQVRJVkVfSU5UTUFYCWxvbmcgbG9uZworICovCisvKgorICogdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgaWYgeW91IHdhbnQgZXZhbHVhdGlvbiB3aXRoIGFuIGVtdWxhdGVkIHR5cGUKKyAqIGJ1aWx0IHdpdGggdHdvICJ1bnNpZ25lZCBsb25nIi4KKyNkZWZpbmUgU0lNVUxfVUlOVE1BWAorICovCisvKgorICogdG8gZm9yY2Ugc2lnbmVkbmVzcyBvZiB3aWRlIGNoYXJhY3RlciBjb25zdGFudHMsIGRlZmluZSBXQ0hBUl9TSUdORURORVNTCisgKiB0byAwIGZvciB1bnNpZ25lZCwgMSBmb3Igc2lnbmVkLgorI2RlZmluZSBXQ0hBUl9TSUdORURORVNTCTAKKyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKgorICogU3RhbmRhcmQgYXNzZXJ0aW9ucy4gVGhleSBzaG91bGQgaW5jbHVkZSBvbmUgY3B1KCkgYXNzZXJ0aW9uLCBvbmUgbWFjaGluZSgpCisgKiBhc3NlcnRpb24gKGlkZW50aWNhbCB0byBjcHUoKSksIGFuZCBvbmUgb3IgbW9yZSBzeXN0ZW0oKSBhc3NlcnRpb25zLgorICoKKyAqIGZvciBMaW51eC9QQzogICAgICBjcHUoaTM4NiksICBtYWNoaW5lKGkzODYpLCAgc3lzdGVtKHVuaXgpLCBzeXN0ZW0obGludXgpCisgKiBmb3IgTGludXgvQWxwaGE6ICAgY3B1KGFscGhhKSwgbWFjaGluZShhbHBoYSksIHN5c3RlbSh1bml4KSwgc3lzdGVtKGxpbnV4KQorICogZm9yIFNwYXJjL1NvbGFyaXM6IGNwdShzcGFyYyksIG1hY2hpbmUoc3BhcmMpLCBzeXN0ZW0odW5peCksIHN5c3RlbShzb2xhcmlzKQorICoKKyAqIFRoZXNlIGFyZSBvbmx5IHN1Z2dlc3Rpb25zLiBPbiBTb2xhcmlzLCBtYWNoaW5lKCkgc2hvdWxkIGJlIGRlZmluZWQKKyAqIGZvciBpMzg2IG9yIHNwYXJjLiBGb3IgY3Jvc3MtY29tcGlsYXRpb24sIGRlZmluZSBhc3NlcnRpb25zIHJlbGF0ZWQKKyAqIHRvIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgorICoKKyAqIElmIHlvdSB3YW50IG5vIHN0YW5kYXJkIGFzc2VydGlvbiwgZGVmaW5lIFNURF9BU1NFUlQgdG8gMC4KKyAqLworI2RlZmluZSBTVERfQVNTRVJUCSJjcHUoYWxwaGEpIiwgIm1hY2hpbmUoYWxwaGEpIiwgInN5c3RlbSh1bml4KSIsIFwKKwkJCSJzeXN0ZW0obGludXgpIgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKgorICogU3lzdGVtIHByZWRlZmluZWQgbWFjcm9zLiBOb3RoaW5nIHJlYWxseSBtYW5kYXRvcnksIGJ1dCBzb21lIHByb2dyYW1zCisgKiBtaWdodCByZWx5IG9uIHRob3NlLgorICogRWFjaCBzdHJpbmcgbXVzdCBiZSBlaXRoZXIgIm5hbWUiIG9yICJuYW1lPXRva2VuLWxpc3QiLiBJZiB5b3Ugd2FudAorICogbm8gcHJlZGVmaW5lZCBtYWNybywgZGVmaW5lIFNURF9NQUNST1MgdG8gMC4KKyAqLworI2RlZmluZSBTVERfTUFDUk9TCSJfX2xpbnV4IiwgIl9fdW5peCIsICJfX2FscGhhIiwgXAorCQkJIl9fbGludXhfXyIsICJfX3VuaXhfXyIsICJfX2FscGhhX18iCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qCisgKiBEZWZhdWx0IGZsYWdzOyBIQU5ETEVfQVNTRVJUSU9OUyBpcyByZXF1aXJlZCBmb3IgU29sYXJpcyBzeXN0ZW0gaGVhZGVycy4KKyAqIFNlZSBjcHAuaCBmb3IgdGhlIGRlZmluaXRpb24gb2YgdGhlc2UgZmxhZ3MuCisgKi8KKyNkZWZpbmUgREVGQVVMVF9DUFBfRkxBR1MJKERJU0NBUkRfQ09NTUVOVFMgfCBXQVJOX1NUQU5EQVJEIFwKKwkJCQl8IFdBUk5fUFJBR01BIHwgRkFJTF9TSEFSUCB8IE1BQ1JPX1ZBQVJHIFwKKwkJCQl8IENQTFVTUExVU19DT01NRU5UUyB8IExJTkVfTlVNIHwgVEVYVF9PVVRQVVQgXAorCQkJCXwgS0VFUF9PVVRQVVQgfCBIQU5ETEVfVFJJR1JBUEhTIFwKKwkJCQl8IEhBTkRMRV9BU1NFUlRJT05TKQorI2RlZmluZSBERUZBVUxUX0xFWEVSX0ZMQUdTCShESVNDQVJEX0NPTU1FTlRTIHwgV0FSTl9TVEFOREFSRCB8IEZBSUxfU0hBUlAgXAorCQkJCXwgTUFDUk9fVkFBUkcgfCBDUExVU1BMVVNfQ09NTUVOVFMgfCBMRVhFUiBcCisJCQkJfCBIQU5ETEVfVFJJR1JBUEhTIHwgSEFORExFX0FTU0VSVElPTlMpCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qCisgKiBEZWZpbmUgdGhpcyB0byB1c2Ugc2lnc2V0am1wKCkvc2lnbG9uZ2ptcCgpIGluc3RlYWQgb2Ygc2V0am1wKCkvbG9uZ2ptcCgpLgorICogVGhpcyBpcyBub24tQU5TSSwgYnV0IHJlY29tbWVuZGVkIG9uIEFJWCBzeXN0ZW1zLgorICovCisvKiAjZGVmaW5lIFBPU0lYX0pNUCAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKgorICogTWF4aW11bSB2YWx1ZSAocGx1cyBvbmUpIG9mIGEgY2hhcmFjdGVyIGhhbmRsZWQgYnkgdGhlIGxleGVyOyAxMjggaXMKKyAqIGFscmlnaHQgZm9yIEFTQ0lJIG5hdGl2ZSBzb3VyY2UgY29kZSwgYnV0IDI1NiBpcyBuZWVkZWQgZm9yIEVCQ0RJQy4KKyAqIDI1NiBpcyBzYWZlIGluIGJvdGggY2FzZXM7IHlvdSB3aWxsIGhhdmUgYmlnIHByb2JsZW1zIGlmIHlvdSBzZXQKKyAqIHRoaXMgdmFsdWUgdG8gSU5UX01BWCBvciBhYm92ZS4gT24gTWluaXgtODYgb3IgTXNkb3MgKHNtYWxsIG1lbW9yeQorICogbW9kZWwpLCBkZWZpbmUgTUFYX0NIQVJfVkFMIHRvIDEyOC4KKyAqCisgKiBTZXQgTUFYX0NIQVJfVkFMIHRvIGEgcG93ZXIgb2YgdHdvIHRvIGluY3JlYXNlIGxleGluZyBzcGVlZC4gQmV3YXJlCisgKiB0aGF0IGxleGVyLmMgZGVmaW5lcyBhIHN0YXRpYyBhcnJheSBvZiBzaXplIE1TVEFURSAqIE1BWF9DSEFSX1ZBTAorICogdmFsdWVzIG9mIHR5cGUgaW50IChNU1RBVEUgaXMgZGVmaW5lZCBpbiBsZXhlci5jIGFuZCBpcyBhYm91dCA0MCkuCisgKi8KKyNkZWZpbmUgTUFYX0NIQVJfVkFMCTI1NgorCisvKgorICogSWYgeW91IHdhbnQgc29tZSBleHRyYSBjaGFyYWN0ZXIgdG8gYmUgY29uc2lkZXJlZCBhcyB3aGl0ZXNwYWNlLAorICogZGVmaW5lIHRoaXMgbWFjcm8gdG8gdGhhdCBzcGFjZS4gT24gSVNPLTg4NTktMSBtYWNoaW5lcywgMTYwIGlzCisgKiB0aGUgY29kZSBmb3IgdGhlIHVuYnJlYWthYmxlIHNwYWNlLgorICovCisvKiAjZGVmaW5lIFVOQlJFQUtBQkxFX1NQQUNFCTE2MCAqLworCisvKgorICogSWYgeW91IHdhbnQgd2hpdGVzcGFjZSB0b2tlbnMgY29udGVudHMgdG8gYmUgcmVjb3JkZWQgKG1ha2luZyB0aGVtCisgKiB0b2tlbnMgd2l0aCBhIHN0cmluZyBjb250ZW50KSwgZGVmaW5lIHRoaXMuIFRoZSBtYWNybyBTVFJJTkdfVE9LRU4KKyAqIHdpbGwgYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkuCisgKiBXaXRob3V0IHRoaXMgb3B0aW9uLCB3aGl0ZXNwYWNlIHRva2VucyBhcmUgbm90IGV2ZW4gcmV0dXJuZWQgYnkgdGhlCisgKiBsZXgoKSBmdW5jdGlvbi4gVGhpcyBpcyBpcnJlbGV2YW50IGZvciB0aGUgbm9uLWxleGVyIG1vZGUgKGFsbW9zdCAtLQorICogaXQgbWlnaHQgc2xvdyBkb3duIGEgYml0IHVjcHAsIGFuZCB3aXRoIHRoaXMgb3B0aW9uLCBjb21tZW50cyB3aWxsIGJlCisgKiBrZXB0IGluc2lkZSAjcHJhZ21hIGRpcmVjdGl2ZXMpLgorICovCisvKiAjZGVmaW5lIFNFTVBFUl9GSURFTElTICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qCisgKiBTb21lIGNvbnN0YW50cyB1c2VkIGZvciBtZW1vcnkgaW5jcmVtZW50IGdyYW51bGFyaXR5LiBJbmNyZWFzaW5nIHRoZXNlCisgKiB2YWx1ZXMgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIG1hbGxvYygpIGJ1dCBpbmNyZWFzZXMgbWVtb3J5CisgKiBjb25zdW1wdGlvbi4KKyAqCisgKiBWYWx1ZXMgc2hvdWxkIGJlIHBvd2VycyBvZiAyLgorICovCisKKy8qIGZvciBjcHAuYyAqLworI2RlZmluZSBDT1BZX0xJTkVfTEVOR1RICTgwCisjZGVmaW5lIElOUFVUX0JVRl9NRU1HCQk4MTkyCisjZGVmaW5lIE9VVFBVVF9CVUZfTUVNRwkJODE5MgorI2RlZmluZSBUT0tFTl9OQU1FX01FTUcJCTY0CS8qIG11c3QgYmUgYXQgbGVhc3QgNCAqLworI2RlZmluZSBUT0tFTl9MSVNUX01FTUcJCTMyCisjZGVmaW5lIElOQ1BBVEhfTUVNRwkJMTYKKyNkZWZpbmUgR0FSQkFHRV9MSVNUX01FTUcJMzIKKyNkZWZpbmUgTFNfU1RBQ0tfTUVNRwkJNAorI2RlZmluZSBGTkFNRV9NRU1HCQkzMgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKgorICogQzkwIGRvZXMgbm90IGtub3cgYWJvdXQgdGhlICJpbmxpbmUiIGtleXdvcmQsIGJ1dCBDOTkgZG9lcyBrbm93LAorICogYW5kIHNvbWUgQzkwIGNvbXBpbGVycyBrbm93IGl0IGFzIGFuIGV4dGVuc2lvbi4gVGhpcyBwYXJ0IGRldGVjdHMKKyAqIHRoZXNlIG9jY3VycmVuY2VzLgorICovCisKKyNpZm5kZWYgSU5MSU5FCisKKyNpZiBfX1NURENfXyAmJiBfX1NURENfVkVSU0lPTiA+PSAxOTk5MDFMCisvKiB0aGlzIGlzIGEgQzk5IGNvbXBpbGVyLCBrZWVwIGlubGluZSB1bmNoYW5nZWQgKi8KKyNlbGlmIGRlZmluZWQoX19HTlVDX18pCisvKiB0aGlzIGlzIEdOVSBnY2M7IG1vZGlmeSBpbmxpbmUuIFRoZSBzZW1hbnRpY3MgaXMgbm90IGlkZW50aWNhbCB0byBDOTkKKyAgIGJ1dCB0aGUgZGlmZmVyZW5jZXMgYXJlIGlycmVsZXZhbnQgYXMgbG9uZyBhcyBpbmxpbmUgZnVuY3Rpb25zIGFyZSBzdGF0aWMgKi8KKyN1bmRlZiBpbmxpbmUKKyNkZWZpbmUgaW5saW5lIF9faW5saW5lX18KKyNlbGlmIGRlZmluZWQoX19ERUNDKSAmJiBkZWZpbmVkKF9fbGludXhfXykKKy8qIHRoaXMgaXMgQ29tcGFxIEMgdW5kZXIgTGludXgsIHVzZSBfX2lubGluZV9fICovCisjdW5kZWYgaW5saW5lCisjZGVmaW5lIGlubGluZSBfX2lubGluZV9fCisjZWxzZQorLyogdW5rbm93biBjb21waWxlciAtPiBkZWFjdGl2YXRlIGlubGluZSAqLworI3VuZGVmIGlubGluZQorI2RlZmluZSBpbmxpbmUKKyNlbmRpZgorCisjZWxzZQorLyogSU5MSU5FIGhhcyBiZWVuIHNldCwgdXNlIGl0cyB2YWx1ZSAqLworI3VuZGVmIGlubGluZQorI2RlZmluZSBpbmxpbmUgSU5MSU5FCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS91Y3BwL3VjcHBpLmggYi91Y3BwL3VjcHBpLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmFlOTgyZAotLS0gL2Rldi9udWxsCisrKyBiL3VjcHAvdWNwcGkuaApAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIChjKSBUaG9tYXMgUG9ybmluIDE5OTksIDIwMDAKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiAKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCisgKiBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIAorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwKKyAqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgVUNQUF9fVUNQUElfXworI2RlZmluZSBVQ1BQX19VQ1BQSV9fCisKKyNpbmNsdWRlICJjcHAuaCIKKyNpbmNsdWRlICJ0dW5lLmgiCisKKy8qCisgKiBBIG1hY3JvIHJlcHJlc2VudGVkIGluIGEgY29tcGFjdCBmb3JtOyBzaW1wbGUgdG9rZW5zIGFyZSByZXByZXNlbnRlZAorICogYnkgb25lIGJ5dGUsIGNvbnRhaW5pbmcgdGhlaXIgbnVtYmVyLiBUb2tlbnMgd2l0aCBhIHN0cmluZyB2YWx1ZSBhcmUKKyAqIGZvbGxvd2VkIGJ5IHRoZSB2YWx1ZSAoc3RyaW5nIGZpbmlzaGVkIGJ5IGEgMCkuIE1hY3JvIGFyZ3VtZW50cyBhcmUKKyAqIGZvbGxvd2VkIGJ5IHRoZSBhcmd1bWVudCBudW1iZXIgKGluIG9uZSBieXRlIC0tIHRodXMgaW1wbHlpbmcgYSBoYXJkCisgKiBsaW1pdCBvZiAyNTQgYXJndW1lbnRzIChudW1iZXIgMjU1IGlzIGZvciBfX1ZBX0FSR1NfXykuCisgKi8KK3N0cnVjdCBjb21wX3Rva2VuX2ZpZm8geworCXNpemVfdCBsZW5ndGg7CisJc2l6ZV90IHJwOworCXVuc2lnbmVkIGNoYXIgKnQ7Cit9OworCisvKiBUaGVzZSBkZWNsYXJhdGlvbnMgYXJlIHVzZWQgb25seSBpbnRlcm5hbGx5IGJ5IHVjcHAgKi8KKworLyoKKyAqIFNfVE9LRU4oeCkJY2hlY2tzIHdoZXRoZXIgeCBpcyBhIHRva2VuIHR5cGUgd2l0aCBhbiBlbWJlZGRlZCBzdHJpbmcKKyAqIHR0TVdTKHgpCWNoZWNrcyB3aGV0aGVyIHggaXMgbWFjcm8gd2hpdGVzcGFjZSAoc3BhY2UsIGNvbW1lbnQuLi4pCisgKiB0dFdISSh4KQljaGVja3Mgd2hldGhlciB4IGlzIHdoaXRlc3BhY2UgKE1XUyBvciBuZXdsaW5lKQorICovCisjZGVmaW5lIFNfVE9LRU4oeCkJU1RSSU5HX1RPS0VOKHgpCisjZGVmaW5lIHR0TVdTKHgpCSgoeCkgPT0gTk9ORSB8fCAoeCkgPT0gQ09NTUVOVCB8fCAoeCkgPT0gT1BUX05PTkUpCisjZGVmaW5lIHR0V0hJKHgpCSh0dE1XUyh4KSB8fCAoeCkgPT0gTkVXTElORSkKKworLyoKKyAqIEZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLworLyoKKyAqIGZyb20gbGV4ZXIuYworICovCisjZGVmaW5lIGluaXRfY3BwbQl1Y3BwX2luaXRfY3BwbQorI2RlZmluZSBwdXRfY2hhcgl1Y3BwX3B1dF9jaGFyCisjZGVmaW5lIGRpc2NhcmRfY2hhcgl1Y3BwX2Rpc2NhcmRfY2hhcgorI2RlZmluZSBuZXh0X3Rva2VuCXVjcHBfbmV4dF90b2tlbgorI2RlZmluZSBncmFwX2NoYXIJdWNwcF9ncmFwX2NoYXIKKyNkZWZpbmUgc3BhY2VfY2hhcgl1Y3BwX3NwYWNlX2NoYXIKKwordm9pZCBpbml0X2NwcG0odm9pZCk7Cit2b2lkIHB1dF9jaGFyKHN0cnVjdCBsZXhlcl9zdGF0ZSAqLCB1bnNpZ25lZCBjaGFyKTsKK3ZvaWQgZGlzY2FyZF9jaGFyKHN0cnVjdCBsZXhlcl9zdGF0ZSAqKTsKK2ludCBuZXh0X3Rva2VuKHN0cnVjdCBsZXhlcl9zdGF0ZSAqKTsKK2ludCBncmFwX2NoYXIoc3RydWN0IGxleGVyX3N0YXRlICopOworaW50IHNwYWNlX2NoYXIoaW50KTsKKworLyoKKyAqIGZyb20gYXNzZXJ0LmMKKyAqLworc3RydWN0IGFzc2VydCB7CisJY2hhciAqbmFtZTsJLyogdGhpcyBtdXN0IGJlIHRoZSBmaXJzdCBmaWVsZCAqLworCXNpemVfdCBuYnZhbDsKKwlzdHJ1Y3QgdG9rZW5fZmlmbyAqdmFsOworfTsKKworI2RlZmluZSBjbXBfdG9rZW5fbGlzdAkJdWNwcF9jbXBfdG9rZW5fbGlzdAorI2RlZmluZSBoYW5kbGVfYXNzZXJ0CQl1Y3BwX2hhbmRsZV9hc3NlcnQKKyNkZWZpbmUgaGFuZGxlX3VuYXNzZXJ0CQl1Y3BwX2hhbmRsZV91bmFzc2VydAorI2RlZmluZSBnZXRfYXNzZXJ0aW9uCQl1Y3BwX2dldF9hc3NlcnRpb24KKworaW50IGNtcF90b2tlbl9saXN0KHN0cnVjdCB0b2tlbl9maWZvICosIHN0cnVjdCB0b2tlbl9maWZvICopOworaW50IGhhbmRsZV9hc3NlcnQoc3RydWN0IGxleGVyX3N0YXRlICopOworaW50IGhhbmRsZV91bmFzc2VydChzdHJ1Y3QgbGV4ZXJfc3RhdGUgKik7CitzdHJ1Y3QgYXNzZXJ0ICpnZXRfYXNzZXJ0aW9uKGNoYXIgKik7CisKKy8qCisgKiBmcm9tIG1hY3JvLmMKKyAqLworc3RydWN0IG1hY3JvIHsKKwljaGFyICpuYW1lOwkvKiB0aGlzIG11c3QgYmUgdGhlIGZpcnN0IGZpZWxkICovCisJaW50IG5hcmc7CisJY2hhciAqKmFyZzsKKwlpbnQgbmVzdDsKKwlpbnQgdmFhcmc7CisjaWZkZWYgTE9XX01FTQorCXN0cnVjdCBjb21wX3Rva2VuX2ZpZm8gY3ZhbDsKKyNlbHNlCisJc3RydWN0IHRva2VuX2ZpZm8gdmFsOworI2VuZGlmCit9OworCisjZGVmaW5lIHByaW50X3Rva2VuCQl1Y3BwX3ByaW50X3Rva2VuCisjZGVmaW5lIGhhbmRsZV9kZWZpbmUJCXVjcHBfaGFuZGxlX2RlZmluZQorI2RlZmluZSBoYW5kbGVfdW5kZWYJCXVjcHBfaGFuZGxlX3VuZGVmCisjZGVmaW5lIGhhbmRsZV9pZmRlZgkJdWNwcF9oYW5kbGVfaWZkZWYKKyNkZWZpbmUgaGFuZGxlX2lmbmRlZgkJdWNwcF9oYW5kbGVfaWZuZGVmCisjZGVmaW5lIHN1YnN0aXR1dGVfbWFjcm8JdWNwcF9zdWJzdGl0dXRlX21hY3JvCisjZGVmaW5lIGdldF9tYWNybwkJdWNwcF9nZXRfbWFjcm8KKyNkZWZpbmUgZHNoYXJwX2xleGVyCQl1Y3BwX2RzaGFycF9sZXhlcgorI2RlZmluZSBjb21waWxlX3RpbWUJCXVjcHBfY29tcGlsZV90aW1lCisjZGVmaW5lIGNvbXBpbGVfZGF0ZQkJdWNwcF9jb21waWxlX2RhdGUKKyNkZWZpbmUgY29tcGlsZV9hZGF0ZQkJdWNwcF9jb21waWxlX2FkYXRlCisjaWZkZWYgUFJBR01BX1RPS0VOSVpFCisjZGVmaW5lIHRva2VuaXplX2xleGVyCQl1Y3BwX3Rva2VuaXplX2xleGVyCisjZW5kaWYKKwordm9pZCBwcmludF90b2tlbihzdHJ1Y3QgbGV4ZXJfc3RhdGUgKiwgc3RydWN0IHRva2VuICosIGxvbmcpOworaW50IGhhbmRsZV9kZWZpbmUoc3RydWN0IGxleGVyX3N0YXRlICopOworaW50IGhhbmRsZV91bmRlZihzdHJ1Y3QgbGV4ZXJfc3RhdGUgKik7CitpbnQgaGFuZGxlX2lmZGVmKHN0cnVjdCBsZXhlcl9zdGF0ZSAqKTsKK2ludCBoYW5kbGVfaWZuZGVmKHN0cnVjdCBsZXhlcl9zdGF0ZSAqKTsKK2ludCBzdWJzdGl0dXRlX21hY3JvKHN0cnVjdCBsZXhlcl9zdGF0ZSAqLCBzdHJ1Y3QgbWFjcm8gKiwKKwlzdHJ1Y3QgdG9rZW5fZmlmbyAqLCBpbnQsIGludCwgbG9uZyk7CitzdHJ1Y3QgbWFjcm8gKmdldF9tYWNybyhjaGFyICopOworCitleHRlcm4gc3RydWN0IGxleGVyX3N0YXRlIGRzaGFycF9sZXhlcjsKK2V4dGVybiBjaGFyIGNvbXBpbGVfdGltZVtdLCBjb21waWxlX2RhdGVbXSwgY29tcGlsZV9hZGF0ZVtdOworI2lmZGVmIFBSQUdNQV9UT0tFTklaRQorZXh0ZXJuIHN0cnVjdCBsZXhlcl9zdGF0ZSB0b2tlbml6ZV9sZXhlcjsKKyNlbmRpZgorCisvKgorICogZnJvbSBldmFsLmMKKyAqLworI2RlZmluZSBzdHJ0b2NvbnN0CXVjcHBfc3RydG9jb25zdAorI2RlZmluZSBldmFsX2V4cHIJdWNwcF9ldmFsX2V4cHIKKyNkZWZpbmUgZXZhbF9saW5lCXVjcHBfZXZhbF9saW5lCisKK3Vuc2lnbmVkIGxvbmcgc3RydG9jb25zdChjaGFyICopOwordW5zaWduZWQgbG9uZyBldmFsX2V4cHIoc3RydWN0IHRva2VuX2ZpZm8gKiwgaW50ICosIGludCk7CitleHRlcm4gbG9uZyBldmFsX2xpbmU7CisKKyNkZWZpbmUgZXZhbF9leGNlcHRpb24JdWNwcF9ldmFsX2V4Y2VwdGlvbgorCisjaWZkZWYgUE9TSVhfSk1QCisjZGVmaW5lIEpNUF9CVUYJc2lnam1wX2J1ZgorI2RlZmluZSBjYXRjaCh4KQlzaWdzZXRqbXAoKHgpLCAwKQorI2RlZmluZSB0aHJvdyh4KQlzaWdsb25nam1wKCh4KSwgMSkKKyNlbHNlCisjZGVmaW5lIEpNUF9CVUYJam1wX2J1ZgorI2RlZmluZSBjYXRjaCh4KQlzZXRqbXAoKHgpKQorI2RlZmluZSB0aHJvdyh4KQlsb25nam1wKCh4KSwgMSkKKyNlbmRpZgorZXh0ZXJuIEpNUF9CVUYgZXZhbF9leGNlcHRpb247CisKKy8qCisgKiBmcm9tIGNwcC5jCisgKi8KKyNkZWZpbmUgdG9rZW5fbmFtZQkJdWNwcF90b2tlbl9uYW1lCisjZGVmaW5lIHRocm93X2F3YXkJCXVjcHBfdGhyb3dfYXdheQorI2RlZmluZSBnYXJiYWdlX2NvbGxlY3QJCXVjcHBfZ2FyYmFnZV9jb2xsZWN0CisjZGVmaW5lIGluaXRfYnVmX2xleGVyX3N0YXRlCXVjcHBfaW5pdF9idWZfbGV4ZXJfc3RhdGUKKyNpZmRlZiBQUkFHTUFfVE9LRU5JWkUKKyNkZWZpbmUgY29tcHJlc3NfdG9rZW5fbGlzdAl1Y3BwX2NvbXByZXNzX3Rva2VuX2xpc3QKKyNlbmRpZgorCitjaGFyICp0b2tlbl9uYW1lKHN0cnVjdCB0b2tlbiAqKTsKK3ZvaWQgdGhyb3dfYXdheShzdHJ1Y3QgZ2FyYmFnZV9maWZvICosIGNoYXIgKik7Cit2b2lkIGdhcmJhZ2VfY29sbGVjdChzdHJ1Y3QgZ2FyYmFnZV9maWZvICopOwordm9pZCBpbml0X2J1Zl9sZXhlcl9zdGF0ZShzdHJ1Y3QgbGV4ZXJfc3RhdGUgKiwgaW50KTsKKyNpZmRlZiBQUkFHTUFfVE9LRU5JWkUKK3N0cnVjdCBjb21wX3Rva2VuX2ZpZm8gY29tcHJlc3NfdG9rZW5fbGlzdChzdHJ1Y3QgdG9rZW5fZmlmbyAqKTsKKyNlbmRpZgorCisjZGVmaW5lIG91Y2gJCXVjcHBfb3VjaAorI2RlZmluZSBlcnJvcgkJdWNwcF9lcnJvcgorI2RlZmluZSB3YXJuaW5nCQl1Y3BwX3dhcm5pbmcKKworI2VuZGlmCmRpZmYgLS1naXQgYS92YXJzLmMgYi92YXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFhMTJmZQotLS0gL2Rldi9udWxsCisrKyBiL3ZhcnMuYwpAQCAtMCwwICsxLDEwNSBAQAorLyogICRWRVI6IHZiY2MgKHZhcnMuYykgJFJldmlzaW9uOiAxLjQxICQgICAqLworI2luY2x1ZGUgInZiYy5oIgorI2lmZGVmIEFNSUdBCitzdGF0aWMgY29uc3QgY2hhciAqX192ZXI9IiRWRVI6IHZiY2MgMC45aV9wcmUgKHh4Lnl5LjIwMjIpXHJcbiI7Citsb25nIF9fc3RhY2s9NjU1MzY7CisjZW5kaWYKK2NoYXIgKnMsKmlkZW50OworY2hhciBudW1iZXJbTUFYSV0sYnVmZltNQVhJXTsKK3R1bml0ICpmaXJzdF90dW5pdCwqbGFzdF90dW5pdDsKK3N0cnVjdF9kZWNsYXJhdGlvbiAqZmlyc3Rfc2RbTUFYTl0sKmxhc3Rfc2RbTUFYTl0sKm1lcmtfc2RmLCptZXJrX3NkbDsKK3N0cnVjdF9pZGVudGlmaWVyICpmaXJzdF9zaVtNQVhOXSwqbGFzdF9zaVtNQVhOXSwqbWVya19zaWYsKm1lcmtfc2lsOworaWRlbnRpZmllcl9saXN0ICpmaXJzdF9pbGlzdFtNQVhOXSwqbGFzdF9pbGlzdFtNQVhOXSwqbWVya19pbGlzdGYsKm1lcmtfaWxpc3RsOworbGxpc3QgKmZpcnN0X2xsaXN0LCpsYXN0X2xsaXN0OworaW50IG5lc3Rpbmc7CitoYXNodGFibGUgKmhhc2hfZXh0OworVmFyICpmaXJzdF92YXJbTUFYTl0sKmxhc3RfdmFyW01BWE5dLCptZXJrX3ZhcmYsKm1lcmtfdmFybCwqZmlyc3RfZXh0LCpsYXN0X2V4dDsKK1ZhciAqYmxvY2tfdmxhW01BWE5dOworbGxpc3QgKnZsYWRlZmxhYmVsc1tNQVhOXSwqdmxham1wbGFiZWxzW01BWE5dOwordmxhYWRqdXN0X2xpc3QgKnZsYWFkanVzdHNbTUFYTl07CitycGFpciBycDsKK0ZJTEUgKm91dCwqaWMxLCppYzIsKnBwb3V0LCpjbWRmaWxlOworaW50IGM5OT0xOworaW50IGZvcmNlX3N0YXRpY3MscHJlZmVyX3N0YXRpY3M7CitpbnQgcmFuZ2Vfb3B0OworaW50IG1lcmdlX3N0cmluZ3M7CitpbnQgc2VjX3Blcl9vYmo7CitpbnQgbWFza19vcHQ7CitpbnQgb3BlbmNsOworaW50IGRpc2FsbG93X3N0YXRpY3M7CitpbnQgaGVhZGVyX2NudDsKK2ludCB3cG8sd3BvX2tleTsKK0ZJTEUgKmlucHV0X3dwbzsKK2ludCBub2NvZGUsZG9udGRlbGV0ZTsKK2ludCBjb25zdF9leHByLGZvcl9kZWNsOworaW50IHJlZ2lzdGVycHJpPTIwMCxjdXJyZW50cHJpLGxvb3Bwcmk9MTA7CitpbnQgcmV0dXJuX3ZhbHVlLGJyZWFrX2xhYmVsLHN3aXRjaF90eXAsc3dpdGNoX2NvdW50LHN3aXRjaF9hY3Q7CitpbnQgcG9pbnRlcl9jYWxsOworaW50IHNvZnRmbG9hdDsKK2ludCBlY3BwOwordHlwZSAqcmV0dXJuX3R5cDsKK1ZhciAqcmV0dXJuX3ZhcjsKK3ptYXggbG9jYWxfb2Zmc2V0W01BWE5dOworaW50IGNfZmxhZ3NbTUFYQ0ZdPXsKKyAgICBWQUxGTEFHLFNUUklOR0ZMQUcsMCwwLAorICAgIFZBTEZMQUcsMCwwLDAsCisgICAgVkFMRkxBRyxGVU5DRkxBRyxGVU5DRkxBRyxWQUxGTEFHLAorICAgIFZBTEZMQUcsMCwwLDAsCisgICAgMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsCisgICAgVkFMRkxBRywwLDAsMCwwLAorICAgIDAsVkFMRkxBRywwLDAsMCxTVFJJTkdGTEFHLDAsCisgICAgVkFMRkxBRyxWQUxGTEFHLDAsVkFMRkxBRywwLAorICAgIEZVTkNGTEFHLEZVTkNGTEFHLEZVTkNGTEFHLDAsCisgICAgMCwwLDAsMCwKKyAgICAwLDAsMCxWQUxGTEFHLAorICAgIDAsCisgICAgVkFMRkxBRyxWQUxGTEFHLFZBTEZMQUcsVkFMRkxBRywKKyAgICBTVFJJTkdGTEFHLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwCit9OworY2hhciAqY19mbGFnc19uYW1lW01BWENGXT17CisgICAgIk8iLCJvIiwiaWMxIiwiaWMyIiwKKyAgICAiZGVidWciLCJub2FzbSIsInF1aWV0IiwiYW5zaSIsCisgICAgIm1heGVycm9ycyIsImRvbnR3YXJuIiwid2FybiIsIm1heG9wdHBhc3NlcyIsCisgICAgImlubGluZS1zaXplIiwiKyIsImNwcC1jb21tZW50cyIsIm5vLXRyaWdyYXBocyIsCisgICAgIm5vLWlubGluZS1wZWVwaG9sZSIsImZpbmFsIiwiRSIsImRvbnRrZWVwLWluaXRpYWxpemVkLWRhdGEiLAorICAgICJzdHJpcC1wYXRoIiwiZnAtYXNzb2NpYXRpdmUiLCJpc28iLCJuby1hbGlhcy1vcHQiLCJuby1tdWx0aXBsZS1jY3MiLAorICAgICJ1bnJvbGwtc2l6ZSIsImRvdWJsZS1wdXNoIiwic3BlZWQiLCJzaXplIiwidW5yb2xsLWFsbCIsCisgICAgInN0YWNrLWNoZWNrIiwiaW5saW5lLWRlcHRoIiwiZyIsImM5OSIsIndwbyIsImNtZCIsIm5vaXRyYSIsCisgICAgIm1pc3JhIiwiY29sb3JpbmciLCJkbWFsbG9jIiwiZGlzYWJsZSIsInNvZnQtZmxvYXQiLAorICAgICJtaXNyYXdhcm4iLCJtaXNyYWRvbnR3YXJuIiwicmVzZXJ2ZS1yZWciLCJlY3BwIiwKKyAgICAic2hvcnQtcHVzaCIsInVuc2lnbmVkLWNoYXIiLCJvcGVuY2wiLCJuby1pbmNsdWRlLXN0YWNrIiwKKyAgICAiZGVwcyIsImRlcHMtZm9yLWxpYnMiLCJuby1jcHAtd2FybiIsImhhc2gtc2l6ZSIsCisgICAgIndhcm5pbmdzLWFzLWVycm9ycyIsCisgICAgImNsaXN0LWNvcHktc3RhY2siLCJjbGlzdC1jb3B5LXN0YXRpYyIsImNsaXN0LWNvcHktcG9pbnRlciIsImlubGluZS1tZW1jcHkiLAorICAgICJkZXBvYmoiLCJjODkiLCJmb3JjZS1zdGF0aWNzIiwicHJlZmVyLXN0YXRpY3MiLCJyYW5nZS1vcHQiLCJtZXJnZS1zdHJpbmdzIiwKKyAgICAic2VjLXBlci1vYmoiLCJuby1lZmYtaWNzIiwiZWFybHktZWZmLWljcyIsIm1hc2stb3B0IgorfTsKK3VuaW9uIHBwaSBjX2ZsYWdzX3ZhbFtNQVhDRl07CitjaGFyICppbm5hbWU7CitjaGFyICoqdGFyZ2V0X21hY3JvczsKK1ZhciAqcmVnc2J1ZltNQVhSKzFdOworaW50IHJlZ2JuZXN0aW5nW01BWFIrMV07Citjb25zdF9saXN0ICpmaXJzdF9jbGlzdCwqbGFzdF9jbGlzdDsKK2ludCBhZnRlcmxhYmVsOwordGVycl9vdXQgZXJyX291dFtdPXsKKyNpbmNsdWRlICJlcnJvcnMuaCIKKyIiLDAKK307CitpbnQgZXJyX251bT1zaXplb2YoZXJyX291dCkvc2l6ZW9mKGVycl9vdXRbMF0pLTE7CisKK3RtaXNyYV9lcnJfb3V0IG1pc3JhX2Vycl9vdXRbXT17CisjaW5jbHVkZSAibWlzcmFfZXJyb3JzLmgiCiswLDAsIiIsMAorfTsKKworI2lmZGVmIEhBVkVfRUNQUAorc3RydWN0X2RlY2xhcmF0aW9uICpjdXJyZW50X2NsYXNzPTA7Cit0eXBlICpjdXJyZW50X2Z1bmM9MDsKK2VjcHBfZHRvcl9saXN0ICplY3BwX2RsaXN0W01BWE5dOworI2VuZGlmCisKK2NoYXIgKmN1cl9mdW5jPSJzaG91bGRuJ3QgaGFwcGVuISI7CitWYXIgKmN1cl9mdW5jdjsKK2NoYXIgKmNvcHlyaWdodD0idmJjYyBWMC45aSBwcmUgKGMpIGluIDE5OTUtMjAyMiBieSBWb2xrZXIgQmFydGhlbG1hbm4iOwpkaWZmIC0tZ2l0IGEvdmJjLmggYi92YmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDE3MGFjCi0tLSAvZGV2L251bGwKKysrIGIvdmJjLmgKQEAgLTAsMCArMSwyNzMgQEAKKy8qICAkVkVSOiB2YmNjICh2YmMuaCkgJFJldmlzaW9uOiAxLjIzICQgICAgKi8KKworI2luY2x1ZGUgInN1cHAuaCIKKworI2RlZmluZSBldmFsX2NvbnN0bihhKSBldmFsX2NvbnN0KCZhLT52YWwsYS0+bnR5cC0+ZmxhZ3MpCisKK3R5cGVkZWYgc3RydWN0IGlkZW50aWZpZXJfbGlzdHsKKyAgICBjaGFyICppZGVudGlmaWVyOworICAgIGludCBsZW5ndGg7CisgICAgc3RydWN0IGlkZW50aWZpZXJfbGlzdCAqbmV4dDsKK30gaWRlbnRpZmllcl9saXN0OwordHlwZWRlZiBzdHJ1Y3Qgc3RydWN0X2lkZW50aWZpZXJ7CisvKiAgICBpbnQgZmxhZ3M7Ki8KKyAgY2hhciAqaWRlbnRpZmllcjsKKyAgc3RydWN0IHN0cnVjdF9kZWNsYXJhdGlvbiAqc2Q7CisgIHN0cnVjdCBzdHJ1Y3RfaWRlbnRpZmllciAqbmV4dDsKK30gc3RydWN0X2lkZW50aWZpZXI7CisKKyNpZm5kZWYgTk9ERVMKKyNlcnJvciB3cm9uZyBub2RlCit0eXBlZGVmIHN0cnVjdCBub2RleworICAgIGludCBmbGFncyxsdmFsdWUsc2lkZWZ4OworICAgIHR5cGUgKm50eXA7CisgICAgc3RydWN0IG5vZGUgKmxlZnQ7CisgICAgc3RydWN0IG5vZGUgKnJpZ2h0OworICAgIHN0cnVjdCBhcmd1bWVudF9saXN0ICphbGlzdDsKKyAgICBjaGFyICppZGVudGlmaWVyOworICAgIHVuaW9uIGF0eXBzIHZhbDsKKyAgICBzdHJ1Y3Qgb2JqIG87Cit9IG5vZGU7CisKK3R5cGVkZWYgbm9kZSAqbnA7CisKKyNkZWZpbmUgTk9ERVMgc2l6ZW9mKG5vZGUpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgYXJndW1lbnRfbGlzdHsKKyAgbnAgIGFyZzsKKyAgc3RydWN0IGFyZ3VtZW50X2xpc3QgKm5leHQ7CisgIHN0cnVjdCBJQyAqcHVzaGljOworfSBhcmd1bWVudF9saXN0OworCisKKyNkZWZpbmUgTUFYSSA1MTIgLyogbWF4aW1hbGUgTGFlbmdlIHZvbiBJZGVudGlmaWVycyBpbiBCeXRlcyAgICAqLworI2RlZmluZSBNQVhOIDEyOCAvKiBtYXhpbWFsZSBWZXJzY2hhY2h0ZWx1bmcgdm9uIEJsb2Vja2VuICovCisKK2V4dGVybiBzdHJ1Y3QgdHVuaXQgKmZpcnN0X3R1bml0LCpsYXN0X3R1bml0OworZXh0ZXJuIHR5cGUgKmFyaXRoX3R5cCh0eXBlKix0eXBlICopOworZXh0ZXJuIHZvaWQgaW5zZXJ0X2NvbnN0bihucCk7CitleHRlcm4gaW50IGludF9lcncoaW50KTsKK2V4dGVybiB0eXBlICphbmRjb21wKG5wLG5wKTsKK2V4dGVybiB2b2lkIHNpbXBsZV9hbGdfb3B0KG5wKTsKK2V4dGVybiBpbnQgdHlwZV9leHByZXNzaW9uKG5wLHR5cGUgKiksCisgIGNvbXBhdGlibGVfdHlwZXModHlwZSAqLHR5cGUgKixpbnQpLAorICBjb21wYXJlX3NkKHN0cnVjdCBzdHJ1Y3RfZGVjbGFyYXRpb24gKixzdHJ1Y3Qgc3RydWN0X2RlY2xhcmF0aW9uICopOworI2lmIEhBVkVfQU9TNAorZXh0ZXJuIGludCBhb3M0X2F0dHIodHlwZSAqLGNoYXIgKik7CisjZW5kaWYKK2V4dGVybiBucCBpZGVudGlmaWVyX2V4cHJlc3Npb24odm9pZCksY29uc3RhbnRfZXhwcmVzc2lvbih2b2lkKSxzdHJpbmdfZXhwcmVzc2lvbih2b2lkKSwKKyAgIHBvc3RmaXhfZXhwcmVzc2lvbih2b2lkKSx1bmFyeV9leHByZXNzaW9uKHZvaWQpLGNhc3RfZXhwcmVzc2lvbih2b2lkKSwKKyAgIG11bHRpcGxpY2F0aXZlX2V4cHJlc3Npb24odm9pZCksYWRkaXRpdmVfZXhwcmVzc2lvbih2b2lkKSwKKyAgIHNoaWZ0X2V4cHJlc3Npb24odm9pZCkscmVsYXRpb25hbF9leHByZXNzaW9uKHZvaWQpLGVxdWFsaXR5X2V4cHJlc3Npb24odm9pZCksCisgICBhbmRfZXhwcmVzc2lvbih2b2lkKSxleGNsdXNpdmVfb3JfZXhwcmVzc2lvbih2b2lkKSwKKyAgIGluY2x1c2l2ZV9vcl9leHByZXNzaW9uKHZvaWQpLGxvZ2ljYWxfYW5kX2V4cHJlc3Npb24odm9pZCksCisgICBsb2dpY2FsX29yX2V4cHJlc3Npb24odm9pZCksY29uZGl0aW9uYWxfZXhwcmVzc2lvbih2b2lkKSwKKyAgIGFzc2lnbm1lbnRfZXhwcmVzc2lvbih2b2lkKSxleHByZXNzaW9uKHZvaWQpLHByaW1hcnlfZXhwcmVzc2lvbih2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgYXJndW1lbnRfbGlzdCAqYXJndW1lbnRfbGlzdF9leHByZXNzaW9uKHZvaWQpOworZXh0ZXJuIHN0cnVjdCBjb25zdF9saXN0ICpjbF9mcm9tX3N0cmluZyhjaGFyICpzdGFydCwgY2hhciAqZW5kKTsKKworZXh0ZXJuIG5wIG5ld19ub2RlKHZvaWQpOworCisvKiBwdWggICovCitleHRlcm4gaW50IGlzX2tleXdvcmQoY2hhciAqKTsKK2V4dGVybiB2b2lkIHByZShGSUxFICosbnApLHByYShGSUxFICosc3RydWN0IGFyZ3VtZW50X2xpc3QgKik7CitleHRlcm4gdm9pZCBmcmVlX2V4cHJlc3Npb24obnApLGZyZWVfYWxpc3Qoc3RydWN0IGFyZ3VtZW50X2xpc3QgKik7CitleHRlcm4gdm9pZCBjcGJleihjaGFyICptLGludCBja3cpLGNwbnVtKGNoYXIgKm0pLGtpbGxzcCh2b2lkKTsKK2V4dGVybiB2b2lkIGNvcHlfdG9rZW4oLypubyBwcm90b3R5cGUgYmVjYXVzZSBjcHAuaCBub3QgYWx3YXlzIGluY2x1ZGVkKi8pOworZXh0ZXJuIHZvaWQgcHVzaF90b2tlbigvKm5vIHByb3RvdHlwZSBiZWNhdXNlIGNwcC5oIG5vdCBhbHdheXMgaW5jbHVkZWQqLyk7CitleHRlcm4gdm9pZCBuZXh0X3Rva2VuKHZvaWQpOworZXh0ZXJuIHN0cnVjdCBzdHJ1Y3RfZGVjbGFyYXRpb24gKmFkZF9zZChzdHJ1Y3Qgc3RydWN0X2RlY2xhcmF0aW9uICosaW50KTsKK2V4dGVybiB2b2lkIGFkZF9zbChzdHJ1Y3Qgc3RydWN0X2RlY2xhcmF0aW9uICosc3RydWN0IHN0cnVjdF9saXN0ICgqKVtdKTsKK2V4dGVybiB2b2lkIGZyZWVfc2Qoc3RydWN0IHN0cnVjdF9kZWNsYXJhdGlvbiAqKTsKK2V4dGVybiB2b2lkIHBybChGSUxFICosc3RydWN0IHN0cnVjdF9kZWNsYXJhdGlvbiAqKTsKK2V4dGVybiBjaGFyICphZGRfaWRlbnRpZmllcihjaGFyICosaW50KTsKK2V4dGVybiB0eXBlICpkZWNsYXJhdG9yKHR5cGUgKiksKmRpcmVjdF9kZWNsYXJhdG9yKHR5cGUgKiksCisgICAgICAgICAgICpwb2ludGVyKHR5cGUgKiksKmRlY2xhcmF0aW9uX3NwZWNpZmllcnModm9pZCk7CitleHRlcm4gaW50IGRlY2xhcmF0aW9uKGludCksdHlwZV91bmNvbXBsZXRlKHR5cGUgKik7CitleHRlcm4gc3RydWN0IGNvbnN0X2xpc3QgKmluaXRpYWxpemF0aW9uKHR5cGUgKixpbnQsaW50LGludCxzdHJ1Y3Qgc3RydWN0X2RlY2xhcmF0aW9uICosc3RydWN0IGNvbnN0X2xpc3QgKik7CitleHRlcm4gdm9pZCBpbml0X2xvY2FsX2NvbXBvdW5kKHN0cnVjdCBWYXIgKik7CitleHRlcm4gem1heCBpbml0X2R5bl9zeixpbml0X2NvbnN0X3N6OworZXh0ZXJuIGludCBpbml0X2R5bl9jbnQsaW5pdF9jb25zdF9jbnQ7CitleHRlcm4gc3RydWN0IHN0cnVjdF9kZWNsYXJhdGlvbiAqZmluZF9zdHJ1Y3QoY2hhciAqLGludCk7CitleHRlcm4gdm9pZCBhZGRfc3RydWN0X2lkZW50aWZpZXIoY2hhciAqLHN0cnVjdCBzdHJ1Y3RfZGVjbGFyYXRpb24gKik7CitleHRlcm4gdm9pZCBmcmVlX3NpKHN0cnVjdCBzdHJ1Y3RfaWRlbnRpZmllciAqKTsKK2V4dGVybiBjaGFyICppZGVudDsKK2V4dGVybiBjaGFyIG51bWJlcltNQVhJXSxidWZmW01BWEldOworZXh0ZXJuIHN0cnVjdCBzdHJ1Y3RfZGVjbGFyYXRpb24gKmZpcnN0X3NkW01BWE5dLCpsYXN0X3NkW01BWE5dLCptZXJrX3NkZiwqbWVya19zZGw7CitleHRlcm4gc3RydWN0IHN0cnVjdF9pZGVudGlmaWVyICpmaXJzdF9zaVtNQVhOXSwqbGFzdF9zaVtNQVhOXSwqbWVya19zaWYsKm1lcmtfc2lsOworZXh0ZXJuIHN0cnVjdCBpZGVudGlmaWVyX2xpc3QgKmZpcnN0X2lsaXN0W01BWE5dLCpsYXN0X2lsaXN0W01BWE5dLCptZXJrX2lsaXN0ZiwqbWVya19pbGlzdGw7CitleHRlcm4gdm9pZCBmcmVlX2lsaXN0KHN0cnVjdCBpZGVudGlmaWVyX2xpc3QgKik7CitleHRlcm4gaW50IG5lc3Rpbmc7CitleHRlcm4gaGFzaHRhYmxlICpoYXNoX2V4dDsKK2V4dGVybiBzdHJ1Y3QgVmFyICpmaXJzdF92YXJbTUFYTl0sKmxhc3RfdmFyW01BWE5dLCptZXJrX3ZhcmYsKm1lcmtfdmFybCwqZmlyc3RfZXh0LCpsYXN0X2V4dDsKK2V4dGVybiBzdHJ1Y3QgVmFyICpibG9ja192bGFbTUFYTl07CitleHRlcm4gc3RydWN0IGxsaXN0ICp2bGFkZWZsYWJlbHNbTUFYTl0sKnZsYWptcGxhYmVsc1tNQVhOXTsKK2V4dGVybiBzdHJ1Y3QgdmxhYWRqdXN0X2xpc3QgKnZsYWFkanVzdHNbTUFYTl07CitleHRlcm4gdm9pZCBmcmVldmwodm9pZCk7CitleHRlcm4gdm9pZCBjbGVhcnZsKHZvaWQpOworZXh0ZXJuIHZvaWQgZnJlZV92YXIoc3RydWN0IFZhciAqKTsKK2V4dGVybiB2b2lkIHZhcl9kZWNsYXJhdGlvbih2b2lkKTsKK2V4dGVybiBpbnQgc3RvcmFnZV9jbGFzc19zcGVjaWZpZXJzKHZvaWQpOworZXh0ZXJuIHZvaWQgZW50ZXJfYmxvY2sodm9pZCksbGVhdmVfYmxvY2sodm9pZCk7CitleHRlcm4gc3RydWN0IFZhciAqZmluZF92YXIoY2hhciAqLGludCk7CitleHRlcm4gc3RydWN0IFZhciAqZmluZF9leHRfdmFyKGNoYXIgKik7CitleHRlcm4gc3RydWN0IFZhciAqYWRkX3ZhcihjaGFyICosdHlwZSAqLGludCxzdHJ1Y3QgY29uc3RfbGlzdCAqKTsKK2V4dGVybiB2b2lkIGZpX2Zyb21fYXR0cihzdHJ1Y3QgVmFyICopOworZXh0ZXJuIHZvaWQgbmVlZHMoY2hhciAqcyk7CisKKworZXh0ZXJuIGludCB1c3o7CisKK2V4dGVybiBpbnQgYzk5OworZXh0ZXJuIGludCBvcGVuY2w7CitleHRlcm4gaW50IG1lcmdlX3N0cmluZ3M7CitleHRlcm4gaW50IG1hc2tfb3B0OworZXh0ZXJuIGludCBkaXNhbGxvd19zdGF0aWNzOworZXh0ZXJuIGludCBoZWFkZXJfY250OworZXh0ZXJuIGludCBzb2Z0ZmxvYXQ7CisjZGVmaW5lIE1BR0lDX1dQTyAxMjMKK2V4dGVybiBpbnQgd3BvLHdwb19rZXk7CitleHRlcm4gRklMRSAqaW5wdXRfd3BvOworCitleHRlcm4gdm9pZCBnZW5fSUMobnAsaW50LGludCksY29udmVydChucCxpbnQpLGdlbl9sYWJlbChpbnQpOworZXh0ZXJuIHZvaWQgZ2VuX3Rlc3Qoc3RydWN0IG9iaiAqLGludCxpbnQsaW50KTsKK2V4dGVybiB2b2lkIHNhdmVzY3JhdGNoKGludCxzdHJ1Y3QgSUMgKixpbnQsc3RydWN0IG9iaiAqKTsKK3R5cGVkZWYgc3RydWN0IHJlZ2FyZ3NfbGlzdHsKKyAgc3RydWN0IHJlZ2FyZ3NfbGlzdCAqbmV4dDsKKyAgc3RydWN0IGFyZ3VtZW50X2xpc3QgKmFsOworICBpbnQgcmVnOworICBzdHJ1Y3QgVmFyICp2OworICBpbnQgcnNhdmVkOworfSByZWdhcmdzX2xpc3Q7CisjaWZkZWYgSEFWRV9SRUdQQVJNUworZXh0ZXJuIHptYXggcHVzaF9hcmdzKHN0cnVjdCBhcmd1bWVudF9saXN0ICosc3RydWN0IHN0cnVjdF9kZWNsYXJhdGlvbiAqLGludCxzdHJ1Y3QgcmVnYXJnc19saXN0ICoqLHN0cnVjdCByZWdfaGFuZGxlICosc3RydWN0IG9iaiAqLHR5cGUgKixpbnQsdHlwZSAqKTsKKyNlbHNlCitleHRlcm4gem1heCBwdXNoX2FyZ3Moc3RydWN0IGFyZ3VtZW50X2xpc3QgKixzdHJ1Y3Qgc3RydWN0X2RlY2xhcmF0aW9uICosaW50LHN0cnVjdCByZWdhcmdzX2xpc3QgKiopOworI2VuZGlmCitleHRlcm4gaW50IGFsbG9jcmVnKGludCxpbnQpOworZXh0ZXJuIHZvaWQgZnJlZV9yZWcoaW50KSxhbGxvY19oYXJkcmVnKGludCk7CisKK2V4dGVybiBGSUxFICpvdXQsKmljMSwqaWMyLCpwcG91dCwqY21kZmlsZTsKKworZXh0ZXJuIHZvaWQgc3RhdGVtZW50KHZvaWQpLGxhYmVsZWRfc3RhdGVtZW50KHZvaWQpLGlmX3N0YXRlbWVudCh2b2lkKTsKK2V4dGVybiB2b2lkIHN3aXRjaF9zdGF0ZW1lbnQodm9pZCksd2hpbGVfc3RhdGVtZW50KHZvaWQpLGZvcl9zdGF0ZW1lbnQodm9pZCk7CitleHRlcm4gdm9pZCBkb19zdGF0ZW1lbnQodm9pZCksZ290b19zdGF0ZW1lbnQodm9pZCksY29udGludWVfc3RhdGVtZW50KHZvaWQpOworZXh0ZXJuIHZvaWQgYnJlYWtfc3RhdGVtZW50KHZvaWQpLHJldHVybl9zdGF0ZW1lbnQodm9pZCk7CitleHRlcm4gdm9pZCBleHByZXNzaW9uX3N0YXRlbWVudCh2b2lkKSxjb21wb3VuZF9zdGF0ZW1lbnQodm9pZCk7CitleHRlcm4gdm9pZCB0cmFuc2xhdGlvbl91bml0KHZvaWQpOworZXh0ZXJuIGludCBtYWluKGludCwgY2hhciAqW10pOworZXh0ZXJuIGludCBub2NvZGUsZG9udGRlbGV0ZSxyZWdpc3RlcnByaSxsb29wcHJpLGN1cnJlbnRwcmk7CitleHRlcm4gaW50IG5vX2Nhc3RfZnJlZTsKKworZXh0ZXJuIG5wIG1ha2Vwb2ludGVyKG5wKTsKKwordHlwZWRlZiBzdHJ1Y3QgdmxhYWRqdXN0X2xpc3QgeworICBzdHJ1Y3QgSUMgKmJyYW5jaCwqZmlyc3Q7CisgIHN0cnVjdCB2bGFhZGp1c3RfbGlzdCAqbmV4dDsKK30gdmxhYWRqdXN0X2xpc3Q7CisKK2V4dGVybiBpbnQgc3dpdGNoX3R5cCxzd2l0Y2hfY291bnQsc3dpdGNoX2FjdDsKK3R5cGVkZWYgc3RydWN0IGxsaXN0eworICAgIGNoYXIgKmlkZW50aWZpZXI7CisgICAgaW50IGxhYmVsLGZsYWdzLHN3aXRjaF9jb3VudDsKKyAgICBzdHJ1Y3QgbGxpc3QgKm5leHQ7CisgICAgdW5pb24gYXR5cHMgdmFsOworfSBsbGlzdDsKKyNkZWZpbmUgTEFCRUxERUZJTkVEIDEKKyNkZWZpbmUgTEFCRUxVU0VEIDIKKyNkZWZpbmUgTEFCRUxERUZBVUxUIDQKKyNkZWZpbmUgTFNJWkUgc2l6ZW9mKHN0cnVjdCBsbGlzdCkKK2V4dGVybiBzdHJ1Y3QgbGxpc3QgKmZpcnN0X2xsaXN0LCpsYXN0X2xsaXN0OworZXh0ZXJuIHN0cnVjdCBsbGlzdCAqZmluZF9sYWJlbChjaGFyICopLCphZGRfbGFiZWwoY2hhciAqKTsKK2V4dGVybiB2b2lkIGZyZWVfbGxpc3Qoc3RydWN0IGxsaXN0ICopOworCitleHRlcm4gaW50IGVuZG9rLHJldHVybl9sYWJlbCxyZXR1cm5fdmFsdWUsYnJlYWtfbGFiZWw7CitleHRlcm4gaW50IGNvbnN0X2V4cHIsZm9yX2RlY2w7CitleHRlcm4gc3RydWN0IFZhciAqcmV0dXJuX3ZhcjsKK2V4dGVybiB0eXBlICpyZXR1cm5fdHlwOworZXh0ZXJuIHptYXggbG9jYWxfb2Zmc2V0W01BWE5dOworCitleHRlcm4gdm9pZCBzY3JhdGNoX3ZhcihzdHJ1Y3Qgb2JqICosaW50LHR5cGUgKik7CitleHRlcm4gdm9pZCBnZXRfc2NyYXRjaChzdHJ1Y3Qgb2JqICosaW50LGludCx0eXBlICopOworZXh0ZXJuIHZvaWQgZ2VuX2NvbmQoc3RydWN0IG9iaiAqLGludCxpbnQsaW50KTsKKworI2RlZmluZSBNQVhDRiA3MAorZXh0ZXJuIGludCBjX2ZsYWdzW01BWENGXTsKK2V4dGVybiBjaGFyICpjX2ZsYWdzX25hbWVbTUFYQ0ZdOworZXh0ZXJuIHVuaW9uIHBwaSBjX2ZsYWdzX3ZhbFtNQVhDRl07CisKK2V4dGVybiBGSUxFICpvcGVuX291dChjaGFyICosY2hhciAqKTsKKworZXh0ZXJuIGNoYXIgKmlubmFtZTsKKworZXh0ZXJuIHZvaWQgZ2VuX3ZhcnMoc3RydWN0IFZhciAqKTsKKworLyogIEZvcm1hdCBkZXIgVGFiZWxsZSBmdWVyIEZlaGxlcm1lbGR1bmdlbiAqLwordHlwZWRlZiBzdHJ1Y3QgZXJyX291dHsKKyAgICBjaGFyICp0ZXh0OworICAgIGludCAgZmxhZ3M7Cit9IHRlcnJfb3V0OworCisKKy8qICBGbGFncyBmdWVyIGVycl9vdXQuZmxhZ3MgICAgKi8KKyNkZWZpbmUgRVJST1IgICAgICAgMQorI2RlZmluZSBXQVJOSU5HICAgICAyCisjZGVmaW5lIEFOU0lWICAgICAgIDQKKyNkZWZpbmUgSU5URVJOQUwgICAgOAorI2RlZmluZSBGQVRBTCAgICAgIDE2CisjZGVmaW5lIE1FU1NBR0UgICAgMzIKKyNkZWZpbmUgRE9OVFdBUk4gICA2NAorI2RlZmluZSBQUkVQUk9DICAgMTI4CisjZGVmaW5lIE5PTElORSAgICAyNTYKKyNkZWZpbmUgSU5GVU5DICAgIDUxMgorI2RlZmluZSBJTklDICAgICAxMDI0CisjZGVmaW5lIE5PUkFVUyAgIDIwNDgKKworZXh0ZXJuIHN0cnVjdCBlcnJfb3V0IGVycl9vdXRbXTsKK2V4dGVybiBpbnQgZXJyX251bTsKKwordHlwZWRlZiBzdHJ1Y3QgbWlzcmFfZXJyX291dHsKKwkJaW50IGNoYXB0ZXI7CisJCWludCBydWxlOworCQljaGFyICp0ZXh0OworCQlpbnQgZmxhZ3M7Cit9IHRtaXNyYV9lcnJfb3V0OworCitleHRlcm4gc3RydWN0IG1pc3JhX2Vycl9vdXQgbWlzcmFfZXJyX291dFtdOworCisjZGVmaW5lIE1JU1JBCQkJCQkJCQkxCisjZGVmaW5lCU1JU1JBX1BSRVBST0MJCQkJMgorI2RlZmluZSBNSVNSQV8yMDA0CQkJCQk0CisjZGVmaW5lIE1JU1JBXzE5OTgJCQkJCTgKKworI2lmZGVmIEhBVkVfRUNQUAordHlwZWRlZiBzdHJ1Y3QgZWNwcF9kdG9yX2xpc3QgeworICBzdHJ1Y3QgVmFyICp2YXI7CisgIHN0cnVjdCBlY3BwX2R0b3JfbGlzdCAqbmV4dDsKK30gZWNwcF9kdG9yX2xpc3Q7CitleHRlcm4gc3RydWN0IHN0cnVjdF9kZWNsYXJhdGlvbiAqY3VycmVudF9jbGFzczsKK2V4dGVybiB0eXBlICpjdXJyZW50X2Z1bmM7CitleHRlcm4gc3RydWN0IGVjcHBfZHRvcl9saXN0ICplY3BwX2RsaXN0W01BWE5dOworc3RydWN0IFZhciAqZWNwcF9maW5kX2V4dF92YXIoY2hhciAqaWRlbnRpZmllcik7CitzdHJ1Y3QgVmFyICplY3BwX2ZpbmRfdmFyKGNoYXIgKmlkZW50aWZpZXIpOworc3RydWN0IHN0cnVjdF9kZWNsYXJhdGlvbiAqZWNwcF9maW5kX3Njb3BlKGNoYXIqIG5lc3RlZF9uYW1lLGNoYXIqKiBpZGVudGlmaWVyKTsKK3N0cnVjdCBzdHJ1Y3RfbGlzdCAqZWNwcF9maW5kX21lbWJlcihjaGFyKiBpZGVudGlmaWVyLHN0cnVjdCBzdHJ1Y3RfZGVjbGFyYXRpb24gKnNjb3BlLHN0cnVjdCBzdHJ1Y3RfZGVjbGFyYXRpb24qKiByZXRfc2NvcGUsaW50IHNlYXJjaF9mbGFnKTsKK3ZvaWQgZWNwcF9hdXRvX2NhbGxfZHRvcnMoKTsKK2ludCBlY3BwX2lzX2ZyaWVuZChzdHJ1Y3Qgc3RydWN0X2RlY2xhcmF0aW9uICpjbGFzcyk7CisjZW5kaWYKKworZXh0ZXJuIGludCBhZnRlcmxhYmVsOworCitleHRlcm4gaW50IGVycm9yczsKKworZXh0ZXJuIGludCBmbG9hdF91c2VkOworZXh0ZXJuIGNoYXIgKmN1cl9mdW5jOworZXh0ZXJuIFZhciAqY3VyX2Z1bmN2OworZXh0ZXJuIGludCBsaW5lOworZXh0ZXJuIHZvaWQgZnJlZV9jbGlzdChzdHJ1Y3QgY29uc3RfbGlzdCAqKTsKK2V4dGVybiBzdHJ1Y3QgY29uc3RfbGlzdCAqZmlyc3RfY2xpc3QsKmxhc3RfY2xpc3Q7CitleHRlcm4gc3RydWN0IFZhciAqcmVnc2J1ZltNQVhSKzFdOworZXh0ZXJuIGludCByZWdibmVzdGluZ1tNQVhSKzFdOworCisKZGlmZiAtLWdpdCBhL3ZiY2NfY3BwLmggYi92YmNjX2NwcC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFlMTRiMGYKLS0tIC9kZXYvbnVsbAorKysgYi92YmNjX2NwcC5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qICAkVkVSOiB2YmNjICh2YmNjX2NwcC5oKSAkUmV2aXNpb246IDEuMiAkICAgICAqLworCisKKy8qIGZpeCBzb21lIG5hbWUgY2xhc2hlcyBiZXR3ZWVuIHZiY2MgYW5kIHVjcHAgYW5kIGluY2x1ZGUgY3BwLmggKi8KKy8qIGhhcyB0byBiZSBpbmNsdWRlIHByaW9yIHRvIG90aGVyIHZiY2MgaW5jbHVkZXMgICAgICAgICAgICAgICAgKi8KKworCisjZGVmaW5lIFNUUklORyBUX1NUUklORworI2RlZmluZSBDSEFSIFRfQ0hBUgorI2RlZmluZSBDQVNUIFRfQ0FTVAorI2RlZmluZSBBTkQgVF9BTkQKKyNkZWZpbmUgT1IgVF9PUgorI2RlZmluZSBDT0xPTiBUX0NPTE9OCisjZGVmaW5lIExPUiBUX0xPUgorI2RlZmluZSBMQU5EIFRfTEFORAorI2RlZmluZSBNSU5VUyBUX01JTlVTCisKKyNkZWZpbmUgTk9fVUNQUF9FUlJPUl9GVU5DVElPTlMgMQorI2luY2x1ZGUgInVjcHAvY3BwLmgiCisKK3R5cGVkZWYgc3RydWN0IHRva2VuIHRva2VuOwordHlwZWRlZiBzdHJ1Y3QgbGV4ZXJfc3RhdGUgbGV4ZXJfc3RhdGU7Cit0eXBlZGVmIHN0cnVjdCBzdGFja19jb250ZXh0IHN0YWNrX2NvbnRleHQ7CisKK2V4dGVybiB0b2tlbiAqY3RvazsKK2V4dGVybiBsZXhlcl9zdGF0ZSBsczsKKworI3VuZGVmIFNUUklORworI3VuZGVmIENIQVIKKyN1bmRlZiBDQVNUCisjdW5kZWYgQU5ECisjdW5kZWYgT1IKKyN1bmRlZiBDT0xPTgorI3VuZGVmIExPUgorI3VuZGVmIExBTkQKKyN1bmRlZiBNSU5VUworCisjZGVmaW5lIG5leHRfdG9rZW4gdmJjY19uZXh0X3Rva2VuCisjdW5kZWYgZXJyb3IKKworI3VuZGVmIFNfVE9LRU4KKyNkZWZpbmUgU19UT0tFTih4KSAoKHgpID49IE5VTUJFUiAmJiAoeCkgPD0gVF9DSEFSKSAKKyAKKyNkZWZpbmUgdHRNV1MoeCkgICAgICAgICgoeCkgPT0gTk9ORSB8fCAoeCkgPT0gQ09NTUVOVCB8fCAoeCkgPT0gT1BUX05PTkUpCisjZGVmaW5lIHR0V0hJKHgpICAgICAgICAodHRNV1MoeCkgfHwgKHgpID09IE5FV0xJTkUpCisKK2NoYXIgKnVjcHBfdG9rZW5fbmFtZSgpOwpkaWZmIC0tZ2l0IGEvdmJwcC5oIGIvdmJwcC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFhNzBmMDcKLS0tIC9kZXYvbnVsbAorKysgYi92YnBwLmgKQEAgLTAsMCArMSw4OSBAQAorI2lmbmRlZiBfVkJQUF9ICisjZGVmaW5lIF9WQlBQX0ggMQorCisvKiB2YnBwLmgKKyAqIGxhc3QgY2hhbmdlOiAxNy4wOC4xOTk1IFRob3JzdGVuIFNjaGFhcHMKKyAqLworCisvKiBzdHJub2RlLXR5cGVzICovCisjZGVmaW5lIE5PUk1BTCAgICAgIDAgICAgICAgICAgLyogYW55dGhpbmc6IGJyYWNrZXRzLCssLSwvLCosIGV0Yy4uICovCisjZGVmaW5lIFBQX0lERU5UICAgIDEgICAgICAgICAgLyogcG9zc2libGUgaWRlbnRpZmllciAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFSR1VNRU5UICAgIDIgICAgICAgICAgLyogYXJndW1lbnQ6IHNlZSBudW1iZXIgICAgICAgICAgICAgICovCisjZGVmaW5lIFBQX1NUUiAgICAgIDMgICAgICAgICAgLyogc3RyaW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE5VTUJFUiAgICAgIDQgICAgICAgICAgLyogbnVtYmVycyAoMTIzLDB4MDAsMEwsLi4pICAgICAgICAgICovCisjZGVmaW5lIFNQQUNFICAgICAgIDUgICAgICAgICAgLyogc3BhY2VzLCB0YWJzLCBldGMuICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNQRUNJQUwgICAgIDYgICAgICAgICAgLyogZmxhZ3M9MS0+IyxmbGFncz0yLT4jIyAgICAgICAgICAgICovCisKKy8qIGZsYWdzIGZvciB0eXBlPT1TUEVDSUFMICovCisjZGVmaW5lIE5PTkUgICAgICAgIDAKKyNkZWZpbmUgVE9TVFJJTkcgICAgMSAgICAgICAgICAvKiAjZGVmaW5lIHQoYykgI2MgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgS0lMTFNQQUNFUyAgMiAgICAgICAgICAvKiAjZGVmaW5lIHQoYSxiKSBhIyNiICAgICAgICAgICAgICAgKi8KKworc3RydWN0IHN0cm5vZGV7CisgIGNoYXIgICAgICAgICAgICpzdHI7ICAgICAgICAgLyogdGhlIHN0cmluZyA9OCkgYWgsIHlvdSBndWVzc2VkIHRoYXQuICovCisgIGludCAgICAgICAgICAgICBsZW47ICAgICAgICAgLyogdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nICAgICAgICAgICAgICovCisgIGludCAgICAgICAgICAgICBmbGFnczsgICAgICAgLyogZmxhZ3M6IHNlZSBhYm92ZSAgICAgICAgICAgICAgICAgICAgICovCisgIGludCAgICAgICAgICAgICB0eXBlOyAgICAgICAgLyogdHlwZTogIHNlZSBhYm92ZSAgICAgICAgICAgICAgICAgICAgICovCisgIGludCAgICAgICAgICAgICBudW1iZXI7ICAgICAgLyogb25seSB2YWxpZCBpZiB0eXBlPT1BUkdVTUVOVCAgICAgICAgICovCisgIHN0cnVjdCBzdHJub2RlICpwcmV2LCpuZXh0OyAgLyogcG9pbnRlcnMgdG8gcHJldmlvdXMgYW5kIG5leHQgbm9kZSBvciBOVUxMICovCit9OworCisvKiBNYWNyby1Ob2RlLUZsYWdzICovCisjZGVmaW5lIEZVTkNUSU9OICAxICAgICAvKiBmb3IgbWFjcm9zIGNoYW5naW5nIGZyb20gbGluZSB0byBsaW5lLCBlLmcuICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICBfX0xJTkVfXywgX19GSUxFX18sIF9fVElNRV9fIGV0Yy4uICovCisjZGVmaW5lIFBBUkFNRVRFUiAyICAgICAvKiBNYWNybyBoYXMgYXJndW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE5PREVMRVRFICA0ICAgICAvKiBNYWNybyBjYW5ub3QgYmUgVU5ERUZpbmVkLCBlLmcuIF9fVElNRV9fLCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICBfX0RBVEVfXywgX19TVERDX18gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE5PUkVERUYgICA4ICAgICAvKiBNYWNybyBjYW5ub3QgYmUgcmVERUZJTkVELCAocy4gYWJvdmUsIGJ1dCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICBub3QgX19TVERDX18pICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEZ1bmN0aW9uLU51bWJlcnMgZm9yIEZVTkNUSU9OLU1hY3JvcyAqLworI2RlZmluZSBGVU5DTElORSAgMSAgICAgLyogX19MSU5FX18gKi8KKyNkZWZpbmUgRlVOQ0ZJTEUgIDIgICAgIC8qIF9fRklMRV9fICovCisjZGVmaW5lIEZVTkNEQVRFICAzICAgICAvKiBfX0RBVEVfXyAqLworI2RlZmluZSBGVU5DVElNRSAgNCAgICAgLyogX19USU1FX18gKi8KKyAgICAgICAvKiBfX1NURENfXyBpcyBhIG5vcm1hbCBtYWNybywgYnV0IGNhbm5vdCBiZSBkZWxldGVkICovCisKK3N0cnVjdCBtbm9kZXsKKyAgY2hhciAgICAgICAgICAgKm5hbWU7ICAgICAgIC8qIG5hbWUsIGUuZy4gU1FSICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGNoYXIgICAgICAgICAgICphcmdzOyAgICAgICAvKiBhcmd1bWVudHMsIGUuZy4gKHgpICAgICAgICAgICAgICAgICAgICAqLworICBjaGFyICAgICAgICAgICAqdG9rZW47ICAgICAgLyogZGVmaW5pdGlvbiBhcyBzdHJpbmcsIGUuZy4gKCh4KSooeCkpICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJFIENBUkVGVUxMOiBtYXkgYmUgTlVMTCBpbiB0aGUgZnV0dXJlICovCisgIHN0cnVjdCBzdHJub2RlICp0b2tlbmxpc3Q7ICAvKiBkZWZpbml0aW9uIGFzIGxpc3QgICAgICAgICAgICAgICAgICAgICAqLworICBpbnQgICAgICAgICAgICAgZmxhZ3M7ICAgICAgLyogZmxhZ3MsIHNlZSBhYm92ZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50ICAgICAgICAgICAgIG51bWFyZ3M7ICAgIC8qIG51bWJlciBvZiBhcmd1bWVudHMgICAgICAgICAgICAgICAgICAgICovCisgIGludCAgICAgICAgICAgICBmdW5jbnVtOyAgICAvKiBudW1iZXIgb2YgZnVuY3Rpb24gKHNlZSBhYm92ZSkgICAgICAgICAqLworICBzdHJ1Y3QgbW5vZGUgICAqcHJldiwqbmV4dDsgLyogcG9pbnRlcnMgdG8gcHJldmlvcyBhbmQgbmV4dCBub2RlIG9yIE5VTEwgKi8KK307CisKKy8qIFJldHVybi1Db2RlcyBmb3IgRXhwYW5kTGlzdC9FeHBhbmRBcmdNYWtyby9DbG9uZUFyZy1GdW5jdGlvbnMgKi8KKyNkZWZpbmUgT0sgICAgICAgICAgICAwCisjZGVmaW5lIE9VVF9PRl9NRU0gICAtMQorI2RlZmluZSBOVU1fT0ZfQVJHUyAgLTIKKyNkZWZpbmUgQVJHX0VYUEVDVEVEIC0zCisKK3ZvaWQgICAgICAgICAgICBBZGRNYWtyb05vZGUoc3RydWN0IG1ub2RlICoqLCBzdHJ1Y3QgbW5vZGUgKik7Cit2b2lkICAgICAgICAgICAgSW5zZXJ0TWFrcm9Ob2RlKHN0cnVjdCBtbm9kZSAqKiwgc3RydWN0IG1ub2RlICosIHN0cnVjdCBtbm9kZSAqKTsKK3ZvaWQgICAgICAgICAgICBSZW1NYWtyb05vZGUoc3RydWN0IG1ub2RlICoqLCBzdHJ1Y3QgbW5vZGUgKik7CitzdHJ1Y3QgbW5vZGUgICAqRmluZE1ha3JvTm9kZShzdHJ1Y3QgbW5vZGUgKiwgY2hhciAqLCBpbnQpOwordm9pZCAgICAgICAgICAgIERlbE1ha3JvTm9kZShzdHJ1Y3QgbW5vZGUgKiosIHN0cnVjdCBtbm9kZSAqKTsKK3ZvaWQgICAgICAgICAgICBEZWxNYWtyb0xpc3Qoc3RydWN0IG1ub2RlICoqKTsKKwordm9pZCAgICAgICAgICAgIEFkZFN0ck5vZGUoc3RydWN0IHN0cm5vZGUgKiosIHN0cnVjdCBzdHJub2RlICosIGNoYXIgKik7Cit2b2lkICAgICAgICAgICAgUmVtU3RyTm9kZShzdHJ1Y3Qgc3Rybm9kZSAqKiwgc3RydWN0IHN0cm5vZGUgKik7CisvKiBzdHJ1Y3Qgc3Rybm9kZSAqRmluZFN0ck5vZGUoc3RydWN0IHN0cm5vZGUgKiwgY2hhciAqLCBpbnQpOyAqLwordm9pZCAgICAgICAgICAgIERlbFN0ck5vZGUoc3RydWN0IHN0cm5vZGUgKiosIHN0cnVjdCBzdHJub2RlICopOwordm9pZCAgICAgICAgICAgIERlbFN0ckxpc3Qoc3RydWN0IHN0cm5vZGUgKiopOworc3RydWN0IHN0cm5vZGUgKkNsb25lU3RyTGlzdChzdHJ1Y3Qgc3Rybm9kZSAqLCBzdHJ1Y3Qgc3Rybm9kZSAqKTsKK3N0cnVjdCBzdHJub2RlICpEb01ha3JvRnVuY3Rpb24oc3RydWN0IG1ub2RlICopOworCitzdHJ1Y3Qgc3Rybm9kZSAqU3RyMkxpc3QoY2hhciAqKTsKK2ludCAgICAgICAgICAgICBMaXN0MlN0cihzdHJ1Y3Qgc3Rybm9kZSAqLCBjaGFyICosIGludCk7CisKK2ludCAgICAgICAgICAgICBFeHBhbmRMaXN0KHN0cnVjdCBzdHJub2RlICoqKTsKKworc3RydWN0IG1ub2RlICAgKlBhcnNlSWRlbnRpZmllcihjaGFyICopOworaW50ICAgICAgICAgICAgIFByZVBhcnNlKHZvaWQpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvdmNwci92Y3ByLmMgYi92Y3ByL3ZjcHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmEwYmZmCi0tLSAvZGV2L251bGwKKysrIGIvdmNwci92Y3ByLmMKQEAgLTAsMCArMSw0NDEgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJ2Y3ByLmgiCisKK2xpbmUgKmZpcnN0X2xpbmUsKmxhc3RfbGluZTsKKworaW50IGRlYnVnPTA7CisKKworCitpbnQgbGFiY250LG1heGxhYjsKK2xhYmluZm8gKmxhYmluZm9zOworCitjb25zdCBjaGFyIHZzX2NvcHlyaWdodFtdPSJ2Y3ByIGNvZGUgY29tcHJlc3NvciBWMC4xIChjKSAyMDIwIGJ5IFZvbGtlciBCYXJ0aGVsbWFubiI7CisKKworCit2b2lkICpteW1hbGxvYyhzaXplX3Qgc3opCit7CisgIHZvaWQgKnA9bWFsbG9jKHN6KTsKKyAgaWYoIXApeworICAgIGZwcmludGYoc3RkZXJyLCJPdXQgb2YgbWVtb3J5IVxuIik7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9CisgIHJldHVybiBwOworfQorCittYXRjaCAqbmV3X21hdGNoKHZvaWQpCit7CisgIG1hdGNoICpuZXc7CisgIG5ldz1teW1hbGxvYyhzaXplb2YoKm5ldykpOworICBuZXctPm5leHQ9MDsKKyAgbmV3LT5zdGFydD0wOworICBuZXctPm1heD0wOworICByZXR1cm4gbmV3OworfQorCit2b2lkIGV4dGVuZF9sYWJpbmZvcyhpbnQgbikKK3sKKyAgaWYobj5tYXhsYWIpCisgICAgbWF4bGFiPW47CisgIC8qIFRPRE8gKi8KK30KKworaW50IG5ld19sYWJlbCh2b2lkKQoreworICBtYXhsYWIrKzsKKyAgZXh0ZW5kX2xhYmluZm9zKG1heGxhYik7CisgIHJldHVybiBtYXhsYWI7Cit9CisKK2xpbmUgKm5ld19saW5lKHZvaWQpCit7CisgIGxpbmUgKm5ldzsKKyAgbmV3PW15bWFsbG9jKHNpemVvZigqbmV3KSk7CisgIG5ldy0+bmV4dD1uZXctPnByZXY9MDsKKyAgbmV3LT5jb2RlPTA7CisgIG5ldy0+ZmxhZ3M9MDsKKyAgbmV3LT5zaXplPTA7CisgIG5ldy0+bDE9bmV3LT5sMj0wOworICByZXR1cm4gbmV3OworfQorCit2b2lkIGFkZF9saW5lKGxpbmUgKm5ldykKK3sKKyAgaWYobGFzdF9saW5lKXsKKyAgICBsYXN0X2xpbmUtPm5leHQ9bmV3OworICAgIG5ldy0+cHJldj1sYXN0X2xpbmU7CisgICAgbGFzdF9saW5lPW5ldzsKKyAgfWVsc2V7CisgICAgZmlyc3RfbGluZT1sYXN0X2xpbmU9bmV3OworICB9Cit9CisKK3ZvaWQgaW5zZXJ0X2xpbmUobGluZSAqYWZ0ZXIsIGxpbmUgKm5ldykKK3sKKyAgaWYoIWFmdGVyKXsKKyAgICBuZXctPm5leHQ9Zmlyc3RfbGluZTsKKyAgICBmaXJzdF9saW5lPW5ldzsKKyAgfWVsc2V7CisgICAgbmV3LT5uZXh0PWFmdGVyLT5uZXh0OworICAgIGFmdGVyLT5uZXh0PW5ldzsKKyAgfQorICBuZXctPnByZXY9YWZ0ZXI7CisgIGlmKG5ldy0+bmV4dCkKKyAgICBuZXctPm5leHQtPnByZXY9bmV3OworICBlbHNlCisgICAgbGFzdF9saW5lPW5ldzsKK30KKwordm9pZCBmcmVlX2xpbmUobGluZSAqcCkKK3sKKyAgaWYocC0+Y29kZSkgZnJlZShwLT5jb2RlKTsKKyAgZnJlZShwKTsKK30KKwordm9pZCByZW1vdmVfbGluZShsaW5lICpwKQoreworICBpZihwLT5wcmV2KSBwLT5wcmV2LT5uZXh0PXAtPm5leHQ7IGVsc2UgZmlyc3RfbGluZT1wLT5uZXh0OworICBpZihwLT5uZXh0KSBwLT5uZXh0LT5wcmV2PXAtPnByZXY7IGVsc2UgbGFzdF9saW5lPXAtPnByZXY7Cit9CisKKworCisKKworCit2b2lkIHJlYWRfbGluZXMoRklMRSAqZikKK3sKKyAgY2hhciBidWZbTUFYTEVOXSwqcDsKKyAgbGluZSAqbmV3OworICBpbnQgaWR4PTA7CisKKyAgd2hpbGUoMSl7CisgICAgcD1mZ2V0cyhidWYsTUFYTEVOLGYpOworICAgIGlmKGZlb2YoZikpCisgICAgICByZXR1cm47CisgICAgbmV3PW5ld19saW5lKCk7CisgICAgcGFyc2VfbGluZShidWYsbmV3KTsKKyAgICBuZXctPmNvZGU9bXltYWxsb2Moc3RybGVuKGJ1ZikrMSk7CisgICAgc3RyY3B5KG5ldy0+Y29kZSxidWYpOworICAgIG5ldy0+aWR4PSsraWR4OworICAgIGFkZF9saW5lKG5ldyk7CisgICAgaWYobmV3LT5mbGFncyZMQUJVU0UpeworICAgICAgZXh0ZW5kX2xhYmluZm9zKG5ldy0+bDEpOworICAgICAgZXh0ZW5kX2xhYmluZm9zKG5ldy0+bDIpOworICAgICAgbGFiaW5mb3NbbmV3LT5sMV0udXNlY250Kys7CisgICAgICBsYWJpbmZvc1tuZXctPmwyXS51c2VjbnQrKzsKKyAgICB9CisgICAgaWYobmV3LT5mbGFncyZMQUJERUYpCisgICAgICBleHRlbmRfbGFiaW5mb3MobmV3LT5sMSk7CisgICAgLyogc2tpcCByZXN0IG9mIGxvbmcgbGluZSwgVE9ETyAqLworICAgIHdoaWxlKHA9PSZidWZbTUFYTEVOLTFdKQorICAgICAgcD1mZ2V0cyhidWYsTUFYTEVOLGYpOworICB9Cit9CisKK3ZvaWQgcHJpbnRfbGluZShsaW5lICpwKQoreworICBwcmludGYoIltpZHg9JWQgZmxhZ3M9JWQgc3o9JWQgbDE9JWQgbDI9JWRdOiAlcyIscC0+aWR4LHAtPmZsYWdzLHAtPnNpemUscC0+bDEscC0+bDIscC0+Y29kZSk7Cit9CisKK2ludCBzbGFiLGRsYWI7CisKK2ludCBtYXRjaF9saW5lKGxpbmUgKmEsIGxpbmUgKmIpCit7CisgIGlmKChhLT5mbGFncyYoQkFSUklFUnxMQkFSUklFUikpfHwoYi0+ZmxhZ3MmKEJBUlJJRVJ8TEJBUlJJRVIpKSkKKyAgICByZXR1cm4gMDsKKworICAvKiB3ZSBjdXJyZW50bHkgaGFuZGxlIG9ubHkgb25lIGxhYmVsICovCisgIGlmKGEtPmwyIT1iLT5sMikKKyAgICByZXR1cm4gMDsKKworICBpZihhLT5sMSYmIWItPmwxKQorICAgIHJldHVybiAwOworICBpZihiLT5sMSYmIWEtPmwxKQorICAgIHJldHVybiAwOworCisgIGlmKGEtPmwxJiZhLT5sMT09c2xhYikKKyAgICBpZihiLT5sMSE9ZGxhYikKKyAgICAgIHJldHVybiAwOworCisgIGlmKCFzdHJjbXAoYS0+Y29kZSwgYi0+Y29kZSkmJiEoYS0+ZmxhZ3MmQlJBTkNIKSkKKyAgICByZXR1cm4gMTsKKworICBpZihzbGFiJiZhLT5sMSE9c2xhYiYmYS0+bDEhPWItPmwxKQorICAgIHJldHVybiAwOworCisgIGlmKGEtPmwxJiZiLT5sMSl7CisgICAgY2hhciAqcGE9YS0+Y29kZTsKKyAgICBjaGFyICpwYj1iLT5jb2RlOworICAgIGNoYXIgYWxbMzJdLGJsWzMyXTsKKyAgICBpbnQgbGEsbGI7CisgICAgc3ByaW50ZihhbCwibCVkIixhLT5sMSk7CisgICAgc3ByaW50ZihibCwibCVkIixiLT5sMSk7CisgICAgbGE9c3RybGVuKGFsKTsKKyAgICBsYj1zdHJsZW4oYmwpOworICAgIHdoaWxlKCpwYSYmKnBiKXsKKyAgICAgIGlmKCFzdHJuY21wKHBhLGFsLGxhKSl7CisJaWYoIXN0cm5jbXAocGIsYmwsbGIpKXsKKwkgIHBhKz1sYTsKKwkgIHBiKz1sYjsKKwl9ZWxzZQorCSAgcmV0dXJuIDA7CisgICAgICB9ZWxzZXsKKwlpZigqcGEhPSpwYikKKwkgIHJldHVybiAwOworCXBhKys7CisJcGIrKzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoKnBhfHwqcGIpCisgICAgICByZXR1cm4gMDsKKyAgICBpZighc2xhYil7CisgICAgICBzbGFiPWEtPmwxOworICAgICAgZGxhYj1iLT5sMTsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKGEtPmwxIT1zbGFifHxiLT5sMSE9ZGxhYikKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKworICByZXR1cm4gMDsKK30KKworbWF0Y2ggKmNoZWNrX21hdGNoZXMobGluZSAqcyxsaW5lICpwLCBpbnQgbWluKQoreworICBpbnQgc3o9MCxuPTA7CisgIG1hdGNoICpuZXc7CisgIGxpbmUgKmZpcnN0OworCisgIHNsYWI9ZGxhYj0wOworCisgIGlmKCFtYXRjaF9saW5lKHMsIHApKQorICAgIHJldHVybiAwOworCisgIGZpcnN0PXA7CisKKyAgbmV3PW5ld19tYXRjaCgpOworICBuZXctPnN0YXJ0PXA7CisKKyAgZG97CisgICAgc3orPXAtPnNpemU7CisgICAgbmV3LT5zaXplW25dPXN6OworICAgIG4rKzsKKyAgICBuZXctPm1heD1uOworICAgIHA9cC0+bmV4dDsKKyAgICBzPXMtPm5leHQ7CisgIH13aGlsZShuPE1BWE1MRU4mJnAmJnMmJm1hdGNoX2xpbmUocyAscCkmJnMhPWZpcnN0KTsKKworICBpZihzejxtaW4peworICAgIGZyZWUobmV3KTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmKHNsYWIpeworICAgIGludCBsc3RhcnQ9MCxsdXNlPTAsbGRlZj0wOworICAgIGlmKGRlYnVnKSBwcmludGYoImNoZWNraW5nIGxhYnZhbGlkXG4iKTsKKyAgICBmb3Iobj0wLHA9bmV3LT5zdGFydDtuPG5ldy0+bWF4O24rKyxwPXAtPm5leHQpeworICAgICAgaWYocC0+bDE9PWRsYWIpeworCWxzdGFydD0xOworCWlmKHAtPmZsYWdzJkxBQkRFRikKKwkgIGxkZWY9MTsKKwlpZihwLT5mbGFncyZMQUJVU0UpCisJICBsdXNlKys7CisgICAgICB9CisgICAgICBpZihsc3RhcnQmJighbGRlZnx8bHVzZTxsYWJpbmZvc1tkbGFiXS51c2VjbnQpKQorCW5ldy0+c2l6ZVtuXT0wOworICAgIH0KKyAgfQorCisgIHJldHVybiBuZXc7Cit9ICAgCisKK3ZvaWQgZnJlZV9tYXRjaGVzKG1hdGNoICpwKQoreworICBtYXRjaCAqbjsKKyAgd2hpbGUocCl7CisgICAgbj1wLT5uZXh0OworICAgIGZyZWUocCk7CisgICAgcD1uOworICB9Cit9CisKK3ZvaWQgcHJpbnRfbWF0Y2hlcyhtYXRjaCAqcCkKK3sKKyAgaW50IGk7CisgIGxpbmUgKmw7CisgIGlmKHAtPm5leHQpCisgICAgcHJpbnRfbWF0Y2hlcyhwLT5uZXh0KTsKKyAgcHJpbnRmKCJtYXRjaDpcbiIpOworICBmb3IoaT0wLGw9cC0+c3RhcnQ7aTxwLT5tYXg7aSsrKXsKKyAgICBwcmludGYoInN2PSVkICIscC0+c2l6ZVtpXSk7CisgICAgcHJpbnRfbGluZShsKTsKKyAgICBsPWwtPm5leHQ7CisgIH0KK30KKyAgCisKK2ludCBtYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IGkscXVpZXQ9MCxjaGFuZ2VkLHBhc3M9MDsKKyAgRklMRSAqaW4sKm91dDsgY2hhciAqaW5uYW1lPTAsKm91dG5hbWU9MDsKKyAgbGluZSAqcDsKKworICBmb3IoaT0xO2k8YXJnYztpKyspeworICAgIGlmKCphcmd2W2ldIT0nLScpeworICAgICAgaWYoIWlubmFtZSl7CisgICAgICAgIGlubmFtZT1hcmd2W2ldOworICAgICAgfWVsc2V7CisgICAgICAgIGlmKG91dG5hbWUpeworICAgICAgICAgIHByaW50ZigiT25seSBvbmUgaW5wdXQgZmlsZSBhbGxvd2VkXG4iKTsKKwkgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgb3V0bmFtZT1hcmd2W2ldOworICAgICAgICB9CisgICAgICB9CisgICAgfWVsc2V7CisgICAgICBpZighc3RyY21wKCItcXVpZXQiLGFyZ3ZbaV0pKSB7cXVpZXQ9MTtjb250aW51ZTt9CisjaWZuZGVmIERFQlVHCisgICAgICBpZighc3RybmNtcCgiLWRlYnVnPSIsYXJndltpXSw3KSl7ZGVidWc9YXRvaShhcmd2W2ldKzcpO2NvbnRpbnVlO30KKyNlbmRpZgorICAgICAgcHJpbnRmKCJVbmtub3duIG9wdGlvbiBcIiVzXCJcbiIsYXJndltpXSk7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorICB9CisgIGlmKCFxdWlldCl7CisjaWZkZWYgU1BFQ0lBTF9DT1BZUklHSFQKKyAgICBwcmludGYoIiVzXG4iLFNQRUNJQUxfQ09QWVJJR0hUKTsKKyNlbHNlCisgICAgcHJpbnRmKCIlc1xuJXNcbiIsdnNfY29weXJpZ2h0LHRnX2NvcHlyaWdodCk7CisjZW5kaWYKKyAgfQorICBpZighaW5uYW1lKXtwcmludGYoIk5vIGlucHV0IGZpbGVcbiIpO2V4aXQoRVhJVF9GQUlMVVJFKTt9CisgIGlmKCFvdXRuYW1lKXtwcmludGYoIk5vIG91dHB1dCBmaWxlXG4iKTtleGl0KEVYSVRfRkFJTFVSRSk7fQorICBpbj1mb3Blbihpbm5hbWUsInIiKTsKKyAgaWYoIWluKXtwcmludGYoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGUgXCIlc1wiXG4iLGlubmFtZSk7ZXhpdChFWElUX0ZBSUxVUkUpO30KKyAgb3V0PWZvcGVuKG91dG5hbWUsInciKTsKKyAgaWYoIW91dCl7cHJpbnRmKCJDb3VsZCBub3Qgb3BlbiBvdXRwdXQgZmlsZSBcIiVzXCJcbiIsb3V0bmFtZSk7ZXhpdChFWElUX0ZBSUxVUkUpO30KKworICBsYWJpbmZvcz1teW1hbGxvYyhzaXplb2YobGFiaW5mbykqTEFCTlVNKTsKKyAgbGFiY250PUxBQk5VTTsKKworICBmb3IoaT0wO2k8bGFiY250O2krKykKKyAgICBsYWJpbmZvc1tpXS51c2VjbnQ9MDsKKworICByZWFkX2xpbmVzKGluKTsKKworICBpZihkZWJ1ZykKKyAgICBmb3IocD1maXJzdF9saW5lO3A7cD1wLT5uZXh0KQorICAgICAgcHJpbnRfbGluZShwKTsKKworICBpZihkZWJ1ZykKKyAgICBmb3IoaT0xO2k8bGFiY250O2krKykKKyAgICAgIGlmKGxhYmluZm9zW2ldLnVzZWNudCkKKwlwcmludGYoImxhYiAlZCB1c2VkICVkIHRpbWVzXG4iLGksbGFiaW5mb3NbaV0udXNlY250KTsKKworICBkb3sKKyAgICBwYXNzKys7CisgICAgY2hhbmdlZD0wOworICAgIGlmKGRlYnVnKSBwcmludGYoInBhc3MgJWRcbiIscGFzcyk7CisgICAgZm9yKHA9Zmlyc3RfbGluZTtwO3A9cC0+bmV4dCl7CisgICAgICBsaW5lICpuOworICAgICAgbWF0Y2ggKm0sKm1saXN0PTA7aW50IG1heD0wLHRtcDsKKworICAgICAgaWYoc3NjYW5mKHAtPmNvZGUsIjt2Y3BybWluPSVkIiwmdG1wKT09MSkKKwltaW5zYXZlPXRtcDsKKyAgICAgIGlmKHNzY2FuZihwLT5jb2RlLCIjdmNwcm1pbj0lZCIsJnRtcCk9PTEpCisJbWluc2F2ZT10bXA7CisgICAgICAKKyAgICAgIGZvcihuPXAtPm5leHQ7bjtuPW4tPm5leHQpeworCW09Y2hlY2tfbWF0Y2hlcyhwLG4sbWluc2F2ZSk7CisJaWYobSl7CisJICBtLT5uZXh0PW1saXN0OworCSAgbWxpc3Q9bTsKKwkgIGlmKG0tPm1heD5tYXgpIG1heD1tLT5tYXg7CisJICAvKiBUT0RPOiBpcyB0aGlzIG5lY2Vzc2FyeT8gKi8KKwkgIGZvcihpPTA7aTxtLT5tYXg7aSsrKQorCSAgICBuPW4tPm5leHQ7CisJfQorICAgICAgfQorICAgICAgaWYobWxpc3QpeworCWludCBtYXhzYXY9MCxtYXhuPTAsY3NhdixjbnQ7CisJCisJaWYoZGVidWcpeworCSAgcHJpbnRmKCJtbGlzdDogXG4iKTsKKwkgIHByaW50X2xpbmUocCk7CisJICBwcmludF9tYXRjaGVzKG1saXN0KTsKKwl9CisJZm9yKGk9MTtpPD1tYXg7aSsrKXsKKwkgIGNzYXY9MDtjbnQ9MDsKKwkgIGZvcihtPW1saXN0O207bT1tLT5uZXh0KXsKKwkgICAgaWYobS0+bWF4Pj1pKXsKKwkgICAgICBjbnQrKzsKKwkgICAgICBjc2F2Kz1tLT5zaXplW2ktMV0tbWluc2F2ZTsKKwkgICAgfQorCSAgfQorCSAgaWYoZGVidWcpIHByaW50ZigiJWQgdGltZXMgJWQ6IHRvdGFsICVkXG4iLGNudCxpLGNzYXYpOworCSAgaWYoY3Nhdj5tYXhzYXYpeworCSAgICBtYXhzYXY9Y3NhdjsKKwkgICAgbWF4bj1pOworCSAgfQorCX0KKwlpZihkZWJ1ZykgcHJpbnRmKCJiZXN0IHNhdmluZzogJWQ6IHRvdGFsICVkXG4iLG1heG4sbWF4c2F2KTsKKwkKKwluPXAtPnByZXY7CisJaWYobiYmbWF4c2F2PjApeworCSAgYWRkX2hlYWRlcihsYXN0X2xpbmUpOworCSAgaWYobGFzdF9saW5lLT5uZXh0PT1sYXN0X2xpbmUpIGFib3J0KCk7CisJICBpZihkZWJ1ZykgcHJpbnRmKCJjb3B5aW5nIGhlYWRlcjpcbiIpOworCSAgZm9yKGk9MDtpPG1heG47aSsrKXsKKwkgICAgcD1uLT5uZXh0OworCSAgICBpZihkZWJ1ZykgcHJpbnRfbGluZShwKTsKKwkgICAgcC0+ZmxhZ3N8PUxCQVJSSUVSOworCSAgICByZW1vdmVfbGluZShwKTsKKwkgICAgaW5zZXJ0X2xpbmUobGFzdF9saW5lLHApOworCSAgfQorCisJICBjaGFuZ2VkPTE7CisJICBhZGRfanNyKG4pOworCSAgCisJICBhZGRfcmV0KGxhc3RfbGluZSk7CisJICAKKwkgIGxhYmluZm9zW24tPm5leHQtPmwxXS51c2VjbnQrKzsKKwkgIGlmKGRlYnVnKSBwcmludGYoInVwZGF0ZSB1c2VjbnQgbGFiICVkIHRvICVkXG4iLG4tPm5leHQtPmwxLGxhYmluZm9zW24tPm5leHQtPmwxXS51c2VjbnQpOworCSAgCisJICBmb3IobT1tbGlzdDttO209bS0+bmV4dCl7CisJICAgIGlmKG0tPm1heD49bWF4bil7CisJICAgICAgaWYoZGVidWcpIHByaW50ZigicmVtb3ZlIGNvcHk6XG4iKTsKKwkgICAgICBwPW0tPnN0YXJ0LT5wcmV2OworCSAgICAgIGZvcihpPTA7aTxtYXhuO2krKyl7CisJCWxpbmUgKnQ9cC0+bmV4dDsKKwkJaWYoZGVidWcpIHByaW50X2xpbmUodCk7CisJCXJlbW92ZV9saW5lKHQpOworCQlmcmVlX2xpbmUodCk7CisJICAgICAgfQorCSAgICAgIGFkZF9qc3IocCk7CisJICAgICAgbGFiaW5mb3NbcC0+bmV4dC0+bDFdLnVzZWNudCsrOworCSAgICAgIGlmKGRlYnVnKSBwcmludGYoInVwZGF0ZSB1c2VjbnQgbGFiICVkIHRvICVkXG4iLHAtPm5leHQtPmwxLGxhYmluZm9zW3AtPm5leHQtPmwxXS51c2VjbnQpOworCSAgICB9CisJICB9CisJICBwPW47CisJfQorCWZyZWVfbWF0Y2hlcyhtbGlzdCk7CisgICAgICB9CisgICAgfQorICAgIGlmKGNoYW5nZWQpeworICAgICAgZm9yKHA9Zmlyc3RfbGluZTtwO3A9cC0+bmV4dCkKKwlwLT5mbGFncyY9fkxCQVJSSUVSOworICAgIH0KKyAgfXdoaWxlKGNoYW5nZWQpOworCisgIGZvcihwPWZpcnN0X2xpbmU7cDtwPXAtPm5leHQpCisgICAgZnByaW50ZihvdXQsIiVzIixwLT5jb2RlKTsKKworICBleGl0KEVYSVRfU1VDQ0VTUyk7Cit9CmRpZmYgLS1naXQgYS92Y3ByL3ZjcHIuaCBiL3ZjcHIvdmNwci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYjY0ZTcKLS0tIC9kZXYvbnVsbAorKysgYi92Y3ByL3ZjcHIuaApAQCAtMCwwICsxLDUwIEBACisjZGVmaW5lIExBQkRFRiAxCisjZGVmaW5lIExBQlVTRSAyCisjZGVmaW5lIEJBUlJJRVIgNAorI2RlZmluZSBMQkFSUklFUiA4CisjZGVmaW5lIEJSQU5DSCAxNiAvKiBvbmx5IG1vdmUgaWYgdGFyZ2V0IGFsc28gbW92ZWQgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbGluZSB7CisgIHN0cnVjdCBsaW5lICpuZXh0LCpwcmV2OworICBjaGFyICpjb2RlOworICBpbnQgZmxhZ3M7CisgIGludCBzaXplOworICBpbnQgaWR4OworICBpbnQgbDEsbDI7Cit9IGxpbmU7CisKKyNkZWZpbmUgTUFYTUxFTiA2NAorCit0eXBlZGVmIHN0cnVjdCBtYXRjaCB7CisgIHN0cnVjdCBtYXRjaCAqbmV4dDsKKyAgbGluZSAqc3RhcnQ7CisgIGludCBtYXg7CisgIGludCBzaXplW01BWE1MRU5dOworfSBtYXRjaDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgdXNlY250OworfSBsYWJpbmZvOworCisjZGVmaW5lIExBQk5VTSAxMDAwMAorCisjZGVmaW5lIE1BWExFTiAxMDI0CisKKworLyogZnVuY3Rpb25zIGF2YWlsYWJsZSB0byBiYWNrZW5kICovCit2b2lkICpteW1hbGxvYyhzaXplX3Qgc3opOworaW50IG5ld19sYWJlbCh2b2lkKTsKK3ZvaWQgZXh0ZW5kX2xhYmluZm9zKGludCBuKTsKK2xpbmUgKm5ld19saW5lKHZvaWQpOwordm9pZCBpbnNlcnRfbGluZShsaW5lICphZnRlciwgbGluZSAqbmV3KTsKK3ZvaWQgcmVtb3ZlX2xpbmUobGluZSAqcCk7Cit2b2lkIGZyZWVfbGluZShsaW5lICpwKTsKKworLyogZnVuY3Rpb25zIHByb3ZpZGVkIGJ5IHRoZSBiYWNrZW5kICovCitleHRlcm4gaW50IG1pbnNhdmU7CitleHRlcm4gY29uc3QgY2hhciB0Z19jb3B5cmlnaHRbXTsKKwordm9pZCBwYXJzZV9saW5lKGNoYXIgKnMsbGluZSAqcCk7Cit2b2lkIGFkZF9oZWFkZXIobGluZSAqYWZ0ZXIpOwordm9pZCBhZGRfcmV0KGxpbmUgKmFmdGVyKTsKK3ZvaWQgYWRkX2pzcihsaW5lICphZnRlcik7CmRpZmYgLS1naXQgYS92cHJvZi92cHJvZi5jIGIvdnByb2YvdnByb2YuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NjAxMDkyCi0tLSAvZGV2L251bGwKKysrIGIvdnByb2YvdnByb2YuYwpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIHZwcm9mCisgKgorICogdmJjYyBwcm9maWxlci4gRGlzcGxheXMgdGhlIGNvbnRlbnRzIG9mICJtb24ub3V0IiBmaWxlcy4KKyAqIChDKTE5OTgsMjAxMCBieSBGcmFuayBXaWxsZSA8ZnJhbmtAcGhvZW5peC5vd2wuZGU+CisgKgorICogdnByb2YgaXMgZnJlZXdhcmUgYW5kIHBhcnQgb2YgdGhlIHBvcnRhYmxlIGFuZCByZXRhcmdldGFibGUgQU5TSSBDCisgKiBjb21waWxlciB2YmNjLCBjb3B5cmlnaHQgKGMpIDE5OTUtOTggYnkgVm9sa2VyIEJhcnRoZWxtYW5uLgorICogdnByb2YgbWF5IGJlIGZyZWVseSByZWRpc3RyaWJ1dGVkIGFzIGxvbmcgYXMgbm8gbW9kaWZpY2F0aW9ucyBhcmUKKyAqIG1hZGUgYW5kIG5vdGhpbmcgaXMgY2hhcmdlZCBmb3IgaXQuIE5vbi1jb21tZXJjaWFsIHVzYWdlIGlzIGFsbG93ZWQKKyAqIHdpdGhvdXQgYW55IHJlc3RyaWN0aW9ucy4KKyAqIEVWRVJZIFBST0RVQ1QgT1IgUFJPR1JBTSBERVJJVkVEIERJUkVDVExZIEZST00gTVkgU09VUkNFIE1BWSBOT1QgQkUKKyAqIFNPTEQgQ09NTUVSQ0lBTExZIFdJVEhPVVQgUEVSTUlTU0lPTiBGUk9NIFRIRSBBVVRIT1IuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgVkVSU0lPTiAwCisjZGVmaW5lIFJFVklTSU9OIDIKKyNkZWZpbmUgUExFVkVMIDAKKyNkZWZpbmUgREVGQVVMVE5BTUUgIm1vbi5vdXQiCisKK3N0cnVjdCBwcm9mZGF0YSB7CisgIGNoYXIgKmZ1bmNuYW1lOworICB1bnNpZ25lZCBsb25nIG5jYWxsczsKKyAgdW5zaWduZWQgbG9uZyB0b3R0aW1lOworICB1bnNpZ25lZCBsb25nIGxvY3RpbWU7Cit9OworCisKK3N0YXRpYyB2b2lkIHNob3coc3RydWN0IHByb2ZkYXRhICpwZGF0YSxpbnQgbikKKy8qIHdyaXRlIHByb2ZkYXRhIHJlY29yZHMgdG8gc3Rkb3V0ICovCit7CisgIHN0cnVjdCBwcm9mZGF0YSAqcDsKKyAgdW5zaWduZWQgbG9uZyBydW50aW1lOworICBpbnQgaTsKKworICBmb3IgKGk9MCxwPXBkYXRhLHJ1bnRpbWU9MDsgaTxuOyBpKysscCsrKQorICAgIHJ1bnRpbWUgKz0gcC0+bG9jdGltZTsKKworICBwcmludGYoIiAgJSUgICAgIHRvdGFsICAgbG9jYWwgICAgICAgICAgICAgICAgbG9jYWwgICAgICB0b3RhbFxuIgorICAgICAgICAgIiB0aW1lICBzZWNvbmRzIHNlY29uZHMgICAgIGNhbGxzICAgIG1zL2NhbGwgICAgbXMvY2FsbCAgbmFtZVxuIik7CisgIGZvciAoaT0wLHA9cGRhdGE7IGk8bjsgaSsrLHArKykgeworICAgIHByaW50ZigiJTUuMmYgJTcuMmYgJTcuMmYgJTlsdSAlMTAuM2YgJTEwLjNmICAlc1xuIiwKKyAgICAgICAgICAgKChkb3VibGUpcC0+bG9jdGltZS8oZG91YmxlKXJ1bnRpbWUpKjEwMC4wLAorICAgICAgICAgICAoZG91YmxlKXAtPnRvdHRpbWUvMTAwMDAwMC4wLAorICAgICAgICAgICAoZG91YmxlKXAtPmxvY3RpbWUvMTAwMDAwMC4wLAorICAgICAgICAgICBwLT5uY2FsbHMsCisgICAgICAgICAgICgoZG91YmxlKXAtPmxvY3RpbWUvKGRvdWJsZSlwLT5uY2FsbHMpLzEwMDAuMCwKKyAgICAgICAgICAgKChkb3VibGUpcC0+dG90dGltZS8oZG91YmxlKXAtPm5jYWxscykvMTAwMC4wLAorICAgICAgICAgICBwLT5mdW5jbmFtZSk7CisgIH0KK30KKworCitzdGF0aWMgaW50IGNtcF90b3RhbChjb25zdCB2b2lkICpwZDEsY29uc3Qgdm9pZCAqcGQyKQoreworICByZXR1cm4gKChpbnQpKCgoc3RydWN0IHByb2ZkYXRhICopcGQyKS0+bG9jdGltZSAtCisgICAgICAgICAgKChzdHJ1Y3QgcHJvZmRhdGEgKilwZDEpLT5sb2N0aW1lKSk7Cit9CisKKworc3RhdGljIHZvaWQgc2hvd19sb2NhbChzdHJ1Y3QgcHJvZmRhdGEgKnBkLGludCBuKQorLyogc2hvdyBwcm9maWxpbmcgZGF0YSwgc29ydGVkIGFjY29yZGluZyB0byB0aGUgbG9jYWwgdGltZSAqLworLyogc3BlbnQgaW4gZWFjaCBmdW5jdGlvbiAqLworeworICBxc29ydChwZCxuLHNpemVvZihzdHJ1Y3QgcHJvZmRhdGEpLGNtcF90b3RhbCk7CisgIHNob3cocGQsbik7Cit9CisKKworc3RhdGljIGNoYXIgKnNraXBuYW1lKGNoYXIgKnApCisvKiBza2lwIG5hbWUgYW5kIGFsaWdubWVudCBieXRlcyBhbmQgcmV0dXJuIHBvaW50ZXIgdG8gcHJvZmlsZSBkYXRhICovCit7CisgIGludCBuID0gc3RybGVuKHApKzE7CisKKyAgcCArPSBuOworICBpZiAobiAmPSAzKQorICAgIHAgKz0gNC1uOworICByZXR1cm4gKHApOworfQorCisKK2ludCBtYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSkKK3sKKyAgY2hhciAqbW5hbWU7CisgIEZJTEUgKmZwOworICBsb25nIHNpemUsbGVuOworICBjaGFyICpidWYsKnA7CisgIGludCBpLG5yZWNzID0gMDsKKyAgc3RydWN0IHByb2ZkYXRhICpwZGF0YSwqcGQ7CisKKyAgaWYgKGFyZ2MgPj0gMikgeworICAgIGlmICgqYXJndlsxXT09Jy0nIHx8ICphcmd2WzFdPT0nPycpIHsKKyAgICAgIHByaW50ZigiJXMgViVkLiVkJWMgKGMpMTk5OCwyMDEwIGJ5IEZyYW5rIFdpbGxlXG4iCisgICAgICAgICAgICAgIlVzYWdlOlxuICAlcyBbbW9uLm91dF1cbiIsYXJndlswXSwKKyAgICAgICAgICAgICBWRVJTSU9OLFJFVklTSU9OLFBMRVZFTD8oJ2EnK1BMRVZFTC0xKTonICcsYXJndlswXSk7CisgICAgICBleGl0KDEpOworICAgIH0KKyAgICBlbHNlCisgICAgICBtbmFtZSA9IGFyZ3ZbMV07CisgIH0KKyAgZWxzZQorICAgIG1uYW1lID0gREVGQVVMVE5BTUU7CisKKyAgaWYgKGZwID0gZm9wZW4obW5hbWUsInIiKSkgeworICAgIC8qIGRldGVybWluZSBmaWxlIHNpemUgKi8KKyAgICBmc2VlayhmcCwwLFNFRUtfRU5EKTsKKyAgICBzaXplID0gZnRlbGwoZnApOworICAgIGZzZWVrKGZwLDAsU0VFS19TRVQpOworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgZmNsb3NlKGZwKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCIlczogU2VlayBlcnJvciBvbiAlcyFcbiIsYXJndlswXSxtbmFtZSk7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorCisgICAgLyogYWxsb2NhdGUgYnVmZmVyIGFuZCByZWFkIGZpbGUgKi8KKyAgICBpZiAoIShidWYgPSBtYWxsb2Moc2l6ZSkpKSB7CisgICAgICBmY2xvc2UoZnApOworICAgICAgZnByaW50ZihzdGRlcnIsIiVzOiBOb3QgZW5vdWdoIG1lbW9yeSFcbiIsYXJndlswXSk7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorICAgIGlmIChmcmVhZChidWYsMSxzaXplLGZwKSAhPSBzaXplKSB7CisgICAgICBmY2xvc2UoZnApOworICAgICAgZnByaW50ZihzdGRlcnIsIiVzOiAlcyBoYWQgYSByZWFkIGVycm9yIVxuIixhcmd2WzBdLG1uYW1lKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgICAgZmNsb3NlKGZwKTsKKworICAgIC8qIGNvdW50IG51bWJlciBvZiBlbnRyaWVzIGluIG1vbi5vdXQgYW5kIGFsbG9jYXRlIHByb2ZkYXRhIGFycmF5ICovCisgICAgcCA9IGJ1ZjsKKyAgICB3aGlsZSAocCA8IGJ1ZitzaXplKSB7CisgICAgICBucmVjcysrOworICAgICAgcCA9IHNraXBuYW1lKHApICsgMypzaXplb2YodW5zaWduZWQgbG9uZyk7CisgICAgfQorICAgIGlmIChwIT1idWYrc2l6ZSB8fCBucmVjcz09MCkgeworICAgICAgZnByaW50ZihzdGRlcnIsIiVzOiAlczogQ29ycnVwdGVkIGZpbGUgZm9ybWF0LlxuIixhcmd2WzBdLG1uYW1lKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgICAgaWYgKCEocGRhdGEgPSBtYWxsb2MobnJlY3MgKiBzaXplb2Yoc3RydWN0IHByb2ZkYXRhKSkpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwiJXM6IE5vdCBlbm91Z2ggbWVtb3J5IVxuIixhcmd2WzBdKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisKKyAgICAvKiBmaWxsIHByb2ZkYXRhIGFycmF5ICovCisgICAgZm9yIChpPTAscD1idWYscGQ9cGRhdGE7IGk8bnJlY3M7IGkrKyxwZCsrKSB7CisgICAgICBwZC0+ZnVuY25hbWUgPSBwOworICAgICAgcCA9IHNraXBuYW1lKHApOworICAgICAgcGQtPm5jYWxscyA9ICoodW5zaWduZWQgbG9uZyAqKXA7CisgICAgICBwZC0+dG90dGltZSA9ICoodW5zaWduZWQgbG9uZyAqKShwK3NpemVvZih1bnNpZ25lZCBsb25nKSk7CisgICAgICBwZC0+bG9jdGltZSA9ICoodW5zaWduZWQgbG9uZyAqKShwKzIqc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKyAgICAgIHAgKz0gMypzaXplb2YodW5zaWduZWQgbG9uZyk7CisgICAgfQorCisgICAgLyogZGlzcGxheSAqLworICAgIHNob3dfbG9jYWwocGRhdGEsbnJlY3MpOworICB9CisgIGVsc2UgeworICAgIGZwcmludGYoc3RkZXJyLCIlczogQ2FuJ3Qgb3BlbiAlcy5cbiIsYXJndlswXSxtbmFtZSk7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS92c2MvdnNjLmMgYi92c2MvdnNjLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWZjOWEyNQotLS0gL2Rldi9udWxsCisrKyBiL3ZzYy92c2MuYwpAQCAtMCwwICsxLDIzOSBAQAorLyogdnNjIC0gcG9ydGFibGUgaW5zdHJ1Y3Rpb24gc2NoZWR1bGVyIGZvciB2YmNjLiAgICovCisvKiAoYykgMTk5Ny05OSBieSBWb2xrZXIgQmFydGhlbG1hbm4uICAgICAgICAgICAgICAgKi8KKworI2luY2x1ZGUgInZzYy5oIgorCitjaGFyIHZzX2NvcHlyaWdodFtdPSJ2c2Mgc2NoZWR1bGVyIFYwLjEgKGMpIDE5OTctOTkgYnkgVm9sa2VyIEJhcnRoZWxtYW5uIjsKKworI2RlZmluZSBNQVhfSU5TIDEyOAorI2RlZmluZSBMSU5FTEVOR1RIIDEwMjQKKworI2lmbmRlZiBERUJVRworaW50IERFQlVHOworI2VuZGlmCisKK3N0cnVjdCBzaW5mbyBzaWxpc3RbTUFYX0lOU107CitpbnQgc2lfY291bnQ7CitpbnQgZG9uZTsKKworaW50IGJ2Y21wKHVuc2lnbmVkIGNoYXIgKmRlc3QsdW5zaWduZWQgY2hhciAqc3JjLHNpemVfdCBsZW4pCisvKiAgdmVyZ2xlaWNodCB6d2VpIEJpdHZla3RvcmVuICAgICovCit7CisgICAgZm9yKDtsZW4+MDtsZW4tLSkKKyAgICAgICAgaWYoKmRlc3QrKyE9KnNyYysrKSByZXR1cm4oMCk7CisgICAgcmV0dXJuKDEpOworfQordm9pZCBidnVuaXRlKHVuc2lnbmVkIGNoYXIgKmRlc3QsdW5zaWduZWQgY2hhciAqc3JjLHNpemVfdCBsZW4pCisvKiAgYmVyZWNobmV0IFZlcmVpbmlndW5nIHp3ZWllciBCaXR2ZWt0b3JlbiAgICAqLworeworICAgIGZvcig7bGVuPjA7bGVuLS0pCisgICAgICAgICpkZXN0Kyt8PSpzcmMrKzsKK30KK3ZvaWQgYnZpbnRlcnNlY3QodW5zaWduZWQgY2hhciAqZGVzdCx1bnNpZ25lZCBjaGFyICpzcmMsc2l6ZV90IGxlbikKKy8qICBiZXJlY2huZXQgRHVyY2hzY2huaXR0IHp3ZWllciBCaXR2ZWt0b3JlbiAgICovCit7CisgICAgZm9yKDtsZW4+MDtsZW4tLSkKKyAgICAgICAgKmRlc3QrKyY9KnNyYysrOworfQordm9pZCBidmRpZmYodW5zaWduZWQgY2hhciAqZGVzdCx1bnNpZ25lZCBjaGFyICpzcmMsc2l6ZV90IGxlbikKKy8qICBiZXJlY2huZXQgJ0RpZmZlcmVueicgendlaWVyIEJpdHZla3RvcmVuICAgICovCit7CisgICAgZm9yKDtsZW4+MDtsZW4tLSkKKyAgICAgICAgKmRlc3QrKyY9figqc3JjKyspOworfQorCit2b2lkIHJhdXModm9pZCkKK3sKKyAgc2NoZWRfY2xlYW51cCgpOworICBpZihERUJVRyYxKSBwcmludGYoInJhdXNcbiIpOworICBpZihkb25lKQorICAgIGV4aXQoRVhJVF9TVUNDRVNTKTsKKyAgZWxzZQorICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKK30KK3ZvaWQgKm15bWFsbG9jKHNpemVfdCBzeikKK3sKKyAgdm9pZCAqcD1tYWxsb2Moc3opOworICBpZighcCl7CisgICAgcHV0cygiT3V0IG9mIG1lbW9yeSEiKTsKKyAgICByYXVzKCk7CisgIH0KKyAgcmV0dXJuIHA7Cit9Cit2b2lkIHByaW50X3NpbmZvKHZvaWQpCit7CisgIHN0cnVjdCBzaW5mbyAqcDtpbnQgaSxqOworICBpZihERUJVRyYyKQorICAgIHByaW50ZigicHJpbnRfc2luZm9cbiIpOworICBlbHNlCisgICAgcmV0dXJuOworICBmb3Ioaj0wO2o8c2lfY291bnQ7aisrKXsKKyAgICBwPSZzaWxpc3Rbal07CisgICAgcHJpbnRmKCJpbnN0OiAlcyIscC0+dHh0KTsKKyAgICBwcmludGYoImZsYWdzPSV1LCBsYWJlbD0ldSBsYXRlbmN5PSV1XG4iLHAtPmZsYWdzLHAtPmxhYmVsLHAtPmxhdGVuY3kpOworICAgIHByaW50ZigiYXZhaWxhYmxlIHBpcGVsaW5lczogIik7CisgICAgZm9yKGk9MDtpPFBJUEVTO2krKykKKyAgICAgIGlmKEJUU1QocC0+cGlwZXMsaSkpCisgICAgICAgIHByaW50ZigiJWQgIixpKTsKKyAgICBwcmludGYoIlxudXNlcyByZWdpc3RlcnMgKCVkPW1lbSk6ICIsTUVNKTsKKyAgICBmb3IoaT0wO2k8PU1FTTtpKyspCisgICAgICBpZihCVFNUKHAtPnVzZXMsaSkpCisgICAgICAgIHByaW50ZigiJWQgIixpKTsKKyAgICBwcmludGYoIlxubW9kaWZpZXMgcmVnaXN0ZXJzICglZD1NRU0pOiAiLE1FTSk7CisgICAgZm9yKGk9MDtpPD1NRU07aSsrKQorICAgICAgaWYoQlRTVChwLT5tb2RpZmllcyxpKSkKKyAgICAgICAgcHJpbnRmKCIlZCAiLGkpOworICAgIHByaW50ZigiXG5cbiIpOworICB9Cit9Cit2b2lkIGZyZWVfc2luZm8odm9pZCkKK3sKKyAgaW50IGo7CisgIGZvcihqPTA7ajxzaV9jb3VudDtqKyspCisgICAgZnJlZShzaWxpc3Rbal0udHh0KTsKK30KK3ZvaWQgb3V0cHV0X3NjaGVkdWxlZChGSUxFICpmKQoreworICBpbnQgcGlwZXNbUElQRVNdLGksaixrLGwscmVtYWluaW5nOworICBpbnQgbGF0ZW5jeVtNRU0rMV09ezB9LGN5Y2xlPTA7CisgIHVuc2lnbmVkIGNoYXIgdXNlZFtSRUdTX1NJWkVdLG1vZGlmaWVkW1JFR1NfU0laRV0sdG1wW1JFR1NfU0laRV0sZW1wdHlbUkVHU19TSVpFXT17MH07CisgIHJlbWFpbmluZz1zaV9jb3VudDsKKyAgaWYoREVCVUcmMikgcHJpbnRfc2luZm8oKTsKKyAgd2hpbGUocmVtYWluaW5nKXsKKyAgICBjeWNsZSsrOworICAgIGlmKERFQlVHJjQpeworICAgICAgcHJpbnRmKCJjeWNsZSAlZFxuIixjeWNsZSk7CisgICAgICBmb3IoaT0wO2k8PU1FTTtpKyspCisgICAgICAgIGlmKGxhdGVuY3lbaV0+MCkgcHJpbnRmKCJsYXRlbmN5WyVkXT0lZFxuIixpLGxhdGVuY3lbaV0pOworICAgIH0KKyAgICAvKiBNYXJrIGFsbCBpbnN0cnVjdGlvbnMgd2hpY2ggYXJlIHJlYWR5LiAqLworICAgIG1lbXNldChtb2RpZmllZCwwLFJFR1NfU0laRSk7CisgICAgbWVtc2V0KHVzZWQsMCxSRUdTX1NJWkUpOworICAgIGZvcihpPTA7aTxzaV9jb3VudDtpKyspeworICAgICAgaWYoc2lsaXN0W2ldLmZsYWdzJk9VVCkgY29udGludWU7CisgICAgICBtZW1jcHkodG1wLHNpbGlzdFtpXS51c2VzLFJFR1NfU0laRSk7CisgICAgICBidnVuaXRlKHRtcCxzaWxpc3RbaV0ubW9kaWZpZXMsUkVHU19TSVpFKTsKKyAgICAgIGJ2aW50ZXJzZWN0KHRtcCxtb2RpZmllZCxSRUdTX1NJWkUpOworICAgICAgaWYoYnZjbXAodG1wLGVtcHR5LFJFR1NfU0laRSkpeworICAgICAgICAvKiB1c2VzIGFuZCBtb2RpZmllcyBub3RoaW5nIHRoYXQgaGFzIHRvIGJlIG1vZGlmaWVkIGJlZm9yZSAqLworICAgICAgICBtZW1jcHkodG1wLHVzZWQsUkVHU19TSVpFKTsKKyAgICAgICAgYnZpbnRlcnNlY3QodG1wLHNpbGlzdFtpXS5tb2RpZmllcyxSRUdTX1NJWkUpOworICAgICAgICBpZihidmNtcCh0bXAsZW1wdHksUkVHU19TSVpFKSl7CisgICAgICAgICAgLyogbW9kaWZpZXMgbm90aGluZyB0aGF0IGhhcyB0byBiZSB1c2VkIGJlZm9yZSAqLworICAgICAgICAgIGZvcihrPTAsaj0wO2o8PU1FTTtqKyspeworICAgICAgICAgICAgaWYoQlRTVChzaWxpc3RbaV0udXNlcyxqKSYmbGF0ZW5jeVtqXT4wKSBrPTE7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKCFrKSBzaWxpc3RbaV0uZmxhZ3N8PVJFQURZOworICAgICAgICB9CisgICAgICB9CisgICAgICBidnVuaXRlKG1vZGlmaWVkLHNpbGlzdFtpXS5tb2RpZmllcyxSRUdTX1NJWkUpOworICAgICAgYnZ1bml0ZSh1c2VkLHNpbGlzdFtpXS51c2VzLFJFR1NfU0laRSk7CisgICAgfQorCisgICAgLyogRmlsbCBwaXBlbGluZSBzbG90cyB3aXRoIHJlYWR5IGluc3RydWN0aW9ucy4gKi8KKyAgICBmb3IoaT0wO2k8UElQRVM7aSsrKSBwaXBlc1tpXT0tMTsKKyAgICBmb3IoaT0wO2k8c2lfY291bnQ7aSsrKXsKKyAgICAgIGlmKHNpbGlzdFtpXS5mbGFncyZPVVQpIGNvbnRpbnVlOworICAgICAgaWYoIShzaWxpc3RbaV0uZmxhZ3MmUkVBRFkpKSBjb250aW51ZTsKKyAgICAgIGlmKERFQlVHJjQpIHByaW50ZigiaW5zdCByZWFkeTogJXMiLHNpbGlzdFtpXS50eHQpOworICAgICAgaz0wOworICAgICAgLyogSXMgdGhlcmUgYSBmcmVlIHNsb3Q/ICovCisgICAgICBmb3Ioaj0wOyFrJiZqPFBJUEVTO2orKyl7CisgICAgICAgIGlmKHBpcGVzW2pdPDAmJkJUU1Qoc2lsaXN0W2ldLnBpcGVzLGopKXsKKyAgICAgICAgICBwaXBlc1tqXT1pOworICAgICAgICAgIGs9MTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogUmVwbGFjZSBhIHNjaGVkdWxlZCBpbnN0cnVjdGlvbiB3aXRoIHNtYWxsZXIgbGF0ZW5jeS4gKi8KKyAgICAgIGZvcihqPTA7IWsmJmo8UElQRVM7aisrKXsKKyAgICAgICAgaWYoQlRTVChzaWxpc3RbaV0ucGlwZXMsaikmJnNpbGlzdFtpXS5sYXRlbmN5PnNpbGlzdFtwaXBlc1tqXV0ubGF0ZW5jeSl7CisgICAgICAgICAgcGlwZXNbal09aTsKKyAgICAgICAgICBrPTE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYoREVCVUcmNCkgcHJpbnRmKCJpbnN0cnVjdGlvbnMgZm9yIGN5Y2xlICVkOlxuIixjeWNsZSk7CisgICAgZm9yKGk9MDtpPFBJUEVTO2krKyl7CisgICAgICBpZihwaXBlc1tpXT49MCl7CisgICAgICAgIGlmKERFQlVHJjQpIHByaW50ZigiJTNkOiAlcyIsaSxzaWxpc3RbcGlwZXNbaV1dLnR4dCk7CisgICAgICAgIGZwcmludGYoZiwiJXMiLHNpbGlzdFtwaXBlc1tpXV0udHh0KTsKKyAgICAgICAgc2lsaXN0W3BpcGVzW2ldXS5mbGFnc3w9T1VUOworICAgICAgICByZW1haW5pbmctLTsKKyAgICAgICAgZm9yKGo9MDtqPD1NRU07aisrKXsKKyAgICAgICAgICBpZihCVFNUKHNpbGlzdFtwaXBlc1tpXV0ubW9kaWZpZXMsaikpIGxhdGVuY3lbal09c2lsaXN0W3BpcGVzW2ldXS5sYXRlbmN5OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGZvcihpPTA7aTw9TUVNO2krKykKKyAgICAgIGlmKGxhdGVuY3lbaV0+MCkgbGF0ZW5jeVtpXS0tOworICB9Cit9CitpbnQgbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pCit7CisgIGNoYXIgc1tMSU5FTEVOR1RIXTtpbnQgaSxxdWlldD0wOworICBGSUxFICppbiwqb3V0OyBjaGFyICppbm5hbWU9MCwqb3V0bmFtZT0wOworICBmb3IoaT0xO2k8YXJnYztpKyspeworICAgIGlmKCphcmd2W2ldIT0nLScpeworICAgICAgaWYoIWlubmFtZSl7CisgICAgICAgIGlubmFtZT1hcmd2W2ldOworICAgICAgfWVsc2V7CisgICAgICAgIGlmKG91dG5hbWUpeworICAgICAgICAgIHByaW50ZigiT25seSBvbmUgaW5wdXQgZmlsZSBhbGxvd2VkXG4iKTsKKyAgICAgICAgICByYXVzKCk7CisgICAgICAgIH1lbHNleworICAgICAgICAgIG91dG5hbWU9YXJndltpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH1lbHNleworICAgICAgaWYoIXN0cmNtcCgiLXF1aWV0Iixhcmd2W2ldKSkge3F1aWV0PTE7Y29udGludWU7fQorI2lmbmRlZiBERUJVRworICAgICAgaWYoIXN0cm5jbXAoIi1kZWJ1Zz0iLGFyZ3ZbaV0sNykpe0RFQlVHPWF0b2koYXJndltpXSs3KTtjb250aW51ZTt9CisjZW5kaWYKKyAgICAgIHByaW50ZigiVW5rbm93biBvcHRpb24gXCIlc1wiXG4iLGFyZ3ZbaV0pOworICAgICAgcmF1cygpOworICAgIH0KKyAgfQorICBpZighc2NoZWRfaW5pdCgpKXtwcmludGYoInNjaGVkX2luaXQgZmFpbGVkXG4iKTtyYXVzKCk7fQorICBpZighcXVpZXQpeworI2lmZGVmIFNQRUNJQUxfQ09QWVJJR0hUCisgICAgcHJpbnRmKCIlc1xuIixTUEVDSUFMX0NPUFlSSUdIVCk7CisjZWxzZQorICAgIHByaW50ZigiJXNcbiVzXG4iLHZzX2NvcHlyaWdodCx0Z19jb3B5cmlnaHQpOworI2VuZGlmCisgIH0KKyAgaWYoIWlubmFtZSl7cHJpbnRmKCJObyBpbnB1dCBmaWxlXG4iKTtyYXVzKCk7fQorICBpZighb3V0bmFtZSl7cHJpbnRmKCJObyBvdXRwdXQgZmlsZVxuIik7cmF1cygpO30KKyAgaW49Zm9wZW4oaW5uYW1lLCJyIik7CisgIGlmKCFpbil7cHJpbnRmKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlIFwiJXNcIlxuIixpbm5hbWUpO3JhdXMoKTt9CisgIG91dD1mb3BlbihvdXRuYW1lLCJ3Iik7CisgIGlmKCFvdXQpe3ByaW50ZigiQ291bGQgbm90IG9wZW4gb3V0cHV0IGZpbGUgXCIlc1wiXG4iLG91dG5hbWUpO3JhdXMoKTt9CisgIHdoaWxlKGZnZXRzKHMsTElORUxFTkdUSC0xLGluKSl7CisgICAgbWVtc2V0KCZzaWxpc3Rbc2lfY291bnRdLDAsc2l6ZW9mKHNpbGlzdFswXSkpOworICAgIHNpbGlzdFtzaV9jb3VudF0udHh0PW15bWFsbG9jKHN0cmxlbihzKSsxKTsKKyAgICBzdHJjcHkoc2lsaXN0W3NpX2NvdW50XS50eHQscyk7CisgICAgaWYoIXNjaGVkX2luZm8oJnNpbGlzdFtzaV9jb3VudF0pKXsKKyAgICAgIHByaW50ZigiRG8gbm90IHVuZGVyc3RhbmQgaW5zdHJ1Y3Rpb246XG4lc1xuIixzaWxpc3Rbc2lfY291bnRdLnR4dCk7CisgICAgICByYXVzKCk7CisgICAgfQorICAgIGlmKHNpbGlzdFtzaV9jb3VudF0uZmxhZ3MmKEJBUlJJRVJ8TEFCRUx8Q09ORF9CUkFOQ0h8VU5DT05EX0JSQU5DSCkpeworICAgICAgaWYoREVCVUcmMSkgcHJpbnRmKCJCYXJyaWVyOiAlcyIsc2lsaXN0W3NpX2NvdW50XS50eHQpOworICAgICAgb3V0cHV0X3NjaGVkdWxlZChvdXQpOworICAgICAgZnJlZV9zaW5mbygpOworICAgICAgZnByaW50ZihvdXQsc2lsaXN0W3NpX2NvdW50XS50eHQpOworICAgICAgc2lfY291bnQ9MDsKKyAgICB9ZWxzZXsKKyAgICAgIGlmKCsrc2lfY291bnQ+PU1BWF9JTlMpeworICAgICAgICBpZihERUJVRyYxKSBwcmludGYoIk1BWF9JTlMgcmVhY2hlZDogJXMiLHNpbGlzdFtzaV9jb3VudF0udHh0KTsKKyAgICAgICAgb3V0cHV0X3NjaGVkdWxlZChvdXQpOworICAgICAgICBmcmVlX3NpbmZvKCk7CisgICAgICAgIHNpX2NvdW50PTA7CisgICAgICB9CisgICAgfQorICB9CisgIG91dHB1dF9zY2hlZHVsZWQob3V0KTsKKyAgZnJlZV9zaW5mbygpOworICBkb25lPTE7CisgIHJhdXMoKTsKK30KKworCmRpZmYgLS1naXQgYS92c2MvdnNjLmggYi92c2MvdnNjLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDY4ZDU5MgotLS0gL2Rldi9udWxsCisrKyBiL3ZzYy92c2MuaApAQCAtMCwwICsxLDEyMSBAQAorLyogIHZzYyBwb3J0YWJsZSBzY2hlZHVsZXIgKGMpIDE5OTctOTkgYnkgVm9sa2VyIEJhcnRoZWxtYW5uICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjZGVmaW5lIEJTRVQoYXJyYXksYml0KSAoYXJyYXkpWyhiaXQpL0NIQVJfQklUXXw9MTw8KChiaXQpJUNIQVJfQklUKQorI2RlZmluZSBCQ0xSKGFycmF5LGJpdCkgKGFycmF5KVsoYml0KS9DSEFSX0JJVF0mPX4oMTw8KChiaXQpJUNIQVJfQklUKSkKKyNkZWZpbmUgQlRTVChhcnJheSxiaXQpICgoYXJyYXkpWyhiaXQpL0NIQVJfQklUXSYoMTw8KChiaXQpJUNIQVJfQklUKSkpCisKKy8qIEFuIGluc3RydWN0aW9uIHdpdGggTEFCRUwgc2V0IGlzIHByZWNlZGVkIHdpdGggYSBudW1iZXJlZCBsYWJlbC4gKi8KKy8qIFRoZSBudW1iZXIgaXMgaW4gPGxhYmVsPi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTEFCRUwgMQorCisvKiBBbiBpbnN0cnV0aW9uIHdpdGggQ09ORF9CUkFOQ0ggc2V0IG1heSBiZSBmb2xsb3dlZCBieSB0aGUgbmV4dCAqLworLyogaW5zdHJ1Y3Rpb24gb3IgYnkgdGhlIGluc3RydWN0aW9uIHdpdGggdGhlIGxhYmVsIGluIDxsYWJlbD4uICAgKi8KKyNkZWZpbmUgQ09ORF9CUkFOQ0ggMgorCisvKiBBbiBpbnN0cnVjdGlvbiB3aXRoIFVOQ09ORF9CUkFOQ0ggc2V0IGlzIGZvbGxvd2VkIGJ5IHRoZSAqLworLyogaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgbGFiZWwgaW4gPGxhYmVsPi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVU5DT05EX0JSQU5DSCA0CisKKy8qIFRoZSBzaWRlLWVmZmVjdHMgb2YgYW4gaW5zdHJ1Y3Rpb24gd2l0aCBCQVJSSUVSIHNldCBjYW5ub3QgZW50aXJlbHkgKi8KKy8qIGJlIHNwZWNpZmllZCBieSBhIHN0cnVjdCBzaW5mbyAoZS5nLiBmdW5jdGlvbi1jYWxscywgcHNldWRvLW9wcyBvciAgKi8KKy8qIG90aGVyIGNvbXBsaWNhdGVkIHRoaW5ncykuIHZzYyB3aWxsIG5vdCBtb3ZlIGFueSBjb2RlIGFjcm9zcyB0aGlzICAgKi8KKy8qIGluc3RydWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQkFSUklFUiA4CisKKy8qIEFuIGluc3RydWN0aW9uIHdpdGggbmVpdGhlciBDT05EX0JSQU5DSCwgVU5DT05EX0JSQU5DSCBub3IgQkFSUklFUiAgKi8KKy8qIHNldCBfbXVzdF8gX25vdF8gY2hhbmdlIGNvbnRyb2wtZmxvdy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogVXNlZCBieSB2c2NoZWQuYy4gKi8KKyNkZWZpbmUgT1VUIDE2CisjZGVmaW5lIFJFQURZIDMyCisKKy8qIHNjaGVkdWxlLmggaGFzIHRvICNkZWZpbmUgUkVHUyAodGhlIG1heGltdW0gbnVtYmVyIG9mIHJlZ2lzdGVycyAqLworLyogKG51bWJlcmVkIGZyb20gMCB0byBSRUdTLTEpIGFuZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgcGlwZWxpbmVzICovCisvKiBQSVBFUyAobnVtYmVyZWQgZnJvbSAwIHRvIFBJUEVTLTEpLiBJZiBtdWx0aXBsZSBDUFVzIHdpdGggICAgICAgKi8KKy8qIGRpZmZlcmVudCBudW1iZXJzIG9mIHBpcGVsaW5lcyBvciByZWdpc3RlcnMgYXJlIHN1cHBvcnRlZCB0aGUgICAqLworLyogbGFyZ2VzdCBudW1iZXIgbXVzdCBiZSBzcGVjaWZpZWQuIFRoZSBDUFUtZGlmZmVyZW5jZXMgbXVzdCBiZSAgICovCisvKiByZXByZXNlbnRlZCBieSB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgc2NoZWRfaW5mbygpLiAgICAgICAgKi8KKyNpbmNsdWRlICJzY2hlZHVsZS5oIgorCisvKiBNRU0gaXMgYSBwc2V1ZG8tcmVnaXN0ZXIgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG1lbW9yeSBpcyAgICAgICAgKi8KKy8qIGFjY2Vzc2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNRU0gUkVHUworCisjZGVmaW5lIFBJUEVTX1NJWkUgKChQSVBFUytDSEFSX0JJVC0xKS9DSEFSX0JJVCpDSEFSX0JJVCkKKyNkZWZpbmUgUkVHU19TSVpFICgoTUVNKzErQ0hBUl9CSVQtMSkvQ0hBUl9CSVQqQ0hBUl9CSVQpCisKKy8qIFRoZSBzdHJ1Y3QgdG8gaG9sZCBzY2hlZHVsaW5nLWluZm9ybWF0aW9uIG9uIGFuIGluc3RydWN0aW9uLiAqLworc3RydWN0IHNpbmZvIHsKKyAgLyogVGhlIGluc3RydWN0aW9uIGluIGFzc2VtYmx5LWxhbmd1YWdlLiAqLworICBjaGFyICp0eHQ7CisKKyAgLyogQSBjb21iaW5hdGlvbiBvZiB0aGUgZmxhZ3MgbWVudGlvbmVkIGFib3ZlLiAqLworICB1bnNpZ25lZCBpbnQgZmxhZ3M7CisKKyAgLyogQSBudW1iZXJlZCBsYWJlbCB1c2VkIHdpdGggTEFCRUwsIENPTkRfQlJBTkNIIGFuZCBVTkNPTkRfQlJBTkNILiAqLworICB1bnNpZ25lZCBpbnQgbGFiZWw7CisKKyAgLyogTnVtYmVyIG9mIGN5Y2xlcyB1bnRpbCBhbGwgc2lkZS1lZmZlY3RzIG9mIHRoZSBvcGVyYXRpb24gYXJlICovCisgIC8qIGNvbXBsZXRlZC4gKi8KKyAgdW5zaWduZWQgaW50IGxhdGVuY3k7CisKKyAgLyogQml0LXZlY3RvciB3aGljaCBjb250YWlucyAxcyBmb3IgZXZlcnkgcGlwZWxpbmUgd2hpY2ggY2FuIGV4ZWN1dGUgKi8KKyAgLyogdGhpcyBpbnN0cnVjdGlvbi4gKi8KKyAgdW5zaWduZWQgY2hhciBwaXBlc1tQSVBFU19TSVpFXTsKKworICAvKiBCaXQtdmVjdG9yIHdoaWNoIGNvbnRhaW5zIDFzIGZvciBldmVyeSByZWdpc3RlciB0aGF0IGlzIHVzZWQgYnkgKi8KKyAgLyogdGhpcyBpbnN0cnVjdGlvbi4gVXNlIHBzZXVkby1yZWdpc3RlciBNRU0gaWYgaXQgcmVhZHMgbWVtb3J5LiAgICovCisgIHVuc2lnbmVkIGNoYXIgdXNlc1tSRUdTX1NJWkVdOworCisgIC8qIEJpdC12ZWN0b3Igd2hpY2ggY29udGFpbnMgMXMgZm9yIGV2ZXJ5IHJlZ2lzdGVyIHRoYXQgaXMgbW9kaWZpZWQgICovCisgIC8qIGJ5IHRoaXMgaW5zdHJ1Y3Rpb24uIFVzZSBwc2V1ZG8tcmVnaXN0ZXIgTUVNIGlmIGl0IHdyaXRlcyBtZW1vcnkuICovCisgIHVuc2lnbmVkIGNoYXIgbW9kaWZpZXNbUkVHU19TSVpFXTsKKworICAvKiBBbiBJRCB3aGljaCBpZGVudGlmaWVzIHRoZSBtZW1vcnktb2JqZWN0IHdoaWNoIGlzIHJlYWQuIDAgbWVhbnMgICAgKi8KKyAgLyogbm8gZnVydGhlciBpbmZvcm1hdGlvbiBhdmFpbGFibGUuIFR3byBhY2Nlc3NlcyB3aXRoIGRpZmZlcmVudCBJRHMgICovCisgIC8qIGFyZSBndWFyYW50ZWVkIG5vdCB0byBhY2Nlc3MgdGhlIHNhbWUgbWVtb3J5LiAgICAgICAgICAgICAgICAgICAgICAqLworICB1bnNpZ25lZCBsb25nIG1lbXJlYWRfaWQ7CisKKyAgLyogQW4gSUQgd2hpY2ggaWRlbnRpZmllcyB0aGUgbWVtb3J5LW9iamVjdCB3aGljaCBpcyB3cml0dGVuLiAwIG1lYW5zICovCisgIC8qIG5vIGZ1cnRoZXIgaW5mb3JtYXRpb24gYXZhaWxhYmxlLiBUd28gYWNjZXNzZXMgd2l0aCBkaWZmZXJlbnQgSURzICAqLworICAvKiBhcmUgZ3VhcmFudGVlZCBub3QgdG8gYWNjZXNzIHRoZSBzYW1lIG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdW5zaWduZWQgbG9uZyBtZW13cml0ZV9pZDsKKworICAvKiBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIDEgdGhlbiB0aGUgd3JpdGUgdG8gdGhlIG9iamVjdCB3aXRoIHRoZSAgICAgKi8KKyAgLyogSUQgc3BlY2lmaWVkIGJ5IG1lbXdyaXRlX2lkIGNvbXBsZXRlbHkgb3ZlcndyaXRlcyB0aGUgb2JqZWN0LiAgICAgICovCisgIHVuc2lnbmVkIGludCBtZW13cml0ZV9jb21wbGV0ZWx5OworfTsKKworCisvKiBUYXJnZXQtc3BlY2lmaWMgZGF0YSB3aGljaCBtdXN0IGJlIHByb3ZpZGVkIGJ5IHNjaGVkdWxlLmMuICovCisKKy8qIENvcHlyaWdodCBub3RpY2Ugd2hpY2ggaXMgcHJpbnRlZCBpZiAtcXVpZXQgaXMgbm90IHNwZWNpZmllZC4gKi8KK2V4dGVybiBjaGFyIHRnX2NvcHlyaWdodFtdOworCisKKy8qIFRhcmdldC1zcGVjaWZpYyBmdW5jdGlvbnMgd2hpY2ggbXVzdCBiZSBwcm92aWRlZCBieSBzY2hlZHVsZS5jICovCisKKy8qIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHNvbWUgaW5pdGlhbGl6YXRpb25zIHRvIGJlIGRvbmUuIElmICAgICAgICovCisvKiB6ZXJvIGlzIHJldHVybmVkIHZzYyBhc3N1bWVzIGFuIGVycm9yIGhhcyBoYXBwZW5lZCBhbmQgYWJvcnRzLiAqLworZXh0ZXJuIGludCBzY2hlZF9pbml0KHZvaWQpOworCisvKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBzb21lIGNsZWFudXAgYmVmb3JlIHZzYyBleGl0cy4gKi8KK2V4dGVybiB2b2lkIHNjaGVkX2NsZWFudXAodm9pZCk7CisKKy8qIFRoaXMgaXMgdGhlIG1haW4gdGFyZ2V0LXNwZWNpZmljIGZ1bmN0aW9uLiBJdCB3aWxsIGJlIGNhbGxlZCB3aXRoICAqLworLyogYSBwb2ludGVyIHRvIGEgc3RydWN0IHNpbmZvIHRoYXQgaXMgc2V0IHRvIGJpbmFyeSB6ZXJvZXMgZXhjZXB0ICAgICovCisvKiBmb3IgdGhlIG1lbWJlciA8dHh0PiB3aGljaCBwb2ludHMgdG8gdGhlIGFzc2VtYmx5IHJlcHJlc2VudGF0aW9uICAgKi8KKy8qIG9mIHRoZSBpbnN0cnVjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogc2NoZWRfaW5mbygpIGhhcyB0byBmaWxsIGluIGFsbCB0aGUgb3RoZXIgbWVtYmVycyB3aXRoIGluZm9ybWF0aW9uICovCisvKiB0aGF0IGNvcnJlY3RseSByZXByZXNlbnRzIHRoZSBpbnN0cnVjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIElmIHRoZSBCQVJSSUVSLWZsYWcgaXMgc2V0IGFsbCBvdGhlciBpbmZvcm1hdGlvbnMgYXJlIGJhc2ljYWxseSAgICAqLworLyogaXJyZWxldmFudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitleHRlcm4gaW50IHNjaGVkX2luZm8oc3RydWN0IHNpbmZvICopOworCisKKwo=